Content-Type: multipart/related; start=; boundary=----------OXlwpPrVEpg5DjWyC2eogS Content-Location: http://es.wikipedia.org/wiki/Diglosia Subject: =?utf-8?Q?Diglosia=20-=20Wikipedia,=20la=20enciclopedia=20libre?= MIME-Version: 1.0 ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=Diglosia.htm Content-Type: text/html; charset=UTF-8; name=Diglosia.htm Content-ID: Content-Location: http://es.wikipedia.org/wiki/Diglosia Content-Transfer-Encoding: 8bit Diglosia - Wikipedia, la enciclopedia libre

Diglosia

De Wikipedia, la enciclopedia libre
No debe confundirse con Disglosia.

La diglosia (del griego δίγλωσσος, "de dos lenguas") es la situación de convivencia de dos variedades lingüísticas en el seno de una misma población o territorio, donde uno de los idiomas tiene un estatus de prestigio —como lengua de cultura, de prestigio o de uso oficial— frente al otro, que es relegado a las situaciones socialmente inferiores de la oralidad, la vida familiar y el folklore.[1] Cuando hay tres o más lenguas, a tal situación se la denomina poliglosia o multiglosia.[2]

Existe un reparto de funciones entre una variedad alta (A) y una variedad baja (B), de forma que cada una es usada sólo en ciertos ámbitos o dominios: la variedad A, en situaciones formales y distantes, y la B, en contextos informales. Resultaría impropio o ridículo usar indistintamente ambas variantes. La comunidad diglósica considera que la variedad A es más prestigiosa que la variedad B. La variante B suele adquirirse como lengua materna, en tanto que la A sólo se aprende formalmente en contextos académicos.

La variedad A posee unas categorías gramaticales que se reducen o desaparecen en la variedad B. La variedad A dispone de un léxico culto, técnico y especializado del que carece B. A su vez, ésta cuenta con el vocabulario y las expresiones fraseológicas propias del ámbito familiar y popular. La variedad A está estandarizada gracias a la elaboración de gramáticas, diccionarios y normativas ortográficas que permiten su conocimiento; tal proceso de estandarización no existe para la variedad B. Asimismo, existe un corpus literario en la variedad A que constituye la herencia literaria, inexistente en B.

Las situaciones diglósicas pueden perdurar durante siglos, si bien la aparición de subvariedades mixtas entre A y B, así como la progresiva confusión de funciones sociales durante ese tiempo, pueden evolucionar hasta hacer desaparecer la diglosia.

Por su parte, el concepto de diglosia amplia, utilizado por la sociología del lenguaje actual, se debe a J. Fishman (1972), para quien aquélla abarca todas las situaciones en las que existe una distribución funcional de dos variedades lingüísticas en una comunidad de habla -tanto si son dialectos, sociolectos o registros de una misma lengua, como si se trata de dos lenguas diferentes-. Concebida de este modo, la diglosia amplia comprende un continuum de situaciones que van desde los supuestos en los que se usan lenguas diferentes (bilingüismo superpuesto) hasta los casos de mera variación estilística. Sin embargo, esta concepción amplia no ha estado exenta de críticas porque, en esos términos, todas las sociedades son diglósicas y el concepto comprende entonces fenómenos de muy diferente naturaleza.

[editar] Referencias

  1. Francisco Moscoso García, Diccionario español árabe marroquí, Junta de Andalucía, 2005, p. 9: "La existencia de dos registros de una misma lengua, el culto y el dialectal, es lo que se conoce con el nombre de «diglosia»".
  2. Helena Beristáin (1995). Diccionario de retórica y poética (7ª ed.). México: Porrúa. pp. 150. ISBN:9684528779. : "En la diglosia hay otra lengua (además del castellano); cuando hay más, se llama multiglosia, término introducido por Ballón".
Herramientas personales
Espacios de nombres
Variantes
Acciones
------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=favicon.ico Content-Type: image/x-icon; name=favicon.ico Content-Location: http://es.wikipedia.org/favicon.ico Content-Transfer-Encoding: Base64 AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAA AAAAAAAAEAAAAAAAAAAEAgQAhIOEAMjHyABIR0gA6ejpAGlqaQCpqKkAKCgoAPz9 /AAZGBkAmJiYANjZ2ABXWFcAent6ALm6uQA8OjwAiIiIiIiIiIiIiI4oiL6IiIiI gzuIV4iIiIhndo53KIiIiB/WvXoYiIiIfEZfWBSIiIEGi/foqoiIgzuL84i9iIjp GIoMiEHoiMkos3FojmiLlUipYliEWIF+iDe0GoRa7D6GPbjcu1yIiIiIiIiIiIiI iIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/skins-1.5/vector/images/page-base.png?1 Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAANQTFRF9vb2AAsjqgAAAApJREFUCB1j YAAAAAIAAc/INeUAAAAASUVORK5CYII= ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/skins-1.5/vector/images/border.png?1 Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAANQTFRFp9f5cVVvXwAAAApJREFUCB1j YAAAAAIAAc/INeUAAAAASUVORK5CYII= ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/skins-1.5/vector/images/page-fade.png?1 Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAEAAAAsCAMAAACT+SJTAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFdQTFRF+fn49/f2+/v89vf3/v79/v3+ /v/++fj4/fz89/f4+fr5/f79/Pv8+Pn59/b2+/v7/f38+Pj4+vr5+vr7/Pz8+fn5 9vb29/j4+vr6/v7+/f399/f3////vR8U6wAAADxJREFUeNotwgcOgCAURMEnKnaw Yr3/Od38kBm+zHObmoqBx8y07OIYiWxyyUrPITDRsHBKx2tKCgKJ9AOMswMINl/f OQAAAABJRU5ErkJggg== ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/skins-1.5/vector/images/tab-break.png?1 Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAEAAAAuCAMAAADeMYNYAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAGBQTFRFyuf7xeX6vuL6td76qtn5+vv7 9/n7rtr5/Pz84vH7sNv6weP60en7qNf56vX74PD77fb7zuj77/b8stz65/P78/j8 8ff83e/7uuD61ev79Pj75PL72Oz72+370+v7uN/6UiPZnwAAAD1JREFUeNpNwccB gCAABMFFMaMIZkz9d+k9naH+LbTUxMJKZGRg1pMGz8bNxcGDI4AY7cjY9SVn0pZK rfYfcHYCb27V9m8AAAAASUVORK5CYII= ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/skins-1.5/vector/images/tab-normal-fade.png?1 Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAEAAABkCAMAAABw8qpSAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFpQTFRF/P3++fv9+vz+6vT46vP49/r9 +Pv9p9f57PT6+/z+7PT59vr98/j77vb69Pn89Pn76vL48ff67fT68ff77vX6/v// 9fr86PL4+/3+7/b68vf7/f7+/v7/////unDFUAAAADpJREFUeNrFwoURg0AAALDg Li3SYvuvyR9LcInrZYvzcTzgrxIHUZDLNFa9QWs3+dh0Zl+lWiI1+iluKncJSLF7 CNkAAAAASUVORK5CYII= ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/skins-1.5/vector/images/tab-current-fade.png?1 Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAEAAABkAQMAAAB94sgjAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAANQTFRF////p8QbyAAAAAxJREFUCB1j YBgeAAAAyAABP2UdiQAAAABJRU5ErkJggg== ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/skins-1.5/vector/images/search-fade.png?1 Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAEAAAAQBAMAAAAlsQiEAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACpQTFRF9vf3/v/++fr5/Pv8+/v7/f38 +Pj4+fn59vb2+vr6/v7+/f399/f3////Hp8+5gAAACVJREFUCNdjaGBoYDjAkACE BQwKDBMYHBgMGAIYNgDhAoYLDBcAdIAIAfO0JnYAAAAASUVORK5CYII= ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/skins-1.5/vector/images/portal-break.png?1 Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAIwAAAABCAMAAAA7MLYKAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEtQTFRF29vb2tra4ODg6urq5OTk4uLi 6+vr7e3t7Ozs8PDw5+fn4+Pj4eHh3d3d39/f6Ojo5eXl6enp8fHx8/Pz8vLy7+/v 3Nzc2dnZ2NjYnErj7QAAAD1JREFUeNq0wQUBACAMALDj7hf6JyUFGxzEnYhC9GaN PG1xVffGDErk/iCigLl1XV2xM49lfAxEaSM+AQYA9HMKuv4liFQAAAAASUVORK5C YII= ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/skins-1.5/vector/images/bullet-icon.png?1 Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAUAAAANCAMAAABW4lS6AAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAZQTFRFAFKM////QIUK9QAAAAJ0Uk5T /wDltzBKAAAAGklEQVR42mJgBAEGokgGBjBGBxBxsBqAAAMACHwALd5r8ygAAAAA SUVORK5CYII= ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/skins-1.5/vector/images/external-link-ltr-icon.png?2 Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAGBQTFRF////AGb/AGbMmcz/M5nMZpnM ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7feQVwAAAAd0Uk5T//////// ABpLA0YAAAA6SURBVHjaJMtBDgBABARBs4P/P3kbfZCKEE3aAmUFLVu5fCQfGQ7n ciTV0GW9zp4Ds+B5SMcLfgEGADSKAPVZzedhAAAAAElFTkSuQmCC ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/skins-1.5/vector/images/user-icon.png?1 Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAoAAAALCAMAAABxsOwqAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAGBQTFRF78mOboqv0K93R2uZ4a1a5rp2 N2mnMmGd/Pr4k6zMMFySTXWr2Jg157Vn4Zst9unUl6a836ZMr7CwooVQPXGwpLnW 5KQ/vMne+O/gXXiV6+zt5Orx1t7n7/Dwgpm5////xZOJMQAAACB0Uk5T//////// /////////////////////////////////wBcXBvtAAAAY0lEQVR42hzKSQKAIAwE wWAMQUBBQdzN/38p0pepw4DI3vVzH0RADBCNpTOVYaZAxYefZaQyNZplqrXDeiTv 07EJ3C67uGR0F7yo9bAyYwSFrJ1iywoi19HW2gjPiy11fgIMAJ51Bh79zDO4AAAA AElFTkSuQmCC ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=main-ltr.css Content-Type: text/css; name=main-ltr.css Content-Location: http://bits.wikimedia.org/skins-1.5/vector/main-ltr.css?283-17 Content-Transfer-Encoding: 8bit /* * main-rtl.css is automatically generated using CSSJanus, a python script for * creating RTL versions of otherwise LTR stylesheets. * * You may download the tool to rebuild this stylesheet * http://code.google.com/p/cssjanus/ * * An online version of this tool can be used at: * http://cssjanus.commoner.com/ * * The following command is used to generate the RTL version of this file * ./cssjanus.py --swap_ltr_rtl_in_url < main-ltr.css > main-rtl.css * * Any rules which should not be flipped should be prepended with @noflip in * a comment block. */ /* Framework */ html, body { height: 100%; margin: 0; padding: 0; font-family: sans-serif; font-size: 1em; } body { background-color: #f3f3f3; background-image: url(images/page-base.png?1); } /* Content */ #content { margin-left: 10em; padding: 1em; background-image: url(images/border.png?1); background-position: top left; background-repeat: repeat-y; background-color: white; color: black; } /* Head */ #mw-page-base { height: 5em; background-color: white; background-image: url(images/page-fade.png?1); background-position: bottom left; background-repeat: repeat-x; } #mw-head-base { margin-top: -5em; margin-left: 10em; height: 5em; background-image: url(images/border.png?1); background-position: bottom left; background-repeat: repeat-x; } div#mw-head { position: absolute; top: 0; right: 0; width: 100%; } div#mw-head h5 { margin: 0; padding: 0; } /* Hide empty portlets */ div.emptyPortlet { display: none; } /* Personal */ #p-personal { position: absolute; top: 0; padding-left: 10em; right: 0.75em; } #p-personal h5 { display: none; } #p-personal ul { list-style: none; margin: 0; padding: 0; } /* @noflip */ #p-personal li { line-height: 1.125em; float: left; } /* This one flips! */ #p-personal li { margin-left: 0.75em; margin-top: 0.5em; font-size: 0.75em; white-space: nowrap; } /* Navigation Containers */ #left-navigation { position: absolute; left: 10em; top: 2.5em; } #right-navigation { float: right; margin-top: 2.5em; } /* Navigation Labels */ div.vectorTabs h5, div.vectorMenu h5 span { display: none; } /* Namespaces and Views */ /* @noflip */ div.vectorTabs { float: left; height: 2.5em; } div.vectorTabs { background-image: url(images/tab-break.png?1); background-position: bottom left; background-repeat: no-repeat; padding-left: 1px; } /* @noflip */ div.vectorTabs ul { float: left; } div.vectorTabs ul { height: 100%; list-style: none; margin: 0; padding: 0; } /* @noflip */ div.vectorTabs ul li { float: left; } /* OVERRIDDEN BY COMPLIANT BROWSERS */ div.vectorTabs ul li { line-height: 1.125em; display: inline-block; height: 100%; margin: 0; padding: 0; background-color: #f3f3f3; background-image: url(images/tab-normal-fade.png?1); background-position: bottom left; background-repeat: repeat-x; white-space:nowrap; } /* IGNORED BY IE6 */ div.vectorTabs ul > li { display: block; } div.vectorTabs li.selected { background-image: url(images/tab-current-fade.png?1); } /* OVERRIDDEN BY COMPLIANT BROWSERS */ div.vectorTabs li a { display: inline-block; height: 2.5em; padding-left: 0.4em; padding-right: 0.4em; background-image: url(images/tab-break.png?1); background-position: bottom right; background-repeat: no-repeat; } div.vectorTabs li a, div.vectorTabs li a span { color: #0645ad; cursor: pointer; } div.vectorTabs li a span { font-size: 0.8em; } /* IGNORED BY IE6 */ div.vectorTabs li > a { display: block; } /* OVERRIDDEN BY COMPLIANT BROWSERS */ div.vectorTabs a span { display: inline-block; padding-top: 1.25em; } /* IGNORED BY IE6 */ /* @noflip */ div.vectorTabs a > span { float: left; display: block; } div.vectorTabs li.selected a, div.vectorTabs li.selected a span, div.vectorTabs li.selected a:visited div.vectorTabs li.selected a:visited span { color: #333333; text-decoration: none; } div.vectorTabs li.new a, div.vectorTabs li.new a span, div.vectorTabs li.new a:visited, div.vectorTabs li.new a:visited span { color: #a55858; } /* Variants and Actions */ /* @noflip */ div.vectorMenu { direction: ltr; float: left; background-image: url(images/arrow-down-icon.png?1); background-position: 100% 60%; background-repeat: no-repeat; cursor: pointer; } /* @noflip */ body.rtl div.vectorMenu { direction: rtl; } /* OVERRIDDEN BY COMPLIANT BROWSERS */ /* @noflip */ div#mw-head div.vectorMenu h5 { float: left; background-image: url(images/tab-break.png?1); background-repeat: no-repeat; } /* IGNORED BY IE6 */ div#mw-head div.vectorMenu > h5 { background-image: none; } div#mw-head div.vectorMenu h5 { background-position: bottom left; margin-left: -1px; } div#mw-head div.vectorMenu h4 { display: inline-block; float: left; font-size: 0.8em; padding-left: 0.5em; padding-top: 1.375em; font-weight: normal; border: none; } /* OVERRIDDEN BY COMPLIANT BROWSERS */ /* @noflip */ div.vectorMenu h5 a { display: inline-block; width: 24px; height: 2.5em; text-decoration: none; background-image: url(images/tab-break.png?1); background-repeat: no-repeat; } div.vectorMenu h5 a{ background-position: bottom right; } /* IGNORED BY IE6 */ div.vectorMenu h5 > a { display: block; } div.vectorMenu div.menu { position: relative; display: none; clear: both; text-align: left; } /* OVERRIDDEN BY COMPLIANT BROWSERS */ /* @noflip */ body.rtl div.vectorMenu div.menu { margin-left: 24px; } /* IGNORED BY IE6 */ /* @noflip */ body.rtl div.vectorMenu > div.menu { margin-left: auto; } /* Fixes old versions of FireFox */ /* @noflip */ body.rtl div.vectorMenu > div.menu, x:-moz-any-link { margin-left: 23px; } div.vectorMenu:hover div.menu { display: block; } div.vectorMenu ul { position: absolute; background-color: white; border: solid 1px silver; border-top-width: 0; list-style: none; list-style-image: none; list-style-type: none; padding: 0; margin: 0; margin-left: -1px; text-align: left; } /* Fixes old versions of FireFox */ div.vectorMenu ul, x:-moz-any-link { min-width: 5em; } /* Returns things back to normal in modern versions of FireFox */ div.vectorMenu ul, x:-moz-any-link, x:default { min-width: 0; } div.vectorMenu li { padding: 0; margin: 0; text-align: left; line-height: 1em; } /* OVERRIDDEN BY COMPLIANT BROWSERS */ div.vectorMenu li a { display: inline-block; padding: 0.5em; white-space: nowrap; } /* IGNORED BY IE6 */ div.vectorMenu li > a { display: block; } div.vectorMenu li a { color: #0645ad; cursor: pointer; font-size: 0.8em; } div.vectorMenu li.selected a, div.vectorMenu li.selected a:visited { color: #333333; text-decoration: none; } /* Search */ #p-search h5 { display: none; } /* @noflip */ #p-search { float: left; } #p-search { margin-right: 0.5em; margin-left: 0.5em; } #p-search form, #p-search input { margin: 0; margin-top: 0.4em; } #simpleSearch { margin-top: 0.65em; position: relative; min-height: 1px; /* Gotta trigger hasLayout for IE7 */ border: solid 1px #AAAAAA; background-color: white; background-image: url(images/search-fade.png?1); background-position: top left; background-repeat: repeat-x; } #simpleSearch label { font-size: 13px; top: 0.25em; } div#simpleSearch .placeholder { color: #999999; } div#simpleSearch input::-webkit-input-placeholder { color: #999999; } div#simpleSearch input#searchInput { margin: 0; border-width: 0; padding: 3px; vertical-align: top; font-size: 13px; width: 14em; background-color: transparent; } /* OVERRIDDEN BY COMPLIANT BROWSERS */ #simpleSearch button#searchButton { padding: 0; margin: 0 5px; border: none; cursor: pointer; background-color: transparent; font-size: x-small; } div#simpleSearch button#searchButton img { border: none; margin: 0; padding: 0; vertical-align: middle; } /* Panel */ div#mw-panel { position: absolute; top: 160px; padding-top: 1em; width: 10em; left: 0; } div#mw-panel div.portal { padding-bottom: 1.5em; } div#mw-panel div.portal h5 { font-weight: normal; color: #444444; padding: 0.25em; padding-top: 0; padding-left: 1.75em; cursor: default; border: none; font-size: 0.75em; } div#mw-panel div.portal div.body { margin: 0; padding-top: 0.5em; margin-left: 1.25em; background-image: url(images/portal-break.png?1); background-repeat: no-repeat; background-position: top left; } div#mw-panel div.portal div.body ul { list-style: none; list-style-image: none; list-style-type: none; padding: 0; margin: 0; } div#mw-panel div.portal div.body ul li { line-height: 1.125em; padding: 0; padding-bottom: 0.5em; margin: 0; overflow: hidden; font-size: 0.75em; } div#mw-panel div.portal div.body ul li a { color: #0645ad; } div#mw-panel div.portal div.body ul li a:visited { color: #0b0080; } /* Footer */ #footer { margin-left: 10em; margin-top: 0; padding: 0.75em; background-image: url(images/border.png?1); background-position: top left; background-repeat: repeat-x; } #footer ul { list-style: none; list-style-image: none; list-style-type: none; margin: 0; padding: 0; } #footer ul li { margin: 0; padding: 0; padding-top: 0.5em; padding-bottom: 0.5em; color: #333333; font-size: 0.7em; } #footer #footer-icons { float: right; } /* @noflip */ body.ltr #footer #footer-places { float: left; } #footer #footer-info li { line-height: 1.4em; } #footer #footer-icons li { float: left; margin-left: 0.5em; line-height: 2em; } #footer #footer-places li { float: left; margin-right: 1em; line-height: 2em; } /* Logo */ #p-logo { position: absolute; top: -160px; left: 0; width: 10em; height: 160px; } #p-logo a { display: block; width: 10em; height: 160px; background-repeat: no-repeat; background-position: center center; text-decoration: none; } /* * * The following code is highly modified from monobook. It would be nice if the * preftoc id was more human readable like preferences-toc for instance, * howerver this would require backporting the other skins. */ /* Preferences */ #preftoc { /* Tabs */ width: 100%; float: left; clear: both; margin: 0 !important; padding: 0 !important; background-image: url(images/preferences-break.png?1); background-position: bottom left; background-repeat: no-repeat; } #preftoc li { /* Tab */ float: left; margin: 0; padding: 0; padding-right: 1px; height: 2.25em; white-space: nowrap; list-style-type: none; list-style-image: none; background-image: url(images/preferences-break.png?1); background-position: bottom right; background-repeat: no-repeat; } /* IGNORED BY IE6 */ #preftoc li:first-child { margin-left: 1px; } #preftoc a, #preftoc a:active { display: inline-block; position: relative; color: #0645ad; padding: 0.5em; text-decoration: none; background-image: none; font-size: 0.9em; } #preftoc a:hover { text-decoration: underline; } #preftoc li.selected a { background-image: url(images/preferences-fade.png?1); background-position: bottom; background-repeat: repeat-x; color: #333333; text-decoration: none; } #preferences { float: left; width: 100%; margin: 0; margin-top: -2px; clear: both; border: solid 1px #cccccc; background-color: #f9f9f9; background-image: url(images/preferences-base.png?1); } #preferences fieldset.prefsection { border: none; padding: 0; margin: 1em; } #preferences fieldset.prefsection fieldset { border: none; border-top: solid 1px #cccccc; } #preferences legend { color: #666666; } #preferences fieldset.prefsection legend.mainLegend { display: none; } #preferences td { padding-left: 0.5em; padding-right: 0.5em; } #preferences td.htmlform-tip { font-size: x-small; padding: .2em 2em; color: #666666; } #preferences div.mw-prefs-buttons { padding: 1em; } #preferences div.mw-prefs-buttons input { margin-right: 0.25em; } /* * Styles for the user login and create account forms */ #userlogin, #userloginForm { border: solid 1px #cccccc; padding: 1.2em; margin: .5em; float: left; } #userlogin { min-width: 20em; max-width: 90%; width: 40em; } /* * * The following code is slightly modified from monobook * */ #content { line-height: 1.5em; } #bodyContent { font-size: 0.8em; } /* Links */ a { text-decoration: none; color: #0645ad; background: none; } a:visited { color: #0b0080; } a:active { color: #faa700; } a:hover { text-decoration: underline; } a.stub { color: #772233; } a.new, #p-personal a.new { color: #ba0000; } a.new:visited, #p-personal a.new:visited { color: #a55858; } /* Inline Elements */ img { border: none; vertical-align: middle; } hr { height: 1px; color: #aaa; background-color: #aaa; border: 0; margin: .2em 0 .2em 0; } /* Structural Elements */ h1, h2, h3, h4, h5, h6 { color: black; background: none; font-weight: normal; margin: 0; padding-top: .5em; padding-bottom: .17em; border-bottom: 1px solid #aaa; width: auto; } h1 { font-size: 188%; } h1 .editsection { font-size: 53%; } h2 { font-size: 150%; } h2 .editsection { font-size: 67%; } h3, h4, h5, h6 { border-bottom: none; font-weight: bold; } h3 { font-size: 132%; } h3 .editsection { font-size: 76%; font-weight: normal; } h4 { font-size: 116%; } h4 .editsection { font-size: 86%; font-weight: normal; } h5 { font-size: 100%; } h5 .editsection { font-weight: normal; } h6 { font-size: 80%; } h6 .editsection { font-size: 125%; font-weight: normal; } p { margin: .4em 0 .5em 0; line-height: 1.5em; } p img { margin: 0; } abbr, acronym, .explain { border-bottom: 1px dotted black; color: black; background: none; cursor: help; } q { font-family: Times, "Times New Roman", serif; font-style: italic; } /* Disabled for now blockquote { font-family: Times, "Times New Roman", serif; font-style: italic; }*/ pre, code, tt { /* * It's important for this rule to first reference an actual font name, some browsers will render the monospace text * too small otherwise, namely Firefox, Chrome and Safari */ font-family: monospace, "Courier New"; } code { background-color: #f9f9f9; } pre { padding: 1em; border: 1px dashed #2f6fab; color: black; background-color: #f9f9f9; line-height: 1.1em; } ul { line-height: 1.5em; list-style-type: square; margin: .3em 0 0 1.5em; padding: 0; list-style-image: url(images/bullet-icon.png?1); } ol { line-height: 1.5em; margin: .3em 0 0 3.2em; padding: 0; list-style-image: none; } li { margin-bottom: .1em; } dt { font-weight: bold; margin-bottom: .1em; } dl { margin-top: .2em; margin-bottom: .5em; } dd { line-height: 1.5em; margin-left: 2em; margin-bottom: .1em; } /* Tables */ table { font-size: 100%; color: black; /* we don't want the bottom borders of

s to be visible through * floated tables */ background-color: white; } fieldset table { /* but keep table layouts in forms clean... */ background: none; } /* Forms */ fieldset { border: 1px solid #2f6fab; margin: 1em 0 1em 0; padding: 0 1em 1em; line-height: 1.5em; } fieldset.nested { margin: 0 0 0.5em 0; padding: 0 0.5em 0.5em; } legend { padding: .5em; font-size: 95%; } form { border: none; margin: 0; } textarea { width: 100%; padding: .1em; } select { vertical-align: top; } /* Table of Contents */ #toc, .toc, .mw-warning { border: 1px solid #aaa; background-color: #f9f9f9; padding: 5px; font-size: 95%; } #toc h2, .toc h2 { display: inline; border: none; padding: 0; font-size: 100%; font-weight: bold; } #toc #toctitle, .toc #toctitle, #toc .toctitle, .toc .toctitle { text-align: center; } #toc ul, .toc ul { list-style-type: none; list-style-image: none; margin-left: 0; padding-left: 0; text-align: left; } #toc ul ul, .toc ul ul { margin: 0 0 0 2em; } #toc .toctoggle, .toc .toctoggle { font-size: 94%; } /* Images */ div.floatright, table.floatright { clear: right; float: right; position: relative; margin: 0 0 .5em .5em; border: 0; } div.floatright p { font-style: italic; } div.floatleft, table.floatleft { float: left; clear: left; position: relative; margin: 0 .5em .5em 0; border: 0; } div.floatleft p { font-style: italic; } /* Thumbnails */ div.thumb { margin-bottom: .5em; border-style: solid; border-color: white; width: auto; background-color: transparent; } div.thumbinner { border: 1px solid #ccc; padding: 3px !important; background-color: #f9f9f9; font-size: 94%; text-align: center; overflow: hidden; } html .thumbimage { border: 1px solid #ccc; } html .thumbcaption { border: none; text-align: left; line-height: 1.4em; padding: 3px !important; font-size: 94%; } div.magnify { float: right; border: none !important; background: none !important; } div.magnify a, div.magnify img { display: block; border: none !important; background: none !important; } /* @noflip */ div.tright { clear: right; float: right; border-width: .5em 0 .8em 1.4em; } /* @noflip */ div.tleft { float: left; clear: left; margin-right: .5em; border-width: .5em 1.4em .8em 0; } img.thumbborder { border: 1px solid #dddddd; } .hiddenStructure { display: none; } /* Warning */ .mw-warning { margin-left: 50px; margin-right: 50px; text-align: center; } /* User Message */ .usermessage { background-color: #ffce7b; border: 1px solid #ffa500; color: black; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; } /* Site Notice (includes notices from CentralNotice extension) */ #siteNotice { position: relative; text-align: center; font-size: 0.8em; margin: 0; } #localNotice { margin-bottom: 0.9em; } /* Categories */ .catlinks { border: 1px solid #aaa; background-color: #f9f9f9; padding: 5px; margin-top: 1em; clear: both; } /* Sub-navigation */ #siteSub { display: none; } #jump-to-nav { display: none; } #contentSub, #contentSub2 { font-size: 84%; line-height: 1.2em; margin: 0 0 1.4em 1em; color: #7d7d7d; width: auto; } span.subpages { display: block; } /* Emulate Center */ .center { width: 100%; text-align: center; } *.center * { margin-left: auto; margin-right: auto; } /* Small for tables and similar */ .small, .small * { font-size: 94%; } table.small { font-size: 100%; } /* Edge Cases for Content */ h1, h2 { margin-bottom: .6em; } h3, h4, h5 { margin-bottom: .3em; } #firstHeading { padding-top: 0; margin-top: 0; padding-top: 0; margin-bottom: 0.1em; line-height: 1.2em; font-size: 1.6em; padding-bottom: 0; } #content a.external, #content a[href ^="gopher://"] { background: url(images/external-link-ltr-icon.png?2) center right no-repeat; padding: 0 13px 0 0; } #content a[href ^="https://"], .link-https { background: url(images/lock-icon.png?2) center right no-repeat; padding: 0 13px 0 0; } #content a[href ^="mailto:"], .link-mailto { background: url(images/mail-icon.png?2) center right no-repeat; padding: 0 13px 0 0; } #content a[href ^="news://"] { background: url(images/news-icon.png?2) center right no-repeat; padding: 0 13px 0 0; } #content a[href ^="ftp://"], .link-ftp { background: url(images/file-icon.png?2) center right no-repeat; padding: 0 13px 0 0; } #content a[href ^="irc://"], #content a.extiw[href ^="irc://"], .link-irc { background: url(images/talk-icon.png?2) center right no-repeat; padding: 0 13px 0 0; } #content a.external[href $=".ogg"], #content a.external[href $=".OGG"], #content a.external[href $=".mid"], #content a.external[href $=".MID"], #content a.external[href $=".midi"], #content a.external[href $=".MIDI"], #content a.external[href $=".mp3"], #content a.external[href $=".MP3"], #content a.external[href $=".wav"], #content a.external[href $=".WAV"], #content a.external[href $=".wma"], #content a.external[href $=".WMA"], .link-audio { background: url("images/audio-icon.png?2") center right no-repeat; padding: 0 13px 0 0; } #content a.external[href $=".ogm"], #content a.external[href $=".OGM"], #content a.external[href $=".avi"], #content a.external[href $=".AVI"], #content a.external[href $=".mpeg"], #content a.external[href $=".MPEG"], #content a.external[href $=".mpg"], #content a.external[href $=".MPG"], .link-video { background: url("images/video-icon.png?2") center right no-repeat; padding: 0 13px 0 0; } #content a.external[href $=".pdf"], #content a.external[href $=".PDF"], #content a.external[href *=".pdf#"], #content a.external[href *=".PDF#"], #content a.external[href *=".pdf?"], #content a.external[href *=".PDF?"], .link-document { background: url("images/document-icon.png?2") center right no-repeat; padding: 0 13px 0 0; } /* Interwiki Styling (Disabled) */ #content a.extiw, #content a.extiw:active { color: #36b; background: none; padding: 0; } #content a.external { color: #36b; } #content .printfooter { display: none; } /* Icon for Usernames */ #pt-userpage, #pt-anonuserpage, #pt-login { background: url(images/user-icon.png?1) left top no-repeat; padding-left: 15px !important; text-transform: none; } .toccolours { border: 1px solid #aaa; background-color: #f9f9f9; padding: 5px; font-size: 95%; } #bodyContent { position: relative; width: 100%; } #mw-js-message { font-size: 0.8em; } div#bodyContent { line-height: 1.5em; } /* Watch/Unwatch Icon Styling */ #ca-unwatch.icon, #ca-watch.icon { margin-right:1px; } #ca-unwatch.icon a, #ca-watch.icon a { margin: 0; padding: 0; outline: none; display: block; width: 26px; height: 2.5em; } #ca-unwatch.icon a { background-image: url(images/watch-icons.png?1); background-position: -43px 60%; } #ca-watch.icon a { background-image: url(images/watch-icons.png?1); background-position: 5px 60%; } #ca-unwatch.icon a:hover { background-image: url(images/watch-icons.png?1); background-position: -67px 60%; } #ca-watch.icon a:hover { background-image: url(images/watch-icons.png?1); background-position: -19px 60%; } #ca-unwatch.icon a.loading, #ca-watch.icon a.loading { background-image: url(images/watch-icon-loading.gif?1); background-position: center 60%; } #ca-unwatch.icon a span, #ca-watch.icon a span { display: none; } div.vectorTabs ul { background-image:url(images/tab-break.png?1); background-position:right bottom; background-repeat:no-repeat; } ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=shared.css Content-Type: text/css; name=shared.css Content-Location: http://bits.wikimedia.org/skins-1.5/common/shared.css?283-17 Content-Transfer-Encoding: 8bit /** * CSS in this file is used by *all* skins (that have any CSS at all). Be * careful what you put in here, since what looks good in one skin may not in * another, but don't ignore the poor non-Monobook users either. */ /* Colored watchlist and recent changes numbers */ .mw-plusminus-pos { color: #006400; } /* dark green */ .mw-plusminus-neg { color: #8b0000; } /* dark red */ .mw-plusminus-null { color: #aaa; } /* gray */ /* Comment and username portions of RC entries */ span.comment { font-style: italic; } span.changedby { font-size: 95%; } /* Math */ .texvc { direction: ltr; unicode-bidi: embed; } img.tex { vertical-align: middle; } span.texhtml { font-family: serif; } /* add a bit of margin space between the preview and the toolbar */ /* this replaces the ugly


we used to insert into the page source */ #wikiPreview.ontop { margin-bottom: 1em; } /* Stop floats from intruding into edit area in previews */ #editform, #toolbar, #wpTextbox1 { clear: both; } div#mw-js-message { margin: 1em 5%; padding: 0.5em 2.5%; border: solid 1px #ddd; background-color: #fcfcfc; } /* Edit section links */ .editsection { float: right; margin-left: 5px; } /** * File histories */ h2#filehistory { clear: both; } table.filehistory th, table.filehistory td { vertical-align:top; } table.filehistory th { text-align: left; } table.filehistory td.mw-imagepage-filesize, table.filehistory th.mw-imagepage-filesize { white-space:nowrap; } table.filehistory td.filehistory-selected { font-weight: bold; } /* * rev_deleted stuff */ li span.deleted, span.history-deleted { text-decoration: line-through; color: #888; font-style: italic; } /** * Patrol stuff */ .not-patrolled { background-color: #ffa; } .unpatrolled { font-weight: bold; color: red; } div.patrollink { font-size: 75%; text-align: right; } /** * Forms */ body.ltr td.mw-label { text-align: right; } body.ltr td.mw-input { text-align: left; } body.ltr td.mw-submit { text-align: left; } body.rtl td.mw-label { text-align: left; } body.rtl td.mw-input { text-align: right; } body.rtl td.mw-submit { text-align: right; } td.mw-label { vertical-align: top; } .prefsection td.mw-label { width: 20%; } .prefsection table { width: 100%; } td.mw-submit { white-space: nowrap; } table.mw-htmlform-nolabel td.mw-label { width: 0 !important; } tr.mw-htmlform-vertical-label td.mw-label { text-align: left !important; } input#wpSummary { width: 80%; } /** * Image captions */ body.rtl .thumbcaption { text-align:right; } body.rtl .magnify { float:left; } body.ltr .thumbcaption { text-align:left; } body.ltr .magnify { float:right; } /** * Hidden categories */ .mw-hidden-cats-hidden { display: none; } .catlinks-allhidden { display: none; } /* Convenience links to edit block, delete and protect reasons */ p.mw-ipb-conveniencelinks, p.mw-protect-editreasons, p.mw-filedelete-editreasons, p.mw-delete-editreasons, p.mw-revdel-editreasons { font-size: 90%; float: right; } /* Search results */ .searchresults { } .searchresults p { margin-left: 0.4em; margin-top: 1em; margin-bottom: 1.2em; } div.searchresult { font-size: 95%; width:38em; } .mw-search-results { margin-left: 0.4em; } .mw-search-results li { padding-bottom: 1em; list-style:none; list-style-image:none; } .mw-search-results li a { font-size: 108%; } .mw-search-result-data { color: green; font-size: 97%; } .mw-search-formheader { background-color: #f3f3f3; margin-top: 1em; border: 1px solid silver; } .mw-search-formheader div.search-types { float:left; padding-left: 0.25em; } .rtl .mw-search-formheader div.search-types { float: right; } .mw-search-formheader div.search-types ul { margin: 0 !important; padding: 0 !important; list-style: none !important; } .mw-search-formheader div.search-types ul li { float: left; margin: 0; padding: 0; } .mw-search-formheader div.search-types ul li a { display: block; padding: 0.5em; } .mw-search-formheader div.search-types ul li.current a { color: #333333; cursor: default; } .mw-search-formheader div.search-types ul li.current a:hover { text-decoration: none; } .mw-search-formheader div.results-info { float: right; padding: 0.5em; padding-right: 0.75em; } .mw-search-formheader div.results-info ul { margin: 0 !important; padding: 0 !important; list-style: none !important; } .mw-search-formheader div.results-info ul li { float: right; margin: 0; padding: 0; } fieldset#mw-searchoptions { margin: 0; padding-left: 0.75em !important; padding-right: 0.75em !important; padding-bottom: 0.5em !important; padding-top: 0.5em !important; border: none; background-color: #f9f9f9; border: 1px solid silver !important; border-top-width: 0 !important; } fieldset#mw-searchoptions legend { display: none; } fieldset#mw-searchoptions h4 { padding: 0; margin: 0; float: left; } .rtl fieldset#mw-searchoptions h4 { float: right; } fieldset#mw-searchoptions div#mw-search-togglebox { float: right; } .rtl fieldset#mw-searchoptions div#mw-search-togglebox { float: left; } fieldset#mw-searchoptions div#mw-search-togglebox label { margin-right: 0.25em; } fieldset#mw-searchoptions div#mw-search-togglebox input { margin-left: 0.25em; } fieldset#mw-searchoptions table { float: left; margin-right: 3em; } fieldset#mw-searchoptions table td { padding-right: 1em; } .rtl fieldset#mw-searchoptions table td { padding-left: 1em; padding-right: 0; } body.rtl fieldset#mw-searchoptions table { margin-right: 0; margin-left: 3em; float: right; } fieldset#mw-searchoptions div.divider { clear: both; border-bottom: 1px solid #DDDDDD; padding-top: 0.5em; margin-bottom: 0.5em; } td#mw-search-menu { padding-left:6em; font-size:85%; } div#mw-search-interwiki { float: right; width: 18em; border-style: solid; border-color: #AAAAAA; border-width: 1px; margin-top: 2ex; } .rtl div#mw-search-interwiki { float: left; } div#mw-search-interwiki li { font-size: 95%; } .mw-search-interwiki-more { float: right; font-size: 90%; } .rtl .mw-search-interwiki-more { float: left; } div#mw-search-interwiki-caption { text-align: center; font-weight: bold; font-size: 95%; } .mw-search-interwiki-project { font-size: 97%; text-align: left; padding-left: 0.2em; padding-right: 0.15em; padding-bottom: 0.2em; padding-top: 0.15em; background-color:#ececec; border-top:1px solid #BBBBBB; } .rtl .mw-search-interwiki-project { text-align: right; } span.searchalttitle { font-size: 95%; } div.searchdidyoumean { font-size: 127%; margin-top: 0.8em; /* Note that this color won't affect the link, as desired. */ color: #c00; } div.searchdidyoumean em { font-weight: bold; } .searchmatch { font-weight: bold; } table#mw-search-top-table { background-color: transparent; } /* * Advanced PowerSearch box */ td#mw-search-togglebox { text-align: right; } table#mw-search-powertable { width:100%; } form#powersearch { clear: both; } /* * UserRights stuff */ .mw-userrights-disabled { color: #888; } table.mw-userrights-groups * td,table.mw-userrights-groups * th { padding-right: 1.5em; } /* * OpenSearch ajax suggestions */ .os-suggest { overflow: auto; overflow-x: hidden; position: absolute; top: 0px; left: 0px; width: 0px; background-color: white; background-color: Window; border-style: solid; border-color: #AAAAAA; border-width: 1px; z-index:99; font-size:95%; } table.os-suggest-results { font-size: 95%; cursor: pointer; border: 0; border-collapse: collapse; width: 100%; } .os-suggest-result, .os-suggest-result-hl { white-space: nowrap; background-color: white; background-color: Window; color: black; color: WindowText; padding: 2px; } .os-suggest-result-hl, .os-suggest-result-hl-webkit { background-color: #4C59A6; color: white; } .os-suggest-result-hl { /* System colors are misimplemented in Safari 3.0 and earlier, making highlighted text illegible... */ background-color: Highlight; color: HighlightText; } .os-suggest-toggle { position: relative; left: 1ex; font-size: 65%; } .os-suggest-toggle-def { position: absolute; top: 0px; left: 0px; font-size: 65%; visibility: hidden; } /* Page history styling */ /* the auto-generated edit comments */ .autocomment { color: gray; } #pagehistory .history-user { margin-left: 0.4em; margin-right: 0.2em; } #pagehistory span.minor { font-weight: bold; } #pagehistory li { border: 1px solid white; } #pagehistory li.selected { background-color: #f9f9f9; border: 1px dashed #aaa; } /** Generic minor/bot/newpage styling */ .newpage, .minor, .bot { font-weight: bold; } /* Special:Contributions styling */ .mw-uctop { font-weight: bold; } /* Special:ListGroupRights styling */ table.mw-listgrouprights-table tr { vertical-align: top; } .listgrouprights-revoked { text-decoration: line-through; } /* Special:Statistics styling */ td.mw-statistics-numbers { text-align: right; } /* Special:SpecialPages styling */ h4.mw-specialpagesgroup { background-color: #dcdcdc; padding: 2px; margin: .3em 0em 0em 0em; } .mw-specialpagerestricted { font-weight: bold; } #shared-image-dup, #shared-image-conflict { font-style: italic; } /* Special:EmailUser styling */ table.mw-emailuser-table { width: 98%; } td#mw-emailuser-sender, td#mw-emailuser-recipient { font-weight: bold; } /* Special:Allpages styling */ table.allpageslist { background-color: transparent; } table.mw-allpages-table-form, table.mw-allpages-table-chunk { background-color: transparent; width: 100%; } td.mw-allpages-alphaindexline { text-align: right; } td.mw-allpages-nav, p.mw-allpages-nav { text-align: right; font-size: smaller; margin-bottom: 1em; } table.mw-allpages-table-form tr { vertical-align: top; } /* Special:Prefixindex styling */ table#mw-prefixindex-list-table, table#mw-prefixindex-nav-table { width: 98%; background-color: transparent; } td#mw-prefixindex-nav-form { font-size: smaller; margin-bottom: 1em; text-align: right; vertical-align: top; } /* * Recreating deleted page warning * Reupload file warning * Page protection warning * incl. log entries for these warnings */ div.mw-warning-with-logexcerpt { padding: 3px; margin-bottom: 3px; border: 2px solid #2F6FAB; clear: both; } div.mw-warning-with-logexcerpt ul li { font-size: 90%; } /* (show/hide) revision deletion links */ span.mw-revdelundel-link, strong.mw-revdelundel-link { font-size: 90%; } span.mw-revdelundel-hidden, input.mw-revdelundel-hidden { visibility: hidden; } td.mw-revdel-checkbox, th.mw-revdel-checkbox { padding-right: 10px; text-align: center; } /* feed links */ a.feedlink { background: url("images/feed-icon.png") center left no-repeat; padding-left: 16px; } /* Plainlinks - this can be used to switch * off special external link styling */ .plainlinks a { background: none !important; padding: 0 !important; } /* wikitable class for skinning normal tables */ table.wikitable { margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; } .wikitable th, .wikitable td { border: 1px #aaa solid; padding: 0.2em; } .wikitable th { background: #f2f2f2; text-align: center; } .wikitable caption { font-weight: bold; } /* hide initially collapsed collapsable tables */ table.collapsed tr.collapsable { display: none; } /* success and error messages */ .success { color: green; font-size: larger; } .error { color: red; font-size: larger; } .errorbox, .successbox { font-size: larger; border: 2px solid; padding: .5em 1em; float: left; margin-bottom: 2em; color: #000; } .errorbox { border-color: red; background-color: #fff2f2; } .successbox { border-color: green; background-color: #dfd; } .errorbox h2, .successbox h2 { font-size: 1em; font-weight: bold; display: inline; margin: 0 .5em 0 0; border: none; } /* Note on preview page */ .previewnote { color: #c00; margin-bottom: 1em; } .previewnote p { text-indent: 3em; margin: 0.8em 0; } .visualClear { clear: both; } #mw_trackbacks { border: solid 1px #bbbbff; background-color: #eeeeff; padding: 0.2em; } /* Table pager (e.g. Special:Imagelist) - remove underlines from the navigation link - collapse borders - set the borders to outsets (similar to Special:Allmessages) - remove line wrapping for all td and th, set background color - restore line wrapping for the last two table cells (description and size) */ .TablePager { min-width: 80%; } .TablePager_nav a { text-decoration: none; } .TablePager { border-collapse: collapse; } .TablePager, .TablePager td, .TablePager th { border: 1px solid #aaaaaa; padding: 0 0.15em 0 0.15em; } .TablePager th { background-color: #eeeeff } .TablePager td { background-color: #ffffff } .TablePager tr:hover td { background-color: #eeeeff } .imagelist td, .imagelist th { white-space: nowrap } .imagelist .TablePager_col_links { background-color: #eeeeff } .imagelist .TablePager_col_img_description { white-space: normal } .imagelist th.TablePager_sort { background-color: #ccccff } /* Allmessages table */ #mw-allmessagestable .allmessages-customised td.am_default { background-color: #fcffc4; } #mw-allmessagestable tr.allmessages-customised:hover td.am_default { background-color: #faff90; } #mw-allmessagestable td.am_actual { background-color: #e2ffe2; } #mw-allmessagestable tr.allmessages-customised:hover + tr.allmessages-customised td.am_actual { background-color: #b1ffb1; } /* filetoc */ ul#filetoc { text-align: center; border: 1px solid #aaaaaa; background-color: #f9f9f9; padding: 5px; font-size: 95%; margin-bottom: 0.5em; margin-left: 0; margin-right: 0; } #filetoc li { display: inline; list-style-type: none; padding-right: 2em; } /* Classes for EXIF data display */ table.mw_metadata { font-size: 0.8em; margin-left: 0.5em; margin-bottom: 0.5em; width: 300px; } table.mw_metadata caption { font-weight: bold; } table.mw_metadata th { font-weight: normal; } table.mw_metadata td { padding: 0.1em; } table.mw_metadata { border: none; border-collapse: collapse; } table.mw_metadata td, table.mw_metadata th { text-align: center; border: 1px solid #aaaaaa; padding-left: 0.1em; padding-right: 0.1em; } table.mw_metadata th { background-color: #f9f9f9; } table.mw_metadata td { background-color: #fcfcfc; } /* Galleries */ table.gallery { border: 1px solid #ccc; margin: 2px; padding: 2px; background-color: white; } table.gallery tr { vertical-align: top; } table.gallery td { vertical-align: top; background-color: #f9f9f9; border: solid 2px white; } table.gallery caption { font-weight: bold; } div.gallerybox { margin: 2px; } div.gallerybox div.thumb { text-align: center; border: 1px solid #ccc; margin: 2px; } div.gallerytext { overflow: hidden; font-size: 94%; padding: 2px 4px; } table.mw-enhanced-rc { background: none; border:0; border-spacing:0; } td.mw-enhanced-rc { white-space:nowrap; padding:0; vertical-align:top; font-family:monospace } #mw-addcategory-prompt { display: inline; margin-left: 1em; } #mw-addcategory-prompt input { margin-left: 0.5em; margin-right: 0.5em; } .mw-remove-category { padding: 8px; background-image: url(images/remove.png); background-position: center center; background-repeat: no-repeat; } .mw-ajax-addcategory { padding-left: 20px; background-image: url(images/add.png); background-position: left center; background-repeat: no-repeat; } .mw-ajax-loader { background-image: url(images/ajax-loader.gif); background-position: center center; background-repeat: no-repeat; padding: 16px; position: relative; top: -16px; } .mw-small-spinner { padding: 10px !important; margin-right: 0.6em; background-image: url(images/spinner.gif); background-position: center center; background-repeat: no-repeat; } /* Sort arrows added by SortableTables */ a.sortheader { margin: 0 0.3em; } ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=commonPrint.css Content-Type: text/css; name=commonPrint.css Content-Location: http://bits.wikimedia.org/skins-1.5/common/commonPrint.css?283-17 Content-Transfer-Encoding: 8bit /* ** MediaWiki Print style sheet for CSS2-capable browsers. ** Copyright Gabriel Wicke, http://www.aulinx.de/ ** ** Derived from the plone (http://plone.org/) styles ** Copyright Alexander Limi */ /* Thanks to A List Apart (http://alistapart.com/) for useful extras */ a.stub, a.new{ color:#ba0000; text-decoration:none; } #toc { /*border:1px solid #2f6fab;*/ border:1px solid #aaaaaa; background-color:#f9f9f9; padding:5px; } .tocindent { margin-left: 2em; } .tocline { margin-bottom: 0px; } /* images */ div.floatright { float: right; clear: right; margin: 0; position:relative; border: 0.5em solid White; border-width: 0.5em 0 0.8em 1.4em; } div.floatright p { font-style: italic;} div.floatleft { float: left; margin: 0.3em 0.5em 0.5em 0; position:relative; border: 0.5em solid White; border-width: 0.5em 1.4em 0.8em 0; } div.floatleft p { font-style: italic; } /* thumbnails */ div.thumb { margin-bottom: 0.5em; border-style: solid; border-color: White; width: auto; overflow: hidden; } div.thumbinner { border:1px solid #cccccc; padding: 3px !important; background-color:#f9f9f9; font-size: 94%; text-align: center; } html .thumbimage { border:1px solid #cccccc; } html .thumbcaption { border: none; padding: 0.3em 0 0.1em 0; } div.magnify { display: none; } div.tright { float: right; clear: right; border-width: 0.5em 0 0.8em 1.4em; } div.tleft { float: left; margin-right:0.5em; border-width: 0.5em 1.4em 0.8em 0; } img.thumbborder { border: 1px solid #dddddd; } /* table standards */ table.rimage { float:right; width:1pt; position:relative; margin-left:1em; margin-bottom:1em; text-align:center; } body { background: White; /*font-size: 11pt !important;*/ color: Black; margin: 0; padding: 0; } .noprint, div#jump-to-nav, div.top, div#column-one, #colophon, .editsection, .toctoggle, .tochidden, div#f-poweredbyico, div#f-copyrightico, li#viewcount, li#about, li#disclaimer, li#privacy, #mw-hidden-catlinks { /* Hides all the elements irrelevant for printing */ display: none; } ul { list-style-type: square; } #content { background: none; border: none ! important; padding: 0 ! important; margin: 0 ! important; } #footer { background : white; color : black; border-top: 1px solid black; } h1, h2, h3, h4, h5, h6 { font-weight: bold; } p, .documentDescription { margin: 1em 0 ! important; line-height: 1.2em; } .tocindent p { margin: 0 0 0 0 ! important; } pre { border: 1pt dashed black; white-space: pre; font-size: 8pt; overflow: auto; padding: 1em 0; background : white; color : black; } table.listing, table.listing td { border: 1pt solid black; border-collapse: collapse; } a { color: Black !important; background: none !important; padding: 0 !important; } a:link, a:visited { color: #520; background: transparent; text-decoration: underline; } #content a.external.text:after, #content a.external.autonumber:after { /* Expand URLs for printing */ content: " (" attr(href) ") "; } #globalWrapper { width: 100% !important; min-width: 0 !important; } #content { background : white; color : black; } #column-content { margin: 0 !important; } #column-content #content { padding: 1em; margin: 0 !important; } /* MSIE/Win doesn't understand 'inherit' */ a, a.external, a.new, a.stub { color: black ! important; text-decoration: none ! important; } /* Continue ... */ a, a.external, a.new, a.stub { color: inherit ! important; text-decoration: inherit ! important; } img { border: none; } img.tex { vertical-align: middle; } span.texhtml { font-family: serif; } #siteNotice { display: none; } div.gallerybox { border: 1px solid #cccccc; background-color:#f9f9f9; width: 150px; } div.gallerytext { overflow: visible; } /* ** Diff rendering */ table.diff { background:white; } td.diff-otitle { background:#ffffff; } td.diff-ntitle { background:#ffffff; } td.diff-addedline { background:#ccffcc; font-size: smaller; border: solid 2px black; } td.diff-deletedline { background:#ffffaa; font-size: smaller; border: dotted 2px black; } td.diff-context { background:#eeeeee; font-size: smaller; } .diffchange { color: silver; font-weight: bold; text-decoration: underline; } ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/w/extensions/UsabilityInitiative/images/vector/collapsibleNav/portal-break.png?1 Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAIwAAAABCAMAAAA7MLYKAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEtQTFRF29vb2tra4ODg6urq5OTk4uLi 6+vr7e3t7Ozs8PDw5+fn4+Pj4eHh3d3d39/f6Ojo5eXl6enp8fHx8/Pz8vLy7+/v 3Nzc2dnZ2NjYnErj7QAAAD1JREFUeNq0wQUBACAMALDj7hf6JyUFGxzEnYhC9GaN PG1xVffGDErk/iCigLl1XV2xM49lfAxEaSM+AQYA9HMKuv4liFQAAAAASUVORK5C YII= ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/w/extensions/UsabilityInitiative/images/vector/collapsibleNav/arrow-down.png?1 Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA9QTFRFeXl53d3dmpqasbGx////GU0i EgAAAAV0Uk5T/////wD7tg5TAAAAK0lEQVQI12NwgQIG0hhCDAwMTCJAhqMCA4Mi WEoIJABiOCooQhULi5BqMgB2bh4svs8t+QAAAABJRU5ErkJggg== ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/png Content-Location: http://bits.wikimedia.org/w/extensions/UsabilityInitiative/images/vector/collapsibleNav/arrow-right.png?1 Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAxQTFRF3d3deXl5////nZ2dQA6SoAAA AAN0Uk5T//8A18oNQQAAADNJREFUeNpiYEIDDMQKMKALMDOgCTDCRWACcBG4AEwE IcDITEAFuhnotmC4g4EEzwEEGAADqgHmQSPJKgAAAABJRU5ErkJggg== ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=combined.min.css Content-Type: text/css; name=combined.min.css Content-Location: http://bits.wikimedia.org/w/extensions/UsabilityInitiative/css/combined.min.css?117 Content-Transfer-Encoding: 8bit .suggestions{ overflow:hidden; position:absolute; top:0px; left:0px; width:0px; border:none; z-index:99; padding:0; margin:-1px 0 0 0; } .suggestions-special{ position:relative; background-color:Window; font-size:0.8em; cursor:pointer; border:solid 1px #aaaaaa; padding:0; margin:0; margin-top:-2px; display:none; padding:0.25em 0.25em; line-height:1.25em; } .suggestions-results{ background-color:white; background-color:Window; font-size:0.8em; cursor:pointer; border:solid 1px #aaaaaa; padding:0; margin:0; } .suggestions-result{ color:black; color:WindowText; margin:0; line-height:1.5em; padding:0.01em 0.25em; } .suggestions-result-current{ background-color:#4C59A6; background-color:Highlight; color:white; color:HighlightText; } .suggestions-special .special-label{ font-size:0.8em; color:gray; } .suggestions-special .special-query{ color:black; font-style:italic; } .suggestions-special .special-hover{ background-color:silver; } .suggestions-result-current .special-label, .suggestions-result-current .special-query{ color:white; color:HighlightText; } .autoellipsis-matched, .highlight{ font-weight:bold; } #mw-panel.collapsible-nav div.portal{ background-image:url(../images/vector/collapsibleNav/portal-break.png?1); background-position:left top; background-repeat:no-repeat; padding:0.25em 0 !important; margin:-11px 9px 10px 11px; } body.rtl #mw-panel.collapsible-nav div.portal{ background-position:right top; margin:-11px 11px 10px 9px; } #mw-panel.collapsible-nav div.portal h5{ color:#4D4D4D; font-weight:normal; background:url(../images/vector/collapsibleNav/arrow-down.png?1) 0 50% no-repeat; padding:4px 0 3px 1.5em; margin-bottom:0px; } body.rtl #mw-panel.collapsible-nav div.portal h5{ background:url(../images/vector/collapsibleNav/arrow-down.png?1) 100% 50% no-repeat; padding:4px 1.5em 3px 0; } #mw-panel.collapsible-nav div.collapsed h5{ color:#0645AD; background:url(../images/vector/collapsibleNav/arrow-right.png?1) 0 50% no-repeat; margin-bottom:0px; } body.rtl #mw-panel.collapsible-nav div.collapsed h5{ background:url(../images/vector/collapsibleNav/arrow-left.png?1) 100% 50% no-repeat; } #mw-panel.collapsible-nav div h5:hover{ cursor:pointer; text-decoration:none; } #mw-panel.collapsible-nav div.collapsed h5:hover{ text-decoration:underline; } #mw-panel.collapsible-nav div.portal div.body{ background:none !important; padding-top:0px; display:none; } #mw-panel.collapsible-nav div.persistent div.body{ display:block; } #mw-panel.collapsible-nav div.first h5{ display:none; } #mw-panel.collapsible-nav div.persistent h5{ background:none !important; padding-left:0.7em; cursor:default; } #mw-panel.collapsible-nav div.portal div.body ul li{ padding:0.25em 0; } #mw-panel.collapsible-nav div.first{ background-image:none; margin-top:0px; } #mw-panel.collapsible-nav div.persistent div.body{ margin-left:0.5em; } body.rtl #mw-panel.collapsible-nav div.persistent div.body{ margin-left:0; margin-right:0.5em; } form#editform{ margin:0; padding:0; } #wpSummary,#wpSummaryLabel{ margin-bottom:1em; } .wikiEditor-ui textarea#wpTextbox1{ border:none; padding:0; margin:-1px; line-height:1.5em; } .wikiEditor-ui .wikiEditor-ui-text > textarea#wpTextbox1{ margin:0; } .wikiEditor-ui{ float:left; position:relative; clear:both; width:100%; background-color:#E0EEf7; border:solid silver 1px; } body.rtl .wikiEditor-ui{ float:right; } .wikiEditor-ui .wikiEditor-ui-bottom{ } .wikiEditor-ui .wikiEditor-ui-text{ line-height:0; } .wikiEditor-ui .wikiEditor-ui-top{ position:relative; border-bottom:solid silver 1px; } .wikiEditor-ui .wikiEditor-ui-left{ float:left; width:100%; } body.rtl .wikiEditor-ui .wikiEditor-ui-left{ float:right; } .wikiEditor-ui .wikiEditor-ui-right{ float:right; background:#F3F3F3; overflow:hidden; } body.rtl .wikiEditor-ui .wikiEditor-ui-right{ float:left; } .wikiEditor-wikitext{ float:left; width:100%; } .wikiEditor-ui-controls{ float:left; width:100%; background-color:white; margin-top:-1px; border-bottom:solid 1px silver; } .wikiEditor-ui-tabs{ float:left; height:2.5em; margin-left:-1px; background-color:white; border-left:solid 1px silver; border-top:solid 1px silver; } .wikiEditor-ui-buttons{ float:right; height:2.5em; margin-right:-1px; background-color:white; padding-left:1em; border-top:solid 1px white; } .wikiEditor-ui-buttons button{ margin-left:0.5em; } .wikiEditor-ui-tabs div{ float:left; height:2.5em; background-color:#f3f3f3; border-right:solid 1px silver; border-bottom:solid 1px silver; } .wikiEditor-ui-tabs div.current{ border-bottom:solid 1px white; background-color:white; } .wikiEditor-ui-tabs div a{ display:inline-block; padding:0 0.75em; line-height:2.5em; color:#0645AD; } .wikiEditor-ui-tabs div.current a{ color:#333333; } .wikiEditor-ui-tabs div.current a:hover{ text-decoration:none; } .wikiEditor-view-wikitext{ line-height:1em; } .wikiEditor-ui-loading{ background:#f3f3f3; z-index:10; position:absolute; top:0; left:0; text-align:center; height:100%; width:100%; border:1px solid silver; margin:-1px; } .wikiEditor-ui-loading span{ display:block; height:24px; width:24px; background:url( ../images/wikiEditor/toolbar/loading.gif ) 0 0 no-repeat; text-indent:-9999px; margin:0 auto; } .wikiEditor-toolbar-dialog table{ margin-top:0.75em; } .wikiEditor-toolbar-dialog table td{ padding:0.5em; height:3em; overflow:visible; } div.suggestions{ z-index:1099; } .wikiEditor-toolbar-dialog .ui-dialog-titlebar-close:hover{ text-decoration:none; } .wikiEditor-toolbar-dialog .ui-dialog-content .status-invalid input{ border:2px solid red; padding:2px 1px; } .wikiEditor-toolbar-dialog .ui-dialog-titlebar{ padding:0.9em 1.4em 0.6em !important; } .wikiEditor-toolbar-dialog table td{ padding:0 !important; } .wikiEditor-toolbar-dialog .ui-dialog-buttonpane button{ -moz-border-radius:4px; -webkit-border-radius:4px; padding:0.2em 0.6em 0.15em !important; margin:0.5em 0 0.5em 0.4em !important; border:1px solid #a6a6a6 !important; background:#f2f2f2 url( ../images/wikiEditor/dialogs/button_off.png?1) repeat-x scroll 50% 100% !important; } .wikiEditor-toolbar-dialog .ui-dialog-buttonpane button:hover{ border-color:#6e7273; background:#e1e1e1 url( ../images/wikiEditor/dialogs/button_over.png?1) repeat-x scroll 50% 100% !important; } .wikiEditor-toolbar-dialog .ui-dialog-buttonpane button:active, .wikiEditor-toolbar-dialog .ui-dialog-buttonpane button:focus{ border-color:#707271; background:#bfbfbf url( ../images/wikiEditor/dialogs/button_down.png?1) repeat-x scroll 50% 100% !important; } .wikiEditor-toolbar-dialog .ui-dialog-buttonpane button.disabled{ color:#7f7f7f; border-color:#cccccc; background:#f2f2f2 url( ../images/wikiEditor/dialogs/button_disabled.png?1) repeat-x scroll 50% 100% !important; } .wikiEditor-toolbar-dialog .ui-dialog-buttonpane button::-moz-focus-inner{ border:0; } .wikiEditor-toolbar-dialog .ui-widget-header{ background:#f0f0f0 url( ../images/wikiEditor/dialogs/titlebar_fade.png?1) repeat-x scroll 50% 100% !important; } .wikiEditor-toolbar-dialog .ui-icon-closethick{ background:url( ../images/wikiEditor/dialogs/close_x.png?1) no-repeat 50% 50% !important; } .wikiEditor-toolbar-dialog .ui-dialog-buttonpane{ margin-top:0 !important; padding:0.3em 1.4em 0.5em 1.4em !important; } .wikiEditor-toolbar-dialog .ui-dialog-content fieldset{ border:none !important; margin:0 !important; padding:0 !important; } .wikiEditor-toolbar-dialog .ui-widget-header{ border-bottom:1px solid #6bc8f3 !important; } .wikiEditor-toolbar-dialog .ui-dialog-content input[type=text]{ -moz-box-sizing:border-box; -ms-box-sizing:border-box; -webkit-box-sizing:border-box; -khtml-box-sizing:border-box; } .wikiEditor-toolbar-dialog .ui-dialog-content input[type="radio"], .wikiEditor-toolbar-dialog .ui-dialog-content input[type="checkbox"]{ margin-left:0; } .wikiEditor-toolbar-dialog .ui-dialog-titlebar-close{ padding:0; } body.ltr .wikiEditor-toolbar-dialog .ui-dialog-titlebar-close{ right:0.9em; } .wikieditor-toolbar-field-wrapper{ padding:0 0 25px 0; } .wikieditor-toolbar-floated-field-wrapper{ float:left; margin-right:2em; } .wikieditor-toolbar-dialog-hint{ color:#999999; } .wikiEditor-toolbar-dialog, .wikiEditor-toolbar-dialog .ui-widget-content{ border:none !important; } #wikieditor-toolbar-table-dialog fieldset{ width:218px; padding:0; float:left; } body.rtl #wikieditor-toolbar-table-dialog fieldset{ float:right; } #wikieditor-toolbar-table-dialog .wikieditor-toolbar-table-preview-wrapper{ width:330px; padding:0; float:right; } body.rtl #wikieditor-toolbar-table-dialog .wikieditor-toolbar-table-preview-wrapper{ float:left; } body.rtl .wikiEditor-toolbar-dialog .wikieditor-toolbar-table-preview-wrapper table{ margin-left:1em; margin-right:0; } .wikieditor-toolbar-table-preview-content *{ cursor:default; } .wikiEditor-toolbar-dialog .wikieditor-toolbar-table-preview-wrapper table{ width:100% !important; } .wikiEditor-toolbar-dialog .wikieditor-toolbar-table-preview-content table td{ padding:10px 4px !important; height:auto !important; } .wikiEditor-toolbar-dialog .wikieditor-toolbar-table-preview-content table th{ padding:7px 3px !important; } .wikieditor-toolbar-table-dimension-fields .wikieditor-toolbar-field-wrapper{ float:left; margin-right:20px; vertical-align:bottom; } body.rtl .wikieditor-toolbar-table-dimension-fields .wikieditor-toolbar-field-wrapper{ float:right; margin-right:0px; margin-left:20px; } .wikiEditor-toolbar-dialog .ui-dialog-content{ padding:30px 20px 0 !important; } .wikieditor-toolbar-dialog-wrapper{ width:100%; } #wikieditor-toolbar-link-int-target-status{ float:right; } #wikieditor-toolbar-link-int-target, #wikieditor-toolbar-link-int-text{ width:100%; } #wikieditor-toolbar-tool-link-int-target-label{ float:left; line-height:1.7em; } #wikieditor-toolbar-link-int-target-status-loading{ line-height:1.7em; } #wikieditor-toolbar-link-int-target-status-exists, #wikieditor-toolbar-link-int-target-status-notexists, #wikieditor-toolbar-link-int-target-status-invalid, #wikieditor-toolbar-link-int-target-status-external{ padding-left:30px; background-position:0 50%; background-repeat:no-repeat; } #wikieditor-toolbar-link-int-target-status-exists{ background-image:url( ../images/wikiEditor/dialogs/insert-link-exists.png?1); } #wikieditor-toolbar-link-int-target-status-notexists{ background-image:url( ../images/wikiEditor/dialogs/insert-link-notexists.png?1); } #wikieditor-toolbar-link-int-target-status-invalid{ background-image:url( ../images/wikiEditor/dialogs/insert-link-invalid.png?1); } #wikieditor-toolbar-link-int-target-status-external{ background-image:url( ../images/wikiEditor/dialogs/insert-link-external.png?1); } #wikieditor-toolbar-reference-dialog label{ float:left; line-height:1.7em; } #wikieditor-toolbar-reference-text{ width:100%; } body.rtl .wikiEditor-toolbar-dialog .ui-dialog-buttonpane button{ float:left; margin:0.5em 0.4em 0.5em 0 !important; } body.rtl .wikiEditor-toolbar-dialog .ui-dialog-titlebar-close{ left:0.9em; right:auto; } body.rtl .wikiEditor-toolbar-dialog .ui-dialog-title{ float:right; } body.rtl #wikieditor-toolbar-link-int-target-status{ float:left; } body.rtl #wikieditor-toolbar-tool-link-int-target-label{ float:right; } body.rtl .wikieditor-toolbar-floated-field-wrapper{ float:right; margin-right:0; margin-left:2em; } body.rtl #wikieditor-toolbar-link-int-target-status-exists, body.rtl #wikieditor-toolbar-link-int-target-status-notexists, body.rtl #wikieditor-toolbar-link-int-target-status-invalid, body.rtl #wikieditor-toolbar-link-int-target-status-external{ padding-left:0; padding-right:30px; background-position:100% 50%; } body.rtl #wikieditor-toolbar-link-int-target-status-external{ background-image:url( ../images/wikiEditor/dialogs/insert-link-external-rtl.png?1); } body.rtl #wikieditor-toolbar-reference-dialog label{ float:right; } .wikiEditor-template-dialog-fields label{ text-transform:capitalize; float:left; width:25%; line-height:2.25em; } .wikiEditor-template-dialog-fields textarea{ float:right; width:70%; line-height:1.5em; height:1.5em; } .wikiEditor-template-dialog-fields .wikiEditor-template-dialog-field-wrapper{ padding:0.75em 0.33em; border-bottom:dashed 1px silver; clear:both; } .wikiEditor-template-dialog-fields .wikiEditor-template-dialog-field-wrapper:first-child{ padding-top:0; } .wikiEditor-template-dialog-fields .wikiEditor-template-dialog-field-wrapper:last-child{ border-bottom:none; } .wikieditor-toolbar-table-dimension-fields:after, .wikieditor-toolbar-dialog-wrapper:after{ visibility:hidden; display:block; font-size:0; content:" "; clear:both; height:0; } .wikieditor-toolbar-table-dimension-fields, .wikieditor-toolbar-dialog-wrapper{ display:inline-table; } * html .wikieditor-toolbar-table-dimension-fields, * html .wikieditor-toolbar-dialog-wrapper{ height:1%; } .wikieditor-toolbar-table-dimension-fields, .wikieditor-toolbar-dialog-wrapper{ display:block; } .wikiEditor-toolbar-dialog .ui-dialog-buttonpane{ border-top:1px solid #cccccc !important; } .wikiEditor-toolbar-dialog .ui-dialog-content{ padding-bottom:1em !important; } .wikiEditor-dialog-editoptions{ margin-top:15px; } .wikiEditor-publish-dialog-copywarn{ margin-top:0.5em; } .wikiEditor-publish-dialog-summary{ margin-top:1.5em; } .wikiEditor-publish-dialog-options{ margin-top:1.5em; } .wikiEditor-ui-toolbar{ position:relative; width:100%; } .wikiEditor-ui-toolbar .sections{ float:left; width:100%; clear:both; height:0; } body.rtl .wikiEditor-ui-toolbar .sections{ float:right; } .wikiEditor-ui-toolbar .sections .section{ display:none; float:left; width:100%; border-top:solid 1px #DDDDDD; background-color:#E0EEf7; } .wikiEditor-ui-toolbar{ background-image:url(../images/wikiEditor/toolbar/base.png?1); background-position:left top; background-repeat:repeat-x; } /* .wikiEditor-ui-toolbar .toolbar{ background-image:url(../images/wikiEditor/toolbar/base.png?1); background-position:left top; } */ body.rtl .wikiEditor-ui-toolbar .sections .section{ float:right; } .wikiEditor-ui-toolbar .sections div .spinner{ display:none; } .wikiEditor-ui-toolbar .sections .loading .spinner{ display:block; background-image:url(../images/wikiEditor/toolbar/loading.gif?2); background-position:left center; background-repeat:no-repeat; padding-left:32px; margin-left:0.5em; height:32px; float:left; color:#666666; } body.rtl .wikiEditor-ui-toolbar .sections .loading .spinner{ background-position:right center; padding-left:0; padding-right:32px; margin-left:0; margin-right:0.5em; float:right; } .wikiEditor-ui-toolbar .tabs, .wikiEditor-ui-toolbar .section-main{ position:relative; float:left; height:26px; } body.rtl .wikiEditor-ui-toolbar .tabs, body.rtl .wikiEditor-ui-toolbar .section-main{ float:right; } .wikiEditor-ui-toolbar .group{ float:left; height:26px; padding-right:6px; border-right:solid 1px #DDDDDD; margin:3px; } body.rtl .wikiEditor-ui-toolbar .group{ float:right; padding-right:0; padding-left:6px; border-right:none; border-left:solid 1px #DDDDDD; } .wikiEditor-ui-toolbar .group-search{ float:right; padding:0 0 0 6px; border-right:none; border-left:1px solid #DDDDDD; } .wikiEditor-ui-toolbar .group-insert{ border-right:none; } body.rtl .wikiEditor-ui-toolbar .group-search{ float:left; padding:0 6px 0 0; border-left:none; border-right:1px solid #DDDDDD; } body.rtl .wikiEditor-ui-toolbar .group-insert{ border-left:none; } .wikiEditor-toolbar-spritedButton{ background:url(../images/wikiEditor/toolbar/button-sprite.png?1) 0 0 no-repeat; display:block; float:left; height:22px; text-indent:-9999px; width:22px; padding:2px; cursor:pointer; overflow:hidden; } .wikiEditor-ui-toolbar .tabs{ list-style:none; margin:3px; } .wikiEditor-ui-toolbar .tabs span.tab{ display:inline-block; float:left; line-height:26px; } .wikiEditor-ui-toolbar .tabs > span.tab{ display:block; } body.rtl .wikiEditor-ui-toolbar .tabs > span.tab{ float:right; } .wikiEditor-ui-toolbar .tabs span.tab a, .wikiEditor-ui-toolbar .tabs span.tab a:visited{ display:inline-block; float:left; padding-left:18px; padding-right:12px; height:26px; cursor:pointer; color:#0645ad; background-image:url(../images/wikiEditor/toolbar/arrow-right.png?1); background-position:left center; background-repeat:no-repeat; } body.rtl .wikiEditor-ui-toolbar .tabs span.tab a, body.rtl .wikiEditor-ui-toolbar .tabs span.tab a:visited{ padding-left:12px; padding-right:18px; background-image:url(../images/wikiEditor/toolbar/arrow-left.png?1); background-position:right center; } body.rtl .wikiEditor-ui-toolbar .tabs > span.tab > a, body.rtl .wikiEditor-ui-toolbar .tabs > pan.tab > a:visited{ float:right; } .wikiEditor-ui-toolbar .tabs span.tab a.current, .wikiEditor-ui-toolbar .tabs span.tab a.current:visited{ color:#333333; background-image:url(../images/wikiEditor/toolbar/arrow-down.png?1); } body.rtl .wikiEditor-ui-toolbar .tabs span.tab a.current, body.rtl .wikiEditor-ui-toolbar .tabs span.tab a.current:visited{ background-image:url(../images/wikiEditor/toolbar/arrow-down.png?1); } .wikiEditor-ui-toolbar .tabs span.tab a.current:hover{ text-decoration:none; } .wikiEditor-ui-toolbar .tabs span.tab a.loading{ background-image:url(../images/wikiEditor/toolbar/loading-small.gif?1) !important; } .wikiEditor-ui-toolbar .group .label{ float:left; border:0px; height:22px; line-height:22px; margin:2px; margin-left:5px; margin-right:8px; color:#777777; cursor:default; } body.rtl .wikiEditor-ui-toolbar .group > .label{ float:right; margin-left:8px; margin-right:5px; } .wikiEditor-ui-toolbar .group img.tool{ float:left; border:0px; height:22px; width:22px; padding:2px; cursor:pointer; } body.rtl .wikiEditor-ui-toolbar .group > img.tool{ float:right; } .wikiEditor-ui-toolbar .group .tool-select{ float:left; margin:2px; height:22px; cursor:pointer; border:solid 1px silver; padding:0; margin-right:0; cursor:pointer; background-color:#ffffff; } body.rtl .wikiEditor-ui-toolbar .group > .tool-select{ float:right; } .wikiEditor-ui-toolbar .group .tool-select .label{ background-image:url(../images/wikiEditor/toolbar/arrow-down.png?1); background-position:center right; background-repeat:no-repeat; padding:0; margin:0; padding-left:4px; padding-right:22px; margin-right:4px; cursor:pointer; text-decoration:none; color:#333333; } body.rtl .wikiEditor-ui-toolbar .group .tool-select .label{ background-position:center left; padding-right:4px; padding-left:22px; margin-left:4px; margin-right:0; } body.rtl .wikiEditor-ui-toolbar .group .tool-select .menu{ clear:both; } .wikiEditor-ui-toolbar .group .tool-select .menu .options{ position:absolute; display:none; margin-left:-1px; border:solid 1px silver; background-color:#ffffff; } body.rtl .wikiEditor-ui-toolbar .group .tool-select .menu{ margin-left:-1px; margin-right:-1px; } .wikiEditor-ui-toolbar .group .tool-select .options { margin-top:22px; } .wikiEditor-ui-toolbar .group .tool-select .options .option{ display:block; padding:0.5em; text-decoration:none; color:black; white-space:nowrap; } .wikiEditor-ui-toolbar .group .tool-select .options .option:hover{ background-color:#E0EEf7; } .wikiEditor-ui-toolbar .group .tool-select .options .option[rel=heading-2]{ font-size:150%; font-weight:normal; } .wikiEditor-ui-toolbar .group .tool-select .options .option[rel=heading-3]{ font-size:132%; font-weight:normal; } .wikiEditor-ui-toolbar .group .tool-select .options .option[rel=heading-4]{ font-size:116%; font-weight:normal; } .wikiEditor-ui-toolbar .group .tool-select .options .option[rel=heading-5]{ font-size:100%; font-weight:bold; } .wikiEditor-ui-toolbar .booklet .index{ float:left; width:20%; height:125px; overflow:auto; } body.rtl .wikiEditor-ui-toolbar .booklet .index{ float:right; } .wikiEditor-ui-toolbar .booklet .index div{ padding:4px; padding-left:6px; cursor:pointer; color:#0645ad; } body.rtl .wikiEditor-ui-toolbar .booklet .index div{ padding-left:4px; padding-right:6px; } .wikiEditor-ui-toolbar .booklet .index .current{ background-color:#FAFAFA; color:#333333; cursor:default; } .wikiEditor-ui-toolbar .booklet .pages{ float:right; width:80%; height:125px; overflow:auto; background-color:#FAFAFA; } body.rtl .wikiEditor-ui-toolbar .booklet .pages{ float:left; } .wikiEditor-ui-toolbar .page-table table{ padding-left:5px; padding-right:5px; background:none; } .wikiEditor-ui-toolbar .page-table th{ color:#999999; } .wikiEditor-ui-toolbar .page-table td{ color:black; border-top:solid 1px #EEEEEE; } .wikiEditor-ui-toolbar .page-table th, .wikiEditor-ui-toolbar .page-table td{ text-align:left; padding:5px; margin:0px; } body.rtl .wikiEditor-ui-toolbar .page-table th, body.rtl .wikiEditor-ui-toolbar .page-table td{ text-align:right; } .wikiEditor-ui-toolbar .section-help .page-table td.cell-syntax, .wikiEditor-ui-toolbar .section-help .page-table td.syntax{ font-family:monospace; } .wikiEditor-ui-toolbar .section-help .page-table td.syntax, .wikiEditor-ui-toolbar .section-help .page-table td.cell-syntax, .wikiEditor-ui-toolbar .section-help .page-table td.cell-result, .wikiEditor-ui-toolbar .section-help .page-table td.result{ width:40%; } .wikiEditor-ui-toolbar .section-help .page-table td.description, .wikiEditor-ui-toolbar .section-help .page-table td.description{ width:20%; } .wikiEditor-ui-toolbar .page-characters div span{ border:solid 1px #DDDDDD; padding:5px; padding-left:8px; padding-right:8px; margin-left:5px; margin-top:5px; height:1em; float:left; display:block; color:black; text-decoration:none; cursor:pointer; font-family:monospace; font-size:1.25em; } body.rtl .wikiEditor-ui-toolbar .page-characters > div > span, .wikiEditor-ui-toolbar .page-characters div[dir=rtl] span{ direction:rtl; float:right; margin-left:0; margin-right:5px; } .wikiEditor-ui-toolbar .page-characters div span:hover{ background-color:white; text-decoration:none; border-color:#a8d7f9; } .ui-widget table td.wikieditor-toolbar-table-preview-wrapper span{ padding:4px 6px 0px; display:block; } .ui-widget table .wikieditor-toolbar-table-preview-frame{ width:340px; background:#fff; padding:10px; overflow:hidden; display:block; position:relative; } .ui-widget table .wikieditor-toolbar-table-preview-content{ width:375px; display:block; } .ui-widget table .wikieditor-toolbar-table-preview{ width:340px; } .ui-widget table td.wikieditor-toolbar-table-preview-wrapper{ background:#e5e5e5; padding:10px; } .wikiEditor-preview-loading{ padding:1em; background-color:white; } .wikiEditor-preview-loading span{ color:#666666; } .wikiEditor-preview-spinner{ padding-right:1em; } .wikiEditor-preview-contents{ padding:1em; background-color:white; } #wikiEditor-0-preview-dialog .wikiEditor-ui-loading{ overflow:hidden; border:none; } .ui-dialog .ui-dialog-buttonpane{ margin:0 !important; } ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=jquery-ui-1.7.2.css Content-Type: text/css; name=jquery-ui-1.7.2.css Content-Location: http://bits.wikimedia.org/w/extensions/UsabilityInitiative/css/vector/jquery-ui-1.7.2.css?1.7.2y Content-Transfer-Encoding: Quoted-Printable /* * jQuery UI CSS Framework * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt= ) licenses. */ /* Layout helpers ----------------------------------*/ .ui-helper-hidden { display: none; } .ui-helper-hidden-accessible { position: absolute; left: -99999999px; } .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-he= ight: 1.3; text-decoration: none; font-size: 100%; list-style: none; } .ui-helper-clearfix:after { content: "."; display: block; height: 0; cle= ar: both; visibility: hidden; } .ui-helper-clearfix { display: inline-block; } /* required comment for clearfix to work in Opera \*/ * html .ui-helper-clearfix { height:1%; } .ui-helper-clearfix { display:block; } /* end clearfix */ .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: = absolute; opacity: 0; filter:Alpha(Opacity=3D0); } /* Interaction Cues ----------------------------------*/ .ui-state-disabled { cursor: default !important; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { display: block; text-indent: -99999px; overflow: hidden; back= ground-repeat: no-repeat; } /* Misc visuals ----------------------------------*/ /* Overlays */ .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; h= eight: 100%; } /* * jQuery UI CSS Framework * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt= ) licenses. * To view and modify this theme, visit http://jqueryui.com/themeroller/?= ffDefault=3Dsans-serif&fwDefault=3Dnormal&fsDefault=3D1em&cornerRadius=3D= 0&bgColorHeader=3De2eef6&bgTextureHeader=3D04_highlight_hard.png&bgImgOp= acityHeader=3D100&borderColorHeader=3Dc0c0c0&fcHeader=3D333333&iconColor= Header=3D333333&bgColorContent=3Dffffff&bgTextureContent=3D01_flat.png&b= gImgOpacityContent=3D100&borderColorContent=3Dc0c0c0&fcContent=3D000000&= iconColorContent=3D000000&bgColorDefault=3De2eef6&bgTextureDefault=3D04_= highlight_hard.png&bgImgOpacityDefault=3D100&borderColorDefault=3Dc0c0c0= &fcDefault=3D333333&iconColorDefault=3D333333&bgColorHover=3Dffffff&bgTe= xtureHover=3D04_highlight_hard.png&bgImgOpacityHover=3D100&borderColorHo= ver=3Dc0c0c0&fcHover=3D333333&iconColorHover=3D333333&bgColorActive=3Dff= ffff&bgTextureActive=3D01_flat.png&bgImgOpacityActive=3D100&borderColorA= ctive=3Dc0c0c0&fcActive=3D333333&iconColorActive=3D333333&bgColorHighlig= ht=3Dfbf9ee&bgTextureHighlight=3D04_highlight_hard.png&bgImgOpacityHighl= ight=3D55&borderColorHighlight=3Dfcefa1&fcHighlight=3D363636&iconColorHi= ghlight=3D2e83ff&bgColorError=3Dfef1ec&bgTextureError=3D05_inset_soft.pn= g&bgImgOpacityError=3D95&borderColorError=3Dcd0a0a&fcError=3Dcd0a0a&icon= ColorError=3Dcd0a0a&bgColorOverlay=3D000000&bgTextureOverlay=3D01_flat.p= ng&bgImgOpacityOverlay=3D0&opacityOverlay=3D75&bgColorShadow=3D000000&bg= TextureShadow=3D01_flat.png&bgImgOpacityShadow=3D0&opacityShadow=3D30&th= icknessShadow=3D8px&offsetTopShadow=3D-8px&offsetLeftShadow=3D-8px&corne= rRadiusShadow=3D8px */ /* Component containers ----------------------------------*/ .ui-widget { font-family: sans-serif; font-size: 0.9em; } .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget but= ton { font-family: sans-serif; font-size: 1em; } .ui-widget-content { border: 1px solid #c0c0c0; background: #ffffff url(= images/ui-bg_flat_100_ffffff_40x100.png) 50% 50% repeat-x; color: #00000= 0; } .ui-widget-content a { color: #000000; } .ui-widget-header { border-bottom: 1px solid #c0c0c0; line-height: 1em; = background: #e2eef6 url(images/ui-bg_highlight-hard_100_e2eef6_1x100.png= ) 50% 50% repeat-x; color: #333333; font-weight: bold; } .ui-widget-header a { color: #333333; } /* Interaction states ----------------------------------*/ .ui-state-default, .ui-widget-content .ui-state-default { border: 1px so= lid #c0c0c0; background: #e2eef6 url(images/ui-bg_highlight-hard_100_e2e= ef6_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #333333; ou= tline: none; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visit= ed { color: #333333; text-decoration: none; outline: none; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .u= i-widget-content .ui-state-focus { border: 1px solid #c0c0c0; background= : #ffffff url(images/ui-bg_highlight-hard_100_ffffff_1x100.png) 50% 50% = repeat-x; font-weight: normal; color: #333333; outline: none; } .ui-state-hover a, .ui-state-hover a:hover { color: #333333; text-decora= tion: none; outline: none; } .ui-state-active, .ui-widget-content .ui-state-active { border: 1px soli= d #c0c0c0; background: #ffffff url(images/ui-bg_flat_100_ffffff_40x100.p= ng) 50% 50% repeat-x; font-weight: normal; color: #333333; outline: none= ; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited = { color: #333333; outline: none; text-decoration: none; } /* Interaction Cues ----------------------------------*/ .ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px= solid #fcefa1; background: #fbf9ee url(images/ui-bg_highlight-hard_55_f= bf9ee_1x100.png) 50% top repeat-x; color: #363636; } .ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color:= #363636; } .ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #= cd0a0a; background: #fef1ec url(images/ui-bg_inset-soft_95_fef1ec_1x100.= png) 50% bottom repeat-x; color: #cd0a0a; } .ui-state-error a, .ui-widget-content .ui-state-error a { color: #cd0a0a= ; } .ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #= cd0a0a; } .ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35= ; filter:Alpha(Opacity=3D35); background-image: none; } .ui-priority-primary, .ui-widget-content .ui-priority-primary { font-wei= ght: bold; } .ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opac= ity: .7; filter:Alpha(Opacity=3D70); font-weight: normal; } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-ic= ons_000000_256x240.png); } .ui-widget-content .ui-icon {background-image: url(images/ui-icons_00000= 0_256x240.png); } .ui-widget-header .ui-icon {background-image: url(images/ui-icons_333333= _256x240.png); } .ui-state-default .ui-icon { background-image: url(images/ui-icons_33333= 3_256x240.png); } .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: ur= l(images/ui-icons_333333_256x240.png); } .ui-state-active .ui-icon {background-image: url(images/ui-icons_333333_= 256x240.png); } .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83= ff_256x240.png); } .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-imag= e: url(images/ui-icons_cd0a0a_256x240.png); } /* positioning */ .ui-icon-carat-1-n { background-position: 0 0; } .ui-icon-carat-1-ne { background-position: -16px 0; } .ui-icon-carat-1-e { background-position: -32px 0; } .ui-icon-carat-1-se { background-position: -48px 0; } .ui-icon-carat-1-s { background-position: -64px 0; } .ui-icon-carat-1-sw { background-position: -80px 0; } .ui-icon-carat-1-w { background-position: -96px 0; } .ui-icon-carat-1-nw { background-position: -112px 0; } .ui-icon-carat-2-n-s { background-position: -128px 0; } .ui-icon-carat-2-e-w { background-position: -144px 0; } .ui-icon-triangle-1-n { background-position: 0 -16px; } .ui-icon-triangle-1-ne { background-position: -16px -16px; } .ui-icon-triangle-1-e { background-position: -32px -16px; } .ui-icon-triangle-1-se { background-position: -48px -16px; } .ui-icon-triangle-1-s { background-position: -64px -16px; } .ui-icon-triangle-1-sw { background-position: -80px -16px; } .ui-icon-triangle-1-w { background-position: -96px -16px; } .ui-icon-triangle-1-nw { background-position: -112px -16px; } .ui-icon-triangle-2-n-s { background-position: -128px -16px; } .ui-icon-triangle-2-e-w { background-position: -144px -16px; } .ui-icon-arrow-1-n { background-position: 0 -32px; } .ui-icon-arrow-1-ne { background-position: -16px -32px; } .ui-icon-arrow-1-e { background-position: -32px -32px; } .ui-icon-arrow-1-se { background-position: -48px -32px; } .ui-icon-arrow-1-s { background-position: -64px -32px; } .ui-icon-arrow-1-sw { background-position: -80px -32px; } .ui-icon-arrow-1-w { background-position: -96px -32px; } .ui-icon-arrow-1-nw { background-position: -112px -32px; } .ui-icon-arrow-2-n-s { background-position: -128px -32px; } .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } .ui-icon-arrow-2-e-w { background-position: -160px -32px; } .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } .ui-icon-arrowstop-1-n { background-position: -192px -32px; } .ui-icon-arrowstop-1-e { background-position: -208px -32px; } .ui-icon-arrowstop-1-s { background-position: -224px -32px; } .ui-icon-arrowstop-1-w { background-position: -240px -32px; } .ui-icon-arrowthick-1-n { background-position: 0 -48px; } .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } .ui-icon-arrowthick-1-e { background-position: -32px -48px; } .ui-icon-arrowthick-1-se { background-position: -48px -48px; } .ui-icon-arrowthick-1-s { background-position: -64px -48px; } .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } .ui-icon-arrowthick-1-w { background-position: -96px -48px; } .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } .ui-icon-arrow-4 { background-position: 0 -80px; } .ui-icon-arrow-4-diag { background-position: -16px -80px; } .ui-icon-extlink { background-position: -32px -80px; } .ui-icon-newwin { background-position: -48px -80px; } .ui-icon-refresh { background-position: -64px -80px; } .ui-icon-shuffle { background-position: -80px -80px; } .ui-icon-transfer-e-w { background-position: -96px -80px; } .ui-icon-transferthick-e-w { background-position: -112px -80px; } .ui-icon-folder-collapsed { background-position: 0 -96px; } .ui-icon-folder-open { background-position: -16px -96px; } .ui-icon-document { background-position: -32px -96px; } .ui-icon-document-b { background-position: -48px -96px; } .ui-icon-note { background-position: -64px -96px; } .ui-icon-mail-closed { background-position: -80px -96px; } .ui-icon-mail-open { background-position: -96px -96px; } .ui-icon-suitcase { background-position: -112px -96px; } .ui-icon-comment { background-position: -128px -96px; } .ui-icon-person { background-position: -144px -96px; } .ui-icon-print { background-position: -160px -96px; } .ui-icon-trash { background-position: -176px -96px; } .ui-icon-locked { background-position: -192px -96px; } .ui-icon-unlocked { background-position: -208px -96px; } .ui-icon-bookmark { background-position: -224px -96px; } .ui-icon-tag { background-position: -240px -96px; } .ui-icon-home { background-position: 0 -112px; } .ui-icon-flag { background-position: -16px -112px; } .ui-icon-calendar { background-position: -32px -112px; } .ui-icon-cart { background-position: -48px -112px; } .ui-icon-pencil { background-position: -64px -112px; } .ui-icon-clock { background-position: -80px -112px; } .ui-icon-disk { background-position: -96px -112px; } .ui-icon-calculator { background-position: -112px -112px; } .ui-icon-zoomin { background-position: -128px -112px; } .ui-icon-zoomout { background-position: -144px -112px; } .ui-icon-search { background-position: -160px -112px; } .ui-icon-wrench { background-position: -176px -112px; } .ui-icon-gear { background-position: -192px -112px; } .ui-icon-heart { background-position: -208px -112px; } .ui-icon-star { background-position: -224px -112px; } .ui-icon-link { background-position: -240px -112px; } .ui-icon-cancel { background-position: 0 -128px; } .ui-icon-plus { background-position: -16px -128px; } .ui-icon-plusthick { background-position: -32px -128px; } .ui-icon-minus { background-position: -48px -128px; } .ui-icon-minusthick { background-position: -64px -128px; } .ui-icon-close { background-position: -80px -128px; } .ui-icon-closethick { background-position: -96px -128px; } .ui-icon-key { background-position: -112px -128px; } .ui-icon-lightbulb { background-position: -128px -128px; } .ui-icon-scissors { background-position: -144px -128px; } .ui-icon-clipboard { background-position: -160px -128px; } .ui-icon-copy { background-position: -176px -128px; } .ui-icon-contact { background-position: -192px -128px; } .ui-icon-image { background-position: -208px -128px; } .ui-icon-video { background-position: -224px -128px; } .ui-icon-script { background-position: -240px -128px; } .ui-icon-alert { background-position: 0 -144px; } .ui-icon-info { background-position: -16px -144px; } .ui-icon-notice { background-position: -32px -144px; } .ui-icon-help { background-position: -48px -144px; } .ui-icon-check { background-position: -64px -144px; } .ui-icon-bullet { background-position: -80px -144px; } .ui-icon-radio-off { background-position: -96px -144px; } .ui-icon-radio-on { background-position: -112px -144px; } .ui-icon-pin-w { background-position: -128px -144px; } .ui-icon-pin-s { background-position: -144px -144px; } .ui-icon-play { background-position: 0 -160px; } .ui-icon-pause { background-position: -16px -160px; } .ui-icon-seek-next { background-position: -32px -160px; } .ui-icon-seek-prev { background-position: -48px -160px; } .ui-icon-seek-end { background-position: -64px -160px; } .ui-icon-seek-first { background-position: -80px -160px; } .ui-icon-stop { background-position: -96px -160px; } .ui-icon-eject { background-position: -112px -160px; } .ui-icon-volume-off { background-position: -128px -160px; } .ui-icon-volume-on { background-position: -144px -160px; } .ui-icon-power { background-position: 0 -176px; } .ui-icon-signal-diag { background-position: -16px -176px; } .ui-icon-signal { background-position: -32px -176px; } .ui-icon-battery-0 { background-position: -48px -176px; } .ui-icon-battery-1 { background-position: -64px -176px; } .ui-icon-battery-2 { background-position: -80px -176px; } .ui-icon-battery-3 { background-position: -96px -176px; } .ui-icon-circle-plus { background-position: 0 -192px; } .ui-icon-circle-minus { background-position: -16px -192px; } .ui-icon-circle-close { background-position: -32px -192px; } .ui-icon-circle-triangle-e { background-position: -48px -192px; } .ui-icon-circle-triangle-s { background-position: -64px -192px; } .ui-icon-circle-triangle-w { background-position: -80px -192px; } .ui-icon-circle-triangle-n { background-position: -96px -192px; } .ui-icon-circle-arrow-e { background-position: -112px -192px; } .ui-icon-circle-arrow-s { background-position: -128px -192px; } .ui-icon-circle-arrow-w { background-position: -144px -192px; } .ui-icon-circle-arrow-n { background-position: -160px -192px; } .ui-icon-circle-zoomin { background-position: -176px -192px; } .ui-icon-circle-zoomout { background-position: -192px -192px; } .ui-icon-circle-check { background-position: -208px -192px; } .ui-icon-circlesmall-plus { background-position: 0 -208px; } .ui-icon-circlesmall-minus { background-position: -16px -208px; } .ui-icon-circlesmall-close { background-position: -32px -208px; } .ui-icon-squaresmall-plus { background-position: -48px -208px; } .ui-icon-squaresmall-minus { background-position: -64px -208px; } .ui-icon-squaresmall-close { background-position: -80px -208px; } .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } .ui-icon-grip-solid-vertical { background-position: -32px -224px; } .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } .ui-icon-grip-diagonal-se { background-position: -80px -224px; } /* Misc visuals ----------------------------------*/ /* Corner radius */ .ui-corner-tl { -moz-border-radius-topleft: 0; -webkit-border-top-left-r= adius: 0; } .ui-corner-tr { -moz-border-radius-topright: 0; -webkit-border-top-right= -radius: 0; } .ui-corner-bl { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-= left-radius: 0; } .ui-corner-br { -moz-border-radius-bottomright: 0; -webkit-border-bottom= -right-radius: 0; } .ui-corner-top { -moz-border-radius-topleft: 0; -webkit-border-top-left-= radius: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radi= us: 0; } .ui-corner-bottom { -moz-border-radius-bottomleft: 0; -webkit-border-bot= tom-left-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bo= ttom-right-radius: 0; } .ui-corner-right { -moz-border-radius-topright: 0; -webkit-border-top-r= ight-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom= -right-radius: 0; } .ui-corner-left { -moz-border-radius-topleft: 0; -webkit-border-top-left= -radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left= -radius: 0; } .ui-corner-all { -moz-border-radius: 0; -webkit-border-radius: 0; } /* Overlays */ .ui-widget-overlay { background: #000000 url(images/ui-bg_flat_0_000000_= 40x100.png) 50% 50% repeat-x; opacity: .75;filter:Alpha(Opacity=3D75); }= .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #00= 0000 url(images/ui-bg_flat_0_000000_40x100.png) 50% 50% repeat-x; opacit= y: .30;filter:Alpha(Opacity=3D30); -moz-border-radius: 8px; -webkit-bord= er-radius: 8px; }/* Accordion ----------------------------------*/ .ui-accordion .ui-accordion-header { cursor: pointer; position: relative= ; margin-top: 1px; zoom: 1; } .ui-accordion .ui-accordion-li-fix { display: inline; } .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important;= } .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; p= adding: .5em .5em .5em 2.2em; } .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: = .5em; top: 50%; margin-top: -8px; } .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0;= margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; ove= rflow: auto; display: none; } .ui-accordion .ui-accordion-content-active { display: block; }/* Datepic= ker ----------------------------------*/ .ui-datepicker { width: 17em; padding: .2em .2em 0; } .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0= ; } .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next {= position:absolute; top: 2px; width: 1.8em; height: 1.8em; } .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-= next-hover { top: 1px; } .ui-datepicker .ui-datepicker-prev { left:2px; } .ui-datepicker .ui-datepicker-next { right:2px; } .ui-datepicker .ui-datepicker-prev-hover { left:1px; } .ui-datepicker .ui-datepicker-next-hover { right:1px; } .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-n= ext span { display: block; position: absolute; left: 50%; margin-left: -= 8px; top: 50%; margin-top: -8px; } .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8e= m; text-align: center; } .ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; = margin:1px 0; } .ui-datepicker select.ui-datepicker-month-year {width: 100%;} .ui-datepicker select.ui-datepicker-month, = .ui-datepicker select.ui-datepicker-year { width: 49%;} .ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: r= ight; } .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: col= lapse; margin:0 0 .4em; } .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight:= bold; border: 0; } .ui-datepicker td { border: 0; padding: 1px; } .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .= 2em; text-align: right; text-decoration: none; } .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margi= n: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-b= ottom: 0; } .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: = .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:aut= o; overflow:visible; } .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { = float:left; } /* with multiple calendars */ .ui-datepicker.ui-datepicker-multi { width:auto; } .ui-datepicker-multi .ui-datepicker-group { float:left; } .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 au= to .4em; } .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { b= order-left-width:0; } .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {= border-left-width:0; } .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } .ui-datepicker-row-break { clear:both; width:100%; } /* RTL support */ .ui-datepicker-rtl { direction: rtl; } .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }= .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }= .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-curren= t { float:right; } .ui-datepicker-rtl .ui-datepicker-group { float:right; } .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { bor= der-right-width:0; border-left-width:1px; } .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { b= order-right-width:0; border-left-width:1px; } /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ .ui-datepicker-cover { display: none; /*sorry for IE5*/ display/**/: block; /*sorry for IE5*/ position: absolute; /*must have*/ z-index: -1; /*must have*/ filter: mask(); /*must have*/ top: -4px; /*must have*/ left: -4px; /*must have*/ width: 200px; /*must have*/ height: 200px; /*must have*/ }/* Dialog ----------------------------------*/ .ui-dialog { position: relative; padding: 0; width: 300px; } .ui-dialog .ui-dialog-titlebar { padding: .75em; position: relative; } .ui-dialog .ui-dialog-title { float: left; margin: 0; } = .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .75em;= top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px;= } .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px;= } .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titleb= ar-close:focus { padding: 0; } .ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background= : none; overflow: auto; zoom: 1; } .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0= 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em= .4em; } .ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4e= m .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.= 4em; width:auto; overflow:visible; } .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bot= tom: 3px; } .ui-draggable .ui-dialog-titlebar { cursor: move; } /* Progressbar ----------------------------------*/ .ui-progressbar { height:2em; text-align: left; } .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* Re= sizable ----------------------------------*/ .ui-resizable { position: relative;} .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 9999= 9; display: block;} .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-= resizable-handle { display: none; } .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px;= left: 0px; } .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5= px; left: 0px; } .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; h= eight: 100%; } .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; he= ight: 100%; } .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: = 1px; bottom: 1px; } .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5p= x; bottom: -5px; } .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5p= x; top: -5px; } .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5= px; top: -5px;}/* Slider ----------------------------------*/ .ui-slider { position: relative; text-align: left; } .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.= 2em; height: 1.2em; cursor: default; } .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size:= .7em; display: block; border: 0; } .ui-slider-horizontal { height: .8em; } .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em= ; } .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } .ui-slider-horizontal .ui-slider-range-min { left: 0; } .ui-slider-horizontal .ui-slider-range-max { right: 0; } .ui-slider-vertical { width: .8em; height: 100px; } .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; mar= gin-bottom: -.6em; } .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } .ui-slider-vertical .ui-slider-range-min { bottom: 0; } .ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs ----------------------------------*/ .ui-tabs { padding: .2em; zoom: 1; } .ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .= 2em .2em 0; } .ui-tabs .ui-tabs-nav li { position: relative; float: left; border-botto= m-width: 0 !important; margin: 0 .2em -1px 0; padding: 0; } .ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding= : .5em 1em; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-= bottom-width: 0; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui= -state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { curs= or: text; } .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li= .ui-tabs-selected a { cursor: pointer; } /* first selector in group seem= s obsolete, but required to overcome bug in Opera applying cursor: text = overall if defined elsewhere... */ .ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-wid= th: 0; background: none; } .ui-tabs .ui-tabs-hide { display: none !important; } ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline Content-Type: image/gif Content-Location: http://upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif Content-Transfer-Encoding: Base64 R0lGODlhEAAQAMQfAOmNjMfHx9UqJ3Fvb9hoZqmpqbe3t96pqPn4+IeHh9ra2qRS UOXl5dtFQ9i2turq6uDg4NTT0+7u7uzMy/DX15OTk9/Ew99+fa89PN+Yl/Hp6eLi 4vPz8/v7+////////yH5BAEAAB8ALAAAAAAQABAAAAWgoCeO5PidHhOtQWC8Reyh EdLdOB5Usxd1HARnSOy0eD4gkUO5UHAJUaAjqVYBl8zjgYh6pg/J9mFpZBiMrsjQ GaMZDQsEovYYEI/3hiEQWBQcA2scaBtzBxkZcRoDCB4FhBuGEBcOCg19GBePHJJz CgQEDQQZBxgAjwiTChcNlSuBIhVpHBMNDRRiDxwKgo8JFQkCGAsJA8fHXiQAuCUj IQA7 ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=index.css Content-Type: text/css; charset=UTF-8; name=index.css Content-Location: http://es.wikipedia.org/w/index.php?title=MediaWiki:Common.css&usemsgcache=yes&ctype=text%2Fcss&smaxage=2678400&action=raw&maxage=2678400 Content-Transfer-Encoding: 8bit /* Common CSS para todas las pieles */ /* Arregla problemas interlineado para y */ sup, sub { line-height: 1em; } /* Ocultar título y categorías en la Portada*/ body.page-Wikipedia_Portada h1.firstHeading, body.page-Wikipedia_Portada #catlinks { display:none; } /* Códigos sobre referencias */ ol.references {font-size: 100%} .references-small {font-size: 90%} .references-2column {font-size: 90%; -moz-column-count: 2; column-count:2} /* Las referencias ahora no pueden ser texto en negrita o italico */ sup.reference { font-weight: normal; font-style: normal; } /* Colorea de azul al clickear referencias */ ol.references > li:target, sup.reference:target, span.citation:target, cite:target { background-color: #DEF; } /* Estilo para citacion */ span.citation, cite { font-style: normal; word-wrap: break-word; } /* Esto permite arreglar las duplicaciones de urls en plantillas de referencias como Plantilla:Citación. */ @media screen, handheld, projection { span.citation *.printonly, cite *.printonly { display: none; } } /* Llamadas al pie: Quitar corchetes */ .corchete-llamada {display: none} /* [[Plantilla:Listaref]] */ @media print { .listaref { -moz-column-count: 1 !important } } /* CSS para infoboxes */ .infobox { border: 1px solid #aaa; background-color: #f9f9f9; color: #000; margin-bottom: 0.5em; margin-left: 1em; padding: 0.2em; float: right; clear: right; } .infobox td, .infobox th, .infobox_v2 td, .infobox_v2 th { vertical-align: top; } .infobox caption { font-size: larger; margin-left: inherit; } /* infoboxes V2 ("nuevas") */ .infobox_v2 { border: 1px solid #B4BBC8; background-color: #f9f9f9; color: #000; margin: .5em 0 .5em 1em; padding: .4em; clear: right; float: right; font-size: 90%; line-height: 1.5em; width: 22.5em } .infobox_v2 .cabecera { font-size: 140%; font-weight: bolder; height: 45px; line-height: 1.2em; text-align: center; vertical-align: middle } .infobox_v2 .media { font-weight: bolder; height: 35px; text-align: center; vertical-align: middle } /* Gráficos transparentes de cabecera */ .cabecera.default {} .media.audio {background:url(http://upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Gnome-speakernotes.png/35px-Gnome-speakernotes.png) no-repeat top left} .media.video {background:url(http://upload.wikimedia.org/wikipedia/en/thumb/2/20/Tango-video-x-generic.png/35px-Tango-video-x-generic.png) no-repeat top left} /* Códigos para tipos especificos de infoboxes */ .infobox.bordered { border-collapse: collapse; } .infobox.bordered td, .infobox.bordered th { border: 1px solid #B4BBC8; } .infobox.bordered .borderless td, .infobox.bordered .borderless th { border: 0; } .infobox.sisterproject { width: 20em; font-size: 90%; } @media print { .infobox.sisterproject { display: none; } } .infobox.geography, .infobox_v2.geography { text-align: left; border-collapse: collapse; line-height: 1.2em; font-size: 90%; border: solid 1px #B4BBC8; } .infobox.geography td, .infobox.geography th, .infobox_v2.geography td, .infobox_v2.geography th { border-top: solid 1px #B4BBC8; padding: .4em .6em; } .infobox.geography .mergedtoprow td, .infobox.geography .mergedtoprow th, .infobox_v2.geography .mergedtoprow td, .infobox_v2.geography .mergedtoprow th { border-top: solid 1px #B4BBC8; padding: .4em .6em .2em .6em; } .infobox.geography .mergedrow td, .infobox.geography .mergedrow th, .infobox_v2.geography .mergedrow td, .infobox_v2.geography .mergedrow td { border: 0; padding: 0 .6em .2em .6em; } .infobox.geography .mergedbottomrow td, .infobox.geography .mergedbottomrow th, .infobox_v2.geography .mergedbottomrow td, .infobox_v2.geography .mergedbottomrow th { border-top: 0; border-bottom: solid 1px #B4BBC8; padding: 0 .6em .4em .6em; } .infobox.geography .maptable td, .infobox.geography .maptable th, .infobox_v2.geography .maptable td, .infobox_v2.geography .maptable th { border: 0; padding: 0; } /* Infobox sin uso conocido, deberia ser borrado al comprobarse que ya no se usa */ .InfoDerecha { clear: right; float: right; margin: 0 0 1em 1em; } /* CSS relacionado con el uso de coordenadas To display coordinates using the notation in the source code, write this in your User:Username/monobook.css: .geo-default {display: inline} .geo-nondefault {display: none} .geo-dec {display: inline} .geo-dms {display: inline} To display coordinates using decimal notation, write this in your User:Username/monobook.css: .geo-default {display: inline} .geo-nondefault {display: inline} .geo-dec {display: inline} .geo-dms {display: none} To display coordinates using DMS notation, write this in your User:Username/monobook.css: .geo-default {display: inline} .geo-nondefault {display: inline} .geo-dec {display: none} .geo-dms {display: inline} To display coordinates in both decimal and DMS notation, write this in your User:Username/monobook.css: .geo-default {display: inline} .geo-nondefault {display: inline} .geo-dec {display: inline} .geo-dms {display: inline} .geo-multi-punct {display: inline} See [[Plantilla:Coor link]] for how these are used. Note that the classes "geo", "longitude", and "latitude" are not just styles but also used by the [[Geo microformat]], so the names should not be changed. */ /* CSS predeterminado, puede modificarse usando las reglas de arriba */ .geo-default, .geo-dms, .geo-dec { display: inline; } .geo-nondefault, .geo-multi-punct { display: none; } .longitude, .latitude { white-space: nowrap; } /* This is used for the Geo microformat, but no style is needed for now other than .geo-dec. */ .geo {} /*******************************************************************/ /********* Estilos para diferentes funcionalidades menores *********/ /*******************************************************************/ /* Desambiguaciones */ #disambig { border-top: 3px double #ccc; border-bottom: 3px double #ccc; } /* Plantilla de cita */ .citado { font-size: 90%; background-color: #F9F9F9; padding: 5px 10px; } /* Estilos para sitenotice y similares */ .notice { text-align: justify; margin: 1em; padding: 0.2em; } /* Support for Template:IPA, Template:Unicode and Template:Polytonic. * The second declarations reset the styles for all browsers except * IE6, which chokes on the empty comment tags. */ .IPA { font-family: "Charis SIL", "Doulos SIL", Gentium, GentiumAlt, "DejaVu Sans", Code2000, "TITUS Cyberbit Basic", "Arial Unicode MS", "Lucida Sans Unicode", "Chrysanthi Unicode"; font-family /**/: inherit; } .Unicode { font-family: Code2000, Code2001, "Free Serif", "TITUS Cyberbit Basic", "Doulos SIL", "Chrysanthi Unicode", "Bitstream Cyberbit", "Bitstream CyberBase", Thryomanes, Gentium, GentiumAlt, "Lucida Grande", "Free Sans", "Arial Unicode MS", "Microsoft Sans Serif", "Lucida Sans Unicode"; font-family /**/: inherit; } .polytonic { font-family: "Athena Unicode", Gentium, "Palatino Linotype", "Arial Unicode MS", "Lucida Sans Unicode", "Lucida Grande", Code2000; font-family /**/: inherit; } /* Ayudita para [[Especial:Allpages]] y categorías: los redirects aparecen en cursiva */ .allpagesredirect, .redirect-in-category {font-style: italic} /* Cambiar el icono de los archivos PDF */ #bodyContent a[href$=".pdf"].external, #bodyContent a[href*=".pdf?"].external, #bodyContent a[href*=".pdf#"].external, #bodyContent a[href$=".PDF"].external, #bodyContent a[href*=".PDF?"].external, #bodyContent a[href*=".PDF#"].external { background: url(http://upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif) center right no-repeat; padding-right: 16px; } /* Change the external link icon to an Adobe icon anywhere the PDFlink class */ span.PDFlink a { background: url("http://upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif") center right no-repeat; padding-right: 17px; } /* Ocultar texto para los no bibliotecarios */ .para_biblios {display: none} .rotate_0 {display: block} .rotate_1, .rotate_2, .rotate_3, .rotate_4, .rotate_5, .rotate_6, .rotate_7, .rotate_8, .rotate_9 {display: none} .mw-specialpages-table, /* [[Especial:SpecialPages]]: alinear a la izquierda, en vez de estar justificado */ body.ns-14 div#mw-pages /* Categorías con alineación a la izquierda, no justificada */ {text-align:left} /* otros */ body.page-Especial_Registro fieldset p small {font-size:100%} /* [[Plantilla:No firmado]], más pequeño */ span.nofirmado {font-size:smaller} /*InterProject */ .interProject { display:none; clear: both; border-top: 2px dotted #aaa; margin-top: 2em; } /* CSS para plegables, documentación en [[:en:Wikipedia:NavFrame]] */ div.NavFrame { margin: 0; padding: 4px; border: 1px solid #aaa; text-align: center; border-collapse: collapse; font-size: 95%; } div.NavFrame + div.NavFrame { border-top-style: none; border-top-style: hidden; } div.NavPic { background-color: #fff; margin: 0; padding: 2px; float: left; } div.NavFrame div.NavHead { height: 1.6em; font-weight: bold; background-color: #ccf; position: relative; } div.NavFrame p, div.NavFrame div.NavContent, div.NavFrame div.NavContent p { font-size: 100%; } div.NavEnd { margin: 0; padding: 0; line-height: 1px; clear: both; } a.NavToggle { position: absolute; top: 0; right: 3px; font-weight: normal; font-size: 90%; } /* TABLAS */ /* La clase wikitable ya existe en shared.css; y prettytable esta obsoleta, cuando se reemplaze todas las llamadas a prettytable eliminar estas reglas */ table.wikitable, table.prettytable { margin: 1em 1em 1em 1em; padding: 0.5em; font-size: 95%; background-color: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; } table.wikitable th, table.wikitable td, table.prettytable th, table.prettytable td { border: 1px #aaa solid; padding: 0.2em; } table.wikitable th, table.prettytable th { background-color: #f2f2f2; text-align: center; } table.wikitable caption, table.prettytable caption { margin-left: inherit; margin-right: inherit; } /*** Cajas de aviso en discusión nuevas (ambox) que son blancas y con * una cinta de color a la izquierda */ table.ambox { margin: 0 10%; /* Will not overlap with other elements */ border-collapse: collapse; background-color: #fbfbfb; border: 1px solid #aaa; border-left: 10px solid #1e90ff; /* Default "notice" blue */ } table.ambox th.ambox-text, table.ambox td.ambox-text { /* The message body cell(s) */ padding: 0.25em 0.5em; /* 0.5em left/right */ width: 100%; /* Make all templates the same width regardless of text size */ } table.ambox td.ambox-image { /* The left image cell */ padding: 2px 0px 2px 0.5em; /* 0.5em left, 0px right */ text-align: center; } table.ambox td.ambox-imageright { /* The right image cell */ padding: 2px 4px 2px 0px; /* 0px left, 4px right */ text-align: center; } table.ambox-notice {border-left: 10px solid #1e90ff} /* Blue */ table.ambox-delete, table.ambox-serious {border-left: 10px solid #b22222} /* Red */ table.ambox-content {border-left: 10px solid #f28500} /* Orange */ table.ambox-style {border-left: 10px solid #f4c430} /* Yellow */ table.ambox-merge {border-left: 10px solid #9932cc} /* Purple */ table.ambox-growth {border-left: 10px solid #228b22} /* Green */ table.ambox-protection {border-left: 10px solid #bba} /* Gray */ table.ambox.ambox-mini { /* Small floating box variant */ float: right; clear: right; margin: 0 0 0 1em; width: 25%; } @media print { /* Do not print article message box */ .ambox {display: none} } /* Footer and header message box styles */ table.fmbox { clear: both; margin: 0.2em 0; width: 100%; border: 1px solid #aaa; background: #f9f9f9; /* Default "system" gray */ } table.fmbox-system { background: #f9f9f9; } table.fmbox-warning { border: 1px solid #bb7070; /* Dark pink */ background: #ffdbdb; /* Pink */ } table.fmbox-editnotice { background: transparent; } div.fmbox-system { clear: both; margin: 0.2em 0; border: 1px solid #aaa; background: #f9f9f9; padding: 0.25em 0.9em; } /* Ciertas cajas para discusión que NO son ambox (no tienen cinta de color) por ejemplo, la caja grande de artículo destacado */ .messagebox { border: 1px solid #aaa; background-color: #f9f9f9; width: 80%; margin: 0 auto 1em auto; padding: .2em; } .messagebox.merge { border: 1px solid #c0b8cc; background-color: #f0e5ff; text-align: center; } .messagebox.cleanup { border: 1px solid #9f9fff; background-color: #efefff; text-align: center; } .messagebox.standard-talk { border: 1px solid #c0c090; background-color: #f8eaba; margin: 4px auto; } /** Estilos para tablas. la idea es, si se quiere que la primera columna de la tabla esté alineada a la derecha, la segunda centrada y la tercera a la izquierda, usar {| class="col1der col2cen col3izq" en vez de repetir "style='text-align:right'", etc, en '''cada''' celda **/ table.col1der TD:first-child {text-align:right} table.col1izq TD:first-child {text-align:left} table.col1cen TD:first-child {text-align:center} table.col2der TD:first-child + TD {text-align:right} table.col2izq TD:first-child + TD {text-align:left} table.col2cen TD:first-child + TD {text-align:center} table.col3der TD:first-child + TD + TD {text-align:right} table.col3izq TD:first-child + TD + TD {text-align:left} table.col3cen TD:first-child + TD + TD {text-align:center} table.col4der TD:first-child + TD + TD + TD {text-align:right} table.col4izq TD:first-child + TD + TD + TD {text-align:left} table.col4cen TD:first-child + TD + TD + TD {text-align:center} table.col5der TD:first-child + TD + TD + TD + TD {text-align:right} table.col5izq TD:first-child + TD + TD + TD + TD {text-align:left} table.col5cen TD:first-child + TD + TD + TD + TD {text-align:center} /* Put a checker background at the image description page only visible if the image has transparent background */ #file img {background: url(http://upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png) repeat} /* Disponibilidad para tareas de mantenimiento/Tablas por día/semana */ table.user-availability { text-align:center; border:1px solid #333366; } table.user-availability th { font-size:110% } table.user-availability .toprow td+td { width:30px; height:10px; background-color:#eee; border:1px solid #aaa } table.user-availability .off { font-size:80%; border:1px solid #aaa; background-color:#fff; } table.user-availability .onn { font-size:80%; border:1px solid #aaa; background-color:#cfc; } table.user-availability .wrk { font-size:80%; border:1px solid #aaa; background-color:#ccf; } table.user-availability .cll { font-size:80%; border:1px solid #aaa; background-color:#ffd; } table.user-availability .key { font-size:90%; border-top:1px dashed #000; text-align:right } table.user-availability .key span { padding:2px } /* Clases obsoletas, reemplazar por "plainlinks nourlexpansion" Quita padding para enlaces externos mostrados sin icono [[Plantilla:Ref]] ya no se usa asi que no tiene muchos usos */ #bodyContent .plainlinks a, .plainlinksneverexpand { background: none !important; padding: 0 !important; } .plainlinksneverexpand .urlexpansion { display : none !important; } .plainlinksneverexpand a { background: none !important; padding: 0 !important } /* With MediaWiki 1.5, the mechanism has changed: instead of a SPAN of class "urlexpansion" following the anchor A, the anchor itself now has class "external autonumber" and the expansion is inserted when printing (see the common printing style sheet at http://en.wikipedia.org/skins-1.5/common/commonPrint.css) using the ":after" pseudo- element of CSS. We have to switch this off for links due to Template:Ref! */ .plainlinksneverexpand a.external.text:after { display: none !important; } .plainlinksneverexpand a.external.autonumber:after { display: none !important; } .border-radius4 { border-radius: 4px; /* CSS 3 */ -moz-border-radius: 4px; /* Firefox */ -webkit-border-radius: 4px; /* Safari 3.0+ */ } .border-radius6 { border-radius: 6px; /* CSS 3 */ -moz-border-radius: 6px; /* Firefox */ -webkit-border-radius: 6px; /* Safari 3.0+ */ } .abbr {/* al estilo de la etiquieta */ cursor: help; border-bottom: 1px dotted #000; } div.editOptions { text-align: left; } ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=index.css Content-Type: text/css; charset=UTF-8; name=index.css Content-Location: http://es.wikipedia.org/w/index.php?title=MediaWiki:Print.css&usemsgcache=yes&ctype=text%2Fcss&smaxage=2678400&action=raw&maxage=2678400 Content-Transfer-Encoding: 8bit /* CSS placed here will affect the print output */ .ns-0 .ambox, .ns-104 .ambox, .ns-0 .navbox, .ns-104 .navbox, .ns-0 .infobox.sisterproject, .ns-104 .infobox.sisterproject, .ns-0 .dablink, .ns-104 .dablink, .ns-0 .metadata, .ns-104 .metadata, #privacy, #about, #disclaimer, #contentSub, .editlink, span.collapseButton, a.NavToggle, .noprint { display: none; } /* Add formatting to make sure that "external references" from templates like [[Template:Ref]] do not get URL expansion, not even when printed. The anchor itself has class "external autonumber" and the url expansion is inserted when printing (see the common printing style sheet at http://en.wikipedia.org/skins-1.5/common/commonPrint.css) using the ":after" pseudo-element of CSS. Also hide in elements. */ #content cite a.external.text:after, .nourlexpansion a.external.text:after, .nourlexpansion a.external.autonumber:after { display: none !important; } ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=index.css Content-Type: text/css; charset=UTF-8; name=index.css Content-Location: http://es.wikipedia.org/w/index.php?title=MediaWiki:Handheld.css&usemsgcache=yes&ctype=text%2Fcss&smaxage=2678400&action=raw&maxage=2678400 Content-Transfer-Encoding: 8bit /* CSS placed here will affect handheld devices based on the skin configured in $wgHandheldStyle */ ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=index.css Content-Type: text/css; charset=UTF-8; name=index.css Content-Location: http://es.wikipedia.org/w/index.php?title=MediaWiki:Vector.css&usemsgcache=yes&ctype=text%2Fcss&smaxage=2678400&action=raw&maxage=2678400 Content-Transfer-Encoding: 8bit /* Los estilos CSS colocados aquí se aplicarán para todos los usuarios que usen la piel Vector. */ /* Símbolos para artículos buenos y destacados */ div.topicon { position: absolute; top: -35px; margin-right: 1px; display: block !important; } /* Símbolos para buenos y destacados en interwikis */ #mw-panel div.portal div.body ul li.destacado { background: url("http://upload.wikimedia.org/wikipedia/commons/d/d4/Monobook-bullet-star.png") no-repeat 0% 0%; margin-left: -10px; padding-left: 10px; } #mw-panel div.portal div.body ul li.bueno { background: url("http://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Art%C3%ADculo_bueno.svg/10px-Art%C3%ADculo_bueno.svg.png") no-repeat 0% 0%; margin-left: -10px; padding-left: 10px; } /** CSS para las coordenadas en esquina **/ #coordinates { display:inline; position:absolute; z-index:1; border:none; background:none; right:0; top:-1.4em; float:right; margin:0; padding:0; line-height:11px; text-align:right; text-indent:0; font-size:10px; text-transform:none; white-space:nowrap; } pre { font-size: 10pt; } ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=index.css Content-Type: text/css; charset=UTF-8; name=index.css Content-Location: http://es.wikipedia.org/w/index.php?title=-&action=raw&maxage=2678400&gen=css Content-Transfer-Encoding: 8bit /* generated user stylesheet */ a.new, #quickbar a.new { color: #CC2200; } ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=wikibits.js Content-Type: application/x-javascript; name=wikibits.js Content-Location: http://bits.wikimedia.org/skins-1.5/common/wikibits.js?283-17 Content-Transfer-Encoding: Base64 Ly8gTWVkaWFXaWtpIEphdmFTY3JpcHQgc3VwcG9ydCBmdW5jdGlvbnMKCnZhciBj bGllbnRQQyA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsgLy8g R2V0IGNsaWVudCBpbmZvCnZhciBpc19nZWNrbyA9IC9nZWNrby8udGVzdCggY2xp ZW50UEMgKSAmJgoJIS9raHRtbHxzcG9vZmVyfG5ldHNjYXBlXC83XC4wLy50ZXN0 KGNsaWVudFBDKTsKdmFyIHdlYmtpdF9tYXRjaCA9IGNsaWVudFBDLm1hdGNoKC9h cHBsZXdlYmtpdFwvKFxkKykvKTsKaWYgKHdlYmtpdF9tYXRjaCkgewoJdmFyIGlz X3NhZmFyaSA9IGNsaWVudFBDLmluZGV4T2YoJ2FwcGxld2Via2l0JykgIT0gLTEg JiYKCQljbGllbnRQQy5pbmRleE9mKCdzcG9vZmVyJykgPT0gLTE7Cgl2YXIgaXNf c2FmYXJpX3dpbiA9IGlzX3NhZmFyaSAmJiBjbGllbnRQQy5pbmRleE9mKCd3aW5k b3dzJykgIT0gLTE7Cgl2YXIgd2Via2l0X3ZlcnNpb24gPSBwYXJzZUludCh3ZWJr aXRfbWF0Y2hbMV0pOwp9Ci8vIEZvciBhY2Nlc3NrZXlzOyBub3RlIHRoYXQgRkYz KyBpcyBpbmNsdWRlZCBoZXJlIQp2YXIgaXNfZmYyID0gL2ZpcmVmb3hcL1syLTld fG1pbmVmaWVsZFwvMy8udGVzdCggY2xpZW50UEMgKTsKdmFyIGZmMl9idWdzID0g L2ZpcmVmb3hcLzIvLnRlc3QoIGNsaWVudFBDICk7Ci8vIFRoZXNlIGFyZW4ndCB1 c2VkIGhlcmUsIGJ1dCBzb21lIGN1c3RvbSBzY3JpcHRzIHJlbHkgb24gdGhlbQp2 YXIgaXNfZmYyX3dpbiA9IGlzX2ZmMiAmJiBjbGllbnRQQy5pbmRleE9mKCd3aW5k b3dzJykgIT0gLTE7CnZhciBpc19mZjJfeDExID0gaXNfZmYyICYmIGNsaWVudFBD LmluZGV4T2YoJ3gxMScpICE9IC0xOwppZiAoY2xpZW50UEMuaW5kZXhPZignb3Bl cmEnKSAhPSAtMSkgewoJdmFyIGlzX29wZXJhID0gdHJ1ZTsKCXZhciBpc19vcGVy YV9wcmVzZXZlbiA9IHdpbmRvdy5vcGVyYSAmJiAhZG9jdW1lbnQuY2hpbGROb2Rl czsKCXZhciBpc19vcGVyYV9zZXZlbiA9IHdpbmRvdy5vcGVyYSAmJiBkb2N1bWVu dC5jaGlsZE5vZGVzOwoJdmFyIGlzX29wZXJhXzk1ID0gL29wZXJhXC8oOVwuWzUt OV18WzEtOV1bMC05XSkvLnRlc3QoIGNsaWVudFBDICk7Cgl2YXIgb3BlcmE2X2J1 Z3MgPSBpc19vcGVyYV9wcmVzZXZlbjsKCXZhciBvcGVyYTdfYnVncyA9IGlzX29w ZXJhX3NldmVuICYmICFpc19vcGVyYV85NTsKCXZhciBvcGVyYTk1X2J1Z3MgPSAv b3BlcmFcLyg5XC41KS8udGVzdCggY2xpZW50UEMgKTsKfQovLyBBcyByZWNvbW1l bmRlZCBieSA8aHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5 L21zNTM3NTA5LmFzcHg+LAovLyBhdm9pZGluZyBmYWxzZSBwb3NpdGl2ZXMgZnJv bSBtb3JvbmljIGV4dGVuc2lvbnMgdGhhdCBhcHBlbmQgdG8gdGhlIElFIFVBCi8v IHN0cmluZyAoYnVnIDIzMTcxKQp2YXIgaWU2X2J1Z3MgPSBmYWxzZTsKaWYgKCAv bXNpZSAoWzAtOV17MSx9W1wuMC05XXswLH0pLy5leGVjKCBjbGllbnRQQyApICE9 IG51bGwKJiYgcGFyc2VGbG9hdCggUmVnRXhwLiQxICkgPD0gNi4wICkgewoJaWU2 X2J1Z3MgPSB0cnVlOwp9CgovLyBHbG9iYWwgZXh0ZXJuYWwgb2JqZWN0cyB1c2Vk IGJ5IHRoaXMgc2NyaXB0LgovKmV4dGVybiB0YSwgc3R5bGVwYXRoLCBza2luICov CgovLyBhZGQgYW55IG9ubG9hZCBmdW5jdGlvbnMgaW4gdGhpcyBob29rIChwbGVh c2UgZG9uJ3QgaGFyZC1jb2RlIGFueSBldmVudHMgaW4gdGhlIHhodG1sIHNvdXJj ZSkKdmFyIGRvbmVPbmxvYWRIb29rOwoKaWYgKCF3aW5kb3cub25sb2FkRnVuY3Rz KSB7Cgl2YXIgb25sb2FkRnVuY3RzID0gW107Cn0KCmZ1bmN0aW9uIGFkZE9ubG9h ZEhvb2soIGhvb2tGdW5jdCApIHsKCS8vIEFsbG93cyBhZGQtb24gc2NyaXB0cyB0 byBhZGQgb25sb2FkIGZ1bmN0aW9ucwoJaWYoICFkb25lT25sb2FkSG9vayApIHsK CQlvbmxvYWRGdW5jdHNbb25sb2FkRnVuY3RzLmxlbmd0aF0gPSBob29rRnVuY3Q7 Cgl9IGVsc2UgewoJCWhvb2tGdW5jdCgpOyAgLy8gYnVnIGluIE1TSUUgc2NyaXB0 IGxvYWRpbmcKCX0KfQoKZnVuY3Rpb24gaG9va0V2ZW50KCBob29rTmFtZSwgaG9v a0Z1bmN0ICkgewoJYWRkSGFuZGxlciggd2luZG93LCBob29rTmFtZSwgaG9va0Z1 bmN0ICk7Cn0KCmZ1bmN0aW9uIGltcG9ydFNjcmlwdCggcGFnZSApIHsKCS8vIFRP RE86IG1pZ2h0IHdhbnQgdG8gaW50cm9kdWNlIGEgdXRpbGl0eSBmdW5jdGlvbiB0 byBtYXRjaCB3ZlVybGVuY29kZSgpIGluIFBIUAoJdmFyIHVyaSA9IHdnU2NyaXB0 ICsgJz90aXRsZT0nICsKCQllbmNvZGVVUklDb21wb25lbnQocGFnZS5yZXBsYWNl KC8gL2csJ18nKSkucmVwbGFjZSgvJTJGL2lnLCcvJykucmVwbGFjZSgvJTNBL2ln LCc6JykgKwoJCScmYWN0aW9uPXJhdyZjdHlwZT10ZXh0L2phdmFzY3JpcHQnOwoJ cmV0dXJuIGltcG9ydFNjcmlwdFVSSSggdXJpICk7Cn0KCnZhciBsb2FkZWRTY3Jp cHRzID0ge307IC8vIGluY2x1ZGVkLXNjcmlwdHMgdHJhY2tlcgpmdW5jdGlvbiBp bXBvcnRTY3JpcHRVUkkoIHVybCApIHsKCWlmICggbG9hZGVkU2NyaXB0c1t1cmxd ICkgewoJCXJldHVybiBudWxsOwoJfQoJbG9hZGVkU2NyaXB0c1t1cmxdID0gdHJ1 ZTsKCXZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ3NjcmlwdCcgKTsK CXMuc2V0QXR0cmlidXRlKCAnc3JjJywgdXJsICk7CglzLnNldEF0dHJpYnV0ZSgg J3R5cGUnLCAndGV4dC9qYXZhc2NyaXB0JyApOwoJZG9jdW1lbnQuZ2V0RWxlbWVu dHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZCggcyApOwoJcmV0dXJu IHM7Cn0KCmZ1bmN0aW9uIGltcG9ydFN0eWxlc2hlZXQoIHBhZ2UgKSB7CglyZXR1 cm4gaW1wb3J0U3R5bGVzaGVldFVSSSggd2dTY3JpcHQgKyAnP2FjdGlvbj1yYXcm Y3R5cGU9dGV4dC9jc3MmdGl0bGU9JyArIGVuY29kZVVSSUNvbXBvbmVudCggcGFn ZS5yZXBsYWNlKC8gL2csJ18nKSApICk7Cn0KCmZ1bmN0aW9uIGltcG9ydFN0eWxl c2hlZXRVUkkoIHVybCwgbWVkaWEgKSB7Cgl2YXIgbCA9IGRvY3VtZW50LmNyZWF0 ZUVsZW1lbnQoICdsaW5rJyApOwoJbC50eXBlID0gJ3RleHQvY3NzJzsKCWwucmVs ID0gJ3N0eWxlc2hlZXQnOwoJbC5ocmVmID0gdXJsOwoJaWYoIG1lZGlhICkgewoJ CWwubWVkaWEgPSBtZWRpYTsKCX0KCWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdO YW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoIGwgKTsKCXJldHVybiBsOwp9Cgpm dW5jdGlvbiBhcHBlbmRDU1MoIHRleHQgKSB7Cgl2YXIgcyA9IGRvY3VtZW50LmNy ZWF0ZUVsZW1lbnQoICdzdHlsZScgKTsKCXMudHlwZSA9ICd0ZXh0L2Nzcyc7Cglz LnJlbCA9ICdzdHlsZXNoZWV0JzsKCWlmICggcy5zdHlsZVNoZWV0ICkgewoJCXMu c3R5bGVTaGVldC5jc3NUZXh0ID0gdGV4dDsgLy8gSUUKCX0gZWxzZSB7CgkJcy5h cHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIHRleHQgKyAnJyAp ICk7IC8vIFNhZmFyaSBzb21ldGltZXMgYm9ya3Mgb24gbnVsbAoJfQoJZG9jdW1l bnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZCgg cyApOwoJcmV0dXJuIHM7Cn0KCi8vIFNwZWNpYWwgc3R5bGVzaGVldCBsaW5rcyBm b3IgTW9ub2Jvb2sgb25seSAoc2VlIGJ1ZyAxNDcxNykKaWYgKCB0eXBlb2Ygc3R5 bGVwYXRoICE9ICd1bmRlZmluZWQnICYmIHNraW4gPT0gJ21vbm9ib29rJyApIHsK CWlmICggb3BlcmE2X2J1Z3MgKSB7CgkJaW1wb3J0U3R5bGVzaGVldFVSSSggc3R5 bGVwYXRoICsgJy8nICsgc2tpbiArICcvT3BlcmE2Rml4ZXMuY3NzJyApOwoJfSBl bHNlIGlmICggb3BlcmE3X2J1Z3MgKSB7CgkJaW1wb3J0U3R5bGVzaGVldFVSSSgg c3R5bGVwYXRoICsgJy8nICsgc2tpbiArICcvT3BlcmE3Rml4ZXMuY3NzJyApOwoJ fSBlbHNlIGlmICggb3BlcmE5NV9idWdzICkgewoJCWltcG9ydFN0eWxlc2hlZXRV UkkoIHN0eWxlcGF0aCArICcvJyArIHNraW4gKyAnL09wZXJhOUZpeGVzLmNzcycg KTsKCX0gZWxzZSBpZiAoIGZmMl9idWdzICkgewoJCWltcG9ydFN0eWxlc2hlZXRV UkkoIHN0eWxlcGF0aCArICcvJyArIHNraW4gKyAnL0ZGMkZpeGVzLmNzcycgKTsK CX0KfQoKCmlmICggd2dCcmVha0ZyYW1lcyApIHsKCS8vIFVuLXRyYXAgdXMgZnJv bSBmcmFtZXNldHMKCWlmICggd2luZG93LnRvcCAhPSB3aW5kb3cgKSB7CgkJd2lu ZG93LnRvcC5sb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjsKCX0KfQoKZnVuY3Rp b24gc2hvd1RvY1RvZ2dsZSgpIHsKCWlmICggZG9jdW1lbnQuY3JlYXRlVGV4dE5v ZGUgKSB7CgkJLy8gVXNlcyBET00gY2FsbHMgdG8gYXZvaWQgZG9jdW1lbnQud3Jp dGUgKyBYSFRNTCBpc3N1ZXMKCgkJdmFyIGxpbmtIb2xkZXIgPSBkb2N1bWVudC5n ZXRFbGVtZW50QnlJZCggJ3RvY3RpdGxlJyApOwoJCXZhciBleGlzdGluZ0xpbmsg PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3RvZ2dsZWxpbmsnICk7CgkJaWYg KCAhbGlua0hvbGRlciB8fCBleGlzdGluZ0xpbmsgKSB7CgkJCS8vIERvbid0IGFk ZCB0aGUgdG9nZ2xlIGxpbmsgdHdpY2UKCQkJcmV0dXJuOwoJCX0KCgkJdmFyIG91 dGVyU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdzcGFuJyApOwoJCW91 dGVyU3Bhbi5jbGFzc05hbWUgPSAndG9jdG9nZ2xlJzsKCgkJdmFyIHRvZ2dsZUxp bmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnYScgKTsKCQl0b2dnbGVMaW5r LmlkID0gJ3RvZ2dsZWxpbmsnOwoJCXRvZ2dsZUxpbmsuY2xhc3NOYW1lID0gJ2lu dGVybmFsJzsKCQl0b2dnbGVMaW5rLmhyZWYgPSAnIyc7CgkJYWRkQ2xpY2tIYW5k bGVyKCB0b2dnbGVMaW5rLCBmdW5jdGlvbiggZXZ0ICkgeyB0b2dnbGVUb2MoKTsg cmV0dXJuIGtpbGxFdnQoIGV2dCApOyB9ICk7CgkJCgkJdG9nZ2xlTGluay5hcHBl bmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIHRvY0hpZGVUZXh0ICkg KTsKCgkJb3V0ZXJTcGFuLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0 Tm9kZSggJ1snICkgKTsKCQlvdXRlclNwYW4uYXBwZW5kQ2hpbGQoIHRvZ2dsZUxp bmsgKTsKCQlvdXRlclNwYW4uYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZVRl eHROb2RlKCAnXScgKSApOwoKCQlsaW5rSG9sZGVyLmFwcGVuZENoaWxkKCBkb2N1 bWVudC5jcmVhdGVUZXh0Tm9kZSggJyAnICkgKTsKCQlsaW5rSG9sZGVyLmFwcGVu ZENoaWxkKCBvdXRlclNwYW4gKTsKCgkJdmFyIGNvb2tpZVBvcyA9IGRvY3VtZW50 LmNvb2tpZS5pbmRleE9mKCAiaGlkZXRvYz0iICk7CgkJaWYgKCBjb29raWVQb3Mg PiAtMSAmJiBkb2N1bWVudC5jb29raWUuY2hhckF0KCBjb29raWVQb3MgKyA4ICkg PT0gMSApIHsKCQkJdG9nZ2xlVG9jKCk7CgkJfQoJfQp9CgpmdW5jdGlvbiBjaGFu Z2VUZXh0KCBlbCwgbmV3VGV4dCApIHsKCS8vIFNhZmFyaSB3b3JrIGFyb3VuZAoJ aWYgKCBlbC5pbm5lclRleHQgKSB7CgkJZWwuaW5uZXJUZXh0ID0gbmV3VGV4dDsK CX0gZWxzZSBpZiAoIGVsLmZpcnN0Q2hpbGQgJiYgZWwuZmlyc3RDaGlsZC5ub2Rl VmFsdWUgKSB7CgkJZWwuZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSBuZXdUZXh0OwoJ fQp9CgpmdW5jdGlvbiBraWxsRXZ0KCBldnQgKSB7CglldnQgPSBldnQgfHwgd2lu ZG93LmV2ZW50IHx8IHdpbmRvdy5FdmVudDsgLy8gVzNDLCBJRSwgTmV0c2NhcGUK CWlmICggdHlwZW9mICggZXZ0LnByZXZlbnREZWZhdWx0ICkgIT0gJ3VuZGVmaW5l ZCcgKSB7CgkJZXZ0LnByZXZlbnREZWZhdWx0KCk7IC8vIERvbid0IGZvbGxvdyB0 aGUgbGluawoJCWV2dC5zdG9wUHJvcGFnYXRpb24oKTsKCX0gZWxzZSB7CgkJZXZ0 LmNhbmNlbEJ1YmJsZSA9IHRydWU7IC8vIElFCgl9CglyZXR1cm4gZmFsc2U7IC8v IERvbid0IGZvbGxvdyB0aGUgbGluayAoSUUpCn0KCmZ1bmN0aW9uIHRvZ2dsZVRv YygpIHsKCXZhciB0b2NtYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd0 b2MnICk7Cgl2YXIgdG9jID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvYycp LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd1bCcpWzBdOwoJdmFyIHRvZ2dsZUxpbmsg PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3RvZ2dsZWxpbmsnICk7CgoJaWYg KCB0b2MgJiYgdG9nZ2xlTGluayAmJiB0b2Muc3R5bGUuZGlzcGxheSA9PSAnbm9u ZScgKSB7CgkJY2hhbmdlVGV4dCggdG9nZ2xlTGluaywgdG9jSGlkZVRleHQgKTsK CQl0b2Muc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CgkJZG9jdW1lbnQuY29va2ll ID0gImhpZGV0b2M9MCI7CgkJdG9jbWFpbi5jbGFzc05hbWUgPSAndG9jJzsKCX0g ZWxzZSB7CgkJY2hhbmdlVGV4dCggdG9nZ2xlTGluaywgdG9jU2hvd1RleHQgKTsK CQl0b2Muc3R5bGUuZGlzcGxheSA9ICdub25lJzsKCQlkb2N1bWVudC5jb29raWUg PSAiaGlkZXRvYz0xIjsKCQl0b2NtYWluLmNsYXNzTmFtZSA9ICd0b2MgdG9jaGlk ZGVuJzsKCX0KfQoKdmFyIG13RWRpdEJ1dHRvbnMgPSBbXTsKdmFyIG13Q3VzdG9t RWRpdEJ1dHRvbnMgPSBbXTsgLy8gZWcgdG8gYWRkIGluIE1lZGlhV2lraTpDb21t b24uanMKCmZ1bmN0aW9uIGVzY2FwZVF1b3RlcyggdGV4dCApIHsKCXZhciByZSA9 IG5ldyBSZWdFeHAoICInIiwgImciICk7Cgl0ZXh0ID0gdGV4dC5yZXBsYWNlKCBy ZSwgIlxcJyIgKTsKCXJlID0gbmV3IFJlZ0V4cCggIlxcbiIsICJnIiApOwoJdGV4 dCA9IHRleHQucmVwbGFjZSggcmUsICJcXG4iICk7CglyZXR1cm4gZXNjYXBlUXVv dGVzSFRNTCggdGV4dCApOwp9CgpmdW5jdGlvbiBlc2NhcGVRdW90ZXNIVE1MKCB0 ZXh0ICkgewoJdmFyIHJlID0gbmV3IFJlZ0V4cCggJyYnLCAiZyIgKTsKCXRleHQg PSB0ZXh0LnJlcGxhY2UoIHJlLCAiJmFtcDsiICk7CglyZSA9IG5ldyBSZWdFeHAo ICciJywgImciICk7Cgl0ZXh0ID0gdGV4dC5yZXBsYWNlKCByZSwgIiZxdW90OyIg KTsKCXJlID0gbmV3IFJlZ0V4cCggJzwnLCAiZyIgKTsKCXRleHQgPSB0ZXh0LnJl cGxhY2UoIHJlLCAiJmx0OyIgKTsKCXJlID0gbmV3IFJlZ0V4cCggJz4nLCAiZyIg KTsKCXRleHQgPSB0ZXh0LnJlcGxhY2UoIHJlLCAiJmd0OyIgKTsKCXJldHVybiB0 ZXh0Owp9CgovKioKICogU2V0IHRoZSBhY2Nlc3NrZXkgcHJlZml4IGJhc2VkIG9u IGJyb3dzZXIgZGV0ZWN0aW9uLgogKi8KdmFyIHRvb2x0aXBBY2Nlc3NLZXlQcmVm aXggPSAnYWx0LSc7CmlmICggaXNfb3BlcmEgKSB7Cgl0b29sdGlwQWNjZXNzS2V5 UHJlZml4ID0gJ3NoaWZ0LWVzYy0nOwp9IGVsc2UgaWYgKCAhaXNfc2FmYXJpX3dp biAmJiBpc19zYWZhcmkgJiYgd2Via2l0X3ZlcnNpb24gPiA1MjYgKSB7Cgl0b29s dGlwQWNjZXNzS2V5UHJlZml4ID0gJ2N0cmwtYWx0LSc7Cn0gZWxzZSBpZiAoICFp c19zYWZhcmlfd2luICYmICggaXNfc2FmYXJpCgkJfHwgY2xpZW50UEMuaW5kZXhP ZignbWFjJykgIT0gLTEKCQl8fCBjbGllbnRQQy5pbmRleE9mKCdrb25xdWVyb3In KSAhPSAtMSApICkgewoJdG9vbHRpcEFjY2Vzc0tleVByZWZpeCA9ICdjdHJsLSc7 Cn0gZWxzZSBpZiAoIGlzX2ZmMiApIHsKCXRvb2x0aXBBY2Nlc3NLZXlQcmVmaXgg PSAnYWx0LXNoaWZ0LSc7Cn0KdmFyIHRvb2x0aXBBY2Nlc3NLZXlSZWdleHAgPSAv XFsoY3RybC0pPyhhbHQtKT8oc2hpZnQtKT8oZXNjLSk/KC4pXF0kLzsKCi8qKgog KiBBZGQgdGhlIGFwcHJvcHJpYXRlIHByZWZpeCB0byB0aGUgYWNjZXNza2V5IHNo b3duIGluIHRoZSB0b29sdGlwLgogKiBJZiB0aGUgbm9kZUxpc3QgcGFyYW1ldGVy IGlzIGdpdmVuLCBvbmx5IHRob3NlIG5vZGVzIGFyZSB1cGRhdGVkOwogKiBvdGhl cndpc2UsIGFsbCB0aGUgbm9kZXMgdGhhdCB3aWxsIHByb2JhYmx5IGhhdmUgYWNj ZXNza2V5cyBieQogKiBkZWZhdWx0IGFyZSB1cGRhdGVkLgogKgogKiBAcGFyYW0g QXJyYXkgbm9kZUxpc3QgLS0gbGlzdCBvZiBlbGVtZW50cyB0byB1cGRhdGUKICov CmZ1bmN0aW9uIHVwZGF0ZVRvb2x0aXBBY2Nlc3NLZXlzKCBub2RlTGlzdCApIHsK CWlmICggIW5vZGVMaXN0ICkgewoJCS8vIFJhdGhlciB0aGFuIHNjYW4gYWxsIGxp bmtzIG9uIHRoZSB3aG9sZSBwYWdlLCB3ZSBjYW4ganVzdCBzY2FuIHRoZXNlCgkJ Ly8gY29udGFpbmVycyB3aGljaCBjb250YWluIHRoZSByZWxldmFudCBsaW5rcy4g VGhpcyBpcyByZWFsbHkganVzdCBhbgoJCS8vIG9wdGltaXphdGlvbiB0ZWNobmlx dWUuCgkJdmFyIGxpbmtDb250YWluZXJzID0gWwoJCQknY29sdW1uLW9uZScsIC8v IE1vbm9ib29rIGFuZCBNb2Rlcm4KCQkJJ213LWhlYWQnLCAnbXctcGFuZWwnLCAn cC1sb2dvJyAvLyBWZWN0b3IKCQldOwoJCWZvciAoIHZhciBpIGluIGxpbmtDb250 YWluZXJzICkgewoJCQl2YXIgbGlua0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVs ZW1lbnRCeUlkKCBsaW5rQ29udGFpbmVyc1tpXSApOwoJCQlpZiAoIGxpbmtDb250 YWluZXIgKSB7CgkJCQl1cGRhdGVUb29sdGlwQWNjZXNzS2V5cyggbGlua0NvbnRh aW5lci5nZXRFbGVtZW50c0J5VGFnTmFtZSggJ2EnICkgKTsKCQkJfQoJCX0KCQkv LyB0aGVzZSBhcmUgcmFyZSBlbm91Z2ggdGhhdCBubyBzdWNoIG9wdGltaXphdGlv biBpcyBuZWVkZWQKCQl1cGRhdGVUb29sdGlwQWNjZXNzS2V5cyggZG9jdW1lbnQu Z2V0RWxlbWVudHNCeVRhZ05hbWUoICdpbnB1dCcgKSApOwoJCXVwZGF0ZVRvb2x0 aXBBY2Nlc3NLZXlzKCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggJ2xh YmVsJyApICk7CgkJcmV0dXJuOwoJfQoKCWZvciAoIHZhciBpID0gMDsgaSA8IG5v ZGVMaXN0Lmxlbmd0aDsgaSsrICkgewoJCXZhciBlbGVtZW50ID0gbm9kZUxpc3Rb aV07CgkJdmFyIHRpcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCAndGl0bGUnICk7 CgkJaWYgKCB0aXAgJiYgdG9vbHRpcEFjY2Vzc0tleVJlZ2V4cC5leGVjKCB0aXAg KSApIHsKCQkJdGlwID0gdGlwLnJlcGxhY2UodG9vbHRpcEFjY2Vzc0tleVJlZ2V4 cCwKCQkJCQkgICdbJyArIHRvb2x0aXBBY2Nlc3NLZXlQcmVmaXggKyAiJDVdIik7 CgkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCAndGl0bGUnLCB0aXAgKTsKCQl9Cgl9 Cn0KCi8qKgogKiBBZGQgYSBsaW5rIHRvIG9uZSBvZiB0aGUgcG9ydGxldCBtZW51 cyBvbiB0aGUgcGFnZSwgaW5jbHVkaW5nOgogKgogKiBwLWNhY3Rpb25zOiBDb250 ZW50IGFjdGlvbnMgKHNob3duIGFzIHRhYnMgYWJvdmUgdGhlIG1haW4gY29udGVu dCBpbiBNb25vYm9vaykKICogcC1wZXJzb25hbDogUGVyc29uYWwgdG9vbHMgKHNo b3duIGF0IHRoZSB0b3AgcmlnaHQgb2YgdGhlIHBhZ2UgaW4gTW9ub2Jvb2spCiAq IHAtbmF2aWdhdGlvbjogTmF2aWdhdGlvbgogKiBwLXRiOiBUb29sYm94CiAqCiAq IFRoaXMgZnVuY3Rpb24gZXhpc3RzIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgY3Vz dG9tIEpTIGF1dGhvcnMuICBBbGwKICogYnV0IHRoZSBmaXJzdCB0aHJlZSBwYXJh bWV0ZXJzIGFyZSBvcHRpb25hbCwgdGhvdWdoIHByb3ZpZGluZyBhdAogKiBsZWFz dCBhbiBpZCBhbmQgYSB0b29sdGlwIGlzIHJlY29tbWVuZGVkLgogKgogKiBCeSBk ZWZhdWx0IHRoZSBuZXcgbGluayB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2Yg dGhlIGxpc3QuICBUbwogKiBhZGQgdGhlIGxpbmsgYmVmb3JlIGEgZ2l2ZW4gZXhp c3RpbmcgaXRlbSwgcGFzcyB0aGUgRE9NIG5vZGUgb2YKICogdGhhdCBpdGVtIChl YXNpbHkgb2J0YWluZWQgd2l0aCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgpKSBh cyB0aGUKICogbmV4dG5vZGUgcGFyYW1ldGVyOyB0byBhZGQgdGhlIGxpbmsgX2Fm dGVyXyBhbiBleGlzdGluZyBpdGVtLCBwYXNzCiAqIHRoZSBub2RlJ3MgbmV4dFNp YmxpbmcgaW5zdGVhZC4KICoKICogQHBhcmFtIFN0cmluZyBwb3J0bGV0IC0tIGlk IG9mIHRoZSB0YXJnZXQgcG9ydGxldCAoInAtY2FjdGlvbnMiLCAicC1wZXJzb25h bCIsICJwLW5hdmlnYXRpb24iIG9yICJwLXRiIikKICogQHBhcmFtIFN0cmluZyBo cmVmIC0tIGxpbmsgVVJMCiAqIEBwYXJhbSBTdHJpbmcgdGV4dCAtLSBsaW5rIHRl eHQgKHdpbGwgYmUgYXV0b21hdGljYWxseSBsb3dlcmNhc2VkIGJ5IENTUyBmb3Ig cC1jYWN0aW9ucyBpbiBNb25vYm9vaykKICogQHBhcmFtIFN0cmluZyBpZCAtLSBp ZCBvZiB0aGUgbmV3IGl0ZW0sIHNob3VsZCBiZSB1bmlxdWUgYW5kIHByZWZlcmFi bHkgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgcHJlZml4ICgiY2EtIiwgInB0LSIsICJu LSIgb3IgInQtIikKICogQHBhcmFtIFN0cmluZyB0b29sdGlwIC0tIHRleHQgdG8g c2hvdyB3aGVuIGhvdmVyaW5nIG92ZXIgdGhlIGxpbmssIHdpdGhvdXQgYWNjZXNz a2V5IHN1ZmZpeAogKiBAcGFyYW0gU3RyaW5nIGFjY2Vzc2tleSAtLSBhY2Nlc3Nr ZXkgdG8gYWN0aXZhdGUgdGhpcyBsaW5rIChvbmUgY2hhcmFjdGVyLCB0cnkgdG8g YXZvaWQgY29uZmxpY3RzKQogKiBAcGFyYW0gTm9kZSBuZXh0bm9kZSAtLSB0aGUg RE9NIG5vZGUgYmVmb3JlIHdoaWNoIHRoZSBuZXcgaXRlbSBzaG91bGQgYmUgYWRk ZWQsIHNob3VsZCBiZSBhbm90aGVyIGl0ZW0gaW4gdGhlIHNhbWUgbGlzdAogKgog KiBAcmV0dXJuIE5vZGUgLS0gdGhlIERPTSBub2RlIG9mIHRoZSBuZXcgaXRlbSAo YW4gTEkgZWxlbWVudCkgb3IgbnVsbAogKi8KZnVuY3Rpb24gYWRkUG9ydGxldExp bmsoIHBvcnRsZXQsIGhyZWYsIHRleHQsIGlkLCB0b29sdGlwLCBhY2Nlc3NrZXks IG5leHRub2RlICkgewoJdmFyIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZCggcG9ydGxldCApOwoJaWYgKCAhcm9vdCApIHsKCQlyZXR1cm4gbnVsbDsKCX0K CXZhciBub2RlID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSggJ3VsJyApWzBd OwoJaWYgKCAhbm9kZSApIHsKCQlyZXR1cm4gbnVsbDsKCX0KCgkvLyB1bmhpZGUg cG9ydGxldCBpZiBpdCB3YXMgaGlkZGVuIGJlZm9yZQoJcm9vdC5jbGFzc05hbWUg PSByb290LmNsYXNzTmFtZS5yZXBsYWNlKCAvKF58ICllbXB0eVBvcnRsZXQoIHwk KS8sICIkMiIgKTsKCgl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo ICdzcGFuJyApOwoJc3Bhbi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlVGV4 dE5vZGUoIHRleHQgKSApOwoKCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxl bWVudCggJ2EnICk7CglsaW5rLmFwcGVuZENoaWxkKCBzcGFuICk7CglsaW5rLmhy ZWYgPSBocmVmOwoKCXZhciBpdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgg J2xpJyApOwoJaXRlbS5hcHBlbmRDaGlsZCggbGluayApOwoJaWYgKCBpZCApIHsK CQlpdGVtLmlkID0gaWQ7Cgl9CgoJaWYgKCBhY2Nlc3NrZXkgKSB7CgkJbGluay5z ZXRBdHRyaWJ1dGUoICdhY2Nlc3NrZXknLCBhY2Nlc3NrZXkgKTsKCQl0b29sdGlw ICs9ICcgWycgKyBhY2Nlc3NrZXkgKyAnXSc7Cgl9CglpZiAoIHRvb2x0aXAgKSB7 CgkJbGluay5zZXRBdHRyaWJ1dGUoICd0aXRsZScsIHRvb2x0aXAgKTsKCX0KCWlm ICggYWNjZXNza2V5ICYmIHRvb2x0aXAgKSB7CgkJdXBkYXRlVG9vbHRpcEFjY2Vz c0tleXMoIG5ldyBBcnJheSggbGluayApICk7Cgl9CgoJaWYgKCBuZXh0bm9kZSAm JiBuZXh0bm9kZS5wYXJlbnROb2RlID09IG5vZGUgKSB7CgkJbm9kZS5pbnNlcnRC ZWZvcmUoIGl0ZW0sIG5leHRub2RlICk7Cgl9IGVsc2UgewoJCW5vZGUuYXBwZW5k Q2hpbGQoIGl0ZW0gKTsgIC8vIElFIGNvbXBhdGliaWxpdHkgKD8pCgl9CgoJcmV0 dXJuIGl0ZW07Cn0KCmZ1bmN0aW9uIGdldElubmVyVGV4dCggZWwgKSB7CglpZiAo IHR5cGVvZiBlbCA9PSAnc3RyaW5nJyApIHsKCQlyZXR1cm4gZWw7Cgl9CglpZiAo IHR5cGVvZiBlbCA9PSAndW5kZWZpbmVkJyApIHsKCQlyZXR1cm4gZWw7Cgl9Cglp ZiAoIGVsLnRleHRDb250ZW50ICkgewoJCXJldHVybiBlbC50ZXh0Q29udGVudDsg Ly8gbm90IG5lZWRlZCBidXQgaXQgaXMgZmFzdGVyCgl9CglpZiAoIGVsLmlubmVy VGV4dCApIHsKCQlyZXR1cm4gZWwuaW5uZXJUZXh0OyAvLyBJRSBkb2Vzbid0IGhh dmUgdGV4dENvbnRlbnQKCX0KCXZhciBzdHIgPSAnJzsKCgl2YXIgY3MgPSBlbC5j aGlsZE5vZGVzOwoJdmFyIGwgPSBjcy5sZW5ndGg7Cglmb3IgKCB2YXIgaSA9IDA7 IGkgPCBsOyBpKysgKSB7CgkJc3dpdGNoICggY3NbaV0ubm9kZVR5cGUgKSB7CgkJ CWNhc2UgMTogLy8gRUxFTUVOVF9OT0RFCgkJCQlzdHIgKz0gdHNfZ2V0SW5uZXJU ZXh0KCBjc1tpXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzoJLy8gVEVYVF9OT0RF CgkJCQlzdHIgKz0gY3NbaV0ubm9kZVZhbHVlOwoJCQkJYnJlYWs7CgkJfQoJfQoJ cmV0dXJuIHN0cjsKfQoKLyogRHVtbXkgZm9yIGRlcHJlY2F0ZWQgZnVuY3Rpb24g Ki8KZnVuY3Rpb24gYWtleXR0KCBkb0lkICkgewp9Cgp2YXIgY2hlY2tib3hlczsK dmFyIGxhc3RDaGVja2JveDsKCmZ1bmN0aW9uIHNldHVwQ2hlY2tib3hTaGlmdENs aWNrKCkgewoJY2hlY2tib3hlcyA9IFtdOwoJbGFzdENoZWNrYm94ID0gbnVsbDsK CXZhciBpbnB1dHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggJ2lu cHV0JyApOwoJYWRkQ2hlY2tib3hDbGlja0hhbmRsZXJzKCBpbnB1dHMgKTsKfQoK ZnVuY3Rpb24gYWRkQ2hlY2tib3hDbGlja0hhbmRsZXJzKCBpbnB1dHMsIHN0YXJ0 ICkgewoJaWYgKCAhc3RhcnQgKSB7CgkJc3RhcnQgPSAwOwoJfQoKCXZhciBmaW5p c2ggPSBzdGFydCArIDI1MDsKCWlmICggZmluaXNoID4gaW5wdXRzLmxlbmd0aCAp IHsKCQlmaW5pc2ggPSBpbnB1dHMubGVuZ3RoOwoJfQoKCWZvciAoIHZhciBpID0g c3RhcnQ7IGkgPCBmaW5pc2g7IGkrKyApIHsKCQl2YXIgY2IgPSBpbnB1dHNbaV07 CgkJaWYgKCAhY2IudHlwZSB8fCBjYi50eXBlLnRvTG93ZXJDYXNlKCkgIT0gJ2No ZWNrYm94JyB8fCAoICcgJyArIGNiLmNsYXNzTmFtZSArICcgJyApLmluZGV4T2Yo ICcgbm9zaGlmdHNlbGVjdCAnICkgICE9IC0xICkgewoJCQljb250aW51ZTsKCQl9 CgkJdmFyIGVuZCA9IGNoZWNrYm94ZXMubGVuZ3RoOwoJCWNoZWNrYm94ZXNbZW5k XSA9IGNiOwoJCWNiLmluZGV4ID0gZW5kOwoJCWNiLm9uY2xpY2sgPSBjaGVja2Jv eENsaWNrSGFuZGxlcjsKCX0KCglpZiAoIGZpbmlzaCA8IGlucHV0cy5sZW5ndGgg KSB7CgkJc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCWFkZENoZWNrYm94Q2xp Y2tIYW5kbGVycyggaW5wdXRzLCBmaW5pc2ggKTsKCQl9LCAyMDAgKTsKCX0KfQoK ZnVuY3Rpb24gY2hlY2tib3hDbGlja0hhbmRsZXIoIGUgKSB7CglpZiAoIHR5cGVv ZiBlID09ICd1bmRlZmluZWQnICkgewoJCWUgPSB3aW5kb3cuZXZlbnQ7Cgl9Cglp ZiAoICFlLnNoaWZ0S2V5IHx8IGxhc3RDaGVja2JveCA9PT0gbnVsbCApIHsKCQls YXN0Q2hlY2tib3ggPSB0aGlzLmluZGV4OwoJCXJldHVybiB0cnVlOwoJfQoJdmFy IGVuZFN0YXRlID0gdGhpcy5jaGVja2VkOwoJdmFyIHN0YXJ0LCBmaW5pc2g7Cglp ZiAoIHRoaXMuaW5kZXggPCBsYXN0Q2hlY2tib3ggKSB7CgkJc3RhcnQgPSB0aGlz LmluZGV4ICsgMTsKCQlmaW5pc2ggPSBsYXN0Q2hlY2tib3g7Cgl9IGVsc2UgewoJ CXN0YXJ0ID0gbGFzdENoZWNrYm94OwoJCWZpbmlzaCA9IHRoaXMuaW5kZXggLSAx OwoJfQoJZm9yICggdmFyIGkgPSBzdGFydDsgaSA8PSBmaW5pc2g7ICsraSApIHsK CQljaGVja2JveGVzW2ldLmNoZWNrZWQgPSBlbmRTdGF0ZTsKCQlpZiggaSA+IHN0 YXJ0ICYmIHR5cGVvZiBjaGVja2JveGVzW2ldLm9uY2hhbmdlID09ICdmdW5jdGlv bicgKSB7CgkJCWNoZWNrYm94ZXNbaV0ub25jaGFuZ2UoKTsgLy8gZmlyZSB0cmln Z2VycwoJCX0KCX0KCWxhc3RDaGVja2JveCA9IHRoaXMuaW5kZXg7CglyZXR1cm4g dHJ1ZTsKfQoKCi8qCglXcml0dGVuIGJ5IEpvbmF0aGFuIFNub29rLCBodHRwOi8v d3d3LnNub29rLmNhL2pvbmF0aGFuCglBZGQtb25zIGJ5IFJvYmVydCBOeW1hbiwg aHR0cDovL3d3dy5yb2JlcnRueW1hbi5jb20KCUF1dGhvciBzYXlzICJUaGUgY3Jl ZGl0IGNvbW1lbnQgaXMgYWxsIGl0IHRha2VzLCBubyBsaWNlbnNlLiBHbyBjcmF6 eSB3aXRoIGl0ITotKSIKCUZyb20gaHR0cDovL3d3dy5yb2JlcnRueW1hbi5jb20v MjAwNS8xMS8wNy90aGUtdWx0aW1hdGUtZ2V0ZWxlbWVudHNieWNsYXNzbmFtZS8K Ki8KZnVuY3Rpb24gZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggb0VsbSwgc3RyVGFn TmFtZSwgb0NsYXNzTmFtZXMgKSB7Cgl2YXIgYXJyUmV0dXJuRWxlbWVudHMgPSBu ZXcgQXJyYXkoKTsKCWlmICggdHlwZW9mKCBvRWxtLmdldEVsZW1lbnRzQnlDbGFz c05hbWUgKSA9PSAnZnVuY3Rpb24nICkgewoJCS8qIFVzZSBhIG5hdGl2ZSBpbXBs ZW1lbnRhdGlvbiB3aGVyZSBwb3NzaWJsZSBGRjMsIFNhZjMuMiwgT3BlcmEgOS41 ICovCgkJdmFyIGFyck5hdGl2ZVJldHVybiA9IG9FbG0uZ2V0RWxlbWVudHNCeUNs YXNzTmFtZSggb0NsYXNzTmFtZXMgKTsKCQlpZiAoIHN0clRhZ05hbWUgPT0gJyon ICkgewoJCQlyZXR1cm4gYXJyTmF0aXZlUmV0dXJuOwoJCX0KCQlmb3IgKCB2YXIg aCA9IDA7IGggPCBhcnJOYXRpdmVSZXR1cm4ubGVuZ3RoOyBoKysgKSB7CgkJCWlm KCBhcnJOYXRpdmVSZXR1cm5baF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09IHN0 clRhZ05hbWUudG9Mb3dlckNhc2UoKSApIHsKCQkJCWFyclJldHVybkVsZW1lbnRz W2FyclJldHVybkVsZW1lbnRzLmxlbmd0aF0gPSBhcnJOYXRpdmVSZXR1cm5baF07 CgkJCX0KCQl9CgkJcmV0dXJuIGFyclJldHVybkVsZW1lbnRzOwoJfQoJdmFyIGFy ckVsZW1lbnRzID0gKCBzdHJUYWdOYW1lID09ICcqJyAmJiBvRWxtLmFsbCApID8g b0VsbS5hbGwgOiBvRWxtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzdHJUYWdOYW1l ICk7Cgl2YXIgYXJyUmVnRXhwQ2xhc3NOYW1lcyA9IG5ldyBBcnJheSgpOwoJaWYo IHR5cGVvZiBvQ2xhc3NOYW1lcyA9PSAnb2JqZWN0JyApIHsKCQlmb3IoIHZhciBp ID0gMDsgaSA8IG9DbGFzc05hbWVzLmxlbmd0aDsgaSsrICkgewoJCQlhcnJSZWdF eHBDbGFzc05hbWVzW2FyclJlZ0V4cENsYXNzTmFtZXMubGVuZ3RoXSA9CgkJCQlu ZXcgUmVnRXhwKCIoXnxcXHMpIiArIG9DbGFzc05hbWVzW2ldLnJlcGxhY2UoL1wt L2csICJcXC0iKSArICIoXFxzfCQpIik7CgkJfQoJfSBlbHNlIHsKCQlhcnJSZWdF eHBDbGFzc05hbWVzW2FyclJlZ0V4cENsYXNzTmFtZXMubGVuZ3RoXSA9CgkJCW5l dyBSZWdFeHAoIihefFxccykiICsgb0NsYXNzTmFtZXMucmVwbGFjZSgvXC0vZywg IlxcLSIpICsgIihcXHN8JCkiKTsKCX0KCXZhciBvRWxlbWVudDsKCXZhciBiTWF0 Y2hlc0FsbDsKCWZvciggdmFyIGogPSAwOyBqIDwgYXJyRWxlbWVudHMubGVuZ3Ro OyBqKysgKSB7CgkJb0VsZW1lbnQgPSBhcnJFbGVtZW50c1tqXTsKCQliTWF0Y2hl c0FsbCA9IHRydWU7CgkJZm9yKCB2YXIgayA9IDA7IGsgPCBhcnJSZWdFeHBDbGFz c05hbWVzLmxlbmd0aDsgaysrICkgewoJCQlpZiggIWFyclJlZ0V4cENsYXNzTmFt ZXNba10udGVzdCggb0VsZW1lbnQuY2xhc3NOYW1lICkgKSB7CgkJCQliTWF0Y2hl c0FsbCA9IGZhbHNlOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJaWYoIGJNYXRjaGVz QWxsICkgewoJCQlhcnJSZXR1cm5FbGVtZW50c1thcnJSZXR1cm5FbGVtZW50cy5s ZW5ndGhdID0gb0VsZW1lbnQ7CgkJfQoJfQoJcmV0dXJuICggYXJyUmV0dXJuRWxl bWVudHMgKTsKfQoKZnVuY3Rpb24gcmVkaXJlY3RUb0ZyYWdtZW50KCBmcmFnbWVu dCApIHsKCXZhciBtYXRjaCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0Fw cGxlV2ViS2l0XC8oXGQrKS8pOwoJaWYgKCBtYXRjaCApIHsKCQl2YXIgd2ViS2l0 VmVyc2lvbiA9IHBhcnNlSW50KCBtYXRjaFsxXSApOwoJCWlmICggd2ViS2l0VmVy c2lvbiA8IDQyMCApIHsKCQkJLy8gUmVsZWFzZWQgU2FmYXJpIHcvIFdlYktpdCA0 MTguOS4xIG1lc3NlcyB1cCBob3JyaWJseQoJCQkvLyBOaWdodGxpZXMgb2YgNDIw KyBhcmUgb2sKCQkJcmV0dXJuOwoJCX0KCX0KCWlmICggaXNfZ2Vja28gKSB7CgkJ Ly8gTW96aWxsYSBuZWVkcyB0byB3YWl0IHVudGlsIGFmdGVyIGxvYWQsIG90aGVy d2lzZSB0aGUgd2luZG93IGRvZXNuJ3Qgc2Nyb2xsCgkJYWRkT25sb2FkSG9vayhm dW5jdGlvbigpIHsKCQkJaWYgKCB3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAnJyAp IHsKCQkJCXdpbmRvdy5sb2NhdGlvbi5oYXNoID0gZnJhZ21lbnQ7CgkJCX0KCQl9 KTsKCX0gZWxzZSB7CgkJaWYgKCB3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAnJyAp IHsKCQkJd2luZG93LmxvY2F0aW9uLmhhc2ggPSBmcmFnbWVudDsKCQl9Cgl9Cn0K Ci8qCiAqIFRhYmxlIHNvcnRpbmcgc2NyaXB0IGJhc2VkIG9uIG9uZSAoYykgMTk5 Ny0yMDA2IFN0dWFydCBMYW5ncmlkZ2UgYW5kIEpvb3N0CiAqIGRlIFZhbGs6CiAq IGh0dHA6Ly93d3cuam9vc3RkZXZhbGsubmwvY29kZS9zb3J0YWJsZS10YWJsZS8K ICogaHR0cDovL3d3dy5rcnlvZ2VuaXgub3JnL2NvZGUvYnJvd3Nlci9zb3J0dGFi bGUvCiAqCiAqIEB0b2RvIGRvbid0IGJyZWFrIG9uIGNvbHNwYW5zL3Jvd3NwYW5z IChidWcgODAyOCkKICogQHRvZG8gbGFuZ3VhZ2Utc3BlY2lmaWMgZGlnaXQgZ3Jv dXBpbmcvZGVjaW1hbHMgKGJ1ZyA4MDYzKQogKiBAdG9kbyBzdXBwb3J0IGFsbCBh Y2NlcHRlZCBkYXRlIGZvcm1hdHMgKGJ1ZyA4MjI2KQogKi8KCnZhciB0c19pbWFn ZV9wYXRoID0gc3R5bGVwYXRoICsgJy9jb21tb24vaW1hZ2VzLyc7CnZhciB0c19p bWFnZV91cCA9ICdzb3J0X3VwLmdpZic7CnZhciB0c19pbWFnZV9kb3duID0gJ3Nv cnRfZG93bi5naWYnOwp2YXIgdHNfaW1hZ2Vfbm9uZSA9ICdzb3J0X25vbmUuZ2lm JzsKdmFyIHRzX2V1cm9wZWFuZGF0ZSA9IHdnQ29udGVudExhbmd1YWdlICE9ICdl bic7IC8vIFRoZSBub24tQW1lcmljYW4taW5jbGluZWQgY2FuIGNoYW5nZSB0byAi dHJ1ZSIKdmFyIHRzX2FsdGVybmF0ZV9yb3dfY29sb3JzID0gZmFsc2U7CnZhciB0 c19udW1iZXJfdHJhbnNmb3JtX3RhYmxlID0gbnVsbDsKdmFyIHRzX251bWJlcl9y ZWdleCA9IG51bGw7CgpmdW5jdGlvbiBzb3J0YWJsZXNfaW5pdCgpIHsKCXZhciBp ZG51bSA9IDA7CgkvLyBGaW5kIGFsbCB0YWJsZXMgd2l0aCBjbGFzcyBzb3J0YWJs ZSBhbmQgbWFrZSB0aGVtIHNvcnRhYmxlCgl2YXIgdGFibGVzID0gZ2V0RWxlbWVu dHNCeUNsYXNzTmFtZSggZG9jdW1lbnQsICd0YWJsZScsICdzb3J0YWJsZScgKTsK CWZvciAoIHZhciB0aSA9IDA7IHRpIDwgdGFibGVzLmxlbmd0aCA7IHRpKysgKSB7 CgkJaWYgKCAhdGFibGVzW3RpXS5pZCApIHsKCQkJdGFibGVzW3RpXS5zZXRBdHRy aWJ1dGUoICdpZCcsICdzb3J0YWJsZV90YWJsZV9pZF8nICsgaWRudW0gKTsKCQkJ KytpZG51bTsKCQl9CgkJdHNfbWFrZVNvcnRhYmxlKCB0YWJsZXNbdGldICk7Cgl9 Cn0KCmZ1bmN0aW9uIHRzX21ha2VTb3J0YWJsZSggdGFibGUgKSB7Cgl2YXIgZmly c3RSb3c7CglpZiAoIHRhYmxlLnJvd3MgJiYgdGFibGUucm93cy5sZW5ndGggPiAw ICkgewoJCWlmICggdGFibGUudEhlYWQgJiYgdGFibGUudEhlYWQucm93cy5sZW5n dGggPiAwICkgewoJCQlmaXJzdFJvdyA9IHRhYmxlLnRIZWFkLnJvd3NbdGFibGUu dEhlYWQucm93cy5sZW5ndGgtMV07CgkJfSBlbHNlIHsKCQkJZmlyc3RSb3cgPSB0 YWJsZS5yb3dzWzBdOwoJCX0KCX0KCWlmICggIWZpcnN0Um93ICkgewoJCXJldHVy bjsKCX0KCgkvLyBXZSBoYXZlIGEgZmlyc3Qgcm93OiBhc3N1bWUgaXQncyB0aGUg aGVhZGVyLCBhbmQgbWFrZSBpdHMgY29udGVudHMgY2xpY2thYmxlIGxpbmtzCglm b3IgKCB2YXIgaSA9IDA7IGkgPCBmaXJzdFJvdy5jZWxscy5sZW5ndGg7IGkrKyAp IHsKCQl2YXIgY2VsbCA9IGZpcnN0Um93LmNlbGxzW2ldOwoJCWlmICggKCcgJyAr IGNlbGwuY2xhc3NOYW1lICsgJyAnKS5pbmRleE9mKCcgdW5zb3J0YWJsZSAnKSA9 PSAtMSApIHsKCQkJY2VsbC5pbm5lckhUTUwgKz0gJzxhIGhyZWY9IiMiIGNsYXNz PSJzb3J0aGVhZGVyIiAnCgkJCQkrICdvbmNsaWNrPSJ0c19yZXNvcnRUYWJsZSh0 aGlzKTtyZXR1cm4gZmFsc2U7Ij4nCgkJCQkrICc8c3BhbiBjbGFzcz0ic29ydGFy cm93Ij4nCgkJCQkrICc8aW1nIHNyYz0iJwoJCQkJKyB0c19pbWFnZV9wYXRoCgkJ CQkrIHRzX2ltYWdlX25vbmUKCQkJCSsgJyIgYWx0PSImZGFycjsiLz48L3NwYW4+ PC9hPic7CgkJfQoJfQoJaWYgKCB0c19hbHRlcm5hdGVfcm93X2NvbG9ycyApIHsK CQl0c19hbHRlcm5hdGUoIHRhYmxlICk7Cgl9Cn0KCmZ1bmN0aW9uIHRzX2dldElu bmVyVGV4dCggZWwgKSB7CglyZXR1cm4gZ2V0SW5uZXJUZXh0KCBlbCApOwp9Cgpm dW5jdGlvbiB0c19yZXNvcnRUYWJsZSggbG5rICkgewoJLy8gZ2V0IHRoZSBzcGFu Cgl2YXIgc3BhbiA9IGxuay5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3BhbicpWzBd OwoKCXZhciB0ZCA9IGxuay5wYXJlbnROb2RlOwoJdmFyIHRyID0gdGQucGFyZW50 Tm9kZTsKCXZhciBjb2x1bW4gPSB0ZC5jZWxsSW5kZXg7CgoJdmFyIHRhYmxlID0g dHIucGFyZW50Tm9kZTsKCXdoaWxlICggdGFibGUgJiYgISggdGFibGUudGFnTmFt ZSAmJiB0YWJsZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ3RhYmxlJyApICkg ewoJCXRhYmxlID0gdGFibGUucGFyZW50Tm9kZTsKCX0KCWlmICggIXRhYmxlICkg ewoJCXJldHVybjsKCX0KCglpZiAoIHRhYmxlLnJvd3MubGVuZ3RoIDw9IDEgKSB7 CgkJcmV0dXJuOwoJfQoKCS8vIEdlbmVyYXRlIHRoZSBudW1iZXIgdHJhbnNmb3Jt IHRhYmxlIGlmIGl0J3Mgbm90IGRvbmUgYWxyZWFkeQoJaWYgKCB0c19udW1iZXJf dHJhbnNmb3JtX3RhYmxlID09PSBudWxsICkgewoJCXRzX2luaXRUcmFuc2Zvcm1U YWJsZSgpOwoJfQoKCS8vIFdvcmsgb3V0IGEgdHlwZSBmb3IgdGhlIGNvbHVtbgoJ Ly8gU2tpcCB0aGUgZmlyc3Qgcm93IGlmIHRoYXQncyB3aGVyZSB0aGUgaGVhZGlu Z3MgYXJlCgl2YXIgcm93U3RhcnQgPSAoIHRhYmxlLnRIZWFkICYmIHRhYmxlLnRI ZWFkLnJvd3MubGVuZ3RoID4gMCA/IDAgOiAxICk7CgoJdmFyIGl0bSA9ICcnOwoJ Zm9yICggdmFyIGkgPSByb3dTdGFydDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBp KysgKSB7CgkJaWYgKCB0YWJsZS5yb3dzW2ldLmNlbGxzLmxlbmd0aCA+IGNvbHVt biApIHsKCQkJaXRtID0gdHNfZ2V0SW5uZXJUZXh0KHRhYmxlLnJvd3NbaV0uY2Vs bHNbY29sdW1uXSk7CgkJCWl0bSA9IGl0bS5yZXBsYWNlKC9eW1xzXHhhMF0rLywg JycpLnJlcGxhY2UoL1tcc1x4YTBdKyQvLCAnJyk7CgkJCWlmICggaXRtICE9ICcn ICkgewoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CgoJLy8gVE9ETzogYnVnIDgyMjYs IGxvY2FsaXNlZCBkYXRlIGZvcm1hdHMKCXZhciBzb3J0Zm4gPSB0c19zb3J0X2dl bmVyaWM7Cgl2YXIgcHJlcHJvY2Vzc29yID0gdHNfdG9Mb3dlckNhc2U7CglpZiAo IC9eXGRcZFtcLy4gLV1bYS16QS1aXXszfVtcLy4gLV1cZFxkXGRcZCQvLnRlc3Qo IGl0bSApICkgewoJCXByZXByb2Nlc3NvciA9IHRzX2RhdGVUb1NvcnRLZXk7Cgl9 IGVsc2UgaWYgKCAvXlxkXGRbXC8uLV1cZFxkW1wvLi1dXGRcZFxkXGQkLy50ZXN0 KCBpdG0gKSApIHsKCQlwcmVwcm9jZXNzb3IgPSB0c19kYXRlVG9Tb3J0S2V5OwoJ fSBlbHNlIGlmICggL15cZFxkW1wvLi1dXGRcZFtcLy4tXVxkXGQkLy50ZXN0KCBp dG0gKSApIHsKCQlwcmVwcm9jZXNzb3IgPSB0c19kYXRlVG9Tb3J0S2V5OwoJCS8v IChtaW51cyBzaWduKShbcG91bmQgZG9sbGFyIGV1cm8geWVuIGN1cnJlbmN5XXxj ZW50cykKCX0gZWxzZSBpZiAoIC8oXihbLVx1MjIxMl0gKik/W1x1MDBhMyRcdTIw YWNcdTAwYTRcdTAwYTVdfFx1MDBhMiQpLy50ZXN0KCBpdG0gKSApIHsKCQlwcmVw cm9jZXNzb3IgPSB0c19jdXJyZW5jeVRvU29ydEtleTsKCX0gZWxzZSBpZiAoIHRz X251bWJlcl9yZWdleC50ZXN0KCBpdG0gKSApIHsKCQlwcmVwcm9jZXNzb3IgPSB0 c19wYXJzZUZsb2F0OwoJfQoKCXZhciByZXZlcnNlID0gKCBzcGFuLmdldEF0dHJp YnV0ZSggJ3NvcnRkaXInICkgPT0gJ2Rvd24nICk7CgoJdmFyIG5ld1Jvd3MgPSBu ZXcgQXJyYXkoKTsKCXZhciBzdGF0aWNSb3dzID0gbmV3IEFycmF5KCk7Cglmb3Ig KCB2YXIgaiA9IHJvd1N0YXJ0OyBqIDwgdGFibGUucm93cy5sZW5ndGg7IGorKyAp IHsKCQl2YXIgcm93ID0gdGFibGUucm93c1tqXTsKCQlpZiggKCcgJyArIHJvdy5j bGFzc05hbWUgKyAnICcpLmluZGV4T2YoJyB1bnNvcnRhYmxlICcpIDwgMCApIHsK CQkJdmFyIGtleVRleHQgPSB0c19nZXRJbm5lclRleHQoIHJvdy5jZWxsc1tjb2x1 bW5dICk7CgkJCWlmKCBrZXlUZXh0ID09PSB1bmRlZmluZWQgKSB7CgkJCQlrZXlU ZXh0ID0gJyc7IAoJCQl9CgkJCXZhciBvbGRJbmRleCA9ICggcmV2ZXJzZSA/IC1q IDogaiApOwoJCQl2YXIgcHJlcHJvY2Vzc2VkID0gcHJlcHJvY2Vzc29yKCBrZXlU ZXh0LnJlcGxhY2UoL15bXHNceGEwXSsvLCAnJykucmVwbGFjZSgvW1xzXHhhMF0r JC8sICcnKSApOwoKCQkJbmV3Um93c1tuZXdSb3dzLmxlbmd0aF0gPSBuZXcgQXJy YXkoIHJvdywgcHJlcHJvY2Vzc2VkLCBvbGRJbmRleCApOwoJCX0gZWxzZSB7CgkJ CXN0YXRpY1Jvd3Nbc3RhdGljUm93cy5sZW5ndGhdID0gbmV3IEFycmF5KCByb3cs IGZhbHNlLCBqLXJvd1N0YXJ0ICk7CgkJfQoJfQoKCW5ld1Jvd3Muc29ydCggc29y dGZuICk7CgoJdmFyIGFycm93SFRNTDsKCWlmICggcmV2ZXJzZSApIHsKCQlhcnJv d0hUTUwgPSAnPGltZyBzcmM9IicgKyB0c19pbWFnZV9wYXRoICsgdHNfaW1hZ2Vf ZG93biArICciIGFsdD0iJmRhcnI7Ii8+JzsKCQluZXdSb3dzLnJldmVyc2UoKTsK CQlzcGFuLnNldEF0dHJpYnV0ZSggJ3NvcnRkaXInLCAndXAnICk7Cgl9IGVsc2Ug ewoJCWFycm93SFRNTCA9ICc8aW1nIHNyYz0iJyArIHRzX2ltYWdlX3BhdGggKyB0 c19pbWFnZV91cCArICciIGFsdD0iJnVhcnI7Ii8+JzsKCQlzcGFuLnNldEF0dHJp YnV0ZSggJ3NvcnRkaXInLCAnZG93bicgKTsKCX0KCglmb3IgKCB2YXIgaSA9IDA7 IGkgPCBzdGF0aWNSb3dzLmxlbmd0aDsgaSsrICkgewoJCXZhciByb3cgPSBzdGF0 aWNSb3dzW2ldOwoJCW5ld1Jvd3Muc3BsaWNlKCByb3dbMl0sIDAsIHJvdyApOwoJ fQoKCS8vIFdlIGFwcGVuZENoaWxkIHJvd3MgdGhhdCBhbHJlYWR5IGV4aXN0IHRv IHRoZSB0Ym9keSwgc28gaXQgbW92ZXMgdGhlbSByYXRoZXIgdGhhbiBjcmVhdGlu ZyBuZXcgb25lcwoJLy8gZG9uJ3QgZG8gc29ydGJvdHRvbSByb3dzCglmb3IgKCB2 YXIgaSA9IDA7IGkgPCBuZXdSb3dzLmxlbmd0aDsgaSsrICkgewoJCWlmICggKCAn ICcgKyBuZXdSb3dzW2ldWzBdLmNsYXNzTmFtZSArICcgJykuaW5kZXhPZignIHNv cnRib3R0b20gJykgPT0gLTEgKSB7CgkJCXRhYmxlLnRCb2RpZXNbMF0uYXBwZW5k Q2hpbGQoIG5ld1Jvd3NbaV1bMF0gKTsKCQl9Cgl9CgkvLyBkbyBzb3J0Ym90dG9t IHJvd3Mgb25seQoJZm9yICggdmFyIGkgPSAwOyBpIDwgbmV3Um93cy5sZW5ndGg7 IGkrKyApIHsKCQlpZiAoICggJyAnICsgbmV3Um93c1tpXVswXS5jbGFzc05hbWUg KyAnICcpLmluZGV4T2YoJyBzb3J0Ym90dG9tICcpICE9IC0xICkgewoJCQl0YWJs ZS50Qm9kaWVzWzBdLmFwcGVuZENoaWxkKCBuZXdSb3dzW2ldWzBdICk7CgkJfQoJ fQoKCS8vIERlbGV0ZSBhbnkgb3RoZXIgYXJyb3dzIHRoZXJlIG1heSBiZSBzaG93 aW5nCgl2YXIgc3BhbnMgPSBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCB0ciwgJ3Nw YW4nLCAnc29ydGFycm93JyApOwoJZm9yICggdmFyIGkgPSAwOyBpIDwgc3BhbnMu bGVuZ3RoOyBpKysgKSB7CgkJc3BhbnNbaV0uaW5uZXJIVE1MID0gJzxpbWcgc3Jj PSInICsgdHNfaW1hZ2VfcGF0aCArIHRzX2ltYWdlX25vbmUgKyAnIiBhbHQ9IiZk YXJyOyIvPic7Cgl9CglzcGFuLmlubmVySFRNTCA9IGFycm93SFRNTDsKCglpZiAo IHRzX2FsdGVybmF0ZV9yb3dfY29sb3JzICkgewoJCXRzX2FsdGVybmF0ZSggdGFi bGUgKTsKCX0KfQoKZnVuY3Rpb24gdHNfaW5pdFRyYW5zZm9ybVRhYmxlKCkgewoJ aWYgKCB0eXBlb2Ygd2dTZXBhcmF0b3JUcmFuc2Zvcm1UYWJsZSA9PSAndW5kZWZp bmVkJwoJCQl8fCAoIHdnU2VwYXJhdG9yVHJhbnNmb3JtVGFibGVbMF0gPT0gJycg JiYgd2dEaWdpdFRyYW5zZm9ybVRhYmxlWzJdID09ICcnICkgKQoJewoJCWRpZ2l0 Q2xhc3MgPSAiWzAtOSwuXSI7CgkJdHNfbnVtYmVyX3RyYW5zZm9ybV90YWJsZSA9 IGZhbHNlOwoJfSBlbHNlIHsKCQl0c19udW1iZXJfdHJhbnNmb3JtX3RhYmxlID0g e307CgkJLy8gVW5wYWNrIHRoZSB0cmFuc2Zvcm0gdGFibGUKCQkvLyBTZXBhcmF0 b3JzCgkJYXNjaWkgPSB3Z1NlcGFyYXRvclRyYW5zZm9ybVRhYmxlWzBdLnNwbGl0 KCJcdCIpOwoJCWxvY2FsaXNlZCA9IHdnU2VwYXJhdG9yVHJhbnNmb3JtVGFibGVb MV0uc3BsaXQoIlx0Iik7CgkJZm9yICggdmFyIGkgPSAwOyBpIDwgYXNjaWkubGVu Z3RoOyBpKysgKSB7CgkJCXRzX251bWJlcl90cmFuc2Zvcm1fdGFibGVbbG9jYWxp c2VkW2ldXSA9IGFzY2lpW2ldOwoJCX0KCQkvLyBEaWdpdHMKCQlhc2NpaSA9IHdn RGlnaXRUcmFuc2Zvcm1UYWJsZVswXS5zcGxpdCgiXHQiKTsKCQlsb2NhbGlzZWQg PSB3Z0RpZ2l0VHJhbnNmb3JtVGFibGVbMV0uc3BsaXQoIlx0Iik7CgkJZm9yICgg dmFyIGkgPSAwOyBpIDwgYXNjaWkubGVuZ3RoOyBpKysgKSB7CgkJCXRzX251bWJl cl90cmFuc2Zvcm1fdGFibGVbbG9jYWxpc2VkW2ldXSA9IGFzY2lpW2ldOwoJCX0K CgkJLy8gQ29uc3RydWN0IHJlZ2V4IGZvciBudW1iZXIgaWRlbnRpZmljYXRpb24K CQlkaWdpdHMgPSBbJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAn NycsICc4JywgJzknLCAnLCcsICdcXC4nXTsKCQltYXhEaWdpdExlbmd0aCA9IDE7 CgkJZm9yICggdmFyIGRpZ2l0IGluIHRzX251bWJlcl90cmFuc2Zvcm1fdGFibGUg KSB7CgkJCS8vIEVzY2FwZSByZWdleCBtZXRhY2hhcmFjdGVycwoJCQlkaWdpdHMu cHVzaCgKCQkJCWRpZ2l0LnJlcGxhY2UoIC9bXFxcXCRcKlwrXD9cLlwoXClcfFx7 XH1cW1xdXC1dLywKCQkJCQlmdW5jdGlvbiggcyApIHsgcmV0dXJuICdcXCcgKyBz OyB9ICkKCQkJKTsKCQkJaWYgKCBkaWdpdC5sZW5ndGggPiBtYXhEaWdpdExlbmd0 aCApIHsKCQkJCW1heERpZ2l0TGVuZ3RoID0gZGlnaXQubGVuZ3RoOwoJCQl9CgkJ fQoJCWlmICggbWF4RGlnaXRMZW5ndGggPiAxICkgewoJCQlkaWdpdENsYXNzID0g J1snICsgZGlnaXRzLmpvaW4oICcnLCBkaWdpdHMgKSArICddJzsKCQl9IGVsc2Ug ewoJCQlkaWdpdENsYXNzID0gJygnICsgZGlnaXRzLmpvaW4oICd8JywgZGlnaXRz ICkgKyAnKSc7CgkJfQoJfQoKCS8vIFdlIGFsbG93IGEgdHJhaWxpbmcgcGVyY2Vu dCBzaWduLCB3aGljaCB3ZSBqdXN0IHN0cmlwLiAgVGhpcyB3b3JrcyBmaW5lCgkv LyBpZiBwZXJjZW50cyBhbmQgcmVndWxhciBudW1iZXJzIGFyZW4ndCBiZWluZyBt aXhlZC4KCXRzX251bWJlcl9yZWdleCA9IG5ldyBSZWdFeHAoCgkJIl4oIiArCgkJ CSJbLStcdTIyMTJdP1swLTldWzAtOSxdKihcXC5bMC05LF0qKT8oRVstK1x1MjIx Ml0/WzAtOV1bMC05LF0qKT8iICsgLy8gRm9ydHJhbi1zdHlsZSBzY2llbnRpZmlj CgkJCSJ8IiArCgkJCSJbLStcdTIyMTJdPyIgKyBkaWdpdENsYXNzICsgIislPyIg KyAvLyBHZW5lcmljIGxvY2FsaXNlZAoJCSIpJCIsICJpIgoJKTsKfQoKZnVuY3Rp b24gdHNfdG9Mb3dlckNhc2UoIHMgKSB7CglyZXR1cm4gcy50b0xvd2VyQ2FzZSgp Owp9CgpmdW5jdGlvbiB0c19kYXRlVG9Tb3J0S2V5KCBkYXRlICkgewoJLy8geTJr IG5vdGVzOiB0d28gZGlnaXQgeWVhcnMgbGVzcyB0aGFuIDUwIGFyZSB0cmVhdGVk IGFzIDIwWFgsIGdyZWF0ZXIgdGhhbiA1MCBhcmUgdHJlYXRlZCBhcyAxOVhYCglp ZiAoIGRhdGUubGVuZ3RoID09IDExICkgewoJCXN3aXRjaCAoIGRhdGUuc3Vic3Ry KCAzLCAzICkudG9Mb3dlckNhc2UoKSApIHsKCQkJY2FzZSAnamFuJzoKCQkJCXZh ciBtb250aCA9ICcwMSc7CgkJCQlicmVhazsKCQkJY2FzZSAnZmViJzoKCQkJCXZh ciBtb250aCA9ICcwMic7CgkJCQlicmVhazsKCQkJY2FzZSAnbWFyJzoKCQkJCXZh ciBtb250aCA9ICcwMyc7CgkJCQlicmVhazsKCQkJY2FzZSAnYXByJzoKCQkJCXZh ciBtb250aCA9ICcwNCc7CgkJCQlicmVhazsKCQkJY2FzZSAnbWF5JzoKCQkJCXZh ciBtb250aCA9ICcwNSc7CgkJCQlicmVhazsKCQkJY2FzZSAnanVuJzoKCQkJCXZh ciBtb250aCA9ICcwNic7CgkJCQlicmVhazsKCQkJY2FzZSAnanVsJzoKCQkJCXZh ciBtb250aCA9ICcwNyc7CgkJCQlicmVhazsKCQkJY2FzZSAnYXVnJzoKCQkJCXZh ciBtb250aCA9ICcwOCc7CgkJCQlicmVhazsKCQkJY2FzZSAnc2VwJzoKCQkJCXZh ciBtb250aCA9ICcwOSc7CgkJCQlicmVhazsKCQkJY2FzZSAnb2N0JzoKCQkJCXZh ciBtb250aCA9ICcxMCc7CgkJCQlicmVhazsKCQkJY2FzZSAnbm92JzoKCQkJCXZh ciBtb250aCA9ICcxMSc7CgkJCQlicmVhazsKCQkJY2FzZSAnZGVjJzoKCQkJCXZh ciBtb250aCA9ICcxMic7CgkJCQlicmVhazsKCQkJLy8gZGVmYXVsdDogdmFyIG1v bnRoID0gJzAwJzsKCQl9CgkJcmV0dXJuIGRhdGUuc3Vic3RyKCA3LCA0ICkgKyBt b250aCArIGRhdGUuc3Vic3RyKCAwLCAyICk7Cgl9IGVsc2UgaWYgKCBkYXRlLmxl bmd0aCA9PSAxMCApIHsKCQlpZiAoIHRzX2V1cm9wZWFuZGF0ZSA9PSBmYWxzZSAp IHsKCQkJcmV0dXJuIGRhdGUuc3Vic3RyKCA2LCA0ICkgKyBkYXRlLnN1YnN0cigg MCwgMiApICsgZGF0ZS5zdWJzdHIoIDMsIDIgKTsKCQl9IGVsc2UgewoJCQlyZXR1 cm4gZGF0ZS5zdWJzdHIoIDYsIDQgKSArIGRhdGUuc3Vic3RyKCAzLCAyICkgKyBk YXRlLnN1YnN0ciggMCwgMiApOwoJCX0KCX0gZWxzZSBpZiAoIGRhdGUubGVuZ3Ro ID09IDggKSB7CgkJeXIgPSBkYXRlLnN1YnN0ciggNiwgMiApOwoJCWlmICggcGFy c2VJbnQoIHlyICkgPCA1MCApIHsKCQkJeXIgPSAnMjAnICsgeXI7CgkJfSBlbHNl IHsKCQkJeXIgPSAnMTknICsgeXI7CgkJfQoJCWlmICggdHNfZXVyb3BlYW5kYXRl ID09IHRydWUgKSB7CgkJCXJldHVybiB5ciArIGRhdGUuc3Vic3RyKCAzLCAyICkg KyBkYXRlLnN1YnN0ciggMCwgMiApOwoJCX0gZWxzZSB7CgkJCXJldHVybiB5ciAr IGRhdGUuc3Vic3RyKCAwLCAyICkgKyBkYXRlLnN1YnN0ciggMywgMiApOwoJCX0K CX0KCXJldHVybiAnMDAwMDAwMDAnOwp9CgpmdW5jdGlvbiB0c19wYXJzZUZsb2F0 KCBzICkgewoJaWYgKCAhcyApIHsKCQlyZXR1cm4gMDsKCX0KCWlmICggdHNfbnVt YmVyX3RyYW5zZm9ybV90YWJsZSAhPSBmYWxzZSApIHsKCQl2YXIgbmV3TnVtID0g JycsIGM7CgoJCWZvciAoIHZhciBwID0gMDsgcCA8IHMubGVuZ3RoOyBwKysgKSB7 CgkJCWMgPSBzLmNoYXJBdCggcCApOwoJCQlpZiAoIGMgaW4gdHNfbnVtYmVyX3Ry YW5zZm9ybV90YWJsZSApIHsKCQkJCW5ld051bSArPSB0c19udW1iZXJfdHJhbnNm b3JtX3RhYmxlW2NdOwoJCQl9IGVsc2UgewoJCQkJbmV3TnVtICs9IGM7CgkJCX0K CQl9CgkJcyA9IG5ld051bTsKCX0KCW51bSA9IHBhcnNlRmxvYXQoIHMucmVwbGFj ZSgvWywgXS9nLCAnJykucmVwbGFjZSgiXHUyMjEyIiwgJy0nKSApOwoJcmV0dXJu ICggaXNOYU4oIG51bSApID8gLUluZmluaXR5IDogbnVtICk7Cn0KCmZ1bmN0aW9u IHRzX2N1cnJlbmN5VG9Tb3J0S2V5KCBzICkgewoJcmV0dXJuIHRzX3BhcnNlRmxv YXQocy5yZXBsYWNlKC9bXi1cdTIyMTIwLTkuLF0vZywnJykpOwp9CgpmdW5jdGlv biB0c19zb3J0X2dlbmVyaWMoIGEsIGIgKSB7CglyZXR1cm4gYVsxXSA8IGJbMV0g PyAtMSA6IGFbMV0gPiBiWzFdID8gMSA6IGFbMl0gLSBiWzJdOwp9CgpmdW5jdGlv biB0c19hbHRlcm5hdGUoIHRhYmxlICkgewoJLy8gVGFrZSBvYmplY3QgdGFibGUg YW5kIGdldCBhbGwgaXQncyB0Ym9kaWVzLgoJdmFyIHRhYmxlQm9kaWVzID0gdGFi bGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICd0Ym9keScgKTsKCS8vIExvb3AgdGhy b3VnaCB0aGVzZSB0Ym9kaWVzCglmb3IgKCB2YXIgaSA9IDA7IGkgPCB0YWJsZUJv ZGllcy5sZW5ndGg7IGkrKyApIHsKCQkvLyBUYWtlIHRoZSB0Ym9keSwgYW5kIGdl dCBhbGwgaXQncyByb3dzCgkJdmFyIHRhYmxlUm93cyA9IHRhYmxlQm9kaWVzW2ld LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAndHInICk7CgkJLy8gTG9vcCB0aHJvdWdo IHRoZXNlIHJvd3MKCQkvLyBTdGFydCBhdCAxIGJlY2F1c2Ugd2Ugd2FudCB0byBs ZWF2ZSB0aGUgaGVhZGluZyByb3cgdW50b3VjaGVkCgkJZm9yICggdmFyIGogPSAw OyBqIDwgdGFibGVSb3dzLmxlbmd0aDsgaisrICkgewoJCQkvLyBDaGVjayBpZiBq IGlzIGV2ZW4sIGFuZCBhcHBseSBjbGFzc2VzIGZvciBib3RoIHBvc3NpYmxlIHJl c3VsdHMKCQkJdmFyIG9sZENsYXNzZXMgPSB0YWJsZVJvd3Nbal0uY2xhc3NOYW1l LnNwbGl0KCcgJyk7CgkJCXZhciBuZXdDbGFzc05hbWUgPSAnJzsKCQkJZm9yICgg dmFyIGsgPSAwOyBrIDwgb2xkQ2xhc3Nlcy5sZW5ndGg7IGsrKyApIHsKCQkJCWlm ICggb2xkQ2xhc3Nlc1trXSAhPSAnJyAmJiBvbGRDbGFzc2VzW2tdICE9ICdldmVu JyAmJiBvbGRDbGFzc2VzW2tdICE9ICdvZGQnICkgewoJCQkJCW5ld0NsYXNzTmFt ZSArPSBvbGRDbGFzc2VzW2tdICsgJyAnOwoJCQkJfQoJCQl9CgkJCXRhYmxlUm93 c1tqXS5jbGFzc05hbWUgPSBuZXdDbGFzc05hbWUgKyAoIGogJSAyID09IDAgPyAn ZXZlbicgOiAnb2RkJyApOwoJCX0KCX0KfQoKLyoKICogRW5kIG9mIHRhYmxlIHNv cnRpbmcgY29kZQogKi8KCgovKioKICogQWRkIGEgY3V0ZSBsaXR0bGUgYm94IGF0 IHRoZSB0b3Agb2YgdGhlIHNjcmVlbiB0byBpbmZvcm0gdGhlIHVzZXIgb2YKICog c29tZXRoaW5nLCByZXBsYWNpbmcgYW55IHByZWV4aXN0aW5nIG1lc3NhZ2UuCiAq CiAqIEBwYXJhbSBTdHJpbmcgLW9yLSBEb20gT2JqZWN0IG1lc3NhZ2UgSFRNTCB0 byBiZSBwdXQgaW5zaWRlIHRoZSByaWdodCBkaXYKICogQHBhcmFtIFN0cmluZyBj bGFzc05hbWUgICBVc2VkIGluIGFkZGluZyBhIGNsYXNzOyBzaG91bGQgYmUgZGlm ZmVyZW50IGZvciBlYWNoCiAqICAgY2FsbCB0byBhbGxvdyBDU1MvSlMgdG8gaGlk ZSBkaWZmZXJlbnQgYm94ZXMuICBudWxsID0gbm8gY2xhc3MgdXNlZC4KICogQHJl dHVybiBCb29sZWFuICAgICAgIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFp bHVyZQogKi8KZnVuY3Rpb24ganNNc2coIG1lc3NhZ2UsIGNsYXNzTmFtZSApIHsK CWlmICggIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkICkgewoJCXJldHVybiBmYWxz ZTsKCX0KCS8vIFdlIHNwZWNpYWwtY2FzZSBza2luIHN0cnVjdHVyZXMgcHJvdmlk ZWQgYnkgdGhlIHNvZnR3YXJlLiAgU2tpbnMgdGhhdAoJLy8gY2hvb3NlIHRvIGFi YW5kb24gb3Igc2lnbmlmaWNhbnRseSBtb2RpZnkgb3VyIGZvcm1hdHRpbmcgY2Fu IGp1c3QgZGVmaW5lCgkvLyBhbiBtdy1qcy1tZXNzYWdlIGRpdiB0byBzdGFydCB3 aXRoLgoJdmFyIG1lc3NhZ2VEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgg J213LWpzLW1lc3NhZ2UnICk7CglpZiAoICFtZXNzYWdlRGl2ICkgewoJCW1lc3Nh Z2VEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApOwoJCWlmICgg ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICdjb2x1bW4tY29udGVudCcgKQoJCSYm IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnY29udGVudCcgKSApIHsKCQkJLy8g TW9ub0Jvb2ssIHByZXN1bWFibHkKCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo ICdjb250ZW50JyApLmluc2VydEJlZm9yZSgKCQkJCW1lc3NhZ2VEaXYsCgkJCQlk b2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2NvbnRlbnQnICkuZmlyc3RDaGlsZAoJ CQkpOwoJCX0gZWxzZSBpZiAoIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnY29u dGVudCcgKQoJCSYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnYXJ0aWNsZScg KSApIHsKCQkJLy8gTm9uLU1vbm9ib29rIGJ1dCBzdGlsbCByZWNvZ25pemFibGUg KG9sZC1zdHlsZSkKCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICdhcnRpY2xl JykuaW5zZXJ0QmVmb3JlKAoJCQkJbWVzc2FnZURpdiwKCQkJCWRvY3VtZW50Lmdl dEVsZW1lbnRCeUlkKCAnYXJ0aWNsZScgKS5maXJzdENoaWxkCgkJCSk7CgkJfSBl bHNlIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCgltZXNzYWdlRGl2LnNldEF0 dHJpYnV0ZSggJ2lkJywgJ213LWpzLW1lc3NhZ2UnICk7CgltZXNzYWdlRGl2LnN0 eWxlLmRpc3BsYXkgPSAnYmxvY2snOwoJaWYoIGNsYXNzTmFtZSApIHsKCQltZXNz YWdlRGl2LnNldEF0dHJpYnV0ZSggJ2NsYXNzJywgJ213LWpzLW1lc3NhZ2UtJyAr IGNsYXNzTmFtZSApOwoJfQoKCWlmICggdHlwZW9mIG1lc3NhZ2UgPT09ICdvYmpl Y3QnICkgewoJCXdoaWxlICggbWVzc2FnZURpdi5oYXNDaGlsZE5vZGVzKCkgKSB7 IC8vIFJlbW92ZSBvbGQgY29udGVudAoJCQltZXNzYWdlRGl2LnJlbW92ZUNoaWxk KCBtZXNzYWdlRGl2LmZpcnN0Q2hpbGQgKTsKCQl9CgkJbWVzc2FnZURpdi5hcHBl bmRDaGlsZCggbWVzc2FnZSApOyAvLyBBcHBlbmQgbmV3IGNvbnRlbnQKCX0gZWxz ZSB7CgkJbWVzc2FnZURpdi5pbm5lckhUTUwgPSBtZXNzYWdlOwoJfQoJcmV0dXJu IHRydWU7Cn0KCi8qKgogKiBJbmplY3QgYSBjdXRlIGxpdHRsZSBwcm9ncmVzcyBz cGlubmVyIGFmdGVyIHRoZSBzcGVjaWZpZWQgZWxlbWVudAogKgogKiBAcGFyYW0g ZWxlbWVudCBFbGVtZW50IHRvIGluamVjdCBhZnRlcgogKiBAcGFyYW0gaWQgSWRl bnRpZmllciBzdHJpbmcgKGZvciB1c2Ugd2l0aCByZW1vdmVTcGlubmVyKCksIGJl bG93KQogKi8KZnVuY3Rpb24gaW5qZWN0U3Bpbm5lciggZWxlbWVudCwgaWQgKSB7 Cgl2YXIgc3Bpbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdpbWcnICk7 CglzcGlubmVyLmlkID0gJ213LXNwaW5uZXItJyArIGlkOwoJc3Bpbm5lci5zcmMg PSBzdHlsZXBhdGggKyAnL2NvbW1vbi9pbWFnZXMvc3Bpbm5lci5naWYnOwoJc3Bp bm5lci5hbHQgPSBzcGlubmVyLnRpdGxlID0gJy4uLic7CglpZiggZWxlbWVudC5u ZXh0U2libGluZyApIHsKCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3Jl KCBzcGlubmVyLCBlbGVtZW50Lm5leHRTaWJsaW5nICk7Cgl9IGVsc2UgewoJCWVs ZW1lbnQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCggc3Bpbm5lciApOwoJfQp9Cgov KioKICogUmVtb3ZlIGEgcHJvZ3Jlc3Mgc3Bpbm5lciBhZGRlZCB3aXRoIGluamVj dFNwaW5uZXIoKQogKgogKiBAcGFyYW0gaWQgSWRlbnRpZmllciBzdHJpbmcKICov CmZ1bmN0aW9uIHJlbW92ZVNwaW5uZXIoIGlkICkgewoJdmFyIHNwaW5uZXIgPSBk b2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ213LXNwaW5uZXItJyArIGlkICk7Cglp Ziggc3Bpbm5lciApIHsKCQlzcGlubmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQo IHNwaW5uZXIgKTsKCX0KfQoKZnVuY3Rpb24gcnVuT25sb2FkSG9vaygpIHsKCS8v IGRvbid0IHJ1biBhbnl0aGluZyBiZWxvdyB0aGlzIGZvciBub24tZG9tIGJyb3dz ZXJzCglpZiAoIGRvbmVPbmxvYWRIb29rIHx8ICEoIGRvY3VtZW50LmdldEVsZW1l bnRCeUlkICYmIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lICkgKSB7CgkJ cmV0dXJuOwoJfQoKCS8vIHNldCB0aGlzIGJlZm9yZSBydW5uaW5nIGFueSBob29r cywgc2luY2UgYW55IGVycm9ycyBiZWxvdwoJLy8gbWlnaHQgY2F1c2UgdGhlIGZ1 bmN0aW9uIHRvIHRlcm1pbmF0ZSBwcmVtYXR1cmVseQoJZG9uZU9ubG9hZEhvb2sg PSB0cnVlOwoKCXVwZGF0ZVRvb2x0aXBBY2Nlc3NLZXlzKCBudWxsICk7CglzZXR1 cENoZWNrYm94U2hpZnRDbGljaygpOwoJc29ydGFibGVzX2luaXQoKTsKCgkvLyBS dW4gYW55IGFkZGVkLW9uIGZ1bmN0aW9ucwoJZm9yICggdmFyIGkgPSAwOyBpIDwg b25sb2FkRnVuY3RzLmxlbmd0aDsgaSsrICkgewoJCW9ubG9hZEZ1bmN0c1tpXSgp OwoJfQp9CgovKioKICogQWRkIGFuIGV2ZW50IGhhbmRsZXIgdG8gYW4gZWxlbWVu dAogKgogKiBAcGFyYW0gRWxlbWVudCBlbGVtZW50IEVsZW1lbnQgdG8gYWRkIGhh bmRsZXIgdG8KICogQHBhcmFtIFN0cmluZyBhdHRhY2ggRXZlbnQgdG8gYXR0YWNo IHRvCiAqIEBwYXJhbSBjYWxsYWJsZSBoYW5kbGVyIEV2ZW50IGhhbmRsZXIgY2Fs bGJhY2sKICovCmZ1bmN0aW9uIGFkZEhhbmRsZXIoIGVsZW1lbnQsIGF0dGFjaCwg aGFuZGxlciApIHsKCWlmKCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciApIHsKCQll bGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIGF0dGFjaCwgaGFuZGxlciwgZmFsc2Ug KTsKCX0gZWxzZSBpZiggd2luZG93LmF0dGFjaEV2ZW50ICkgewoJCWVsZW1lbnQu YXR0YWNoRXZlbnQoICdvbicgKyBhdHRhY2gsIGhhbmRsZXIgKTsKCX0KfQoKLyoq CiAqIEFkZCBhIGNsaWNrIGV2ZW50IGhhbmRsZXIgdG8gYW4gZWxlbWVudAogKgog KiBAcGFyYW0gRWxlbWVudCBlbGVtZW50IEVsZW1lbnQgdG8gYWRkIGhhbmRsZXIg dG8KICogQHBhcmFtIGNhbGxhYmxlIGhhbmRsZXIgRXZlbnQgaGFuZGxlciBjYWxs YmFjawogKi8KZnVuY3Rpb24gYWRkQ2xpY2tIYW5kbGVyKCBlbGVtZW50LCBoYW5k bGVyICkgewoJYWRkSGFuZGxlciggZWxlbWVudCwgJ2NsaWNrJywgaGFuZGxlciAp Owp9CgovKioKICogUmVtb3ZlcyBhbiBldmVudCBoYW5kbGVyIGZyb20gYW4gZWxl bWVudAogKgogKiBAcGFyYW0gRWxlbWVudCBlbGVtZW50IEVsZW1lbnQgdG8gcmVt b3ZlIGhhbmRsZXIgZnJvbQogKiBAcGFyYW0gU3RyaW5nIHJlbW92ZSBFdmVudCB0 byByZW1vdmUKICogQHBhcmFtIGNhbGxhYmxlIGhhbmRsZXIgRXZlbnQgaGFuZGxl ciBjYWxsYmFjayB0byByZW1vdmUKICovCmZ1bmN0aW9uIHJlbW92ZUhhbmRsZXIo IGVsZW1lbnQsIHJlbW92ZSwgaGFuZGxlciApIHsKCWlmKCB3aW5kb3cucmVtb3Zl RXZlbnRMaXN0ZW5lciApIHsKCQllbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIo IHJlbW92ZSwgaGFuZGxlciwgZmFsc2UgKTsKCX0gZWxzZSBpZiggd2luZG93LmRl dGFjaEV2ZW50ICkgewoJCWVsZW1lbnQuZGV0YWNoRXZlbnQoICdvbicgKyByZW1v dmUsIGhhbmRsZXIgKTsKCX0KfQovLyBub3RlOiBhbGwgc2tpbnMgc2hvdWxkIGNh bGwgcnVuT25sb2FkSG9vaygpIGF0IHRoZSBlbmQgb2YgaHRtbCBvdXRwdXQsCi8v ICAgICAgc28gdGhlIGJlbG93IHNob3VsZCBiZSByZWR1bmRhbnQuIEl0J3MgdGhl cmUganVzdCBpbiBjYXNlLgpob29rRXZlbnQoICdsb2FkJywgcnVuT25sb2FkSG9v ayApOwoKaWYgKCBpZTZfYnVncyApIHsKCWltcG9ydFNjcmlwdFVSSSggc3R5bGVw YXRoICsgJy9jb21tb24vSUVGaXhlcy5qcycgKTsKfQoKLy8gRm9yIGZ1dHVyZSB1 c2UuCm13ID0ge307Cgo= ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=jquery.min.js Content-Type: application/x-javascript; name=jquery.min.js Content-Location: http://bits.wikimedia.org/skins-1.5/common/jquery.min.js?283-17 Content-Transfer-Encoding: Base64 CihmdW5jdGlvbih3aW5kb3csdW5kZWZpbmVkKXt2YXIgalF1ZXJ5PWZ1bmN0aW9u KHNlbGVjdG9yLGNvbnRleHQpe3JldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoc2Vs ZWN0b3IsY29udGV4dCk7fSxfalF1ZXJ5PXdpbmRvdy5qUXVlcnksXyQ9d2luZG93 LiQsZG9jdW1lbnQ9d2luZG93LmRvY3VtZW50LHJvb3RqUXVlcnkscXVpY2tFeHBy PS9eW148XSooPFtcd1xXXSs+KVtePl0qJHxeIyhbXHctXSspJC8saXNTaW1wbGU9 L14uW146I1xbXC4sXSokLyxybm90d2hpdGU9L1xTLyxydHJpbT0vXihcc3xcdTAw QTApK3woXHN8XHUwMEEwKSskL2cscnNpbmdsZVRhZz0vXjwoXHcrKVxzKlwvPz4o Pzo8XC9cMT4pPyQvLHVzZXJBZ2VudD1uYXZpZ2F0b3IudXNlckFnZW50LGJyb3dz ZXJNYXRjaCxyZWFkeUJvdW5kPWZhbHNlLHJlYWR5TGlzdD1bXSxET01Db250ZW50 TG9hZGVkLHRvU3RyaW5nPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsaGFzT3du UHJvcGVydHk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxwdXNoPUFy cmF5LnByb3RvdHlwZS5wdXNoLHNsaWNlPUFycmF5LnByb3RvdHlwZS5zbGljZSxp bmRleE9mPUFycmF5LnByb3RvdHlwZS5pbmRleE9mO2pRdWVyeS5mbj1qUXVlcnku cHJvdG90eXBlPXtpbml0OmZ1bmN0aW9uKHNlbGVjdG9yLGNvbnRleHQpe3ZhciBt YXRjaCxlbGVtLHJldCxkb2M7aWYoIXNlbGVjdG9yKXtyZXR1cm4gdGhpczt9Cmlm KHNlbGVjdG9yLm5vZGVUeXBlKXt0aGlzLmNvbnRleHQ9dGhpc1swXT1zZWxlY3Rv cjt0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzO30KaWYoc2VsZWN0b3I9PT0iYm9k eSImJiFjb250ZXh0KXt0aGlzLmNvbnRleHQ9ZG9jdW1lbnQ7dGhpc1swXT1kb2N1 bWVudC5ib2R5O3RoaXMuc2VsZWN0b3I9ImJvZHkiO3RoaXMubGVuZ3RoPTE7cmV0 dXJuIHRoaXM7fQppZih0eXBlb2Ygc2VsZWN0b3I9PT0ic3RyaW5nIil7bWF0Y2g9 cXVpY2tFeHByLmV4ZWMoc2VsZWN0b3IpO2lmKG1hdGNoJiYobWF0Y2hbMV18fCFj b250ZXh0KSl7aWYobWF0Y2hbMV0pe2RvYz0oY29udGV4dD9jb250ZXh0Lm93bmVy RG9jdW1lbnR8fGNvbnRleHQ6ZG9jdW1lbnQpO3JldD1yc2luZ2xlVGFnLmV4ZWMo c2VsZWN0b3IpO2lmKHJldCl7aWYoalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29udGV4 dCkpe3NlbGVjdG9yPVtkb2N1bWVudC5jcmVhdGVFbGVtZW50KHJldFsxXSldO2pR dWVyeS5mbi5hdHRyLmNhbGwoc2VsZWN0b3IsY29udGV4dCx0cnVlKTt9ZWxzZXtz ZWxlY3Rvcj1bZG9jLmNyZWF0ZUVsZW1lbnQocmV0WzFdKV07fX1lbHNle3JldD1i dWlsZEZyYWdtZW50KFttYXRjaFsxXV0sW2RvY10pO3NlbGVjdG9yPShyZXQuY2Fj aGVhYmxlP3JldC5mcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSk6cmV0LmZyYWdtZW50 KS5jaGlsZE5vZGVzO30KcmV0dXJuIGpRdWVyeS5tZXJnZSh0aGlzLHNlbGVjdG9y KTt9ZWxzZXtlbGVtPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1hdGNoWzJdKTtp ZihlbGVtKXtpZihlbGVtLmlkIT09bWF0Y2hbMl0pe3JldHVybiByb290alF1ZXJ5 LmZpbmQoc2VsZWN0b3IpO30KdGhpcy5sZW5ndGg9MTt0aGlzWzBdPWVsZW07fQp0 aGlzLmNvbnRleHQ9ZG9jdW1lbnQ7dGhpcy5zZWxlY3Rvcj1zZWxlY3RvcjtyZXR1 cm4gdGhpczt9fWVsc2UgaWYoIWNvbnRleHQmJi9eXHcrJC8udGVzdChzZWxlY3Rv cikpe3RoaXMuc2VsZWN0b3I9c2VsZWN0b3I7dGhpcy5jb250ZXh0PWRvY3VtZW50 O3NlbGVjdG9yPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHNlbGVjdG9y KTtyZXR1cm4galF1ZXJ5Lm1lcmdlKHRoaXMsc2VsZWN0b3IpO31lbHNlIGlmKCFj b250ZXh0fHxjb250ZXh0LmpxdWVyeSl7cmV0dXJuKGNvbnRleHR8fHJvb3RqUXVl cnkpLmZpbmQoc2VsZWN0b3IpO31lbHNle3JldHVybiBqUXVlcnkoY29udGV4dCku ZmluZChzZWxlY3Rvcik7fX1lbHNlIGlmKGpRdWVyeS5pc0Z1bmN0aW9uKHNlbGVj dG9yKSl7cmV0dXJuIHJvb3RqUXVlcnkucmVhZHkoc2VsZWN0b3IpO30KaWYoc2Vs ZWN0b3Iuc2VsZWN0b3IhPT11bmRlZmluZWQpe3RoaXMuc2VsZWN0b3I9c2VsZWN0 b3Iuc2VsZWN0b3I7dGhpcy5jb250ZXh0PXNlbGVjdG9yLmNvbnRleHQ7fQpyZXR1 cm4galF1ZXJ5Lm1ha2VBcnJheShzZWxlY3Rvcix0aGlzKTt9LHNlbGVjdG9yOiIi LGpxdWVyeToiMS40LjIiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4g dGhpcy5sZW5ndGg7fSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHNsaWNlLmNh bGwodGhpcywwKTt9LGdldDpmdW5jdGlvbihudW0pe3JldHVybiBudW09PW51bGw/ dGhpcy50b0FycmF5KCk6KG51bTwwP3RoaXMuc2xpY2UobnVtKVswXTp0aGlzW251 bV0pO30scHVzaFN0YWNrOmZ1bmN0aW9uKGVsZW1zLG5hbWUsc2VsZWN0b3Ipe3Zh ciByZXQ9alF1ZXJ5KCk7aWYoalF1ZXJ5LmlzQXJyYXkoZWxlbXMpKXtwdXNoLmFw cGx5KHJldCxlbGVtcyk7fWVsc2V7alF1ZXJ5Lm1lcmdlKHJldCxlbGVtcyk7fQpy ZXQucHJldk9iamVjdD10aGlzO3JldC5jb250ZXh0PXRoaXMuY29udGV4dDtpZihu YW1lPT09ImZpbmQiKXtyZXQuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5z ZWxlY3Rvcj8iICI6IiIpK3NlbGVjdG9yO31lbHNlIGlmKG5hbWUpe3JldC5zZWxl Y3Rvcj10aGlzLnNlbGVjdG9yKyIuIituYW1lKyIoIitzZWxlY3RvcisiKSI7fQpy ZXR1cm4gcmV0O30sZWFjaDpmdW5jdGlvbihjYWxsYmFjayxhcmdzKXtyZXR1cm4g alF1ZXJ5LmVhY2godGhpcyxjYWxsYmFjayxhcmdzKTt9LHJlYWR5OmZ1bmN0aW9u KGZuKXtqUXVlcnkuYmluZFJlYWR5KCk7aWYoalF1ZXJ5LmlzUmVhZHkpe2ZuLmNh bGwoZG9jdW1lbnQsalF1ZXJ5KTt9ZWxzZSBpZihyZWFkeUxpc3Qpe3JlYWR5TGlz dC5wdXNoKGZuKTt9CnJldHVybiB0aGlzO30sZXE6ZnVuY3Rpb24oaSl7cmV0dXJu IGk9PT0tMT90aGlzLnNsaWNlKGkpOnRoaXMuc2xpY2UoaSwraSsxKTt9LGZpcnN0 OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCk7fSxsYXN0OmZ1bmN0aW9uKCl7 cmV0dXJuIHRoaXMuZXEoLTEpO30sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp cy5wdXNoU3RhY2soc2xpY2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLCJzbGljZSIs c2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSk7fSxtYXA6ZnVuY3Rpb24o Y2FsbGJhY2spe3JldHVybiB0aGlzLnB1c2hTdGFjayhqUXVlcnkubWFwKHRoaXMs ZnVuY3Rpb24oZWxlbSxpKXtyZXR1cm4gY2FsbGJhY2suY2FsbChlbGVtLGksZWxl bSk7fSkpO30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8 alF1ZXJ5KG51bGwpO30scHVzaDpwdXNoLHNvcnQ6W10uc29ydCxzcGxpY2U6W10u c3BsaWNlfTtqUXVlcnkuZm4uaW5pdC5wcm90b3R5cGU9alF1ZXJ5LmZuO2pRdWVy eS5leHRlbmQ9alF1ZXJ5LmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciB0YXJnZXQ9 YXJndW1lbnRzWzBdfHx7fSxpPTEsbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGgsZGVl cD1mYWxzZSxvcHRpb25zLG5hbWUsc3JjLGNvcHk7aWYodHlwZW9mIHRhcmdldD09 PSJib29sZWFuIil7ZGVlcD10YXJnZXQ7dGFyZ2V0PWFyZ3VtZW50c1sxXXx8e307 aT0yO30KaWYodHlwZW9mIHRhcmdldCE9PSJvYmplY3QiJiYhalF1ZXJ5LmlzRnVu Y3Rpb24odGFyZ2V0KSl7dGFyZ2V0PXt9O30KaWYobGVuZ3RoPT09aSl7dGFyZ2V0 PXRoaXM7LS1pO30KZm9yKDtpPGxlbmd0aDtpKyspe2lmKChvcHRpb25zPWFyZ3Vt ZW50c1tpXSkhPW51bGwpe2ZvcihuYW1lIGluIG9wdGlvbnMpe3NyYz10YXJnZXRb bmFtZV07Y29weT1vcHRpb25zW25hbWVdO2lmKHRhcmdldD09PWNvcHkpe2NvbnRp bnVlO30KaWYoZGVlcCYmY29weSYmKGpRdWVyeS5pc1BsYWluT2JqZWN0KGNvcHkp fHxqUXVlcnkuaXNBcnJheShjb3B5KSkpe3ZhciBjbG9uZT1zcmMmJihqUXVlcnku aXNQbGFpbk9iamVjdChzcmMpfHxqUXVlcnkuaXNBcnJheShzcmMpKT9zcmM6alF1 ZXJ5LmlzQXJyYXkoY29weSk/W106e307dGFyZ2V0W25hbWVdPWpRdWVyeS5leHRl bmQoZGVlcCxjbG9uZSxjb3B5KTt9ZWxzZSBpZihjb3B5IT09dW5kZWZpbmVkKXt0 YXJnZXRbbmFtZV09Y29weTt9fX19CnJldHVybiB0YXJnZXQ7fTtqUXVlcnkuZXh0 ZW5kKHtub0NvbmZsaWN0OmZ1bmN0aW9uKGRlZXApe3dpbmRvdy4kPV8kO2lmKGRl ZXApe3dpbmRvdy5qUXVlcnk9X2pRdWVyeTt9CnJldHVybiBqUXVlcnk7fSxpc1Jl YWR5OmZhbHNlLHJlYWR5OmZ1bmN0aW9uKCl7aWYoIWpRdWVyeS5pc1JlYWR5KXtp ZighZG9jdW1lbnQuYm9keSl7cmV0dXJuIHNldFRpbWVvdXQoalF1ZXJ5LnJlYWR5 LDEzKTt9CmpRdWVyeS5pc1JlYWR5PXRydWU7aWYocmVhZHlMaXN0KXt2YXIgZm4s aT0wO3doaWxlKChmbj1yZWFkeUxpc3RbaSsrXSkpe2ZuLmNhbGwoZG9jdW1lbnQs alF1ZXJ5KTt9CnJlYWR5TGlzdD1udWxsO30KaWYoalF1ZXJ5LmZuLnRyaWdnZXJI YW5kbGVyKXtqUXVlcnkoZG9jdW1lbnQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIp O319fSxiaW5kUmVhZHk6ZnVuY3Rpb24oKXtpZihyZWFkeUJvdW5kKXtyZXR1cm47 fQpyZWFkeUJvdW5kPXRydWU7aWYoZG9jdW1lbnQucmVhZHlTdGF0ZT09PSJjb21w bGV0ZSIpe3JldHVybiBqUXVlcnkucmVhZHkoKTt9CmlmKGRvY3VtZW50LmFkZEV2 ZW50TGlzdGVuZXIpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRl bnRMb2FkZWQiLERPTUNvbnRlbnRMb2FkZWQsZmFsc2UpO3dpbmRvdy5hZGRFdmVu dExpc3RlbmVyKCJsb2FkIixqUXVlcnkucmVhZHksZmFsc2UpO31lbHNlIGlmKGRv Y3VtZW50LmF0dGFjaEV2ZW50KXtkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFk eXN0YXRlY2hhbmdlIixET01Db250ZW50TG9hZGVkKTt3aW5kb3cuYXR0YWNoRXZl bnQoIm9ubG9hZCIsalF1ZXJ5LnJlYWR5KTt2YXIgdG9wbGV2ZWw9ZmFsc2U7dHJ5 e3RvcGxldmVsPXdpbmRvdy5mcmFtZUVsZW1lbnQ9PW51bGw7fWNhdGNoKGUpe30K aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsJiZ0b3BsZXZlbCl7 ZG9TY3JvbGxDaGVjaygpO319fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKG9iail7cmV0 dXJuIHRvU3RyaW5nLmNhbGwob2JqKT09PSJbb2JqZWN0IEZ1bmN0aW9uXSI7fSxp c0FycmF5OmZ1bmN0aW9uKG9iail7cmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKT09 PSJbb2JqZWN0IEFycmF5XSI7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKG9iail7 aWYoIW9ianx8dG9TdHJpbmcuY2FsbChvYmopIT09IltvYmplY3QgT2JqZWN0XSJ8 fG9iai5ub2RlVHlwZXx8b2JqLnNldEludGVydmFsKXtyZXR1cm4gZmFsc2U7fQpp ZihvYmouY29uc3RydWN0b3ImJiFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwiY29u c3RydWN0b3IiKSYmIWhhc093blByb3BlcnR5LmNhbGwob2JqLmNvbnN0cnVjdG9y LnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXtyZXR1cm4gZmFsc2U7fQp2YXIg a2V5O2ZvcihrZXkgaW4gb2JqKXt9CnJldHVybiBrZXk9PT11bmRlZmluZWR8fGhh c093blByb3BlcnR5LmNhbGwob2JqLGtleSk7fSxpc0VtcHR5T2JqZWN0OmZ1bmN0 aW9uKG9iail7Zm9yKHZhciBuYW1lIGluIG9iail7cmV0dXJuIGZhbHNlO30KcmV0 dXJuIHRydWU7fSxlcnJvcjpmdW5jdGlvbihtc2cpe3Rocm93IG1zZzt9LHBhcnNl SlNPTjpmdW5jdGlvbihkYXRhKXtpZih0eXBlb2YgZGF0YSE9PSJzdHJpbmcifHwh ZGF0YSl7cmV0dXJuIG51bGw7fQpkYXRhPWpRdWVyeS50cmltKGRhdGEpO2lmKC9e W1xdLDp7fVxzXSokLy50ZXN0KGRhdGEucmVwbGFjZSgvXFwoPzpbIlxcXC9iZm5y dF18dVswLTlhLWZBLUZdezR9KS9nLCJAIikucmVwbGFjZSgvIlteIlxcXG5ccl0q Inx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xk Kyk/L2csIl0iKS5yZXBsYWNlKC8oPzpefDp8LCkoPzpccypcWykrL2csIiIpKSl7 cmV0dXJuIHdpbmRvdy5KU09OJiZ3aW5kb3cuSlNPTi5wYXJzZT93aW5kb3cuSlNP Ti5wYXJzZShkYXRhKToobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitkYXRhKSkoKTt9 ZWxzZXtqUXVlcnkuZXJyb3IoIkludmFsaWQgSlNPTjogIitkYXRhKTt9fSxub29w OmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGRhdGEpe2lmKGRhdGEm JnJub3R3aGl0ZS50ZXN0KGRhdGEpKXt2YXIgaGVhZD1kb2N1bWVudC5nZXRFbGVt ZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxkb2N1bWVudC5kb2N1bWVudEVsZW1l bnQsc2NyaXB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3Njcmlw dC50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2lmKGpRdWVyeS5zdXBwb3J0LnNjcmlw dEV2YWwpe3NjcmlwdC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9k ZShkYXRhKSk7fWVsc2V7c2NyaXB0LnRleHQ9ZGF0YTt9CmhlYWQuaW5zZXJ0QmVm b3JlKHNjcmlwdCxoZWFkLmZpcnN0Q2hpbGQpO2hlYWQucmVtb3ZlQ2hpbGQoc2Ny aXB0KTt9fSxub2RlTmFtZTpmdW5jdGlvbihlbGVtLG5hbWUpe3JldHVybiBlbGVt Lm5vZGVOYW1lJiZlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1uYW1lLnRv VXBwZXJDYXNlKCk7fSxlYWNoOmZ1bmN0aW9uKG9iamVjdCxjYWxsYmFjayxhcmdz KXt2YXIgbmFtZSxpPTAsbGVuZ3RoPW9iamVjdC5sZW5ndGgsaXNPYmo9bGVuZ3Ro PT09dW5kZWZpbmVkfHxqUXVlcnkuaXNGdW5jdGlvbihvYmplY3QpO2lmKGFyZ3Mp e2lmKGlzT2JqKXtmb3IobmFtZSBpbiBvYmplY3Qpe2lmKGNhbGxiYWNrLmFwcGx5 KG9iamVjdFtuYW1lXSxhcmdzKT09PWZhbHNlKXticmVhazt9fX1lbHNle2Zvcig7 aTxsZW5ndGg7KXtpZihjYWxsYmFjay5hcHBseShvYmplY3RbaSsrXSxhcmdzKT09 PWZhbHNlKXticmVhazt9fX19ZWxzZXtpZihpc09iail7Zm9yKG5hbWUgaW4gb2Jq ZWN0KXtpZihjYWxsYmFjay5jYWxsKG9iamVjdFtuYW1lXSxuYW1lLG9iamVjdFtu YW1lXSk9PT1mYWxzZSl7YnJlYWs7fX19ZWxzZXtmb3IodmFyIHZhbHVlPW9iamVj dFswXTtpPGxlbmd0aCYmY2FsbGJhY2suY2FsbCh2YWx1ZSxpLHZhbHVlKSE9PWZh bHNlO3ZhbHVlPW9iamVjdFsrK2ldKXt9fX0KcmV0dXJuIG9iamVjdDt9LHRyaW06 ZnVuY3Rpb24odGV4dCl7cmV0dXJuKHRleHR8fCIiKS5yZXBsYWNlKHJ0cmltLCIi KTt9LG1ha2VBcnJheTpmdW5jdGlvbihhcnJheSxyZXN1bHRzKXt2YXIgcmV0PXJl c3VsdHN8fFtdO2lmKGFycmF5IT1udWxsKXtpZihhcnJheS5sZW5ndGg9PW51bGx8 fHR5cGVvZiBhcnJheT09PSJzdHJpbmcifHxqUXVlcnkuaXNGdW5jdGlvbihhcnJh eSl8fCh0eXBlb2YgYXJyYXkhPT0iZnVuY3Rpb24iJiZhcnJheS5zZXRJbnRlcnZh bCkpe3B1c2guY2FsbChyZXQsYXJyYXkpO31lbHNle2pRdWVyeS5tZXJnZShyZXQs YXJyYXkpO319CnJldHVybiByZXQ7fSxpbkFycmF5OmZ1bmN0aW9uKGVsZW0sYXJy YXkpe2lmKGFycmF5LmluZGV4T2Ype3JldHVybiBhcnJheS5pbmRleE9mKGVsZW0p O30KZm9yKHZhciBpPTAsbGVuZ3RoPWFycmF5Lmxlbmd0aDtpPGxlbmd0aDtpKysp e2lmKGFycmF5W2ldPT09ZWxlbSl7cmV0dXJuIGk7fX0KcmV0dXJuLTE7fSxtZXJn ZTpmdW5jdGlvbihmaXJzdCxzZWNvbmQpe3ZhciBpPWZpcnN0Lmxlbmd0aCxqPTA7 aWYodHlwZW9mIHNlY29uZC5sZW5ndGg9PT0ibnVtYmVyIil7Zm9yKHZhciBsPXNl Y29uZC5sZW5ndGg7ajxsO2orKyl7Zmlyc3RbaSsrXT1zZWNvbmRbal07fX1lbHNl e3doaWxlKHNlY29uZFtqXSE9PXVuZGVmaW5lZCl7Zmlyc3RbaSsrXT1zZWNvbmRb aisrXTt9fQpmaXJzdC5sZW5ndGg9aTtyZXR1cm4gZmlyc3Q7fSxncmVwOmZ1bmN0 aW9uKGVsZW1zLGNhbGxiYWNrLGludil7dmFyIHJldD1bXTtmb3IodmFyIGk9MCxs ZW5ndGg9ZWxlbXMubGVuZ3RoO2k8bGVuZ3RoO2krKyl7aWYoIWludiE9PSFjYWxs YmFjayhlbGVtc1tpXSxpKSl7cmV0LnB1c2goZWxlbXNbaV0pO319CnJldHVybiBy ZXQ7fSxtYXA6ZnVuY3Rpb24oZWxlbXMsY2FsbGJhY2ssYXJnKXt2YXIgcmV0PVtd LHZhbHVlO2Zvcih2YXIgaT0wLGxlbmd0aD1lbGVtcy5sZW5ndGg7aTxsZW5ndGg7 aSsrKXt2YWx1ZT1jYWxsYmFjayhlbGVtc1tpXSxpLGFyZyk7aWYodmFsdWUhPW51 bGwpe3JldFtyZXQubGVuZ3RoXT12YWx1ZTt9fQpyZXR1cm4gcmV0LmNvbmNhdC5h cHBseShbXSxyZXQpO30sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGZuLHByb3h5LHRo aXNPYmplY3Qpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yKXtpZih0eXBlb2YgcHJv eHk9PT0ic3RyaW5nIil7dGhpc09iamVjdD1mbjtmbj10aGlzT2JqZWN0W3Byb3h5 XTtwcm94eT11bmRlZmluZWQ7fWVsc2UgaWYocHJveHkmJiFqUXVlcnkuaXNGdW5j dGlvbihwcm94eSkpe3RoaXNPYmplY3Q9cHJveHk7cHJveHk9dW5kZWZpbmVkO319 CmlmKCFwcm94eSYmZm4pe3Byb3h5PWZ1bmN0aW9uKCl7cmV0dXJuIGZuLmFwcGx5 KHRoaXNPYmplY3R8fHRoaXMsYXJndW1lbnRzKTt9O30KaWYoZm4pe3Byb3h5Lmd1 aWQ9Zm4uZ3VpZD1mbi5ndWlkfHxwcm94eS5ndWlkfHxqUXVlcnkuZ3VpZCsrO30K cmV0dXJuIHByb3h5O30sdWFNYXRjaDpmdW5jdGlvbih1YSl7dWE9dWEudG9Mb3dl ckNhc2UoKTt2YXIgbWF0Y2g9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8uZXhlYyh1 YSl8fC8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLy5leGVjKHVh KXx8Lyhtc2llKSAoW1x3Ll0rKS8uZXhlYyh1YSl8fCEvY29tcGF0aWJsZS8udGVz dCh1YSkmJi8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8uZXhlYyh1YSl8 fFtdO3JldHVybnticm93c2VyOm1hdGNoWzFdfHwiIix2ZXJzaW9uOm1hdGNoWzJd fHwiMCJ9O30sYnJvd3Nlcjp7fX0pO2Jyb3dzZXJNYXRjaD1qUXVlcnkudWFNYXRj aCh1c2VyQWdlbnQpO2lmKGJyb3dzZXJNYXRjaC5icm93c2VyKXtqUXVlcnkuYnJv d3Nlclticm93c2VyTWF0Y2guYnJvd3Nlcl09dHJ1ZTtqUXVlcnkuYnJvd3Nlci52 ZXJzaW9uPWJyb3dzZXJNYXRjaC52ZXJzaW9uO30KaWYoalF1ZXJ5LmJyb3dzZXIu d2Via2l0KXtqUXVlcnkuYnJvd3Nlci5zYWZhcmk9dHJ1ZTt9CmlmKGluZGV4T2Yp e2pRdWVyeS5pbkFycmF5PWZ1bmN0aW9uKGVsZW0sYXJyYXkpe3JldHVybiBpbmRl eE9mLmNhbGwoYXJyYXksZWxlbSk7fTt9CnJvb3RqUXVlcnk9alF1ZXJ5KGRvY3Vt ZW50KTtpZihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKXtET01Db250ZW50TG9h ZGVkPWZ1bmN0aW9uKCl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9N Q29udGVudExvYWRlZCIsRE9NQ29udGVudExvYWRlZCxmYWxzZSk7alF1ZXJ5LnJl YWR5KCk7fTt9ZWxzZSBpZihkb2N1bWVudC5hdHRhY2hFdmVudCl7RE9NQ29udGVu dExvYWRlZD1mdW5jdGlvbigpe2lmKGRvY3VtZW50LnJlYWR5U3RhdGU9PT0iY29t cGxldGUiKXtkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdl IixET01Db250ZW50TG9hZGVkKTtqUXVlcnkucmVhZHkoKTt9fTt9CmZ1bmN0aW9u IGRvU2Nyb2xsQ2hlY2soKXtpZihqUXVlcnkuaXNSZWFkeSl7cmV0dXJuO30KdHJ5 e2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpO31jYXRj aChlcnJvcil7c2V0VGltZW91dChkb1Njcm9sbENoZWNrLDEpO3JldHVybjt9CmpR dWVyeS5yZWFkeSgpO30KZnVuY3Rpb24gZXZhbFNjcmlwdChpLGVsZW0pe2lmKGVs ZW0uc3JjKXtqUXVlcnkuYWpheCh7dXJsOmVsZW0uc3JjLGFzeW5jOmZhbHNlLGRh dGFUeXBlOiJzY3JpcHQifSk7fWVsc2V7alF1ZXJ5Lmdsb2JhbEV2YWwoZWxlbS50 ZXh0fHxlbGVtLnRleHRDb250ZW50fHxlbGVtLmlubmVySFRNTHx8IiIpO30KaWYo ZWxlbS5wYXJlbnROb2RlKXtlbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxl bSk7fX0KZnVuY3Rpb24gYWNjZXNzKGVsZW1zLGtleSx2YWx1ZSxleGVjLGZuLHBh c3Mpe3ZhciBsZW5ndGg9ZWxlbXMubGVuZ3RoO2lmKHR5cGVvZiBrZXk9PT0ib2Jq ZWN0Iil7Zm9yKHZhciBrIGluIGtleSl7YWNjZXNzKGVsZW1zLGssa2V5W2tdLGV4 ZWMsZm4sdmFsdWUpO30KcmV0dXJuIGVsZW1zO30KaWYodmFsdWUhPT11bmRlZmlu ZWQpe2V4ZWM9IXBhc3MmJmV4ZWMmJmpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKTtm b3IodmFyIGk9MDtpPGxlbmd0aDtpKyspe2ZuKGVsZW1zW2ldLGtleSxleGVjP3Zh bHVlLmNhbGwoZWxlbXNbaV0saSxmbihlbGVtc1tpXSxrZXkpKTp2YWx1ZSxwYXNz KTt9CnJldHVybiBlbGVtczt9CnJldHVybiBsZW5ndGg/Zm4oZWxlbXNbMF0sa2V5 KTp1bmRlZmluZWQ7fQpmdW5jdGlvbiBub3coKXtyZXR1cm4obmV3IERhdGUpLmdl dFRpbWUoKTt9CihmdW5jdGlvbigpe2pRdWVyeS5zdXBwb3J0PXt9O3ZhciByb290 PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxzY3JpcHQ9ZG9jdW1lbnQuY3JlYXRl RWxlbWVudCgic2NyaXB0IiksZGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRp diIpLGlkPSJzY3JpcHQiK25vdygpO2Rpdi5zdHlsZS5kaXNwbGF5PSJub25lIjtk aXYuaW5uZXJIVE1MPSIgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0n L2EnIHN0eWxlPSdjb2xvcjpyZWQ7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41NTsnPmE8 L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+Ijt2YXIgYWxsPWRpdi5nZXRFbGVt ZW50c0J5VGFnTmFtZSgiKiIpLGE9ZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJh IilbMF07aWYoIWFsbHx8IWFsbC5sZW5ndGh8fCFhKXtyZXR1cm47fQpqUXVlcnku c3VwcG9ydD17bGVhZGluZ1doaXRlc3BhY2U6ZGl2LmZpcnN0Q2hpbGQubm9kZVR5 cGU9PT0zLHRib2R5OiFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5Iiku bGVuZ3RoLGh0bWxTZXJpYWxpemU6ISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUo ImxpbmsiKS5sZW5ndGgsc3R5bGU6L3JlZC8udGVzdChhLmdldEF0dHJpYnV0ZSgi c3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6YS5nZXRBdHRyaWJ1dGUoImhyZWYiKT09 PSIvYSIsb3BhY2l0eTovXjAuNTUkLy50ZXN0KGEuc3R5bGUub3BhY2l0eSksY3Nz RmxvYXQ6ISFhLnN0eWxlLmNzc0Zsb2F0LGNoZWNrT246ZGl2LmdldEVsZW1lbnRz QnlUYWdOYW1lKCJpbnB1dCIpWzBdLnZhbHVlPT09Im9uIixvcHRTZWxlY3RlZDpk b2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChkb2N1 bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSkuc2VsZWN0ZWQscGFyZW50Tm9k ZTpkaXYucmVtb3ZlQ2hpbGQoZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0 ZUVsZW1lbnQoImRpdiIpKSkucGFyZW50Tm9kZT09PW51bGwsZGVsZXRlRXhwYW5k bzp0cnVlLGNoZWNrQ2xvbmU6ZmFsc2Usc2NyaXB0RXZhbDpmYWxzZSxub0Nsb25l RXZlbnQ6dHJ1ZSxib3hNb2RlbDpudWxsfTtzY3JpcHQudHlwZT0idGV4dC9qYXZh c2NyaXB0Ijt0cnl7c2NyaXB0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRl eHROb2RlKCJ3aW5kb3cuIitpZCsiPTE7IikpO31jYXRjaChlKXt9CnJvb3QuaW5z ZXJ0QmVmb3JlKHNjcmlwdCxyb290LmZpcnN0Q2hpbGQpO2lmKHdpbmRvd1tpZF0p e2pRdWVyeS5zdXBwb3J0LnNjcmlwdEV2YWw9dHJ1ZTtkZWxldGUgd2luZG93W2lk XTt9CnRyeXtkZWxldGUgc2NyaXB0LnRlc3Q7fWNhdGNoKGUpe2pRdWVyeS5zdXBw b3J0LmRlbGV0ZUV4cGFuZG89ZmFsc2U7fQpyb290LnJlbW92ZUNoaWxkKHNjcmlw dCk7aWYoZGl2LmF0dGFjaEV2ZW50JiZkaXYuZmlyZUV2ZW50KXtkaXYuYXR0YWNo RXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uIGNsaWNrKCl7alF1ZXJ5LnN1cHBvcnQu bm9DbG9uZUV2ZW50PWZhbHNlO2Rpdi5kZXRhY2hFdmVudCgib25jbGljayIsY2xp Y2spO30pO2Rpdi5jbG9uZU5vZGUodHJ1ZSkuZmlyZUV2ZW50KCJvbmNsaWNrIik7 fQpkaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZGl2LmlubmVySFRN TD0iPGlucHV0IHR5cGU9J3JhZGlvJyBuYW1lPSdyYWRpb3Rlc3QnIGNoZWNrZWQ9 J2NoZWNrZWQnLz4iO3ZhciBmcmFnbWVudD1kb2N1bWVudC5jcmVhdGVEb2N1bWVu dEZyYWdtZW50KCk7ZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZGl2LmZpcnN0Q2hpbGQp O2pRdWVyeS5zdXBwb3J0LmNoZWNrQ2xvbmU9ZnJhZ21lbnQuY2xvbmVOb2RlKHRy dWUpLmNsb25lTm9kZSh0cnVlKS5sYXN0Q2hpbGQuY2hlY2tlZDtqUXVlcnkoZnVu Y3Rpb24oKXt2YXIgZGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Rp di5zdHlsZS53aWR0aD1kaXYuc3R5bGUucGFkZGluZ0xlZnQ9IjFweCI7ZG9jdW1l bnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO2pRdWVyeS5ib3hNb2RlbD1qUXVlcnku c3VwcG9ydC5ib3hNb2RlbD1kaXYub2Zmc2V0V2lkdGg9PT0yO2RvY3VtZW50LmJv ZHkucmVtb3ZlQ2hpbGQoZGl2KS5zdHlsZS5kaXNwbGF5PSdub25lJztkaXY9bnVs bDt9KTt2YXIgZXZlbnRTdXBwb3J0ZWQ9ZnVuY3Rpb24oZXZlbnROYW1lKXt2YXIg ZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZXZlbnROYW1lPSJvbiIr ZXZlbnROYW1lO3ZhciBpc1N1cHBvcnRlZD0oZXZlbnROYW1lIGluIGVsKTtpZigh aXNTdXBwb3J0ZWQpe2VsLnNldEF0dHJpYnV0ZShldmVudE5hbWUsInJldHVybjsi KTtpc1N1cHBvcnRlZD10eXBlb2YgZWxbZXZlbnROYW1lXT09PSJmdW5jdGlvbiI7 fQplbD1udWxsO3JldHVybiBpc1N1cHBvcnRlZDt9O2pRdWVyeS5zdXBwb3J0LnN1 Ym1pdEJ1YmJsZXM9ZXZlbnRTdXBwb3J0ZWQoInN1Ym1pdCIpO2pRdWVyeS5zdXBw b3J0LmNoYW5nZUJ1YmJsZXM9ZXZlbnRTdXBwb3J0ZWQoImNoYW5nZSIpO3Jvb3Q9 c2NyaXB0PWRpdj1hbGw9YT1udWxsO30pKCk7alF1ZXJ5LnByb3BzPXsiZm9yIjoi aHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIixyZWFkb25seToicmVhZE9ubHki LG1heGxlbmd0aDoibWF4TGVuZ3RoIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmci LHJvd3NwYW46InJvd1NwYW4iLGNvbHNwYW46ImNvbFNwYW4iLHRhYmluZGV4OiJ0 YWJJbmRleCIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRl ciJ9O3ZhciBleHBhbmRvPSJqUXVlcnkiK25vdygpLHV1aWQ9MCx3aW5kb3dEYXRh PXt9O2pRdWVyeS5leHRlbmQoe2NhY2hlOnt9LGV4cGFuZG86ZXhwYW5kbyxub0Rh dGE6eyJlbWJlZCI6dHJ1ZSwib2JqZWN0Ijp0cnVlLCJhcHBsZXQiOnRydWV9LGRh dGE6ZnVuY3Rpb24oZWxlbSxuYW1lLGRhdGEpe2lmKGVsZW0ubm9kZU5hbWUmJmpR dWVyeS5ub0RhdGFbZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSl7cmV0dXJu O30KZWxlbT1lbGVtPT13aW5kb3c/d2luZG93RGF0YTplbGVtO3ZhciBpZD1lbGVt W2V4cGFuZG9dLGNhY2hlPWpRdWVyeS5jYWNoZSx0aGlzQ2FjaGU7aWYoIWlkJiZ0 eXBlb2YgbmFtZT09PSJzdHJpbmciJiZkYXRhPT09dW5kZWZpbmVkKXtyZXR1cm4g bnVsbDt9CmlmKCFpZCl7aWQ9Kyt1dWlkO30KaWYodHlwZW9mIG5hbWU9PT0ib2Jq ZWN0Iil7ZWxlbVtleHBhbmRvXT1pZDt0aGlzQ2FjaGU9Y2FjaGVbaWRdPWpRdWVy eS5leHRlbmQodHJ1ZSx7fSxuYW1lKTt9ZWxzZSBpZighY2FjaGVbaWRdKXtlbGVt W2V4cGFuZG9dPWlkO2NhY2hlW2lkXT17fTt9CnRoaXNDYWNoZT1jYWNoZVtpZF07 aWYoZGF0YSE9PXVuZGVmaW5lZCl7dGhpc0NhY2hlW25hbWVdPWRhdGE7fQpyZXR1 cm4gdHlwZW9mIG5hbWU9PT0ic3RyaW5nIj90aGlzQ2FjaGVbbmFtZV06dGhpc0Nh Y2hlO30scmVtb3ZlRGF0YTpmdW5jdGlvbihlbGVtLG5hbWUpe2lmKGVsZW0ubm9k ZU5hbWUmJmpRdWVyeS5ub0RhdGFbZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgp XSl7cmV0dXJuO30KZWxlbT1lbGVtPT13aW5kb3c/d2luZG93RGF0YTplbGVtO3Zh ciBpZD1lbGVtW2V4cGFuZG9dLGNhY2hlPWpRdWVyeS5jYWNoZSx0aGlzQ2FjaGU9 Y2FjaGVbaWRdO2lmKG5hbWUpe2lmKHRoaXNDYWNoZSl7ZGVsZXRlIHRoaXNDYWNo ZVtuYW1lXTtpZihqUXVlcnkuaXNFbXB0eU9iamVjdCh0aGlzQ2FjaGUpKXtqUXVl cnkucmVtb3ZlRGF0YShlbGVtKTt9fX1lbHNle2lmKGpRdWVyeS5zdXBwb3J0LmRl bGV0ZUV4cGFuZG8pe2RlbGV0ZSBlbGVtW2pRdWVyeS5leHBhbmRvXTt9ZWxzZSBp ZihlbGVtLnJlbW92ZUF0dHJpYnV0ZSl7ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoalF1 ZXJ5LmV4cGFuZG8pO30KZGVsZXRlIGNhY2hlW2lkXTt9fX0pO2pRdWVyeS5mbi5l eHRlbmQoe2RhdGE6ZnVuY3Rpb24oa2V5LHZhbHVlKXtpZih0eXBlb2Yga2V5PT09 InVuZGVmaW5lZCImJnRoaXMubGVuZ3RoKXtyZXR1cm4galF1ZXJ5LmRhdGEodGhp c1swXSk7fWVsc2UgaWYodHlwZW9mIGtleT09PSJvYmplY3QiKXtyZXR1cm4gdGhp cy5lYWNoKGZ1bmN0aW9uKCl7alF1ZXJ5LmRhdGEodGhpcyxrZXkpO30pO30KdmFy IHBhcnRzPWtleS5zcGxpdCgiLiIpO3BhcnRzWzFdPXBhcnRzWzFdPyIuIitwYXJ0 c1sxXToiIjtpZih2YWx1ZT09PXVuZGVmaW5lZCl7dmFyIGRhdGE9dGhpcy50cmln Z2VySGFuZGxlcigiZ2V0RGF0YSIrcGFydHNbMV0rIiEiLFtwYXJ0c1swXV0pO2lm KGRhdGE9PT11bmRlZmluZWQmJnRoaXMubGVuZ3RoKXtkYXRhPWpRdWVyeS5kYXRh KHRoaXNbMF0sa2V5KTt9CnJldHVybiBkYXRhPT09dW5kZWZpbmVkJiZwYXJ0c1sx XT90aGlzLmRhdGEocGFydHNbMF0pOmRhdGE7fWVsc2V7cmV0dXJuIHRoaXMudHJp Z2dlcigic2V0RGF0YSIrcGFydHNbMV0rIiEiLFtwYXJ0c1swXSx2YWx1ZV0pLmVh Y2goZnVuY3Rpb24oKXtqUXVlcnkuZGF0YSh0aGlzLGtleSx2YWx1ZSk7fSk7fX0s cmVtb3ZlRGF0YTpmdW5jdGlvbihrZXkpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rp b24oKXtqUXVlcnkucmVtb3ZlRGF0YSh0aGlzLGtleSk7fSk7fX0pO2pRdWVyeS5l eHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGVsZW0sdHlwZSxkYXRhKXtpZighZWxlbSl7 cmV0dXJuO30KdHlwZT0odHlwZXx8ImZ4IikrInF1ZXVlIjt2YXIgcT1qUXVlcnku ZGF0YShlbGVtLHR5cGUpO2lmKCFkYXRhKXtyZXR1cm4gcXx8W107fQppZighcXx8 alF1ZXJ5LmlzQXJyYXkoZGF0YSkpe3E9alF1ZXJ5LmRhdGEoZWxlbSx0eXBlLGpR dWVyeS5tYWtlQXJyYXkoZGF0YSkpO31lbHNle3EucHVzaChkYXRhKTt9CnJldHVy biBxO30sZGVxdWV1ZTpmdW5jdGlvbihlbGVtLHR5cGUpe3R5cGU9dHlwZXx8ImZ4 Ijt2YXIgcXVldWU9alF1ZXJ5LnF1ZXVlKGVsZW0sdHlwZSksZm49cXVldWUuc2hp ZnQoKTtpZihmbj09PSJpbnByb2dyZXNzIil7Zm49cXVldWUuc2hpZnQoKTt9Cmlm KGZuKXtpZih0eXBlPT09ImZ4Iil7cXVldWUudW5zaGlmdCgiaW5wcm9ncmVzcyIp O30KZm4uY2FsbChlbGVtLGZ1bmN0aW9uKCl7alF1ZXJ5LmRlcXVldWUoZWxlbSx0 eXBlKTt9KTt9fX0pO2pRdWVyeS5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHR5 cGUsZGF0YSl7aWYodHlwZW9mIHR5cGUhPT0ic3RyaW5nIil7ZGF0YT10eXBlO3R5 cGU9ImZ4Ijt9CmlmKGRhdGE9PT11bmRlZmluZWQpe3JldHVybiBqUXVlcnkucXVl dWUodGhpc1swXSx0eXBlKTt9CnJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSxl bGVtKXt2YXIgcXVldWU9alF1ZXJ5LnF1ZXVlKHRoaXMsdHlwZSxkYXRhKTtpZih0 eXBlPT09ImZ4IiYmcXVldWVbMF0hPT0iaW5wcm9ncmVzcyIpe2pRdWVyeS5kZXF1 ZXVlKHRoaXMsdHlwZSk7fX0pO30sZGVxdWV1ZTpmdW5jdGlvbih0eXBlKXtyZXR1 cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7alF1ZXJ5LmRlcXVldWUodGhpcyx0eXBl KTt9KTt9LGRlbGF5OmZ1bmN0aW9uKHRpbWUsdHlwZSl7dGltZT1qUXVlcnkuZng/ alF1ZXJ5LmZ4LnNwZWVkc1t0aW1lXXx8dGltZTp0aW1lO3R5cGU9dHlwZXx8ImZ4 IjtyZXR1cm4gdGhpcy5xdWV1ZSh0eXBlLGZ1bmN0aW9uKCl7dmFyIGVsZW09dGhp cztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7alF1ZXJ5LmRlcXVldWUoZWxlbSx0eXBl KTt9LHRpbWUpO30pO30sY2xlYXJRdWV1ZTpmdW5jdGlvbih0eXBlKXtyZXR1cm4g dGhpcy5xdWV1ZSh0eXBlfHwiZngiLFtdKTt9fSk7dmFyIHJjbGFzcz0vW1xuXHRd L2cscnNwYWNlPS9ccysvLHJyZXR1cm49L1xyL2cscnNwZWNpYWx1cmw9L2hyZWZ8 c3JjfHN0eWxlLyxydHlwZT0vKGJ1dHRvbnxpbnB1dCkvaSxyZm9jdXNhYmxlPS8o YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpL2kscmNsaWNrYWJs ZT0vXihhfGFyZWEpJC9pLHJyYWRpb2NoZWNrPS9yYWRpb3xjaGVja2JveC87alF1 ZXJ5LmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihuYW1lLHZhbHVlKXtyZXR1cm4g YWNjZXNzKHRoaXMsbmFtZSx2YWx1ZSx0cnVlLGpRdWVyeS5hdHRyKTt9LHJlbW92 ZUF0dHI6ZnVuY3Rpb24obmFtZSxmbil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlv bigpe2pRdWVyeS5hdHRyKHRoaXMsbmFtZSwiIik7aWYodGhpcy5ub2RlVHlwZT09 PTEpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO319KTt9LGFkZENsYXNzOmZ1 bmN0aW9uKHZhbHVlKXtpZihqUXVlcnkuaXNGdW5jdGlvbih2YWx1ZSkpe3JldHVy biB0aGlzLmVhY2goZnVuY3Rpb24oaSl7dmFyIHNlbGY9alF1ZXJ5KHRoaXMpO3Nl bGYuYWRkQ2xhc3ModmFsdWUuY2FsbCh0aGlzLGksc2VsZi5hdHRyKCJjbGFzcyIp KSk7fSk7fQppZih2YWx1ZSYmdHlwZW9mIHZhbHVlPT09InN0cmluZyIpe3ZhciBj bGFzc05hbWVzPSh2YWx1ZXx8IiIpLnNwbGl0KHJzcGFjZSk7Zm9yKHZhciBpPTAs bD10aGlzLmxlbmd0aDtpPGw7aSsrKXt2YXIgZWxlbT10aGlzW2ldO2lmKGVsZW0u bm9kZVR5cGU9PT0xKXtpZighZWxlbS5jbGFzc05hbWUpe2VsZW0uY2xhc3NOYW1l PXZhbHVlO31lbHNle3ZhciBjbGFzc05hbWU9IiAiK2VsZW0uY2xhc3NOYW1lKyIg IixzZXRDbGFzcz1lbGVtLmNsYXNzTmFtZTtmb3IodmFyIGM9MCxjbD1jbGFzc05h bWVzLmxlbmd0aDtjPGNsO2MrKyl7aWYoY2xhc3NOYW1lLmluZGV4T2YoIiAiK2Ns YXNzTmFtZXNbY10rIiAiKTwwKXtzZXRDbGFzcys9IiAiK2NsYXNzTmFtZXNbY107 fX0KZWxlbS5jbGFzc05hbWU9alF1ZXJ5LnRyaW0oc2V0Q2xhc3MpO319fX0KcmV0 dXJuIHRoaXM7fSxyZW1vdmVDbGFzczpmdW5jdGlvbih2YWx1ZSl7aWYoalF1ZXJ5 LmlzRnVuY3Rpb24odmFsdWUpKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkp e3ZhciBzZWxmPWpRdWVyeSh0aGlzKTtzZWxmLnJlbW92ZUNsYXNzKHZhbHVlLmNh bGwodGhpcyxpLHNlbGYuYXR0cigiY2xhc3MiKSkpO30pO30KaWYoKHZhbHVlJiZ0 eXBlb2YgdmFsdWU9PT0ic3RyaW5nIil8fHZhbHVlPT09dW5kZWZpbmVkKXt2YXIg Y2xhc3NOYW1lcz0odmFsdWV8fCIiKS5zcGxpdChyc3BhY2UpO2Zvcih2YXIgaT0w LGw9dGhpcy5sZW5ndGg7aTxsO2krKyl7dmFyIGVsZW09dGhpc1tpXTtpZihlbGVt Lm5vZGVUeXBlPT09MSYmZWxlbS5jbGFzc05hbWUpe2lmKHZhbHVlKXt2YXIgY2xh c3NOYW1lPSgiICIrZWxlbS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHJjbGFzcywi ICIpO2Zvcih2YXIgYz0wLGNsPWNsYXNzTmFtZXMubGVuZ3RoO2M8Y2w7YysrKXtj bGFzc05hbWU9Y2xhc3NOYW1lLnJlcGxhY2UoIiAiK2NsYXNzTmFtZXNbY10rIiAi LCIgIik7fQplbGVtLmNsYXNzTmFtZT1qUXVlcnkudHJpbShjbGFzc05hbWUpO31l bHNle2VsZW0uY2xhc3NOYW1lPSIiO319fX0KcmV0dXJuIHRoaXM7fSx0b2dnbGVD bGFzczpmdW5jdGlvbih2YWx1ZSxzdGF0ZVZhbCl7dmFyIHR5cGU9dHlwZW9mIHZh bHVlLGlzQm9vbD10eXBlb2Ygc3RhdGVWYWw9PT0iYm9vbGVhbiI7aWYoalF1ZXJ5 LmlzRnVuY3Rpb24odmFsdWUpKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkp e3ZhciBzZWxmPWpRdWVyeSh0aGlzKTtzZWxmLnRvZ2dsZUNsYXNzKHZhbHVlLmNh bGwodGhpcyxpLHNlbGYuYXR0cigiY2xhc3MiKSxzdGF0ZVZhbCksc3RhdGVWYWwp O30pO30KcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKHR5cGU9PT0ic3Ry aW5nIil7dmFyIGNsYXNzTmFtZSxpPTAsc2VsZj1qUXVlcnkodGhpcyksc3RhdGU9 c3RhdGVWYWwsY2xhc3NOYW1lcz12YWx1ZS5zcGxpdChyc3BhY2UpO3doaWxlKChj bGFzc05hbWU9Y2xhc3NOYW1lc1tpKytdKSl7c3RhdGU9aXNCb29sP3N0YXRlOiFz ZWxmLmhhc0NsYXNzKGNsYXNzTmFtZSk7c2VsZltzdGF0ZT8iYWRkQ2xhc3MiOiJy ZW1vdmVDbGFzcyJdKGNsYXNzTmFtZSk7fX1lbHNlIGlmKHR5cGU9PT0idW5kZWZp bmVkInx8dHlwZT09PSJib29sZWFuIil7aWYodGhpcy5jbGFzc05hbWUpe2pRdWVy eS5kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKTt9CnRo aXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHx2YWx1ZT09PWZhbHNlPyIiOmpR dWVyeS5kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiI7fX0pO30saGFzQ2xh c3M6ZnVuY3Rpb24oc2VsZWN0b3Ipe3ZhciBjbGFzc05hbWU9IiAiK3NlbGVjdG9y KyIgIjtmb3IodmFyIGk9MCxsPXRoaXMubGVuZ3RoO2k8bDtpKyspe2lmKCgiICIr dGhpc1tpXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHJjbGFzcywiICIpLmluZGV4 T2YoY2xhc3NOYW1lKT4tMSl7cmV0dXJuIHRydWU7fX0KcmV0dXJuIGZhbHNlO30s dmFsOmZ1bmN0aW9uKHZhbHVlKXtpZih2YWx1ZT09PXVuZGVmaW5lZCl7dmFyIGVs ZW09dGhpc1swXTtpZihlbGVtKXtpZihqUXVlcnkubm9kZU5hbWUoZWxlbSwib3B0 aW9uIikpe3JldHVybihlbGVtLmF0dHJpYnV0ZXMudmFsdWV8fHt9KS5zcGVjaWZp ZWQ/ZWxlbS52YWx1ZTplbGVtLnRleHQ7fQppZihqUXVlcnkubm9kZU5hbWUoZWxl bSwic2VsZWN0Iikpe3ZhciBpbmRleD1lbGVtLnNlbGVjdGVkSW5kZXgsdmFsdWVz PVtdLG9wdGlvbnM9ZWxlbS5vcHRpb25zLG9uZT1lbGVtLnR5cGU9PT0ic2VsZWN0 LW9uZSI7aWYoaW5kZXg8MCl7cmV0dXJuIG51bGw7fQpmb3IodmFyIGk9b25lP2lu ZGV4OjAsbWF4PW9uZT9pbmRleCsxOm9wdGlvbnMubGVuZ3RoO2k8bWF4O2krKyl7 dmFyIG9wdGlvbj1vcHRpb25zW2ldO2lmKG9wdGlvbi5zZWxlY3RlZCl7dmFsdWU9 alF1ZXJ5KG9wdGlvbikudmFsKCk7aWYob25lKXtyZXR1cm4gdmFsdWU7fQp2YWx1 ZXMucHVzaCh2YWx1ZSk7fX0KcmV0dXJuIHZhbHVlczt9CmlmKHJyYWRpb2NoZWNr LnRlc3QoZWxlbS50eXBlKSYmIWpRdWVyeS5zdXBwb3J0LmNoZWNrT24pe3JldHVy biBlbGVtLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjplbGVtLnZh bHVlO30KcmV0dXJuKGVsZW0udmFsdWV8fCIiKS5yZXBsYWNlKHJyZXR1cm4sIiIp O30KcmV0dXJuIHVuZGVmaW5lZDt9CnZhciBpc0Z1bmN0aW9uPWpRdWVyeS5pc0Z1 bmN0aW9uKHZhbHVlKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpe3ZhciBz ZWxmPWpRdWVyeSh0aGlzKSx2YWw9dmFsdWU7aWYodGhpcy5ub2RlVHlwZSE9PTEp e3JldHVybjt9CmlmKGlzRnVuY3Rpb24pe3ZhbD12YWx1ZS5jYWxsKHRoaXMsaSxz ZWxmLnZhbCgpKTt9CmlmKHR5cGVvZiB2YWw9PT0ibnVtYmVyIil7dmFsKz0iIjt9 CmlmKGpRdWVyeS5pc0FycmF5KHZhbCkmJnJyYWRpb2NoZWNrLnRlc3QodGhpcy50 eXBlKSl7dGhpcy5jaGVja2VkPWpRdWVyeS5pbkFycmF5KHNlbGYudmFsKCksdmFs KT49MDt9ZWxzZSBpZihqUXVlcnkubm9kZU5hbWUodGhpcywic2VsZWN0Iikpe3Zh ciB2YWx1ZXM9alF1ZXJ5Lm1ha2VBcnJheSh2YWwpO2pRdWVyeSgib3B0aW9uIix0 aGlzKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD1qUXVlcnkuaW5BcnJh eShqUXVlcnkodGhpcykudmFsKCksdmFsdWVzKT49MDt9KTtpZighdmFsdWVzLmxl bmd0aCl7dGhpcy5zZWxlY3RlZEluZGV4PS0xO319ZWxzZXt0aGlzLnZhbHVlPXZh bDt9fSk7fX0pO2pRdWVyeS5leHRlbmQoe2F0dHJGbjp7dmFsOnRydWUsY3NzOnRy dWUsaHRtbDp0cnVlLHRleHQ6dHJ1ZSxkYXRhOnRydWUsd2lkdGg6dHJ1ZSxoZWln aHQ6dHJ1ZSxvZmZzZXQ6dHJ1ZX0sYXR0cjpmdW5jdGlvbihlbGVtLG5hbWUsdmFs dWUscGFzcyl7aWYoIWVsZW18fGVsZW0ubm9kZVR5cGU9PT0zfHxlbGVtLm5vZGVU eXBlPT09OCl7cmV0dXJuIHVuZGVmaW5lZDt9CmlmKHBhc3MmJm5hbWUgaW4galF1 ZXJ5LmF0dHJGbil7cmV0dXJuIGpRdWVyeShlbGVtKVtuYW1lXSh2YWx1ZSk7fQp2 YXIgbm90eG1sPWVsZW0ubm9kZVR5cGUhPT0xfHwhalF1ZXJ5LmlzWE1MRG9jKGVs ZW0pLHNldD12YWx1ZSE9PXVuZGVmaW5lZDtuYW1lPW5vdHhtbCYmalF1ZXJ5LnBy b3BzW25hbWVdfHxuYW1lO2lmKGVsZW0ubm9kZVR5cGU9PT0xKXt2YXIgc3BlY2lh bD1yc3BlY2lhbHVybC50ZXN0KG5hbWUpO2lmKG5hbWU9PT0ic2VsZWN0ZWQiJiYh alF1ZXJ5LnN1cHBvcnQub3B0U2VsZWN0ZWQpe3ZhciBwYXJlbnQ9ZWxlbS5wYXJl bnROb2RlO2lmKHBhcmVudCl7cGFyZW50LnNlbGVjdGVkSW5kZXg7aWYocGFyZW50 LnBhcmVudE5vZGUpe3BhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7fX19 CmlmKG5hbWUgaW4gZWxlbSYmbm90eG1sJiYhc3BlY2lhbCl7aWYoc2V0KXtpZihu YW1lPT09InR5cGUiJiZydHlwZS50ZXN0KGVsZW0ubm9kZU5hbWUpJiZlbGVtLnBh cmVudE5vZGUpe2pRdWVyeS5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBj aGFuZ2VkIik7fQplbGVtW25hbWVdPXZhbHVlO30KaWYoalF1ZXJ5Lm5vZGVOYW1l KGVsZW0sImZvcm0iKSYmZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpKXtyZXR1 cm4gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpLm5vZGVWYWx1ZTt9CmlmKG5h bWU9PT0idGFiSW5kZXgiKXt2YXIgYXR0cmlidXRlTm9kZT1lbGVtLmdldEF0dHJp YnV0ZU5vZGUoInRhYkluZGV4Iik7cmV0dXJuIGF0dHJpYnV0ZU5vZGUmJmF0dHJp YnV0ZU5vZGUuc3BlY2lmaWVkP2F0dHJpYnV0ZU5vZGUudmFsdWU6cmZvY3VzYWJs ZS50ZXN0KGVsZW0ubm9kZU5hbWUpfHxyY2xpY2thYmxlLnRlc3QoZWxlbS5ub2Rl TmFtZSkmJmVsZW0uaHJlZj8wOnVuZGVmaW5lZDt9CnJldHVybiBlbGVtW25hbWVd O30KaWYoIWpRdWVyeS5zdXBwb3J0LnN0eWxlJiZub3R4bWwmJm5hbWU9PT0ic3R5 bGUiKXtpZihzZXQpe2VsZW0uc3R5bGUuY3NzVGV4dD0iIit2YWx1ZTt9CnJldHVy biBlbGVtLnN0eWxlLmNzc1RleHQ7fQppZihzZXQpe2VsZW0uc2V0QXR0cmlidXRl KG5hbWUsIiIrdmFsdWUpO30KdmFyIGF0dHI9IWpRdWVyeS5zdXBwb3J0LmhyZWZO b3JtYWxpemVkJiZub3R4bWwmJnNwZWNpYWw/ZWxlbS5nZXRBdHRyaWJ1dGUobmFt ZSwyKTplbGVtLmdldEF0dHJpYnV0ZShuYW1lKTtyZXR1cm4gYXR0cj09PW51bGw/ dW5kZWZpbmVkOmF0dHI7fQpyZXR1cm4galF1ZXJ5LnN0eWxlKGVsZW0sbmFtZSx2 YWx1ZSk7fX0pO3ZhciBybmFtZXNwYWNlcz0vXC4oLiopJC8sZmNsZWFudXA9ZnVu Y3Rpb24obm0pe3JldHVybiBubS5yZXBsYWNlKC9bXlx3XHNcLlx8YF0vZyxmdW5j dGlvbihjaCl7cmV0dXJuIlxcIitjaDt9KTt9O2pRdWVyeS5ldmVudD17YWRkOmZ1 bmN0aW9uKGVsZW0sdHlwZXMsaGFuZGxlcixkYXRhKXtpZihlbGVtLm5vZGVUeXBl PT09M3x8ZWxlbS5ub2RlVHlwZT09PTgpe3JldHVybjt9CmlmKGVsZW0uc2V0SW50 ZXJ2YWwmJihlbGVtIT09d2luZG93JiYhZWxlbS5mcmFtZUVsZW1lbnQpKXtlbGVt PXdpbmRvdzt9CnZhciBoYW5kbGVPYmpJbixoYW5kbGVPYmo7aWYoaGFuZGxlci5o YW5kbGVyKXtoYW5kbGVPYmpJbj1oYW5kbGVyO2hhbmRsZXI9aGFuZGxlT2JqSW4u aGFuZGxlcjt9CmlmKCFoYW5kbGVyLmd1aWQpe2hhbmRsZXIuZ3VpZD1qUXVlcnku Z3VpZCsrO30KdmFyIGVsZW1EYXRhPWpRdWVyeS5kYXRhKGVsZW0pO2lmKCFlbGVt RGF0YSl7cmV0dXJuO30KdmFyIGV2ZW50cz1lbGVtRGF0YS5ldmVudHM9ZWxlbURh dGEuZXZlbnRzfHx7fSxldmVudEhhbmRsZT1lbGVtRGF0YS5oYW5kbGUsZXZlbnRI YW5kbGU7aWYoIWV2ZW50SGFuZGxlKXtlbGVtRGF0YS5oYW5kbGU9ZXZlbnRIYW5k bGU9ZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIGpRdWVyeSE9PSJ1bmRlZmluZWQi JiYhalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZD9qUXVlcnkuZXZlbnQuaGFuZGxlLmFw cGx5KGV2ZW50SGFuZGxlLmVsZW0sYXJndW1lbnRzKTp1bmRlZmluZWQ7fTt9CmV2 ZW50SGFuZGxlLmVsZW09ZWxlbTt0eXBlcz10eXBlcy5zcGxpdCgiICIpO3ZhciB0 eXBlLGk9MCxuYW1lc3BhY2VzO3doaWxlKCh0eXBlPXR5cGVzW2krK10pKXtoYW5k bGVPYmo9aGFuZGxlT2JqSW4/alF1ZXJ5LmV4dGVuZCh7fSxoYW5kbGVPYmpJbik6 e2hhbmRsZXI6aGFuZGxlcixkYXRhOmRhdGF9O2lmKHR5cGUuaW5kZXhPZigiLiIp Pi0xKXtuYW1lc3BhY2VzPXR5cGUuc3BsaXQoIi4iKTt0eXBlPW5hbWVzcGFjZXMu c2hpZnQoKTtoYW5kbGVPYmoubmFtZXNwYWNlPW5hbWVzcGFjZXMuc2xpY2UoMCku c29ydCgpLmpvaW4oIi4iKTt9ZWxzZXtuYW1lc3BhY2VzPVtdO2hhbmRsZU9iai5u YW1lc3BhY2U9IiI7fQpoYW5kbGVPYmoudHlwZT10eXBlO2hhbmRsZU9iai5ndWlk PWhhbmRsZXIuZ3VpZDt2YXIgaGFuZGxlcnM9ZXZlbnRzW3R5cGVdLHNwZWNpYWw9 alF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV18fHt9O2lmKCFoYW5kbGVycyl7aGFu ZGxlcnM9ZXZlbnRzW3R5cGVdPVtdO2lmKCFzcGVjaWFsLnNldHVwfHxzcGVjaWFs LnNldHVwLmNhbGwoZWxlbSxkYXRhLG5hbWVzcGFjZXMsZXZlbnRIYW5kbGUpPT09 ZmFsc2Upe2lmKGVsZW0uYWRkRXZlbnRMaXN0ZW5lcil7ZWxlbS5hZGRFdmVudExp c3RlbmVyKHR5cGUsZXZlbnRIYW5kbGUsZmFsc2UpO31lbHNlIGlmKGVsZW0uYXR0 YWNoRXZlbnQpe2VsZW0uYXR0YWNoRXZlbnQoIm9uIit0eXBlLGV2ZW50SGFuZGxl KTt9fX0KaWYoc3BlY2lhbC5hZGQpe3NwZWNpYWwuYWRkLmNhbGwoZWxlbSxoYW5k bGVPYmopO2lmKCFoYW5kbGVPYmouaGFuZGxlci5ndWlkKXtoYW5kbGVPYmouaGFu ZGxlci5ndWlkPWhhbmRsZXIuZ3VpZDt9fQpoYW5kbGVycy5wdXNoKGhhbmRsZU9i aik7alF1ZXJ5LmV2ZW50Lmdsb2JhbFt0eXBlXT10cnVlO30KZWxlbT1udWxsO30s Z2xvYmFsOnt9LHJlbW92ZTpmdW5jdGlvbihlbGVtLHR5cGVzLGhhbmRsZXIscG9z KXtpZihlbGVtLm5vZGVUeXBlPT09M3x8ZWxlbS5ub2RlVHlwZT09PTgpe3JldHVy bjt9CnZhciByZXQsdHlwZSxmbixpPTAsYWxsLG5hbWVzcGFjZXMsbmFtZXNwYWNl LHNwZWNpYWwsZXZlbnRUeXBlLGhhbmRsZU9iaixvcmlnVHlwZSxlbGVtRGF0YT1q UXVlcnkuZGF0YShlbGVtKSxldmVudHM9ZWxlbURhdGEmJmVsZW1EYXRhLmV2ZW50 cztpZighZWxlbURhdGF8fCFldmVudHMpe3JldHVybjt9CmlmKHR5cGVzJiZ0eXBl cy50eXBlKXtoYW5kbGVyPXR5cGVzLmhhbmRsZXI7dHlwZXM9dHlwZXMudHlwZTt9 CmlmKCF0eXBlc3x8dHlwZW9mIHR5cGVzPT09InN0cmluZyImJnR5cGVzLmNoYXJB dCgwKT09PSIuIil7dHlwZXM9dHlwZXN8fCIiO2Zvcih0eXBlIGluIGV2ZW50cyl7 alF1ZXJ5LmV2ZW50LnJlbW92ZShlbGVtLHR5cGUrdHlwZXMpO30KcmV0dXJuO30K dHlwZXM9dHlwZXMuc3BsaXQoIiAiKTt3aGlsZSgodHlwZT10eXBlc1tpKytdKSl7 b3JpZ1R5cGU9dHlwZTtoYW5kbGVPYmo9bnVsbDthbGw9dHlwZS5pbmRleE9mKCIu Iik8MDtuYW1lc3BhY2VzPVtdO2lmKCFhbGwpe25hbWVzcGFjZXM9dHlwZS5zcGxp dCgiLiIpO3R5cGU9bmFtZXNwYWNlcy5zaGlmdCgpO25hbWVzcGFjZT1uZXcgUmVn RXhwKCIoXnxcXC4pIisKalF1ZXJ5Lm1hcChuYW1lc3BhY2VzLnNsaWNlKDApLnNv cnQoKSxmY2xlYW51cCkuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIil9 CmV2ZW50VHlwZT1ldmVudHNbdHlwZV07aWYoIWV2ZW50VHlwZSl7Y29udGludWU7 fQppZighaGFuZGxlcil7Zm9yKHZhciBqPTA7ajxldmVudFR5cGUubGVuZ3RoO2or Kyl7aGFuZGxlT2JqPWV2ZW50VHlwZVtqXTtpZihhbGx8fG5hbWVzcGFjZS50ZXN0 KGhhbmRsZU9iai5uYW1lc3BhY2UpKXtqUXVlcnkuZXZlbnQucmVtb3ZlKGVsZW0s b3JpZ1R5cGUsaGFuZGxlT2JqLmhhbmRsZXIsaik7ZXZlbnRUeXBlLnNwbGljZShq LS0sMSk7fX0KY29udGludWU7fQpzcGVjaWFsPWpRdWVyeS5ldmVudC5zcGVjaWFs W3R5cGVdfHx7fTtmb3IodmFyIGo9cG9zfHwwO2o8ZXZlbnRUeXBlLmxlbmd0aDtq Kyspe2hhbmRsZU9iaj1ldmVudFR5cGVbal07aWYoaGFuZGxlci5ndWlkPT09aGFu ZGxlT2JqLmd1aWQpe2lmKGFsbHx8bmFtZXNwYWNlLnRlc3QoaGFuZGxlT2JqLm5h bWVzcGFjZSkpe2lmKHBvcz09bnVsbCl7ZXZlbnRUeXBlLnNwbGljZShqLS0sMSk7 fQppZihzcGVjaWFsLnJlbW92ZSl7c3BlY2lhbC5yZW1vdmUuY2FsbChlbGVtLGhh bmRsZU9iaik7fX0KaWYocG9zIT1udWxsKXticmVhazt9fX0KaWYoZXZlbnRUeXBl Lmxlbmd0aD09PTB8fHBvcyE9bnVsbCYmZXZlbnRUeXBlLmxlbmd0aD09PTEpe2lm KCFzcGVjaWFsLnRlYXJkb3dufHxzcGVjaWFsLnRlYXJkb3duLmNhbGwoZWxlbSxu YW1lc3BhY2VzKT09PWZhbHNlKXtyZW1vdmVFdmVudChlbGVtLHR5cGUsZWxlbURh dGEuaGFuZGxlKTt9CnJldD1udWxsO2RlbGV0ZSBldmVudHNbdHlwZV07fX0KaWYo alF1ZXJ5LmlzRW1wdHlPYmplY3QoZXZlbnRzKSl7dmFyIGhhbmRsZT1lbGVtRGF0 YS5oYW5kbGU7aWYoaGFuZGxlKXtoYW5kbGUuZWxlbT1udWxsO30KZGVsZXRlIGVs ZW1EYXRhLmV2ZW50cztkZWxldGUgZWxlbURhdGEuaGFuZGxlO2lmKGpRdWVyeS5p c0VtcHR5T2JqZWN0KGVsZW1EYXRhKSl7alF1ZXJ5LnJlbW92ZURhdGEoZWxlbSk7 fX19LHRyaWdnZXI6ZnVuY3Rpb24oZXZlbnQsZGF0YSxlbGVtKXt2YXIgdHlwZT1l dmVudC50eXBlfHxldmVudCxidWJibGluZz1hcmd1bWVudHNbM107aWYoIWJ1YmJs aW5nKXtldmVudD10eXBlb2YgZXZlbnQ9PT0ib2JqZWN0Ij9ldmVudFtleHBhbmRv XT9ldmVudDpqUXVlcnkuZXh0ZW5kKGpRdWVyeS5FdmVudCh0eXBlKSxldmVudCk6 alF1ZXJ5LkV2ZW50KHR5cGUpO2lmKHR5cGUuaW5kZXhPZigiISIpPj0wKXtldmVu dC50eXBlPXR5cGU9dHlwZS5zbGljZSgwLC0xKTtldmVudC5leGNsdXNpdmU9dHJ1 ZTt9CmlmKCFlbGVtKXtldmVudC5zdG9wUHJvcGFnYXRpb24oKTtpZihqUXVlcnku ZXZlbnQuZ2xvYmFsW3R5cGVdKXtqUXVlcnkuZWFjaChqUXVlcnkuY2FjaGUsZnVu Y3Rpb24oKXtpZih0aGlzLmV2ZW50cyYmdGhpcy5ldmVudHNbdHlwZV0pe2pRdWVy eS5ldmVudC50cmlnZ2VyKGV2ZW50LGRhdGEsdGhpcy5oYW5kbGUuZWxlbSk7fX0p O319CmlmKCFlbGVtfHxlbGVtLm5vZGVUeXBlPT09M3x8ZWxlbS5ub2RlVHlwZT09 PTgpe3JldHVybiB1bmRlZmluZWQ7fQpldmVudC5yZXN1bHQ9dW5kZWZpbmVkO2V2 ZW50LnRhcmdldD1lbGVtO2RhdGE9alF1ZXJ5Lm1ha2VBcnJheShkYXRhKTtkYXRh LnVuc2hpZnQoZXZlbnQpO30KZXZlbnQuY3VycmVudFRhcmdldD1lbGVtO3ZhciBo YW5kbGU9alF1ZXJ5LmRhdGEoZWxlbSwiaGFuZGxlIik7aWYoaGFuZGxlKXtoYW5k bGUuYXBwbHkoZWxlbSxkYXRhKTt9CnZhciBwYXJlbnQ9ZWxlbS5wYXJlbnROb2Rl fHxlbGVtLm93bmVyRG9jdW1lbnQ7dHJ5e2lmKCEoZWxlbSYmZWxlbS5ub2RlTmFt ZSYmalF1ZXJ5Lm5vRGF0YVtlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSl7 aWYoZWxlbVsib24iK3R5cGVdJiZlbGVtWyJvbiIrdHlwZV0uYXBwbHkoZWxlbSxk YXRhKT09PWZhbHNlKXtldmVudC5yZXN1bHQ9ZmFsc2U7fX19Y2F0Y2goZSl7fQpp ZighZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmcGFyZW50KXtqUXVlcnku ZXZlbnQudHJpZ2dlcihldmVudCxkYXRhLHBhcmVudCx0cnVlKTt9ZWxzZSBpZigh ZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ZhciB0YXJnZXQ9ZXZlbnQudGFy Z2V0LG9sZCxpc0NsaWNrPWpRdWVyeS5ub2RlTmFtZSh0YXJnZXQsImEiKSYmdHlw ZT09PSJjbGljayIsc3BlY2lhbD1qUXVlcnkuZXZlbnQuc3BlY2lhbFt0eXBlXXx8 e307aWYoKCFzcGVjaWFsLl9kZWZhdWx0fHxzcGVjaWFsLl9kZWZhdWx0LmNhbGwo ZWxlbSxldmVudCk9PT1mYWxzZSkmJiFpc0NsaWNrJiYhKHRhcmdldCYmdGFyZ2V0 Lm5vZGVOYW1lJiZqUXVlcnkubm9EYXRhW3RhcmdldC5ub2RlTmFtZS50b0xvd2Vy Q2FzZSgpXSkpe3RyeXtpZih0YXJnZXRbdHlwZV0pe29sZD10YXJnZXRbIm9uIit0 eXBlXTtpZihvbGQpe3RhcmdldFsib24iK3R5cGVdPW51bGw7fQpqUXVlcnkuZXZl bnQudHJpZ2dlcmVkPXRydWU7dGFyZ2V0W3R5cGVdKCk7fX1jYXRjaChlKXt9Cmlm KG9sZCl7dGFyZ2V0WyJvbiIrdHlwZV09b2xkO30KalF1ZXJ5LmV2ZW50LnRyaWdn ZXJlZD1mYWxzZTt9fX0saGFuZGxlOmZ1bmN0aW9uKGV2ZW50KXt2YXIgYWxsLGhh bmRsZXJzLG5hbWVzcGFjZXMsbmFtZXNwYWNlLGV2ZW50cztldmVudD1hcmd1bWVu dHNbMF09alF1ZXJ5LmV2ZW50LmZpeChldmVudHx8d2luZG93LmV2ZW50KTtldmVu dC5jdXJyZW50VGFyZ2V0PXRoaXM7YWxsPWV2ZW50LnR5cGUuaW5kZXhPZigiLiIp PDAmJiFldmVudC5leGNsdXNpdmU7aWYoIWFsbCl7bmFtZXNwYWNlcz1ldmVudC50 eXBlLnNwbGl0KCIuIik7ZXZlbnQudHlwZT1uYW1lc3BhY2VzLnNoaWZ0KCk7bmFt ZXNwYWNlPW5ldyBSZWdFeHAoIihefFxcLikiK25hbWVzcGFjZXMuc2xpY2UoMCku c29ydCgpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpO30KdmFyIGV2 ZW50cz1qUXVlcnkuZGF0YSh0aGlzLCJldmVudHMiKSxoYW5kbGVycz1ldmVudHNb ZXZlbnQudHlwZV07aWYoZXZlbnRzJiZoYW5kbGVycyl7aGFuZGxlcnM9aGFuZGxl cnMuc2xpY2UoMCk7Zm9yKHZhciBqPTAsbD1oYW5kbGVycy5sZW5ndGg7ajxsO2or Kyl7dmFyIGhhbmRsZU9iaj1oYW5kbGVyc1tqXTtpZihhbGx8fG5hbWVzcGFjZS50 ZXN0KGhhbmRsZU9iai5uYW1lc3BhY2UpKXtldmVudC5oYW5kbGVyPWhhbmRsZU9i ai5oYW5kbGVyO2V2ZW50LmRhdGE9aGFuZGxlT2JqLmRhdGE7ZXZlbnQuaGFuZGxl T2JqPWhhbmRsZU9iajt2YXIgcmV0PWhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRo aXMsYXJndW1lbnRzKTtpZihyZXQhPT11bmRlZmluZWQpe2V2ZW50LnJlc3VsdD1y ZXQ7aWYocmV0PT09ZmFsc2Upe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQu c3RvcFByb3BhZ2F0aW9uKCk7fX0KaWYoZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdh dGlvblN0b3BwZWQoKSl7YnJlYWs7fX19fQpyZXR1cm4gZXZlbnQucmVzdWx0O30s cHJvcHM6ImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9u IGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3Vy cmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhh bmRsZXIga2V5Q29kZSBsYXllclggbGF5ZXJZIG1ldGFLZXkgbmV3VmFsdWUgb2Zm c2V0WCBvZmZzZXRZIG9yaWdpbmFsVGFyZ2V0IHBhZ2VYIHBhZ2VZIHByZXZWYWx1 ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNjcmVlblggc2NyZWVuWSBzaGlm dEtleSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmlldyB3aGVlbERlbHRh IHdoaWNoIi5zcGxpdCgiICIpLGZpeDpmdW5jdGlvbihldmVudCl7aWYoZXZlbnRb ZXhwYW5kb10pe3JldHVybiBldmVudDt9CnZhciBvcmlnaW5hbEV2ZW50PWV2ZW50 O2V2ZW50PWpRdWVyeS5FdmVudChvcmlnaW5hbEV2ZW50KTtmb3IodmFyIGk9dGhp cy5wcm9wcy5sZW5ndGgscHJvcDtpOyl7cHJvcD10aGlzLnByb3BzWy0taV07ZXZl bnRbcHJvcF09b3JpZ2luYWxFdmVudFtwcm9wXTt9CmlmKCFldmVudC50YXJnZXQp e2V2ZW50LnRhcmdldD1ldmVudC5zcmNFbGVtZW50fHxkb2N1bWVudDt9CmlmKGV2 ZW50LnRhcmdldC5ub2RlVHlwZT09PTMpe2V2ZW50LnRhcmdldD1ldmVudC50YXJn ZXQucGFyZW50Tm9kZTt9CmlmKCFldmVudC5yZWxhdGVkVGFyZ2V0JiZldmVudC5m cm9tRWxlbWVudCl7ZXZlbnQucmVsYXRlZFRhcmdldD1ldmVudC5mcm9tRWxlbWVu dD09PWV2ZW50LnRhcmdldD9ldmVudC50b0VsZW1lbnQ6ZXZlbnQuZnJvbUVsZW1l bnQ7fQppZihldmVudC5wYWdlWD09bnVsbCYmZXZlbnQuY2xpZW50WCE9bnVsbCl7 dmFyIGRvYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYm9keT1kb2N1bWVudC5i b2R5O2V2ZW50LnBhZ2VYPWV2ZW50LmNsaWVudFgrKGRvYyYmZG9jLnNjcm9sbExl ZnR8fGJvZHkmJmJvZHkuc2Nyb2xsTGVmdHx8MCktKGRvYyYmZG9jLmNsaWVudExl ZnR8fGJvZHkmJmJvZHkuY2xpZW50TGVmdHx8MCk7ZXZlbnQucGFnZVk9ZXZlbnQu Y2xpZW50WSsoZG9jJiZkb2Muc2Nyb2xsVG9wfHxib2R5JiZib2R5LnNjcm9sbFRv cHx8MCktKGRvYyYmZG9jLmNsaWVudFRvcHx8Ym9keSYmYm9keS5jbGllbnRUb3B8 fDApO30KaWYoIWV2ZW50LndoaWNoJiYoKGV2ZW50LmNoYXJDb2RlfHxldmVudC5j aGFyQ29kZT09PTApP2V2ZW50LmNoYXJDb2RlOmV2ZW50LmtleUNvZGUpKXtldmVu dC53aGljaD1ldmVudC5jaGFyQ29kZXx8ZXZlbnQua2V5Q29kZTt9CmlmKCFldmVu dC5tZXRhS2V5JiZldmVudC5jdHJsS2V5KXtldmVudC5tZXRhS2V5PWV2ZW50LmN0 cmxLZXk7fQppZighZXZlbnQud2hpY2gmJmV2ZW50LmJ1dHRvbiE9PXVuZGVmaW5l ZCl7ZXZlbnQud2hpY2g9KGV2ZW50LmJ1dHRvbiYxPzE6KGV2ZW50LmJ1dHRvbiYy PzM6KGV2ZW50LmJ1dHRvbiY0PzI6MCkpKTt9CnJldHVybiBldmVudDt9LGd1aWQ6 MUU4LHByb3h5OmpRdWVyeS5wcm94eSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6alF1 ZXJ5LmJpbmRSZWFkeSx0ZWFyZG93bjpqUXVlcnkubm9vcH0sbGl2ZTp7YWRkOmZ1 bmN0aW9uKGhhbmRsZU9iail7alF1ZXJ5LmV2ZW50LmFkZCh0aGlzLGhhbmRsZU9i ai5vcmlnVHlwZSxqUXVlcnkuZXh0ZW5kKHt9LGhhbmRsZU9iaix7aGFuZGxlcjps aXZlSGFuZGxlcn0pKTt9LHJlbW92ZTpmdW5jdGlvbihoYW5kbGVPYmope3ZhciBy ZW1vdmU9dHJ1ZSx0eXBlPWhhbmRsZU9iai5vcmlnVHlwZS5yZXBsYWNlKHJuYW1l c3BhY2VzLCIiKTtqUXVlcnkuZWFjaChqUXVlcnkuZGF0YSh0aGlzLCJldmVudHMi KS5saXZlfHxbXSxmdW5jdGlvbigpe2lmKHR5cGU9PT10aGlzLm9yaWdUeXBlLnJl cGxhY2Uocm5hbWVzcGFjZXMsIiIpKXtyZW1vdmU9ZmFsc2U7cmV0dXJuIGZhbHNl O319KTtpZihyZW1vdmUpe2pRdWVyeS5ldmVudC5yZW1vdmUodGhpcyxoYW5kbGVP Ymoub3JpZ1R5cGUsbGl2ZUhhbmRsZXIpO319fSxiZWZvcmV1bmxvYWQ6e3NldHVw OmZ1bmN0aW9uKGRhdGEsbmFtZXNwYWNlcyxldmVudEhhbmRsZSl7aWYodGhpcy5z ZXRJbnRlcnZhbCl7dGhpcy5vbmJlZm9yZXVubG9hZD1ldmVudEhhbmRsZTt9CnJl dHVybiBmYWxzZTt9LHRlYXJkb3duOmZ1bmN0aW9uKG5hbWVzcGFjZXMsZXZlbnRI YW5kbGUpe2lmKHRoaXMub25iZWZvcmV1bmxvYWQ9PT1ldmVudEhhbmRsZSl7dGhp cy5vbmJlZm9yZXVubG9hZD1udWxsO319fX19O3ZhciByZW1vdmVFdmVudD1kb2N1 bWVudC5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGVsZW0sdHlwZSxoYW5k bGUpe2VsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLGhhbmRsZSxmYWxzZSk7 fTpmdW5jdGlvbihlbGVtLHR5cGUsaGFuZGxlKXtlbGVtLmRldGFjaEV2ZW50KCJv biIrdHlwZSxoYW5kbGUpO307alF1ZXJ5LkV2ZW50PWZ1bmN0aW9uKHNyYyl7aWYo IXRoaXMucHJldmVudERlZmF1bHQpe3JldHVybiBuZXcgalF1ZXJ5LkV2ZW50KHNy Yyk7fQppZihzcmMmJnNyYy50eXBlKXt0aGlzLm9yaWdpbmFsRXZlbnQ9c3JjO3Ro aXMudHlwZT1zcmMudHlwZTt9ZWxzZXt0aGlzLnR5cGU9c3JjO30KdGhpcy50aW1l U3RhbXA9bm93KCk7dGhpc1tleHBhbmRvXT10cnVlO307ZnVuY3Rpb24gcmV0dXJu RmFsc2UoKXtyZXR1cm4gZmFsc2U7fQpmdW5jdGlvbiByZXR1cm5UcnVlKCl7cmV0 dXJuIHRydWU7fQpqUXVlcnkuRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVs dDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPXJldHVyblRydWU7 dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKCFlKXtyZXR1cm47fQppZihlLnBy ZXZlbnREZWZhdWx0KXtlLnByZXZlbnREZWZhdWx0KCk7fQplLnJldHVyblZhbHVl PWZhbHNlO30sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc1Byb3Bh Z2F0aW9uU3RvcHBlZD1yZXR1cm5UcnVlO3ZhciBlPXRoaXMub3JpZ2luYWxFdmVu dDtpZighZSl7cmV0dXJuO30KaWYoZS5zdG9wUHJvcGFnYXRpb24pe2Uuc3RvcFBy b3BhZ2F0aW9uKCk7fQplLmNhbmNlbEJ1YmJsZT10cnVlO30sc3RvcEltbWVkaWF0 ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0 aW9uU3RvcHBlZD1yZXR1cm5UcnVlO3RoaXMuc3RvcFByb3BhZ2F0aW9uKCk7fSxp c0RlZmF1bHRQcmV2ZW50ZWQ6cmV0dXJuRmFsc2UsaXNQcm9wYWdhdGlvblN0b3Bw ZWQ6cmV0dXJuRmFsc2UsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6cmV0 dXJuRmFsc2V9O3ZhciB3aXRoaW5FbGVtZW50PWZ1bmN0aW9uKGV2ZW50KXt2YXIg cGFyZW50PWV2ZW50LnJlbGF0ZWRUYXJnZXQ7dHJ5e3doaWxlKHBhcmVudCYmcGFy ZW50IT09dGhpcyl7cGFyZW50PXBhcmVudC5wYXJlbnROb2RlO30KaWYocGFyZW50 IT09dGhpcyl7ZXZlbnQudHlwZT1ldmVudC5kYXRhO2pRdWVyeS5ldmVudC5oYW5k bGUuYXBwbHkodGhpcyxhcmd1bWVudHMpO319Y2F0Y2goZSl7fX0sZGVsZWdhdGU9 ZnVuY3Rpb24oZXZlbnQpe2V2ZW50LnR5cGU9ZXZlbnQuZGF0YTtqUXVlcnkuZXZl bnQuaGFuZGxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9O2pRdWVyeS5lYWNoKHtt b3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVu Y3Rpb24ob3JpZyxmaXgpe2pRdWVyeS5ldmVudC5zcGVjaWFsW29yaWddPXtzZXR1 cDpmdW5jdGlvbihkYXRhKXtqUXVlcnkuZXZlbnQuYWRkKHRoaXMsZml4LGRhdGEm JmRhdGEuc2VsZWN0b3I/ZGVsZWdhdGU6d2l0aGluRWxlbWVudCxvcmlnKTt9LHRl YXJkb3duOmZ1bmN0aW9uKGRhdGEpe2pRdWVyeS5ldmVudC5yZW1vdmUodGhpcyxm aXgsZGF0YSYmZGF0YS5zZWxlY3Rvcj9kZWxlZ2F0ZTp3aXRoaW5FbGVtZW50KTt9 fTt9KTtpZighalF1ZXJ5LnN1cHBvcnQuc3VibWl0QnViYmxlcyl7alF1ZXJ5LmV2 ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbihkYXRhLG5hbWVzcGFj ZXMpe2lmKHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJmb3JtIil7alF1 ZXJ5LmV2ZW50LmFkZCh0aGlzLCJjbGljay5zcGVjaWFsU3VibWl0IixmdW5jdGlv bihlKXt2YXIgZWxlbT1lLnRhcmdldCx0eXBlPWVsZW0udHlwZTtpZigodHlwZT09 PSJzdWJtaXQifHx0eXBlPT09ImltYWdlIikmJmpRdWVyeShlbGVtKS5jbG9zZXN0 KCJmb3JtIikubGVuZ3RoKXtyZXR1cm4gdHJpZ2dlcigic3VibWl0Iix0aGlzLGFy Z3VtZW50cyk7fX0pO2pRdWVyeS5ldmVudC5hZGQodGhpcywia2V5cHJlc3Muc3Bl Y2lhbFN1Ym1pdCIsZnVuY3Rpb24oZSl7dmFyIGVsZW09ZS50YXJnZXQsdHlwZT1l bGVtLnR5cGU7aWYoKHR5cGU9PT0idGV4dCJ8fHR5cGU9PT0icGFzc3dvcmQiKSYm alF1ZXJ5KGVsZW0pLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGgmJmUua2V5Q29kZT09 PTEzKXtyZXR1cm4gdHJpZ2dlcigic3VibWl0Iix0aGlzLGFyZ3VtZW50cyk7fX0p O31lbHNle3JldHVybiBmYWxzZTt9fSx0ZWFyZG93bjpmdW5jdGlvbihuYW1lc3Bh Y2VzKXtqUXVlcnkuZXZlbnQucmVtb3ZlKHRoaXMsIi5zcGVjaWFsU3VibWl0Iik7 fX07fQppZighalF1ZXJ5LnN1cHBvcnQuY2hhbmdlQnViYmxlcyl7dmFyIGZvcm1F bGVtcz0vdGV4dGFyZWF8aW5wdXR8c2VsZWN0L2ksY2hhbmdlRmlsdGVycyxnZXRW YWw9ZnVuY3Rpb24oZWxlbSl7dmFyIHR5cGU9ZWxlbS50eXBlLHZhbD1lbGVtLnZh bHVlO2lmKHR5cGU9PT0icmFkaW8ifHx0eXBlPT09ImNoZWNrYm94Iil7dmFsPWVs ZW0uY2hlY2tlZDt9ZWxzZSBpZih0eXBlPT09InNlbGVjdC1tdWx0aXBsZSIpe3Zh bD1lbGVtLnNlbGVjdGVkSW5kZXg+LTE/alF1ZXJ5Lm1hcChlbGVtLm9wdGlvbnMs ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0uc2VsZWN0ZWQ7fSkuam9pbigiLSIp OiIiO31lbHNlIGlmKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzZWxl Y3QiKXt2YWw9ZWxlbS5zZWxlY3RlZEluZGV4O30KcmV0dXJuIHZhbDt9LHRlc3RD aGFuZ2U9ZnVuY3Rpb24gdGVzdENoYW5nZShlKXt2YXIgZWxlbT1lLnRhcmdldCxk YXRhLHZhbDtpZighZm9ybUVsZW1zLnRlc3QoZWxlbS5ub2RlTmFtZSl8fGVsZW0u cmVhZE9ubHkpe3JldHVybjt9CmRhdGE9alF1ZXJ5LmRhdGEoZWxlbSwiX2NoYW5n ZV9kYXRhIik7dmFsPWdldFZhbChlbGVtKTtpZihlLnR5cGUhPT0iZm9jdXNvdXQi fHxlbGVtLnR5cGUhPT0icmFkaW8iKXtqUXVlcnkuZGF0YShlbGVtLCJfY2hhbmdl X2RhdGEiLHZhbCk7fQppZihkYXRhPT09dW5kZWZpbmVkfHx2YWw9PT1kYXRhKXty ZXR1cm47fQppZihkYXRhIT1udWxsfHx2YWwpe2UudHlwZT0iY2hhbmdlIjtyZXR1 cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoZSxhcmd1bWVudHNbMV0sZWxlbSk7fX07 alF1ZXJ5LmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtmaWx0ZXJzOntmb2N1c291dDp0 ZXN0Q2hhbmdlLGNsaWNrOmZ1bmN0aW9uKGUpe3ZhciBlbGVtPWUudGFyZ2V0LHR5 cGU9ZWxlbS50eXBlO2lmKHR5cGU9PT0icmFkaW8ifHx0eXBlPT09ImNoZWNrYm94 Inx8ZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InNlbGVjdCIpe3JldHVy biB0ZXN0Q2hhbmdlLmNhbGwodGhpcyxlKTt9fSxrZXlkb3duOmZ1bmN0aW9uKGUp e3ZhciBlbGVtPWUudGFyZ2V0LHR5cGU9ZWxlbS50eXBlO2lmKChlLmtleUNvZGU9 PT0xMyYmZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09InRleHRhcmVhIil8 fChlLmtleUNvZGU9PT0zMiYmKHR5cGU9PT0iY2hlY2tib3gifHx0eXBlPT09InJh ZGlvIikpfHx0eXBlPT09InNlbGVjdC1tdWx0aXBsZSIpe3JldHVybiB0ZXN0Q2hh bmdlLmNhbGwodGhpcyxlKTt9fSxiZWZvcmVhY3RpdmF0ZTpmdW5jdGlvbihlKXt2 YXIgZWxlbT1lLnRhcmdldDtqUXVlcnkuZGF0YShlbGVtLCJfY2hhbmdlX2RhdGEi LGdldFZhbChlbGVtKSk7fX0sc2V0dXA6ZnVuY3Rpb24oZGF0YSxuYW1lc3BhY2Vz KXtpZih0aGlzLnR5cGU9PT0iZmlsZSIpe3JldHVybiBmYWxzZTt9CmZvcih2YXIg dHlwZSBpbiBjaGFuZ2VGaWx0ZXJzKXtqUXVlcnkuZXZlbnQuYWRkKHRoaXMsdHlw ZSsiLnNwZWNpYWxDaGFuZ2UiLGNoYW5nZUZpbHRlcnNbdHlwZV0pO30KcmV0dXJu IGZvcm1FbGVtcy50ZXN0KHRoaXMubm9kZU5hbWUpO30sdGVhcmRvd246ZnVuY3Rp b24obmFtZXNwYWNlcyl7alF1ZXJ5LmV2ZW50LnJlbW92ZSh0aGlzLCIuc3BlY2lh bENoYW5nZSIpO3JldHVybiBmb3JtRWxlbXMudGVzdCh0aGlzLm5vZGVOYW1lKTt9 fTtjaGFuZ2VGaWx0ZXJzPWpRdWVyeS5ldmVudC5zcGVjaWFsLmNoYW5nZS5maWx0 ZXJzO30KZnVuY3Rpb24gdHJpZ2dlcih0eXBlLGVsZW0sYXJncyl7YXJnc1swXS50 eXBlPXR5cGU7cmV0dXJuIGpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoZWxlbSxh cmdzKTt9CmlmKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpe2pRdWVyeS5lYWNo KHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihvcmln LGZpeCl7alF1ZXJ5LmV2ZW50LnNwZWNpYWxbZml4XT17c2V0dXA6ZnVuY3Rpb24o KXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIob3JpZyxoYW5kbGVyLHRydWUpO30sdGVh cmRvd246ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIob3JpZyxo YW5kbGVyLHRydWUpO319O2Z1bmN0aW9uIGhhbmRsZXIoZSl7ZT1qUXVlcnkuZXZl bnQuZml4KGUpO2UudHlwZT1maXg7cmV0dXJuIGpRdWVyeS5ldmVudC5oYW5kbGUu Y2FsbCh0aGlzLGUpO319KTt9CmpRdWVyeS5lYWNoKFsiYmluZCIsIm9uZSJdLGZ1 bmN0aW9uKGksbmFtZSl7alF1ZXJ5LmZuW25hbWVdPWZ1bmN0aW9uKHR5cGUsZGF0 YSxmbil7aWYodHlwZW9mIHR5cGU9PT0ib2JqZWN0Iil7Zm9yKHZhciBrZXkgaW4g dHlwZSl7dGhpc1tuYW1lXShrZXksZGF0YSx0eXBlW2tleV0sZm4pO30KcmV0dXJu IHRoaXM7fQppZihqUXVlcnkuaXNGdW5jdGlvbihkYXRhKSl7Zm49ZGF0YTtkYXRh PXVuZGVmaW5lZDt9CnZhciBoYW5kbGVyPW5hbWU9PT0ib25lIj9qUXVlcnkucHJv eHkoZm4sZnVuY3Rpb24oZXZlbnQpe2pRdWVyeSh0aGlzKS51bmJpbmQoZXZlbnQs aGFuZGxlcik7cmV0dXJuIGZuLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9KTpmbjtp Zih0eXBlPT09InVubG9hZCImJm5hbWUhPT0ib25lIil7dGhpcy5vbmUodHlwZSxk YXRhLGZuKTt9ZWxzZXtmb3IodmFyIGk9MCxsPXRoaXMubGVuZ3RoO2k8bDtpKysp e2pRdWVyeS5ldmVudC5hZGQodGhpc1tpXSx0eXBlLGhhbmRsZXIsZGF0YSk7fX0K cmV0dXJuIHRoaXM7fTt9KTtqUXVlcnkuZm4uZXh0ZW5kKHt1bmJpbmQ6ZnVuY3Rp b24odHlwZSxmbil7aWYodHlwZW9mIHR5cGU9PT0ib2JqZWN0IiYmIXR5cGUucHJl dmVudERlZmF1bHQpe2Zvcih2YXIga2V5IGluIHR5cGUpe3RoaXMudW5iaW5kKGtl eSx0eXBlW2tleV0pO319ZWxzZXtmb3IodmFyIGk9MCxsPXRoaXMubGVuZ3RoO2k8 bDtpKyspe2pRdWVyeS5ldmVudC5yZW1vdmUodGhpc1tpXSx0eXBlLGZuKTt9fQpy ZXR1cm4gdGhpczt9LGRlbGVnYXRlOmZ1bmN0aW9uKHNlbGVjdG9yLHR5cGVzLGRh dGEsZm4pe3JldHVybiB0aGlzLmxpdmUodHlwZXMsZGF0YSxmbixzZWxlY3Rvcik7 fSx1bmRlbGVnYXRlOmZ1bmN0aW9uKHNlbGVjdG9yLHR5cGVzLGZuKXtpZihhcmd1 bWVudHMubGVuZ3RoPT09MCl7cmV0dXJuIHRoaXMudW5iaW5kKCJsaXZlIik7fWVs c2V7cmV0dXJuIHRoaXMuZGllKHR5cGVzLG51bGwsZm4sc2VsZWN0b3IpO319LHRy aWdnZXI6ZnVuY3Rpb24odHlwZSxkYXRhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0 aW9uKCl7alF1ZXJ5LmV2ZW50LnRyaWdnZXIodHlwZSxkYXRhLHRoaXMpO30pO30s dHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24odHlwZSxkYXRhKXtpZih0aGlzWzBdKXt2 YXIgZXZlbnQ9alF1ZXJ5LkV2ZW50KHR5cGUpO2V2ZW50LnByZXZlbnREZWZhdWx0 KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7alF1ZXJ5LmV2ZW50LnRyaWdnZXIo ZXZlbnQsZGF0YSx0aGlzWzBdKTtyZXR1cm4gZXZlbnQucmVzdWx0O319LHRvZ2ds ZTpmdW5jdGlvbihmbil7dmFyIGFyZ3M9YXJndW1lbnRzLGk9MTt3aGlsZShpPGFy Z3MubGVuZ3RoKXtqUXVlcnkucHJveHkoZm4sYXJnc1tpKytdKTt9CnJldHVybiB0 aGlzLmNsaWNrKGpRdWVyeS5wcm94eShmbixmdW5jdGlvbihldmVudCl7dmFyIGxh c3RUb2dnbGU9KGpRdWVyeS5kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2ZuLmd1aWQp fHwwKSVpO2pRdWVyeS5kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2ZuLmd1aWQsbGFz dFRvZ2dsZSsxKTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBhcmdzW2xh c3RUb2dnbGVdLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8ZmFsc2U7fSkpO30saG92 ZXI6ZnVuY3Rpb24oZm5PdmVyLGZuT3V0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVy KGZuT3ZlcikubW91c2VsZWF2ZShmbk91dHx8Zm5PdmVyKTt9fSk7dmFyIGxpdmVN YXA9e2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCIsbW91c2VlbnRlcjoi bW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9O2pRdWVyeS5lYWNoKFsi bGl2ZSIsImRpZSJdLGZ1bmN0aW9uKGksbmFtZSl7alF1ZXJ5LmZuW25hbWVdPWZ1 bmN0aW9uKHR5cGVzLGRhdGEsZm4sb3JpZ1NlbGVjdG9yKXt2YXIgdHlwZSxpPTAs bWF0Y2gsbmFtZXNwYWNlcyxwcmVUeXBlLHNlbGVjdG9yPW9yaWdTZWxlY3Rvcnx8 dGhpcy5zZWxlY3Rvcixjb250ZXh0PW9yaWdTZWxlY3Rvcj90aGlzOmpRdWVyeSh0 aGlzLmNvbnRleHQpO2lmKGpRdWVyeS5pc0Z1bmN0aW9uKGRhdGEpKXtmbj1kYXRh O2RhdGE9dW5kZWZpbmVkO30KdHlwZXM9KHR5cGVzfHwiIikuc3BsaXQoIiAiKTt3 aGlsZSgodHlwZT10eXBlc1tpKytdKSE9bnVsbCl7bWF0Y2g9cm5hbWVzcGFjZXMu ZXhlYyh0eXBlKTtuYW1lc3BhY2VzPSIiO2lmKG1hdGNoKXtuYW1lc3BhY2VzPW1h dGNoWzBdO3R5cGU9dHlwZS5yZXBsYWNlKHJuYW1lc3BhY2VzLCIiKTt9CmlmKHR5 cGU9PT0iaG92ZXIiKXt0eXBlcy5wdXNoKCJtb3VzZWVudGVyIituYW1lc3BhY2Vz LCJtb3VzZWxlYXZlIituYW1lc3BhY2VzKTtjb250aW51ZTt9CnByZVR5cGU9dHlw ZTtpZih0eXBlPT09ImZvY3VzInx8dHlwZT09PSJibHVyIil7dHlwZXMucHVzaChs aXZlTWFwW3R5cGVdK25hbWVzcGFjZXMpO3R5cGU9dHlwZStuYW1lc3BhY2VzO31l bHNle3R5cGU9KGxpdmVNYXBbdHlwZV18fHR5cGUpK25hbWVzcGFjZXM7fQppZihu YW1lPT09ImxpdmUiKXtjb250ZXh0LmVhY2goZnVuY3Rpb24oKXtqUXVlcnkuZXZl bnQuYWRkKHRoaXMsbGl2ZUNvbnZlcnQodHlwZSxzZWxlY3Rvcikse2RhdGE6ZGF0 YSxzZWxlY3RvcjpzZWxlY3RvcixoYW5kbGVyOmZuLG9yaWdUeXBlOnR5cGUsb3Jp Z0hhbmRsZXI6Zm4scHJlVHlwZTpwcmVUeXBlfSk7fSk7fWVsc2V7Y29udGV4dC51 bmJpbmQobGl2ZUNvbnZlcnQodHlwZSxzZWxlY3RvciksZm4pO319CnJldHVybiB0 aGlzO319KTtmdW5jdGlvbiBsaXZlSGFuZGxlcihldmVudCl7dmFyIHN0b3AsZWxl bXM9W10sc2VsZWN0b3JzPVtdLGFyZ3M9YXJndW1lbnRzLHJlbGF0ZWQsbWF0Y2gs aGFuZGxlT2JqLGVsZW0saixpLGwsZGF0YSxldmVudHM9alF1ZXJ5LmRhdGEodGhp cywiZXZlbnRzIik7aWYoZXZlbnQubGl2ZUZpcmVkPT09dGhpc3x8IWV2ZW50c3x8 IWV2ZW50cy5saXZlfHxldmVudC5idXR0b24mJmV2ZW50LnR5cGU9PT0iY2xpY2si KXtyZXR1cm47fQpldmVudC5saXZlRmlyZWQ9dGhpczt2YXIgbGl2ZT1ldmVudHMu bGl2ZS5zbGljZSgwKTtmb3Ioaj0wO2o8bGl2ZS5sZW5ndGg7aisrKXtoYW5kbGVP Ymo9bGl2ZVtqXTtpZihoYW5kbGVPYmoub3JpZ1R5cGUucmVwbGFjZShybmFtZXNw YWNlcywiIik9PT1ldmVudC50eXBlKXtzZWxlY3RvcnMucHVzaChoYW5kbGVPYmou c2VsZWN0b3IpO31lbHNle2xpdmUuc3BsaWNlKGotLSwxKTt9fQptYXRjaD1qUXVl cnkoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KHNlbGVjdG9ycyxldmVudC5jdXJyZW50 VGFyZ2V0KTtmb3IoaT0wLGw9bWF0Y2gubGVuZ3RoO2k8bDtpKyspe2ZvcihqPTA7 ajxsaXZlLmxlbmd0aDtqKyspe2hhbmRsZU9iaj1saXZlW2pdO2lmKG1hdGNoW2ld LnNlbGVjdG9yPT09aGFuZGxlT2JqLnNlbGVjdG9yKXtlbGVtPW1hdGNoW2ldLmVs ZW07cmVsYXRlZD1udWxsO2lmKGhhbmRsZU9iai5wcmVUeXBlPT09Im1vdXNlZW50 ZXIifHxoYW5kbGVPYmoucHJlVHlwZT09PSJtb3VzZWxlYXZlIil7cmVsYXRlZD1q UXVlcnkoZXZlbnQucmVsYXRlZFRhcmdldCkuY2xvc2VzdChoYW5kbGVPYmouc2Vs ZWN0b3IpWzBdO30KaWYoIXJlbGF0ZWR8fHJlbGF0ZWQhPT1lbGVtKXtlbGVtcy5w dXNoKHtlbGVtOmVsZW0saGFuZGxlT2JqOmhhbmRsZU9ian0pO319fX0KZm9yKGk9 MCxsPWVsZW1zLmxlbmd0aDtpPGw7aSsrKXttYXRjaD1lbGVtc1tpXTtldmVudC5j dXJyZW50VGFyZ2V0PW1hdGNoLmVsZW07ZXZlbnQuZGF0YT1tYXRjaC5oYW5kbGVP YmouZGF0YTtldmVudC5oYW5kbGVPYmo9bWF0Y2guaGFuZGxlT2JqO2lmKG1hdGNo LmhhbmRsZU9iai5vcmlnSGFuZGxlci5hcHBseShtYXRjaC5lbGVtLGFyZ3MpPT09 ZmFsc2Upe3N0b3A9ZmFsc2U7YnJlYWs7fX0KcmV0dXJuIHN0b3A7fQpmdW5jdGlv biBsaXZlQ29udmVydCh0eXBlLHNlbGVjdG9yKXtyZXR1cm4ibGl2ZS4iKyh0eXBl JiZ0eXBlIT09IioiP3R5cGUrIi4iOiIiKStzZWxlY3Rvci5yZXBsYWNlKC9cLi9n LCJgIikucmVwbGFjZSgvIC9nLCImIik7fQpqUXVlcnkuZWFjaCgoImJsdXIgZm9j dXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNs aWNrIGRibGNsaWNrICIrIm1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3Vz ZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlICIrImNoYW5nZSBz ZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IiKS5zcGxp dCgiICIpLGZ1bmN0aW9uKGksbmFtZSl7alF1ZXJ5LmZuW25hbWVdPWZ1bmN0aW9u KGZuKXtyZXR1cm4gZm4/dGhpcy5iaW5kKG5hbWUsZm4pOnRoaXMudHJpZ2dlcihu YW1lKTt9O2lmKGpRdWVyeS5hdHRyRm4pe2pRdWVyeS5hdHRyRm5bbmFtZV09dHJ1 ZTt9fSk7aWYod2luZG93LmF0dGFjaEV2ZW50JiYhd2luZG93LmFkZEV2ZW50TGlz dGVuZXIpe3dpbmRvdy5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7 Zm9yKHZhciBpZCBpbiBqUXVlcnkuY2FjaGUpe2lmKGpRdWVyeS5jYWNoZVtpZF0u aGFuZGxlKXt0cnl7alF1ZXJ5LmV2ZW50LnJlbW92ZShqUXVlcnkuY2FjaGVbaWRd LmhhbmRsZS5lbGVtKTt9Y2F0Y2goZSl7fX19fSk7fQooZnVuY3Rpb24oKXt2YXIg Y2h1bmtlcj0vKCg/OlwoKD86XChbXigpXStcKXxbXigpXSspK1wpfFxbKD86XFtb XltcXV0qXF18WyciXVteJyJdKlsnIl18W15bXF0nIl0rKStcXXxcXC58W14gPit+ LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZyxkb25l PTAsdG9TdHJpbmc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoYXNEdXBsaWNh dGU9ZmFsc2UsYmFzZUhhc0R1cGxpY2F0ZT10cnVlO1swLDBdLnNvcnQoZnVuY3Rp b24oKXtiYXNlSGFzRHVwbGljYXRlPWZhbHNlO3JldHVybiAwO30pO3ZhciBTaXp6 bGU9ZnVuY3Rpb24oc2VsZWN0b3IsY29udGV4dCxyZXN1bHRzLHNlZWQpe3Jlc3Vs dHM9cmVzdWx0c3x8W107dmFyIG9yaWdDb250ZXh0PWNvbnRleHQ9Y29udGV4dHx8 ZG9jdW1lbnQ7aWYoY29udGV4dC5ub2RlVHlwZSE9PTEmJmNvbnRleHQubm9kZVR5 cGUhPT05KXtyZXR1cm5bXTt9CmlmKCFzZWxlY3Rvcnx8dHlwZW9mIHNlbGVjdG9y IT09InN0cmluZyIpe3JldHVybiByZXN1bHRzO30KdmFyIHBhcnRzPVtdLG0sc2V0 LGNoZWNrU2V0LGV4dHJhLHBydW5lPXRydWUsY29udGV4dFhNTD1pc1hNTChjb250 ZXh0KSxzb0Zhcj1zZWxlY3Rvcjt3aGlsZSgoY2h1bmtlci5leGVjKCIiKSxtPWNo dW5rZXIuZXhlYyhzb0ZhcikpIT09bnVsbCl7c29GYXI9bVszXTtwYXJ0cy5wdXNo KG1bMV0pO2lmKG1bMl0pe2V4dHJhPW1bM107YnJlYWs7fX0KaWYocGFydHMubGVu Z3RoPjEmJm9yaWdQT1MuZXhlYyhzZWxlY3Rvcikpe2lmKHBhcnRzLmxlbmd0aD09 PTImJkV4cHIucmVsYXRpdmVbcGFydHNbMF1dKXtzZXQ9cG9zUHJvY2VzcyhwYXJ0 c1swXStwYXJ0c1sxXSxjb250ZXh0KTt9ZWxzZXtzZXQ9RXhwci5yZWxhdGl2ZVtw YXJ0c1swXV0/W2NvbnRleHRdOlNpenpsZShwYXJ0cy5zaGlmdCgpLGNvbnRleHQp O3doaWxlKHBhcnRzLmxlbmd0aCl7c2VsZWN0b3I9cGFydHMuc2hpZnQoKTtpZihF eHByLnJlbGF0aXZlW3NlbGVjdG9yXSl7c2VsZWN0b3IrPXBhcnRzLnNoaWZ0KCk7 fQpzZXQ9cG9zUHJvY2VzcyhzZWxlY3RvcixzZXQpO319fWVsc2V7aWYoIXNlZWQm JnBhcnRzLmxlbmd0aD4xJiZjb250ZXh0Lm5vZGVUeXBlPT09OSYmIWNvbnRleHRY TUwmJkV4cHIubWF0Y2guSUQudGVzdChwYXJ0c1swXSkmJiFFeHByLm1hdGNoLklE LnRlc3QocGFydHNbcGFydHMubGVuZ3RoLTFdKSl7dmFyIHJldD1TaXp6bGUuZmlu ZChwYXJ0cy5zaGlmdCgpLGNvbnRleHQsY29udGV4dFhNTCk7Y29udGV4dD1yZXQu ZXhwcj9TaXp6bGUuZmlsdGVyKHJldC5leHByLHJldC5zZXQpWzBdOnJldC5zZXRb MF07fQppZihjb250ZXh0KXt2YXIgcmV0PXNlZWQ/e2V4cHI6cGFydHMucG9wKCks c2V0Om1ha2VBcnJheShzZWVkKX06U2l6emxlLmZpbmQocGFydHMucG9wKCkscGFy dHMubGVuZ3RoPT09MSYmKHBhcnRzWzBdPT09In4ifHxwYXJ0c1swXT09PSIrIikm JmNvbnRleHQucGFyZW50Tm9kZT9jb250ZXh0LnBhcmVudE5vZGU6Y29udGV4dCxj b250ZXh0WE1MKTtzZXQ9cmV0LmV4cHI/U2l6emxlLmZpbHRlcihyZXQuZXhwcixy ZXQuc2V0KTpyZXQuc2V0O2lmKHBhcnRzLmxlbmd0aD4wKXtjaGVja1NldD1tYWtl QXJyYXkoc2V0KTt9ZWxzZXtwcnVuZT1mYWxzZTt9CndoaWxlKHBhcnRzLmxlbmd0 aCl7dmFyIGN1cj1wYXJ0cy5wb3AoKSxwb3A9Y3VyO2lmKCFFeHByLnJlbGF0aXZl W2N1cl0pe2N1cj0iIjt9ZWxzZXtwb3A9cGFydHMucG9wKCk7fQppZihwb3A9PW51 bGwpe3BvcD1jb250ZXh0O30KRXhwci5yZWxhdGl2ZVtjdXJdKGNoZWNrU2V0LHBv cCxjb250ZXh0WE1MKTt9fWVsc2V7Y2hlY2tTZXQ9cGFydHM9W107fX0KaWYoIWNo ZWNrU2V0KXtjaGVja1NldD1zZXQ7fQppZighY2hlY2tTZXQpe1NpenpsZS5lcnJv cihjdXJ8fHNlbGVjdG9yKTt9CmlmKHRvU3RyaW5nLmNhbGwoY2hlY2tTZXQpPT09 IltvYmplY3QgQXJyYXldIil7aWYoIXBydW5lKXtyZXN1bHRzLnB1c2guYXBwbHko cmVzdWx0cyxjaGVja1NldCk7fWVsc2UgaWYoY29udGV4dCYmY29udGV4dC5ub2Rl VHlwZT09PTEpe2Zvcih2YXIgaT0wO2NoZWNrU2V0W2ldIT1udWxsO2krKyl7aWYo Y2hlY2tTZXRbaV0mJihjaGVja1NldFtpXT09PXRydWV8fGNoZWNrU2V0W2ldLm5v ZGVUeXBlPT09MSYmY29udGFpbnMoY29udGV4dCxjaGVja1NldFtpXSkpKXtyZXN1 bHRzLnB1c2goc2V0W2ldKTt9fX1lbHNle2Zvcih2YXIgaT0wO2NoZWNrU2V0W2ld IT1udWxsO2krKyl7aWYoY2hlY2tTZXRbaV0mJmNoZWNrU2V0W2ldLm5vZGVUeXBl PT09MSl7cmVzdWx0cy5wdXNoKHNldFtpXSk7fX19fWVsc2V7bWFrZUFycmF5KGNo ZWNrU2V0LHJlc3VsdHMpO30KaWYoZXh0cmEpe1NpenpsZShleHRyYSxvcmlnQ29u dGV4dCxyZXN1bHRzLHNlZWQpO1NpenpsZS51bmlxdWVTb3J0KHJlc3VsdHMpO30K cmV0dXJuIHJlc3VsdHM7fTtTaXp6bGUudW5pcXVlU29ydD1mdW5jdGlvbihyZXN1 bHRzKXtpZihzb3J0T3JkZXIpe2hhc0R1cGxpY2F0ZT1iYXNlSGFzRHVwbGljYXRl O3Jlc3VsdHMuc29ydChzb3J0T3JkZXIpO2lmKGhhc0R1cGxpY2F0ZSl7Zm9yKHZh ciBpPTE7aTxyZXN1bHRzLmxlbmd0aDtpKyspe2lmKHJlc3VsdHNbaV09PT1yZXN1 bHRzW2ktMV0pe3Jlc3VsdHMuc3BsaWNlKGktLSwxKTt9fX19CnJldHVybiByZXN1 bHRzO307U2l6emxlLm1hdGNoZXM9ZnVuY3Rpb24oZXhwcixzZXQpe3JldHVybiBT aXp6bGUoZXhwcixudWxsLG51bGwsc2V0KTt9O1NpenpsZS5maW5kPWZ1bmN0aW9u KGV4cHIsY29udGV4dCxpc1hNTCl7dmFyIHNldCxtYXRjaDtpZighZXhwcil7cmV0 dXJuW107fQpmb3IodmFyIGk9MCxsPUV4cHIub3JkZXIubGVuZ3RoO2k8bDtpKysp e3ZhciB0eXBlPUV4cHIub3JkZXJbaV0sbWF0Y2g7aWYoKG1hdGNoPUV4cHIubGVm dE1hdGNoW3R5cGVdLmV4ZWMoZXhwcikpKXt2YXIgbGVmdD1tYXRjaFsxXTttYXRj aC5zcGxpY2UoMSwxKTtpZihsZWZ0LnN1YnN0cihsZWZ0Lmxlbmd0aC0xKSE9PSJc XCIpe21hdGNoWzFdPShtYXRjaFsxXXx8IiIpLnJlcGxhY2UoL1xcL2csIiIpO3Nl dD1FeHByLmZpbmRbdHlwZV0obWF0Y2gsY29udGV4dCxpc1hNTCk7aWYoc2V0IT1u dWxsKXtleHByPWV4cHIucmVwbGFjZShFeHByLm1hdGNoW3R5cGVdLCIiKTticmVh azt9fX19CmlmKCFzZXQpe3NldD1jb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1l KCIqIik7fQpyZXR1cm57c2V0OnNldCxleHByOmV4cHJ9O307U2l6emxlLmZpbHRl cj1mdW5jdGlvbihleHByLHNldCxpbnBsYWNlLG5vdCl7dmFyIG9sZD1leHByLHJl c3VsdD1bXSxjdXJMb29wPXNldCxtYXRjaCxhbnlGb3VuZCxpc1hNTEZpbHRlcj1z ZXQmJnNldFswXSYmaXNYTUwoc2V0WzBdKTt3aGlsZShleHByJiZzZXQubGVuZ3Ro KXtmb3IodmFyIHR5cGUgaW4gRXhwci5maWx0ZXIpe2lmKChtYXRjaD1FeHByLmxl ZnRNYXRjaFt0eXBlXS5leGVjKGV4cHIpKSE9bnVsbCYmbWF0Y2hbMl0pe3ZhciBm aWx0ZXI9RXhwci5maWx0ZXJbdHlwZV0sZm91bmQsaXRlbSxsZWZ0PW1hdGNoWzFd O2FueUZvdW5kPWZhbHNlO21hdGNoLnNwbGljZSgxLDEpO2lmKGxlZnQuc3Vic3Ry KGxlZnQubGVuZ3RoLTEpPT09IlxcIil7Y29udGludWU7fQppZihjdXJMb29wPT09 cmVzdWx0KXtyZXN1bHQ9W107fQppZihFeHByLnByZUZpbHRlclt0eXBlXSl7bWF0 Y2g9RXhwci5wcmVGaWx0ZXJbdHlwZV0obWF0Y2gsY3VyTG9vcCxpbnBsYWNlLHJl c3VsdCxub3QsaXNYTUxGaWx0ZXIpO2lmKCFtYXRjaCl7YW55Rm91bmQ9Zm91bmQ9 dHJ1ZTt9ZWxzZSBpZihtYXRjaD09PXRydWUpe2NvbnRpbnVlO319CmlmKG1hdGNo KXtmb3IodmFyIGk9MDsoaXRlbT1jdXJMb29wW2ldKSE9bnVsbDtpKyspe2lmKGl0 ZW0pe2ZvdW5kPWZpbHRlcihpdGVtLG1hdGNoLGksY3VyTG9vcCk7dmFyIHBhc3M9 bm90XiEhZm91bmQ7aWYoaW5wbGFjZSYmZm91bmQhPW51bGwpe2lmKHBhc3Mpe2Fu eUZvdW5kPXRydWU7fWVsc2V7Y3VyTG9vcFtpXT1mYWxzZTt9fWVsc2UgaWYocGFz cyl7cmVzdWx0LnB1c2goaXRlbSk7YW55Rm91bmQ9dHJ1ZTt9fX19CmlmKGZvdW5k IT09dW5kZWZpbmVkKXtpZighaW5wbGFjZSl7Y3VyTG9vcD1yZXN1bHQ7fQpleHBy PWV4cHIucmVwbGFjZShFeHByLm1hdGNoW3R5cGVdLCIiKTtpZighYW55Rm91bmQp e3JldHVybltdO30KYnJlYWs7fX19CmlmKGV4cHI9PT1vbGQpe2lmKGFueUZvdW5k PT1udWxsKXtTaXp6bGUuZXJyb3IoZXhwcik7fWVsc2V7YnJlYWs7fX0Kb2xkPWV4 cHI7fQpyZXR1cm4gY3VyTG9vcDt9O1NpenpsZS5lcnJvcj1mdW5jdGlvbihtc2cp e3Rocm93IlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIr bXNnO307dmFyIEV4cHI9U2l6emxlLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5B TUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRi1dfFxc LikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkYtXXxcXC4pKykvLE5B TUU6L1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGLV18XFwuKSspWyci XSpcXS8sQVRUUjovXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRi1dfFxcLikrKVxz Kig/OihcUz89KVxzKihbJyJdKikoLio/KVwzfClccypcXS8sVEFHOi9eKCg/Oltc d1x1MDBjMC1cdUZGRkZcKi1dfFxcLikrKS8sQ0hJTEQ6Lzoob25seXxudGh8bGFz dHxmaXJzdCktY2hpbGQoPzpcKChldmVufG9kZHxbXGRuKy1dKilcKSk/LyxQT1M6 LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwp KT8oPz1bXi1dfCQpLyxQU0VVRE86LzooKD86W1x3XHUwMGMwLVx1RkZGRi1dfFxc LikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/ L30sbGVmdE1hdGNoOnt9LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZv ciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGVsZW0pe3Jl dHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaHJlZiIpO319LHJlbGF0aXZlOnsiKyI6 ZnVuY3Rpb24oY2hlY2tTZXQscGFydCl7dmFyIGlzUGFydFN0cj10eXBlb2YgcGFy dD09PSJzdHJpbmciLGlzVGFnPWlzUGFydFN0ciYmIS9cVy8udGVzdChwYXJ0KSxp c1BhcnRTdHJOb3RUYWc9aXNQYXJ0U3RyJiYhaXNUYWc7aWYoaXNUYWcpe3BhcnQ9 cGFydC50b0xvd2VyQ2FzZSgpO30KZm9yKHZhciBpPTAsbD1jaGVja1NldC5sZW5n dGgsZWxlbTtpPGw7aSsrKXtpZigoZWxlbT1jaGVja1NldFtpXSkpe3doaWxlKChl bGVtPWVsZW0ucHJldmlvdXNTaWJsaW5nKSYmZWxlbS5ub2RlVHlwZSE9PTEpe30K Y2hlY2tTZXRbaV09aXNQYXJ0U3RyTm90VGFnfHxlbGVtJiZlbGVtLm5vZGVOYW1l LnRvTG93ZXJDYXNlKCk9PT1wYXJ0P2VsZW18fGZhbHNlOmVsZW09PT1wYXJ0O319 CmlmKGlzUGFydFN0ck5vdFRhZyl7U2l6emxlLmZpbHRlcihwYXJ0LGNoZWNrU2V0 LHRydWUpO319LCI+IjpmdW5jdGlvbihjaGVja1NldCxwYXJ0KXt2YXIgaXNQYXJ0 U3RyPXR5cGVvZiBwYXJ0PT09InN0cmluZyI7aWYoaXNQYXJ0U3RyJiYhL1xXLy50 ZXN0KHBhcnQpKXtwYXJ0PXBhcnQudG9Mb3dlckNhc2UoKTtmb3IodmFyIGk9MCxs PWNoZWNrU2V0Lmxlbmd0aDtpPGw7aSsrKXt2YXIgZWxlbT1jaGVja1NldFtpXTtp ZihlbGVtKXt2YXIgcGFyZW50PWVsZW0ucGFyZW50Tm9kZTtjaGVja1NldFtpXT1w YXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXBhcnQ/cGFyZW50OmZhbHNl O319fWVsc2V7Zm9yKHZhciBpPTAsbD1jaGVja1NldC5sZW5ndGg7aTxsO2krKyl7 dmFyIGVsZW09Y2hlY2tTZXRbaV07aWYoZWxlbSl7Y2hlY2tTZXRbaV09aXNQYXJ0 U3RyP2VsZW0ucGFyZW50Tm9kZTplbGVtLnBhcmVudE5vZGU9PT1wYXJ0O319Cmlm KGlzUGFydFN0cil7U2l6emxlLmZpbHRlcihwYXJ0LGNoZWNrU2V0LHRydWUpO319 fSwiIjpmdW5jdGlvbihjaGVja1NldCxwYXJ0LGlzWE1MKXt2YXIgZG9uZU5hbWU9 ZG9uZSsrLGNoZWNrRm49ZGlyQ2hlY2s7aWYodHlwZW9mIHBhcnQ9PT0ic3RyaW5n IiYmIS9cVy8udGVzdChwYXJ0KSl7dmFyIG5vZGVDaGVjaz1wYXJ0PXBhcnQudG9M b3dlckNhc2UoKTtjaGVja0ZuPWRpck5vZGVDaGVjazt9CmNoZWNrRm4oInBhcmVu dE5vZGUiLHBhcnQsZG9uZU5hbWUsY2hlY2tTZXQsbm9kZUNoZWNrLGlzWE1MKTt9 LCJ+IjpmdW5jdGlvbihjaGVja1NldCxwYXJ0LGlzWE1MKXt2YXIgZG9uZU5hbWU9 ZG9uZSsrLGNoZWNrRm49ZGlyQ2hlY2s7aWYodHlwZW9mIHBhcnQ9PT0ic3RyaW5n IiYmIS9cVy8udGVzdChwYXJ0KSl7dmFyIG5vZGVDaGVjaz1wYXJ0PXBhcnQudG9M b3dlckNhc2UoKTtjaGVja0ZuPWRpck5vZGVDaGVjazt9CmNoZWNrRm4oInByZXZp b3VzU2libGluZyIscGFydCxkb25lTmFtZSxjaGVja1NldCxub2RlQ2hlY2ssaXNY TUwpO319LGZpbmQ6e0lEOmZ1bmN0aW9uKG1hdGNoLGNvbnRleHQsaXNYTUwpe2lm KHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkIT09InVuZGVmaW5lZCImJiFp c1hNTCl7dmFyIG09Y29udGV4dC5nZXRFbGVtZW50QnlJZChtYXRjaFsxXSk7cmV0 dXJuIG0/W21dOltdO319LE5BTUU6ZnVuY3Rpb24obWF0Y2gsY29udGV4dCl7aWYo dHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUhPT0idW5kZWZpbmVkIil7 dmFyIHJldD1bXSxyZXN1bHRzPWNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUobWF0 Y2hbMV0pO2Zvcih2YXIgaT0wLGw9cmVzdWx0cy5sZW5ndGg7aTxsO2krKyl7aWYo cmVzdWx0c1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PW1hdGNoWzFdKXtyZXQu cHVzaChyZXN1bHRzW2ldKTt9fQpyZXR1cm4gcmV0Lmxlbmd0aD09PTA/bnVsbDpy ZXQ7fX0sVEFHOmZ1bmN0aW9uKG1hdGNoLGNvbnRleHQpe3JldHVybiBjb250ZXh0 LmdldEVsZW1lbnRzQnlUYWdOYW1lKG1hdGNoWzFdKTt9fSxwcmVGaWx0ZXI6e0NM QVNTOmZ1bmN0aW9uKG1hdGNoLGN1ckxvb3AsaW5wbGFjZSxyZXN1bHQsbm90LGlz WE1MKXttYXRjaD0iICIrbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywiIikrIiAiO2lm KGlzWE1MKXtyZXR1cm4gbWF0Y2g7fQpmb3IodmFyIGk9MCxlbGVtOyhlbGVtPWN1 ckxvb3BbaV0pIT1udWxsO2krKyl7aWYoZWxlbSl7aWYobm90XihlbGVtLmNsYXNz TmFtZSYmKCIgIitlbGVtLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoL1tcdFxuXS9n LCIgIikuaW5kZXhPZihtYXRjaCk+PTApKXtpZighaW5wbGFjZSl7cmVzdWx0LnB1 c2goZWxlbSk7fX1lbHNlIGlmKGlucGxhY2Upe2N1ckxvb3BbaV09ZmFsc2U7fX19 CnJldHVybiBmYWxzZTt9LElEOmZ1bmN0aW9uKG1hdGNoKXtyZXR1cm4gbWF0Y2hb MV0ucmVwbGFjZSgvXFwvZywiIik7fSxUQUc6ZnVuY3Rpb24obWF0Y2gsY3VyTG9v cCl7cmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7fSxDSElMRDpmdW5jdGlv bihtYXRjaCl7aWYobWF0Y2hbMV09PT0ibnRoIil7dmFyIHRlc3Q9LygtPykoXGQq KW4oKD86XCt8LSk/XGQqKS8uZXhlYyhtYXRjaFsyXT09PSJldmVuIiYmIjJuInx8 bWF0Y2hbMl09PT0ib2RkIiYmIjJuKzEifHwhL1xELy50ZXN0KG1hdGNoWzJdKSYm IjBuKyIrbWF0Y2hbMl18fG1hdGNoWzJdKTttYXRjaFsyXT0odGVzdFsxXSsodGVz dFsyXXx8MSkpLTA7bWF0Y2hbM109dGVzdFszXS0wO30KbWF0Y2hbMF09ZG9uZSsr O3JldHVybiBtYXRjaDt9LEFUVFI6ZnVuY3Rpb24obWF0Y2gsY3VyTG9vcCxpbnBs YWNlLHJlc3VsdCxub3QsaXNYTUwpe3ZhciBuYW1lPW1hdGNoWzFdLnJlcGxhY2Uo L1xcL2csIiIpO2lmKCFpc1hNTCYmRXhwci5hdHRyTWFwW25hbWVdKXttYXRjaFsx XT1FeHByLmF0dHJNYXBbbmFtZV07fQppZihtYXRjaFsyXT09PSJ+PSIpe21hdGNo WzRdPSIgIittYXRjaFs0XSsiICI7fQpyZXR1cm4gbWF0Y2g7fSxQU0VVRE86ZnVu Y3Rpb24obWF0Y2gsY3VyTG9vcCxpbnBsYWNlLHJlc3VsdCxub3Qpe2lmKG1hdGNo WzFdPT09Im5vdCIpe2lmKChjaHVua2VyLmV4ZWMobWF0Y2hbM10pfHwiIikubGVu Z3RoPjF8fC9eXHcvLnRlc3QobWF0Y2hbM10pKXttYXRjaFszXT1TaXp6bGUobWF0 Y2hbM10sbnVsbCxudWxsLGN1ckxvb3ApO31lbHNle3ZhciByZXQ9U2l6emxlLmZp bHRlcihtYXRjaFszXSxjdXJMb29wLGlucGxhY2UsdHJ1ZV5ub3QpO2lmKCFpbnBs YWNlKXtyZXN1bHQucHVzaC5hcHBseShyZXN1bHQscmV0KTt9CnJldHVybiBmYWxz ZTt9fWVsc2UgaWYoRXhwci5tYXRjaC5QT1MudGVzdChtYXRjaFswXSl8fEV4cHIu bWF0Y2guQ0hJTEQudGVzdChtYXRjaFswXSkpe3JldHVybiB0cnVlO30KcmV0dXJu IG1hdGNoO30sUE9TOmZ1bmN0aW9uKG1hdGNoKXttYXRjaC51bnNoaWZ0KHRydWUp O3JldHVybiBtYXRjaDt9fSxmaWx0ZXJzOntlbmFibGVkOmZ1bmN0aW9uKGVsZW0p e3JldHVybiBlbGVtLmRpc2FibGVkPT09ZmFsc2UmJmVsZW0udHlwZSE9PSJoaWRk ZW4iO30sZGlzYWJsZWQ6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0uZGlzYWJs ZWQ9PT10cnVlO30sY2hlY2tlZDpmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5j aGVja2VkPT09dHJ1ZTt9LHNlbGVjdGVkOmZ1bmN0aW9uKGVsZW0pe2VsZW0ucGFy ZW50Tm9kZS5zZWxlY3RlZEluZGV4O3JldHVybiBlbGVtLnNlbGVjdGVkPT09dHJ1 ZTt9LHBhcmVudDpmdW5jdGlvbihlbGVtKXtyZXR1cm4hIWVsZW0uZmlyc3RDaGls ZDt9LGVtcHR5OmZ1bmN0aW9uKGVsZW0pe3JldHVybiFlbGVtLmZpcnN0Q2hpbGQ7 fSxoYXM6ZnVuY3Rpb24oZWxlbSxpLG1hdGNoKXtyZXR1cm4hIVNpenpsZShtYXRj aFszXSxlbGVtKS5sZW5ndGg7fSxoZWFkZXI6ZnVuY3Rpb24oZWxlbSl7cmV0dXJu L2hcZC9pLnRlc3QoZWxlbS5ub2RlTmFtZSk7fSx0ZXh0OmZ1bmN0aW9uKGVsZW0p e3JldHVybiJ0ZXh0Ij09PWVsZW0udHlwZTt9LHJhZGlvOmZ1bmN0aW9uKGVsZW0p e3JldHVybiJyYWRpbyI9PT1lbGVtLnR5cGU7fSxjaGVja2JveDpmdW5jdGlvbihl bGVtKXtyZXR1cm4iY2hlY2tib3giPT09ZWxlbS50eXBlO30sZmlsZTpmdW5jdGlv bihlbGVtKXtyZXR1cm4iZmlsZSI9PT1lbGVtLnR5cGU7fSxwYXNzd29yZDpmdW5j dGlvbihlbGVtKXtyZXR1cm4icGFzc3dvcmQiPT09ZWxlbS50eXBlO30sc3VibWl0 OmZ1bmN0aW9uKGVsZW0pe3JldHVybiJzdWJtaXQiPT09ZWxlbS50eXBlO30saW1h Z2U6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuImltYWdlIj09PWVsZW0udHlwZTt9LHJl c2V0OmZ1bmN0aW9uKGVsZW0pe3JldHVybiJyZXNldCI9PT1lbGVtLnR5cGU7fSxi dXR0b246ZnVuY3Rpb24oZWxlbSl7cmV0dXJuImJ1dHRvbiI9PT1lbGVtLnR5cGV8 fGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJidXR0b24iO30saW5wdXQ6 ZnVuY3Rpb24oZWxlbSl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0 b24vaS50ZXN0KGVsZW0ubm9kZU5hbWUpO319LHNldEZpbHRlcnM6e2ZpcnN0OmZ1 bmN0aW9uKGVsZW0saSl7cmV0dXJuIGk9PT0wO30sbGFzdDpmdW5jdGlvbihlbGVt LGksbWF0Y2gsYXJyYXkpe3JldHVybiBpPT09YXJyYXkubGVuZ3RoLTE7fSxldmVu OmZ1bmN0aW9uKGVsZW0saSl7cmV0dXJuIGklMj09PTA7fSxvZGQ6ZnVuY3Rpb24o ZWxlbSxpKXtyZXR1cm4gaSUyPT09MTt9LGx0OmZ1bmN0aW9uKGVsZW0saSxtYXRj aCl7cmV0dXJuIGk8bWF0Y2hbM10tMDt9LGd0OmZ1bmN0aW9uKGVsZW0saSxtYXRj aCl7cmV0dXJuIGk+bWF0Y2hbM10tMDt9LG50aDpmdW5jdGlvbihlbGVtLGksbWF0 Y2gpe3JldHVybiBtYXRjaFszXS0wPT09aTt9LGVxOmZ1bmN0aW9uKGVsZW0saSxt YXRjaCl7cmV0dXJuIG1hdGNoWzNdLTA9PT1pO319LGZpbHRlcjp7UFNFVURPOmZ1 bmN0aW9uKGVsZW0sbWF0Y2gsaSxhcnJheSl7dmFyIG5hbWU9bWF0Y2hbMV0sZmls dGVyPUV4cHIuZmlsdGVyc1tuYW1lXTtpZihmaWx0ZXIpe3JldHVybiBmaWx0ZXIo ZWxlbSxpLG1hdGNoLGFycmF5KTt9ZWxzZSBpZihuYW1lPT09ImNvbnRhaW5zIil7 cmV0dXJuKGVsZW0udGV4dENvbnRlbnR8fGVsZW0uaW5uZXJUZXh0fHxnZXRUZXh0 KFtlbGVtXSl8fCIiKS5pbmRleE9mKG1hdGNoWzNdKT49MDt9ZWxzZSBpZihuYW1l PT09Im5vdCIpe3ZhciBub3Q9bWF0Y2hbM107Zm9yKHZhciBpPTAsbD1ub3QubGVu Z3RoO2k8bDtpKyspe2lmKG5vdFtpXT09PWVsZW0pe3JldHVybiBmYWxzZTt9fQpy ZXR1cm4gdHJ1ZTt9ZWxzZXtTaXp6bGUuZXJyb3IoIlN5bnRheCBlcnJvciwgdW5y ZWNvZ25pemVkIGV4cHJlc3Npb246ICIrbmFtZSk7fX0sQ0hJTEQ6ZnVuY3Rpb24o ZWxlbSxtYXRjaCl7dmFyIHR5cGU9bWF0Y2hbMV0sbm9kZT1lbGVtO3N3aXRjaCh0 eXBlKXtjYXNlJ29ubHknOmNhc2UnZmlyc3QnOndoaWxlKChub2RlPW5vZGUucHJl dmlvdXNTaWJsaW5nKSl7aWYobm9kZS5ub2RlVHlwZT09PTEpe3JldHVybiBmYWxz ZTt9fQppZih0eXBlPT09ImZpcnN0Iil7cmV0dXJuIHRydWU7fQpub2RlPWVsZW07 Y2FzZSdsYXN0Jzp3aGlsZSgobm9kZT1ub2RlLm5leHRTaWJsaW5nKSl7aWYobm9k ZS5ub2RlVHlwZT09PTEpe3JldHVybiBmYWxzZTt9fQpyZXR1cm4gdHJ1ZTtjYXNl J250aCc6dmFyIGZpcnN0PW1hdGNoWzJdLGxhc3Q9bWF0Y2hbM107aWYoZmlyc3Q9 PT0xJiZsYXN0PT09MCl7cmV0dXJuIHRydWU7fQp2YXIgZG9uZU5hbWU9bWF0Y2hb MF0scGFyZW50PWVsZW0ucGFyZW50Tm9kZTtpZihwYXJlbnQmJihwYXJlbnQuc2l6 Y2FjaGUhPT1kb25lTmFtZXx8IWVsZW0ubm9kZUluZGV4KSl7dmFyIGNvdW50PTA7 Zm9yKG5vZGU9cGFyZW50LmZpcnN0Q2hpbGQ7bm9kZTtub2RlPW5vZGUubmV4dFNp Ymxpbmcpe2lmKG5vZGUubm9kZVR5cGU9PT0xKXtub2RlLm5vZGVJbmRleD0rK2Nv dW50O319CnBhcmVudC5zaXpjYWNoZT1kb25lTmFtZTt9CnZhciBkaWZmPWVsZW0u bm9kZUluZGV4LWxhc3Q7aWYoZmlyc3Q9PT0wKXtyZXR1cm4gZGlmZj09PTA7fWVs c2V7cmV0dXJuKGRpZmYlZmlyc3Q9PT0wJiZkaWZmL2ZpcnN0Pj0wKTt9fX0sSUQ6 ZnVuY3Rpb24oZWxlbSxtYXRjaCl7cmV0dXJuIGVsZW0ubm9kZVR5cGU9PT0xJiZl bGVtLmdldEF0dHJpYnV0ZSgiaWQiKT09PW1hdGNoO30sVEFHOmZ1bmN0aW9uKGVs ZW0sbWF0Y2gpe3JldHVybihtYXRjaD09PSIqIiYmZWxlbS5ub2RlVHlwZT09PTEp fHxlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1tYXRjaDt9LENMQVNTOmZ1 bmN0aW9uKGVsZW0sbWF0Y2gpe3JldHVybigiICIrKGVsZW0uY2xhc3NOYW1lfHxl bGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkrIiAiKS5pbmRleE9mKG1hdGNoKT4t MTt9LEFUVFI6ZnVuY3Rpb24oZWxlbSxtYXRjaCl7dmFyIG5hbWU9bWF0Y2hbMV0s cmVzdWx0PUV4cHIuYXR0ckhhbmRsZVtuYW1lXT9FeHByLmF0dHJIYW5kbGVbbmFt ZV0oZWxlbSk6ZWxlbVtuYW1lXSE9bnVsbD9lbGVtW25hbWVdOmVsZW0uZ2V0QXR0 cmlidXRlKG5hbWUpLHZhbHVlPXJlc3VsdCsiIix0eXBlPW1hdGNoWzJdLGNoZWNr PW1hdGNoWzRdO3JldHVybiByZXN1bHQ9PW51bGw/dHlwZT09PSIhPSI6dHlwZT09 PSI9Ij92YWx1ZT09PWNoZWNrOnR5cGU9PT0iKj0iP3ZhbHVlLmluZGV4T2YoY2hl Y2spPj0wOnR5cGU9PT0ifj0iPygiICIrdmFsdWUrIiAiKS5pbmRleE9mKGNoZWNr KT49MDohY2hlY2s/dmFsdWUmJnJlc3VsdCE9PWZhbHNlOnR5cGU9PT0iIT0iP3Zh bHVlIT09Y2hlY2s6dHlwZT09PSJePSI/dmFsdWUuaW5kZXhPZihjaGVjayk9PT0w OnR5cGU9PT0iJD0iP3ZhbHVlLnN1YnN0cih2YWx1ZS5sZW5ndGgtY2hlY2subGVu Z3RoKT09PWNoZWNrOnR5cGU9PT0ifD0iP3ZhbHVlPT09Y2hlY2t8fHZhbHVlLnN1 YnN0cigwLGNoZWNrLmxlbmd0aCsxKT09PWNoZWNrKyItIjpmYWxzZTt9LFBPUzpm dW5jdGlvbihlbGVtLG1hdGNoLGksYXJyYXkpe3ZhciBuYW1lPW1hdGNoWzJdLGZp bHRlcj1FeHByLnNldEZpbHRlcnNbbmFtZV07aWYoZmlsdGVyKXtyZXR1cm4gZmls dGVyKGVsZW0saSxtYXRjaCxhcnJheSk7fX19fTt2YXIgb3JpZ1BPUz1FeHByLm1h dGNoLlBPUztmb3IodmFyIHR5cGUgaW4gRXhwci5tYXRjaCl7RXhwci5tYXRjaFt0 eXBlXT1uZXcgUmVnRXhwKEV4cHIubWF0Y2hbdHlwZV0uc291cmNlKy8oPyFbXlxb XSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSk7RXhwci5sZWZ0TWF0Y2hbdHlwZV09 bmV3IFJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK0V4cHIubWF0Y2hb dHlwZV0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxmdW5jdGlvbihhbGwsbnVt KXtyZXR1cm4iXFwiKyhudW0tMCsxKTt9KSk7fQp2YXIgbWFrZUFycmF5PWZ1bmN0 aW9uKGFycmF5LHJlc3VsdHMpe2FycmF5PUFycmF5LnByb3RvdHlwZS5zbGljZS5j YWxsKGFycmF5LDApO2lmKHJlc3VsdHMpe3Jlc3VsdHMucHVzaC5hcHBseShyZXN1 bHRzLGFycmF5KTtyZXR1cm4gcmVzdWx0czt9CnJldHVybiBhcnJheTt9O3RyeXtB cnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5kb2N1bWVudEVsZW1l bnQuY2hpbGROb2RlcywwKVswXS5ub2RlVHlwZTt9Y2F0Y2goZSl7bWFrZUFycmF5 PWZ1bmN0aW9uKGFycmF5LHJlc3VsdHMpe3ZhciByZXQ9cmVzdWx0c3x8W107aWYo dG9TdHJpbmcuY2FsbChhcnJheSk9PT0iW29iamVjdCBBcnJheV0iKXtBcnJheS5w cm90b3R5cGUucHVzaC5hcHBseShyZXQsYXJyYXkpO31lbHNle2lmKHR5cGVvZiBh cnJheS5sZW5ndGg9PT0ibnVtYmVyIil7Zm9yKHZhciBpPTAsbD1hcnJheS5sZW5n dGg7aTxsO2krKyl7cmV0LnB1c2goYXJyYXlbaV0pO319ZWxzZXtmb3IodmFyIGk9 MDthcnJheVtpXTtpKyspe3JldC5wdXNoKGFycmF5W2ldKTt9fX0KcmV0dXJuIHJl dDt9O30KdmFyIHNvcnRPcmRlcjtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQu Y29tcGFyZURvY3VtZW50UG9zaXRpb24pe3NvcnRPcmRlcj1mdW5jdGlvbihhLGIp e2lmKCFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9ufHwhYi5jb21wYXJlRG9jdW1l bnRQb3NpdGlvbil7aWYoYT09Yil7aGFzRHVwbGljYXRlPXRydWU7fQpyZXR1cm4g YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxO30KdmFyIHJldD1hLmNvbXBh cmVEb2N1bWVudFBvc2l0aW9uKGIpJjQ/LTE6YT09PWI/MDoxO2lmKHJldD09PTAp e2hhc0R1cGxpY2F0ZT10cnVlO30KcmV0dXJuIHJldDt9O31lbHNlIGlmKCJzb3Vy Y2VJbmRleCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpe3NvcnRPcmRlcj1m dW5jdGlvbihhLGIpe2lmKCFhLnNvdXJjZUluZGV4fHwhYi5zb3VyY2VJbmRleCl7 aWYoYT09Yil7aGFzRHVwbGljYXRlPXRydWU7fQpyZXR1cm4gYS5zb3VyY2VJbmRl eD8tMToxO30KdmFyIHJldD1hLnNvdXJjZUluZGV4LWIuc291cmNlSW5kZXg7aWYo cmV0PT09MCl7aGFzRHVwbGljYXRlPXRydWU7fQpyZXR1cm4gcmV0O307fWVsc2Ug aWYoZG9jdW1lbnQuY3JlYXRlUmFuZ2Upe3NvcnRPcmRlcj1mdW5jdGlvbihhLGIp e2lmKCFhLm93bmVyRG9jdW1lbnR8fCFiLm93bmVyRG9jdW1lbnQpe2lmKGE9PWIp e2hhc0R1cGxpY2F0ZT10cnVlO30KcmV0dXJuIGEub3duZXJEb2N1bWVudD8tMTox O30KdmFyIGFSYW5nZT1hLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSxiUmFu Z2U9Yi5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7YVJhbmdlLnNldFN0YXJ0 KGEsMCk7YVJhbmdlLnNldEVuZChhLDApO2JSYW5nZS5zZXRTdGFydChiLDApO2JS YW5nZS5zZXRFbmQoYiwwKTt2YXIgcmV0PWFSYW5nZS5jb21wYXJlQm91bmRhcnlQ b2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELGJSYW5nZSk7aWYocmV0PT09MCl7aGFz RHVwbGljYXRlPXRydWU7fQpyZXR1cm4gcmV0O307fQpmdW5jdGlvbiBnZXRUZXh0 KGVsZW1zKXt2YXIgcmV0PSIiLGVsZW07Zm9yKHZhciBpPTA7ZWxlbXNbaV07aSsr KXtlbGVtPWVsZW1zW2ldO2lmKGVsZW0ubm9kZVR5cGU9PT0zfHxlbGVtLm5vZGVU eXBlPT09NCl7cmV0Kz1lbGVtLm5vZGVWYWx1ZTt9ZWxzZSBpZihlbGVtLm5vZGVU eXBlIT09OCl7cmV0Kz1nZXRUZXh0KGVsZW0uY2hpbGROb2Rlcyk7fX0KcmV0dXJu IHJldDt9CihmdW5jdGlvbigpe3ZhciBmb3JtPWRvY3VtZW50LmNyZWF0ZUVsZW1l bnQoImRpdiIpLGlkPSJzY3JpcHQiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpO2Zvcm0u aW5uZXJIVE1MPSI8YSBuYW1lPSciK2lkKyInLz4iO3ZhciByb290PWRvY3VtZW50 LmRvY3VtZW50RWxlbWVudDtyb290Lmluc2VydEJlZm9yZShmb3JtLHJvb3QuZmly c3RDaGlsZCk7aWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKXtFeHByLmZp bmQuSUQ9ZnVuY3Rpb24obWF0Y2gsY29udGV4dCxpc1hNTCl7aWYodHlwZW9mIGNv bnRleHQuZ2V0RWxlbWVudEJ5SWQhPT0idW5kZWZpbmVkIiYmIWlzWE1MKXt2YXIg bT1jb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTtyZXR1cm4gbT9tLmlk PT09bWF0Y2hbMV18fHR5cGVvZiBtLmdldEF0dHJpYnV0ZU5vZGUhPT0idW5kZWZp bmVkIiYmbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZT09PW1hdGNo WzFdP1ttXTp1bmRlZmluZWQ6W107fX07RXhwci5maWx0ZXIuSUQ9ZnVuY3Rpb24o ZWxlbSxtYXRjaCl7dmFyIG5vZGU9dHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9k ZSE9PSJ1bmRlZmluZWQiJiZlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0 dXJuIGVsZW0ubm9kZVR5cGU9PT0xJiZub2RlJiZub2RlLm5vZGVWYWx1ZT09PW1h dGNoO307fQpyb290LnJlbW92ZUNoaWxkKGZvcm0pO3Jvb3Q9Zm9ybT1udWxsO30p KCk7KGZ1bmN0aW9uKCl7dmFyIGRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJk aXYiKTtkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiIikp O2lmKGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wKXtFeHBy LmZpbmQuVEFHPWZ1bmN0aW9uKG1hdGNoLGNvbnRleHQpe3ZhciByZXN1bHRzPWNv bnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobWF0Y2hbMV0pO2lmKG1hdGNoWzFd PT09IioiKXt2YXIgdG1wPVtdO2Zvcih2YXIgaT0wO3Jlc3VsdHNbaV07aSsrKXtp ZihyZXN1bHRzW2ldLm5vZGVUeXBlPT09MSl7dG1wLnB1c2gocmVzdWx0c1tpXSk7 fX0KcmVzdWx0cz10bXA7fQpyZXR1cm4gcmVzdWx0czt9O30KZGl2LmlubmVySFRN TD0iPGEgaHJlZj0nIyc+PC9hPiI7aWYoZGl2LmZpcnN0Q2hpbGQmJnR5cGVvZiBk aXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPT0idW5kZWZpbmVkIiYmZGl2LmZp cnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyIpe0V4cHIuYXR0ckhh bmRsZS5ocmVmPWZ1bmN0aW9uKGVsZW0pe3JldHVybiBlbGVtLmdldEF0dHJpYnV0 ZSgiaHJlZiIsMik7fTt9CmRpdj1udWxsO30pKCk7aWYoZG9jdW1lbnQucXVlcnlT ZWxlY3RvckFsbCl7KGZ1bmN0aW9uKCl7dmFyIG9sZFNpenpsZT1TaXp6bGUsZGl2 PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Rpdi5pbm5lckhUTUw9Ijxw IGNsYXNzPSdURVNUJz48L3A+IjtpZihkaXYucXVlcnlTZWxlY3RvckFsbCYmZGl2 LnF1ZXJ5U2VsZWN0b3JBbGwoIi5URVNUIikubGVuZ3RoPT09MCl7cmV0dXJuO30K U2l6emxlPWZ1bmN0aW9uKHF1ZXJ5LGNvbnRleHQsZXh0cmEsc2VlZCl7Y29udGV4 dD1jb250ZXh0fHxkb2N1bWVudDtpZighc2VlZCYmY29udGV4dC5ub2RlVHlwZT09 PTkmJiFpc1hNTChjb250ZXh0KSl7dHJ5e3JldHVybiBtYWtlQXJyYXkoY29udGV4 dC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSxleHRyYSk7fWNhdGNoKGUpe319CnJl dHVybiBvbGRTaXp6bGUocXVlcnksY29udGV4dCxleHRyYSxzZWVkKTt9O2Zvcih2 YXIgcHJvcCBpbiBvbGRTaXp6bGUpe1NpenpsZVtwcm9wXT1vbGRTaXp6bGVbcHJv cF07fQpkaXY9bnVsbDt9KSgpO30KKGZ1bmN0aW9uKCl7dmFyIGRpdj1kb2N1bWVu dC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkaXYuaW5uZXJIVE1MPSI8ZGl2IGNsYXNz PSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7aWYoIWRp di5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lfHxkaXYuZ2V0RWxlbWVudHNCeUNsYXNz TmFtZSgiZSIpLmxlbmd0aD09PTApe3JldHVybjt9CmRpdi5sYXN0Q2hpbGQuY2xh c3NOYW1lPSJlIjtpZihkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxl bmd0aD09PTEpe3JldHVybjt9CkV4cHIub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1Mi KTtFeHByLmZpbmQuQ0xBU1M9ZnVuY3Rpb24obWF0Y2gsY29udGV4dCxpc1hNTCl7 aWYodHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PSJ1bmRl ZmluZWQiJiYhaXNYTUwpe3JldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFz c05hbWUobWF0Y2hbMV0pO319O2Rpdj1udWxsO30pKCk7ZnVuY3Rpb24gZGlyTm9k ZUNoZWNrKGRpcixjdXIsZG9uZU5hbWUsY2hlY2tTZXQsbm9kZUNoZWNrLGlzWE1M KXtmb3IodmFyIGk9MCxsPWNoZWNrU2V0Lmxlbmd0aDtpPGw7aSsrKXt2YXIgZWxl bT1jaGVja1NldFtpXTtpZihlbGVtKXtlbGVtPWVsZW1bZGlyXTt2YXIgbWF0Y2g9 ZmFsc2U7d2hpbGUoZWxlbSl7aWYoZWxlbS5zaXpjYWNoZT09PWRvbmVOYW1lKXtt YXRjaD1jaGVja1NldFtlbGVtLnNpenNldF07YnJlYWs7fQppZihlbGVtLm5vZGVU eXBlPT09MSYmIWlzWE1MKXtlbGVtLnNpemNhY2hlPWRvbmVOYW1lO2VsZW0uc2l6 c2V0PWk7fQppZihlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1jdXIpe21h dGNoPWVsZW07YnJlYWs7fQplbGVtPWVsZW1bZGlyXTt9CmNoZWNrU2V0W2ldPW1h dGNoO319fQpmdW5jdGlvbiBkaXJDaGVjayhkaXIsY3VyLGRvbmVOYW1lLGNoZWNr U2V0LG5vZGVDaGVjayxpc1hNTCl7Zm9yKHZhciBpPTAsbD1jaGVja1NldC5sZW5n dGg7aTxsO2krKyl7dmFyIGVsZW09Y2hlY2tTZXRbaV07aWYoZWxlbSl7ZWxlbT1l bGVtW2Rpcl07dmFyIG1hdGNoPWZhbHNlO3doaWxlKGVsZW0pe2lmKGVsZW0uc2l6 Y2FjaGU9PT1kb25lTmFtZSl7bWF0Y2g9Y2hlY2tTZXRbZWxlbS5zaXpzZXRdO2Jy ZWFrO30KaWYoZWxlbS5ub2RlVHlwZT09PTEpe2lmKCFpc1hNTCl7ZWxlbS5zaXpj YWNoZT1kb25lTmFtZTtlbGVtLnNpenNldD1pO30KaWYodHlwZW9mIGN1ciE9PSJz dHJpbmciKXtpZihlbGVtPT09Y3VyKXttYXRjaD10cnVlO2JyZWFrO319ZWxzZSBp ZihTaXp6bGUuZmlsdGVyKGN1cixbZWxlbV0pLmxlbmd0aD4wKXttYXRjaD1lbGVt O2JyZWFrO319CmVsZW09ZWxlbVtkaXJdO30KY2hlY2tTZXRbaV09bWF0Y2g7fX19 CnZhciBjb250YWlucz1kb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9m dW5jdGlvbihhLGIpe3JldHVybiEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24o YikmMTYpO306ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5z P2EuY29udGFpbnMoYik6dHJ1ZSk7fTt2YXIgaXNYTUw9ZnVuY3Rpb24oZWxlbSl7 dmFyIGRvY3VtZW50RWxlbWVudD0oZWxlbT9lbGVtLm93bmVyRG9jdW1lbnR8fGVs ZW06MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBkb2N1bWVudEVsZW1lbnQ/ZG9j dW1lbnRFbGVtZW50Lm5vZGVOYW1lIT09IkhUTUwiOmZhbHNlO307dmFyIHBvc1By b2Nlc3M9ZnVuY3Rpb24oc2VsZWN0b3IsY29udGV4dCl7dmFyIHRtcFNldD1bXSxs YXRlcj0iIixtYXRjaCxyb290PWNvbnRleHQubm9kZVR5cGU/W2NvbnRleHRdOmNv bnRleHQ7d2hpbGUoKG1hdGNoPUV4cHIubWF0Y2guUFNFVURPLmV4ZWMoc2VsZWN0 b3IpKSl7bGF0ZXIrPW1hdGNoWzBdO3NlbGVjdG9yPXNlbGVjdG9yLnJlcGxhY2Uo RXhwci5tYXRjaC5QU0VVRE8sIiIpO30Kc2VsZWN0b3I9RXhwci5yZWxhdGl2ZVtz ZWxlY3Rvcl0/c2VsZWN0b3IrIioiOnNlbGVjdG9yO2Zvcih2YXIgaT0wLGw9cm9v dC5sZW5ndGg7aTxsO2krKyl7U2l6emxlKHNlbGVjdG9yLHJvb3RbaV0sdG1wU2V0 KTt9CnJldHVybiBTaXp6bGUuZmlsdGVyKGxhdGVyLHRtcFNldCk7fTtqUXVlcnku ZmluZD1TaXp6bGU7alF1ZXJ5LmV4cHI9U2l6emxlLnNlbGVjdG9ycztqUXVlcnku ZXhwclsiOiJdPWpRdWVyeS5leHByLmZpbHRlcnM7alF1ZXJ5LnVuaXF1ZT1TaXp6 bGUudW5pcXVlU29ydDtqUXVlcnkudGV4dD1nZXRUZXh0O2pRdWVyeS5pc1hNTERv Yz1pc1hNTDtqUXVlcnkuY29udGFpbnM9Y29udGFpbnM7cmV0dXJuO3dpbmRvdy5T aXp6bGU9U2l6emxlO30pKCk7dmFyIHJ1bnRpbD0vVW50aWwkLyxycGFyZW50c3By ZXY9L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8scm11bHRpc2VsZWN0 b3I9LywvLHNsaWNlPUFycmF5LnByb3RvdHlwZS5zbGljZTt2YXIgd2lubm93PWZ1 bmN0aW9uKGVsZW1lbnRzLHF1YWxpZmllcixrZWVwKXtpZihqUXVlcnkuaXNGdW5j dGlvbihxdWFsaWZpZXIpKXtyZXR1cm4galF1ZXJ5LmdyZXAoZWxlbWVudHMsZnVu Y3Rpb24oZWxlbSxpKXtyZXR1cm4hIXF1YWxpZmllci5jYWxsKGVsZW0saSxlbGVt KT09PWtlZXA7fSk7fWVsc2UgaWYocXVhbGlmaWVyLm5vZGVUeXBlKXtyZXR1cm4g alF1ZXJ5LmdyZXAoZWxlbWVudHMsZnVuY3Rpb24oZWxlbSxpKXtyZXR1cm4oZWxl bT09PXF1YWxpZmllcik9PT1rZWVwO30pO31lbHNlIGlmKHR5cGVvZiBxdWFsaWZp ZXI9PT0ic3RyaW5nIil7dmFyIGZpbHRlcmVkPWpRdWVyeS5ncmVwKGVsZW1lbnRz LGZ1bmN0aW9uKGVsZW0pe3JldHVybiBlbGVtLm5vZGVUeXBlPT09MTt9KTtpZihp c1NpbXBsZS50ZXN0KHF1YWxpZmllcikpe3JldHVybiBqUXVlcnkuZmlsdGVyKHF1 YWxpZmllcixmaWx0ZXJlZCwha2VlcCk7fWVsc2V7cXVhbGlmaWVyPWpRdWVyeS5m aWx0ZXIocXVhbGlmaWVyLGZpbHRlcmVkKTt9fQpyZXR1cm4galF1ZXJ5LmdyZXAo ZWxlbWVudHMsZnVuY3Rpb24oZWxlbSxpKXtyZXR1cm4oalF1ZXJ5LmluQXJyYXko ZWxlbSxxdWFsaWZpZXIpPj0wKT09PWtlZXA7fSk7fTtqUXVlcnkuZm4uZXh0ZW5k KHtmaW5kOmZ1bmN0aW9uKHNlbGVjdG9yKXt2YXIgcmV0PXRoaXMucHVzaFN0YWNr KCIiLCJmaW5kIixzZWxlY3RvciksbGVuZ3RoPTA7Zm9yKHZhciBpPTAsbD10aGlz Lmxlbmd0aDtpPGw7aSsrKXtsZW5ndGg9cmV0Lmxlbmd0aDtqUXVlcnkuZmluZChz ZWxlY3Rvcix0aGlzW2ldLHJldCk7aWYoaT4wKXtmb3IodmFyIG49bGVuZ3RoO248 cmV0Lmxlbmd0aDtuKyspe2Zvcih2YXIgcj0wO3I8bGVuZ3RoO3IrKyl7aWYocmV0 W3JdPT09cmV0W25dKXtyZXQuc3BsaWNlKG4tLSwxKTticmVhazt9fX19fQpyZXR1 cm4gcmV0O30saGFzOmZ1bmN0aW9uKHRhcmdldCl7dmFyIHRhcmdldHM9alF1ZXJ5 KHRhcmdldCk7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBp PTAsbD10YXJnZXRzLmxlbmd0aDtpPGw7aSsrKXtpZihqUXVlcnkuY29udGFpbnMo dGhpcyx0YXJnZXRzW2ldKSl7cmV0dXJuIHRydWU7fX19KTt9LG5vdDpmdW5jdGlv bihzZWxlY3Rvcil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHdpbm5vdyh0aGlzLHNl bGVjdG9yLGZhbHNlKSwibm90IixzZWxlY3Rvcik7fSxmaWx0ZXI6ZnVuY3Rpb24o c2VsZWN0b3Ipe3JldHVybiB0aGlzLnB1c2hTdGFjayh3aW5ub3codGhpcyxzZWxl Y3Rvcix0cnVlKSwiZmlsdGVyIixzZWxlY3Rvcik7fSxpczpmdW5jdGlvbihzZWxl Y3Rvcil7cmV0dXJuISFzZWxlY3RvciYmalF1ZXJ5LmZpbHRlcihzZWxlY3Rvcix0 aGlzKS5sZW5ndGg+MDt9LGNsb3Nlc3Q6ZnVuY3Rpb24oc2VsZWN0b3JzLGNvbnRl eHQpe2lmKGpRdWVyeS5pc0FycmF5KHNlbGVjdG9ycykpe3ZhciByZXQ9W10sY3Vy PXRoaXNbMF0sbWF0Y2gsbWF0Y2hlcz17fSxzZWxlY3RvcjtpZihjdXImJnNlbGVj dG9ycy5sZW5ndGgpe2Zvcih2YXIgaT0wLGw9c2VsZWN0b3JzLmxlbmd0aDtpPGw7 aSsrKXtzZWxlY3Rvcj1zZWxlY3RvcnNbaV07aWYoIW1hdGNoZXNbc2VsZWN0b3Jd KXttYXRjaGVzW3NlbGVjdG9yXT1qUXVlcnkuZXhwci5tYXRjaC5QT1MudGVzdChz ZWxlY3Rvcik/alF1ZXJ5KHNlbGVjdG9yLGNvbnRleHR8fHRoaXMuY29udGV4dCk6 c2VsZWN0b3I7fX0Kd2hpbGUoY3VyJiZjdXIub3duZXJEb2N1bWVudCYmY3VyIT09 Y29udGV4dCl7Zm9yKHNlbGVjdG9yIGluIG1hdGNoZXMpe21hdGNoPW1hdGNoZXNb c2VsZWN0b3JdO2lmKG1hdGNoLmpxdWVyeT9tYXRjaC5pbmRleChjdXIpPi0xOmpR dWVyeShjdXIpLmlzKG1hdGNoKSl7cmV0LnB1c2goe3NlbGVjdG9yOnNlbGVjdG9y LGVsZW06Y3VyfSk7ZGVsZXRlIG1hdGNoZXNbc2VsZWN0b3JdO319CmN1cj1jdXIu cGFyZW50Tm9kZTt9fQpyZXR1cm4gcmV0O30KdmFyIHBvcz1qUXVlcnkuZXhwci5t YXRjaC5QT1MudGVzdChzZWxlY3RvcnMpP2pRdWVyeShzZWxlY3RvcnMsY29udGV4 dHx8dGhpcy5jb250ZXh0KTpudWxsO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbihp LGN1cil7d2hpbGUoY3VyJiZjdXIub3duZXJEb2N1bWVudCYmY3VyIT09Y29udGV4 dCl7aWYocG9zP3Bvcy5pbmRleChjdXIpPi0xOmpRdWVyeShjdXIpLmlzKHNlbGVj dG9ycykpe3JldHVybiBjdXI7fQpjdXI9Y3VyLnBhcmVudE5vZGU7fQpyZXR1cm4g bnVsbDt9KTt9LGluZGV4OmZ1bmN0aW9uKGVsZW0pe2lmKCFlbGVtfHx0eXBlb2Yg ZWxlbT09PSJzdHJpbmciKXtyZXR1cm4galF1ZXJ5LmluQXJyYXkodGhpc1swXSxl bGVtP2pRdWVyeShlbGVtKTp0aGlzLnBhcmVudCgpLmNoaWxkcmVuKCkpO30KcmV0 dXJuIGpRdWVyeS5pbkFycmF5KGVsZW0uanF1ZXJ5P2VsZW1bMF06ZWxlbSx0aGlz KTt9LGFkZDpmdW5jdGlvbihzZWxlY3Rvcixjb250ZXh0KXt2YXIgc2V0PXR5cGVv ZiBzZWxlY3Rvcj09PSJzdHJpbmciP2pRdWVyeShzZWxlY3Rvcixjb250ZXh0fHx0 aGlzLmNvbnRleHQpOmpRdWVyeS5tYWtlQXJyYXkoc2VsZWN0b3IpLGFsbD1qUXVl cnkubWVyZ2UodGhpcy5nZXQoKSxzZXQpO3JldHVybiB0aGlzLnB1c2hTdGFjayhp c0Rpc2Nvbm5lY3RlZChzZXRbMF0pfHxpc0Rpc2Nvbm5lY3RlZChhbGxbMF0pP2Fs bDpqUXVlcnkudW5pcXVlKGFsbCkpO30sYW5kU2VsZjpmdW5jdGlvbigpe3JldHVy biB0aGlzLmFkZCh0aGlzLnByZXZPYmplY3QpO319KTtmdW5jdGlvbiBpc0Rpc2Nv bm5lY3RlZChub2RlKXtyZXR1cm4hbm9kZXx8IW5vZGUucGFyZW50Tm9kZXx8bm9k ZS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTE7fQpqUXVlcnkuZWFjaCh7cGFyZW50 OmZ1bmN0aW9uKGVsZW0pe3ZhciBwYXJlbnQ9ZWxlbS5wYXJlbnROb2RlO3JldHVy biBwYXJlbnQmJnBhcmVudC5ub2RlVHlwZSE9PTExP3BhcmVudDpudWxsO30scGFy ZW50czpmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJwYXJl bnROb2RlIik7fSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oZWxlbSxpLHVudGlsKXty ZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJwYXJlbnROb2RlIix1bnRpbCk7fSxuZXh0 OmZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubnRoKGVsZW0sMiwibmV4dFNp YmxpbmciKTt9LHByZXY6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgo ZWxlbSwyLCJwcmV2aW91c1NpYmxpbmciKTt9LG5leHRBbGw6ZnVuY3Rpb24oZWxl bSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwibmV4dFNpYmxpbmciKTt9LHByZXZB bGw6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicHJldmlv dXNTaWJsaW5nIik7fSxuZXh0VW50aWw6ZnVuY3Rpb24oZWxlbSxpLHVudGlsKXty ZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJuZXh0U2libGluZyIsdW50aWwpO30scHJl dlVudGlsOmZ1bmN0aW9uKGVsZW0saSx1bnRpbCl7cmV0dXJuIGpRdWVyeS5kaXIo ZWxlbSwicHJldmlvdXNTaWJsaW5nIix1bnRpbCk7fSxzaWJsaW5nczpmdW5jdGlv bihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5wYXJlbnROb2RlLmZp cnN0Q2hpbGQsZWxlbSk7fSxjaGlsZHJlbjpmdW5jdGlvbihlbGVtKXtyZXR1cm4g alF1ZXJ5LnNpYmxpbmcoZWxlbS5maXJzdENoaWxkKTt9LGNvbnRlbnRzOmZ1bmN0 aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubm9kZU5hbWUoZWxlbSwiaWZyYW1lIik/ ZWxlbS5jb250ZW50RG9jdW1lbnR8fGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVu dDpqUXVlcnkubWFrZUFycmF5KGVsZW0uY2hpbGROb2Rlcyk7fX0sZnVuY3Rpb24o bmFtZSxmbil7alF1ZXJ5LmZuW25hbWVdPWZ1bmN0aW9uKHVudGlsLHNlbGVjdG9y KXt2YXIgcmV0PWpRdWVyeS5tYXAodGhpcyxmbix1bnRpbCk7aWYoIXJ1bnRpbC50 ZXN0KG5hbWUpKXtzZWxlY3Rvcj11bnRpbDt9CmlmKHNlbGVjdG9yJiZ0eXBlb2Yg c2VsZWN0b3I9PT0ic3RyaW5nIil7cmV0PWpRdWVyeS5maWx0ZXIoc2VsZWN0b3Is cmV0KTt9CnJldD10aGlzLmxlbmd0aD4xP2pRdWVyeS51bmlxdWUocmV0KTpyZXQ7 aWYoKHRoaXMubGVuZ3RoPjF8fHJtdWx0aXNlbGVjdG9yLnRlc3Qoc2VsZWN0b3Ip KSYmcnBhcmVudHNwcmV2LnRlc3QobmFtZSkpe3JldD1yZXQucmV2ZXJzZSgpO30K cmV0dXJuIHRoaXMucHVzaFN0YWNrKHJldCxuYW1lLHNsaWNlLmNhbGwoYXJndW1l bnRzKS5qb2luKCIsIikpO307fSk7alF1ZXJ5LmV4dGVuZCh7ZmlsdGVyOmZ1bmN0 aW9uKGV4cHIsZWxlbXMsbm90KXtpZihub3Qpe2V4cHI9Ijpub3QoIitleHByKyIp Ijt9CnJldHVybiBqUXVlcnkuZmluZC5tYXRjaGVzKGV4cHIsZWxlbXMpO30sZGly OmZ1bmN0aW9uKGVsZW0sZGlyLHVudGlsKXt2YXIgbWF0Y2hlZD1bXSxjdXI9ZWxl bVtkaXJdO3doaWxlKGN1ciYmY3VyLm5vZGVUeXBlIT09OSYmKHVudGlsPT09dW5k ZWZpbmVkfHxjdXIubm9kZVR5cGUhPT0xfHwhalF1ZXJ5KGN1cikuaXModW50aWwp KSl7aWYoY3VyLm5vZGVUeXBlPT09MSl7bWF0Y2hlZC5wdXNoKGN1cik7fQpjdXI9 Y3VyW2Rpcl07fQpyZXR1cm4gbWF0Y2hlZDt9LG50aDpmdW5jdGlvbihjdXIscmVz dWx0LGRpcixlbGVtKXtyZXN1bHQ9cmVzdWx0fHwxO3ZhciBudW09MDtmb3IoO2N1 cjtjdXI9Y3VyW2Rpcl0pe2lmKGN1ci5ub2RlVHlwZT09PTEmJisrbnVtPT09cmVz dWx0KXticmVhazt9fQpyZXR1cm4gY3VyO30sc2libGluZzpmdW5jdGlvbihuLGVs ZW0pe3ZhciByPVtdO2Zvcig7bjtuPW4ubmV4dFNpYmxpbmcpe2lmKG4ubm9kZVR5 cGU9PT0xJiZuIT09ZWxlbSl7ci5wdXNoKG4pO319CnJldHVybiByO319KTt2YXIg cmlubGluZWpRdWVyeT0vIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLHJsZWFk aW5nV2hpdGVzcGFjZT0vXlxzKy8scnhodG1sVGFnPS8oPChbXHc6XSspW14+XSo/ KVwvPi9nLHJzZWxmQ2xvc2luZz0vXig/OmFyZWF8YnJ8Y29sfGVtYmVkfGhyfGlt Z3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pJC9pLHJ0YWdOYW1lPS88KFtcdzpdKykv LHJ0Ym9keT0vPHRib2R5L2kscmh0bWw9Lzx8JiM/XHcrOy8scm5vY2FjaGU9Lzxz Y3JpcHR8PG9iamVjdHw8ZW1iZWR8PG9wdGlvbnw8c3R5bGUvaSxyY2hlY2tlZD0v Y2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxmY2xvc2VUYWc9ZnVu Y3Rpb24oYWxsLGZyb250LHRhZyl7cmV0dXJuIHJzZWxmQ2xvc2luZy50ZXN0KHRh Zyk/YWxsOmZyb250KyI+PC8iK3RhZysiPiI7fSx3cmFwTWFwPXtvcHRpb246WzEs IjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdl bmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLHRoZWFkOlsxLCI8dGFi bGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5 PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90 Ym9keT48L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxj b2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sYXJlYTpbMSwiPG1hcD4i LCI8L21hcD4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O3dyYXBNYXAub3B0Z3JvdXA9 d3JhcE1hcC5vcHRpb247d3JhcE1hcC50Ym9keT13cmFwTWFwLnRmb290PXdyYXBN YXAuY29sZ3JvdXA9d3JhcE1hcC5jYXB0aW9uPXdyYXBNYXAudGhlYWQ7d3JhcE1h cC50aD13cmFwTWFwLnRkO2lmKCFqUXVlcnkuc3VwcG9ydC5odG1sU2VyaWFsaXpl KXt3cmFwTWFwLl9kZWZhdWx0PVsxLCJkaXY8ZGl2PiIsIjwvZGl2PiJdO30KalF1 ZXJ5LmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbih0ZXh0KXtpZihqUXVlcnkuaXNG dW5jdGlvbih0ZXh0KSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXt2YXIg c2VsZj1qUXVlcnkodGhpcyk7c2VsZi50ZXh0KHRleHQuY2FsbCh0aGlzLGksc2Vs Zi50ZXh0KCkpKTt9KTt9CmlmKHR5cGVvZiB0ZXh0IT09Im9iamVjdCImJnRleHQh PT11bmRlZmluZWQpe3JldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBd JiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KS5jcmVhdGVUZXh0Tm9k ZSh0ZXh0KSk7fQpyZXR1cm4galF1ZXJ5LnRleHQodGhpcyk7fSx3cmFwQWxsOmZ1 bmN0aW9uKGh0bWwpe2lmKGpRdWVyeS5pc0Z1bmN0aW9uKGh0bWwpKXtyZXR1cm4g dGhpcy5lYWNoKGZ1bmN0aW9uKGkpe2pRdWVyeSh0aGlzKS53cmFwQWxsKGh0bWwu Y2FsbCh0aGlzLGkpKTt9KTt9CmlmKHRoaXNbMF0pe3ZhciB3cmFwPWpRdWVyeSho dG1sLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUodHJ1ZSk7aWYo dGhpc1swXS5wYXJlbnROb2RlKXt3cmFwLmluc2VydEJlZm9yZSh0aGlzWzBdKTt9 CndyYXAubWFwKGZ1bmN0aW9uKCl7dmFyIGVsZW09dGhpczt3aGlsZShlbGVtLmZp cnN0Q2hpbGQmJmVsZW0uZmlyc3RDaGlsZC5ub2RlVHlwZT09PTEpe2VsZW09ZWxl bS5maXJzdENoaWxkO30KcmV0dXJuIGVsZW07fSkuYXBwZW5kKHRoaXMpO30KcmV0 dXJuIHRoaXM7fSx3cmFwSW5uZXI6ZnVuY3Rpb24oaHRtbCl7aWYoalF1ZXJ5Lmlz RnVuY3Rpb24oaHRtbCkpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSl7alF1 ZXJ5KHRoaXMpLndyYXBJbm5lcihodG1sLmNhbGwodGhpcyxpKSk7fSk7fQpyZXR1 cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHNlbGY9alF1ZXJ5KHRoaXMpLGNv bnRlbnRzPXNlbGYuY29udGVudHMoKTtpZihjb250ZW50cy5sZW5ndGgpe2NvbnRl bnRzLndyYXBBbGwoaHRtbCk7fWVsc2V7c2VsZi5hcHBlbmQoaHRtbCk7fX0pO30s d3JhcDpmdW5jdGlvbihodG1sKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7 alF1ZXJ5KHRoaXMpLndyYXBBbGwoaHRtbCk7fSk7fSx1bndyYXA6ZnVuY3Rpb24o KXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7aWYoIWpRdWVy eS5ub2RlTmFtZSh0aGlzLCJib2R5Iikpe2pRdWVyeSh0aGlzKS5yZXBsYWNlV2l0 aCh0aGlzLmNoaWxkTm9kZXMpO319KS5lbmQoKTt9LGFwcGVuZDpmdW5jdGlvbigp e3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyx0cnVlLGZ1bmN0aW9uKGVs ZW0pe2lmKHRoaXMubm9kZVR5cGU9PT0xKXt0aGlzLmFwcGVuZENoaWxkKGVsZW0p O319KTt9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChh cmd1bWVudHMsdHJ1ZSxmdW5jdGlvbihlbGVtKXtpZih0aGlzLm5vZGVUeXBlPT09 MSl7dGhpcy5pbnNlcnRCZWZvcmUoZWxlbSx0aGlzLmZpcnN0Q2hpbGQpO319KTt9 LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9k ZSl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZhbHNlLGZ1bmN0aW9u KGVsZW0pe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbSx0aGlzKTt9 KTt9ZWxzZSBpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgc2V0PWpRdWVyeShhcmd1 bWVudHNbMF0pO3NldC5wdXNoLmFwcGx5KHNldCx0aGlzLnRvQXJyYXkoKSk7cmV0 dXJuIHRoaXMucHVzaFN0YWNrKHNldCwiYmVmb3JlIixhcmd1bWVudHMpO319LGFm dGVyOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXty ZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZmFsc2UsZnVuY3Rpb24oZWxl bSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtLHRoaXMubmV4dFNp YmxpbmcpO30pO31lbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBzZXQ9dGhp cy5wdXNoU3RhY2sodGhpcywiYWZ0ZXIiLGFyZ3VtZW50cyk7c2V0LnB1c2guYXBw bHkoc2V0LGpRdWVyeShhcmd1bWVudHNbMF0pLnRvQXJyYXkoKSk7cmV0dXJuIHNl dDt9fSxyZW1vdmU6ZnVuY3Rpb24oc2VsZWN0b3Isa2VlcERhdGEpe2Zvcih2YXIg aT0wLGVsZW07KGVsZW09dGhpc1tpXSkhPW51bGw7aSsrKXtpZighc2VsZWN0b3J8 fGpRdWVyeS5maWx0ZXIoc2VsZWN0b3IsW2VsZW1dKS5sZW5ndGgpe2lmKCFrZWVw RGF0YSYmZWxlbS5ub2RlVHlwZT09PTEpe2pRdWVyeS5jbGVhbkRhdGEoZWxlbS5n ZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTtqUXVlcnkuY2xlYW5EYXRhKFtlbGVt XSk7fQppZihlbGVtLnBhcmVudE5vZGUpe2VsZW0ucGFyZW50Tm9kZS5yZW1vdmVD aGlsZChlbGVtKTt9fX0KcmV0dXJuIHRoaXM7fSxlbXB0eTpmdW5jdGlvbigpe2Zv cih2YXIgaT0wLGVsZW07KGVsZW09dGhpc1tpXSkhPW51bGw7aSsrKXtpZihlbGVt Lm5vZGVUeXBlPT09MSl7alF1ZXJ5LmNsZWFuRGF0YShlbGVtLmdldEVsZW1lbnRz QnlUYWdOYW1lKCIqIikpO30Kd2hpbGUoZWxlbS5maXJzdENoaWxkKXtlbGVtLnJl bW92ZUNoaWxkKGVsZW0uZmlyc3RDaGlsZCk7fX0KcmV0dXJuIHRoaXM7fSxjbG9u ZTpmdW5jdGlvbihldmVudHMpe3ZhciByZXQ9dGhpcy5tYXAoZnVuY3Rpb24oKXtp ZighalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50JiYhalF1ZXJ5LmlzWE1MRG9j KHRoaXMpKXt2YXIgaHRtbD10aGlzLm91dGVySFRNTCxvd25lckRvY3VtZW50PXRo aXMub3duZXJEb2N1bWVudDtpZighaHRtbCl7dmFyIGRpdj1vd25lckRvY3VtZW50 LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Rpdi5hcHBlbmRDaGlsZCh0aGlzLmNsb25l Tm9kZSh0cnVlKSk7aHRtbD1kaXYuaW5uZXJIVE1MO30KcmV0dXJuIGpRdWVyeS5j bGVhbihbaHRtbC5yZXBsYWNlKHJpbmxpbmVqUXVlcnksIiIpLnJlcGxhY2UoLz0o W149Iic+XHNdK1wvKT4vZywnPSIkMSI+JykucmVwbGFjZShybGVhZGluZ1doaXRl c3BhY2UsIiIpXSxvd25lckRvY3VtZW50KVswXTt9ZWxzZXtyZXR1cm4gdGhpcy5j bG9uZU5vZGUodHJ1ZSk7fX0pO2lmKGV2ZW50cz09PXRydWUpe2Nsb25lQ29weUV2 ZW50KHRoaXMscmV0KTtjbG9uZUNvcHlFdmVudCh0aGlzLmZpbmQoIioiKSxyZXQu ZmluZCgiKiIpKTt9CnJldHVybiByZXQ7fSxodG1sOmZ1bmN0aW9uKHZhbHVlKXtp Zih2YWx1ZT09PXVuZGVmaW5lZCl7cmV0dXJuIHRoaXNbMF0mJnRoaXNbMF0ubm9k ZVR5cGU9PT0xP3RoaXNbMF0uaW5uZXJIVE1MLnJlcGxhY2UocmlubGluZWpRdWVy eSwiIik6bnVsbDt9ZWxzZSBpZih0eXBlb2YgdmFsdWU9PT0ic3RyaW5nIiYmIXJu b2NhY2hlLnRlc3QodmFsdWUpJiYoalF1ZXJ5LnN1cHBvcnQubGVhZGluZ1doaXRl c3BhY2V8fCFybGVhZGluZ1doaXRlc3BhY2UudGVzdCh2YWx1ZSkpJiYhd3JhcE1h cFsocnRhZ05hbWUuZXhlYyh2YWx1ZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNl KCldKXt2YWx1ZT12YWx1ZS5yZXBsYWNlKHJ4aHRtbFRhZyxmY2xvc2VUYWcpO3Ry eXtmb3IodmFyIGk9MCxsPXRoaXMubGVuZ3RoO2k8bDtpKyspe2lmKHRoaXNbaV0u bm9kZVR5cGU9PT0xKXtqUXVlcnkuY2xlYW5EYXRhKHRoaXNbaV0uZ2V0RWxlbWVu dHNCeVRhZ05hbWUoIioiKSk7dGhpc1tpXS5pbm5lckhUTUw9dmFsdWU7fX19Y2F0 Y2goZSl7dGhpcy5lbXB0eSgpLmFwcGVuZCh2YWx1ZSk7fX1lbHNlIGlmKGpRdWVy eS5pc0Z1bmN0aW9uKHZhbHVlKSl7dGhpcy5lYWNoKGZ1bmN0aW9uKGkpe3ZhciBz ZWxmPWpRdWVyeSh0aGlzKSxvbGQ9c2VsZi5odG1sKCk7c2VsZi5lbXB0eSgpLmFw cGVuZChmdW5jdGlvbigpe3JldHVybiB2YWx1ZS5jYWxsKHRoaXMsaSxvbGQpO30p O30pO31lbHNle3RoaXMuZW1wdHkoKS5hcHBlbmQodmFsdWUpO30KcmV0dXJuIHRo aXM7fSxyZXBsYWNlV2l0aDpmdW5jdGlvbih2YWx1ZSl7aWYodGhpc1swXSYmdGhp c1swXS5wYXJlbnROb2RlKXtpZihqUXVlcnkuaXNGdW5jdGlvbih2YWx1ZSkpe3Jl dHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSl7dmFyIHNlbGY9alF1ZXJ5KHRoaXMp LG9sZD1zZWxmLmh0bWwoKTtzZWxmLnJlcGxhY2VXaXRoKHZhbHVlLmNhbGwodGhp cyxpLG9sZCkpO30pO30KaWYodHlwZW9mIHZhbHVlIT09InN0cmluZyIpe3ZhbHVl PWpRdWVyeSh2YWx1ZSkuZGV0YWNoKCk7fQpyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0 aW9uKCl7dmFyIG5leHQ9dGhpcy5uZXh0U2libGluZyxwYXJlbnQ9dGhpcy5wYXJl bnROb2RlO2pRdWVyeSh0aGlzKS5yZW1vdmUoKTtpZihuZXh0KXtqUXVlcnkobmV4 dCkuYmVmb3JlKHZhbHVlKTt9ZWxzZXtqUXVlcnkocGFyZW50KS5hcHBlbmQodmFs dWUpO319KTt9ZWxzZXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soalF1ZXJ5KGpRdWVy eS5pc0Z1bmN0aW9uKHZhbHVlKT92YWx1ZSgpOnZhbHVlKSwicmVwbGFjZVdpdGgi LHZhbHVlKTt9fSxkZXRhY2g6ZnVuY3Rpb24oc2VsZWN0b3Ipe3JldHVybiB0aGlz LnJlbW92ZShzZWxlY3Rvcix0cnVlKTt9LGRvbU1hbmlwOmZ1bmN0aW9uKGFyZ3Ms dGFibGUsY2FsbGJhY2spe3ZhciByZXN1bHRzLGZpcnN0LHZhbHVlPWFyZ3NbMF0s c2NyaXB0cz1bXSxmcmFnbWVudCxwYXJlbnQ7aWYoIWpRdWVyeS5zdXBwb3J0LmNo ZWNrQ2xvbmUmJmFyZ3VtZW50cy5sZW5ndGg9PT0zJiZ0eXBlb2YgdmFsdWU9PT0i c3RyaW5nIiYmcmNoZWNrZWQudGVzdCh2YWx1ZSkpe3JldHVybiB0aGlzLmVhY2go ZnVuY3Rpb24oKXtqUXVlcnkodGhpcykuZG9tTWFuaXAoYXJncyx0YWJsZSxjYWxs YmFjayx0cnVlKTt9KTt9CmlmKGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSl7cmV0 dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXt2YXIgc2VsZj1qUXVlcnkodGhpcyk7 YXJnc1swXT12YWx1ZS5jYWxsKHRoaXMsaSx0YWJsZT9zZWxmLmh0bWwoKTp1bmRl ZmluZWQpO3NlbGYuZG9tTWFuaXAoYXJncyx0YWJsZSxjYWxsYmFjayk7fSk7fQpp Zih0aGlzWzBdKXtwYXJlbnQ9dmFsdWUmJnZhbHVlLnBhcmVudE5vZGU7aWYoalF1 ZXJ5LnN1cHBvcnQucGFyZW50Tm9kZSYmcGFyZW50JiZwYXJlbnQubm9kZVR5cGU9 PT0xMSYmcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoPT09dGhpcy5sZW5ndGgpe3Jl c3VsdHM9e2ZyYWdtZW50OnBhcmVudH07fWVsc2V7cmVzdWx0cz1idWlsZEZyYWdt ZW50KGFyZ3MsdGhpcyxzY3JpcHRzKTt9CmZyYWdtZW50PXJlc3VsdHMuZnJhZ21l bnQ7aWYoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGg9PT0xKXtmaXJzdD1mcmFn bWVudD1mcmFnbWVudC5maXJzdENoaWxkO31lbHNle2ZpcnN0PWZyYWdtZW50LmZp cnN0Q2hpbGQ7fQppZihmaXJzdCl7dGFibGU9dGFibGUmJmpRdWVyeS5ub2RlTmFt ZShmaXJzdCwidHIiKTtmb3IodmFyIGk9MCxsPXRoaXMubGVuZ3RoO2k8bDtpKysp e2NhbGxiYWNrLmNhbGwodGFibGU/cm9vdCh0aGlzW2ldLGZpcnN0KTp0aGlzW2ld LGk+MHx8cmVzdWx0cy5jYWNoZWFibGV8fHRoaXMubGVuZ3RoPjE/ZnJhZ21lbnQu Y2xvbmVOb2RlKHRydWUpOmZyYWdtZW50KTt9fQppZihzY3JpcHRzLmxlbmd0aCl7 alF1ZXJ5LmVhY2goc2NyaXB0cyxldmFsU2NyaXB0KTt9fQpyZXR1cm4gdGhpcztm dW5jdGlvbiByb290KGVsZW0sY3VyKXtyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKGVs ZW0sInRhYmxlIik/KGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5Iilb MF18fGVsZW0uYXBwZW5kQ2hpbGQoZWxlbS5vd25lckRvY3VtZW50LmNyZWF0ZUVs ZW1lbnQoInRib2R5IikpKTplbGVtO319fSk7ZnVuY3Rpb24gY2xvbmVDb3B5RXZl bnQob3JpZyxyZXQpe3ZhciBpPTA7cmV0LmVhY2goZnVuY3Rpb24oKXtpZih0aGlz Lm5vZGVOYW1lIT09KG9yaWdbaV0mJm9yaWdbaV0ubm9kZU5hbWUpKXtyZXR1cm47 fQp2YXIgb2xkRGF0YT1qUXVlcnkuZGF0YShvcmlnW2krK10pLGN1ckRhdGE9alF1 ZXJ5LmRhdGEodGhpcyxvbGREYXRhKSxldmVudHM9b2xkRGF0YSYmb2xkRGF0YS5l dmVudHM7aWYoZXZlbnRzKXtkZWxldGUgY3VyRGF0YS5oYW5kbGU7Y3VyRGF0YS5l dmVudHM9e307Zm9yKHZhciB0eXBlIGluIGV2ZW50cyl7Zm9yKHZhciBoYW5kbGVy IGluIGV2ZW50c1t0eXBlXSl7alF1ZXJ5LmV2ZW50LmFkZCh0aGlzLHR5cGUsZXZl bnRzW3R5cGVdW2hhbmRsZXJdLGV2ZW50c1t0eXBlXVtoYW5kbGVyXS5kYXRhKTt9 fX19KTt9CmZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoYXJncyxub2RlcyxzY3JpcHRz KXt2YXIgZnJhZ21lbnQsY2FjaGVhYmxlLGNhY2hlcmVzdWx0cyxkb2M9KG5vZGVz JiZub2Rlc1swXT9ub2Rlc1swXS5vd25lckRvY3VtZW50fHxub2Rlc1swXTpkb2N1 bWVudCk7aWYoYXJncy5sZW5ndGg9PT0xJiZ0eXBlb2YgYXJnc1swXT09PSJzdHJp bmciJiZhcmdzWzBdLmxlbmd0aDw1MTImJmRvYz09PWRvY3VtZW50JiYhcm5vY2Fj aGUudGVzdChhcmdzWzBdKSYmKGpRdWVyeS5zdXBwb3J0LmNoZWNrQ2xvbmV8fCFy Y2hlY2tlZC50ZXN0KGFyZ3NbMF0pKSl7Y2FjaGVhYmxlPXRydWU7Y2FjaGVyZXN1 bHRzPWpRdWVyeS5mcmFnbWVudHNbYXJnc1swXV07aWYoY2FjaGVyZXN1bHRzKXtp ZihjYWNoZXJlc3VsdHMhPT0xKXtmcmFnbWVudD1jYWNoZXJlc3VsdHM7fX19Cmlm KCFmcmFnbWVudCl7ZnJhZ21lbnQ9ZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQo KTtqUXVlcnkuY2xlYW4oYXJncyxkb2MsZnJhZ21lbnQsc2NyaXB0cyk7fQppZihj YWNoZWFibGUpe2pRdWVyeS5mcmFnbWVudHNbYXJnc1swXV09Y2FjaGVyZXN1bHRz P2ZyYWdtZW50OjE7fQpyZXR1cm57ZnJhZ21lbnQ6ZnJhZ21lbnQsY2FjaGVhYmxl OmNhY2hlYWJsZX07fQpqUXVlcnkuZnJhZ21lbnRzPXt9O2pRdWVyeS5lYWNoKHth cHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9y ZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxh Y2VXaXRoIn0sZnVuY3Rpb24obmFtZSxvcmlnaW5hbCl7alF1ZXJ5LmZuW25hbWVd PWZ1bmN0aW9uKHNlbGVjdG9yKXt2YXIgcmV0PVtdLGluc2VydD1qUXVlcnkoc2Vs ZWN0b3IpLHBhcmVudD10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9k ZTtpZihwYXJlbnQmJnBhcmVudC5ub2RlVHlwZT09PTExJiZwYXJlbnQuY2hpbGRO b2Rlcy5sZW5ndGg9PT0xJiZpbnNlcnQubGVuZ3RoPT09MSl7aW5zZXJ0W29yaWdp bmFsXSh0aGlzWzBdKTtyZXR1cm4gdGhpczt9ZWxzZXtmb3IodmFyIGk9MCxsPWlu c2VydC5sZW5ndGg7aTxsO2krKyl7dmFyIGVsZW1zPShpPjA/dGhpcy5jbG9uZSh0 cnVlKTp0aGlzKS5nZXQoKTtqUXVlcnkuZm5bb3JpZ2luYWxdLmFwcGx5KGpRdWVy eShpbnNlcnRbaV0pLGVsZW1zKTtyZXQ9cmV0LmNvbmNhdChlbGVtcyk7fQpyZXR1 cm4gdGhpcy5wdXNoU3RhY2socmV0LG5hbWUsaW5zZXJ0LnNlbGVjdG9yKTt9fTt9 KTtqUXVlcnkuZXh0ZW5kKHtjbGVhbjpmdW5jdGlvbihlbGVtcyxjb250ZXh0LGZy YWdtZW50LHNjcmlwdHMpe2NvbnRleHQ9Y29udGV4dHx8ZG9jdW1lbnQ7aWYodHlw ZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudD09PSJ1bmRlZmluZWQiKXtjb250ZXh0 PWNvbnRleHQub3duZXJEb2N1bWVudHx8Y29udGV4dFswXSYmY29udGV4dFswXS5v d25lckRvY3VtZW50fHxkb2N1bWVudDt9CnZhciByZXQ9W107Zm9yKHZhciBpPTAs ZWxlbTsoZWxlbT1lbGVtc1tpXSkhPW51bGw7aSsrKXtpZih0eXBlb2YgZWxlbT09 PSJudW1iZXIiKXtlbGVtKz0iIjt9CmlmKCFlbGVtKXtjb250aW51ZTt9CmlmKHR5 cGVvZiBlbGVtPT09InN0cmluZyImJiFyaHRtbC50ZXN0KGVsZW0pKXtlbGVtPWNv bnRleHQuY3JlYXRlVGV4dE5vZGUoZWxlbSk7fWVsc2UgaWYodHlwZW9mIGVsZW09 PT0ic3RyaW5nIil7ZWxlbT1lbGVtLnJlcGxhY2UocnhodG1sVGFnLGZjbG9zZVRh Zyk7dmFyIHRhZz0ocnRhZ05hbWUuZXhlYyhlbGVtKXx8WyIiLCIiXSlbMV0udG9M b3dlckNhc2UoKSx3cmFwPXdyYXBNYXBbdGFnXXx8d3JhcE1hcC5fZGVmYXVsdCxk ZXB0aD13cmFwWzBdLGRpdj1jb250ZXh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Rp di5pbm5lckhUTUw9d3JhcFsxXStlbGVtK3dyYXBbMl07d2hpbGUoZGVwdGgtLSl7 ZGl2PWRpdi5sYXN0Q2hpbGQ7fQppZighalF1ZXJ5LnN1cHBvcnQudGJvZHkpe3Zh ciBoYXNCb2R5PXJ0Ym9keS50ZXN0KGVsZW0pLHRib2R5PXRhZz09PSJ0YWJsZSIm JiFoYXNCb2R5P2Rpdi5maXJzdENoaWxkJiZkaXYuZmlyc3RDaGlsZC5jaGlsZE5v ZGVzOndyYXBbMV09PT0iPHRhYmxlPiImJiFoYXNCb2R5P2Rpdi5jaGlsZE5vZGVz OltdO2Zvcih2YXIgaj10Ym9keS5sZW5ndGgtMTtqPj0wOy0tail7aWYoalF1ZXJ5 Lm5vZGVOYW1lKHRib2R5W2pdLCJ0Ym9keSIpJiYhdGJvZHlbal0uY2hpbGROb2Rl cy5sZW5ndGgpe3Rib2R5W2pdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGJvZHlb al0pO319fQppZighalF1ZXJ5LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJnJs ZWFkaW5nV2hpdGVzcGFjZS50ZXN0KGVsZW0pKXtkaXYuaW5zZXJ0QmVmb3JlKGNv bnRleHQuY3JlYXRlVGV4dE5vZGUocmxlYWRpbmdXaGl0ZXNwYWNlLmV4ZWMoZWxl bSlbMF0pLGRpdi5maXJzdENoaWxkKTt9CmVsZW09ZGl2LmNoaWxkTm9kZXM7fQpp ZihlbGVtLm5vZGVUeXBlKXtyZXQucHVzaChlbGVtKTt9ZWxzZXtyZXQ9alF1ZXJ5 Lm1lcmdlKHJldCxlbGVtKTt9fQppZihmcmFnbWVudCl7Zm9yKHZhciBpPTA7cmV0 W2ldO2krKyl7aWYoc2NyaXB0cyYmalF1ZXJ5Lm5vZGVOYW1lKHJldFtpXSwic2Ny aXB0IikmJighcmV0W2ldLnR5cGV8fHJldFtpXS50eXBlLnRvTG93ZXJDYXNlKCk9 PT0idGV4dC9qYXZhc2NyaXB0Iikpe3NjcmlwdHMucHVzaChyZXRbaV0ucGFyZW50 Tm9kZT9yZXRbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyZXRbaV0pOnJldFtp XSk7fWVsc2V7aWYocmV0W2ldLm5vZGVUeXBlPT09MSl7cmV0LnNwbGljZS5hcHBs eShyZXQsW2krMSwwXS5jb25jYXQoalF1ZXJ5Lm1ha2VBcnJheShyZXRbaV0uZ2V0 RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpKSkpO30KZnJhZ21lbnQuYXBwZW5k Q2hpbGQocmV0W2ldKTt9fX0KcmV0dXJuIHJldDt9LGNsZWFuRGF0YTpmdW5jdGlv bihlbGVtcyl7dmFyIGRhdGEsaWQsY2FjaGU9alF1ZXJ5LmNhY2hlLHNwZWNpYWw9 alF1ZXJ5LmV2ZW50LnNwZWNpYWwsZGVsZXRlRXhwYW5kbz1qUXVlcnkuc3VwcG9y dC5kZWxldGVFeHBhbmRvO2Zvcih2YXIgaT0wLGVsZW07KGVsZW09ZWxlbXNbaV0p IT1udWxsO2krKyl7aWQ9ZWxlbVtqUXVlcnkuZXhwYW5kb107aWYoaWQpe2RhdGE9 Y2FjaGVbaWRdO2lmKGRhdGEuZXZlbnRzKXtmb3IodmFyIHR5cGUgaW4gZGF0YS5l dmVudHMpe2lmKHNwZWNpYWxbdHlwZV0pe2pRdWVyeS5ldmVudC5yZW1vdmUoZWxl bSx0eXBlKTt9ZWxzZXtyZW1vdmVFdmVudChlbGVtLHR5cGUsZGF0YS5oYW5kbGUp O319fQppZihkZWxldGVFeHBhbmRvKXtkZWxldGUgZWxlbVtqUXVlcnkuZXhwYW5k b107fWVsc2UgaWYoZWxlbS5yZW1vdmVBdHRyaWJ1dGUpe2VsZW0ucmVtb3ZlQXR0 cmlidXRlKGpRdWVyeS5leHBhbmRvKTt9CmRlbGV0ZSBjYWNoZVtpZF07fX19fSk7 dmFyIHJleGNsdWRlPS96LT9pbmRleHxmb250LT93ZWlnaHR8b3BhY2l0eXx6b29t fGxpbmUtP2hlaWdodC9pLHJhbHBoYT0vYWxwaGFcKFteKV0qXCkvLHJvcGFjaXR5 PS9vcGFjaXR5PShbXildKikvLHJmbG9hdD0vZmxvYXQvaSxyZGFzaEFscGhhPS8t KFthLXpdKS9pZyxydXBwZXI9LyhbQS1aXSkvZyxybnVtcHg9L14tP1xkKyg/OnB4 KT8kL2kscm51bT0vXi0/XGQvLGNzc1Nob3c9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIs dmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGNzc1dpZHRoPVsi TGVmdCIsIlJpZ2h0Il0sY3NzSGVpZ2h0PVsiVG9wIiwiQm90dG9tIl0sZ2V0Q29t cHV0ZWRTdHlsZT1kb2N1bWVudC5kZWZhdWx0VmlldyYmZG9jdW1lbnQuZGVmYXVs dFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSxzdHlsZUZsb2F0PWpRdWVyeS5zdXBwb3J0 LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQiLGZjYW1lbENhc2U9ZnVu Y3Rpb24oYWxsLGxldHRlcil7cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO307 alF1ZXJ5LmZuLmNzcz1mdW5jdGlvbihuYW1lLHZhbHVlKXtyZXR1cm4gYWNjZXNz KHRoaXMsbmFtZSx2YWx1ZSx0cnVlLGZ1bmN0aW9uKGVsZW0sbmFtZSx2YWx1ZSl7 aWYodmFsdWU9PT11bmRlZmluZWQpe3JldHVybiBqUXVlcnkuY3VyQ1NTKGVsZW0s bmFtZSk7fQppZih0eXBlb2YgdmFsdWU9PT0ibnVtYmVyIiYmIXJleGNsdWRlLnRl c3QobmFtZSkpe3ZhbHVlKz0icHgiO30KalF1ZXJ5LnN0eWxlKGVsZW0sbmFtZSx2 YWx1ZSk7fSk7fTtqUXVlcnkuZXh0ZW5kKHtzdHlsZTpmdW5jdGlvbihlbGVtLG5h bWUsdmFsdWUpe2lmKCFlbGVtfHxlbGVtLm5vZGVUeXBlPT09M3x8ZWxlbS5ub2Rl VHlwZT09PTgpe3JldHVybiB1bmRlZmluZWQ7fQppZigobmFtZT09PSJ3aWR0aCJ8 fG5hbWU9PT0iaGVpZ2h0IikmJnBhcnNlRmxvYXQodmFsdWUpPDApe3ZhbHVlPXVu ZGVmaW5lZDt9CnZhciBzdHlsZT1lbGVtLnN0eWxlfHxlbGVtLHNldD12YWx1ZSE9 PXVuZGVmaW5lZDtpZighalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSYmbmFtZT09PSJv cGFjaXR5Iil7aWYoc2V0KXtzdHlsZS56b29tPTE7dmFyIG9wYWNpdHk9cGFyc2VJ bnQodmFsdWUsMTApKyIiPT09Ik5hTiI/IiI6ImFscGhhKG9wYWNpdHk9Iit2YWx1 ZSoxMDArIikiO3ZhciBmaWx0ZXI9c3R5bGUuZmlsdGVyfHxqUXVlcnkuY3VyQ1NT KGVsZW0sImZpbHRlciIpfHwiIjtzdHlsZS5maWx0ZXI9cmFscGhhLnRlc3QoZmls dGVyKT9maWx0ZXIucmVwbGFjZShyYWxwaGEsb3BhY2l0eSk6b3BhY2l0eTt9CnJl dHVybiBzdHlsZS5maWx0ZXImJnN0eWxlLmZpbHRlci5pbmRleE9mKCJvcGFjaXR5 PSIpPj0wPyhwYXJzZUZsb2F0KHJvcGFjaXR5LmV4ZWMoc3R5bGUuZmlsdGVyKVsx XSkvMTAwKSsiIjoiIjt9CmlmKHJmbG9hdC50ZXN0KG5hbWUpKXtuYW1lPXN0eWxl RmxvYXQ7fQpuYW1lPW5hbWUucmVwbGFjZShyZGFzaEFscGhhLGZjYW1lbENhc2Up O2lmKHNldCl7c3R5bGVbbmFtZV09dmFsdWU7fQpyZXR1cm4gc3R5bGVbbmFtZV07 fSxjc3M6ZnVuY3Rpb24oZWxlbSxuYW1lLGZvcmNlLGV4dHJhKXtpZihuYW1lPT09 IndpZHRoInx8bmFtZT09PSJoZWlnaHQiKXt2YXIgdmFsLHByb3BzPWNzc1Nob3cs d2hpY2g9bmFtZT09PSJ3aWR0aCI/Y3NzV2lkdGg6Y3NzSGVpZ2h0O2Z1bmN0aW9u IGdldFdIKCl7dmFsPW5hbWU9PT0id2lkdGgiP2VsZW0ub2Zmc2V0V2lkdGg6ZWxl bS5vZmZzZXRIZWlnaHQ7aWYoZXh0cmE9PT0iYm9yZGVyIil7cmV0dXJuO30KalF1 ZXJ5LmVhY2god2hpY2gsZnVuY3Rpb24oKXtpZighZXh0cmEpe3ZhbC09cGFyc2VG bG9hdChqUXVlcnkuY3VyQ1NTKGVsZW0sInBhZGRpbmciK3RoaXMsdHJ1ZSkpfHww O30KaWYoZXh0cmE9PT0ibWFyZ2luIil7dmFsKz1wYXJzZUZsb2F0KGpRdWVyeS5j dXJDU1MoZWxlbSwibWFyZ2luIit0aGlzLHRydWUpKXx8MDt9ZWxzZXt2YWwtPXBh cnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyhlbGVtLCJib3JkZXIiK3RoaXMrIldpZHRo Iix0cnVlKSl8fDA7fX0pO30KaWYoZWxlbS5vZmZzZXRXaWR0aCE9PTApe2dldFdI KCk7fWVsc2V7alF1ZXJ5LnN3YXAoZWxlbSxwcm9wcyxnZXRXSCk7fQpyZXR1cm4g TWF0aC5tYXgoMCxNYXRoLnJvdW5kKHZhbCkpO30KcmV0dXJuIGpRdWVyeS5jdXJD U1MoZWxlbSxuYW1lLGZvcmNlKTt9LGN1ckNTUzpmdW5jdGlvbihlbGVtLG5hbWUs Zm9yY2Upe3ZhciByZXQsc3R5bGU9ZWxlbS5zdHlsZSxmaWx0ZXI7aWYoIWpRdWVy eS5zdXBwb3J0Lm9wYWNpdHkmJm5hbWU9PT0ib3BhY2l0eSImJmVsZW0uY3VycmVu dFN0eWxlKXtyZXQ9cm9wYWNpdHkudGVzdChlbGVtLmN1cnJlbnRTdHlsZS5maWx0 ZXJ8fCIiKT8ocGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCkrIiI6IiI7cmV0dXJu IHJldD09PSIiPyIxIjpyZXQ7fQppZihyZmxvYXQudGVzdChuYW1lKSl7bmFtZT1z dHlsZUZsb2F0O30KaWYoIWZvcmNlJiZzdHlsZSYmc3R5bGVbbmFtZV0pe3JldD1z dHlsZVtuYW1lXTt9ZWxzZSBpZihnZXRDb21wdXRlZFN0eWxlKXtpZihyZmxvYXQu dGVzdChuYW1lKSl7bmFtZT0iZmxvYXQiO30KbmFtZT1uYW1lLnJlcGxhY2UocnVw cGVyLCItJDEiKS50b0xvd2VyQ2FzZSgpO3ZhciBkZWZhdWx0Vmlldz1lbGVtLm93 bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7aWYoIWRlZmF1bHRWaWV3KXtyZXR1cm4g bnVsbDt9CnZhciBjb21wdXRlZFN0eWxlPWRlZmF1bHRWaWV3LmdldENvbXB1dGVk U3R5bGUoZWxlbSxudWxsKTtpZihjb21wdXRlZFN0eWxlKXtyZXQ9Y29tcHV0ZWRT dHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO30KaWYobmFtZT09PSJvcGFjaXR5 IiYmcmV0PT09IiIpe3JldD0iMSI7fX1lbHNlIGlmKGVsZW0uY3VycmVudFN0eWxl KXt2YXIgY2FtZWxDYXNlPW5hbWUucmVwbGFjZShyZGFzaEFscGhhLGZjYW1lbENh c2UpO3JldD1lbGVtLmN1cnJlbnRTdHlsZVtuYW1lXXx8ZWxlbS5jdXJyZW50U3R5 bGVbY2FtZWxDYXNlXTtpZighcm51bXB4LnRlc3QocmV0KSYmcm51bS50ZXN0KHJl dCkpe3ZhciBsZWZ0PXN0eWxlLmxlZnQscnNMZWZ0PWVsZW0ucnVudGltZVN0eWxl LmxlZnQ7ZWxlbS5ydW50aW1lU3R5bGUubGVmdD1lbGVtLmN1cnJlbnRTdHlsZS5s ZWZ0O3N0eWxlLmxlZnQ9Y2FtZWxDYXNlPT09ImZvbnRTaXplIj8iMWVtIjoocmV0 fHwwKTtyZXQ9c3R5bGUucGl4ZWxMZWZ0KyJweCI7c3R5bGUubGVmdD1sZWZ0O2Vs ZW0ucnVudGltZVN0eWxlLmxlZnQ9cnNMZWZ0O319CnJldHVybiByZXQ7fSxzd2Fw OmZ1bmN0aW9uKGVsZW0sb3B0aW9ucyxjYWxsYmFjayl7dmFyIG9sZD17fTtmb3Io dmFyIG5hbWUgaW4gb3B0aW9ucyl7b2xkW25hbWVdPWVsZW0uc3R5bGVbbmFtZV07 ZWxlbS5zdHlsZVtuYW1lXT1vcHRpb25zW25hbWVdO30KY2FsbGJhY2suY2FsbChl bGVtKTtmb3IodmFyIG5hbWUgaW4gb3B0aW9ucyl7ZWxlbS5zdHlsZVtuYW1lXT1v bGRbbmFtZV07fX19KTtpZihqUXVlcnkuZXhwciYmalF1ZXJ5LmV4cHIuZmlsdGVy cyl7alF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oZWxlbSl7dmFy IHdpZHRoPWVsZW0ub2Zmc2V0V2lkdGgsaGVpZ2h0PWVsZW0ub2Zmc2V0SGVpZ2h0 LHNraXA9ZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InRyIjtyZXR1cm4g d2lkdGg9PT0wJiZoZWlnaHQ9PT0wJiYhc2tpcD90cnVlOndpZHRoPjAmJmhlaWdo dD4wJiYhc2tpcD9mYWxzZTpqUXVlcnkuY3VyQ1NTKGVsZW0sImRpc3BsYXkiKT09 PSJub25lIjt9O2pRdWVyeS5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihl bGVtKXtyZXR1cm4halF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4oZWxlbSk7fTt9 CnZhciBqc2M9bm93KCkscnNjcmlwdD0vPHNjcmlwdCgufFxzKSo/XC9zY3JpcHQ+ L2dpLHJzZWxlY3RUZXh0YXJlYT0vc2VsZWN0fHRleHRhcmVhL2kscmlucHV0PS9j b2xvcnxkYXRlfGRhdGV0aW1lfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFz c3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWsvaSxqc3Jl PS89XD8oJnwkKS8scnF1ZXJ5PS9cPy8scnRzPS8oXD98JilfPS4qPygmfCQpLyxy dXJsPS9eKFx3KzopP1wvXC8oW15cLz8jXSspLyxyMjA9LyUyMC9nLF9sb2FkPWpR dWVyeS5mbi5sb2FkO2pRdWVyeS5mbi5leHRlbmQoe2xvYWQ6ZnVuY3Rpb24odXJs LHBhcmFtcyxjYWxsYmFjayl7aWYodHlwZW9mIHVybCE9PSJzdHJpbmciKXtyZXR1 cm4gX2xvYWQuY2FsbCh0aGlzLHVybCk7fWVsc2UgaWYoIXRoaXMubGVuZ3RoKXty ZXR1cm4gdGhpczt9CnZhciBvZmY9dXJsLmluZGV4T2YoIiAiKTtpZihvZmY+PTAp e3ZhciBzZWxlY3Rvcj11cmwuc2xpY2Uob2ZmLHVybC5sZW5ndGgpO3VybD11cmwu c2xpY2UoMCxvZmYpO30KdmFyIHR5cGU9IkdFVCI7aWYocGFyYW1zKXtpZihqUXVl cnkuaXNGdW5jdGlvbihwYXJhbXMpKXtjYWxsYmFjaz1wYXJhbXM7cGFyYW1zPW51 bGw7fWVsc2UgaWYodHlwZW9mIHBhcmFtcz09PSJvYmplY3QiKXtwYXJhbXM9alF1 ZXJ5LnBhcmFtKHBhcmFtcyxqUXVlcnkuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFs KTt0eXBlPSJQT1NUIjt9fQp2YXIgc2VsZj10aGlzO2pRdWVyeS5hamF4KHt1cmw6 dXJsLHR5cGU6dHlwZSxkYXRhVHlwZToiaHRtbCIsZGF0YTpwYXJhbXMsY29tcGxl dGU6ZnVuY3Rpb24ocmVzLHN0YXR1cyl7aWYoc3RhdHVzPT09InN1Y2Nlc3MifHxz dGF0dXM9PT0ibm90bW9kaWZpZWQiKXtzZWxmLmh0bWwoc2VsZWN0b3I/alF1ZXJ5 KCI8ZGl2IC8+IikuYXBwZW5kKHJlcy5yZXNwb25zZVRleHQucmVwbGFjZShyc2Ny aXB0LCIiKSkuZmluZChzZWxlY3Rvcik6cmVzLnJlc3BvbnNlVGV4dCk7fQppZihj YWxsYmFjayl7c2VsZi5lYWNoKGNhbGxiYWNrLFtyZXMucmVzcG9uc2VUZXh0LHN0 YXR1cyxyZXNdKTt9fX0pO3JldHVybiB0aGlzO30sc2VyaWFsaXplOmZ1bmN0aW9u KCl7cmV0dXJuIGpRdWVyeS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpO30s c2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rp b24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cz9qUXVlcnkubWFrZUFycmF5KHRoaXMu ZWxlbWVudHMpOnRoaXM7fSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu bmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fHJzZWxlY3RUZXh0 YXJlYS50ZXN0KHRoaXMubm9kZU5hbWUpfHxyaW5wdXQudGVzdCh0aGlzLnR5cGUp KTt9KS5tYXAoZnVuY3Rpb24oaSxlbGVtKXt2YXIgdmFsPWpRdWVyeSh0aGlzKS52 YWwoKTtyZXR1cm4gdmFsPT1udWxsP251bGw6alF1ZXJ5LmlzQXJyYXkodmFsKT9q UXVlcnkubWFwKHZhbCxmdW5jdGlvbih2YWwsaSl7cmV0dXJue25hbWU6ZWxlbS5u YW1lLHZhbHVlOnZhbH07fSk6e25hbWU6ZWxlbS5uYW1lLHZhbHVlOnZhbH07fSku Z2V0KCk7fX0pO2pRdWVyeS5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENv bXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAi KSxmdW5jdGlvbihpLG8pe2pRdWVyeS5mbltvXT1mdW5jdGlvbihmKXtyZXR1cm4g dGhpcy5iaW5kKG8sZik7fTt9KTtqUXVlcnkuZXh0ZW5kKHtnZXQ6ZnVuY3Rpb24o dXJsLGRhdGEsY2FsbGJhY2ssdHlwZSl7aWYoalF1ZXJ5LmlzRnVuY3Rpb24oZGF0 YSkpe3R5cGU9dHlwZXx8Y2FsbGJhY2s7Y2FsbGJhY2s9ZGF0YTtkYXRhPW51bGw7 fQpyZXR1cm4galF1ZXJ5LmFqYXgoe3R5cGU6IkdFVCIsdXJsOnVybCxkYXRhOmRh dGEsc3VjY2VzczpjYWxsYmFjayxkYXRhVHlwZTp0eXBlfSk7fSxnZXRTY3JpcHQ6 ZnVuY3Rpb24odXJsLGNhbGxiYWNrKXtyZXR1cm4galF1ZXJ5LmdldCh1cmwsbnVs bCxjYWxsYmFjaywic2NyaXB0Iik7fSxnZXRKU09OOmZ1bmN0aW9uKHVybCxkYXRh LGNhbGxiYWNrKXtyZXR1cm4galF1ZXJ5LmdldCh1cmwsZGF0YSxjYWxsYmFjaywi anNvbiIpO30scG9zdDpmdW5jdGlvbih1cmwsZGF0YSxjYWxsYmFjayx0eXBlKXtp ZihqUXVlcnkuaXNGdW5jdGlvbihkYXRhKSl7dHlwZT10eXBlfHxjYWxsYmFjaztj YWxsYmFjaz1kYXRhO2RhdGE9e307fQpyZXR1cm4galF1ZXJ5LmFqYXgoe3R5cGU6 IlBPU1QiLHVybDp1cmwsZGF0YTpkYXRhLHN1Y2Nlc3M6Y2FsbGJhY2ssZGF0YVR5 cGU6dHlwZX0pO30sYWpheFNldHVwOmZ1bmN0aW9uKHNldHRpbmdzKXtqUXVlcnku ZXh0ZW5kKGpRdWVyeS5hamF4U2V0dGluZ3Msc2V0dGluZ3MpO30sYWpheFNldHRp bmdzOnt1cmw6bG9jYXRpb24uaHJlZixnbG9iYWw6dHJ1ZSx0eXBlOiJHRVQiLGNv bnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLHBy b2Nlc3NEYXRhOnRydWUsYXN5bmM6dHJ1ZSx4aHI6d2luZG93LlhNTEh0dHBSZXF1 ZXN0JiYod2luZG93LmxvY2F0aW9uLnByb3RvY29sIT09ImZpbGU6Inx8IXdpbmRv dy5BY3RpdmVYT2JqZWN0KT9mdW5jdGlvbigpe3JldHVybiBuZXcgd2luZG93LlhN TEh0dHBSZXF1ZXN0KCk7fTpmdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IHdpbmRv dy5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpO31jYXRjaChlKXt9 fSxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6 InRleHQvaHRtbCIsc2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9u L2phdmFzY3JpcHQiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNj cmlwdCIsdGV4dDoidGV4dC9wbGFpbiIsX2RlZmF1bHQ6IiovKiJ9fSxsYXN0TW9k aWZpZWQ6e30sZXRhZzp7fSxhamF4OmZ1bmN0aW9uKG9yaWdTZXR0aW5ncyl7dmFy IHM9alF1ZXJ5LmV4dGVuZCh0cnVlLHt9LGpRdWVyeS5hamF4U2V0dGluZ3Msb3Jp Z1NldHRpbmdzKTt2YXIganNvbnAsc3RhdHVzLGRhdGEsY2FsbGJhY2tDb250ZXh0 PW9yaWdTZXR0aW5ncyYmb3JpZ1NldHRpbmdzLmNvbnRleHR8fHMsdHlwZT1zLnR5 cGUudG9VcHBlckNhc2UoKTtpZihzLmRhdGEmJnMucHJvY2Vzc0RhdGEmJnR5cGVv ZiBzLmRhdGEhPT0ic3RyaW5nIil7cy5kYXRhPWpRdWVyeS5wYXJhbShzLmRhdGEs cy50cmFkaXRpb25hbCk7fQppZihzLmRhdGFUeXBlPT09Impzb25wIil7aWYodHlw ZT09PSJHRVQiKXtpZighanNyZS50ZXN0KHMudXJsKSl7cy51cmwrPShycXVlcnku dGVzdChzLnVybCk/IiYiOiI/IikrKHMuanNvbnB8fCJjYWxsYmFjayIpKyI9PyI7 fX1lbHNlIGlmKCFzLmRhdGF8fCFqc3JlLnRlc3Qocy5kYXRhKSl7cy5kYXRhPShz LmRhdGE/cy5kYXRhKyImIjoiIikrKHMuanNvbnB8fCJjYWxsYmFjayIpKyI9PyI7 fQpzLmRhdGFUeXBlPSJqc29uIjt9CmlmKHMuZGF0YVR5cGU9PT0ianNvbiImJihz LmRhdGEmJmpzcmUudGVzdChzLmRhdGEpfHxqc3JlLnRlc3Qocy51cmwpKSl7anNv bnA9cy5qc29ucENhbGxiYWNrfHwoImpzb25wIitqc2MrKyk7aWYocy5kYXRhKXtz LmRhdGE9KHMuZGF0YSsiIikucmVwbGFjZShqc3JlLCI9Iitqc29ucCsiJDEiKTt9 CnMudXJsPXMudXJsLnJlcGxhY2UoanNyZSwiPSIranNvbnArIiQxIik7cy5kYXRh VHlwZT0ic2NyaXB0Ijt3aW5kb3dbanNvbnBdPXdpbmRvd1tqc29ucF18fGZ1bmN0 aW9uKHRtcCl7ZGF0YT10bXA7c3VjY2VzcygpO2NvbXBsZXRlKCk7d2luZG93W2pz b25wXT11bmRlZmluZWQ7dHJ5e2RlbGV0ZSB3aW5kb3dbanNvbnBdO31jYXRjaChl KXt9CmlmKGhlYWQpe2hlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0KTt9fTt9CmlmKHMu ZGF0YVR5cGU9PT0ic2NyaXB0IiYmcy5jYWNoZT09PW51bGwpe3MuY2FjaGU9ZmFs c2U7fQppZihzLmNhY2hlPT09ZmFsc2UmJnR5cGU9PT0iR0VUIil7dmFyIHRzPW5v dygpO3ZhciByZXQ9cy51cmwucmVwbGFjZShydHMsIiQxXz0iK3RzKyIkMiIpO3Mu dXJsPXJldCsoKHJldD09PXMudXJsKT8ocnF1ZXJ5LnRlc3Qocy51cmwpPyImIjoi PyIpKyJfPSIrdHM6IiIpO30KaWYocy5kYXRhJiZ0eXBlPT09IkdFVCIpe3MudXJs Kz0ocnF1ZXJ5LnRlc3Qocy51cmwpPyImIjoiPyIpK3MuZGF0YTt9CmlmKHMuZ2xv YmFsJiYhalF1ZXJ5LmFjdGl2ZSsrKXtqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWph eFN0YXJ0Iik7fQp2YXIgcGFydHM9cnVybC5leGVjKHMudXJsKSxyZW1vdGU9cGFy dHMmJihwYXJ0c1sxXSYmcGFydHNbMV0hPT1sb2NhdGlvbi5wcm90b2NvbHx8cGFy dHNbMl0hPT1sb2NhdGlvbi5ob3N0KTtpZihzLmRhdGFUeXBlPT09InNjcmlwdCIm JnR5cGU9PT0iR0VUIiYmcmVtb3RlKXt2YXIgaGVhZD1kb2N1bWVudC5nZXRFbGVt ZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxkb2N1bWVudC5kb2N1bWVudEVsZW1l bnQ7dmFyIHNjcmlwdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtz Y3JpcHQuc3JjPXMudXJsO2lmKHMuc2NyaXB0Q2hhcnNldCl7c2NyaXB0LmNoYXJz ZXQ9cy5zY3JpcHRDaGFyc2V0O30KaWYoIWpzb25wKXt2YXIgZG9uZT1mYWxzZTtz Y3JpcHQub25sb2FkPXNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24o KXtpZighZG9uZSYmKCF0aGlzLnJlYWR5U3RhdGV8fHRoaXMucmVhZHlTdGF0ZT09 PSJsb2FkZWQifHx0aGlzLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKSl7ZG9uZT10 cnVlO3N1Y2Nlc3MoKTtjb21wbGV0ZSgpO3NjcmlwdC5vbmxvYWQ9c2NyaXB0Lm9u cmVhZHlzdGF0ZWNoYW5nZT1udWxsO2lmKGhlYWQmJnNjcmlwdC5wYXJlbnROb2Rl KXtoZWFkLnJlbW92ZUNoaWxkKHNjcmlwdCk7fX19O30KaGVhZC5pbnNlcnRCZWZv cmUoc2NyaXB0LGhlYWQuZmlyc3RDaGlsZCk7cmV0dXJuIHVuZGVmaW5lZDt9CnZh ciByZXF1ZXN0RG9uZT1mYWxzZTt2YXIgeGhyPXMueGhyKCk7aWYoIXhocil7cmV0 dXJuO30KaWYocy51c2VybmFtZSl7eGhyLm9wZW4odHlwZSxzLnVybCxzLmFzeW5j LHMudXNlcm5hbWUscy5wYXNzd29yZCk7fWVsc2V7eGhyLm9wZW4odHlwZSxzLnVy bCxzLmFzeW5jKTt9CnRyeXtpZihzLmRhdGF8fG9yaWdTZXR0aW5ncyYmb3JpZ1Nl dHRpbmdzLmNvbnRlbnRUeXBlKXt4aHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVu dC1UeXBlIixzLmNvbnRlbnRUeXBlKTt9CmlmKHMuaWZNb2RpZmllZCl7aWYoalF1 ZXJ5Lmxhc3RNb2RpZmllZFtzLnVybF0pe3hoci5zZXRSZXF1ZXN0SGVhZGVyKCJJ Zi1Nb2RpZmllZC1TaW5jZSIsalF1ZXJ5Lmxhc3RNb2RpZmllZFtzLnVybF0pO30K aWYoalF1ZXJ5LmV0YWdbcy51cmxdKXt4aHIuc2V0UmVxdWVzdEhlYWRlcigiSWYt Tm9uZS1NYXRjaCIsalF1ZXJ5LmV0YWdbcy51cmxdKTt9fQppZighcmVtb3RlKXt4 aHIuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsIlhNTEh0dHBS ZXF1ZXN0Iik7fQp4aHIuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixzLmRhdGFU eXBlJiZzLmFjY2VwdHNbcy5kYXRhVHlwZV0/cy5hY2NlcHRzW3MuZGF0YVR5cGVd KyIsICovKiI6cy5hY2NlcHRzLl9kZWZhdWx0KTt9Y2F0Y2goZSl7fQppZihzLmJl Zm9yZVNlbmQmJnMuYmVmb3JlU2VuZC5jYWxsKGNhbGxiYWNrQ29udGV4dCx4aHIs cyk9PT1mYWxzZSl7aWYocy5nbG9iYWwmJiEtLWpRdWVyeS5hY3RpdmUpe2pRdWVy eS5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpO30KeGhyLmFib3J0KCk7cmV0dXJu IGZhbHNlO30KaWYocy5nbG9iYWwpe3RyaWdnZXIoImFqYXhTZW5kIixbeGhyLHNd KTt9CnZhciBvbnJlYWR5c3RhdGVjaGFuZ2U9eGhyLm9ucmVhZHlzdGF0ZWNoYW5n ZT1mdW5jdGlvbihpc1RpbWVvdXQpe2lmKCF4aHJ8fHhoci5yZWFkeVN0YXRlPT09 MHx8aXNUaW1lb3V0PT09ImFib3J0Iil7aWYoIXJlcXVlc3REb25lKXtjb21wbGV0 ZSgpO30KcmVxdWVzdERvbmU9dHJ1ZTtpZih4aHIpe3hoci5vbnJlYWR5c3RhdGVj aGFuZ2U9alF1ZXJ5Lm5vb3A7fX1lbHNlIGlmKCFyZXF1ZXN0RG9uZSYmeGhyJiYo eGhyLnJlYWR5U3RhdGU9PT00fHxpc1RpbWVvdXQ9PT0idGltZW91dCIpKXtyZXF1 ZXN0RG9uZT10cnVlO3hoci5vbnJlYWR5c3RhdGVjaGFuZ2U9alF1ZXJ5Lm5vb3A7 c3RhdHVzPWlzVGltZW91dD09PSJ0aW1lb3V0Ij8idGltZW91dCI6IWpRdWVyeS5o dHRwU3VjY2Vzcyh4aHIpPyJlcnJvciI6cy5pZk1vZGlmaWVkJiZqUXVlcnkuaHR0 cE5vdE1vZGlmaWVkKHhocixzLnVybCk/Im5vdG1vZGlmaWVkIjoic3VjY2VzcyI7 dmFyIGVyck1zZztpZihzdGF0dXM9PT0ic3VjY2VzcyIpe3RyeXtkYXRhPWpRdWVy eS5odHRwRGF0YSh4aHIscy5kYXRhVHlwZSxzKTt9Y2F0Y2goZXJyKXtzdGF0dXM9 InBhcnNlcmVycm9yIjtlcnJNc2c9ZXJyO319CmlmKHN0YXR1cz09PSJzdWNjZXNz Inx8c3RhdHVzPT09Im5vdG1vZGlmaWVkIil7aWYoIWpzb25wKXtzdWNjZXNzKCk7 fX1lbHNle2pRdWVyeS5oYW5kbGVFcnJvcihzLHhocixzdGF0dXMsZXJyTXNnKTt9 CmNvbXBsZXRlKCk7aWYoaXNUaW1lb3V0PT09InRpbWVvdXQiKXt4aHIuYWJvcnQo KTt9CmlmKHMuYXN5bmMpe3hocj1udWxsO319fTt0cnl7dmFyIG9sZEFib3J0PXho ci5hYm9ydDt4aHIuYWJvcnQ9ZnVuY3Rpb24oKXtpZih4aHIpe29sZEFib3J0LmNh bGwoeGhyKTt9Cm9ucmVhZHlzdGF0ZWNoYW5nZSgiYWJvcnQiKTt9O31jYXRjaChl KXt9CmlmKHMuYXN5bmMmJnMudGltZW91dD4wKXtzZXRUaW1lb3V0KGZ1bmN0aW9u KCl7aWYoeGhyJiYhcmVxdWVzdERvbmUpe29ucmVhZHlzdGF0ZWNoYW5nZSgidGlt ZW91dCIpO319LHMudGltZW91dCk7fQp0cnl7eGhyLnNlbmQodHlwZT09PSJQT1NU Inx8dHlwZT09PSJQVVQifHx0eXBlPT09IkRFTEVURSI/cy5kYXRhOm51bGwpO31j YXRjaChlKXtqUXVlcnkuaGFuZGxlRXJyb3Iocyx4aHIsbnVsbCxlKTtjb21wbGV0 ZSgpO30KaWYoIXMuYXN5bmMpe29ucmVhZHlzdGF0ZWNoYW5nZSgpO30KZnVuY3Rp b24gc3VjY2Vzcygpe2lmKHMuc3VjY2Vzcyl7cy5zdWNjZXNzLmNhbGwoY2FsbGJh Y2tDb250ZXh0LGRhdGEsc3RhdHVzLHhocik7fQppZihzLmdsb2JhbCl7dHJpZ2dl cigiYWpheFN1Y2Nlc3MiLFt4aHIsc10pO319CmZ1bmN0aW9uIGNvbXBsZXRlKCl7 aWYocy5jb21wbGV0ZSl7cy5jb21wbGV0ZS5jYWxsKGNhbGxiYWNrQ29udGV4dCx4 aHIsc3RhdHVzKTt9CmlmKHMuZ2xvYmFsKXt0cmlnZ2VyKCJhamF4Q29tcGxldGUi LFt4aHIsc10pO30KaWYocy5nbG9iYWwmJiEtLWpRdWVyeS5hY3RpdmUpe2pRdWVy eS5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpO319CmZ1bmN0aW9uIHRyaWdnZXIo dHlwZSxhcmdzKXsocy5jb250ZXh0P2pRdWVyeShzLmNvbnRleHQpOmpRdWVyeS5l dmVudCkudHJpZ2dlcih0eXBlLGFyZ3MpO30KcmV0dXJuIHhocjt9LGhhbmRsZUVy cm9yOmZ1bmN0aW9uKHMseGhyLHN0YXR1cyxlKXtpZihzLmVycm9yKXtzLmVycm9y LmNhbGwocy5jb250ZXh0fHxzLHhocixzdGF0dXMsZSk7fQppZihzLmdsb2JhbCl7 KHMuY29udGV4dD9qUXVlcnkocy5jb250ZXh0KTpqUXVlcnkuZXZlbnQpLnRyaWdn ZXIoImFqYXhFcnJvciIsW3hocixzLGVdKTt9fSxhY3RpdmU6MCxodHRwU3VjY2Vz czpmdW5jdGlvbih4aHIpe3RyeXtyZXR1cm4heGhyLnN0YXR1cyYmbG9jYXRpb24u cHJvdG9jb2w9PT0iZmlsZToifHwoeGhyLnN0YXR1cz49MjAwJiZ4aHIuc3RhdHVz PDMwMCl8fHhoci5zdGF0dXM9PT0zMDR8fHhoci5zdGF0dXM9PT0xMjIzfHx4aHIu c3RhdHVzPT09MDt9Y2F0Y2goZSl7fQpyZXR1cm4gZmFsc2U7fSxodHRwTm90TW9k aWZpZWQ6ZnVuY3Rpb24oeGhyLHVybCl7dmFyIGxhc3RNb2RpZmllZD14aHIuZ2V0 UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSxldGFnPXhoci5nZXRSZXNw b25zZUhlYWRlcigiRXRhZyIpO2lmKGxhc3RNb2RpZmllZCl7alF1ZXJ5Lmxhc3RN b2RpZmllZFt1cmxdPWxhc3RNb2RpZmllZDt9CmlmKGV0YWcpe2pRdWVyeS5ldGFn W3VybF09ZXRhZzt9CnJldHVybiB4aHIuc3RhdHVzPT09MzA0fHx4aHIuc3RhdHVz PT09MDt9LGh0dHBEYXRhOmZ1bmN0aW9uKHhocix0eXBlLHMpe3ZhciBjdD14aHIu Z2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpfHwiIix4bWw9dHlwZT09 PSJ4bWwifHwhdHlwZSYmY3QuaW5kZXhPZigieG1sIik+PTAsZGF0YT14bWw/eGhy LnJlc3BvbnNlWE1MOnhoci5yZXNwb25zZVRleHQ7aWYoeG1sJiZkYXRhLmRvY3Vt ZW50RWxlbWVudC5ub2RlTmFtZT09PSJwYXJzZXJlcnJvciIpe2pRdWVyeS5lcnJv cigicGFyc2VyZXJyb3IiKTt9CmlmKHMmJnMuZGF0YUZpbHRlcil7ZGF0YT1zLmRh dGFGaWx0ZXIoZGF0YSx0eXBlKTt9CmlmKHR5cGVvZiBkYXRhPT09InN0cmluZyIp e2lmKHR5cGU9PT0ianNvbiJ8fCF0eXBlJiZjdC5pbmRleE9mKCJqc29uIik+PTAp e2RhdGE9alF1ZXJ5LnBhcnNlSlNPTihkYXRhKTt9ZWxzZSBpZih0eXBlPT09InNj cmlwdCJ8fCF0eXBlJiZjdC5pbmRleE9mKCJqYXZhc2NyaXB0Iik+PTApe2pRdWVy eS5nbG9iYWxFdmFsKGRhdGEpO319CnJldHVybiBkYXRhO30scGFyYW06ZnVuY3Rp b24oYSx0cmFkaXRpb25hbCl7dmFyIHM9W107aWYodHJhZGl0aW9uYWw9PT11bmRl ZmluZWQpe3RyYWRpdGlvbmFsPWpRdWVyeS5hamF4U2V0dGluZ3MudHJhZGl0aW9u YWw7fQppZihqUXVlcnkuaXNBcnJheShhKXx8YS5qcXVlcnkpe2pRdWVyeS5lYWNo KGEsZnVuY3Rpb24oKXthZGQodGhpcy5uYW1lLHRoaXMudmFsdWUpO30pO31lbHNl e2Zvcih2YXIgcHJlZml4IGluIGEpe2J1aWxkUGFyYW1zKHByZWZpeCxhW3ByZWZp eF0pO319CnJldHVybiBzLmpvaW4oIiYiKS5yZXBsYWNlKHIyMCwiKyIpO2Z1bmN0 aW9uIGJ1aWxkUGFyYW1zKHByZWZpeCxvYmope2lmKGpRdWVyeS5pc0FycmF5KG9i aikpe2pRdWVyeS5lYWNoKG9iaixmdW5jdGlvbihpLHYpe2lmKHRyYWRpdGlvbmFs fHwvXFtcXSQvLnRlc3QocHJlZml4KSl7YWRkKHByZWZpeCx2KTt9ZWxzZXtidWls ZFBhcmFtcyhwcmVmaXgrIlsiKyh0eXBlb2Ygdj09PSJvYmplY3QifHxqUXVlcnku aXNBcnJheSh2KT9pOiIiKSsiXSIsdik7fX0pO31lbHNlIGlmKCF0cmFkaXRpb25h bCYmb2JqIT1udWxsJiZ0eXBlb2Ygb2JqPT09Im9iamVjdCIpe2pRdWVyeS5lYWNo KG9iaixmdW5jdGlvbihrLHYpe2J1aWxkUGFyYW1zKHByZWZpeCsiWyIraysiXSIs dik7fSk7fWVsc2V7YWRkKHByZWZpeCxvYmopO319CmZ1bmN0aW9uIGFkZChrZXks dmFsdWUpe3ZhbHVlPWpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKT92YWx1ZSgpOnZh bHVlO3Nbcy5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChrZXkpKyI9IitlbmNv ZGVVUklDb21wb25lbnQodmFsdWUpO319fSk7dmFyIGVsZW1kaXNwbGF5PXt9LHJm eHR5cGVzPS90b2dnbGV8c2hvd3xoaWRlLyxyZnhudW09L14oWystXT0pPyhbXGQr LS5dKykoLiopJC8sdGltZXJJZCxmeEF0dHJzPVtbImhlaWdodCIsIm1hcmdpblRv cCIsIm1hcmdpbkJvdHRvbSIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIl0s WyJ3aWR0aCIsIm1hcmdpbkxlZnQiLCJtYXJnaW5SaWdodCIsInBhZGRpbmdMZWZ0 IiwicGFkZGluZ1JpZ2h0Il0sWyJvcGFjaXR5Il1dO2pRdWVyeS5mbi5leHRlbmQo e3Nob3c6ZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2spe2lmKHNwZWVkfHxzcGVlZD09 PTApe3JldHVybiB0aGlzLmFuaW1hdGUoZ2VuRngoInNob3ciLDMpLHNwZWVkLGNh bGxiYWNrKTt9ZWxzZXtmb3IodmFyIGk9MCxsPXRoaXMubGVuZ3RoO2k8bDtpKysp e3ZhciBvbGQ9alF1ZXJ5LmRhdGEodGhpc1tpXSwib2xkZGlzcGxheSIpO3RoaXNb aV0uc3R5bGUuZGlzcGxheT1vbGR8fCIiO2lmKGpRdWVyeS5jc3ModGhpc1tpXSwi ZGlzcGxheSIpPT09Im5vbmUiKXt2YXIgbm9kZU5hbWU9dGhpc1tpXS5ub2RlTmFt ZSxkaXNwbGF5O2lmKGVsZW1kaXNwbGF5W25vZGVOYW1lXSl7ZGlzcGxheT1lbGVt ZGlzcGxheVtub2RlTmFtZV07fWVsc2V7dmFyIGVsZW09alF1ZXJ5KCI8Iitub2Rl TmFtZSsiIC8+IikuYXBwZW5kVG8oImJvZHkiKTtkaXNwbGF5PWVsZW0uY3NzKCJk aXNwbGF5Iik7aWYoZGlzcGxheT09PSJub25lIil7ZGlzcGxheT0iYmxvY2siO30K ZWxlbS5yZW1vdmUoKTtlbGVtZGlzcGxheVtub2RlTmFtZV09ZGlzcGxheTt9CmpR dWVyeS5kYXRhKHRoaXNbaV0sIm9sZGRpc3BsYXkiLGRpc3BsYXkpO319CmZvcih2 YXIgaj0wLGs9dGhpcy5sZW5ndGg7ajxrO2orKyl7dGhpc1tqXS5zdHlsZS5kaXNw bGF5PWpRdWVyeS5kYXRhKHRoaXNbal0sIm9sZGRpc3BsYXkiKXx8IiI7fQpyZXR1 cm4gdGhpczt9fSxoaWRlOmZ1bmN0aW9uKHNwZWVkLGNhbGxiYWNrKXtpZihzcGVl ZHx8c3BlZWQ9PT0wKXtyZXR1cm4gdGhpcy5hbmltYXRlKGdlbkZ4KCJoaWRlIiwz KSxzcGVlZCxjYWxsYmFjayk7fWVsc2V7Zm9yKHZhciBpPTAsbD10aGlzLmxlbmd0 aDtpPGw7aSsrKXt2YXIgb2xkPWpRdWVyeS5kYXRhKHRoaXNbaV0sIm9sZGRpc3Bs YXkiKTtpZighb2xkJiZvbGQhPT0ibm9uZSIpe2pRdWVyeS5kYXRhKHRoaXNbaV0s Im9sZGRpc3BsYXkiLGpRdWVyeS5jc3ModGhpc1tpXSwiZGlzcGxheSIpKTt9fQpm b3IodmFyIGo9MCxrPXRoaXMubGVuZ3RoO2o8aztqKyspe3RoaXNbal0uc3R5bGUu ZGlzcGxheT0ibm9uZSI7fQpyZXR1cm4gdGhpczt9fSxfdG9nZ2xlOmpRdWVyeS5m bi50b2dnbGUsdG9nZ2xlOmZ1bmN0aW9uKGZuLGZuMil7dmFyIGJvb2w9dHlwZW9m IGZuPT09ImJvb2xlYW4iO2lmKGpRdWVyeS5pc0Z1bmN0aW9uKGZuKSYmalF1ZXJ5 LmlzRnVuY3Rpb24oZm4yKSl7dGhpcy5fdG9nZ2xlLmFwcGx5KHRoaXMsYXJndW1l bnRzKTt9ZWxzZSBpZihmbj09bnVsbHx8Ym9vbCl7dGhpcy5lYWNoKGZ1bmN0aW9u KCl7dmFyIHN0YXRlPWJvb2w/Zm46alF1ZXJ5KHRoaXMpLmlzKCI6aGlkZGVuIik7 alF1ZXJ5KHRoaXMpW3N0YXRlPyJzaG93IjoiaGlkZSJdKCk7fSk7fWVsc2V7dGhp cy5hbmltYXRlKGdlbkZ4KCJ0b2dnbGUiLDMpLGZuLGZuMik7fQpyZXR1cm4gdGhp czt9LGZhZGVUbzpmdW5jdGlvbihzcGVlZCx0byxjYWxsYmFjayl7cmV0dXJuIHRo aXMuZmlsdGVyKCI6aGlkZGVuIikuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5k KCkuYW5pbWF0ZSh7b3BhY2l0eTp0b30sc3BlZWQsY2FsbGJhY2spO30sYW5pbWF0 ZTpmdW5jdGlvbihwcm9wLHNwZWVkLGVhc2luZyxjYWxsYmFjayl7dmFyIG9wdGFs bD1qUXVlcnkuc3BlZWQoc3BlZWQsZWFzaW5nLGNhbGxiYWNrKTtpZihqUXVlcnku aXNFbXB0eU9iamVjdChwcm9wKSl7cmV0dXJuIHRoaXMuZWFjaChvcHRhbGwuY29t cGxldGUpO30KcmV0dXJuIHRoaXNbb3B0YWxsLnF1ZXVlPT09ZmFsc2U/ImVhY2gi OiJxdWV1ZSJdKGZ1bmN0aW9uKCl7dmFyIG9wdD1qUXVlcnkuZXh0ZW5kKHt9LG9w dGFsbCkscCxoaWRkZW49dGhpcy5ub2RlVHlwZT09PTEmJmpRdWVyeSh0aGlzKS5p cygiOmhpZGRlbiIpLHNlbGY9dGhpcztmb3IocCBpbiBwcm9wKXt2YXIgbmFtZT1w LnJlcGxhY2UocmRhc2hBbHBoYSxmY2FtZWxDYXNlKTtpZihwIT09bmFtZSl7cHJv cFtuYW1lXT1wcm9wW3BdO2RlbGV0ZSBwcm9wW3BdO3A9bmFtZTt9CmlmKHByb3Bb cF09PT0iaGlkZSImJmhpZGRlbnx8cHJvcFtwXT09PSJzaG93IiYmIWhpZGRlbil7 cmV0dXJuIG9wdC5jb21wbGV0ZS5jYWxsKHRoaXMpO30KaWYoKHA9PT0iaGVpZ2h0 Inx8cD09PSJ3aWR0aCIpJiZ0aGlzLnN0eWxlKXtvcHQuZGlzcGxheT1qUXVlcnku Y3NzKHRoaXMsImRpc3BsYXkiKTtvcHQub3ZlcmZsb3c9dGhpcy5zdHlsZS5vdmVy Zmxvdzt9CmlmKGpRdWVyeS5pc0FycmF5KHByb3BbcF0pKXsob3B0LnNwZWNpYWxF YXNpbmc9b3B0LnNwZWNpYWxFYXNpbmd8fHt9KVtwXT1wcm9wW3BdWzFdO3Byb3Bb cF09cHJvcFtwXVswXTt9fQppZihvcHQub3ZlcmZsb3chPW51bGwpe3RoaXMuc3R5 bGUub3ZlcmZsb3c9ImhpZGRlbiI7fQpvcHQuY3VyQW5pbT1qUXVlcnkuZXh0ZW5k KHt9LHByb3ApO2pRdWVyeS5lYWNoKHByb3AsZnVuY3Rpb24obmFtZSx2YWwpe3Zh ciBlPW5ldyBqUXVlcnkuZngoc2VsZixvcHQsbmFtZSk7aWYocmZ4dHlwZXMudGVz dCh2YWwpKXtlW3ZhbD09PSJ0b2dnbGUiP2hpZGRlbj8ic2hvdyI6ImhpZGUiOnZh bF0ocHJvcCk7fWVsc2V7dmFyIHBhcnRzPXJmeG51bS5leGVjKHZhbCksc3RhcnQ9 ZS5jdXIodHJ1ZSl8fDA7aWYocGFydHMpe3ZhciBlbmQ9cGFyc2VGbG9hdChwYXJ0 c1syXSksdW5pdD1wYXJ0c1szXXx8InB4IjtpZih1bml0IT09InB4Iil7c2VsZi5z dHlsZVtuYW1lXT0oZW5kfHwxKSt1bml0O3N0YXJ0PSgoZW5kfHwxKS9lLmN1cih0 cnVlKSkqc3RhcnQ7c2VsZi5zdHlsZVtuYW1lXT1zdGFydCt1bml0O30KaWYocGFy dHNbMV0pe2VuZD0oKHBhcnRzWzFdPT09Ii09Ij8tMToxKSplbmQpK3N0YXJ0O30K ZS5jdXN0b20oc3RhcnQsZW5kLHVuaXQpO31lbHNle2UuY3VzdG9tKHN0YXJ0LHZh bCwiIik7fX19KTtyZXR1cm4gdHJ1ZTt9KTt9LHN0b3A6ZnVuY3Rpb24oY2xlYXJR dWV1ZSxnb3RvRW5kKXt2YXIgdGltZXJzPWpRdWVyeS50aW1lcnM7aWYoY2xlYXJR dWV1ZSl7dGhpcy5xdWV1ZShbXSk7fQp0aGlzLmVhY2goZnVuY3Rpb24oKXtmb3Io dmFyIGk9dGltZXJzLmxlbmd0aC0xO2k+PTA7aS0tKXtpZih0aW1lcnNbaV0uZWxl bT09PXRoaXMpe2lmKGdvdG9FbmQpe3RpbWVyc1tpXSh0cnVlKTt9CnRpbWVycy5z cGxpY2UoaSwxKTt9fX0pO2lmKCFnb3RvRW5kKXt0aGlzLmRlcXVldWUoKTt9CnJl dHVybiB0aGlzO319KTtqUXVlcnkuZWFjaCh7c2xpZGVEb3duOmdlbkZ4KCJzaG93 IiwxKSxzbGlkZVVwOmdlbkZ4KCJoaWRlIiwxKSxzbGlkZVRvZ2dsZTpnZW5GeCgi dG9nZ2xlIiwxKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFj aXR5OiJoaWRlIn19LGZ1bmN0aW9uKG5hbWUscHJvcHMpe2pRdWVyeS5mbltuYW1l XT1mdW5jdGlvbihzcGVlZCxjYWxsYmFjayl7cmV0dXJuIHRoaXMuYW5pbWF0ZShw cm9wcyxzcGVlZCxjYWxsYmFjayk7fTt9KTtqUXVlcnkuZXh0ZW5kKHtzcGVlZDpm dW5jdGlvbihzcGVlZCxlYXNpbmcsZm4pe3ZhciBvcHQ9c3BlZWQmJnR5cGVvZiBz cGVlZD09PSJvYmplY3QiP3NwZWVkOntjb21wbGV0ZTpmbnx8IWZuJiZlYXNpbmd8 fGpRdWVyeS5pc0Z1bmN0aW9uKHNwZWVkKSYmc3BlZWQsZHVyYXRpb246c3BlZWQs ZWFzaW5nOmZuJiZlYXNpbmd8fGVhc2luZyYmIWpRdWVyeS5pc0Z1bmN0aW9uKGVh c2luZykmJmVhc2luZ307b3B0LmR1cmF0aW9uPWpRdWVyeS5meC5vZmY/MDp0eXBl b2Ygb3B0LmR1cmF0aW9uPT09Im51bWJlciI/b3B0LmR1cmF0aW9uOmpRdWVyeS5m eC5zcGVlZHNbb3B0LmR1cmF0aW9uXXx8alF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVs dDtvcHQub2xkPW9wdC5jb21wbGV0ZTtvcHQuY29tcGxldGU9ZnVuY3Rpb24oKXtp ZihvcHQucXVldWUhPT1mYWxzZSl7alF1ZXJ5KHRoaXMpLmRlcXVldWUoKTt9Cmlm KGpRdWVyeS5pc0Z1bmN0aW9uKG9wdC5vbGQpKXtvcHQub2xkLmNhbGwodGhpcyk7 fX07cmV0dXJuIG9wdDt9LGVhc2luZzp7bGluZWFyOmZ1bmN0aW9uKHAsbixmaXJz dE51bSxkaWZmKXtyZXR1cm4gZmlyc3ROdW0rZGlmZipwO30sc3dpbmc6ZnVuY3Rp b24ocCxuLGZpcnN0TnVtLGRpZmYpe3JldHVybigoLU1hdGguY29zKHAqTWF0aC5Q SSkvMikrMC41KSpkaWZmK2ZpcnN0TnVtO319LHRpbWVyczpbXSxmeDpmdW5jdGlv bihlbGVtLG9wdGlvbnMscHJvcCl7dGhpcy5vcHRpb25zPW9wdGlvbnM7dGhpcy5l bGVtPWVsZW07dGhpcy5wcm9wPXByb3A7aWYoIW9wdGlvbnMub3JpZyl7b3B0aW9u cy5vcmlnPXt9O319fSk7alF1ZXJ5LmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0 aW9uKCl7aWYodGhpcy5vcHRpb25zLnN0ZXApe3RoaXMub3B0aW9ucy5zdGVwLmNh bGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpO30KKGpRdWVyeS5meC5zdGVwW3Ro aXMucHJvcF18fGpRdWVyeS5meC5zdGVwLl9kZWZhdWx0KSh0aGlzKTtpZigodGhp cy5wcm9wPT09ImhlaWdodCJ8fHRoaXMucHJvcD09PSJ3aWR0aCIpJiZ0aGlzLmVs ZW0uc3R5bGUpe3RoaXMuZWxlbS5zdHlsZS5kaXNwbGF5PSJibG9jayI7fX0sY3Vy OmZ1bmN0aW9uKGZvcmNlKXtpZih0aGlzLmVsZW1bdGhpcy5wcm9wXSE9bnVsbCYm KCF0aGlzLmVsZW0uc3R5bGV8fHRoaXMuZWxlbS5zdHlsZVt0aGlzLnByb3BdPT1u dWxsKSl7cmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO30KdmFyIHI9cGFyc2VG bG9hdChqUXVlcnkuY3NzKHRoaXMuZWxlbSx0aGlzLnByb3AsZm9yY2UpKTtyZXR1 cm4gciYmcj4tMTAwMDA/cjpwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1ModGhpcy5l bGVtLHRoaXMucHJvcCkpfHwwO30sY3VzdG9tOmZ1bmN0aW9uKGZyb20sdG8sdW5p dCl7dGhpcy5zdGFydFRpbWU9bm93KCk7dGhpcy5zdGFydD1mcm9tO3RoaXMuZW5k PXRvO3RoaXMudW5pdD11bml0fHx0aGlzLnVuaXR8fCJweCI7dGhpcy5ub3c9dGhp cy5zdGFydDt0aGlzLnBvcz10aGlzLnN0YXRlPTA7dmFyIHNlbGY9dGhpcztmdW5j dGlvbiB0KGdvdG9FbmQpe3JldHVybiBzZWxmLnN0ZXAoZ290b0VuZCk7fQp0LmVs ZW09dGhpcy5lbGVtO2lmKHQoKSYmalF1ZXJ5LnRpbWVycy5wdXNoKHQpJiYhdGlt ZXJJZCl7dGltZXJJZD1zZXRJbnRlcnZhbChqUXVlcnkuZngudGljaywxMyk7fX0s c2hvdzpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09alF1 ZXJ5LnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5zaG93 PXRydWU7dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9w PT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpO2pRdWVyeSh0aGlzLmVsZW0pLnNo b3coKTt9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnBy b3BdPWpRdWVyeS5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKTt0aGlzLm9wdGlv bnMuaGlkZT10cnVlO3RoaXMuY3VzdG9tKHRoaXMuY3VyKCksMCk7fSxzdGVwOmZ1 bmN0aW9uKGdvdG9FbmQpe3ZhciB0PW5vdygpLGRvbmU9dHJ1ZTtpZihnb3RvRW5k fHx0Pj10aGlzLm9wdGlvbnMuZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMu bm93PXRoaXMuZW5kO3RoaXMucG9zPXRoaXMuc3RhdGU9MTt0aGlzLnVwZGF0ZSgp O3RoaXMub3B0aW9ucy5jdXJBbmltW3RoaXMucHJvcF09dHJ1ZTtmb3IodmFyIGkg aW4gdGhpcy5vcHRpb25zLmN1ckFuaW0pe2lmKHRoaXMub3B0aW9ucy5jdXJBbmlt W2ldIT09dHJ1ZSl7ZG9uZT1mYWxzZTt9fQppZihkb25lKXtpZih0aGlzLm9wdGlv bnMuZGlzcGxheSE9bnVsbCl7dGhpcy5lbGVtLnN0eWxlLm92ZXJmbG93PXRoaXMu b3B0aW9ucy5vdmVyZmxvdzt2YXIgb2xkPWpRdWVyeS5kYXRhKHRoaXMuZWxlbSwi b2xkZGlzcGxheSIpO3RoaXMuZWxlbS5zdHlsZS5kaXNwbGF5PW9sZD9vbGQ6dGhp cy5vcHRpb25zLmRpc3BsYXk7aWYoalF1ZXJ5LmNzcyh0aGlzLmVsZW0sImRpc3Bs YXkiKT09PSJub25lIil7dGhpcy5lbGVtLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt9 fQppZih0aGlzLm9wdGlvbnMuaGlkZSl7alF1ZXJ5KHRoaXMuZWxlbSkuaGlkZSgp O30KaWYodGhpcy5vcHRpb25zLmhpZGV8fHRoaXMub3B0aW9ucy5zaG93KXtmb3Io dmFyIHAgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0pe2pRdWVyeS5zdHlsZSh0aGlz LmVsZW0scCx0aGlzLm9wdGlvbnMub3JpZ1twXSk7fX0KdGhpcy5vcHRpb25zLmNv bXBsZXRlLmNhbGwodGhpcy5lbGVtKTt9CnJldHVybiBmYWxzZTt9ZWxzZXt2YXIg bj10LXRoaXMuc3RhcnRUaW1lO3RoaXMuc3RhdGU9bi90aGlzLm9wdGlvbnMuZHVy YXRpb247dmFyIHNwZWNpYWxFYXNpbmc9dGhpcy5vcHRpb25zLnNwZWNpYWxFYXNp bmcmJnRoaXMub3B0aW9ucy5zcGVjaWFsRWFzaW5nW3RoaXMucHJvcF07dmFyIGRl ZmF1bHRFYXNpbmc9dGhpcy5vcHRpb25zLmVhc2luZ3x8KGpRdWVyeS5lYXNpbmcu c3dpbmc/InN3aW5nIjoibGluZWFyIik7dGhpcy5wb3M9alF1ZXJ5LmVhc2luZ1tz cGVjaWFsRWFzaW5nfHxkZWZhdWx0RWFzaW5nXSh0aGlzLnN0YXRlLG4sMCwxLHRo aXMub3B0aW9ucy5kdXJhdGlvbik7dGhpcy5ub3c9dGhpcy5zdGFydCsoKHRoaXMu ZW5kLXRoaXMuc3RhcnQpKnRoaXMucG9zKTt0aGlzLnVwZGF0ZSgpO30KcmV0dXJu IHRydWU7fX07alF1ZXJ5LmV4dGVuZChqUXVlcnkuZngse3RpY2s6ZnVuY3Rpb24o KXt2YXIgdGltZXJzPWpRdWVyeS50aW1lcnM7Zm9yKHZhciBpPTA7aTx0aW1lcnMu bGVuZ3RoO2krKyl7aWYoIXRpbWVyc1tpXSgpKXt0aW1lcnMuc3BsaWNlKGktLSwx KTt9fQppZighdGltZXJzLmxlbmd0aCl7alF1ZXJ5LmZ4LnN0b3AoKTt9fSxzdG9w OmZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbCh0aW1lcklkKTt0aW1lcklkPW51bGw7 fSxzcGVlZHM6e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sc3RlcDp7 b3BhY2l0eTpmdW5jdGlvbihmeCl7alF1ZXJ5LnN0eWxlKGZ4LmVsZW0sIm9wYWNp dHkiLGZ4Lm5vdyk7fSxfZGVmYXVsdDpmdW5jdGlvbihmeCl7aWYoZnguZWxlbS5z dHlsZSYmZnguZWxlbS5zdHlsZVtmeC5wcm9wXSE9bnVsbCl7ZnguZWxlbS5zdHls ZVtmeC5wcm9wXT0oZngucHJvcD09PSJ3aWR0aCJ8fGZ4LnByb3A9PT0iaGVpZ2h0 Ij9NYXRoLm1heCgwLGZ4Lm5vdyk6Zngubm93KStmeC51bml0O31lbHNle2Z4LmVs ZW1bZngucHJvcF09Zngubm93O319fX0pO2lmKGpRdWVyeS5leHByJiZqUXVlcnku ZXhwci5maWx0ZXJzKXtqUXVlcnkuZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0 aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLGZ1bmN0 aW9uKGZuKXtyZXR1cm4gZWxlbT09PWZuLmVsZW07fSkubGVuZ3RoO307fQpmdW5j dGlvbiBnZW5GeCh0eXBlLG51bSl7dmFyIG9iaj17fTtqUXVlcnkuZWFjaChmeEF0 dHJzLmNvbmNhdC5hcHBseShbXSxmeEF0dHJzLnNsaWNlKDAsbnVtKSksZnVuY3Rp b24oKXtvYmpbdGhpc109dHlwZTt9KTtyZXR1cm4gb2JqO30KaWYoImdldEJvdW5k aW5nQ2xpZW50UmVjdCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpe2pRdWVy eS5mbi5vZmZzZXQ9ZnVuY3Rpb24ob3B0aW9ucyl7dmFyIGVsZW09dGhpc1swXTtp ZihvcHRpb25zKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpe2pRdWVyeS5v ZmZzZXQuc2V0T2Zmc2V0KHRoaXMsb3B0aW9ucyxpKTt9KTt9CmlmKCFlbGVtfHwh ZWxlbS5vd25lckRvY3VtZW50KXtyZXR1cm4gbnVsbDt9CmlmKGVsZW09PT1lbGVt Lm93bmVyRG9jdW1lbnQuYm9keSl7cmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9m ZnNldChlbGVtKTt9CnZhciBib3g9ZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3Qo KSxkb2M9ZWxlbS5vd25lckRvY3VtZW50LGJvZHk9ZG9jLmJvZHksZG9jRWxlbT1k b2MuZG9jdW1lbnRFbGVtZW50LGNsaWVudFRvcD1kb2NFbGVtLmNsaWVudFRvcHx8 Ym9keS5jbGllbnRUb3B8fDAsY2xpZW50TGVmdD1kb2NFbGVtLmNsaWVudExlZnR8 fGJvZHkuY2xpZW50TGVmdHx8MCx0b3A9Ym94LnRvcCsoc2VsZi5wYWdlWU9mZnNl dHx8alF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwmJmRvY0VsZW0uc2Nyb2xsVG9wfHxi b2R5LnNjcm9sbFRvcCktY2xpZW50VG9wLGxlZnQ9Ym94LmxlZnQrKHNlbGYucGFn ZVhPZmZzZXR8fGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsJiZkb2NFbGVtLnNjcm9s bExlZnR8fGJvZHkuc2Nyb2xsTGVmdCktY2xpZW50TGVmdDtyZXR1cm57dG9wOnRv cCxsZWZ0OmxlZnR9O307fWVsc2V7alF1ZXJ5LmZuLm9mZnNldD1mdW5jdGlvbihv cHRpb25zKXt2YXIgZWxlbT10aGlzWzBdO2lmKG9wdGlvbnMpe3JldHVybiB0aGlz LmVhY2goZnVuY3Rpb24oaSl7alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxv cHRpb25zLGkpO30pO30KaWYoIWVsZW18fCFlbGVtLm93bmVyRG9jdW1lbnQpe3Jl dHVybiBudWxsO30KaWYoZWxlbT09PWVsZW0ub3duZXJEb2N1bWVudC5ib2R5KXty ZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KGVsZW0pO30KalF1ZXJ5Lm9m ZnNldC5pbml0aWFsaXplKCk7dmFyIG9mZnNldFBhcmVudD1lbGVtLm9mZnNldFBh cmVudCxwcmV2T2Zmc2V0UGFyZW50PWVsZW0sZG9jPWVsZW0ub3duZXJEb2N1bWVu dCxjb21wdXRlZFN0eWxlLGRvY0VsZW09ZG9jLmRvY3VtZW50RWxlbWVudCxib2R5 PWRvYy5ib2R5LGRlZmF1bHRWaWV3PWRvYy5kZWZhdWx0VmlldyxwcmV2Q29tcHV0 ZWRTdHlsZT1kZWZhdWx0Vmlldz9kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxl KGVsZW0sbnVsbCk6ZWxlbS5jdXJyZW50U3R5bGUsdG9wPWVsZW0ub2Zmc2V0VG9w LGxlZnQ9ZWxlbS5vZmZzZXRMZWZ0O3doaWxlKChlbGVtPWVsZW0ucGFyZW50Tm9k ZSkmJmVsZW0hPT1ib2R5JiZlbGVtIT09ZG9jRWxlbSl7aWYoalF1ZXJ5Lm9mZnNl dC5zdXBwb3J0c0ZpeGVkUG9zaXRpb24mJnByZXZDb21wdXRlZFN0eWxlLnBvc2l0 aW9uPT09ImZpeGVkIil7YnJlYWs7fQpjb21wdXRlZFN0eWxlPWRlZmF1bHRWaWV3 P2RlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSxudWxsKTplbGVtLmN1 cnJlbnRTdHlsZTt0b3AtPWVsZW0uc2Nyb2xsVG9wO2xlZnQtPWVsZW0uc2Nyb2xs TGVmdDtpZihlbGVtPT09b2Zmc2V0UGFyZW50KXt0b3ArPWVsZW0ub2Zmc2V0VG9w O2xlZnQrPWVsZW0ub2Zmc2V0TGVmdDtpZihqUXVlcnkub2Zmc2V0LmRvZXNOb3RB ZGRCb3JkZXImJiEoalF1ZXJ5Lm9mZnNldC5kb2VzQWRkQm9yZGVyRm9yVGFibGVB bmRDZWxscyYmL150KGFibGV8ZHxoKSQvaS50ZXN0KGVsZW0ubm9kZU5hbWUpKSl7 dG9wKz1wYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGgpfHww O2xlZnQrPXBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgp fHwwO30KcHJldk9mZnNldFBhcmVudD1vZmZzZXRQYXJlbnQsb2Zmc2V0UGFyZW50 PWVsZW0ub2Zmc2V0UGFyZW50O30KaWYoalF1ZXJ5Lm9mZnNldC5zdWJ0cmFjdHNC b3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUmJmNvbXB1dGVkU3R5bGUub3ZlcmZs b3chPT0idmlzaWJsZSIpe3RvcCs9cGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLmJv cmRlclRvcFdpZHRoKXx8MDtsZWZ0Kz1wYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUu Ym9yZGVyTGVmdFdpZHRoKXx8MDt9CnByZXZDb21wdXRlZFN0eWxlPWNvbXB1dGVk U3R5bGU7fQppZihwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbj09PSJyZWxhdGl2 ZSJ8fHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uPT09InN0YXRpYyIpe3RvcCs9 Ym9keS5vZmZzZXRUb3A7bGVmdCs9Ym9keS5vZmZzZXRMZWZ0O30KaWYoalF1ZXJ5 Lm9mZnNldC5zdXBwb3J0c0ZpeGVkUG9zaXRpb24mJnByZXZDb21wdXRlZFN0eWxl LnBvc2l0aW9uPT09ImZpeGVkIil7dG9wKz1NYXRoLm1heChkb2NFbGVtLnNjcm9s bFRvcCxib2R5LnNjcm9sbFRvcCk7bGVmdCs9TWF0aC5tYXgoZG9jRWxlbS5zY3Jv bGxMZWZ0LGJvZHkuc2Nyb2xsTGVmdCk7fQpyZXR1cm57dG9wOnRvcCxsZWZ0Omxl ZnR9O307fQpqUXVlcnkub2Zmc2V0PXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dmFy IGJvZHk9ZG9jdW1lbnQuYm9keSxjb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxl bWVudCgiZGl2IiksaW5uZXJEaXYsY2hlY2tEaXYsdGFibGUsdGQsYm9keU1hcmdp blRvcD1wYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoYm9keSwibWFyZ2luVG9wIix0 cnVlKSl8fDAsaHRtbD0iPGRpdiBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7dG9w OjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5n OjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7Jz48ZGl2PjwvZGl2PjwvZGl2Pjx0YWJs ZSBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjow O2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdo dDoxcHg7JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnPjx0cj48dGQ+ PC90ZD48L3RyPjwvdGFibGU+IjtqUXVlcnkuZXh0ZW5kKGNvbnRhaW5lci5zdHls ZSx7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAsYm9y ZGVyOjAsd2lkdGg6IjFweCIsaGVpZ2h0OiIxcHgiLHZpc2liaWxpdHk6ImhpZGRl biJ9KTtjb250YWluZXIuaW5uZXJIVE1MPWh0bWw7Ym9keS5pbnNlcnRCZWZvcmUo Y29udGFpbmVyLGJvZHkuZmlyc3RDaGlsZCk7aW5uZXJEaXY9Y29udGFpbmVyLmZp cnN0Q2hpbGQ7Y2hlY2tEaXY9aW5uZXJEaXYuZmlyc3RDaGlsZDt0ZD1pbm5lckRp di5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7dGhpcy5kb2VzTm90 QWRkQm9yZGVyPShjaGVja0Rpdi5vZmZzZXRUb3AhPT01KTt0aGlzLmRvZXNBZGRC b3JkZXJGb3JUYWJsZUFuZENlbGxzPSh0ZC5vZmZzZXRUb3A9PT01KTtjaGVja0Rp di5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLGNoZWNrRGl2LnN0eWxlLnRvcD0iMjBw eCI7dGhpcy5zdXBwb3J0c0ZpeGVkUG9zaXRpb249KGNoZWNrRGl2Lm9mZnNldFRv cD09PTIwfHxjaGVja0Rpdi5vZmZzZXRUb3A9PT0xNSk7Y2hlY2tEaXYuc3R5bGUu cG9zaXRpb249Y2hlY2tEaXYuc3R5bGUudG9wPSIiO2lubmVyRGl2LnN0eWxlLm92 ZXJmbG93PSJoaWRkZW4iLGlubmVyRGl2LnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2 ZSI7dGhpcy5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9KGNo ZWNrRGl2Lm9mZnNldFRvcD09PS01KTt0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2lu SW5Cb2R5T2Zmc2V0PShib2R5Lm9mZnNldFRvcCE9PWJvZHlNYXJnaW5Ub3ApO2Jv ZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTtib2R5PWNvbnRhaW5lcj1pbm5lckRp dj1jaGVja0Rpdj10YWJsZT10ZD1udWxsO2pRdWVyeS5vZmZzZXQuaW5pdGlhbGl6 ZT1qUXVlcnkubm9vcDt9LGJvZHlPZmZzZXQ6ZnVuY3Rpb24oYm9keSl7dmFyIHRv cD1ib2R5Lm9mZnNldFRvcCxsZWZ0PWJvZHkub2Zmc2V0TGVmdDtqUXVlcnkub2Zm c2V0LmluaXRpYWxpemUoKTtpZihqUXVlcnkub2Zmc2V0LmRvZXNOb3RJbmNsdWRl TWFyZ2luSW5Cb2R5T2Zmc2V0KXt0b3ArPXBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNT Uyhib2R5LCJtYXJnaW5Ub3AiLHRydWUpKXx8MDtsZWZ0Kz1wYXJzZUZsb2F0KGpR dWVyeS5jdXJDU1MoYm9keSwibWFyZ2luTGVmdCIsdHJ1ZSkpfHwwO30KcmV0dXJu e3RvcDp0b3AsbGVmdDpsZWZ0fTt9LHNldE9mZnNldDpmdW5jdGlvbihlbGVtLG9w dGlvbnMsaSl7aWYoL3N0YXRpYy8udGVzdChqUXVlcnkuY3VyQ1NTKGVsZW0sInBv c2l0aW9uIikpKXtlbGVtLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSI7fQp2YXIg Y3VyRWxlbT1qUXVlcnkoZWxlbSksY3VyT2Zmc2V0PWN1ckVsZW0ub2Zmc2V0KCks Y3VyVG9wPXBhcnNlSW50KGpRdWVyeS5jdXJDU1MoZWxlbSwidG9wIix0cnVlKSwx MCl8fDAsY3VyTGVmdD1wYXJzZUludChqUXVlcnkuY3VyQ1NTKGVsZW0sImxlZnQi LHRydWUpLDEwKXx8MDtpZihqUXVlcnkuaXNGdW5jdGlvbihvcHRpb25zKSl7b3B0 aW9ucz1vcHRpb25zLmNhbGwoZWxlbSxpLGN1ck9mZnNldCk7fQp2YXIgcHJvcHM9 e3RvcDoob3B0aW9ucy50b3AtY3VyT2Zmc2V0LnRvcCkrY3VyVG9wLGxlZnQ6KG9w dGlvbnMubGVmdC1jdXJPZmZzZXQubGVmdCkrY3VyTGVmdH07aWYoInVzaW5nImlu IG9wdGlvbnMpe29wdGlvbnMudXNpbmcuY2FsbChlbGVtLHByb3BzKTt9ZWxzZXtj dXJFbGVtLmNzcyhwcm9wcyk7fX19O2pRdWVyeS5mbi5leHRlbmQoe3Bvc2l0aW9u OmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pe3JldHVybiBudWxsO30KdmFyIGVsZW09 dGhpc1swXSxvZmZzZXRQYXJlbnQ9dGhpcy5vZmZzZXRQYXJlbnQoKSxvZmZzZXQ9 dGhpcy5vZmZzZXQoKSxwYXJlbnRPZmZzZXQ9L15ib2R5fGh0bWwkL2kudGVzdChv ZmZzZXRQYXJlbnRbMF0ubm9kZU5hbWUpP3t0b3A6MCxsZWZ0OjB9Om9mZnNldFBh cmVudC5vZmZzZXQoKTtvZmZzZXQudG9wLT1wYXJzZUZsb2F0KGpRdWVyeS5jdXJD U1MoZWxlbSwibWFyZ2luVG9wIix0cnVlKSl8fDA7b2Zmc2V0LmxlZnQtPXBhcnNl RmxvYXQoalF1ZXJ5LmN1ckNTUyhlbGVtLCJtYXJnaW5MZWZ0Iix0cnVlKSl8fDA7 cGFyZW50T2Zmc2V0LnRvcCs9cGFyc2VGbG9hdChqUXVlcnkuY3VyQ1NTKG9mZnNl dFBhcmVudFswXSwiYm9yZGVyVG9wV2lkdGgiLHRydWUpKXx8MDtwYXJlbnRPZmZz ZXQubGVmdCs9cGFyc2VGbG9hdChqUXVlcnkuY3VyQ1NTKG9mZnNldFBhcmVudFsw XSwiYm9yZGVyTGVmdFdpZHRoIix0cnVlKSl8fDA7cmV0dXJue3RvcDpvZmZzZXQu dG9wLXBhcmVudE9mZnNldC50b3AsbGVmdDpvZmZzZXQubGVmdC1wYXJlbnRPZmZz ZXQubGVmdH07fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5t YXAoZnVuY3Rpb24oKXt2YXIgb2Zmc2V0UGFyZW50PXRoaXMub2Zmc2V0UGFyZW50 fHxkb2N1bWVudC5ib2R5O3doaWxlKG9mZnNldFBhcmVudCYmKCEvXmJvZHl8aHRt bCQvaS50ZXN0KG9mZnNldFBhcmVudC5ub2RlTmFtZSkmJmpRdWVyeS5jc3Mob2Zm c2V0UGFyZW50LCJwb3NpdGlvbiIpPT09InN0YXRpYyIpKXtvZmZzZXRQYXJlbnQ9 b2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDt9CnJldHVybiBvZmZzZXRQYXJlbnQ7 fSk7fX0pO2pRdWVyeS5lYWNoKFsiTGVmdCIsIlRvcCJdLGZ1bmN0aW9uKGksbmFt ZSl7dmFyIG1ldGhvZD0ic2Nyb2xsIituYW1lO2pRdWVyeS5mblttZXRob2RdPWZ1 bmN0aW9uKHZhbCl7dmFyIGVsZW09dGhpc1swXSx3aW47aWYoIWVsZW0pe3JldHVy biBudWxsO30KaWYodmFsIT09dW5kZWZpbmVkKXtyZXR1cm4gdGhpcy5lYWNoKGZ1 bmN0aW9uKCl7d2luPWdldFdpbmRvdyh0aGlzKTtpZih3aW4pe3dpbi5zY3JvbGxU byghaT92YWw6alF1ZXJ5KHdpbikuc2Nyb2xsTGVmdCgpLGk/dmFsOmpRdWVyeSh3 aW4pLnNjcm9sbFRvcCgpKTt9ZWxzZXt0aGlzW21ldGhvZF09dmFsO319KTt9ZWxz ZXt3aW49Z2V0V2luZG93KGVsZW0pO3JldHVybiB3aW4/KCJwYWdlWE9mZnNldCJp biB3aW4pP3dpbltpPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06alF1ZXJ5 LnN1cHBvcnQuYm94TW9kZWwmJndpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRb bWV0aG9kXXx8d2luLmRvY3VtZW50LmJvZHlbbWV0aG9kXTplbGVtW21ldGhvZF07 fX07fSk7ZnVuY3Rpb24gZ2V0V2luZG93KGVsZW0pe3JldHVybigic2Nyb2xsVG8i aW4gZWxlbSYmZWxlbS5kb2N1bWVudCk/ZWxlbTplbGVtLm5vZGVUeXBlPT09OT9l bGVtLmRlZmF1bHRWaWV3fHxlbGVtLnBhcmVudFdpbmRvdzpmYWxzZTt9CmpRdWVy eS5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihpLG5hbWUpe3ZhciB0 eXBlPW5hbWUudG9Mb3dlckNhc2UoKTtqUXVlcnkuZm5bImlubmVyIituYW1lXT1m dW5jdGlvbigpe3JldHVybiB0aGlzWzBdP2pRdWVyeS5jc3ModGhpc1swXSx0eXBl LGZhbHNlLCJwYWRkaW5nIik6bnVsbDt9O2pRdWVyeS5mblsib3V0ZXIiK25hbWVd PWZ1bmN0aW9uKG1hcmdpbil7cmV0dXJuIHRoaXNbMF0/alF1ZXJ5LmNzcyh0aGlz WzBdLHR5cGUsZmFsc2UsbWFyZ2luPyJtYXJnaW4iOiJib3JkZXIiKTpudWxsO307 alF1ZXJ5LmZuW3R5cGVdPWZ1bmN0aW9uKHNpemUpe3ZhciBlbGVtPXRoaXNbMF07 aWYoIWVsZW0pe3JldHVybiBzaXplPT1udWxsP251bGw6dGhpczt9CmlmKGpRdWVy eS5pc0Z1bmN0aW9uKHNpemUpKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkp e3ZhciBzZWxmPWpRdWVyeSh0aGlzKTtzZWxmW3R5cGVdKHNpemUuY2FsbCh0aGlz LGksc2VsZlt0eXBlXSgpKSk7fSk7fQpyZXR1cm4oInNjcm9sbFRvImluIGVsZW0m JmVsZW0uZG9jdW1lbnQpP2VsZW0uZG9jdW1lbnQuY29tcGF0TW9kZT09PSJDU1Mx Q29tcGF0IiYmZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIr bmFtZV18fGVsZW0uZG9jdW1lbnQuYm9keVsiY2xpZW50IituYW1lXTooZWxlbS5u b2RlVHlwZT09PTkpP01hdGgubWF4KGVsZW0uZG9jdW1lbnRFbGVtZW50WyJjbGll bnQiK25hbWVdLGVsZW0uYm9keVsic2Nyb2xsIituYW1lXSxlbGVtLmRvY3VtZW50 RWxlbWVudFsic2Nyb2xsIituYW1lXSxlbGVtLmJvZHlbIm9mZnNldCIrbmFtZV0s ZWxlbS5kb2N1bWVudEVsZW1lbnRbIm9mZnNldCIrbmFtZV0pOnNpemU9PT11bmRl ZmluZWQ/alF1ZXJ5LmNzcyhlbGVtLHR5cGUpOnRoaXMuY3NzKHR5cGUsdHlwZW9m IHNpemU9PT0ic3RyaW5nIj9zaXplOihwYXJzZUludChzaXplKXx8MCkrInB4Iik7 fTt9KTt3aW5kb3cualF1ZXJ5PXdpbmRvdy4kPWpRdWVyeTt9KSh3aW5kb3cpOyRq PWpRdWVyeS5ub0NvbmZsaWN0KCk7 ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=ajax.js Content-Type: application/x-javascript; name=ajax.js Content-Location: http://bits.wikimedia.org/skins-1.5/common/ajax.js?283-17 Content-Transfer-Encoding: Base64 Ly8gcmVtb3RlIHNjcmlwdGluZyBsaWJyYXJ5Ci8vIChjKSBjb3B5cmlnaHQgMjAw NSBtb2Rlcm5tZXRob2QsIGluYwp2YXIgc2FqYXhfZGVidWdfbW9kZSA9IGZhbHNl Owp2YXIgc2FqYXhfcmVxdWVzdF90eXBlID0gIkdFVCI7CgovKioKKiBpZiBzYWph eF9kZWJ1Z19tb2RlIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gb3V0cHV0cyBnaXZl biB0aGUgbWVzc2FnZSBpbnRvIAoqIHRoZSBlbGVtZW50IHdpdGggaWQgPSBzYWph eF9kZWJ1ZzsgaWYgbm8gc3VjaCBlbGVtZW50IGV4aXN0cyBpbiB0aGUgZG9jdW1l bnQsIAoqIGl0IGlzIGluamVjdGVkLgoqLwpmdW5jdGlvbiBzYWpheF9kZWJ1Zyh0 ZXh0KSB7CglpZiAoIXNhamF4X2RlYnVnX21vZGUpIHJldHVybiBmYWxzZTsKCgl2 YXIgZT0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NhamF4X2RlYnVnJyk7CgoJ aWYgKCFlKSB7CgkJZT0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOwoJCWUu Y2xhc3NOYW1lPSAnc2FqYXhfZGVidWcnOwoJCWUuaWQ9ICdzYWpheF9kZWJ1Zyc7 CgoJCXZhciBiPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIp WzBdOwoKCQlpZiAoYi5maXJzdENoaWxkKSBiLmluc2VydEJlZm9yZShlLCBiLmZp cnN0Q2hpbGQpOwoJCWVsc2UgYi5hcHBlbmRDaGlsZChlKTsKCX0KCgl2YXIgbT0g ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgltLmFwcGVuZENoaWxkKCBk b2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggdGV4dCApICk7CgoJZS5hcHBlbmRDaGls ZCggbSApOwoKCXJldHVybiB0cnVlOwp9CgovKioKKiBjb21wYXRpYmlsaXR5IHdy YXBwZXIgZm9yIGNyZWF0aW5nIGEgbmV3IFhNTEh0dHBSZXF1ZXN0IG9iamVjdC4K Ki8KZnVuY3Rpb24gc2FqYXhfaW5pdF9vYmplY3QoKSB7CglzYWpheF9kZWJ1Zygi c2FqYXhfaW5pdF9vYmplY3QoKSBjYWxsZWQuLiIpCgl2YXIgQTsKCXRyeSB7CgkJ Ly8gVHJ5IHRoZSBuZXcgc3R5bGUgYmVmb3JlIEFjdGl2ZVggc28gd2UgZG9uJ3QK CQkvLyB1bm5lY2Vzc2FyaWx5IHRyaWdnZXIgd2FybmluZ3MgaW4gSUUgNyB3aGVu CgkJLy8gc2V0IHRvIHByb21wdCBhYm91dCBBY3RpdmVYIHVzYWdlCgkJQSA9IG5l dyBYTUxIdHRwUmVxdWVzdCgpOwoJfSBjYXRjaCAoZSkgewoJCXRyeSB7CgkJCUE9 bmV3IEFjdGl2ZVhPYmplY3QoIk1zeG1sMi5YTUxIVFRQIik7CgkJfSBjYXRjaCAo ZSkgewoJCQl0cnkgewoJCQkJQT1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0 LlhNTEhUVFAiKTsKCQkJfSBjYXRjaCAob2MpIHsKCQkJCUE9bnVsbDsKCQkJfQoJ CX0KCX0KCWlmICghQSkKCQlzYWpheF9kZWJ1ZygiQ291bGQgbm90IGNyZWF0ZSBj b25uZWN0aW9uIG9iamVjdC4iKTsKCglyZXR1cm4gQTsKfQoKLyoqCiogUGVyZm9y bSBhbiBhamF4IGNhbGwgdG8gbWVkaWF3aWtpLiBDYWxscyBhcmUgaGFuZGVsZWQg YnkgQWpheERpc3BhdGNoZXIucGhwCiogICBmdW5jX25hbWUgLSB0aGUgbmFtZSBv ZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC4gTXVzdCBiZSByZWdpc3RlcmVkIGluICR3 Z0FqYXhFeHBvcnRMaXN0CiogICBhcmdzIC0gYW4gYXJyYXkgb2YgYXJndW1lbnRz IHRvIHRoYXQgZnVuY3Rpb24KKiAgIHRhcmdldCAtIHRoZSB0YXJnZXQgdGhhdCB3 aWxsIGhhbmRsZSB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsLiBJZiB0aGlzIGlzIGEg ZnVuY3Rpb24sCiogICAgICAgICAgICBpZiB3aWxsIGJlIGNhbGxlZCB3aXRoIHRo ZSBYTUxIdHRwUmVxdWVzdCBhcyBhIHBhcmFtZXRlcjsgaWYgaXQncyBhbiBpbnB1 dAoqICAgICAgICAgICAgZWxlbWVudCwgaXRzIHZhbHVlIHdpbGwgYmUgc2V0IHRv IHRoZSByZXN1bHRUZXh0OyBpZiBpdCdzIGFub3RoZXIgdHlwZSBvZgoqICAgICAg ICAgICAgZWxlbWVudCwgaXRzIGlubmVySFRNTCB3aWxsIGJlIHNldCB0byB0aGUg cmVzdWx0VGV4dC4KKgoqIEV4YW1wbGU6CiogICAgc2FqYXhfZG9fY2FsbCgnZG9G b28nLCBbMSwgMiwgM10sIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzaG93Rm9v IikpOwoqCiogVGhpcyB3aWxsIGNhbGwgdGhlIGRvRm9vIGZ1bmN0aW9uIHZpYSBN ZWRpYVdpa2kncyBBamF4RGlzcGF0Y2hlciwgd2l0aAoqICgxLCAyLCAzKSBhcyB0 aGUgcGFyYW1ldGVyIGxpc3QsIGFuZCB3aWxsIHNob3cgdGhlIHJlc3VsdCBpbiB0 aGUgZWxlbWVudAoqIHdpdGggaWQgPSBzaG93Rm9vCiovCmZ1bmN0aW9uIHNhamF4 X2RvX2NhbGwoZnVuY19uYW1lLCBhcmdzLCB0YXJnZXQpIHsKCXZhciBpLCB4LCBu OwoJdmFyIHVyaTsKCXZhciBwb3N0X2RhdGE7Cgl1cmkgPSB3Z1NlcnZlciArCgkJ KCh3Z1NjcmlwdCA9PSBudWxsKSA/ICh3Z1NjcmlwdFBhdGggKyAiL2luZGV4LnBo cCIpIDogd2dTY3JpcHQpICsKCQkiP2FjdGlvbj1hamF4IjsKCWlmIChzYWpheF9y ZXF1ZXN0X3R5cGUgPT0gIkdFVCIpIHsKCQlpZiAodXJpLmluZGV4T2YoIj8iKSA9 PSAtMSkKCQkJdXJpID0gdXJpICsgIj9ycz0iICsgZW5jb2RlVVJJQ29tcG9uZW50 KGZ1bmNfbmFtZSk7CgkJZWxzZQoJCQl1cmkgPSB1cmkgKyAiJnJzPSIgKyBlbmNv ZGVVUklDb21wb25lbnQoZnVuY19uYW1lKTsKCQlmb3IgKGkgPSAwOyBpIDwgYXJn cy5sZW5ndGg7IGkrKykKCQkJdXJpID0gdXJpICsgIiZyc2FyZ3NbXT0iICsgZW5j b2RlVVJJQ29tcG9uZW50KGFyZ3NbaV0pOwoJCS8vdXJpID0gdXJpICsgIiZyc3Ju ZD0iICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7CgkJcG9zdF9kYXRhID0gbnVsbDsK CX0gZWxzZSB7CgkJcG9zdF9kYXRhID0gInJzPSIgKyBlbmNvZGVVUklDb21wb25l bnQoZnVuY19uYW1lKTsKCQlmb3IgKGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkr KykKCQkJcG9zdF9kYXRhID0gcG9zdF9kYXRhICsgIiZyc2FyZ3NbXT0iICsgZW5j b2RlVVJJQ29tcG9uZW50KGFyZ3NbaV0pOwoJfQoJeCA9IHNhamF4X2luaXRfb2Jq ZWN0KCk7CglpZiAoIXgpIHsKCQlhbGVydCgiQUpBWCBub3Qgc3VwcG9ydGVkIik7 CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXRyeSB7CgkJeC5vcGVuKHNhamF4X3JlcXVl c3RfdHlwZSwgdXJpLCB0cnVlKTsKCX0gY2F0Y2ggKGUpIHsKCQlpZiAod2luZG93 LmxvY2F0aW9uLmhvc3RuYW1lID09ICJsb2NhbGhvc3QiKSB7CgkJCWFsZXJ0KCJZ b3VyIGJyb3dzZXIgYmxvY2tzIFhNTEh0dHBSZXF1ZXN0IHRvICdsb2NhbGhvc3Qn LCB0cnkgdXNpbmcgYSByZWFsIGhvc3RuYW1lIGZvciBkZXZlbG9wbWVudC90ZXN0 aW5nLiIpOwoJCX0KCQl0aHJvdyBlOwoJfQoJaWYgKHNhamF4X3JlcXVlc3RfdHlw ZSA9PSAiUE9TVCIpIHsKCQl4LnNldFJlcXVlc3RIZWFkZXIoIk1ldGhvZCIsICJQ T1NUICIgKyB1cmkgKyAiIEhUVFAvMS4xIik7CgkJeC5zZXRSZXF1ZXN0SGVhZGVy KCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNv ZGVkIik7Cgl9Cgl4LnNldFJlcXVlc3RIZWFkZXIoIlByYWdtYSIsICJjYWNoZT15 ZXMiKTsKCXguc2V0UmVxdWVzdEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsICJuby10 cmFuc2Zvcm0iKTsKCXgub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7 CgkJaWYgKHgucmVhZHlTdGF0ZSAhPSA0KQoJCQlyZXR1cm47CgoJCXNhamF4X2Rl YnVnKCJyZWNlaXZlZCAoIiArIHguc3RhdHVzICsgIiAiICsgeC5zdGF0dXNUZXh0 ICsgIikgIiArIHgucmVzcG9uc2VUZXh0KTsKCgkJLy9pZiAoeC5zdGF0dXMgIT0g MjAwKQoJCS8vCWFsZXJ0KCJFcnJvcjogIiArIHguc3RhdHVzICsgIiAiICsgeC5z dGF0dXNUZXh0ICsgIjogIiArIHgucmVzcG9uc2VUZXh0KTsKCQkvL2Vsc2UKCgkJ aWYgKCB0eXBlb2YoIHRhcmdldCApID09ICdmdW5jdGlvbicgKSB7CgkJCXRhcmdl dCggeCApOwoJCX0KCQllbHNlIGlmICggdHlwZW9mKCB0YXJnZXQgKSA9PSAnb2Jq ZWN0JyApIHsKCQkJaWYgKCB0YXJnZXQudGFnTmFtZSA9PSAnSU5QVVQnICkgewoJ CQkJaWYgKHguc3RhdHVzID09IDIwMCkgdGFyZ2V0LnZhbHVlPSB4LnJlc3BvbnNl VGV4dDsKCQkJCS8vZWxzZSBhbGVydCgiRXJyb3I6ICIgKyB4LnN0YXR1cyArICIg IiArIHguc3RhdHVzVGV4dCArICIgKCIgKyB4LnJlc3BvbnNlVGV4dCArICIpIik7 CgkJCX0KCQkJZWxzZSB7CgkJCQlpZiAoeC5zdGF0dXMgPT0gMjAwKSB0YXJnZXQu aW5uZXJIVE1MID0geC5yZXNwb25zZVRleHQ7CgkJCQllbHNlIHRhcmdldC5pbm5l ckhUTUw9ICI8ZGl2IGNsYXNzPSdlcnJvcic+RXJyb3I6ICIgKyB4LnN0YXR1cyAr ICIgIiArIHguc3RhdHVzVGV4dCArICIgKCIgKyB4LnJlc3BvbnNlVGV4dCArICIp PC9kaXY+IjsKCQkJfQoJCX0KCQllbHNlIHsKCQkJYWxlcnQoImJhZCB0YXJnZXQg Zm9yIHNhamF4X2RvX2NhbGw6IG5vdCBhIGZ1bmN0aW9uIG9yIG9iamVjdDogIiAr IHRhcmdldCk7CgkJfQoKCQlyZXR1cm47Cgl9CgoJc2FqYXhfZGVidWcoZnVuY19u YW1lICsgIiB1cmkgPSAiICsgdXJpICsgIiAvIHBvc3QgPSAiICsgcG9zdF9kYXRh KTsKCXguc2VuZChwb3N0X2RhdGEpOwoJc2FqYXhfZGVidWcoZnVuY19uYW1lICsg IiB3YWl0aW5nLi4iKTsKCWRlbGV0ZSB4OwoKCXJldHVybiB0cnVlOwp9CgovKioK ICogQHJldHVybiBib29sZWFuIHdoZXRoZXIgdGhlIGJyb3dzZXIgc3VwcG9ydHMg WE1MSHR0cFJlcXVlc3QKICovCmZ1bmN0aW9uIHdmU3VwcG9ydHNBamF4KCkgewoJ dmFyIHJlcXVlc3QgPSBzYWpheF9pbml0X29iamVjdCgpOwoJdmFyIHN1cHBvcnRz QWpheCA9IHJlcXVlc3QgPyB0cnVlIDogZmFsc2U7CglkZWxldGUgcmVxdWVzdDsK CXJldHVybiBzdXBwb3J0c0FqYXg7Cn0KCg== ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=mwsuggest.js Content-Type: application/x-javascript; name=mwsuggest.js Content-Location: http://bits.wikimedia.org/skins-1.5/common/mwsuggest.js?283-17 Content-Transfer-Encoding: Base64 LyoKICogT3BlblNlYXJjaCBhamF4IHN1Z2dlc3Rpb24gZW5naW5lIGZvciBNZWRp YVdpa2kKICoKICogdXNlcyBjb3JlIE1lZGlhV2lraSBvcGVuIHNlYXJjaCBzdXBw b3J0IHRvIGZldGNoIHN1Z2dlc3Rpb25zCiAqIGFuZCBzaG93IHRoZW0gYmVsb3cg c2VhcmNoIGJveGVzIGFuZCBvdGhlciBpbnB1dHMKICoKICogYnkgUm9iZXJ0IFN0 b2puaWMgKEFwcmlsIDIwMDgpCiAqLwoKLy8gc2VhcmNoX2JveF9pZCAtPiBSZXN1 bHRzIG9iamVjdAp2YXIgb3NfbWFwID0ge307Ci8vIGNhY2hlZCBkYXRhLCB1cmwg LT4ganNvbl90ZXh0CnZhciBvc19jYWNoZSA9IHt9OwovLyBnbG9iYWwgdmFyaWFi bGVzIGZvciBzdWdnZXN0X2tleXByZXNzCnZhciBvc19jdXJfa2V5cHJlc3NlZCA9 IDA7CnZhciBvc19rZXlwcmVzc2VkX2NvdW50ID0gMDsKLy8gdHlwZTogVGltZXIK dmFyIG9zX3RpbWVyID0gbnVsbDsKLy8gdGllIG1vdXNlZG93bi91cCBldmVudHMK dmFyIG9zX21vdXNlX3ByZXNzZWQgPSBmYWxzZTsKdmFyIG9zX21vdXNlX251bSA9 IC0xOwovLyBpZiB0cnVlLCB0aGUgbGFzdCBjaGFuZ2Ugd2FzIG1hZGUgYnkgbW91 c2UgKGFuZCBub3Qga2V5Ym9hcmQpCnZhciBvc19tb3VzZV9tb3ZlZCA9IGZhbHNl OwovLyBkZWxheSBiZXR3ZWVuIGtleXByZXNzIGFuZCBzdWdnZXN0aW9uIChpbiBt cykKdmFyIG9zX3NlYXJjaF90aW1lb3V0ID0gMjUwOwovLyB0aGVzZSBwYWlycyBv ZiBpbnB1dHMvZm9ybXMgd2lsbCBiZSBhdXRvbG9hZGVkIGF0IHN0YXJ0dXAKdmFy IG9zX2F1dG9sb2FkX2lucHV0cyA9IG5ldyBBcnJheSgnc2VhcmNoSW5wdXQnLCAn c2VhcmNoSW5wdXQyJywgJ3Bvd2VyU2VhcmNoVGV4dCcsICdzZWFyY2hUZXh0Jyk7 CnZhciBvc19hdXRvbG9hZF9mb3JtcyA9IG5ldyBBcnJheSgnc2VhcmNoZm9ybScs ICdzZWFyY2hmb3JtMicsICdwb3dlcnNlYXJjaCcsICdzZWFyY2gnICk7Ci8vIGlm IHdlIHN0b3BwZWQgdGhlIHNlcnZpY2UKdmFyIG9zX2lzX3N0b3BwZWQgPSBmYWxz ZTsKLy8gbWF4IGxpbmVzIHRvIHNob3cgaW4gc3VnZ2VzdCB0YWJsZQp2YXIgb3Nf bWF4X2xpbmVzX3Blcl9zdWdnZXN0ID0gNzsKLy8gbnVtYmVyIG9mIHN0ZXBzIHRv IGFuaW1hdGUgZXhwYW5zaW9uL2NvbnRyYWN0aW9uIG9mIGNvbnRhaW5lciB3aWR0 aAp2YXIgb3NfYW5pbWF0aW9uX3N0ZXBzID0gNjsKLy8gbnVtIG9mIHBpeGVscyBv ZiBzbWFsbGVzdCBzdGVwCnZhciBvc19hbmltYXRpb25fbWluX3N0ZXAgPSAyOwov LyBkZWxheSBiZXR3ZWVuIHN0ZXBzIChpbiBtcykKdmFyIG9zX2FuaW1hdGlvbl9k ZWxheSA9IDMwOwovLyBtYXggd2lkdGggb2YgY29udGFpbmVyIGluIHBlcmNlbnQg b2Ygbm9ybWFsIHNpemUgKDEgPT0gMTAwJSkKdmFyIG9zX2NvbnRhaW5lcl9tYXhf d2lkdGggPSAyOwovLyBjdXJyZW50bHkgYWN0aXZlIGFuaW1hdGlvbiB0aW1lcgp2 YXIgb3NfYW5pbWF0aW9uX3RpbWVyID0gbnVsbDsKLyoqCiAqIDxkYXRhbGlzdD4g aXMgYSBuZXcgSFRNTDUgZWxlbWVudCB0aGF0IGFsbG93cyB5b3UgdG8gbWFudWFs bHkgc3VwcGx5CiAqIHN1Z2dlc3Rpb24gbGlzdHMgYW5kIGhhdmUgdGhlbSByZW5k ZXJlZCBhY2NvcmRpbmcgdG8gdGhlIHJpZ2h0IHBsYXRmb3JtCiAqIGNvbnZlbnRp b25zLiAgSG93ZXZlciwgdGhlIG9ubHkgc2hpcHBpbmcgYnJvd3NlciBhcyBvZiBl YXJseSAyMDEwIGlzIE9wZXJhLAogKiBhbmQgdGhhdCBoYXMgYSBmYXRhbCBwcm9i bGVtOiB0aGUgc3VnZ2VzdGlvbiBsYWdzIGJlaGluZCB3aGF0IHRoZSB1c2VyIHR5 cGVzCiAqIGJ5IG9uZSBrZXlwcmVzcy4gIChSZXBvcnRlZCBhcyBEU0stMjc2ODcw IHRvIE9wZXJhJ3Mgc2VjcmV0IGJ1ZyB0cmFja2VyLikKICogVGhlIGNvZGUgaGVy ZSBvdGhlcndpc2Ugc2VlbXMgdG8gd29yaywgdGhvdWdoLCBzbyB0aGlzIGNhbiBi ZSBmbGlwcGVkIG9uCiAqIChtYXliZSB3aXRoIGEgVUEgY2hlY2spIHdoZW4gc29t ZSBicm93c2VyIGhhcyBhIGJldHRlciBpbXBsZW1lbnRhdGlvbi4KICovCi8vIHZh ciBvc191c2VfZGF0YWxpc3QgPSAnbGlzdCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxl bWVudCggJ2lucHV0JyApOwp2YXIgb3NfdXNlX2RhdGFsaXN0ID0gZmFsc2U7Cgov KiogVGltZW91dCB0aW1lciBjbGFzcyB0aGF0IHdpbGwgZmV0Y2ggdGhlIHJlc3Vs dHMgKi8KZnVuY3Rpb24gb3NfVGltZXIoIGlkLCByLCBxdWVyeSApIHsKCXRoaXMu aWQgPSBpZDsKCXRoaXMuciA9IHI7Cgl0aGlzLnF1ZXJ5ID0gcXVlcnk7Cn0KCi8q KiBQcm9wZXJ0eSBjbGFzcyBmb3Igc2luZ2xlIHNlYXJjaCBib3ggKi8KZnVuY3Rp b24gb3NfUmVzdWx0cyggbmFtZSwgZm9ybW5hbWUgKSB7Cgl0aGlzLnNlYXJjaGZv cm0gPSBmb3JtbmFtZTsgLy8gaWQgb2YgdGhlIHNlYXJjaGZvcm0KCXRoaXMuc2Vh cmNoYm94ID0gbmFtZTsgLy8gaWQgb2YgdGhlIHNlYXJjaGJveAoJdGhpcy5jb250 YWluZXIgPSBuYW1lICsgJ1N1Z2dlc3QnOyAvLyBkaXYgdGhhdCBob2xkcyByZXN1 bHRzCgl0aGlzLnJlc3VsdFRhYmxlID0gbmFtZSArICdSZXN1bHQnOyAvLyBpZCBi YXNlIGZvciB0aGUgcmVzdWx0IHRhYmxlICgrbnVtID0gdGFibGUgcm93KQoJdGhp cy5yZXN1bHRUZXh0ID0gbmFtZSArICdSZXN1bHRUZXh0JzsgLy8gaWQgYmFzZSBm b3IgdGhlIHNwYW5zIHdpdGhpbiByZXN1bHQgdGFibGVzICgrbnVtKQoJdGhpcy50 b2dnbGUgPSBuYW1lICsgJ1RvZ2dsZSc7IC8vIGRpdiB0aGF0IGhhcyB0aGUgdG9n Z2xlIChlbmFibGUvZGlzYWJsZSkgbGluawoJdGhpcy5xdWVyeSA9IG51bGw7IC8v IGxhc3QgcHJvY2Vzc2VkIHF1ZXJ5Cgl0aGlzLnJlc3VsdHMgPSBudWxsOyAgLy8g cGFyc2VkIHRpdGxlcwoJdGhpcy5yZXN1bHRDb3VudCA9IDA7IC8vIG51bWJlciBv ZiByZXN1bHRzCgl0aGlzLm9yaWdpbmFsID0gbnVsbDsgLy8gcXVlcnkgdGhhdCB1 c2VyIGVudGVyZWQKCXRoaXMuc2VsZWN0ZWQgPSAtMTsgLy8gd2hpY2ggcmVzdWx0 IGlzIHNlbGVjdGVkCgl0aGlzLmNvbnRhaW5lckNvdW50ID0gMDsgLy8gbnVtYmVy IG9mIHJlc3VsdHMgdmlzaWJsZSBpbiBjb250YWluZXIKCXRoaXMuY29udGFpbmVy Um93ID0gMDsgLy8gaGVpZ2h0IG9mIHJlc3VsdCBmaWVsZCBpbiB0aGUgY29udGFp bmVyCgl0aGlzLmNvbnRhaW5lclRvdGFsID0gMDsgLy8gdG90YWwgaGVpZ2h0IG9m IHRoZSBjb250YWluZXIgd2lsbCBhbGwgcmVzdWx0cwoJdGhpcy52aXNpYmxlID0g ZmFsc2U7IC8vIGlmIGNvbnRhaW5lciBpcyB2aXNpYmxlCgl0aGlzLnN0YXlIaWRk ZW4gPSBmYWxzZTsgLy8gZG9uJ3QgdHJ5IHRvIHNob3cgaWYgbG9zdCBmb2N1cwp9 CgovKiogVGltZXIgdXNlciB0byBhbmltYXRlIGV4cGFuc2lvbi9jb250cmFjdGlv biBvZiBjb250YWluZXIgd2lkdGggKi8KZnVuY3Rpb24gb3NfQW5pbWF0aW9uVGlt ZXIoIHIsIHRhcmdldCApIHsKCXRoaXMuciA9IHI7Cgl2YXIgY3VycmVudCA9IGRv Y3VtZW50LmdldEVsZW1lbnRCeUlkKHIuY29udGFpbmVyKS5vZmZzZXRXaWR0aDsK CXRoaXMuaW5jID0gTWF0aC5yb3VuZCggKCB0YXJnZXQgLSBjdXJyZW50ICkgLyBv c19hbmltYXRpb25fc3RlcHMgKTsKCWlmKCB0aGlzLmluYyA8IG9zX2FuaW1hdGlv bl9taW5fc3RlcCAmJiB0aGlzLmluYyA+PTAgKSB7CgkJdGhpcy5pbmMgPSBvc19h bmltYXRpb25fbWluX3N0ZXA7IC8vIG1pbmltYWwgYW5pbWF0aW9uIHN0ZXAKCX0K CWlmKCB0aGlzLmluYyA+IC1vc19hbmltYXRpb25fbWluX3N0ZXAgJiYgdGhpcy5p bmMgPCAwICkgewoJCXRoaXMuaW5jID0gLW9zX2FuaW1hdGlvbl9taW5fc3RlcDsK CX0KCXRoaXMudGFyZ2V0ID0gdGFyZ2V0Owp9CgovKioqKioqKioqKioqKioqKioq CiAqIEluaXRpYWxpemF0aW9uCiAqKioqKioqKioqKioqKioqKiovCgovKiogSW5p dGlhbGl6YXRpb24sIGNhbGwgdXBvbiBwYWdlIG9ubG9hZCAqLwpmdW5jdGlvbiBv c19NV1N1Z2dlc3RJbml0KCkgewoJZm9yKCBpID0gMDsgaSA8IG9zX2F1dG9sb2Fk X2lucHV0cy5sZW5ndGg7IGkrKyApIHsKCQl2YXIgaWQgPSBvc19hdXRvbG9hZF9p bnB1dHNbaV07CgkJdmFyIGZvcm0gPSBvc19hdXRvbG9hZF9mb3Jtc1tpXTsKCQll bGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CgkJaWYoIGVs ZW1lbnQgIT0gbnVsbCApIHsKCQkJb3NfaW5pdEhhbmRsZXJzKCBpZCwgZm9ybSwg ZWxlbWVudCApOwoJCX0KCX0KfQoKLyoqIEluaXQgUmVzdWx0IG9iamVjdHMgYW5k IGV2ZW50IGhhbmRsZXJzICovCmZ1bmN0aW9uIG9zX2luaXRIYW5kbGVycyggbmFt ZSwgZm9ybW5hbWUsIGVsZW1lbnQgKSB7Cgl2YXIgciA9IG5ldyBvc19SZXN1bHRz KCBuYW1lLCBmb3JtbmFtZSApOwoJLy8gZXZlbnQgaGFuZGxlcgoJb3NfaG9va0V2 ZW50KCBlbGVtZW50LCAna2V5dXAnLCBmdW5jdGlvbiggZXZlbnQgKSB7IG9zX2V2 ZW50S2V5dXAoIGV2ZW50ICk7IH0gKTsKCW9zX2hvb2tFdmVudCggZWxlbWVudCwg J2tleWRvd24nLCBmdW5jdGlvbiggZXZlbnQgKSB7IG9zX2V2ZW50S2V5ZG93bigg ZXZlbnQgKTsgfSApOwoJb3NfaG9va0V2ZW50KCBlbGVtZW50LCAna2V5cHJlc3Mn LCBmdW5jdGlvbiggZXZlbnQgKSB7IG9zX2V2ZW50S2V5cHJlc3MoIGV2ZW50ICk7 IH0gKTsKCWlmICggIW9zX3VzZV9kYXRhbGlzdCApIHsKCQkvLyBUaGVzZSBhcmUg bmVlZGVkIGZvciB0aGUgZGl2IGhhY2sgdG8gaGlkZSBpdCBpZiB0aGUgdXNlciBi bHVycy4KCQlvc19ob29rRXZlbnQoIGVsZW1lbnQsICdibHVyJywgZnVuY3Rpb24o IGV2ZW50ICkgeyBvc19ldmVudEJsdXIoIGV2ZW50ICk7IH0gKTsKCQlvc19ob29r RXZlbnQoIGVsZW1lbnQsICdmb2N1cycsIGZ1bmN0aW9uKCBldmVudCApIHsgb3Nf ZXZlbnRGb2N1cyggZXZlbnQgKTsgfSApOwoJCS8vIFdlIGRvbid0IHdhbnQgYnJv d3NlciBhdXRvLXN1Z2dlc3Rpb25zIGludGVyZmVyaW5nIHdpdGggb3VyIGRpdiwg YnV0CgkJLy8gYXV0b2NvbXBsZXRlIG11c3QgYmUgb24gZm9yIGRhdGFsaXN0IHRv IHdvcmsgKGF0IGxlYXN0IGluIE9wZXJhCgkJLy8gMTAuMTApLgoJCWVsZW1lbnQu c2V0QXR0cmlidXRlKCAnYXV0b2NvbXBsZXRlJywgJ29mZicgKTsKCX0KCS8vIHN0 b3BwaW5nIGhhbmRsZXIKCW9zX2hvb2tFdmVudCggZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQoIGZvcm1uYW1lICksICdzdWJtaXQnLCBmdW5jdGlvbiggZXZlbnQgKSB7 IHJldHVybiBvc19ldmVudE9uc3VibWl0KCBldmVudCApOyB9ICk7Cglvc19tYXBb bmFtZV0gPSByOwoJLy8gdG9nZ2xlIGxpbmsKCWlmKCBkb2N1bWVudC5nZXRFbGVt ZW50QnlJZCggci50b2dnbGUgKSA9PSBudWxsICkgewoJCS8vIFRPRE86IGRpc2Fi bGUgdGhpcyB3aGlsZSB3ZSBmaWd1cmUgb3V0IGEgd2F5IGZvciB0aGlzIHRvIHdv cmsgaW4gYWxsIGJyb3dzZXJzCgkJLyogaWYoIG5hbWUgPT0gJ3NlYXJjaElucHV0 JyApIHsKCQkJLy8gc3BlY2lhbCBjYXNlOiBwbGFjZSBhYm92ZSB0aGUgbWFpbiBz ZWFyY2ggYm94CgkJCXZhciB0ID0gb3NfY3JlYXRlVG9nZ2xlKCByLCAnb3Mtc3Vn Z2VzdC10b2dnbGUnICk7CgkJCXZhciBzZWFyY2hCb2R5ID0gZG9jdW1lbnQuZ2V0 RWxlbWVudEJ5SWQoICdzZWFyY2hCb2R5JyApOwoJCQl2YXIgZmlyc3QgPSBzZWFy Y2hCb2R5LnBhcmVudE5vZGUuZmlyc3RDaGlsZC5uZXh0U2libGluZy5hcHBlbmRD aGlsZCh0KTsKCQl9IGVsc2UgewoJCQkvLyBkZWZhdWx0OiBwbGFjZSBiZWxvdyBz ZWFyY2ggYm94IHRvIHRoZSByaWdodAoJCQl2YXIgdCA9IG9zX2NyZWF0ZVRvZ2ds ZSggciwgJ29zLXN1Z2dlc3QtdG9nZ2xlLWRlZicgKTsKCQkJdmFyIHRvcCA9IGVs ZW1lbnQub2Zmc2V0VG9wICsgZWxlbWVudC5vZmZzZXRIZWlnaHQ7CgkJCXZhciBs ZWZ0ID0gZWxlbWVudC5vZmZzZXRMZWZ0ICsgZWxlbWVudC5vZmZzZXRXaWR0aDsK CQkJdC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CgkJCXQuc3R5bGUudG9w ID0gdG9wICsgJ3B4JzsKCQkJdC5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCc7CgkJ CWVsZW1lbnQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCggdCApOwoJCQkvLyBvbmx5 IG5vdyB3aWR0aCBnZXRzIGNhbGN1bGF0ZWQsIHNoaWZ0IHJpZ2h0CgkJCWxlZnQg LT0gdC5vZmZzZXRXaWR0aDsKCQkJdC5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCc7 CgkJCXQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKCQl9ICovCgl9Cgp9 CgpmdW5jdGlvbiBvc19ob29rRXZlbnQoIGVsZW1lbnQsIGhvb2tOYW1lLCBob29r RnVuY3QgKSB7CglpZiAoIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciApIHsKCQll bGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIGhvb2tOYW1lLCBob29rRnVuY3QsIGZh bHNlICk7Cgl9IGVsc2UgaWYgKCB3aW5kb3cuYXR0YWNoRXZlbnQgKSB7CgkJZWxl bWVudC5hdHRhY2hFdmVudCggJ29uJyArIGhvb2tOYW1lLCBob29rRnVuY3QgKTsK CX0KfQoKLyoqKioqKioqKioqKioqKioqKioqCiAqICBLZXlib2FyZCBldmVudHMK ICoqKioqKioqKioqKioqKioqKioqLwoKLyoqIEV2ZW50IGhhbmRsZXIgdGhhdCB3 aWxsIGZldGNoIHJlc3VsdHMgb24ga2V5dXAgKi8KZnVuY3Rpb24gb3NfZXZlbnRL ZXl1cCggZSApIHsKCXZhciB0YXJnID0gb3NfZ2V0VGFyZ2V0KCBlICk7Cgl2YXIg ciA9IG9zX21hcFt0YXJnLmlkXTsKCWlmKCByID09IG51bGwgKSB7CgkJcmV0dXJu OyAvLyBub3Qgb3VyIGV2ZW50Cgl9CgoJLy8gc29tZSBicm93c2VycyB3b24ndCBn ZW5lcmF0ZSBrZXlwcmVzc2VkIGZvciBhcnJvdyBrZXlzLCBjYXRjaCBpdAoJaWYo IG9zX2tleXByZXNzZWRfY291bnQgPT0gMCApIHsKCQlvc19wcm9jZXNzS2V5KCBy LCBvc19jdXJfa2V5cHJlc3NlZCwgdGFyZyApOwoJfQoJdmFyIHF1ZXJ5ID0gdGFy Zy52YWx1ZTsKCW9zX2ZldGNoUmVzdWx0cyggciwgcXVlcnksIG9zX3NlYXJjaF90 aW1lb3V0ICk7Cn0KCi8qKiBjYXRjaCBhcnJvd3MgdXAvZG93biBhbmQgZXNjYXBl IHRvIGhpZGUgdGhlIHN1Z2dlc3Rpb25zICovCmZ1bmN0aW9uIG9zX3Byb2Nlc3NL ZXkoIHIsIGtleXByZXNzZWQsIHRhcmcgKSB7CglpZiAoIGtleXByZXNzZWQgPT0g NDAgJiYgIXIudmlzaWJsZSAmJiBvc190aW1lciA9PSBudWxsICkgewoJCS8vIElm IHRoZSB1c2VyIGhpdHMgdGhlIGRvd24gYXJyb3csIGZldGNoIHJlc3VsdHMgaW1t ZWRpYXRlbHkgaWYgbm9uZQoJCS8vIGFyZSBhbHJlYWR5IGRpc3BsYXllZC4KCQly LnF1ZXJ5ID0gJyc7CgkJb3NfZmV0Y2hSZXN1bHRzKCByLCB0YXJnLnZhbHVlLCAw ICk7Cgl9CgkvLyBPdGhlcndpc2UsIGlmIHdlJ3JlIG5vdCB1c2luZyBkYXRhbGlz dCwgd2UgbmVlZCB0byBoYW5kbGUgc2Nyb2xsaW5nIGFuZAoJLy8gc28gb24uCglp ZiAoIG9zX3VzZV9kYXRhbGlzdCApIHsKCQlyZXR1cm47Cgl9CglpZiAoIGtleXBy ZXNzZWQgPT0gNDAgKSB7IC8vIEFycm93IERvd24KCQlpZiAoIHIudmlzaWJsZSAp IHsKCQkJb3NfY2hhbmdlSGlnaGxpZ2h0KCByLCByLnNlbGVjdGVkLCByLnNlbGVj dGVkICsgMSwgdHJ1ZSApOwoJCX0KCX0gZWxzZSBpZiAoIGtleXByZXNzZWQgPT0g MzggKSB7IC8vIEFycm93IFVwCgkJaWYgKCByLnZpc2libGUgKSB7CgkJCW9zX2No YW5nZUhpZ2hsaWdodCggciwgci5zZWxlY3RlZCwgci5zZWxlY3RlZCAtIDEsIHRy dWUgKTsKCQl9Cgl9IGVsc2UgaWYoIGtleXByZXNzZWQgPT0gMjcgKSB7IC8vIEVz Y2FwZQoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCByLnNlYXJjaGJveCApLnZh bHVlID0gci5vcmlnaW5hbDsKCQlyLnF1ZXJ5ID0gci5vcmlnaW5hbDsKCQlvc19o aWRlUmVzdWx0cyggciApOwoJfSBlbHNlIGlmKCByLnF1ZXJ5ICE9IGRvY3VtZW50 LmdldEVsZW1lbnRCeUlkKCByLnNlYXJjaGJveCApLnZhbHVlICkgewoJCS8vIG9z X2hpZGVSZXN1bHRzKCByICk7IC8vIGRvbid0IHNob3cgb2xkIHN1Z2dlc3Rpb25z Cgl9Cn0KCi8qKiBXaGVuIGtleXMgaXMgaGVsZCBkb3duIHVzZSBhIHRpbWVyIHRv IG91dHB1dCByZWd1bGFyIGV2ZW50cyAqLwpmdW5jdGlvbiBvc19ldmVudEtleXBy ZXNzKCBlICkgewoJdmFyIHRhcmcgPSBvc19nZXRUYXJnZXQoIGUgKTsKCXZhciBy ID0gb3NfbWFwW3RhcmcuaWRdOwoJaWYoIHIgPT0gbnVsbCApIHsKCQlyZXR1cm47 IC8vIG5vdCBvdXIgZXZlbnQKCX0KCgl2YXIga2V5cHJlc3NlZCA9IG9zX2N1cl9r ZXlwcmVzc2VkOwoKCW9zX2tleXByZXNzZWRfY291bnQrKzsKCW9zX3Byb2Nlc3NL ZXkoIHIsIGtleXByZXNzZWQsIHRhcmcgKTsKfQoKLyoqIENhdGNoIHRoZSBrZXkg Y29kZSAoRmlyZWZveCBidWcpICovCmZ1bmN0aW9uIG9zX2V2ZW50S2V5ZG93bigg ZSApIHsKCWlmICggIWUgKSB7CgkJZSA9IHdpbmRvdy5ldmVudDsKCX0KCXZhciB0 YXJnID0gb3NfZ2V0VGFyZ2V0KCBlICk7Cgl2YXIgciA9IG9zX21hcFt0YXJnLmlk XTsKCWlmKCByID09IG51bGwgKSB7CgkJcmV0dXJuOyAvLyBub3Qgb3VyIGV2ZW50 Cgl9CgoJb3NfbW91c2VfbW92ZWQgPSBmYWxzZTsKCglvc19jdXJfa2V5cHJlc3Nl ZCA9ICggZS5rZXlDb2RlID09IHVuZGVmaW5lZCApID8gZS53aGljaCA6IGUua2V5 Q29kZTsKCW9zX2tleXByZXNzZWRfY291bnQgPSAwOwp9CgoKLyoqIFdoZW4gdGhl IGZvcm0gaXMgc3VibWl0dGVkIGhpZGUgZXZlcnl0aGluZywgY2FuY2VsIHVwZGF0 ZXMuLi4gKi8KZnVuY3Rpb24gb3NfZXZlbnRPbnN1Ym1pdCggZSApIHsKCXZhciB0 YXJnID0gb3NfZ2V0VGFyZ2V0KCBlICk7CgoJb3NfaXNfc3RvcHBlZCA9IHRydWU7 CgkvLyBraWxsIHRpbWVkIHJlcXVlc3RzCglpZiggb3NfdGltZXIgIT0gbnVsbCAm JiBvc190aW1lci5pZCAhPSBudWxsICkgewoJCWNsZWFyVGltZW91dCggb3NfdGlt ZXIuaWQgKTsKCQlvc190aW1lciA9IG51bGw7Cgl9CgkvLyBIaWRlIGFsbCBzdWdn ZXN0aW9ucwoJZm9yKCBpID0gMDsgaSA8IG9zX2F1dG9sb2FkX2lucHV0cy5sZW5n dGg7IGkrKyApIHsKCQl2YXIgciA9IG9zX21hcFtvc19hdXRvbG9hZF9pbnB1dHNb aV1dOwoJCWlmKCByICE9IG51bGwgKSB7CgkJCXZhciBiID0gZG9jdW1lbnQuZ2V0 RWxlbWVudEJ5SWQoIHIuc2VhcmNoZm9ybSApOwoJCQlpZiggYiAhPSBudWxsICYm IGIgPT0gdGFyZyApIHsKCQkJCS8vIHNldCBxdWVyeSB2YWx1ZSBzbyB0aGUgaGFu ZGxlciB3b24ndCB0cnkgdG8gZmV0Y2ggYWRkaXRpb25hbCByZXN1bHRzCgkJCQly LnF1ZXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIHIuc2VhcmNoYm94ICku dmFsdWU7CgkJCX0KCQkJb3NfaGlkZVJlc3VsdHMoIHIgKTsKCQl9Cgl9CglyZXR1 cm4gdHJ1ZTsKfQoKCgovKiogSGlkZSByZXN1bHRzIGZyb20gdGhlIHVzZXIsIGVp dGhlciBtYWtpbmcgdGhlIGRpdiB2aXNpYmlsaXR5PWhpZGRlbiBvcgogKiBkZXRh Y2hpbmcgdGhlIGRhdGFsaXN0IGZyb20gdGhlIGlucHV0LiAqLwpmdW5jdGlvbiBv c19oaWRlUmVzdWx0cyggciApIHsKCWlmICggb3NfdXNlX2RhdGFsaXN0ICkgewoJ CWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCByLnNlYXJjaGJveCApLnNldEF0dHJp YnV0ZSggJ2xpc3QnLCAnJyApOwoJfSBlbHNlIHsKCQl2YXIgYyA9IGRvY3VtZW50 LmdldEVsZW1lbnRCeUlkKCByLmNvbnRhaW5lciApOwoJCWlmICggYyAhPSBudWxs ICkgewoJCQljLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKCQl9Cgl9Cgly LnZpc2libGUgPSBmYWxzZTsKCXIuc2VsZWN0ZWQgPSAtMTsKfQoKZnVuY3Rpb24g b3NfZGVjb2RlVmFsdWUoIHZhbHVlICkgewoJaWYgKCBkZWNvZGVVUklDb21wb25l bnQgKSB7CgkJcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTsKCX0K CWlmKCB1bmVzY2FwZSApIHsKCQlyZXR1cm4gdW5lc2NhcGUoIHZhbHVlICk7Cgl9 CglyZXR1cm4gbnVsbDsKfQoKZnVuY3Rpb24gb3NfZW5jb2RlUXVlcnkoIHZhbHVl ICkgewoJaWYgKCBlbmNvZGVVUklDb21wb25lbnQgKSB7CgkJcmV0dXJuIGVuY29k ZVVSSUNvbXBvbmVudCggdmFsdWUgKTsKCX0KCWlmKCBlc2NhcGUgKSB7CgkJcmV0 dXJuIGVzY2FwZSggdmFsdWUgKTsKCX0KCXJldHVybiBudWxsOwp9CgovKiogSGFu ZGxlcyBkYXRhIGZyb20gWE1MSHR0cFJlcXVlc3QsIGFuZCB1cGRhdGVzIHRoZSBz dWdnZXN0IHJlc3VsdHMgKi8KZnVuY3Rpb24gb3NfdXBkYXRlUmVzdWx0cyggciwg cXVlcnksIHRleHQsIGNhY2hlS2V5ICkgewoJb3NfY2FjaGVbY2FjaGVLZXldID0g dGV4dDsKCXIucXVlcnkgPSBxdWVyeTsKCXIub3JpZ2luYWwgPSBxdWVyeTsKCWlm KCB0ZXh0ID09ICcnICkgewoJCXIucmVzdWx0cyA9IG51bGw7CgkJci5yZXN1bHRD b3VudCA9IDA7CgkJb3NfaGlkZVJlc3VsdHMoIHIgKTsKCX0gZWxzZSB7CgkJdHJ5 IHsKCQkJdmFyIHAgPSBldmFsKCAnKCcgKyB0ZXh0ICsgJyknICk7IC8vIHNpbXBs ZSBqc29uIHBhcnNlLCBjb3VsZCBkbyBhIHNhZmVyIG9uZQoJCQlpZiggcC5sZW5n dGggPCAyIHx8IHBbMV0ubGVuZ3RoID09IDAgKSB7CgkJCQlyLnJlc3VsdHMgPSBu dWxsOwoJCQkJci5yZXN1bHRDb3VudCA9IDA7CgkJCQlvc19oaWRlUmVzdWx0cygg ciApOwoJCQkJcmV0dXJuOwoJCQl9CgkJCWlmICggb3NfdXNlX2RhdGFsaXN0ICkg ewoJCQkJb3Nfc2V0dXBEYXRhbGlzdCggciwgcFsxXSApOwoJCQl9IGVsc2UgewoJ CQkJb3Nfc2V0dXBEaXYoIHIsIHBbMV0gKTsKCQkJfQoJCX0gY2F0Y2goIGUgKSB7 CgkJCS8vIGJhZCByZXNwb25zZSBmcm9tIHNlcnZlciBvciBzdWNoCgkJCW9zX2hp ZGVSZXN1bHRzKCByICk7CgkJCW9zX2NhY2hlW2NhY2hlS2V5XSA9IG51bGw7CgkJ fQoJfQp9CgovKioKICogQ3JlYXRlIGFuZCBwb3B1bGF0ZSBhIDxkYXRhbGlzdD4u CiAqCiAqIEBwYXJhbSByICAgICAgIG9zX1Jlc3VsdCBvYmplY3QKICogQHBhcmFt IHJlc3VsdHMgQXJyYXkgb2YgdGhlIG5ldyByZXN1bHRzIHRvIHJlcGxhY2UgZXhp c3Rpbmcgb25lcwogKi8KZnVuY3Rpb24gb3Nfc2V0dXBEYXRhbGlzdCggciwgcmVz dWx0cyApIHsKCXZhciBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIHIuc2Vh cmNoYm94ICk7Cgl2YXIgYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCByLmNv bnRhaW5lciApOwoJaWYgKCBjID09IG51bGwgKSB7CgkJYyA9IGRvY3VtZW50LmNy ZWF0ZUVsZW1lbnQoICdkYXRhbGlzdCcgKTsKCQljLnNldEF0dHJpYnV0ZSggJ2lk Jywgci5jb250YWluZXIgKTsKCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCBj ICk7Cgl9IGVsc2UgewoJCWMuaW5uZXJIVE1MID0gJyc7Cgl9CglzLnNldEF0dHJp YnV0ZSggJ2xpc3QnLCByLmNvbnRhaW5lciApOwoKCXIucmVzdWx0cyA9IG5ldyBB cnJheSgpOwoJci5yZXN1bHRDb3VudCA9IHJlc3VsdHMubGVuZ3RoOwoJci52aXNp YmxlID0gdHJ1ZTsKCWZvciAoIGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkr KyApIHsKCQl2YXIgdGl0bGUgPSBvc19kZWNvZGVWYWx1ZSggcmVzdWx0c1tpXSAp OwoJCXZhciBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnb3B0aW9uJyAp OwoJCW9wdC52YWx1ZSA9IHRpdGxlOwoJCXIucmVzdWx0c1tpXSA9IHRpdGxlOwoJ CWMuYXBwZW5kQ2hpbGQoIG9wdCApOwoJfQp9CgovKiogRmV0Y2ggbmFtZXNwYWNl cyBmcm9tIGNoZWNrYm94ZXMgb3IgaGlkZGVuIGZpZWxkcyBpbiB0aGUgc2VhcmNo IGZvcm0sCiAgICBpZiBub25lIGRlZmluZWQgdXNlIHdnU2VhcmNoTmFtZXNwYWNl cyBnbG9iYWwgKi8KZnVuY3Rpb24gb3NfZ2V0TmFtZXNwYWNlcyggciApIHsKCXZh ciBuYW1lc3BhY2VzID0gJyc7Cgl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5mb3Jt c1tyLnNlYXJjaGZvcm1dLmVsZW1lbnRzOwoJZm9yKCBpID0gMDsgaSA8IGVsZW1l bnRzLmxlbmd0aDsgaSsrICkgewoJCXZhciBuYW1lID0gZWxlbWVudHNbaV0ubmFt ZTsKCQlpZiggdHlwZW9mIG5hbWUgIT0gJ3VuZGVmaW5lZCcgJiYgbmFtZS5sZW5n dGggPiAyICYmIG5hbWVbMF0gPT0gJ24nICYmCgkJCW5hbWVbMV0gPT0gJ3MnICYm ICgKCQkJCSggZWxlbWVudHNbaV0udHlwZSA9PSAnY2hlY2tib3gnICYmIGVsZW1l bnRzW2ldLmNoZWNrZWQgKSB8fAoJCQkJKCBlbGVtZW50c1tpXS50eXBlID09ICdo aWRkZW4nICYmIGVsZW1lbnRzW2ldLnZhbHVlID09ICcxJyApCgkJCSkKCQkpIHsK CQkJaWYoIG5hbWVzcGFjZXMgIT0gJycgKSB7CgkJCQluYW1lc3BhY2VzICs9ICd8 JzsKCQkJfQoJCQluYW1lc3BhY2VzICs9IG5hbWUuc3Vic3RyaW5nKCAyICk7CgkJ fQoJfQoJaWYoIG5hbWVzcGFjZXMgPT0gJycgKSB7CgkJbmFtZXNwYWNlcyA9IHdn U2VhcmNoTmFtZXNwYWNlcy5qb2luKCd8Jyk7Cgl9CglyZXR1cm4gbmFtZXNwYWNl czsKfQoKLyoqIFVwZGF0ZSByZXN1bHRzIGlmIHVzZXIgaGFzbid0IGFscmVhZHkg dHlwZWQgc29tZXRoaW5nIGVsc2UgKi8KZnVuY3Rpb24gb3NfdXBkYXRlSWZSZWxl dmFudCggciwgcXVlcnksIHRleHQsIGNhY2hlS2V5ICkgewoJdmFyIHQgPSBkb2N1 bWVudC5nZXRFbGVtZW50QnlJZCggci5zZWFyY2hib3ggKTsKCWlmKCB0ICE9IG51 bGwgJiYgdC52YWx1ZSA9PSBxdWVyeSApIHsgLy8gY2hlY2sgaWYgcmVzcG9uc2Ug aXMgc3RpbGwgcmVsZXZhbnQKCQlvc191cGRhdGVSZXN1bHRzKCByLCBxdWVyeSwg dGV4dCwgY2FjaGVLZXkgKTsKCX0KCXIucXVlcnkgPSBxdWVyeTsKfQoKLyoqIEZl dGNoIHJlc3VsdHMgYWZ0ZXIgc29tZSB0aW1lb3V0ICovCmZ1bmN0aW9uIG9zX2Rl bGF5ZWRGZXRjaCgpIHsKCWlmKCBvc190aW1lciA9PSBudWxsICkgewoJCXJldHVy bjsKCX0KCXZhciByID0gb3NfdGltZXIucjsKCXZhciBxdWVyeSA9IG9zX3RpbWVy LnF1ZXJ5OwoJb3NfdGltZXIgPSBudWxsOwoJdmFyIHBhdGggPSB3Z01XU3VnZ2Vz dFRlbXBsYXRlLnJlcGxhY2UoICJ7bmFtZXNwYWNlc30iLCBvc19nZXROYW1lc3Bh Y2VzKCByICkgKQoJCQkJCQkJCQkucmVwbGFjZSggIntkYm5hbWV9Iiwgd2dEQm5h bWUgKQoJCQkJCQkJCQkucmVwbGFjZSggIntzZWFyY2hUZXJtc30iLCBvc19lbmNv ZGVRdWVyeSggcXVlcnkgKSApOwoKCS8vIHRyeSB0byBnZXQgZnJvbSBjYWNoZSwg aWYgbm90IGZldGNoIHVzaW5nIGFqYXgKCXZhciBjYWNoZWQgPSBvc19jYWNoZVtw YXRoXTsKCWlmKCBjYWNoZWQgIT0gbnVsbCAmJiBjYWNoZWQgIT0gdW5kZWZpbmVk ICkgewoJCW9zX3VwZGF0ZUlmUmVsZXZhbnQoIHIsIHF1ZXJ5LCBjYWNoZWQsIHBh dGggKTsKCX0gZWxzZSB7CgkJdmFyIHhtbGh0dHAgPSBzYWpheF9pbml0X29iamVj dCgpOwoJCWlmKCB4bWxodHRwICkgewoJCQl0cnkgewoJCQkJeG1saHR0cC5vcGVu KCAnR0VUJywgcGF0aCwgdHJ1ZSApOwoJCQkJeG1saHR0cC5vbnJlYWR5c3RhdGVj aGFuZ2UgPSBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHhtbGh0dHAucmVhZHlTdGF0 ZSA9PSA0ICYmIHR5cGVvZiBvc191cGRhdGVJZlJlbGV2YW50ID09ICdmdW5jdGlv bicgKSB7CgkJCQkJCW9zX3VwZGF0ZUlmUmVsZXZhbnQoIHIsIHF1ZXJ5LCB4bWxo dHRwLnJlc3BvbnNlVGV4dCwgcGF0aCApOwoJCQkJCX0KCQkJCX07CgkJCQl4bWxo dHRwLnNlbmQoIG51bGwgKTsKCQkJfSBjYXRjaCAoIGUgKSB7CgkJCQlpZiAoIHdp bmRvdy5sb2NhdGlvbi5ob3N0bmFtZSA9PSAnbG9jYWxob3N0JyApIHsKCQkJCQlh bGVydCggIllvdXIgYnJvd3NlciBibG9ja3MgWE1MSHR0cFJlcXVlc3QgdG8gJ2xv Y2FsaG9zdCcsIHRyeSB1c2luZyBhIHJlYWwgaG9zdG5hbWUgZm9yIGRldmVsb3Bt ZW50L3Rlc3RpbmcuIiApOwoJCQkJfQoJCQkJdGhyb3cgZTsKCQkJfQoJCX0KCX0K fQoKLyoqIEluaXQgdGltZWQgdXBkYXRlIHZpYSBvc19kZWxheWVkVXBkYXRlKCkg Ki8KZnVuY3Rpb24gb3NfZmV0Y2hSZXN1bHRzKCByLCBxdWVyeSwgdGltZW91dCAp IHsKCWlmKCBxdWVyeSA9PSAnJyApIHsKCQlyLnF1ZXJ5ID0gJyc7CgkJb3NfaGlk ZVJlc3VsdHMoIHIgKTsKCQlyZXR1cm47Cgl9IGVsc2UgaWYoIHF1ZXJ5ID09IHIu cXVlcnkgKSB7CgkJcmV0dXJuOyAvLyBubyBjaGFuZ2UKCX0KCglvc19pc19zdG9w cGVkID0gZmFsc2U7IC8vIG1ha2Ugc3VyZSB3ZSdyZSBydW5uaW5nCgoJLy8gY2Fu Y2VsIGFueSBwZW5kaW5nIGZldGNoZXMKCWlmKCBvc190aW1lciAhPSBudWxsICYm IG9zX3RpbWVyLmlkICE9IG51bGwgKSB7CgkJY2xlYXJUaW1lb3V0KCBvc190aW1l ci5pZCApOwoJfQoJLy8gc2NoZWR1bGUgZGVsYXllZCBmZXRjaGluZyBvZiByZXN1 bHRzCglpZiggdGltZW91dCAhPSAwICkgewoJCW9zX3RpbWVyID0gbmV3IG9zX1Rp bWVyKCBzZXRUaW1lb3V0KCAib3NfZGVsYXllZEZldGNoKCkiLCB0aW1lb3V0ICks IHIsIHF1ZXJ5ICk7Cgl9IGVsc2UgewoJCW9zX3RpbWVyID0gbmV3IG9zX1RpbWVy KCBudWxsLCByLCBxdWVyeSApOwoJCW9zX2RlbGF5ZWRGZXRjaCgpOyAvLyBkbyBp dCBub3chCgl9Cn0KCi8qKiBGaW5kIGV2ZW50IHRhcmdldCAqLwpmdW5jdGlvbiBv c19nZXRUYXJnZXQoIGUgKSB7CglpZiAoICFlICkgewoJCWUgPSB3aW5kb3cuZXZl bnQ7Cgl9CglpZiAoIGUudGFyZ2V0ICkgewoJCXJldHVybiBlLnRhcmdldDsKCX0g ZWxzZSBpZiAoIGUuc3JjRWxlbWVudCApIHsKCQlyZXR1cm4gZS5zcmNFbGVtZW50 OwoJfSBlbHNlIHsKCQlyZXR1cm4gbnVsbDsKCX0KfQoKLyoqIENoZWNrIGlmIHgg aXMgYSB2YWxpZCBpbnRlZ2VyICovCmZ1bmN0aW9uIG9zX2lzTnVtYmVyKCB4ICkg ewoJaWYoIHggPT0gJycgfHwgaXNOYU4oIHggKSApIHsKCQlyZXR1cm4gZmFsc2U7 Cgl9Cglmb3IoIHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKysgKSB7CgkJdmFy IGMgPSB4LmNoYXJBdCggaSApOwoJCWlmKCAhKCBjID49ICcwJyAmJiBjIDw9ICc5 JyApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoJcmV0dXJuIHRydWU7Cn0K Ci8qKiBDYWxsIHRoaXMgdG8gZW5hYmxlIHN1Z2dlc3Rpb25zIG9uIGlucHV0IChp ZD1pbnB1dElkKSwgb24gYSBmb3JtIChuYW1lPWZvcm1OYW1lKSAqLwpmdW5jdGlv biBvc19lbmFibGVTdWdnZXN0aW9uc09uKCBpbnB1dElkLCBmb3JtTmFtZSApIHsK CW9zX2luaXRIYW5kbGVycyggaW5wdXRJZCwgZm9ybU5hbWUsIGRvY3VtZW50Lmdl dEVsZW1lbnRCeUlkKCBpbnB1dElkICkgKTsKfQoKLyoqIENhbGwgdGhpcyB0byBk aXNhYmxlIHN1Z2dlc3Rpb3Mgb24gaW5wdXQgYm94IChpZD1pbnB1dElkKSAqLwpm dW5jdGlvbiBvc19kaXNhYmxlU3VnZ2VzdGlvbnNPbiggaW5wdXRJZCApIHsKCXIg PSBvc19tYXBbaW5wdXRJZF07CglpZiggciAhPSBudWxsICkgewoJCS8vIGNhbmNl bC9oaWRlIHJlc3VsdHMKCQlvc190aW1lciA9IG51bGw7CgkJb3NfaGlkZVJlc3Vs dHMoIHIgKTsKCQkvLyB0dXJuIGF1dG9jb21wbGV0ZSBvbiAhCgkJZG9jdW1lbnQu Z2V0RWxlbWVudEJ5SWQoIGlucHV0SWQgKS5zZXRBdHRyaWJ1dGUoICdhdXRvY29t cGxldGUnLCAnb24nICk7CgkJLy8gcmVtb3ZlIGRlc2NyaXB0b3IKCQlvc19tYXBb aW5wdXRJZF0gPSBudWxsOwoJfQoKCS8vIFJlbW92ZSB0aGUgZWxlbWVudCBmcm9t IHRoZSBvc19hdXRvbG9hZF8qIGFycmF5cwoJdmFyIGluZGV4ID0gb3NfYXV0b2xv YWRfaW5wdXRzLmluZGV4T2YoIGlucHV0SWQgKTsKCWlmICggaW5kZXggPj0gMCAp IHsKCQlvc19hdXRvbG9hZF9pbnB1dHNbaW5kZXhdID0gb3NfYXV0b2xvYWRfZm9y bXNbaW5kZXhdID0gJyc7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKICogRGl2LW9ubHkgZnVuY3Rpb25zIChp cnJlbGV2YW50IGZvciBkYXRhbGlzdCkKICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKiBFdmVudDogbG9zcyBvZiBm b2N1cyBvZiBpbnB1dCBib3ggKi8KZnVuY3Rpb24gb3NfZXZlbnRCbHVyKCBlICkg ewoJdmFyIHRhcmcgPSBvc19nZXRUYXJnZXQoIGUgKTsKCXZhciByID0gb3NfbWFw W3RhcmcuaWRdOwoJaWYoIHIgPT0gbnVsbCApIHsKCQlyZXR1cm47IC8vIG5vdCBv dXIgZXZlbnQKCX0KCWlmKCAhb3NfbW91c2VfcHJlc3NlZCApIHsKCQlvc19oaWRl UmVzdWx0cyggciApOwoJCS8vIGZvcmNlIGNhbnZhcyB0byBzdGF5IGhpZGRlbgoJ CXIuc3RheUhpZGRlbiA9IHRydWU7CgkJLy8gY2FuY2VsIGFueSBwZW5kaW5nIGZl dGNoZXMKCQlpZiggb3NfdGltZXIgIT0gbnVsbCAmJiBvc190aW1lci5pZCAhPSBu dWxsICkgewoJCQljbGVhclRpbWVvdXQoIG9zX3RpbWVyLmlkICk7CgkJfQoJCW9z X3RpbWVyID0gbnVsbDsKCX0KfQoKLyoqIEV2ZW50OiBmb2N1cyAoY2F0Y2ggb25s eSB3aGVuIHN0b3BwZWQpICovCmZ1bmN0aW9uIG9zX2V2ZW50Rm9jdXMoIGUgKSB7 Cgl2YXIgdGFyZyA9IG9zX2dldFRhcmdldCggZSApOwoJdmFyIHIgPSBvc19tYXBb dGFyZy5pZF07CglpZiggciA9PSBudWxsICkgewoJCXJldHVybjsgLy8gbm90IG91 ciBldmVudAoJfQoJci5zdGF5SGlkZGVuID0gZmFsc2U7Cn0KCi8qKgogKiBDcmVh dGUgYW5kIHBvcHVsYXRlIGEgPGRpdj4sIGZvciBub24tPGRhdGFsaXN0Pi1zdXBw b3J0aW5nIGJyb3dzZXJzLgogKgogKiBAcGFyYW0gciAgICAgICBvc19SZXN1bHQg b2JqZWN0CiAqIEBwYXJhbSByZXN1bHRzIEFycmF5IG9mIHRoZSBuZXcgcmVzdWx0 cyB0byByZXBsYWNlIGV4aXN0aW5nIG9uZXMKICovCmZ1bmN0aW9uIG9zX3NldHVw RGl2KCByLCByZXN1bHRzICkgewoJdmFyIGMgPSBkb2N1bWVudC5nZXRFbGVtZW50 QnlJZCggci5jb250YWluZXIgKTsKCWlmICggYyA9PSBudWxsICkgewoJCWMgPSBv c19jcmVhdGVDb250YWluZXIoIHIgKTsKCX0KCWMuaW5uZXJIVE1MID0gb3NfY3Jl YXRlUmVzdWx0VGFibGUoIHIsIHJlc3VsdHMgKTsKCS8vIGluaXQgY29udGFpbmVy IHRhYmxlIHNpemVzCgl2YXIgdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBy LnJlc3VsdFRhYmxlICk7CglyLmNvbnRhaW5lclRvdGFsID0gdC5vZmZzZXRIZWln aHQ7CglyLmNvbnRhaW5lclJvdyA9IHQub2Zmc2V0SGVpZ2h0IC8gci5yZXN1bHRD b3VudDsKCW9zX2ZpdENvbnRhaW5lciggciApOwoJb3NfdHJpbVJlc3VsdFRleHQo IHIgKTsKCW9zX3Nob3dSZXN1bHRzKCByICk7Cn0KCi8qKiBDcmVhdGUgdGhlIHJl c3VsdCB0YWJsZSB0byBiZSBwbGFjZWQgaW4gdGhlIGNvbnRhaW5lciBkaXYgKi8K ZnVuY3Rpb24gb3NfY3JlYXRlUmVzdWx0VGFibGUoIHIsIHJlc3VsdHMgKSB7Cgl2 YXIgYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCByLmNvbnRhaW5lciApOwoJ dmFyIHdpZHRoID0gYy5vZmZzZXRXaWR0aCAtIG9zX29wZXJhV2lkdGhGaXgoIGMu b2Zmc2V0V2lkdGggKTsKCXZhciBodG1sID0gJzx0YWJsZSBjbGFzcz0ib3Mtc3Vn Z2VzdC1yZXN1bHRzIiBpZD0iJyArIHIucmVzdWx0VGFibGUgKyAnIiBzdHlsZT0i d2lkdGg6ICcgKyB3aWR0aCArICdweDsiPic7CglyLnJlc3VsdHMgPSBuZXcgQXJy YXkoKTsKCXIucmVzdWx0Q291bnQgPSByZXN1bHRzLmxlbmd0aDsKCWZvciggaSA9 IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrICkgewoJCXZhciB0aXRsZSA9IG9z X2RlY29kZVZhbHVlKCByZXN1bHRzW2ldICk7CgkJci5yZXN1bHRzW2ldID0gdGl0 bGU7CgkJaHRtbCArPSAnPHRyPjx0ZCBjbGFzcz0ib3Mtc3VnZ2VzdC1yZXN1bHQi IGlkPSInICsgci5yZXN1bHRUYWJsZSArIGkgKyAnIj48c3BhbiBpZD0iJyArIHIu cmVzdWx0VGV4dCArIGkgKyAnIj4nICsgdGl0bGUgKyAnPC9zcGFuPjwvdGQ+PC90 cj4nOwoJfQoJaHRtbCArPSAnPC90YWJsZT4nOwoJcmV0dXJuIGh0bWw7Cn0KCi8q KiBTaG93IHJlc3VsdHMgZGl2ICovCmZ1bmN0aW9uIG9zX3Nob3dSZXN1bHRzKCBy ICkgewoJaWYoIG9zX2lzX3N0b3BwZWQgKSB7CgkJcmV0dXJuOwoJfQoJaWYoIHIu c3RheUhpZGRlbiApIHsKCQlyZXR1cm47Cgl9Cglvc19maXRDb250YWluZXIoIHIg KTsKCXZhciBjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIHIuY29udGFpbmVy ICk7CglyLnNlbGVjdGVkID0gLTE7CglpZiggYyAhPSBudWxsICkgewoJCWMuc2Ny b2xsVG9wID0gMDsKCQljLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7CgkJ ci52aXNpYmxlID0gdHJ1ZTsKCX0KfQoKZnVuY3Rpb24gb3Nfb3BlcmFXaWR0aEZp eCggeCApIHsKCS8vIEZvciBicm93c2VycyB0aGF0IGRvbid0IHVuZGVyc3RhbmQg b3ZlcmZsb3cteCwgZXN0aW1hdGUgc2Nyb2xsYmFyIHdpZHRoCglpZiggdHlwZW9m IGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3dYICE9ICdzdHJpbmcnICkgewoJ CXJldHVybiAzMDsKCX0KCXJldHVybiAwOwp9CgovKiogQnJvd2VyLWRlcGVuZGVu dCBmdW5jdGlvbnMgdG8gZmluZCB3aW5kb3cgaW5uZXIgc2l6ZSwgYW5kIHNjcm9s bCBzdGF0dXMgKi8KZnVuY3Rpb24gZl9jbGllbnRXaWR0aCgpIHsKCXJldHVybiBm X2ZpbHRlclJlc3VsdHMoCgkJd2luZG93LmlubmVyV2lkdGggPyB3aW5kb3cuaW5u ZXJXaWR0aCA6IDAsCgkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ID8gZG9jdW1l bnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIDogMCwKCQlkb2N1bWVudC5i b2R5ID8gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA6IDAKCSk7Cn0KCmZ1bmN0 aW9uIGZfY2xpZW50SGVpZ2h0KCkgewoJcmV0dXJuIGZfZmlsdGVyUmVzdWx0cygK CQl3aW5kb3cuaW5uZXJIZWlnaHQgPyB3aW5kb3cuaW5uZXJIZWlnaHQgOiAwLAoJ CWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50LmRvY3VtZW50RWxl bWVudC5jbGllbnRIZWlnaHQgOiAwLAoJCWRvY3VtZW50LmJvZHkgPyBkb2N1bWVu dC5ib2R5LmNsaWVudEhlaWdodCA6IDAKCSk7Cn0KCmZ1bmN0aW9uIGZfc2Nyb2xs TGVmdCgpIHsKCXJldHVybiBmX2ZpbHRlclJlc3VsdHMoCgkJd2luZG93LnBhZ2VY T2Zmc2V0ID8gd2luZG93LnBhZ2VYT2Zmc2V0IDogMCwKCQlkb2N1bWVudC5kb2N1 bWVudEVsZW1lbnQgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVm dCA6IDAsCgkJZG9jdW1lbnQuYm9keSA/IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVm dCA6IDAKCSk7Cn0KCmZ1bmN0aW9uIGZfc2Nyb2xsVG9wKCkgewoJcmV0dXJuIGZf ZmlsdGVyUmVzdWx0cygKCQl3aW5kb3cucGFnZVlPZmZzZXQgPyB3aW5kb3cucGFn ZVlPZmZzZXQgOiAwLAoJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA/IGRvY3Vt ZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgOiAwLAoJCWRvY3VtZW50LmJv ZHkgPyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCA6IDAKCSk7Cn0KCmZ1bmN0aW9u IGZfZmlsdGVyUmVzdWx0cyggbl93aW4sIG5fZG9jZWwsIG5fYm9keSApIHsKCXZh ciBuX3Jlc3VsdCA9IG5fd2luID8gbl93aW4gOiAwOwoJaWYgKCBuX2RvY2VsICYm ICggIW5fcmVzdWx0IHx8ICggbl9yZXN1bHQgPiBuX2RvY2VsICkgKSApIHsKCQlu X3Jlc3VsdCA9IG5fZG9jZWw7Cgl9CglyZXR1cm4gbl9ib2R5ICYmICggIW5fcmVz dWx0IHx8ICggbl9yZXN1bHQgPiBuX2JvZHkgKSApID8gbl9ib2R5IDogbl9yZXN1 bHQ7Cn0KCi8qKiBHZXQgdGhlIGhlaWdodCBhdmFpbGFibGUgZm9yIHRoZSByZXN1 bHRzIGNvbnRhaW5lciAqLwpmdW5jdGlvbiBvc19hdmFpbGFibGVIZWlnaHQoIHIg KSB7Cgl2YXIgYWJzVG9wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIHIuY29u dGFpbmVyICkuc3R5bGUudG9wOwoJdmFyIHB4ID0gYWJzVG9wLmxhc3RJbmRleE9m KCAncHgnICk7CglpZiggcHggPiAwICkgewoJCWFic1RvcCA9IGFic1RvcC5zdWJz dHJpbmcoIDAsIHB4ICk7Cgl9CglyZXR1cm4gZl9jbGllbnRIZWlnaHQoKSAtICgg YWJzVG9wIC0gZl9zY3JvbGxUb3AoKSApOwp9CgovKiogR2V0IGVsZW1lbnQgYWJz b2x1dGUgcG9zaXRpb24ge2xlZnQsdG9wfSAqLwpmdW5jdGlvbiBvc19nZXRFbGVt ZW50UG9zaXRpb24oIGVsZW1JRCApIHsKCXZhciBvZmZzZXRUcmFpbCA9IGRvY3Vt ZW50LmdldEVsZW1lbnRCeUlkKCBlbGVtSUQgKTsKCXZhciBvZmZzZXRMZWZ0ID0g MDsKCXZhciBvZmZzZXRUb3AgPSAwOwoJd2hpbGUgKCBvZmZzZXRUcmFpbCApIHsK CQlvZmZzZXRMZWZ0ICs9IG9mZnNldFRyYWlsLm9mZnNldExlZnQ7CgkJb2Zmc2V0 VG9wICs9IG9mZnNldFRyYWlsLm9mZnNldFRvcDsKCQlvZmZzZXRUcmFpbCA9IG9m ZnNldFRyYWlsLm9mZnNldFBhcmVudDsKCX0KCWlmICggbmF2aWdhdG9yLnVzZXJB Z2VudC5pbmRleE9mKCdNYWMnKSAhPSAtMSAmJiB0eXBlb2YgZG9jdW1lbnQuYm9k eS5sZWZ0TWFyZ2luICE9ICd1bmRlZmluZWQnICkgewoJCW9mZnNldExlZnQgKz0g ZG9jdW1lbnQuYm9keS5sZWZ0TWFyZ2luOwoJCW9mZnNldFRvcCArPSBkb2N1bWVu dC5ib2R5LnRvcE1hcmdpbjsKCX0KCXJldHVybiB7IGxlZnQ6b2Zmc2V0TGVmdCwg dG9wOm9mZnNldFRvcCB9Owp9CgovKiogQ3JlYXRlIHRoZSBjb250YWluZXIgZGl2 IHRoYXQgd2lsbCBob2xkIHRoZSBzdWdnZXN0ZWQgdGl0bGVzICovCmZ1bmN0aW9u IG9zX2NyZWF0ZUNvbnRhaW5lciggciApIHsKCXZhciBjID0gZG9jdW1lbnQuY3Jl YXRlRWxlbWVudCggJ2RpdicgKTsKCXZhciBzID0gZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQoIHIuc2VhcmNoYm94ICk7Cgl2YXIgcG9zID0gb3NfZ2V0RWxlbWVudFBv c2l0aW9uKCByLnNlYXJjaGJveCApOwoJdmFyIGxlZnQgPSBwb3MubGVmdDsKCXZh ciB0b3AgPSBwb3MudG9wICsgcy5vZmZzZXRIZWlnaHQ7CgljLmNsYXNzTmFtZSA9 ICdvcy1zdWdnZXN0JzsKCWMuc2V0QXR0cmlidXRlKCAnaWQnLCByLmNvbnRhaW5l ciApOwoJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggYyApOwoKCS8vIGR5bmFt aWNhbGx5IGdlbmVyYXRlZCBzdHlsZSBwYXJhbXMKCS8vIElFIHdvcmthcm91bmQs IGNhbm5vdCBleHBsaWNpdGVseSBzZXQgInN0eWxlIiBhdHRyaWJ1dGUKCWMgPSBk b2N1bWVudC5nZXRFbGVtZW50QnlJZCggci5jb250YWluZXIgKTsKCWMuc3R5bGUu dG9wID0gdG9wICsgJ3B4JzsKCWMuc3R5bGUubGVmdCA9IGxlZnQgKyAncHgnOwoJ Yy5zdHlsZS53aWR0aCA9IHMub2Zmc2V0V2lkdGggKyAncHgnOwoKCS8vIG1vdXNl IGV2ZW50IGhhbmRsZXJzCgljLm9ubW91c2VvdmVyID0gZnVuY3Rpb24oIGV2ZW50 ICkgeyBvc19ldmVudE1vdXNlb3Zlciggci5zZWFyY2hib3gsIGV2ZW50ICk7IH07 CgljLm9ubW91c2Vtb3ZlID0gZnVuY3Rpb24oIGV2ZW50ICkgeyBvc19ldmVudE1v dXNlbW92ZSggci5zZWFyY2hib3gsIGV2ZW50ICk7IH07CgljLm9ubW91c2Vkb3du ID0gZnVuY3Rpb24oIGV2ZW50ICkgeyByZXR1cm4gb3NfZXZlbnRNb3VzZWRvd24o IHIuc2VhcmNoYm94LCBldmVudCApOyB9OwoJYy5vbm1vdXNldXAgPSBmdW5jdGlv biggZXZlbnQgKSB7IG9zX2V2ZW50TW91c2V1cCggci5zZWFyY2hib3gsIGV2ZW50 ICk7IH07CglyZXR1cm4gYzsKfQoKLyoqIGNoYW5nZSBjb250YWluZXIgaGVpZ2h0 IHRvIGZpdCB0byBzY3JlZW4gKi8KZnVuY3Rpb24gb3NfZml0Q29udGFpbmVyKCBy ICkgewoJdmFyIGMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggci5jb250YWlu ZXIgKTsKCXZhciBoID0gb3NfYXZhaWxhYmxlSGVpZ2h0KCByICkgLSAyMDsKCXZh ciBpbmMgPSByLmNvbnRhaW5lclJvdzsKCWggPSBwYXJzZUludCggaCAvIGluYyAp ICogaW5jOwoJaWYoIGggPCAoIDIgKiBpbmMgKSAmJiByLnJlc3VsdENvdW50ID4g MSApIHsgLy8gbWluOiB0d28gcmVzdWx0cwoJCWggPSAyICogaW5jOwoJfQoJaWYo ICggaCAvIGluYyApID4gb3NfbWF4X2xpbmVzX3Blcl9zdWdnZXN0ICkgewoJCWgg PSBpbmMgKiBvc19tYXhfbGluZXNfcGVyX3N1Z2dlc3Q7Cgl9CglpZiggaCA8IHIu Y29udGFpbmVyVG90YWwgKSB7CgkJYy5zdHlsZS5oZWlnaHQgPSBoICsgJ3B4JzsK CQlyLmNvbnRhaW5lckNvdW50ID0gcGFyc2VJbnQoIE1hdGgucm91bmQoIGggLyBp bmMgKSApOwoJfSBlbHNlIHsKCQljLnN0eWxlLmhlaWdodCA9IHIuY29udGFpbmVy VG90YWwgKyAncHgnOwoJCXIuY29udGFpbmVyQ291bnQgPSByLnJlc3VsdENvdW50 OwoJfQp9CgovKiogSWYgc29tZSBlbnRyaWVzIGFyZSBsb25nZXIgdGhhbiB0aGUg Ym94LCByZXBsYWNlIHRleHQgd2l0aCAiLi4uIiAqLwpmdW5jdGlvbiBvc190cmlt UmVzdWx0VGV4dCggciApIHsKCS8vIGZpbmQgbWF4IHdpZHRoLCBmaXJzdCBzZWUg aWYgd2UgY291bGQgZXhwYW5kIHRoZSBjb250YWluZXIgdG8gZml0IGl0Cgl2YXIg bWF4VyA9IDA7Cglmb3IoIHZhciBpID0gMDsgaSA8IHIucmVzdWx0Q291bnQ7IGkr KyApIHsKCQl2YXIgZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCByLnJlc3Vs dFRleHQgKyBpICk7CgkJaWYoIGUub2Zmc2V0V2lkdGggPiBtYXhXICkgewoJCQlt YXhXID0gZS5vZmZzZXRXaWR0aDsKCQl9Cgl9Cgl2YXIgdyA9IGRvY3VtZW50Lmdl dEVsZW1lbnRCeUlkKCByLmNvbnRhaW5lciApLm9mZnNldFdpZHRoOwoJdmFyIGZp eCA9IDA7CglpZiggci5jb250YWluZXJDb3VudCA8IHIucmVzdWx0Q291bnQgKSB7 CgkJZml4ID0gMjA7IC8vIGdpdmUgMjBweCBmb3Igc2Nyb2xsYmFyCgl9IGVsc2Ug ewoJCWZpeCA9IG9zX29wZXJhV2lkdGhGaXgoIHcgKTsKCX0KCWlmKCBmaXggPCA0 ICkgewoJCWZpeCA9IDQ7IC8vIGJhc2ljIHBhZGRpbmcKCX0KCW1heFcgKz0gZml4 OwoKCS8vIHJlc2l6ZSBjb250YWluZXIgdG8gZml0IG1vcmUgZGF0YSBpZiBwZXJt aXR0ZWQKCXZhciBub3JtVyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCByLnNl YXJjaGJveCApLm9mZnNldFdpZHRoOwoJdmFyIHByb3AgPSBtYXhXIC8gbm9ybVc7 CglpZiggcHJvcCA+IG9zX2NvbnRhaW5lcl9tYXhfd2lkdGggKSB7CgkJcHJvcCA9 IG9zX2NvbnRhaW5lcl9tYXhfd2lkdGg7Cgl9IGVsc2UgaWYoIHByb3AgPCAxICkg ewoJCXByb3AgPSAxOwoJfQoJdmFyIG5ld1cgPSBNYXRoLnJvdW5kKCBub3JtVyAq IHByb3AgKTsKCWlmKCB3ICE9IG5ld1cgKSB7CgkJdyA9IG5ld1c7CgkJaWYoIG9z X2FuaW1hdGlvbl90aW1lciAhPSBudWxsICkgewoJCQljbGVhckludGVydmFsKCBv c19hbmltYXRpb25fdGltZXIuaWQgKTsKCQl9CgkJb3NfYW5pbWF0aW9uX3RpbWVy ID0gbmV3IG9zX0FuaW1hdGlvblRpbWVyKCByLCB3ICk7CgkJb3NfYW5pbWF0aW9u X3RpbWVyLmlkID0gc2V0SW50ZXJ2YWwoICJvc19hbmltYXRlQ2hhbmdlV2lkdGgo KSIsIG9zX2FuaW1hdGlvbl9kZWxheSApOwoJCXcgLT0gZml4OyAvLyB0aGlzIG11 Y2ggaXMgcmVzZXJ2ZWQKCX0KCgkvLyB0cmltIHJlc3VsdHMKCWlmKCB3IDwgMTAg KSB7CgkJcmV0dXJuOwoJfQoJZm9yKCB2YXIgaSA9IDA7IGkgPCByLnJlc3VsdENv dW50OyBpKysgKSB7CgkJdmFyIGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgg ci5yZXN1bHRUZXh0ICsgaSApOwoJCXZhciByZXBsYWNlID0gMTsKCQl2YXIgbGFz dFcgPSBlLm9mZnNldFdpZHRoICsgMTsKCQl2YXIgaXRlcmF0aW9uID0gMDsKCQl2 YXIgY2hhbmdlZFRleHQgPSBmYWxzZTsKCQl3aGlsZSggZS5vZmZzZXRXaWR0aCA+ IHcgJiYgKCBlLm9mZnNldFdpZHRoIDwgbGFzdFcgfHwgaXRlcmF0aW9uIDwgMiAp ICkgewoJCQljaGFuZ2VkVGV4dCA9IHRydWU7CgkJCWxhc3RXID0gZS5vZmZzZXRX aWR0aDsKCQkJdmFyIGwgPSBlLmlubmVySFRNTDsKCQkJZS5pbm5lckhUTUwgPSBs LnN1YnN0cmluZyggMCwgbC5sZW5ndGggLSByZXBsYWNlICkgKyAnLi4uJzsKCQkJ aXRlcmF0aW9uKys7CgkJCXJlcGxhY2UgPSA0OyAvLyBob3cgbWFueSBjaGFycyB0 byByZXBsYWNlCgkJfQoJCWlmKCBjaGFuZ2VkVGV4dCApIHsKCQkJLy8gc2hvdyBo aW50IGZvciB0cmltbWVkIHRpdGxlcwoJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZCggci5yZXN1bHRUYWJsZSArIGkgKS5zZXRBdHRyaWJ1dGUoICd0aXRsZScsIHIu cmVzdWx0c1tpXSApOwoJCX0KCX0KfQoKLyoqIEludm9rZWQgb24gdGltZXIgdG8g YW5pbWF0ZSBjaGFuZ2UgaW4gY29udGFpbmVyIHdpZHRoICovCmZ1bmN0aW9uIG9z X2FuaW1hdGVDaGFuZ2VXaWR0aCgpIHsKCXZhciByID0gb3NfYW5pbWF0aW9uX3Rp bWVyLnI7Cgl2YXIgYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCByLmNvbnRh aW5lciApOwoJdmFyIHcgPSBjLm9mZnNldFdpZHRoOwoJdmFyIG5vcm1XID0gZG9j dW1lbnQuZ2V0RWxlbWVudEJ5SWQoIHIuc2VhcmNoYm94ICkub2Zmc2V0V2lkdGg7 Cgl2YXIgbm9ybUwgPSBvc19nZXRFbGVtZW50UG9zaXRpb24oIHIuc2VhcmNoYm94 ICkubGVmdDsKCXZhciBpbmMgPSBvc19hbmltYXRpb25fdGltZXIuaW5jOwoJdmFy IHRhcmdldCA9IG9zX2FuaW1hdGlvbl90aW1lci50YXJnZXQ7Cgl2YXIgbncgPSB3 ICsgaW5jOwoJaWYoICggaW5jID4gMCAmJiBudyA+PSB0YXJnZXQgKSB8fCAoIGlu YyA8PSAwICYmIG53IDw9IHRhcmdldCApICkgewoJCS8vIGZpbmlzaGVkICEKCQlj LnN0eWxlLndpZHRoID0gdGFyZ2V0ICsgJ3B4JzsKCQljbGVhckludGVydmFsKCBv c19hbmltYXRpb25fdGltZXIuaWQgKTsKCQlvc19hbmltYXRpb25fdGltZXIgPSBu dWxsOwoJfSBlbHNlIHsKCQkvLyBpbi1wcm9ncmVzcwoJCWMuc3R5bGUud2lkdGgg PSBudyArICdweCc7CgkJaWYoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kaXIg PT0gJ3J0bCcgKSB7CgkJCWMuc3R5bGUubGVmdCA9ICggbm9ybUwgKyBub3JtVyAr ICggdGFyZ2V0IC0gbncgKSAtIG9zX2FuaW1hdGlvbl90aW1lci50YXJnZXQgLSAx ICkgKyAncHgnOwoJCX0KCX0KfQoKLyoqIENoYW5nZSB0aGUgaGlnaGxpZ2h0ZWQg cm93IChpLmUuIHN1Z2dlc3Rpb24pLCBmcm9tIHBvc2l0aW9uIGN1ciB0byBuZXh0 ICovCmZ1bmN0aW9uIG9zX2NoYW5nZUhpZ2hsaWdodCggciwgY3VyLCBuZXh0LCB1 cGRhdGVTZWFyY2hCb3ggKSB7CglpZiAoIG5leHQgPj0gci5yZXN1bHRDb3VudCAp IHsKCQluZXh0ID0gci5yZXN1bHRDb3VudCAtIDE7Cgl9CglpZiAoIG5leHQgPCAt MSApIHsKCQluZXh0ID0gLTE7Cgl9CglyLnNlbGVjdGVkID0gbmV4dDsKCWlmICgg Y3VyID09IG5leHQgKSB7CgkJcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvLgoJfQoK CWlmKCBjdXIgPj0gMCApIHsKCQl2YXIgY3VyUm93ID0gZG9jdW1lbnQuZ2V0RWxl bWVudEJ5SWQoIHIucmVzdWx0VGFibGUgKyBjdXIgKTsKCQlpZiggY3VyUm93ICE9 IG51bGwgKSB7CgkJCWN1clJvdy5jbGFzc05hbWUgPSAnb3Mtc3VnZ2VzdC1yZXN1 bHQnOwoJCX0KCX0KCXZhciBuZXdUZXh0OwoJaWYoIG5leHQgPj0gMCApIHsKCQl2 YXIgbmV4dFJvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCByLnJlc3VsdFRh YmxlICsgbmV4dCApOwoJCWlmKCBuZXh0Um93ICE9IG51bGwgKSB7CgkJCW5leHRS b3cuY2xhc3NOYW1lID0gb3NfSGlnaGxpZ2h0Q2xhc3MoKTsKCQl9CgkJbmV3VGV4 dCA9IHIucmVzdWx0c1tuZXh0XTsKCX0gZWxzZSB7CgkJbmV3VGV4dCA9IHIub3Jp Z2luYWw7Cgl9CgoJLy8gYWRqdXN0IHRoZSBzY3JvbGxiYXIgaWYgYW55CglpZigg ci5jb250YWluZXJDb3VudCA8IHIucmVzdWx0Q291bnQgKSB7CgkJdmFyIGMgPSBk b2N1bWVudC5nZXRFbGVtZW50QnlJZCggci5jb250YWluZXIgKTsKCQl2YXIgdlN0 YXJ0ID0gYy5zY3JvbGxUb3AgLyByLmNvbnRhaW5lclJvdzsKCQl2YXIgdkVuZCA9 IHZTdGFydCArIHIuY29udGFpbmVyQ291bnQ7CgkJaWYoIG5leHQgPCB2U3RhcnQg KSB7CgkJCWMuc2Nyb2xsVG9wID0gbmV4dCAqIHIuY29udGFpbmVyUm93OwoJCX0g ZWxzZSBpZiggbmV4dCA+PSB2RW5kICkgewoJCQljLnNjcm9sbFRvcCA9ICggbmV4 dCAtIHIuY29udGFpbmVyQ291bnQgKyAxICkgKiByLmNvbnRhaW5lclJvdzsKCQl9 Cgl9CgoJLy8gdXBkYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgc2VhcmNoIGJveAoJ aWYoIHVwZGF0ZVNlYXJjaEJveCApIHsKCQlvc191cGRhdGVTZWFyY2hRdWVyeSgg ciwgbmV3VGV4dCApOwoJfQp9CgpmdW5jdGlvbiBvc19IaWdobGlnaHRDbGFzcygp IHsKCXZhciBtYXRjaCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxl V2ViS2l0XC8oXGQrKS8pOwoJaWYgKCBtYXRjaCApIHsKCQl2YXIgd2ViS2l0VmVy c2lvbiA9IHBhcnNlSW50KCBtYXRjaFsxXSApOwoJCWlmICggd2ViS2l0VmVyc2lv biA8IDUyMyApIHsKCQkJLy8gQ1NTIHN5c3RlbSBoaWdobGlnaHQgY29sb3JzIGJy b2tlbiBvbiBvbGQgU2FmYXJpCgkJCS8vIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn L3Nob3dfYnVnLmNnaT9pZD02MTI5CgkJCS8vIFNhZmFyaSAzLjAuNCwgMy4xIGtu b3duIG9rCgkJCXJldHVybiAnb3Mtc3VnZ2VzdC1yZXN1bHQtaGwtd2Via2l0JzsK CQl9Cgl9CglyZXR1cm4gJ29zLXN1Z2dlc3QtcmVzdWx0LWhsJzsKfQoKZnVuY3Rp b24gb3NfdXBkYXRlU2VhcmNoUXVlcnkoIHIsIG5ld1RleHQgKSB7Cglkb2N1bWVu dC5nZXRFbGVtZW50QnlJZCggci5zZWFyY2hib3ggKS52YWx1ZSA9IG5ld1RleHQ7 CglyLnF1ZXJ5ID0gbmV3VGV4dDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKgog KiAgTW91c2UgZXZlbnRzCiAqKioqKioqKioqKioqKioqKioqKi8KCi8qKiBNb3Vz ZSBvdmVyIHRoZSBjb250YWluZXIgKi8KZnVuY3Rpb24gb3NfZXZlbnRNb3VzZW92 ZXIoIHNyY0lkLCBlICkgewoJdmFyIHRhcmcgPSBvc19nZXRUYXJnZXQoIGUgKTsK CXZhciByID0gb3NfbWFwW3NyY0lkXTsKCWlmKCByID09IG51bGwgfHwgIW9zX21v dXNlX21vdmVkICkgewoJCXJldHVybjsgLy8gbm90IG91ciBldmVudAoJfQoJdmFy IG51bSA9IG9zX2dldE51bWJlclN1ZmZpeCggdGFyZy5pZCApOwoJaWYoIG51bSA+ PSAwICkgewoJCW9zX2NoYW5nZUhpZ2hsaWdodCggciwgci5zZWxlY3RlZCwgbnVt LCBmYWxzZSApOwoJfQp9CgovKiBHZXQgcm93IHdoZXJlIHRoZSBldmVudCBvY2N1 cmVkIChmcm9tIGl0cyBpZCkgKi8KZnVuY3Rpb24gb3NfZ2V0TnVtYmVyU3VmZml4 KCBpZCApIHsKCXZhciBudW0gPSBpZC5zdWJzdHJpbmcoIGlkLmxlbmd0aCAtIDIg KTsKCWlmKCAhKCBudW0uY2hhckF0KCAwICkgPj0gJzAnICYmIG51bS5jaGFyQXQo IDAgKSA8PSAnOScgKSApIHsKCQludW0gPSBudW0uc3Vic3RyaW5nKCAxICk7Cgl9 CglpZiggb3NfaXNOdW1iZXIoIG51bSApICkgewoJCXJldHVybiBwYXJzZUludCgg bnVtICk7Cgl9IGVsc2UgewoJCXJldHVybiAtMTsKCX0KfQoKLyoqIFNhdmUgbW91 c2UgbW92ZSBhcyBsYXN0IGFjdGlvbiAqLwpmdW5jdGlvbiBvc19ldmVudE1vdXNl bW92ZSggc3JjSWQsIGUgKSB7Cglvc19tb3VzZV9tb3ZlZCA9IHRydWU7Cn0KCi8q KiBNb3VzZSBidXR0b24gaGVsZCBkb3duLCByZWdpc3RlciBwb3NzaWJsZSBjbGlj ayAqLwpmdW5jdGlvbiBvc19ldmVudE1vdXNlZG93biggc3JjSWQsIGUgKSB7Cgl2 YXIgdGFyZyA9IG9zX2dldFRhcmdldCggZSApOwoJdmFyIHIgPSBvc19tYXBbc3Jj SWRdOwoJaWYoIHIgPT0gbnVsbCApIHsKCQlyZXR1cm47IC8vIG5vdCBvdXIgZXZl bnQKCX0KCXZhciBudW0gPSBvc19nZXROdW1iZXJTdWZmaXgoIHRhcmcuaWQgKTsK Cglvc19tb3VzZV9wcmVzc2VkID0gdHJ1ZTsKCWlmKCBudW0gPj0gMCApIHsKCQlv c19tb3VzZV9udW0gPSBudW07CgkJLy8gb3NfdXBkYXRlU2VhcmNoUXVlcnkoIHIs IHIucmVzdWx0c1tudW1dICk7Cgl9CgkvLyBrZWVwIHRoZSBmb2N1cyBvbiB0aGUg c2VhcmNoIGZpZWxkCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggci5zZWFyY2hi b3ggKS5mb2N1cygpOwoKCXJldHVybiBmYWxzZTsgLy8gcHJldmVudHMgc2VsZWN0 aW9uCn0KCi8qKiBNb3VzZSBidXR0b24gcmVsZWFzZWQsIGNoZWNrIGZvciBjbGlj ayBvbiBzb21lIHJvdyAqLwpmdW5jdGlvbiBvc19ldmVudE1vdXNldXAoIHNyY0lk LCBlICkgewoJdmFyIHRhcmcgPSBvc19nZXRUYXJnZXQoIGUgKTsKCXZhciByID0g b3NfbWFwW3NyY0lkXTsKCWlmKCByID09IG51bGwgKSB7CgkJcmV0dXJuOyAvLyBu b3Qgb3VyIGV2ZW50Cgl9Cgl2YXIgbnVtID0gb3NfZ2V0TnVtYmVyU3VmZml4KCB0 YXJnLmlkICk7CgoJaWYoIG51bSA+PSAwICYmIG9zX21vdXNlX251bSA9PSBudW0g KSB7CgkJb3NfdXBkYXRlU2VhcmNoUXVlcnkoIHIsIHIucmVzdWx0c1tudW1dICk7 CgkJb3NfaGlkZVJlc3VsdHMoIHIgKTsKCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJ ZCggci5zZWFyY2hmb3JtICkuc3VibWl0KCk7Cgl9Cglvc19tb3VzZV9wcmVzc2Vk ID0gZmFsc2U7CgkvLyBrZWVwIHRoZSBmb2N1cyBvbiB0aGUgc2VhcmNoIGZpZWxk Cglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggci5zZWFyY2hib3ggKS5mb2N1cygp Owp9CgovKiogVG9nZ2xlIHN0dWZmIHNlZW1zIHRvIGJlIGRlYWQgY29kZT8gKi8K Ci8qKiBSZXR1cm4gdGhlIHNwYW4gZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSB0 b2dnbGUgbGluayAqLwpmdW5jdGlvbiBvc19jcmVhdGVUb2dnbGUoIHIsIGNsYXNz TmFtZSApIHsKCXZhciB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ3NwYW4n ICk7Cgl0LmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKCXQuc2V0QXR0cmlidXRlKCAn aWQnLCByLnRvZ2dsZSApOwoJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVt ZW50KCAnYScgKTsKCWxpbmsuc2V0QXR0cmlidXRlKCAnaHJlZicsICdqYXZhc2Ny aXB0OnZvaWQoMCk7JyApOwoJbGluay5vbmNsaWNrID0gZnVuY3Rpb24oKSB7IG9z X3RvZ2dsZSggci5zZWFyY2hib3gsIHIuc2VhcmNoZm9ybSApOyB9OwoJdmFyIG1z ZyA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCB3Z01XU3VnZ2VzdE1lc3NhZ2Vz WzBdICk7CglsaW5rLmFwcGVuZENoaWxkKCBtc2cgKTsKCXQuYXBwZW5kQ2hpbGQo IGxpbmsgKTsKCXJldHVybiB0Owp9CgovKiogQ2FsbCB3aGVuIHVzZXIgY2xpY2tz IG9uIHNvbWUgb2YgdGhlIHRvZ2dsZSBsaW5rcyAqLwpmdW5jdGlvbiBvc190b2dn bGUoIGlucHV0SWQsIGZvcm1OYW1lICkgewoJciA9IG9zX21hcFtpbnB1dElkXTsK CXZhciBtc2cgPSAnJzsKCWlmKCByID09IG51bGwgKSB7CgkJb3NfZW5hYmxlU3Vn Z2VzdGlvbnNPbiggaW5wdXRJZCwgZm9ybU5hbWUgKTsKCQlyID0gb3NfbWFwW2lu cHV0SWRdOwoJCW1zZyA9IHdnTVdTdWdnZXN0TWVzc2FnZXNbMF07Cgl9IGVsc2V7 CgkJb3NfZGlzYWJsZVN1Z2dlc3Rpb25zT24oIGlucHV0SWQsIGZvcm1OYW1lICk7 CgkJbXNnID0gd2dNV1N1Z2dlc3RNZXNzYWdlc1sxXTsKCX0KCS8vIGNoYW5nZSBt ZXNzYWdlCgl2YXIgbGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCByLnRv Z2dsZSApLmZpcnN0Q2hpbGQ7CglsaW5rLnJlcGxhY2VDaGlsZCggZG9jdW1lbnQu Y3JlYXRlVGV4dE5vZGUoIG1zZyApLCBsaW5rLmZpcnN0Q2hpbGQgKTsKfQoKaG9v a0V2ZW50KCAnbG9hZCcsIG9zX01XU3VnZ2VzdEluaXQgKTsK ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=MobileRedirect.js Content-Type: application/x-javascript; name=MobileRedirect.js Content-Location: http://bits.wikimedia.org/w/extensions/WikimediaMobile/MobileRedirect.js?2.2 Content-Transfer-Encoding: Base64 LyoqIE1vYmlsZSBSZWRpcmVjdCBIZWxwZXIKICoKICogIFJlZGlyZWN0cyB0byBh IHdpa2ltZWRpYS1tb2JpbGUgaW5zdGFsbGF0aW9uIGZvciB2aWV3ZXJzIG9uIGlQ aG9uZSwgaVBvZCAKICogIFRvdWNoLCBQYWxtIFByZSwgYW5kIEFuZHJvaWQgZGV2 aWNlcy4KICoKICogIFlvdSBjYW4gdHVybiBvZmYgdGhlIHJlZGlyZWN0IGJ5IHNl dHRpbmcgdGhlIGNvb2tpZSAic3RvcE1vYmlsZVJlZGlyZWN0PXRydWUiCiAqLwpp ZiAoIC8oQW5kcm9pZHxpUGhvbmV8aVBvZHx3ZWJPU3xOZXRGcm9udHxPcGVyYSBN aW5pfFNFTUMtQnJvd3NlcnxQbGF5U3RhdGlvbiBQb3J0YWJsZXxOaW50ZW5kbyBX aWl8QmxhY2tCZXJyeSkvCgkudGVzdCggbmF2aWdhdG9yLnVzZXJBZ2VudCApICkK ewoJKGZ1bmN0aW9uICgpIHsKCQlmdW5jdGlvbiBoYXZlU3RvcENvb2tpZSgpIHsK CQkJcmV0dXJuIChkb2N1bWVudC5jb29raWUuaW5kZXhPZigic3RvcE1vYmlsZVJl ZGlyZWN0PXRydWUiKSA+PSAwKTsKCQl9CgoJCWZ1bmN0aW9uIGdldE1vYmlsZVVy bCgpIHsKCQkJdmFyIG1haW5QYWdlID0gd2dNYWluUGFnZVRpdGxlLnJlcGxhY2Uo LyAvZywgJ18nKTsKCQkJdmFyIHVybCA9IHdnV2lraW1lZGlhTW9iaWxlVXJsICsg Jy8nOwoJCQlpZiAod2dQYWdlTmFtZSA9PSBtYWluUGFnZSkgewoJCQkJdXJsICs9 ICc6OkhvbWUnOyAvLyBTcGVjaWFsIGNhc2UKCQkJfSBlbHNlIHsKCQkJCXVybCAr PSBlbmNvZGVVUklDb21wb25lbnQod2dQYWdlTmFtZSkucmVwbGFjZSgnJTJGJywn LycpLnJlcGxhY2UoJyUzQScsJzonKTsKCQkJfQoJCQl1cmwgKz0gJz93YXNSZWRp cmVjdGVkPXRydWUnOwoJCQlyZXR1cm4gdXJsOwoJCX0KCgkJLy8gRG9uJ3QgcmVk aXJlY3QgaWYgd2UgaGF2ZSB0aGUgc3RvcCBjb29raWUKCQlpZiAoaGF2ZVN0b3BD b29raWUoKSkgcmV0dXJuOwoKCQkvLyBEb24ndCByZWRpcmVjdCBzcGVjaWFsIHBh Z2VzCgkJaWYgKHdnTmFtZXNwYWNlTnVtYmVyIDwgMCkgcmV0dXJuOwoKCQkvLyBE b24ndCByZWRpcmVjdCBVUkxzIHRoYXQgYXJlbid0IHNpbXBsZSBwYWdlIHZpZXdz CgkJaWYgKGRvY3VtZW50LmxvY2F0aW9uLnNlYXJjaCAmJiBkb2N1bWVudC5sb2Nh dGlvbi5zZWFyY2gubGVuZ3RoID4gMCkgewoJCQl2YXIgcGFyYW1zID0gZG9jdW1l bnQubG9jYXRpb24uc2VhcmNoLnN1YnN0cigxKS5zcGxpdCgnJicpOwoJCQlmb3Ig KHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewoJCQkJdmFyIHBh cmFtUGFydHMgPSBwYXJhbXNbaV0uc3BsaXQoJz0nKTsKCQkJCWlmIChwYXJhbVBh cnRzLmxlbmd0aCAmJiBwYXJhbVBhcnRzWzBdICE9ICd0aXRsZScpIHsKCQkJCQly ZXR1cm47CgkJCQl9CgkJCX0KCQl9CgoJCWRvY3VtZW50LmxvY2F0aW9uID0gZ2V0 TW9iaWxlVXJsKCk7Cgl9KSgpOwp9Cg== ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=plugins.combined.min.js Content-Type: application/x-javascript; name=plugins.combined.min.js Content-Location: http://bits.wikimedia.org/w/extensions/UsabilityInitiative/js/plugins.combined.min.js?283-17 Content-Transfer-Encoding: Base64 CmlmKHR5cGVvZiBtdz09J3VuZGVmaW5lZCcpe213PXt9O30KbXcudXNhYmlsaXR5 PXsnbWVzc2FnZXMnOnt9fQptdy51c2FiaWxpdHkubG9hZD1mdW5jdGlvbihkZXBz LGNhbGxiYWNrKXt2YXIgbmVlZEpVST1mYWxzZTtmb3IodmFyIGk9MDtpPGRlcHMu bGVuZ3RoJiYhbmVlZEpVSTtpKyspe2lmKGRlcHNbaV09PSckai51aScpe25lZWRK VUk9dHJ1ZTt9fQppZihuZWVkSlVJJiZ0eXBlb2YgJGoudWk9PSd1bmRlZmluZWQn KXskai5nZXRTY3JpcHQod2dTY3JpcHRQYXRoKycvZXh0ZW5zaW9ucy9Vc2FiaWxp dHlJbml0aWF0aXZlL2pzL2pzMnN0b3BnYXAvanVpLmNvbWJpbmVkLm1pbi5qcycs Y2FsbGJhY2spO31lbHNle2NhbGxiYWNrKCk7fX07bXcudXNhYmlsaXR5LmFkZE1l c3NhZ2VzPWZ1bmN0aW9uKG1lc3NhZ2VzKXtmb3IodmFyIGtleSBpbiBtZXNzYWdl cyl7dGhpcy5tZXNzYWdlc1trZXldPW1lc3NhZ2VzW2tleV07fX07bXcudXNhYmls aXR5LmdldE1zZz1mdW5jdGlvbihrZXksYXJncyl7aWYoIShrZXkgaW4gdGhpcy5t ZXNzYWdlcykpe3JldHVybidbJytrZXkrJ10nO30KdmFyIG1zZz10aGlzLm1lc3Nh Z2VzW2tleV07aWYodHlwZW9mIGFyZ3M9PSdvYmplY3QnfHx0eXBlb2YgYXJncz09 J2FycmF5Jyl7Zm9yKHZhciBhcmdLZXkgaW4gYXJncyl7bXNnPW1zZy5yZXBsYWNl KCdcJCcrKHBhcnNlSW50KGFyZ0tleSkrMSksYXJnc1thcmdLZXldKTt9fWVsc2Ug aWYodHlwZW9mIGFyZ3M9PSdzdHJpbmcnfHx0eXBlb2YgYXJncz09J251bWJlcicp e21zZz1tc2cucmVwbGFjZSgnJDEnLGFyZ3MpO30KcmV0dXJuIG1zZzt9O213LnVz YWJpbGl0eS50ZXN0QnJvd3Nlcj1mdW5jdGlvbihtYXApe3ZhciBicm93c2VyPW1h cFskaignYm9keScpLmlzKCcucnRsJyk/J3J0bCc6J2x0ciddWyRqLmJyb3dzZXIu bmFtZV07aWYodHlwZW9mIGJyb3dzZXI9PSdib29sZWFuJyl7cmV0dXJuIGJyb3dz ZXI7fQppZih0eXBlb2YgYnJvd3NlciE9PSdvYmplY3QnKXtyZXR1cm4gdHJ1ZTt9 CmZvcih2YXIgY29uZGl0aW9uIGluIGJyb3dzZXIpe3ZhciBvcD1icm93c2VyW2Nv bmRpdGlvbl1bMF07dmFyIHZhbD1icm93c2VyW2NvbmRpdGlvbl1bMV07aWYodmFs PT09ZmFsc2Upe3JldHVybiBmYWxzZTt9ZWxzZSBpZih0eXBlb2YgdmFsPT0nc3Ry aW5nJyl7aWYoIShldmFsKCckai5icm93c2VyLnZlcnNpb24nK29wKyciJyt2YWwr JyInKSkpe3JldHVybiBmYWxzZTt9fWVsc2UgaWYodHlwZW9mIHZhbD09J251bWJl cicpe2lmKCEoZXZhbCgnJGouYnJvd3Nlci52ZXJzaW9uTnVtYmVyJytvcCt2YWwp KSl7cmV0dXJuIGZhbHNlO319fQpyZXR1cm4gdHJ1ZTt9O213LnVzYWJpbGl0eS5n ZXRNYXhUYWJJbmRleD1mdW5jdGlvbigpe3ZhciBtYXhUST0wOyRqKCdbdGFiaW5k ZXhdJykuZWFjaChmdW5jdGlvbigpe3ZhciB0aT1wYXJzZUludCgkaih0aGlzKS5h dHRyKCd0YWJpbmRleCcpKTtpZih0aT5tYXhUSSl7bWF4VEk9dGk7fX0pO3JldHVy biBtYXhUSTt9OyhmdW5jdGlvbigkKXskLndoaWxlQXN5bmM9ZnVuY3Rpb24ob3B0 cykKe3ZhciBkZWxheT1NYXRoLmFicyhvcHRzLmRlbGF5KXx8MTAsYnVsaz1pc05h TihvcHRzLmJ1bGspPzUwMDpNYXRoLmFicyhvcHRzLmJ1bGspLHRlc3Q9b3B0cy50 ZXN0fHxmdW5jdGlvbigpe3JldHVybiB0cnVlO30sbG9vcD1vcHRzLmxvb3B8fGZ1 bmN0aW9uKCl7fSxlbmQ9b3B0cy5lbmR8fGZ1bmN0aW9uKCl7fTsoZnVuY3Rpb24o KXt2YXIgdD1mYWxzZSxiZWdpbj1uZXcgRGF0ZSgpO3doaWxlKHQ9dGVzdCgpKQp7 bG9vcCgpO2lmKGJ1bGs9PT0wfHwobmV3IERhdGUoKS1iZWdpbik+YnVsaykKe2Jy ZWFrO319CmlmKHQpCntzZXRUaW1lb3V0KGFyZ3VtZW50cy5jYWxsZWUsZGVsYXkp O30KZWxzZQp7ZW5kKCk7fX0pKCk7fQokLmVhY2hBc3luYz1mdW5jdGlvbihhcnJh eSxvcHRzKQp7dmFyIGk9MCxsPWFycmF5Lmxlbmd0aCxsb29wPW9wdHMubG9vcHx8 ZnVuY3Rpb24oKXt9OyQud2hpbGVBc3luYygkLmV4dGVuZChvcHRzLHt0ZXN0OmZ1 bmN0aW9uKCl7cmV0dXJuIGk8bDt9LGxvb3A6ZnVuY3Rpb24oKQp7dmFyIHZhbD1h cnJheVtpXTtyZXR1cm4gbG9vcC5jYWxsKHZhbCxpKyssdmFsKTt9fSkpO30KJC5m bi5lYWNoQXN5bmM9ZnVuY3Rpb24ob3B0cykKeyQuZWFjaEFzeW5jKHRoaXMsb3B0 cyk7cmV0dXJuIHRoaXM7fX0pKGpRdWVyeSk7KGZ1bmN0aW9uKCQpe3ZhciBjYWNo ZT17fTt2YXIgbWF0Y2hUZXh0Q2FjaGU9e307JC5mbi5hdXRvRWxsaXBzaXM9ZnVu Y3Rpb24ob3B0aW9ucyl7b3B0aW9ucz0kLmV4dGVuZCh7J3Bvc2l0aW9uJzonY2Vu dGVyJywndG9vbHRpcCc6ZmFsc2UsJ3Jlc3RvcmVUZXh0JzpmYWxzZSwnaGFzU3Bh bic6ZmFsc2UsJ21hdGNoVGV4dCc6bnVsbH0sb3B0aW9ucyk7JCh0aGlzKS5lYWNo KGZ1bmN0aW9uKCl7dmFyICR0aGlzPSQodGhpcyk7aWYob3B0aW9ucy5yZXN0b3Jl VGV4dCl7aWYoISR0aGlzLmRhdGEoJ2F1dG9FbGxpcHNpcy5vcmlnaW5hbFRleHQn KSl7JHRoaXMuZGF0YSgnYXV0b0VsbGlwc2lzLm9yaWdpbmFsVGV4dCcsJHRoaXMu dGV4dCgpKTt9ZWxzZXskdGhpcy50ZXh0KCR0aGlzLmRhdGEoJ2F1dG9FbGxpcHNp cy5vcmlnaW5hbFRleHQnKSk7fX0KdmFyICRjb250YWluZXI9JHRoaXM7dmFyICR0 cmltbWFibGVUZXh0PW51bGw7dmFyICRwcm90ZWN0ZWRUZXh0PW51bGw7aWYob3B0 aW9ucy5oYXNTcGFuKXskdHJpbW1hYmxlVGV4dD0kdGhpcy5jaGlsZHJlbihvcHRp b25zLnNlbGVjdG9yKTt9ZWxzZXskdHJpbW1hYmxlVGV4dD0kKCc8c3BhbiAvPicp LmNzcygnd2hpdGVTcGFjZScsJ25vd3JhcCcpLnRleHQoJHRoaXMudGV4dCgpKTsk dGhpcy5lbXB0eSgpLmFwcGVuZCgkdHJpbW1hYmxlVGV4dCk7fQp2YXIgdGV4dD0k Y29udGFpbmVyLnRleHQoKTt2YXIgdHJpbW1hYmxlVGV4dD0kdHJpbW1hYmxlVGV4 dC50ZXh0KCk7dmFyIHc9JGNvbnRhaW5lci53aWR0aCgpO3ZhciBwdz0kcHJvdGVj dGVkVGV4dD8kcHJvdGVjdGVkVGV4dC53aWR0aCgpOjA7aWYoISh0ZXh0IGluIGNh Y2hlKSl7Y2FjaGVbdGV4dF09e307fQppZihvcHRpb25zLm1hdGNoVGV4dCYmISh0 ZXh0IGluIG1hdGNoVGV4dENhY2hlKSl7bWF0Y2hUZXh0Q2FjaGVbdGV4dF09e307 fQppZihvcHRpb25zLm1hdGNoVGV4dCYmIShvcHRpb25zLm1hdGNoVGV4dCBpbiBt YXRjaFRleHRDYWNoZVt0ZXh0XSkpe21hdGNoVGV4dENhY2hlW3RleHRdW29wdGlv bnMubWF0Y2hUZXh0XT17fTt9CmlmKCFvcHRpb25zLm1hdGNoVGV4dCYmdyBpbiBj YWNoZVt0ZXh0XSl7JGNvbnRhaW5lci5odG1sKGNhY2hlW3RleHRdW3ddKTtpZihv cHRpb25zLnRvb2x0aXApCiRjb250YWluZXIuYXR0cigndGl0bGUnLHRleHQpO3Jl dHVybjt9CmlmKG9wdGlvbnMubWF0Y2hUZXh0JiZvcHRpb25zLm1hdGNoVGV4dCBp biBtYXRjaFRleHRDYWNoZVt0ZXh0XSYmdyBpbiBtYXRjaFRleHRDYWNoZVt0ZXh0 XVtvcHRpb25zLm1hdGNoVGV4dF0peyRjb250YWluZXIuaHRtbChtYXRjaFRleHRD YWNoZVt0ZXh0XVtvcHRpb25zLm1hdGNoVGV4dF1bd10pO2lmKG9wdGlvbnMudG9v bHRpcCkKJGNvbnRhaW5lci5hdHRyKCd0aXRsZScsdGV4dCk7cmV0dXJuO30KaWYo JHRyaW1tYWJsZVRleHQud2lkdGgoKStwdz53KXtzd2l0Y2gob3B0aW9ucy5wb3Np dGlvbil7Y2FzZSdyaWdodCc6dmFyIGw9MCxyPXRyaW1tYWJsZVRleHQubGVuZ3Ro O2Rve3ZhciBtPU1hdGguY2VpbCgobCtyKS8yKTskdHJpbW1hYmxlVGV4dC50ZXh0 KHRyaW1tYWJsZVRleHQuc3Vic3RyKDAsbSkrJy4uLicpO2lmKCR0cmltbWFibGVU ZXh0LndpZHRoKCkrcHc+dyl7cj1tLTE7fWVsc2V7bD1tO319d2hpbGUobDxyKTsk dHJpbW1hYmxlVGV4dC50ZXh0KHRyaW1tYWJsZVRleHQuc3Vic3RyKDAsbCkrJy4u LicpO2JyZWFrO2Nhc2UnY2VudGVyJzp2YXIgaT1bTWF0aC5yb3VuZCh0cmltbWFi bGVUZXh0Lmxlbmd0aC8yKSxNYXRoLnJvdW5kKHRyaW1tYWJsZVRleHQubGVuZ3Ro LzIpXTt2YXIgc2lkZT0xO3doaWxlKCR0cmltbWFibGVUZXh0Lm91dGVyV2lkdGgo KStwdz53JiZpWzBdPjApeyR0cmltbWFibGVUZXh0LnRleHQodHJpbW1hYmxlVGV4 dC5zdWJzdHIoMCxpWzBdKSsnLi4uJyt0cmltbWFibGVUZXh0LnN1YnN0cihpWzFd KSk7aWYoc2lkZT09MCl7aVswXS0tO3NpZGU9MTt9ZWxzZXtpWzFdKys7c2lkZT0w O319CmJyZWFrO2Nhc2UnbGVmdCc6dmFyIHI9MDt3aGlsZSgkdHJpbW1hYmxlVGV4 dC5vdXRlcldpZHRoKCkrcHc+dyYmcjx0cmltbWFibGVUZXh0Lmxlbmd0aCl7JHRy aW1tYWJsZVRleHQudGV4dCgnLi4uJyt0cmltbWFibGVUZXh0LnN1YnN0cihyKSk7 cisrO30KYnJlYWs7fX0KaWYob3B0aW9ucy50b29sdGlwKXskY29udGFpbmVyLmF0 dHIoJ3RpdGxlJyx0ZXh0KTt9CmlmKG9wdGlvbnMubWF0Y2hUZXh0KXskY29udGFp bmVyLmhpZ2hsaWdodFRleHQob3B0aW9ucy5tYXRjaFRleHQpO21hdGNoVGV4dENh Y2hlW3RleHRdW29wdGlvbnMubWF0Y2hUZXh0XVt3XT0kY29udGFpbmVyLmh0bWwo KTt9ZWxzZXtjYWNoZVt0ZXh0XVt3XT0kY29udGFpbmVyLmh0bWwoKTt9fSk7fTt9 KShqUXVlcnkpOyhmdW5jdGlvbigkKXskLmJyb3dzZXJUZXN0PWZ1bmN0aW9uKGEs eil7dmFyIHU9J3Vua25vd24nLHg9J1gnLG09ZnVuY3Rpb24ocixoKXtmb3IodmFy IGk9MDtpPGgubGVuZ3RoO2k9aSsxKXtyPXIucmVwbGFjZShoW2ldWzBdLGhbaV1b MV0pO30KcmV0dXJuIHI7fSxjPWZ1bmN0aW9uKGksYSxiLGMpe3ZhciByPXtuYW1l Om0oKGEuZXhlYyhpKXx8W3UsdV0pWzFdLGIpfTtyW3IubmFtZV09dHJ1ZTtyLnZl cnNpb249KGMuZXhlYyhpKXx8W3gseCx4LHhdKVszXTtpZihyLm5hbWUubWF0Y2go L3NhZmFyaS8pJiZyLnZlcnNpb24+NDAwKXtyLnZlcnNpb249JzIuMCc7fQppZihy Lm5hbWU9PT0ncHJlc3RvJyl7ci52ZXJzaW9uPSgkLmJyb3dzZXIudmVyc2lvbj45 LjI3KT8nZnV0aGFyayc6J2xpbmVhcl9iJzt9CmlmKHIubmFtZT09PSdvcGVyYScm JiQuYnJvd3Nlci52ZXJzaW9uPj05Ljgpe3IudmVyc2lvbj1pLm1hdGNoKC92ZXJz aW9uXC8oWzAtOVwuXSopL2kpWzFdfHwxMDt9CnIudmVyc2lvbk51bWJlcj1wYXJz ZUZsb2F0KHIudmVyc2lvbiwxMCl8fDA7ci52ZXJzaW9uWD0oci52ZXJzaW9uIT09 eCk/KHIudmVyc2lvbisnJykuc3Vic3RyKDAsMSk6eDtyLmNsYXNzTmFtZT1yLm5h bWUrci52ZXJzaW9uWDtyZXR1cm4gcjt9O2E9KGEubWF0Y2goL09wZXJhfE5hdmln YXRvcnxNaW5lZmllbGR8S0hUTUx8Q2hyb21lfFBMQVlTVEFUSU9OIDMvKT9tKGEs W1svKEZpcmVmb3h8TVNJRXxLSFRNTCxcc2xpa2Vcc0dlY2tvfEtvbnF1ZXJvcikv LCcnXSxbJ0Nocm9tZSBTYWZhcmknLCdDaHJvbWUnXSxbJ0tIVE1MJywnS29ucXVl cm9yJ10sWydNaW5lZmllbGQnLCdGaXJlZm94J10sWydOYXZpZ2F0b3InLCdOZXRz Y2FwZSddLFsnUExBWVNUQVRJT04gMycsJ1BTMyddXSk6YSkudG9Mb3dlckNhc2Uo KTskLmJyb3dzZXI9JC5leHRlbmQoKCF6KT8kLmJyb3dzZXI6e30sYyhhLC8oY2Ft aW5vfGNocm9tZXxmaXJlZm94fG5ldHNjYXBlfGtvbnF1ZXJvcnxseW54fG1zaWV8 b3BlcmF8c2FmYXJpfGlwb2R8aXBob25lfGJsYWNrYmVycnl8cHMzfGRvY29tbykv LFtdLC8oY2FtaW5vfGNocm9tZXxmaXJlZm94fG5ldHNjYXBlfG5ldHNjYXBlNnxv cGVyYXx2ZXJzaW9ufGtvbnF1ZXJvcnxseW54fG1zaWV8c2FmYXJpfHBzMykoXC98 XDs/XHN8KShbYS16MC05XC5cK10qPykoXDt8ZGV2fHJlbHxcKXxcc3wkKS8pKTsk LmxheW91dD1jKGEsLyhnZWNrb3xrb25xdWVyb3J8bXNpZXxvcGVyYXx3ZWJraXQp LyxbWydrb25xdWVyb3InLCdraHRtbCddLFsnbXNpZScsJ3RyaWRlbnQnXSxbJ29w ZXJhJywncHJlc3RvJ11dLC8oYXBwbGV3ZWJraXR8cnZ8a29ucXVlcm9yfG1zaWUp KFw6fFwvfFxzKShbYS16MC05XC5dKj8pKFw7fFwpfFxzKS8pOyQub3M9e25hbWU6 KC8od2lufG1hY3xsaW51eHxzdW5vc3xzb2xhcmlzfGlwaG9uZSkvLmV4ZWMobmF2 aWdhdG9yLnBsYXRmb3JtLnRvTG93ZXJDYXNlKCkpfHxbdV0pWzBdLnJlcGxhY2Uo J3N1bm9zJywnc29sYXJpcycpfTtpZigheil7JCgnaHRtbCcpLmFkZENsYXNzKFsk Lm9zLm5hbWUsJC5icm93c2VyLm5hbWUsJC5icm93c2VyLmNsYXNzTmFtZSwkLmxh eW91dC5uYW1lLCQubGF5b3V0LmNsYXNzTmFtZV0uam9pbignICcpKTt9fTskLmJy b3dzZXJUZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO30pKGpRdWVyeSk7KGZ1bmN0 aW9uKCQpeyQuZm4uY29sbGFwc2libGVUYWJzPWZ1bmN0aW9uKCQkb3B0aW9ucyl7 aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO3ZhciAkc2V0dGluZ3M9JC5leHRl bmQoe30sJC5jb2xsYXBzaWJsZVRhYnMuZGVmYXVsdHMsJCRvcHRpb25zKTt0aGlz LmVhY2goZnVuY3Rpb24oKXt2YXIgJHRoaXM9JCh0aGlzKTskLmNvbGxhcHNpYmxl VGFicy5pbnN0YW5jZXM9KCQuY29sbGFwc2libGVUYWJzLmluc3RhbmNlcy5sZW5n dGg9PTA/JHRoaXM6JC5jb2xsYXBzaWJsZVRhYnMuaW5zdGFuY2VzLmFkZCgkdGhp cykpOyR0aGlzLmRhdGEoJ2NvbGxhcHNpYmxlVGFic1NldHRpbmdzJywkc2V0dGlu Z3MpOyR0aGlzLmNoaWxkcmVuKCRzZXR0aW5ncy5jb2xsYXBzaWJsZSkuZWFjaChm dW5jdGlvbigpeyQuY29sbGFwc2libGVUYWJzLmFkZERhdGEoJCh0aGlzKSk7fSk7 fSk7aWYoISQuY29sbGFwc2libGVUYWJzLmJvdW5kRXZlbnQpeyQod2luZG93KS5k ZWxheWVkQmluZCgnNTAwJywncmVzaXplJyxmdW5jdGlvbigpeyQuY29sbGFwc2li bGVUYWJzLmhhbmRsZVJlc2l6ZSgpO30pO30KJC5jb2xsYXBzaWJsZVRhYnMuaGFu ZGxlUmVzaXplKCk7cmV0dXJuIHRoaXM7fTskLmNvbGxhcHNpYmxlVGFicz17aW5z dGFuY2VzOltdLGJvdW5kRXZlbnQ6bnVsbCxkZWZhdWx0czp7ZXhwYW5kZWRDb250 YWluZXI6JyNwLXZpZXdzIHVsJyxjb2xsYXBzZWRDb250YWluZXI6JyNwLWNhY3Rp b25zIHVsJyxjb2xsYXBzaWJsZTonbGkuY29sbGFwc2libGUnLHNoaWZ0aW5nOmZh bHNlLGV4cGFuZENvbmRpdGlvbjpmdW5jdGlvbihlbGVXaWR0aCl7cmV0dXJuKCQo JyNsZWZ0LW5hdmlnYXRpb24nKS5wb3NpdGlvbigpLmxlZnQrJCgnI2xlZnQtbmF2 aWdhdGlvbicpLndpZHRoKCkpPCgkKCcjcmlnaHQtbmF2aWdhdGlvbicpLnBvc2l0 aW9uKCkubGVmdC1lbGVXaWR0aCk7fSxjb2xsYXBzZUNvbmRpdGlvbjpmdW5jdGlv bigpe3JldHVybigkKCcjbGVmdC1uYXZpZ2F0aW9uJykucG9zaXRpb24oKS5sZWZ0 KyQoJyNsZWZ0LW5hdmlnYXRpb24nKS53aWR0aCgpKT4kKCcjcmlnaHQtbmF2aWdh dGlvbicpLnBvc2l0aW9uKCkubGVmdDt9fSxhZGREYXRhOmZ1bmN0aW9uKCRjb2xs YXBzaWJsZSl7dmFyICRzZXR0aW5ncz0kY29sbGFwc2libGUucGFyZW50KCkuZGF0 YSgnY29sbGFwc2libGVUYWJzU2V0dGluZ3MnKTskY29sbGFwc2libGUuZGF0YSgn Y29sbGFwc2libGVUYWJzU2V0dGluZ3MnLHsnZXhwYW5kZWRDb250YWluZXInOiRz ZXR0aW5ncy5leHBhbmRlZENvbnRhaW5lciwnY29sbGFwc2VkQ29udGFpbmVyJzok c2V0dGluZ3MuY29sbGFwc2VkQ29udGFpbmVyLCdleHBhbmRlZFdpZHRoJzokY29s bGFwc2libGUud2lkdGgoKSwncHJldkVsZW1lbnQnOiRjb2xsYXBzaWJsZS5wcmV2 KCl9KTt9LGdldFNldHRpbmdzOmZ1bmN0aW9uKCRjb2xsYXBzaWJsZSl7dmFyICRz ZXR0aW5ncz0kY29sbGFwc2libGUuZGF0YSgnY29sbGFwc2libGVUYWJzU2V0dGlu Z3MnKTtpZih0eXBlb2YgJHNldHRpbmdzPT0ndW5kZWZpbmVkJyl7JC5jb2xsYXBz aWJsZVRhYnMuYWRkRGF0YSgkY29sbGFwc2libGUpOyRzZXR0aW5ncz0kY29sbGFw c2libGUuZGF0YSgnY29sbGFwc2libGVUYWJzU2V0dGluZ3MnKTt9CnJldHVybiAk c2V0dGluZ3M7fSxoYW5kbGVSZXNpemU6ZnVuY3Rpb24oZSl7JC5jb2xsYXBzaWJs ZVRhYnMuaW5zdGFuY2VzLmVhY2goZnVuY3Rpb24oKXt2YXIgJHRoaXM9JCh0aGlz KSxkYXRhPSQuY29sbGFwc2libGVUYWJzLmdldFNldHRpbmdzKCR0aGlzKTtpZihk YXRhLnNoaWZ0aW5nKXJldHVybjtpZigkdGhpcy5jaGlsZHJlbihkYXRhLmNvbGxh cHNpYmxlKS5sZW5ndGg+MCYmZGF0YS5jb2xsYXBzZUNvbmRpdGlvbigpKXskdGhp cy50cmlnZ2VyKCJiZWZvcmVUYWJDb2xsYXBzZSIpOyQuY29sbGFwc2libGVUYWJz Lm1vdmVUb0NvbGxhcHNlZCgkdGhpcy5jaGlsZHJlbihkYXRhLmNvbGxhcHNpYmxl Kyc6bGFzdCcpKTt9CmlmKCQoZGF0YS5jb2xsYXBzZWRDb250YWluZXIrJyAnK2Rh dGEuY29sbGFwc2libGUpLmxlbmd0aD4wJiZkYXRhLmV4cGFuZENvbmRpdGlvbigk LmNvbGxhcHNpYmxlVGFicy5nZXRTZXR0aW5ncygkKGRhdGEuY29sbGFwc2VkQ29u dGFpbmVyKS5jaGlsZHJlbihkYXRhLmNvbGxhcHNpYmxlKyI6Zmlyc3QiKSkuZXhw YW5kZWRXaWR0aCkpeyR0aGlzLnRyaWdnZXIoImJlZm9yZVRhYkV4cGFuZCIpOyQu Y29sbGFwc2libGVUYWJzLm1vdmVUb0V4cGFuZGVkKGRhdGEuY29sbGFwc2VkQ29u dGFpbmVyKyIgIitkYXRhLmNvbGxhcHNpYmxlKyc6Zmlyc3QnKTt9fSk7fSxtb3Zl VG9Db2xsYXBzZWQ6ZnVuY3Rpb24oZWxlKXt2YXIgJG1vdmluZz0kKGVsZSk7aWYo JG1vdmluZy5zaXplKCk9PTApe3JldHVybjt9CnZhciBkYXRhPSQuY29sbGFwc2li bGVUYWJzLmdldFNldHRpbmdzKCRtb3ZpbmcpO3ZhciBkYXRhRXhwPSQuY29sbGFw c2libGVUYWJzLmdldFNldHRpbmdzKGRhdGEuZXhwYW5kZWRDb250YWluZXIpO2Rh dGFFeHAuc2hpZnRpbmc9dHJ1ZTskbW92aW5nLnJlbW92ZSgpLnByZXBlbmRUbyhk YXRhLmNvbGxhcHNlZENvbnRhaW5lcikuZGF0YSgnY29sbGFwc2libGVUYWJzU2V0 dGluZ3MnLGRhdGEpO2RhdGFFeHAuc2hpZnRpbmc9ZmFsc2U7JC5jb2xsYXBzaWJs ZVRhYnMuaGFuZGxlUmVzaXplKCk7fSxtb3ZlVG9FeHBhbmRlZDpmdW5jdGlvbihl bGUpe3ZhciAkbW92aW5nPSQoZWxlKTtpZigkbW92aW5nLnNpemUoKT09MCl7cmV0 dXJuO30KdmFyIGRhdGE9JC5jb2xsYXBzaWJsZVRhYnMuZ2V0U2V0dGluZ3MoJG1v dmluZyk7dmFyIGRhdGFFeHA9JC5jb2xsYXBzaWJsZVRhYnMuZ2V0U2V0dGluZ3Mo ZGF0YS5leHBhbmRlZENvbnRhaW5lcik7ZGF0YUV4cC5zaGlmdGluZz10cnVlOyRt b3ZpbmcucmVtb3ZlKCkuaW5zZXJ0QWZ0ZXIoZGF0YS5wcmV2RWxlbWVudCkuZGF0 YSgnY29sbGFwc2libGVUYWJzU2V0dGluZ3MnLGRhdGEpO2RhdGFFeHAuc2hpZnRp bmc9ZmFsc2U7JC5jb2xsYXBzaWJsZVRhYnMuaGFuZGxlUmVzaXplKCk7fX07fSko alF1ZXJ5KTsoZnVuY3Rpb24oalF1ZXJ5KXtqUXVlcnkuZWFjaChbJ2JhY2tncm91 bmRDb2xvcicsJ2JvcmRlckJvdHRvbUNvbG9yJywnYm9yZGVyTGVmdENvbG9yJywn Ym9yZGVyUmlnaHRDb2xvcicsJ2JvcmRlclRvcENvbG9yJywnY29sb3InLCdvdXRs aW5lQ29sb3InXSxmdW5jdGlvbihpLGF0dHIpe2pRdWVyeS5meC5zdGVwW2F0dHJd PWZ1bmN0aW9uKGZ4KXtpZihmeC5zdGF0ZT09MCl7Znguc3RhcnQ9Z2V0Q29sb3Io ZnguZWxlbSxhdHRyKTtmeC5lbmQ9Z2V0UkdCKGZ4LmVuZCk7fQpmeC5lbGVtLnN0 eWxlW2F0dHJdPSJyZ2IoIitbTWF0aC5tYXgoTWF0aC5taW4ocGFyc2VJbnQoKGZ4 LnBvcyooZnguZW5kWzBdLWZ4LnN0YXJ0WzBdKSkrZnguc3RhcnRbMF0pLDI1NSks MCksTWF0aC5tYXgoTWF0aC5taW4ocGFyc2VJbnQoKGZ4LnBvcyooZnguZW5kWzFd LWZ4LnN0YXJ0WzFdKSkrZnguc3RhcnRbMV0pLDI1NSksMCksTWF0aC5tYXgoTWF0 aC5taW4ocGFyc2VJbnQoKGZ4LnBvcyooZnguZW5kWzJdLWZ4LnN0YXJ0WzJdKSkr Znguc3RhcnRbMl0pLDI1NSksMCldLmpvaW4oIiwiKSsiKSI7fX0pO2Z1bmN0aW9u IGdldFJHQihjb2xvcil7dmFyIHJlc3VsdDtpZihjb2xvciYmY29sb3IuY29uc3Ry dWN0b3I9PUFycmF5JiZjb2xvci5sZW5ndGg9PTMpCnJldHVybiBjb2xvcjtpZihy ZXN1bHQ9L3JnYlwoXHMqKFswLTldezEsM30pXHMqLFxzKihbMC05XXsxLDN9KVxz KixccyooWzAtOV17MSwzfSlccypcKS8uZXhlYyhjb2xvcikpCnJldHVybltwYXJz ZUludChyZXN1bHRbMV0pLHBhcnNlSW50KHJlc3VsdFsyXSkscGFyc2VJbnQocmVz dWx0WzNdKV07aWYocmVzdWx0PS9yZ2JcKFxzKihbMC05XSsoPzpcLlswLTldKyk/ KVwlXHMqLFxzKihbMC05XSsoPzpcLlswLTldKyk/KVwlXHMqLFxzKihbMC05XSso PzpcLlswLTldKyk/KVwlXHMqXCkvLmV4ZWMoY29sb3IpKQpyZXR1cm5bcGFyc2VG bG9hdChyZXN1bHRbMV0pKjIuNTUscGFyc2VGbG9hdChyZXN1bHRbMl0pKjIuNTUs cGFyc2VGbG9hdChyZXN1bHRbM10pKjIuNTVdO2lmKHJlc3VsdD0vIyhbYS1mQS1G MC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KS8uZXhlYyhj b2xvcikpCnJldHVybltwYXJzZUludChyZXN1bHRbMV0sMTYpLHBhcnNlSW50KHJl c3VsdFsyXSwxNikscGFyc2VJbnQocmVzdWx0WzNdLDE2KV07aWYocmVzdWx0PS8j KFthLWZBLUYwLTldKShbYS1mQS1GMC05XSkoW2EtZkEtRjAtOV0pLy5leGVjKGNv bG9yKSkKcmV0dXJuW3BhcnNlSW50KHJlc3VsdFsxXStyZXN1bHRbMV0sMTYpLHBh cnNlSW50KHJlc3VsdFsyXStyZXN1bHRbMl0sMTYpLHBhcnNlSW50KHJlc3VsdFsz XStyZXN1bHRbM10sMTYpXTtyZXR1cm4gY29sb3JzW2pRdWVyeS50cmltKGNvbG9y KS50b0xvd2VyQ2FzZSgpXTt9CmZ1bmN0aW9uIGdldENvbG9yKGVsZW0sYXR0cil7 dmFyIGNvbG9yO2Rve2NvbG9yPWpRdWVyeS5jdXJDU1MoZWxlbSxhdHRyKTtpZihj b2xvciE9JycmJmNvbG9yIT0ndHJhbnNwYXJlbnQnfHxqUXVlcnkubm9kZU5hbWUo ZWxlbSwiYm9keSIpKQpicmVhazthdHRyPSJiYWNrZ3JvdW5kQ29sb3IiO313aGls ZShlbGVtPWVsZW0ucGFyZW50Tm9kZSk7cmV0dXJuIGdldFJHQihjb2xvcik7fTt2 YXIgY29sb3JzPXthcXVhOlswLDI1NSwyNTVdLGF6dXJlOlsyNDAsMjU1LDI1NV0s YmVpZ2U6WzI0NSwyNDUsMjIwXSxibGFjazpbMCwwLDBdLGJsdWU6WzAsMCwyNTVd LGJyb3duOlsxNjUsNDIsNDJdLGN5YW46WzAsMjU1LDI1NV0sZGFya2JsdWU6WzAs MCwxMzldLGRhcmtjeWFuOlswLDEzOSwxMzldLGRhcmtncmV5OlsxNjksMTY5LDE2 OV0sZGFya2dyZWVuOlswLDEwMCwwXSxkYXJra2hha2k6WzE4OSwxODMsMTA3XSxk YXJrbWFnZW50YTpbMTM5LDAsMTM5XSxkYXJrb2xpdmVncmVlbjpbODUsMTA3LDQ3 XSxkYXJrb3JhbmdlOlsyNTUsMTQwLDBdLGRhcmtvcmNoaWQ6WzE1Myw1MCwyMDRd LGRhcmtyZWQ6WzEzOSwwLDBdLGRhcmtzYWxtb246WzIzMywxNTAsMTIyXSxkYXJr dmlvbGV0OlsxNDgsMCwyMTFdLGZ1Y2hzaWE6WzI1NSwwLDI1NV0sZ29sZDpbMjU1 LDIxNSwwXSxncmVlbjpbMCwxMjgsMF0saW5kaWdvOls3NSwwLDEzMF0sa2hha2k6 WzI0MCwyMzAsMTQwXSxsaWdodGJsdWU6WzE3MywyMTYsMjMwXSxsaWdodGN5YW46 WzIyNCwyNTUsMjU1XSxsaWdodGdyZWVuOlsxNDQsMjM4LDE0NF0sbGlnaHRncmV5 OlsyMTEsMjExLDIxMV0sbGlnaHRwaW5rOlsyNTUsMTgyLDE5M10sbGlnaHR5ZWxs b3c6WzI1NSwyNTUsMjI0XSxsaW1lOlswLDI1NSwwXSxtYWdlbnRhOlsyNTUsMCwy NTVdLG1hcm9vbjpbMTI4LDAsMF0sbmF2eTpbMCwwLDEyOF0sb2xpdmU6WzEyOCwx MjgsMF0sb3JhbmdlOlsyNTUsMTY1LDBdLHBpbms6WzI1NSwxOTIsMjAzXSxwdXJw bGU6WzEyOCwwLDEyOF0sdmlvbGV0OlsxMjgsMCwxMjhdLHJlZDpbMjU1LDAsMF0s c2lsdmVyOlsxOTIsMTkyLDE5Ml0sd2hpdGU6WzI1NSwyNTUsMjU1XSx5ZWxsb3c6 WzI1NSwyNTUsMF19O30pKGpRdWVyeSk7alF1ZXJ5LmNvb2tpZT1mdW5jdGlvbihu YW1lLHZhbHVlLG9wdGlvbnMpe2lmKHR5cGVvZiB2YWx1ZSE9J3VuZGVmaW5lZCcp e29wdGlvbnM9b3B0aW9uc3x8e307aWYodmFsdWU9PT1udWxsKXt2YWx1ZT0nJztv cHRpb25zLmV4cGlyZXM9LTE7fQp2YXIgZXhwaXJlcz0nJztpZihvcHRpb25zLmV4 cGlyZXMmJih0eXBlb2Ygb3B0aW9ucy5leHBpcmVzPT0nbnVtYmVyJ3x8b3B0aW9u cy5leHBpcmVzLnRvVVRDU3RyaW5nKSl7dmFyIGRhdGU7aWYodHlwZW9mIG9wdGlv bnMuZXhwaXJlcz09J251bWJlcicpe2RhdGU9bmV3IERhdGUoKTtkYXRlLnNldFRp bWUoZGF0ZS5nZXRUaW1lKCkrKG9wdGlvbnMuZXhwaXJlcyoyNCo2MCo2MCoxMDAw KSk7fWVsc2V7ZGF0ZT1vcHRpb25zLmV4cGlyZXM7fQpleHBpcmVzPSc7IGV4cGly ZXM9JytkYXRlLnRvVVRDU3RyaW5nKCk7fQp2YXIgcGF0aD1vcHRpb25zLnBhdGg/ JzsgcGF0aD0nKyhvcHRpb25zLnBhdGgpOicnO3ZhciBkb21haW49b3B0aW9ucy5k b21haW4/JzsgZG9tYWluPScrKG9wdGlvbnMuZG9tYWluKTonJzt2YXIgc2VjdXJl PW9wdGlvbnMuc2VjdXJlPyc7IHNlY3VyZSc6Jyc7ZG9jdW1lbnQuY29va2llPVtu YW1lLCc9JyxlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLGV4cGlyZXMscGF0aCxk b21haW4sc2VjdXJlXS5qb2luKCcnKTt9ZWxzZXt2YXIgY29va2llVmFsdWU9bnVs bDtpZihkb2N1bWVudC5jb29raWUmJmRvY3VtZW50LmNvb2tpZSE9Jycpe3ZhciBj b29raWVzPWRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpO2Zvcih2YXIgaT0wO2k8 Y29va2llcy5sZW5ndGg7aSsrKXt2YXIgY29va2llPWpRdWVyeS50cmltKGNvb2tp ZXNbaV0pO2lmKGNvb2tpZS5zdWJzdHJpbmcoMCxuYW1lLmxlbmd0aCsxKT09KG5h bWUrJz0nKSl7Y29va2llVmFsdWU9ZGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZS5z dWJzdHJpbmcobmFtZS5sZW5ndGgrMSkpO2JyZWFrO319fQpyZXR1cm4gY29va2ll VmFsdWU7fX07KGZ1bmN0aW9uKCQpe2Z1bmN0aW9uIGVuY29kZUV2ZW50KGV2ZW50 KXtyZXR1cm4gZXZlbnQucmVwbGFjZSgvLS9nLCctLScpLnJlcGxhY2UoLyAvZywn LScpO30KJC5mbi5leHRlbmQoe2RlbGF5ZWRCaW5kOmZ1bmN0aW9uKHRpbWVvdXQs ZXZlbnQsZGF0YSxjYWxsYmFjayl7dmFyIGVuY0V2ZW50PWVuY29kZUV2ZW50KGV2 ZW50KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHRoYXQ9dGhpcztp ZighKCQodGhpcykuZGF0YSgnX2RlbGF5ZWRCaW5kQm91bmQtJytlbmNFdmVudCsn LScrdGltZW91dCkpKXskKHRoaXMpLmRhdGEoJ19kZWxheWVkQmluZEJvdW5kLScr ZW5jRXZlbnQrJy0nK3RpbWVvdXQsdHJ1ZSk7JCh0aGlzKS5iaW5kKGV2ZW50LGZ1 bmN0aW9uKCl7dmFyIHRpbWVySUQ9JCh0aGlzKS5kYXRhKCdfZGVsYXllZEJpbmRU aW1lcklELScrZW5jRXZlbnQrJy0nK3RpbWVvdXQpO2lmKHR5cGVvZiB0aW1lcklE IT0ndW5kZWZpbmVkJykKY2xlYXJUaW1lb3V0KHRpbWVySUQpO3RpbWVySUQ9c2V0 VGltZW91dChmdW5jdGlvbigpeyQodGhhdCkudHJpZ2dlcignX2RlbGF5ZWRCaW5k LScrZW5jRXZlbnQrJy0nK3RpbWVvdXQpO30sdGltZW91dCk7JCh0aGlzKS5kYXRh KCdfZGVsYXllZEJpbmRUaW1lcklELScrZW5jRXZlbnQrJy0nK3RpbWVvdXQsdGlt ZXJJRCk7fSk7fQokKHRoaXMpLmJpbmQoJ19kZWxheWVkQmluZC0nK2VuY0V2ZW50 KyctJyt0aW1lb3V0LGRhdGEsY2FsbGJhY2spO30pO30sZGVsYXllZEJpbmRDYW5j ZWw6ZnVuY3Rpb24odGltZW91dCxldmVudCl7dmFyIGVuY0V2ZW50PWVuY29kZUV2 ZW50KGV2ZW50KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHRpbWVy SUQ9JCh0aGlzKS5kYXRhKCdfZGVsYXllZEJpbmRUaW1lcklELScrZW5jRXZlbnQr Jy0nK3RpbWVvdXQpO2lmKHR5cGVvZiB0aW1lcklEIT0ndW5kZWZpbmVkJykKY2xl YXJUaW1lb3V0KHRpbWVySUQpO30pO30sZGVsYXllZEJpbmRVbmJpbmQ6ZnVuY3Rp b24odGltZW91dCxldmVudCxjYWxsYmFjayl7dmFyIGVuY0V2ZW50PWVuY29kZUV2 ZW50KGV2ZW50KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS51 bmJpbmQoJ19kZWxheWVkQmluZC0nK2VuY0V2ZW50KyctJyt0aW1lb3V0LGNhbGxi YWNrKTt9KTt9fSk7fSkoalF1ZXJ5KTsoZnVuY3Rpb24oJCl7JC5oaWdobGlnaHRU ZXh0PXtzcGxpdEFuZEhpZ2hsaWdodDpmdW5jdGlvbihub2RlLHBhdCl7dmFyIHBh dEFycmF5PXBhdC5zcGxpdCgiICIpO2Zvcih2YXIgaT0wO2k8cGF0QXJyYXkubGVu Z3RoO2krKyl7aWYocGF0QXJyYXlbaV0ubGVuZ3RoPT0wKWNvbnRpbnVlOyQuaGln aGxpZ2h0VGV4dC5pbm5lckhpZ2hsaWdodChub2RlLHBhdEFycmF5W2ldKTt9CnJl dHVybiBub2RlO30saW5uZXJIaWdobGlnaHQ6ZnVuY3Rpb24obm9kZSxwYXQpe2lm KG5vZGUubm9kZVR5cGU9PTMpe3ZhciBwb3M9bm9kZS5kYXRhLnNlYXJjaChuZXcg UmVnRXhwKCJcXGIiK1JlZ0V4cC5lc2NhcGUocGF0KSwiaSIpKTtpZihwb3M+PTAp e3ZhciBzcGFubm9kZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7c3Bh bm5vZGUuY2xhc3NOYW1lPSdoaWdobGlnaHQnO3ZhciBtaWRkbGViaXQ9bm9kZS5z cGxpdFRleHQocG9zKTttaWRkbGViaXQuc3BsaXRUZXh0KHBhdC5sZW5ndGgpO3Zh ciBtaWRkbGVjbG9uZT1taWRkbGViaXQuY2xvbmVOb2RlKHRydWUpO3NwYW5ub2Rl LmFwcGVuZENoaWxkKG1pZGRsZWNsb25lKTttaWRkbGViaXQucGFyZW50Tm9kZS5y ZXBsYWNlQ2hpbGQoc3Bhbm5vZGUsbWlkZGxlYml0KTt9fWVsc2UgaWYobm9kZS5u b2RlVHlwZT09MSYmbm9kZS5jaGlsZE5vZGVzJiYhLyhzY3JpcHR8c3R5bGUpL2ku dGVzdChub2RlLnRhZ05hbWUpJiYhKG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgp PT0nc3BhbicmJm5vZGUuY2xhc3NOYW1lLm1hdGNoKC9cYmhpZ2hsaWdodC8pKSl7 Zm9yKHZhciBpPTA7aTxub2RlLmNoaWxkTm9kZXMubGVuZ3RoOysraSl7JC5oaWdo bGlnaHRUZXh0LmlubmVySGlnaGxpZ2h0KG5vZGUuY2hpbGROb2Rlc1tpXSxwYXQp O319fX07JC5mbi5oaWdobGlnaHRUZXh0PWZ1bmN0aW9uKG1hdGNoU3RyaW5nKXty ZXR1cm4gJCh0aGlzKS5lYWNoKGZ1bmN0aW9uKCl7dmFyICR0aGlzPSQodGhpcyk7 JHRoaXMuZGF0YSgnaGlnaGxpZ2h0VGV4dCcse29yaWdpbmFsVGV4dDokdGhpcy50 ZXh0KCl9KTskLmhpZ2hsaWdodFRleHQuc3BsaXRBbmRIaWdobGlnaHQodGhpcyxt YXRjaFN0cmluZyk7fSk7fTt9KShqUXVlcnkpOyhmdW5jdGlvbigkKXskLnN1Z2dl c3Rpb25zPXtjYW5jZWw6ZnVuY3Rpb24oY29udGV4dCl7aWYoY29udGV4dC5kYXRh LnRpbWVySUQhPW51bGwpe2NsZWFyVGltZW91dChjb250ZXh0LmRhdGEudGltZXJJ RCk7fQppZih0eXBlb2YgY29udGV4dC5jb25maWcuY2FuY2VsPT0nZnVuY3Rpb24n KXtjb250ZXh0LmNvbmZpZy5jYW5jZWwuY2FsbChjb250ZXh0LmRhdGEuJHRleHRi b3gpO319LHJlc3RvcmU6ZnVuY3Rpb24oY29udGV4dCl7Y29udGV4dC5kYXRhLiR0 ZXh0Ym94LnZhbChjb250ZXh0LmRhdGEucHJldlRleHQpO30sdXBkYXRlOmZ1bmN0 aW9uKGNvbnRleHQsZGVsYXllZCl7ZnVuY3Rpb24gbWF5YmVGZXRjaCgpe2lmKGNv bnRleHQuZGF0YS4kdGV4dGJveC52YWwoKSE9PWNvbnRleHQuZGF0YS5wcmV2VGV4 dCl7Y29udGV4dC5kYXRhLnByZXZUZXh0PWNvbnRleHQuZGF0YS4kdGV4dGJveC52 YWwoKTtpZih0eXBlb2YgY29udGV4dC5jb25maWcuZmV0Y2g9PSdmdW5jdGlvbicp e2NvbnRleHQuY29uZmlnLmZldGNoLmNhbGwoY29udGV4dC5kYXRhLiR0ZXh0Ym94 LGNvbnRleHQuZGF0YS4kdGV4dGJveC52YWwoKSk7fX19CmlmKGNvbnRleHQuZGF0 YS50aW1lcklEIT1udWxsKXtjbGVhclRpbWVvdXQoY29udGV4dC5kYXRhLnRpbWVy SUQpO30KaWYoZGVsYXllZCl7Y29udGV4dC5kYXRhLnRpbWVySUQ9c2V0VGltZW91 dChtYXliZUZldGNoLGNvbnRleHQuY29uZmlnLmRlbGF5KTt9ZWxzZXttYXliZUZl dGNoKCk7fQokLnN1Z2dlc3Rpb25zLnNwZWNpYWwoY29udGV4dCk7fSxzcGVjaWFs OmZ1bmN0aW9uKGNvbnRleHQpe2lmKHR5cGVvZiBjb250ZXh0LmNvbmZpZy5zcGVj aWFsLnJlbmRlcj09J2Z1bmN0aW9uJyl7c2V0VGltZW91dChmdW5jdGlvbigpeyRz cGVjaWFsPWNvbnRleHQuZGF0YS4kY29udGFpbmVyLmZpbmQoJy5zdWdnZXN0aW9u cy1zcGVjaWFsJyk7Y29udGV4dC5jb25maWcuc3BlY2lhbC5yZW5kZXIuY2FsbCgk c3BlY2lhbCxjb250ZXh0LmRhdGEuJHRleHRib3gudmFsKCkpO30sMSk7fX0sY29u ZmlndXJlOmZ1bmN0aW9uKGNvbnRleHQscHJvcGVydHksdmFsdWUpe3N3aXRjaChw cm9wZXJ0eSl7Y2FzZSdmZXRjaCc6Y2FzZSdjYW5jZWwnOmNhc2Unc3BlY2lhbCc6 Y2FzZSdyZXN1bHQnOmNhc2UnJHJlZ2lvbic6Y29udGV4dC5jb25maWdbcHJvcGVy dHldPXZhbHVlO2JyZWFrO2Nhc2Unc3VnZ2VzdGlvbnMnOmNvbnRleHQuY29uZmln W3Byb3BlcnR5XT12YWx1ZTtpZih0eXBlb2YgY29udGV4dC5kYXRhIT09J3VuZGVm aW5lZCcpe2lmKGNvbnRleHQuZGF0YS4kdGV4dGJveC52YWwoKS5sZW5ndGg9PTAp e2NvbnRleHQuZGF0YS4kY29udGFpbmVyLmhpZGUoKTt9ZWxzZXtjb250ZXh0LmRh dGEuJGNvbnRhaW5lci5zaG93KCk7dmFyIG5ld0NTUz17J3RvcCc6Y29udGV4dC5j b25maWcuJHJlZ2lvbi5vZmZzZXQoKS50b3ArY29udGV4dC5jb25maWcuJHJlZ2lv bi5vdXRlckhlaWdodCgpLCdib3R0b20nOidhdXRvJywnd2lkdGgnOmNvbnRleHQu Y29uZmlnLiRyZWdpb24ub3V0ZXJXaWR0aCgpLCdoZWlnaHQnOidhdXRvJ30KaWYo Y29udGV4dC5jb25maWcucG9zaXRpb25Gcm9tTGVmdCl7bmV3Q1NTWydsZWZ0J109 Y29udGV4dC5jb25maWcuJHJlZ2lvbi5vZmZzZXQoKS5sZWZ0O25ld0NTU1sncmln aHQnXT0nYXV0byc7fWVsc2V7bmV3Q1NTWydsZWZ0J109J2F1dG8nO25ld0NTU1sn cmlnaHQnXT0kKCdib2R5Jykud2lkdGgoKS0oY29udGV4dC5jb25maWcuJHJlZ2lv bi5vZmZzZXQoKS5sZWZ0K2NvbnRleHQuY29uZmlnLiRyZWdpb24ub3V0ZXJXaWR0 aCgpKTt9CmNvbnRleHQuZGF0YS4kY29udGFpbmVyLmNzcyhuZXdDU1MpO3ZhciAk cmVzdWx0cz1jb250ZXh0LmRhdGEuJGNvbnRhaW5lci5jaGlsZHJlbignLnN1Z2dl c3Rpb25zLXJlc3VsdHMnKTskcmVzdWx0cy5lbXB0eSgpO3ZhciBleHBXaWR0aD0t MTt2YXIgJGF1dG9FbGxpcHNlTWU9JChbXSk7dmFyIG1hdGNoZWRUZXh0PW51bGw7 Zm9yKHZhciBpPTA7aTxjb250ZXh0LmNvbmZpZy5zdWdnZXN0aW9ucy5sZW5ndGg7 aSsrKXt2YXIgdGV4dD1jb250ZXh0LmNvbmZpZy5zdWdnZXN0aW9uc1tpXTt2YXIg JHJlc3VsdD0kKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ3N1Z2dlc3Rpb25zLXJlc3Vs dCcpLmF0dHIoJ3JlbCcsaSkuZGF0YSgndGV4dCcsY29udGV4dC5jb25maWcuc3Vn Z2VzdGlvbnNbaV0pLm1vdXNlbW92ZShmdW5jdGlvbihlKXtjb250ZXh0LmRhdGEu c2VsZWN0ZWRXaXRoTW91c2U9dHJ1ZTskLnN1Z2dlc3Rpb25zLmhpZ2hsaWdodChj b250ZXh0LCQodGhpcykuY2xvc2VzdCgnLnN1Z2dlc3Rpb25zLXJlc3VsdHMgZGl2 JyksZmFsc2UpO30pLmFwcGVuZFRvKCRyZXN1bHRzKTtpZih0eXBlb2YgY29udGV4 dC5jb25maWcucmVzdWx0LnJlbmRlcj09J2Z1bmN0aW9uJyl7Y29udGV4dC5jb25m aWcucmVzdWx0LnJlbmRlci5jYWxsKCRyZXN1bHQsY29udGV4dC5jb25maWcuc3Vn Z2VzdGlvbnNbaV0pO31lbHNle2lmKGNvbnRleHQuY29uZmlnLmhpZ2hsaWdodElu cHV0KXttYXRjaGVkVGV4dD1jb250ZXh0LmRhdGEucHJldlRleHQ7fQokcmVzdWx0 LmFwcGVuZCgkKCc8c3BhbiAvPicpLmNzcygnd2hpdGVTcGFjZScsJ25vd3JhcCcp LnRleHQodGV4dCkpO3ZhciAkc3Bhbj0kcmVzdWx0LmNoaWxkcmVuKCdzcGFuJyk7 aWYoJHNwYW4ub3V0ZXJXaWR0aCgpPiRyZXN1bHQud2lkdGgoKSYmJHNwYW4ub3V0 ZXJXaWR0aCgpPmV4cFdpZHRoKXtleHBXaWR0aD0kc3Bhbi5vdXRlcldpZHRoKCkr KGNvbnRleHQuZGF0YS4kY29udGFpbmVyLndpZHRoKCktJHNwYW4ucGFyZW50KCku d2lkdGgoKSk7fQokYXV0b0VsbGlwc2VNZT0kYXV0b0VsbGlwc2VNZS5hZGQoJHJl c3VsdCk7fX0KaWYoZXhwV2lkdGg+Y29udGV4dC5kYXRhLiRjb250YWluZXIud2lk dGgoKSl7dmFyIG1heFdpZHRoPWNvbnRleHQuY29uZmlnLm1heEV4cGFuZEZhY3Rv cipjb250ZXh0LmRhdGEuJHRleHRib3gud2lkdGgoKTtjb250ZXh0LmRhdGEuJGNv bnRhaW5lci53aWR0aChNYXRoLm1pbihleHBXaWR0aCxtYXhXaWR0aCkpO30KJGF1 dG9FbGxpcHNlTWUuYXV0b0VsbGlwc2lzKHtoYXNTcGFuOnRydWUsdG9vbHRpcDp0 cnVlLG1hdGNoVGV4dDptYXRjaGVkVGV4dH0pO319CmJyZWFrO2Nhc2UnbWF4Um93 cyc6Y29udGV4dC5jb25maWdbcHJvcGVydHldPU1hdGgubWF4KDEsTWF0aC5taW4o MTAwLHZhbHVlKSk7YnJlYWs7Y2FzZSdkZWxheSc6Y29udGV4dC5jb25maWdbcHJv cGVydHldPU1hdGgubWF4KDAsTWF0aC5taW4oMTIwMCx2YWx1ZSkpO2JyZWFrO2Nh c2UnbWF4RXhwYW5kRmFjdG9yJzpjb250ZXh0LmNvbmZpZ1twcm9wZXJ0eV09TWF0 aC5tYXgoMSx2YWx1ZSk7YnJlYWs7Y2FzZSdzdWJtaXRPbkNsaWNrJzpjYXNlJ3Bv c2l0aW9uRnJvbUxlZnQnOmNhc2UnaGlnaGxpZ2h0SW5wdXQnOmNvbnRleHQuY29u ZmlnW3Byb3BlcnR5XT12YWx1ZT90cnVlOmZhbHNlO2JyZWFrO319LGhpZ2hsaWdo dDpmdW5jdGlvbihjb250ZXh0LHJlc3VsdCx1cGRhdGVUZXh0Ym94KXt2YXIgc2Vs ZWN0ZWQ9Y29udGV4dC5kYXRhLiRjb250YWluZXIuZmluZCgnLnN1Z2dlc3Rpb25z LXJlc3VsdC1jdXJyZW50Jyk7aWYoIXJlc3VsdC5nZXR8fHNlbGVjdGVkLmdldCgw KSE9cmVzdWx0LmdldCgwKSl7aWYocmVzdWx0PT0ncHJldicpe2lmKHNlbGVjdGVk LmlzKCcuc3VnZ2VzdGlvbnMtc3BlY2lhbCcpKXtyZXN1bHQ9Y29udGV4dC5kYXRh LiRjb250YWluZXIuZmluZCgnLnN1Z2dlc3Rpb25zLXJlc3VsdDpsYXN0Jyl9ZWxz ZXtyZXN1bHQ9c2VsZWN0ZWQucHJldigpO2lmKHNlbGVjdGVkLmxlbmd0aD09MCl7 aWYoY29udGV4dC5kYXRhLiRjb250YWluZXIuZmluZCgnLnN1Z2dlc3Rpb25zLXNw ZWNpYWwnKS5odG1sKCkhPSIiKXtyZXN1bHQ9Y29udGV4dC5kYXRhLiRjb250YWlu ZXIuZmluZCgnLnN1Z2dlc3Rpb25zLXNwZWNpYWwnKTt9ZWxzZXtyZXN1bHQ9Y29u dGV4dC5kYXRhLiRjb250YWluZXIuZmluZCgnLnN1Z2dlc3Rpb25zLXJlc3VsdHMg ZGl2Omxhc3QnKTt9fX19ZWxzZSBpZihyZXN1bHQ9PSduZXh0Jyl7aWYoc2VsZWN0 ZWQubGVuZ3RoPT0wKXtyZXN1bHQ9Y29udGV4dC5kYXRhLiRjb250YWluZXIuZmlu ZCgnLnN1Z2dlc3Rpb25zLXJlc3VsdHMgZGl2OmZpcnN0Jyk7aWYocmVzdWx0Lmxl bmd0aD09MCYmY29udGV4dC5kYXRhLiRjb250YWluZXIuZmluZCgnLnN1Z2dlc3Rp b25zLXNwZWNpYWwnKS5odG1sKCkhPSIiKXtyZXN1bHQ9Y29udGV4dC5kYXRhLiRj b250YWluZXIuZmluZCgnLnN1Z2dlc3Rpb25zLXNwZWNpYWwnKTt9fWVsc2V7cmVz dWx0PXNlbGVjdGVkLm5leHQoKTtpZihzZWxlY3RlZC5pcygnLnN1Z2dlc3Rpb25z LXNwZWNpYWwnKSl7cmVzdWx0PSQoW10pO31lbHNlIGlmKHJlc3VsdC5sZW5ndGg9 PTAmJmNvbnRleHQuZGF0YS4kY29udGFpbmVyLmZpbmQoJy5zdWdnZXN0aW9ucy1z cGVjaWFsJykuaHRtbCgpIT0iIil7cmVzdWx0PWNvbnRleHQuZGF0YS4kY29udGFp bmVyLmZpbmQoJy5zdWdnZXN0aW9ucy1zcGVjaWFsJyk7fX19CnNlbGVjdGVkLnJl bW92ZUNsYXNzKCdzdWdnZXN0aW9ucy1yZXN1bHQtY3VycmVudCcpO3Jlc3VsdC5h ZGRDbGFzcygnc3VnZ2VzdGlvbnMtcmVzdWx0LWN1cnJlbnQnKTt9CmlmKHVwZGF0 ZVRleHRib3gpe2lmKHJlc3VsdC5sZW5ndGg9PTB8fHJlc3VsdC5pcygnLnN1Z2dl c3Rpb25zLXNwZWNpYWwnKSl7JC5zdWdnZXN0aW9ucy5yZXN0b3JlKGNvbnRleHQp O31lbHNle2NvbnRleHQuZGF0YS4kdGV4dGJveC52YWwocmVzdWx0LmRhdGEoJ3Rl eHQnKSk7Y29udGV4dC5kYXRhLiR0ZXh0Ym94LmNoYW5nZSgpO30KY29udGV4dC5k YXRhLiR0ZXh0Ym94LnRyaWdnZXIoJ2NoYW5nZScpO319LGtleXByZXNzOmZ1bmN0 aW9uKGUsY29udGV4dCxrZXkpe3ZhciB3YXNWaXNpYmxlPWNvbnRleHQuZGF0YS4k Y29udGFpbmVyLmlzKCc6dmlzaWJsZScpO3ZhciBwcmV2ZW50RGVmYXVsdD1mYWxz ZTtzd2l0Y2goa2V5KXtjYXNlIDQwOmlmKHdhc1Zpc2libGUpeyQuc3VnZ2VzdGlv bnMuaGlnaGxpZ2h0KGNvbnRleHQsJ25leHQnLHRydWUpO2NvbnRleHQuZGF0YS5z ZWxlY3RlZFdpdGhNb3VzZT1mYWxzZTt9ZWxzZXskLnN1Z2dlc3Rpb25zLnVwZGF0 ZShjb250ZXh0LGZhbHNlKTt9CnByZXZlbnREZWZhdWx0PXRydWU7YnJlYWs7Y2Fz ZSAzODppZih3YXNWaXNpYmxlKXskLnN1Z2dlc3Rpb25zLmhpZ2hsaWdodChjb250 ZXh0LCdwcmV2Jyx0cnVlKTtjb250ZXh0LmRhdGEuc2VsZWN0ZWRXaXRoTW91c2U9 ZmFsc2U7fQpwcmV2ZW50RGVmYXVsdD13YXNWaXNpYmxlO2JyZWFrO2Nhc2UgMjc6 Y29udGV4dC5kYXRhLiRjb250YWluZXIuaGlkZSgpOyQuc3VnZ2VzdGlvbnMucmVz dG9yZShjb250ZXh0KTskLnN1Z2dlc3Rpb25zLmNhbmNlbChjb250ZXh0KTtjb250 ZXh0LmRhdGEuJHRleHRib3gudHJpZ2dlcignY2hhbmdlJyk7cHJldmVudERlZmF1 bHQ9d2FzVmlzaWJsZTticmVhaztjYXNlIDEzOmNvbnRleHQuZGF0YS4kY29udGFp bmVyLmhpZGUoKTtwcmV2ZW50RGVmYXVsdD13YXNWaXNpYmxlO3NlbGVjdGVkPWNv bnRleHQuZGF0YS4kY29udGFpbmVyLmZpbmQoJy5zdWdnZXN0aW9ucy1yZXN1bHQt Y3VycmVudCcpO2lmKHNlbGVjdGVkLnNpemUoKT09MHx8Y29udGV4dC5kYXRhLnNl bGVjdGVkV2l0aE1vdXNlKXskLnN1Z2dlc3Rpb25zLmNhbmNlbChjb250ZXh0KTtj b250ZXh0LmNvbmZpZy4kcmVnaW9uLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTt9 ZWxzZSBpZihzZWxlY3RlZC5pcygnLnN1Z2dlc3Rpb25zLXNwZWNpYWwnKSl7aWYo dHlwZW9mIGNvbnRleHQuY29uZmlnLnNwZWNpYWwuc2VsZWN0PT0nZnVuY3Rpb24n KXtjb250ZXh0LmNvbmZpZy5zcGVjaWFsLnNlbGVjdC5jYWxsKHNlbGVjdGVkLGNv bnRleHQuZGF0YS4kdGV4dGJveCk7fX1lbHNle2lmKHR5cGVvZiBjb250ZXh0LmNv bmZpZy5yZXN1bHQuc2VsZWN0PT0nZnVuY3Rpb24nKXskLnN1Z2dlc3Rpb25zLmhp Z2hsaWdodChjb250ZXh0LHNlbGVjdGVkLHRydWUpO2NvbnRleHQuY29uZmlnLnJl c3VsdC5zZWxlY3QuY2FsbChzZWxlY3RlZCxjb250ZXh0LmRhdGEuJHRleHRib3gp O31lbHNleyQuc3VnZ2VzdGlvbnMuaGlnaGxpZ2h0KGNvbnRleHQsc2VsZWN0ZWQs dHJ1ZSk7fX0KYnJlYWs7ZGVmYXVsdDokLnN1Z2dlc3Rpb25zLnVwZGF0ZShjb250 ZXh0LHRydWUpO2JyZWFrO30KaWYocHJldmVudERlZmF1bHQpe2UucHJldmVudERl ZmF1bHQoKTtlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO319fTskLmZuLnN1 Z2dlc3Rpb25zPWZ1bmN0aW9uKCl7dmFyIHJldHVyblZhbHVlPW51bGw7dmFyIGFy Z3M9YXJndW1lbnRzOyQodGhpcykuZWFjaChmdW5jdGlvbigpe3ZhciBjb250ZXh0 PSQodGhpcykuZGF0YSgnc3VnZ2VzdGlvbnMtY29udGV4dCcpO2lmKHR5cGVvZiBj b250ZXh0PT0ndW5kZWZpbmVkJ3x8Y29udGV4dD09bnVsbCl7Y29udGV4dD17Y29u ZmlnOnsnZmV0Y2gnOmZ1bmN0aW9uKCl7fSwnY2FuY2VsJzpmdW5jdGlvbigpe30s J3NwZWNpYWwnOnt9LCdyZXN1bHQnOnt9LCckcmVnaW9uJzokKHRoaXMpLCdzdWdn ZXN0aW9ucyc6W10sJ21heFJvd3MnOjcsJ2RlbGF5JzoxMjAsJ3N1Ym1pdE9uQ2xp Y2snOmZhbHNlLCdtYXhFeHBhbmRGYWN0b3InOjMsJ3Bvc2l0aW9uRnJvbUxlZnQn OnRydWUsJ2hpZ2hsaWdodElucHV0JzpmYWxzZX19O30KaWYoYXJncy5sZW5ndGg+ MCl7aWYodHlwZW9mIGFyZ3NbMF09PSdvYmplY3QnKXtmb3IodmFyIGtleSBpbiBh cmdzWzBdKXskLnN1Z2dlc3Rpb25zLmNvbmZpZ3VyZShjb250ZXh0LGtleSxhcmdz WzBdW2tleV0pO319ZWxzZSBpZih0eXBlb2YgYXJnc1swXT09J3N0cmluZycpe2lm KGFyZ3MubGVuZ3RoPjEpeyQuc3VnZ2VzdGlvbnMuY29uZmlndXJlKGNvbnRleHQs YXJnc1swXSxhcmdzWzFdKTt9ZWxzZSBpZihyZXR1cm5WYWx1ZT09bnVsbCl7cmV0 dXJuVmFsdWU9KGFyZ3NbMF1pbiBjb250ZXh0LmNvbmZpZz91bmRlZmluZWQ6Y29u dGV4dC5jb25maWdbYXJnc1swXV0pO319fQppZih0eXBlb2YgY29udGV4dC5kYXRh PT0ndW5kZWZpbmVkJyl7Y29udGV4dC5kYXRhPXsndGltZXJJRCc6bnVsbCwncHJl dlRleHQnOm51bGwsJ3Zpc2libGVSZXN1bHRzJzowLCdtb3VzZURvd25Pbic6JChb XSksJyR0ZXh0Ym94JzokKHRoaXMpLCdzZWxlY3RlZFdpdGhNb3VzZSc6ZmFsc2V9 O3ZhciBuZXdDU1M9eyd0b3AnOk1hdGgucm91bmQoY29udGV4dC5kYXRhLiR0ZXh0 Ym94Lm9mZnNldCgpLnRvcCtjb250ZXh0LmRhdGEuJHRleHRib3gub3V0ZXJIZWln aHQoKSksJ3dpZHRoJzpjb250ZXh0LmRhdGEuJHRleHRib3gub3V0ZXJXaWR0aCgp LCdkaXNwbGF5Jzonbm9uZSd9CmlmKGNvbnRleHQuY29uZmlnLnBvc2l0aW9uRnJv bUxlZnQpe25ld0NTU1snbGVmdCddPWNvbnRleHQuY29uZmlnLiRyZWdpb24ub2Zm c2V0KCkubGVmdDtuZXdDU1NbJ3JpZ2h0J109J2F1dG8nO31lbHNle25ld0NTU1sn bGVmdCddPSdhdXRvJztuZXdDU1NbJ3JpZ2h0J109JCgnYm9keScpLndpZHRoKCkt KGNvbnRleHQuY29uZmlnLiRyZWdpb24ub2Zmc2V0KCkubGVmdCtjb250ZXh0LmNv bmZpZy4kcmVnaW9uLm91dGVyV2lkdGgoKSk7fQpjb250ZXh0LmRhdGEuJGNvbnRh aW5lcj0kKCc8ZGl2IC8+JykuY3NzKG5ld0NTUykuYWRkQ2xhc3MoJ3N1Z2dlc3Rp b25zJykuYXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcygnc3VnZ2VzdGlvbnMt cmVzdWx0cycpLm1vdXNlZG93bihmdW5jdGlvbihlKXtjb250ZXh0LmRhdGEubW91 c2VEb3duT249JChlLnRhcmdldCkuY2xvc2VzdCgnLnN1Z2dlc3Rpb25zLXJlc3Vs dHMgZGl2Jyk7fSkubW91c2V1cChmdW5jdGlvbihlKXt2YXIgJHJlc3VsdD0kKGUu dGFyZ2V0KS5jbG9zZXN0KCcuc3VnZ2VzdGlvbnMtcmVzdWx0cyBkaXYnKTt2YXIg JG90aGVyPWNvbnRleHQuZGF0YS5tb3VzZURvd25Pbjtjb250ZXh0LmRhdGEubW91 c2VEb3duT249JChbXSk7aWYoJHJlc3VsdC5nZXQoMCkhPSRvdGhlci5nZXQoMCkp e3JldHVybjt9CiQuc3VnZ2VzdGlvbnMuaGlnaGxpZ2h0KGNvbnRleHQsJHJlc3Vs dCx0cnVlKTtjb250ZXh0LmRhdGEuJGNvbnRhaW5lci5oaWRlKCk7aWYodHlwZW9m IGNvbnRleHQuY29uZmlnLnJlc3VsdC5zZWxlY3Q9PSdmdW5jdGlvbicpe2NvbnRl eHQuY29uZmlnLnJlc3VsdC5zZWxlY3QuY2FsbCgkcmVzdWx0LGNvbnRleHQuZGF0 YS4kdGV4dGJveCk7fQpjb250ZXh0LmRhdGEuJHRleHRib3guZm9jdXMoKTt9KSku YXBwZW5kKCQoJzxkaXYgLz4nKS5hZGRDbGFzcygnc3VnZ2VzdGlvbnMtc3BlY2lh bCcpLm1vdXNlZG93bihmdW5jdGlvbihlKXtjb250ZXh0LmRhdGEubW91c2VEb3du T249JChlLnRhcmdldCkuY2xvc2VzdCgnLnN1Z2dlc3Rpb25zLXNwZWNpYWwnKTt9 KS5tb3VzZXVwKGZ1bmN0aW9uKGUpe3ZhciAkc3BlY2lhbD0kKGUudGFyZ2V0KS5j bG9zZXN0KCcuc3VnZ2VzdGlvbnMtc3BlY2lhbCcpO3ZhciAkb3RoZXI9Y29udGV4 dC5kYXRhLm1vdXNlRG93bk9uO2NvbnRleHQuZGF0YS5tb3VzZURvd25Pbj0kKFtd KTtpZigkc3BlY2lhbC5nZXQoMCkhPSRvdGhlci5nZXQoMCkpe3JldHVybjt9CmNv bnRleHQuZGF0YS4kY29udGFpbmVyLmhpZGUoKTtpZih0eXBlb2YgY29udGV4dC5j b25maWcuc3BlY2lhbC5zZWxlY3Q9PSdmdW5jdGlvbicpe2NvbnRleHQuY29uZmln LnNwZWNpYWwuc2VsZWN0LmNhbGwoJHNwZWNpYWwsY29udGV4dC5kYXRhLiR0ZXh0 Ym94KTt9CmNvbnRleHQuZGF0YS4kdGV4dGJveC5mb2N1cygpO30pLm1vdXNlbW92 ZShmdW5jdGlvbihlKXtjb250ZXh0LmRhdGEuc2VsZWN0ZWRXaXRoTW91c2U9dHJ1 ZTskLnN1Z2dlc3Rpb25zLmhpZ2hsaWdodChjb250ZXh0LCQoZS50YXJnZXQpLmNs b3Nlc3QoJy5zdWdnZXN0aW9ucy1zcGVjaWFsJyksZmFsc2UpO30pKS5hcHBlbmRU bygkKCdib2R5JykpOyQodGhpcykuYXR0cignYXV0b2NvbXBsZXRlJywnb2ZmJyku a2V5ZG93bihmdW5jdGlvbihlKXtjb250ZXh0LmRhdGEua2V5cHJlc3NlZD0oZS5r ZXlDb2RlPT11bmRlZmluZWQpP2Uud2hpY2g6ZS5rZXlDb2RlO2NvbnRleHQuZGF0 YS5rZXlwcmVzc2VkQ291bnQ9MDtzd2l0Y2goY29udGV4dC5kYXRhLmtleXByZXNz ZWQpe2Nhc2UgNDA6ZS5wcmV2ZW50RGVmYXVsdCgpO2Uuc3RvcEltbWVkaWF0ZVBy b3BhZ2F0aW9uKCk7YnJlYWs7Y2FzZSAzODpjYXNlIDI3OmNhc2UgMTM6aWYoY29u dGV4dC5kYXRhLiRjb250YWluZXIuaXMoJzp2aXNpYmxlJykpe2UucHJldmVudERl ZmF1bHQoKTtlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO319fSkua2V5cHJl c3MoZnVuY3Rpb24oZSl7Y29udGV4dC5kYXRhLmtleXByZXNzZWRDb3VudCsrOyQu c3VnZ2VzdGlvbnMua2V5cHJlc3MoZSxjb250ZXh0LGNvbnRleHQuZGF0YS5rZXlw cmVzc2VkKTt9KS5rZXl1cChmdW5jdGlvbihlKXtpZihjb250ZXh0LmRhdGEua2V5 cHJlc3NlZENvdW50PT0wKXskLnN1Z2dlc3Rpb25zLmtleXByZXNzKGUsY29udGV4 dCxjb250ZXh0LmRhdGEua2V5cHJlc3NlZCk7fX0pLmJsdXIoZnVuY3Rpb24oKXtp Zihjb250ZXh0LmRhdGEubW91c2VEb3duT24ubGVuZ3RoPjApe3JldHVybjt9CmNv bnRleHQuZGF0YS4kY29udGFpbmVyLmhpZGUoKTskLnN1Z2dlc3Rpb25zLmNhbmNl bChjb250ZXh0KTt9KTt9CiQodGhpcykuZGF0YSgnc3VnZ2VzdGlvbnMtY29udGV4 dCcsY29udGV4dCk7fSk7cmV0dXJuIHJldHVyblZhbHVlIT09bnVsbD9yZXR1cm5W YWx1ZTokKHRoaXMpO307fSkoalF1ZXJ5KTsoZnVuY3Rpb24oJCl7JC5mbi50ZXh0 U2VsZWN0aW9uPWZ1bmN0aW9uKGNvbW1hbmQsb3B0aW9ucyl7dmFyIGZuPXtnZXRD b250ZW50czpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbCgpO30sZ2V0U2VsZWN0 aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXQoMCk7dmFyIHJldHZhbD0nJztp ZigkKGUpLmlzKCc6aGlkZGVuJykpe31lbHNlIGlmKGRvY3VtZW50LnNlbGVjdGlv biYmZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKXtlLmZvY3VzKCk7dmFy IHJhbmdlPWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO3JldHZhbD1y YW5nZS50ZXh0O31lbHNlIGlmKGUuc2VsZWN0aW9uU3RhcnR8fGUuc2VsZWN0aW9u U3RhcnQ9PScwJyl7cmV0dmFsPWUudmFsdWUuc3Vic3RyaW5nKGUuc2VsZWN0aW9u U3RhcnQsZS5zZWxlY3Rpb25FbmQpO30KcmV0dXJuIHJldHZhbDt9LGVuY2Fwc3Vs YXRlU2VsZWN0aW9uOmZ1bmN0aW9uKG9wdGlvbnMpe3JldHVybiB0aGlzLmVhY2go ZnVuY3Rpb24oKXtmdW5jdGlvbiBjaGVja1NlbGVjdGVkVGV4dCgpe2lmKCFzZWxU ZXh0KXtzZWxUZXh0PW9wdGlvbnMucGVyaTtpc1NhbXBsZT10cnVlO31lbHNlIGlm KG9wdGlvbnMucmVwbGFjZSl7c2VsVGV4dD1vcHRpb25zLnBlcmk7fWVsc2UgaWYo c2VsVGV4dC5jaGFyQXQoc2VsVGV4dC5sZW5ndGgtMSk9PScgJyl7c2VsVGV4dD1z ZWxUZXh0LnN1YnN0cmluZygwLHNlbFRleHQubGVuZ3RoLTEpO29wdGlvbnMucG9z dCs9JyAnO319CnZhciBpc1NhbXBsZT1mYWxzZTtpZih0aGlzLnN0eWxlLmRpc3Bs YXk9PSdub25lJyl7fWVsc2UgaWYodGhpcy5zZWxlY3Rpb25TdGFydHx8dGhpcy5z ZWxlY3Rpb25TdGFydD09JzAnKXskKHRoaXMpLmZvY3VzKCk7dmFyIHNlbFRleHQ9 JCh0aGlzKS50ZXh0U2VsZWN0aW9uKCdnZXRTZWxlY3Rpb24nKTt2YXIgc3RhcnRQ b3M9dGhpcy5zZWxlY3Rpb25TdGFydDt2YXIgZW5kUG9zPXRoaXMuc2VsZWN0aW9u RW5kO3ZhciBzY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3A7Y2hlY2tTZWxlY3RlZFRl eHQoKTtpZihvcHRpb25zLm93bmxpbmUpe2lmKHN0YXJ0UG9zIT0wJiZ0aGlzLnZh bHVlLmNoYXJBdChzdGFydFBvcy0xKSE9IlxuIil7b3B0aW9ucy5wcmU9IlxuIitv cHRpb25zLnByZTt9CmlmKHRoaXMudmFsdWUuY2hhckF0KGVuZFBvcykhPSJcbiIp e29wdGlvbnMucG9zdCs9IlxuIjt9fQp0aGlzLnZhbHVlPXRoaXMudmFsdWUuc3Vi c3RyaW5nKDAsc3RhcnRQb3MpK29wdGlvbnMucHJlK3NlbFRleHQrb3B0aW9ucy5w b3N0Kwp0aGlzLnZhbHVlLnN1YnN0cmluZyhlbmRQb3MsdGhpcy52YWx1ZS5sZW5n dGgpO3RoaXMuc2Nyb2xsVG9wPXNjcm9sbFRvcDtpZih3aW5kb3cub3BlcmEpe29w dGlvbnMucHJlPW9wdGlvbnMucHJlLnJlcGxhY2UoL1xyP1xuL2csIlxyXG4iKTtz ZWxUZXh0PXNlbFRleHQucmVwbGFjZSgvXHI/XG4vZywiXHJcbiIpO29wdGlvbnMu cG9zdD1vcHRpb25zLnBvc3QucmVwbGFjZSgvXHI/XG4vZywiXHJcbiIpO30KaWYo aXNTYW1wbGUmJm9wdGlvbnMuc2VsZWN0UGVyaSl7dGhpcy5zZWxlY3Rpb25TdGFy dD1zdGFydFBvcytvcHRpb25zLnByZS5sZW5ndGg7dGhpcy5zZWxlY3Rpb25FbmQ9 c3RhcnRQb3Mrb3B0aW9ucy5wcmUubGVuZ3RoK3NlbFRleHQubGVuZ3RoO31lbHNl e3RoaXMuc2VsZWN0aW9uU3RhcnQ9c3RhcnRQb3Mrb3B0aW9ucy5wcmUubGVuZ3Ro K3NlbFRleHQubGVuZ3RoKwpvcHRpb25zLnBvc3QubGVuZ3RoO3RoaXMuc2VsZWN0 aW9uRW5kPXRoaXMuc2VsZWN0aW9uU3RhcnQ7fX1lbHNlIGlmKGRvY3VtZW50LnNl bGVjdGlvbiYmZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKXskKHRoaXMp LmZvY3VzKCk7aWYoY29udGV4dCl7Y29udGV4dC5mbi5yZXN0b3JlU3R1ZmZGb3JJ RSgpO30KdmFyIHNlbFRleHQ9JCh0aGlzKS50ZXh0U2VsZWN0aW9uKCdnZXRTZWxl Y3Rpb24nKTt2YXIgc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wO3ZhciByYW5nZT1k b2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtpZihvcHRpb25zLm93bmxp bmUmJnJhbmdlLm1vdmVTdGFydCl7dmFyIHJhbmdlMj1kb2N1bWVudC5zZWxlY3Rp b24uY3JlYXRlUmFuZ2UoKTtyYW5nZTIuY29sbGFwc2UoKTtyYW5nZTIubW92ZVN0 YXJ0KCdjaGFyYWN0ZXInLC0xKTtpZihyYW5nZTIudGV4dCE9IlxyIiYmcmFuZ2Uy LnRleHQhPSJcbiImJnJhbmdlMi50ZXh0IT0iIil7b3B0aW9ucy5wcmU9IlxuIitv cHRpb25zLnByZTt9CnZhciByYW5nZTM9ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0 ZVJhbmdlKCk7cmFuZ2UzLmNvbGxhcHNlKGZhbHNlKTtyYW5nZTMubW92ZUVuZCgn Y2hhcmFjdGVyJywxKTtpZihyYW5nZTMudGV4dCE9IlxyIiYmcmFuZ2UzLnRleHQh PSJcbiImJnJhbmdlMy50ZXh0IT0iIil7b3B0aW9ucy5wb3N0Kz0iXG4iO319CmNo ZWNrU2VsZWN0ZWRUZXh0KCk7cmFuZ2UudGV4dD1vcHRpb25zLnByZStzZWxUZXh0 K29wdGlvbnMucG9zdDtpZihpc1NhbXBsZSYmb3B0aW9ucy5zZWxlY3RQZXJpJiZy YW5nZS5tb3ZlU3RhcnQpe3JhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywtb3B0 aW9ucy5wb3N0Lmxlbmd0aC1zZWxUZXh0Lmxlbmd0aCk7cmFuZ2UubW92ZUVuZCgn Y2hhcmFjdGVyJywtb3B0aW9ucy5wb3N0Lmxlbmd0aCk7fQpyYW5nZS5zZWxlY3Qo KTt0aGlzLnNjcm9sbFRvcD1zY3JvbGxUb3A7fQokKHRoaXMpLnRyaWdnZXIoJ2Vu Y2Fwc3VsYXRlU2VsZWN0aW9uJyxbb3B0aW9ucy5wcmUsb3B0aW9ucy5wZXJpLG9w dGlvbnMucG9zdCxvcHRpb25zLm93bmxpbmUsb3B0aW9ucy5yZXBsYWNlXSk7fSk7 fSxnZXRDYXJldFBvc2l0aW9uOmZ1bmN0aW9uKG9wdGlvbnMpe2Z1bmN0aW9uIGdl dENhcmV0KGUpe3ZhciBjYXJldFBvcz0wLGVuZFBvcz0wO2lmKCQuYnJvd3Nlci5t c2llKXt2YXIgcHJlRmluaXNoZWQ9ZmFsc2U7dmFyIHBlcmlGaW5pc2hlZD1mYWxz ZTt2YXIgcG9zdEZpbmlzaGVkPWZhbHNlO3ZhciBwcmVUZXh0LHJhd1ByZVRleHQs cGVyaVRleHQ7dmFyIHJhd1BlcmlUZXh0LHBvc3RUZXh0LHJhd1Bvc3RUZXh0O3Zh ciBwZXJpUmFuZ2U9ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuZHVw bGljYXRlKCk7dmFyIHByZVJhbmdlPWRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJh bmdlKCk7cHJlUmFuZ2UubW92ZVRvRWxlbWVudFRleHQoZSk7cHJlUmFuZ2Uuc2V0 RW5kUG9pbnQoIkVuZFRvU3RhcnQiLHBlcmlSYW5nZSk7dmFyIHBvc3RSYW5nZT1k b2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO3Bvc3RSYW5nZS5tb3ZlVG9F bGVtZW50VGV4dChlKTtwb3N0UmFuZ2Uuc2V0RW5kUG9pbnQoIlN0YXJ0VG9FbmQi LHBlcmlSYW5nZSk7cHJlVGV4dD1yYXdQcmVUZXh0PXByZVJhbmdlLnRleHQ7cGVy aVRleHQ9cmF3UGVyaVRleHQ9cGVyaVJhbmdlLnRleHQ7cG9zdFRleHQ9cmF3UG9z dFRleHQ9cG9zdFJhbmdlLnRleHQ7ZG97aWYoIXByZUZpbmlzaGVkKXtpZihwcmVS YW5nZS5jb21wYXJlRW5kUG9pbnRzKCJTdGFydFRvRW5kIixwcmVSYW5nZSk9PTAp e3ByZUZpbmlzaGVkPXRydWU7fWVsc2V7cHJlUmFuZ2UubW92ZUVuZCgiY2hhcmFj dGVyIiwtMSkKaWYocHJlUmFuZ2UudGV4dD09cHJlVGV4dCl7cmF3UHJlVGV4dCs9 IlxyXG4iO31lbHNle3ByZUZpbmlzaGVkPXRydWU7fX19CmlmKCFwZXJpRmluaXNo ZWQpe2lmKHBlcmlSYW5nZS5jb21wYXJlRW5kUG9pbnRzKCJTdGFydFRvRW5kIixw ZXJpUmFuZ2UpPT0wKXtwZXJpRmluaXNoZWQ9dHJ1ZTt9ZWxzZXtwZXJpUmFuZ2Uu bW92ZUVuZCgiY2hhcmFjdGVyIiwtMSkKaWYocGVyaVJhbmdlLnRleHQ9PXBlcmlU ZXh0KXtyYXdQZXJpVGV4dCs9IlxyXG4iO31lbHNle3BlcmlGaW5pc2hlZD10cnVl O319fQppZighcG9zdEZpbmlzaGVkKXtpZihwb3N0UmFuZ2UuY29tcGFyZUVuZFBv aW50cygiU3RhcnRUb0VuZCIscG9zdFJhbmdlKT09MCl7cG9zdEZpbmlzaGVkPXRy dWU7fWVsc2V7cG9zdFJhbmdlLm1vdmVFbmQoImNoYXJhY3RlciIsLTEpCmlmKHBv c3RSYW5nZS50ZXh0PT1wb3N0VGV4dCl7cmF3UG9zdFRleHQrPSJcclxuIjt9ZWxz ZXtwb3N0RmluaXNoZWQ9dHJ1ZTt9fX19d2hpbGUoKCFwcmVGaW5pc2hlZHx8IXBl cmlGaW5pc2hlZHx8IXBvc3RGaW5pc2hlZCkpO2NhcmV0UG9zPXJhd1ByZVRleHQu cmVwbGFjZSgvXHJcbi9nLCJcbiIpLmxlbmd0aDtlbmRQb3M9Y2FyZXRQb3MrcmF3 UGVyaVRleHQucmVwbGFjZSgvXHJcbi9nLCJcbiIpLmxlbmd0aDt9ZWxzZSBpZihl LnNlbGVjdGlvblN0YXJ0fHxlLnNlbGVjdGlvblN0YXJ0PT0nMCcpe2NhcmV0UG9z PWUuc2VsZWN0aW9uU3RhcnQ7ZW5kUG9zPWUuc2VsZWN0aW9uRW5kO30KcmV0dXJu IG9wdGlvbnMuc3RhcnRBbmRFbmQ/W2NhcmV0UG9zLGVuZFBvc106Y2FyZXRQb3M7 fQpyZXR1cm4gZ2V0Q2FyZXQodGhpcy5nZXQoMCkpO30sc2V0U2VsZWN0aW9uOmZ1 bmN0aW9uKG9wdGlvbnMpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZigk KHRoaXMpLmlzKCc6aGlkZGVuJykpe31lbHNlIGlmKHRoaXMuc2VsZWN0aW9uU3Rh cnR8fHRoaXMuc2VsZWN0aW9uU3RhcnQ9PScwJyl7aWYob3B0aW9ucy5zdGFydD50 aGlzLnNlbGVjdGlvbkVuZCl7dGhpcy5zZWxlY3Rpb25FbmQ9b3B0aW9ucy5lbmQ7 dGhpcy5zZWxlY3Rpb25TdGFydD1vcHRpb25zLnN0YXJ0O31lbHNle3RoaXMuc2Vs ZWN0aW9uU3RhcnQ9b3B0aW9ucy5zdGFydDt0aGlzLnNlbGVjdGlvbkVuZD1vcHRp b25zLmVuZDt9fWVsc2UgaWYoZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2Up e3ZhciBzZWxlY3Rpb249ZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTtz ZWxlY3Rpb24ubW92ZVRvRWxlbWVudFRleHQodGhpcyk7dmFyIGxlbmd0aD10aGlz LnZhbHVlLmxlbmd0aDt2YXIgbmV3TGluZXM9dGhpcy52YWx1ZS5tYXRjaCgvXG4v Zyk7aWYobmV3TGluZXMpbGVuZ3RoPWxlbmd0aC1uZXdMaW5lcy5sZW5ndGg7c2Vs ZWN0aW9uLm1vdmVTdGFydCgnY2hhcmFjdGVyJyxvcHRpb25zLnN0YXJ0KTtzZWxl Y3Rpb24ubW92ZUVuZCgnY2hhcmFjdGVyJywtbGVuZ3RoK29wdGlvbnMuZW5kKTt0 cnl7c2VsZWN0aW9uLnNlbGVjdCgpO31jYXRjaChlKXt9fX0pO30sc2Nyb2xsVG9D YXJldFBvc2l0aW9uOmZ1bmN0aW9uKG9wdGlvbnMpe2Z1bmN0aW9uIGdldExpbmVM ZW5ndGgoZSl7cmV0dXJuIE1hdGguZmxvb3IoZS5zY3JvbGxXaWR0aC8oJC5vcy5u YW1lPT0nbGludXgnPzc6OCkpO30KZnVuY3Rpb24gZ2V0Q2FyZXRTY3JvbGxQb3Np dGlvbihlKXt2YXIgdGV4dD1lLnZhbHVlLnJlcGxhY2UoL1xyL2csIiIpO3ZhciBj YXJldD0kKGUpLnRleHRTZWxlY3Rpb24oJ2dldENhcmV0UG9zaXRpb24nKTt2YXIg bGluZUxlbmd0aD1nZXRMaW5lTGVuZ3RoKGUpO3ZhciByb3c9MDt2YXIgY2hhcklu TGluZT0wO3ZhciBsYXN0U3BhY2VJbkxpbmU9MDtmb3IoaT0wO2k8Y2FyZXQ7aSsr KXtjaGFySW5MaW5lKys7aWYodGV4dC5jaGFyQXQoaSk9PSIgIil7bGFzdFNwYWNl SW5MaW5lPWNoYXJJbkxpbmU7fWVsc2UgaWYodGV4dC5jaGFyQXQoaSk9PSJcbiIp e2xhc3RTcGFjZUluTGluZT0wO2NoYXJJbkxpbmU9MDtyb3crKzt9CmlmKGNoYXJJ bkxpbmU+bGluZUxlbmd0aCl7aWYobGFzdFNwYWNlSW5MaW5lPjApe2NoYXJJbkxp bmU9Y2hhckluTGluZS1sYXN0U3BhY2VJbkxpbmU7bGFzdFNwYWNlSW5MaW5lPTA7 cm93Kys7fX19CnZhciBuZXh0U3BhY2U9MDtmb3Ioaj1jYXJldDtqPGNhcmV0K2xp bmVMZW5ndGg7aisrKXtpZih0ZXh0LmNoYXJBdChqKT09IiAifHx0ZXh0LmNoYXJB dChqKT09IlxuInx8Y2FyZXQ9PXRleHQubGVuZ3RoKXtuZXh0U3BhY2U9ajticmVh azt9fQppZihuZXh0U3BhY2U+bGluZUxlbmd0aCYmY2FyZXQ8PWxpbmVMZW5ndGgp e2NoYXJJbkxpbmU9Y2FyZXQtbGFzdFNwYWNlSW5MaW5lO3JvdysrO30KcmV0dXJu KCQub3MubmFtZT09J21hYyc/MTM6KCQub3MubmFtZT09J2xpbnV4Jz8xNToxNikp KnJvdzt9CnJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZigkKHRoaXMpLmlz KCc6aGlkZGVuJykpe31lbHNlIGlmKHRoaXMuc2VsZWN0aW9uU3RhcnR8fHRoaXMu c2VsZWN0aW9uU3RhcnQ9PScwJyl7dmFyIHNjcm9sbD1nZXRDYXJldFNjcm9sbFBv c2l0aW9uKHRoaXMpO2lmKG9wdGlvbnMuZm9yY2V8fHNjcm9sbDwkKHRoaXMpLnNj cm9sbFRvcCgpfHxzY3JvbGw+JCh0aGlzKS5zY3JvbGxUb3AoKSskKHRoaXMpLmhl aWdodCgpKQokKHRoaXMpLnNjcm9sbFRvcChzY3JvbGwpO31lbHNlIGlmKGRvY3Vt ZW50LnNlbGVjdGlvbiYmZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKXt2 YXIgcmFuZ2U9ZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTt2YXIgc2F2 ZWRSYW5nZT1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTt2YXIgcG9z PSQodGhpcykudGV4dFNlbGVjdGlvbignZ2V0Q2FyZXRQb3NpdGlvbicpO3ZhciBv bGRTY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3A7cmFuZ2UubW92ZVRvRWxlbWVudFRl eHQodGhpcyk7cmFuZ2UuY29sbGFwc2UoKTtyYW5nZS5tb3ZlKCdjaGFyYWN0ZXIn LHBvcysxKTtyYW5nZS5zZWxlY3QoKTtpZih0aGlzLnNjcm9sbFRvcCE9b2xkU2Ny b2xsVG9wKQp0aGlzLnNjcm9sbFRvcCs9cmFuZ2Uub2Zmc2V0VG9wO2Vsc2UgaWYo b3B0aW9ucy5mb3JjZSl7cmFuZ2UubW92ZSgnY2hhcmFjdGVyJywtMSk7cmFuZ2Uu c2VsZWN0KCk7fQpzYXZlZFJhbmdlLnNlbGVjdCgpO30KJCh0aGlzKS50cmlnZ2Vy KCdzY3JvbGxUb1Bvc2l0aW9uJyk7fSk7fX07c3dpdGNoKGNvbW1hbmQpe2Nhc2Un ZW5jYXBzdWxhdGVTZWxlY3Rpb24nOm9wdGlvbnM9JC5leHRlbmQoeydwcmUnOicn LCdwZXJpJzonJywncG9zdCc6JycsJ293bmxpbmUnOmZhbHNlLCdyZXBsYWNlJzpm YWxzZSwnc2VsZWN0UGVyaSc6dHJ1ZX0sb3B0aW9ucyk7YnJlYWs7Y2FzZSdnZXRD YXJldFBvc2l0aW9uJzpvcHRpb25zPSQuZXh0ZW5kKHsnc3RhcnRBbmRFbmQnOmZh bHNlfSxvcHRpb25zKTticmVhaztjYXNlJ3NldFNlbGVjdGlvbic6b3B0aW9ucz0k LmV4dGVuZCh7J3N0YXJ0Jzp1bmRlZmluZWQsJ2VuZCc6dW5kZWZpbmVkLCdzdGFy dENvbnRhaW5lcic6dW5kZWZpbmVkLCdlbmRDb250YWluZXInOnVuZGVmaW5lZH0s b3B0aW9ucyk7aWYob3B0aW9ucy5lbmQ9PT11bmRlZmluZWQpCm9wdGlvbnMuZW5k PW9wdGlvbnMuc3RhcnQ7aWYob3B0aW9ucy5lbmRDb250YWluZXI9PXVuZGVmaW5l ZCkKb3B0aW9ucy5lbmRDb250YWluZXI9b3B0aW9ucy5zdGFydENvbnRhaW5lcjti cmVhaztjYXNlJ3Njcm9sbFRvQ2FyZXRQb3NpdGlvbic6b3B0aW9ucz0kLmV4dGVu ZCh7J2ZvcmNlJzpmYWxzZX0sb3B0aW9ucyk7YnJlYWs7fQp2YXIgY29udGV4dD0k KHRoaXMpLmRhdGEoJ3dpa2lFZGl0b3ItY29udGV4dCcpO3ZhciBoYXNJZnJhbWU9 dHlwZW9mIGNvbnRleHQ9PT0nb2JqZWN0JyYmY29udGV4dCYmdHlwZW9mIGNvbnRl eHQuJGlmcmFtZSE9PSd1bmRlZmluZWQnO3ZhciBuZWVkU2F2ZT1mYWxzZTtpZiho YXNJZnJhbWUmJmNvbnRleHQuc2F2ZWRTZWxlY3Rpb24hPT1udWxsKXtjb250ZXh0 LmZuLnJlc3RvcmVTZWxlY3Rpb24oKTtuZWVkU2F2ZT10cnVlO30KcmV0dmFsPSho YXNJZnJhbWU/Y29udGV4dC5mbjpmbilbY29tbWFuZF0uY2FsbCh0aGlzLG9wdGlv bnMpO2lmKGhhc0lmcmFtZSYmbmVlZFNhdmUpe2NvbnRleHQuZm4uc2F2ZVNlbGVj dGlvbigpO30KcmV0dXJuIHJldHZhbDt9O30pKGpRdWVyeSk7KGZ1bmN0aW9uKCQp eyQud2lraUVkaXRvcj17J21vZHVsZXMnOnt9LCdpbnN0YW5jZXMnOltdLCdicm93 c2Vycyc6eydsdHInOnsnbXNpZSc6W1snPj0nLDddXSwnZmlyZWZveCc6W1snPj0n LDJdXSwnb3BlcmEnOltbJz49Jyw5LjZdXSwnc2FmYXJpJzpbWyc+PScsM11dLCdj aHJvbWUnOltbJz49JywzXV0sJ25ldHNjYXBlJzpbWyc+PScsOV1dLCdibGFja2Jl cnJ5JzpmYWxzZSwnaXBvZCc6ZmFsc2UsJ2lwaG9uZSc6ZmFsc2V9LCdydGwnOnsn bXNpZSc6W1snPj0nLDhdXSwnZmlyZWZveCc6W1snPj0nLDJdXSwnb3BlcmEnOltb Jz49Jyw5LjZdXSwnc2FmYXJpJzpbWyc+PScsM11dLCdjaHJvbWUnOltbJz49Jywz XV0sJ25ldHNjYXBlJzpbWyc+PScsOV1dLCdibGFja2JlcnJ5JzpmYWxzZSwnaXBv ZCc6ZmFsc2UsJ2lwaG9uZSc6ZmFsc2V9fSwnaW1nUGF0aCc6d2dTY3JpcHRQYXRo KycvZXh0ZW5zaW9ucy9Vc2FiaWxpdHlJbml0aWF0aXZlL2ltYWdlcy93aWtpRWRp dG9yLycsJ2lzU3VwcG9ydGVkJzpmdW5jdGlvbihtb2R1bGUpe2lmKG1vZHVsZSYm dHlwZW9mIG1vZHVsZS5uYW1lIT0ndW5kZWZpbmVkJyYmKG1vZHVsZS5uYW1lPT0n dG9jJ3x8bW9kdWxlLm5hbWU9PSdoaWdobGlnaHQnKSYmdHlwZW9mIHdnUmVhbGx5 R2l2ZU1lVE9DPT0ndW5kZWZpbmVkJyl7cmV0dXJuIG1vZHVsZS5zdXBwb3J0ZWQ9 ZmFsc2U7fQp2YXIgbW9kPW1vZHVsZSYmJ2Jyb3dzZXJzJ2luIG1vZHVsZT9tb2R1 bGU6JC53aWtpRWRpdG9yO2lmKHR5cGVvZiBtb2Quc3VwcG9ydGVkIT09J3VuZGVm aW5lZCcpe3JldHVybiBtb2Quc3VwcG9ydGVkO30KcmV0dXJuIG1vZC5zdXBwb3J0 ZWQ9bXcudXNhYmlsaXR5LnRlc3RCcm93c2VyKG1vZC5icm93c2Vycyk7fSwnaXNS ZXF1aXJlZCc6ZnVuY3Rpb24obW9kdWxlLHJlcXVpcmVtZW50KXtpZih0eXBlb2Yg bW9kdWxlWydyZXEnXSE9PSd1bmRlZmluZWQnKXtmb3IocmVxIGluIG1vZHVsZVsn cmVxJ10pe2lmKG1vZHVsZVsncmVxJ11bcmVxXT09cmVxdWlyZW1lbnQpe3JldHVy biB0cnVlO319fQpyZXR1cm4gZmFsc2U7fSwnYXV0b01zZyc6ZnVuY3Rpb24ob2Jq ZWN0LHByb3BlcnR5KXtpZih0eXBlb2YgcHJvcGVydHk9PSdvYmplY3QnKXtmb3Io dmFyIGkgaW4gcHJvcGVydHkpe2lmKHByb3BlcnR5W2ldaW4gb2JqZWN0fHxwcm9w ZXJ0eVtpXSsnTXNnJ2luIG9iamVjdCl7cHJvcGVydHk9cHJvcGVydHlbaV07YnJl YWs7fX19CmlmKHByb3BlcnR5IGluIG9iamVjdCl7cmV0dXJuIG9iamVjdFtwcm9w ZXJ0eV07fWVsc2UgaWYocHJvcGVydHkrJ01zZydpbiBvYmplY3Qpe2lmKHR5cGVv ZiBvYmplY3RbcHJvcGVydHkrJ01zZyddPT0nb2JqZWN0Jyl7cmV0dXJuIG13LnVz YWJpbGl0eS5nZXRNc2cuYXBwbHkobXcudXNhYmlsaXR5LG9iamVjdFtwcm9wZXJ0 eSsnTXNnJ10pO31lbHNle3JldHVybiBtdy51c2FiaWxpdHkuZ2V0TXNnKG9iamVj dFtwcm9wZXJ0eSsnTXNnJ10pO319ZWxzZXtyZXR1cm4nJzt9fSwnYXV0b0xhbmcn OmZ1bmN0aW9uKG9iamVjdCxsYW5nKXtyZXR1cm4gb2JqZWN0W2xhbmd8fHdnVXNl ckxhbmd1YWdlXXx8b2JqZWN0WydkZWZhdWx0J118fG9iamVjdDt9LCdhdXRvSWNv bic6ZnVuY3Rpb24oaWNvbixwYXRoLGxhbmcpe3ZhciBzcmM9JC53aWtpRWRpdG9y LmF1dG9MYW5nKGljb24sbGFuZyk7cGF0aD1wYXRofHwkLndpa2lFZGl0b3IuaW1n UGF0aDtpZihzcmMuc3Vic3RyKDAsNykhPSdodHRwOi8vJyYmc3JjLnN1YnN0cigw LDgpIT0naHR0cHM6Ly8nJiZzcmNbMF0hPScvJyl7c3JjPXBhdGgrc3JjO30KcmV0 dXJuIHNyYysnPycrd2dXaWtpRWRpdG9ySWNvblZlcnNpb247fSwnYXV0b0ljb25P ck9mZnNldCc6ZnVuY3Rpb24oaWNvbixvZmZzZXQscGF0aCxsYW5nKXtsYW5nPWxh bmd8fHdnVXNlckxhbmd1YWdlO2lmKHR5cGVvZiBvZmZzZXQ9PSdvYmplY3QnJiZs YW5nIGluIG9mZnNldCl7cmV0dXJuIG9mZnNldFtsYW5nXTt9ZWxzZSBpZih0eXBl b2YgaWNvbj09J29iamVjdCcmJmxhbmcgaW4gaWNvbil7cmV0dXJuICQud2lraUVk aXRvci5hdXRvSWNvbihpY29uLHVuZGVmaW5lZCxsYW5nKTt9ZWxzZXtyZXR1cm4g JC53aWtpRWRpdG9yLmF1dG9MYW5nKG9mZnNldCxsYW5nKTt9fX07JC5mbi53aWtp RWRpdG9yPWZ1bmN0aW9uKCl7aWYoISRqLndpa2lFZGl0b3IuaXNTdXBwb3J0ZWQo KSl7cmV0dXJuICQodGhpcyk7fQp2YXIgY29udGV4dD0kKHRoaXMpLmRhdGEoJ3dp a2lFZGl0b3ItY29udGV4dCcpO2lmKCFjb250ZXh0fHx0eXBlb2YgY29udGV4dD09 J3VuZGVmaW5lZCcpe2NvbnRleHQ9eyckdGV4dGFyZWEnOiQodGhpcyksJ3ZpZXdz Jzp7fSwnbW9kdWxlcyc6e30sJ2RhdGEnOnt9LCdpbnN0YW5jZSc6JC53aWtpRWRp dG9yLmluc3RhbmNlcy5wdXNoKCQodGhpcykpLTEsJ29mZnNldHMnOm51bGwsJ2h0 bWxUb1RleHRNYXAnOnt9LCdvbGRIVE1MJzpudWxsLCdvbGREZWxheWVkSFRNTCc6 bnVsbCwnb2xkRGVsYXllZFNlbCc6bnVsbCwnc2F2ZWRTZWxlY3Rpb24nOm51bGws J2hpc3RvcnknOltdLCdoaXN0b3J5UG9zaXRpb24nOi0xLCdvbGREZWxheWVkSGlz dG9yeVBvc2l0aW9uJzotMX07Y29udGV4dC5hcGk9eydhZGRNb2R1bGUnOmZ1bmN0 aW9uKGNvbnRleHQsZGF0YSl7dmFyIG1vZHVsZXM9e307aWYodHlwZW9mIGRhdGE9 PSdzdHJpbmcnKXttb2R1bGVzW2RhdGFdPXt9O31lbHNlIGlmKHR5cGVvZiBkYXRh PT0nb2JqZWN0Jyl7bW9kdWxlcz1kYXRhO30KZm9yKHZhciBtb2R1bGUgaW4gbW9k dWxlcyl7aWYodHlwZW9mIG1vZHVsZT09J3N0cmluZycmJiQud2lraUVkaXRvci5p c1N1cHBvcnRlZCgkLndpa2lFZGl0b3IubW9kdWxlc1ttb2R1bGVdKSl7aWYoJ2Fw aSdpbiAkLndpa2lFZGl0b3IubW9kdWxlc1ttb2R1bGVdKXtmb3IodmFyIGNhbGwg aW4gJC53aWtpRWRpdG9yLm1vZHVsZXNbbW9kdWxlXS5hcGkpe2lmKCEoY2FsbCBp biBjb250ZXh0LmFwaSkpe2NvbnRleHQuYXBpW2NhbGxdPSQud2lraUVkaXRvci5t b2R1bGVzW21vZHVsZV0uYXBpW2NhbGxdO319fQppZignZm4naW4gJC53aWtpRWRp dG9yLm1vZHVsZXNbbW9kdWxlXSYmJ2NyZWF0ZSdpbiAkLndpa2lFZGl0b3IubW9k dWxlc1ttb2R1bGVdLmZuKXtjb250ZXh0Lm1vZHVsZXNbbW9kdWxlXT17fTskLndp a2lFZGl0b3IubW9kdWxlc1ttb2R1bGVdLmZuLmNyZWF0ZShjb250ZXh0LG1vZHVs ZXNbbW9kdWxlXSk7fX19fX07Y29udGV4dC5ldnQ9eydrZXlkb3duJzpmdW5jdGlv bihldmVudCl7c3dpdGNoKGV2ZW50LndoaWNoKXtjYXNlIDk6aWYoZXZlbnQuY3Ry bEtleXx8ZXZlbnQuYWx0S2V5fHxldmVudC5zaGlmdEtleSl7cmV0dXJuIHRydWU7 fWVsc2V7dmFyICR0YWJpbmRleExpc3Q9JGooJ1t0YWJpbmRleF06dmlzaWJsZScp LnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS50YWJJbmRleC1iLnRhYkluZGV4 O30pO2Zvcih2YXIgaT0wO2k8JHRhYmluZGV4TGlzdC5sZW5ndGg7aSsrKXtpZigk dGFiaW5kZXhMaXN0LmVxKGkpLmF0dHIoJ2lkJyk9PWNvbnRleHQuJGlmcmFtZS5h dHRyKCdpZCcpKXskdGFiaW5kZXhMaXN0LmdldChpKzEpLmZvY3VzKCk7YnJlYWs7 fX0KcmV0dXJuIGZhbHNlO30KYnJlYWs7Y2FzZSA4NjppZihldmVudC5jdHJsS2V5 JiYkLmJyb3dzZXIubXNpZSl7Y29udGV4dC5ldnQucGFzdGUoZXZlbnQpO30KYnJl YWs7fQpyZXR1cm4gdHJ1ZTt9LCdjaGFuZ2UnOmZ1bmN0aW9uKGV2ZW50KXtldmVu dC5kYXRhLnNjb3BlPSdkaXZpc2lvbic7dmFyIG5ld0hUTUw9Y29udGV4dC4kY29u dGVudC5odG1sKCk7aWYoY29udGV4dC5vbGRIVE1MIT1uZXdIVE1MKXtjb250ZXh0 LmZuLnB1cmdlT2Zmc2V0cygpO2NvbnRleHQub2xkSFRNTD1uZXdIVE1MO2V2ZW50 LmRhdGEuc2NvcGU9J3JlYWxjaGFuZ2UnO30KaWYoY29udGV4dC4kY29udGVudC5j aGlsZHJlbigpLmxlbmd0aD09MCl7Y29udGV4dC4kY29udGVudC5hcHBlbmQoJzxw PjwvcD4nKTt9CnJldHVybiB0cnVlO30sJ2RlbGF5ZWRDaGFuZ2UnOmZ1bmN0aW9u KGV2ZW50KXtldmVudC5kYXRhLnNjb3BlPSdkaXZpc2lvbic7dmFyIG5ld0hUTUw9 Y29udGV4dC4kY29udGVudC5odG1sKCk7aWYoY29udGV4dC5vbGREZWxheWVkSFRN TCE9bmV3SFRNTCl7Y29udGV4dC5vbGREZWxheWVkSFRNTD1uZXdIVE1MO2V2ZW50 LmRhdGEuc2NvcGU9J3JlYWxjaGFuZ2UnO3ZhciBjdXJzb3JQb3M9Y29udGV4dC5m bi5nZXRDYXJldFBvc2l0aW9uKCk7dmFyIHQ9Y29udGV4dC5mbi5nZXRPZmZzZXQo Y3Vyc29yUG9zWzBdKTtpZighJC5icm93c2VyLm1zaWUmJnQmJnQubm9kZS5ub2Rl TmFtZT09JyN0ZXh0JyYmdC5ub2RlLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dl ckNhc2UoKT09J2JvZHknKXskKHQubm9kZSkud3JhcCgiPHA+PC9wPiIpO2NvbnRl eHQuZm4ucHVyZ2VPZmZzZXRzKCk7Y29udGV4dC5mbi5zZXRTZWxlY3Rpb24oe3N0 YXJ0OmN1cnNvclBvc1swXSxlbmQ6Y3Vyc29yUG9zWzFdfSk7fX0KY29udGV4dC5m bi51cGRhdGVIaXN0b3J5KGV2ZW50LmRhdGEuc2NvcGU9PSdyZWFsY2hhbmdlJyk7 cmV0dXJuIHRydWU7fSwnY3V0JzpmdW5jdGlvbihldmVudCl7c2V0VGltZW91dChm dW5jdGlvbigpe2NvbnRleHQuJGNvbnRlbnQuZmluZCgnYnInKS5lYWNoKGZ1bmN0 aW9uKCl7aWYoJCh0aGlzKS5wYXJlbnQoKS5pcygnYm9keScpKXskKHRoaXMpLndy YXAoJCgnPHA+PC9wPicpKTt9fSk7fSwxMDApO3JldHVybiB0cnVlO30sJ3Bhc3Rl JzpmdW5jdGlvbihldmVudCl7dmFyIGN1cnNvclBvcz1jb250ZXh0LmZuLmdldENh cmV0UG9zaXRpb24oKTt2YXIgb2Zmc2V0PTA7dmFyIG9sZExlbmd0aD1jb250ZXh0 LmZuLmdldENvbnRlbnRzKCkubGVuZ3RoO2NvbnRleHQuJGNvbnRlbnQuZmluZCgn KicpLmFkZENsYXNzKCd3aWtpRWRpdG9yJyk7aWYoJC5sYXlvdXQubmFtZSE9PSd3 ZWJraXQnKXtjb250ZXh0LiRjb250ZW50LmFkZENsYXNzKCdwYXN0aW5nJyk7fQpz ZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Y29udGV4dC4kY29udGVudC5maW5kKCdzY3Jp cHQsc3R5bGUsaW1nLGlucHV0LHNlbGVjdCx0ZXh0YXJlYSxocixidXR0b24sbGlu ayxtZXRhJykucmVtb3ZlKCk7dmFyICRzZWxlY3Rpb249Y29udGV4dC4kY29udGVu dC5maW5kKCc6bm90KC53aWtpRWRpdG9yKScpO3ZhciBub2RlVG9EZWxldGU9W107 dmFyIGZpcnN0RGlydHlOb2RlO2lmKCRzZWxlY3Rpb24ubGVuZ3RoPT0wKXtmaXJz dERpcnR5Tm9kZT1jb250ZXh0LmZuLmdldE9mZnNldChjdXJzb3JQb3NbMF0pLm5v ZGU7fWVsc2V7Zmlyc3REaXJ0eU5vZGU9JHNlbGVjdGlvbi5lcSgwKVswXTt9Cndo aWxlKGZpcnN0RGlydHlOb2RlIT1udWxsKXt3aGlsZShmaXJzdERpcnR5Tm9kZS5w YXJlbnROb2RlLm5vZGVOYW1lIT0nQk9EWScmJiEkKGZpcnN0RGlydHlOb2RlLnBh cmVudE5vZGUpLmhhc0NsYXNzKCd3aWtpRWRpdG9yJykpe2ZpcnN0RGlydHlOb2Rl PWZpcnN0RGlydHlOb2RlLnBhcmVudE5vZGU7fQp3aGlsZShmaXJzdERpcnR5Tm9k ZS5wcmV2aW91c1NpYmxpbmchPW51bGwmJiEkKGZpcnN0RGlydHlOb2RlLnByZXZp b3VzU2libGluZykuaGFzQ2xhc3MoJ3dpa2lFZGl0b3InKSl7aWYoJChmaXJzdERp cnR5Tm9kZS5wcmV2aW91c1NpYmxpbmcpLmhhc0NsYXNzKCcjY29tbWVudCcpKXsk KGZpcnN0RGlydHlOb2RlKS5yZW1vdmUoKTt9ZWxzZXtmaXJzdERpcnR5Tm9kZT1m aXJzdERpcnR5Tm9kZS5wcmV2aW91c1NpYmxpbmc7fX0KdmFyICRsYXN0RGlydHlO b2RlPSQoZmlyc3REaXJ0eU5vZGUpO3ZhciBjYz1tYWtlQ29udGVudENvbGxlY3Rv cigkLmJyb3dzZXIsbnVsbCk7d2hpbGUoZmlyc3REaXJ0eU5vZGUhPW51bGwmJiEk KGZpcnN0RGlydHlOb2RlKS5oYXNDbGFzcygnd2lraUVkaXRvcicpKXtjYy5jb2xs ZWN0Q29udGVudChmaXJzdERpcnR5Tm9kZSk7Y2Mubm90aWZ5TmV4dE5vZGUoZmly c3REaXJ0eU5vZGUubmV4dFNpYmxpbmcpO3Bhc3RlZENvbnRlbnQ9Y2MuZ2V0TGlu ZXMoKTtpZigocGFzdGVkQ29udGVudC5sZW5ndGg8PTF8fHBhc3RlZENvbnRlbnRb cGFzdGVkQ29udGVudC5sZW5ndGgtMV0hPT0iIikmJmZpcnN0RGlydHlOb2RlLm5l eHRTaWJsaW5nKXtub2RlVG9EZWxldGUucHVzaChmaXJzdERpcnR5Tm9kZSk7Zmly c3REaXJ0eU5vZGU9Zmlyc3REaXJ0eU5vZGUubmV4dFNpYmxpbmc7Y2MuY29sbGVj dENvbnRlbnQoZmlyc3REaXJ0eU5vZGUpO2NjLm5vdGlmeU5leHROb2RlKGZpcnN0 RGlydHlOb2RlLm5leHRTaWJsaW5nKTt9Cm5vZGVUb0RlbGV0ZS5wdXNoKGZpcnN0 RGlydHlOb2RlKTtmaXJzdERpcnR5Tm9kZT1maXJzdERpcnR5Tm9kZS5uZXh0U2li bGluZzt9CnZhciBjY0RhdGE9Y2MuZmluaXNoKCk7dmFyIHBhc3RlZENvbnRlbnQ9 Y2NEYXRhLmxpbmVzO2lmKHBhc3RlZENvbnRlbnQubGVuZ3RoPT0wJiZmaXJzdERp cnR5Tm9kZSl7b2Zmc2V0Kz0kKGZpcnN0RGlydHlOb2RlKS50ZXh0KCkubGVuZ3Ro O30KaWYobm9kZVRvRGVsZXRlLmxlbmd0aD4wKXskbGFzdERpcnR5Tm9kZT0kKG5v ZGVUb0RlbGV0ZVtub2RlVG9EZWxldGUubGVuZ3RoLTFdKTt9CnZhciB0ZXN0VmFs PScnO3Rlc3RWYWw9JChub2RlVG9EZWxldGVbMF0pLnRleHQoKTt2YXIgcGFzdGVk UHJldHR5PScnO2Zvcih2YXIgaT0wO2k8cGFzdGVkQ29udGVudC5sZW5ndGg7aSsr KXtwYXN0ZWRQcmV0dHk9cGFzdGVkQ29udGVudFtpXS5yZXBsYWNlKC8mL2csJyZh bXA7JykucmVwbGFjZSgvPC9nLCcmbHQ7JykucmVwbGFjZSgvPi9nLCcmZ3Q7Jyku cmVwbGFjZSgvXHI/XG4vZywnXFxuJyk7bWF0Y2g9cGFzdGVkQ29udGVudFtpXS5t YXRjaCgvXltcc10rW15cc10vKTtpZihtYXRjaCE9bnVsbCYmbWF0Y2gubGVuZ3Ro PjApe2luZGV4PW1hdGNoWzBdLmxlbmd0aDtsZWFkaW5nU3BhY2U9bWF0Y2hbMF0u cmVwbGFjZSgvW1xzXS9nLCcmbmJzcDsnKTtwYXN0ZWRQcmV0dHk9bGVhZGluZ1Nw YWNlK3Bhc3RlZFByZXR0eS5zdWJzdHJpbmcoaW5kZXgscGFzdGVkUHJldHR5Lmxl bmd0aCk7fQokbmV3RWxlbWVudD0kKCc8cCBjbGFzcz0id2lraUVkaXRvciIgPjwv cD4nKTtpZihwYXN0ZWRQcmV0dHkpeyRuZXdFbGVtZW50Lmh0bWwoJzxzcGFuIGNs YXNzID0gIndpa2lFZGl0b3IiPicrcGFzdGVkUHJldHR5Kyc8L3NwYW4+Jyk7fWVs c2V7JG5ld0VsZW1lbnQuaHRtbCgnPGJyIGNsYXNzPSJ3aWtpRWRpdG9yIj4nKTt9 CiRuZXdFbGVtZW50Lmluc2VydEFmdGVyKCRsYXN0RGlydHlOb2RlKTtvZmZzZXQr PXBhc3RlZFByZXR0eS5sZW5ndGg7JGxhc3REaXJ0eU5vZGU9JG5ld0VsZW1lbnQ7 fQp3aGlsZShub2RlVG9EZWxldGUubGVuZ3RoPjApeyQobm9kZVRvRGVsZXRlLnBv cCgpKS5yZW1vdmUoKTt9CiRzZWxlY3Rpb249Y29udGV4dC4kY29udGVudC5maW5k KCc6bm90KC53aWtpRWRpdG9yKScpO2lmKCRzZWxlY3Rpb24ubGVuZ3RoPT0wKXtm aXJzdERpcnR5Tm9kZT1udWxsO31lbHNle2ZpcnN0RGlydHlOb2RlPSRzZWxlY3Rp b24uZXEoMClbMF07fX0KY29udGV4dC4kY29udGVudC5maW5kKCcud2lraUVkaXRv cicpLnJlbW92ZUNsYXNzKCd3aWtpRWRpdG9yJyk7dmFyIHJlc3RvcmVUbz1jdXJz b3JQb3NbMV0rb2Zmc2V0O2NvbnRleHQuZm4uc2V0U2VsZWN0aW9uKHtzdGFydDpy ZXN0b3JlVG8sZW5kOnJlc3RvcmVUb30pO30sMCk7cmV0dXJuIHRydWU7fSwncmVh ZHknOmZ1bmN0aW9uKGV2ZW50KXtjb250ZXh0Lmhpc3RvcnkucHVzaCh7J2h0bWwn OmNvbnRleHQuJGNvbnRlbnQuaHRtbCgpLCdzZWwnOmNvbnRleHQuZm4uZ2V0Q2Fy ZXRQb3NpdGlvbigpfSk7cmV0dXJuIHRydWU7fX07Y29udGV4dC5mbj17J3RyaWdn ZXInOmZ1bmN0aW9uKG5hbWUsZXZlbnQpe2lmKHR5cGVvZiBldmVudD09J3VuZGVm aW5lZCcpe2V2ZW50PXsndHlwZSc6J2N1c3RvbSd9O30KaWYodHlwZW9mIGV2ZW50 LmRhdGE9PSd1bmRlZmluZWQnKXtldmVudC5kYXRhPXt9O30KaWYobmFtZSBpbiBj b250ZXh0LmV2dCl7aWYoIWNvbnRleHQuZXZ0W25hbWVdKGV2ZW50KSl7cmV0dXJu IGZhbHNlO319CnZhciByZXR1cm5Gcm9tTW9kdWxlcz1udWxsO2Zvcih2YXIgbW9k dWxlIGluIGNvbnRleHQubW9kdWxlcyl7aWYobW9kdWxlIGluICQud2lraUVkaXRv ci5tb2R1bGVzJiYnZXZ0J2luICQud2lraUVkaXRvci5tb2R1bGVzW21vZHVsZV0m Jm5hbWUgaW4gJC53aWtpRWRpdG9yLm1vZHVsZXNbbW9kdWxlXS5ldnQpe3ZhciBy ZXQ9JC53aWtpRWRpdG9yLm1vZHVsZXNbbW9kdWxlXS5ldnRbbmFtZV0oY29udGV4 dCxldmVudCk7aWYocmV0IT1udWxsKXtpZihyZXR1cm5Gcm9tTW9kdWxlcz09bnVs bCl7cmV0dXJuRnJvbU1vZHVsZXM9cmV0O31lbHNle3JldHVybkZyb21Nb2R1bGVz PXJldHVybkZyb21Nb2R1bGVzJiZyZXQ7fX19fQppZihyZXR1cm5Gcm9tTW9kdWxl cyE9bnVsbCl7cmV0dXJuIHJldHVybkZyb21Nb2R1bGVzO31lbHNle3JldHVybiB0 cnVlO319LCdhZGRCdXR0b24nOmZ1bmN0aW9uKG9wdGlvbnMpe2NvbnRleHQuJGNv bnRyb2xzLnNob3coKTtjb250ZXh0LiRidXR0b25zLnNob3coKTtyZXR1cm4gJCgn PGJ1dHRvbiAvPicpLnRleHQoJC53aWtpRWRpdG9yLmF1dG9Nc2cob3B0aW9ucywn Y2FwdGlvbicpKS5jbGljayhvcHRpb25zLmFjdGlvbikuYXBwZW5kVG8oY29udGV4 dC4kYnV0dG9ucyk7fSwnYWRkVmlldyc6ZnVuY3Rpb24ob3B0aW9ucyl7ZnVuY3Rp b24gYWRkVGFiKG9wdGlvbnMpe2NvbnRleHQuJGNvbnRyb2xzLnNob3coKTtjb250 ZXh0LiR0YWJzLnNob3coKTtyZXR1cm4gJCgnPGRpdj48L2Rpdj4nKS5hdHRyKCdy ZWwnLCd3aWtpRWRpdG9yLXVpLXZpZXctJytvcHRpb25zLm5hbWUpLmFkZENsYXNz KGNvbnRleHQudmlldz09b3B0aW9ucy5uYW1lPydjdXJyZW50JzpudWxsKS5hcHBl bmQoJCgnPGE+PC9hPicpLmF0dHIoJ2hyZWYnLCcjJykubW91c2Vkb3duKGZ1bmN0 aW9uKCl7cmV0dXJuIGZhbHNlO30pLmNsaWNrKGZ1bmN0aW9uKGV2ZW50KXtjb250 ZXh0LiR1aS5maW5kKCcud2lraUVkaXRvci11aS12aWV3JykuaGlkZSgpO2NvbnRl eHQuJHVpLmZpbmQoJy4nKyQodGhpcykucGFyZW50KCkuYXR0cigncmVsJykpLnNo b3coKTtjb250ZXh0LiR0YWJzLmZpbmQoJ2RpdicpLnJlbW92ZUNsYXNzKCdjdXJy ZW50Jyk7JCh0aGlzKS5wYXJlbnQoKS5hZGRDbGFzcygnY3VycmVudCcpOyQodGhp cykuYmx1cigpO2lmKCdpbml0J2luIG9wdGlvbnMmJnR5cGVvZiBvcHRpb25zLmlu aXQ9PSdmdW5jdGlvbicpe29wdGlvbnMuaW5pdChjb250ZXh0KTt9CmV2ZW50LnBy ZXZlbnREZWZhdWx0KCk7cmV0dXJuIGZhbHNlO30pLnRleHQoJC53aWtpRWRpdG9y LmF1dG9Nc2cob3B0aW9ucywndGl0bGUnKSkpLmFwcGVuZFRvKGNvbnRleHQuJHRh YnMpO30KaWYoIWNvbnRleHQuJHRhYnMuY2hpbGRyZW4oKS5zaXplKCkpe2FkZFRh Yih7J25hbWUnOid3aWtpdGV4dCcsJ3RpdGxlTXNnJzond2lraWVkaXRvci13aWtp dGV4dC10YWInfSk7fQphZGRUYWIob3B0aW9ucyk7cmV0dXJuICQoJzxkaXY+PC9k aXY+JykuYWRkQ2xhc3MoJ3dpa2lFZGl0b3ItdWktdmlldyB3aWtpRWRpdG9yLXVp LXZpZXctJytvcHRpb25zLm5hbWUpLmhpZGUoKS5hcHBlbmRUbyhjb250ZXh0LiR1 aSk7fSwnaGlnaGxpZ2h0TGluZSc6ZnVuY3Rpb24oJGVsZW1lbnQsbW9kZSl7aWYo ISRlbGVtZW50LmlzKCdwJykpeyRlbGVtZW50PSRlbGVtZW50LmNsb3Nlc3QoJ3An KTt9CiRlbGVtZW50LmNzcygnYmFja2dyb3VuZENvbG9yJywnI0FBQ0NGRicpO3Nl dFRpbWVvdXQoZnVuY3Rpb24oKXskZWxlbWVudC5hbmltYXRlKHsnYmFja2dyb3Vu ZENvbG9yJzond2hpdGUnfSwnc2xvdycpO30sMTAwKTtzZXRUaW1lb3V0KGZ1bmN0 aW9uKCl7JGVsZW1lbnQuY3NzKCdiYWNrZ3JvdW5kQ29sb3InLCd3aGl0ZScpO30s MTAwMCk7fSwnaHRtbFRvVGV4dCc6ZnVuY3Rpb24oaHRtbCl7aWYoaHRtbCBpbiBj b250ZXh0Lmh0bWxUb1RleHRNYXApe3JldHVybiBjb250ZXh0Lmh0bWxUb1RleHRN YXBbaHRtbF07fQp2YXIgb3JpZ0hUTUw9aHRtbDtodG1sPWh0bWwucmVwbGFjZSgv XHI/XG4vZywiIikucmVwbGFjZSgvJm5ic3A7L2csIiAiKS5yZXBsYWNlKC9cPGJy W15cPl0qXD5cPFwvcFw+L2dpLCc8L3A+JykucmVwbGFjZSgvXDxcL3BcPlxzKlw8 cFteXD5dKlw+L2dpLCJcbiIpLnJlcGxhY2UoL1w8YnJbXlw+XSpcPi9naSwiXG4i KS5yZXBsYWNlKC9cPFwvcFw+KFxuKilcPHBbXlw+XSpcPi9naSwiJDFcbiIpLnJl cGxhY2UoL1w8cFteXD5dKlw+PHBbXlw+XSpcPi9naSwnPHA+JykucmVwbGFjZSgv XDxcL3BcPjxcL3BcPi9naSwnPC9wPicpO3ZhciBsZWFkaW5nPWh0bWwubWF0Y2go L15ccyovKVswXTt2YXIgdHJhaWxpbmc9aHRtbC5tYXRjaCgvXHMqJC8pWzBdO2h0 bWw9aHRtbC5zdWJzdHIobGVhZGluZy5sZW5ndGgsaHRtbC5sZW5ndGgtbGVhZGlu Zy5sZW5ndGgtdHJhaWxpbmcubGVuZ3RoKTt2YXIgJHByZT0kKCc8cHJlPicraHRt bCsnPC9wcmU+Jyk7JHByZS5maW5kKCcud2lraUVkaXRvci1ub2luY2x1ZGUnKS5l YWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmUoKTt9KTskcHJlLmZpbmQoJy53 aWtpRWRpdG9yLXRhYicpLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLnRleHQoIlx0 Iik7fSk7JHByZS5maW5kKCdicicpLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLnJl cGxhY2VXaXRoKCJcbiIpO30pOyRwcmUuZmluZCgncCcpLmVhY2goZnVuY3Rpb24o KXt2YXIgdGV4dD0kKHRoaXMpLnRleHQoKTt2YXIgdD1uZXcgY29udGV4dC5mbi5y YXdUcmF2ZXJzZXIodGhpcy5maXJzdENoaWxkLHRoaXMsJHByZS5nZXQoMCksdHJ1 ZSkucHJldigpO3doaWxlKHQmJnQubm9kZS5ub2RlTmFtZSE9JyN0ZXh0JyYmdC5u b2RlLm5vZGVOYW1lIT0nQlInJiZ0Lm5vZGUubm9kZU5hbWUhPSdQJyl7dD10LnBy ZXYoKTt9CmlmKHQpe3RleHQ9IlxuIit0ZXh0O30KdD1uZXcgY29udGV4dC5mbi5y YXdUcmF2ZXJzZXIodGhpcy5sYXN0Q2hpbGQsdGhpcywkcHJlLmdldCgwKSx0cnVl KS5uZXh0KCk7d2hpbGUodCYmdC5ub2RlLm5vZGVOYW1lIT0nI3RleHQnJiZ0Lm5v ZGUubm9kZU5hbWUhPSdCUicmJnQubm9kZS5ub2RlTmFtZSE9J1AnKXt0PXQubmV4 dCgpO30KaWYodCYmIXQuaW5QJiZ0Lm5vZGUubm9kZU5hbWU9PScjdGV4dCcmJnQu bm9kZS5ub2RlVmFsdWUuY2hhckF0KDApIT0nXG4nJiZ0Lm5vZGUubm9kZVZhbHVl LmNoYXJBdCgwKSE9J1xyJyl7dGV4dCs9IlxuIjt9CiQodGhpcykudGV4dCh0ZXh0 KTt9KTt2YXIgcmV0dmFsO2lmKCQuYnJvd3Nlci5tc2llKXtyZXR2YWw9JCgnPHBy ZT4nKyRwcmUuaHRtbCgpKyc8L3ByZT4nKS50ZXh0KCkucmVwbGFjZSgvXHIvZywn XG4nKTt9ZWxzZXtyZXR2YWw9JHByZS50ZXh0KCk7fQpyZXR1cm4gY29udGV4dC5o dG1sVG9UZXh0TWFwW29yaWdIVE1MXT1sZWFkaW5nK3JldHZhbCt0cmFpbGluZzt9 LCdiZWZvcmVTZWxlY3Rpb24nOmZ1bmN0aW9uKGNsYXNzbmFtZSxzdHJpY3Qpe2lm KHR5cGVvZiBjbGFzc25hbWU9PSd1bmRlZmluZWQnKXtjbGFzc25hbWU9Jyc7fQp2 YXIgZT1udWxsLG9mZnNldD1udWxsO2lmKGNvbnRleHQuJGlmcmFtZVswXS5jb250 ZW50V2luZG93LmdldFNlbGVjdGlvbil7dmFyIHNlbGVjdGlvbj1jb250ZXh0LiRp ZnJhbWVbMF0uY29udGVudFdpbmRvdy5nZXRTZWxlY3Rpb24oKTtpZihzZWxlY3Rp b24uYmFzZU5vZGUhPT1udWxsKXtlPXNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLnN0 YXJ0Q29udGFpbmVyO29mZnNldD1zZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5zdGFy dE9mZnNldDt9ZWxzZXtyZXR1cm4gbnVsbDt9CnZhciBib2R5PWNvbnRleHQuJGlm cmFtZVswXS5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHk7aWYoJC5icm93c2Vy Lm9wZXJhJiZlPT1ib2R5JiZvZmZzZXQ9PTEpe3JldHVybiBudWxsO319CmlmKCFl JiZjb250ZXh0LiRpZnJhbWVbMF0uY29udGVudFdpbmRvdy5kb2N1bWVudC5zZWxl Y3Rpb24pe3ZhciByYW5nZT1jb250ZXh0LiRpZnJhbWVbMF0uY29udGVudFdpbmRv dy5kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTt2YXIgcmFuZ2UyPWNv bnRleHQuJGlmcmFtZVswXS5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkuY3Jl YXRlVGV4dFJhbmdlKCk7dHJ5e3JhbmdlMi5zZXRFbmRQb2ludCgnRW5kVG9TdGFy dCcscmFuZ2UpO31jYXRjaChleCl7cmV0dXJuIG51bGw7fQp2YXIgc2Vla1Bvcz1j b250ZXh0LmZuLmh0bWxUb1RleHQocmFuZ2UyLmh0bWxUZXh0KS5sZW5ndGg7dmFy IG9mZnNldD1jb250ZXh0LmZuLmdldE9mZnNldChzZWVrUG9zKTtlPW9mZnNldD9v ZmZzZXQubm9kZTpudWxsO29mZnNldD1vZmZzZXQ/b2Zmc2V0Lm9mZnNldDpudWxs O2lmKCFlKXtyZXR1cm4gbnVsbDt9fQppZihlLm5vZGVOYW1lIT0nI3RleHQnKXt2 YXIgbmV3RT1lLmZpcnN0Q2hpbGQ7Zm9yKHZhciBpPTA7aTxvZmZzZXQtMSYmbmV3 RTtpKyspe25ld0U9bmV3RS5uZXh0U2libGluZzt9CndoaWxlKG5ld0UmJm5ld0Uu bGFzdENoaWxkKXtuZXdFPW5ld0UubGFzdENoaWxkO30KZT1uZXdFfHxlO30KdmFy IGNsYXNzU3RyPScgJytjbGFzc25hbWUrJyAnO3doaWxlKGUpe2lmKCFzdHJpY3Qm JighY2xhc3NuYW1lfHwoJyAnK2UuY2xhc3NOYW1lKycgJykuaW5kZXhPZihjbGFz c1N0cikhPS0xKSl7cmV0dXJuICQoZSk7fQp2YXIgbmV4dD1lLnByZXZpb3VzU2li bGluZzt3aGlsZShuZXh0JiZuZXh0Lmxhc3RDaGlsZCl7bmV4dD1uZXh0Lmxhc3RD aGlsZDt9CmU9bmV4dHx8ZS5wYXJlbnROb2RlO3N0cmljdD1mYWxzZTt9CnJldHVy biAkKFtdKTt9LCdyYXdUcmF2ZXJzZXInOmZ1bmN0aW9uKG5vZGUsaW5QLGFuY2Vz dG9yLHNraXBOb2luY2x1ZGUpe3RoaXMubm9kZT1ub2RlO3RoaXMuaW5QPWluUDt0 aGlzLmFuY2VzdG9yPWFuY2VzdG9yO3RoaXMuc2tpcE5vaW5jbHVkZT1za2lwTm9p bmNsdWRlO3RoaXMubmV4dD1mdW5jdGlvbigpe3ZhciBwPXRoaXMubm9kZTt2YXIg bmV4dEluUD10aGlzLmluUDt3aGlsZShwJiYhcC5uZXh0U2libGluZyl7cD1wLnBh cmVudE5vZGU7aWYocD09dGhpcy5hbmNlc3Rvcil7cD1udWxsO30KaWYocCYmcC5u b2RlTmFtZT09IlAiKXtuZXh0SW5QPW51bGw7fX0KcD1wP3AubmV4dFNpYmxpbmc6 bnVsbDtpZihwJiZwLm5vZGVOYW1lPT0iUCIpe25leHRJblA9cDt9CmRve2lmKHRo aXMuc2tpcE5vaW5jbHVkZSl7d2hpbGUocCYmKCcgJytwLmNsYXNzTmFtZSsnICcp LmluZGV4T2YoJyB3aWtpRWRpdG9yLW5vaW5jbHVkZSAnKSE9LTEpe3A9cC5uZXh0 U2libGluZzt9fQppZihwJiZwLmZpcnN0Q2hpbGQpe3A9cC5maXJzdENoaWxkO2lm KHAubm9kZU5hbWU9PSJQIil7bmV4dEluUD1wO319fXdoaWxlKHAmJnAuZmlyc3RD aGlsZCk7cmV0dXJuIHA/eydub2RlJzpwLCdpblAnOm5leHRJblAsJ2FuY2VzdG9y Jzp0aGlzLmFuY2VzdG9yLCdza2lwTm9pbmNsdWRlJzp0aGlzLnNraXBOb2luY2x1 ZGUsJ25leHQnOnRoaXMubmV4dCwncHJldic6dGhpcy5wcmV2fTpudWxsO307dGhp cy5wcmV2PWZ1bmN0aW9uKCl7dmFyIHA9dGhpcy5ub2RlO3ZhciBwcmV2SW5QPXRo aXMuaW5QO3doaWxlKHAmJiFwLnByZXZpb3VzU2libGluZyl7cD1wLnBhcmVudE5v ZGU7aWYocD09dGhpcy5hbmNlc3Rvcil7cD1udWxsO30KaWYocCYmcC5ub2RlTmFt ZT09IlAiKXtwcmV2SW5QPW51bGw7fX0KcD1wP3AucHJldmlvdXNTaWJsaW5nOm51 bGw7aWYocCYmcC5ub2RlTmFtZT09IlAiKXtwcmV2SW5QPXA7fQpkb3tpZih0aGlz LnNraXBOb2luY2x1ZGUpe3doaWxlKHAmJignICcrcC5jbGFzc05hbWUrJyAnKS5p bmRleE9mKCcgd2lraUVkaXRvci1ub2luY2x1ZGUgJykhPS0xKXtwPXAucHJldmlv dXNTaWJsaW5nO319CmlmKHAmJnAubGFzdENoaWxkKXtwPXAubGFzdENoaWxkO2lm KHAubm9kZU5hbWU9PSJQIil7cHJldkluUD1wO319fXdoaWxlKHAmJnAubGFzdENo aWxkKTtyZXR1cm4gcD97J25vZGUnOnAsJ2luUCc6cHJldkluUCwnYW5jZXN0b3In OnRoaXMuYW5jZXN0b3IsJ3NraXBOb2luY2x1ZGUnOnRoaXMuc2tpcE5vaW5jbHVk ZSwnbmV4dCc6dGhpcy5uZXh0LCdwcmV2Jzp0aGlzLnByZXZ9Om51bGw7fTt9LCd0 cmF2ZXJzZXInOmZ1bmN0aW9uKHN0YXJ0KXt2YXIgc3RhcnROb2RlPXN0YXJ0Lmpx dWVyeT9zdGFydC5nZXQoMCk6c3RhcnQ7dmFyIG5vZGU9c3RhcnROb2RlO3ZhciBp blA9bm9kZS5ub2RlTmFtZT09IlAiP25vZGU6bnVsbDtkb3t3aGlsZShub2RlJiYo JyAnK25vZGUuY2xhc3NOYW1lKycgJykuaW5kZXhPZignIHdpa2lFZGl0b3Itbm9p bmNsdWRlICcpIT0tMSl7bm9kZT1ub2RlLm5leHRTaWJsaW5nO30KaWYobm9kZSYm bm9kZS5maXJzdENoaWxkKXtub2RlPW5vZGUuZmlyc3RDaGlsZDtpZihub2RlLm5v ZGVOYW1lPT0iUCIpe2luUD1ub2RlO319fXdoaWxlKG5vZGUmJm5vZGUuZmlyc3RD aGlsZCk7cmV0dXJuIG5ldyBjb250ZXh0LmZuLnJhd1RyYXZlcnNlcihub2RlLGlu UCxzdGFydE5vZGUsdHJ1ZSk7fSwnZ2V0T2Zmc2V0JzpmdW5jdGlvbihvZmZzZXQp e2lmKCFjb250ZXh0Lm9mZnNldHMpe2NvbnRleHQuZm4ucmVmcmVzaE9mZnNldHMo KTt9CmlmKG9mZnNldCBpbiBjb250ZXh0Lm9mZnNldHMpe3JldHVybiBjb250ZXh0 Lm9mZnNldHNbb2Zmc2V0XTt9CnZhciBsb3dlckJvdW5kPS0xO2Zvcih2YXIgbyBp biBjb250ZXh0Lm9mZnNldHMpe3ZhciByZWFsTz1wYXJzZUludChvKTtpZihyZWFs TzxvZmZzZXQmJnJlYWxPPmxvd2VyQm91bmQpe2xvd2VyQm91bmQ9cmVhbE87fX0K aWYoIShsb3dlckJvdW5kIGluIGNvbnRleHQub2Zmc2V0cykpe3JldHVybiBudWxs O30KdmFyIGJhc2U9Y29udGV4dC5vZmZzZXRzW2xvd2VyQm91bmRdO3JldHVybiBj b250ZXh0Lm9mZnNldHNbb2Zmc2V0XT17J25vZGUnOmJhc2Uubm9kZSwnb2Zmc2V0 JzpiYXNlLm9mZnNldCtvZmZzZXQtbG93ZXJCb3VuZCwnbGVuZ3RoJzpiYXNlLmxl bmd0aCwnbGFzdFRleHROb2RlJzpiYXNlLmxhc3RUZXh0Tm9kZX07fSwncHVyZ2VP ZmZzZXRzJzpmdW5jdGlvbigpe2NvbnRleHQub2Zmc2V0cz1udWxsO30sJ3JlZnJl c2hPZmZzZXRzJzpmdW5jdGlvbigpe2NvbnRleHQub2Zmc2V0cz1bXTt2YXIgdD1j b250ZXh0LmZuLnRyYXZlcnNlcihjb250ZXh0LiRjb250ZW50KTt2YXIgcG9zPTAs bGFzdFRleHROb2RlPW51bGw7d2hpbGUodCl7aWYodC5ub2RlLm5vZGVOYW1lIT0n I3RleHQnJiZ0Lm5vZGUubm9kZU5hbWUhPSdCUicpe3Q9dC5uZXh0KCk7Y29udGlu dWU7fQp2YXIgbmV4dFBvcz10Lm5vZGUubm9kZU5hbWU9PScjdGV4dCc/cG9zK3Qu bm9kZS5ub2RlVmFsdWUubGVuZ3RoOnBvcysxO3ZhciBuZXh0VD10Lm5leHQoKTt2 YXIgbGVhdmluZ1A9dC5ub2RlLm5vZGVOYW1lPT0nI3RleHQnJiZ0LmluUCYmbmV4 dFQmJighbmV4dFQuaW5QfHxuZXh0VC5pblAhPXQuaW5QKTtjb250ZXh0Lm9mZnNl dHNbcG9zXT17J25vZGUnOnQubm9kZSwnb2Zmc2V0JzowLCdsZW5ndGgnOm5leHRQ b3MtcG9zKyhsZWF2aW5nUD8xOjApLCdsYXN0VGV4dE5vZGUnOmxhc3RUZXh0Tm9k ZX07aWYobGVhdmluZ1Ape2NvbnRleHQub2Zmc2V0c1tuZXh0UG9zXT17J25vZGUn OnQubm9kZSwnb2Zmc2V0JzpuZXh0UG9zLXBvcywnbGVuZ3RoJzpuZXh0UG9zLXBv cysxLCdsYXN0VGV4dE5vZGUnOmxhc3RUZXh0Tm9kZX07fQpwb3M9bmV4dFBvcyso bGVhdmluZ1A/MTowKTtpZih0Lm5vZGUubm9kZU5hbWU9PScjdGV4dCcpe2xhc3RU ZXh0Tm9kZT10Lm5vZGU7fQp0PW5leHRUO319LCdzYXZlU2VsZWN0aW9uJzpmdW5j dGlvbigpe2lmKCEkLmJyb3dzZXIubXNpZSl7cmV0dXJuO30KaWYodHlwZW9mIGNv bnRleHQuJGlmcmFtZSE9J3VuZGVmaW5lZCcpe2NvbnRleHQuJGlmcmFtZVswXS5j b250ZW50V2luZG93LmZvY3VzKCk7Y29udGV4dC5zYXZlZFNlbGVjdGlvbj1jb250 ZXh0LiRpZnJhbWVbMF0uY29udGVudFdpbmRvdy5kb2N1bWVudC5zZWxlY3Rpb24u Y3JlYXRlUmFuZ2UoKTt9ZWxzZXtjb250ZXh0LiR0ZXh0YXJlYS5mb2N1cygpO2Nv bnRleHQuc2F2ZWRTZWxlY3Rpb249ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJh bmdlKCk7fX0sJ3Jlc3RvcmVTZWxlY3Rpb24nOmZ1bmN0aW9uKCl7aWYoISQuYnJv d3Nlci5tc2llfHxjb250ZXh0LnNhdmVkU2VsZWN0aW9uPT09bnVsbCl7cmV0dXJu O30KaWYodHlwZW9mIGNvbnRleHQuJGlmcmFtZSE9J3VuZGVmaW5lZCcpe2NvbnRl eHQuJGlmcmFtZVswXS5jb250ZW50V2luZG93LmZvY3VzKCk7fWVsc2V7Y29udGV4 dC4kdGV4dGFyZWEuZm9jdXMoKTt9CmNvbnRleHQuc2F2ZWRTZWxlY3Rpb24uc2Vs ZWN0KCk7Y29udGV4dC5zYXZlZFNlbGVjdGlvbj1udWxsO30sJ3VwZGF0ZUhpc3Rv cnknOmZ1bmN0aW9uKGh0bWxDaGFuZ2Upe3ZhciBuZXdIVE1MPWNvbnRleHQuJGNv bnRlbnQuaHRtbCgpO3ZhciBuZXdTZWw9Y29udGV4dC5mbi5nZXRDYXJldFBvc2l0 aW9uKCk7aWYoY29udGV4dC5oaXN0b3J5Lmxlbmd0aD09MHx8KGh0bWxDaGFuZ2Um JmNvbnRleHQub2xkRGVsYXllZEhpc3RvcnlQb3NpdGlvbj09Y29udGV4dC5oaXN0 b3J5UG9zaXRpb24pKXtjb250ZXh0Lm9sZERlbGF5ZWRTZWw9bmV3U2VsO2lmKGNv bnRleHQuaGlzdG9yeVBvc2l0aW9uPC0xKXtjb250ZXh0Lmhpc3Rvcnkuc3BsaWNl KGNvbnRleHQuaGlzdG9yeS5sZW5ndGgrY29udGV4dC5oaXN0b3J5UG9zaXRpb24r MSk7Y29udGV4dC5oaXN0b3J5UG9zaXRpb249LTE7fQpjb250ZXh0Lmhpc3Rvcnku cHVzaCh7J2h0bWwnOm5ld0hUTUwsJ3NlbCc6bmV3U2VsfSk7d2hpbGUoY29udGV4 dC5oaXN0b3J5Lmxlbmd0aD4xMCl7Y29udGV4dC5oaXN0b3J5LnNoaWZ0KCk7fX1l bHNlIGlmKGNvbnRleHQub2xkRGVsYXllZFNlbCE9bmV3U2VsKXtjb250ZXh0Lm9s ZERlbGF5ZWRTZWw9bmV3U2VsO2NvbnRleHQuaGlzdG9yeVtjb250ZXh0Lmhpc3Rv cnkubGVuZ3RoK2NvbnRleHQuaGlzdG9yeVBvc2l0aW9uXS5zZWw9bmV3U2VsO30K Y29udGV4dC5vbGREZWxheWVkSGlzdG9yeVBvc2l0aW9uPWNvbnRleHQuaGlzdG9y eVBvc2l0aW9uO30sJ3NldHVwSWZyYW1lJzpmdW5jdGlvbigpe2NvbnRleHQuJGlm cmFtZT0kKCc8aWZyYW1lPjwvaWZyYW1lPicpLmF0dHIoeydmcmFtZUJvcmRlcic6 MCwnYm9yZGVyJzowLCd0YWJpbmRleCc6MSwnc3JjJzp3Z1NjcmlwdFBhdGgrJy9l eHRlbnNpb25zL1VzYWJpbGl0eUluaXRpYXRpdmUvanMvcGx1Z2lucy9qcXVlcnku d2lraUVkaXRvci5odG1sPycrJ2luc3RhbmNlPScrY29udGV4dC5pbnN0YW5jZSsn JnRzPScrKG5ldyBEYXRlKCkpLmdldFRpbWUoKSsnJmlzPWNvbnRlbnQnLCdpZCc6 J3dpa2lFZGl0b3ItaWZyYW1lLScrY29udGV4dC5pbnN0YW5jZX0pLmNzcyh7J2Jh Y2tncm91bmRDb2xvcic6J3doaXRlJywnd2lkdGgnOicxMDAlJywnaGVpZ2h0Jzpj b250ZXh0LiR0ZXh0YXJlYS5oZWlnaHQoKSwnZGlzcGxheSc6J25vbmUnLCdvdmVy Zmxvdy15Jzonc2Nyb2xsJywnb3ZlcmZsb3cteCc6J2hpZGRlbid9KS5pbnNlcnRB ZnRlcihjb250ZXh0LiR0ZXh0YXJlYSkubG9hZChmdW5jdGlvbigpe2lmKCF0aGlz LmlzU2Vjb25kUnVuKXtjb250ZXh0LiRpZnJhbWVbMF0uY29udGVudFdpbmRvdy5k b2N1bWVudC5kZXNpZ25Nb2RlPSdvbic7aWYoJC5icm93c2VyLm1zaWUpe3RoaXMu aXNTZWNvbmRSdW49dHJ1ZTtyZXR1cm47fX0KY29udGV4dC4kY29udGVudD0kKGNv bnRleHQuJGlmcmFtZVswXS5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkpO2Zv cihtb2R1bGUgaW4gY29udGV4dC5tb2R1bGVzKXtjb250ZXh0LiRjb250ZW50LmFk ZENsYXNzKCd3aWtpRWRpdG9yLScrbW9kdWxlKTt9CnZhciBodG1sPWNvbnRleHQu JHRleHRhcmVhLnZhbCgpLnJlcGxhY2UoLyZlc2M7L2csJyZlc2M7ZXNjOycpLnJl cGxhY2UoL1w8cFw+L2csJyZlc2M7Jmx0O3AmZ3Q7JykucmVwbGFjZSgvXDxcL3Bc Pi9nLCcmZXNjOyZsdDsvcCZndDsnKS5yZXBsYWNlKC9cPHNwYW4gY2xhc3M9Indp a2lFZGl0b3ItdGFiIlw+XDxcL3NwYW5cPi9nLCcmZXNjOyZsdDtzcGFuJm5ic3A7 Y2xhc3M9JnF1b3Q7d2lraUVkaXRvci10YWImcXVvdDsmZ3Q7Jmx0Oy9zcGFuJmd0 OycpLnJlcGxhY2UoLyZuYnNwOy9nLCcmZXNjOyZhbXA7bmJzcDsnKTtpZigkLmJy b3dzZXIubXNpZSl7aHRtbD1odG1sLnJlcGxhY2UoL1x0L2csJzxzcGFuIGNsYXNz PSJ3aWtpRWRpdG9yLXRhYiI+PC9zcGFuPicpO2lmKCQuYnJvd3Nlci52ZXJzaW9u TnVtYmVyPD03KXtodG1sPWh0bWwucmVwbGFjZSgvIC9nLCImbmJzcDsiKTt9ZWxz ZXtodG1sPWh0bWwucmVwbGFjZSgvKF58XG4pIC9nLCIkMSZuYnNwOyIpO319Cmh0 bWw9JCgnPGRpdiAvPicpLnRleHQoJzxwPicraHRtbC5yZXBsYWNlKC9ccj9cbi9n LCc8L3A+PHA+JykrJzwvcD4nKS5odG1sKCkucmVwbGFjZSgvJmFtcDtuYnNwOy9n LCcmbmJzcDsnKS5yZXBsYWNlKC8mbHQ7cCZndDsvZywnPHA+JykucmVwbGFjZSgv Jmx0O1wvcCZndDsvZywnPC9wPicpLnJlcGxhY2UoLyZsdDtzcGFuKCB8Jm5ic3A7 KWNsYXNzPSgifCZxdW90Oyl3aWtpRWRpdG9yLXRhYigifCZxdW90OykmZ3Q7Jmx0 O1wvc3BhbiZndDsvZywnPHNwYW4gY2xhc3M9Indpa2lFZGl0b3ItdGFiIj48L3Nw YW4+JykucmVwbGFjZSgvPHA+PFwvcD4vZywnPHA+PGJyPjwvcD4nKS5yZXBsYWNl KC8mYW1wO2VzYzsmYW1wO2FtcDtuYnNwOy9nLCcmYW1wO25ic3A7JykucmVwbGFj ZSgvJmFtcDtlc2M7JmFtcDtsdDtwJmFtcDtndDsvZywnJmx0O3AmZ3Q7JykucmVw bGFjZSgvJmFtcDtlc2M7JmFtcDtsdDtcL3AmYW1wO2d0Oy9nLCcmbHQ7L3AmZ3Q7 JykucmVwbGFjZSgvJmFtcDtlc2M7JmFtcDtsdDtzcGFuJmFtcDtuYnNwO2NsYXNz PSZhbXA7cXVvdDt3aWtpRWRpdG9yLXRhYiZhbXA7cXVvdDsmYW1wO2d0OyZhbXA7 bHQ7XC9zcGFuJmFtcDtndDsvZywnJmx0O3NwYW4gY2xhc3M9Indpa2lFZGl0b3It dGFiIiZndDsmbHQ7XC9zcGFuJmd0OycpLnJlcGxhY2UoLyZhbXA7ZXNjO2VzYzsv ZywnJmFtcDtlc2M7Jyk7Y29udGV4dC4kY29udGVudC5odG1sKGh0bWwpO2lmKCQo J2JvZHknKS5pcygnLnJ0bCcpKXtjb250ZXh0LiRjb250ZW50LmFkZENsYXNzKCdy dGwnKS5hdHRyKCdkaXInLCdydGwnKTt9CmNvbnRleHQuJHRleHRhcmVhLmF0dHIo J2Rpc2FibGVkJyx0cnVlKTtjb250ZXh0LiR0ZXh0YXJlYS5oaWRlKCk7Y29udGV4 dC4kaWZyYW1lLnNob3coKTtjb250ZXh0LmZuLnRyaWdnZXIoJ3JlYWR5Jyk7Y29u dGV4dC5vbGRIVE1MPWNvbnRleHQub2xkRGVsYXllZEhUTUw9Y29udGV4dC4kY29u dGVudC5odG1sKCk7JChjb250ZXh0LiRpZnJhbWVbMF0uY29udGVudFdpbmRvdy5k b2N1bWVudCkuYmluZCgna2V5ZG93bicsZnVuY3Rpb24oZXZlbnQpe2V2ZW50LmpR dWVyeU5vZGU9Y29udGV4dC5mbi5nZXRFbGVtZW50QXRDdXJzb3IoKTtyZXR1cm4g Y29udGV4dC5mbi50cmlnZ2VyKCdrZXlkb3duJyxldmVudCk7fSkuYmluZCgna2V5 dXAnLGZ1bmN0aW9uKGV2ZW50KXtldmVudC5qUXVlcnlOb2RlPWNvbnRleHQuZm4u Z2V0RWxlbWVudEF0Q3Vyc29yKCk7cmV0dXJuIGNvbnRleHQuZm4udHJpZ2dlcign a2V5dXAnLGV2ZW50KTt9KS5iaW5kKCdrZXlwcmVzcycsZnVuY3Rpb24oZXZlbnQp e2V2ZW50LmpRdWVyeU5vZGU9Y29udGV4dC5mbi5nZXRFbGVtZW50QXRDdXJzb3Io KTtyZXR1cm4gY29udGV4dC5mbi50cmlnZ2VyKCdrZXlwcmVzcycsZXZlbnQpO30p LmJpbmQoJ3Bhc3RlJyxmdW5jdGlvbihldmVudCl7cmV0dXJuIGNvbnRleHQuZm4u dHJpZ2dlcigncGFzdGUnLGV2ZW50KTt9KS5iaW5kKCdjdXQnLGZ1bmN0aW9uKGV2 ZW50KXtyZXR1cm4gY29udGV4dC5mbi50cmlnZ2VyKCdjdXQnLGV2ZW50KTt9KS5i aW5kKCdrZXl1cCBwYXN0ZSBtb3VzZXVwIGN1dCBlbmNhcHN1bGF0ZVNlbGVjdGlv bicsZnVuY3Rpb24oZXZlbnQpe3JldHVybiBjb250ZXh0LmZuLnRyaWdnZXIoJ2No YW5nZScsZXZlbnQpO30pLmRlbGF5ZWRCaW5kKDI1MCwna2V5dXAgcGFzdGUgbW91 c2V1cCBjdXQgZW5jYXBzdWxhdGVTZWxlY3Rpb24nLGZ1bmN0aW9uKGV2ZW50KXtj b250ZXh0LmZuLnRyaWdnZXIoJ2RlbGF5ZWRDaGFuZ2UnLGV2ZW50KTt9KTt9KTtj b250ZXh0LiR0ZXh0YXJlYS5jbG9zZXN0KCdmb3JtJykuc3VibWl0KGZ1bmN0aW9u KCl7Y29udGV4dC4kdGV4dGFyZWEuYXR0cignZGlzYWJsZWQnLGZhbHNlKTtjb250 ZXh0LiR0ZXh0YXJlYS52YWwoY29udGV4dC4kdGV4dGFyZWEudGV4dFNlbGVjdGlv bignZ2V0Q29udGVudHMnKSk7fSk7Y29udGV4dC5mYWxsYmFja1dpbmRvd09uQmVm b3JlVW5sb2FkPXdpbmRvdy5vbmJlZm9yZXVubG9hZDt3aW5kb3cub25iZWZvcmV1 bmxvYWQ9ZnVuY3Rpb24oKXtjb250ZXh0LiR0ZXh0YXJlYS52YWwoY29udGV4dC4k dGV4dGFyZWEudGV4dFNlbGVjdGlvbignZ2V0Q29udGVudHMnKSk7aWYoY29udGV4 dC5mYWxsYmFja1dpbmRvd09uQmVmb3JlVW5sb2FkKXtyZXR1cm4gY29udGV4dC5m YWxsYmFja1dpbmRvd09uQmVmb3JlVW5sb2FkKCk7fX07fSwnZ2V0RWxlbWVudEF0 Q3Vyc29yJzpmdW5jdGlvbigpe2lmKGNvbnRleHQuJGlmcmFtZVswXS5jb250ZW50 V2luZG93LmdldFNlbGVjdGlvbil7dmFyIHNlbGVjdGlvbj1jb250ZXh0LiRpZnJh bWVbMF0uY29udGVudFdpbmRvdy5nZXRTZWxlY3Rpb24oKTtpZihzZWxlY3Rpb24u cmFuZ2VDb3VudD09MCl7cmV0dXJuICQoW10pO30KdmFyIHNjPXNlbGVjdGlvbi5n ZXRSYW5nZUF0KDApLnN0YXJ0Q29udGFpbmVyO2lmKHNjLm5vZGVOYW1lPT0iI3Rl eHQiKXNjPXNjLnBhcmVudE5vZGU7cmV0dXJuICQoc2MpO31lbHNlIGlmKGNvbnRl eHQuJGlmcmFtZVswXS5jb250ZW50V2luZG93LmRvY3VtZW50LnNlbGVjdGlvbil7 dmFyIHNlbGVjdGlvbj1jb250ZXh0LiRpZnJhbWVbMF0uY29udGVudFdpbmRvdy5k b2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtyZXR1cm4gJChzZWxlY3Rp b24ucGFyZW50RWxlbWVudCgpKTt9fSwnZ2V0Q29udGVudHMnOmZ1bmN0aW9uKCl7 dmFyIGh0bWw7aWYoJC5icm93c2VyLm1zaWUpe3ZhciAkYz0kKGNvbnRleHQuJGNv bnRlbnQuZ2V0KDApLmNsb25lTm9kZSh0cnVlKSk7JGMuZmluZCgncCcpLmVhY2go ZnVuY3Rpb24oKXtpZigkKHRoaXMpLmh0bWwoKT09JycpeyQodGhpcykucmVwbGFj ZVdpdGgoJzxwPjwvcD4nKTt9fSk7aHRtbD0kYy5odG1sKCk7fWVsc2V7aHRtbD1j b250ZXh0LiRjb250ZW50Lmh0bWwoKTt9CnJldHVybiBjb250ZXh0LmZuLmh0bWxU b1RleHQoaHRtbCk7fSwnZ2V0U2VsZWN0aW9uJzpmdW5jdGlvbigpe3ZhciByZXR2 YWw7aWYoY29udGV4dC4kaWZyYW1lWzBdLmNvbnRlbnRXaW5kb3cuZ2V0U2VsZWN0 aW9uKXtyZXR2YWw9Y29udGV4dC4kaWZyYW1lWzBdLmNvbnRlbnRXaW5kb3cuZ2V0 U2VsZWN0aW9uKCk7aWYoJC5icm93c2VyLm9wZXJhKXtpZihyZXR2YWwucmFuZ2VD b3VudD4wKXtyZXR2YWw9Y29udGV4dC5mbi5odG1sVG9UZXh0KCQoJzxwcmUgLz4n KS5hcHBlbmQocmV0dmFsLmdldFJhbmdlQXQoMCkuY2xvbmVDb250ZW50cygpKS5o dG1sKCkpO31lbHNle3JldHZhbD0nJzt9fX1lbHNlIGlmKGNvbnRleHQuJGlmcmFt ZVswXS5jb250ZW50V2luZG93LmRvY3VtZW50LnNlbGVjdGlvbil7cmV0dmFsPWNv bnRleHQuJGlmcmFtZVswXS5jb250ZW50V2luZG93LmRvY3VtZW50LnNlbGVjdGlv bi5jcmVhdGVSYW5nZSgpO30KaWYodHlwZW9mIHJldHZhbC50ZXh0IT0ndW5kZWZp bmVkJyl7cmV0dmFsPWNvbnRleHQuZm4uaHRtbFRvVGV4dChyZXR2YWwuaHRtbFRl eHQpO31lbHNlIGlmKHR5cGVvZiByZXR2YWwudG9TdHJpbmchPSd1bmRlZmluZWQn KXtyZXR2YWw9cmV0dmFsLnRvU3RyaW5nKCk7fQpyZXR1cm4gcmV0dmFsO30sJ2Vu Y2Fwc3VsYXRlU2VsZWN0aW9uJzpmdW5jdGlvbihvcHRpb25zKXt2YXIgc2VsVGV4 dD0kKHRoaXMpLnRleHRTZWxlY3Rpb24oJ2dldFNlbGVjdGlvbicpO3ZhciBzZWxU ZXh0QXJyO3ZhciBjb2xsYXBzZVRvRW5kPWZhbHNlO3ZhciBzZWxlY3RBZnRlcj1m YWxzZTt2YXIgc2V0U2VsZWN0aW9uVG89bnVsbDt2YXIgcHJlPW9wdGlvbnMucHJl LHBvc3Q9b3B0aW9ucy5wb3N0O2lmKCFzZWxUZXh0KXtzZWxUZXh0PW9wdGlvbnMu cGVyaTtzZWxlY3RBZnRlcj10cnVlO31lbHNlIGlmKG9wdGlvbnMucGVyaT09c2Vs VGV4dC5yZXBsYWNlKC9ccyskLywnJykpe3NlbFRleHQ9c2VsVGV4dC5yZXBsYWNl KC9ccyskLywnJyk7Y29sbGFwc2VUb0VuZD10cnVlO3NlbGVjdEFmdGVyPXRydWU7 fWVsc2UgaWYob3B0aW9ucy5yZXBsYWNlKXtzZWxUZXh0PW9wdGlvbnMucGVyaTt9 ZWxzZSBpZihzZWxUZXh0LmNoYXJBdChzZWxUZXh0Lmxlbmd0aC0xKT09JyAnKXtz ZWxUZXh0PXNlbFRleHQuc3Vic3RyaW5nKDAsc2VsVGV4dC5sZW5ndGgtMSk7cG9z dCs9JyAnO30KaWYob3B0aW9ucy5zcGxpdGxpbmVzKXtzZWxUZXh0QXJyPXNlbFRl eHQuc3BsaXQoL1xuLyk7fQppZihjb250ZXh0LiRpZnJhbWVbMF0uY29udGVudFdp bmRvdy5nZXRTZWxlY3Rpb24pe3ZhciByYW5nZT1jb250ZXh0LiRpZnJhbWVbMF0u Y29udGVudFdpbmRvdy5nZXRTZWxlY3Rpb24oKS5nZXRSYW5nZUF0KDApO2lmKGNv bGxhcHNlVG9FbmQpe2lmKHJhbmdlLmVuZENvbnRhaW5lci5ub2RlTmFtZT09J0JS Jyl7cmFuZ2Uuc2V0RW5kQmVmb3JlKHJhbmdlLmVuZENvbnRhaW5lcik7fQpyYW5n ZS5jb2xsYXBzZShmYWxzZSk7fQppZihvcHRpb25zLm93bmxpbmUpe3ZhciBhdFN0 YXJ0PWZhbHNlLGF0RW5kPWZhbHNlO3ZhciBib2R5PWNvbnRleHQuJGNvbnRlbnQu Z2V0KDApO2lmKHJhbmdlLnN0YXJ0T2Zmc2V0PT0wKXthdFN0YXJ0PXRydWU7fWVs c2UgaWYocmFuZ2Uuc3RhcnRDb250YWluZXI9PWJvZHkpe3ZhciBuPWJvZHkuZmly c3RDaGlsZDtmb3IodmFyIGk9MDtpPHJhbmdlLnN0YXJ0T2Zmc2V0LTEmJm47aSsr KXtuPW4ubmV4dFNpYmxpbmc7fQppZihuJiZuLm5vZGVOYW1lPT0nQlInKXthdFN0 YXJ0PXRydWU7fWVsc2V7YXRFbmQ9dHJ1ZTt9fQppZigocmFuZ2UuZW5kT2Zmc2V0 PT0wJiZyYW5nZS5lbmRDb250YWluZXIubm9kZVZhbHVlPT1udWxsKXx8KHJhbmdl LmVuZENvbnRhaW5lci5ub2RlTmFtZT09JyN0ZXh0JyYmcmFuZ2UuZW5kT2Zmc2V0 PT1yYW5nZS5lbmRDb250YWluZXIubm9kZVZhbHVlLmxlbmd0aCl8fChyYW5nZS5l bmRDb250YWluZXIubm9kZU5hbWU9PSdQJyYmcmFuZ2UuZW5kQ29udGFpbmVyLm5v ZGVWYWx1ZT09bnVsbCkpe2F0RW5kPXRydWU7fQppZighYXRTdGFydCl7cHJlPSJc biIrb3B0aW9ucy5wcmU7fQppZighYXRFbmQpe3Bvc3QrPSJcbiI7fX0KdmFyIGlu c2VydFRleHQ9IiI7aWYob3B0aW9ucy5zcGxpdGxpbmVzKXtmb3IodmFyIGo9MDtq PHNlbFRleHRBcnIubGVuZ3RoO2orKyl7aW5zZXJ0VGV4dD1pbnNlcnRUZXh0K3By ZStzZWxUZXh0QXJyW2pdK3Bvc3Q7aWYoaiE9c2VsVGV4dEFyci5sZW5ndGgtMSl7 aW5zZXJ0VGV4dCs9IlxuIjt9fX1lbHNle2luc2VydFRleHQ9cHJlK3NlbFRleHQr cG9zdDt9CnZhciBpbnNlcnRMaW5lcz1pbnNlcnRUZXh0LnNwbGl0KCJcbiIpO3Jh bmdlLmV4dHJhY3RDb250ZW50cygpO3ZhciBmaXJzdE5vZGU9bnVsbCxsYXN0Tm9k ZT1udWxsO3ZhciBzZWxTQz1udWxsLHNlbEVDPW51bGwsc2VsU089bnVsbCxzZWxF Tz1udWxsLG9mZnNldD0wO2Zvcih2YXIgaT1pbnNlcnRMaW5lcy5sZW5ndGgtMTtp Pj0wO2ktLSl7Zmlyc3ROb2RlPWNvbnRleHQuJGlmcmFtZVswXS5jb250ZW50V2lu ZG93LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGluc2VydExpbmVzW2ldKTtyYW5n ZS5pbnNlcnROb2RlKGZpcnN0Tm9kZSk7bGFzdE5vZGU9bGFzdE5vZGV8fGZpcnN0 Tm9kZTt2YXIgbmV3T2Zmc2V0PW9mZnNldCtpbnNlcnRMaW5lc1tpXS5sZW5ndGg7 aWYoIXNlbEVDJiZwb3N0Lmxlbmd0aDw9bmV3T2Zmc2V0KXtzZWxFQz1maXJzdE5v ZGU7c2VsRU89c2VsRUMubm9kZVZhbHVlLmxlbmd0aC0ocG9zdC5sZW5ndGgtb2Zm c2V0KTt9CmlmKHNlbEVDJiYhc2VsU0MmJnByZS5sZW5ndGg+PWluc2VydFRleHQu bGVuZ3RoLW5ld09mZnNldCl7c2VsU0M9Zmlyc3ROb2RlO3NlbFNPPXByZS5sZW5n dGgtKGluc2VydFRleHQubGVuZ3RoLW5ld09mZnNldCk7fQpvZmZzZXQ9bmV3T2Zm c2V0O2lmKGk+MCl7Zmlyc3ROb2RlPWNvbnRleHQuJGlmcmFtZVswXS5jb250ZW50 V2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JyJyk7cmFuZ2UuaW5zZXJ0 Tm9kZShmaXJzdE5vZGUpO25ld09mZnNldD1vZmZzZXQrMTtpZighc2VsRUMmJnBv c3QubGVuZ3RoPD1uZXdPZmZzZXQpe3NlbEVDPWZpcnN0Tm9kZTtzZWxFTz0xLShw b3N0Lmxlbmd0aC1vZmZzZXQpO30KaWYoc2VsRUMmJiFzZWxTQyYmcHJlLmxlbmd0 aD49aW5zZXJ0VGV4dC5sZW5ndGgtbmV3T2Zmc2V0KXtzZWxTQz1maXJzdE5vZGU7 c2VsU089cHJlLmxlbmd0aC0oaW5zZXJ0VGV4dC5sZW5ndGgtbmV3T2Zmc2V0KTt9 Cm9mZnNldD1uZXdPZmZzZXQ7fX0KaWYoZmlyc3ROb2RlKXtjb250ZXh0LmZuLnNj cm9sbFRvVG9wKCQoZmlyc3ROb2RlLnBhcmVudE5vZGUpKTt9CmlmKHNlbGVjdEFm dGVyKXtzZXRTZWxlY3Rpb25Ubz17c3RhcnRDb250YWluZXI6c2VsU0MsZW5kQ29u dGFpbmVyOnNlbEVDLHN0YXJ0OnNlbFNPLGVuZDpzZWxFT307fWVsc2UgaWYobGFz dE5vZGUpe3NldFNlbGVjdGlvblRvPXtzdGFydENvbnRhaW5lcjpsYXN0Tm9kZSxl bmRDb250YWluZXI6bGFzdE5vZGUsc3RhcnQ6bGFzdE5vZGUubm9kZVZhbHVlLmxl bmd0aCxlbmQ6bGFzdE5vZGUubm9kZVZhbHVlLmxlbmd0aH07fX1lbHNlIGlmKGNv bnRleHQuJGlmcmFtZVswXS5jb250ZW50V2luZG93LmRvY3VtZW50LnNlbGVjdGlv bil7Y29udGV4dC4kaWZyYW1lWzBdLmNvbnRlbnRXaW5kb3cuZm9jdXMoKTt2YXIg cmFuZ2U9Y29udGV4dC4kaWZyYW1lWzBdLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQu c2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7aWYob3B0aW9ucy5vd25saW5lJiZyYW5n ZS5tb3ZlU3RhcnQpe3ZhciByYW5nZTI9Y29udGV4dC4kaWZyYW1lWzBdLmNvbnRl bnRXaW5kb3cuZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7cmFuZ2Uy LmNvbGxhcHNlKCk7cmFuZ2UyLm1vdmVTdGFydCgnY2hhcmFjdGVyJywtMSk7aWYo cmFuZ2UyLnRleHQhPSJcciImJnJhbmdlMi50ZXh0IT0iXG4iJiZyYW5nZTIudGV4 dCE9IiIpe3ByZT0iXG4iK3ByZTt9CnZhciByYW5nZTM9Y29udGV4dC4kaWZyYW1l WzBdLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdl KCk7cmFuZ2UzLmNvbGxhcHNlKGZhbHNlKTtyYW5nZTMubW92ZUVuZCgnY2hhcmFj dGVyJywxKTtpZihyYW5nZTMudGV4dCE9IlxyIiYmcmFuZ2UzLnRleHQhPSJcbiIm JnJhbmdlMy50ZXh0IT0iIil7cG9zdCs9IlxuIjt9fQppZihjb2xsYXBzZVRvRW5k KXtyYW5nZS5jb2xsYXBzZShmYWxzZSk7fQp2YXIgaW5zZXJ0VGV4dD0iIjtpZihv cHRpb25zLnNwbGl0bGluZXMpe2Zvcih2YXIgaj0wO2o8c2VsVGV4dEFyci5sZW5n dGg7aisrKXtpbnNlcnRUZXh0PWluc2VydFRleHQrcHJlK3NlbFRleHRBcnJbal0r cG9zdDtpZihqIT1zZWxUZXh0QXJyLmxlbmd0aC0xKXtpbnNlcnRUZXh0Kz0iXG4i O319fWVsc2V7aW5zZXJ0VGV4dD1wcmUrc2VsVGV4dCtwb3N0O30KcmFuZ2UucGFz dGVIVE1MKGluc2VydFRleHQucmVwbGFjZSgvXDwvZywnJmx0OycpLnJlcGxhY2Uo Lz4vZywnJmd0OycpLnJlcGxhY2UoL1xyP1xuL2csJzxiciAvPicpKTtpZihzZWxl Y3RBZnRlcil7cmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLC1wb3N0Lmxlbmd0 aC1zZWxUZXh0Lmxlbmd0aCk7cmFuZ2UubW92ZUVuZCgnY2hhcmFjdGVyJywtcG9z dC5sZW5ndGgpO3JhbmdlLnNlbGVjdCgpO319CmlmKHNldFNlbGVjdGlvblRvKXtj b250ZXh0LmZuLnNldFNlbGVjdGlvbihzZXRTZWxlY3Rpb25Ubyk7fQokKGNvbnRl eHQuJGlmcmFtZVswXS5jb250ZW50V2luZG93LmRvY3VtZW50KS50cmlnZ2VyKCdl bmNhcHN1bGF0ZVNlbGVjdGlvbicsW3ByZSxvcHRpb25zLnBlcmkscG9zdCxvcHRp b25zLm93bmxpbmUsb3B0aW9ucy5yZXBsYWNlXSk7cmV0dXJuIGNvbnRleHQuJHRl eHRhcmVhO30sJ2dldENhcmV0UG9zaXRpb24nOmZ1bmN0aW9uKG9wdGlvbnMpe3Zh ciBzdGFydFBvcz1udWxsLGVuZFBvcz1udWxsO2lmKGNvbnRleHQuJGlmcmFtZVsw XS5jb250ZW50V2luZG93LmdldFNlbGVjdGlvbil7dmFyIHNlbGVjdGlvbj1jb250 ZXh0LiRpZnJhbWVbMF0uY29udGVudFdpbmRvdy5nZXRTZWxlY3Rpb24oKTtpZihz ZWxlY3Rpb24ucmFuZ2VDb3VudD09MCl7cmV0dXJuWzAsMF07fQp2YXIgc2M9c2Vs ZWN0aW9uLmdldFJhbmdlQXQoMCkuc3RhcnRDb250YWluZXIsZWM9c2VsZWN0aW9u LmdldFJhbmdlQXQoMCkuZW5kQ29udGFpbmVyO3ZhciBzbz1zZWxlY3Rpb24uZ2V0 UmFuZ2VBdCgwKS5zdGFydE9mZnNldCxlbz1zZWxlY3Rpb24uZ2V0UmFuZ2VBdCgw KS5lbmRPZmZzZXQ7aWYoc2Mubm9kZU5hbWU9PSdCT0RZJyl7dmFyIG49c2MuZmly c3RDaGlsZDtmb3IodmFyIGk9MDtpPHNvLTEmJm47aSsrKXtuPW4ubmV4dFNpYmxp bmc7fQpzYz1uO3NvPTA7fQppZihlYy5ub2RlTmFtZT09J0JPRFknKXt2YXIgbj1l Yy5maXJzdENoaWxkO2Zvcih2YXIgaT0wO2k8ZW8tMSYmbjtpKyspe249bi5uZXh0 U2libGluZzt9CmVjPW47ZW89MDt9CndoaWxlKHNjLmZpcnN0Q2hpbGQpe3NjPXNj LmZpcnN0Q2hpbGQ7fQp3aGlsZShlYy5maXJzdENoaWxkKXtlYz1lYy5maXJzdENo aWxkO30KY29udGV4dC5mbi5nZXRPZmZzZXQoMCk7dmFyIG87Zm9yKG8gaW4gY29u dGV4dC5vZmZzZXRzKXtpZihzdGFydFBvcz09PW51bGwmJmNvbnRleHQub2Zmc2V0 c1tvXS5ub2RlPT1zYyl7c3RhcnRQb3M9fn5vK3NvLWNvbnRleHQub2Zmc2V0c1tv XS5vZmZzZXQ7fQppZihzdGFydFBvcyE9PW51bGwmJmNvbnRleHQub2Zmc2V0c1tv XS5ub2RlPT1lYyl7ZW5kUG9zPX5+bytlby1jb250ZXh0Lm9mZnNldHNbb10ub2Zm c2V0O2JyZWFrO319fWVsc2UgaWYoY29udGV4dC4kaWZyYW1lWzBdLmNvbnRlbnRX aW5kb3cuZG9jdW1lbnQuc2VsZWN0aW9uKXt2YXIgZD1jb250ZXh0LiRpZnJhbWVb MF0uY29udGVudFdpbmRvdy5kb2N1bWVudDt2YXIgcG9zdEZpbmlzaGVkPWZhbHNl O3ZhciBwZXJpRmluaXNoZWQ9ZmFsc2U7dmFyIHBvc3RGaW5pc2hlZD1mYWxzZTt2 YXIgcHJlVGV4dCxyYXdQcmVUZXh0LHBlcmlUZXh0O3ZhciByYXdQZXJpVGV4dCxw b3N0VGV4dCxyYXdQb3N0VGV4dDt0cnl7dmFyIHBlcmlSYW5nZT1kLnNlbGVjdGlv bi5jcmVhdGVSYW5nZSgpLmR1cGxpY2F0ZSgpO3ZhciBwcmVSYW5nZT1kLmJvZHku Y3JlYXRlVGV4dFJhbmdlKCk7cHJlUmFuZ2Uuc2V0RW5kUG9pbnQoIkVuZFRvU3Rh cnQiLHBlcmlSYW5nZSk7dmFyIHBvc3RSYW5nZT1kLmJvZHkuY3JlYXRlVGV4dFJh bmdlKCk7cG9zdFJhbmdlLnNldEVuZFBvaW50KCJTdGFydFRvRW5kIixwZXJpUmFu Z2UpO3ByZVRleHQ9cmF3UHJlVGV4dD1wcmVSYW5nZS50ZXh0O3BlcmlUZXh0PXJh d1BlcmlUZXh0PXBlcmlSYW5nZS50ZXh0O3Bvc3RUZXh0PXJhd1Bvc3RUZXh0PXBv c3RSYW5nZS50ZXh0O2Rve2lmKCFwb3N0RmluaXNoZWQpe2lmKHByZVJhbmdlLmNv bXBhcmVFbmRQb2ludHMoIlN0YXJ0VG9FbmQiLHByZVJhbmdlKT09MCl7cG9zdEZp bmlzaGVkPXRydWU7fWVsc2V7cHJlUmFuZ2UubW92ZUVuZCgiY2hhcmFjdGVyIiwt MSkKaWYocHJlUmFuZ2UudGV4dD09cHJlVGV4dCl7cmF3UHJlVGV4dCs9IlxyXG4i O31lbHNle3Bvc3RGaW5pc2hlZD10cnVlO319fQppZighcGVyaUZpbmlzaGVkKXtp ZihwZXJpUmFuZ2UuY29tcGFyZUVuZFBvaW50cygiU3RhcnRUb0VuZCIscGVyaVJh bmdlKT09MCl7cGVyaUZpbmlzaGVkPXRydWU7fWVsc2V7cGVyaVJhbmdlLm1vdmVF bmQoImNoYXJhY3RlciIsLTEpCmlmKHBlcmlSYW5nZS50ZXh0PT1wZXJpVGV4dCl7 cmF3UGVyaVRleHQrPSJcclxuIjt9ZWxzZXtwZXJpRmluaXNoZWQ9dHJ1ZTt9fX0K aWYoIXBvc3RGaW5pc2hlZCl7aWYocG9zdFJhbmdlLmNvbXBhcmVFbmRQb2ludHMo IlN0YXJ0VG9FbmQiLHBvc3RSYW5nZSk9PTApe3Bvc3RGaW5pc2hlZD10cnVlO31l bHNle3Bvc3RSYW5nZS5tb3ZlRW5kKCJjaGFyYWN0ZXIiLC0xKQppZihwb3N0UmFu Z2UudGV4dD09cG9zdFRleHQpe3Jhd1Bvc3RUZXh0Kz0iXHJcbiI7fWVsc2V7cG9z dEZpbmlzaGVkPXRydWU7fX19fXdoaWxlKCghcG9zdEZpbmlzaGVkfHwhcGVyaUZp bmlzaGVkfHwhcG9zdEZpbmlzaGVkKSk7c3RhcnRQb3M9cmF3UHJlVGV4dC5yZXBs YWNlKC9cclxuL2csIlxuIikubGVuZ3RoO2VuZFBvcz1zdGFydFBvcytyYXdQZXJp VGV4dC5yZXBsYWNlKC9cclxuL2csIlxuIikubGVuZ3RoO31jYXRjaChlKXtzdGFy dFBvcz1lbmRQb3M9MDt9fQpyZXR1cm5bc3RhcnRQb3MsZW5kUG9zXTt9LCdzZXRT ZWxlY3Rpb24nOmZ1bmN0aW9uKG9wdGlvbnMpe3ZhciBzYz1vcHRpb25zLnN0YXJ0 Q29udGFpbmVyLGVjPW9wdGlvbnMuZW5kQ29udGFpbmVyO3NjPXNjJiZzYy5qcXVl cnk/c2NbMF06c2M7ZWM9ZWMmJmVjLmpxdWVyeT9lY1swXTplYztpZihjb250ZXh0 LiRpZnJhbWVbMF0uY29udGVudFdpbmRvdy5nZXRTZWxlY3Rpb24pe3ZhciBzdGFy dD1vcHRpb25zLnN0YXJ0LGVuZD1vcHRpb25zLmVuZDtpZighc2N8fCFlYyl7dmFy IHM9Y29udGV4dC5mbi5nZXRPZmZzZXQoc3RhcnQpO3ZhciBlPWNvbnRleHQuZm4u Z2V0T2Zmc2V0KGVuZCk7c2M9cz9zLm5vZGU6bnVsbDtlYz1lP2Uubm9kZTpudWxs O3N0YXJ0PXM/cy5vZmZzZXQ6bnVsbDtlbmQ9ZT9lLm9mZnNldDpudWxsO2lmKHNj IT1udWxsJiZzYy5ub2RlTmFtZT09JyN0ZXh0JyYmc3RhcnQ+c2Mubm9kZVZhbHVl Lmxlbmd0aCl7c3RhcnQ9c2Mubm9kZVZhbHVlLmxlbmd0aC0xO30KaWYoZWMhPW51 bGwmJmVjLm5vZGVOYW1lPT0nI3RleHQnJiZlbmQ+ZWMubm9kZVZhbHVlLmxlbmd0 aCl7ZW5kPWVjLm5vZGVWYWx1ZS5sZW5ndGgtMTt9fQppZighc2N8fCFlYyl7cmV0 dXJuIGNvbnRleHQuJHRleHRhcmVhO30KdmFyIHNlbD1jb250ZXh0LiRpZnJhbWVb MF0uY29udGVudFdpbmRvdy5nZXRTZWxlY3Rpb24oKTt3aGlsZShzYy5maXJzdENo aWxkJiZzYy5ub2RlTmFtZSE9JyN0ZXh0Jyl7c2M9c2MuZmlyc3RDaGlsZDt9Cndo aWxlKGVjLmZpcnN0Q2hpbGQmJmVjLm5vZGVOYW1lIT0nI3RleHQnKXtlYz1lYy5m aXJzdENoaWxkO30KdmFyIHJhbmdlPWNvbnRleHQuJGlmcmFtZVswXS5jb250ZW50 V2luZG93LmRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7cmFuZ2Uuc2V0U3RhcnQoc2Ms c3RhcnQpO3JhbmdlLnNldEVuZChlYyxlbmQpO3NlbC5yZW1vdmVBbGxSYW5nZXMo KTtzZWwuYWRkUmFuZ2UocmFuZ2UpO2NvbnRleHQuJGlmcmFtZVswXS5jb250ZW50 V2luZG93LmZvY3VzKCk7fWVsc2UgaWYoY29udGV4dC4kaWZyYW1lWzBdLmNvbnRl bnRXaW5kb3cuZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2Upe3ZhciByYW5n ZT1jb250ZXh0LiRpZnJhbWVbMF0uY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5 LmNyZWF0ZVRleHRSYW5nZSgpO2lmKHNjKXtyYW5nZS5tb3ZlVG9FbGVtZW50VGV4 dChzYyk7fQpyYW5nZS5jb2xsYXBzZSgpO3JhbmdlLm1vdmVFbmQoJ2NoYXJhY3Rl cicsb3B0aW9ucy5zdGFydCk7dmFyIHJhbmdlMj1jb250ZXh0LiRpZnJhbWVbMF0u Y29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO2lm KGVjKXtyYW5nZTIubW92ZVRvRWxlbWVudFRleHQoZWMpO30KcmFuZ2UyLmNvbGxh cHNlKCk7cmFuZ2UyLm1vdmVFbmQoJ2NoYXJhY3Rlcicsb3B0aW9ucy5lbmQpO3Zh ciBtYXRjaGVzLGNvdW50ZWQ9MDt3aGlsZShtYXRjaGVzPXJhbmdlLmh0bWxUZXh0 Lm1hdGNoKC9cPFwvcFw+KFw8YnJbXlw+XSpcPikrXDxwXD4vZ2kpKXtpZihtYXRj aGVzLmxlbmd0aDw9Y291bnRlZCkKYnJlYWs7cmFuZ2UubW92ZUVuZCgnY2hhcmFj dGVyJyxtYXRjaGVzLmxlbmd0aCk7Y291bnRlZCs9bWF0Y2hlcy5sZW5ndGg7fQpy YW5nZTIubW92ZUVuZCgnY2hhcmFjdGVyJyxjb3VudGVkKTt3aGlsZShtYXRjaGVz PXJhbmdlMi5odG1sVGV4dC5tYXRjaCgvXDxcL3BcPihcPGJyW15cPl0qXD4pK1w8 cFw+L2dpKSl7aWYobWF0Y2hlcy5sZW5ndGg8PWNvdW50ZWQpCmJyZWFrO3Jhbmdl Mi5tb3ZlRW5kKCdjaGFyYWN0ZXInLG1hdGNoZXMubGVuZ3RoKTtjb3VudGVkKz1t YXRjaGVzLmxlbmd0aDt9CnJhbmdlMi5zZXRFbmRQb2ludCgnU3RhcnRUb0VuZCcs cmFuZ2UpO3JhbmdlMi5zZWxlY3QoKTt9CnJldHVybiBjb250ZXh0LiR0ZXh0YXJl YTt9LCdzY3JvbGxUb0NhcmV0UG9zaXRpb24nOmZ1bmN0aW9uKG9wdGlvbnMpe2Nv bnRleHQuZm4uc2Nyb2xsVG9Ub3AoY29udGV4dC5mbi5nZXRFbGVtZW50QXRDdXJz b3IoKSx0cnVlKTt9LCdzY3JvbGxUb1RvcCc6ZnVuY3Rpb24oJGVsZW1lbnQsZm9y Y2Upe3ZhciBodG1sPWNvbnRleHQuJGNvbnRlbnQuY2xvc2VzdCgnaHRtbCcpLGJv ZHk9Y29udGV4dC4kY29udGVudC5jbG9zZXN0KCdib2R5JykscGFyZW50SHRtbD0k KCdodG1sJykscGFyZW50Qm9keT0kKCdib2R5Jyk7dmFyIHk9JGVsZW1lbnQub2Zm c2V0KCkudG9wO2lmKCEkLmJyb3dzZXIubXNpZSYmISRlbGVtZW50LmlzKCdib2R5 Jykpe3k9cGFyZW50SHRtbC5zY3JvbGxUb3AoKT4wP3kraHRtbC5zY3JvbGxUb3Ao KS1wYXJlbnRIdG1sLnNjcm9sbFRvcCgpOnk7eT1wYXJlbnRCb2R5LnNjcm9sbFRv cCgpPjA/eStib2R5LnNjcm9sbFRvcCgpLXBhcmVudEJvZHkuc2Nyb2xsVG9wKCk6 eTt9CnZhciB0b3BCb3VuZD1odG1sLnNjcm9sbFRvcCgpPmJvZHkuc2Nyb2xsVG9w KCk/aHRtbC5zY3JvbGxUb3AoKTpib2R5LnNjcm9sbFRvcCgpLGJvdHRvbUJvdW5k PXRvcEJvdW5kK2NvbnRleHQuJGlmcmFtZS5oZWlnaHQoKTtpZihmb3JjZXx8eTx0 b3BCb3VuZHx8eT5ib3R0b21Cb3VuZCl7aHRtbC5zY3JvbGxUb3AoeSk7Ym9keS5z Y3JvbGxUb3AoeSk7fQokZWxlbWVudC50cmlnZ2VyKCdzY3JvbGxUb1RvcCcpO30s J3NhdmVTdHVmZkZvcklFJzpmdW5jdGlvbigpe2lmKCEkLmJyb3dzZXIubXNpZXx8 Y29udGV4dC4kaWZyYW1lKQpyZXR1cm47dmFyIElIYXRlSUU9eydzY3JvbGxUb3An OmNvbnRleHQuJHRleHRhcmVhLnNjcm9sbFRvcCgpLCdwb3MnOmNvbnRleHQuJHRl eHRhcmVhLnRleHRTZWxlY3Rpb24oJ2dldENhcmV0UG9zaXRpb24nLHtzdGFydEFu ZEVuZDp0cnVlfSl9O2NvbnRleHQuJHRleHRhcmVhLmRhdGEoJ0lIYXRlSUUnLElI YXRlSUUpO30sJ3Jlc3RvcmVTdHVmZkZvcklFJzpmdW5jdGlvbigpe2lmKCEkLmJy b3dzZXIubXNpZXx8Y29udGV4dC4kaWZyYW1lKQpyZXR1cm47dmFyIElIYXRlSUU9 Y29udGV4dC4kdGV4dGFyZWEuZGF0YSgnSUhhdGVJRScpO2lmKCFJSGF0ZUlFKQpy ZXR1cm47Y29udGV4dC4kdGV4dGFyZWEuc2Nyb2xsVG9wKElIYXRlSUUuc2Nyb2xs VG9wKTtjb250ZXh0LiR0ZXh0YXJlYS50ZXh0U2VsZWN0aW9uKCdzZXRTZWxlY3Rp b24nLHtzdGFydDpJSGF0ZUlFLnBvc1swXSxlbmQ6SUhhdGVJRS5wb3NbMV19KTtj b250ZXh0LiR0ZXh0YXJlYS5kYXRhKCdJSGF0ZUlFJyxudWxsKTt9fTtjb250ZXh0 LiR0ZXh0YXJlYS53cmFwQWxsKCQoJzxkaXY+PC9kaXY+JykuYWRkQ2xhc3MoJ3dp a2lFZGl0b3ItdWknKSkud3JhcEFsbCgkKCc8ZGl2PjwvZGl2PicpLmFkZENsYXNz KCd3aWtpRWRpdG9yLXVpLXZpZXcgd2lraUVkaXRvci11aS12aWV3LXdpa2l0ZXh0 JykpLndyYXBBbGwoJCgnPGRpdj48L2Rpdj4nKS5hZGRDbGFzcygnd2lraUVkaXRv ci11aS1sZWZ0JykpLndyYXBBbGwoJCgnPGRpdj48L2Rpdj4nKS5hZGRDbGFzcygn d2lraUVkaXRvci11aS1ib3R0b20nKSkud3JhcEFsbCgkKCc8ZGl2PjwvZGl2Picp LmFkZENsYXNzKCd3aWtpRWRpdG9yLXVpLXRleHQnKSk7Y29udGV4dC4kdWk9Y29u dGV4dC4kdGV4dGFyZWEucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50 KCkucGFyZW50KCk7Y29udGV4dC4kd2lraXRleHQ9Y29udGV4dC4kdGV4dGFyZWEu cGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50KCk7Y29udGV4dC4kd2lr aXRleHQuYmVmb3JlKCQoJzxkaXY+PC9kaXY+JykuYWRkQ2xhc3MoJ3dpa2lFZGl0 b3ItdWktY29udHJvbHMnKS5hcHBlbmQoJCgnPGRpdj48L2Rpdj4nKS5hZGRDbGFz cygnd2lraUVkaXRvci11aS10YWJzJykuaGlkZSgpKS5hcHBlbmQoJCgnPGRpdj48 L2Rpdj4nKS5hZGRDbGFzcygnd2lraUVkaXRvci11aS1idXR0b25zJykpKS5iZWZv cmUoJCgnPGRpdiBzdHlsZT0iY2xlYXI6Ym90aDsiPjwvZGl2PicpKTtjb250ZXh0 LiRjb250cm9scz1jb250ZXh0LiR1aS5maW5kKCcud2lraUVkaXRvci11aS1idXR0 b25zJykuaGlkZSgpO2NvbnRleHQuJGJ1dHRvbnM9Y29udGV4dC4kdWkuZmluZCgn Lndpa2lFZGl0b3ItdWktYnV0dG9ucycpO2NvbnRleHQuJHRhYnM9Y29udGV4dC4k dWkuZmluZCgnLndpa2lFZGl0b3ItdWktdGFicycpO2NvbnRleHQuJHVpLmFmdGVy KCQoJzxkaXYgc3R5bGU9ImNsZWFyOmJvdGg7Ij48L2Rpdj4nKSk7Y29udGV4dC4k d2lraXRleHQuYXBwZW5kKCQoJzxkaXY+PC9kaXY+JykuYWRkQ2xhc3MoJ3dpa2lF ZGl0b3ItdWktcmlnaHQnKSk7Y29udGV4dC4kd2lraXRleHQuZmluZCgnLndpa2lF ZGl0b3ItdWktbGVmdCcpLnByZXBlbmQoJCgnPGRpdj48L2Rpdj4nKS5hZGRDbGFz cygnd2lraUVkaXRvci11aS10b3AnKSk7Y29udGV4dC52aWV3PSd3aWtpdGV4dCc7 JCh3aW5kb3cpLnJlc2l6ZShmdW5jdGlvbihldmVudCl7Y29udGV4dC5mbi50cmln Z2VyKCdyZXNpemUnLGV2ZW50KTt9KTt9CnZhciBhcmdzPSQubWFrZUFycmF5KGFy Z3VtZW50cyk7aWYodHlwZW9mIGNvbnRleHQuJGlmcmFtZT09PSd1bmRlZmluZWQn JiZhcmdzWzBdPT0nYWRkTW9kdWxlJyYmdHlwZW9mIGFyZ3NbMV0hPSd1bmRlZmlu ZWQnKXt2YXIgbW9kdWxlcz1hcmdzWzFdO2lmKHR5cGVvZiBtb2R1bGVzIT0ib2Jq ZWN0Iil7bW9kdWxlcz17fTttb2R1bGVzW2FyZ3NbMV1dPScnO30KZm9yKG1vZHVs ZSBpbiBtb2R1bGVzKXtpZihtb2R1bGUgaW4gJC53aWtpRWRpdG9yLm1vZHVsZXMm JiQud2lraUVkaXRvci5pc1N1cHBvcnRlZCgkLndpa2lFZGl0b3IubW9kdWxlc1tt b2R1bGVdKSYmJC53aWtpRWRpdG9yLmlzUmVxdWlyZWQoJC53aWtpRWRpdG9yLm1v ZHVsZXNbbW9kdWxlXSwnaWZyYW1lJykpe2NvbnRleHQuZm4uc2V0dXBJZnJhbWUo KTticmVhazt9fX0KaWYoYXJncy5sZW5ndGg+MCl7dmFyIGNhbGw9YXJncy5zaGlm dCgpO2lmKGNhbGwgaW4gY29udGV4dC5hcGkpe2NvbnRleHQuYXBpW2NhbGxdKGNv bnRleHQsdHlwZW9mIGFyZ3NbMF09PSd1bmRlZmluZWQnP3t9OmFyZ3NbMF0pO319 CnJldHVybiAkKHRoaXMpLmRhdGEoJ3dpa2lFZGl0b3ItY29udGV4dCcsY29udGV4 dCk7fTt9KShqUXVlcnkpO1JlZ0V4cC5lc2NhcGU9ZnVuY3Rpb24ocyl7cmV0dXJu IHMucmVwbGFjZSgvKFsuKis/XiR7fSgpfFwvXFxbXF1dKS9nLCdcXCQxJyk7fTso ZnVuY3Rpb24oJCl7JC53aWtpRWRpdG9yLm1vZHVsZXMuZGlhbG9ncz17J2Jyb3dz ZXJzJzp7J2x0cic6eydtc2llJzpbWyc+PScsN11dLCdmaXJlZm94JzpbWyc+PScs Ml0sWychPScsJzIuMCddLFsnIT0nLCcyLjAuMC4xJ10sWychPScsJzIuMC4wLjIn XSxbJyE9JywnMi4wLjAuMyddLFsnIT0nLCcyLjAuMC40J11dLCdvcGVyYSc6W1sn Pj0nLDkuNl1dLCdzYWZhcmknOltbJz49JywzXV0sJ2Nocm9tZSc6W1snPj0nLDNd XX0sJ3J0bCc6eydtc2llJzpbWyc+PScsN11dLCdmaXJlZm94JzpbWyc+PScsMl0s WychPScsJzIuMCddLFsnIT0nLCcyLjAuMC4xJ10sWychPScsJzIuMC4wLjInXSxb JyE9JywnMi4wLjAuMyddLFsnIT0nLCcyLjAuMC40J11dLCdvcGVyYSc6W1snPj0n LDkuNl1dLCdzYWZhcmknOltbJz49JywzXV0sJ2Nocm9tZSc6W1snPj0nLDNdXX19 LGFwaTp7YWRkRGlhbG9nOmZ1bmN0aW9uKGNvbnRleHQsZGF0YSl7JC53aWtpRWRp dG9yLm1vZHVsZXMuZGlhbG9ncy5mbi5jcmVhdGUoY29udGV4dCxkYXRhKX0sb3Bl bkRpYWxvZzpmdW5jdGlvbihjb250ZXh0LG1vZHVsZSl7bXcudXNhYmlsaXR5Lmxv YWQoWyckai51aScsJyRqLnVpLmRpYWxvZycsJyRqLnVpLmRyYWdnYWJsZScsJyRq LnVpLnJlc2l6YWJsZSddLGZ1bmN0aW9uKCl7aWYobW9kdWxlIGluICQud2lraUVk aXRvci5tb2R1bGVzLmRpYWxvZ3MubW9kdWxlcyl7dmFyIG1vZD0kLndpa2lFZGl0 b3IubW9kdWxlcy5kaWFsb2dzLm1vZHVsZXNbbW9kdWxlXTt2YXIgJGRpYWxvZz0k KCcjJyttb2QuaWQpO2lmKCRkaWFsb2cubGVuZ3RoPT0wKXskLndpa2lFZGl0b3Iu bW9kdWxlcy5kaWFsb2dzLmZuLnJlYWxseUNyZWF0ZShjb250ZXh0LG1vZCk7JGRp YWxvZz0kKCcjJyttb2QuaWQpO30KJGRpYWxvZy5jbG9zZXN0KCcudWktZGlhbG9n JykuZmluZCgnLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZScpLnJlbW92ZUNsYXNz KCd1aS1zdGF0ZS1mb2N1cycpOyRkaWFsb2cuZGlhbG9nKCdvcGVuJyk7fX0pO30s Y2xvc2VEaWFsb2c6ZnVuY3Rpb24oY29udGV4dCxtb2R1bGUpe2lmKG1vZHVsZSBp biAkLndpa2lFZGl0b3IubW9kdWxlcy5kaWFsb2dzLm1vZHVsZXMpeyQoJyMnKyQu d2lraUVkaXRvci5tb2R1bGVzLmRpYWxvZ3MubW9kdWxlc1ttb2R1bGVdLmlkKS5k aWFsb2coJ2Nsb3NlJyk7fX19LGZuOntjcmVhdGU6ZnVuY3Rpb24oY29udGV4dCxj b25maWcpe2Zvcihtb2QgaW4gY29uZmlnKXt2YXIgbW9kdWxlPWNvbmZpZ1ttb2Rd O3ZhciBmaWx0ZXJlZD1mYWxzZTtpZih0eXBlb2YgbW9kdWxlLmZpbHRlcnMhPSd1 bmRlZmluZWQnKXtmb3IodmFyIGk9MDtpPG1vZHVsZS5maWx0ZXJzLmxlbmd0aDtp Kyspe2lmKCQobW9kdWxlLmZpbHRlcnNbaV0pLmxlbmd0aD09MCl7ZmlsdGVyZWQ9 dHJ1ZTticmVhazt9fX0KaWYoIWZpbHRlcmVkJiYkLndpa2lFZGl0b3IuaXNTdXBw b3J0ZWQobW9kdWxlKSYmJCgnIycrbW9kdWxlLmlkKS5zaXplKCk9PTApeyQud2lr aUVkaXRvci5tb2R1bGVzLmRpYWxvZ3MubW9kdWxlc1ttb2RdPW1vZHVsZTtpZih0 eXBlb2YgY29udGV4dC4kaWZyYW1lPT0ndW5kZWZpbmVkJyYmJC53aWtpRWRpdG9y LmlzUmVxdWlyZWQobW9kdWxlLCdpZnJhbWUnKSl7Y29udGV4dC5mbi5zZXR1cElm cmFtZSgpO30KY29udGV4dC4kdGV4dGFyZWEudHJpZ2dlcignd2lraUVkaXRvci1k aWFsb2dzLXNldHVwLScrbW9kKTt9fX0scmVhbGx5Q3JlYXRlOmZ1bmN0aW9uKGNv bnRleHQsbW9kdWxlKXt2YXIgY29uZmlndXJhdGlvbj1tb2R1bGUuZGlhbG9nO2Nv bmZpZ3VyYXRpb24uYmdpZnJhbWU9dHJ1ZTtjb25maWd1cmF0aW9uLmF1dG9PcGVu PWZhbHNlO2NvbmZpZ3VyYXRpb24ubW9kYWw9dHJ1ZTtjb25maWd1cmF0aW9uLnRp dGxlPSQud2lraUVkaXRvci5hdXRvTXNnKG1vZHVsZSwndGl0bGUnKTtjb25maWd1 cmF0aW9uLm5ld0J1dHRvbnM9e307Zm9yKG1zZyBpbiBjb25maWd1cmF0aW9uLmJ1 dHRvbnMpCmNvbmZpZ3VyYXRpb24ubmV3QnV0dG9uc1ttdy51c2FiaWxpdHkuZ2V0 TXNnKG1zZyldPWNvbmZpZ3VyYXRpb24uYnV0dG9uc1ttc2ddO2NvbmZpZ3VyYXRp b24uYnV0dG9ucz1jb25maWd1cmF0aW9uLm5ld0J1dHRvbnM7dmFyIGRpYWxvZ0Rp dj0kKCc8ZGl2IC8+JykuYXR0cignaWQnLG1vZHVsZS5pZCkuaHRtbChtb2R1bGUu aHRtbCkuZGF0YSgnY29udGV4dCcsY29udGV4dCkuYXBwZW5kVG8oJCgnYm9keScp KS5lYWNoKG1vZHVsZS5pbml0KS5kaWFsb2coY29uZmlndXJhdGlvbik7JC53aWtp RWRpdG9yLm1vZHVsZXMuZGlhbG9ncy5mbi5zZXRUYWJpbmRleGVzKGRpYWxvZ0Rp di5jbG9zZXN0KCcudWktZGlhbG9nJykuZmluZCgnYnV0dG9uJykubm90KCdbdGFi aW5kZXhdJykpO2lmKCEoJ3Jlc2l6ZW1lJ2luIG1vZHVsZSl8fG1vZHVsZS5yZXNp emVtZSl7ZGlhbG9nRGl2LmJpbmQoJ2RpYWxvZ29wZW4nLCQud2lraUVkaXRvci5t b2R1bGVzLmRpYWxvZ3MuZm4ucmVzaXplKS5maW5kKCcudWktdGFicycpLmJpbmQo J3RhYnNzaG93JyxmdW5jdGlvbigpeyQodGhpcykuY2xvc2VzdCgnLnVpLWRpYWxv Zy1jb250ZW50JykuZWFjaCgkLndpa2lFZGl0b3IubW9kdWxlcy5kaWFsb2dzLmZu LnJlc2l6ZSk7fSk7fQpkaWFsb2dEaXYuYmluZCgnZGlhbG9nY2xvc2UnLGZ1bmN0 aW9uKCl7Y29udGV4dC5mbi5yZXN0b3JlU2VsZWN0aW9uKCk7fSk7Y29udGV4dC4k dGV4dGFyZWEudHJpZ2dlcignd2lraUVkaXRvci1kaWFsb2dzLWxvYWRlZC0nK21v ZCk7fSxyZXNpemU6ZnVuY3Rpb24oKXt2YXIgd3JhcHBlcj0kKHRoaXMpLmNsb3Nl c3QoJy51aS1kaWFsb2cnKTt2YXIgb2xkV2lkdGg9d3JhcHBlci53aWR0aCgpO3Zh ciBvbGRIaWRkZW49JCh0aGlzKS5maW5kKCcqJykubm90KCc6dmlzaWJsZScpO29s ZEhpZGRlbi5lYWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS5kYXRhKCdvbGRzdHlsZScs JCh0aGlzKS5hdHRyKCdzdHlsZScpKTt9KTtvbGRIaWRkZW4uc2hvdygpO3ZhciBv bGRXUz0kKHRoaXMpLmNzcygnd2hpdGUtc3BhY2UnKTskKHRoaXMpLmNzcygnd2hp dGUtc3BhY2UnLCdub3dyYXAnKTtpZih3cmFwcGVyLndpZHRoKCk8PSQodGhpcyku Z2V0KDApLnNjcm9sbFdpZHRoKXt2YXIgdGhpc1dpZHRoPSQodGhpcykuZGF0YSgn dGhpc1dpZHRoJyk/JCh0aGlzKS5kYXRhKCd0aGlzV2lkdGgnKTowO3RoaXNXaWR0 aD1NYXRoLm1heCgkKHRoaXMpLmdldCgwKS5zY3JvbGxXaWR0aCx0aGlzV2lkdGgp OyQodGhpcykud2lkdGgodGhpc1dpZHRoKTskKHRoaXMpLmRhdGEoJ3RoaXNXaWR0 aCcsdGhpc1dpZHRoKTt2YXIgd3JhcHBlcldpZHRoPSQodGhpcykuZGF0YSgnd3Jh cHBlcldpZHRoJyk/JCh0aGlzKS5kYXRhKCd3cmFwcGVyV2lkdGgnKTowO3dyYXBw ZXJXaWR0aD1NYXRoLm1heCh3cmFwcGVyLmdldCgwKS5zY3JvbGxXaWR0aCx3cmFw cGVyV2lkdGgpO3dyYXBwZXIud2lkdGgod3JhcHBlcldpZHRoKTskKHRoaXMpLmRh dGEoJ3dyYXBwZXJXaWR0aCcsd3JhcHBlcldpZHRoKTskKHRoaXMpLmRpYWxvZyh7 J3dpZHRoJzp3cmFwcGVyLndpZHRoKCl9KTt3cmFwcGVyLmNzcygnbGVmdCcscGFy c2VJbnQod3JhcHBlci5jc3MoJ2xlZnQnKSktKHdyYXBwZXIud2lkdGgoKS1vbGRX aWR0aCkvMik7fQokKHRoaXMpLmNzcygnd2hpdGUtc3BhY2UnLG9sZFdTKTtvbGRI aWRkZW4uZWFjaChmdW5jdGlvbigpeyQodGhpcykuYXR0cignc3R5bGUnLCQodGhp cykuZGF0YSgnb2xkc3R5bGUnKSk7fSk7fSxzZXRUYWJpbmRleGVzOmZ1bmN0aW9u KCRlbGVtZW50cyl7dmFyIHRhYkluZGV4PW13LnVzYWJpbGl0eS5nZXRNYXhUYWJJ bmRleCgpKzE7JGVsZW1lbnRzLmVhY2goZnVuY3Rpb24oKXskaih0aGlzKS5hdHRy KCd0YWJpbmRleCcsdGFiSW5kZXgrKyk7fSk7fX0sbW9kdWxlczp7fSxxdWlja0Rp YWxvZzpmdW5jdGlvbihib2R5LHNldHRpbmdzKXskKCc8ZGl2IC8+JykudGV4dChi b2R5KS5hcHBlbmRUbygkKCdib2R5JykpLmRpYWxvZygkLmV4dGVuZCh7YmdpZnJh bWU6dHJ1ZSxtb2RhbDp0cnVlfSxzZXR0aW5ncykpLmRpYWxvZygnb3BlbicpO319 O30pKGpRdWVyeSk7KGZ1bmN0aW9uKCQpeyQud2lraUVkaXRvci5tb2R1bGVzLnRv b2xiYXI9e2FwaTp7YWRkVG9Ub29sYmFyOmZ1bmN0aW9uKGNvbnRleHQsZGF0YSl7 Zm9yKHR5cGUgaW4gZGF0YSl7c3dpdGNoKHR5cGUpe2Nhc2Unc2VjdGlvbnMnOnZh ciAkc2VjdGlvbnM9Y29udGV4dC5tb2R1bGVzLnRvb2xiYXIuJHRvb2xiYXIuZmlu ZCgnZGl2LnNlY3Rpb25zJyk7dmFyICR0YWJzPWNvbnRleHQubW9kdWxlcy50b29s YmFyLiR0b29sYmFyLmZpbmQoJ2Rpdi50YWJzJyk7Zm9yKHNlY3Rpb24gaW4gZGF0 YVt0eXBlXSl7aWYoc2VjdGlvbj09J21haW4nKXtjb250ZXh0Lm1vZHVsZXMudG9v bGJhci4kdG9vbGJhci5wcmVwZW5kKCQud2lraUVkaXRvci5tb2R1bGVzLnRvb2xi YXIuZm4uYnVpbGRTZWN0aW9uKGNvbnRleHQsc2VjdGlvbixkYXRhW3R5cGVdW3Nl Y3Rpb25dKSk7Y29udGludWU7fQokc2VjdGlvbnMuYXBwZW5kKCQud2lraUVkaXRv ci5tb2R1bGVzLnRvb2xiYXIuZm4uYnVpbGRTZWN0aW9uKGNvbnRleHQsc2VjdGlv bixkYXRhW3R5cGVdW3NlY3Rpb25dKSk7JHRhYnMuYXBwZW5kKCQud2lraUVkaXRv ci5tb2R1bGVzLnRvb2xiYXIuZm4uYnVpbGRUYWIoY29udGV4dCxzZWN0aW9uLGRh dGFbdHlwZV1bc2VjdGlvbl0pKTskc2VjdGlvbj0kc2VjdGlvbnMuZmluZCgnLnNl Y3Rpb246dmlzaWJsZScpO2lmKCRzZWN0aW9uLnNpemUoKSl7JHNlY3Rpb25zLmFu aW1hdGUoeydoZWlnaHQnOiRzZWN0aW9uLm91dGVySGVpZ2h0KCl9LCdmYXN0Jyk7 fX0KYnJlYWs7Y2FzZSdncm91cHMnOmlmKCEoJ3NlY3Rpb24naW4gZGF0YSkpe2Nv bnRpbnVlO30KdmFyICRzZWN0aW9uPWNvbnRleHQubW9kdWxlcy50b29sYmFyLiR0 b29sYmFyLmZpbmQoJ2RpdltyZWw9JytkYXRhLnNlY3Rpb24rJ10uc2VjdGlvbicp O2Zvcihncm91cCBpbiBkYXRhW3R5cGVdKXskc2VjdGlvbi5hcHBlbmQoJC53aWtp RWRpdG9yLm1vZHVsZXMudG9vbGJhci5mbi5idWlsZEdyb3VwKGNvbnRleHQsZ3Jv dXAsZGF0YVt0eXBlXVtncm91cF0pKTt9CmJyZWFrO2Nhc2UndG9vbHMnOmlmKCEo J3NlY3Rpb24naW4gZGF0YSYmJ2dyb3VwJ2luIGRhdGEpKXtjb250aW51ZTt9CnZh ciAkZ3JvdXA9Y29udGV4dC5tb2R1bGVzLnRvb2xiYXIuJHRvb2xiYXIuZmluZCgn ZGl2W3JlbD0nK2RhdGEuc2VjdGlvbisnXS5zZWN0aW9uICcrJ2RpdltyZWw9Jytk YXRhLmdyb3VwKyddLmdyb3VwJyk7Zm9yKHRvb2wgaW4gZGF0YVt0eXBlXSl7JGdy b3VwLmFwcGVuZCgkLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFyLmZuLmJ1aWxk VG9vbChjb250ZXh0LHRvb2wsZGF0YVt0eXBlXVt0b29sXSkpO30KaWYoJGdyb3Vw LmNoaWxkcmVuKCkubGVuZ3RoKXskZ3JvdXAuc2hvdygpO30KYnJlYWs7Y2FzZSdw YWdlcyc6aWYoISgnc2VjdGlvbidpbiBkYXRhKSl7Y29udGludWU7fQp2YXIgJHBh Z2VzPWNvbnRleHQubW9kdWxlcy50b29sYmFyLiR0b29sYmFyLmZpbmQoJ2Rpdlty ZWw9JytkYXRhLnNlY3Rpb24rJ10uc2VjdGlvbiAucGFnZXMnKTt2YXIgJGluZGV4 PWNvbnRleHQubW9kdWxlcy50b29sYmFyLiR0b29sYmFyLmZpbmQoJ2RpdltyZWw9 JytkYXRhLnNlY3Rpb24rJ10uc2VjdGlvbiAuaW5kZXgnKTtmb3IocGFnZSBpbiBk YXRhW3R5cGVdKXskcGFnZXMuYXBwZW5kKCQud2lraUVkaXRvci5tb2R1bGVzLnRv b2xiYXIuZm4uYnVpbGRQYWdlKGNvbnRleHQscGFnZSxkYXRhW3R5cGVdW3BhZ2Vd KSk7JGluZGV4LmFwcGVuZCgkLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFyLmZu LmJ1aWxkQm9va21hcmsoY29udGV4dCxwYWdlLGRhdGFbdHlwZV1bcGFnZV0pKTt9 CiQud2lraUVkaXRvci5tb2R1bGVzLnRvb2xiYXIuZm4udXBkYXRlQm9va2xldFNl bGVjdGlvbihjb250ZXh0LHBhZ2UsJHBhZ2VzLCRpbmRleCk7YnJlYWs7Y2FzZSdy b3dzJzppZighKCdzZWN0aW9uJ2luIGRhdGEmJidwYWdlJ2luIGRhdGEpKXtjb250 aW51ZTt9CnZhciAkdGFibGU9Y29udGV4dC5tb2R1bGVzLnRvb2xiYXIuJHRvb2xi YXIuZmluZCgnZGl2W3JlbD0nK2RhdGEuc2VjdGlvbisnXS5zZWN0aW9uICcrJ2Rp dltyZWw9JytkYXRhLnBhZ2UrJ10ucGFnZSB0YWJsZScpO2Zvcihyb3cgaW4gZGF0 YVt0eXBlXSl7JHRhYmxlLmFwcGVuZCgkLndpa2lFZGl0b3IubW9kdWxlcy50b29s YmFyLmZuLmJ1aWxkUm93KGNvbnRleHQsZGF0YVt0eXBlXVtyb3ddKSk7fQpicmVh aztjYXNlJ2NoYXJhY3RlcnMnOmlmKCEoJ3NlY3Rpb24naW4gZGF0YSYmJ3BhZ2Un aW4gZGF0YSkpe2NvbnRpbnVlO30KJGNoYXJhY3RlcnM9Y29udGV4dC5tb2R1bGVz LnRvb2xiYXIuJHRvb2xiYXIuZmluZCgnZGl2W3JlbD0nK2RhdGEuc2VjdGlvbisn XS5zZWN0aW9uICcrJ2RpdltyZWw9JytkYXRhLnBhZ2UrJ10ucGFnZSBkaXYnKTt2 YXIgYWN0aW9ucz0kY2hhcmFjdGVycy5kYXRhKCdhY3Rpb25zJyk7Zm9yKGNoYXJh Y3RlciBpbiBkYXRhW3R5cGVdKXskY2hhcmFjdGVycy5hcHBlbmQoJCgkLndpa2lF ZGl0b3IubW9kdWxlcy50b29sYmFyLmZuLmJ1aWxkQ2hhcmFjdGVyKGRhdGFbdHlw ZV1bY2hhcmFjdGVyXSxhY3Rpb25zKSkubW91c2Vkb3duKGZ1bmN0aW9uKGUpe2Nv bnRleHQuZm4uc2F2ZVN0dWZmRm9ySUUoKTtlLnByZXZlbnREZWZhdWx0KCk7cmV0 dXJuIGZhbHNlO30pLmNsaWNrKGZ1bmN0aW9uKGUpeyQud2lraUVkaXRvci5tb2R1 bGVzLnRvb2xiYXIuZm4uZG9BY3Rpb24oJCh0aGlzKS5wYXJlbnQoKS5kYXRhKCdj b250ZXh0JyksJCh0aGlzKS5wYXJlbnQoKS5kYXRhKCdhY3Rpb25zJylbJCh0aGlz KS5hdHRyKCdyZWwnKV0pO2UucHJldmVudERlZmF1bHQoKTtyZXR1cm4gZmFsc2U7 fSkpO30KYnJlYWs7ZGVmYXVsdDpicmVhazt9fX0scmVtb3ZlRnJvbVRvb2xiYXI6 ZnVuY3Rpb24oY29udGV4dCxkYXRhKXtpZih0eXBlb2YgZGF0YS5zZWN0aW9uPT0n c3RyaW5nJyl7dmFyIHRhYj0nZGl2LnRhYnMgc3BhbltyZWw9JytkYXRhLnNlY3Rp b24rJ10udGFiJzt2YXIgdGFyZ2V0PSdkaXZbcmVsPScrZGF0YS5zZWN0aW9uKydd LnNlY3Rpb24nO3ZhciBncm91cD1udWxsO2lmKHR5cGVvZiBkYXRhLmdyb3VwPT0n c3RyaW5nJyl7dGFyZ2V0Kz0nIGRpdltyZWw9JytkYXRhLmdyb3VwKyddLmdyb3Vw JztpZih0eXBlb2YgZGF0YS50b29sPT0nc3RyaW5nJyl7Z3JvdXA9dGFyZ2V0O3Rh cmdldCs9JyBzcGFuW3JlbD0nK2RhdGEudG9vbCsnXS50b29sJzt9fWVsc2UgaWYo dHlwZW9mIGRhdGEucGFnZT09J3N0cmluZycpe3ZhciBpbmRleD10YXJnZXQrJyBk aXYuaW5kZXggZGl2W3JlbD0nK2RhdGEucGFnZSsnXSc7dGFyZ2V0Kz0nIGRpdi5w YWdlcyBkaXZbcmVsPScrZGF0YS5wYWdlKyddLnBhZ2UnO2lmKHR5cGVvZiBkYXRh LmNoYXJhY3Rlcj09J3N0cmluZycpe3RhcmdldCs9JyBhW3JlbD0nK2RhdGEuY2hh cmFjdGVyKyddJzt9ZWxzZSBpZih0eXBlb2YgZGF0YS5yb3c9PSdudW1iZXInKXt0 YXJnZXQrPScgdGFibGUgdHI6bm90KDpoYXModGgpKTplcSgnK2RhdGEucm93Kycp Jzt9ZWxzZXtjb250ZXh0Lm1vZHVsZXMudG9vbGJhci4kdG9vbGJhci5maW5kKGlu ZGV4KS5yZW1vdmUoKTskLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFyLmZuLnVw ZGF0ZUJvb2tsZXRTZWxlY3Rpb24oY29udGV4dCxudWxsLGNvbnRleHQubW9kdWxl cy50b29sYmFyLiR0b29sYmFyLmZpbmQodGFyZ2V0KSxjb250ZXh0Lm1vZHVsZXMu dG9vbGJhci4kdG9vbGJhci5maW5kKGluZGV4KSk7fX1lbHNle2NvbnRleHQubW9k dWxlcy50b29sYmFyLiR0b29sYmFyLmZpbmQodGFiKS5yZW1vdmUoKTt9CmNvbnRl eHQubW9kdWxlcy50b29sYmFyLiR0b29sYmFyLmZpbmQodGFyZ2V0KS5yZW1vdmUo KTtpZihncm91cCl7JGdyb3VwPWNvbnRleHQubW9kdWxlcy50b29sYmFyLiR0b29s YmFyLmZpbmQoZ3JvdXApO2lmKCRncm91cC5jaGlsZHJlbigpLmxlbmd0aD09MCl7 JGdyb3VwLmhpZGUoKTt9fX19fSxldnQ6e3Jlc2l6ZTpmdW5jdGlvbihjb250ZXh0 LGV2ZW50KXtjb250ZXh0LiR1aS5maW5kKCcuc2VjdGlvbnMnKS5oZWlnaHQoY29u dGV4dC4kdWkuZmluZCgnLnNlY3Rpb25zIC5zZWN0aW9uLXZpc2libGUnKS5vdXRl ckhlaWdodCgpKTt9LHRvY0NvbGxhcHNlOmZ1bmN0aW9uKGNvbnRleHQsZXZlbnQp eyQud2lraUVkaXRvci5tb2R1bGVzLnRvb2xiYXIuZXZ0LnJlc2l6ZShjb250ZXh0 LGV2ZW50KTt9LHRvY0V4cGFuZDpmdW5jdGlvbihjb250ZXh0LGV2ZW50KXskLndp a2lFZGl0b3IubW9kdWxlcy50b29sYmFyLmV2dC5yZXNpemUoY29udGV4dCxldmVu dCk7fX0sZm46e2NyZWF0ZTpmdW5jdGlvbihjb250ZXh0LGNvbmZpZyl7aWYoJyR0 b29sYmFyJ2luIGNvbnRleHQubW9kdWxlcy50b29sYmFyKXtyZXR1cm47fQpjb250 ZXh0Lm1vZHVsZXMudG9vbGJhci4kdG9vbGJhcj0kKCc8ZGl2IC8+JykuYWRkQ2xh c3MoJ3dpa2lFZGl0b3ItdWktdG9vbGJhcicpLmF0dHIoJ2lkJywnd2lraUVkaXRv ci11aS10b29sYmFyJyk7JC53aWtpRWRpdG9yLm1vZHVsZXMudG9vbGJhci5mbi5i dWlsZChjb250ZXh0LGNvbmZpZyk7Y29udGV4dC4kdWkuZmluZCgnLndpa2lFZGl0 b3ItdWktdG9wJykuYXBwZW5kKGNvbnRleHQubW9kdWxlcy50b29sYmFyLiR0b29s YmFyKTt9LGRvQWN0aW9uOmZ1bmN0aW9uKGNvbnRleHQsYWN0aW9uLHNvdXJjZSl7 aWYoJC50cmFja0FjdGlvbiE9dW5kZWZpbmVkJiZzb3VyY2UuY2xvc2VzdCgnLndp a2lFZGl0b3ItdWktdG9vbGJhcicpLnNpemUoKSl7dmFyIHJlbHM9W107dmFyIHN0 ZXA9c291cmNlO3ZhciBpPTA7d2hpbGUoIXN0ZXAuaGFzQ2xhc3MoJ3dpa2lFZGl0 b3ItdWktdG9vbGJhcicpKXtpZihpPjI1KXticmVhazt9CmkrKzt2YXIgcmVsPXN0 ZXAuYXR0cigncmVsJyk7aWYocmVsKXtyZWxzLnB1c2goc3RlcC5hdHRyKCdyZWwn KSk7fQpzdGVwPXN0ZXAucGFyZW50KCk7fQpyZWxzLnJldmVyc2UoKTt2YXIgaWQ9 cmVscy5qb2luKCcuJyk7JC50cmFja0FjdGlvbihpZCk7fQpzd2l0Y2goYWN0aW9u LnR5cGUpe2Nhc2UncmVwbGFjZSc6Y2FzZSdlbmNhcHN1bGF0ZSc6dmFyIHBhcnRz PXsncHJlJzokLndpa2lFZGl0b3IuYXV0b01zZyhhY3Rpb24ub3B0aW9ucywncHJl JyksJ3BlcmknOiQud2lraUVkaXRvci5hdXRvTXNnKGFjdGlvbi5vcHRpb25zLCdw ZXJpJyksJ3Bvc3QnOiQud2lraUVkaXRvci5hdXRvTXNnKGFjdGlvbi5vcHRpb25z LCdwb3N0Jyl9O3ZhciByZXBsYWNlPWFjdGlvbi50eXBlPT0ncmVwbGFjZSc7aWYo J3JlZ2V4J2luIGFjdGlvbi5vcHRpb25zJiYncmVnZXhSZXBsYWNlJ2luIGFjdGlv bi5vcHRpb25zKXt2YXIgc2VsZWN0aW9uPWNvbnRleHQuJHRleHRhcmVhLnRleHRT ZWxlY3Rpb24oJ2dldFNlbGVjdGlvbicpO2lmKHNlbGVjdGlvbiE9JycmJnNlbGVj dGlvbi5tYXRjaChhY3Rpb24ub3B0aW9ucy5yZWdleCkpe3BhcnRzLnBlcmk9c2Vs ZWN0aW9uLnJlcGxhY2UoYWN0aW9uLm9wdGlvbnMucmVnZXgsYWN0aW9uLm9wdGlv bnMucmVnZXhSZXBsYWNlKTtwYXJ0cy5wcmU9cGFydHMucG9zdD0nJztyZXBsYWNl PXRydWU7fX0KY29udGV4dC4kdGV4dGFyZWEudGV4dFNlbGVjdGlvbignZW5jYXBz dWxhdGVTZWxlY3Rpb24nLCQuZXh0ZW5kKHt9LGFjdGlvbi5vcHRpb25zLHBhcnRz LHsncmVwbGFjZSc6cmVwbGFjZX0pKTtpZih0eXBlb2YgY29udGV4dC4kaWZyYW1l IT09J3VuZGVmaW5lZCcpe2NvbnRleHQuJGlmcmFtZVswXS5jb250ZW50V2luZG93 LmZvY3VzKCk7fQpicmVhaztjYXNlJ2NhbGxiYWNrJzppZih0eXBlb2YgYWN0aW9u LmV4ZWN1dGU9PSdmdW5jdGlvbicpe2FjdGlvbi5leGVjdXRlKGNvbnRleHQpO30K YnJlYWs7Y2FzZSdkaWFsb2cnOmNvbnRleHQuZm4uc2F2ZVNlbGVjdGlvbigpO2Nv bnRleHQuJHRleHRhcmVhLndpa2lFZGl0b3IoJ29wZW5EaWFsb2cnLGFjdGlvbi5t b2R1bGUpO2JyZWFrO2RlZmF1bHQ6YnJlYWs7fX0sYnVpbGRHcm91cDpmdW5jdGlv bihjb250ZXh0LGlkLGdyb3VwKXt2YXIgJGdyb3VwPSQoJzxkaXYgLz4nKS5hdHRy KHsnY2xhc3MnOidncm91cCBncm91cC0nK2lkLCdyZWwnOmlkfSk7dmFyIGxhYmVs PSQud2lraUVkaXRvci5hdXRvTXNnKGdyb3VwLCdsYWJlbCcpO2lmKGxhYmVsKXsk Z3JvdXAuYXBwZW5kKCc8ZGl2IGNsYXNzPSJsYWJlbCI+JytsYWJlbCsnPC9kaXY+ Jyl9CnZhciBlbXB0eT10cnVlO2lmKCd0b29scydpbiBncm91cCl7Zm9yKHRvb2wg aW4gZ3JvdXAudG9vbHMpe3ZhciB0b29sPSQud2lraUVkaXRvci5tb2R1bGVzLnRv b2xiYXIuZm4uYnVpbGRUb29sKGNvbnRleHQsdG9vbCxncm91cC50b29sc1t0b29s XSk7aWYodG9vbCl7ZW1wdHk9ZW1wdHkmJnRvb2wuY3NzKCdkaXNwbGF5Jyk9PSdu b25lJzskZ3JvdXAuYXBwZW5kKHRvb2wpO319fQppZihlbXB0eSl7JGdyb3VwLmhp ZGUoKTt9CnJldHVybiAkZ3JvdXA7fSxidWlsZFRvb2w6ZnVuY3Rpb24oY29udGV4 dCxpZCx0b29sKXtpZignZmlsdGVycydpbiB0b29sKXtmb3IoZmlsdGVyIGluIHRv b2wuZmlsdGVycyl7aWYoJCh0b29sLmZpbHRlcnNbZmlsdGVyXSkuc2l6ZSgpPT0w KXtyZXR1cm4gbnVsbDt9fX0KdmFyIGxhYmVsPSQud2lraUVkaXRvci5hdXRvTXNn KHRvb2wsJ2xhYmVsJyk7c3dpdGNoKHRvb2wudHlwZSl7Y2FzZSdidXR0b24nOnZh ciBzcmM9JC53aWtpRWRpdG9yLmF1dG9JY29uKHRvb2wuaWNvbiwkLndpa2lFZGl0 b3IuaW1nUGF0aCsndG9vbGJhci8nKTt2YXIgJGJ1dHRvbj1udWxsO2lmKCdvZmZz ZXQnaW4gdG9vbCl7dmFyIG9mZnNldE9ySWNvbj0kLndpa2lFZGl0b3IuYXV0b0lj b25Pck9mZnNldCh0b29sLmljb24sdG9vbC5vZmZzZXQsJC53aWtpRWRpdG9yLmlt Z1BhdGgrJ3Rvb2xiYXIvJyk7aWYodHlwZW9mIG9mZnNldE9ySWNvbj09J29iamVj dCcpeyRidXR0b249JCgnPHNwYW4gLz4nKS5hdHRyKHsnYWx0JzpsYWJlbCwndGl0 bGUnOmxhYmVsLCdyZWwnOmlkLCdjbGFzcyc6J3Rvb2wgdG9vbC1idXR0b24gd2lr aUVkaXRvci10b29sYmFyLXNwcml0ZWRCdXR0b24nfSkudGV4dChsYWJlbCkuY3Nz KCdiYWNrZ3JvdW5kUG9zaXRpb24nLG9mZnNldE9ySWNvblswXSsncHggJytvZmZz ZXRPckljb25bMV0rJ3B4Jyk7fX0KaWYoISRidXR0b24peyRidXR0b249JCgnPGlt ZyAvPicpLmF0dHIoeydzcmMnOnNyYywnd2lkdGgnOjIyLCdoZWlnaHQnOjIyLCdh bHQnOmxhYmVsLCd0aXRsZSc6bGFiZWwsJ3JlbCc6aWQsJ2NsYXNzJzondG9vbCB0 b29sLWJ1dHRvbid9KTt9CmlmKCdhY3Rpb24naW4gdG9vbCl7JGJ1dHRvbi5kYXRh KCdhY3Rpb24nLHRvb2wuYWN0aW9uKS5kYXRhKCdjb250ZXh0Jyxjb250ZXh0KS5t b3VzZWRvd24oZnVuY3Rpb24oZSl7Y29udGV4dC5mbi5zYXZlU3R1ZmZGb3JJRSgp O2UucHJldmVudERlZmF1bHQoKTtyZXR1cm4gZmFsc2U7fSkuY2xpY2soZnVuY3Rp b24oZSl7JC53aWtpRWRpdG9yLm1vZHVsZXMudG9vbGJhci5mbi5kb0FjdGlvbigk KHRoaXMpLmRhdGEoJ2NvbnRleHQnKSwkKHRoaXMpLmRhdGEoJ2FjdGlvbicpLCQo dGhpcykpO2UucHJldmVudERlZmF1bHQoKTtyZXR1cm4gZmFsc2U7fSk7aWYodG9v bC5hY3Rpb24udHlwZT09J2RpYWxvZycmJiEodG9vbC5hY3Rpb24ubW9kdWxlIGlu ICQud2lraUVkaXRvci5tb2R1bGVzLmRpYWxvZ3MubW9kdWxlcykpeyRidXR0b24u aGlkZSgpO2NvbnRleHQuJHRleHRhcmVhLmJpbmQoJ3dpa2lFZGl0b3ItZGlhbG9n cy1zZXR1cC0nK3Rvb2wuYWN0aW9uLm1vZHVsZSx7YnV0dG9uOiRidXR0b259LGZ1 bmN0aW9uKGV2ZW50KXtldmVudC5kYXRhLmJ1dHRvbi5zaG93KCkucGFyZW50KCku c2hvdygpO30pO319CnJldHVybiAkYnV0dG9uO2Nhc2Unc2VsZWN0Jzp2YXIgJHNl bGVjdD0kKCc8ZGl2IC8+JykuYXR0cih7J3JlbCc6aWQsJ2NsYXNzJzondG9vbCB0 b29sLXNlbGVjdCd9KTt2YXIgJG9wdGlvbnM9JCgnPGRpdiAvPicpLmFkZENsYXNz KCdvcHRpb25zJyk7aWYoJ2xpc3QnaW4gdG9vbCl7Zm9yKG9wdGlvbiBpbiB0b29s Lmxpc3Qpe3ZhciBvcHRpb25MYWJlbD0kLndpa2lFZGl0b3IuYXV0b01zZyh0b29s Lmxpc3Rbb3B0aW9uXSwnbGFiZWwnKTskb3B0aW9ucy5hcHBlbmQoJCgnPGEgLz4n KS5kYXRhKCdhY3Rpb24nLHRvb2wubGlzdFtvcHRpb25dLmFjdGlvbikuZGF0YSgn Y29udGV4dCcsY29udGV4dCkubW91c2Vkb3duKGZ1bmN0aW9uKGUpe2NvbnRleHQu Zm4uc2F2ZVN0dWZmRm9ySUUoKTtlLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGZh bHNlO30pLmNsaWNrKGZ1bmN0aW9uKGUpeyQud2lraUVkaXRvci5tb2R1bGVzLnRv b2xiYXIuZm4uZG9BY3Rpb24oJCh0aGlzKS5kYXRhKCdjb250ZXh0JyksJCh0aGlz KS5kYXRhKCdhY3Rpb24nKSwkKHRoaXMpKTtpZigkKHRoaXMpLnBhcmVudCgpLmlz KCc6dmlzaWJsZScpKXskKHRoaXMpLnBhcmVudCgpLmFuaW1hdGUoeydvcGFjaXR5 JzondG9nZ2xlJ30sJ2Zhc3QnKTt9CmUucHJldmVudERlZmF1bHQoKTtyZXR1cm4g ZmFsc2U7fSkudGV4dChvcHRpb25MYWJlbCkuYWRkQ2xhc3MoJ29wdGlvbicpLmF0 dHIoeydyZWwnOm9wdGlvbiwnaHJlZic6JyMnfSkpO319CiRzZWxlY3QuYXBwZW5k KCQoJzxkaXYgLz4nKS5hZGRDbGFzcygnbWVudScpLmFwcGVuZCgkb3B0aW9ucykp OyRzZWxlY3QuYXBwZW5kKCQoJzxhIC8+JykuYWRkQ2xhc3MoJ2xhYmVsJykudGV4 dChsYWJlbCkuZGF0YSgnb3B0aW9ucycsJG9wdGlvbnMpLmF0dHIoJ2hyZWYnLCcj JykubW91c2Vkb3duKGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKTtyZXR1 cm4gZmFsc2U7fSkuY2xpY2soZnVuY3Rpb24oZSl7JCh0aGlzKS5kYXRhKCdvcHRp b25zJykuYW5pbWF0ZSh7J29wYWNpdHknOid0b2dnbGUnfSwnZmFzdCcpO2UucHJl dmVudERlZmF1bHQoKTtyZXR1cm4gZmFsc2U7fSkpO3JldHVybiAkc2VsZWN0O2Rl ZmF1bHQ6cmV0dXJuIG51bGw7fX0sYnVpbGRCb29rbWFyazpmdW5jdGlvbihjb250 ZXh0LGlkLHBhZ2Upe3ZhciBsYWJlbD0kLndpa2lFZGl0b3IuYXV0b01zZyhwYWdl LCdsYWJlbCcpO3JldHVybiAkKCc8ZGl2IC8+JykudGV4dChsYWJlbCkuYXR0cign cmVsJyxpZCkuZGF0YSgnY29udGV4dCcsY29udGV4dCkubW91c2Vkb3duKGZ1bmN0 aW9uKGUpe2UucHJldmVudERlZmF1bHQoKTtyZXR1cm4gZmFsc2U7fSkuY2xpY2so ZnVuY3Rpb24oZXZlbnQpeyQodGhpcykucGFyZW50KCkucGFyZW50KCkuZmluZCgn LnBhZ2UnKS5oaWRlKCk7JCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5maW5kKCcu cGFnZS0nKyQodGhpcykuYXR0cigncmVsJykpLnNob3coKTskKHRoaXMpLnNpYmxp bmdzKCkucmVtb3ZlQ2xhc3MoJ2N1cnJlbnQnKTskKHRoaXMpLmFkZENsYXNzKCdj dXJyZW50Jyk7dmFyIHNlY3Rpb249JCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5h dHRyKCdyZWwnKTskLmNvb2tpZSgnd2lraUVkaXRvci0nKyQodGhpcykuZGF0YSgn Y29udGV4dCcpLmluc3RhbmNlKyctYm9va2xldC0nK3NlY3Rpb24rJy1wYWdlJywk KHRoaXMpLmF0dHIoJ3JlbCcpLHtleHBpcmVzOjMwLHBhdGg6Jy8nfSk7aWYoJC50 cmFja0FjdGlvbiE9dW5kZWZpbmVkKXskLnRyYWNrQWN0aW9uKHNlY3Rpb24rJy4n KyQodGhpcykuYXR0cigncmVsJykpO30KZXZlbnQucHJldmVudERlZmF1bHQoKTty ZXR1cm4gZmFsc2U7fSl9LGJ1aWxkUGFnZTpmdW5jdGlvbihjb250ZXh0LGlkLHBh Z2Upe3ZhciAkcGFnZT0kKCc8ZGl2IC8+JykuYXR0cih7J2NsYXNzJzoncGFnZSBw YWdlLScraWQsJ3JlbCc6aWR9KTtzd2l0Y2gocGFnZS5sYXlvdXQpe2Nhc2UndGFi bGUnOiRwYWdlLmFkZENsYXNzKCdwYWdlLXRhYmxlJyk7dmFyIGh0bWw9Jzx0YWJs ZSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgJysnYm9yZGVyPTAgd2lkdGg9 IjEwMCUiIGNsYXNzPSJ0YWJsZSB0YWJsZS0nK2lkKyciPic7aWYoJ2hlYWRpbmdz J2luIHBhZ2Upe2h0bWwrPSQud2lraUVkaXRvci5tb2R1bGVzLnRvb2xiYXIuZm4u YnVpbGRIZWFkaW5nKGNvbnRleHQscGFnZS5oZWFkaW5ncyl9CmlmKCdyb3dzJ2lu IHBhZ2Upe2Zvcihyb3cgaW4gcGFnZS5yb3dzKXtodG1sKz0kLndpa2lFZGl0b3Iu bW9kdWxlcy50b29sYmFyLmZuLmJ1aWxkUm93KGNvbnRleHQscGFnZS5yb3dzW3Jv d10pfX0KJHBhZ2UuaHRtbChodG1sKTticmVhaztjYXNlJ2NoYXJhY3RlcnMnOiRw YWdlLmFkZENsYXNzKCdwYWdlLWNoYXJhY3RlcnMnKTskY2hhcmFjdGVycz0kKCc8 ZGl2IC8+JykuZGF0YSgnY29udGV4dCcsY29udGV4dCkuZGF0YSgnYWN0aW9ucycs e30pO3ZhciBhY3Rpb25zPSRjaGFyYWN0ZXJzLmRhdGEoJ2FjdGlvbnMnKTtpZign bGFuZ3VhZ2UnaW4gcGFnZSl7JGNoYXJhY3RlcnMuYXR0cignbGFuZycscGFnZS5s YW5ndWFnZSk7fQppZignZGlyZWN0aW9uJ2luIHBhZ2UpeyRjaGFyYWN0ZXJzLmF0 dHIoJ2RpcicscGFnZS5kaXJlY3Rpb24pO30KaWYoJ2NoYXJhY3RlcnMnaW4gcGFn ZSl7dmFyIGh0bWw9Jyc7Zm9yKHZhciBpPTA7aTxwYWdlLmNoYXJhY3RlcnMubGVu Z3RoO2krKyl7aHRtbCs9JC53aWtpRWRpdG9yLm1vZHVsZXMudG9vbGJhci5mbi5i dWlsZENoYXJhY3RlcihwYWdlLmNoYXJhY3RlcnNbaV0sYWN0aW9ucyk7fQokY2hh cmFjdGVycy5odG1sKGh0bWwpLmNoaWxkcmVuKCkubW91c2Vkb3duKGZ1bmN0aW9u KGUpe2NvbnRleHQuZm4uc2F2ZVN0dWZmRm9ySUUoKTtlLnByZXZlbnREZWZhdWx0 KCk7cmV0dXJuIGZhbHNlO30pLmNsaWNrKGZ1bmN0aW9uKGUpeyQud2lraUVkaXRv ci5tb2R1bGVzLnRvb2xiYXIuZm4uZG9BY3Rpb24oJCh0aGlzKS5wYXJlbnQoKS5k YXRhKCdjb250ZXh0JyksJCh0aGlzKS5wYXJlbnQoKS5kYXRhKCdhY3Rpb25zJylb JCh0aGlzKS5hdHRyKCdyZWwnKV0sJCh0aGlzKSk7ZS5wcmV2ZW50RGVmYXVsdCgp O3JldHVybiBmYWxzZTt9KTt9CiRwYWdlLmFwcGVuZCgkY2hhcmFjdGVycyk7YnJl YWs7fQpyZXR1cm4gJHBhZ2U7fSxidWlsZEhlYWRpbmc6ZnVuY3Rpb24oY29udGV4 dCxoZWFkaW5ncyl7dmFyIGh0bWw9Jzx0cj4nO2ZvcihoZWFkaW5nIGluIGhlYWRp bmdzKXtodG1sKz0nPHRoPicrJC53aWtpRWRpdG9yLmF1dG9Nc2coaGVhZGluZ3Nb aGVhZGluZ10sWydodG1sJywndGV4dCddKSsnPC90aD4nO30KcmV0dXJuIGh0bWw7 fSxidWlsZFJvdzpmdW5jdGlvbihjb250ZXh0LHJvdyl7dmFyIGh0bWw9Jzx0cj4n O2ZvcihjZWxsIGluIHJvdyl7aHRtbCs9Jzx0ZCBjbGFzcz0iY2VsbCBjZWxsLScr Y2VsbCsnIiB2YWxpZ249InRvcCI+PHNwYW4+JysKJC53aWtpRWRpdG9yLmF1dG9N c2cocm93W2NlbGxdLFsnaHRtbCcsJ3RleHQnXSkrJzwvc3Bhbj48L3RkPic7fQpo dG1sKz0nPC90cj4nO3JldHVybiBodG1sO30sYnVpbGRDaGFyYWN0ZXI6ZnVuY3Rp b24oY2hhcmFjdGVyLGFjdGlvbnMpe2lmKHR5cGVvZiBjaGFyYWN0ZXI9PSdzdHJp bmcnKXtjaGFyYWN0ZXI9eydsYWJlbCc6Y2hhcmFjdGVyLCdhY3Rpb24nOnsndHlw ZSc6J3JlcGxhY2UnLCdvcHRpb25zJzp7J3BlcmknOmNoYXJhY3Rlciwnc2VsZWN0 UGVyaSc6ZmFsc2V9fX07fWVsc2UgaWYoMCBpbiBjaGFyYWN0ZXImJjEgaW4gY2hh cmFjdGVyKXtjaGFyYWN0ZXI9eydsYWJlbCc6Y2hhcmFjdGVyWzBdLCdhY3Rpb24n OnsndHlwZSc6J3JlcGxhY2UnLCdvcHRpb25zJzp7J3BlcmknOmNoYXJhY3Rlclsx XSwnc2VsZWN0UGVyaSc6ZmFsc2V9fX07fQppZignYWN0aW9uJ2luIGNoYXJhY3Rl ciYmJ2xhYmVsJ2luIGNoYXJhY3Rlcil7YWN0aW9uc1tjaGFyYWN0ZXIubGFiZWxd PWNoYXJhY3Rlci5hY3Rpb247cmV0dXJuJzxzcGFuIHJlbD0iJytjaGFyYWN0ZXIu bGFiZWwrJyI+JytjaGFyYWN0ZXIubGFiZWwrJzwvc3Bhbj4nO319LGJ1aWxkVGFi OmZ1bmN0aW9uKGNvbnRleHQsaWQsc2VjdGlvbil7dmFyIHNlbGVjdGVkPSQuY29v a2llKCd3aWtpRWRpdG9yLScrY29udGV4dC5pbnN0YW5jZSsnLXRvb2xiYXItc2Vj dGlvbicpO2lmKHNlbGVjdGVkIT1udWxsKXskLmNvb2tpZSgnd2lraUVkaXRvci0n K2NvbnRleHQuaW5zdGFuY2UrJy10b29sYmFyLXNlY3Rpb24nLHNlbGVjdGVkLHtl eHBpcmVzOjMwLHBhdGg6Jy8nfSk7fQpyZXR1cm4gJCgnPHNwYW4gLz4nKS5hdHRy KHsnY2xhc3MnOid0YWIgdGFiLScraWQsJ3JlbCc6aWR9KS5hcHBlbmQoJCgnPGEg Lz4nKS5hZGRDbGFzcyhzZWxlY3RlZD09aWQ/J2N1cnJlbnQnOm51bGwpLmF0dHIo J2hyZWYnLCcjJykudGV4dCgkLndpa2lFZGl0b3IuYXV0b01zZyhzZWN0aW9uLCds YWJlbCcpKS5kYXRhKCdjb250ZXh0Jyxjb250ZXh0KS5tb3VzZXVwKGZ1bmN0aW9u KGUpeyQodGhpcykuYmx1cigpO30pLm1vdXNlZG93bihmdW5jdGlvbihlKXtlLnBy ZXZlbnREZWZhdWx0KCk7cmV0dXJuIGZhbHNlO30pLmNsaWNrKGZ1bmN0aW9uKGUp e3ZhciAkc2VjdGlvbnM9JCh0aGlzKS5kYXRhKCdjb250ZXh0JykuJHVpLmZpbmQo Jy5zZWN0aW9ucycpO3ZhciAkc2VjdGlvbj0kKHRoaXMpLmRhdGEoJ2NvbnRleHQn KS4kdWkuZmluZCgnLnNlY3Rpb24tJyskKHRoaXMpLnBhcmVudCgpLmF0dHIoJ3Jl bCcpKTt2YXIgc2hvdz0kc2VjdGlvbi5jc3MoJ2Rpc3BsYXknKT09J25vbmUnOyRw cmV2aW91c1NlY3Rpb25zPSRzZWN0aW9uLnBhcmVudCgpLmZpbmQoJy5zZWN0aW9u LXZpc2libGUnKTskcHJldmlvdXNTZWN0aW9ucy5jc3MoJ3Bvc2l0aW9uJywnYWJz b2x1dGUnKTskcHJldmlvdXNTZWN0aW9ucy5yZW1vdmVDbGFzcygnc2VjdGlvbi12 aXNpYmxlJyk7JHByZXZpb3VzU2VjdGlvbnMuZmFkZU91dCgnZmFzdCcsZnVuY3Rp b24oKXskKHRoaXMpLmNzcygncG9zaXRpb24nLCdyZWxhdGl2ZScpO30pOyQodGhp cykucGFyZW50KCkucGFyZW50KCkuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdjdXJy ZW50Jyk7JHNlY3Rpb25zLmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKTtmdW5jdGlv biBhbmltYXRlKCR0aGlzKXskc2VjdGlvbnMuY3NzKCdkaXNwbGF5JywnYmxvY2sn KS5hbmltYXRlKHsnaGVpZ2h0Jzokc2VjdGlvbi5vdXRlckhlaWdodCgpfSwkc2Vj dGlvbi5vdXRlckhlaWdodCgpKjIsZnVuY3Rpb24oKXskKHRoaXMpLmNzcygnb3Zl cmZsb3cnLCd2aXNpYmxlJykuY3NzKCdoZWlnaHQnLCdhdXRvJyk7Y29udGV4dC5m bi50cmlnZ2VyKCdyZXNpemUnKTt9KTt9CmlmKHNob3cpeyRzZWN0aW9uLmFkZENs YXNzKCdzZWN0aW9uLXZpc2libGUnKTskc2VjdGlvbi5mYWRlSW4oJ2Zhc3QnKTtp Zigkc2VjdGlvbi5oYXNDbGFzcygnbG9hZGluZycpKXt2YXIgJHRoaXM9JCh0aGlz KTskdGhpcy5hZGRDbGFzcygnY3VycmVudCBsb2FkaW5nJyk7c2V0VGltZW91dChm dW5jdGlvbigpeyRzZWN0aW9uLnRyaWdnZXIoJ2xvYWRTZWN0aW9uJyk7YW5pbWF0 ZSgkKHRoaXMpKTskdGhpcy5yZW1vdmVDbGFzcygnbG9hZGluZycpO30sMTAwMCk7 fWVsc2V7YW5pbWF0ZSgkKHRoaXMpKTskKHRoaXMpLmFkZENsYXNzKCdjdXJyZW50 Jyk7fX1lbHNleyRzZWN0aW9ucy5jc3MoJ2hlaWdodCcsJHNlY3Rpb24ub3V0ZXJI ZWlnaHQoKSkuYW5pbWF0ZSh7J2hlaWdodCc6J2hpZGUnfSwkc2VjdGlvbi5vdXRl ckhlaWdodCgpKjIsZnVuY3Rpb24oKXskKHRoaXMpLmNzcyh7J292ZXJmbG93Jzon dmlzaWJsZScsJ2hlaWdodCc6MH0pO2NvbnRleHQuZm4udHJpZ2dlcigncmVzaXpl Jyk7fSk7fQppZigkLnRyYWNrQWN0aW9uIT11bmRlZmluZWQpeyQudHJhY2tBY3Rp b24oJHNlY3Rpb24uYXR0cigncmVsJykrJy4nKyhzaG93PydzaG93JzonaGlkZScp KTt9CiQuY29va2llKCd3aWtpRWRpdG9yLScrJCh0aGlzKS5kYXRhKCdjb250ZXh0 JykuaW5zdGFuY2UrJy10b29sYmFyLXNlY3Rpb24nLHNob3c/JHNlY3Rpb24uYXR0 cigncmVsJyk6bnVsbCx7ZXhwaXJlczozMCxwYXRoOicvJ30pO2UucHJldmVudERl ZmF1bHQoKTtyZXR1cm4gZmFsc2U7fSkpO30sYnVpbGRTZWN0aW9uOmZ1bmN0aW9u KGNvbnRleHQsaWQsc2VjdGlvbil7dmFyICRzZWN0aW9uPSQoJzxkaXYgLz4nKS5h dHRyKHsnY2xhc3MnOnNlY3Rpb24udHlwZSsnIHNlY3Rpb24gc2VjdGlvbi0nK2lk LCdyZWwnOmlkfSk7dmFyIHNlbGVjdGVkPSQuY29va2llKCd3aWtpRWRpdG9yLScr Y29udGV4dC5pbnN0YW5jZSsnLXRvb2xiYXItc2VjdGlvbicpO3ZhciBzaG93PXNl bGVjdGVkPT1pZDtpZih0eXBlb2Ygc2VjdGlvbi5kZWZlckxvYWQhPSd1bmRlZmlu ZWQnJiZzZWN0aW9uLmRlZmVyTG9hZCYmaWQhPT0nbWFpbicmJiFzaG93KXskc2Vj dGlvbi5hZGRDbGFzcygnbG9hZGluZycpLmFwcGVuZCgkKCc8ZGl2IC8+JykuYWRk Q2xhc3MoJ3NwaW5uZXInKSk7JHNlY3Rpb24uYmluZCgnbG9hZFNlY3Rpb24nLGZ1 bmN0aW9uKCl7JC53aWtpRWRpdG9yLm1vZHVsZXMudG9vbGJhci5mbi5yZWFsbHlC dWlsZFNlY3Rpb24oY29udGV4dCxpZCxzZWN0aW9uLCRzZWN0aW9uKTskc2VjdGlv bi5yZW1vdmVDbGFzcygnbG9hZGluZycpO30pO31lbHNleyQud2lraUVkaXRvci5t b2R1bGVzLnRvb2xiYXIuZm4ucmVhbGx5QnVpbGRTZWN0aW9uKGNvbnRleHQsaWQs c2VjdGlvbiwkc2VjdGlvbik7fQppZihpZCE9PSdtYWluJyl7JHNlY3Rpb24uY3Nz KCdkaXNwbGF5JyxzaG93PydibG9jayc6J25vbmUnKTtpZihzaG93KQokc2VjdGlv bi5hZGRDbGFzcygnc2VjdGlvbi12aXNpYmxlJyk7fQpyZXR1cm4gJHNlY3Rpb247 fSxyZWFsbHlCdWlsZFNlY3Rpb246ZnVuY3Rpb24oY29udGV4dCxpZCxzZWN0aW9u LCRzZWN0aW9uKXtjb250ZXh0LiR0ZXh0YXJlYS50cmlnZ2VyKCd3aWtpRWRpdG9y LXRvb2xiYXItYnVpbGRTZWN0aW9uLScrJHNlY3Rpb24uYXR0cigncmVsJyksW3Nl Y3Rpb25dKTtzd2l0Y2goc2VjdGlvbi50eXBlKXtjYXNlJ3Rvb2xiYXInOmlmKCdn cm91cHMnaW4gc2VjdGlvbil7Zm9yKGdyb3VwIGluIHNlY3Rpb24uZ3JvdXBzKXsk c2VjdGlvbi5hcHBlbmQoJC53aWtpRWRpdG9yLm1vZHVsZXMudG9vbGJhci5mbi5i dWlsZEdyb3VwKGNvbnRleHQsZ3JvdXAsc2VjdGlvbi5ncm91cHNbZ3JvdXBdKSk7 fX0KYnJlYWs7Y2FzZSdib29rbGV0Jzp2YXIgJHBhZ2VzPSQoJzxkaXYgLz4nKS5h ZGRDbGFzcygncGFnZXMnKTt2YXIgJGluZGV4PSQoJzxkaXYgLz4nKS5hZGRDbGFz cygnaW5kZXgnKTtpZigncGFnZXMnaW4gc2VjdGlvbil7Zm9yKHBhZ2UgaW4gc2Vj dGlvbi5wYWdlcyl7JHBhZ2VzLmFwcGVuZCgkLndpa2lFZGl0b3IubW9kdWxlcy50 b29sYmFyLmZuLmJ1aWxkUGFnZShjb250ZXh0LHBhZ2Usc2VjdGlvbi5wYWdlc1tw YWdlXSkpOyRpbmRleC5hcHBlbmQoJC53aWtpRWRpdG9yLm1vZHVsZXMudG9vbGJh ci5mbi5idWlsZEJvb2ttYXJrKGNvbnRleHQscGFnZSxzZWN0aW9uLnBhZ2VzW3Bh Z2VdKSk7fX0KJHNlY3Rpb24uYXBwZW5kKCRpbmRleCkuYXBwZW5kKCRwYWdlcyk7 JC53aWtpRWRpdG9yLm1vZHVsZXMudG9vbGJhci5mbi51cGRhdGVCb29rbGV0U2Vs ZWN0aW9uKGNvbnRleHQsaWQsJHBhZ2VzLCRpbmRleCk7YnJlYWs7fX0sdXBkYXRl Qm9va2xldFNlbGVjdGlvbjpmdW5jdGlvbihjb250ZXh0LGlkLCRwYWdlcywkaW5k ZXgpe3ZhciBjb29raWU9J3dpa2lFZGl0b3ItJytjb250ZXh0Lmluc3RhbmNlKyct Ym9va2xldC0nK2lkKyctcGFnZSc7dmFyIHNlbGVjdGVkPSQuY29va2llKGNvb2tp ZSk7aWYoc2VsZWN0ZWQhPW51bGwpeyQuY29va2llKGNvb2tpZSxzZWxlY3RlZCx7 ZXhwaXJlczozMCxwYXRoOicvJ30pO30KdmFyICRzZWxlY3RlZEluZGV4PSRpbmRl eC5maW5kKCcqW3JlbD0nK3NlbGVjdGVkKyddJyk7aWYoJHNlbGVjdGVkSW5kZXgu c2l6ZSgpPT0wKXtzZWxlY3RlZD0kaW5kZXguY2hpbGRyZW4oKS5lcSgwKS5hdHRy KCdyZWwnKTskLmNvb2tpZShjb29raWUsc2VsZWN0ZWQse2V4cGlyZXM6MzAscGF0 aDonLyd9KTt9CiRwYWdlcy5jaGlsZHJlbigpLmhpZGUoKTskcGFnZXMuZmluZCgn KltyZWw9JytzZWxlY3RlZCsnXScpLnNob3coKTskaW5kZXguY2hpbGRyZW4oKS5y ZW1vdmVDbGFzcygnY3VycmVudCcpOyRzZWxlY3RlZEluZGV4LmFkZENsYXNzKCdj dXJyZW50Jyk7fSxidWlsZDpmdW5jdGlvbihjb250ZXh0LGNvbmZpZyl7dmFyICR0 YWJzPSQoJzxkaXYgLz4nKS5hZGRDbGFzcygndGFicycpLmFwcGVuZFRvKGNvbnRl eHQubW9kdWxlcy50b29sYmFyLiR0b29sYmFyKTt2YXIgJHNlY3Rpb25zPSQoJzxk aXYgLz4nKS5hZGRDbGFzcygnc2VjdGlvbnMnKS5hcHBlbmRUbyhjb250ZXh0Lm1v ZHVsZXMudG9vbGJhci4kdG9vbGJhcik7Y29udGV4dC5tb2R1bGVzLnRvb2xiYXIu JHRvb2xiYXIuYXBwZW5kKCQoJzxkaXYgLz4nKS5jc3MoJ2NsZWFyJywnYm90aCcp KTt2YXIgc2VjdGlvblF1ZXVlPVtdO2ZvcihzZWN0aW9uIGluIGNvbmZpZyl7aWYo c2VjdGlvbj09J21haW4nKXtjb250ZXh0Lm1vZHVsZXMudG9vbGJhci4kdG9vbGJh ci5wcmVwZW5kKCQud2lraUVkaXRvci5tb2R1bGVzLnRvb2xiYXIuZm4uYnVpbGRT ZWN0aW9uKGNvbnRleHQsc2VjdGlvbixjb25maWdbc2VjdGlvbl0pKTt9ZWxzZXtz ZWN0aW9uUXVldWUucHVzaCh7JyRzZWN0aW9ucyc6JHNlY3Rpb25zLCdjb250ZXh0 Jzpjb250ZXh0LCdpZCc6c2VjdGlvbiwnY29uZmlnJzpjb25maWdbc2VjdGlvbl19 KTskdGFicy5hcHBlbmQoJC53aWtpRWRpdG9yLm1vZHVsZXMudG9vbGJhci5mbi5i dWlsZFRhYihjb250ZXh0LHNlY3Rpb24sY29uZmlnW3NlY3Rpb25dKSk7fX0KJC5l YWNoQXN5bmMoc2VjdGlvblF1ZXVlLHsnYnVsayc6MCwnZW5kJzpmdW5jdGlvbigp e3ZhciBvbGRWYWx1ZT0kKCdib2R5JykuY3NzKCdwb3NpdGlvbicpOyQoJ2JvZHkn KS5jc3MoJ3Bvc2l0aW9uJywnc3RhdGljJyk7JCgnYm9keScpLmNzcygncG9zaXRp b24nLG9sZFZhbHVlKTt9LCdsb29wJzpmdW5jdGlvbihpLHMpe3MuJHNlY3Rpb25z LmFwcGVuZCgkLndpa2lFZGl0b3IubW9kdWxlcy50b29sYmFyLmZuLmJ1aWxkU2Vj dGlvbihzLmNvbnRleHQscy5pZCxzLmNvbmZpZykpO3ZhciAkc2VjdGlvbj1zLiRz ZWN0aW9ucy5maW5kKCcuc2VjdGlvbjp2aXNpYmxlJyk7aWYoJHNlY3Rpb24uc2l6 ZSgpKXskc2VjdGlvbnMuYW5pbWF0ZSh7J2hlaWdodCc6JHNlY3Rpb24ub3V0ZXJI ZWlnaHQoKX0sJHNlY3Rpb24ub3V0ZXJIZWlnaHQoKSoyLGZ1bmN0aW9uKCl7Y29u dGV4dC5mbi50cmlnZ2VyKCdyZXNpemUnKTt9KTt9fX0pO319fTt9KShqUXVlcnkp Ow== ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=Vector.combined.min.js Content-Type: application/x-javascript; name=Vector.combined.min.js Content-Location: http://bits.wikimedia.org/w/extensions/UsabilityInitiative/Vector/Vector.combined.min.js?283-17 Content-Transfer-Encoding: Base64 CiRqKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe2lmKCF3Z1ZlY3RvckVuYWJs ZWRNb2R1bGVzLmNvbGxhcHNpYmxlbmF2KXtyZXR1cm4gdHJ1ZTt9CnZhciBtYXA9 eydsdHInOnsnbXNpZSc6W1snPj0nLDddXSwnb3BlcmEnOltbJz49Jyw5LjZdXSwn a29ucXVlcm9yJzpbWyc+PScsNC4wXV0sJ2JsYWNrYmVycnknOmZhbHNlLCdpcG9k JzpmYWxzZSwnaXBob25lJzpmYWxzZSwncHMzJzpmYWxzZX0sJ3J0bCc6eydtc2ll JzpbWyc+PScsN11dLCdvcGVyYSc6W1snPj0nLDkuNl1dLCdrb25xdWVyb3InOltb Jz49Jyw0LjBdXSwnYmxhY2tiZXJyeSc6ZmFsc2UsJ2lwb2QnOmZhbHNlLCdpcGhv bmUnOmZhbHNlLCdwczMnOmZhbHNlfX07aWYoIW13LnVzYWJpbGl0eS50ZXN0QnJv d3NlcihtYXApKXtyZXR1cm4gdHJ1ZTt9CnZhciB2ZXJzaW9uPTE7aWYod2dDb2xs YXBzaWJsZU5hdkZvcmNlTmV3VmVyc2lvbil7dmVyc2lvbj0yO31lbHNle2lmKHdn Q29sbGFwc2libGVOYXZCdWNrZXRUZXN0KXt2ZXJzaW9uPSRqLmNvb2tpZSgndmVj dG9yLW5hdi1wcmVmLXZlcnNpb24nKTtpZih2ZXJzaW9uPT1udWxsKXt2ZXJzaW9u PU1hdGgucm91bmQoTWF0aC5yYW5kb20oKSsxKTskai5jb29raWUoJ3ZlY3Rvci1u YXYtcHJlZi12ZXJzaW9uJyx2ZXJzaW9uLHsnZXhwaXJlcyc6MzAsJ3BhdGgnOicv J30pO319fQppZih2ZXJzaW9uPT0yKXt2YXIgbGltaXQ9NTt2YXIgdGhyZXNob2xk PTM7JGooJyNwLWxhbmcgdWwnKS5hZGRDbGFzcygnc2Vjb25kYXJ5JykuYmVmb3Jl KCc8dWwgY2xhc3M9InByaW1hcnkiPjwvdWw+Jyk7dmFyIGxhbmd1YWdlcz1bJ2Vu JywnZnInLCdkZScsJ2VzJywncHQnLCdpdCcsJ3J1JywnamEnLCdubCcsJ3BsJywn emgnLCdzdicsJ2FyJywndHInLCd1aycsJ2ZpJywnbm8nLCdjYScsJ3JvJywnaHUn LCdrc2gnLCdpZCcsJ2hlJywnY3MnLCd2aScsJ2tvJywnc3InLCdmYScsJ2RhJywn ZW8nLCdzaycsJ3RoJywnbHQnLCd2bycsJ2JnJywnc2wnLCdocicsJ2hpJywnZXQn LCdtaycsJ3NpbXBsZScsJ25ldycsJ21zJywnbm4nLCdnbCcsJ2VsJywnZXUnLCdr YScsJ3RsJywnYm4nLCdsdicsJ21sJywnYnMnLCd0ZScsJ2xhJywnYXonLCdzaCcs J3dhcicsJ2JyJywnaXMnLCdtcicsJ2JlLXgtb2xkJywnc3EnLCdjeScsJ2xiJywn dGEnLCd6aC1jbGFzc2ljYWwnLCdhbicsJ2p2JywnaHQnLCdvYycsJ2JweScsJ2Nl YicsJ3VyJywnemgteXVlJywncG1zJywnc2NuJywnYmUnLCdyb2EtcnVwJywncXUn LCdhZicsJ3N3JywnbmRzJywnZnknLCdsbW8nLCd3YScsJ2t1JywnaHknLCdzdScs J3lpJywnaW8nLCdvcycsJ2dhJywnYXN0JywnbmFwJywndmVjJywnZ3UnLCdjdics J2JhdC1zbWcnLCdrbicsJ3V6JywnemgtbWluLW5hbicsJ3NpJywnYWxzJywneW8n LCdsaScsJ2dhbicsJ2FyeicsJ3NhaCcsJ3R0JywnYmFyJywnZ2QnLCd0ZycsJ2tr JywncGFtJywnaHNiJywncm9hLXRhcmEnLCduYWgnLCdtbicsJ3ZscycsJ2d2Jywn bWknLCdhbScsJ2lhJywnY28nLCduZScsJ2ZvJywnbmRzLW5sJywnZ2xrJywnbXQn LCdhbmcnLCd3dXUnLCdkdicsJ2ttJywnc2NvJywnYmNsJywnbWcnLCdteScsJ2Rp cScsJ3RrJywnc3psJywndWcnLCdmaXUtdnJvJywnc2MnLCdybScsJ25ybScsJ3Bz JywnbnYnLCdoaWYnLCdibycsJ3NlJywnc2EnLCdwbmInLCdtYXAtYm1zJywnbGFk JywnbGlqJywnY3JoJywnZnVyJywna3cnLCd0bycsJ3BhJywnamJvJywnYmEnLCdp bG8nLCdjc2InLCd3bycsJ3hhbCcsJ2tyYycsJ2NrYicsJ3BhZycsJ2xuJywnZnJw JywnbXpuJywnY2UnLCdub3YnLCdrdicsJ2VtbCcsJ2duJywna3knLCdwZGMnLCds bycsJ2hhdycsJ21ocicsJ2RzYicsJ3N0cScsJ3RwaScsJ2FyYycsJ2hhaycsJ2ll Jywnc28nLCdiaCcsJ2V4dCcsJ213bCcsJ3NkJywnaWcnLCdteXYnLCdheScsJ2l1 JywnbmEnLCdjdScsJ3BpJywna2wnLCd0eScsJ2xiZScsJ2FiJywnZ290Jywnc20n LCdhcycsJ21vJywnZWUnLCd6ZWEnLCdhdicsJ2FjZScsJ2tnJywnYm0nLCdjZG8n LCdjYmstemFtJywna2FiJywnb20nLCdjaHInLCdwYXAnLCd1ZG0nLCdrcycsJ3p1 Jywncm15JywnY3InLCdjaCcsJ3N0JywnaWsnLCdtZGYnLCdrYWEnLCdhYScsJ2Zq Jywnc3JuJywndGV0Jywnb3InLCdwbnQnLCdidWcnLCdzcycsJ3RzJywncGNkJywn cGloJywnemEnLCdzZycsJ2xnJywnYnhyJywneGgnLCdhaycsJ2hhJywnYmknLCd2 ZScsJ3RuJywnZmYnLCdkeicsJ3RpJywna2knLCdueScsJ3J3JywnY2h5JywndHcn LCdzbicsJ3R1bScsJ25nJywncm4nLCdtaCcsJ2lpJywnY2hvJywnaHonLCdrcics J2hvJywnbXVzJywna2onXTt2YXIgYWNjZXB0TGFuZ0Nvb2tpZT0kai5jb29raWUo J2FjY2VwdC1sYW5ndWFnZScpO2lmKGFjY2VwdExhbmdDb29raWUhPW51bGwpe2lm KGFjY2VwdExhbmdDb29raWUhPScnKXtsYW5ndWFnZXM9YWNjZXB0TGFuZ0Nvb2tp ZS5zcGxpdCgnLCcpLmNvbmNhdChsYW5ndWFnZXMpO319ZWxzZXskai5nZXRKU09O KHdnU2NyaXB0UGF0aCsnL2FwaS5waHA/YWN0aW9uPXF1ZXJ5Jm1ldGE9dXNlcmlu Zm8mdWlwcm9wPWFjY2VwdGxhbmcmZm9ybWF0PWpzb24nLGZ1bmN0aW9uKGRhdGEp e3ZhciBsYW5ncz1bXTtpZih0eXBlb2YgZGF0YS5xdWVyeSE9J3VuZGVmaW5lZCcm JnR5cGVvZiBkYXRhLnF1ZXJ5LnVzZXJpbmZvIT0ndW5kZWZpbmVkJyYmdHlwZW9m IGRhdGEucXVlcnkudXNlcmluZm8uYWNjZXB0bGFuZyE9J3VuZGVmaW5lZCcpe2Zv cih2YXIgaj0wO2o8ZGF0YS5xdWVyeS51c2VyaW5mby5hY2NlcHRsYW5nLmxlbmd0 aDtqKyspe2lmKGRhdGEucXVlcnkudXNlcmluZm8uYWNjZXB0bGFuZ1tqXS5xIT0w KXtsYW5ncy5wdXNoKGRhdGEucXVlcnkudXNlcmluZm8uYWNjZXB0bGFuZ1tqXVsn KiddKTt9fX0KJGouY29va2llKCdhY2NlcHQtbGFuZ3VhZ2UnLGxhbmdzLmpvaW4o JywnKSx7J3BhdGgnOicvJywnZXhwaXJlcyc6MzB9KTt9KTt9CnZhciAkcHJpbWFy eT0kaignI3AtbGFuZyB1bC5wcmltYXJ5Jyk7dmFyICRzZWNvbmRhcnk9JGooJyNw LWxhbmcgdWwuc2Vjb25kYXJ5Jyk7aWYoJHNlY29uZGFyeS5jaGlsZHJlbigpLmxl bmd0aDxsaW1pdCt0aHJlc2hvbGQpe2xpbWl0Kz10aHJlc2hvbGQ7fQp2YXIgY291 bnQ9MDtmb3IodmFyIGk9MDtpPGxhbmd1YWdlcy5sZW5ndGg7aSsrKXt2YXIgJGxp bms9JHNlY29uZGFyeS5maW5kKCcuaW50ZXJ3aWtpLScrbGFuZ3VhZ2VzW2ldKTtp ZigkbGluay5sZW5ndGgpe2lmKGNvdW50Kys8bGltaXQpeyRsaW5rLmFwcGVuZFRv KCRwcmltYXJ5KTt9ZWxzZXticmVhazt9fX0KaWYoY291bnQ8bGltaXQpeyRzZWNv bmRhcnkuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCl7aWYoY291bnQrKzxsaW1p dCl7JGoodGhpcykuYXBwZW5kVG8oJHByaW1hcnkpO31lbHNle3JldHVybiBmYWxz ZTt9fSk7fQppZigkc2Vjb25kYXJ5LmNoaWxkcmVuKCkubGVuZ3RoPT0wKXskc2Vj b25kYXJ5LnJlbW92ZSgpO31lbHNleyRqKCcjcC1sYW5nJykuYWZ0ZXIoJzxkaXYg aWQ9InAtbGFuZy1tb3JlIiBjbGFzcz0icG9ydGFsIj48aDU+PC9oNT48ZGl2IGNs YXNzPSJib2R5Ij48L2Rpdj48L2Rpdj4nKTskaignI3AtbGFuZy1tb3JlIGg1Jyku dGV4dChtdy51c2FiaWxpdHkuZ2V0TXNnKCd2ZWN0b3ItY29sbGFwc2libGVuYXYt bW9yZScpKTskc2Vjb25kYXJ5LmFwcGVuZFRvKCRqKCcjcC1sYW5nLW1vcmUgZGl2 LmJvZHknKSk7fQokaignI3AtbGFuZycpLmFkZENsYXNzKCdwZXJzaXN0ZW50Jyk7 fQokaignI213LXBhbmVsID4gZGl2LnBvcnRhbDpmaXJzdCcpLmFkZENsYXNzKCdm aXJzdCBwZXJzaXN0ZW50Jyk7JGooJyNtdy1wYW5lbCcpLmFkZENsYXNzKCdjb2xs YXBzaWJsZS1uYXYnKTskaignI213LXBhbmVsID4gZGl2LnBvcnRhbDpub3QoLnBl cnNpc3RlbnQpJykuZWFjaChmdW5jdGlvbihpKXt2YXIgaWQ9JGoodGhpcykuYXR0 cignaWQnKTt2YXIgc3RhdGU9JGouY29va2llKCd2ZWN0b3ItbmF2LScraWQpO2lm KHN0YXRlPT0ndHJ1ZSd8fChzdGF0ZT09bnVsbCYmaTwxKXx8KHN0YXRlPT1udWxs JiZ2ZXJzaW9uPT0xJiZpZD09J3AtbGFuZycpKXskaih0aGlzKS5hZGRDbGFzcygn ZXhwYW5kZWQnKS5maW5kKCdkaXYuYm9keScpLnNob3coKTt9ZWxzZXskaih0aGlz KS5hZGRDbGFzcygnY29sbGFwc2VkJyk7fQppZihzdGF0ZSE9bnVsbCl7JGouY29v a2llKCd2ZWN0b3ItbmF2LScrJGoodGhpcykuYXR0cignaWQnKSxzdGF0ZSx7J2V4 cGlyZXMnOjMwLCdwYXRoJzonLyd9KTt9fSk7ZnVuY3Rpb24gdG9nZ2xlKCRlbGVt ZW50KXskai5jb29raWUoJ3ZlY3Rvci1uYXYtJyskZWxlbWVudC5wYXJlbnQoKS5h dHRyKCdpZCcpLCRlbGVtZW50LnBhcmVudCgpLmlzKCcuY29sbGFwc2VkJykseydl eHBpcmVzJzozMCwncGF0aCc6Jy8nfSk7JGVsZW1lbnQucGFyZW50KCkudG9nZ2xl Q2xhc3MoJ2V4cGFuZGVkJykudG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZCcpLmZpbmQo J2Rpdi5ib2R5Jykuc2xpZGVUb2dnbGUoJ2Zhc3QnKTt9CnZhciAkaGVhZGluZ3M9 JGooJyNtdy1wYW5lbCA+IGRpdi5wb3J0YWw6bm90KC5wZXJzaXN0ZW50KSA+IGg1 Jyk7dmFyIHRhYkluZGV4PW13LnVzYWJpbGl0eS5nZXRNYXhUYWJJbmRleCgpKzE7 JGooJyNzZWFyY2hJbnB1dCcpLmF0dHIoJ3RhYmluZGV4Jyx0YWJJbmRleCsrKTsk aGVhZGluZ3MuZWFjaChmdW5jdGlvbigpeyRqKHRoaXMpLmF0dHIoJ3RhYmluZGV4 Jyx0YWJJbmRleCsrKTt9KTskaGVhZGluZ3Mua2V5ZG93bihmdW5jdGlvbihldmVu dCl7aWYoZXZlbnQud2hpY2g9PTEzfHxldmVudC53aGljaD09MzIpe3RvZ2dsZSgk aih0aGlzKSk7fX0pLm1vdXNlZG93bihmdW5jdGlvbigpe3RvZ2dsZSgkaih0aGlz KSk7JGoodGhpcykuYmx1cigpO3JldHVybiBmYWxzZTt9KTt9KTskaihkb2N1bWVu dCkucmVhZHkoZnVuY3Rpb24oKXtpZighd2dWZWN0b3JFbmFibGVkTW9kdWxlcy5j b2xsYXBzaWJsZXRhYnMpe3JldHVybiB0cnVlO30KdmFyIHJ0bD0kaignYm9keScp LmlzKCcucnRsJyk7JGouY29sbGFwc2libGVUYWJzLm1vdmVUb0NvbGxhcHNlZD1m dW5jdGlvbihlbGUpe3ZhciAkbW92aW5nPSRqKGVsZSk7dmFyIGRhdGE9JGouY29s bGFwc2libGVUYWJzLmdldFNldHRpbmdzKCRtb3ZpbmcpO2lmKCFkYXRhKXtyZXR1 cm47fQp2YXIgZXhwQ29udGFpbmVyU2V0dGluZ3M9JGouY29sbGFwc2libGVUYWJz LmdldFNldHRpbmdzKCRqKGRhdGEuZXhwYW5kZWRDb250YWluZXIpKTtpZighZXhw Q29udGFpbmVyU2V0dGluZ3Mpe3JldHVybjt9CmV4cENvbnRhaW5lclNldHRpbmdz LnNoaWZ0aW5nPXRydWU7dmFyIHRhcmdldD1kYXRhLmNvbGxhcHNlZENvbnRhaW5l cjskbW92aW5nLmNzcygicG9zaXRpb24iLCJyZWxhdGl2ZSIpLmNzcygocnRsPyds ZWZ0JzoncmlnaHQnKSwwKS5hbmltYXRlKHt3aWR0aDonMXB4J30sIm5vcm1hbCIs ZnVuY3Rpb24oKXskaih0aGlzKS5oaWRlKCk7JGooJzxzcGFuIGNsYXNzPSJwbGFj ZWhvbGRlciIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjwvc3Bhbj4nKS5pbnNlcnRB ZnRlcih0aGlzKTskaih0aGlzKS5yZW1vdmUoKS5wcmVwZW5kVG8odGFyZ2V0KS5k YXRhKCdjb2xsYXBzaWJsZVRhYnNTZXR0aW5ncycsZGF0YSk7JGoodGhpcykuYXR0 cignc3R5bGUnLCdkaXNwbGF5Omxpc3QtaXRlbTsnKTt2YXIgZGF0YT0kai5jb2xs YXBzaWJsZVRhYnMuZ2V0U2V0dGluZ3MoJGooZWxlKSk7aWYoIWRhdGEpe3JldHVy bjt9CnZhciBleHBDb250YWluZXJTZXR0aW5ncz0kai5jb2xsYXBzaWJsZVRhYnMu Z2V0U2V0dGluZ3MoJGooZGF0YS5leHBhbmRlZENvbnRhaW5lcikpO2lmKCFleHBD b250YWluZXJTZXR0aW5ncyl7cmV0dXJuO30KZXhwQ29udGFpbmVyU2V0dGluZ3Mu c2hpZnRpbmc9ZmFsc2U7JGouY29sbGFwc2libGVUYWJzLmhhbmRsZVJlc2l6ZSgp O30pO307JGouY29sbGFwc2libGVUYWJzLm1vdmVUb0V4cGFuZGVkPWZ1bmN0aW9u KGVsZSl7dmFyICRtb3Zpbmc9JGooZWxlKTt2YXIgZGF0YT0kai5jb2xsYXBzaWJs ZVRhYnMuZ2V0U2V0dGluZ3MoJG1vdmluZyk7aWYoIWRhdGEpe3JldHVybjt9CnZh ciBleHBDb250YWluZXJTZXR0aW5ncz0kai5jb2xsYXBzaWJsZVRhYnMuZ2V0U2V0 dGluZ3MoJGooZGF0YS5leHBhbmRlZENvbnRhaW5lcikpO2lmKCFleHBDb250YWlu ZXJTZXR0aW5ncyl7cmV0dXJuO30KZXhwQ29udGFpbmVyU2V0dGluZ3Muc2hpZnRp bmc9dHJ1ZTt2YXIgJHRhcmdldD0kaihkYXRhLmV4cGFuZGVkQ29udGFpbmVyKS5m aW5kKCdzcGFuLnBsYWNlaG9sZGVyOmZpcnN0Jyk7dmFyIGV4cGFuZGVkV2lkdGg9 ZGF0YS5leHBhbmRlZFdpZHRoOyRtb3ZpbmcuY3NzKCJwb3NpdGlvbiIsInJlbGF0 aXZlIikuY3NzKChydGw/J3JpZ2h0JzonbGVmdCcpLDApLmNzcygnd2lkdGgnLCcx cHgnKTskdGFyZ2V0LnJlcGxhY2VXaXRoKCRtb3ZpbmcucmVtb3ZlKCkuY3NzKCd3 aWR0aCcsJzFweCcpLmRhdGEoJ2NvbGxhcHNpYmxlVGFic1NldHRpbmdzJyxkYXRh KS5hbmltYXRlKHt3aWR0aDpleHBhbmRlZFdpZHRoKyJweCJ9LCJub3JtYWwiLGZ1 bmN0aW9uKCl7JGoodGhpcykuYXR0cignc3R5bGUnLCdkaXNwbGF5OmJsb2NrOycp O3ZhciBkYXRhPSRqLmNvbGxhcHNpYmxlVGFicy5nZXRTZXR0aW5ncygkaihlbGUp KTtpZighZGF0YSl7cmV0dXJuO30KdmFyIGV4cENvbnRhaW5lclNldHRpbmdzPSRq LmNvbGxhcHNpYmxlVGFicy5nZXRTZXR0aW5ncygkaihkYXRhLmV4cGFuZGVkQ29u dGFpbmVyKSk7aWYoIWV4cENvbnRhaW5lclNldHRpbmdzKXtyZXR1cm47fQpleHBD b250YWluZXJTZXR0aW5ncy5zaGlmdGluZz1mYWxzZTskai5jb2xsYXBzaWJsZVRh YnMuaGFuZGxlUmVzaXplKCk7fSkpO307JGooJyNwLXZpZXdzIHVsJykuYmluZCgi YmVmb3JlVGFiQ29sbGFwc2UiLGZ1bmN0aW9uKCl7aWYoJGooJyNwLWNhY3Rpb25z JykuY3NzKCdkaXNwbGF5Jyk9PSdub25lJykKJGooIiNwLWNhY3Rpb25zIikuYWRk Q2xhc3MoImZpbGxlZFBvcnRsZXQiKS5yZW1vdmVDbGFzcygiZW1wdHlQb3J0bGV0 IikuZmluZCgnaDUnKS5jc3MoJ3dpZHRoJywnMXB4JykuYW5pbWF0ZSh7J3dpZHRo JzonMjZweCd9LDM5MCk7fSkuYmluZCgiYmVmb3JlVGFiRXhwYW5kIixmdW5jdGlv bigpe2lmKCRqKCcjcC1jYWN0aW9ucyBsaScpLmxlbmd0aD09MSkKJGooIiNwLWNh Y3Rpb25zIGg1IikuYW5pbWF0ZSh7J3dpZHRoJzonMXB4J30sMzcwLGZ1bmN0aW9u KCl7JGoodGhpcykuYXR0cignc3R5bGUnLCcnKS5wYXJlbnQoKS5hZGRDbGFzcygi ZW1wdHlQb3J0bGV0IikucmVtb3ZlQ2xhc3MoImZpbGxlZFBvcnRsZXQiKTt9KTt9 KS5jb2xsYXBzaWJsZVRhYnMoe2V4cGFuZENvbmRpdGlvbjpmdW5jdGlvbihlbGVX aWR0aCl7aWYocnRsKXtyZXR1cm4oJGooJyNyaWdodC1uYXZpZ2F0aW9uJykucG9z aXRpb24oKS5sZWZ0KyRqKCcjcmlnaHQtbmF2aWdhdGlvbicpLndpZHRoKCkrMSk8 KCRqKCcjbGVmdC1uYXZpZ2F0aW9uJykucG9zaXRpb24oKS5sZWZ0LWVsZVdpZHRo KTt9ZWxzZXtyZXR1cm4oJGooJyNsZWZ0LW5hdmlnYXRpb24nKS5wb3NpdGlvbigp LmxlZnQrJGooJyNsZWZ0LW5hdmlnYXRpb24nKS53aWR0aCgpKzEpPCgkaignI3Jp Z2h0LW5hdmlnYXRpb24nKS5wb3NpdGlvbigpLmxlZnQtZWxlV2lkdGgpO319LGNv bGxhcHNlQ29uZGl0aW9uOmZ1bmN0aW9uKCl7aWYocnRsKXtyZXR1cm4oJGooJyNy aWdodC1uYXZpZ2F0aW9uJykucG9zaXRpb24oKS5sZWZ0KyRqKCcjcmlnaHQtbmF2 aWdhdGlvbicpLndpZHRoKCkpPiRqKCcjbGVmdC1uYXZpZ2F0aW9uJykucG9zaXRp b24oKS5sZWZ0O31lbHNle3JldHVybigkaignI2xlZnQtbmF2aWdhdGlvbicpLnBv c2l0aW9uKCkubGVmdCskaignI2xlZnQtbmF2aWdhdGlvbicpLndpZHRoKCkpPiRq KCcjcmlnaHQtbmF2aWdhdGlvbicpLnBvc2l0aW9uKCkubGVmdDt9fX0pO30pOyRq KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe2lmKCF3Z1ZlY3RvckVuYWJsZWRN b2R1bGVzLmVkaXR3YXJuaW5nfHwkaignI3dwVGV4dGJveDEnKS5zaXplKCk9PTAp e3JldHVybiB0cnVlO30KJGooJyN3cFRleHRib3gxLCAjd3BTdW1tYXJ5JykuZWFj aChmdW5jdGlvbigpeyRqKHRoaXMpLmRhdGEoJ29yaWd0ZXh0Jywkaih0aGlzKS52 YWwoKSk7fSk7dmFyIGZhbGxiYWNrV2luZG93T25CZWZvcmVVbmxvYWQ9d2luZG93 Lm9uYmVmb3JldW5sb2FkO3ZhciBvdXJXaW5kb3dPbkJlZm9yZVVubG9hZD1mdW5j dGlvbigpe3ZhciBmYWxsYmFja1Jlc3VsdD11bmRlZmluZWQ7dmFyIHJldHZhbD11 bmRlZmluZWQ7dmFyIHRoaXNGdW5jPWFyZ3VtZW50cy5jYWxsZWU7aWYoZmFsbGJh Y2tXaW5kb3dPbkJlZm9yZVVubG9hZCl7ZmFsbGJhY2tSZXN1bHQ9ZmFsbGJhY2tX aW5kb3dPbkJlZm9yZVVubG9hZCgpO30KaWYoZmFsbGJhY2tSZXN1bHQhPT11bmRl ZmluZWQpe3JldHZhbD1mYWxsYmFja1Jlc3VsdDt9ZWxzZXtpZih3Z0FjdGlvbj09 J3N1Ym1pdCd8fCRqKCcjd3BUZXh0Ym94MScpLmRhdGEoJ29yaWd0ZXh0JykhPSRq KCcjd3BUZXh0Ym94MScpLnZhbCgpfHwkaignI3dwU3VtbWFyeScpLmRhdGEoJ29y aWd0ZXh0JykhPSRqKCcjd3BTdW1tYXJ5JykudmFsKCkpe3JldHZhbD1tdy51c2Fi aWxpdHkuZ2V0TXNnKCd2ZWN0b3ItZWRpdHdhcm5pbmctd2FybmluZycpO319Cndp bmRvdy5vbmJlZm9yZXVubG9hZD1udWxsO2lmKHJldHZhbCE9PXVuZGVmaW5lZCl7 c2V0VGltZW91dChmdW5jdGlvbigpe3dpbmRvdy5vbmJlZm9yZXVubG9hZD10aGlz RnVuYzt9KTtyZXR1cm4gcmV0dmFsO319O3ZhciBwYWdlU2hvd0hhbmRsZXI9ZnVu Y3Rpb24oKXt3aW5kb3cub25iZWZvcmV1bmxvYWQ9b3VyV2luZG93T25CZWZvcmVV bmxvYWQ7fTtwYWdlU2hvd0hhbmRsZXIoKTtpZih3aW5kb3cuYWRkRXZlbnRMaXN0 ZW5lcil7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VzaG93JyxwYWdlU2hv d0hhbmRsZXIsZmFsc2UpO31lbHNlIGlmKHdpbmRvdy5hdHRhY2hFdmVudCl7d2lu ZG93LmF0dGFjaEV2ZW50KCdwYWdlc2hvdycscGFnZVNob3dIYW5kbGVyKTt9CiRq KCdmb3JtJykuc3VibWl0KGZ1bmN0aW9uKCl7d2luZG93Lm9uYmVmb3JldW5sb2Fk PWZhbGxiYWNrV2luZG93T25CZWZvcmVVbmxvYWQ7fSk7fSk7dmFyIGZhbGxiYWNr V2luZG93T25CZWZvcmVVbmxvYWQ9bnVsbDtpZih3Z1ZlY3RvckVuYWJsZWRNb2R1 bGVzLnNpbXBsZXNlYXJjaCYmc2tpbj09J3ZlY3RvcicmJnR5cGVvZiBvc19hdXRv bG9hZF9pbnB1dHMhPT0ndW5kZWZpbmVkJyYmb3NfYXV0b2xvYWRfZm9ybXMhPT0n dW5kZWZpbmVkJyl7b3NfYXV0b2xvYWRfaW5wdXRzPVtdO29zX2F1dG9sb2FkX2Zv cm1zPVtdO30KJGooZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7aWYoIXdnVmVj dG9yRW5hYmxlZE1vZHVsZXMuc2ltcGxlc2VhcmNofHx3Z1ZlY3RvclByZWZlcmVu Y2VzLnNpbXBsZXNlYXJjaC5kaXNhYmxlc3VnZ2VzdHx8c2tpbiE9J3ZlY3Rvcicp e3JldHVybiB0cnVlO30KdmFyIG1vZD17J2Jyb3dzZXJzJzp7J2x0cic6eydvcGVy YSc6W1snPj0nLDkuNl1dLCdkb2NvbW8nOmZhbHNlLCdibGFja2JlcnJ5JzpmYWxz ZSwnaXBvZCc6ZmFsc2UsJ2lwaG9uZSc6ZmFsc2V9LCdydGwnOnsnb3BlcmEnOltb Jz49Jyw5LjZdXSwnZG9jb21vJzpmYWxzZSwnYmxhY2tiZXJyeSc6ZmFsc2UsJ2lw b2QnOmZhbHNlLCdpcGhvbmUnOmZhbHNlfX19O2lmKCEkai53aWtpRWRpdG9yLmlz U3VwcG9ydGVkKG1vZCkpe3JldHVybiB0cnVlO30KaWYoJ3BsYWNlaG9sZGVyJ2lu IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JykpeyRqKCdkaXYjc2ltcGxl U2VhcmNoID4gaW5wdXQjc2VhcmNoSW5wdXQnKS5hdHRyKCdwbGFjZWhvbGRlcics bXcudXNhYmlsaXR5LmdldE1zZygndmVjdG9yLXNpbXBsZXNlYXJjaC1zZWFyY2gn KSk7fWVsc2V7JGooJ2RpdiNzaW1wbGVTZWFyY2ggPiBpbnB1dCNzZWFyY2hJbnB1 dCcpLmVhY2goZnVuY3Rpb24oKXt2YXIgJGlucHV0PSRqKHRoaXMpOyRpbnB1dC5i aW5kKCdibHVyJyxmdW5jdGlvbigpe2lmKCRpbnB1dC52YWwoKS5sZW5ndGg9PTAp eyRpbnB1dC52YWwobXcudXNhYmlsaXR5LmdldE1zZygndmVjdG9yLXNpbXBsZXNl YXJjaC1zZWFyY2gnKSkuYWRkQ2xhc3MoJ3BsYWNlaG9sZGVyJyk7fX0pLmJpbmQo J2ZvY3VzJyxmdW5jdGlvbigpe2lmKCRpbnB1dC5oYXNDbGFzcygncGxhY2Vob2xk ZXInKSl7JGlucHV0LnZhbCgnJykucmVtb3ZlQ2xhc3MoJ3BsYWNlaG9sZGVyJyk7 fX0pLnBhcmVudHMoJ2Zvcm0nKS5iaW5kKCdzdWJtaXQnLGZ1bmN0aW9uKCl7aWYo JGlucHV0Lmhhc0NsYXNzKCdwbGFjZWhvbGRlcicpKXskaW5wdXQudmFsKCcnKS5y ZW1vdmVDbGFzcygncGxhY2Vob2xkZXInKTt9fSk7aWYoJGlucHV0LnZhbCgpPT0n Jyl7JGlucHV0LnRyaWdnZXIoJ2JsdXInKTt9fSk7fQokaignI3NlYXJjaElucHV0 LCAjc2VhcmNoSW5wdXQyLCAjcG93ZXJTZWFyY2hUZXh0LCAjc2VhcmNoVGV4dCcp LnN1Z2dlc3Rpb25zKHtmZXRjaDpmdW5jdGlvbihxdWVyeSl7dmFyICR0aGlzPSRq KHRoaXMpO3ZhciByZXF1ZXN0PSRqLmFqYXgoe3VybDp3Z1NjcmlwdFBhdGgrJy9h cGkucGhwJyxkYXRhOnsnYWN0aW9uJzonb3BlbnNlYXJjaCcsJ3NlYXJjaCc6cXVl cnksJ25hbWVzcGFjZSc6MCwnc3VnZ2VzdCc6Jyd9LGRhdGFUeXBlOidqc29uJyxz dWNjZXNzOmZ1bmN0aW9uKGRhdGEpe2lmKGRhdGEmJjEgaW4gZGF0YSl7JHRoaXMu c3VnZ2VzdGlvbnMoJ3N1Z2dlc3Rpb25zJyxkYXRhWzFdKTt9fX0pOyRqKHRoaXMp LmRhdGEoJ3JlcXVlc3QnLHJlcXVlc3QpO30sY2FuY2VsOmZ1bmN0aW9uKCl7dmFy IHJlcXVlc3Q9JGoodGhpcykuZGF0YSgncmVxdWVzdCcpO2lmKHJlcXVlc3QmJnR5 cGVvZiByZXF1ZXN0LmFib3J0PT0nZnVuY3Rpb24nKXtyZXF1ZXN0LmFib3J0KCk7 JGoodGhpcykucmVtb3ZlRGF0YSgncmVxdWVzdCcpO319LHJlc3VsdDp7c2VsZWN0 OmZ1bmN0aW9uKCR0ZXh0Ym94KXskdGV4dGJveC5jbG9zZXN0KCdmb3JtJykuc3Vi bWl0KCk7fX0sZGVsYXk6MTIwLHBvc2l0aW9uRnJvbUxlZnQ6JGooJ2JvZHknKS5p cygnLnJ0bCcpLGhpZ2hsaWdodElucHV0OnRydWV9KS5iaW5kKCdwYXN0ZSBjdXQn LGZ1bmN0aW9uKGUpeyRqKHRoaXMpLnRyaWdnZXIoJ2tleXByZXNzJyk7fSk7JGoo JyNzZWFyY2hJbnB1dCcpLnN1Z2dlc3Rpb25zKHtyZXN1bHQ6e3NlbGVjdDpmdW5j dGlvbigkdGV4dGJveCl7JHRleHRib3guY2xvc2VzdCgnZm9ybScpLnN1Ym1pdCgp O319LHNwZWNpYWw6e3JlbmRlcjpmdW5jdGlvbihxdWVyeSl7aWYoJGoodGhpcyku Y2hpbGRyZW4oKS5zaXplKCk9PTApeyRqKHRoaXMpLnNob3coKQokbGFiZWw9JGoo JzxkaXYgLz4nKS5hZGRDbGFzcygnc3BlY2lhbC1sYWJlbCcpLnRleHQobXcudXNh YmlsaXR5LmdldE1zZygndmVjdG9yLXNpbXBsZXNlYXJjaC1jb250YWluaW5nJykp LmFwcGVuZFRvKCRqKHRoaXMpKTskcXVlcnk9JGooJzxkaXYgLz4nKS5hZGRDbGFz cygnc3BlY2lhbC1xdWVyeScpLnRleHQocXVlcnkpLmFwcGVuZFRvKCRqKHRoaXMp KTskcXVlcnkuYXV0b0VsbGlwc2lzKCk7fWVsc2V7JGoodGhpcykuZmluZCgnLnNw ZWNpYWwtcXVlcnknKS5lbXB0eSgpLnRleHQocXVlcnkpLmF1dG9FbGxpcHNpcygp O319LHNlbGVjdDpmdW5jdGlvbigkdGV4dGJveCl7JHRleHRib3guY2xvc2VzdCgn Zm9ybScpLmFwcGVuZCgkaignPGlucHV0IC8+JykuYXR0cih7J3R5cGUnOidoaWRk ZW4nLCduYW1lJzonZnVsbHRleHQnLCd2YWx1ZSc6MX0pKTskdGV4dGJveC5jbG9z ZXN0KCdmb3JtJykuc3VibWl0KCk7fX0sJHJlZ2lvbjokaignI3NpbXBsZVNlYXJj aCcpfSk7fSk7 ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=index.js Content-Type: text/javascript; charset=utf-8; name=index.js Content-Location: http://es.wikipedia.org/w/index.php?title=Especial:BannerController&cache=/cn.js&283-17 Content-Transfer-Encoding: 8bit function insertBanner(bannerJson) { jQuery('div#centralNotice').prepend( bannerJson.banner ); } function toggleNotice() { var notice = document.getElementById('centralNotice'); if (!wgNoticeToggleState) { notice.className = notice.className.replace('collapsed', 'expanded'); toggleNoticeCookie('0'); } else { notice.className = notice.className.replace('expanded', 'collapsed'); toggleNoticeCookie('1'); } wgNoticeToggleState = !wgNoticeToggleState; } function toggleNoticeStyle(elems, display) { if(elems) for(var i=0;i'; $( '#siteNotice' ).prepend( '
'+bannerScript+'
' ); }, 'loadBannerList': function( geoOverride ) { if ( geoOverride ) { var geoLocation = geoOverride; // override the geo info } else { var geoLocation = Geo.country; // pull the geo info } var bannerListQuery = $.param( { 'language': wgContentLanguage, 'project': wgNoticeProject, 'country': geoLocation } ); var bannerListURL = wgScript + '?title=' + encodeURIComponent(wgFormattedNamespaces[-1]) + ':BannerListLoader&cache=/cn.js&' + bannerListQuery; var request = $.ajax( { url: bannerListURL, dataType: 'json', success: $.centralNotice.fn.chooseBanner } ); }, 'chooseBanner': function( bannerList ) { // Convert the json object to a true array bannerList = Array.prototype.slice.call( bannerList ); // Make sure there are some banners to choose from if ( bannerList.length == 0 ) return false; var groomedBannerList = []; for( var i = 0; i < bannerList.length; i++ ) { // Only include this banner if it's inteded for the current user if( ( wgUserName && bannerList[i].display_account ) || ( !wgUserName && bannerList[i].display_anon == 1 ) ) { // add the banner to our list once per weight for( var j=0; j < bannerList[i].weight; j++ ) { groomedBannerList.push( bannerList[i] ); } } } // Return if there's nothing left after the grooming if( groomedBannerList.length == 0 ) return false; // Load a random banner from our groomed list $.centralNotice.fn.loadBanner( groomedBannerList[ Math.floor( Math.random() * groomedBannerList.length ) ].name ); }, 'getQueryStringVariables': function() { document.location.search.replace( /\??(?:([^=]+)=([^&]*)&?)/g, function () { function decode( s ) { return decodeURIComponent( s.split( "+" ).join( " " ) ); } $.centralNotice.data.getVars[decode( arguments[1] )] = decode( arguments[2] ); } ); } } } $( document ).ready( function () { // Initialize the query string vars $.centralNotice.fn.getQueryStringVariables(); if( $.centralNotice.data.getVars['banner'] ) { // if we're forcing one banner $.centralNotice.fn.loadBanner( $.centralNotice.data.getVars['banner'] ); } else { // Look for banners ready to go NOW $.centralNotice.fn.loadBannerList( $.centralNotice.data.getVars['country'] ); } } ); //document ready } )( jQuery ); ------------OXlwpPrVEpg5DjWyC2eogS Content-Disposition: inline; filename=index.js Content-Type: text/javascript; charset=UTF-8; name=index.js Content-Location: http://es.wikipedia.org/w/index.php?title=-&action=raw&gen=js&useskin=vector&283-17 Content-Transfer-Encoding: 8bit /* generated javascript */ var skin = 'vector'; var stylepath = 'http://bits.wikimedia.org/skins-1.5'; /* MediaWiki:Common.js */ window.hitos = []; function hito(nombre) { window.hitos.push([nombre, new Date().getTime()]); } hito("C Common.js"); /* * Description: Redirects from /User:UserName/skin.js or .css to the user's actual skin page * Maintainer: Cacycle */ if (wgArticleId == 0 && wgUserName) { var slash = wgPageName.indexOf('/'); var norm = wgPageName.substr(0, slash) + wgPageName.substr(slash).toLowerCase(); var test = 'Usuario:' + wgUserName.replace(/ /g, '_') + '/skin.'; var ext = null; if (norm == test + 'js') ext = 'js'; else if (norm == test + 'css') ext = 'css'; if (ext != null) window.location.href = window.location.href.replace(/\/skin.(css|js)/i, '/' + skin + '.' + ext); } /** Execute function on page load ********************************************* * * Description: Wrapper around addOnloadHook() for backwards compatibility. * Will be removed in the near future. * Maintainers: [[User:R. Koot]] */ function addLoadEvent( f ) { addOnloadHook( f ); } /* Test if an element has a certain class ************************************** * * Description: Uses regular expressions and caching for better performance. * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]] */ var hasClass = (function () { var reCache = {}; return function (element, className) { return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className); }; })(); /** Internet Explorer bug fix ************************************************** * * Description: UNDOCUMENTED * Maintainers: [[User:Tom-]]? */ if (window.showModalDialog && document.compatMode) { var oldWidth; var docEl = document.documentElement; function fixIEScroll() { if (!oldWidth || docEl.clientWidth > oldWidth) doFixIEScroll(); else setTimeout(doFixIEScroll, 1); oldWidth = docEl.clientWidth; } function doFixIEScroll() { docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : ""; } try { document.attachEvent("onreadystatechange", fixIEScroll); attachEvent("onresize", fixIEScroll); } catch(e) { } } //fix edit summary prompt for undo //this code fixes the fact that the undo function combined with the "no edit summary prompter" causes problems if leaving the //edit summary unchanged //this was added by [[User:Deskana]], code by [[User:Tra]] addOnloadHook(function () { if (document.location.search.indexOf("undo=") != -1 && document.getElementsByName('wpAutoSummary')[0]) { document.getElementsByName('wpAutoSummary')[0].value=''; } }) /* == Búsqueda especial extendida (specialsearch) == Añade a la página [[Special:Search]] enlaces a buscadores externos como Yahoo, Google, MSN Live y Exalead. Trabaja en conjunto con el módulo [[MediaWiki:SpecialSearch.js]] y está basado en [[w:fr:MediaWiki:Monobook.js]]. */ addOnloadHook( function() { if ((wgCanonicalNamespace == "Special") && (wgCanonicalSpecialPageName == "Search")) importScript('MediaWiki:SpecialSearch.js'); } ); /* == Cerrar mensajes == Ver ejemplo en [[Usuario:Chabacano/Fírmalo]], por [[Usuario:Platonides]]. */ addOnloadHook( function() { hito("C cerrar mensajes"); if (document.getElementById("cierraPadre")) { document.getElementById("cierraPadre").childNodes[0].onclick= function () { document.getElementById("cierraPadre").style.cursor = 'pointer'; document.getElementById("cierraPadre").parentNode.style.display = 'none'; return false; /*no seguir el href*/} } hito("F cerrar mensajes"); }); /* == Scripts sólo para biblios == */ function userInGroup(group) { return (wgUserGroups && (('|' + wgUserGroups.join('|') + '|').indexOf('|' + group + '|') != -1)); } if (userInGroup('sysop')) importScript("MediaWiki:Sysop.js"); /* == Wikimedia Player == Añade reproductor en la misma página. */ document.write(''); // == Mejoras de diseño de la Portada == /** Mejoras de diseño de la Portada ********************************************************* * * Descripción: Varias mejoras de diseño para la portada, incluyendo un * enlace adicional a la lista completa de idiomas disponibles. * Adaptado de [[en:MediaWiki:Common.js]] */ function mainPageAppendCompleteListLink() { hito("C mainPageAppendCompleteListLink"); try { var node = document.getElementById( "p-lang" ) .getElementsByTagName('div')[0] .getElementsByTagName('ul')[0]; var aNode = document.createElement( 'a' ); var liNode = document.createElement( 'li' ); aNode.appendChild( document.createTextNode( 'Lista completa' ) ); aNode.setAttribute( 'href' , 'http://meta.wikimedia.org/wiki/Lista_de_Wikipedias' ); liNode.appendChild( aNode ); liNode.style.fontWeight = 'bold'; node.appendChild( liNode ); } catch(e) { // lets just ignore what's happened //return; } hito("F mainPageAppendCompleteListLink"); } if ( wgPageName == "Wikipedia:Portada" ) { addOnloadHook( mainPageAppendCompleteListLink ); } // == Redefinición de ordenación de tablas "sortable" == // Traido de la Inclopedia. Ordena nombres de meses en español y cambia puntos por comas. function ts_resortTable(lnk) { // get the span var span = lnk.getElementsByTagName('span')[0]; var td = lnk.parentNode; var tr = td.parentNode; var column = td.cellIndex; var table = tr.parentNode; while (table && !(table.tagName && table.tagName.toLowerCase() == 'table')) table = table.parentNode; if (!table) return; if (table.rows.length <= 1) return; // Generate the number transform table if it's not done already if (ts_number_transform_table == null) { ts_initTransformTable(); } // Work out a type for the column // Skip the first row if that's where the headings are var rowStart = (table.tHead && table.tHead.rows.length > 0 ? 0 : 1); var itm = ""; for (var i = rowStart; i < table.rows.length; i++) { if (table.rows[i].cells.length > column) { itm = ts_getInnerText(table.rows[i].cells[column]); itm = itm.replace(/^[\s\xa0]+/, "").replace(/[\s\xa0]+$/, ""); if (itm != "") break; } } // TODO: bug 8226, localised date formats var sortfn = ts_sort_generic; var preprocessor = ts_toLowerCase; if (/\d\d? de [a-zA-Z]+ de \d+$/.test(itm)) { preprocessor = ts_dateToSortKey; } else if (/^\d\d[\/.-]\d\d[\/.-]\d\d\d\d$/.test(itm)) { preprocessor = ts_dateToSortKey; } else if (/^\d\d[\/.-]\d\d[\/.-]\d\d$/.test(itm)) { preprocessor = ts_dateToSortKey; // pound dollar euro yen currency cents } else if (/(^[\u00a3$\u20ac\u00a4\u00a5]|\u00a2$)/.test(itm)) { preprocessor = ts_currencyToSortKey; } else if (ts_number_regex.test(itm)) { preprocessor = ts_parseFloat; } var reverse = (span.getAttribute("sortdir") == 'down'); var newRows = new Array(); var staticRows = new Array(); for (var j = rowStart; j < table.rows.length; j++) { var row = table.rows[j]; if((" "+row.className+" ").indexOf(" unsortable ") < 0) { var keyText = ts_getInnerText(row.cells[column]); var oldIndex = (reverse ? -j : j); var preprocessed = preprocessor( keyText ); newRows[newRows.length] = new Array(row, preprocessed, oldIndex); } else staticRows[staticRows.length] = new Array(row, false, j-rowStart); } newRows.sort(sortfn); var arrowHTML; if (reverse) { arrowHTML = '↓'; newRows.reverse(); span.setAttribute('sortdir','up'); } else { arrowHTML = '↑'; span.setAttribute('sortdir','down'); } for (var i = 0; i < staticRows.length; i++) { var row = staticRows[i]; newRows.splice(row[2], 0, row); } // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones // don't do sortbottom rows for (var i = 0; i < newRows.length; i++) { if ((" "+newRows[i][0].className+" ").indexOf(" sortbottom ") == -1) table.tBodies[0].appendChild(newRows[i][0]); } // do sortbottom rows only for (var i = 0; i < newRows.length; i++) { if ((" "+newRows[i][0].className+" ").indexOf(" sortbottom ") != -1) table.tBodies[0].appendChild(newRows[i][0]); } // Delete any other arrows there may be showing var spans = getElementsByClassName(tr, "span", "sortarrow"); for (var i = 0; i < spans.length; i++) { spans[i].innerHTML = '↓'; } span.innerHTML = arrowHTML; if (ts_alternate_row_colors) { ts_alternate(table); } } function ts_dateToSortKey(date) { if (date.length > 14) { date = date.toLowerCase(); if (date.charAt(1) == " " || date.charAt(1) == "-") { var dia = '0' + date.charAt(0); } else { var dia = date.substr(0, 2); } var iniciomes = date.indexOf(" de ") + 4; var finmes = date.lastIndexOf(" de "); var longmes = finmes - iniciomes; switch (date.substr(iniciomes, longmes)) { case "enero": var mes = "01"; break; case "febrero": var mes = "02"; break; case "marzo": var mes = "03"; break; case "abril": var mes = "04"; break; case "mayo": var mes = "05"; break; case "junio": var mes = "06"; break; case "julio": var mes = "07"; break; case "agosto": var mes = "08"; break; case "septiembre": var mes = "09"; break; case "octubre": var mes = "10"; break; case "noviembre": var mes = "11"; break; case "diciembre": var mes = "12"; break; } for (var anno = date.substr(finmes + 4); anno.length < 4; anno = '0' + anno); return anno + mes + dia; } else if (date.length == 10) { if (ts_europeandate == false) { return date.substr(6,4)+date.substr(0,2)+date.substr(3,2); } else { return date.substr(6,4)+date.substr(3,2)+date.substr(0,2); } } else if (date.length == 8) { yr = date.substr(6,2); if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; } if (ts_europeandate == true) { return yr+date.substr(3,2)+date.substr(0,2); } else { return yr+date.substr(0,2)+date.substr(3,2); } } return "00000000"; } function ts_parseFloat(num) { if (!num) return 0; num = num.replace(/\./g, ""); num = num.replace(/,/, "."); num = parseFloat(num); return (isNaN(num) ? 0 : num); } function ts_sort_generic(a,b) { if ( (typeof a[1] == "string") && (typeof b[1] == "string") ) { /* Don't do this if it's eg. 'number'. We don't want that and number doesn't have .toLowerCase() */ var aa = a[1].toLowerCase(); var bb = b[1].toLowerCase(); return(aa.localeCompare(bb)); } else { return a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : a[2] - b[2]; //Original ts_sort_generic } } var wma_settings = { buttonImage: "http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Erioll_world.svg/15px-Erioll_world.svg.png" } /** Collapsible tables ********************************************************* * * Description: Allows tables to be collapsed, showing only the header. See * [[Wikipedia:NavFrame]]. * Maintainers: [[User:R. Koot]] */ var autoCollapse = 2; var collapseCaption = "ocultar"; var expandCaption = "mostrar"; function collapseTable( tableIndex ) { var Button = document.getElementById( "collapseButton" + tableIndex ); var Table = document.getElementById( "collapsibleTable" + tableIndex ); if ( !Table || !Button ) { return false; } var Rows = Table.rows; if ( Button.firstChild.data == collapseCaption ) { for ( var i = 1; i < Rows.length; i++ ) { Rows[i].style.display = "none"; } Button.firstChild.data = expandCaption; } else { for ( var i = 1; i < Rows.length; i++ ) { Rows[i].style.display = Rows[0].style.display; } Button.firstChild.data = collapseCaption; } } function createCollapseButtons() { hito("C createCollapseButtons"); var tableIndex = 0; var NavigationBoxes = new Object(); var Tables = document.getElementsByTagName( "table" ); for ( var i = 0; i < Tables.length; i++ ) { if ( hasClass( Tables[i], "collapsible" ) ) { /* only add button and increment count if there is a header row to work with */ var HeaderRow = Tables[i].getElementsByTagName( "tr" )[0]; if (!HeaderRow) continue; var Header = HeaderRow.getElementsByTagName( "th" )[0]; if (!Header) continue; NavigationBoxes[ tableIndex ] = Tables[i]; Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex ); var Button = document.createElement( "span" ); var ButtonLink = document.createElement( "a" ); var ButtonText = document.createTextNode( collapseCaption ); Button.style.styleFloat = "right"; Button.style.cssFloat = "right"; Button.style.fontWeight = "normal"; Button.style.textAlign = "right"; Button.style.width = "6em"; ButtonLink.style.color = Header.style.color; ButtonLink.setAttribute( "id", "collapseButton" + tableIndex ); ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" ); ButtonLink.appendChild( ButtonText ); Button.appendChild( document.createTextNode( "[" ) ); Button.appendChild( ButtonLink ); Button.appendChild( document.createTextNode( "]" ) ); Header.insertBefore( Button, Header.childNodes[0] ); tableIndex++; } } for ( var i = 0; i < tableIndex; i++ ) { if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) { collapseTable( i ); } } hito("F createCollapseButtons"); } addOnloadHook( createCollapseButtons ); // == Código del plegado/desplegado de plantillas == var NavigationBarHide = 'Plegar'; var NavigationBarShow = 'Desplegar'; var NavigationBarShowDefault = 0; document.write('