CS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJKiBDb29sIERIVE1MIHRvb2x0aXAgc2NyaXB0LSCpIER5bmFtaWMgRHJpdmUgREhUTUwgY29kZSBsaWJyYXJ5ICh3d3cuZHluYW1pY2RyaXZlLmNvbSkKCSogVGhpcyBub3RpY2UgTVVTVCBzdGF5IGludGFjdCBmb3IgbGVnYWwgdXNlCgkqIFZpc2l0IER5bmFtaWMgRHJpdmUgYXQgaHR0cDovL3d3dy5keW5hbWljZHJpdmUuY29tLyBmb3IgZnVsbCBzb3VyY2UgY29kZQoJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgl2YXIgb2Zmc2V0eHBvaW50PS02MCAvL0N1c3RvbWl6ZSB4IG9mZnNldCBvZiB0b29sdGlwCgl2YXIgb2Zmc2V0eXBvaW50PTIwIC8vQ3VzdG9taXplIHkgb2Zmc2V0IG9mIHRvb2x0aXAKCXZhciBpZT1kb2N1bWVudC5hbGwKCXZhciBuczY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgJiYgIWRvY3VtZW50LmFsbAoJdmFyIGVuYWJsZXRpcD1mYWxzZQoJaWYgKGllfHxuczYpCgl2YXIgdGlwb2JqPWRvY3VtZW50LmFsbD8gZG9jdW1lbnQuYWxsWyJkaHRtbHRvb2x0aXAiXSA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGh0bWx0b29sdGlwIikgOiAiIgoKCWZ1bmN0aW9uIGlldHJ1ZWJvZHkoKXsKCXJldHVybiAoZG9jdW1lbnQuY29tcGF0TW9kZSAmJiBkb2N1bWVudC5jb21wYXRNb2RlIT0iQmFja0NvbXBhdCIpPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgOiBkb2N1bWVudC5ib2R5Cgl9CgoJZnVuY3Rpb24gZGRyaXZldGlwKHRoZXRleHQsIHRoZWNvbG9yLCB0aGV3aWR0aCl7CgkJaWYgKG5zNnx8aWUpewoJCQlpZiAodHlwZW9mIHRoZXdpZHRoIT0idW5kZWZpbmVkIikgdGlwb2JqLnN0eWxlLndpZHRoPXRoZXdpZHRoKyJweCIKCQkJaWYgKHR5cGVvZiB0aGVjb2xvciE9InVuZGVmaW5lZCIgJiYgdGhlY29sb3IhPSIiKSB0aXBvYmouc3R5bGUuYmFja2dyb3VuZENvbG9yPXRoZWNvbG9yCgkJCXRpcG9iai5pbm5lckhUTUw9dGhldGV4dAoJCQllbmFibGV0aXA9dHJ1ZQoJCQlyZXR1cm4gZmFsc2UKCQl9Cgl9CgoJZnVuY3Rpb24gcG9zaXRpb250aXAoZSl7CgkJaWYgKGVuYWJsZXRpcCl7CgkJCXZhciBjdXJYPShuczYpP2UucGFnZVggOiBldmVudC54K2lldHJ1ZWJvZHkoKS5zY3JvbGxMZWZ0OwoJCQl2YXIgY3VyWT0obnM2KT9lLnBhZ2VZIDogZXZlbnQueStpZXRydWVib2R5KCkuc2Nyb2xsVG9wOwoJCQkvL0ZpbmQgb3V0IGhvdyBjbG9zZSB0aGUgbW91c2UgaXMgdG8gdGhlIGNvcm5lciBvZiB0aGUgd2luZG93CgkJCXZhciByaWdodGVkZ2U9aWUmJiF3aW5kb3cub3BlcmE/IGlldHJ1ZWJvZHkoKS5jbGllbnRXaWR0aC1ldmVudC5jbGllbnRYLW9mZnNldHhwb2ludCA6IHdpbmRvdy5pbm5lcldpZHRoLWUuY2xpZW50WC1vZmZzZXR4cG9pbnQtMjAKCQkJdmFyIGJvdHRvbWVkZ2U9aWUmJiF3aW5kb3cub3BlcmE/IGlldHJ1ZWJvZHkoKS5jbGllbnRIZWlnaHQtZXZlbnQuY2xpZW50WS1vZmZzZXR5cG9pbnQgOiB3aW5kb3cuaW5uZXJIZWlnaHQtZS5jbGllbnRZLW9mZnNldHlwb2ludC0yMAoKCQkJdmFyIGxlZnRlZGdlPShvZmZzZXR4cG9pbnQ8MCk/IG9mZnNldHhwb2ludCooLTEpIDogLTEwMDAKCQkJLy9pZiB0aGUgaG9yaXpvbnRhbCBkaXN0YW5jZSBpc24ndCBlbm91Z2ggdG8gYWNjb21vZGF0ZSB0aGUgd2lkdGggb2YgdGhlIGNvbnRleHQgbWVudQoJCQlpZiAocmlnaHRlZGdlPHRpcG9iai5vZmZzZXRXaWR0aCkKCQkJCS8vbW92ZSB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgbWVudSB0byB0aGUgbGVmdCBieSBpdCdzIHdpZHRoCgkJCQl0aXBvYmouc3R5bGUubGVmdD1pZT8gaWV0cnVlYm9keSgpLnNjcm9sbExlZnQrZXZlbnQuY2xpZW50WC10aXBvYmoub2Zmc2V0V2lkdGgrInB4IiA6IHdpbmRvdy5wYWdlWE9mZnNldCtlLmNsaWVudFgtdGlwb2JqLm9mZnNldFdpZHRoKyJweCIKCQkJZWxzZSBpZiAoY3VyWDxsZWZ0ZWRnZSkKCQkJCXRpcG9iai5zdHlsZS5sZWZ0PSI1cHgiCgkJCWVsc2UKCQkJCS8vcG9zaXRpb24gdGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIG1lbnUgd2hlcmUgdGhlIG1vdXNlIGlzIHBvc2l0aW9uZWQKCQkJCXRpcG9iai5zdHlsZS5sZWZ0PWN1clgrb2Zmc2V0eHBvaW50KyJweCIKCgkJCS8vc2FtZSBjb25jZXB0IHdpdGggdGhlIHZlcnRpY2FsIHBvc2l0aW9uCgkJCWlmIChib3R0b21lZGdlPHRpcG9iai5vZmZzZXRIZWlnaHQpCgkJCQl0aXBvYmouc3R5bGUudG9wPWllPyBpZXRydWVib2R5KCkuc2Nyb2xsVG9wK2V2ZW50LmNsaWVudFktdGlwb2JqLm9mZnNldEhlaWdodC1vZmZzZXR5cG9pbnQrInB4IiA6IHdpbmRvdy5wYWdlWU9mZnNldCtlLmNsaWVudFktdGlwb2JqLm9mZnNldEhlaWdodC1vZmZzZXR5cG9pbnQrInB4IgoJCQllbHNlCgkJCQl0aXBvYmouc3R5bGUudG9wPWN1clkrb2Zmc2V0eXBvaW50KyJweCIKCgkJCXRpcG9iai5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIgoJCX0KCX0KCglmdW5jdGlvbiBoaWRlZGRyaXZldGlwKCl7CgkJaWYgKG5zNnx8aWUpewoJCQllbmFibGV0aXA9ZmFsc2UKCQkJdGlwb2JqLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIKCQkJdGlwb2JqLnN0eWxlLmxlZnQ9Ii0xMDAwcHgiCgkJCXRpcG9iai5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9JycKCQkJdGlwb2JqLnN0eWxlLndpZHRoPScnCgkJfQoJCXdpbmRvdy5zdGF0dXM9Jyc7IAoJfQoJZG9jdW1lbnQub25tb3VzZW1vdmU9cG9zaXRpb250aXAK