PCEtLQogICAgCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgogICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICAgCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAgIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgotLT4KPCEtLSAkUmV2JCAkRGF0ZSQgLS0+CjxodG1sPgo8aGVhZD4KPHRpdGxlPlNlcnZpY2VNaXggQnJpZGdlIEV4YW1wbGU8L3RpdGxlPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CnZhciB1cmxUb09wZW4gPSAiaHR0cDovL2xvY2FsaG9zdDo4MTkyL2JyaWRnZS8iOyAvL2RlZmF1bHQgVVJMIHRvIG9wZW4KCmZ1bmN0aW9uIGdldEhUVFBPYmplY3QoKSB7CiAgdmFyIHhtbGh0dHAgPSBmYWxzZTsKCiAgLyogQ29tcGlsYXRpb24gY29uZGl0aW9ubmVsbGUgZCdJRSAqLwogIC8qQGNjX29uCiAgQGlmIChAX2pzY3JpcHRfdmVyc2lvbiA+PSA1KQogICAgIHRyeSB7CiAgICAgICAgeG1saHR0cCA9IG5ldyBBY3RpdmVYT2JqZWN0KCJNc3htbDIuWE1MSFRUUCIpOwogICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICB0cnkgewogICAgICAgICAgIHhtbGh0dHAgPSBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKTsKICAgICAgICB9IGNhdGNoIChFKSB7CiAgICAgICAgICAgeG1saHR0cCA9IGZhbHNlOwogICAgICAgIH0KICAgICB9CiAgQGVsc2UKICAgICB4bWxodHRwID0gZmFsc2U7CiAgQGVuZCBAKi8KCiAgLyogb24gZXNzYWllIGRlIGNy6WVyIGwnb2JqZXQgc2kgY2Ugbidlc3QgcGFzIGTpauAgZmFpdCAqLwogIGlmICgheG1saHR0cCAmJiB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICB0cnkgewogICAgICAgIHhtbGh0dHAgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgeG1saHR0cCA9IGZhbHNlOwogICAgIH0KICB9CgogIGlmICh4bWxodHRwKSB7CiAgICAgLyogb24gZOlmaW5pdCBjZSBxdWkgZG9pdCBzZSBwYXNzZXIgcXVhbmQgbGEgcGFnZSBy6XBvbmRyYSAqLwogICAgIHhtbGh0dHAub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCkgewogICAgICAgIGlmICh4bWxodHRwLnJlYWR5U3RhdGUgPT0gNCkgeyAvKiA0IDog6XRhdCAiY29tcGxldGUiICovCiAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3BvbnNlIik7CiAgICAgICAgICAgdmFyIHJlc3BvbnNlU3RhdHVzID0gIiI7CiAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJlc3BvbnNlU3RhdHVzID0geG1saHR0cC5zdGF0dXMgKyAiIjsKICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICByZXNwb25zZVN0YXR1cyA9ICJFUlJPUiBXSElMRSBSRVRSSUVWSU5HIFNUQVRVUzsgTUFZQkUgVU5BQkxFIFRPIENPTk5FQ1QuIjsKICAgICAgICAgICB9CiAgICAgICAgICAgcmVzcG9uc2UudmFsdWUgPSAiU1RBVFVTOiAiICsgcmVzcG9uc2VTdGF0dXMgKyAiXG4iICsgeG1saHR0cC5yZXNwb25zZVRleHQ7CiAgICAgICAgfQogICAgIH0KICB9CiAgcmV0dXJuIHhtbGh0dHA7Cn0KCmZ1bmN0aW9uIHNlbmQoKSB7CiAgaWYgKChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidXJsVG9PcGVuIikudmFsdWUgIT0gdXJsVG9PcGVuKSAmJiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVybFRvT3BlbiIpLnZhbHVlICE9ICIiKSkgewogICAgLy91c2UgdXNlciBlbnRyeSBvbmx5IGlmIGl0IGF0IGxlYXN0IGNhbiBiZSBva2F5CiAgICB1cmxUb09wZW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidXJsVG9PcGVuIikudmFsdWU7CiAgfSAgCiAgdmFyIHhtbGh0dHAgPSBnZXRIVFRQT2JqZWN0KCk7CiAgaWYgKCF4bWxodHRwKSB7CiAgICBhbGVydCgnY291bmQgbm90IGNyZWF0ZSBYTUxIdHRwUmVxdWVzdCBvYmplY3QnKTsKICAgIHJldHVybjsKICB9CiAgdmFyIHJlcXVlc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVxdWVzdCIpOwogIHZhciByZXNwb25zZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXNwb25zZSIpOyAgCiAgdHJ5IHsKICAgIG5ldHNjYXBlLnNlY3VyaXR5LlByaXZpbGVnZU1hbmFnZXIuZW5hYmxlUHJpdmlsZWdlKCJVbml2ZXJzYWxCcm93c2VyUmVhZCBVbml2ZXJzYWxCcm93c2VyV3JpdGUiKTsKICB9IGNhdGNoIChlKSB7CiAgfQogIHRyeSB7CiAgICB4bWxodHRwLm9wZW4oIlBPU1QiLCB1cmxUb09wZW4sIHRydWUpOwogIH0gY2F0Y2ggKGUpIHsKICAgIGFsZXJ0KCdFcnJvciBvcGVuaW5nIGNvbm5lY3Rpb24nKTsKICB9CiAgeG1saHR0cC5zZW5kKHJlcXVlc3QudmFsdWUpOwp9Cgo8L3NjcmlwdD4KPC9oZWFkPgoKPGJvZHk+Cgo8aDE+U2VydmljZU1peCBCcmlkZ2UgRXhhbXBsZTwvaDE+Cgo8cD5XZWxjb21lIHRvIHRoZSBCcmlkZ2UgZXhhbXBsZSBmb3IgU2VydmljZU1peC48L3A+Cgo8cD5QZXJmb3JtIGEgUE9TVCBpbnRvIHRoZSBIVFRQIGJpbmRpbmcuIFRoaXMgcmVxdWlyZXMgSmF2YVNjcmlwdC48L3A+IAo8cD5UYXJnZXQ6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSI1MCIgaWQ9InVybFRvT3BlbiIgdmFsdWU9IiI+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ1cmxUb09wZW4iKS52YWx1ZSA9IHVybFRvT3Blbjs8L3NjcmlwdD4uPC9wPgoKCjx0YWJsZT4KICA8dHI+CiAgICA8dGQ+CiAgPHRleHRhcmVhIGlkPSJyZXF1ZXN0IiBzdHlsZT0id2lkdGg6NjAwcHg7aGVpZ2h0OjQwMHB4IiBvbktleVVwPSJzZW5kKCk7Ij48P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pgo8ZTpFbnZlbG9wZSB4bWxuczplPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+CiAgPGU6Qm9keT4KICAgIDxwaW5nPgogICAgICA8cGluZ1JlcXVlc3Q+CiAgICAgICAgPG1lc3NhZ2UgeG1sbnM9Imh0dHA6Ly9zb2FwIj5oZWwgbG88L21lc3NhZ2U+CiAgICAgIDwvcGluZ1JlcXVlc3Q+CiAgICA8L3Bpbmc+CiAgPC9lOkJvZHk+CjwvZTpFbnZlbG9wZT4KCiAgPC90ZXh0YXJlYT4KICAgIDwvdGQ+CiAgICA8dGQ+CiAgPHRleHRhcmVhIGlkPSJyZXNwb25zZSIgc3R5bGU9IndpZHRoOjYwMHB4O2hlaWdodDo0MDBweCI+CiAgPC90ZXh0YXJlYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0yPgogIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJTZW5kIiBvbkNsaWNrPSJzZW5kKCk7Ii8+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwvYm9keT4KPC9odG1sPgo=