IyAtKi0gTW9kZTogcGVybDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQojCiMgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKIyBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQojIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgojIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwojCiMgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCiMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgojIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwojIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyB0aGUgQnVnemlsbGEgQnVnIFRyYWNraW5nIFN5c3RlbS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucwojIENvcnBvcmF0aW9uLiBQb3J0aW9ucyBjcmVhdGVkIGJ5IE5ldHNjYXBlIGFyZQojIENvcHlyaWdodCAoQykgMTk5OCBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4gQWxsCiMgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6IERhd24gRW5kaWNvICAgIDxlbmRpY29AbW96aWxsYS5vcmc+CiMgICAgICAgICAgICAgICAgIFRlcnJ5IFdlaXNzbWFuIDx0ZXJyeUBtb3ppbGxhLm9yZz4KIyAgICAgICAgICAgICAgICAgQ2hyaXMgWWVoICAgICAgPGN5ZWhAYmx1ZW1hcnRpbmkuY29tPgojICAgICAgICAgICAgICAgICBCcmFkbGV5IEJhZXR6ICA8YmJhZXR6QGFjbS5vcmc+CiMgICAgICAgICAgICAgICAgIERhdmUgTWlsbGVyICAgIDxqdXN0ZGF2ZUBidWd6aWxsYS5vcmc+CiMgICAgICAgICAgICAgICAgIE1heCBLYW5hdC1BbGV4YW5kZXIgPG1rYW5hdEBidWd6aWxsYS5vcmc+CiMgICAgICAgICAgICAgICAgIEZy6WTpcmljIEJ1Y2xpbiA8THBTb2xpdEBnbWFpbC5jb20+CgpwYWNrYWdlIEJ1Z3ppbGxhOjpCdWc7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoJGxlZ2FsX2tleXdvcmRzIEBsZWdhbF9wbGF0Zm9ybQogICAgICAgICAgICBAbGVnYWxfcHJpb3JpdHkgQGxlZ2FsX3NldmVyaXR5IEBsZWdhbF9vcHN5cyBAbGVnYWxfYnVnX3N0YXR1cwogICAgICAgICAgICBAc2V0dGFibGVfcmVzb2x1dGlvbiAlY29tcG9uZW50cyAldmVyc2lvbnMgJXRhcmdldF9taWxlc3RvbmUKICAgICAgICAgICAgQGVudGVyYWJsZV9wcm9kdWN0cyAlbWlsZXN0b25ldXJsICVwcm9kbWF4dm90ZXMpOwoKdXNlIENHSTo6Q2FycCBxdyhmYXRhbHNUb0Jyb3dzZXIpOwoKdXNlIEJ1Z3ppbGxhOwp1c2UgQnVnemlsbGE6OkF0dGFjaG1lbnQ7CnVzZSBCdWd6aWxsYTo6QnVnTWFpbDsKdXNlIEJ1Z3ppbGxhOjpDb25maWc7CnVzZSBCdWd6aWxsYTo6Q29uc3RhbnRzOwp1c2UgQnVnemlsbGE6OkZsYWc7CnVzZSBCdWd6aWxsYTo6RmxhZ1R5cGU7CnVzZSBCdWd6aWxsYTo6VXNlcjsKdXNlIEJ1Z3ppbGxhOjpVdGlsOwp1c2UgQnVnemlsbGE6OkVycm9yOwoKdXNlIGJhc2UgcXcoRXhwb3J0ZXIpOwpAQnVnemlsbGE6OkJ1Zzo6RVhQT1JUID0gcXcoCiAgICBBcHBlbmRDb21tZW50IFZhbGlkYXRlQ29tbWVudAogICAgYnVnX2FsaWFzX3RvX2lkIFZhbGlkYXRlQnVnQWxpYXMKICAgIFJlbW92ZVZvdGVzIENoZWNrSWZWb3RlZENvbmZpcm1lZAopOwoKdXNlIGNvbnN0YW50IE1BWF9DT01NRU5UX0xFTkdUSCA9PiA2NTUzNTsKCnN1YiBmaWVsZHMgewogICAgIyBLZWVwIHRoaXMgb3JkZXJpbmcgaW4gc3luYyB3aXRoIGJ1Z3ppbGxhLmR0ZAogICAgbXkgQGZpZWxkcyA9IHF3KGJ1Z19pZCBhbGlhcyBjcmVhdGlvbl90cyBzaG9ydF9kZXNjIGRlbHRhX3RzCiAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXJfYWNjZXNzaWJsZSBjY2xpc3RfYWNjZXNzaWJsZQogICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uX2lkIGNsYXNzaWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCBjb21wb25lbnQgdmVyc2lvbiByZXBfcGxhdGZvcm0gb3Bfc3lzCiAgICAgICAgICAgICAgICAgICAgYnVnX3N0YXR1cyByZXNvbHV0aW9uCiAgICAgICAgICAgICAgICAgICAgYnVnX2ZpbGVfbG9jIHN0YXR1c193aGl0ZWJvYXJkIGtleXdvcmRzCiAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgYnVnX3NldmVyaXR5IHRhcmdldF9taWxlc3RvbmUKICAgICAgICAgICAgICAgICAgICBkZXBlbmRzb24gYmxvY2tlZCB2b3RlcwogICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyIGFzc2lnbmVkX3RvIGNjCiAgICAgICAgICAgICAgICAgICApOwoKICAgIGlmIChQYXJhbSgndXNlcWFjb250YWN0JykpIHsKICAgICAgICBwdXNoIEBmaWVsZHMsICJxYV9jb250YWN0IjsKICAgIH0KCiAgICBpZiAoUGFyYW0oJ3RpbWV0cmFja2luZ2dyb3VwJykpIHsKICAgICAgICBwdXNoIEBmaWVsZHMsIHF3KGVzdGltYXRlZF90aW1lIHJlbWFpbmluZ190aW1lIGFjdHVhbF90aW1lIGRlYWRsaW5lKTsKICAgIH0KCiAgICByZXR1cm4gQGZpZWxkczsKfQoKbXkgJW9rX2ZpZWxkOwpmb3JlYWNoIG15ICRrZXkgKHF3KGVycm9yIGdyb3VwcwogICAgICAgICAgICAgICAgICAgIGxvbmdkZXNjcyBtaWxlc3RvbmV1cmwgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgICAgICBpc29wZW5lZCBpc3VuY29uZmlybWVkCiAgICAgICAgICAgICAgICAgICAgZmxhZ190eXBlcyBudW1fYXR0YWNobWVudF9mbGFnX3R5cGVzCiAgICAgICAgICAgICAgICAgICAgc2hvd19hdHRhY2htZW50X2ZsYWdzIHVzZV9rZXl3b3JkcyBhbnlfZmxhZ3NfcmVxdWVzdGVlYmxlCiAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgIGZpZWxkcygpKSB7CiAgICAkb2tfZmllbGR7JGtleX0rKzsKfQoKIyBjcmVhdGUgYSBuZXcgZW1wdHkgYnVnCiMKc3ViIG5ldyB7CiAgbXkgJHR5cGUgPSBzaGlmdCgpOwogIG15ICVidWc7CgogICMgY3JlYXRlIGEgcmVmIHRvIGFuIGVtcHR5IGhhc2ggYW5kIGJsZXNzIGl0CiAgIwogIG15ICRzZWxmID0geyVidWd9OwogIGJsZXNzICRzZWxmLCAkdHlwZTsKCiAgIyBjb25zdHJ1Y3QgZnJvbSBhIGhhc2ggY29udGFpbmluZyBhIGJ1ZydzIGluZm8KICAjCiAgaWYgKCQjXyA9PSAxKSB7CiAgICAkc2VsZi0+aW5pdEJ1ZyhAXyk7CiAgfSBlbHNlIHsKICAgIGNvbmZlc3MoImludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBcKCQjX1wpKCRfKSIpOwogIH0KCiAgIyBibGVzcyBhcyBhIEJ1ZwogICMKICByZXR1cm4gJHNlbGY7Cn0KCiMgZHVtcCBpbmZvIGFib3V0IGJ1ZyBpbnRvIGhhc2ggdW5sZXNzIHVzZXIgZG9lc24ndCBoYXZlIHBlcm1pc3Npb24KIyB1c2VyX2lkIDAgaXMgdXNlZCB3aGVuIHBlcnNvbiBpcyBub3QgbG9nZ2VkIGluLgojCnN1YiBpbml0QnVnICB7CiAgbXkgJHNlbGYgPSBzaGlmdCgpOwogIG15ICgkYnVnX2lkLCAkdXNlcl9pZCkgPSAoQF8pOwogIG15ICRkYmggPSBCdWd6aWxsYS0+ZGJoOwoKICAkYnVnX2lkID0gdHJpbSgkYnVnX2lkKTsKCiAgbXkgJG9sZF9idWdfaWQgPSAkYnVnX2lkOwoKICAjIElmIHRoZSBidWcgSUQgaXNuJ3QgbnVtZXJpYywgaXQgbWlnaHQgYmUgYW4gYWxpYXMsIHNvIHRyeSB0byBjb252ZXJ0IGl0LgogICRidWdfaWQgPSBidWdfYWxpYXNfdG9faWQoJGJ1Z19pZCkgaWYgJGJ1Z19pZCAhfiAvXjAqWzEtOV1bMC05XSokLzsKCiAgaWYgKCghIGRlZmluZWQgJGJ1Z19pZCkgfHwgKCEkYnVnX2lkKSB8fCAoIWRldGFpbnRfbmF0dXJhbCgkYnVnX2lkKSkpIHsKICAgICAgIyBubyBidWcgbnVtYmVyIGdpdmVuIG9yIHRoZSBhbGlhcyBkaWRuJ3QgbWF0Y2ggYSBidWcKICAgICAgJHNlbGYtPnsnYnVnX2lkJ30gPSAkb2xkX2J1Z19pZDsKICAgICAgJHNlbGYtPnsnZXJyb3InfSA9ICJJbnZhbGlkQnVnSWQiOwogICAgICByZXR1cm4gJHNlbGY7CiAgfQoKICAjIElmIHRoZSB1c2VyIGlzIG5vdCBsb2dnZWQgaW4sIHNldHMgJHVzZXJfaWQgdG8gMC4KICAjIEVsc2UgZ2V0cyAkdXNlcl9pZCBmcm9tIHRoZSB1c2VyIGxvZ2luIG5hbWUgaWYgdGhpcwogICMgYXJndW1lbnQgaXMgbm90IG51bWVyaWMuCiAgbXkgJHN0b3JlZF91c2VyX2lkID0gJHVzZXJfaWQ7CiAgaWYgKCFkZWZpbmVkICR1c2VyX2lkKSB7CiAgICAkdXNlcl9pZCA9IDA7CiAgfSBlbHNpZiAoIWRldGFpbnRfbmF0dXJhbCgkdXNlcl9pZCkpIHsKICAgICR1c2VyX2lkID0gbG9naW5fdG9faWQoJHN0b3JlZF91c2VyX2lkKTsgCiAgfQoKICAkc2VsZi0+eyd3aG8nfSA9IG5ldyBCdWd6aWxsYTo6VXNlcigkdXNlcl9pZCk7CgogIG15ICRxdWVyeSA9ICIKICAgIFNFTEVDVAogICAgICBidWdzLmJ1Z19pZCwgYWxpYXMsIHByb2R1Y3RzLmNsYXNzaWZpY2F0aW9uX2lkLCBjbGFzc2lmaWNhdGlvbnMubmFtZSwKICAgICAgYnVncy5wcm9kdWN0X2lkLCBwcm9kdWN0cy5uYW1lLCB2ZXJzaW9uLAogICAgICByZXBfcGxhdGZvcm0sIG9wX3N5cywgYnVnX3N0YXR1cywgcmVzb2x1dGlvbiwgcHJpb3JpdHksCiAgICAgIGJ1Z19zZXZlcml0eSwgYnVncy5jb21wb25lbnRfaWQsIGNvbXBvbmVudHMubmFtZSwgCiAgICAgIGFzc2lnbmVkX3RvIEFTIGFzc2lnbmVkX3RvX2lkLCByZXBvcnRlciBBUyByZXBvcnRlcl9pZCwKICAgICAgYnVnX2ZpbGVfbG9jLCBzaG9ydF9kZXNjLCB0YXJnZXRfbWlsZXN0b25lLAogICAgICBxYV9jb250YWN0IEFTIHFhX2NvbnRhY3RfaWQsIHN0YXR1c193aGl0ZWJvYXJkLCAiIC4KICAgICAgJGRiaC0+c3FsX2RhdGVfZm9ybWF0KCdjcmVhdGlvbl90cycsICclWS4lbS4lZCAlSDolaScpIC4gIiwKICAgICAgZGVsdGFfdHMsIENPQUxFU0NFKFNVTSh2b3Rlcy52b3RlX2NvdW50KSwgMCksCiAgICAgIHJlcG9ydGVyX2FjY2Vzc2libGUsIGNjbGlzdF9hY2Nlc3NpYmxlLAogICAgICBlc3RpbWF0ZWRfdGltZSwgcmVtYWluaW5nX3RpbWUsICIgLgogICAgICAkZGJoLT5zcWxfZGF0ZV9mb3JtYXQoJ2RlYWRsaW5lJywgJyVZLSVtLSVkJykgLiAiCiAgICBGUk9NIGJ1Z3MKICAgICAgIExFRlQgSk9JTiB2b3RlcwogICAgICAgICAgIFVTSU5HIChidWdfaWQpCiAgICAgIElOTkVSIEpPSU4gY29tcG9uZW50cwogICAgICAgICAgICAgIE9OIGNvbXBvbmVudHMuaWQgPSBidWdzLmNvbXBvbmVudF9pZAogICAgICBJTk5FUiBKT0lOIHByb2R1Y3RzCiAgICAgICAgICAgICAgT04gcHJvZHVjdHMuaWQgPSBidWdzLnByb2R1Y3RfaWQKICAgICAgSU5ORVIgSk9JTiBjbGFzc2lmaWNhdGlvbnMKICAgICAgICAgICAgICBPTiBjbGFzc2lmaWNhdGlvbnMuaWQgPSBwcm9kdWN0cy5jbGFzc2lmaWNhdGlvbl9pZAogICAgICBXSEVSRSBidWdzLmJ1Z19pZCA9ID8gIiAuCiAgICAkZGJoLT5zcWxfZ3JvdXBfYnkoJ2J1Z3MuYnVnX2lkJywgJ2FsaWFzLCBwcm9kdWN0cy5jbGFzc2lmaWNhdGlvbl9pZCwKICAgICAgY2xhc3NpZmljYXRpb25zLm5hbWUsIGJ1Z3MucHJvZHVjdF9pZCwgcHJvZHVjdHMubmFtZSwgdmVyc2lvbiwKICAgICAgcmVwX3BsYXRmb3JtLCBvcF9zeXMsIGJ1Z19zdGF0dXMsIHJlc29sdXRpb24sIHByaW9yaXR5LAogICAgICBidWdfc2V2ZXJpdHksIGJ1Z3MuY29tcG9uZW50X2lkLCBjb21wb25lbnRzLm5hbWUsIGFzc2lnbmVkX3RvLAogICAgICByZXBvcnRlciwgYnVnX2ZpbGVfbG9jLCBzaG9ydF9kZXNjLCB0YXJnZXRfbWlsZXN0b25lLAogICAgICBxYV9jb250YWN0LCBzdGF0dXNfd2hpdGVib2FyZCwgY3JlYXRpb25fdHMsIAogICAgICBkZWx0YV90cywgcmVwb3J0ZXJfYWNjZXNzaWJsZSwgY2NsaXN0X2FjY2Vzc2libGUsCiAgICAgIGVzdGltYXRlZF90aW1lLCByZW1haW5pbmdfdGltZSwgZGVhZGxpbmUnKTsKCiAgbXkgJGJ1Z19zdGggPSAkZGJoLT5wcmVwYXJlKCRxdWVyeSk7CiAgJGJ1Z19zdGgtPmV4ZWN1dGUoJGJ1Z19pZCk7CiAgbXkgQHJvdzsKCiAgaWYgKChAcm93ID0gJGJ1Z19zdGgtPmZldGNocm93X2FycmF5KCkpIAogICAgICAmJiAkc2VsZi0+eyd3aG8nfS0+Y2FuX3NlZV9idWcoJGJ1Z19pZCkpIHsKICAgIG15ICRjb3VudCA9IDA7CiAgICBteSAlZmllbGRzOwogICAgZm9yZWFjaCBteSAkZmllbGQgKCJidWdfaWQiLCAiYWxpYXMiLCAiY2xhc3NpZmljYXRpb25faWQiLCAiY2xhc3NpZmljYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICJwcm9kdWN0X2lkIiwgInByb2R1Y3QiLCAidmVyc2lvbiIsIAogICAgICAgICAgICAgICAgICAgICAgICJyZXBfcGxhdGZvcm0iLCAib3Bfc3lzIiwgImJ1Z19zdGF0dXMiLCAicmVzb2x1dGlvbiIsIAogICAgICAgICAgICAgICAgICAgICAgICJwcmlvcml0eSIsICJidWdfc2V2ZXJpdHkiLCAiY29tcG9uZW50X2lkIiwgImNvbXBvbmVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgImFzc2lnbmVkX3RvX2lkIiwgInJlcG9ydGVyX2lkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgImJ1Z19maWxlX2xvYyIsICJzaG9ydF9kZXNjIiwKICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0X21pbGVzdG9uZSIsICJxYV9jb250YWN0X2lkIiwgInN0YXR1c193aGl0ZWJvYXJkIiwKICAgICAgICAgICAgICAgICAgICAgICAiY3JlYXRpb25fdHMiLCAiZGVsdGFfdHMiLCAidm90ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICJyZXBvcnRlcl9hY2Nlc3NpYmxlIiwgImNjbGlzdF9hY2Nlc3NpYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAiZXN0aW1hdGVkX3RpbWUiLCAicmVtYWluaW5nX3RpbWUiLCAiZGVhZGxpbmUiKQogICAgICB7CiAgICAgICAgJGZpZWxkc3skZmllbGR9ID0gc2hpZnQgQHJvdzsKICAgICAgICBpZiAoZGVmaW5lZCAkZmllbGRzeyRmaWVsZH0pIHsKICAgICAgICAgICAgJHNlbGYtPnskZmllbGR9ID0gJGZpZWxkc3skZmllbGR9OwogICAgICAgIH0KICAgICAgICAkY291bnQrKzsKICAgIH0KICB9IGVsc2lmIChAcm93KSB7CiAgICAgICRzZWxmLT57J2J1Z19pZCd9ID0gJGJ1Z19pZDsKICAgICAgJHNlbGYtPnsnZXJyb3InfSA9ICJOb3RQZXJtaXR0ZWQiOwogICAgICByZXR1cm4gJHNlbGY7CiAgfSBlbHNlIHsKICAgICAgJHNlbGYtPnsnYnVnX2lkJ30gPSAkYnVnX2lkOwogICAgICAkc2VsZi0+eydlcnJvcid9ID0gIk5vdEZvdW5kIjsKICAgICAgcmV0dXJuICRzZWxmOwogIH0KCiAgJHNlbGYtPnsnaXN1bmNvbmZpcm1lZCd9ID0gKCRzZWxmLT57YnVnX3N0YXR1c30gZXEgJ1VOQ09ORklSTUVEJyk7CiAgJHNlbGYtPnsnaXNvcGVuZWQnfSA9ICY6OklzT3BlbmVkU3RhdGUoJHNlbGYtPntidWdfc3RhdHVzfSk7CiAgCiAgcmV0dXJuICRzZWxmOwp9CgojIFRoaXMgaXMgdGhlIGNvcnJlY3Qgd2F5IHRvIGRlbGV0ZSBidWdzIGZyb20gdGhlIERCLgojIE5vIGJ1ZyBzaG91bGQgYmUgZGVsZXRlZCBmcm9tIGFueXdoZXJlIGVsc2UgZXhjZXB0IGZyb20gaGVyZS4KIwpzdWIgcmVtb3ZlX2Zyb21fZGIgewogICAgbXkgKCRzZWxmKSA9IEBfOwogICAgbXkgJGRiaCA9IEJ1Z3ppbGxhLT5kYmg7CgogICAgaWYgKCRzZWxmLT57J2Vycm9yJ30pIHsKICAgICAgICBUaHJvd0NvZGVFcnJvcigiYnVnX2Vycm9yIiwgeyBidWcgPT4gJHNlbGYgfSk7CiAgICB9CgogICAgbXkgJGJ1Z19pZCA9ICRzZWxmLT57J2J1Z19pZCd9OwoKICAgICMgdGFibGVzIGhhdmluZyAnYnVncy5idWdfaWQnIGFzIGEgZm9yZWlnbiBrZXk6CiAgICAjIC0gYXR0YWNobWVudHMKICAgICMgLSBidWdfZ3JvdXBfbWFwCiAgICAjIC0gYnVncwogICAgIyAtIGJ1Z3NfYWN0aXZpdHkKICAgICMgLSBjYwogICAgIyAtIGRlcGVuZGVuY2llcwogICAgIyAtIGR1cGxpY2F0ZXMKICAgICMgLSBmbGFncwogICAgIyAtIGtleXdvcmRzCiAgICAjIC0gbG9uZ2Rlc2NzCiAgICAjIC0gdm90ZXMKCiAgICAkZGJoLT5iel9sb2NrX3RhYmxlcygnYXR0YWNobWVudHMgV1JJVEUnLCAnYnVnX2dyb3VwX21hcCBXUklURScsCiAgICAgICAgICAgICAgICAgICAgICAgICAnYnVncyBXUklURScsICdidWdzX2FjdGl2aXR5IFdSSVRFJywgJ2NjIFdSSVRFJywKICAgICAgICAgICAgICAgICAgICAgICAgICdkZXBlbmRlbmNpZXMgV1JJVEUnLCAnZHVwbGljYXRlcyBXUklURScsCiAgICAgICAgICAgICAgICAgICAgICAgICAnZmxhZ3MgV1JJVEUnLCAna2V5d29yZHMgV1JJVEUnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2xvbmdkZXNjcyBXUklURScsICd2b3RlcyBXUklURScpOwoKICAgICRkYmgtPmRvKCJERUxFVEUgRlJPTSBidWdfZ3JvdXBfbWFwIFdIRVJFIGJ1Z19pZCA9ID8iLCB1bmRlZiwgJGJ1Z19pZCk7CiAgICAkZGJoLT5kbygiREVMRVRFIEZST00gYnVnc19hY3Rpdml0eSBXSEVSRSBidWdfaWQgPSA/IiwgdW5kZWYsICRidWdfaWQpOwogICAgJGRiaC0+ZG8oIkRFTEVURSBGUk9NIGNjIFdIRVJFIGJ1Z19pZCA9ID8iLCB1bmRlZiwgJGJ1Z19pZCk7CiAgICAkZGJoLT5kbygiREVMRVRFIEZST00gZGVwZW5kZW5jaWVzIFdIRVJFIGJsb2NrZWQgPSA/IE9SIGRlcGVuZHNvbiA9ID8iLAogICAgICAgICAgICAgdW5kZWYsICgkYnVnX2lkLCAkYnVnX2lkKSk7CiAgICAkZGJoLT5kbygiREVMRVRFIEZST00gZHVwbGljYXRlcyBXSEVSRSBkdXBlID0gPyBPUiBkdXBlX29mID0gPyIsCiAgICAgICAgICAgICB1bmRlZiwgKCRidWdfaWQsICRidWdfaWQpKTsKICAgICRkYmgtPmRvKCJERUxFVEUgRlJPTSBmbGFncyBXSEVSRSBidWdfaWQgPSA/IiwgdW5kZWYsICRidWdfaWQpOwogICAgJGRiaC0+ZG8oIkRFTEVURSBGUk9NIGtleXdvcmRzIFdIRVJFIGJ1Z19pZCA9ID8iLCB1bmRlZiwgJGJ1Z19pZCk7CiAgICAkZGJoLT5kbygiREVMRVRFIEZST00gbG9uZ2Rlc2NzIFdIRVJFIGJ1Z19pZCA9ID8iLCB1bmRlZiwgJGJ1Z19pZCk7CiAgICAkZGJoLT5kbygiREVMRVRFIEZST00gdm90ZXMgV0hFUkUgYnVnX2lkID0gPyIsIHVuZGVmLCAkYnVnX2lkKTsKICAgICMgU2V2ZXJhbCBvZiB0aGUgcHJldmlvdXMgdGFibGVzIGFsc28gZGVwZW5kIG9uIGF0dGFjaF9pZC4KICAgICRkYmgtPmRvKCJERUxFVEUgRlJPTSBhdHRhY2htZW50cyBXSEVSRSBidWdfaWQgPSA/IiwgdW5kZWYsICRidWdfaWQpOwogICAgJGRiaC0+ZG8oIkRFTEVURSBGUk9NIGJ1Z3MgV0hFUkUgYnVnX2lkID0gPyIsIHVuZGVmLCAkYnVnX2lkKTsKCiAgICAkZGJoLT5iel91bmxvY2tfdGFibGVzKCk7CgogICAgIyBOb3cgdGhpcyBidWcgbm8gbG9uZ2VyIGV4aXN0cwogICAgJHNlbGYtPkRFU1RST1k7CiAgICByZXR1cm4gJHNlbGY7Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIEFjY2Vzc29ycwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgVGhlc2Ugc3VicyBhcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBhcyBtdWNoIGFzIHBvc3NpYmxlLgojIElmIHlvdSBhZGQgYSBuZXcgc3ViLCBwbGVhc2UgdHJ5IHRvIGtlZXAgaXQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyCiMgd2l0aCB0aGUgb3RoZXIgb25lcy4KCiMgTm90ZTogSWYgeW91IGFkZCBhIG5ldyBtZXRob2QsIHJlbWVtYmVyIHRoYXQgeW91IG11c3QgY2hlY2sgdGhlIGVycm9yCiMgc3RhdGUgb2YgdGhlIGJ1ZyBiZWZvcmUgcmV0dXJuaW5nIGFueSBkYXRhLiBJZiAkc2VsZi0+e2Vycm9yfSBpcwojIGRlZmluZWQsIHRoZW4gcmV0dXJuIHNvbWV0aGluZyBlbXB0eS4gT3RoZXJ3aXNlIHlvdSByaXNrIHBvdGVudGlhbAojIHNlY3VyaXR5IGhvbGVzLgoKc3ViIGR1cF9pZCB7CiAgICBteSAoJHNlbGYpID0gQF87CiAgICByZXR1cm4gJHNlbGYtPnsnZHVwX2lkJ30gaWYgZXhpc3RzICRzZWxmLT57J2R1cF9pZCd9OwoKICAgICRzZWxmLT57J2R1cF9pZCd9ID0gdW5kZWY7CiAgICByZXR1cm4gaWYgJHNlbGYtPnsnZXJyb3InfTsKCiAgICBpZiAoJHNlbGYtPnsncmVzb2x1dGlvbid9IGVxICdEVVBMSUNBVEUnKSB7IAogICAgICAgIG15ICRkYmggPSBCdWd6aWxsYS0+ZGJoOwogICAgICAgICRzZWxmLT57J2R1cF9pZCd9ID0KICAgICAgICAgICRkYmgtPnNlbGVjdHJvd19hcnJheShxe1NFTEVDVCBkdXBlX29mIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBkdXBsaWNhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBkdXBlID0gP30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPnsnYnVnX2lkJ30pOwogICAgfQogICAgcmV0dXJuICRzZWxmLT57J2R1cF9pZCd9Owp9CgpzdWIgYWN0dWFsX3RpbWUgewogICAgbXkgKCRzZWxmKSA9IEBfOwogICAgcmV0dXJuICRzZWxmLT57J2FjdHVhbF90aW1lJ30gaWYgZXhpc3RzICRzZWxmLT57J2FjdHVhbF90aW1lJ307CgogICAgaWYgKCAkc2VsZi0+eydlcnJvcid9IHx8IAogICAgICAgICAhQnVnemlsbGEtPnVzZXItPmluX2dyb3VwKFBhcmFtKCJ0aW1ldHJhY2tpbmdncm91cCIpKSApIHsKICAgICAgICAkc2VsZi0+eydhY3R1YWxfdGltZSd9ID0gdW5kZWY7CiAgICAgICAgcmV0dXJuICRzZWxmLT57J2FjdHVhbF90aW1lJ307CiAgICB9CgogICAgbXkgJHN0aCA9IEJ1Z3ppbGxhLT5kYmgtPnByZXBhcmUoIlNFTEVDVCBTVU0od29ya190aW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gbG9uZ2Rlc2NzIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIGxvbmdkZXNjcy5idWdfaWQ9PyIpOwogICAgJHN0aC0+ZXhlY3V0ZSgkc2VsZi0+e2J1Z19pZH0pOwogICAgJHNlbGYtPnsnYWN0dWFsX3RpbWUnfSA9ICRzdGgtPmZldGNocm93X2FycmF5KCk7CiAgICByZXR1cm4gJHNlbGYtPnsnYWN0dWFsX3RpbWUnfTsKfQoKc3ViIGFueV9mbGFnc19yZXF1ZXN0ZWVibGUgKCkgewogICAgbXkgKCRzZWxmKSA9IEBfOwogICAgcmV0dXJuICRzZWxmLT57J2FueV9mbGFnc19yZXF1ZXN0ZWVibGUnfSAKICAgICAgICBpZiBleGlzdHMgJHNlbGYtPnsnYW55X2ZsYWdzX3JlcXVlc3RlZWJsZSd9OwogICAgcmV0dXJuIDAgaWYgJHNlbGYtPnsnZXJyb3InfTsKCiAgICAkc2VsZi0+eydhbnlfZmxhZ3NfcmVxdWVzdGVlYmxlJ30gPSAKICAgICAgICBncmVwKCRfLT57J2lzX3JlcXVlc3RlZWJsZSd9LCBAeyRzZWxmLT5mbGFnX3R5cGVzfSk7CgogICAgcmV0dXJuICRzZWxmLT57J2FueV9mbGFnc19yZXF1ZXN0ZWVibGUnfTsKfQoKc3ViIGF0dGFjaG1lbnRzICgpIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIHJldHVybiAkc2VsZi0+eydhdHRhY2htZW50cyd9IGlmIGV4aXN0cyAkc2VsZi0+eydhdHRhY2htZW50cyd9OwogICAgcmV0dXJuIFtdIGlmICRzZWxmLT57J2Vycm9yJ307CiAgICAkc2VsZi0+eydhdHRhY2htZW50cyd9ID0gQnVnemlsbGE6OkF0dGFjaG1lbnQ6OnF1ZXJ5KCRzZWxmLT57YnVnX2lkfSk7CiAgICByZXR1cm4gJHNlbGYtPnsnYXR0YWNobWVudHMnfTsKfQoKc3ViIGFzc2lnbmVkX3RvICgpIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIHJldHVybiAkc2VsZi0+eydhc3NpZ25lZF90byd9IGlmIGV4aXN0cyAkc2VsZi0+eydhc3NpZ25lZF90byd9OwogICAgJHNlbGYtPnsnYXNzaWduZWRfdG9faWQnfSA9IDAgaWYgJHNlbGYtPnsnZXJyb3InfTsKICAgICRzZWxmLT57J2Fzc2lnbmVkX3RvJ30gPSBuZXcgQnVnemlsbGE6OlVzZXIoJHNlbGYtPnsnYXNzaWduZWRfdG9faWQnfSk7CiAgICByZXR1cm4gJHNlbGYtPnsnYXNzaWduZWRfdG8nfTsKfQoKc3ViIGJsb2NrZWQgKCkgewogICAgbXkgKCRzZWxmKSA9IEBfOwogICAgcmV0dXJuICRzZWxmLT57J2Jsb2NrZWQnfSBpZiBleGlzdHMgJHNlbGYtPnsnYmxvY2tlZCd9OwogICAgcmV0dXJuIFtdIGlmICRzZWxmLT57J2Vycm9yJ307CiAgICAkc2VsZi0+eydibG9ja2VkJ30gPSBFbWl0RGVwZW5kTGlzdCgiZGVwZW5kc29uIiwgImJsb2NrZWQiLCAkc2VsZi0+YnVnX2lkKTsKICAgIHJldHVybiAkc2VsZi0+eydibG9ja2VkJ307Cn0KCiMgRXZlbiBidWdzIGluIGFuIGVycm9yIHN0YXRlIGFsd2F5cyBoYXZlIGEgYnVnX2lkLgpzdWIgYnVnX2lkIHsgJF9bMF0tPnsnYnVnX2lkJ307IH0KCnN1YiBjYyAoKSB7CiAgICBteSAoJHNlbGYpID0gQF87CiAgICByZXR1cm4gJHNlbGYtPnsnY2MnfSBpZiBleGlzdHMgJHNlbGYtPnsnY2MnfTsKICAgIHJldHVybiBbXSBpZiAkc2VsZi0+eydlcnJvcid9OwoKICAgIG15ICRkYmggPSBCdWd6aWxsYS0+ZGJoOwogICAgJHNlbGYtPnsnY2MnfSA9ICRkYmgtPnNlbGVjdGNvbF9hcnJheXJlZigKICAgICAgICBxe1NFTEVDVCBwcm9maWxlcy5sb2dpbl9uYW1lIEZST00gY2MsIHByb2ZpbGVzCiAgICAgICAgICAgV0hFUkUgYnVnX2lkID0gPwogICAgICAgICAgICAgQU5EIGNjLndobyA9IHByb2ZpbGVzLnVzZXJpZAogICAgICAgIE9SREVSIEJZIHByb2ZpbGVzLmxvZ2luX25hbWV9LAogICAgICB1bmRlZiwgJHNlbGYtPmJ1Z19pZCk7CgogICAgJHNlbGYtPnsnY2MnfSA9IHVuZGVmIGlmICFzY2FsYXIoQHskc2VsZi0+eydjYyd9fSk7CgogICAgcmV0dXJuICRzZWxmLT57J2NjJ307Cn0KCnN1YiBkZXBlbmRzb24gKCkgewogICAgbXkgKCRzZWxmKSA9IEBfOwogICAgcmV0dXJuICRzZWxmLT57J2RlcGVuZHNvbid9IGlmIGV4aXN0cyAkc2VsZi0+eydkZXBlbmRzb24nfTsKICAgIHJldHVybiBbXSBpZiAkc2VsZi0+eydlcnJvcid9OwogICAgJHNlbGYtPnsnZGVwZW5kc29uJ30gPSAKICAgICAgICBFbWl0RGVwZW5kTGlzdCgiYmxvY2tlZCIsICJkZXBlbmRzb24iLCAkc2VsZi0+YnVnX2lkKTsKICAgIHJldHVybiAkc2VsZi0+eydkZXBlbmRzb24nfTsKfQoKc3ViIGZsYWdfdHlwZXMgKCkgewogICAgbXkgKCRzZWxmKSA9IEBfOwogICAgcmV0dXJuICRzZWxmLT57J2ZsYWdfdHlwZXMnfSBpZiBleGlzdHMgJHNlbGYtPnsnZmxhZ190eXBlcyd9OwogICAgcmV0dXJuIFtdIGlmICRzZWxmLT57J2Vycm9yJ307CgogICAgIyBUaGUgdHlwZXMgb2YgZmxhZ3MgdGhhdCBjYW4gYmUgc2V0IG9uIHRoaXMgYnVnLgogICAgIyBJZiBub25lLCBubyBVSSBmb3Igc2V0dGluZyBmbGFncyB3aWxsIGJlIGRpc3BsYXllZC4KICAgIG15ICRmbGFnX3R5cGVzID0gQnVnemlsbGE6OkZsYWdUeXBlOjptYXRjaCgKICAgICAgICB7J3RhcmdldF90eXBlJyAgPT4gJ2J1ZycsCiAgICAgICAgICdwcm9kdWN0X2lkJyAgID0+ICRzZWxmLT57J3Byb2R1Y3RfaWQnfSwgCiAgICAgICAgICdjb21wb25lbnRfaWQnID0+ICRzZWxmLT57J2NvbXBvbmVudF9pZCd9IH0pOwoKICAgIGZvcmVhY2ggbXkgJGZsYWdfdHlwZSAoQCRmbGFnX3R5cGVzKSB7CiAgICAgICAgJGZsYWdfdHlwZS0+eydmbGFncyd9ID0gQnVnemlsbGE6OkZsYWc6Om1hdGNoKAogICAgICAgICAgICB7ICdidWdfaWQnICAgICAgPT4gJHNlbGYtPmJ1Z19pZCwKICAgICAgICAgICAgICAndHlwZV9pZCcgICAgID0+ICRmbGFnX3R5cGUtPnsnaWQnfSwKICAgICAgICAgICAgICAndGFyZ2V0X3R5cGUnID0+ICdidWcnLAogICAgICAgICAgICAgICdpc19hY3RpdmUnICAgPT4gMSB9KTsKICAgIH0KCiAgICAkc2VsZi0+eydmbGFnX3R5cGVzJ30gPSAkZmxhZ190eXBlczsKCiAgICByZXR1cm4gJHNlbGYtPnsnZmxhZ190eXBlcyd9Owp9CgpzdWIga2V5d29yZHMgKCkgewogICAgbXkgKCRzZWxmKSA9IEBfOwogICAgcmV0dXJuICRzZWxmLT57J2tleXdvcmRzJ30gaWYgZXhpc3RzICRzZWxmLT57J2tleXdvcmRzJ307CiAgICByZXR1cm4gKCkgaWYgJHNlbGYtPnsnZXJyb3InfTsKCiAgICBteSAkZGJoID0gQnVnemlsbGEtPmRiaDsKICAgIG15ICRsaXN0X3JlZiA9ICRkYmgtPnNlbGVjdGNvbF9hcnJheXJlZigKICAgICAgICAgIlNFTEVDVCBrZXl3b3JkZGVmcy5uYW1lCiAgICAgICAgICAgIEZST00ga2V5d29yZGRlZnMsIGtleXdvcmRzCiAgICAgICAgICAgV0hFUkUga2V5d29yZHMuYnVnX2lkID0gPwogICAgICAgICAgICAgQU5EIGtleXdvcmRkZWZzLmlkID0ga2V5d29yZHMua2V5d29yZGlkCiAgICAgICAgT1JERVIgQlkga2V5d29yZGRlZnMubmFtZSIsCiAgICAgICAgdW5kZWYsICgkc2VsZi0+YnVnX2lkKSk7CgogICAgJHNlbGYtPnsna2V5d29yZHMnfSA9IGpvaW4oJywgJywgQCRsaXN0X3JlZik7CiAgICByZXR1cm4gJHNlbGYtPnsna2V5d29yZHMnfTsKfQoKc3ViIGxvbmdkZXNjcyB7CiAgICBteSAoJHNlbGYpID0gQF87CiAgICByZXR1cm4gJHNlbGYtPnsnbG9uZ2Rlc2NzJ30gaWYgZXhpc3RzICRzZWxmLT57J2xvbmdkZXNjcyd9OwogICAgcmV0dXJuIFtdIGlmICRzZWxmLT57J2Vycm9yJ307CiAgICAkc2VsZi0+eydsb25nZGVzY3MnfSA9IEdldENvbW1lbnRzKCRzZWxmLT57YnVnX2lkfSk7CiAgICByZXR1cm4gJHNlbGYtPnsnbG9uZ2Rlc2NzJ307Cn0KCnN1YiBtaWxlc3RvbmV1cmwgKCkgewogICAgbXkgKCRzZWxmKSA9IEBfOwogICAgcmV0dXJuICRzZWxmLT57J21pbGVzdG9uZXVybCd9IGlmIGV4aXN0cyAkc2VsZi0+eydtaWxlc3RvbmV1cmwnfTsKICAgIHJldHVybiAnJyBpZiAkc2VsZi0+eydlcnJvcid9OwogICAgJHNlbGYtPnsnbWlsZXN0b25ldXJsJ30gPSAkOjptaWxlc3RvbmV1cmx7JHNlbGYtPntwcm9kdWN0fX07CiAgICByZXR1cm4gJHNlbGYtPnsnbWlsZXN0b25ldXJsJ307Cn0KCnN1YiBxYV9jb250YWN0ICgpIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIHJldHVybiAkc2VsZi0+eydxYV9jb250YWN0J30gaWYgZXhpc3RzICRzZWxmLT57J3FhX2NvbnRhY3QnfTsKICAgIHJldHVybiB1bmRlZiBpZiAkc2VsZi0+eydlcnJvcid9OwoKICAgIGlmIChQYXJhbSgndXNlcWFjb250YWN0JykgJiYgJHNlbGYtPnsncWFfY29udGFjdF9pZCd9KSB7CiAgICAgICAgJHNlbGYtPnsncWFfY29udGFjdCd9ID0gbmV3IEJ1Z3ppbGxhOjpVc2VyKCRzZWxmLT57J3FhX2NvbnRhY3RfaWQnfSk7CiAgICB9IGVsc2UgewogICAgICAgICMgWFhYIC0gVGhpcyBpcyBzb21ld2hhdCBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgYXNzaWduZWUvcmVwb3J0ZXIgCiAgICAgICAgIyBtZXRob2RzLCB3aGljaCB3aWxsIHJldHVybiBhbiBlbXB0eSBVc2VyIGlmIHRoZXkgZ2V0IGEgMC4gCiAgICAgICAgIyBIb3dldmVyLCB3ZSdyZSBrZWVwaW5nIGl0IHRoaXMgd2F5IG5vdywgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgogICAgICAgICRzZWxmLT57J3FhX2NvbnRhY3QnfSA9IHVuZGVmOwogICAgfQogICAgcmV0dXJuICRzZWxmLT57J3FhX2NvbnRhY3QnfTsKfQoKc3ViIHJlcG9ydGVyICgpIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIHJldHVybiAkc2VsZi0+eydyZXBvcnRlcid9IGlmIGV4aXN0cyAkc2VsZi0+eydyZXBvcnRlcid9OwogICAgJHNlbGYtPnsncmVwb3J0ZXJfaWQnfSA9IDAgaWYgJHNlbGYtPnsnZXJyb3InfTsKICAgICRzZWxmLT57J3JlcG9ydGVyJ30gPSBuZXcgQnVnemlsbGE6OlVzZXIoJHNlbGYtPnsncmVwb3J0ZXJfaWQnfSk7CiAgICByZXR1cm4gJHNlbGYtPnsncmVwb3J0ZXInfTsKfQoKCnN1YiBzaG93X2F0dGFjaG1lbnRfZmxhZ3MgKCkgewogICAgbXkgKCRzZWxmKSA9IEBfOwogICAgcmV0dXJuICRzZWxmLT57J3Nob3dfYXR0YWNobWVudF9mbGFncyd9IAogICAgICAgIGlmIGV4aXN0cyAkc2VsZi0+eydzaG93X2F0dGFjaG1lbnRfZmxhZ3MnfTsKICAgIHJldHVybiAwIGlmICRzZWxmLT57J2Vycm9yJ307CgogICAgIyBUaGUgbnVtYmVyIG9mIHR5cGVzIG9mIGZsYWdzIHRoYXQgY2FuIGJlIHNldCBvbiBhdHRhY2htZW50cyB0byB0aGlzIGJ1ZwogICAgIyBhbmQgdGhlIG51bWJlciBvZiBmbGFncyBvbiB0aG9zZSBhdHRhY2htZW50cy4gIE9uZSBvZiB0aGVzZSBjb3VudHMgbXVzdCBiZQogICAgIyBncmVhdGVyIHRoYW4gemVybyBpbiBvcmRlciBmb3IgdGhlICJmbGFncyIgY29sdW1uIHRvIGFwcGVhciBpbiB0aGUgdGFibGUKICAgICMgb2YgYXR0YWNobWVudHMuCiAgICBteSAkbnVtX2F0dGFjaG1lbnRfZmxhZ190eXBlcyA9IEJ1Z3ppbGxhOjpGbGFnVHlwZTo6Y291bnQoCiAgICAgICAgeyAndGFyZ2V0X3R5cGUnICA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAncHJvZHVjdF9pZCcgICA9PiAkc2VsZi0+eydwcm9kdWN0X2lkJ30sCiAgICAgICAgICAnY29tcG9uZW50X2lkJyA9PiAkc2VsZi0+eydjb21wb25lbnRfaWQnfSB9KTsKICAgIG15ICRudW1fYXR0YWNobWVudF9mbGFncyA9IEJ1Z3ppbGxhOjpGbGFnOjpjb3VudCgKICAgICAgICB7ICd0YXJnZXRfdHlwZScgID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICdidWdfaWQnICAgICAgID0+ICRzZWxmLT5idWdfaWQsCiAgICAgICAgICAnaXNfYWN0aXZlJyAgICA9PiAxIH0pOwoKICAgICRzZWxmLT57J3Nob3dfYXR0YWNobWVudF9mbGFncyd9ID0KICAgICAgICAoJG51bV9hdHRhY2htZW50X2ZsYWdfdHlwZXMgfHwgJG51bV9hdHRhY2htZW50X2ZsYWdzKTsKCiAgICByZXR1cm4gJHNlbGYtPnsnc2hvd19hdHRhY2htZW50X2ZsYWdzJ307Cn0KCgpzdWIgdXNlX2tleXdvcmRzIHsKICAgIHJldHVybiBAOjpsZWdhbF9rZXl3b3JkczsKfQoKc3ViIHVzZV92b3RlcyB7CiAgICBteSAoJHNlbGYpID0gQF87CiAgICByZXR1cm4gMCBpZiAkc2VsZi0+eydlcnJvcid9OwoKICAgIHJldHVybiBQYXJhbSgndXNldm90ZXMnKQogICAgICAmJiAkOjpwcm9kbWF4dm90ZXN7JHNlbGYtPntwcm9kdWN0fX0gPiAwOwp9CgpzdWIgZ3JvdXBzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gJHNlbGYtPnsnZ3JvdXBzJ30gaWYgZXhpc3RzICRzZWxmLT57J2dyb3Vwcyd9OwogICAgcmV0dXJuIFtdIGlmICRzZWxmLT57J2Vycm9yJ307CgogICAgbXkgJGRiaCA9IEJ1Z3ppbGxhLT5kYmg7CiAgICBteSBAZ3JvdXBzOwoKICAgICMgU29tZSBvZiB0aGlzIHN0dWZmIG5lZWRzIHRvIGdvIGludG8gQnVnemlsbGE6OlVzZXIKCiAgICAjIEZvciBldmVyeSBncm91cCwgd2UgbmVlZCB0byBrbm93IGlmIHRoZXJlIGlzIEFOWSBidWdfZ3JvdXBfbWFwCiAgICAjIHJlY29yZCBwdXR0aW5nIHRoZSBjdXJyZW50IGJ1ZyBpbiB0aGF0IGdyb3VwIGFuZCBpZiB0aGVyZSBpcyBBTlkKICAgICMgdXNlcl9ncm91cF9tYXAgcmVjb3JkIHB1dHRpbmcgdGhlIHVzZXIgaW4gdGhhdCBncm91cC4KICAgICMgVGhlIExFRlQgSk9JTnMgYXJlIGNoZWNraW5nIGZvciByZWNvcmQgZXhpc3RlbmNlLgogICAgIwogICAgbXkgJHN0aCA9ICRkYmgtPnByZXBhcmUoCiAgICAgICAgICAgICAiU0VMRUNUIERJU1RJTkNUIGdyb3Vwcy5pZCwgbmFtZSwgZGVzY3JpcHRpb24sIiAuCiAgICAgICAgICAgICAiIGJ1Z19ncm91cF9tYXAuZ3JvdXBfaWQgSVMgTk9UIE5VTEwsIiAuCiAgICAgICAgICAgICAiIHVzZXJfZ3JvdXBfbWFwLmdyb3VwX2lkIElTIE5PVCBOVUxMLCIgLgogICAgICAgICAgICAgIiBpc2FjdGl2ZSwgbWVtYmVyY29udHJvbCwgb3RoZXJjb250cm9sIiAuCiAgICAgICAgICAgICAiIEZST00gZ3JvdXBzIiAuIAogICAgICAgICAgICAgIiBMRUZUIEpPSU4gYnVnX2dyb3VwX21hcCIgLgogICAgICAgICAgICAgIiBPTiBidWdfZ3JvdXBfbWFwLmdyb3VwX2lkID0gZ3JvdXBzLmlkIiAuCiAgICAgICAgICAgICAiIEFORCBidWdfaWQgPSA/IiAuCiAgICAgICAgICAgICAiIExFRlQgSk9JTiB1c2VyX2dyb3VwX21hcCIgLgogICAgICAgICAgICAgIiBPTiB1c2VyX2dyb3VwX21hcC5ncm91cF9pZCA9IGdyb3Vwcy5pZCIgLgogICAgICAgICAgICAgIiBBTkQgdXNlcl9pZCA9ID8iIC4KICAgICAgICAgICAgICIgQU5EIGlzYmxlc3MgPSAwIiAuCiAgICAgICAgICAgICAiIExFRlQgSk9JTiBncm91cF9jb250cm9sX21hcCIgLgogICAgICAgICAgICAgIiBPTiBncm91cF9jb250cm9sX21hcC5ncm91cF9pZCA9IGdyb3Vwcy5pZCIgLgogICAgICAgICAgICAgIiBBTkQgZ3JvdXBfY29udHJvbF9tYXAucHJvZHVjdF9pZCA9ID8gIiAuCiAgICAgICAgICAgICAiIFdIRVJFIGlzYnVnZ3JvdXAgPSAxIiAuCiAgICAgICAgICAgICAiIE9SREVSIEJZIGRlc2NyaXB0aW9uIik7CiAgICAkc3RoLT5leGVjdXRlKCRzZWxmLT57J2J1Z19pZCd9LCBCdWd6aWxsYS0+dXNlci0+aWQsCiAgICAgICAgICAgICAgICAgICRzZWxmLT57J3Byb2R1Y3RfaWQnfSk7CgogICAgd2hpbGUgKG15ICgkZ3JvdXBpZCwgJG5hbWUsICRkZXNjcmlwdGlvbiwgJGlzb24sICRpbmdyb3VwLCAkaXNhY3RpdmUsCiAgICAgICAgICAgICRtZW1iZXJjb250cm9sLCAkb3RoZXJjb250cm9sKSA9ICRzdGgtPmZldGNocm93X2FycmF5KCkpIHsKCiAgICAgICAgJG1lbWJlcmNvbnRyb2wgfHw9IDA7CgogICAgICAgICMgRm9yIHByb2R1Y3QgZ3JvdXBzLCB3ZSBvbmx5IHdhbnQgdG8gdXNlIHRoZSBncm91cCBpZiBlaXRoZXIKICAgICAgICAjICgxKSBUaGUgYml0IGlzIHNldCBhbmQgbm90IHJlcXVpcmVkLCBvcgogICAgICAgICMgKDIpIFRoZSBncm91cCBpcyBTaG93biBvciBEZWZhdWx0IGZvciBtZW1iZXJzIGFuZAogICAgICAgICMgICAgIHRoZSB1c2VyIGlzIGEgbWVtYmVyIG9mIHRoZSBncm91cC4KICAgICAgICBpZiAoJGlzb24gfHwKICAgICAgICAgICAgKCRpc2FjdGl2ZSAmJiAkaW5ncm91cAogICAgICAgICAgICAgICAgICAgICAgICYmICgoJG1lbWJlcmNvbnRyb2wgPT0gQ09OVFJPTE1BUERFRkFVTFQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgkbWVtYmVyY29udHJvbCA9PSBDT05UUk9MTUFQU0hPV04pKQogICAgICAgICAgICApKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJGlzbWFuZGF0b3J5ID0gJGlzYWN0aXZlCiAgICAgICAgICAgICAgJiYgKCRtZW1iZXJjb250cm9sID09IENPTlRST0xNQVBNQU5EQVRPUlkpOwoKICAgICAgICAgICAgcHVzaCAoQGdyb3VwcywgeyAiYml0IiA9PiAkZ3JvdXBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSIgPT4gJG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzb24iID0+ICRpc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmdyb3VwIiA9PiAkaW5ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFuZGF0b3J5IiA9PiAkaXNtYW5kYXRvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIiA9PiAkZGVzY3JpcHRpb24gfSk7CiAgICAgICAgfQogICAgfQoKICAgICRzZWxmLT57J2dyb3Vwcyd9ID0gXEBncm91cHM7CgogICAgcmV0dXJuICRzZWxmLT57J2dyb3Vwcyd9Owp9CgpzdWIgdXNlciB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgcmV0dXJuICRzZWxmLT57J3VzZXInfSBpZiBleGlzdHMgJHNlbGYtPnsndXNlcid9OwogICAgcmV0dXJuIHt9IGlmICRzZWxmLT57J2Vycm9yJ307CgogICAgbXkgJHVzZXIgPSBCdWd6aWxsYS0+dXNlcjsKICAgIG15ICRjYW5tb3ZlID0gUGFyYW0oJ21vdmUtZW5hYmxlZCcpICYmICR1c2VyLT5pc19tb3ZlcjsKCiAgICAjIEluIHRoZSBiZWxvdywgaWYgdGhlIHBlcnNvbiBoYXNuJ3QgbG9nZ2VkIGluLCB0aGVuIHdlIHRyZWF0IHRoZW0KICAgICMgYXMgaWYgdGhleSBjYW4gZG8gYW55dGhpbmcuICBUaGF0J3MgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoeSB0aGV5CiAgICAjIGhhdmVuJ3QgbG9nZ2VkIGluOyBpdCBtYXkganVzdCBiZSBiZWNhdXNlIHRoZXkgZG9uJ3QgdXNlIGNvb2tpZXMuCiAgICAjIERpc3BsYXkgZXZlcnl0aGluZyBhcyBpZiB0aGV5IGhhdmUgYWxsIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUKICAgICMgd29ybGQ7IHRoZWlyIHBlcm1pc3Npb25zIHdpbGwgZ2V0IGNoZWNrZWQgd2hlbiB0aGV5IGxvZyBpbiBhbmQKICAgICMgYWN0dWFsbHkgdHJ5IHRvIG1ha2UgdGhlIGNoYW5nZS4KICAgIG15ICR1bmtub3duX3ByaXZpbGVnZXMgPSAhJHVzZXItPmlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJHVzZXItPmluX2dyb3VwKCJlZGl0YnVncyIpOwogICAgbXkgJGNhbmVkaXQgPSAkdW5rbm93bl9wcml2aWxlZ2VzCiAgICAgICAgICAgICAgICAgIHx8ICR1c2VyLT5pZCA9PSAkc2VsZi0+e2Fzc2lnbmVkX3RvX2lkfQogICAgICAgICAgICAgICAgICB8fCAoUGFyYW0oJ3VzZXFhY29udGFjdCcpCiAgICAgICAgICAgICAgICAgICAgICAmJiAkc2VsZi0+eydxYV9jb250YWN0X2lkJ30KICAgICAgICAgICAgICAgICAgICAgICYmICR1c2VyLT5pZCA9PSAkc2VsZi0+e3FhX2NvbnRhY3RfaWR9KTsKICAgIG15ICRjYW5jb25maXJtID0gJHVua25vd25fcHJpdmlsZWdlcwogICAgICAgICAgICAgICAgICAgICB8fCAkdXNlci0+aW5fZ3JvdXAoImNhbmNvbmZpcm0iKTsKICAgIG15ICRpc3JlcG9ydGVyID0gJHVzZXItPmlkCiAgICAgICAgICAgICAgICAgICAgICYmICR1c2VyLT5pZCA9PSAkc2VsZi0+e3JlcG9ydGVyX2lkfTsKCiAgICAkc2VsZi0+eyd1c2VyJ30gPSB7Y2FubW92ZSAgICA9PiAkY2FubW92ZSwKICAgICAgICAgICAgICAgICAgICAgICBjYW5jb25maXJtID0+ICRjYW5jb25maXJtLAogICAgICAgICAgICAgICAgICAgICAgIGNhbmVkaXQgICAgPT4gJGNhbmVkaXQsCiAgICAgICAgICAgICAgICAgICAgICAgaXNyZXBvcnRlciA9PiAkaXNyZXBvcnRlcn07CiAgICByZXR1cm4gJHNlbGYtPnsndXNlcid9Owp9CgpzdWIgY2hvaWNlcyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgcmV0dXJuICRzZWxmLT57J2Nob2ljZXMnfSBpZiBleGlzdHMgJHNlbGYtPnsnY2hvaWNlcyd9OwogICAgcmV0dXJuIHt9IGlmICRzZWxmLT57J2Vycm9yJ307CgogICAgJjo6R2V0VmVyc2lvblRhYmxlKCk7CgogICAgJHNlbGYtPnsnY2hvaWNlcyd9ID0ge307CgogICAgIyBGaWRkbGUgdGhlIHByb2R1Y3QgbGlzdC4KICAgIG15ICRzZWVuX2N1cnJfcHJvZDsKICAgIG15IEBwcm9kbGlzdDsKCiAgICBmb3JlYWNoIG15ICRwcm9kdWN0IChAOjplbnRlcmFibGVfcHJvZHVjdHMpIHsKICAgICAgICBpZiAoJHByb2R1Y3QgZXEgJHNlbGYtPnsncHJvZHVjdCd9KSB7CiAgICAgICAgICAgICMgaWYgaXQncyB0aGUgcHJvZHVjdCB0aGUgYnVnIGlzIGFscmVhZHkgaW4sIGl0J3MgQUxXQVlTIGluCiAgICAgICAgICAgICMgdGhlIHBvcHVwLCBwZXJpb2QsIHdoZXRoZXIgdGhlIHVzZXIgY2FuIHNlZSBpdCBvciBub3QsIGFuZAogICAgICAgICAgICAjIHJlZ2FyZGxlc3Mgb2YgdGhlIGRpc2FsbG93bmV3IHNldHRpbmcuCiAgICAgICAgICAgICRzZWVuX2N1cnJfcHJvZCA9IDE7CiAgICAgICAgICAgIHB1c2goQHByb2RsaXN0LCAkcHJvZHVjdCk7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoISY6OkNhbkVudGVyUHJvZHVjdCgkcHJvZHVjdCkpIHsKICAgICAgICAgICAgIyBJZiB3ZSdyZSB1c2luZyBidWcgZ3JvdXBzIHRvIHJlc3RyaWN0IGVudHJ5IG9uIHByb2R1Y3RzLCBhbmQKICAgICAgICAgICAgIyB0aGlzIHByb2R1Y3QgaGFzIGFuIGVudHJ5IGdyb3VwLCBhbmQgdGhlIHVzZXIgaXMgbm90IGluIHRoYXQKICAgICAgICAgICAgIyBncm91cCwgd2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoYXQgcHJvZHVjdCBpbiB0aGlzIGxpc3QuCiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQoKICAgICAgICBwdXNoKEBwcm9kbGlzdCwgJHByb2R1Y3QpOwogICAgfQoKICAgICMgVGhlIGN1cnJlbnQgcHJvZHVjdCBpcyBwYXJ0IG9mIHRoZSBwb3B1cCwgZXZlbiBpZiBuZXcgYnVncyBhcmUgbm8gbG9uZ2VyCiAgICAjIGFsbG93ZWQgZm9yIHRoYXQgcHJvZHVjdAogICAgaWYgKCEkc2Vlbl9jdXJyX3Byb2QpIHsKICAgICAgICBwdXNoIChAcHJvZGxpc3QsICRzZWxmLT57J3Byb2R1Y3QnfSk7CiAgICAgICAgQHByb2RsaXN0ID0gc29ydCBAcHJvZGxpc3Q7CiAgICB9CgogICAgIyBIYWNrIC0gdGhpcyBhcnJheSBjb250YWlucyAiIi4gU2VlIGJ1ZyAxMDY1ODkuCiAgICBteSBAcmVzID0gZ3JlcCAoJF8sIEA6OnNldHRhYmxlX3Jlc29sdXRpb24pOwoKICAgICRzZWxmLT57J2Nob2ljZXMnfSA9CiAgICAgIHsKICAgICAgICdwcm9kdWN0JyA9PiBcQHByb2RsaXN0LAogICAgICAgJ3JlcF9wbGF0Zm9ybScgPT4gXEA6OmxlZ2FsX3BsYXRmb3JtLAogICAgICAgJ3ByaW9yaXR5JyA9PiBcQDo6bGVnYWxfcHJpb3JpdHksCiAgICAgICAnYnVnX3NldmVyaXR5JyA9PiBcQDo6bGVnYWxfc2V2ZXJpdHksCiAgICAgICAnb3Bfc3lzJyA9PiBcQDo6bGVnYWxfb3BzeXMsCiAgICAgICAnYnVnX3N0YXR1cycgPT4gXEA6OmxlZ2FsX2J1Z19zdGF0dXMsCiAgICAgICAncmVzb2x1dGlvbicgPT4gXEByZXMsCiAgICAgICAnY29tcG9uZW50JyA9PiAkOjpjb21wb25lbnRzeyRzZWxmLT57cHJvZHVjdH19LAogICAgICAgJ3ZlcnNpb24nID0+ICQ6OnZlcnNpb25zeyRzZWxmLT57cHJvZHVjdH19LAogICAgICAgJ3RhcmdldF9taWxlc3RvbmUnID0+ICQ6OnRhcmdldF9taWxlc3RvbmV7JHNlbGYtPntwcm9kdWN0fX0sCiAgICAgIH07CgogICAgcmV0dXJuICRzZWxmLT57J2Nob2ljZXMnfTsKfQoKIyBDb252ZW5pZW5jZSBGdW5jdGlvbi4gSWYgeW91IG5lZWQgc3BlZWQsIHVzZSB0aGlzLiBJZiB5b3UgbmVlZAojIG90aGVyIEJ1ZyBmaWVsZHMgaW4gYWRkaXRpb24gdG8gdGhpcywganVzdCBjcmVhdGUgYSBuZXcgQnVnIHdpdGgKIyB0aGUgYWxpYXMuCiMgUXVlcmllcyB0aGUgZGF0YWJhc2UgZm9yIHRoZSBidWcgd2l0aCBhIGdpdmVuIGFsaWFzLCBhbmQgcmV0dXJucwojIHRoZSBJRCBvZiB0aGUgYnVnIGlmIGl0IGV4aXN0cyBvciB0aGUgdW5kZWZpbmVkIHZhbHVlIGlmIGl0IGRvZXNuJ3QuCnN1YiBidWdfYWxpYXNfdG9faWQgKCQpIHsKICAgIG15ICgkYWxpYXMpID0gQF87CiAgICByZXR1cm4gdW5kZWYgdW5sZXNzIFBhcmFtKCJ1c2VidWdhbGlhc2VzIik7CiAgICBteSAkZGJoID0gQnVnemlsbGEtPmRiaDsKICAgIHRyaWNrX3RhaW50KCRhbGlhcyk7CiAgICByZXR1cm4gJGRiaC0+c2VsZWN0cm93X2FycmF5KAogICAgICAgICJTRUxFQ1QgYnVnX2lkIEZST00gYnVncyBXSEVSRSBhbGlhcyA9ID8iLCB1bmRlZiwgJGFsaWFzKTsKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU3Vicm91dGluZXMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpzdWIgQXBwZW5kQ29tbWVudCAoJCQkOyQkJCkgewogICAgbXkgKCRidWdpZCwgJHdob2lkLCAkY29tbWVudCwgJGlzcHJpdmF0ZSwgJHRpbWVzdGFtcCwgJHdvcmtfdGltZSkgPSBAXzsKICAgICR3b3JrX3RpbWUgfHw9IDA7CiAgICBteSAkZGJoID0gQnVnemlsbGEtPmRiaDsKCiAgICBWYWxpZGF0ZVRpbWUoJHdvcmtfdGltZSwgIndvcmtfdGltZSIpIGlmICR3b3JrX3RpbWU7CiAgICB0cmlja190YWludCgkd29ya190aW1lKTsKCiAgICAjIFVzZSB0aGUgZGF0ZS90aW1lIHdlIHdlcmUgZ2l2ZW4gaWYgcG9zc2libGUgKGFsbG93aW5nIGNhbGxpbmcgY29kZQogICAgIyB0byBzeW5jaHJvbml6ZSB0aGUgY29tbWVudCdzIHRpbWVzdGFtcCB3aXRoIHRob3NlIG9mIG90aGVyIHJlY29yZHMpLgogICAgJHRpbWVzdGFtcCA9ICAiTk9XKCkiIHVubGVzcyAkdGltZXN0YW1wOwoKICAgICRjb21tZW50ID1+IHMvXHJcbi9cbi9nOyAgICAgIyBIYW5kbGUgV2luZG93cy1zdHlsZSBsaW5lIGVuZGluZ3MuCiAgICAkY29tbWVudCA9fiBzL1xyL1xuL2c7ICAgICAgICMgSGFuZGxlIE1hYy1zdHlsZSBsaW5lIGVuZGluZ3MuCgogICAgaWYgKCRjb21tZW50ID1+IC9eXHMqJC8pIHsgICMgTm90aGluJyBidXQgd2hpdGVzcGFjZQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIENvbW1lbnRzIGFyZSBhbHdheXMgc2FmZSwgYmVjYXVzZSB3ZSBhbHdheXMgZGlzcGxheSB0aGVpciByYXcgY29udGVudHMsCiAgICAjIGFuZCB3ZSB1c2UgdGhlbSBpbiBhIHBsYWNlaG9sZGVyIGJlbG93LgogICAgdHJpY2tfdGFpbnQoJGNvbW1lbnQpOyAKICAgIG15ICRwcml2YWN5dmFsID0gJGlzcHJpdmF0ZSA/IDEgOiAwIDsKICAgICRkYmgtPmRvKHF7SU5TRVJUIElOVE8gbG9uZ2Rlc2NzCiAgICAgICAgICAgICAgICAgICAgICAoYnVnX2lkLCB3aG8sIGJ1Z193aGVuLCB0aGV0ZXh0LCBpc3ByaXZhdGUsIHdvcmtfdGltZSkKICAgICAgICAgICAgICAgVkFMVUVTICg/LD8sPyw/LD8sPyl9LCB1bmRlZiwKICAgICAgICAgICAgICgkYnVnaWQsICR3aG9pZCwgJHRpbWVzdGFtcCwgJGNvbW1lbnQsICRwcml2YWN5dmFsLCAkd29ya190aW1lKSk7CiAgICAkZGJoLT5kbygiVVBEQVRFIGJ1Z3MgU0VUIGRlbHRhX3RzID0gPyBXSEVSRSBidWdfaWQgPSA/IiwKICAgICAgICAgICAgIHVuZGVmLCAkdGltZXN0YW1wLCAkYnVnaWQpOwp9Cg0KIyBUaGlzIG1ldGhvZCBpcyBwcml2YXRlIGFuZCBpcyBub3QgdG8gYmUgdXNlZCBvdXRzaWRlIG9mIHRoZSBCdWcgY2xhc3MuCnN1YiBFbWl0RGVwZW5kTGlzdCB7CiAgICBteSAoJG15ZmllbGQsICR0YXJnZXRmaWVsZCwgJGJ1Z19pZCkgPSAoQF8pOwogICAgbXkgJGRiaCA9IEJ1Z3ppbGxhLT5kYmg7CiAgICBteSAkbGlzdF9yZWYgPQogICAgICAgICRkYmgtPnNlbGVjdGNvbF9hcnJheXJlZigKICAgICAgICAgICJTRUxFQ1QgZGVwZW5kZW5jaWVzLiR0YXJnZXRmaWVsZAogICAgICAgICAgICAgRlJPTSBkZXBlbmRlbmNpZXMsIGJ1Z3MKICAgICAgICAgICAgV0hFUkUgZGVwZW5kZW5jaWVzLiRteWZpZWxkID0gPwogICAgICAgICAgICAgIEFORCBidWdzLmJ1Z19pZCA9IGRlcGVuZGVuY2llcy4kdGFyZ2V0ZmllbGQKICAgICAgICAgT1JERVIgQlkgZGVwZW5kZW5jaWVzLiR0YXJnZXRmaWVsZCIsCiAgICAgICAgIHVuZGVmLCAoJGJ1Z19pZCkpOwogICAgcmV0dXJuICRsaXN0X3JlZjsKfQoKc3ViIFZhbGlkYXRlVGltZSB7CiAgICBteSAoJHRpbWUsICRmaWVsZCkgPSBAXzsKCiAgICAjIHJlZ2V4cCB2ZXJpZmllcyBvbmUgb3IgbW9yZSBkaWdpdHMsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBwZXJpb2QgYW5kCiAgICAjIHplcm8gb3IgbW9yZSBkaWdpdHMsIE9SIHdlIGhhdmUgYSBwZXJpb2QgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZGlnaXRzCiAgICAjIChhbGxvdyBuZWdhdGl2ZXMsIHRob3VnaCwgc28gcGVvcGxlIGNhbiBiYWNrIG91dCBlcnJvcnMgaW4gdGltZSByZXBvcnRpbmcpCiAgICBpZiAoJHRpbWUgIX4gL14tPyg/OlxkKyg/OlwuXGQqKT98XC5cZCspJC8pIHsKICAgICAgICBUaHJvd1VzZXJFcnJvcigibnVtYmVyX25vdF9udW1lcmljIiwKICAgICAgICAgICAgICAgICAgICAgICB7ZmllbGQgPT4gIiRmaWVsZCIsIG51bSA9PiAiJHRpbWUifSk7CiAgICB9CgogICAgIyBPbmx5IHRoZSAid29ya190aW1lIiBmaWVsZCBpcyBhbGxvd2VkIHRvIGNvbnRhaW4gYSBuZWdhdGl2ZSB2YWx1ZS4KICAgIGlmICggKCR0aW1lIDwgMCkgJiYgKCRmaWVsZCBuZSAid29ya190aW1lIikgKSB7CiAgICAgICAgVGhyb3dVc2VyRXJyb3IoIm51bWJlcl90b29fc21hbGwiLAogICAgICAgICAgICAgICAgICAgICAgIHtmaWVsZCA9PiAiJGZpZWxkIiwgbnVtID0+ICIkdGltZSIsIG1pbl9udW0gPT4gIjAifSk7CiAgICB9CgogICAgaWYgKCR0aW1lID4gOTk5OTkuOTkpIHsKICAgICAgICBUaHJvd1VzZXJFcnJvcigibnVtYmVyX3Rvb19sYXJnZSIsCiAgICAgICAgICAgICAgICAgICAgICAge2ZpZWxkID0+ICIkZmllbGQiLCBudW0gPT4gIiR0aW1lIiwgbWF4X251bSA9PiAiOTk5OTkuOTkifSk7CiAgICB9Cn0KCnN1YiBHZXRDb21tZW50cyB7CiAgICBteSAoJGlkLCAkY29tbWVudF9zb3J0X29yZGVyKSA9IChAXyk7CiAgICAkY29tbWVudF9zb3J0X29yZGVyID0gJGNvbW1lbnRfc29ydF9vcmRlciB8fAogICAgICAgIEJ1Z3ppbGxhLT51c2VyLT5zZXR0aW5ncy0+eydjb21tZW50X3NvcnRfb3JkZXInfS0+eyd2YWx1ZSd9OwoKICAgIG15ICRzb3J0X29yZGVyID0gKCRjb21tZW50X3NvcnRfb3JkZXIgZXEgIm9sZGVzdF90b19uZXdlc3QiKSA/ICdhc2MnIDogJ2Rlc2MnOwogICAgbXkgJGRiaCA9IEJ1Z3ppbGxhLT5kYmg7CiAgICBteSBAY29tbWVudHM7CiAgICBteSAkc3RoID0gJGRiaC0+cHJlcGFyZSgKICAgICAgICAgICAgIlNFTEVDVCAgcHJvZmlsZXMucmVhbG5hbWUgQVMgbmFtZSwgcHJvZmlsZXMubG9naW5fbmFtZSBBUyBlbWFpbCwKICAgICAgICAgICAgIiAuICRkYmgtPnNxbF9kYXRlX2Zvcm1hdCgnbG9uZ2Rlc2NzLmJ1Z193aGVuJywgJyVZLiVtLiVkICVIOiVpJykgLiAiCiAgICAgICAgICAgICAgIEFTIHRpbWUsIGxvbmdkZXNjcy50aGV0ZXh0IEFTIGJvZHksIGxvbmdkZXNjcy53b3JrX3RpbWUsCiAgICAgICAgICAgICAgICAgICAgIGlzcHJpdmF0ZSwgYWxyZWFkeV93cmFwcGVkLAogICAgICAgICAgICAiIC4gJGRiaC0+c3FsX2RhdGVfZm9ybWF0KCdsb25nZGVzY3MuYnVnX3doZW4nLCAnJVklbSVkJUglaSVzJykgLiAiCiAgICAgICAgICAgICAgIEFTIGJ1Z193aGVuCiAgICAgICAgICAgICBGUk9NICAgIGxvbmdkZXNjcywgcHJvZmlsZXMKICAgICAgICAgICAgV0hFUkUgICAgcHJvZmlsZXMudXNlcmlkID0gbG9uZ2Rlc2NzLndobwogICAgICAgICAgICAgIEFORCAgICBsb25nZGVzY3MuYnVnX2lkID0gPwogICAgICAgICAgICBPUkRFUiBCWSBsb25nZGVzY3MuYnVnX3doZW4gJHNvcnRfb3JkZXIiKTsKICAgICRzdGgtPmV4ZWN1dGUoJGlkKTsKCiAgICB3aGlsZSAobXkgJGNvbW1lbnRfcmVmID0gJHN0aC0+ZmV0Y2hyb3dfaGFzaHJlZigpKSB7CiAgICAgICAgbXkgJWNvbW1lbnQgPSAlJGNvbW1lbnRfcmVmOwoKICAgICAgICAjIENhbid0IHVzZSAid2hlbiIgYXMgYSBmaWVsZCBuYW1lIGluIE15U1FMCiAgICAgICAgJGNvbW1lbnR7J3doZW4nfSA9ICRjb21tZW50eydidWdfd2hlbid9OwogICAgICAgIGRlbGV0ZSgkY29tbWVudHsnYnVnX3doZW4nfSk7CgogICAgICAgICRjb21tZW50eydlbWFpbCd9IC49IFBhcmFtKCdlbWFpbHN1ZmZpeCcpOwogICAgICAgICRjb21tZW50eyduYW1lJ30gPSAkY29tbWVudHsnbmFtZSd9IHx8ICRjb21tZW50eydlbWFpbCd9OwoKICAgICAgICBwdXNoIChAY29tbWVudHMsIFwlY29tbWVudCk7CiAgICB9CiAgIAogICAgaWYgKCRjb21tZW50X3NvcnRfb3JkZXIgZXEgIm5ld2VzdF90b19vbGRlc3RfZGVzY19maXJzdCIpIHsKICAgICAgICB1bnNoaWZ0KEBjb21tZW50cywgcG9wIEBjb21tZW50cyk7CiAgICB9CgogICAgcmV0dXJuIFxAY29tbWVudHM7Cn0KCiMgQ291bnRPcGVuRGVwZW5kZW5jaWVzIGNvdW50cyB0aGUgbnVtYmVyIG9mIG9wZW4gZGVwZW5kZW50IGJ1Z3MgZm9yIGEKIyBsaXN0IG9mIGJ1Z3MgYW5kIHJldHVybnMgYSBsaXN0IG9mIGJ1Z19pZCdzIGFuZCB0aGVpciBkZXBlbmRlbmN5IGNvdW50CiMgSXQgdGFrZXMgb25lIHBhcmFtZXRlcjoKIyAgLSBBIGxpc3Qgb2YgYnVnIG51bWJlcnMgd2hvc2UgZGVwZW5kZW5jaWVzIGFyZSB0byBiZSBjaGVja2VkCnN1YiBDb3VudE9wZW5EZXBlbmRlbmNpZXMgewogICAgbXkgKEBidWdfbGlzdCkgPSBAXzsKICAgIG15IEBkZXBlbmRlbmNpZXM7CiAgICBteSAkZGJoID0gQnVnemlsbGEtPmRiaDsKCiAgICBteSAkc3RoID0gJGRiaC0+cHJlcGFyZSgKICAgICAgICAgICJTRUxFQ1QgYmxvY2tlZCwgQ09VTlQoYnVnX3N0YXR1cykgIiAuCiAgICAgICAgICAgICJGUk9NIGJ1Z3MsIGRlcGVuZGVuY2llcyAiIC4KICAgICAgICAgICAiV0hFUkUgYmxvY2tlZCBJTiAoIiAuIChqb2luICIsIiAsIEBidWdfbGlzdCkgLiAiKSAiIC4KICAgICAgICAgICAgICJBTkQgYnVnX2lkID0gZGVwZW5kc29uICIgLgogICAgICAgICAgICAgIkFORCBidWdfc3RhdHVzIElOICgnIiAuIChqb2luICInLCciLCAmOjpPcGVuU3RhdGVzKCkpICAuICInKSAiIC4KICAgICAgICAgICRkYmgtPnNxbF9ncm91cF9ieSgnYmxvY2tlZCcpKTsKICAgICRzdGgtPmV4ZWN1dGUoKTsKCiAgICB3aGlsZSAobXkgKCRidWdfaWQsICRkZXBlbmRlbmNpZXMpID0gJHN0aC0+ZmV0Y2hyb3dfYXJyYXkoKSkgewogICAgICAgIHB1c2goQGRlcGVuZGVuY2llcywgeyBidWdfaWQgICAgICAgPT4gJGJ1Z19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzID0+ICRkZXBlbmRlbmNpZXMgfSk7CiAgICB9CgogICAgcmV0dXJuIEBkZXBlbmRlbmNpZXM7Cn0KCnN1YiBWYWxpZGF0ZUNvbW1lbnQgKCQpIHsKICAgIG15ICgkY29tbWVudCkgPSBAXzsKCiAgICBpZiAoZGVmaW5lZCgkY29tbWVudCkgJiYgbGVuZ3RoKCRjb21tZW50KSA+IE1BWF9DT01NRU5UX0xFTkdUSCkgewogICAgICAgIFRocm93VXNlckVycm9yKCJjb21tZW50X3Rvb19sb25nIik7CiAgICB9Cn0KCiMgSWYgYSBidWcgaXMgbW92ZWQgdG8gYSBwcm9kdWN0IHdoaWNoIGFsbG93cyBsZXNzIHZvdGVzIHBlciBidWcKIyBjb21wYXJlZCB0byB0aGUgcHJldmlvdXMgcHJvZHVjdCwgZXh0cmEgdm90ZXMgbmVlZCB0byBiZSByZW1vdmVkLgpzdWIgUmVtb3ZlVm90ZXMgewogICAgbXkgKCRpZCwgJHdobywgJHJlYXNvbikgPSAoQF8pOwogICAgbXkgJGRiaCA9IEJ1Z3ppbGxhLT5kYmg7CgogICAgbXkgJHdob3BhcnQgPSAoJHdobykgPyAiIEFORCB2b3Rlcy53aG8gPSAkd2hvIiA6ICIiOwoKICAgIG15ICRzdGggPSAkZGJoLT5wcmVwYXJlKCJTRUxFQ1QgcHJvZmlsZXMubG9naW5fbmFtZSwgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZmlsZXMudXNlcmlkLCB2b3Rlcy52b3RlX2NvdW50LCAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9kdWN0cy52b3Rlc3BlcnVzZXIsIHByb2R1Y3RzLm1heHZvdGVzcGVyYnVnICIgLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZST00gcHJvZmlsZXMgIiAuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxFRlQgSk9JTiB2b3RlcyBPTiBwcm9maWxlcy51c2VyaWQgPSB2b3Rlcy53aG8gIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEVGVCBKT0lOIGJ1Z3MgVVNJTkcoYnVnX2lkKSAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMRUZUIEpPSU4gcHJvZHVjdHMgT04gcHJvZHVjdHMuaWQgPSBidWdzLnByb2R1Y3RfaWQgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgdm90ZXMuYnVnX2lkID0gPyAiIC4gJHdob3BhcnQpOwogICAgJHN0aC0+ZXhlY3V0ZSgkaWQpOwogICAgbXkgQGxpc3Q7CiAgICB3aGlsZSAobXkgKCRuYW1lLCAkdXNlcmlkLCAkb2xkdm90ZXMsICR2b3Rlc3BlcnVzZXIsICRtYXh2b3Rlc3BlcmJ1ZykgPSAkc3RoLT5mZXRjaHJvd19hcnJheSgpKSB7CiAgICAgICAgcHVzaChAbGlzdCwgWyRuYW1lLCAkdXNlcmlkLCAkb2xkdm90ZXMsICR2b3Rlc3BlcnVzZXIsICRtYXh2b3Rlc3BlcmJ1Z10pOwogICAgfQogICAgaWYgKHNjYWxhcihAbGlzdCkpIHsKICAgICAgICBmb3JlYWNoIG15ICRyZWYgKEBsaXN0KSB7CiAgICAgICAgICAgIG15ICgkbmFtZSwgJHVzZXJpZCwgJG9sZHZvdGVzLCAkdm90ZXNwZXJ1c2VyLCAkbWF4dm90ZXNwZXJidWcpID0gKEAkcmVmKTsKICAgICAgICAgICAgbXkgJHM7CgogICAgICAgICAgICAkbWF4dm90ZXNwZXJidWcgPSBtaW4oJHZvdGVzcGVydXNlciwgJG1heHZvdGVzcGVyYnVnKTsKCiAgICAgICAgICAgICMgSWYgdGhpcyBwcm9kdWN0IGFsbG93cyB2b3RpbmcgYW5kIHRoZSB1c2VyJ3Mgdm90ZXMgYXJlIGluCiAgICAgICAgICAgICMgdGhlIGFjY2VwdGFibGUgcmFuZ2UsIHRoZW4gZG9uJ3QgZG8gYW55dGhpbmcuCiAgICAgICAgICAgIG5leHQgaWYgJHZvdGVzcGVydXNlciAmJiAkb2xkdm90ZXMgPD0gJG1heHZvdGVzcGVyYnVnOwoKICAgICAgICAgICAgIyBJZiB0aGUgdXNlciBoYXMgbW9yZSB2b3RlcyBvbiB0aGlzIGJ1ZyB0aGFuIHRoaXMgcHJvZHVjdAogICAgICAgICAgICAjIGFsbG93cywgdGhlbiByZWR1Y2UgdGhlIG51bWJlciBvZiB2b3RlcyBzbyBpdCBmaXRzCiAgICAgICAgICAgIG15ICRuZXd2b3RlcyA9ICRtYXh2b3Rlc3BlcmJ1ZzsKCiAgICAgICAgICAgIG15ICRyZW1vdmVkdm90ZXMgPSAkb2xkdm90ZXMgLSAkbmV3dm90ZXM7CgogICAgICAgICAgICAkcyA9ICgkb2xkdm90ZXMgPT0gMSkgPyAiIiA6ICJzIjsKICAgICAgICAgICAgbXkgJG9sZHZvdGVzdGV4dCA9ICJZb3UgaGFkICRvbGR2b3RlcyB2b3RlJHMgb24gdGhpcyBidWcuIjsKCiAgICAgICAgICAgICRzID0gKCRyZW1vdmVkdm90ZXMgPT0gMSkgPyAiIiA6ICJzIjsKICAgICAgICAgICAgbXkgJHJlbW92ZWR2b3Rlc3RleHQgPSAiWW91IGhhZCAkcmVtb3ZlZHZvdGVzIHZvdGUkcyByZW1vdmVkIGZyb20gdGhpcyBidWcuIjsKCiAgICAgICAgICAgIG15ICRuZXd2b3Rlc3RleHQ7CiAgICAgICAgICAgIGlmICgkbmV3dm90ZXMpIHsKICAgICAgICAgICAgICAgICRkYmgtPmRvKCJVUERBVEUgdm90ZXMgU0VUIHZvdGVfY291bnQgPSA/ICIgLgogICAgICAgICAgICAgICAgICAgICAgICAgIldIRVJFIGJ1Z19pZCA9ID8gQU5EIHdobyA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsICgkbmV3dm90ZXMsICRpZCwgJHVzZXJpZCkpOwogICAgICAgICAgICAgICAgJHMgPSAkbmV3dm90ZXMgPT0gMSA/ICIiIDogInMiOwogICAgICAgICAgICAgICAgJG5ld3ZvdGVzdGV4dCA9ICJZb3Ugc3RpbGwgaGF2ZSAkbmV3dm90ZXMgdm90ZSRzIG9uIHRoaXMgYnVnLiIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRkYmgtPmRvKCJERUxFVEUgRlJPTSB2b3RlcyBXSEVSRSBidWdfaWQgPSA/IEFORCB3aG8gPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmLCAoJGlkLCAkdXNlcmlkKSk7CiAgICAgICAgICAgICAgICAkbmV3dm90ZXN0ZXh0ID0gIllvdSBoYXZlIG5vIG1vcmUgdm90ZXMgcmVtYWluaW5nIG9uIHRoaXMgYnVnLiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgTm90aWNlIHRoYXQgd2UgZGlkIG5vdCBtYWtlIHN1cmUgdGhhdCB0aGUgdXNlciBmaXQgd2l0aGluIHRoZSAkdm90ZXNwZXJ1c2VyCiAgICAgICAgICAgICMgcmFuZ2UuICBUaGlzIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gYWNjZXB0YWJsZSBhbHRlcm5hdGl2ZSB0byBsb3Npbmcgdm90ZXMKICAgICAgICAgICAgIyBkdXJpbmcgcHJvZHVjdCBtb3Zlcy4gIFRoZW4gbmV4dCB0aW1lIHRoZSB1c2VyIGF0dGVtcHRzIHRvIGNoYW5nZSB0aGVpciB2b3RlcywKICAgICAgICAgICAgIyB0aGV5IHdpbGwgYmUgZm9yY2VkIHRvIGZpdCB3aXRoaW4gdGhlICR2b3Rlc3BlcnVzZXIgbGltaXQuCgogICAgICAgICAgICAjIE5vdyBsZXRzIHNlbmQgdGhlIGUtbWFpbCB0byBhbGVydCB0aGUgdXNlciB0byB0aGUgZmFjdCB0aGF0IHRoZWlyIHZvdGVzIGhhdmUKICAgICAgICAgICAgIyBiZWVuIHJlZHVjZWQgb3IgcmVtb3ZlZC4KICAgICAgICAgICAgbXkgJXN1YnN0czsKCiAgICAgICAgICAgICRzdWJzdHN7InRvIn0gPSAkbmFtZSAuIFBhcmFtKCdlbWFpbHN1ZmZpeCcpOwogICAgICAgICAgICAkc3Vic3RzeyJidWdpZCJ9ID0gJGlkOwogICAgICAgICAgICAkc3Vic3RzeyJyZWFzb24ifSA9ICRyZWFzb247CgogICAgICAgICAgICAkc3Vic3RzeyJ2b3Rlc3JlbW92ZWQifSA9ICRyZW1vdmVkdm90ZXM7CiAgICAgICAgICAgICRzdWJzdHN7InZvdGVzb2xkIn0gPSAkb2xkdm90ZXM7CiAgICAgICAgICAgICRzdWJzdHN7InZvdGVzbmV3In0gPSAkbmV3dm90ZXM7CgogICAgICAgICAgICAkc3Vic3RzeyJ2b3Rlc3JlbW92ZWR0ZXh0In0gPSAkcmVtb3ZlZHZvdGVzdGV4dDsKICAgICAgICAgICAgJHN1YnN0c3sidm90ZXNvbGR0ZXh0In0gPSAkb2xkdm90ZXN0ZXh0OwogICAgICAgICAgICAkc3Vic3RzeyJ2b3Rlc25ld3RleHQifSA9ICRuZXd2b3Rlc3RleHQ7CgogICAgICAgICAgICAkc3Vic3RzeyJjb3VudCJ9ID0gJHJlbW92ZWR2b3RlcyAuICJcbiAgICAiIC4gJG5ld3ZvdGVzdGV4dDsKCiAgICAgICAgICAgIG15ICRtc2cgPSBQZXJmb3JtU3Vic3RzKFBhcmFtKCJ2b3RlcmVtb3ZlZG1haWwiKSwgXCVzdWJzdHMpOwogICAgICAgICAgICBCdWd6aWxsYTo6QnVnTWFpbDo6TWVzc2FnZVRvTVRBKCRtc2cpOwogICAgICAgIH0KICAgICAgICBteSAkdm90ZXMgPSAkZGJoLT5zZWxlY3Ryb3dfYXJyYXkoIlNFTEVDVCBTVU0odm90ZV9jb3VudCkgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGUk9NIHZvdGVzIFdIRVJFIGJ1Z19pZCA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwgJGlkKSB8fCAwOwogICAgICAgICRkYmgtPmRvKCJVUERBVEUgYnVncyBTRVQgdm90ZXMgPSA/IFdIRVJFIGJ1Z19pZCA9ID8iLAogICAgICAgICAgICAgICAgIHVuZGVmLCAoJHZvdGVzLCAkaWQpKTsKICAgIH0KfQoKIyBJZiBhIHVzZXIgdm90ZXMgZm9yIGEgYnVnLCBvciB0aGUgbnVtYmVyIG9mIHZvdGVzIHJlcXVpcmVkIHRvCiMgY29uZmlybSBhIGJ1ZyBoYXMgYmVlbiByZWR1Y2VkLCBjaGVjayBpZiB0aGUgYnVnIGlzIG5vdyBjb25maXJtZWQuCnN1YiBDaGVja0lmVm90ZWRDb25maXJtZWQgewogICAgbXkgKCRpZCwgJHdobykgPSAoQF8pOwogICAgbXkgJGRiaCA9IEJ1Z3ppbGxhLT5kYmg7CgogICAgbXkgKCR2b3RlcywgJHN0YXR1cywgJGV2ZXJjb25maXJtZWQsICR2b3Rlc3RvY29uZmlybSwgJHRpbWVzdGFtcCkgPQogICAgICAgICRkYmgtPnNlbGVjdHJvd19hcnJheSgiU0VMRUNUIHZvdGVzLCBidWdfc3RhdHVzLCBldmVyY29uZmlybWVkLCAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICB2b3Rlc3RvY29uZmlybSwgTk9XKCkgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGUk9NIGJ1Z3MgSU5ORVIgSk9JTiBwcm9kdWN0cyAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIE9OIHByb2R1Y3RzLmlkID0gYnVncy5wcm9kdWN0X2lkICIgLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgYnVncy5idWdfaWQgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsICRpZCk7CgogICAgbXkgJHJldCA9IDA7CiAgICBpZiAoJHZvdGVzID49ICR2b3Rlc3RvY29uZmlybSAmJiAhJGV2ZXJjb25maXJtZWQpIHsKICAgICAgICBpZiAoJHN0YXR1cyBlcSAnVU5DT05GSVJNRUQnKSB7CiAgICAgICAgICAgIG15ICRmaWVsZGlkID0gJjo6R2V0RmllbGRJRCgiYnVnX3N0YXR1cyIpOwogICAgICAgICAgICAkZGJoLT5kbygiVVBEQVRFIGJ1Z3MgU0VUIGJ1Z19zdGF0dXMgPSAnTkVXJywgZXZlcmNvbmZpcm1lZCA9IDEsICIgLgogICAgICAgICAgICAgICAgICAgICAiZGVsdGFfdHMgPSA/IFdIRVJFIGJ1Z19pZCA9ID8iLAogICAgICAgICAgICAgICAgICAgICB1bmRlZiwgKCR0aW1lc3RhbXAsICRpZCkpOwogICAgICAgICAgICAkZGJoLT5kbygiSU5TRVJUIElOVE8gYnVnc19hY3Rpdml0eSAiIC4KICAgICAgICAgICAgICAgICAgICAgIihidWdfaWQsIHdobywgYnVnX3doZW4sIGZpZWxkaWQsIHJlbW92ZWQsIGFkZGVkKSAiIC4KICAgICAgICAgICAgICAgICAgICAgIlZBTFVFUyAoPywgPywgPywgPywgPywgPykiLAogICAgICAgICAgICAgICAgICAgICB1bmRlZiwgKCRpZCwgJHdobywgJHRpbWVzdGFtcCwgJGZpZWxkaWQsICdVTkNPTkZJUk1FRCcsICdORVcnKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkZGJoLT5kbygiVVBEQVRFIGJ1Z3MgU0VUIGV2ZXJjb25maXJtZWQgPSAxLCBkZWx0YV90cyA9ID8gIiAuCiAgICAgICAgICAgICAgICAgICAgICJXSEVSRSBidWdfaWQgPSA/IiwgdW5kZWYsICgkdGltZXN0YW1wLCAkaWQpKTsKICAgICAgICB9CgogICAgICAgIG15ICRmaWVsZGlkID0gJjo6R2V0RmllbGRJRCgiZXZlcmNvbmZpcm1lZCIpOwogICAgICAgICRkYmgtPmRvKCJJTlNFUlQgSU5UTyBidWdzX2FjdGl2aXR5ICIgLgogICAgICAgICAgICAgICAgICIoYnVnX2lkLCB3aG8sIGJ1Z193aGVuLCBmaWVsZGlkLCByZW1vdmVkLCBhZGRlZCkgIiAuCiAgICAgICAgICAgICAgICAgIlZBTFVFUyAoPywgPywgPywgPywgPywgPykiLAogICAgICAgICAgICAgICAgIHVuZGVmLCAoJGlkLCAkd2hvLCAkdGltZXN0YW1wLCAkZmllbGRpZCwgJzAnLCAnMScpKTsKCiAgICAgICAgQXBwZW5kQ29tbWVudCgkaWQsICR3aG8sCiAgICAgICAgICAgICAgICAgICAgICAiKioqIFRoaXMgYnVnIGhhcyBiZWVuIGNvbmZpcm1lZCBieSBwb3B1bGFyIHZvdGUuICoqKiIsCiAgICAgICAgICAgICAgICAgICAgICAwLCAkdGltZXN0YW1wKTsKCiAgICAgICAgJHJldCA9IDE7CiAgICB9CiAgICByZXR1cm4gJHJldDsKfQoKIwojIEZpZWxkIFZhbGlkYXRpb24KIwoKIyBWYWxpZGF0ZUJ1Z0FsaWFzOgojICAgQ2hlY2sgdGhhdCB0aGUgYnVnIGFsaWFzIGlzIHZhbGlkIGFuZCBub3QgdXNlZCBieSBhbm90aGVyIGJ1Zy4gIElmIAojICAgY3Vycl9pZCBpcyBzcGVjaWZpZWQsIHZlcmlmeSB0aGUgYWxpYXMgaXMgbm90IHVzZWQgZm9yIGFueSBvdGhlcgojICAgYnVnIGlkLiAgCnN1YiBWYWxpZGF0ZUJ1Z0FsaWFzIHsKICAgIG15ICgkYWxpYXMsICRjdXJyX2lkKSA9IEBfOwogICAgbXkgJGRiaCA9IEJ1Z3ppbGxhLT5kYmg7CgogICAgJGFsaWFzID0gdHJpbSgkYWxpYXMgfHwgIiIpOwogICAgdHJpY2tfdGFpbnQoJGFsaWFzKTsKCiAgICBpZiAoJGFsaWFzIGVxICIiKSB7CiAgICAgICAgVGhyb3dVc2VyRXJyb3IoImFsaWFzX25vdF9kZWZpbmVkIik7CiAgICB9CgogICAgIyBNYWtlIHN1cmUgdGhlIGFsaWFzIGlzbid0IHRvbyBsb25nLgogICAgaWYgKGxlbmd0aCgkYWxpYXMpID4gMjApIHsKICAgICAgICBUaHJvd1VzZXJFcnJvcigiYWxpYXNfdG9vX2xvbmciKTsKICAgIH0KCiAgICAjIE1ha2Ugc3VyZSB0aGUgYWxpYXMgaXMgdW5pcXVlLgogICAgbXkgJHF1ZXJ5ID0gIlNFTEVDVCBidWdfaWQgRlJPTSBidWdzIFdIRVJFIGFsaWFzID0gPyI7CiAgICBpZiAoZGV0YWludF9uYXR1cmFsKCRjdXJyX2lkKSkgewogICAgICAgICRxdWVyeSAuPSAiIEFORCBidWdfaWQgIT0gJGN1cnJfaWQiOwogICAgfQogICAgbXkgJGlkID0gJGRiaC0+c2VsZWN0cm93X2FycmF5KCRxdWVyeSwgdW5kZWYsICRhbGlhcyk7IAoKICAgIG15ICR2YXJzID0ge307CiAgICAkdmFycy0+eydhbGlhcyd9ID0gJGFsaWFzOwogICAgaWYgKCRpZCkgewogICAgICAgICR2YXJzLT57J2J1Z19saW5rJ30gPSAmOjpHZXRCdWdMaW5rKCRpZCwgJGlkKTsKICAgICAgICBUaHJvd1VzZXJFcnJvcigiYWxpYXNfaW5fdXNlIiwgJHZhcnMpOwogICAgfQoKICAgICMgTWFrZSBzdXJlIHRoZSBhbGlhcyBpc24ndCBqdXN0IGEgbnVtYmVyLgogICAgaWYgKCRhbGlhcyA9fiAvXlxkKyQvKSB7CiAgICAgICAgVGhyb3dVc2VyRXJyb3IoImFsaWFzX2lzX251bWVyaWMiLCAkdmFycyk7CiAgICB9CgogICAgIyBNYWtlIHN1cmUgdGhlIGFsaWFzIGhhcyBubyBjb21tYXMgb3Igc3BhY2VzLgogICAgaWYgKCRhbGlhcyA9fiAvWywgXS8pIHsKICAgICAgICBUaHJvd1VzZXJFcnJvcigiYWxpYXNfaGFzX2NvbW1hX29yX3NwYWNlIiwgJHZhcnMpOwogICAgfQoKICAgICRfWzBdID0gJGFsaWFzOwp9CgojIFZhbGlkYXRlIGFuZCByZXR1cm4gYSBoYXNoIG9mIGRlcGVuZGVuY2llcwpzdWIgVmFsaWRhdGVEZXBlbmRlbmNpZXMoJCQkKSB7CiAgICBteSAkZmllbGRzID0ge307CiAgICAkZmllbGRzLT57J2RlcGVuZHNvbid9ID0gc2hpZnQ7CiAgICAkZmllbGRzLT57J2Jsb2NrZWQnfSA9IHNoaWZ0OwogICAgbXkgJGlkID0gc2hpZnQgfHwgMDsKCiAgICB1bmxlc3MgKGRlZmluZWQoJGZpZWxkcy0+eydkZXBlbmRzb24nfSkKICAgICAgICAgICAgfHwgZGVmaW5lZCgkZmllbGRzLT57J2Jsb2NrZWQnfSkpCiAgICB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRkYmggPSBCdWd6aWxsYS0+ZGJoOwogICAgbXkgJWRlcHM7CiAgICBteSAlZGVwdHJlZTsKICAgIGZvcmVhY2ggbXkgJHBhaXIgKFsiYmxvY2tlZCIsICJkZXBlbmRzb24iXSwgWyJkZXBlbmRzb24iLCAiYmxvY2tlZCJdKSB7CiAgICAgICAgbXkgKCRtZSwgJHRhcmdldCkgPSBAeyRwYWlyfTsKICAgICAgICAkZGVwdHJlZXskdGFyZ2V0fSA9IFtdOwogICAgICAgICRkZXBzeyR0YXJnZXR9ID0gW107CiAgICAgICAgbmV4dCB1bmxlc3MgJGZpZWxkcy0+eyR0YXJnZXR9OwoKICAgICAgICBteSAlc2VlbjsKICAgICAgICBmb3JlYWNoIG15ICRpIChzcGxpdCgnW1xzLF0rJywgJGZpZWxkcy0+eyR0YXJnZXR9KSkgewogICAgICAgICAgICBpZiAoJGlkID09ICRpKSB7CiAgICAgICAgICAgICAgICBUaHJvd1VzZXJFcnJvcigiZGVwZW5kZW5jeV9sb29wX3NpbmdsZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghZXhpc3RzICRzZWVueyRpfSkgewogICAgICAgICAgICAgICAgcHVzaChAeyRkZXB0cmVleyR0YXJnZXR9fSwgJGkpOwogICAgICAgICAgICAgICAgJHNlZW57JGl9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIHBvcHVsYXRlICRkZXBzeyR0YXJnZXR9IGFzIGZpcnN0LWxldmVsIGRlcHMgb25seS4KICAgICAgICAjIGFuZCBmaW5kIHJlbWFpbmRlciBvZiBkZXBlbmRlbmN5IHRyZWUgaW4gJGRlcHRyZWV7JHRhcmdldH0KICAgICAgICBAeyRkZXBzeyR0YXJnZXR9fSA9IEB7JGRlcHRyZWV7JHRhcmdldH19OwogICAgICAgIG15IEBzdGFjayA9IEB7JGRlcHN7JHRhcmdldH19OwogICAgICAgIHdoaWxlIChAc3RhY2spIHsKICAgICAgICAgICAgbXkgJGkgPSBzaGlmdCBAc3RhY2s7CiAgICAgICAgICAgIG15ICRkZXBfbGlzdCA9CiAgICAgICAgICAgICAgICAkZGJoLT5zZWxlY3Rjb2xfYXJyYXlyZWYoIlNFTEVDVCAkdGFyZ2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFICRtZSA9ID8iLCB1bmRlZiwgJGkpOwogICAgICAgICAgICBmb3JlYWNoIG15ICR0IChAJGRlcF9saXN0KSB7CiAgICAgICAgICAgICAgICAjIGlnbm9yZSBhbnkgX2N1cnJlbnRfIGRlcGVuZGVuY2llcyBpbnZvbHZpbmcgdGhpcyBidWcsCiAgICAgICAgICAgICAgICAjIGFzIHRoZXkgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIGRhdGEgZnJvbSB0aGUgZm9ybS4KICAgICAgICAgICAgICAgIGlmICgkdCAhPSAkaWQgJiYgIWV4aXN0cyAkc2VlbnskdH0pIHsKICAgICAgICAgICAgICAgICAgICBwdXNoKEB7JGRlcHRyZWV7JHRhcmdldH19LCAkdCk7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAc3RhY2ssICR0OwogICAgICAgICAgICAgICAgICAgICRzZWVueyR0fSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgQGRlcHMgICA9IEB7JGRlcHRyZWV7J2RlcGVuZHNvbid9fTsKICAgIG15IEBibG9ja3MgPSBAeyRkZXB0cmVleydibG9ja2VkJ319OwogICAgbXkgQHVuaW9uID0gKCk7CiAgICBteSBAaXNlY3QgPSAoKTsKICAgIG15ICV1bmlvbiA9ICgpOwogICAgbXkgJWlzZWN0ID0gKCk7CiAgICBmb3JlYWNoIG15ICRiIChAZGVwcywgQGJsb2NrcykgeyAkdW5pb257JGJ9KysgJiYgJGlzZWN0eyRifSsrIH0KICAgIEB1bmlvbiA9IGtleXMgJXVuaW9uOwogICAgQGlzZWN0ID0ga2V5cyAlaXNlY3Q7CiAgICBpZiAoc2NhbGFyKEBpc2VjdCkgPiAwKSB7CiAgICAgICAgbXkgJGJvdGggPSAiIjsKICAgICAgICBmb3JlYWNoIG15ICRpIChAaXNlY3QpIHsKICAgICAgICAgICAkYm90aCAuPSAmOjpHZXRCdWdMaW5rKCRpLCAiIyIgLiAkaSkgLiAiICI7CiAgICAgICAgfQogICAgICAgIFRocm93VXNlckVycm9yKCJkZXBlbmRlbmN5X2xvb3BfbXVsdGkiLCB7IGJvdGggPT4gJGJvdGggfSk7CiAgICB9CiAgICByZXR1cm4gJWRlcHM7Cn0KCnN1YiBBVVRPTE9BRCB7CiAgdXNlIHZhcnMgcXcoJEFVVE9MT0FEKTsKICBteSAkYXR0ciA9ICRBVVRPTE9BRDsKCiAgJGF0dHIgPX4gcy8uKjo6Ly87CiAgcmV0dXJuIHVubGVzcyAkYXR0cj1+IC9bXkEtWl0vOwogIGNvbmZlc3MgKCJpbnZhbGlkIGJ1ZyBhdHRyaWJ1dGUgJGF0dHIiKSB1bmxlc3MgJG9rX2ZpZWxkeyRhdHRyfTsKCiAgbm8gc3RyaWN0ICdyZWZzJzsKICAqJEFVVE9MT0FEID0gc3ViIHsKICAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICAgaWYgKGRlZmluZWQgJHNlbGYtPnskYXR0cn0pIHsKICAgICAgICAgIHJldHVybiAkc2VsZi0+eyRhdHRyfTsKICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiAnJzsKICAgICAgfQogIH07CgogIGdvdG8gJiRBVVRPTE9BRDsKfQoKMTsK