Support
0.0.3
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Fixed xml and formatting bug.
Init release.
A admin support tool.
Ein Admin Support Tool.
2.2
2007-05-08 10:03:55
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8Q1ZTPiRJZDogU3VwcG9ydC54bWwsdiAxLjEuMS4xIDIwMDcvMDUvMDcgMTg6NDc6NTUgc3IgRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pblN1cHBvcnQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5TeXN0ZW1TdGF0dXMgb2JqZWN0ICBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFkbWluU3lzdGVtU3RhdHVzLU9iamVrdHMgaW0gQWRtaW4tQmVyZWljaC48L0Rlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1TdGF0dXM8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxUaXRsZT5TdXBwb3J0IEluZm88L1RpdGxlPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbi1TdXBwb3J0IE92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlN1cHBvcnQ8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkJsb2NrNDwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MjAwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluU3VwcG9ydC5wbSAtIHNob3cgc3VwcG9ydCBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pblN1cHBvcnQucG0sdiAxLjIgMjAwNy8wNS8wOCAwNzo1MDoxOSBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pblN1cHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBPYmplY3RzCiAgICBmb3JlYWNoIChxdyhQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoISRTZWxmLT57JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIik7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntTdXBwb3J0T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0LT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJENvbmZpZ0hhc2ggPSB7fTsKCiAgICAjIGNyZWF0ZSBjb25maWcgaGFzaCByZWZlcmVuY2UKICAgICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPlN1cHBvcnRDb25maWdIYXNoR2V0KAogICAgICAgIENvbmZpZ0hhc2ggPT4gJENvbmZpZ0hhc2gsCiAgICApOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgR2V0IHJlcXVpcmVkIGluZm9ybWF0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnR2V0UmVxdWlyZWRJbmZvJykgewogICAgICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1JlcXVpcmVkJywKICAgICAgICApOwogICAgICAgICMgZmlyc3QgbGV2ZWwgSGFzaHJlZiAoZWFjaCBtb2R1bGUgbmFtZSkKICAgICAgICBmb3JlYWNoIG15ICRDb25maWdNb2R1bGUgKHNvcnQga2V5cyAleyRDb25maWdIYXNofSkgewogICAgICAgICAgICBpZiAoISRDb25maWdIYXNoLT57JENvbmZpZ01vZHVsZX0tPlswXSkgewogICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVxdWlyZWRJbmZvJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENvbmZpZ01vZHVsZSA9PiAkQ29uZmlnTW9kdWxlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBzZWNvbmQgbGV2ZWwgYXJyYXkgcmVmZXJlbmNlIChlYWNoIG1vZHVsZSkKICAgICAgICAgICAgZm9yZWFjaCBteSAkQ29uZmlnSGFzaFJvdyAoQHskQ29uZmlnSGFzaC0+eyRDb25maWdNb2R1bGV9fSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXF1aXJlZEluZm9Sb3cnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICMgY3JlYXRlIGEgbmV3IHRleHRmaWVsZAogICAgICAgICAgICAgICAgaWYgKCRDb25maWdIYXNoUm93LT57SW5wdXR9LT57VHlwZX0gZXEgIlRleHQiKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVxdWlyZWRJbmZvUm93VGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICRDb25maWdNb2R1bGUgLiAnOjonIC4gJENvbmZpZ0hhc2hSb3ctPntLZXl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkQ29uZmlnSGFzaFJvdy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJENvbmZpZ0hhc2hSb3ctPntWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplID0+ICRDb25maWdIYXNoUm93LT57SW5wdXR9LT57U2l6ZX0gfHwgJzQwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRDb25maWdIYXNoUm93LT57RGVzY3JpcHRpb259IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBhIG5ldyBkcm9wZG93biBmaWVsZAogICAgICAgICAgICAgICAgZWxzaWYgKCRDb25maWdIYXNoUm93LT57SW5wdXR9LT57VHlwZX0gZXEgIlNlbGVjdCIpIHsKICAgICAgICAgICAgICAgICAgICBteSAkU2VsZWN0U3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJENvbmZpZ0hhc2hSb3ctPntJbnB1dH0tPntEYXRhfSB8fCB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkQ29uZmlnTW9kdWxlIC4gJzo6JyAuICRDb25maWdIYXNoUm93LT57S2V5fSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlcXVpcmVkSW5mb1Jvd1NlbGVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkQ29uZmlnSGFzaFJvdy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJENvbmZpZ0hhc2hSb3ctPntEZXNjcmlwdGlvbn0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RTdHJnID0+ICRTZWxlY3RTdHJnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIENvbmZpZGVudGlhbCBhbmQgU3VwcG9ydElECiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ29uZmlkZW50aWFsJykgewogICAgICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NvbmZpZGVudGlhbCcsCiAgICAgICAgKTsKICAgICAgICAjIGNyZWF0ZSBoaWRkZW4gZmllbGRzLCBjYXVzZSB3ZSBuZWVkIHRoZSBpbmZvcm1hdGlvbiBhZ2Fpbi4KICAgICAgICBmb3JlYWNoIG15ICRDb25maWdNb2R1bGUgKGtleXMgJXskQ29uZmlnSGFzaH0pIHsKICAgICAgICAgICAgZm9yZWFjaCBteSAkQ29uZmlnSGFzaFJvdyAoQHskQ29uZmlnSGFzaC0+eyRDb25maWdNb2R1bGV9fSkgewogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRDb25maWdNb2R1bGUgLiAnOjonIC4gJENvbmZpZ0hhc2hSb3ctPntLZXl9KTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NvbmZpZGVudGlhbEhpZGRlbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJENvbmZpZ01vZHVsZSAuICc6OicgLiAkQ29uZmlnSGFzaFJvdy0+e0tleX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSB8fCAnJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIFVwbG9hZFN1cHBvcnRJbmZvCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVXBsb2FkU3VwcG9ydEluZm8nKSB7CiAgICAgICAgbXkgJERhdGFIYXNoID0ge307CiAgICAgICAgbXkgJElucHV0SGFzaCA9IHt9OwoKICAgICAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDb25maWRlbnRpYWwnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGhpZGRlbiBmaWVsZHMsIGNhdXNlIHdlIG5lZWQgdGhlIGluZm9ybWF0aW9uIGFnYWluLgogICAgICAgIGZvcmVhY2ggbXkgJENvbmZpZ01vZHVsZSAoa2V5cyAleyRDb25maWdIYXNofSkgewogICAgICAgICAgICBteSAkTW9kdWxlSW5wdXREYXRhID0ge307CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJENvbmZpZ0hhc2hSb3cgKEB7JENvbmZpZ0hhc2gtPnskQ29uZmlnTW9kdWxlfX0pIHsKICAgICAgICAgICAgICAgICRNb2R1bGVJbnB1dERhdGEtPnskQ29uZmlnSGFzaFJvdy0+e0tleX19ID0KICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJENvbmZpZ01vZHVsZSAuICc6OicgLiAkQ29uZmlnSGFzaFJvdy0+e0tleX0pIHx8ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRJbnB1dEhhc2gtPnskQ29uZmlnTW9kdWxlfSA9ICRNb2R1bGVJbnB1dERhdGE7CiAgICAgICAgfQogICAgICAgICMgY3JlYXRlIGRhdGEgaGFzaCByZWZlcmVuY2UKICAgICAgICAkU2VsZi0+e1N1cHBvcnRPYmplY3R9LT5TdXBwb3J0SW5mb0dldCgKICAgICAgICAgICAgRGF0YUhhc2ggPT4gJERhdGFIYXNoLAogICAgICAgICAgICBJbnB1dEhhc2ggPT4gJElucHV0SGFzaCwKICAgICAgICApOwoKICAgICAgICBteSAkWE1MU3RyaW5nID0gJFNlbGYtPntTdXBwb3J0T2JqZWN0fS0+WE1MU3RyaW5nQ3JlYXRlKAogICAgICAgICAgICBEYXRhSGFzaCA9PiAkRGF0YUhhc2gsCiAgICAgICAgKTsKICAgICAgICAjIGlmIHRoZSBidXR0b24gc2VuZCBiZWNvbWVzIHRoZSBzdWJtaXQKICAgICAgICBpZiAoJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTZW5kIikpIHsKICAgICAgICAgICAgbXkgJFNlbmRNZXNzYWdlOwogICAgICAgICAgICBpZiAobGVuZ3RoKCRYTUxTdHJpbmcpIDwgOTk2MTQ3MikgewogICAgICAgICAgICAgICAgIyBzZW5kIGluZm8gdG8gKChvdHJzKSkKICAgICAgICAgICAgICAgICRTZW5kTWVzc2FnZSA9ICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPlN1cHBvcnRTZW5kSW5mbygKICAgICAgICAgICAgICAgICAgICBYTUxTdHJpbmcgPT4gJFhNTFN0cmluZywKICAgICAgICAgICAgICAgICAgICBTdXBwb3J0SUQgPT4gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXBwb3J0SUQiKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICd3YXJuaW5nJywKICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRTZW5kTWVzc2FnZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICd3YXJuaW5nJywKICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICdDYW5cJ3Qgc2VuZCBlbWFpbCB0byB0aGUgKChvdHJzKSkgc3VwcG9ydCB0ZWFtIScuIlxuXG4iLgogICAgICAgICAgICAgICAgICAgICAgICAiWW91IHdpbGwgZm91bmQgdGhlIG90cnMgc3lzdGVtIGluZm9ybWF0aW9uIHBhY2thZ2UgYXRcbiIuCiAgICAgICAgICAgICAgICAgICAgICAgICJJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgT1RSUyBzdXBwb3J0IHNlcnZpY2VzIHBsZWFzZSBzZW5kIHRoZSBwYWNrYWdlIHRvIHN1cHBvcnRcQG90cnMuY29tIG9yIGNhbGxcbiIuCiAgICAgICAgICAgICAgICAgICAgICAgICJvdXIgc3VwcG9ydCB0ZWFtIHBlciBwaG9uZSB0byByZXZpZXcgdGhlIG5leHQgc3RlcFxuXG4iLgogICAgICAgICAgICAgICAgICAgICAgICAiIE1vcmUgYWJvdXQgT1RSUyBzdXBwb3J0IG9yIGZhY2UtdG8tZmFjZSBjb250YWN0IGluZm9ybWF0aW9uIHlvdSB3aWxsIGZvdW5kIGF0XG4iLgogICAgICAgICAgICAgICAgICAgICAgICAnaHR0cDovL3d3dy5vdHJzLmNvbS8nLiJcblxuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIyBpZiB0aGUgYnV0dG9uIGRvd25sb2FkIGJlY29tZXMgdGhlIHN1Ym1pdAogICAgICAgIGVsc2lmICgkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkRvd25sb2FkIikpIHsKICAgICAgICAgICAgbXkgKCRzLCRtLCRoLCAkRCwkTSwkWSwgJHdkLCR5ZCwkZHN0KSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRNID0gc3ByaW50ZigiJTAyZCIsICRNKTsKICAgICAgICAgICAgJEQgPSBzcHJpbnRmKCIlMDJkIiwgJEQpOwogICAgICAgICAgICAkaCA9IHNwcmludGYoIiUwMmQiLCAkaCk7CiAgICAgICAgICAgICRtID0gc3ByaW50ZigiJTAyZCIsICRtKTsKICAgICAgICAgICAgIyByZXR1cm4gZmlsZQogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRYTUxTdHJpbmcsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSA9PiAiU3VwcG9ydEluZm8iLiJfIi4iJFktJE0tJEQiLiJfJGgtJG0ucG0iLAogICAgICAgICAgICAgICAgVHlwZSA9PiAnYXR0YWNoZWQnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzZSB7CiAgICAgICAgbXkgJERhdGFIYXNoID0ge307CiAgICAgICAgIyBjcmVhdGUgZGF0YSBoYXNoIHJlZmVyZW5jZQogICAgICAgICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPkFkbWluQ2hlY2tzR2V0KAogICAgICAgICAgICBEYXRhSGFzaCA9PiAkRGF0YUhhc2gsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICk7CgogICAgICAgIGZvcmVhY2ggbXkgJE1vZHVsZSAoc29ydCBrZXlzICV7JERhdGFIYXNofSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdNb2R1bGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlID0+ICRNb2R1bGUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAjIGNoZWNrIGNzcyByb3RhdG9yeQogICAgICAgICAgICBteSAkQ3NzQ2xhc3M7CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJFJvd0hhc2ggKEB7JERhdGFIYXNoLT57JE1vZHVsZX19KSB7CiAgICAgICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgICAgIGlmICgkQ3NzQ2xhc3MgJiYgJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnKSB7CiAgICAgICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaGFjdGl2ZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkRm9udENvbG9yID0gInJlZCI7CiAgICAgICAgICAgICAgICBpZiAoJFJvd0hhc2gtPntDaGVja30gZXEgIk9LIikgewogICAgICAgICAgICAgICAgICAgICRGb250Q29sb3IgPSAiZ3JlZW4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRSb3dIYXNoLT57RGVzY3JpcHRpb259KSB7CiAgICAgICAgICAgICAgICAgICAgJFJvd0hhc2gtPntEZXNjcmlwdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJFJvd0hhc2gtPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+ICcxJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRSb3dIYXNoLT57Q29tbWVudH0pIHsKICAgICAgICAgICAgICAgICAgICAkUm93SGFzaC0+e0NvbW1lbnR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ID0+ICRSb3dIYXNoLT57Q29tbWVudH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+ICcxJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBjcmVhdGUgbmV3IGJsb2NrIHdpdGggcm90YXRvcnkgY3NzCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TW9kdWxlUm93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJXskUm93SGFzaH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgRm9udENvbG9yID0+ICRGb250Q29sb3IsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTs=
IyAtLQojIEFkbWluU3VwcG9ydC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFkbWluU3VwcG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pblN1cHBvcnQuZHRsLHYgMS4yIDIwMDcvMDUvMDggMDc6NTE6MTQgc3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JEVudnsiQm94MCJ9JFRleHR7IkFkbWluIFN1cHBvcnQgSW5mbyJ9JEVudnsiQm94MSJ9PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUdldFJlcXVpcmVkSW5mbyI+Q3JlYXRlIFN1cHBvcnQgUGFja2FnZTwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld01vZHVsZSAtLT4KICAgICAgPHRhYmxlIHdpZHRoPSI4MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFFEYXRheyJNb2R1bGUifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjI1MCI+JFRleHR7IkRlc2NyaXB0aW9uIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjUwIj4kVGV4dHsiQ2hlY2sifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGVSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiRRRGF0YXsiTmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kRGF0YXsiRGVzY3JpcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JERhdGF7IkNvbW1lbnQifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+PGZvbnQgY29sb3I9IiRRRGF0YXsiRm9udENvbG9yIn0iPiRRRGF0YXsiQ2hlY2sifTwvZm9udD48L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlUm93IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlIC0tPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZCAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JEVudnsiQm94MCJ9JFRleHR7IkFkbWluIFN1cHBvcnQgSW5mbyJ9JEVudnsiQm94MSJ9PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkNvbmZpZGVudGlhbCI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMHB4IiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZEluZm8gLS0+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0iY29udGVudGhlYWQiPiRRRGF0YXsiQ29uZmlnTW9kdWxlIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI4MDBweCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWRJbmZvUm93IC0tPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZEluZm9Sb3dUZXh0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyNSUiPiRRRGF0YXsiTmFtZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iMzUlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iJFFEYXRheyJLZXkifSIgdmFsdWU9IiRRRGF0YXsiVmFsdWUifSIgc2l6ZT0iJFFEYXRheyJTaXplIn0iPjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+ICgqICRRRGF0YXsiRGVzY3JpcHRpb24ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWRJbmZvUm93VGV4dCAtLT4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWRJbmZvUm93U2VsZWN0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyNSUiPiRRRGF0YXsiTmFtZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iMzUlIj4kRGF0YXsiU2VsZWN0U3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4gKCogJFFEYXRheyJEZXNjcmlwdGlvbiJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZEluZm9Sb3dTZWxlY3QgLS0+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkSW5mb1JvdyAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWRJbmZvIC0tPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiTmV4dC4uLiJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkIC0tPgo8IS0tIGR0bDpibG9jazpDb25maWRlbnRpYWwgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPiRFbnZ7IkJveDAifSRUZXh0eyJBZG1pbiBTdXBwb3J0IEluZm8ifSRFbnZ7IkJveDEifTwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJVcGxvYWRTdXBwb3J0SW5mbyI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMHB4IiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQ29uZmlkZW50aWFsIGluZm9ybWF0aW9uIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+Cgo8IS0tIGR0bDpibG9jazpDb25maWRlbnRpYWxIaWRkZW4gLS0+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJFFEYXRheyJOYW1lIn0iIHZhbHVlPSIkUURhdGF7IlZhbHVlIn0iPgo8IS0tIGR0bDpibG9jazpDb25maWRlbnRpYWxIaWRkZW4gLS0+CgogICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iODAwcHgiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IkNvbmZpZGVudGlhbCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiIGNvbHNwYW49IjIiPgogICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ29uZmlkZW50aWFsIiByb3dzPSI0IiBjb2xzPSI3OCI+CkFueSBhbmQgYWxsIGluZm9ybWF0aW9uIGRpc2Nsb3NlZCB0byBPVFJTIHdpbGwgYmUga2VwdCBzdHJpY3RseSBjb25maWRlbnRpYWwgYW5kIGFyZSBvbmx5IHVzZWQgZm9yIHByb3ZpZGluZyBiZXR0ZXIgc3VwcG9ydCBzZXJ2aWNlcyB0byBvdXIgY3VzdG9tZXJzLgogICAgICAgICAgICAgICAgICA8L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkNvbW1lcmNpYWwgc3VwcG9ydCJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IkNvbW1lcmNpYWwgc3VwcG9ydCBJRCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0iVGV4dCIgbmFtZT0iU3VwcG9ydElEIiB2YWx1ZT0iIiBzaXplPSI0MCI+PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4gKCogJFRleHR7ImlmIHlvdSBhcmUgYWxyZWFkeSBhIGNvbW1lcmNpYWwgc3VwcG9ydCBjdXN0b21lciwgcGxlYXNlIGFkZCB5b3VyIHN1cHBvcnQgaWQuIChub3QgcmVxdWlyZWQhKSJ9KTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJEb3dubG9hZCIgdmFsdWU9IiRUZXh0eyJEb3dubG9hZCJ9Ij4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTZW5kIiB2YWx1ZT0iJFRleHR7IlNlbmQifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpDb25maWRlbnRpYWwgLS0+Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFN1cHBvcnQucG0sdiAxLjMgMjAwNy8wNS8wOCAwNzo0ODoyMCBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7Cgp1c2Ugc3RyaWN0OwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW1haWw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMyAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0IC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN1cHBvcnQgaW5mb3JtYXRpb25zIHRvIGEgcnVubmluZyBPVFJTIHN5c3RlbS4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIFN1cHBvcnQgb2JqZWN0Cgp1c2UgS2VybmVsOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwpteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwpteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCik7CgokU3VwcG9ydE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0LT5uZXcoCiAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAopOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KICAgICRTZWxmLT57WE1MT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntEQk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgIE1haW5PYmplY3QgPT4gJFNlbGYtPntNYWluT2JqZWN0fSwKICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAoKICAgICk7CiAgICAkU2VsZi0+e1RpbWVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntFbWFpbE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RW1haWwtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgIE1haW5PYmplY3QgPT4gJFNlbGYtPntNYWluT2JqZWN0fSwKICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgIERCT2JqZWN0ID0+ICRTZWxmLT57REJPYmplY3R9LAogICAgICAgIFRpbWVPYmplY3QgPT4gJFNlbGYtPntUaW1lT2JqZWN0fSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBTdXBwb3J0Q29uZmlnSGFzaEdldCgpCgpnZXQgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIHJlcXVpcmVkIGNvbmZpZyBpbmZvcm1hdGlvbi4KCiAgICAkU3VwcG9ydC0+U3VwcG9ydENvbmZpZ0hhc2hHZXQoCiAgICAgICAgQ29uZmlnSGFzaCA9PiAkSGFzaFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU3VwcG9ydENvbmZpZ0hhc2hHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KENvbmZpZ0hhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNoZWNrIGlmICRDb25maWdIYXNoIG5lIGEgSGFzaFJlZgogICAgaWYgKHJlZigkUGFyYW17Q29uZmlnSGFzaH0pIG5lICdIQVNIJykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIkNvbmZpZ0hhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICMgZ2V0IHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLicvS2VybmVsL1N5c3RlbS9TdXBwb3J0Lyc7CiAgICAjIHJlYWQgYWxsIGF2YWlsaWJsZSBtb2R1bGVzIGluIEBMaXN0CiAgICBteSBATGlzdCA9IGdsb2IoJERpck5hbWUuIi8qLnBtIik7CiAgICBmb3JlYWNoIG15ICRGaWxlIChATGlzdCkgewogICAgICAgICMgcmVtb3ZlIC5wbQogICAgICAgICRGaWxlID1+IHMvXi4qXC8oLis/KVwucG0kLyQxLzsKICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6JEZpbGUiOwogICAgICAgICMgbG9hZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUgYW5kIGNoZWNrIGlmIGxvYWRhYmxlCiAgICAgICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpKXsKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IG9iamVjdAogICAgICAgICAgICBteSAkU3VwcG9ydE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoJXskU2VsZn0pOwogICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QpIHsKICAgICAgICAgICAgICAgIG15ICRBcnJheVJlZiA9ICRTdXBwb3J0T2JqZWN0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKICAgICAgICAgICAgICAgIGlmICgkQXJyYXlSZWYgJiYgcmVmKCRBcnJheVJlZikgZXEgJ0FSUkFZJykgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtDb25maWdIYXNofS0+eyRGaWxlfSA9ICRBcnJheVJlZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBTdXBwb3J0SW5mb0dldCgpCgpnZXQgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIHN1cHBvcnQgaW5mb3JtYXRpb24uCgogICAgJFN1cHBvcnQtPlN1cHBvcnRJbmZvR2V0KAogICAgICAgIERhdGFIYXNoID0+ICREYXRhSGFzaCwKICAgICAgICBJbnB1dEhhc2ggPT4gJElucHV0SGFzaCwKICAgICk7Cgo9Y3V0CgpzdWIgU3VwcG9ydEluZm9HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KERhdGFIYXNoIElucHV0SGFzaCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgY2hlY2sgaWYgJERhdGFIYXNoIGFuZCAkSW5wdXRIYXNoIG5lIGEgSGFzaFJlZgogICAgaWYgKHJlZigkUGFyYW17RGF0YUhhc2h9KSBuZSAnSEFTSCcgfHwgcmVmKCRQYXJhbXtJbnB1dEhhc2h9KSBuZSAnSEFTSCcpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJEYXRhSGFzaCBhbmQgSW5wdXRIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICBteSAkRGlyTmFtZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuJy9LZXJuZWwvU3lzdGVtL1N1cHBvcnQvJzsKCiAgICAjIHJlYWQgYWxsIGF2YWlsaWJsZSBtb2R1bGVzIGluIEBMaXN0CiAgICBteSBATGlzdCA9IGdsb2IoJERpck5hbWUuIi8qLnBtIik7CiAgICBmb3JlYWNoIG15ICRGaWxlIChATGlzdCkgewogICAgICAgICMgcmVtb3ZlIC5wbQogICAgICAgICRGaWxlID1+IHMvXi4qXC8oLis/KVwucG0kLyQxLzsKICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6JEZpbGUiOwogICAgICAgICMgbG9hZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUgYW5kIGNoZWNrIGlmIGxvYWRhYmxlCiAgICAgICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpKXsKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IG9iamVjdAogICAgICAgICAgICBteSAkU3VwcG9ydE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoJXskU2VsZn0pOwogICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QgJiYgJFBhcmFte0lucHV0SGFzaH0tPnskRmlsZX0pIHsKICAgICAgICAgICAgICAgIG15ICRBcnJheVJlZiA9ICRTdXBwb3J0T2JqZWN0LT5TdXBwb3J0SW5mb0dldCgKICAgICAgICAgICAgICAgICAgICBNb2R1bGVJbnB1dEhhc2ggPT4gJFBhcmFte0lucHV0SGFzaH0tPnskRmlsZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgIyBjaGVjayBpZiByZXR1cm4gdmFsdWUgaXMgdmFsaWQgYSBhcnJheXJlZgogICAgICAgICAgICAgICAgaWYgKEB7JEFycmF5UmVmfSkgewogICAgICAgICAgICAgICAgICAgIG15ICRTdHJ1Y3R1cmVPSyA9IDE7CiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgYXJyYXlyZWYgaW5jbHVkZXMgb25seSB2YWxpZCBoYXNocmVmcwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJEVsZW1lbnQgKEB7JEFycmF5UmVmfSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmKCRFbGVtZW50KSBuZSAnSEFTSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTdHJ1Y3R1cmVPSyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRTdHJ1Y3R1cmVPSyBlcSAiMSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0RhdGFIYXNofS0+eyRGaWxlfSA9ICRBcnJheVJlZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKZ2V0IGEgaGFzaCByZWZlcmVuY2Ugd2l0aCBwb3NzaWJpbGl0eSBjaGVja3MuCgogICAgbXkgJExpc3QgPSAkU3VwcG9ydC0+QWRtaW5DaGVja3NHZXQoRGF0YUhhc2ggPT4gJERhdGFIYXNoKTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoRGF0YUhhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNoZWNrIGlmICREYXRhSGFzaCBuZSBhIEhhc2hSZWYKICAgIGlmIChyZWYoJFBhcmFte0RhdGFIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiRGF0YUhhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICMgZ2V0IHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLicvS2VybmVsL1N5c3RlbS9TdXBwb3J0Lyc7CgogICAgIyByZWFkIGFsbCBhdmFpbGlibGUgbW9kdWxlcyBpbiBATGlzdAogICAgbXkgQExpc3QgPSBnbG9iKCREaXJOYW1lLiIvKi5wbSIpOwogICAgZm9yZWFjaCBteSAkRmlsZSAoQExpc3QpIHsKICAgICAgICAjIHJlbW92ZSAucG0KICAgICAgICAkRmlsZSA9fiBzL14uKlwvKC4rPylcLnBtJC8kMS87CiAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OiRGaWxlIjsKICAgICAgICAjIGxvYWQgbW9kdWxlICRHZW5lcmljTW9kdWxlIGFuZCBjaGVjayBpZiBsb2FkYWJsZQogICAgICAgIGlmICgkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSl7CiAgICAgICAgICAgICMgY3JlYXRlIG5ldyBvYmplY3QKICAgICAgICAgICAgbXkgJFN1cHBvcnRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KCV7JFNlbGZ9KTsKICAgICAgICAgICAgaWYgKCRTdXBwb3J0T2JqZWN0KSB7CiAgICAgICAgICAgICAgICBteSAkQXJyYXlSZWYgPSAkU3VwcG9ydE9iamVjdC0+QWRtaW5DaGVja3NHZXQoKTsKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgcmV0dXJuIHZhbHVlIGlzIHZhbGlkIGEgYXJyYXlyZWYKICAgICAgICAgICAgICAgIGlmIChAeyRBcnJheVJlZn0pIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3RydWN0dXJlT0sgPSAxOwogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlIGFycmF5cmVmIGluY2x1ZGVzIG9ubHkgdmFsaWQgaGFzaHJlZnMKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRFbGVtZW50IChAeyRBcnJheVJlZn0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZigkRWxlbWVudCkgbmUgJ0hBU0gnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RydWN0dXJlT0sgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkU3RydWN0dXJlT0sgZXEgIjEiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhSGFzaH0tPnskRmlsZX0gPSAkQXJyYXlSZWY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFhNTFN0cmluZ0NyZWF0ZSgpCgpyZXR1cm5zIGEgc3RyaW5nIHdpdGggeG1sLgoKICAgIG15ICRMaXN0ID0gJFN1cHBvcnQtPlhNTFN0cmluZ0NyZWF0ZShEYXRhID0+ICREYXRhKTsKCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KPFN1cHBvcnRJbmZvPgogICAgPEhhcmR3YXJlPgogICAgICAgIDxNZW1vcnlTd2FwQ2hlY2s+CiAgICAgICAgICAgIDxDaGVjaz5PSzwvQ2hlY2s+CiAgICAgICAgICAgIDxDb21tZW50PlRoZSBIb3N0IFN5c3RlbSBoYXMgMTAxMSBNQiBNZW1vcnkgdG90YWwuIDEwOCBNQiBNZW1vcnkgZnJlZS4gNjQzIE1CIFN3YXAgdG90YWwuIDY0MyBNQiBTd2FwIGZyZWUuIDwvQ29tbWVudD4KICAgICAgICAgICAgPERlc2NyaXB0aW9uPkEgTWVtb3J5IENoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgU3dhcEZyZWUgOiBTd2FwVG90YWwgJmx0OyA2MCAlIG9yIGlmIG1vcmUgdGhhbiAyMDAgTUIgU3dhcCBpcyB1c2VkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgIDxOYW1lPk1lbW9yeSBTd2FwIENoZWNrPC9OYW1lPgogICAgICAgICAgICA8S2V5Pk1lbW9yeVN3YXBDaGVjazwvS2V5PgogICAgICAgIDwvTWVtb3J5U3dhcENoZWNrPgogICAgPC9IYXJkd2FyZT4KPC9TdXBwb3J0SW5mbz4KCj1jdXQKCnN1YiBYTUxTdHJpbmdDcmVhdGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KERhdGFIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17RGF0YUhhc2h9KSBuZSAnSEFTSCcpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJEYXRhSGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRYTUxIYXNoID0gW107CiAgICBmb3JlYWNoIG15ICRNb2R1bGUgKGtleXMgJXskUGFyYW17RGF0YUhhc2h9fSkgewogICAgICAgIGZvcmVhY2ggbXkgJERhdGFIYXNoUm93IChAeyRQYXJhbXtEYXRhSGFzaH0tPnskTW9kdWxlfX0pIHsKICAgICAgICAgICAgbXkgJERhdGEgPSB7fTsKICAgICAgICAgICAgZm9yZWFjaCBteSAkRWxlbWVudCAoa2V5cyAleyREYXRhSGFzaFJvd30pIHsKICAgICAgICAgICAgICAgIGlmICgkRWxlbWVudCBlcSAnS2V5JykgewogICAgICAgICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRGF0YS0+eyRFbGVtZW50fS0+WzFdLT57Q29udGVudH0gPSAkRGF0YUhhc2hSb3ctPnskRWxlbWVudH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFhNTEhhc2gtPlsxXS0+e1N1cHBvcnRJbmZvfS0+WzFdLT57JE1vZHVsZX0tPlsxXS0+eyREYXRhSGFzaFJvdy0+e0tleX19LT5bMV0gPSAkRGF0YTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFhNTFN0cmluZyA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaDJYTUwoQHskWE1MSGFzaH0pOwoKICAgIHJldHVybiAkWE1MU3RyaW5nOwp9CgpzdWIgU3VwcG9ydFNlbmRJbmZvIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRNZXNzYWdlID0gIiI7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoWE1MU3RyaW5nKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBzZW5kIG1haWwgdG8gZ2F0ZXdheQogICAgaWYgKCRTZWxmLT57RW1haWxPYmplY3R9LT5TZW5kKAogICAgICAgIEZyb20gPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0FkbWluRW1haWwnKSwKICAgICAgICBUbyA9PiAnc3JAb3Rycy5jb20nLAogICAgICAgIFN1YmplY3QgPT4gJ0N1c3RvbWVyIFN5c3RlbUluZm8gZnJvbScsCiAgICAgICAgVHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgQ2hhcnNldCA9PiAndXRmLTgnLAogICAgICAgIEJvZHkgPT4gJ0N1c3RvbWVyIFN1cHBvcnRJbmZvJywKICAgICAgICBMb29wID0+IDEsICMgbm90IHJlcXVpcmVkLCByZW1vdmVzIHNtdHAgZnJvbQogICAgICAgIEF0dGFjaG1lbnQgPT4gW3sKICAgICAgICBGaWxlbmFtZSAgICA9PiAiU3VwcG9ydElELSRQYXJhbXtTdXBwb3J0SUR9LnhtbCIsCiAgICAgICAgQ29udGVudCAgICAgPT4gIiRQYXJhbXtYTUxTdHJpbmd9IiwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gImFwcGxpY2F0aW9uL3htbCIsCiAgICAgICAgICAgIH1dLAogICAgICAgICkpIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiRW1haWwgc2VudCB0byB0aGUgKChvdHJzKSkgc3VwcG9ydCB0ZWFtLlxuIjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRNZXNzYWdlID0gJ0NhblwndCBzZW5kIGVtYWlsIHRvIHRoZSAoKG90cnMpKSBzdXBwb3J0IHRlYW0hJy4iXG5cbiIuCiAgICAgICAgICAgICJZb3Ugd2lsbCBmb3VuZCB0aGUgb3RycyBzeXN0ZW0gaW5mb3JtYXRpb24gcGFja2FnZSBhdFxuIi4KICAgICAgICAgICAgIklmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBPVFJTIHN1cHBvcnQgc2VydmljZXMgcGxlYXNlIHNlbmQgdGhlIHBhY2thZ2UgdG8gc3VwcG9ydFxAb3Rycy5jb20gb3IgY2FsbFxuIi4KICAgICAgICAgICAgIm91ciBzdXBwb3J0IHRlYW0gcGVyIHBob25lIHRvIHJldmlldyB0aGUgbmV4dCBzdGVwXG5cbiIuCiAgICAgICAgICAgICIgTW9yZSBhYm91dCBPVFJTIHN1cHBvcnQgb3IgZmFjZS10by1mYWNlIGNvbnRhY3QgaW5mb3JtYXRpb24geW91IHdpbGwgZm91bmQgYXRcbiIuCiAgICAgICAgICAgICdodHRwOi8vd3d3Lm90cnMuY29tLycuIlxuXG4iOwogICAgfQogICAgcmV0dXJuICRNZXNzYWdlOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDA3LzA1LzA4IDA3OjQ4OjIwICQKCj1jdXQ=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9Dcm9uLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQ3Jvbi5wbSx2IDEuMS4xLjEgMjAwNy8wNS8wNyAxODo0Nzo1NSBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkNyb247Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpDcm9uIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMgdG8gYSBydW5uaW5nIE9UUlMgaG9zdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIENyb24gaW5mbyBvYmplY3QKCiAgdXNlIEtlcm5lbDo6Q29uZmlnOwogIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgKTsKCiAgJFN5c3RlbUluZm9PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6Q3Jvbi0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFN1cHBvcnRDb25maWdBcnJheUdldCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggcmVxdWlyZWQgY29uZmlnIGluZm9ybWF0aW9uLgoKICAgICRBcnJheVJlZiA9ICRTdXBwb3J0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKICAgIAogICAgbXkgJENvbmZpZ0FycmF5ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdUaWNrZXREdW1wJywKICAgICAgICAgICAgTmFtZSA9PiAnRHVtcCBUaWNrZXRzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIGhvdyBtYW55IGxhdGVzdCBUaWNrZXRzIHdlIHNodXQgZHVtcD8nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWxsID0+ICdBbGwnLAogICAgICAgICAgICAgICAgICAgIDAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgIDEwID0+ICdMYXN0IDEwJywKICAgICAgICAgICAgICAgICAgICAxMDAgPT4gJ0xhc3QgMTAwJywKICAgICAgICAgICAgICAgICAgICAxMDAwID0+ICdMYXN0IDEwMDAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdBcGFjaGVIb21lJywKICAgICAgICAgICAgTmFtZSA9PiAnQXBhY2hlIEhvbWUgRGlyZWN0b3J5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIHRoZSBwYXRoIHRvIHRoZSBBcGFjaGUgaG9tZSBkaXJlY3RvcnkgKC9ldGMvYXBhY2hlMiknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgPT4gNDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgU3VwcG9ydENvbmZpZ0FycmF5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNyZWF0ZSBjb25maWcgYXJyYXkKICAgIG15ICRDb25maWdBcnJheSA9IFsKCiAgICBdOwogICAgIyByZXR1cm4gY29uZmlnIGFycmF5CiAgICByZXR1cm4gJENvbmZpZ0FycmF5Owp9Cgo9aXRlbSBTdXBwb3J0SW5mb0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggc3VwcG9ydCBpbmZvcm1hdGlvbi4KCiRDcm9uQXJyYXkgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdvcGVuU1VTRSAxMC4yJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICBdOwogICAgICAgIAo9Y3V0CgpzdWIgU3VwcG9ydEluZm9HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGFBcnJheSA9IFtdOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KE1vZHVsZUlucHV0SGFzaCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmIChyZWYoJFBhcmFte01vZHVsZUlucHV0SGFzaH0pIG5lICdIQVNIJykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk1vZHVsZUlucHV0SGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygKIyAgICAgICAgVHlwZSA9PiAkUGFyYW17TW9kdWxlSW5wdXRIYXNofS0+e1R5cGV9IHx8ICcnLAojICAgICk7CiMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIEFkbWluQ2hlY2tzIGluZm9ybWF0aW9uLgoKJENyb25BcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygpOwojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIENoZWNrKCkKCnJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIENoZWNrIGluZm9ybWF0aW9uLgoKJENoZWNrSGFzaCA9PiAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfTsKCiMgY2hlY2sgaWYgY29uZmlnIHZhbHVlIGF2YWlsaWJsZQppZiAoJFBhcmFte1R5cGV9KSB7CiAgICBwcmludCBTVERFUlIgIlRZUEU6ICIgLiAkUGFyYW17VHlwZX07Cn0KICAgICAgICAKPWN1dAoKc3ViIENoZWNrIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRSZXR1cm5IYXNoID0ge307CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICgkXk8gPX4gL2xpbnV4LyB8fCAvdW5peC8gfHwgL25ldGJzZC8gfHwgL2ZyZWVic2QvIHx8IC9EYXJ3aW4vKSB7CiAgICAgIAogICAgfQogICAgZWxzaWYgKCReTyA9fiAvd2luL2kpIHsjIFRPRE8gLyBBdXNnYWJlIHVudGVyIFdpbmRvd3Mgbm9jaCBwcnVlZmVuCiAgICAgICAgCiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCjE7
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERhdGFiYXNlLnBtLHYgMS4xLjEuMSAyMDA3LzA1LzA3IDE4OjQ3OjU1IHNyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2U7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZSAtIGdsb2JhbCBzeXN0ZW0gaW5mb3JtYXRpb25zCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zIHRvIGEgcnVubmluZyBPVFJTIGhvc3QuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBEYXRhYmFzZSBpbmZvIG9iamVjdAoKICB1c2UgS2VybmVsOjpDb25maWc7CiAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICApOwoKICAkU3lzdGVtSW5mb09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZS0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFN1cHBvcnRDb25maWdBcnJheUdldCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggcmVxdWlyZWQgY29uZmlnIGluZm9ybWF0aW9uLgoKICAgICRBcnJheVJlZiA9ICRTdXBwb3J0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKCiAgICBteSAkQ29uZmlnQXJyYXkgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ1RpY2tldER1bXAnLAogICAgICAgICAgICBOYW1lID0+ICdEdW1wIFRpY2tldHMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIHRlbGwgbWUgaG93IG1hbnkgbGF0ZXN0IFRpY2tldHMgd2Ugc2h1dCBkdW1wPycsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBbGwgPT4gJ0FsbCcsCiAgICAgICAgICAgICAgICAgICAgMCA9PiAnMCcsCiAgICAgICAgICAgICAgICAgICAgMTAgPT4gJ0xhc3QgMTAnLAogICAgICAgICAgICAgICAgICAgIDEwMCA9PiAnTGFzdCAxMDAnLAogICAgICAgICAgICAgICAgICAgIDEwMDAgPT4gJ0xhc3QgMTAwMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ0FwYWNoZUhvbWUnLAogICAgICAgICAgICBOYW1lID0+ICdBcGFjaGUgSG9tZSBEaXJlY3RvcnknLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIHRlbGwgbWUgdGhlIHBhdGggdG8gdGhlIEFwYWNoZSBob21lIGRpcmVjdG9yeSAoL2V0Yy9hcGFjaGUyKScsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgU2l6ZSA9PiA0MCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCj1jdXQKCnN1YiBTdXBwb3J0Q29uZmlnQXJyYXlHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgY3JlYXRlIGNvbmZpZyBhcnJheQogICAgbXkgJENvbmZpZ0FycmF5ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdUaWNrZXREdW1wJywKICAgICAgICAgICAgTmFtZSA9PiAnRHVtcCBUaWNrZXRzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIGhvdyBtYW55IGxhdGVzdCBUaWNrZXRzIHdlIHNodXQgZHVtcD8nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWxsID0+ICdBbGwnLAogICAgICAgICAgICAgICAgICAgIDAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgIDEwID0+ICdMYXN0IDEwJywKICAgICAgICAgICAgICAgICAgICAxMDAgPT4gJ0xhc3QgMTAwJywKICAgICAgICAgICAgICAgICAgICAxMDAwID0+ICdMYXN0IDEwMDAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKICAgICMgcmV0dXJuIGNvbmZpZyBhcnJheQogICAgcmV0dXJuICRDb25maWdBcnJheTsKfQoKPWl0ZW0gU3VwcG9ydEluZm9HZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIHN1cHBvcnQgaW5mb3JtYXRpb24uCgokRGF0YWJhc2VBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgCj1jdXQKCnN1YiBTdXBwb3J0SW5mb0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoTW9kdWxlSW5wdXRIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17TW9kdWxlSW5wdXRIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTW9kdWxlSW5wdXRIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CiMgICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKAojICAgICAgICBUeXBlID0+ICRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9LT57VHlwZX0gfHwgJycsCiMgICAgKTsKIyAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9Cgo9aXRlbSBBZG1pbkNoZWNrc0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggQWRtaW5DaGVja3MgaW5mb3JtYXRpb24uCgokRGF0YWJhc2VBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygpOwojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIENoZWNrKCkKCnJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIENoZWNrIGluZm9ybWF0aW9uLgoKJENoZWNrSGFzaCA9PiAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfTsKCiMgY2hlY2sgaWYgY29uZmlnIHZhbHVlIGF2YWlsaWJsZQppZiAoJFBhcmFte1R5cGV9KSB7CiAgICBwcmludCBTVERFUlIgIlRZUEU6ICIgLiAkUGFyYW17VHlwZX07Cn0KICAgICAgICAKPWN1dAoKc3ViIENoZWNrIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRSZXR1cm5IYXNoID0ge307CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICgkXk8gPX4gL2xpbnV4LyB8fCAvdW5peC8gfHwgL25ldGJzZC8gfHwgL2ZyZWVic2QvIHx8IC9EYXJ3aW4vKSB7CiAgICAgIAogICAgfQogICAgZWxzaWYgKCReTyA9fiAvd2luL2kpIHsjIFRPRE8gLyBBdXNnYWJlIHVudGVyIFdpbmRvd3Mgbm9jaCBwcnVlZmVuCiAgICAgICAgCiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCjE7
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9IYXJkd2FyZS5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEhhcmR3YXJlLnBtLHYgMS4yIDIwMDcvMDUvMDggMDg6MDA6NTYgc3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpIYXJkd2FyZTsKCnVzZSBzdHJpY3Q7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6SGFyZHdhcmUgLSBnbG9iYWwgc3lzdGVtIGluZm9ybWF0aW9ucwoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9ucyB0byBhIHJ1bm5pbmcgT1RSUyBob3N0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgaGFyZHdhcmUgaW5mbyBvYmplY3QKCnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7Cm15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7Cm15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKKTsKCiRTeXN0ZW1JbmZvT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkhhcmR3YXJlLT5uZXcoCiAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAopOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBTdXBwb3J0Q29uZmlnQXJyYXlHZXQoKQoKcmV0dXJuIGFuIGFycmF5IHJlZmVyZW5jZSB3aXRoIHJlcXVpcmVkIGNvbmZpZyBpbmZvcm1hdGlvbi4KCiRBcnJheVJlZiA9ICRTdXBwb3J0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKCm15ICRDb25maWdBcnJheSA9IFsKICAgIHsKICAgICAgICBLZXkgPT4gJ1RpY2tldER1bXAnLAogICAgICAgIE5hbWUgPT4gJ0R1bXAgVGlja2V0cycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIGhvdyBtYW55IGxhdGVzdCBUaWNrZXRzIHdlIHNodXQgZHVtcD8nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQWxsID0+ICdBbGwnLAogICAgICAgICAgICAgICAgMCA9PiAnMCcsCiAgICAgICAgICAgICAgICAxMCA9PiAnTGFzdCAxMCcsCiAgICAgICAgICAgICAgICAxMDAgPT4gJ0xhc3QgMTAwJywKICAgICAgICAgICAgICAgIDEwMDAgPT4gJ0xhc3QgMTAwMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdBcGFjaGVIb21lJywKICAgICAgICBOYW1lID0+ICdBcGFjaGUgSG9tZSBEaXJlY3RvcnknLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgdGVsbCBtZSB0aGUgcGF0aCB0byB0aGUgQXBhY2hlIGhvbWUgZGlyZWN0b3J5ICgvZXRjL2FwYWNoZTIpJywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDQwLAogICAgICAgIH0sCiAgICB9LApdOwoKPWN1dAoKc3ViIFN1cHBvcnRDb25maWdBcnJheUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBjcmVhdGUgY29uZmlnIGFycmF5CiAgICBteSAkQ29uZmlnQXJyYXkgPSBbXTsKICAgICMgcmV0dXJuIGNvbmZpZyBhcnJheQogICAgcmV0dXJuICRDb25maWdBcnJheTsKfQoKPWl0ZW0gU3VwcG9ydEluZm9HZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIHN1cHBvcnQgaW5mb3JtYXRpb24uCgokSGFyZHdhcmVBcnJheSA9PiBbCiAgICB7CiAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdWZXJzaW9uJywKICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICBDb21tZW50ID0+ICdvcGVuU1VTRSAxMC4yJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgIENoZWNrID0+ICdPSycsCiAgICB9LApdOwoKPWN1dAoKc3ViIFN1cHBvcnRJbmZvR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhNb2R1bGVJbnB1dEhhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAocmVmKCRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9KSBuZSAnSEFTSCcpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJNb2R1bGVJbnB1dEhhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwogICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPk1lbW9yeVN3YXBDaGVjaygKICAgICAgICBUeXBlID0+ICRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9LT57VHlwZX0gfHwgJycsCiAgICApOwogICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIEFkbWluQ2hlY2tzIGluZm9ybWF0aW9uLgoKJEhhcmR3YXJlQXJyYXkgPT4gWwogICAgewogICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgIENoZWNrID0+ICdPSycsCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgTmFtZSA9PiAnVmVyc2lvbicsCiAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICBDaGVjayA9PiAnT0snLAogICAgfSwKXTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiAgICBteSAkT25lQ2hlY2sgPSAkU2VsZi0+TWVtb3J5U3dhcENoZWNrKCk7CiAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9Cgo9aXRlbSBNZW1vcnlTd2FwQ2hlY2soKQoKcmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIHdpdGggTWVtb3J5U3dhcENoZWNrIGluZm9ybWF0aW9uLgoKJE1lbW9yeVN3YXBDaGVja0hhc2ggPT4KICAgIHsKICAgICAgICBLZXkgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICBDaGVjayA9PiAnT0snLAogICAgfTsKCiMgY2hlY2sgaWYgY29uZmlnIHZhbHVlIGF2YWlsaWJsZQppZiAoJFBhcmFte1R5cGV9KSB7CiAgICBwcmludCBTVERFUlIgIlRZUEU6ICIgLiAkUGFyYW17VHlwZX07Cn0KCj1jdXQKCnN1YiBNZW1vcnlTd2FwQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJFJldHVybkhhc2ggPSB7fTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJU1lbVRtcEluZm8gPSAoKTsKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCReTyA9fiAvbGludXgvIHx8IC91bml4LyB8fCAvbmV0YnNkLyB8fCAvZnJlZWJzZC8gfHwgL0Rhcndpbi8pIHsKICAgICAgICBpZiAoLWUgIi9wcm9jL21lbWluZm8iKSB7CiAgICAgICAgICAgIG9wZW4oTUVNSU5GT0ZJTEUsICI8L3Byb2MvbWVtaW5mbyIpOwogICAgICAgICAgICB3aGlsZSg8TUVNSU5GT0ZJTEU+KSB7CiAgICAgICAgICAgICAgICBteSAkVG1wTGluZSA9ICRfOwogICAgICAgICAgICAgICAgaWYgKCRUbXBMaW5lID1+IC9NZW1Ub3RhbC8pIHsKICAgICAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL14uKj8oXGQrKS4qJC8kMS87CiAgICAgICAgICAgICAgICAgICAgJE1lbVRtcEluZm97TWVtb3J5U3dhcENoZWNrfXtNZW1Ub3RhbH0gPSAkVG1wTGluZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkVG1wTGluZSA9fiAvTWVtRnJlZS8pIHsKICAgICAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL14uKj8oXGQrKS4qJC8kMS87CiAgICAgICAgICAgICAgICAgICAgJE1lbVRtcEluZm97TWVtb3J5U3dhcENoZWNrfXtNZW1GcmVlfSA9ICRUbXBMaW5lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCRUbXBMaW5lID1+IC9Td2FwVG90YWwvKSB7CiAgICAgICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9eLio/KFxkKykuKiQvJDEvOwogICAgICAgICAgICAgICAgICAgICRNZW1UbXBJbmZve01lbW9yeVN3YXBDaGVja317U3dhcFRvdGFsfSA9ICRUbXBMaW5lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCRUbXBMaW5lID1+IC9Td2FwRnJlZS8pIHsKICAgICAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL14uKj8oXGQrKS4qJC8kMS87CiAgICAgICAgICAgICAgICAgICAgJE1lbVRtcEluZm97TWVtb3J5U3dhcENoZWNrfXtTd2FwRnJlZX0gPSAkVG1wTGluZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZShNRU1JTkZPRklMRSk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCReTyA9fiAvd2luL2kpIHsjIFRPRE8gLyBBdXNnYWJlIHVudGVyIFdpbmRvd3Mgbm9jaCBwcnVlZmVuCgogICAgfQoKICAgICMgYnVpbGQgcmV0dXJuIGhhc2gKICAgIG15ICREZXNjcmlidGlvbiA9ICJUaGUgSG9zdCBTeXN0ZW0gaGFzOiBcbiIKICAgICAgICAuJy0gJy5zcHJpbnRmICgiJS4wZiIsICgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e01lbVRvdGFsfSAvIDEwMjQpKSAuICIgTUIgTWVtb3J5IHRvdGFsIFxuIgogICAgICAgIC4nLSAnLnNwcmludGYgKCIlLjBmIiwgKCRNZW1UbXBJbmZve01lbW9yeVN3YXBDaGVja317TWVtRnJlZX0gLyAxMDI0KSkgLiAiIE1CIE1lbW9yeSBmcmVlIFxuIgogICAgICAgIC4nLSAnLnNwcmludGYgKCIlLjBmIiwgKCRNZW1UbXBJbmZve01lbW9yeVN3YXBDaGVja317U3dhcFRvdGFsfSAvIDEwMjQpKSAuICIgTUIgU3dhcCB0b3RhbCBcbiIKICAgICAgICAuJy0gJy5zcHJpbnRmICgiJS4wZiIsICgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBGcmVlfSAvIDEwMjQpKSAuICIgTUIgU3dhcCBmcmVlICI7CgogICAgaWYgKCgoJE1lbVRtcEluZm97TWVtb3J5U3dhcENoZWNrfXtTd2FwRnJlZX0pLygkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBUb3RhbH0pIDwgNjApIHx8CiAgICAgICAgKCgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBUb3RhbH0pLSgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBGcmVlfSkgPiAyMDAwMCkKICAgICkgewogICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICBLZXkgPT4gJ01lbW9yeVN3YXBDaGVjaycsCiAgICAgICAgICAgIE5hbWUgPT4gJ01lbW9yeSBTd2FwIENoZWNrJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgTWVtb3J5IENoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgXG4iCiAgICAgICAgICAgICAgICAuIlN3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSBcbiIKICAgICAgICAgICAgICAgIC4iIG9yIGlmIG1vcmUgdGhhbiAyMDAgTUIgU3dhcCBpcyB1c2VkLiIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICBLZXkgPT4gJ01lbW9yeVN3YXBDaGVjaycsCiAgICAgICAgICAgIE5hbWUgPT4gIkEgTWVtb3J5IENoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgXG4iCiAgICAgICAgICAgICAgICAuIlN3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSIKICAgICAgICAgICAgICAgIC4iIG9yIGlmIG1vcmUgdGhhbiAyMDAgTUIgU3dhcCBpcyB1c2VkLiIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdBIE1lbW9yeSBDaGVjay4nLAogICAgICAgICAgICBDaGVjayA9PiAnRmFpbGVkJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICRSZXR1cm5IYXNoOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMiAkICREYXRlOiAyMDA3LzA1LzA4IDA4OjAwOjU2ICQKCj1jdXQ=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9PVFJTLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogT1RSUy5wbSx2IDEuMS4xLjEgMjAwNy8wNS8wNyAxODo0Nzo1NSBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6Ok9UUlM7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpPVFJTIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMgdG8gYSBydW5uaW5nIE9UUlMgaG9zdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIE9UUlMgaW5mbyBvYmplY3QKCiAgdXNlIEtlcm5lbDo6Q29uZmlnOwogIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgKTsKCiAgJFN5c3RlbUluZm9PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6T1RSUy0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFN1cHBvcnRDb25maWdBcnJheUdldCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggcmVxdWlyZWQgY29uZmlnIGluZm9ybWF0aW9uLgoKICAgICRBcnJheVJlZiA9ICRTdXBwb3J0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKCiAgICBteSAkQ29uZmlnQXJyYXkgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ1RpY2tldER1bXAnLAogICAgICAgICAgICBOYW1lID0+ICdEdW1wIFRpY2tldHMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIHRlbGwgbWUgaG93IG1hbnkgbGF0ZXN0IFRpY2tldHMgd2Ugc2h1dCBkdW1wPycsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBbGwgPT4gJ0FsbCcsCiAgICAgICAgICAgICAgICAgICAgMCA9PiAnMCcsCiAgICAgICAgICAgICAgICAgICAgMTAgPT4gJ0xhc3QgMTAnLAogICAgICAgICAgICAgICAgICAgIDEwMCA9PiAnTGFzdCAxMDAnLAogICAgICAgICAgICAgICAgICAgIDEwMDAgPT4gJ0xhc3QgMTAwMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ0FwYWNoZUhvbWUnLAogICAgICAgICAgICBOYW1lID0+ICdBcGFjaGUgSG9tZSBEaXJlY3RvcnknLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIHRlbGwgbWUgdGhlIHBhdGggdG8gdGhlIEFwYWNoZSBob21lIGRpcmVjdG9yeSAoL2V0Yy9hcGFjaGUyKScsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgU2l6ZSA9PiA0MCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCj1jdXQKCnN1YiBTdXBwb3J0Q29uZmlnQXJyYXlHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgY3JlYXRlIGNvbmZpZyBhcnJheQogICAgbXkgJENvbmZpZ0FycmF5ID0gWwoKICAgIF07CiAgICAjIHJldHVybiBjb25maWcgYXJyYXkKICAgIHJldHVybiAkQ29uZmlnQXJyYXk7Cn0KCj1pdGVtIFN1cHBvcnRJbmZvR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBzdXBwb3J0IGluZm9ybWF0aW9uLgoKJE9UUlNBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgCj1jdXQKCnN1YiBTdXBwb3J0SW5mb0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoTW9kdWxlSW5wdXRIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17TW9kdWxlSW5wdXRIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTW9kdWxlSW5wdXRIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CiMgICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKAojICAgICAgICBUeXBlID0+ICRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9LT57VHlwZX0gfHwgJycsCiMgICAgKTsKIyAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9Cgo9aXRlbSBBZG1pbkNoZWNrc0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggQWRtaW5DaGVja3MgaW5mb3JtYXRpb24uCgokT1RSU0FycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKICAgICAgICAKPWN1dAoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiMgICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKCk7CiMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKPWl0ZW0gQ2hlY2soKQoKcmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIHdpdGggQ2hlY2sgaW5mb3JtYXRpb24uCgokQ2hlY2tIYXNoID0+IAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9OwoKIyBjaGVjayBpZiBjb25maWcgdmFsdWUgYXZhaWxpYmxlCmlmICgkUGFyYW17VHlwZX0pIHsKICAgIHByaW50IFNUREVSUiAiVFlQRTogIiAuICRQYXJhbXtUeXBlfTsKfQogICAgICAgIAo9Y3V0CgpzdWIgQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJFJldHVybkhhc2ggPSB7fTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCReTyA9fiAvbGludXgvIHx8IC91bml4LyB8fCAvbmV0YnNkLyB8fCAvZnJlZWJzZC8gfHwgL0Rhcndpbi8pIHsKICAgICAgCiAgICB9CiAgICBlbHNpZiAoJF5PID1+IC93aW4vaSkgeyMgVE9ETyAvIEF1c2dhYmUgdW50ZXIgV2luZG93cyBub2NoIHBydWVmZW4KICAgICAgICAKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKMTs=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIucG0gLSBhbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBXZWJzZXJ2ZXIucG0sdiAxLjEuMS4xIDIwMDcvMDUvMDcgMTg6NDc6NTUgc3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpXZWJzZXJ2ZXI7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpXZWJzZXJ2ZXIgLSBnbG9iYWwgc3lzdGVtIGluZm9ybWF0aW9ucwoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9ucyB0byBhIHJ1bm5pbmcgT1RSUyBob3N0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgV2Vic2VydmVyIGluZm8gb2JqZWN0CgogIHVzZSBLZXJuZWw6OkNvbmZpZzsKICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICk7CgogICRTeXN0ZW1JbmZvT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlci0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFN1cHBvcnRDb25maWdBcnJheUdldCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggcmVxdWlyZWQgY29uZmlnIGluZm9ybWF0aW9uLgoKICAgICRBcnJheVJlZiA9ICRTdXBwb3J0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKICAgIAogICAgbXkgJENvbmZpZ0FycmF5ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdUaWNrZXREdW1wJywKICAgICAgICAgICAgTmFtZSA9PiAnRHVtcCBUaWNrZXRzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIGhvdyBtYW55IGxhdGVzdCBUaWNrZXRzIHdlIHNodXQgZHVtcD8nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWxsID0+ICdBbGwnLAogICAgICAgICAgICAgICAgICAgIDAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgIDEwID0+ICdMYXN0IDEwJywKICAgICAgICAgICAgICAgICAgICAxMDAgPT4gJ0xhc3QgMTAwJywKICAgICAgICAgICAgICAgICAgICAxMDAwID0+ICdMYXN0IDEwMDAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdBcGFjaGVIb21lJywKICAgICAgICAgICAgTmFtZSA9PiAnQXBhY2hlIEhvbWUgRGlyZWN0b3J5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIHRoZSBwYXRoIHRvIHRoZSBBcGFjaGUgaG9tZSBkaXJlY3RvcnkgKC9ldGMvYXBhY2hlMiknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgPT4gNDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgU3VwcG9ydENvbmZpZ0FycmF5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNyZWF0ZSBjb25maWcgYXJyYXkKICAgIG15ICRDb25maWdBcnJheSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnQXBhY2hlSG9tZScsCiAgICAgICAgICAgIE5hbWUgPT4gJ0FwYWNoZSBIb21lIERpcmVjdG9yeScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgdGVsbCBtZSB0aGUgcGF0aCB0byB0aGUgQXBhY2hlIGhvbWUgZGlyZWN0b3J5ICgvZXRjL2FwYWNoZTIpJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBTaXplID0+IDQwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ0FwYWNoZUxvZycsCiAgICAgICAgICAgIE5hbWUgPT4gJ0FwYWNoZSBMb2cgRmlsZScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgdGVsbCBtZSB0aGUgcGF0aCB0byB0aGUgQXBhY2hlIGxvZyBmaWxlLCB1c2VkIGZvciBPVFJTICgvdmFyL2xvZy9hcGFjaGUyL2Vycm9yX2xvZyknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgPT4gNDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CiAgICAjIHJldHVybiBjb25maWcgYXJyYXkKICAgIHJldHVybiAkQ29uZmlnQXJyYXk7Cn0KCj1pdGVtIFN1cHBvcnRJbmZvR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBzdXBwb3J0IGluZm9ybWF0aW9uLgoKJFdlYnNlcnZlckFycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKICAgICAgICAKPWN1dAoKc3ViIFN1cHBvcnRJbmZvR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhNb2R1bGVJbnB1dEhhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAocmVmKCRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9KSBuZSAnSEFTSCcpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJNb2R1bGVJbnB1dEhhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KIyAgICAjIHBsZWFzZSBhZGQgZm9yIGVhY2ggbmV3IGNoZWNrIGEgcGFydCBsaWtlIHRoaXMKIyAgICBteSAkT25lQ2hlY2sgPSAkU2VsZi0+Q2hlY2soCiMgICAgICAgIFR5cGUgPT4gJFBhcmFte01vZHVsZUlucHV0SGFzaH0tPntUeXBlfSB8fCAnJywKIyAgICApOwojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIEFkbWluQ2hlY2tzR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBBZG1pbkNoZWNrcyBpbmZvcm1hdGlvbi4KCiRXZWJzZXJ2ZXJBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygpOwojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIENoZWNrKCkKCnJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIENoZWNrIGluZm9ybWF0aW9uLgoKJENoZWNrSGFzaCA9PiAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfTsKCiMgY2hlY2sgaWYgY29uZmlnIHZhbHVlIGF2YWlsaWJsZQppZiAoJFBhcmFte1R5cGV9KSB7CiAgICBwcmludCBTVERFUlIgIlRZUEU6ICIgLiAkUGFyYW17VHlwZX07Cn0KICAgICAgICAKPWN1dAoKc3ViIENoZWNrIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRSZXR1cm5IYXNoID0ge307CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICgkXk8gPX4gL2xpbnV4LyB8fCAvdW5peC8gfHwgL25ldGJzZC8gfHwgL2ZyZWVic2QvIHx8IC9EYXJ3aW4vKSB7CiAgICAgIAogICAgfQogICAgZWxzaWYgKCReTyA9fiAvd2luL2kpIHsjIFRPRE8gLyBBdXNnYWJlIHVudGVyIFdpbmRvd3Mgbm9jaCBwcnVlZmVuCiAgICAgICAgCiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCjE7