# -*- coding: utf-8 -*- '''Здесь описываются различные переменные''' from base64 import b64decode html = '''\ {title} {body} ''' style = '''\ body { font: 13px Arial, Verdana, Helvetica, sans-serif; text-align: center; } @media screen { body { padding: 1em 1em 1em 21em; font-family: "Trebuchet MS", Trebuchet, Verdana, Arial, Helvetica, sans-serif; font-size: 76%; } div.document, div.footer { width: 45em; background-color: white; } } @media print { div.document, div.footer { width: auto; padding-left: 0px; } div.sidemenu { display: none; } input { display: none; }; } input { border: 1px solid #003399; padding: 0 2px;; margin-bottom: 0.3em; font-size: 85%; } select { font-size: 10px ; margin-left:0.5em; font-family: "Trebuchet MS", Trebuchet, Verdana, Arial, Helvetica, sans-serif; font-size: 90%; } option { background:#C5D9FF; color:#003399; } div.document, div.footer, td { margin: 1em auto 1em auto; color: #222; } div.document, td { text-align: left; } div.footer { text-align: center; font-size: 70%; } /*** TOC ***/ div.contents.topic ul { margin-top: 0px; } div.contents.topic ul > li { text-decoration: none; line-height: 1.2em; } div.contents.topic > p > a { text-decoration: none; } /*** side menu ***/ div.sidemenu { position: absolute; top: 0px; left: 0px; width: 24em; font-size: 10px; text-align: left; border-right: groove gray; border-bottom: groove gray; padding-right: 1ex; background: #FFFAFA url(/menu_img) no-repeat top right; } html > body div.sidemenu { /* ignored by IE -> everyone else knows 'fixed', right? */ position: fixed; } div.sidemenu span.section.title { line-height: 1.2em; font-size: 130%; } div.sidemenu ul.menu.current li { color: #CC0000; } div.sidemenu ul.menu.current > li > a { color: #CC0000; } div.sidemenu ul.menu.current ul.submenu { display: block; } div.sidemenu ul.menu.foreign ul.submenu li { padding-top: 2px; padding-bottom: 2px; } div.sidemenu ul.menu.foreign li.menu:hover ul.submenu { display: block; position: absolute; border: groove #990000; padding: 1ex 1ex 1ex 3ex; margin-top: 0px; margin-left: 4em; margin-right: -20em; color: #990000; background-color: white; } div.sidemenu ul.submenu { display: none; } div.sidemenu ul { line-height: 1em; margin: 1ex; padding-left: 1em; } /*** headings ***/ h1.title { background: url(title_img.png) no-repeat; padding: 20px 0 0 180px; height: 60px; font-size: 200%; } h1.title, h1 a, h2 a, h3 a { color: #666; font-weight: bold; font-family: Helvetica, sans-serif; } @media screen { div.section > h1:before { margin-left: -2ex; color: #CC0000; content: "\00BB" " "; } } h1 { font-size: 150%; } h2 { font-size: 130%; } h3 { font-size: 110%; } /*** content ***/ a, a:visited { background-color: transparent; /*** font-weight: bold; ***/ color: Black; text-decoration: none; } p a:active, ul a:active, td a:active{ color: Red; } p a:hover, ul a:hover, td a:hover { text-decoration: underline; } p, table, tr, td { /*margin: 0.5em 0em 1em 0em;*/ text-align: justify; line-height: 1.5em; margin: 0.5em 0em 0em 0em; } div.document td { font-size: 13px ; } td { font-size: 13px ; } th.docinfo-name { padding-left: 3ex; text-align: right; font-weight: bold; } hr { clear: both; height: 1px; color: #8CACBB; background-color: transparent; } dt { line-height: 1.5em; margin-left: 1em; } dt:before { content: "\00BB" " "; } ul { line-height: 1.5em; margin-left: 1em; } ol { line-height: 1.5em; margin-left: 0em; } blockquote { font-family: Times, "Times New Roman", serif; font-style: italic; } div.eyecatcher, p.eyecatcher { font-family: Times, "Times New Roman", serif; text-align: center; font-size: 140%; line-height: 1.2em; margin-left: 9em; margin-right: 9em; } div.pagequote { position: absolute; top: 0px; right: 0px; padding: 10px 10px 0 0; text-align: right; font-size: 80%; color: #990000; } div.pagequote .reference { font-size: 140%; } html > .pagequote { /* ignored by IE -> everyone else knows 'fixed', right? */ position: fixed; } code { color: Black; background-color: #f0f0f0; font-family: "Courier New", Courier, monospace; } pre { padding: 0.5em; border: 1px solid #8cacbb; color: Black; background-color: #f0f0f0; font-family: "Courier New", Courier, monospace; } ''' m_img = '''\ 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 mWBb8hAIAAAAAElFTkSuQmCC''' body = '''\
{menu}
{document}''' menu_container = '''\ ''' menu = '''\
  • {name}
  • ''' submenu = '''\ ''' submenuitem_container = '''\ ''' submenuitem = '''\ ''' form_minisearch = '''\ ''' form_auth = '''\ ''' form_user = '''\ ''' login_body = '''

    В графе "Авторизация" введите имя пользовотеля и пароль.

    ''' user_body = '''\
    {groups}
    ← Обратно в список пользователей
    ''' group_body = '''\
    {groups}
    ← Обратно в список групп
    ''' logged_on_boddy = '''

    Вы уже вошли в систему под пользователем [{username}].

    ''' access_denied_body = '''

    Не хватает прав доступа.

    ''' form_upload = '''\

    Путь для загрузки в раздел "{catname}".

    ''' back_href = 'Назад' index_html = '''

    Добро пожаловать в архив.

    ''' nicedit_html1 = '''\ ''' nicedit_html2 = '''\
    {modify_doc} {textarea}

    Имя документа:

    ← Обратно в раздел "{catname}"
    ''' nicedit_textarea = '''''' nicedit_js = r'''\ LyogTmljRWRpdCAtIE1pY3JvIElubGluZSBXWVNJV1lHCiAqIENvcHlyaWdodCAyMDA3LTIwMDgg QnJpYW4gS2lyY2hvZmYKICoKICogTmljRWRpdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIE1JVCBsaWNlbnNlCiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHZpc2l0IGh0dHA6 Ly9uaWNlZGl0LmNvbS8KICogRG8gbm90IHJlbW92ZSB0aGlzIGNvcHlyaWdodCBtZXNzYWdlCiAq Lwp2YXIgYmtFeHRlbmQgPSBmdW5jdGlvbigpewoJdmFyIGFyZ3MgPSBhcmd1bWVudHM7CglpZiAo YXJncy5sZW5ndGggPT0gMSkgYXJncyA9IFt0aGlzLCBhcmdzWzBdXTsKCWZvciAodmFyIHByb3Ag aW4gYXJnc1sxXSkgYXJnc1swXVtwcm9wXSA9IGFyZ3NbMV1bcHJvcF07CglyZXR1cm4gYXJnc1sw XTsKfTsKZnVuY3Rpb24gYmtDbGFzcygpIHsgfQpia0NsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3Qg PSBmdW5jdGlvbigpIHt9Owpia0NsYXNzLmV4dGVuZCA9IGZ1bmN0aW9uKGRlZikgewogIHZhciBj bGFzc0RlZiA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoYXJndW1lbnRzWzBdICE9PSBia0NsYXNz KSB7IHJldHVybiB0aGlzLmNvbnN0cnVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9CiAgfTsK ICB2YXIgcHJvdG8gPSBuZXcgdGhpcyhia0NsYXNzKTsKICBia0V4dGVuZChwcm90byxkZWYpOwog IGNsYXNzRGVmLnByb3RvdHlwZSA9IHByb3RvOwogIGNsYXNzRGVmLmV4dGVuZCA9IHRoaXMuZXh0 ZW5kOwogIHJldHVybiBjbGFzc0RlZjsKfTsKCnZhciBia0VsZW1lbnQgPSBia0NsYXNzLmV4dGVu ZCh7Cgljb25zdHJ1Y3QgOiBmdW5jdGlvbihlbG0sZCkgewoJCWlmKHR5cGVvZihlbG0pID09ICJz dHJpbmciKSB7CgkJCWVsbSA9IChkIHx8IGRvY3VtZW50KS5jcmVhdGVFbGVtZW50KGVsbSk7CgkJ fQoJCWVsbSA9ICRCSyhlbG0pOwoJCXJldHVybiBlbG07Cgl9LAoKCWFwcGVuZFRvIDogZnVuY3Rp b24oZWxtKSB7CgkJZWxtLmFwcGVuZENoaWxkKHRoaXMpOwoJCXJldHVybiB0aGlzOwoJfSwKCglh cHBlbmRCZWZvcmUgOiBmdW5jdGlvbihlbG0pIHsKCQllbG0ucGFyZW50Tm9kZS5pbnNlcnRCZWZv cmUodGhpcyxlbG0pOwoJCXJldHVybiB0aGlzOwoJfSwKCglhZGRFdmVudCA6IGZ1bmN0aW9uKHR5 cGUsIGZuKSB7CgkJYmtMaWIuYWRkRXZlbnQodGhpcyx0eXBlLGZuKTsKCQlyZXR1cm4gdGhpczsK CX0sCgoJc2V0Q29udGVudCA6IGZ1bmN0aW9uKGMpIHsKCQl0aGlzLmlubmVySFRNTCA9IGM7CgkJ cmV0dXJuIHRoaXM7Cgl9LAoKCXBvcyA6IGZ1bmN0aW9uKCkgewoJCXZhciBjdXJsZWZ0ID0gY3Vy dG9wID0gMDsKCQl2YXIgbyA9IG9iaiA9IHRoaXM7CgkJaWYgKG9iai5vZmZzZXRQYXJlbnQpIHsK CQkJZG8gewoJCQkJY3VybGVmdCArPSBvYmoub2Zmc2V0TGVmdDsKCQkJCWN1cnRvcCArPSBvYmou b2Zmc2V0VG9wOwoJCQl9IHdoaWxlIChvYmogPSBvYmoub2Zmc2V0UGFyZW50KTsKCQl9CgkJdmFy IGIgPSAoIXdpbmRvdy5vcGVyYSkgPyBwYXJzZUludCh0aGlzLmdldFN0eWxlKCdib3JkZXItd2lk dGgnKSB8fCB0aGlzLnN0eWxlLmJvcmRlcikgfHwgMCA6IDA7CgkJcmV0dXJuIFtjdXJsZWZ0K2Is Y3VydG9wK2IrdGhpcy5vZmZzZXRIZWlnaHRdOwoJfSwKCglub1NlbGVjdCA6IGZ1bmN0aW9uKCkg ewoJCWJrTGliLm5vU2VsZWN0KHRoaXMpOwoJCXJldHVybiB0aGlzOwoJfSwKCglwYXJlbnRUYWcg OiBmdW5jdGlvbih0KSB7CgkJdmFyIGVsbSA9IHRoaXM7CgkJIGRvIHsKCQkJaWYoZWxtICYmIGVs bS5ub2RlTmFtZSAmJiBlbG0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PSB0KSB7CgkJCQlyZXR1 cm4gZWxtOwoJCQl9CgkJCWVsbSA9IGVsbS5wYXJlbnROb2RlOwoJCX0gd2hpbGUoZWxtKTsKCQly ZXR1cm4gZmFsc2U7Cgl9LAoKCWhhc0NsYXNzIDogZnVuY3Rpb24oY2xzKSB7CgkJcmV0dXJuIHRo aXMuY2xhc3NOYW1lLm1hdGNoKG5ldyBSZWdFeHAoJyhcXHN8XiluaWNFZGl0LScrY2xzKycoXFxz fCQpJykpOwoJfSwKCglhZGRDbGFzcyA6IGZ1bmN0aW9uKGNscykgewoJCWlmICghdGhpcy5oYXND bGFzcyhjbHMpKSB7IHRoaXMuY2xhc3NOYW1lICs9ICIgbmljRWRpdC0iK2NscyB9OwoJCXJldHVy biB0aGlzOwoJfSwKCglyZW1vdmVDbGFzcyA6IGZ1bmN0aW9uKGNscykgewoJCWlmICh0aGlzLmhh c0NsYXNzKGNscykpIHsKCQkJdGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZS5yZXBsYWNl KG5ldyBSZWdFeHAoJyhcXHN8XiluaWNFZGl0LScrY2xzKycoXFxzfCQpJyksJyAnKTsKCQl9CgkJ cmV0dXJuIHRoaXM7Cgl9LAoKCXNldFN0eWxlIDogZnVuY3Rpb24oc3QpIHsKCQl2YXIgZWxtU3R5 bGUgPSB0aGlzLnN0eWxlOwoJCWZvcih2YXIgaXRtIGluIHN0KSB7CgkJCXN3aXRjaChpdG0pIHsK CQkJCWNhc2UgJ2Zsb2F0JzoKCQkJCQllbG1TdHlsZVsnY3NzRmxvYXQnXSA9IGVsbVN0eWxlWydz dHlsZUZsb2F0J10gPSBzdFtpdG1dOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnb3BhY2l0eSc6CgkJ CQkJZWxtU3R5bGUub3BhY2l0eSA9IHN0W2l0bV07CgkJCQkJZWxtU3R5bGUuZmlsdGVyID0gImFs cGhhKG9wYWNpdHk9IiArIE1hdGgucm91bmQoc3RbaXRtXSoxMDApICsgIikiOwoJCQkJCWJyZWFr OwoJCQkJY2FzZSAnY2xhc3NOYW1lJzoKCQkJCQl0aGlzLmNsYXNzTmFtZSA9IHN0W2l0bV07CgkJ CQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCS8vaWYoZG9jdW1lbnQuY29tcGF0TW9kZSB8fCBp dG0gIT0gImN1cnNvciIpIHsgLy8gTmFzdHkgV29ya2Fyb3VuZCBmb3IgSUUgNS41CgkJCQkJCWVs bVN0eWxlW2l0bV0gPSBzdFtpdG1dOwoJCQkJCS8vfQoJCQl9CgkJfQoJCXJldHVybiB0aGlzOwoJ fSwKCglnZXRTdHlsZSA6IGZ1bmN0aW9uKCBjc3NSdWxlLCBkICkgewoJCXZhciBkb2MgPSAoIWQp ID8gZG9jdW1lbnQuZGVmYXVsdFZpZXcgOiBkOwoJCWlmKHRoaXMubm9kZVR5cGUgPT0gMSkKCQly ZXR1cm4gKGRvYyAmJiBkb2MuZ2V0Q29tcHV0ZWRTdHlsZSkgPyBkb2MuZ2V0Q29tcHV0ZWRTdHls ZSggdGhpcywgbnVsbCApLmdldFByb3BlcnR5VmFsdWUoY3NzUnVsZSkgOiB0aGlzLmN1cnJlbnRT dHlsZVsgYmtMaWIuY2FtZWxpemUoY3NzUnVsZSkgXTsKCX0sCgoJcmVtb3ZlIDogZnVuY3Rpb24o KSB7CgkJdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpOwoJCXJldHVybiB0aGlzOwoJ fSwKCglzZXRBdHRyaWJ1dGVzIDogZnVuY3Rpb24oYXQpIHsKCQlmb3IodmFyIGl0bSBpbiBhdCkg ewoJCQl0aGlzW2l0bV0gPSBhdFtpdG1dOwoJCX0KCQlyZXR1cm4gdGhpczsKCX0KfSk7Cgp2YXIg YmtMaWIgPSB7Cglpc01TSUUgOiAobmF2aWdhdG9yLmFwcFZlcnNpb24uaW5kZXhPZigiTVNJRSIp ICE9IC0xKSwKCglhZGRFdmVudCA6IGZ1bmN0aW9uKG9iaiwgdHlwZSwgZm4pIHsKCQkob2JqLmFk ZEV2ZW50TGlzdGVuZXIpID8gb2JqLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGZuLCBmYWxzZSAp IDogb2JqLmF0dGFjaEV2ZW50KCJvbiIrdHlwZSwgZm4pOwoJfSwKCgl0b0FycmF5IDogZnVuY3Rp b24oaXRlcmFibGUpIHsKCQl2YXIgbGVuZ3RoID0gaXRlcmFibGUubGVuZ3RoLCByZXN1bHRzID0g bmV3IEFycmF5KGxlbmd0aCk7CiAgICAJd2hpbGUgKGxlbmd0aC0tKSB7IHJlc3VsdHNbbGVuZ3Ro XSA9IGl0ZXJhYmxlW2xlbmd0aF0gfTsKICAgIAlyZXR1cm4gcmVzdWx0czsKCX0sCgoJbm9TZWxl Y3QgOiBmdW5jdGlvbihlbGVtZW50KSB7CgkJaWYoZWxlbWVudC5zZXRBdHRyaWJ1dGUgJiYgZWxl bWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9ICdpbnB1dCcgJiYgZWxlbWVudC5ub2RlTmFt ZS50b0xvd2VyQ2FzZSgpICE9ICd0ZXh0YXJlYScpIHsKCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUo J3Vuc2VsZWN0YWJsZScsJ29uJyk7CgkJfQoJCWZvcih2YXIgaT0wO2k8ZWxlbWVudC5jaGlsZE5v ZGVzLmxlbmd0aDtpKyspIHsKCQkJYmtMaWIubm9TZWxlY3QoZWxlbWVudC5jaGlsZE5vZGVzW2ld KTsKCQl9Cgl9LAoJY2FtZWxpemUgOiBmdW5jdGlvbihzKSB7CgkJcmV0dXJuIHMucmVwbGFjZSgv XC0oLikvZywgZnVuY3Rpb24obSwgbCl7cmV0dXJuIGwudG9VcHBlckNhc2UoKX0pOwoJfSwKCWlu QXJyYXkgOiBmdW5jdGlvbihhcnIsaXRlbSkgewoJICAgIHJldHVybiAoYmtMaWIuc2VhcmNoKGFy cixpdGVtKSAhPSBudWxsKTsKCX0sCglzZWFyY2ggOiBmdW5jdGlvbihhcnIsaXRtKSB7CgkJZm9y KHZhciBpPTA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKCQkJaWYoYXJyW2ldID09IGl0bSkKCQkJ CXJldHVybiBpOwoJCX0KCQlyZXR1cm4gbnVsbDsKCX0sCgljYW5jZWxFdmVudCA6IGZ1bmN0aW9u KGUpIHsKCQllID0gZSB8fCB3aW5kb3cuZXZlbnQ7CgkJaWYoZS5wcmV2ZW50RGVmYXVsdCAmJiBl LnN0b3BQcm9wYWdhdGlvbikgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCWUuc3RvcFByb3Bh Z2F0aW9uKCk7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0sCglkb21Mb2FkIDogW10sCglkb21Mb2Fk ZWQgOiBmdW5jdGlvbigpIHsKCQlpZiAoYXJndW1lbnRzLmNhbGxlZS5kb25lKSByZXR1cm47CgkJ YXJndW1lbnRzLmNhbGxlZS5kb25lID0gdHJ1ZTsKCQlmb3IgKGkgPSAwO2kgPCBia0xpYi5kb21M b2FkLmxlbmd0aDtpKyspIGJrTGliLmRvbUxvYWRbaV0oKTsKCX0sCglvbkRvbUxvYWRlZCA6IGZ1 bmN0aW9uKGZpcmVUaGlzKSB7CgkJdGhpcy5kb21Mb2FkLnB1c2goZmlyZVRoaXMpOwoJCWlmIChk b2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7CgkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIo IkRPTUNvbnRlbnRMb2FkZWQiLCBia0xpYi5kb21Mb2FkZWQsIG51bGwpOwoJCX0gZWxzZSBpZihi a0xpYi5pc01TSUUpIHsKCQkJZG9jdW1lbnQud3JpdGUoIjxzdHlsZT4ubmljRWRpdC1tYWluIHAg eyBtYXJnaW46IDA7IH08L3N0eWxlPjxzY3IiKyJpcHQgaWQ9X19pZV9vbmxvYWQgZGVmZXIgIiAr ICgobG9jYXRpb24ucHJvdG9jb2wgPT0gImh0dHBzOiIpID8gInNyYz0namF2YXNjcmlwdDp2b2lk KDApJyIgOiAic3JjPS8vMCIpICsgIj48XC9zY3IiKyJpcHQ+Iik7CgkJCSRCSygiX19pZV9vbmxv YWQiKS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKCQkJICAgIGlmICh0aGlzLnJl YWR5U3RhdGUgPT0gImNvbXBsZXRlIil7YmtMaWIuZG9tTG9hZGVkKCk7fQoJCQl9OwoJCX0KCSAg ICB3aW5kb3cub25sb2FkID0gYmtMaWIuZG9tTG9hZGVkOwoJfQp9OwoKZnVuY3Rpb24gJEJLKGVs bSkgewoJaWYodHlwZW9mKGVsbSkgPT0gInN0cmluZyIpIHsKCQllbG0gPSBkb2N1bWVudC5nZXRF bGVtZW50QnlJZChlbG0pOwoJfQoJcmV0dXJuIChlbG0gJiYgIWVsbS5hcHBlbmRUbykgPyBia0V4 dGVuZChlbG0sYmtFbGVtZW50LnByb3RvdHlwZSkgOiBlbG07Cn0KCnZhciBia0V2ZW50ID0gewoJ YWRkRXZlbnQgOiBmdW5jdGlvbihldlR5cGUsIGV2RnVuYykgewoJCWlmKGV2RnVuYykgewoJCQl0 aGlzLmV2ZW50TGlzdCA9IHRoaXMuZXZlbnRMaXN0IHx8IHt9OwoJCQl0aGlzLmV2ZW50TGlzdFtl dlR5cGVdID0gdGhpcy5ldmVudExpc3RbZXZUeXBlXSB8fCBbXTsKCQkJdGhpcy5ldmVudExpc3Rb ZXZUeXBlXS5wdXNoKGV2RnVuYyk7CgkJfQoJCXJldHVybiB0aGlzOwoJfSwKCWZpcmVFdmVudCA6 IGZ1bmN0aW9uKCkgewoJCXZhciBhcmdzID0gYmtMaWIudG9BcnJheShhcmd1bWVudHMpLCBldlR5 cGUgPSBhcmdzLnNoaWZ0KCk7CgkJaWYodGhpcy5ldmVudExpc3QgJiYgdGhpcy5ldmVudExpc3Rb ZXZUeXBlXSkgewoJCQlmb3IodmFyIGk9MDtpPHRoaXMuZXZlbnRMaXN0W2V2VHlwZV0ubGVuZ3Ro O2krKykgewoJCQkJdGhpcy5ldmVudExpc3RbZXZUeXBlXVtpXS5hcHBseSh0aGlzLGFyZ3MpOwoJ CQl9CgkJfQoJfQp9OwoKZnVuY3Rpb24gX18ocykgewoJcmV0dXJuIHM7Cn0KCkZ1bmN0aW9uLnBy b3RvdHlwZS5jbG9zdXJlID0gZnVuY3Rpb24oKSB7CiAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJn cyA9IGJrTGliLnRvQXJyYXkoYXJndW1lbnRzKSwgb2JqID0gYXJncy5zaGlmdCgpOwogIHJldHVy biBmdW5jdGlvbigpIHsgaWYodHlwZW9mKGJrTGliKSAhPSAndW5kZWZpbmVkJykgeyByZXR1cm4g X19tZXRob2QuYXBwbHkob2JqLGFyZ3MuY29uY2F0KGJrTGliLnRvQXJyYXkoYXJndW1lbnRzKSkp OyB9IH07Cn0KCkZ1bmN0aW9uLnByb3RvdHlwZS5jbG9zdXJlTGlzdGVuZXIgPSBmdW5jdGlvbigp IHsKICAJdmFyIF9fbWV0aG9kID0gdGhpcywgYXJncyA9IGJrTGliLnRvQXJyYXkoYXJndW1lbnRz KSwgb2JqZWN0ID0gYXJncy5zaGlmdCgpOwogIAlyZXR1cm4gZnVuY3Rpb24oZSkgewogIAllID0g ZSB8fCB3aW5kb3cuZXZlbnQ7CiAgCWlmKGUudGFyZ2V0KSB7IHZhciB0YXJnZXQgPSBlLnRhcmdl dDsgfSBlbHNlIHsgdmFyIHRhcmdldCA9ICBlLnNyY0VsZW1lbnQgfTsKCSAgCXJldHVybiBfX21l dGhvZC5hcHBseShvYmplY3QsIFtlLHRhcmdldF0uY29uY2F0KGFyZ3MpICk7Cgl9Owp9CgoKLyog U1RBUlQgQ09ORklHICovCgp2YXIgbmljRWRpdG9yQ29uZmlnID0gYmtDbGFzcy5leHRlbmQoewoJ YnV0dG9ucyA6IHsKCQknYm9sZCcgOiB7bmFtZSA6IF9fKCdDbGljayB0byBCb2xkJyksIGNvbW1h bmQgOiAnQm9sZCcsIHRhZ3MgOiBbJ0InLCdTVFJPTkcnXSwgY3NzIDogeydmb250LXdlaWdodCcg OiAnYm9sZCd9LCBrZXkgOiAnYid9LAoJCSdpdGFsaWMnIDoge25hbWUgOiBfXygnQ2xpY2sgdG8g SXRhbGljJyksIGNvbW1hbmQgOiAnSXRhbGljJywgdGFncyA6IFsnRU0nLCdJJ10sIGNzcyA6IHsn Zm9udC1zdHlsZScgOiAnaXRhbGljJ30sIGtleSA6ICdpJ30sCgkJJ3VuZGVybGluZScgOiB7bmFt ZSA6IF9fKCdDbGljayB0byBVbmRlcmxpbmUnKSwgY29tbWFuZCA6ICdVbmRlcmxpbmUnLCB0YWdz IDogWydVJ10sIGNzcyA6IHsndGV4dC1kZWNvcmF0aW9uJyA6ICd1bmRlcmxpbmUnfSwga2V5IDog J3UnfSwKCQknbGVmdCcgOiB7bmFtZSA6IF9fKCdMZWZ0IEFsaWduJyksIGNvbW1hbmQgOiAnanVz dGlmeWxlZnQnLCBub0FjdGl2ZSA6IHRydWV9LAoJCSdjZW50ZXInIDoge25hbWUgOiBfXygnQ2Vu dGVyIEFsaWduJyksIGNvbW1hbmQgOiAnanVzdGlmeWNlbnRlcicsIG5vQWN0aXZlIDogdHJ1ZX0s CgkJJ3JpZ2h0JyA6IHtuYW1lIDogX18oJ1JpZ2h0IEFsaWduJyksIGNvbW1hbmQgOiAnanVzdGlm eXJpZ2h0Jywgbm9BY3RpdmUgOiB0cnVlfSwKCQknanVzdGlmeScgOiB7bmFtZSA6IF9fKCdKdXN0 aWZ5IEFsaWduJyksIGNvbW1hbmQgOiAnanVzdGlmeWZ1bGwnLCBub0FjdGl2ZSA6IHRydWV9LAoJ CSdvbCcgOiB7bmFtZSA6IF9fKCdJbnNlcnQgT3JkZXJlZCBMaXN0JyksIGNvbW1hbmQgOiAnaW5z ZXJ0b3JkZXJlZGxpc3QnLCB0YWdzIDogWydPTCddfSwKCQkndWwnIDogCXtuYW1lIDogX18oJ0lu c2VydCBVbm9yZGVyZWQgTGlzdCcpLCBjb21tYW5kIDogJ2luc2VydHVub3JkZXJlZGxpc3QnLCB0 YWdzIDogWydVTCddfSwKCQknc3Vic2NyaXB0JyA6IHtuYW1lIDogX18oJ0NsaWNrIHRvIFN1YnNj cmlwdCcpLCBjb21tYW5kIDogJ3N1YnNjcmlwdCcsIHRhZ3MgOiBbJ1NVQiddfSwKCQknc3VwZXJz Y3JpcHQnIDoge25hbWUgOiBfXygnQ2xpY2sgdG8gU3VwZXJzY3JpcHQnKSwgY29tbWFuZCA6ICdz dXBlcnNjcmlwdCcsIHRhZ3MgOiBbJ1NVUCddfSwKCQknc3RyaWtldGhyb3VnaCcgOiB7bmFtZSA6 IF9fKCdDbGljayB0byBTdHJpa2UgVGhyb3VnaCcpLCBjb21tYW5kIDogJ3N0cmlrZVRocm91Z2gn LCBjc3MgOiB7J3RleHQtZGVjb3JhdGlvbicgOiAnbGluZS10aHJvdWdoJ319LAoJCSdyZW1vdmVm b3JtYXQnIDoge25hbWUgOiBfXygnUmVtb3ZlIEZvcm1hdHRpbmcnKSwgY29tbWFuZCA6ICdyZW1v dmVmb3JtYXQnLCBub0FjdGl2ZSA6IHRydWV9LAoJCSdpbmRlbnQnIDoge25hbWUgOiBfXygnSW5k ZW50IFRleHQnKSwgY29tbWFuZCA6ICdpbmRlbnQnLCBub0FjdGl2ZSA6IHRydWV9LAoJCSdvdXRk ZW50JyA6IHtuYW1lIDogX18oJ1JlbW92ZSBJbmRlbnQnKSwgY29tbWFuZCA6ICdvdXRkZW50Jywg bm9BY3RpdmUgOiB0cnVlfSwKCQknaHInIDoge25hbWUgOiBfXygnSG9yaXpvbnRhbCBSdWxlJyks IGNvbW1hbmQgOiAnaW5zZXJ0SG9yaXpvbnRhbFJ1bGUnLCBub0FjdGl2ZSA6IHRydWV9Cgl9LAoJ aWNvbnNQYXRoIDogJy4uL25pY0VkaXRvckljb25zLmdpZicsCglidXR0b25MaXN0IDogWydzYXZl JywnYm9sZCcsJ2l0YWxpYycsJ3VuZGVybGluZScsJ2xlZnQnLCdjZW50ZXInLCdyaWdodCcsJ2p1 c3RpZnknLCdvbCcsJ3VsJywnZm9udFNpemUnLCdmb250RmFtaWx5JywnZm9udEZvcm1hdCcsJ2lu ZGVudCcsJ291dGRlbnQnLCdpbWFnZScsJ3VwbG9hZCcsJ2xpbmsnLCd1bmxpbmsnLCdmb3JlY29s b3InLCdiZ2NvbG9yJ10sCglpY29uTGlzdCA6IHsieGh0bWwiOjEsImJnY29sb3IiOjIsImZvcmVj b2xvciI6MywiYm9sZCI6NCwiY2VudGVyIjo1LCJociI6NiwiaW5kZW50Ijo3LCJpdGFsaWMiOjgs Imp1c3RpZnkiOjksImxlZnQiOjEwLCJvbCI6MTEsIm91dGRlbnQiOjEyLCJyZW1vdmVmb3JtYXQi OjEzLCJyaWdodCI6MTQsInNhdmUiOjI1LCJzdHJpa2V0aHJvdWdoIjoxNiwic3Vic2NyaXB0Ijox Nywic3VwZXJzY3JpcHQiOjE4LCJ1bCI6MTksInVuZGVybGluZSI6MjAsImltYWdlIjoyMSwibGlu ayI6MjIsInVubGluayI6MjMsImNsb3NlIjoyNCwiYXJyb3ciOjI2LCJ1cGxvYWQiOjI3fSwKCWlu aXRXaXRoTGluZUJyZWFrOiB0cnVlCn0pOwovKiBFTkQgQ09ORklHICovCgoKdmFyIG5pY0VkaXRv cnMgPSB7CgluaWNQbHVnaW5zIDogW10sCgllZGl0b3JzIDogW10sCgoJcmVnaXN0ZXJQbHVnaW4g OiBmdW5jdGlvbihwbHVnaW4sb3B0aW9ucykgewoJCXRoaXMubmljUGx1Z2lucy5wdXNoKHtwIDog cGx1Z2luLCBvIDogb3B0aW9uc30pOwoJfSwKCglhbGxUZXh0QXJlYXMgOiBmdW5jdGlvbihuaWNP cHRpb25zKSB7CgkJdmFyIHRleHRhcmVhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1l KCJ0ZXh0YXJlYSIpOwoJCWZvcih2YXIgaT0wO2k8dGV4dGFyZWFzLmxlbmd0aDtpKyspIHsKCQkJ bmljRWRpdG9ycy5lZGl0b3JzLnB1c2gobmV3IG5pY0VkaXRvcihuaWNPcHRpb25zKS5wYW5lbElu c3RhbmNlKHRleHRhcmVhc1tpXSkpOwoJCX0KCQlyZXR1cm4gbmljRWRpdG9ycy5lZGl0b3JzOwoJ fSwKCglmaW5kRWRpdG9yIDogZnVuY3Rpb24oZSkgewoJCXZhciBlZGl0b3JzID0gbmljRWRpdG9y cy5lZGl0b3JzOwoJCWZvcih2YXIgaT0wO2k8ZWRpdG9ycy5sZW5ndGg7aSsrKSB7CgkJCWlmKGVk aXRvcnNbaV0uaW5zdGFuY2VCeUlkKGUpKSB7CgkJCQlyZXR1cm4gZWRpdG9yc1tpXTsgLy8gciBp cyBhbiBpbnN0YW5jZSBvZiBuaWNFZGl0b3JJbnN0YW5jZSB0aGVyZWZvcmUgaXQgZG9lcyBub3Qg aGF2ZSByZW1vdmVJbnN0YW5jZSBvciByZW1vdmVQYW5lbCBtZXRob2RzCgkJCX0KCQl9Cgl9Cn07 CgoKdmFyIG5pY0VkaXRvciA9IGJrQ2xhc3MuZXh0ZW5kKHsKCWNvbnN0cnVjdCA6IGZ1bmN0aW9u KG8pIHsKCQl0aGlzLm9wdGlvbnMgPSBuZXcgbmljRWRpdG9yQ29uZmlnKCk7CgkJYmtFeHRlbmQo dGhpcy5vcHRpb25zLG8pOwoJCXRoaXMubmljSW5zdGFuY2VzID0gbmV3IEFycmF5KCk7CgkJdGhp cy5sb2FkZWRQbHVnaW5zID0gbmV3IEFycmF5KCk7CgoJCXZhciBwbHVnaW5zID0gbmljRWRpdG9y cy5uaWNQbHVnaW5zOwoJCWZvcih2YXIgaT0wO2k8cGx1Z2lucy5sZW5ndGg7aSsrKSB7CgkJCXRo aXMubG9hZGVkUGx1Z2lucy5wdXNoKG5ldyBwbHVnaW5zW2ldLnAodGhpcyxwbHVnaW5zW2ldLm8p KTsKCQl9CgkJbmljRWRpdG9ycy5lZGl0b3JzLnB1c2godGhpcyk7CgkJYmtMaWIuYWRkRXZlbnQo ZG9jdW1lbnQuYm9keSwnbW91c2Vkb3duJywgdGhpcy5zZWxlY3RDaGVjay5jbG9zdXJlTGlzdGVu ZXIodGhpcykgKTsKCX0sCgoJcGFuZWxJbnN0YW5jZSA6IGZ1bmN0aW9uKGUsbykgewoJCWUgPSB0 aGlzLmNoZWNrUmVwbGFjZSgkQksoZSkpOwoJCXZhciBwYW5lbEVsbSA9IG5ldyBia0VsZW1lbnQo J0RJVicpLnNldFN0eWxlKHt3aWR0aCA6IChwYXJzZUludChlLmdldFN0eWxlKCd3aWR0aCcpKSB8 fCBlLmNsaWVudFdpZHRoKSsncHgnfSkuYXBwZW5kQmVmb3JlKGUpOwoJCXRoaXMuc2V0UGFuZWwo cGFuZWxFbG0pOwoJCXJldHVybiB0aGlzLmFkZEluc3RhbmNlKGUsbyk7Cgl9LAoKCWNoZWNrUmVw bGFjZSA6IGZ1bmN0aW9uKGUpIHsKCQl2YXIgciA9IG5pY0VkaXRvcnMuZmluZEVkaXRvcihlKTsK CQlpZihyKSB7CgkJCXIucmVtb3ZlSW5zdGFuY2UoZSk7CgkJCXIucmVtb3ZlUGFuZWwoKTsKCQl9 CgkJcmV0dXJuIGU7Cgl9LAoKCWFkZEluc3RhbmNlIDogZnVuY3Rpb24oZSxvKSB7CgkJZSA9IHRo aXMuY2hlY2tSZXBsYWNlKCRCSyhlKSk7CgkJaWYoIGUuY29udGVudEVkaXRhYmxlIHx8ICEhd2lu ZG93Lm9wZXJhICkgewoJCQl2YXIgbmV3SW5zdGFuY2UgPSBuZXcgbmljRWRpdG9ySW5zdGFuY2Uo ZSxvLHRoaXMpOwoJCX0gZWxzZSB7CgkJCXZhciBuZXdJbnN0YW5jZSA9IG5ldyBuaWNFZGl0b3JJ RnJhbWVJbnN0YW5jZShlLG8sdGhpcyk7CgkJfQoJCXRoaXMubmljSW5zdGFuY2VzLnB1c2gobmV3 SW5zdGFuY2UpOwoJCXJldHVybiB0aGlzOwoJfSwKCglyZW1vdmVJbnN0YW5jZSA6IGZ1bmN0aW9u KGUpIHsKCQllID0gJEJLKGUpOwoJCXZhciBpbnN0YW5jZXMgPSB0aGlzLm5pY0luc3RhbmNlczsK CQlmb3IodmFyIGk9MDtpPGluc3RhbmNlcy5sZW5ndGg7aSsrKSB7CgkJCWlmKGluc3RhbmNlc1tp XS5lID09IGUpIHsKCQkJCWluc3RhbmNlc1tpXS5yZW1vdmUoKTsKCQkJCXRoaXMubmljSW5zdGFu Y2VzLnNwbGljZShpLDEpOwoJCQl9CgkJfQoJfSwKCglyZW1vdmVQYW5lbCA6IGZ1bmN0aW9uKGUp IHsKCQlpZih0aGlzLm5pY1BhbmVsKSB7CgkJCXRoaXMubmljUGFuZWwucmVtb3ZlKCk7CgkJCXRo aXMubmljUGFuZWwgPSBudWxsOwoJCX0KCX0sCgoJaW5zdGFuY2VCeUlkIDogZnVuY3Rpb24oZSkg ewoJCWUgPSAkQksoZSk7CgkJdmFyIGluc3RhbmNlcyA9IHRoaXMubmljSW5zdGFuY2VzOwoJCWZv cih2YXIgaT0wO2k8aW5zdGFuY2VzLmxlbmd0aDtpKyspIHsKCQkJaWYoaW5zdGFuY2VzW2ldLmUg PT0gZSkgewoJCQkJcmV0dXJuIGluc3RhbmNlc1tpXTsKCQkJfQoJCX0KCX0sCgoJc2V0UGFuZWwg OiBmdW5jdGlvbihlKSB7CgkJdGhpcy5uaWNQYW5lbCA9IG5ldyBuaWNFZGl0b3JQYW5lbCgkQkso ZSksdGhpcy5vcHRpb25zLHRoaXMpOwoJCXRoaXMuZmlyZUV2ZW50KCdwYW5lbCcsdGhpcy5uaWNQ YW5lbCk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCW5pY0NvbW1hbmQgOiBmdW5jdGlvbihjbWQsYXJn cykgewoJCWlmKHRoaXMuc2VsZWN0ZWRJbnN0YW5jZSkgewoJCQl0aGlzLnNlbGVjdGVkSW5zdGFu Y2UubmljQ29tbWFuZChjbWQsYXJncyk7CgkJfQoJfSwKCglnZXRJY29uIDogZnVuY3Rpb24oaWNv bk5hbWUsb3B0aW9ucykgewoJCXZhciBpY29uID0gdGhpcy5vcHRpb25zLmljb25MaXN0W2ljb25O YW1lXTsKCQl2YXIgZmlsZSA9IChvcHRpb25zLmljb25GaWxlcykgPyBvcHRpb25zLmljb25GaWxl c1tpY29uTmFtZV0gOiAnJzsKCQlyZXR1cm4ge2JhY2tncm91bmRJbWFnZSA6ICJ1cmwoJyIrKChp Y29uKSA/IHRoaXMub3B0aW9ucy5pY29uc1BhdGggOiBmaWxlKSsiJykiLCBiYWNrZ3JvdW5kUG9z aXRpb24gOiAoKGljb24pID8gKChpY29uLTEpKi0xOCkgOiAwKSsncHggMHB4J307Cgl9LAoKCXNl bGVjdENoZWNrIDogZnVuY3Rpb24oZSx0KSB7CgkJdmFyIGZvdW5kID0gZmFsc2U7CgkJZG97CgkJ CWlmKHQuY2xhc3NOYW1lICYmIHQuY2xhc3NOYW1lLmluZGV4T2YoJ25pY0VkaXQnKSAhPSAtMSkg ewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSB3aGlsZSh0ID0gdC5wYXJlbnROb2RlKTsKCQl0 aGlzLmZpcmVFdmVudCgnYmx1cicsdGhpcy5zZWxlY3RlZEluc3RhbmNlLHQpOwoJCXRoaXMubGFz dFNlbGVjdGVkSW5zdGFuY2UgPSB0aGlzLnNlbGVjdGVkSW5zdGFuY2U7CgkJdGhpcy5zZWxlY3Rl ZEluc3RhbmNlID0gbnVsbDsKCQlyZXR1cm4gZmFsc2U7Cgl9Cgp9KTsKbmljRWRpdG9yID0gbmlj RWRpdG9yLmV4dGVuZChia0V2ZW50KTsKCgp2YXIgbmljRWRpdG9ySW5zdGFuY2UgPSBia0NsYXNz LmV4dGVuZCh7Cglpc1NlbGVjdGVkIDogZmFsc2UsCgoJY29uc3RydWN0IDogZnVuY3Rpb24oZSxv cHRpb25zLG5pY0VkaXRvcikgewoJCXRoaXMubmUgPSBuaWNFZGl0b3I7CgkJdGhpcy5lbG0gPSB0 aGlzLmUgPSBlOwoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgoJCW5ld1ggPSBwYXJz ZUludChlLmdldFN0eWxlKCd3aWR0aCcpKSB8fCBlLmNsaWVudFdpZHRoOwoJCW5ld1kgPSBwYXJz ZUludChlLmdldFN0eWxlKCdoZWlnaHQnKSkgfHwgZS5jbGllbnRIZWlnaHQ7CgkJdGhpcy5pbml0 aWFsSGVpZ2h0ID0gbmV3WS04OwoKCQl2YXIgaXNUZXh0YXJlYSA9IChlLm5vZGVOYW1lLnRvTG93 ZXJDYXNlKCkgPT0gInRleHRhcmVhIik7CgkJaWYoaXNUZXh0YXJlYSB8fCB0aGlzLm9wdGlvbnMu aGFzUGFuZWwpIHsKCQkJdmFyIGllN3MgPSAoYmtMaWIuaXNNU0lFICYmICEoKHR5cGVvZiBkb2N1 bWVudC5ib2R5LnN0eWxlLm1heEhlaWdodCAhPSAidW5kZWZpbmVkIikgJiYgZG9jdW1lbnQuY29t cGF0TW9kZSA9PSAiQ1NTMUNvbXBhdCIpKQoJCQl2YXIgcyA9IHt3aWR0aDogbmV3WCsncHgnLCBi b3JkZXIgOiAnMXB4IHNvbGlkICNjY2MnLCBib3JkZXJUb3AgOiAwLCBvdmVyZmxvd1kgOiAnYXV0 bycsIG92ZXJmbG93WDogJ2hpZGRlbicgfTsKCQkJc1soaWU3cykgPyAnaGVpZ2h0JyA6ICdtYXhI ZWlnaHQnXSA9ICh0aGlzLm5lLm9wdGlvbnMubWF4SGVpZ2h0KSA/IHRoaXMubmUub3B0aW9ucy5t YXhIZWlnaHQrJ3B4JyA6IG51bGw7CgkJCXRoaXMuZWRpdG9yQ29udGFpbiA9IG5ldyBia0VsZW1l bnQoJ0RJVicpLnNldFN0eWxlKHMpLmFwcGVuZEJlZm9yZShlKTsKCQkJdmFyIGVkaXRvckVsbSA9 IG5ldyBia0VsZW1lbnQoJ0RJVicpLnNldFN0eWxlKHt3aWR0aCA6IChuZXdYLTgpKydweCcsIG1h cmdpbjogJzRweCcsIG1pbkhlaWdodCA6IG5ld1krJ3B4J30pLmFkZENsYXNzKCdtYWluJykuYXBw ZW5kVG8odGhpcy5lZGl0b3JDb250YWluKTsKCgkJCWUuc2V0U3R5bGUoe2Rpc3BsYXkgOiAnbm9u ZSd9KTsKCgkJCWVkaXRvckVsbS5pbm5lckhUTUwgPSBlLmlubmVySFRNTDsKCQkJaWYoaXNUZXh0 YXJlYSkgewoJCQkJZWRpdG9yRWxtLnNldENvbnRlbnQoZS52YWx1ZSk7CgkJCQl0aGlzLmNvcHlF bG0gPSBlOwoJCQkJdmFyIGYgPSBlLnBhcmVudFRhZygnRk9STScpOwoJCQkJaWYoZikgeyBia0xp Yi5hZGRFdmVudCggZiwgJ3N1Ym1pdCcsIHRoaXMuc2F2ZUNvbnRlbnQuY2xvc3VyZSh0aGlzKSk7 IH0KCQkJfQoJCQllZGl0b3JFbG0uc2V0U3R5bGUoKGllN3MpID8ge2hlaWdodCA6IG5ld1krJ3B4 J30gOiB7b3ZlcmZsb3c6ICdoaWRkZW4nfSk7CgkJCXRoaXMuZWxtID0gZWRpdG9yRWxtOwoJCX0K CQl0aGlzLm5lLmFkZEV2ZW50KCdibHVyJyx0aGlzLmJsdXIuY2xvc3VyZSh0aGlzKSk7CgoJCXRo aXMuaW5pdCgpOwoJCXRoaXMuYmx1cigpOwoJfSwKCglpbml0IDogZnVuY3Rpb24oKSB7CgkJdGhp cy5lbG0uc2V0QXR0cmlidXRlKCdjb250ZW50RWRpdGFibGUnLCd0cnVlJyk7CgkJaWYodGhpcy5n ZXRDb250ZW50KCkgPT0gIiIgJiYgdGhpcy5vcHRpb25zLmluaXRXaXRoTGluZUJyZWFrKSB7CgkJ CXRoaXMuc2V0Q29udGVudCgnPGJyIC8+Jyk7CgkJfQoJCXRoaXMuaW5zdGFuY2VEb2MgPSBkb2N1 bWVudC5kZWZhdWx0VmlldzsKCQl0aGlzLmVsbS5hZGRFdmVudCgnbW91c2Vkb3duJyx0aGlzLnNl bGVjdGVkLmNsb3N1cmVMaXN0ZW5lcih0aGlzKSkuYWRkRXZlbnQoJ2tleXByZXNzJyx0aGlzLmtl eURvd24uY2xvc3VyZUxpc3RlbmVyKHRoaXMpKS5hZGRFdmVudCgnZm9jdXMnLHRoaXMuc2VsZWN0 ZWQuY2xvc3VyZSh0aGlzKSkuYWRkRXZlbnQoJ2JsdXInLHRoaXMuYmx1ci5jbG9zdXJlKHRoaXMp KS5hZGRFdmVudCgna2V5dXAnLHRoaXMuc2VsZWN0ZWQuY2xvc3VyZSh0aGlzKSk7CgkJdGhpcy5u ZS5maXJlRXZlbnQoJ2FkZCcsdGhpcyk7Cgl9LAoKCXJlbW92ZSA6IGZ1bmN0aW9uKCkgewoJCXRo aXMuc2F2ZUNvbnRlbnQoKTsKCQlpZih0aGlzLmNvcHlFbG0gfHwgdGhpcy5vcHRpb25zLmhhc1Bh bmVsKSB7CgkJCXRoaXMuZWRpdG9yQ29udGFpbi5yZW1vdmUoKTsKCQkJdGhpcy5lLnNldFN0eWxl KHsnZGlzcGxheScgOiAnYmxvY2snfSk7CgkJCXRoaXMubmUucmVtb3ZlUGFuZWwoKTsKCQl9CgkJ dGhpcy5kaXNhYmxlKCk7CgkJdGhpcy5uZS5maXJlRXZlbnQoJ3JlbW92ZScsdGhpcyk7Cgl9LAoK CWRpc2FibGUgOiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsbS5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRF ZGl0YWJsZScsJ2ZhbHNlJyk7Cgl9LAoKCWdldFNlbCA6IGZ1bmN0aW9uKCkgewoJCXJldHVybiAo d2luZG93LmdldFNlbGVjdGlvbikgPyB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkgOiBkb2N1bWVudC5z ZWxlY3Rpb247Cgl9LAoKCWdldFJuZyA6IGZ1bmN0aW9uKCkgewoJCXZhciBzID0gdGhpcy5nZXRT ZWwoKTsKCQlpZighcykgeyByZXR1cm4gbnVsbDsgfQoJCXJldHVybiAocy5yYW5nZUNvdW50ID4g MCkgPyBzLmdldFJhbmdlQXQoMCkgOgoJCXMuY3JlYXRlUmFuZ2UgJiYgcy5jcmVhdGVSYW5nZSgp IHx8IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7Cgl9LAoKCXNlbFJuZyA6IGZ1bmN0aW9uKHJuZyxz KSB7CgkJaWYod2luZG93LmdldFNlbGVjdGlvbikgewoJCQlzLnJlbW92ZUFsbFJhbmdlcygpOwoJ CQlzLmFkZFJhbmdlKHJuZyk7CgkJfSBlbHNlIHsKCQkJcm5nLnNlbGVjdCgpOwoJCX0KCX0sCgoJ c2VsRWxtIDogZnVuY3Rpb24oKSB7CgkJdmFyIHIgPSB0aGlzLmdldFJuZygpOwoJCWlmKHIuc3Rh cnRDb250YWluZXIpIHsKCQkJdmFyIGNvbnRhaW4gPSByLnN0YXJ0Q29udGFpbmVyOwoJCQlpZihy LmNsb25lQ29udGVudHMoKS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxKSB7CgkJCQlmb3IodmFyIGk9 MDtpPGNvbnRhaW4uY2hpbGROb2Rlcy5sZW5ndGg7aSsrKSB7CgkJCQkJdmFyIHJuZyA9IGNvbnRh aW4uY2hpbGROb2Rlc1tpXS5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CgkJCQkJcm5nLnNl bGVjdE5vZGUoY29udGFpbi5jaGlsZE5vZGVzW2ldKTsKCQkJCQlpZihyLmNvbXBhcmVCb3VuZGFy eVBvaW50cyhSYW5nZS5TVEFSVF9UT19TVEFSVCxybmcpICE9IDEgJiYKCQkJCQkJci5jb21wYXJl Qm91bmRhcnlQb2ludHMoUmFuZ2UuRU5EX1RPX0VORCxybmcpICE9IC0xKSB7CgkJCQkJCXJldHVy biAkQksoY29udGFpbi5jaGlsZE5vZGVzW2ldKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJu ICRCSyhjb250YWluKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJEJLKCh0aGlzLmdldFNlbCgpLnR5 cGUgPT0gIkNvbnRyb2wiKSA/IHIuaXRlbSgwKSA6IHIucGFyZW50RWxlbWVudCgpKTsKCQl9Cgl9 LAoKCXNhdmVSbmcgOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNhdmVkUmFuZ2UgPSB0aGlzLmdldFJu ZygpOwoJCXRoaXMuc2F2ZWRTZWwgPSB0aGlzLmdldFNlbCgpOwoJfSwKCglyZXN0b3JlUm5nIDog ZnVuY3Rpb24oKSB7CgkJaWYodGhpcy5zYXZlZFJhbmdlKSB7CgkJCXRoaXMuc2VsUm5nKHRoaXMu c2F2ZWRSYW5nZSx0aGlzLnNhdmVkU2VsKTsKCQl9Cgl9LAoKCWtleURvd24gOiBmdW5jdGlvbihl LHQpIHsKCQl0aGlzLm5lLmZpcmVFdmVudCgna2V5RG93bicsdGhpcyxlKTsKCgkJaWYoZS5jdHJs S2V5KSB7CgkJCXRoaXMubmUuZmlyZUV2ZW50KCdrZXknLHRoaXMsZSk7CgkJfQoJfSwKCglzZWxl Y3RlZCA6IGZ1bmN0aW9uKGUsdCkgewoJCWlmKCF0KSB7dCA9IHRoaXMuc2VsRWxtKCl9CgkJaWYo IWUuY3RybEtleSkgewoJCQl2YXIgc2VsSW5zdGFuY2UgPSB0aGlzLm5lLnNlbGVjdGVkSW5zdGFu Y2U7CgkJCWlmKHNlbEluc3RhbmNlICE9IHRoaXMpIHsKCQkJCWlmKHNlbEluc3RhbmNlKSB7CgkJ CQkJdGhpcy5uZS5maXJlRXZlbnQoJ2JsdXInLHNlbEluc3RhbmNlLHQpOwoJCQkJfQoJCQkJdGhp cy5uZS5zZWxlY3RlZEluc3RhbmNlID0gdGhpczsKCQkJCXRoaXMubmUuZmlyZUV2ZW50KCdmb2N1 cycsc2VsSW5zdGFuY2UsdCk7CgkJCX0KCQkJdGhpcy5uZS5maXJlRXZlbnQoJ3NlbGVjdGVkJyxz ZWxJbnN0YW5jZSx0KTsKCQkJdGhpcy5pc0ZvY3VzZWQgPSB0cnVlOwoJCQl0aGlzLmVsbS5hZGRD bGFzcygnc2VsZWN0ZWQnKTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfSwKCglibHVyIDogZnVuY3Rp b24oKSB7CgkJdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTsKCQl0aGlzLmVsbS5yZW1vdmVDbGFzcygn c2VsZWN0ZWQnKTsKCX0sCgoJc2F2ZUNvbnRlbnQgOiBmdW5jdGlvbigpIHsKCQlpZih0aGlzLmNv cHlFbG0gfHwgdGhpcy5vcHRpb25zLmhhc1BhbmVsKSB7CgkJCXRoaXMubmUuZmlyZUV2ZW50KCdz YXZlJyx0aGlzKTsKCQkJKHRoaXMuY29weUVsbSkgPyB0aGlzLmNvcHlFbG0udmFsdWUgPSB0aGlz LmdldENvbnRlbnQoKSA6IHRoaXMuZS5pbm5lckhUTUwgPSB0aGlzLmdldENvbnRlbnQoKTsKCQl9 Cgl9LAoKCWdldEVsbSA6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmVsbTsKCX0sCgoJZ2V0 Q29udGVudCA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY29udGVudCA9IHRoaXMuZ2V0RWxtKCkuaW5u ZXJIVE1MOwoJCXRoaXMubmUuZmlyZUV2ZW50KCdnZXQnLHRoaXMpOwoJCXJldHVybiB0aGlzLmNv bnRlbnQ7Cgl9LAoKCXNldENvbnRlbnQgOiBmdW5jdGlvbihlKSB7CgkJdGhpcy5jb250ZW50ID0g ZTsKCQl0aGlzLm5lLmZpcmVFdmVudCgnc2V0Jyx0aGlzKTsKCQl0aGlzLmVsbS5pbm5lckhUTUwg PSB0aGlzLmNvbnRlbnQ7Cgl9LAoKCW5pY0NvbW1hbmQgOiBmdW5jdGlvbihjbWQsYXJncykgewoJ CWRvY3VtZW50LmV4ZWNDb21tYW5kKGNtZCxmYWxzZSxhcmdzKTsKCX0KfSk7Cgp2YXIgbmljRWRp dG9ySUZyYW1lSW5zdGFuY2UgPSBuaWNFZGl0b3JJbnN0YW5jZS5leHRlbmQoewoJc2F2ZWRTdHls ZXMgOiBbXSwKCglpbml0IDogZnVuY3Rpb24oKSB7CgkJdmFyIGMgPSB0aGlzLmVsbS5pbm5lckhU TUwucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKCQl0aGlzLmVsbS5pbm5lckhUTUwgPSAnJzsK CQkoIWMpID8gYyA9ICI8YnIgLz4iIDogYzsKCQl0aGlzLmluaXRpYWxDb250ZW50ID0gYzsKCgkJ dGhpcy5lbG1GcmFtZSA9IG5ldyBia0VsZW1lbnQoJ2lmcmFtZScpLnNldEF0dHJpYnV0ZXMoeydz cmMnIDogJ2phdmFzY3JpcHQ6OycsICdmcmFtZUJvcmRlcicgOiAwLCAnYWxsb3dUcmFuc3BhcmVu Y3knIDogJ3RydWUnLCAnc2Nyb2xsaW5nJyA6ICdubyd9KS5zZXRTdHlsZSh7aGVpZ2h0OiAnMTAw cHgnLCB3aWR0aDogJzEwMCUnfSkuYWRkQ2xhc3MoJ2ZyYW1lJykuYXBwZW5kVG8odGhpcy5lbG0p OwoKCQlpZih0aGlzLmNvcHlFbG0pIHsgdGhpcy5lbG1GcmFtZS5zZXRTdHlsZSh7d2lkdGggOiAo dGhpcy5lbG0ub2Zmc2V0V2lkdGgtNCkrJ3B4J30pOyB9CgoJCXZhciBzdHlsZUxpc3QgPSBbJ2Zv bnQtc2l6ZScsJ2ZvbnQtZmFtaWx5JywnZm9udC13ZWlnaHQnLCdjb2xvciddOwoJCWZvcihpdG0g aW4gc3R5bGVMaXN0KSB7CgkJCXRoaXMuc2F2ZWRTdHlsZXNbYmtMaWIuY2FtZWxpemUoaXRtKV0g PSB0aGlzLmVsbS5nZXRTdHlsZShpdG0pOwoJCX0KCgkJc2V0VGltZW91dCh0aGlzLmluaXRGcmFt ZS5jbG9zdXJlKHRoaXMpLDUwKTsKCX0sCgoJZGlzYWJsZSA6IGZ1bmN0aW9uKCkgewoJCXRoaXMu ZWxtLmlubmVySFRNTCA9IHRoaXMuZ2V0Q29udGVudCgpOwoJfSwKCglpbml0RnJhbWUgOiBmdW5j dGlvbigpIHsKCQl2YXIgZmQgPSAkQksodGhpcy5lbG1GcmFtZS5jb250ZW50V2luZG93LmRvY3Vt ZW50KTsKCQlmZC5kZXNpZ25Nb2RlID0gIm9uIjsKCQlmZC5vcGVuKCk7CgkJdmFyIGNzcyA9IHRo aXMubmUub3B0aW9ucy5leHRlcm5hbENTUzsKCQlmZC53cml0ZSgnPGh0bWw+PGhlYWQ+JysoKGNz cykgPyAnPGxpbmsgaHJlZj0iJytjc3MrJyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2Nz cyIgLz4nIDogJycpKyc8L2hlYWQ+PGJvZHkgaWQ9Im5pY0VkaXRDb250ZW50IiBzdHlsZT0ibWFy Z2luOiAwICFpbXBvcnRhbnQ7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRh bnQ7Ij4nK3RoaXMuaW5pdGlhbENvbnRlbnQrJzwvYm9keT48L2h0bWw+Jyk7CgkJZmQuY2xvc2Uo KTsKCQl0aGlzLmZyYW1lRG9jID0gZmQ7CgoJCXRoaXMuZnJhbWVXaW4gPSAkQksodGhpcy5lbG1G cmFtZS5jb250ZW50V2luZG93KTsKCQl0aGlzLmZyYW1lQ29udGVudCA9ICRCSyh0aGlzLmZyYW1l V2luLmRvY3VtZW50LmJvZHkpLnNldFN0eWxlKHRoaXMuc2F2ZWRTdHlsZXMpOwoJCXRoaXMuaW5z dGFuY2VEb2MgPSB0aGlzLmZyYW1lV2luLmRvY3VtZW50LmRlZmF1bHRWaWV3OwoKCQl0aGlzLmhl aWdodFVwZGF0ZSgpOwoJCXRoaXMuZnJhbWVEb2MuYWRkRXZlbnQoJ21vdXNlZG93bicsIHRoaXMu c2VsZWN0ZWQuY2xvc3VyZUxpc3RlbmVyKHRoaXMpKS5hZGRFdmVudCgna2V5dXAnLHRoaXMuaGVp Z2h0VXBkYXRlLmNsb3N1cmVMaXN0ZW5lcih0aGlzKSkuYWRkRXZlbnQoJ2tleWRvd24nLHRoaXMu a2V5RG93bi5jbG9zdXJlTGlzdGVuZXIodGhpcykpLmFkZEV2ZW50KCdrZXl1cCcsdGhpcy5zZWxl Y3RlZC5jbG9zdXJlKHRoaXMpKTsKCQl0aGlzLm5lLmZpcmVFdmVudCgnYWRkJyx0aGlzKTsKCX0s CgoJZ2V0RWxtIDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZnJhbWVDb250ZW50OwoJfSwK CglzZXRDb250ZW50IDogZnVuY3Rpb24oYykgewoJCXRoaXMuY29udGVudCA9IGM7CgkJdGhpcy5u ZS5maXJlRXZlbnQoJ3NldCcsdGhpcyk7CgkJdGhpcy5mcmFtZUNvbnRlbnQuaW5uZXJIVE1MID0g dGhpcy5jb250ZW50OwoJCXRoaXMuaGVpZ2h0VXBkYXRlKCk7Cgl9LAoKCWdldFNlbCA6IGZ1bmN0 aW9uKCkgewoJCXJldHVybiAodGhpcy5mcmFtZVdpbikgPyB0aGlzLmZyYW1lV2luLmdldFNlbGVj dGlvbigpIDogdGhpcy5mcmFtZURvYy5zZWxlY3Rpb247Cgl9LAoKCWhlaWdodFVwZGF0ZSA6IGZ1 bmN0aW9uKCkgewoJCXRoaXMuZWxtRnJhbWUuc3R5bGUuaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5m cmFtZUNvbnRlbnQub2Zmc2V0SGVpZ2h0LHRoaXMuaW5pdGlhbEhlaWdodCkrJ3B4JzsKCX0sCgoJ bmljQ29tbWFuZCA6IGZ1bmN0aW9uKGNtZCxhcmdzKSB7CgkJdGhpcy5mcmFtZURvYy5leGVjQ29t bWFuZChjbWQsZmFsc2UsYXJncyk7CgkJc2V0VGltZW91dCh0aGlzLmhlaWdodFVwZGF0ZS5jbG9z dXJlKHRoaXMpLDEwMCk7Cgl9CgoKfSk7CnZhciBuaWNFZGl0b3JQYW5lbCA9IGJrQ2xhc3MuZXh0 ZW5kKHsKCWNvbnN0cnVjdCA6IGZ1bmN0aW9uKGUsb3B0aW9ucyxuaWNFZGl0b3IpIHsKCQl0aGlz LmVsbSA9IGU7CgkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCQl0aGlzLm5lID0gbmljRWRpdG9y OwoJCXRoaXMucGFuZWxCdXR0b25zID0gbmV3IEFycmF5KCk7CgkJdGhpcy5idXR0b25MaXN0ID0g YmtFeHRlbmQoW10sdGhpcy5uZS5vcHRpb25zLmJ1dHRvbkxpc3QpOwoKCQl0aGlzLnBhbmVsQ29u dGFpbiA9IG5ldyBia0VsZW1lbnQoJ0RJVicpLnNldFN0eWxlKHtvdmVyZmxvdyA6ICdoaWRkZW4n LCB3aWR0aCA6ICcxMDAlJywgYm9yZGVyIDogJzFweCBzb2xpZCAjY2NjY2NjJywgYmFja2dyb3Vu ZENvbG9yIDogJyNlZmVmZWYnfSkuYWRkQ2xhc3MoJ3BhbmVsQ29udGFpbicpOwoJCXRoaXMucGFu ZWxFbG0gPSBuZXcgYmtFbGVtZW50KCdESVYnKS5zZXRTdHlsZSh7bWFyZ2luIDogJzJweCcsIG1h cmdpblRvcCA6ICcwcHgnLCB6b29tIDogMSwgb3ZlcmZsb3cgOiAnaGlkZGVuJ30pLmFkZENsYXNz KCdwYW5lbCcpLmFwcGVuZFRvKHRoaXMucGFuZWxDb250YWluKTsKCQl0aGlzLnBhbmVsQ29udGFp bi5hcHBlbmRUbyhlKTsKCgkJdmFyIG9wdCA9IHRoaXMubmUub3B0aW9uczsKCQl2YXIgYnV0dG9u cyA9IG9wdC5idXR0b25zOwoJCWZvcihidXR0b24gaW4gYnV0dG9ucykgewoJCQkJdGhpcy5hZGRC dXR0b24oYnV0dG9uLG9wdCx0cnVlKTsKCQl9CgkJdGhpcy5yZW9yZGVyKCk7CgkJZS5ub1NlbGVj dCgpOwoJfSwKCglhZGRCdXR0b24gOiBmdW5jdGlvbihidXR0b25OYW1lLG9wdGlvbnMsbm9PcmRl cikgewoJCXZhciBidXR0b24gPSBvcHRpb25zLmJ1dHRvbnNbYnV0dG9uTmFtZV07CgkJdmFyIHR5 cGUgPSAoYnV0dG9uWyd0eXBlJ10pID8gZXZhbCgnKHR5cGVvZignK2J1dHRvblsndHlwZSddKycp ID09ICJ1bmRlZmluZWQiKSA/IG51bGwgOiAnK2J1dHRvblsndHlwZSddKyc7JykgOiBuaWNFZGl0 b3JCdXR0b247CgkJdmFyIGhhc0J1dHRvbiA9IGJrTGliLmluQXJyYXkodGhpcy5idXR0b25MaXN0 LGJ1dHRvbk5hbWUpOwoJCWlmKHR5cGUgJiYgKGhhc0J1dHRvbiB8fCB0aGlzLm5lLm9wdGlvbnMu ZnVsbFBhbmVsKSkgewoJCQl0aGlzLnBhbmVsQnV0dG9ucy5wdXNoKG5ldyB0eXBlKHRoaXMucGFu ZWxFbG0sYnV0dG9uTmFtZSxvcHRpb25zLHRoaXMubmUpKTsKCQkJaWYoIWhhc0J1dHRvbikgewoJ CQkJdGhpcy5idXR0b25MaXN0LnB1c2goYnV0dG9uTmFtZSk7CgkJCX0KCQl9Cgl9LAoKCWZpbmRC dXR0b24gOiBmdW5jdGlvbihpdG0pIHsKCQlmb3IodmFyIGk9MDtpPHRoaXMucGFuZWxCdXR0b25z Lmxlbmd0aDtpKyspIHsKCQkJaWYodGhpcy5wYW5lbEJ1dHRvbnNbaV0ubmFtZSA9PSBpdG0pCgkJ CQlyZXR1cm4gdGhpcy5wYW5lbEJ1dHRvbnNbaV07CgkJfQoJfSwKCglyZW9yZGVyIDogZnVuY3Rp b24oKSB7CgkJdmFyIGJsID0gdGhpcy5idXR0b25MaXN0OwoJCWZvcih2YXIgaT0wO2k8YmwubGVu Z3RoO2krKykgewoJCQl2YXIgYnV0dG9uID0gdGhpcy5maW5kQnV0dG9uKGJsW2ldKTsKCQkJaWYo YnV0dG9uKSB7CgkJCQl0aGlzLnBhbmVsRWxtLmFwcGVuZENoaWxkKGJ1dHRvbi5tYXJnaW4pOwoJ CQl9CgkJfQoJfSwKCglyZW1vdmUgOiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsbS5yZW1vdmUoKTsK CX0KfSk7CnZhciBuaWNFZGl0b3JCdXR0b24gPSBia0NsYXNzLmV4dGVuZCh7CgoJY29uc3RydWN0 IDogZnVuY3Rpb24oZSxidXR0b25OYW1lLG9wdGlvbnMsbmljRWRpdG9yKSB7CgkJdGhpcy5vcHRp b25zID0gb3B0aW9ucy5idXR0b25zW2J1dHRvbk5hbWVdOwoJCXRoaXMubmFtZSA9IGJ1dHRvbk5h bWU7CgkJdGhpcy5uZSA9IG5pY0VkaXRvcjsKCQl0aGlzLmVsbSA9IGU7CgoJCXRoaXMubWFyZ2lu ID0gbmV3IGJrRWxlbWVudCgnRElWJykuc2V0U3R5bGUoeydmbG9hdCcgOiAnbGVmdCcsIG1hcmdp blRvcCA6ICcycHgnfSkuYXBwZW5kVG8oZSk7CgkJdGhpcy5jb250YWluID0gbmV3IGJrRWxlbWVu dCgnRElWJykuc2V0U3R5bGUoe3dpZHRoIDogJzIwcHgnLCBoZWlnaHQgOiAnMjBweCd9KS5hZGRD bGFzcygnYnV0dG9uQ29udGFpbicpLmFwcGVuZFRvKHRoaXMubWFyZ2luKTsKCQl0aGlzLmJvcmRl ciA9IG5ldyBia0VsZW1lbnQoJ0RJVicpLnNldFN0eWxlKHtiYWNrZ3JvdW5kQ29sb3IgOiAnI2Vm ZWZlZicsIGJvcmRlciA6ICcxcHggc29saWQgI2VmZWZlZid9KS5hcHBlbmRUbyh0aGlzLmNvbnRh aW4pOwoJCXRoaXMuYnV0dG9uID0gbmV3IGJrRWxlbWVudCgnRElWJykuc2V0U3R5bGUoe3dpZHRo IDogJzE4cHgnLCBoZWlnaHQgOiAnMThweCcsIG92ZXJmbG93IDogJ2hpZGRlbicsIHpvb20gOiAx LCBjdXJzb3IgOiAncG9pbnRlcid9KS5hZGRDbGFzcygnYnV0dG9uJykuc2V0U3R5bGUodGhpcy5u ZS5nZXRJY29uKGJ1dHRvbk5hbWUsb3B0aW9ucykpLmFwcGVuZFRvKHRoaXMuYm9yZGVyKTsKCQl0 aGlzLmJ1dHRvbi5hZGRFdmVudCgnbW91c2VvdmVyJywgdGhpcy5ob3Zlck9uLmNsb3N1cmUodGhp cykpLmFkZEV2ZW50KCdtb3VzZW91dCcsdGhpcy5ob3Zlck9mZi5jbG9zdXJlKHRoaXMpKS5hZGRF dmVudCgnbW91c2Vkb3duJyx0aGlzLm1vdXNlQ2xpY2suY2xvc3VyZSh0aGlzKSkubm9TZWxlY3Qo KTsKCgkJaWYoIXdpbmRvdy5vcGVyYSkgewoJCQl0aGlzLmJ1dHRvbi5vbm1vdXNlZG93biA9IHRo aXMuYnV0dG9uLm9uY2xpY2sgPSBia0xpYi5jYW5jZWxFdmVudDsKCQl9CgoJCW5pY0VkaXRvci5h ZGRFdmVudCgnc2VsZWN0ZWQnLCB0aGlzLmVuYWJsZS5jbG9zdXJlKHRoaXMpKS5hZGRFdmVudCgn Ymx1cicsIHRoaXMuZGlzYWJsZS5jbG9zdXJlKHRoaXMpKS5hZGRFdmVudCgna2V5Jyx0aGlzLmtl eS5jbG9zdXJlKHRoaXMpKTsKCgkJdGhpcy5kaXNhYmxlKCk7CgkJdGhpcy5pbml0KCk7Cgl9LAoK CWluaXQgOiBmdW5jdGlvbigpIHsgIH0sCgoJaGlkZSA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY29u dGFpbi5zZXRTdHlsZSh7ZGlzcGxheSA6ICdub25lJ30pOwoJfSwKCgl1cGRhdGVTdGF0ZSA6IGZ1 bmN0aW9uKCkgewoJCWlmKHRoaXMuaXNEaXNhYmxlZCkgeyB0aGlzLnNldEJnKCk7IH0KCQllbHNl IGlmKHRoaXMuaXNIb3ZlcikgeyB0aGlzLnNldEJnKCdob3ZlcicpOyB9CgkJZWxzZSBpZih0aGlz LmlzQWN0aXZlKSB7IHRoaXMuc2V0QmcoJ2FjdGl2ZScpOyB9CgkJZWxzZSB7IHRoaXMuc2V0Qmco KTsgfQoJfSwKCglzZXRCZyA6IGZ1bmN0aW9uKHN0YXRlKSB7CgkJc3dpdGNoKHN0YXRlKSB7CgkJ CWNhc2UgJ2hvdmVyJzoKCQkJCXZhciBzdGF0ZVN0eWxlID0ge2JvcmRlciA6ICcxcHggc29saWQg IzY2NicsIGJhY2tncm91bmRDb2xvciA6ICcjZGRkJ307CgkJCQlicmVhazsKCQkJY2FzZSAnYWN0 aXZlJzoKCQkJCXZhciBzdGF0ZVN0eWxlID0ge2JvcmRlciA6ICcxcHggc29saWQgIzY2NicsIGJh Y2tncm91bmRDb2xvciA6ICcjY2NjJ307CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXZhciBz dGF0ZVN0eWxlID0ge2JvcmRlciA6ICcxcHggc29saWQgI2VmZWZlZicsIGJhY2tncm91bmRDb2xv ciA6ICcjZWZlZmVmJ307CgkJfQoJCXRoaXMuYm9yZGVyLnNldFN0eWxlKHN0YXRlU3R5bGUpLmFk ZENsYXNzKCdidXR0b24tJytzdGF0ZSk7Cgl9LAoKCWNoZWNrTm9kZXMgOiBmdW5jdGlvbihlKSB7 CgkJdmFyIGVsbSA9IGU7CgkJZG8gewoJCQlpZih0aGlzLm9wdGlvbnMudGFncyAmJiBia0xpYi5p bkFycmF5KHRoaXMub3B0aW9ucy50YWdzLGVsbS5ub2RlTmFtZSkpIHsKCQkJCXRoaXMuYWN0aXZh dGUoKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfSB3aGlsZSgoZWxtID0gZWxtLnBhcmVudE5v ZGUpICYmIGVsbS5jbGFzc05hbWUgIT0gIm5pY0VkaXQiKTsKCQllbG0gPSAkQksoZSk7CgkJd2hp bGUoZWxtLm5vZGVUeXBlID09IDMpIHsKCQkJZWxtID0gJEJLKGVsbS5wYXJlbnROb2RlKTsKCQl9 CgkJaWYodGhpcy5vcHRpb25zLmNzcykgewoJCQlmb3IoaXRtIGluIHRoaXMub3B0aW9ucy5jc3Mp IHsKCQkJCWlmKGVsbS5nZXRTdHlsZShpdG0sdGhpcy5uZS5zZWxlY3RlZEluc3RhbmNlLmluc3Rh bmNlRG9jKSA9PSB0aGlzLm9wdGlvbnMuY3NzW2l0bV0pIHsKCQkJCQl0aGlzLmFjdGl2YXRlKCk7 CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9CgkJdGhpcy5kZWFjdGl2YXRlKCk7CgkJ cmV0dXJuIGZhbHNlOwoJfSwKCglhY3RpdmF0ZSA6IGZ1bmN0aW9uKCkgewoJCWlmKCF0aGlzLmlz RGlzYWJsZWQpIHsKCQkJdGhpcy5pc0FjdGl2ZSA9IHRydWU7CgkJCXRoaXMudXBkYXRlU3RhdGUo KTsKCQkJdGhpcy5uZS5maXJlRXZlbnQoJ2J1dHRvbkFjdGl2YXRlJyx0aGlzKTsKCQl9Cgl9LAoK CWRlYWN0aXZhdGUgOiBmdW5jdGlvbigpIHsKCQl0aGlzLmlzQWN0aXZlID0gZmFsc2U7CgkJdGhp cy51cGRhdGVTdGF0ZSgpOwoJCWlmKCF0aGlzLmlzRGlzYWJsZWQpIHsKCQkJdGhpcy5uZS5maXJl RXZlbnQoJ2J1dHRvbkRlYWN0aXZhdGUnLHRoaXMpOwoJCX0KCX0sCgoJZW5hYmxlIDogZnVuY3Rp b24oaW5zLHQpIHsKCQl0aGlzLmlzRGlzYWJsZWQgPSBmYWxzZTsKCQl0aGlzLmNvbnRhaW4uc2V0 U3R5bGUoeydvcGFjaXR5JyA6IDF9KS5hZGRDbGFzcygnYnV0dG9uRW5hYmxlZCcpOwoJCXRoaXMu dXBkYXRlU3RhdGUoKTsKCQlpZiAodCAhPT0gZG9jdW1lbnQpIHsKCQkJdGhpcy5jaGVja05vZGVz KHQpOwoJCX0KCX0sCgoJZGlzYWJsZSA6IGZ1bmN0aW9uKGlucyx0KSB7CgkJdGhpcy5pc0Rpc2Fi bGVkID0gdHJ1ZTsKCQl0aGlzLmNvbnRhaW4uc2V0U3R5bGUoeydvcGFjaXR5JyA6IDAuNn0pLnJl bW92ZUNsYXNzKCdidXR0b25FbmFibGVkJyk7CgkJdGhpcy51cGRhdGVTdGF0ZSgpOwoJfSwKCgl0 b2dnbGVBY3RpdmUgOiBmdW5jdGlvbigpIHsKCQkodGhpcy5pc0FjdGl2ZSkgPyB0aGlzLmRlYWN0 aXZhdGUoKSA6IHRoaXMuYWN0aXZhdGUoKTsKCX0sCgoJaG92ZXJPbiA6IGZ1bmN0aW9uKCkgewoJ CWlmKCF0aGlzLmlzRGlzYWJsZWQpIHsKCQkJdGhpcy5pc0hvdmVyID0gdHJ1ZTsKCQkJdGhpcy51 cGRhdGVTdGF0ZSgpOwoJCQl0aGlzLm5lLmZpcmVFdmVudCgiYnV0dG9uT3ZlciIsdGhpcyk7CgkJ fQoJfSwKCglob3Zlck9mZiA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNIb3ZlciA9IGZhbHNlOwoJ CXRoaXMudXBkYXRlU3RhdGUoKTsKCQl0aGlzLm5lLmZpcmVFdmVudCgiYnV0dG9uT3V0Iix0aGlz KTsKCX0sCgoJbW91c2VDbGljayA6IGZ1bmN0aW9uKCkgewoJCWlmKHRoaXMub3B0aW9ucy5jb21t YW5kKSB7CgkJCXRoaXMubmUubmljQ29tbWFuZCh0aGlzLm9wdGlvbnMuY29tbWFuZCx0aGlzLm9w dGlvbnMuY29tbWFuZEFyZ3MpOwoJCQlpZighdGhpcy5vcHRpb25zLm5vQWN0aXZlKSB7CgkJCQl0 aGlzLnRvZ2dsZUFjdGl2ZSgpOwoJCQl9CgkJfQoJCXRoaXMubmUuZmlyZUV2ZW50KCJidXR0b25D bGljayIsdGhpcyk7Cgl9LAoKCWtleSA6IGZ1bmN0aW9uKG5pY0luc3RhbmNlLGUpIHsKCQlpZih0 aGlzLm9wdGlvbnMua2V5ICYmIGUuY3RybEtleSAmJiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUua2V5 Q29kZSB8fCBlLmNoYXJDb2RlKS50b0xvd2VyQ2FzZSgpID09IHRoaXMub3B0aW9ucy5rZXkpIHsK CQkJdGhpcy5tb3VzZUNsaWNrKCk7CgkJCWlmKGUucHJldmVudERlZmF1bHQpIGUucHJldmVudERl ZmF1bHQoKTsKCQl9Cgl9Cgp9KTsKCgp2YXIgbmljUGx1Z2luID0gYmtDbGFzcy5leHRlbmQoewoK CWNvbnN0cnVjdCA6IGZ1bmN0aW9uKG5pY0VkaXRvcixvcHRpb25zKSB7CgkJdGhpcy5vcHRpb25z ID0gb3B0aW9uczsKCQl0aGlzLm5lID0gbmljRWRpdG9yOwoJCXRoaXMubmUuYWRkRXZlbnQoJ3Bh bmVsJyx0aGlzLmxvYWRQYW5lbC5jbG9zdXJlKHRoaXMpKTsKCgkJdGhpcy5pbml0KCk7Cgl9LAoK CWxvYWRQYW5lbCA6IGZ1bmN0aW9uKG5wKSB7CgkJdmFyIGJ1dHRvbnMgPSB0aGlzLm9wdGlvbnMu YnV0dG9uczsKCQlmb3IodmFyIGJ1dHRvbiBpbiBidXR0b25zKSB7CgkJCW5wLmFkZEJ1dHRvbihi dXR0b24sdGhpcy5vcHRpb25zKTsKCQl9CgkJbnAucmVvcmRlcigpOwoJfSwKCglpbml0IDogZnVu Y3Rpb24oKSB7ICB9Cn0pOwoKCgoKIC8qIFNUQVJUIENPTkZJRyAqLwp2YXIgbmljUGFuZU9wdGlv bnMgPSB7IH07Ci8qIEVORCBDT05GSUcgKi8KCnZhciBuaWNFZGl0b3JQYW5lID0gYmtDbGFzcy5l eHRlbmQoewoJY29uc3RydWN0IDogZnVuY3Rpb24oZWxtLG5pY0VkaXRvcixvcHRpb25zLG9wZW5C dXR0b24pIHsKCQl0aGlzLm5lID0gbmljRWRpdG9yOwoJCXRoaXMuZWxtID0gZWxtOwoJCXRoaXMu cG9zID0gZWxtLnBvcygpOwoKCQl0aGlzLmNvbnRhaW4gPSBuZXcgYmtFbGVtZW50KCdkaXYnKS5z ZXRTdHlsZSh7ekluZGV4IDogJzk5OTk5Jywgb3ZlcmZsb3cgOiAnaGlkZGVuJywgcG9zaXRpb24g OiAnYWJzb2x1dGUnLCBsZWZ0IDogdGhpcy5wb3NbMF0rJ3B4JywgdG9wIDogdGhpcy5wb3NbMV0r J3B4J30pCgkJdGhpcy5wYW5lID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUoe2ZvbnRT aXplIDogJzEycHgnLCBib3JkZXIgOiAnMXB4IHNvbGlkICNjY2MnLCAnb3ZlcmZsb3cnOiAnaGlk ZGVuJywgcGFkZGluZyA6ICc0cHgnLCB0ZXh0QWxpZ246ICdsZWZ0JywgYmFja2dyb3VuZENvbG9y IDogJyNmZmZmYzknfSkuYWRkQ2xhc3MoJ3BhbmUnKS5zZXRTdHlsZShvcHRpb25zKS5hcHBlbmRU byh0aGlzLmNvbnRhaW4pOwoKCQlpZihvcGVuQnV0dG9uICYmICFvcGVuQnV0dG9uLm9wdGlvbnMu bm9DbG9zZSkgewoJCQl0aGlzLmNsb3NlID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUo eydmbG9hdCcgOiAncmlnaHQnLCBoZWlnaHQ6ICcxNnB4Jywgd2lkdGggOiAnMTZweCcsIGN1cnNv ciA6ICdwb2ludGVyJ30pLnNldFN0eWxlKHRoaXMubmUuZ2V0SWNvbignY2xvc2UnLG5pY1BhbmVP cHRpb25zKSkuYWRkRXZlbnQoJ21vdXNlZG93bicsb3BlbkJ1dHRvbi5yZW1vdmVQYW5lLmNsb3N1 cmUodGhpcykpLmFwcGVuZFRvKHRoaXMucGFuZSk7CgkJfQoKCQl0aGlzLmNvbnRhaW4ubm9TZWxl Y3QoKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTsKCgkJdGhpcy5wb3NpdGlvbigpOwoJCXRoaXMu aW5pdCgpOwoJfSwKCglpbml0IDogZnVuY3Rpb24oKSB7IH0sCgoJcG9zaXRpb24gOiBmdW5jdGlv bigpIHsKCQlpZih0aGlzLm5lLm5pY1BhbmVsKSB7CgkJCXZhciBwYW5lbEVsbSA9IHRoaXMubmUu bmljUGFuZWwuZWxtOwoJCQl2YXIgcGFuZWxQb3MgPSBwYW5lbEVsbS5wb3MoKTsKCQkJdmFyIG5l d0xlZnQgPSBwYW5lbFBvc1swXStwYXJzZUludChwYW5lbEVsbS5nZXRTdHlsZSgnd2lkdGgnKSkt KHBhcnNlSW50KHRoaXMucGFuZS5nZXRTdHlsZSgnd2lkdGgnKSkrOCk7CgkJCWlmKG5ld0xlZnQg PCB0aGlzLnBvc1swXSkgewoJCQkJdGhpcy5jb250YWluLnNldFN0eWxlKHtsZWZ0IDogbmV3TGVm dCsncHgnfSk7CgkJCX0KCQl9Cgl9LAoKCXRvZ2dsZSA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNW aXNpYmxlID0gIXRoaXMuaXNWaXNpYmxlOwoJCXRoaXMuY29udGFpbi5zZXRTdHlsZSh7ZGlzcGxh eSA6ICgodGhpcy5pc1Zpc2libGUpID8gJ2Jsb2NrJyA6ICdub25lJyl9KTsKCX0sCgoJcmVtb3Zl IDogZnVuY3Rpb24oKSB7CgkJaWYodGhpcy5jb250YWluKSB7CgkJCXRoaXMuY29udGFpbi5yZW1v dmUoKTsKCQkJdGhpcy5jb250YWluID0gbnVsbDsKCQl9Cgl9LAoKCWFwcGVuZCA6IGZ1bmN0aW9u KGMpIHsKCQljLmFwcGVuZFRvKHRoaXMucGFuZSk7Cgl9LAoKCXNldENvbnRlbnQgOiBmdW5jdGlv bihjKSB7CgkJdGhpcy5wYW5lLnNldENvbnRlbnQoYyk7Cgl9Cgp9KTsKCgoKdmFyIG5pY0VkaXRv ckFkdmFuY2VkQnV0dG9uID0gbmljRWRpdG9yQnV0dG9uLmV4dGVuZCh7CgoJaW5pdCA6IGZ1bmN0 aW9uKCkgewoJCXRoaXMubmUuYWRkRXZlbnQoJ3NlbGVjdGVkJyx0aGlzLnJlbW92ZVBhbmUuY2xv c3VyZSh0aGlzKSkuYWRkRXZlbnQoJ2JsdXInLHRoaXMucmVtb3ZlUGFuZS5jbG9zdXJlKHRoaXMp KTsKCX0sCgoJbW91c2VDbGljayA6IGZ1bmN0aW9uKCkgewoJCWlmKCF0aGlzLmlzRGlzYWJsZWQp IHsKCQkJaWYodGhpcy5wYW5lICYmIHRoaXMucGFuZS5wYW5lKSB7CgkJCQl0aGlzLnJlbW92ZVBh bmUoKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMucGFuZSA9IG5ldyBuaWNFZGl0b3JQYW5lKHRoaXMu Y29udGFpbix0aGlzLm5lLHt3aWR0aCA6ICh0aGlzLndpZHRoIHx8ICcyNzBweCcpLCBiYWNrZ3Jv dW5kQ29sb3IgOiAnI2ZmZid9LHRoaXMpOwoJCQkJdGhpcy5hZGRQYW5lKCk7CgkJCQl0aGlzLm5l LnNlbGVjdGVkSW5zdGFuY2Uuc2F2ZVJuZygpOwoJCQl9CgkJfQoJfSwKCglhZGRGb3JtIDogZnVu Y3Rpb24oZixlbG0pIHsKCQl0aGlzLmZvcm0gPSBuZXcgYmtFbGVtZW50KCdmb3JtJykuYWRkRXZl bnQoJ3N1Ym1pdCcsdGhpcy5zdWJtaXQuY2xvc3VyZUxpc3RlbmVyKHRoaXMpKTsKCQl0aGlzLnBh bmUuYXBwZW5kKHRoaXMuZm9ybSk7CgkJdGhpcy5pbnB1dHMgPSB7fTsKCgkJZm9yKGl0bSBpbiBm KSB7CgkJCXZhciBmaWVsZCA9IGZbaXRtXTsKCQkJdmFyIHZhbCA9ICcnOwoJCQlpZihlbG0pIHsK CQkJCXZhbCA9IGVsbS5nZXRBdHRyaWJ1dGUoaXRtKTsKCQkJfQoJCQlpZighdmFsKSB7CgkJCQl2 YWwgPSBmaWVsZFsndmFsdWUnXSB8fCAnJzsKCQkJfQoJCQl2YXIgdHlwZSA9IGZbaXRtXS50eXBl OwoKCQkJaWYodHlwZSA9PSAndGl0bGUnKSB7CgkJCQkJbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0 Q29udGVudChmaWVsZC50eHQpLnNldFN0eWxlKHtmb250U2l6ZSA6ICcxNHB4JywgZm9udFdlaWdo dDogJ2JvbGQnLCBwYWRkaW5nIDogJzBweCcsIG1hcmdpbiA6ICcycHggMCd9KS5hcHBlbmRUbyh0 aGlzLmZvcm0pOwoJCQl9IGVsc2UgewoJCQkJdmFyIGNvbnRhaW4gPSBuZXcgYmtFbGVtZW50KCdk aXYnKS5zZXRTdHlsZSh7b3ZlcmZsb3cgOiAnaGlkZGVuJywgY2xlYXIgOiAnYm90aCd9KS5hcHBl bmRUbyh0aGlzLmZvcm0pOwoJCQkJaWYoZmllbGQudHh0KSB7CgkJCQkJbmV3IGJrRWxlbWVudCgn bGFiZWwnKS5zZXRBdHRyaWJ1dGVzKHsnZm9yJyA6IGl0bX0pLnNldENvbnRlbnQoZmllbGQudHh0 KS5zZXRTdHlsZSh7bWFyZ2luIDogJzJweCA0cHgnLCBmb250U2l6ZSA6ICcxM3B4Jywgd2lkdGg6 ICc1MHB4JywgbGluZUhlaWdodCA6ICcyMHB4JywgdGV4dEFsaWduIDogJ3JpZ2h0JywgJ2Zsb2F0 JyA6ICdsZWZ0J30pLmFwcGVuZFRvKGNvbnRhaW4pOwoJCQkJfQoKCQkJCXN3aXRjaCh0eXBlKSB7 CgkJCQkJY2FzZSAndGV4dCc6CgkJCQkJCXRoaXMuaW5wdXRzW2l0bV0gPSBuZXcgYmtFbGVtZW50 KCdpbnB1dCcpLnNldEF0dHJpYnV0ZXMoe2lkIDogaXRtLCAndmFsdWUnIDogdmFsLCAndHlwZScg OiAndGV4dCd9KS5zZXRTdHlsZSh7bWFyZ2luIDogJzJweCAwJywgZm9udFNpemUgOiAnMTNweCcs ICdmbG9hdCcgOiAnbGVmdCcsIGhlaWdodCA6ICcyMHB4JywgYm9yZGVyIDogJzFweCBzb2xpZCAj Y2NjJywgb3ZlcmZsb3cgOiAnaGlkZGVuJ30pLnNldFN0eWxlKGZpZWxkLnN0eWxlKS5hcHBlbmRU byhjb250YWluKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnc2VsZWN0JzoKCQkJCQkJdGhpcy5p bnB1dHNbaXRtXSA9IG5ldyBia0VsZW1lbnQoJ3NlbGVjdCcpLnNldEF0dHJpYnV0ZXMoe2lkIDog aXRtfSkuc2V0U3R5bGUoe2JvcmRlciA6ICcxcHggc29saWQgI2NjYycsICdmbG9hdCcgOiAnbGVm dCcsIG1hcmdpbiA6ICcycHggMCd9KS5hcHBlbmRUbyhjb250YWluKTsKCQkJCQkJZm9yKG9wdCBp biBmaWVsZC5vcHRpb25zKSB7CgkJCQkJCQl2YXIgbyA9IG5ldyBia0VsZW1lbnQoJ29wdGlvbicp LnNldEF0dHJpYnV0ZXMoe3ZhbHVlIDogb3B0LCBzZWxlY3RlZCA6IChvcHQgPT0gdmFsKSA/ICdz ZWxlY3RlZCcgOiAnJ30pLnNldENvbnRlbnQoZmllbGQub3B0aW9uc1tvcHRdKS5hcHBlbmRUbyh0 aGlzLmlucHV0c1tpdG1dKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlICdjb250ZW50 JzoKCQkJCQkJdGhpcy5pbnB1dHNbaXRtXSA9IG5ldyBia0VsZW1lbnQoJ3RleHRhcmVhJykuc2V0 QXR0cmlidXRlcyh7aWQgOiBpdG19KS5zZXRTdHlsZSh7Ym9yZGVyIDogJzFweCBzb2xpZCAjY2Nj JywgJ2Zsb2F0JyA6ICdsZWZ0J30pLnNldFN0eWxlKGZpZWxkLnN0eWxlKS5hcHBlbmRUbyhjb250 YWluKTsKCQkJCQkJdGhpcy5pbnB1dHNbaXRtXS52YWx1ZSA9IHZhbDsKCQkJCX0KCQkJfQoJCX0K CQluZXcgYmtFbGVtZW50KCdpbnB1dCcpLnNldEF0dHJpYnV0ZXMoeyd0eXBlJyA6ICdzdWJtaXQn fSkuc2V0U3R5bGUoe2JhY2tncm91bmRDb2xvciA6ICcjZWZlZmVmJyxib3JkZXIgOiAnMXB4IHNv bGlkICNjY2MnLCBtYXJnaW4gOiAnM3B4IDAnLCAnZmxvYXQnIDogJ2xlZnQnLCAnY2xlYXInIDog J2JvdGgnfSkuYXBwZW5kVG8odGhpcy5mb3JtKTsKCQl0aGlzLmZvcm0ub25zdWJtaXQgPSBia0xp Yi5jYW5jZWxFdmVudDsKCX0sCgoJc3VibWl0IDogZnVuY3Rpb24oKSB7IH0sCgoJZmluZEVsbSA6 IGZ1bmN0aW9uKHRhZyxhdHRyLHZhbCkgewoJCXZhciBsaXN0ID0gdGhpcy5uZS5zZWxlY3RlZElu c3RhbmNlLmdldEVsbSgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZyk7CgkJZm9yKHZhciBpPTA7 aTxsaXN0Lmxlbmd0aDtpKyspIHsKCQkJaWYobGlzdFtpXS5nZXRBdHRyaWJ1dGUoYXR0cikgPT0g dmFsKSB7CgkJCQlyZXR1cm4gJEJLKGxpc3RbaV0pOwoJCQl9CgkJfQoJfSwKCglyZW1vdmVQYW5l IDogZnVuY3Rpb24oKSB7CgkJaWYodGhpcy5wYW5lKSB7CgkJCXRoaXMucGFuZS5yZW1vdmUoKTsK CQkJdGhpcy5wYW5lID0gbnVsbDsKCQkJdGhpcy5uZS5zZWxlY3RlZEluc3RhbmNlLnJlc3RvcmVS bmcoKTsKCQl9Cgl9Cn0pOwoKCnZhciBuaWNCdXR0b25UaXBzID0gYmtDbGFzcy5leHRlbmQoewoJ Y29uc3RydWN0IDogZnVuY3Rpb24obmljRWRpdG9yKSB7CgkJdGhpcy5uZSA9IG5pY0VkaXRvcjsK CQluaWNFZGl0b3IuYWRkRXZlbnQoJ2J1dHRvbk92ZXInLHRoaXMuc2hvdy5jbG9zdXJlKHRoaXMp KS5hZGRFdmVudCgnYnV0dG9uT3V0Jyx0aGlzLmhpZGUuY2xvc3VyZSh0aGlzKSk7CgoJfSwKCglz aG93IDogZnVuY3Rpb24oYnV0dG9uKSB7CgkJdGhpcy50aW1lciA9IHNldFRpbWVvdXQodGhpcy5j cmVhdGUuY2xvc3VyZSh0aGlzLGJ1dHRvbiksNDAwKTsKCX0sCgoJY3JlYXRlIDogZnVuY3Rpb24o YnV0dG9uKSB7CgkJdGhpcy50aW1lciA9IG51bGw7CgkJaWYoIXRoaXMucGFuZSkgewoJCQl0aGlz LnBhbmUgPSBuZXcgbmljRWRpdG9yUGFuZShidXR0b24uYnV0dG9uLHRoaXMubmUse2ZvbnRTaXpl IDogJzEycHgnLCBtYXJnaW5Ub3AgOiAnNXB4J30pOwoJCQl0aGlzLnBhbmUuc2V0Q29udGVudChi dXR0b24ub3B0aW9ucy5uYW1lKTsKCQl9Cgl9LAoKCWhpZGUgOiBmdW5jdGlvbihidXR0b24pIHsK CQlpZih0aGlzLnRpbWVyKSB7CgkJCWNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsKCQl9CgkJaWYo dGhpcy5wYW5lKSB7CgkJCXRoaXMucGFuZSA9IHRoaXMucGFuZS5yZW1vdmUoKTsKCQl9Cgl9Cn0p OwpuaWNFZGl0b3JzLnJlZ2lzdGVyUGx1Z2luKG5pY0J1dHRvblRpcHMpOwoKCgogLyogU1RBUlQg Q09ORklHICovCnZhciBuaWNTZWxlY3RPcHRpb25zID0gewoJYnV0dG9ucyA6IHsKCQknZm9udFNp emUnIDoge25hbWUgOiBfXygnU2VsZWN0IEZvbnQgU2l6ZScpLCB0eXBlIDogJ25pY0VkaXRvckZv bnRTaXplU2VsZWN0JywgY29tbWFuZCA6ICdmb250c2l6ZSd9LAoJCSdmb250RmFtaWx5JyA6IHtu YW1lIDogX18oJ1NlbGVjdCBGb250IEZhbWlseScpLCB0eXBlIDogJ25pY0VkaXRvckZvbnRGYW1p bHlTZWxlY3QnLCBjb21tYW5kIDogJ2ZvbnRuYW1lJ30sCgkJJ2ZvbnRGb3JtYXQnIDoge25hbWUg OiBfXygnU2VsZWN0IEZvbnQgRm9ybWF0JyksIHR5cGUgOiAnbmljRWRpdG9yRm9udEZvcm1hdFNl bGVjdCcsIGNvbW1hbmQgOiAnZm9ybWF0QmxvY2snfQoJfQp9OwovKiBFTkQgQ09ORklHICovCnZh ciBuaWNFZGl0b3JTZWxlY3QgPSBia0NsYXNzLmV4dGVuZCh7CgoJY29uc3RydWN0IDogZnVuY3Rp b24oZSxidXR0b25OYW1lLG9wdGlvbnMsbmljRWRpdG9yKSB7CgkJdGhpcy5vcHRpb25zID0gb3B0 aW9ucy5idXR0b25zW2J1dHRvbk5hbWVdOwoJCXRoaXMuZWxtID0gZTsKCQl0aGlzLm5lID0gbmlj RWRpdG9yOwoJCXRoaXMubmFtZSA9IGJ1dHRvbk5hbWU7CgkJdGhpcy5zZWxPcHRpb25zID0gbmV3 IEFycmF5KCk7CgoJCXRoaXMubWFyZ2luID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUo eydmbG9hdCcgOiAnbGVmdCcsIG1hcmdpbiA6ICcycHggMXB4IDAgMXB4J30pLmFwcGVuZFRvKHRo aXMuZWxtKTsKCQl0aGlzLmNvbnRhaW4gPSBuZXcgYmtFbGVtZW50KCdkaXYnKS5zZXRTdHlsZSh7 d2lkdGg6ICc5MHB4JywgaGVpZ2h0IDogJzIwcHgnLCBjdXJzb3IgOiAncG9pbnRlcicsIG92ZXJm bG93OiAnaGlkZGVuJ30pLmFkZENsYXNzKCdzZWxlY3RDb250YWluJykuYWRkRXZlbnQoJ2NsaWNr Jyx0aGlzLnRvZ2dsZS5jbG9zdXJlKHRoaXMpKS5hcHBlbmRUbyh0aGlzLm1hcmdpbik7CgkJdGhp cy5pdGVtcyA9IG5ldyBia0VsZW1lbnQoJ2RpdicpLnNldFN0eWxlKHtvdmVyZmxvdyA6ICdoaWRk ZW4nLCB6b29tIDogMSwgYm9yZGVyOiAnMXB4IHNvbGlkICNjY2MnLCBwYWRkaW5nTGVmdCA6ICcz cHgnLCBiYWNrZ3JvdW5kQ29sb3IgOiAnI2ZmZid9KS5hcHBlbmRUbyh0aGlzLmNvbnRhaW4pOwoJ CXRoaXMuY29udHJvbCA9IG5ldyBia0VsZW1lbnQoJ2RpdicpLnNldFN0eWxlKHtvdmVyZmxvdyA6 ICdoaWRkZW4nLCAnZmxvYXQnIDogJ3JpZ2h0JywgaGVpZ2h0OiAnMThweCcsIHdpZHRoIDogJzE2 cHgnfSkuYWRkQ2xhc3MoJ3NlbGVjdENvbnRyb2wnKS5zZXRTdHlsZSh0aGlzLm5lLmdldEljb24o J2Fycm93JyxvcHRpb25zKSkuYXBwZW5kVG8odGhpcy5pdGVtcyk7CgkJdGhpcy50eHQgPSBuZXcg YmtFbGVtZW50KCdkaXYnKS5zZXRTdHlsZSh7b3ZlcmZsb3cgOiAnaGlkZGVuJywgJ2Zsb2F0JyA6 ICdsZWZ0Jywgd2lkdGggOiAnNjZweCcsIGhlaWdodCA6ICcxNHB4JywgbWFyZ2luVG9wIDogJzFw eCcsIGZvbnRGYW1pbHkgOiAnc2Fucy1zZXJpZicsIHRleHRBbGlnbiA6ICdjZW50ZXInLCBmb250 U2l6ZSA6ICcxMnB4J30pLmFkZENsYXNzKCdzZWxlY3RUeHQnKS5hcHBlbmRUbyh0aGlzLml0ZW1z KTsKCgkJaWYoIXdpbmRvdy5vcGVyYSkgewoJCQl0aGlzLmNvbnRhaW4ub25tb3VzZWRvd24gPSB0 aGlzLmNvbnRyb2wub25tb3VzZWRvd24gPSB0aGlzLnR4dC5vbm1vdXNlZG93biA9IGJrTGliLmNh bmNlbEV2ZW50OwoJCX0KCgkJdGhpcy5tYXJnaW4ubm9TZWxlY3QoKTsKCgkJdGhpcy5uZS5hZGRF dmVudCgnc2VsZWN0ZWQnLCB0aGlzLmVuYWJsZS5jbG9zdXJlKHRoaXMpKS5hZGRFdmVudCgnYmx1 cicsIHRoaXMuZGlzYWJsZS5jbG9zdXJlKHRoaXMpKTsKCgkJdGhpcy5kaXNhYmxlKCk7CgkJdGhp cy5pbml0KCk7Cgl9LAoKCWRpc2FibGUgOiBmdW5jdGlvbigpIHsKCQl0aGlzLmlzRGlzYWJsZWQg PSB0cnVlOwoJCXRoaXMuY2xvc2UoKTsKCQl0aGlzLmNvbnRhaW4uc2V0U3R5bGUoe29wYWNpdHkg OiAwLjZ9KTsKCX0sCgoJZW5hYmxlIDogZnVuY3Rpb24odCkgewoJCXRoaXMuaXNEaXNhYmxlZCA9 IGZhbHNlOwoJCXRoaXMuY2xvc2UoKTsKCQl0aGlzLmNvbnRhaW4uc2V0U3R5bGUoe29wYWNpdHkg OiAxfSk7Cgl9LAoKCXNldERpc3BsYXkgOiBmdW5jdGlvbih0eHQpIHsKCQl0aGlzLnR4dC5zZXRD b250ZW50KHR4dCk7Cgl9LAoKCXRvZ2dsZSA6IGZ1bmN0aW9uKCkgewoJCWlmKCF0aGlzLmlzRGlz YWJsZWQpIHsKCQkJKHRoaXMucGFuZSkgPyB0aGlzLmNsb3NlKCkgOiB0aGlzLm9wZW4oKTsKCQl9 Cgl9LAoKCW9wZW4gOiBmdW5jdGlvbigpIHsKCQl0aGlzLnBhbmUgPSBuZXcgbmljRWRpdG9yUGFu ZSh0aGlzLml0ZW1zLHRoaXMubmUse3dpZHRoIDogJzg4cHgnLCBwYWRkaW5nOiAnMHB4JywgYm9y ZGVyVG9wIDogMCwgYm9yZGVyTGVmdCA6ICcxcHggc29saWQgI2NjYycsIGJvcmRlclJpZ2h0IDog JzFweCBzb2xpZCAjY2NjJywgYm9yZGVyQm90dG9tIDogJzBweCcsIGJhY2tncm91bmRDb2xvciA6 ICcjZmZmJ30pOwoKCQlmb3IodmFyIGk9MDtpPHRoaXMuc2VsT3B0aW9ucy5sZW5ndGg7aSsrKSB7 CgkJCXZhciBvcHQgPSB0aGlzLnNlbE9wdGlvbnNbaV07CgkJCXZhciBpdG1Db250YWluID0gbmV3 IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUoe292ZXJmbG93IDogJ2hpZGRlbicsIGJvcmRlckJv dHRvbSA6ICcxcHggc29saWQgI2NjYycsIHdpZHRoOiAnODhweCcsIHRleHRBbGlnbiA6ICdsZWZ0 Jywgb3ZlcmZsb3cgOiAnaGlkZGVuJywgY3Vyc29yIDogJ3BvaW50ZXInfSk7CgkJCXZhciBpdG0g PSBuZXcgYmtFbGVtZW50KCdkaXYnKS5zZXRTdHlsZSh7cGFkZGluZyA6ICcwcHggNHB4J30pLnNl dENvbnRlbnQob3B0WzFdKS5hcHBlbmRUbyhpdG1Db250YWluKS5ub1NlbGVjdCgpOwoJCQlpdG0u YWRkRXZlbnQoJ2NsaWNrJyx0aGlzLnVwZGF0ZS5jbG9zdXJlKHRoaXMsb3B0WzBdKSkuYWRkRXZl bnQoJ21vdXNlb3ZlcicsdGhpcy5vdmVyLmNsb3N1cmUodGhpcyxpdG0pKS5hZGRFdmVudCgnbW91 c2VvdXQnLHRoaXMub3V0LmNsb3N1cmUodGhpcyxpdG0pKS5zZXRBdHRyaWJ1dGVzKCdpZCcsb3B0 WzBdKTsKCQkJdGhpcy5wYW5lLmFwcGVuZChpdG1Db250YWluKTsKCQkJaWYoIXdpbmRvdy5vcGVy YSkgewoJCQkJaXRtLm9ubW91c2Vkb3duID0gYmtMaWIuY2FuY2VsRXZlbnQ7CgkJCX0KCQl9Cgl9 LAoKCWNsb3NlIDogZnVuY3Rpb24oKSB7CgkJaWYodGhpcy5wYW5lKSB7CgkJCXRoaXMucGFuZSA9 IHRoaXMucGFuZS5yZW1vdmUoKTsKCQl9Cgl9LAoKCW92ZXIgOiBmdW5jdGlvbihvcHQpIHsKCQlv cHQuc2V0U3R5bGUoe2JhY2tncm91bmRDb2xvciA6ICcjY2NjJ30pOwoJfSwKCglvdXQgOiBmdW5j dGlvbihvcHQpIHsKCQlvcHQuc2V0U3R5bGUoe2JhY2tncm91bmRDb2xvciA6ICcjZmZmJ30pOwoJ fSwKCgoJYWRkIDogZnVuY3Rpb24oayx2KSB7CgkJdGhpcy5zZWxPcHRpb25zLnB1c2gobmV3IEFy cmF5KGssdikpOwoJfSwKCgl1cGRhdGUgOiBmdW5jdGlvbihlbG0pIHsKCQl0aGlzLm5lLm5pY0Nv bW1hbmQodGhpcy5vcHRpb25zLmNvbW1hbmQsZWxtKTsKCQl0aGlzLmNsb3NlKCk7Cgl9Cn0pOwoK dmFyIG5pY0VkaXRvckZvbnRTaXplU2VsZWN0ID0gbmljRWRpdG9yU2VsZWN0LmV4dGVuZCh7Cglz ZWwgOiB7MSA6ICcxJm5ic3A7KDhwdCknLCAyIDogJzImbmJzcDsoMTBwdCknLCAzIDogJzMmbmJz cDsoMTJwdCknLCA0IDogJzQmbmJzcDsoMTRwdCknLCA1IDogJzUmbmJzcDsoMThwdCknLCA2IDog JzYmbmJzcDsoMjRwdCknfSwKCWluaXQgOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldERpc3BsYXko J0ZvbnQmbmJzcDtTaXplLi4uJyk7CgkJZm9yKGl0bSBpbiB0aGlzLnNlbCkgewoJCQl0aGlzLmFk ZChpdG0sJzxmb250IHNpemU9IicraXRtKyciPicrdGhpcy5zZWxbaXRtXSsnPC9mb250PicpOwoJ CX0KCX0KfSk7Cgp2YXIgbmljRWRpdG9yRm9udEZhbWlseVNlbGVjdCA9IG5pY0VkaXRvclNlbGVj dC5leHRlbmQoewoJc2VsIDogeydhcmlhbCcgOiAnQXJpYWwnLCdjb21pYyBzYW5zIG1zJyA6ICdD b21pYyBTYW5zJywnY291cmllciBuZXcnIDogJ0NvdXJpZXIgTmV3JywnZ2VvcmdpYScgOiAnR2Vv cmdpYScsICdoZWx2ZXRpY2EnIDogJ0hlbHZldGljYScsICdpbXBhY3QnIDogJ0ltcGFjdCcsICd0 aW1lcyBuZXcgcm9tYW4nIDogJ1RpbWVzJywgJ3RyZWJ1Y2hldCBtcycgOiAnVHJlYnVjaGV0Jywg J3ZlcmRhbmEnIDogJ1ZlcmRhbmEnfSwKCglpbml0IDogZnVuY3Rpb24oKSB7CgkJdGhpcy5zZXRE aXNwbGF5KCdGb250Jm5ic3A7RmFtaWx5Li4uJyk7CgkJZm9yKGl0bSBpbiB0aGlzLnNlbCkgewoJ CQl0aGlzLmFkZChpdG0sJzxmb250IGZhY2U9IicraXRtKyciPicrdGhpcy5zZWxbaXRtXSsnPC9m b250PicpOwoJCX0KCX0KfSk7Cgp2YXIgbmljRWRpdG9yRm9udEZvcm1hdFNlbGVjdCA9IG5pY0Vk aXRvclNlbGVjdC5leHRlbmQoewoJCXNlbCA6IHsncCcgOiAnUGFyYWdyYXBoJywgJ3ByZScgOiAn UHJlJywgJ2g2JyA6ICdIZWFkaW5nJm5ic3A7NicsICdoNScgOiAnSGVhZGluZyZuYnNwOzUnLCAn aDQnIDogJ0hlYWRpbmcmbmJzcDs0JywgJ2gzJyA6ICdIZWFkaW5nJm5ic3A7MycsICdoMicgOiAn SGVhZGluZyZuYnNwOzInLCAnaDEnIDogJ0hlYWRpbmcmbmJzcDsxJ30sCgoJaW5pdCA6IGZ1bmN0 aW9uKCkgewoJCXRoaXMuc2V0RGlzcGxheSgnRm9udCZuYnNwO0Zvcm1hdC4uLicpOwoJCWZvcihp dG0gaW4gdGhpcy5zZWwpIHsKCQkJdmFyIHRhZyA9IGl0bS50b1VwcGVyQ2FzZSgpOwoJCQl0aGlz LmFkZCgnPCcrdGFnKyc+JywnPCcraXRtKycgc3R5bGU9InBhZGRpbmc6IDBweDsgbWFyZ2luOiAw cHg7Ij4nK3RoaXMuc2VsW2l0bV0rJzwvJyt0YWcrJz4nKTsKCQl9Cgl9Cn0pOwoKbmljRWRpdG9y cy5yZWdpc3RlclBsdWdpbihuaWNQbHVnaW4sbmljU2VsZWN0T3B0aW9ucyk7CgoKCi8qIFNUQVJU IENPTkZJRyAqLwp2YXIgbmljTGlua09wdGlvbnMgPSB7CglidXR0b25zIDogewoJCSdsaW5rJyA6 IHtuYW1lIDogJ0FkZCBMaW5rJywgdHlwZSA6ICduaWNMaW5rQnV0dG9uJywgdGFncyA6IFsnQSdd fSwKCQkndW5saW5rJyA6IHtuYW1lIDogJ1JlbW92ZSBMaW5rJywgIGNvbW1hbmQgOiAndW5saW5r Jywgbm9BY3RpdmUgOiB0cnVlfQoJfQp9OwovKiBFTkQgQ09ORklHICovCgp2YXIgbmljTGlua0J1 dHRvbiA9IG5pY0VkaXRvckFkdmFuY2VkQnV0dG9uLmV4dGVuZCh7CglhZGRQYW5lIDogZnVuY3Rp b24oKSB7CgkJdGhpcy5sbiA9IHRoaXMubmUuc2VsZWN0ZWRJbnN0YW5jZS5zZWxFbG0oKS5wYXJl bnRUYWcoJ0EnKTsKCQl0aGlzLmFkZEZvcm0oewoJCQknJyA6IHt0eXBlIDogJ3RpdGxlJywgdHh0 IDogJ0FkZC9FZGl0IExpbmsnfSwKCQkJJ2hyZWYnIDoge3R5cGUgOiAndGV4dCcsIHR4dCA6ICdV UkwnLCB2YWx1ZSA6ICdodHRwOi8vJywgc3R5bGUgOiB7d2lkdGg6ICcxNTBweCd9fSwKCQkJJ3Rp dGxlJyA6IHt0eXBlIDogJ3RleHQnLCB0eHQgOiAnVGl0bGUnfSwKCQkJJ3RhcmdldCcgOiB7dHlw ZSA6ICdzZWxlY3QnLCB0eHQgOiAnT3BlbiBJbicsIG9wdGlvbnMgOiB7JycgOiAnQ3VycmVudCBX aW5kb3cnLCAnX2JsYW5rJyA6ICdOZXcgV2luZG93J30sc3R5bGUgOiB7d2lkdGggOiAnMTAwcHgn fX0KCQl9LHRoaXMubG4pOwoJfSwKCglzdWJtaXQgOiBmdW5jdGlvbihlKSB7CgkJdmFyIHVybCA9 IHRoaXMuaW5wdXRzWydocmVmJ10udmFsdWU7CgkJaWYodXJsID09ICJodHRwOi8vIiB8fCB1cmwg PT0gIiIpIHsKCQkJYWxlcnQoIllvdSBtdXN0IGVudGVyIGEgVVJMIHRvIENyZWF0ZSBhIExpbmsi KTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQl0aGlzLnJlbW92ZVBhbmUoKTsKCgkJaWYoIXRoaXMu bG4pIHsKCQkJdmFyIHRtcCA9ICdqYXZhc2NyaXB0Om5pY1RlbXAoKTsnOwoJCQl0aGlzLm5lLm5p Y0NvbW1hbmQoImNyZWF0ZWxpbmsiLHRtcCk7CgkJCXRoaXMubG4gPSB0aGlzLmZpbmRFbG0oJ0En LCdocmVmJyx0bXApOwoJCQkvLyBzZXQgdGhlIGxpbmsgdGV4dCB0byB0aGUgdGl0bGUgb3IgdGhl IHVybCBpZiB0aGVyZSBpcyBubyB0ZXh0IHNlbGVjdGVkCgkJCWlmICh0aGlzLmxuLmlubmVySFRN TCA9PSB0bXApIHsKCQkJCXRoaXMubG4uaW5uZXJIVE1MID0gdGhpcy5pbnB1dHNbJ3RpdGxlJ10u dmFsdWUgfHwgdXJsOwoJCQl9OwoJCX0KCQlpZih0aGlzLmxuKSB7CgkJCXZhciBvbGRUaXRsZSA9 IHRoaXMubG4udGl0bGU7CgkJCXRoaXMubG4uc2V0QXR0cmlidXRlcyh7CgkJCQlocmVmIDogdGhp cy5pbnB1dHNbJ2hyZWYnXS52YWx1ZSwKCQkJCXRpdGxlIDogdGhpcy5pbnB1dHNbJ3RpdGxlJ10u dmFsdWUsCgkJCQl0YXJnZXQgOiB0aGlzLmlucHV0c1sndGFyZ2V0J10ub3B0aW9uc1t0aGlzLmlu cHV0c1sndGFyZ2V0J10uc2VsZWN0ZWRJbmRleF0udmFsdWUKCQkJfSk7CgkJCS8vIHNldCB0aGUg bGluayB0ZXh0IHRvIHRoZSB0aXRsZSBvciB0aGUgdXJsIGlmIHRoZSBvbGQgdGV4dCB3YXMgdGhl IG9sZCB0aXRsZQoJCQlpZiAodGhpcy5sbi5pbm5lckhUTUwgPT0gb2xkVGl0bGUpIHsKCQkJCXRo aXMubG4uaW5uZXJIVE1MID0gdGhpcy5pbnB1dHNbJ3RpdGxlJ10udmFsdWUgfHwgdGhpcy5pbnB1 dHNbJ2hyZWYnXS52YWx1ZTsKCQkJfTsKCQl9Cgl9Cn0pOwoKbmljRWRpdG9ycy5yZWdpc3RlclBs dWdpbihuaWNQbHVnaW4sbmljTGlua09wdGlvbnMpOwoKCgovKiBTVEFSVCBDT05GSUcgKi8KdmFy IG5pY0NvbG9yT3B0aW9ucyA9IHsKCWJ1dHRvbnMgOiB7CgkJJ2ZvcmVjb2xvcicgOiB7bmFtZSA6 IF9fKCdDaGFuZ2UgVGV4dCBDb2xvcicpLCB0eXBlIDogJ25pY0VkaXRvckNvbG9yQnV0dG9uJywg bm9DbG9zZSA6IHRydWV9LAoJCSdiZ2NvbG9yJyA6IHtuYW1lIDogX18oJ0NoYW5nZSBCYWNrZ3Jv dW5kIENvbG9yJyksIHR5cGUgOiAnbmljRWRpdG9yQmdDb2xvckJ1dHRvbicsIG5vQ2xvc2UgOiB0 cnVlfQoJfQp9OwovKiBFTkQgQ09ORklHICovCgp2YXIgbmljRWRpdG9yQ29sb3JCdXR0b24gPSBu aWNFZGl0b3JBZHZhbmNlZEJ1dHRvbi5leHRlbmQoewoJYWRkUGFuZSA6IGZ1bmN0aW9uKCkgewoJ CQl2YXIgY29sb3JMaXN0ID0gezAgOiAnMDAnLDEgOiAnMzMnLDIgOiAnNjYnLDMgOic5OScsNCA6 ICdDQycsNSA6ICdGRid9OwoJCQl2YXIgY29sb3JJdGVtcyA9IG5ldyBia0VsZW1lbnQoJ0RJVicp LnNldFN0eWxlKHt3aWR0aDogJzI3MHB4J30pOwoKCQkJZm9yKHZhciByIGluIGNvbG9yTGlzdCkg ewoJCQkJZm9yKHZhciBiIGluIGNvbG9yTGlzdCkgewoJCQkJCWZvcih2YXIgZyBpbiBjb2xvckxp c3QpIHsKCQkJCQkJdmFyIGNvbG9yQ29kZSA9ICcjJytjb2xvckxpc3Rbcl0rY29sb3JMaXN0W2dd K2NvbG9yTGlzdFtiXTsKCgkJCQkJCXZhciBjb2xvclNxdWFyZSA9IG5ldyBia0VsZW1lbnQoJ0RJ VicpLnNldFN0eWxlKHsnY3Vyc29yJyA6ICdwb2ludGVyJywgJ2hlaWdodCcgOiAnMTVweCcsICdm bG9hdCcgOiAnbGVmdCd9KS5hcHBlbmRUbyhjb2xvckl0ZW1zKTsKCQkJCQkJdmFyIGNvbG9yQm9y ZGVyID0gbmV3IGJrRWxlbWVudCgnRElWJykuc2V0U3R5bGUoe2JvcmRlcjogJzJweCBzb2xpZCAn K2NvbG9yQ29kZX0pLmFwcGVuZFRvKGNvbG9yU3F1YXJlKTsKCQkJCQkJdmFyIGNvbG9ySW5uZXIg PSBuZXcgYmtFbGVtZW50KCdESVYnKS5zZXRTdHlsZSh7YmFja2dyb3VuZENvbG9yIDogY29sb3JD b2RlLCBvdmVyZmxvdyA6ICdoaWRkZW4nLCB3aWR0aCA6ICcxMXB4JywgaGVpZ2h0IDogJzExcHgn fSkuYWRkRXZlbnQoJ2NsaWNrJyx0aGlzLmNvbG9yU2VsZWN0LmNsb3N1cmUodGhpcyxjb2xvckNv ZGUpKS5hZGRFdmVudCgnbW91c2VvdmVyJyx0aGlzLm9uLmNsb3N1cmUodGhpcyxjb2xvckJvcmRl cikpLmFkZEV2ZW50KCdtb3VzZW91dCcsdGhpcy5vZmYuY2xvc3VyZSh0aGlzLGNvbG9yQm9yZGVy LGNvbG9yQ29kZSkpLmFwcGVuZFRvKGNvbG9yQm9yZGVyKTsKCgkJCQkJCWlmKCF3aW5kb3cub3Bl cmEpIHsKCQkJCQkJCWNvbG9yU3F1YXJlLm9ubW91c2Vkb3duID0gY29sb3JJbm5lci5vbm1vdXNl ZG93biA9IGJrTGliLmNhbmNlbEV2ZW50OwoJCQkJCQl9CgoJCQkJCX0KCQkJCX0KCQkJfQoJCQl0 aGlzLnBhbmUuYXBwZW5kKGNvbG9ySXRlbXMubm9TZWxlY3QoKSk7Cgl9LAoKCWNvbG9yU2VsZWN0 IDogZnVuY3Rpb24oYykgewoJCXRoaXMubmUubmljQ29tbWFuZCgnZm9yZUNvbG9yJyxjKTsKCQl0 aGlzLnJlbW92ZVBhbmUoKTsKCX0sCgoJb24gOiBmdW5jdGlvbihjb2xvckJvcmRlcikgewoJCWNv bG9yQm9yZGVyLnNldFN0eWxlKHtib3JkZXIgOiAnMnB4IHNvbGlkICMwMDAnfSk7Cgl9LAoKCW9m ZiA6IGZ1bmN0aW9uKGNvbG9yQm9yZGVyLGNvbG9yQ29kZSkgewoJCWNvbG9yQm9yZGVyLnNldFN0 eWxlKHtib3JkZXIgOiAnMnB4IHNvbGlkICcrY29sb3JDb2RlfSk7Cgl9Cn0pOwoKdmFyIG5pY0Vk aXRvckJnQ29sb3JCdXR0b24gPSBuaWNFZGl0b3JDb2xvckJ1dHRvbi5leHRlbmQoewoJY29sb3JT ZWxlY3QgOiBmdW5jdGlvbihjKSB7CgkJdGhpcy5uZS5uaWNDb21tYW5kKCdoaWxpdGVDb2xvcics Yyk7CgkJdGhpcy5yZW1vdmVQYW5lKCk7Cgl9Cn0pOwoKbmljRWRpdG9ycy5yZWdpc3RlclBsdWdp bihuaWNQbHVnaW4sbmljQ29sb3JPcHRpb25zKTsKCgoKLyogU1RBUlQgQ09ORklHICovCnZhciBu aWNJbWFnZU9wdGlvbnMgPSB7CglidXR0b25zIDogewoJCSdpbWFnZScgOiB7bmFtZSA6ICdBZGQg SW1hZ2UnLCB0eXBlIDogJ25pY0ltYWdlQnV0dG9uJywgdGFncyA6IFsnSU1HJ119Cgl9Cgp9Owov KiBFTkQgQ09ORklHICovCgp2YXIgbmljSW1hZ2VCdXR0b24gPSBuaWNFZGl0b3JBZHZhbmNlZEJ1 dHRvbi5leHRlbmQoewoJYWRkUGFuZSA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaW0gPSB0aGlzLm5l LnNlbGVjdGVkSW5zdGFuY2Uuc2VsRWxtKCkucGFyZW50VGFnKCdJTUcnKTsKCQl0aGlzLmFkZEZv cm0oewoJCQknJyA6IHt0eXBlIDogJ3RpdGxlJywgdHh0IDogJ0FkZC9FZGl0IEltYWdlJ30sCgkJ CSdzcmMnIDoge3R5cGUgOiAndGV4dCcsIHR4dCA6ICdVUkwnLCAndmFsdWUnIDogJ2h0dHA6Ly8n LCBzdHlsZSA6IHt3aWR0aDogJzE1MHB4J319LAoJCQknYWx0JyA6IHt0eXBlIDogJ3RleHQnLCB0 eHQgOiAnQWx0IFRleHQnLCBzdHlsZSA6IHt3aWR0aDogJzEwMHB4J319LAoJCQknYWxpZ24nIDog e3R5cGUgOiAnc2VsZWN0JywgdHh0IDogJ0FsaWduJywgb3B0aW9ucyA6IHtub25lIDogJ0RlZmF1 bHQnLCdsZWZ0JyA6ICdMZWZ0JywgJ3JpZ2h0JyA6ICdSaWdodCd9fQoJCX0sdGhpcy5pbSk7Cgl9 LAoKCXN1Ym1pdCA6IGZ1bmN0aW9uKGUpIHsKCQl2YXIgc3JjID0gdGhpcy5pbnB1dHNbJ3NyYydd LnZhbHVlOwoJCWlmKHNyYyA9PSAiIiB8fCBzcmMgPT0gImh0dHA6Ly8iKSB7CgkJCWFsZXJ0KCJZ b3UgbXVzdCBlbnRlciBhIEltYWdlIFVSTCB0byBpbnNlcnQiKTsKCQkJcmV0dXJuIGZhbHNlOwoJ CX0KCQl0aGlzLnJlbW92ZVBhbmUoKTsKCgkJaWYoIXRoaXMuaW0pIHsKCQkJdmFyIHRtcCA9ICdq YXZhc2NyaXB0Om5pY0ltVGVtcCgpOyc7CgkJCXRoaXMubmUubmljQ29tbWFuZCgiaW5zZXJ0SW1h Z2UiLHRtcCk7CgkJCXRoaXMuaW0gPSB0aGlzLmZpbmRFbG0oJ0lNRycsJ3NyYycsdG1wKTsKCQl9 CgkJaWYodGhpcy5pbSkgewoJCQl0aGlzLmltLnNldEF0dHJpYnV0ZXMoewoJCQkJc3JjIDogdGhp cy5pbnB1dHNbJ3NyYyddLnZhbHVlLAoJCQkJYWx0IDogdGhpcy5pbnB1dHNbJ2FsdCddLnZhbHVl LAoJCQkJYWxpZ24gOiB0aGlzLmlucHV0c1snYWxpZ24nXS52YWx1ZQoJCQl9KTsKCQl9Cgl9Cn0p OwoKbmljRWRpdG9ycy5yZWdpc3RlclBsdWdpbihuaWNQbHVnaW4sbmljSW1hZ2VPcHRpb25zKTsK CgoKCi8qIFNUQVJUIENPTkZJRyAqLwp2YXIgbmljU2F2ZU9wdGlvbnMgPSB7CglidXR0b25zIDog ewoJCSdzYXZlJyA6IHtuYW1lIDogX18oJ1NhdmUgdGhpcyBjb250ZW50JyksIHR5cGUgOiAnbmlj RWRpdG9yU2F2ZUJ1dHRvbid9Cgl9Cn07Ci8qIEVORCBDT05GSUcgKi8KCnZhciBuaWNFZGl0b3JT YXZlQnV0dG9uID0gbmljRWRpdG9yQnV0dG9uLmV4dGVuZCh7Cglpbml0IDogZnVuY3Rpb24oKSB7 CgkJaWYoIXRoaXMubmUub3B0aW9ucy5vblNhdmUpIHsKCQkJdGhpcy5tYXJnaW4uc2V0U3R5bGUo eydkaXNwbGF5JyA6ICdub25lJ30pOwoJCX0KCX0sCgltb3VzZUNsaWNrIDogZnVuY3Rpb24oKSB7 CgkJdmFyIG9uU2F2ZSA9IHRoaXMubmUub3B0aW9ucy5vblNhdmU7CgkJdmFyIHNlbGVjdGVkSW5z dGFuY2UgPSB0aGlzLm5lLnNlbGVjdGVkSW5zdGFuY2U7CgkJb25TYXZlKHNlbGVjdGVkSW5zdGFu Y2UuZ2V0Q29udGVudCgpLCBzZWxlY3RlZEluc3RhbmNlLmVsbS5pZCwgc2VsZWN0ZWRJbnN0YW5j ZSk7Cgl9Cn0pOwoKbmljRWRpdG9ycy5yZWdpc3RlclBsdWdpbihuaWNQbHVnaW4sbmljU2F2ZU9w dGlvbnMpOwoKCgovKiBTVEFSVCBDT05GSUcgKi8KdmFyIG5pY1VwbG9hZE9wdGlvbnMgPSB7Cgli dXR0b25zIDogewoJCSd1cGxvYWQnIDoge25hbWUgOiAnVXBsb2FkIEltYWdlJywgdHlwZSA6ICdu aWNVcGxvYWRCdXR0b24nfQoJfQoKfTsKLyogRU5EIENPTkZJRyAqLwoKdmFyIG5pY1VwbG9hZEJ1 dHRvbiA9IG5pY0VkaXRvckFkdmFuY2VkQnV0dG9uLmV4dGVuZCh7CgluaWNVUkkgOiAnaHR0cDov L2ZpbGVzLm5pY2VkaXQuY29tLycsCgoJYWRkUGFuZSA6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaW0g PSB0aGlzLm5lLnNlbGVjdGVkSW5zdGFuY2Uuc2VsRWxtKCkucGFyZW50VGFnKCdJTUcnKTsKCQl0 aGlzLm15SUQgPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqTWF0aC5wb3coMTAsMTUpKTsKCQl0 aGlzLnJlcXVlc3RJbnRlcnZhbCA9IDEwMDA7CgkJdGhpcy51cmkgPSB0aGlzLm5lLm9wdGlvbnMu dXBsb2FkVVJJIHx8IHRoaXMubmljVVJJOwoJCW5pY1VwbG9hZEJ1dHRvbi5sYXN0UGx1Z2luID0g dGhpczsKCgkJdGhpcy5teUZyYW1lID0gbmV3IGJrRWxlbWVudCgnaWZyYW1lJykuc2V0QXR0cmli dXRlcyh7IHdpZHRoIDogJzEwMCUnLCBoZWlnaHQgOiAnMTAwcHgnLCBmcmFtZUJvcmRlciA6IDAs IHNjcm9sbGluZyA6ICdubycgfSkuc2V0U3R5bGUoe2JvcmRlciA6IDB9KS5hcHBlbmRUbyh0aGlz LnBhbmUucGFuZSk7CgkJdGhpcy5wcm9ncmVzc1dyYXBwZXIgPSBuZXcgYmtFbGVtZW50KCdkaXYn KS5zZXRTdHlsZSh7ZGlzcGxheTogJ25vbmUnLCB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICcyMHB4 JywgYm9yZGVyIDogJzFweCBzb2xpZCAjY2NjJ30pLmFwcGVuZFRvKHRoaXMucGFuZS5wYW5lKTsK CQl0aGlzLnByb2dyZXNzID0gbmV3IGJrRWxlbWVudCgnZGl2Jykuc2V0U3R5bGUoe3dpZHRoOiAn MCUnLCBoZWlnaHQ6ICcyMHB4JywgYmFja2dyb3VuZENvbG9yIDogJyNjY2MnfSkuc2V0Q29udGVu dCgnJm5ic3AnKS5hcHBlbmRUbyh0aGlzLnByb2dyZXNzV3JhcHBlcik7CgoJCXNldFRpbWVvdXQo dGhpcy5hZGRGb3JtLmNsb3N1cmUodGhpcyksNTApOwoJfSwKCglhZGRGb3JtIDogZnVuY3Rpb24o KSB7CgkJdmFyIG15RG9jID0gdGhpcy5teURvYyA9IHRoaXMubXlGcmFtZS5jb250ZW50V2luZG93 LmRvY3VtZW50OwoJCW15RG9jLm9wZW4oKTsKCQlteURvYy53cml0ZSgiPGh0bWw+PGJvZHk+Iik7 CgkJbXlEb2Mud3JpdGUoJzxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSInK3RoaXMudXJpKyc/ aWQ9Jyt0aGlzLm15SUQrJyIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+Jyk7CgkJbXlE b2Mud3JpdGUoJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFQQ19VUExPQURfUFJPR1JFU1Mi IHZhbHVlPSInK3RoaXMubXlJRCsnIiAvPicpOwoJCWlmKHRoaXMudXJpID09IHRoaXMubmljVVJJ KSB7CgkJCW15RG9jLndyaXRlKCc8ZGl2IHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IG1hcmdp bi1sZWZ0OiAxNjBweDsiPjxpbWcgc3JjPSJodHRwOi8vaW1hZ2VzaGFjay51cy9pbWcvaW1hZ2Vz aGFjay5wbmciIHdpZHRoPSIzMCIgc3R5bGU9ImZsb2F0OiBsZWZ0OyIgLz48ZGl2IHN0eWxlPSJm bG9hdDogbGVmdDsgbWFyZ2luLWxlZnQ6IDVweDsgZm9udC1zaXplOiAxMHB4OyI+SG9zdGVkIGJ5 PGJyIC8+PGEgaHJlZj0iaHR0cDovL3d3dy5pbWFnZXNoYWNrLnVzLyIgdGFyZ2V0PSJfYmxhbmsi PkltYWdlU2hhY2s8L2E+PC9kaXY+PC9kaXY+Jyk7CgkJfQoJCW15RG9jLndyaXRlKCc8ZGl2IHN0 eWxlPSJmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyBwYWRkaW5nLXRvcDogNXB4 OyI+SW5zZXJ0IGFuIEltYWdlPC9kaXY+Jyk7CgkJbXlEb2Mud3JpdGUoJzxpbnB1dCBuYW1lPSJu aWNJbWFnZSIgdHlwZT0iZmlsZSIgc3R5bGU9Im1hcmdpbi10b3A6IDEwcHg7IiAvPicpOwoJCW15 RG9jLndyaXRlKCc8L2Zvcm0+Jyk7CgkJbXlEb2Mud3JpdGUoIjwvYm9keT48L2h0bWw+Iik7CgkJ bXlEb2MuY2xvc2UoKTsKCgkJdGhpcy5teUJvZHkgPSBteURvYy5ib2R5OwoKCQl0aGlzLm15Rm9y bSA9ICRCSyh0aGlzLm15Qm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZm9ybScpWzBdKTsKCQl0 aGlzLm15SW5wdXQgPSAkQksodGhpcy5teUJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0 JylbMV0pLmFkZEV2ZW50KCdjaGFuZ2UnLCB0aGlzLnN0YXJ0VXBsb2FkLmNsb3N1cmUodGhpcykp OwoJCXRoaXMubXlTdGF0dXMgPSBuZXcgYmtFbGVtZW50KCdkaXYnLHRoaXMubXlEb2MpLnNldFN0 eWxlKHt0ZXh0QWxpZ24gOiAnY2VudGVyJywgZm9udFNpemUgOiAnMTRweCd9KS5hcHBlbmRUbyh0 aGlzLm15Qm9keSk7Cgl9LAoKCXN0YXJ0VXBsb2FkIDogZnVuY3Rpb24oKSB7CgkJdGhpcy5teUZv cm0uc2V0U3R5bGUoe2Rpc3BsYXkgOiAnbm9uZSd9KTsKCQl0aGlzLm15U3RhdHVzLnNldENvbnRl bnQoJzxpbWcgc3JjPSJodHRwOi8vZmlsZXMubmljZWRpdC5jb20vYWpheC1sb2FkZXIuZ2lmIiBz dHlsZT0iZmxvYXQ6IHJpZ2h0OyBtYXJnaW4tcmlnaHQ6IDQwcHg7IiAvPjxzdHJvbmc+VXBsb2Fk aW5nLi4uPC9zdHJvbmc+PGJyIC8+UGxlYXNlIHdhaXQnKTsKCQl0aGlzLm15Rm9ybS5zdWJtaXQo KTsKCQlzZXRUaW1lb3V0KHRoaXMubWFrZVJlcXVlc3QuY2xvc3VyZSh0aGlzKSx0aGlzLnJlcXVl c3RJbnRlcnZhbCk7Cgl9LAoKCW1ha2VSZXF1ZXN0IDogZnVuY3Rpb24oKSB7CgkJaWYodGhpcy5w YW5lICYmIHRoaXMucGFuZS5wYW5lKSB7CgkJCW5pY1VwbG9hZEJ1dHRvbi5sYXN0UGx1Z2luID0g dGhpczsKCQkJdmFyIHMgPSBuZXcgYmtFbGVtZW50KCdzY3JpcHQnKS5zZXRBdHRyaWJ1dGVzKHsg dHlwZSA6ICd0ZXh0L2phdmFzY3JpcHQnLCBzcmMgOiB0aGlzLnVyaSsnP2NoZWNrPScrdGhpcy5t eUlEKycmcmFuZD0nK01hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNYXRoLnBvdygxMCwxNSkpfSku YWRkRXZlbnQoJ2xvYWQnLCBmdW5jdGlvbigpIHsKCQkJCXMucGFyZW50Tm9kZS5yZW1vdmVDaGls ZChzKTsKCQkJfSkuYXBwZW5kVG8oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQn KVswXSk7CgkJCWlmKHRoaXMucmVxdWVzdEludGVydmFsKSB7CgkJCQlzZXRUaW1lb3V0KHRoaXMu bWFrZVJlcXVlc3QuY2xvc3VyZSh0aGlzKSwgdGhpcy5yZXF1ZXN0SW50ZXJ2YWwpOwoJCQl9CgkJ fQoJfSwKCglzZXRQcm9ncmVzcyA6IGZ1bmN0aW9uKHBlcmNlbnQpIHsKCQl0aGlzLnByb2dyZXNz V3JhcHBlci5zZXRTdHlsZSh7ZGlzcGxheTogJ2Jsb2NrJ30pOwoJCXRoaXMucHJvZ3Jlc3Muc2V0 U3R5bGUoe3dpZHRoIDogcGVyY2VudCsnJSd9KTsKCX0sCgoJdXBkYXRlIDogZnVuY3Rpb24obykg ewoJCWlmKG8gPT0gZmFsc2UpIHsKCQkJdGhpcy5wcm9ncmVzc1dyYXBwZXIuc2V0U3R5bGUoe2Rp c3BsYXkgOiAnbm9uZSd9KTsKCQl9IGVsc2UgaWYoby51cmwpIHsKCQkJdGhpcy5zZXRQcm9ncmVz cygxMDApOwoJCQl0aGlzLnJlcXVlc3RJbnRlcnZhbCA9IGZhbHNlOwoKCQkJaWYoIXRoaXMuaW0p IHsKCQkJCXRoaXMubmUuc2VsZWN0ZWRJbnN0YW5jZS5yZXN0b3JlUm5nKCk7CgkJCQl2YXIgdG1w ID0gJ2phdmFzY3JpcHQ6bmljSW1UZW1wKCk7JzsKCQkJCXRoaXMubmUubmljQ29tbWFuZCgiaW5z ZXJ0SW1hZ2UiLHRtcCk7CgkJCQl0aGlzLmltID0gdGhpcy5maW5kRWxtKCdJTUcnLCdzcmMnLHRt cCk7CgkJCX0KCQkJdmFyIHcgPSBwYXJzZUludCh0aGlzLm5lLnNlbGVjdGVkSW5zdGFuY2UuZWxt LmdldFN0eWxlKCd3aWR0aCcpKTsKCQkJaWYodGhpcy5pbSkgewoJCQkJdGhpcy5pbS5zZXRBdHRy aWJ1dGVzKHsKCQkJCQlzcmMgOiBvLnVybCwKCQkJCQl3aWR0aCA6ICh3ICYmIG8ud2lkdGgpID8g TWF0aC5taW4odyxvLndpZHRoKSA6ICcnCgkJCQl9KTsKCQkJfQoKCQkJdGhpcy5yZW1vdmVQYW5l KCk7CgkJfSBlbHNlIGlmKG8uZXJyb3IpIHsKCQkJdGhpcy5yZXF1ZXN0SW50ZXJ2YWwgPSBmYWxz ZTsKCQkJdGhpcy5zZXRQcm9ncmVzcygxMDApOwoJCQlhbGVydCgiVGhlcmUgd2FzIGFuIGVycm9y IHVwbG9hZGluZyB5b3VyIGltYWdlICgiK28uZXJyb3IrIikuIik7CgkJCXRoaXMucmVtb3ZlUGFu ZSgpOwoJCX0gZWxzZSBpZihvLm5vcHJvZ3Jlc3MpIHsKCQkJdGhpcy5wcm9ncmVzc1dyYXBwZXIu c2V0U3R5bGUoe2Rpc3BsYXkgOiAnbm9uZSd9KTsKCQkJaWYodGhpcy51cmkuaW5kZXhPZignaHR0 cDonKSA9PSAtMSB8fCB0aGlzLnVyaS5pbmRleE9mKHdpbmRvdy5sb2NhdGlvbi5ob3N0KSAhPSAt MSkgewoJCQkJdGhpcy5yZXF1ZXN0SW50ZXJ2YWwgPSBmYWxzZTsKCQkJfQoJCX0gZWxzZSB7CgkJ CXRoaXMuc2V0UHJvZ3Jlc3MoIE1hdGgucm91bmQoIChvLmN1cnJlbnQvby50b3RhbCkgKiA3NSkg KTsKCQkJaWYoby5pbnRlcnZhbCkgewoJCQkJdGhpcy5yZXF1ZXN0SW50ZXJ2YWwgPSBvLmludGVy dmFsOwoJCQl9CgkJfQoJfQoKfSk7CgpuaWNVcGxvYWRCdXR0b24uc3RhdHVzQ2IgPSBmdW5jdGlv bihvKSB7CgluaWNVcGxvYWRCdXR0b24ubGFzdFBsdWdpbi51cGRhdGUobyk7Cn0KCm5pY0VkaXRv cnMucmVnaXN0ZXJQbHVnaW4obmljUGx1Z2luLG5pY1VwbG9hZE9wdGlvbnMpOwoKCgp2YXIgbmlj WEhUTUwgPSBia0NsYXNzLmV4dGVuZCh7CglzdHJpcEF0dHJpYnV0ZXMgOiBbJ19tb3pfZGlydHkn LCdfbW96X3Jlc2l6aW5nJywnX2V4dGVuZGVkJ10sCglub1Nob3J0IDogWydzdHlsZScsJ3RpdGxl Jywnc2NyaXB0JywndGV4dGFyZWEnLCdhJ10sCgljc3NSZXBsYWNlIDogeydmb250LXdlaWdodDpi b2xkOycgOiAnc3Ryb25nJywgJ2ZvbnQtc3R5bGU6aXRhbGljOycgOiAnZW0nfSwKCXNpemVzIDog ezEgOiAneHgtc21hbGwnLCAyIDogJ3gtc21hbGwnLCAzIDogJ3NtYWxsJywgNCA6ICdtZWRpdW0n LCA1IDogJ2xhcmdlJywgNiA6ICd4LWxhcmdlJ30sCgoJY29uc3RydWN0IDogZnVuY3Rpb24obmlj RWRpdG9yKSB7CgkJdGhpcy5uZSA9IG5pY0VkaXRvcjsKCQlpZih0aGlzLm5lLm9wdGlvbnMueGh0 bWwpIHsKCQkJbmljRWRpdG9yLmFkZEV2ZW50KCdnZXQnLHRoaXMuY2xlYW51cC5jbG9zdXJlKHRo aXMpKTsKCQl9Cgl9LAoKCWNsZWFudXAgOiBmdW5jdGlvbihuaSkgewoJCXZhciBub2RlID0gbmku Z2V0RWxtKCk7CgkJdmFyIHhodG1sID0gdGhpcy50b1hIVE1MKG5vZGUpOwoJCW5pLmNvbnRlbnQg PSB4aHRtbDsKCX0sCgoJdG9YSFRNTCA6IGZ1bmN0aW9uKG4scixkKSB7CgkJdmFyIHR4dCA9ICcn OwoJCXZhciBhdHRyVHh0ID0gJyc7CgkJdmFyIGNzc1R4dCA9ICcnOwoJCXZhciBuVHlwZSA9IG4u bm9kZVR5cGU7CgkJdmFyIG5OYW1lID0gbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCXZhciBu Q2hpbGQgPSBuLmhhc0NoaWxkTm9kZXMgJiYgbi5oYXNDaGlsZE5vZGVzKCk7CgkJdmFyIGV4dHJh Tm9kZXMgPSBuZXcgQXJyYXkoKTsKCgkJc3dpdGNoKG5UeXBlKSB7CgkJCWNhc2UgMToKCQkJCXZh ciBuQXR0cmlidXRlcyA9IG4uYXR0cmlidXRlczsKCgkJCQlzd2l0Y2gobk5hbWUpIHsKCQkJCQlj YXNlICdiJzoKCQkJCQkJbk5hbWUgPSAnc3Ryb25nJzsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAn aSc6CgkJCQkJCW5OYW1lID0gJ2VtJzsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnZm9udCc6CgkJ CQkJCW5OYW1lID0gJ3NwYW4nOwoJCQkJCQlicmVhazsKCQkJCX0KCgkJCQlpZihyKSB7CgkJCQkJ Zm9yKHZhciBpPTA7aTxuQXR0cmlidXRlcy5sZW5ndGg7aSsrKSB7CgkJCQkJCXZhciBhdHRyID0g bkF0dHJpYnV0ZXNbaV07CgoJCQkJCQl2YXIgYXR0cmlidXRlTmFtZSA9IGF0dHIubm9kZU5hbWUu dG9Mb3dlckNhc2UoKTsKCQkJCQkJdmFyIGF0dHJpYnV0ZVZhbHVlID0gYXR0ci5ub2RlVmFsdWU7 CgoJCQkJCQlpZighYXR0ci5zcGVjaWZpZWQgfHwgIWF0dHJpYnV0ZVZhbHVlIHx8IGJrTGliLmlu QXJyYXkodGhpcy5zdHJpcEF0dHJpYnV0ZXMsYXR0cmlidXRlTmFtZSkgfHwgdHlwZW9mKGF0dHJp YnV0ZVZhbHVlKSA9PSAiZnVuY3Rpb24iKSB7CgkJCQkJCQljb250aW51ZTsKCQkJCQkJfQoKCQkJ CQkJc3dpdGNoKGF0dHJpYnV0ZU5hbWUpIHsKCQkJCQkJCWNhc2UgJ3N0eWxlJzoKCQkJCQkJCQl2 YXIgY3NzID0gYXR0cmlidXRlVmFsdWUucmVwbGFjZSgvIC9nLCIiKTsKCQkJCQkJCQlmb3IoaXRt IGluIHRoaXMuY3NzUmVwbGFjZSkgewoJCQkJCQkJCQlpZihjc3MuaW5kZXhPZihpdG0pICE9IC0x KSB7CgkJCQkJCQkJCQlleHRyYU5vZGVzLnB1c2godGhpcy5jc3NSZXBsYWNlW2l0bV0pOwoJCQkJ CQkJCQkJY3NzID0gY3NzLnJlcGxhY2UoaXRtLCcnKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJ CQkJCQljc3NUeHQgKz0gY3NzOwoJCQkJCQkJCWF0dHJpYnV0ZVZhbHVlID0gIiI7CgkJCQkJCQli cmVhazsKCQkJCQkJCWNhc2UgJ2NsYXNzJzoKCQkJCQkJCQlhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJp YnV0ZVZhbHVlLnJlcGxhY2UoIkFwcGxlLXN0eWxlLXNwYW4iLCIiKTsKCQkJCQkJCWJyZWFrOwoJ CQkJCQkJY2FzZSAnc2l6ZSc6CgkJCQkJCQkJY3NzVHh0ICs9ICJmb250LXNpemU6Iit0aGlzLnNp emVzW2F0dHJpYnV0ZVZhbHVlXSsnOyc7CgkJCQkJCQkJYXR0cmlidXRlVmFsdWUgPSAiIjsKCQkJ CQkJCWJyZWFrOwoJCQkJCQl9CgoJCQkJCQlpZihhdHRyaWJ1dGVWYWx1ZSkgewoJCQkJCQkJYXR0 clR4dCArPSAnICcrYXR0cmlidXRlTmFtZSsnPSInK2F0dHJpYnV0ZVZhbHVlKyciJzsKCQkJCQkJ fQoJCQkJCX0KCgkJCQkJaWYoY3NzVHh0KSB7CgkJCQkJCWF0dHJUeHQgKz0gJyBzdHlsZT0iJytj c3NUeHQrJyInOwoJCQkJCX0KCgkJCQkJZm9yKHZhciBpPTA7aTxleHRyYU5vZGVzLmxlbmd0aDtp KyspIHsKCQkJCQkJdHh0ICs9ICc8JytleHRyYU5vZGVzW2ldKyc+JzsKCQkJCQl9CgoJCQkJCWlm KGF0dHJUeHQgPT0gIiIgJiYgbk5hbWUgPT0gInNwYW4iKSB7CgkJCQkJCXIgPSBmYWxzZTsKCQkJ CQl9CgkJCQkJaWYocikgewoJCQkJCQl0eHQgKz0gJzwnK25OYW1lOwoJCQkJCQlpZihuTmFtZSAh PSAnYnInKSB7CgkJCQkJCQl0eHQgKz0gYXR0clR4dDsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgoK CQkJCWlmKCFuQ2hpbGQgJiYgIWJrTGliLmluQXJyYXkodGhpcy5ub1Nob3J0LGF0dHJpYnV0ZU5h bWUpKSB7CgkJCQkJaWYocikgewoJCQkJCQl0eHQgKz0gJyAvPic7CgkJCQkJfQoJCQkJfSBlbHNl IHsKCQkJCQlpZihyKSB7CgkJCQkJCXR4dCArPSAnPic7CgkJCQkJfQoKCQkJCQlmb3IodmFyIGk9 MDtpPG4uY2hpbGROb2Rlcy5sZW5ndGg7aSsrKSB7CgkJCQkJCXZhciByZXN1bHRzID0gdGhpcy50 b1hIVE1MKG4uY2hpbGROb2Rlc1tpXSx0cnVlLHRydWUpOwoJCQkJCQlpZihyZXN1bHRzKSB7CgkJ CQkJCQl0eHQgKz0gcmVzdWx0czsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlpZihyICYmIG5D aGlsZCkgewoJCQkJCXR4dCArPSAnPC8nK25OYW1lKyc+JzsKCQkJCX0KCgkJCQlmb3IodmFyIGk9 MDtpPGV4dHJhTm9kZXMubGVuZ3RoO2krKykgewoJCQkJCXR4dCArPSAnPC8nK2V4dHJhTm9kZXNb aV0rJz4nOwoJCQkJfQoKCQkJCWJyZWFrOwoJCQljYXNlIDM6CgkJCQkvL2lmKG4ubm9kZVZhbHVl ICE9ICdcbicpIHsKCQkJCQl0eHQgKz0gbi5ub2RlVmFsdWU7CgkJCQkvL30KCQkJCWJyZWFrOwoJ CX0KCgkJcmV0dXJuIHR4dDsKCX0KfSk7Cm5pY0VkaXRvcnMucmVnaXN0ZXJQbHVnaW4obmljWEhU TUwpOwoKCgp2YXIgbmljQkJDb2RlID0gYmtDbGFzcy5leHRlbmQoewoJY29uc3RydWN0IDogZnVu Y3Rpb24obmljRWRpdG9yKSB7CgkJdGhpcy5uZSA9IG5pY0VkaXRvcjsKCQlpZih0aGlzLm5lLm9w dGlvbnMuYmJDb2RlKSB7CgkJCW5pY0VkaXRvci5hZGRFdmVudCgnZ2V0Jyx0aGlzLmJiR2V0LmNs b3N1cmUodGhpcykpOwoJCQluaWNFZGl0b3IuYWRkRXZlbnQoJ3NldCcsdGhpcy5iYlNldC5jbG9z dXJlKHRoaXMpKTsKCgkJCXZhciBsb2FkZWRQbHVnaW5zID0gdGhpcy5uZS5sb2FkZWRQbHVnaW5z OwoJCQlmb3IoaXRtIGluIGxvYWRlZFBsdWdpbnMpIHsKCQkJCWlmKGxvYWRlZFBsdWdpbnNbaXRt XS50b1hIVE1MKSB7CgkJCQkJdGhpcy54aHRtbCA9IGxvYWRlZFBsdWdpbnNbaXRtXTsKCQkJCX0K CQkJfQoJCX0KCX0sCgoJYmJHZXQgOiBmdW5jdGlvbihuaSkgewoJCXZhciB4aHRtbCA9IHRoaXMu eGh0bWwudG9YSFRNTChuaS5nZXRFbG0oKSk7CgkJbmkuY29udGVudCA9IHRoaXMudG9CQkNvZGUo eGh0bWwpOwoJfSwKCgliYlNldCA6IGZ1bmN0aW9uKG5pKSB7CgkJbmkuY29udGVudCA9IHRoaXMu ZnJvbUJCQ29kZShuaS5jb250ZW50KTsKCX0sCgoJdG9CQkNvZGUgOiBmdW5jdGlvbih4aHRtbCkg ewoJCWZ1bmN0aW9uIHJwKHIsbSkgewoJCQl4aHRtbCA9IHhodG1sLnJlcGxhY2UocixtKTsKCQl9 CgoJCXJwKC9cbi9naSwiIik7CgkJcnAoLzxzdHJvbmc+KC4qPyk8XC9zdHJvbmc+L2dpLCJbYl0k MVsvYl0iKTsKCQlycCgvPGVtPiguKj8pPFwvZW0+L2dpLCJbaV0kMVsvaV0iKTsKCQlycCgvPHNw YW4uKj9zdHlsZT0idGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsiPiguKj8pPFwvc3Bhbj4vZ2ks Ilt1XSQxWy91XSIpOwoJCXJwKC88dWw+KC4qPyk8XC91bD4vZ2ksIltsaXN0XSQxWy9saXN0XSIp OwoJCXJwKC88bGk+KC4qPyk8XC9saT4vZ2ksIlsqXSQxWy8qXSIpOwoJCXJwKC88b2w+KC4qPyk8 XC9vbD4vZ2ksIltsaXN0PTFdJDFbL2xpc3RdIik7CgkJcnAoLzxpbWcuKj9zcmM9IiguKj8pIi4q Pz4vZ2ksIltpbWddJDFbL2ltZ10iKTsKCQlycCgvPGEuKj9ocmVmPSIoLio/KSIuKj8+KC4qPyk8 XC9hPi9naSwiW3VybD0kMV0kMlsvdXJsXSIpOwoJCXJwKC88YnIuKj8+L2dpLCJcbiIpOwoJCXJw KC88Lio/Pi4qPzxcLy4qPz4vZ2ksIiIpOwoKCQlyZXR1cm4geGh0bWw7Cgl9LAoKCWZyb21CQkNv ZGUgOiBmdW5jdGlvbihiYkNvZGUpIHsKCQlmdW5jdGlvbiBycChyLG0pIHsKCQkJYmJDb2RlID0g YmJDb2RlLnJlcGxhY2UocixtKTsKCQl9CgoJCXJwKC9cW2JcXSguKj8pXFtcL2JcXS9naSwiPHN0 cm9uZz4kMTwvc3Ryb25nPiIpOwoJCXJwKC9cW2lcXSguKj8pXFtcL2lcXS9naSwiPGVtPiQxPC9l bT4iKTsKCQlycCgvXFt1XF0oLio/KVxbXC91XF0vZ2ksIjxzcGFuIHN0eWxlPVwidGV4dC1kZWNv cmF0aW9uOnVuZGVybGluZTtcIj4kMTwvc3Bhbj4iKTsKCQlycCgvXFtsaXN0XF0oLio/KVxbXC9s aXN0XF0vZ2ksIjx1bD4kMTwvdWw+Iik7CgkJcnAoL1xbbGlzdD0xXF0oLio/KVxbXC9saXN0XF0v Z2ksIjxvbD4kMTwvb2w+Iik7CgkJcnAoL1xbXCpcXSguKj8pXFtcL1wqXF0vZ2ksIjxsaT4kMTwv bGk+Iik7CgkJcnAoL1xbaW1nXF0oLio/KVxbXC9pbWdcXS9naSwiPGltZyBzcmM9XCIkMVwiIC8+ Iik7CgkJcnAoL1xbdXJsPSguKj8pXF0oLio/KVxbXC91cmxcXS9naSwiPGEgaHJlZj1cIiQxXCI+ JDI8L2E+Iik7CgkJcnAoL1xuL2dpLCI8YnIgLz4iKTsKCQkvL3JwKC9cWy4qP1xdKC4qPylcW1wv Lio/XF0vZ2ksIiQxIik7CgoJCXJldHVybiBiYkNvZGU7Cgl9CgoKfSk7Cm5pY0VkaXRvcnMucmVn aXN0ZXJQbHVnaW4obmljQkJDb2RlKTsKCgoKbmljRWRpdG9yID0gbmljRWRpdG9yLmV4dGVuZCh7 CiAgICAgICAgZmxvYXRpbmdQYW5lbCA6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdGhp cy5mbG9hdGluZyA9IG5ldyBia0VsZW1lbnQoJ0RJVicpLnNldFN0eWxlKHtwb3NpdGlvbjogJ2Fi c29sdXRlJywgdG9wIDogJy0xMDAwcHgnfSkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSk7CiAgICAg ICAgICAgICAgICB0aGlzLmFkZEV2ZW50KCdmb2N1cycsIHRoaXMucmVwb3NpdGlvbi5jbG9zdXJl KHRoaXMpKS5hZGRFdmVudCgnYmx1cicsIHRoaXMuaGlkZS5jbG9zdXJlKHRoaXMpKTsKICAgICAg ICAgICAgICAgIHRoaXMuc2V0UGFuZWwodGhpcy5mbG9hdGluZyk7CiAgICAgICAgfSwKCiAgICAg ICAgcmVwb3NpdGlvbiA6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlz LnNlbGVjdGVkSW5zdGFuY2UuZTsKICAgICAgICAgICAgICAgIHRoaXMuZmxvYXRpbmcuc2V0U3R5 bGUoeyB3aWR0aCA6IChwYXJzZUludChlLmdldFN0eWxlKCd3aWR0aCcpKSB8fCBlLmNsaWVudFdp ZHRoKSsncHgnIH0pOwogICAgICAgICAgICAgICAgdmFyIHRvcCA9IGUub2Zmc2V0VG9wLXRoaXMu ZmxvYXRpbmcub2Zmc2V0SGVpZ2h0OwogICAgICAgICAgICAgICAgaWYodG9wIDwgMCkgewogICAg ICAgICAgICAgICAgICAgICAgICB0b3AgPSBlLm9mZnNldFRvcCtlLm9mZnNldEhlaWdodDsKICAg ICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmZsb2F0aW5nLnNldFN0eWxlKHsg dG9wIDogdG9wKydweCcsIGxlZnQgOiBlLm9mZnNldExlZnQrJ3B4JywgZGlzcGxheSA6ICdibG9j aycgfSk7CiAgICAgICAgfSwKCiAgICAgICAgaGlkZSA6IGZ1bmN0aW9uKCkgewogICAgICAgICAg ICAgICAgdGhpcy5mbG9hdGluZy5zZXRTdHlsZSh7IHRvcCA6ICctMTAwMHB4J30pOwogICAgICAg IH0KfSk7CgoKCi8qIFNUQVJUIENPTkZJRyAqLwp2YXIgbmljQ29kZU9wdGlvbnMgPSB7CglidXR0 b25zIDogewoJCSd4aHRtbCcgOiB7bmFtZSA6ICdFZGl0IEhUTUwnLCB0eXBlIDogJ25pY0NvZGVC dXR0b24nfQoJfQoKfTsKLyogRU5EIENPTkZJRyAqLwoKdmFyIG5pY0NvZGVCdXR0b24gPSBuaWNF ZGl0b3JBZHZhbmNlZEJ1dHRvbi5leHRlbmQoewoJd2lkdGggOiAnMzUwcHgnLAoKCWFkZFBhbmUg OiBmdW5jdGlvbigpIHsKCQl0aGlzLmFkZEZvcm0oewoJCQknJyA6IHt0eXBlIDogJ3RpdGxlJywg dHh0IDogJ0VkaXQgSFRNTCd9LAoJCQknY29kZScgOiB7dHlwZSA6ICdjb250ZW50JywgJ3ZhbHVl JyA6IHRoaXMubmUuc2VsZWN0ZWRJbnN0YW5jZS5nZXRDb250ZW50KCksIHN0eWxlIDoge3dpZHRo OiAnMzQwcHgnLCBoZWlnaHQgOiAnMjAwcHgnfX0KCQl9KTsKCX0sCgoJc3VibWl0IDogZnVuY3Rp b24oZSkgewoJCXZhciBjb2RlID0gdGhpcy5pbnB1dHNbJ2NvZGUnXS52YWx1ZTsKCQl0aGlzLm5l LnNlbGVjdGVkSW5zdGFuY2Uuc2V0Q29udGVudChjb2RlKTsKCQl0aGlzLnJlbW92ZVBhbmUoKTsK CX0KfSk7CgpuaWNFZGl0b3JzLnJlZ2lzdGVyUGx1Z2luKG5pY1BsdWdpbixuaWNDb2RlT3B0aW9u cyk7CgoK''' nicedit_img = r'''\ R0lGODlh5gESAPcAAAAAABERESIiIjMzMzNmIndVIkR3IkRERFVVVWZmZnd3d90iIu4zM7tEEbtV Iqp3M91mAO53EcxmM7t3RIhmd+5ERO5EVe5VVf9VVf9mZv9md+53d/93dzOIEUSIEVWIIlWZImaZ M1WIRGaIVWaqRHe7RHeqVWaIZneqd7uIM7uZM/+qM//MM4iIRKqIVYi7RIiqVYi7VZm7VbuqVZmZ d4i7ZsyZVd2ZVe6ZVcyqRMyZZt2ZZt2qZsyqd92qd8y7d+67ZpnMZt3MVe7MZu7dZv/dZu7MdxEz uxFEuxFVuzNmqjNmuzN3u0R3uyJmzDN3zER3zJl3iP93iGaZmUSZqlWIu2aIqlWIzESI3VWI3VWZ 3WaIzGaZzHeZzGaI3WaZ3XeZ3VWq3Waq3Xeq3VWq7maq7neq7ma7/4iIiJmZmZmqiJm7iLuqmYiq qoi7qqqqqru7u/+IiN2qiMy7iN27iMy7md27me6qiO6qme67mf+7u5nMiKrMiLvMmbvdu93MiO7M iMzMqt3Mqu7Mqv/Mu+7du8zuu//uqoiZ3YiqzJmqzIiq3Zm73aq73Yiq7oi77pm77qq77rvM3YjM 7pnd/6rM7rvM7rvd7szMzMzM3czd3d3d3f/MzO7dzO7d3f/d3d3u3f//zO7u3f/u3czd7szd/93d /93u7t3u/+7u7v/u7u7u/+7//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAK4ALAAAAADmARIA AAj+AF0JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePCSWN4XKFJMmSiVoxFJWnR488 okDKnEmzpqtWkx5NyvkIVcZGi7Y0WUK0KNEmWyzZXCoxUyNFUKNKVZSJaUOVBIEKNWoUqVKKTqeK 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 l3RZl3bpEAEBADs=''' def ne_js(): return b64decode(nicedit_js.encode('utf-8')) def ne_gif(): return b64decode(nicedit_img.encode('utf-8')) def m_i(): return b64decode(m_img.encode('utf-8'))