GeneralCatalog
0.1.5
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Small improvements and code cleanup.
Small improvements and code cleanup.
Add option Valid to ItemList().
Add missing files to SOPM file.
Init release.
The general catalog package.
Das Allgemeiner Katalog Paket.
2.2.x
2007-03-28 20:29:26
opms.otrs.com
IyAtLQojIENIQU5HRVMuR2VuZXJhbENhdGFsb2cgLSBjaGFuZ2UgbG9nIG9mIEdlbmVyYWxDYXRhbG9nIHBhY2thZ2UKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogQ0hBTkdFUy5HZW5lcmFsQ2F0YWxvZyx2IDEuMSAyMDA3LzAzLzIwIDEwOjM2OjEwIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKMC45LjEgQkVUQTEgKDIwMDcvPz8vPz8pCiAtICgyMDA3Lz8/Lz8/KSBmaXJzdCBiZXRhIHJlbGVhc2UKCkVPRgo=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBHZW5lcmFsQ2F0YWxvZy54bWwsdiAxLjIgMjAwNy8wMi8yNCAxMTozNToyOCBtaCBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluR2VuZXJhbENhdGFsb2ciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXIgQWRtaW5HZW5lcmFsQ2F0YWxvZyBLb25maWd1cmF0aW9uIGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+YWRtaW48L0dyb3VwPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkbWluPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5HZW5lcmFsIENhdGFsb2c8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+R2VuZXJhbCBDYXRhbG9nPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5CbG9jazM8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjQxMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogZGVfR2VuZXJhbENhdGFsb2cucG0sdiAxLjEuMS4xIDIwMDcvMDIvMjMgMTU6Mzk6MDAgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnQWxsZ2VtZWluZXIgS2F0YWxvZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0FsbGdlbWVpbmVyIEthdGFsb2cgVmVyd2FsdHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnS2F0YWxvZyBLbGFzc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmt0aW9uYWxpdOR0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgaXRlbSBmYWlsZWQhIFNlZSBTeXN0ZW0gTG9nIGZvciBkZXRhaWxzLid9ID0gJ0hpbnp1ZvxnZW4gZGVzIG5ldWVuIEVpbnRyYWdzIGZlaGxnZXNjaGxhZ2VuISBJbSBTeXN0ZW0gTG9nIGZpbmRlbiBTaWUgd2VpdGVyZSBJbmZvcm1hdGlvbmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgaXRlbSBmYWlsZCEgU2VlIFN5c3RlbSBMb2cgZm9yIGRldGFpbHMuJ30gPSAnVXBkYXRlbiBkZXMgRWludHJhZ3MgZmVobGdlc2NobGFnZW4hIEltIFN5c3RlbSBMb2cgZmluZGVuIFNpZSB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4uJzsKfQoKMTs=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluR2VuZXJhbENhdGFsb2cucG0gLSBhZG1pbiBmcm9udGVuZCBvZiBnZW5lcmFsIGNhdGFsb2cgbWFuYWdlbWVudAojIENvcHlyaWdodCAoQykgMjAwMy0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBZG1pbkdlbmVyYWxDYXRhbG9nLnBtLHYgMS4zIDIwMDcvMDMvMjAgMTA6Mzc6MTkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4zICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGdldCBjb21tb24gb3BqZWN0cwogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgIyBjaGVjayBhbGwgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgIGlmICghJFNlbGYtPnskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBsaXN0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdJdGVtTGlzdCcpIHsKICAgICAgICBteSAkQ2xhc3MgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkNsYXNzIikgfHwgJyc7CiAgICAgICAgIyBjaGVjayBuZWVkZWQgQ2xhc3MKICAgICAgICBpZiAoISRDbGFzcykgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgb3V0cHV0IGVycm9yIG5vdGlmeQogICAgICAgIGlmICgkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkVycm9yQWRkIikpIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICckVGV4dHsiQWRkIG5ldyBpdGVtIGZhaWxlZCEgU2VlIFN5c3RlbSBMb2cgZm9yIGRldGFpbHMuIn0nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJFcnJvclVwZGF0ZSIpKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgRGF0YSA9PiAnJFRleHR7IlVwZGF0ZSBpdGVtIGZhaWxkISBTZWUgU3lzdGVtIExvZyBmb3IgZGV0YWlscy4ifScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICMgZ2V0IGNhdGFsb2cgY2xhc3MgbGlzdAogICAgICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NMaXN0KCk7CiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSA9PiAkQ2xhc3NMaXN0LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRDbGFzcywKICAgICAgICApOwogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAjIGdldCBhdmFpbGFiaWxpdHkgbGlzdAogICAgICAgIG15ICRWYWxpZFJlZiA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5WYWxpZExpc3QoKTsKICAgICAgICAjIGdldCBjYXRhbG9nIGl0ZW0gbGlzdAogICAgICAgIG15ICRJdGVtSURMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFZhbGlkID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENzc0NsYXNzOwogICAgICAgIGZvcmVhY2ggbXkgJEl0ZW1JRCAoc29ydCB7JEl0ZW1JRExpc3QtPnskYX0gY21wICRJdGVtSURMaXN0LT57JGJ9fSBrZXlzICV7JEl0ZW1JRExpc3R9KSB7CiAgICAgICAgICAgICMgZ2V0IGl0ZW0gZGF0YQogICAgICAgICAgICBteSAkSXRlbURhdGEgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICAgICApOwogICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgaWYgKCRDc3NDbGFzcyAmJiAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScpIHsKICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0l0ZW1MaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JEl0ZW1EYXRhfSwKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiAkSXRlbURhdGEtPntGdW5jdGlvbmFsaXR5fSB8fCAnLScsCiAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gJFZhbGlkUmVmLT57JEl0ZW1EYXRhLT57VmFsaWRJRH19LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRhbG9nIGl0ZW0gZWRpdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbUVkaXQnKSB7CiAgICAgICAgbXkgJUl0ZW1EYXRhOwogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICRJdGVtRGF0YXtJdGVtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJJdGVtSUQiKTsKICAgICAgICBpZiAoJEl0ZW1EYXRhe0l0ZW1JRH0gZXEgJ05FVycpIHsKICAgICAgICAgICAgJEl0ZW1EYXRhe05hbWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJOYW1lIik7CiAgICAgICAgICAgICRJdGVtRGF0YXtDbGFzc30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkNsYXNzIik7CiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcKICAgICAgICAgICAgaWYgKCEkSXRlbURhdGF7TmFtZX0gfHwgISRJdGVtRGF0YXtDbGFzc30pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRJdGVtRGF0YVJlZiA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRJdGVtRGF0YXtJdGVtSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAlSXRlbURhdGEgPSAleyRJdGVtRGF0YVJlZn07CiAgICAgICAgfQogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgZ2V0IGNhdGFsb2cgY2xhc3MgbGlzdAogICAgICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NMaXN0KCk7CiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSA9PiAkQ2xhc3NMaXN0LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRJdGVtRGF0YXtDbGFzc30sCiAgICAgICAgKTsKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzc09wdGlvblN0cmcgPT4gJENsYXNzT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICMgZ2VuZXJhdGUgRnVuY3Rpb25hbGl0eU9wdGlvblN0cmcKICAgICAgICBteSAkRnVuY3Rpb25hbGl0eVJlZiA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5GdW5jdGlvbmFsaXR5TGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW1EYXRhe0NsYXNzfSwKICAgICAgICApOwogICAgICAgIG15ICRGdW5jdGlvbmFsaXR5T3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgPT4gJ0Z1bmN0aW9uYWxpdHknLAogICAgICAgICAgICBEYXRhID0+ICRGdW5jdGlvbmFsaXR5UmVmLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkSXRlbURhdGF7RnVuY3Rpb25hbGl0eX0gfHwgJycsCiAgICAgICAgKTsKICAgICAgICAjIGdlbmVyYXRlIFZhbGlkT3B0aW9uU3RyZwogICAgICAgIG15ICRWYWxpZFJlZiA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5WYWxpZExpc3QoKTsKICAgICAgICBteSAkVmFsaWREZWZhdWx0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPlZhbGlkTG9va3VwKAogICAgICAgICAgICBOYW1lID0+ICd2YWxpZCcsCiAgICAgICAgKTsKICAgICAgICBteSAkVmFsaWRPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSA9PiAnVmFsaWRJRCcsCiAgICAgICAgICAgIERhdGEgPT4gJFZhbGlkUmVmLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRJdGVtRGF0YXtWYWxpZElEfSB8fCAkVmFsaWREZWZhdWx0LT57VmFsaWRJRH0sCiAgICAgICAgKTsKICAgICAgICAjIG91dHB1dCBJdGVtRWRpdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1FZGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlSXRlbURhdGEsCiAgICAgICAgICAgICAgICBGdW5jdGlvbmFsaXR5T3B0aW9uU3RyZyA9PiAkRnVuY3Rpb25hbGl0eU9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBWYWxpZE9wdGlvblN0cmcgPT4gJFZhbGlkT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5HZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2F0YWxvZyBpdGVtIHNhdmUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0l0ZW1TYXZlJykgewogICAgICAgIG15ICRFcnJvck5vdGlmeSA9ICcnOwogICAgICAgIG15ICVJdGVtRGF0YTsKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBmb3JlYWNoIChxdyhDbGFzcyBJdGVtSUQgTmFtZSBGdW5jdGlvbmFsaXR5IFZhbGlkSUQgQ29tbWVudCkpIHsKICAgICAgICAgICAgJEl0ZW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiJF8iKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgIyBzYXZlIHRvIGRhdGFiYXNlCiAgICAgICAgaWYgKCRJdGVtRGF0YXtJdGVtSUR9IGVxICdORVcnKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgICAgICAgICAlSXRlbURhdGEsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoISRTdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAkRXJyb3JOb3RpZnkgLj0gIiZFcnJvckFkZD0xIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbVVwZGF0ZSgKICAgICAgICAgICAgICAgICVJdGVtRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICghJFN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICRFcnJvck5vdGlmeSAuPSAiJkVycm9yVXBkYXRlPTEiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcgY2xhc3MgbGlzdAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249SXRlbUxpc3QmQ2xhc3M9JEl0ZW1EYXRhe0NsYXNzfSRFcnJvck5vdGlmeSIsCiAgICAgICAgKTsKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBnZXQgY2F0YWxvZyBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc0xpc3QoKTsKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSA9PiAnQ2xhc3MnLAogICAgICAgICAgICBEYXRhID0+ICRDbGFzc0xpc3QsCiAgICAgICAgKTsKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzc09wdGlvblN0cmcgPT4gJENsYXNzT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Q2xhc3MnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICRDc3NDbGFzczsKICAgICAgICBmb3JlYWNoIG15ICRDbGFzcyAoQHskQ2xhc3NMaXN0fSkgewogICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgaWYgKCRDc3NDbGFzcyAmJiAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScpIHsKICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0NsYXNzTGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgoxOw==
IyAtLQojIEFkbWluR2VuZXJhbENhdGFsb2cuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbkdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFkbWluR2VuZXJhbENhdGFsb2cuZHRsLHYgMS4xLjEuMSAyMDA3LzAyLzIzIDE1OjM5OjAwIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iMzAlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9Ikl0ZW1FZGl0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSJORVciPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkFkZCJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik5hbWUifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIHNpemU9IjI1IiBtYXhsZW5ndGg9IjEwMCI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGFsb2cgQ2xhc3MifTo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNsYXNzT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJBZGQifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgIDwvdGQ+CiAgICA8dGQgd2lkdGg9IjcwJSIgY2xhc3M9Im1haW5ib2R5Ij4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzcyAtLT4KICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJMaXN0In06PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI2MCUiPiRUZXh0eyJDYXRhbG9nIENsYXNzIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Q2xhc3NMaXN0IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249SXRlbUxpc3QmQ2xhc3M9JExRRGF0YXsiQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiQ2xhc3MifQogICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Q2xhc3NMaXN0IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0NsYXNzIC0tPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0l0ZW0gLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiTGlzdCJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iNjAlIj4kUURhdGF7IkNsYXNzIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiBhbGlnbj0iY2VudGVyIj4kVGV4dHsiRnVuY3Rpb25hbGl0eSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgYWxpZ249ImNlbnRlciI+JFRleHR7IlZhbGlkIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbUxpc3QgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1JdGVtRWRpdCZJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSIgYWxpZ249ImNlbnRlciI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiRnVuY3Rpb25hbGl0eSJ9CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iIGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJWYWxpZCJ9In0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdJdGVtTGlzdCAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdCAtLT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJJdGVtU2F2ZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3MiIHZhbHVlPSIkUURhdGF7IkNsYXNzIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9IiRRRGF0YXsiSXRlbUlEIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ikl0ZW0ifSAkVGV4dHsiRWRpdCJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYXRhbG9nIENsYXNzIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkNsYXNzIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTmFtZSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIHZhbHVlPSIkUURhdGF7Ik5hbWUifSIgc2l6ZT0iNDUiIG1heGxlbmd0aD0iMTAwIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZ1bmN0aW9uYWxpdHkifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJGdW5jdGlvbmFsaXR5T3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlZhbGlkIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiVmFsaWRPcHRpb25TdHJnIn08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIHZhbHVlPSIkUURhdGF7IkNvbW1lbnQifSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iMjAwIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXQgLS0+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cucG0gLSBhbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMy0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBHZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMyAyMDA3LzAyLzI3IDIwOjA5OjAwIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4zICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nIC0gZ2VuZXJhbCBjYXRhbG9nIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ID0+ICREQk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENsYXNzTGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIG9mIGFsbCBnZW5lcmFsIGNhdGFsb2cgY2xhc3NlcwoKICAgIG15ICRMaXN0UmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5DbGFzc0xpc3QoKTsKCj1jdXQKCnN1YiBDbGFzc0xpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgQENsYXNzTGlzdDsKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBESVNUSU5DVChjbGFzcykgRlJPTSBnZW5lcmFsX2NhdGFsb2cgT1JERVIgQlkgY2xhc3MiLAogICAgKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIHB1c2goQENsYXNzTGlzdCwgJFJvd1swXSk7CiAgICB9CiAgICByZXR1cm4gXEBDbGFzc0xpc3Q7Cn0KCj1pdGVtIEl0ZW1MaXN0KCkKCnJldHVybiBhIGxpc3QgYXMgaGFzaCByZWZlcmVuY2Ugb2Ygb25lIGdlbmVyYWwgY2F0YWxvZyBjbGFzcwoKICAgIG15ICRMaXN0UmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KENsYXNzKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCFkZWZpbmVkKCRQYXJhbXtWYWxpZH0pKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkfSA9IDE7CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgIG15ICVEYXRhID0gKCk7CiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgbmFtZSBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBjbGFzcyA9ICckUGFyYW17Q2xhc3N9JyAiOwogICAgaWYgKCRQYXJhbXtWYWxpZH0pIHsKICAgICAgICAkU1FMIC49ICJBTkQgdmFsaWRfaWQgPSAxIjsKICAgIH0KICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICREYXRheyRSb3dbMF19ID0gJFJvd1sxXTsKICAgIH0KICAgIHJldHVybiBcJURhdGE7Cn0KCj1pdGVtIEZ1bmN0aW9uYWxpdHlMaXN0KCkKCnJldHVybiBhbiBoYXNoIHJlZmVyZW5jZSBvZiBhbGwgZnVuY3Rpb25hbGl0aWVzIG9mIGEgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCgogICAgbXkgJExpc3RSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkZ1bmN0aW9uYWxpdHlMaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICk7Cgo9Y3V0CgpzdWIgRnVuY3Rpb25hbGl0eUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJUZ1bmN0aW9uYWxpdHlMaXN0OwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KENsYXNzKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIERJU1RJTkNUKGZ1bmN0aW9uYWxpdHkpIEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGNsYXNzID0gJyRQYXJhbXtDbGFzc30nIE9SREVSIEJZIGZ1bmN0aW9uYWxpdHkiLAogICAgKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRGdW5jdGlvbmFsaXR5TGlzdHskUm93WzBdfSA9ICRSb3dbMF07CiAgICB9CiAgICBkZWxldGUoJEZ1bmN0aW9uYWxpdHlMaXN0eycnfSk7CgogICAgcmV0dXJuIFwlRnVuY3Rpb25hbGl0eUxpc3Q7Cn0KCj1pdGVtIEl0ZW1HZXQoKQoKZ2V0IGEgZ2VuZXJhbCBjYXRhbG9nIGl0ZW0KClJldHVybgogICAgJEl0ZW1EYXRhe0l0ZW1JRH0KICAgICRJdGVtRGF0YXtDbGFzc30KICAgICRJdGVtRGF0YXtOYW1lfQogICAgJEl0ZW1EYXRhe0Z1bmN0aW9uYWxpdHl9CiAgICAkSXRlbURhdGF7VmFsaWRJRH0KICAgICRJdGVtRGF0YXtDb21tZW50fQogICAgJEl0ZW1EYXRhe0NyZWF0ZVRpbWV9CiAgICAkSXRlbURhdGF7Q3JlYXRlQnl9CiAgICAkSXRlbURhdGF7Q2hhbmdlVGltZX0KICAgICRJdGVtRGF0YXtDaGFuZ2VCeX0KCiAgICBteSAkSXRlbURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgSXRlbUlEID0+IDMsCiAgICApOwoKPWN1dAoKc3ViIEl0ZW1HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgYXNrIGRhdGFiYXNlCiAgICBteSAlSXRlbURhdGEgPSAoKTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkLCBjbGFzcywgbmFtZSwgZnVuY3Rpb25hbGl0eSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAiLgogICAgICAgICAgICAiY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBpZCA9ICRQYXJhbXtJdGVtSUR9IiwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRJdGVtRGF0YXtJdGVtSUR9ID0gJFJvd1swXTsKICAgICAgICAkSXRlbURhdGF7Q2xhc3N9ID0gJFJvd1sxXTsKICAgICAgICAkSXRlbURhdGF7TmFtZX0gPSAkUm93WzJdOwogICAgICAgICRJdGVtRGF0YXtGdW5jdGlvbmFsaXR5fSA9ICRSb3dbM10gfHwgJyc7CiAgICAgICAgJEl0ZW1EYXRhe1ZhbGlkSUR9ID0gJFJvd1s0XTsKICAgICAgICAkSXRlbURhdGF7Q29tbWVudH0gPSAkUm93WzVdIHx8ICcnOwogICAgICAgICRJdGVtRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNl07CiAgICAgICAgJEl0ZW1EYXRhe0NyZWF0ZUJ5fSA9ICRSb3dbN107CiAgICAgICAgJEl0ZW1EYXRhe0NoYW5nZVRpbWV9ID0gJFJvd1s4XTsKICAgICAgICAkSXRlbURhdGF7Q2hhbmdlQnl9ID0gJFJvd1s5XTsKICAgIH0KICAgIHJldHVybiBcJUl0ZW1EYXRhOwp9Cgo9aXRlbSBJdGVtQWRkKCkKCmFkZCBhIG5ldyBnZW5lcmFsIGNhdGFsb2cgaXRlbQoKICAgIG15ICRUcnVlID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtQWRkKAogICAgICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICBOYW1lID0+ICdJdGVtIE5hbWUnLAogICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ0Z1bmMzJywgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIENvbW1lbnQgPT4gJ0NvbW1lbnQnLCAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEl0ZW1BZGQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KENsYXNzIE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhDbGFzcyBOYW1lIEZ1bmN0aW9uYWxpdHkgQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBmaW5kIGV4aXRpbmcgaXRlbSB3aXRoIHNhbWUgbmFtZQogICAgbXkgJE5vQWRkOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgV0hFUkUgbmFtZSA9ICckUGFyYW17TmFtZX0nIEFORCBjbGFzcyA9ICckUGFyYW17Q2xhc3N9JyIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CiAgICB3aGlsZSAoJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICROb0FkZCA9IDE7CiAgICB9CiAgICAjIGFkZCBpdGVtCiAgICBteSAkUmV0dXJuOwogICAgaWYgKCEkTm9BZGQpIHsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiJJTlNFUlQgSU5UTyBnZW5lcmFsX2NhdGFsb2cgIi4KICAgICAgICAgICAgICAgICIoY2xhc3MsIG5hbWUsIGZ1bmN0aW9uYWxpdHksIHZhbGlkX2lkLCBjb21tZW50cywgIi4KICAgICAgICAgICAgICAgICJjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSBWQUxVRVMgIi4KICAgICAgICAgICAgICAgICIoJyRQYXJhbXtDbGFzc30nLCAnJFBhcmFte05hbWV9JywgJyRQYXJhbXtGdW5jdGlvbmFsaXR5fScsICRQYXJhbXtWYWxpZElEfSwgJyRQYXJhbXtDb21tZW50fScsICIuCiAgICAgICAgICAgICAgICAiY3VycmVudF90aW1lc3RhbXAsICRQYXJhbXtVc2VySUR9LCBjdXJyZW50X3RpbWVzdGFtcCwgJFBhcmFte1VzZXJJRH0pIiwKICAgICAgICApOwogICAgICAgICRSZXR1cm4gPSAxOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IGFkZCBuZXcgaXRlbSEgR2VuZXJhbCBjYXRhbG9nIGl0ZW0gd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBjbGFzcy4iLAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gJFJldHVybjsKfQoKPWl0ZW0gSXRlbVVwZGF0ZSgpCgp1cGRhdGUgYSBleGlzdGluZyBnZW5lcmFsIGNhdGFsb2cgaXRlbQoKICAgIG15ICRUcnVlID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtVXBkYXRlKAogICAgICAgIEl0ZW1JRCA9PiAxMjMsCiAgICAgICAgTmFtZSA9PiAnSXRlbSBOYW1lJywKICAgICAgICBGdW5jdGlvbmFsaXR5ID0+ICdGdW5jMycsICAjIChvcHRpb25hbCkKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgQ29tbWVudCA9PiAnQ29tbWVudCcsICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEl0ZW1VcGRhdGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCBOYW1lIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoTmFtZSBGdW5jdGlvbmFsaXR5IENvbW1lbnQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KEl0ZW1JRCBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIGdldCBjbGFzcyBvZiBpdGVtCiAgICBteSAkQ2xhc3M7CiAgICBteSAkT2xkRnVuY3Rpb25hbGl0eTsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGNsYXNzLCBmdW5jdGlvbmFsaXR5IEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGlkID0gJFBhcmFte0l0ZW1JRH0iLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJENsYXNzID0gJFJvd1swXSB8fCAnJzsKICAgICAgICAkT2xkRnVuY3Rpb25hbGl0eSA9ICRSb3dbMV0gfHwgJyc7CiAgICB9CiAgICAjIGZpbmQgZXhpdGluZyBpdGVtIHdpdGggc2FtZSBuYW1lCiAgICBteSAkVXBkYXRlOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgV0hFUkUgbmFtZSA9ICckUGFyYW17TmFtZX0nIEFORCBjbGFzcyA9ICckQ2xhc3MnIiwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIGlmICgkUGFyYW17SXRlbUlEfSBlcSAkUm93WzBdKSB7CiAgICAgICAgICAgICRVcGRhdGUgPSAxOwogICAgICAgIH0KICAgIH0KICAgICMgY291bnQgZnVuY3Rpb25hbGl0eQogICAgaWYgKCRPbGRGdW5jdGlvbmFsaXR5KSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIENPVU5UKGZ1bmN0aW9uYWxpdHkpIEZST00gZ2VuZXJhbF9jYXRhbG9nICIuCiAgICAgICAgICAgICAgICAiV0hFUkUgY2xhc3MgPSAnJENsYXNzJyBBTkQgZnVuY3Rpb25hbGl0eSA9ICckT2xkRnVuY3Rpb25hbGl0eSciLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJExhc3RGdW5jdGlvbmFsaXR5ID0gMTsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgaWYgKCRSb3dbMF0gPiAxIHx8ICRQYXJhbXtGdW5jdGlvbmFsaXR5fSBlcSAkT2xkRnVuY3Rpb25hbGl0eSkgewogICAgICAgICAgICAgICAgJExhc3RGdW5jdGlvbmFsaXR5ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJExhc3RGdW5jdGlvbmFsaXR5KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IHVwZGF0ZSBpdGVtISBUaGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIGl0ZW0gaXMgdGhlIGxhc3QgaW4gdGhpcyBjbGFzcy4iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyB1cGRhdGUgaXRlbQogICAgaWYgKCRVcGRhdGUgJiYgJENsYXNzKSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIlVQREFURSBnZW5lcmFsX2NhdGFsb2cgU0VUIG5hbWUgPSAnJFBhcmFte05hbWV9JywgZnVuY3Rpb25hbGl0eSA9ICckUGFyYW17RnVuY3Rpb25hbGl0eX0nLCIuCiAgICAgICAgICAgICAgICAidmFsaWRfaWQgPSAkUGFyYW17VmFsaWRJRH0sIGNvbW1lbnRzID0gJyRQYXJhbXtDb21tZW50fScsICIuCiAgICAgICAgICAgICAgICAiY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gJFBhcmFte1VzZXJJRH0gV0hFUkUgaWQgPSAkUGFyYW17SXRlbUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+ICJDYW4ndCB1cGRhdGUgaXRlbSEgR2VuZXJhbCBjYXRhbG9nIGl0ZW0gd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBjbGFzcy4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQp9Cgo9aXRlbSBWYWxpZExvb2t1cCgpCgpyZXR1cm4gYSBoYXNoIHJlZmVyZW5jZSBvZiBhbGwgZ2VuZXJhbCBjYXRhbG9nIGF2YWlsYWJpbGl0aWVzCgpSZXR1cm4KICAgICRWYWxpZHtWYWxpZElEfQogICAgJFZhbGlke05hbWV9CgogICAgbXkgJFZhbGlkUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5WYWxpZExvb2t1cCgKICAgICAgICBWYWxpZElEID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFZhbGlkUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5WYWxpZExvb2t1cCgKICAgICAgICBOYW1lID0+ICd2YWxpZCcsCiAgICApOwoKPWN1dAoKc3ViIFZhbGlkTG9va3VwIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICVWYWxpZDsKICAgIGlmICghJFBhcmFte1ZhbGlkSUR9ICYmICEkUGFyYW17TmFtZX0pIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkIFZhbGlkSUQgb3IgTmFtZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAjIGdldCB2YWxpZCBsaXN0CiAgICBteSAkVmFsaWRMaXN0UmVmID0gJFNlbGYtPlZhbGlkTGlzdCgpOwogICAgaWYgKCRQYXJhbXtWYWxpZElEfSkgewogICAgICAgICRWYWxpZHtWYWxpZElEfSA9ICRQYXJhbXtWYWxpZElEfTsKICAgICAgICAkVmFsaWR7TmFtZX0gPSAkVmFsaWRMaXN0UmVmLT57VmFsaWRJRH07CiAgICB9CiAgICBlbHNpZiAoJFBhcmFte05hbWV9KSB7CiAgICAgICAgbXkgJVZhbGlkUmV2ZXJzZSA9IHJldmVyc2UoJXskVmFsaWRMaXN0UmVmfSk7CiAgICAgICAgJFZhbGlke1ZhbGlkSUR9ID0gJFZhbGlkUmV2ZXJzZXskUGFyYW17TmFtZX19OwogICAgICAgICRWYWxpZHtOYW1lfSA9ICRQYXJhbXtOYW1lfTsKICAgIH0KICAgIHJldHVybiBcJVZhbGlkOwp9Cgo9aXRlbSBWYWxpZExpc3QoKQoKcmV0dXJuIGEgaGFzaCByZWZlcmVuY2Ugb2YgYWxsIGdlbmVyYWwgY2F0YWxvZyBhdmFpbGFiaWxpdGllcwoKICAgIG15ICRMaXN0UmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5WYWxpZExpc3QoKTsKCj1jdXQKCnN1YiBWYWxpZExpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJVZhbGlkTGlzdDsKCiAgICAkVmFsaWRMaXN0eycxJ30gPSAndmFsaWQnOwogICAgJFZhbGlkTGlzdHsnMid9ID0gJ2ludmFsaWQnOwogICAgJFZhbGlkTGlzdHsnMyd9ID0gJ2ludmFsaWQtdGVtcG9yYXJpbHknOwoKICAgIHJldHVybiBcJVZhbGlkTGlzdDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAwNy8wMi8yNyAyMDowOTowMCAkCgo9Y3V0