Content-Type: multipart/related; start=; boundary=----------z0sG6lbwfRAjvoOOPUGyZF Content-Location: http://www.africanews.com/site/list_message/15378?data[source]=rss Subject: =?utf-8?Q?AfricaNews=20-=20Cameroon=20advised=20on=20eco-tourism=20culture=20-=20Walter?= MIME-Version: 1.0 ------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=15378.htm Content-Type: text/html; charset=ISO-8859-15; name=15378.htm Content-Id: Content-Location: http://www.africanews.com/site/list_message/15378?data[source]=rss Content-Transfer-Encoding: Quoted-Printable AfricaNews - Cameroon advised on eco-tourism= culture - Walter<= link href=3D"http://www.africanews.com/templates/africa/css/print.css" r= el=3D"stylesheet" media=3D"print" type=3D"text/css" />AfricaNews.com - Sharing Views = on Africa
  1. AfricaNews
  2. Weblogs
  3. Walter
  4. Cameroon advised on eco-tourism culture
  5. =

This topic has no replies. This topic was posted on 28-08-2008 = 13:46.

Cameroon advised on eco-tourism culture

  • Search in this item
    <= /fieldset>
  1. <= img src=3D"http://www.africanews.com/usericons/1895/Walter-Wilson-Nana.j= pg" width=3D"126" height=3D"126" alt=3D"Image of Walter" class=3D"useric= on" />

    Wa= lter Wilson Nana, VoicesofAfrica mobile reporter in Buea, Cameroon
    =
    Local population should be encouraged= in their efforts to prop eco-tourism and nature-based tourism industrie= s in the country, US-born eco-tourism expert Jon Kohl advises the gover= nment of Cameroon.
    = Loading video...

    =

Reply

Please login first to reply or create an account.

3D=
------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=logo-en_US.jpg Content-Type: image/jpeg; name=logo-en_US.jpg Content-Location: http://www.africanews.com/templates/africa/img/logo-en_US.jpg Content-Transfer-Encoding: Base64 R0lGODlh7gFZAOYAALcmF7gnGBkZGb+/v+3JxX9/f0BAQLgnF7gmF8lcURAQEJSU lMpdUt/f38/PzyAgIO/v79uSi2BgYEdHR5+fnzAwMNHR0a+vr3BwcFBQUISEhNuT i2ZmZrKysvbk4jg4OFZWVo+Pj/Dw8MLCwrw0JigoKMpdUeStqODg4NJ4bsVPQ/HW 0/rx8JlKKrw1JtN4b8pcUdeFfXV1dUI2Lvvx8cBBNKOjo6k+IcFCNVxENeSuqJhJ Kc5qYJhJKt+gmfLW1NeGfRAPDuCgmsVQQ3NMNREPD7E2HXRMNnNMNui7tvvx8NN4 bodOMoZNMkM3L/LW085rYGdINjMsJ+m7tyIeGzQsJyIfHOCgmYdNMn5NNbE1HREQ D6FEJU8+MmhJN7I2HTQsKCIeHF1ENZBML6FFJX5ONTQtKCMfHMd4ZJlJKqg+IZGG f2hJNk8+M31NNJFNL6JFJYxaQZFML6k/IVA+M+m7trI2HsFCNFJOS5BMLgAAAP// /wAAAAAAAAAAAAAAACH5BAAAAAAALAAAAADuAVkAAAf/gHuCg4SFhoeIiYqLjI2O j5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+ v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4HsDAxQF5ucD4err7NIQ 5ekQBQ969fb2Ge36+/zCGPb07gmsZ6CfwYMIYw1QMLChPQUOEkqcSPFTCIcYAWag UMiBBAoQKoocSVJQA4YZU+qpkG7PyXoKJBQIEbJBy5I4c4YboLKnHgMODDgMWFCn 0aPYLvhcqrIB0qdQm3lkShXjzahYswKTULVrw3xaw4rFpdSr2Xscx6pd6yrg2bdO /9nKnTvq4tu7GOjq3atp4d27CkLyHUzYEYW/iMEWXsyYUAbEiPM2nly4AWTEygZE VOZggGDKqDwEeNGtwkAwM2Y4mWHlbJkAM5ZeVWRznO3b4w69kyAUoIECmyldwGD6 noIMNAl1xs0cd/A9EJpLNyT99vMLElDaM5Dc5XPQnWIEAMCiUYwEDNKnN5EARgL2 6NujZ/Cevv0T9unXh5Gef4L/MQixQiL4MWACe/zpVx8DQBzS2xY55BFAC1kgccQY N2jBRA5B1ONFDj7ZccAbSxXgSAEqFSIPQxkUcMEABRRH0GyNUBAQcrZR0JseEsS1 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 gQAAOw== ------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=menu-item-shadow.jpg Content-Type: image/jpeg; name=menu-item-shadow.jpg Content-Location: http://www.africanews.com/templates/africa/img/menu-item-shadow.jpg Content-Transfer-Encoding: Base64 /9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAPAAA/+4ADkFkb2Jl AGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoKDBAMDAwMDAwQ DA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AA EQgAFwAJAwERAAIRAQMRAf/EAFwAAQEBAAAAAAAAAAAAAAAAAAYHBAEBAAAAAAAA AAAAAAAAAAAAABAAAQMDAwUBAAAAAAAAAAAAAQACAyEEBRFRFTGRklMUBxEBAQAA AAAAAAAAAAAAAAAAABH/2gAMAwEAAhEDEQA/ALf+h4109lIdSQWmiUoJxU257lKV Y8/aNucfICKhpQGOGbsEDaUNMbg7QNIqT0QY/ng9jPIIP//Z ------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=menu-item-mask.gif Content-Type: image/gif; name=menu-item-mask.gif Content-Location: http://www.africanews.com/templates/africa/img/menu-item-mask.gif Content-Transfer-Encoding: Base64 R0lGODlhLAEUAIABAP///////yH5BAEAAAEALAAAAAAsARQAAAJfjA2py+0Po5y0 2ouz3rx7fSDfSJbmiabqCoUBC8fyTNexa+f6zvcs7gsKh8Si8YhMKpfMpvMJjUqn 1Kr1is1qt9yu9wsOi8fksvmMTqvX7Lb7DY/L5/S6/Y7P6/d8eQEAOw== ------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=title-background-white.gif Content-Type: image/gif; name=title-background-white.gif Content-Location: http://www.africanews.com/templates/africa/img/title-background-white.gif Content-Transfer-Encoding: Base64 R0lGODlhAQBkAIAAAP///wAAACH5BAAAAAAALAAAAAABAGQAAAIIhI+py+0PYysA Ow== ------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=rss_20px.gif Content-Type: image/gif; name=rss_20px.gif Content-Location: http://www.africanews.com/templates/africa/img/icons/rss_20px.gif Content-Transfer-Encoding: Base64 R0lGODlhFAAUAOYAAP718fV9IuVaJOahjN5kPP3q2/rbyfitfPjq6vm1hfeZU+Fq PPGdePV2IdlBHfFtIuNVG+J0S+NVJfWKSP7s4faUSdlGJuWagu5mHephJPGmh+1Z CfR6HORxO91MJd50TPaVU/JmCO2XedU8JPNxFfNwIfWCLNxIHPrEnPjt7O5jFepd HP7x6t9QJPrHo/JqFfNxDeVvOuJsPOxlJO1lIv/8+vFyHuptN/aKPPezjfendt9o PN5uRuWdifSBO+NuO/R3HfR5Jvfn5fZ5IPRxGe5oI9Q2Gv748vWAJfBpHfeEJuN4 SfR7IfBxG+JOGPWCJ/eBJPR4IfVzIfd7IfWBJ+R3R/R4F/ivePfo6Pm7juVeLOde JfKQXvrf1Pzl2vN1J+qZh/W8o+RvO/aneut+U/ejauePfvV/JdhMMddBJtZELOV8 YupkJ/R5KuVUF/R1F91ADvrQtOhnMe92OvWAMfPAsvXJu/N3K/CMWuZmOe9oHPFl EPeeWPnHq/vIoP///yH5BAAAAAAALAAAAAAUABQAAAf/gH8pAxE7CwsyMj8/Yh2O HUs9CIIfEBICWxlFDyVSDUNTAVBQNh9YA5ZacmwrKkmdDVFMAWdUSk0XEQJODCxe cWM+L0SyAUhPTwFDVTtbbhp/0X9HLjgkTMfJDVIxCxkreH0GLNIAVxzHAQ0lDz8L MzMqG3ttZQbSfgFMUexFPzJFMEzQASJIiDdXjkRDQYIdjQyJHqhIEI1CFhMwFJD7 o0NFkQxbEJV4cUDanwIKYIBQCGDOii0CdoiRYoOOggQFoh2pEKLknzBuJEiQ2aAB EBIwqPiJVuCLni5/AORp0WJHhyFRgJioEMCKi2g5NjCIJuKEBwIdpgDBUaBGHA5B fyj8oZDhBoA/dRxYQBvgDcVoE0LkiEbGyb0uFtKghcKBT42Td1RwIQvHTlQ0Iwgs gZJMwQEfemjc0KAhwok1YMyoGcGjhw0lAYi80DMjwy6zHhwYMTLixAUEH5oMkfLg I0wJLTwkTpPmBA8hf7BcqBJDzL8FO7IT2E6AxwXogQAAOw== ------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=topic_open.png Content-Type: image/png; name=topic_open.png Content-Location: http://www.africanews.com/templates/africa/img/icons/topic_icons_18_png/topic_open.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAAsTAAAL EwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj33 3vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEs DIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIe EeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH /w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAn f+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJ V2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4 mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHg g/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl 7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/A V/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5 WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQ WHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAA RKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv 1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4 IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGy UT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPE bDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhM WE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPE NyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD 5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2h tlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0 dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHK CpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2ep O6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN 2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIp G6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3n U9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36 p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYP jGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLn m+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cR p7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0H DYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dn F2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofc n8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh 7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJ gUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p DoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85 ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7 F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/R NtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9 MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo 1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5 sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWF fevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTP ZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJ zs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ +7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3v dy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtb Ylu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ7 52PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7 nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9 zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9D BY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfy l5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT 0Kf7kxmTk/8EA5jz/GMzLdsAAAAEZ0FNQQAAsY58+1GTAAAAIGNIUk0AAHolAACA gwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAK/SURBVHjarJQ7jxxVEEZP 3e557K6HxRh5BbtGIAIeQoIAcIaRiAAJESNHJMSIH2DxA/gJhMQOScjWAiRANhkG YZAFZtnH9PT0THffVxXBLF6GABG48nt0qm7VJ2bGg6gSYP+dNyCl8zIev1qem+yW k+2nU30y7G7tX3OTh9vi4lOYKWKAGQrY9Desa3j95sEZyIIvJi+9cv3S1fevFBsb uNGIOG/45ZOPn1/c/PKqS7EwcXsyHD7rBsPHi82t3Tg//EJz/nzNSEbjyztvv3tl a+8SqV2iIVKOhux98OFb9a3XfsIVYynLLcsKzoEITcGb/t7dO8Dt+6BiPHpmdHGH tFyQvUdjRFOGrGzsPnHBDUo0BAQoJhPKzS0uvHz5ud8/+/Q94Np9EEivXUcqSvz0 hOx7ctcSpydsv/AibjjEVLGU0BjJIRCrKbGu7q21ZsYyLhrau79CUTCYPES5ucXo kUfJ3hOaBksRjQnNCcuZ3HWkxeJ4HdRUbX98xPDchNHOY6SuxWIgNHM0RixGNGc0 RXLbEquKcPiH5eViugZiOG5jVYEZJo7se/S0jRUkod4TDg+I9Wxl1MzVUqz/1Zq1 sa5ABE2ZHPwKECOWM9p1hJMjNHhEHFIUiEjW6s9mHdTWXWrmUA7JIaAxnNn0Pbld gmbEudO/ESzFaIuqX9+jjW2f5nWkHA7AsJjQGLCUQBVk9fh+iYOcMqZxfUbRB10u fR6MBoaB/n1/dgYRh4is1iB4tKkXmK0bWei8+j4UImAGzp0KyGpGfY8uap9nxz9r ffK9NtN98/0NnMzWQG7rvDfNgnMQM9ov0Xnl8+z4B62n3+pi9rX59hsz/VGQDrcy XOn+A5RnB61puJGroyd1drRv7fwrC/13pvmOOOcRWVni/jtGbDHV3M0/IqeJ5XRb RJY4h5SD/51H8qCC7a8BAPAn2ozIMCrKAAAAAElFTkSuQmCC ------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=retrieve_multiple.css Content-Type: text/css; charset=ISO-8859-15; name=retrieve_multiple.css Content-Location: http://www.africanews.com/templates/africa/retrieve_multiple.php?css=screen-africa Content-Transfer-Encoding: 8bit body.list_documents.small{}div.document form{display:none;}div.document{float:left;position:relative;width:9em;height:9em;text-align:center;padding:0.5em;margin:0.1em;margin-left:0;border:1px solid black;}div.document input,div.document label{display:none;}div.document img{cursor:pointer;}div.document ul{position:absolute;bottom:0.3em;left:0.3em;width:9.4em;margin-top:8em;text-align:right;}div.document ul li{float:left;}div.document ul li.file-name{width:9.4em;text-align:center;overflow:hidden;white-space:nowrap;}div.document ul li a{background-image:url(img/icons/tiles.png);display:block;width:24px;padding-top:18px;height:0;overflow:hidden;background-repeat:no-repeat;background-position:-1px -126px;}div.document img{}div.document ul li.select{float:right;}div.document ul li.select input{display:inline;}div.document.selected{border:1px solid red;}div.document ul li a:hover{background-position:-1px -108px;}div.document ul li a.download{background-position:-1px -162px;}div.document ul li a.download:hover{background-position:-1px -144px;}div.document_admin{clear:left;}#image_preview{position:absolute;top:28px;right:0;border:20px white solid;border-top-width:5px;border-bottom-width:5px;}select#keywordselector{height:18px;margin-left:5px;width:20%;}#imagewizard{position:fixed;top:300px;right:10px;z-index:99;border:1px solid black;height:400px;width:300px;overflow:hidden;}* body #imagewizard{position:absolute;}body.imagewizard{background:white;margin:0;padding:0;font:normal 12px Verdana;overflow:hidden;border:none;}body.imagewizard dl dt{float:left;width:100px;height:12px;}body.imagewizard fieldset{border:none;}body.imagewizard #src-element{display:block;}body.imagewizard #adjustment_layer{background-color:yellow;opacity:0.5;position:absolute;left:100px;}body.imagewizard dl.debug{display:none;}body.imagewizard div#adjustment_layer.over_scaled{background-color:red;}ul.single-item{margin:0;}.rml-list{padding-left:20px;}.rml-list li{}ul.list-disc li,.rml-list li{list-style-type:disc;}ul.list-square li{list-style-type:square;}ul.list-circle li{list-style-type:circle;}ol.list-decimal li{list-style-type:decimal;}ol.list-lower-alpha li{list-style-type:lower-alpha;}ol.list-upper-alpha li{list-style-type:upper-alpha;}ol.list-lower-roman li{list-style-type:lower-roman;}ol.list-upper-roman li{list-style-type:upper-roman;}div.rml-align-center{text-align:center;}div.rml-align-center div.youtube{margin:0 auto;}div.rml-align-left{text-align:left;}div.rml-align-right{text-align:right;}img.rml-align-right{float:right;}img.rml-align-left{float:left;}div.rmltoolbar{position:absolute;width:84ex;padding:0.2em;display:block;}div.rmltoolbar img.button{background:url(img/icons/toolbar/toolbar-sprite.gif) no-repeat;cursor:pointer;border:1px solid black;margin:1px;width:18px;height:0;overflow:hidden;padding-top:18px;float:left;}div.rmltoolbar #rmltoolbar_undo{background-position:0 -10px;}div.rmltoolbar #rmltoolbar_align_center{background-position:0 -38px;}div.rmltoolbar #rmltoolbar_align_left{background-position:0 -66px;}div.rmltoolbar #rmltoolbar_align_right{background-position:0 -94px;}div.rmltoolbar #rmltoolbar_bold{background-position:0 -122px;}div.rmltoolbar #rmltoolbar_color_bg{background-position:0 -150px;}div.rmltoolbar #rmltoolbar_color_fg{background-position:0 -178px;}div.rmltoolbar #rmltoolbar_documentlibrary{background-position:0 -206px;}div.rmltoolbar img.hline{background-position:center -234px;width:12px;}div.rmltoolbar #rmltoolbar_hr{background-position:0 -266px;}div.rmltoolbar #rmltoolbar_image{background-position:0 -294px;}div.rmltoolbar #rmltoolbar_italic{background-position:0 -322px;}div.rmltoolbar #rmltoolbar_link{background-position:0 -350px;}div.rmltoolbar #rmltoolbar_list_bullet{background-position:0 -378px;}div.rmltoolbar #rmltoolbar_list_num{background-position:0 -406px;}div.rmltoolbar #rmltoolbar_maximize{background-position:0 -434px;}div.rmltoolbar #rmltoolbar_minimize{background-position:0 -462px;}div.rmltoolbar #rmltoolbar_redo{background-position:0 -490px;}div.rmltoolbar #rmltoolbar_smileys{background-position:0 -518px;}div.rmltoolbar #rmltoolbar_strike{background-position:0 -546px;}div.rmltoolbar #rmltoolbar_sub{background-position:0 -574px;}div.rmltoolbar #rmltoolbar_sup{background-position:0 -602px;}div.rmltoolbar #rmltoolbar_table{background-position:0 -630px;}div.rmltoolbar #rmltoolbar_underline{background-position:0 -658px;}div.rmltoolbar img.hline,div.rmltoolbar img.hline:hover{border:none !important;background-color:transparent !important;cursor:default;}div.rmltoolbar img.button:hover{border-top:1px solid black;background-color:#FFF;}div.rmltoolbar img.button:active{border-top:1px solid buttonshadow;border-left:1px solid buttonshadow;border-bottom:1px solid buttonhighlight;border-right:1px solid buttonhighlight;background-color:#ccc;}div.rmltoolbar div#smileys{display:none;}div.rmltoolbar div#smileys.show{display:block;position:absolute;top:25px;right:5px;width:35em;overflow:auto;border:1px solid #ccc;background:#F2F2F2;}div#smileys img{border:none !important;margin:0;}div#smileys div{float:left;text-align:center;padding:4px;padding-right:4px;}div#smileys div span{display:block;}div.rmltoolbar div#smileys div span{color:black;}img.rml{clear:both;}img.enlargeable{cursor:-moz-zoom-in;cursor:-webkit-zoom-in;}ol.messages table.rml-table{width:100%;}table.rml-table tbody td{border:1px solid black;vertical-align:top;background-color:white;}table.phphighlight td{border:1px solid black;background-color:white;color:black;vertical-align:top;clear:none;}table.phphighlight td.phphighlightline{width:2em;background-color:lightgrey;text-align:right;}table.phphighlight td pre{font-family:monospace;font-size:1.2em;clear:none;}table.phphighlight td.phphighlightcode pre{overflow-x:auto;clear:none;width:50em;}ol.messages div.message-content blockquote{padding-left:2em;}ol.messages div.message-content img.smiley{border:none;}ol.messages div.message-content div.message-content-content a.secure-link{background:url(img/icons/lock.gif) no-repeat top right;padding-right:15px;}ol.messages div.message-content-content ul,ol.messages div.message-content-content ol,ol.messages div.message-content-content blockquote{margin-top:1em;margin-bottom:1em;}ol.messages div.message-content-content span.mono{font-family:monospace;}ol.messages div.message-content-content span.serif{font-family:serif;}ol.messages div.message-content-content span.sansserif{font-family:sans-serif;}table.rml-table{caption-side:top;width:100%;border-color:black;border-style:solid;border-width:1px;}table.rml-table caption{display:block;background-color:transparent;font-style:italic;}table.rml-table td{background-color:#f7f7f7;}table.rml-table th{background-color:#eee;border:none;}table.phphighlight td.phphighlightcode pre *{font-family:monospace;white-space:nowrap;}div.modbreak{border:2px solid red;width:60%;background:#D9D9D9;margin:1em auto;}div.modbreak strong{position:relative;top:-0.75em;left:0.75em;background:red;padding:0 0.3em;}div.modbreak div{padding:0.5em;}div.youtube{background:url(img/icons/youtube.png) no-repeat center;text-align:center;border:1px solid #999;}div.youtube span{padding-top:250px;display:block;width:80%;margin:0 auto;}.tb-buttons{border:1px solid #999 !important;background-color:#F0F0F0;float:left;margin:1px;}.tb-line{float:left;margin:1px;border:none !important;}.tb-raise{border-top:1px solid #999 !important;background-color:#FFF;border:1px solid #000 !important;float:left;margin:1px;}.tb-press{border-top:1px solid buttonshadow !important;border-left:1px solid buttonshadow !important;border-bottom:1px solid buttonhighlight !important;border-right:1px solid buttonhighlight !important;background:#ccc;margin:1px;float:left;}#toolbar{margin:0px;width:auto;padding:1px;padding-bottom:2px;height:22px;text-align:left;}textarea#rml_textarea{margin-top:2.5em;}div.colorpicker-lightbox{position:absolute;}div.colorpicker-lightbox .color-selector{border:1px solid black;padding:15px;position:absolute;left:0;top:0;height:263px;width:250px;background:white;}div.colorpicker-lightbox .saturation{position:relative;width:200px;height:200px;}div.colorpicker-lightbox .hue{position:absolute;left:230px;top:15px;width:35px;height:200px;}div.colorpicker-lightbox .preview{height:50px;width:198px;position:absolute;top:225px;left:15px;border:1px solid black;}div.colorpicker-lightbox input{position:absolute;top:225px;left:230px;height:50px;width:35px;min-width:35px;font-weight:bold;border:1px outset black;}div.rmltoolbar div.colorpicker-lightbox img,div.rmltoolbar div.colorpicker-lightbox img:hover{background:transparent;border:0;}ul,li,h1,h2,h3,h4,p{margin:0;padding:0;}body{position:relative;font-family:arial,sans-serif;font-size:11px;margin:0 auto;width:1000px;}img{border:none;}h1,hr{display:none;}h2{font-size:16px;}h3{font-size:14px;}a{color:black;}a:hover{text-decoration:none;}dl{overflow:hidden;}dt,dd{padding:1px 0;}div#header{position:relative;height:150px;margin-top:30px;border:1px solid black;border-right:0;border-top:none;}div#logo{position:relative;border:1px solid black;border-left:none;width:758px;height:89px;margin:0;}body.site-locale-nl_NL div#logo.has-no-custom-image{background:url(img/logo.jpg) no-repeat 130px 0;}body.site-locale-en_US div#logo.has-no-custom-image{background:url(img/logo-en_US.jpg) no-repeat 130px 0;}div#logo.header-dimensions-replace_login{width:auto;}div#logo img{width:131px;height:89px;position:absolute;top:0;left:0;background:white;border-right:1px solid black;}div#logo.header-dimensions-replace_login img,div#logo.header-dimensions-extra_large img{border-right:none;}div#logo img#header-logo{left:132px;width:auto;height:89px;}div#logo.header-dimensions-replace_login img#header-logo,div#logo.header-dimensions-extra_large img#header-logo{left:0;}div#logo img#random-image-2{left:auto;right:0;border-right:0;border-left:1px solid black;}div#login{position:absolute;top:0;right:0;width:224px;height:81px;border:1px solid black;border-right:1px solid black;padding:4px 4px;line-height:150%;}div#login h4,div#login h4 a,div#login li a{color:#bf3e17;font-size:12px;font-weight:bold;text-decoration:none;}div#login p{width:70%;}div#login fieldset,div#quick-search fieldset{padding:0;}div#quick-search form{overflow:auto;}div#login dl{width:100%;margin:0;}div#login dt{float:left;clear:left;width:90px;}div#login img.usericon{display:none;}div#login ul li{list-style-type:none;}div#login ul#extra-navigation li{float:left;}div#login ul#extra-navigation li:before{content:' | ';margin:0 1px 0 3px;}div#login ul#extra-navigation li:first-child:before{content:'';}div#login ul#extra-navigation li a{background:none;}div#login ul#extra-navigation li a:hover{text-decoration:underline;}div#login ul li.myreact-link a{background:url(img/icons/action_icons_18_png/myreact.png) no-repeat top left;}div#login ul li.edituser-link a{background:url(img/icons/action_icons_18_png/edit_user.png) no-repeat top left;}div#login ul li.bookmarks-link a{background:url(img/icons/action_icons_18_png/list_bookmarks.png) no-repeat top left;}div#login ul li.preferences-link a{background:url(img/icons/action_icons_18_png/preferences.png) no-repeat top left;}div#login ul li.logout-link a{background:url(img/icons/action_icons_18_png/logout.png) no-repeat top left;}div#content{position:relative;width:692px;padding:0 6px;border:1px solid black;border-top:0;background-color:#fff;float:left;overflow:hidden;padding-bottom:32px;}div#menus{background-color:#bf2e1b;border-top:1px solid black;border-left:1px solid black;border-right:1px solid black;margin-top:-1px;padding-top:12px;margin-left:131px;height:47px;}ul#menu,ul#submenu{overflow:auto;border-top:1px solid black;background-color:white;}ul#submenu{font-size:90%;}ul#menu a,ul#submenu a,ul#langmenu a,div#newsletter a{text-decoration:none;}ul#menu li,ul#submenu li{float:left;padding:4px 14px 3px 4px;font-size:14px;font-weight:bold;background:url(img/menu-item-shadow.jpg) no-repeat top right;}ul#menu li{padding-left:2px;}ul#menu li a{background:url(img/menu-item-mask.gif) no-repeat 0 0;padding-left:12px;padding-top:2px;}ul#menu li.nav-business a{background-image:url(img/menu-item-business.gif);}ul#menu li.nav-society a{background-image:url(img/menu-item-society.gif);}ul#menu li.nav-travel a{background-image:url(img/menu-item-travel.gif);}ul#menu li.nav-nature a{background-image:url(img/menu-item-nature.gif);}ul#menu li.nav-culture a{background-image:url(img/menu-item-culture.gif);}ul#menu li.nav-sport a{background-image:url(img/menu-item-sport.gif);}ul#submenu li{font-size:12px;}ul#submenu li a{background-color:white !important;}div#core{position:relative;float:left;clear:left;margin:0 0;line-height:150%;min-height:400px;font-size:12px;}div#core dt{float:left;width:150px;clear:left;}div#core dt,div#core dd{padding-bottom:6px;}div#core dd{float:left;padding-right:8px;}div#core dd.dd-sequence.explanation{padding-left:150px;font-style:italic;}div#core dd.dd-sequence.publicationdate{padding-left:0;}div#core dd.keywordselector{width:230px;clear:none;}div#core dd.dd-sequence{float:left;}div#core form{padding-top:8px;}div#core form h3,div#topic-admin h2{position:relative;clear:both;margin-bottom:6px;}div#core form h4{font-size:12px;}div#core dl.page-navigation{height:18px;margin-top:8px;border-top:1px solid #d8d8d8;}div#core dl.faq dt{font-weight:bold;float:none;}div#core dl.faq dt,div#core dl.faq dd{width:auto;}ul#footer{position:absolute;bottom:8px;right:8px;font-size:10px;clear:both;}ul#footer a,ul#footer li{color:white;}ul#footer li{display:inline;}ul#footer li:before{content:' | ';margin:0 1px;}ul#footer li:first-child:before{content:'';}body:after{content:'.';visibility:hidden;height:0;overflow:hidden;display:block;clear:both;}div#sidebar{margin-top:2px;float:right;}div#sidebar ol{list-style:none;}div#sidebar p.body{}div#sidebar h2,div#sidebar h3{width:100%;}div#content-sub,div#features{position:relative;float:left;width:143px;padding:0 2px;overflow:hidden;}div#content h2,div#content h3,div#sidebar h2,div#sidebar h3{background:url(img/title-background-white.gif) repeat-x 0px 4px;border-top:1px solid black;padding:8px 6px 2px 6px;margin:6px 0 2px 0;}ul#lang-menu,div#core ul,ul#menu,ul#submenu{list-style:none;}div#error-bar{float:left;width:678px;margin:4px 8px 0 8px;}.required:after{content:' *';color:red;font-size:12px;}div#banner-zone-1{height:60px;width:468px;margin:26px 0 6px 0;}.display-none,.display-no-childs * *{display:none !important;}dl.minilog{clear:both !important;color:white;}p.body{background-color:white;}tr.alternate{background-color:#d8d8d8;}div#content div#navigation ul li{padding-right:15px;}div.discussion-folders li li{cursor:pointer;}div.discussion-folders li li li{margin-left:15px;}body.user_profile dl.property-list{float:left;}body.user_profile div#core dt{font-weight:bold;width:130px;}body.user_profile div#core dd{margin-left:0;width:175px;}body.user_profile div#core dt.biography+dd,body.user_profile div#core dt.africa-connection+dd{width:550px;}body.user_profile dt.weblog+dd a{font-weight:bold;}body.user_profile dl.property-list#user-profile-block1{width:316px;}body.user_profile dl.property-list#user-profile-block2{width:370px;margin-left:6px;}body.user_profile dl.property-list#user-profile-block3{margin-top:5px;width:100%;}a.rss-link{position:absolute;bottom:1px;right:0;background:transparent url(img/icons/rss_20px.gif) no-repeat scroll left top;height:0;margin:0;overflow:hidden;padding-top:20px;width:20px;}ul#admin-links{position:fixed;margin:0.5em;right:0;top:0;}ul#admin-links li{float:left;margin-left:0.2em;}ul#admin-links li a{padding-top:16px;height:0;width:16px;overflow:hidden;display:block;}ul#admin-links li.edit-page a{background:url(img/icons/page_white_edit.png) no-repeat left top;}ul#admin-links li.edit-blocks a{background:url(img/icons/page_edit.png) no-repeat left top;}ul#admin-links li.edit-blocks a.active{background:url(img/icons/page.png) no-repeat left top;}ul#admin-links li.add-page a{background:url(img/icons/page_white_add.png) no-repeat left top;}ul#admin-links li.add-blocks a{background:url(img/icons/page_add.png) no-repeat left top;}dl.minilog{color:black;}body.small iframe#top-calendar,body.small div#logo,body.small div#header,body.small div#sidebar,body.small div#content div#navigation,body.small div#content div#welcome-text,body.small div.document_admin,body.small div.action-header ul.document-links li.document-manage-folders,body.small div#footer{display:none !important;}div.block{background-color:white;float:left;width:332px;min-height:80px;position:relative;}div.block.no-background{background-color:transparent;border:0;padding:0;}div.block.no-title{border-top:1px solid black;}div.block.no-background.no-title{border:0;}div.block img[border]{border:1px solid black;}div.block a[rel="more"]{display:block;font-weight:bold;color:#bd301a;text-align:right;}div.block.no-title h2,div.block.no-title h3{display:none;}div.block ul{margin:0;padding:0.3em 0 0.5em 0;list-style-type:none;}div.block p{margin:0;padding:0.3em 0 0.5em 0;}div.block.two-columns{width:676px;}div.block.two-columns h2{background-image:url(img/title-background.gif);}div.block.clear{clear:both;}div.block div#action-header.error_general{height:auto;background:none;}div.block div#action-header.error_general ol,div.block div#action-header.error_general p{display:none;}div.block a[rel=edit]{position:absolute;top:0.1em;right:0.5em;padding-top:16px;height:0;width:16px;overflow:hidden;display:block;background:url(img/icons/page_white_edit.png) no-repeat left top;}div#content div.block{margin:0 6px 4px 6px;}div#content div.block-type-react-action{margin:0;}div#content-sub div.block{font-size:11px;}div#content-sub div.block dl{overflow:hidden;}div#content-sub div.block dd,div#content-sub div.block dt{padding:0;}div#content-sub div.block dd{padding-bottom:2px;}div#content-sub div.block dl strong{}div#content-sub .show-after-firstmessage{display:none;}div#features div.block{height:auto;min-height:0;font-size:10px;}div#features div.block.no-title h2{display:none;}div#features div.block.no-background{background:transparent;border-color:white;}.block-type-forum-tracker li,.block-type-category-tracker li{margin-bottom:12px;clear:both;}.block-type-forum-tracker img.topic-image,.block-type-category-tracker img.topic-image{width:50px;height:45px;float:left;margin:0 5px 0 0;border:1px solid black;background:url(img/icons/topic_icons_28_png/topic_open.png) no-repeat center;}.block-type-forum-tracker span.time,.block-type-category-tracker span.time{display:block;float:left;color:#bd301a;font-weight:bold;margin-right:3px;}.block-type-forum-tracker a.topic-title,.block-type-category-tracker a.topic-title{display:block;font-weight:bold;}div#content-sub .block-type-forum-tracker img,div#content-sub .block-type-category-tracker img{display:none;}div#content-sub .block-type-forum-tracker span.time,div#content-sub .block-type-category-tracker span.time{color:black;font-weight:normal;}div#content-sub .block-type-forum-tracker span.time:after,div#content-sub .block-type-category-tracker span.time:after{content:" |";}div#sidebar .block-type-forum-tracker a.topic-title,div#sidebar .block-type-category-tracker a.topic-title{font-weight:normal;color:#BD301A;}.topictracker li{padding:3px 0;}.topictracker .time{padding-right:6px;color:#787878;}.block-type-forum-list div.forum{float:left;width:326px;margin:0 1em 1em 0;min-height:13em;}.block-type-forum-list div.forum img{float:left;border:1px solid black;margin:1.5em 0.5em 0 0;}.block-type-forum-list div.forum h3{margin:0 0 0 0em;font-size:1.2em;}.block-type-forum-list div.forum h3:first-child{margin-left:0;}div.block-type-react-action{height:auto;width:692px;}div.block-type-react-action ul,div.block-type-react-action p{margin:0;padding:0;}body div.block-type-react-action p.body{margin-top:4px;padding:4px;border:1px solid black;}body div.block-type-react-action fieldset p.body{border:0;}div.block-type-show-topic div.topic-document{float:right;margin:4px 0 5px 5px;}div#content-sub div.block-type-show-topic h2,div#features div.block-type-show-topic h2,div.block-type-show-topic.limit-1 h2{display:none;}div#content-sub div.block-type-show-topic div.topic-document,div#features div.block-type-show-topic div.topic-document{float:none;margin:5px 0 0 0;text-align:center;}div.block-type-show-document{text-align:center;}div.block-type-show-document h2{text-align:left;}div.block-type-show-document img{margin:5px 0;}div#content-sub div.block-type-user-data h3{float:left;background:none;border:0;padding:5px 5px 5px 10px;}div.block-type-user-data img.usericon{float:right;}div.block-type-user-data ul.user-links{margin:0.5em 0;}div.block-type-user-data ul.user-links li.view-weblog a{font-size:1.2em;font-weight:bold;}div.block-type-google-ads{text-align:center;}div.block-type-google-ads h2{text-align:left;}div.block-type-archive ul.navigation li{float:left;width:50%;clear:none;text-align:left;}div.block-type-archive ul.navigation li:first-child a{text-align:left;}div.block-type-archive a.topic-title{float:left;}div.block-type-archive ul.star-rating{height:1.2em;margin-left:0.7em;padding-top:0;}div.block-type-archive ul.star-rating li{padding:0;}div#sidebar .block{min-height:0px;width:132px;padding:0 6px 4px 4px;}div#sidebar h2,div#sidebar h3{font-size:14px;width:100%;margin-left:-4px;}div#sidebar div.block.layout-2,div#sidebar div.block.layout-3{border:1px solid black;}div#sidebar div.block.layout-2{padding:0 2px 4px 2px;width:139px;background:white url(img/background-tree.gif) repeat -60px 0;border-top:none;overflow:hidden;}div#sidebar div.block.layout-3{padding:0 8px 0 6px;width:129px;}div#sidebar div.block.layout-2 h2,div#sidebar div.block.layout-2 h3{background:#424242;color:white;font-size:11px;margin:0;padding:2px;text-align:center;margin-left:-2px;}div#sidebar div.block.layout-3 h2,div#sidebar div.block.layout-3 h3{background:none;font-size:10px;border-bottom:1px solid #be2e1a;margin:0;width:139px;padding:1px 2px;margin-left:-6px;}div#sidebar div.block.no-padding{padding:0;width:143px;}div#sidebar div.block.no-padding h2,div#sidebar div.block.no-padding h3{margin-left:0px;padding:0 0 0 4px;}.block-type-rating ul{margin:0 auto;}.star-rating,.star-rating a:hover,.star-rating a:active,.star-rating a:focus,.star-rating .current-rating{background:url(img/bg-rating.png) left -1000px repeat-x;}.star-rating{position:relative;width:125px;height:1.5em;overflow:hidden;padding:0;background-position:left top;}.star-rating li{height:25px;}.star-rating a,.star-rating .current-rating{position:absolute;top:0;left:0;text-indent:-1000em;height:25px;line-height:25px;outline:none;overflow:hidden;border:none;}.star-rating a:hover,.star-rating a:active,.star-rating a:focus{background-position:left bottom;}.star-rating a.one-star{width:20%;z-index:6;}.star-rating a.two-stars{width:40%;z-index:5;}.star-rating a.three-stars{width:60%;z-index:4;}.star-rating a.four-stars{width:80%;z-index:3;}.star-rating a.five-stars{width:100%;z-index:2;}.star-rating .current-rating{z-index:1;background-position:left center;}div#block-container div.block{margin:0;}div#block-container .two-columns{width:692px;}div.block-type-topbanner{position:absolute;top:-75px;left:0px;border:0;margin:0;padding:0;min-height:0;background:transparent;}.force-left{clear:left;}body.page div#core{width:704px;margin-left:0;}body.list_topics div#action-header p,body.list_messages div#action-header p,body.list_message div#action-header p,div.section hr{display:none;}body.new_password div#core form p{color:black;}body.login dl.property-list{margin-top:16px;}body.logout div#page-content p.body{margin-bottom:4px;}body.find table,div#core dl.topic-navigation.after,body.delete_usernote dl{margin-top:4px;}body.error_general p.body,div#error-bar{border:1px solid #f0543a;padding:4px;overflow:hidden;}body.list_forum_stats div#core dd{font-weight:bold;}body.list_users #submit-btn,body.rml_preview #submit-btn,body.create_user #submit-btn{margin-left:0;}body.create_user form#primary-input h3:first-child{display:none;}body.create_user div.block p.body,body.activate_user div.block p.body{border:0;}div#smileys{display:block;width:70%;overflow:auto;}div#smileys div{float:left;text-align:center;padding:4px;padding-right:4px;}div#smileys div img{cursor:pointer;}div#smileys div span{display:block;}table#smileys td{border:none;}table#smileys td img{cursor:pointer;}.toggle-icon{cursor:pointer;background-position:10.9em 50%;background-repeat:no-repeat;background-image:url(img/icons/explode_min.gif);}dd.dd-sequence.uploadfile{padding:0 0 8px 150px;margin-bottom:8px;border-bottom:1px solid #484848;}table.users img.usericon,div.section img.usericon{display:block;width:60px;height:60px;}div#core table.users dt{width:100px;}div#core table.users dd,div#core td.forum-name dd,div#core td dl.topic-navigation dd,div#core div.section dl dd{width:auto;}col.name,col.subject{width:50%;}div.section{margin-bottom:4px;padding-bottom:0;}div.section.first-section h2,div.section.user-data h2{width:auto;}div.section h2 a{margin-left:4px;}div.section.user-data{position:relative;overflow:auto;padding-bottom:4px;float:left;width:30%;}div.section.user-data .user-links{position:absolute;top:48px;left:80px;}div.section.user-data dl{float:right;}div.section.user-data address{border-bottom:1px solid #484848;padding-bottom:4px;margin-bottom:4px;}div.section.activetopics{width:65.5%;margin-left:33%;}div.discussion-content{width:74%;float:right;overflow-x:hidden;border-left:1px solid black;border-bottom:1px solid black;border-top:1px solid black;padding:1px 5px 5px 5px;background:white;}div.discussion-content{width:73%;margin-right:1px;}div.discussion-content dd{width:66%;}div.discussion-content h3{clear:both;padding-left:0.2em;}div.discussion-content h3 span{display:block;}div.discussion-folders{width:24%;float:left;border-right:none;border:1px solid black;border-left:none;padding:1px;padding-left:0;background:white;}div.discussion-folders h3{padding-left:0.5em;}div.discussion-folders a.return-link{white-space:nowrap;}div.discussion-folders ul.folders{border:0;width:20px;}div.discussion-folders li{border-top:1px solid white;padding:0 0.2em 0.2em 0;padding-left:0em;list-style:none;background-image:url(img/icons/topic_icons_18_png/topic_open.png);background-position:1px 1px;background-repeat:no-repeat;vertical-align:middle;line-height:1.6em;width:118px;}div.discussion-folders li.contains-child{background-image:url(img/icons/topic_icons_18_png/topic_open_plus.png);}div.discussion-folders li ul{margin-left:-32px;}div.discussion-folders li li{border-top:none;width:120px;padding-left:19px;}div.discussion-folders li.active,div.discussion-folders li.contains-active{background-image:url(img/icons/topic_icons_18_png/topic_open_new.png);}div.discussion-folders li.active.contains-child{background-image:url(img/icons/topic_icons_18_png/topic_open_new_min.png);}div.discussion-folders li.list_bookmarks{background-image:url(img/icons/action_icons_28_png/list_bookmarks.png);padding-left:2.5em;line-height:2.6em;}div.discussion-folders li.list_documents{background-image:url(img/icons/action_icons_28_png/list_documents.png);padding-left:2.5em;line-height:2.6em;}div.discussion-folders li.list_discussions{background-image:url(img/icons/action_icons_28_png/list_discussions.png);padding-left:2.5em;line-height:2.6em;}div.discussion-folders li span.unread{font-weight:bold;}div.discussion-content td em{font-weight:bold;font-style:normal;color:red;}div.discussion-folders li.user-made{font-style:italic;}div.discussion-folders ul li ul.not_current_action{display:none;}div.discussion-folders li ul{padding-top:0.5em;}body.list_documents_small{background:red;margin:0 auto;padding:0;width:880px;}body.list_documents_small div#content,body.list_documents_small div#core{width:880px;}body.list_documents_small div#action-footer{visibility:hidden;height:0;overflow:hidden;}body.list_documents_small ul{margin:0;padding:0.3em 0 0.5em 0;list-style-type:none;}body.list_documents_small div.document{width:10em;}body.list_documents_small div#action-header{border:0;}body.list_documents_small div#action-header h2{background:url(img/title-background-doclib.gif) no-repeat;width:858px;}body.list_discussions div.discussion-folders{margin-left:10px;}body.list_discussions div.discussion-content{width:70%;margin-right:13px;}div.document{width:11.1em;height:10em;padding:0.5em;margin:0 7px 7px 0;border:1px solid #484848;background:#f7f7f7;}div.document:hover{background:#fff4f2;}div#action-footer{display:none;}body.delete_usernote p.body{margin:-8px 0 4px 0;}body.user_profile h3{display:none;}div.discussion-folders ul.folders{margin-left:0;padding-left:0;}div.discussion-folders ul{padding-left:12px;}div.discussion-folders li.active a{color:#bf311a;}body.pm_new_message div#core dd{width:76%;}body.pm_new_message div#core dd.dd-sequence{}body.list_category table,body.list_categories table{margin-top:0.5em;}ul#category-search-selector{position:absolute;right:10px;top:39px;}ul#category-search-selector li{display:inline;margin:0 5px 0 0;padding:0;width:auto;}div#action-header ul#category-search-selector li a{padding:3px;}div#action-header ul#category-search-selector li a.active{color:#bf311a;font-weight:bold;}iframe#imagewizard{position:fixed;bottom:1em;top:auto;right:50px;}.toggle-icon{cursor:pointer;}.display-none{display:none;}dd.dd-sequence.required-empty{color:red;}body #channel-title{position:absolute;top:91px;left:0;background:url(img/africa-home.gif) no-repeat top left;height:57px;width:131px;}div.rmltoolbar{width:auto;}div.rmltoolbar div#smileys.show{width:12em;height:7.8em;}div.autocomplete{background:white;width:22.3em;height:10em;overflow-y:scroll;margin-left:1.75em;border:1px solid black;border-top:0;position:absolute;}body.insert_topic div.autocomplete{margin-left:0;}div.autocomplete ul{border:0;}div.autocomplete ul li{float:none !important;display:block !important;cursor:pointer;}div.autocomplete ul li:hover{background-color:#D4D0C8;}div.autocomplete ul li.picked{background:green;color:white;}textarea#weblog-description{width:22em;height:10em;}body.create_user form#primary-input select,body.edit_user form#primary-input select{max-width:none;}fieldset{border:none;}legend{display:none;}option{padding-right:4px;}optgroup option{padding-left:12px;}textarea{font-family:arial;font-size:12px;}div#topic-admin textarea{width:394px;}select{border:1px solid black;background:#F9F9F9;max-width:490px;}input[readonly]{color:#333;font-style:italic;}textarea#teasertext,textarea#introduction,textarea#rml_textarea{width:465px;height:200px;}textarea#rml_textarea.extra-large{width:465px;height:200px;}textarea#notepad{height:500px;}input[type='text'],input[type='password'],textarea{border:1px solid black;padding:2px;background:#F9F9F9;}input[type='submit'],input[type='reset'],input[type='button']{font-size:11px;}input:focus,textarea:focus,select:focus{background:#EFEFEF;}input#quick-login-form-user,input#quick-login-form-password{width:124px;}a#quick-login-forgot-pass{position:absolute;right:4px;top:4px;}input#age_start,input#age_end,input#limit{width:60px;}input#submit-btn{margin-left:8px;}input#topicnote{position:relative;bottom:82px;}select#forum{min-height:200px;min-width:270px;}select#keywordselector{width:230px;height:20px;}div#core form#more-topic fieldset{margin:-8px 0 0 0;background-color:white;padding:8px 4px 4px 4px;}form#quick-search{border-bottom:1px solid black;margin:0 0 2px 2px;padding:2px;}#quick-search{position:absolute;padding:1px 60px 2px 2px;bottom:23px;right:0;}#quick-search-for{border:1px inset gray;width:165px;padding:1px 2px;}#quick-search-submit{position:absolute;}dd.field-alert{background-color:#BF2E1B;border:1px solid black;color:white;font-weight:bold;padding:10px;}div#action-header,div#core table{background-color:white;}div#core table{border:1px solid black;width:100%;margin-bottom:4px;padding:0;border-spacing:0;}div#core table thead,div#core table tfoot{white-space:nowrap;text-align:left;}div#core table td,div#core table th{padding:2px 6px;border:none;}div#core caption{display:none;}div#core table th{background-color:black;color:white;font-weight:normal;font-size:110%;}div#core tr.category-name td{font-size:150%;padding:8px;text-align:left !important;padding-top:12px;border-top:1px solid black;}tr.category-name td a{font-size:1.30em;padding-left:40px;}tr.topic-has-new-0,tr.topic-has-new-0 a{color:#555;}tr.topic-is-alias-1,tr.topic-is-alias-1 a{color:#6a4646;}li.forum-find,li.topic-find{display:none;}ol#messages,ol#firstmessage{background-color:white;clear:both;list-style:none;padding-left:0;}ol#firstmessage.messages img.topic-image{float:left;margin:0 5px 0 0;border:1px solid black;}ol#firstmessage{margin-bottom:4px;}ol#messages div.message-data{background-color:#be2e1a;padding:4px;border-top:1px solid black;}ol#messages div.message-data,ol#messages div.message-data a{color:white;}div#topic-admin{clear:both;margin-top:4px;}div#topic-admin h2{display:none;}div#block-container+h2{clear:both;}div#topic-admin input[type="checkbox"]{margin-right:4px;}div#topic-admin dd.dd-sequence{padding-left:150px;}input#change_xy_coordinate,input#xy_coordinate{float:left;}span#xy_coordinate_pick{background:url(img/world-icon.png) no-repeat left top;overflow:hidden;height:0;padding-top:16px;margin:2px 0 0 5px;cursor:pointer;display:block;}span#xy_coordinate_pick.collapse{background:url(img/world-collapse-icon.png) no-repeat left top;}div#google-map-container{padding-top:10px;}div#google-map-container.hide{display:none;}div#google-map{clear:both;width:500px;height:400px;border:1px solid #484848;margin-top:10px;}li.message{position:relative;padding:4px;min-height:100px;clear:both;overflow:hidden;}li.message.selected{background-color:silver;}li.message hr{display:none;}li.message div.author-data{padding:0 0 0 4px;float:left;width:80px;}li.message div.author-nickname a{position:absolute;top:7px;color:white;}li.message div.author-data img{display:block;border:1px solid black;}li.message ul.author-links{display:none;}li.message ul.author-links li{margin:0;}li.message div.message-data{position:relative;color:#606060;text-align:right;padding:2px;height:16px;}li.message div.message-data a{color:#606060;}li.message div.message-data li{display:inline;margin-left:5px;}li.message div.message-data address{position:absolute;right:250px;top:4px;}li.message div.message-content{padding:4px 4px 0 110px;}li.message div.message-content h2,li.message div.message-content h3{position:static;background:none;border:none;margin:0;}li.message div.message-content h2,li.message div.message-content h3,li.message div.message-content h4,li.message div.message-content h5,li.message div.message-content h6{padding:6px 0 0 0;}li.message blockquote{margin:4px;}li.message div.message-quote-div,li.message .updated-by{margin-left:4px;padding:4px;border-top:1px solid #aaa;border-bottom:1px solid #aaa;background-color:#ddd;}li.message address.signature{border-top:1px solid #bf311a;color:#777;font-size:10px;margin-top:2px;}li.message address.updated-by{margin:2px 0 0 0;padding:0 2px;opacity:.6;}ol.messages ul.message-links li.message-bookmark,ol.messages ul.message-links li.message-topicreport,ol#firstmessage ul.message-links li.message-quote{display:none;}ol#firstmessage li.message div.author-data{display:none;}ol#firstmessage li.message div.message-content{padding:4px;}ol#firstmessage li.message div.message-data address{left:2px;right:auto;}ol#firstmessage li.message div.message-topic-authors{color:#999;padding-bottom:3px;}ol#firstmessage li.message div.topic-intro{margin:0 0 5px 0;}ol#firstmessage li.message div.topic-document{float:left;margin:5px 5px 5px 0;}ol.messages li div.author-data address.author-title{font-style:italic;font-weight:normal;}ol.messages ul.author-links{clear:left;margin-left:0.2em;margin-top:0.9em;}ol.messages ul.author-links li{margin-right:0.4em;margin-bottom:0.2em;}body.javascript ol.messages ul.author-links li{float:left;width:1.54em;}ol.messages ul.author-links li a{display:block;overflow:hidden;background-repeat:no-repeat;background-image:url(img/icons/user_icons_18_tiled.png);}body.javascript ol.messages ul.author-links li a{height:0;width:1.54em;margin:0;padding:18px 0 0 0;}div#action-header.weblog+ol.messages div.author-data{display:none;}div#action-header.weblog+ol.messages div.message-content{padding-left:0;}div#action-header.weblog+ol.messages div.message-data address{left:0;}ol.messages ul.author-links li.author-admin a{background-position:0 -18px;}ol.messages ul.author-links li.author-admin a:hover{background-position:0 0;}ol.messages ul.author-links li.author-pushmessage a{background-position:0 -306px;}ol.messages ul.author-links li.author-pushmessage a:hover{background-position:0 -288px;}ol.messages ul.author-links li.author-privatemessage a{background-position:0 -486px;}ol.messages ul.author-links li.author-privatemessage a:hover{background-position:0 -468px;}ol.messages ul.author-links li.author-profile a{background-position:0 -342px;}ol.messages ul.author-links li.author-profile a:hover{background-position:0 -324px;}ol.messages ul.author-links li.author-add-contact a{background-position:0 -270px;}ol.messages ul.author-links li.author-add-contact a:hover{background-position:0 -252px;}ol.messages ul.author-links li.author-homepage a{background-position:0 -54px;}ol.messages ul.author-links li.author-homepage a:hover{background-position:0 -36px;}ol.messages ul.author-links li.author-find a{background-position:0 -450px;}ol.messages ul.author-links li.author-find a:hover{background-position:0 -432px;}ol.messages ul.author-links li.author-usernotes a{background-position:0 -90px;}ol.messages ul.author-links li.author-usernotes a:hover{background-position:0 -72px;}ol.messages ul.author-links li.author-usernotes.usernote-count-1 a{background-position:0 -126px;}ol.messages ul.author-links li.author-usernotes.usernote-count-1 a:hover{background-position:0 -108px;}ol.messages ul.author-links li.author-usernotes.usernote-count-2 a{background-position:0 -162px;}ol.messages ul.author-links li.author-usernotes.usernote-count-2 a:hover{background-position:0 -144px;}ol.messages ul.author-links li.author-usernotes.usernote-count-3 a{background-position:0 -198px;}ol.messages ul.author-links li.author-usernotes.usernote-count-3 a:hover{background-position:0 -180px;}ol.messages ul.author-links li.author-usernotes.usernote-count-4 a{background-position:0 -234px;}ol.messages ul.author-links li.author-usernotes.usernote-count-4 a:hover{background-position:0 -216px;}body.javascript ol.messages ul.author-links.author-links-expanded,ol.messages ul.author-links{width:auto;}body.javascript ol.messages ul.author-links.author-links-expanded li,ol.messages ul.author-links li{float:none;width:12em;}body.javascript ol.messages ul.author-links.author-links-expanded li a,ol.messages ul.author-links li a{width:auto;max-width:13em;height:18px;padding-top:0;padding-left:20px;margin-top:2px;}body.list_message ol+p,body.list_messages ol+p{border-top:1px solid black;margin-top:5px;padding:7px;}body.list_message p.body,body.list_messages p.body{display:none;}div#core dl.topic-navigation dt{width:auto;padding-right:4px;}dl.topic-navigation.before{background-color:white;border:1px solid black;padding:4px;}dl.topic-navigation dd{font-weight:bold;}div#core dl.topic-navigation.after dd,div#core dl.topic-navigation.after dt{padding-bottom:0;}td.topic-forum{border-left:none;}td.topic-status,td.forum-status,td.bookmark-status{background-position:center center;background-repeat:no-repeat;width:2.6em;height:3em;border-left:none;background-color:white;}td.topic-name a.current-page{text-decoration:underline;font-weight:normal;}td.topic-status ul,td.forum-status ul,td.bookmark-status ul{width:18px;height:0;padding:25px 5px 3px 5px;border:1px solid #999;overflow:hidden;margin-left:1px;position:relative;}td.topic-status li,td.forum-status li,td.bookmark-status li{position:absolute;top:2.6em;}img.usericon{border:1px solid black;margin:1px 0 0 0;}tr.topic-statusid-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_sticky.png);}tr.topic-statusid-1.topic-has-new-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_sticky_new.png);}tr.topic-statusid-1.topic-has-new-0.topic-has-note-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_sticky_report.png);}tr.topic-statusid-1.topic-has-new-1.topic-has-note-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_sticky_new_report.png);}tr.topic-statusid-1.topic-has-new-0.topic-has-reports-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_sticky_report.png);}tr.topic-statusid-1.topic-has-new-1.topic-has-reports-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_sticky_new_report.png);}tr.topic-statusid-2 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_open.png);}tr.topic-statusid-2.topic-has-new-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_open_new.png);}tr.topic-statusid-2.topic-has-new-0.topic-has-note-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_open_report.png);}tr.topic-statusid-2.topic-has-new-1.topic-has-note-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_open_new_report.png);}tr.topic-statusid-2.topic-has-new-0.topic-has-reports-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_open_report.png);}tr.topic-statusid-2.topic-has-new-1.topic-has-reports-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_open_new_report.png);}tr.topic-statusid-4 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_closed.png);}tr.topic-statusid-4.topic-has-new-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_closed_new.png);}tr.topic-statusid-4.topic-has-new-0.topic-has-note-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_closed_report.png);}tr.topic-statusid-4.topic-has-new-1.topic-has-note-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_closed_new_report.png);}tr.topic-statusid-4.topic-has-new-0.topic-has-reports-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_closed_report.png);}tr.topic-statusid-4.topic-has-new-1.topic-has-reports-1 td.topic-status{background-image:url(img/icons/topic_icons_28_png/topic_closed_new_report.png);}tr.forum-has-new-0 td.forum-status,tr.bookmark-has-new-0 td.bookmark-status{background-image:url(img/icons/topic_icons_28_png/topic_open.png);}tr.forum-has-new-1 td.forum-status,tr.bookmark-has-new-1 td.bookmark-status{background-image:url(img/icons/topic_icons_28_png/topic_open_new.png);}td.topic-name ul li{float:left;line-height:1.2em;margin-right:0.5em;}div#topic-admin h3.toggle-alternate-icon{margin-bottom:0px;}div.colorpicker-lightbox{position:absolute;left:50px;top:-10px;}body.list_categories div#action-header ol,body.list_category div#action-header ol,body.list_categories div#action-header h2,body.list_category div#action-header h2,body.create_forum div#action-header,body.edit_forum div#action-header,body.delete_forum div#action-header,body.activate_user div#action-header ol,body.activate_user div#action-header ul,body.activate_user div#action-header p,body.find div#action-header p,body.find div#action-header ul,body.find div#action-header ol,body.login div#action-header ol,body.login div#action-header p,body.login div#action-header ul,body.newsletter div#action-header ol,body.newsletter div#action-header p,body.user_profile div#action-header ol,body.user_profile div#action-header ul,body.user_profile div#action-header p,body.edit_user div#action-header ol,body.edit_user div#action-header ul,body.edit_user div#action-header p,body.insert_topic div#action-header ol,body.insert_topic div#action-header ul,body.insert_topic div#action-header p,body.create_user div#action-header ol,body.create_user div#action-header p,body.new_password div#action-header ol,body.new_password div#action-header p,body.new_password div.block p.body,body.insert_document div#action-header ol,body.insert_documentgallery div#action-header ol,body.send_activationkey div#action-header ol,body.send_activationkey div#action-header p,body.send_activationkey div.block p.body,div#action-header.weblog ol,div#action-header.weblog ul,div#action-header.weblog p{display:none;}body.list_categories div#action-header p,body.list_category div#action-header p{margin-top:0.5em;}div#action-header,div.block div#action-header{background-repeat:no-repeat;background-position:0 0.3em;}div.block div#action-header.action-header-frontpage{margin-bottom:0;padding-bottom:0;border-bottom-width:0;}div.block div#action-header.action-header-frontpage h2{margin-bottom:0px;}div#action-header ol{display:block;overflow:hidden;white-space:nowrap;padding:4px 0 0 23px;font-size:11px;margin-top:0;}div#action-header ol a{white-space:nowrap;}div#action-header ol li{display:inline;}div#action-header ol li:first-child{display:none;}div#action-header ol li:before{content:' > ';}div#action-header ol li:first-child+li:before{content:'';}div#action-header ul{overflow:hidden;position:absolute;top:4px;right:0;}div#action-header ul li{text-align:right;font-size:11px;margin:0 0 3px 0;}div#action-header ul li a{display:block;padding:0 22px 0 0;background-repeat:no-repeat;background-position:right center;}body.newsletter div#action-header ul{margin-top:0.7em;}body.newsletter div#action-header ul li a{font-size:1.1em;font-weight:bold;}div#core div#action-header dl{border-top:0;margin:1.5em 0 0 0;}dl.topic-navigation{text-align:right;}dl.topic-navigation.before{border:none;border-top:1px solid #d8d8d8;margin-top:8px;padding:4px 0 0 0;}div#action-header ul.user-links{font-weight:bold;border-top:1px solid #d8d8d8;margin-top:8px;padding-top:4px;}div#action-header ul.links li a{padding:2px 0 0 24px;margin-left:8px;}div#action-header li.forum-new-topic a,div#action-header li.topic-new-topic a{background-image:url(img/icons/action_icons_18_png/insert_topic.png);}div#action-header li.discussion-new-discussion a{background-image:url(img/icons/action_icons_18_png/pm_discussion.png);}div#action-header li.calendar-new-event a{background-image:url(img/icons/action_icons_18_png/insert_calendarevent.png);}div#action-header li.calendar-own-events a{background-image:url(img/icons/action_icons_18_png/list_calendar.png);}div#action-header li.folder-new-folder a{background-image:url(img/icons/action_icons_18_png/manage_folders.png);}div#action-header li.calendar-edit-event a{background-image:url(img/icons/action_icons_18_png/update_calendarevent.png);}div#action-header li.calendar-delete-event a{background-image:url(img/icons/action_icons_18_png/delete_calendarevent.png);}div#action-header li.forum-notification a{background-image:url(img/icons/action_icons_18_png/insert_notification.png);}div#action-header li.topic-new-message a{background-image:url(img/icons/action_icons_18_png/insert_message.png);}div#action-header li.discussion-reply a{background-image:url(img/icons/action_icons_18_png/pm_new_message.png);}div#action-header li.document-new-document a{background-image:url(img/icons/action_icons_18_png/insert_document.png);}div#action-header li.listactiveusers-edituser a{background-image:url(img/icons/action_icons_18_png/list_contacts.png);}div#action-header li.myreact-add-contact a{background-image:url(img/icons/action_icons_18_png/add_contact.png);}div#action-header li.myreact-new-profilemessage a{background-image:url(img/icons/action_icons_18_png/insert_profilemessage.png);}div#action-header li.userprofile-edituser a,div#action-header li.preferences-edit-user a{background-image:url(img/icons/action_icons_18_png/edit_user.png);}div#action-header li.edituser-preferences a{background-image:url(img/icons/action_icons_18_png/preferences.png);}div#action-header li.edituser-profile a{background-image:url(img/icons/action_icons_18_png/user_profile.png);}div#action-header li.userprofile-add-contact a{background-image:url(img/icons/action_icons_18_png/add_contact.png);}div#action-header li.listcontacts-currentcontacts a{background-image:url(img/icons/action_icons_18_png/list_contacts.png);}div#action-header li.listusers a,div#action-header li.activeusers a,div#action-header li.listcontacts-activeusers a{background-image:url(img/icons/action_icons_18_png/list_activeusers.png);}div#action-header li.listactivetopics-userfind a{background-image:url(img/icons/action_icons_18_png/find.png);}div#action-header li.login-createuser a{background-image:url(img/icons/action_icons_18_png/create_user.png);}div#action-header li.myreact-profile a{background-image:url(img/icons/action_icons_18_png/user_profile.png);}div#action-header li.find-userfind a{background-image:url(img/icons/action_icons_18_png/find.png);}div#action-header li.document-manage-folders a{background-image:url(img/icons/action_icons_18_png/manage_folders.png);}div#action-header li.custom-faq a,div#action-header li.faq-sitemap a{background-image:url(img/icons/action_icons_18_png/faq.png);}div#action-header div.extra-actions ul li.topic-bookmark a{background-image:url(img/icons/action_icons_18_png/insert_bookmark.png);}div#action-header li.topic-report a{background-image:url(img/icons/action_icons_18_png/insert_topicreport.png);}div#action-header div.extra-actions ul li.topic-notification a{background-image:url(img/icons/action_icons_18_png/insert_notification.png);}div#action-header div.extra-actions ul li.topic-find form dl{background-image:url(img/icons/action_icons_18_png/find.png);}div#action-header div.extra-actions ul li.forum-find form dl{background-image:url(img/icons/action_icons_18_png/find.png);}body.activate_password div#action-header {background-image:url(img/icons/action_icons_18_png/activate_password.png);}body.activate_user div#action-header {background-image:url(img/icons/action_icons_18_png/activate_user.png);}body.add_contact div#action-header {background-image:url(img/icons/action_icons_18_png/add_contact.png);}body.admin div#action-header {background-image:url(img/icons/action_icons_18_png/admin.png);}body.cast_vote div#action-header {background-image:url(img/icons/action_icons_18_png/cast_vote.png);}body.change_email div#action-header {background-image:url(img/icons/action_icons_18_png/change_email.png);}body.copy_profile div#action-header {background-image:url(img/icons/action_icons_18_png/copy_profile.png);}body.create_user div#action-header {background-image:url(img/icons/action_icons_18_png/create_user.png);}body.custom div#action-header {background-image:url(img/icons/action_icons_18_png/custom.png);}body.delete_bookmark div#action-header {background-image:url(img/icons/action_icons_18_png/delete_bookmark.png);}body.delete_calendarevent div#action-header {background-image:url(img/icons/action_icons_18_png/delete_calendarevent.png);}body.delete_contact div#action-header {background-image:url(img/icons/action_icons_18_png/delete_contact.png);}body.delete_files div#action-header {background-image:url(img/icons/action_icons_18_png/delete_files.png);}body.delete_message div#action-header {background-image:url(img/icons/action_icons_18_png/delete_message.png);}body.delete_usernote div#action-header {background-image:url(img/icons/action_icons_18_png/delete_usernote.png);}body.delete_topicreport div#action-header {background-image:url(img/icons/action_icons_18_png/delete_topicreport.png);}body.edit_document div#action-header {background-image:url(img/icons/action_icons_18_png/edit_document.png);}body.edit_user div#action-header {background-image:url(img/icons/action_icons_18_png/edit_user.png);}body.error_connect div#action-header {background-image:url(img/icons/action_icons_18_png/error_connect.png);}body.error_general div#action-header,div.error_general {background-image:url(img/icons/action_icons_18_png/error_general.png);}body.error_method_missing div#action-header {background-image:url(img/icons/action_icons_18_png/error_method_missing.png);}body.error_selectdb div#action-header {background-image:url(img/icons/action_icons_18_png/error_selectdb.png);}body.faq div#action-header {background-image:url(img/icons/action_icons_18_png/faq.png);}body.find div#action-header {background-image:url(img/icons/action_icons_18_png/find.png);}body.find_messages div#action-header {background-image:url(img/icons/action_icons_18_png/find_messages.png);}body.frontend_admin div#action-header {background-image:url(img/icons/action_icons_18_png/frontend_admin.png);}body.get_messageversion div#action-header {background-image:url(img/icons/action_icons_18_png/get_messageversion.png);}body.http_status_code div#action-header {background-image:url(img/icons/action_icons_18_png/http_status_code.png);}body.impersonate div#action-header {background-image:url(img/icons/action_icons_18_png/impersonate.png);}body.insert_bookmark div#action-header {background-image:url(img/icons/action_icons_18_png/insert_bookmark.png);}body.insert_calendarevent div#action-header {background-image:url(img/icons/action_icons_18_png/insert_calendarevent.png);}body.insert_document div#action-header {background-image:url(img/icons/action_icons_18_png/insert_document.png);}body.insert_message div#action-header {background-image:url(img/icons/action_icons_18_png/insert_message.png);}body.insert_notification div#action-header {background-image:url(img/icons/action_icons_18_png/insert_notification.png);}body.insert_profilemessage div#action-header {background-image:url(img/icons/action_icons_18_png/insert_profilemessage.png);}body.insert_shoutbox_message div#action-header {background-image:url(img/icons/action_icons_18_png/insert_shoutbox_message.png);}body.insert_topic div#action-header {background-image:url(img/icons/action_icons_18_png/insert_topic.png);}body.insert_topicreport div#action-header {background-image:url(img/icons/action_icons_18_png/insert_topicreport.png);}body.list_activetopics div#action-header {background-image:url(img/icons/action_icons_18_png/list_activetopics.png);}body.list_activeusers div#action-header {background-image:url(img/icons/action_icons_18_png/list_activeusers.png);}body.list_bookmarks div#action-header {background-image:url(img/icons/action_icons_18_png/list_bookmarks.png);}body.list_calendar div#action-header {background-image:url(img/icons/action_icons_18_png/list_calendar.png);}body.list_category_topics div#action-header {background-image:url(img/icons/action_icons_18_png/list_category_topics.png);}body.list_contacts div#action-header {background-image:url(img/icons/action_icons_18_png/list_contacts.png);}body.list_discussions div#action-header {background-image:url(img/icons/action_icons_18_png/list_discussions.png);}body.list_sentpushmessages div#action-header {background-image:url(img/icons/action_icons_18_png/list_discussions.png);}body.list_pushmessages div#action-header {background-image:url(img/icons/action_icons_18_png/list_discussions.png);}body.list_documents div#action-header {background-image:url(img/icons/action_icons_18_png/list_documents.png);}body.list_documents_small div#action-header {background-image:url(img/icons/action_icons_18_png/list_documents_small.png);}body.list_messagehistory div#action-header {background-image:url(img/icons/action_icons_18_png/list_messagehistory.png);}body.list_messages_find div#action-header {background-image:url(img/icons/action_icons_18_png/list_messages_find.png);}body.list_notifications div#action-header {background-image:url(img/icons/action_icons_18_png/list_notifications.png);}body.list_profilemessages div#action-header {background-image:url(img/icons/action_icons_18_png/list_profilemessages.png);}body.list_publicusergroups div#action-header {background-image:url(img/icons/action_icons_18_png/list_publicusergroups.png);}body.list_setusernotes div#action-header {background-image:url(img/icons/action_icons_18_png/list_setusernotes.png);}body.list_topics div#action-header {background-image:url(img/icons/action_icons_18_png/list_topics.png);}body.list_usernotes div#action-header {background-image:url(img/icons/action_icons_18_png/list_usernotes.png);}body.list_users div#action-header {background-image:url(img/icons/action_icons_18_png/list_users.png);}body.login div#action-header {background-image:url(img/icons/action_icons_18_png/login.png);}body.logout div#action-header {background-image:url(img/icons/action_icons_18_png/logout.png);}body.manage_folders div#action-header {background-image:url(img/icons/action_icons_18_png/manage_folders.png);}body.mark_pushmessages div#action-header {background-image:url(img/icons/action_icons_18_png/mark_pushmessages.png);}body.myreact div#action-header {background-image:url(img/icons/action_icons_18_png/myreact.png);}body.new_password div#action-header {background-image:url(img/icons/action_icons_18_png/new_password.png);}body.notepad div#action-header {background-image:url(img/icons/action_icons_18_png/notepad.png);}body.pm_discussion div#action-header {background-image:url(img/icons/action_icons_18_png/pm_discussion.png);}body.pm_discussion_push div#action-header {background-image:url(img/icons/action_icons_18_png/pm_discussion_push.png);}body.pm_mark_subscription_result div#action-header {background-image:url(img/icons/action_icons_18_png/pm_mark_subscription_result.png);}body.pm_new_message div#action-header {background-image:url(img/icons/action_icons_18_png/pm_new_message.png);}body.preferences div#action-header {background-image:url(img/icons/action_icons_18_png/preferences.png);}body.quote_message div#action-header {background-image:url(img/icons/action_icons_18_png/quote_message.png);}body.reset div#action-header {background-image:url(img/icons/action_icons_18_png/reset.png);}body.rml_preview div#action-header {background-image:url(img/icons/action_icons_18_png/rml_preview.png);}body.send_activationkey div#action-header {background-image:url(img/icons/action_icons_18_png/send_activationkey.png);}body.send_passwordkey div#action-header {background-image:url(img/icons/action_icons_18_png/send_passwordkey.png);}body.send_pushmessage div#action-header {background-image:url(img/icons/action_icons_18_png/send_pushmessage.png);}body.spell_check div#action-header {background-image:url(img/icons/action_icons_18_png/spell_check.png);}body.update_bookmark div#action-header {background-image:url(img/icons/action_icons_18_png/update_bookmark.png);}body.update_calendarevent div#action-header {background-image:url(img/icons/action_icons_18_png/update_calendarevent.png);}body.update_message div#action-header {background-image:url(img/icons/action_icons_18_png/update_message.png);}body.update_notification div#action-header {background-image:url(img/icons/action_icons_18_png/update_notification.png);}body.update_publicusergroups div#action-header {background-image:url(img/icons/action_icons_18_png/update_publicusergroups.png);}body.update_shoutbox_message div#action-header {background-image:url(img/icons/action_icons_18_png/update_shoutbox_message.png);}body.user_profile div#action-header {background-image:url(img/icons/action_icons_18_png/user_profile.png);}body.view_calendarevent div#action-header {background-image:url(img/icons/action_icons_18_png/view_calendarevent.png);}body.view_message div#action-header {background-image:url(img/icons/action_icons_18_png/view_message.png);}body div#action-header.topic-statusid-1{background-image:url(img/icons/topic_icons_18_png/topic_sticky.png);}body div#action-header.topic-statusid-1.topic-has-new-1{background-image:url(img/icons/topic_icons_18_png/topic_sticky_new.png);}body div#action-header.topic-statusid-1.topic-has-new-0.topic-has-note-1{background-image:url(img/icons/topic_icons_18_png/topic_sticky_report.png);}body div#action-header.topic-statusid-1.topic-has-new-1.topic-has-note-1{background-image:url(img/icons/topic_icons_18_png/topic_sticky_new_report.png);}body div#action-header.topic-statusid-2{background-image:url(img/icons/topic_icons_18_png/topic_open.png);}body div#action-header.topic-statusid-2.topic-has-new-1{background-image:url(img/icons/topic_icons_18_png/topic_open_new.png);}body div#action-header.topic-statusid-2.topic-has-new-0.topic-has-note-1{background-image:url(img/icons/topic_icons_18_png/topic_open_report.png);}body div#action-header.topic-statusid-2.topic-has-new-1.topic-has-note-1{background-image:url(img/icons/topic_icons_18_png/topic_open_new_report.png);}body div#action-header.topic-statusid-4{background-image:url(img/icons/topic_icons_18_png/topic_closed.png);}body div#action-header.topic-statusid-4.topic-has-new-1{background-image:url(img/icons/topic_icons_18_png/topic_closed_new.png);}body div#action-header.topic-statusid-4.topic-has-new-0.topic-has-note-1{background-image:url(img/icons/topic_icons_18_png/topic_closed_report.png);}body div#action-header.topic-statusid-4.topic-has-new-1.topic-has-note-1{background-image:url(img/icons/topic_icons_18_png/topic_closed_new_report.png);}#lightbox{position:absolute;top:40px;left:0;width:100%;z-index:100;text-align:center;line-height:0;}#lightbox a img{border:none;}#outerImageContainer{position:relative;background-color:#fff;width:250px;height:250px;margin:0 auto;}#imageContainer{padding:10px;}#loading{position:absolute;top:40%;left:0%;height:25%;width:100%;text-align:center;line-height:0;}#hoverNav{position:absolute;top:0;left:0;height:100%;width:100%;z-index:10;}#imageContainer>#hoverNav{left:0;}#hoverNav a{outline:none;}#prevLink,#nextLink{width:49%;height:100%;background:transparent url(img/lightbox/blank.gif) no-repeat;display:block;}#prevLink{left:0;float:left;}#nextLink{right:0;float:right;}#prevLink:hover,#prevLink:visited:hover{background:url(img/lightbox/prevlabel.gif) left 15% no-repeat;}#nextLink:hover,#nextLink:visited:hover{background:url(img/lightbox/nextlabel.gif) right 15% no-repeat;}#imageDataContainer{font:10px Verdana,Helvetica,sans-serif;background-color:#fff;margin:0 auto;line-height:1.4em;}#imageData{padding:0 10px;}#imageData #imageDetails{width:70%;float:left;text-align:left;}#imageData #caption{font-weight:bold;}#imageData #numberDisplay{display:block;clear:left;padding-bottom:1.0em;}#imageData #bottomNavClose{width:66px;float:right;padding-bottom:0.7em;}#overlay{position:absolute;top:0;left:0;z-index:90;width:100%;height:500px;background-color:#000;filter:alpha(opacity=60);-moz-opacity:0.6;opacity:0.6;}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden;}* html>body .clearfix{display:inline-block;width:100%;}* html .clearfix{height:1%;} ------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=retrieve_multiple.js Content-Type: application/x-javascript; charset=ISO-8859-15; name=retrieve_multiple.js Content-Location: http://www.africanews.com/templates/africa/retrieve_multiple.php?js=xmlhttp,functions,extra,normal,forms,colorpicker,toolbar,doclib,doclib-site,doclib-africa,cssQuery-p,text-en_US,normal-africa,prototype,ufo,lightbox,effects,events Content-Transfer-Encoding: Base64 ZnVuY3Rpb24gZXh0cmFBY3Rpb25zVGhydVhtbEh0dHAodGFyZ2V0cykKewoJYWRk RXZlbnRUb1RhcmdldHModGFyZ2V0cywgJ2NsaWNrJywgX2V4dHJhQWN0aW9uc1Ro cnVYbWxIdHRwLCAnZGl2LmV4dHJhLWFjdGlvbnMgdWwubGlua3MgbGlbY2xhc3Nd IGEnKTsKfTsKCmZ1bmN0aW9uIF9leHRyYUFjdGlvbnNUaHJ1WG1sSHR0cChlKQp7 CgkvKnZhciBlID0gZSB8fCBmaXhFdmVudChlKTsqLwoKCXZhciBjb250YWluZXIg PSBuZXcgRE9NUXVlcnkoImRpdi5leHRyYS1hY3Rpb25zIikuZ2V0KDApOwoKCXZh ciBpdGVtID0gdGhpczsKCgl2YXIgbGkgPSBnZXRTaWJsaW5nTm9kZShpdGVtLCAn dXAnLCAnbGknKTsKCWlmKCFsaSkKCQlyZXR1cm47CgoJdmFyIHRvcGljaWQgPSBp dGVtLmhyZWYucmVwbGFjZSgvLisoaW5zZXJ0X3RvcGljcmVwb3J0fGluc2VydF9i b29rbWFya3xhZGRfa2V5d29yZHN8ZGVsZXRlX2tleXdvcmRzfGluc2VydF9ub3Rp ZmljYXRpb258cmF0ZXxzZXRfdG9waWNfcG9zdGhpc3Rvcnl8cmF0ZSkoXC9cRCsp P1wvKFxkKykoLispPy8sICckMycpOwoJaWYoIXRvcGljaWQpCgkJcmV0dXJuOwoK CXZhciBjbGFzc05hbWVzID0ganNjc3MoJ2dldCcsIGxpKSwgcmVxdWVzdCwgZm9y bU5hbWU7Cglmb3IodmFyIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7aSsr KQoJewoJCXN3aXRjaChjbGFzc05hbWVzW2ldKQoJCXsKCQkJY2FzZSAndG9waWMt YWRkLWtleXdvcmQnOgoJCQkJcmVxdWVzdCA9ICdhY3Rpb249YWRkX2tleXdvcmRz JmRhdGElNUJ0eXBlJTVEPXRvcGljJmRhdGElNUJpZCU1RD0nK3RvcGljaWQ7CgkJ CQlmb3JtTmFtZSA9ICdmb3JtLWFkZC1rZXl3b3Jkcyc7CgkJCQl2YXIgb25zdWJt aXRjYWxsYmFjayA9IGZ1bmN0aW9uICgpCgkJCQl7CgkJCQkJdmFyIGtleXdvcmRz ID0gbmV3IERPTVF1ZXJ5KCdkbC50b3BpYy1rZXl3b3JkcyBkZCcpLmdldCgwKTsK CgkJCQkJaWYoIWtleXdvcmRzKQoJCQkJCQlyZXR1cm47CgoJCQkJCXZhciBuZXdL ZXl3b3JkcyA9IG5ldyBET01RdWVyeSgnZm9ybSNmb3JtLWFkZC1rZXl3b3JkcyBp bnB1dCNrZXl3b3JkcycpLmdldCgwKS52YWx1ZTsKCQkJCQl2YXIgbGlzdFRvcGlj c1VybCA9IG5ldyBET01RdWVyeSgnYScsIGtleXdvcmRzKS5nZXQoMCkuaHJlZjsK CgkJCQkJbmV3S2V5d29yZHMgPSBuZXdLZXl3b3Jkcy5zcGxpdCgnICcpOwoKCQkJ CQlmb3IodmFyIGogPSAwOyBqIDwgbmV3S2V5d29yZHMubGVuZ3RoOyBqKyspCgkJ CQkJCWtleXdvcmRzLmFwcGVuZENoaWxkKGNyZWF0ZURPTU5vZGUoJ2EnLCB7ICdo cmVmJyA6IGxpc3RUb3BpY3NVcmwucmVwbGFjZSgvPS4rL2ksICc9JyArIG5ld0tl eXdvcmRzW2pdKSB9LCBbICcgJyArIG5ld0tleXdvcmRzW2pdIF0pKTsKCQkJCX07 CgkJCWJyZWFrOwoJCQljYXNlICd0b3BpYy1kZWxldGUta2V5d29yZCc6CgkJCQly ZXF1ZXN0ID0gJ2FjdGlvbj1kZWxldGVfa2V5d29yZHMmZGF0YSU1QnR5cGUlNUQ9 dG9waWMmZGF0YSU1QmlkJTVEPScrdG9waWNpZDsKCQkJCWZvcm1OYW1lID0gJ2Zv cm0tZGVsZXRlLWtleXdvcmRzJzsKCQkJCXZhciBvbnN1Ym1pdGNhbGxiYWNrID0g ZnVuY3Rpb24gKCkKCQkJCXsKCQkJCQl2YXIga2V5d29yZHMgPSBuZXcgRE9NUXVl cnkoJ2RsLnRvcGljLWtleXdvcmRzIGRkJykuZ2V0KDApOwoKCQkJCQlpZigha2V5 d29yZHMpCgkJCQkJCXJldHVybjsKCgkJCQkJdmFyIG5ld0tleXdvcmRzID0gbmV3 IERPTVF1ZXJ5KCdmb3JtI2Zvcm0tZGVsZXRlLWtleXdvcmRzIGlucHV0I2tleXdv cmRzJykuZ2V0KDApLnZhbHVlOwoJCQkJCXZhciBsaXN0VG9waWNzVXJsID0gbmV3 IERPTVF1ZXJ5KCdhJywga2V5d29yZHMpLmdldCgwKS5ocmVmOwoKCQkJCQluZXdL ZXl3b3JkcyA9IG5ld0tleXdvcmRzLnNwbGl0KCcgJyk7CgoJCQkJCWZvcih2YXIg aiA9IDA7IGogPCBuZXdLZXl3b3Jkcy5sZW5ndGg7IGorKykKCQkJCQkJa2V5d29y ZHMuYXBwZW5kQ2hpbGQoY3JlYXRlRE9NTm9kZSgnYScsIHsgJ2hyZWYnIDogbGlz dFRvcGljc1VybC5yZXBsYWNlKC89LisvaSwgJz0nICsgbmV3S2V5d29yZHNbal0p IH0sIFsgJyAnICsgbmV3S2V5d29yZHNbal0gXSkpOwoJCQkJfTsKCQkJYnJlYWs7 CgkJCWNhc2UgJ3RvcGljLXJlcG9ydCc6CgkJCQlyZXF1ZXN0ID0gJ2FjdGlvbj1p bnNlcnRfdG9waWNyZXBvcnQmZGF0YSU1QnRvcGljaWQlNUQ9Jyt0b3BpY2lkOwoJ CQkJZm9ybU5hbWUgPSAnZm9ybS1pbnNlcnQtdG9waWNyZXBvcnQnOwoJCQlicmVh azsKCQkJY2FzZSAndG9waWMtYm9va21hcmsnOgoJCQkJcmVxdWVzdCA9ICdhY3Rp b249aW5zZXJ0X2Jvb2ttYXJrJmRhdGElNUJ0b3BpY2lkJTVEPScrdG9waWNpZDsK CQkJCWZvcm1OYW1lID0gJ2Zvcm0taW5zZXJ0LWJvb2ttYXJrJzsKCQkJYnJlYWs7 CgkJCWNhc2UgJ3RvcGljLW5vdGlmaWNhdGlvbic6CgkJCQlyZXF1ZXN0ID0gJ2Fj dGlvbj1pbnNlcnRfbm90aWZpY2F0aW9uJmRhdGElNUJ0eXBlJTVEPXRvcGljJmRh dGElNUJpZCU1RD0nK3RvcGljaWQ7CgkJCQlmb3JtTmFtZSA9ICdmb3JtLWluc2Vy dC1ub3RpZmljYXRpb24nOwoJCQlicmVhazsKCQkJY2FzZSAndG9waWMtcG9zdGhp c3RvcnknOgoJCQkJcmVxdWVzdCA9ICdhY3Rpb249c2V0X3RvcGljX3Bvc3RoaXN0 b3J5JmRhdGElNUJ0b3BpY2lkJTVEPScrdG9waWNpZDsKCQkJCWZvcm1OYW1lID0g J2Zvcm0tcG9zdGhpc3Rvcnktc2V0JzsKCQkJYnJlYWs7CgkJCWNhc2UgJ3RvcGlj LXJhdGUnOgoJCQkJcmVxdWVzdCA9ICdhY3Rpb249cmF0ZSZkYXRhJTVCdHlwZSU1 RD10b3BpYyZkYXRhJTVCaWQlNUQ9Jyt0b3BpY2lkOwoJCQkJZm9ybU5hbWUgPSAn Zm9ybS1yYXRlJzsKCQkJYnJlYWs7CgkJfQoKCQlpZihyZXF1ZXN0KQoJCQlicmVh azsKCX0KCglpZighcmVxdWVzdCkKCQlyZXR1cm47CgoJdmFyIHJlc3VsdCA9IHht bEh0dHBGb3JtKCB0aGlzLCByZXF1ZXN0LCBjb250YWluZXIsIGZvcm1OYW1lLCBv bnN1Ym1pdGNhbGxiYWNrICk7CgoJaWYocmVzdWx0KQoJCWUucHJldmVudERlZmF1 bHQoKTsKfTsKCmZ1bmN0aW9uIHVwZGF0ZU1lc3NhZ2VzVGhydVhtbEh0dHAodGFy Z2V0cykKewoJdmFyIGl0ZW1zID0gZ2V0VGFyZ2V0cyh0YXJnZXRzLCAib2wubWVz c2FnZXMgbGkubWVzc2FnZSB1bC5tZXNzYWdlLWxpbmtzIGxpLm1lc3NhZ2UtZWRp dCBhIik7Cglmb3IodmFyIGkgPSAwLCBpdGVtOyhpdGVtPWl0ZW1zLmdldChpKSk7 aSsrKQoJewoJCWFkZEV2ZW50KGl0ZW0sICdjbGljaycsCgkJCWZ1bmN0aW9uKGUp CgkJCXsKCQkJCXZhciBtZXNzYWdlaWQgPSB0aGlzLmhyZWYucmVwbGFjZSgvLit1 cGRhdGVfbWVzc2FnZVwvKFxkKykoLispPy8sICckMScpOwoJCQkJaWYoIW1lc3Nh Z2VpZCkKCQkJCQlyZXR1cm4gdHJ1ZTsKCgkJCQl2YXIgY29udGFpbmVyID0gbmV3 IERPTVF1ZXJ5KCJvbC5tZXNzYWdlcyBsaSNtZXNzYWdlLSIgKyBtZXNzYWdlaWQg KyIgZGl2Lm1lc3NhZ2UtY29udGVudCIpLmdldCgwKTsKCgkJCQl2YXIgcmVzdWx0 ID0geG1sSHR0cEZvcm0oCgkJCQkJCXRoaXMsCgkJCQkJCSdhY3Rpb249dXBkYXRl X21lc3NhZ2UmZGF0YSU1Qm1lc3NhZ2VpZCU1RD0nK21lc3NhZ2VpZCwKCQkJCQkJ Y29udGFpbmVyLAoJCQkJCQknZm9ybS11cGRhdGUtbWVzc2FnZScsCgkJCQkJCWZ1 bmN0aW9uKCkKCQkJCQkJewoJCQkJCQkJdmFyIHJlcXVlc3QgPSAnYWN0aW9uPXZp ZXdfbWVzc2FnZSZkYXRhJTVCbWVzc2FnZWlkJTVEPScrbWVzc2FnZWlkOwoJCQkJ CQkJdmFyIHJlc3VsdHJlcSA9IGh0dHByZXFfc3RyaW5nKHJlcXVlc3QsIG51bGws IG51bGwsIGZhbHNlKTsKCgkJCQkJCQl2YXIgdGFyZ2V0ID0gbmV3IERPTVF1ZXJ5 KCdkaXYubWVzc2FnZS1jb250ZW50LWNvbnRlbnQnLCBjb250YWluZXIpLmdldCgw KTsKCQkJCQkJCXdoaWxlKHRhcmdldC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApCgkJ CQkJCQl7CgkJCQkJCQkJdGFyZ2V0LnJlbW92ZUNoaWxkKHRhcmdldC5maXJzdENo aWxkKTsKCQkJCQkJCX0KCgkJCQkJCQl2YXIgc291cmNlID0gbmV3IERPTVF1ZXJ5 KCdkaXYjY29yZSBmb3JtLnByaW1hcnktaW5wdXQgZGwucHJvcGVydHktbGlzdCBk dDpmaXJzdC1jaGlsZCArIGRkJywgcmVzdWx0cmVxLnJlc3BvbnNlWE1MKS5nZXQo MCk7CgkJCQkJCQl3aGlsZShzb3VyY2UuY2hpbGROb2Rlcy5sZW5ndGggPiAwKQoJ CQkJCQkJewoJCQkJCQkJCXRhcmdldC5hcHBlbmRDaGlsZCggc291cmNlLnJlbW92 ZUNoaWxkKHNvdXJjZS5maXJzdENoaWxkKSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJ CQkpOwoKCQkJCWlmKHJlc3VsdCkKCQkJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJ CX0KCQkpOwoJfQp9OwoKCgpmdW5jdGlvbiB4bWxIdHRwRm9ybShpbnZva2VyLCBy ZXF1ZXN0LCBjb250YWluZXIsIGZvcm1JZGVudGlmaWVyLCBvbnN1Ym1pdGNhbGxi YWNrKQp7CglpZihmb3JtSWRlbnRpZmllcikKCXsKCQl2YXIgb2xkRm9ybSA9IG5l dyBET01RdWVyeSgnZm9ybSMnK2Zvcm1JZGVudGlmaWVyLCBjb250YWluZXIpLmdl dCgwKTsKCQlpZihvbGRGb3JtKQoJCXsKCQkJb2xkRm9ybS5wYXJlbnROb2RlLnJl bW92ZUNoaWxkKG9sZEZvcm0pOwoJCQlqc2NzcygncmVtb3ZlJywgaW52b2tlciwg J3JlcXVlc3QtYWN0aXZlJyk7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCglpZigh Y29udGFpbmVyKQoJCXJldHVybiBmYWxzZTsKCgl2YXIgaXRlbXMgPSBuZXcgRE9N UXVlcnkoJ2Zvcm0ucHJpbWFyeS1pbnB1dCwgYVtjbGFzc149InJlcXVlc3QiXScs IGNvbnRhaW5lcik7Cglmb3IodmFyIGkgPSAwLCBpdGVtOyhpdGVtID0gaXRlbXMu Z2V0KGkpKTtpKyspCgl7CgkJc3dpdGNoKGl0ZW0udGFnTmFtZS50b0xvd2VyQ2Fz ZSgpKQoJCXsKCQkJY2FzZSAnZm9ybSc6CgkJCQlpdGVtLnBhcmVudE5vZGUucmVt b3ZlQ2hpbGQoaXRlbSk7CgkJCWJyZWFrOwoJCQljYXNlICdhJzoKCQkJCWpzY3Nz KCdyZW1vdmUnLCBpdGVtLCAncmVxdWVzdC1hY3RpdmUnKTsKCQkJYnJlYWs7CgkJ fQoJfQoKCWpzY3NzKCdhZGQnLCBpbnZva2VyLCAncmVxdWVzdC1hY3RpdmUnKTsK Cgl2YXIgb25zdWJtaXQgPSBmdW5jdGlvbihlKQoJewoJCWlmKGUuZGVmYXVsdFBy ZXZlbnRlZCkKCQkJcmV0dXJuIGZhbHNlOwoKCQlqc2NzcygnYWRkJywgaW52b2tl ciwgJ3JlcXVlc3QtcnVubmluZycpOwoKCQkvKiBmaW5kIG91dCB3ZXRoZXIgcHJl dmlldyBvciBzdWJtaXQgaGFzIGJlZW4gaGl0ICovCgkJaWYoZSAmJiBlLnR5cGUg PT0gInN1Ym1pdCIgJiYgdHlwZW9mIGUuZXhwbGljaXRPcmlnaW5hbFRhcmdldCAh PSAndW5kZWZpbmVkJyAmJiBlLmV4cGxpY2l0T3JpZ2luYWxUYXJnZXQubmFtZSA9 PSAiZGF0YVtwcmV2aWV3XSIpCgkJCXJldHVybiB0cnVlOwoKCQl2YXIgcmVxdWVz dCA9IGdhdGhlckh0dHBGb3JtKHRoaXMpOwoJCXVwZGF0ZXJlcSA9IGh0dHByZXFf c3RyaW5nKHJlcXVlc3QsIG51bGwsIG51bGwsIGZhbHNlKTsKCQlpZih1cGRhdGVy ZXEuZ2V0UmVzcG9uc2VIZWFkZXIoJ1gtRXJyb3JtZXNzYWdlJykpCgkJewoJCQlh bGVydCggdXBkYXRlcmVxLmdldFJlc3BvbnNlSGVhZGVyKCdYLUVycm9ybWVzc2Fn ZScpICk7CgkJCWpzY3NzKCdyZW1vdmUnLCBpbnZva2VyLCAncmVxdWVzdC1ydW5u aW5nJyk7CgkJfQoJCWVsc2UKCQl7CgkJCWlmKG9uc3VibWl0Y2FsbGJhY2spCgkJ CXsKCQkJCW9uc3VibWl0Y2FsbGJhY2soKTsKCQkJfQoKCQkJdGhpcy5wYXJlbnRO b2RlLnJlbW92ZUNoaWxkKHRoaXMpOwoKCQkJanNjc3MoJ3JlbW92ZScsIGludm9r ZXIsICdyZXF1ZXN0LXJ1bm5pbmcnKTsKCQkJanNjc3MoJ2FkZCcsIGludm9rZXIs ICdyZXF1ZXN0LWNvbXBsZXRlZCcpOwoJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkg eyBqc2NzcygncmVtb3ZlJywgaW52b2tlciwgJ3JlcXVlc3QtY29tcGxldGVkJyk7 IGpzY3NzKCdyZW1vdmUnLCBpbnZva2VyLCAncmVxdWVzdC1hY3RpdmUnKTsgfSwg NTAwMCk7CgkJfQoKCQllLnByZXZlbnREZWZhdWx0KCk7Cgl9OwoKCXJldHVybiBy ZXF1ZXN0Rm9ybShyZXF1ZXN0LCBjb250YWluZXIsIG9uc3VibWl0LCBpbnZva2Vy KTsKfTsKCmZ1bmN0aW9uIHJlcXVlc3RGb3JtKHJlcXVlc3RVUkwsIGNvbnRhaW5l ciwgb25zdWJtaXQsIGludm9rZXIpCnsKCWpzY3NzKCdhZGQnLCBpbnZva2VyLCAn cmVxdWVzdC1ydW5uaW5nJyk7Cgl2YXIgZm9ybXJlcSA9IGh0dHByZXFfc3RyaW5n KHJlcXVlc3RVUkwsIG51bGwsIG51bGwsIGZhbHNlLCAnR0VUJyk7CgoJaWYoIGZv cm1yZXEucmVhZHlTdGF0ZSA9PSA0ICkKCXsKCQlpZihmb3JtcmVxLmdldFJlc3Bv bnNlSGVhZGVyKCdYLUVycm9ybWVzc2FnZScpKQoJCXsKCQkJYWxlcnQoIGZvcm1y ZXEuZ2V0UmVzcG9uc2VIZWFkZXIoJ1gtRXJyb3JtZXNzYWdlJykgKTsKCQkJanNj c3MoJ3JlbW92ZScsIGludm9rZXIsICdyZXF1ZXN0LXJ1bm5pbmcnKTsKCQkJcmV0 dXJuIHRydWU7CgkJfQoJCWVsc2UKCQl7CgkJCXZhciBmb3JtID0gZ2V0RWxlbWVu dEZyb21YSFIoZm9ybXJlcSwgJ2Zvcm0ucHJpbWFyeS1pbnB1dCcsIGNvbnRhaW5l cik7CgoJCQlpZighZm9ybSkKCQkJewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJ CQlqc2NzcygnYWRkJywgZm9ybSwgJ2V4dHJlcXVlc3QnKTsKCgkJCWNvbnRhaW5l ci5hcHBlbmRDaGlsZCggZm9ybSApOwoKCQkJLyoKCQkJCVRvIHByZXZlbnQgdGhl IG9uc3VibWl0KCkgZnVuY3Rpb24gdG8gc3VibWl0IHRoZSBmb3JtIHVzaW5nIGEg WEhSLAoJCQkJd2UgaGF2ZSB0byBzdG9yZSB3ZXRoZXIgYW55IHByZXZpb3VzIGFj dGlvbiBoYXMgc3RvcHBlZCB0aGUgZGVmYXVsdCBhY3Rpb24KCQkJCShzdWJtaXR0 aW5nIG9mIHRoZSBmb3JtKS4KCQkJCVNvLCB3ZSBhdHRhY2ggYSBzcGVjaWFsIGV2 ZW50IGF0IHRoZSBwcm9wYWdhdGlvbi1waGFzZSAoYmVmb3JlIGFsbCBldmVudHNb XQoJCQkJZG8gdGhlaXIgd29yaykgYXQgdGhlIHBhcmVudE5vZGUsIGFuZCBtb2Rp ZnkgdGhlIGV2ZW50LW9iamVjdCB0byBzdG9yZQoJCQkJd2V0aGVyIHByZXZlbnRE ZWZhdWx0KCkgaGFzIGJlZW4gY2FsbGVkLgoJCQkJVGhlbiwgdGhlIHNlY29uZCBl dmVudC1saXN0ZW5lciBpcyBjYWxsZWQgZHVyaW5nIHRoZSBidWJibGUtcGhhc2Ug LSBhbmQgaXQKCQkJCWNoZWNrcyB3ZXRoZXIgdGhlIGV2ZW50IGhhcyBkZXRlcm1p bmVkIHByZXZlbnREZWZhdWx0KCkgaGFzIGJlZW4gY2FsbGVkLgoKCQkJCUhvd2V2 ZXIuLi4gSUUgbXVzdCBkaWUhCgkJCQlJdCBkb2Vzbid0IHN1cHBvcnQgcHJvcGFn YXRpb24gZm9yIHN1Ym1pdC1ldmVudHMsIHNvIHdlIHVzZSB0aGUgYWRkRXZlbnQn cyBiZWhhdmlvdXIKCQkJCW9mIGNhbGxpbmcgdGhlIGZ1bmN0aW9ucyBpbiBzZXF1 ZW5jZSBvZiBhc3NpZ25tZW50IHRvIGVtdWxhdGUgdGhlIGJlaGF2aW91ci4KCQkJ Ki8KCgkJCXZhciBldmVudFRhcmdldCA9IGZvcm07CgkJCWlmKGZvcm0uYWRkRXZl bnRMaXN0ZW5lcikKCQkJewoJCQkJdmFyIGV2ZW50VGFyZ2V0ID0gZXZlbnRUYXJn ZXQucGFyZW50Tm9kZTsKCQkJfQoKCQkJLyogb25seSBhdHRhY2ggdGhlIGhhbmRs ZXIgb24gdGhlIGNvbnRhaW5lciBvbmNlICovCgkJCWlmKGV2ZW50VGFyZ2V0LnRh Z05hbWUgPT0gJ2Zvcm0nIHx8IHR5cGVvZiBldmVudFRhcmdldC5fX3ByZXZlbnRE ZWZhdWx0SGFuZGxlciA9PSAndW5kZWZpbmVkJykKCQkJewoJCQkJYWRkRXZlbnQu ZXZlbnRMaXN0ZW5lclVzZUNhcHR1cmUgPSB0cnVlOwoJCQkJYWRkRXZlbnQoZXZl bnRUYXJnZXQsICdzdWJtaXQnLCBmdW5jdGlvbihlKQoJCQkJewoJCQkJCWUuX19w cmV2ZW50RGVmYXVsdCA9IGUucHJldmVudERlZmF1bHQ7CgkJCQkJZS5wcmV2ZW50 RGVmYXVsdCA9IGZ1bmN0aW9uKCkKCQkJCQl7CgkJCQkJCWUuZGVmYXVsdFByZXZl bnRlZCA9IHRydWU7CgkJCQkJCWUuX19wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCX07 CgkJCQl9KTsKCQkJCWFkZEV2ZW50LmV2ZW50TGlzdGVuZXJVc2VDYXB0dXJlID0g ZmFsc2U7CgkJCQlldmVudFRhcmdldC5fX3ByZXZlbnREZWZhdWx0SGFuZGxlciA9 IHRydWU7CgkJCX0KCgkJCV9pbml0KGV2ZW50cywgZm9ybS5wYXJlbnROb2RlKTsK CgkJCWFkZEV2ZW50KGZvcm0sICdzdWJtaXQnLCBvbnN1Ym1pdCk7CgoJCQlqc2Nz cygncmVtb3ZlJywgaW52b2tlciwgJ3JlcXVlc3QtcnVubmluZycpOwoKCQkJcmV0 dXJuIHRydWU7CgkJfQoJfQp9OwoKZnVuY3Rpb24gZ2F0aGVySHR0cEZvcm0oZm9y bSkKewoJdmFyIGl0ZW1zID0gZm9ybS5lbGVtZW50czsKCXZhciBzdHIgPSBbIF07 CgoJZm9yKHZhciBpID0gMCwgaXRlbTsoaXRlbT1pdGVtc1tpXSk7aSsrKQoJewoJ CXN3aXRjaCggaXRlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgKQoJCXsKCQkJY2Fz ZSAnaW5wdXQnOgoJCQkJc3dpdGNoKGl0ZW0udHlwZSkKCQkJCXsKCQkJCQljYXNl ICd0ZXh0JzoKCQkJCQljYXNlICdoaWRkZW4nOgoJCQkJCWNhc2UgJ3Bhc3N3b3Jk JzoKCQkJCQkJc3RyLnB1c2goaXRlbS5uYW1lKyc9JysgZXNjYXBlKCBpdGVtLnZh bHVlICkgKTsKCQkJCQlicmVhazsKCQkJCQljYXNlICdyYWRpbyc6CgkJCQkJY2Fz ZSAnY2hlY2tib3gnOgoJCQkJCQlpZihpdGVtLmNoZWNrZWQpCgkJCQkJCXsKCQkJ CQkJCXN0ci5wdXNoKGl0ZW0ubmFtZSsnPScrIGVuY29kZVVSSSggaXRlbS52YWx1 ZSApICk7CgkJCQkJCX0KCQkJCQlicmVhazsKCQkJCQljYXNlICdmaWxlJzoKCQkJ CQkJaWYoaXRlbS52YWx1ZSkKCQkJCQkJewoJCQkJCQkJdGhyb3cgbmV3IEVycm9y KCJJIGNhbid0IGhhbmRsZSBmaWxlLXVwbG9hZHM7IEknbGwgc3VibWl0IHRoZSBm b3JtIHVzaW5nIGEgbm9ybWFsIHJlcXVlc3QuIik7CgkJCQkJCX0KCQkJCQlicmVh azsKCQkJCX0KCQkJYnJlYWs7CgkJCWNhc2UgJ3NlbGVjdCc6CgkJCQlzdHIucHVz aChpdGVtLm5hbWUrJz0nKyBlbmNvZGVVUkkoIGl0ZW0ub3B0aW9uc1tpdGVtLnNl bGVjdGVkSW5kZXhdLnZhbHVlICkgKTsKCQkJYnJlYWs7CgkJCWNhc2UgJ3RleHRh cmVhJzoKCQkJCXN0ci5wdXNoKGl0ZW0ubmFtZSsnPScrIGVuY29kZVVSSSggaXRl bS52YWx1ZSApICk7CgkJCWJyZWFrOwoJCX0KCX0KCglyZXR1cm4gc3RyLmpvaW4o JyYnKTsKfTsKCmZ1bmN0aW9uIGh0dHByZXFfeG1sKHJlcXVlc3QsIGNhbGxiYWNr LCB1cmwsIGFzeW5jKQp7Cgl2YXIgeG1sdXJsID0gdXJsIHx8IGJvYXJkX3Njcmlw dF91cmwgKyAnLy4uL3htbF9pbnB1dC5waHAnOwogIAl2YXIgeG1sUGFyc2VyLCB4 bWxEb2N1bWVudCwgcmVxOwoKCWlmKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkKCXsK CQkvKiBzYWZhcmkgMS4zLzIuMCBkb2Vzbid0IHN1cHBvcnQgRE9NUGFyc2VyICov CgkJaWYodHlwZW9mIERPTVBhcnNlciA9PSAidW5kZWZpbmVkIikKCQkJcmV0dXJu IGZhbHNlOwoKCQlyZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKCQl4bWxQYXJz ZXIgPSBuZXcgRE9NUGFyc2VyKCk7CgkJeG1sRG9jdW1lbnQgPSB4bWxQYXJzZXIu cGFyc2VGcm9tU3RyaW5nKHJlcXVlc3QsICd0ZXh0L3htbCcpOwoJfQoJZWxzZSBp Zih3aW5kb3cuQWN0aXZlWE9iamVjdCkKCXsKCQlyZXEgPSBuZXcgQWN0aXZlWE9i amVjdCgiTVNYTUwyLlhNTEhUVFAuMy4wIik7CgoJCXhtbERvY3VtZW50ID0gbmV3 IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5ET01Eb2N1bWVudC4zLjAnKTsKCQl4bWxE b2N1bWVudC5hc3luYyA9IGZhbHNlOwoJCXhtbERvY3VtZW50LmxvYWRYTUwocmVx dWVzdCk7Cgl9CgoJeG1sRG9jdW1lbnQuaW5zZXJ0QmVmb3JlKHhtbERvY3VtZW50 LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigieG1sIiwgInZlcnNpb249JzEu MCciKSwgeG1sRG9jdW1lbnQuZmlyc3RDaGlsZCk7CgoJaWYoY2FsbGJhY2spCgkJ cmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGNhbGxiYWNrOwoKCXJlcS5vcGVuKCJQ T1NUIiwgeG1sdXJsLCAodHlwZW9mIGFzeW5jID09ICJib29sZWFuIiA/IGFzeW5j IDogdHJ1ZSkgKTsKCglpZih3aW5kb3cuWE1MSHR0cFJlcXVlc3QpCgl7CgkJcmVx LnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L3htbDsgdXRm LTgnKTsKCX0KCglyZXEuc2VuZChyZXF1ZXN0KTsKCglyZXR1cm4gcmVxOwp9OwoK ZnVuY3Rpb24gaHR0cHJlcV9zdHJpbmcocmVxdWVzdCwgY2FsbGJhY2ssIHVybCwg YXN5bmMsIG1ldGhvZCkKewogIAl2YXIgcmVxOwoJdmFyIHhtbHVybCA9IHVybCB8 fCBib2FyZF9zY3JpcHRfdXJsOwoJbWV0aG9kID0gbWV0aG9kIHx8ICJQT1NUIjsK ICAJYXN5bmMgPSAodHlwZW9mIGFzeW5jID09ICJib29sZWFuIiA/IGFzeW5jIDog dHJ1ZSk7CgoJaWYod2luZG93LlhNTEh0dHBSZXF1ZXN0KQoJewoJCXJlcSA9IG5l dyBYTUxIdHRwUmVxdWVzdCgpOwoJfQoJZWxzZSBpZih3aW5kb3cuQWN0aXZlWE9i amVjdCkKCXsKCQlyZXEgPSBuZXcgQWN0aXZlWE9iamVjdCgiTVNYTUwyLlhNTEhU VFAuMy4wIik7Cgl9CgoJaWYoY2FsbGJhY2spCgkJcmVxLm9ucmVhZHlzdGF0ZWNo YW5nZSA9IGNhbGxiYWNrOwoKCWlmKHJlcS5vdmVycmlkZU1pbWVUeXBlKQoJCXJl cS5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L3htbCcpOwoKCXJlcXVlc3QgKz0gJyZk b250X21ldGFfcmVmcmVzaD0xJzsKCglpZihtZXRob2QgPT0gIkdFVCIpCgl7CgkJ cmVxLm9wZW4obWV0aG9kLCB4bWx1cmwgKyAnPycgKyByZXF1ZXN0LCBhc3luYyAp OwoJCXJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAnYXBwbGlj YXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7CgkJcmVxLnNlbmQobnVsbCk7 Cgl9CgllbHNlCgl7CgkJcmVxLm9wZW4obWV0aG9kLCB4bWx1cmwsIGFzeW5jICk7 CgkJcmVxLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICdhcHBsaWNh dGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTsKCQlyZXEuc2VuZChyZXF1ZXN0 KTsKCX0KCglyZXR1cm4gcmVxOwp9OwoKLyogdGhlIGNvbnRhaW5lciBzcGVjaWZp ZXMgdGhlIGRlc2lyZWQgZW5kcG9pbnQgZm9yIHRoZSBub2RlICovCmZ1bmN0aW9u IGdldEVsZW1lbnRGcm9tWEhSKHRyYW5zcG9ydCwgc2VsZWN0b3IsIGNvbnRhaW5l cikKewoJdmFyIHJvb3Q7CglpZihpc1dlYktpdCB8fCAhdHJhbnNwb3J0SGFzVmFs aWRSZXNwb25zZVhNTCh0cmFuc3BvcnQpKQoJewoJCXJvb3QgPSBkb2N1bWVudC5j cmVhdGVFbGVtZW50KCdkaXYnKTsKCQlyb290LmlubmVySFRNTCA9IHRyYW5zcG9y dC5yZXNwb25zZVRleHQ7Cgl9CgllbHNlCgl7CgkJcm9vdCA9IHRyYW5zcG9ydC5y ZXNwb25zZVhNTDsKCX0KCgl2YXIgZWxlbWVudCA9IG5ldyBET01RdWVyeShzZWxl Y3Rvciwgcm9vdCkuZ2V0KDApOwoJaWYoIWVsZW1lbnQpCgkJcmV0dXJuOwoKCWlm KGlzV2ViS2l0IHx8ICF0cmFuc3BvcnRIYXNWYWxpZFJlc3BvbnNlWE1MKHRyYW5z cG9ydCkpCgl7CgkJcmV0dXJuIGVsZW1lbnQ7Cgl9CgoJdmFyIF9lbGVtZW50OwoK CWlmKCFjb250YWluZXIpCgkJY29udGFpbmVyID0gZG9jdW1lbnQuYm9keTsKCgl0 cnkKCXsKCQlfZWxlbWVudCA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50LmFkb3B0 Tm9kZSggZWxlbWVudCwgdHJ1ZSApOwoJfQoJY2F0Y2goZSkKCXsKCQlfZWxlbWVu dCA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50LmltcG9ydE5vZGUoIGVsZW1lbnQs IHRydWUgKTsKCX0KCglyZXR1cm4gY29udGFpbmVyLm5hbWVzcGFjZVVSSSA9PSBf ZWxlbWVudC5uYW1lc3BhY2VVUkkgPyBfZWxlbWVudCA6IGltcG9ydE5vZGVDdXJy ZW50TlMoIF9lbGVtZW50ICk7Cn07CgpmdW5jdGlvbiB0cmFuc3BvcnRIYXNWYWxp ZFJlc3BvbnNlWE1MKHRyYW5zcG9ydCkKewoJaWYgKCB0eXBlb2YgdHJhbnNwb3J0 LnJlc3BvbnNlWE1MICE9ICd1bmRlZmluZWQnIHx8IHRyYW5zcG9ydC5yZXNwb25z ZVhNTC5maXJzdENoaWxkLnRhZ05hbWUgPT0gJ3BhcnNlcmVycm9yJyB8fCB0cmFu c3BvcnQucmVzcG9uc2VYTUwuZG9jdW1lbnRFbGVtZW50ID09IG51bGwgfHwgdHJh bnNwb3J0LnJlc3BvbnNlWE1MLmRvY3VtZW50RWxlbWVudCA9PSAndW5kZWZpbmVk JykKCQlyZXR1cm4gZmFsc2U7CgoJcmV0dXJuIHRydWU7Cn07CgpmdW5jdGlvbiBp bXBvcnROb2RlQ3VycmVudE5TKG5vZGUpCnsKCXZhciBjbG9uZTsKCglzd2l0Y2go bm9kZS5ub2RlVHlwZSkKCXsKCQlkZWZhdWx0OgoJCWNhc2UgODogLyogY29tbWVu dCAqLwoJCQlyZXR1cm47CgkJY2FzZSAzOiAvKiB0ZXh0ICovCgkJCXJldHVybiBk b2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggbm9kZS5ub2RlVmFsdWUgKTsKCQljYXNl IDE6IC8qIG5vZGUgKi8KCQkJY2xvbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50 KCBub2RlLnRhZ05hbWUgKTsKCX0KCglmb3IodmFyIGk9MCwgYXR0cmlidXRlOyAo YXR0cmlidXRlPW5vZGUuYXR0cmlidXRlc1tpXSk7IGkrKykKCXsKCQljbG9uZS5z ZXRBdHRyaWJ1dGUoYXR0cmlidXRlLm5hbWUsIGF0dHJpYnV0ZS52YWx1ZSk7Cgl9 CgoJZm9yKHZhciBqPTAsIHN1Yk5vZGUsIGltcG9ydGVkU3ViTm9kZTsgKHN1Yk5v ZGU9bm9kZS5jaGlsZE5vZGVzW2pdKTsgaisrKQoJewoJCWltcG9ydGVkU3ViTm9k ZSA9IGFyZ3VtZW50cy5jYWxsZWUoIG5vZGUuY2hpbGROb2Rlc1tqXSApOwoJCWlm KGltcG9ydGVkU3ViTm9kZSkKCQkJY2xvbmUuYXBwZW5kQ2hpbGQoIGltcG9ydGVk U3ViTm9kZSApOwoJfQoKCXJldHVybiBjbG9uZTsKfTsKLyogcmlwcGVkIGZyb20g aHR0cDovL3d3dy5vbmxpbmV0b29scy5vcmcvYXJ0aWNsZXMvdW5vYnRydXNpdmVq YXZhc2NyaXB0L2Nzc2pzc2VwYXJhdGlvbi5odG1sICovCi8qIDMxLTEwLTIwMDUg MTM6NTkgcmVwbGFjZWQgd2l0aCB0aW5vJ3MgY29kZSwgc2VlIGJlbG93ICovCi8q CglhCgkJZGVmaW5lcyB0aGUgYWN0aW9uIHlvdSB3YW50IHRoZSBmdW5jdGlvbiB0 byBwZXJmb3JtLgoJbwoJCXRoZSBvYmplY3QgaW4gcXVlc3Rpb24uCgljMQoJCXRo ZSBuYW1lIG9mIHRoZSBmaXJzdCBjbGFzcwoJYzIKCQl0aGUgbmFtZSBvZiB0aGUg c2Vjb25kIGNsYXNzCgoJUG9zc2libGUgYWN0aW9ucyBhcmU6CgoJc3dhcAoJCXJl cGxhY2VzIGNsYXNzIGMxIHdpdGggY2xhc3MgYzIgaW4gb2JqZWN0IG8uCglhZGQK CQlhZGRzIGNsYXNzIGMxIHRvIHRoZSBvYmplY3Qgby4KCXJlbW92ZQoJCXJlbW92 ZXMgY2xhc3MgYzEgZnJvbSB0aGUgb2JqZWN0IG8uCgljaGVjawoJCXRlc3QgaWYg Y2xhc3MgYzEgaXMgYWxyZWFkeSBhcHBsaWVkIHRvIG9iamVjdCBvIGFuZCByZXR1 cm5zIHRydWUgb3IgZmFsc2UKCXRvZ2dsZQoJCXRlc3QgaWYgY2xhc3MgYzEgaXMg YWxyZWFkeSBhcHBsaWVkIHRvIG9iamVjdCBvIGFuZCByZW1vdmUgaWYgc28sIG90 aGVyd2lzZSBhZGQgY2xhc3MgYzEKKi8KZnVuY3Rpb24ganNjc3MoYSxvLGMxLGMy KQp7Cglzd2l0Y2ggKGEpCgl7CgkJY2FzZSAnYWRkJzoKCQkJanNjc3MuYWRkQ2xh c3MobywgYzEpOwoJCQlicmVhazsKCQljYXNlICdyZW1vdmUnOgoJCQlqc2Nzcy5y ZW1vdmVDbGFzcyhvLCBjMSwgYzIpOwoJCQlicmVhazsKCQljYXNlICdjaGVjayc6 CgkJCXJldHVybiBqc2Nzcy5oYXNDbGFzcyhvLCBjMSk7CgkJCWJyZWFrOwoJCWNh c2UgJ2NoZWNrUGFyZW50cyc6CgkJCWRvCgkJCXsKCQkJCWlmIChqc2Nzcy5oYXND bGFzcyhvLCBjMSkpCgkJCQkJcmV0dXJuIHRydWU7CgoJCQkJaWYoby50YWdOYW1l LnRvTG93ZXJDYXNlKCkgPT0gJ2JvZHknKQoJCQkJCXJldHVybiBmYWxzZTsKCQkJ fQoJCQl3aGlsZShvID0gby5wYXJlbnROb2RlKTsKCQkJcmV0dXJuIGZhbHNlOwoJ CQlicmVhazsKCQljYXNlICd0b2dnbGUnOgoJCQl2YXIgb3BlcmF0aW9uID0gJ2Fk ZCc7CgoJCQlpZihqc2NzcygnY2hlY2snLCBvLCBjMSkpCgkJCQlvcGVyYXRpb24g PSAncmVtb3ZlJzsKCgkJCWpzY3NzKG9wZXJhdGlvbiwgbywgYzEsIGMyKTsKCQkJ YnJlYWs7CgkJY2FzZSAnc3dhcCc6CgkJCWpzY3NzLnJlcGxhY2VDbGFzcyhvLCBj MiwgYzEpOwoJCQlicmVhazsKCQljYXNlICdnZXQnOgoJCQlyZXR1cm4ganNjc3Mu Z2V0Q2xhc3NMaXN0KG8pOwoJCQlicmVhazsKCX0KCXJldHVybiBudWxsOwp9OwoK LyogdGFrZW4gZnJvbSBodHRwOi8vdGhlcmVhbGNyaXNwLnhzNGFsbC5ubC9tZXVr L2NsYXNzZGVhbGVyLmpzICovCi8qIGF1dGhvcjogVGlubyBaaWpkZWwsIDIwMDUg Ki8KanNjc3MuYWRkQ2xhc3MgPSBmdW5jdGlvbiAoZWxlbWVudCwgY2xhc3NuYW1l KQp7Cgl2YXIgY2xhc3NlcyA9IGpzY3NzLmdldENsYXNzTGlzdChlbGVtZW50KTsK CWlmIChjbGFzc2VzLmluZGV4T2YoY2xhc3NuYW1lKSA9PSAtMSkKCXsKCQljbGFz c2VzW2NsYXNzZXMubGVuZ3RoXSA9IGNsYXNzbmFtZTsKCX0KCglqc2Nzcy5zZXRD bGFzc0xpc3QoZWxlbWVudCwgY2xhc3Nlcyk7Cn07Cgpqc2Nzcy5yZW1vdmVDbGFz cyA9IGZ1bmN0aW9uIChlbGVtZW50LCBjbGFzc25hbWUpCnsKCXZhciBjbGFzc2Vz ID0ganNjc3MuZ2V0Q2xhc3NMaXN0KGVsZW1lbnQpLCBpbmRleDsKCWlmICgoaW5k ZXggPSBjbGFzc2VzLmluZGV4T2YoY2xhc3NuYW1lKSkgPiAtMSkKCXsKCQlkZWxl dGUgY2xhc3Nlc1tpbmRleF07Cgl9CgoJanNjc3Muc2V0Q2xhc3NMaXN0KGVsZW1l bnQsIGNsYXNzZXMpOwp9OwoKanNjc3MucmVwbGFjZUNsYXNzID0gZnVuY3Rpb24g KGVsZW1lbnQsIG9sZGNsYXNzLCBuZXdjbGFzcykKewoJdmFyIGNsYXNzZXMgPSBq c2Nzcy5nZXRDbGFzc0xpc3QoZWxlbWVudCksIGluZGV4OwoJaWYgKChpbmRleCA9 IGNsYXNzZXMuaW5kZXhPZihvbGRjbGFzcykpID4gLTEgJiYgY2xhc3Nlcy5pbmRl eE9mKG5ld2NsYXNzKSA9PSAtMSkKCXsKCQljbGFzc2VzW2luZGV4XSA9IG5ld2Ns YXNzOwoJfQoKCWpzY3NzLnNldENsYXNzTGlzdChlbGVtZW50LCBjbGFzc2VzKTsK fTsKCmpzY3NzLmdldENsYXNzTGlzdCA9IGZ1bmN0aW9uIChlbGVtZW50KQp7Cglp ZiAoZWxlbWVudC5jbGFzc05hbWUpCgkJcmV0dXJuIGVsZW1lbnQuY2xhc3NOYW1l LnNwbGl0KC9ccysvKTsKCXJldHVybiBbXTsKfTsKCmpzY3NzLnNldENsYXNzTGlz dCA9IGZ1bmN0aW9uIChlbGVtZW50LCBjbGFzc2VzKQp7CgllbGVtZW50LmNsYXNz TmFtZSA9IGNsYXNzZXMuam9pbignICcpOwp9OwoKanNjc3MuaGFzQ2xhc3MgPSBm dW5jdGlvbiAoZWxlbWVudCwgY2xhc3NuYW1lKQp7Cgl2YXIgd2FudGVkQ2xhc3Nl cyA9IG5ldyBBcnJheSgpOwoJaWYgKGNsYXNzbmFtZS5pbmRleE9mKCcgJykgPiAt MSkKCXsKCQl3YW50ZWRDbGFzc2VzID0gY2xhc3NuYW1lLnNwbGl0KC9ccysvKTsK CX0gZWxzZSB7CgkJd2FudGVkQ2xhc3Nlc1swXSA9IGNsYXNzbmFtZTsKCX0KCgl2 YXIgY2xhc3NlcyA9IGpzY3NzLmdldENsYXNzTGlzdChlbGVtZW50KTsKCglmb3Ig KHZhciBpID0gMDsgaSA8IHdhbnRlZENsYXNzZXMubGVuZ3RoOyBpKyspCgl7CgkJ aWYgKGNsYXNzZXMuaW5kZXhPZih3YW50ZWRDbGFzc2VzW2ldKSA9PSAtMSkKCQl7 CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJcmV0dXJuIHRydWU7Cn07CgppZiAo IUFycmF5LnByb3RvdHlwZS5pbmRleE9mKQp7CglBcnJheS5wcm90b3R5cGUuaW5k ZXhPZiA9IGZ1bmN0aW9uKHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCkKCXsKCQl2 YXIgbCA9IHRoaXMubGVuZ3RoLCBpID0gMDsKCQlpZiAoZnJvbUluZGV4KQoJCXsK CQkJaSA9IGZyb21JbmRleDsKCQkJaWYgKGkgPCAwKQoJCQl7CgkJCQlpICs9IGw7 CgkJCQlpZiAoaSA8IDApCgkJCQkJaSA9IDA7CgkJCX0KCQl9CgoJCXdoaWxlIChp IDwgbCkKCQl7CgkJCWlmICh0aGlzW2ldID09PSBzZWFyY2hFbGVtZW50KQoJCQkJ cmV0dXJuIGk7CgkJCWkrKzsKCQl9CgoJCXJldHVybiAtMTsKCX07Cn0KCmlmICgh QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKQp7CglBcnJheS5wcm90b3R5cGUu bGFzdEluZGV4T2YgPSBmdW5jdGlvbihzZWFyY2hFbGVtZW50LCBmcm9tSW5kZXgp Cgl7CgkJdmFyIGkgPSB0aGlzLmxlbmd0aDsKCQlpZiAoIWZyb21JbmRleCkgZnJv bUluZGV4ID0gMDsKCQllbHNlIGlmIChmcm9tSW5kZXggPCAxKQoJCXsKCQkJZnJv bUluZGV4ICs9IGk7CgkJCWlmIChmcm9tSW5kZXggPCAwKSBmcm9tSW5kZXggPSAw OwoJCX0KCgkJd2hpbGUgKGktLSA+IGZyb21JbmRleCkKCQl7CgkJCWlmICh0aGlz W2ldID09PSBzZWFyY2hFbGVtZW50KSByZXR1cm4gaTsKCQl9CgoJCXJldHVybiAt MTsKCX07Cn07CgppZiAoIUFycmF5LmdldFVuaXF1ZSkKewoJQXJyYXkucHJvdG90 eXBlLmdldFVuaXF1ZSA9IGZ1bmN0aW9uKCkKCXsKCQl2YXIgbmV3X2FycmF5ID0g W107CgoJCWZvciAodmFyIGk9MDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspCgkJCWlm IChuZXdfYXJyYXkuaW5kZXhPZih0aGlzW2ldKSA9PSAtMSkKCQkJCW5ld19hcnJh eS5wdXNoKHRoaXNbaV0pOwoKCQlyZXR1cm4gbmV3X2FycmF5OwoJfQp9OwoKLyog d2UncmUgYXNzdW1pbmcgY3NzUXVlcnkgd2lsbCBhbHdheXMgYmUgYXZhaWxhYmxl ICovCnZhciBjc3NRdWVyeSA9IHt9Owp2YXIgRE9NUXVlcnkgPSBmdW5jdGlvbigp CnsKCXZhciBET01RdWVyeTsKCglpZihkb2N1bWVudC5oYXNRdWVyeVNlbGVjdG9y KSAvKiB3M2M6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy1hcGkvICov Cgl7CgkJRE9NUXVlcnkgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dE5vZGUs IG5zKQoJCXsKCQkJaWYodHlwZW9mIGNvbnRleHROb2RlID09ICJ1bmRlZmluZWQi KQoJCQl7CgkJCQljb250ZXh0Tm9kZSA9IERPTVF1ZXJ5LnByb3RvdHlwZS5zY29w ZTsKCQkJfQoKCQkJdGhpcy5yZXN1bHQgPSBjb250ZXh0Tm9kZS5xdWVyeVNlbGVj dG9yQWxsKHNlbGVjdG9yKTsKCQkJdGhpcy5sZW5ndGggPSB0aGlzLnJlc3VsdC5s ZW5ndGg7CgkJfQoKCQlET01RdWVyeS5wcm90b3R5cGUucmVzdWx0VHlwZSA9ICdx dWVyeVNlbGVjdG9yJzsKCQlET01RdWVyeS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rp b24oaW5kZXgpIHsgcmV0dXJuIHRoaXMucmVzdWx0W2luZGV4XTsgfTsKCX0KCWVs c2UgaWYoZG9jdW1lbnQuZXZhbHVhdGUgJiYgZG9jdW1lbnQuaW1wbGVtZW50YXRp b24uaGFzRmVhdHVyZSgneHBhdGgnLCczLjAnKSkgLyogb3VyIG93biB4cGF0aCBp bXBsZW1lbnRhdGlvbiAqLwoJewoJCURPTVF1ZXJ5ID0gZnVuY3Rpb24oc2VsZWN0 b3IsIGNvbnRleHROb2RlLCBucykKCQl7CgkJCWlmKHR5cGVvZiBjb250ZXh0Tm9k ZSA9PSAidW5kZWZpbmVkIikKCQkJCWNvbnRleHROb2RlID0gRE9NUXVlcnkucHJv dG90eXBlLnNjb3BlOwoKCQkJdHJ5CgkJCXsKCQkJCXZhciBvd25lciA9ICcnOwoJ CQkJaWYodHlwZW9mIGNvbnRleHROb2RlLmNvbnRlbnRUeXBlICE9ICd1bmRlZmlu ZWQnKQoJCQkJCW93bmVyID0gY29udGV4dE5vZGUuY29udGVudFR5cGU7CgkJCQll bHNlIGlmIChjb250ZXh0Tm9kZS5vd25lckRvY3VtZW50ICE9IG51bGwgJiYgdHlw ZW9mIGNvbnRleHROb2RlLm93bmVyRG9jdW1lbnQuY29udGVudFR5cGUgIT0gJ3Vu ZGVmaW5lZCcpCgkJCQkJb3duZXIgPSBjb250ZXh0Tm9kZS5vd25lckRvY3VtZW50 LmNvbnRlbnRUeXBlOwoJCQkJZWxzZQoJCQkJCW93bmVyID0gJ3RleHQvaHRtbCc7 CgoJCQkJdmFyIG5hbWVzcGFjZSA9IG5zID8gbnMgOiAoWydhcHBsaWNhdGlvbi94 bWwnLCAnYXBwbGljYXRpb24veGh0bWwreG1sJywgJ3RleHQveG1sJ10uaW5kZXhP Zihvd25lcikgPiAtMSkgPyAnaHRtbDonIDogJyc7CgoJCQkJLyogbmFtZXNwYWNl ID0gJ2h0bWw6JzsgKi8KCgkJCQl2YXIgeHBhdGggPSB0aGlzLmNzc1RvWFBhdGgo c2VsZWN0b3IsIGNvbnRleHROb2RlLCBuYW1lc3BhY2UpOwoKCQkJCXRoaXMucmVz dWx0ID0gZG9jdW1lbnQuZXZhbHVhdGUoeHBhdGgsIGNvbnRleHROb2RlLCB0aGlz Lk5TUmVzb2x2ZXIsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9U WVBFLCBudWxsKTsKCQkJCXRoaXMubGVuZ3RoID0gdGhpcy5yZXN1bHQuc25hcHNo b3RMZW5ndGg7CgkJCX0KCQkJY2F0Y2goZSkKCQkJewoJCQkJaWYgKHNob3dBbGVy dE9uWHBhdGhFcnJvcikKCQkJCQlhbGVydCgnWFBhdGggZXJyb3I6JytzZWxlY3Rv cisnXG4nK3hwYXRoKydcbicrZSk7CgkJCX0KCQl9CgoJCURPTVF1ZXJ5LnByb3Rv dHlwZS5yZXN1bHRUeXBlID0gJ1hQYXRoJzsKCQlET01RdWVyeS5wcm90b3R5cGUu Z2V0ID0gZnVuY3Rpb24oaW5kZXgpIHsgcmV0dXJuIHRoaXMucmVzdWx0LnNuYXBz aG90SXRlbShpbmRleCk7IH07CgoJCURPTVF1ZXJ5LnByb3RvdHlwZS5OU1Jlc29s dmVyID0gZnVuY3Rpb24gKHByZWZpeCkKCQl7CgkJCWlmKHByZWZpeCA9PSAnaHRt bCcpCgkJCXsKCQkJCXJldHVybiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRt bCc7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkgLy90aGlzIHNob3VsZG4ndCBldmVy IGhhcHBlbgoJCQkJcmV0dXJuIG51bGw7CgkJCX0KCQl9OwoKCQlET01RdWVyeS5j YWNoZWRYUGF0aHMgPSBbIHt9LCB7fSBdOwoKCQkvKiB0bnggdG8gaHR0cDovL3d3 dy5qb2VoZXdpdHQuY29tLyAqLwoJCURPTVF1ZXJ5LnByb3RvdHlwZS5jc3NUb1hQ YXRoID0gZnVuY3Rpb24gKHJ1bGUsIGNvbnRleHROb2RlLCBuYW1lc3BhY2UpCgkJ ewoJCQl2YXIgbmFtZXNwYWNlU3BlY2lmaWVkID0gZmFsc2U7CgkJCWlmKG5hbWVz cGFjZSA9PSAndW5kZWZpbmVkJykKCQkJCW5hbWVzcGFjZSA9ICcnOwoJCQlpZihu YW1lc3BhY2UgIT0gIiIpCgkJCQluYW1lc3BhY2VTcGVjaWZpZWQgPSB0cnVlOwoK CQkJdmFyIHhwYXRoID0gRE9NUXVlcnkuY2FjaGVkWFBhdGhzWyBuYW1lc3BhY2VT cGVjaWZpZWQgPyAwIDogMSBdW3J1bGVdOwoKCQkJaWYodHlwZW9mIHhwYXRoID09 ICdzdHJpbmcnKQoJCQl7CgkJCQlyZXR1cm4geHBhdGg7CgkJCX0KCgkJCXZhciBf cnVsZSA9IHJ1bGU7CgoJCQl2YXIgcmVnRWxlbWVudCA9IC9eKFsjLl0/KShbYS16 MC05XFwqXy1dKikoKFx8KShbYS16MC05XFwqXy1dKikpPy9pOwoJCQl2YXIgcmVn QXR0cjEgPSAvXlxbKFteXF1dKilcXS9pOwoJCQl2YXIgcmVnQXR0cjIgPSAvXlxb XHMqKFteXF5cJH4qPVxzXSspXHMqKFtcXlwkfipdPz0pXHMqKFsiXT8pKFteIl0r KVwzXHMqXF0vaTsKCQkJdmFyIHJlZ1BzZXVkbyA9IC9eOihbYS16LV0rKShcKChb Il0/KShbXildKylcM1wpKT8vaTsKCQkJdmFyIHJlZ0NvbWJpbmF0b3IgPSAvXihc cypbPitcc10pPy9pOwoJCQl2YXIgcmVnQ29tbWEgPSAvXlxzKiwvaTsKCgkJCXZh ciBpbmRleCA9IDE7CgkJCXZhciBwYXJ0cyA9IFsiLi8vIiwgIioiXSwgc3VicGFy dHMgPSBbXSwgY29sbGVjdGlvbiA9IFtdOwoJCQl2YXIgbGFzdFJ1bGUgPSBudWxs OwoJCQl2YXIgbGltaXQgPSBmYWxzZTsKCgkJCXdoaWxlIChydWxlLmxlbmd0aCAm JiBydWxlICE9IGxhc3RSdWxlKQoJCQl7CgkJCQlsYXN0UnVsZSA9IHJ1bGU7CgoJ CQkJLy8gVHJpbSBsZWFkaW5nIHdoaXRlc3BhY2UKCQkJCXJ1bGUgPSBydWxlLnJl cGxhY2UoL15ccyp8XHMqJC9nLCIiKTsKCQkJCWlmICghcnVsZS5sZW5ndGgpCgkJ CQkJYnJlYWs7CgoJCQkJc3VicGFydHMgPSBbXTsKCgkJCQkvLyBNYXRjaCB0aGUg ZWxlbWVudCBpZGVudGlmaWVyCgkJCQl2YXIgbSA9IHJlZ0VsZW1lbnQuZXhlYyhy dWxlKTsKCQkJCWlmIChtKQoJCQkJewoJCQkJCWlmICghbVsxXSkKCQkJCQl7CgkJ CQkJCWlmIChtWzVdKQoJCQkJCQkJcGFydHNbaW5kZXhdID0gbmFtZXNwYWNlICsg bVs1XTsKCQkJCQkJZWxzZQoJCQkJCQkJcGFydHNbaW5kZXhdID0gbmFtZXNwYWNl ICsgbVsyXTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAobVsxXSA9PSAnIycpCgkJCQkJ ewoJCQkJCQlzdWJwYXJ0cy5wdXNoKCJAaWQ9JyIgKyBtWzJdICsgIiciKTsKCQkJ CQl9CgkJCQkJZWxzZSBpZiAobVsxXSA9PSAnLicpCgkJCQkJCXN1YnBhcnRzLnB1 c2goImNvbnRhaW5zKGNvbmNhdCgnICcsIEBjbGFzcywgJyAnKSwnICIgKyBtWzJd ICsgIiAnKSIpOwoKCQkJCQlydWxlID0gcnVsZS5zdWJzdHIobVswXS5sZW5ndGgp OwoJCQkJfQoKCQkJCS8vIE1hdGNoIGF0dHJpYnV0ZSBzZWxlY3RvcnMKCQkJCW0g PSByZWdBdHRyMi5leGVjKHJ1bGUpOwoJCQkJaWYgKG0pCgkJCQl7CgkJCQkJc3dp dGNoKG1bMl0pCgkJCQkJewoJCQkJCQljYXNlICcqPSc6IC8qIGNvbnRhaW5zICov CgkJCQkJCQlzdWJwYXJ0cy5wdXNoKCJjb250YWlucyhAIiArIG1bMV0gKyAiLCBc IiIgKyBtWzRdICsgIlwiKSIpOwoJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnfj0n OiAvKiBjb250YWlucyBpbiBzcGFjZS1zZXBhcmF0ZWQgdmFsdWUgKi8KCQkJCQkJ CXN1YnBhcnRzLnB1c2goImNvbnRhaW5zKGNvbmNhdCgnICcsIEAiICsgbVsxXSAr ICIsICcgJyksIFwiICIgKyBtWzRdICsgIiBcIikiKTsKCQkJCQkJYnJlYWs7CgkJ CQkJCWNhc2UgJ3w9JzogLyogaXRzIHZhbHVlIGVpdGhlciBiZWluZyBleGFjdGx5 ICJ2YWwiIG9yIGJlZ2lubmluZyB3aXRoICJ2YWwiIGltbWVkaWF0ZWx5IGZvbGxv d2VkIGJ5ICItIiAgKi8KCQkJCQkJCXN1YnBhcnRzLnB1c2goIkAiICsgbVsxXSAr ICIgPSBcIiIgKyBtWzRdICsgIlwiKSBvciBzdGFydHMtd2l0aChjb25jYXQoQCIg KyBtWzFdICsgIiwgJy0nKSwgXCIiICsgbVs0XSArICJcIikpIik7CgkJCQkJCWJy ZWFrOwoJCQkJCQljYXNlICckPSc6IC8qIGVuZHMgd2l0aCAqLwoJCQkJCQkJLyog bm90IHN1cHBvcnRlZDogaHR0cDovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9k b2NzL1hQYXRoOkZ1bmN0aW9ucyovCgkJCQkJCQkvKnN1YnBhcnRzLnB1c2goImVu ZHMtd2l0aChcIiIrbVs0XSsiXCIsIEAiK21bMV0rIikiKTsqLwoJCQkJCQkJc3Vi cGFydHMucHVzaCgic3Vic3RyaW5nKEAiICsgbVsxXSArICIsIHN0cmluZy1sZW5n dGgoQCIgKyBtWzFdICsgIikgLSAiICsgKG1bNF0ubGVuZ3RoIC0gMSkgKyAiKSA9 IFwiIiArIG1bNF0gKyAiXCIiKTsKCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ149 JzogLyogc3RhcnRzIHdpdGggKi8KCQkJCQkJCXN1YnBhcnRzLnB1c2goInN0YXJ0 cy13aXRoKEAiK21bMV0rIiwgXCIiK21bNF0rIlwiKSIpOwoJCQkJCQlicmVhazsK CQkJCQkJZGVmYXVsdDoKCQkJCQkJCXN1YnBhcnRzLnB1c2goIkAiICsgbVsxXSAr ICI9XCIiICsgbVs0XSArICJcIiIpOwoJCQkJCQlicmVhazsKCQkJCQl9CgoJCQkJ CXJ1bGUgPSBydWxlLnN1YnN0cihtWzBdLmxlbmd0aCk7CgkJCQl9CgkJCQllbHNl CgkJCQl7CgkJCQkJbSA9IHJlZ0F0dHIxLmV4ZWMocnVsZSk7CgkJCQkJaWYgKG0p CgkJCQkJewoJCQkJCQlzdWJwYXJ0cy5wdXNoKCJAIiArIG1bMV0gKyAiIik7CgkJ CQkJCXJ1bGUgPSBydWxlLnN1YnN0cihtWzBdLmxlbmd0aCk7CgkJCQkJfQoJCQkJ fQoKCQkJCW0gPSByZWdQc2V1ZG8uZXhlYyhydWxlKTsKCQkJCXdoaWxlIChtKQoJ CQkJewoJCQkJCXJ1bGUgPSBydWxlLnN1YnN0cihtWzBdLmxlbmd0aCk7CgkJCQkJ LyogcG9zaXRpb24oKSA9PSA1IG9mIHBvc1s1XSA/ICovCgkJCQkJLyogY2hlY2sg bXNkbiEgKi8KCQkJCQlzd2l0Y2gobVsxXSkKCQkJCQl7CgkJCQkJCWNhc2UgJ2Zp cnN0LWNoaWxkJzoKCQkJCQkJCXN1YnBhcnRzLnB1c2goInBvc2l0aW9uKCkgPSAx Iik7CgkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdsYXN0LWNoaWxkJzoKCQkJCQkJ CXN1YnBhcnRzLnB1c2goImxhc3QoKSIpOwoJCQkJCQlicmVhazsKCQkJCQkJY2Fz ZSAnb25seS1jaGlsZCc6CgkJCQkJCQlzdWJwYXJ0cy5wdXNoKCJwb3NpdGlvbigp ID0gMSIpOwoJCQkJCQkJc3VicGFydHMucHVzaCgibGFzdCgpIik7CgkJCQkJCWJy ZWFrOwoJCQkJCQljYXNlICdlbmFibGVkJzoKCQkJCQkJY2FzZSAnZGlzYWJsZWQn OgoJCQkJCQljYXNlICdjaGVja2VkJzoKCQkJCQkJCXN1YnBhcnRzLnB1c2goIkAi ICsgbVsxXSArICIgIT0gXCJcIiIpOwoJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAn ZW1wdHknOgoJCQkJCQkJc3VicGFydHMucHVzaCgiY291bnQoLikgPSAwIik7CgkJ CQkJCWJyZWFrOwoJCQkJCQljYXNlICdsYW5nJzoKCQkJCQkJCXN1YnBhcnRzLnB1 c2goIkBsYW5nPVwiIittWzRdKyJcIiIpOwoJCQkJCQlicmVhazsKCQkJCQkJY2Fz ZSAnY29udGFpbnMnOgoJCQkJCQkJc3VicGFydHMucHVzaCgiY29udGFpbnModGV4 dCgpLCBcIiIrbVs0XSsiXCIpIik7CgkJCQkJCWJyZWFrOwoJCQkJCQkvKiBodHRw Oi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jbnRoLWNoaWxkLXBzZXVk byAqLwoJCQkJCQljYXNlICdudGgtY2hpbGQnOgoKCQkJCQkJCS8qIGxldCBvcDog dGFnbmFtZSBrYW4gb29rIGlldHMgemlqbiBhbHMgJ2h0bWwgZGl2IGJsYTpudGgt Y2hpbGQoMm4rMSknLCBkdXMgJ3BhcmVudCcga2xvcHQgbmlldCEhISEgKi8KCQkJ CQkJCS8qcG9zaXRpb24gaXMgZGFuIG9vayB0b3YgZGl2LCBuaWV0IGJsYSdzIHBh cmVudCAqLwoKCQkJCQkJCXN3aXRjaChtWzRdKQoJCQkJCQkJewoJCQkJCQkJCS8q IHNwZWNpYWwgLyBmcmVxdWVudGx5IHVzZWQgY2FzZXMgKi8KCQkJCQkJCQljYXNl ICdvZGQnOgoJCQkJCQkJCWNhc2UgJzJuKzEnOgoJCQkJCQkJCQlzdWJwYXJ0cy5w dXNoKCJwb3NpdGlvbigpIG1vZCAyID4gMCIpOwoJCQkJCQkJCQlicmVhazsKCQkJ CQkJCQljYXNlICdldmVuJzoKCQkJCQkJCQljYXNlICcybic6CgkJCQkJCQkJY2Fz ZSAnMm4rMCc6CgkJCQkJCQkJCXN1YnBhcnRzLnB1c2goInBvc2l0aW9uKCkgbW9k IDIgPSAwIik7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCS8qIElmIGJvdGggYSBh bmQgYiBhcmUgZXF1YWwgdG8gemVybywgdGhlIHBzZXVkby1jbGFzcyByZXByZXNl bnRzIG5vIGVsZW1lbnQgaW4gdGhlIGRvY3VtZW50IHRyZWUuIC4qLwoJCQkJCQkJ CWNhc2UgJzBuKzAnOgoJCQkJCQkJCQlzdWJwYXJ0cy5wdXNoKCJmYWxzZSgpIik7 CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCWRlZmF1bHQ6CgkJCQkJCQkJCXZhciBm b3VuZDsKCQkJCQkJCQkJLyogV2hlbiBhPTAsIG5vIHJlcGVhdGluZyBpcyB1c2Vk LCBzbyBmb3IgZXhhbXBsZSA6bnRoLWNoaWxkKDBuKzUpIG1hdGNoZXMgb25seSB0 aGUgZmlmdGggY2hpbGQuICovCgkJCQkJCQkJCWlmKGZvdW5kID0gbVs0XS5tYXRj aCgvXigwblwrKT8oWzAtOV0rKSQvKSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJc3Vi cGFydHMucHVzaCgicG9zaXRpb24oKSA9ICIgKyBmb3VuZFsyXSk7CgkJCQkJCQkJ CX0KCQkJCQkJCQkJLyogV2hlbiBhPTEsIHRoZSBudW1iZXIgbWF5IGJlIG9taXR0 ZWQgZnJvbSB0aGUgcnVsZS4gKi8KCQkJCQkJCQkJZWxzZSBpZihmb3VuZCA9IG1b NF0ubWF0Y2goL14oXnwxKW4kLykpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCTsKCQkJ CQkJCQkJfQoJCQkJCQkJCQkvKiBJZiBiPTAsIHRoZW4gZXZlcnkgYXRoIGVsZW1l bnQgaXMgcGlja2VkLiBJbiBzdWNoIGEgY2FzZSwgdGhlIGIgcGFydCBtYXkgYmUg b21pdHRlZC4gKi8KCQkJCQkJCQkJZWxzZSBpZihmb3VuZCA9IG1bNF0ubWF0Y2go L14oWzAtOV0rKW4oXCswfCQpJC8pKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQlzdWJw YXJ0cy5wdXNoKCJwb3NpdGlvbigpIG1vZCAiICsgZm91bmRbMV0gKyAiID0gMCIp OwoJCQkJCQkJCQl9CgkJCQkJCQkJCS8qIFRoZSB2YWx1ZSBhIGNhbiBiZSBuZWdh dGl2ZSAgKi8KCQkJCQkJCQkJZWxzZSBpZihmb3VuZCA9IG1bNF0ubWF0Y2goL14t blwrKFswLTldKykkLykpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXN1YnBhcnRzLnB1 c2goInBvc2l0aW9uKCkgPD0gIiArIGZvdW5kWzFdKTsKCQkJCQkJCQkJfQoJCQkJ CQkJCQkvKiB0aGlzIG1hdGNoZXMgdGhlIGJ0aCBjaGlsZCBvZiBhbiBlbGVtZW50 IGFmdGVyIGFsbCB0aGUgY2hpbGRyZW4gaGF2ZSBiZWVuIHNwbGl0IGludG8gZ3Jv dXBzIG9mIGEgZWxlbWVudHMgZWFjaC4gKi8KCQkJCQkJCQkJZWxzZSBpZihmb3Vu ZCA9IG1bNF0ubWF0Y2goL14oWzAtOV0rKW4oWystXSkoWzAtOV0rKSQvKSkKCQkJ CQkJCQkJewoJCQkJCQkJCQkJc3VicGFydHMucHVzaCgicG9zaXRpb24oKSA9IGZs b29yKGxlbmd0aCguLi9UQUdOQU1FKS8iICsgZm91bmRbMV0gKyAiKSAqICIgKyBm b3VuZFsxXSArICIgIiArIGZvdW5kWzJdICsgIiAiICsgZm91bmRbM10gKTsKCQkJ CQkJCQkJfQoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCXsKCQkJCQkJCQkJCS8qdGhy b3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCBudGgtY2hpbGQgc2VsZWN0b3I6ICIr IG1bNF07KSovCgkJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJ CQljYXNlICd0YXJnZXQnOgoJCQkJCQkJLyogc2hvdWxkIHJlYWQgY3VycmVudCBh bmNob3IgYW5kIGZpbmQgbWF0Y2hpbmcgZWxlbWVudCAqLwoJCQkJCQljYXNlICdo b3Zlcic6CgkJCQkJCWNhc2UgJ3Jvb3QnOgoJCQkJCQkJLyogdW5zdXBwb3J0ZWQg YXRtIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvY3NzL3Jvb3QuaHRtbCAqLwoJ CQkJCQlkZWZhdWx0OgoJCQkJCQkJdGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRl ZCBwc2V1ZG8gY2xhc3M6ICIrIG1bMV0pOwoJCQkJCQlicmVhazsKCQkJCQl9CgoJ CQkJCW0gPSByZWdQc2V1ZG8uZXhlYyhydWxlKTsKCQkJCX0KCgkJCQlpZihzdWJw YXJ0cy5sZW5ndGggPiAwKQoJCQkJewoJCQkJCXBhcnRzLnB1c2goJ1snICsgc3Vi cGFydHMuam9pbigiIGFuZCAiKSArICddJyk7CgkJCQl9CgoJCQkJLy8gTWF0Y2gg Y29tYmluYXRvcnMKCQkJCW0gPSByZWdDb21iaW5hdG9yLmV4ZWMocnVsZSk7CgkJ CQlpZiAobSAmJiBtWzBdLmxlbmd0aCkKCQkJCXsKCQkgICAgICAgICAgICBpZihs aW1pdCkKCQkgICAgICAgICB7CgkJICAgICAgICAgICAgIHBhcnRzLnB1c2gobGlt aXQpOwoJCSAgICAgICAgICAgICBsaW1pdCA9IGZhbHNlOwoJCSAgICAgICAgICAg IH0KCgkJCQkJaWYgKG1bMF0uaW5kZXhPZigiPiIpICE9IC0xKQoJCQkJCXsKCQkJ CQkJcGFydHMucHVzaCgiLyIpOwoJCQkJCX0KCQkJCQllbHNlIGlmIChtWzBdLmlu ZGV4T2YoIisiKSAhPSAtMSkKCQkJCQl7CgkJCQkJCXBhcnRzLnB1c2goIi9mb2xs b3dpbmctc2libGluZzo6Iik7CgkJCQkJCS8vIGZvbGxvd2luZy1zaWJsaW5nIHNl bGVjdHMgYWxsIGZvbGxvd2luZyBzaWJsaW5ncywgd2UgbmVlZCBvbmx5IHRoZSBm aXJzdCBuZXh0IHNpYmxpbmcKCQkJCQkJbGltaXQgPSAnWzFdJzsKCQkJCQl9CgkJ CQkJZWxzZQoJCQkJCXsKCQkJCQkJcGFydHMucHVzaCgiLy8iKTsKCQkJCQl9CgoJ CQkJCWluZGV4ID0gcGFydHMubGVuZ3RoOwoJCQkJCXBhcnRzLnB1c2goIioiKTsK CQkJCQlydWxlID0gcnVsZS5zdWJzdHIobVswXS5sZW5ndGgpOwoJCQkJfQoKCQkJ CW0gPSByZWdDb21tYS5leGVjKHJ1bGUpOwoJCQkJaWYgKG0pCgkJCQl7CgkJCQkJ aWYobGltaXQpCgkJCQkJewoJCQkJCQlwYXJ0cy5wdXNoKGxpbWl0KTsKCQkJCQkJ bGltaXQgPSBmYWxzZTsKCQkJCQl9CgoJCQkJCWNvbGxlY3Rpb24ucHVzaCggcGFy dHMuam9pbigiIikgKTsKCgkJCQkJcGFydHMgPSBbIi4vLyIsICIqIl07CgoJCQkJ CWluZGV4ID0gcGFydHMubGVuZ3RoLTE7CgkJCQkJcnVsZSA9IHJ1bGUuc3Vic3Ry KG1bMF0ubGVuZ3RoKTsKCQkJCX0KCQkJfQoKCQkgICAgaWYobGltaXQpCgkJCQlw YXJ0cy5wdXNoKGxpbWl0KTsKCgkJCWNvbGxlY3Rpb24ucHVzaCggcGFydHMuam9p bigiIikgKTsKCgkJCXhwYXRoID0gY29sbGVjdGlvbi5qb2luKCIgfCAiKTsKCgkJ CURPTVF1ZXJ5LmNhY2hlZFhQYXRoc1sgbmFtZXNwYWNlU3BlY2lmaWVkID8gMCA6 IDEgXVtfcnVsZV0gPSB4cGF0aDsKCgkJCS8qRE9NUXVlcnkuc3RvcmVDYWNoZWRY UGF0aHMoKTsqLwoKCQkJcmV0dXJuIHhwYXRoOwoJCX07CgoJCURPTVF1ZXJ5Lmhh c1hQYXRoID0gdHJ1ZTsKCX0KCWVsc2UgaWYodHlwZW9mIEVsZW1lbnQgIT0gJ3Vu ZGVmaW5lZCcgJiYgRWxlbWVudCAmJiB0eXBlb2YgRWxlbWVudC5nZXRFbGVtZW50 c0J5U2VsZWN0b3IgIT0gJ3VuZGVmaW5lZCcgJiYgRWxlbWVudC5nZXRFbGVtZW50 c0J5U2VsZWN0b3IpIC8qIHByb3RvdHlwZSAqLwoJewoJCURPTVF1ZXJ5ID0gZnVu Y3Rpb24oc2VsZWN0b3IsIGNvbnRleHROb2RlLCBucykKCQl7CgkJCWlmKHR5cGVv ZiBjb250ZXh0Tm9kZSA9PSAidW5kZWZpbmVkIikKCQkJCWNvbnRleHROb2RlID0g RE9NUXVlcnkucHJvdG90eXBlLnNjb3BlOwoKCQkJLyogcHJvdG90eXBlJ3MgaGln aGVzdCBwb2ludCB3aGVyZSBnZXRFbGVtZW50c0J5U2VsZWN0b3IgaXMgdG8gYmUg Zm91bmQgaXMuLi4gKi8KCQkJaWYoY29udGV4dE5vZGUgPT0gZG9jdW1lbnQpCgkJ CQljb250ZXh0Tm9kZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCgkJCXRy eQoJCQl7CgkJCQl0aGlzLnJlc3VsdCA9ICQoY29udGV4dE5vZGUpLmdldEVsZW1l bnRzQnlTZWxlY3Rvci5hcHBseSgkKGNvbnRleHROb2RlKSwgc2VsZWN0b3Iuc3Bs aXQoJywnKSApOwoJCQl9CgkJCWNhdGNoKGUpCgkJCXsKCQkJCXRoaXMucmVzdWx0 ID0gW107CgkJCQl0aGlzLmxlbmd0aCA9IDA7CgkJCQl0aHJvdyBlOwoJCQl9CgkJ CXRoaXMubGVuZ3RoID0gdGhpcy5yZXN1bHQubGVuZ3RoOwoJCX0KCgkJRE9NUXVl cnkucHJvdG90eXBlLnJlc3VsdFR5cGUgPSAnZ2V0RWxlbWVudHNCeVNlbGVjdG9y JzsKCQlET01RdWVyeS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oaW5kZXgpIHsg cmV0dXJuIHRoaXMucmVzdWx0W2luZGV4XTsgfTsKCX0KCWVsc2UgaWYodHlwZW9m IGpRdWVyeSAhPSAndW5kZWZpbmVkJykgLyoganF1ZXJ5ICovCgl7CgkJRE9NUXVl cnkgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dE5vZGUsIG5zKQoJCXsKCQkJ aWYodHlwZW9mIGNvbnRleHROb2RlID09ICJ1bmRlZmluZWQiKQoJCQkJY29udGV4 dE5vZGUgPSBET01RdWVyeS5wcm90b3R5cGUuc2NvcGU7CgoJCQl0aGlzLnJlc3Vs dCA9IGpRdWVyeShzZWxlY3RvciwgY29udGV4dE5vZGUpOwoJCQl0aGlzLmxlbmd0 aCA9IHRoaXMucmVzdWx0LnNpemUoKTsKCQl9CgoJCURPTVF1ZXJ5LnByb3RvdHlw ZS5yZXN1bHRUeXBlID0gJ2pRdWVyeSc7CgkJRE9NUXVlcnkucHJvdG90eXBlLmdl dCA9IGZ1bmN0aW9uKGluZGV4KSB7IHJldHVybiB0aGlzLnJlc3VsdFtpbmRleF07 IH07Cgl9CgllbHNlIGlmKHR5cGVvZiBjc3NRdWVyeSAhPSAndW5kZWZpbmVkJykg LyogZGVhbiBlZHdhcmQncyBjc3NxdWVyeSAqLwoJewoJCURPTVF1ZXJ5ID0gZnVu Y3Rpb24oc2VsZWN0b3IsIGNvbnRleHROb2RlLCBucykKCQl7CgkJCWlmKHR5cGVv ZiBjb250ZXh0Tm9kZSA9PSAidW5kZWZpbmVkIikKCQkJCWNvbnRleHROb2RlID0g RE9NUXVlcnkucHJvdG90eXBlLnNjb3BlOwoKCQkJdGhpcy5yZXN1bHQgPSBjc3NR dWVyeShzZWxlY3RvciwgY29udGV4dE5vZGUpOwoJCQl0aGlzLmxlbmd0aCA9IHRo aXMucmVzdWx0Lmxlbmd0aDsKCQl9CgoJCURPTVF1ZXJ5LnByb3RvdHlwZS5yZXN1 bHRUeXBlID0gJ2Nzc1F1ZXJ5JzsKCQlET01RdWVyeS5wcm90b3R5cGUuZ2V0ID0g ZnVuY3Rpb24oaW5kZXgpIHsgcmV0dXJuIHRoaXMucmVzdWx0W2luZGV4XTsgfTsK CX0KCglpZih0eXBlb2YgRE9NUXVlcnkgPT0gJ3VuZGVmaW5lZCcpCgkJdGhyb3cg Ik5vIERPTVF1ZXJ5IGhhbmRsZXIgZm91bmQuIjsKCglET01RdWVyeS5wcm90b3R5 cGUuc2NvcGUgPSBkb2N1bWVudDsKCglyZXR1cm4gRE9NUXVlcnk7Cn0oKTsKCmZ1 bmN0aW9uIGdldFRhcmdldHModGFyZ2V0cywgZGVmYXVsdERPTVF1ZXJ5KQp7Cglp Zih0YXJnZXRzKQoJewoJCWlmKHR5cGVvZiB0YXJnZXRzID09ICdzdHJpbmcnKQoJ CQlyZXR1cm4gbmV3IERPTVF1ZXJ5KHRhcmdldHMpOwoJCWVsc2UKCQkJcmV0dXJu IHRhcmdldHM7Cgl9CgllbHNlCgl7CgkJaWYodHlwZW9mIGRlZmF1bHRET01RdWVy eSA9PSAnc3RyaW5nJykKCQkJcmV0dXJuIG5ldyBET01RdWVyeShkZWZhdWx0RE9N UXVlcnkpOwoJCWVsc2UKCQkJcmV0dXJuIGRlZmF1bHRET01RdWVyeTsKCX0KCgly ZXR1cm4gbmV3IERPTVF1ZXJ5KCcnKTsKfTsKCmZ1bmN0aW9uIGFkZENsYXNzVG9U YXJnZXRzKHF1ZXJ5LCBjbGFzc25hbWUsIGNvbnRleHROb2RlKQp7Cgl2YXIgaXRl bXMgPSBuZXcgRE9NUXVlcnkocXVlcnksIGNvbnRleHROb2RlKTsKCglmb3IodmFy IGk9MCwgaXRlbTsgKGl0ZW09aXRlbXMuZ2V0KGkpKTsgaSsrKQoJewoJCWpzY3Nz KCdhZGQnLCBpdGVtLCBjbGFzc25hbWUsICcnKTsKCX0KfTsKCmZ1bmN0aW9uIGFk ZEV2ZW50VG9UYXJnZXRzKHRhcmdldHMsIHR5cGUsIGhhbmRsZXIsIGRlZmF1bHRE T01RdWVyeSkKewoJdmFyIGVsZW1lbnRzID0gZ2V0VGFyZ2V0cyh0YXJnZXRzLCBk ZWZhdWx0RE9NUXVlcnkpLCBlbDsKCglmb3IodmFyIGk9MDsoZWw9ZWxlbWVudHMu Z2V0KGkpKTtpKyspCgl7CgkJYWRkRXZlbnQoZWwsIHR5cGUsIGhhbmRsZXIpOwoJ fQoKCXJldHVybiBlbGVtZW50czsKfTsKCi8vIHdyaXR0ZW4gYnkgRGVhbiBFZHdh cmRzLCAyMDA1Ci8vIHdpdGggaW5wdXQgZnJvbSBUaW5vIFppamRlbCAtIGNyaXNw QHhzNGFsbC5ubAovLyBodHRwOi8vZGVhbi5lZHdhcmRzLm5hbWUvd2VibG9nLzIw MDUvMTAvYWRkLWV2ZW50LwpmdW5jdGlvbiBhZGRFdmVudChlbGVtZW50LCB0eXBl LCBoYW5kbGVyKQp7CglpZiAoZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKSB7CgkJ ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGFyZ3VtZW50 cy5jYWxsZWUuZXZlbnRMaXN0ZW5lclVzZUNhcHR1cmUpOwoJfQoJZWxzZQoJewoJ CWlmICghaGFuZGxlci4kJGd1aWQpIGhhbmRsZXIuJCRndWlkID0gYWRkRXZlbnQu Z3VpZCsrOwoJCWlmICghZWxlbWVudC5ldmVudHMpIGVsZW1lbnQuZXZlbnRzID0g e307CgkJdmFyIGhhbmRsZXJzID0gZWxlbWVudC5ldmVudHNbdHlwZV07CgkJaWYg KCFoYW5kbGVycykKCQl7CgkJCWhhbmRsZXJzID0gZWxlbWVudC5ldmVudHNbdHlw ZV0gPSB7fTsKCQkJaWYgKGVsZW1lbnRbJ29uJyArIHR5cGVdKSBoYW5kbGVyc1sw XSA9IGVsZW1lbnRbJ29uJyArIHR5cGVdOwoJCQllbGVtZW50WydvbicgKyB0eXBl XSA9IGhhbmRsZUV2ZW50OwoJCX0KCgkJaGFuZGxlcnNbaGFuZGxlci4kJGd1aWRd ID0gaGFuZGxlcjsKCX0KfQphZGRFdmVudC5ndWlkID0gMTsKYWRkRXZlbnQuZXZl bnRMaXN0ZW5lclVzZUNhcHR1cmUgPSBmYWxzZTsKCmZ1bmN0aW9uIHJlbW92ZUV2 ZW50KGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIpCnsKCWlmIChlbGVtZW50LnJlbW92 ZUV2ZW50TGlzdGVuZXIpCgkJZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5 cGUsIGhhbmRsZXIsIGZhbHNlKTsKCWVsc2UgaWYgKGVsZW1lbnQuZXZlbnRzICYm IGVsZW1lbnQuZXZlbnRzW3R5cGVdICYmIGhhbmRsZXIuJCRndWlkKQoJCWRlbGV0 ZSBlbGVtZW50LmV2ZW50c1t0eXBlXVtoYW5kbGVyLiQkZ3VpZF07Cn07CgpmdW5j dGlvbiByZW1vdmVFdmVudEZyb21UYXJnZXRzKHRhcmdldHMsIHR5cGUsIGhhbmRs ZXIsIGRlZmF1bHRET01RdWVyeSkKewoJdmFyIGVsZW1lbnRzID0gZ2V0VGFyZ2V0 cyh0YXJnZXRzLCBkZWZhdWx0RE9NUXVlcnkpLCBlbDsKCglmb3IodmFyIGk9MDso ZWw9ZWxlbWVudHMuZ2V0KGkpKTtpKyspCgkJcmVtb3ZlRXZlbnQoZWwsIHR5cGUs IGhhbmRsZXIpOwp9OwoKZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpCnsKCWV2 ZW50ID0gZXZlbnQgfHwgZml4RXZlbnQod2luZG93LmV2ZW50KTsKCXZhciByZXR1 cm5WYWx1ZSA9IHRydWU7Cgl2YXIgaGFuZGxlcnMgPSB0aGlzLmV2ZW50c1tldmVu dC50eXBlXTsKCglmb3IgKHZhciBpIGluIGhhbmRsZXJzKQoJewoJCWlmICghT2Jq ZWN0LnByb3RvdHlwZVtpXSkKCQl7CgkJCXRoaXMuJCRoYW5kbGVyID0gaGFuZGxl cnNbaV07CgkJCWlmICh0aGlzLiQkaGFuZGxlcihldmVudCkgPT09IGZhbHNlKSBy ZXR1cm5WYWx1ZSA9IGZhbHNlOwoJCX0KCX0KCglpZiAodGhpcy4kJGhhbmRsZXIp IHRoaXMuJCRoYW5kbGVyID0gbnVsbDsKCglyZXR1cm4gcmV0dXJuVmFsdWU7Cn07 CgpmdW5jdGlvbiBmaXhFdmVudChldmVudCkKewoJZXZlbnQucHJldmVudERlZmF1 bHQgPSBmaXhFdmVudC5wcmV2ZW50RGVmYXVsdDsKCWV2ZW50LnN0b3BQcm9wYWdh dGlvbiA9IGZpeEV2ZW50LnN0b3BQcm9wYWdhdGlvbjsKCXJldHVybiBldmVudDsK fQoKZml4RXZlbnQucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpCnsKCXRoaXMu cmV0dXJuVmFsdWUgPSBmYWxzZTsKfTsKCmZpeEV2ZW50LnN0b3BQcm9wYWdhdGlv biA9IGZ1bmN0aW9uKCkKewoJdGhpcy5jYW5jZWxCdWJibGUgPSB0cnVlOwp9OwoK Ly8gVGhpcyBsaXR0bGUgc25pcHBldCBmaXhlcyB0aGUgcHJvYmxlbSB0aGF0IHRo ZSBvbmxvYWQgYXR0cmlidXRlIG9uIHRoZSBib2R5LWVsZW1lbnQgd2lsbCBvdmVy d3JpdGUKLy8gcHJldmlvdXMgYXR0YWNoZWQgZXZlbnRzIG9uIHRoZSB3aW5kb3cg b2JqZWN0IGZvciB0aGUgb25sb2FkIGV2ZW50CmlmICghd2luZG93LmFkZEV2ZW50 TGlzdGVuZXIpCnsKCWRvY3VtZW50Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0 aW9uKCkKCXsKCQlpZiAod2luZG93Lm9ubG9hZCAmJiB3aW5kb3cub25sb2FkICE9 IGhhbmRsZUV2ZW50KQoJCXsKCQkJYWRkRXZlbnQod2luZG93LCAnbG9hZCcsIHdp bmRvdy5vbmxvYWQpOwoJCQl3aW5kb3cub25sb2FkID0gaGFuZGxlRXZlbnQ7CgkJ fQoJfTsKfTsKCmZ1bmN0aW9uIGdldE9iaihldiwgb2IpCnsKCWlmKCFvYikKCXsK CQl2YXIgdGFyZzsKCQlpZiAoIWV2KSBldiA9IHdpbmRvdy5ldmVudDsKCgkJaWYg KGV2LnRhcmdldCkgdGFyZyA9IGV2LnRhcmdldDsKCQllbHNlIGlmIChldi5zcmNF bGVtZW50KSB0YXJnID0gZXYuc3JjRWxlbWVudDsKCgkJaWYgKHRhcmcgJiYgdGFy Zy5ub2RlVHlwZSA9PSAzKSAvLyBkZWZlYXQgU2FmYXJpIGJ1ZwoJCQl0YXJnID0g dGFyZy5wYXJlbnROb2RlOwoKCQlyZXR1cm4gdGFyZzsKCX0KCWVsc2UKCXsKCQly ZXR1cm4gb2I7Cgl9Cn07CgpmdW5jdGlvbiBsb2FkU2NyaXB0KHVybCwgcHJlcGVu ZEJvYXJkVXJsKQp7CglpZihwcmVwZW5kQm9hcmRVcmwpCgkJdXJsID0gYm9hcmRf dGVtcGxhdGVfdXJsICsgdXJsOwoKCXZhciBlID0gY3JlYXRlRE9NTm9kZSgnc2Ny aXB0JywgeyJ0eXBlIiA6ICd0ZXh0L2phdmFzY3JpcHQnLCAic3JjIiA6IHVybH0s IFtdKTsKCglkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBd LmFwcGVuZENoaWxkKGUpOwp9OwoKZnVuY3Rpb24gY3VycmVudFN0eWxlKGVsZW1l bnQsIHByb3BlcnR5KQp7CglyZXR1cm4gcGFyc2VJbnQod2luZG93LmdldENvbXB1 dGVkU3R5bGUgPyB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCcnKS5n ZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSA6IGVsZW1lbnQuY3VycmVudFN0eWxl LmdldEF0dHJpYnV0ZShwcm9wZXJ0eSkpOwp9OwoKZnVuY3Rpb24gZW1wdHkoKQp7 CglpZih0aGlzICYmIHRoaXMudmFsdWUgPT0gdGhpcy5kZWZhdWx0VmFsdWUgKQoJ ewoJCXRoaXMudmFsdWUgPSAnJzsKCX0KfTsKCmZ1bmN0aW9uIHVuaHRtbHNwZWNp YWxjaGFycyhzdHIpCnsKCXN0ciA9IHN0ci5yZXBsYWNlKC8mYW1wOy9naSwgJyYn KTsKCXN0ciA9IHN0ci5yZXBsYWNlKC8mbHQ7L2dpLCAnPCcpOwoJc3RyID0gc3Ry LnJlcGxhY2UoLyZndDsvZ2ksICc+Jyk7CglyZXR1cm4gc3RyOwp9OwoKLyogdG54 IGNyaXNwICovCmZ1bmN0aW9uIGh0bWxzcGVjaWFsY2hhcnMoaW5wdXQpCnsKCWlu cHV0ID0gaW5wdXQucmVwbGFjZSgvJi9nLCcmYW1wOycpOwoJaW5wdXQgPSBpbnB1 dC5yZXBsYWNlKC8+L2csJyZndDsnKTsKCWlucHV0ID0gaW5wdXQucmVwbGFjZSgv PC9nLCcmbHQ7Jyk7CglpbnB1dCA9IGlucHV0LnJlcGxhY2UoLyIvZywnJnF1b3Q7 Jyk7CgoJLyogIiA8IGZpeCBzeW50YXggaGlnaGxpZ2h0aW5nICovCgoJcmV0dXJu IGlucHV0Owp9OwoKZnVuY3Rpb24gZ2V0Q29va2llKHNOYW1lKQp7Cgl2YXIgYUNv b2tpZSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKSwgaSA9IGFDb29raWUu bGVuZ3RoLCBhQ3J1bWI7Cgl3aGlsZSAoaS0tKQoJewoJCWFDcnVtYiA9IGFDb29r aWVbaV0uc3BsaXQoJz0nKTsKCQlpZiAoc05hbWUgPT0gYUNydW1iWzBdKQoJCQly ZXR1cm4gdHlwZW9mIGFDcnVtYlsxXSAhPSAndW5kZWZpbmVkJz8gdW5lc2NhcGUo YUNydW1iWzFdKSA6IG51bGw7Cgl9CgoJcmV0dXJuIG51bGw7Cn0KCi8qCiAqIEZp bmQgdGhlIG5leHQgc2libGluZyBub2RlIChza2lwcGluZyB0ZXh0IG5vZGVzKSBv ciBhIHNpYmxpbmcgd2l0aCBhIHNwZWNpZmljIHRhZyBuYW1lCiAqLwpmdW5jdGlv biBnZXRTaWJsaW5nTm9kZShzdGFydHBvaW50LCBkaXJlY3Rpb24sIHRhZ05hbWUp CnsKCXZhciBvID0gc3RhcnRwb2ludCwgdGFnRW1wdHkgPSAodGFnTmFtZSA9PSB1 bmRlZmluZWQgfHwgdGFnTmFtZS5sZW5ndGggPT0gMCk7CgoJaWYgKHRhZ05hbWUg IT0gdW5kZWZpbmVkKQoJCXRhZ05hbWUgPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7 CgoJZG8KCXsKCQlpZiAoZGlyZWN0aW9uID09ICdwcmV2aW91cycpCgkJewoJCQlv ID0gby5wcmV2aW91c1NpYmxpbmc7CgkJfQoJCWVsc2UgaWYgKCBkaXJlY3Rpb24g PT0gIm5leHQiICkKCQl7CgkJCW8gPSBvLm5leHRTaWJsaW5nOwoJCX0KCQllbHNl IGlmICggZGlyZWN0aW9uID09ICJ1cCIgKQoJCXsKCQkJbyA9IG8ucGFyZW50Tm9k ZTsKCQl9CgoJCWlmICggbyAmJiBvLm5vZGVUeXBlID09IDEpCgkJewoJCQlpZiAo dGFnRW1wdHkgfHwgby50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gdGFnTmFtZSAp CgkJCQlyZXR1cm4gbzsKCQl9CgoJfSB3aGlsZSAobyk7CgoJcmV0dXJuIG51bGw7 Cn0KCi8qCmV4YW1wbGUgc3ludGF4OgoKdmFyIHRlc3QgPSBjcmVhdGVET01Ob2Rl KCAnZGl2JywgeyJjbGFzcyIgOiAnd2FhJywgImV2ZW50IiA6IFsnY2xpY2snLCBf ZnVuY10gfSwKCQkJWwoJCQkJY3JlYXRlRE9NTm9kZSggJ3NwYW4nLCB7ImNsYXNz IiA6ICd3b2VpJ30sCgkJCQlbCgkJCQkJJ3Nub3RiZXVrZW4nCgkJCQldKSwKCQkJ CSd3YWEnLAoJCQkJMTIzCgkJCV0pOwpjcmVhdGVzOgp0ZXh0ID0gPGRpdiBjbGFz cz0id2FhIj48c3BhbiBjbGFzcz0id29laSI+c25vdGJldWtlbj53YWExMjM8L2Rp dj4KKi8KZnVuY3Rpb24gY3JlYXRlRE9NTm9kZSh0YWduYW1lLCBvcHRpb25zLCBj aGlsZHJlbikKewoJdmFyIG9wdGlvbiwgY2hpbGQsIG1lOwoKCWlmKGlzSUUgJiYg dHlwZW9mIG9wdGlvbnNbJ3R5cGUnXSA9PSAnc3RyaW5nJyAmJiAob3B0aW9uc1sn dHlwZSddID09ICdyYWRpbycgfHwgb3B0aW9uc1sndHlwZSddID09ICdzdWJtaXQn KSkKCXsKCQkvKiBJRSBkb2Vzbid0IGxpa2UgZHluYW1pY2FsbHkgZ2VuZXJhdGVk IFtzXXJhZGlvYnV0dG9uc1svXSBhbnl0aGluZywgc28gd2UgaGF2ZSB0byBzZXQg J25hbWUnIG1hbnVhbGx5ICovCgkJbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50 KAoJCQkJJzxpbnB1dCcgKwoJCQkJJyB0eXBlPSInK29wdGlvbnNbJ3R5cGUnXSAr ICciJyArCgkJCQknIG5hbWU9IicgKyBvcHRpb25zWyduYW1lJ10gKyAnIicgKwoJ CQkJICh0eXBlb2Ygb3B0aW9uc1snY2hlY2tlZCddICE9ICd1bmRlZmluZWQnID8g JyBjaGVja2VkJyA6ICcnKSArCgkJCQknPicKCQkJKTsKCX0KCWVsc2UgaWYodGFn bmFtZSAhPSBudWxsKQoJewoJCW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0 YWduYW1lKTsKCX0KCWVsc2UKCXsKCQltZSA9IGRvY3VtZW50LmNyZWF0ZURvY3Vt ZW50RnJhZ21lbnQoKTsKCX0KCglmb3Iob3B0aW9uIGluIG9wdGlvbnMpCgl7CgkJ aWYoIW9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0aW9uKSkKCQkJY29udGludWU7 CgoJCWlmKG9wdGlvbiA9PSAnZXZlbnQnKQoJCXsKCQkJYWRkRXZlbnQobWUsIG9w dGlvbnNbb3B0aW9uXVswXSwgb3B0aW9uc1tvcHRpb25dWzFdKTsKCQl9CgkJZWxz ZQoJCXsKCQkJaWYgKG9wdGlvbiA9PSAnY2xhc3MnKQoJCQl7CgkJCQltZS5zZXRB dHRyaWJ1dGUoJ2NsYXNzTmFtZScsIG9wdGlvbnNbb3B0aW9uXSk7CgkJCX0KCQkJ ZWxzZSBpZiAob3B0aW9uID09ICdzdHlsZScgJiYgbWUuc3R5bGUuc2V0QXR0cmli dXRlKQoJCQl7CgkJCQltZS5zdHlsZS5zZXRBdHRyaWJ1dGUoJ2Nzc1RleHQnLCBv cHRpb25zW29wdGlvbl0pOwoJCQkJY29udGludWU7CgkJCX0KCgkJCW1lLnNldEF0 dHJpYnV0ZShvcHRpb24sIG9wdGlvbnNbb3B0aW9uXSk7CgkJfQoJfQoKCWZvcih2 YXIgaSA9IDA7IChjaGlsZD1jaGlsZHJlbltpXSk7IGkrKykKCXsKCQlpZiggWyJz dHJpbmciLCAibnVtYmVyIl0uaW5kZXhPZih0eXBlb2YgY2hpbGQpID4gLTEgKQoJ CXsKCQkJY2hpbGQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZCk7CgkJ fQoJCW1lLmFwcGVuZENoaWxkKGNoaWxkKTsKCX0KCglyZXR1cm4gbWU7Cn07Cgpm dW5jdGlvbiBzZXRDb29raWUoc05hbWUsIHNWYWx1ZSkKewoJZG9jdW1lbnQuY29v a2llID0gc05hbWUgKyAnPScgKyBlc2NhcGUoc1ZhbHVlKSArICc7IGV4cGlyZXM9 RnJpLCAzMSBEZWMgMjA5OSAyMzo1OTo1OSBHTVQ7IHBhdGg9Lyc7Cn0KCi8vIHRy YW5zcGFyYW50UE5HIC0gQmFzZWQgb24gaHR0cDovL3d3dy5zY2hpbGxtYW5pYS5j b20vcHJvamVjdHMvcG5nLyBidXQgdmVyeSBtdWNoIGNvbXBsZXRlbHkgcmV3cml0 dGVuCi8vIEFwcGx5IGEgZmlsdGVyIGluIElFIHRvIG1ha2UgcG5nJ3MgKGJvdGgg aW1hZ2VzIGFuZCBiYWNrZ3JvdW5kLWltYWdlcykgdHJhbnNwYXJhbnQKZnVuY3Rp b24gdHJhbnNwYXJhbnRQTkcodGFyZ2V0cywgc2NhbGluZ01ldGhvZCkKewoJaWYg KCFpc0lFIHx8ICFpc1dpbiB8fCAhaXNOb3RJRTcpCgkJcmV0dXJuOwoKCWlmKCFz Y2FsaW5nTWV0aG9kKQoJCXZhciBzY2FsaW5nTWV0aG9kID0gJ2ltYWdlJzsKCgkv LyBIZXJlIHlvdSBjYW4gZGVjaWRlIHdoaWNoIGVsZW1lbnRzIHRvIHNlYXJjaCBm b3IgcG5nJ3MgKHlvdSBjYW4gdXNlICogYnV0IHRoYXQgd2lsbCBiZSB2ZXJ5IHNs b3cpCgl2YXIgZWxlbWVudHMgPSBnZXRUYXJnZXRzKHRhcmdldHMsICcudHJhbnNw YXJhbnRQTkcnKTsKCXZhciBpbWFnZXNvdXJjZTsKCglmb3IgKHZhciBpPTAsIG9i amVjdDsgKG9iamVjdD1lbGVtZW50cy5nZXQoaSkpOyBpKyspCgl7CgkJaWYgKG9i amVjdC5nZXRBdHRyaWJ1dGUoJ3NyYycpKQoJCXsKCQkJaW1hZ2Vzb3VyY2UgPSBv YmplY3QuZ2V0QXR0cmlidXRlKCdzcmMnKTsKCQkJb2JqZWN0LnNyYyA9IGJvYXJk X3RlbXBsYXRlX3VybCArICdpbWcvbGF5b3V0L2llZml4L3RyYW5zcGFyYW50UE5H LmdpZic7CgkJfQoJCWVsc2UgaWYgKG9iamVjdC5jdXJyZW50U3R5bGUuYmFja2dy b3VuZEltYWdlLnRvU3RyaW5nKCkgJiYgb2JqZWN0LmN1cnJlbnRTdHlsZS5iYWNr Z3JvdW5kSW1hZ2UudG9TdHJpbmcoKSAhPSAibm9uZSIpCgkJewoJCQl2YXIgY3Nz QmFja2dyb3VuZCA9IG9iamVjdC5jdXJyZW50U3R5bGUuYmFja2dyb3VuZEltYWdl LnRvU3RyaW5nKCk7CgkJCXZhciBqID0gY3NzQmFja2dyb3VuZC5pbmRleE9mKCd1 cmwoIicpKzU7CgkJCWltYWdlc291cmNlID0gY3NzQmFja2dyb3VuZC5zdWJzdHIo aixjc3NCYWNrZ3JvdW5kLmxlbmd0aC1qLTIpOwoJCQlvYmplY3Quc3R5bGUuYmFj a2dyb3VuZEltYWdlID0gJ25vbmUnOwoJCX0KCQllbHNlCgkJCWNvbnRpbnVlOwoK CQlvYmplY3Quc3R5bGUud3JpdGluZ01vZGUgPSAnbHItdGInOwoJCW9iamVjdC5z dHlsZS5maWx0ZXIgPSAicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0 LkFscGhhSW1hZ2VMb2FkZXIoc3JjPSciK2ltYWdlc291cmNlKyInLHNpemluZ01l dGhvZD0nIiArIHNjYWxpbmdNZXRob2QgKyAiJykiOwoKCQlvYmplY3Quc3R5bGUu Ym9yZGVyID0gJzAnOwoJfQp9Cgp2YXIgdGV4dHMgPSBuZXcgQXJyYXkoKTsKZnVu Y3Rpb24gZ2V0VGV4dChhLCBiLCBjKQp7CglpZih0eXBlb2YgdGV4dHNbYV0gPT0g J3VuZGVmaW5lZCcgfHwgdHlwZW9mIHRleHRzW2FdW2JdID09ICd1bmRlZmluZWQn IHx8ICF0ZXh0c1thXVtiXSApCgkJcmV0dXJuICdbdGV4dCBub3QgZm91bmQ6ICcr YSsnOjonK2IrJ10nOwoKCWlmICggYyApCgkJcmV0dXJuIHRleHRzW2FdW2JdLnJl cGxhY2UoJyVzJyxjKTsKCWVsc2UKCQlyZXR1cm4gdGV4dHNbYV1bYl07Cn0KCi8v IERlYW4gRWR3YXJkcy9NYXR0aGlhcyBNaWxsZXIvSm9obiBSZXNpZwovKiBodHRw Oi8vZGVhbi5lZHdhcmRzLm5hbWUvd2VibG9nLzIwMDYvMDYvYWdhaW4vICovCmZ1 bmN0aW9uIGluaXQoKQp7CgkvLyBxdWl0IGlmIHRoaXMgZnVuY3Rpb24gaGFzIGFs cmVhZHkgYmVlbiBjYWxsZWQKCWlmIChhcmd1bWVudHMuY2FsbGVlLmRvbmUpCgkJ cmV0dXJuOwoKCS8vIGZsYWcgdGhpcyBmdW5jdGlvbiBzbyB3ZSBkb24ndCBkbyB0 aGUgc2FtZSB0aGluZyB0d2ljZQoJYXJndW1lbnRzLmNhbGxlZS5kb25lID0gdHJ1 ZTsKCgkvLyBraWxsIHRoZSB0aW1lcgoJaWYgKF90aW1lcikKCQljbGVhckludGVy dmFsKF90aW1lcik7CgoJX2luaXQoZXZlbnRzKTsKfTsKCmZ1bmN0aW9uIHJhbmQg KCBuICkKewoJcmV0dXJuICggTWF0aC5mbG9vciAoIE1hdGgucmFuZG9tICggKSAq IG4gKyAxICkgKTsKfQoKdmFyIHRpbWluZ3MgPSBbXTsKdmFyIGV2ZW50VGltaW5n ID0gZmFsc2U7CgppZiAodHlwZW9mIHNob3dBbGVydE9uWHBhdGhFcnJvciA9PSAi dW5kZWZpbmVkIikKCXZhciBzaG93QWxlcnRPblhwYXRoRXJyb3IgPSBmYWxzZTsK CnZhciBpc0lFLCBpc05vdElFNywgaXNHZWNrbywgaXNXZWJLaXQsIGlzV2luOwoK ZnVuY3Rpb24gX2luaXQoZXZlbnRzLCBzY29wZSkKewoJaWYoIWRvY3VtZW50LmJv ZHkpCgkJcmV0dXJuOwoKCXZhciB0aW1lMSwgdGltZTIsIGZ1bmNuYW1lOwoJdmFy IGZ1bmNQYXR0ZXJuID0gL2Z1bmN0aW9uIChbYS16QS1aXSspLywgdG90YWwgPSAw LCBkdXJhdGlvbiA9IDA7CgoJaWYoIWFyZ3VtZW50cy5jYWxsZWUuaW5pdGFsSW5p dCkKCXsKCQlpc0lFID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lF JykgIT0gLTEgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdPcGVyYScp ID09IC0xOwoJCWlzTm90SUU3ID0gaXNJRSAmJiBuYXZpZ2F0b3IudXNlckFnZW50 LmluZGV4T2YoJ01TSUUgNy4wJykgPT0gLTE7CgkJaXNHZWNrbyA9IG5hdmlnYXRv ci51c2VyQWdlbnQuaW5kZXhPZignR2Vja28nKSAhPSAtMTsKCQlpc1dlYktpdCA9 IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignV2ViS2l0JykgIT0gLTE7CgkJ aXNXaW4gPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1dpbmRvd3MnKSAh PSAtMTsKCQlqc2NzcygnYWRkJywgZG9jdW1lbnQuYm9keSwgJ2phdmFzY3JpcHQn LCAnJyk7CgoJCWFyZ3VtZW50cy5jYWxsZWUuaW5pdGFsSW5pdCA9IHRydWU7Cgl9 CgoJaWYoc2NvcGUpCgl7CgkJdmFyIHByZXZpb3VzU2NvcGUgPSBET01RdWVyeS5w cm90b3R5cGUuc2NvcGU7CgkJRE9NUXVlcnkucHJvdG90eXBlLnNjb3BlID0gc2Nv cGU7Cgl9CgoJZm9yKHZhciBpPTA7IGk8ZXZlbnRzLmxlbmd0aDsgaSsrKQoJewoJ CXRyeQoJCXsKCQkJaWYoZXZlbnRUaW1pbmcpCgkJCXsKCQkJCWZ1bmNuYW1lID0g ZXZlbnRzW2ldLnRvU3RyaW5nKCkubWF0Y2goZnVuY1BhdHRlcm4pWzFdOwoJCQkJ dGltaW5nc1tpXSA9IGZ1bmNuYW1lICsgJyA/Pz8nOwoJCQkJdGltZTEgPSBuZXcg RGF0ZSgpLmdldFRpbWUoKTsKCQkJfQoKCQkJaWYodHlwZW9mIGV2ZW50c1tpXSA9 PSAnZnVuY3Rpb24nKQoJCQkJZXZlbnRzW2ldKCk7CgkJCWVsc2UgaWYodHlwZW9m IGV2ZW50c1tpXSA9PSAnb2JqZWN0JykKCQkJCWV2ZW50c1tpXVswXS5hcHBseSh3 aW5kb3csIGV2ZW50c1tpXVsxXSk7CgoJCQlpZihldmVudFRpbWluZykKCQkJewoJ CQkJdGltZTIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKCQkJCWR1cmF0aW9uID0g KHRpbWUyIC0gdGltZTEpOwoJCQkJdG90YWwgKz0gZHVyYXRpb247CgoJCQkJZm9y KGo9KGZ1bmNuYW1lLmxlbmd0aCArIGR1cmF0aW9uLnRvU3RyaW5nKCkubGVuZ3Ro KTsgajw1MDsgaisrKQoJCQkJCWZ1bmNuYW1lICs9ICcgJzsKCgkJCQl0aW1pbmdz W2ldID0gZnVuY25hbWUgKyBkdXJhdGlvbiArICcgbXNcbic7CgkJCX0KCQl9CgkJ Y2F0Y2ggKGUpCgkJewoJCQkvKiB3ZSBkb24ndCBuZWVkIHRvIHBhc3MgdGhlIHNj b3BlIGFnYWluICovCgkJCWFyZ3VtZW50cy5jYWxsZWUoIGV2ZW50cy5zbGljZShp ICsgMSkgKTsKCQkJaWYoc2NvcGUpCgkJCXsKCQkJCURPTVF1ZXJ5LnByb3RvdHlw ZS5zY29wZSA9IHByZXZpb3VzU2NvcGU7CgkJCX0KCQkJdGhyb3cgZTsKCQl9Cgl9 CgoJaWYoc2NvcGUpCgl7CgkJRE9NUXVlcnkucHJvdG90eXBlLnNjb3BlID0gcHJl dmlvdXNTY29wZTsKCX0KCglpZihldmVudFRpbWluZykKCQlkb2N1bWVudC5ib2R5 LmFwcGVuZENoaWxkKGNyZWF0ZURPTU5vZGUoJ3ByZScsIHt9LCB0aW1pbmdzKSk7 CgovKgl3aW5kb3cuc3RhdHVzID0gJ3hwYXRoOiAnICsgRE9NUXVlcnkuaGFzWFBh dGggKyAnIC0gdG90YWwgSlMgZXZlbnRzOiAnK3RvdGFsKydtcycgOyAqLwoKfQoK LyogZm9yIE1vemlsbGEvT3BlcmE5ICovCmlmIChkb2N1bWVudC5hZGRFdmVudExp c3RlbmVyKQp7Cglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50 TG9hZGVkIiwgaW5pdCwgZmFsc2UpOwp9CgovKiBmb3IgSW50ZXJuZXQgRXhwbG9y ZXIgKi8KLypAY2Nfb24gQCovCi8qQGlmIChAX3dpbjMyKQoJZG9jdW1lbnQud3Jp dGUoIjxzY3JpcHQgaWQ9X19pZV9vbmxvYWQgZGVmZXIgc3JjPS8vOj48XC9zY3Jp cHQ+Iik7Cgl2YXIgc2NyaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIl9f aWVfb25sb2FkIik7CglzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rp b24oKQoJewoJCWlmICh0aGlzLnJlYWR5U3RhdGUgIT0gImNvbXBsZXRlIikKCQkJ cmV0dXJuOwoKCQlpZih0eXBlb2YgaW5pdFJlYWR5U3RhdGVEZXRlY3Rpb25DYWxs YmFjayAhPSAnZnVuY3Rpb24nIHx8IGluaXRSZWFkeVN0YXRlRGV0ZWN0aW9uQ2Fs bGJhY2soKSkKCQl7CgkJCWluaXQoKTsKCQkJcmV0dXJuOwoJCX0KCgkJdmFyIF90 aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkKCQl7CgkJCWlmKGluaXRSZWFk eVN0YXRlRGV0ZWN0aW9uQ2FsbGJhY2soKSkKCQkJewoJCQkJaW5pdCgpOyAvLyBj YWxsIHRoZSBvbmxvYWQgaGFuZGxlcgoJCQl9CgkJfSwgMTApOwoJfTsKLypAZW5k IEAqLwoKLyogZm9yIFNhZmFyaSAqLwppZiAoL1dlYktpdC9pLnRlc3QobmF2aWdh dG9yLnVzZXJBZ2VudCkpCnsgLy8gc25pZmYKCXZhciBfdGltZXIgPSBzZXRJbnRl cnZhbChmdW5jdGlvbigpCgl7CgkJaWYgKC9sb2FkZWR8Y29tcGxldGUvLnRlc3Qo ZG9jdW1lbnQucmVhZHlTdGF0ZSkpCgkJewoJCQlpbml0KCk7IC8vIGNhbGwgdGhl IG9ubG9hZCBoYW5kbGVyCgkJfQoJfSwgMTApOwp9OwoKLyogZm9yIG90aGVyIGJy b3dzZXJzICovCndpbmRvdy5vbmxvYWQgPSBpbml0OwpmdW5jdGlvbiBsaW5rVGl0 bGVJblN0YXR1c2Jhcih0YXJnZXRzKQp7CglhZGRFdmVudFRvVGFyZ2V0cyh0YXJn ZXRzLCAnbW91c2VvdmVyJywgc2hvd1RpdGxlSW5TdGF0dXNiYXIsICdhJyk7Cglh ZGRFdmVudFRvVGFyZ2V0cyh0YXJnZXRzLCAnbW91c2VvdXQnLCBjbGVhclN0YXR1 c2JhciwgJ2EnKTsKfTsKCmZ1bmN0aW9uIHNob3dUaXRsZUluU3RhdHVzYmFyKCkK ewoJaWYodGhpcy50aXRsZS5sZW5ndGggPT0gMCkKCQlyZXR1cm47CgoJaWYodGhp cy5hY2Nlc3NLZXkubGVuZ3RoID09IDEpCgl7CgkJd2luZG93LnN0YXR1cyA9IHRo aXMudGl0bGUgKyAnIC0gc25lbHRvZXRzOiBBbHQgKyAnK3RoaXMuYWNjZXNzS2V5 OwoJfQoJZWxzZQoJewoJCXdpbmRvdy5zdGF0dXMgPSB0aGlzLnRpdGxlICsgJyAt ICcgKyB0aGlzLmhyZWY7Cgl9Cn07CgpmdW5jdGlvbiBjbGVhclN0YXR1c2Jhcigp CnsKCXdpbmRvdy5zdGF0dXMgPSAnJzsKCXJldHVybiB0cnVlOwp9OwoKdmFyIG1h eEltYWdlV2lkdGggPSA1OTU7CnZhciBtYXhJbWFnZUhlaWdodCA9IDIwMDA7CnZh ciBpbWFnZXNUb1NjYWxlID0gW107CmZ1bmN0aW9uIHNjYWxlSW1hZ2VzKHRhcmdl dHMpCnsKCWltYWdlc1RvU2NhbGUgPSBnZXRUYXJnZXRzKHRhcmdldHMsICdvbCBk aXYubWVzc2FnZS1jb250ZW50IGltZycpOwoKCWZvcih2YXIgaT0wLCBpbWFnZTso aW1hZ2U9aW1hZ2VzVG9TY2FsZS5nZXQoaSkpO2krKykKCXsKCQlpbWFnZS5zZXRB dHRyaWJ1dGUoJ21heHdpZHRoJywgbWF4SW1hZ2VXaWR0aCk7CgkJaW1hZ2Uuc2V0 QXR0cmlidXRlKCdtYXhoZWlnaHQnLCBtYXhJbWFnZUhlaWdodCk7CgoJCWFkZEV2 ZW50KGltYWdlLCAnbG9hZCcsIHNjYWxlSW1hZ2UpOwoJfQoJaW1hZ2VzVG9TY2Fs ZSA9IFtdOwp9OwoKZnVuY3Rpb24gc2NhbGVJbWFnZSgpCnsKCXZhciBtYXhXaWR0 aCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdtYXh3aWR0aCcpOwoJdmFyIG1heEhlaWdo dCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdtYXhoZWlnaHQnKTsKCglpZih0aGlzLndp ZHRoIDw9IG1heFdpZHRoICYmIHRoaXMuaGVpZ2h0IDw9IG1heEhlaWdodCkKCQly ZXR1cm4ganNjc3MoJ3JlbW92ZScsIHRoaXMsICdkaXNwbGF5LW5vbmUnKTsKCgl2 YXIgc2NhbGVSYXRpbyA9IG1heFdpZHRoIC8gbWF4SGVpZ2h0OwoKCWlmICh0aGlz LndpZHRoID4gbWF4V2lkdGggfHwgdGhpcy5oZWlnaHQgPiBtYXhIZWlnaHQpCgl7 CgkJdmFyIHJhdGlvID0gdGhpcy53aWR0aCAvIHRoaXMuaGVpZ2h0OwoJCXRoaXMu b3JpZ2luYWxXaWR0aCA9IHRoaXMud2lkdGg7CgkJdGhpcy5vcmlnaW5hbEhlaWdo dCA9IHRoaXMuaGVpZ2h0OwoKCQlpZiAocmF0aW8gPiBzY2FsZVJhdGlvKQoJCXsK CQkJdGhpcy53aWR0aCA9IG1heFdpZHRoOwoJCQl0aGlzLmhlaWdodCA9IG1heFdp ZHRoIC8gcmF0aW87CgkJfQoJCWVsc2UKCQl7CgkJCXRoaXMuaGVpZ2h0ID0gbWF4 SGVpZ2h0OwoJCQl0aGlzLndpZHRoID0gbWF4SGVpZ2h0ICogcmF0aW87CgkJfQoK CQlpZiAodGhpcy5wYXJlbnROb2RlLm5vZGVOYW1lICE9ICdBJykKCQl7CgkJCWFk ZEV2ZW50KHRoaXMsICdjbGljaycsIHBvcHVwSW1hZ2UpOwoJCQlqc2NzcygnYWRk JywgdGhpcywgJ2VubGFyZ2VhYmxlJyk7CgkJCXRoaXMudGl0bGUgKz0gZ2V0VGV4 dCgnZXh0cmEnLCAnY2xpY2tfdG9fZW5sYXJnZScpOwoJCX0KCX0KCglqc2Nzcygn cmVtb3ZlJywgdGhpcywgJ2Rpc3BsYXktbm9uZScpOwp9OwoKZnVuY3Rpb24gcG9w dXBJbWFnZSgpCnsKCXdpbmRvdy5vcGVuKHRoaXMuc3JjLCAnaW1nJywgJ3dpZHRo PScrKHRoaXMub3JpZ2luYWxXaWR0aCsxNikrJyxoZWlnaHQ9JysodGhpcy5vcmln aW5hbEhlaWdodCsxNikrJyxsZWZ0PTAsdG9wPTAnKTsKfTsKCmZ1bmN0aW9uIG1h a2VTbWlsZXlzQ2xpY2thYmxlKHRhcmdldHMpCnsKCWFkZEV2ZW50VG9UYXJnZXRz KHRhcmdldHMsICdjbGljaycsIF9pbnNlcnRTbWlsZXksICdkaXYjc21pbGV5cyBp bWcnKTsKfTsKCmZ1bmN0aW9uIF9pbnNlcnRTbWlsZXkoKQp7CglwdXRTdHIoJyAn ICsgIHRoaXMuYWx0ICsgJyAnKTsKCWhpZGVTbWlsZXlzKCk7Cn07CgpmdW5jdGlv biBsb2NhbEFuY2hvcnMoKQp7CgkvKiBzdHJpY3QgY2hlY2tpbmcgZm9yIHRoZSBt b21lbnQsIHNob3VsZCBiZSBldmFsdWF0ZWQgYXQgYSBsYXRlciBwb2ludCAqLwoJ aWYoIWpzY3NzKCdjaGVjaycsIGRvY3VtZW50LmJvZHksICdsaXN0X21lc3NhZ2Un KSAmJiAhanNjc3MoJ2NoZWNrJywgZG9jdW1lbnQuYm9keSwgJ2xpc3RfbWVzc2Fn ZXMnKSkKCQlyZXR1cm47CgoJdmFyIGNvbnRhaW5lciA9IG5ldyBET01RdWVyeSgn b2wjbWVzc2FnZXMnKS5nZXQoMCk7CglpZighY29udGFpbmVyKQoJCXJldHVybjsK Cgl2YXIgaXRlbXMgPSBuZXcgRE9NUXVlcnkoJ2FkZHJlc3MucG9zdGVkLWF0IGEs IGJsb2NrcXVvdGUucXVvdGUtYmxvY2txdW90ZSBhLm1lc3NhZ2VsaW5rJywgY29u dGFpbmVyKTsKCXZhciBwYXR0ZXJuID0gL2xpc3RfbWVzc2FnZVwvLzsKCWZvcih2 YXIgaSA9IDAsIGl0ZW07IChpdGVtPWl0ZW1zLmdldChpKSk7IGkrKykKCXsKCQlp ZihwYXR0ZXJuLnRlc3QoaXRlbS5wYXRobmFtZSkpCgkJewoJCQlhZGRFdmVudChp dGVtLCAnY2xpY2snLCBmdW5jdGlvbihlKSB7IGlmKCFfbG9jYWxBbmNob3JzKHRo aXMpKSB7IGUucHJldmVudERlZmF1bHQoKTsgfSB9ICk7CgkJfQoJfQp9OwoKZnVu Y3Rpb24gX2xvY2FsQW5jaG9ycyh4KQp7Cgl2YXIgaWQgPSB4Lmhhc2guc3Vic3Ry aW5nKDEpLCBhbmNob3JzID0gZG9jdW1lbnQuYW5jaG9yczsKCglmb3IodmFyIGk9 MCwgYW5jaG9yOyAoYW5jaG9yPWFuY2hvcnNbaV0pOyBpKyspCgl7CgkJaWYoYW5j aG9yLm5hbWUgPT0gaWQpCgkJewoJCQl3aW5kb3cubG9jYXRpb24uaGFzaCA9IGlk OwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQp9OwoKZnVuY3Rpb24gc2xhc2hkb3RM aW5rcyh0YXJnZXRzKQp7Cgl2YXIgaXRlbXMgPSBnZXRUYXJnZXRzKHRhcmdldHMs ICdvbC5tZXNzYWdlcyBhLmxpbmsnKSwgYSA9IGNyZWF0ZURPTU5vZGUoJ2EnLCB7 ImhyZWYiIDogYm9hcmRfc2NyaXB0X3VybH0sIFtdKSwgc3BhbiwgY2xvbmUsIHNo b3J0bmFtZTsKCWZvcih2YXIgaT0wLCBpdGVtOyAoaXRlbSA9IGl0ZW1zLmdldChp KSk7IGkrKykKCXsKCQlpZihhLmhvc3RuYW1lICE9IGl0ZW0uaG9zdG5hbWUpCgkJ ewoJCQlpZihpdGVtLmhyZWYgPT0gaXRlbS50ZXh0IHx8IGl0ZW0uaG9zdG5hbWUg PT0gaXRlbS50ZXh0KQoJCQkJY29udGludWU7CgoJCQlzaG9ydG5hbWUgPSBob3N0 bmFtZVRvU2hvcnRuYW1lKGl0ZW0uaG9zdG5hbWUpOwoJCQlzcGFuID0gY3JlYXRl RE9NTm9kZSgnc3BhbicsIHt9LCBbaXRlbS5jbG9uZU5vZGUodHJ1ZSksICcgWycg KyBzaG9ydG5hbWUgKyAnXSddKTsKCQkJaXRlbS5wYXJlbnROb2RlLnJlcGxhY2VD aGlsZChzcGFuLCBpdGVtKTsKCQl9Cgl9Cn07Ci8qIHRoZXNlIHJlZ2V4cCdzIGhh dmUgYmVlbiBjb3BpZWQgZnJvbSBzbGFzaGNvZGUgd2hpY2ggaXMgR1BMICovCi8q IGZpbGU6IHV0aWxzL2RvbWFpblRhZ2lmeUNvbW1lbnRzICovCmZ1bmN0aW9uIGhv c3RuYW1lVG9TaG9ydG5hbWUoaG9zdG5hbWUpCnsKCWlmKC9eKFxkezEsM31cLil7 M31cZHsxLDN9JC8udGVzdChob3N0bmFtZSkpCgkJcmV0dXJuIGhvc3RuYW1lOwoK CXZhciByZXN1bHQ7CgoJZm9yKHZhciBpPTE7IGk8PTM7IGkrKykKCXsKCQlzd2l0 Y2goaSkKCQl7CgkJCWNhc2UgMToKCQkJCXJlc3VsdCA9IGhvc3RuYW1lLm1hdGNo KC8oW1x3LV0rXC5bYS16XXszLDR9KSQvaSk7CgkJCWJyZWFrOwoJCQljYXNlIDI6 CgkJCQlyZXN1bHQgPSBob3N0bmFtZS5tYXRjaCgvKFtcdy1dK1wuW2Etel17Miw0 fVwuW2Etel17Mn0pJC9pKTsKCQkJYnJlYWs7CgkJCWNhc2UgMzoKCQkJCXJlc3Vs dCA9IGhvc3RuYW1lLm1hdGNoKC8oW2Etel0rXC5bYS16XXsyfSkkL2kpOwoJCQli cmVhazsKCQl9CgkJaWYocmVzdWx0KQoJCQlyZXR1cm4gcmVzdWx0WzFdOwoJfQoK CXZhciBpdGVtcyA9IGhvc3RuYW1lLnNwbGl0KCcuJyk7CglpZihpdGVtcy5sZW5n dGggPj0gMykKCQlyZXR1cm4gaXRlbXMucmV2ZXJzZSgpLnNsaWNlKDAsMykucmV2 ZXJzZSgpLmpvaW4oJy4nKTsKCglyZXR1cm4gaG9zdG5hbWU7Cn07CgpmdW5jdGlv biBleHRlcm5hbExpbmtzSW5Qb3B1cCh0YXJnZXRzKQp7Cgl2YXIgaXRlbXMgPSBn ZXRUYXJnZXRzKHRhcmdldHMsICdvbC5tZXNzYWdlcyBhLmxpbmsnKSwgYSA9IGNy ZWF0ZURPTU5vZGUoJ2EnLCB7ImhyZWYiIDogYm9hcmRfc2NyaXB0X3VybH0sIFtd KTsKCglmb3IodmFyIGk9MCwgaXRlbTsgKGl0ZW0gPSBpdGVtcy5nZXQoaSkpOyBp KyspCgl7CgkJaWYoaXRlbS5ocmVmICYmIGEuaG9zdG5hbWUgIT0gaXRlbS5ob3N0 bmFtZSkKCQl7CgkJCWFkZEV2ZW50KGl0ZW0sICdjbGljaycsIGZ1bmN0aW9uKGUp IHsgaWYoIV9sb2NhbEFuY2hvcnModGhpcykpIHsgd2luZG93Lm9wZW4odGhpcy5o cmVmLCAncG9wdXBleHRlcm5hbCcpOyBlLnByZXZlbnREZWZhdWx0KCk7IH0gfSAp OwoJCX0KCX0KfTsKCmZ1bmN0aW9uIGluZGljYXRlU2VjdXJlTGluayh0YXJnZXRz KQp7Cgl2YXIgaXRlbXMgPSBnZXRUYXJnZXRzKHRhcmdldHMsICdvbC5tZXNzYWdl cyBhLmxpbmsnKSwgYSA9IGNyZWF0ZURPTU5vZGUoJ2EnLCB7ImhyZWYiIDogYm9h cmRfc2NyaXB0X3VybH0sIFtdKTsKCglmb3IodmFyIGk9MCwgaXRlbTsgKGl0ZW0g PSBpdGVtcy5nZXQoaSkpOyBpKyspCgl7CgkJaWYoYS5ob3N0bmFtZSAhPSBpdGVt Lmhvc3RuYW1lICYmIGl0ZW0ucHJvdG9jb2wgPT0gJ2h0dHBzOicpCgkJewoJCQlq c2NzcygnYWRkJywgaXRlbSwgJ3NlY3VyZS1saW5rJyk7CgkJfQoJfQoKfTsKCmZ1 bmN0aW9uIHNlYXJjaFBvcHVwKHRhcmdldHMpCnsKCWFkZEV2ZW50VG9UYXJnZXRz KHRhcmdldHMsICdjbGljaycsIGZ1bmN0aW9uKCkgeyB0cnkge19zZWFyY2hQb3B1 cCh0aGlzKTt9IGNhdGNoIChlKSB7fSByZXR1cm4gZmFsc2U7fSwgJ2RpdiNuYXZp Z2F0aW9uIGxpI3NlYXJjaC1saW5rIGEnKTsKCWFkZEV2ZW50VG9UYXJnZXRzKHRh cmdldHMsICdkYmxjbGljaycsIGZ1bmN0aW9uKCkgeyBkb2N1bWVudC5sb2NhdGlv bi5ocmVmID0gaXRlbXNbMF0uaHJlZjsgfSAsICdkaXYjbmF2aWdhdGlvbiBsaSNz ZWFyY2gtbGluayBhJyk7Cn07CgpmdW5jdGlvbiBfc2VhcmNoUG9wdXAoeCkKewoJ dmFyIGhpZGRlbkVsZW1lbnRzID0gWyBbJ2FjdGlvbicsICdmaW5kJ10sIFsnZGF0 YVtzZWFyY2h0eXBlXScsICdzZWFyY2gnXSBdLCBpbnB1dCwgZmllbGRzZXROb2Rl cyA9IFtdOwoJZm9yKHZhciBpID0wLCBpdGVtOyAoaXRlbSA9IGhpZGRlbkVsZW1l bnRzW2ldKTtpKyspCgl7CgkJZmllbGRzZXROb2Rlc1tmaWVsZHNldE5vZGVzLmxl bmd0aF0gPSBjcmVhdGVET01Ob2RlKCdpbnB1dCcsIHsidHlwZSIgOiAnaGlkZGVu JywgIm5hbWUiIDogaXRlbVswXSwgInZhbHVlIiA6IGl0ZW1bMV19LCBbXSk7Cgl9 CgoJdmFyIGZvcm0gPSBjcmVhdGVET01Ob2RlKCdmb3JtJywgeyJhY3Rpb24iIDog Ym9hcmRfc2NyaXB0X3VybH0sCgkJCQlbCgkJCQkJY3JlYXRlRE9NTm9kZSgnZmll bGRzZXQnLCB7fSwKCQkJCQlbCgkJCQkJCS8qZmllbGRzZXROb2RlcywqLwoJCQkJ CQljcmVhdGVET01Ob2RlKCdpbnB1dCcsIHsidHlwZSIgOiAndGV4dCcsICJuYW1l IiA6ICdkYXRhW3FdJywic2l6ZSIgOiA0MCwgImlkIiA6ICdzZWFyY2gtbGluay1p bnB1dCcsICJkZWZhdWx0VmFsdWUiIDogZ2V0VGV4dCgnZXh0cmEnLCAnc2VhcmNo UG9wdXAnKSwgImV2ZW50IiA6IFsnZm9jdXMnLCBlbXB0eV19LCBbXSkKCQkJCQld KSwKCgkJCQldKTsKCgl4LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoZm9ybSk7CgoJ bmV3IERPTVF1ZXJ5KCdpbnB1dCNzZWFyY2gtbGluay1pbnB1dCcpLmdldCgwKS5m b2N1cygpOwoKCXJldHVybiBmYWxzZTsKfTsKCmZ1bmN0aW9uIGNsb3NlQW5kU3Vi bWl0KHRhcmdldHMpCnsKCXZhciBpdGVtcyA9IGdldFRhcmdldHModGFyZ2V0cywg J2RpdiN0b3BpYy1hZG1pbiBpbnB1dCNzdGF0dXMnKTsKCWlmKGl0ZW1zLmxlbmd0 aCA9PSAwKQoJCXJldHVybjsKCglpZihpdGVtcy5nZXQoMCkubmV4dFNpYmxpbmcu b3B0aW9uc1tpdGVtcy5nZXQoMCkubmV4dFNpYmxpbmcuc2VsZWN0ZWRJbmRleF0u dmFsdWUgIT0gJ0Nsb3NlZCcpCgl7CgkJdmFyIGlucHV0ID0gY3JlYXRlRE9NTm9k ZSgnaW5wdXQnLCB7InR5cGUiIDonc3VibWl0JywgImFjY2Vzc0tleSIgOidjJywg InZhbHVlIiA6Z2V0VGV4dCgnZXh0cmEnLCdjbG9zZV9hbmRfc3VibWl0JyksICJl dmVudCIgOlsnY2xpY2snLCBmdW5jdGlvbigpIHsgX2Nsb3NlQW5kU3VibWl0KHRo aXMuZm9ybSk7IH1dIH0sIFtdKTsKCQlpdGVtcy5nZXQoMCkucGFyZW50Tm9kZS5h cHBlbmRDaGlsZChpbnB1dCk7Cgl9Cn07CgpmdW5jdGlvbiBfY2xvc2VBbmRTdWJt aXQoZm9ybSkKewoJdmFyIGl0ZW1zID0gbmV3IERPTVF1ZXJ5KCdpbnB1dCNzdGF0 dXMgKyBzZWxlY3QnLCBmb3JtKTsKCWlmKGl0ZW1zLmxlbmd0aCA9PSAwKQoJCXJl dHVybjsKCgl2YXIgc2VsZWN0ID0gaXRlbXMuZ2V0KDApLCBvcHRzID0gc2VsZWN0 Lm9wdGlvbnM7Cglmb3IodmFyIGk9MCwgb3B0aW9uOyAob3B0aW9uPW9wdHNbaV0p OyBpKyspCgl7CgkJaWYoCW9wdGlvbi52YWx1ZSA9PSAnQ2xvc2VkJykKCQl7CgkJ CXNlbGVjdC5zZWxlY3RlZEluZGV4ID0gaTsKCQkJc2VsZWN0LnByZXZpb3VzU2li bGluZy5jaGVja2VkID0gdHJ1ZTsKCQkJYnJlYWs7CgkJfQoJfQp9OwoKZnVuY3Rp b24gaW5kaWNhdGVBY2Nlc3NrZXkodGFyZ2V0cykKewoJdmFyIGl0ZW1zID0gZ2V0 VGFyZ2V0cyh0YXJnZXRzLCAnaW5wdXRbYWNjZXNza2V5XScpOwoKCXZhciByZXBs YWNlbWVudCwgaW5kaWNhdG9yQ2hhclBvcywgdGV4dE9uQnV0dG9uOwoJZm9yKHZh ciBpPTAsIGl0ZW07IChpdGVtPWl0ZW1zLmdldChpKSk7IGkrKykKCXsKCQlzd2l0 Y2goaXRlbS50eXBlKQoJCXsKCQkJY2FzZSAnc3VibWl0JzoKCQkJY2FzZSAncmVz ZXQnOgoJCQkJdGV4dE9uQnV0dG9uID0gaXRlbS52YWx1ZTsKCQkJCWluZGljYXRv ckNoYXJQb3MgPSB0ZXh0T25CdXR0b24udG9Mb3dlckNhc2UoKS5pbmRleE9mKGl0 ZW0uYWNjZXNzS2V5KTsKCgkJCQlpZihpbmRpY2F0b3JDaGFyUG9zID49IDAgKQoJ CQkJewoJCQkJCXJlcGxhY2VtZW50ID0JY3JlYXRlRE9NTm9kZSgnYnV0dG9uJywg eyJhY2Nlc3NLZXkiIDogaXRlbS5hY2Nlc3NLZXksICJuYW1lIiA6IGl0ZW0ubmFt ZSwgImlkIiA6IGl0ZW0uaWQsICJ0eXBlIiA6IGl0ZW0udHlwZSwgImNsYXNzIiA6 IGl0ZW0uY2xhc3NOYW1lfSwKCQkJCQkJCQkJWwoJCQkJCQkJCQkJdGV4dE9uQnV0 dG9uLnN1YnN0cmluZygwLCBpbmRpY2F0b3JDaGFyUG9zKSwKCQkJCQkJCQkJCWNy ZWF0ZURPTU5vZGUoJ3NwYW4nLCB7ImNsYXNzIiA6ICdhY2Nlc3NrZXknfSwgW3Rl eHRPbkJ1dHRvbi5jaGFyQXQoaW5kaWNhdG9yQ2hhclBvcyldKSwKCQkJCQkJCQkJ CXRleHRPbkJ1dHRvbi5zdWJzdHJpbmcoaW5kaWNhdG9yQ2hhclBvcysxKQoJCQkJ CQkJCQldKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlyZXBsYWNlbWVudCA9 CWNyZWF0ZURPTU5vZGUoJ2J1dHRvbicsIHsiYWNjZXNzS2V5IiA6IGl0ZW0uYWNj ZXNzS2V5LCAibmFtZSIgOiBpdGVtLm5hbWUsICJpZCIgOiBpdGVtLmlkLCAidHlw ZSIgOiBpdGVtLnR5cGUsICJjbGFzcyIgOiBpdGVtLmNsYXNzTmFtZX0sCgkJCQkJ CQkJCVsKCQkJCQkJCQkJCXRleHRPbkJ1dHRvbiwKCQkJCQkJCQkJCScgJywKCQkJ CQkJCQkJCWNyZWF0ZURPTU5vZGUoJ3NwYW4nLCB7ImNsYXNzIiA6ICdhY2Nlc3Nr ZXknfSwgW2dldFRleHQoJ2V4dHJhJywgJ2FjY2Vzc2tleV9pbmRpY2F0b3InLCBp dGVtLmFjY2Vzc0tleSldKQoJCQkJCQkJCQldKTsKCQkJCX0KCgkJCQkvKiBpZSBt b2V0IGVjaHQgZG9vZCBvZnpvICovCgkJCQkvKiBpZSBwYWt0IGRlICd0eXBlJyBh dHRyaWJ1dGUgbmlldCBtZWUgKi8KCQkJCWlmKGlzSUUpCgkJCQl7CgkJCQkJaWYo aXRlbS50eXBlID09ICdzdWJtaXQnKQoJCQkJCQlhZGRFdmVudChyZXBsYWNlbWVu dCwgJ2NsaWNrJywgZnVuY3Rpb24oKSB7IHRoaXMuZm9ybS5zdWJtaXQoKTsgfSAp OwoJCQkJCWVsc2UgaWYoaXRlbS50eXBlID09ICdyZXNldCcpCgkJCQkJCWFkZEV2 ZW50KHJlcGxhY2VtZW50LCAnY2xpY2snLCBmdW5jdGlvbigpIHsgdGhpcy5mb3Jt LnJlc2V0KCk7IH0gKTsKCQkJCX0KCgkJCQlpdGVtLnBhcmVudE5vZGUucmVwbGFj ZUNoaWxkKHJlcGxhY2VtZW50LCBpdGVtKTsKCQkJCWJyZWFrOwoJCX0KCX0KCgly ZXR1cm4gdHJ1ZTsKfTsKCmZ1bmN0aW9uIGFsbFBhZ2VzTmF2aWdhdGlvbih0YXJn ZXRzKQp7CglhZGRFdmVudFRvVGFyZ2V0cyh0YXJnZXRzLCAnY2xpY2snLCBfYWxs UGFnZXNOYXZpZ2F0aW9uLCAnZGwudG9waWMtbmF2aWdhdGlvbiBzcGFuLmN1dG9m ZicpOwp9OwoKZnVuY3Rpb24gX2FsbFBhZ2VzTmF2aWdhdGlvbigpCnsKCXZhciBk bCA9IGdldFNpYmxpbmdOb2RlKHRoaXMsICd1cCcsICdkbCcpOwoKCXZhciBsaW5r ID0gbmV3IERPTVF1ZXJ5KCdkZCBhJywgZGwpOwoKCWlmKGxpbmsubGVuZ3RoID09 IDApCgkJcmV0dXJuOwoJZWxzZQoJCWxpbmsgPSBsaW5rLmdldCgwKTsKCgkvKiBu dW1iZXIgaXMgc3RvcmVkIGluIGRsJ3MgcGFnZXMtLi4uICovCgl2YXIgbWF4UGFn ZSA9IGRsLmNsYXNzTmFtZS5tYXRjaCgvcGFnZXNcLShbMC05XSspLylbMV07CgoJ dmFyIHBhZ2VOdW1iZXIgPSBwcm9tcHQoZ2V0VGV4dCgnZXh0cmEnLCdlbnRlcl9w YWdlX251bWJlcicsIG1heFBhZ2UpLCAnMScpOwoJaWYoIXBhZ2VOdW1iZXIpCgkJ cmV0dXJuOwoKCXBhZ2VOdW1iZXIgPSBwYXJzZUludChwYWdlTnVtYmVyKTsKCglp Zihpc05hTihwYWdlTnVtYmVyKSB8fCBwYWdlTnVtYmVyIDwgMSB8fCBwYWdlTnVt YmVyID4gbWF4UGFnZSkKCXsKCQlhbGVydChnZXRUZXh0KCdleHRyYScsICdwYWdl X251bWJlcl9pbmNvcnJlY3QnKSk7CgkJcmV0dXJuOwoJfQoKCXZhciBtYXRjaGVz ID0gbGluay5ocmVmLm1hdGNoKC9eKFteMC05XStcL1swLTldKykoXC9bMC05XSsp PyguKikkLyk7Cgl2YXIgX2xpbmsgPSBtYXRjaGVzWzFdICsgJy8nICsgcGFnZU51 bWJlciArIG1hdGNoZXNbM107CgoJZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IF9s aW5rOwp9OwoKZnVuY3Rpb24gaGlnaGxpZ2h0UmVmZXJyZXJRdWVyeSgpCnsKCXZh ciBxID0gJycsIGl0ZW0gPSBudWxsLCBlbCA9IFtdOwoJdmFyIHJlZiA9IGRvY3Vt ZW50LnJlZmVycmVyOwoJaWYocmVmICE9ICcnKQoJewoJCXJlZiA9IGNyZWF0ZURP TU5vZGUoJ2EnLCB7J2hyZWYnIDogcmVmfSwgW10pLnNlYXJjaC5zdWJzdHIoMSku c3BsaXQoJyYnKTsKCQkvKiByZWYgbm93IGNvbnRhaW5zIGEgbGlzdCBvZiBhPWIs IHg9eSwgLi4uIHNldHMgKi8KCQlmb3IodmFyIGk9MDsgKGl0ZW0gPSByZWZbaV0p OyBpKyspCgkJewoJCQllbCA9IGl0ZW0uc3BsaXQoJz0nKTsKCQkJaWYoWydxJywg J3AnLCAncXVlcnknXS5pbmRleE9mKGVsWzBdKSA+IC0xKQoJCQl7CgkJCQlxID0g ZWxbMV07CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJaWYocSA9PSAnJykKCQkJcmV0 dXJuOwoKCQkvKiB0bnggdG8gaHR0cDovL3N2bi5mdWNvZGVyLmNvbS9mdWNvZGVy L3NlLWhpbGl0ZS9zZV9oaWxpdGVfc3JjLmpzICovCgkJcSA9IGRlY29kZVVSSUNv bXBvbmVudChxKTsKCQlxID0gcS5yZXBsYWNlKC9cJ3wiL2csICcnKTsKCQlxID0g cS5zcGxpdCgvW1xzLFwrXC5dKy8pOwoKCQloaWdobGlnaHRTdHJpbmdzKGRvY3Vt ZW50LmJvZHksIHEgKTsKCX0KfTsKCmZ1bmN0aW9uIGhpZ2hsaWdodFN0cmluZ3Mo ZWwsIHN0cnMpCnsKCXZhciByZWdleHAsIG1ldGNoLCB3b3JkcywgcmVwbGFjZW1l bnQ7Cglmb3IodmFyIGk9MCwgaXRlbTsgKGl0ZW0gPSBlbC5jaGlsZE5vZGVzW2ld KTsgaSsrKQoJewoJCWlmKGl0ZW0ubm9kZVR5cGUgPT0gMykKCQl7CgkJCXJlZ2V4 cCA9IG5ldyBSZWdFeHAoJ1xcYignK3N0cnMuam9pbignfCcpKycpXFxiJywgJ2ln Jyk7CgkJCWlmKHdvcmRzID0gaXRlbS5ub2RlVmFsdWUuc3BsaXQoIHJlZ2V4cCAp KQoJCQl7CgkJCQkvKiBub3cgaGlnaGxpZ2h0IHRoZSBpbmRpdmlkdWFsIHdvcmRz ICovCgkJCQlyZXBsYWNlbWVudCA9IFtdOwoJCQkJZm9yKHZhciBqPTAsIHdvcmQ7 ICh3b3JkID0gd29yZHNbal0pOyBqKyspCgkJCQl7CgkJCQkJcmVwbGFjZW1lbnQu cHVzaCggc3Rycy5pbmRleE9mKHdvcmQpID4gLTEgPyBjcmVhdGVET01Ob2RlKCdz cGFuJywgeydjbGFzcycgOiAnaGlnaGxpZ2h0MSd9LCBbd29yZF0pIDogd29yZCAp OwoJCQkJfQoKCQkJCWl0ZW0ucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoY3JlYXRl RE9NTm9kZSgnc3BhbicsIHsnY2xhc3MnIDogJ2hpZ2hsaWdodGluZyd9LCByZXBs YWNlbWVudCksIGl0ZW0pOwoJCQl9CgkJfQoJCWVsc2UgaWYoaXRlbS5ub2RlVHlw ZSA9PSAxKQoJCXsKCQkJaGlnaGxpZ2h0U3RyaW5ncyhpdGVtLCBzdHJzKTsKCQl9 Cgl9Cn07CgpmdW5jdGlvbiByZXNvbHZlSVAySG9zdG5hbWUoKQp7Cgl2YXIgaXRl bXMgPSBuZXcgRE9NUXVlcnkoJ2xpLm1lc3NhZ2UtaXAgYScpOwoKCWZvcih2YXIg aT0wLCBpdGVtOyAoaXRlbT1pdGVtcy5nZXQoaSkpOyBpKyspCgl7CgkJYWRkRXZl bnQoaXRlbSwgJ21vdXNlb3ZlcicsIF9yZXNvbHZlSVAySG9zdG5hbWUpOwoJCWFk ZEV2ZW50KGl0ZW0sICdtb3VzZW91dCcsIF9yZXNvbHZlSVAySG9zdG5hbWUpOwoJ fQp9OwoKdmFyIF9yZXNvbHZlSVAySG9zdG5hbWVYSFI7CmZ1bmN0aW9uIF9yZXNv bHZlSVAySG9zdG5hbWUoZXYpCnsKCXZhciB0YXJnZXQgPSB0aGlzOwoKCXN3aXRj aChldi50eXBlKQoJewoJCWNhc2UgJ21vdXNlb3Zlcic6CgkJCV9yZXNvbHZlSVAy SG9zdG5hbWVYSFIgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpCgkJCQl7CgkJCQkJ dmFyIGNhbGxiYWNrID0gZnVuY3Rpb24oKQoJCQkJCXsKCQkJCQkJaWYgKHR5cGVv ZiByZXEgIT0gJ3VuZGVmaW5lZCcgJiYgcmVxICE9IG51bGwgJiYgcmVxLnJlYWR5 U3RhdGUgPT0gNCkKCQkJCQkJewoJCQkJCQkJdmFyIHJlc3VsdCA9IHJlcS5yZXNw b25zZVRleHQubWF0Y2goLzxkZCBjbGFzcz0ibG9va3VwX3VzZXIiPiguKyk8XC9k ZD4vKTsKCQkJCQkJCWFsZXJ0KHJlc3VsdFsxXSk7CgkJCQkJCX0KCQkJCQl9OwoJ CQkJCXZhciByZXEgPSBodHRwcmVxX3N0cmluZygnJywgY2FsbGJhY2ssIHRhcmdl dC5ocmVmLCBmYWxzZSk7CgkJCQl9LCAyNTApOwoJCWJyZWFrOwoJCWNhc2UgJ21v dXNlb3V0JzoKCQkJY2xlYXJUaW1lb3V0KF9yZXNvbHZlSVAySG9zdG5hbWVYSFIp OwoJCWJyZWFrOwoJfQp9OwoKZnVuY3Rpb24gYXV0b2NvbXBsZXRlKHRhcmdldHMp CnsKCXZhciBpdGVtcyA9IGdldFRhcmdldHModGFyZ2V0cywgJ2lucHV0W3N1Z2dl c3Rpb25zXScpOwoKCWZvcih2YXIgaT0wLCBpdGVtOyAoaXRlbT1pdGVtcy5nZXQo aSkpO2krKykKCXsKCQlpZihpdGVtLmdldEF0dHJpYnV0ZSgncmVhZG9ubHknKSkK CQkJYWRkRXZlbnQoaXRlbSwgJ2ZvY3VzJywgYXV0b2NvbXBsZXRlU3VnZ2VzdCk7 CgkJZWxzZQoJCQlhZGRFdmVudChpdGVtLCAna2V5dXAnLCBhdXRvY29tcGxldGVT dWdnZXN0KTsKCgkJYWRkRXZlbnQoaXRlbSwgJ2tleWRvd24nLCBkb250U3VibWl0 KTsKCQlhZGRFdmVudChpdGVtLCAnYmx1cicsIGhpZGVBdXRvY29tcGxldGVTdWdn ZXN0KTsKCQlpdGVtLnNldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJywgJ29mZicp OwoJfQp9OwoKZnVuY3Rpb24gZG9udFN1Ym1pdChlKQp7Cgl2YXIgZSA9IGUgfHwg Zml4RXZlbnQod2luZG93LmV2ZW50KTsKCWlmKGUua2V5Q29kZSA9PSAxMyAmJiB0 aGlzLnN1Z2dlc3RpbmcpCgl7CgkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJfQp9OwoK ZnVuY3Rpb24gaGlkZUF1dG9jb21wbGV0ZVN1Z2dlc3QoKQp7Cgl2YXIgbGlzdCA9 IG5ldyBET01RdWVyeSgnZGl2LmF1dG9jb21wbGV0ZScsIGRvY3VtZW50LmJvZHkp LmdldCgwKTsKCWlmIChsaXN0KQoJewoJCWxpc3Qubm9Gb2N1cyA9IHRydWU7CgkJ aWYgKGxpc3Qubm9Nb3VzZSkKCQkJbGlzdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxk KGxpc3QpOwoJfQp9OwoKZnVuY3Rpb24gYXV0b2NvbXBsZXRlU3VnZ2VzdChlKQp7 Cgl2YXIgZSA9IGUgfHwgZml4RXZlbnQod2luZG93LmV2ZW50KSwgbGlfaXRlbSwg bGlzdCA9IG5ldyBET01RdWVyeSgnZGl2LmF1dG9jb21wbGV0ZScsIGRvY3VtZW50 LmJvZHkpLmdldCgwKTsKCglzd2l0Y2goZS5rZXlDb2RlKQoJewoJCWNhc2UgMjc6 IC8qIGVzY2FwZSAqLwoJCWNhc2UgODogIC8qIGJhY2tzcGFjZSAqLwoJCWNhc2Ug NDY6IC8qIGRlbGV0ZSAqLwoJCWNhc2UgMTY6IC8qIHNoaWZ0ICovCgkJY2FzZSAz NjogLyogaG9tZSAqLwoJCWNhc2UgMzU6IC8qIGVuZCAqLwoJCQlpZiAoIWxpc3Qp CgkJCQlyZXR1cm47CgoJCQlsaXN0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobGlz dCk7CgkJCXRoaXMuc3VnZ2VzdGluZyA9IGZhbHNlOwoJCQlyZXR1cm47CgkJYnJl YWs7CgoJCWNhc2UgNDA6IC8qIGRvd24gKi8KCQljYXNlIDM4OiAvKiB1cCAqLwoJ CQlpZiAoIWxpc3QpCgkJCQlyZXR1cm47CgoJCQl2YXIgaXRlbXMgPSBuZXcgRE9N UXVlcnkoJ2xpJywgbGlzdCk7CgkJCWZvciAodmFyIGk9MCwgaXRlbTsgKGl0ZW09 aXRlbXMuZ2V0KGkpKTtpKyspCgkJCXsKCQkJCWlmKCFqc2NzcygnY2hlY2snLCBp dGVtLCAnc2VsZWN0ZWQnKSkKCQkJCQljb250aW51ZTsKCgkJCQl2YXIgaiA9IGk7 CgkJCQlpZihlLmtleUNvZGUgPT0gMzgpIC8qIHByZXZpb3VzICovCgkJCQkJai0t OwoJCQkJZWxzZQkJCQkvKiBuZXh0ICovCgkJCQkJaisrOwoKCQkJCXZhciBuZXdT ZWxlY3Rpb24gPSBpdGVtcy5nZXQoaik7CgkJCQlpZihuZXdTZWxlY3Rpb24pCgkJ CQl7CgkJCQkJanNjc3MoJ3JlbW92ZScsIGl0ZW0sICdzZWxlY3RlZCcsICcnKTsK CQkJCQlqc2NzcygnYWRkJywgbmV3U2VsZWN0aW9uLCAnc2VsZWN0ZWQnKTsKCiAJ CQkJCXZhciBjb3JyID0gbmV3U2VsZWN0aW9uLm9mZnNldFRvcCArIG5ld1NlbGVj dGlvbi5vZmZzZXRIZWlnaHQgLSBsaXN0LnNjcm9sbFRvcCAtIGxpc3Qub2Zmc2V0 SGVpZ2h0OwoJCQkJCWlmIChjb3JyPjApCgkJCQkJCWxpc3Quc2Nyb2xsVG9wICs9 IGNvcnI7CgkJCQkJY29yciA9IGxpc3Quc2Nyb2xsVG9wIC0gbmV3U2VsZWN0aW9u Lm9mZnNldFRvcDsKIAkJCQkJaWYgKGNvcnI+MCkKIAkJCQkJCWxpc3Quc2Nyb2xs VG9wIC09IGNvcnI7CgkJCQl9CgkJCQlicmVhazsKCQkJfQoJCQlyZXR1cm47CgkJ YnJlYWs7CgoJCWNhc2UgMTM6IC8qIGVudGVyICovCgkJCWlmICghbGlzdCkKCQkJ CXJldHVybjsKCgkJCXZhciBjdXJyZW50U2VsZWN0aW9uID0gbmV3IERPTVF1ZXJ5 KCdsaS5zZWxlY3RlZCcsIGxpc3QpLmdldCgwKTsKCgkJCWlmKCFjdXJyZW50U2Vs ZWN0aW9uKQoJCQkJcmV0dXJuOwoKCQkJaWYgKGRvY3VtZW50LmNyZWF0ZUV2ZW50 KQoJCQl7CgkJCQl2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNl RXZlbnRzJyk7CgkJCQlldnQuaW5pdEV2ZW50KCdjbGljaycsIHRydWUsIHRydWUp OwoJCQkJY3VycmVudFNlbGVjdGlvbi5kaXNwYXRjaEV2ZW50KGV2dCk7CgkJCX0K CQkJZWxzZSBpZihkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCkKCQkJewoJCQkJ dmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCk7CgkJCQljdXJy ZW50U2VsZWN0aW9uLmZpcmVFdmVudCgnb25jbGljaycsIGV2dCk7CgkJCX0KCgkJ CXJldHVybjsKCQlicmVhazsKCX0KCgl2YXIgY2hvaWNlcyA9IHRoaXMuZ2V0QXR0 cmlidXRlKCdzdWdnZXN0aW9ucycpLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAnJyku dG9Mb3dlckNhc2UoKS5zcGxpdCgvXHMrLyk7CgoJaWYgKHRoaXMuZ2V0QXR0cmli dXRlKCdyZWFkb25seScpIHx8ICF0aGlzLnZhbHVlLnNwbGl0KC9ccysvKS5wb3Ao KSkKCQlzdWdnZXN0aW9ucyA9IGNob2ljZXM7CgllbHNlCgl7CgkJdmFyIHN1Z2dl c3Rpb25zID0gW107CgkJdmFyIGxhc3RfdmFsdWUgPSB0aGlzLnZhbHVlLnNwbGl0 KC9ccysvKS5wb3AoKTsKCgkJZm9yKHZhciBpPTA7IGk8Y2hvaWNlcy5sZW5ndGg7 aSsrKQoJCQlpZiAoY2hvaWNlc1tpXS50b0xvd2VyQ2FzZSgpLmluZGV4T2YobGFz dF92YWx1ZS50b0xvd2VyQ2FzZSgpKSA9PSAwKQoJCQkJc3VnZ2VzdGlvbnMucHVz aChjaG9pY2VzW2ldKTsKCX0KCglhdXRvY29tcGxldGVTaG93TGlzdChzdWdnZXN0 aW9ucywgdGhpcyk7Cn0KCmZ1bmN0aW9uIGF1dG9jb21wbGV0ZVNob3dMaXN0KGNo b2ljZXMsIGlucHV0KQp7Cgl2YXIgbGlzdCA9IG5ldyBET01RdWVyeSgnZGl2LmF1 dG9jb21wbGV0ZScsIGRvY3VtZW50LmJvZHkpLmdldCgwKSwgc3VnZ2VzdGlvbnMg PSBbXSwgY29tcGxldGVkX2lubGluZSA9IGZhbHNlOwoJdmFyIHZhbHVlcyA9IGlu cHV0LnZhbHVlLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAnJykuc3BsaXQoL1xzKy8p OwoJdmFyIGxhc3RfdmFsdWUgPSBpbnB1dC52YWx1ZS5zcGxpdCgvXHMrLykucG9w KCk7IC8qIHdoZW4gdGhlIHVzZXIgaXNuJ3QgdHlwaW5nOyB3ZSBkb24ndCB3YW50 IHRvIGNvbXBsZXRlIHRoZSBsYXN0IGtleXdvcmQgKi8KCgkvLyBQdXQgc2VsZWN0 ZWQgdmFsdWVzIG9uIHRvcAoJaWYgKGlucHV0LmdldEF0dHJpYnV0ZSgncmVhZG9u bHknKSB8fCAhbGFzdF92YWx1ZSkKCQljaG9pY2VzID0gdmFsdWVzLmNvbmNhdChj aG9pY2VzKS5nZXRVbmlxdWUoKTsKCglmb3IodmFyIGk9MDsgaTxjaG9pY2VzLmxl bmd0aDtpKyspCgl7CgkJaWYgKCFjb21wbGV0ZWRfaW5saW5lICYmIGxhc3RfdmFs dWUgJiYgIWlucHV0LmdldEF0dHJpYnV0ZSgncmVhZG9ubHknKSAmJiAhaXNJRSkK CQl7CgkJCXZhciBpbnB1dF92YWx1ZV9sZW5ndGggPSBpbnB1dC52YWx1ZS5sZW5n dGg7CgkJCWlucHV0LnZhbHVlICs9IGNob2ljZXNbaV0uc3Vic3RyaW5nKGxhc3Rf dmFsdWUubGVuZ3RoKTsKCQkJaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoaW5wdXRf dmFsdWVfbGVuZ3RoLCBpbnB1dC52YWx1ZS5sZW5ndGgpOwoJCQljb21wbGV0ZWRf aW5saW5lID0gdHJ1ZTsKCQl9CgoJCWxpX2l0ZW0gPQoJCQljcmVhdGVET01Ob2Rl KAoJCQkJJ2xpJywKCQkJCXsKCQkJCQknY2xhc3MnIDogKHN1Z2dlc3Rpb25zLmxl bmd0aCA9PSAwID8gJ3NlbGVjdGVkJyA6ICcnKSArICh2YWx1ZXMuaW5kZXhPZihj aG9pY2VzW2ldKSA+PSAwID8gJyBwaWNrZWQnIDogJycpLAoJCQkJCSdrZXl3b3Jk Jwk6IGNob2ljZXNbaV0sCgkJCQkJJ2V2ZW50JyA6IFsnY2xpY2snLCBmdW5jdGlv bigpCgkJCQkJewoJCQkJCQlmb3IodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0 aDsgaSsrKQoJCQkJCQl7CgkJCQkJCQlpZih2YWx1ZXNbaV0udG9Mb3dlckNhc2Uo KSA9PSB0aGlzLmdldEF0dHJpYnV0ZSgna2V5d29yZCcpLnRvTG93ZXJDYXNlKCkp CgkJCQkJCQl7CgkJCQkJCQkJdmFsdWVzLnNwbGljZShpLDEpOwoJCQkJCQkJCXZh ciByZW1vdmVkID0gdHJ1ZTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJ fQoKCQkJCQkJaWYgKGNvbXBsZXRlZF9pbmxpbmUpCgkJCQkJCQl2YWx1ZXMucG9w KCk7CgoJCQkJCQlrZXl3b3JkID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2tleXdvcmQn KS50b0xvd2VyQ2FzZSgpCgkJCQkJCWlmKCFyZW1vdmVkKQoJCQkJCQkJdmFsdWVz LnB1c2goIGtleXdvcmQgKTsKCgkJCQkJCWlmICghaW5wdXQudmFsdWUubWF0Y2go L2tleXdvcmQkLykpCgkJCQkJCQlpbnB1dC52YWx1ZSA9IHZhbHVlcy5qb2luKCcg JykucmVwbGFjZSgvXlxzK3xccyskL2csICcnKSArICcgJzsKCQkJCQl9XQoJCQkJ fSwKCQkJCVtjaG9pY2VzW2ldXQoJCQkpOwoKCQlhZGRFdmVudCgKCQkJbGlfaXRl bSwKCQkJJ21vdXNlb3ZlcicsCgkJCWZ1bmN0aW9uICgpCgkJCXsKCQkJCWpzY3Nz KCdyZW1vdmUnLCBuZXcgRE9NUXVlcnkoJ2xpLnNlbGVjdGVkJywgdGhpcy5wYXJl bnROb2RlKS5nZXQoMCksICdzZWxlY3RlZCcsICcnKTsKCQkJCWpzY3NzKCdhZGQn LCB0aGlzLCAnc2VsZWN0ZWQnKTsKCQkJfQoJCSk7CgoJCXN1Z2dlc3Rpb25zLnB1 c2gobGlfaXRlbSk7Cgl9CgoJaWYobGlzdCkKCQlsaXN0LnBhcmVudE5vZGUucmVt b3ZlQ2hpbGQobGlzdCk7CglpbnB1dC5zdWdnZXN0aW5nID0gZmFsc2U7CgoJaWYo c3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkKCXsKCQl2YXIgYXV0b2NvbXBsZXRlTGlz dCA9IGNyZWF0ZURPTU5vZGUoJ2RpdicsIHsnY2xhc3MnIDogJ2F1dG9jb21wbGV0 ZSd9LCBbY3JlYXRlRE9NTm9kZSgndWwnLCB7fSwgc3VnZ2VzdGlvbnMpXSApOwoJ CWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYXV0b2NvbXBsZXRlTGlzdCk7CgkJ dmFyIHBvcyA9IGZpbmRQb3MoaW5wdXQpOwoJCWlmIChpc0lFKQoJCQlhdXRvY29t cGxldGVMaXN0LnN0eWxlLmxlZnQgPSAocG9zLnggLSBkb2N1bWVudC5ib2R5Lm9m ZnNldExlZnQpICsncHgnOwoJCWVsc2UKCQkJYXV0b2NvbXBsZXRlTGlzdC5zdHls ZS5sZWZ0ID0gKHBvcy54ICsgNikgKydweCc7CgoJCWF1dG9jb21wbGV0ZUxpc3Qu c3R5bGUudG9wID0gKHBvcy55ICsgaW5wdXQub2Zmc2V0SGVpZ2h0ICsgNCkgKydw eCc7CgoJCWFkZEV2ZW50KGF1dG9jb21wbGV0ZUxpc3QsICdtb3VzZW92ZXInLCBh dXRvY29tcGxldGVMaXN0TW91c2VPdmVyKTsKCQlhZGRFdmVudChhdXRvY29tcGxl dGVMaXN0LCAnbW91c2VvdXQnLCBhdXRvY29tcGxldGVMaXN0TW91c2VPdXQpOwoK CQlhdXRvY29tcGxldGVMaXN0Lm5vTW91c2UgPSB0cnVlOwoKCQlpbnB1dC5zdWdn ZXN0aW5nID0gdHJ1ZTsKCX0KfTsKCmZ1bmN0aW9uIGF1dG9jb21wbGV0ZUxpc3RN b3VzZU92ZXIoKQp7Cgl0aGlzLm5vTW91c2UgPSBmYWxzZTsKfTsKCmZ1bmN0aW9u IGF1dG9jb21wbGV0ZUxpc3RNb3VzZU91dCgpCnsKCXRoaXMubm9Nb3VzZSA9IHRy dWU7CglpZiAodGhpcy5ub0ZvY3VzKQoJCXRoaXMucGFyZW50Tm9kZS5yZW1vdmVD aGlsZCh0aGlzKTsKfTsKCmZ1bmN0aW9uIGZpbmRQb3Mob2JqKQp7Cgl2YXIgY3Vy bGVmdCA9IGN1cnRvcCA9IDA7CglpZiAob2JqLm9mZnNldFBhcmVudCkKCXsKCQlj dXJsZWZ0ID0gb2JqLm9mZnNldExlZnQ7CgkJY3VydG9wID0gb2JqLm9mZnNldFRv cDsKCQl3aGlsZSAob2JqID0gb2JqLm9mZnNldFBhcmVudCkKCQl7CgkJCWN1cmxl ZnQgKz0gb2JqLm9mZnNldExlZnQ7CgkJCWN1cnRvcCArPSBvYmoub2Zmc2V0VG9w OwoJCX0KCX0KCXJldHVybiB7eDogY3VybGVmdCwgeTogY3VydG9wfTsKfTsKCmZ1 bmN0aW9uIHN0cmV0Y2hUZXh0YXJlYXModGFyZ2V0cykKewoJYWRkRXZlbnRUb1Rh cmdldHModGFyZ2V0cywgJ2tleXVwJywgc3RyZXRjaFRleHRhcmVhLCAndGV4dGFy ZWEnKTsKCWFkZEV2ZW50VG9UYXJnZXRzKHRhcmdldHMsICdjaGFuZ2UnLCBzdHJl dGNoVGV4dGFyZWEsICd0ZXh0YXJlYScpOwp9OwoKZnVuY3Rpb24gc3RyZXRjaFRl eHRhcmVhKCkKewoJdmFyIGxpbmVzID0gdGhpcy52YWx1ZS5tYXRjaCgvKFtcclxu XSkvZyk7CglpZihsaW5lcyA9PSBudWxsKQoJCXJldHVybjsKCgl0aGlzLnN0eWxl LmhlaWdodCA9IE1hdGgubWF4KDUwLCBsaW5lcy5sZW5ndGggKyA4KSArICdlbSc7 Cn07CgpmdW5jdGlvbiBpbWFnZUdhbGxlcnkoKQp7CglpZihbJ2xpc3RfbWVzc2Fn ZScsICdsaXN0X21lc3NhZ2VzJ10uaW5kZXhPZihib2FyZF9hY3Rpb24pID09IC0x KQoJCXJldHVybjsKCgl2YXIgY29udGFpbmVyID0gbmV3IERPTVF1ZXJ5KCdkaXYu ZXh0cmEtYWN0aW9ucyB1bC5saW5rcycpLmdldCgwKTsKCglpZighY29udGFpbmVy KQoJCXJldHVybjsKCgl2YXIgdG9waWNJZCA9IG5ldyBET01RdWVyeSgnZGl2I2Fj dGlvbi1oZWFkZXInKS5nZXQoMCkuY2xhc3NOYW1lLm1hdGNoKC90b3BpY1wtdG9w aWNpZFwtKFswLTldKykvaSlbMV07CgoJdmFyIGxpbmsgPSBjcmVhdGVET01Ob2Rl KCdsaScsIHsnY2xhc3MnIDogJ3RvcGljLWdhbGxlcnknfSwKCQkJCVsKCQkJCQlj cmVhdGVET01Ob2RlKCdzcGFuJywgeydjbGFzcycgOiAnY2xpY2thYmxlJywgJ3Rp dGxlJyA6IGdldFRleHQoJ2V4dHJhJywgJ3Nob3dfZ2FsbGVyeScpLCAnZXZlbnQn IDogWydjbGljaycsIF9pbWFnZUdhbGxlcnldLCAncmVxdWVzdCcgOiAnYWN0aW9u PWxpc3RfbWVzc2FnZXMmZGF0YSU1QnRvcGljaWQlNUQ9JyArIHRvcGljSWQgKyAn JmxpbWl0PTk5OSZkYXRhJTVCZmlsdGVyX2tleXdvcmRzJTVEPWltZyZkYXRhJTVC Ym9vbGVhbiU1RD1BTkQnfSwgWyBnZXRUZXh0KCdleHRyYScsICdzaG93X2dhbGxl cnknKSBdKQoJCQkJXSk7CgoJY29udGFpbmVyLmluc2VydEJlZm9yZShsaW5rLCBj b250YWluZXIuZmlyc3RDaGlsZCk7Cn07CgpmdW5jdGlvbiBfaW1hZ2VHYWxsZXJ5 KCkKewoJdmFyIGdhbGxlcnlDb250YWluZXIgPSBuZXcgRE9NUXVlcnkoJ2Rpdi5p bWFnZS1nYWxsZXJ5JykuZ2V0KDApOwoJaWYoZ2FsbGVyeUNvbnRhaW5lcikKCQly ZXR1cm4ganNjc3MoJ3RvZ2dsZScsIGdhbGxlcnlDb250YWluZXIsICdkaXNwbGF5 LW5vbmUnKTsKCgl2YXIgZ2FsbGVyeVJlcXVlc3QgPSBodHRwcmVxX3N0cmluZyh0 aGlzLmdldEF0dHJpYnV0ZSgncmVxdWVzdCcpLCBudWxsLCBudWxsLCBmYWxzZSk7 Cgl2YXIgc2l6ZSA9IDE4MDsKCglpZihnYWxsZXJ5UmVxdWVzdC5nZXRSZXNwb25z ZUhlYWRlcignWC1FcnJvcm1lc3NhZ2UnKSkKCXsKCQlhbGVydCggZ2FsbGVyeVJl cXVlc3QuZ2V0UmVzcG9uc2VIZWFkZXIoJ1gtRXJyb3JtZXNzYWdlJykgKTsKCQly ZXR1cm4gdHJ1ZTsKCX0KCgl2YXIgY29udGFpbmVyID0gZ2V0RWxlbWVudEZyb21Y SFIoZ2FsbGVyeVJlcXVlc3QsICdkaXYjY29yZScpOwoJdmFyIGl0ZW1zID0gbmV3 IERPTVF1ZXJ5KCdkaXYubWVzc2FnZS1jb250ZW50LWNvbnRlbnQgaW1nLnJtbCcs IGNvbnRhaW5lcik7CgoJaWYoaXRlbXMubGVuZ3RoID09IDApCgkJcmV0dXJuOwoK CXZhciBjb2xsZWN0aW9uID0gW107Cglmb3IodmFyIGkgPSAwLCBpdGVtLCByYXRp bywgcHJlbG9hZGVkSW1hZ2U7KGl0ZW0gPSBpdGVtcy5nZXQoaSkpOyBpKyspCgl7 CgkJanNjc3MoJ2FkZCcsIGl0ZW0sICdkaXNwbGF5LW5vbmUnKTsKCgkJaXRlbS5z ZXRBdHRyaWJ1dGUoJ21heHdpZHRoJywgc2l6ZSk7CgkJaXRlbS5zZXRBdHRyaWJ1 dGUoJ21heGhlaWdodCcsIHNpemUpOwoKCQlhZGRFdmVudChpdGVtLCAnbG9hZCcs IHNjYWxlSW1hZ2UpOwoKCQljb2xsZWN0aW9uLnB1c2goIGNyZWF0ZURPTU5vZGUo J2xpJywge30sIFsgaXRlbSBdKSApOwoJfQoKCWlmKGNvbGxlY3Rpb24ubGVuZ3Ro ID09IDApCgkJcmV0dXJuOwoKCXZhciBnYWxsZXJ5Q29udGFpbmVyID0gY3JlYXRl RE9NTm9kZSgnZGl2JywgeydjbGFzcycgOiAnaW1hZ2UtZ2FsbGVyeSd9LAoJWwoJ CWNyZWF0ZURPTU5vZGUoJ2gzJywge30sIFsgZ2V0VGV4dCgnZXh0cmEnLCAnc2hv d19nYWxsZXJ5X2hlYWRlcicpIF0pLAoJCWNyZWF0ZURPTU5vZGUoJ29sJywge30s IGNvbGxlY3Rpb24pCgldKTsKCXZhciBjb250YWluZXIgPSBnZXRTaWJsaW5nTm9k ZSh0aGlzLCAndXAnLCAnZGl2Jyk7Cgljb250YWluZXIucGFyZW50Tm9kZS5hcHBl bmRDaGlsZChnYWxsZXJ5Q29udGFpbmVyKTsKfTsKCmZ1bmN0aW9uIHhoclBhZ2lu YXRpb24odGFyZ2V0cykKewoJaWYoWydsaXN0X21lc3NhZ2UnLCAnbGlzdF9tZXNz YWdlcyddLmluZGV4T2YoYm9hcmRfYWN0aW9uKSA9PSAtMSkKCQlyZXR1cm47CgoJ YWRkRXZlbnRUb1RhcmdldHModGFyZ2V0cywgJ2NsaWNrJywgX3hoclBhZ2luYXRp b24sICdkbC50b3BpYy1uYXZpZ2F0aW9uIGRkIGEnKTsKfTsKCmZ1bmN0aW9uIF94 aHJQYWdpbmF0aW9uKGUpCnsKCWlmKFsnbGFzdCddLmluZGV4T2YodGhpcy5nZXRB dHRyaWJ1dGUoJ3JlbCcpKSA+IC0xIHx8IGRvY3VtZW50LmxvY2F0aW9uLnBhdGhu YW1lLm1hdGNoKC9saXN0X21lc3NhZ2VzXC9bMC05XStcL2xhc3QvKSApIC8qIHdl IGRvbid0IGhhbmRsZSAnbGFzdCcgY2F1c2UgaXQncyAic3BlY2lhbCIgKi8KCQly ZXR1cm47CgoJaWYoIWFyZ3VtZW50cy5jYWxsZWUuaW5pdGlhbFBhZ2UpCgl7CgkJ LyogZGV0ZXJtaW5lIHRoZSBwYWdlIGN1cnJlbnRseSBzaG93biAqLwoJCWFyZ3Vt ZW50cy5jYWxsZWUuaW5pdGlhbFBhZ2UgPSBwYXJzZUludChuZXcgRE9NUXVlcnko J2RsLnRvcGljLW5hdmlnYXRpb24gZGQgYS5jdXJyZW50LXBhZ2UnKS5nZXQoMCku aHJlZi5tYXRjaCgvbGlzdF9tZXNzYWdlc1wvWzAtOV0rXC8oWzAtOV0rKS8pWzFd KSArIDE7CgkJYXJndW1lbnRzLmNhbGxlZS50b3RhbFBhZ2VzID0gcGFyc2VJbnQo bmV3IERPTVF1ZXJ5KCdkbC50b3BpYy1uYXZpZ2F0aW9uJykuZ2V0KDApLmNsYXNz TmFtZS5tYXRjaCgvcGFnZXMtKFswLTldKykvKVsxXSk7CgkJbmV3IERPTVF1ZXJ5 KCdvbC5tZXNzYWdlcycpLmdldCgwKS5zZXRBdHRyaWJ1dGUoJ3BhZ2UnLCBhcmd1 bWVudHMuY2FsbGVlLmluaXRpYWxQYWdlKTsKCX0KCglpZihqc2NzcygnY2hlY2sn LCB0aGlzLCAncGxhY2Vob2xkZXInKSkKCXsKCQl2YXIgdGhpc1BhZ2UgPSB0aGlz LmdldEF0dHJpYnV0ZSgncGFnZScpOwoJfQoJZWxzZQoJewoJCXZhciB0aGlzUGFn ZSA9IHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJykubWF0Y2goL2xp c3RfbWVzc2FnZXNcL1swLTldK1wvKFswLTldKykvKVsxXSkgKyAxOwoJfQoKCWlm KHRoaXNQYWdlIC0gMSA+PSBhcmd1bWVudHMuY2FsbGVlLnRvdGFsUGFnZXMgfHwg bmV3IERPTVF1ZXJ5KCdvbC5tZXNzYWdlc1twYWdlPSInK3RoaXNQYWdlKyciXScp LmdldCgwKSkgLy8gZHVwbGljYXRlIHJlcXVlc3QgLyBvdXQtb2YtYm91bmRzCgl7 CgkJZSAmJiBlLnByZXZlbnREZWZhdWx0KCk7CgkJcmV0dXJuOwoJfQoKCXZhciBy ZXF1ZXN0ID0gaHR0cHJlcV9zdHJpbmcoJycsIG51bGwsIHRoaXMuZ2V0QXR0cmli dXRlKCdocmVmJyksIGZhbHNlLCAiR0VUIik7Cgl2YXIgbWVzc2FnZXMgPSBnZXRF bGVtZW50RnJvbVhIUihyZXF1ZXN0LCAnb2wubWVzc2FnZXMnKTsKCXZhciB0aGlz UGFnZSA9IHBhcnNlSW50KGdldEVsZW1lbnRGcm9tWEhSKHJlcXVlc3QsICdkbC50 b3BpYy1uYXZpZ2F0aW9uIGRkIGEuY3VycmVudC1wYWdlJykuaHJlZi5tYXRjaCgv bGlzdF9tZXNzYWdlc1wvWzAtOV0rXC8oWzAtOV0rKS8pWzFdKSArIDE7CglpZigh bWVzc2FnZXMpIC8vIHNob3VsZCB3ZSBzaG93IHgtZXJyb3JtZXNzYWdlPwoJCXJl dHVybjsKCgkvLyBmaWxsIGJsYW5rcwoJdmFyIGNvbnRhaW5lcnMgPSBuZXcgRE9N UXVlcnkoJ29sLm1lc3NhZ2VzJyk7Cgl2YXIgcGxhY2Vob2xkZXJzID0gW107Cglp Zih0aGlzUGFnZSA+IGFyZ3VtZW50cy5jYWxsZWUuaW5pdGlhbFBhZ2UpIC8qIHdl J3JlIHBhZ2luZyBhaGVhZCAqLwoJewoJCXZhciBsYXN0Q29udGFpbmVyID0gY29u dGFpbmVycy5nZXQoY29udGFpbmVycy5sZW5ndGggLSAxKTsKCQkvKiB3ZSdyZSBz a2lwcGluZyB0aGUgY3VycmVudCBsYXN0UGFnZUF2YWlsYWJsZSBhbmQgZG8gY3Jl YXRlIG9uZSBmb3IgdGhlIHRoaXNQYWdlIGFzIHdlJ2xsIG5lZWQgdGhlIHJlZmVy ZW5jZSBsYXRlciAqLwoJCWZvcih2YXIgaSA9IHBhcnNlSW50KGxhc3RDb250YWlu ZXIuZ2V0QXR0cmlidXRlKCdwYWdlJykpICsgMTsgaSA8PSB0aGlzUGFnZTsgaSsr KQoJCXsKCQkJcGxhY2Vob2xkZXJzLnB1c2goIGNyZWF0ZURPTU5vZGUoJ3AnLCB7 J2NsYXNzJyA6ICdwbGFjZWhvbGRlciBjbGlja2FibGUnLCAncGFnZScgOiBpLCAn ZXZlbnQnIDogWydjbGljaycsIGFyZ3VtZW50cy5jYWxsZWVdLCAnaHJlZicgOiB0 aGlzLmhyZWYucmVwbGFjZSgvKGxpc3RfbWVzc2FnZXNcL1swLTldK1wvKShbMC05 XSspLywgJyQxJyArIChpLTEpICkgfSwgWydTa2lwcGVkIHBhZ2U6ICcgKyBpXSkg KTsKCQl9CgoJCS8vIGFwcGVuZCB0aGUgcGxhY2Vob2xkZXJzCgkJaWYocGxhY2Vo b2xkZXJzLmxlbmd0aCkKCQl7CgkJCWxhc3RDb250YWluZXIucGFyZW50Tm9kZS5p bnNlcnRCZWZvcmUoIGNyZWF0ZURPTU5vZGUobnVsbCwge30sIHBsYWNlaG9sZGVy cyksIGxhc3RDb250YWluZXIubmV4dFNpYmxpbmcgKTsKCQl9Cgl9CgllbHNlIC8q IHdlJ3JlIHBhZ2luZyBiYWNrd2FyZHMgKi8KCXsKCQl2YXIgZmlyc3RDb250YWlu ZXIgPSBjb250YWluZXJzLmdldCgwKTsKCQkvKiB3ZSdyZSBza2lwcGluZyB0aGUg Y3VycmVudCBsYXN0UGFnZUF2YWlsYWJsZSBhbmQgZG8gY3JlYXRlIG9uZSBmb3Ig dGhlIHRoaXNQYWdlIGFzIHdlJ2xsIG5lZWQgdGhlIHJlZmVyZW5jZSBsYXRlciAq LwoJCWZvcih2YXIgaSA9IHBhcnNlSW50KGZpcnN0Q29udGFpbmVyLmdldEF0dHJp YnV0ZSgncGFnZScpKSAtIDE7IGkgPj0gdGhpc1BhZ2U7IGktLSkKCQl7CgkJCXBs YWNlaG9sZGVycy51bnNoaWZ0KCBjcmVhdGVET01Ob2RlKCdwJywgeydjbGFzcycg OiAncGxhY2Vob2xkZXIgY2xpY2thYmxlJywgJ3BhZ2UnIDogaSwgJ2V2ZW50JyA6 IFsnY2xpY2snLCBhcmd1bWVudHMuY2FsbGVlXSwgJ2hyZWYnIDogdGhpcy5ocmVm LnJlcGxhY2UoLyhsaXN0X21lc3NhZ2VzXC9bMC05XStcLykoWzAtOV0rKS8sICck MScgKyAoaS0xKSApIH0sIFsnU2tpcHBlZCBwYWdlOiAnICsgaV0pICk7CgkJfQoK CQkvLyBwcmVwZW5kIHRoZSBwbGFjZWhvbGRlcnMKCQlpZihwbGFjZWhvbGRlcnMu bGVuZ3RoKQoJCXsKCQkJZmlyc3RDb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRC ZWZvcmUoIGNyZWF0ZURPTU5vZGUobnVsbCwge30sIHBsYWNlaG9sZGVycyksIGZp cnN0Q29udGFpbmVyLnByZXZpb3VzU2libGluZyApOwoJCX0KCX0KCgl2YXIgcGxh Y2Vob2xkZXIgPSBuZXcgRE9NUXVlcnkoJ3AucGxhY2Vob2xkZXJbcGFnZT0iJyt0 aGlzUGFnZSsnIl0nKS5nZXQoMCk7CglpZighcGxhY2Vob2xkZXIpIC8qIHNvbWV0 aGluZyB3ZW50IHBlYXJzaGFwZWQgKi8KCQlyZXR1cm47CgoJbWVzc2FnZXMuc2V0 QXR0cmlidXRlKCdwYWdlJywgdGhpc1BhZ2UpOwoJcGxhY2Vob2xkZXIucGFyZW50 Tm9kZS5pbnNlcnRCZWZvcmUobWVzc2FnZXMsIHBsYWNlaG9sZGVyKTsKCXBsYWNl aG9sZGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocGxhY2Vob2xkZXIpOwoKCXZh ciBuZXh0TGlua3MgPSBuZXcgRE9NUXVlcnkoJ2RsLnRvcGljLW5hdmlnYXRpb24g ZGQgYVtyZWw9Im5leHQiXScpOwoJZm9yKHZhciBpID0gMCwgbmV4dExpbms7IChu ZXh0TGluayA9IG5leHRMaW5rcy5nZXQoaSkpOyBpKyspCgl7CgkJbmV4dExpbmsu aHJlZiA9IG5leHRMaW5rLmhyZWYucmVwbGFjZSgvKGxpc3RfbWVzc2FnZXNcL1sw LTldK1wvKShbMC05XSspLywgJyQxJyArIHRoaXNQYWdlICkKCX0KCgl2YXIgY3Vy cmVudFBhZ2VzID0gbmV3IERPTVF1ZXJ5KCdkbC50b3BpYy1uYXZpZ2F0aW9uIGRk IGFbaHJlZio9Imxpc3RfbWVzc2FnZXMvJyt0aGlzLmdldEF0dHJpYnV0ZSgnaHJl ZicpLm1hdGNoKC9saXN0X21lc3NhZ2VzXC8oWzAtOV0rKS8pWzFdKycvJysodGhp c1BhZ2UtMSkrJyJdJyk7Cglmb3IodmFyIGkgPSAwLCBjdXJyZW50UGFnZTsgKGN1 cnJlbnRQYWdlID0gY3VycmVudFBhZ2VzLmdldChpKSk7IGkrKykKCXsKCQlqc2Nz cygnYWRkJywgY3VycmVudFBhZ2UsICdjdXJyZW50LXBhZ2UnKTsKCX0KCglpZiht ZXNzYWdlcy5zY3JvbGxJbnRvVmlldykKCQltZXNzYWdlcy5zY3JvbGxJbnRvVmll dygpOwoKCV9pbml0KGV2ZW50cywgbWVzc2FnZXMpOwoJZSAmJiBlLnByZXZlbnRE ZWZhdWx0KCk7CgkvKmlmKGV2ZW50cy5pbmRleE9mKHBhZ2VJbmRpY2F0b3IpID4g LTEpCgl7CgkJdXBkYXRlUGFnZUluZGljYXRvcigpOwoJfSovCn07CgoKLyogdGhp cyBpcyBVTkZJTklTSEVEICovCmZ1bmN0aW9uIHBhZ2VJbmRpY2F0b3IoKQp7Cglp Zihhcmd1bWVudHMuY2FsbGVlLmluaXRpYWxSdW4pCgkJcmV0dXJuOwoKCWRvY3Vt ZW50LmJvZHkuYXBwZW5kQ2hpbGQoCgkJY3JlYXRlRE9NTm9kZSgnZGl2Jywgeydp ZCcgOiAnY29udGFpbmVyJywgJ3N0eWxlJyA6ICd3aWR0aDogNTBweDsgaGVpZ2h0 OiAyMDBweDsgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IHBvc2l0aW9uOiBhYnNv bHV0ZTsgdG9wOiAwOyBsZWZ0OiAyNzVweDsnfSwgWwoJCV0pCgkpOwoKCXVwZGF0 ZVBhZ2VJbmRpY2F0b3IoKTsKCWFyZ3VtZW50cy5jYWxsZWUuaW5pdGlhbFJ1biA9 IHRydWU7Cn0KCmZ1bmN0aW9uIHVwZGF0ZVBhZ2VJbmRpY2F0b3IoKQp7Cgl2YXIg Y29udGFpbmVyID0gbmV3IERPTVF1ZXJ5KCdkaXYjY29udGFpbmVyJykuZ2V0KDAp OwoJd2hpbGUoY29udGFpbmVyLmZpcnN0Q2hpbGQpCgkJY29udGFpbmVyLnJlbW92 ZUNoaWxkKGNvbnRhaW5lci5maXJzdENoaWxkKTsKCgl2YXIgbWVzc2FnZUNvdW50 ID0gMTM7IC8vIHNob3VsZCBiZSBkeW5hbWljCgl2YXIgcGVyUGFnZSA9IDU7IC8v IHNob3VsZCBiZSBkeW5hbWljCgoJdmFyIGNvbnRhaW5lckhlaWdodCA9IGN1cnJl bnRTdHlsZShjb250YWluZXIsICdoZWlnaHQnKTsKCXZhciBwZXJQaXhlbCA9IGNv bnRhaW5lckhlaWdodCAvIG1lc3NhZ2VDb3VudDsKCgl2YXIgYXZhaWxhYmxlUGFn ZSA9IGNyZWF0ZURPTU5vZGUoJ2RpdicsIHsnY2xhc3MnIDogJ3ZpZXdwb3J0Jywg J3N0eWxlJyA6ICd3aWR0aDogNDhweDsgaGVpZ2h0OiAwOyBib3JkZXI6IDFweCBz b2xpZCByZWQ7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyBi YWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7IG9wYWNpdHk6IC42J30sIFtdKTsKCXZh ciBpdGVtcyA9IG5ldyBET01RdWVyeSgnb2wubWVzc2FnZXMnKTsKCWZvcih2YXIg aSA9IDAsIGl0ZW07IChpdGVtID0gaXRlbXMuZ2V0KGkpKTsgaSsrKQoJewoJCXZh ciBtZXNzYWdlc1Zpc2libGUgPSBuZXcgRE9NUXVlcnkoJ2xpLm1lc3NhZ2UnLCBp dGVtKS5sZW5ndGg7CgkJdmFyIGN1cnJlbnRQYWdlID0gcGFyc2VJbnQoaXRlbS5n ZXRBdHRyaWJ1dGUoJ3BhZ2UnKSk7CgkJaWYoIWN1cnJlbnRQYWdlKSAvLyB0aGlz IG9ubHkgaGFwcGVucyB3aGVuIHNvbWVvbmUgaGFzIG5vdCBleGVjdXRlZCBfeGhy UGFnaW5hdGlvbgoJCXsKCQkJY3VycmVudFBhZ2UgPSBwYXJzZUludChuZXcgRE9N UXVlcnkoJ2RsLnRvcGljLW5hdmlnYXRpb24gZGQgYS5jdXJyZW50LXBhZ2UnKS5n ZXQoMCkuaHJlZi5tYXRjaCgvbGlzdF9tZXNzYWdlc1wvWzAtOV0rXC8oWzAtOV0r KS8pWzFdKSArIDE7CgkJfQoKCQl2YXIgY2xvbmUgPSBhdmFpbGFibGVQYWdlLmNs b25lTm9kZSh0cnVlKTsKCQljbG9uZS5zdHlsZS5oZWlnaHQgPSBNYXRoLmZsb29y KG1lc3NhZ2VzVmlzaWJsZSAqIHBlclBpeGVsKSArICdweCc7CgkJY2xvbmUuc3R5 bGUudG9wID0gTWF0aC5mbG9vcigoY3VycmVudFBhZ2UgLSAxKSAqIHBlclBhZ2Ug KiBwZXJQaXhlbCkgKyAncHgnOwoKCQljb250YWluZXIuYXBwZW5kQ2hpbGQoY2xv bmUpOwoJfQoKCXZhciB2aWV3cG9ydCA9IGNyZWF0ZURPTU5vZGUoJ2RpdicsIHsn Y2xhc3MnIDogJ3ZpZXdwb3J0JywgJ3N0eWxlJyA6ICd3aWR0aDogNDhweDsgaGVp Z2h0OiAwOyBib3JkZXI6IDFweCBzb2xpZCByZWQ7IHBvc2l0aW9uOiBhYnNvbHV0 ZTsgdG9wOiAwOyBsZWZ0OiAwOyBiYWNrZ3JvdW5kLWNvbG9yOiBibHVlOyBvcGFj aXR5OiAuNyd9LCBbXSk7Cgl2aWV3cG9ydC5zdHlsZS5oZWlnaHQgPSAzMCArICdw eCc7Cgljb250YWluZXIuYXBwZW5kQ2hpbGQodmlld3BvcnQpOwp9CgpmdW5jdGlv biBzaXRlc3RhdChuc19sKQp7Cgluc19sKz0nJmFtcDtuc19fdD0nKyhuZXcgRGF0 ZSgpKS5nZXRUaW1lKCk7Cgluc19waXhlbFVybD1uc19sOwoJbnNfMD1kb2N1bWVu dC5yZWZlcnJlcjsKCW5zXzA9KG5zXzAubGFzdEluZGV4T2YoJy8nKSA9PSBuc18w Lmxlbmd0aC0xICkgPyBuc18wLnN1YnN0cmluZyhuc18wLmxhc3RJbmRleE9mKCcv JyksMCkgOiBuc18wOwoJaWYobnNfMC5sZW5ndGg+MCkKCQluc19sKz0nJmFtcDtu c19yZWZlcnJlcj0nK2VzY2FwZShuc18wKTsKCWlmKGRvY3VtZW50LmltYWdlcykK CXsKCQluc18xPW5ldyBJbWFnZSgpO25zXzEuc3JjPW5zX2w7Cgl9CgllbHNlCgkJ ZG9jdW1lbnQud3JpdGUoJzxpbWcgc3JjPSInK25zX2wrJyIgd2lkdGg9IjEiIGhl aWdodD0iMSIgYWx0PSIiPicpOwp9CnZhciBkb2N1bWVudHNfZGF0YSA9IEFycmF5 KCk7CgpmdW5jdGlvbiBzY3JvbGxUb0FuY2hvcigpCnsKCWlmICghbG9jYXRpb24u aGFzaCkKCQlyZXR1cm47CgoJdmFyIGxpbmsgICAgICAgICAgPSBsb2NhdGlvbi5o YXNoLnN1YnN0cigxKTsKCglpZiAoIWxpbmsubWF0Y2goL15bMC05YS16XSskLykp Cgl7CgkJcmV0dXJuOwoJfQoKCXZhciBlbGVtZW50ICAgICAgID0gbmV3IERPTVF1 ZXJ5KCJhIyIgK2xpbmsgKTsKCXZhciBzY3JvbGxFbGVtZW50ID0gZWxlbWVudC5n ZXQoMCk7CgoJaWYgKCFzY3JvbGxFbGVtZW50KQoJCXJldHVybjsKCglhZGRFdmVu dCgKCQl3aW5kb3csCgkJJ2xvYWQnLAoJCWZ1bmN0aW9uKCkgeyBzY3JvbGxFbGVt ZW50LnNjcm9sbEludG9WaWV3KCk7IH0KCSk7Cn0KCmZ1bmN0aW9uIGxvZ2luRm9y bSgpCnsKCS8qIGNoZWNrcyBpZiBmaWVsZCBpc24ndCBmaWxsZWQgYnkgYnJvd3Nl cidzIGF1dG9jb21wbGV0ZSBmZWF0dXJlICovCgl2YXIgZiA9IG5ldyBET01RdWVy eSgnaW5wdXQjcXVpY2stbG9naW4tZm9ybS11c2VyJykuZ2V0KDApOwoKCWlmKGYg JiYgZi52YWx1ZSA9PSAnJykKCXsKCQlmLnZhbHVlID0gZ2V0VGV4dCgnZm9ybXMn LCAndXNlcm5hbWUnKTsKCQlhZGRFdmVudChmLCAnZm9jdXMnLCBfY2xlYXJGaWVs ZFNldFR5cGVQYXNzd29yZCk7Cgl9CgoJZiA9IG5ldyBET01RdWVyeSgnaW5wdXQj cXVpY2stbG9naW4tZm9ybS1wYXNzd29yZCcpLmdldCgwKTsKCglpZihmICYmIGYu dmFsdWUgPT0gJycpCgl7CgkJdHJ5CgkJewoJCQlmLnR5cGUgPSAndGV4dCc7CgkJ fQoJCWNhdGNoKGUpCgkJewoJCQk7CgkJfQoJCWYuZGVmYXVsdFZhbHVlID0gZ2V0 VGV4dCgnZm9ybXMnLCAncGFzc3dvcmQnKTsKCgkJYWRkRXZlbnQoIGYsICdjbGlj aycsIF9jbGVhckZpZWxkU2V0VHlwZVBhc3N3b3JkKTsKCQlhZGRFdmVudCggZiwg J2ZvY3VzJywgX2NsZWFyRmllbGRTZXRUeXBlUGFzc3dvcmQpOwoJfQp9OwoKZnVu Y3Rpb24gX2NsZWFyRmllbGRTZXRUeXBlUGFzc3dvcmQoKQp7Cgl2YXIgcGFzc3dv cmRfaW5wdXQgPSBuZXcgRE9NUXVlcnkoJ2lucHV0I3F1aWNrLWxvZ2luLWZvcm0t cGFzc3dvcmQnKS5nZXQoMCk7Cgl2YXIgdXNlcm5hbWVfaW5wdXQgPSBuZXcgRE9N UXVlcnkoJ2lucHV0I3F1aWNrLWxvZ2luLWZvcm0tdXNlcicpLmdldCgwKTsKCglp ZiAoIHVzZXJuYW1lX2lucHV0LnZhbHVlICE9IGdldFRleHQoJ2Zvcm1zJywgJ3Vz ZXJuYW1lJykgKQoJCXJldHVybjsKCgl0cnkKCXsKCQkgcGFzc3dvcmRfaW5wdXQu dmFsdWUgPSAnJzsgcGFzc3dvcmRfaW5wdXQudHlwZSA9ICdwYXNzd29yZCc7Cgl9 CgljYXRjaChlKQoJewoJCTsKCX0KCXVzZXJuYW1lX2lucHV0LnZhbHVlID0gJyc7 Cn07CgpmdW5jdGlvbiBib2FyZEZvcnVtUHVsbGRvd24oKQp7CglpZih0aGlzLnRh Z05hbWUudG9Mb3dlckNhc2UoKSAhPSAnc2VsZWN0JykKCQlyZXR1cm47CgoJaWYo TnVtYmVyKHRoaXMudmFsdWUpID4gMCkKCXsKCQlkb2N1bWVudC5sb2NhdGlvbi5o cmVmID0gIGJvYXJkX3NjcmlwdF91cmwgKycvbGlzdF90b3BpY3MvJyArIHRoaXMu dmFsdWU7Cgl9CgllbHNlIGlmKHRoaXMudmFsdWUgIT0gJycpCgl7CgkJZG9jdW1l bnQubG9jYXRpb24uaHJlZiA9IHRoaXMudmFsdWU7Cgl9Cn07CgpmdW5jdGlvbiBj cmVhdGVGb290ZXIoKQp7Cgl2YXIgZm9vdGVyID0gbmV3IERPTVF1ZXJ5KCdkaXYj Zm9vdGVyJykuZ2V0KDApOwoKCWlmICghZm9vdGVyKQoJCXJldHVybjsKCgkvKiBB ZGQgUlNTIGxpbmsgKi8KCXZhciBpdGVtID0gbmV3IERPTVF1ZXJ5KCdoZWFkIGxp bmtbdHlwZT0iYXBwbGljYXRpb24vcnNzK3htbCJdJyk7CgoJaWYoaXRlbS5sZW5n dGggPiAwKQoJewoJCXZhciByc3MgPSBpdGVtLmdldCgwKTsKCgkJdmFyIGEgPSBj cmVhdGVET01Ob2RlKCdhJywgeyJocmVmIiA6IHJzcy5ocmVmLCAidHlwZSIgOiBy c3MudHlwZSwgInRpdGxlIiA6IHJzcy50aXRsZSwgImNsYXNzIiA6ICdyc3MtbGlu ayd9LCBbJ1JTUyddKTsKCgkJZm9vdGVyLmluc2VydEJlZm9yZShhLCBmb290ZXIu Zmlyc3RDaGlsZCk7Cgl9CgoJdmFyIGZvcm0gPSBuZXcgRE9NUXVlcnkoJ2RpdiNu YXZpZ2F0aW9uIGZvcm0nKTsKCWlmKGZvcm0ubGVuZ3RoID4gMCkKCXsKCQlmb290 ZXIuaW5zZXJ0QmVmb3JlKGZvcm0uZ2V0KDApLmNsb25lTm9kZSh0cnVlKSwgZm9v dGVyLmZpcnN0Q2hpbGQpOwoJfQp9OwoKZnVuY3Rpb24gdG9waWNOYXZpZ2F0aW9u UHVsbGRvd24odGFyZ2V0cykKewoJYWRkRXZlbnRUb1RhcmdldHModGFyZ2V0cywg J3N1Ym1pdCcsIGZ1bmN0aW9uKCl7IHJldHVybiBfaGFuZGxlVG9waWNOYXZpZ2F0 aW9uUHVsbGRvd24odGhpcyk7fSwgJ2Zvcm0udG9waWMtbmF2aWdhdGlvbicpOwoJ YWRkRXZlbnRUb1RhcmdldHModGFyZ2V0cywgJ2NoYW5nZScsIGZ1bmN0aW9uKCl7 IHJldHVybiBfaGFuZGxlVG9waWNOYXZpZ2F0aW9uUHVsbGRvd24odGhpcy5mb3Jt KTt9LCAnZm9ybS50b3BpYy1uYXZpZ2F0aW9uIHNlbGVjdCcpOwp9OwoKZnVuY3Rp b24gX2hhbmRsZVRvcGljTmF2aWdhdGlvblB1bGxkb3duKGZvcm0pCnsKCWRvY3Vt ZW50LmxvY2F0aW9uLmhyZWYgPSBmb3JtLmF0dHJpYnV0ZXNbJ2FjdGlvbiddLnZh bHVlICsgZm9ybS5lbGVtZW50c1snYWN0aW9uJ10udmFsdWUgKycvJysgZm9ybS5l bGVtZW50c1snZGF0YVt0b3BpY2lkXSddLnZhbHVlICsnLycrIGZvcm0uZWxlbWVu dHNbJ2RhdGFbb2Zmc2V0XSddLnZhbHVlOwoJcmV0dXJuIGZhbHNlOwp9OwoKZnVu Y3Rpb24gcHVsbGRvd25BdXRvU3VibWl0cyh0YXJnZXRzKQp7CglhZGRFdmVudFRv VGFyZ2V0cyh0YXJnZXRzLCAnY2hhbmdlJywgX2hhbmRsZVB1bGxEb3ducywgJ3Nl bGVjdC5mYXEtbGlzdCwgZm9ybS50b3BpYy1uYXZpZ2F0aW9uIHNlbGVjdCwgZm9y bSNtb3JlLXRvcGljIHNlbGVjdCwgc2VsZWN0I2NhbGVuZGFyLXNlbGVjdC1kYXRl LCBzZWxlY3QucGFnZS1kcm9wZG93bicpOwoJYWRkRXZlbnRUb1RhcmdldHMobnVs bCwgJ2NoYW5nZScsIGJvYXJkRm9ydW1QdWxsZG93biwgJ3NlbGVjdC5qdW1wLXRv LWFjdGlvbicpOwp9OwoKZnVuY3Rpb24gX2hhbmRsZVB1bGxEb3ducygpCnsKCWlm KHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICdzZWxlY3QnKQoJCXRoaXMu Zm9ybS5zdWJtaXQoKTsKfTsKCmZ1bmN0aW9uIHRvZ2dsZUF1dGhvckxpbmtzKHRh cmdldHMpCnsKCXZhciBpdGVtcyA9IGdldFRhcmdldHModGFyZ2V0cywgJ29sLm1l c3NhZ2VzIGRpdi5hdXRob3Itbmlja25hbWUnKTsKCglpZihpdGVtcy5sZW5ndGgg PT0gMCkKCQlyZXR1cm47CgoJZm9yKHZhciBpID0gMCwgaXRlbTsgKGl0ZW09aXRl bXMuZ2V0KGkpKTsgaSsrKQoJewoJCWFkZEV2ZW50KGl0ZW0sICdjbGljaycsIF90 b2dnbGVBdXRob3JMaW5rcyk7CgkJanNjc3MoJ2FkZCcsIGl0ZW0sICdhdXRob3It bGlua3MtdG9nZ2xlJywgJycpOwoJfQp9OwoKZnVuY3Rpb24gX3RvZ2dsZUF1dGhv ckxpbmtzKCkKewoJdmFyIGl0ZW0gPSBuZXcgRE9NUXVlcnkoJ3VsLmF1dGhvci1s aW5rcycsIGdldFNpYmxpbmdOb2RlKHRoaXMsICd1cCcsICdsaScpKS5nZXQoMCk7 CgoJaWYgKGl0ZW0pCgl7CgkJanNjc3MoJ3RvZ2dsZScsIGl0ZW0sICdhdXRob3It bGlua3MtZXhwYW5kZWQnKTsKCX0KCWpzY3NzKCd0b2dnbGUnLCB0aGlzLCAnYXV0 aG9yLWxpbmtzLXRvZ2dsZS1vcGVuJyk7Cn07CgpmdW5jdGlvbiBmb2xsb3dUb3Bp Y0xpbmtzKCkKewoJdmFyIHN1Yml0ZW1zID0gbmV3IERPTVF1ZXJ5KCdhJywgdGhp cyk7CglpZihzdWJpdGVtcy5sZW5ndGggPT0gMSkKCXsKCQl3aW5kb3cubG9jYXRp b24uaHJlZiA9IHN1Yml0ZW1zLmdldCgwKS5ocmVmOwoJfQp9Cgp2YXIgdG9nZ2xl VmlzaWJpbGl0eUNvb2tpZTsKZnVuY3Rpb24gdG9nZ2xlVmlzaWJpbGl0eSh0YXJn ZXRzKQp7Cgl2YXIgaXRlbXMgPSBnZXRUYXJnZXRzKAoJCXRhcmdldHMsCgkJJ2gz W2lkXSArIGZpZWxkc2V0LCBoM1tpZF0gKyBkbC5wcm9wZXJ0eS1saXN0LCB0cltp ZF0uY2F0ZWdvcnktbmFtZSB0ZCwgZGl2LmV4dHJhLWFjdGlvbnMgdWwgbGkjZm9y dW0tdGFnY2xvdWQsIGRpdi5kaXNjdXNzaW9uLWZvbGRlcnMgdWwuZm9sZGVycyBs aVtpZF0nCgkpOwoKCWlmKGl0ZW1zLmxlbmd0aCA9PSAwKQoJCXJldHVybjsKCgln ZXRUb2dnbGVWaXNpYmlsaXR5Q29va2llKCk7CgoJZm9yKHZhciBpID0gMCwgaXRl bTsoaXRlbT1pdGVtcy5nZXQoaSkpO2krKykKCXsKCQlzd2l0Y2goaXRlbS50YWdO YW1lLnRvTG93ZXJDYXNlKCkpCgkJewoJCQljYXNlICdsaSc6CgkJCWNhc2UgJ3Rk JzoKCQkJCWFkZEV2ZW50KGl0ZW0sICdjbGljaycsIF90b2dnbGVWaXNpYmlsaXR5 KTsKCQkJCWpzY3NzKCdhZGQnLGl0ZW0sJ3RvZ2dsZS1pY29uJywnJyk7CgoJCQkJ aWYodG9nZ2xlVmlzaWJpbGl0eUNvb2tpZS5pbmRleE9mKGl0ZW0udGFnTmFtZS50 b0xvd2VyQ2FzZSgpID09ICdsaScgPyBpdGVtLmlkIDogaXRlbS5wYXJlbnROb2Rl LmlkKSA+IC0xKQoJCQkJCV90b2dnbGVWaXNpYmlsaXR5KHRydWUsIGl0ZW0pOwoJ CQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWFkZEV2ZW50KGl0ZW0ucHJldmlvdXNT aWJsaW5nLCAnY2xpY2snLCBfdG9nZ2xlVmlzaWJpbGl0eSk7CgkJCQlqc2Nzcygn YWRkJyxpdGVtLnByZXZpb3VzU2libGluZywndG9nZ2xlLWljb24nLCcnKTsKCgkJ CQlpZih0b2dnbGVWaXNpYmlsaXR5Q29va2llLmluZGV4T2YoaXRlbS5wcmV2aW91 c1NpYmxpbmcuaWQpID4gLTEpCgkJCQkJX3RvZ2dsZVZpc2liaWxpdHkodHJ1ZSwg aXRlbS5wcmV2aW91c1NpYmxpbmcpOwoJCQlicmVhazsKCQl9Cgl9Cn07CgpmdW5j dGlvbiBfdG9nZ2xlVmlzaWJpbGl0eShpbml0LCB4KQp7CglpZih0eXBlb2YgeCA9 PSAndW5kZWZpbmVkJykKCQl4ID0gdGhpczsKCgkvKiBkb24ndCB0b2dnbGUgd2hl biB0aGUgdXNlciBjbGlja3MgYSBsaW5rICovCglpZih0eXBlb2YgaW5pdCA9PSAn b2JqZWN0JykKCXsKCQl2YXIgdGFyZ2V0ID0gaW5pdC5zcmNFbGVtZW50IHx8IGlu aXQudGFyZ2V0OwoJCWlmKHRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0g J2EnKQoJCQlyZXR1cm47Cgl9CgoJdmFyIHRhZ25hbWUgPSB4LnRhZ05hbWUudG9M b3dlckNhc2UoKTsKCglpZih0YWduYW1lID09ICd0ZCcpCgl7CgkJaWYoaW5pdCAh PSB0cnVlKQoJCQlzdG9yZVRvZ2dsZVZpc2liaWxpdHkoeC5wYXJlbnROb2RlLmlk LCBqc2NzcygnY2hlY2snLCB4LCAndG9nZ2xlLWFsdGVybmF0ZS1pY29uJykpOwoK CQl2YXIgbm9kZSA9IHgucGFyZW50Tm9kZTsKCgkJd2hpbGUoIG5vZGUubmV4dFNp YmxpbmcgJiYgKG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKSAmJiAhanNjc3MoJ2No ZWNrJywgbm9kZSwgJ2NhdGVnb3J5LW5hbWUnKSApCgkJewoJCQlqc2NzcygndG9n Z2xlJywgbm9kZSwgJ2Rpc3BsYXktbm9uZScsJycpOwoJCX0KCX0KCWVsc2UKCXsK CQlpZihpbml0ICE9IHRydWUpCgkJewoJCQlzdG9yZVRvZ2dsZVZpc2liaWxpdHko eC5pZCwganNjc3MoJ2NoZWNrJywgeCwgJ3RvZ2dsZS1hbHRlcm5hdGUtaWNvbicp KTsKCQl9CgoJCWlmKHRhZ25hbWUgPT0gJ2xpJykKCQl7CgkJCWpzY3NzKCd0b2dn bGUnLCB4LCAnZGlzcGxheS1uby1jaGlsZHMnKTsKCQl9CgkJZWxzZQoJCXsKCQkJ anNjc3MoJ3RvZ2dsZScsIHgubmV4dFNpYmxpbmcsICdkaXNwbGF5LW5vbmUnLCcn KTsKCQl9Cgl9CgoJaWYodHlwZW9mIGluaXQgPT0gJ29iamVjdCcpCgl7CgkJaW5p dC5zdG9wUHJvcGFnYXRpb24oKTsKCX0KCglqc2NzcygndG9nZ2xlJywgeCwgJ3Rv Z2dsZS1hbHRlcm5hdGUtaWNvbicsJycpOwoKCXJldHVybjsKfTsKCmZ1bmN0aW9u IHN0b3JlVG9nZ2xlVmlzaWJpbGl0eSh4LCBkZWwpCnsKCXRvZ2dsZVZpc2liaWxp dHlDb29raWUgPSB0b2dnbGVWaXNpYmlsaXR5Q29va2llLmdldFVuaXF1ZSgpOwoK CWlmKHRvZ2dsZVZpc2liaWxpdHlDb29raWUuaW5kZXhPZih4KSA+IC0xICYmIGRl bCkKCXsKCQl2YXIgbmV3Q29va2llID0gW107CgkJZm9yKHZhciBpPTAsIGl0ZW07 KGl0ZW09dG9nZ2xlVmlzaWJpbGl0eUNvb2tpZVtpXSk7aSsrKQoJCXsKCQkJaWYo IGl0ZW0gIT0geCApCgkJCQluZXdDb29raWUucHVzaChpdGVtKTsKCQl9CgoJCXRv Z2dsZVZpc2liaWxpdHlDb29raWUgPSBuZXdDb29raWU7Cgl9CgllbHNlCgl7CgkJ aWYgKHRvZ2dsZVZpc2liaWxpdHlDb29raWUuaW5kZXhPZih4KSA9PSAtMSkKCQkJ dG9nZ2xlVmlzaWJpbGl0eUNvb2tpZS5wdXNoKHgpOwoJfQoKCXNldENvb2tpZSgn dG9nZ2xlJywgdG9nZ2xlVmlzaWJpbGl0eUNvb2tpZS5qb2luKCc6JykpOwp9OwoK ZnVuY3Rpb24gZ2V0VG9nZ2xlVmlzaWJpbGl0eUNvb2tpZSgpCnsKCXZhciBjID0g Z2V0Q29va2llKCd0b2dnbGUnKTsKCXRvZ2dsZVZpc2liaWxpdHlDb29raWUgPSBb XTsKCglpZihjKQoJCXRvZ2dsZVZpc2liaWxpdHlDb29raWUgPSBjLnNwbGl0KCc6 Jyk7Cn07CgpmdW5jdGlvbiBkaXNhYmxlZE9wdGlvbigpCnsKCWlmKGpzY3NzKCdj aGVjaycsIHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLCAnZGlzYWJs ZWQnLCAnJykpCgl7CgkJdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7CgkJYWxlcnQo Z2V0VGV4dCgnbm9ybWFsJywgJ2Rpc2FibGVkX29wdGlvbicpKTsKCX0KfTsKCmZ1 bmN0aW9uIGZpeEJyb3dzZXJJc3N1ZXMoY29udGV4dE5vZGUpCnsKCXZhciBpID0g MCwgaXRlbXMsIGl0ZW07CgoJaWYoYm9hcmRfYWN0aW9uID09ICdlcnJvcl9nZW5l cmFsJykKCXsKCQl2YXIgcmVmZXJlbmNlID0gbmV3IERPTVF1ZXJ5KCd1bC5lcnJv ci1saW5rcyBsaS5ob21lJykuZ2V0KDApOwoJCWlmKHJlZmVyZW5jZSkKCQl7CgkJ CXJlZmVyZW5jZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKAoJCQkJY3JlYXRlRE9N Tm9kZSgnbGknLCB7ImNsYXNzIiA6ICJiYWNrIn0sIFsKCQkJCQljcmVhdGVET01O b2RlKCdzcGFuJywgeyJjbGFzcyIgOiAiY2xpY2thYmxlIiwgImV2ZW50IiA6IFsn Y2xpY2snLCBmdW5jdGlvbigpIHsgaGlzdG9yeS5nbygtMSk7fV0gfSwgWyBnZXRU ZXh0KCdub3JtYWwnLCAnYmFjaycpIF0pCgkJCQldKQoJCQkpOwoJCX0KCX0KCglp Zihpc0lFKQoJewoJCWl0ZW1zID0gbmV3IERPTVF1ZXJ5KCdkdC5yZXF1aXJlZCcs IGNvbnRleHROb2RlKTsKCQl2YXIgcmVxID0gbnVsbDsKCQlmb3IoaSA9IDA7KGl0 ZW09aXRlbXMuZ2V0KGkpKTtpKyspCgkJewoJCQlyZXEgPSBjcmVhdGVET01Ob2Rl KCdzcGFuJywgeyJjbGFzcyIgOiAncmVxdWlyZWQnfSwgWycgKiddKTsKCQkJaXRl bS5hcHBlbmRDaGlsZChyZXEpOwoJCX0KCgkJaXRlbXMgPSBuZXcgRE9NUXVlcnko J2J1dHRvbicsIGNvbnRleHROb2RlKTsKCQlmb3IoaSA9IDAgOyAoaXRlbT1pdGVt cy5nZXQoaSkpO2krKykKCQl7CgkJCWFkZEV2ZW50KGl0ZW0sICdjbGljaycsIGZ1 bmN0aW9uKCkKCQkJewoJCQkJdGhpcy52YWx1ZSA9IHRoaXMuYXR0cmlidXRlc1sn dmFsdWUnXS52YWx1ZTsKCQkJCWlmKGlzTm90SUU3ICYmIHRoaXMudHlwZSA9PSAn c3VibWl0JykKCQkJCS8qCgkJCQkJaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQw MS9pbnRlcmFjdC9mb3Jtcy5odG1sI2gtMTcuMTMuMgoJCQkJCSJJZiBhIGZvcm0g Y29udGFpbnMgbW9yZSB0aGFuIG9uZSBzdWJtaXQgYnV0dG9uLCBvbmx5IHRoZSBh Y3RpdmF0ZWQgc3VibWl0IGJ1dHRvbiBpcyBzdWNjZXNzZnVsLiIKCQkJCQlJRTYg ZG9lc24ndCBjYXJlIGFuZCBzZW5kcyBvdGhlciBzdWJtaXQgYnV0dG9ucyBhcyB3 ZWxsIDp8CgkJCQkgKi8KCQkJCXsKCQkJCQl2YXIgZm9ybSA9IGdldFNpYmxpbmdO b2RlKHRoaXMsICd1cCcsICdmb3JtJyk7CgkJCQkJaWYoZm9ybSkKCQkJCQl7CgkJ CQkJCXZhciBpdGVtcyA9IG5ldyBET01RdWVyeSgnYnV0dG9uW3R5cGU9c3VibWl0 XScsIGZvcm0pOwoJCQkJCQlmb3IodmFyIGkgPSAwLCBpdGVtIDsgKGl0ZW09aXRl bXMuZ2V0KGkpKTtpKyspCgkJCQkJCXsKCQkJCQkJCWlmKGl0ZW0gIT0gdGhpcykK CQkJCQkJCQlpdGVtLmRpc2FibGVkID0gdHJ1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJ CX0KCQkJfSk7CgkJfQoKCQkvKiBJRSBoYXMgcHJvYmxlbXMgd2l0aCB1bmljb2Rl IGNoYXJhY3RlcnMgaW4gZm9ybXMgd2l0aCAnbXVsdGlwYXJ0JyBlbmNvZGluZwoJ CSAgIEl0ICdpZ25vcmVzJyB0aGUgZmlyc3QgaW5wdXQgZmllbGQsIHNvIHdlIGFk ZCBhIGJvZ3VzIG9uZSBmb3IgSUUgdG8gZm9yZ2V0ICovCgkJaXRlbXMgPSBuZXcg RE9NUXVlcnkoJ2Zvcm0nLCBjb250ZXh0Tm9kZSk7CgkJZm9yKGkgPSAwIDsgKGl0 ZW09aXRlbXMuZ2V0KGkpKTtpKyspCgkJewoJCQlpZih0eXBlb2YgaXRlbSA9PSAn dW5kZWZpbmVkJykKCQkJCWNvbnRpbnVlOwoKCQkJaWYgKCB0eXBlb2YgaXRlbS5l bmN0eXBlICE9ICd1bmRlZmluZWQnICYmIGl0ZW0uZW5jdHlwZSA9PSAnbXVsdGlw YXJ0L2Zvcm0tZGF0YScgKQoJCQl7CgkJCQl2YXIgaW5wdXQgPSBjcmVhdGVET01O b2RlKCdpbnB1dCcsIHsidHlwZSIgOiAnaGlkZGVuJywgIm5hbWUiIDogJ2llLWR1 bW15J30sIFtdKTsKCgkJCQlpZiAoIGl0ZW0uZWxlbWVudHNbMF0gKQoJCQkJCWl0 ZW0uaW5zZXJ0QmVmb3JlKGlucHV0LCBpdGVtLmVsZW1lbnRzWzBdKTsKCQkJCWVs c2UKCQkJCQlpdGVtLmluc2VydEJlZm9yZShpbnB1dCk7CgkJCX0KCQl9CgoJCXZh ciBkaXNhYmxlZCA9IG5ldyBET01RdWVyeSgib3B0aW9uW2Rpc2FibGVkXSIsIGNv bnRleHROb2RlKSwgaiwgcGFyZW50LCBwYXJlbnRzID0gW107CgkJZm9yKGkgPSAw OyhpdGVtPWRpc2FibGVkLmdldChpKSk7aSsrKQoJCXsKCQkJanNjc3MoJ2FkZCcs IGl0ZW0sICdkaXNhYmxlZCcsICcnKTsKCQkJcGFyZW50ID0gZ2V0U2libGluZ05v ZGUoaXRlbSwgJ3VwJywgJ3NlbGVjdCcpOwoKCQkJaWYocGFyZW50cy5pbmRleE9m KHBhcmVudCkgPCAwKQoJCQl7CgkJCQlhZGRFdmVudChwYXJlbnQsICdjaGFuZ2Un LCBkaXNhYmxlZE9wdGlvbik7CgoJCQkJaWYoanNjc3MoJ2NoZWNrJywgcGFyZW50 Lm9wdGlvbnNbcGFyZW50LnNlbGVjdGVkSW5kZXhdLCAnZGlzYWJsZWQnKSkKCQkJ CQlwYXJlbnQuc2VsZWN0ZWRJbmRleCA9IC0xOwoKCQkJCXBhcmVudHMucHVzaChw YXJlbnQpOwoJCQl9CgkJfQoJCXBhcmVudHMgPSBudWxsOwoJfQoKCWlmKGlzSUUg JiYgaXNOb3RJRTcpCgl7CgkJLy8gTVNJRSBjYW4ndCBoYW5kbGUgZmlyc3QtY2hp bGQvbGFzdC1jaGlsZCwgc28gbGV0J3MgZml4IGl0IG91cnNlbGZzLAoJCS8vIGlu Y2x1ZGluZyBzb21lIG90aGVyIHNlbGVjdG9ycyBhbmRlciA6YWZ0ZXIgZml4ZXMK CQlhZGRDbGFzc1RvVGFyZ2V0cygnZGl2LmFjdGlvbi1oZWFkZXIgb2wgbGk6Zmly c3QtY2hpbGQsIGRpdiNuYXZpZ2F0aW9uIGxpOmZpcnN0LWNoaWxkLCBkaXYjd2Vs Y29tZS10ZXh0IGxpOmZpcnN0LWNoaWxkLCB1bC5jYWxlbmRhci1uYXZpZ2F0aW9u LXVwIGxpOmZpcnN0LWNoaWxkJywgJ2ZpcnN0LWNoaWxkJywgY29udGV4dE5vZGUp OwoJCWFkZENsYXNzVG9UYXJnZXRzKCdmb3JtIC5hZHZhbmNlZC1vcHRpb24gKyAq LCBmb3JtIGR0LmFkdmFuY2VkLW9wdGlvbiArICogKyBkZC5kZC1zZXF1ZW5jZSwg Zm9ybSBkdC5hZHZhbmNlZC1vcHRpb24gKyAqICsgZGQuZGQtc2VxdWVuY2UgKyBk ZC5kZC1zZXF1ZW5jZScsICdhZHZhbmNlZC1vcHRpb24tYWRqYWNlbnQnLCBjb250 ZXh0Tm9kZSk7CgkJYWRkQ2xhc3NUb1RhcmdldHMoJ2Rpdi5ybWx0b29sYmFyICsg dGV4dGFyZWEjcm1sX3RleHRhcmVhJywgJ2FkamFjZW50JywgY29udGV4dE5vZGUp OwoKCQlpdGVtcyA9IG5ldyBET01RdWVyeSgnaW5wdXQnLCBjb250ZXh0Tm9kZSk7 CgkJZm9yKGk9MDsgKGl0ZW09aXRlbXMuZ2V0KGkpKTtpKyspCgkJewoJCQlqc2Nz cygnYWRkJywgaXRlbSwgaXRlbS50eXBlKTsKCQl9CgoJCWFkZENsYXNzVG9UYXJn ZXRzKCdkZC5wb2xsLXJlc3VsdCBzcGFuID4gc3BhbicsICdzdWInLCBjb250ZXh0 Tm9kZSk7CgkJYWRkQ2xhc3NUb1RhcmdldHMoJ2R0OmZpcnN0LWNoaWxkICsgZGQg KyBkZC5wb2xsLXJlc3VsdCBzcGFuJywgJ2ZpcnN0JywgY29udGV4dE5vZGUpOwoK CQl2YXIgX3RvZ2dsZUFkdmFuY2VkT3B0aW9ucyA9IHRvZ2dsZUFkdmFuY2VkT3B0 aW9uczsKCQkvKiBwcmV2ZW50IHJlcGFpbnQgcHJvYmxlbXMgaW4gSUU2ICovCgkJ dG9nZ2xlQWR2YW5jZWRPcHRpb25zID0gZnVuY3Rpb24oKQoJCXsKCQkJZG9jdW1l bnQuYm9keS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwoJCQkgX3RvZ2dsZUFkdmFu Y2VkT3B0aW9ucygpOwoJCQlkb2N1bWVudC5ib2R5LnN0eWxlLmRpc3BsYXkgPSAn YmxvY2snOwoJCX0KCX0KCWVsc2UgaWYoaXNXZWJLaXQpCgl7CgkJLy8gZmFuY3lm eSB0aGUgc2VhcmNoZmllbGRzOyBtYWtlICdtIHByZXR0eQoJCWl0ZW1zID0gbmV3 IERPTVF1ZXJ5KCdpbnB1dC5zZWFyY2hmaWVsZCcsIGNvbnRleHROb2RlKTsKCQl2 YXIgYSA9IGNyZWF0ZURPTU5vZGUoJ2EnLCB7ImhyZWYiIDogYm9hcmRfc2NyaXB0 X3VybH0sIFtdKTsKCQlmb3IoaSA9IDA7IChpdGVtPWl0ZW1zLmdldChpKSk7aSsr KQoJCXsKCQkJaXRlbS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnc2VhcmNoJyk7CgoJ CQkvLyBhcHBsZSBwcmVmZXJzIGEgbmwucmVhY3Qud3d3LnNlYXJjaCBzeW50YXgK CQkJaXRlbS5zZXRBdHRyaWJ1dGUoJ2F1dG9zYXZlJywgYS5ob3N0LnNwbGl0KCcu JykucmV2ZXJzZSgpLmpvaW4oJy4nKSsnLnNlYXJjaCcpOwoJCQlpdGVtLnNldEF0 dHJpYnV0ZSgncmVzdWx0cycsIDUpOwoJCQlpdGVtLnNldEF0dHJpYnV0ZSgncGxh Y2Vob2xkZXInLCBnZXRUZXh0KCdub3JtYWwnLCAnc2VhcmNoX3dlYmtpdCcpICk7 CgkJfQoKCQkvLyBGaXggYSBmbG93LXJlbmRlciBwcm9ibGVtCgkJaXRlbXMgPSBu ZXcgRE9NUXVlcnkoJ2RpdiNjb250ZW50LCBkaXYjZm9vdGVyJywgY29udGV4dE5v ZGUpOwoJCWZvcihpID0gMDsgKGl0ZW09aXRlbXMuZ2V0KGkpKTtpKyspCgkJCWl0 ZW0uc3R5bGUub3ZlcmZsb3cgPSAndmlzaWJsZSc7Cgl9Cn07CgpmdW5jdGlvbiBh dHRhY2hSTUxUb29sYmFyKHRhcmdldHMpCnsKCXZhciBybWx0ZXh0YXJlYXMgPSBn ZXRUYXJnZXRzKHRhcmdldHMsICd0ZXh0YXJlYSNybWxfdGV4dGFyZWEnKTsKCglp ZihybWx0ZXh0YXJlYXMubGVuZ3RoID09IDApCgkJcmV0dXJuOwoKCWZvcih2YXIg aSA9IDAsIGl0ZW07IChpdGVtPXJtbHRleHRhcmVhcy5nZXQoaSkpO2krKykKCXsK CQlpdGVtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGdldFRvb2xiYXIoYm9hcmRf ZG9jdW1lbnRsaWJyYXJ5X2FsbG93ZWQpLCBpdGVtKTsKCQlpZihpc0lFKQoJCXsK CQkJYWRkRXZlbnQoaXRlbSwgJ2NsaWNrJywgc3RvcmVDdXJzb3IpOwoJCQlhZGRF dmVudChpdGVtLCAna2V5dXAnLCBzdG9yZUN1cnNvcik7CgkJCWFkZEV2ZW50KGl0 ZW0sICdzZWxlY3QnLCBzdG9yZUN1cnNvcik7CgkJfQoJfQoKCS8qIGRpcnR5IElF IGhhY2sgdG8gZm9yY2UgcmVmbG93ICovCglpZihybWx0ZXh0YXJlYXMubGVuZ3Ro ID4gMCAmJiBpc0lFKQoJewoJCWRvY3VtZW50LmJvZHkuc3R5bGUuZGlzcGxheSA9 ICdub25lJzsKCQlkb2N1bWVudC5ib2R5LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2sn OwoJfQp9OwoKZnVuY3Rpb24gbG9nb3V0U2Vzc2lvbnModGFyZ2V0cykKewoJaWYo Ym9hcmRfYWN0aW9uICE9ICdsb2dvdXQnKQoJCXJldHVybjsKCgl2YXIgc2Vzc2lv bnMgPSBnZXRUYXJnZXRzKHRhcmdldHMsICdpbnB1dFt0eXBlPSJjaGVja2JveCJd Jyk7CgoJZm9yKHZhciBpPTAsIGl0ZW07IChpdGVtPXNlc3Npb25zLmdldChpKSk7 IGkrKykKCXsKCQlhZGRFdmVudChpdGVtLCAnY2hhbmdlJywgX2xvZ291dFNlc3Np b25zKTsKCQlhZGRFdmVudChpdGVtLCAnY2xpY2snLCBfbG9nb3V0U2Vzc2lvbnMp OwoJfQp9OwoKZnVuY3Rpb24gX2xvZ291dFNlc3Npb25zKCkKewoJdmFyIGxvZ291 dE9wdGlvbnMgPSBuZXcgRE9NUXVlcnkoJ2Zvcm0jZm9ybS1sb2dvdXQgaW5wdXRb dHlwZT0icmFkaW8iXScpLCBsb2dvdXRCeVNlc3Npb24gPSBuZXcgRE9NUXVlcnko J2lucHV0I2xvZ291dF9ieV9zZXNzaW9uJyk7CgoJZm9yKHZhciBpPTAsIGl0ZW07 IChpdGVtPWxvZ291dE9wdGlvbnMuZ2V0KGkpKTtpKyspCgl7CgkJaXRlbS5jaGVj a2VkID0gZmFsc2U7Cgl9CgoJbG9nb3V0QnlTZXNzaW9uLmdldCgwKS5jaGVja2Vk ID0gdHJ1ZTsKfTsKCmZ1bmN0aW9uIHNldHVwVG9nZ2xlRm9sZGVycygpCnsKCXZh ciBtZW51ID0gbmV3IERPTVF1ZXJ5KCdkaXYuZGlzY3Vzc2lvbi1mb2xkZXJzIGxp Jyk7CgoJaWYobWVudS5sZW5ndGggPT0gMSkKCXsKCQlhZGRFdmVudChtZW51Lmdl dCgwKSwgJ2NsaWNrJywgdG9nZ2xlRm9sZGVycyk7Cgl9Cn07CgpmdW5jdGlvbiB0 b2dnbGVGb2xkZXJzKGUpCnsKCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgoJdmFyIGNo aWxkcyA9IG5ldyBET01RdWVyeSgndWwnLCB0aGlzKTsKCglpZihjaGlsZHMubGVu Z3RoID4gMCkKCXsKCQlqc2NzcygndG9nZ2xlJywgdGhpcywgJ2FjdGl2ZScpOwoJ fQp9OwoKZnVuY3Rpb24gdG9nZ2xlVGFnY2xvdWRPdmVyZmxvdyhlKQp7Cgl2YXIg dGFnY2xvdWQgPSBuZXcgRE9NUXVlcnkoJ2xpLmZvcnVtLXRhZ2Nsb3VkIGRpdicp LmdldCgwKTsKCWlmKCF0YWdjbG91ZCkKCQlyZXR1cm47CgoJaWYgKG5ldyBET01R dWVyeSgnYScsIHRhZ2Nsb3VkKS5sZW5ndGggPCAxMCkKCQlyZXR1cm47CgoJdmFy IG1vcmUgPSBjcmVhdGVET01Ob2RlKCdzcGFuJywgeydldmVudCcgOiBbJ2NsaWNr JywgZnVuY3Rpb24oZSkgeyBqc2NzcygndG9nZ2xlJywgdGFnY2xvdWQsICdzaG93 LWFsbCcpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB9XSB9LCBbICcgJyArIGdldFRl eHQoJ25vcm1hbCcsICdtb3JlJykgXSk7CgoJdGFnY2xvdWQuYXBwZW5kQ2hpbGQo bW9yZSk7Cn07CgovKiB1c2VkIGZvciBxdW90ZWluZyBtZXNzYWdlcyB0byB0ZXh0 YXJlYSAqLwp2YXIgcmF3X21lc3NhZ2VzID0gW107CnZhciBmb3JtUmVxdWlyZWRG aWVsZHNET01RdWVyeSA9ICdkdC5yZXF1aXJlZCArIGRkIGlucHV0LCBkdC5yZXF1 aXJlZCArIGRkIHRleHRhcmVhLCBkdC5yZXF1aXJlZCArIGRkIHNlbGVjdCwgZHRb Y2xhc3NePSJyZXF1aXJlcy1pZC0iXSArIGRkIGlucHV0LCBkdFtjbGFzc149InJl cXVpcmVzLWlkLSJdICsgZGQgdGV4dGFyZWEsIGR0W2NsYXNzXj0icmVxdWlyZXMt aWQtIl0gKyBkZCBzZWxlY3QnOwp2YXIgZm9ybVZhbGlkYXRlRmllbGRzRE9NUXVl cnkgPSBmb3JtUmVxdWlyZWRGaWVsZHNET01RdWVyeSArICcsIGlucHV0W2NsYXNz Xj0idmFsaWRhdGUtIl0sIGlucHV0I3B3ZDIsIGlucHV0I2tleXdvcmRzJzsKdmFy IGZvY3VzYWJsZUVsZW1lbnRzOwoKZnVuY3Rpb24gZm9jdXNGaXJzdEZvcm1GaWVs ZCh0YXJnZXRzKQp7Cglmb2N1c2FibGVFbGVtZW50cyA9IGdldFRhcmdldHModGFy Z2V0cywgJ2lucHV0LmZvY3VzYWJsZSwgdGV4dGFyZWEuZm9jdXNhYmxlJyk7CgoJ aWYoZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoID4gMCkKCXsKCQlzZXRUaW1lb3V0 KCJmb2N1c2FibGVFbGVtZW50cy5nZXQoMCkuZm9jdXMoKTsiLCAxMDApOwoJfQp9 OwoKZnVuY3Rpb24gdmFsaWRhdGVGb3Jtcyh0YXJnZXRzKQp7Cgl2YXIgaXRlbXMg PSBnZXRUYXJnZXRzKHRhcmdldHMsICdmb3JtJyk7CgoJaWYoaXRlbXMubGVuZ3Ro ID09IDApCgkJcmV0dXJuOwoKCWZvcih2YXIgaSA9IDAsIGl0ZW07IChpdGVtPWl0 ZW1zLmdldChpKSk7aSsrKQoJewoJCWFkZEV2ZW50KGl0ZW0sICdzdWJtaXQnLCBm dW5jdGlvbihlKSB7IGlmKCF2YWxpZGF0ZUZvcm0odGhpcykpIHsgZS5wcmV2ZW50 RGVmYXVsdCgpOyB9IH0gKTsKCX0KCglpdGVtcyA9IG5ldyBET01RdWVyeShmb3Jt UmVxdWlyZWRGaWVsZHNET01RdWVyeSk7CglpZihpdGVtcy5sZW5ndGggPiAwKQoJ ewoJCXZhciB0ZXh0ID0gbmV3IERPTVF1ZXJ5KCdkaXYjYWN0aW9uLWhlYWRlciBw JyksIHA7CgoJCWlmKHRleHQubGVuZ3RoID4gMCkKCQl7CgkJCXAgPSB0ZXh0Lmdl dCgwKTsKCQkJcC5hcHBlbmRDaGlsZCgKCQkJCWNyZWF0ZURPTU5vZGUobnVsbCwg e30sCgkJCQlbCgkJCQkJY3JlYXRlRE9NTm9kZSgnYnInLCB7fSwgWyBdKSwKCQkJ CQljcmVhdGVET01Ob2RlKCdzcGFuJywge30sIFsgZ2V0VGV4dCgnZm9ybXMnLCAn bWFya2VkX2ZpZWxkcycpIF0pLAoJCQkJCWNyZWF0ZURPTU5vZGUoJ3NwYW4nLCB7 ImNsYXNzIiA6J3JlcXVpcmVkJ30sIFsnKiddKSwKCQkJCQljcmVhdGVET01Ob2Rl KCdzcGFuJywge30sIFsgZ2V0VGV4dCgnZm9ybXMnLCAncmVxdWlyZWQnKSBdKQoJ CQkJXSkKCQkJKTsKCQl9CgkJZWxzZQoJCXsKCQkJcCA9IGNyZWF0ZURPTU5vZGUo J3AnLCB7fSwKCQkJCVsKCQkJCQljcmVhdGVET01Ob2RlKCdzcGFuJywge30sIFsg Z2V0VGV4dCgnZm9ybXMnLCAnbWFya2VkX2ZpZWxkcycpIF0pLAoJCQkJCWNyZWF0 ZURPTU5vZGUoJ3NwYW4nLCB7ImNsYXNzIiA6J3JlcXVpcmVkJ30sIFsnKiddKSwK CQkJCQljcmVhdGVET01Ob2RlKCdzcGFuJywge30sIFsgZ2V0VGV4dCgnZm9ybXMn LCAncmVxdWlyZWQnKSBdKQoJCQkJXQoJCQkpOwoKCQkJdmFyIGgyID0gbmV3IERP TVF1ZXJ5KCdkaXYjYWN0aW9uLWhlYWRlciBoMicpLmdldCgwKTsKCQkJaWYoaDIp CgkJCQloMi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShwLCBoMik7CgkJfQoJfQoK CWl0ZW1zID0gbmV3IERPTVF1ZXJ5KGZvcm1WYWxpZGF0ZUZpZWxkc0RPTVF1ZXJ5 KTsKCWZvcih2YXIgaiA9IDA7IChpdGVtPWl0ZW1zLmdldChqKSk7aisrKQoJewoJ CWFkZEV2ZW50KGl0ZW0sICdjaGFuZ2UnLCBmdW5jdGlvbigpIHsgdmFsaWRhdGVG aWVsZCh0aGlzKTsgfSAgKTsKCX0KfTsKCmZ1bmN0aW9uIGhpZGVBZHZhbmNlZE9w dGlvbnModGFyZ2V0cykKewoJdmFyIGFkdmFuY2VkT3B0aW9ucyA9IGdldFRhcmdl dHModGFyZ2V0cywgJ2R0LmFkdmFuY2VkLW9wdGlvbicpOwoKCWlmKGZvcm1zX3No b3dfYWR2YW5jZWRfb3B0aW9ucykKCXsKCQlqc2NzcygnYWRkJywgZG9jdW1lbnQu Ym9keSwgJ3Nob3ctYWR2YW5jZWQtb3B0aW9ucycsICcnKTsKCX0KCWVsc2UgaWYo YWR2YW5jZWRPcHRpb25zLmxlbmd0aCA+IDApCgl7CgkJaWYoKG5ldyBET01RdWVy eSgnc3BhbiN0b2dnbGUtYWR2YW5jZWQtb3B0aW9ucycsIGRvY3VtZW50KSkubGVu Z3RoID09IDApCgkJewoJCQl2YXIgcCA9IG5ldyBET01RdWVyeSgnZGl2I2FjdGlv bi1oZWFkZXIgcCcsIGRvY3VtZW50KS5nZXQoMCk7CgkJCWlmKCFwKQoJCQl7CgkJ CQlwID0gY3JlYXRlRE9NTm9kZSgncCcsIHt9LCBbXSk7CgkJCQl2YXIgaDIgPSBu ZXcgRE9NUXVlcnkoJ2RpdiNhY3Rpb24taGVhZGVyIGgyJywgZG9jdW1lbnQpLmdl dCgwKTsKCQkJCWlmKCFoMikKCQkJCQlyZXR1cm47CgoJCQkJaDIucGFyZW50Tm9k ZS5pbnNlcnRCZWZvcmUocCwgaDIpOwoJCQl9CgoJCQlwLmFwcGVuZENoaWxkKAoJ CQkJY3JlYXRlRE9NTm9kZShudWxsLCB7fSwKCQkJCVsKCQkJCQljcmVhdGVET01O b2RlKCdicicsIHt9LCBbIF0pLAoJCQkJCWNyZWF0ZURPTU5vZGUoJ3NwYW4nLAoJ CQkJCQkJewoJCQkJCQkJCSdldmVudCcgOiBbJ2NsaWNrJywgdG9nZ2xlQWR2YW5j ZWRPcHRpb25zXSwKCQkJCQkJCQknaWQnIAk6ICd0b2dnbGUtYWR2YW5jZWQtb3B0 aW9ucycsCgkJCQkJCQkJJ2NsYXNzJyA6ICdjbGlja2FibGUnLAoJCQkJCQkJCSdu YW1lJwk6ICdzaG93QWR2YW5jZWRPcHRpb25zJwoJCQkJCQkJfSwKCQkJCQkJCVsg Z2V0VGV4dCgnZm9ybXMnLCAnc2hvd19hZHZhbmNlZF9vcHRpb25zJykgXQoJCQkJ CSkKCQkJCV0pCgkJCSk7CgkJfQoKCQlpZihkb2N1bWVudC5sb2NhdGlvbi5oYXNo ID09ICcjc2hvd0FkdmFuY2VkT3B0aW9ucycpCgkJewoJCQl0b2dnbGVBZHZhbmNl ZE9wdGlvbnMoKTsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUFkdmFuY2VkT3B0 aW9ucygpCnsKCXZhciBpdGVtcyA9IG5ldyBET01RdWVyeSgnZm9ybScpOwoKCWlm KGl0ZW1zLmxlbmd0aCA9PSAwKQoJCXJldHVybjsKCgl2YXIgaW5kaWNhdG9yID0g bmV3IERPTVF1ZXJ5KCdzcGFuI3RvZ2dsZS1hZHZhbmNlZC1vcHRpb25zJykuZ2V0 KDApOwoKCWlmICghaW5kaWNhdG9yKQoJCXJldHVybjsKCglmb3IodmFyIGk9MCwg aXRlbTsgKGl0ZW09aXRlbXMuZ2V0KGkpKTsgaSsrKQoJewoJCWpzY3NzKCd0b2dn bGUnLCBpdGVtLCAnc2hvdy1hZHZhbmNlZC1vcHRpb25zJyk7CgkJaWYoanNjc3Mo J2NoZWNrJywgaXRlbSwgJ3Nob3ctYWR2YW5jZWQtb3B0aW9ucycpKQoJCXsKCQkJ aWYoaXNJRSkKCQkJewoJCQkJaXRlbS5hdHRyaWJ1dGVzWydhY3Rpb24nXS52YWx1 ZSA9IGl0ZW0uYXR0cmlidXRlc1snYWN0aW9uJ10udmFsdWUucmVwbGFjZSgvIygu KykkLywgJycpICsgJyNzaG93QWR2YW5jZWRPcHRpb25zJzsKCQkJfQoJCQllbHNl CgkJCXsKCQkJCWl0ZW0uc2V0QXR0cmlidXRlKCdhY3Rpb24nLCBpdGVtLmdldEF0 dHJpYnV0ZSgnYWN0aW9uJykucmVwbGFjZSgvIyguKykkLywgJycpICsgJyNzaG93 QWR2YW5jZWRPcHRpb25zJyk7CgkJCX0KCgkJCWlmKGkgPiAwKQoJCQkJY29udGlu dWU7CgoJCQlpZighaXNJRSkKCQkJCXdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyNz aG93QWR2YW5jZWRPcHRpb25zJzsKCgkJCWluZGljYXRvci5maXJzdENoaWxkLm5v ZGVWYWx1ZSA9IGdldFRleHQoJ2Zvcm1zJywgJ2hpZGVfYWR2YW5jZWRfb3B0aW9u cycpOwoJCX0KCQllbHNlCgkJewoJCQlpZihpc0lFKQoJCQl7CgkJCQlpdGVtLmF0 dHJpYnV0ZXNbJ2FjdGlvbiddLnZhbHVlID0gaXRlbS5hdHRyaWJ1dGVzWydhY3Rp b24nXS52YWx1ZS5yZXBsYWNlKC8jKC4rKSQvLCAnJyk7CgkJCX0KCQkJZWxzZQoJ CQl7CgkJCQlpdGVtLnNldEF0dHJpYnV0ZSgnYWN0aW9uJywgaXRlbS5nZXRBdHRy aWJ1dGUoJ2FjdGlvbicpLnJlcGxhY2UoLyMoLispJC8sICcnKSApOwoJCQl9CgoJ CQlpZihpID4gMCkKCQkJCWNvbnRpbnVlOwoKCQkJaWYoIWlzSUUpCgkJCXsKCQkJ CWlmIChpbmRpY2F0b3IuaWQgPT0gJ3Nob3dBZHZhbmNlZE9wdGlvbnMnKQoJCQkJ CWRvY3VtZW50LmxvY2F0aW9uLmhhc2ggPSBpbmRpY2F0b3IuaWQ7CgkJCQllbHNl CgkJCQkJZG9jdW1lbnQubG9jYXRpb24uaGFzaCA9ICdoaWRlQWR2YW5jZWRPcHRp b25zJzsgLy9Eb2VzIG5vdCBleGlzdCwgYnV0IHNldHRpbmcgdG8gJycgZG9lcyBm dW5reSB0aGluZ3MKCQkJfQoJCQlpbmRpY2F0b3IuZmlyc3RDaGlsZC5ub2RlVmFs dWUgPSBnZXRUZXh0KCdmb3JtcycsICdzaG93X2FkdmFuY2VkX29wdGlvbnMnKTsK CQl9Cgl9Cn07CgoKZnVuY3Rpb24gdmFsaWRhdGVNYXhMZW5ndGgoKQp7CgkvLyBT am9uOiB1aXRnZXNjaGFrZWx0IG5hIG92ZXJsZWcgbWV0IE1pY2hpZWw7IGRpdCB2 b2xkb2V0IG5pZXQgdm9sZG9lbmRlCglyZXR1cm4gZmFsc2U7CgoJaWYodGhpcy50 YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2lucHV0JyAmJiB0eXBlb2YgdGhpcy5t YXhMZW5ndGggIT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5tYXhMZW5ndGggPiAwKQoJ ewoJCWlmKHRoaXMudmFsdWUubGVuZ3RoID09IHRoaXMubWF4TGVuZ3RoKQoJCXsK CQkJYWxlcnRVc2VyKHRoaXMsIGdldFRleHQoJ2Zvcm1zJywgJ21heF9jaGFycycs IHRoaXMubWF4TGVuZ3RoKSk7CgkJfQoJCWVsc2UKCQl7CgkJCXVuQWxlcnRVc2Vy KHRoaXMpOwoJCX0KCX0KfTsKCmZ1bmN0aW9uIHZhbGlkYXRlRm9ybShmb3JtKQp7 Cgl2YXIgaXRlbXMgPSBuZXcgRE9NUXVlcnkoZm9ybVZhbGlkYXRlRmllbGRzRE9N UXVlcnksIGZvcm0pOwoJdmFyIGVycm9ycyA9IGZhbHNlOwoKCWZvciAodmFyIGkg PSAwLCBpdGVtOyAoaXRlbT1pdGVtcy5nZXQoaSkpO2krKykKCXsKCQllcnJvcnMg PSB2YWxpZGF0ZUZpZWxkKGl0ZW0sIHRydWUpIHx8IGVycm9yczsKCX0KCglpZiAo ZXJyb3JzKQoJewoJCXZhciBmaWVsZHMgPSBuZXcgRE9NUXVlcnkoJ2R0LmZpZWxk LWFsZXJ0ICsgZGQgaW5wdXQnKTsKCgkJaWYgKGZpZWxkcy5sZW5ndGggPiAwKQoJ CXsKCQkJaWYgKCFqc2NzcygnY2hlY2snLCBmaWVsZHMuZ2V0KDApLmZvcm0sICdz aG93LWFkdmFuY2VkLW9wdGlvbnMnKSkKCQkJewoJCQkJdmFyIGhpZGRlbkZpZWxk cyA9IG5ldyBET01RdWVyeSgnaDMuYWR2YW5jZWQtb3B0aW9uIGR0LmZpZWxkLWFs ZXJ0ICsgZGQgaW5wdXQsIGR0LmZpZWxkLWFsZXJ0LmFkdmFuY2VkLW9wdGlvbiAr IGRkIGlucHV0Jyk7CgoJCQkJaWYgKGhpZGRlbkZpZWxkcy5sZW5ndGggPiAwKQoJ CQkJCXRvZ2dsZUFkdmFuY2VkT3B0aW9ucygpOwoJCQl9CgoJCQlmaWVsZHMuZ2V0 KDApLmZvY3VzKCk7CgkJfQoJfQoKCXJldHVybiAhZXJyb3JzOwp9OwoKLyoKCXJl dHVybiBmYWxzZSBpcyBmaWVsZCBpcyB2YWxpZAoJcmV0dXJuIHRydWUgaXMgZmll bGQgaXMgbm90IHZhbGlkCiovCmZ1bmN0aW9uIHZhbGlkYXRlRmllbGQob2IsIHJl dCkKewoJdmFyIGZpZWxkID0gdGhpcy50YWdOYW1lID8gIHRoaXMgOiBvYiwgZW1w dHkgPSBmYWxzZTsKCgl1bkFsZXJ0VXNlcihmaWVsZCk7CgoJaWYgKCBqc2Nzcygn Y2hlY2snLCBmaWVsZCwgJ25vdC1yZXF1aXJlZCcpICkKCQlyZXR1cm4gZmFsc2U7 CgoJc3dpdGNoKGZpZWxkLnR5cGUpCgl7CgkJY2FzZSAnc2VsZWN0LW9uZSc6CgkJ Y2FzZSAnc2VsZWN0LW11bHRpcGxlJzoKCQkJZW1wdHkgPSAoZmllbGQuc2VsZWN0 ZWRJbmRleCA9PSAtMSkgfHwgKGZpZWxkLnZhbHVlID09ICcnKSA7CgkJCWJyZWFr OwoJCWNhc2UgJ2NoZWNrYm94JzoKCQkJZW1wdHkgPSAhZmllbGQuY2hlY2tlZDsK CQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJZW1wdHkgPSAoZmllbGQudmFsdWUgPT0g JycgPyB0cnVlIDogZmFsc2UpOwoJCQlicmVhazsKCX0KCglpZighZW1wdHkpCgl7 CgkJc3dpdGNoKGJvYXJkX2FjdGlvbikKCQl7CgkJCWNhc2UgJ2NyZWF0ZV91c2Vy JzoKCQkJY2FzZSAnZWRpdF91c2VyJzoKCQkJCXN3aXRjaChmaWVsZC5pZCkKCQkJ CXsKCQkJCQljYXNlICdwd2QyJzoKCQkJCQkJdmFsaWRhdGVQYXNzd29yZChmaWVs ZCk7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnbmlja25hbWUnOgoJCQkJCQlpZihm aWVsZC52YWx1ZS5sZW5ndGggPCAzKQoJCQkJCQl7CgkJCQkJCQlhbGVydFVzZXIo ZmllbGQsIGdldFRleHQoJ2Zvcm1zJywgJ25hbWVfdG9vX3Nob3J0JykpOwoJCQkJ CQl9CgkJCQkJCWVsc2UgaWYoIXJldCkKCQkJCQkJewoJCQkJCQkJdmFsaWRhdGVO aWNrbmFtZShmaWVsZCk7CgkJCQkJCX0KCQkJCQlicmVhazsKCQkJCQljYXNlICdl bWFpbCc6CgkJCQkJCWlmKCFyZXQpCgkJCQkJCXsKCQkJCQkJCXZhbGlkYXRlRW1h aWwoZmllbGQpOwoJCQkJCQkJdmFsaWRhdGVFbWFpbERvbWFpbihmaWVsZCk7CgkJ CQkJCX0KCQkJCQlicmVhazsKCQkJCX0KCQkJZGVmYXVsdCA6CgkJCQl2YXIgcmVn LCByZXMsIHZhbHVlID0gZmllbGQudmFsdWU7CgoJCQkJaWYoanNjc3MoJ2NoZWNr JywgZmllbGQsICd2YWxpZGF0ZS1lbWFpbCcsICcnKSkKCQkJCXsKCQkJCQlyZWcg PSAvXltcdy1dKyhbXC5cK11bXHctXSspKkAoW1x3LV0rXC4pK1thLXpBLVpdezIs N30kLzsKCQkJCQlyZXMgPSByZWcudGVzdCh2YWx1ZSk7CgkJCQkJaWYoIXJlcykK CQkJCQl7CgkJCQkJCWFsZXJ0VXNlcihmaWVsZCwgZ2V0VGV4dCgnZm9ybXMnLCAn ZW1haWxfaW5jb3JyZWN0JykpOwoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJ CQl9CgkJCQlpZihqc2NzcygnY2hlY2snLCBmaWVsZCwgJ3ZhbGlkYXRlLXVybCcs ICcnKSkKCQkJCXsKCQkJCQlpZiAoanNjc3MoJ2NoZWNrJywgZmllbGQsICduby1o dHRwJywgJycpKQoJCQkJCQlyZWcgPSAvXigoWzAtOV17MSwzfVwuKXszfVswLTld ezEsM318XFsoW2EtZjAtOTpdKylcXXwoWzAtOWEtel8hfionXChcKS1dK1wuKSoo WzAtOWEtel1bMC05YS16LV17MCw2MX0pP1swLTlhLXpdXC5bYS16XXsyLDZ9KShc Lz98KFwvWzAtOWEtel8hfionXChcKVwuOz86QCY9KyQsJSMtXSspK1wvPykkL2k7 CgkJCQkJZWxzZQoJCQkJCQlyZWcgPSAvXihodHRwcz86XC9cLykoKFswLTldezEs M31cLil7M31bMC05XXsxLDN9fFxbKFthLWYwLTk6XSspXF18KFswLTlhLXpfIX4q J1woXCktXStcLikqKFswLTlhLXpdWzAtOWEtei1dezAsNjF9KT9bMC05YS16XVwu W2Etel17Miw2fSkoKFwvPyl8KFwvWzAtOWEtel8hfionXChcKVwuOz86QCY9KyQs JSMtXSspK1wvPykkL2k7CgoJCQkJCXJlcyA9IHJlZy50ZXN0KHZhbHVlKTsKCQkJ CQlpZighcmVzKQoJCQkJCXsKCQkJCQkJYWxlcnRVc2VyKGZpZWxkLCBnZXRUZXh0 KCdmb3JtcycsICd1cmxfaW5jb3JyZWN0JykpOwoJCQkJCQlyZXR1cm4gdHJ1ZTsK CQkJCQl9CgkJCQl9CgkJCQlpZihqc2NzcygnY2hlY2snLCBmaWVsZCwgJ3ZhbGlk YXRlLWludGVnZXInLCAnJykgfHwganNjc3MoJ2NoZWNrJywgZmllbGQsICd2YWxp ZGF0ZS1zb2ZpbnVtbWVyJywgJycpKQoJCQkJewoJCQkJCXJlZyA9IC9eWzAtOV0q JC87CgkJCQkJcmVzID0gcmVnLnRlc3QodmFsdWUpOwoJCQkJCWlmKCFyZXMpCgkJ CQkJewoJCQkJCQlhbGVydFVzZXIoZmllbGQsIGdldFRleHQoJ2Zvcm1zJywgJ251 bWVyaWNfb25seScpKTsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJfQoJ CQkJaWYoanNjc3MoJ2NoZWNrJywgZmllbGQsICd2YWxpZGF0ZS1zb2ZpbnVtbWVy JywgJycpKQoJCQkJewoJCQkJCWlmKHZhbHVlLmxlbmd0aCAhPSA5KQoJCQkJCXsK CQkJCQkJYWxlcnRVc2VyKGZpZWxkLCBnZXRUZXh0KCdmb3JtcycsICdsZW5ndGhf bm90XzknKSk7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCQkvKiBzb3Vy Y2U6IGh0dHA6Ly9jZ2kuZGl0Lm5sL3NvZmkuY2dpICovCgkJCQkJdmFyIHRvdGFs ID0gMDsKCQkJCQlmb3IgKGk9MTsgaTw9ODsgaSsrKQoJCQkJCXsKCQkJCQkJdG90 YWwgKz0gKDEwLWkpICogdmFsdWVbaS0xXTsKCQkJCQl9CgkJCQkJdG90YWwgKz0g KC0xKSAqIHZhbHVlWzhdOwoKCQkJCQlpZiAoKHRvdGFsICUgMTEpID4gMCkKCQkJ CQl7CgkJCQkJCWFsZXJ0VXNlcihmaWVsZCwgZ2V0VGV4dCgnZm9ybXMnLCAnc29m aW51bW1lcl9taXNtYXRjaCcpKTsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJ CQkJfQoKCQkJCXN3aXRjaChmaWVsZC5pZCkKCQkJCXsKCQkJCQljYXNlICdrZXl3 b3Jkcyc6CgkJCQkJCS8qcmVnID0gL1teXHcwLTlfXC0uXS87Ki8KCQkJCQkJdmFy IHZhbHVlcyA9IHZhbHVlLnNwbGl0KCcgJyk7CgkJCQkJCWZvcihpPTA7KHZhbHVl PXZhbHVlc1tpXSk7aSsrKQoJCQkJCQl7CgkJCQkJCQlpZih2YWx1ZS5sZW5ndGgg PiA1MCkKCQkJCQkJCXsKCQkJCQkJCQlhbGVydFVzZXIoZmllbGQsIGdldFRleHQo J2Zvcm1zJywgJ2tleXdvcmRfdG9vX2xvbmcnLCB2YWx1ZSkpOwoJCQkJCQkJCXJl dHVybiB0cnVlOwoJCQkJCQkJfQoKCQkJCQkJCS8qcmVzID0gcmVnLnRlc3QodmFs dWUpOwoJCQkJCQkJaWYocmVzKQoJCQkJCQkJewoJCQkJCQkJCWFsZXJ0VXNlcihm aWVsZCwgZ2V0VGV4dCgnZm9ybXMnLCAna2V5d29yZHNfaWxsZWdhbF9jaGFyYWN0 ZXInLCB2YWx1ZSkpOwoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfSovCgkJ CQkJCX0KCQkJCQlicmVhazsKCQkJCX0KCgkJCQkvLyBJZiB5b3Ugd2FudCBjdXN0 b20tZmllbGQgdmFsaWRhdGlvbiwgY3JlYXRlIGZ1bmN0aW9ucyBhbmQgYWRkIGZ1 bmN0aW9ubmFtZXMgdG8gYXJyYXkgJ2V4dHJhVmFsaWRhdGVGaWVsZHMnCgkJCQlp Zih0eXBlb2YgZXh0cmFWYWxpZGF0ZUZpZWxkcyA9PSAnb2JqZWN0JykKCQkJCXsK CQkJCQlmb3IoaT0wOyBpPGV4dHJhVmFsaWRhdGVGaWVsZHMubGVuZ3RoOyBpKysp CgkJCQkJewoJCQkJCQlleHRyYVZhbGlkYXRlRmllbGRzW2ldKGZpZWxkKTsKCQkJ CQl9CgkJCQl9CgkJCWJyZWFrOwoJCX0KCX0KCgl2YXIgZHRGaWVsZE5hbWUgPSBn ZXRTaWJsaW5nTm9kZShmaWVsZC5wYXJlbnROb2RlLCAncHJldmlvdXMnLCAnZHQn KTsKCWlmKGR0RmllbGROYW1lKQoJewoJCXZhciBpc1JlcXVpcmVkICAgPSBqc2Nz cygnY2hlY2snLCBkdEZpZWxkTmFtZSwgJ3JlcXVpcmVkJyk7CgoJCS8qIE1hcmsg b3RoZXIgZmllbGRzIGFzIHJlcXVpcmVkIHdoZW4gdGhpcyBmaWVsZCBpcyBub3Qg ZW1wdHkgKi8KCQl2YXIgcmVzID0gL3JlcXVpcmVzXC1pZFwtKFthLXowLTlfXSsp L2kuZXhlYyhkdEZpZWxkTmFtZS5jbGFzc05hbWUpOwoJCWlmKHJlcyAmJiByZXNb MF0pCgkJewoJCQl2YXIgaW5wdXRGaWVsZCA9IG5ldyBET01RdWVyeSgnIycgKyBy ZXNbMV0pLmdldCgwKTsKCQkJaWYoaW5wdXRGaWVsZCkKCQkJewoJCQkJaWYoIWVt cHR5KQoJCQkJCWpzY3NzKCdhZGQnLCBnZXRTaWJsaW5nTm9kZShpbnB1dEZpZWxk LnBhcmVudE5vZGUsICdwcmV2aW91cycsICdkdCcpLCAncmVxdWlyZWQnKTsKCQkJ CWVsc2UKCQkJCQlqc2NzcygncmVtb3ZlJywgZ2V0U2libGluZ05vZGUoaW5wdXRG aWVsZC5wYXJlbnROb2RlLCAncHJldmlvdXMnLCAnZHQnKSwgJ3JlcXVpcmVkJyk7 CgoJCQkJcmV0dXJuIHZhbGlkYXRlRmllbGQoaW5wdXRGaWVsZCwgdHJ1ZSk7CgkJ CX0KCQl9Cgl9CgoJaWYgKGVtcHR5ICYmIGlzUmVxdWlyZWQpCgl7CgkJYWxlcnRV c2VyKGZpZWxkLCBnZXRUZXh0KCdmb3JtcycsICdyZXF1aXJlZF9maWVsZCcpKTsK CX0KCWVsc2UgaWYgKGVtcHR5ICYmICFpc1JlcXVpcmVkKQoJewoJCXJldHVybiBm YWxzZTsKCX0KCglpZiAocmV0KQoJCXJldHVybiBlbXB0eTsKfTsKCmZ1bmN0aW9u IGFsZXJ0VXNlcihpbnB1dGZpZWxkLCBzdHIpCnsKCXZhciBkZElucHV0RmllbGQg PSBpbnB1dGZpZWxkLnBhcmVudE5vZGU7Cgl2YXIgZGRFcnJvck1zZyAgID0gZ2V0 U2libGluZ05vZGUoaW5wdXRmaWVsZC5wYXJlbnROb2RlLCAnbmV4dCcsICdkZCcp OwoJdmFyIGR0RmllbGROYW1lICA9IGdldFNpYmxpbmdOb2RlKGlucHV0ZmllbGQu cGFyZW50Tm9kZSwgJ3ByZXZpb3VzJywgJ2R0Jyk7CgoJaWYoIWRkRXJyb3JNc2cg fHwgIWpzY3NzKCdjaGVjaycsZGRFcnJvck1zZywnZGQtc2VxdWVuY2UgZmllbGQt YWxlcnQnLCcnKSkKCXsKCQlqc2NzcyggJ2FkZCcsIGR0RmllbGROYW1lLCAnZmll bGQtYWxlcnQnLCAnJyk7CgoJCXZhciB4ID0gY3JlYXRlRE9NTm9kZSgnZGQnLCB7 ImNsYXNzIiA6J2RkLXNlcXVlbmNlIGZpZWxkLWFsZXJ0J30sIFtzdHJdKTsKCgkJ LyogQWRkIHNwZWNpYWwgY2xhc3MgZm9yIElFNiBpZiBpdCBpcyBhbiBhZHZhbmNl ZCBvcHRpb24gKi8KCQlpZihpc0lFICYmIGlzTm90SUU3ICYmIChqc2NzcygnY2hl Y2snLCBkdEZpZWxkTmFtZSwgJ2FkdmFuY2VkLW9wdGlvbicpIHx8IGpzY3NzKCdj aGVja1BhcmVudHMnLCBkdEZpZWxkTmFtZSwgJ2FkdmFuY2VkLW9wdGlvbicpKSkK CQkJanNjc3MoICdhZGQnLCB4LCAnYWR2YW5jZWQtb3B0aW9uLWFkamFjZW50Jywg JycpOwoKCQlkZElucHV0RmllbGQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoeCwg ZGRJbnB1dEZpZWxkLm5leHRTaWJsaW5nKTsKCX0KfTsKCmZ1bmN0aW9uIHVuQWxl cnRVc2VyKGlucHV0ZmllbGQpCnsKCXZhciBkZElucHV0RmllbGQgPSBpbnB1dGZp ZWxkLnBhcmVudE5vZGU7Cgl2YXIgZGRFcnJvck1zZyAgID0gZ2V0U2libGluZ05v ZGUoaW5wdXRmaWVsZC5wYXJlbnROb2RlLCAnbmV4dCcsICdkZCcpOwoJdmFyIGR0 RmllbGROYW1lICA9IGdldFNpYmxpbmdOb2RlKGlucHV0ZmllbGQucGFyZW50Tm9k ZSwgJ3ByZXZpb3VzJywgJ2R0Jyk7CgoJaWYoZGRFcnJvck1zZyAmJiBqc2Nzcygn Y2hlY2snLGRkRXJyb3JNc2csJ2RkLXNlcXVlbmNlIGZpZWxkLWFsZXJ0JykpCgl7 CgkJZGRJbnB1dEZpZWxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZGRFcnJvck1z Zyk7CgkJanNjc3MoJ3JlbW92ZScsIGR0RmllbGROYW1lLCAnZmllbGQtYWxlcnQn LCAnJyk7Cgl9Cn07CgpmdW5jdGlvbiBfdmFsaWRhdGlvblJlc3VsdChyZXF1ZXN0 KQp7CglpZiAodHlwZW9mIHJlcXVlc3QgIT0gJ3VuZGVmaW5lZCcgJiYgcmVxdWVz dCAhPSBudWxsICYmIHJlcXVlc3QucmVhZHlTdGF0ZSA9PSA0KQoJewoJCXZhciBy ZXNwb25zZSA9IGdldEVsZW1lbnRGcm9tWEhSKHJlcXVlc3QsICdkaXYjY29yZScp OwoKCQlyZXR1cm4gcmVzcG9uc2UuZmlyc3RDaGlsZC5ub2RlVmFsdWU7Cgl9CgoJ cmV0dXJuICIwIjsKfTsKCmZ1bmN0aW9uIF94bWxyZXF1ZXN0Q29tcGxldGUocmVx dWVzdCkKewoJcmV0dXJuIHR5cGVvZiByZXF1ZXN0ICE9ICd1bmRlZmluZWQnICYm IHJlcXVlc3QgIT0gbnVsbCAmJiByZXF1ZXN0LnJlYWR5U3RhdGUgPT0gNDsKfTsK CgpmdW5jdGlvbiB2YWxpZGF0ZVBhc3N3b3JkKHgpCnsKCXZhciBwd2QxID0gbmV3 IERPTVF1ZXJ5KCdpbnB1dCNwd2QxJykuZ2V0KDApOwoKCWlmKHB3ZDEudmFsdWUg IT0geC52YWx1ZSkKCXsKCQlhbGVydFVzZXIoeCwgZ2V0VGV4dCgnZm9ybXMnLCAn cGFzc3dvcmRfbm9fbWF0Y2gnKSk7CgkJLy8geC52YWx1ZSA9ICcnOwoJfQp9OwoK CmZ1bmN0aW9uIHZhbGlkYXRlTmlja25hbWUoZmllbGQpCnsKCW5pY2tuYW1lcmVx ID0gbnVsbDsKCXZhciByZXF1ZXN0ID0gJ2FjdGlvbj1jdXN0b20mZGF0YSU1QnRl bXBsYXRlJTVEPXZhbGlkYXRlX25pY2tuYW1lJmRhdGElNUJuaWNrbmFtZSU1RD0n K2VuY29kZVVSSShmaWVsZC52YWx1ZSk7CgluaWNrbmFtZXJlcSA9IGh0dHByZXFf c3RyaW5nKHJlcXVlc3QsIF92YWxpZGF0ZU5pY2tuYW1lLCBudWxsLCB0cnVlLCAi R0VUIik7Cgp9OwoKZnVuY3Rpb24gX3ZhbGlkYXRlTmlja25hbWUoKQp7CglpZiAo X3htbHJlcXVlc3RDb21wbGV0ZShuaWNrbmFtZXJlcSkgJiYgX3ZhbGlkYXRpb25S ZXN1bHQobmlja25hbWVyZXEpID09ICcxJykKCXsKCQlhbGVydFVzZXIobmV3IERP TVF1ZXJ5KCcjbmlja25hbWUnKS5nZXQoMCksIGdldFRleHQoJ2Zvcm1zJywgJ3Vz ZXJuYW1lX3Rha2VuJykpOwoJfQp9OwoKCmZ1bmN0aW9uIHZhbGlkYXRlRW1haWxE b21haW4oZmllbGQpCnsKCWVtYWlsZG9tYWlucmVxID0gbnVsbDsKCXZhciByZXF1 ZXN0ID0gJ2FjdGlvbj1jdXN0b20mZGF0YSU1QnRlbXBsYXRlJTVEPXZhbGlkYXRl X2VtYWlsZG9tYWluJmRhdGElNUJlbWFpbCU1RD0nK2VuY29kZVVSSShmaWVsZC52 YWx1ZSk7CgllbWFpbGRvbWFpbnJlcSA9IGh0dHByZXFfc3RyaW5nKHJlcXVlc3Qs IF92YWxpZGF0ZUVtYWlsRG9tYWluLCBmYWxzZSwgdHJ1ZSwgIkdFVCIpOwp9OwoK CmZ1bmN0aW9uIF92YWxpZGF0ZUVtYWlsRG9tYWluKCkKewoJaWYgKF92YWxpZGF0 aW9uUmVzdWx0KGVtYWlsZG9tYWlucmVxKSA9PSAnMScpCgl7CgkJYWxlcnRVc2Vy KG5ldyBET01RdWVyeSgnI2VtYWlsJykuZ2V0KDApLCBnZXRUZXh0KCdmb3Jtcycs ICdpbnZhbGlkX2RvbWFpbicpKTsKCX0KfTsKCgpmdW5jdGlvbiB2YWxpZGF0ZUVt YWlsKGZpZWxkKQp7CgllbWFpbHJlcSA9IG51bGw7Cgl2YXIgcmVxdWVzdCA9ICdh Y3Rpb249Y3VzdG9tJmRhdGElNUJ0ZW1wbGF0ZSU1RD12YWxpZGF0ZV9lbWFpbCZk YXRhJTVCZW1haWwlNUQ9JytlbmNvZGVVUkkoZmllbGQudmFsdWUpOwoJZW1haWxy ZXEgPSBodHRwcmVxX3N0cmluZyhyZXF1ZXN0LCBfdmFsaWRhdGVFbWFpbCwgZmFs c2UsIHRydWUsICJHRVQiKTsKfTsKCgpmdW5jdGlvbiBfdmFsaWRhdGVFbWFpbCgp CnsKCWlmIChlbWFpbHJlcSAmJiBfdmFsaWRhdGlvblJlc3VsdChlbWFpbHJlcSkg PT0gJzEnKQoJewoJCWFsZXJ0VXNlcihuZXcgRE9NUXVlcnkoJyNlbWFpbCcpLmdl dCgwKSwgZ2V0VGV4dCgnZm9ybXMnLCAnZW1haWxfdGFrZW4nKSk7Cgl9Cn07Cgpm dW5jdGlvbiBhdHRhY2hDYWxlbmRhclNlbGVjdG9yKHRhcmdldHMpCnsKCXZhciBj YWxlbmRhclNlbGVjdG9ycyA9IGdldFRhcmdldHModGFyZ2V0cywgJ2lucHV0LmRh dGUnKSwgaXRlbTsKCglmb3IodmFyIGkgPSAwLCBpdGVtOyAoaXRlbT1jYWxlbmRh clNlbGVjdG9ycy5nZXQoaSkpO2krKykKCXsKCQlpZihpdGVtLmlkICE9ICcnKQoJ CXsKCQkJQ2FsZW5kYXIuc2V0dXAoewoJCQkJaW5wdXRGaWVsZAkJCToJCWl0ZW0u aWQsCgkJCQlpZkZvcm1hdAkJCToJCSIlZC0lbS0lWSIgKyAoanNjc3MoJ2NoZWNr JywgaXRlbSwgJ3RpbWUnKSA/ICIgJUg6JU0iIDogIiIpLAoJCQkJc2hvd3NUaW1l CQkJOgkJanNjc3MoJ2NoZWNrJywgaXRlbSwgJ3RpbWUnKSwKCQkJCWFsaWduCQkJ CToJCSJUbCIsCgkJCQlzdGVwCQkJCToJCTEsCgkJCQllbGVjdHJpYwkJCToJCWZh bHNlLAoJCQkJZmlyc3REYXkJCQk6CQkxLAoJCQkJb25DbG9zZQkJCQk6CQlmdW5j dGlvbihjYWwpCgkJCQkJCQkJCQkJewoJCQkJCQkJCQkJCQljYWwuaGlkZSgpOwoJ CQkJCQkJCQkJCQlpZihkb2N1bWVudC5jcmVhdGVFdmVudCkKCQkJCQkJCQkJCQkJ ewoJCQkJCQkJCQkJCQkJdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCJI VE1MRXZlbnRzIik7CgkJCQkJCQkJCQkJCQlldnQuaW5pdEV2ZW50KCJjaGFuZ2Ui LCB0cnVlLCB0cnVlKTsKCQkJCQkJCQkJCQkJCWNhbC5wYXJhbXNbJ2lucHV0Rmll bGQnXS5kaXNwYXRjaEV2ZW50KGV2dCk7CgkJCQkJCQkJCQkJCX0KCQkJCQkJCQkJ CQkJZWxzZSBpZihkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCkKCQkJCQkJCQkJ CQkJewoJCQkJCQkJCQkJCQkJdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50 T2JqZWN0KCk7CgkJCQkJCQkJCQkJCQljYWwucGFyYW1zWydpbnB1dEZpZWxkJ10u ZmlyZUV2ZW50KCJvbmNoYW5nZSIsIGV2dCk7CgkJCQkJCQkJCQkJCX0KCQkJCQkJ CQkJCQl9CgkJCX0pOwoJCX0KCX0KfTsKCmZ1bmN0aW9uIHNlbGVjdEFsbFJvd3Mo dGFyZ2V0cykKewoJdmFyIHRhYmxlcyA9IGdldFRhcmdldHModGFyZ2V0cywgJ2Rp diNjb250ZW50IGZvcm0gdGFibGUnKTsKCglpZih0YWJsZXMubGVuZ3RoID09IDAp CgkJcmV0dXJuOwoKCWZvcih2YXIgaSA9IDA7IGkgPCB0YWJsZXMubGVuZ3RoOyBp KyspCgl7CgkJdmFyIGNoZWNrYm94ZXMgPSAgbmV3IERPTVF1ZXJ5KCdpbnB1dFtU WVBFPSJjaGVja2JveCJdJywgdGFibGVzLmdldChpKSk7CgkJaWYoY2hlY2tib3hl cy5sZW5ndGggPT0gMCkKCQkJY29udGludWU7CgoJCXZhciB0YWJsZWZvb3RlciA9 IG5ldyBET01RdWVyeSgidGZvb3QiLCB0YWJsZXMuZ2V0KGkpKS5nZXQoMCk7CgkJ aWYoIXRhYmxlZm9vdGVyKQoJCQljb250aW51ZTsKCgkJdmFyIHRyID0gY3JlYXRl RE9NTm9kZSgndHInLCB7ImNsYXNzIiA6J2Zvb3Rlci1mb3JtJ30sCgkJWwoJCQlj cmVhdGVET01Ob2RlKCd0ZCcsIHsiY2xhc3MiIDonc2VsZWN0J30sCgkJCVsKCQkJ CWNyZWF0ZURPTU5vZGUoJ2lucHV0JywgeyJ0eXBlIiA6J2NoZWNrYm94JywgImlk IiA6J3NlbGVjdEFsbFJvd3MtJytpLCAibmFtZSIgOidzZWxlY3RBbGxSb3dzLScr aSwgImV2ZW50IiA6IChpc0lFID8gWydjbGljaycsIF9zZWxlY3RBbGxSb3dzXSA6 IFsnY2hhbmdlJywgX3NlbGVjdEFsbFJvd3NdKSB9LCBbXSkKCQkJXSksCgkJCWNy ZWF0ZURPTU5vZGUoJ3RkJywgeyJjb2xTcGFuIiA6NX0sCgkJCVsKCQkJCWlzSUUg PwoJCQkJY3JlYXRlRE9NTm9kZSgnbGFiZWwnLCB7ICdodG1sRm9yJyA6ICdzZWxl Y3RBbGxSb3dzLScraX0sIFtnZXRUZXh0KCdmb3JtcycsICdzZWxlY3RfYWxsX3Jv d3MnKV0pIDoKCQkJCWNyZWF0ZURPTU5vZGUoJ2xhYmVsJywgeyAnZm9yJyA6ICdz ZWxlY3RBbGxSb3dzLScraX0sIFtnZXRUZXh0KCdmb3JtcycsICdzZWxlY3RfYWxs X3Jvd3MnKV0pCgkJCV0pCgkJXSk7CgoJCXRhYmxlZm9vdGVyLmFwcGVuZENoaWxk KHRyKTsKCX0KCglpZihpc0dlY2tvICYmICFpc1dlYktpdCkKCXsKCQlqc2Nzcygn YWRkJyxkb2N1bWVudC5ib2R5LCdkaXNwbGF5LW5vbmUnLCcnKTsKCQlqc2Nzcygn cmVtb3ZlJyxkb2N1bWVudC5ib2R5LCdkaXNwbGF5LW5vbmUnLCcnKTsKCX0KfTsK CmZ1bmN0aW9uIF9zZWxlY3RBbGxSb3dzKCkKewoJdmFyIGNoZWNrZWQgPSB0aGlz LmNoZWNrZWQ7Cgl2YXIgaXRlbXMgPSBuZXcgRE9NUXVlcnkoJ3Rib2R5IGlucHV0 W1RZUEU9ImNoZWNrYm94Il0nLCBnZXRTaWJsaW5nTm9kZSh0aGlzLCAndXAnLCAn dGFibGUnKSk7Cglmb3IodmFyIGkgPSAwLCBpdGVtOyAoaXRlbT1pdGVtcy5nZXQo aSkpO2krKykKCXsKCQlpdGVtLmNoZWNrZWQgPSBjaGVja2VkOwoJfQp9OwoKZnVu Y3Rpb24gcmV3cml0ZVF1b3RlTGlua3MoKQp7CglpZihyYXdfbWVzc2FnZXMubGVu Z3RoID09IDApCgkJcmV0dXJuOwoKCWZvcih2YXIgaSA9IDAsIGl0ZW07IChpdGVt PXJhd19tZXNzYWdlc1tpXSk7IGkrKykKCXsKCQkvKiB1c2luZyBhIHJlZmVyZW5j ZSB0byBtZXNzYWdlLT8gdG8gc2xpZ2h0bHkgc3BlZWQgdXAgbG9va3VwICovCgkJ dmFyIGxpbmtzID0gbmV3IERPTVF1ZXJ5KCJsaS5tZXNzYWdlLXF1b3RlIGEiLCBu ZXcgRE9NUXVlcnkoImxpI21lc3NhZ2UtIitpdGVtWzBdKS5nZXQoMCkgKTsKCgkJ aWYobGlua3MubGVuZ3RoID4gMCkKCQl7CgkJCWFkZEV2ZW50KGxpbmtzLmdldCgw KSwgJ2NsaWNrJywgZnVuY3Rpb24oZSkgeyBpZighY29weVF1b3RlVG9STUwodGhp cykpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB9IH0gKTsKCQl9Cgl9Cn07CgpmdW5j dGlvbiBjb3B5UXVvdGVUb1JNTCh4KQp7Cgl2YXIgcGF0aCA9IGJvYXJkX3Njcmlw dF91cmwgKyAnL3F1b3RlX21lc3NhZ2UvJzsKCXZhciB0ZW1wID0geC5ocmVmLnN1 YnN0cmluZyggcGF0aC5sZW5ndGggKTsKCXZhciByZWcgPSAvXihbMC05XSspLzsK CXZhciByZXMgPSB0ZW1wLm1hdGNoKHJlZyk7Cgl2YXIgbWVzc2FnZWlkID0gcmVz WzFdOwoKCWZvcih2YXIgaSA9IDAsIGl0ZW07IChpdGVtPXJhd19tZXNzYWdlc1tp XSk7aSsrKQoJewoJCWlmKGl0ZW1bMF0gPT0gbWVzc2FnZWlkKQoJCXsKCQkJcHV0 U3RyKGl0ZW1bMV0pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoKCXJldHVybiB0 cnVlOwp9OwoKLyogaGVscGVyIGZ1bmN0aW9uIGZvciByYXcgbWVzc2FnZXMgKi8K ZnVuY3Rpb24gcSgpCnsKCXJldHVybiAnIic7Cn07CgpmdW5jdGlvbiBwcml2YXRl TWVzc2FnaW5nQ29weUNvbnRhY3QodGFyZ2V0cykKewoJaWYoYm9hcmRfYWN0aW9u ID09ICdwbV9uZXdfbWVzc2FnZScpCgkJYWRkRXZlbnRUb1RhcmdldHModGFyZ2V0 cywgJ2NoYW5nZScsIF9wcml2YXRlTWVzc2FnaW5nQ29weUNvbnRhY3QsICdpbnB1 dCNyZWNpcGllbnRzICsgc2VsZWN0Jyk7Cn07CgpmdW5jdGlvbiBfcHJpdmF0ZU1l c3NhZ2luZ0NvcHlDb250YWN0KCkKewoJaWYodGhpcy5vcHRpb25zW3RoaXMuc2Vs ZWN0ZWRJbmRleF0udmFsdWUgPT0gJycpCgkJcmV0dXJuOwoKCXZhciBpbnB1dCA9 IG5ldyBET01RdWVyeSgiaW5wdXQjcmVjaXBpZW50cyIpLmdldCgwKTsKCgl2YXIg dXNlcm5hbWUgPSB0aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1 ZTsKCglpZiAoIHVzZXJuYW1lLm1hdGNoKCInIikgKQoJCXVzZXJuYW1lID0gJyIn KyB1c2VybmFtZSArICciJzsKCWVsc2UgaWYgKCB1c2VybmFtZS5tYXRjaCgvXlsw LTldKyQvKSB8fCB1c2VybmFtZS5tYXRjaCgnIicpICkKCQl1c2VybmFtZSA9ICIn IisgdXNlcm5hbWUgKyAiJyI7CgoJaW5wdXQudmFsdWUgKz0gKGlucHV0LnZhbHVl ICE9ICcnID8gJywgJyA6ICcnKSArIHVzZXJuYW1lOwp9OwoKZnVuY3Rpb24gc2Vs ZWN0U2VsZWN0ZWRUb3BpY0FkbWluKCkKewoJdmFyIHRvcGljQWRtaW4gPSBuZXcg RE9NUXVlcnkoImRpdiN0b3BpYy1hZG1pbiIpLmdldCgwKTsKCglpZighdG9waWNB ZG1pbikKCQlyZXR1cm47CgoJdmFyIHNlbGVjdHMgPSBuZXcgRE9NUXVlcnkoJ3Nl bGVjdFtzZWxlY3RlZF0nLCB0b3BpY0FkbWluKTsKCglmb3IgKHZhciBpID0gMCwg c2VsZWN0OyAoc2VsZWN0PXNlbGVjdHMuZ2V0KGkpKTtpKyspCgl7CgkJZm9yICh2 YXIgaiA9IDA7IGo8c2VsZWN0Lm9wdGlvbnMubGVuZ3RoOyBqKyspCgkJewoJCQlp ZiAoc2VsZWN0Lm9wdGlvbnNbal0udmFsdWUgPT0gc2VsZWN0LmdldEF0dHJpYnV0 ZSgic2VsZWN0ZWQiKSkKCQkJCXNlbGVjdC5vcHRpb25zW2pdLnNlbGVjdGVkID0g dHJ1ZTsKCQl9Cgl9Cn07CgpmdW5jdGlvbiB0b2dnbGVDaGFuZ2VDaGVja2JveFRv cGljQWRtaW4oKQp7Cgl2YXIgdG9waWNBZG1pbiA9IG5ldyBET01RdWVyeSgiZGl2 I3RvcGljLWFkbWluIikuZ2V0KDApOwoKCWlmKCF0b3BpY0FkbWluKQoJCXJldHVy bjsKCgl2YXIgaXRlbXMgPSBuZXcgRE9NUXVlcnkoJ2lucHV0W3R5cGU9InRleHQi XSwgdGV4dGFyZWEsIHNlbGVjdCcsIHRvcGljQWRtaW4pOwoKCWZvcih2YXIgaSA9 IDAsIGl0ZW07IChpdGVtPWl0ZW1zLmdldChpKSk7aSsrKQoJewoJCWFkZEV2ZW50 KGl0ZW0sICdjaGFuZ2UnLCBfdG9nZ2xlQ2hhbmdlQ2hlY2tib3hUb3BpY0FkbWlu KTsKCX0KCgl2YXIgaW5wdXQgPSBuZXcgRE9NUXVlcnkoImlucHV0I2RlbG1lc3Nh Z2VzIikuZ2V0KDApOwoJaWYoaW5wdXQpCgl7CgkJYWRkRXZlbnQoaW5wdXQsICdj aGFuZ2UnLCBzZWxlY3RNZXNzYWdlc0ZvckRlbGV0aW9uKTsKCX0KCglpbnB1dCA9 IG5ldyBET01RdWVyeSgiaW5wdXQjc3BsaXRtZXNzYWdlcyIpLmdldCgwKTsKCWlm KGlucHV0KQoJewoJCWFkZEV2ZW50KGlucHV0LCAnY2hhbmdlJywgc2VsZWN0TWVz c2FnZXNGb3JTcGxpdCk7Cgl9Cn07CgpmdW5jdGlvbiBfdG9nZ2xlQ2hhbmdlQ2hl Y2tib3hUb3BpY0FkbWluKCkKewoJdmFyIHNlYXJjaCA9IGpzY3NzKCdjaGVjaycs IHRoaXMucGFyZW50Tm9kZSwgJ2RkLXNlcXVlbmNlJykgPyB0aGlzLnBhcmVudE5v ZGUucHJldmlvdXNTaWJsaW5nIDogIHRoaXMucGFyZW50Tm9kZTsKCXZhciBpdGVt cyA9IG5ldyBET01RdWVyeSgnaW5wdXRbdHlwZT0iY2hlY2tib3giXScsIHNlYXJj aCk7CgoJaWYoaXRlbXMubGVuZ3RoID4gMCkKCXsKCQlpdGVtcy5nZXQoMCkuY2hl Y2tlZD10cnVlOwoJfQp9OwoKdmFyIGNhbGxiYWNrT25NZXNzYWdlVG9nZ2xlZFNl bGVjdGVkID0gbnVsbDsKZnVuY3Rpb24gX3NlbGVjdE1lc3NhZ2VzKHVuc2V0Q3Vy cmVudE1lc3NhZ2VzKQp7Cgl2YXIgaXRlbXMgPSBuZXcgRE9NUXVlcnkoJ2xpLm1l c3NhZ2UnKTsKCglmb3IodmFyIGk9MCwgaXRlbTsgKGl0ZW09aXRlbXMuZ2V0KGkp KTtpKyspCgl7CgkJYWRkRXZlbnQoaXRlbSwgJ2NsaWNrJywgX3NlbGVjdE1lc3Nh Z2UpOwoJCWlmKHVuc2V0Q3VycmVudE1lc3NhZ2VzKQoJCXsKCQkJanNjc3MoJ3Jl bW92ZScsIGl0ZW0sICdzZWxlY3RlZCcsICcnKTsKCQl9Cgl9Cn07CgpmdW5jdGlv biBfc2VsZWN0TWVzc2FnZSgpCnsKCWlmKCFjYWxsYmFja09uTWVzc2FnZVRvZ2ds ZWRTZWxlY3RlZCkKCQlyZXR1cm47CgoJanNjc3MoJ3RvZ2dsZScsIHRoaXMsICdz ZWxlY3RlZCcsICcnKTsKCWNhbGxiYWNrT25NZXNzYWdlVG9nZ2xlZFNlbGVjdGVk KHRoaXMsIGpzY3NzKCdjaGVjaycsIHRoaXMsICdzZWxlY3RlZCcsICcnKSk7Cn07 CgpmdW5jdGlvbiBfbWVzc2FnZVRvZ2dsZWRGb3JEZWxldGlvbihsaXN0aXRlbSwg c2VsZWN0ZWQpCnsKCXZhciBkZWxfbWVzc2FnZWlkcyA9IG5ldyBET01RdWVyeSgi aW5wdXQjZGVsX21lc3NhZ2VpZHMiKS5nZXQoMCk7CglpZighZGVsX21lc3NhZ2Vp ZHMpCgkJcmV0dXJuOwoKCXZhciByZWcgPSAvXm1lc3NhZ2VcLShbMC05XSspJC87 Cgl2YXIgcmVzID0gbGlzdGl0ZW0uaWQubWF0Y2gocmVnKTsKCXZhciBtZXNzYWdl aWQgPSByZXNbMV07CgoJdmFyIGlkcyA9IGRlbF9tZXNzYWdlaWRzLnZhbHVlLnNw bGl0KCcsJyk7CgoJaWYoc2VsZWN0ZWQpCgl7CgkJaWRzW2lkcy5sZW5ndGhdID0g bWVzc2FnZWlkOwoJfQoJZWxzZQoJewoJCWZvcih2YXIgaSA9IDA7IGkgPCBpZHMu bGVuZ3RoOyBpKyspCgkJewoJCQlpZihpZHNbaV0gPT0gbWVzc2FnZWlkKQoJCQl7 CgkJCQlkZWxldGUgaWRzW2ldOwoJCQl9CgkJfQoJfQoKCWRlbF9tZXNzYWdlaWRz LnZhbHVlID0gaWRzLmpvaW4oJywnKTsKfTsKCmZ1bmN0aW9uIHNlbGVjdE1lc3Nh Z2VzRm9yRGVsZXRpb24oKQp7Cgl2YXIgZGVsX21lc3NhZ2VpZHMgPSBuZXcgRE9N UXVlcnkoImlucHV0I2RlbF9tZXNzYWdlaWRzIikuZ2V0KDApOwoJaWYoIWRlbF9t ZXNzYWdlaWRzKQoJCXJldHVybjsKCglkZWxfbWVzc2FnZWlkcy52YWx1ZSA9ICcn OwoKCV9zZWxlY3RNZXNzYWdlcyghdGhpcy5jaGVja2VkKTsKCglpZighdGhpcy5j aGVja2VkKQoJCWNhbGxiYWNrT25NZXNzYWdlVG9nZ2xlZFNlbGVjdGVkID0gbnVs bDsKCWVsc2UKCQljYWxsYmFja09uTWVzc2FnZVRvZ2dsZWRTZWxlY3RlZCA9IF9t ZXNzYWdlVG9nZ2xlZEZvckRlbGV0aW9uOwoKCWlmKHRoaXMuY2hlY2tlZCkKCQlh bGVydChnZXRUZXh0KCdmb3JtcycsICdzZWxlY3RfbWVzc2FnZXMnKSk7Cn07Cgpm dW5jdGlvbiBfbWVzc2FnZVRvZ2dsZWRGb3JTcGxpdChsaXN0aXRlbSwgc2VsZWN0 ZWQpCnsKCXZhciBzcGxpdF9tZXNzYWdlaWRzID0gbmV3IERPTVF1ZXJ5KCJpbnB1 dCNzcGxpdF9tZXNzYWdlaWRzIikuZ2V0KDApOwoJaWYoIXNwbGl0X21lc3NhZ2Vp ZHMpCgkJcmV0dXJuOwoKCXZhciByZWcgPSAvXm1lc3NhZ2VcLShbMC05XSspJC87 Cgl2YXIgcmVzID0gbGlzdGl0ZW0uaWQubWF0Y2gocmVnKTsKCXZhciBtZXNzYWdl aWQgPSByZXNbMV07CgoJdmFyIGlkcyA9IHNwbGl0X21lc3NhZ2VpZHMudmFsdWUu c3BsaXQoJywnKTsKCglpZihzZWxlY3RlZCkKCXsKCQlpZHNbaWRzLmxlbmd0aF0g PSBtZXNzYWdlaWQ7Cgl9CgllbHNlCgl7CgkJZm9yKHZhciBpPTAsIGl0ZW07IChp dGVtPWlkc1tpXSk7aSsrKQoJCXsKCQkJaWYoaXRlbSA9PSBtZXNzYWdlaWQpCgkJ CQlkZWxldGUgaXRlbTsKCQl9Cgl9CgoJc3BsaXRfbWVzc2FnZWlkcy52YWx1ZSA9 IGlkcy5qb2luKCcsJyk7Cn07CgpmdW5jdGlvbiBzZWxlY3RNZXNzYWdlc0ZvclNw bGl0KCkKewoJdmFyIHNwbGl0X21lc3NhZ2VpZHMgPSBuZXcgRE9NUXVlcnkoImlu cHV0I3NwbGl0X21lc3NhZ2VpZHMiKS5nZXQoMCk7CglpZighc3BsaXRfbWVzc2Fn ZWlkcykKCQlyZXR1cm47CgoJc3BsaXRfbWVzc2FnZWlkcy52YWx1ZSA9ICcnOwoK CV9zZWxlY3RNZXNzYWdlcyghdGhpcy5jaGVja2VkKTsKCWlmKCF0aGlzLmNoZWNr ZWQpCgkJY2FsbGJhY2tPbk1lc3NhZ2VUb2dnbGVkU2VsZWN0ZWQgPSBudWxsOwoJ ZWxzZQoJCWNhbGxiYWNrT25NZXNzYWdlVG9nZ2xlZFNlbGVjdGVkID0gX21lc3Nh Z2VUb2dnbGVkRm9yU3BsaXQ7CgoJaWYodGhpcy5jaGVja2VkKQoJCWFsZXJ0KGdl dFRleHQoJ2Zvcm1zJywgJ3NlbGVjdF9tZXNzYWdlcycpKTsKfTsKCi8qCglDb2xv cnBpY2tlciBmcm9tIGh0dHA6Ly93d3cuY29sb3VybG92ZXJzLmNvbS9ibG9nLzIw MDgvMDEvMTYvZnJlZS1hZHZhbmNlZC1kaHRtbC1jb2xvci1waWNrZXIvIC4KCU1v ZGlmaWVkIGZvciBpbXBsZW1lbnRhdGlvbiBpbiBSZWFjdC4KKi8KCi8qIEdsb2Jh bCB2YXJpYWJsZXMgKi8KdmFyIF9zdG9wID0gMSwgX2RyYWdIYW5kbGUgPSAiIiwg X2RyYWdIYW5kbGVTdHlsZSwgdFgsIHRZLCBIU1YgPSB7MDogMzYwLDE6IDAsMjog MTAwfSwgaFNWID0gMTQ5LCB3U1YgPSAxNDAsIF9DTENQT2Zmc2V0ID0ge3g6IDAs IHk6IDB9LCBfY2FuRHJhZ1BpY2tlciA9IGZhbHNlLCBfQ0xDUGRpc3BsYXkgPSAi bm9uZSIsIF9DTENQaXNEcmFnZ2FibGUgPSB0cnVlLCBfQ0xDUHBvc2l0aW9uID0g ImFic29sdXRlIjsKdmFyIF9odWVUcmFja0hlaWdodCA9IDE0NywgX2NsaWNrTW91 c2VMb2NhbGUgPSAiIiwgX2NsaWNrTW91c2VMb2NhbGVDTENQSWlubmVyU2hlbGwg PSBmYWxzZSwgX3JlZnJlc2hUaW1lb3V0ID0gMCwgX0NMQ1Bpbml0SGV4ID0gIiIs IF9DTENQYWJzUG9zID0gIiI7CnZhciBfQ0xDUGJhc2ljTGltaXRzID0geyJDTENQ YmFzaWNIZXgiOiBbMCwxNjc3NzIxNV0sIkNMQ1BiYXNpY1IiOiBbMCwyNTVdLCJD TENQYmFzaWNHIjogWzAsMjU1XSwiQ0xDUGJhc2ljQiI6IFswLDI1NV0sIkNMQ1Bi YXNpY0giOiBbMCwzNTldLCJDTENQYmFzaWNTIjogWzAsMTAwXSwiQ0xDUGJhc2lj ViI6IFswLDEwMF0sIkNMQ1BiYXNpY0MiOiBbMCwxMDBdLCJDTENQYmFzaWNNIjog WzAsMTAwXSwiQ0xDUGJhc2ljWSI6IFswLDEwMF0sIkNMQ1BiYXNpY0siOiBbMCwx MDBdfTsKdmFyIENMQ1BGaWVsZElEID0gJyc7CnZhciBfQ0xDUGRpc3BsYXkgPSAn bm9uZSc7CnZhciBfQ0xDUGlzRHJhZ2dhYmxlID0gdHJ1ZTsKdmFyIF9DTENQcG9z aXRpb24gPSAnYWJzb2x1dGUnOwp2YXIgX0NMQ1Bpbml0SGV4ID0gJzAwMzlCMyc7 CgpBcnJheS5wcm90b3R5cGUuQ0xDUGluX2FycmF5ID0gZnVuY3Rpb24oX25lZWRs ZSkgewoJdmFyIF9pOwoJZm9yIChfaT0wO19pPD10aGlzLmxlbmd0aDtfaSsrICkg ewoJCWlmICh0aGlzW19pXSA9PSBfbmVlZGxlKSB7CgkJCXJldHVybiB0cnVlOwoJ CX0KCX0KCXJldHVybiBmYWxzZTsKfTsKClN0cmluZy5wcm90b3R5cGUuQ0xDUHBh ZEhleCA9IGZ1bmN0aW9uKCkgewoJdmFyIF9zdHIgPSAoIjAwMDAwMCIudG9TdHJp bmcoKSArIHRoaXMudG9TdHJpbmcoKSk7CglyZXR1cm4gX3N0ci5zdWJzdHJpbmco KF9zdHIubGVuZ3RoIC0gNiksX3N0ci5sZW5ndGgpOyAvLyBUSEFOS1MgSUUhISEh Cn07CgpDTENQSGFuZGxlciA9IGZ1bmN0aW9uKF9oZXgpCnsKCXZhciBDTENQRmll bGQgPSBuZXcgRE9NUXVlcnkoJyMnICsgQ0xDUEZpZWxkSUQpLmdldCgwKTsKCglp ZihDTENQRmllbGQpCgl7CgkJQ0xDUEZpZWxkLnZhbHVlID0gX2hleDsKCQlDTENQ RmllbGQuc3R5bGUuYmFja2dyb3VuZCA9ICgiIyIgKyBfaGV4KTsKCX0KfTsKCkNM Q1BkZWMyaGV4ID0gZnVuY3Rpb24oX2RlYykgewoJdmFyIF9oZXhDaGFycyA9ICIw MTIzNDU2Nzg5QUJDREVGIiwgX2hleCA9ICIiOwoJd2hpbGUgKF9kZWMgPiAxNSkg ewoJCV9oZXggPSAoX2hleENoYXJzLmNoYXJBdCgoX2RlYyAtIChNYXRoLmZsb29y KF9kZWMgLyAxNikpICogMTYpKSArIF9oZXgpOwoJCV9kZWMgPSBNYXRoLmZsb29y KF9kZWMgLyAxNik7Cgl9CglyZXR1cm4gKF9oZXhDaGFycy5jaGFyQXQoX2RlYykg KyBfaGV4KTsKfTsKCkNMQ1BoZXgyZGVjID0gZnVuY3Rpb24oX2hleCkgewoJcmV0 dXJuIHBhcnNlSW50KF9oZXgsMTYpOwp9OwoKaWYgKHR5cGVvZiAkICE9ICJmdW5j dGlvbiIpIHsKCSQgPSBmdW5jdGlvbihfZWxlbWVudElEKSB7CgkJcmV0dXJuIG5l dyBET01RdWVyeSgnIycgKyBfZWxlbWVudElEKS5nZXQoMCk7Cgl9Cn07CgppZiAo dHlwZW9mICRTICE9ICJmdW5jdGlvbiIpIHsKCSRTID0gZnVuY3Rpb24oX2VsZW1l bnRJRCkgewoJCXJldHVybiAkKF9lbGVtZW50SUQpLnN0eWxlOwoJfQp9OwoKQ0xD UGlzSGV4ID0gZnVuY3Rpb24oX2hleCkgewoJcmV0dXJuIC9eW2EtZkEtRjAtOV17 Nn0kLy50ZXN0KF9oZXgpOwp9OwoKQ0xDUGRvbUV2ZW50ID0gZnVuY3Rpb24oX2V2 ZW50KSB7CglfZXZlbnQgPSAoX2V2ZW50KSA/IF9ldmVudCA6IHdpbmRvdy5ldmVu dDsKCWlmIChfZXZlbnQuc3JjRWxlbWVudCkgewoJCV9ldmVudC50YXJnZXQgPSBf ZXZlbnQuc3JjRWxlbWVudDsKCX0KCV9ldmVudC5jb2RlID0gKF9ldmVudC5rZXlD b2RlKSA/IF9ldmVudC5rZXlDb2RlIDogX2V2ZW50LmNoYXJDb2RlOwoJcmV0dXJu IF9ldmVudDsKfTsKCkNMQ1BhYnNQb3MgPSBmdW5jdGlvbihfb2JqZWN0KSB7Cgl2 YXIgciA9IHsKCQl4IDogX29iamVjdC5vZmZzZXRMZWZ0LAoJCXkgOiBfb2JqZWN0 Lm9mZnNldFRvcAoJfTsKCWlmIChfb2JqZWN0Lm9mZnNldFBhcmVudCkgewoJCXZh ciB2ID0gQ0xDUGFic1Bvcyhfb2JqZWN0Lm9mZnNldFBhcmVudCk7CgkJci54ICs9 IHYueDsKCQlyLnkgKz0gdi55OwoJfQoJcmV0dXJuIHI7Cn07CgpDTENQaW5pdFBp Y2tlciA9IGZ1bmN0aW9uKCkgewoJZG9jdW1lbnQub25tb3VzZW1vdmUgPSBDTENQ TW91c2VIYW5kbGVyT25Nb3VzZU1vdmU7Cglkb2N1bWVudC5vbm1vdXNldXAgPSBD TENQTW91c2VIYW5kbGVyT25Nb3VzZVVwOwoJZG9jdW1lbnQub25tb3VzZWRvd24g PSBDTENQTW91c2VIYW5kbGVyT25Nb3VzZURvd247CgoJJFMoIkNMQ1AiKS5sZWZ0 ID0gMDsKCSRTKCJDTENQIikudG9wID0gMDsKCSRTKCJDTENQIikud2lkdGggPSAi MjYycHgiOwoJJFMoIkNMQ1AiKS5oZWlnaHQgPSAiMjY4cHgiOwoJJCgiQ0xDUCIp LmlubmVySFRNTCA9ICI8ZGl2IGlkPVwiQ0xDUERyYWdEaXZcIj48ZGl2IGlkPVwi Q0xDUElpbm5lclNoZWxsXCI+PGRpdiBpZD1cIkNMQ1BQaWNrZXJcIj48ZGl2IGlk PVwiQ0xDUFNhdFZhbFwiIG9ubW91c2Vkb3duPVwiQ0xDUHNsaWRlKCdDTENQU2F0 VmFsU2xpZGUnLCdDTENQUGlja2VyJyxldmVudCk7XCI+PGRpdiBpZD1cIkNMQ1BT YXRWYWxTbGlkZVwiPjwvZGl2PjwvZGl2PjxkaXYgaWQ9XCJDTENQSHVlQ29udGFp bmVyXCIgb25tb3VzZWRvd249XCJDTENQc2xpZGUoJ0NMQ1BIdWVTbGlkZScsJ0NM Q1BQaWNrZXInLGV2ZW50KTtcIj48ZGl2IGlkPVwiQ0xDUEh1ZVNsaWRlXCIgc3R5 bGU9XCJ0b3A6IC00cHg7IGxlZnQ6IC03cHg7XCI+PC9kaXY+PGRpdiBpZD1cIkNM Q1BIdWVcIj48L2Rpdj48L2Rpdj48ZGl2IGlkPVwiQ0xDUFNhdENvbnRhaW5lclwi IG9ubW91c2Vkb3duPVwiQ0xDUHNsaWRlKCdDTENQU2F0U2xpZGUnLCdDTENQUGlj a2VyJyxldmVudCk7XCI+PGRpdiBpZD1cIkNMQ1BTYXRTbGlkZVwiIHN0eWxlPVwi dG9wOiAtNHB4OyBsZWZ0OiAtN3B4O1wiPjwvZGl2PjxkaXYgaWQ9XCJDTENQU2F0 XCI+PC9kaXY+PC9kaXY+PGRpdiBpZD1cIkNMQ1BWYWxDb250YWluZXJcIiBvbm1v dXNlZG93bj1cIkNMQ1BzbGlkZSgnQ0xDUFZhbFNsaWRlJywnQ0xDUFBpY2tlcics ZXZlbnQpO1wiPjxkaXYgaWQ9XCJDTENQVmFsU2xpZGVcIiBzdHlsZT1cInRvcDog LTRweDsgbGVmdDogLTdweDtcIj48L2Rpdj48ZGl2IGlkPVwiQ0xDUFZhbFwiPjwv ZGl2PjwvZGl2PjwvZGl2PjxkaXYgaWQ9XCJDTENQYlBFXCI+PGRpdiBzdHlsZT1c IndpZHRoOiA0OHB4OyBtYXJnaW4tcmlnaHQ6IDEwcHg7IGJhY2tncm91bmQ6IHVy bCgiICsgYm9hcmRfdGVtcGxhdGVfdXJsICsgImltZy9pY29ucy90b29sYmFyL2Nv bG9ycGlja2VyL2hleC5wbmcpIGNlbnRlciB0b3Agbm8tcmVwZWF0O1wiPjwvZGl2 PjxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiB1cmwoIiArIGJvYXJkX3RlbXBsYXRl X3VybCArICJpbWcvaWNvbnMvdG9vbGJhci9jb2xvcnBpY2tlci9yLnBuZykgY2Vu dGVyIHRvcCBuby1yZXBlYXQ7XCI+PC9kaXY+PGRpdiBzdHlsZT1cImJhY2tncm91 bmQ6IHVybCgiICsgYm9hcmRfdGVtcGxhdGVfdXJsICsgImltZy9pY29ucy90b29s YmFyL2NvbG9ycGlja2VyL2cucG5nKSBjZW50ZXIgdG9wIG5vLXJlcGVhdDtcIj48 L2Rpdj48ZGl2IHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMXB4OyBiYWNrZ3JvdW5k OiB1cmwoIiArIGJvYXJkX3RlbXBsYXRlX3VybCArICJpbWcvaWNvbnMvdG9vbGJh ci9jb2xvcnBpY2tlci9iLnBuZykgY2VudGVyIHRvcCBuby1yZXBlYXQ7XCI+PC9k aXY+PGRpdiBzdHlsZT1cImJhY2tncm91bmQ6IHVybCgiICsgYm9hcmRfdGVtcGxh dGVfdXJsICsgImltZy9pY29ucy90b29sYmFyL2NvbG9ycGlja2VyL2gucG5nKSBj ZW50ZXIgdG9wIG5vLXJlcGVhdDtcIj48L2Rpdj48ZGl2IHN0eWxlPVwiYmFja2dy b3VuZDogdXJsKCIgKyBib2FyZF90ZW1wbGF0ZV91cmwgKyAiaW1nL2ljb25zL3Rv b2xiYXIvY29sb3JwaWNrZXIvcy5wbmcpIGNlbnRlciB0b3Agbm8tcmVwZWF0O1wi PjwvZGl2PjxkaXYgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDA7IGJhY2tncm91bmQ6 IHVybCgiICsgYm9hcmRfdGVtcGxhdGVfdXJsICsgImltZy9pY29ucy90b29sYmFy L2NvbG9ycGlja2VyL3YucG5nKSBjZW50ZXIgdG9wIG5vLXJlcGVhdDtcIj48L2Rp dj48ZGl2IGNsYXNzPVwiQ0xDUENsZWFyIENMQ1BOb0RpbVwiPjwvZGl2PjxpbnB1 dCB0eXBlPVwidGV4dFwiIGlkPVwiQ0xDUGJhc2ljSGV4XCIgbWF4bGVuZ3RoPVwi NlwiIHZhbHVlPVwiXCIgc3R5bGU9XCJ3aWR0aDogNDhweDsgbWFyZ2luLXJpZ2h0 OiAxMnB4OyBiYWNrZ3JvdW5kOiB1cmwoIiArIGJvYXJkX3RlbXBsYXRlX3VybCAr ICJpbWcvaWNvbnMvdG9vbGJhci9jb2xvcnBpY2tlci9mb3JtRmllbGRMYXJnZUJH LnBuZykgbm8tcmVwZWF0O1wiIC8+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJD TENQYmFzaWNSXCIgbWF4bGVuZ3RoPVwiM1wiIC8+PGlucHV0IHR5cGU9XCJ0ZXh0 XCIgaWQ9XCJDTENQYmFzaWNHXCIgbWF4bGVuZ3RoPVwiM1wiIC8+PGlucHV0IHR5 cGU9XCJ0ZXh0XCIgaWQ9XCJDTENQYmFzaWNCXCIgbWF4bGVuZ3RoPVwiM1wiIHN0 eWxlPVwibWFyZ2luLXJpZ2h0OiAxM3B4O1wiIC8+PGlucHV0IHR5cGU9XCJ0ZXh0 XCIgaWQ9XCJDTENQYmFzaWNIXCIgbWF4bGVuZ3RoPVwiM1wiIC8+PGlucHV0IHR5 cGU9XCJ0ZXh0XCIgaWQ9XCJDTENQYmFzaWNTXCIgbWF4bGVuZ3RoPVwiM1wiIC8+ PGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJDTENQYmFzaWNWXCIgbWF4bGVuZ3Ro PVwiM1wiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAwO1wiIC8+PGRpdiBjbGFzcz1c IkNMQ1BDbGVhclwiIHN0eWxlPVwid2lkdGg6IDI0MnB4OyBoZWlnaHQ6IDE1cHg7 IG1hcmdpbjogMDsgZm9udC1zaXplOiAwO1wiPjwvZGl2PjxkaXYgc3R5bGU9XCJi YWNrZ3JvdW5kOiB1cmwoIiArIGJvYXJkX3RlbXBsYXRlX3VybCArICJpbWcvaWNv bnMvdG9vbGJhci9jb2xvcnBpY2tlci9jLnBuZykgY2VudGVyIHRvcCBuby1yZXBl YXQ7XCI+PC9kaXY+PGRpdiBzdHlsZT1cImJhY2tncm91bmQ6IHVybCgiICsgYm9h cmRfdGVtcGxhdGVfdXJsICsgImltZy9pY29ucy90b29sYmFyL2NvbG9ycGlja2Vy L20ucG5nKSBjZW50ZXIgdG9wIG5vLXJlcGVhdDtcIj48L2Rpdj48ZGl2IHN0eWxl PVwiYmFja2dyb3VuZDogdXJsKCIgKyBib2FyZF90ZW1wbGF0ZV91cmwgKyAiaW1n L2ljb25zL3Rvb2xiYXIvY29sb3JwaWNrZXIveS5wbmcpIGNlbnRlciB0b3Agbm8t cmVwZWF0O1wiPjwvZGl2PjxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiB1cmwoIiAr IGJvYXJkX3RlbXBsYXRlX3VybCArICJpbWcvaWNvbnMvdG9vbGJhci9jb2xvcnBp Y2tlci9rLnBuZykgY2VudGVyIHRvcCBuby1yZXBlYXQ7XCI+PC9kaXY+PGRpdiBj bGFzcz1cIkNMQ1BDbGVhciBDTENQTm9EaW1cIj48L2Rpdj48ZGl2PjxpbnB1dCB0 eXBlPVwidGV4dFwiIGlkPVwiQ0xDUGJhc2ljQ1wiIG1heGxlbmd0aD1cIjNcIiAv PjwvZGl2PjxkaXY+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJDTENQYmFzaWNN XCIgbWF4bGVuZ3RoPVwiM1wiIC8+PC9kaXY+PGRpdj48aW5wdXQgdHlwZT1cInRl eHRcIiBpZD1cIkNMQ1BiYXNpY1lcIiBtYXhsZW5ndGg9XCIzXCIgLz48L2Rpdj48 ZGl2PjxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiQ0xDUGJhc2ljS1wiIG1heGxl bmd0aD1cIjNcIiAvPjwvZGl2PjxpbWcgc3JjPVwiIiArIGJvYXJkX3RlbXBsYXRl X3VybCArICJpbWcvaWNvbnMvdG9vbGJhci9jb2xvcnBpY2tlci9jbG9zZUJ0bi5w bmdcIiBzdHlsZT1cImZsb2F0OiBsZWZ0OyB3aWR0aDogMTNweDsgaGVpZ2h0OiAx M3B4OyBtYXJnaW46IDRweCAwIDAgMTA5cHg7IGN1cnNvcjogcG9pbnRlcjtcIiBv bmNsaWNrPVwiQ0xDUGhpZGVQaWNrZXIoY2FsbGJhY2spO1wiIGFsdD1cIkNsb3Nl XCIgLz48L2Rpdj48L2Rpdj48L2Rpdj4iOwoKCSQoIkNMQ1BJaW5uZXJTaGVsbCIp Lm9ubW91c2Vkb3duID0gZnVuY3Rpb24oX2V2ZW50KSB7CgkJX2NsaWNrTW91c2VM b2NhbGVDTENQSWlubmVyU2hlbGwgPSB0cnVlOwoJCV9jYW5EcmFnUGlja2VyID0g ZmFsc2U7Cgl9CgkkKCJDTENQRHJhZ0RpdiIpLm9ubW91c2Vkb3duID0gZnVuY3Rp b24oKSB7CgkJaWYgKF9jbGlja01vdXNlTG9jYWxlQ0xDUElpbm5lclNoZWxsID09 IGZhbHNlKSB7CgkJCV9jYW5EcmFnUGlja2VyID0gdHJ1ZTsKCQkJX0NMQ1BPZmZz ZXQueCA9IChfbW91c2VDb29yZHNbMF0gLSBwYXJzZUludCgkUygiQ0xDUCIpLmxl ZnQpKTsKCQkJX0NMQ1BPZmZzZXQueSA9IChfbW91c2VDb29yZHNbMV0gLSBwYXJz ZUludCgkUygiQ0xDUCIpLnRvcCkpOwoJCX0KCX0KCglpZiAoKF9DTENQZGlzcGxh eSA9PSAiYmxvY2siKSB8fCAoX0NMQ1BkaXNwbGF5ID09ICJub25lIikpIHsKCQkk UygiQ0xDUCIpLmRpc3BsYXkgPSBfQ0xDUGRpc3BsYXk7Cgl9CglpZiAoX0NMQ1Bw b3NpdGlvbiAhPSAiYWJzb2x1dGUiKSB7CgkJJFMoIkNMQ1AiKS5wb3NpdGlvbiA9 ICJyZWxhdGl2ZSI7Cgl9CglfQ0xDUGluaXRIZXggPSAoQ0xDUGlzSGV4KF9DTENQ aW5pdEhleCkpID8gX0NMQ1Bpbml0SGV4IDogImZmZmZmZiI7CglfQ0xDUGFic1Bv cyA9IENMQ1BhYnNQb3MoJCgiQ0xDUCIpKTsKCSQoIkNMQ1BiYXNpY0hleCIpLnZh bHVlID0gX0NMQ1Bpbml0SGV4OwoJQ0xDUHVwZGF0ZUJhc2ljRnJvbUZvcm0obnVs bCwiQ0xDUGJhc2ljSGV4Iik7CgoJdmFyIF9idG5zID0gWyJDTENQYmFzaWNIZXgi LCJDTENQYmFzaWNSIiwiQ0xDUGJhc2ljRyIsIkNMQ1BiYXNpY0IiLCJDTENQYmFz aWNIIiwiQ0xDUGJhc2ljUyIsIkNMQ1BiYXNpY1YiLCJDTENQYmFzaWNDIiwiQ0xD UGJhc2ljTSIsIkNMQ1BiYXNpY1kiLCJDTENQYmFzaWNLIl07Cglmb3IgKF9pPTA7 X2k8X2J0bnMubGVuZ3RoO19pKyspIHsKCQlpZiAoWyJDTENQYmFzaWNDIiwiQ0xD UGJhc2ljTSIsIkNMQ1BiYXNpY1kiLCJDTENQYmFzaWNLIl0uQ0xDUGluX2FycmF5 KF9idG5zW19pXSkgPT0gZmFsc2UpIHsKCQkJJChfYnRuc1tfaV0pLm9uYmx1ciA9 ICQoX2J0bnNbX2ldKS5vbmtleXVwID0gZnVuY3Rpb24oX2V2ZW50KSB7CgkJCQlf ZXZlbnQgPSAoX2V2ZW50KSA/IENMQ1Bkb21FdmVudChfZXZlbnQpIDogQ0xDUGRv bUV2ZW50KHdpbmRvdy5ldmVudCk7CgkJCQlDTENQdXBkYXRlQmFzaWNGcm9tRm9y bShfZXZlbnQsX2V2ZW50LnRhcmdldC5pZCx0cnVlKTsKCQkJfQoJCX0KCgkJJChf YnRuc1tfaV0pLm9ua2V5ZG93biA9IGZ1bmN0aW9uKF9ldmVudCkgewoJCQlfZXZl bnQgPSAoX2V2ZW50KSA/IENMQ1Bkb21FdmVudChfZXZlbnQpIDogQ0xDUGRvbUV2 ZW50KHdpbmRvdy5ldmVudCk7CgkJCXZhciBfdmFsID0gJChfZXZlbnQudGFyZ2V0 LmlkKS52YWx1ZTsKCQkJaWYgKFs0MCwzOF0uQ0xDUGluX2FycmF5KF9ldmVudC5j b2RlKSkgewoJCQkJX3ZhbCA9IChfZXZlbnQudGFyZ2V0LmlkID09ICJDTENQYmFz aWNIZXgiKSA/IENMQ1BoZXgyZGVjKF92YWwpIDogcGFyc2VJbnQoX3ZhbCk7CgkJ CQkoX2V2ZW50LmNvZGUgPT0gNDApID8gKChDTENQd2l0aGluKC0tX3ZhbCxfQ0xD UGJhc2ljTGltaXRzW19ldmVudC50YXJnZXQuaWRdWzBdLF9DTENQYmFzaWNMaW1p dHNbX2V2ZW50LnRhcmdldC5pZF1bMV0pKSA/ICIiIDogX3ZhbCsrKSA6ICgoQ0xD UHdpdGhpbigrK192YWwsX0NMQ1BiYXNpY0xpbWl0c1tfZXZlbnQudGFyZ2V0Lmlk XVswXSxfQ0xDUGJhc2ljTGltaXRzW19ldmVudC50YXJnZXQuaWRdWzFdKSkgPyAi IiA6IF92YWwtLSk7CgkJCQlfdmFsID0gKF9ldmVudC50YXJnZXQuaWQgPT0gIkNM Q1BiYXNpY0hleCIpID8gQ0xDUGRlYzJoZXgoX3ZhbCkudG9TdHJpbmcoKS5DTENQ cGFkSGV4KCkgOiBfdmFsOwoJCQkJJChfZXZlbnQudGFyZ2V0LmlkKS52YWx1ZSA9 IF92YWw7CgkJCX0KCQkJaWYgKFsxMyw0MCwzOF0uQ0xDUGluX2FycmF5KF9ldmVu dC5jb2RlKSkgewoJCQkJQ0xDUHVwZGF0ZUJhc2ljRnJvbUZvcm0oX2V2ZW50LF9l dmVudC50YXJnZXQuaWQpOwoJCQl9CgkJfQoJfQp9OwoKQ0xDUERyYWdQaWNrZXIg PSBmdW5jdGlvbihfZXZlbnQpIHsKCWlmIChfQ0xDUGlzRHJhZ2dhYmxlID09IHRy dWUpIHsKCQl2YXIgX3hPZmZzZXQgPSAoX21vdXNlQ29vcmRzWzBdIC0gX0NMQ1BP ZmZzZXQueCk7CgkJaWYgKCRTKCJDTENQIikucG9zaXRpb24gPT0gImFic29sdXRl IikgewoJCQlfeE9mZnNldCA9IChfeE9mZnNldCA8IDApID8gMCA6IF94T2Zmc2V0 OwoJCX0KCQl2YXIgX3lPZmZzZXQgPSAoX21vdXNlQ29vcmRzWzFdIC0gX0NMQ1BP ZmZzZXQueSk7CgkJaWYgKCRTKCJDTENQIikucG9zaXRpb24gPT0gImFic29sdXRl IikgewoJCQlfeU9mZnNldCA9IChfeU9mZnNldCA8IDApID8gMCA6IF95T2Zmc2V0 OwoJCX0KCQkkUygiQ0xDUCIpLmxlZnQgPSAoX3hPZmZzZXQgKyAicHgiKTsKCQkk UygiQ0xDUCIpLnRvcCA9IChfeU9mZnNldCArICJweCIpOwoJfQp9OwoKQ0xDUE1v dXNlSGFuZGxlck9uTW91c2VNb3ZlID0gZnVuY3Rpb24oX2V2ZW50KSB7Cgl2YXIg X3Njcm9sbFRvcCA9IChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9w KSA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgOiBkb2N1bWVu dC5ib2R5LnNjcm9sbFRvcDsKCXZhciBfc2Nyb2xsTGVmdCA9IChkb2N1bWVudC5k b2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCkgPyBkb2N1bWVudC5kb2N1bWVudEVs ZW1lbnQuc2Nyb2xsTGVmdCA6IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDsKCglf ZXZlbnQgPSAoX2V2ZW50KSA/IF9ldmVudCA6IGV2ZW50OwoJX21vdXNlQ29vcmRz ID0gKGRvY3VtZW50LmFsbCkgPyBbZXZlbnQuY2xpZW50WCArIF9zY3JvbGxMZWZ0 LGV2ZW50LmNsaWVudFkgKyBfc2Nyb2xsVG9wXSA6IFtfZXZlbnQucGFnZVgsX2V2 ZW50LnBhZ2VZXTsKCglpZiAoX2NsaWNrTW91c2VMb2NhbGUgPT0gIkNMQ1BQaWNr ZXIiKSB7CgkJQ0xDUGRyYWcoX2V2ZW50KTsKCX0gZWxzZSBpZiAoX2NhbkRyYWdQ aWNrZXIpIHsKCQlDTENQRHJhZ1BpY2tlcihfZXZlbnQpOwoJfQp9OwoKQ0xDUE1v dXNlSGFuZGxlck9uTW91c2VVcCA9IGZ1bmN0aW9uKF9ldmVudCkgewoJZG9jdW1l bnQub25zZWxlY3RzdGFydCA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0cnVlOwoJ fQoKCWlmIChfY2xpY2tNb3VzZUxvY2FsZSA9PSAiQ0xDUFBpY2tlciIpIHsKCQlf c3RvcCA9IDE7Cgl9CglfY2xpY2tNb3VzZUxvY2FsZSA9ICIiOwoJX2NhbkRyYWdQ aWNrZXIgPSBmYWxzZTsKCV9jbGlja01vdXNlTG9jYWxlQ0xDUElpbm5lclNoZWxs ID0gZmFsc2U7Cn07CgpDTENQTW91c2VIYW5kbGVyT25Nb3VzZURvd24gPSBmdW5j dGlvbigpIHsKCWRvY3VtZW50Lm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbigpIHsK CQlyZXR1cm4gZmFsc2U7Cgl9Cn07CgpDTENQc2hvd1BpY2tlciA9IGZ1bmN0aW9u KF9vYmopIHsKCXZhciBfeCA9IChfb2JqICYmIF9vYmouX3gpID8gX29iai5feCA6 IF9tb3VzZUNvb3Jkc1swXTsKCXZhciBfeSA9IChfb2JqICYmIF9vYmouX3kpID8g X29iai5feSA6IF9tb3VzZUNvb3Jkc1sxXTsKCgljYWxsYmFjayA9IF9vYmouY2Fs bGJhY2s7CgoJaWYgKCRTKCJDTENQIikucG9zaXRpb24gPT0gInJlbGF0aXZlIikg ewoJCV94IC09IF9DTENQYWJzUG9zLng7CgkJX3kgLT0gX0NMQ1BhYnNQb3MueTsK CX0KCglpZiAoX29iaiAmJiBDTENQaXNIZXgoX29iai5faGV4KSkgewoJCSQoIkNM Q1BiYXNpY0hleCIpLnZhbHVlID0gX29iai5faGV4OwoJCUNMQ1B1cGRhdGVCYXNp Y0Zyb21Gb3JtKG51bGwsIkNMQ1BiYXNpY0hleCIpOwoJfQoKCSRTKCJDTENQIiku bGVmdCA9IChfeCArICJweCIpOwoJJFMoIkNMQ1AiKS50b3AgPSAoX3kgKyAicHgi KTsKCSRTKCJDTENQIikuZGlzcGxheSA9ICJibG9jayI7Cn07CgpDTENQaGlkZVBp Y2tlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CgkkUygiQ0xDUCIpLmRpc3BsYXkg PSAibm9uZSI7CgoJaWYodHlwZW9mIGNhbGxiYWNrID09ICdmdW5jdGlvbicpCgkJ Y2FsbGJhY2soKTsKfTsKCkNMQ1BhZ2VudCA9IGZ1bmN0aW9uKF9hZ2VudCkgewoJ cmV0dXJuIE1hdGgubWF4KG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2Uo KS5pbmRleE9mKF9hZ2VudCksMCk7Cn07CgpDTENQc2xpZGUgPSBmdW5jdGlvbihf ZEgsX29iamVjdCxfZXZlbnQpIHsKCV9jbGlja01vdXNlTG9jYWxlID0gIkNMQ1BQ aWNrZXIiOwoJaWYgKF9zdG9wKSB7CgkJX3N0b3AgPSAwOwoKCQlfZHJhZ0hhbmRs ZVN0eWxlID0gJFMoX2RIKTsKCQlfZHJhZ0hhbmRsZSA9IF9kSDsKCQlfYWJzb2x1 dGVQb3NpdGlvbiA9IENMQ1BhYnNQb3MoJChfb2JqZWN0KSksIHRYLCB0WTsKCQlf YWJzb2x1dGVQb3NpdGlvbi54ICs9IDc7CgkJX2Fic29sdXRlUG9zaXRpb24ueSAr PSA3OwoKCQlDTENQZHJhZyhfZXZlbnQpOwoJfQp9OwoKQ0xDUFhZID0gZnVuY3Rp b24oX2V2ZW50KSB7Cgl2YXIgX3Njcm9sbFRvcCA9IChkb2N1bWVudC5kb2N1bWVu dEVsZW1lbnQuc2Nyb2xsVG9wKSA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5z Y3JvbGxUb3AgOiBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDsKCXZhciBfc2Nyb2xs TGVmdCA9IChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCkgPyBk b2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCA6IGRvY3VtZW50LmJv ZHkuc2Nyb2xsTGVmdDsKCXJldHVybiBDTENQYWdlbnQoIm1zaWUiKSA/IFtldmVu dC5jbGllbnRYICsgX3Njcm9sbExlZnQsZXZlbnQuY2xpZW50WSArIF9zY3JvbGxU b3BdIDogW19ldmVudC5wYWdlWCxfZXZlbnQucGFnZVldOwp9OwoKQ0xDUHRYWSA9 IGZ1bmN0aW9uKF9ldmVudCkgewoJdFkgPSBDTENQWFkoX2V2ZW50KVsxXSAtIF9h YnNvbHV0ZVBvc2l0aW9uLnk7Cgl0WCA9IENMQ1BYWShfZXZlbnQpWzBdIC0gX2Fi c29sdXRlUG9zaXRpb24ueDsKfTsKCkNMQ1Bja0hTViA9IGZ1bmN0aW9uKGEsYixf ZHJhZ0hhbmRsZSkgewoJaWYgKENMQ1B3aXRoaW4oYSwwLGIpKSB7CgkJcmV0dXJu IGE7Cgl9IGVsc2UgaWYgKGEgPiBiKSB7CgkJcmV0dXJuIGI7Cgl9IGVsc2UgaWYg KGEgPCAwKSB7CgkJaWYgKF9kcmFnSGFuZGxlID09ICJDTENQYmFzaWNTYXRWYWxT bGlkZSIpIHsKCQkJcmV0dXJuIC0zOwoJCX0gZWxzZSB7CgkJCXJldHVybiAtNDsK CQl9Cgl9Cn07CgpDTENQd2l0aGluID0gZnVuY3Rpb24oX3ZhbCxfbG93LF9oaWdo KSB7CglyZXR1cm4gKChfdmFsID49IF9sb3cpICYmIChfdmFsIDw9IF9oaWdoKSk7 Cn07CgpDTENQbWtIU1YgPSBmdW5jdGlvbihhLGIsYykgewoJcmV0dXJuIE1hdGgu bWluKGEsTWF0aC5tYXgoMCxNYXRoLmNlaWwoKHBhcnNlSW50KGMpIC8gYikgKiBh KSkpOwp9OwoKQ0xDUGRyYWcgPSBmdW5jdGlvbihfZXZlbnQpIHsKCV9ldmVudCA9 ICghX2V2ZW50KSA/IHdpbmRvdy5ldmVudCA6IF9ldmVudDsKCWlmICghX3N0b3Ap IHsKCQlDTENQdFhZKF9ldmVudCk7CgoJCWNsZWFyVGltZW91dChfcmVmcmVzaFRp bWVvdXQpOwoJCWlmIChfZHJhZ0hhbmRsZSA9PSAiQ0xDUFNhdFZhbFNsaWRlIikg ewoJCQlfZHJhZ0hhbmRsZVN0eWxlLmxlZnQgPSBDTENQY2tIU1YodFgsd1NWLF9k cmFnSGFuZGxlKSArICJweCI7CgkJCV9kcmFnSGFuZGxlU3R5bGUudG9wID0gQ0xD UGNrSFNWKHRZLHdTVixfZHJhZ0hhbmRsZSkgKyAicHgiOwoKCQkJJFMoIkNMQ1BT YXRTbGlkZSIpLnRvcCA9IE1hdGguZmxvb3IoKENMQ1Bja0hTVih0WCx3U1YsIkNM Q1BTYXRWYWxTbGlkZSIpIC8gd1NWKSAqIF9odWVUcmFja0hlaWdodCkgKyAicHgi OwoJCQkkUygiQ0xDUFZhbFNsaWRlIikudG9wID0gTWF0aC5mbG9vcigoQ0xDUGNr SFNWKHRZLHdTViwiQ0xDUFNhdFZhbFNsaWRlIikgLyB3U1YpICogX2h1ZVRyYWNr SGVpZ2h0KSArICJweCI7CgkJCUhTVlsxXSA9IENMQ1Bta0hTVigxMDAsd1NWLF9k cmFnSGFuZGxlU3R5bGUubGVmdCk7CgkJCUhTVlsyXSA9IDEwMCAtIENMQ1Bta0hT VigxMDAsd1NWLF9kcmFnSGFuZGxlU3R5bGUudG9wKTsKCQl9IGVsc2UgaWYgKF9k cmFnSGFuZGxlID09ICJDTENQSHVlU2xpZGUiKSB7CgkJCXZhciBjayA9IENMQ1Bj a0hTVih0WSxfaHVlVHJhY2tIZWlnaHQsX2RyYWdIYW5kbGUpOwoJCQlfZHJhZ0hh bmRsZVN0eWxlLnRvcCA9IChjayArICJweCIpOwoJCQlIU1ZbMF0gPSBDTENQbWtI U1YoMzYwLF9odWVUcmFja0hlaWdodCxjayk7CgkJfSBlbHNlIGlmIChfZHJhZ0hh bmRsZSA9PSAiQ0xDUFNhdFNsaWRlIikgewoJCQl2YXIgY2sgPSBDTENQY2tIU1Yo dFksX2h1ZVRyYWNrSGVpZ2h0LF9kcmFnSGFuZGxlKTsKCQkJX2RyYWdIYW5kbGVT dHlsZS50b3AgPSAoY2sgKyAicHgiKTsKCQkJJFMoIkNMQ1BTYXRWYWxTbGlkZSIp LmxlZnQgPSBNYXRoLmZsb29yKChDTENQY2tIU1YodFksX2h1ZVRyYWNrSGVpZ2h0 LCJDTENQU2F0VmFsU2xpZGUiKSAvIF9odWVUcmFja0hlaWdodCkgKiB3U1YpICsg InB4IjsKCQkJSFNWWzFdID0gQ0xDUG1rSFNWKDEwMCxfaHVlVHJhY2tIZWlnaHQs Y2spOwoJCX0gZWxzZSBpZiAoX2RyYWdIYW5kbGUgPT0gIkNMQ1BWYWxTbGlkZSIp IHsKCQkJdmFyIGNrID0gQ0xDUGNrSFNWKHRZLF9odWVUcmFja0hlaWdodCxfZHJh Z0hhbmRsZSk7CgkJCV9kcmFnSGFuZGxlU3R5bGUudG9wID0gKGNrICsgInB4Iik7 CgkJCSRTKCJDTENQU2F0VmFsU2xpZGUiKS50b3AgPSBNYXRoLmZsb29yKChDTENQ Y2tIU1YodFksX2h1ZVRyYWNrSGVpZ2h0LCJDTENQU2F0VmFsU2xpZGUiKSAvIF9o dWVUcmFja0hlaWdodCkgKiB3U1YpICsgInB4IjsKCQkJSFNWWzJdID0gKDEwMCAt IENMQ1Bta0hTVigxMDAsX2h1ZVRyYWNrSGVpZ2h0LGNrKSk7CgkJfQoKCQkkUygi Q0xDUFNhdFZhbCIpLmJhY2tncm91bmRDb2xvciA9ICRTKCJDTENQU2F0IikuYmFj a2dyb3VuZENvbG9yID0gJFMoIkNMQ1BWYWwiKS5iYWNrZ3JvdW5kQ29sb3IgPSAo IiMiICsgQ0xDUGhzdjJoZXgoW0hTVlswXSwxMDAsMTAwXSkpOwoJCWlmIChDTENQ SGFuZGxlcikgewoJCQlDTENQSGFuZGxlcihDTENQaHN2MmhleChIU1YpKTsKCQl9 CgkJQ0xDUHVwZGF0ZUJhc2ljRm9ybUVsZW1lbnRzKCk7Cgl9Cn07CgpDTENQdXBk YXRlQmFzaWNGb3JtRWxlbWVudHMgPSBmdW5jdGlvbihfZXhjZXB0KSB7CglpZiAo X2V4Y2VwdCAhPSAiQ0xDUGJhc2ljSGV4IikgewoJCSQoIkNMQ1BiYXNpY0hleCIp LnZhbHVlID0gQ0xDUGhzdjJoZXgoSFNWKTsKCX0KCgl2YXIgX3JnYiA9IENMQ1Bo c3YycmdiKEhTVik7CglpZiAoX2V4Y2VwdCAhPSAiQ0xDUGJhc2ljUiIpIHsKCQkk KCJDTENQYmFzaWNSIikudmFsdWUgPSBwYXJzZUludChfcmdiWzBdKTsKCX0KCWlm IChfZXhjZXB0ICE9ICJDTENQYmFzaWNHIikgewoJCSQoIkNMQ1BiYXNpY0ciKS52 YWx1ZSA9IHBhcnNlSW50KF9yZ2JbMV0pOwoJfQoJaWYgKF9leGNlcHQgIT0gIkNM Q1BiYXNpY0IiKSB7CgkJJCgiQ0xDUGJhc2ljQiIpLnZhbHVlID0gcGFyc2VJbnQo X3JnYlsyXSk7Cgl9CgoJaWYgKF9leGNlcHQgIT0gIkNMQ1BiYXNpY0giKSB7CgkJ JCgiQ0xDUGJhc2ljSCIpLnZhbHVlID0gcGFyc2VJbnQoSFNWWzBdKTsKCX0KCWlm IChfZXhjZXB0ICE9ICJDTENQYmFzaWNTIikgewoJCSQoIkNMQ1BiYXNpY1MiKS52 YWx1ZSA9IHBhcnNlSW50KEhTVlsxXSk7Cgl9CglpZiAoX2V4Y2VwdCAhPSAiQ0xD UGJhc2ljViIpIHsKCQkkKCJDTENQYmFzaWNWIikudmFsdWUgPSBwYXJzZUludChI U1ZbMl0pOwoJfQoKCXZhciBfY215ayA9IENMQ1ByZ2IyY215ayhDTENQaHN2MnJn YihIU1YpKTsKCWlmIChfZXhjZXB0ICE9ICJDTENQYmFzaWNDIikgewoJCSQoIkNM Q1BiYXNpY0MiKS52YWx1ZSA9IHBhcnNlSW50KF9jbXlrWzBdKTsKCX0KCWlmIChf ZXhjZXB0ICE9ICJDTENQYmFzaWNNIikgewoJCSQoIkNMQ1BiYXNpY00iKS52YWx1 ZSA9IHBhcnNlSW50KF9jbXlrWzFdKTsKCX0KCWlmIChfZXhjZXB0ICE9ICJDTENQ YmFzaWNZIikgewoJCSQoIkNMQ1BiYXNpY1kiKS52YWx1ZSA9IHBhcnNlSW50KF9j bXlrWzJdKTsKCX0KCWlmIChfZXhjZXB0ICE9ICJDTENQYmFzaWNLIikgewoJCSQo IkNMQ1BiYXNpY0siKS52YWx1ZSA9IHBhcnNlSW50KF9jbXlrWzNdKTsKCX0KfTsK CkNMQ1B1cGRhdGVCYXNpY0Zyb21Gb3JtID0gZnVuY3Rpb24oX2V2ZW50LF9lbGVt ZW50SUQpIHsKCWlmIChfZWxlbWVudElEID09ICIiKSB7CgkJX2V2ZW50ID0gKF9l dmVudCkgPyBfZXZlbnQgOiB3aW5kb3cuZXZlbnQ7CgkJaWYgKF9ldmVudC5zcmNF bGVtZW50KSB7CgkJCV9ldmVudC50YXJnZXQgPSBfZXZlbnQuc3JjRWxlbWVudDsK CQl9CgkJdmFyIF9pZCA9IF9ldmVudC50YXJnZXQuaWQ7Cgl9IGVsc2UgewoJCXZh ciBfaWQgPSBfZWxlbWVudElEOwoJfQoJdmFyIF92YWwgPSAkKF9pZCkudmFsdWUs IF9jYW5VcGRhdGUgPSBmYWxzZSwgX3NraXBIU1YgPSBmYWxzZTsKCglpZiAoX2lk ID09ICJDTENQYmFzaWNIZXgiKSB7CgkJaWYgKENMQ1Bpc0hleChfdmFsKSkgewoJ CQlIU1YgPSBDTENQcmdiMmhzdihDTENQaGV4MnJnYihfdmFsKSk7CgkJCV9jYW5V cGRhdGUgPSB0cnVlLCBfc2tpcEhTViA9IHRydWU7CgkJfQoJfSBlbHNlIGlmIChf aWQgPT0gIkNMQ1BiYXNpY1IiKSB7CgkJX3ZhbCA9IHBhcnNlSW50KF92YWwpOwoJ CWlmIChDTENQd2l0aGluKF92YWwsMCwyNTUpKSB7CgkJCXZhciBfcmdiID0gQ0xD UGhzdjJyZ2IoSFNWKTsKCQkJSFNWID0gQ0xDUHJnYjJoc3YoW192YWwsX3JnYlsx XSxfcmdiWzJdXSk7CgkJCV9jYW5VcGRhdGUgPSB0cnVlOwoJCX0KCX0gZWxzZSBp ZiAoX2lkID09ICJDTENQYmFzaWNHIikgewoJCV92YWwgPSBwYXJzZUludChfdmFs KTsKCQlpZiAoQ0xDUHdpdGhpbihfdmFsLDAsMjU1KSkgewoJCQl2YXIgX3JnYiA9 IENMQ1Boc3YycmdiKEhTVik7CgkJCUhTViA9IENMQ1ByZ2IyaHN2KFtfcmdiWzBd LF92YWwsX3JnYlsyXV0pOwoJCQlfY2FuVXBkYXRlID0gdHJ1ZTsKCQl9Cgl9IGVs c2UgaWYgKF9pZCA9PSAiQ0xDUGJhc2ljQiIpIHsKCQlfdmFsID0gcGFyc2VJbnQo X3ZhbCk7CgkJaWYgKENMQ1B3aXRoaW4oX3ZhbCwwLDI1NSkpIHsKCQkJdmFyIF9y Z2IgPSBDTENQaHN2MnJnYihIU1YpOwoJCQlIU1YgPSBDTENQcmdiMmhzdihbX3Jn YlswXSxfcmdiWzFdLF92YWxdKTsKCQkJX2NhblVwZGF0ZSA9IHRydWU7CgkJfQoJ fSBlbHNlIGlmIChfaWQgPT0gIkNMQ1BiYXNpY0giKSB7CgkJX3ZhbCA9IHBhcnNl SW50KF92YWwpOwoJCWlmIChDTENQd2l0aGluKF92YWwsMCwzNjApKSB7CgkJCUhT ViA9IFtfdmFsLEhTVlsxXSxIU1ZbMl1dCgkJCV9jYW5VcGRhdGUgPSB0cnVlOwoJ CX0KCX0gZWxzZSBpZiAoX2lkID09ICJDTENQYmFzaWNTIikgewoJCV92YWwgPSBw YXJzZUludChfdmFsKTsKCQlpZiAoQ0xDUHdpdGhpbihfdmFsLDAsMzYwKSkgewoJ CQlIU1YgPSBbSFNWWzBdLF92YWwsSFNWWzJdXQoJCQlfY2FuVXBkYXRlID0gdHJ1 ZTsKCQl9Cgl9IGVsc2UgaWYgKF9pZCA9PSAiQ0xDUGJhc2ljViIpIHsKCQlfdmFs ID0gcGFyc2VJbnQoX3ZhbCk7CgkJaWYgKENMQ1B3aXRoaW4oX3ZhbCwwLDM2MCkp IHsKCQkJSFNWID0gW0hTVlswXSxIU1ZbMV0sX3ZhbF0KCQkJX2NhblVwZGF0ZSA9 IHRydWU7CgkJfQoJfSBlbHNlIGlmICgoX2lkID09ICJDTENQYmFzaWNDIikgfHwg KF9pZCA9PSAiQ0xDUGJhc2ljTSIpIHx8IChfaWQgPT0gIkNMQ1BiYXNpY1kiKSB8 fCAoX2lkID09ICJDTENQYmFzaWNLIikpIHsKCQlfYyA9IHBhcnNlSW50KCQoIkNM Q1BiYXNpY0MiKS52YWx1ZSk7CgkJX20gPSBwYXJzZUludCgkKCJDTENQYmFzaWNN IikudmFsdWUpOwoJCV95ID0gcGFyc2VJbnQoJCgiQ0xDUGJhc2ljWSIpLnZhbHVl KTsKCQlfayA9IHBhcnNlSW50KCQoIkNMQ1BiYXNpY0siKS52YWx1ZSk7CgoJCWlm IChfaWQgPT0gIkNMQ1BiYXNpY0MiKSB7CgkJCV9jID0gKENMQ1B3aXRoaW4oX2Ms MCwxMDApKSA/IF9jIDogMDsKCQl9IGVsc2UgaWYgKF9pZCA9PSAiQ0xDUGJhc2lj TSIpIHsKCQkJX20gPSAoQ0xDUHdpdGhpbihfbSwwLDEwMCkpID8gX20gOiAwOwoJ CX0gZWxzZSBpZiAoX2lkID09ICJDTENQYmFzaWNZIikgewoJCQlfeSA9IChDTENQ d2l0aGluKF95LDAsMTAwKSkgPyBfeSA6IDA7CgkJfSBlbHNlIGlmIChfaWQgPT0g IkNMQ1BiYXNpY0siKSB7CgkJCV9rID0gKENMQ1B3aXRoaW4oX2ssMCwxMDApKSA/ IF9rIDogMDsKCQl9CgkJSFNWID0gQ0xDUHJnYjJoc3YoQ0xDUGNteWsycmdiKFtf YyxfbSxfeSxfa10pKTsKCQlfY2FuVXBkYXRlID0gdHJ1ZTsKCX0KCglpZiAoX2Nh blVwZGF0ZSkgewoJCXZhciBfaHVlU2xpZGVyWSA9IENMQ1BoMnkoSFNWWzBdKTsK CQl2YXIgX3NhdFNsaWRlclkgPSBDTENQczJ5KEhTVlsxXSk7CgkJdmFyIF92YWxT bGlkZXJZID0gQ0xDUHYyeShIU1ZbMl0pOwoKCQkkUygiQ0xDUEh1ZVNsaWRlIiku dG9wID0gTWF0aC5mbG9vcihDTENQY2tIU1YoKF9odWVTbGlkZXJZIC0gMyksX2h1 ZVRyYWNrSGVpZ2h0ICsgMywiQ0xDUEh1ZVNsaWRlIikpICsgInB4IjsKCQkkUygi Q0xDUFNhdFNsaWRlIikudG9wID0gTWF0aC5mbG9vcihDTENQY2tIU1YoKF9zYXRT bGlkZXJZIC0gMyksX2h1ZVRyYWNrSGVpZ2h0ICsgMywiQ0xDUFNhdFNsaWRlIikp ICsgInB4IjsKCQkkUygiQ0xDUFZhbFNsaWRlIikudG9wID0gTWF0aC5mbG9vcihD TENQY2tIU1YoKF92YWxTbGlkZXJZIC0gMyksX2h1ZVRyYWNrSGVpZ2h0ICsgMywi Q0xDUFZhbFNsaWRlIikpICsgInB4IjsKCgkJJFMoIkNMQ1BTYXRWYWxTbGlkZSIp LmxlZnQgPSBNYXRoLmNlaWwoQ0xDUGNrSFNWKChfc2F0U2xpZGVyWSAtIDcpLHdT ViwiQ0xDUFNhdFZhbFNsaWRlIikpICsgInB4IjsKCQkkUygiQ0xDUFNhdFZhbFNs aWRlIikudG9wID0gTWF0aC5jZWlsKENMQ1Bja0hTVigoX3ZhbFNsaWRlclkgLSA3 KSx3U1YsIkNMQ1BTYXRWYWxTbGlkZSIpKSArICJweCI7CgkJJFMoIkNMQ1BTYXRW YWwiKS5iYWNrZ3JvdW5kQ29sb3IgPSAkUygiQ0xDUFNhdCIpLmJhY2tncm91bmRD b2xvciA9ICRTKCJDTENQVmFsIikuYmFja2dyb3VuZENvbG9yID0gKCIjIiArIENM Q1Boc3YyaGV4KFtIU1ZbMF0sMTAwLDEwMF0pKTsKCQl2YXIgX3RtcCA9IChfc2tp cEhTViA9PSBmYWxzZSkgPyBDTENQaHN2MmhleChIU1YpIDogX3ZhbDsKCgkJaWYg KENMQ1BIYW5kbGVyKSB7CgkJCUNMQ1BIYW5kbGVyKF90bXApOwoJCX0KCQlDTENQ dXBkYXRlQmFzaWNGb3JtRWxlbWVudHMoX2lkKTsKCX0KfTsKCgovKiBDT05WRVJT SU9OUyAqLwpDTENQaDJ5ID0gZnVuY3Rpb24oX2h1ZSkgewoJcmV0dXJuICgoX2h1 ZSAvIDM2MCkgKiBfaHVlVHJhY2tIZWlnaHQpOwp9OwpDTENQczJ5ID0gZnVuY3Rp b24oX3NhdFZhbCkgewoJcmV0dXJuICgoX3NhdFZhbCAvIDEwMCkgKiBfaHVlVHJh Y2tIZWlnaHQpOwp9OwpDTENQdjJ5ID0gZnVuY3Rpb24oX3ZhbFZhbCkgewoJcmV0 dXJuIChNYXRoLmFicygoKF92YWxWYWwgLyAxMDApICogKF9odWVUcmFja0hlaWdo dCArIDMpKSAtIF9odWVUcmFja0hlaWdodCAtIDMpKTsKfTsKQ0xDUGhzdjJoZXgg PSBmdW5jdGlvbihoKSB7CglyZXR1cm4gQ0xDUHJnYjJoZXgoQ0xDUGhzdjJyZ2Io aCkpOwp9OwpDTENQdG9IZXggPSBmdW5jdGlvbih2KSB7Cgl2PU1hdGgucm91bmQo TWF0aC5taW4oTWF0aC5tYXgoMCx2KSwyNTUpKTsgcmV0dXJuKCIwMTIzNDU2Nzg5 QUJDREVGIi5jaGFyQXQoKHYtdiUxNikvMTYpKyIwMTIzNDU2Nzg5QUJDREVGIi5j aGFyQXQodiUxNikpOwp9OwpDTENQaGV4MnJnYiA9IGZ1bmN0aW9uKHIpIHsKCXJl dHVybih7MDpwYXJzZUludChyLnN1YnN0cigwLDIpLDE2KSwxOnBhcnNlSW50KHIu c3Vic3RyKDIsMiksMTYpLDI6cGFyc2VJbnQoci5zdWJzdHIoNCwyKSwxNil9KTsK fTsKQ0xDUHJnYjJoZXggPSBmdW5jdGlvbihyKSB7CglyZXR1cm4oQ0xDUHRvSGV4 KHJbMF0pK0NMQ1B0b0hleChyWzFdKStDTENQdG9IZXgoclsyXSkpOwp9OwpDTENQ cmdiMmhzdiA9IGZ1bmN0aW9uKHIpIHsKCXZhciBtYXg9TWF0aC5tYXgoclswXSxy WzFdLHJbMl0pLCBkZWx0YT1tYXgtTWF0aC5taW4oclswXSxyWzFdLHJbMl0pLCBI LCBTLCBWOwoJaWYobWF4IT0wKSB7CgkJUz1NYXRoLnJvdW5kKGRlbHRhL21heCox MDApOwoJCWlmKHJbMF09PW1heCkgSD0oclsxXS1yWzJdKS9kZWx0YTsgZWxzZSBp ZihyWzFdPT1tYXgpIEg9MisoclsyXS1yWzBdKS9kZWx0YTsgZWxzZSBpZihyWzJd PT1tYXgpIEg9NCsoclswXS1yWzFdKS9kZWx0YTsgdmFyIEg9TWF0aC5taW4oTWF0 aC5yb3VuZChIKjYwKSwzNjApOyBpZihIPDApIEgrPTM2MDsKCX0KCXJldHVybih7 MDpIP0g6MCwxOlM/UzowLDI6TWF0aC5yb3VuZCgobWF4LzI1NSkqMTAwKX0pOwp9 OwpDTENQaHN2MnJnYiA9IGZ1bmN0aW9uKHIpIHsKCXZhciBGLCBSLCBCLCBHLCBI PXJbMF0vMzYwLCBTPXJbMV0vMTAwLCBWPXJbMl0vMTAwOwoJaWYoUz4wKSB7CgkJ aWYoSD49MSkgSD0wOwoJCUg9NipIOyBGPUgtTWF0aC5mbG9vcihIKTsgQT1NYXRo LnJvdW5kKDI1NSpWKigxLVMpKTsgQj1NYXRoLnJvdW5kKDI1NSpWKigxLShTKkYp KSk7IEM9TWF0aC5yb3VuZCgyNTUqViooMS0oUyooMS1GKSkpKTsgVj1NYXRoLnJv dW5kKDI1NSpWKTsKCQlzd2l0Y2goTWF0aC5mbG9vcihIKSkgewoJCQljYXNlIDA6 IFI9VjsgRz1DOyBCPUE7IGJyZWFrOwoJCQljYXNlIDE6IFI9QjsgRz1WOyBCPUE7 IGJyZWFrOwoJCQljYXNlIDI6IFI9QTsgRz1WOyBCPUM7IGJyZWFrOwoJCQljYXNl IDM6IFI9QTsgRz1COyBCPVY7IGJyZWFrOwoJCQljYXNlIDQ6IFI9QzsgRz1BOyBC PVY7IGJyZWFrOwoJCQljYXNlIDU6IFI9VjsgRz1BOyBCPUI7IGJyZWFrOwoJCX0K CQlyZXR1cm4oW1I/UjowLEc/RzowLEI/QjowXSk7Cgl9CgllbHNlIHJldHVybihb KFY9TWF0aC5yb3VuZChWKjI1NSkpLFYsVl0pOwp9OwpDTENQcmdiMmNteWsgPSBm dW5jdGlvbihyKSB7Cgl2YXIgQz0xLShyWzBdLzI1NSksIE09MS0oclsxXS8yNTUp LCBZPTEtKHJbMl0vMjU1KSwgSz1NYXRoLm1pbihZLE1hdGgubWluKE0sTWF0aC5t aW4oQywxKSkpOwoJQz1NYXRoLnJvdW5kKChDLUspLygxLUspKjEwMCk7CglDID0g KGlzTmFOKEMpKSA/IDAgOiBDOwoJTT1NYXRoLnJvdW5kKChNLUspLygxLUspKjEw MCk7CglNID0gKGlzTmFOKE0pKSA/IDAgOiBNOwoJWT1NYXRoLnJvdW5kKChZLUsp LygxLUspKjEwMCk7CglZID0gKGlzTmFOKFkpKSA/IDAgOiBZOwoJSz1NYXRoLnJv dW5kKEsqMTAwKTsKCXJldHVybihbQz9DOjAsTT9NOjAsWT9ZOjAsS10pOwp9OwpD TENQY215azJyZ2IgPSBmdW5jdGlvbihyKSB7CglyWzNdPXJbM10vMTAwOyB2YXIg Uj0oMS0oclswXS8xMDAqKDEtclszXSkrclszXSkpKjI1NSwgRz0oMS0oclsxXS8x MDAqKDEtclszXSkrclszXSkpKjI1NSwgQj0oMS0oclsyXS8xMDAqKDEtclszXSkr clszXSkpKjI1NTsKCXJldHVybihbUixHLEJdKTsKfTsKdmFyIGRvY2xpYnNPcGVu ZWQgPSBBcnJheSgpOwp2YXIgY3VycmVudFRleHRhcmVhOwoKdmFyIHJtbF9idXR0 b25zID0gWwoJJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2Un LCdobGluZScsCgkvKidzdXAnLCAnc3ViJywnaGxpbmUnLCovCgknYWxpZ25fbGVm dCcsICdhbGlnbl9jZW50ZXInLCAnYWxpZ25fcmlnaHQnLCdobGluZScsCgknbGlz dF9idWxsZXQnLCAnbGlzdF9udW0nLCdobGluZScsCgkvKidjb2xvcl9iZycsICov J2NvbG9yX2ZnJywnaGxpbmUnLAoJJ2xpbmsnLCAnaW1hZ2UnLCdobGluZScsCgkn dGFibGUnLCAnaHInLCdobGluZScsCgknbWF4aW1pemUnLCAnZG9jdW1lbnRsaWJy YXJ5JywgJ3NtaWxleXMnCl07CgpmdW5jdGlvbiBzZXRDdXJyZW50VGV4dGFyZWEo d2luZG93KQp7CgljdXJyZW50VGV4dGFyZWEgPSBkb2NsaWJzT3BlbmVkW3dpbmRv d107Cn07CgpmdW5jdGlvbiBnZXRUb29sYmFyKCBzaG93RG9jdW1lbnRMaWJyYXJ5 ICkKewoJdmFyIHggPSBjcmVhdGVET01Ob2RlKCdkaXYnLCB7ImNsYXNzIjogInJt bHRvb2xiYXIifSwgW10pOwoKCXZhciBpbWc7Cglmb3IodmFyIGkgPSAwOyBpIDwg cm1sX2J1dHRvbnMubGVuZ3RoO2krKykKCXsKCQlpZihybWxfYnV0dG9uc1tpXSA9 PSAnZG9jdW1lbnRsaWJyYXJ5JyAmJiAhc2hvd0RvY3VtZW50TGlicmFyeSkKCQkJ Y29udGludWU7CgoJCWlmKHJtbF9idXR0b25zW2ldID09ICdtYXhpbWl6ZScgJiYg ZXZlbnRzLmluZGV4T2Yoc3RyZXRjaFRleHRhcmVhcykgPiAtMSkKCQkJY29udGlu dWU7CgoJCWlmKHJtbF9idXR0b25zW2ldID09ICdzbWlsZXlzJykKCQl7CgkJCXZh ciBzbWlsZXlzID0gKG5ldyBET01RdWVyeSgnZGl2I3NtaWxleXMnKSkuZ2V0KDAp OwoKCQkJaWYoIXNtaWxleXMpCgkJCQljb250aW51ZTsKCgkJCXZhciBzbWlsZXlz Q2xvbmUgPSBzbWlsZXlzLmNsb25lTm9kZSh0cnVlKTsKCQkJdmFyIHNtaWxleXND b250YWluZXIgPSBnZXRTaWJsaW5nTm9kZShzbWlsZXlzLCAndXAnLCAnZGQnKTsK CQkJdmFyIHNtaWxleXNDb250YWluZXJMYWJlbCA9IGdldFNpYmxpbmdOb2RlKHNt aWxleXNDb250YWluZXIsICdwcmV2aW91cycsICdkdCcpOwoKCQkJc21pbGV5c0Nv bnRhaW5lckxhYmVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc21pbGV5c0NvbnRh aW5lckxhYmVsKTsKCQkJc21pbGV5c0NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92 ZUNoaWxkKHNtaWxleXNDb250YWluZXIpOwoKCQkJeC5hcHBlbmRDaGlsZChzbWls ZXlzQ2xvbmUpOwoJCX0KCgkJaWYocm1sX2J1dHRvbnNbaV0gPT0gJ2NvbG9yX2Zn JyB8fCBybWxfYnV0dG9uc1tpXSA9PSAnY29sb3JfYmcnKQoJCXsKCQkJY29sb3Jw aWNrZXIgPSBuZXcgRE9NUXVlcnkoJ2RpdiNDTENQJykuZ2V0KDApOwoKCQkJaWYo IWNvbG9ycGlja2VyKQoJCQl7CgkJCQljb2xvcnBpY2tlciA9IGNyZWF0ZURPTU5v ZGUoJ2RpdicsIHsgJ2lkJyA6ICdDTENQJywgJ2NsYXNzJyA6ICdDTENQJyB9LCBb XSk7CgkJCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbG9ycGlja2VyKTsK CQkJCUNMQ1Bpbml0UGlja2VyKCk7CgkJCX0KCQl9CgoJCWltZyA9IGNyZWF0ZURP TU5vZGUoJ2ltZycsIHsKCQkJJ3NyYycJOiBib2FyZF90ZW1wbGF0ZV91cmwrJ2lt Zy9pY29ucy90b29sYmFyL3Rvb2xiYXItc3ByaXRlLmdpZicsCgkJCSdjbGFzcycg OiAnYnV0dG9uJywKCQkJJ3RpdGxlJyA6IGdldFRleHQoJ3Rvb2xiYXInLCBybWxf YnV0dG9uc1tpXSksCgkJCSdhbHQnIDogZ2V0VGV4dCgndG9vbGJhcicsIHJtbF9i dXR0b25zW2ldKQoJCX0sIFtdKTsKCgkJaWYocm1sX2J1dHRvbnNbaV0gIT0gJ2hs aW5lJykKCQl7CgkJCWFkZEV2ZW50KGltZywgJ2NsaWNrJywgaGFuZGxlUk1MVG9v bGJhckNsaWNrKTsKCQkJaW1nLmlkICA9ICdybWx0b29sYmFyXycrcm1sX2J1dHRv bnNbaV07CgkJfQoJCWVsc2UKCQkJanNjc3MoJ2FkZCcsaW1nLCdobGluZScsJycp OwoKCQl4LmFwcGVuZENoaWxkKGltZyk7Cgl9CgoJcmV0dXJuIHg7Cn07CgpmdW5j dGlvbiBoYW5kbGVSTUxUb29sYmFyQ2xpY2soKQp7CglpZih0aGlzLnBhcmVudE5v ZGUgJiYgdGhpcy5wYXJlbnROb2RlLm5leHRTaWJsaW5nICYmIHRoaXMucGFyZW50 Tm9kZS5uZXh0U2libGluZy50YWdOYW1lID09ICdURVhUQVJFQScpCgl7CgkJY3Vy cmVudFRleHRhcmVhID0gdGhpcy5wYXJlbnROb2RlLm5leHRTaWJsaW5nOwoJfQoK CXZhciBsaXN0dHlwZSwgbXlfbGluaywgbXlfdGl0bGUsIHNlbCwgcm93cywgdHlw ZSwgb3V0OwoKCXN3aXRjaCh0aGlzLmlkKQoJewoJCWNhc2UgJ3JtbHRvb2xiYXJf Ym9sZCc6CgkJCXdyYXBTZWxlY3Rpb24oJ1tiXScsJ1svYl0nKTsKCQkJcmV0dXJu OwoJCQlicmVhazsKCQljYXNlICdybWx0b29sYmFyX2l0YWxpYyc6CgkJCXdyYXBT ZWxlY3Rpb24oJ1tpXScsJ1svaV0nKTsKCQkJcmV0dXJuOwoJCQlicmVhazsKCQlj YXNlICdybWx0b29sYmFyX3VuZGVybGluZSc6CgkJCXdyYXBTZWxlY3Rpb24oJ1t1 XScsJ1svdV0nKTsKCQkJcmV0dXJuOwoJCQlicmVhazsKCQljYXNlICdybWx0b29s YmFyX3N0cmlrZSc6CgkJCXdyYXBTZWxlY3Rpb24oJ1tzXScsJ1svc10nKTsKCQkJ cmV0dXJuOwoJCQlicmVhazsKCQljYXNlICdybWx0b29sYmFyX3N1cCc6CgkJCXdy YXBTZWxlY3Rpb24oJ1tzdXBdJywnWy9zdXBdJyk7CgkJCXJldHVybjsKCQkJYnJl YWs7CgkJY2FzZSAncm1sdG9vbGJhcl9zdWInOgoJCQl3cmFwU2VsZWN0aW9uKCdb c3ViXScsJ1svc3ViXScpOwoJCQlyZXR1cm47CgkJCWJyZWFrOwoJCWNhc2UgJ3Jt bHRvb2xiYXJfYWxpZ25fbGVmdCc6CgkJCXdyYXBTZWxlY3Rpb24oJ1tsZWZ0XScs J1svbGVmdF0nKTsKCQkJcmV0dXJuOwoJCQlicmVhazsKCQljYXNlICdybWx0b29s YmFyX2FsaWduX2NlbnRlcic6CgkJCXdyYXBTZWxlY3Rpb24oJ1tjZW50ZXJdJywn Wy9jZW50ZXJdJyk7CgkJCXJldHVybjsKCQkJYnJlYWs7CgkJY2FzZSAncm1sdG9v bGJhcl9hbGlnbl9yaWdodCc6CgkJCXdyYXBTZWxlY3Rpb24oJ1tyaWdodF0nLCdb L3JpZ2h0XScpOwoJCQlyZXR1cm47CgkJCWJyZWFrOwoJCWNhc2UgJ3JtbHRvb2xi YXJfbGlzdF9idWxsZXQnOgoJCQlsaXN0dHlwZSA9ICcqJzsKCQljYXNlICdybWx0 b29sYmFyX2xpc3RfbnVtJzoKCQkJaWYodHlwZW9mIGxpc3R0eXBlID09ICd1bmRl ZmluZWQnKQoJCQkJbGlzdHR5cGUgPSAnMSc7CgkJCXZhciB0eXBlID0gJyonOwoJ CQl2YXIgc2VsID0gZ2V0Q3VycmVudFNlbGVjdGlvbigpOwoJCQl2YXIgcm93cyA9 IHNlbC5zcGxpdCgnXG4nKTsKCQkJdmFyIG91dCA9ICdbbGlzdD0nK2xpc3R0eXBl KyddJzsKCQkJZm9yKHZhciBpID0gMCwgcm93Oyhyb3c9cm93c1tpXSk7aSsrKQoJ CQl7CgkJCQlpZihyb3cgIT0gJycpCgkJCQkJb3V0ICs9ICdcblx0W2xpXScrcm93 KydbL2xpXSc7CgkJCX0KCgkJCWlmKGk9PTApCgkJCXsKCQkJCW91dCArPSAnXG5c dFtsaV0nK3JvdysnWy9saV0nOwoJCQl9CgoJCQlvdXQgKz0gJ1xuWy9saXN0XSc7 CgkJCXNldFNlbGVjdGlvbihvdXQpOwoJCQlyZXR1cm47CgkJCWJyZWFrOwoJCWNh c2UgJ3JtbHRvb2xiYXJfY29sb3JfZmcnOgoJCQlDTENQc2hvd1BpY2tlciggeyAn Y2FsbGJhY2snIDogZnVuY3Rpb24oKSB7IHdyYXBTZWxlY3Rpb24oIltmZ2NvbG9y PSIgKyBDTENQaHN2MmhleChIU1YpICsgIl0iLCAiWy9mZ2NvbG9yXSIpIH0gfSAp OwoJCQlicmVhazsKCQljYXNlICdybWx0b29sYmFyX2NvbG9yX2JnJzoKCQkJQ0xD UHNob3dQaWNrZXIoIHsgJ2NhbGxiYWNrJyA6IGZ1bmN0aW9uKCkgeyB3cmFwU2Vs ZWN0aW9uKCJbYmdjb2xvcj0iICsgQ0xDUGhzdjJoZXgoSFNWKSArICJdIiwgIlsv Ymdjb2xvcl0iKSB9IH0gKTsKCQkJYnJlYWs7CgkJY2FzZSAncm1sdG9vbGJhcl90 YWJsZSc6CgkJCXNlbCA9IGdldEN1cnJlbnRTZWxlY3Rpb24oKTsKCQkJcm93cyA9 IHNlbC5zcGxpdCgnXG4nKTsKCQkJb3V0ID0gJ1t0YWJsZV0nOwoJCQl2YXIgajsK CQkJZm9yKHZhciBpID0gMCwgcm93Oyhyb3c9cm93c1tpXSk7aSsrKQoJCQl7CgkJ CQlvdXQgKz0gJ1xuW3RyXSc7CgkJCQl2YXIgY2VsbHMgPSByb3cuc3BsaXQoJ1x0 Jyk7CgkJCQlmb3IodmFyIGo9MCwgY2VsbDsoY2VsbD1jZWxsc1tqXSk7aisrKQoJ CQkJewoJCQkJCW91dCArPSAnXG5cdFt0ZF0nK2NlbGwrJ1svdGRdJzsKCQkJCX0K CQkJCW91dCArPSAnXG5bL3RyXSc7CgkJCX0KCQkJb3V0ICs9ICdcblsvdGFibGVd JzsKCgkJCXNldFNlbGVjdGlvbihvdXQpOwoJCQlyZXR1cm47CgkJCWJyZWFrOwoJ CWNhc2UgJ3JtbHRvb2xiYXJfaW1hZ2UnOgoJCQlpZihnZXRDdXJyZW50U2VsZWN0 aW9uKCkgIT0gJycpCgkJCXsKCQkJCXdyYXBTZWxlY3Rpb24oJ1tpbWddJywgJ1sv aW1nXScpOwoJCQkJcmV0dXJuOwoJCQl9CgkJCW15X2xpbmsgPSBwcm9tcHQoZ2V0 VGV4dCgndG9vbGJhcicsICdlbnRlcl9pbWdfdXJsJyksImh0dHA6Ly8iKTsKCgkJ CWlmIChteV9saW5rICE9IG51bGwgJiYgbXlfbGluayAhPSdodHRwOi8vJykKCQkJ ewoJCQkJbGZ0PSJbaW1nXSIgKyBteV9saW5rOwoJCQkJcmd0PSJbL2ltZ10iOwoJ CQkJd3JhcFNlbGVjdGlvbihsZnQsIHJndCk7CgkJCX0KCQkJcmV0dXJuOwoJCQli cmVhazsKCQljYXNlICdybWx0b29sYmFyX2xpbmsnOgoJCQlteV9saW5rID0gcHJv bXB0KGdldFRleHQoJ3Rvb2xiYXInLCAnZW50ZXJfdXJsJyksImh0dHA6Ly8iKTsK CQkJaWYgKG15X2xpbmsgPT0gbnVsbCkKCQkJCXJldHVybjsKCgkJCXZhciBzZWxl Y3Rpb24gPSBnZXRDdXJyZW50U2VsZWN0aW9uKCk7CgkJCW15X3RpdGxlID0gcHJv bXB0KGdldFRleHQoJ3Rvb2xiYXInLCAnZW50ZXJfdGl0bGUnKSwiIik7CgoJCQlp ZiAoIHNlbGVjdGlvbiA9PSAnJyApCgkJCXsKCQkJCWlmKG15X3RpdGxlICE9ICcn ICkKCQkJCQlsZnQ9Ilt1cmw9IiArIG15X2xpbmsgKyAiXSIrbXlfdGl0bGU7CgkJ CQllbHNlCgkJCQkJbGZ0PSJbdXJsPSIgKyBteV9saW5rICsgIl0iK215X2xpbms7 CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlpZihteV90aXRsZSAhPSAnJyApCgkJCQkJ bGZ0PSJbdXJsPSIgKyBteV9saW5rICsgIiwiK215X3RpdGxlKyJdIjsKCQkJCWVs c2UKCQkJCQlsZnQ9Ilt1cmw9IiArIG15X2xpbmsgKyAiXSI7CgkJCX0KCgkJCXJn dD0iWy91cmxdIjsKCQkJd3JhcFNlbGVjdGlvbihsZnQsIHJndCk7CgkJCXJldHVy bjsKCQkJYnJlYWs7CgkJY2FzZSAncm1sdG9vbGJhcl9kb2N1bWVudGxpYnJhcnkn OgoJCQl2YXIgcmVmID0gd2luZG93Lm9wZW4oYm9hcmRfc2NyaXB0X3VybCsnL2xp c3RfZG9jdW1lbnRzP2RhdGFbc21hbGxdPTEnLCdEb2N1bWVudExpYnJhcnknLCd3 aWR0aD03ODUsaGVpZ2h0PTY1MCxyZXNpemFibGU9eWVzLHNjcm9sbGJhcnM9eWVz Jyk7CgkJCWRvY2xpYnNPcGVuZWRbcmVmXSA9IHRoaXMucGFyZW50Tm9kZS5uZXh0 U2libGluZzsKCQkJYnJlYWs7CgkJY2FzZSAncm1sdG9vbGJhcl9zbWlsZXlzJzoK CQkJdG9nZ2xlU21pbGV5cygpOwoJCQlhZGRFdmVudChnZXRfcm1sdGV4dGFyZWEo KSwgJ2ZvY3VzJywgaGlkZVNtaWxleXMpOwoJCQlhZGRFdmVudChnZXRfcm1sdGV4 dGFyZWEoKSwgJ2JsdXInLCBoaWRlU21pbGV5cyk7CgkJCWJyZWFrOwoJCWNhc2Ug J3JtbHRvb2xiYXJfbWF4aW1pemUnOgoJCQl2YXIgdHh0YXJlYSA9IGdldF9ybWx0 ZXh0YXJlYSgpOwoJCQlpZihqc2NzcygnY2hlY2snLHR4dGFyZWEsJ2V4dHJhLWxh cmdlJywnJykpCgkJCXsKCQkJCWpzY3NzKCdyZW1vdmUnLHR4dGFyZWEsJ2V4dHJh LWxhcmdlJywnJyk7CgkJCQlqc2NzcygncmVtb3ZlJyx0eHRhcmVhLCdsYXJnZScs JycpOwoJCQl9CgkJCWVsc2UgaWYoIGpzY3NzKCdjaGVjaycsdHh0YXJlYSwnbGFy Z2UnKSApCgkJCXsKCQkJCWpzY3NzKCdhZGQnLHR4dGFyZWEsJ2V4dHJhLWxhcmdl JywnJyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlqc2NzcygnYWRkJyx0eHRhcmVh LCdsYXJnZScsJycpOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgJ3JtbHRvb2xiYXJf aHInOgoJCQlzZXRTZWxlY3Rpb24oJ1tocl0nKTsKCQkJYnJlYWs7Cgl9Cn07Cgpm dW5jdGlvbiB0b2dnbGVTbWlsZXlzKCkKewoJanNjc3MoJ3RvZ2dsZScsIG5ldyBE T01RdWVyeSgnZGl2I3NtaWxleXMnKS5nZXQoMCksICdzaG93Jyk7Cn07CmZ1bmN0 aW9uIGhpZGVTbWlsZXlzKCkKewoJanNjc3MoJ3JlbW92ZScsIG5ldyBET01RdWVy eSgnZGl2I3NtaWxleXMnKS5nZXQoMCksICdzaG93Jyk7Cn07CgpmdW5jdGlvbiBn ZXRfcm1sdGV4dGFyZWEoKQp7CglpZih0eXBlb2YgY3VycmVudFRleHRhcmVhID09 ICd1bmRlZmluZWQnKQoJCWN1cnJlbnRUZXh0YXJlYSA9IG5ldyBET01RdWVyeSgn dGV4dGFyZWEjcm1sX3RleHRhcmVhJykuZ2V0KDApOwoJcmV0dXJuIGN1cnJlbnRU ZXh0YXJlYTsKfTsKCmZ1bmN0aW9uIGdldENvbnRlbnRGcm9tT3JpZ2luYWwoKQp7 CglnZXRfcm1sdGV4dGFyZWEoKS52YWx1ZT13aW5kb3cub3BlbmVyLmdldF9ybWx0 ZXh0YXJlYSgpLnZhbHVlOwp9OwoKZnVuY3Rpb24gc2V0Q29udGVudFRvT3JpZ2lu YWwoKQp7Cgl3aW5kb3cub3BlbmVyLmdldF9ybWx0ZXh0YXJlYSgpLnZhbHVlPWdl dF9ybWx0ZXh0YXJlYSgpLnZhbHVlO3dpbmRvdy5jbG9zZSgpOwp9OwoKZnVuY3Rp b24gcmVzY2FsZVRleHRhcmVhKHR4dGFyZWEpCnsKCWlmICh0eXBlb2YgZG9jdW1l bnQuYWxsICE9ICd1bmRlZmluZWQnKQoJewoJCXR4dGFyZWEuc3R5bGUuaGVpZ2h0 PShkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodC04MCkrJ3B4JzsKCQl0eHRhcmVh LnN0eWxlLndpZHRoPShkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLTE1KSsncHgn OwoJfQoJZWxzZQoJewoJCXR4dGFyZWEuc3R5bGUuaGVpZ2h0PSh3aW5kb3cuaW5u ZXJIZWlnaHQtODApKydweCc7CgkJdHh0YXJlYS5zdHlsZS53aWR0aD0od2luZG93 LmlubmVyV2lkdGgtMTUpKydweCc7Cgl9Cn07CgpmdW5jdGlvbiB3cmFwU2VsZWN0 aW9uKGxmdCwgcmd0KQp7Cgl2YXIgdHh0YXJlYSA9IGdldF9ybWx0ZXh0YXJlYSgp OwoKCWlmICh0eXBlb2YgdHh0YXJlYS5zZWxlY3Rpb25TdGFydCA9PSAndW5kZWZp bmVkJykKCXsKCQlJRVdyYXAodHh0YXJlYSwgbGZ0LCByZ3QpOwoJfQoJZWxzZSBp ZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQpCgl7CgkJbW96V3JhcCh0eHRhcmVh LCBsZnQsIHJndCk7Cgl9Cn07CgpmdW5jdGlvbiBtb3pXcmFwKHR4dGFyZWEsIGxm dCwgcmd0KQp7Cgl2YXIgc2VsTGVuZ3RoID0gdHh0YXJlYS50ZXh0TGVuZ3RoOwoJ dmFyIHNlbFN0YXJ0ID0gdHh0YXJlYS5zZWxlY3Rpb25TdGFydDsKCXZhciBzZWxF bmQgPSB0eHRhcmVhLnNlbGVjdGlvbkVuZDsKCWlmIChzZWxFbmQ9PTEgfHwgc2Vs RW5kPT0yKQoJewoJCXNlbEVuZCA9IHNlbExlbmd0aDsKCX0KCXZhciBzMSA9IHR4 dGFyZWEudmFsdWUuc3Vic3RyaW5nKDAsc2VsU3RhcnQpOwoJdmFyIHMyID0gdHh0 YXJlYS52YWx1ZS5zdWJzdHJpbmcoc2VsU3RhcnQsIHNlbEVuZCk7Cgl2YXIgczMg PSB0eHRhcmVhLnZhbHVlLnN1YnN0cmluZyhzZWxFbmQsIHNlbExlbmd0aCk7Cgl0 eHRhcmVhLnZhbHVlID0gczEgKyBsZnQgKyBzMiArIHJndCArIHMzOwp9OwoKZnVu Y3Rpb24gSUVXcmFwKHR4dGFyZWEsIGxmdCwgcmd0KQp7CglzdHJTZWxlY3Rpb24g PSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS50ZXh0OwoJaWYgKHN0 clNlbGVjdGlvbiAhPSAiIikKCXsKCQlkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRl UmFuZ2UoKS50ZXh0ID0gbGZ0ICsgc3RyU2VsZWN0aW9uICsgcmd0OwoJfQoJZWxz ZQoJewoJCXR4dGFyZWEudmFsdWUgKz0gbGZ0ICsgcmd0OwoJfQp9OwoKZnVuY3Rp b24gZ2V0Q3VycmVudFNlbGVjdGlvbigpCnsKCWlmICh0eXBlb2YgZG9jdW1lbnQu c2VsZWN0aW9uICE9ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LnNlbGVjdGlvbi5j cmVhdGVSYW5nZSkKCXsKCQlyZXR1cm4gSUVHZXQoKTsKCX0KCWVsc2UgaWYgKGRv Y3VtZW50LmdldEVsZW1lbnRCeUlkKQoJewoJCXZhciB0eHRhcmVhID0gZ2V0X3Jt bHRleHRhcmVhKCk7CgkJcmV0dXJuIG1vekdldCh0eHRhcmVhKTsKCX0KCXJldHVy biAnJzsKfTsKCmZ1bmN0aW9uIG1vekdldCh0eHRhcmVhKQp7Cgl2YXIgc2VsTGVu Z3RoID0gdHh0YXJlYS50ZXh0TGVuZ3RoOwoJdmFyIHNlbFN0YXJ0ID0gdHh0YXJl YS5zZWxlY3Rpb25TdGFydDsKCXZhciBzZWxFbmQgPSB0eHRhcmVhLnNlbGVjdGlv bkVuZDsKCWlmIChzZWxFbmQ9PTEgfHwgc2VsRW5kPT0yKQoJCXNlbEVuZD1zZWxM ZW5ndGg7CglyZXR1cm4gKHR4dGFyZWEudmFsdWUpLnN1YnN0cmluZyhzZWxTdGFy dCwgc2VsRW5kKTsKfTsKCmZ1bmN0aW9uIElFR2V0KCkKewoJcmV0dXJuIGRvY3Vt ZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLnRleHQ7Cn07CgpmdW5jdGlvbiBz ZXRTZWxlY3Rpb24oc3RyKQp7Cgl2YXIgdHh0YXJlYSA9IGdldF9ybWx0ZXh0YXJl YSgpOwoJaWYgKHR5cGVvZiBkb2N1bWVudC5hbGwgIT0gJ3VuZGVmaW5lZCcpCgl7 CgkJSUVTZXQodHh0YXJlYSwgc3RyKTsKCX0KCWVsc2UgaWYgKGRvY3VtZW50Lmdl dEVsZW1lbnRCeUlkKQoJewoJCW1velNldCh0eHRhcmVhLCBzdHIpOwoJfQp9OwoK ZnVuY3Rpb24gbW96U2V0KHR4dGFyZWEsIHN0cikKewoJdmFyIHNlbExlbmd0aCA9 IHR4dGFyZWEudGV4dExlbmd0aDsKCXZhciBzZWxTdGFydCA9IHR4dGFyZWEuc2Vs ZWN0aW9uU3RhcnQ7Cgl2YXIgc2VsRW5kID0gdHh0YXJlYS5zZWxlY3Rpb25FbmQ7 CglpZiAoc2VsRW5kPT0xIHx8IHNlbEVuZD09MikKCQlzZWxFbmQ9c2VsTGVuZ3Ro OwoJdmFyIHMxID0gdHh0YXJlYS52YWx1ZS5zdWJzdHJpbmcoMCxzZWxTdGFydCk7 Cgl2YXIgczIgPSB0eHRhcmVhLnZhbHVlLnN1YnN0cmluZyhzZWxTdGFydCwgc2Vs RW5kKTsKCXZhciBzMyA9IHR4dGFyZWEudmFsdWUuc3Vic3RyaW5nKHNlbEVuZCwg c2VsTGVuZ3RoKTsKCXR4dGFyZWEudmFsdWUgPSBzMSArIHN0ciArIHMzOwp9OwoK ZnVuY3Rpb24gSUVTZXQodHh0YXJlYSwgc3RyKQp7CglzdHJTZWxlY3Rpb24gPSBk b2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS50ZXh0OwoKCWlmIChzdHJT ZWxlY3Rpb24hPSIiKQoJewoJCWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5n ZSgpLnRleHQgPSBzdHI7Cgl9CgllbHNlCgl7CgkJdHh0YXJlYS52YWx1ZSArPSBz dHI7Cgl9Cn07CgpmdW5jdGlvbiBzdG9yZUN1cnNvcigpCnsKCXRoaXMuY3Vyc29y UG9zID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuZHVwbGljYXRl KCk7Cn07CgpmdW5jdGlvbiBwdXRTdHIoIHRleHQgKQp7Cgl2YXIgdGFyZ2V0ID0g Z2V0X3JtbHRleHRhcmVhKCk7CgoJaWYgKCB0YXJnZXQgKQoJewoJCWlmICh0eXBl b2YgZG9jdW1lbnQuYWxsICE9ICd1bmRlZmluZWQnICYmIHRhcmdldC5jdXJzb3JQ b3MpCgkJewoJCQl2YXIgY3Vyc29yUG9zID0gdGFyZ2V0LmN1cnNvclBvczsKCQkJ Y3Vyc29yUG9zLnRleHQgPSBjdXJzb3JQb3MudGV4dC5jaGFyQXQoY3Vyc29yUG9z LnRleHQubGVuZ3RoIC0gMSkgPT0gJyAnID8gdGV4dCArICcgJyA6IHRleHQ7CgkJ fQoJCWVsc2UKCQl7CgkJCXRyeQoJCQl7CgkJCQl3cmFwU2VsZWN0aW9uKCcnLCB0 ZXh0KTsKCQkJfQoJCQljYXRjaChlKQoJCQl7CgkJCQl0YXJnZXQudmFsdWUgKz0g dGV4dDsKCQkJfQoJCX0KCgkJdGFyZ2V0LmZvY3VzKCk7Cgl9Cn07CmZ1bmN0aW9u IGdldERvY3VtZW50U2VsZWN0b3IoZG9jdW1lbnRpZCkKewoJdmFyIGRhdGEgPSBy YXdfZG9jdW1lbnRzW2RvY3VtZW50aWRdOwoJdmFyIGZvcm1hdF9saXN0ID0gWyBj cmVhdGVET01Ob2RlKCdvcHRpb24nLCB7InZhbHVlIiA6ICcnfSwgW2dldFRleHQo J2RvY2xpYicsICdvcmlnaW5hbCcpXSkgXTsKCglpZih0eXBlb2YgZm9ybWF0cyAh PSAidW5kZWZpbmVkIikKCXsKCQlmb3IodmFyIGk9MDsgaSA8IGZvcm1hdHMubGVu Z3RoO2krKykKCQl7CgkJCWZvcm1hdF9saXN0W2krMV0gPSBjcmVhdGVET01Ob2Rl KCdvcHRpb24nLCB7InZhbHVlIiA6IGZvcm1hdHNbaV1bMF19LCBbZm9ybWF0c1tp XVswXSsgJyAoJyArIGZvcm1hdHNbaV1bMV1bMF0gKyAneCcgKyBmb3JtYXRzW2ld WzFdWzFdICsgJyknXSk7CgkJfQoJfQoKCXZhciBpbnNlcnRfYXMgPSBbCgkJY3Jl YXRlRE9NTm9kZSgnZHQnLCB7fSwgW2dldFRleHQoJ2RvY2xpYicsICdpbnNlcnRf YXMnKV0pLAoJCWNyZWF0ZURPTU5vZGUoJ2RkJywge30sIFsKCQkJY3JlYXRlRE9N Tm9kZSgnaW5wdXQnLCB7InZhbHVlIiA6ICdpbWFnZScsICJuYW1lIiA6ICdhcycs ICJ0eXBlIiA6ICdyYWRpbycsICJpZCIgOiAnYXNfaW1hZ2VfJytkb2N1bWVudGlk KydfaW1hZ2UnLCAnY2hlY2tlZCcgOiAnY2hlY2tlZCcsICdjbGFzcycgOiAncmFk aW8nfSwgW10pLAoJCQljcmVhdGVET01Ob2RlKCdsYWJlbCcsIHsnZm9yJyA6ICdh c19pbWFnZV8nK2RvY3VtZW50aWQrJ19pbWFnZSd9LCBbZ2V0VGV4dCgnZG9jbGli JywgJ2luc2VydF9hc19pbWFnZScpXSksCgkJCWNyZWF0ZURPTU5vZGUoJ2lucHV0 JywgeyJ2YWx1ZSIgOiAndGV4dCcsICJuYW1lIiA6ICdhcycsICJ0eXBlIiA6ICdy YWRpbycsICJpZCIgOiAnYXNfdGV4dF8nK2RvY3VtZW50aWQrJ19pbWFnZScsICdj bGFzcycgOiAncmFkaW8nfSwgW10pLAoJCQljcmVhdGVET01Ob2RlKCdsYWJlbCcs IHsnZm9yJyA6ICdhc190ZXh0XycrZG9jdW1lbnRpZCsnX3RleHQnfSwgW2dldFRl eHQoJ2RvY2xpYicsICdpbnNlcnRfYXNfdGV4dCcpXSkKCQldICkKCV07CgoJdmFy IGluc2VydF9hc19saW5rID0gWwoJCWNyZWF0ZURPTU5vZGUoJ2R0Jywge30sIFtn ZXRUZXh0KCdkb2NsaWInLCAnaW5zZXJ0X2FzX2xpbmsnKV0pLAoJCWNyZWF0ZURP TU5vZGUoJ2RkJywge30sCgkJCVsKCQkJCWNyZWF0ZURPTU5vZGUoJ2lucHV0Jywg eyJ2YWx1ZSIgOiAnbGluaycsICJuYW1lIiA6ICdsaW5rJywgInR5cGUiIDogJ2No ZWNrYm94JywgImlkIiA6ICdsaW5rXycrZG9jdW1lbnRpZCwgJ2NsYXNzJyA6ICdj aGVja2JveCd9LCBbXSksCgkJCQljcmVhdGVET01Ob2RlKCdsYWJlbCcsIHsnZm9y JyA6ICdsaW5rXycrZG9jdW1lbnRpZH0sIFtnZXRUZXh0KCdkb2NsaWInLCAnaW5z ZXJ0X2FzX3RodW1iJyldKQoJCQldCgkJKQoJXTsKCgl2YXIgZm9ybWF0ID0gWwoJ CWNyZWF0ZURPTU5vZGUoJ2R0Jywge30sIFtnZXRUZXh0KCdkb2NsaWInLCAnZm9y bWF0JyldKSwKCQljcmVhdGVET01Ob2RlKCdkZCcsIHt9LAoJCQlbCgkJCQljcmVh dGVET01Ob2RlKCdzZWxlY3QnLCB7Im5hbWUiIDogJ2Zvcm1hdCcsICJpZCIgOiAn Zm9ybWF0XycrZG9jdW1lbnRpZH0sIGZvcm1hdF9saXN0KQoJCQldKQoJXTsKCgl2 YXIgYWxpZ24gPSBbCgkJY3JlYXRlRE9NTm9kZSgnZHQnLCB7fSwgW2dldFRleHQo J2RvY2xpYicsICdvdXRsaW5lJyldKSwKCQljcmVhdGVET01Ob2RlKCdkZCcsIHt9 LAoJCVsKCQkJY3JlYXRlRE9NTm9kZSgnc2VsZWN0JywgeyJuYW1lIiA6ICdmbG9h dCcsICJpZCIgOiAnZmxvYXRfJytkb2N1bWVudGlkfSwKCQkJWwoJCQkJY3JlYXRl RE9NTm9kZSgnb3B0aW9uJywgeyJ2YWx1ZSIgOiAnJ30sIFtnZXRUZXh0KCdkb2Ns aWInLCAnbm9uZScpXSksCgkJCQljcmVhdGVET01Ob2RlKCdvcHRpb24nLCB7InZh bHVlIiA6ICdsZWZ0J30sIFtnZXRUZXh0KCdkb2NsaWInLCAnbGVmdCcpXSksCgkJ CQljcmVhdGVET01Ob2RlKCdvcHRpb24nLCB7InZhbHVlIiA6ICdyaWdodCd9LCBb Z2V0VGV4dCgnZG9jbGliJywgJ3JpZ2h0JyldKQoJCQldKSwKCQldKQoJXTsKCgl2 YXIgaW5zZXJ0ID0gWwoJCWNyZWF0ZURPTU5vZGUoJ2R0Jywge30sIFtnZXRUZXh0 KCdkb2NsaWInLCAnaW5zZXJ0JyldKSwKCQljcmVhdGVET01Ob2RlKCdkZCcsIHt9 LAoJCVsKCQkJY3JlYXRlRE9NTm9kZSgnaW5wdXQnLCB7InZhbHVlIiA6IGdldFRl eHQoJ2RvY2xpYicsICdpbnNlcnRfaW1hZ2UnKSwgInR5cGUiIDogJ3N1Ym1pdCd9 LCBbXSksCgkJXSkKCV07CgoJdmFyIHByZXZpZXdfaW1nID0gY3JlYXRlRE9NTm9k ZSgnaW1nJywgeyJpZCIgOiAnaW1hZ2VfcHJldmlldycsICJzcmMiIDogZGF0YVsw XSArICdzcXVhcmUnfSwgW10pOwoKCWlmIChkYXRhWzVdID09ICcxJykKCXsKCQkv KiBJZiB0aGUgZG9jdW1lbnQgaXMgcmVtb3RlIGFuZCBkb2Vzbid0IGhhdmUgYW4g YWx0ZXJuYXRpdmUgaWNvbi4gRG9uJ3Qgc2hvdyB0aGUgaW1hZ2UKCSAJICogcmVs YXRlZCBmb3JtIGVsZW1lbnRzICovCgkJaWYgKGRhdGFbNl0gIT0gJzEnKQoJCXsK CQkJZm9ybWF0ID0gW107CgkJCWFsaWduID0gW107CgkJCXByZXZpZXdfaW1nID0g ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpOwoJCX0KCQllbHNlCgkJewoJCQlp bnNlcnRfYXNfbGlua1sxXS5jaGlsZE5vZGVzWzBdLmRpc2FibGVkID0gdHJ1ZTsK CQkJaW5zZXJ0X2FzX2xpbmtbMV0uY2hpbGROb2Rlc1swXS5jaGVja2VkID0gdHJ1 ZTsKCQkJaW5zZXJ0X2FzX2xpbmtbMV0uY2hpbGROb2Rlc1swXS5kZWZhdWx0Q2hl Y2tlZCA9IHRydWU7CgkJfQoJfQoKCXZhciBmb3JtX2NvbWJpbmVkID0gaW5zZXJ0 X2FzLmNvbmNhdChpbnNlcnRfYXNfbGluaywgZm9ybWF0LCBhbGlnbiwgaW5zZXJ0 KTsKCglmb3JtX2NvbWJpbmVkID0gZm9ybV9jb21iaW5lZC5jb25jYXQoaW5zZXJ0 X2FzX2xpbmspOwoJZm9ybV9jb21iaW5lZCA9IGZvcm1fY29tYmluZWQuY29uY2F0 KGZvcm1hdCk7Cglmb3JtX2NvbWJpbmVkID0gZm9ybV9jb21iaW5lZC5jb25jYXQo YWxpZ24pOwoJZm9ybV9jb21iaW5lZCA9IGZvcm1fY29tYmluZWQuY29uY2F0KGlu c2VydCk7CgoJdmFyIGZvcm0gPQoJCWNyZWF0ZURPTU5vZGUoJ2RpdicsIHsiaWQi IDogImRvY3VtZW50LXNlbGVjdG9yIn0sCgkJWwoJCQljcmVhdGVET01Ob2RlKCdo MycsIHsiaWQiIDogJ2luc2VydF9pbWFnZSd9LCBbZ2V0VGV4dCgnZG9jbGliJywg J2luc2VydF9pbWFnZScpXSksCgkJCXByZXZpZXdfaW1nLAoJCQljcmVhdGVET01O b2RlKCdmb3JtJywgeyJtZXRob2QiIDogJ1BPU1QnLCAiYWN0aW9uIiA6IGJvYXJk X3NjcmlwdF91cmwsICJldmVudCIgOiBbJ3N1Ym1pdCcsIGNvcHkycm1sXX0sCgkJ CVsKCQkJCWNyZWF0ZURPTU5vZGUoJ2ZpZWxkc2V0Jywge30sCgkJCQlbCgkJCQkJ Y3JlYXRlRE9NTm9kZSgnaW5wdXQnLCB7InZhbHVlIiA6IGRvY3VtZW50aWQsICJu YW1lIiA6ICdkb2N1bWVudGlkJywgInR5cGUiIDogJ2hpZGRlbid9LCBbXSksCgkJ CQkJY3JlYXRlRE9NTm9kZSgnaW5wdXQnLCB7InZhbHVlIiA6IGRhdGFbMF0sICJu YW1lIiA6ICd1cmwnLCAidHlwZSIgOiAnaGlkZGVuJ30sIFtdKSwKCQkJCQljcmVh dGVET01Ob2RlKCdpbnB1dCcsIHsidmFsdWUiIDogZGF0YVsxXSwgIm5hbWUiIDog J2tleScsICJ0eXBlIiA6ICdoaWRkZW4nfSwgW10pLAoJCQkJCWNyZWF0ZURPTU5v ZGUoJ2lucHV0JywgeyJ2YWx1ZSIgOiBkYXRhWzJdLCAibmFtZSIgOiAnbGlicmFy eWlkJywgInR5cGUiIDogJ2hpZGRlbid9LCBbXSksCgkJCQkJY3JlYXRlRE9NTm9k ZSgnaW5wdXQnLCB7InZhbHVlIiA6ICcnLCAibmFtZSIgOiAnYWx0JywgInR5cGUi IDogJ2hpZGRlbid9LCBbXSksCgkJCQkJY3JlYXRlRE9NTm9kZSgnaW5wdXQnLCB7 InZhbHVlIiA6IGRhdGFbNF0sICJuYW1lIiA6ICdmaWxlbmFtZScsICJ0eXBlIiA6 ICdoaWRkZW4nfSwgW10pLAoKCQkJCQljcmVhdGVET01Ob2RlKCdkbCcsIHt9LCBm b3JtX2NvbWJpbmVkKQoJCQkJXSkKCQkJXSkKCQldKTsKCglyZXR1cm4gZm9ybTsK fTsKCmZ1bmN0aW9uIGRvY2xpYkludGVyYWN0aW9uKCkKewoJc3dpdGNoKGJvYXJk X2FjdGlvbikKCXsKCQljYXNlICdlZGl0X2RvY3VtZW50JzoKCQkJYWRkRXZlbnRU b1RhcmdldHMobnVsbCwgJ2NsaWNrJywgbW9kaWZ5VGh1bWJuYWlsLCAnaW1nW2xv bmdkZXNjXScpOwoJCWJyZWFrOwoKCQljYXNlICdsaXN0X2RvY3VtZW50cyc6CgkJ CWlmIChqc2NzcygnY2hlY2snLCBkb2N1bWVudC5ib2R5LCAnc21hbGwnKSkKCQkJ ewoJCQkJdmFyIGxpbmtzID0gbmV3IERPTVF1ZXJ5KCdhW2hyZWYqPSJsaXN0X2Rv Y3VtZW50cyJdLCBhW2hyZWYqPSJlZGl0X2RvY3VtZW50Il0sIGFbaHJlZio9Imlu c2VydF9kb2N1bWVudCJdJyk7CgoJCQkJZm9yKHZhciBpID0gMCwgbGluazsgKGxp bmsgPSBsaW5rcy5nZXQoaSkpO2krKykKCQkJCXsKCQkJCQlpZihpc0lFKQoJCQkJ CXsKCQkJCQkJLyoKCQkJCQkJCUlFIGNoZWNrcyBpZiB0aGUgbGluaydzIGZpcnN0 Q2hpbGQubm9kZVZhbHVlIGVxdWFscyBhICJ2YWxpZCIgdXJsLAoJCQkJCQkJaWYg c28gaXQgd2lsbCBzd2FwIGl0J3MgdmFsdWUgd2l0aCB0aGUgbmV3bHkgc2V0IGhy ZWYuCgoJCQkJCQkJSUUgY29uc2lkZXJzIGh0dHA6Ly8sIGh0dHBzOi8vLCBmdHA6 Ly8gYW5kIF53d3cuIGFzICJ2YWxpZCIKCgkJCQkJCQlJRSBzaG91bGQgcmVhbGx5 IGRpZS4KCQkJCQkJKi8KCQkJCQkJaWYoIGxpbmsuZmlyc3RDaGlsZC5ub2RlVmFs dWUubWF0Y2goL14oKChmdHB8aHR0cHM/KTpcL1wvKXwod3d3XC4pKS8pICkKCQkJ CQkJewoJCQkJCQkJbGluay5hcHBlbmRDaGlsZChjcmVhdGVET01Ob2RlKCdzcGFu JywgeydjbGFzcycgOiAnZHVtbXknfSwgW10pKTsKCQkJCQkJfQoKCQkJCQkJLyoK CQkJCQkJCUlFIGFwcGVuZHMgc2VhcmNoIHBhcnQgYWZ0ZXIgaGFzaCwgc28gd2Ug c3RyaXAgdGhlIGhhc2gsCgkJCQkJCQlhcHBlbmQgc2VhcmNoIHBhcnQsIGFuZCBh cHBlbmQgaGFzaCBhZ2FpbgoKCQkJCQkJCUlFIHNob3VsZCByZWFsbHkgZGllLiBT ZWUgY29tbWVudCBhYm92ZS4KCQkJCQkJKi8KCQkJCQkJcGFydHMgPSBsaW5rLmhy ZWYuc3BsaXQoJyMnKTsKCgkJCQkJCWxpbmsuaHJlZiA9IHBhcnRzWzBdOwoJCQkJ CQlsaW5rLnNlYXJjaCArPSAobGluay5zZWFyY2gubGVuZ3RoID8gJyYnIDogJz8n KSArJ2RhdGFbc21hbGxdPTEnOwoKCQkJCQkJaWYocGFydHNbMV0pCgkJCQkJCQls aW5rLmhhc2ggPSBwYXJ0c1sxXTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJ CQkJbGluay5zZWFyY2ggKz0gKGxpbmsuc2VhcmNoLmxlbmd0aCA/ICcmJyA6ICc/ JykgKydkYXRhW3NtYWxsXT0xJzsKCQkJCQl9CgkJCQl9CgoJCQkJYWRkRXZlbnRU b1RhcmdldHMobnVsbCwgJ2NsaWNrJywgZG9jbGliSW1hZ2VDbGljaywgJ2JvZHku bGlzdF9kb2N1bWVudHMgZGl2LmRvY3VtZW50Jyk7CgkJCX0KCQkJZWxzZQoJCQl7 CgkJCQlhZGRFdmVudFRvVGFyZ2V0cyhudWxsLCAnY2xpY2snLCBzZWxlY3RBbGxE b2N1bWVudHMsICdpbnB1dCNzZWxlY3RfYWxsX2RvY3VtZW50cycpOwoJCQkJYWRk RXZlbnRUb1RhcmdldHMobnVsbCwgJ2NsaWNrJywgc2VsZWN0RG9jdW1lbnQsICdi b2R5Lmxpc3RfZG9jdW1lbnRzIGRpdi5kb2N1bWVudCBpbWcsIGJvZHkubGlzdF9k b2N1bWVudHMgZGl2LmRvY3VtZW50IGxpLnNlbGVjdCBpbnB1dCcpOwoJCQl9CgkJ YnJlYWs7Cgl9CgoJLyogeWVzLCBpdCdzIGRvdWJ0ZnVsbCB3ZXRoZXIgdGhpcyBp cyB0aGUgYmVzdCBwbGFjZS4uLiAqLwoJdmFyIGl0ZW1zID0gbmV3IERPTVF1ZXJ5 KCdvbC5tZXNzYWdlcyBhLmRvY2xpYicpOwoJZm9yKHZhciBpID0gMCwgaXRlbTsg KGl0ZW0gPSBpdGVtcy5nZXQoaSkpOyBpKyspCgl7CgkJYWRkRXZlbnQoaXRlbSwg J2NsaWNrJywgZnVuY3Rpb24oZSkgeyB3aW5kb3cub3Blbih0aGlzLmhyZWYsICdw b3B1cGRvY2xpYicpOyBlLnByZXZlbnREZWZhdWx0KCk7IH0gKTsKCX0KfTsKCgov KgoJdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIDMgd2F5czoKCS0gYnkg dGhlIGNoZWNrYm94IGl0c2VsZgoJLSBieSBhIGNsaWNrIG9uIHRoZSBpbWFnZQoJ LSBieSBzZWxlY3RBbGxEb2N1bWVudHMoKQoqLwpmdW5jdGlvbiBzZWxlY3REb2N1 bWVudChvYmopCnsKCXZhciBjYWxsaW5nRWxlbWVudCA9IHRoaXMudGFnTmFtZSA/ ICB0aGlzIDogb2JqLCBjaGVja2JveDsKCXZhciBjb250YWluZXIgPSBnZXRTaWJs aW5nTm9kZShjYWxsaW5nRWxlbWVudCwgJ3VwJywgJ2RpdicpOwoKCS8qIGlmIGl0 J3Mgbm90IHRoZSBjaGVja2JveCBpdHNlbGYgd2hvJ3MgY2FsbGluZyB1cywgdG9n Z2xlIGl0ICovCglpZiAoIGNhbGxpbmdFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNh c2UoKSAhPSAnaW5wdXQnICkKCXsKCQljaGVja2JveCA9IG5ldyBET01RdWVyeSgn aW5wdXRbdHlwZT1jaGVja2JveF0nLCBjb250YWluZXIpLmdldCgwKTsKCQljaGVj a2JveC5jaGVja2VkID0gIWNoZWNrYm94LmNoZWNrZWQ7Cgl9CgllbHNlCgl7CgkJ Y2hlY2tib3ggPSBjYWxsaW5nRWxlbWVudDsKCX0KCglpZiAoIGNoZWNrYm94LmNo ZWNrZWQgKQoJewoJCWpzY3NzKCdhZGQnLCBjb250YWluZXIsICdzZWxlY3RlZCcs ICcnKTsKCgkJaWYoIChuZXcgRE9NUXVlcnkoJ2Rpdi5kb2N1bWVudCBpbnB1dCcp KS5sZW5ndGggPT0gKG5ldyBET01RdWVyeSgnZGl2LmRvY3VtZW50LnNlbGVjdGVk IGlucHV0JykpLmxlbmd0aCkKCQkJKG5ldyBET01RdWVyeSgnaW5wdXQjc2VsZWN0 X2FsbF9kb2N1bWVudHMnKS5nZXQoMCkpLmNoZWNrZWQgPSB0cnVlOwoJfQoJZWxz ZQoJewoJCWpzY3NzKCdyZW1vdmUnLCBjb250YWluZXIsICdzZWxlY3RlZCcsICcn KTsKCgkJKG5ldyBET01RdWVyeSgnaW5wdXQjc2VsZWN0X2FsbF9kb2N1bWVudHMn KS5nZXQoMCkpLmNoZWNrZWQgPSBmYWxzZTsKCX0KfTsKCmZ1bmN0aW9uIHNlbGVj dEFsbERvY3VtZW50cygpCnsKCS8qIHVuY2hlY2sgc2VsZWN0ZWQgaW1hZ2VzICov CglpZihib2FyZF9hY3Rpb24gPT0gJ2xpc3RfZG9jdW1lbnRzJykKCXsKCQl2YXIg aW1nID0gbmV3IERPTVF1ZXJ5KCdkaXYuZG9jdW1lbnQuc2VsZWN0ZWQgaW1nJyk7 CgkJZm9yKHZhciBpID0gMDsgaSA8IGltZy5sZW5ndGg7aSsrKQoJCXsKCQkJc2Vs ZWN0RG9jdW1lbnQoaW1nLmdldChpKSk7CgkJfQoJfQoKCWlmKCF0aGlzLmNoZWNr ZWQpCgkJcmV0dXJuOwoKCWlmKGJvYXJkX2FjdGlvbiA9PSAnbGlzdF9kb2N1bWVu dHMnKQoJewoJCWltZyA9IG5ldyBET01RdWVyeSgnZGl2LmRvY3VtZW50IGltZycp OwoKCQlmb3IoaT0wOyBpIDwgaW1nLmxlbmd0aDtpKyspCgkJewoJCQlzZWxlY3RE b2N1bWVudChpbWcuZ2V0KGkpKTsKCQl9Cgl9Cn07CgpmdW5jdGlvbiBkZXNlbGVj dEFsbERvY3VtZW50cygpCnsKCXZhciBzZWxlY3RlZERvY3VtZW50cyA9IG5ldyBE T01RdWVyeSgnZGl2LmRvY3VtZW50LnNlbGVjdGVkJyk7Cglmb3IodmFyIGkgPSAw LCBzZWxlY3RlZERvY3VtZW50OyAoc2VsZWN0ZWREb2N1bWVudD1zZWxlY3RlZERv Y3VtZW50cy5nZXQoaSkpOyBpKyspCgl7CgkJanNjc3MoJ3JlbW92ZScsIHNlbGVj dGVkRG9jdW1lbnQsICdzZWxlY3RlZCcsICcnKTsKCX0KfQoKZnVuY3Rpb24gZG9j bGliSW1hZ2VDbGljayhlKQp7Cgl2YXIgeCA9IHRoaXM7CglpZih4LnRhZ05hbWUu dG9Mb3dlckNhc2UoKSAhPSAnaW1nJykKCQl4ID0gbmV3IERPTVF1ZXJ5KCdpbWcn LCB0aGlzICkuZ2V0KDApOwoKCWlmICh0eXBlb2YgeCA9PSAndW5kZWZpbmVkJykK CQlyZXR1cm47CgoJdmFyIGNvbnRhaW5lciA9IGdldFNpYmxpbmdOb2RlKHgsICd1 cCcsICdkaXYnKTsKCXZhciBkb2N1bWVudGlkID0gY29udGFpbmVyLmlkLnJlcGxh Y2UoL15kb2N1bWVudF8vLCAnJyk7CgoJLyogc3RvcmUgZm9yIGxhdGVyIHVzZSAq LwoJdmFyIGN1cnJlbnRseVNlbGVjdGVkID0ganNjc3MoJ2NoZWNrJywgY29udGFp bmVyLCAnc2VsZWN0ZWQnKTsKCWRlc2VsZWN0QWxsRG9jdW1lbnRzKCk7CgoJLyog ZGVzdHJveSBleGlzdGluZyAqLwoJdmFyIGN1cnJlbnRGb3JtID0gbmV3IERPTVF1 ZXJ5KCJkaXYuZGlzY3Vzc2lvbi1jb250ZW50IGRpdiNkb2N1bWVudC1zZWxlY3Rv ciIpLmdldCgwKTsKCWlmKGN1cnJlbnRGb3JtKQoJCWN1cnJlbnRGb3JtLnBhcmVu dE5vZGUucmVtb3ZlQ2hpbGQoY3VycmVudEZvcm0pOwoKCS8qIHNob3cganVzdCBv bmUgZm9ybSBhdCBhIHRpbWUgKi8KCXZhciBzZWFyY2hGb3JtID0gbmV3IERPTVF1 ZXJ5KCdkaXYjc2VhcmNoLWRvY3VtZW50cycpLmdldCgwKTsKCWlmKGN1cnJlbnRs eVNlbGVjdGVkKQoJewoJCWpzY3NzKCdyZW1vdmUnLCBzZWFyY2hGb3JtLCAnZGlz cGxheS1ub25lJyk7CgkJZGVzZWxlY3RBbGxEb2N1bWVudHMoKTsKCQkvKiB3ZSdy ZSBkZS1zZWxlY3RpbmcsIHNvIG5vIGluZm8gdG8gcGFyZW50IHdpbmRvdyAqLwoJ CXJldHVybjsKCX0KCWVsc2UKCXsKCQlqc2NzcygnYWRkJywgY29udGFpbmVyLCAn c2VsZWN0ZWQnLCAnJyk7CgoJCWlmKHNlYXJjaEZvcm0pCgkJCWpzY3NzKCdhZGQn LCBzZWFyY2hGb3JtLCAnZGlzcGxheS1ub25lJyk7Cgl9CgoJdmFyIGZvcm0gPSBn ZXREb2N1bWVudFNlbGVjdG9yKCBkb2N1bWVudGlkICk7CglpZighZm9ybSkKCQly ZXR1cm47CgoJdmFyIHAgPSBuZXcgRE9NUXVlcnkoImRpdi5kaXNjdXNzaW9uLWNv bnRlbnQiKS5nZXQoMCk7CglpZighcCkKCQlyZXR1cm47CgoJcC5pbnNlcnRCZWZv cmUoZm9ybSwgcC5jaGlsZE5vZGVzWzBdKTsKCgkvLyBkbyB3ZSBoYXZlIHRvIG5v dGlmeSB0aGUgZG9jdW1lbnQgc2VsZWN0b3Igb3BlbmVyPwoJaWYod2luZG93Lm9w ZW5lciAhPSBudWxsICYmIHR5cGVvZiB3aW5kb3cub3BlbmVyLnNlbGVjdGVkRG9j dW1lbnQgIT0gJ3VuZGVmaW5lZCcpCgl7CgkJdHJ5CgkJewoJCQl2YXIgZGF0YSA9 IHJhd19kb2N1bWVudHNbZG9jdW1lbnRpZF07CgkJCXdpbmRvdy5vcGVuZXIuc2Vs ZWN0ZWREb2N1bWVudChkb2N1bWVudGlkLCB3aW5kb3cpOwoJCQkJCQkJCQkJCQkJ Lyoga2V5ICAgICxkb2NsaWJpZCAqLwoJCQkvKiB3aW5kb3cuY2xvc2UoKTsqLwoJ CQlyZXR1cm47CgkJfQoJCWNhdGNoKGUpCgkJewoJCQk7CgkJfQoJfQp9OwoKZnVu Y3Rpb24gY29weTJybWwoZSkKewoJZS5wcmV2ZW50RGVmYXVsdCgpOwoKCWlmICh0 eXBlb2Ygd2luZG93Lm9wZW5lciA9PSAndW5kZWZpbmVkJyB8fCAhd2luZG93Lm9w ZW5lci5kb2N1bWVudCkKCQlyZXR1cm4gZmFsc2U7CgoJLy8gQXJlIHdlIGNhbGxl ZCBmcm9tIGEgRkNLRWRpdG9yIGltYWdlLXNlbGVjdG9yPwoJaWYodHlwZW9mIHdp bmRvdy5vcGVuZXIuU2V0VXJsICE9ICd1bmRlZmluZWQnKQoJewoJCXdpbmRvdy5v cGVuZXIuU2V0VXJsKGJvYXJkX3NjcmlwdF91cmwgKwoJCQkJJy8uLi9kb3dubG9h ZC5waHAvZG93bmxvYWRfZG9jdW1lbnQvJyArCgkJCQluZXcgRE9NUXVlcnkoJ2lu cHV0W25hbWU9ImRvY3VtZW50aWQiXScsIHRoaXMpLmdldCgwKS52YWx1ZSArCgkJ CQknLycgKyBuZXcgRE9NUXVlcnkoJ2lucHV0W25hbWU9ImtleSJdJywgdGhpcyku Z2V0KDApLnZhbHVlICsKCQkJCScvJyArCgkJCQluZXcgRE9NUXVlcnkoJ3NlbGVj dFtuYW1lPSJmb3JtYXQiXScsIHRoaXMpLmdldCgwKS52YWx1ZQoJCSk7CgkJd2lu ZG93LmNsb3NlKCk7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qIGZpbmQgb3V0IHdo aWNoIHJhZGlvIGJ1dHRvbiB3YXMgc2VsZWN0ZWQgKi8KCXZhciBpdGVtcyA9IG5l dyBET01RdWVyeSgnaW5wdXRbbmFtZT0iYXMiXScsIHRoaXMpLCBkYXRhX2FzOwoJ Zm9yKHZhciBpID0gMCwgaXRlbTsgKGl0ZW0gPSBpdGVtcy5nZXQoaSkpOyBpKysp Cgl7CgkJaWYoaXRlbS50eXBlID09ICdoaWRkZW4nIHx8IGl0ZW0uY2hlY2tlZCkK CQl7CgkJCWRhdGFfYXMgPSBpdGVtOwoJCQlicmVhazsKCQl9Cgl9CgoJaWYoIWRh dGFfYXMpCgkJcmV0dXJuIGZhbHNlOwoKCXZhciBybWwgPSAnJzsKCXN3aXRjaCgg ZGF0YV9hcy52YWx1ZSApCgl7CgkJY2FzZSAnaW1hZ2UnOgoJCQl2YXIgZmxvYXRf c2VsZWN0ID0gbmV3IERPTVF1ZXJ5KCdzZWxlY3RbbmFtZT0iZmxvYXQiXScsIHRo aXMpOwoJCQl2YXIgZm9ybWF0X3NlbGVjdCA9IG5ldyBET01RdWVyeSgnc2VsZWN0 W25hbWU9ImZvcm1hdCJdJywgdGhpcyk7CgkJCXZhciBsaW5rX2lucHV0ID0gbmV3 IERPTVF1ZXJ5KCdpbnB1dFtuYW1lPSJsaW5rIl0nLCB0aGlzKTsKCgkJCXZhciBs aW5rID0gJzAnOwoKCQkJdmFyIGZsb2F0ID0gJycsIGZvcm1hdD0nJzsKCgkJCWlm IChmbG9hdF9zZWxlY3QubGVuZ3RoID4gMCkKCQkJCWZsb2F0ID0gZmxvYXRfc2Vs ZWN0LmdldCgwKS5vcHRpb25zWyBmbG9hdF9zZWxlY3QuZ2V0KDApLnNlbGVjdGVk SW5kZXggXS52YWx1ZTsKCgkJCWlmIChmb3JtYXRfc2VsZWN0Lmxlbmd0aCA+IDAp CgkJCQlmb3JtYXQgPSBmb3JtYXRfc2VsZWN0LmdldCgwKS5vcHRpb25zWyBmb3Jt YXRfc2VsZWN0LmdldCgwKS5zZWxlY3RlZEluZGV4IF0udmFsdWU7CgoJCQlpZiAo IGxpbmtfaW5wdXQubGVuZ3RoID4gMCkKCQkJewoJCQkJbGluayA9IGxpbmtfaW5w dXQuZ2V0KDApLmNoZWNrZWQgPyAnMScgOiAnMCc7CgkJCX0KCgkJCXJtbCA9ICdb ZG9jbGliPScgKwoJCQkJCW5ldyBET01RdWVyeSgnaW5wdXRbbmFtZT0iZG9jdW1l bnRpZCJdJywgdGhpcykuZ2V0KDApLnZhbHVlICsKCQkJCQknLCcgKwoJCQkJCW5l dyBET01RdWVyeSgnaW5wdXRbbmFtZT0ia2V5Il0nLCB0aGlzKS5nZXQoMCkudmFs dWUgKwoJCQkJCScsJyArCgkJCQkJbmV3IERPTVF1ZXJ5KCdpbnB1dFtuYW1lPSJs aWJyYXJ5aWQiXScsIHRoaXMpLmdldCgwKS52YWx1ZSArCgkJCQkJJywnICsKCQkJ CQlmb3JtYXQgKwoJCQkJCScsJyArCgkJCQkJbGluayArCgkJCQkJKGZsb2F0ICE9 ICIiID8gKCIsIiArIGZsb2F0KSA6ICIiICkgKwoJCQkJCSddXG4nOwoJCWJyZWFr OwoJCWNhc2UgJ3RleHQnOgoJCQlybWwgPSAnW2RvY2xpYj0nICsKCQkJCQluZXcg RE9NUXVlcnkoJ2lucHV0W25hbWU9ImRvY3VtZW50aWQiXScsIHRoaXMpLmdldCgw KS52YWx1ZSArCgkJCQkJJywnICsKCQkJCQluZXcgRE9NUXVlcnkoJ2lucHV0W25h bWU9ImtleSJdJywgdGhpcykuZ2V0KDApLnZhbHVlICsKCQkJCQknLCcgKwoJCQkJ CW5ldyBET01RdWVyeSgnaW5wdXRbbmFtZT0ibGlicmFyeWlkIl0nLCB0aGlzKS5n ZXQoMCkudmFsdWUgKwoJCQkJCScsLDBdJyArCgkJCQkJbmV3IERPTVF1ZXJ5KCdp bnB1dFtuYW1lPSJmaWxlbmFtZSJdJywgdGhpcykuZ2V0KDApLnZhbHVlICsKCQkJ CQknWy9dXG4nOwoJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXJldHVybjsKCX0KCXdp bmRvdy5vcGVuZXIuc2V0Q3VycmVudFRleHRhcmVhKHdpbmRvdyk7Cgl3aW5kb3cu b3BlbmVyLnB1dFN0cihybWwpOwoJd2luZG93Lm9wZW5lci5mb2N1cygpOwoJd2lu ZG93LmNsb3NlKCk7CgoJcmV0dXJuIGZhbHNlOwp9OwpmdW5jdGlvbiB0b3BpY0Rv Y3VtZW50U2VsZWN0b3IoKQp7Cgl2YXIgdG9waWNEb2N1bWVudCA9IG5ldyBET01R dWVyeSgnaW5wdXQjdG9waWMtZG9jdW1lbnQnKS5nZXQoMCk7CgoJaWYodG9waWNE b2N1bWVudCkKCXsKCQl2YXIgZG9jbGliSW1nID0gbmV3IERPTVF1ZXJ5KCdpbWcj dG9waWMtZG9jdW1lbnQtaW1nJykuZ2V0KDApOwoKCQlpZihkb2NsaWJJbWcuc3Jj ICE9IGJvYXJkX3NjcmlwdF91cmwgKyAnLycpCgkJCXRvcGljRG9jdW1lbnRTZWxl Y3RvckZpZWxkcygpOwoJCWVsc2UKCQkJZG9jbGliSW1nLnBhcmVudE5vZGUucmVt b3ZlQ2hpbGQoZG9jbGliSW1nKTsKCgkJYWRkRXZlbnRUb1RhcmdldHMobnVsbCwg J21vdXNldXAnLCBfdG9waWNEb2N1bWVudFNlbGVjdG9yLCAnbGkuc2VsZWN0LWRv Y3VtZW50IGEnKTsKCQlhZGRFdmVudFRvVGFyZ2V0cyhudWxsLCAnY2xpY2snLCBf dG9waWNEb2N1bWVudFNlbGVjdG9yLCAnbGkuc2VsZWN0LWRvY3VtZW50IGEnKTsK CX0KfQoKZnVuY3Rpb24gX3RvcGljRG9jdW1lbnRTZWxlY3RvcihlKQp7Cgl2YXIg bGkgPSBnZXRTaWJsaW5nTm9kZSh0aGlzLCAndXAnLCAnbGknKQoKCXN3aXRjaChs aS5jbGFzc05hbWUpCgl7CgkJY2FzZSAnc2VsZWN0LWRvY3VtZW50JzoKCQkJZG9j dW1lbnRXaW5kb3cgPSB3aW5kb3cub3BlbigKCQkJCWJvYXJkX3NjcmlwdF91cmwg KyAnL2xpc3RfZG9jdW1lbnRzP2RhdGFbc21hbGxdPTEnLAoJCQkJJ0RvY3VtZW50 TGlicmFyeScsCgkJCQknd2lkdGg9OTAwLCBoZWlnaHQ9NTAwLCByZXNpemFibGU9 eWVzLCBzY3JvbGxiYXJzPXllcycKCQkJKTsKCgkJCWUucHJldmVudERlZmF1bHQo KTsKCQlicmVhazsKCQljYXNlICdkZWxldGUtZG9jdW1lbnQnOgoJCQl2YXIgdG9w aWNEb2N1bWVudCA9IG5ldyBET01RdWVyeSgnaW5wdXQjdG9waWMtZG9jdW1lbnQn KS5nZXQoMCk7CgkJCXZhciBjaGVja2JveCA9IG5ldyBET01RdWVyeSgnaW5wdXQj dG9waWMtZG9jdW1lbnQtY2hhbmdlJykuZ2V0KDApOwoJCQl2YXIgaXRlbXMgPSBu ZXcgRE9NUXVlcnkoJ2ltZyN0b3BpYy1kb2N1bWVudC1pbWcsIGxpLmVkaXQtZG9j dW1lbnQsIGxpLmRlbGV0ZS1kb2N1bWVudCcpOwoKCQkJdG9waWNEb2N1bWVudC52 YWx1ZSA9ICcnOwoKCQkJaWYoY2hlY2tib3gpCgkJCQljaGVja2JveC5jaGVja2Vk ID0gdHJ1ZTsKCgkJCWZvcih2YXIgaT0wLCBpdGVtOyAoaXRlbSA9IGl0ZW1zLmdl dChpKSk7IGkrKykKCQkJCWl0ZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpdGVt KTsKCgkJCWUucHJldmVudERlZmF1bHQoKTsKCQlicmVhazsKCX0KfQoKZnVuY3Rp b24gdG9waWNEb2N1bWVudFNlbGVjdG9yRmllbGRzKHRvcGljRG9jdW1lbnRJZCkK ewoJdmFyIHVsID0gbmV3IERPTVF1ZXJ5KCd1bC50b3BpYy1kb2N1bWVudC1hY3Rp b25saXN0JykuZ2V0KDApOwoKCWlmKCF1bCkKCQlyZXR1cm47CgoJd2hpbGUodWwu Zmlyc3RDaGlsZCkKCQl1bC5yZW1vdmVDaGlsZCh1bC5maXJzdENoaWxkKTsKCgl2 YXIgZG9jbGliSW1nID0gbmV3IERPTVF1ZXJ5KCdpbWcjdG9waWMtZG9jdW1lbnQt aW1nJykuZ2V0KDApOwoKCWlmKGRvY2xpYkltZyAmJiBkb2NsaWJJbWcuZ2V0QXR0 cmlidXRlKCdzcmMnLCAyKSAhPSAnJykKCXsKCQl2YXIgZWRpdExpbmsgPSBjcmVh dGVET01Ob2RlKAoJCQknbGknLAoJCQl7ICdjbGFzcycgOiAnZWRpdC1kb2N1bWVu dCcgfSwKCQkJWwoJCQkJY3JlYXRlRE9NTm9kZSgKCQkJCQknYScsCgkJCQkJewoJ CQkJCQknaHJlZicgOiBib2FyZF9zY3JpcHRfdXJsICsgJy9lZGl0X2RvY3VtZW50 LycgKyB0b3BpY0RvY3VtZW50SWQsCgkJCQkJCSd0YXJnZXQnIDogJ19ibGFuaycs CgkJCQkJCSdldmVudCcgOiBbICdtb3VzZXVwJywgX3RvcGljRG9jdW1lbnRTZWxl Y3RvciBdCgkJCQkJfSwKCQkJCQlbICdXaWp6aWcgYmVzdGFuZCcgXQoJCQkJKQoJ CQldCgkJKTsKCQl2YXIgZGVsZXRlTGluayA9IGNyZWF0ZURPTU5vZGUoCgkJCSds aScsCgkJCXsgJ2NsYXNzJyA6ICdkZWxldGUtZG9jdW1lbnQnIH0sCgkJCVsKCQkJ CWNyZWF0ZURPTU5vZGUoCgkJCQkJJ2EnLAoJCQkJCXsKCQkJCQkJJ2hyZWYnIDog JyMnLAoJCQkJCQknZXZlbnQnIDogWyAnbW91c2V1cCcsIF90b3BpY0RvY3VtZW50 U2VsZWN0b3IgXQoJCQkJCX0sCgkJCQkJWyAnR2VlbiBiZXN0YW5kJyBdCgkJCQkp CgkJCV0KCQkpOwoKCQl1bC5hcHBlbmRDaGlsZChlZGl0TGluayk7CgkJdWwuYXBw ZW5kQ2hpbGQoZGVsZXRlTGluayk7Cgl9CgllbHNlCgl7CgkJdmFyIGFkZExpbmsg PSBjcmVhdGVET01Ob2RlKAoJCQknbGknLAoJCQl7ICdjbGFzcycgOiAnYWRkLWRv Y3VtZW50JyB9LAoJCQlbCgkJCQljcmVhdGVET01Ob2RlKAoJCQkJCSdhJywKCQkJ CQl7CgkJCQkJCSdocmVmJyA6IGJvYXJkX3NjcmlwdF91cmwgKyAnL2luc2VydF9k b2N1bWVudCcsCgkJCQkJCSdyZWwnIDogJ2xheWVyW2FkZC1kb2N1bWVudF0nCgkJ CQkJfSwKCQkJCQlbICdVcGxvYWQgYmVzdGFuZCcgXQoJCQkJKQoJCQldCgkJKTsK CQl2YXIgc2VsZWN0TGluayA9IGNyZWF0ZURPTU5vZGUoCgkJCSdsaScsCgkJCXsg J2NsYXNzJyA6ICdzZWxlY3QtZG9jdW1lbnQnIH0sCgkJCVsKCQkJCWNyZWF0ZURP TU5vZGUoCgkJCQkJJ2EnLAoJCQkJCXsKCQkJCQkJJ2hyZWYnIDogYm9hcmRfc2Ny aXB0X3VybCArICcvbGlzdF9kb2N1bWVudHMnLAoJCQkJCQkndGFyZ2V0JyA6ICdf YmxhbmsnLAoJCQkJCQknZXZlbnQnIDogWyAnbW91c2V1cCcsIF90b3BpY0RvY3Vt ZW50U2VsZWN0b3IgXQoJCQkJCX0sCgkJCQkJWyAnS2llcyBiZXN0YW5kJyBdCgkJ CQkpCgkJCV0KCQkpOwoKCQl1bC5hcHBlbmRDaGlsZChhZGRMaW5rKTsKCQl1bC5h cHBlbmRDaGlsZChzZWxlY3RMaW5rKTsKCX0KfQoKZnVuY3Rpb24gc2VsZWN0ZWRE b2N1bWVudChkb2N1bWVudF9pZCwgcG9wdXBfd2luKQp7Cgl2YXIgZG9jdW1lbnRf aGFzaCA9IHBvcHVwX3dpbi5yYXdfZG9jdW1lbnRzW2RvY3VtZW50X2lkXVswXS5z cGxpdCgnLycpOwoJZG9jdW1lbnRfaGFzaC5wb3AoKTsKCWRvY3VtZW50X2hhc2gg PSBkb2N1bWVudF9oYXNoLnBvcCgpOwoKCXZhciB0b3BpY0RvY3VtZW50ID0gbmV3 IERPTVF1ZXJ5KCdpbnB1dCN0b3BpYy1kb2N1bWVudCcpLmdldCgwKTsKCXZhciBj aGVja2JveCA9IG5ldyBET01RdWVyeSgnaW5wdXQjdG9waWMtZG9jdW1lbnQtY2hh bmdlJykuZ2V0KDApOwoJdmFyIGRvY2xpYkltZyA9IG5ldyBET01RdWVyeSgnaW1n I3RvcGljLWRvY3VtZW50LWltZycpLmdldCgwKTsKCglpZighZG9jbGliSW1nKQoJ ewoJCXZhciB1bCA9IG5ldyBET01RdWVyeSgndWwudG9waWMtZG9jdW1lbnQtYWN0 aW9ubGlzdCcpLmdldCgwKTsKCQlkb2NsaWJJbWcgPSBjcmVhdGVET01Ob2RlKAoJ CQknaW1nJywKCQkJewoJCQkJJ3NyYycgOiBib2FyZF9zY3JpcHRfdXJsICsgJy9k b3dubG9hZF9kb2N1bWVudC8nICsgZG9jdW1lbnRfaWQgKycvJysgZG9jdW1lbnRf aGFzaCArJy9kb2N1bWVudCcsCgkJCQknaWQnIDogJ3RvcGljLWRvY3VtZW50LWlt ZycKCQkJfSwKCQkJWyBdCgkJKTsKCQl1bC5wYXJlbnROb2RlLmluc2VydEJlZm9y ZShkb2NsaWJJbWcsIHVsKTsKCX0KCWVsc2UKCQlkb2NsaWJJbWcuc3JjID0gYm9h cmRfc2NyaXB0X3VybCArICcvZG93bmxvYWRfZG9jdW1lbnQvJyArIGRvY3VtZW50 X2lkICsnLycrIGRvY3VtZW50X2hhc2ggKycvZG9jdW1lbnQnOwoKCXRvcGljRG9j dW1lbnRTZWxlY3RvckZpZWxkcyhkb2N1bWVudF9pZCk7CgoJaWYoY2hlY2tib3gp CgkJY2hlY2tib3guY2hlY2tlZCA9IHRydWU7CgoJdG9waWNEb2N1bWVudC52YWx1 ZSA9IGRvY3VtZW50X2lkICsnLycrIGRvY3VtZW50X2hhc2g7Cgl0cnkKCXsKCQlk b2N1bWVudFdpbmRvdy5jbG9zZSgpOwoJfQoJY2F0Y2goZSkKCXsKCQk7Cgl9Cn0K dmFyIHRvcGljRG9jdW1lbnRJZDsKdmFyIGNvbnRhaW5lcjsKCmZ1bmN0aW9uIHRv cGljRG9jdW1lbnRTZWxlY3RvcihpZCkKewoJdmFyIHRvcGljRG9jdW1lbnQgPSBu ZXcgRE9NUXVlcnkoJ2lucHV0IycgKyBpZCkuZ2V0KDApOwoJdG9waWNEb2N1bWVu dElkID0gaWQ7CgoJaWYodG9waWNEb2N1bWVudCkKCXsKCQl2YXIgZG9jbGliSW1n ID0gbmV3IERPTVF1ZXJ5KCdpbWcjJyArIGlkICsgJy1pbWcnKS5nZXQoMCk7CgoJ CWNvbnRhaW5lciA9IGdldFNpYmxpbmdOb2RlKHRvcGljRG9jdW1lbnQsICduZXh0 JywgJ2RpdicpOwoKCQl0b3BpY0RvY3VtZW50U2VsZWN0b3JGaWVsZHModG9waWNE b2N1bWVudC52YWx1ZS5zcGxpdCgnLycpLnNoaWZ0KCkpOwoKCQlhZGRFdmVudFRv VGFyZ2V0cyhudWxsLCAnbW91c2V1cCcsIF90b3BpY0RvY3VtZW50U2VsZWN0b3Is ICcjJyArIGNvbnRhaW5lci5pZCArICcgbGkuc2VsZWN0LWRvY3VtZW50IGEnKTsK CQlhZGRFdmVudFRvVGFyZ2V0cyhudWxsLCAnY2xpY2snLCBfdG9waWNEb2N1bWVu dFNlbGVjdG9yLCAnIycgKyBjb250YWluZXIuaWQgKyAnIGxpLnNlbGVjdC1kb2N1 bWVudCBhJyk7Cgl9Cn0KCmZ1bmN0aW9uIF90b3BpY0RvY3VtZW50U2VsZWN0b3Io ZSkKewoJdmFyIGxpID0gZ2V0U2libGluZ05vZGUodGhpcywgJ3VwJywgJ2xpJykK CWNvbnRhaW5lciA9IGdldFNpYmxpbmdOb2RlKHRoaXMsICd1cCcsICdkaXYnKTsK Cglzd2l0Y2gobGkuY2xhc3NOYW1lKQoJewoJCWNhc2UgJ3NlbGVjdC1kb2N1bWVu dCc6CgkJCWRvY3VtZW50V2luZG93ID0gd2luZG93Lm9wZW4oCgkJCQlib2FyZF9z Y3JpcHRfdXJsICsgJy9saXN0X2RvY3VtZW50cz9kYXRhW3NtYWxsXT0xJywKCQkJ CSdEb2N1bWVudExpYnJhcnknLAoJCQkJJ3dpZHRoPTkwMCwgaGVpZ2h0PTUwMCwg cmVzaXphYmxlPXllcywgc2Nyb2xsYmFycz15ZXMnCgkJCSk7CgoJCQllLnByZXZl bnREZWZhdWx0KCk7CgkJYnJlYWs7CgkJY2FzZSAnZGVsZXRlLWRvY3VtZW50JzoK CQkJdmFyIHRvcGljRG9jdW1lbnQgPSBnZXRTaWJsaW5nTm9kZShjb250YWluZXIs ICdwcmV2aW91cycsICdpbnB1dCcpOwoJCQl2YXIgaXRlbXMgPSBuZXcgRE9NUXVl cnkoJ2ltZyN0b3BpYy1kb2N1bWVudC1pbWcnLCBjb250YWluZXIpOwoKCQkJdG9w aWNEb2N1bWVudC52YWx1ZSA9ICcnOwoKCQkJZm9yKHZhciBpPTAsIGl0ZW07IChp dGVtID0gaXRlbXMuZ2V0KGkpKTsgaSsrKQoJCQkJaXRlbS5wYXJlbnROb2RlLnJl bW92ZUNoaWxkKGl0ZW0pOwoKCQkJdG9waWNEb2N1bWVudFNlbGVjdG9yRmllbGRz KCk7CgoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJYnJlYWs7Cgl9Cn0KCnZhciBv cmlnaW5hbFNlbGVjdGVkRG9jdW1lbnQgPSBzZWxlY3RlZERvY3VtZW50Owp2YXIg c2VsZWN0ZWREb2N1bWVudCA9IGZ1bmN0aW9uKCkKewoJdmFyIHJldCA9IG9yaWdp bmFsU2VsZWN0ZWREb2N1bWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoJaWYo aXNJRSkKCXsKCQlqc2NzcygnYWRkJywgZG9jdW1lbnQuYm9keSwgJ2Rpc3BsYXkt bm9uZScpOwoJCWpzY3NzKCdyZW1vdmUnLCBkb2N1bWVudC5ib2R5LCAnZGlzcGxh eS1ub25lJyk7Cgl9CglyZXR1cm4gcmV0Owp9OwovKg0KCWNzc1F1ZXJ5LCB2ZXJz aW9uIDIuMCAoMjAwNS8wNS8yMykNCglDb3B5cmlnaHQ6IDIwMDQtMjAwNSwgRGVh biBFZHdhcmRzIChodHRwOi8vZGVhbi5lZHdhcmRzLm5hbWUvKQ0KCUxpY2Vuc2U6 IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL0xHUEwvMi4xLw0K Ki8NCmlmKCBET01RdWVyeS5wcm90b3R5cGUucmVzdWx0VHlwZSA9PSAnY3NzUXVl cnknICkNCnsNCglldmFsKGZ1bmN0aW9uKHAsYSxjLGssZSxkKXtlPWZ1bmN0aW9u KGMpe3JldHVybihjPGE/IiI6ZShwYXJzZUludChjL2EpKSkrKChjPWMlYSk+MzU/ U3RyaW5nLmZyb21DaGFyQ29kZShjKzI5KTpjLnRvU3RyaW5nKDM2KSl9O2lmKCEn Jy5yZXBsYWNlKC9eLyxTdHJpbmcpKXt3aGlsZShjLS0pZFtlKGMpXT1rW2NdfHxl KGMpO2s9W2Z1bmN0aW9uKGUpe3JldHVybiBkW2VdfV07ZT1mdW5jdGlvbigpe3Jl dHVybidcXHcrJ307Yz0xO307d2hpbGUoYy0tKWlmKGtbY10pcD1wLnJlcGxhY2Uo bmV3IFJlZ0V4cCgnXFxiJytlKGMpKydcXGInLCdnJyksa1tjXSk7cmV0dXJuIHA7 fSgnOCBDPTYoKXs4IDFIPSIyLjAgKDJTKSI7OCAkMkI9L1xccyosXFxzKi87OCBD PTYoJGQsJCRiKXsyVHs4ICRtPVtdOzggJDFTPWMuMlEuMkEmJiEkJGI7OCAkMUs9 KCQkYik/KCQkYi4yUj09MkUpPyQkYjpbJCRiXTpbWF07OCAkJEU9MW8oJGQpLjIy KCQyQiksaTt4KGk9MDtpPCQkRS55O2krKyl7JGQ9MUMoJCRFW2ldKTs5KDE2JiYk ZC5TKDAsMykuMncoIiIpPT0iICojIil7JGQ9JGQuUygyKTskJGI9MjYoW10sJDFL LCRkWzFdKX0xSSAkJGI9JDFLOzggaj0wLCRVLCRGLCRjLCQxYT0iIjtJKGo8JGQu eSl7JFU9JGRbaisrXTskRj0kZFtqKytdOyQxYSs9JFUrJEY7JGM9IiI7OSgkZFtq XT09IigiKXtJKCRkW2orK10hPSIpIikkYys9JGRbal07JGM9JGMuUygwLC0xKTsk MWErPSIoIiskYysiKSJ9JCRiPSgkMVMmJjE5WyQxYV0pPzE5WyQxYV06MnUoJCRi LCRVLCRGLCRjKTs5KCQxUykxOVskMWFdPSQkYn0kbT0kbS4yTigkJGIpfTFZIEMu MW07NyAkbX0yUCgkMW0pe0MuMW09JDFtOzdbXX19O0MuMmk9NigpezciNiBDKCkg e1xcbiAgWzFIICIrMUgrIl1cXG59In07OCAxOT17fTtDLjJBPVA7Qy4zMz02KCRk KXs5KCRkKXskZD0xQygkZCkuMncoIiIpOzFZIDE5WyRkXX0xSSAxOT17fX07OCAx UD17fTs4IDFYPVA7Qy4xcz02KCQxYiwkMXEpezkoMVgpMW4oIiQxcT0iKzFpKCQx cSkpOzFQWyQxYl09MTIgJDFxKCl9O0MuMzA9NigkWSl7NyAkWT8xbigkWSk6en07 OCBFPXt9Ozggdj17fTs4IFo9W107RVsiICJdPTYoJGwsJGIsJHEsJHApezggJDUs aSxqO3goaT0wO2k8JGIueTtpKyspezggJDFyPTFmKCRiW2ldLCRxLCRwKTt4KGo9 MDsoJDU9JDFyW2pdKTtqKyspezkoTygkNSkmJjFwKCQ1LCRwKSkkbC5EKCQ1KX19 fTtFWyIjIl09NigkbCwkYiwkSCl7OCAkNSxqO3goaj0wOygkNT0kYltqXSk7aisr KTkoJDUuSD09JEgpJGwuRCgkNSl9O0VbIi4iXT02KCRsLCRiLCQxNyl7JDE3PTEy IDFSKCIoXnxcXFxccykiKyQxNysiKFxcXFxzfCQpIik7OCAkNSxpO3goaT0wOygk NT0kYltpXSk7aSsrKTkoJDE3LmgoJDUuMTcpKSRsLkQoJDUpfTtFWyI6Il09Nigk bCwkYiwkMnksJGMpezggJGg9dlskMnldLCQ1LGk7OSgkaCl4KGk9MDsoJDU9JGJb aV0pO2krKyk5KCRoKCQ1LCRjKSkkbC5EKCQ1KX07dlsiMlgiXT02KCQ1KXs4ICRY PVYoJDUpOzkoJFguMUcpeCg4IGk9MDtpPCRYLjFHLnk7aSsrKXs5KCRYLjFHW2ld PT0kNSk3IFJ9fTt2WyIzNSJdPTYoJDUpe307OCBPPTYoJDUpezcoJDUmJiQ1LjFa PT0xJiYkNS5xIT0iISIpPyQ1OjJxfTs4IDFsPTYoJDUpe0koJDUmJigkNT0kNS4z MikmJiFPKCQ1KSkyRzs3ICQ1fTs4IEs9NigkNSl7SSgkNSYmKCQ1PSQ1LjJVKSYm IU8oJDUpKTJHOzcgJDV9OzggMUw9NigkNSl7NyBPKCQ1LjJiKXx8SygkNS4yYil9 OzggMkw9NigkNSl7NyBPKCQ1LjI5KXx8MWwoJDUuMjkpfTs4IDE1PTYoJDUpezgg JDE1PVtdOyQ1PTFMKCQ1KTtJKCQ1KXskMTUuRCgkNSk7JDU9SygkNSl9NyAkMTV9 OzggMTY9Ujs4IDJ6PTYoJDUpezcgVigkNSkuMzE9PSIyViAyWSJ9OzggVj02KCQ1 KXs3ICQ1LjJafHwkNS5YfTs4IDFmPTYoJDUsJHEpezcoJHE9PSIqIiYmJDUuMUop PyQ1LjFKOiQ1LjFmKCRxKX07OCAxdD02KCQ1LCRxLCRwKXs5KCRxPT0iKiIpNyBP KCQ1KTs5KCExcCgkNSwkcCkpNyBQOzcgJDUucS4yOCgpPT0kcS4yOCgpfTs4IDFw PTYoJDUsJHApezchJHB8fCgkcD09IioiKXx8KCQ1LjJXPT0kcCl9OzggMVY9Nigk NSl7NyAkNS4yS307NiAyNigkbCwkYixIKXs4ICRtLGksajt4KGk9MDtpPCRiLnk7 aSsrKXs5KCRtPSRiW2ldLjFKLjM0KEgpKXs5KCRtLnk9PTJxKSRsLkQoJG0pOzFJ IHgoaj0wO2o8JG0ueTtqKyspJGwuRCgkbVtqXSl9fTcgJGx9OzggJDFGPS9cXHwv OzYgMnUoJCRiLCRVLCRGLCRjKXs5KCQxRi5oKCRGKSl7JEY9JEYuMjIoJDFGKTsk Yz0kRlswXTskRj0kRlsxXX04ICRsPVtdOzkoRVskVV0pe0VbJFVdKCRsLCQkYiwk RiwkYyl9NyAkbH07OCAkMm09L15bXlxccz4rfl0vOzggJCQyaD0vW1xccyMuOj4r figpQF18W15cXHMjLjo+K34oKUBdKy9nOzYgMUMoJGQpezkoJDJtLmgoJGQpKSRk PSIgIiskZDs3ICRkLm0oJCQyaCl8fFtdfTs4ICQyZz0vXFxzKihbXFxzPit+KCks XXxefCQpXFxzKi9nOzggJDJmPS8oW1xccz4rfixdfFteKF1cXCt8XikoWyMuOkBd KS9nOzggMW89NigkZCl7NyAkZC5HKCQyZywiJDEiKS5HKCQyZiwiJDEqJDIiKX07 OCAxUT17Mmk6NigpezciXCcifSxtOi9eKFwnW15cJ10qXCcpfCgiW14iXSoiKSQv LGg6NigkdSl7NyB6Lm0uaCgkdSl9LDI1OjYoJHUpezcgei5oKCR1KT8kdTp6KyR1 K3p9LDJrOjYoJHUpezcgei5oKCR1KT8kdS5TKDEsLTEpOiR1fX07OCAxTz02KCQx NCl7NyAxUS4yaygkMTQpfTs4ICQyaj0vKFtcXC8oKVtcXF0/e318KistXSkvZzs2 IDEwKCR1KXs3ICR1LkcoJDJqLCJcXFxcJDEiKX07Qy4xcygiMXgtMmEiLDYoKXtF WyI+Il09NigkbCwkYiwkcSwkcCl7OCAkNSxpLGo7eChpPTA7aTwkYi55O2krKyl7 OCAkMXI9MTUoJGJbaV0pO3goaj0wOygkNT0kMXJbal0pO2orKyk5KDF0KCQ1LCRx LCRwKSkkbC5EKCQ1KX19O0VbIisiXT02KCRsLCRiLCRxLCRwKXt4KDggaT0wO2k8 JGIueTtpKyspezggJDU9SygkYltpXSk7OSgkNSYmMXQoJDUsJHEsJHApKSRsLkQo JDUpfX07RVsiQCJdPTYoJGwsJGIsJDJsKXs4ICRoPVpbJDJsXS5oOzggJDUsaTt4 KGk9MDsoJDU9JGJbaV0pO2krKyk5KCRoKCQ1KSkkbC5EKCQ1KX07dlsiM3MtMWUi XT02KCQ1KXs3ITFsKCQ1KX07dlsiMUIiXT02KCQ1LCRZKXskWT0xMiAxUigiXiIr JFksImkiKTtJKCQ1JiYhJDUuMWooIjFCIikpJDU9JDUuMjQ7NyAkNSYmJFkuaCgk NS4xaigiMUIiKSl9Ozggaz17fTtrLjFFPSJAIjtrLk49e307ay5tPS9cXFsoW1xc dy1dKylcXHMqKFxcVz89KT9cXHMqKFteXFxdXSopXFxdL2c7ay5HPTYoJG0sJHQs JDJzLCRBKXs4ICQxeT1rLjFFKyRtOzkoIVpbJDF5XSl7JHQ9ay4ydCgkdCwkMnN8 fCIiLCRBfHwiIik7WlskMXldPSR0O1ouRCgkdCl9NyBaWyQxeV0uSH07ay4yZT02 KCRkKXs3ICRkLkcoei5tLHouRyl9O2suMnQ9NigkMUQsJGgsJEEpezggJDFnPXt9 OyQxZy5IPWsuMUUrWi55OyQxZy4xYj0kMUQ7JGg9ei5OWyRoXTskaD0kaD8kaChr LjFqKCQxRCksMU8oJEEpKTpQOyQxZy5oPTEyIDJyKCJlIiwiNyAiKyRoKTs3ICQx Z307ay4xaj02KCQxYil7MXcoJDFiLjN5KCkpe0IiSCI6NyJlLkgiO0IiM3YiOjci ZS4xNyI7QiJ4Ijo3ImUuM3giO0IiMjciOjkoMTYpezciMWkoKGUuM24ubSgvMjc9 XFwiPyhbXlxcXFxzXFwiXSopXFwiPy8pfHxbXSlbMV18fFwnXCcpIn19NyJlLjFq KFwnIiskMWIrIlwnKSJ9O3ouaz1rO2suTlsiIl09NigkdCl7NyAkdH07ay5OWyI9 Il09NigkdCwkQSl7NyAkdCsiPT0iKzFRLjI1KCRBKX07ay5OWyJ+PSJdPTYoJHQs JEEpezciLyhefFxcXFxzKSIrMTAoJEEpKyIoXFxcXHN8JCkvLmgoIiskdCsiKSJ9 O2suTlsifD0iXT02KCR0LCRBKXs3Ii9eIisxMCgkQSkrIigtfCQpLy5oKCIrJHQr IikifTs4IDJkPTFvOzFvPTYoJGQpezcgMmQoay4yZSgkZCkpfX0pO0MuMXMoIjF4 LTM3Iiw2KCl7OCAxQT0xUFsiMXgtMmEiXTs5KCExQSk3O0VbIn4iXT02KCRsLCRi LCRxLCRwKXs4ICQ1LGk7eChpPTA7KCQ1PSRiW2ldKTtpKyspe0koJDU9SygkNSkp ezkoMXQoJDUsJHEsJHApKSRsLkQoJDUpfX19O3ZbIjM4Il09NigkNSwkMTQpeyQx ND0xMiAxUigxMCgxTygkMTQpKSk7NyAkMTQuaCgxVigkNSkpfTt2WyIzayJdPTYo JDUpezcgJDU9PVYoJDUpLjJKfTt2WyIzaiJdPTYoJDUpezggJE0saTt4KGk9MDso JE09JDUuMkhbaV0pO2krKyl7OShPKCRNKXx8JE0uMVo9PTMpNyBQfTcgUn07dlsi MnYtMWUiXT02KCQ1KXs3IUsoJDUpfTt2WyIzbS0xZSJdPTYoJDUpeyQ1PSQ1LjI0 OzcgMUwoJDUpPT0yTCgkNSl9O3ZbIjNsIl09NigkNSwkZCl7OCAkMU49QygkZCxW KCQ1KSk7eCg4IGk9MDtpPCQxTi55O2krKyl7OSgkMU5baV09PSQ1KTcgUH03IFJ9 O3ZbIjJ4LTFlIl09NigkNSwkYyl7NyAxeigkNSwkYywxbCl9O3ZbIjJ4LTJ2LTFl Il09NigkNSwkYyl7NyAxeigkNSwkYyxLKX07dlsiM2kiXT02KCQ1KXs3ICQ1Lkg9 PTNjLjNiLlMoMSl9O3ZbIjJGIl09NigkNSl7NyAkNS4yRn07dlsiM0EiXT02KCQ1 KXs3ICQ1LjFNPT09UH07dlsiMU0iXT02KCQ1KXs3ICQ1LjFNfTt2WyIyRCJdPTYo JDUpezcgJDUuMkR9Ozggaz0xQS5rO2suTlsiXj0iXT02KCR0LCRBKXs3Ii9eIisx MCgkQSkrIi8uaCgiKyR0KyIpIn07ay5OWyIkPSJdPTYoJHQsJEEpezciLyIrMTAo JEEpKyIkLy5oKCIrJHQrIikifTtrLk5bIio9Il09NigkdCwkQSl7NyIvIisxMCgk QSkrIi8uaCgiKyR0KyIpIn07NiAxeigkNSwkYywkMXUpezF3KCRjKXtCIm4iOjcg UjtCIjNyIjokYz0iMm4iO1E7QiIzcCI6JGM9IjJuKzEifTggJCQyMz0xNSgkNS4y NCk7NiAxVCgkMTMpezggJDEzPSgkMXU9PUspPyQkMjMueS0kMTM6JDEzLTE7NyAk JDIzWyQxM109PSQ1fTs5KCExZCgkYykpNyAxVCgkYyk7JGM9JGMuMjIoIm4iKTs4 ICRUPTJDKCRjWzBdKTs4ICRMPTJDKCRjWzFdKTs5KCgxZCgkVCl8fCRUPT0xKSYm JEw9PTApNyBSOzkoJFQ9PTAmJiExZCgkTCkpNyAxVCgkTCk7OSgxZCgkTCkpJEw9 MDs4ICQxaD0xO0koJDU9JDF1KCQ1KSkkMWgrKzs5KDFkKCRUKXx8JFQ9PTEpNygk MXU9PUspPygkMWg8PSRMKTooJEw+PSQxaCk7NygkMWglJFQpPT0kTH19KTtDLjFz KCIxeC0zdCIsNigpezE2PTFuKCJQOy8qQDNvQDkoQFxcM3EpMTY9UkAzOUAqLyIp OzkoITE2KXsxZj02KCQ1LCRxLCRwKXs3ICRwPyQ1LjNoKCIqIiwkcSk6JDUuMWYo JHEpfTsxcD02KCQ1LCRwKXs3ISRwfHwoJHA9PSIqIil8fCgkNS4zZj09JHApfTsy ej1YLjJJPzYoJDUpezcvM2cvaS5oKFYoJDUpLjJJKX06NigkNSl7NyBWKCQ1KS4y Si5xIT0iM2UifTsxVj02KCQ1KXs3ICQ1LjFrfHwkNS4yS3x8MjAoJDUpfTs2IDIw KCQ1KXs4ICQxaz0iIiwkTSxpO3goaT0wOygkTT0kNS4ySFtpXSk7aSsrKXsxdygk TS4xWil7QiAxMTpCIDE6JDFrKz0yMCgkTSk7UTtCIDM6JDFrKz0kTS4zNjtRfX03 ICQxa319fSk7MTIgNigpezggJCQxOD02KCQ2LCQyYywkYyl7JDYuMTgoJDJjLCRj KX07OShcJ1wnLkcoL14vLDFpKSl7OCAybz0xaS4xVS5HOzggMnA9NigkMXYsJDFj KXs4ICRtLCQxVz0iIiwkdT16O0koJHUmJigkbT0kMXYuM2QoJHUpKSl7JDFXKz0k dS5TKDAsJG0uMTMpKyQkMTgoJDFjLHosJG0pOyR1PSR1LlMoJG0uM2EpfTcgJDFX KyR1fTsxaS4xVS5HPTYoJDF2LCQxYyl7ei5HPSgzdyAkMWM9PSI2Iik/MnA6Mm87 NyB6LkcoJDF2LCQxYyl9fTkoITJyLjE4KXs4IEo9IjE4LSIrM3ooMTIgM3UpOyQk MTg9NihmLG8sYSl7OCByO29bSl09ZjsxdyhhLnkpe0IgMDpyPW9bSl0oKTtRO0Ig MTpyPW9bSl0oYVswXSk7UTtCIDI6cj1vW0pdKGFbMF0sYVsxXSk7UTtCIDM6cj1v W0pdKGFbMF0sYVsxXSxhWzJdKTtRO0IgNDpyPW9bSl0oYVswXSxhWzFdLGFbMl0s YVszXSk7UTsyTTo4IDIxPVtdLGk9YS55LTE7Mk8gMjFbaV09ImFbIitpKyJdIjtJ KGktLSk7MW4oInI9b1tKXSgiKzIxKyIpIil9MVkgb1tKXTs3IHJ9fTkoIVtdLkQp MkUuMVUuRD02KCl7eCg4IGk9MDtpPGMueTtpKyspe3pbei55XT1jW2ldfTcgei55 fX07MVg9Ujs3IEN9KCk7Jyw2MiwyMjMsJ3x8fHx8ZWxlbWVudHxmdW5jdGlvbnxy ZXR1cm58dmFyfGlmfHxmcm9tfGFyZ3VtZW50c3xzZWxlY3Rvcnx8fHx0ZXN0fHx8 QXR0cmlidXRlU2VsZWN0b3J8cmVzdWx0c3xtYXRjaHx8fG5hbWVzcGFjZXx0YWdO YW1lfHx8YXR0cmlidXRlfHN0cmluZ3xwc2V1ZG9DbGFzc2VzfHxmb3J8bGVuZ3Ro fHRoaXN8dmFsdWV8Y2FzZXxjc3NRdWVyeXxwdXNofHNlbGVjdG9yc3xmaWx0ZXJ8 cmVwbGFjZXxpZHx3aGlsZXxBUFBMWXxuZXh0RWxlbWVudFNpYmxpbmd8c3RlcHxu b2RlfHRlc3RzfHRoaXNFbGVtZW50fGZhbHNlfGJyZWFrfHRydWV8c2xpY2V8bXVs dGlwbGllcnx0b2tlbnxnZXREb2N1bWVudHx8ZG9jdW1lbnR8Y29kZXxhdHRyaWJ1 dGVTZWxlY3RvcnN8cmVnRXNjYXBlfHxuZXd8aW5kZXh8dGV4dHxjaGlsZEVsZW1l bnRzfGlzTVNJRXxjbGFzc05hbWV8YXBwbHl8Y2FjaGV8Y2FjaGVTZWxlY3Rvcnxu YW1lfHJlcGxhY2VtZW50fGlzTmFOfGNoaWxkfGdldEVsZW1lbnRzQnlUYWdOYW1l fGF0dHJpYnV0ZVNlbGVjdG9yfGNvdW50fFN0cmluZ3xnZXRBdHRyaWJ1dGV8dGV4 dENvbnRlbnR8cHJldmlvdXNFbGVtZW50U2libGluZ3xlcnJvcnxldmFsfHBhcnNl U2VsZWN0b3J8Y29tcGFyZU5hbWVzcGFjZXxzY3JpcHR8c3Vic2V0fGFkZE1vZHVs ZXxjb21wYXJlVGFnTmFtZXx0cmF2ZXJzZXxleHByZXNzaW9ufHN3aXRjaHxjc3N8 a2V5fG50aENoaWxkfGNzczJ8bGFuZ3xfdG9TdHJlYW18cHJvcGVydHlOYW1lfFBS RUZJWHxOQU1FU1BBQ0V8bGlua3N8dmVyc2lvbnxlbHNlfGFsbHxiYXNlfGZpcnN0 RWxlbWVudENoaWxkfGRpc2FibGVkfG5lZ2F0ZWR8Z2V0VGV4dHxtb2R1bGVzfFF1 b3RlfFJlZ0V4cHx1c2VDYWNoZXxfY2hlY2tJbmRleHxwcm90b3R5cGV8Z2V0VGV4 dENvbnRlbnR8bmV3U3RyaW5nfGxvYWRlZHxkZWxldGV8bm9kZVR5cGV8X2dldFRl eHRDb250ZW50fGFhfHNwbGl0fGNoaWxkcmVufHBhcmVudE5vZGV8YWRkfF9tc2ll X3NlbGVjdEJ5SWR8aHJlZnx0b1VwcGVyQ2FzZXxsYXN0Q2hpbGR8bGV2ZWwyfGZp cnN0Q2hpbGR8b2JqZWN0fF9wYXJzZVNlbGVjdG9yfHBhcnNlfElNUExJRURfQUxM fFdISVRFU1BBQ0V8U1RSRUFNfHRvU3RyaW5nfEVTQ0FQRXxyZW1vdmV8YXR0cmli dXRlU2VsZWN0b3JJRHxTVEFOREFSRF9TRUxFQ1R8fF9zdHJpbmdSZXBsYWNlfF9m dW5jdGlvblJlcGxhY2V8bnVsbHxGdW5jdGlvbnxjb21wYXJlfGNyZWF0ZXxzZWxl Y3R8bGFzdHxqb2lufG50aHxwc2V1ZG9DbGFzc3xpc1hNTHxjYWNoaW5nfENPTU1B fHBhcnNlSW50fGluZGV0ZXJtaW5hdGV8QXJyYXl8Y2hlY2tlZHxjb250aW51ZXxj aGlsZE5vZGVzfGNvbnRlbnRUeXBlfGRvY3VtZW50RWxlbWVudHxpbm5lclRleHR8 bGFzdEVsZW1lbnRDaGlsZHxkZWZhdWx0fGNvbmNhdHxkb3xjYXRjaHxjYWxsZWV8 Y29uc3RydWN0b3J8YmV0YXx0cnl8bmV4dFNpYmxpbmd8WE1MfHNjb3BlTmFtZXxs aW5rfERvY3VtZW50fG93bmVyRG9jdW1lbnR8dmFsdWVPZnxtaW1lVHlwZXxwcmV2 aW91c1NpYmxpbmd8Y2xlYXJDYWNoZXxpdGVtfHZpc2l0ZWR8bm9kZVZhbHVlfGxl dmVsM3xjb250YWluc3xlbmR8bGFzdEluZGV4fGhhc2h8bG9jYXRpb258ZXhlY3xI VE1MfHByZWZpeHx4bWx8Z2V0RWxlbWVudHNCeVRhZ05hbWVOU3x0YXJnZXR8ZW1w dHl8cm9vdHxub3R8b25seXxvdXRlckhUTUx8Y2Nfb258b2RkfHg1ZndpbjMyfGV2 ZW58Zmlyc3R8c3RhbmRhcmR8RGF0ZXxjbGFzc3x0eXBlb2Z8aHRtbEZvcnx0b0xv d2VyQ2FzZXxOdW1iZXJ8ZW5hYmxlZCcuc3BsaXQoJ3wnKSwwLHt9KSk7DQp9CnRl eHRzID0gbmV3IEFycmF5KCk7DQoNCnRleHRzWydkb2NsaWInXSA9IG5ldyBBcnJh eSgpOw0KdGV4dHNbJ2RvY2xpYiddWydpbnNlcnRfYXMnXQkJCT0gJ0luc2VydCBh cyc7DQp0ZXh0c1snZG9jbGliJ11bJ2luc2VydF9hc19pbWFnZSddCQk9ICdpbWFn ZSc7DQp0ZXh0c1snZG9jbGliJ11bJ2luc2VydF9hc190ZXh0J10JCT0gJ3Rla3N0 JzsNCnRleHRzWydkb2NsaWInXVsnaW5zZXJ0X2FzX2xpbmsnXQkJPSAnTGluayc7 DQp0ZXh0c1snZG9jbGliJ11bJ2luc2VydF9hc190aHVtYiddCQk9ICdMaW5rIHRo dW1ibmFpbCB0byBvcmlnaW5hbCc7DQp0ZXh0c1snZG9jbGliJ11bJ2Zvcm1hdCdd CQkJCT0gJ0Zvcm1hdCc7DQp0ZXh0c1snZG9jbGliJ11bJ29yaWdpbmFsJ10JCQkJ PSAnT3JpZ2luYWwnOw0KdGV4dHNbJ2RvY2xpYiddWydvdXRsaW5lJ10JCQkJPSAn UG9zaXRpb24nOw0KdGV4dHNbJ2RvY2xpYiddWydub25lJ10JCQkJCT0gJ05vbmUn Ow0KdGV4dHNbJ2RvY2xpYiddWydsZWZ0J10JCQkJCT0gJ0xlZnQnOw0KdGV4dHNb J2RvY2xpYiddWydyaWdodCddCQkJCT0gJ1JpZ2h0JzsNCnRleHRzWydkb2NsaWIn XVsnaW5zZXJ0J10JCQkJPSAnSW5zZXJ0JzsNCnRleHRzWydkb2NsaWInXVsnaW5z ZXJ0X2ltYWdlJ10JCQk9ICdJbnNlcnQgaW1hZ2VzJzsNCnRleHRzWydkb2NsaWIn XVsnbm90X2ltcGxlbWVudGVkJ10JCT0gJ05vdCBpbXBsZW1lbnRlZCB5ZXQnOw0K DQp0ZXh0c1snZm9ybXMnXSA9IG5ldyBBcnJheSgpOw0KdGV4dHNbJ2Zvcm1zJ11b J21hcmtlZF9maWVsZHMnXQkJCT0gJ0ZpZWxkcyBtYXJrZWQgd2l0aCBhICc7DQp0 ZXh0c1snZm9ybXMnXVsncmVxdWlyZWQnXQkJCQk9ICcgYXJlIHJlcXVpcmVkJzsN CnRleHRzWydmb3JtcyddWydoaWRlX2FkdmFuY2VkJ10JCQk9ICdIaWRlIGV4dHJh IG9wdGlvbnMnOw0KdGV4dHNbJ2Zvcm1zJ11bJ3Nob3dfYWR2YW5jZWQnXQkJCT0g J1Nob3cgZXh0cmEgb3B0aW9ucyc7DQp0ZXh0c1snZm9ybXMnXVsnbWF4X2NoYXJz J10JCQkJPSAnWW91IG1heSB1c2UgdXAgdG8gJXMgY2hhcmFjdGVycyBoZXJlJzsN CnRleHRzWydmb3JtcyddWyduYW1lX3Rvb19zaG9ydCddCQk9ICdUaGlzIHVzZXJu YW1lIGlzIHRvbyBzaG9ydCc7DQp0ZXh0c1snZm9ybXMnXVsnZW1haWxfaW5jb3Jy ZWN0J10JCT0gJ1RoaXMgZW1haWxhZHJlc3MgaXMgaW5jb3JyZWN0JzsNCnRleHRz Wydmb3JtcyddWyd1cmxfaW5jb3JyZWN0J10JCQk9ICdUaGlzIFVSTCBpcyBpbmNv cnJlY3QnOw0KdGV4dHNbJ2Zvcm1zJ11bJ251bWVyaWNfb25seSddCQkJPSAnVGhp cyBmaWVsZCBjYW4gb25seSBjb250YWluIG51bWJlcnMnOw0KdGV4dHNbJ2Zvcm1z J11bJ3JlcXVpcmVkX2ZpZWxkJ10JCT0gJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQn Ow0KdGV4dHNbJ2Zvcm1zJ11bJ3Bhc3N3b3JkX25vX21hdGNoJ10JCT0gJ1RoZSB0 d28gcGFzc3dvcmRzIGRvIG5vdCBtYXRjaC4nOw0KdGV4dHNbJ2Zvcm1zJ11bJ3Vz ZXJuYW1lX3Rha2VuJ10JCT0gJ1RoaXMgdXNlcm5hbWUgaXMgYWxyZWFkeSBpbiB1 c2UuJzsNCnRleHRzWydmb3JtcyddWydpbnZhbGlkX2RvbWFpbiddCQk9ICdFbWFp bCBhZGRyZXNzZW4gZnJvbSB0aGlzIGRvbWFpbiBhcmUgbm90IGFsbG93ZWQuIFBs ZWFzZSB1c2UgYW5vdGhlciBlbWFpbGFkZHJlc3MuJzsNCnRleHRzWydmb3Jtcydd WydlbWFpbF90YWtlbiddCQkJPSAnVGhpcyBlbWFpbC1hZGRyZXNzIGlzIGFscmVh ZHkgaW4gdXNlLic7DQp0ZXh0c1snZm9ybXMnXVsnc2VsZWN0X2FsbF9yb3dzJ10J CT0gJ1NlbGVjdCBhbGwgcm93cyc7DQp0ZXh0c1snZm9ybXMnXVsnc2VsZWN0X21l c3NhZ2VzJ10JCT0gJ0NsaWNrIG9uIG9uZSBvciBtb3JlIG1lc3NhZ2VzIHRvIHNl bGVjdCB0aGVtJzsNCnRleHRzWydmb3JtcyddWyd1c2VybmFtZSddCQkJCT0gJ1Vz ZXJuYW1lJzsNCnRleHRzWydmb3JtcyddWydwYXNzd29yZCddCQkJCT0gJ1Bhc3N3 b3JkJzsNCnRleHRzWydmb3JtcyddWydzb2ZpbnVtbWVyX21pc21hdGNoJ10JPSAn VGhpcyBudW1iZXIgZG9lcyBub3QgcGFzcyB0aGUgIjExLXRlc3QiLCBpbnZhbGlk IHNvZmludW1iZXIuJzsNCnRleHRzWydmb3JtcyddWydsZW5ndGhfbm90XzknXQkJ CT0gJ1RoaXMgZmllbGQgbXVzdCBjb250YWluIGV4YWN0bHkgOSBkaWdpdHMuJzsN CnRleHRzWydmb3JtcyddWydzaG93X2FkdmFuY2VkX29wdGlvbnMnXQk9ICdTaG93 IGFkdmFuY2VkIG9wdGlvbnMnOw0KdGV4dHNbJ2Zvcm1zJ11bJ2hpZGVfYWR2YW5j ZWRfb3B0aW9ucyddCT0gJ0hpZGUgYWR2YW5jZWQgb3B0aW9ucyc7DQp0ZXh0c1sn Zm9ybXMnXVsna2V5d29yZF90b29fbG9uZyddCQk9ICdLZXl3b3JkIGAlc2AgZXhj ZWVkcyB0aGUgNTAgY2hhcmFjdGVyIGxpbWl0JzsNCnRleHRzWydmb3JtcyddWydr ZXl3b3Jkc19pbGxlZ2FsX2NoYXJhY3RlciddCT0gJ0tleXdvcmQgYCVzYCBjb250 YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMsIG91dHNpZGUgb2YgdGhlIGFsbG93ZWQg YS16LCAwLTkgYW5kIC1fIGNoYXJhY3RlcnMnOw0KDQp0ZXh0c1snaW1hZ2V3aXph cmQnXSA9IG5ldyBBcnJheSgpOw0KdGV4dHNbJ2ltYWdld2l6YXJkJ11bJ3NpemVz X2Vycm9yJ10JCT0gJ2Vycm9yIDo6IG9yaWdpbmFsIHNpemVzIG9mIHNvdXJjZWZp bGUgbm90IGZvdW5kJzsNCg0KdGV4dHNbJ25vcm1hbCddID0gbmV3IEFycmF5KCk7 DQp0ZXh0c1snbm9ybWFsJ11bJ2Rpc2FibGVkX29wdGlvbiddCQk9ICdZb3UgbWF5 IG5vdCBzZWxlY3QgdGhpcyBvcHRpb24uJzsNCnRleHRzWydub3JtYWwnXVsnbW9y ZSddCQkJCQk9ICdNb3JlLi4uJzsNCnRleHRzWydub3JtYWwnXVsnc2VhcmNoX3dl YmtpdCddCQk9ICdTZWFyY2ggd2l0aGluIHRoaXMgZm9ydW0uLi4nOw0KdGV4dHNb J25vcm1hbCddWydiYWNrJ10JCQkJCT0gJ0JhY2snOw0KDQp0ZXh0c1sneG1saHR0 cCddID0gbmV3IEFycmF5KCk7DQp0ZXh0c1sneG1saHR0cCddWydjbG9zZSddCQkJ CT0gJ0Nsb3NlJzsNCg0KdGV4dHNbJ2V4dHJhJ10gPSBuZXcgQXJyYXkoKTsNCnRl eHRzWydleHRyYSddWydzZWFyY2hQb3B1cCddCQkJPSAnU2VhcmNoLi4uJzsNCnRl eHRzWydleHRyYSddWydjbG9zZV9hbmRfc3VibWl0J10JCT0gJ0Nsb3NlICYgc3Vi bWl0JzsNCnRleHRzWydleHRyYSddWydhY2Nlc3NrZXlfaW5kaWNhdG9yJ10JPSAn KCVzKSc7DQp0ZXh0c1snZXh0cmEnXVsnY2xpY2tfdG9fZW5sYXJnZSddCQk9ICcg LSBjbGljayB0byBlbmxhcmdlJzsNCnRleHRzWydleHRyYSddWydlbnRlcl9wYWdl X251bWJlciddCQk9ICdQbGVhc2Ugc3BlY2lmeSBhIHBhZ2UgbnVtYmVyIGJldHdl ZW4gMSBhbmQgJXMnOw0KdGV4dHNbJ2V4dHJhJ11bJ3BhZ2VfbnVtYmVyX2luY29y cmVjdCddCT0gJ1lvdSBkaWRuXCd0IGVudGVyIGEgdmFsaWQgbnVtYmVyLic7DQp0 ZXh0c1snZXh0cmEnXVsnc2hvd19nYWxsZXJ5J10JCQk9ICdTaG93IGFsbCBpbWFn ZXMgZnJvbSB0aGlzIHRvcGljJzsNCnRleHRzWydleHRyYSddWydzaG93X2dhbGxl cnlfaGVhZGVyJ10JPSAnQWxsIGltYWdlcyBmcm9tIHRoaXMgdG9waWMnOw0KDQp0 ZXh0c1sndG9vbGJhciddID0gbmV3IEFycmF5KCk7DQp0ZXh0c1sndG9vbGJhcidd WydlbnRlcl9pbWdfdXJsJ10JCT0gJ0VudGVyIGltYWdlIFVSTDonOw0KdGV4dHNb J3Rvb2xiYXInXVsnZW50ZXJfdXJsJ10JCQk9ICdFbnRlciBVUkw6JzsNCnRleHRz Wyd0b29sYmFyJ11bJ2VudGVyX3RpdGxlJ10JCT0gJ0VudGVyIG9wdGlvbmFsIHRp dGxlOic7DQoNCnRleHRzWyd0b29sYmFyJ11bJ2hsaW5lJ10gPSAnJzsNCnRleHRz Wyd0b29sYmFyJ11bJ2JvbGQnXSA9ICdCb2xkJzsNCnRleHRzWyd0b29sYmFyJ11b J2l0YWxpYyddID0gJ0l0YWxpYyc7DQp0ZXh0c1sndG9vbGJhciddWyd1bmRlcmxp bmUnXSA9ICdVbmRlcmxpbmUnOw0KdGV4dHNbJ3Rvb2xiYXInXVsnc3RyaWtlJ10g PSAnU3RyaWtlIHRocnUnOw0KdGV4dHNbJ3Rvb2xiYXInXVsnc3VwJ10gPSAnU3Vw ZXJzY3JpcHQnOw0KdGV4dHNbJ3Rvb2xiYXInXVsnc3ViJ10gPSAnU3Vic2NyaXB0 JzsNCnRleHRzWyd0b29sYmFyJ11bJ2FsaWduX2xlZnQnXSA9ICdBbGlnbiB0ZXh0 IHRvIHRoZSBsZWZ0JzsNCnRleHRzWyd0b29sYmFyJ11bJ2FsaWduX2NlbnRlcidd ID0gJ0FsaWduIHRleHQgaW4gdGhlIGNlbnRlcic7DQp0ZXh0c1sndG9vbGJhcidd WydhbGlnbl9yaWdodCddID0gJ0FsaWduIHRleHQgdG8gdGhlIHJpZ2h0JzsNCnRl eHRzWyd0b29sYmFyJ11bJ2xpc3RfYnVsbGV0J10gPSAnQ3JlYXRlIGEgbGlzdCc7 DQp0ZXh0c1sndG9vbGJhciddWydsaXN0X251bSddID0gJ0NyZWF0ZSBhIG51bWJl cmVkIGxpc3QnOw0KdGV4dHNbJ3Rvb2xiYXInXVsnY29sb3JfYmcnXSA9ICdDaGFu Z2UgdGhlIGJhY2tncm91bmQtY29sb3InOw0KdGV4dHNbJ3Rvb2xiYXInXVsnY29s b3JfZmcnXSA9ICdDaGFuZ2UgdGhlIHRleHQtY29sb3InOw0KdGV4dHNbJ3Rvb2xi YXInXVsnbGluayddID0gJ0FkZCBhIGxpbmsnOw0KdGV4dHNbJ3Rvb2xiYXInXVsn aW1hZ2UnXSA9ICdBZGQgYW4gaW1hZ2UnOw0KdGV4dHNbJ3Rvb2xiYXInXVsndGFi bGUnXSA9ICdBZGQgYSB0YWJsZSc7DQp0ZXh0c1sndG9vbGJhciddWydociddID0g J0FkZCBhIGhvcml6b250YWwgbGluZSc7DQp0ZXh0c1sndG9vbGJhciddWydtYXhp bWl6ZSddID0gJ0luY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBpbnB1dGZpZWxkJzsN CnRleHRzWyd0b29sYmFyJ11bJ2RvY3VtZW50bGlicmFyeSddID0gJ09wZW4gdGhl IGRvY3VtZW50bGlicmFyeSc7DQoNCnRleHRzWydjYWxlbmRhciddID0gbmV3IEFy cmF5KCk7DQp0ZXh0c1snY2FsZW5kYXInXVsnY2FsZW5kYXJldmVudCddID0gJ0Fw cG9pbnRtZW50cyc7DQp0ZXh0c1snY2FsZW5kYXInXVsnY2FsZW5kYXJldmVudGFs bGRheSddID0gJ0Z1bGwgZGF5IGV2ZW50cyc7DQp0ZXh0c1snY2FsZW5kYXInXVsn dG9waWNzdGFydCddID0gJ1RvcGljc3RhcnRzJzsNCnRleHRzWydjYWxlbmRhcidd Wyd0b3BpY2V2ZW50J10gPSAnVG9waWNzJzsNCnRleHRzWydjYWxlbmRhciddWydi aXJ0aGRheSddID0gJ0JpcnRoZGF5cyc7DQoKLyogRGVmYXVsdCBnb29nbGUgYWQg c2V0dGluZ3MgKi8KZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMjIwMzMyNjcyMTM2 NjE5MiI7Cmdvb2dsZV9hZF93aWR0aCA9IDEyMDsKZ29vZ2xlX2FkX2hlaWdodCA9 IDYwMDsKZ29vZ2xlX2FkX2Zvcm1hdCA9ICIxMjB4NjAwX2FzIjsKZ29vZ2xlX2Fk X3R5cGUgPSAidGV4dCI7Cmdvb2dsZV9hZF9jaGFubmVsID0iIjsKZ29vZ2xlX2Fk X2ZvbnQgPSAnVGltZXMnOwpnb29nbGVfY29sb3JfYm9yZGVyID0gImNjY2NjYyI7 Cmdvb2dsZV9jb2xvcl9iZyA9ICJmZmZmZmYiOwpnb29nbGVfY29sb3JfbGluayA9 ICIwMDAwMDAiOwpnb29nbGVfY29sb3JfdXJsID0gIjY2NjY2NiI7Cmdvb2dsZV9j b2xvcl90ZXh0ID0gIjMzMzMzMyI7Cgp2YXIgbWFwID0gbnVsbDsKdmFyIGdlb2Nv ZGVyID0gbnVsbDsKdmFyIG1hcmtlciA9IG51bGw7CnZhciB4eUlucHV0ID0gbnVs bDsKCnN3aXRjaChkb2N1bWVudC5kb21haW4pCnsKCWNhc2UgJ2Rldi5hZnJpY2Et aW50ZXJhY3RpdmUubmV0JzoKCQl2YXIgZ29vZ2xlX21hcHNfYXBpX2tleSA9ICdB QlFJQUFBQXByTkh6WHVXTFpGOEFDM2FyRjk0bUJTWExTUUwyWkNmZUh3NkRjWFRz TzBsQjR2elBSU09hdEhScHFVOFdCNTcxOUQwb014NkpBUWdXUSc7CgkJYnJlYWs7 CgljYXNlICd3d3cub2ZmaWNlLnBhcnNlLm5sJzoKCWRlZmF1bHQ6CgkJdmFyIGdv b2dsZV9tYXBzX2FwaV9rZXkgPSAnQUJRSUFBQUFwck5Ielh1V0xaRjhBQzNhckY5 NG1CUW9OTXJBX2ZmZjU4YzlOYkd2THc0QUZOQnlWUlMwbGVIUTBEODhLelFkUkMy UFBydk1tdVRjTFEnOwp9CgovLyBhbHRlcm5hdGUgdGFibGUgcm93IGNvbG9yCmZ1 bmN0aW9uIGFsdGVybmF0ZVJvd1N0eWxlKCkKewoJdmFyIHJvd3MgPSBkb2N1bWVu dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndHInKTsKCWZvciggdmFyIGkgPSAwOyBp IDwgcm93cy5sZW5ndGg7IGkrKyApCgl7CgkJaWYoIGkgJSAyID09IDAgKQoJCQly b3dzW2ldLmNsYXNzTmFtZSA9ICcgYWx0ZXJuYXRlJzsKCQllbHNlCgkJCXJvd3Nb aV0uY2xhc3NOYW1lID0gJyc7Cgl9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUdvb2dsZU1h cHMoKQp7Cgl2YXIgcGlja2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3h5 X2Nvb3JkaW5hdGVfcGljaycpOwoKCWlmKHBpY2tlcikKCQlhZGRFdmVudChwaWNr ZXIsICdjbGljaycsIF90b2dnbGVHb29nbGVNYXBzKTsKfQoKZnVuY3Rpb24gX3Rv Z2dsZUdvb2dsZU1hcHMoKQp7Cgl2YXIgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQoJ2dvb2dsZS1tYXAtY29udGFpbmVyJyk7Cgl4eUlucHV0ID0gZG9jdW1l bnQuZ2V0RWxlbWVudEJ5SWQoJ3h5X2Nvb3JkaW5hdGUnKTsKCglqc2NzcygndG9n Z2xlJywgZGl2LCAnaGlkZScpOwoJanNjc3MoJ3RvZ2dsZScsIHRoaXMsICdjb2xs YXBzZScpOwoKCWlmKEdCcm93c2VySXNDb21wYXRpYmxlKCkgJiYgIWpzY3NzKCdj aGVjaycsIGRpdiwgJ2hpZGUnKSkKCXsKCQlpZih4eUlucHV0LnZhbHVlID09ICcn KQoJCQl2YXIgY2VudGVyID0gbmV3IEdMYXRMbmcoMC4yMTM2NzEsIDE2Ljk4NDg1 KTsKCQllbHNlCgkJewoJCQl2YXIgY29vcmRpbmF0ZXMgPSB4eUlucHV0LnZhbHVl LnNwbGl0KCcsICcpOwoJCQl2YXIgY2VudGVyID0gbmV3IEdMYXRMbmcoY29vcmRp bmF0ZXNbMF0sIGNvb3JkaW5hdGVzWzFdKTsKCQl9CgoJCW1hcCA9IG5ldyBHTWFw Mihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29vZ2xlLW1hcCcpKTsKCQltYXAu YWRkQ29udHJvbChuZXcgR0xhcmdlTWFwQ29udHJvbCgpKTsKCQltYXAuYWRkQ29u dHJvbChuZXcgR01hcFR5cGVDb250cm9sKCkpOwoJCW1hcC5zZXRDZW50ZXIoY2Vu dGVyLCAzKTsKCQltYXJrZXIgPSBuZXcgR01hcmtlcihjZW50ZXIsIHtkcmFnZ2Fi bGU6IHRydWV9KTsKCQltYXAuYWRkT3ZlcmxheShtYXJrZXIpOwoJCXh5SW5wdXQu dmFsdWUgPSBjZW50ZXIubGF0KCkgKyAnLCAnICsgY2VudGVyLmxuZygpOwoJCWdl b2NvZGVyID0gbmV3IEdDbGllbnRHZW9jb2RlcigpOwoKCQlHRXZlbnQuYWRkTGlz dGVuZXIobWFya2VyLCAnZHJhZ2VuZCcsIGZ1bmN0aW9uKCkgewoJCQl2YXIgcG9p bnQgPSBtYXJrZXIuZ2V0UG9pbnQoKTsKCQkJbWFwLnBhblRvKHBvaW50KTsKCQkJ eHlJbnB1dC52YWx1ZSA9IHBvaW50LmxhdCgpICsgJywgJyArIHBvaW50LmxuZygp OwoJCX0pOwoKCQlHRXZlbnQuYWRkTGlzdGVuZXIobWFwLCAnbW92ZWVuZCcsIGZ1 bmN0aW9uKCkgewoJCQljZW50ZXIgPSBtYXAuZ2V0Q2VudGVyKCk7CgkJCW1hcmtl ci5zZXRQb2ludChjZW50ZXIpOwoJCQl4eUlucHV0LnZhbHVlID0gY2VudGVyLmxh dCgpICsgJywgJyArIGNlbnRlci5sbmcoKTsKCQl9KTsKCX0KfTsKCmZ1bmN0aW9u IHNob3dBZGRyZXNzKCkKewoJdmFyIGFkZHJlc3MgPSBkb2N1bWVudC5nZXRFbGVt ZW50QnlJZCgneHlfY29vcmRpbmF0ZV9hZGRyZXNzJykudmFsdWU7CgoJaWYgKGdl b2NvZGVyKSB7CgkJZ2VvY29kZXIuZ2V0TGF0TG5nKAoJCQlhZGRyZXNzLAoJCQlm dW5jdGlvbihwb2ludCkgewoJCQkJaWYgKCFwb2ludCkKCQkJCQlhbGVydChhZGRy ZXNzICsgIiBuaWV0IGdldm9uZGVuIVxuXG5Qcm9iZWVyIHNwZWNpZmlla2VyIHRl IHppam4gKGFkcmVzLCBodWlzbnVtbWVyLCBwbGFhdHMsIGxhbmQpLiIpOwoJCQkJ ZWxzZQoJCQkJewoJCQkJCW1hcC5zZXRDZW50ZXIocG9pbnQsIDEzKTsKCQkJCQlt YXJrZXIuc2V0UG9pbnQoY2VudGVyKTsKCQkJCQl4eUlucHV0LnZhbHVlID0gcG9p bnQubGF0KCkgKyAnLCAnICsgcG9pbnQubG5nKCk7CgkJCQl9CgkJCX0KCQkpOwoJ fQp9OwoKZnVuY3Rpb24gZG9jbGliSW50ZXJhY3Rpb25BZnJpY2EoKQp7CglpZiAo Ym9hcmRfYWN0aW9uID09ICdlZGl0X2RvY3VtZW50JykKCQlhZGRFdmVudFRvVGFy Z2V0cyhudWxsLCAnY2xpY2snLCB0b2dnbGVGbGFzaEJhbm5lcnMsICdpbWdbbG9u Z2Rlc2NdJyk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZUZsYXNoQmFubmVycygpCnsKCXZh ciBiYW5uZXJzID0gbmV3IERPTVF1ZXJ5KCdkaXYjc2lkZWJhciAuQlNGbGFzaEFk Jyk7CgoJaWYoYmFubmVycy5sZW5ndGggPT0gMCkKCQlyZXR1cm47CgoJZm9yKHZh ciBpID0gMCwgYmFubmVyOyhiYW5uZXI9YmFubmVycy5nZXQoaSkpO2krKykKCQlp ZihiYW5uZXIuc3R5bGUudmlzaWJpbGl0eSAhPSAnaGlkZGVuJykKCQkJYmFubmVy LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKCQllbHNlCgkJCWJhbm5lci5z dHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnOwp9CgpmdW5jdGlvbiBhdHRhY2hL ZXl3b3JkU2VsZWN0b3IoKQp7CglpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgn a2V5d29yZHNlbGVjdG9yJykpCgkJYWRkRXZlbnRUb1RhcmdldHMobnVsbCwgJ2No YW5nZScsIGFkZEtleXdvcmQsICcja2V5d29yZHNlbGVjdG9yJyk7CgoJdmFyIGtl eXdvcmRpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZXl3b3Jkcycp OwoKCWlmIChrZXl3b3JkaW5wdXQgJiYga2V5d29yZGlucHV0LnRhZ05hbWUgIT0g J01FVEEnKQoJewogCQlpZiAodHlwZW9mIGJvYXJkX3VzZXJfaXNfcmVkYWN0aWUg PT0gJ3VuZGVmaW5lZCcgfHwgIWJvYXJkX3VzZXJfaXNfcmVkYWN0aWUpCgkJCWtl eXdvcmRpbnB1dC5yZWFkT25seSA9IHRydWU7CgoJCWtleXdvcmRpbnB1dC5wYXJl bnROb2RlLm5leHRTaWJsaW5nLm5leHRTaWJsaW5nLmNsYXNzTmFtZSA9ICdrZXl3 b3Jkc2VsZWN0b3InOwoJfQp9CgpmdW5jdGlvbiBtYWtlQmxvY2tzRWRpdGFibGUo dGFyZ2V0cykKewoJdmFyIGVkaXRMaW5rID0gJ3VsI2FkbWluLWxpbmtzIGxpLmVk aXQtYmxvY2tzIGEnOwoJYWRkRXZlbnRUb1RhcmdldHModGFyZ2V0cywgJ2NsaWNr JywgX21ha2VCbG9ja3NFZGl0YWJsZSwgZWRpdExpbmspOwoKCWlmKGdldENvb2tp ZSgnZWRpdF9ibG9ja3MnKSA9PSAnMScgJiYgbmV3IERPTVF1ZXJ5KGVkaXRMaW5r KS5nZXQoMCkpCgkJX21ha2VCbG9ja3NFZGl0YWJsZSgpOwp9CgpmdW5jdGlvbiBf bWFrZUJsb2Nrc0VkaXRhYmxlKGUpCnsKCWlmKGUpCgkJRXZlbnQuc3RvcChlKTsK Cgl2YXIgYmxvY2tzID0gbmV3IERPTVF1ZXJ5KCdkaXYuYmxvY2tbaWRdJyk7Cgl2 YXIgYmxvY2ssIGJsb2NrSWQsIGVkaXRMaW5rOwoJdmFyIGVkaXRhYmxlID0gdHJ1 ZTsKCglqc2NzcygndG9nZ2xlJywgbmV3IERPTVF1ZXJ5KCd1bCNhZG1pbi1saW5r cyBsaS5lZGl0LWJsb2NrcyBhJykuZ2V0KDApLCAnYWN0aXZlJyk7CgoJZm9yKHZh ciBpID0gMCwgYmxvY2s7IChibG9jaz1ibG9ja3MuZ2V0KGkpKTsgaSsrKQoJewoJ CWlmKGVkaXRMaW5rID0gbmV3IERPTVF1ZXJ5KCdhW3JlbD1lZGl0XScsIGJsb2Nr KS5nZXQoMCkpCgkJewoJCQllZGl0TGluay5wYXJlbnROb2RlLnJlbW92ZUNoaWxk KGVkaXRMaW5rKTsKCQkJZWRpdGFibGUgPSBmYWxzZTsKCQl9CgkJZWxzZQoJCXsK CQkJYmxvY2tJZCA9IGJsb2NrLmlkLm1hdGNoKC9ibG9ja1wtKFswLTldKykvaSlb MV07CgkJCWVkaXRMaW5rID0gY3JlYXRlRE9NTm9kZSgnYScsIHsnaHJlZicgOiBi b2FyZF9zY3JpcHRfdXJsICsgJy8uLi9hZG1pbi9hZG1pbi5waHA/YWN0aW9uPXVw ZGF0ZV9ibG9jayZkYXRhW2Jsb2NrX2lkXT0nICsgYmxvY2tJZCwgJ3JlbCcgOiAn ZWRpdCcsICd0aXRsZScgOiAnQmxvayBhYW5wYXNzZW4nfSwgWydCbG9rIGFhbnBh c3NlbiddKTsKCQkJYmxvY2suYXBwZW5kQ2hpbGQoZWRpdExpbmspOwoJCX0KCX0K CglpZihlZGl0YWJsZSkKCQlzZXRDb29raWUoJ2VkaXRfYmxvY2tzJywgJzEnKQoJ ZWxzZQoJCXNldENvb2tpZSgnZWRpdF9ibG9ja3MnLCAnMCcpCn0KCmZ1bmN0aW9u IHJhdGVJdGVtKCkKewoJaWYgKGJvYXJkX2FjdGlvbiA9PSAnY3JlYXRlX3VzZXIn IHx8IGJvYXJkX2FjdGlvbiA9PSAnZWRpdF91c2VyJykKCQlhZGRFdmVudFRvVGFy Z2V0cyhudWxsLCAnY2xpY2snLCBfc3RvcmVDbGljaywgJ29sLnN0YXItcmF0aW5n IGEnKTsKCglhZGRFdmVudFRvVGFyZ2V0cyhudWxsLCAnY2xpY2snLCBfcmF0ZUl0 ZW0sICd1bC5zdGFyLXJhdGluZyBhJyk7Cn0KCmZ1bmN0aW9uIF9zdG9yZUNsaWNr KGUpCnsKCXZhciBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMu cGFyZW50Tm9kZS5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgnZm9yJykpOwoJdmFy IGN1cnJlbnRSYXRpbmcgPSB0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5maXJz dENoaWxkOwoKCWlucHV0LnZhbHVlID0gdGhpcy5pbm5lckhUTUw7CgljdXJyZW50 UmF0aW5nLnN0eWxlLndpZHRoPSAyMCAqIHBhcnNlSW50KHRoaXMuaW5uZXJIVE1M KSArICIlIjsKfQoKZnVuY3Rpb24gX3JhdGVJdGVtKGUpCnsKCXZhciByYXRpbmcg PSB0aGlzLmhyZWY7Cgl2YXIgYmxvY2sgPSB0aGlzOwoKCXJhdGluZyA9IHJhdGlu Zy5zcGxpdCgnLycpLnJldmVyc2UoKTsKCglpZihyYXRpbmdbMl0pCgl7CgkJdmFy IHJlcXVlc3QgPSAnZGF0YVtyZWFjdGlkXT0nICsgZ2V0Q29va2llKCdSZWFjdElE JykgKyAnJmRhdGFbcmF0ZV09JyArIHJhdGluZ1swXSArICcmZGF0YVtpZF09JyAr IHJhdGluZ1sxXSArICcmZGF0YVt0eXBlXT0nICsgcmF0aW5nWzJdOwoJCWh0dHBy ZXFfc3RyaW5nKHJlcXVlc3QsIG51bGwsIGJvYXJkX3NjcmlwdF91cmwgKyAnL3Jh dGUnLCBmYWxzZSk7CgoJCXdoaWxlKCFibG9jay5pZCAmJiBibG9jay50YWdOYW1l ICE9ICdkaXYnICYmIGJsb2NrLnRhZ05hbWUgIT0gJ2h0bWwnKQoJCQlibG9jayA9 IGJsb2NrLnBhcmVudE5vZGU7CgoJCW5ldyBBamF4LlJlcXVlc3QoYm9hcmRfc2Ny aXB0X3VybCArICcvZ2V0X2Jsb2NrLycrYmxvY2suaWQuc3BsaXQoJy0nKVsxXSwg ewoJCQlwb3N0Qm9keSA6ICdkYXRhW3JhdGluZ190eXBlXT0nICsgcmF0aW5nWzJd ICsgJyZkYXRhW3JhdGluZ19pZF09JyArIHJhdGluZ1sxXSwKCQkJb25Db21wbGV0 ZSA6IGZ1bmN0aW9uKHRyYW5zcG9ydCkKCQkJewoJCQkJYmxvY2suaW5uZXJIVE1M ID0gdHJhbnNwb3J0LnJlc3BvbnNlVGV4dDsKCQkJCV9pbml0KGV2ZW50cywgYmxv Y2spOwoJCQl9CgkJfSk7CgoJCWUucHJldmVudERlZmF1bHQoKTsKCX0KfQoKZnVu Y3Rpb24gcmVsb2NhdGVCbG9ja3MoKQp7Cgl2YXIgY29udGFpbmVyID0gbmV3IERP TVF1ZXJ5KCdkaXYjYmxvY2stY29udGFpbmVyJykuZ2V0KDApOwoJdmFyIGJsb2Nr cyA9IG5ldyBET01RdWVyeSgnLnNob3ctYWZ0ZXItZmlyc3RtZXNzYWdlJyk7Cgl2 YXIgY2xvbmU7CgoJaWYoY29udGFpbmVyICYmIGJsb2Nrcy5sZW5ndGggPiAwKQoJ ewoJCWZvcih2YXIgaT0wLCBibG9jazsgKGJsb2NrID0gYmxvY2tzLmdldChpKSk7 IGkrKykKCQl7CgkJCWNsb25lID0gYmxvY2suY2xvbmVOb2RlKHRydWUpOwoJCQlj b250YWluZXIuYXBwZW5kQ2hpbGQoY2xvbmUpOwoJCQlibG9jay5wYXJlbnROb2Rl LnJlbW92ZUNoaWxkKGJsb2NrKTsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIGZpeEJyb3dz ZXJJc3N1ZXNBZnJpY2EoKQp7CglhZGRDbGFzc1RvVGFyZ2V0cygndWwjZXh0cmEt bmF2aWdhdGlvbiBsaTpsYXN0LWNoaWxkJywgJ2xhc3QtY2hpbGQnKTsKCWFkZENs YXNzVG9UYXJnZXRzKCdkaXYuYmxvY2sgYVtyZWw9Im1vcmUiXScsICdtb3JlJyk7 CglhZGRDbGFzc1RvVGFyZ2V0cygnZGl2I2FjdGlvbi1oZWFkZXIgb2wgbGk6Zmly c3QtY2hpbGQgKyBsaScsICdhZGplY2VudCcpOwoJYWRkQ2xhc3NUb1RhcmdldHMo J2Rpdi5ibG9jay10eXBlLWFyY2hpdmUgbGk6Zmlyc3QtY2hpbGQnLCAnZmlyc3Qt Y2hpbGQnKTsKCWFkZENsYXNzVG9UYXJnZXRzKCdkaXYuYmxvY2sudHdvLWNvbHVt bnMubm8tcGFkZGluZycsICdibG9jay10d28tY29sdW1ucy1uby1wYWRkaW5nJyk7 CglhZGRDbGFzc1RvVGFyZ2V0cygnZGl2LmJsb2NrLm5vLXBhZGRpbmcnLCAnYmxv Y2stbm8tcGFkZGluZycpOwp9CgpmdW5jdGlvbiBhbGxFeHRlcm5hbExpbmtzSW5Q b3B1cCh0YXJnZXRzKQp7Cgl2YXIgaXRlbXMgPSBnZXRUYXJnZXRzKHRhcmdldHMs ICdhW2hyZWZdJyksIGEgPSBjcmVhdGVET01Ob2RlKCdhJywgeyJocmVmIiA6IGJv YXJkX3NjcmlwdF91cmx9LCBbXSk7CgoJZm9yKHZhciBpPTAsIGl0ZW07IChpdGVt ID0gaXRlbXMuZ2V0KGkpKTsgaSsrKQoJCWlmIChpdGVtLmhvc3RuYW1lICE9ICcn ICYmIGEuaG9zdG5hbWUgIT0gaXRlbS5ob3N0bmFtZSkKCQkJaXRlbS5vbmNsaWNr ID0gZnVuY3Rpb24oKSB7IHdpbmRvdy5vcGVuKHRoaXMuaHJlZiwgJ3BvcHVwZXh0 ZXJuYWwnKTsgcmV0dXJuIGZhbHNlOyB9Owp9OwoKLyoKCVJlbW92ZSByZXBvcnRl ciBmaWVsZHMgaWYgdXNlciAhPSByZXBvcnRlcgoqLwp2YXIgYWN0dWFsdmFsaWRh dGVGb3JtID0gdmFsaWRhdGVGb3JtOwp2YXIgdmFsaWRhdGVGb3JtID0gZnVuY3Rp b24gKGZvcm0pCnsKCXZhciBpc19yZXBvcnRlciwgYWRkaXRpb25hbF9maWVsZHM7 CgoJaWYgKGJvYXJkX2FjdGlvbiA9PSAnY3JlYXRlX3VzZXInIHx8IGJvYXJkX2Fj dGlvbiA9PSAnZWRpdF91c2VyJykKCXsKCQlpc19yZXBvcnRlciA9IGRvY3VtZW50 LmdldEVsZW1lbnRCeUlkKCdpc19yZXBvcnRlcicpOwoKCQlpZiAoaXNfcmVwb3J0 ZXIgJiYgIWlzX3JlcG9ydGVyLmNoZWNrZWQpCgkJewoJCQlhZGRpdGlvbmFsX2Zp ZWxkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXBvcnRlci1maWVsZHMn KTsKCQkJYWRkaXRpb25hbF9maWVsZHMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChh ZGRpdGlvbmFsX2ZpZWxkcyk7CgkJCWlzX3JlcG9ydGVyLnBhcmVudE5vZGUucmVt b3ZlQ2hpbGQoaXNfcmVwb3J0ZXIpOwoJCX0KCX0KCglyZXR1cm4gYWN0dWFsdmFs aWRhdGVGb3JtKGZvcm0pOwp9CgpmdW5jdGlvbiByZXBvcnRlclJlZ2lzdHJhdGlv bigpCnsKCXZhciBpc19yZXBvcnRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlk KCdpc19yZXBvcnRlcicpOwoKCWlmIChib2FyZF9hY3Rpb24gIT0gJ2NyZWF0ZV91 c2VyJyB8fCAhaXNfcmVwb3J0ZXIgfHwgIWlzX3JlcG9ydGVyLmNoZWNrZWQpCgkJ cmV0dXJuIGZhbHNlOwoKCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXBvcnRl ci1maWVsZHMnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKCgl2YXIgcmF0aW5n cyA9IG5ldyBET01RdWVyeSgnZmllbGRzZXQjcmVwb3J0ZXItZmllbGRzIG9sLnN0 YXItcmF0aW5nJyk7CgoJZm9yICh2YXIgaT0wLCBpdGVtOyAoaXRlbT1yYXRpbmdz LmdldChpKSk7IGkrKykKCQlpZiAodHlwZW9mIGl0ZW0ubmV4dFNpYmxpbmcudmFs dWUgIT0gJ3VuZGVmaW5lZCcpCgkJCWl0ZW0uZmlyc3RDaGlsZC5zdHlsZS53aWR0 aCA9IDIwICogaXRlbS5uZXh0U2libGluZy52YWx1ZSArJyUnOwp9Ci8qICBQcm90 b3R5cGUgSmF2YVNjcmlwdCBmcmFtZXdvcmssIHZlcnNpb24gMS40LjAKICogIChj KSAyMDA1IFNhbSBTdGVwaGVuc29uIDxzYW1AY29uaW8ubmV0PgogKgogKiAgVEhJ UyBGSUxFIElTIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVELiBXaGVuIHNlbmRpbmcg cGF0Y2hlcywgcGxlYXNlIGRpZmYKICogIGFnYWluc3QgdGhlIHNvdXJjZSB0cmVl LCBhdmFpbGFibGUgZnJvbSB0aGUgUHJvdG90eXBlIGRhcmNzIHJlcG9zaXRvcnku CiAqCiAqICBQcm90b3R5cGUgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUgdW5kZXIg dGhlIHRlcm1zIG9mIGFuIE1JVC1zdHlsZSBsaWNlbnNlLgogKgogKiAgRm9yIGRl dGFpbHMsIHNlZSB0aGUgUHJvdG90eXBlIHdlYiBzaXRlOiBodHRwOi8vcHJvdG90 eXBlLmNvbmlvLm5ldC8KICoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSov Cgp2YXIgUHJvdG90eXBlID0gewogIFZlcnNpb246ICcxLjQuMCcsCiAgU2NyaXB0 RnJhZ21lbnQ6ICcoPzo8c2NyaXB0Lio/PikoKFxufFxyfC4pKj8pKD86PFwvc2Ny aXB0PiknLAoKICBlbXB0eUZ1bmN0aW9uOiBmdW5jdGlvbigpIHt9LAogIEs6IGZ1 bmN0aW9uKHgpIHtyZXR1cm4geH0KfQoKdmFyIENsYXNzID0gewogIGNyZWF0ZTog ZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMu aW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfQogIH0KfQoK dmFyIEFic3RyYWN0ID0gbmV3IE9iamVjdCgpOwoKT2JqZWN0LmV4dGVuZCA9IGZ1 bmN0aW9uKGRlc3RpbmF0aW9uLCBzb3VyY2UpIHsKICBmb3IgKHByb3BlcnR5IGlu IHNvdXJjZSkgewogICAgZGVzdGluYXRpb25bcHJvcGVydHldID0gc291cmNlW3By b3BlcnR5XTsKICB9CiAgcmV0dXJuIGRlc3RpbmF0aW9uOwp9CgpPYmplY3QuaW5z cGVjdCA9IGZ1bmN0aW9uKG9iamVjdCkgewogIHRyeSB7CiAgICBpZiAob2JqZWN0 ID09IHVuZGVmaW5lZCkgcmV0dXJuICd1bmRlZmluZWQnOwogICAgaWYgKG9iamVj dCA9PSBudWxsKSByZXR1cm4gJ251bGwnOwogICAgcmV0dXJuIG9iamVjdC5pbnNw ZWN0ID8gb2JqZWN0Lmluc3BlY3QoKSA6IG9iamVjdC50b1N0cmluZygpOwogIH0g Y2F0Y2ggKGUpIHsKICAgIGlmIChlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikgcmV0 dXJuICcuLi4nOwogICAgdGhyb3cgZTsKICB9Cn0KCkZ1bmN0aW9uLnByb3RvdHlw ZS5iaW5kID0gZnVuY3Rpb24oKSB7CiAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJn cyA9ICRBKGFyZ3VtZW50cyksIG9iamVjdCA9IGFyZ3Muc2hpZnQoKTsKICByZXR1 cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gX19tZXRob2QuYXBwbHkob2JqZWN0 LCBhcmdzLmNvbmNhdCgkQShhcmd1bWVudHMpKSk7CiAgfQp9CgpGdW5jdGlvbi5w cm90b3R5cGUuYmluZEFzRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKG9iamVjdCkg ewogIHZhciBfX21ldGhvZCA9IHRoaXM7CiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50 KSB7CiAgICByZXR1cm4gX19tZXRob2QuY2FsbChvYmplY3QsIGV2ZW50IHx8IHdp bmRvdy5ldmVudCk7CiAgfQp9CgpPYmplY3QuZXh0ZW5kKE51bWJlci5wcm90b3R5 cGUsIHsKICB0b0NvbG9yUGFydDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZGlnaXRz ID0gdGhpcy50b1N0cmluZygxNik7CiAgICBpZiAodGhpcyA8IDE2KSByZXR1cm4g JzAnICsgZGlnaXRzOwogICAgcmV0dXJuIGRpZ2l0czsKICB9LAoKICBzdWNjOiBm dW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzICsgMTsKICB9LAoKICB0aW1lczog ZnVuY3Rpb24oaXRlcmF0b3IpIHsKICAgICRSKDAsIHRoaXMsIHRydWUpLmVhY2go aXRlcmF0b3IpOwogICAgcmV0dXJuIHRoaXM7CiAgfQp9KTsKCnZhciBUcnkgPSB7 CiAgdGhlc2U6IGZ1bmN0aW9uKCkgewogICAgdmFyIHJldHVyblZhbHVlOwoKICAg IGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAg ICAgIHZhciBsYW1iZGEgPSBhcmd1bWVudHNbaV07CiAgICAgIHRyeSB7CiAgICAg ICAgcmV0dXJuVmFsdWUgPSBsYW1iZGEoKTsKICAgICAgICBicmVhazsKICAgICAg fSBjYXRjaCAoZSkge30KICAgIH0KCiAgICByZXR1cm4gcmV0dXJuVmFsdWU7CiAg fQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCnZhciBQZXJpb2Rp Y2FsRXhlY3V0ZXIgPSBDbGFzcy5jcmVhdGUoKTsKUGVyaW9kaWNhbEV4ZWN1dGVy LnByb3RvdHlwZSA9IHsKICBpbml0aWFsaXplOiBmdW5jdGlvbihjYWxsYmFjaywg ZnJlcXVlbmN5KSB7CiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICB0 aGlzLmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKICAgIHRoaXMuY3VycmVudGx5RXhl Y3V0aW5nID0gZmFsc2U7CgogICAgdGhpcy5yZWdpc3RlckNhbGxiYWNrKCk7CiAg fSwKCiAgcmVnaXN0ZXJDYWxsYmFjazogZnVuY3Rpb24oKSB7CiAgICBzZXRJbnRl cnZhbCh0aGlzLm9uVGltZXJFdmVudC5iaW5kKHRoaXMpLCB0aGlzLmZyZXF1ZW5j eSAqIDEwMDApOwogIH0sCgogIG9uVGltZXJFdmVudDogZnVuY3Rpb24oKSB7CiAg ICBpZiAoIXRoaXMuY3VycmVudGx5RXhlY3V0aW5nKSB7CiAgICAgIHRyeSB7CiAg ICAgICAgdGhpcy5jdXJyZW50bHlFeGVjdXRpbmcgPSB0cnVlOwogICAgICAgIHRo aXMuY2FsbGJhY2soKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICB0aGlzLmN1 cnJlbnRseUV4ZWN1dGluZyA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgfQp9Cgov Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCmZ1bmN0aW9uICQoKSB7CiAg dmFyIGVsZW1lbnRzID0gbmV3IEFycmF5KCk7CgogIGZvciAodmFyIGkgPSAwOyBp IDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZWxlbWVudCA9IGFy Z3VtZW50c1tpXTsKICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PSAnc3RyaW5nJykK ICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQp OwoKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpCiAgICAgIHJldHVybiBl bGVtZW50OwoKICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7CiAgfQoKICByZXR1 cm4gZWxlbWVudHM7Cn0KT2JqZWN0LmV4dGVuZChTdHJpbmcucHJvdG90eXBlLCB7 CiAgc3RyaXBUYWdzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnJlcGxh Y2UoLzxcLz9bXj5dKz4vZ2ksICcnKTsKICB9LAoKICBzdHJpcFNjcmlwdHM6IGZ1 bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMucmVwbGFjZShuZXcgUmVnRXhwKFBy b3RvdHlwZS5TY3JpcHRGcmFnbWVudCwgJ2ltZycpLCAnJyk7CiAgfSwKCiAgZXh0 cmFjdFNjcmlwdHM6IGZ1bmN0aW9uKCkgewogICAgdmFyIG1hdGNoQWxsID0gbmV3 IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsICdpbWcnKTsKICAgIHZh ciBtYXRjaE9uZSA9IG5ldyBSZWdFeHAoUHJvdG90eXBlLlNjcmlwdEZyYWdtZW50 LCAnaW0nKTsKICAgIHJldHVybiAodGhpcy5tYXRjaChtYXRjaEFsbCkgfHwgW10p Lm1hcChmdW5jdGlvbihzY3JpcHRUYWcpIHsKICAgICAgcmV0dXJuIChzY3JpcHRU YWcubWF0Y2gobWF0Y2hPbmUpIHx8IFsnJywgJyddKVsxXTsKICAgIH0pOwogIH0s CgogIGV2YWxTY3JpcHRzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmV4 dHJhY3RTY3JpcHRzKCkubWFwKGV2YWwpOwogIH0sCgogIGVzY2FwZUhUTUw6IGZ1 bmN0aW9uKCkgewogICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo J2RpdicpOwogICAgdmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0 aGlzKTsKICAgIGRpdi5hcHBlbmRDaGlsZCh0ZXh0KTsKICAgIHJldHVybiBkaXYu aW5uZXJIVE1MOwogIH0sCgogIHVuZXNjYXBlSFRNTDogZnVuY3Rpb24oKSB7CiAg ICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBk aXYuaW5uZXJIVE1MID0gdGhpcy5zdHJpcFRhZ3MoKTsKICAgIHJldHVybiBkaXYu Y2hpbGROb2Rlc1swXSA/IGRpdi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZSA6ICcn OwogIH0sCgogIHRvUXVlcnlQYXJhbXM6IGZ1bmN0aW9uKCkgewogICAgdmFyIHBh aXJzID0gdGhpcy5tYXRjaCgvXlw/PyguKikkLylbMV0uc3BsaXQoJyYnKTsKICAg IHJldHVybiBwYWlycy5pbmplY3Qoe30sIGZ1bmN0aW9uKHBhcmFtcywgcGFpclN0 cmluZykgewogICAgICB2YXIgcGFpciA9IHBhaXJTdHJpbmcuc3BsaXQoJz0nKTsK ICAgICAgcGFyYW1zW3BhaXJbMF1dID0gcGFpclsxXTsKICAgICAgcmV0dXJuIHBh cmFtczsKICAgIH0pOwogIH0sCgogIHRvQXJyYXk6IGZ1bmN0aW9uKCkgewogICAg cmV0dXJuIHRoaXMuc3BsaXQoJycpOwogIH0sCgogIGNhbWVsaXplOiBmdW5jdGlv bigpIHsKICAgIHZhciBvU3RyaW5nTGlzdCA9IHRoaXMuc3BsaXQoJy0nKTsKICAg IGlmIChvU3RyaW5nTGlzdC5sZW5ndGggPT0gMSkgcmV0dXJuIG9TdHJpbmdMaXN0 WzBdOwoKICAgIHZhciBjYW1lbGl6ZWRTdHJpbmcgPSB0aGlzLmluZGV4T2YoJy0n KSA9PSAwCiAgICAgID8gb1N0cmluZ0xpc3RbMF0uY2hhckF0KDApLnRvVXBwZXJD YXNlKCkgKyBvU3RyaW5nTGlzdFswXS5zdWJzdHJpbmcoMSkKICAgICAgOiBvU3Ry aW5nTGlzdFswXTsKCiAgICBmb3IgKHZhciBpID0gMSwgbGVuID0gb1N0cmluZ0xp c3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgdmFyIHMgPSBvU3RyaW5n TGlzdFtpXTsKICAgICAgY2FtZWxpemVkU3RyaW5nICs9IHMuY2hhckF0KDApLnRv VXBwZXJDYXNlKCkgKyBzLnN1YnN0cmluZygxKTsKICAgIH0KCiAgICByZXR1cm4g Y2FtZWxpemVkU3RyaW5nOwogIH0sCgogIGluc3BlY3Q6IGZ1bmN0aW9uKCkgewog ICAgcmV0dXJuICInIiArIHRoaXMucmVwbGFjZSgnXFwnLCAnXFxcXCcpLnJlcGxh Y2UoIiciLCAnXFxcJycpICsgIiciOwogIH0KfSk7CgpTdHJpbmcucHJvdG90eXBl LnBhcnNlUXVlcnkgPSBTdHJpbmcucHJvdG90eXBlLnRvUXVlcnlQYXJhbXM7Cgp2 YXIgJGJyZWFrICAgID0gbmV3IE9iamVjdCgpOwp2YXIgJGNvbnRpbnVlID0gbmV3 IE9iamVjdCgpOwoKdmFyIEVudW1lcmFibGUgPSB7CiAgZWFjaDogZnVuY3Rpb24o aXRlcmF0b3IpIHsKICAgIHZhciBpbmRleCA9IDA7CiAgICB0cnkgewogICAgICB0 aGlzLl9lYWNoKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAg ICAgIGl0ZXJhdG9yKHZhbHVlLCBpbmRleCsrKTsKICAgICAgICB9IGNhdGNoIChl KSB7CiAgICAgICAgICBpZiAoZSAhPSAkY29udGludWUpIHRocm93IGU7CiAgICAg ICAgfQogICAgICB9KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaWYgKGUgIT0g JGJyZWFrKSB0aHJvdyBlOwogICAgfQogIH0sCgogIGFsbDogZnVuY3Rpb24oaXRl cmF0b3IpIHsKICAgIHZhciByZXN1bHQgPSB0cnVlOwogICAgdGhpcy5lYWNoKGZ1 bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICByZXN1bHQgPSByZXN1bHQgJiYg ISEoaXRlcmF0b3IgfHwgUHJvdG90eXBlLkspKHZhbHVlLCBpbmRleCk7CiAgICAg IGlmICghcmVzdWx0KSB0aHJvdyAkYnJlYWs7CiAgICB9KTsKICAgIHJldHVybiBy ZXN1bHQ7CiAgfSwKCiAgYW55OiBmdW5jdGlvbihpdGVyYXRvcikgewogICAgdmFy IHJlc3VsdCA9IHRydWU7CiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGlu ZGV4KSB7CiAgICAgIGlmIChyZXN1bHQgPSAhIShpdGVyYXRvciB8fCBQcm90b3R5 cGUuSykodmFsdWUsIGluZGV4KSkKICAgICAgICB0aHJvdyAkYnJlYWs7CiAgICB9 KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfSwKCiAgY29sbGVjdDogZnVuY3Rpb24o aXRlcmF0b3IpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB0aGlzLmVhY2go ZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CiAgICAgIHJlc3VsdHMucHVzaChpdGVy YXRvcih2YWx1ZSwgaW5kZXgpKTsKICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdHM7 CiAgfSwKCiAgZGV0ZWN0OiBmdW5jdGlvbiAoaXRlcmF0b3IpIHsKICAgIHZhciBy ZXN1bHQ7CiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CiAg ICAgIGlmIChpdGVyYXRvcih2YWx1ZSwgaW5kZXgpKSB7CiAgICAgICAgcmVzdWx0 ID0gdmFsdWU7CiAgICAgICAgdGhyb3cgJGJyZWFrOwogICAgICB9CiAgICB9KTsK ICAgIHJldHVybiByZXN1bHQ7CiAgfSwKCiAgZmluZEFsbDogZnVuY3Rpb24oaXRl cmF0b3IpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB0aGlzLmVhY2goZnVu Y3Rpb24odmFsdWUsIGluZGV4KSB7CiAgICAgIGlmIChpdGVyYXRvcih2YWx1ZSwg aW5kZXgpKQogICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZSk7CiAgICB9KTsKICAg IHJldHVybiByZXN1bHRzOwogIH0sCgogIGdyZXA6IGZ1bmN0aW9uKHBhdHRlcm4s IGl0ZXJhdG9yKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdGhpcy5lYWNo KGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICB2YXIgc3RyaW5nVmFsdWUg PSB2YWx1ZS50b1N0cmluZygpOwogICAgICBpZiAoc3RyaW5nVmFsdWUubWF0Y2go cGF0dGVybikpCiAgICAgICAgcmVzdWx0cy5wdXNoKChpdGVyYXRvciB8fCBQcm90 b3R5cGUuSykodmFsdWUsIGluZGV4KSk7CiAgICB9KQogICAgcmV0dXJuIHJlc3Vs dHM7CiAgfSwKCiAgaW5jbHVkZTogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICB2YXIg Zm91bmQgPSBmYWxzZTsKICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSkgewog ICAgICBpZiAodmFsdWUgPT0gb2JqZWN0KSB7CiAgICAgICAgZm91bmQgPSB0cnVl OwogICAgICAgIHRocm93ICRicmVhazsKICAgICAgfQogICAgfSk7CiAgICByZXR1 cm4gZm91bmQ7CiAgfSwKCiAgaW5qZWN0OiBmdW5jdGlvbihtZW1vLCBpdGVyYXRv cikgewogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAg ICBtZW1vID0gaXRlcmF0b3IobWVtbywgdmFsdWUsIGluZGV4KTsKICAgIH0pOwog ICAgcmV0dXJuIG1lbW87CiAgfSwKCiAgaW52b2tlOiBmdW5jdGlvbihtZXRob2Qp IHsKICAgIHZhciBhcmdzID0gJEEoYXJndW1lbnRzKS5zbGljZSgxKTsKICAgIHJl dHVybiB0aGlzLmNvbGxlY3QoZnVuY3Rpb24odmFsdWUpIHsKICAgICAgcmV0dXJu IHZhbHVlW21ldGhvZF0uYXBwbHkodmFsdWUsIGFyZ3MpOwogICAgfSk7CiAgfSwK CiAgbWF4OiBmdW5jdGlvbihpdGVyYXRvcikgewogICAgdmFyIHJlc3VsdDsKICAg IHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKICAgICAgdmFsdWUg PSAoaXRlcmF0b3IgfHwgUHJvdG90eXBlLkspKHZhbHVlLCBpbmRleCk7CiAgICAg IGlmICh2YWx1ZSA+PSAocmVzdWx0IHx8IHZhbHVlKSkKICAgICAgICByZXN1bHQg PSB2YWx1ZTsKICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKICB9LAoKICBtaW46 IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CiAgICB2YXIgcmVzdWx0OwogICAgdGhpcy5l YWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICB2YWx1ZSA9IChpdGVy YXRvciB8fCBQcm90b3R5cGUuSykodmFsdWUsIGluZGV4KTsKICAgICAgaWYgKHZh bHVlIDw9IChyZXN1bHQgfHwgdmFsdWUpKQogICAgICAgIHJlc3VsdCA9IHZhbHVl OwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0sCgogIHBhcnRpdGlvbjog ZnVuY3Rpb24oaXRlcmF0b3IpIHsKICAgIHZhciB0cnVlcyA9IFtdLCBmYWxzZXMg PSBbXTsKICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKICAg ICAgKChpdGVyYXRvciB8fCBQcm90b3R5cGUuSykodmFsdWUsIGluZGV4KSA/CiAg ICAgICAgdHJ1ZXMgOiBmYWxzZXMpLnB1c2godmFsdWUpOwogICAgfSk7CiAgICBy ZXR1cm4gW3RydWVzLCBmYWxzZXNdOwogIH0sCgogIHBsdWNrOiBmdW5jdGlvbihw cm9wZXJ0eSkgewogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHRoaXMuZWFjaChm dW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKICAgICAgcmVzdWx0cy5wdXNoKHZhbHVl W3Byb3BlcnR5XSk7CiAgICB9KTsKICAgIHJldHVybiByZXN1bHRzOwogIH0sCgog IHJlamVjdDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKICAgIHZhciByZXN1bHRzID0g W107CiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CiAgICAg IGlmICghaXRlcmF0b3IodmFsdWUsIGluZGV4KSkKICAgICAgICByZXN1bHRzLnB1 c2godmFsdWUpOwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0czsKICB9LAoKICBz b3J0Qnk6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CiAgICByZXR1cm4gdGhpcy5jb2xs ZWN0KGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICByZXR1cm4ge3ZhbHVl OiB2YWx1ZSwgY3JpdGVyaWE6IGl0ZXJhdG9yKHZhbHVlLCBpbmRleCl9OwogICAg fSkuc29ydChmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICB2YXIgYSA9IGxl ZnQuY3JpdGVyaWEsIGIgPSByaWdodC5jcml0ZXJpYTsKICAgICAgcmV0dXJuIGEg PCBiID8gLTEgOiBhID4gYiA/IDEgOiAwOwogICAgfSkucGx1Y2soJ3ZhbHVlJyk7 CiAgfSwKCiAgdG9BcnJheTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5j b2xsZWN0KFByb3RvdHlwZS5LKTsKICB9LAoKICB6aXA6IGZ1bmN0aW9uKCkgewog ICAgdmFyIGl0ZXJhdG9yID0gUHJvdG90eXBlLkssIGFyZ3MgPSAkQShhcmd1bWVu dHMpOwogICAgaWYgKHR5cGVvZiBhcmdzLmxhc3QoKSA9PSAnZnVuY3Rpb24nKQog ICAgICBpdGVyYXRvciA9IGFyZ3MucG9wKCk7CgogICAgdmFyIGNvbGxlY3Rpb25z ID0gW3RoaXNdLmNvbmNhdChhcmdzKS5tYXAoJEEpOwogICAgcmV0dXJuIHRoaXMu bWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICBpdGVyYXRvcih2YWx1 ZSA9IGNvbGxlY3Rpb25zLnBsdWNrKGluZGV4KSk7CiAgICAgIHJldHVybiB2YWx1 ZTsKICAgIH0pOwogIH0sCgogIGluc3BlY3Q6IGZ1bmN0aW9uKCkgewogICAgcmV0 dXJuICcjPEVudW1lcmFibGU6JyArIHRoaXMudG9BcnJheSgpLmluc3BlY3QoKSAr ICc+JzsKICB9Cn0KCk9iamVjdC5leHRlbmQoRW51bWVyYWJsZSwgewogIG1hcDog ICAgIEVudW1lcmFibGUuY29sbGVjdCwKICBmaW5kOiAgICBFbnVtZXJhYmxlLmRl dGVjdCwKICBzZWxlY3Q6ICBFbnVtZXJhYmxlLmZpbmRBbGwsCiAgbWVtYmVyOiAg RW51bWVyYWJsZS5pbmNsdWRlLAogIGVudHJpZXM6IEVudW1lcmFibGUudG9BcnJh eQp9KTsKdmFyICRBID0gQXJyYXkuZnJvbSA9IGZ1bmN0aW9uKGl0ZXJhYmxlKSB7 CiAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIFtdOwogIGlmIChpdGVyYWJsZS50b0Fy cmF5KSB7CiAgICByZXR1cm4gaXRlcmFibGUudG9BcnJheSgpOwogIH0gZWxzZSB7 CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBp dGVyYWJsZS5sZW5ndGg7IGkrKykKICAgICAgcmVzdWx0cy5wdXNoKGl0ZXJhYmxl W2ldKTsKICAgIHJldHVybiByZXN1bHRzOwogIH0KfQoKT2JqZWN0LmV4dGVuZChB cnJheS5wcm90b3R5cGUsIEVudW1lcmFibGUpOwoKQXJyYXkucHJvdG90eXBlLl9y ZXZlcnNlID0gQXJyYXkucHJvdG90eXBlLnJldmVyc2U7CgpPYmplY3QuZXh0ZW5k KEFycmF5LnByb3RvdHlwZSwgewogIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikg ewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKQogICAg ICBpdGVyYXRvcih0aGlzW2ldKTsKICB9LAoKICBjbGVhcjogZnVuY3Rpb24oKSB7 CiAgICB0aGlzLmxlbmd0aCA9IDA7CiAgICByZXR1cm4gdGhpczsKICB9LAoKICBm aXJzdDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpc1swXTsKICB9LAoKICBs YXN0OiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzW3RoaXMubGVuZ3RoIC0g MV07CiAgfSwKCiAgY29tcGFjdDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhp cy5zZWxlY3QoZnVuY3Rpb24odmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICE9 IHVuZGVmaW5lZCB8fCB2YWx1ZSAhPSBudWxsOwogICAgfSk7CiAgfSwKCiAgZmxh dHRlbjogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5pbmplY3QoW10sIGZ1 bmN0aW9uKGFycmF5LCB2YWx1ZSkgewogICAgICByZXR1cm4gYXJyYXkuY29uY2F0 KHZhbHVlLmNvbnN0cnVjdG9yID09IEFycmF5ID8KICAgICAgICB2YWx1ZS5mbGF0 dGVuKCkgOiBbdmFsdWVdKTsKICAgIH0pOwogIH0sCgogIHdpdGhvdXQ6IGZ1bmN0 aW9uKCkgewogICAgdmFyIHZhbHVlcyA9ICRBKGFyZ3VtZW50cyk7CiAgICByZXR1 cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24odmFsdWUpIHsKICAgICAgcmV0dXJuICF2 YWx1ZXMuaW5jbHVkZSh2YWx1ZSk7CiAgICB9KTsKICB9LAoKICBpbmRleE9mOiBm dW5jdGlvbihvYmplY3QpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5s ZW5ndGg7IGkrKykKICAgICAgaWYgKHRoaXNbaV0gPT0gb2JqZWN0KSByZXR1cm4g aTsKICAgIHJldHVybiAtMTsKICB9LAoKICByZXZlcnNlOiBmdW5jdGlvbihpbmxp bmUpIHsKICAgIHJldHVybiAoaW5saW5lICE9PSBmYWxzZSA/IHRoaXMgOiB0aGlz LnRvQXJyYXkoKSkuX3JldmVyc2UoKTsKICB9LAoKICBzaGlmdDogZnVuY3Rpb24o KSB7CiAgICB2YXIgcmVzdWx0ID0gdGhpc1swXTsKICAgIGZvciAodmFyIGkgPSAw OyBpIDwgdGhpcy5sZW5ndGggLSAxOyBpKyspCiAgICAgIHRoaXNbaV0gPSB0aGlz W2kgKyAxXTsKICAgIHRoaXMubGVuZ3RoLS07CiAgICByZXR1cm4gcmVzdWx0Owog IH0sCgogIGluc3BlY3Q6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICdbJyArIHRo aXMubWFwKE9iamVjdC5pbnNwZWN0KS5qb2luKCcsICcpICsgJ10nOwogIH0KfSk7 CnZhciBIYXNoID0gewogIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgewogICAg Zm9yIChrZXkgaW4gdGhpcykgewogICAgICB2YXIgdmFsdWUgPSB0aGlzW2tleV07 CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykgY29udGludWU7 CgogICAgICB2YXIgcGFpciA9IFtrZXksIHZhbHVlXTsKICAgICAgcGFpci5rZXkg PSBrZXk7CiAgICAgIHBhaXIudmFsdWUgPSB2YWx1ZTsKICAgICAgaXRlcmF0b3Io cGFpcik7CiAgICB9CiAgfSwKCiAga2V5czogZnVuY3Rpb24oKSB7CiAgICByZXR1 cm4gdGhpcy5wbHVjaygna2V5Jyk7CiAgfSwKCiAgdmFsdWVzOiBmdW5jdGlvbigp IHsKICAgIHJldHVybiB0aGlzLnBsdWNrKCd2YWx1ZScpOwogIH0sCgogIG1lcmdl OiBmdW5jdGlvbihoYXNoKSB7CiAgICByZXR1cm4gJEgoaGFzaCkuaW5qZWN0KCRI KHRoaXMpLCBmdW5jdGlvbihtZXJnZWRIYXNoLCBwYWlyKSB7CiAgICAgIG1lcmdl ZEhhc2hbcGFpci5rZXldID0gcGFpci52YWx1ZTsKICAgICAgcmV0dXJuIG1lcmdl ZEhhc2g7CiAgICB9KTsKICB9LAoKICB0b1F1ZXJ5U3RyaW5nOiBmdW5jdGlvbigp IHsKICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbihwYWlyKSB7CiAgICAgIHJl dHVybiBwYWlyLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJz0nKTsKICAg IH0pLmpvaW4oJyYnKTsKICB9LAoKICBpbnNwZWN0OiBmdW5jdGlvbigpIHsKICAg IHJldHVybiAnIzxIYXNoOnsnICsgdGhpcy5tYXAoZnVuY3Rpb24ocGFpcikgewog ICAgICByZXR1cm4gcGFpci5tYXAoT2JqZWN0Lmluc3BlY3QpLmpvaW4oJzogJyk7 CiAgICB9KS5qb2luKCcsICcpICsgJ30+JzsKICB9Cn0KCmZ1bmN0aW9uICRIKG9i amVjdCkgewogIHZhciBoYXNoID0gT2JqZWN0LmV4dGVuZCh7fSwgb2JqZWN0IHx8 IHt9KTsKICBPYmplY3QuZXh0ZW5kKGhhc2gsIEVudW1lcmFibGUpOwogIE9iamVj dC5leHRlbmQoaGFzaCwgSGFzaCk7CiAgcmV0dXJuIGhhc2g7Cn0KT2JqZWN0UmFu Z2UgPSBDbGFzcy5jcmVhdGUoKTsKT2JqZWN0LmV4dGVuZChPYmplY3RSYW5nZS5w cm90b3R5cGUsIEVudW1lcmFibGUpOwpPYmplY3QuZXh0ZW5kKE9iamVjdFJhbmdl LnByb3RvdHlwZSwgewogIGluaXRpYWxpemU6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQs IGV4Y2x1c2l2ZSkgewogICAgdGhpcy5zdGFydCA9IHN0YXJ0OwogICAgdGhpcy5l bmQgPSBlbmQ7CiAgICB0aGlzLmV4Y2x1c2l2ZSA9IGV4Y2x1c2l2ZTsKICB9LAoK ICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKICAgIHZhciB2YWx1ZSA9IHRo aXMuc3RhcnQ7CiAgICBkbyB7CiAgICAgIGl0ZXJhdG9yKHZhbHVlKTsKICAgICAg dmFsdWUgPSB2YWx1ZS5zdWNjKCk7CiAgICB9IHdoaWxlICh0aGlzLmluY2x1ZGUo dmFsdWUpKTsKICB9LAoKICBpbmNsdWRlOiBmdW5jdGlvbih2YWx1ZSkgewogICAg aWYgKHZhbHVlIDwgdGhpcy5zdGFydCkKICAgICAgcmV0dXJuIGZhbHNlOwogICAg aWYgKHRoaXMuZXhjbHVzaXZlKQogICAgICByZXR1cm4gdmFsdWUgPCB0aGlzLmVu ZDsKICAgIHJldHVybiB2YWx1ZSA8PSB0aGlzLmVuZDsKICB9Cn0pOwoKdmFyICRS ID0gZnVuY3Rpb24oc3RhcnQsIGVuZCwgZXhjbHVzaXZlKSB7CiAgcmV0dXJuIG5l dyBPYmplY3RSYW5nZShzdGFydCwgZW5kLCBleGNsdXNpdmUpOwp9Cgp2YXIgQWph eCA9IHsKICBnZXRUcmFuc3BvcnQ6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIFRy eS50aGVzZSgKICAgICAgZnVuY3Rpb24oKSB7cmV0dXJuIG5ldyBBY3RpdmVYT2Jq ZWN0KCdNc3htbDIuWE1MSFRUUCcpfSwKICAgICAgZnVuY3Rpb24oKSB7cmV0dXJu IG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpfSwKICAgICAg ZnVuY3Rpb24oKSB7cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpfQogICAgKSB8 fCBmYWxzZTsKICB9LAoKICBhY3RpdmVSZXF1ZXN0Q291bnQ6IDAKfQoKQWpheC5S ZXNwb25kZXJzID0gewogIHJlc3BvbmRlcnM6IFtdLAoKICBfZWFjaDogZnVuY3Rp b24oaXRlcmF0b3IpIHsKICAgIHRoaXMucmVzcG9uZGVycy5fZWFjaChpdGVyYXRv cik7CiAgfSwKCiAgcmVnaXN0ZXI6IGZ1bmN0aW9uKHJlc3BvbmRlclRvQWRkKSB7 CiAgICBpZiAoIXRoaXMuaW5jbHVkZShyZXNwb25kZXJUb0FkZCkpCiAgICAgIHRo aXMucmVzcG9uZGVycy5wdXNoKHJlc3BvbmRlclRvQWRkKTsKICB9LAoKICB1bnJl Z2lzdGVyOiBmdW5jdGlvbihyZXNwb25kZXJUb1JlbW92ZSkgewogICAgdGhpcy5y ZXNwb25kZXJzID0gdGhpcy5yZXNwb25kZXJzLndpdGhvdXQocmVzcG9uZGVyVG9S ZW1vdmUpOwogIH0sCgogIGRpc3BhdGNoOiBmdW5jdGlvbihjYWxsYmFjaywgcmVx dWVzdCwgdHJhbnNwb3J0LCBqc29uKSB7CiAgICB0aGlzLmVhY2goZnVuY3Rpb24o cmVzcG9uZGVyKSB7CiAgICAgIGlmIChyZXNwb25kZXJbY2FsbGJhY2tdICYmIHR5 cGVvZiByZXNwb25kZXJbY2FsbGJhY2tdID09ICdmdW5jdGlvbicpIHsKICAgICAg ICB0cnkgewogICAgICAgICAgcmVzcG9uZGVyW2NhbGxiYWNrXS5hcHBseShyZXNw b25kZXIsIFtyZXF1ZXN0LCB0cmFuc3BvcnQsIGpzb25dKTsKICAgICAgICB9IGNh dGNoIChlKSB7fQogICAgICB9CiAgICB9KTsKICB9Cn07CgpPYmplY3QuZXh0ZW5k KEFqYXguUmVzcG9uZGVycywgRW51bWVyYWJsZSk7CgpBamF4LlJlc3BvbmRlcnMu cmVnaXN0ZXIoewogIG9uQ3JlYXRlOiBmdW5jdGlvbigpIHsKICAgIEFqYXguYWN0 aXZlUmVxdWVzdENvdW50Kys7CiAgfSwKCiAgb25Db21wbGV0ZTogZnVuY3Rpb24o KSB7CiAgICBBamF4LmFjdGl2ZVJlcXVlc3RDb3VudC0tOwogIH0KfSk7CgpBamF4 LkJhc2UgPSBmdW5jdGlvbigpIHt9OwpBamF4LkJhc2UucHJvdG90eXBlID0gewog IHNldE9wdGlvbnM6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIHRoaXMub3B0aW9u cyA9IHsKICAgICAgbWV0aG9kOiAgICAgICAncG9zdCcsCiAgICAgIGFzeW5jaHJv bm91czogdHJ1ZSwKICAgICAgcGFyYW1ldGVyczogICAnJwogICAgfQogICAgT2Jq ZWN0LmV4dGVuZCh0aGlzLm9wdGlvbnMsIG9wdGlvbnMgfHwge30pOwogIH0sCgog IHJlc3BvbnNlSXNTdWNjZXNzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlz LnRyYW5zcG9ydC5zdGF0dXMgPT0gdW5kZWZpbmVkCiAgICAgICAgfHwgdGhpcy50 cmFuc3BvcnQuc3RhdHVzID09IDAKICAgICAgICB8fCAodGhpcy50cmFuc3BvcnQu c3RhdHVzID49IDIwMCAmJiB0aGlzLnRyYW5zcG9ydC5zdGF0dXMgPCAzMDApOwog IH0sCgogIHJlc3BvbnNlSXNGYWlsdXJlOiBmdW5jdGlvbigpIHsKICAgIHJldHVy biAhdGhpcy5yZXNwb25zZUlzU3VjY2VzcygpOwogIH0KfQoKQWpheC5SZXF1ZXN0 ID0gQ2xhc3MuY3JlYXRlKCk7CkFqYXguUmVxdWVzdC5FdmVudHMgPQogIFsnVW5p bml0aWFsaXplZCcsICdMb2FkaW5nJywgJ0xvYWRlZCcsICdJbnRlcmFjdGl2ZScs ICdDb21wbGV0ZSddOwoKQWpheC5SZXF1ZXN0LnByb3RvdHlwZSA9IE9iamVjdC5l eHRlbmQobmV3IEFqYXguQmFzZSgpLCB7CiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24o dXJsLCBvcHRpb25zKSB7CiAgICB0aGlzLnRyYW5zcG9ydCA9IEFqYXguZ2V0VHJh bnNwb3J0KCk7CiAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7CiAgICB0aGlz LnJlcXVlc3QodXJsKTsKICB9LAoKICByZXF1ZXN0OiBmdW5jdGlvbih1cmwpIHsK ICAgIHZhciBwYXJhbWV0ZXJzID0gdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMgfHwg Jyc7CiAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPiAwKSBwYXJhbWV0ZXJzICs9 ICcmXz0nOwoKICAgIHRyeSB7CiAgICAgIHRoaXMudXJsID0gdXJsOwogICAgICBp ZiAodGhpcy5vcHRpb25zLm1ldGhvZCA9PSAnZ2V0JyAmJiBwYXJhbWV0ZXJzLmxl bmd0aCA+IDApCiAgICAgICAgdGhpcy51cmwgKz0gKHRoaXMudXJsLm1hdGNoKC9c Py8pID8gJyYnIDogJz8nKSArIHBhcmFtZXRlcnM7CgogICAgICBBamF4LlJlc3Bv bmRlcnMuZGlzcGF0Y2goJ29uQ3JlYXRlJywgdGhpcywgdGhpcy50cmFuc3BvcnQp OwoKICAgICAgdGhpcy50cmFuc3BvcnQub3Blbih0aGlzLm9wdGlvbnMubWV0aG9k LCB0aGlzLnVybCwKICAgICAgICB0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzKTsK CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzKSB7CiAgICAgICAg dGhpcy50cmFuc3BvcnQub25yZWFkeXN0YXRlY2hhbmdlID0gdGhpcy5vblN0YXRl Q2hhbmdlLmJpbmQodGhpcyk7CiAgICAgICAgc2V0VGltZW91dCgoZnVuY3Rpb24o KSB7dGhpcy5yZXNwb25kVG9SZWFkeVN0YXRlKDEpfSkuYmluZCh0aGlzKSwgMTAp OwogICAgICB9CgogICAgICB0aGlzLnNldFJlcXVlc3RIZWFkZXJzKCk7CgogICAg ICB2YXIgYm9keSA9IHRoaXMub3B0aW9ucy5wb3N0Qm9keSA/IHRoaXMub3B0aW9u cy5wb3N0Qm9keSA6IHBhcmFtZXRlcnM7CiAgICAgIHRoaXMudHJhbnNwb3J0LnNl bmQodGhpcy5vcHRpb25zLm1ldGhvZCA9PSAncG9zdCcgPyBib2R5IDogbnVsbCk7 CgogICAgfSBjYXRjaCAoZSkgewogICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9u KGUpOwogICAgfQogIH0sCgogIHNldFJlcXVlc3RIZWFkZXJzOiBmdW5jdGlvbigp IHsKICAgIHZhciByZXF1ZXN0SGVhZGVycyA9CiAgICAgIFsnWC1SZXF1ZXN0ZWQt V2l0aCcsICdYTUxIdHRwUmVxdWVzdCcsCiAgICAgICAnWC1Qcm90b3R5cGUtVmVy c2lvbicsIFByb3RvdHlwZS5WZXJzaW9uXTsKCiAgICBpZiAodGhpcy5vcHRpb25z Lm1ldGhvZCA9PSAncG9zdCcpIHsKICAgICAgcmVxdWVzdEhlYWRlcnMucHVzaCgn Q29udGVudC10eXBlJywKICAgICAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11 cmxlbmNvZGVkJyk7CgogICAgICAvKiBGb3JjZSAiQ29ubmVjdGlvbjogY2xvc2Ui IGZvciBNb3ppbGxhIGJyb3dzZXJzIHRvIHdvcmsgYXJvdW5kCiAgICAgICAqIGEg YnVnIHdoZXJlIFhNTEh0dHBSZXFldWVzdCBzZW5kcyBhbiBpbmNvcnJlY3QgQ29u dGVudC1sZW5ndGgKICAgICAgICogaGVhZGVyLiBTZWUgTW96aWxsYSBCdWd6aWxs YSAjMjQ2NjUxLgogICAgICAgKi8KICAgICAgaWYgKHRoaXMudHJhbnNwb3J0Lm92 ZXJyaWRlTWltZVR5cGUpCiAgICAgICAgcmVxdWVzdEhlYWRlcnMucHVzaCgnQ29u bmVjdGlvbicsICdjbG9zZScpOwogICAgfQoKICAgIGlmICh0aGlzLm9wdGlvbnMu cmVxdWVzdEhlYWRlcnMpCiAgICAgIHJlcXVlc3RIZWFkZXJzLnB1c2guYXBwbHko cmVxdWVzdEhlYWRlcnMsIHRoaXMub3B0aW9ucy5yZXF1ZXN0SGVhZGVycyk7Cgog ICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXF1ZXN0SGVhZGVycy5sZW5ndGg7IGkg Kz0gMikKICAgICAgdGhpcy50cmFuc3BvcnQuc2V0UmVxdWVzdEhlYWRlcihyZXF1 ZXN0SGVhZGVyc1tpXSwgcmVxdWVzdEhlYWRlcnNbaSsxXSk7CiAgfSwKCiAgb25T dGF0ZUNoYW5nZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgcmVhZHlTdGF0ZSA9IHRo aXMudHJhbnNwb3J0LnJlYWR5U3RhdGU7CiAgICBpZiAocmVhZHlTdGF0ZSAhPSAx KQogICAgICB0aGlzLnJlc3BvbmRUb1JlYWR5U3RhdGUodGhpcy50cmFuc3BvcnQu cmVhZHlTdGF0ZSk7CiAgfSwKCiAgaGVhZGVyOiBmdW5jdGlvbihuYW1lKSB7CiAg ICB0cnkgewogICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVzcG9uc2VI ZWFkZXIobmFtZSk7CiAgICB9IGNhdGNoIChlKSB7fQogIH0sCgogIGV2YWxKU09O OiBmdW5jdGlvbigpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiBldmFsKHRoaXMu aGVhZGVyKCdYLUpTT04nKSk7CiAgICB9IGNhdGNoIChlKSB7fQogIH0sCgogIGV2 YWxSZXNwb25zZTogZnVuY3Rpb24oKSB7CiAgICB0cnkgewogICAgICByZXR1cm4g ZXZhbCh0aGlzLnRyYW5zcG9ydC5yZXNwb25zZVRleHQpOwogICAgfSBjYXRjaCAo ZSkgewogICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOwogICAgfQogIH0s CgogIHJlc3BvbmRUb1JlYWR5U3RhdGU6IGZ1bmN0aW9uKHJlYWR5U3RhdGUpIHsK ICAgIHZhciBldmVudCA9IEFqYXguUmVxdWVzdC5FdmVudHNbcmVhZHlTdGF0ZV07 CiAgICB2YXIgdHJhbnNwb3J0ID0gdGhpcy50cmFuc3BvcnQsIGpzb24gPSB0aGlz LmV2YWxKU09OKCk7CgogICAgaWYgKGV2ZW50ID09ICdDb21wbGV0ZScpIHsKICAg ICAgdHJ5IHsKICAgICAgICAodGhpcy5vcHRpb25zWydvbicgKyB0aGlzLnRyYW5z cG9ydC5zdGF0dXNdCiAgICAgICAgIHx8IHRoaXMub3B0aW9uc1snb24nICsgKHRo aXMucmVzcG9uc2VJc1N1Y2Nlc3MoKSA/ICdTdWNjZXNzJyA6ICdGYWlsdXJlJyld CiAgICAgICAgIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKSh0cmFuc3BvcnQs IGpzb24pOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgdGhpcy5kaXNwYXRj aEV4Y2VwdGlvbihlKTsKICAgICAgfQoKICAgICAgaWYgKCh0aGlzLmhlYWRlcign Q29udGVudC10eXBlJykgfHwgJycpLm1hdGNoKC9edGV4dFwvamF2YXNjcmlwdC9p KSkKICAgICAgICB0aGlzLmV2YWxSZXNwb25zZSgpOwogICAgfQoKICAgIHRyeSB7 CiAgICAgICh0aGlzLm9wdGlvbnNbJ29uJyArIGV2ZW50XSB8fCBQcm90b3R5cGUu ZW1wdHlGdW5jdGlvbikodHJhbnNwb3J0LCBqc29uKTsKICAgICAgQWpheC5SZXNw b25kZXJzLmRpc3BhdGNoKCdvbicgKyBldmVudCwgdGhpcywgdHJhbnNwb3J0LCBq c29uKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV4Y2Vw dGlvbihlKTsKICAgIH0KCiAgICAvKiBBdm9pZCBtZW1vcnkgbGVhayBpbiBNU0lF OiBjbGVhbiB1cCB0aGUgb25jb21wbGV0ZSBldmVudCBoYW5kbGVyICovCiAgICBp ZiAoZXZlbnQgPT0gJ0NvbXBsZXRlJykKICAgICAgdGhpcy50cmFuc3BvcnQub25y ZWFkeXN0YXRlY2hhbmdlID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CiAgfSwK CiAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikgewogICAg KHRoaXMub3B0aW9ucy5vbkV4Y2VwdGlvbiB8fCBQcm90b3R5cGUuZW1wdHlGdW5j dGlvbikodGhpcywgZXhjZXB0aW9uKTsKICAgIEFqYXguUmVzcG9uZGVycy5kaXNw YXRjaCgnb25FeGNlcHRpb24nLCB0aGlzLCBleGNlcHRpb24pOwogIH0KfSk7CgpB amF4LlVwZGF0ZXIgPSBDbGFzcy5jcmVhdGUoKTsKCk9iamVjdC5leHRlbmQoT2Jq ZWN0LmV4dGVuZChBamF4LlVwZGF0ZXIucHJvdG90eXBlLCBBamF4LlJlcXVlc3Qu cHJvdG90eXBlKSwgewogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGNvbnRhaW5lciwg dXJsLCBvcHRpb25zKSB7CiAgICB0aGlzLmNvbnRhaW5lcnMgPSB7CiAgICAgIHN1 Y2Nlc3M6IGNvbnRhaW5lci5zdWNjZXNzID8gJChjb250YWluZXIuc3VjY2Vzcykg OiAkKGNvbnRhaW5lciksCiAgICAgIGZhaWx1cmU6IGNvbnRhaW5lci5mYWlsdXJl ID8gJChjb250YWluZXIuZmFpbHVyZSkgOgogICAgICAgIChjb250YWluZXIuc3Vj Y2VzcyA/IG51bGwgOiAkKGNvbnRhaW5lcikpCiAgICB9CgogICAgdGhpcy50cmFu c3BvcnQgPSBBamF4LmdldFRyYW5zcG9ydCgpOwogICAgdGhpcy5zZXRPcHRpb25z KG9wdGlvbnMpOwoKICAgIHZhciBvbkNvbXBsZXRlID0gdGhpcy5vcHRpb25zLm9u Q29tcGxldGUgfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CiAgICB0aGlzLm9w dGlvbnMub25Db21wbGV0ZSA9IChmdW5jdGlvbih0cmFuc3BvcnQsIG9iamVjdCkg ewogICAgICB0aGlzLnVwZGF0ZUNvbnRlbnQoKTsKICAgICAgb25Db21wbGV0ZSh0 cmFuc3BvcnQsIG9iamVjdCk7CiAgICB9KS5iaW5kKHRoaXMpOwoKICAgIHRoaXMu cmVxdWVzdCh1cmwpOwogIH0sCgogIHVwZGF0ZUNvbnRlbnQ6IGZ1bmN0aW9uKCkg ewogICAgdmFyIHJlY2VpdmVyID0gdGhpcy5yZXNwb25zZUlzU3VjY2VzcygpID8K ICAgICAgdGhpcy5jb250YWluZXJzLnN1Y2Nlc3MgOiB0aGlzLmNvbnRhaW5lcnMu ZmFpbHVyZTsKICAgIHZhciByZXNwb25zZSA9IHRoaXMudHJhbnNwb3J0LnJlc3Bv bnNlVGV4dDsKCiAgICBpZiAoIXRoaXMub3B0aW9ucy5ldmFsU2NyaXB0cykKICAg ICAgcmVzcG9uc2UgPSByZXNwb25zZS5zdHJpcFNjcmlwdHMoKTsKCiAgICBpZiAo cmVjZWl2ZXIpIHsKICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnNlcnRpb24pIHsK ICAgICAgICBuZXcgdGhpcy5vcHRpb25zLmluc2VydGlvbihyZWNlaXZlciwgcmVz cG9uc2UpOwogICAgICB9IGVsc2UgewogICAgICAgIEVsZW1lbnQudXBkYXRlKHJl Y2VpdmVyLCByZXNwb25zZSk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodGhpcy5y ZXNwb25zZUlzU3VjY2VzcygpKSB7CiAgICAgIGlmICh0aGlzLm9uQ29tcGxldGUp CiAgICAgICAgc2V0VGltZW91dCh0aGlzLm9uQ29tcGxldGUuYmluZCh0aGlzKSwg MTApOwogICAgfQogIH0KfSk7CgpBamF4LlBlcmlvZGljYWxVcGRhdGVyID0gQ2xh c3MuY3JlYXRlKCk7CkFqYXguUGVyaW9kaWNhbFVwZGF0ZXIucHJvdG90eXBlID0g T2JqZWN0LmV4dGVuZChuZXcgQWpheC5CYXNlKCksIHsKICBpbml0aWFsaXplOiBm dW5jdGlvbihjb250YWluZXIsIHVybCwgb3B0aW9ucykgewogICAgdGhpcy5zZXRP cHRpb25zKG9wdGlvbnMpOwogICAgdGhpcy5vbkNvbXBsZXRlID0gdGhpcy5vcHRp b25zLm9uQ29tcGxldGU7CgogICAgdGhpcy5mcmVxdWVuY3kgPSAodGhpcy5vcHRp b25zLmZyZXF1ZW5jeSB8fCAyKTsKICAgIHRoaXMuZGVjYXkgPSAodGhpcy5vcHRp b25zLmRlY2F5IHx8IDEpOwoKICAgIHRoaXMudXBkYXRlciA9IHt9OwogICAgdGhp cy5jb250YWluZXIgPSBjb250YWluZXI7CiAgICB0aGlzLnVybCA9IHVybDsKCiAg ICB0aGlzLnN0YXJ0KCk7CiAgfSwKCiAgc3RhcnQ6IGZ1bmN0aW9uKCkgewogICAg dGhpcy5vcHRpb25zLm9uQ29tcGxldGUgPSB0aGlzLnVwZGF0ZUNvbXBsZXRlLmJp bmQodGhpcyk7CiAgICB0aGlzLm9uVGltZXJFdmVudCgpOwogIH0sCgogIHN0b3A6 IGZ1bmN0aW9uKCkgewogICAgdGhpcy51cGRhdGVyLm9uQ29tcGxldGUgPSB1bmRl ZmluZWQ7CiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7CiAgICAodGhpcy5v bkNvbXBsZXRlIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKS5hcHBseSh0aGlz LCBhcmd1bWVudHMpOwogIH0sCgogIHVwZGF0ZUNvbXBsZXRlOiBmdW5jdGlvbihy ZXF1ZXN0KSB7CiAgICBpZiAodGhpcy5vcHRpb25zLmRlY2F5KSB7CiAgICAgIHRo aXMuZGVjYXkgPSAocmVxdWVzdC5yZXNwb25zZVRleHQgPT0gdGhpcy5sYXN0VGV4 dCA/CiAgICAgICAgdGhpcy5kZWNheSAqIHRoaXMub3B0aW9ucy5kZWNheSA6IDEp OwoKICAgICAgdGhpcy5sYXN0VGV4dCA9IHJlcXVlc3QucmVzcG9uc2VUZXh0Owog ICAgfQogICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQodGhpcy5vblRpbWVyRXZl bnQuYmluZCh0aGlzKSwKICAgICAgdGhpcy5kZWNheSAqIHRoaXMuZnJlcXVlbmN5 ICogMTAwMCk7CiAgfSwKCiAgb25UaW1lckV2ZW50OiBmdW5jdGlvbigpIHsKICAg IHRoaXMudXBkYXRlciA9IG5ldyBBamF4LlVwZGF0ZXIodGhpcy5jb250YWluZXIs IHRoaXMudXJsLCB0aGlzLm9wdGlvbnMpOwogIH0KfSk7CmRvY3VtZW50LmdldEVs ZW1lbnRzQnlDbGFzc05hbWUgPSBmdW5jdGlvbihjbGFzc05hbWUsIHBhcmVudEVs ZW1lbnQpIHsKICB2YXIgY2hpbGRyZW4gPSAoJChwYXJlbnRFbGVtZW50KSB8fCBk b2N1bWVudC5ib2R5KS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpOwogIHJldHVy biAkQShjaGlsZHJlbikuaW5qZWN0KFtdLCBmdW5jdGlvbihlbGVtZW50cywgY2hp bGQpIHsKICAgIGlmIChjaGlsZC5jbGFzc05hbWUubWF0Y2gobmV3IFJlZ0V4cCgi KF58XFxzKSIgKyBjbGFzc05hbWUgKyAiKFxcc3wkKSIpKSkKICAgICAgZWxlbWVu dHMucHVzaChjaGlsZCk7CiAgICByZXR1cm4gZWxlbWVudHM7CiAgfSk7Cn0KCi8q LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKaWYgKCF3aW5kb3cuRWxlbWVu dCkgewogIHZhciBFbGVtZW50ID0gbmV3IE9iamVjdCgpOwp9CgpPYmplY3QuZXh0 ZW5kKEVsZW1lbnQsIHsKICB2aXNpYmxlOiBmdW5jdGlvbihlbGVtZW50KSB7CiAg ICByZXR1cm4gJChlbGVtZW50KS5zdHlsZS5kaXNwbGF5ICE9ICdub25lJzsKICB9 LAoKICB0b2dnbGU6IGZ1bmN0aW9uKCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkg PCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGVsZW1lbnQgPSAk KGFyZ3VtZW50c1tpXSk7CiAgICAgIEVsZW1lbnRbRWxlbWVudC52aXNpYmxlKGVs ZW1lbnQpID8gJ2hpZGUnIDogJ3Nob3cnXShlbGVtZW50KTsKICAgIH0KICB9LAoK ICBoaWRlOiBmdW5jdGlvbigpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJn dW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbGVtZW50ID0gJChhcmd1 bWVudHNbaV0pOwogICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7 CiAgICB9CiAgfSwKCiAgc2hvdzogZnVuY3Rpb24oKSB7CiAgICBmb3IgKHZhciBp ID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZWxl bWVudCA9ICQoYXJndW1lbnRzW2ldKTsKICAgICAgZWxlbWVudC5zdHlsZS5kaXNw bGF5ID0gJyc7CiAgICB9CiAgfSwKCiAgcmVtb3ZlOiBmdW5jdGlvbihlbGVtZW50 KSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIGVsZW1lbnQucGFyZW50 Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTsKICB9LAoKICB1cGRhdGU6IGZ1bmN0 aW9uKGVsZW1lbnQsIGh0bWwpIHsKICAgICQoZWxlbWVudCkuaW5uZXJIVE1MID0g aHRtbC5zdHJpcFNjcmlwdHMoKTsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7 aHRtbC5ldmFsU2NyaXB0cygpfSwgMTApOwogIH0sCgogIGdldEhlaWdodDogZnVu Y3Rpb24oZWxlbWVudCkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBy ZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQ7CiAgfSwKCiAgY2xhc3NOYW1lczog ZnVuY3Rpb24oZWxlbWVudCkgewogICAgcmV0dXJuIG5ldyBFbGVtZW50LkNsYXNz TmFtZXMoZWxlbWVudCk7CiAgfSwKCiAgaGFzQ2xhc3NOYW1lOiBmdW5jdGlvbihl bGVtZW50LCBjbGFzc05hbWUpIHsKICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1l bnQpKSkgcmV0dXJuOwogICAgcmV0dXJuIEVsZW1lbnQuY2xhc3NOYW1lcyhlbGVt ZW50KS5pbmNsdWRlKGNsYXNzTmFtZSk7CiAgfSwKCiAgYWRkQ2xhc3NOYW1lOiBm dW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsKICAgIGlmICghKGVsZW1lbnQg PSAkKGVsZW1lbnQpKSkgcmV0dXJuOwogICAgcmV0dXJuIEVsZW1lbnQuY2xhc3NO YW1lcyhlbGVtZW50KS5hZGQoY2xhc3NOYW1lKTsKICB9LAoKICByZW1vdmVDbGFz c05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgewogICAgaWYgKCEo ZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47CiAgICByZXR1cm4gRWxlbWVu dC5jbGFzc05hbWVzKGVsZW1lbnQpLnJlbW92ZShjbGFzc05hbWUpOwogIH0sCgog IC8vIHJlbW92ZXMgd2hpdGVzcGFjZS1vbmx5IHRleHQgbm9kZSBjaGlsZHJlbgog IGNsZWFuV2hpdGVzcGFjZTogZnVuY3Rpb24oZWxlbWVudCkgewogICAgZWxlbWVu dCA9ICQoZWxlbWVudCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnQu Y2hpbGROb2Rlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgbm9kZSA9IGVsZW1l bnQuY2hpbGROb2Rlc1tpXTsKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAm JiAhL1xTLy50ZXN0KG5vZGUubm9kZVZhbHVlKSkKICAgICAgICBFbGVtZW50LnJl bW92ZShub2RlKTsKICAgIH0KICB9LAoKICBlbXB0eTogZnVuY3Rpb24oZWxlbWVu dCkgewogICAgcmV0dXJuICQoZWxlbWVudCkuaW5uZXJIVE1MLm1hdGNoKC9eXHMq JC8pOwogIH0sCgogIHNjcm9sbFRvOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBl bGVtZW50ID0gJChlbGVtZW50KTsKICAgIHZhciB4ID0gZWxlbWVudC54ID8gZWxl bWVudC54IDogZWxlbWVudC5vZmZzZXRMZWZ0LAogICAgICAgIHkgPSBlbGVtZW50 LnkgPyBlbGVtZW50LnkgOiBlbGVtZW50Lm9mZnNldFRvcDsKICAgIHdpbmRvdy5z Y3JvbGxUbyh4LCB5KTsKICB9LAoKICBnZXRTdHlsZTogZnVuY3Rpb24oZWxlbWVu dCwgc3R5bGUpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgdmFyIHZh bHVlID0gZWxlbWVudC5zdHlsZVtzdHlsZS5jYW1lbGl6ZSgpXTsKICAgIGlmICgh dmFsdWUpIHsKICAgICAgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIGRvY3Vt ZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUpIHsKICAgICAgICB2YXIg Y3NzID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVt ZW50LCBudWxsKTsKICAgICAgICB2YWx1ZSA9IGNzcyA/IGNzcy5nZXRQcm9wZXJ0 eVZhbHVlKHN0eWxlKSA6IG51bGw7CiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5j dXJyZW50U3R5bGUpIHsKICAgICAgICB2YWx1ZSA9IGVsZW1lbnQuY3VycmVudFN0 eWxlW3N0eWxlLmNhbWVsaXplKCldOwogICAgICB9CiAgICB9CgogICAgaWYgKHdp bmRvdy5vcGVyYSAmJiBbJ2xlZnQnLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbSdd LmluY2x1ZGUoc3R5bGUpKQogICAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVt ZW50LCAncG9zaXRpb24nKSA9PSAnc3RhdGljJykgdmFsdWUgPSAnYXV0byc7Cgog ICAgcmV0dXJuIHZhbHVlID09ICdhdXRvJyA/IG51bGwgOiB2YWx1ZTsKICB9LAoK ICBzZXRTdHlsZTogZnVuY3Rpb24oZWxlbWVudCwgc3R5bGUpIHsKICAgIGVsZW1l bnQgPSAkKGVsZW1lbnQpOwogICAgZm9yIChuYW1lIGluIHN0eWxlKQogICAgICBl bGVtZW50LnN0eWxlW25hbWUuY2FtZWxpemUoKV0gPSBzdHlsZVtuYW1lXTsKICB9 LAoKICBnZXREaW1lbnNpb25zOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBlbGVt ZW50ID0gJChlbGVtZW50KTsKICAgIGlmIChFbGVtZW50LmdldFN0eWxlKGVsZW1l bnQsICdkaXNwbGF5JykgIT0gJ25vbmUnKQogICAgICByZXR1cm4ge3dpZHRoOiBl bGVtZW50Lm9mZnNldFdpZHRoLCBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0 fTsKCiAgICAvLyBBbGwgKldpZHRoIGFuZCAqSGVpZ2h0IHByb3BlcnRpZXMgZ2l2 ZSAwIG9uIGVsZW1lbnRzIHdpdGggZGlzcGxheSBub25lLAogICAgLy8gc28gZW5h YmxlIHRoZSBlbGVtZW50IHRlbXBvcmFyaWx5CiAgICB2YXIgZWxzID0gZWxlbWVu dC5zdHlsZTsKICAgIHZhciBvcmlnaW5hbFZpc2liaWxpdHkgPSBlbHMudmlzaWJp bGl0eTsKICAgIHZhciBvcmlnaW5hbFBvc2l0aW9uID0gZWxzLnBvc2l0aW9uOwog ICAgZWxzLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKICAgIGVscy5wb3NpdGlvbiA9 ICdhYnNvbHV0ZSc7CiAgICBlbHMuZGlzcGxheSA9ICcnOwogICAgdmFyIG9yaWdp bmFsV2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoOwogICAgdmFyIG9yaWdpbmFs SGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7CiAgICBlbHMuZGlzcGxheSA9 ICdub25lJzsKICAgIGVscy5wb3NpdGlvbiA9IG9yaWdpbmFsUG9zaXRpb247CiAg ICBlbHMudmlzaWJpbGl0eSA9IG9yaWdpbmFsVmlzaWJpbGl0eTsKICAgIHJldHVy biB7d2lkdGg6IG9yaWdpbmFsV2lkdGgsIGhlaWdodDogb3JpZ2luYWxIZWlnaHR9 OwogIH0sCgogIG1ha2VQb3NpdGlvbmVkOiBmdW5jdGlvbihlbGVtZW50KSB7CiAg ICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIHZhciBwb3MgPSBFbGVtZW50Lmdl dFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpOwogICAgaWYgKHBvcyA9PSAnc3Rh dGljJyB8fCAhcG9zKSB7CiAgICAgIGVsZW1lbnQuX21hZGVQb3NpdGlvbmVkID0g dHJ1ZTsKICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7 CiAgICAgIC8vIE9wZXJhIHJldHVybnMgdGhlIG9mZnNldCByZWxhdGl2ZSB0byB0 aGUgcG9zaXRpb25pbmcgY29udGV4dCwgd2hlbiBhbgogICAgICAvLyBlbGVtZW50 IGlzIHBvc2l0aW9uIHJlbGF0aXZlIGJ1dCB0b3AgYW5kIGxlZnQgaGF2ZSBub3Qg YmVlbiBkZWZpbmVkCiAgICAgIGlmICh3aW5kb3cub3BlcmEpIHsKICAgICAgICBl bGVtZW50LnN0eWxlLnRvcCA9IDA7CiAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0 ID0gMDsKICAgICAgfQogICAgfQogIH0sCgogIHVuZG9Qb3NpdGlvbmVkOiBmdW5j dGlvbihlbGVtZW50KSB7CiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKICAgIGlm IChlbGVtZW50Ll9tYWRlUG9zaXRpb25lZCkgewogICAgICBlbGVtZW50Ll9tYWRl UG9zaXRpb25lZCA9IHVuZGVmaW5lZDsKICAgICAgZWxlbWVudC5zdHlsZS5wb3Np dGlvbiA9CiAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPQogICAgICAgIGVsZW1l bnQuc3R5bGUubGVmdCA9CiAgICAgICAgZWxlbWVudC5zdHlsZS5ib3R0b20gPQog ICAgICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAnJzsKICAgIH0KICB9LAoKICBt YWtlQ2xpcHBpbmc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIGVsZW1lbnQgPSAk KGVsZW1lbnQpOwogICAgaWYgKGVsZW1lbnQuX292ZXJmbG93KSByZXR1cm47CiAg ICBlbGVtZW50Ll9vdmVyZmxvdyA9IGVsZW1lbnQuc3R5bGUub3ZlcmZsb3c7CiAg ICBpZiAoKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ292ZXJmbG93JykgfHwg J3Zpc2libGUnKSAhPSAnaGlkZGVuJykKICAgICAgZWxlbWVudC5zdHlsZS5vdmVy ZmxvdyA9ICdoaWRkZW4nOwogIH0sCgogIHVuZG9DbGlwcGluZzogZnVuY3Rpb24o ZWxlbWVudCkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBpZiAoZWxl bWVudC5fb3ZlcmZsb3cpIHJldHVybjsKICAgIGVsZW1lbnQuc3R5bGUub3ZlcmZs b3cgPSBlbGVtZW50Ll9vdmVyZmxvdzsKICAgIGVsZW1lbnQuX292ZXJmbG93ID0g dW5kZWZpbmVkOwogIH0KfSk7Cgp2YXIgVG9nZ2xlID0gbmV3IE9iamVjdCgpOwpU b2dnbGUuZGlzcGxheSA9IEVsZW1lbnQudG9nZ2xlOwoKLyotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLSovCgpBYnN0cmFjdC5JbnNlcnRpb24gPSBmdW5jdGlvbihh ZGphY2VuY3kpIHsKICB0aGlzLmFkamFjZW5jeSA9IGFkamFjZW5jeTsKfQoKQWJz dHJhY3QuSW5zZXJ0aW9uLnByb3RvdHlwZSA9IHsKICBpbml0aWFsaXplOiBmdW5j dGlvbihlbGVtZW50LCBjb250ZW50KSB7CiAgICB0aGlzLmVsZW1lbnQgPSAkKGVs ZW1lbnQpOwogICAgdGhpcy5jb250ZW50ID0gY29udGVudC5zdHJpcFNjcmlwdHMo KTsKCiAgICBpZiAodGhpcy5hZGphY2VuY3kgJiYgdGhpcy5lbGVtZW50Lmluc2Vy dEFkamFjZW50SFRNTCkgewogICAgICB0cnkgewogICAgICAgIHRoaXMuZWxlbWVu dC5pbnNlcnRBZGphY2VudEhUTUwodGhpcy5hZGphY2VuY3ksIHRoaXMuY29udGVu dCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAodGhpcy5lbGVtZW50 LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAndGJvZHknKSB7CiAgICAgICAgICB0 aGlzLmluc2VydENvbnRlbnQodGhpcy5jb250ZW50RnJvbUFub255bW91c1RhYmxl KCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAg IH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5yYW5nZSA9IHRoaXMu ZWxlbWVudC5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgIGlmICh0 aGlzLmluaXRpYWxpemVSYW5nZSkgdGhpcy5pbml0aWFsaXplUmFuZ2UoKTsKICAg ICAgdGhpcy5pbnNlcnRDb250ZW50KFt0aGlzLnJhbmdlLmNyZWF0ZUNvbnRleHR1 YWxGcmFnbWVudCh0aGlzLmNvbnRlbnQpXSk7CiAgICB9CgogICAgc2V0VGltZW91 dChmdW5jdGlvbigpIHtjb250ZW50LmV2YWxTY3JpcHRzKCl9LCAxMCk7CiAgfSwK CiAgY29udGVudEZyb21Bbm9ueW1vdXNUYWJsZTogZnVuY3Rpb24oKSB7CiAgICB2 YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkaXYu aW5uZXJIVE1MID0gJzx0YWJsZT48dGJvZHk+JyArIHRoaXMuY29udGVudCArICc8 L3Rib2R5PjwvdGFibGU+JzsKICAgIHJldHVybiAkQShkaXYuY2hpbGROb2Rlc1sw XS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMpOwogIH0KfQoKdmFyIEluc2VydGlv biA9IG5ldyBPYmplY3QoKTsKCkluc2VydGlvbi5CZWZvcmUgPSBDbGFzcy5jcmVh dGUoKTsKSW5zZXJ0aW9uLkJlZm9yZS5wcm90b3R5cGUgPSBPYmplY3QuZXh0ZW5k KG5ldyBBYnN0cmFjdC5JbnNlcnRpb24oJ2JlZm9yZUJlZ2luJyksIHsKICBpbml0 aWFsaXplUmFuZ2U6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yYW5nZS5zZXRTdGFy dEJlZm9yZSh0aGlzLmVsZW1lbnQpOwogIH0sCgogIGluc2VydENvbnRlbnQ6IGZ1 bmN0aW9uKGZyYWdtZW50cykgewogICAgZnJhZ21lbnRzLmVhY2goKGZ1bmN0aW9u KGZyYWdtZW50KSB7CiAgICAgIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLmluc2Vy dEJlZm9yZShmcmFnbWVudCwgdGhpcy5lbGVtZW50KTsKICAgIH0pLmJpbmQodGhp cykpOwogIH0KfSk7CgpJbnNlcnRpb24uVG9wID0gQ2xhc3MuY3JlYXRlKCk7Cklu c2VydGlvbi5Ub3AucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJh Y3QuSW5zZXJ0aW9uKCdhZnRlckJlZ2luJyksIHsKICBpbml0aWFsaXplUmFuZ2U6 IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yYW5nZS5zZWxlY3ROb2RlQ29udGVudHMo dGhpcy5lbGVtZW50KTsKICAgIHRoaXMucmFuZ2UuY29sbGFwc2UodHJ1ZSk7CiAg fSwKCiAgaW5zZXJ0Q29udGVudDogZnVuY3Rpb24oZnJhZ21lbnRzKSB7CiAgICBm cmFnbWVudHMucmV2ZXJzZShmYWxzZSkuZWFjaCgoZnVuY3Rpb24oZnJhZ21lbnQp IHsKICAgICAgdGhpcy5lbGVtZW50Lmluc2VydEJlZm9yZShmcmFnbWVudCwgdGhp cy5lbGVtZW50LmZpcnN0Q2hpbGQpOwogICAgfSkuYmluZCh0aGlzKSk7CiAgfQp9 KTsKCkluc2VydGlvbi5Cb3R0b20gPSBDbGFzcy5jcmVhdGUoKTsKSW5zZXJ0aW9u LkJvdHRvbS5wcm90b3R5cGUgPSBPYmplY3QuZXh0ZW5kKG5ldyBBYnN0cmFjdC5J bnNlcnRpb24oJ2JlZm9yZUVuZCcpLCB7CiAgaW5pdGlhbGl6ZVJhbmdlOiBmdW5j dGlvbigpIHsKICAgIHRoaXMucmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRoaXMu ZWxlbWVudCk7CiAgICB0aGlzLnJhbmdlLmNvbGxhcHNlKHRoaXMuZWxlbWVudCk7 CiAgfSwKCiAgaW5zZXJ0Q29udGVudDogZnVuY3Rpb24oZnJhZ21lbnRzKSB7CiAg ICBmcmFnbWVudHMuZWFjaCgoZnVuY3Rpb24oZnJhZ21lbnQpIHsKICAgICAgdGhp cy5lbGVtZW50LmFwcGVuZENoaWxkKGZyYWdtZW50KTsKICAgIH0pLmJpbmQodGhp cykpOwogIH0KfSk7CgpJbnNlcnRpb24uQWZ0ZXIgPSBDbGFzcy5jcmVhdGUoKTsK SW5zZXJ0aW9uLkFmdGVyLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQobmV3IEFi c3RyYWN0Lkluc2VydGlvbignYWZ0ZXJFbmQnKSwgewogIGluaXRpYWxpemVSYW5n ZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJhbmdlLnNldFN0YXJ0QWZ0ZXIodGhp cy5lbGVtZW50KTsKICB9LAoKICBpbnNlcnRDb250ZW50OiBmdW5jdGlvbihmcmFn bWVudHMpIHsKICAgIGZyYWdtZW50cy5lYWNoKChmdW5jdGlvbihmcmFnbWVudCkg ewogICAgICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZnJh Z21lbnQsCiAgICAgICAgdGhpcy5lbGVtZW50Lm5leHRTaWJsaW5nKTsKICAgIH0p LmJpbmQodGhpcykpOwogIH0KfSk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tKi8KCkVsZW1lbnQuQ2xhc3NOYW1lcyA9IENsYXNzLmNyZWF0ZSgpOwpFbGVt ZW50LkNsYXNzTmFtZXMucHJvdG90eXBlID0gewogIGluaXRpYWxpemU6IGZ1bmN0 aW9uKGVsZW1lbnQpIHsKICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7CiAg fSwKCiAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CiAgICB0aGlzLmVsZW1l bnQuY2xhc3NOYW1lLnNwbGl0KC9ccysvKS5zZWxlY3QoZnVuY3Rpb24obmFtZSkg ewogICAgICByZXR1cm4gbmFtZS5sZW5ndGggPiAwOwogICAgfSkuX2VhY2goaXRl cmF0b3IpOwogIH0sCgogIHNldDogZnVuY3Rpb24oY2xhc3NOYW1lKSB7CiAgICB0 aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwogIH0sCgogIGFkZDog ZnVuY3Rpb24oY2xhc3NOYW1lVG9BZGQpIHsKICAgIGlmICh0aGlzLmluY2x1ZGUo Y2xhc3NOYW1lVG9BZGQpKSByZXR1cm47CiAgICB0aGlzLnNldCh0aGlzLnRvQXJy YXkoKS5jb25jYXQoY2xhc3NOYW1lVG9BZGQpLmpvaW4oJyAnKSk7CiAgfSwKCiAg cmVtb3ZlOiBmdW5jdGlvbihjbGFzc05hbWVUb1JlbW92ZSkgewogICAgaWYgKCF0 aGlzLmluY2x1ZGUoY2xhc3NOYW1lVG9SZW1vdmUpKSByZXR1cm47CiAgICB0aGlz LnNldCh0aGlzLnNlbGVjdChmdW5jdGlvbihjbGFzc05hbWUpIHsKICAgICAgcmV0 dXJuIGNsYXNzTmFtZSAhPSBjbGFzc05hbWVUb1JlbW92ZTsKICAgIH0pLmpvaW4o JyAnKSk7CiAgfSwKCiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJu IHRoaXMudG9BcnJheSgpLmpvaW4oJyAnKTsKICB9Cn0KCk9iamVjdC5leHRlbmQo RWxlbWVudC5DbGFzc05hbWVzLnByb3RvdHlwZSwgRW51bWVyYWJsZSk7CnZhciBG aWVsZCA9IHsKICBjbGVhcjogZnVuY3Rpb24oKSB7CiAgICBmb3IgKHZhciBpID0g MDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykKICAgICAgJChhcmd1bWVudHNb aV0pLnZhbHVlID0gJyc7CiAgfSwKCiAgZm9jdXM6IGZ1bmN0aW9uKGVsZW1lbnQp IHsKICAgICQoZWxlbWVudCkuZm9jdXMoKTsKICB9LAoKICBwcmVzZW50OiBmdW5j dGlvbigpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0 aDsgaSsrKQogICAgICBpZiAoJChhcmd1bWVudHNbaV0pLnZhbHVlID09ICcnKSBy ZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICBzZWxlY3Q6IGZ1 bmN0aW9uKGVsZW1lbnQpIHsKICAgICQoZWxlbWVudCkuc2VsZWN0KCk7CiAgfSwK CiAgYWN0aXZhdGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIGVsZW1lbnQgPSAk KGVsZW1lbnQpOwogICAgZWxlbWVudC5mb2N1cygpOwogICAgaWYgKGVsZW1lbnQu c2VsZWN0KQogICAgICBlbGVtZW50LnNlbGVjdCgpOwogIH0KfQoKLyotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgRm9ybSA9IHsKICBzZXJpYWxpemU6 IGZ1bmN0aW9uKGZvcm0pIHsKICAgIHZhciBlbGVtZW50cyA9IEZvcm0uZ2V0RWxl bWVudHMoJChmb3JtKSk7CiAgICB2YXIgcXVlcnlDb21wb25lbnRzID0gbmV3IEFy cmF5KCk7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7 IGkrKykgewogICAgICB2YXIgcXVlcnlDb21wb25lbnQgPSBGb3JtLkVsZW1lbnQu c2VyaWFsaXplKGVsZW1lbnRzW2ldKTsKICAgICAgaWYgKHF1ZXJ5Q29tcG9uZW50 KQogICAgICAgIHF1ZXJ5Q29tcG9uZW50cy5wdXNoKHF1ZXJ5Q29tcG9uZW50KTsK ICAgIH0KCiAgICByZXR1cm4gcXVlcnlDb21wb25lbnRzLmpvaW4oJyYnKTsKICB9 LAoKICBnZXRFbGVtZW50czogZnVuY3Rpb24oZm9ybSkgewogICAgZm9ybSA9ICQo Zm9ybSk7CiAgICB2YXIgZWxlbWVudHMgPSBuZXcgQXJyYXkoKTsKCiAgICBmb3Ig KHRhZ05hbWUgaW4gRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzKSB7CiAgICAgIHZh ciB0YWdFbGVtZW50cyA9IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFt ZSk7CiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGFnRWxlbWVudHMubGVuZ3Ro OyBqKyspCiAgICAgICAgZWxlbWVudHMucHVzaCh0YWdFbGVtZW50c1tqXSk7CiAg ICB9CiAgICByZXR1cm4gZWxlbWVudHM7CiAgfSwKCiAgZ2V0SW5wdXRzOiBmdW5j dGlvbihmb3JtLCB0eXBlTmFtZSwgbmFtZSkgewogICAgZm9ybSA9ICQoZm9ybSk7 CiAgICB2YXIgaW5wdXRzID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5w dXQnKTsKCiAgICBpZiAoIXR5cGVOYW1lICYmICFuYW1lKQogICAgICByZXR1cm4g aW5wdXRzOwoKICAgIHZhciBtYXRjaGluZ0lucHV0cyA9IG5ldyBBcnJheSgpOwog ICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHsKICAg ICAgdmFyIGlucHV0ID0gaW5wdXRzW2ldOwogICAgICBpZiAoKHR5cGVOYW1lICYm IGlucHV0LnR5cGUgIT0gdHlwZU5hbWUpIHx8CiAgICAgICAgICAobmFtZSAmJiBp bnB1dC5uYW1lICE9IG5hbWUpKQogICAgICAgIGNvbnRpbnVlOwogICAgICBtYXRj aGluZ0lucHV0cy5wdXNoKGlucHV0KTsKICAgIH0KCiAgICByZXR1cm4gbWF0Y2hp bmdJbnB1dHM7CiAgfSwKCiAgZGlzYWJsZTogZnVuY3Rpb24oZm9ybSkgewogICAg dmFyIGVsZW1lbnRzID0gRm9ybS5nZXRFbGVtZW50cyhmb3JtKTsKICAgIGZvciAo dmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFy IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKICAgICAgZWxlbWVudC5ibHVyKCk7CiAg ICAgIGVsZW1lbnQuZGlzYWJsZWQgPSAndHJ1ZSc7CiAgICB9CiAgfSwKCiAgZW5h YmxlOiBmdW5jdGlvbihmb3JtKSB7CiAgICB2YXIgZWxlbWVudHMgPSBGb3JtLmdl dEVsZW1lbnRzKGZvcm0pOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50 cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ld OwogICAgICBlbGVtZW50LmRpc2FibGVkID0gJyc7CiAgICB9CiAgfSwKCiAgZmlu ZEZpcnN0RWxlbWVudDogZnVuY3Rpb24oZm9ybSkgewogICAgcmV0dXJuIEZvcm0u Z2V0RWxlbWVudHMoZm9ybSkuZmluZChmdW5jdGlvbihlbGVtZW50KSB7CiAgICAg IHJldHVybiBlbGVtZW50LnR5cGUgIT0gJ2hpZGRlbicgJiYgIWVsZW1lbnQuZGlz YWJsZWQgJiYKICAgICAgICBbJ2lucHV0JywgJ3NlbGVjdCcsICd0ZXh0YXJlYSdd LmluY2x1ZGUoZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpOwogICAgfSk7 CiAgfSwKCiAgZm9jdXNGaXJzdEVsZW1lbnQ6IGZ1bmN0aW9uKGZvcm0pIHsKICAg IEZpZWxkLmFjdGl2YXRlKEZvcm0uZmluZEZpcnN0RWxlbWVudChmb3JtKSk7CiAg fSwKCiAgcmVzZXQ6IGZ1bmN0aW9uKGZvcm0pIHsKICAgICQoZm9ybSkucmVzZXQo KTsKICB9Cn0KCkZvcm0uRWxlbWVudCA9IHsKICBzZXJpYWxpemU6IGZ1bmN0aW9u KGVsZW1lbnQpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgdmFyIG1l dGhvZCA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgdmFyIHBh cmFtZXRlciA9IEZvcm0uRWxlbWVudC5TZXJpYWxpemVyc1ttZXRob2RdKGVsZW1l bnQpOwoKICAgIGlmIChwYXJhbWV0ZXIpIHsKICAgICAgdmFyIGtleSA9IGVuY29k ZVVSSUNvbXBvbmVudChwYXJhbWV0ZXJbMF0pOwogICAgICBpZiAoa2V5Lmxlbmd0 aCA9PSAwKSByZXR1cm47CgogICAgICBpZiAocGFyYW1ldGVyWzFdLmNvbnN0cnVj dG9yICE9IEFycmF5KQogICAgICAgIHBhcmFtZXRlclsxXSA9IFtwYXJhbWV0ZXJb MV1dOwoKICAgICAgcmV0dXJuIHBhcmFtZXRlclsxXS5tYXAoZnVuY3Rpb24odmFs dWUpIHsKICAgICAgICByZXR1cm4ga2V5ICsgJz0nICsgZW5jb2RlVVJJQ29tcG9u ZW50KHZhbHVlKTsKICAgICAgfSkuam9pbignJicpOwogICAgfQogIH0sCgogIGdl dFZhbHVlOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBlbGVtZW50ID0gJChlbGVt ZW50KTsKICAgIHZhciBtZXRob2QgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNh c2UoKTsKICAgIHZhciBwYXJhbWV0ZXIgPSBGb3JtLkVsZW1lbnQuU2VyaWFsaXpl cnNbbWV0aG9kXShlbGVtZW50KTsKCiAgICBpZiAocGFyYW1ldGVyKQogICAgICBy ZXR1cm4gcGFyYW1ldGVyWzFdOwogIH0KfQoKRm9ybS5FbGVtZW50LlNlcmlhbGl6 ZXJzID0gewogIGlucHV0OiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICBzd2l0Y2gg KGVsZW1lbnQudHlwZS50b0xvd2VyQ2FzZSgpKSB7CiAgICAgIGNhc2UgJ3N1Ym1p dCc6CiAgICAgIGNhc2UgJ2hpZGRlbic6CiAgICAgIGNhc2UgJ3Bhc3N3b3JkJzoK ICAgICAgY2FzZSAndGV4dCc6CiAgICAgICAgcmV0dXJuIEZvcm0uRWxlbWVudC5T ZXJpYWxpemVycy50ZXh0YXJlYShlbGVtZW50KTsKICAgICAgY2FzZSAnY2hlY2ti b3gnOgogICAgICBjYXNlICdyYWRpbyc6CiAgICAgICAgcmV0dXJuIEZvcm0uRWxl bWVudC5TZXJpYWxpemVycy5pbnB1dFNlbGVjdG9yKGVsZW1lbnQpOwogICAgfQog ICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIGlucHV0U2VsZWN0b3I6IGZ1bmN0aW9u KGVsZW1lbnQpIHsKICAgIGlmIChlbGVtZW50LmNoZWNrZWQpCiAgICAgIHJldHVy biBbZWxlbWVudC5uYW1lLCBlbGVtZW50LnZhbHVlXTsKICB9LAoKICB0ZXh0YXJl YTogZnVuY3Rpb24oZWxlbWVudCkgewogICAgcmV0dXJuIFtlbGVtZW50Lm5hbWUs IGVsZW1lbnQudmFsdWVdOwogIH0sCgogIHNlbGVjdDogZnVuY3Rpb24oZWxlbWVu dCkgewogICAgcmV0dXJuIEZvcm0uRWxlbWVudC5TZXJpYWxpemVyc1tlbGVtZW50 LnR5cGUgPT0gJ3NlbGVjdC1vbmUnID8KICAgICAgJ3NlbGVjdE9uZScgOiAnc2Vs ZWN0TWFueSddKGVsZW1lbnQpOwogIH0sCgogIHNlbGVjdE9uZTogZnVuY3Rpb24o ZWxlbWVudCkgewogICAgdmFyIHZhbHVlID0gJycsIG9wdCwgaW5kZXggPSBlbGVt ZW50LnNlbGVjdGVkSW5kZXg7CiAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICBv cHQgPSBlbGVtZW50Lm9wdGlvbnNbaW5kZXhdOwogICAgICB2YWx1ZSA9IG9wdC52 YWx1ZTsKICAgICAgaWYgKCF2YWx1ZSAmJiAhKCd2YWx1ZScgaW4gb3B0KSkKICAg ICAgICB2YWx1ZSA9IG9wdC50ZXh0OwogICAgfQogICAgcmV0dXJuIFtlbGVtZW50 Lm5hbWUsIHZhbHVlXTsKICB9LAoKICBzZWxlY3RNYW55OiBmdW5jdGlvbihlbGVt ZW50KSB7CiAgICB2YXIgdmFsdWUgPSBuZXcgQXJyYXkoKTsKICAgIGZvciAodmFy IGkgPSAwOyBpIDwgZWxlbWVudC5sZW5ndGg7IGkrKykgewogICAgICB2YXIgb3B0 ID0gZWxlbWVudC5vcHRpb25zW2ldOwogICAgICBpZiAob3B0LnNlbGVjdGVkKSB7 CiAgICAgICAgdmFyIG9wdFZhbHVlID0gb3B0LnZhbHVlOwogICAgICAgIGlmICgh b3B0VmFsdWUgJiYgISgndmFsdWUnIGluIG9wdCkpCiAgICAgICAgICBvcHRWYWx1 ZSA9IG9wdC50ZXh0OwogICAgICAgIHZhbHVlLnB1c2gob3B0VmFsdWUpOwogICAg ICB9CiAgICB9CiAgICByZXR1cm4gW2VsZW1lbnQubmFtZSwgdmFsdWVdOwogIH0K fQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgJEYgPSBGb3Jt LkVsZW1lbnQuZ2V0VmFsdWU7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Ki8KCkFic3RyYWN0LlRpbWVkT2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHt9CkFic3Ry YWN0LlRpbWVkT2JzZXJ2ZXIucHJvdG90eXBlID0gewogIGluaXRpYWxpemU6IGZ1 bmN0aW9uKGVsZW1lbnQsIGZyZXF1ZW5jeSwgY2FsbGJhY2spIHsKICAgIHRoaXMu ZnJlcXVlbmN5ID0gZnJlcXVlbmN5OwogICAgdGhpcy5lbGVtZW50ICAgPSAkKGVs ZW1lbnQpOwogICAgdGhpcy5jYWxsYmFjayAgPSBjYWxsYmFjazsKCiAgICB0aGlz Lmxhc3RWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgIHRoaXMucmVnaXN0ZXJD YWxsYmFjaygpOwogIH0sCgogIHJlZ2lzdGVyQ2FsbGJhY2s6IGZ1bmN0aW9uKCkg ewogICAgc2V0SW50ZXJ2YWwodGhpcy5vblRpbWVyRXZlbnQuYmluZCh0aGlzKSwg dGhpcy5mcmVxdWVuY3kgKiAxMDAwKTsKICB9LAoKICBvblRpbWVyRXZlbnQ6IGZ1 bmN0aW9uKCkgewogICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwogICAg aWYgKHRoaXMubGFzdFZhbHVlICE9IHZhbHVlKSB7CiAgICAgIHRoaXMuY2FsbGJh Y2sodGhpcy5lbGVtZW50LCB2YWx1ZSk7CiAgICAgIHRoaXMubGFzdFZhbHVlID0g dmFsdWU7CiAgICB9CiAgfQp9CgpGb3JtLkVsZW1lbnQuT2JzZXJ2ZXIgPSBDbGFz cy5jcmVhdGUoKTsKRm9ybS5FbGVtZW50Lk9ic2VydmVyLnByb3RvdHlwZSA9IE9i amVjdC5leHRlbmQobmV3IEFic3RyYWN0LlRpbWVkT2JzZXJ2ZXIoKSwgewogIGdl dFZhbHVlOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBGb3JtLkVsZW1lbnQuZ2V0 VmFsdWUodGhpcy5lbGVtZW50KTsKICB9Cn0pOwoKRm9ybS5PYnNlcnZlciA9IENs YXNzLmNyZWF0ZSgpOwpGb3JtLk9ic2VydmVyLnByb3RvdHlwZSA9IE9iamVjdC5l eHRlbmQobmV3IEFic3RyYWN0LlRpbWVkT2JzZXJ2ZXIoKSwgewogIGdldFZhbHVl OiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBGb3JtLnNlcmlhbGl6ZSh0aGlzLmVs ZW1lbnQpOwogIH0KfSk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8K CkFic3RyYWN0LkV2ZW50T2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHt9CkFic3RyYWN0 LkV2ZW50T2JzZXJ2ZXIucHJvdG90eXBlID0gewogIGluaXRpYWxpemU6IGZ1bmN0 aW9uKGVsZW1lbnQsIGNhbGxiYWNrKSB7CiAgICB0aGlzLmVsZW1lbnQgID0gJChl bGVtZW50KTsKICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKCiAgICB0aGlz Lmxhc3RWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKICAgIGlmICh0aGlzLmVsZW1l bnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICdmb3JtJykKICAgICAgdGhpcy5y ZWdpc3RlckZvcm1DYWxsYmFja3MoKTsKICAgIGVsc2UKICAgICAgdGhpcy5yZWdp c3RlckNhbGxiYWNrKHRoaXMuZWxlbWVudCk7CiAgfSwKCiAgb25FbGVtZW50RXZl bnQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgp OwogICAgaWYgKHRoaXMubGFzdFZhbHVlICE9IHZhbHVlKSB7CiAgICAgIHRoaXMu Y2FsbGJhY2sodGhpcy5lbGVtZW50LCB2YWx1ZSk7CiAgICAgIHRoaXMubGFzdFZh bHVlID0gdmFsdWU7CiAgICB9CiAgfSwKCiAgcmVnaXN0ZXJGb3JtQ2FsbGJhY2tz OiBmdW5jdGlvbigpIHsKICAgIHZhciBlbGVtZW50cyA9IEZvcm0uZ2V0RWxlbWVu dHModGhpcy5lbGVtZW50KTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVu dHMubGVuZ3RoOyBpKyspCiAgICAgIHRoaXMucmVnaXN0ZXJDYWxsYmFjayhlbGVt ZW50c1tpXSk7CiAgfSwKCiAgcmVnaXN0ZXJDYWxsYmFjazogZnVuY3Rpb24oZWxl bWVudCkgewogICAgaWYgKGVsZW1lbnQudHlwZSkgewogICAgICBzd2l0Y2ggKGVs ZW1lbnQudHlwZS50b0xvd2VyQ2FzZSgpKSB7CiAgICAgICAgY2FzZSAnY2hlY2ti b3gnOgogICAgICAgIGNhc2UgJ3JhZGlvJzoKICAgICAgICAgIEV2ZW50Lm9ic2Vy dmUoZWxlbWVudCwgJ2NsaWNrJywgdGhpcy5vbkVsZW1lbnRFdmVudC5iaW5kKHRo aXMpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3Bhc3N3b3JkJzoK ICAgICAgICBjYXNlICd0ZXh0JzoKICAgICAgICBjYXNlICd0ZXh0YXJlYSc6CiAg ICAgICAgY2FzZSAnc2VsZWN0LW9uZSc6CiAgICAgICAgY2FzZSAnc2VsZWN0LW11 bHRpcGxlJzoKICAgICAgICAgIEV2ZW50Lm9ic2VydmUoZWxlbWVudCwgJ2NoYW5n ZScsIHRoaXMub25FbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7CiAgICAgICAgICBi cmVhazsKICAgICAgfQogICAgfQogIH0KfQoKRm9ybS5FbGVtZW50LkV2ZW50T2Jz ZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoKTsKRm9ybS5FbGVtZW50LkV2ZW50T2JzZXJ2 ZXIucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuRXZlbnRP YnNlcnZlcigpLCB7CiAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJu IEZvcm0uRWxlbWVudC5nZXRWYWx1ZSh0aGlzLmVsZW1lbnQpOwogIH0KfSk7CgpG b3JtLkV2ZW50T2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoKTsKRm9ybS5FdmVudE9i c2VydmVyLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQobmV3IEFic3RyYWN0LkV2 ZW50T2JzZXJ2ZXIoKSwgewogIGdldFZhbHVlOiBmdW5jdGlvbigpIHsKICAgIHJl dHVybiBGb3JtLnNlcmlhbGl6ZSh0aGlzLmVsZW1lbnQpOwogIH0KfSk7CmlmICgh d2luZG93LkV2ZW50KSB7CiAgdmFyIEV2ZW50ID0gbmV3IE9iamVjdCgpOwp9CgpP YmplY3QuZXh0ZW5kKEV2ZW50LCB7CiAgS0VZX0JBQ0tTUEFDRTogOCwKICBLRVlf VEFCOiAgICAgICA5LAogIEtFWV9SRVRVUk46ICAgMTMsCiAgS0VZX0VTQzogICAg ICAyNywKICBLRVlfTEVGVDogICAgIDM3LAogIEtFWV9VUDogICAgICAgMzgsCiAg S0VZX1JJR0hUOiAgICAzOSwKICBLRVlfRE9XTjogICAgIDQwLAogIEtFWV9ERUxF VEU6ICAgNDYsCgogIGVsZW1lbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICByZXR1 cm4gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQ7CiAgfSwKCiAgaXNM ZWZ0Q2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICByZXR1cm4gKCgoZXZlbnQu d2hpY2gpICYmIChldmVudC53aGljaCA9PSAxKSkgfHwKICAgICAgICAgICAgKChl dmVudC5idXR0b24pICYmIChldmVudC5idXR0b24gPT0gMSkpKTsKICB9LAoKICBw b2ludGVyWDogZnVuY3Rpb24oZXZlbnQpIHsKICAgIHJldHVybiBldmVudC5wYWdl WCB8fCAoZXZlbnQuY2xpZW50WCArCiAgICAgIChkb2N1bWVudC5kb2N1bWVudEVs ZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpKTsK ICB9LAoKICBwb2ludGVyWTogZnVuY3Rpb24oZXZlbnQpIHsKICAgIHJldHVybiBl dmVudC5wYWdlWSB8fCAoZXZlbnQuY2xpZW50WSArCiAgICAgIChkb2N1bWVudC5k b2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xs VG9wKSk7CiAgfSwKCiAgc3RvcDogZnVuY3Rpb24oZXZlbnQpIHsKICAgIGlmIChl dmVudC5wcmV2ZW50RGVmYXVsdCkgewogICAgICBldmVudC5wcmV2ZW50RGVmYXVs dCgpOwogICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0gZWxzZSB7 CiAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgIGV2ZW50LmNh bmNlbEJ1YmJsZSA9IHRydWU7CiAgICB9CiAgfSwKCiAgLy8gZmluZCB0aGUgZmly c3Qgbm9kZSB3aXRoIHRoZSBnaXZlbiB0YWdOYW1lLCBzdGFydGluZyBmcm9tIHRo ZQogIC8vIG5vZGUgdGhlIGV2ZW50IHdhcyB0cmlnZ2VyZWQgb247IHRyYXZlcnNl cyB0aGUgRE9NIHVwd2FyZHMKICBmaW5kRWxlbWVudDogZnVuY3Rpb24oZXZlbnQs IHRhZ05hbWUpIHsKICAgIHZhciBlbGVtZW50ID0gRXZlbnQuZWxlbWVudChldmVu dCk7CiAgICB3aGlsZSAoZWxlbWVudC5wYXJlbnROb2RlICYmICghZWxlbWVudC50 YWdOYW1lIHx8CiAgICAgICAgKGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgp ICE9IHRhZ05hbWUudG9VcHBlckNhc2UoKSkpKQogICAgICBlbGVtZW50ID0gZWxl bWVudC5wYXJlbnROb2RlOwogICAgcmV0dXJuIGVsZW1lbnQ7CiAgfSwKCiAgb2Jz ZXJ2ZXJzOiBmYWxzZSwKCiAgX29ic2VydmVBbmRDYWNoZTogZnVuY3Rpb24oZWxl bWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpIHsKICAgIGlmICghdGhp cy5vYnNlcnZlcnMpIHRoaXMub2JzZXJ2ZXJzID0gW107CiAgICBpZiAoZWxlbWVu dC5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2go W2VsZW1lbnQsIG5hbWUsIG9ic2VydmVyLCB1c2VDYXB0dXJlXSk7CiAgICAgIGVs ZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBvYnNlcnZlciwgdXNlQ2FwdHVy ZSk7CiAgICB9IGVsc2UgaWYgKGVsZW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgICAg dGhpcy5vYnNlcnZlcnMucHVzaChbZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVz ZUNhcHR1cmVdKTsKICAgICAgZWxlbWVudC5hdHRhY2hFdmVudCgnb24nICsgbmFt ZSwgb2JzZXJ2ZXIpOwogICAgfQogIH0sCgogIHVubG9hZENhY2hlOiBmdW5jdGlv bigpIHsKICAgIGlmICghRXZlbnQub2JzZXJ2ZXJzKSByZXR1cm47CiAgICBmb3Ig KHZhciBpID0gMDsgaSA8IEV2ZW50Lm9ic2VydmVycy5sZW5ndGg7IGkrKykgewog ICAgICBFdmVudC5zdG9wT2JzZXJ2aW5nLmFwcGx5KHRoaXMsIEV2ZW50Lm9ic2Vy dmVyc1tpXSk7CiAgICAgIEV2ZW50Lm9ic2VydmVyc1tpXVswXSA9IG51bGw7CiAg ICB9CiAgICBFdmVudC5vYnNlcnZlcnMgPSBmYWxzZTsKICB9LAoKICBvYnNlcnZl OiBmdW5jdGlvbihlbGVtZW50LCBuYW1lLCBvYnNlcnZlciwgdXNlQ2FwdHVyZSkg ewogICAgdmFyIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgdXNlQ2FwdHVyZSA9 IHVzZUNhcHR1cmUgfHwgZmFsc2U7CgogICAgaWYgKG5hbWUgPT0gJ2tleXByZXNz JyAmJgogICAgICAgIChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvS29ucXVl cm9yfFNhZmFyaXxLSFRNTC8pCiAgICAgICAgfHwgZWxlbWVudC5hdHRhY2hFdmVu dCkpCiAgICAgIG5hbWUgPSAna2V5ZG93bic7CgogICAgdGhpcy5fb2JzZXJ2ZUFu ZENhY2hlKGVsZW1lbnQsIG5hbWUsIG9ic2VydmVyLCB1c2VDYXB0dXJlKTsKICB9 LAoKICBzdG9wT2JzZXJ2aW5nOiBmdW5jdGlvbihlbGVtZW50LCBuYW1lLCBvYnNl cnZlciwgdXNlQ2FwdHVyZSkgewogICAgdmFyIGVsZW1lbnQgPSAkKGVsZW1lbnQp OwogICAgdXNlQ2FwdHVyZSA9IHVzZUNhcHR1cmUgfHwgZmFsc2U7CgogICAgaWYg KG5hbWUgPT0gJ2tleXByZXNzJyAmJgogICAgICAgIChuYXZpZ2F0b3IuYXBwVmVy c2lvbi5tYXRjaCgvS29ucXVlcm9yfFNhZmFyaXxLSFRNTC8pCiAgICAgICAgfHwg ZWxlbWVudC5kZXRhY2hFdmVudCkpCiAgICAgIG5hbWUgPSAna2V5ZG93bic7Cgog ICAgaWYgKGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcikgewogICAgICBlbGVt ZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1 cmUpOwogICAgfSBlbHNlIGlmIChlbGVtZW50LmRldGFjaEV2ZW50KSB7CiAgICAg IGVsZW1lbnQuZGV0YWNoRXZlbnQoJ29uJyArIG5hbWUsIG9ic2VydmVyKTsKICAg IH0KICB9Cn0pOwoKLyogcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUgKi8KRXZl bnQub2JzZXJ2ZSh3aW5kb3csICd1bmxvYWQnLCBFdmVudC51bmxvYWRDYWNoZSwg ZmFsc2UpOwp2YXIgUG9zaXRpb24gPSB7CiAgLy8gc2V0IHRvIHRydWUgaWYgbmVl ZGVkLCB3YXJuaW5nOiBmaXJlZm94IHBlcmZvcm1hbmNlIHByb2JsZW1zCiAgLy8g Tk9UIG5lZWVkZWQgZm9yIHBhZ2Ugc2Nyb2xsaW5nLCBvbmx5IGlmIGRyYWdnYWJs ZSBjb250YWluZWQgaW4KICAvLyBzY3JvbGxhYmxlIGVsZW1lbnRzCiAgaW5jbHVk ZVNjcm9sbE9mZnNldHM6IGZhbHNlLAoKICAvLyBtdXN0IGJlIGNhbGxlZCBiZWZv cmUgY2FsbGluZyB3aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZzZXQsIGV2ZXJ5IHRp bWUgdGhlCiAgLy8gcGFnZSBpcyBzY3JvbGxlZAogIHByZXBhcmU6IGZ1bmN0aW9u KCkgewogICAgdGhpcy5kZWx0YVggPSAgd2luZG93LnBhZ2VYT2Zmc2V0CiAgICAg ICAgICAgICAgICB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVm dAogICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0CiAg ICAgICAgICAgICAgICB8fCAwOwogICAgdGhpcy5kZWx0YVkgPSAgd2luZG93LnBh Z2VZT2Zmc2V0CiAgICAgICAgICAgICAgICB8fCBkb2N1bWVudC5kb2N1bWVudEVs ZW1lbnQuc2Nyb2xsVG9wCiAgICAgICAgICAgICAgICB8fCBkb2N1bWVudC5ib2R5 LnNjcm9sbFRvcAogICAgICAgICAgICAgICAgfHwgMDsKICB9LAoKICByZWFsT2Zm c2V0OiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICB2YXIgdmFsdWVUID0gMCwgdmFs dWVMID0gMDsKICAgIGRvIHsKICAgICAgdmFsdWVUICs9IGVsZW1lbnQuc2Nyb2xs VG9wICB8fCAwOwogICAgICB2YWx1ZUwgKz0gZWxlbWVudC5zY3JvbGxMZWZ0IHx8 IDA7CiAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7CiAgICB9IHdo aWxlIChlbGVtZW50KTsKICAgIHJldHVybiBbdmFsdWVMLCB2YWx1ZVRdOwogIH0s CgogIGN1bXVsYXRpdmVPZmZzZXQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIHZh ciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOwogICAgZG8gewogICAgICB2YWx1ZVQg Kz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7CiAgICAgIHZhbHVlTCArPSBlbGVt ZW50Lm9mZnNldExlZnQgfHwgMDsKICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zm c2V0UGFyZW50OwogICAgfSB3aGlsZSAoZWxlbWVudCk7CiAgICByZXR1cm4gW3Zh bHVlTCwgdmFsdWVUXTsKICB9LAoKICBwb3NpdGlvbmVkT2Zmc2V0OiBmdW5jdGlv bihlbGVtZW50KSB7CiAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsKICAg IGRvIHsKICAgICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8fCAwOwog ICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7CiAgICAgIGVs ZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsKICAgICAgaWYgKGVsZW1lbnQp IHsKICAgICAgICBwID0gRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRp b24nKTsKICAgICAgICBpZiAocCA9PSAncmVsYXRpdmUnIHx8IHAgPT0gJ2Fic29s dXRlJykgYnJlYWs7CiAgICAgIH0KICAgIH0gd2hpbGUgKGVsZW1lbnQpOwogICAg cmV0dXJuIFt2YWx1ZUwsIHZhbHVlVF07CiAgfSwKCiAgb2Zmc2V0UGFyZW50OiBm dW5jdGlvbihlbGVtZW50KSB7CiAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQp IHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDsKICAgIGlmIChlbGVtZW50ID09 IGRvY3VtZW50LmJvZHkpIHJldHVybiBlbGVtZW50OwoKICAgIHdoaWxlICgoZWxl bWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkgJiYgZWxlbWVudCAhPSBkb2N1bWVu dC5ib2R5KQogICAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9z aXRpb24nKSAhPSAnc3RhdGljJykKICAgICAgICByZXR1cm4gZWxlbWVudDsKCiAg ICByZXR1cm4gZG9jdW1lbnQuYm9keTsKICB9LAoKICAvLyBjYWNoZXMgeC95IGNv b3JkaW5hdGUgcGFpciB0byB1c2Ugd2l0aCBvdmVybGFwCiAgd2l0aGluOiBmdW5j dGlvbihlbGVtZW50LCB4LCB5KSB7CiAgICBpZiAodGhpcy5pbmNsdWRlU2Nyb2xs T2Zmc2V0cykKICAgICAgcmV0dXJuIHRoaXMud2l0aGluSW5jbHVkaW5nU2Nyb2xs b2Zmc2V0cyhlbGVtZW50LCB4LCB5KTsKICAgIHRoaXMueGNvbXAgPSB4OwogICAg dGhpcy55Y29tcCA9IHk7CiAgICB0aGlzLm9mZnNldCA9IHRoaXMuY3VtdWxhdGl2 ZU9mZnNldChlbGVtZW50KTsKCiAgICByZXR1cm4gKHkgPj0gdGhpcy5vZmZzZXRb MV0gJiYKICAgICAgICAgICAgeSA8ICB0aGlzLm9mZnNldFsxXSArIGVsZW1lbnQu b2Zmc2V0SGVpZ2h0ICYmCiAgICAgICAgICAgIHggPj0gdGhpcy5vZmZzZXRbMF0g JiYKICAgICAgICAgICAgeCA8ICB0aGlzLm9mZnNldFswXSArIGVsZW1lbnQub2Zm c2V0V2lkdGgpOwogIH0sCgogIHdpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldHM6 IGZ1bmN0aW9uKGVsZW1lbnQsIHgsIHkpIHsKICAgIHZhciBvZmZzZXRjYWNoZSA9 IHRoaXMucmVhbE9mZnNldChlbGVtZW50KTsKCiAgICB0aGlzLnhjb21wID0geCAr IG9mZnNldGNhY2hlWzBdIC0gdGhpcy5kZWx0YVg7CiAgICB0aGlzLnljb21wID0g eSArIG9mZnNldGNhY2hlWzFdIC0gdGhpcy5kZWx0YVk7CiAgICB0aGlzLm9mZnNl dCA9IHRoaXMuY3VtdWxhdGl2ZU9mZnNldChlbGVtZW50KTsKCiAgICByZXR1cm4g KHRoaXMueWNvbXAgPj0gdGhpcy5vZmZzZXRbMV0gJiYKICAgICAgICAgICAgdGhp cy55Y29tcCA8ICB0aGlzLm9mZnNldFsxXSArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0 ICYmCiAgICAgICAgICAgIHRoaXMueGNvbXAgPj0gdGhpcy5vZmZzZXRbMF0gJiYK ICAgICAgICAgICAgdGhpcy54Y29tcCA8ICB0aGlzLm9mZnNldFswXSArIGVsZW1l bnQub2Zmc2V0V2lkdGgpOwogIH0sCgogIC8vIHdpdGhpbiBtdXN0IGJlIGNhbGxl ZCBkaXJlY3RseSBiZWZvcmUKICBvdmVybGFwOiBmdW5jdGlvbihtb2RlLCBlbGVt ZW50KSB7CiAgICBpZiAoIW1vZGUpIHJldHVybiAwOwogICAgaWYgKG1vZGUgPT0g J3ZlcnRpY2FsJykKICAgICAgcmV0dXJuICgodGhpcy5vZmZzZXRbMV0gKyBlbGVt ZW50Lm9mZnNldEhlaWdodCkgLSB0aGlzLnljb21wKSAvCiAgICAgICAgZWxlbWVu dC5vZmZzZXRIZWlnaHQ7CiAgICBpZiAobW9kZSA9PSAnaG9yaXpvbnRhbCcpCiAg ICAgIHJldHVybiAoKHRoaXMub2Zmc2V0WzBdICsgZWxlbWVudC5vZmZzZXRXaWR0 aCkgLSB0aGlzLnhjb21wKSAvCiAgICAgICAgZWxlbWVudC5vZmZzZXRXaWR0aDsK ICB9LAoKICBjbG9uZTogZnVuY3Rpb24oc291cmNlLCB0YXJnZXQpIHsKICAgIHNv dXJjZSA9ICQoc291cmNlKTsKICAgIHRhcmdldCA9ICQodGFyZ2V0KTsKICAgIHRh cmdldC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CiAgICB2YXIgb2Zmc2V0 cyA9IHRoaXMuY3VtdWxhdGl2ZU9mZnNldChzb3VyY2UpOwogICAgdGFyZ2V0LnN0 eWxlLnRvcCAgICA9IG9mZnNldHNbMV0gKyAncHgnOwogICAgdGFyZ2V0LnN0eWxl LmxlZnQgICA9IG9mZnNldHNbMF0gKyAncHgnOwogICAgdGFyZ2V0LnN0eWxlLndp ZHRoICA9IHNvdXJjZS5vZmZzZXRXaWR0aCArICdweCc7CiAgICB0YXJnZXQuc3R5 bGUuaGVpZ2h0ID0gc291cmNlLm9mZnNldEhlaWdodCArICdweCc7CiAgfSwKCiAg cGFnZTogZnVuY3Rpb24oZm9yRWxlbWVudCkgewogICAgdmFyIHZhbHVlVCA9IDAs IHZhbHVlTCA9IDA7CgogICAgdmFyIGVsZW1lbnQgPSBmb3JFbGVtZW50OwogICAg ZG8gewogICAgICB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7CiAg ICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsKCiAgICAgIC8v IFNhZmFyaSBmaXgKICAgICAgaWYgKGVsZW1lbnQub2Zmc2V0UGFyZW50PT1kb2N1 bWVudC5ib2R5KQogICAgICAgIGlmIChFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQs J3Bvc2l0aW9uJyk9PSdhYnNvbHV0ZScpIGJyZWFrOwoKICAgIH0gd2hpbGUgKGVs ZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudCk7CgogICAgZWxlbWVudCA9IGZv ckVsZW1lbnQ7CiAgICBkbyB7CiAgICAgIHZhbHVlVCAtPSBlbGVtZW50LnNjcm9s bFRvcCAgfHwgMDsKICAgICAgdmFsdWVMIC09IGVsZW1lbnQuc2Nyb2xsTGVmdCB8 fCAwOwogICAgfSB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSk7 CgogICAgcmV0dXJuIFt2YWx1ZUwsIHZhbHVlVF07CiAgfSwKCiAgY2xvbmU6IGZ1 bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KSB7CiAgICB2YXIgb3B0aW9ucyA9IE9iamVj dC5leHRlbmQoewogICAgICBzZXRMZWZ0OiAgICB0cnVlLAogICAgICBzZXRUb3A6 ICAgICB0cnVlLAogICAgICBzZXRXaWR0aDogICB0cnVlLAogICAgICBzZXRIZWln aHQ6ICB0cnVlLAogICAgICBvZmZzZXRUb3A6ICAwLAogICAgICBvZmZzZXRMZWZ0 OiAwCiAgICB9LCBhcmd1bWVudHNbMl0gfHwge30pCgogICAgLy8gZmluZCBwYWdl IHBvc2l0aW9uIG9mIHNvdXJjZQogICAgc291cmNlID0gJChzb3VyY2UpOwogICAg dmFyIHAgPSBQb3NpdGlvbi5wYWdlKHNvdXJjZSk7CgogICAgLy8gZmluZCBjb29y ZGluYXRlIHN5c3RlbSB0byB1c2UKICAgIHRhcmdldCA9ICQodGFyZ2V0KTsKICAg IHZhciBkZWx0YSA9IFswLCAwXTsKICAgIHZhciBwYXJlbnQgPSBudWxsOwogICAg Ly8gZGVsdGEgWzAsMF0gd2lsbCBkbyBmaW5lIHdpdGggcG9zaXRpb246IGZpeGVk IGVsZW1lbnRzLAogICAgLy8gcG9zaXRpb246YWJzb2x1dGUgbmVlZHMgb2Zmc2V0 UGFyZW50IGRlbHRhcwogICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUodGFyZ2V0LCdw b3NpdGlvbicpID09ICdhYnNvbHV0ZScpIHsKICAgICAgcGFyZW50ID0gUG9zaXRp b24ub2Zmc2V0UGFyZW50KHRhcmdldCk7CiAgICAgIGRlbHRhID0gUG9zaXRpb24u cGFnZShwYXJlbnQpOwogICAgfQoKICAgIC8vIGNvcnJlY3QgYnkgYm9keSBvZmZz ZXRzIChmaXhlcyBTYWZhcmkpCiAgICBpZiAocGFyZW50ID09IGRvY3VtZW50LmJv ZHkpIHsKICAgICAgZGVsdGFbMF0gLT0gZG9jdW1lbnQuYm9keS5vZmZzZXRMZWZ0 OwogICAgICBkZWx0YVsxXSAtPSBkb2N1bWVudC5ib2R5Lm9mZnNldFRvcDsKICAg IH0KCiAgICAvLyBzZXQgcG9zaXRpb24KICAgIGlmKG9wdGlvbnMuc2V0TGVmdCkg ICB0YXJnZXQuc3R5bGUubGVmdCAgPSAocFswXSAtIGRlbHRhWzBdICsgb3B0aW9u cy5vZmZzZXRMZWZ0KSArICdweCc7CiAgICBpZihvcHRpb25zLnNldFRvcCkgICAg dGFyZ2V0LnN0eWxlLnRvcCAgID0gKHBbMV0gLSBkZWx0YVsxXSArIG9wdGlvbnMu b2Zmc2V0VG9wKSArICdweCc7CiAgICBpZihvcHRpb25zLnNldFdpZHRoKSAgdGFy Z2V0LnN0eWxlLndpZHRoID0gc291cmNlLm9mZnNldFdpZHRoICsgJ3B4JzsKICAg IGlmKG9wdGlvbnMuc2V0SGVpZ2h0KSB0YXJnZXQuc3R5bGUuaGVpZ2h0ID0gc291 cmNlLm9mZnNldEhlaWdodCArICdweCc7CiAgfSwKCiAgYWJzb2x1dGl6ZTogZnVu Y3Rpb24oZWxlbWVudCkgewogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBp ZiAoZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9PSAnYWJzb2x1dGUnKSByZXR1cm47 CiAgICBQb3NpdGlvbi5wcmVwYXJlKCk7CgogICAgdmFyIG9mZnNldHMgPSBQb3Np dGlvbi5wb3NpdGlvbmVkT2Zmc2V0KGVsZW1lbnQpOwogICAgdmFyIHRvcCAgICAg PSBvZmZzZXRzWzFdOwogICAgdmFyIGxlZnQgICAgPSBvZmZzZXRzWzBdOwogICAg dmFyIHdpZHRoICAgPSBlbGVtZW50LmNsaWVudFdpZHRoOwogICAgdmFyIGhlaWdo dCAgPSBlbGVtZW50LmNsaWVudEhlaWdodDsKCiAgICBlbGVtZW50Ll9vcmlnaW5h bExlZnQgICA9IGxlZnQgLSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUubGVmdCAg fHwgMCk7CiAgICBlbGVtZW50Ll9vcmlnaW5hbFRvcCAgICA9IHRvcCAgLSBwYXJz ZUZsb2F0KGVsZW1lbnQuc3R5bGUudG9wIHx8IDApOwogICAgZWxlbWVudC5fb3Jp Z2luYWxXaWR0aCAgPSBlbGVtZW50LnN0eWxlLndpZHRoOwogICAgZWxlbWVudC5f b3JpZ2luYWxIZWlnaHQgPSBlbGVtZW50LnN0eWxlLmhlaWdodDsKCiAgICBlbGVt ZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKICAgIGVsZW1lbnQuc3R5 bGUudG9wICAgID0gdG9wICsgJ3B4Jzs7CiAgICBlbGVtZW50LnN0eWxlLmxlZnQg ICA9IGxlZnQgKyAncHgnOzsKICAgIGVsZW1lbnQuc3R5bGUud2lkdGggID0gd2lk dGggKyAncHgnOzsKICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsg J3B4Jzs7CiAgfSwKCiAgcmVsYXRpdml6ZTogZnVuY3Rpb24oZWxlbWVudCkgewog ICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICBpZiAoZWxlbWVudC5zdHlsZS5w b3NpdGlvbiA9PSAncmVsYXRpdmUnKSByZXR1cm47CiAgICBQb3NpdGlvbi5wcmVw YXJlKCk7CgogICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7 CiAgICB2YXIgdG9wICA9IHBhcnNlRmxvYXQoZWxlbWVudC5zdHlsZS50b3AgIHx8 IDApIC0gKGVsZW1lbnQuX29yaWdpbmFsVG9wIHx8IDApOwogICAgdmFyIGxlZnQg PSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUubGVmdCB8fCAwKSAtIChlbGVtZW50 Ll9vcmlnaW5hbExlZnQgfHwgMCk7CgogICAgZWxlbWVudC5zdHlsZS50b3AgICAg PSB0b3AgKyAncHgnOwogICAgZWxlbWVudC5zdHlsZS5sZWZ0ICAgPSBsZWZ0ICsg J3B4JzsKICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gZWxlbWVudC5fb3JpZ2lu YWxIZWlnaHQ7CiAgICBlbGVtZW50LnN0eWxlLndpZHRoICA9IGVsZW1lbnQuX29y aWdpbmFsV2lkdGg7CiAgfQp9CgovLyBTYWZhcmkgcmV0dXJucyBtYXJnaW5zIG9u IGJvZHkgd2hpY2ggaXMgaW5jb3JyZWN0IGlmIHRoZSBjaGlsZCBpcyBhYnNvbHV0 ZWx5Ci8vIHBvc2l0aW9uZWQuICBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgcmVk ZWZpbmUgUG9zaXRpb24uY3VtdWxhdGl2ZU9mZnNldCBmb3IKLy8gS0hUTUwvV2Vi S2l0IG9ubHkuCmlmICgvS29ucXVlcm9yfFNhZmFyaXxLSFRNTC8udGVzdChuYXZp Z2F0b3IudXNlckFnZW50KSkgewogIFBvc2l0aW9uLmN1bXVsYXRpdmVPZmZzZXQg PSBmdW5jdGlvbihlbGVtZW50KSB7CiAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVM ID0gMDsKICAgIGRvIHsKICAgICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9w ICB8fCAwOwogICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7 CiAgICAgIGlmIChlbGVtZW50Lm9mZnNldFBhcmVudCA9PSBkb2N1bWVudC5ib2R5 KQogICAgICAgIGlmIChFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlv bicpID09ICdhYnNvbHV0ZScpIGJyZWFrOwoKICAgICAgZWxlbWVudCA9IGVsZW1l bnQub2Zmc2V0UGFyZW50OwogICAgfSB3aGlsZSAoZWxlbWVudCk7CgogICAgcmV0 dXJuIFt2YWx1ZUwsIHZhbHVlVF07CiAgfQp9Ci8qCVVub2J0cnVzaXZlIEZsYXNo IE9iamVjdHMgKFVGTykgdjMuMjAgPGh0dHA6Ly93d3cuYm9iYnl2YW5kZXJzbHVp cy5jb20vdWZvLz4KCUNvcHlyaWdodCAyMDA1LCAyMDA2IEJvYmJ5IHZhbiBkZXIg U2x1aXMKCVRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENDLUdO VSBMR1BMIDxodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9MR1BM LzIuMS8+CiovCgp2YXIgVUZPID0gewoJcmVxOiBbIm1vdmllIiwgIndpZHRoIiwg ImhlaWdodCIsICJtYWpvcnZlcnNpb24iLCAiYnVpbGQiXSwKCW9wdDogWyJwbGF5 IiwgImxvb3AiLCAibWVudSIsICJxdWFsaXR5IiwgInNjYWxlIiwgInNhbGlnbiIs ICJ3bW9kZSIsICJiZ2NvbG9yIiwgImJhc2UiLCAiZmxhc2h2YXJzIiwgImRldmlj ZWZvbnQiLCAiYWxsb3dzY3JpcHRhY2Nlc3MiLCAic2VhbWxlc3N0YWJiaW5nIiwg ImFsbG93ZnVsbHNjcmVlbiJdLAoJb3B0QXR0OiBbImlkIiwgIm5hbWUiLCAiYWxp Z24iXSwKCW9wdEV4YzogWyJzd2xpdmVjb25uZWN0Il0sCgl4aW1vdmllOiAidWZv LnN3ZiIsCgl4aXdpZHRoOiAiMjE1IiwKCXhpaGVpZ2h0OiAiMTM4IiwKCXVhOiBu YXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksCglwbHVnaW5UeXBlOiAi IiwKCWZ2OiBbMCwwXSwKCWZvTGlzdDogW10sCgoJY3JlYXRlOiBmdW5jdGlvbihG TywgaWQpIHsKCQlpZiAoIVVGTy51YUhhcygidzNjZG9tIikgfHwgVUZPLnVhSGFz KCJpZU1hYyIpKSByZXR1cm47CgkJVUZPLmdldEZsYXNoVmVyc2lvbigpOwoJCVVG Ty5mb0xpc3RbaWRdID0gVUZPLnVwZGF0ZUZPKEZPKTsKCQlVRk8uY3JlYXRlQ1NT KCIjIiArIGlkLCAidmlzaWJpbGl0eTpoaWRkZW47Iik7CgkJVUZPLmRvbUxvYWQo aWQpOwoJfSwKCgl1cGRhdGVGTzogZnVuY3Rpb24oRk8pIHsKCQlpZiAodHlwZW9m IEZPLnhpICE9ICJ1bmRlZmluZWQiICYmIEZPLnhpID09ICJ0cnVlIikgewoJCQlp ZiAodHlwZW9mIEZPLnhpbW92aWUgPT0gInVuZGVmaW5lZCIpIEZPLnhpbW92aWUg PSBVRk8ueGltb3ZpZTsKCQkJaWYgKHR5cGVvZiBGTy54aXdpZHRoID09ICJ1bmRl ZmluZWQiKSBGTy54aXdpZHRoID0gVUZPLnhpd2lkdGg7CgkJCWlmICh0eXBlb2Yg Rk8ueGloZWlnaHQgPT0gInVuZGVmaW5lZCIpIEZPLnhpaGVpZ2h0ID0gVUZPLnhp aGVpZ2h0OwoJCX0KCQlGTy5tYWluQ2FsbGVkID0gZmFsc2U7CgkJcmV0dXJuIEZP OwoJfSwKCglkb21Mb2FkOiBmdW5jdGlvbihpZCkgewoJCXZhciBfdCA9IHNldElu dGVydmFsKGZ1bmN0aW9uKCkgewoJCQlpZiAoKGRvY3VtZW50LmdldEVsZW1lbnRz QnlUYWdOYW1lKCJib2R5IilbMF0gIT0gbnVsbCB8fCBkb2N1bWVudC5ib2R5ICE9 IG51bGwpICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSAhPSBudWxsKSB7 CgkJCQlVRk8ubWFpbihpZCk7CgkJCQljbGVhckludGVydmFsKF90KTsKCQkJfQoJ CX0sIDI1MCk7CgkJaWYgKHR5cGVvZiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVy ICE9ICJ1bmRlZmluZWQiKSB7CgkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIo IkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsgVUZPLm1haW4oaWQpOyBj bGVhckludGVydmFsKF90KTsgfSAsIG51bGwpOyAvLyBHZWNrbywgT3BlcmEgOSsK CQl9Cgl9LAoKCW1haW46IGZ1bmN0aW9uKGlkKSB7CgkJdmFyIF9mbyA9IFVGTy5m b0xpc3RbaWRdOwoJCWlmIChfZm8ubWFpbkNhbGxlZCkgcmV0dXJuOwoJCVVGTy5m b0xpc3RbaWRdLm1haW5DYWxsZWQgPSB0cnVlOwoJCWRvY3VtZW50LmdldEVsZW1l bnRCeUlkKGlkKS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CgkJaWYgKFVG Ty5oYXNSZXF1aXJlZChpZCkpIHsKCQkJaWYgKFVGTy5oYXNGbGFzaFZlcnNpb24o cGFyc2VJbnQoX2ZvLm1ham9ydmVyc2lvbiwgMTApLCBwYXJzZUludChfZm8uYnVp bGQsIDEwKSkpIHsKCQkJCWlmICh0eXBlb2YgX2ZvLnNldGNvbnRhaW5lcmNzcyAh PSAidW5kZWZpbmVkIiAmJiBfZm8uc2V0Y29udGFpbmVyY3NzID09ICJ0cnVlIikg VUZPLnNldENvbnRhaW5lckNTUyhpZCk7CgkJCQlVRk8ud3JpdGVTV0YoaWQpOwoJ CQl9CgkJCWVsc2UgaWYgKF9mby54aSA9PSAidHJ1ZSIgJiYgVUZPLmhhc0ZsYXNo VmVyc2lvbig2LCA2NSkpIHsKCQkJCVVGTy5jcmVhdGVEaWFsb2coaWQpOwoJCQl9 CgkJfQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5zdHlsZS52aXNpYmls aXR5ID0gInZpc2libGUiOwoJfSwKCgljcmVhdGVDU1M6IGZ1bmN0aW9uKHNlbGVj dG9yLCBkZWNsYXJhdGlvbikgewoJCXZhciBfaCA9IGRvY3VtZW50LmdldEVsZW1l bnRzQnlUYWdOYW1lKCJoZWFkIilbMF07CgkJdmFyIF9zID0gVUZPLmNyZWF0ZUVs ZW1lbnQoInN0eWxlIik7CgkJaWYgKCFVRk8udWFIYXMoImllV2luIikpIF9zLmFw cGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHNlbGVjdG9yICsgIiB7 IiArIGRlY2xhcmF0aW9uICsgIn0iKSk7IC8vIGJ1Z3MgaW4gSUUvV2luCgkJX3Mu c2V0QXR0cmlidXRlKCJ0eXBlIiwgInRleHQvY3NzIik7CgkJX3Muc2V0QXR0cmli dXRlKCJtZWRpYSIsICJzY3JlZW4iKTsKCQlfaC5hcHBlbmRDaGlsZChfcyk7CgkJ aWYgKFVGTy51YUhhcygiaWVXaW4iKSAmJiBkb2N1bWVudC5zdHlsZVNoZWV0cyAm JiBkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGggPiAwKSB7CgkJCXZhciBfbHMg PSBkb2N1bWVudC5zdHlsZVNoZWV0c1tkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5n dGggLSAxXTsKCQkJaWYgKHR5cGVvZiBfbHMuYWRkUnVsZSA9PSAib2JqZWN0Iikg X2xzLmFkZFJ1bGUoc2VsZWN0b3IsIGRlY2xhcmF0aW9uKTsKCQl9Cgl9LAoKCXNl dENvbnRhaW5lckNTUzogZnVuY3Rpb24oaWQpIHsKCQl2YXIgX2ZvID0gVUZPLmZv TGlzdFtpZF07CgkJdmFyIF93ID0gLyUvLnRlc3QoX2ZvLndpZHRoKSA/ICIiIDog InB4IjsKCQl2YXIgX2ggPSAvJS8udGVzdChfZm8uaGVpZ2h0KSA/ICIiIDogInB4 IjsKCQlVRk8uY3JlYXRlQ1NTKCIjIiArIGlkLCAid2lkdGg6IiArIF9mby53aWR0 aCArIF93ICsiOyBoZWlnaHQ6IiArIF9mby5oZWlnaHQgKyBfaCArIjsiKTsKCQlp ZiAoX2ZvLndpZHRoID09ICIxMDAlIikgewoJCQlVRk8uY3JlYXRlQ1NTKCJib2R5 IiwgIm1hcmdpbi1sZWZ0OjA7IG1hcmdpbi1yaWdodDowOyBwYWRkaW5nLWxlZnQ6 MDsgcGFkZGluZy1yaWdodDowOyIpOwoJCX0KCQlpZiAoX2ZvLmhlaWdodCA9PSAi MTAwJSIpIHsKCQkJVUZPLmNyZWF0ZUNTUygiaHRtbCIsICJoZWlnaHQ6MTAwJTsg b3ZlcmZsb3c6aGlkZGVuOyIpOwoJCQlVRk8uY3JlYXRlQ1NTKCJib2R5IiwgIm1h cmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTowOyBwYWRkaW5nLXRvcDowOyBwYWRk aW5nLWJvdHRvbTowOyBoZWlnaHQ6MTAwJTsiKTsKCQl9Cgl9LAoKCWNyZWF0ZUVs ZW1lbnQ6IGZ1bmN0aW9uKGVsKSB7CgkJcmV0dXJuIChVRk8udWFIYXMoInhtbCIp ICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgIT0gInVuZGVmaW5l ZCIpID8gIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5v cmcvMTk5OS94aHRtbCIsIGVsKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWwp OwoJfSwKCgljcmVhdGVPYmpQYXJhbTogZnVuY3Rpb24oZWwsIGFOYW1lLCBhVmFs dWUpIHsKCQl2YXIgX3AgPSBVRk8uY3JlYXRlRWxlbWVudCgicGFyYW0iKTsKCQlf cC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBhTmFtZSk7CgkJX3Auc2V0QXR0cmlidXRl KCJ2YWx1ZSIsIGFWYWx1ZSk7CgkJZWwuYXBwZW5kQ2hpbGQoX3ApOwoJfSwKCgl1 YUhhczogZnVuY3Rpb24oZnQpIHsKCQl2YXIgX3UgPSBVRk8udWE7CgkJc3dpdGNo KGZ0KSB7CgkJCWNhc2UgInczY2RvbSI6CgkJCQlyZXR1cm4gKHR5cGVvZiBkb2N1 bWVudC5nZXRFbGVtZW50QnlJZCAhPSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgZG9j dW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT0gInVuZGVmaW5lZCIgJiYgKHR5 cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9ICJ1bmRlZmluZWQiIHx8IHR5 cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgIT0gInVuZGVmaW5lZCIpKTsK CQkJY2FzZSAieG1sIjoKCQkJCXZhciBfbSA9IGRvY3VtZW50LmdldEVsZW1lbnRz QnlUYWdOYW1lKCJtZXRhIik7CgkJCQl2YXIgX2wgPSBfbS5sZW5ndGg7CgkJCQlm b3IgKHZhciBpID0gMDsgaSA8IF9sOyBpKyspIHsKCQkJCQlpZiAoL2NvbnRlbnQt dHlwZS9pLnRlc3QoX21baV0uZ2V0QXR0cmlidXRlKCJodHRwLWVxdWl2IikpICYm IC94bWwvaS50ZXN0KF9tW2ldLmdldEF0dHJpYnV0ZSgiY29udGVudCIpKSkgcmV0 dXJuIHRydWU7CgkJCQl9CgkJCQlyZXR1cm4gZmFsc2U7CgkJCWNhc2UgImllTWFj IjoKCQkJCXJldHVybiAvbXNpZS8udGVzdChfdSkgJiYgIS9vcGVyYS8udGVzdChf dSkgJiYgL21hYy8udGVzdChfdSk7CgkJCWNhc2UgImllV2luIjoKCQkJCXJldHVy biAvbXNpZS8udGVzdChfdSkgJiYgIS9vcGVyYS8udGVzdChfdSkgJiYgL3dpbi8u dGVzdChfdSk7CgkJCWNhc2UgImdlY2tvIjoKCQkJCXJldHVybiAvZ2Vja28vLnRl c3QoX3UpICYmICEvYXBwbGV3ZWJraXQvLnRlc3QoX3UpOwoJCQljYXNlICJvcGVy YSI6CgkJCQlyZXR1cm4gL29wZXJhLy50ZXN0KF91KTsKCQkJY2FzZSAic2FmYXJp IjoKCQkJCXJldHVybiAvYXBwbGV3ZWJraXQvLnRlc3QoX3UpOwoJCQlkZWZhdWx0 OgoJCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0sCgoJZ2V0Rmxhc2hWZXJzaW9uOiBm dW5jdGlvbigpIHsKCQlpZiAoVUZPLmZ2WzBdICE9IDApIHJldHVybjsKCQlpZiAo bmF2aWdhdG9yLnBsdWdpbnMgJiYgdHlwZW9mIG5hdmlnYXRvci5wbHVnaW5zWyJT aG9ja3dhdmUgRmxhc2giXSA9PSAib2JqZWN0IikgewoJCQlVRk8ucGx1Z2luVHlw ZSA9ICJucGFwaSI7CgkJCXZhciBfZCA9IG5hdmlnYXRvci5wbHVnaW5zWyJTaG9j a3dhdmUgRmxhc2giXS5kZXNjcmlwdGlvbjsKCQkJaWYgKHR5cGVvZiBfZCAhPSAi dW5kZWZpbmVkIikgewoJCQkJX2QgPSBfZC5yZXBsYWNlKC9eLipccysoXFMrXHMr XFMrJCkvLCAiJDEiKTsKCQkJCXZhciBfbSA9IHBhcnNlSW50KF9kLnJlcGxhY2Uo L14oLiopXC4uKiQvLCAiJDEiKSwgMTApOwoJCQkJdmFyIF9yID0gL3IvLnRlc3Qo X2QpID8gcGFyc2VJbnQoX2QucmVwbGFjZSgvXi4qciguKikkLywgIiQxIiksIDEw KSA6IDA7CgkJCQlVRk8uZnYgPSBbX20sIF9yXTsKCQkJfQoJCX0KCQllbHNlIGlm ICh3aW5kb3cuQWN0aXZlWE9iamVjdCkgewoJCQlVRk8ucGx1Z2luVHlwZSA9ICJh eCI7CgkJCXRyeSB7IC8vIGF2b2lkIGZwIDYgY3Jhc2hlcwoJCQkJdmFyIF9hID0g bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNo LjciKTsKCQkJfQoJCQljYXRjaChlKSB7CgkJCQl0cnkgewoJCQkJCXZhciBfYSA9 IG5ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFz aC42Iik7CgkJCQkJVUZPLmZ2ID0gWzYsIDBdOwoJCQkJCV9hLkFsbG93U2NyaXB0 QWNjZXNzID0gImFsd2F5cyI7IC8vIHRocm93cyBpZiBmcCA8IDYuNDcKCQkJCX0K CQkJCWNhdGNoKGUpIHsKCQkJCQlpZiAoVUZPLmZ2WzBdID09IDYpIHJldHVybjsK CQkJCX0KCQkJCXRyeSB7CgkJCQkJdmFyIF9hID0gbmV3IEFjdGl2ZVhPYmplY3Qo IlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIik7CgkJCQl9CgkJCQljYXRj aChlKSB7fQoJCQl9CgkJCWlmICh0eXBlb2YgX2EgPT0gIm9iamVjdCIpIHsKCQkJ CXZhciBfZCA9IF9hLkdldFZhcmlhYmxlKCIkdmVyc2lvbiIpOyAvLyBidWdzIGlu IGZwIDYuMjEvNi4yMwoJCQkJaWYgKHR5cGVvZiBfZCAhPSAidW5kZWZpbmVkIikg ewoJCQkJCV9kID0gX2QucmVwbGFjZSgvXlxTK1xzKyguKikkLywgIiQxIikuc3Bs aXQoIiwiKTsKCQkJCQlVRk8uZnYgPSBbcGFyc2VJbnQoX2RbMF0sIDEwKSwgcGFy c2VJbnQoX2RbMl0sIDEwKV07CgkJCQl9CgkJCX0KCQl9Cgl9LAoKCWhhc1JlcXVp cmVkOiBmdW5jdGlvbihpZCkgewoJCXZhciBfbCA9IFVGTy5yZXEubGVuZ3RoOwoJ CWZvciAodmFyIGkgPSAwOyBpIDwgX2w7IGkrKykgewoJCQlpZiAodHlwZW9mIFVG Ty5mb0xpc3RbaWRdW1VGTy5yZXFbaV1dID09ICJ1bmRlZmluZWQiKSByZXR1cm4g ZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfSwKCgloYXNGbGFzaFZlcnNpb246 IGZ1bmN0aW9uKG1ham9yLCByZWxlYXNlKSB7CgkJcmV0dXJuIChVRk8uZnZbMF0g PiBtYWpvciB8fCAoVUZPLmZ2WzBdID09IG1ham9yICYmIFVGTy5mdlsxXSA+PSBy ZWxlYXNlKSkgPyB0cnVlIDogZmFsc2U7Cgl9LAoKCXdyaXRlU1dGOiBmdW5jdGlv bihpZCkgewoJCXZhciBfZm8gPSBVRk8uZm9MaXN0W2lkXTsKCQl2YXIgX2UgPSBk b2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CgkJaWYgKFVGTy5wbHVnaW5UeXBl ID09ICJucGFwaSIpIHsKCQkJaWYgKFVGTy51YUhhcygiZ2Vja28iKSB8fCBVRk8u dWFIYXMoInhtbCIpKSB7CgkJCQl3aGlsZShfZS5oYXNDaGlsZE5vZGVzKCkpIHsK CQkJCQlfZS5yZW1vdmVDaGlsZChfZS5maXJzdENoaWxkKTsKCQkJCX0KCQkJCXZh ciBfb2JqID0gVUZPLmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpOwoJCQkJX29iai5z ZXRBdHRyaWJ1dGUoInR5cGUiLCAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxh c2giKTsKCQkJCV9vYmouc2V0QXR0cmlidXRlKCJkYXRhIiwgX2ZvLm1vdmllKTsK CQkJCV9vYmouc2V0QXR0cmlidXRlKCJ3aWR0aCIsIF9mby53aWR0aCk7CgkJCQlf b2JqLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwgX2ZvLmhlaWdodCk7CgkJCQl2YXIg X2wgPSBVRk8ub3B0QXR0Lmxlbmd0aDsKCQkJCWZvciAodmFyIGkgPSAwOyBpIDwg X2w7IGkrKykgewoJCQkJCWlmICh0eXBlb2YgX2ZvW1VGTy5vcHRBdHRbaV1dICE9 ICJ1bmRlZmluZWQiKSBfb2JqLnNldEF0dHJpYnV0ZShVRk8ub3B0QXR0W2ldLCBf Zm9bVUZPLm9wdEF0dFtpXV0pOwoJCQkJfQoJCQkJdmFyIF9vID0gVUZPLm9wdC5j b25jYXQoVUZPLm9wdEV4Yyk7CgkJCQl2YXIgX2wgPSBfby5sZW5ndGg7CgkJCQlm b3IgKHZhciBpID0gMDsgaSA8IF9sOyBpKyspIHsKCQkJCQlpZiAodHlwZW9mIF9m b1tfb1tpXV0gIT0gInVuZGVmaW5lZCIpIFVGTy5jcmVhdGVPYmpQYXJhbShfb2Jq LCBfb1tpXSwgX2ZvW19vW2ldXSk7CgkJCQl9CgkJCQlfZS5hcHBlbmRDaGlsZChf b2JqKTsKCQkJfQoJCQllbHNlIHsKCQkJCXZhciBfZW1iID0gIiI7CgkJCQl2YXIg X28gPSBVRk8ub3B0LmNvbmNhdChVRk8ub3B0QXR0KS5jb25jYXQoVUZPLm9wdEV4 Yyk7CgkJCQl2YXIgX2wgPSBfby5sZW5ndGg7CgkJCQlmb3IgKHZhciBpID0gMDsg aSA8IF9sOyBpKyspIHsKCQkJCQlpZiAodHlwZW9mIF9mb1tfb1tpXV0gIT0gInVu ZGVmaW5lZCIpIF9lbWIgKz0gJyAnICsgX29baV0gKyAnPSInICsgX2ZvW19vW2ld XSArICciJzsKCQkJCX0KCQkJCV9lLmlubmVySFRNTCA9ICc8ZW1iZWQgdHlwZT0i YXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giIHNyYz0iJyArIF9mby5tb3Zp ZSArICciIHdpZHRoPSInICsgX2ZvLndpZHRoICsgJyIgaGVpZ2h0PSInICsgX2Zv LmhlaWdodCArICciIHBsdWdpbnNwYWdlPSJodHRwOi8vd3d3Lm1hY3JvbWVkaWEu Y29tL2dvL2dldGZsYXNocGxheWVyIicgKyBfZW1iICsgJz48L2VtYmVkPic7CgkJ CX0KCQl9CgkJZWxzZSBpZiAoVUZPLnBsdWdpblR5cGUgPT0gImF4IikgewoJCQl2 YXIgX29iakF0dCA9ICIiOwoJCQl2YXIgX2wgPSBVRk8ub3B0QXR0Lmxlbmd0aDsK CQkJZm9yICh2YXIgaSA9IDA7IGkgPCBfbDsgaSsrKSB7CgkJCQlpZiAodHlwZW9m IF9mb1tVRk8ub3B0QXR0W2ldXSAhPSAidW5kZWZpbmVkIikgX29iakF0dCArPSAn ICcgKyBVRk8ub3B0QXR0W2ldICsgJz0iJyArIF9mb1tVRk8ub3B0QXR0W2ldXSAr ICciJzsKCQkJfQoJCQl2YXIgX29ialBhciA9ICIiOwoJCQl2YXIgX2wgPSBVRk8u b3B0Lmxlbmd0aDsKCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBfbDsgaSsrKSB7CgkJ CQlpZiAodHlwZW9mIF9mb1tVRk8ub3B0W2ldXSAhPSAidW5kZWZpbmVkIikgX29i alBhciArPSAnPHBhcmFtIG5hbWU9IicgKyBVRk8ub3B0W2ldICsgJyIgdmFsdWU9 IicgKyBfZm9bVUZPLm9wdFtpXV0gKyAnIiAvPic7CgkJCX0KCQkJdmFyIF9wID0g d2luZG93LmxvY2F0aW9uLnByb3RvY29sID09ICJodHRwczoiID8gImh0dHBzOiIg OiAiaHR0cDoiOwoJCQlfZS5pbm5lckhUTUwgPSAnPG9iamVjdCBjbGFzc2lkPSJj bHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiJyArIF9v YmpBdHQgKyAnIHdpZHRoPSInICsgX2ZvLndpZHRoICsgJyIgaGVpZ2h0PSInICsg X2ZvLmhlaWdodCArICciIGNvZGViYXNlPSInICsgX3AgKyAnLy9kb3dubG9hZC5t YWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZmxhc2gvc3dmbGFzaC5j YWIjdmVyc2lvbj0nICsgX2ZvLm1ham9ydmVyc2lvbiArICcsMCwnICsgX2ZvLmJ1 aWxkICsgJywwIj48cGFyYW0gbmFtZT0ibW92aWUiIHZhbHVlPSInICsgX2ZvLm1v dmllICsgJyIgLz4nICsgX29ialBhciArICc8L29iamVjdD4nOwoJCX0KCX0sCgoJ Y3JlYXRlRGlhbG9nOiBmdW5jdGlvbihpZCkgewoJCXZhciBfZm8gPSBVRk8uZm9M aXN0W2lkXTsKCQlVRk8uY3JlYXRlQ1NTKCJodG1sIiwgImhlaWdodDoxMDAlOyBv dmVyZmxvdzpoaWRkZW47Iik7CgkJVUZPLmNyZWF0ZUNTUygiYm9keSIsICJoZWln aHQ6MTAwJTsgb3ZlcmZsb3c6aGlkZGVuOyIpOwoJCVVGTy5jcmVhdGVDU1MoIiN4 aS1jb24iLCAicG9zaXRpb246YWJzb2x1dGU7IGxlZnQ6MDsgdG9wOjA7IHotaW5k ZXg6MTAwMDsgd2lkdGg6MTAwJTsgaGVpZ2h0OjEwMCU7IGJhY2tncm91bmQtY29s b3I6I2ZmZjsgZmlsdGVyOmFscGhhKG9wYWNpdHk6NzUpOyBvcGFjaXR5OjAuNzU7 Iik7CgkJVUZPLmNyZWF0ZUNTUygiI3hpLWRpYSIsICJwb3NpdGlvbjphYnNvbHV0 ZTsgbGVmdDo1MCU7IHRvcDo1MCU7IG1hcmdpbi1sZWZ0OiAtIiArIE1hdGgucm91 bmQocGFyc2VJbnQoX2ZvLnhpd2lkdGgsIDEwKSAvIDIpICsgInB4OyBtYXJnaW4t dG9wOiAtIiArIE1hdGgucm91bmQocGFyc2VJbnQoX2ZvLnhpaGVpZ2h0LCAxMCkg LyAyKSArICJweDsgd2lkdGg6IiArIF9mby54aXdpZHRoICsgInB4OyBoZWlnaHQ6 IiArIF9mby54aWhlaWdodCArICJweDsiKTsKCQl2YXIgX2IgPSBkb2N1bWVudC5n ZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdOwoJCXZhciBfYyA9IFVGTy5j cmVhdGVFbGVtZW50KCJkaXYiKTsKCQlfYy5zZXRBdHRyaWJ1dGUoImlkIiwgInhp LWNvbiIpOwoJCXZhciBfZCA9IFVGTy5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQlf ZC5zZXRBdHRyaWJ1dGUoImlkIiwgInhpLWRpYSIpOwoJCV9jLmFwcGVuZENoaWxk KF9kKTsKCQlfYi5hcHBlbmRDaGlsZChfYyk7CgkJdmFyIF9tbXUgPSB3aW5kb3cu bG9jYXRpb247CgkJaWYgKFVGTy51YUhhcygieG1sIikgJiYgVUZPLnVhSGFzKCJz YWZhcmkiKSkgewoJCQl2YXIgX21tZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlU YWdOYW1lKCJ0aXRsZSIpWzBdLmZpcnN0Q2hpbGQubm9kZVZhbHVlID0gZG9jdW1l bnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRpdGxlIilbMF0uZmlyc3RDaGlsZC5u b2RlVmFsdWUuc2xpY2UoMCwgNDcpICsgIiAtIEZsYXNoIFBsYXllciBJbnN0YWxs YXRpb24iOwoJCX0KCQllbHNlIHsKCQkJdmFyIF9tbWQgPSBkb2N1bWVudC50aXRs ZSA9IGRvY3VtZW50LnRpdGxlLnNsaWNlKDAsIDQ3KSArICIgLSBGbGFzaCBQbGF5 ZXIgSW5zdGFsbGF0aW9uIjsKCQl9CgkJdmFyIF9tbXAgPSBVRk8ucGx1Z2luVHlw ZSA9PSAiYXgiID8gIkFjdGl2ZVgiIDogIlBsdWdJbiI7CgkJdmFyIF91YyA9IHR5 cGVvZiBfZm8ueGl1cmxjYW5jZWwgIT0gInVuZGVmaW5lZCIgPyAiJnhpVXJsQ2Fu Y2VsPSIgKyBfZm8ueGl1cmxjYW5jZWwgOiAiIjsKCQl2YXIgX3VmID0gdHlwZW9m IF9mby54aXVybGZhaWxlZCAhPSAidW5kZWZpbmVkIiA/ICImeGlVcmxGYWlsZWQ9 IiArIF9mby54aXVybGZhaWxlZCA6ICIiOwoJCVVGTy5mb0xpc3RbInhpLWRpYSJd ID0geyBtb3ZpZTpfZm8ueGltb3ZpZSwgd2lkdGg6X2ZvLnhpd2lkdGgsIGhlaWdo dDpfZm8ueGloZWlnaHQsIG1ham9ydmVyc2lvbjoiNiIsIGJ1aWxkOiI2NSIsIGZs YXNodmFyczoiTU1yZWRpcmVjdFVSTD0iICsgX21tdSArICImTU1wbGF5ZXJUeXBl PSIgKyBfbW1wICsgIiZNTWRvY3RpdGxlPSIgKyBfbW1kICsgX3VjICsgX3VmIH07 CgkJVUZPLndyaXRlU1dGKCJ4aS1kaWEiKTsKCX0sCgoJZXhwcmVzc0luc3RhbGxD YWxsYmFjazogZnVuY3Rpb24oKSB7CgkJdmFyIF9iID0gZG9jdW1lbnQuZ2V0RWxl bWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTsKCQl2YXIgX2MgPSBkb2N1bWVudC5n ZXRFbGVtZW50QnlJZCgieGktY29uIik7CgkJX2IucmVtb3ZlQ2hpbGQoX2MpOwoJ CVVGTy5jcmVhdGVDU1MoImJvZHkiLCAiaGVpZ2h0OmF1dG87IG92ZXJmbG93OmF1 dG87Iik7CgkJVUZPLmNyZWF0ZUNTUygiaHRtbCIsICJoZWlnaHQ6YXV0bzsgb3Zl cmZsb3c6YXV0bzsiKTsKCX0sCgoJY2xlYW51cElFTGVha3M6IGZ1bmN0aW9uKCkg ewoJCXZhciBfbyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmpl Y3QiKTsKCQl2YXIgX2wgPSBfby5sZW5ndGgKCQlmb3IgKHZhciBpID0gMDsgaSA8 IF9sOyBpKyspIHsKCQkJX29baV0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCQkJ Zm9yICh2YXIgeCBpbiBfb1tpXSkgewoJCQkJaWYgKHR5cGVvZiBfb1tpXVt4XSA9 PSAiZnVuY3Rpb24iKSB7CgkJCQkJX29baV1beF0gPSBudWxsOwoJCQkJfQoJCQl9 CgkJfQoJfQoKfTsKCmlmICh0eXBlb2Ygd2luZG93LmF0dGFjaEV2ZW50ICE9ICJ1 bmRlZmluZWQiICYmIFVGTy51YUhhcygiaWVXaW4iKSkgewoJd2luZG93LmF0dGFj aEV2ZW50KCJvbnVubG9hZCIsIFVGTy5jbGVhbnVwSUVMZWFrcyk7Cn0KCi8vIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vCUxpZ2h0Ym94 IHYyLjAyCi8vCWJ5IExva2VzaCBEaGFrYXIgLSBodHRwOi8vd3d3Lmh1ZGRsZXRv Z2V0aGVyLmNvbQovLwkzLzMxLzA2Ci8vCi8vCUZvciBtb3JlIGluZm9ybWF0aW9u IG9uIHRoaXMgc2NyaXB0LCB2aXNpdDoKLy8JaHR0cDovL2h1ZGRsZXRvZ2V0aGVy LmNvbS9wcm9qZWN0cy9saWdodGJveDIvCi8vCi8vCUxpY2Vuc2VkIHVuZGVyIHRo ZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNSBMaWNlbnNlIC0gaHR0 cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi41LwovLwovLwlD cmVkaXQgYWxzbyBkdWUgdG8gdGhvc2Ugd2hvIGhhdmUgaGVscGVkLCBpbnNwaXJl ZCwgYW5kIG1hZGUgdGhlaXIgY29kZSBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYy4K Ly8JSW5jbHVkaW5nOiBTY290dCBVcHRvbih1cHRvbmljLmNvbSksIFBldGVyLVBh dWwgS29jaChxdWlya3Ntb2RlLm9yZyksIFRob21hcyBGdWNocyhtaXIuYWN1bG8u dXMpLCBhbmQgb3RoZXJzLgovLwovLwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQovKgoKCVRhYmxlIG9mIENvbnRlbnRzCgktLS0tLS0tLS0t LS0tLS0tLQoJQ29uZmlndXJhdGlvbgoJR2xvYmFsIFZhcmlhYmxlcwoKCUV4dGVu ZGluZyBCdWlsdC1pbiBPYmplY3RzCgktIE9iamVjdC5leHRlbmQoRWxlbWVudCkK CS0gQXJyYXkucHJvdG90eXBlLnJlbW92ZUR1cGxpY2F0ZXMoKQoJLSBBcnJheS5w cm90b3R5cGUuZW1wdHkoKQoKCUxpZ2h0Ym94IENsYXNzIERlY2xhcmF0aW9uCgkt IGluaXRpYWxpemUoKQoJLSBzdGFydCgpCgktIGNoYW5nZUltYWdlKCkKCS0gcmVz aXplSW1hZ2VDb250YWluZXIoKQoJLSBzaG93SW1hZ2UoKQoJLSB1cGRhdGVEZXRh aWxzKCkKCS0gdXBkYXRlTmF2KCkKCS0gZW5hYmxlS2V5Ym9hcmROYXYoKQoJLSBk aXNhYmxlS2V5Ym9hcmROYXYoKQoJLSBrZXlib2FyZEFjdGlvbigpCgktIHByZWxv YWROZWlnaGJvckltYWdlcygpCgktIGVuZCgpCgoJTWlzY2VsbGFuZW91cyBGdW5j dGlvbnMKCS0gZ2V0UGFnZVNjcm9sbCgpCgktIGdldFBhZ2VTaXplKCkKCS0gZ2V0 S2V5KCkKCS0gbGlzdGVuS2V5KCkKCS0gc2hvd1NlbGVjdEJveGVzKCkKCS0gaGlk ZVNlbGVjdEJveGVzKCkKCS0gcGF1c2UoKQoJLSBpbml0TGlnaHRib3goKQoKCUZ1 bmN0aW9uIENhbGxzCgktIGFkZExvYWRFdmVudChpbml0TGlnaHRib3gpCgoqLwov LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8KLy8JQ29u ZmlndXJhdGlvbgovLwp2YXIgZmlsZUxvYWRpbmdJbWFnZSA9IGJvYXJkX3RlbXBs YXRlX3VybCArICdpbWcvbGlnaHRib3gvbG9hZGluZy5naWYnOwp2YXIgZmlsZUJv dHRvbU5hdkNsb3NlSW1hZ2UgPSBib2FyZF90ZW1wbGF0ZV91cmwgKyAnaW1nL2xp Z2h0Ym94L2Nsb3NlbGFiZWwuZ2lmJzsKCnZhciByZXNpemVTcGVlZCA9IDc7CS8v IGNvbnRyb2xzIHRoZSBzcGVlZCBvZiB0aGUgaW1hZ2UgcmVzaXppbmcgKDE9c2xv d2VzdCBhbmQgMTA9ZmFzdGVzdCkKCnZhciBib3JkZXJTaXplID0gMTA7CS8vaWYg eW91IGFkanVzdCB0aGUgcGFkZGluZyBpbiB0aGUgQ1NTLCB5b3Ugd2lsbCBuZWVk IHRvIHVwZGF0ZSB0aGlzIHZhcmlhYmxlCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQoKLy8KLy8JR2xvYmFsIFZhcmlhYmxlcwovLwp2YXIg aW1hZ2VBcnJheSA9IG5ldyBBcnJheTsKdmFyIGFjdGl2ZUltYWdlOwoKaWYocmVz aXplU3BlZWQgPiAxMCl7IHJlc2l6ZVNwZWVkID0gMTA7fQppZihyZXNpemVTcGVl ZCA8IDEpeyByZXNpemVTcGVlZCA9IDE7fQpyZXNpemVEdXJhdGlvbiA9ICgxMSAt IHJlc2l6ZVNwZWVkKSAqIDAuMTU7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQoKLy8KLy8JQWRkaXRpb25hbCBtZXRob2RzIGZvciBFbGVt ZW50IGFkZGVkIGJ5IFNVLCBDb3Vsb2lyCi8vCS0gZnVydGhlciBhZGRpdGlvbnMg YnkgTG9rZXNoIERoYWthciAoaHVkZGxldG9nZXRoZXIuY29tKQovLwpPYmplY3Qu ZXh0ZW5kKEVsZW1lbnQsIHsKCWdldFdpZHRoOiBmdW5jdGlvbihlbGVtZW50KSB7 CgkgICAJZWxlbWVudCA9ICQoZWxlbWVudCk7CgkgICAJcmV0dXJuIGVsZW1lbnQu b2Zmc2V0V2lkdGg7Cgl9LAoJc2V0V2lkdGg6IGZ1bmN0aW9uKGVsZW1lbnQsdykg ewoJICAgCWVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgCWVsZW1lbnQuc3R5bGUu d2lkdGggPSB3ICsicHgiOwoJfSwKCXNldEhlaWdodDogZnVuY3Rpb24oZWxlbWVu dCxoKSB7CiAgIAkJZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICAJZWxlbWVudC5z dHlsZS5oZWlnaHQgPSBoICsicHgiOwoJfSwKCXNldFRvcDogZnVuY3Rpb24oZWxl bWVudCx0KSB7CgkgICAJZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICAJZWxlbWVu dC5zdHlsZS50b3AgPSB0ICsicHgiOwoJfSwKCXNldFNyYzogZnVuY3Rpb24oZWxl bWVudCxzcmMpIHsKICAgIAllbGVtZW50ID0gJChlbGVtZW50KTsKICAgIAllbGVt ZW50LnNyYyA9IHNyYzsKCX0sCglzZXRIcmVmOiBmdW5jdGlvbihlbGVtZW50LGhy ZWYpIHsKICAgIAllbGVtZW50ID0gJChlbGVtZW50KTsKICAgIAllbGVtZW50Lmhy ZWYgPSBocmVmOwoJfSwKCXNldElubmVySFRNTDogZnVuY3Rpb24oZWxlbWVudCxj b250ZW50KSB7CgkJZWxlbWVudCA9ICQoZWxlbWVudCk7CgkJZWxlbWVudC5pbm5l ckhUTUwgPSBjb250ZW50OwoJfQp9KTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCgovLwovLwlFeHRlbmRpbmcgYnVpbHQtaW4gQXJyYXkg b2JqZWN0Ci8vCS0gYXJyYXkucmVtb3ZlRHVwbGljYXRlcygpCi8vCS0gYXJyYXku ZW1wdHkoKQovLwpBcnJheS5wcm90b3R5cGUucmVtb3ZlRHVwbGljYXRlcyA9IGZ1 bmN0aW9uICgpIHsKCWZvcihpID0gMTsgaSA8IHRoaXMubGVuZ3RoOyBpKyspewoJ CWlmKHRoaXNbaV1bMF0gPT0gdGhpc1tpLTFdWzBdKXsKCQkJdGhpcy5zcGxpY2Uo aSwxKTsKCQl9Cgl9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCgpBcnJheS5wcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbiAoKSB7Cglm b3IoaSA9IDA7IGkgPD0gdGhpcy5sZW5ndGg7IGkrKyl7CgkJdGhpcy5zaGlmdCgp OwoJfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoK Ly8KLy8JTGlnaHRib3ggQ2xhc3MgRGVjbGFyYXRpb24KLy8JLSBpbml0aWFsaXpl KCkKLy8JLSBzdGFydCgpCi8vCS0gY2hhbmdlSW1hZ2UoKQovLwktIHJlc2l6ZUlt YWdlQ29udGFpbmVyKCkKLy8JLSBzaG93SW1hZ2UoKQovLwktIHVwZGF0ZURldGFp bHMoKQovLwktIHVwZGF0ZU5hdigpCi8vCS0gZW5hYmxlS2V5Ym9hcmROYXYoKQov LwktIGRpc2FibGVLZXlib2FyZE5hdigpCi8vCS0ga2V5Ym9hcmROYXZBY3Rpb24o KQovLwktIHByZWxvYWROZWlnaGJvckltYWdlcygpCi8vCS0gZW5kKCkKLy8KLy8J U3RydWN0dXJpbmcgb2YgY29kZSBpbnNwaXJlZCBieSBTY290dCBVcHRvbiAoaHR0 cDovL3d3dy51cHRvbmljLmNvbS8pCi8vCnZhciBMaWdodGJveCA9IENsYXNzLmNy ZWF0ZSgpOwoKTGlnaHRib3gucHJvdG90eXBlID0gewoKCS8vIGluaXRpYWxpemUo KQoJLy8gQ29uc3RydWN0b3IgcnVucyBvbiBjb21wbGV0aW9uIG9mIHRoZSBET00g bG9hZGluZy4gTG9vcHMgdGhyb3VnaCBhbmNob3IgdGFncyBsb29raW5nIGZvcgoJ Ly8gJ2xpZ2h0Ym94JyByZWZlcmVuY2VzIGFuZCBhcHBsaWVzIG9uY2xpY2sgZXZl bnRzIHRvIGFwcHJvcHJpYXRlIGxpbmtzLiBUaGUgMm5kIHNlY3Rpb24gb2YKCS8v IHRoZSBmdW5jdGlvbiBpbnNlcnRzIGh0bWwgYXQgdGhlIGJvdHRvbSBvZiB0aGUg cGFnZSB3aGljaCBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIHNoYWRvdwoJLy8gb3Zl cmxheSBhbmQgdGhlIGltYWdlIGNvbnRhaW5lci4KCS8vCglpbml0aWFsaXplOiBm dW5jdGlvbigpIHsKCQlpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1l KXsgcmV0dXJuOyB9CgkJdmFyIGFuY2hvcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50 c0J5VGFnTmFtZSgnYScpOwoKCQkvLyBsb29wIHRocm91Z2ggYWxsIGFuY2hvciB0 YWdzCgkJZm9yICh2YXIgaT0wOyBpPGFuY2hvcnMubGVuZ3RoOyBpKyspewoJCQl2 YXIgYW5jaG9yID0gYW5jaG9yc1tpXTsKCgkJCXZhciByZWxBdHRyaWJ1dGUgPSBT dHJpbmcoYW5jaG9yLmdldEF0dHJpYnV0ZSgncmVsJykpOwoKCQkJLy8gdXNlIHRo ZSBzdHJpbmcubWF0Y2goKSBtZXRob2QgdG8gY2F0Y2ggJ2xpZ2h0Ym94JyByZWZl cmVuY2VzIGluIHRoZSByZWwgYXR0cmlidXRlCgkJCWlmIChhbmNob3IuZ2V0QXR0 cmlidXRlKCdocmVmJykgJiYgKHJlbEF0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpLm1h dGNoKCdsaWdodGJveCcpKSl7CgkJCQlhbmNob3Iub25jbGljayA9IGZ1bmN0aW9u ICgpIHtteUxpZ2h0Ym94LnN0YXJ0KHRoaXMpOyByZXR1cm4gZmFsc2U7fQoJCQl9 CgkJfQoKCQkvLyBUaGUgcmVzdCBvZiB0aGlzIGNvZGUgaW5zZXJ0cyBodG1sIGF0 IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UgdGhhdCBsb29rcyBzaW1pbGFyIHRvIHRo aXM6CgkJLy8KCQkvLwk8ZGl2IGlkPSJvdmVybGF5Ij48L2Rpdj4KCQkvLwk8ZGl2 IGlkPSJsaWdodGJveCI+CgkJLy8JCTxkaXYgaWQ9Im91dGVySW1hZ2VDb250YWlu ZXIiPgoJCS8vCQkJPGRpdiBpZD0iaW1hZ2VDb250YWluZXIiPgoJCS8vCQkJCTxp bWcgaWQ9ImxpZ2h0Ym94SW1hZ2UiPgoJCS8vCQkJCTxkaXYgc3R5bGU9IiIgaWQ9 ImhvdmVyTmF2Ij4KCQkvLwkJCQkJPGEgaHJlZj0iIyIgaWQ9InByZXZMaW5rIj48 L2E+CgkJLy8JCQkJCTxhIGhyZWY9IiMiIGlkPSJuZXh0TGluayI+PC9hPgoJCS8v CQkJCTwvZGl2PgoJCS8vCQkJCTxkaXYgaWQ9ImxvYWRpbmciPgoJCS8vCQkJCQk8 YSBocmVmPSIjIiBpZD0ibG9hZGluZ0xpbmsiPgoJCS8vCQkJCQkJPGltZyBzcmM9 ImltYWdlcy9sb2FkaW5nLmdpZiI+CgkJLy8JCQkJCTwvYT4KCQkvLwkJCQk8L2Rp dj4KCQkvLwkJCTwvZGl2PgoJCS8vCQk8L2Rpdj4KCQkvLwkJPGRpdiBpZD0iaW1h Z2VEYXRhQ29udGFpbmVyIj4KCQkvLwkJCTxkaXYgaWQ9ImltYWdlRGF0YSI+CgkJ Ly8JCQkJPGRpdiBpZD0iaW1hZ2VEZXRhaWxzIj4KCQkvLwkJCQkJPHNwYW4gaWQ9 ImNhcHRpb24iPjwvc3Bhbj4KCQkvLwkJCQkJPHNwYW4gaWQ9Im51bWJlckRpc3Bs YXkiPjwvc3Bhbj4KCQkvLwkJCQk8L2Rpdj4KCQkvLwkJCQk8ZGl2IGlkPSJib3R0 b21OYXYiPgoJCS8vCQkJCQk8YSBocmVmPSIjIiBpZD0iYm90dG9tTmF2Q2xvc2Ui PgoJCS8vCQkJCQkJPGltZyBzcmM9ImltYWdlcy9jbG9zZS5naWYiPgoJCS8vCQkJ CQk8L2E+CgkJLy8JCQkJPC9kaXY+CgkJLy8JCQk8L2Rpdj4KCQkvLwkJPC9kaXY+ CgkJLy8JPC9kaXY+CgoKCQl2YXIgb2JqQm9keSA9IGRvY3VtZW50LmdldEVsZW1l bnRzQnlUYWdOYW1lKCJib2R5IikuaXRlbSgwKTsKCgkJdmFyIG9iak92ZXJsYXkg PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQlvYmpPdmVybGF5LnNl dEF0dHJpYnV0ZSgnaWQnLCdvdmVybGF5Jyk7CgkJb2JqT3ZlcmxheS5zdHlsZS5k aXNwbGF5ID0gJ25vbmUnOwoJCW9iak92ZXJsYXkub25jbGljayA9IGZ1bmN0aW9u KCkgeyBteUxpZ2h0Ym94LmVuZCgpOyByZXR1cm4gZmFsc2U7IH0KCQlvYmpCb2R5 LmFwcGVuZENoaWxkKG9iak92ZXJsYXkpOwoKCQl2YXIgb2JqTGlnaHRib3ggPSBk b2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQlvYmpMaWdodGJveC5zZXRB dHRyaWJ1dGUoJ2lkJywnbGlnaHRib3gnKTsKCQlvYmpMaWdodGJveC5zdHlsZS5k aXNwbGF5ID0gJ25vbmUnOwoJCW9iakJvZHkuYXBwZW5kQ2hpbGQob2JqTGlnaHRi b3gpOwoKCQl2YXIgb2JqT3V0ZXJJbWFnZUNvbnRhaW5lciA9IGRvY3VtZW50LmNy ZWF0ZUVsZW1lbnQoImRpdiIpOwoJCW9iak91dGVySW1hZ2VDb250YWluZXIuc2V0 QXR0cmlidXRlKCdpZCcsJ291dGVySW1hZ2VDb250YWluZXInKTsKCQlvYmpMaWdo dGJveC5hcHBlbmRDaGlsZChvYmpPdXRlckltYWdlQ29udGFpbmVyKTsKCgkJdmFy IG9iakltYWdlQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2 Iik7CgkJb2JqSW1hZ2VDb250YWluZXIuc2V0QXR0cmlidXRlKCdpZCcsJ2ltYWdl Q29udGFpbmVyJyk7CgkJb2JqT3V0ZXJJbWFnZUNvbnRhaW5lci5hcHBlbmRDaGls ZChvYmpJbWFnZUNvbnRhaW5lcik7CgoJCXZhciBvYmpMaWdodGJveEltYWdlID0g ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7CgkJb2JqTGlnaHRib3hJbWFn ZS5zZXRBdHRyaWJ1dGUoJ2lkJywnbGlnaHRib3hJbWFnZScpOwoJCW9iakltYWdl Q29udGFpbmVyLmFwcGVuZENoaWxkKG9iakxpZ2h0Ym94SW1hZ2UpOwoKCQl2YXIg b2JqSG92ZXJOYXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQlv YmpIb3Zlck5hdi5zZXRBdHRyaWJ1dGUoJ2lkJywnaG92ZXJOYXYnKTsKCQlvYmpJ bWFnZUNvbnRhaW5lci5hcHBlbmRDaGlsZChvYmpIb3Zlck5hdik7CgoJCXZhciBv YmpQcmV2TGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKCQlvYmpQ cmV2TGluay5zZXRBdHRyaWJ1dGUoJ2lkJywncHJldkxpbmsnKTsKCQlvYmpQcmV2 TGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCcjJyk7CgkJb2JqSG92ZXJOYXYuYXBw ZW5kQ2hpbGQob2JqUHJldkxpbmspOwoKCQl2YXIgb2JqTmV4dExpbmsgPSBkb2N1 bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CgkJb2JqTmV4dExpbmsuc2V0QXR0cmli dXRlKCdpZCcsJ25leHRMaW5rJyk7CgkJb2JqTmV4dExpbmsuc2V0QXR0cmlidXRl KCdocmVmJywnIycpOwoJCW9iakhvdmVyTmF2LmFwcGVuZENoaWxkKG9iak5leHRM aW5rKTsKCgkJdmFyIG9iakxvYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50 KCJkaXYiKTsKCQlvYmpMb2FkaW5nLnNldEF0dHJpYnV0ZSgnaWQnLCdsb2FkaW5n Jyk7CgkJb2JqSW1hZ2VDb250YWluZXIuYXBwZW5kQ2hpbGQob2JqTG9hZGluZyk7 CgoJCXZhciBvYmpMb2FkaW5nTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo ImEiKTsKCQlvYmpMb2FkaW5nTGluay5zZXRBdHRyaWJ1dGUoJ2lkJywnbG9hZGlu Z0xpbmsnKTsKCQlvYmpMb2FkaW5nTGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCcj Jyk7CgkJb2JqTG9hZGluZ0xpbmsub25jbGljayA9IGZ1bmN0aW9uKCkgeyBteUxp Z2h0Ym94LmVuZCgpOyByZXR1cm4gZmFsc2U7IH0KCQlvYmpMb2FkaW5nLmFwcGVu ZENoaWxkKG9iakxvYWRpbmdMaW5rKTsKCgkJdmFyIG9iakxvYWRpbmdJbWFnZSA9 IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpOwoJCW9iakxvYWRpbmdJbWFn ZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIGZpbGVMb2FkaW5nSW1hZ2UpOwoJCW9iakxv YWRpbmdMaW5rLmFwcGVuZENoaWxkKG9iakxvYWRpbmdJbWFnZSk7CgoJCXZhciBv YmpJbWFnZURhdGFDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJk aXYiKTsKCQlvYmpJbWFnZURhdGFDb250YWluZXIuc2V0QXR0cmlidXRlKCdpZCcs J2ltYWdlRGF0YUNvbnRhaW5lcicpOwoJCW9iakltYWdlRGF0YUNvbnRhaW5lci5j bGFzc05hbWUgPSAnY2xlYXJmaXgnOwoJCW9iakxpZ2h0Ym94LmFwcGVuZENoaWxk KG9iakltYWdlRGF0YUNvbnRhaW5lcik7CgoJCXZhciBvYmpJbWFnZURhdGEgPSBk b2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQlvYmpJbWFnZURhdGEuc2V0 QXR0cmlidXRlKCdpZCcsJ2ltYWdlRGF0YScpOwoJCW9iakltYWdlRGF0YUNvbnRh aW5lci5hcHBlbmRDaGlsZChvYmpJbWFnZURhdGEpOwoKCQl2YXIgb2JqSW1hZ2VE ZXRhaWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgkJb2JqSW1h Z2VEZXRhaWxzLnNldEF0dHJpYnV0ZSgnaWQnLCdpbWFnZURldGFpbHMnKTsKCQlv YmpJbWFnZURhdGEuYXBwZW5kQ2hpbGQob2JqSW1hZ2VEZXRhaWxzKTsKCgkJdmFy IG9iakNhcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CgkJ b2JqQ2FwdGlvbi5zZXRBdHRyaWJ1dGUoJ2lkJywnY2FwdGlvbicpOwoJCW9iaklt YWdlRGV0YWlscy5hcHBlbmRDaGlsZChvYmpDYXB0aW9uKTsKCgkJdmFyIG9iak51 bWJlckRpc3BsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CgkJ b2JqTnVtYmVyRGlzcGxheS5zZXRBdHRyaWJ1dGUoJ2lkJywnbnVtYmVyRGlzcGxh eScpOwoJCW9iakltYWdlRGV0YWlscy5hcHBlbmRDaGlsZChvYmpOdW1iZXJEaXNw bGF5KTsKCgkJdmFyIG9iakJvdHRvbU5hdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l bnQoImRpdiIpOwoJCW9iakJvdHRvbU5hdi5zZXRBdHRyaWJ1dGUoJ2lkJywnYm90 dG9tTmF2Jyk7CgkJb2JqSW1hZ2VEYXRhLmFwcGVuZENoaWxkKG9iakJvdHRvbU5h dik7CgoJCXZhciBvYmpCb3R0b21OYXZDbG9zZUxpbmsgPSBkb2N1bWVudC5jcmVh dGVFbGVtZW50KCJhIik7CgkJb2JqQm90dG9tTmF2Q2xvc2VMaW5rLnNldEF0dHJp YnV0ZSgnaWQnLCdib3R0b21OYXZDbG9zZScpOwoJCW9iakJvdHRvbU5hdkNsb3Nl TGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCcjJyk7CgkJb2JqQm90dG9tTmF2Q2xv c2VMaW5rLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsgbXlMaWdodGJveC5lbmQoKTsg cmV0dXJuIGZhbHNlOyB9CgkJb2JqQm90dG9tTmF2LmFwcGVuZENoaWxkKG9iakJv dHRvbU5hdkNsb3NlTGluayk7CgoJCXZhciBvYmpCb3R0b21OYXZDbG9zZUltYWdl ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7CgkJb2JqQm90dG9tTmF2 Q2xvc2VJbWFnZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIGZpbGVCb3R0b21OYXZDbG9z ZUltYWdlKTsKCQlvYmpCb3R0b21OYXZDbG9zZUxpbmsuYXBwZW5kQ2hpbGQob2Jq Qm90dG9tTmF2Q2xvc2VJbWFnZSk7Cgl9LAoKCS8vCgkvLwlzdGFydCgpCgkvLwlE aXNwbGF5IG92ZXJsYXkgYW5kIGxpZ2h0Ym94LiBJZiBpbWFnZSBpcyBwYXJ0IG9m IGEgc2V0LCBhZGQgc2libGluZ3MgdG8gaW1hZ2VBcnJheS4KCS8vCglzdGFydDog ZnVuY3Rpb24oaW1hZ2VMaW5rKSB7CgoJCWhpZGVTZWxlY3RCb3hlcygpOwoKCQkv LyBzdHJldGNoIG92ZXJsYXkgdG8gZmlsbCBwYWdlIGFuZCBmYWRlIGluCgkJdmFy IGFycmF5UGFnZVNpemUgPSBnZXRQYWdlU2l6ZSgpOwoJCUVsZW1lbnQuc2V0SGVp Z2h0KCdvdmVybGF5JywgYXJyYXlQYWdlU2l6ZVsxXSk7CgkJbmV3IEVmZmVjdC5B cHBlYXIoJ292ZXJsYXknLCB7IGR1cmF0aW9uOiAwLjIsIGZyb206IDAuMCwgdG86 IDAuOCB9KTsKCgkJaW1hZ2VBcnJheSA9IFtdOwoJCWltYWdlTnVtID0gMDsKCgkJ aWYgKCFkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSl7IHJldHVybjsgfQoJ CXZhciBhbmNob3JzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2En KTsKCgkJLy8gaWYgaW1hZ2UgaXMgTk9UIHBhcnQgb2YgYSBzZXQuLgoJCWlmKChp bWFnZUxpbmsuZ2V0QXR0cmlidXRlKCdyZWwnKSA9PSAnbGlnaHRib3gnKSl7CgkJ CS8vIGFkZCBzaW5nbGUgaW1hZ2UgdG8gaW1hZ2VBcnJheQoJCQlpbWFnZUFycmF5 LnB1c2gobmV3IEFycmF5KGltYWdlTGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSwg aW1hZ2VMaW5rLmdldEF0dHJpYnV0ZSgndGl0bGUnKSkpOwoJCX0gZWxzZSB7CgkJ Ly8gaWYgaW1hZ2UgaXMgcGFydCBvZiBhIHNldC4uCgoJCQkvLyBsb29wIHRocm91 Z2ggYW5jaG9ycywgZmluZCBvdGhlciBpbWFnZXMgaW4gc2V0LCBhbmQgYWRkIHRo ZW0gdG8gaW1hZ2VBcnJheQoJCQlmb3IgKHZhciBpPTA7IGk8YW5jaG9ycy5sZW5n dGg7IGkrKyl7CgkJCQl2YXIgYW5jaG9yID0gYW5jaG9yc1tpXTsKCQkJCWlmIChh bmNob3IuZ2V0QXR0cmlidXRlKCdocmVmJykgJiYgKGFuY2hvci5nZXRBdHRyaWJ1 dGUoJ3JlbCcpID09IGltYWdlTGluay5nZXRBdHRyaWJ1dGUoJ3JlbCcpKSl7CgkJ CQkJaW1hZ2VBcnJheS5wdXNoKG5ldyBBcnJheShhbmNob3IuZ2V0QXR0cmlidXRl KCdocmVmJyksIGFuY2hvci5nZXRBdHRyaWJ1dGUoJ3RpdGxlJykpKTsKCQkJCX0K CQkJfQoJCQlpbWFnZUFycmF5LnJlbW92ZUR1cGxpY2F0ZXMoKTsKCQkJd2hpbGUo aW1hZ2VBcnJheVtpbWFnZU51bV1bMF0gIT0gaW1hZ2VMaW5rLmdldEF0dHJpYnV0 ZSgnaHJlZicpKSB7IGltYWdlTnVtKys7fQoJCX0KCgkJLy8gY2FsY3VsYXRlIHRv cCBvZmZzZXQgZm9yIHRoZSBsaWdodGJveCBhbmQgZGlzcGxheQoJCXZhciBhcnJh eVBhZ2VTaXplID0gZ2V0UGFnZVNpemUoKTsKCQl2YXIgYXJyYXlQYWdlU2Nyb2xs ID0gZ2V0UGFnZVNjcm9sbCgpOwoJCXZhciBsaWdodGJveFRvcCA9IGFycmF5UGFn ZVNjcm9sbFsxXSArIChhcnJheVBhZ2VTaXplWzNdIC8gMTUpOwoKCQlFbGVtZW50 LnNldFRvcCgnbGlnaHRib3gnLCBsaWdodGJveFRvcCk7CgkJRWxlbWVudC5zaG93 KCdsaWdodGJveCcpOwoKCQl0aGlzLmNoYW5nZUltYWdlKGltYWdlTnVtKTsKCX0s CgoJLy8KCS8vCWNoYW5nZUltYWdlKCkKCS8vCUhpZGUgbW9zdCBlbGVtZW50cyBh bmQgcHJlbG9hZCBpbWFnZSBpbiBwcmVwYXJhdGlvbiBmb3IgcmVzaXppbmcgaW1h Z2UgY29udGFpbmVyLgoJLy8KCWNoYW5nZUltYWdlOiBmdW5jdGlvbihpbWFnZU51 bSkgewoKCQlhY3RpdmVJbWFnZSA9IGltYWdlTnVtOwkvLyB1cGRhdGUgZ2xvYmFs IHZhcgoKCQkvLyBoaWRlIGVsZW1lbnRzIGR1cmluZyB0cmFuc2l0aW9uCgkJRWxl bWVudC5zaG93KCdsb2FkaW5nJyk7CgkJRWxlbWVudC5oaWRlKCdsaWdodGJveElt YWdlJyk7CgkJRWxlbWVudC5oaWRlKCdob3Zlck5hdicpOwoJCUVsZW1lbnQuaGlk ZSgncHJldkxpbmsnKTsKCQlFbGVtZW50LmhpZGUoJ25leHRMaW5rJyk7CgkJRWxl bWVudC5oaWRlKCdpbWFnZURhdGFDb250YWluZXInKTsKCQlFbGVtZW50LmhpZGUo J251bWJlckRpc3BsYXknKTsKCgkJaW1nUHJlbG9hZGVyID0gbmV3IEltYWdlKCk7 CgoJCS8vIG9uY2UgaW1hZ2UgaXMgcHJlbG9hZGVkLCByZXNpemUgaW1hZ2UgY29u dGFpbmVyCgkJaW1nUHJlbG9hZGVyLm9ubG9hZD1mdW5jdGlvbigpewoJCQlFbGVt ZW50LnNldFNyYygnbGlnaHRib3hJbWFnZScsIGltYWdlQXJyYXlbYWN0aXZlSW1h Z2VdWzBdKTsKCQkJbXlMaWdodGJveC5yZXNpemVJbWFnZUNvbnRhaW5lcihpbWdQ cmVsb2FkZXIud2lkdGgsIGltZ1ByZWxvYWRlci5oZWlnaHQpOwoJCX0KCQlpbWdQ cmVsb2FkZXIuc3JjID0gaW1hZ2VBcnJheVthY3RpdmVJbWFnZV1bMF07Cgl9LAoK CS8vCgkvLwlyZXNpemVJbWFnZUNvbnRhaW5lcigpCgkvLwoJcmVzaXplSW1hZ2VD b250YWluZXI6IGZ1bmN0aW9uKCBpbWdXaWR0aCwgaW1nSGVpZ2h0KSB7CgoJCS8v IGdldCBjdXJyZW50IGhlaWdodCBhbmQgd2lkdGgKCQl0aGlzLndDdXIgPSBFbGVt ZW50LmdldFdpZHRoKCdvdXRlckltYWdlQ29udGFpbmVyJyk7CgkJdGhpcy5oQ3Vy ID0gRWxlbWVudC5nZXRIZWlnaHQoJ291dGVySW1hZ2VDb250YWluZXInKTsKCgkJ Ly8gc2NhbGFycyBiYXNlZCBvbiBjaGFuZ2UgZnJvbSBvbGQgdG8gbmV3CgkJdGhp cy54U2NhbGUgPSAoKGltZ1dpZHRoICArIChib3JkZXJTaXplICogMikpIC8gdGhp cy53Q3VyKSAqIDEwMDsKCQl0aGlzLnlTY2FsZSA9ICgoaW1nSGVpZ2h0ICArIChi b3JkZXJTaXplICogMikpIC8gdGhpcy5oQ3VyKSAqIDEwMDsKCgkJLy8gY2FsY3Vs YXRlIHNpemUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5ldyBhbmQgb2xkIGltYWdlLCBh bmQgcmVzaXplIGlmIG5lY2Vzc2FyeQoJCXdEaWZmID0gKHRoaXMud0N1ciAtIGJv cmRlclNpemUgKiAyKSAtIGltZ1dpZHRoOwoJCWhEaWZmID0gKHRoaXMuaEN1ciAt IGJvcmRlclNpemUgKiAyKSAtIGltZ0hlaWdodDsKCgkJaWYoISggaERpZmYgPT0g MCkpeyBuZXcgRWZmZWN0LlNjYWxlKCdvdXRlckltYWdlQ29udGFpbmVyJywgdGhp cy55U2NhbGUsIHtzY2FsZVg6IGZhbHNlLCBkdXJhdGlvbjogcmVzaXplRHVyYXRp b24sIHF1ZXVlOiAnZnJvbnQnfSk7IH0KCQlpZighKCB3RGlmZiA9PSAwKSl7IG5l dyBFZmZlY3QuU2NhbGUoJ291dGVySW1hZ2VDb250YWluZXInLCB0aGlzLnhTY2Fs ZSwge3NjYWxlWTogZmFsc2UsIGRlbGF5OiByZXNpemVEdXJhdGlvbiwgZHVyYXRp b246IHJlc2l6ZUR1cmF0aW9ufSk7IH0KCgkJLy8gaWYgbmV3IGFuZCBvbGQgaW1h Z2UgYXJlIHNhbWUgc2l6ZSBhbmQgbm8gc2NhbGluZyB0cmFuc2l0aW9uIGlzIG5l Y2Vzc2FyeSwKCQkvLyBkbyBhIHF1aWNrIHBhdXNlIHRvIHByZXZlbnQgaW1hZ2Ug ZmxpY2tlci4KCQlpZigoaERpZmYgPT0gMCkgJiYgKHdEaWZmID09IDApKXsKCQkJ aWYgKG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoIk1TSUUiKSE9LTEpeyBw YXVzZSgyNTApOyB9IGVsc2UgeyBwYXVzZSgxMDApO30KCQl9CgoJCUVsZW1lbnQu c2V0SGVpZ2h0KCdwcmV2TGluaycsIGltZ0hlaWdodCk7CgkJRWxlbWVudC5zZXRI ZWlnaHQoJ25leHRMaW5rJywgaW1nSGVpZ2h0KTsKCQlFbGVtZW50LnNldFdpZHRo KCAnaW1hZ2VEYXRhQ29udGFpbmVyJywgaW1nV2lkdGggKyAoYm9yZGVyU2l6ZSAq IDIpKTsKCgkJdGhpcy5zaG93SW1hZ2UoKTsKCX0sCgoJLy8KCS8vCXNob3dJbWFn ZSgpCgkvLwlEaXNwbGF5IGltYWdlIGFuZCBiZWdpbiBwcmVsb2FkaW5nIG5laWdo Ym9ycy4KCS8vCglzaG93SW1hZ2U6IGZ1bmN0aW9uKCl7CgkJRWxlbWVudC5oaWRl KCdsb2FkaW5nJyk7CgkJbmV3IEVmZmVjdC5BcHBlYXIoJ2xpZ2h0Ym94SW1hZ2Un LCB7IGR1cmF0aW9uOiAwLjUsIHF1ZXVlOiAnZW5kJywgYWZ0ZXJGaW5pc2g6IGZ1 bmN0aW9uKCl7CW15TGlnaHRib3gudXBkYXRlRGV0YWlscygpOyB9IH0pOwoJCXRo aXMucHJlbG9hZE5laWdoYm9ySW1hZ2VzKCk7Cgl9LAoKCS8vCgkvLwl1cGRhdGVE ZXRhaWxzKCkKCS8vCURpc3BsYXkgY2FwdGlvbiwgaW1hZ2UgbnVtYmVyLCBhbmQg Ym90dG9tIG5hdi4KCS8vCgl1cGRhdGVEZXRhaWxzOiBmdW5jdGlvbigpIHsKCgkJ RWxlbWVudC5zaG93KCdjYXB0aW9uJyk7CgkJRWxlbWVudC5zZXRJbm5lckhUTUwo ICdjYXB0aW9uJywgaW1hZ2VBcnJheVthY3RpdmVJbWFnZV1bMV0pOwoKCQkvLyBp ZiBpbWFnZSBpcyBwYXJ0IG9mIHNldCBkaXNwbGF5ICdJbWFnZSB4IG9mIHgnCgkJ aWYoaW1hZ2VBcnJheS5sZW5ndGggPiAxKXsKCQkJRWxlbWVudC5zaG93KCdudW1i ZXJEaXNwbGF5Jyk7CgkJCWlmIChkb2N1bWVudC5ib2R5LmNsYXNzTmFtZS5pbmRl eE9mKCdzaXRlLWxvY2FsZS1lbl9VUycpICE9PSAwKQoJCQkJRWxlbWVudC5zZXRJ bm5lckhUTUwoICdudW1iZXJEaXNwbGF5JywgIkltYWdlICIgKyBldmFsKGFjdGl2 ZUltYWdlICsgMSkgKyAiIG9mICIgKyBpbWFnZUFycmF5Lmxlbmd0aCk7CgkJCWVs c2UKCQkJCUVsZW1lbnQuc2V0SW5uZXJIVE1MKCAnbnVtYmVyRGlzcGxheScsICJB ZmJlZWxkaW5nICIgKyBldmFsKGFjdGl2ZUltYWdlICsgMSkgKyAiIHZhbiAiICsg aW1hZ2VBcnJheS5sZW5ndGgpOwoKCQl9CgoJCW5ldyBFZmZlY3QuUGFyYWxsZWwo CgkJCVsgbmV3IEVmZmVjdC5TbGlkZURvd24oICdpbWFnZURhdGFDb250YWluZXIn LCB7IHN5bmM6IHRydWUsIGR1cmF0aW9uOiByZXNpemVEdXJhdGlvbiArIDAuMjUs IGZyb206IDAuMCwgdG86IDEuMCB9KSwKCQkJICBuZXcgRWZmZWN0LkFwcGVhcign aW1hZ2VEYXRhQ29udGFpbmVyJywgeyBzeW5jOiB0cnVlLCBkdXJhdGlvbjogMS4w IH0pIF0sCgkJCXsgZHVyYXRpb246IDAuNjUsIGFmdGVyRmluaXNoOiBmdW5jdGlv bigpIHsgbXlMaWdodGJveC51cGRhdGVOYXYoKTt9IH0KCQkpOwoJfSwKCgkvLwoJ Ly8JdXBkYXRlTmF2KCkKCS8vCURpc3BsYXkgYXBwcm9wcmlhdGUgcHJldmlvdXMg YW5kIG5leHQgaG92ZXIgbmF2aWdhdGlvbi4KCS8vCgl1cGRhdGVOYXY6IGZ1bmN0 aW9uKCkgewoKCQlFbGVtZW50LnNob3coJ2hvdmVyTmF2Jyk7CgoJCS8vIGlmIG5v dCBmaXJzdCBpbWFnZSBpbiBzZXQsIGRpc3BsYXkgcHJldiBpbWFnZSBidXR0b24K CQlpZihhY3RpdmVJbWFnZSAhPSAwKXsKCQkJRWxlbWVudC5zaG93KCdwcmV2TGlu aycpOwoJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldkxpbmsnKS5vbmNs aWNrID0gZnVuY3Rpb24oKSB7CgkJCQlteUxpZ2h0Ym94LmNoYW5nZUltYWdlKGFj dGl2ZUltYWdlIC0gMSk7IHJldHVybiBmYWxzZTsKCQkJfQoJCX0KCgkJLy8gaWYg bm90IGxhc3QgaW1hZ2UgaW4gc2V0LCBkaXNwbGF5IG5leHQgaW1hZ2UgYnV0dG9u CgkJaWYoYWN0aXZlSW1hZ2UgIT0gKGltYWdlQXJyYXkubGVuZ3RoIC0gMSkpewoJ CQlFbGVtZW50LnNob3coJ25leHRMaW5rJyk7CgkJCWRvY3VtZW50LmdldEVsZW1l bnRCeUlkKCduZXh0TGluaycpLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKCQkJCW15 TGlnaHRib3guY2hhbmdlSW1hZ2UoYWN0aXZlSW1hZ2UgKyAxKTsgcmV0dXJuIGZh bHNlOwoJCQl9CgkJfQoKCQl0aGlzLmVuYWJsZUtleWJvYXJkTmF2KCk7Cgl9LAoK CS8vCgkvLwllbmFibGVLZXlib2FyZE5hdigpCgkvLwoJZW5hYmxlS2V5Ym9hcmRO YXY6IGZ1bmN0aW9uKCkgewoJCWRvY3VtZW50Lm9ua2V5ZG93biA9IHRoaXMua2V5 Ym9hcmRBY3Rpb247Cgl9LAoKCS8vCgkvLwlkaXNhYmxlS2V5Ym9hcmROYXYoKQoJ Ly8KCWRpc2FibGVLZXlib2FyZE5hdjogZnVuY3Rpb24oKSB7CgkJZG9jdW1lbnQu b25rZXlkb3duID0gJyc7Cgl9LAoKCS8vCgkvLwlrZXlib2FyZEFjdGlvbigpCgkv LwoJa2V5Ym9hcmRBY3Rpb246IGZ1bmN0aW9uKGUpIHsKCQlpZiAoZSA9PSBudWxs KSB7IC8vIGllCgkJCWtleWNvZGUgPSBldmVudC5rZXlDb2RlOwoJCX0gZWxzZSB7 IC8vIG1vemlsbGEKCQkJa2V5Y29kZSA9IGUud2hpY2g7CgkJfQoKCQlrZXkgPSBT dHJpbmcuZnJvbUNoYXJDb2RlKGtleWNvZGUpLnRvTG93ZXJDYXNlKCk7CgoJCWlm KChrZXkgPT0gJ3gnKSB8fCAoa2V5ID09ICdvJykgfHwgKGtleSA9PSAnYycpKXsJ Ly8gY2xvc2UgbGlnaHRib3gKCQkJbXlMaWdodGJveC5lbmQoKTsKCQl9IGVsc2Ug aWYoa2V5ID09ICdwJyl7CS8vIGRpc3BsYXkgcHJldmlvdXMgaW1hZ2UKCQkJaWYo YWN0aXZlSW1hZ2UgIT0gMCl7CgkJCQlteUxpZ2h0Ym94LmRpc2FibGVLZXlib2Fy ZE5hdigpOwoJCQkJbXlMaWdodGJveC5jaGFuZ2VJbWFnZShhY3RpdmVJbWFnZSAt IDEpOwoJCQl9CgkJfSBlbHNlIGlmKGtleSA9PSAnbicpewkvLyBkaXNwbGF5IG5l eHQgaW1hZ2UKCQkJaWYoYWN0aXZlSW1hZ2UgIT0gKGltYWdlQXJyYXkubGVuZ3Ro IC0gMSkpewoJCQkJbXlMaWdodGJveC5kaXNhYmxlS2V5Ym9hcmROYXYoKTsKCQkJ CW15TGlnaHRib3guY2hhbmdlSW1hZ2UoYWN0aXZlSW1hZ2UgKyAxKTsKCQkJfQoJ CX0KCgoJfSwKCgkvLwoJLy8JcHJlbG9hZE5laWdoYm9ySW1hZ2VzKCkKCS8vCVBy ZWxvYWQgcHJldmlvdXMgYW5kIG5leHQgaW1hZ2VzLgoJLy8KCXByZWxvYWROZWln aGJvckltYWdlczogZnVuY3Rpb24oKXsKCgkJaWYoKGltYWdlQXJyYXkubGVuZ3Ro IC0gMSkgPiBhY3RpdmVJbWFnZSl7CgkJCXByZWxvYWROZXh0SW1hZ2UgPSBuZXcg SW1hZ2UoKTsKCQkJcHJlbG9hZE5leHRJbWFnZS5zcmMgPSBpbWFnZUFycmF5W2Fj dGl2ZUltYWdlICsgMV1bMF07CgkJfQoJCWlmKGFjdGl2ZUltYWdlID4gMCl7CgkJ CXByZWxvYWRQcmV2SW1hZ2UgPSBuZXcgSW1hZ2UoKTsKCQkJcHJlbG9hZFByZXZJ bWFnZS5zcmMgPSBpbWFnZUFycmF5W2FjdGl2ZUltYWdlIC0gMV1bMF07CgkJfQoK CX0sCgoJLy8KCS8vCWVuZCgpCgkvLwoJZW5kOiBmdW5jdGlvbigpIHsKCQl0aGlz LmRpc2FibGVLZXlib2FyZE5hdigpOwoJCUVsZW1lbnQuaGlkZSgnbGlnaHRib3gn KTsKCQluZXcgRWZmZWN0LkZhZGUoJ292ZXJsYXknLCB7IGR1cmF0aW9uOiAwLjJ9 KTsKCQlzaG93U2VsZWN0Qm94ZXMoKTsKCX0KfQoKLy8gLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vCi8vIGdldFBhZ2VTY3JvbGwoKQovLyBS ZXR1cm5zIGFycmF5IHdpdGggeCx5IHBhZ2Ugc2Nyb2xsIHZhbHVlcy4KLy8gQ29y ZSBjb2RlIGZyb20gLSBxdWlya3Ntb2RlLm9yZwovLwpmdW5jdGlvbiBnZXRQYWdl U2Nyb2xsKCl7CgoJdmFyIHlTY3JvbGw7CgoJaWYgKHNlbGYucGFnZVlPZmZzZXQp IHsKCQl5U2Nyb2xsID0gc2VsZi5wYWdlWU9mZnNldDsKCX0gZWxzZSBpZiAoZG9j dW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVu dC5zY3JvbGxUb3ApewkgLy8gRXhwbG9yZXIgNiBTdHJpY3QKCQl5U2Nyb2xsID0g ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsKCX0gZWxzZSBpZiAo ZG9jdW1lbnQuYm9keSkgey8vIGFsbCBvdGhlciBFeHBsb3JlcnMKCQl5U2Nyb2xs ID0gZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7Cgl9CgoJYXJyYXlQYWdlU2Nyb2xs ID0gbmV3IEFycmF5KCcnLHlTY3JvbGwpCglyZXR1cm4gYXJyYXlQYWdlU2Nyb2xs Owp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8K Ly8gZ2V0UGFnZVNpemUoKQovLyBSZXR1cm5zIGFycmF5IHdpdGggcGFnZSB3aWR0 aCwgaGVpZ2h0IGFuZCB3aW5kb3cgd2lkdGgsIGhlaWdodAovLyBDb3JlIGNvZGUg ZnJvbSAtIHF1aXJrc21vZGUub3JnCi8vIEVkaXQgZm9yIEZpcmVmb3ggYnkgcEhh ZXoKLy8KZnVuY3Rpb24gZ2V0UGFnZVNpemUoKXsKCgl2YXIgeFNjcm9sbCwgeVNj cm9sbDsKCglpZiAod2luZG93LmlubmVySGVpZ2h0ICYmIHdpbmRvdy5zY3JvbGxN YXhZKSB7CgkJeFNjcm9sbCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGg7CgkJ eVNjcm9sbCA9IHdpbmRvdy5pbm5lckhlaWdodCArIHdpbmRvdy5zY3JvbGxNYXhZ OwoJfSBlbHNlIGlmIChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCA+IGRvY3Vt ZW50LmJvZHkub2Zmc2V0SGVpZ2h0KXsgLy8gYWxsIGJ1dCBFeHBsb3JlciBNYWMK CQl4U2Nyb2xsID0gZG9jdW1lbnQuYm9keS5zY3JvbGxXaWR0aDsKCQl5U2Nyb2xs ID0gZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQ7Cgl9IGVsc2UgeyAvLyBFeHBs b3JlciBNYWMuLi53b3VsZCBhbHNvIHdvcmsgaW4gRXhwbG9yZXIgNiBTdHJpY3Qs IE1vemlsbGEgYW5kIFNhZmFyaQoJCXhTY3JvbGwgPSBkb2N1bWVudC5ib2R5Lm9m ZnNldFdpZHRoOwoJCXlTY3JvbGwgPSBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdo dDsKCX0KCgl2YXIgd2luZG93V2lkdGgsIHdpbmRvd0hlaWdodDsKCWlmIChzZWxm LmlubmVySGVpZ2h0KSB7CS8vIGFsbCBleGNlcHQgRXhwbG9yZXIKCQl3aW5kb3dX aWR0aCA9IHNlbGYuaW5uZXJXaWR0aDsKCQl3aW5kb3dIZWlnaHQgPSBzZWxmLmlu bmVySGVpZ2h0OwoJfSBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQg JiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkgeyAvLyBF eHBsb3JlciA2IFN0cmljdCBNb2RlCgkJd2luZG93V2lkdGggPSBkb2N1bWVudC5k b2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7CgkJd2luZG93SGVpZ2h0ID0gZG9j dW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDsKCX0gZWxzZSBpZiAo ZG9jdW1lbnQuYm9keSkgeyAvLyBvdGhlciBFeHBsb3JlcnMKCQl3aW5kb3dXaWR0 aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7CgkJd2luZG93SGVpZ2h0ID0g ZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7Cgl9CgoJLy8gZm9yIHNtYWxsIHBh Z2VzIHdpdGggdG90YWwgaGVpZ2h0IGxlc3MgdGhlbiBoZWlnaHQgb2YgdGhlIHZp ZXdwb3J0CglpZih5U2Nyb2xsIDwgd2luZG93SGVpZ2h0KXsKCQlwYWdlSGVpZ2h0 ID0gd2luZG93SGVpZ2h0OwoJfSBlbHNlIHsKCQlwYWdlSGVpZ2h0ID0geVNjcm9s bDsKCX0KCgkvLyBmb3Igc21hbGwgcGFnZXMgd2l0aCB0b3RhbCB3aWR0aCBsZXNz IHRoZW4gd2lkdGggb2YgdGhlIHZpZXdwb3J0CglpZih4U2Nyb2xsIDwgd2luZG93 V2lkdGgpewoJCXBhZ2VXaWR0aCA9IHdpbmRvd1dpZHRoOwoJfSBlbHNlIHsKCQlw YWdlV2lkdGggPSB4U2Nyb2xsOwoJfQoKCglhcnJheVBhZ2VTaXplID0gbmV3IEFy cmF5KHBhZ2VXaWR0aCxwYWdlSGVpZ2h0LHdpbmRvd1dpZHRoLHdpbmRvd0hlaWdo dCkKCXJldHVybiBhcnJheVBhZ2VTaXplOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8KLy8gZ2V0S2V5KGtleSkKLy8gR2V0cyBr ZXljb2RlLiBJZiAneCcgaXMgcHJlc3NlZCB0aGVuIGl0IGhpZGVzIHRoZSBsaWdo dGJveC4KLy8KZnVuY3Rpb24gZ2V0S2V5KGUpewoJaWYgKGUgPT0gbnVsbCkgeyAv LyBpZQoJCWtleWNvZGUgPSBldmVudC5rZXlDb2RlOwoJfSBlbHNlIHsgLy8gbW96 aWxsYQoJCWtleWNvZGUgPSBlLndoaWNoOwoJfQoJa2V5ID0gU3RyaW5nLmZyb21D aGFyQ29kZShrZXljb2RlKS50b0xvd2VyQ2FzZSgpOwoKCWlmKGtleSA9PSAneCcp ewoJfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoK Ly8KLy8gbGlzdGVuS2V5KCkKLy8KZnVuY3Rpb24gbGlzdGVuS2V5ICgpIHsJZG9j dW1lbnQub25rZXlwcmVzcyA9IGdldEtleTsgfQoKLy8gLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiBz aG93U2VsZWN0Qm94ZXMoKXsKCXNlbGVjdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50 c0J5VGFnTmFtZSgic2VsZWN0Iik7Cglmb3IgKGkgPSAwOyBpICE9IHNlbGVjdHMu bGVuZ3RoOyBpKyspIHsKCQlzZWxlY3RzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAi dmlzaWJsZSI7Cgl9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuY3Rpb24gaGlkZVNlbGVjdEJveGVz KCl7CglzZWxlY3RzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNl bGVjdCIpOwoJZm9yIChpID0gMDsgaSAhPSBzZWxlY3RzLmxlbmd0aDsgaSsrKSB7 CgkJc2VsZWN0c1tpXS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7Cgl9Cn0K Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQoKLy8KLy8gcGF1c2UobnVtYmVyTWlsbGlzKQovLyBQYXVzZXMgY29k ZSBleGVjdXRpb24gZm9yIHNwZWNpZmllZCB0aW1lLiBVc2VzIGJ1c3kgY29kZSwg bm90IGdvb2QuCi8vIENvZGUgZnJvbSBodHRwOi8vd3d3LmZhcXRzLmNvbS9rbm93 bGVkZ2VfYmFzZS92aWV3LnBodG1sL2FpZC8xNjAyCi8vCmZ1bmN0aW9uIHBhdXNl KG51bWJlck1pbGxpcykgewoJdmFyIG5vdyA9IG5ldyBEYXRlKCk7Cgl2YXIgZXhp dFRpbWUgPSBub3cuZ2V0VGltZSgpICsgbnVtYmVyTWlsbGlzOwoJd2hpbGUgKHRy dWUpIHsKCQlub3cgPSBuZXcgRGF0ZSgpOwoJCWlmIChub3cuZ2V0VGltZSgpID4g ZXhpdFRpbWUpCgkJCXJldHVybjsKCX0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCmZ1bmN0aW9uIGlu aXRMaWdodGJveCgpIHsgbXlMaWdodGJveCA9IG5ldyBMaWdodGJveCgpOyB9CkV2 ZW50Lm9ic2VydmUod2luZG93LCAnbG9hZCcsIGluaXRMaWdodGJveCwgZmFsc2Up OwovLyBDb3B5cmlnaHQgKGMpIDIwMDUgVGhvbWFzIEZ1Y2hzIChodHRwOi8vc2Ny aXB0LmFjdWxvLnVzLCBodHRwOi8vbWlyLmFjdWxvLnVzKQovLyBDb250cmlidXRv cnM6Ci8vICBKdXN0aW4gUGFsbWVyIChodHRwOi8vZW5jeXRlbWVkaWEuY29tLykK Ly8gIE1hcmsgUGlsZ3JpbSAoaHR0cDovL2RpdmVpbnRvbWFyay5vcmcvKQovLyAg TWFydGluIEJpYWxhc2lua2kKLy8gCi8vIFNlZSBzY3JpcHRhY3Vsb3VzLmpzIGZv ciBmdWxsIGxpY2Vuc2UuICAKCi8qIC0tLS0tLS0tLS0tLS0gZWxlbWVudCBleHQg LS0tLS0tLS0tLS0tLS0gKi8gIAogCi8vIGNvbnZlcnRzIHJnYigpIGFuZCAjeHh4 IHRvICN4eHh4eHggZm9ybWF0LCAgCi8vIHJldHVybnMgc2VsZiAob3IgZmlyc3Qg YXJndW1lbnQpIGlmIG5vdCBjb252ZXJ0YWJsZSAgClN0cmluZy5wcm90b3R5cGUu cGFyc2VDb2xvciA9IGZ1bmN0aW9uKCkgeyAgCiAgdmFyIGNvbG9yID0gJyMnOyAg CiAgaWYodGhpcy5zbGljZSgwLDQpID09ICdyZ2IoJykgeyAgCiAgICB2YXIgY29s cyA9IHRoaXMuc2xpY2UoNCx0aGlzLmxlbmd0aC0xKS5zcGxpdCgnLCcpOyAgCiAg ICB2YXIgaT0wOyBkbyB7IGNvbG9yICs9IHBhcnNlSW50KGNvbHNbaV0pLnRvQ29s b3JQYXJ0KCkgfSB3aGlsZSAoKytpPDMpOyAgCiAgfSBlbHNlIHsgIAogICAgaWYo dGhpcy5zbGljZSgwLDEpID09ICcjJykgeyAgCiAgICAgIGlmKHRoaXMubGVuZ3Ro PT00KSBmb3IodmFyIGk9MTtpPDQ7aSsrKSBjb2xvciArPSAodGhpcy5jaGFyQXQo aSkgKyB0aGlzLmNoYXJBdChpKSkudG9Mb3dlckNhc2UoKTsgIAogICAgICBpZih0 aGlzLmxlbmd0aD09NykgY29sb3IgPSB0aGlzLnRvTG93ZXJDYXNlKCk7ICAKICAg IH0gIAogIH0gIAogIHJldHVybihjb2xvci5sZW5ndGg9PTcgPyBjb2xvciA6IChh cmd1bWVudHNbMF0gfHwgdGhpcykpOyAgCn0KCkVsZW1lbnQuY29sbGVjdFRleHRO b2RlcyA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsgIAogIHJldHVybiAkQSgkKGVsZW1l bnQpLmNoaWxkTm9kZXMpLmNvbGxlY3QoIGZ1bmN0aW9uKG5vZGUpIHsKICAgIHJl dHVybiAobm9kZS5ub2RlVHlwZT09MyA/IG5vZGUubm9kZVZhbHVlIDogCiAgICAg IChub2RlLmhhc0NoaWxkTm9kZXMoKSA/IEVsZW1lbnQuY29sbGVjdFRleHROb2Rl cyhub2RlKSA6ICcnKSk7CiAgfSkuZmxhdHRlbigpLmpvaW4oJycpOwp9CgpFbGVt ZW50LmNvbGxlY3RUZXh0Tm9kZXNJZ25vcmVDbGFzcyA9IGZ1bmN0aW9uKGVsZW1l bnQsIGNsYXNzTmFtZSkgeyAgCiAgcmV0dXJuICRBKCQoZWxlbWVudCkuY2hpbGRO b2RlcykuY29sbGVjdCggZnVuY3Rpb24obm9kZSkgewogICAgcmV0dXJuIChub2Rl Lm5vZGVUeXBlPT0zID8gbm9kZS5ub2RlVmFsdWUgOiAKICAgICAgKChub2RlLmhh c0NoaWxkTm9kZXMoKSAmJiAhRWxlbWVudC5oYXNDbGFzc05hbWUobm9kZSxjbGFz c05hbWUpKSA/IAogICAgICAgIEVsZW1lbnQuY29sbGVjdFRleHROb2Rlcyhub2Rl KSA6ICcnKSk7CiAgfSkuZmxhdHRlbigpLmpvaW4oJycpOwp9CgpFbGVtZW50LnNl dFN0eWxlID0gZnVuY3Rpb24oZWxlbWVudCwgc3R5bGUpIHsKICBlbGVtZW50ID0g JChlbGVtZW50KTsKICBmb3IoayBpbiBzdHlsZSkgZWxlbWVudC5zdHlsZVtrLmNh bWVsaXplKCldID0gc3R5bGVba107Cn0KCkVsZW1lbnQuc2V0Q29udGVudFpvb20g PSBmdW5jdGlvbihlbGVtZW50LCBwZXJjZW50KSB7ICAKICBFbGVtZW50LnNldFN0 eWxlKGVsZW1lbnQsIHtmb250U2l6ZTogKHBlcmNlbnQvMTAwKSArICdlbSd9KTsg ICAKICBpZihuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCdBcHBsZVdlYktp dCcpPjApIHdpbmRvdy5zY3JvbGxCeSgwLDApOyAgCn0KCkVsZW1lbnQuZ2V0T3Bh Y2l0eSA9IGZ1bmN0aW9uKGVsZW1lbnQpeyAgCiAgdmFyIG9wYWNpdHk7CiAgaWYg KG9wYWNpdHkgPSBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdvcGFjaXR5Jykp ICAKICAgIHJldHVybiBwYXJzZUZsb2F0KG9wYWNpdHkpOyAgCiAgaWYgKG9wYWNp dHkgPSAoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAnZmlsdGVyJykgfHwgJycp Lm1hdGNoKC9hbHBoYVwob3BhY2l0eT0oLiopXCkvKSkgIAogICAgaWYob3BhY2l0 eVsxXSkgcmV0dXJuIHBhcnNlRmxvYXQob3BhY2l0eVsxXSkgLyAxMDA7ICAKICBy ZXR1cm4gMS4wOyAgCn0KCkVsZW1lbnQuc2V0T3BhY2l0eSA9IGZ1bmN0aW9uKGVs ZW1lbnQsIHZhbHVlKXsgIAogIGVsZW1lbnQ9ICQoZWxlbWVudCk7ICAKICBpZiAo dmFsdWUgPT0gMSl7CiAgICBFbGVtZW50LnNldFN0eWxlKGVsZW1lbnQsIHsgb3Bh Y2l0eTogCiAgICAgICgvR2Vja28vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkg JiYgIS9Lb25xdWVyb3J8U2FmYXJpfEtIVE1MLy50ZXN0KG5hdmlnYXRvci51c2Vy QWdlbnQpKSA/IAogICAgICAwLjk5OTk5OSA6IG51bGwgfSk7CiAgICBpZigvTVNJ RS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgIAogICAgICBFbGVtZW50LnNl dFN0eWxlKGVsZW1lbnQsIHtmaWx0ZXI6IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVu dCwnZmlsdGVyJykucmVwbGFjZSgvYWxwaGFcKFteXCldKlwpL2dpLCcnKX0pOyAg CiAgfSBlbHNlIHsgIAogICAgaWYodmFsdWUgPCAwLjAwMDAxKSB2YWx1ZSA9IDA7 ICAKICAgIEVsZW1lbnQuc2V0U3R5bGUoZWxlbWVudCwge29wYWNpdHk6IHZhbHVl fSk7CiAgICBpZigvTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgIAog ICAgIEVsZW1lbnQuc2V0U3R5bGUoZWxlbWVudCwgCiAgICAgICB7IGZpbHRlcjog RWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCdmaWx0ZXInKS5yZXBsYWNlKC9hbHBo YVwoW15cKV0qXCkvZ2ksJycpICsKICAgICAgICAgICAgICAgICAnYWxwaGEob3Bh Y2l0eT0nK3ZhbHVlKjEwMCsnKScgfSk7ICAKICB9ICAgCn0gIAogCkVsZW1lbnQu Z2V0SW5saW5lT3BhY2l0eSA9IGZ1bmN0aW9uKGVsZW1lbnQpeyAgCiAgcmV0dXJu ICQoZWxlbWVudCkuc3R5bGUub3BhY2l0eSB8fCAnJzsKfSAgCgpFbGVtZW50LmNo aWxkcmVuV2l0aENsYXNzTmFtZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFt ZSkgeyAgCiAgcmV0dXJuICRBKCQoZWxlbWVudCkuZ2V0RWxlbWVudHNCeVRhZ05h bWUoJyonKSkuc2VsZWN0KAogICAgZnVuY3Rpb24oYykgeyByZXR1cm4gRWxlbWVu dC5oYXNDbGFzc05hbWUoYywgY2xhc3NOYW1lKSB9KTsKfQoKQXJyYXkucHJvdG90 eXBlLmNhbGwgPSBmdW5jdGlvbigpIHsKICB2YXIgYXJncyA9IGFyZ3VtZW50czsK ICB0aGlzLmVhY2goZnVuY3Rpb24oZil7IGYuYXBwbHkodGhpcywgYXJncykgfSk7 Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdmFyIEVmZmVjdCA9 IHsKICB0YWdpZnlUZXh0OiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICB2YXIgdGFn aWZ5U3R5bGUgPSAncG9zaXRpb246cmVsYXRpdmUnOwogICAgaWYoL01TSUUvLnRl c3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHRhZ2lmeVN0eWxlICs9ICc7em9vbTox JzsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgJEEoZWxlbWVudC5jaGls ZE5vZGVzKS5lYWNoKCBmdW5jdGlvbihjaGlsZCkgewogICAgICBpZihjaGlsZC5u b2RlVHlwZT09MykgewogICAgICAgIGNoaWxkLm5vZGVWYWx1ZS50b0FycmF5KCku ZWFjaCggZnVuY3Rpb24oY2hhcmFjdGVyKSB7CiAgICAgICAgICBlbGVtZW50Lmlu c2VydEJlZm9yZSgKICAgICAgICAgICAgQnVpbGRlci5ub2RlKCdzcGFuJyx7c3R5 bGU6IHRhZ2lmeVN0eWxlfSwKICAgICAgICAgICAgICBjaGFyYWN0ZXIgPT0gJyAn ID8gU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApIDogY2hhcmFjdGVyKSwgCiAgICAg ICAgICAgICAgY2hpbGQpOwogICAgICAgIH0pOwogICAgICAgIEVsZW1lbnQucmVt b3ZlKGNoaWxkKTsKICAgICAgfQogICAgfSk7CiAgfSwKICBtdWx0aXBsZTogZnVu Y3Rpb24oZWxlbWVudCwgZWZmZWN0KSB7CiAgICB2YXIgZWxlbWVudHM7CiAgICBp ZigoKHR5cGVvZiBlbGVtZW50ID09ICdvYmplY3QnKSB8fCAKICAgICAgICAodHlw ZW9mIGVsZW1lbnQgPT0gJ2Z1bmN0aW9uJykpICYmIAogICAgICAgKGVsZW1lbnQu bGVuZ3RoKSkKICAgICAgZWxlbWVudHMgPSBlbGVtZW50OwogICAgZWxzZQogICAg ICBlbGVtZW50cyA9ICQoZWxlbWVudCkuY2hpbGROb2RlczsKICAgICAgCiAgICB2 YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoewogICAgICBzcGVlZDogMC4xLAog ICAgICBkZWxheTogMC4wCiAgICB9LCBhcmd1bWVudHNbMl0gfHwge30pOwogICAg dmFyIG1hc3RlckRlbGF5ID0gb3B0aW9ucy5kZWxheTsKCiAgICAkQShlbGVtZW50 cykuZWFjaCggZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHsKICAgICAgbmV3IGVm ZmVjdChlbGVtZW50LCBPYmplY3QuZXh0ZW5kKG9wdGlvbnMsIHsgZGVsYXk6IGlu ZGV4ICogb3B0aW9ucy5zcGVlZCArIG1hc3RlckRlbGF5IH0pKTsKICAgIH0pOwog IH0sCiAgUEFJUlM6IHsKICAgICdzbGlkZSc6ICBbJ1NsaWRlRG93bicsJ1NsaWRl VXAnXSwKICAgICdibGluZCc6ICBbJ0JsaW5kRG93bicsJ0JsaW5kVXAnXSwKICAg ICdhcHBlYXInOiBbJ0FwcGVhcicsJ0ZhZGUnXQogIH0sCiAgdG9nZ2xlOiBmdW5j dGlvbihlbGVtZW50LCBlZmZlY3QpIHsKICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQp OwogICAgZWZmZWN0ID0gKGVmZmVjdCB8fCAnYXBwZWFyJykudG9Mb3dlckNhc2Uo KTsKICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7CiAgICAgIHF1ZXVl OiB7IHBvc2l0aW9uOidlbmQnLCBzY29wZTooZWxlbWVudC5pZCB8fCAnZ2xvYmFs JykgfQogICAgfSwgYXJndW1lbnRzWzJdIHx8IHt9KTsKICAgIEVmZmVjdFtFbGVt ZW50LnZpc2libGUoZWxlbWVudCkgPyAKICAgICAgRWZmZWN0LlBBSVJTW2VmZmVj dF1bMV0gOiBFZmZlY3QuUEFJUlNbZWZmZWN0XVswXV0oZWxlbWVudCwgb3B0aW9u cyk7CiAgfQp9OwoKdmFyIEVmZmVjdDIgPSBFZmZlY3Q7IC8vIGRlcHJlY2F0ZWQK Ci8qIC0tLS0tLS0tLS0tLS0gdHJhbnNpdGlvbnMgLS0tLS0tLS0tLS0tLSAqLwoK RWZmZWN0LlRyYW5zaXRpb25zID0ge30KCkVmZmVjdC5UcmFuc2l0aW9ucy5saW5l YXIgPSBmdW5jdGlvbihwb3MpIHsKICByZXR1cm4gcG9zOwp9CkVmZmVjdC5UcmFu c2l0aW9ucy5zaW5vaWRhbCA9IGZ1bmN0aW9uKHBvcykgewogIHJldHVybiAoLU1h dGguY29zKHBvcypNYXRoLlBJKS8yKSArIDAuNTsKfQpFZmZlY3QuVHJhbnNpdGlv bnMucmV2ZXJzZSAgPSBmdW5jdGlvbihwb3MpIHsKICByZXR1cm4gMS1wb3M7Cn0K RWZmZWN0LlRyYW5zaXRpb25zLmZsaWNrZXIgPSBmdW5jdGlvbihwb3MpIHsKICBy ZXR1cm4gKCgtTWF0aC5jb3MocG9zKk1hdGguUEkpLzQpICsgMC43NSkgKyBNYXRo LnJhbmRvbSgpLzQ7Cn0KRWZmZWN0LlRyYW5zaXRpb25zLndvYmJsZSA9IGZ1bmN0 aW9uKHBvcykgewogIHJldHVybiAoLU1hdGguY29zKHBvcypNYXRoLlBJKig5KnBv cykpLzIpICsgMC41Owp9CkVmZmVjdC5UcmFuc2l0aW9ucy5wdWxzZSA9IGZ1bmN0 aW9uKHBvcykgewogIHJldHVybiAoTWF0aC5mbG9vcihwb3MqMTApICUgMiA9PSAw ID8gCiAgICAocG9zKjEwLU1hdGguZmxvb3IocG9zKjEwKSkgOiAxLShwb3MqMTAt TWF0aC5mbG9vcihwb3MqMTApKSk7Cn0KRWZmZWN0LlRyYW5zaXRpb25zLm5vbmUg PSBmdW5jdGlvbihwb3MpIHsKICByZXR1cm4gMDsKfQpFZmZlY3QuVHJhbnNpdGlv bnMuZnVsbCA9IGZ1bmN0aW9uKHBvcykgewogIHJldHVybiAxOwp9CgovKiAtLS0t LS0tLS0tLS0tIGNvcmUgZWZmZWN0cyAtLS0tLS0tLS0tLS0tICovCgpFZmZlY3Qu U2NvcGVkUXVldWUgPSBDbGFzcy5jcmVhdGUoKTsKT2JqZWN0LmV4dGVuZChPYmpl Y3QuZXh0ZW5kKEVmZmVjdC5TY29wZWRRdWV1ZS5wcm90b3R5cGUsIEVudW1lcmFi bGUpLCB7CiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVmZmVj dHMgID0gW107CiAgICB0aGlzLmludGVydmFsID0gbnVsbDsKICB9LAogIF9lYWNo OiBmdW5jdGlvbihpdGVyYXRvcikgewogICAgdGhpcy5lZmZlY3RzLl9lYWNoKGl0 ZXJhdG9yKTsKICB9LAogIGFkZDogZnVuY3Rpb24oZWZmZWN0KSB7CiAgICB2YXIg dGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAKICAgIHZhciBw b3NpdGlvbiA9ICh0eXBlb2YgZWZmZWN0Lm9wdGlvbnMucXVldWUgPT0gJ3N0cmlu ZycpID8gCiAgICAgIGVmZmVjdC5vcHRpb25zLnF1ZXVlIDogZWZmZWN0Lm9wdGlv bnMucXVldWUucG9zaXRpb247CiAgICAKICAgIHN3aXRjaChwb3NpdGlvbikgewog ICAgICBjYXNlICdmcm9udCc6CiAgICAgICAgLy8gbW92ZSB1bnN0YXJ0ZWQgZWZm ZWN0cyBhZnRlciB0aGlzIGVmZmVjdCAgCiAgICAgICAgdGhpcy5lZmZlY3RzLmZp bmRBbGwoZnVuY3Rpb24oZSl7IHJldHVybiBlLnN0YXRlPT0naWRsZScgfSkuZWFj aCggZnVuY3Rpb24oZSkgewogICAgICAgICAgICBlLnN0YXJ0T24gICs9IGVmZmVj dC5maW5pc2hPbjsKICAgICAgICAgICAgZS5maW5pc2hPbiArPSBlZmZlY3QuZmlu aXNoT247CiAgICAgICAgICB9KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAn ZW5kJzoKICAgICAgICAvLyBzdGFydCBlZmZlY3QgYWZ0ZXIgbGFzdCBxdWV1ZWQg ZWZmZWN0IGhhcyBmaW5pc2hlZAogICAgICAgIHRpbWVzdGFtcCA9IHRoaXMuZWZm ZWN0cy5wbHVjaygnZmluaXNoT24nKS5tYXgoKSB8fCB0aW1lc3RhbXA7CiAgICAg ICAgYnJlYWs7CiAgICB9CiAgICAKICAgIGVmZmVjdC5zdGFydE9uICArPSB0aW1l c3RhbXA7CiAgICBlZmZlY3QuZmluaXNoT24gKz0gdGltZXN0YW1wOwogICAgdGhp cy5lZmZlY3RzLnB1c2goZWZmZWN0KTsKICAgIGlmKCF0aGlzLmludGVydmFsKSAK ICAgICAgdGhpcy5pbnRlcnZhbCA9IHNldEludGVydmFsKHRoaXMubG9vcC5iaW5k KHRoaXMpLCA0MCk7CiAgfSwKICByZW1vdmU6IGZ1bmN0aW9uKGVmZmVjdCkgewog ICAgdGhpcy5lZmZlY3RzID0gdGhpcy5lZmZlY3RzLnJlamVjdChmdW5jdGlvbihl KSB7IHJldHVybiBlPT1lZmZlY3QgfSk7CiAgICBpZih0aGlzLmVmZmVjdHMubGVu Z3RoID09IDApIHsKICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTsK ICAgICAgdGhpcy5pbnRlcnZhbCA9IG51bGw7CiAgICB9CiAgfSwKICBsb29wOiBm dW5jdGlvbigpIHsKICAgIHZhciB0aW1lUG9zID0gbmV3IERhdGUoKS5nZXRUaW1l KCk7CiAgICB0aGlzLmVmZmVjdHMuaW52b2tlKCdsb29wJywgdGltZVBvcyk7CiAg fQp9KTsKCkVmZmVjdC5RdWV1ZXMgPSB7CiAgaW5zdGFuY2VzOiAkSCgpLAogIGdl dDogZnVuY3Rpb24ocXVldWVOYW1lKSB7CiAgICBpZih0eXBlb2YgcXVldWVOYW1l ICE9ICdzdHJpbmcnKSByZXR1cm4gcXVldWVOYW1lOwogICAgCiAgICBpZighdGhp cy5pbnN0YW5jZXNbcXVldWVOYW1lXSkKICAgICAgdGhpcy5pbnN0YW5jZXNbcXVl dWVOYW1lXSA9IG5ldyBFZmZlY3QuU2NvcGVkUXVldWUoKTsKICAgICAgCiAgICBy ZXR1cm4gdGhpcy5pbnN0YW5jZXNbcXVldWVOYW1lXTsKICB9Cn0KRWZmZWN0LlF1 ZXVlID0gRWZmZWN0LlF1ZXVlcy5nZXQoJ2dsb2JhbCcpOwoKRWZmZWN0LkRlZmF1 bHRPcHRpb25zID0gewogIHRyYW5zaXRpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5z aW5vaWRhbCwKICBkdXJhdGlvbjogICAxLjAsICAgLy8gc2Vjb25kcwogIGZwczog ICAgICAgIDI1LjAsICAvLyBtYXguIDI1ZnBzIGR1ZSB0byBFZmZlY3QuUXVldWUg aW1wbGVtZW50YXRpb24KICBzeW5jOiAgICAgICBmYWxzZSwgLy8gdHJ1ZSBmb3Ig Y29tYmluaW5nCiAgZnJvbTogICAgICAgMC4wLAogIHRvOiAgICAgICAgIDEuMCwK ICBkZWxheTogICAgICAwLjAsCiAgcXVldWU6ICAgICAgJ3BhcmFsbGVsJwp9CgpF ZmZlY3QuQmFzZSA9IGZ1bmN0aW9uKCkge307CkVmZmVjdC5CYXNlLnByb3RvdHlw ZSA9IHsKICBwb3NpdGlvbjogbnVsbCwKICBzdGFydDogZnVuY3Rpb24ob3B0aW9u cykgewogICAgdGhpcy5vcHRpb25zICAgICAgPSBPYmplY3QuZXh0ZW5kKE9iamVj dC5leHRlbmQoe30sRWZmZWN0LkRlZmF1bHRPcHRpb25zKSwgb3B0aW9ucyB8fCB7 fSk7CiAgICB0aGlzLmN1cnJlbnRGcmFtZSA9IDA7CiAgICB0aGlzLnN0YXRlICAg ICAgICA9ICdpZGxlJzsKICAgIHRoaXMuc3RhcnRPbiAgICAgID0gdGhpcy5vcHRp b25zLmRlbGF5KjEwMDA7CiAgICB0aGlzLmZpbmlzaE9uICAgICA9IHRoaXMuc3Rh cnRPbiArICh0aGlzLm9wdGlvbnMuZHVyYXRpb24qMTAwMCk7CiAgICB0aGlzLmV2 ZW50KCdiZWZvcmVTdGFydCcpOwogICAgaWYoIXRoaXMub3B0aW9ucy5zeW5jKQog ICAgICBFZmZlY3QuUXVldWVzLmdldCh0eXBlb2YgdGhpcy5vcHRpb25zLnF1ZXVl ID09ICdzdHJpbmcnID8gCiAgICAgICAgJ2dsb2JhbCcgOiB0aGlzLm9wdGlvbnMu cXVldWUuc2NvcGUpLmFkZCh0aGlzKTsKICB9LAogIGxvb3A6IGZ1bmN0aW9uKHRp bWVQb3MpIHsKICAgIGlmKHRpbWVQb3MgPj0gdGhpcy5zdGFydE9uKSB7CiAgICAg IGlmKHRpbWVQb3MgPj0gdGhpcy5maW5pc2hPbikgewogICAgICAgIHRoaXMucmVu ZGVyKDEuMCk7CiAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICB0aGlzLmV2 ZW50KCdiZWZvcmVGaW5pc2gnKTsKICAgICAgICBpZih0aGlzLmZpbmlzaCkgdGhp cy5maW5pc2goKTsgCiAgICAgICAgdGhpcy5ldmVudCgnYWZ0ZXJGaW5pc2gnKTsK ICAgICAgICByZXR1cm47ICAKICAgICAgfQogICAgICB2YXIgcG9zICAgPSAodGlt ZVBvcyAtIHRoaXMuc3RhcnRPbikgLyAodGhpcy5maW5pc2hPbiAtIHRoaXMuc3Rh cnRPbik7CiAgICAgIHZhciBmcmFtZSA9IE1hdGgucm91bmQocG9zICogdGhpcy5v cHRpb25zLmZwcyAqIHRoaXMub3B0aW9ucy5kdXJhdGlvbik7CiAgICAgIGlmKGZy YW1lID4gdGhpcy5jdXJyZW50RnJhbWUpIHsKICAgICAgICB0aGlzLnJlbmRlcihw b3MpOwogICAgICAgIHRoaXMuY3VycmVudEZyYW1lID0gZnJhbWU7CiAgICAgIH0K ICAgIH0KICB9LAogIHJlbmRlcjogZnVuY3Rpb24ocG9zKSB7CiAgICBpZih0aGlz LnN0YXRlID09ICdpZGxlJykgewogICAgICB0aGlzLnN0YXRlID0gJ3J1bm5pbmcn OwogICAgICB0aGlzLmV2ZW50KCdiZWZvcmVTZXR1cCcpOwogICAgICBpZih0aGlz LnNldHVwKSB0aGlzLnNldHVwKCk7CiAgICAgIHRoaXMuZXZlbnQoJ2FmdGVyU2V0 dXAnKTsKICAgIH0KICAgIGlmKHRoaXMuc3RhdGUgPT0gJ3J1bm5pbmcnKSB7CiAg ICAgIGlmKHRoaXMub3B0aW9ucy50cmFuc2l0aW9uKSBwb3MgPSB0aGlzLm9wdGlv bnMudHJhbnNpdGlvbihwb3MpOwogICAgICBwb3MgKj0gKHRoaXMub3B0aW9ucy50 by10aGlzLm9wdGlvbnMuZnJvbSk7CiAgICAgIHBvcyArPSB0aGlzLm9wdGlvbnMu ZnJvbTsKICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvczsKICAgICAgdGhpcy5ldmVu dCgnYmVmb3JlVXBkYXRlJyk7CiAgICAgIGlmKHRoaXMudXBkYXRlKSB0aGlzLnVw ZGF0ZShwb3MpOwogICAgICB0aGlzLmV2ZW50KCdhZnRlclVwZGF0ZScpOwogICAg fQogIH0sCiAgY2FuY2VsOiBmdW5jdGlvbigpIHsKICAgIGlmKCF0aGlzLm9wdGlv bnMuc3luYykKICAgICAgRWZmZWN0LlF1ZXVlcy5nZXQodHlwZW9mIHRoaXMub3B0 aW9ucy5xdWV1ZSA9PSAnc3RyaW5nJyA/IAogICAgICAgICdnbG9iYWwnIDogdGhp cy5vcHRpb25zLnF1ZXVlLnNjb3BlKS5yZW1vdmUodGhpcyk7CiAgICB0aGlzLnN0 YXRlID0gJ2ZpbmlzaGVkJzsKICB9LAogIGV2ZW50OiBmdW5jdGlvbihldmVudE5h bWUpIHsKICAgIGlmKHRoaXMub3B0aW9uc1tldmVudE5hbWUgKyAnSW50ZXJuYWwn XSkgdGhpcy5vcHRpb25zW2V2ZW50TmFtZSArICdJbnRlcm5hbCddKHRoaXMpOwog ICAgaWYodGhpcy5vcHRpb25zW2V2ZW50TmFtZV0pIHRoaXMub3B0aW9uc1tldmVu dE5hbWVdKHRoaXMpOwogIH0sCiAgaW5zcGVjdDogZnVuY3Rpb24oKSB7CiAgICBy ZXR1cm4gJyM8RWZmZWN0OicgKyAkSCh0aGlzKS5pbnNwZWN0KCkgKyAnLG9wdGlv bnM6JyArICRIKHRoaXMub3B0aW9ucykuaW5zcGVjdCgpICsgJz4nOwogIH0KfQoK RWZmZWN0LlBhcmFsbGVsID0gQ2xhc3MuY3JlYXRlKCk7Ck9iamVjdC5leHRlbmQo T2JqZWN0LmV4dGVuZChFZmZlY3QuUGFyYWxsZWwucHJvdG90eXBlLCBFZmZlY3Qu QmFzZS5wcm90b3R5cGUpLCB7CiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWZmZWN0 cykgewogICAgdGhpcy5lZmZlY3RzID0gZWZmZWN0cyB8fCBbXTsKICAgIHRoaXMu c3RhcnQoYXJndW1lbnRzWzFdKTsKICB9LAogIHVwZGF0ZTogZnVuY3Rpb24ocG9z aXRpb24pIHsKICAgIHRoaXMuZWZmZWN0cy5pbnZva2UoJ3JlbmRlcicsIHBvc2l0 aW9uKTsKICB9LAogIGZpbmlzaDogZnVuY3Rpb24ocG9zaXRpb24pIHsKICAgIHRo aXMuZWZmZWN0cy5lYWNoKCBmdW5jdGlvbihlZmZlY3QpIHsKICAgICAgZWZmZWN0 LnJlbmRlcigxLjApOwogICAgICBlZmZlY3QuY2FuY2VsKCk7CiAgICAgIGVmZmVj dC5ldmVudCgnYmVmb3JlRmluaXNoJyk7CiAgICAgIGlmKGVmZmVjdC5maW5pc2gp IGVmZmVjdC5maW5pc2gocG9zaXRpb24pOwogICAgICBlZmZlY3QuZXZlbnQoJ2Fm dGVyRmluaXNoJyk7CiAgICB9KTsKICB9Cn0pOwoKRWZmZWN0Lk9wYWNpdHkgPSBD bGFzcy5jcmVhdGUoKTsKT2JqZWN0LmV4dGVuZChPYmplY3QuZXh0ZW5kKEVmZmVj dC5PcGFjaXR5LnByb3RvdHlwZSwgRWZmZWN0LkJhc2UucHJvdG90eXBlKSwgewog IGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIHRoaXMuZWxlbWVu dCA9ICQoZWxlbWVudCk7CiAgICAvLyBtYWtlIHRoaXMgd29yayBvbiBJRSBvbiBl bGVtZW50cyB3aXRob3V0ICdsYXlvdXQnCiAgICBpZigvTVNJRS8udGVzdChuYXZp Z2F0b3IudXNlckFnZW50KSAmJiAoIXRoaXMuZWxlbWVudC5oYXNMYXlvdXQpKQog ICAgICBFbGVtZW50LnNldFN0eWxlKHRoaXMuZWxlbWVudCwge3pvb206IDF9KTsK ICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7CiAgICAgIGZyb206IEVs ZW1lbnQuZ2V0T3BhY2l0eSh0aGlzLmVsZW1lbnQpIHx8IDAuMCwKICAgICAgdG86 ICAgMS4wCiAgICB9LCBhcmd1bWVudHNbMV0gfHwge30pOwogICAgdGhpcy5zdGFy dChvcHRpb25zKTsKICB9LAogIHVwZGF0ZTogZnVuY3Rpb24ocG9zaXRpb24pIHsK ICAgIEVsZW1lbnQuc2V0T3BhY2l0eSh0aGlzLmVsZW1lbnQsIHBvc2l0aW9uKTsK ICB9Cn0pOwoKRWZmZWN0Lk1vdmUgPSBDbGFzcy5jcmVhdGUoKTsKT2JqZWN0LmV4 dGVuZChPYmplY3QuZXh0ZW5kKEVmZmVjdC5Nb3ZlLnByb3RvdHlwZSwgRWZmZWN0 LkJhc2UucHJvdG90eXBlKSwgewogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1l bnQpIHsKICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgICB2YXIgb3B0 aW9ucyA9IE9iamVjdC5leHRlbmQoewogICAgICB4OiAgICAwLAogICAgICB5OiAg ICAwLAogICAgICBtb2RlOiAncmVsYXRpdmUnCiAgICB9LCBhcmd1bWVudHNbMV0g fHwge30pOwogICAgdGhpcy5zdGFydChvcHRpb25zKTsKICB9LAogIHNldHVwOiBm dW5jdGlvbigpIHsKICAgIC8vIEJ1ZyBpbiBPcGVyYTogT3BlcmEgcmV0dXJucyB0 aGUgInJlYWwiIHBvc2l0aW9uIG9mIGEgc3RhdGljIGVsZW1lbnQgb3IKICAgIC8v IHJlbGF0aXZlIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBoYXZlIHRvcC9sZWZ0IGV4 cGxpY2l0bHkgc2V0LgogICAgLy8gPT0+IEFsd2F5cyBzZXQgdG9wIGFuZCBsZWZ0 IGZvciBwb3NpdGlvbiByZWxhdGl2ZSBlbGVtZW50cyBpbiB5b3VyIHN0eWxlc2hl ZXRzIAogICAgLy8gKHRvIDAgaWYgeW91IGRvIG5vdCBuZWVkIHRoZW0pIAogICAg RWxlbWVudC5tYWtlUG9zaXRpb25lZCh0aGlzLmVsZW1lbnQpOwogICAgdGhpcy5v cmlnaW5hbExlZnQgPSBwYXJzZUZsb2F0KEVsZW1lbnQuZ2V0U3R5bGUodGhpcy5l bGVtZW50LCdsZWZ0JykgfHwgJzAnKTsKICAgIHRoaXMub3JpZ2luYWxUb3AgID0g cGFyc2VGbG9hdChFbGVtZW50LmdldFN0eWxlKHRoaXMuZWxlbWVudCwndG9wJykg IHx8ICcwJyk7CiAgICBpZih0aGlzLm9wdGlvbnMubW9kZSA9PSAnYWJzb2x1dGUn KSB7CiAgICAgIC8vIGFic29sdXRlIG1vdmVtZW50LCBzbyB3ZSBuZWVkIHRvIGNh bGMgZGVsdGFYIGFuZCBkZWx0YVkKICAgICAgdGhpcy5vcHRpb25zLnggPSB0aGlz Lm9wdGlvbnMueCAtIHRoaXMub3JpZ2luYWxMZWZ0OwogICAgICB0aGlzLm9wdGlv bnMueSA9IHRoaXMub3B0aW9ucy55IC0gdGhpcy5vcmlnaW5hbFRvcDsKICAgIH0K ICB9LAogIHVwZGF0ZTogZnVuY3Rpb24ocG9zaXRpb24pIHsKICAgIEVsZW1lbnQu c2V0U3R5bGUodGhpcy5lbGVtZW50LCB7CiAgICAgIGxlZnQ6IHRoaXMub3B0aW9u cy54ICAqIHBvc2l0aW9uICsgdGhpcy5vcmlnaW5hbExlZnQgKyAncHgnLAogICAg ICB0b3A6ICB0aGlzLm9wdGlvbnMueSAgKiBwb3NpdGlvbiArIHRoaXMub3JpZ2lu YWxUb3AgICsgJ3B4JwogICAgfSk7CiAgfQp9KTsKCi8vIGZvciBiYWNrd2FyZHMg Y29tcGF0aWJpbGl0eQpFZmZlY3QuTW92ZUJ5ID0gZnVuY3Rpb24oZWxlbWVudCwg dG9Ub3AsIHRvTGVmdCkgewogIHJldHVybiBuZXcgRWZmZWN0Lk1vdmUoZWxlbWVu dCwgCiAgICBPYmplY3QuZXh0ZW5kKHsgeDogdG9MZWZ0LCB5OiB0b1RvcCB9LCBh cmd1bWVudHNbM10gfHwge30pKTsKfTsKCkVmZmVjdC5TY2FsZSA9IENsYXNzLmNy ZWF0ZSgpOwpPYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoRWZmZWN0LlNjYWxl LnByb3RvdHlwZSwgRWZmZWN0LkJhc2UucHJvdG90eXBlKSwgewogIGluaXRpYWxp emU6IGZ1bmN0aW9uKGVsZW1lbnQsIHBlcmNlbnQpIHsKICAgIHRoaXMuZWxlbWVu dCA9ICQoZWxlbWVudCkKICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7 CiAgICAgIHNjYWxlWDogdHJ1ZSwKICAgICAgc2NhbGVZOiB0cnVlLAogICAgICBz Y2FsZUNvbnRlbnQ6IHRydWUsCiAgICAgIHNjYWxlRnJvbUNlbnRlcjogZmFsc2Us CiAgICAgIHNjYWxlTW9kZTogJ2JveCcsICAgICAgICAvLyAnYm94JyBvciAnY29u dGVudHMnIG9yIHt9IHdpdGggcHJvdmlkZWQgdmFsdWVzCiAgICAgIHNjYWxlRnJv bTogMTAwLjAsCiAgICAgIHNjYWxlVG86ICAgcGVyY2VudAogICAgfSwgYXJndW1l bnRzWzJdIHx8IHt9KTsKICAgIHRoaXMuc3RhcnQob3B0aW9ucyk7CiAgfSwKICBz ZXR1cDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlc3RvcmVBZnRlckZpbmlzaCA9 IHRoaXMub3B0aW9ucy5yZXN0b3JlQWZ0ZXJGaW5pc2ggfHwgZmFsc2U7CiAgICB0 aGlzLmVsZW1lbnRQb3NpdGlvbmluZyA9IEVsZW1lbnQuZ2V0U3R5bGUodGhpcy5l bGVtZW50LCdwb3NpdGlvbicpOwogICAgCiAgICB0aGlzLm9yaWdpbmFsU3R5bGUg PSB7fTsKICAgIFsndG9wJywnbGVmdCcsJ3dpZHRoJywnaGVpZ2h0JywnZm9udFNp emUnXS5lYWNoKCBmdW5jdGlvbihrKSB7CiAgICAgIHRoaXMub3JpZ2luYWxTdHls ZVtrXSA9IHRoaXMuZWxlbWVudC5zdHlsZVtrXTsKICAgIH0uYmluZCh0aGlzKSk7 CiAgICAgIAogICAgdGhpcy5vcmlnaW5hbFRvcCAgPSB0aGlzLmVsZW1lbnQub2Zm c2V0VG9wOwogICAgdGhpcy5vcmlnaW5hbExlZnQgPSB0aGlzLmVsZW1lbnQub2Zm c2V0TGVmdDsKICAgIAogICAgdmFyIGZvbnRTaXplID0gRWxlbWVudC5nZXRTdHls ZSh0aGlzLmVsZW1lbnQsJ2ZvbnQtc2l6ZScpIHx8ICcxMDAlJzsKICAgIFsnZW0n LCdweCcsJyUnXS5lYWNoKCBmdW5jdGlvbihmb250U2l6ZVR5cGUpIHsKICAgICAg aWYoZm9udFNpemUuaW5kZXhPZihmb250U2l6ZVR5cGUpPjApIHsKICAgICAgICB0 aGlzLmZvbnRTaXplICAgICA9IHBhcnNlRmxvYXQoZm9udFNpemUpOwogICAgICAg IHRoaXMuZm9udFNpemVUeXBlID0gZm9udFNpemVUeXBlOwogICAgICB9CiAgICB9 LmJpbmQodGhpcykpOwogICAgCiAgICB0aGlzLmZhY3RvciA9ICh0aGlzLm9wdGlv bnMuc2NhbGVUbyAtIHRoaXMub3B0aW9ucy5zY2FsZUZyb20pLzEwMDsKICAgIAog ICAgdGhpcy5kaW1zID0gbnVsbDsKICAgIGlmKHRoaXMub3B0aW9ucy5zY2FsZU1v ZGU9PSdib3gnKQogICAgICB0aGlzLmRpbXMgPSBbdGhpcy5lbGVtZW50Lm9mZnNl dEhlaWdodCwgdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoXTsKICAgIGlmKC9eY29u dGVudC8udGVzdCh0aGlzLm9wdGlvbnMuc2NhbGVNb2RlKSkKICAgICAgdGhpcy5k aW1zID0gW3RoaXMuZWxlbWVudC5zY3JvbGxIZWlnaHQsIHRoaXMuZWxlbWVudC5z Y3JvbGxXaWR0aF07CiAgICBpZighdGhpcy5kaW1zKQogICAgICB0aGlzLmRpbXMg PSBbdGhpcy5vcHRpb25zLnNjYWxlTW9kZS5vcmlnaW5hbEhlaWdodCwKICAgICAg ICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zY2FsZU1vZGUub3JpZ2luYWxXaWR0 aF07CiAgfSwKICB1cGRhdGU6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7CiAgICB2YXIg Y3VycmVudFNjYWxlID0gKHRoaXMub3B0aW9ucy5zY2FsZUZyb20vMTAwLjApICsg KHRoaXMuZmFjdG9yICogcG9zaXRpb24pOwogICAgaWYodGhpcy5vcHRpb25zLnNj YWxlQ29udGVudCAmJiB0aGlzLmZvbnRTaXplKQogICAgICBFbGVtZW50LnNldFN0 eWxlKHRoaXMuZWxlbWVudCwge2ZvbnRTaXplOiB0aGlzLmZvbnRTaXplICogY3Vy cmVudFNjYWxlICsgdGhpcy5mb250U2l6ZVR5cGUgfSk7CiAgICB0aGlzLnNldERp bWVuc2lvbnModGhpcy5kaW1zWzBdICogY3VycmVudFNjYWxlLCB0aGlzLmRpbXNb MV0gKiBjdXJyZW50U2NhbGUpOwogIH0sCiAgZmluaXNoOiBmdW5jdGlvbihwb3Np dGlvbikgewogICAgaWYgKHRoaXMucmVzdG9yZUFmdGVyRmluaXNoKSBFbGVtZW50 LnNldFN0eWxlKHRoaXMuZWxlbWVudCwgdGhpcy5vcmlnaW5hbFN0eWxlKTsKICB9 LAogIHNldERpbWVuc2lvbnM6IGZ1bmN0aW9uKGhlaWdodCwgd2lkdGgpIHsKICAg IHZhciBkID0ge307CiAgICBpZih0aGlzLm9wdGlvbnMuc2NhbGVYKSBkLndpZHRo ID0gd2lkdGggKyAncHgnOwogICAgaWYodGhpcy5vcHRpb25zLnNjYWxlWSkgZC5o ZWlnaHQgPSBoZWlnaHQgKyAncHgnOwogICAgaWYodGhpcy5vcHRpb25zLnNjYWxl RnJvbUNlbnRlcikgewogICAgICB2YXIgdG9wZCAgPSAoaGVpZ2h0IC0gdGhpcy5k aW1zWzBdKS8yOwogICAgICB2YXIgbGVmdGQgPSAod2lkdGggIC0gdGhpcy5kaW1z WzFdKS8yOwogICAgICBpZih0aGlzLmVsZW1lbnRQb3NpdGlvbmluZyA9PSAnYWJz b2x1dGUnKSB7CiAgICAgICAgaWYodGhpcy5vcHRpb25zLnNjYWxlWSkgZC50b3Ag PSB0aGlzLm9yaWdpbmFsVG9wLXRvcGQgKyAncHgnOwogICAgICAgIGlmKHRoaXMu b3B0aW9ucy5zY2FsZVgpIGQubGVmdCA9IHRoaXMub3JpZ2luYWxMZWZ0LWxlZnRk ICsgJ3B4JzsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZih0aGlzLm9wdGlvbnMu c2NhbGVZKSBkLnRvcCA9IC10b3BkICsgJ3B4JzsKICAgICAgICBpZih0aGlzLm9w dGlvbnMuc2NhbGVYKSBkLmxlZnQgPSAtbGVmdGQgKyAncHgnOwogICAgICB9CiAg ICB9CiAgICBFbGVtZW50LnNldFN0eWxlKHRoaXMuZWxlbWVudCwgZCk7CiAgfQp9 KTsKCkVmZmVjdC5IaWdobGlnaHQgPSBDbGFzcy5jcmVhdGUoKTsKT2JqZWN0LmV4 dGVuZChPYmplY3QuZXh0ZW5kKEVmZmVjdC5IaWdobGlnaHQucHJvdG90eXBlLCBF ZmZlY3QuQmFzZS5wcm90b3R5cGUpLCB7CiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24o ZWxlbWVudCkgewogICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTsKICAgIHZh ciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7IHN0YXJ0Y29sb3I6ICcjZmZmZjk5 JyB9LCBhcmd1bWVudHNbMV0gfHwge30pOwogICAgdGhpcy5zdGFydChvcHRpb25z KTsKICB9LAogIHNldHVwOiBmdW5jdGlvbigpIHsKICAgIC8vIFByZXZlbnQgZXhl Y3V0aW5nIG9uIGVsZW1lbnRzIG5vdCBpbiB0aGUgbGF5b3V0IGZsb3cKICAgIGlm KEVsZW1lbnQuZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAnZGlzcGxheScpPT0nbm9u ZScpIHsgdGhpcy5jYW5jZWwoKTsgcmV0dXJuOyB9CiAgICAvLyBEaXNhYmxlIGJh Y2tncm91bmQgaW1hZ2UgZHVyaW5nIHRoZSBlZmZlY3QKICAgIHRoaXMub2xkU3R5 bGUgPSB7CiAgICAgIGJhY2tncm91bmRJbWFnZTogRWxlbWVudC5nZXRTdHlsZSh0 aGlzLmVsZW1lbnQsICdiYWNrZ3JvdW5kLWltYWdlJykgfTsKICAgIEVsZW1lbnQu c2V0U3R5bGUodGhpcy5lbGVtZW50LCB7YmFja2dyb3VuZEltYWdlOiAnbm9uZSd9 KTsKICAgIGlmKCF0aGlzLm9wdGlvbnMuZW5kY29sb3IpCiAgICAgIHRoaXMub3B0 aW9ucy5lbmRjb2xvciA9IEVsZW1lbnQuZ2V0U3R5bGUodGhpcy5lbGVtZW50LCAn YmFja2dyb3VuZC1jb2xvcicpLnBhcnNlQ29sb3IoJyNmZmZmZmYnKTsKICAgIGlm KCF0aGlzLm9wdGlvbnMucmVzdG9yZWNvbG9yKQogICAgICB0aGlzLm9wdGlvbnMu cmVzdG9yZWNvbG9yID0gRWxlbWVudC5nZXRTdHlsZSh0aGlzLmVsZW1lbnQsICdi YWNrZ3JvdW5kLWNvbG9yJyk7CiAgICAvLyBpbml0IGNvbG9yIGNhbGN1bGF0aW9u cwogICAgdGhpcy5fYmFzZSAgPSAkUigwLDIpLm1hcChmdW5jdGlvbihpKXsgcmV0 dXJuIHBhcnNlSW50KHRoaXMub3B0aW9ucy5zdGFydGNvbG9yLnNsaWNlKGkqMisx LGkqMiszKSwxNikgfS5iaW5kKHRoaXMpKTsKICAgIHRoaXMuX2RlbHRhID0gJFIo MCwyKS5tYXAoZnVuY3Rpb24oaSl7IHJldHVybiBwYXJzZUludCh0aGlzLm9wdGlv bnMuZW5kY29sb3Iuc2xpY2UoaSoyKzEsaSoyKzMpLDE2KS10aGlzLl9iYXNlW2ld IH0uYmluZCh0aGlzKSk7CiAgfSwKICB1cGRhdGU6IGZ1bmN0aW9uKHBvc2l0aW9u KSB7CiAgICBFbGVtZW50LnNldFN0eWxlKHRoaXMuZWxlbWVudCx7YmFja2dyb3Vu ZENvbG9yOiAkUigwLDIpLmluamVjdCgnIycsZnVuY3Rpb24obSx2LGkpewogICAg ICByZXR1cm4gbSsoTWF0aC5yb3VuZCh0aGlzLl9iYXNlW2ldKyh0aGlzLl9kZWx0 YVtpXSpwb3NpdGlvbikpLnRvQ29sb3JQYXJ0KCkpOyB9LmJpbmQodGhpcykpIH0p OwogIH0sCiAgZmluaXNoOiBmdW5jdGlvbigpIHsKICAgIEVsZW1lbnQuc2V0U3R5 bGUodGhpcy5lbGVtZW50LCBPYmplY3QuZXh0ZW5kKHRoaXMub2xkU3R5bGUsIHsK ICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLm9wdGlvbnMucmVzdG9yZWNvbG9y CiAgICB9KSk7CiAgfQp9KTsKCkVmZmVjdC5TY3JvbGxUbyA9IENsYXNzLmNyZWF0 ZSgpOwpPYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoRWZmZWN0LlNjcm9sbFRv LnByb3RvdHlwZSwgRWZmZWN0LkJhc2UucHJvdG90eXBlKSwgewogIGluaXRpYWxp emU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgIHRoaXMuZWxlbWVudCA9ICQoZWxl bWVudCk7CiAgICB0aGlzLnN0YXJ0KGFyZ3VtZW50c1sxXSB8fCB7fSk7CiAgfSwK ICBzZXR1cDogZnVuY3Rpb24oKSB7CiAgICBQb3NpdGlvbi5wcmVwYXJlKCk7CiAg ICB2YXIgb2Zmc2V0cyA9IFBvc2l0aW9uLmN1bXVsYXRpdmVPZmZzZXQodGhpcy5l bGVtZW50KTsKICAgIGlmKHRoaXMub3B0aW9ucy5vZmZzZXQpIG9mZnNldHNbMV0g Kz0gdGhpcy5vcHRpb25zLm9mZnNldDsKICAgIHZhciBtYXggPSB3aW5kb3cuaW5u ZXJIZWlnaHQgPyAKICAgICAgd2luZG93LmhlaWdodCAtIHdpbmRvdy5pbm5lckhl aWdodCA6CiAgICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0IC0gCiAgICAg ICAgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPyAKICAg ICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgOiBk b2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCk7CiAgICB0aGlzLnNjcm9sbFN0YXJ0 ID0gUG9zaXRpb24uZGVsdGFZOwogICAgdGhpcy5kZWx0YSA9IChvZmZzZXRzWzFd ID4gbWF4ID8gbWF4IDogb2Zmc2V0c1sxXSkgLSB0aGlzLnNjcm9sbFN0YXJ0Owog IH0sCiAgdXBkYXRlOiBmdW5jdGlvbihwb3NpdGlvbikgewogICAgUG9zaXRpb24u cHJlcGFyZSgpOwogICAgd2luZG93LnNjcm9sbFRvKFBvc2l0aW9uLmRlbHRhWCwg CiAgICAgIHRoaXMuc2Nyb2xsU3RhcnQgKyAocG9zaXRpb24qdGhpcy5kZWx0YSkp OwogIH0KfSk7CgovKiAtLS0tLS0tLS0tLS0tIGNvbWJpbmF0aW9uIGVmZmVjdHMg LS0tLS0tLS0tLS0tLSAqLwoKRWZmZWN0LkZhZGUgPSBmdW5jdGlvbihlbGVtZW50 KSB7CiAgdmFyIG9sZE9wYWNpdHkgPSBFbGVtZW50LmdldElubGluZU9wYWNpdHko ZWxlbWVudCk7CiAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKICBmcm9t OiBFbGVtZW50LmdldE9wYWNpdHkoZWxlbWVudCkgfHwgMS4wLAogIHRvOiAgIDAu MCwKICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsgd2l0 aChFbGVtZW50KSB7IAogICAgaWYoZWZmZWN0Lm9wdGlvbnMudG8hPTApIHJldHVy bjsKICAgIGhpZGUoZWZmZWN0LmVsZW1lbnQpOwogICAgc2V0U3R5bGUoZWZmZWN0 LmVsZW1lbnQsIHtvcGFjaXR5OiBvbGRPcGFjaXR5fSk7IH19CiAgfSwgYXJndW1l bnRzWzFdIHx8IHt9KTsKICByZXR1cm4gbmV3IEVmZmVjdC5PcGFjaXR5KGVsZW1l bnQsb3B0aW9ucyk7Cn0KCkVmZmVjdC5BcHBlYXIgPSBmdW5jdGlvbihlbGVtZW50 KSB7CiAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKICBmcm9tOiAoRWxl bWVudC5nZXRTdHlsZShlbGVtZW50LCAnZGlzcGxheScpID09ICdub25lJyA/IDAu MCA6IEVsZW1lbnQuZ2V0T3BhY2l0eShlbGVtZW50KSB8fCAwLjApLAogIHRvOiAg IDEuMCwKICBiZWZvcmVTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxl bWVudCkgewogICAgc2V0T3BhY2l0eShlZmZlY3QuZWxlbWVudCwgZWZmZWN0Lm9w dGlvbnMuZnJvbSk7CiAgICBzaG93KGVmZmVjdC5lbGVtZW50KTsgfX0KICB9LCBh cmd1bWVudHNbMV0gfHwge30pOwogIHJldHVybiBuZXcgRWZmZWN0Lk9wYWNpdHko ZWxlbWVudCxvcHRpb25zKTsKfQoKRWZmZWN0LlB1ZmYgPSBmdW5jdGlvbihlbGVt ZW50KSB7CiAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgdmFyIG9sZFN0eWxlID0g eyBvcGFjaXR5OiBFbGVtZW50LmdldElubGluZU9wYWNpdHkoZWxlbWVudCksIHBv c2l0aW9uOiBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpIH07 CiAgcmV0dXJuIG5ldyBFZmZlY3QuUGFyYWxsZWwoCiAgIFsgbmV3IEVmZmVjdC5T Y2FsZShlbGVtZW50LCAyMDAsIAogICAgICB7IHN5bmM6IHRydWUsIHNjYWxlRnJv bUNlbnRlcjogdHJ1ZSwgc2NhbGVDb250ZW50OiB0cnVlLCByZXN0b3JlQWZ0ZXJG aW5pc2g6IHRydWUgfSksIAogICAgIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50 LCB7IHN5bmM6IHRydWUsIHRvOiAwLjAgfSApIF0sIAogICAgIE9iamVjdC5leHRl bmQoeyBkdXJhdGlvbjogMS4wLCAKICAgICAgYmVmb3JlU2V0dXBJbnRlcm5hbDog ZnVuY3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgewogICAgICAgIHNldFN0 eWxlKGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQsIHtwb3NpdGlvbjogJ2Fic29s dXRlJ30pOyB9fSwKICAgICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24o ZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgewogICAgICAgICBoaWRlKGVmZmVjdC5l ZmZlY3RzWzBdLmVsZW1lbnQpOwogICAgICAgICBzZXRTdHlsZShlZmZlY3QuZWZm ZWN0c1swXS5lbGVtZW50LCBvbGRTdHlsZSk7IH19CiAgICAgfSwgYXJndW1lbnRz WzFdIHx8IHt9KQogICApOwp9CgpFZmZlY3QuQmxpbmRVcCA9IGZ1bmN0aW9uKGVs ZW1lbnQpIHsKICBlbGVtZW50ID0gJChlbGVtZW50KTsKICBFbGVtZW50Lm1ha2VD bGlwcGluZyhlbGVtZW50KTsKICByZXR1cm4gbmV3IEVmZmVjdC5TY2FsZShlbGVt ZW50LCAwLCAKICAgIE9iamVjdC5leHRlbmQoeyBzY2FsZUNvbnRlbnQ6IGZhbHNl LCAKICAgICAgc2NhbGVYOiBmYWxzZSwgCiAgICAgIHJlc3RvcmVBZnRlckZpbmlz aDogdHJ1ZSwKICAgICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZm ZWN0KSB7IHdpdGgoRWxlbWVudCkgewogICAgICAgIFtoaWRlLCB1bmRvQ2xpcHBp bmddLmNhbGwoZWZmZWN0LmVsZW1lbnQpOyB9fSAKICAgIH0sIGFyZ3VtZW50c1sx XSB8fCB7fSkKICApOwp9CgpFZmZlY3QuQmxpbmREb3duID0gZnVuY3Rpb24oZWxl bWVudCkgewogIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogIHZhciBvbGRIZWlnaHQg PSBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdoZWlnaHQnKTsKICB2YXIgZWxl bWVudERpbWVuc2lvbnMgPSBFbGVtZW50LmdldERpbWVuc2lvbnMoZWxlbWVudCk7 CiAgcmV0dXJuIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVudCwgMTAwLCAKICAgIE9i amVjdC5leHRlbmQoeyBzY2FsZUNvbnRlbnQ6IGZhbHNlLCAKICAgICAgc2NhbGVY OiBmYWxzZSwKICAgICAgc2NhbGVGcm9tOiAwLAogICAgICBzY2FsZU1vZGU6IHtv cmlnaW5hbEhlaWdodDogZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0LCBvcmlnaW5h bFdpZHRoOiBlbGVtZW50RGltZW5zaW9ucy53aWR0aH0sCiAgICAgIHJlc3RvcmVB ZnRlckZpbmlzaDogdHJ1ZSwKICAgICAgYWZ0ZXJTZXR1cDogZnVuY3Rpb24oZWZm ZWN0KSB7IHdpdGgoRWxlbWVudCkgewogICAgICAgIG1ha2VDbGlwcGluZyhlZmZl Y3QuZWxlbWVudCk7CiAgICAgICAgc2V0U3R5bGUoZWZmZWN0LmVsZW1lbnQsIHto ZWlnaHQ6ICcwcHgnfSk7CiAgICAgICAgc2hvdyhlZmZlY3QuZWxlbWVudCk7IAog ICAgICB9fSwgIAogICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihl ZmZlY3QpIHsgd2l0aChFbGVtZW50KSB7CiAgICAgICAgdW5kb0NsaXBwaW5nKGVm ZmVjdC5lbGVtZW50KTsKICAgICAgICBzZXRTdHlsZShlZmZlY3QuZWxlbWVudCwg e2hlaWdodDogb2xkSGVpZ2h0fSk7CiAgICAgIH19CiAgICB9LCBhcmd1bWVudHNb MV0gfHwge30pCiAgKTsKfQoKRWZmZWN0LlN3aXRjaE9mZiA9IGZ1bmN0aW9uKGVs ZW1lbnQpIHsKICBlbGVtZW50ID0gJChlbGVtZW50KTsKICB2YXIgb2xkT3BhY2l0 eSA9IEVsZW1lbnQuZ2V0SW5saW5lT3BhY2l0eShlbGVtZW50KTsKICByZXR1cm4g bmV3IEVmZmVjdC5BcHBlYXIoZWxlbWVudCwgeyAKICAgIGR1cmF0aW9uOiAwLjQs CiAgICBmcm9tOiAwLAogICAgdHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRpb25z LmZsaWNrZXIsCiAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZl Y3QpIHsKICAgICAgbmV3IEVmZmVjdC5TY2FsZShlZmZlY3QuZWxlbWVudCwgMSwg eyAKICAgICAgICBkdXJhdGlvbjogMC4zLCBzY2FsZUZyb21DZW50ZXI6IHRydWUs CiAgICAgICAgc2NhbGVYOiBmYWxzZSwgc2NhbGVDb250ZW50OiBmYWxzZSwgcmVz dG9yZUFmdGVyRmluaXNoOiB0cnVlLAogICAgICAgIGJlZm9yZVNldHVwOiBmdW5j dGlvbihlZmZlY3QpIHsgd2l0aChFbGVtZW50KSB7CiAgICAgICAgICBbbWFrZVBv c2l0aW9uZWQsbWFrZUNsaXBwaW5nXS5jYWxsKGVmZmVjdC5lbGVtZW50KTsKICAg ICAgICB9fSwKICAgICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihl ZmZlY3QpIHsgd2l0aChFbGVtZW50KSB7CiAgICAgICAgICBbaGlkZSx1bmRvQ2xp cHBpbmcsdW5kb1Bvc2l0aW9uZWRdLmNhbGwoZWZmZWN0LmVsZW1lbnQpOwogICAg ICAgICAgc2V0U3R5bGUoZWZmZWN0LmVsZW1lbnQsIHtvcGFjaXR5OiBvbGRPcGFj aXR5fSk7CiAgICAgICAgfX0KICAgICAgfSkKICAgIH0KICB9KTsKfQoKRWZmZWN0 LkRyb3BPdXQgPSBmdW5jdGlvbihlbGVtZW50KSB7CiAgZWxlbWVudCA9ICQoZWxl bWVudCk7CiAgdmFyIG9sZFN0eWxlID0gewogICAgdG9wOiBFbGVtZW50LmdldFN0 eWxlKGVsZW1lbnQsICd0b3AnKSwKICAgIGxlZnQ6IEVsZW1lbnQuZ2V0U3R5bGUo ZWxlbWVudCwgJ2xlZnQnKSwKICAgIG9wYWNpdHk6IEVsZW1lbnQuZ2V0SW5saW5l T3BhY2l0eShlbGVtZW50KSB9OwogIHJldHVybiBuZXcgRWZmZWN0LlBhcmFsbGVs KAogICAgWyBuZXcgRWZmZWN0Lk1vdmUoZWxlbWVudCwge3g6IDAsIHk6IDEwMCwg c3luYzogdHJ1ZSB9KSwgCiAgICAgIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50 LCB7IHN5bmM6IHRydWUsIHRvOiAwLjAgfSkgXSwKICAgIE9iamVjdC5leHRlbmQo CiAgICAgIHsgZHVyYXRpb246IDAuNSwKICAgICAgICBiZWZvcmVTZXR1cDogZnVu Y3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgewogICAgICAgICAgbWFrZVBv c2l0aW9uZWQoZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudCk7IH19LAogICAgICAg IGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgeyB3aXRoKEVs ZW1lbnQpIHsKICAgICAgICAgIFtoaWRlLCB1bmRvUG9zaXRpb25lZF0uY2FsbChl ZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50KTsKICAgICAgICAgIHNldFN0eWxlKGVm ZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQsIG9sZFN0eWxlKTsgfX0gCiAgICAgIH0s IGFyZ3VtZW50c1sxXSB8fCB7fSkpOwp9CgpFZmZlY3QuU2hha2UgPSBmdW5jdGlv bihlbGVtZW50KSB7CiAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgdmFyIG9sZFN0 eWxlID0gewogICAgdG9wOiBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICd0b3An KSwKICAgIGxlZnQ6IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ2xlZnQnKSB9 OwoJICByZXR1cm4gbmV3IEVmZmVjdC5Nb3ZlKGVsZW1lbnQsIAoJICAgIHsgeDog IDIwLCB5OiAwLCBkdXJhdGlvbjogMC4wNSwgYWZ0ZXJGaW5pc2hJbnRlcm5hbDog ZnVuY3Rpb24oZWZmZWN0KSB7CgkgIG5ldyBFZmZlY3QuTW92ZShlZmZlY3QuZWxl bWVudCwKCSAgICB7IHg6IC00MCwgeTogMCwgZHVyYXRpb246IDAuMSwgIGFmdGVy RmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewoJICBuZXcgRWZmZWN0 Lk1vdmUoZWZmZWN0LmVsZW1lbnQsCgkgICAgeyB4OiAgNDAsIHk6IDAsIGR1cmF0 aW9uOiAwLjEsICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3Qp IHsKCSAgbmV3IEVmZmVjdC5Nb3ZlKGVmZmVjdC5lbGVtZW50LAoJICAgIHsgeDog LTQwLCB5OiAwLCBkdXJhdGlvbjogMC4xLCAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDog ZnVuY3Rpb24oZWZmZWN0KSB7CgkgIG5ldyBFZmZlY3QuTW92ZShlZmZlY3QuZWxl bWVudCwKCSAgICB7IHg6ICA0MCwgeTogMCwgZHVyYXRpb246IDAuMSwgIGFmdGVy RmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgewoJICBuZXcgRWZmZWN0 Lk1vdmUoZWZmZWN0LmVsZW1lbnQsCgkgICAgeyB4OiAtMjAsIHk6IDAsIGR1cmF0 aW9uOiAwLjA1LCBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3Qp IHsgd2l0aChFbGVtZW50KSB7CiAgICAgICAgdW5kb1Bvc2l0aW9uZWQoZWZmZWN0 LmVsZW1lbnQpOwogICAgICAgIHNldFN0eWxlKGVmZmVjdC5lbGVtZW50LCBvbGRT dHlsZSk7CiAgfX19KSB9fSkgfX0pIH19KSB9fSkgfX0pOwp9CgpFZmZlY3QuU2xp ZGVEb3duID0gZnVuY3Rpb24oZWxlbWVudCkgewogIGVsZW1lbnQgPSAkKGVsZW1l bnQpOwogIEVsZW1lbnQuY2xlYW5XaGl0ZXNwYWNlKGVsZW1lbnQpOwogIC8vIFNs aWRlRG93biBuZWVkIHRvIGhhdmUgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQg d3JhcHBlZCBpbiBhIGNvbnRhaW5lciBlbGVtZW50IHdpdGggZml4ZWQgaGVpZ2h0 IQogIHZhciBvbGRJbm5lckJvdHRvbSA9IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVu dC5maXJzdENoaWxkLCAnYm90dG9tJyk7CiAgdmFyIGVsZW1lbnREaW1lbnNpb25z ID0gRWxlbWVudC5nZXREaW1lbnNpb25zKGVsZW1lbnQpOwogIHJldHVybiBuZXcg RWZmZWN0LlNjYWxlKGVsZW1lbnQsIDEwMCwgT2JqZWN0LmV4dGVuZCh7IAogICAg c2NhbGVDb250ZW50OiBmYWxzZSwgCiAgICBzY2FsZVg6IGZhbHNlLCAKICAgIHNj YWxlRnJvbTogMCwKICAgIHNjYWxlTW9kZToge29yaWdpbmFsSGVpZ2h0OiBlbGVt ZW50RGltZW5zaW9ucy5oZWlnaHQsIG9yaWdpbmFsV2lkdGg6IGVsZW1lbnREaW1l bnNpb25zLndpZHRofSwKICAgIHJlc3RvcmVBZnRlckZpbmlzaDogdHJ1ZSwKICAg IGFmdGVyU2V0dXA6IGZ1bmN0aW9uKGVmZmVjdCkgeyB3aXRoKEVsZW1lbnQpIHsK ICAgICAgbWFrZVBvc2l0aW9uZWQoZWZmZWN0LmVsZW1lbnQpOwogICAgICBtYWtl UG9zaXRpb25lZChlZmZlY3QuZWxlbWVudC5maXJzdENoaWxkKTsKICAgICAgaWYo d2luZG93Lm9wZXJhKSBzZXRTdHlsZShlZmZlY3QuZWxlbWVudCwge3RvcDogJyd9 KTsKICAgICAgbWFrZUNsaXBwaW5nKGVmZmVjdC5lbGVtZW50KTsKICAgICAgc2V0 U3R5bGUoZWZmZWN0LmVsZW1lbnQsIHtoZWlnaHQ6ICcwcHgnfSk7CiAgICAgIHNo b3coZWxlbWVudCk7IH19LAogICAgYWZ0ZXJVcGRhdGVJbnRlcm5hbDogZnVuY3Rp b24oZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgewogICAgICBzZXRTdHlsZShlZmZl Y3QuZWxlbWVudC5maXJzdENoaWxkLCB7Ym90dG9tOgogICAgICAgIChlZmZlY3Qu ZGltc1swXSAtIGVmZmVjdC5lbGVtZW50LmNsaWVudEhlaWdodCkgKyAncHgnIH0p OyB9fSwKICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkg eyB3aXRoKEVsZW1lbnQpIHsKICAgICAgdW5kb0NsaXBwaW5nKGVmZmVjdC5lbGVt ZW50KTsgCiAgICAgIHVuZG9Qb3NpdGlvbmVkKGVmZmVjdC5lbGVtZW50LmZpcnN0 Q2hpbGQpOwogICAgICB1bmRvUG9zaXRpb25lZChlZmZlY3QuZWxlbWVudCk7CiAg ICAgIHNldFN0eWxlKGVmZmVjdC5lbGVtZW50LmZpcnN0Q2hpbGQsIHtib3R0b206 IG9sZElubmVyQm90dG9tfSk7IH19CiAgICB9LCBhcmd1bWVudHNbMV0gfHwge30p CiAgKTsKfQogIApFZmZlY3QuU2xpZGVVcCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsK ICBlbGVtZW50ID0gJChlbGVtZW50KTsKICBFbGVtZW50LmNsZWFuV2hpdGVzcGFj ZShlbGVtZW50KTsKICB2YXIgb2xkSW5uZXJCb3R0b20gPSBFbGVtZW50LmdldFN0 eWxlKGVsZW1lbnQuZmlyc3RDaGlsZCwgJ2JvdHRvbScpOwogIHJldHVybiBuZXcg RWZmZWN0LlNjYWxlKGVsZW1lbnQsIDAsIAogICBPYmplY3QuZXh0ZW5kKHsgc2Nh bGVDb250ZW50OiBmYWxzZSwgCiAgICBzY2FsZVg6IGZhbHNlLCAKICAgIHNjYWxl TW9kZTogJ2JveCcsCiAgICBzY2FsZUZyb206IDEwMCwKICAgIHJlc3RvcmVBZnRl ckZpbmlzaDogdHJ1ZSwKICAgIGJlZm9yZVN0YXJ0SW50ZXJuYWw6IGZ1bmN0aW9u KGVmZmVjdCkgeyB3aXRoKEVsZW1lbnQpIHsKICAgICAgbWFrZVBvc2l0aW9uZWQo ZWZmZWN0LmVsZW1lbnQpOwogICAgICBtYWtlUG9zaXRpb25lZChlZmZlY3QuZWxl bWVudC5maXJzdENoaWxkKTsKICAgICAgaWYod2luZG93Lm9wZXJhKSBzZXRTdHls ZShlZmZlY3QuZWxlbWVudCwge3RvcDogJyd9KTsKICAgICAgbWFrZUNsaXBwaW5n KGVmZmVjdC5lbGVtZW50KTsKICAgICAgc2hvdyhlbGVtZW50KTsgfX0sICAKICAg IGFmdGVyVXBkYXRlSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgeyB3aXRoKEVs ZW1lbnQpIHsKICAgICAgc2V0U3R5bGUoZWZmZWN0LmVsZW1lbnQuZmlyc3RDaGls ZCwge2JvdHRvbToKICAgICAgICAoZWZmZWN0LmRpbXNbMF0gLSBlZmZlY3QuZWxl bWVudC5jbGllbnRIZWlnaHQpICsgJ3B4JyB9KTsgfX0sCiAgICBhZnRlckZpbmlz aEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsgd2l0aChFbGVtZW50KSB7CiAg ICAgICAgW2hpZGUsIHVuZG9DbGlwcGluZ10uY2FsbChlZmZlY3QuZWxlbWVudCk7 IAogICAgICAgIHVuZG9Qb3NpdGlvbmVkKGVmZmVjdC5lbGVtZW50LmZpcnN0Q2hp bGQpOwogICAgICAgIHVuZG9Qb3NpdGlvbmVkKGVmZmVjdC5lbGVtZW50KTsKICAg ICAgICBzZXRTdHlsZShlZmZlY3QuZWxlbWVudC5maXJzdENoaWxkLCB7Ym90dG9t OiBvbGRJbm5lckJvdHRvbX0pOyB9fQogICB9LCBhcmd1bWVudHNbMV0gfHwge30p CiAgKTsKfQoKLy8gQnVnIGluIG9wZXJhIG1ha2VzIHRoZSBURCBjb250YWluaW5n IHRoaXMgZWxlbWVudCBleHBhbmQgZm9yIGEgaW5zdGFuY2UgYWZ0ZXIgZmluaXNo IApFZmZlY3QuU3F1aXNoID0gZnVuY3Rpb24oZWxlbWVudCkgewogIHJldHVybiBu ZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIHdpbmRvdy5vcGVyYSA/IDEgOiAwLCAK ICAgIHsgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlLAogICAgICBiZWZvcmVTZXR1 cDogZnVuY3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgewogICAgICAgIG1h a2VDbGlwcGluZyhlZmZlY3QuZWxlbWVudCk7IH19LCAgCiAgICAgIGFmdGVyRmlu aXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgeyB3aXRoKEVsZW1lbnQpIHsK ICAgICAgICBoaWRlKGVmZmVjdC5lbGVtZW50KTsgCiAgICAgICAgdW5kb0NsaXBw aW5nKGVmZmVjdC5lbGVtZW50KTsgfX0KICB9KTsKfQoKRWZmZWN0Lkdyb3cgPSBm dW5jdGlvbihlbGVtZW50KSB7CiAgZWxlbWVudCA9ICQoZWxlbWVudCk7CiAgdmFy IG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKICAgIGRpcmVjdGlvbjogJ2NlbnRl cicsCiAgICBtb3ZlVHJhbnNpc3Rpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5zaW5v aWRhbCwKICAgIHNjYWxlVHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRpb25zLnNp bm9pZGFsLAogICAgb3BhY2l0eVRyYW5zaXRpb246IEVmZmVjdC5UcmFuc2l0aW9u cy5mdWxsCiAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KTsKICB2YXIgb2xkU3R5bGUg PSB7CiAgICB0b3A6IGVsZW1lbnQuc3R5bGUudG9wLAogICAgbGVmdDogZWxlbWVu dC5zdHlsZS5sZWZ0LAogICAgaGVpZ2h0OiBlbGVtZW50LnN0eWxlLmhlaWdodCwK ICAgIHdpZHRoOiBlbGVtZW50LnN0eWxlLndpZHRoLAogICAgb3BhY2l0eTogRWxl bWVudC5nZXRJbmxpbmVPcGFjaXR5KGVsZW1lbnQpIH07CgogIHZhciBkaW1zID0g RWxlbWVudC5nZXREaW1lbnNpb25zKGVsZW1lbnQpOyAgICAKICB2YXIgaW5pdGlh bE1vdmVYLCBpbml0aWFsTW92ZVk7CiAgdmFyIG1vdmVYLCBtb3ZlWTsKICAKICBz d2l0Y2ggKG9wdGlvbnMuZGlyZWN0aW9uKSB7CiAgICBjYXNlICd0b3AtbGVmdCc6 CiAgICAgIGluaXRpYWxNb3ZlWCA9IGluaXRpYWxNb3ZlWSA9IG1vdmVYID0gbW92 ZVkgPSAwOyAKICAgICAgYnJlYWs7CiAgICBjYXNlICd0b3AtcmlnaHQnOgogICAg ICBpbml0aWFsTW92ZVggPSBkaW1zLndpZHRoOwogICAgICBpbml0aWFsTW92ZVkg PSBtb3ZlWSA9IDA7CiAgICAgIG1vdmVYID0gLWRpbXMud2lkdGg7CiAgICAgIGJy ZWFrOwogICAgY2FzZSAnYm90dG9tLWxlZnQnOgogICAgICBpbml0aWFsTW92ZVgg PSBtb3ZlWCA9IDA7CiAgICAgIGluaXRpYWxNb3ZlWSA9IGRpbXMuaGVpZ2h0Owog ICAgICBtb3ZlWSA9IC1kaW1zLmhlaWdodDsKICAgICAgYnJlYWs7CiAgICBjYXNl ICdib3R0b20tcmlnaHQnOgogICAgICBpbml0aWFsTW92ZVggPSBkaW1zLndpZHRo OwogICAgICBpbml0aWFsTW92ZVkgPSBkaW1zLmhlaWdodDsKICAgICAgbW92ZVgg PSAtZGltcy53aWR0aDsKICAgICAgbW92ZVkgPSAtZGltcy5oZWlnaHQ7CiAgICAg IGJyZWFrOwogICAgY2FzZSAnY2VudGVyJzoKICAgICAgaW5pdGlhbE1vdmVYID0g ZGltcy53aWR0aCAvIDI7CiAgICAgIGluaXRpYWxNb3ZlWSA9IGRpbXMuaGVpZ2h0 IC8gMjsKICAgICAgbW92ZVggPSAtZGltcy53aWR0aCAvIDI7CiAgICAgIG1vdmVZ ID0gLWRpbXMuaGVpZ2h0IC8gMjsKICAgICAgYnJlYWs7CiAgfQogIAogIHJldHVy biBuZXcgRWZmZWN0Lk1vdmUoZWxlbWVudCwgewogICAgeDogaW5pdGlhbE1vdmVY LAogICAgeTogaW5pdGlhbE1vdmVZLAogICAgZHVyYXRpb246IDAuMDEsIAogICAg YmVmb3JlU2V0dXA6IGZ1bmN0aW9uKGVmZmVjdCkgeyB3aXRoKEVsZW1lbnQpIHsK ICAgICAgaGlkZShlZmZlY3QuZWxlbWVudCk7CiAgICAgIG1ha2VDbGlwcGluZyhl ZmZlY3QuZWxlbWVudCk7CiAgICAgIG1ha2VQb3NpdGlvbmVkKGVmZmVjdC5lbGVt ZW50KTsKICAgIH19LAogICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24o ZWZmZWN0KSB7CiAgICAgIG5ldyBFZmZlY3QuUGFyYWxsZWwoCiAgICAgICAgWyBu ZXcgRWZmZWN0Lk9wYWNpdHkoZWZmZWN0LmVsZW1lbnQsIHsgc3luYzogdHJ1ZSwg dG86IDEuMCwgZnJvbTogMC4wLCB0cmFuc2l0aW9uOiBvcHRpb25zLm9wYWNpdHlU cmFuc2l0aW9uIH0pLAogICAgICAgICAgbmV3IEVmZmVjdC5Nb3ZlKGVmZmVjdC5l bGVtZW50LCB7IHg6IG1vdmVYLCB5OiBtb3ZlWSwgc3luYzogdHJ1ZSwgdHJhbnNp dGlvbjogb3B0aW9ucy5tb3ZlVHJhbnNpdGlvbiB9KSwKICAgICAgICAgIG5ldyBF ZmZlY3QuU2NhbGUoZWZmZWN0LmVsZW1lbnQsIDEwMCwgewogICAgICAgICAgICBz Y2FsZU1vZGU6IHsgb3JpZ2luYWxIZWlnaHQ6IGRpbXMuaGVpZ2h0LCBvcmlnaW5h bFdpZHRoOiBkaW1zLndpZHRoIH0sIAogICAgICAgICAgICBzeW5jOiB0cnVlLCBz Y2FsZUZyb206IHdpbmRvdy5vcGVyYSA/IDEgOiAwLCB0cmFuc2l0aW9uOiBvcHRp b25zLnNjYWxlVHJhbnNpdGlvbiwgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlfSkK ICAgICAgICBdLCBPYmplY3QuZXh0ZW5kKHsKICAgICAgICAgICAgIGJlZm9yZVNl dHVwOiBmdW5jdGlvbihlZmZlY3QpIHsgd2l0aChFbGVtZW50KSB7CiAgICAgICAg ICAgICAgIHNldFN0eWxlKGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQsIHtoZWln aHQ6ICcwcHgnfSk7CiAgICAgICAgICAgICAgIHNob3coZWZmZWN0LmVmZmVjdHNb MF0uZWxlbWVudCk7IH19LAogICAgICAgICAgICAgYWZ0ZXJGaW5pc2hJbnRlcm5h bDogZnVuY3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxlbWVudCkgewogICAgICAgICAg ICAgICBbdW5kb0NsaXBwaW5nLCB1bmRvUG9zaXRpb25lZF0uY2FsbChlZmZlY3Qu ZWZmZWN0c1swXS5lbGVtZW50KTsgCiAgICAgICAgICAgICAgIHNldFN0eWxlKGVm ZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQsIG9sZFN0eWxlKTsgfX0KICAgICAgICAg ICB9LCBvcHRpb25zKQogICAgICApCiAgICB9CiAgfSk7Cn0KCkVmZmVjdC5TaHJp bmsgPSBmdW5jdGlvbihlbGVtZW50KSB7CiAgZWxlbWVudCA9ICQoZWxlbWVudCk7 CiAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKICAgIGRpcmVjdGlvbjog J2NlbnRlcicsCiAgICBtb3ZlVHJhbnNpc3Rpb246IEVmZmVjdC5UcmFuc2l0aW9u cy5zaW5vaWRhbCwKICAgIHNjYWxlVHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRp b25zLnNpbm9pZGFsLAogICAgb3BhY2l0eVRyYW5zaXRpb246IEVmZmVjdC5UcmFu c2l0aW9ucy5ub25lCiAgfSwgYXJndW1lbnRzWzFdIHx8IHt9KTsKICB2YXIgb2xk U3R5bGUgPSB7CiAgICB0b3A6IGVsZW1lbnQuc3R5bGUudG9wLAogICAgbGVmdDog ZWxlbWVudC5zdHlsZS5sZWZ0LAogICAgaGVpZ2h0OiBlbGVtZW50LnN0eWxlLmhl aWdodCwKICAgIHdpZHRoOiBlbGVtZW50LnN0eWxlLndpZHRoLAogICAgb3BhY2l0 eTogRWxlbWVudC5nZXRJbmxpbmVPcGFjaXR5KGVsZW1lbnQpIH07CgogIHZhciBk aW1zID0gRWxlbWVudC5nZXREaW1lbnNpb25zKGVsZW1lbnQpOwogIHZhciBtb3Zl WCwgbW92ZVk7CiAgCiAgc3dpdGNoIChvcHRpb25zLmRpcmVjdGlvbikgewogICAg Y2FzZSAndG9wLWxlZnQnOgogICAgICBtb3ZlWCA9IG1vdmVZID0gMDsKICAgICAg YnJlYWs7CiAgICBjYXNlICd0b3AtcmlnaHQnOgogICAgICBtb3ZlWCA9IGRpbXMu d2lkdGg7CiAgICAgIG1vdmVZID0gMDsKICAgICAgYnJlYWs7CiAgICBjYXNlICdi b3R0b20tbGVmdCc6CiAgICAgIG1vdmVYID0gMDsKICAgICAgbW92ZVkgPSBkaW1z LmhlaWdodDsKICAgICAgYnJlYWs7CiAgICBjYXNlICdib3R0b20tcmlnaHQnOgog ICAgICBtb3ZlWCA9IGRpbXMud2lkdGg7CiAgICAgIG1vdmVZID0gZGltcy5oZWln aHQ7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnY2VudGVyJzogIAogICAgICBtb3Zl WCA9IGRpbXMud2lkdGggLyAyOwogICAgICBtb3ZlWSA9IGRpbXMuaGVpZ2h0IC8g MjsKICAgICAgYnJlYWs7CiAgfQogIAogIHJldHVybiBuZXcgRWZmZWN0LlBhcmFs bGVsKAogICAgWyBuZXcgRWZmZWN0Lk9wYWNpdHkoZWxlbWVudCwgeyBzeW5jOiB0 cnVlLCB0bzogMC4wLCBmcm9tOiAxLjAsIHRyYW5zaXRpb246IG9wdGlvbnMub3Bh Y2l0eVRyYW5zaXRpb24gfSksCiAgICAgIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVu dCwgd2luZG93Lm9wZXJhID8gMSA6IDAsIHsgc3luYzogdHJ1ZSwgdHJhbnNpdGlv bjogb3B0aW9ucy5zY2FsZVRyYW5zaXRpb24sIHJlc3RvcmVBZnRlckZpbmlzaDog dHJ1ZX0pLAogICAgICBuZXcgRWZmZWN0Lk1vdmUoZWxlbWVudCwgeyB4OiBtb3Zl WCwgeTogbW92ZVksIHN5bmM6IHRydWUsIHRyYW5zaXRpb246IG9wdGlvbnMubW92 ZVRyYW5zaXRpb24gfSkKICAgIF0sIE9iamVjdC5leHRlbmQoeyAgICAgICAgICAg IAogICAgICAgICBiZWZvcmVTdGFydEludGVybmFsOiBmdW5jdGlvbihlZmZlY3Qp IHsgd2l0aChFbGVtZW50KSB7CiAgICAgICAgICAgW21ha2VQb3NpdGlvbmVkLCBt YWtlQ2xpcHBpbmddLmNhbGwoZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudCkgfX0s CiAgICAgICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkg eyB3aXRoKEVsZW1lbnQpIHsKICAgICAgICAgICBbaGlkZSwgdW5kb0NsaXBwaW5n LCB1bmRvUG9zaXRpb25lZF0uY2FsbChlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50 KTsKICAgICAgICAgICBzZXRTdHlsZShlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50 LCBvbGRTdHlsZSk7IH19CiAgICAgICB9LCBvcHRpb25zKQogICk7Cn0KCkVmZmVj dC5QdWxzYXRlID0gZnVuY3Rpb24oZWxlbWVudCkgewogIGVsZW1lbnQgPSAkKGVs ZW1lbnQpOwogIHZhciBvcHRpb25zICAgID0gYXJndW1lbnRzWzFdIHx8IHt9Owog IHZhciBvbGRPcGFjaXR5ID0gRWxlbWVudC5nZXRJbmxpbmVPcGFjaXR5KGVsZW1l bnQpOwogIHZhciB0cmFuc2l0aW9uID0gb3B0aW9ucy50cmFuc2l0aW9uIHx8IEVm ZmVjdC5UcmFuc2l0aW9ucy5zaW5vaWRhbDsKICB2YXIgcmV2ZXJzZXIgICA9IGZ1 bmN0aW9uKHBvcyl7IHJldHVybiB0cmFuc2l0aW9uKDEtRWZmZWN0LlRyYW5zaXRp b25zLnB1bHNlKHBvcykpIH07CiAgcmV2ZXJzZXIuYmluZCh0cmFuc2l0aW9uKTsK ICByZXR1cm4gbmV3IEVmZmVjdC5PcGFjaXR5KGVsZW1lbnQsIAogICAgT2JqZWN0 LmV4dGVuZChPYmplY3QuZXh0ZW5kKHsgIGR1cmF0aW9uOiAzLjAsIGZyb206IDAs CiAgICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgeyBF bGVtZW50LnNldFN0eWxlKGVmZmVjdC5lbGVtZW50LCB7b3BhY2l0eTogb2xkT3Bh Y2l0eX0pOyB9CiAgICB9LCBvcHRpb25zKSwge3RyYW5zaXRpb246IHJldmVyc2Vy fSkpOwp9CgpFZmZlY3QuRm9sZCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICBlbGVt ZW50ID0gJChlbGVtZW50KTsKICB2YXIgb2xkU3R5bGUgPSB7CiAgICB0b3A6IGVs ZW1lbnQuc3R5bGUudG9wLAogICAgbGVmdDogZWxlbWVudC5zdHlsZS5sZWZ0LAog ICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsCiAgICBoZWlnaHQ6IGVsZW1l bnQuc3R5bGUuaGVpZ2h0IH07CiAgRWxlbWVudC5tYWtlQ2xpcHBpbmcoZWxlbWVu dCk7CiAgcmV0dXJuIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVudCwgNSwgT2JqZWN0 LmV4dGVuZCh7ICAgCiAgICBzY2FsZUNvbnRlbnQ6IGZhbHNlLAogICAgc2NhbGVY OiBmYWxzZSwKICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVj dCkgewogICAgbmV3IEVmZmVjdC5TY2FsZShlbGVtZW50LCAxLCB7IAogICAgICBz Y2FsZUNvbnRlbnQ6IGZhbHNlLCAKICAgICAgc2NhbGVZOiBmYWxzZSwKICAgICAg YWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7IHdpdGgoRWxl bWVudCkgewogICAgICAgIFtoaWRlLCB1bmRvQ2xpcHBpbmddLmNhbGwoZWZmZWN0 LmVsZW1lbnQpOyAKICAgICAgICBzZXRTdHlsZShlZmZlY3QuZWxlbWVudCwgb2xk U3R5bGUpOwogICAgICB9fSB9KTsKICB9fSwgYXJndW1lbnRzWzFdIHx8IHt9KSk7 Cn0KCnZhciBldmVudHMgPSBbIF07CgppZihzaG93aW5nX21pbmlfY2FsZW5kYXIp CnsKCWV2ZW50cy5wdXNoKAoJCQltaW5pY2FsZW5kYXJTZXR1cAoJCSk7Cn0KZWxz ZQp7CglldmVudHMucHVzaCgKCS8qCgkJdG9waWNOYXZpZ2F0aW9uUHVsbGRvd24s CgkJZWFzeVRpbWVJbnB1dENvbnZlcnRlcgoJCWFkZFNoYWRvd3MsCgkJbWluaWNh bGVuZGFyQ3JlYXRlLAoJCXB1bGxkb3duQXV0b1N1Ym1pdHMsCgkJbWVzc2FnZWxp c3RBdXRob3JMaW5rc0NyZWF0ZVRvZ2dsZSwKCQltZXNzYWdlbGlzdFRvcGljTGlu a3NDcmVhdGVUb2dnbGUsKi8KCQlmb2N1c0ZpcnN0Rm9ybUZpZWxkLAoJCXZhbGlk YXRlRm9ybXMsCgkJcmVsb2NhdGVCbG9ja3MsLyoKCQl0b3BpY05hdmlnYXRpb25Q dWxsZG93biwKCQlhdHRhY2hDYWxlbmRhclNlbGVjdG9yLAoJCXJld3JpdGVRdW90 ZUxpbmtzLAoJCXByaXZhdGVNZXNzYWdpbmdDb3B5Q29udGFjdCwKCQlkb2N1bWVu dFB1bGxkb3duLAoJCWxvZ2luRm9ybSwqLwoJCXRvZ2dsZVZpc2liaWxpdHksCgkJ ZG9jbGliSW50ZXJhY3Rpb24sCgkJZG9jbGliSW50ZXJhY3Rpb25BZnJpY2EsCgkJ dG9waWNEb2N1bWVudFNlbGVjdG9yLAoJCXRvZ2dsZUNoYW5nZUNoZWNrYm94VG9w aWNBZG1pbiwKCQlzZWxlY3RTZWxlY3RlZFRvcGljQWRtaW4sLyoKCQllYXN5VGlt ZUlucHV0Q29udmVydGVyLAoJCXRvZ2dsZVJlcGVhdERldGFpbHMsCgkJc2NhbGVJ bWFnZXMsCgkJY3JlYXRlRm9vdGVyLCovCgkJYXR0YWNoUk1MVG9vbGJhciwKCQlt YWtlU21pbGV5c0NsaWNrYWJsZSwvKgoJCWVuYWJsZVByZWZlcmVuY2VDU1MgKi8K CQl0b2dnbGVHb29nbGVNYXBzLAoJCWxvZ291dFNlc3Npb25zLAoJCWV4dGVybmFs TGlua3NJblBvcHVwLAoJCWF1dG9jb21wbGV0ZSwKCQlhbHRlcm5hdGVSb3dTdHls ZSwKCQltYWtlQmxvY2tzRWRpdGFibGUsCgkJcmF0ZUl0ZW0sCgkJZml4QnJvd3Nl cklzc3VlcywKCQlmaXhCcm93c2VySXNzdWVzQWZyaWNhLAoJCWluaXRMaWdodGJv eCwKCQlhbGxFeHRlcm5hbExpbmtzSW5Qb3B1cCwKCQlyZXBvcnRlclJlZ2lzdHJh dGlvbgoJKTsKCgkvKiBleHRyYSBleHRyYS4uLiByZWFkIGFsbCBhYm91dCBpdCAq LwoKCS8qCgkJdXBkYXRlTWVzc2FnZXNUaHJ1WG1sSHR0cCwKCQlpbmRpY2F0ZUFj Y2Vzc2tleSwKCQlzZWFyY2hQb3B1cCwKCQlsb2NhbEFuY2hvcnMsCgkJc2xhc2hk b3RMaW5rcywKCQlzZWxlY3RBbGxSb3dzLAoJCWxvY2FsQW5jaG9ycywKCQljbG9z ZUFuZFN1Ym1pdCwKCgkJYWxsUGFnZXNOYXZpZ2F0aW9uLAoJCWhpZ2hsaWdodFJl ZmVycmVyUXVlcnksCgoJCWluZGljYXRlU2VjdXJlTGluaywKCQl3ZWIyMF91c2Vy aWNvbnMsCgkJcmVzb2x2ZUlQMkhvc3RuYW1lCgkqLwp9Cgo= ------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=print.css Content-Type: text/css; charset=ISO-8859-15; name=print.css Content-Location: http://www.africanews.com/templates/africa/css/print.css Content-Transfer-Encoding: 8bit #logo, #navigation, #welcome-text, .action-header ul, ul.message-links, ul.author-links, li hr, #content > hr, #topic-admin, #footer, iframe, #more-topic, h3.more-topic, #action-footer, div#sidebar, div#login, div#quick-search, div.block-type-topbanner, ul#menu, ul#submenu { display: none; } * { color: black; } /* a:after { content: " [" attr(href) "]"; color: #aaa; font-size: 0.7em; }*/ .action-header ol { overflow: auto; } .action-header ol li { list-style-type: none; float: left; margin-right: 0.1cm; } .action-header ol li:after { content: " >>"; } .action-header ol li:last-child:after { content: ""; } li.message { list-style-type: none; border: 1px dotted black; margin: 1cm 0; } div.message-content { margin-left: 1cm; min-height: 3cm; margin-right: 5cm; } div.message-data { margin-bottom: 0.5cm; } blockquote { border-top: 1px solid black; border-bottom: 1px solid black; background-color: #eee; } div.author-data { float: right; } td, th { border: 1px dotted black; } table { width: 100%; border-collapse: collapse; } *.topic-status, th.status { display: none; } td.topic-lastmessage br { display: none; } td.topic-lastmessage a:first-child:after { content: " "; } address.updated-by, address.signature { font-size: 0.7em; border-top: 1px solid black; margin-top: 0.4cm; } dt, dd { padding: 0.3em; border-top: 0.1em solid white; min-height: 1.8em; } dt { float: left; clear: left; display: inline; width: 13.2em; border-top: 0.1em solid white; border-right: 0.4em solid white; padding-left: 0.5em; } dd { float: left; clear: right; border-left: 0.4em solid white; overflow: hidden; /* Fixes for clear 'issue' in FF/Opera */ margin-left: -0.4em; width: 77.5%; } dd + dd { padding-top: 0; font-style: italic; border-top: none; min-height: 0; clear: both; margin-left: 14em; } h3 { clear: both; } ------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=b720194e219c896e05d68ac01e4ef76a.header_image.jpg Content-Type: image/jpeg; name=b720194e219c896e05d68ac01e4ef76a.header_image.jpg Content-Location: http://www.africanews.com/documents/b7/20/b720194e219c896e05d68ac01e4ef76a.header_image.jpg Content-Transfer-Encoding: Base64 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 Fz3/AMcEkT+x/HH5PL4nH//Z ------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=f36f0db2213a32c694b02af2711f6136.header_image.jpg Content-Type: image/jpeg; name=f36f0db2213a32c694b02af2711f6136.header_image.jpg Content-Location: http://www.africanews.com/documents/f3/6f/f36f0db2213a32c694b02af2711f6136.header_image.jpg Content-Transfer-Encoding: Base64 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 3RH+45igac/lFL/9v8JxnLMH57m/tTj/2Q== ------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=bb407e9553a2b13a839dcc4963f78124.page_identifier.jpg Content-Type: text/html; name=bb407e9553a2b13a839dcc4963f78124.page_identifier.jpg Content-Location: http://www.africanews.com/download/download_document/8272/bb407e9553a2b13a839dcc4963f78124/page_identifier Content-Transfer-Encoding: Base64 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 AQBAEAQBAEAQBAEAQBAEAQBAEAQBAf/Z ------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=Walter-Wilson-Nana.jpg Content-Type: image/jpeg; name=Walter-Wilson-Nana.jpg Content-Location: http://www.africanews.com/usericons/1895/Walter-Wilson-Nana.jpg Content-Transfer-Encoding: Base64 /9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1 c2luZyBJSkcgSlBFRyB2NjIpLCBkZWZhdWx0IHF1YWxpdHkK/9sAQwAIBgYHBgUI BwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8n OT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAfgB+AwEiAAIRAQMR Af/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMF BQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYX GBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6 g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV 1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAAB AgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXET IjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJ SlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5 +v/aAAwDAQACEQMRAD8A96oopKBC0UmaTNAC5oB9+nam5rM1nWotIt97YeZ/9XH6 0AW9Q1O00q3M95MsSAd+pPtXnWufEy4Zmj0qHy06CSQAsffFYGs39xqtwZ724aQ5 yqA/Kv0ArIMQJyEH4VnOoomipSlsXX8eeJA277fIP5flmtvR/ihfwOq6lCtzF3de GH+frXLNbqedoP1qN7dR1Tg1n7fXUHQmj3bSNdsNcthPZTBxj5kPDL9RWlkV4Bp1 zc6bdLc2EzxSoQTg8H2PqK9c8MeJ49bhMUwWK9QZZB0YeoraMk1dEuLW50eaKQUt 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 RsLcdTjH+NMsW+1XDMw4KAqD2HGBVLuUtrn/2Q== ------------z0sG6lbwfRAjvoOOPUGyZF Content-Disposition: inline; filename=show_ads.js Content-Type: text/javascript; charset=UTF-8; name=show_ads.js Content-Location: http://pagead2.googlesyndication.com/pagead/show_ads.js Content-Transfer-Encoding: Quoted-Printable (function(){ var g=3Ddocument,l=3Dnavigator,m=3Dwindow;function aa(){var a=3Dg.cookie= ,c=3DMath.round((new Date).getTime()/1000),b=3Dm.google_analytics_domain= _name,d=3Dtypeof b=3D=3D"undefined"?ba("auto"):ba(b),e=3Da.indexOf("__ut= ma=3D"+d+".")>-1,f=3Da.indexOf("__utmb=3D"+d)>-1,i=3Da.indexOf("__utmc=3D= "+d)>-1,k,j=3D{};if(e){k=3Da.split("__utma=3D"+d+".")[1].split(";")[0].s= plit(".");j.sid=3Df&&i?k[3]+"":m&&m.gaGlobal&&m.gaGlobal.sid?m.gaGlobal.= sid:c+"";j.vid=3Dk[0]+"."+k[1];j.from_cookie=3Dtrue;j.dh=3Dd}else{j.sid=3D= m&&m.gaGlobal&&m.gaGlobal.sid?m.gaGlobal.sid: c+"";j.vid=3Dm&&m.gaGlobal&&m.gaGlobal.vid?m.gaGlobal.vid:(ca()^ha())*21= 47483647+"."+c;j.from_cookie=3Dfalse}j.hid=3Dm&&m.gaGlobal&&m.gaGlobal.h= id?m.gaGlobal.hid:ca();m.gaGlobal=3Dj;return j}function ca(){return Math= .round(Math.random()*2147483647)}function ha(){var a=3Dg.cookie?g.cookie= :"",c=3Dm.history.length,b,d,e=3D[l.appName,l.version,l.language?l.langu= age:l.browserLanguage,l.platform,l.userAgent,l.javaEnabled()?1:0].join("= ");if(m.screen)e+=3Dm.screen.width+"x"+m.screen.height+m.screen.colorDep= th;else if(m.java){d=3D java.awt.Toolkit.getDefaultToolkit().getScreenSize();e+=3Dd.screen.width= +"x"+d.screen.height}e+=3Da;e+=3Dg.referrer?g.referrer:"";b=3De.length;w= hile(c>0)e+=3Dc--^b++;return ia(e)}function ia(a){var c=3D1,b=3D0,d,e;if= (!(a=3D=3Dundefined||a=3D=3D"")){c=3D0;for(d=3Da.length-1;d>=3D0;d--){e=3D= a.charCodeAt(d);c=3D(c<<6&268435455)+e+(e<<14);b=3Dc&266338304;c=3Db!=3D= 0?c^b>>21:c}}return c}function ba(a){if(!a||a=3D=3D""||a=3D=3D"none")ret= urn 1;if("auto"=3D=3Da){a=3Dg.domain;if("www."=3D=3Da.substring(0,4))a=3D= a.substring(4,a.length)}return ia(a)};var s=3D{google_ad_channel:"channe= l",google_ad_host:"host",google_ad_host_channel:"h_ch",google_ad_host_ti= er_id:"ht_id",google_ad_region:"region",google_ad_section:"region",googl= e_ad_type:"ad_type",google_adtest:"adtest",google_alternate_ad_url:"alte= rnate_ad_url",google_alternate_color:"alt_color",google_bid:"bid",google= _city:"gcs",google_color_bg:"color_bg",google_color_border:"color_border= ",google_color_line:"color_line",google_color_link:"color_link",google_c= olor_text:"color_text",google_color_url:"color_url", google_contents:"contents",google_country:"gl",google_cust_age:"cust_age= ",google_cust_ch:"cust_ch",google_cust_gender:"cust_gender",google_cust_= id:"cust_id",google_cust_interests:"cust_interests",google_cust_job:"cus= t_job",google_cust_l:"cust_l",google_cust_lh:"cust_lh",google_cust_u_url= :"cust_u_url",google_disable_video_autoplay:"disable_video_autoplay",goo= gle_ed:"ed",google_encoding:"oe",google_feedback:"feedback_link",google_= flash_version:"flash",google_gl:"gl",google_hints:"hints",google_kw:"kw"= , google_kw_type:"kw_type",google_language:"hl",google_referrer_url:"ref",= google_region:"gr",google_reuse_colors:"reuse_colors",google_safe:"adsaf= e",google_targeting:"targeting",google_ui_features:"ui",google_video_doc= _id:"video_doc_id",google_video_product_type:"video_product_type",google= _page_url:"url"},y=3D{google_ad_format:"format",google_ad_output:"output= ",google_ad_callback:"callback",google_ad_override:"google_ad_override",= google_ad_slot:"slotname",google_analytics_uacct:"ga_wpids",google_corre= lator:"correlator", google_cpa_choice:"cpa_choice",google_ctr_threshold:"ctr_t",google_image= _size:"image_size",google_last_modified_time:"lmt",google_max_num_ads:"n= um_ads",google_max_radlink_len:"max_radlink_len",google_num_radlinks:"nu= m_radlinks",google_num_radlinks_per_unit:"num_radlinks_per_unit",google_= only_ads_with_video:"only_ads_with_video",google_page_location:"loc",goo= gle_rl_dest_url:"rl_dest_url",google_rl_filtering:"rl_filtering",google_= rl_mode:"rl_mode",google_rt:"rt",google_skip:"skip"};function z(){}z.pro= totype.n=3Dfunction(){};z.prototype.o=3Dfunction(){};z.prototype.m=3Dfun= ction(){};var D=3Dnull;function E(a){D&&D.n(a)}function H(a){D&&D.o(a)}f= unction ja(a){D&&D.m(a)}function I(){this.b=3Dthis.k();this.e=3Dfalse;if= (!this.b){this.e=3Dthis.g();this.e||H("Browser does not allow cookies")}= }I.prototype.d=3D"__gads=3D";I.prototype.c=3D"GoogleAdServingTest=3D";I.= prototype.j=3Dfunction(){return this.b};I.prototype.setCookieInfo=3Dfunc= tion(a){this.a=3Da._cookies_[0];if(this.a!=3Dnull){this.b=3Dthis.a._valu= e_;this.l()}}; I.prototype.i=3Dfunction(a){var c=3D(new Date).valueOf(),b=3Dnew Date;b.= setTime(c+a);return b};I.prototype.h=3Dfunction(a){if(this.b!=3Dnull||!t= his.e){E("Skipping fetch cookie call");return}var c=3D"script",b=3Ddocum= ent.domain,d=3D"http://partner.googleadservices.com/gampad/cookie.js?cal= lback=3D_GA_googleCookieHelper.setCookieInfo&client=3D"+J(a)+"&domain=3D= "+J(b);E("Issuing a fetch cookie call with "+d+"")= ;document.write("<"+c+' src=3D"'+d+'">")};I.prototype.g=3Dfuncti= on(){document.cookie=3Dthis.c+ "Good";var a=3Dthis.f(this.c),c=3Da=3D=3D"Good";if(c){var b=3Dthis.i(-1)= ;document.cookie=3Dthis.c+"; expires=3D"+b.toGMTString()}return c};I.pro= totype.k=3Dfunction(){var a=3Dthis.f(this.d);a!=3Dnull?E("Read first par= ty cookie: "+a):H("No first party cookie found");return a};I.prototype.f= =3Dfunction(a){var c=3Ddocument.cookie,b=3Dc.indexOf(a),d=3Dnull;if(b!=3D= -1){var e=3Db+a.length,f=3Dc.indexOf(";",e);if(f=3D=3D-1)f=3Dc.length;d=3D= c.substring(e,f)}return d};I.prototype.l=3Dfunction(){if(this.a=3D=3Dnul= l)H("Skipping cookie creation: no cookie info"); else if(this.b=3D=3Dnull)ja("Skipping cookie creation: no cookie value")= ;else{var a=3Dnew Date;a.setTime(1000*this.a._expires_);var c=3Dthis.a._= domain_,b=3Dthis.d+this.b+"; expires=3D"+a.toGMTString()+"; path=3D"+thi= s.a._path_+"; domain=3D."+c;document.cookie=3Db;E("Written cookie: "+b)}= };function ka(){if(navigator.plugins&&navigator.mimeTypes.length){var a=3D= navigator.plugins["Shockwave Flash"];if(a&&a.description)return a.descri= ption.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s)+r/,".")}else if(navigat= or.userAgent&&navigator.userAgent.indexOf("Windows CE")>=3D 0){var c=3D3,b=3D1;while(b)try{b=3Dnew ActiveXObject("ShockwaveFlash.Sho= ckwaveFlash."+(c+1));c++}catch(d){b=3Dnull}return c.toString()}else if(l= a("msie")&&!window.opera){var b=3Dnull;try{b=3Dnew ActiveXObject("Shockw= aveFlash.ShockwaveFlash.7")}catch(d){var c=3D0;try{b=3Dnew ActiveXObject= ("ShockwaveFlash.ShockwaveFlash.6");c=3D6;b.AllowScriptAccess=3D"always"= }catch(d){if(c=3D=3D6)return c.toString()}try{b=3Dnew ActiveXObject("Sho= ckwaveFlash.ShockwaveFlash")}catch(d){}}if(b!=3Dnull){var c=3Db.GetVaria= ble("$version").split(" ")[1]; return c.replace(/,/g,".")}}return"0"};window.IDICommon=3Dwindow.IDIComm= on||(function(){return{getHash:function(a){var c=3Da.indexOf("#")+1;retu= rn c?a.substr(c):""},htmlEscape:function(a){return/[&<>\"]/.test(a)?a.re= place(/&/g,"&").replace(//g,">").replace(/\= "/g,"""):a},makeIframeTag:function(a){var c=3D""},getIframe:function(a,c){try{return a.frames[c]}catch(b){return null}= },makeIframeNode:function(a){var c=3Ddocument.createElement("iframe"); for(var b in a)c.setAttribute(b,a[b]);return c},appendHiddenIframe:funct= ion(a,c){setTimeout(function(){document.body.appendChild(IDICommon.makeI= frameNode({id:a,name:a,src:c,width:0,height:0,frameBorder:0}))},0)},writ= eHiddenIframe:function(a,c){document.write(IDICommon.makeIframeTag({id:a= ,name:a,src:c,width:0,height:0,frameBorder:0}))},splitURIComponent:funct= ion(a,c){var b=3D[],d=3Da.length,e=3D0;while(e0){e[h]=3Dv[B];for(var C=3D0;CIDICommon.MAX_URL_LENGTH){K+=3D"$";var da=3Dq(= h),ua=3DIDICommon.MAX_URL_LENGTH-1-da.length,ea=3DIDICommon.splitURIComp= onent(K,ua),fa=3Dea.length;for(var G=3D0;G1)b=3De[0];retur= n na(b,"\"'")};var Ha=3D{google:1,googlegroups:1,gmail:1,googlemail:1,or= kut:1,googleimages:1,googleprint:1};function Ia(a){var c=3Da.google_page= _location||a.google_page_url;if(!c)return false;c=3Dc.toString();if(c.in= dexOf("http://")=3D=3D0)c=3Dc.substring(7,c.length);else if(c.indexOf("h= ttps://")=3D=3D0)c=3Dc.substring(8,c.length);var b=3Dc.indexOf("/");if(b= =3D=3D-1)b=3Dc.length;var d=3Dc.substring(0,b),e=3Dd.split("."),f=3Dfals= e;if(e.length>=3D3)f=3De[e.length-3]in Ha;if(e.length>=3D2)f=3Df||e[e.le= ngth-2]in Ha;return f}function Ja(a,c){var b=3D"http://googleads.g.doubl= eclick.net", d=3D"http://pagead2.googlesyndication.com";if(!Ia(a)&&Math.random()");else if(a.google_= ad_output=3D=3D"html"){if(a.name!=3D"google_ads_frame"){d!=3Dnull&&c.wri= te('
');if(Qa(a.google_ad_output,a.google_ad_client)){I= DIHost.setModuleRelayUrl("http://pagead2.googlesyndication.com/pagead/id= i_relay.html");var f=3D0;if(a.google_num_0ad_slots)f+=3Da.google_num_0ad= _slots;if(a.google_num_ad_slots)f+=3D a.google_num_ad_slots;if(a.google_num_sdo_slots)f+=3Da.google_num_sdo_sl= ots;var i=3D"google_inline_div"+f,k=3D"
';c.write(k);var j=3D"google_frame"+f,q=3Da.setTimeout= (function(){IDIHost.unregisterListener(j)},5000);IDIHost.createModule(b,= j,a.google_ad_width,a.google_ad_height,{callback:function(o,r){Oa(o,r,q)= },pollingInterval:500, iframeAttrs:{style:"position: absolute;left:0px",marginWidth:"0",marginH= eight:"0",vspace:"0",hspace:"0",allowTransparency:"true"},parentDivId:i}= )}else{c.write('")}d!=3Dnull&&c.write("
")}}else a.google_ad_outp= ut=3D=3D"textlink"&&c.write("<"+ e+' language=3D"JavaScript1.1" src=3D'+M(b)+">")}function Ra(a){= for(var c in s)a[c]=3Dnull;for(var c in y){if(c=3D=3D"google_correlator"= )continue;a[c]=3Dnull}}function Sa(a){if(a.google_ad_format)return a.goo= gle_ad_format.indexOf("_0ads")>0;return a.google_ad_output!=3D"html"&&a.= google_num_radlinks>0}function Z(a){return a&&a.indexOf("_sdo")!=3D-1}fu= nction Ta(a){var c=3Dnull,b=3Dwindow,d=3Ddocument,e=3Dnew Date,f=3De.get= Time(),i=3Db.google_ad_format,k=3DJa(b,0.0010);if(b.google_cpa_choice!=3D= c){b.google_ad_url=3Dk+"/cpa/ads?"; b.google_ad_url+=3D"client=3D"+escape(W(b.google_ad_client));b.google_ad= _region=3D"_google_cpa_region_";O("google_cpa_choice");if(typeof d.chara= cterSet!=3D"undefined")P("oe",d.characterSet);else typeof d.charset!=3D"= undefined"&&P("oe",d.charset)}else if(Z(i)){b.google_ad_url=3Dk+"/pagead= /sdo?";b.google_ad_url+=3D"client=3D"+escape(Ma(b.google_ad_client))}els= e{b.google_ad_url=3Dk+"/pagead/ads?";b.google_ad_url+=3D"client=3D"+esca= pe(W(b.google_ad_client))}O("google_ad_host");O("google_ad_host_tier_id"= );var j=3Db.google_num_slots_by_client, q=3Db.google_num_slots_by_channel,o=3Db.google_prev_ad_formats_by_region= ,r=3Db.google_prev_ad_slotnames_by_region;if(b.google_ad_region=3D=3Dc&&= b.google_ad_section!=3Dc)b.google_ad_region=3Db.google_ad_section;var p=3D= b.google_ad_region=3D=3Dc?"":b.google_ad_region;if(Z(i)){b.google_num_sd= o_slots=3Db.google_num_sdo_slots?b.google_num_sdo_slots+1:1;if(b.google_= num_sdo_slots>4)return false}else if(Sa(b)){b.google_num_0ad_slots=3D