Difference between revisions of "Team:GO Paris-Saclay"

(Undo revision 57588 by Briand (talk))
 
(56 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
<html>
 
<html>
  <meta charset="utf-8">
+
<!-- predisplay while loading -->
 +
<style>
 +
body {
 +
  width: 1200px;
 +
  background-color: rgb(217,217,217);
 +
  margin: auto;
 +
  font-family: 'Roboto', Helvetica, SansSerif;
 +
  padding: 0;
 +
  color: black;
 +
  background-color:rgb(217,217,217);
 +
  word-wrap: break-word;
 +
}
  
    
+
#cssmenu {
   <base href="https://2018.igem.org/Team:GO_Paris-Saclay">
+
   background: white;
 +
   margin-top: 25px;
 +
  width: 100%;
 +
  padding: 0;
 +
  line-height: 1;
 +
  display: block;
 +
  position: relative;
 +
  top: 0em;
 +
  z-index: 1000;
 +
  font-family: 'PT Sans', sans-serif;
  
  <meta name="viewport" content="width=device-width, initial-scale=1">
+
}
  
 +
#cssmenu ul {
 +
  list-style: none;
 +
  margin: 0;
 +
  padding: 0;
 +
  display: block;
 +
  z-index: 1000;
 +
}
 +
#cssmenu ul:after,
 +
#cssmenu:after {
 +
  content: " ";
 +
  display: block;
 +
  font-size: 0;
 +
  height: 0;
 +
  clear: both;
 +
  visibility: hidden;
 +
}
 +
#cssmenu ul li {
 +
  margin: 0;
 +
  margin-right: 5px;
 +
  padding: 0;
 +
  display: block;
 +
  position: relative;
 +
  z-index: 1000;
  
<div id="bigmaindiv">
+
}
<app-root></app-root>
+
#cssmenu ul li a {
</div>
+
  text-decoration: none;
 +
  display: block;
 +
  margin: 0;
 +
  -webkit-transition: color .2s ease;
 +
  -moz-transition: color .2s ease;
 +
  -ms-transition: color .2s ease;
 +
  -o-transition: color .2s ease;
 +
  transition: color .2s ease;
 +
  -webkit-box-sizing: border-box;
 +
  -moz-box-sizing: border-box;
 +
  box-sizing: border-box;
 +
  z-index: 1000;
  
<link rel="stylesheet" href="data:text/css;base64,QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OmJsYWNrLW9uLXdoaXRlKXsubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZTojMDAwIWltcG9ydGFudH19QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OmFjdGl2ZSl7Lm1hdC1jaGVja2JveC1kaXNhYmxlZHtvcGFjaXR5Oi41fS5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kOjAgMH0ubWF0LXJpcHBsZXtkaXNwbGF5Om5vbmV9fS5tYXQtdGFibGUgdGJvZHksLm1hdC10YWJsZSB0Zm9vdCwubWF0LXRhYmxlIHRoZWFkLC5tYXQtdGFibGUtc3RpY2t5LFttYXQtZm9vdGVyLXJvd10sW21hdC1oZWFkZXItcm93XSxbbWF0LXJvd10sbWF0LWZvb3Rlci1yb3csbWF0LWhlYWRlci1yb3csbWF0LXJvd3tiYWNrZ3JvdW5kOmluaGVyaXR9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggcmdiYSgwLDAsMCwuODcpO2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmY7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggcmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6IzY3M2FiNztjYXJldC1jb2xvcjojNjIwMDNjfS5tYXQtYWNjZW50IC5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojZmZkNzQwfS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtaW5wdXQtZWxlbWVudCwubWF0LXdhcm4gLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNkMWM0ZTl9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2ZmZTU3Zn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xlLC5tYXQtc3Bpbm5lciBjaXJjbGV7c3Ryb2tlOiM2NzNhYjc7c3Ryb2tlOiM2MjAwM2N9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnQgY2lyY2xlLC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZXtzdHJva2U6I2ZmZDc0MH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm4gY2lyY2xlLC5tYXQtc3Bpbm5lci5tYXQtd2FybiBjaXJjbGV7c3Ryb2tlOiNmNDQzMzZ9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd3tjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1mb2N1c2VkOm5vdCguY2RrLW1vdXNlLWZvY3VzZWQpOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGstZm9jdXNlZDpub3QoLmNkay1tb3VzZS1mb2N1c2VkKTpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLWZvY3VzZWQ6bm90KC5jZGstbW91c2UtZm9jdXNlZCk6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWZvY3VzZWQ6bm90KC5jZGstbW91c2UtZm9jdXNlZCk6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjA5LDE5NiwyMzMsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWZvY3VzZWQ6bm90KC5jZGstbW91c2UtZm9jdXNlZCk6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWZvY3VzZWQ6bm90KC5jZGstbW91c2UtZm9jdXNlZCk6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWZvY3VzZWQ6bm90KC5jZGstbW91c2UtZm9jdXNlZCk6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstZm9jdXNlZDpub3QoLmNkay1tb3VzZS1mb2N1c2VkKTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjI5LDEyNywuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWZvY3VzZWQ6bm90KC5jZGstbW91c2UtZm9jdXNlZCk6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1mb2N1c2VkOm5vdCguY2RrLW1vdXNlLWZvY3VzZWQpOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstZm9jdXNlZDpub3QoLmNkay1tb3VzZS1mb2N1c2VkKTpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGstZm9jdXNlZDpub3QoLmNkay1tb3VzZS1mb2N1c2VkKTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstZm9jdXNlZDpub3QoLmNkay1tb3VzZS1mb2N1c2VkKTpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstZm9jdXNlZDpub3QoLmNkay1tb3VzZS1mb2N1c2VkKTpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstZm9jdXNlZDpub3QoLmNkay1tb3VzZS1mb2N1c2VkKTpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1mb2N1c2VkOm5vdCguY2RrLW1vdXNlLWZvY3VzZWQpOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIwOSwxOTYsMjMzLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWZvY3VzZWQ6bm90KC5jZGstbW91c2UtZm9jdXNlZCk6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstZm9jdXNlZDpub3QoLmNkay1tb3VzZS1mb2N1c2VkKTpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1mb2N1c2VkOm5vdCguY2RrLW1vdXNlLWZvY3VzZWQpOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstZm9jdXNlZDpub3QoLmNkay1tb3VzZS1mb2N1c2VkKTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjI5LDEyNywuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstZm9jdXNlZDpub3QoLmNkay1tb3VzZS1mb2N1c2VkKTpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGstZm9jdXNlZDpub3QoLmNkay1tb3VzZS1mb2N1c2VkKTpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstZm9jdXNlZDpub3QoLmNkay1tb3VzZS1mb2N1c2VkKTpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1mb2N1c2VkOm5vdCguY2RrLW1vdXNlLWZvY3VzZWQpOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX1ib2R5e21hcmdpbjowO2hlaWdodDoxMDB2aH0ubWF0LWVsZXZhdGlvbi16MHtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgwLDAsMCwuMiksMCAwIDAgMCByZ2JhKDAsMCwwLC4xNCksMCAwIDAgMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejF7Ym94LXNoYWRvdzowIDJweCAxcHggLTFweCByZ2JhKDAsMCwwLC4yKSwwIDFweCAxcHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggM3B4IDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoye2JveC1zaGFkb3c6MCAzcHggMXB4IC0ycHggcmdiYSgwLDAsMCwuMiksMCAycHggMnB4IDAgcmdiYSgwLDAsMCwuMTQpLDAgMXB4IDVweCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16M3tib3gtc2hhZG93OjAgM3B4IDNweCAtMnB4IHJnYmEoMCwwLDAsLjIpLDAgM3B4IDRweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCA4cHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejR7Ym94LXNoYWRvdzowIDJweCA0cHggLTFweCByZ2JhKDAsMCwwLC4yKSwwIDRweCA1cHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggMTBweCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16NXtib3gtc2hhZG93OjAgM3B4IDVweCAtMXB4IHJnYmEoMCwwLDAsLjIpLDAgNXB4IDhweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCAxNHB4IDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXo2e2JveC1zaGFkb3c6MCAzcHggNXB4IC0xcHggcmdiYSgwLDAsMCwuMiksMCA2cHggMTBweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCAxOHB4IDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXo3e2JveC1zaGFkb3c6MCA0cHggNXB4IC0ycHggcmdiYSgwLDAsMCwuMiksMCA3cHggMTBweCAxcHggcmdiYSgwLDAsMCwuMTQpLDAgMnB4IDE2cHggMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16OHtib3gtc2hhZG93OjAgNXB4IDVweCAtM3B4IHJnYmEoMCwwLDAsLjIpLDAgOHB4IDEwcHggMXB4IHJnYmEoMCwwLDAsLjE0KSwwIDNweCAxNHB4IDJweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejl7Ym94LXNoYWRvdzowIDVweCA2cHggLTNweCByZ2JhKDAsMCwwLC4yKSwwIDlweCAxMnB4IDFweCByZ2JhKDAsMCwwLC4xNCksMCAzcHggMTZweCAycHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoxMHtib3gtc2hhZG93OjAgNnB4IDZweCAtM3B4IHJnYmEoMCwwLDAsLjIpLDAgMTBweCAxNHB4IDFweCByZ2JhKDAsMCwwLC4xNCksMCA0cHggMThweCAzcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoxMXtib3gtc2hhZG93OjAgNnB4IDdweCAtNHB4IHJnYmEoMCwwLDAsLjIpLDAgMTFweCAxNXB4IDFweCByZ2JhKDAsMCwwLC4xNCksMCA0cHggMjBweCAzcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoxMntib3gtc2hhZG93OjAgN3B4IDhweCAtNHB4IHJnYmEoMCwwLDAsLjIpLDAgMTJweCAxN3B4IDJweCByZ2JhKDAsMCwwLC4xNCksMCA1cHggMjJweCA0cHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoxM3tib3gtc2hhZG93OjAgN3B4IDhweCAtNHB4IHJnYmEoMCwwLDAsLjIpLDAgMTNweCAxOXB4IDJweCByZ2JhKDAsMCwwLC4xNCksMCA1cHggMjRweCA0cHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoxNHtib3gtc2hhZG93OjAgN3B4IDlweCAtNHB4IHJnYmEoMCwwLDAsLjIpLDAgMTRweCAyMXB4IDJweCByZ2JhKDAsMCwwLC4xNCksMCA1cHggMjZweCA0cHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoxNXtib3gtc2hhZG93OjAgOHB4IDlweCAtNXB4IHJnYmEoMCwwLDAsLjIpLDAgMTVweCAyMnB4IDJweCByZ2JhKDAsMCwwLC4xNCksMCA2cHggMjhweCA1cHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoxNntib3gtc2hhZG93OjAgOHB4IDEwcHggLTVweCByZ2JhKDAsMCwwLC4yKSwwIDE2cHggMjRweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgNnB4IDMwcHggNXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTd7Ym94LXNoYWRvdzowIDhweCAxMXB4IC01cHggcmdiYSgwLDAsMCwuMiksMCAxN3B4IDI2cHggMnB4IHJnYmEoMCwwLDAsLjE0KSwwIDZweCAzMnB4IDVweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejE4e2JveC1zaGFkb3c6MCA5cHggMTFweCAtNXB4IHJnYmEoMCwwLDAsLjIpLDAgMThweCAyOHB4IDJweCByZ2JhKDAsMCwwLC4xNCksMCA3cHggMzRweCA2cHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoxOXtib3gtc2hhZG93OjAgOXB4IDEycHggLTZweCByZ2JhKDAsMCwwLC4yKSwwIDE5cHggMjlweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgN3B4IDM2cHggNnB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MjB7Ym94LXNoYWRvdzowIDEwcHggMTNweCAtNnB4IHJnYmEoMCwwLDAsLjIpLDAgMjBweCAzMXB4IDNweCByZ2JhKDAsMCwwLC4xNCksMCA4cHggMzhweCA3cHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoyMXtib3gtc2hhZG93OjAgMTBweCAxM3B4IC02cHggcmdiYSgwLDAsMCwuMiksMCAyMXB4IDMzcHggM3B4IHJnYmEoMCwwLDAsLjE0KSwwIDhweCA0MHB4IDdweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejIye2JveC1zaGFkb3c6MCAxMHB4IDE0cHggLTZweCByZ2JhKDAsMCwwLC4yKSwwIDIycHggMzVweCAzcHggcmdiYSgwLDAsMCwuMTQpLDAgOHB4IDQycHggN3B4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MjN7Ym94LXNoYWRvdzowIDExcHggMTRweCAtN3B4IHJnYmEoMCwwLDAsLjIpLDAgMjNweCAzNnB4IDNweCByZ2JhKDAsMCwwLC4xNCksMCA5cHggNDRweCA4cHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoyNHtib3gtc2hhZG93OjAgMTFweCAxNXB4IC03cHggcmdiYSgwLDAsMCwuMiksMCAyNHB4IDM4cHggM3B4IHJnYmEoMCwwLDAsLjE0KSwwIDlweCA0NnB4IDhweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1iYWRnZS1jb250ZW50e2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGwgLm1hdC1iYWRnZS1jb250ZW50e2ZvbnQtc2l6ZTo2cHh9Lm1hdC1iYWRnZS1sYXJnZSAubWF0LWJhZGdlLWNvbnRlbnR7Zm9udC1zaXplOjI0cHh9Lm1hdC1oMSwubWF0LWhlYWRsaW5lLC5tYXQtdHlwb2dyYXBoeSBoMXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsc2Fucy1zZXJpZjttYXJnaW46MCAwIDE2cHh9I0hRX3BhZ2UgaDIsI0hRX3BhZ2UgaDMsLm1hdC1oMiwubWF0LXRpdGxlLC5tYXQtdHlwb2dyYXBoeSBoMntmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsc2Fucy1zZXJpZjttYXJnaW46MCAwIDE2cHh9I0hRX3BhZ2UgI3RvY3RpdGxlIGgyLCNIUV9wYWdlIGg0LC5tYXQtaDMsLm1hdC1zdWJoZWFkaW5nLTIsLm1hdC10eXBvZ3JhcGh5IGgze2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmO21hcmdpbjowIDAgMTZweH0ubWF0LWg0LC5tYXQtc3ViaGVhZGluZy0xLC5tYXQtdHlwb2dyYXBoeSBoNHtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsc2Fucy1zZXJpZjttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNSwubWF0LXR5cG9ncmFwaHkgaDV7Zm9udDo0MDAgMTEuNjJweC8yMHB4IFJvYm90bywiSGVsdmV0aWNhIE5ldWUiLHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDYsLm1hdC10eXBvZ3JhcGh5IGg2e2ZvbnQ6NDAwIDkuMzhweC8yMHB4IFJvYm90bywiSGVsdmV0aWNhIE5ldWUiLHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS0yLC5tYXQtYm9keS1zdHJvbmd7Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywiSGVsdmV0aWNhIE5ldWUiLHNhbnMtc2VyaWZ9I0hRX3BhZ2UgcCwubWF0LWJvZHksLm1hdC1ib2R5LTEsLm1hdC10eXBvZ3JhcGh5e2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmfSNIUV9wYWdlIHAgcCwubWF0LWJvZHkgcCwubWF0LWJvZHktMSBwLC5tYXQtdHlwb2dyYXBoeSBwe21hcmdpbjowIDAgMTJweH0ubWF0LWNhcHRpb24sLm1hdC1zbWFsbHtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsc2Fucy1zZXJpZn0ubWF0LWRpc3BsYXktNCwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTR7Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsc2Fucy1zZXJpZjttYXJnaW46MCAwIDU2cHg7bGV0dGVyLXNwYWNpbmc6LS4wNWVtfS5tYXQtZGlzcGxheS0zLC5tYXQtdHlwb2dyYXBoeSAubWF0LWRpc3BsYXktM3tmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsc2Fucy1zZXJpZjttYXJnaW46MCAwIDY0cHg7bGV0dGVyLXNwYWNpbmc6LS4wMmVtfS5tYXQtZGlzcGxheS0yLC5tYXQtdHlwb2dyYXBoeSAubWF0LWRpc3BsYXktMntmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsc2Fucy1zZXJpZjttYXJnaW46MCAwIDY0cHg7bGV0dGVyLXNwYWNpbmc6LS4wMDVlbX0ubWF0LWRpc3BsYXktMSwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTF7Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywiSGVsdmV0aWNhIE5ldWUiLHNhbnMtc2VyaWY7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcntmb250LWZhbWlseTpSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWJ1dHRvbiwubWF0LWZhYiwubWF0LWZsYXQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1taW5pLWZhYiwubWF0LXJhaXNlZC1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbntmb250LWZhbWlseTpSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGUsLm1hdC1jYXJke2ZvbnQtZmFtaWx5OlJvYm90bywiSGVsdmV0aWNhIE5ldWUiLHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxle2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWNhcmQtY29udGVudCwubWF0LWNhcmQtaGVhZGVyIC5tYXQtY2FyZC10aXRsZSwubWF0LWNhcmQtc3VidGl0bGV7Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveHtmb250LWZhbWlseTpSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0IC5tYXQtY2hlY2tib3gtbGFiZWx7bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXB7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MThweH0ubWF0LWNoaXAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbiwubWF0LWNoaXAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb257Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZXtmb250LWZhbWlseTpSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGx7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbCwubWF0LWZvb3Rlci1jZWxse2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHl7Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsLC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbntmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXIgdGh7Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxle2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50e2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmfS5tYXQtZm9ybS1maWVsZHtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsc2Fucy1zZXJpZn0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb257Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uLC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbntoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbHstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKC43NSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoLjc1KTt3aWR0aDoxMzMuMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKC43NSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoLjc1KTt3aWR0aDoxMzMuMzMzMzQlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVye3RvcDotLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC13cmFwcGVye3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbHstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooLjAwMXB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSguNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKC43NSk7d2lkdGg6MTMzLjMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWiguMDAxMDFweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWiguMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKC43NSk7d2lkdGg6MTMzLjMzMzM0JX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSguNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKC4wMDEwMnB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSguNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoLjc1KTt3aWR0aDoxMzMuMzMzMzUlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7bWFyZ2luLXRvcDouNTQxNjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi4yNWVtIDAgLjc1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0uNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLS41OTM3NWVtKSBzY2FsZSguNzUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0uNTkzNzVlbSkgc2NhbGUoLjc1KTt3aWR0aDoxMzMuMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtLjU5Mzc0ZW0pIHNjYWxlKC43NSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLS41OTM3NGVtKSBzY2FsZSguNzUpO3dpZHRoOjEzMy4zMzMzNCV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtaW5maXh7cGFkZGluZzoxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoLjc1KTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSguNzUpO3dpZHRoOjEzMy4zMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKC43NSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoLjc1KTt3aWR0aDoxMzMuMzMzMzQlfS5tYXQtZ3JpZC10aWxlLWZvb3RlciwubWF0LWdyaWQtdGlsZS1oZWFkZXJ7Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZSwubWF0LWdyaWQtdGlsZS1oZWFkZXIgLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1mb290ZXIgLm1hdC1saW5lOm50aC1jaGlsZChuKzIpLC5tYXQtZ3JpZC10aWxlLWhlYWRlciAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnR7bWFyZ2luLXRvcDotLjA2MjVlbX0ubWF0LW1lbnUtaXRlbXtmb250LWZhbWlseTpSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvciwubWF0LXBhZ2luYXRvci1wYWdlLXNpemUgLm1hdC1zZWxlY3QtdHJpZ2dlcntmb250LWZhbWlseTpSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uLC5tYXQtc2VsZWN0e2ZvbnQtZmFtaWx5OlJvYm90bywiSGVsdmV0aWNhIE5ldWUiLHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcntoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50e2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Zm9udC1mYW1pbHk6Um9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLWhvcml6b250YWwsLm1hdC1zdGVwcGVyLXZlcnRpY2Fse2ZvbnQtZmFtaWx5OlJvYm90bywiSGVsdmV0aWNhIE5ldWUiLHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVse2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWR7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3Vwe2ZvbnQtZmFtaWx5OlJvYm90bywiSGVsdmV0aWNhIE5ldWUiLHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWwsLm1hdC10YWItbGlua3tmb250LWZhbWlseTpSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXIsLm1hdC10b29sYmFyIGgxLC5tYXQtdG9vbGJhciBoMiwubWF0LXRvb2xiYXIgaDMsLm1hdC10b29sYmFyIGg0LC5tYXQtdG9vbGJhciBoNSwubWF0LXRvb2xiYXIgaDZ7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywiSGVsdmV0aWNhIE5ldWUiLHNhbnMtc2VyaWY7bWFyZ2luOjB9Lm1hdC10b29sdGlwe2ZvbnQtZmFtaWx5OlJvYm90bywiSGVsdmV0aWNhIE5ldWUiLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldHtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo5cHg7cGFkZGluZy1ib3R0b206OXB4fS5tYXQtbGlzdC1pdGVtLC5tYXQtbGlzdC1vcHRpb257Zm9udC1mYW1pbHk6Um9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsc2Fucy1zZXJpZn0ubWF0LWxpc3QgLm1hdC1saXN0LWl0ZW0sLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVte2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmUsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmUsLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMiksLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMiksLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0IC5tYXQtbGlzdC1vcHRpb24sLm1hdC1uYXYtbGlzdCAubWF0LWxpc3Qtb3B0aW9uLC5tYXQtc2VsZWN0aW9uLWxpc3QgLm1hdC1saXN0LW9wdGlvbntmb250LXNpemU6MTZweH0ubWF0LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmUsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZSwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMiksLm1hdC1uYXYtbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0sLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0sLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmUsLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lLC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMiksLm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uLC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uLC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSwubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmUsLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmUsLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMiksLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMiksLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0W2RlbnNlXSAubWF0LXN1YmhlYWRlciwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LXN1YmhlYWRlciwubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbntmb250LWZhbWlseTpSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LW9wdGdyb3VwLWxhYmVse2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmO2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LXNpbXBsZS1zbmFja2Jhcntmb250LWZhbWlseTpSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtcmlwcGxle292ZXJmbG93OmhpZGRlbn0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZHtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnR7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksLXdlYmtpdC10cmFuc2Zvcm0gMHMgY3ViaWMtYmV6aWVyKDAsMCwuMiwxKTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBzIGN1YmljLWJlemllcigwLDAsLjIsMSk7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwcyBjdWJpYy1iZXppZXIoMCwwLC4yLDEpLC13ZWJraXQtdHJhbnNmb3JtIDBzIGN1YmljLWJlemllcigwLDAsLjIsMSk7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMCk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstdmlzdWFsbHktaGlkZGVue2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXIsLmNkay1vdmVybGF5LWNvbnRhaW5lcntwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJ7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXI6ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcntkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5le3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IC40cyBjdWJpYy1iZXppZXIoLjI1LC44LC4yNSwxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eToxfUBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDphY3RpdmUpey5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5ne29wYWNpdHk6LjZ9Lm1hdC1iYWRnZS1zbWFsbCAubWF0LWJhZGdlLWNvbnRlbnR7b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcHtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjI4OCl9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5ne29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveHtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2Nre3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDotd2Via2l0LWF1dG9maWxsey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQ7YW5pbWF0aW9uLW5hbWU6Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDpub3QoOi13ZWJraXQtYXV0b2ZpbGwpey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kO2FuaW1hdGlvbi1uYW1lOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemV7cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ3toZWlnaHQ6YXV0byFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuIWltcG9ydGFudDtwYWRkaW5nOjJweCAwIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94IWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Lm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwubWF0LW9wdGlvbjpmb2N1czpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLC5tYXQtb3B0aW9uOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiM2MjAwM2N9Lm1hdC1hY2NlbnQgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6Izk2MWU2NH0ubWF0LXdhcm4gLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmNmU0MH0ubWF0LW9wdGdyb3VwLWRpc2FibGVkIC5tYXQtb3B0Z3JvdXAtbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94e2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LXBzZXVkby1jaGVja2JveDo6YWZ0ZXJ7Y29sb3I6I2ZhZmFmYX0ubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtYWNjZW50IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUsLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6Izk2MWU2NH0ubWF0LXByaW1hcnkgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXByaW1hcnkgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiM2MjAwM2N9Lm1hdC13YXJuIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsLm1hdC13YXJuIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGV7YmFja2dyb3VuZDojZmY2ZTQwfS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCwubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWR7YmFja2dyb3VuZDojYjBiMGIwfS5tYXQtYXBwLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJ7ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse2JhY2tncm91bmQ6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtYmFkZ2UtYWNjZW50IC5tYXQtYmFkZ2UtY29udGVudHtiYWNrZ3JvdW5kOiM5NjFlNjQ7Y29sb3I6I2ZmZn0ubWF0LWJhZGdlLXdhcm4gLm1hdC1iYWRnZS1jb250ZW50e2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtiYWNrZ3JvdW5kOiNmZjZlNDB9Lm1hdC1iYWRnZXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJhZGdlLWhpZGRlbiAubWF0LWJhZGdlLWNvbnRlbnR7ZGlzcGxheTpub25lfS5tYXQtYmFkZ2UtY29udGVudHtjb2xvcjojZmZmO2JhY2tncm91bmQ6IzYyMDAzYztwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC4ycyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMnMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjJzIGVhc2UtaW4tb3V0LC13ZWJraXQtdHJhbnNmb3JtIC4ycyBlYXNlLWluLW91dDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguNik7dHJhbnNmb3JtOnNjYWxlKC42KTtvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LWJhZGdlLWNvbnRlbnQubWF0LWJhZGdlLWFjdGl2ZXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGwgLm1hdC1iYWRnZS1jb250ZW50e3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZXttYXJnaW4tbGVmdDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotMTZweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3Jle21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjE2cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVye21hcmdpbi1yaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTZweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJ7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MTZweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmV7bWFyZ2luLWxlZnQ6OHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmV7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6OHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVye21hcmdpbi1yaWdodDo4cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi04cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVye21hcmdpbi1yaWdodDowO21hcmdpbi1sZWZ0OjE2cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bSAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnR7Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmV7bWFyZ2luLWxlZnQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0yMnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3Jle21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjIycHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJ7bWFyZ2luLXJpZ2h0OjIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMjJweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVye21hcmdpbi1yaWdodDowO21hcmdpbi1sZWZ0OjIycHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmV7bWFyZ2luLWxlZnQ6MTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xMXB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3Jle21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjExcHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJ7bWFyZ2luLXJpZ2h0OjExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTFweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVye21hcmdpbi1yaWdodDowO21hcmdpbi1sZWZ0OjIycHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi0xMXB4fS5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50e3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsubWF0LWJhZGdlLWxhcmdlIC5tYXQtYmFkZ2UtY29udGVudCwubWF0LWJhZGdlLW1lZGl1bSAubWF0LWJhZGdlLWNvbnRlbnR7b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfX0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93IC5tYXQtYmFkZ2UtY29udGVudHtib3R0b206LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3Jle21hcmdpbi1sZWZ0OjI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0yOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmV7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MjhweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJ7bWFyZ2luLXJpZ2h0OjI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi0yOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcnttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDoyOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZXttYXJnaW4tbGVmdDoxNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotMTRweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3Jle21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjE0cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVye21hcmdpbi1yaWdodDoxNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTRweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJ7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MjhweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJ7YmFja2dyb3VuZDojZmZmO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uLC5tYXQtc3Ryb2tlZC1idXR0b257Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOjAgMH0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnl7Y29sb3I6IzYyMDAzY30ubWF0LWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnR7Y29sb3I6Izk2MWU2NH0ubWF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm57Y29sb3I6I2ZmNmU0MH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoOTgsMCw2MCwuMTIpfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTUwLDMwLDEwMCwuMTIpfS5tYXQtYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDExMCw2NCwuMTIpfS5tYXQtYnV0dG9uW2Rpc2FibGVkXSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoOTgsMCw2MCwuMSl9Lm1hdC1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgxNTAsMzAsMTAwLC4xKX0ubWF0LWJ1dHRvbi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxMTAsNjQsLjEpfS5tYXQtZmFiLC5tYXQtZmxhdC1idXR0b24sLm1hdC1taW5pLWZhYiwubWF0LXJhaXNlZC1idXR0b257Y29sb3I6cmdiYSgwLDAsMCwuODcpO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWZhYi5tYXQtYWNjZW50LC5tYXQtZmFiLm1hdC1wcmltYXJ5LC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCwubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtbWluaS1mYWIubWF0LWFjY2VudCwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeXtjb2xvcjojZmZmfS5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRde2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZhYi5tYXQtcHJpbWFyeSwubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnksLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5e2JhY2tncm91bmQtY29sb3I6IzYyMDAzY30ubWF0LWZhYi5tYXQtYWNjZW50LC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojOTYxZTY0fS5tYXQtZmFiLm1hdC13YXJuLC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4sLm1hdC1taW5pLWZhYi5tYXQtd2FybiwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm57Y29sb3I6cmdiYSgwLDAsMCwuODcpO2JhY2tncm91bmQtY29sb3I6I2ZmNmU0MH0ubWF0LWZhYi5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1mYWIubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZhYi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDk4LDAsNjAsLjIpfS5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgxNTAsMzAsMTAwLC4yKX0ubWF0LWljb24tYnV0dG9uLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxMTAsNjQsLjIpfS5tYXQtYnV0dG9uLXRvZ2dsZXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1idXR0b24tdG9nZ2xlIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2Vke2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVke2JhY2tncm91bmQtY29sb3I6I2VlZTtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWR7YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtY2FyZHtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtY2FyZC1zdWJ0aXRsZXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jaGVja2JveC1mcmFtZXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJre2ZpbGw6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZTojZmFmYWZhIWltcG9ydGFudH0ubWF0LWNoZWNrYm94LW1peGVkbWFya3tiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6IzYyMDAzY30ubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6Izk2MWU2NH0ubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXdhcm4gLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZmY2ZTQwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkOm5vdCgubWF0LWNoZWNrYm94LWNoZWNrZWQpIC5tYXQtY2hlY2tib3gtZnJhbWV7Ym9yZGVyLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZCAubWF0LWNoZWNrYm94LWxhYmVse2NvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoOTgsMCw2MCwuMjYpfS5tYXQtY2hlY2tib3g6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgLm1hdC1jaGVja2JveC1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTUwLDMwLDEwMCwuMjYpfS5tYXQtY2hlY2tib3g6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtY2hlY2tib3gtcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxMTAsNjQsLjI2KX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXB7YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjojNjIwMDNjO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5IC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeSAubWF0LWNoaXAtcmVtb3ZlOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNmZjZlNDA7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LWNoaXAtcmVtb3Zle29wYWNpdHk6LjQ7Y29sb3I6cmdiYSgwLDAsMCwuODcpO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuIC5tYXQtY2hpcC1yZW1vdmU6aG92ZXJ7b3BhY2l0eTouNTR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojOTYxZTY0O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1jaGlwLXJlbW92ZXtvcGFjaXR5Oi40O2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudCAubWF0LWNoaXAtcmVtb3ZlOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtdGFibGV7YmFja2dyb3VuZDojZmZmfW1hdC1mb290ZXItcm93LG1hdC1oZWFkZXItcm93LG1hdC1yb3csdGQubWF0LWNlbGwsdGQubWF0LWZvb3Rlci1jZWxsLHRoLm1hdC1oZWFkZXItY2VsbHtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxse2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNlbGwsLm1hdC1mb290ZXItY2VsbHtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1jYWxlbmRhci1hcnJvd3tib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50IC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9uLC5tYXQtZGF0ZXBpY2tlci10b2dnbGV7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyOjphZnRlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnR7Y29sb3I6cmdiYSgwLDAsMCwuODcpO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9LmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwuY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksLm1hdC1jYWxlbmRhci1ib2R5LWNlbGw6bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXI+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xOCl9Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6IzYyMDAzYztjb2xvcjojZmZmfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDk4LDAsNjAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50e2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojOTYxZTY0O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgxNTAsMzAsMTAwLC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZmY2ZTQwO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTEwLDY0LC40KX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZXtjb2xvcjojNjIwMDNjfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnR7Y29sb3I6Izk2MWU2NH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtd2Fybntjb2xvcjojZmY2ZTQwfS5tYXQtZGlhbG9nLWNvbnRhaW5lcntiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZGl2aWRlcntib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWRpdmlkZXItdmVydGljYWx7Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbHtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtYWN0aW9uLXJvd3tib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCkgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkuY2RrLWtleWJvYXJkLWZvY3VzZWQsLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLmNkay1wcm9ncmFtLWZvY3VzZWQsLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pOmhvdmVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1leHBhbnNpb24taW5kaWNhdG9yOjphZnRlciwubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb257Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24sLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxle2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtaGludHtjb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiM2MjAwM2N9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50e2NvbG9yOiM5NjFlNjR9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybntjb2xvcjojZmY2ZTQwfS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2Vye2NvbG9yOiM5NjFlNjR9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiM2MjAwM2N9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiM5NjFlNjR9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm57YmFja2dyb3VuZC1jb2xvcjojZmY2ZTQwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlciwubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudHtjb2xvcjojZmY2ZTQwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjojZmY2ZTQwfS5tYXQtZXJyb3J7Y29sb3I6I2ZmNmU0MH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWhpbnR7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjQyKSAwLHJnYmEoMCwwLDAsLjQyKSAzMyUsdHJhbnNwYXJlbnQgMCk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCxyZ2JhKDAsMCwwLC40MikgMCxyZ2JhKDAsMCwwLC40MikgMzMlLHRyYW5zcGFyZW50IDApO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1mbGV4e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWZsZXh7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZXtib3R0b206MS4zNDM3NWVtO2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiM2MjAwM2N9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiM5NjFlNjR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljaywubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZmY2ZTQwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le2NvbG9yOnJnYmEoMCwwLDAsLjA2KX0ubWF0LWljb24ubWF0LXByaW1hcnl7Y29sb3I6IzYyMDAzY30ubWF0LWljb24ubWF0LWFjY2VudHtjb2xvcjojOTYxZTY0fS5tYXQtaWNvbi5tYXQtd2Fybntjb2xvcjojZmY2ZTQwfS5tYXQtaW5wdXQtZWxlbWVudDpkaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1pbnB1dC1lbGVtZW50OjotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtaW5wdXQtZWxlbWVudDo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtaW5wdXQtZWxlbWVudDo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWFjY2VudCAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6Izk2MWU2NH0ubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWlucHV0LWVsZW1lbnQsLm1hdC13YXJuIC5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojZmY2ZTQwfS5tYXQtbGlzdCAubWF0LWxpc3QtaXRlbSwubWF0LWxpc3QgLm1hdC1saXN0LW9wdGlvbiwubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LW9wdGlvbiwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtLC5tYXQtc2VsZWN0aW9uLWxpc3QgLm1hdC1saXN0LW9wdGlvbntjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1saXN0IC5tYXQtc3ViaGVhZGVyLC5tYXQtbmF2LWxpc3QgLm1hdC1zdWJoZWFkZXIsLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sIkhlbHZldGljYSBOZXVlIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMDtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWR7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtbGlzdC1vcHRpb24ubWF0LWxpc3QtaXRlbS1mb2N1cywubWF0LWxpc3Qtb3B0aW9uOmhvdmVyLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW0ubWF0LWxpc3QtaXRlbS1mb2N1cywubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbWVudS1wYW5lbHtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LWl0ZW17YmFja2dyb3VuZDowIDA7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXSwubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbSAubWF0LWljb246bm90KFtjb2xvcl0pLC5tYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlcjo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVkOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoW2Rpc2FibGVkXSksLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoW2Rpc2FibGVkXSksLm1hdC1tZW51LWl0ZW06aG92ZXI6bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9ye2JhY2tncm91bmQ6I2ZmZn0ubWF0LXBhZ2luYXRvciwubWF0LXBhZ2luYXRvci1wYWdlLXNpemUgLm1hdC1zZWxlY3QtdHJpZ2dlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50LC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudHtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3QsLm1hdC1wYWdpbmF0b3ItbGFzdHtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWZpcnN0LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudCwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1sYXN0e2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNkMGIzYzV9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2QwYjNjNX0ubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiM2MjAwM2N9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2UwYmNkMX0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlMGJjZDF9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiM5NjFlNjR9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNmZmNjYmN9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZmY2NiY30ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjZlNDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnQgY2lyY2xlLC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZXtzdHJva2U6Izk2MWU2NH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm4gY2lyY2xlLC5tYXQtc3Bpbm5lci5tYXQtd2FybiBjaXJjbGV7c3Ryb2tlOiNmZjZlNDB9Lm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnR7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojNjIwMDNjfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmFkaW8taW5uZXItY2lyY2xle2JhY2tncm91bmQtY29sb3I6IzYyMDAzY30ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSg5OCwwLDYwLC4yNil9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6Izk2MWU2NH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmFkaW8taW5uZXItY2lyY2xle2JhY2tncm91bmQtY29sb3I6Izk2MWU2NH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDE1MCwzMCwxMDAsLjI2KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6I2ZmNmU0MH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJhZGlvLWlubmVyLWNpcmNsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjZlNDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDExMCw2NCwuMjYpfS5tYXQtc2VsZWN0LWNvbnRlbnQsLm1hdC1zZWxlY3QtcGFuZWwtZG9uZS1hbmltYXRpbmd7YmFja2dyb3VuZDojZmZmfS5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNlbGVjdC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtdmFsdWV7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2VsZWN0LWFycm93e2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LXNlbGVjdC1wYW5lbCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXByaW1hcnkgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6IzYyMDAzY30ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LWFjY2VudCAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjojOTYxZTY0fS5tYXQtZm9ybS1maWVsZCAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWQgLm1hdC1zZWxlY3QtYXJyb3csLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmZjZlNDB9Lm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtZHJhd2VyLWNvbnRhaW5lcntiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZHJhd2Vye2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoe2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3due2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQ6bm90KC5tYXQtZGlzYWJsZWQpIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1ie2JhY2tncm91bmQtY29sb3I6Izk2MWU2NH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZDpub3QoLm1hdC1kaXNhYmxlZCkgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgxNTAsMzAsMTAwLC41KX0ubWF0LXNsaWRlLXRvZ2dsZTpub3QoLm1hdC1jaGVja2VkKSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtc2xpZGUtdG9nZ2xlIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDE1MCwzMCwxMDAsLjEyKX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZDpub3QoLm1hdC1kaXNhYmxlZCkgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojNjIwMDNjfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkOm5vdCgubWF0LWRpc2FibGVkKSAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDk4LDAsNjAsLjUpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Om5vdCgubWF0LWNoZWNrZWQpIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNil9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoOTgsMCw2MCwuMTIpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkOm5vdCgubWF0LWRpc2FibGVkKSAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmZjU3MjJ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQ6bm90KC5tYXQtZGlzYWJsZWQpIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDg3LDM0LC41KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybjpub3QoLm1hdC1jaGVja2VkKSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSw4NywzNCwuMTIpfS5tYXQtZGlzYWJsZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtZGlzYWJsZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYiwubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwsLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7YmFja2dyb3VuZC1jb2xvcjojNjIwMDNjfS5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2NvbG9yOiNmZmZ9Lm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwsLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdHJhY2stZmlsbHtiYWNrZ3JvdW5kLWNvbG9yOiM5NjFlNjR9Lm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYiwubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWItbGFiZWwsLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7YmFja2dyb3VuZC1jb2xvcjojZmY2ZTQwfS5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JhY2tncm91bmQtY29sb3I6cmdiYSgxNTAsMzAsMTAwLC4yKX0uY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwubWF0LXNsaWRlcjpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmQsLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXNsaWRlci1kaXNhYmxlZDpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZSAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrcyAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrc3tiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQscmdiYSgwLDAsMCwuNykscmdiYSgwLDAsMCwuNykgMnB4LHRyYW5zcGFyZW50IDAsdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KC4wMDAxZGVnLHJnYmEoMCwwLDAsLjcpLHJnYmEoMCwwLDAsLjcpIDJweCx0cmFuc3BhcmVudCAwLHRyYW5zcGFyZW50KX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aWNrc3tiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLHJnYmEoMCwwLDAsLjcpLHJnYmEoMCwwLDAsLjcpIDJweCx0cmFuc3BhcmVudCAwLHRyYW5zcGFyZW50KX0ubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkLC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZCwubWF0LXN0ZXAtaGVhZGVyOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLW9wdGlvbmFse2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29ue2JhY2tncm91bmQtY29sb3I6IzYyMDAzYztjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tbm90LXRvdWNoZWR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCk7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmV7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc3RlcHBlci1ob3Jpem9udGFsLC5tYXQtc3RlcHBlci12ZXJ0aWNhbHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmU6OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhcntib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMil9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLWhlYWRlciwubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXIgLm1hdC10YWItbmF2LWJhcntib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWxpbmt7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtdGFiLWdyb3VwW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dIC5tYXQtdGFiLWhlYWRlciwubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1de2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItdG9wOm5vbmV9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWw6bm90KC5tYXQtdGFiLWRpc2FibGVkKTpmb2N1cywubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rOm5vdCgubWF0LXRhYi1kaXNhYmxlZCk6Zm9jdXMsLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbDpub3QoLm1hdC10YWItZGlzYWJsZWQpOmZvY3VzLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGluazpub3QoLm1hdC10YWItZGlzYWJsZWQpOmZvY3Vze2JhY2tncm91bmQtY29sb3I6cmdiYSgyMDgsMTc5LDE5NywuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6IzYyMDAzY30ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsOm5vdCgubWF0LXRhYi1kaXNhYmxlZCk6Zm9jdXMsLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1saW5rOm5vdCgubWF0LXRhYi1kaXNhYmxlZCk6Zm9jdXMsLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsOm5vdCgubWF0LXRhYi1kaXNhYmxlZCk6Zm9jdXMsLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbms6bm90KC5tYXQtdGFiLWRpc2FibGVkKTpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjI0LDE4OCwyMDksLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojOTYxZTY0fS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWw6bm90KC5tYXQtdGFiLWRpc2FibGVkKTpmb2N1cywubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1saW5rOm5vdCgubWF0LXRhYi1kaXNhYmxlZCk6Zm9jdXMsLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1sYWJlbDpub3QoLm1hdC10YWItZGlzYWJsZWQpOmZvY3VzLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGluazpub3QoLm1hdC10YWItZGlzYWJsZWQpOmZvY3Vze2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA0LDE4OCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmNmU0MH0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWw6bm90KC5tYXQtdGFiLWRpc2FibGVkKTpmb2N1cywubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbms6bm90KC5tYXQtdGFiLWRpc2FibGVkKTpmb2N1cywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWw6bm90KC5tYXQtdGFiLWRpc2FibGVkKTpmb2N1cywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluazpub3QoLm1hdC10YWItZGlzYWJsZWQpOmZvY3Vze2JhY2tncm91bmQtY29sb3I6cmdiYSgyMDgsMTc5LDE5NywuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rcywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rc3tiYWNrZ3JvdW5kLWNvbG9yOiM2MjAwM2N9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmssLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbDpub3QoLm1hdC10YWItZGlzYWJsZWQpOmZvY3VzLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rOm5vdCgubWF0LXRhYi1kaXNhYmxlZCk6Zm9jdXMsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWw6bm90KC5tYXQtdGFiLWRpc2FibGVkKTpmb2N1cywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rOm5vdCgubWF0LXRhYi1kaXNhYmxlZCk6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIyNCwxODgsMjA5LC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rcywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGlua3N7YmFja2dyb3VuZC1jb2xvcjojOTYxZTY0fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluaywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbDpub3QoLm1hdC10YWItZGlzYWJsZWQpOmZvY3VzLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluazpub3QoLm1hdC10YWItZGlzYWJsZWQpOmZvY3VzLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbDpub3QoLm1hdC10YWItZGlzYWJsZWQpOmZvY3VzLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rOm5vdCgubWF0LXRhYi1kaXNhYmxlZCk6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDQsMTg4LC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlciwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmtzLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmtze2JhY2tncm91bmQtY29sb3I6I2ZmNmU0MH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluaywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmt7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOnJnYmEoMCwwLDAsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtdG9vbGJhcntiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtdG9vbGJhci5tYXQtcHJpbWFyeXtiYWNrZ3JvdW5kOiM2MjAwM2M7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LWFjY2VudHtiYWNrZ3JvdW5kOiM5NjFlNjQ7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LXdhcm57YmFja2dyb3VuZDojZmY2ZTQwO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyIC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtc2VsZWN0LWFycm93LC5tYXQtdG9vbGJhciAubWF0LXNlbGVjdC1hcnJvdywubWF0LXRvb2xiYXIgLm1hdC1zZWxlY3QtdmFsdWV7Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXIgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2x0aXB7YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWV7Zm9udC1mYW1pbHk6Um9ib3RvLCJIZWx2ZXRpY2EgTmV1ZSIsc2Fucy1zZXJpZjtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGV7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4O2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJ7YmFja2dyb3VuZDojMzIzMjMyO2NvbG9yOiNmZmZ9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9ue2NvbG9yOiM5NjFlNjR9I0hRX3BhZ2UgaDJ7YmFja2dyb3VuZC1jb2xvcjojN2EyNjU5O2NvbG9yOiNmZmY7YmFja2dyb3VuZC1zaXplOjEwMCUgYXV0b30jSFFfcGFnZSAjdG9jdGl0bGUgaDJ7YmFja2dyb3VuZC1jb2xvcjp1bnNldDtjb2xvcjp1bnNldDtiYWNrZ3JvdW5kLXNpemU6MTAwJSBhdXRvfS5heGlzLS14IC5kb21haW4sLmF4aXMtLXkgLmRvbWFpbntkaXNwbGF5Om5vbmV9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uLC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZXtmbGV4LWJhc2lzOjB9QGZvbnQtZmFjZXtmb250LWZhbWlseTpSb2JvdG87Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO3NyYzp1cmwoaHR0cDovLzIwMTguaWdlbS5vcmcvd2lraS9pbWFnZXMvMi8yNi9ULS1HT19QYXJpcy1TYWNsYXktLXJvYm90by12MTgtbGF0aW4tcmVndWxhci5lb3QpO3NyYzpsb2NhbCgiUm9ib3RvIiksbG9jYWwoIlJvYm90by1SZWd1bGFyIiksdXJsKGh0dHA6Ly8yMDE4LmlnZW0ub3JnL3dpa2kvaW1hZ2VzLzIvMjYvVC0tR09fUGFyaXMtU2FjbGF5LS1yb2JvdG8tdjE4LWxhdGluLXJlZ3VsYXIuZW90PyNpZWZpeCkgZm9ybWF0KCJlbWJlZGRlZC1vcGVudHlwZSIpLHVybChodHRwOi8vMjAxOC5pZ2VtLm9yZy93aWtpL2ltYWdlcy8wLzBiL1QtLUdPX1BhcmlzLVNhY2xheS0tcm9ib3RvLXYxOC1sYXRpbi1yZWd1bGFyLndvZmYpIGZvcm1hdCgid29mZiIpLHVybChodHRwOi8vMjAxOC5pZ2VtLm9yZy9GaWxlOlQtLUdPX1BhcmlzLVNhY2xheS0tcm9ib3RvLXYxOC1sYXRpbi1yZWd1bGFyLnR0ZikgZm9ybWF0KCJ0cnVldHlwZSIpLHVybChodHRwOi8vMjAxOC5pZ2VtLm9yZy9GaWxlOlQtLUdPX1BhcmlzLVNhY2xheS0tcm9ib3RvLXYxOC1sYXRpbi1yZWd1bGFyLnN2ZyNSb2JvdG8pIGZvcm1hdCgic3ZnIil9QGZvbnQtZmFjZXtmb250LWZhbWlseTpNYXRlcmlhbEljb25zLVJlZ3VsYXI7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwfUBmb250LWZhY2V7Zm9udC1mYW1pbHk6J01hdGVyaWFsIEljb25zJztmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7c3JjOnVybChodHRwOi8vMjAxOC5pZ2VtLm9yZy93aWtpL2ltYWdlcy81LzUxL1QtLUdPX1BhcmlzLVNhY2xheS0tTWF0ZXJpYWxJY29ucy1SZWd1bGFyLmVvdCk7c3JjOmxvY2FsKCJSb2JvdG8iKSxsb2NhbCgiUm9ib3RvLVJlZ3VsYXIiKSx1cmwoaHR0cDovLzIwMTguaWdlbS5vcmcvd2lraS9pbWFnZXMvNS81MS9ULS1HT19QYXJpcy1TYWNsYXktLU1hdGVyaWFsSWNvbnMtUmVndWxhci5lb3Q/I2llZml4KSBmb3JtYXQoImVtYmVkZGVkLW9wZW50eXBlIiksdXJsKGh0dHA6Ly8yMDE4LmlnZW0ub3JnL3dpa2kvaW1hZ2VzLzIvMjgvVC0tR09fUGFyaXMtU2FjbGF5LS1NYXRlcmlhbEljb25zLVJlZ3VsYXIud29mZikgZm9ybWF0KCJ3b2ZmIiksdXJsKGh0dHA6Ly8yMDE4LmlnZW0ub3JnL3dpa2kvaW1hZ2VzLzEvMWUvVC0tR09fUGFyaXMtU2FjbGF5LS1NYXRlcmlhbEljb25zLVJlZ3VsYXIudHRmKSBmb3JtYXQoInRydWV0eXBlIiksdXJsKGh0dHA6Ly8yMDE4LmlnZW0ub3JnL3dpa2kvaW1hZ2VzLzMvM2YvVC0tR09fUGFyaXMtU2FjbGF5LS1NYXRlcmlhbEljb25zLVJlZ3VsYXIuc3ZnI01hdGVyaWFsSWNvbnMtUmVndWxhcikgZm9ybWF0KCJzdmciKX0ubWF0ZXJpYWwtaWNvbnN7Zm9udC1mYW1pbHk6J01hdGVyaWFsIEljb25zJztmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC1zaXplOjI0cHg7bGluZS1oZWlnaHQ6MTtsZXR0ZXItc3BhY2luZzpub3JtYWw7dGV4dC10cmFuc2Zvcm06bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jazt3aGl0ZS1zcGFjZTpub3dyYXA7d29yZC13cmFwOm5vcm1hbDtkaXJlY3Rpb246bHRyOy1tb3otZm9udC1mZWF0dXJlLXNldHRpbmdzOidsaWdhJzstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGV9aDEsaDIsaDMsaDQsaDUsaDZ7Ym9yZGVyLWJvdHRvbTowfQovKiMgc291cmNlTWFwcGluZ1VSTD1zdHlsZXMuY3NzLm1hcCov">
+
}
  
<script>var base64script = atob("IWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIocil7Zm9yKHZhciBuLGksYT1yWzBdLGM9clsxXSxsPXJbMl0scD0wLGY9W107cDxhLmxlbmd0aDtwKyspb1tpPWFbcF1dJiZmLnB1c2gob1tpXVswXSksb1tpXT0wO2ZvcihuIGluIGMpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsbikmJihlW25dPWNbbl0pO2ZvcihzJiZzKHIpO2YubGVuZ3RoOylmLnNoaWZ0KCkoKTtyZXR1cm4gdS5wdXNoLmFwcGx5KHUsbHx8W10pLHQoKX1mdW5jdGlvbiB0KCl7Zm9yKHZhciBlLHI9MDtyPHUubGVuZ3RoO3IrKyl7Zm9yKHZhciB0PXVbcl0sbj0hMCxhPTE7YTx0Lmxlbmd0aDthKyspMCE9PW9bdFthXV0mJihuPSExKTtuJiYodS5zcGxpY2Uoci0tLDEpLGU9aShpLnM9dFswXSkpfXJldHVybiBlfXZhciBuPXt9LG89ezM6MH0sdT1bXTtmdW5jdGlvbiBpKHIpe2lmKG5bcl0pcmV0dXJuIG5bcl0uZXhwb3J0czt2YXIgdD1uW3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gZVtyXS5jYWxsKHQuZXhwb3J0cyx0LHQuZXhwb3J0cyxpKSx0Lmw9ITAsdC5leHBvcnRzfWkuZT1mdW5jdGlvbihlKXt2YXIgcj1bXSx0PW9bZV07aWYoMCE9PXQpaWYodClyLnB1c2godFsyXSk7ZWxzZXt2YXIgbj1uZXcgUHJvbWlzZShmdW5jdGlvbihyLG4pe3Q9b1tlXT1bcixuXX0pO3IucHVzaCh0WzJdPW4pO3ZhciB1PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0sYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLmNoYXJzZXQ9InV0Zi04IixhLnRpbWVvdXQ9MTIwLGkubmMmJmEuc2V0QXR0cmlidXRlKCJub25jZSIsaS5uYyksYS5zcmM9ZnVuY3Rpb24oZSl7cmV0dXJuIGkucCsiIisoe31bZV18fGUpKyIuanMifShlKTt2YXIgYz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bCh7dHlwZToidGltZW91dCIsdGFyZ2V0OmF9KX0sMTJlNCk7ZnVuY3Rpb24gbChyKXthLm9uZXJyb3I9YS5vbmxvYWQ9bnVsbCxjbGVhclRpbWVvdXQoYyk7dmFyIHQ9b1tlXTtpZigwIT09dCl7aWYodCl7dmFyIG49ciYmKCJsb2FkIj09PXIudHlwZT8ibWlzc2luZyI6ci50eXBlKSx1PXImJnIudGFyZ2V0JiZyLnRhcmdldC5zcmMsaT1uZXcgRXJyb3IoIkxvYWRpbmcgY2h1bmsgIitlKyIgZmFpbGVkLlxuKCIrbisiOiAiK3UrIikiKTtpLnR5cGU9bixpLnJlcXVlc3Q9dSx0WzFdKGkpfW9bZV09dm9pZCAwfX1hLm9uZXJyb3I9YS5vbmxvYWQ9bCx1LmFwcGVuZENoaWxkKGEpfXJldHVybiBQcm9taXNlLmFsbChyKX0saS5tPWUsaS5jPW4saS5kPWZ1bmN0aW9uKGUscix0KXtpLm8oZSxyKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsZ2V0OnR9KX0saS5yPWZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0saS5uPWZ1bmN0aW9uKGUpe3ZhciByPWUmJmUuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBlLmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIGV9O3JldHVybiBpLmQociwiYSIscikscn0saS5vPWZ1bmN0aW9uKGUscil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpfSxpLnA9IiIsaS5vZT1mdW5jdGlvbihlKXt0aHJvdyBjb25zb2xlLmVycm9yKGUpLGV9O3ZhciBhPXdpbmRvdy53ZWJwYWNrSnNvbnA9d2luZG93LndlYnBhY2tKc29ucHx8W10sYz1hLnB1c2guYmluZChhKTthLnB1c2g9cixhPWEuc2xpY2UoKTtmb3IodmFyIGw9MDtsPGEubGVuZ3RoO2wrKylyKGFbbF0pO3ZhciBzPWM7dCgpfShbXSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXJ1bnRpbWUuanMubWFwKHdpbmRvdy53ZWJwYWNrSnNvbnA9d2luZG93LndlYnBhY2tKc29ucHx8W10pLnB1c2goW1s1XSx7IityTHYiOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJkeVpYIikuZG9jdW1lbnQ7ZS5leHBvcnRzPXImJnIuZG9jdW1lbnRFbGVtZW50fSwiMC9SNCI6ZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP251bGwhPT1lOiJmdW5jdGlvbiI9PXR5cGVvZiBlfX0sIjBUV3AiOmZ1bmN0aW9uKGUsdCxuKXshZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7IWZ1bmN0aW9uKGUpe3ZhciB0PWUucGVyZm9ybWFuY2U7ZnVuY3Rpb24gbihlKXt0JiZ0Lm1hcmsmJnQubWFyayhlKX1mdW5jdGlvbiByKGUsbil7dCYmdC5tZWFzdXJlJiZ0Lm1lYXN1cmUoZSxuKX1pZihuKCJab25lIiksZS5ab25lKXRocm93IG5ldyBFcnJvcigiWm9uZSBhbHJlYWR5IGxvYWRlZC4iKTt2YXIgbyxpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHQpe3RoaXMuX3Byb3BlcnRpZXM9bnVsbCx0aGlzLl9wYXJlbnQ9ZSx0aGlzLl9uYW1lPXQ/dC5uYW1lfHwidW5uYW1lZCI6Ijxyb290PiIsdGhpcy5fcHJvcGVydGllcz10JiZ0LnByb3BlcnRpZXN8fHt9LHRoaXMuX3pvbmVEZWxlZ2F0ZT1uZXcgYyh0aGlzLHRoaXMuX3BhcmVudCYmdGhpcy5fcGFyZW50Ll96b25lRGVsZWdhdGUsdCl9cmV0dXJuIHQuYXNzZXJ0Wm9uZVBhdGNoZWQ9ZnVuY3Rpb24oKXtpZihlLlByb21pc2UhPT1PLlpvbmVBd2FyZVByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJab25lLmpzIGhhcyBkZXRlY3RlZCB0aGF0IFpvbmVBd2FyZVByb21pc2UgYCh3aW5kb3d8Z2xvYmFsKS5Qcm9taXNlYCBoYXMgYmVlbiBvdmVyd3JpdHRlbi5cbk1vc3QgbGlrZWx5IGNhdXNlIGlzIHRoYXQgYSBQcm9taXNlIHBvbHlmaWxsIGhhcyBiZWVuIGxvYWRlZCBhZnRlciBab25lLmpzIChQb2x5ZmlsbGluZyBQcm9taXNlIGFwaSBpcyBub3QgbmVjZXNzYXJ5IHdoZW4gem9uZS5qcyBpcyBsb2FkZWQuIElmIHlvdSBtdXN0IGxvYWQgb25lLCBkbyBzbyBiZWZvcmUgbG9hZGluZyB6b25lLmpzLikiKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsInJvb3QiLHtnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGU9dC5jdXJyZW50O2UucGFyZW50OyllPWUucGFyZW50O3JldHVybiBlfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJjdXJyZW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEQuem9uZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiY3VycmVudFRhc2siLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gan0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0Ll9fbG9hZF9wYXRjaD1mdW5jdGlvbihvLGkpe2lmKE8uaGFzT3duUHJvcGVydHkobykpdGhyb3cgRXJyb3IoIkFscmVhZHkgbG9hZGVkIHBhdGNoOiAiK28pO2lmKCFlWyJfX1pvbmVfZGlzYWJsZV8iK29dKXt2YXIgYT0iWm9uZToiK287bihhKSxPW29dPWkoZSx0LFMpLHIoYSxhKX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicGFyZW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcmVudH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIm5hbWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmFtZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRab25lV2l0aChlKTtpZih0KXJldHVybiB0Ll9wcm9wZXJ0aWVzW2VdfSx0LnByb3RvdHlwZS5nZXRab25lV2l0aD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpczt0Oyl7aWYodC5fcHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gdDt0PXQuX3BhcmVudH1yZXR1cm4gbnVsbH0sdC5wcm90b3R5cGUuZm9yaz1mdW5jdGlvbihlKXtpZighZSl0aHJvdyBuZXcgRXJyb3IoIlpvbmVTcGVjIHJlcXVpcmVkISIpO3JldHVybiB0aGlzLl96b25lRGVsZWdhdGUuZm9yayh0aGlzLGUpfSx0LnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RpbmcgZnVuY3Rpb24gZ290OiAiK2UpO3ZhciBuPXRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnRlcmNlcHQodGhpcyxlLHQpLHI9dGhpcztyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gci5ydW5HdWFyZGVkKG4sdGhpcyxhcmd1bWVudHMsdCl9fSx0LnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09dCYmKHQ9dm9pZCAwKSx2b2lkIDA9PT1uJiYobj1udWxsKSx2b2lkIDA9PT1yJiYocj1udWxsKSxEPXtwYXJlbnQ6RCx6b25lOnRoaXN9O3RyeXtyZXR1cm4gdGhpcy5fem9uZURlbGVnYXRlLmludm9rZSh0aGlzLGUsdCxuLHIpfWZpbmFsbHl7RD1ELnBhcmVudH19LHQucHJvdG90eXBlLnJ1bkd1YXJkZWQ9ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09dCYmKHQ9bnVsbCksdm9pZCAwPT09biYmKG49bnVsbCksdm9pZCAwPT09ciYmKHI9bnVsbCksRD17cGFyZW50OkQsem9uZTp0aGlzfTt0cnl7dHJ5e3JldHVybiB0aGlzLl96b25lRGVsZWdhdGUuaW52b2tlKHRoaXMsZSx0LG4scil9Y2F0Y2goZSl7aWYodGhpcy5fem9uZURlbGVnYXRlLmhhbmRsZUVycm9yKHRoaXMsZSkpdGhyb3cgZX19ZmluYWxseXtEPUQucGFyZW50fX0sdC5wcm90b3R5cGUucnVuVGFzaz1mdW5jdGlvbihlLHQsbil7aWYoZS56b25lIT10aGlzKXRocm93IG5ldyBFcnJvcigiQSB0YXNrIGNhbiBvbmx5IGJlIHJ1biBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAiKyhlLnpvbmV8fGcpLm5hbWUrIjsgRXhlY3V0aW9uOiAiK3RoaXMubmFtZSsiKSIpO2lmKGUuc3RhdGUhPT15fHxlLnR5cGUhPT14KXt2YXIgcj1lLnN0YXRlIT1rO3ImJmUuX3RyYW5zaXRpb25UbyhrLG0pLGUucnVuQ291bnQrKzt2YXIgbz1qO2o9ZSxEPXtwYXJlbnQ6RCx6b25lOnRoaXN9O3RyeXtlLnR5cGU9PUUmJmUuZGF0YSYmIWUuZGF0YS5pc1BlcmlvZGljJiYoZS5jYW5jZWxGbj1udWxsKTt0cnl7cmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2VUYXNrKHRoaXMsZSx0LG4pfWNhdGNoKGUpe2lmKHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLGUpKXRocm93IGV9fWZpbmFsbHl7ZS5zdGF0ZSE9PXkmJmUuc3RhdGUhPT1UJiYoZS50eXBlPT14fHxlLmRhdGEmJmUuZGF0YS5pc1BlcmlvZGljP3ImJmUuX3RyYW5zaXRpb25UbyhtLGspOihlLnJ1bkNvdW50PTAsdGhpcy5fdXBkYXRlVGFza0NvdW50KGUsLTEpLHImJmUuX3RyYW5zaXRpb25Ubyh5LGsseSkpKSxEPUQucGFyZW50LGo9b319fSx0LnByb3RvdHlwZS5zY2hlZHVsZVRhc2s9ZnVuY3Rpb24oZSl7aWYoZS56b25lJiZlLnpvbmUhPT10aGlzKWZvcih2YXIgdD10aGlzO3Q7KXtpZih0PT09ZS56b25lKXRocm93IEVycm9yKCJjYW4gbm90IHJlc2NoZWR1bGUgdGFzayB0byAiK3RoaXMubmFtZSsiIHdoaWNoIGlzIGRlc2NlbmRhbnRzIG9mIHRoZSBvcmlnaW5hbCB6b25lICIrZS56b25lLm5hbWUpO3Q9dC5wYXJlbnR9ZS5fdHJhbnNpdGlvblRvKF8seSk7dmFyIG49W107ZS5fem9uZURlbGVnYXRlcz1uLGUuX3pvbmU9dGhpczt0cnl7ZT10aGlzLl96b25lRGVsZWdhdGUuc2NoZWR1bGVUYXNrKHRoaXMsZSl9Y2F0Y2godCl7dGhyb3cgZS5fdHJhbnNpdGlvblRvKFQsXyx5KSx0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcyx0KSx0fXJldHVybiBlLl96b25lRGVsZWdhdGVzPT09biYmdGhpcy5fdXBkYXRlVGFza0NvdW50KGUsMSksZS5zdGF0ZT09XyYmZS5fdHJhbnNpdGlvblRvKG0sXyksZX0sdC5wcm90b3R5cGUuc2NoZWR1bGVNaWNyb1Rhc2s9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuc2NoZWR1bGVUYXNrKG5ldyB1KHcsZSx0LG4scixudWxsKSl9LHQucHJvdG90eXBlLnNjaGVkdWxlTWFjcm9UYXNrPWZ1bmN0aW9uKGUsdCxuLHIsbyl7cmV0dXJuIHRoaXMuc2NoZWR1bGVUYXNrKG5ldyB1KEUsZSx0LG4scixvKSl9LHQucHJvdG90eXBlLnNjaGVkdWxlRXZlbnRUYXNrPWZ1bmN0aW9uKGUsdCxuLHIsbyl7cmV0dXJuIHRoaXMuc2NoZWR1bGVUYXNrKG5ldyB1KHgsZSx0LG4scixvKSl9LHQucHJvdG90eXBlLmNhbmNlbFRhc2s9ZnVuY3Rpb24oZSl7aWYoZS56b25lIT10aGlzKXRocm93IG5ldyBFcnJvcigiQSB0YXNrIGNhbiBvbmx5IGJlIGNhbmNlbGxlZCBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAiKyhlLnpvbmV8fGcpLm5hbWUrIjsgRXhlY3V0aW9uOiAiK3RoaXMubmFtZSsiKSIpO2UuX3RyYW5zaXRpb25UbyhiLG0sayk7dHJ5e3RoaXMuX3pvbmVEZWxlZ2F0ZS5jYW5jZWxUYXNrKHRoaXMsZSl9Y2F0Y2godCl7dGhyb3cgZS5fdHJhbnNpdGlvblRvKFQsYiksdGhpcy5fem9uZURlbGVnYXRlLmhhbmRsZUVycm9yKHRoaXMsdCksdH1yZXR1cm4gdGhpcy5fdXBkYXRlVGFza0NvdW50KGUsLTEpLGUuX3RyYW5zaXRpb25Ubyh5LGIpLGUucnVuQ291bnQ9MCxlfSx0LnByb3RvdHlwZS5fdXBkYXRlVGFza0NvdW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5fem9uZURlbGVnYXRlczstMT09dCYmKGUuX3pvbmVEZWxlZ2F0ZXM9bnVsbCk7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspbltyXS5fdXBkYXRlVGFza0NvdW50KGUudHlwZSx0KX0sdC5fX3N5bWJvbF9fPXosdH0oKSxhPXtuYW1lOiIiLG9uSGFzVGFzazpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gZS5oYXNUYXNrKG4scil9LG9uU2NoZWR1bGVUYXNrOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBlLnNjaGVkdWxlVGFzayhuLHIpfSxvbkludm9rZVRhc2s6ZnVuY3Rpb24oZSx0LG4scixvLGkpe3JldHVybiBlLmludm9rZVRhc2sobixyLG8saSl9LG9uQ2FuY2VsVGFzazpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gZS5jYW5jZWxUYXNrKG4scil9fSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbil7dGhpcy5fdGFza0NvdW50cz17bWljcm9UYXNrOjAsbWFjcm9UYXNrOjAsZXZlbnRUYXNrOjB9LHRoaXMuem9uZT1lLHRoaXMuX3BhcmVudERlbGVnYXRlPXQsdGhpcy5fZm9ya1pTPW4mJihuJiZuLm9uRm9yaz9uOnQuX2ZvcmtaUyksdGhpcy5fZm9ya0RsZ3Q9biYmKG4ub25Gb3JrP3Q6dC5fZm9ya0RsZ3QpLHRoaXMuX2ZvcmtDdXJyWm9uZT1uJiYobi5vbkZvcms/dGhpcy56b25lOnQuem9uZSksdGhpcy5faW50ZXJjZXB0WlM9biYmKG4ub25JbnRlcmNlcHQ/bjp0Ll9pbnRlcmNlcHRaUyksdGhpcy5faW50ZXJjZXB0RGxndD1uJiYobi5vbkludGVyY2VwdD90OnQuX2ludGVyY2VwdERsZ3QpLHRoaXMuX2ludGVyY2VwdEN1cnJab25lPW4mJihuLm9uSW50ZXJjZXB0P3RoaXMuem9uZTp0LnpvbmUpLHRoaXMuX2ludm9rZVpTPW4mJihuLm9uSW52b2tlP246dC5faW52b2tlWlMpLHRoaXMuX2ludm9rZURsZ3Q9biYmKG4ub25JbnZva2U/dDp0Ll9pbnZva2VEbGd0KSx0aGlzLl9pbnZva2VDdXJyWm9uZT1uJiYobi5vbkludm9rZT90aGlzLnpvbmU6dC56b25lKSx0aGlzLl9oYW5kbGVFcnJvclpTPW4mJihuLm9uSGFuZGxlRXJyb3I/bjp0Ll9oYW5kbGVFcnJvclpTKSx0aGlzLl9oYW5kbGVFcnJvckRsZ3Q9biYmKG4ub25IYW5kbGVFcnJvcj90OnQuX2hhbmRsZUVycm9yRGxndCksdGhpcy5faGFuZGxlRXJyb3JDdXJyWm9uZT1uJiYobi5vbkhhbmRsZUVycm9yP3RoaXMuem9uZTp0LnpvbmUpLHRoaXMuX3NjaGVkdWxlVGFza1pTPW4mJihuLm9uU2NoZWR1bGVUYXNrP246dC5fc2NoZWR1bGVUYXNrWlMpLHRoaXMuX3NjaGVkdWxlVGFza0RsZ3Q9biYmKG4ub25TY2hlZHVsZVRhc2s/dDp0Ll9zY2hlZHVsZVRhc2tEbGd0KSx0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZT1uJiYobi5vblNjaGVkdWxlVGFzaz90aGlzLnpvbmU6dC56b25lKSx0aGlzLl9pbnZva2VUYXNrWlM9biYmKG4ub25JbnZva2VUYXNrP246dC5faW52b2tlVGFza1pTKSx0aGlzLl9pbnZva2VUYXNrRGxndD1uJiYobi5vbkludm9rZVRhc2s/dDp0Ll9pbnZva2VUYXNrRGxndCksdGhpcy5faW52b2tlVGFza0N1cnJab25lPW4mJihuLm9uSW52b2tlVGFzaz90aGlzLnpvbmU6dC56b25lKSx0aGlzLl9jYW5jZWxUYXNrWlM9biYmKG4ub25DYW5jZWxUYXNrP246dC5fY2FuY2VsVGFza1pTKSx0aGlzLl9jYW5jZWxUYXNrRGxndD1uJiYobi5vbkNhbmNlbFRhc2s/dDp0Ll9jYW5jZWxUYXNrRGxndCksdGhpcy5fY2FuY2VsVGFza0N1cnJab25lPW4mJihuLm9uQ2FuY2VsVGFzaz90aGlzLnpvbmU6dC56b25lKSx0aGlzLl9oYXNUYXNrWlM9bnVsbCx0aGlzLl9oYXNUYXNrRGxndD1udWxsLHRoaXMuX2hhc1Rhc2tEbGd0T3duZXI9bnVsbCx0aGlzLl9oYXNUYXNrQ3VyclpvbmU9bnVsbDt2YXIgcj1uJiZuLm9uSGFzVGFzazsocnx8dCYmdC5faGFzVGFza1pTKSYmKHRoaXMuX2hhc1Rhc2taUz1yP246YSx0aGlzLl9oYXNUYXNrRGxndD10LHRoaXMuX2hhc1Rhc2tEbGd0T3duZXI9dGhpcyx0aGlzLl9oYXNUYXNrQ3VyclpvbmU9ZSxuLm9uU2NoZWR1bGVUYXNrfHwodGhpcy5fc2NoZWR1bGVUYXNrWlM9YSx0aGlzLl9zY2hlZHVsZVRhc2tEbGd0PXQsdGhpcy5fc2NoZWR1bGVUYXNrQ3VyclpvbmU9dGhpcy56b25lKSxuLm9uSW52b2tlVGFza3x8KHRoaXMuX2ludm9rZVRhc2taUz1hLHRoaXMuX2ludm9rZVRhc2tEbGd0PXQsdGhpcy5faW52b2tlVGFza0N1cnJab25lPXRoaXMuem9uZSksbi5vbkNhbmNlbFRhc2t8fCh0aGlzLl9jYW5jZWxUYXNrWlM9YSx0aGlzLl9jYW5jZWxUYXNrRGxndD10LHRoaXMuX2NhbmNlbFRhc2tDdXJyWm9uZT10aGlzLnpvbmUpKX1yZXR1cm4gZS5wcm90b3R5cGUuZm9yaz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9mb3JrWlM/dGhpcy5fZm9ya1pTLm9uRm9yayh0aGlzLl9mb3JrRGxndCx0aGlzLnpvbmUsZSx0KTpuZXcgaShlLHQpfSxlLnByb3RvdHlwZS5pbnRlcmNlcHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLl9pbnRlcmNlcHRaUz90aGlzLl9pbnRlcmNlcHRaUy5vbkludGVyY2VwdCh0aGlzLl9pbnRlcmNlcHREbGd0LHRoaXMuX2ludGVyY2VwdEN1cnJab25lLGUsdCxuKTp0fSxlLnByb3RvdHlwZS5pbnZva2U9ZnVuY3Rpb24oZSx0LG4scixvKXtyZXR1cm4gdGhpcy5faW52b2tlWlM/dGhpcy5faW52b2tlWlMub25JbnZva2UodGhpcy5faW52b2tlRGxndCx0aGlzLl9pbnZva2VDdXJyWm9uZSxlLHQsbixyLG8pOnQuYXBwbHkobixyKX0sZS5wcm90b3R5cGUuaGFuZGxlRXJyb3I9ZnVuY3Rpb24oZSx0KXtyZXR1cm4hdGhpcy5faGFuZGxlRXJyb3JaU3x8dGhpcy5faGFuZGxlRXJyb3JaUy5vbkhhbmRsZUVycm9yKHRoaXMuX2hhbmRsZUVycm9yRGxndCx0aGlzLl9oYW5kbGVFcnJvckN1cnJab25lLGUsdCl9LGUucHJvdG90eXBlLnNjaGVkdWxlVGFzaz1mdW5jdGlvbihlLHQpe3ZhciBuPXQ7aWYodGhpcy5fc2NoZWR1bGVUYXNrWlMpdGhpcy5faGFzVGFza1pTJiZuLl96b25lRGVsZWdhdGVzLnB1c2godGhpcy5faGFzVGFza0RsZ3RPd25lciksKG49dGhpcy5fc2NoZWR1bGVUYXNrWlMub25TY2hlZHVsZVRhc2sodGhpcy5fc2NoZWR1bGVUYXNrRGxndCx0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZSxlLHQpKXx8KG49dCk7ZWxzZSBpZih0LnNjaGVkdWxlRm4pdC5zY2hlZHVsZUZuKHQpO2Vsc2V7aWYodC50eXBlIT13KXRocm93IG5ldyBFcnJvcigiVGFzayBpcyBtaXNzaW5nIHNjaGVkdWxlRm4uIik7dih0KX1yZXR1cm4gbn0sZS5wcm90b3R5cGUuaW52b2tlVGFzaz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5faW52b2tlVGFza1pTP3RoaXMuX2ludm9rZVRhc2taUy5vbkludm9rZVRhc2sodGhpcy5faW52b2tlVGFza0RsZ3QsdGhpcy5faW52b2tlVGFza0N1cnJab25lLGUsdCxuLHIpOnQuY2FsbGJhY2suYXBwbHkobixyKX0sZS5wcm90b3R5cGUuY2FuY2VsVGFzaz1mdW5jdGlvbihlLHQpe3ZhciBuO2lmKHRoaXMuX2NhbmNlbFRhc2taUyluPXRoaXMuX2NhbmNlbFRhc2taUy5vbkNhbmNlbFRhc2sodGhpcy5fY2FuY2VsVGFza0RsZ3QsdGhpcy5fY2FuY2VsVGFza0N1cnJab25lLGUsdCk7ZWxzZXtpZighdC5jYW5jZWxGbil0aHJvdyBFcnJvcigiVGFzayBpcyBub3QgY2FuY2VsYWJsZSIpO249dC5jYW5jZWxGbih0KX1yZXR1cm4gbn0sZS5wcm90b3R5cGUuaGFzVGFzaz1mdW5jdGlvbihlLHQpe3RyeXtyZXR1cm4gdGhpcy5faGFzVGFza1pTJiZ0aGlzLl9oYXNUYXNrWlMub25IYXNUYXNrKHRoaXMuX2hhc1Rhc2tEbGd0LHRoaXMuX2hhc1Rhc2tDdXJyWm9uZSxlLHQpfWNhdGNoKHQpe3RoaXMuaGFuZGxlRXJyb3IoZSx0KX19LGUucHJvdG90eXBlLl91cGRhdGVUYXNrQ291bnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl90YXNrQ291bnRzLHI9bltlXSxvPW5bZV09cit0O2lmKG88MCl0aHJvdyBuZXcgRXJyb3IoIk1vcmUgdGFza3MgZXhlY3V0ZWQgdGhlbiB3ZXJlIHNjaGVkdWxlZC4iKTswIT1yJiYwIT1vfHx0aGlzLmhhc1Rhc2sodGhpcy56b25lLHttaWNyb1Rhc2s6bi5taWNyb1Rhc2s+MCxtYWNyb1Rhc2s6bi5tYWNyb1Rhc2s+MCxldmVudFRhc2s6bi5ldmVudFRhc2s+MCxjaGFuZ2U6ZX0pfSxlfSgpLHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KG4scixvLGksYSxjKXt0aGlzLl96b25lPW51bGwsdGhpcy5ydW5Db3VudD0wLHRoaXMuX3pvbmVEZWxlZ2F0ZXM9bnVsbCx0aGlzLl9zdGF0ZT0ibm90U2NoZWR1bGVkIix0aGlzLnR5cGU9bix0aGlzLnNvdXJjZT1yLHRoaXMuZGF0YT1pLHRoaXMuc2NoZWR1bGVGbj1hLHRoaXMuY2FuY2VsRm49Yyx0aGlzLmNhbGxiYWNrPW87dmFyIHU9dGhpczt0aGlzLmludm9rZT1uPT09eCYmaSYmaS51c2VHP3QuaW52b2tlVGFzazpmdW5jdGlvbigpe3JldHVybiB0Lmludm9rZVRhc2suY2FsbChlLHUsdGhpcyxhcmd1bWVudHMpfX1yZXR1cm4gdC5pbnZva2VUYXNrPWZ1bmN0aW9uKGUsdCxuKXtlfHwoZT10aGlzKSxQKys7dHJ5e3JldHVybiBlLnJ1bkNvdW50KyssZS56b25lLnJ1blRhc2soZSx0LG4pfWZpbmFsbHl7MT09UCYmZCgpLFAtLX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiem9uZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl96b25lfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwic3RhdGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhdGV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuY2FuY2VsU2NoZWR1bGVSZXF1ZXN0PWZ1bmN0aW9uKCl7dGhpcy5fdHJhbnNpdGlvblRvKHksXyl9LHQucHJvdG90eXBlLl90cmFuc2l0aW9uVG89ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuX3N0YXRlIT09dCYmdGhpcy5fc3RhdGUhPT1uKXRocm93IG5ldyBFcnJvcih0aGlzLnR5cGUrIiAnIit0aGlzLnNvdXJjZSsiJzogY2FuIG5vdCB0cmFuc2l0aW9uIHRvICciK2UrIicsIGV4cGVjdGluZyBzdGF0ZSAnIit0KyInIisobj8iIG9yICciK24rIiciOiIiKSsiLCB3YXMgJyIrdGhpcy5fc3RhdGUrIicuIik7dGhpcy5fc3RhdGU9ZSxlPT15JiYodGhpcy5fem9uZURlbGVnYXRlcz1udWxsKX0sdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhJiZ2b2lkIDAhPT10aGlzLmRhdGEuaGFuZGxlSWQ/dGhpcy5kYXRhLmhhbmRsZUlkOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzKX0sdC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6dGhpcy50eXBlLHN0YXRlOnRoaXMuc3RhdGUsc291cmNlOnRoaXMuc291cmNlLHpvbmU6dGhpcy56b25lLm5hbWUscnVuQ291bnQ6dGhpcy5ydW5Db3VudH19LHR9KCkscz16KCJzZXRUaW1lb3V0IiksbD16KCJQcm9taXNlIiksZj16KCJ0aGVuIikscD1bXSxoPSExO2Z1bmN0aW9uIHYodCl7MD09PVAmJjA9PT1wLmxlbmd0aCYmKG98fGVbbF0mJihvPWVbbF0ucmVzb2x2ZSgwKSksbz9vW2ZdKGQpOmVbc10oZCwwKSksdCYmcC5wdXNoKHQpfWZ1bmN0aW9uIGQoKXtpZighaCl7Zm9yKGg9ITA7cC5sZW5ndGg7KXt2YXIgZT1wO3A9W107Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF07dHJ5e24uem9uZS5ydW5UYXNrKG4sbnVsbCxudWxsKX1jYXRjaChlKXtTLm9uVW5oYW5kbGVkRXJyb3IoZSl9fX1TLm1pY3JvdGFza0RyYWluRG9uZSgpLGg9ITF9fXZhciBnPXtuYW1lOiJOTyBaT05FIn0seT0ibm90U2NoZWR1bGVkIixfPSJzY2hlZHVsaW5nIixtPSJzY2hlZHVsZWQiLGs9InJ1bm5pbmciLGI9ImNhbmNlbGluZyIsVD0idW5rbm93biIsdz0ibWljcm9UYXNrIixFPSJtYWNyb1Rhc2siLHg9ImV2ZW50VGFzayIsTz17fSxTPXtzeW1ib2w6eixjdXJyZW50Wm9uZUZyYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIER9LG9uVW5oYW5kbGVkRXJyb3I6WixtaWNyb3Rhc2tEcmFpbkRvbmU6WixzY2hlZHVsZU1pY3JvVGFzazp2LHNob3dVbmNhdWdodEVycm9yOmZ1bmN0aW9uKCl7cmV0dXJuIWlbeigiaWdub3JlQ29uc29sZUVycm9yVW5jYXVnaHRFcnJvciIpXX0scGF0Y2hFdmVudFRhcmdldDpmdW5jdGlvbigpe3JldHVybltdfSxwYXRjaE9uUHJvcGVydGllczpaLHBhdGNoTWV0aG9kOmZ1bmN0aW9uKCl7cmV0dXJuIFp9LGJpbmRBcmd1bWVudHM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sc2V0TmF0aXZlUHJvbWlzZTpmdW5jdGlvbihlKXtlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5yZXNvbHZlJiYobz1lLnJlc29sdmUoMCkpfX0sRD17cGFyZW50Om51bGwsem9uZTpuZXcgaShudWxsLG51bGwpfSxqPW51bGwsUD0wO2Z1bmN0aW9uIFooKXt9ZnVuY3Rpb24geihlKXtyZXR1cm4iX196b25lX3N5bWJvbF9fIitlfXIoIlpvbmUiLCJab25lIiksZS5ab25lPWl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3d8fCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZnx8Z2xvYmFsKSxab25lLl9fbG9hZF9wYXRjaCgiWm9uZUF3YXJlUHJvbWlzZSIsZnVuY3Rpb24oZSx0LG4pe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Isbz1PYmplY3QuZGVmaW5lUHJvcGVydHksaT1uLnN5bWJvbCxhPVtdLGM9aSgiUHJvbWlzZSIpLHU9aSgidGhlbiIpLHM9Il9fY3JlYXRpb25UcmFjZV9fIjtuLm9uVW5oYW5kbGVkRXJyb3I9ZnVuY3Rpb24oZSl7aWYobi5zaG93VW5jYXVnaHRFcnJvcigpKXt2YXIgdD1lJiZlLnJlamVjdGlvbjt0P2NvbnNvbGUuZXJyb3IoIlVuaGFuZGxlZCBQcm9taXNlIHJlamVjdGlvbjoiLHQgaW5zdGFuY2VvZiBFcnJvcj90Lm1lc3NhZ2U6dCwiOyBab25lOiIsZS56b25lLm5hbWUsIjsgVGFzazoiLGUudGFzayYmZS50YXNrLnNvdXJjZSwiOyBWYWx1ZToiLHQsdCBpbnN0YW5jZW9mIEVycm9yP3Quc3RhY2s6dm9pZCAwKTpjb25zb2xlLmVycm9yKGUpfX0sbi5taWNyb3Rhc2tEcmFpbkRvbmU9ZnVuY3Rpb24oKXtmb3IoO2EubGVuZ3RoOylmb3IodmFyIGU9ZnVuY3Rpb24oKXt2YXIgZT1hLnNoaWZ0KCk7dHJ5e2Uuem9uZS5ydW5HdWFyZGVkKGZ1bmN0aW9uKCl7dGhyb3cgZX0pfWNhdGNoKGUpe2YoZSl9fTthLmxlbmd0aDspZSgpfTt2YXIgbD1pKCJ1bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uSGFuZGxlciIpO2Z1bmN0aW9uIGYoZSl7bi5vblVuaGFuZGxlZEVycm9yKGUpO3RyeXt2YXIgcj10W2xdO3ImJiJmdW5jdGlvbiI9PXR5cGVvZiByJiZyLmNhbGwodGhpcyxlKX1jYXRjaChlKXt9fWZ1bmN0aW9uIHAoZSl7cmV0dXJuIGUmJmUudGhlbn1mdW5jdGlvbiBoKGUpe3JldHVybiBlfWZ1bmN0aW9uIHYoZSl7cmV0dXJuIE0ucmVqZWN0KGUpfXZhciBkPWkoInN0YXRlIiksZz1pKCJ2YWx1ZSIpLHk9aSgiZmluYWxseSIpLF89aSgicGFyZW50UHJvbWlzZVZhbHVlIiksbT1pKCJwYXJlbnRQcm9taXNlU3RhdGUiKSxrPSJQcm9taXNlLnRoZW4iLGI9bnVsbCxUPSEwLHc9ITEsRT0wO2Z1bmN0aW9uIHgoZSx0KXtyZXR1cm4gZnVuY3Rpb24obil7dHJ5e2ooZSx0LG4pfWNhdGNoKHQpe2ooZSwhMSx0KX19fXZhciBPPWZ1bmN0aW9uKCl7dmFyIGU9ITE7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe2V8fChlPSEwLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpKX19fSxTPSJQcm9taXNlIHJlc29sdmVkIHdpdGggaXRzZWxmIixEPWkoImN1cnJlbnRUYXNrVHJhY2UiKTtmdW5jdGlvbiBqKGUscixpKXt2YXIgYyx1PU8oKTtpZihlPT09aSl0aHJvdyBuZXcgVHlwZUVycm9yKFMpO2lmKGVbZF09PT1iKXt2YXIgbD1udWxsO3RyeXsib2JqZWN0IiE9dHlwZW9mIGkmJiJmdW5jdGlvbiIhPXR5cGVvZiBpfHwobD1pJiZpLnRoZW4pfWNhdGNoKHQpe3JldHVybiB1KGZ1bmN0aW9uKCl7aihlLCExLHQpfSkoKSxlfWlmKHIhPT13JiZpIGluc3RhbmNlb2YgTSYmaS5oYXNPd25Qcm9wZXJ0eShkKSYmaS5oYXNPd25Qcm9wZXJ0eShnKSYmaVtkXSE9PWIpWihpKSxqKGUsaVtkXSxpW2ddKTtlbHNlIGlmKHIhPT13JiYiZnVuY3Rpb24iPT10eXBlb2YgbCl0cnl7bC5jYWxsKGksdSh4KGUscikpLHUoeChlLCExKSkpfWNhdGNoKHQpe3UoZnVuY3Rpb24oKXtqKGUsITEsdCl9KSgpfWVsc2V7ZVtkXT1yO3ZhciBmPWVbZ107aWYoZVtnXT1pLGVbeV09PT15JiZyPT09VCYmKGVbZF09ZVttXSxlW2ddPWVbX10pLHI9PT13JiZpIGluc3RhbmNlb2YgRXJyb3Ipe3ZhciBwPXQuY3VycmVudFRhc2smJnQuY3VycmVudFRhc2suZGF0YSYmdC5jdXJyZW50VGFzay5kYXRhW3NdO3AmJm8oaSxELHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCx2YWx1ZTpwfSl9Zm9yKHZhciBoPTA7aDxmLmxlbmd0aDspeihlLGZbaCsrXSxmW2grK10sZltoKytdLGZbaCsrXSk7aWYoMD09Zi5sZW5ndGgmJnI9PXcpe2VbZF09RTt0cnl7dGhyb3cgbmV3IEVycm9yKCJVbmNhdWdodCAoaW4gcHJvbWlzZSk6ICIrKChjPWkpJiZjLnRvU3RyaW5nPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZz8oYy5jb25zdHJ1Y3RvciYmYy5jb25zdHJ1Y3Rvci5uYW1lfHwiIikrIjogIitKU09OLnN0cmluZ2lmeShjKTpjP2MudG9TdHJpbmcoKTpPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYykpKyhpJiZpLnN0YWNrPyJcbiIraS5zdGFjazoiIikpfWNhdGNoKHIpe3ZhciB2PXI7di5yZWplY3Rpb249aSx2LnByb21pc2U9ZSx2LnpvbmU9dC5jdXJyZW50LHYudGFzaz10LmN1cnJlbnRUYXNrLGEucHVzaCh2KSxuLnNjaGVkdWxlTWljcm9UYXNrKCl9fX19cmV0dXJuIGV9dmFyIFA9aSgicmVqZWN0aW9uSGFuZGxlZEhhbmRsZXIiKTtmdW5jdGlvbiBaKGUpe2lmKGVbZF09PT1FKXt0cnl7dmFyIG49dFtQXTtuJiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmbi5jYWxsKHRoaXMse3JlamVjdGlvbjplW2ddLHByb21pc2U6ZX0pfWNhdGNoKGUpe31lW2RdPXc7Zm9yKHZhciByPTA7cjxhLmxlbmd0aDtyKyspZT09PWFbcl0ucHJvbWlzZSYmYS5zcGxpY2UociwxKX19ZnVuY3Rpb24geihlLHQsbixyLG8pe1ooZSk7dmFyIGk9ZVtkXSxhPWk/ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpoOiJmdW5jdGlvbiI9PXR5cGVvZiBvP286djt0LnNjaGVkdWxlTWljcm9UYXNrKGssZnVuY3Rpb24oKXt0cnl7dmFyIHI9ZVtnXSxvPW4mJnk9PT1uW3ldO28mJihuW19dPXIsblttXT1pKTt2YXIgYz10LnJ1bihhLHZvaWQgMCxvJiZhIT09diYmYSE9PWg/W106W3JdKTtqKG4sITAsYyl9Y2F0Y2goZSl7aihuLCExLGUpfX0sbil9dmFyIE09ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBFcnJvcigiTXVzdCBiZSBhbiBpbnN0YW5jZW9mIFByb21pc2UuIik7dGhpc1tkXT1iLHRoaXNbZ109W107dHJ5e3QmJnQoeCh0aGlzLFQpLHgodGhpcyx3KSl9Y2F0Y2goZSl7aih0aGlzLCExLGUpfX1yZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiBab25lQXdhcmVQcm9taXNlKCkgeyBbbmF0aXZlIGNvZGVdIH0ifSxlLnJlc29sdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGoobmV3IHRoaXMobnVsbCksVCxlKX0sZS5yZWplY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGoobmV3IHRoaXMobnVsbCksdyxlKX0sZS5yYWNlPWZ1bmN0aW9uKGUpe3ZhciB0LG4scj1uZXcgdGhpcyhmdW5jdGlvbihlLHIpe3Q9ZSxuPXJ9KTtmdW5jdGlvbiBvKGUpe3ImJihyPXQoZSkpfWZ1bmN0aW9uIGkoZSl7ciYmKHI9bihlKSl9Zm9yKHZhciBhPTAsYz1lO2E8Yy5sZW5ndGg7YSsrKXt2YXIgdT1jW2FdO3AodSl8fCh1PXRoaXMucmVzb2x2ZSh1KSksdS50aGVuKG8saSl9cmV0dXJuIHJ9LGUuYWxsPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHI9bmV3IHRoaXMoZnVuY3Rpb24oZSxyKXt0PWUsbj1yfSksbz0wLGk9W10sYT0wLGM9ZTthPGMubGVuZ3RoO2ErKyl7dmFyIHU9Y1thXTtwKHUpfHwodT10aGlzLnJlc29sdmUodSkpLHUudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7aVtlXT1uLC0tb3x8dChpKX19KG8pLG4pLG8rK31yZXR1cm4gb3x8dChpKSxyfSxlLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKGUsbil7dmFyIHI9bmV3IHRoaXMuY29uc3RydWN0b3IobnVsbCksbz10LmN1cnJlbnQ7cmV0dXJuIHRoaXNbZF09PWI/dGhpc1tnXS5wdXNoKG8scixlLG4pOnoodGhpcyxvLHIsZSxuKSxyfSxlLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsZSl9LGUucHJvdG90eXBlLmZpbmFsbHk9ZnVuY3Rpb24oZSl7dmFyIG49bmV3IHRoaXMuY29uc3RydWN0b3IobnVsbCk7blt5XT15O3ZhciByPXQuY3VycmVudDtyZXR1cm4gdGhpc1tkXT09Yj90aGlzW2ddLnB1c2gocixuLGUsZSk6eih0aGlzLHIsbixlLGUpLG59LGV9KCk7TS5yZXNvbHZlPU0ucmVzb2x2ZSxNLnJlamVjdD1NLnJlamVjdCxNLnJhY2U9TS5yYWNlLE0uYWxsPU0uYWxsO3ZhciBDPWVbY109ZS5Qcm9taXNlLFI9dC5fX3N5bWJvbF9fKCJab25lQXdhcmVQcm9taXNlIiksST1yKGUsIlByb21pc2UiKTtJJiYhSS5jb25maWd1cmFibGV8fChJJiZkZWxldGUgSS53cml0YWJsZSxJJiZkZWxldGUgSS52YWx1ZSxJfHwoST17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9KSxJLmdldD1mdW5jdGlvbigpe3JldHVybiBlW1JdP2VbUl06ZVtjXX0sSS5zZXQ9ZnVuY3Rpb24odCl7dD09PU0/ZVtSXT10OihlW2NdPXQsdC5wcm90b3R5cGVbdV18fHEodCksbi5zZXROYXRpdmVQcm9taXNlKHQpKX0sbyhlLCJQcm9taXNlIixJKSksZS5Qcm9taXNlPU07dmFyIEYsTD1pKCJ0aGVuUGF0Y2hlZCIpO2Z1bmN0aW9uIHEoZSl7dmFyIHQ9ZS5wcm90b3R5cGUsbj1yKHQsInRoZW4iKTtpZighbnx8ITEhPT1uLndyaXRhYmxlJiZuLmNvbmZpZ3VyYWJsZSl7dmFyIG89dC50aGVuO3RbdV09byxlLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IE0oZnVuY3Rpb24oZSx0KXtvLmNhbGwobixlLHQpfSkudGhlbihlLHQpfSxlW0xdPSEwfX1pZihDKXtxKEMpO3ZhciBBPWUuZmV0Y2g7ImZ1bmN0aW9uIj09dHlwZW9mIEEmJihlLmZldGNoPShGPUEsZnVuY3Rpb24oKXt2YXIgZT1GLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihlIGluc3RhbmNlb2YgTSlyZXR1cm4gZTt2YXIgdD1lLmNvbnN0cnVjdG9yO3JldHVybiB0W0xdfHxxKHQpLGV9KSl9cmV0dXJuIFByb21pc2VbdC5fX3N5bWJvbF9fKCJ1bmNhdWdodFByb21pc2VFcnJvcnMiKV09YSxNfSk7dmFyIGU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcix0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxuPU9iamVjdC5nZXRQcm90b3R5cGVPZixyPU9iamVjdC5jcmVhdGUsbz1BcnJheS5wcm90b3R5cGUuc2xpY2UsaT0iYWRkRXZlbnRMaXN0ZW5lciIsYT0icmVtb3ZlRXZlbnRMaXN0ZW5lciIsYz1ab25lLl9fc3ltYm9sX18oaSksdT1ab25lLl9fc3ltYm9sX18oYSkscz0idHJ1ZSIsbD0iZmFsc2UiLGY9Il9fem9uZV9zeW1ib2xfXyI7ZnVuY3Rpb24gcChlLHQpe3JldHVybiBab25lLmN1cnJlbnQud3JhcChlLHQpfWZ1bmN0aW9uIGgoZSx0LG4scixvKXtyZXR1cm4gWm9uZS5jdXJyZW50LnNjaGVkdWxlTWFjcm9UYXNrKGUsdCxuLHIsbyl9dmFyIHY9Wm9uZS5fX3N5bWJvbF9fLGQ9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3csZz1kP3dpbmRvdzp2b2lkIDAseT1kJiZnfHwib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGZ8fGdsb2JhbCxfPSJyZW1vdmVBdHRyaWJ1dGUiLG09W251bGxdO2Z1bmN0aW9uIGsoZSx0KXtmb3IodmFyIG49ZS5sZW5ndGgtMTtuPj0wO24tLSkiZnVuY3Rpb24iPT10eXBlb2YgZVtuXSYmKGVbbl09cChlW25dLHQrIl8iK24pKTtyZXR1cm4gZX1mdW5jdGlvbiBiKGUpe3JldHVybiFlfHwhMSE9PWUud3JpdGFibGUmJiEoImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0JiZ2b2lkIDA9PT1lLnNldCl9dmFyIFQ9InVuZGVmaW5lZCIhPXR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlLHc9ISgibnciaW4geSkmJnZvaWQgMCE9PXkucHJvY2VzcyYmIltvYmplY3QgcHJvY2Vzc10iPT09e30udG9TdHJpbmcuY2FsbCh5LnByb2Nlc3MpLEU9IXcmJiFUJiYhKCFkfHwhZy5IVE1MRWxlbWVudCkseD12b2lkIDAhPT15LnByb2Nlc3MmJiJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwoeS5wcm9jZXNzKSYmIVQmJiEoIWR8fCFnLkhUTUxFbGVtZW50KSxPPXt9LFM9ZnVuY3Rpb24oZSl7aWYoZT1lfHx5LmV2ZW50KXt2YXIgdD1PW2UudHlwZV07dHx8KHQ9T1tlLnR5cGVdPXYoIk9OX1BST1BFUlRZIitlLnR5cGUpKTt2YXIgbj0odGhpc3x8ZS50YXJnZXR8fHkpW3RdLHI9biYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHZvaWQgMD09cnx8cnx8ZS5wcmV2ZW50RGVmYXVsdCgpLHJ9fTtmdW5jdGlvbiBEKG4scixvKXt2YXIgaT1lKG4scik7aWYoIWkmJm8mJmUobyxyKSYmKGk9e2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksaSYmaS5jb25maWd1cmFibGUpe2RlbGV0ZSBpLndyaXRhYmxlLGRlbGV0ZSBpLnZhbHVlO3ZhciBhPWkuZ2V0LGM9aS5zZXQsdT1yLnN1YnN0cigyKSxzPU9bdV07c3x8KHM9T1t1XT12KCJPTl9QUk9QRVJUWSIrdSkpLGkuc2V0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dHx8biE9PXl8fCh0PXkpLHQmJih0W3NdJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIodSxTKSxjJiZjLmFwcGx5KHQsbSksImZ1bmN0aW9uIj09dHlwZW9mIGU/KHRbc109ZSx0LmFkZEV2ZW50TGlzdGVuZXIodSxTLCExKSk6dFtzXT1udWxsKX0saS5nZXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKGV8fG4hPT15fHwoZT15KSwhZSlyZXR1cm4gbnVsbDt2YXIgdD1lW3NdO2lmKHQpcmV0dXJuIHQ7aWYoYSl7dmFyIG89YSYmYS5jYWxsKHRoaXMpO2lmKG8pcmV0dXJuIGkuc2V0LmNhbGwodGhpcyxvKSwiZnVuY3Rpb24iPT10eXBlb2YgZVtfXSYmZS5yZW1vdmVBdHRyaWJ1dGUociksb31yZXR1cm4gbnVsbH0sdChuLHIsaSl9fWZ1bmN0aW9uIGooZSx0LG4pe2lmKHQpZm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspRChlLCJvbiIrdFtyXSxuKTtlbHNle3ZhciBvPVtdO2Zvcih2YXIgaSBpbiBlKSJvbiI9PWkuc3Vic3RyKDAsMikmJm8ucHVzaChpKTtmb3IodmFyIGE9MDthPG8ubGVuZ3RoO2ErKylEKGUsb1thXSxuKX19dmFyIFA9digib3JpZ2luYWxJbnN0YW5jZSIpO2Z1bmN0aW9uIFooZSl7dmFyIG49eVtlXTtpZihuKXt5W3YoZSldPW4seVtlXT1mdW5jdGlvbigpe3ZhciB0PWsoYXJndW1lbnRzLGUpO3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAwOnRoaXNbUF09bmV3IG47YnJlYWs7Y2FzZSAxOnRoaXNbUF09bmV3IG4odFswXSk7YnJlYWs7Y2FzZSAyOnRoaXNbUF09bmV3IG4odFswXSx0WzFdKTticmVhaztjYXNlIDM6dGhpc1tQXT1uZXcgbih0WzBdLHRbMV0sdFsyXSk7YnJlYWs7Y2FzZSA0OnRoaXNbUF09bmV3IG4odFswXSx0WzFdLHRbMl0sdFszXSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkFyZyBsaXN0IHRvbyBsb25nLiIpfX0sTSh5W2VdLG4pO3ZhciByLG89bmV3IG4oZnVuY3Rpb24oKXt9KTtmb3IociBpbiBvKSJYTUxIdHRwUmVxdWVzdCI9PT1lJiYicmVzcG9uc2VCbG9iIj09PXJ8fGZ1bmN0aW9uKG4peyJmdW5jdGlvbiI9PXR5cGVvZiBvW25dP3lbZV0ucHJvdG90eXBlW25dPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbUF1bbl0uYXBwbHkodGhpc1tQXSxhcmd1bWVudHMpfTp0KHlbZV0ucHJvdG90eXBlLG4se3NldDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iPT10eXBlb2YgdD8odGhpc1tQXVtuXT1wKHQsZSsiLiIrbiksTSh0aGlzW1BdW25dLHQpKTp0aGlzW1BdW25dPXR9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzW1BdW25dfX0pfShyKTtmb3IociBpbiBuKSJwcm90b3R5cGUiIT09ciYmbi5oYXNPd25Qcm9wZXJ0eShyKSYmKHlbZV1bcl09bltyXSl9fWZ1bmN0aW9uIHoodCxyLG8pe2Zvcih2YXIgaT10O2kmJiFpLmhhc093blByb3BlcnR5KHIpOylpPW4oaSk7IWkmJnRbcl0mJihpPXQpO3ZhciBhLGM9dihyKTtpZihpJiYhKGE9aVtjXSkmJihhPWlbY109aVtyXSxiKGkmJmUoaSxyKSkpKXt2YXIgdT1vKGEsYyxyKTtpW3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHUodGhpcyxhcmd1bWVudHMpfSxNKGlbcl0sYSl9cmV0dXJuIGF9ZnVuY3Rpb24gTShlLHQpe2VbdigiT3JpZ2luYWxEZWxlZ2F0ZSIpXT10fXZhciBDPSExLFI9ITE7ZnVuY3Rpb24gSSgpe2lmKEMpcmV0dXJuIFI7Qz0hMDt0cnl7dmFyIGU9Zy5uYXZpZ2F0b3IudXNlckFnZW50O3JldHVybi0xPT09ZS5pbmRleE9mKCJNU0lFICIpJiYtMT09PWUuaW5kZXhPZigiVHJpZGVudC8iKSYmLTE9PT1lLmluZGV4T2YoIkVkZ2UvIil8fChSPSEwKSxSfWNhdGNoKGUpe319Wm9uZS5fX2xvYWRfcGF0Y2goInRvU3RyaW5nIixmdW5jdGlvbihlKXt2YXIgdD1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsbj12KCJPcmlnaW5hbERlbGVnYXRlIikscj12KCJQcm9taXNlIiksbz12KCJFcnJvciIpLGk9ZnVuY3Rpb24oKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcyl7dmFyIGk9dGhpc1tuXTtpZihpKXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBpP3QuYXBwbHkodGhpc1tuXSxhcmd1bWVudHMpOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpKTtpZih0aGlzPT09UHJvbWlzZSl7dmFyIGE9ZVtyXTtpZihhKXJldHVybiB0LmFwcGx5KGEsYXJndW1lbnRzKX1pZih0aGlzPT09RXJyb3Ipe3ZhciBjPWVbb107aWYoYylyZXR1cm4gdC5hcHBseShjLGFyZ3VtZW50cyl9fXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX07aVtuXT10LEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZz1pO3ZhciBhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgUHJvbWlzZT8iW29iamVjdCBQcm9taXNlXSI6YS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSk7dmFyIEY9e3VzZUc6ITB9LEw9e30scT17fSxBPS9eX196b25lX3N5bWJvbF9fKFx3KykodHJ1ZXxmYWxzZSkkLyxIPSJfX3pvbmVfc3ltYm9sX19wcm9wYWdhdGlvblN0b3BwZWQiO2Z1bmN0aW9uIE4oZSx0LHIpe3ZhciBvPXImJnIuYWRkfHxpLGM9ciYmci5ybXx8YSx1PXImJnIubGlzdGVuZXJzfHwiZXZlbnRMaXN0ZW5lcnMiLHA9ciYmci5ybUFsbHx8InJlbW92ZUFsbExpc3RlbmVycyIsaD12KG8pLGQ9Ii4iK28rIjoiLGc9InByZXBlbmRMaXN0ZW5lciIseT0iLiIrZysiOiIsXz1mdW5jdGlvbihlLHQsbil7aWYoIWUuaXNSZW1vdmVkKXt2YXIgcj1lLmNhbGxiYWNrOyJvYmplY3QiPT10eXBlb2YgciYmci5oYW5kbGVFdmVudCYmKGUuY2FsbGJhY2s9ZnVuY3Rpb24oZSl7cmV0dXJuIHIuaGFuZGxlRXZlbnQoZSl9LGUub3JpZ2luYWxEZWxlZ2F0ZT1yKSxlLmludm9rZShlLHQsW25dKTt2YXIgbz1lLm9wdGlvbnM7byYmIm9iamVjdCI9PXR5cGVvZiBvJiZvLm9uY2UmJnRbY10uY2FsbCh0LG4udHlwZSxlLm9yaWdpbmFsRGVsZWdhdGU/ZS5vcmlnaW5hbERlbGVnYXRlOmUuY2FsbGJhY2ssbyl9fSxtPWZ1bmN0aW9uKHQpe2lmKHQ9dHx8ZS5ldmVudCl7dmFyIG49dGhpc3x8dC50YXJnZXR8fGUscj1uW0xbdC50eXBlXVtsXV07aWYocilpZigxPT09ci5sZW5ndGgpXyhyWzBdLG4sdCk7ZWxzZSBmb3IodmFyIG89ci5zbGljZSgpLGk9MDtpPG8ubGVuZ3RoJiYoIXR8fCEwIT09dFtIXSk7aSsrKV8ob1tpXSxuLHQpfX0saz1mdW5jdGlvbih0KXtpZih0PXR8fGUuZXZlbnQpe3ZhciBuPXRoaXN8fHQudGFyZ2V0fHxlLHI9bltMW3QudHlwZV1bc11dO2lmKHIpaWYoMT09PXIubGVuZ3RoKV8oclswXSxuLHQpO2Vsc2UgZm9yKHZhciBvPXIuc2xpY2UoKSxpPTA7aTxvLmxlbmd0aCYmKCF0fHwhMCE9PXRbSF0pO2krKylfKG9baV0sbix0KX19O2Z1bmN0aW9uIGIodCxyKXtpZighdClyZXR1cm4hMTt2YXIgaT0hMDtyJiZ2b2lkIDAhPT1yLnVzZUcmJihpPXIudXNlRyk7dmFyIGE9ciYmci52aCxfPSEwO3ImJnZvaWQgMCE9PXIuY2hrRHVwJiYoXz1yLmNoa0R1cCk7dmFyIGI9ITE7ciYmdm9pZCAwIT09ci5ydCYmKGI9ci5ydCk7Zm9yKHZhciBUPXQ7VCYmIVQuaGFzT3duUHJvcGVydHkobyk7KVQ9bihUKTtpZighVCYmdFtvXSYmKFQ9dCksIVQpcmV0dXJuITE7aWYoVFtoXSlyZXR1cm4hMTt2YXIgdyxFPXt9LHg9VFtoXT1UW29dLE89VFt2KGMpXT1UW2NdLFM9VFt2KHUpXT1UW3VdLEQ9VFt2KHApXT1UW3BdO3ImJnIucHJlcGVuZCYmKHc9VFt2KHIucHJlcGVuZCldPVRbci5wcmVwZW5kXSk7dmFyIGo9aT9mdW5jdGlvbigpe2lmKCFFLmlzRXhpc3RpbmcpcmV0dXJuIHguY2FsbChFLnRhcmdldCxFLmV2ZW50TmFtZSxFLmNhcHR1cmU/azptLEUub3B0aW9ucyl9OmZ1bmN0aW9uKGUpe3JldHVybiB4LmNhbGwoRS50YXJnZXQsRS5ldmVudE5hbWUsZS5pbnZva2UsRS5vcHRpb25zKX0sUD1pP2Z1bmN0aW9uKGUpe2lmKCFlLmlzUmVtb3ZlZCl7dmFyIHQ9TFtlLmV2ZW50TmFtZV0sbj12b2lkIDA7dCYmKG49dFtlLmNhcHR1cmU/czpsXSk7dmFyIHI9biYmZS50YXJnZXRbbl07aWYocilmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylpZihyW29dPT09ZSl7ci5zcGxpY2UobywxKSxlLmlzUmVtb3ZlZD0hMCwwPT09ci5sZW5ndGgmJihlLmFsbFJlbW92ZWQ9ITAsZS50YXJnZXRbbl09bnVsbCk7YnJlYWt9fWlmKGUuYWxsUmVtb3ZlZClyZXR1cm4gTy5jYWxsKGUudGFyZ2V0LGUuZXZlbnROYW1lLGUuY2FwdHVyZT9rOm0sZS5vcHRpb25zKX06ZnVuY3Rpb24oZSl7cmV0dXJuIE8uY2FsbChlLnRhcmdldCxlLmV2ZW50TmFtZSxlLmludm9rZSxlLm9wdGlvbnMpfSxaPXImJnIuZGlmZj9yLmRpZmY6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgdDtyZXR1cm4iZnVuY3Rpb24iPT09biYmZS5jYWxsYmFjaz09PXR8fCJvYmplY3QiPT09biYmZS5vcmlnaW5hbERlbGVnYXRlPT09dH0sej1ab25lW1pvbmUuX19zeW1ib2xfXygiQkxBQ0tfTElTVEVEX0VWRU5UUyIpXSxDPWZ1bmN0aW9uKHQsbixyLG8sYyx1KXtyZXR1cm4gdm9pZCAwPT09YyYmKGM9ITEpLHZvaWQgMD09PXUmJih1PSExKSxmdW5jdGlvbigpe3ZhciBwPXRoaXN8fGUsaD1hcmd1bWVudHNbMV07aWYoIWgpcmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciB2PSExO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBoKXtpZighaC5oYW5kbGVFdmVudClyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dj0hMH1pZighYXx8YSh0LGgscCxhcmd1bWVudHMpKXt2YXIgZCxnPWFyZ3VtZW50c1swXSx5PWFyZ3VtZW50c1syXTtpZih6KWZvcih2YXIgbT0wO208ei5sZW5ndGg7bSsrKWlmKGc9PT16W21dKXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgaz0hMTt2b2lkIDA9PT15P2Q9ITE6ITA9PT15P2Q9ITA6ITE9PT15P2Q9ITE6KGQ9ISF5JiYhIXkuY2FwdHVyZSxrPSEheSYmISF5Lm9uY2UpO3ZhciBiLFQ9Wm9uZS5jdXJyZW50LHc9TFtnXTtpZih3KWI9d1tkP3M6bF07ZWxzZXt2YXIgeD1mKyhnK2wpLE89ZisoZytzKTtMW2ddPXt9LExbZ11bbF09eCxMW2ddW3NdPU8sYj1kP086eH12YXIgUyxEPXBbYl0saj0hMTtpZihEKXtpZihqPSEwLF8pZm9yKG09MDttPEQubGVuZ3RoO20rKylpZihaKERbbV0saCkpcmV0dXJufWVsc2UgRD1wW2JdPVtdO3ZhciBQPXAuY29uc3RydWN0b3IubmFtZSxNPXFbUF07TSYmKFM9TVtnXSksU3x8KFM9UCtuK2cpLEUub3B0aW9ucz15LGsmJihFLm9wdGlvbnMub25jZT0hMSksRS50YXJnZXQ9cCxFLmNhcHR1cmU9ZCxFLmV2ZW50TmFtZT1nLEUuaXNFeGlzdGluZz1qO3ZhciBDPWk/RjpudWxsO0MmJihDLnRhc2tEYXRhPUUpO3ZhciBSPVQuc2NoZWR1bGVFdmVudFRhc2soUyxoLEMscixvKTtyZXR1cm4gRS50YXJnZXQ9bnVsbCxDJiYoQy50YXNrRGF0YT1udWxsKSxrJiYoeS5vbmNlPSEwKSxSLm9wdGlvbnM9eSxSLnRhcmdldD1wLFIuY2FwdHVyZT1kLFIuZXZlbnROYW1lPWcsdiYmKFIub3JpZ2luYWxEZWxlZ2F0ZT1oKSx1P0QudW5zaGlmdChSKTpELnB1c2goUiksYz9wOnZvaWQgMH19fTtyZXR1cm4gVFtvXT1DKHgsZCxqLFAsYiksdyYmKFRbZ109Qyh3LHksZnVuY3Rpb24oZSl7cmV0dXJuIHcuY2FsbChFLnRhcmdldCxFLmV2ZW50TmFtZSxlLmludm9rZSxFLm9wdGlvbnMpfSxQLGIsITApKSxUW2NdPWZ1bmN0aW9uKCl7dmFyIHQsbj10aGlzfHxlLHI9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzJdO3Q9dm9pZCAwIT09byYmKCEwPT09b3x8ITEhPT1vJiYhIW8mJiEhby5jYXB0dXJlKTt2YXIgaT1hcmd1bWVudHNbMV07aWYoIWkpcmV0dXJuIE8uYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCFhfHxhKE8saSxuLGFyZ3VtZW50cykpe3ZhciBjLHU9TFtyXTt1JiYoYz11W3Q/czpsXSk7dmFyIGY9YyYmbltjXTtpZihmKWZvcih2YXIgcD0wO3A8Zi5sZW5ndGg7cCsrKXt2YXIgaD1mW3BdO2lmKFooaCxpKSlyZXR1cm4gZi5zcGxpY2UocCwxKSxoLmlzUmVtb3ZlZD0hMCwwPT09Zi5sZW5ndGgmJihoLmFsbFJlbW92ZWQ9ITAsbltjXT1udWxsKSxoLnpvbmUuY2FuY2VsVGFzayhoKSxiP246dm9pZCAwfXJldHVybiBPLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LFRbdV09ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sbj1XKHRoaXN8fGUsYXJndW1lbnRzWzBdKSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07dC5wdXNoKG8ub3JpZ2luYWxEZWxlZ2F0ZT9vLm9yaWdpbmFsRGVsZWdhdGU6by5jYWxsYmFjayl9cmV0dXJuIHR9LFRbcF09ZnVuY3Rpb24oKXt2YXIgdD10aGlzfHxlLG49YXJndW1lbnRzWzBdO2lmKG4pe3ZhciByPUxbbl07aWYocil7dmFyIG89dFtyW2xdXSxpPXRbcltzXV07aWYobyl7dmFyIGE9by5zbGljZSgpO2ZvcihoPTA7aDxhLmxlbmd0aDtoKyspdGhpc1tjXS5jYWxsKHRoaXMsbiwodT1hW2hdKS5vcmlnaW5hbERlbGVnYXRlP3Uub3JpZ2luYWxEZWxlZ2F0ZTp1LmNhbGxiYWNrLHUub3B0aW9ucyl9aWYoaSlmb3IoYT1pLnNsaWNlKCksaD0wO2g8YS5sZW5ndGg7aCsrKXt2YXIgdTt0aGlzW2NdLmNhbGwodGhpcyxuLCh1PWFbaF0pLm9yaWdpbmFsRGVsZWdhdGU/dS5vcmlnaW5hbERlbGVnYXRlOnUuY2FsbGJhY2ssdS5vcHRpb25zKX19fWVsc2V7Zm9yKHZhciBmPU9iamVjdC5rZXlzKHQpLGg9MDtoPGYubGVuZ3RoO2grKyl7dmFyIHY9QS5leGVjKGZbaF0pLGQ9diYmdlsxXTtkJiYicmVtb3ZlTGlzdGVuZXIiIT09ZCYmdGhpc1twXS5jYWxsKHRoaXMsZCl9dGhpc1twXS5jYWxsKHRoaXMsInJlbW92ZUxpc3RlbmVyIil9aWYoYilyZXR1cm4gdGhpc30sTShUW29dLHgpLE0oVFtjXSxPKSxEJiZNKFRbcF0sRCksUyYmTShUW3VdLFMpLCEwfWZvcih2YXIgVD1bXSx3PTA7dzx0Lmxlbmd0aDt3KyspVFt3XT1iKHRbd10scik7cmV0dXJuIFR9ZnVuY3Rpb24gVyhlLHQpe3ZhciBuPVtdO2Zvcih2YXIgciBpbiBlKXt2YXIgbz1BLmV4ZWMociksaT1vJiZvWzFdO2lmKGkmJighdHx8aT09PXQpKXt2YXIgYT1lW3JdO2lmKGEpZm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspbi5wdXNoKGFbY10pfX1yZXR1cm4gbn12YXIgWD12KCJ6b25lVGFzayIpO2Z1bmN0aW9uIEsoZSx0LG4scil7dmFyIG89bnVsbCxpPW51bGw7bis9cjt2YXIgYT17fTtmdW5jdGlvbiBjKHQpe3ZhciBuPXQuZGF0YTtyZXR1cm4gbi5hcmdzWzBdPWZ1bmN0aW9uKCl7dHJ5e3QuaW52b2tlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e3QuZGF0YSYmdC5kYXRhLmlzUGVyaW9kaWN8fCgibnVtYmVyIj09dHlwZW9mIG4uaGFuZGxlSWQ/ZGVsZXRlIGFbbi5oYW5kbGVJZF06bi5oYW5kbGVJZCYmKG4uaGFuZGxlSWRbWF09bnVsbCkpfX0sbi5oYW5kbGVJZD1vLmFwcGx5KGUsbi5hcmdzKSx0fWZ1bmN0aW9uIHUoZSl7cmV0dXJuIGkoZS5kYXRhLmhhbmRsZUlkKX1vPXooZSx0Kz1yLGZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbihvLGkpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBpWzBdKXt2YXIgcz1oKHQsaVswXSx7aGFuZGxlSWQ6bnVsbCxpc1BlcmlvZGljOiJJbnRlcnZhbCI9PT1yLGRlbGF5OiJUaW1lb3V0Ij09PXJ8fCJJbnRlcnZhbCI9PT1yP2lbMV18fDA6bnVsbCxhcmdzOml9LGMsdSk7aWYoIXMpcmV0dXJuIHM7dmFyIGw9cy5kYXRhLmhhbmRsZUlkO3JldHVybiJudW1iZXIiPT10eXBlb2YgbD9hW2xdPXM6bCYmKGxbWF09cyksbCYmbC5yZWYmJmwudW5yZWYmJiJmdW5jdGlvbiI9PXR5cGVvZiBsLnJlZiYmImZ1bmN0aW9uIj09dHlwZW9mIGwudW5yZWYmJihzLnJlZj1sLnJlZi5iaW5kKGwpLHMudW5yZWY9bC51bnJlZi5iaW5kKGwpKSwibnVtYmVyIj09dHlwZW9mIGx8fGw/bDpzfXJldHVybiBuLmFwcGx5KGUsaSl9fSksaT16KGUsbixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obixyKXt2YXIgbyxpPXJbMF07Im51bWJlciI9PXR5cGVvZiBpP289YVtpXToobz1pJiZpW1hdKXx8KG89aSksbyYmInN0cmluZyI9PXR5cGVvZiBvLnR5cGU/Im5vdFNjaGVkdWxlZCIhPT1vLnN0YXRlJiYoby5jYW5jZWxGbiYmby5kYXRhLmlzUGVyaW9kaWN8fDA9PT1vLnJ1bkNvdW50KSYmKCJudW1iZXIiPT10eXBlb2YgaT9kZWxldGUgYVtpXTppJiYoaVtYXT1udWxsKSxvLnpvbmUuY2FuY2VsVGFzayhvKSk6dC5hcHBseShlLHIpfX0pfXZhciBVPU9iamVjdFt2KCJkZWZpbmVQcm9wZXJ0eSIpXT1PYmplY3QuZGVmaW5lUHJvcGVydHksQj1PYmplY3RbdigiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIildPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsWT1PYmplY3QuY3JlYXRlLEo9digidW5jb25maWd1cmFibGVzIik7ZnVuY3Rpb24gVihlLHQpe3JldHVybiBlJiZlW0pdJiZlW0pdW3RdfWZ1bmN0aW9uIEcoZSx0LG4pe3JldHVybiBPYmplY3QuaXNGcm96ZW4obil8fChuLmNvbmZpZ3VyYWJsZT0hMCksbi5jb25maWd1cmFibGV8fChlW0pdfHxPYmplY3QuaXNGcm96ZW4oZSl8fFUoZSxKLHt3cml0YWJsZTohMCx2YWx1ZTp7fX0pLGVbSl0mJihlW0pdW3RdPSEwKSksbn1mdW5jdGlvbiBRKGUsdCxuLHIpe3RyeXtyZXR1cm4gVShlLHQsbil9Y2F0Y2goaSl7aWYoIW4uY29uZmlndXJhYmxlKXRocm93IGk7dm9pZCAwPT09cj9kZWxldGUgbi5jb25maWd1cmFibGU6bi5jb25maWd1cmFibGU9cjt0cnl7cmV0dXJuIFUoZSx0LG4pfWNhdGNoKHIpe3ZhciBvPW51bGw7dHJ5e289SlNPTi5zdHJpbmdpZnkobil9Y2F0Y2goZSl7bz1uLnRvU3RyaW5nKCl9Y29uc29sZS5sb2coIkF0dGVtcHRpbmcgdG8gY29uZmlndXJlICciK3QrIicgd2l0aCBkZXNjcmlwdG9yICciK28rIicgb24gb2JqZWN0ICciK2UrIicgYW5kIGdvdCBlcnJvciwgZ2l2aW5nIHVwOiAiK3IpfX19dmFyICQ9WyJhYnNvbHV0ZWRldmljZW9yaWVudGF0aW9uIiwiYWZ0ZXJpbnB1dCIsImFmdGVycHJpbnQiLCJhcHBpbnN0YWxsZWQiLCJiZWZvcmVpbnN0YWxscHJvbXB0IiwiYmVmb3JlcHJpbnQiLCJiZWZvcmV1bmxvYWQiLCJkZXZpY2VsaWdodCIsImRldmljZW1vdGlvbiIsImRldmljZW9yaWVudGF0aW9uIiwiZGV2aWNlb3JpZW50YXRpb25hYnNvbHV0ZSIsImRldmljZXByb3hpbWl0eSIsImhhc2hjaGFuZ2UiLCJsYW5ndWFnZWNoYW5nZSIsIm1lc3NhZ2UiLCJtb3piZWZvcmVwYWludCIsIm9mZmxpbmUiLCJvbmxpbmUiLCJwYWludCIsInBhZ2VzaG93IiwicGFnZWhpZGUiLCJwb3BzdGF0ZSIsInJlamVjdGlvbmhhbmRsZWQiLCJzdG9yYWdlIiwidW5oYW5kbGVkcmVqZWN0aW9uIiwidW5sb2FkIiwidXNlcnByb3hpbWl0eSIsInZyZGlzcGx5Y29ubmVjdGVkIiwidnJkaXNwbGF5ZGlzY29ubmVjdGVkIiwidnJkaXNwbGF5cHJlc2VudGNoYW5nZSJdLGVlPVsiZW5jcnlwdGVkIiwid2FpdGluZ2ZvcmtleSIsIm1zbmVlZGtleSIsIm1vemludGVycnVwdGJlZ2luIiwibW96aW50ZXJydXB0ZW5kIl0sdGU9WyJsb2FkIl0sbmU9WyJibHVyIiwiZXJyb3IiLCJmb2N1cyIsImxvYWQiLCJyZXNpemUiLCJzY3JvbGwiLCJtZXNzYWdlZXJyb3IiXSxyZT1bImJvdW5jZSIsImZpbmlzaCIsInN0YXJ0Il0sb2U9WyJsb2Fkc3RhcnQiLCJwcm9ncmVzcyIsImFib3J0IiwiZXJyb3IiLCJsb2FkIiwicHJvZ3Jlc3MiLCJ0aW1lb3V0IiwibG9hZGVuZCIsInJlYWR5c3RhdGVjaGFuZ2UiXSxpZT1bInVwZ3JhZGVuZWVkZWQiLCJjb21wbGV0ZSIsImFib3J0Iiwic3VjY2VzcyIsImVycm9yIiwiYmxvY2tlZCIsInZlcnNpb25jaGFuZ2UiLCJjbG9zZSJdLGFlPVsiY2xvc2UiLCJlcnJvciIsIm9wZW4iLCJtZXNzYWdlIl0sY2U9WyJlcnJvciIsIm1lc3NhZ2UiXSx1ZT1bImFib3J0IiwiYW5pbWF0aW9uY2FuY2VsIiwiYW5pbWF0aW9uZW5kIiwiYW5pbWF0aW9uaXRlcmF0aW9uIiwiYXV4Y2xpY2siLCJiZWZvcmVpbnB1dCIsImJsdXIiLCJjYW5jZWwiLCJjYW5wbGF5IiwiY2FucGxheXRocm91Z2giLCJjaGFuZ2UiLCJjb21wb3NpdGlvbnN0YXJ0IiwiY29tcG9zaXRpb251cGRhdGUiLCJjb21wb3NpdGlvbmVuZCIsImN1ZWNoYW5nZSIsImNsaWNrIiwiY2xvc2UiLCJjb250ZXh0bWVudSIsImN1cmVjaGFuZ2UiLCJkYmxjbGljayIsImRyYWciLCJkcmFnZW5kIiwiZHJhZ2VudGVyIiwiZHJhZ2V4aXQiLCJkcmFnbGVhdmUiLCJkcmFnb3ZlciIsImRyb3AiLCJkdXJhdGlvbmNoYW5nZSIsImVtcHRpZWQiLCJlbmRlZCIsImVycm9yIiwiZm9jdXMiLCJmb2N1c2luIiwiZm9jdXNvdXQiLCJnb3Rwb2ludGVyY2FwdHVyZSIsImlucHV0IiwiaW52YWxpZCIsImtleWRvd24iLCJrZXlwcmVzcyIsImtleXVwIiwibG9hZCIsImxvYWRzdGFydCIsImxvYWRlZGRhdGEiLCJsb2FkZWRtZXRhZGF0YSIsImxvc3Rwb2ludGVyY2FwdHVyZSIsIm1vdXNlZG93biIsIm1vdXNlZW50ZXIiLCJtb3VzZWxlYXZlIiwibW91c2Vtb3ZlIiwibW91c2VvdXQiLCJtb3VzZW92ZXIiLCJtb3VzZXVwIiwibW91c2V3aGVlbCIsIm9yaWVudGF0aW9uY2hhbmdlIiwicGF1c2UiLCJwbGF5IiwicGxheWluZyIsInBvaW50ZXJjYW5jZWwiLCJwb2ludGVyZG93biIsInBvaW50ZXJlbnRlciIsInBvaW50ZXJsZWF2ZSIsInBvaW50ZXJsb2NrY2hhbmdlIiwibW96cG9pbnRlcmxvY2tjaGFuZ2UiLCJ3ZWJraXRwb2ludGVybG9ja2VyY2hhbmdlIiwicG9pbnRlcmxvY2tlcnJvciIsIm1venBvaW50ZXJsb2NrZXJyb3IiLCJ3ZWJraXRwb2ludGVybG9ja2Vycm9yIiwicG9pbnRlcm1vdmUiLCJwb2ludG91dCIsInBvaW50ZXJvdmVyIiwicG9pbnRlcnVwIiwicHJvZ3Jlc3MiLCJyYXRlY2hhbmdlIiwicmVzZXQiLCJyZXNpemUiLCJzY3JvbGwiLCJzZWVrZWQiLCJzZWVraW5nIiwic2VsZWN0Iiwic2VsZWN0aW9uY2hhbmdlIiwic2VsZWN0c3RhcnQiLCJzaG93Iiwic29ydCIsInN0YWxsZWQiLCJzdWJtaXQiLCJzdXNwZW5kIiwidGltZXVwZGF0ZSIsInZvbHVtZWNoYW5nZSIsInRvdWNoY2FuY2VsIiwidG91Y2htb3ZlIiwidG91Y2hzdGFydCIsInRvdWNoZW5kIiwidHJhbnNpdGlvbmNhbmNlbCIsInRyYW5zaXRpb25lbmQiLCJ3YWl0aW5nIiwid2hlZWwiXS5jb25jYXQoWyJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsIndlYmdsY29udGV4dGxvc3QiLCJ3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yIl0sWyJhdXRvY29tcGxldGUiLCJhdXRvY29tcGxldGVlcnJvciJdLFsidG9nZ2xlIl0sWyJhZnRlcnNjcmlwdGV4ZWN1dGUiLCJiZWZvcmVzY3JpcHRleGVjdXRlIiwiRE9NQ29udGVudExvYWRlZCIsImZ1bGxzY3JlZW5jaGFuZ2UiLCJtb3pmdWxsc2NyZWVuY2hhbmdlIiwid2Via2l0ZnVsbHNjcmVlbmNoYW5nZSIsIm1zZnVsbHNjcmVlbmNoYW5nZSIsImZ1bGxzY3JlZW5lcnJvciIsIm1vemZ1bGxzY3JlZW5lcnJvciIsIndlYmtpdGZ1bGxzY3JlZW5lcnJvciIsIm1zZnVsbHNjcmVlbmVycm9yIiwicmVhZHlzdGF0ZWNoYW5nZSIsInZpc2liaWxpdHljaGFuZ2UiXSwkLFsiYmVmb3JlY29weSIsImJlZm9yZWN1dCIsImJlZm9yZXBhc3RlIiwiY29weSIsImN1dCIsInBhc3RlIiwiZHJhZ3N0YXJ0IiwibG9hZGVuZCIsImFuaW1hdGlvbnN0YXJ0Iiwic2VhcmNoIiwidHJhbnNpdGlvbnJ1biIsInRyYW5zaXRpb25zdGFydCIsIndlYmtpdGFuaW1hdGlvbmVuZCIsIndlYmtpdGFuaW1hdGlvbml0ZXJhdGlvbiIsIndlYmtpdGFuaW1hdGlvbnN0YXJ0Iiwid2Via2l0dHJhbnNpdGlvbmVuZCJdLFsiYWN0aXZhdGUiLCJhZnRlcnVwZGF0ZSIsImFyaWFyZXF1ZXN0IiwiYmVmb3JlYWN0aXZhdGUiLCJiZWZvcmVkZWFjdGl2YXRlIiwiYmVmb3JlZWRpdGZvY3VzIiwiYmVmb3JldXBkYXRlIiwiY2VsbGNoYW5nZSIsImNvbnRyb2xzZWxlY3QiLCJkYXRhYXZhaWxhYmxlIiwiZGF0YXNldGNoYW5nZWQiLCJkYXRhc2V0Y29tcGxldGUiLCJlcnJvcnVwZGF0ZSIsImZpbHRlcmNoYW5nZSIsImxheW91dGNvbXBsZXRlIiwibG9zZWNhcHR1cmUiLCJtb3ZlIiwibW92ZWVuZCIsIm1vdmVzdGFydCIsInByb3BlcnR5Y2hhbmdlIiwicmVzaXplZW5kIiwicmVzaXplc3RhcnQiLCJyb3dlbnRlciIsInJvd2V4aXQiLCJyb3dzZGVsZXRlIiwicm93c2luc2VydGVkIiwiY29tbWFuZCIsImNvbXBhc3NuZWVkc2NhbGlicmF0aW9uIiwiZGVhY3RpdmF0ZSIsImhlbHAiLCJtc2NvbnRlbnR6b29tIiwibXNtYW5pcHVsYXRpb25zdGF0ZWNoYW5nZWQiLCJtc2dlc3R1cmVjaGFuZ2UiLCJtc2dlc3R1cmVkb3VibGV0YXAiLCJtc2dlc3R1cmVlbmQiLCJtc2dlc3R1cmVob2xkIiwibXNnZXN0dXJlc3RhcnQiLCJtc2dlc3R1cmV0YXAiLCJtc2dvdHBvaW50ZXJjYXB0dXJlIiwibXNpbmVydGlhc3RhcnQiLCJtc2xvc3Rwb2ludGVyY2FwdHVyZSIsIm1zcG9pbnRlcmNhbmNlbCIsIm1zcG9pbnRlcmRvd24iLCJtc3BvaW50ZXJlbnRlciIsIm1zcG9pbnRlcmhvdmVyIiwibXNwb2ludGVybGVhdmUiLCJtc3BvaW50ZXJtb3ZlIiwibXNwb2ludGVyb3V0IiwibXNwb2ludGVyb3ZlciIsIm1zcG9pbnRlcnVwIiwicG9pbnRlcm91dCIsIm1zc2l0ZW1vZGVqdW1wbGlzdGl0ZW1yZW1vdmVkIiwibXN0aHVtYm5haWxjbGljayIsInN0b3AiLCJzdG9yYWdlY29tbWl0Il0pO2Z1bmN0aW9uIHNlKGUsdCxuLHIpe2UmJmooZSxmdW5jdGlvbihlLHQsbil7aWYoIW4pcmV0dXJuIHQ7dmFyIHI9bi5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQudGFyZ2V0PT09ZX0pO2lmKCFyfHwwPT09ci5sZW5ndGgpcmV0dXJuIHQ7dmFyIG89clswXS5pZ25vcmVQcm9wZXJ0aWVzO3JldHVybiB0LmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4tMT09PW8uaW5kZXhPZihlKX0pfShlLHQsbikscil9ZnVuY3Rpb24gbGUoYyx1KXtpZighd3x8eCl7dmFyIHM9InVuZGVmaW5lZCIhPXR5cGVvZiBXZWJTb2NrZXQ7aWYoZnVuY3Rpb24oKXtpZigoRXx8eCkmJiFlKEhUTUxFbGVtZW50LnByb3RvdHlwZSwib25jbGljayIpJiYidW5kZWZpbmVkIiE9dHlwZW9mIEVsZW1lbnQpe3ZhciBuPWUoRWxlbWVudC5wcm90b3R5cGUsIm9uY2xpY2siKTtpZihuJiYhbi5jb25maWd1cmFibGUpcmV0dXJuITF9dmFyIHI9WE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLG89ZShyLCJvbnJlYWR5c3RhdGVjaGFuZ2UiKTtpZihvKXt0KHIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiEwfX0pO3ZhciBpPSEhKGM9bmV3IFhNTEh0dHBSZXF1ZXN0KS5vbnJlYWR5c3RhdGVjaGFuZ2U7cmV0dXJuIHQociwib25yZWFkeXN0YXRlY2hhbmdlIixvfHx7fSksaX12YXIgYT12KCJmYWtlIik7dChyLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1thXX0sc2V0OmZ1bmN0aW9uKGUpe3RoaXNbYV09ZX19KTt2YXIgYyx1PWZ1bmN0aW9uKCl7fTtyZXR1cm4oYz1uZXcgWE1MSHR0cFJlcXVlc3QpLm9ucmVhZHlzdGF0ZWNoYW5nZT11LGk9Y1thXT09PXUsYy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxpfSgpKXt2YXIgbD11Ll9fWm9uZV9pZ25vcmVfb25fcHJvcGVydGllcztpZihFKXt2YXIgZj13aW5kb3c7c2UoZix1ZS5jb25jYXQoWyJtZXNzYWdlZXJyb3IiXSksbCxuKGYpKSxzZShEb2N1bWVudC5wcm90b3R5cGUsdWUsbCksdm9pZCAwIT09Zi5TVkdFbGVtZW50JiZzZShmLlNWR0VsZW1lbnQucHJvdG90eXBlLHVlLGwpLHNlKEVsZW1lbnQucHJvdG90eXBlLHVlLGwpLHNlKEhUTUxFbGVtZW50LnByb3RvdHlwZSx1ZSxsKSxzZShIVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZSxlZSxsKSxzZShIVE1MRnJhbWVTZXRFbGVtZW50LnByb3RvdHlwZSwkLmNvbmNhdChuZSksbCksc2UoSFRNTEJvZHlFbGVtZW50LnByb3RvdHlwZSwkLmNvbmNhdChuZSksbCksc2UoSFRNTEZyYW1lRWxlbWVudC5wcm90b3R5cGUsdGUsbCksc2UoSFRNTElGcmFtZUVsZW1lbnQucHJvdG90eXBlLHRlLGwpO3ZhciBoPWYuSFRNTE1hcnF1ZWVFbGVtZW50O2gmJnNlKGgucHJvdG90eXBlLHJlLGwpO3ZhciBkPWYuV29ya2VyO2QmJnNlKGQucHJvdG90eXBlLGNlLGwpfXNlKFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSxvZSxsKTt2YXIgZz11LlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ7ZyYmc2UoZyYmZy5wcm90b3R5cGUsb2UsbCksInVuZGVmaW5lZCIhPXR5cGVvZiBJREJJbmRleCYmKHNlKElEQkluZGV4LnByb3RvdHlwZSxpZSxsKSxzZShJREJSZXF1ZXN0LnByb3RvdHlwZSxpZSxsKSxzZShJREJPcGVuREJSZXF1ZXN0LnByb3RvdHlwZSxpZSxsKSxzZShJREJEYXRhYmFzZS5wcm90b3R5cGUsaWUsbCksc2UoSURCVHJhbnNhY3Rpb24ucHJvdG90eXBlLGllLGwpLHNlKElEQkN1cnNvci5wcm90b3R5cGUsaWUsbCkpLHMmJnNlKFdlYlNvY2tldC5wcm90b3R5cGUsYWUsbCl9ZWxzZSFmdW5jdGlvbigpe2Zvcih2YXIgZT1mdW5jdGlvbihlKXt2YXIgdD11ZVtlXSxuPSJvbiIrdDtzZWxmLmFkZEV2ZW50TGlzdGVuZXIodCxmdW5jdGlvbihlKXt2YXIgdCxyLG89ZS50YXJnZXQ7Zm9yKHI9bz9vLmNvbnN0cnVjdG9yLm5hbWUrIi4iK246InVua25vd24uIituO287KW9bbl0mJiFvW25dW2ZlXSYmKCh0PXAob1tuXSxyKSlbZmVdPW9bbl0sb1tuXT10KSxvPW8ucGFyZW50RWxlbWVudH0sITApfSx0PTA7dDx1ZS5sZW5ndGg7dCsrKWUodCl9KCksWigiWE1MSHR0cFJlcXVlc3QiKSxzJiZmdW5jdGlvbih0LG4pe3ZhciBjPW4uV2ViU29ja2V0O24uRXZlbnRUYXJnZXR8fE4obixbYy5wcm90b3R5cGVdKSxuLldlYlNvY2tldD1mdW5jdGlvbih0LG4pe3ZhciB1LHMsbD1hcmd1bWVudHMubGVuZ3RoPjE/bmV3IGModCxuKTpuZXcgYyh0KSxmPWUobCwib25tZXNzYWdlIik7cmV0dXJuIGYmJiExPT09Zi5jb25maWd1cmFibGU/KHU9cihsKSxzPWwsW2ksYSwic2VuZCIsImNsb3NlIl0uZm9yRWFjaChmdW5jdGlvbihlKXt1W2VdPWZ1bmN0aW9uKCl7dmFyIHQ9by5jYWxsKGFyZ3VtZW50cyk7aWYoZT09PWl8fGU9PT1hKXt2YXIgbj10Lmxlbmd0aD4wP3RbMF06dm9pZCAwO2lmKG4pe3ZhciByPVpvbmUuX19zeW1ib2xfXygiT05fUFJPUEVSVFkiK24pO2xbcl09dVtyXX19cmV0dXJuIGxbZV0uYXBwbHkobCx0KX19KSk6dT1sLGoodSxbImNsb3NlIiwiZXJyb3IiLCJtZXNzYWdlIiwib3BlbiJdLHMpLHV9O3ZhciB1PW4uV2ViU29ja2V0O2Zvcih2YXIgcyBpbiBjKXVbc109Y1tzXX0oMCx1KX19dmFyIGZlPXYoInVuYm91bmQiKTtab25lLl9fbG9hZF9wYXRjaCgidXRpbCIsZnVuY3Rpb24oZSx0LG4pe24ucGF0Y2hPblByb3BlcnRpZXM9aixuLnBhdGNoTWV0aG9kPXosbi5iaW5kQXJndW1lbnRzPWt9KSxab25lLl9fbG9hZF9wYXRjaCgidGltZXJzIixmdW5jdGlvbihlKXtLKGUsInNldCIsImNsZWFyIiwiVGltZW91dCIpLEsoZSwic2V0IiwiY2xlYXIiLCJJbnRlcnZhbCIpLEsoZSwic2V0IiwiY2xlYXIiLCJJbW1lZGlhdGUiKX0pLFpvbmUuX19sb2FkX3BhdGNoKCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLGZ1bmN0aW9uKGUpe0soZSwicmVxdWVzdCIsImNhbmNlbCIsIkFuaW1hdGlvbkZyYW1lIiksSyhlLCJtb3pSZXF1ZXN0IiwibW96Q2FuY2VsIiwiQW5pbWF0aW9uRnJhbWUiKSxLKGUsIndlYmtpdFJlcXVlc3QiLCJ3ZWJraXRDYW5jZWwiLCJBbmltYXRpb25GcmFtZSIpfSksWm9uZS5fX2xvYWRfcGF0Y2goImJsb2NraW5nIixmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bImFsZXJ0IiwicHJvbXB0IiwiY29uZmlybSJdLHI9MDtyPG4ubGVuZ3RoO3IrKyl6KGUsbltyXSxmdW5jdGlvbihuLHIsbyl7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7cmV0dXJuIHQuY3VycmVudC5ydW4obixlLGksbyl9fSl9KSxab25lLl9fbG9hZF9wYXRjaCgiRXZlbnRUYXJnZXQiLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10Ll9fc3ltYm9sX18oIkJMQUNLX0xJU1RFRF9FVkVOVFMiKTtlW3JdJiYodFtyXT1lW3JdKSxmdW5jdGlvbihlLHQpeyFmdW5jdGlvbihlLHQpe3ZhciBuPWUuRXZlbnQ7biYmbi5wcm90b3R5cGUmJnQucGF0Y2hNZXRob2Qobi5wcm90b3R5cGUsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7dFtIXT0hMCxlJiZlLmFwcGx5KHQsbil9fSl9KGUsdCl9KGUsbiksZnVuY3Rpb24oZSx0KXt2YXIgbj0iQW5jaG9yLEFyZWEsQXVkaW8sQlIsQmFzZSxCYXNlRm9udCxCb2R5LEJ1dHRvbixDYW52YXMsQ29udGVudCxETGlzdCxEaXJlY3RvcnksRGl2LEVtYmVkLEZpZWxkU2V0LEZvbnQsRm9ybSxGcmFtZSxGcmFtZVNldCxIUixIZWFkLEhlYWRpbmcsSHRtbCxJRnJhbWUsSW1hZ2UsSW5wdXQsS2V5Z2VuLExJLExhYmVsLExlZ2VuZCxMaW5rLE1hcCxNYXJxdWVlLE1lZGlhLE1lbnUsTWV0YSxNZXRlcixNb2QsT0xpc3QsT2JqZWN0LE9wdEdyb3VwLE9wdGlvbixPdXRwdXQsUGFyYWdyYXBoLFByZSxQcm9ncmVzcyxRdW90ZSxTY3JpcHQsU2VsZWN0LFNvdXJjZSxTcGFuLFN0eWxlLFRhYmxlQ2FwdGlvbixUYWJsZUNlbGwsVGFibGVDb2wsVGFibGUsVGFibGVSb3csVGFibGVTZWN0aW9uLFRleHRBcmVhLFRpdGxlLFRyYWNrLFVMaXN0LFVua25vd24sVmlkZW8iLHI9IkFwcGxpY2F0aW9uQ2FjaGUsRXZlbnRTb3VyY2UsRmlsZVJlYWRlcixJbnB1dE1ldGhvZENvbnRleHQsTWVkaWFDb250cm9sbGVyLE1lc3NhZ2VQb3J0LE5vZGUsUGVyZm9ybWFuY2UsU1ZHRWxlbWVudEluc3RhbmNlLFNoYXJlZFdvcmtlcixUZXh0VHJhY2ssVGV4dFRyYWNrQ3VlLFRleHRUcmFja0xpc3QsV2ViS2l0TmFtZWRGbG93LFdpbmRvdyxXb3JrZXIsV29ya2VyR2xvYmFsU2NvcGUsWE1MSHR0cFJlcXVlc3QsWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCxYTUxIdHRwUmVxdWVzdFVwbG9hZCxJREJSZXF1ZXN0LElEQk9wZW5EQlJlcXVlc3QsSURCRGF0YWJhc2UsSURCVHJhbnNhY3Rpb24sSURCQ3Vyc29yLERCSW5kZXgsV2ViU29ja2V0Ii5zcGxpdCgiLCIpLG89W10saT1lLnd0ZixhPW4uc3BsaXQoIiwiKTtpP289YS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIkhUTUwiK2UrIkVsZW1lbnQifSkuY29uY2F0KHIpOmUuRXZlbnRUYXJnZXQ/by5wdXNoKCJFdmVudFRhcmdldCIpOm89cjtmb3IodmFyIGM9ZS5fX1pvbmVfZGlzYWJsZV9JRV9jaGVja3x8ITEsdT1lLl9fWm9uZV9lbmFibGVfY3Jvc3NfY29udGV4dF9jaGVja3x8ITEscD1JKCksaD0iZnVuY3Rpb24gX19CUk9XU0VSVE9PTFNfQ09OU09MRV9TQUZFRlVOQygpIHsgW25hdGl2ZSBjb2RlXSB9Iix2PTA7djx1ZS5sZW5ndGg7disrKXt2YXIgZD1mKygoaz11ZVt2XSkrbCksZz1mKyhrK3MpO0xba109e30sTFtrXVtsXT1kLExba11bc109Z31mb3Iodj0wO3Y8bi5sZW5ndGg7disrKWZvcih2YXIgeT1hW3ZdLF89cVt5XT17fSxtPTA7bTx1ZS5sZW5ndGg7bSsrKXt2YXIgaztfW2s9dWVbbV1dPXkrIi5hZGRFdmVudExpc3RlbmVyOiIra312YXIgYj1bXTtmb3Iodj0wO3Y8by5sZW5ndGg7disrKXt2YXIgVD1lW29bdl1dO2IucHVzaChUJiZULnByb3RvdHlwZSl9TihlLGIse3ZoOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFjJiZwKXtpZih1KXRyeXt2YXIgbztpZigiW29iamVjdCBGdW5jdGlvbldyYXBwZXJdIj09PShvPXQudG9TdHJpbmcoKSl8fG89PWgpcmV0dXJuIGUuYXBwbHkobixyKSwhMX1jYXRjaCh0KXtyZXR1cm4gZS5hcHBseShuLHIpLCExfWVsc2UgaWYoIltvYmplY3QgRnVuY3Rpb25XcmFwcGVyXSI9PT0obz10LnRvU3RyaW5nKCkpfHxvPT1oKXJldHVybiBlLmFwcGx5KG4sciksITF9ZWxzZSBpZih1KXRyeXt0LnRvU3RyaW5nKCl9Y2F0Y2godCl7cmV0dXJuIGUuYXBwbHkobixyKSwhMX1yZXR1cm4hMH19KSx0LnBhdGNoRXZlbnRUYXJnZXQ9Tn0oZSxuKTt2YXIgbz1lLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ7byYmby5wcm90b3R5cGUmJm4ucGF0Y2hFdmVudFRhcmdldChlLFtvLnByb3RvdHlwZV0pLFooIk11dGF0aW9uT2JzZXJ2ZXIiKSxaKCJXZWJLaXRNdXRhdGlvbk9ic2VydmVyIiksWigiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiKSxaKCJGaWxlUmVhZGVyIil9KSxab25lLl9fbG9hZF9wYXRjaCgib25fcHJvcGVydHkiLGZ1bmN0aW9uKHQsbixyKXtsZSgwLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbihlLHQsbil7aWYoVihlLHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhc3NpZ24gdG8gcmVhZCBvbmx5IHByb3BlcnR5ICciK3QrIicgb2YgIitlKTt2YXIgcj1uLmNvbmZpZ3VyYWJsZTtyZXR1cm4icHJvdG90eXBlIiE9PXQmJihuPUcoZSx0LG4pKSxRKGUsdCxuLHIpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4sdFtuXSl9KSxlfSxPYmplY3QuY3JlYXRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIm9iamVjdCIhPXR5cGVvZiB0fHxPYmplY3QuaXNGcm96ZW4odCl8fE9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24obil7dFtuXT1HKGUsbix0W25dKX0pLFkoZSx0KX0sT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcj1mdW5jdGlvbihlLHQpe3ZhciBuPUIoZSx0KTtyZXR1cm4gVihlLHQpJiYobi5jb25maWd1cmFibGU9ITEpLG59LGZ1bmN0aW9uKG4pe2lmKChFfHx4KSYmInJlZ2lzdGVyRWxlbWVudCJpbiB0LmRvY3VtZW50KXt2YXIgcj1kb2N1bWVudC5yZWdpc3RlckVsZW1lbnQsbz1bImNyZWF0ZWRDYWxsYmFjayIsImF0dGFjaGVkQ2FsbGJhY2siLCJkZXRhY2hlZENhbGxiYWNrIiwiYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrIl07ZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIG4mJm4ucHJvdG90eXBlJiZvLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIHIsbyxpLGEsYz0iRG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50OjoiK3QsdT1uLnByb3RvdHlwZTtpZih1Lmhhc093blByb3BlcnR5KHQpKXt2YXIgcz1lKHUsdCk7cyYmcy52YWx1ZT8ocy52YWx1ZT1wKHMudmFsdWUsYyksYT0oaT1zKS5jb25maWd1cmFibGUsUShyPW4ucHJvdG90eXBlLG89dCxpPUcocixvLGkpLGEpKTp1W3RdPXAodVt0XSxjKX1lbHNlIHVbdF0mJih1W3RdPXAodVt0XSxjKSl9KSxyLmNhbGwoZG9jdW1lbnQsdCxuKX0sTShkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQscil9fSgpfSksWm9uZS5fX2xvYWRfcGF0Y2goImNhbnZhcyIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5IVE1MQ2FudmFzRWxlbWVudDt2b2lkIDAhPT10JiZ0LnByb3RvdHlwZSYmdC5wcm90b3R5cGUudG9CbG9iJiZmdW5jdGlvbihlLG4scil7dmFyIG89bnVsbDtmdW5jdGlvbiBpKGUpe3ZhciB0PWUuZGF0YTtyZXR1cm4gdC5hcmdzW3QuY2JJZHhdPWZ1bmN0aW9uKCl7ZS5pbnZva2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvLmFwcGx5KHQudGFyZ2V0LHQuYXJncyksZX1vPXoodC5wcm90b3R5cGUsInRvQmxvYiIsZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7dmFyIHI9ZnVuY3Rpb24oZSx0KXtyZXR1cm57bmFtZToiSFRNTENhbnZhc0VsZW1lbnQudG9CbG9iIix0YXJnZXQ6ZSxjYklkeDowLGFyZ3M6dH19KHQsbik7cmV0dXJuIHIuY2JJZHg+PTAmJiJmdW5jdGlvbiI9PXR5cGVvZiBuW3IuY2JJZHhdP2goci5uYW1lLG5bci5jYklkeF0scixpLG51bGwpOmUuYXBwbHkodCxuKX19KX0oKX0pLFpvbmUuX19sb2FkX3BhdGNoKCJYSFIiLGZ1bmN0aW9uKGUsdCl7IWZ1bmN0aW9uKHQpe3ZhciBzPVhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSxsPXNbY10sZj1zW3VdO2lmKCFsKXt2YXIgcD1lLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ7aWYocCl7dmFyIHY9cC5wcm90b3R5cGU7bD12W2NdLGY9dlt1XX19dmFyIGQ9InJlYWR5c3RhdGVjaGFuZ2UiLGc9InNjaGVkdWxlZCI7ZnVuY3Rpb24geShlKXtYTUxIdHRwUmVxdWVzdFtpXT0hMTt2YXIgdD1lLmRhdGEscj10LnRhcmdldCxhPXJbb107bHx8KGw9cltjXSxmPXJbdV0pLGEmJmYuY2FsbChyLGQsYSk7dmFyIHM9cltvXT1mdW5jdGlvbigpe3IucmVhZHlTdGF0ZT09PXIuRE9ORSYmIXQuYWJvcnRlZCYmWE1MSHR0cFJlcXVlc3RbaV0mJmUuc3RhdGU9PT1nJiZlLmludm9rZSgpfTtyZXR1cm4gbC5jYWxsKHIsZCxzKSxyW25dfHwocltuXT1lKSxiLmFwcGx5KHIsdC5hcmdzKSxYTUxIdHRwUmVxdWVzdFtpXT0hMCxlfWZ1bmN0aW9uIF8oKXt9ZnVuY3Rpb24gbShlKXt2YXIgdD1lLmRhdGE7cmV0dXJuIHQuYWJvcnRlZD0hMCxULmFwcGx5KHQudGFyZ2V0LHQuYXJncyl9dmFyIGs9eihzLCJvcGVuIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiBlW3JdPTA9PXRbMl0sZVthXT10WzFdLGsuYXBwbHkoZSx0KX19KSxiPXoocywic2VuZCIsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVtyXT9iLmFwcGx5KGUsdCk6aCgiWE1MSHR0cFJlcXVlc3Quc2VuZCIsXyx7dGFyZ2V0OmUsdXJsOmVbYV0saXNQZXJpb2RpYzohMSxkZWxheTpudWxsLGFyZ3M6dCxhYm9ydGVkOiExfSx5LG0pfX0pLFQ9eihzLCJhYm9ydCIsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZVtuXTtpZih0JiYic3RyaW5nIj09dHlwZW9mIHQudHlwZSl7aWYobnVsbD09dC5jYW5jZWxGbnx8dC5kYXRhJiZ0LmRhdGEuYWJvcnRlZClyZXR1cm47dC56b25lLmNhbmNlbFRhc2sodCl9fX0pfSgpO3ZhciBuPXYoInhoclRhc2siKSxyPXYoInhoclN5bmMiKSxvPXYoInhockxpc3RlbmVyIiksaT12KCJ4aHJTY2hlZHVsZWQiKSxhPXYoInhoclVSTCIpfSksWm9uZS5fX2xvYWRfcGF0Y2goImdlb2xvY2F0aW9uIixmdW5jdGlvbih0KXt0Lm5hdmlnYXRvciYmdC5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24mJmZ1bmN0aW9uKHQsbil7Zm9yKHZhciByPXQuY29uc3RydWN0b3IubmFtZSxvPWZ1bmN0aW9uKG8pe3ZhciBpPW5bb10sYT10W2ldO2lmKGEpe2lmKCFiKGUodCxpKSkpcmV0dXJuImNvbnRpbnVlIjt0W2ldPWZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodGhpcyxrKGFyZ3VtZW50cyxyKyIuIitpKSl9O3JldHVybiBNKHQsZSksdH0oYSl9fSxpPTA7aTxuLmxlbmd0aDtpKyspbyhpKX0odC5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24sWyJnZXRDdXJyZW50UG9zaXRpb24iLCJ3YXRjaFBvc2l0aW9uIl0pfSksWm9uZS5fX2xvYWRfcGF0Y2goIlByb21pc2VSZWplY3Rpb25FdmVudCIsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbihuKXtXKGUsdCkuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgbz1lLlByb21pc2VSZWplY3Rpb25FdmVudDtpZihvKXt2YXIgaT1uZXcgbyh0LHtwcm9taXNlOm4ucHJvbWlzZSxyZWFzb246bi5yZWplY3Rpb259KTtyLmludm9rZShpKX19KX19ZS5Qcm9taXNlUmVqZWN0aW9uRXZlbnQmJih0W3YoInVuaGFuZGxlZFByb21pc2VSZWplY3Rpb25IYW5kbGVyIildPW4oInVuaGFuZGxlZHJlamVjdGlvbiIpLHRbdigicmVqZWN0aW9uSGFuZGxlZEhhbmRsZXIiKV09bigicmVqZWN0aW9uaGFuZGxlZCIpKX0pfSgpfSwiMVRzQSI6ZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm57dmFsdWU6dCxkb25lOiEhZX19fSwiMk9pRiI6ZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgVHlwZUVycm9yKGUrIiBpcyBub3QgYSBmdW5jdGlvbiEiKTtyZXR1cm4gZX19LDM6ZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKCJoTi9nIil9LCIzTHlqIjpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiS3JvSiIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciBvIGluIHQpcihlLG8sdFtvXSxuKTtyZXR1cm4gZX19LCI0NVR2IjpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiTjZjSiIpLG89bigieTN3OSIpLGk9bigiT1AzWSIpLGE9ci5oYXMsYz1yLmdldCx1PXIua2V5LHM9ZnVuY3Rpb24oZSx0LG4pe2lmKGEoZSx0LG4pKXJldHVybiBjKGUsdCxuKTt2YXIgcj1pKHQpO3JldHVybiBudWxsIT09cj9zKGUscixuKTp2b2lkIDB9O3IuZXhwKHtnZXRNZXRhZGF0YTpmdW5jdGlvbihlLHQpe3JldHVybiBzKGUsbyh0KSxhcmd1bWVudHMubGVuZ3RoPDM/dm9pZCAwOnUoYXJndW1lbnRzWzJdKSl9fSl9LCI0OUQ0IjpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiTjZjSiIpLG89bigieTN3OSIpLGk9ci5rZXksYT1yLnNldDtyLmV4cCh7ZGVmaW5lTWV0YWRhdGE6ZnVuY3Rpb24oZSx0LG4scil7YShlLHQsbyhuKSxpKHIpKX19KX0sIjRMaUQiOmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigiZHlaWCIpLG89bigiWEtGVSIpLGk9bigiS3JvSiIpLGE9bigiM0x5aiIpLGM9bigiWjZ2RiIpLHU9bigiU2xrWSIpLHM9bigiOWdYNyIpLGw9bigiMC9SNCIpLGY9bigiZWVWcSIpLHA9bigiWE1WaCIpLGg9bigiZnlEcSIpLHY9bigiWGJ6aSIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixkLGcseSl7dmFyIF89cltlXSxtPV8saz1nPyJzZXQiOiJhZGQiLGI9bSYmbS5wcm90b3R5cGUsVD17fSx3PWZ1bmN0aW9uKGUpe3ZhciB0PWJbZV07aShiLGUsImRlbGV0ZSI9PWU/ZnVuY3Rpb24oZSl7cmV0dXJuISh5JiYhbChlKSkmJnQuY2FsbCh0aGlzLDA9PT1lPzA6ZSl9OiJoYXMiPT1lP2Z1bmN0aW9uKGUpe3JldHVybiEoeSYmIWwoZSkpJiZ0LmNhbGwodGhpcywwPT09ZT8wOmUpfToiZ2V0Ij09ZT9mdW5jdGlvbihlKXtyZXR1cm4geSYmIWwoZSk/dm9pZCAwOnQuY2FsbCh0aGlzLDA9PT1lPzA6ZSl9OiJhZGQiPT1lP2Z1bmN0aW9uKGUpe3JldHVybiB0LmNhbGwodGhpcywwPT09ZT8wOmUpLHRoaXN9OmZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuY2FsbCh0aGlzLDA9PT1lPzA6ZSxuKSx0aGlzfSl9O2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBtJiYoeXx8Yi5mb3JFYWNoJiYhZihmdW5jdGlvbigpeyhuZXcgbSkuZW50cmllcygpLm5leHQoKX0pKSl7dmFyIEU9bmV3IG0seD1FW2tdKHk/e306LTAsMSkhPUUsTz1mKGZ1bmN0aW9uKCl7RS5oYXMoMSl9KSxTPXAoZnVuY3Rpb24oZSl7bmV3IG0oZSl9KSxEPSF5JiZmKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPW5ldyBtLHQ9NTt0LS07KWVba10odCx0KTtyZXR1cm4hZS5oYXMoLTApfSk7U3x8KChtPXQoZnVuY3Rpb24odCxuKXtzKHQsbSxlKTt2YXIgcj12KG5ldyBfLHQsbSk7cmV0dXJuIHZvaWQgMCE9biYmdShuLGcscltrXSxyKSxyfSkpLnByb3RvdHlwZT1iLGIuY29uc3RydWN0b3I9bSksKE98fEQpJiYodygiZGVsZXRlIiksdygiaGFzIiksZyYmdygiZ2V0IikpLChEfHx4KSYmdyhrKSx5JiZiLmNsZWFyJiZkZWxldGUgYi5jbGVhcn1lbHNlIG09ZC5nZXRDb25zdHJ1Y3Rvcih0LGUsZyxrKSxhKG0ucHJvdG90eXBlLG4pLGMuTkVFRD0hMDtyZXR1cm4gaChtLGUpLFRbZV09bSxvKG8uRytvLlcrby5GKihtIT1fKSxUKSx5fHxkLnNldFN0cm9uZyhtLGUsZyksbX19LCI0UjR1IjpmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz0iY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mIi5zcGxpdCgiLCIpfSwiNkZNTyI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oIjAvUjQiKSxvPW4oIkVXbUMiKSxpPW4oIksweFUiKSgic3BlY2llcyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gbyhlKSYmKCJmdW5jdGlvbiIhPXR5cGVvZih0PWUuY29uc3RydWN0b3IpfHx0IT09QXJyYXkmJiFvKHQucHJvdG90eXBlKXx8KHQ9dm9pZCAwKSxyKHQpJiZudWxsPT09KHQ9dFtpXSkmJih0PXZvaWQgMCkpLHZvaWQgMD09PXQ/QXJyYXk6dH19LCI3RGxoIjpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiTjZjSiIpLG89bigieTN3OSIpLGk9ci5oYXMsYT1yLmtleTtyLmV4cCh7aGFzT3duTWV0YWRhdGE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaShlLG8odCksYXJndW1lbnRzLmxlbmd0aDwzP3ZvaWQgMDphKGFyZ3VtZW50c1syXSkpfX0pfSwiOUFBbiI6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCJ3bXZHIiksbz1uKCJzNXFZIik7ZS5leHBvcnRzPW4oIjRMaUQiKSgiTWFwIixmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzLGFyZ3VtZW50cy5sZW5ndGg+MD9hcmd1bWVudHNbMF06dm9pZCAwKX19LHtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ci5nZXRFbnRyeShvKHRoaXMsIk1hcCIpLGUpO3JldHVybiB0JiZ0LnZ9LHNldDpmdW5jdGlvbihlLHQpe3JldHVybiByLmRlZihvKHRoaXMsIk1hcCIpLDA9PT1lPzA6ZSx0KX19LHIsITApfSwiOWdYNyI6ZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scil7aWYoIShlIGluc3RhbmNlb2YgdCl8fHZvaWQgMCE9PXImJnIgaW4gZSl0aHJvdyBUeXBlRXJyb3IobisiOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEiKTtyZXR1cm4gZX19LEFmbno6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCJMUUFjIiksbz1uKCJYS0ZVIiksaT1uKCJLcm9KIiksYT1uKCJNdWtiIiksYz1uKCJoUElRIiksdT1uKCJRYURiIikscz1uKCJmeURxIiksbD1uKCJPUDNZIiksZj1uKCJLMHhVIikoIml0ZXJhdG9yIikscD0hKFtdLmtleXMmJiJuZXh0ImluW10ua2V5cygpKSxoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbix2LGQsZyx5KXt1KG4sdCx2KTt2YXIgXyxtLGssYj1mdW5jdGlvbihlKXtpZighcCYmZSBpbiB4KXJldHVybiB4W2VdO3N3aXRjaChlKXtjYXNlImtleXMiOmNhc2UidmFsdWVzIjpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyxlKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMsZSl9fSxUPXQrIiBJdGVyYXRvciIsdz0idmFsdWVzIj09ZCxFPSExLHg9ZS5wcm90b3R5cGUsTz14W2ZdfHx4WyJAQGl0ZXJhdG9yIl18fGQmJnhbZF0sUz1PfHxiKGQpLEQ9ZD93P2IoImVudHJpZXMiKTpTOnZvaWQgMCxqPSJBcnJheSI9PXQmJnguZW50cmllc3x8TztpZihqJiYoaz1sKGouY2FsbChuZXcgZSkpKSE9PU9iamVjdC5wcm90b3R5cGUmJmsubmV4dCYmKHMoayxULCEwKSxyfHwiZnVuY3Rpb24iPT10eXBlb2Yga1tmXXx8YShrLGYsaCkpLHcmJk8mJiJ2YWx1ZXMiIT09Ty5uYW1lJiYoRT0hMCxTPWZ1bmN0aW9uKCl7cmV0dXJuIE8uY2FsbCh0aGlzKX0pLHImJiF5fHwhcCYmIUUmJnhbZl18fGEoeCxmLFMpLGNbdF09UyxjW1RdPWgsZClpZihfPXt2YWx1ZXM6dz9TOmIoInZhbHVlcyIpLGtleXM6Zz9TOmIoImtleXMiKSxlbnRyaWVzOkR9LHkpZm9yKG0gaW4gXyltIGluIHh8fGkoeCxtLF9bbV0pO2Vsc2UgbyhvLlArby5GKihwfHxFKSx0LF8pO3JldHVybiBffX0sQnFmVjpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiTjZjSiIpLG89bigieTN3OSIpLGk9ci5nZXQsYT1yLmtleTtyLmV4cCh7Z2V0T3duTWV0YWRhdGE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaShlLG8odCksYXJndW1lbnRzLmxlbmd0aDwzP3ZvaWQgMDphKGFyZ3VtZW50c1syXSkpfX0pfSxDa2tUOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJtMFBwIiksbz1uKCJZbXF2IiksaT1uKCJTL2ovIiksYT1uKCJuZThpIiksYz1uKCJ6UndvIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49MT09ZSx1PTI9PWUscz0zPT1lLGw9ND09ZSxmPTY9PWUscD01PT1lfHxmLGg9dHx8YztyZXR1cm4gZnVuY3Rpb24odCxjLHYpe2Zvcih2YXIgZCxnLHk9aSh0KSxfPW8oeSksbT1yKGMsdiwzKSxrPWEoXy5sZW5ndGgpLGI9MCxUPW4/aCh0LGspOnU/aCh0LDApOnZvaWQgMDtrPmI7YisrKWlmKChwfHxiIGluIF8pJiYoZz1tKGQ9X1tiXSxiLHkpLGUpKWlmKG4pVFtiXT1nO2Vsc2UgaWYoZylzd2l0Y2goZSl7Y2FzZSAzOnJldHVybiEwO2Nhc2UgNTpyZXR1cm4gZDtjYXNlIDY6cmV0dXJuIGI7Y2FzZSAyOlQucHVzaChkKX1lbHNlIGlmKGwpcmV0dXJuITE7cmV0dXJuIGY/LTE6c3x8bD9sOlR9fX0sRFZnQTpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiemhBYiIpLG89bigiNFI0dSIpO2UuZXhwb3J0cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSxvKX19LEVLMEU6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPW4oIkNra1QiKSgwKSxpPW4oIktyb0oiKSxhPW4oIlo2dkYiKSxjPW4oImN6TksiKSx1PW4oIlpENjciKSxzPW4oIjAvUjQiKSxsPW4oImVlVnEiKSxmPW4oInM1cVkiKSxwPWEuZ2V0V2VhayxoPU9iamVjdC5pc0V4dGVuc2libGUsdj11LnVmc3RvcmUsZD17fSxnPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKHRoaXMsYXJndW1lbnRzLmxlbmd0aD4wP2FyZ3VtZW50c1swXTp2b2lkIDApfX0seT17Z2V0OmZ1bmN0aW9uKGUpe2lmKHMoZSkpe3ZhciB0PXAoZSk7cmV0dXJuITA9PT10P3YoZih0aGlzLCJXZWFrTWFwIikpLmdldChlKTp0P3RbdGhpcy5faV06dm9pZCAwfX0sc2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHUuZGVmKGYodGhpcywiV2Vha01hcCIpLGUsdCl9fSxfPWUuZXhwb3J0cz1uKCI0TGlEIikoIldlYWtNYXAiLGcseSx1LCEwLCEwKTtsKGZ1bmN0aW9uKCl7cmV0dXJuIDchPShuZXcgXykuc2V0KChPYmplY3QuZnJlZXplfHxPYmplY3QpKGQpLDcpLmdldChkKX0pJiYoYygocj11LmdldENvbnN0cnVjdG9yKGcsIldlYWtNYXAiKSkucHJvdG90eXBlLHkpLGEuTkVFRD0hMCxvKFsiZGVsZXRlIiwiaGFzIiwiZ2V0Iiwic2V0Il0sZnVuY3Rpb24oZSl7dmFyIHQ9Xy5wcm90b3R5cGUsbj10W2VdO2kodCxlLGZ1bmN0aW9uKHQsbyl7aWYocyh0KSYmIWgodCkpe3RoaXMuX2Z8fCh0aGlzLl9mPW5ldyByKTt2YXIgaT10aGlzLl9mW2VdKHQsbyk7cmV0dXJuInNldCI9PWU/dGhpczppfXJldHVybiBuLmNhbGwodGhpcyx0LG8pfSl9KSl9LEVXbUM6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oIkxaV3QiKTtlLmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIkFycmF5Ij09cihlKX19LEVlbUg6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oIlVxY0YiKSxvPW4oIlJqRC8iKSxpPW4oImFDRmoiKSxhPW4oImFwbVQiKSxjPW4oImFhZ3giKSx1PW4oInhwcWwiKSxzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7dC5mPW4oIm5oNGciKT9zOmZ1bmN0aW9uKGUsdCl7aWYoZT1pKGUpLHQ9YSh0LCEwKSx1KXRyeXtyZXR1cm4gcyhlLHQpfWNhdGNoKGUpe31pZihjKGUsdCkpcmV0dXJuIG8oIXIuZi5jYWxsKGUsdCksZVt0XSl9fSxGSlc1OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJoc3dhIiksbz1uKCJ5M3c5IiksaT1uKCJEVmdBIik7ZS5leHBvcnRzPW4oIm5oNGciKT9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbihlLHQpe28oZSk7Zm9yKHZhciBuLGE9aSh0KSxjPWEubGVuZ3RoLHU9MDtjPnU7KXIuZihlLG49YVt1KytdLHRbbl0pO3JldHVybiBlfX0sRlpjcTpmdW5jdGlvbihlLHQsbil7bigiNDlENCIpLG4oInpxK0MiKSxuKCI0NVR2IiksbigidUF0ZCIpLG4oIkJxZlYiKSxuKCJmTi8zIiksbigiaVcrUyIpLG4oIjdEbGgiKSxuKCJPcHhiIiksZS5leHBvcnRzPW4oImczZzUiKS5SZWZsZWN0fSxINmhmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJ5M3c5Iik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLG8pe3RyeXtyZXR1cm4gbz90KHIobilbMF0sblsxXSk6dChuKX1jYXRjaCh0KXt2YXIgaT1lLnJldHVybjt0aHJvdyB2b2lkIDAhPT1pJiZyKGkuY2FsbChlKSksdH19fSwiSThhKyI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oIkxaV3QiKSxvPW4oIksweFUiKSgidG9TdHJpbmdUYWciKSxpPSJBcmd1bWVudHMiPT1yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0LG4sYTtyZXR1cm4gdm9pZCAwPT09ZT8iVW5kZWZpbmVkIjpudWxsPT09ZT8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPWZ1bmN0aW9uKGUsdCl7dHJ5e3JldHVybiBlW3RdfWNhdGNoKGUpe319KHQ9T2JqZWN0KGUpLG8pKT9uOmk/cih0KToiT2JqZWN0Ij09KGE9cih0KSkmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNhbGxlZT8iQXJndW1lbnRzIjphfX0sSXc3MTpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiMC9SNCIpLG89bigiZHlaWCIpLmRvY3VtZW50LGk9cihvKSYmcihvLmNyZWF0ZUVsZW1lbnQpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gaT9vLmNyZWF0ZUVsZW1lbnQoZSk6e319fSwiSis2ZSI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oIkk4YSsiKSxvPW4oIksweFUiKSgiaXRlcmF0b3IiKSxpPW4oImhQSVEiKTtlLmV4cG9ydHM9bigiZzNnNSIpLmdldEl0ZXJhdG9yTWV0aG9kPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9ZSlyZXR1cm4gZVtvXXx8ZVsiQEBpdGVyYXRvciJdfHxpW3IoZSldfX0sSmlFYTpmdW5jdGlvbihlLHQpe3QuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxLMHhVOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJWVGVyIikoIndrcyIpLG89bigieWxxcyIpLGk9bigiZHlaWCIpLlN5bWJvbCxhPSJmdW5jdGlvbiI9PXR5cGVvZiBpOyhlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHJbZV18fChyW2VdPWEmJmlbZV18fChhP2k6bykoIlN5bWJvbC4iK2UpKX0pLnN0b3JlPXJ9LEtyb0o6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oImR5WlgiKSxvPW4oIk11a2IiKSxpPW4oImFhZ3giKSxhPW4oInlscXMiKSgic3JjIiksYz1GdW5jdGlvbi50b1N0cmluZyx1PSgiIitjKS5zcGxpdCgidG9TdHJpbmciKTtuKCJnM2c1IikuaW5zcGVjdFNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYy5jYWxsKGUpfSwoZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLGMpe3ZhciBzPSJmdW5jdGlvbiI9PXR5cGVvZiBuO3MmJihpKG4sIm5hbWUiKXx8byhuLCJuYW1lIix0KSksZVt0XSE9PW4mJihzJiYoaShuLGEpfHxvKG4sYSxlW3RdPyIiK2VbdF06dS5qb2luKFN0cmluZyh0KSkpKSxlPT09cj9lW3RdPW46Yz9lW3RdP2VbdF09bjpvKGUsdCxuKTooZGVsZXRlIGVbdF0sbyhlLHQsbikpKX0pKEZ1bmN0aW9uLnByb3RvdHlwZSwidG9TdHJpbmciLGZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMmJnRoaXNbYV18fGMuY2FsbCh0aGlzKX0pfSxLdXRoOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJ5M3c5Iiksbz1uKCJGSlc1IiksaT1uKCI0UjR1IiksYT1uKCJZVHZBIikoIklFX1BST1RPIiksYz1mdW5jdGlvbigpe30sdT1mdW5jdGlvbigpe3ZhciBlLHQ9bigiSXc3MSIpKCJpZnJhbWUiKSxyPWkubGVuZ3RoO2Zvcih0LnN0eWxlLmRpc3BsYXk9Im5vbmUiLG4oIityTHYiKS5hcHBlbmRDaGlsZCh0KSx0LnNyYz0iamF2YXNjcmlwdDoiLChlPXQuY29udGVudFdpbmRvdy5kb2N1bWVudCkub3BlbigpLGUud3JpdGUoIjxzY3JpcHQ+ZG9jdW1lbnQuRj1PYmplY3Q8XC9zY3JpcHQ+IiksZS5jbG9zZSgpLHU9ZS5GO3ItLTspZGVsZXRlIHUucHJvdG90eXBlW2lbcl1dO3JldHVybiB1KCl9O2UuZXhwb3J0cz1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiBudWxsIT09ZT8oYy5wcm90b3R5cGU9cihlKSxuPW5ldyBjLGMucHJvdG90eXBlPW51bGwsblthXT1lKTpuPXUoKSx2b2lkIDA9PT10P246byhuLHQpfX0sTFFBYzpmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz0hMX0sTFpXdDpmdW5jdGlvbihlLHQpe3ZhciBuPXt9LnRvU3RyaW5nO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbi5jYWxsKGUpLnNsaWNlKDgsLTEpfX0sTTZRajpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiaFBJUSIpLG89bigiSzB4VSIpKCJpdGVyYXRvciIpLGk9QXJyYXkucHJvdG90eXBlO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09ZSYmKHIuQXJyYXk9PT1lfHxpW29dPT09ZSl9fSxNdWtiOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJoc3dhIiksbz1uKCJSakQvIik7ZS5leHBvcnRzPW4oIm5oNGciKT9mdW5jdGlvbihlLHQsbil7cmV0dXJuIHIuZihlLHQsbygxLG4pKX06ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlW3RdPW4sZX19LE42Y0o6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oIjlBQW4iKSxvPW4oIlhLRlUiKSxpPW4oIlZUZXIiKSgibWV0YWRhdGEiKSxhPWkuc3RvcmV8fChpLnN0b3JlPW5ldyhuKCJFSzBFIikpKSxjPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1hLmdldChlKTtpZighbyl7aWYoIW4pcmV0dXJuO2Euc2V0KGUsbz1uZXcgcil9dmFyIGk9by5nZXQodCk7aWYoIWkpe2lmKCFuKXJldHVybjtvLnNldCh0LGk9bmV3IHIpfXJldHVybiBpfTtlLmV4cG9ydHM9e3N0b3JlOmEsbWFwOmMsaGFzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1jKHQsbiwhMSk7cmV0dXJuIHZvaWQgMCE9PXImJnIuaGFzKGUpfSxnZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWModCxuLCExKTtyZXR1cm4gdm9pZCAwPT09cj92b2lkIDA6ci5nZXQoZSl9LHNldDpmdW5jdGlvbihlLHQsbixyKXtjKG4sciwhMCkuc2V0KGUsdCl9LGtleXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1jKGUsdCwhMSkscj1bXTtyZXR1cm4gbiYmbi5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7ci5wdXNoKHQpfSkscn0sa2V5OmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lfHwic3ltYm9sIj09dHlwZW9mIGU/ZTpTdHJpbmcoZSl9LGV4cDpmdW5jdGlvbihlKXtvKG8uUywiUmVmbGVjdCIsZSl9fX0sT1AzWTpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiYWFneCIpLG89bigiUy9qLyIpLGk9bigiWVR2QSIpKCJJRV9QUk9UTyIpLGE9T2JqZWN0LnByb3RvdHlwZTtlLmV4cG9ydHM9T2JqZWN0LmdldFByb3RvdHlwZU9mfHxmdW5jdGlvbihlKXtyZXR1cm4gZT1vKGUpLHIoZSxpKT9lW2ldOiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yJiZlIGluc3RhbmNlb2YgZS5jb25zdHJ1Y3Rvcj9lLmNvbnN0cnVjdG9yLnByb3RvdHlwZTplIGluc3RhbmNlb2YgT2JqZWN0P2E6bnVsbH19LE9weGI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oIk42Y0oiKSxvPW4oInkzdzkiKSxpPW4oIjJPaUYiKSxhPXIua2V5LGM9ci5zZXQ7ci5leHAoe21ldGFkYXRhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4scil7YyhlLHQsKHZvaWQgMCE9PXI/bzppKShuKSxhKHIpKX19fSl9LFEzbmU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oIlNsa1kiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXTtyZXR1cm4gcihlLCExLG4ucHVzaCxuLHQpLG59fSxRYURiOmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigiS3V0aCIpLG89bigiUmpELyIpLGk9bigiZnlEcSIpLGE9e307bigiTXVrYiIpKGEsbigiSzB4VSIpKCJpdGVyYXRvciIpLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe2UucHJvdG90eXBlPXIoYSx7bmV4dDpvKDEsbil9KSxpKGUsdCsiIEl0ZXJhdG9yIil9fSxSWWk3OmZ1bmN0aW9uKGUsdCl7dmFyIG49TWF0aC5jZWlsLHI9TWF0aC5mbG9vcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGlzTmFOKGU9K2UpPzA6KGU+MD9yOm4pKGUpfX0sIlJqRC8iOmZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJue2VudW1lcmFibGU6ISgxJmUpLGNvbmZpZ3VyYWJsZTohKDImZSksd3JpdGFibGU6ISg0JmUpLHZhbHVlOnR9fX0sIlMvai8iOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJ2aFBVIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QocihlKSl9fSxTbGtZOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJtMFBwIiksbz1uKCJINmhmIiksaT1uKCJNNlFqIiksYT1uKCJ5M3c5IiksYz1uKCJuZThpIiksdT1uKCJKKzZlIikscz17fSxsPXt9Oyh0PWUuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixmLHApe3ZhciBoLHYsZCxnLHk9cD9mdW5jdGlvbigpe3JldHVybiBlfTp1KGUpLF89cihuLGYsdD8yOjEpLG09MDtpZigiZnVuY3Rpb24iIT10eXBlb2YgeSl0aHJvdyBUeXBlRXJyb3IoZSsiIGlzIG5vdCBpdGVyYWJsZSEiKTtpZihpKHkpKXtmb3IoaD1jKGUubGVuZ3RoKTtoPm07bSsrKWlmKChnPXQ/XyhhKHY9ZVttXSlbMF0sdlsxXSk6XyhlW21dKSk9PT1zfHxnPT09bClyZXR1cm4gZ31lbHNlIGZvcihkPXkuY2FsbChlKTshKHY9ZC5uZXh0KCkpLmRvbmU7KWlmKChnPW8oZCxfLHYudmFsdWUsdCkpPT09c3x8Zz09PWwpcmV0dXJuIGd9KS5CUkVBSz1zLHQuUkVUVVJOPWx9LFQzOWI6ZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCJ3bXZHIiksbz1uKCJzNXFZIik7ZS5leHBvcnRzPW4oIjRMaUQiKSgiU2V0IixmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzLGFyZ3VtZW50cy5sZW5ndGg+MD9hcmd1bWVudHNbMF06dm9pZCAwKX19LHthZGQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHIuZGVmKG8odGhpcywiU2V0IiksZT0wPT09ZT8wOmUsZSl9fSxyKX0sVXFjRjpmdW5jdGlvbihlLHQpe3QuZj17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZX0sVlRlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiZzNnNSIpLG89bigiZHlaWCIpLGk9b1siX19jb3JlLWpzX3NoYXJlZF9fIl18fChvWyJfX2NvcmUtanNfc2hhcmVkX18iXT17fSk7KGUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBpW2VdfHwoaVtlXT12b2lkIDAhPT10P3Q6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjpyLnZlcnNpb24sbW9kZTpuKCJMUUFjIik/InB1cmUiOiJnbG9iYWwiLGNvcHlyaWdodDoiXHhhOSAyMDE4IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIn0pfSxYS0ZVOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJkeVpYIiksbz1uKCJnM2c1IiksaT1uKCJNdWtiIiksYT1uKCJLcm9KIiksYz1uKCJtMFBwIiksdT1mdW5jdGlvbihlLHQsbil7dmFyIHMsbCxmLHAsaD1lJnUuRix2PWUmdS5HLGQ9ZSZ1LlAsZz1lJnUuQix5PXY/cjplJnUuUz9yW3RdfHwoclt0XT17fSk6KHJbdF18fHt9KS5wcm90b3R5cGUsXz12P286b1t0XXx8KG9bdF09e30pLG09Xy5wcm90b3R5cGV8fChfLnByb3RvdHlwZT17fSk7Zm9yKHMgaW4gdiYmKG49dCksbilmPSgobD0haCYmeSYmdm9pZCAwIT09eVtzXSk/eTpuKVtzXSxwPWcmJmw/YyhmLHIpOmQmJiJmdW5jdGlvbiI9PXR5cGVvZiBmP2MoRnVuY3Rpb24uY2FsbCxmKTpmLHkmJmEoeSxzLGYsZSZ1LlUpLF9bc10hPWYmJmkoXyxzLHApLGQmJm1bc10hPWYmJihtW3NdPWYpfTtyLmNvcmU9byx1LkY9MSx1Lkc9Mix1LlM9NCx1LlA9OCx1LkI9MTYsdS5XPTMyLHUuVT02NCx1LlI9MTI4LGUuZXhwb3J0cz11fSxYTVZoOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJLMHhVIikoIml0ZXJhdG9yIiksbz0hMTt0cnl7dmFyIGk9WzddW3JdKCk7aS5yZXR1cm49ZnVuY3Rpb24oKXtvPSEwfSxBcnJheS5mcm9tKGksZnVuY3Rpb24oKXt0aHJvdyAyfSl9Y2F0Y2goZSl7fWUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKCF0JiYhbylyZXR1cm4hMTt2YXIgbj0hMTt0cnl7dmFyIGk9WzddLGE9aVtyXSgpO2EubmV4dD1mdW5jdGlvbigpe3JldHVybntkb25lOm49ITB9fSxpW3JdPWZ1bmN0aW9uKCl7cmV0dXJuIGF9LGUoaSl9Y2F0Y2goZSl7fXJldHVybiBufX0sWGJ6aTpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiMC9SNCIpLG89bigiaTVkYyIpLnNldDtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpLGE9dC5jb25zdHJ1Y3RvcjtyZXR1cm4gYSE9PW4mJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoaT1hLnByb3RvdHlwZSkhPT1uLnByb3RvdHlwZSYmcihpKSYmbyYmbyhlLGkpLGV9fSxZVHZBOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJWVGVyIikoImtleXMiKSxvPW4oInlscXMiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHJbZV18fChyW2VdPW8oZSkpfX0sWW1xdjpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiTFpXdCIpO2UuZXhwb3J0cz1PYmplY3QoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKT9PYmplY3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIlN0cmluZyI9PXIoZSk/ZS5zcGxpdCgiIik6T2JqZWN0KGUpfX0sWjZ2RjpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigieWxxcyIpKCJtZXRhIiksbz1uKCIwL1I0IiksaT1uKCJhYWd4IiksYT1uKCJoc3dhIikuZixjPTAsdT1PYmplY3QuaXNFeHRlbnNpYmxlfHxmdW5jdGlvbigpe3JldHVybiEwfSxzPSFuKCJlZVZxIikoZnVuY3Rpb24oKXtyZXR1cm4gdShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKX0pLGw9ZnVuY3Rpb24oZSl7YShlLHIse3ZhbHVlOntpOiJPIisgKytjLHc6e319fSl9LGY9ZS5leHBvcnRzPXtLRVk6cixORUVEOiExLGZhc3RLZXk6ZnVuY3Rpb24oZSx0KXtpZighbyhlKSlyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGU/ZTooInN0cmluZyI9PXR5cGVvZiBlPyJTIjoiUCIpK2U7aWYoIWkoZSxyKSl7aWYoIXUoZSkpcmV0dXJuIkYiO2lmKCF0KXJldHVybiJFIjtsKGUpfXJldHVybiBlW3JdLml9LGdldFdlYWs6ZnVuY3Rpb24oZSx0KXtpZighaShlLHIpKXtpZighdShlKSlyZXR1cm4hMDtpZighdClyZXR1cm4hMTtsKGUpfXJldHVybiBlW3JdLnd9LG9uRnJlZXplOmZ1bmN0aW9uKGUpe3JldHVybiBzJiZmLk5FRUQmJnUoZSkmJiFpKGUscikmJmwoZSksZX19fSxaRDY3OmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigiM0x5aiIpLG89bigiWjZ2RiIpLmdldFdlYWssaT1uKCJ5M3c5IiksYT1uKCIwL1I0IiksYz1uKCI5Z1g3IiksdT1uKCJTbGtZIikscz1uKCJDa2tUIiksbD1uKCJhYWd4IiksZj1uKCJzNXFZIikscD1zKDUpLGg9cyg2KSx2PTAsZD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fbHx8KGUuX2w9bmV3IGcpfSxnPWZ1bmN0aW9uKCl7dGhpcy5hPVtdfSx5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHAoZS5hLGZ1bmN0aW9uKGUpe3JldHVybiBlWzBdPT09dH0pfTtnLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXkodGhpcyxlKTtpZih0KXJldHVybiB0WzFdfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuISF5KHRoaXMsZSl9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuPXkodGhpcyxlKTtuP25bMV09dDp0aGlzLmEucHVzaChbZSx0XSl9LGRlbGV0ZTpmdW5jdGlvbihlKXt2YXIgdD1oKHRoaXMuYSxmdW5jdGlvbih0KXtyZXR1cm4gdFswXT09PWV9KTtyZXR1cm5+dCYmdGhpcy5hLnNwbGljZSh0LDEpLCEhfnR9fSxlLmV4cG9ydHM9e2dldENvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBzPWUoZnVuY3Rpb24oZSxyKXtjKGUscyx0LCJfaSIpLGUuX3Q9dCxlLl9pPXYrKyxlLl9sPXZvaWQgMCx2b2lkIDAhPXImJnUocixuLGVbaV0sZSl9KTtyZXR1cm4gcihzLnByb3RvdHlwZSx7ZGVsZXRlOmZ1bmN0aW9uKGUpe2lmKCFhKGUpKXJldHVybiExO3ZhciBuPW8oZSk7cmV0dXJuITA9PT1uP2QoZih0aGlzLHQpKS5kZWxldGUoZSk6biYmbChuLHRoaXMuX2kpJiZkZWxldGUgblt0aGlzLl9pXX0saGFzOmZ1bmN0aW9uKGUpe2lmKCFhKGUpKXJldHVybiExO3ZhciBuPW8oZSk7cmV0dXJuITA9PT1uP2QoZih0aGlzLHQpKS5oYXMoZSk6biYmbChuLHRoaXMuX2kpfX0pLHN9LGRlZjpmdW5jdGlvbihlLHQsbil7dmFyIHI9byhpKHQpLCEwKTtyZXR1cm4hMD09PXI/ZChlKS5zZXQodCxuKTpyW2UuX2ldPW4sZX0sdWZzdG9yZTpkfX0sYUNGajpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiWW1xdiIpLG89bigidmhQVSIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gcihvKGUpKX19LGFhZ3g6ZnVuY3Rpb24oZSx0KXt2YXIgbj17fS5oYXNPd25Qcm9wZXJ0eTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbi5jYWxsKGUsdCl9fSxhcG1UOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCIwL1I0Iik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYoIXIoZSkpcmV0dXJuIGU7dmFyIG4sbztpZih0JiYiZnVuY3Rpb24iPT10eXBlb2Yobj1lLnRvU3RyaW5nKSYmIXIobz1uLmNhbGwoZSkpKXJldHVybiBvO2lmKCJmdW5jdGlvbiI9PXR5cGVvZihuPWUudmFsdWVPZikmJiFyKG89bi5jYWxsKGUpKSlyZXR1cm4gbztpZighdCYmImZ1bmN0aW9uIj09dHlwZW9mKG49ZS50b1N0cmluZykmJiFyKG89bi5jYWxsKGUpKSlyZXR1cm4gbzt0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfX0sY3pOSzpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oIkRWZ0EiKSxvPW4oIkppRWEiKSxpPW4oIlVxY0YiKSxhPW4oIlMvai8iKSxjPW4oIlltcXYiKSx1PU9iamVjdC5hc3NpZ247ZS5leHBvcnRzPSF1fHxuKCJlZVZxIikoZnVuY3Rpb24oKXt2YXIgZT17fSx0PXt9LG49U3ltYm9sKCkscj0iYWJjZGVmZ2hpamtsbW5vcHFyc3QiO3JldHVybiBlW25dPTcsci5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWV9KSw3IT11KHt9LGUpW25dfHxPYmplY3Qua2V5cyh1KHt9LHQpKS5qb2luKCIiKSE9cn0pP2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWEoZSksdT1hcmd1bWVudHMubGVuZ3RoLHM9MSxsPW8uZixmPWkuZjt1PnM7KWZvcih2YXIgcCxoPWMoYXJndW1lbnRzW3MrK10pLHY9bD9yKGgpLmNvbmNhdChsKGgpKTpyKGgpLGQ9di5sZW5ndGgsZz0wO2Q+ZzspZi5jYWxsKGgscD12W2crK10pJiYobltwXT1oW3BdKTtyZXR1cm4gbn06dX0sImQvR2MiOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJSWWk3Iiksbz1NYXRoLm1heCxpPU1hdGgubWluO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybihlPXIoZSkpPDA/byhlK3QsMCk6aShlLHQpfX0sZHlaWDpmdW5jdGlvbihlLHQpe3ZhciBuPWUuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lk1hdGg9PU1hdGg/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5NYXRoPT1NYXRoP3NlbGY6RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTsibnVtYmVyIj09dHlwZW9mIF9fZyYmKF9fZz1uKX0sZWVWcTpmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXt0cnl7cmV0dXJuISFlKCl9Y2F0Y2goZSl7cmV0dXJuITB9fX0sZWxacTpmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oImR5WlgiKSxvPW4oImhzd2EiKSxpPW4oIm5oNGciKSxhPW4oIksweFUiKSgic3BlY2llcyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1yW2VdO2kmJnQmJiF0W2FdJiZvLmYodCxhLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSl9fSwiZk4vMyI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oIk42Y0oiKSxvPW4oInkzdzkiKSxpPXIua2V5cyxhPXIua2V5O3IuZXhwKHtnZXRPd25NZXRhZGF0YUtleXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGkobyhlKSxhcmd1bWVudHMubGVuZ3RoPDI/dm9pZCAwOmEoYXJndW1lbnRzWzFdKSl9fSl9LGZ5RHE6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oImhzd2EiKS5mLG89bigiYWFneCIpLGk9bigiSzB4VSIpKCJ0b1N0cmluZ1RhZyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7ZSYmIW8oZT1uP2U6ZS5wcm90b3R5cGUsaSkmJnIoZSxpLHtjb25maWd1cmFibGU6ITAsdmFsdWU6dH0pfX0sZzNnNTpmdW5jdGlvbihlLHQpe3ZhciBuPWUuZXhwb3J0cz17dmVyc2lvbjoiMi41LjcifTsibnVtYmVyIj09dHlwZW9mIF9fZSYmKF9fZT1uKX0sImhOL2ciOmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4oIkZaY3EiKSxuKCIwVFdwIil9LGhQSVE6ZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e319LGhzd2E6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oInkzdzkiKSxvPW4oInhwcWwiKSxpPW4oImFwbVQiKSxhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt0LmY9bigibmg0ZyIpP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihlLHQsbil7aWYocihlKSx0PWkodCwhMCkscihuKSxvKXRyeXtyZXR1cm4gYShlLHQsbil9Y2F0Y2goZSl7fWlmKCJnZXQiaW4gbnx8InNldCJpbiBuKXRocm93IFR5cGVFcnJvcigiQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhIik7cmV0dXJuInZhbHVlImluIG4mJihlW3RdPW4udmFsdWUpLGV9fSxpNWRjOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCIwL1I0Iiksbz1uKCJ5M3c5IiksaT1mdW5jdGlvbihlLHQpe2lmKG8oZSksIXIodCkmJm51bGwhPT10KXRocm93IFR5cGVFcnJvcih0KyI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhIil9O2UuZXhwb3J0cz17c2V0Ok9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbihlLHQscil7dHJ5eyhyPW4oIm0wUHAiKShGdW5jdGlvbi5jYWxsLG4oIkVlbUgiKS5mKE9iamVjdC5wcm90b3R5cGUsIl9fcHJvdG9fXyIpLnNldCwyKSkoZSxbXSksdD0hKGUgaW5zdGFuY2VvZiBBcnJheSl9Y2F0Y2goZSl7dD0hMH1yZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4gaShlLG4pLHQ/ZS5fX3Byb3RvX189bjpyKGUsbiksZX19KHt9LCExKTp2b2lkIDApLGNoZWNrOml9fSwiaVcrUyI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oIk42Y0oiKSxvPW4oInkzdzkiKSxpPW4oIk9QM1kiKSxhPXIuaGFzLGM9ci5rZXksdT1mdW5jdGlvbihlLHQsbil7aWYoYShlLHQsbikpcmV0dXJuITA7dmFyIHI9aSh0KTtyZXR1cm4gbnVsbCE9PXImJnUoZSxyLG4pfTtyLmV4cCh7aGFzTWV0YWRhdGE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdShlLG8odCksYXJndW1lbnRzLmxlbmd0aDwzP3ZvaWQgMDpjKGFyZ3VtZW50c1syXSkpfX0pfSxtMFBwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCIyT2lGIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtpZihyKGUpLHZvaWQgMD09PXQpcmV0dXJuIGU7c3dpdGNoKG4pe2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUuY2FsbCh0LG4pfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKG4scil7cmV0dXJuIGUuY2FsbCh0LG4scil9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24obixyLG8pe3JldHVybiBlLmNhbGwodCxuLHIsbyl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHQsYXJndW1lbnRzKX19fSxuZThpOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJSWWk3Iiksbz1NYXRoLm1pbjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU+MD9vKHIoZSksOTAwNzE5OTI1NDc0MDk5MSk6MH19LG5oNGc6ZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz0hbigiZWVWcSIpKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sczVxWTpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiMC9SNCIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKCFyKGUpfHxlLl90IT09dCl0aHJvdyBUeXBlRXJyb3IoIkluY29tcGF0aWJsZSByZWNlaXZlciwgIit0KyIgcmVxdWlyZWQhIik7cmV0dXJuIGV9fSx1QXRkOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJUMzliIiksbz1uKCJRM25lIiksaT1uKCJONmNKIiksYT1uKCJ5M3c5IiksYz1uKCJPUDNZIiksdT1pLmtleXMscz1pLmtleSxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49dShlLHQpLGk9YyhlKTtpZihudWxsPT09aSlyZXR1cm4gbjt2YXIgYT1sKGksdCk7cmV0dXJuIGEubGVuZ3RoP24ubGVuZ3RoP28obmV3IHIobi5jb25jYXQoYSkpKTphOm59O2kuZXhwKHtnZXRNZXRhZGF0YUtleXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGwoYShlKSxhcmd1bWVudHMubGVuZ3RoPDI/dm9pZCAwOnMoYXJndW1lbnRzWzFdKSl9fSl9LHZoUFU6ZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT1lKXRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gICIrZSk7cmV0dXJuIGV9fSx3MmE1OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJhQ0ZqIiksbz1uKCJuZThpIiksaT1uKCJkL0djIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LG4sYSl7dmFyIGMsdT1yKHQpLHM9byh1Lmxlbmd0aCksbD1pKGEscyk7aWYoZSYmbiE9bil7Zm9yKDtzPmw7KWlmKChjPXVbbCsrXSkhPWMpcmV0dXJuITB9ZWxzZSBmb3IoO3M+bDtsKyspaWYoKGV8fGwgaW4gdSkmJnVbbF09PT1uKXJldHVybiBlfHxsfHwwO3JldHVybiFlJiYtMX19fSx3bXZHOmZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigiaHN3YSIpLmYsbz1uKCJLdXRoIiksaT1uKCIzTHlqIiksYT1uKCJtMFBwIiksYz1uKCI5Z1g3IiksdT1uKCJTbGtZIikscz1uKCJBZm56IiksbD1uKCIxVHNBIiksZj1uKCJlbFpxIikscD1uKCJuaDRnIiksaD1uKCJaNnZGIikuZmFzdEtleSx2PW4oInM1cVkiKSxkPXA/Il9zIjoic2l6ZSIsZz1mdW5jdGlvbihlLHQpe3ZhciBuLHI9aCh0KTtpZigiRiIhPT1yKXJldHVybiBlLl9pW3JdO2ZvcihuPWUuX2Y7bjtuPW4ubilpZihuLms9PXQpcmV0dXJuIG59O2UuZXhwb3J0cz17Z2V0Q29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0LG4scyl7dmFyIGw9ZShmdW5jdGlvbihlLHIpe2MoZSxsLHQsIl9pIiksZS5fdD10LGUuX2k9byhudWxsKSxlLl9mPXZvaWQgMCxlLl9sPXZvaWQgMCxlW2RdPTAsdm9pZCAwIT1yJiZ1KHIsbixlW3NdLGUpfSk7cmV0dXJuIGkobC5wcm90b3R5cGUse2NsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPXYodGhpcyx0KSxuPWUuX2kscj1lLl9mO3I7cj1yLm4pci5yPSEwLHIucCYmKHIucD1yLnAubj12b2lkIDApLGRlbGV0ZSBuW3IuaV07ZS5fZj1lLl9sPXZvaWQgMCxlW2RdPTB9LGRlbGV0ZTpmdW5jdGlvbihlKXt2YXIgbj12KHRoaXMsdCkscj1nKG4sZSk7aWYocil7dmFyIG89ci5uLGk9ci5wO2RlbGV0ZSBuLl9pW3IuaV0sci5yPSEwLGkmJihpLm49byksbyYmKG8ucD1pKSxuLl9mPT1yJiYobi5fZj1vKSxuLl9sPT1yJiYobi5fbD1pKSxuW2RdLS19cmV0dXJuISFyfSxmb3JFYWNoOmZ1bmN0aW9uKGUpe3YodGhpcyx0KTtmb3IodmFyIG4scj1hKGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsMyk7bj1uP24ubjp0aGlzLl9mOylmb3IocihuLnYsbi5rLHRoaXMpO24mJm4ucjspbj1uLnB9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4hIWcodih0aGlzLHQpLGUpfX0pLHAmJnIobC5wcm90b3R5cGUsInNpemUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdih0aGlzLHQpW2RdfX0pLGx9LGRlZjpmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxpPWcoZSx0KTtyZXR1cm4gaT9pLnY9bjooZS5fbD1pPXtpOm89aCh0LCEwKSxrOnQsdjpuLHA6cj1lLl9sLG46dm9pZCAwLHI6ITF9LGUuX2Z8fChlLl9mPWkpLHImJihyLm49aSksZVtkXSsrLCJGIiE9PW8mJihlLl9pW29dPWkpKSxlfSxnZXRFbnRyeTpnLHNldFN0cm9uZzpmdW5jdGlvbihlLHQsbil7cyhlLHQsZnVuY3Rpb24oZSxuKXt0aGlzLl90PXYoZSx0KSx0aGlzLl9rPW4sdGhpcy5fbD12b2lkIDB9LGZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuX2ssdD10aGlzLl9sO3QmJnQucjspdD10LnA7cmV0dXJuIHRoaXMuX3QmJih0aGlzLl9sPXQ9dD90Lm46dGhpcy5fdC5fZik/bCgwLCJrZXlzIj09ZT90Lms6InZhbHVlcyI9PWU/dC52Olt0LmssdC52XSk6KHRoaXMuX3Q9dm9pZCAwLGwoMSkpfSxuPyJlbnRyaWVzIjoidmFsdWVzIiwhbiwhMCksZih0KX19fSx4cHFsOmZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9IW4oIm5oNGciKSYmIW4oImVlVnEiKShmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkobigiSXc3MSIpKCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0seTN3OTpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiMC9SNCIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZighcihlKSl0aHJvdyBUeXBlRXJyb3IoZSsiIGlzIG5vdCBhbiBvYmplY3QhIik7cmV0dXJuIGV9fSx5bHFzOmZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPU1hdGgucmFuZG9tKCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiJTeW1ib2woIi5jb25jYXQodm9pZCAwPT09ZT8iIjplLCIpXyIsKCsrbityKS50b1N0cmluZygzNikpfX0selJ3bzpmdW5jdGlvbihlLHQsbil7dmFyIHI9bigiNkZNTyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcocihlKSkodCl9fSx6aEFiOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKCJhYWd4Iiksbz1uKCJhQ0ZqIiksaT1uKCJ3MmE1IikoITEpLGE9bigiWVR2QSIpKCJJRV9QUk9UTyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuLGM9byhlKSx1PTAscz1bXTtmb3IobiBpbiBjKW4hPWEmJnIoYyxuKSYmcy5wdXNoKG4pO2Zvcig7dC5sZW5ndGg+dTspcihjLG49dFt1KytdKSYmKH5pKHMsbil8fHMucHVzaChuKSk7cmV0dXJuIHN9fSwienErQyI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oIk42Y0oiKSxvPW4oInkzdzkiKSxpPXIua2V5LGE9ci5tYXAsYz1yLnN0b3JlO3IuZXhwKHtkZWxldGVNZXRhZGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg8Mz92b2lkIDA6aShhcmd1bWVudHNbMl0pLHI9YShvKHQpLG4sITEpO2lmKHZvaWQgMD09PXJ8fCFyLmRlbGV0ZShlKSlyZXR1cm4hMTtpZihyLnNpemUpcmV0dXJuITA7dmFyIHU9Yy5nZXQodCk7cmV0dXJuIHUuZGVsZXRlKG4pLCEhdS5zaXplfHxjLmRlbGV0ZSh0KX19KX19LFtbMywzXV1dKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9seWZpbGxzLmpzLm1hcCh3aW5kb3cud2VicGFja0pzb25wPXdpbmRvdy53ZWJwYWNrSnNvbnB8fFtdKS5wdXNoKFtbNl0seyIrdEo0IjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiByfSk7dmFyIHI9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyJiYhZS5jbG9zZWQ7bisrKWUubmV4dCh0W25dKTtlLmNsb3NlZHx8ZS5jb21wbGV0ZSgpfX19LCIrdW1LIjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXt9bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KX0sIi9XWXYiOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQuc3Vic2NyaWJlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVufW4uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiByfSl9LCIwL1E2IjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJjIixmdW5jdGlvbigpe3JldHVybiBifSksbi5kKGUsImUiLGZ1bmN0aW9uKCl7cmV0dXJuIGR9KSxuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gcH0pLG4uZChlLCJiIixmdW5jdGlvbigpe3JldHVybiBtfSksbi5kKGUsImQiLGZ1bmN0aW9uKCl7cmV0dXJuIGd9KSxuLmQoZSwiZiIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pO3ZhciByPW4oIm1yU0ciKSxpPW4oIkNjbkciKSxvPW4oIldmNHAiKSxhPW4oImxMQVAiKSxzPW4oIm42Z0ciKSx1PW4oIllsYlEiKSxsPW4oIllTaDIiKSxjPShuKCJnSWNZIiksbigicHVnVCIpKSxmPU9iamVjdChvLnYpKGZ1bmN0aW9uKCl7fSksaD1PYmplY3Qoby52KShmdW5jdGlvbigpe30pLGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZX0oZikscD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlfShmKSxtPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgcj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIHIuX2VsZW1lbnQ9ZSxyLl9uYXZMaXN0PW4sci5faXNOYXZMaXN0PSExLHIuX2lzTmF2TGlzdD0hIW4scn1yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5uZ0FmdGVyQ29udGVudEluaXQ9ZnVuY3Rpb24oKXtuZXcgby5qKHRoaXMuX2xpbmVzLHRoaXMuX2VsZW1lbnQpfSxlLnByb3RvdHlwZS5faXNSaXBwbGVEaXNhYmxlZD1mdW5jdGlvbigpe3JldHVybiF0aGlzLl9pc05hdkxpc3R8fHRoaXMuZGlzYWJsZVJpcHBsZXx8dGhpcy5fbmF2TGlzdC5kaXNhYmxlUmlwcGxlfSxlLnByb3RvdHlwZS5faGFuZGxlRm9jdXM9ZnVuY3Rpb24oKXt0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgibWF0LWxpc3QtaXRlbS1mb2N1cyIpfSxlLnByb3RvdHlwZS5faGFuZGxlQmx1cj1mdW5jdGlvbigpe3RoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJtYXQtbGlzdC1pdGVtLWZvY3VzIil9LGUucHJvdG90eXBlLl9nZXRIb3N0RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnR9LGV9KGgpLHk9T2JqZWN0KG8udikoT2JqZWN0KG8udykoZnVuY3Rpb24oKXt9KSksZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt2YXIgaT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGkuX2VsZW1lbnQ9ZSxpLl9jaGFuZ2VEZXRlY3Rvcj1uLGkuc2VsZWN0aW9uTGlzdD1yLGkuX3NlbGVjdGVkPSExLGkuX2Rpc2FibGVkPSExLGkuX2hhc0ZvY3VzPSExLGkuY2hlY2tib3hQb3NpdGlvbj0iYWZ0ZXIiLGl9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJkaXNhYmxlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNhYmxlZHx8dGhpcy5zZWxlY3Rpb25MaXN0JiZ0aGlzLnNlbGVjdGlvbkxpc3QuZGlzYWJsZWR9LHNldDpmdW5jdGlvbih0KXt2YXIgZT1PYmplY3Qocy5iKSh0KTtlIT09dGhpcy5fZGlzYWJsZWQmJih0aGlzLl9kaXNhYmxlZD1lLHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInNlbGVjdGVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uTGlzdC5zZWxlY3RlZE9wdGlvbnMuaXNTZWxlY3RlZCh0aGlzKX0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdChzLmIpKHQpO2UhPT10aGlzLl9zZWxlY3RlZCYmKHRoaXMuX3NldFNlbGVjdGVkKGUpLHRoaXMuc2VsZWN0aW9uTGlzdC5fcmVwb3J0VmFsdWVDaGFuZ2UoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUubmdPbkluaXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fc2VsZWN0ZWQ7UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpeyh0Ll9zZWxlY3RlZHx8ZSkmJih0LnNlbGVjdGVkPSEwLHQuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpKX0pfSxlLnByb3RvdHlwZS5uZ0FmdGVyQ29udGVudEluaXQ9ZnVuY3Rpb24oKXtuZXcgby5qKHRoaXMuX2xpbmVzLHRoaXMuX2VsZW1lbnQpfSxlLnByb3RvdHlwZS5uZ09uRGVzdHJveT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5zZWxlY3RlZCYmUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiB0LnNlbGVjdGVkPSExfSksdGhpcy5zZWxlY3Rpb25MaXN0Ll9yZW1vdmVPcHRpb25Gcm9tTGlzdCh0aGlzKX0sZS5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD0hdGhpcy5zZWxlY3RlZH0sZS5wcm90b3R5cGUuZm9jdXM9ZnVuY3Rpb24oKXt0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKX0sZS5wcm90b3R5cGUuZ2V0TGFiZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGV4dD90aGlzLl90ZXh0Lm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQ6IiJ9LGUucHJvdG90eXBlLl9pc1JpcHBsZURpc2FibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fHRoaXMuZGlzYWJsZVJpcHBsZXx8dGhpcy5zZWxlY3Rpb25MaXN0LmRpc2FibGVSaXBwbGV9LGUucHJvdG90eXBlLl9oYW5kbGVDbGljaz1mdW5jdGlvbigpe3RoaXMuZGlzYWJsZWR8fCh0aGlzLnRvZ2dsZSgpLHRoaXMuc2VsZWN0aW9uTGlzdC5fZW1pdENoYW5nZUV2ZW50KHRoaXMpKX0sZS5wcm90b3R5cGUuX2hhbmRsZUZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5faGFzRm9jdXM9ITAsdGhpcy5zZWxlY3Rpb25MaXN0Ll9zZXRGb2N1c2VkT3B0aW9uKHRoaXMpfSxlLnByb3RvdHlwZS5faGFuZGxlQmx1cj1mdW5jdGlvbigpe3RoaXMuX2hhc0ZvY3VzPSExLHRoaXMuc2VsZWN0aW9uTGlzdC5fb25Ub3VjaGVkKCl9LGUucHJvdG90eXBlLl9nZXRIb3N0RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnR9LGUucHJvdG90eXBlLl9zZXRTZWxlY3RlZD1mdW5jdGlvbih0KXtyZXR1cm4gdCE9PXRoaXMuX3NlbGVjdGVkJiYodGhpcy5fc2VsZWN0ZWQ9dCx0P3RoaXMuc2VsZWN0aW9uTGlzdC5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0KHRoaXMpOnRoaXMuc2VsZWN0aW9uTGlzdC5zZWxlY3RlZE9wdGlvbnMuZGVzZWxlY3QodGhpcyksdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCksITApfSxlfShPYmplY3Qoby52KShmdW5jdGlvbigpe30pKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgcj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIHIuX2VsZW1lbnQ9ZSxyLnNlbGVjdGlvbkNoYW5nZT1uZXcgaS5tLHIudGFiSW5kZXg9MCxyLnNlbGVjdGVkT3B0aW9ucz1uZXcgdS5hKCEwKSxyLl9vbkNoYW5nZT1mdW5jdGlvbih0KXt9LHIuX21vZGVsQ2hhbmdlcz1jLmEuRU1QVFksci5fb25Ub3VjaGVkPWZ1bmN0aW9uKCl7fSxyLnRhYkluZGV4PXBhcnNlSW50KG4pfHwwLHJ9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUubmdBZnRlckNvbnRlbnRJbml0PWZ1bmN0aW9uKCl7dGhpcy5fa2V5TWFuYWdlcj1uZXcgYS5hKHRoaXMub3B0aW9ucykud2l0aFdyYXAoKS53aXRoVHlwZUFoZWFkKCkuc2tpcFByZWRpY2F0ZShmdW5jdGlvbigpe3JldHVybiExfSksdGhpcy5fdGVtcFZhbHVlcyYmKHRoaXMuX3NldE9wdGlvbnNGcm9tVmFsdWVzKHRoaXMuX3RlbXBWYWx1ZXMpLHRoaXMuX3RlbXBWYWx1ZXM9bnVsbCksdGhpcy5fbW9kZWxDaGFuZ2VzPXRoaXMuc2VsZWN0ZWRPcHRpb25zLm9uQ2hhbmdlLnN1YnNjcmliZShmdW5jdGlvbih0KXtpZih0LmFkZGVkKWZvcih2YXIgZT0wLG49dC5hZGRlZDtlPG4ubGVuZ3RoO2UrKyluW2VdLnNlbGVjdGVkPSEwO2lmKHQucmVtb3ZlZClmb3IodmFyIHI9MCxpPXQucmVtb3ZlZDtyPGkubGVuZ3RoO3IrKylpW3JdLnNlbGVjdGVkPSExfSl9LGUucHJvdG90eXBlLm5nT25EZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fbW9kZWxDaGFuZ2VzLnVuc3Vic2NyaWJlKCl9LGUucHJvdG90eXBlLmZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCl9LGUucHJvdG90eXBlLnNlbGVjdEFsbD1mdW5jdGlvbigpe3RoaXMuX3NldEFsbE9wdGlvbnNTZWxlY3RlZCghMCl9LGUucHJvdG90eXBlLmRlc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dGhpcy5fc2V0QWxsT3B0aW9uc1NlbGVjdGVkKCExKX0sZS5wcm90b3R5cGUuX3NldEZvY3VzZWRPcHRpb249ZnVuY3Rpb24odCl7dGhpcy5fa2V5TWFuYWdlci51cGRhdGVBY3RpdmVJdGVtSW5kZXgodGhpcy5fZ2V0T3B0aW9uSW5kZXgodCkpfSxlLnByb3RvdHlwZS5fcmVtb3ZlT3B0aW9uRnJvbUxpc3Q9ZnVuY3Rpb24odCl7aWYodC5faGFzRm9jdXMpe3ZhciBlPXRoaXMuX2dldE9wdGlvbkluZGV4KHQpO2U+MD90aGlzLl9rZXlNYW5hZ2VyLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpOjA9PT1lJiZ0aGlzLm9wdGlvbnMubGVuZ3RoPjEmJnRoaXMuX2tleU1hbmFnZXIuc2V0TmV4dEl0ZW1BY3RpdmUoKX19LGUucHJvdG90eXBlLl9rZXlkb3duPWZ1bmN0aW9uKHQpe3ZhciBlPXQua2V5Q29kZSxuPXRoaXMuX2tleU1hbmFnZXIscj1uLmFjdGl2ZUl0ZW1JbmRleDtzd2l0Y2goZSl7Y2FzZSBsLmo6Y2FzZSBsLmQ6dGhpcy5kaXNhYmxlZHx8KHRoaXMuX3RvZ2dsZVNlbGVjdE9uRm9jdXNlZE9wdGlvbigpLHQucHJldmVudERlZmF1bHQoKSk7YnJlYWs7Y2FzZSBsLmY6Y2FzZSBsLmM6ZT09PWwuZj9uLnNldEZpcnN0SXRlbUFjdGl2ZSgpOm4uc2V0TGFzdEl0ZW1BY3RpdmUoKSx0LnByZXZlbnREZWZhdWx0KCk7YnJlYWs7ZGVmYXVsdDpuLm9uS2V5ZG93bih0KX1lIT09bC5sJiZlIT09bC5ifHwhdC5zaGlmdEtleXx8bi5hY3RpdmVJdGVtSW5kZXg9PT1yfHx0aGlzLl90b2dnbGVTZWxlY3RPbkZvY3VzZWRPcHRpb24oKX0sZS5wcm90b3R5cGUuX3JlcG9ydFZhbHVlQ2hhbmdlPWZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zJiZ0aGlzLl9vbkNoYW5nZSh0aGlzLl9nZXRTZWxlY3RlZE9wdGlvblZhbHVlcygpKX0sZS5wcm90b3R5cGUuX2VtaXRDaGFuZ2VFdmVudD1mdW5jdGlvbih0KXt0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KG5ldyBmdW5jdGlvbih0LGUpe3RoaXMuc291cmNlPXQsdGhpcy5vcHRpb249ZX0odGhpcyx0KSl9LGUucHJvdG90eXBlLndyaXRlVmFsdWU9ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zP3RoaXMuX3NldE9wdGlvbnNGcm9tVmFsdWVzKHR8fFtdKTp0aGlzLl90ZW1wVmFsdWVzPXR9LGUucHJvdG90eXBlLnNldERpc2FibGVkU3RhdGU9ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD10fSl9LGUucHJvdG90eXBlLnJlZ2lzdGVyT25DaGFuZ2U9ZnVuY3Rpb24odCl7dGhpcy5fb25DaGFuZ2U9dH0sZS5wcm90b3R5cGUucmVnaXN0ZXJPblRvdWNoZWQ9ZnVuY3Rpb24odCl7dGhpcy5fb25Ub3VjaGVkPXR9LGUucHJvdG90eXBlLl9zZXRPcHRpb25zRnJvbVZhbHVlcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMub3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0Ll9zZXRTZWxlY3RlZCghMSl9KSx0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gZS5vcHRpb25zLmZpbmQoZnVuY3Rpb24obil7cmV0dXJuIGUuY29tcGFyZVdpdGg/ZS5jb21wYXJlV2l0aChuLnZhbHVlLHQpOm4udmFsdWU9PT10fSl9KS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdC5fc2V0U2VsZWN0ZWQoITApfSl9LGUucHJvdG90eXBlLl9nZXRTZWxlY3RlZE9wdGlvblZhbHVlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0LnNlbGVjdGVkfSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlfSl9LGUucHJvdG90eXBlLl90b2dnbGVTZWxlY3RPbkZvY3VzZWRPcHRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleDtpZihudWxsIT10JiZ0aGlzLl9pc1ZhbGlkSW5kZXgodCkpe3ZhciBlPXRoaXMub3B0aW9ucy50b0FycmF5KClbdF07ZSYmKGUudG9nZ2xlKCksdGhpcy5fZW1pdENoYW5nZUV2ZW50KGUpKX19LGUucHJvdG90eXBlLl9zZXRBbGxPcHRpb25zU2VsZWN0ZWQ9ZnVuY3Rpb24odCl7dmFyIGU9ITE7dGhpcy5vcHRpb25zLmZvckVhY2goZnVuY3Rpb24obil7bi5fc2V0U2VsZWN0ZWQodCkmJihlPSEwKX0pLGUmJnRoaXMuX3JlcG9ydFZhbHVlQ2hhbmdlKCl9LGUucHJvdG90eXBlLl9pc1ZhbGlkSW5kZXg9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PTAmJnQ8dGhpcy5vcHRpb25zLmxlbmd0aH0sZS5wcm90b3R5cGUuX2dldE9wdGlvbkluZGV4PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMudG9BcnJheSgpLmluZGV4T2YodCl9LGV9KHkpLGI9ZnVuY3Rpb24oKXt9fSwiMC91USI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCI2YmxGIiksaT1uKCIvV1l2Iiksbz1uKCIyZVBsIiksYT1uKCJ4VGxhIikscz1uKCJFbjgrIiksdT1uKCJJVVRiIiksbD1uKCJwdWdUIiksYz1uKCJTNVhRIiksZj1uKCJ1NjdEIiksaD1uKCJKY1J2IiksZD1uKCJGeGIxIik7ZnVuY3Rpb24gcCh0LGUpe2lmKCFlKXJldHVybiB0IGluc3RhbmNlb2Ygci5hP3Q6bmV3IHIuYShPYmplY3QoZC5hKSh0KSk7aWYobnVsbCE9dCl7aWYoZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0W2EuYV19KHQpKXJldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiBuZXcgci5hKGU/ZnVuY3Rpb24obil7dmFyIHI9bmV3IGwuYTtyZXR1cm4gci5hZGQoZS5zY2hlZHVsZShmdW5jdGlvbigpe3ZhciBpPXRbYS5hXSgpO3IuYWRkKGkuc3Vic2NyaWJlKHtuZXh0OmZ1bmN0aW9uKHQpe3IuYWRkKGUuc2NoZWR1bGUoZnVuY3Rpb24oKXtyZXR1cm4gbi5uZXh0KHQpfSkpfSxlcnJvcjpmdW5jdGlvbih0KXtyLmFkZChlLnNjaGVkdWxlKGZ1bmN0aW9uKCl7cmV0dXJuIG4uZXJyb3IodCl9KSl9LGNvbXBsZXRlOmZ1bmN0aW9uKCl7ci5hZGQoZS5zY2hlZHVsZShmdW5jdGlvbigpe3JldHVybiBuLmNvbXBsZXRlKCl9KSl9fSkpfSkpLHJ9Ok9iamVjdChoLmEpKHQpKX0odCxlKTtpZihPYmplY3QoaS5hKSh0KSlyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHIuYShlP2Z1bmN0aW9uKG4pe3ZhciByPW5ldyBsLmE7cmV0dXJuIHIuYWRkKGUuc2NoZWR1bGUoZnVuY3Rpb24oKXtyZXR1cm4gdC50aGVuKGZ1bmN0aW9uKHQpe3IuYWRkKGUuc2NoZWR1bGUoZnVuY3Rpb24oKXtuLm5leHQodCksci5hZGQoZS5zY2hlZHVsZShmdW5jdGlvbigpe3JldHVybiBuLmNvbXBsZXRlKCl9KSl9KSl9LGZ1bmN0aW9uKHQpe3IuYWRkKGUuc2NoZWR1bGUoZnVuY3Rpb24oKXtyZXR1cm4gbi5lcnJvcih0KX0pKX0pfSkpLHJ9Ok9iamVjdChjLmEpKHQpKX0odCxlKTtpZihPYmplY3Qoby5hKSh0KSlyZXR1cm4gT2JqZWN0KHUuYSkodCxlKTtpZihmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHRbcy5hXX0odCl8fCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIkl0ZXJhYmxlIGNhbm5vdCBiZSBudWxsIik7cmV0dXJuIG5ldyByLmEoZT9mdW5jdGlvbihuKXt2YXIgcixpPW5ldyBsLmE7cmV0dXJuIGkuYWRkKGZ1bmN0aW9uKCl7ciYmImZ1bmN0aW9uIj09dHlwZW9mIHIucmV0dXJuJiZyLnJldHVybigpfSksaS5hZGQoZS5zY2hlZHVsZShmdW5jdGlvbigpe3I9dFtzLmFdKCksaS5hZGQoZS5zY2hlZHVsZShmdW5jdGlvbigpe2lmKCFuLmNsb3NlZCl7dmFyIHQsZTt0cnl7dmFyIGk9ci5uZXh0KCk7dD1pLnZhbHVlLGU9aS5kb25lfWNhdGNoKHQpe3JldHVybiB2b2lkIG4uZXJyb3IodCl9ZT9uLmNvbXBsZXRlKCk6KG4ubmV4dCh0KSx0aGlzLnNjaGVkdWxlKCkpfX0pKX0pKSxpfTpPYmplY3QoZi5hKSh0KSl9KHQsZSl9dGhyb3cgbmV3IFR5cGVFcnJvcigobnVsbCE9PXQmJnR5cGVvZiB0fHx0KSsiIGlzIG5vdCBvYnNlcnZhYmxlIil9bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KX0sIjIxTGIiOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigibXJTRyIpLGk9bigiT3pmQiIpLG89bigiSzlJYSIpLGE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciByPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIHIuc2NoZWR1bGVyPWUsci53b3JrPW4scn1yZXR1cm4gci5iKGUsdCksZS5wcm90b3R5cGUuc2NoZWR1bGU9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49MCksbj4wP3QucHJvdG90eXBlLnNjaGVkdWxlLmNhbGwodGhpcyxlLG4pOih0aGlzLmRlbGF5PW4sdGhpcy5zdGF0ZT1lLHRoaXMuc2NoZWR1bGVyLmZsdXNoKHRoaXMpLHRoaXMpfSxlLnByb3RvdHlwZS5leGVjdXRlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG4+MHx8dGhpcy5jbG9zZWQ/dC5wcm90b3R5cGUuZXhlY3V0ZS5jYWxsKHRoaXMsZSxuKTp0aGlzLl9leGVjdXRlKGUsbil9LGUucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkPWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdm9pZCAwPT09ciYmKHI9MCksbnVsbCE9PXImJnI+MHx8bnVsbD09PXImJnRoaXMuZGVsYXk+MD90LnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZC5jYWxsKHRoaXMsZSxuLHIpOmUuZmx1c2godGhpcyl9LGV9KG4oImg5RHEiKS5hKSxzPW5ldyhmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gci5iKGUsdCksZX0obigiQ1M5USIpLmEpKShhKSx1PW4oInB1Z1QiKSxsPW4oIkZGT28iKSxjPW4oIjYwaVUiKSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIpe3ZvaWQgMD09PXImJihyPTApO3ZhciBpPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBpLnNjaGVkdWxlcj1uLGkuZGVsYXk9cixpfXJldHVybiByLmIoZSx0KSxlLmRpc3BhdGNoPWZ1bmN0aW9uKHQpe3Qubm90aWZpY2F0aW9uLm9ic2VydmUodC5kZXN0aW5hdGlvbiksdGhpcy51bnN1YnNjcmliZSgpfSxlLnByb3RvdHlwZS5zY2hlZHVsZU1lc3NhZ2U9ZnVuY3Rpb24odCl7dGhpcy5hZGQodGhpcy5zY2hlZHVsZXIuc2NoZWR1bGUoZS5kaXNwYXRjaCx0aGlzLmRlbGF5LG5ldyBoKHQsdGhpcy5kZXN0aW5hdGlvbikpKX0sZS5wcm90b3R5cGUuX25leHQ9ZnVuY3Rpb24odCl7dGhpcy5zY2hlZHVsZU1lc3NhZ2UoYy5hLmNyZWF0ZU5leHQodCkpfSxlLnByb3RvdHlwZS5fZXJyb3I9ZnVuY3Rpb24odCl7dGhpcy5zY2hlZHVsZU1lc3NhZ2UoYy5hLmNyZWF0ZUVycm9yKHQpKX0sZS5wcm90b3R5cGUuX2NvbXBsZXRlPWZ1bmN0aW9uKCl7dGhpcy5zY2hlZHVsZU1lc3NhZ2UoYy5hLmNyZWF0ZUNvbXBsZXRlKCkpfSxlfShsLmEpLGg9ZnVuY3Rpb24odCxlKXt0aGlzLm5vdGlmaWNhdGlvbj10LHRoaXMuZGVzdGluYXRpb249ZX0sZD1uKCI4ZzhBIikscD1uKCJ1TWFPIiksbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt2b2lkIDA9PT1lJiYoZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpLHZvaWQgMD09PW4mJihuPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7dmFyIGk9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBpLnNjaGVkdWxlcj1yLGkuX2V2ZW50cz1bXSxpLl9pbmZpbml0ZVRpbWVXaW5kb3c9ITEsaS5fYnVmZmVyU2l6ZT1lPDE/MTplLGkuX3dpbmRvd1RpbWU9bjwxPzE6bixuPT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZPyhpLl9pbmZpbml0ZVRpbWVXaW5kb3c9ITAsaS5uZXh0PWkubmV4dEluZmluaXRlVGltZVdpbmRvdyk6aS5uZXh0PWkubmV4dFRpbWVXaW5kb3csaX1yZXR1cm4gci5iKGUsdCksZS5wcm90b3R5cGUubmV4dEluZmluaXRlVGltZVdpbmRvdz1mdW5jdGlvbihlKXt2YXIgbj10aGlzLl9ldmVudHM7bi5wdXNoKGUpLG4ubGVuZ3RoPnRoaXMuX2J1ZmZlclNpemUmJm4uc2hpZnQoKSx0LnByb3RvdHlwZS5uZXh0LmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUubmV4dFRpbWVXaW5kb3c9ZnVuY3Rpb24oZSl7dGhpcy5fZXZlbnRzLnB1c2gobmV3IHkodGhpcy5fZ2V0Tm93KCksZSkpLHRoaXMuX3RyaW1CdWZmZXJUaGVuR2V0RXZlbnRzKCksdC5wcm90b3R5cGUubmV4dC5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLl9zdWJzY3JpYmU9ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzLl9pbmZpbml0ZVRpbWVXaW5kb3cscj1uP3RoaXMuX2V2ZW50czp0aGlzLl90cmltQnVmZmVyVGhlbkdldEV2ZW50cygpLGk9dGhpcy5zY2hlZHVsZXIsbz1yLmxlbmd0aDtpZih0aGlzLmNsb3NlZCl0aHJvdyBuZXcgZC5hO2lmKHRoaXMuaXNTdG9wcGVkfHx0aGlzLmhhc0Vycm9yP2U9dS5hLkVNUFRZOih0aGlzLm9ic2VydmVycy5wdXNoKHQpLGU9bmV3IHAuYSh0aGlzLHQpKSxpJiZ0LmFkZCh0PW5ldyBmKHQsaSkpLG4pZm9yKHZhciBhPTA7YTxvJiYhdC5jbG9zZWQ7YSsrKXQubmV4dChyW2FdKTtlbHNlIGZvcihhPTA7YTxvJiYhdC5jbG9zZWQ7YSsrKXQubmV4dChyW2FdLnZhbHVlKTtyZXR1cm4gdGhpcy5oYXNFcnJvcj90LmVycm9yKHRoaXMudGhyb3duRXJyb3IpOnRoaXMuaXNTdG9wcGVkJiZ0LmNvbXBsZXRlKCksZX0sZS5wcm90b3R5cGUuX2dldE5vdz1mdW5jdGlvbigpe3JldHVybih0aGlzLnNjaGVkdWxlcnx8cykubm93KCl9LGUucHJvdG90eXBlLl90cmltQnVmZmVyVGhlbkdldEV2ZW50cz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9nZXROb3coKSxlPXRoaXMuX2J1ZmZlclNpemUsbj10aGlzLl93aW5kb3dUaW1lLHI9dGhpcy5fZXZlbnRzLGk9ci5sZW5ndGgsbz0wO288aSYmISh0LXJbb10udGltZTxuKTspbysrO3JldHVybiBpPmUmJihvPU1hdGgubWF4KG8saS1lKSksbz4wJiZyLnNwbGljZSgwLG8pLHJ9LGV9KG8uYSkseT1mdW5jdGlvbih0LGUpe3RoaXMudGltZT10LHRoaXMudmFsdWU9ZX07bi5kKGUsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIEl9KSxuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gU30pLG4uZChlLCJiIixmdW5jdGlvbigpe3JldHVybiBrfSksbi5kKGUsImUiLGZ1bmN0aW9uKCl7cmV0dXJuIHd9KSxuLmQoZSwiZCIsZnVuY3Rpb24oKXtyZXR1cm4gVH0pLG4uZChlLCJmIixmdW5jdGlvbigpe3JldHVybiB4fSk7dmFyIGc9ImlubGluZSIsdj1bInJvdyIsImNvbHVtbiIsInJvdy1yZXZlcnNlIiwiY29sdW1uLXJldmVyc2UiXTtmdW5jdGlvbiBiKHQpe3ZhciBlPSh0PXQ/dC50b0xvd2VyQ2FzZSgpOiIiKS5zcGxpdCgiICIpLG49ZVswXSxyPWVbMV0saT1lWzJdO3JldHVybiB2LmZpbmQoZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1ufSl8fChuPXZbMF0pLHI9PT1nJiYocj1pIT09Zz9pOiIiLGk9ZyksW24sZnVuY3Rpb24odCl7aWYodClzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlInJldmVyc2UiOmNhc2Uid3JhcC1yZXZlcnNlIjpjYXNlInJldmVyc2Utd3JhcCI6dD0id3JhcC1yZXZlcnNlIjticmVhaztjYXNlIm5vIjpjYXNlIm5vbmUiOmNhc2Uibm93cmFwIjp0PSJub3dyYXAiO2JyZWFrO2RlZmF1bHQ6dD0id3JhcCJ9cmV0dXJuIHR9KHIpLCEhaV19ZnVuY3Rpb24gXyh0KXtyZXR1cm4gYih0KVswXS5pbmRleE9mKCJyb3ciKT4tMX12YXIgdz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt2YXIgaT10LmNhbGwodGhpcyxlLG4scil8fHRoaXM7cmV0dXJuIGkuX2Fubm91bmNlcj1uZXcgbSgxKSxpLmxheW91dCQ9aS5fYW5ub3VuY2VyLmFzT2JzZXJ2YWJsZSgpLGl9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJsYXlvdXQiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgibGF5b3V0Iix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImxheW91dFhzIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImxheW91dFhzIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImxheW91dFNtIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImxheW91dFNtIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImxheW91dE1kIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImxheW91dE1kIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImxheW91dExnIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImxheW91dExnIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImxheW91dFhsIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImxheW91dFhsIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImxheW91dEd0WHMiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgibGF5b3V0R3RYcyIsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJsYXlvdXRHdFNtIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImxheW91dEd0U20iLHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwibGF5b3V0R3RNZCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9jYWNoZUlucHV0KCJsYXlvdXRHdE1kIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImxheW91dEd0TGciLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgibGF5b3V0R3RMZyIsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJsYXlvdXRMdFNtIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImxheW91dEx0U20iLHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwibGF5b3V0THRNZCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9jYWNoZUlucHV0KCJsYXlvdXRMdE1kIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImxheW91dEx0TGciLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgibGF5b3V0THRMZyIsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJsYXlvdXRMdFhsIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImxheW91dEx0WGwiLHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLm5nT25DaGFuZ2VzPWZ1bmN0aW9uKHQpeyhudWxsIT10LmxheW91dHx8dGhpcy5fbXFBY3RpdmF0aW9uKSYmdGhpcy5fdXBkYXRlV2l0aERpcmVjdGlvbigpfSxlLnByb3RvdHlwZS5uZ09uSW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUubmdPbkluaXQuY2FsbCh0aGlzKSx0aGlzLl9saXN0ZW5Gb3JNZWRpYVF1ZXJ5Q2hhbmdlcygibGF5b3V0Iiwicm93IixmdW5jdGlvbih0KXtlLl91cGRhdGVXaXRoRGlyZWN0aW9uKHQudmFsdWUpfSksdGhpcy5fdXBkYXRlV2l0aERpcmVjdGlvbigpfSxlLnByb3RvdHlwZS5fdXBkYXRlV2l0aERpcmVjdGlvbj1mdW5jdGlvbih0KXt0PXR8fHRoaXMuX3F1ZXJ5SW5wdXQoImxheW91dCIpfHwicm93Iix0aGlzLl9tcUFjdGl2YXRpb24mJih0PXRoaXMuX21xQWN0aXZhdGlvbi5hY3RpdmF0ZWRJbnB1dCk7dmFyIGU9ZnVuY3Rpb24odCl7dmFyIGU9Yih0KTtyZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiB2b2lkIDA9PT1uJiYobj1udWxsKSx2b2lkIDA9PT1yJiYocj0hMSkse2Rpc3BsYXk6cj8iaW5saW5lLWZsZXgiOiJmbGV4IiwiYm94LXNpemluZyI6ImJvcmRlci1ib3giLCJmbGV4LWRpcmVjdGlvbiI6ZVswXSwiZmxleC13cmFwIjpufHxudWxsfX0oMCxlWzFdLGVbMl0pfSh0fHwiIik7dGhpcy5fYXBwbHlTdHlsZVRvRWxlbWVudChlKSx0aGlzLl9hbm5vdW5jZXIubmV4dCh7ZGlyZWN0aW9uOmVbImZsZXgtZGlyZWN0aW9uIl0sd3JhcDohIWVbImZsZXgtd3JhcCJdJiYibm93cmFwIiE9PWVbImZsZXgtd3JhcCJdfSl9LGV9KGkuYikseD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyLGksbyxhKXt2YXIgcz10LmNhbGwodGhpcyxlLG4sYSl8fHRoaXM7cmV0dXJuIHMuX3pvbmU9aSxzLl9kaXJlY3Rpb25hbGl0eT1vLHMuX2xheW91dD0icm93IixyJiYocy5fbGF5b3V0V2F0Y2hlcj1yLmxheW91dCQuc3Vic2NyaWJlKHMuX29uTGF5b3V0Q2hhbmdlLmJpbmQocykpKSxzLl9kaXJlY3Rpb25XYXRjaGVyPXMuX2RpcmVjdGlvbmFsaXR5LmNoYW5nZS5zdWJzY3JpYmUocy5fdXBkYXRlV2l0aFZhbHVlLmJpbmQocykpLHN9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJnYXAiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgiZ2FwIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImdhcFhzIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImdhcFhzIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImdhcFNtIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImdhcFNtIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImdhcE1kIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImdhcE1kIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImdhcExnIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImdhcExnIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImdhcFhsIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImdhcFhsIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImdhcEd0WHMiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgiZ2FwR3RYcyIsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJnYXBHdFNtIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImdhcEd0U20iLHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiZ2FwR3RNZCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9jYWNoZUlucHV0KCJnYXBHdE1kIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImdhcEd0TGciLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgiZ2FwR3RMZyIsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJnYXBMdFNtIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImdhcEx0U20iLHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiZ2FwTHRNZCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9jYWNoZUlucHV0KCJnYXBMdE1kIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImdhcEx0TGciLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgiZ2FwTHRMZyIsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJnYXBMdFhsIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImdhcEx0WGwiLHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLm5nT25DaGFuZ2VzPWZ1bmN0aW9uKHQpeyhudWxsIT10LmdhcHx8dGhpcy5fbXFBY3RpdmF0aW9uKSYmdGhpcy5fdXBkYXRlV2l0aFZhbHVlKCl9LGUucHJvdG90eXBlLm5nQWZ0ZXJDb250ZW50SW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fd2F0Y2hDb250ZW50Q2hhbmdlcygpLHRoaXMuX2xpc3RlbkZvck1lZGlhUXVlcnlDaGFuZ2VzKCJnYXAiLCIwIixmdW5jdGlvbihlKXt0Ll91cGRhdGVXaXRoVmFsdWUoZS52YWx1ZSl9KSx0aGlzLl91cGRhdGVXaXRoVmFsdWUoKX0sZS5wcm90b3R5cGUubmdPbkRlc3Ryb3k9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5uZ09uRGVzdHJveS5jYWxsKHRoaXMpLHRoaXMuX2xheW91dFdhdGNoZXImJnRoaXMuX2xheW91dFdhdGNoZXIudW5zdWJzY3JpYmUoKSx0aGlzLl9vYnNlcnZlciYmdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpLHRoaXMuX2RpcmVjdGlvbldhdGNoZXImJnRoaXMuX2RpcmVjdGlvbldhdGNoZXIudW5zdWJzY3JpYmUoKX0sZS5wcm90b3R5cGUuX3dhdGNoQ29udGVudENoYW5nZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24oKXsidW5kZWZpbmVkIiE9dHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXImJih0Ll9vYnNlcnZlcj1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihlKXtlLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIHQuYWRkZWROb2RlcyYmdC5hZGRlZE5vZGVzLmxlbmd0aD4wfHx0LnJlbW92ZWROb2RlcyYmdC5yZW1vdmVkTm9kZXMubGVuZ3RoPjB9KSYmdC5fdXBkYXRlV2l0aFZhbHVlKCl9KSx0Ll9vYnNlcnZlci5vYnNlcnZlKHQubmF0aXZlRWxlbWVudCx7Y2hpbGRMaXN0OiEwfSkpfSl9LGUucHJvdG90eXBlLl9vbkxheW91dENoYW5nZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX2xheW91dD0odC5kaXJlY3Rpb258fCIiKS50b0xvd2VyQ2FzZSgpLHYuZmluZChmdW5jdGlvbih0KXtyZXR1cm4gdD09PWUuX2xheW91dH0pfHwodGhpcy5fbGF5b3V0PSJyb3ciKSx0aGlzLl91cGRhdGVXaXRoVmFsdWUoKX0sZS5wcm90b3R5cGUuX3VwZGF0ZVdpdGhWYWx1ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dHx8dGhpcy5fcXVlcnlJbnB1dCgiZ2FwIil8fCIwIjt0aGlzLl9tcUFjdGl2YXRpb24mJihuPXRoaXMuX21xQWN0aXZhdGlvbi5hY3RpdmF0ZWRJbnB1dCk7dmFyIHI9dGhpcy5jaGlsZHJlbk5vZGVzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQubm9kZVR5cGUmJiJub25lIiE9ZS5fZ2V0RGlzcGxheVN0eWxlKHQpfSkuc29ydChmdW5jdGlvbih0LG4pe3ZhciByPStlLl9zdHlsZXIubG9va3VwU3R5bGUodCwib3JkZXIiKSxpPStlLl9zdHlsZXIubG9va3VwU3R5bGUobiwib3JkZXIiKTtyZXR1cm4gaXNOYU4ocil8fGlzTmFOKGkpfHxyPT09aT8wOnI+aT8xOi0xfSk7aWYoci5sZW5ndGg+MClpZihuLmVuZHNXaXRoKE8pKW49bi5zdWJzdHJpbmcoMCxuLmluZGV4T2YoTykpLHRoaXMuX2FwcGx5U3R5bGVUb0VsZW1lbnRzKHRoaXMuX2J1aWxkR3JpZFBhZGRpbmcobiksciksdGhpcy5fYXBwbHlTdHlsZVRvRWxlbWVudCh0aGlzLl9idWlsZEdyaWRNYXJnaW4obikpO2Vsc2V7dmFyIGk9ci5wb3AoKTt0aGlzLl9hcHBseVN0eWxlVG9FbGVtZW50cyh0aGlzLl9idWlsZENTUyhuKSxyKSx0aGlzLl9hcHBseVN0eWxlVG9FbGVtZW50cyh0aGlzLl9idWlsZENTUygpLFtpXSl9fSxlLnByb3RvdHlwZS5fYnVpbGRHcmlkUGFkZGluZz1mdW5jdGlvbih0KXt2YXIgZT0iMHB4IixuPSIwcHgiO3JldHVybiJydGwiPT09dGhpcy5fZGlyZWN0aW9uYWxpdHkudmFsdWU/bj10OmU9dCx7cGFkZGluZzoiMHB4ICIrZSsiICIrdCsiICIrbn19LGUucHJvdG90eXBlLl9idWlsZEdyaWRNYXJnaW49ZnVuY3Rpb24odCl7dmFyIGU9IjBweCIsbj0iMHB4IjtyZXR1cm4icnRsIj09PXRoaXMuX2RpcmVjdGlvbmFsaXR5LnZhbHVlP249Ii0iK3Q6ZT0iLSIrdCx7bWFyZ2luOiIwcHggIitlKyIgLSIrdCsiICIrbn19LGUucHJvdG90eXBlLl9idWlsZENTUz1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD1udWxsKTt2YXIgZSxuPXsibWFyZ2luLWxlZnQiOm51bGwsIm1hcmdpbi1yaWdodCI6bnVsbCwibWFyZ2luLXRvcCI6bnVsbCwibWFyZ2luLWJvdHRvbSI6bnVsbH07c3dpdGNoKHRoaXMuX2xheW91dCl7Y2FzZSJjb2x1bW4iOmU9Im1hcmdpbi1ib3R0b20iO2JyZWFrO2Nhc2UiY29sdW1uLXJldmVyc2UiOmU9Im1hcmdpbi10b3AiO2JyZWFrO2Nhc2Uicm93IjplPSJydGwiPT09dGhpcy5fZGlyZWN0aW9uYWxpdHkudmFsdWU/Im1hcmdpbi1sZWZ0IjoibWFyZ2luLXJpZ2h0IjticmVhaztjYXNlInJvdy1yZXZlcnNlIjplPSJydGwiPT09dGhpcy5fZGlyZWN0aW9uYWxpdHkudmFsdWU/Im1hcmdpbi1yaWdodCI6Im1hcmdpbi1sZWZ0IjticmVhaztkZWZhdWx0OmU9InJ0bCI9PT10aGlzLl9kaXJlY3Rpb25hbGl0eS52YWx1ZT8ibWFyZ2luLWxlZnQiOiJtYXJnaW4tcmlnaHQifXJldHVybiBuW2VdPXQsbn0sZX0oaS5iKSxPPSIgZ3JpZCI7ZnVuY3Rpb24gQyh0KXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuLTFdPWFyZ3VtZW50c1tuXTtpZihudWxsPT10KXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7Zm9yKHZhciByPTAsaT1lO3I8aS5sZW5ndGg7cisrKXt2YXIgbz1pW3JdO2lmKG51bGwhPW8pZm9yKHZhciBhIGluIG8pby5oYXNPd25Qcm9wZXJ0eShhKSYmKHRbYV09b1thXSl9cmV0dXJuIHR9dmFyIFM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scixpLG8pe3ZhciBhPXQuY2FsbCh0aGlzLGUsbixpKXx8dGhpcztyZXR1cm4gYS5fY29udGFpbmVyPXIsYS5zdHlsZVV0aWxzPWksYS5sYXlvdXRDb25maWc9byxhLl9jYWNoZUlucHV0KCJmbGV4IiwiIiksYS5fY2FjaGVJbnB1dCgic2hyaW5rIiwxKSxhLl9jYWNoZUlucHV0KCJncm93IiwxKSxyJiYoYS5fbGF5b3V0V2F0Y2hlcj1yLmxheW91dCQuc3Vic2NyaWJlKGZ1bmN0aW9uKHQpe2EuX29uTGF5b3V0Q2hhbmdlKHQpfSkpLGF9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJzaHJpbmsiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgic2hyaW5rIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImdyb3ciLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgiZ3JvdyIsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJmbGV4Iix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImZsZXgiLHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiZmxleFhzIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImZsZXhYcyIsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJmbGV4U20iLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgiZmxleFNtIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImZsZXhNZCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9jYWNoZUlucHV0KCJmbGV4TWQiLHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiZmxleExnIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImZsZXhMZyIsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJmbGV4WGwiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgiZmxleFhsIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImZsZXhHdFhzIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImZsZXhHdFhzIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImZsZXhHdFNtIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImZsZXhHdFNtIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImZsZXhHdE1kIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImZsZXhHdE1kIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImZsZXhHdExnIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImZsZXhHdExnIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImZsZXhMdFNtIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImZsZXhMdFNtIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImZsZXhMdE1kIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImZsZXhMdE1kIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImZsZXhMdExnIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImZsZXhMdExnIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImZsZXhMdFhsIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImZsZXhMdFhsIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5uZ09uQ2hhbmdlcz1mdW5jdGlvbih0KXsobnVsbCE9dC5mbGV4fHx0aGlzLl9tcUFjdGl2YXRpb24pJiZ0aGlzLl91cGRhdGVTdHlsZSgpfSxlLnByb3RvdHlwZS5uZ09uSW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUubmdPbkluaXQuY2FsbCh0aGlzKSx0aGlzLl9saXN0ZW5Gb3JNZWRpYVF1ZXJ5Q2hhbmdlcygiZmxleCIsIiIsZnVuY3Rpb24odCl7ZS5fdXBkYXRlU3R5bGUodC52YWx1ZSl9KSx0aGlzLl91cGRhdGVTdHlsZSgpfSxlLnByb3RvdHlwZS5uZ09uRGVzdHJveT1mdW5jdGlvbigpe3QucHJvdG90eXBlLm5nT25EZXN0cm95LmNhbGwodGhpcyksdGhpcy5fbGF5b3V0V2F0Y2hlciYmdGhpcy5fbGF5b3V0V2F0Y2hlci51bnN1YnNjcmliZSgpfSxlLnByb3RvdHlwZS5fb25MYXlvdXRDaGFuZ2U9ZnVuY3Rpb24odCl7dGhpcy5fbGF5b3V0PXR8fHRoaXMuX2xheW91dHx8e2RpcmVjdGlvbjoicm93Iix3cmFwOiExfSx0aGlzLl91cGRhdGVTdHlsZSgpfSxlLnByb3RvdHlwZS5fdXBkYXRlU3R5bGU9ZnVuY3Rpb24odCl7dmFyIGU9dHx8dGhpcy5fcXVlcnlJbnB1dCgiZmxleCIpfHwiIjt0aGlzLl9tcUFjdGl2YXRpb24mJihlPXRoaXMuX21xQWN0aXZhdGlvbi5hY3RpdmF0ZWRJbnB1dCk7dmFyIG49U3RyaW5nKGUpLnJlcGxhY2UoIjsiLCIiKSxyPU9iamVjdChpLm8pKG4sdGhpcy5fcXVlcnlJbnB1dCgiZ3JvdyIpLHRoaXMuX3F1ZXJ5SW5wdXQoInNocmluayIpKTt0aGlzLl9hcHBseVN0eWxlVG9FbGVtZW50KHRoaXMuX3ZhbGlkYXRlVmFsdWUuYXBwbHkodGhpcyxyKSl9LGUucHJvdG90eXBlLl92YWxpZGF0ZVZhbHVlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLl9nZXRGbGV4Rmxvd0RpcmVjdGlvbih0aGlzLnBhcmVudEVsZW1lbnQsdGhpcy5sYXlvdXRDb25maWcuYWRkRmxleFRvUGFyZW50KS5pbmRleE9mKCJjb2x1bW4iKT4tMT8iY29sdW1uIjoicm93IixpPV8ocik/Im1heC13aWR0aCI6Im1heC1oZWlnaHQiLG89XyhyKT8ibWluLXdpZHRoIjoibWluLWhlaWdodCIsYT1TdHJpbmcobikuaW5kZXhPZigiY2FsYyIpPi0xLHM9YXx8ImF1dG8iPT1uLHU9U3RyaW5nKG4pLmluZGV4T2YoIiUiKT4tMSYmIWEsbD1TdHJpbmcobikuaW5kZXhPZigicHgiKT4tMXx8U3RyaW5nKG4pLmluZGV4T2YoImVtIik+LTF8fFN0cmluZyhuKS5pbmRleE9mKCJ2dyIpPi0xfHxTdHJpbmcobikuaW5kZXhPZigidmgiKT4tMSxjPVN0cmluZyhuKS5pbmRleE9mKCJweCIpPi0xfHxzLGY9YXx8bDt0PSIwIj09dD8wOnQsZT0iMCI9PWU/MDplO3ZhciBoPSF0JiYhZSxkPXt9LHA9eyJtYXgtd2lkdGgiOm51bGwsIm1heC1oZWlnaHQiOm51bGwsIm1pbi13aWR0aCI6bnVsbCwibWluLWhlaWdodCI6bnVsbH07c3dpdGNoKG58fCIiKXtjYXNlIiI6bj0icm93Ij09PXI/IjAlIjp0aGlzLmxheW91dENvbmZpZy51c2VDb2x1bW5CYXNpc1plcm8/IjAuMDAwMDAwMDAxcHgiOiJhdXRvIjticmVhaztjYXNlImluaXRpYWwiOmNhc2Uibm9ncm93Ijp0PTAsbj0iYXV0byI7YnJlYWs7Y2FzZSJncm93IjpuPSIxMDAlIjticmVhaztjYXNlIm5vc2hyaW5rIjplPTAsbj0iYXV0byI7YnJlYWs7Y2FzZSJhdXRvIjpicmVhaztjYXNlIm5vbmUiOnQ9MCxlPTAsbj0iYXV0byI7YnJlYWs7ZGVmYXVsdDpmfHx1fHxpc05hTihuKXx8KG4rPSIlIiksIjAlIj09PW4mJihmPSEwKSwiMHB4Ij09PW4mJihuPSIwJSIpLGQ9QyhwLGE/eyJmbGV4LWdyb3ciOnQsImZsZXgtc2hyaW5rIjplLCJmbGV4LWJhc2lzIjpmP246IjEwMCUifTp7ZmxleDp0KyIgIitlKyIgIisoZj9uOiIxMDAlIil9KX1yZXR1cm4gZC5mbGV4fHxkWyJmbGV4LWdyb3ciXXx8KGQ9QyhwLGE/eyJmbGV4LWdyb3ciOnQsImZsZXgtc2hyaW5rIjplLCJmbGV4LWJhc2lzIjpufTp7ZmxleDp0KyIgIitlKyIgIitufSkpLCIwJSIhPT1uJiYiMHB4IiE9PW4mJiIwLjAwMDAwMDAwMXB4IiE9PW4mJiJhdXRvIiE9PW4mJihkW29dPWh8fGMmJnQ/bjpudWxsLGRbaV09aHx8IXMmJmU/bjpudWxsKSxkW29dfHxkW2ldP3RoaXMuX2xheW91dCYmdGhpcy5fbGF5b3V0LndyYXAmJihkW2E/ImZsZXgtYmFzaXMiOiJmbGV4Il09ZFtpXT9hP2RbaV06dCsiICIrZSsiICIrZFtpXTphP2Rbb106dCsiICIrZSsiICIrZFtvXSk6ZD1DKHAsYT97ImZsZXgtZ3JvdyI6dCwiZmxleC1zaHJpbmsiOmUsImZsZXgtYmFzaXMiOm59OntmbGV4OnQrIiAiK2UrIiAiK259KSxDKGQseyJib3gtc2l6aW5nIjoiYm9yZGVyLWJveCJ9KX0sZX0oaS5iKSxFPXttYXJnaW46MCx3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIiwibWluLXdpZHRoIjoiMTAwJSIsIm1pbi1oZWlnaHQiOiIxMDAlIn0saz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt2YXIgaT10LmNhbGwodGhpcyxlLG4scil8fHRoaXM7cmV0dXJuIGkuZWxSZWY9bixpLl9hcHBseVN0eWxlVG9FbGVtZW50KEUpLGl9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZX0oaS5iKSxUPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIsaSl7dmFyIG89dC5jYWxsKHRoaXMsZSxuLGkpfHx0aGlzO3JldHVybiBvLl9sYXlvdXQ9InJvdyIsciYmKG8uX2xheW91dFdhdGNoZXI9ci5sYXlvdXQkLnN1YnNjcmliZShvLl9vbkxheW91dENoYW5nZS5iaW5kKG8pKSksb31yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFsaWduIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImFsaWduIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFsaWduWHMiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgiYWxpZ25YcyIsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJhbGlnblNtIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImFsaWduU20iLHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiYWxpZ25NZCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9jYWNoZUlucHV0KCJhbGlnbk1kIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFsaWduTGciLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgiYWxpZ25MZyIsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJhbGlnblhsIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImFsaWduWGwiLHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiYWxpZ25HdFhzIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImFsaWduR3RYcyIsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJhbGlnbkd0U20iLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgiYWxpZ25HdFNtIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFsaWduR3RNZCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9jYWNoZUlucHV0KCJhbGlnbkd0TWQiLHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiYWxpZ25HdExnIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImFsaWduR3RMZyIsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJhbGlnbkx0U20iLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgiYWxpZ25MdFNtIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFsaWduTHRNZCIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9jYWNoZUlucHV0KCJhbGlnbkx0TWQiLHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiYWxpZ25MdExnIix7c2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2NhY2hlSW5wdXQoImFsaWduTHRMZyIsdCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJhbGlnbkx0WGwiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fY2FjaGVJbnB1dCgiYWxpZ25MdFhsIix0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5uZ09uQ2hhbmdlcz1mdW5jdGlvbih0KXsobnVsbCE9dC5hbGlnbnx8dGhpcy5fbXFBY3RpdmF0aW9uKSYmdGhpcy5fdXBkYXRlV2l0aFZhbHVlKCl9LGUucHJvdG90eXBlLm5nT25Jbml0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0LnByb3RvdHlwZS5uZ09uSW5pdC5jYWxsKHRoaXMpLHRoaXMuX2xpc3RlbkZvck1lZGlhUXVlcnlDaGFuZ2VzKCJhbGlnbiIsInN0YXJ0IHN0cmV0Y2giLGZ1bmN0aW9uKHQpe2UuX3VwZGF0ZVdpdGhWYWx1ZSh0LnZhbHVlKX0pLHRoaXMuX3VwZGF0ZVdpdGhWYWx1ZSgpfSxlLnByb3RvdHlwZS5uZ09uRGVzdHJveT1mdW5jdGlvbigpe3QucHJvdG90eXBlLm5nT25EZXN0cm95LmNhbGwodGhpcyksdGhpcy5fbGF5b3V0V2F0Y2hlciYmdGhpcy5fbGF5b3V0V2F0Y2hlci51bnN1YnNjcmliZSgpfSxlLnByb3RvdHlwZS5fdXBkYXRlV2l0aFZhbHVlPWZ1bmN0aW9uKHQpe3Q9dHx8dGhpcy5fcXVlcnlJbnB1dCgiYWxpZ24iKXx8InN0YXJ0IHN0cmV0Y2giLHRoaXMuX21xQWN0aXZhdGlvbiYmKHQ9dGhpcy5fbXFBY3RpdmF0aW9uLmFjdGl2YXRlZElucHV0KSx0aGlzLl9hcHBseVN0eWxlVG9FbGVtZW50KHRoaXMuX2J1aWxkQ1NTKHQpKSx0aGlzLl9hbGxvd1N0cmV0Y2hpbmcodCx0aGlzLl9sYXlvdXQ/dGhpcy5fbGF5b3V0OiJyb3ciKX0sZS5wcm90b3R5cGUuX29uTGF5b3V0Q2hhbmdlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5fbGF5b3V0PSh0LmRpcmVjdGlvbnx8IiIpLnRvTG93ZXJDYXNlKCksdi5maW5kKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZS5fbGF5b3V0fSl8fCh0aGlzLl9sYXlvdXQ9InJvdyIpO3ZhciBuPXRoaXMuX3F1ZXJ5SW5wdXQoImFsaWduIil8fCJzdGFydCBzdHJldGNoIjt0aGlzLl9tcUFjdGl2YXRpb24mJihuPXRoaXMuX21xQWN0aXZhdGlvbi5hY3RpdmF0ZWRJbnB1dCksdGhpcy5fYWxsb3dTdHJldGNoaW5nKG4sdGhpcy5fbGF5b3V0fHwicm93Iil9LGUucHJvdG90eXBlLl9idWlsZENTUz1mdW5jdGlvbih0KXt2YXIgZT17fSxuPXQuc3BsaXQoIiAiKSxyPW5bMV07c3dpdGNoKG5bMF0pe2Nhc2UiY2VudGVyIjplWyJqdXN0aWZ5LWNvbnRlbnQiXT0iY2VudGVyIjticmVhaztjYXNlInNwYWNlLWFyb3VuZCI6ZVsianVzdGlmeS1jb250ZW50Il09InNwYWNlLWFyb3VuZCI7YnJlYWs7Y2FzZSJzcGFjZS1iZXR3ZWVuIjplWyJqdXN0aWZ5LWNvbnRlbnQiXT0ic3BhY2UtYmV0d2VlbiI7YnJlYWs7Y2FzZSJzcGFjZS1ldmVubHkiOmVbImp1c3RpZnktY29udGVudCJdPSJzcGFjZS1ldmVubHkiO2JyZWFrO2Nhc2UiZW5kIjpjYXNlImZsZXgtZW5kIjplWyJqdXN0aWZ5LWNvbnRlbnQiXT0iZmxleC1lbmQiO2JyZWFrO2Nhc2Uic3RhcnQiOmNhc2UiZmxleC1zdGFydCI6ZGVmYXVsdDplWyJqdXN0aWZ5LWNvbnRlbnQiXT0iZmxleC1zdGFydCJ9c3dpdGNoKHIpe2Nhc2Uic3RhcnQiOmNhc2UiZmxleC1zdGFydCI6ZVsiYWxpZ24taXRlbXMiXT1lWyJhbGlnbi1jb250ZW50Il09ImZsZXgtc3RhcnQiO2JyZWFrO2Nhc2UiYmFzZWxpbmUiOmVbImFsaWduLWl0ZW1zIl09ImJhc2VsaW5lIjticmVhaztjYXNlImNlbnRlciI6ZVsiYWxpZ24taXRlbXMiXT1lWyJhbGlnbi1jb250ZW50Il09ImNlbnRlciI7YnJlYWs7Y2FzZSJlbmQiOmNhc2UiZmxleC1lbmQiOmVbImFsaWduLWl0ZW1zIl09ZVsiYWxpZ24tY29udGVudCJdPSJmbGV4LWVuZCI7YnJlYWs7Y2FzZSJzdHJldGNoIjpkZWZhdWx0OmVbImFsaWduLWl0ZW1zIl09ZVsiYWxpZ24tY29udGVudCJdPSJzdHJldGNoIn1yZXR1cm4gQyhlLHtkaXNwbGF5OiJmbGV4IiwiZmxleC1kaXJlY3Rpb24iOnRoaXMuX2xheW91dHx8InJvdyIsImJveC1zaXppbmciOiJib3JkZXItYm94In0pfSxlLnByb3RvdHlwZS5fYWxsb3dTdHJldGNoaW5nPWZ1bmN0aW9uKHQsZSl7InN0cmV0Y2giPT10LnNwbGl0KCIgIilbMV0mJnRoaXMuX2FwcGx5U3R5bGVUb0VsZW1lbnQoeyJib3gtc2l6aW5nIjoiYm9yZGVyLWJveCIsIm1heC13aWR0aCI6XyhlKT9udWxsOiIxMDAlIiwibWF4LWhlaWdodCI6XyhlKT8iMTAwJSI6bnVsbH0pfSxlfShpLmIpLEk9ZnVuY3Rpb24oKXt9fSwiMjZGVSI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pO3ZhciByPW4oIm1yU0ciKSxpPW4oIks5SWEiKSxvPW4oIjhnOEEiKSxhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLl92YWx1ZT1lLG59cmV0dXJuIHIuYihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwidmFsdWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLl9zdWJzY3JpYmU9ZnVuY3Rpb24oZSl7dmFyIG49dC5wcm90b3R5cGUuX3N1YnNjcmliZS5jYWxsKHRoaXMsZSk7cmV0dXJuIG4mJiFuLmNsb3NlZCYmZS5uZXh0KHRoaXMuX3ZhbHVlKSxufSxlLnByb3RvdHlwZS5nZXRWYWx1ZT1mdW5jdGlvbigpe2lmKHRoaXMuaGFzRXJyb3IpdGhyb3cgdGhpcy50aHJvd25FcnJvcjtpZih0aGlzLmNsb3NlZCl0aHJvdyBuZXcgby5hO3JldHVybiB0aGlzLl92YWx1ZX0sZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5uZXh0LmNhbGwodGhpcyx0aGlzLl92YWx1ZT1lKX0sZX0oaS5hKX0sIjJCZGoiOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1uLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pfSwiMmVQbCI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pO3ZhciByPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoJiYiZnVuY3Rpb24iIT10eXBlb2YgdH19LCIzcEpRIjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiByfSksbigibXJTRyIpLG4oIk96ZkIiKSxuKCJuNmdHIik7dmFyIHI9ZnVuY3Rpb24oKXt9fSw0OmZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigielVuYiIpfSwiNGMzNSI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiZCIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pLG4uZChlLCJiIixmdW5jdGlvbigpe3JldHVybiBjfSksbi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSxuLmQoZSwiYyIsZnVuY3Rpb24oKXtyZXR1cm4gaH0pO3ZhciByPW4oIm1yU0ciKSxpPW4oIkNjbkciKTtmdW5jdGlvbiBvKCl7dGhyb3cgRXJyb3IoIkhvc3QgYWxyZWFkeSBoYXMgYSBwb3J0YWwgYXR0YWNoZWQiKX12YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmF0dGFjaD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dCYmZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiQXR0ZW1wdGluZyB0byBhdHRhY2ggYSBwb3J0YWwgdG8gYSBudWxsIFBvcnRhbE91dGxldCIpfSgpLHQuaGFzQXR0YWNoZWQoKSYmbygpLHRoaXMuX2F0dGFjaGVkSG9zdD10LHQuYXR0YWNoKHRoaXMpfSx0LnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9hdHRhY2hlZEhvc3Q7bnVsbD09dD9mdW5jdGlvbigpe3Rocm93IEVycm9yKCJBdHRlbXB0aW5nIHRvIGRldGFjaCBhIHBvcnRhbCB0aGF0IGlzIG5vdCBhdHRhY2hlZCB0byBhIGhvc3QiKX0oKToodGhpcy5fYXR0YWNoZWRIb3N0PW51bGwsdC5kZXRhY2goKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNBdHRhY2hlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiBudWxsIT10aGlzLl9hdHRhY2hlZEhvc3R9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuc2V0QXR0YWNoZWRIb3N0PWZ1bmN0aW9uKHQpe3RoaXMuX2F0dGFjaGVkSG9zdD10fSx0fSgpLHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scil7dmFyIGk9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBpLmNvbXBvbmVudD1lLGkudmlld0NvbnRhaW5lclJlZj1uLGkuaW5qZWN0b3I9cixpfXJldHVybiBPYmplY3Qoci5iKShlLHQpLGV9KGEpLHU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scil7dmFyIGk9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBpLnRlbXBsYXRlUmVmPWUsaS52aWV3Q29udGFpbmVyUmVmPW4saS5jb250ZXh0PXIsaX1yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIm9yaWdpbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRlbXBsYXRlUmVmLmVsZW1lbnRSZWZ9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuYXR0YWNoPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPXRoaXMuY29udGV4dCksdGhpcy5jb250ZXh0PW4sdC5wcm90b3R5cGUuYXR0YWNoLmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGV4dD12b2lkIDAsdC5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyl9LGV9KGEpLGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5faXNEaXNwb3NlZD0hMX1yZXR1cm4gdC5wcm90b3R5cGUuaGFzQXR0YWNoZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX2F0dGFjaGVkUG9ydGFsfSx0LnByb3RvdHlwZS5hdHRhY2g9ZnVuY3Rpb24odCl7cmV0dXJuIHR8fGZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIk11c3QgcHJvdmlkZSBhIHBvcnRhbCB0byBhdHRhY2giKX0oKSx0aGlzLmhhc0F0dGFjaGVkKCkmJm8oKSx0aGlzLl9pc0Rpc3Bvc2VkJiZmdW5jdGlvbigpe3Rocm93IEVycm9yKCJUaGlzIFBvcnRhbE91dGxldCBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkIil9KCksdCBpbnN0YW5jZW9mIHM/KHRoaXMuX2F0dGFjaGVkUG9ydGFsPXQsdGhpcy5hdHRhY2hDb21wb25lbnRQb3J0YWwodCkpOnQgaW5zdGFuY2VvZiB1Pyh0aGlzLl9hdHRhY2hlZFBvcnRhbD10LHRoaXMuYXR0YWNoVGVtcGxhdGVQb3J0YWwodCkpOnZvaWQgZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiQXR0ZW1wdGluZyB0byBhdHRhY2ggYW4gdW5rbm93biBQb3J0YWwgdHlwZS4gQmFzZVBvcnRhbE91dGxldCBhY2NlcHRzIGVpdGhlciBhIENvbXBvbmVudFBvcnRhbCBvciBhIFRlbXBsYXRlUG9ydGFsLiIpfSgpfSx0LnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZFBvcnRhbCYmKHRoaXMuX2F0dGFjaGVkUG9ydGFsLnNldEF0dGFjaGVkSG9zdChudWxsKSx0aGlzLl9hdHRhY2hlZFBvcnRhbD1udWxsKSx0aGlzLl9pbnZva2VEaXNwb3NlRm4oKX0sdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuaGFzQXR0YWNoZWQoKSYmdGhpcy5kZXRhY2goKSx0aGlzLl9pbnZva2VEaXNwb3NlRm4oKSx0aGlzLl9pc0Rpc3Bvc2VkPSEwfSx0LnByb3RvdHlwZS5zZXREaXNwb3NlRm49ZnVuY3Rpb24odCl7dGhpcy5fZGlzcG9zZUZuPXR9LHQucHJvdG90eXBlLl9pbnZva2VEaXNwb3NlRm49ZnVuY3Rpb24oKXt0aGlzLl9kaXNwb3NlRm4mJih0aGlzLl9kaXNwb3NlRm4oKSx0aGlzLl9kaXNwb3NlRm49bnVsbCl9LHR9KCksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyLGkpe3ZhciBvPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gby5vdXRsZXRFbGVtZW50PWUsby5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyPW4sby5fYXBwUmVmPXIsby5fZGVmYXVsdEluamVjdG9yPWksb31yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5hdHRhY2hDb21wb25lbnRQb3J0YWw9ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzLHI9dGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHQuY29tcG9uZW50KTtyZXR1cm4gdC52aWV3Q29udGFpbmVyUmVmPyhlPXQudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQocix0LnZpZXdDb250YWluZXJSZWYubGVuZ3RoLHQuaW5qZWN0b3J8fHQudmlld0NvbnRhaW5lclJlZi5wYXJlbnRJbmplY3RvciksdGhpcy5zZXREaXNwb3NlRm4oZnVuY3Rpb24oKXtyZXR1cm4gZS5kZXN0cm95KCl9KSk6KGU9ci5jcmVhdGUodC5pbmplY3Rvcnx8dGhpcy5fZGVmYXVsdEluamVjdG9yKSx0aGlzLl9hcHBSZWYuYXR0YWNoVmlldyhlLmhvc3RWaWV3KSx0aGlzLnNldERpc3Bvc2VGbihmdW5jdGlvbigpe24uX2FwcFJlZi5kZXRhY2hWaWV3KGUuaG9zdFZpZXcpLGUuZGVzdHJveSgpfSkpLHRoaXMub3V0bGV0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9nZXRDb21wb25lbnRSb290Tm9kZShlKSksZX0sZS5wcm90b3R5cGUuYXR0YWNoVGVtcGxhdGVQb3J0YWw9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXQudmlld0NvbnRhaW5lclJlZixyPW4uY3JlYXRlRW1iZWRkZWRWaWV3KHQudGVtcGxhdGVSZWYsdC5jb250ZXh0KTtyZXR1cm4gci5kZXRlY3RDaGFuZ2VzKCksci5yb290Tm9kZXMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5vdXRsZXRFbGVtZW50LmFwcGVuZENoaWxkKHQpfSksdGhpcy5zZXREaXNwb3NlRm4oZnVuY3Rpb24oKXt2YXIgdD1uLmluZGV4T2Yocik7LTEhPT10JiZuLnJlbW92ZSh0KX0pLHJ9LGUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyksbnVsbCE9dGhpcy5vdXRsZXRFbGVtZW50LnBhcmVudE5vZGUmJnRoaXMub3V0bGV0RWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMub3V0bGV0RWxlbWVudCl9LGUucHJvdG90eXBlLl9nZXRDb21wb25lbnRSb290Tm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5ob3N0Vmlldy5yb290Tm9kZXNbMF19LGV9KGwpLGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciByPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gci5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyPWUsci5fdmlld0NvbnRhaW5lclJlZj1uLHIuX2lzSW5pdGlhbGl6ZWQ9ITEsci5hdHRhY2hlZD1uZXcgaS5tLHJ9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJwb3J0YWwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXR0YWNoZWRQb3J0YWx9LHNldDpmdW5jdGlvbihlKXsoIXRoaXMuaGFzQXR0YWNoZWQoKXx8ZXx8dGhpcy5faXNJbml0aWFsaXplZCkmJih0aGlzLmhhc0F0dGFjaGVkKCkmJnQucHJvdG90eXBlLmRldGFjaC5jYWxsKHRoaXMpLGUmJnQucHJvdG90eXBlLmF0dGFjaC5jYWxsKHRoaXMsZSksdGhpcy5fYXR0YWNoZWRQb3J0YWw9ZSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJhdHRhY2hlZFJlZiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hdHRhY2hlZFJlZn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5uZ09uSW5pdD1mdW5jdGlvbigpe3RoaXMuX2lzSW5pdGlhbGl6ZWQ9ITB9LGUucHJvdG90eXBlLm5nT25EZXN0cm95PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpLHRoaXMuX2F0dGFjaGVkUG9ydGFsPW51bGwsdGhpcy5fYXR0YWNoZWRSZWY9bnVsbH0sZS5wcm90b3R5cGUuYXR0YWNoQ29tcG9uZW50UG9ydGFsPWZ1bmN0aW9uKGUpe2Uuc2V0QXR0YWNoZWRIb3N0KHRoaXMpO3ZhciBuPW51bGwhPWUudmlld0NvbnRhaW5lclJlZj9lLnZpZXdDb250YWluZXJSZWY6dGhpcy5fdmlld0NvbnRhaW5lclJlZixyPXRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShlLmNvbXBvbmVudCksaT1uLmNyZWF0ZUNvbXBvbmVudChyLG4ubGVuZ3RoLGUuaW5qZWN0b3J8fG4ucGFyZW50SW5qZWN0b3IpO3JldHVybiB0LnByb3RvdHlwZS5zZXREaXNwb3NlRm4uY2FsbCh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGkuZGVzdHJveSgpfSksdGhpcy5fYXR0YWNoZWRQb3J0YWw9ZSx0aGlzLl9hdHRhY2hlZFJlZj1pLHRoaXMuYXR0YWNoZWQuZW1pdChpKSxpfSxlLnByb3RvdHlwZS5hdHRhY2hUZW1wbGF0ZVBvcnRhbD1mdW5jdGlvbihlKXt2YXIgbj10aGlzO2Uuc2V0QXR0YWNoZWRIb3N0KHRoaXMpO3ZhciByPXRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KGUudGVtcGxhdGVSZWYsZS5jb250ZXh0KTtyZXR1cm4gdC5wcm90b3R5cGUuc2V0RGlzcG9zZUZuLmNhbGwodGhpcyxmdW5jdGlvbigpe3JldHVybiBuLl92aWV3Q29udGFpbmVyUmVmLmNsZWFyKCl9KSx0aGlzLl9hdHRhY2hlZFBvcnRhbD1lLHRoaXMuX2F0dGFjaGVkUmVmPXIsdGhpcy5hdHRhY2hlZC5lbWl0KHIpLHJ9LGV9KGwpLGg9ZnVuY3Rpb24oKXt9fSwiNjBpVSI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pO3ZhciByPW4oIkc1SjEiKSxpPW4oIkYvWEwiKSxvPW4oIlhsUHciKSxhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5raW5kPXQsdGhpcy52YWx1ZT1lLHRoaXMuZXJyb3I9bix0aGlzLmhhc1ZhbHVlPSJOIj09PXR9cmV0dXJuIHQucHJvdG90eXBlLm9ic2VydmU9ZnVuY3Rpb24odCl7c3dpdGNoKHRoaXMua2luZCl7Y2FzZSJOIjpyZXR1cm4gdC5uZXh0JiZ0Lm5leHQodGhpcy52YWx1ZSk7Y2FzZSJFIjpyZXR1cm4gdC5lcnJvciYmdC5lcnJvcih0aGlzLmVycm9yKTtjYXNlIkMiOnJldHVybiB0LmNvbXBsZXRlJiZ0LmNvbXBsZXRlKCl9fSx0LnByb3RvdHlwZS5kbz1mdW5jdGlvbih0LGUsbil7c3dpdGNoKHRoaXMua2luZCl7Y2FzZSJOIjpyZXR1cm4gdCYmdCh0aGlzLnZhbHVlKTtjYXNlIkUiOnJldHVybiBlJiZlKHRoaXMuZXJyb3IpO2Nhc2UiQyI6cmV0dXJuIG4mJm4oKX19LHQucHJvdG90eXBlLmFjY2VwdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm5leHQ/dGhpcy5vYnNlcnZlKHQpOnRoaXMuZG8odCxlLG4pfSx0LnByb3RvdHlwZS50b09ic2VydmFibGU9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5raW5kKXtjYXNlIk4iOnJldHVybiBPYmplY3QoaS5hKSh0aGlzLnZhbHVlKTtjYXNlIkUiOnJldHVybiBPYmplY3Qoby5hKSh0aGlzLmVycm9yKTtjYXNlIkMiOnJldHVybiBPYmplY3Qoci5iKSgpfXRocm93IG5ldyBFcnJvcigidW5leHBlY3RlZCBub3RpZmljYXRpb24ga2luZCB2YWx1ZSIpfSx0LmNyZWF0ZU5leHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWU/bmV3IHQoIk4iLGUpOnQudW5kZWZpbmVkVmFsdWVOb3RpZmljYXRpb259LHQuY3JlYXRlRXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0KCJFIix2b2lkIDAsZSl9LHQuY3JlYXRlQ29tcGxldGU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb21wbGV0ZU5vdGlmaWNhdGlvbn0sdC5jb21wbGV0ZU5vdGlmaWNhdGlvbj1uZXcgdCgiQyIpLHQudW5kZWZpbmVkVmFsdWVOb3RpZmljYXRpb249bmV3IHQoIk4iLHZvaWQgMCksdH0oKX0sIjY3WS8iOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KTt2YXIgcj1uKCJtclNHIiksaT1uKCJGRk9vIik7ZnVuY3Rpb24gbyh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJhcmd1bWVudCBpcyBub3QgYSBmdW5jdGlvbi4gQXJlIHlvdSBsb29raW5nIGZvciBgbWFwVG8oKWA/Iik7cmV0dXJuIG4ubGlmdChuZXcgYSh0LGUpKX19dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5wcm9qZWN0PXQsdGhpcy50aGlzQXJnPWV9cmV0dXJuIHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5zdWJzY3JpYmUobmV3IHModCx0aGlzLnByb2plY3QsdGhpcy50aGlzQXJnKSl9LHR9KCkscz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt2YXIgaT10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gaS5wcm9qZWN0PW4saS5jb3VudD0wLGkudGhpc0FyZz1yfHxpLGl9cmV0dXJuIHIuYihlLHQpLGUucHJvdG90eXBlLl9uZXh0PWZ1bmN0aW9uKHQpe3ZhciBlO3RyeXtlPXRoaXMucHJvamVjdC5jYWxsKHRoaXMudGhpc0FyZyx0LHRoaXMuY291bnQrKyl9Y2F0Y2godCl7cmV0dXJuIHZvaWQgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcih0KX10aGlzLmRlc3RpbmF0aW9uLm5leHQoZSl9LGV9KGkuYSl9LCI2YWh3IjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBvfSk7dmFyIHI9bigiaUx4USIpLGk9bigiREtUYiIpLG89e2Nsb3NlZDohMCxuZXh0OmZ1bmN0aW9uKHQpe30sZXJyb3I6ZnVuY3Rpb24odCl7aWYoci5hLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpdGhyb3cgdDtPYmplY3QoaS5hKSh0KX0sY29tcGxldGU6ZnVuY3Rpb24oKXt9fX0sIjZibEYiOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigiRkZPbyIpLGk9bigiTC9WOSIpLG89bigiNmFodyIpLGE9bigieFRsYSIpLHM9bigieTNCeSIpLHU9bigiaUx4USIpO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBsfSk7dmFyIGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX2lzU2NhbGFyPSExLHQmJih0aGlzLl9zdWJzY3JpYmU9dCl9cmV0dXJuIHQucHJvdG90eXBlLmxpZnQ9ZnVuY3Rpb24oZSl7dmFyIG49bmV3IHQ7cmV0dXJuIG4uc291cmNlPXRoaXMsbi5vcGVyYXRvcj1lLG59LHQucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbih0LGUsbil7dmFyIGE9dGhpcy5vcGVyYXRvcixzPWZ1bmN0aW9uKHQsZSxuKXtpZih0KXtpZih0IGluc3RhbmNlb2Ygci5hKXJldHVybiB0O2lmKHRbaS5hXSlyZXR1cm4gdFtpLmFdKCl9cmV0dXJuIHR8fGV8fG4/bmV3IHIuYSh0LGUsbik6bmV3IHIuYShvLmEpfSh0LGUsbik7aWYoYT9hLmNhbGwocyx0aGlzLnNvdXJjZSk6cy5hZGQodGhpcy5zb3VyY2V8fHUuYS51c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nJiYhcy5zeW5jRXJyb3JUaHJvd2FibGU/dGhpcy5fc3Vic2NyaWJlKHMpOnRoaXMuX3RyeVN1YnNjcmliZShzKSksdS5hLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcmJnMuc3luY0Vycm9yVGhyb3dhYmxlJiYocy5zeW5jRXJyb3JUaHJvd2FibGU9ITEscy5zeW5jRXJyb3JUaHJvd24pKXRocm93IHMuc3luY0Vycm9yVmFsdWU7cmV0dXJuIHN9LHQucHJvdG90eXBlLl90cnlTdWJzY3JpYmU9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiB0aGlzLl9zdWJzY3JpYmUodCl9Y2F0Y2goZSl7dS5hLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcmJih0LnN5bmNFcnJvclRocm93bj0hMCx0LnN5bmNFcnJvclZhbHVlPWUpLHQuZXJyb3IoZSl9fSx0LnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gbmV3KGU9YyhlKSkoZnVuY3Rpb24oZSxyKXt2YXIgaTtpPW4uc3Vic2NyaWJlKGZ1bmN0aW9uKGUpe3RyeXt0KGUpfWNhdGNoKHQpe3IodCksaSYmaS51bnN1YnNjcmliZSgpfX0scixlKX0pfSx0LnByb3RvdHlwZS5fc3Vic2NyaWJlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc291cmNlO3JldHVybiBlJiZlLnN1YnNjcmliZSh0KX0sdC5wcm90b3R5cGVbYS5hXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3JldHVybiAwPT09dC5sZW5ndGg/dGhpczpPYmplY3Qocy5iKSh0KSh0aGlzKX0sdC5wcm90b3R5cGUudG9Qcm9taXNlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyh0PWModCkpKGZ1bmN0aW9uKHQsbil7dmFyIHI7ZS5zdWJzY3JpYmUoZnVuY3Rpb24odCl7cmV0dXJuIHI9dH0sZnVuY3Rpb24odCl7cmV0dXJuIG4odCl9LGZ1bmN0aW9uKCl7cmV0dXJuIHQocil9KX0pfSx0LmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQoZSl9LHR9KCk7ZnVuY3Rpb24gYyh0KXtpZih0fHwodD11LmEuUHJvbWlzZXx8UHJvbWlzZSksIXQpdGhyb3cgbmV3IEVycm9yKCJubyBQcm9taXNlIGltcGwgZm91bmQiKTtyZXR1cm4gdH19LCI4ZzhBIjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIHI9bigibXJTRyIpLGk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPXQuY2FsbCh0aGlzLCJvYmplY3QgdW5zdWJzY3JpYmVkIil8fHRoaXM7cmV0dXJuIG4ubmFtZT0iT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IiLE9iamVjdC5zZXRQcm90b3R5cGVPZihuLGUucHJvdG90eXBlKSxufXJldHVybiByLmIoZSx0KSxlfShFcnJvcil9LCI4bU1yIjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJiIixmdW5jdGlvbigpe3JldHVybiBzfSksbi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KTt2YXIgcj1uKCJtclNHIiksaT1uKCJDY25HIiksbz1uKCJXZjRwIiksYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt2YXIgaT10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gaS5fcGxhdGZvcm09bixpLl9kb2N1bWVudD1yLGl9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUubmdBZnRlclZpZXdJbml0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztPYmplY3QoaS5XKSgpJiZ0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJih0aGlzLl9jaGVja1Rvb2xiYXJNaXhlZE1vZGVzKCksdGhpcy5fdG9vbGJhclJvd3MuY2hhbmdlcy5zdWJzY3JpYmUoZnVuY3Rpb24oKXtyZXR1cm4gdC5fY2hlY2tUb29sYmFyTWl4ZWRNb2RlcygpfSkpfSxlLnByb3RvdHlwZS5fY2hlY2tUb29sYmFyTWl4ZWRNb2Rlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fdG9vbGJhclJvd3MubGVuZ3RoJiZbXS5zbGljZS5jYWxsKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jaGlsZE5vZGVzKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuISh0LmNsYXNzTGlzdCYmdC5jbGFzc0xpc3QuY29udGFpbnMoIm1hdC10b29sYmFyLXJvdyIpKX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlVHlwZSE9PSh0Ll9kb2N1bWVudD90Ll9kb2N1bWVudC5DT01NRU5UX05PREU6OCl9KS5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRleHRDb250ZW50LnRyaW0oKX0pJiZmdW5jdGlvbigpe3Rocm93IEVycm9yKCJNYXRUb29sYmFyOiBBdHRlbXB0aW5nIHRvIGNvbWJpbmUgZGlmZmVyZW50IHRvb2xiYXIgbW9kZXMuIEVpdGhlciBzcGVjaWZ5IG11bHRpcGxlIGA8bWF0LXRvb2xiYXItcm93PmAgZWxlbWVudHMgZXhwbGljaXRseSBvciBqdXN0IHBsYWNlIGNvbnRlbnQgaW5zaWRlIG9mIGEgYDxtYXQtdG9vbGJhcj5gIGZvciBhIHNpbmdsZSByb3cuIil9KCl9LGV9KE9iamVjdChvLnUpKGZ1bmN0aW9uKHQpe3RoaXMuX2VsZW1lbnRSZWY9dH0pKSxzPWZ1bmN0aW9uKCl7fX0sIjlaMUYiOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KTt2YXIgcj1uKCJtclNHIiksaT1uKCJNR0JTIiksbz1uKCJ6b3RtIik7ZnVuY3Rpb24gYSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49bmV3IHModCkscj1lLmxpZnQobik7cmV0dXJuIG4uY2F1Z2h0PXJ9fXZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLnNlbGVjdG9yPXR9cmV0dXJuIHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5zdWJzY3JpYmUobmV3IHUodCx0aGlzLnNlbGVjdG9yLHRoaXMuY2F1Z2h0KSl9LHR9KCksdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt2YXIgaT10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gaS5zZWxlY3Rvcj1uLGkuY2F1Z2h0PXIsaX1yZXR1cm4gci5iKGUsdCksZS5wcm90b3R5cGUuZXJyb3I9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuaXNTdG9wcGVkKXt2YXIgbj12b2lkIDA7dHJ5e249dGhpcy5zZWxlY3RvcihlLHRoaXMuY2F1Z2h0KX1jYXRjaChlKXtyZXR1cm4gdm9pZCB0LnByb3RvdHlwZS5lcnJvci5jYWxsKHRoaXMsZSl9dGhpcy5fdW5zdWJzY3JpYmVBbmRSZWN5Y2xlKCksdGhpcy5hZGQoT2JqZWN0KG8uYSkodGhpcyxuKSl9fSxlfShpLmEpfSxBeXRSOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KTt2YXIgcj17cHJvZHVjdGlvbjohMH19LENTOVE6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCJtclNHIiksaT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXt2b2lkIDA9PT1uJiYobj10Lm5vdyksdGhpcy5TY2hlZHVsZXJBY3Rpb249ZSx0aGlzLm5vdz1ufXJldHVybiB0LnByb3RvdHlwZS5zY2hlZHVsZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHZvaWQgMD09PWUmJihlPTApLG5ldyB0aGlzLlNjaGVkdWxlckFjdGlvbih0aGlzLHQpLnNjaGVkdWxlKG4sZSl9LHQubm93PURhdGUubm93P0RhdGUubm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSx0fSgpO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBvfSk7dmFyIG89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuLHIpe3ZvaWQgMD09PXImJihyPWkubm93KTt2YXIgbz10LmNhbGwodGhpcyxuLGZ1bmN0aW9uKCl7cmV0dXJuIGUuZGVsZWdhdGUmJmUuZGVsZWdhdGUhPT1vP2UuZGVsZWdhdGUubm93KCk6cigpfSl8fHRoaXM7cmV0dXJuIG8uYWN0aW9ucz1bXSxvLmFjdGl2ZT0hMSxvLnNjaGVkdWxlZD12b2lkIDAsb31yZXR1cm4gci5iKGUsdCksZS5wcm90b3R5cGUuc2NoZWR1bGU9ZnVuY3Rpb24obixyLGkpe3JldHVybiB2b2lkIDA9PT1yJiYocj0wKSxlLmRlbGVnYXRlJiZlLmRlbGVnYXRlIT09dGhpcz9lLmRlbGVnYXRlLnNjaGVkdWxlKG4scixpKTp0LnByb3RvdHlwZS5zY2hlZHVsZS5jYWxsKHRoaXMsbixyLGkpfSxlLnByb3RvdHlwZS5mbHVzaD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmFjdGlvbnM7aWYodGhpcy5hY3RpdmUpZS5wdXNoKHQpO2Vsc2V7dmFyIG47dGhpcy5hY3RpdmU9ITA7ZG97aWYobj10LmV4ZWN1dGUodC5zdGF0ZSx0LmRlbGF5KSlicmVha313aGlsZSh0PWUuc2hpZnQoKSk7aWYodGhpcy5hY3RpdmU9ITEsbil7Zm9yKDt0PWUuc2hpZnQoKTspdC51bnN1YnNjcmliZSgpO3Rocm93IG59fX0sZX0oaSl9LENjbkc6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiSGEiLGZ1bmN0aW9uKCl7cmV0dXJuIEtlfSksbi5kKGUsIklhIixmdW5jdGlvbigpe3JldHVybiBaZX0pLG4uZChlLCJKYSIsZnVuY3Rpb24oKXtyZXR1cm4gWGV9KSxuLmQoZSwiR2EiLGZ1bmN0aW9uKCl7cmV0dXJuIGR0fSksbi5kKGUsImciLGZ1bmN0aW9uKCl7cmV0dXJuIGFlfSksbi5kKGUsIlMiLGZ1bmN0aW9uKCl7cmV0dXJuIEp0fSksbi5kKGUsIlciLGZ1bmN0aW9uKCl7cmV0dXJuIHRlfSksbi5kKGUsIlEiLGZ1bmN0aW9uKCl7cmV0dXJuIG5lfSksbi5kKGUsInciLGZ1bmN0aW9uKCl7cmV0dXJuIGVlfSksbi5kKGUsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIGh0fSksbi5kKGUsIkEiLGZ1bmN0aW9uKCl7cmV0dXJuIG10fSksbi5kKGUsInoiLGZ1bmN0aW9uKCl7cmV0dXJuIHl0fSksbi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGd0fSksbi5kKGUsImQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN0fSksbi5kKGUsImUiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ0fSksbi5kKGUsIlUiLGZ1bmN0aW9uKCl7cmV0dXJuIFNlfSksbi5kKGUsIkwiLGZ1bmN0aW9uKCl7cmV0dXJuIHF0fSksbi5kKGUsIlkiLGZ1bmN0aW9uKCl7cmV0dXJuIEd0fSksbi5kKGUsInMiLGZ1bmN0aW9uKCl7cmV0dXJuIFFlfSksbi5kKGUsImYiLGZ1bmN0aW9uKCl7cmV0dXJuICRlfSksbi5kKGUsIm0iLGZ1bmN0aW9uKCl7cmV0dXJuIEx0fSksbi5kKGUsImwiLGZ1bmN0aW9uKCl7cmV0dXJuIGF0fSksbi5kKGUsIkUiLGZ1bmN0aW9uKCl7cmV0dXJuIFNufSksbi5kKGUsIkYiLGZ1bmN0aW9uKCl7cmV0dXJuIENufSksbi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGR9KSxuLmQoZSwiTyIsZnVuY3Rpb24oKXtyZXR1cm4gWH0pLG4uZChlLCJNIixmdW5jdGlvbigpe3JldHVybiAkfSksbi5kKGUsIlIiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSxuLmQoZSwiVCIsZnVuY3Rpb24oKXtyZXR1cm4gQ30pLG4uZChlLCJWIixmdW5jdGlvbigpe3JldHVybiBafSksbi5kKGUsInAiLGZ1bmN0aW9uKCl7cmV0dXJuIE59KSxuLmQoZSwibyIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLG4uZChlLCJuIixmdW5jdGlvbigpe3JldHVybiBFfSksbi5kKGUsInkiLGZ1bmN0aW9uKCl7cmV0dXJuIGt9KSxuLmQoZSwiSCIsZnVuY3Rpb24oKXtyZXR1cm4gSX0pLG4uZChlLCJ4IixmdW5jdGlvbigpe3JldHVybiBGdH0pLG4uZChlLCJDIixmdW5jdGlvbigpe3JldHVybiB1ZX0pLG4uZChlLCJEIixmdW5jdGlvbigpe3JldHVybiBsZX0pLG4uZChlLCJpIixmdW5jdGlvbigpe3JldHVybiBfdH0pLG4uZChlLCJqIixmdW5jdGlvbigpe3JldHVybiBUdH0pLG4uZChlLCJrIixmdW5jdGlvbigpe3JldHVybiBjZX0pLG4uZChlLCJ0IixmdW5jdGlvbigpe3JldHVybiBQdH0pLG4uZChlLCJ2IixmdW5jdGlvbigpe3JldHVybiBqdH0pLG4uZChlLCJ1IixmdW5jdGlvbigpe3JldHVybiBmZX0pLG4uZChlLCJCIixmdW5jdGlvbigpe3JldHVybiBoZX0pLG4uZChlLCJJIixmdW5jdGlvbigpe3JldHVybiBtZX0pLG4uZChlLCJKIixmdW5jdGlvbigpe3JldHVybiBkZX0pLG4uZChlLCJLIixmdW5jdGlvbigpe3JldHVybiBnZX0pLG4uZChlLCJOIixmdW5jdGlvbigpe3JldHVybiB2ZX0pLG4uZChlLCJoIixmdW5jdGlvbigpe3JldHVybiBiZX0pLG4uZChlLCJxIixmdW5jdGlvbigpe3JldHVybiBCZX0pLG4uZChlLCJyIixmdW5jdGlvbigpe3JldHVybiBIZX0pLG4uZChlLCJHIixmdW5jdGlvbigpe3JldHVybiBJZX0pLG4uZChlLCJQIixmdW5jdGlvbigpe3JldHVybiBUZX0pLG4uZChlLCJYIixmdW5jdGlvbigpe3JldHVybiBHZX0pLG4uZChlLCJSYSIsZnVuY3Rpb24oKXtyZXR1cm4gQWV9KSxuLmQoZSwiQmEiLGZ1bmN0aW9uKCl7cmV0dXJuIHZ0fSksbi5kKGUsIloiLGZ1bmN0aW9uKCl7cmV0dXJuIHN0fSksbi5kKGUsIkFhIixmdW5jdGlvbigpe3JldHVybiBJdH0pLG4uZChlLCJDYSIsZnVuY3Rpb24oKXtyZXR1cm4gYm59KSxuLmQoZSwiRGEiLGZ1bmN0aW9uKCl7cmV0dXJuIE9ufSksbi5kKGUsIkVhIixmdW5jdGlvbigpe3JldHVybiBubn0pLG4uZChlLCJQYSIsZnVuY3Rpb24oKXtyZXR1cm4gZ30pLG4uZChlLCJVYSIsZnVuY3Rpb24oKXtyZXR1cm4geH0pLG4uZChlLCJmYiIsZnVuY3Rpb24oKXtyZXR1cm4gT30pLG4uZChlLCJTYSIsZnVuY3Rpb24oKXtyZXR1cm4gbHR9KSxuLmQoZSwiVGEiLGZ1bmN0aW9uKCl7cmV0dXJuIHV0fSksbi5kKGUsIkZhIixmdW5jdGlvbigpe3JldHVybiB2cn0pLG4uZChlLCJLYSIsZnVuY3Rpb24oKXtyZXR1cm4gRnJ9KSxuLmQoZSwiTGEiLGZ1bmN0aW9uKCl7cmV0dXJuIEdvfSksbi5kKGUsIk1hIixmdW5jdGlvbigpe3JldHVybiBIbn0pLG4uZChlLCJOYSIsZnVuY3Rpb24oKXtyZXR1cm4gdWl9KSxuLmQoZSwiT2EiLGZ1bmN0aW9uKCl7cmV0dXJuIGJyfSksbi5kKGUsIlFhIixmdW5jdGlvbigpe3JldHVybiB5cn0pLG4uZChlLCJWYSIsZnVuY3Rpb24oKXtyZXR1cm4gSXJ9KSxuLmQoZSwiV2EiLGZ1bmN0aW9uKCl7cmV0dXJuIFRyfSksbi5kKGUsIlhhIixmdW5jdGlvbigpe3JldHVybiBBaX0pLG4uZChlLCJZYSIsZnVuY3Rpb24oKXtyZXR1cm4gS3J9KSxuLmQoZSwiYWIiLGZ1bmN0aW9uKCl7cmV0dXJuIGxpfSksbi5kKGUsImRiIixmdW5jdGlvbigpe3JldHVybiBjaX0pLG4uZChlLCJaYSIsZnVuY3Rpb24oKXtyZXR1cm4gTWl9KSxuLmQoZSwiYmIiLGZ1bmN0aW9uKCl7cmV0dXJuIE5pfSksbi5kKGUsImNiIixmdW5jdGlvbigpe3JldHVybiBQaX0pLG4uZChlLCJlYiIsZnVuY3Rpb24oKXtyZXR1cm4gU2l9KSxuLmQoZSwiZ2IiLGZ1bmN0aW9uKCl7cmV0dXJuIERpfSksbi5kKGUsImhiIixmdW5jdGlvbigpe3JldHVybiBVbn0pLG4uZChlLCJpYiIsZnVuY3Rpb24oKXtyZXR1cm4gVml9KTt2YXIgcj1uKCJtclNHIiksaT1uKCJwdWdUIiksbz1uKCJLOUlhIiksYT1uKCI2YmxGIikscz1uKCJwMGliIiksdT1uKCJTMW5YIik7ZnVuY3Rpb24gbCh0KXtyZXR1cm57cHJvdmlkZWRJbjp0LnByb3ZpZGVkSW58fG51bGwsZmFjdG9yeTp0LmZhY3RvcnksdmFsdWU6dm9pZCAwfX12YXIgYz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9kZXNjPXQsdGhpcy5uZ01ldGFkYXRhTmFtZT0iSW5qZWN0aW9uVG9rZW4iLHRoaXMubmdJbmplY3RhYmxlRGVmPXZvaWQgMCE9PWU/bCh7cHJvdmlkZWRJbjplLnByb3ZpZGVkSW58fCJyb290IixmYWN0b3J5OmUuZmFjdG9yeX0pOnZvaWQgMH1yZXR1cm4gdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iSW5qZWN0aW9uVG9rZW4gIit0aGlzLl9kZXNjfSx0fSgpLGY9Il9fcGFyYW1ldGVyc19fIjtmdW5jdGlvbiBoKHQsZSxuKXt2YXIgaT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuXT1hcmd1bWVudHNbbl07aWYodCl7dmFyIGk9dC5hcHBseSh2b2lkIDAsT2JqZWN0KHIuZCkoZSkpO2Zvcih2YXIgbyBpbiBpKXRoaXNbb109aVtvXX19fShlKTtmdW5jdGlvbiBvKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO2lmKHRoaXMgaW5zdGFuY2VvZiBvKXJldHVybiBpLmFwcGx5KHRoaXMsdCksdGhpczt2YXIgbixhPW5ldygobj1vKS5iaW5kLmFwcGx5KG4sT2JqZWN0KHIuZCkoW3ZvaWQgMF0sdCkpKTtyZXR1cm4gcy5hbm5vdGF0aW9uPWEscztmdW5jdGlvbiBzKHQsZSxuKXtmb3IodmFyIHI9dC5oYXNPd25Qcm9wZXJ0eShmKT90W2ZdOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGYse3ZhbHVlOltdfSlbZl07ci5sZW5ndGg8PW47KXIucHVzaChudWxsKTtyZXR1cm4ocltuXT1yW25dfHxbXSkucHVzaChhKSx0fX1yZXR1cm4gbiYmKG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKSxvLnByb3RvdHlwZS5uZ01ldGFkYXRhTmFtZT10LG8uYW5ub3RhdGlvbkNscz1vLG99dmFyIGQ9bmV3IGMoIkFuYWx5emVGb3JFbnRyeUNvbXBvbmVudHMiKTtGdW5jdGlvbjt2YXIgcD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LG09InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiYidW5kZWZpbmVkIiE9dHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlJiZzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUmJnNlbGYseT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmZ2xvYmFsLGc9cHx8eXx8bSx2PVByb21pc2UucmVzb2x2ZSgwKSxiPW51bGw7ZnVuY3Rpb24gXygpe2lmKCFiKXt2YXIgdD1nLlN5bWJvbDtpZih0JiZ0Lml0ZXJhdG9yKWI9dC5pdGVyYXRvcjtlbHNlIGZvcih2YXIgZT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhNYXAucHJvdG90eXBlKSxuPTA7bjxlLmxlbmd0aDsrK24pe3ZhciByPWVbbl07ImVudHJpZXMiIT09ciYmInNpemUiIT09ciYmTWFwLnByb3RvdHlwZVtyXT09PU1hcC5wcm90b3R5cGUuZW50cmllcyYmKGI9cil9fXJldHVybiBifWZ1bmN0aW9uIHcodCl7InVuZGVmaW5lZCI9PXR5cGVvZiBab25lP3YudGhlbihmdW5jdGlvbigpe3QmJnQuYXBwbHkobnVsbCxudWxsKX0pOlpvbmUuY3VycmVudC5zY2hlZHVsZU1pY3JvVGFzaygic2NoZWR1bGVNaWNyb3Rhc2siLHQpfWZ1bmN0aW9uIHgodCxlKXtyZXR1cm4gdD09PWV8fCJudW1iZXIiPT10eXBlb2YgdCYmIm51bWJlciI9PXR5cGVvZiBlJiZpc05hTih0KSYmaXNOYU4oZSl9ZnVuY3Rpb24gTyh0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYodCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiJbIit0Lm1hcChPKS5qb2luKCIsICIpKyJdIjtpZihudWxsPT10KXJldHVybiIiK3Q7aWYodC5vdmVycmlkZGVuTmFtZSlyZXR1cm4iIit0Lm92ZXJyaWRkZW5OYW1lO2lmKHQubmFtZSlyZXR1cm4iIit0Lm5hbWU7dmFyIGU9dC50b1N0cmluZygpO2lmKG51bGw9PWUpcmV0dXJuIiIrZTt2YXIgbj1lLmluZGV4T2YoIlxuIik7cmV0dXJuLTE9PT1uP2U6ZS5zdWJzdHJpbmcoMCxuKX1mdW5jdGlvbiBDKHQpe3JldHVybiB0Ll9fZm9yd2FyZF9yZWZfXz1DLHQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gTyh0aGlzKCkpfSx0fWZ1bmN0aW9uIFModCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuaGFzT3duUHJvcGVydHkoIl9fZm9yd2FyZF9yZWZfXyIpJiZ0Ll9fZm9yd2FyZF9yZWZfXz09PUM/dCgpOnR9dmFyIEU9aCgiSW5qZWN0IixmdW5jdGlvbih0KXtyZXR1cm57dG9rZW46dH19KSxrPWgoIk9wdGlvbmFsIiksVD1oKCJTZWxmIiksST1oKCJTa2lwU2VsZiIpLEE9Il9fc291cmNlIixqPW5ldyBPYmplY3QsUD1uZXcgYygiSU5KRUNUT1IiKSxNPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwPT09ZSYmKGU9aiksZT09PWopdGhyb3cgbmV3IEVycm9yKCJOdWxsSW5qZWN0b3JFcnJvcjogTm8gcHJvdmlkZXIgZm9yICIrTyh0KSsiISIpO3JldHVybiBlfSx0fSgpLE49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LmNyZWF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP25ldyBXKHQsZSk6bmV3IFcodC5wcm92aWRlcnMsdC5wYXJlbnQsdC5uYW1lfHxudWxsKX0sdC5USFJPV19JRl9OT1RfRk9VTkQ9aix0Lk5VTEw9bmV3IE0sdC5uZ0luamVjdGFibGVEZWY9bCh7cHJvdmlkZWRJbjoiYW55IixmYWN0b3J5OmZ1bmN0aW9uKCl7cmV0dXJuIFooUCl9fSksdH0oKSxSPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxEPVtdLEw9UixGPWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyl9LFY9e30sVT1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdClpZih0W2VdPT09VilyZXR1cm4gZTt0aHJvdyBFcnJvcigiIXByb3AiKX0oe3Byb3ZpZGU6U3RyaW5nLHVzZVZhbHVlOlZ9KSx6PU4uTlVMTCxCPS9cbi9nbSxIPSJcdTAyNzUiLFc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt2b2lkIDA9PT1lJiYoZT16KSx2b2lkIDA9PT1uJiYobj1udWxsKSx0aGlzLnBhcmVudD1lLHRoaXMuc291cmNlPW47dmFyIHI9dGhpcy5fcmVjb3Jkcz1uZXcgTWFwO3Iuc2V0KE4se3Rva2VuOk4sZm46UixkZXBzOkQsdmFsdWU6dGhpcyx1c2VOZXc6ITF9KSxyLnNldChQLHt0b2tlbjpQLGZuOlIsZGVwczpELHZhbHVlOnRoaXMsdXNlTmV3OiExfSksZnVuY3Rpb24gdChlLG4pe2lmKG4paWYoKG49UyhuKSlpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXQoZSxuW3JdKTtlbHNle2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXRocm93IEcoIkZ1bmN0aW9uL0NsYXNzIG5vdCBzdXBwb3J0ZWQiLG4pO2lmKCFufHwib2JqZWN0IiE9dHlwZW9mIG58fCFuLnByb3ZpZGUpdGhyb3cgRygiVW5leHBlY3RlZCBwcm92aWRlciIsbik7dmFyIGk9UyhuLnByb3ZpZGUpLG89ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCl7dmFyIGU9RCxuPXQuZGVwcztpZihuJiZuLmxlbmd0aCl7ZT1bXTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9NjtpZigodT1TKG5bcl0pKWluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciBvPTAsYT11O288YS5sZW5ndGg7bysrKXt2YXIgcz1hW29dO3MgaW5zdGFuY2VvZiBrfHxzPT1rP2l8PTE6cyBpbnN0YW5jZW9mIEl8fHM9PUk/aSY9LTM6cyBpbnN0YW5jZW9mIFR8fHM9PVQ/aSY9LTU6dT1zIGluc3RhbmNlb2YgRT9zLnRva2VuOlMocyl9ZS5wdXNoKHt0b2tlbjp1LG9wdGlvbnM6aX0pfX1lbHNlIGlmKHQudXNlRXhpc3Rpbmcpe3ZhciB1O2U9W3t0b2tlbjp1PVModC51c2VFeGlzdGluZyksb3B0aW9uczo2fV19ZWxzZSBpZighKG58fFUgaW4gdCkpdGhyb3cgRygiJ2RlcHMnIHJlcXVpcmVkIix0KTtyZXR1cm4gZX0odCksbj1SLHI9RCxpPSExLG89Uyh0LnByb3ZpZGUpO2lmKFUgaW4gdClyPXQudXNlVmFsdWU7ZWxzZSBpZih0LnVzZUZhY3Rvcnkpbj10LnVzZUZhY3Rvcnk7ZWxzZSBpZih0LnVzZUV4aXN0aW5nKTtlbHNlIGlmKHQudXNlQ2xhc3MpaT0hMCxuPVModC51c2VDbGFzcyk7ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbyl0aHJvdyBHKCJTdGF0aWNQcm92aWRlciBkb2VzIG5vdCBoYXZlIFt1c2VWYWx1ZXx1c2VGYWN0b3J5fHVzZUV4aXN0aW5nfHVzZUNsYXNzXSBvciBbcHJvdmlkZV0gaXMgbm90IG5ld2FibGUiLHQpO2k9ITAsbj1vfXJldHVybntkZXBzOmUsZm46bix1c2VOZXc6aSx2YWx1ZTpyfX0obik7aWYoITA9PT1uLm11bHRpKXt2YXIgYT1lLmdldChpKTtpZihhKXtpZihhLmZuIT09Ril0aHJvdyBxKGkpfWVsc2UgZS5zZXQoaSxhPXt0b2tlbjpuLnByb3ZpZGUsZGVwczpbXSx1c2VOZXc6ITEsZm46Rix2YWx1ZTpEfSk7YS5kZXBzLnB1c2goe3Rva2VuOmk9bixvcHRpb25zOjZ9KX12YXIgcz1lLmdldChpKTtpZihzJiZzLmZuPT1GKXRocm93IHEoaSk7ZS5zZXQoaSxvKX19KHIsdCl9cmV0dXJuIHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09biYmKG49MCk7dmFyIGk9dGhpcy5fcmVjb3Jkcy5nZXQodCk7dHJ5e3JldHVybiBmdW5jdGlvbiB0KGUsbixpLG8sYSxzKXt0cnl7cmV0dXJuIGZ1bmN0aW9uKGUsbixpLG8sYSxzKXt2YXIgdSxsO2lmKCFufHw0JnMpMiZzfHwodT1vLmdldChlLGEsMCkpO2Vsc2V7aWYoKHU9bi52YWx1ZSk9PUwpdGhyb3cgRXJyb3IoSCsiQ2lyY3VsYXIgZGVwZW5kZW5jeSIpO2lmKHU9PT1EKXtuLnZhbHVlPUw7dmFyIGM9bi51c2VOZXcsZj1uLmZuLGg9bi5kZXBzLGQ9RDtpZihoLmxlbmd0aCl7ZD1bXTtmb3IodmFyIHA9MDtwPGgubGVuZ3RoO3ArKyl7dmFyIG09aFtwXSx5PW0ub3B0aW9ucyxnPTImeT9pLmdldChtLnRva2VuKTp2b2lkIDA7ZC5wdXNoKHQobS50b2tlbixnLGksZ3x8NCZ5P286eiwxJnk/bnVsbDpOLlRIUk9XX0lGX05PVF9GT1VORCwwKSl9fW4udmFsdWU9dT1jP25ldygobD1mKS5iaW5kLmFwcGx5KGwsT2JqZWN0KHIuZCkoW3ZvaWQgMF0sZCkpKTpmLmFwcGx5KHZvaWQgMCxkKX19cmV0dXJuIHV9KGUsbixpLG8sYSxzKX1jYXRjaCh0KXt0aHJvdyB0IGluc3RhbmNlb2YgRXJyb3J8fCh0PW5ldyBFcnJvcih0KSksKHQubmdUZW1wVG9rZW5QYXRoPXQubmdUZW1wVG9rZW5QYXRofHxbXSkudW5zaGlmdChlKSxuJiZuLnZhbHVlPT1MJiYobi52YWx1ZT1EKSx0fX0odCxpLHRoaXMuX3JlY29yZHMsdGhpcy5wYXJlbnQsZSxuKX1jYXRjaChlKXt2YXIgbz1lLm5nVGVtcFRva2VuUGF0aDt0aHJvdyB0W0FdJiZvLnVuc2hpZnQodFtBXSksZS5tZXNzYWdlPVkoIlxuIitlLm1lc3NhZ2Usbyx0aGlzLnNvdXJjZSksZS5uZ1Rva2VuUGF0aD1vLGUubmdUZW1wVG9rZW5QYXRoPW51bGwsZX19LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuX3JlY29yZHMuZm9yRWFjaChmdW5jdGlvbihlLG4pe3JldHVybiB0LnB1c2goTyhuKSl9KSwiU3RhdGljSW5qZWN0b3JbIit0LmpvaW4oIiwgIikrIl0ifSx0fSgpO2Z1bmN0aW9uIHEodCl7cmV0dXJuIEcoIkNhbm5vdCBtaXggbXVsdGkgcHJvdmlkZXJzIGFuZCByZWd1bGFyIHByb3ZpZGVycyIsdCl9ZnVuY3Rpb24gWSh0LGUsbil7dm9pZCAwPT09biYmKG49bnVsbCksdD10JiYiXG4iPT09dC5jaGFyQXQoMCkmJnQuY2hhckF0KDEpPT1IP3Quc3Vic3RyKDIpOnQ7dmFyIHI9TyhlKTtpZihlIGluc3RhbmNlb2YgQXJyYXkpcj1lLm1hcChPKS5qb2luKCIgLT4gIik7ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciBpPVtdO2Zvcih2YXIgbyBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkobykpe3ZhciBhPWVbb107aS5wdXNoKG8rIjoiKygic3RyaW5nIj09dHlwZW9mIGE/SlNPTi5zdHJpbmdpZnkoYSk6TyhhKSkpfXI9InsiK2kuam9pbigiLCAiKSsifSJ9cmV0dXJuIlN0YXRpY0luamVjdG9yRXJyb3IiKyhuPyIoIituKyIpIjoiIikrIlsiK3IrIl06ICIrdC5yZXBsYWNlKEIsIlxuICAiKX1mdW5jdGlvbiBHKHQsZSl7cmV0dXJuIG5ldyBFcnJvcihZKHQsZSkpfXZhciBRPXZvaWQgMDtmdW5jdGlvbiBLKHQpe3ZhciBlPVE7cmV0dXJuIFE9dCxlfWZ1bmN0aW9uIFoodCxlKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1RKXRocm93IG5ldyBFcnJvcigiaW5qZWN0KCkgbXVzdCBiZSBjYWxsZWQgZnJvbSBhbiBpbmplY3Rpb24gY29udGV4dCIpO2lmKG51bGw9PT1RKXt2YXIgbj10Lm5nSW5qZWN0YWJsZURlZjtpZihuJiYicm9vdCI9PW4ucHJvdmlkZWRJbilyZXR1cm4gdm9pZCAwPT09bi52YWx1ZT9uLnZhbHVlPW4uZmFjdG9yeSgpOm4udmFsdWU7dGhyb3cgbmV3IEVycm9yKCJJbmplY3RvcjogTk9UX0ZPVU5EIFsiK08odCkrIl0iKX1yZXR1cm4gUS5nZXQodCw4JmU/bnVsbDp2b2lkIDAsZSl9U3RyaW5nO3ZhciBYPWZ1bmN0aW9uKHQpe3JldHVybiB0W3QuRW11bGF0ZWQ9MF09IkVtdWxhdGVkIix0W3QuTmF0aXZlPTFdPSJOYXRpdmUiLHRbdC5Ob25lPTJdPSJOb25lIix0W3QuU2hhZG93RG9tPTNdPSJTaGFkb3dEb20iLHR9KHt9KSwkPWZ1bmN0aW9uKHQpe3RoaXMuZnVsbD10LHRoaXMubWFqb3I9dC5zcGxpdCgiLiIpWzBdLHRoaXMubWlub3I9dC5zcGxpdCgiLiIpWzFdLHRoaXMucGF0Y2g9dC5zcGxpdCgiLiIpLnNsaWNlKDIpLmpvaW4oIi4iKX0sSj1uZXcgJCgiNi4wLjkiKSx0dD0ibmdEZWJ1Z0NvbnRleHQiLGV0PSJuZ09yaWdpbmFsRXJyb3IiLG50PSJuZ0Vycm9yTG9nZ2VyIjtmdW5jdGlvbiBydCh0KXtyZXR1cm4gdFt0dF19ZnVuY3Rpb24gaXQodCl7cmV0dXJuIHRbZXRdfWZ1bmN0aW9uIG90KHQpe2Zvcih2YXIgZT1bXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyllW24tMV09YXJndW1lbnRzW25dO3QuZXJyb3IuYXBwbHkodCxPYmplY3Qoci5kKShlKSl9dmFyIGF0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuX2NvbnNvbGU9Y29uc29sZX1yZXR1cm4gdC5wcm90b3R5cGUuaGFuZGxlRXJyb3I9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZmluZE9yaWdpbmFsRXJyb3IodCksbj10aGlzLl9maW5kQ29udGV4dCh0KSxyPWZ1bmN0aW9uKHQpe3JldHVybiB0W250XXx8b3R9KHQpO3IodGhpcy5fY29uc29sZSwiRVJST1IiLHQpLGUmJnIodGhpcy5fY29uc29sZSwiT1JJR0lOQUwgRVJST1IiLGUpLG4mJnIodGhpcy5fY29uc29sZSwiRVJST1IgQ09OVEVYVCIsbil9LHQucHJvdG90eXBlLl9maW5kQ29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gdD9ydCh0KT9ydCh0KTp0aGlzLl9maW5kQ29udGV4dChpdCh0KSk6bnVsbH0sdC5wcm90b3R5cGUuX2ZpbmRPcmlnaW5hbEVycm9yPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1pdCh0KTtlJiZpdChlKTspZT1pdChlKTtyZXR1cm4gZX0sdH0oKSxzdD1uZXcgYygiVGhlIHByZXNlbmNlIG9mIHRoaXMgdG9rZW4gbWFya3MgYW4gaW5qZWN0b3IgYXMgYmVpbmcgdGhlIHJvb3QgaW5qZWN0b3IuIik7ZnVuY3Rpb24gdXQodCl7cmV0dXJuISF0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVufWZ1bmN0aW9uIGx0KHQpe3JldHVybiEhdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuc3Vic2NyaWJlfXZhciBjdD1uZXcgYygiQXBwbGljYXRpb24gSW5pdGlhbGl6ZXIiKSxmdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGU9dGhpczt0aGlzLmFwcEluaXRzPXQsdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLmRvbmU9ITEsdGhpcy5kb25lUHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe2UucmVzb2x2ZT10LGUucmVqZWN0PW59KX1yZXR1cm4gdC5wcm90b3R5cGUucnVuSW5pdGlhbGl6ZXJzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZighdGhpcy5pbml0aWFsaXplZCl7dmFyIGU9W10sbj1mdW5jdGlvbigpe3QuZG9uZT0hMCx0LnJlc29sdmUoKX07aWYodGhpcy5hcHBJbml0cylmb3IodmFyIHI9MDtyPHRoaXMuYXBwSW5pdHMubGVuZ3RoO3IrKyl7dmFyIGk9dGhpcy5hcHBJbml0c1tyXSgpO3V0KGkpJiZlLnB1c2goaSl9UHJvbWlzZS5hbGwoZSkudGhlbihmdW5jdGlvbigpe24oKX0pLmNhdGNoKGZ1bmN0aW9uKGUpe3QucmVqZWN0KGUpfSksMD09PWUubGVuZ3RoJiZuKCksdGhpcy5pbml0aWFsaXplZD0hMH19LHR9KCksaHQ9bmV3IGMoIkFwcElkIik7ZnVuY3Rpb24gZHQoKXtyZXR1cm4iIitwdCgpK3B0KCkrcHQoKX1mdW5jdGlvbiBwdCgpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDk3K01hdGguZmxvb3IoMjUqTWF0aC5yYW5kb20oKSkpfXZhciBtdD1uZXcgYygiUGxhdGZvcm0gSW5pdGlhbGl6ZXIiKSx5dD1uZXcgYygiUGxhdGZvcm0gSUQiKSxndD1uZXcgYygiYXBwQm9vdHN0cmFwTGlzdGVuZXIiKSx2dD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmxvZz1mdW5jdGlvbih0KXtjb25zb2xlLmxvZyh0KX0sdC5wcm90b3R5cGUud2Fybj1mdW5jdGlvbih0KXtjb25zb2xlLndhcm4odCl9LHR9KCk7ZnVuY3Rpb24gYnQoKXt0aHJvdyBuZXcgRXJyb3IoIlJ1bnRpbWUgY29tcGlsZXIgaXMgbm90IGxvYWRlZCIpfXZhciBfdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmNvbXBpbGVNb2R1bGVTeW5jPWZ1bmN0aW9uKHQpe3Rocm93IGJ0KCl9LHQucHJvdG90eXBlLmNvbXBpbGVNb2R1bGVBc3luYz1mdW5jdGlvbih0KXt0aHJvdyBidCgpfSx0LnByb3RvdHlwZS5jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c1N5bmM9ZnVuY3Rpb24odCl7dGhyb3cgYnQoKX0sdC5wcm90b3R5cGUuY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNBc3luYz1mdW5jdGlvbih0KXt0aHJvdyBidCgpfSx0LnByb3RvdHlwZS5jbGVhckNhY2hlPWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5jbGVhckNhY2hlRm9yPWZ1bmN0aW9uKHQpe30sdH0oKSx3dD1mdW5jdGlvbigpe30seHQ9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIE90KHQpe3ZhciBlPUVycm9yKCJObyBjb21wb25lbnQgZmFjdG9yeSBmb3VuZCBmb3IgIitPKHQpKyIuIERpZCB5b3UgYWRkIGl0IHRvIEBOZ01vZHVsZS5lbnRyeUNvbXBvbmVudHM/Iik7cmV0dXJuIGVbRXRdPXQsZX12YXIgQ3QsU3QsRXQ9Im5nQ29tcG9uZW50IixrdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLnJlc29sdmVDb21wb25lbnRGYWN0b3J5PWZ1bmN0aW9uKHQpe3Rocm93IE90KHQpfSx0fSgpLFR0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5OVUxMPW5ldyBrdCx0fSgpLEl0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5fcGFyZW50PWUsdGhpcy5fbmdNb2R1bGU9bix0aGlzLl9mYWN0b3JpZXM9bmV3IE1hcDtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGk9dFtyXTt0aGlzLl9mYWN0b3JpZXMuc2V0KGkuY29tcG9uZW50VHlwZSxpKX19cmV0dXJuIHQucHJvdG90eXBlLnJlc29sdmVDb21wb25lbnRGYWN0b3J5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2ZhY3Rvcmllcy5nZXQodCk7aWYoIWUmJnRoaXMuX3BhcmVudCYmKGU9dGhpcy5fcGFyZW50LnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHQpKSwhZSl0aHJvdyBPdCh0KTtyZXR1cm4gbmV3IEF0KGUsdGhpcy5fbmdNb2R1bGUpfSx0fSgpLEF0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgcj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIHIuZmFjdG9yeT1lLHIubmdNb2R1bGU9bixyLnNlbGVjdG9yPWUuc2VsZWN0b3Isci5jb21wb25lbnRUeXBlPWUuY29tcG9uZW50VHlwZSxyLm5nQ29udGVudFNlbGVjdG9ycz1lLm5nQ29udGVudFNlbGVjdG9ycyxyLmlucHV0cz1lLmlucHV0cyxyLm91dHB1dHM9ZS5vdXRwdXRzLHJ9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0aGlzLmZhY3RvcnkuY3JlYXRlKHQsZSxuLHJ8fHRoaXMubmdNb2R1bGUpfSxlfSh4dCksanQ9ZnVuY3Rpb24oKXt9LFB0PWZ1bmN0aW9uKCl7fSxNdD1mdW5jdGlvbigpe3ZhciB0PWcud3RmO3JldHVybiEoIXR8fCEoQ3Q9dC50cmFjZSl8fChTdD1DdC5ldmVudHMsMCkpfSgpO2Z1bmN0aW9uIE50KHQsZSl7cmV0dXJuIG51bGx9dmFyIFJ0PU10P2Z1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPW51bGwpLFN0LmNyZWF0ZVNjb3BlKHQsZSl9OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE50fSxEdD1NdD9mdW5jdGlvbih0LGUpe3JldHVybiBDdC5sZWF2ZVNjb3BlKHQsZSksZX06ZnVuY3Rpb24odCxlKXtyZXR1cm4gZX0sTHQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT0hMSk7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLl9faXNBc3luYz1lLG59cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5uZXh0LmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUsbixyKXt2YXIgbyxhPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsfSxzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9O2UmJiJvYmplY3QiPT10eXBlb2YgZT8obz10aGlzLl9faXNBc3luYz9mdW5jdGlvbih0KXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGUubmV4dCh0KX0pfTpmdW5jdGlvbih0KXtlLm5leHQodCl9LGUuZXJyb3ImJihhPXRoaXMuX19pc0FzeW5jP2Z1bmN0aW9uKHQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gZS5lcnJvcih0KX0pfTpmdW5jdGlvbih0KXtlLmVycm9yKHQpfSksZS5jb21wbGV0ZSYmKHM9dGhpcy5fX2lzQXN5bmM/ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29tcGxldGUoKX0pfTpmdW5jdGlvbigpe2UuY29tcGxldGUoKX0pKToobz10aGlzLl9faXNBc3luYz9mdW5jdGlvbih0KXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGUodCl9KX06ZnVuY3Rpb24odCl7ZSh0KX0sbiYmKGE9dGhpcy5fX2lzQXN5bmM/ZnVuY3Rpb24odCl7c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBuKHQpfSl9OmZ1bmN0aW9uKHQpe24odCl9KSxyJiYocz10aGlzLl9faXNBc3luYz9mdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gcigpfSl9OmZ1bmN0aW9uKCl7cigpfSkpO3ZhciB1PXQucHJvdG90eXBlLnN1YnNjcmliZS5jYWxsKHRoaXMsbyxhLHMpO3JldHVybiBlIGluc3RhbmNlb2YgaS5hJiZlLmFkZCh1KSx1fSxlfShvLmEpLEZ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgZSxuPXQuZW5hYmxlTG9uZ1N0YWNrVHJhY2Uscj12b2lkIDAhPT1uJiZuO2lmKHRoaXMuaGFzUGVuZGluZ01pY3JvdGFza3M9ITEsdGhpcy5oYXNQZW5kaW5nTWFjcm90YXNrcz0hMSx0aGlzLmlzU3RhYmxlPSEwLHRoaXMub25VbnN0YWJsZT1uZXcgTHQoITEpLHRoaXMub25NaWNyb3Rhc2tFbXB0eT1uZXcgTHQoITEpLHRoaXMub25TdGFibGU9bmV3IEx0KCExKSx0aGlzLm9uRXJyb3I9bmV3IEx0KCExKSwidW5kZWZpbmVkIj09dHlwZW9mIFpvbmUpdGhyb3cgbmV3IEVycm9yKCJJbiB0aGlzIGNvbmZpZ3VyYXRpb24gQW5ndWxhciByZXF1aXJlcyBab25lLmpzIik7Wm9uZS5hc3NlcnRab25lUGF0Y2hlZCgpLHRoaXMuX25lc3Rpbmc9MCx0aGlzLl9vdXRlcj10aGlzLl9pbm5lcj1ab25lLmN1cnJlbnQsWm9uZS53dGZab25lU3BlYyYmKHRoaXMuX2lubmVyPXRoaXMuX2lubmVyLmZvcmsoWm9uZS53dGZab25lU3BlYykpLFpvbmUuVGFza1RyYWNraW5nWm9uZVNwZWMmJih0aGlzLl9pbm5lcj10aGlzLl9pbm5lci5mb3JrKG5ldyBab25lLlRhc2tUcmFja2luZ1pvbmVTcGVjKSksciYmWm9uZS5sb25nU3RhY2tUcmFjZVpvbmVTcGVjJiYodGhpcy5faW5uZXI9dGhpcy5faW5uZXIuZm9yayhab25lLmxvbmdTdGFja1RyYWNlWm9uZVNwZWMpKSwoZT10aGlzKS5faW5uZXI9ZS5faW5uZXIuZm9yayh7bmFtZToiYW5ndWxhciIscHJvcGVydGllczp7aXNBbmd1bGFyWm9uZTohMH0sb25JbnZva2VUYXNrOmZ1bmN0aW9uKHQsbixyLGksbyxhKXt0cnl7cmV0dXJuIEJ0KGUpLHQuaW52b2tlVGFzayhyLGksbyxhKX1maW5hbGx5e0h0KGUpfX0sb25JbnZva2U6ZnVuY3Rpb24odCxuLHIsaSxvLGEscyl7dHJ5e3JldHVybiBCdChlKSx0Lmludm9rZShyLGksbyxhLHMpfWZpbmFsbHl7SHQoZSl9fSxvbkhhc1Rhc2s6ZnVuY3Rpb24odCxuLHIsaSl7dC5oYXNUYXNrKHIsaSksbj09PXImJigibWljcm9UYXNrIj09aS5jaGFuZ2U/KGUuaGFzUGVuZGluZ01pY3JvdGFza3M9aS5taWNyb1Rhc2ssenQoZSkpOiJtYWNyb1Rhc2siPT1pLmNoYW5nZSYmKGUuaGFzUGVuZGluZ01hY3JvdGFza3M9aS5tYWNyb1Rhc2spKX0sb25IYW5kbGVFcnJvcjpmdW5jdGlvbih0LG4scixpKXtyZXR1cm4gdC5oYW5kbGVFcnJvcihyLGkpLGUucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24oKXtyZXR1cm4gZS5vbkVycm9yLmVtaXQoaSl9KSwhMX19KX1yZXR1cm4gdC5pc0luQW5ndWxhclpvbmU9ZnVuY3Rpb24oKXtyZXR1cm4hMD09PVpvbmUuY3VycmVudC5nZXQoImlzQW5ndWxhclpvbmUiKX0sdC5hc3NlcnRJbkFuZ3VsYXJab25lPWZ1bmN0aW9uKCl7aWYoIXQuaXNJbkFuZ3VsYXJab25lKCkpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCB0byBiZSBpbiBBbmd1bGFyIFpvbmUsIGJ1dCBpdCBpcyBub3QhIil9LHQuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZT1mdW5jdGlvbigpe2lmKHQuaXNJbkFuZ3VsYXJab25lKCkpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCB0byBub3QgYmUgaW4gQW5ndWxhciBab25lLCBidXQgaXQgaXMhIil9LHQucHJvdG90eXBlLnJ1bj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX2lubmVyLnJ1bih0LGUsbil9LHQucHJvdG90eXBlLnJ1blRhc2s9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcy5faW5uZXIsbz1pLnNjaGVkdWxlRXZlbnRUYXNrKCJOZ1pvbmVFdmVudDogIityLHQsVXQsVnQsVnQpO3RyeXtyZXR1cm4gaS5ydW5UYXNrKG8sZSxuKX1maW5hbGx5e2kuY2FuY2VsVGFzayhvKX19LHQucHJvdG90eXBlLnJ1bkd1YXJkZWQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLl9pbm5lci5ydW5HdWFyZGVkKHQsZSxuKX0sdC5wcm90b3R5cGUucnVuT3V0c2lkZUFuZ3VsYXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX291dGVyLnJ1bih0KX0sdH0oKTtmdW5jdGlvbiBWdCgpe312YXIgVXQ9e307ZnVuY3Rpb24genQodCl7aWYoMD09dC5fbmVzdGluZyYmIXQuaGFzUGVuZGluZ01pY3JvdGFza3MmJiF0LmlzU3RhYmxlKXRyeXt0Ll9uZXN0aW5nKyssdC5vbk1pY3JvdGFza0VtcHR5LmVtaXQobnVsbCl9ZmluYWxseXtpZih0Ll9uZXN0aW5nLS0sIXQuaGFzUGVuZGluZ01pY3JvdGFza3MpdHJ5e3QucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24oKXtyZXR1cm4gdC5vblN0YWJsZS5lbWl0KG51bGwpfSl9ZmluYWxseXt0LmlzU3RhYmxlPSEwfX19ZnVuY3Rpb24gQnQodCl7dC5fbmVzdGluZysrLHQuaXNTdGFibGUmJih0LmlzU3RhYmxlPSExLHQub25VbnN0YWJsZS5lbWl0KG51bGwpKX1mdW5jdGlvbiBIdCh0KXt0Ll9uZXN0aW5nLS0senQodCl9dmFyIFd0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuaGFzUGVuZGluZ01pY3JvdGFza3M9ITEsdGhpcy5oYXNQZW5kaW5nTWFjcm90YXNrcz0hMSx0aGlzLmlzU3RhYmxlPSEwLHRoaXMub25VbnN0YWJsZT1uZXcgTHQsdGhpcy5vbk1pY3JvdGFza0VtcHR5PW5ldyBMdCx0aGlzLm9uU3RhYmxlPW5ldyBMdCx0aGlzLm9uRXJyb3I9bmV3IEx0fXJldHVybiB0LnByb3RvdHlwZS5ydW49ZnVuY3Rpb24odCl7cmV0dXJuIHQoKX0sdC5wcm90b3R5cGUucnVuR3VhcmRlZD1mdW5jdGlvbih0KXtyZXR1cm4gdCgpfSx0LnByb3RvdHlwZS5ydW5PdXRzaWRlQW5ndWxhcj1mdW5jdGlvbih0KXtyZXR1cm4gdCgpfSx0LnByb3RvdHlwZS5ydW5UYXNrPWZ1bmN0aW9uKHQpe3JldHVybiB0KCl9LHR9KCkscXQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBlPXRoaXM7dGhpcy5fbmdab25lPXQsdGhpcy5fcGVuZGluZ0NvdW50PTAsdGhpcy5faXNab25lU3RhYmxlPSEwLHRoaXMuX2RpZFdvcms9ITEsdGhpcy5fY2FsbGJhY2tzPVtdLHRoaXMuX3dhdGNoQW5ndWxhckV2ZW50cygpLHQucnVuKGZ1bmN0aW9uKCl7ZS50YXNrVHJhY2tpbmdab25lPVpvbmUuY3VycmVudC5nZXQoIlRhc2tUcmFja2luZ1pvbmUiKX0pfXJldHVybiB0LnByb3RvdHlwZS5fd2F0Y2hBbmd1bGFyRXZlbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9uZ1pvbmUub25VbnN0YWJsZS5zdWJzY3JpYmUoe25leHQ6ZnVuY3Rpb24oKXt0Ll9kaWRXb3JrPSEwLHQuX2lzWm9uZVN0YWJsZT0hMX19KSx0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24oKXt0Ll9uZ1pvbmUub25TdGFibGUuc3Vic2NyaWJlKHtuZXh0OmZ1bmN0aW9uKCl7RnQuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpLHcoZnVuY3Rpb24oKXt0Ll9pc1pvbmVTdGFibGU9ITAsdC5fcnVuQ2FsbGJhY2tzSWZSZWFkeSgpfSl9fSl9KX0sdC5wcm90b3R5cGUuaW5jcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BlbmRpbmdDb3VudCs9MSx0aGlzLl9kaWRXb3JrPSEwLHRoaXMuX3BlbmRpbmdDb3VudH0sdC5wcm90b3R5cGUuZGVjcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50PWZ1bmN0aW9uKCl7aWYodGhpcy5fcGVuZGluZ0NvdW50LT0xLHRoaXMuX3BlbmRpbmdDb3VudDwwKXRocm93IG5ldyBFcnJvcigicGVuZGluZyBhc3luYyByZXF1ZXN0cyBiZWxvdyB6ZXJvIik7cmV0dXJuIHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKSx0aGlzLl9wZW5kaW5nQ291bnR9LHQucHJvdG90eXBlLmlzU3RhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzWm9uZVN0YWJsZSYmMD09PXRoaXMuX3BlbmRpbmdDb3VudCYmIXRoaXMuX25nWm9uZS5oYXNQZW5kaW5nTWFjcm90YXNrc30sdC5wcm90b3R5cGUuX3J1bkNhbGxiYWNrc0lmUmVhZHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKHRoaXMuaXNTdGFibGUoKSl3KGZ1bmN0aW9uKCl7Zm9yKDswIT09dC5fY2FsbGJhY2tzLmxlbmd0aDspe3ZhciBlPXQuX2NhbGxiYWNrcy5wb3AoKTtjbGVhclRpbWVvdXQoZS50aW1lb3V0SWQpLGUuZG9uZUNiKHQuX2RpZFdvcmspfXQuX2RpZFdvcms9ITF9KTtlbHNle3ZhciBlPXRoaXMuZ2V0UGVuZGluZ1Rhc2tzKCk7dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrcy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIXQudXBkYXRlQ2J8fCF0LnVwZGF0ZUNiKGUpfHwoY2xlYXJUaW1lb3V0KHQudGltZW91dElkKSwhMSl9KSx0aGlzLl9kaWRXb3JrPSEwfX0sdC5wcm90b3R5cGUuZ2V0UGVuZGluZ1Rhc2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFza1RyYWNraW5nWm9uZT90aGlzLnRhc2tUcmFja2luZ1pvbmUubWFjcm9UYXNrcy5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTp0LnNvdXJjZSxpc1BlcmlvZGljOnQuZGF0YS5pc1BlcmlvZGljLGRlbGF5OnQuZGF0YS5kZWxheSxjcmVhdGlvbkxvY2F0aW9uOnQuY3JlYXRpb25Mb2NhdGlvbix4aHI6dC5kYXRhLnRhcmdldH19KTpbXX0sdC5wcm90b3R5cGUuYWRkQ2FsbGJhY2s9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMsaT0tMTtlJiZlPjAmJihpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLl9jYWxsYmFja3M9ci5fY2FsbGJhY2tzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC50aW1lb3V0SWQhPT1pfSksdChyLl9kaWRXb3JrLHIuZ2V0UGVuZGluZ1Rhc2tzKCkpfSxlKSksdGhpcy5fY2FsbGJhY2tzLnB1c2goe2RvbmVDYjp0LHRpbWVvdXRJZDppLHVwZGF0ZUNiOm59KX0sdC5wcm90b3R5cGUud2hlblN0YWJsZT1mdW5jdGlvbih0LGUsbil7aWYobiYmIXRoaXMudGFza1RyYWNraW5nWm9uZSl0aHJvdyBuZXcgRXJyb3IoJ1Rhc2sgdHJhY2tpbmcgem9uZSBpcyByZXF1aXJlZCB3aGVuIHBhc3NpbmcgYW4gdXBkYXRlIGNhbGxiYWNrIHRvIHdoZW5TdGFibGUoKS4gSXMgInpvbmUuanMvZGlzdC90YXNrLXRyYWNraW5nLmpzIiBsb2FkZWQ/Jyk7dGhpcy5hZGRDYWxsYmFjayh0LGUsbiksdGhpcy5fcnVuQ2FsbGJhY2tzSWZSZWFkeSgpfSx0LnByb3RvdHlwZS5nZXRQZW5kaW5nUmVxdWVzdENvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BlbmRpbmdDb3VudH0sdC5wcm90b3R5cGUuZmluZFByb3ZpZGVycz1mdW5jdGlvbih0LGUsbil7cmV0dXJuW119LHR9KCksWXQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fYXBwbGljYXRpb25zPW5ldyBNYXAsS3QuYWRkVG9XaW5kb3codGhpcyl9cmV0dXJuIHQucHJvdG90eXBlLnJlZ2lzdGVyQXBwbGljYXRpb249ZnVuY3Rpb24odCxlKXt0aGlzLl9hcHBsaWNhdGlvbnMuc2V0KHQsZSl9LHQucHJvdG90eXBlLnVucmVnaXN0ZXJBcHBsaWNhdGlvbj1mdW5jdGlvbih0KXt0aGlzLl9hcHBsaWNhdGlvbnMuZGVsZXRlKHQpfSx0LnByb3RvdHlwZS51bnJlZ2lzdGVyQWxsQXBwbGljYXRpb25zPWZ1bmN0aW9uKCl7dGhpcy5fYXBwbGljYXRpb25zLmNsZWFyKCl9LHQucHJvdG90eXBlLmdldFRlc3RhYmlsaXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hcHBsaWNhdGlvbnMuZ2V0KHQpfHxudWxsfSx0LnByb3RvdHlwZS5nZXRBbGxUZXN0YWJpbGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fYXBwbGljYXRpb25zLnZhbHVlcygpKX0sdC5wcm90b3R5cGUuZ2V0QWxsUm9vdEVsZW1lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fYXBwbGljYXRpb25zLmtleXMoKSl9LHQucHJvdG90eXBlLmZpbmRUZXN0YWJpbGl0eUluVHJlZT1mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0hMCksS3QuZmluZFRlc3RhYmlsaXR5SW5UcmVlKHRoaXMsdCxlKX0sdC5jdG9yUGFyYW1ldGVycz1mdW5jdGlvbigpe3JldHVybltdfSx0fSgpO2Z1bmN0aW9uIEd0KHQpe0t0PXR9dmFyIFF0LEt0PW5ldyhmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmFkZFRvV2luZG93PWZ1bmN0aW9uKHQpe30sdC5wcm90b3R5cGUuZmluZFRlc3RhYmlsaXR5SW5UcmVlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbH0sdH0oKSksWnQ9ITAsWHQ9ITEsJHQ9bmV3IGMoIkFsbG93TXVsdGlwbGVUb2tlbiIpO2Z1bmN0aW9uIEp0KCl7aWYoWHQpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZW5hYmxlIHByb2QgbW9kZSBhZnRlciBwbGF0Zm9ybSBzZXR1cC4iKTtadD0hMX1mdW5jdGlvbiB0ZSgpe3JldHVybiBYdD0hMCxadH12YXIgZWU9ZnVuY3Rpb24odCxlKXt0aGlzLm5hbWU9dCx0aGlzLnRva2VuPWV9O2Z1bmN0aW9uIG5lKHQsZSxuKXt2b2lkIDA9PT1uJiYobj1bXSk7dmFyIHI9IlBsYXRmb3JtOiAiK2UsaT1uZXcgYyhyKTtyZXR1cm4gZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9W10pO3ZhciBvPXJlKCk7aWYoIW98fG8uaW5qZWN0b3IuZ2V0KCR0LCExKSlpZih0KXQobi5jb25jYXQoZSkuY29uY2F0KHtwcm92aWRlOmksdXNlVmFsdWU6ITB9KSk7ZWxzZXt2YXIgYT1uLmNvbmNhdChlKS5jb25jYXQoe3Byb3ZpZGU6aSx1c2VWYWx1ZTohMH0pOyFmdW5jdGlvbih0KXtpZihRdCYmIVF0LmRlc3Ryb3llZCYmIVF0LmluamVjdG9yLmdldCgkdCwhMSkpdGhyb3cgbmV3IEVycm9yKCJUaGVyZSBjYW4gYmUgb25seSBvbmUgcGxhdGZvcm0uIERlc3Ryb3kgdGhlIHByZXZpb3VzIG9uZSB0byBjcmVhdGUgYSBuZXcgb25lLiIpO1F0PXQuZ2V0KGllKTt2YXIgZT10LmdldChtdCxudWxsKTtlJiZlLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQoKX0pfShOLmNyZWF0ZSh7cHJvdmlkZXJzOmEsbmFtZTpyfSkpfXJldHVybiBmdW5jdGlvbih0KXt2YXIgZT1yZSgpO2lmKCFlKXRocm93IG5ldyBFcnJvcigiTm8gcGxhdGZvcm0gZXhpc3RzISIpO2lmKCFlLmluamVjdG9yLmdldCh0LG51bGwpKXRocm93IG5ldyBFcnJvcigiQSBwbGF0Zm9ybSB3aXRoIGEgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gY3JlYXRlZC4gUGxlYXNlIGRlc3Ryb3kgaXQgZmlyc3QuIik7cmV0dXJuIGV9KGkpfX1mdW5jdGlvbiByZSgpe3JldHVybiBRdCYmIVF0LmRlc3Ryb3llZD9RdDpudWxsfXZhciBpZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5faW5qZWN0b3I9dCx0aGlzLl9tb2R1bGVzPVtdLHRoaXMuX2Rlc3Ryb3lMaXN0ZW5lcnM9W10sdGhpcy5fZGVzdHJveWVkPSExfXJldHVybiB0LnByb3RvdHlwZS5ib290c3RyYXBNb2R1bGVGYWN0b3J5PWZ1bmN0aW9uKHQsZSl7dmFyIG4scj10aGlzLGk9Im5vb3AiPT09KG49ZT9lLm5nWm9uZTp2b2lkIDApP25ldyBXdDooInpvbmUuanMiPT09bj92b2lkIDA6bil8fG5ldyBGdCh7ZW5hYmxlTG9uZ1N0YWNrVHJhY2U6dGUoKX0pLG89W3twcm92aWRlOkZ0LHVzZVZhbHVlOml9XTtyZXR1cm4gaS5ydW4oZnVuY3Rpb24oKXt2YXIgZT1OLmNyZWF0ZSh7cHJvdmlkZXJzOm8scGFyZW50OnIuaW5qZWN0b3IsbmFtZTp0Lm1vZHVsZVR5cGUubmFtZX0pLG49dC5jcmVhdGUoZSksYT1uLmluamVjdG9yLmdldChhdCxudWxsKTtpZighYSl0aHJvdyBuZXcgRXJyb3IoIk5vIEVycm9ySGFuZGxlci4gSXMgcGxhdGZvcm0gbW9kdWxlIChCcm93c2VyTW9kdWxlKSBpbmNsdWRlZD8iKTtyZXR1cm4gbi5vbkRlc3Ryb3koZnVuY3Rpb24oKXtyZXR1cm4gc2Uoci5fbW9kdWxlcyxuKX0pLGkucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24oKXtyZXR1cm4gaS5vbkVycm9yLnN1YnNjcmliZSh7bmV4dDpmdW5jdGlvbih0KXthLmhhbmRsZUVycm9yKHQpfX0pfSksZnVuY3Rpb24odCxlLGkpe3RyeXt2YXIgbz0oKGE9bi5pbmplY3Rvci5nZXQoZnQpKS5ydW5Jbml0aWFsaXplcnMoKSxhLmRvbmVQcm9taXNlLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gci5fbW9kdWxlRG9Cb290c3RyYXAobiksbn0pKTtyZXR1cm4gdXQobyk/by5jYXRjaChmdW5jdGlvbihuKXt0aHJvdyBlLnJ1bk91dHNpZGVBbmd1bGFyKGZ1bmN0aW9uKCl7cmV0dXJuIHQuaGFuZGxlRXJyb3Iobil9KSxufSk6b31jYXRjaChuKXt0aHJvdyBlLnJ1bk91dHNpZGVBbmd1bGFyKGZ1bmN0aW9uKCl7cmV0dXJuIHQuaGFuZGxlRXJyb3Iobil9KSxufXZhciBhfShhLGkpfSl9LHQucHJvdG90eXBlLmJvb3RzdHJhcE1vZHVsZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dm9pZCAwPT09ZSYmKGU9W10pO3ZhciByPXRoaXMuaW5qZWN0b3IuZ2V0KHd0KSxpPW9lKHt9LGUpO3JldHVybiByLmNyZWF0ZUNvbXBpbGVyKFtpXSkuY29tcGlsZU1vZHVsZUFzeW5jKHQpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIG4uYm9vdHN0cmFwTW9kdWxlRmFjdG9yeSh0LGkpfSl9LHQucHJvdG90eXBlLl9tb2R1bGVEb0Jvb3RzdHJhcD1mdW5jdGlvbih0KXt2YXIgZT10LmluamVjdG9yLmdldChhZSk7aWYodC5fYm9vdHN0cmFwQ29tcG9uZW50cy5sZW5ndGg+MCl0Ll9ib290c3RyYXBDb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUuYm9vdHN0cmFwKHQpfSk7ZWxzZXtpZighdC5pbnN0YW5jZS5uZ0RvQm9vdHN0cmFwKXRocm93IG5ldyBFcnJvcigiVGhlIG1vZHVsZSAiK08odC5pbnN0YW5jZS5jb25zdHJ1Y3RvcikrJyB3YXMgYm9vdHN0cmFwcGVkLCBidXQgaXQgZG9lcyBub3QgZGVjbGFyZSAiQE5nTW9kdWxlLmJvb3RzdHJhcCIgY29tcG9uZW50cyBub3IgYSAibmdEb0Jvb3RzdHJhcCIgbWV0aG9kLiBQbGVhc2UgZGVmaW5lIG9uZSBvZiB0aGVzZS4nKTt0Lmluc3RhbmNlLm5nRG9Cb290c3RyYXAoZSl9dGhpcy5fbW9kdWxlcy5wdXNoKHQpfSx0LnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24odCl7dGhpcy5fZGVzdHJveUxpc3RlbmVycy5wdXNoKHQpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImluamVjdG9yIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2luamVjdG9yfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZih0aGlzLl9kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJUaGUgcGxhdGZvcm0gaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQhIik7dGhpcy5fbW9kdWxlcy5zbGljZSgpLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQuZGVzdHJveSgpfSksdGhpcy5fZGVzdHJveUxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0KCl9KSx0aGlzLl9kZXN0cm95ZWQ9ITB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZGVzdHJveWVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rlc3Ryb3llZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0fSgpO2Z1bmN0aW9uIG9lKHQsZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5yZWR1Y2Uob2UsdCk6T2JqZWN0KHIuYSkoe30sdCxlKX12YXIgYWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLHIsaSxvKXt2YXIgbD10aGlzO3RoaXMuX3pvbmU9dCx0aGlzLl9jb25zb2xlPWUsdGhpcy5faW5qZWN0b3I9bix0aGlzLl9leGNlcHRpb25IYW5kbGVyPXIsdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyPWksdGhpcy5faW5pdFN0YXR1cz1vLHRoaXMuX2Jvb3RzdHJhcExpc3RlbmVycz1bXSx0aGlzLl92aWV3cz1bXSx0aGlzLl9ydW5uaW5nVGljaz0hMSx0aGlzLl9lbmZvcmNlTm9OZXdDaGFuZ2VzPSExLHRoaXMuX3N0YWJsZT0hMCx0aGlzLmNvbXBvbmVudFR5cGVzPVtdLHRoaXMuY29tcG9uZW50cz1bXSx0aGlzLl9lbmZvcmNlTm9OZXdDaGFuZ2VzPXRlKCksdGhpcy5fem9uZS5vbk1pY3JvdGFza0VtcHR5LnN1YnNjcmliZSh7bmV4dDpmdW5jdGlvbigpe2wuX3pvbmUucnVuKGZ1bmN0aW9uKCl7bC50aWNrKCl9KX19KTt2YXIgYz1uZXcgYS5hKGZ1bmN0aW9uKHQpe2wuX3N0YWJsZT1sLl96b25lLmlzU3RhYmxlJiYhbC5fem9uZS5oYXNQZW5kaW5nTWFjcm90YXNrcyYmIWwuX3pvbmUuaGFzUGVuZGluZ01pY3JvdGFza3MsbC5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcihmdW5jdGlvbigpe3QubmV4dChsLl9zdGFibGUpLHQuY29tcGxldGUoKX0pfSksZj1uZXcgYS5hKGZ1bmN0aW9uKHQpe3ZhciBlO2wuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24oKXtlPWwuX3pvbmUub25TdGFibGUuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7RnQuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpLHcoZnVuY3Rpb24oKXtsLl9zdGFibGV8fGwuX3pvbmUuaGFzUGVuZGluZ01hY3JvdGFza3N8fGwuX3pvbmUuaGFzUGVuZGluZ01pY3JvdGFza3N8fChsLl9zdGFibGU9ITAsdC5uZXh0KCEwKSl9KX0pfSk7dmFyIG49bC5fem9uZS5vblVuc3RhYmxlLnN1YnNjcmliZShmdW5jdGlvbigpe0Z0LmFzc2VydEluQW5ndWxhclpvbmUoKSxsLl9zdGFibGUmJihsLl9zdGFibGU9ITEsbC5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcihmdW5jdGlvbigpe3QubmV4dCghMSl9KSl9KTtyZXR1cm4gZnVuY3Rpb24oKXtlLnVuc3Vic2NyaWJlKCksbi51bnN1YnNjcmliZSgpfX0pO3RoaXMuaXNTdGFibGU9T2JqZWN0KHMuYSkoYyxmLnBpcGUoT2JqZWN0KHUuYSkoKSkpfXJldHVybiB0LnByb3RvdHlwZS5ib290c3RyYXA9ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRoaXM7aWYoIXRoaXMuX2luaXRTdGF0dXMuZG9uZSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBib290c3RyYXAgYXMgdGhlcmUgYXJlIHN0aWxsIGFzeW5jaHJvbm91cyBpbml0aWFsaXplcnMgcnVubmluZy4gQm9vdHN0cmFwIGNvbXBvbmVudHMgaW4gdGhlIGBuZ0RvQm9vdHN0cmFwYCBtZXRob2Qgb2YgdGhlIHJvb3QgbW9kdWxlLiIpO249dCBpbnN0YW5jZW9mIHh0P3Q6dGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHQpLHRoaXMuY29tcG9uZW50VHlwZXMucHVzaChuLmNvbXBvbmVudFR5cGUpO3ZhciBpPW4gaW5zdGFuY2VvZiBBdD9udWxsOnRoaXMuX2luamVjdG9yLmdldChqdCksbz1uLmNyZWF0ZShOLk5VTEwsW10sZXx8bi5zZWxlY3RvcixpKTtvLm9uRGVzdHJveShmdW5jdGlvbigpe3IuX3VubG9hZENvbXBvbmVudChvKX0pO3ZhciBhPW8uaW5qZWN0b3IuZ2V0KHF0LG51bGwpO3JldHVybiBhJiZvLmluamVjdG9yLmdldChZdCkucmVnaXN0ZXJBcHBsaWNhdGlvbihvLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsYSksdGhpcy5fbG9hZENvbXBvbmVudChvKSx0ZSgpJiZ0aGlzLl9jb25zb2xlLmxvZygiQW5ndWxhciBpcyBydW5uaW5nIGluIHRoZSBkZXZlbG9wbWVudCBtb2RlLiBDYWxsIGVuYWJsZVByb2RNb2RlKCkgdG8gZW5hYmxlIHRoZSBwcm9kdWN0aW9uIG1vZGUuIiksb30sdC5wcm90b3R5cGUudGljaz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYodGhpcy5fcnVubmluZ1RpY2spdGhyb3cgbmV3IEVycm9yKCJBcHBsaWNhdGlvblJlZi50aWNrIGlzIGNhbGxlZCByZWN1cnNpdmVseSIpO3ZhciBuPXQuX3RpY2tTY29wZSgpO3RyeXt0aGlzLl9ydW5uaW5nVGljaz0hMCx0aGlzLl92aWV3cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmRldGVjdENoYW5nZXMoKX0pLHRoaXMuX2VuZm9yY2VOb05ld0NoYW5nZXMmJnRoaXMuX3ZpZXdzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQuY2hlY2tOb0NoYW5nZXMoKX0pfWNhdGNoKHQpe3RoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24oKXtyZXR1cm4gZS5fZXhjZXB0aW9uSGFuZGxlci5oYW5kbGVFcnJvcih0KX0pfWZpbmFsbHl7dGhpcy5fcnVubmluZ1RpY2s9ITEsRHQobil9fSx0LnByb3RvdHlwZS5hdHRhY2hWaWV3PWZ1bmN0aW9uKHQpe3ZhciBlPXQ7dGhpcy5fdmlld3MucHVzaChlKSxlLmF0dGFjaFRvQXBwUmVmKHRoaXMpfSx0LnByb3RvdHlwZS5kZXRhY2hWaWV3PWZ1bmN0aW9uKHQpe3ZhciBlPXQ7c2UodGhpcy5fdmlld3MsZSksZS5kZXRhY2hGcm9tQXBwUmVmKCl9LHQucHJvdG90eXBlLl9sb2FkQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3RoaXMuYXR0YWNoVmlldyh0Lmhvc3RWaWV3KSx0aGlzLnRpY2soKSx0aGlzLmNvbXBvbmVudHMucHVzaCh0KSx0aGlzLl9pbmplY3Rvci5nZXQoZ3QsW10pLmNvbmNhdCh0aGlzLl9ib290c3RyYXBMaXN0ZW5lcnMpLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KX0sdC5wcm90b3R5cGUuX3VubG9hZENvbXBvbmVudD1mdW5jdGlvbih0KXt0aGlzLmRldGFjaFZpZXcodC5ob3N0Vmlldyksc2UodGhpcy5jb21wb25lbnRzLHQpfSx0LnByb3RvdHlwZS5uZ09uRGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX3ZpZXdzLnNsaWNlKCkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdC5kZXN0cm95KCl9KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJ2aWV3Q291bnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmlld3MubGVuZ3RofSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQuX3RpY2tTY29wZT1SdCgiQXBwbGljYXRpb25SZWYjdGljaygpIiksdH0oKTtmdW5jdGlvbiBzZSh0LGUpe3ZhciBuPXQuaW5kZXhPZihlKTtuPi0xJiZ0LnNwbGljZShuLDEpfXZhciB1ZT1mdW5jdGlvbigpe30sbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRbdC5JbXBvcnRhbnQ9MV09IkltcG9ydGFudCIsdFt0LkRhc2hDYXNlPTJdPSJEYXNoQ2FzZSIsdH0oe30pLGNlPWZ1bmN0aW9uKHQpe3RoaXMubmF0aXZlRWxlbWVudD10fSxmZT1mdW5jdGlvbigpe30saGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5kaXJ0eT0hMCx0aGlzLl9yZXN1bHRzPVtdLHRoaXMuY2hhbmdlcz1uZXcgTHQsdGhpcy5sZW5ndGg9MH1yZXR1cm4gdC5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZXN1bHRzLm1hcCh0KX0sdC5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZXN1bHRzLmZpbHRlcih0KX0sdC5wcm90b3R5cGUuZmluZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVzdWx0cy5maW5kKHQpfSx0LnByb3RvdHlwZS5yZWR1Y2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcmVzdWx0cy5yZWR1Y2UodCxlKX0sdC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXt0aGlzLl9yZXN1bHRzLmZvckVhY2godCl9LHQucHJvdG90eXBlLnNvbWU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3Jlc3VsdHMuc29tZSh0KX0sdC5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXN1bHRzLnNsaWNlKCl9LHQucHJvdG90eXBlW18oKV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVzdWx0c1tfKCldKCl9LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc3VsdHMudG9TdHJpbmcoKX0sdC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24odCl7dGhpcy5fcmVzdWx0cz1mdW5jdGlvbiB0KGUpe3JldHVybiBlLnJlZHVjZShmdW5jdGlvbihlLG4pe3ZhciByPUFycmF5LmlzQXJyYXkobik/dChuKTpuO3JldHVybiBlLmNvbmNhdChyKX0sW10pfSh0KSx0aGlzLmRpcnR5PSExLHRoaXMubGVuZ3RoPXRoaXMuX3Jlc3VsdHMubGVuZ3RoLHRoaXMubGFzdD10aGlzLl9yZXN1bHRzW3RoaXMubGVuZ3RoLTFdLHRoaXMuZmlyc3Q9dGhpcy5fcmVzdWx0c1swXX0sdC5wcm90b3R5cGUubm90aWZ5T25DaGFuZ2VzPWZ1bmN0aW9uKCl7dGhpcy5jaGFuZ2VzLmVtaXQodGhpcyl9LHQucHJvdG90eXBlLnNldERpcnR5PWZ1bmN0aW9uKCl7dGhpcy5kaXJ0eT0hMH0sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuY2hhbmdlcy5jb21wbGV0ZSgpLHRoaXMuY2hhbmdlcy51bnN1YnNjcmliZSgpfSx0fSgpLGRlPWZ1bmN0aW9uKCl7fSxwZT17ZmFjdG9yeVBhdGhQcmVmaXg6IiIsZmFjdG9yeVBhdGhTdWZmaXg6Ii5uZ2ZhY3RvcnkifSxtZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9jb21waWxlcj10LHRoaXMuX2NvbmZpZz1lfHxwZX1yZXR1cm4gdC5wcm90b3R5cGUubG9hZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29tcGlsZXIgaW5zdGFuY2VvZiBfdD90aGlzLmxvYWRGYWN0b3J5KHQpOnRoaXMubG9hZEFuZENvbXBpbGUodCl9LHQucHJvdG90eXBlLmxvYWRBbmRDb21waWxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsaT1PYmplY3Qoci5jKSh0LnNwbGl0KCIjIiksMiksbz1pWzBdLGE9aVsxXTtyZXR1cm4gdm9pZCAwPT09YSYmKGE9ImRlZmF1bHQiKSxuKCJjcm5kIikobykudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdFthXX0pLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIHllKHQsbyxhKX0pLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGUuX2NvbXBpbGVyLmNvbXBpbGVNb2R1bGVBc3luYyh0KX0pfSx0LnByb3RvdHlwZS5sb2FkRmFjdG9yeT1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3Qoci5jKSh0LnNwbGl0KCIjIiksMiksaT1lWzBdLG89ZVsxXSxhPSJOZ0ZhY3RvcnkiO3JldHVybiB2b2lkIDA9PT1vJiYobz0iZGVmYXVsdCIsYT0iIiksbigiY3JuZCIpKHRoaXMuX2NvbmZpZy5mYWN0b3J5UGF0aFByZWZpeCtpK3RoaXMuX2NvbmZpZy5mYWN0b3J5UGF0aFN1ZmZpeCkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4gdFtvK2FdfSkudGhlbihmdW5jdGlvbih0KXtyZXR1cm4geWUodCxpLG8pfSl9LHR9KCk7ZnVuY3Rpb24geWUodCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGZpbmQgJyIrbisiJyBpbiAnIitlKyInIik7cmV0dXJuIHR9dmFyIGdlPWZ1bmN0aW9uKCl7fSx2ZT1mdW5jdGlvbigpe30sYmU9ZnVuY3Rpb24oKXt9LF9lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5fZGVidWdDb250ZXh0PW4sdGhpcy5uYXRpdmVOb2RlPXQsZSYmZSBpbnN0YW5jZW9mIHdlP2UuYWRkQ2hpbGQodGhpcyk6dGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmxpc3RlbmVycz1bXX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpbmplY3RvciIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWJ1Z0NvbnRleHQuaW5qZWN0b3J9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjb21wb25lbnRJbnN0YW5jZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWJ1Z0NvbnRleHQuY29tcG9uZW50fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiY29udGV4dCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWJ1Z0NvbnRleHQuY29udGV4dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInJlZmVyZW5jZXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVidWdDb250ZXh0LnJlZmVyZW5jZXN9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwcm92aWRlclRva2VucyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWJ1Z0NvbnRleHQucHJvdmlkZXJUb2tlbnN9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdH0oKSx3ZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt2YXIgaT10LmNhbGwodGhpcyxlLG4scil8fHRoaXM7cmV0dXJuIGkucHJvcGVydGllcz17fSxpLmF0dHJpYnV0ZXM9e30saS5jbGFzc2VzPXt9LGkuc3R5bGVzPXt9LGkuY2hpbGROb2Rlcz1bXSxpLm5hdGl2ZUVsZW1lbnQ9ZSxpfXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLmFkZENoaWxkPWZ1bmN0aW9uKHQpe3QmJih0aGlzLmNoaWxkTm9kZXMucHVzaCh0KSx0LnBhcmVudD10aGlzKX0sZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jaGlsZE5vZGVzLmluZGV4T2YodCk7LTEhPT1lJiYodC5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkTm9kZXMuc3BsaWNlKGUsMSkpfSxlLnByb3RvdHlwZS5pbnNlcnRDaGlsZHJlbkFmdGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLG89dGhpcy5jaGlsZE5vZGVzLmluZGV4T2YodCk7LTEhPT1vJiYoKG49dGhpcy5jaGlsZE5vZGVzKS5zcGxpY2UuYXBwbHkobixPYmplY3Qoci5kKShbbysxLDBdLGUpKSxlLmZvckVhY2goZnVuY3Rpb24odCl7dC5wYXJlbnQmJnQucGFyZW50LnJlbW92ZUNoaWxkKHQpLHQucGFyZW50PWl9KSl9LGUucHJvdG90eXBlLmluc2VydEJlZm9yZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY2hpbGROb2Rlcy5pbmRleE9mKHQpOy0xPT09bj90aGlzLmFkZENoaWxkKGUpOihlLnBhcmVudCYmZS5wYXJlbnQucmVtb3ZlQ2hpbGQoZSksZS5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkTm9kZXMuc3BsaWNlKG4sMCxlKSl9LGUucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnF1ZXJ5QWxsKHQpWzBdfHxudWxsfSxlLnByb3RvdHlwZS5xdWVyeUFsbD1mdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4geGUodGhpcyx0LGUpLGV9LGUucHJvdG90eXBlLnF1ZXJ5QWxsTm9kZXM9ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIE9lKHRoaXMsdCxlKSxlfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImNoaWxkcmVuIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlcy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBlfSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUudHJpZ2dlckV2ZW50SGFuZGxlcj1mdW5jdGlvbih0LGUpe3RoaXMubGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24obil7bi5uYW1lPT10JiZuLmNhbGxiYWNrKGUpfSl9LGV9KF9lKTtmdW5jdGlvbiB4ZSh0LGUsbil7dC5jaGlsZE5vZGVzLmZvckVhY2goZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIHdlJiYoZSh0KSYmbi5wdXNoKHQpLHhlKHQsZSxuKSl9KX1mdW5jdGlvbiBPZSh0LGUsbil7dCBpbnN0YW5jZW9mIHdlJiZ0LmNoaWxkTm9kZXMuZm9yRWFjaChmdW5jdGlvbih0KXtlKHQpJiZuLnB1c2godCksdCBpbnN0YW5jZW9mIHdlJiZPZSh0LGUsbil9KX12YXIgQ2U9bmV3IE1hcDtmdW5jdGlvbiBTZSh0KXtyZXR1cm4gQ2UuZ2V0KHQpfHxudWxsfWZ1bmN0aW9uIEVlKHQpe0NlLnNldCh0Lm5hdGl2ZU5vZGUsdCl9ZnVuY3Rpb24ga2UodCxlKXt2YXIgbj1BZSh0KSxyPUFlKGUpO3JldHVybiBuJiZyP2Z1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9dFtfKCldKCksaT1lW18oKV0oKTs7KXt2YXIgbz1yLm5leHQoKSxhPWkubmV4dCgpO2lmKG8uZG9uZSYmYS5kb25lKXJldHVybiEwO2lmKG8uZG9uZXx8YS5kb25lKXJldHVybiExO2lmKCFuKG8udmFsdWUsYS52YWx1ZSkpcmV0dXJuITF9fSh0LGUsa2UpOiEobnx8IXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHR8fHJ8fCFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXx8eCh0LGUpfXZhciBUZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy53cmFwcGVkPXR9cmV0dXJuIHQud3JhcD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQoZSl9LHQudW53cmFwPWZ1bmN0aW9uKGUpe3JldHVybiB0LmlzV3JhcHBlZChlKT9lLndyYXBwZWQ6ZX0sdC5pc1dyYXBwZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB0fSx0fSgpLEllPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5wcmV2aW91c1ZhbHVlPXQsdGhpcy5jdXJyZW50VmFsdWU9ZSx0aGlzLmZpcnN0Q2hhbmdlPW59cmV0dXJuIHQucHJvdG90eXBlLmlzRmlyc3RDaGFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maXJzdENoYW5nZX0sdH0oKTtmdW5jdGlvbiBBZSh0KXtyZXR1cm4hIWplKHQpJiYoQXJyYXkuaXNBcnJheSh0KXx8ISh0IGluc3RhbmNlb2YgTWFwKSYmXygpaW4gdCl9ZnVuY3Rpb24gamUodCl7cmV0dXJuIG51bGwhPT10JiYoImZ1bmN0aW9uIj09dHlwZW9mIHR8fCJvYmplY3QiPT10eXBlb2YgdCl9dmFyIFBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuc3VwcG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIEFlKHQpfSx0LnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBOZSh0KX0sdH0oKSxNZT1mdW5jdGlvbih0LGUpe3JldHVybiBlfSxOZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5sZW5ndGg9MCx0aGlzLl9saW5rZWRSZWNvcmRzPW51bGwsdGhpcy5fdW5saW5rZWRSZWNvcmRzPW51bGwsdGhpcy5fcHJldmlvdXNJdEhlYWQ9bnVsbCx0aGlzLl9pdEhlYWQ9bnVsbCx0aGlzLl9pdFRhaWw9bnVsbCx0aGlzLl9hZGRpdGlvbnNIZWFkPW51bGwsdGhpcy5fYWRkaXRpb25zVGFpbD1udWxsLHRoaXMuX21vdmVzSGVhZD1udWxsLHRoaXMuX21vdmVzVGFpbD1udWxsLHRoaXMuX3JlbW92YWxzSGVhZD1udWxsLHRoaXMuX3JlbW92YWxzVGFpbD1udWxsLHRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWQ9bnVsbCx0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsPW51bGwsdGhpcy5fdHJhY2tCeUZuPXR8fE1lfXJldHVybiB0LnByb3RvdHlwZS5mb3JFYWNoSXRlbT1mdW5jdGlvbih0KXt2YXIgZTtmb3IoZT10aGlzLl9pdEhlYWQ7bnVsbCE9PWU7ZT1lLl9uZXh0KXQoZSl9LHQucHJvdG90eXBlLmZvckVhY2hPcGVyYXRpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2l0SGVhZCxuPXRoaXMuX3JlbW92YWxzSGVhZCxyPTAsaT1udWxsO2V8fG47KXt2YXIgbz0hbnx8ZSYmZS5jdXJyZW50SW5kZXg8RmUobixyLGkpP2U6bixhPUZlKG8scixpKSxzPW8uY3VycmVudEluZGV4O2lmKG89PT1uKXItLSxuPW4uX25leHRSZW1vdmVkO2Vsc2UgaWYoZT1lLl9uZXh0LG51bGw9PW8ucHJldmlvdXNJbmRleClyKys7ZWxzZXtpfHwoaT1bXSk7dmFyIHU9YS1yLGw9cy1yO2lmKHUhPWwpe2Zvcih2YXIgYz0wO2M8dTtjKyspe3ZhciBmPWM8aS5sZW5ndGg/aVtjXTppW2NdPTAsaD1mK2M7bDw9aCYmaDx1JiYoaVtjXT1mKzEpfWlbby5wcmV2aW91c0luZGV4XT1sLXV9fWEhPT1zJiZ0KG8sYSxzKX19LHQucHJvdG90eXBlLmZvckVhY2hQcmV2aW91c0l0ZW09ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKGU9dGhpcy5fcHJldmlvdXNJdEhlYWQ7bnVsbCE9PWU7ZT1lLl9uZXh0UHJldmlvdXMpdChlKX0sdC5wcm90b3R5cGUuZm9yRWFjaEFkZGVkSXRlbT1mdW5jdGlvbih0KXt2YXIgZTtmb3IoZT10aGlzLl9hZGRpdGlvbnNIZWFkO251bGwhPT1lO2U9ZS5fbmV4dEFkZGVkKXQoZSl9LHQucHJvdG90eXBlLmZvckVhY2hNb3ZlZEl0ZW09ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKGU9dGhpcy5fbW92ZXNIZWFkO251bGwhPT1lO2U9ZS5fbmV4dE1vdmVkKXQoZSl9LHQucHJvdG90eXBlLmZvckVhY2hSZW1vdmVkSXRlbT1mdW5jdGlvbih0KXt2YXIgZTtmb3IoZT10aGlzLl9yZW1vdmFsc0hlYWQ7bnVsbCE9PWU7ZT1lLl9uZXh0UmVtb3ZlZCl0KGUpfSx0LnByb3RvdHlwZS5mb3JFYWNoSWRlbnRpdHlDaGFuZ2U9ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKGU9dGhpcy5faWRlbnRpdHlDaGFuZ2VzSGVhZDtudWxsIT09ZTtlPWUuX25leHRJZGVudGl0eUNoYW5nZSl0KGUpfSx0LnByb3RvdHlwZS5kaWZmPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQmJih0PVtdKSwhQWUodCkpdGhyb3cgbmV3IEVycm9yKCJFcnJvciB0cnlpbmcgdG8gZGlmZiAnIitPKHQpKyInLiBPbmx5IGFycmF5cyBhbmQgaXRlcmFibGVzIGFyZSBhbGxvd2VkIik7cmV0dXJuIHRoaXMuY2hlY2sodCk/dGhpczpudWxsfSx0LnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLmNoZWNrPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5fcmVzZXQoKTt2YXIgbixyLGksbz10aGlzLl9pdEhlYWQsYT0hMTtpZihBcnJheS5pc0FycmF5KHQpKXt0aGlzLmxlbmd0aD10Lmxlbmd0aDtmb3IodmFyIHM9MDtzPHRoaXMubGVuZ3RoO3MrKylpPXRoaXMuX3RyYWNrQnlGbihzLHI9dFtzXSksbnVsbCE9PW8mJngoby50cmFja0J5SWQsaSk/KGEmJihvPXRoaXMuX3ZlcmlmeVJlaW5zZXJ0aW9uKG8scixpLHMpKSx4KG8uaXRlbSxyKXx8dGhpcy5fYWRkSWRlbnRpdHlDaGFuZ2UobyxyKSk6KG89dGhpcy5fbWlzbWF0Y2gobyxyLGkscyksYT0hMCksbz1vLl9uZXh0fWVsc2Ugbj0wLGZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllKHRbbl0pO2Vsc2UgZm9yKHZhciByPXRbXygpXSgpLGk9dm9pZCAwOyEoaT1yLm5leHQoKSkuZG9uZTspZShpLnZhbHVlKX0odCxmdW5jdGlvbih0KXtpPWUuX3RyYWNrQnlGbihuLHQpLG51bGwhPT1vJiZ4KG8udHJhY2tCeUlkLGkpPyhhJiYobz1lLl92ZXJpZnlSZWluc2VydGlvbihvLHQsaSxuKSkseChvLml0ZW0sdCl8fGUuX2FkZElkZW50aXR5Q2hhbmdlKG8sdCkpOihvPWUuX21pc21hdGNoKG8sdCxpLG4pLGE9ITApLG89by5fbmV4dCxuKyt9KSx0aGlzLmxlbmd0aD1uO3JldHVybiB0aGlzLl90cnVuY2F0ZShvKSx0aGlzLmNvbGxlY3Rpb249dCx0aGlzLmlzRGlydHl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNEaXJ0eSIse2dldDpmdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5fYWRkaXRpb25zSGVhZHx8bnVsbCE9PXRoaXMuX21vdmVzSGVhZHx8bnVsbCE9PXRoaXMuX3JlbW92YWxzSGVhZHx8bnVsbCE9PXRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuX3Jlc2V0PWZ1bmN0aW9uKCl7aWYodGhpcy5pc0RpcnR5KXt2YXIgdD12b2lkIDAsZT12b2lkIDA7Zm9yKHQ9dGhpcy5fcHJldmlvdXNJdEhlYWQ9dGhpcy5faXRIZWFkO251bGwhPT10O3Q9dC5fbmV4dCl0Ll9uZXh0UHJldmlvdXM9dC5fbmV4dDtmb3IodD10aGlzLl9hZGRpdGlvbnNIZWFkO251bGwhPT10O3Q9dC5fbmV4dEFkZGVkKXQucHJldmlvdXNJbmRleD10LmN1cnJlbnRJbmRleDtmb3IodGhpcy5fYWRkaXRpb25zSGVhZD10aGlzLl9hZGRpdGlvbnNUYWlsPW51bGwsdD10aGlzLl9tb3Zlc0hlYWQ7bnVsbCE9PXQ7dD1lKXQucHJldmlvdXNJbmRleD10LmN1cnJlbnRJbmRleCxlPXQuX25leHRNb3ZlZDt0aGlzLl9tb3Zlc0hlYWQ9dGhpcy5fbW92ZXNUYWlsPW51bGwsdGhpcy5fcmVtb3ZhbHNIZWFkPXRoaXMuX3JlbW92YWxzVGFpbD1udWxsLHRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWQ9dGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbD1udWxsfX0sdC5wcm90b3R5cGUuX21pc21hdGNoPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpO3JldHVybiBudWxsPT09dD9pPXRoaXMuX2l0VGFpbDooaT10Ll9wcmV2LHRoaXMuX3JlbW92ZSh0KSksbnVsbCE9PSh0PW51bGw9PT10aGlzLl9saW5rZWRSZWNvcmRzP251bGw6dGhpcy5fbGlua2VkUmVjb3Jkcy5nZXQobixyKSk/KHgodC5pdGVtLGUpfHx0aGlzLl9hZGRJZGVudGl0eUNoYW5nZSh0LGUpLHRoaXMuX21vdmVBZnRlcih0LGkscikpOm51bGwhPT0odD1udWxsPT09dGhpcy5fdW5saW5rZWRSZWNvcmRzP251bGw6dGhpcy5fdW5saW5rZWRSZWNvcmRzLmdldChuLG51bGwpKT8oeCh0Lml0ZW0sZSl8fHRoaXMuX2FkZElkZW50aXR5Q2hhbmdlKHQsZSksdGhpcy5fcmVpbnNlcnRBZnRlcih0LGkscikpOnQ9dGhpcy5fYWRkQWZ0ZXIobmV3IFJlKGUsbiksaSxyKSx0fSx0LnByb3RvdHlwZS5fdmVyaWZ5UmVpbnNlcnRpb249ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bnVsbD09PXRoaXMuX3VubGlua2VkUmVjb3Jkcz9udWxsOnRoaXMuX3VubGlua2VkUmVjb3Jkcy5nZXQobixudWxsKTtyZXR1cm4gbnVsbCE9PWk/dD10aGlzLl9yZWluc2VydEFmdGVyKGksdC5fcHJldixyKTp0LmN1cnJlbnRJbmRleCE9ciYmKHQuY3VycmVudEluZGV4PXIsdGhpcy5fYWRkVG9Nb3Zlcyh0LHIpKSx0fSx0LnByb3RvdHlwZS5fdHJ1bmNhdGU9ZnVuY3Rpb24odCl7Zm9yKDtudWxsIT09dDspe3ZhciBlPXQuX25leHQ7dGhpcy5fYWRkVG9SZW1vdmFscyh0aGlzLl91bmxpbmsodCkpLHQ9ZX1udWxsIT09dGhpcy5fdW5saW5rZWRSZWNvcmRzJiZ0aGlzLl91bmxpbmtlZFJlY29yZHMuY2xlYXIoKSxudWxsIT09dGhpcy5fYWRkaXRpb25zVGFpbCYmKHRoaXMuX2FkZGl0aW9uc1RhaWwuX25leHRBZGRlZD1udWxsKSxudWxsIT09dGhpcy5fbW92ZXNUYWlsJiYodGhpcy5fbW92ZXNUYWlsLl9uZXh0TW92ZWQ9bnVsbCksbnVsbCE9PXRoaXMuX2l0VGFpbCYmKHRoaXMuX2l0VGFpbC5fbmV4dD1udWxsKSxudWxsIT09dGhpcy5fcmVtb3ZhbHNUYWlsJiYodGhpcy5fcmVtb3ZhbHNUYWlsLl9uZXh0UmVtb3ZlZD1udWxsKSxudWxsIT09dGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbCYmKHRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwuX25leHRJZGVudGl0eUNoYW5nZT1udWxsKX0sdC5wcm90b3R5cGUuX3JlaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24odCxlLG4pe251bGwhPT10aGlzLl91bmxpbmtlZFJlY29yZHMmJnRoaXMuX3VubGlua2VkUmVjb3Jkcy5yZW1vdmUodCk7dmFyIHI9dC5fcHJldlJlbW92ZWQsaT10Ll9uZXh0UmVtb3ZlZDtyZXR1cm4gbnVsbD09PXI/dGhpcy5fcmVtb3ZhbHNIZWFkPWk6ci5fbmV4dFJlbW92ZWQ9aSxudWxsPT09aT90aGlzLl9yZW1vdmFsc1RhaWw9cjppLl9wcmV2UmVtb3ZlZD1yLHRoaXMuX2luc2VydEFmdGVyKHQsZSxuKSx0aGlzLl9hZGRUb01vdmVzKHQsbiksdH0sdC5wcm90b3R5cGUuX21vdmVBZnRlcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX3VubGluayh0KSx0aGlzLl9pbnNlcnRBZnRlcih0LGUsbiksdGhpcy5fYWRkVG9Nb3Zlcyh0LG4pLHR9LHQucHJvdG90eXBlLl9hZGRBZnRlcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX2luc2VydEFmdGVyKHQsZSxuKSx0aGlzLl9hZGRpdGlvbnNUYWlsPW51bGw9PT10aGlzLl9hZGRpdGlvbnNUYWlsP3RoaXMuX2FkZGl0aW9uc0hlYWQ9dDp0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQ9dCx0fSx0LnByb3RvdHlwZS5faW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW51bGw9PT1lP3RoaXMuX2l0SGVhZDplLl9uZXh0O3JldHVybiB0Ll9uZXh0PXIsdC5fcHJldj1lLG51bGw9PT1yP3RoaXMuX2l0VGFpbD10OnIuX3ByZXY9dCxudWxsPT09ZT90aGlzLl9pdEhlYWQ9dDplLl9uZXh0PXQsbnVsbD09PXRoaXMuX2xpbmtlZFJlY29yZHMmJih0aGlzLl9saW5rZWRSZWNvcmRzPW5ldyBMZSksdGhpcy5fbGlua2VkUmVjb3Jkcy5wdXQodCksdC5jdXJyZW50SW5kZXg9bix0fSx0LnByb3RvdHlwZS5fcmVtb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRUb1JlbW92YWxzKHRoaXMuX3VubGluayh0KSl9LHQucHJvdG90eXBlLl91bmxpbms9ZnVuY3Rpb24odCl7bnVsbCE9PXRoaXMuX2xpbmtlZFJlY29yZHMmJnRoaXMuX2xpbmtlZFJlY29yZHMucmVtb3ZlKHQpO3ZhciBlPXQuX3ByZXYsbj10Ll9uZXh0O3JldHVybiBudWxsPT09ZT90aGlzLl9pdEhlYWQ9bjplLl9uZXh0PW4sbnVsbD09PW4/dGhpcy5faXRUYWlsPWU6bi5fcHJldj1lLHR9LHQucHJvdG90eXBlLl9hZGRUb01vdmVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucHJldmlvdXNJbmRleD09PWU/dDoodGhpcy5fbW92ZXNUYWlsPW51bGw9PT10aGlzLl9tb3Zlc1RhaWw/dGhpcy5fbW92ZXNIZWFkPXQ6dGhpcy5fbW92ZXNUYWlsLl9uZXh0TW92ZWQ9dCx0KX0sdC5wcm90b3R5cGUuX2FkZFRvUmVtb3ZhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10aGlzLl91bmxpbmtlZFJlY29yZHMmJih0aGlzLl91bmxpbmtlZFJlY29yZHM9bmV3IExlKSx0aGlzLl91bmxpbmtlZFJlY29yZHMucHV0KHQpLHQuY3VycmVudEluZGV4PW51bGwsdC5fbmV4dFJlbW92ZWQ9bnVsbCxudWxsPT09dGhpcy5fcmVtb3ZhbHNUYWlsPyh0aGlzLl9yZW1vdmFsc1RhaWw9dGhpcy5fcmVtb3ZhbHNIZWFkPXQsdC5fcHJldlJlbW92ZWQ9bnVsbCk6KHQuX3ByZXZSZW1vdmVkPXRoaXMuX3JlbW92YWxzVGFpbCx0aGlzLl9yZW1vdmFsc1RhaWw9dGhpcy5fcmVtb3ZhbHNUYWlsLl9uZXh0UmVtb3ZlZD10KSx0fSx0LnByb3RvdHlwZS5fYWRkSWRlbnRpdHlDaGFuZ2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5pdGVtPWUsdGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbD1udWxsPT09dGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbD90aGlzLl9pZGVudGl0eUNoYW5nZXNIZWFkPXQ6dGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbC5fbmV4dElkZW50aXR5Q2hhbmdlPXQsdH0sdH0oKSxSZT1mdW5jdGlvbih0LGUpe3RoaXMuaXRlbT10LHRoaXMudHJhY2tCeUlkPWUsdGhpcy5jdXJyZW50SW5kZXg9bnVsbCx0aGlzLnByZXZpb3VzSW5kZXg9bnVsbCx0aGlzLl9uZXh0UHJldmlvdXM9bnVsbCx0aGlzLl9wcmV2PW51bGwsdGhpcy5fbmV4dD1udWxsLHRoaXMuX3ByZXZEdXA9bnVsbCx0aGlzLl9uZXh0RHVwPW51bGwsdGhpcy5fcHJldlJlbW92ZWQ9bnVsbCx0aGlzLl9uZXh0UmVtb3ZlZD1udWxsLHRoaXMuX25leHRBZGRlZD1udWxsLHRoaXMuX25leHRNb3ZlZD1udWxsLHRoaXMuX25leHRJZGVudGl0eUNoYW5nZT1udWxsfSxEZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9oZWFkPW51bGwsdGhpcy5fdGFpbD1udWxsfXJldHVybiB0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7bnVsbD09PXRoaXMuX2hlYWQ/KHRoaXMuX2hlYWQ9dGhpcy5fdGFpbD10LHQuX25leHREdXA9bnVsbCx0Ll9wcmV2RHVwPW51bGwpOih0aGlzLl90YWlsLl9uZXh0RHVwPXQsdC5fcHJldkR1cD10aGlzLl90YWlsLHQuX25leHREdXA9bnVsbCx0aGlzLl90YWlsPXQpfSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbjtmb3Iobj10aGlzLl9oZWFkO251bGwhPT1uO249bi5fbmV4dER1cClpZigobnVsbD09PWV8fGU8PW4uY3VycmVudEluZGV4KSYmeChuLnRyYWNrQnlJZCx0KSlyZXR1cm4gbjtyZXR1cm4gbnVsbH0sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuX3ByZXZEdXAsbj10Ll9uZXh0RHVwO3JldHVybiBudWxsPT09ZT90aGlzLl9oZWFkPW46ZS5fbmV4dER1cD1uLG51bGw9PT1uP3RoaXMuX3RhaWw9ZTpuLl9wcmV2RHVwPWUsbnVsbD09PXRoaXMuX2hlYWR9LHR9KCksTGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5tYXA9bmV3IE1hcH1yZXR1cm4gdC5wcm90b3R5cGUucHV0PWZ1bmN0aW9uKHQpe3ZhciBlPXQudHJhY2tCeUlkLG49dGhpcy5tYXAuZ2V0KGUpO258fChuPW5ldyBEZSx0aGlzLm1hcC5zZXQoZSxuKSksbi5hZGQodCl9LHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMubWFwLmdldCh0KTtyZXR1cm4gbj9uLmdldCh0LGUpOm51bGx9LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt2YXIgZT10LnRyYWNrQnlJZDtyZXR1cm4gdGhpcy5tYXAuZ2V0KGUpLnJlbW92ZSh0KSYmdGhpcy5tYXAuZGVsZXRlKGUpLHR9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNFbXB0eSIse2dldDpmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5tYXAuc2l6ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMubWFwLmNsZWFyKCl9LHR9KCk7ZnVuY3Rpb24gRmUodCxlLG4pe3ZhciByPXQucHJldmlvdXNJbmRleDtpZihudWxsPT09cilyZXR1cm4gcjt2YXIgaT0wO3JldHVybiBuJiZyPG4ubGVuZ3RoJiYoaT1uW3JdKSxyK2UraX12YXIgVmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5zdXBwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIE1hcHx8amUodCl9LHQucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgVWV9LHR9KCksVWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fcmVjb3Jkcz1uZXcgTWFwLHRoaXMuX21hcEhlYWQ9bnVsbCx0aGlzLl9hcHBlbmRBZnRlcj1udWxsLHRoaXMuX3ByZXZpb3VzTWFwSGVhZD1udWxsLHRoaXMuX2NoYW5nZXNIZWFkPW51bGwsdGhpcy5fY2hhbmdlc1RhaWw9bnVsbCx0aGlzLl9hZGRpdGlvbnNIZWFkPW51bGwsdGhpcy5fYWRkaXRpb25zVGFpbD1udWxsLHRoaXMuX3JlbW92YWxzSGVhZD1udWxsLHRoaXMuX3JlbW92YWxzVGFpbD1udWxsfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImlzRGlydHkiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2FkZGl0aW9uc0hlYWR8fG51bGwhPT10aGlzLl9jaGFuZ2VzSGVhZHx8bnVsbCE9PXRoaXMuX3JlbW92YWxzSGVhZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5mb3JFYWNoSXRlbT1mdW5jdGlvbih0KXt2YXIgZTtmb3IoZT10aGlzLl9tYXBIZWFkO251bGwhPT1lO2U9ZS5fbmV4dCl0KGUpfSx0LnByb3RvdHlwZS5mb3JFYWNoUHJldmlvdXNJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlPXRoaXMuX3ByZXZpb3VzTWFwSGVhZDtudWxsIT09ZTtlPWUuX25leHRQcmV2aW91cyl0KGUpfSx0LnByb3RvdHlwZS5mb3JFYWNoQ2hhbmdlZEl0ZW09ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKGU9dGhpcy5fY2hhbmdlc0hlYWQ7bnVsbCE9PWU7ZT1lLl9uZXh0Q2hhbmdlZCl0KGUpfSx0LnByb3RvdHlwZS5mb3JFYWNoQWRkZWRJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlPXRoaXMuX2FkZGl0aW9uc0hlYWQ7bnVsbCE9PWU7ZT1lLl9uZXh0QWRkZWQpdChlKX0sdC5wcm90b3R5cGUuZm9yRWFjaFJlbW92ZWRJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlPXRoaXMuX3JlbW92YWxzSGVhZDtudWxsIT09ZTtlPWUuX25leHRSZW1vdmVkKXQoZSl9LHQucHJvdG90eXBlLmRpZmY9ZnVuY3Rpb24odCl7aWYodCl7aWYoISh0IGluc3RhbmNlb2YgTWFwfHxqZSh0KSkpdGhyb3cgbmV3IEVycm9yKCJFcnJvciB0cnlpbmcgdG8gZGlmZiAnIitPKHQpKyInLiBPbmx5IG1hcHMgYW5kIG9iamVjdHMgYXJlIGFsbG93ZWQiKX1lbHNlIHQ9bmV3IE1hcDtyZXR1cm4gdGhpcy5jaGVjayh0KT90aGlzOm51bGx9LHQucHJvdG90eXBlLm9uRGVzdHJveT1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuY2hlY2s9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLl9yZXNldCgpO3ZhciBuPXRoaXMuX21hcEhlYWQ7aWYodGhpcy5fYXBwZW5kQWZ0ZXI9bnVsbCx0aGlzLl9mb3JFYWNoKHQsZnVuY3Rpb24odCxyKXtpZihuJiZuLmtleT09PXIpZS5fbWF5YmVBZGRUb0NoYW5nZXMobix0KSxlLl9hcHBlbmRBZnRlcj1uLG49bi5fbmV4dDtlbHNle3ZhciBpPWUuX2dldE9yQ3JlYXRlUmVjb3JkRm9yS2V5KHIsdCk7bj1lLl9pbnNlcnRCZWZvcmVPckFwcGVuZChuLGkpfX0pLG4pe24uX3ByZXYmJihuLl9wcmV2Ll9uZXh0PW51bGwpLHRoaXMuX3JlbW92YWxzSGVhZD1uO2Zvcih2YXIgcj1uO251bGwhPT1yO3I9ci5fbmV4dFJlbW92ZWQpcj09PXRoaXMuX21hcEhlYWQmJih0aGlzLl9tYXBIZWFkPW51bGwpLHRoaXMuX3JlY29yZHMuZGVsZXRlKHIua2V5KSxyLl9uZXh0UmVtb3ZlZD1yLl9uZXh0LHIucHJldmlvdXNWYWx1ZT1yLmN1cnJlbnRWYWx1ZSxyLmN1cnJlbnRWYWx1ZT1udWxsLHIuX3ByZXY9bnVsbCxyLl9uZXh0PW51bGx9cmV0dXJuIHRoaXMuX2NoYW5nZXNUYWlsJiYodGhpcy5fY2hhbmdlc1RhaWwuX25leHRDaGFuZ2VkPW51bGwpLHRoaXMuX2FkZGl0aW9uc1RhaWwmJih0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQ9bnVsbCksdGhpcy5pc0RpcnR5fSx0LnByb3RvdHlwZS5faW5zZXJ0QmVmb3JlT3JBcHBlbmQ9ZnVuY3Rpb24odCxlKXtpZih0KXt2YXIgbj10Ll9wcmV2O3JldHVybiBlLl9uZXh0PXQsZS5fcHJldj1uLHQuX3ByZXY9ZSxuJiYobi5fbmV4dD1lKSx0PT09dGhpcy5fbWFwSGVhZCYmKHRoaXMuX21hcEhlYWQ9ZSksdGhpcy5fYXBwZW5kQWZ0ZXI9dCx0fXJldHVybiB0aGlzLl9hcHBlbmRBZnRlcj8odGhpcy5fYXBwZW5kQWZ0ZXIuX25leHQ9ZSxlLl9wcmV2PXRoaXMuX2FwcGVuZEFmdGVyKTp0aGlzLl9tYXBIZWFkPWUsdGhpcy5fYXBwZW5kQWZ0ZXI9ZSxudWxsfSx0LnByb3RvdHlwZS5fZ2V0T3JDcmVhdGVSZWNvcmRGb3JLZXk9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9yZWNvcmRzLmhhcyh0KSl7dmFyIG49dGhpcy5fcmVjb3Jkcy5nZXQodCk7dGhpcy5fbWF5YmVBZGRUb0NoYW5nZXMobixlKTt2YXIgcj1uLl9wcmV2LGk9bi5fbmV4dDtyZXR1cm4gciYmKHIuX25leHQ9aSksaSYmKGkuX3ByZXY9ciksbi5fbmV4dD1udWxsLG4uX3ByZXY9bnVsbCxufXZhciBvPW5ldyB6ZSh0KTtyZXR1cm4gdGhpcy5fcmVjb3Jkcy5zZXQodCxvKSxvLmN1cnJlbnRWYWx1ZT1lLHRoaXMuX2FkZFRvQWRkaXRpb25zKG8pLG99LHQucHJvdG90eXBlLl9yZXNldD1mdW5jdGlvbigpe2lmKHRoaXMuaXNEaXJ0eSl7dmFyIHQ9dm9pZCAwO2Zvcih0aGlzLl9wcmV2aW91c01hcEhlYWQ9dGhpcy5fbWFwSGVhZCx0PXRoaXMuX3ByZXZpb3VzTWFwSGVhZDtudWxsIT09dDt0PXQuX25leHQpdC5fbmV4dFByZXZpb3VzPXQuX25leHQ7Zm9yKHQ9dGhpcy5fY2hhbmdlc0hlYWQ7bnVsbCE9PXQ7dD10Ll9uZXh0Q2hhbmdlZCl0LnByZXZpb3VzVmFsdWU9dC5jdXJyZW50VmFsdWU7Zm9yKHQ9dGhpcy5fYWRkaXRpb25zSGVhZDtudWxsIT10O3Q9dC5fbmV4dEFkZGVkKXQucHJldmlvdXNWYWx1ZT10LmN1cnJlbnRWYWx1ZTt0aGlzLl9jaGFuZ2VzSGVhZD10aGlzLl9jaGFuZ2VzVGFpbD1udWxsLHRoaXMuX2FkZGl0aW9uc0hlYWQ9dGhpcy5fYWRkaXRpb25zVGFpbD1udWxsLHRoaXMuX3JlbW92YWxzSGVhZD1udWxsfX0sdC5wcm90b3R5cGUuX21heWJlQWRkVG9DaGFuZ2VzPWZ1bmN0aW9uKHQsZSl7eChlLHQuY3VycmVudFZhbHVlKXx8KHQucHJldmlvdXNWYWx1ZT10LmN1cnJlbnRWYWx1ZSx0LmN1cnJlbnRWYWx1ZT1lLHRoaXMuX2FkZFRvQ2hhbmdlcyh0KSl9LHQucHJvdG90eXBlLl9hZGRUb0FkZGl0aW9ucz1mdW5jdGlvbih0KXtudWxsPT09dGhpcy5fYWRkaXRpb25zSGVhZD90aGlzLl9hZGRpdGlvbnNIZWFkPXRoaXMuX2FkZGl0aW9uc1RhaWw9dDoodGhpcy5fYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkPXQsdGhpcy5fYWRkaXRpb25zVGFpbD10KX0sdC5wcm90b3R5cGUuX2FkZFRvQ2hhbmdlcz1mdW5jdGlvbih0KXtudWxsPT09dGhpcy5fY2hhbmdlc0hlYWQ/dGhpcy5fY2hhbmdlc0hlYWQ9dGhpcy5fY2hhbmdlc1RhaWw9dDoodGhpcy5fY2hhbmdlc1RhaWwuX25leHRDaGFuZ2VkPXQsdGhpcy5fY2hhbmdlc1RhaWw9dCl9LHQucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7dCBpbnN0YW5jZW9mIE1hcD90LmZvckVhY2goZSk6T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXtyZXR1cm4gZSh0W25dLG4pfSl9LHR9KCksemU9ZnVuY3Rpb24odCl7dGhpcy5rZXk9dCx0aGlzLnByZXZpb3VzVmFsdWU9bnVsbCx0aGlzLmN1cnJlbnRWYWx1ZT1udWxsLHRoaXMuX25leHRQcmV2aW91cz1udWxsLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wcmV2PW51bGwsdGhpcy5fbmV4dEFkZGVkPW51bGwsdGhpcy5fbmV4dFJlbW92ZWQ9bnVsbCx0aGlzLl9uZXh0Q2hhbmdlZD1udWxsfSxCZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5mYWN0b3JpZXM9dH1yZXR1cm4gdC5jcmVhdGU9ZnVuY3Rpb24oZSxuKXtpZihudWxsIT1uKXt2YXIgcj1uLmZhY3Rvcmllcy5zbGljZSgpO2U9ZS5jb25jYXQocil9cmV0dXJuIG5ldyB0KGUpfSx0LmV4dGVuZD1mdW5jdGlvbihlKXtyZXR1cm57cHJvdmlkZTp0LHVzZUZhY3Rvcnk6ZnVuY3Rpb24obil7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZXh0ZW5kIEl0ZXJhYmxlRGlmZmVycyB3aXRob3V0IGEgcGFyZW50IGluamVjdG9yIik7cmV0dXJuIHQuY3JlYXRlKGUsbil9LGRlcHM6W1t0LG5ldyBJLG5ldyBrXV19fSx0LnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5mYWN0b3JpZXMuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5zdXBwb3J0cyh0KX0pO2lmKG51bGwhPW4pcmV0dXJuIG47dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnIit0KyInIG9mIHR5cGUgJyIrKChlPXQpLm5hbWV8fHR5cGVvZiBlKSsiJyIpfSx0Lm5nSW5qZWN0YWJsZURlZj1sKHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KFtuZXcgUGVdKX19KSx0fSgpLEhlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmZhY3Rvcmllcz10fXJldHVybiB0LmNyZWF0ZT1mdW5jdGlvbihlLG4pe2lmKG4pe3ZhciByPW4uZmFjdG9yaWVzLnNsaWNlKCk7ZT1lLmNvbmNhdChyKX1yZXR1cm4gbmV3IHQoZSl9LHQuZXh0ZW5kPWZ1bmN0aW9uKGUpe3JldHVybntwcm92aWRlOnQsdXNlRmFjdG9yeTpmdW5jdGlvbihuKXtpZighbil0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBleHRlbmQgS2V5VmFsdWVEaWZmZXJzIHdpdGhvdXQgYSBwYXJlbnQgaW5qZWN0b3IiKTtyZXR1cm4gdC5jcmVhdGUoZSxuKX0sZGVwczpbW3QsbmV3IEksbmV3IGtdXX19LHQucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mYWN0b3JpZXMuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5zdXBwb3J0cyh0KX0pO2lmKGUpcmV0dXJuIGU7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnIit0KyInIil9LHR9KCksV2U9W25ldyBWZV0scWU9bmV3IEJlKFtuZXcgUGVdKSxZZT1uZXcgSGUoV2UpLEdlPW5lKG51bGwsImNvcmUiLFt7cHJvdmlkZTp5dCx1c2VWYWx1ZToidW5rbm93biJ9LHtwcm92aWRlOmllLGRlcHM6W05dfSx7cHJvdmlkZTpZdCxkZXBzOltdfSx7cHJvdmlkZTp2dCxkZXBzOltdfV0pLFFlPW5ldyBjKCJMb2NhbGVJZCIpO2Z1bmN0aW9uIEtlKCl7cmV0dXJuIHFlfWZ1bmN0aW9uIFplKCl7cmV0dXJuIFllfWZ1bmN0aW9uIFhlKHQpe3JldHVybiB0fHwiZW4tVVMifXZhciAkZT1mdW5jdGlvbih0KXt9LEplPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXtpZih0aGlzLmRlZmF1bHREb2M9dCx0aGlzLmluZXJ0RG9jdW1lbnQ9dGhpcy5kZWZhdWx0RG9jLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgic2FuaXRpemF0aW9uLWluZXJ0IiksdGhpcy5pbmVydEJvZHlFbGVtZW50PXRoaXMuaW5lcnREb2N1bWVudC5ib2R5LG51bGw9PXRoaXMuaW5lcnRCb2R5RWxlbWVudCl7dmFyIGU9dGhpcy5pbmVydERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImh0bWwiKTt0aGlzLmluZXJ0RG9jdW1lbnQuYXBwZW5kQ2hpbGQoZSksdGhpcy5pbmVydEJvZHlFbGVtZW50PXRoaXMuaW5lcnREb2N1bWVudC5jcmVhdGVFbGVtZW50KCJib2R5IiksZS5hcHBlbmRDaGlsZCh0aGlzLmluZXJ0Qm9keUVsZW1lbnQpfXRoaXMuaW5lcnRCb2R5RWxlbWVudC5pbm5lckhUTUw9Jzxzdmc+PGcgb25sb2FkPSJ0aGlzLnBhcmVudE5vZGUucmVtb3ZlKCkiPjwvZz48L3N2Zz4nLCF0aGlzLmluZXJ0Qm9keUVsZW1lbnQucXVlcnlTZWxlY3Rvcnx8dGhpcy5pbmVydEJvZHlFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoInN2ZyIpPyh0aGlzLmluZXJ0Qm9keUVsZW1lbnQuaW5uZXJIVE1MPSc8c3ZnPjxwPjxzdHlsZT48aW1nIHNyYz0iPC9zdHlsZT48aW1nIHNyYz14IG9uZXJyb3I9YWxlcnQoMSkvLyI+Jyx0aGlzLmdldEluZXJ0Qm9keUVsZW1lbnQ9dGhpcy5pbmVydEJvZHlFbGVtZW50LnF1ZXJ5U2VsZWN0b3ImJnRoaXMuaW5lcnRCb2R5RWxlbWVudC5xdWVyeVNlbGVjdG9yKCJzdmcgaW1nIikmJmZ1bmN0aW9uKCl7dHJ5e3JldHVybiEhd2luZG93LkRPTVBhcnNlcn1jYXRjaCh0KXtyZXR1cm4hMX19KCk/dGhpcy5nZXRJbmVydEJvZHlFbGVtZW50X0RPTVBhcnNlcjp0aGlzLmdldEluZXJ0Qm9keUVsZW1lbnRfSW5lcnREb2N1bWVudCk6dGhpcy5nZXRJbmVydEJvZHlFbGVtZW50PXRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudF9YSFJ9cmV0dXJuIHQucHJvdG90eXBlLmdldEluZXJ0Qm9keUVsZW1lbnRfWEhSPWZ1bmN0aW9uKHQpe3Q9Ijxib2R5PjxyZW1vdmU+PC9yZW1vdmU+Iit0KyI8L2JvZHk+Ijt0cnl7dD1lbmNvZGVVUkkodCl9Y2F0Y2godCl7cmV0dXJuIG51bGx9dmFyIGU9bmV3IFhNTEh0dHBSZXF1ZXN0O2UucmVzcG9uc2VUeXBlPSJkb2N1bWVudCIsZS5vcGVuKCJHRVQiLCJkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04LCIrdCwhMSksZS5zZW5kKG51bGwpO3ZhciBuPWUucmVzcG9uc2UuYm9keTtyZXR1cm4gbi5yZW1vdmVDaGlsZChuLmZpcnN0Q2hpbGQpLG59LHQucHJvdG90eXBlLmdldEluZXJ0Qm9keUVsZW1lbnRfRE9NUGFyc2VyPWZ1bmN0aW9uKHQpe3Q9Ijxib2R5PjxyZW1vdmU+PC9yZW1vdmU+Iit0KyI8L2JvZHk+Ijt0cnl7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcodCwidGV4dC9odG1sIikuYm9keTtyZXR1cm4gZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpLGV9Y2F0Y2godCl7cmV0dXJuIG51bGx9fSx0LnByb3RvdHlwZS5nZXRJbmVydEJvZHlFbGVtZW50X0luZXJ0RG9jdW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pbmVydERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7cmV0dXJuImNvbnRlbnQiaW4gZT8oZS5pbm5lckhUTUw9dCxlKToodGhpcy5pbmVydEJvZHlFbGVtZW50LmlubmVySFRNTD10LHRoaXMuZGVmYXVsdERvYy5kb2N1bWVudE1vZGUmJnRoaXMuc3RyaXBDdXN0b21Oc0F0dHJzKHRoaXMuaW5lcnRCb2R5RWxlbWVudCksdGhpcy5pbmVydEJvZHlFbGVtZW50KX0sdC5wcm90b3R5cGUuc3RyaXBDdXN0b21Oc0F0dHJzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LmF0dHJpYnV0ZXMsbj1lLmxlbmd0aC0xOzA8bjtuLS0pe3ZhciByPWUuaXRlbShuKS5uYW1lOyJ4bWxuczpuczEiIT09ciYmMCE9PXIuaW5kZXhPZigibnMxOiIpfHx0LnJlbW92ZUF0dHJpYnV0ZShyKX1mb3IodmFyIGk9dC5maXJzdENoaWxkO2k7KWkubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmdGhpcy5zdHJpcEN1c3RvbU5zQXR0cnMoaSksaT1pLm5leHRTaWJsaW5nfSx0fSgpLHRuPS9eKD86KD86aHR0cHM/fG1haWx0b3xmdHB8dGVsfGZpbGUpOnxbXiY6Lz8jXSooPzpbLz8jXXwkKSkvZ2ksZW49L15kYXRhOig/OmltYWdlXC8oPzpibXB8Z2lmfGpwZWd8anBnfHBuZ3x0aWZmfHdlYnApfHZpZGVvXC8oPzptcGVnfG1wNHxvZ2d8d2VibSl8YXVkaW9cLyg/Om1wM3xvZ2F8b2dnfG9wdXMpKTtiYXNlNjQsW2EtejAtOStcL10rPSokL2k7ZnVuY3Rpb24gbm4odCl7cmV0dXJuKHQ9U3RyaW5nKHQpKS5tYXRjaCh0bil8fHQubWF0Y2goZW4pP3Q6KHRlKCkmJmNvbnNvbGUud2FybigiV0FSTklORzogc2FuaXRpemluZyB1bnNhZmUgVVJMIHZhbHVlICIrdCsiIChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKSIpLCJ1bnNhZmU6Iit0KX1mdW5jdGlvbiBybih0KXt2YXIgZSxuLGk9e307dHJ5e2Zvcih2YXIgbz1PYmplY3Qoci5lKSh0LnNwbGl0KCIsIikpLGE9by5uZXh0KCk7IWEuZG9uZTthPW8ubmV4dCgpKWlbYS52YWx1ZV09ITB9Y2F0Y2godCl7ZT17ZXJyb3I6dH19ZmluYWxseXt0cnl7YSYmIWEuZG9uZSYmKG49by5yZXR1cm4pJiZuLmNhbGwobyl9ZmluYWxseXtpZihlKXRocm93IGUuZXJyb3J9fXJldHVybiBpfWZ1bmN0aW9uIG9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3ZhciBuLGksbz17fTt0cnl7Zm9yKHZhciBhPU9iamVjdChyLmUpKHQpLHM9YS5uZXh0KCk7IXMuZG9uZTtzPWEubmV4dCgpKXt2YXIgdT1zLnZhbHVlO2Zvcih2YXIgbCBpbiB1KXUuaGFzT3duUHJvcGVydHkobCkmJihvW2xdPSEwKX19Y2F0Y2godCl7bj17ZXJyb3I6dH19ZmluYWxseXt0cnl7cyYmIXMuZG9uZSYmKGk9YS5yZXR1cm4pJiZpLmNhbGwoYSl9ZmluYWxseXtpZihuKXRocm93IG4uZXJyb3J9fXJldHVybiBvfXZhciBhbixzbj1ybigiYXJlYSxicixjb2wsaHIsaW1nLHdiciIpLHVuPXJuKCJjb2xncm91cCxkZCxkdCxsaSxwLHRib2R5LHRkLHRmb290LHRoLHRoZWFkLHRyIiksbG49cm4oInJwLHJ0IiksY249b24obG4sdW4pLGZuPW9uKHNuLG9uKHVuLHJuKCJhZGRyZXNzLGFydGljbGUsYXNpZGUsYmxvY2txdW90ZSxjYXB0aW9uLGNlbnRlcixkZWwsZGV0YWlscyxkaWFsb2csZGlyLGRpdixkbCxmaWd1cmUsZmlnY2FwdGlvbixmb290ZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGVhZGVyLGhncm91cCxocixpbnMsbWFpbixtYXAsbWVudSxuYXYsb2wscHJlLHNlY3Rpb24sc3VtbWFyeSx0YWJsZSx1bCIpKSxvbihsbixybigiYSxhYmJyLGFjcm9ueW0sYXVkaW8sYixiZGksYmRvLGJpZyxicixjaXRlLGNvZGUsZGVsLGRmbixlbSxmb250LGksaW1nLGlucyxrYmQsbGFiZWwsbWFwLG1hcmsscGljdHVyZSxxLHJ1YnkscnAscnQscyxzYW1wLHNtYWxsLHNvdXJjZSxzcGFuLHN0cmlrZSxzdHJvbmcsc3ViLHN1cCx0aW1lLHRyYWNrLHR0LHUsdmFyLHZpZGVvIikpLGNuKSxobj1ybigiYmFja2dyb3VuZCxjaXRlLGhyZWYsaXRlbXR5cGUsbG9uZ2Rlc2MscG9zdGVyLHNyYyx4bGluazpocmVmIiksZG49cm4oInNyY3NldCIpLHBuPW9uKGhuLGRuLHJuKCJhYmJyLGFjY2Vzc2tleSxhbGlnbixhbHQsYXV0b3BsYXksYXhpcyxiZ2NvbG9yLGJvcmRlcixjZWxscGFkZGluZyxjZWxsc3BhY2luZyxjbGFzcyxjbGVhcixjb2xvcixjb2xzLGNvbHNwYW4sY29tcGFjdCxjb250cm9scyxjb29yZHMsZGF0ZXRpbWUsZGVmYXVsdCxkaXIsZG93bmxvYWQsZmFjZSxoZWFkZXJzLGhlaWdodCxoaWRkZW4saHJlZmxhbmcsaHNwYWNlLGlzbWFwLGl0ZW1zY29wZSxpdGVtcHJvcCxraW5kLGxhYmVsLGxhbmcsbGFuZ3VhZ2UsbG9vcCxtZWRpYSxtdXRlZCxub2hyZWYsbm93cmFwLG9wZW4scHJlbG9hZCxyZWwscmV2LHJvbGUscm93cyxyb3dzcGFuLHJ1bGVzLHNjb3BlLHNjcm9sbGluZyxzaGFwZSxzaXplLHNpemVzLHNwYW4sc3JjbGFuZyxzdGFydCxzdW1tYXJ5LHRhYmluZGV4LHRhcmdldCx0aXRsZSx0cmFuc2xhdGUsdHlwZSx1c2VtYXAsdmFsaWduLHZhbHVlLHZzcGFjZSx3aWR0aCIpKSxtbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLnNhbml0aXplZFNvbWV0aGluZz0hMSx0aGlzLmJ1Zj1bXX1yZXR1cm4gdC5wcm90b3R5cGUuc2FuaXRpemVDaGlsZHJlbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5maXJzdENoaWxkO2U7KWlmKGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERT90aGlzLnN0YXJ0RWxlbWVudChlKTplLm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREU/dGhpcy5jaGFycyhlLm5vZGVWYWx1ZSk6dGhpcy5zYW5pdGl6ZWRTb21ldGhpbmc9ITAsZS5maXJzdENoaWxkKWU9ZS5maXJzdENoaWxkO2Vsc2UgZm9yKDtlOyl7ZS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZ0aGlzLmVuZEVsZW1lbnQoZSk7dmFyIG49dGhpcy5jaGVja0Nsb2JiZXJlZEVsZW1lbnQoZSxlLm5leHRTaWJsaW5nKTtpZihuKXtlPW47YnJlYWt9ZT10aGlzLmNoZWNrQ2xvYmJlcmVkRWxlbWVudChlLGUucGFyZW50Tm9kZSl9cmV0dXJuIHRoaXMuYnVmLmpvaW4oIiIpfSx0LnByb3RvdHlwZS5zdGFydEVsZW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKGZuLmhhc093blByb3BlcnR5KGUpKXt0aGlzLmJ1Zi5wdXNoKCI8IiksdGhpcy5idWYucHVzaChlKTtmb3IodmFyIG4scj10LmF0dHJpYnV0ZXMsaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbz1yLml0ZW0oaSksYT1vLm5hbWUscz1hLnRvTG93ZXJDYXNlKCk7aWYocG4uaGFzT3duUHJvcGVydHkocykpe3ZhciB1PW8udmFsdWU7aG5bc10mJih1PW5uKHUpKSxkbltzXSYmKG49dSx1PShuPVN0cmluZyhuKSkuc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG5uKHQudHJpbSgpKX0pLmpvaW4oIiwgIikpLHRoaXMuYnVmLnB1c2goIiAiLGEsJz0iJyx2bih1KSwnIicpfWVsc2UgdGhpcy5zYW5pdGl6ZWRTb21ldGhpbmc9ITB9dGhpcy5idWYucHVzaCgiPiIpfWVsc2UgdGhpcy5zYW5pdGl6ZWRTb21ldGhpbmc9ITB9LHQucHJvdG90eXBlLmVuZEVsZW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2ZuLmhhc093blByb3BlcnR5KGUpJiYhc24uaGFzT3duUHJvcGVydHkoZSkmJih0aGlzLmJ1Zi5wdXNoKCI8LyIpLHRoaXMuYnVmLnB1c2goZSksdGhpcy5idWYucHVzaCgiPiIpKX0sdC5wcm90b3R5cGUuY2hhcnM9ZnVuY3Rpb24odCl7dGhpcy5idWYucHVzaCh2bih0KSl9LHQucHJvdG90eXBlLmNoZWNrQ2xvYmJlcmVkRWxlbWVudD1mdW5jdGlvbih0LGUpe2lmKGUmJih0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpJk5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKT09PU5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKXRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIHNhbml0aXplIGh0bWwgYmVjYXVzZSB0aGUgZWxlbWVudCBpcyBjbG9iYmVyZWQ6ICIrdC5vdXRlckhUTUwpO3JldHVybiBlfSx0fSgpLHluPS9bXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl0vZyxnbj0vKFteXCMtfiB8IV0pL2c7ZnVuY3Rpb24gdm4odCl7cmV0dXJuIHQucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoeW4sZnVuY3Rpb24odCl7cmV0dXJuIiYjIisoMTAyNCoodC5jaGFyQ29kZUF0KDApLTU1Mjk2KSsodC5jaGFyQ29kZUF0KDEpLTU2MzIwKSs2NTUzNikrIjsifSkucmVwbGFjZShnbixmdW5jdGlvbih0KXtyZXR1cm4iJiMiK3QuY2hhckNvZGVBdCgwKSsiOyJ9KS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKX1mdW5jdGlvbiBibih0LGUpe3ZhciBuPW51bGw7dHJ5e2FuPWFufHxuZXcgSmUodCk7dmFyIHI9ZT9TdHJpbmcoZSk6IiI7bj1hbi5nZXRJbmVydEJvZHlFbGVtZW50KHIpO3ZhciBpPTUsbz1yO2Rve2lmKDA9PT1pKXRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIHNhbml0aXplIGh0bWwgYmVjYXVzZSB0aGUgaW5wdXQgaXMgdW5zdGFibGUiKTtpLS0scj1vLG89bi5pbm5lckhUTUwsbj1hbi5nZXRJbmVydEJvZHlFbGVtZW50KHIpfXdoaWxlKHIhPT1vKTt2YXIgYT1uZXcgbW4scz1hLnNhbml0aXplQ2hpbGRyZW4oX24obil8fG4pO3JldHVybiB0ZSgpJiZhLnNhbml0aXplZFNvbWV0aGluZyYmY29uc29sZS53YXJuKCJXQVJOSU5HOiBzYW5pdGl6aW5nIEhUTUwgc3RyaXBwZWQgc29tZSBjb250ZW50IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKS4iKSxzfWZpbmFsbHl7aWYobilmb3IodmFyIHU9X24obil8fG47dS5maXJzdENoaWxkOyl1LnJlbW92ZUNoaWxkKHUuZmlyc3RDaGlsZCl9fWZ1bmN0aW9uIF9uKHQpe3JldHVybiJjb250ZW50ImluIHQmJmZ1bmN0aW9uKHQpe3JldHVybiB0Lm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJiJURU1QTEFURSI9PT10Lm5vZGVOYW1lfSh0KT90LmNvbnRlbnQ6bnVsbH12YXIgd249bmV3IFJlZ0V4cCgiXihbLSwuXCInJV8hIyBhLXpBLVowLTldK3woPzooPzptYXRyaXh8dHJhbnNsYXRlfHNjYWxlfHJvdGF0ZXxza2V3fHBlcnNwZWN0aXZlKSg/Olh8WXwzZCk/fCg/OnJnYnxoc2wpYT98KD86cmVwZWF0aW5nLSk/KD86bGluZWFyfHJhZGlhbCktZ3JhZGllbnR8KD86Y2FsY3xhdHRyKSlcXChbLTAtOS4lLCAjYS16QS1aXStcXCkpJCIsImciKSx4bj0vXnVybFwoKFteKV0rKVwpJC87ZnVuY3Rpb24gT24odCl7aWYoISh0PVN0cmluZyh0KS50cmltKCkpKXJldHVybiIiO3ZhciBlPXQubWF0Y2goeG4pO3JldHVybiBlJiZubihlWzFdKT09PWVbMV18fHQubWF0Y2god24pJiZmdW5jdGlvbih0KXtmb3IodmFyIGU9ITAsbj0hMCxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBpPXQuY2hhckF0KHIpOyInIj09PWkmJm4/ZT0hZTonIic9PT1pJiZlJiYobj0hbil9cmV0dXJuIGUmJm59KHQpP3Q6KHRlKCkmJmNvbnNvbGUud2FybigiV0FSTklORzogc2FuaXRpemluZyB1bnNhZmUgc3R5bGUgdmFsdWUgIit0KyIgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpLiIpLCJ1bnNhZmUiKX12YXIgQ249ZnVuY3Rpb24odCl7cmV0dXJuIHRbdC5OT05FPTBdPSJOT05FIix0W3QuSFRNTD0xXT0iSFRNTCIsdFt0LlNUWUxFPTJdPSJTVFlMRSIsdFt0LlNDUklQVD0zXT0iU0NSSVBUIix0W3QuVVJMPTRdPSJVUkwiLHRbdC5SRVNPVVJDRV9VUkw9NV09IlJFU09VUkNFX1VSTCIsdH0oe30pLFNuPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBFbih0LGUsbil7dmFyIHI9dC5zdGF0ZSxpPTE3OTImcjtyZXR1cm4gaT09PWU/KHQuc3RhdGU9LTE3OTMmcnxuLHQuaW5pdEluZGV4PS0xLCEwKTppPT09bn1mdW5jdGlvbiBrbih0LGUsbil7cmV0dXJuKDE3OTImdC5zdGF0ZSk9PT1lJiZ0LmluaXRJbmRleDw9biYmKHQuaW5pdEluZGV4PW4rMSwhMCl9ZnVuY3Rpb24gVG4odCxlKXtyZXR1cm4gdC5ub2Rlc1tlXX1mdW5jdGlvbiBJbih0LGUpe3JldHVybiB0Lm5vZGVzW2VdfWZ1bmN0aW9uIEFuKHQsZSl7cmV0dXJuIHQubm9kZXNbZV19ZnVuY3Rpb24gam4odCxlKXtyZXR1cm4gdC5ub2Rlc1tlXX1mdW5jdGlvbiBQbih0LGUpe3JldHVybiB0Lm5vZGVzW2VdfXZhciBNbj17c2V0Q3VycmVudE5vZGU6dm9pZCAwLGNyZWF0ZVJvb3RWaWV3OnZvaWQgMCxjcmVhdGVFbWJlZGRlZFZpZXc6dm9pZCAwLGNyZWF0ZUNvbXBvbmVudFZpZXc6dm9pZCAwLGNyZWF0ZU5nTW9kdWxlUmVmOnZvaWQgMCxvdmVycmlkZVByb3ZpZGVyOnZvaWQgMCxvdmVycmlkZUNvbXBvbmVudFZpZXc6dm9pZCAwLGNsZWFyT3ZlcnJpZGVzOnZvaWQgMCxjaGVja0FuZFVwZGF0ZVZpZXc6dm9pZCAwLGNoZWNrTm9DaGFuZ2VzVmlldzp2b2lkIDAsZGVzdHJveVZpZXc6dm9pZCAwLHJlc29sdmVEZXA6dm9pZCAwLGNyZWF0ZURlYnVnQ29udGV4dDp2b2lkIDAsaGFuZGxlRXZlbnQ6dm9pZCAwLHVwZGF0ZURpcmVjdGl2ZXM6dm9pZCAwLHVwZGF0ZVJlbmRlcmVyOnZvaWQgMCxkaXJ0eVBhcmVudFF1ZXJpZXM6dm9pZCAwfTtmdW5jdGlvbiBObih0LGUsbixyKXt2YXIgaT0iRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvcjogRXhwcmVzc2lvbiBoYXMgY2hhbmdlZCBhZnRlciBpdCB3YXMgY2hlY2tlZC4gUHJldmlvdXMgdmFsdWU6ICciK2UrIicuIEN1cnJlbnQgdmFsdWU6ICciK24rIicuIjtyZXR1cm4gciYmKGkrPSIgSXQgc2VlbXMgbGlrZSB0aGUgdmlldyBoYXMgYmVlbiBjcmVhdGVkIGFmdGVyIGl0cyBwYXJlbnQgYW5kIGl0cyBjaGlsZHJlbiBoYXZlIGJlZW4gZGlydHkgY2hlY2tlZC4gSGFzIGl0IGJlZW4gY3JlYXRlZCBpbiBhIGNoYW5nZSBkZXRlY3Rpb24gaG9vayA/IiksZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgRXJyb3IodCk7cmV0dXJuIFJuKG4sZSksbn0oaSx0KX1mdW5jdGlvbiBSbih0LGUpe3RbdHRdPWUsdFtudF09ZS5sb2dFcnJvci5iaW5kKGUpfWZ1bmN0aW9uIERuKHQpe3JldHVybiBuZXcgRXJyb3IoIlZpZXdEZXN0cm95ZWRFcnJvcjogQXR0ZW1wdCB0byB1c2UgYSBkZXN0cm95ZWQgdmlldzogIit0KX12YXIgTG49ZnVuY3Rpb24oKXt9LEZuPW5ldyBNYXA7ZnVuY3Rpb24gVm4odCl7dmFyIGU9Rm4uZ2V0KHQpO3JldHVybiBlfHwoZT1PKHQpKyJfIitGbi5zaXplLEZuLnNldCh0LGUpKSxlfWZ1bmN0aW9uIFVuKHQsZSxuLHIpe2lmKFRlLmlzV3JhcHBlZChyKSl7cj1UZS51bndyYXAocik7dmFyIGk9dC5kZWYubm9kZXNbZV0uYmluZGluZ0luZGV4K24sbz1UZS51bndyYXAodC5vbGRWYWx1ZXNbaV0pO3Qub2xkVmFsdWVzW2ldPW5ldyBUZShvKX1yZXR1cm4gcn12YXIgem49IiQkdW5kZWZpbmVkIixCbj0iJCRlbXB0eSI7ZnVuY3Rpb24gSG4odCl7cmV0dXJue2lkOnpuLHN0eWxlczp0LnN0eWxlcyxlbmNhcHN1bGF0aW9uOnQuZW5jYXBzdWxhdGlvbixkYXRhOnQuZGF0YX19dmFyIFduPTA7ZnVuY3Rpb24gcW4odCxlLG4scil7cmV0dXJuISghKDImdC5zdGF0ZSkmJngodC5vbGRWYWx1ZXNbZS5iaW5kaW5nSW5kZXgrbl0scikpfWZ1bmN0aW9uIFluKHQsZSxuLHIpe3JldHVybiEhcW4odCxlLG4scikmJih0Lm9sZFZhbHVlc1tlLmJpbmRpbmdJbmRleCtuXT1yLCEwKX1mdW5jdGlvbiBHbih0LGUsbixyKXt2YXIgaT10Lm9sZFZhbHVlc1tlLmJpbmRpbmdJbmRleCtuXTtpZigxJnQuc3RhdGV8fCFrZShpLHIpKXt2YXIgbz1lLmJpbmRpbmdzW25dLm5hbWU7dGhyb3cgTm4oTW4uY3JlYXRlRGVidWdDb250ZXh0KHQsZS5ub2RlSW5kZXgpLG8rIjogIitpLG8rIjogIityLDAhPSgxJnQuc3RhdGUpKX19ZnVuY3Rpb24gUW4odCl7Zm9yKHZhciBlPXQ7ZTspMiZlLmRlZi5mbGFncyYmKGUuc3RhdGV8PTgpLGU9ZS52aWV3Q29udGFpbmVyUGFyZW50fHxlLnBhcmVudH1mdW5jdGlvbiBLbih0LGUpe2Zvcih2YXIgbj10O24mJm4hPT1lOyluLnN0YXRlfD02NCxuPW4udmlld0NvbnRhaW5lclBhcmVudHx8bi5wYXJlbnR9ZnVuY3Rpb24gWm4odCxlLG4scil7dHJ5e3JldHVybiBRbigzMzU1NDQzMiZ0LmRlZi5ub2Rlc1tlXS5mbGFncz9Jbih0LGUpLmNvbXBvbmVudFZpZXc6dCksTW4uaGFuZGxlRXZlbnQodCxlLG4scil9Y2F0Y2goZSl7dC5yb290LmVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihlKX19ZnVuY3Rpb24gWG4odCl7cmV0dXJuIHQucGFyZW50P0luKHQucGFyZW50LHQucGFyZW50Tm9kZURlZi5ub2RlSW5kZXgpOm51bGx9ZnVuY3Rpb24gJG4odCl7cmV0dXJuIHQucGFyZW50P3QucGFyZW50Tm9kZURlZi5wYXJlbnQ6bnVsbH1mdW5jdGlvbiBKbih0LGUpe3N3aXRjaCgyMDEzNDcwNjcmZS5mbGFncyl7Y2FzZSAxOnJldHVybiBJbih0LGUubm9kZUluZGV4KS5yZW5kZXJFbGVtZW50O2Nhc2UgMjpyZXR1cm4gVG4odCxlLm5vZGVJbmRleCkucmVuZGVyVGV4dH19ZnVuY3Rpb24gdHIodCl7cmV0dXJuISF0LnBhcmVudCYmISEoMzI3NjgmdC5wYXJlbnROb2RlRGVmLmZsYWdzKX1mdW5jdGlvbiBlcih0KXtyZXR1cm4hKCF0LnBhcmVudHx8MzI3NjgmdC5wYXJlbnROb2RlRGVmLmZsYWdzKX1mdW5jdGlvbiBucih0KXtyZXR1cm4gMTw8dCUzMn1mdW5jdGlvbiBycih0KXt2YXIgZT17fSxuPTAsaT17fTtyZXR1cm4gdCYmdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBvPU9iamVjdChyLmMpKHQsMiksYT1vWzBdLHM9b1sxXTsibnVtYmVyIj09dHlwZW9mIGE/KGVbYV09cyxufD1ucihhKSk6aVthXT1zfSkse21hdGNoZWRRdWVyaWVzOmUscmVmZXJlbmNlczppLG1hdGNoZWRRdWVyeUlkczpufX1mdW5jdGlvbiBpcih0LGUpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0KXt2YXIgbixpLG87cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/KGk9KG89T2JqZWN0KHIuYykodCwyKSlbMF0sbj1vWzFdKTooaT0wLG49dCksbiYmKCJmdW5jdGlvbiI9PXR5cGVvZiBufHwib2JqZWN0Ij09dHlwZW9mIG4pJiZlJiZPYmplY3QuZGVmaW5lUHJvcGVydHkobixBLHt2YWx1ZTplLGNvbmZpZ3VyYWJsZTohMH0pLHtmbGFnczppLHRva2VuOm4sdG9rZW5LZXk6Vm4obil9fSl9ZnVuY3Rpb24gb3IodCxlLG4pe3ZhciByPW4ucmVuZGVyUGFyZW50O3JldHVybiByPzA9PSgxJnIuZmxhZ3MpfHwwPT0oMzM1NTQ0MzImci5mbGFncyl8fHIuZWxlbWVudC5jb21wb25lbnRSZW5kZXJlclR5cGUmJnIuZWxlbWVudC5jb21wb25lbnRSZW5kZXJlclR5cGUuZW5jYXBzdWxhdGlvbj09PVguTmF0aXZlP0luKHQsbi5yZW5kZXJQYXJlbnQubm9kZUluZGV4KS5yZW5kZXJFbGVtZW50OnZvaWQgMDplfXZhciBhcj1uZXcgV2Vha01hcDtmdW5jdGlvbiBzcih0KXt2YXIgZT1hci5nZXQodCk7cmV0dXJuIGV8fCgoZT10KGZ1bmN0aW9uKCl7cmV0dXJuIExufSkpLmZhY3Rvcnk9dCxhci5zZXQodCxlKSksZX1mdW5jdGlvbiB1cih0LGUsbixyLGkpezM9PT1lJiYobj10LnJlbmRlcmVyLnBhcmVudE5vZGUoSm4odCx0LmRlZi5sYXN0UmVuZGVyUm9vdE5vZGUpKSksbHIodCxlLDAsdC5kZWYubm9kZXMubGVuZ3RoLTEsbixyLGkpfWZ1bmN0aW9uIGxyKHQsZSxuLHIsaSxvLGEpe2Zvcih2YXIgcz1uO3M8PXI7cysrKXt2YXIgdT10LmRlZi5ub2Rlc1tzXTsxMSZ1LmZsYWdzJiZmcih0LHUsZSxpLG8sYSkscys9dS5jaGlsZENvdW50fX1mdW5jdGlvbiBjcih0LGUsbixyLGksbyl7Zm9yKHZhciBhPXQ7YSYmIXRyKGEpOylhPWEucGFyZW50O2Zvcih2YXIgcz1hLnBhcmVudCx1PSRuKGEpLGw9dS5ub2RlSW5kZXgrdS5jaGlsZENvdW50LGM9dS5ub2RlSW5kZXgrMTtjPD1sO2MrKyl7dmFyIGY9cy5kZWYubm9kZXNbY107Zi5uZ0NvbnRlbnRJbmRleD09PWUmJmZyKHMsZixuLHIsaSxvKSxjKz1mLmNoaWxkQ291bnR9aWYoIXMucGFyZW50KXt2YXIgaD10LnJvb3QucHJvamVjdGFibGVOb2Rlc1tlXTtpZihoKWZvcihjPTA7YzxoLmxlbmd0aDtjKyspaHIodCxoW2NdLG4scixpLG8pfX1mdW5jdGlvbiBmcih0LGUsbixyLGksbyl7aWYoOCZlLmZsYWdzKWNyKHQsZS5uZ0NvbnRlbnQuaW5kZXgsbixyLGksbyk7ZWxzZXt2YXIgYT1Kbih0LGUpO2lmKDM9PT1uJiYzMzU1NDQzMiZlLmZsYWdzJiY0OCZlLmJpbmRpbmdGbGFncz8oMTYmZS5iaW5kaW5nRmxhZ3MmJmhyKHQsYSxuLHIsaSxvKSwzMiZlLmJpbmRpbmdGbGFncyYmaHIoSW4odCxlLm5vZGVJbmRleCkuY29tcG9uZW50VmlldyxhLG4scixpLG8pKTpocih0LGEsbixyLGksbyksMTY3NzcyMTYmZS5mbGFncylmb3IodmFyIHM9SW4odCxlLm5vZGVJbmRleCkudmlld0NvbnRhaW5lci5fZW1iZWRkZWRWaWV3cyx1PTA7dTxzLmxlbmd0aDt1KyspdXIoc1t1XSxuLHIsaSxvKTsxJmUuZmxhZ3MmJiFlLmVsZW1lbnQubmFtZSYmbHIodCxuLGUubm9kZUluZGV4KzEsZS5ub2RlSW5kZXgrZS5jaGlsZENvdW50LHIsaSxvKX19ZnVuY3Rpb24gaHIodCxlLG4scixpLG8pe3ZhciBhPXQucmVuZGVyZXI7c3dpdGNoKG4pe2Nhc2UgMTphLmFwcGVuZENoaWxkKHIsZSk7YnJlYWs7Y2FzZSAyOmEuaW5zZXJ0QmVmb3JlKHIsZSxpKTticmVhaztjYXNlIDM6YS5yZW1vdmVDaGlsZChyLGUpO2JyZWFrO2Nhc2UgMDpvLnB1c2goZSl9fXZhciBkcj0vXjooW146XSspOiguKykkLztmdW5jdGlvbiBwcih0KXtpZigiOiI9PT10WzBdKXt2YXIgZT10Lm1hdGNoKGRyKTtyZXR1cm5bZVsxXSxlWzJdXX1yZXR1cm5bIiIsdF19ZnVuY3Rpb24gbXIodCl7Zm9yKHZhciBlPTAsbj0wO248dC5sZW5ndGg7bisrKWV8PXRbbl0uZmxhZ3M7cmV0dXJuIGV9ZnVuY3Rpb24geXIodCxlLG4scixpLG8sYSxzLHUsbCxjLGYsaCxkLHAsbSx5LGcsdixiKXtzd2l0Y2godCl7Y2FzZSAxOnJldHVybiBlK2dyKG4pK3I7Y2FzZSAyOnJldHVybiBlK2dyKG4pK3IrZ3IoaSkrbztjYXNlIDM6cmV0dXJuIGUrZ3IobikrcitncihpKStvK2dyKGEpK3M7Y2FzZSA0OnJldHVybiBlK2dyKG4pK3IrZ3IoaSkrbytncihhKStzK2dyKHUpK2w7Y2FzZSA1OnJldHVybiBlK2dyKG4pK3IrZ3IoaSkrbytncihhKStzK2dyKHUpK2wrZ3IoYykrZjtjYXNlIDY6cmV0dXJuIGUrZ3IobikrcitncihpKStvK2dyKGEpK3MrZ3IodSkrbCtncihjKStmK2dyKGgpK2Q7Y2FzZSA3OnJldHVybiBlK2dyKG4pK3IrZ3IoaSkrbytncihhKStzK2dyKHUpK2wrZ3IoYykrZitncihoKStkK2dyKHApK207Y2FzZSA4OnJldHVybiBlK2dyKG4pK3IrZ3IoaSkrbytncihhKStzK2dyKHUpK2wrZ3IoYykrZitncihoKStkK2dyKHApK20rZ3IoeSkrZztjYXNlIDk6cmV0dXJuIGUrZ3IobikrcitncihpKStvK2dyKGEpK3MrZ3IodSkrbCtncihjKStmK2dyKGgpK2QrZ3IocCkrbStncih5KStnK2dyKHYpK2I7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkRvZXMgbm90IHN1cHBvcnQgbW9yZSB0aGFuIDkgZXhwcmVzc2lvbnMiKX19ZnVuY3Rpb24gZ3IodCl7cmV0dXJuIG51bGwhPXQ/dC50b1N0cmluZygpOiIifWZ1bmN0aW9uIHZyKHQsZSxuLHIsaSxvKXt0fD0xO3ZhciBhPXJyKGUpO3JldHVybntub2RlSW5kZXg6LTEscGFyZW50Om51bGwscmVuZGVyUGFyZW50Om51bGwsYmluZGluZ0luZGV4Oi0xLG91dHB1dEluZGV4Oi0xLGZsYWdzOnQsY2hlY2tJbmRleDotMSxjaGlsZEZsYWdzOjAsZGlyZWN0Q2hpbGRGbGFnczowLGNoaWxkTWF0Y2hlZFF1ZXJpZXM6MCxtYXRjaGVkUXVlcmllczphLm1hdGNoZWRRdWVyaWVzLG1hdGNoZWRRdWVyeUlkczphLm1hdGNoZWRRdWVyeUlkcyxyZWZlcmVuY2VzOmEucmVmZXJlbmNlcyxuZ0NvbnRlbnRJbmRleDpuLGNoaWxkQ291bnQ6cixiaW5kaW5nczpbXSxiaW5kaW5nRmxhZ3M6MCxvdXRwdXRzOltdLGVsZW1lbnQ6e25zOm51bGwsbmFtZTpudWxsLGF0dHJzOm51bGwsdGVtcGxhdGU6bz9zcihvKTpudWxsLGNvbXBvbmVudFByb3ZpZGVyOm51bGwsY29tcG9uZW50VmlldzpudWxsLGNvbXBvbmVudFJlbmRlcmVyVHlwZTpudWxsLHB1YmxpY1Byb3ZpZGVyczpudWxsLGFsbFByb3ZpZGVyczpudWxsLGhhbmRsZUV2ZW50Oml8fExufSxwcm92aWRlcjpudWxsLHRleHQ6bnVsbCxxdWVyeTpudWxsLG5nQ29udGVudDpudWxsfX1mdW5jdGlvbiBicih0LGUsbixpLG8sYSxzLHUsbCxjLGYsaCl7dm9pZCAwPT09cyYmKHM9W10pLGN8fChjPUxuKTt2YXIgZD1ycihuKSxwPWQubWF0Y2hlZFF1ZXJpZXMsbT1kLnJlZmVyZW5jZXMseT1kLm1hdGNoZWRRdWVyeUlkcyxnPW51bGwsdj1udWxsO2EmJihnPShQPU9iamVjdChyLmMpKHByKGEpLDIpKVswXSx2PVBbMV0pLHU9dXx8W107Zm9yKHZhciBiPW5ldyBBcnJheSh1Lmxlbmd0aCksXz0wO188dS5sZW5ndGg7XysrKXt2YXIgdz1PYmplY3Qoci5jKSh1W19dLDMpLHg9d1swXSxPPXdbMV0sQz13WzJdLFM9T2JqZWN0KHIuYykocHIoTyksMiksRT1TWzBdLGs9U1sxXSxUPXZvaWQgMCxJPXZvaWQgMDtzd2l0Y2goMTUmeCl7Y2FzZSA0Okk9QzticmVhaztjYXNlIDE6Y2FzZSA4OlQ9Q31iW19dPXtmbGFnczp4LG5zOkUsbmFtZTprLG5vbk1pbmlmaWVkTmFtZTprLHNlY3VyaXR5Q29udGV4dDpULHN1ZmZpeDpJfX1sPWx8fFtdO3ZhciBBPW5ldyBBcnJheShsLmxlbmd0aCk7Zm9yKF89MDtfPGwubGVuZ3RoO18rKyl7dmFyIGo9T2JqZWN0KHIuYykobFtfXSwyKTtBW19dPXt0eXBlOjAsdGFyZ2V0OmpbMF0sZXZlbnROYW1lOmpbMV0scHJvcE5hbWU6bnVsbH19dmFyIFAsTT0ocz1zfHxbXSkubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdChyLmMpKHQsMiksbj1lWzBdLGk9ZVsxXSxvPU9iamVjdChyLmMpKHByKG4pLDIpO3JldHVybltvWzBdLG9bMV0saV19KTtyZXR1cm4gaD1mdW5jdGlvbih0KXtpZih0JiZ0LmlkPT09em4pe3ZhciBlPW51bGwhPXQuZW5jYXBzdWxhdGlvbiYmdC5lbmNhcHN1bGF0aW9uIT09WC5Ob25lfHx0LnN0eWxlcy5sZW5ndGh8fE9iamVjdC5rZXlzKHQuZGF0YSkubGVuZ3RoO3QuaWQ9ZT8iYyIrV24rKzpCbn1yZXR1cm4gdCYmdC5pZD09PUJuJiYodD1udWxsKSx0fHxudWxsfShoKSxmJiYoZXw9MzM1NTQ0MzIpLHtub2RlSW5kZXg6LTEscGFyZW50Om51bGwscmVuZGVyUGFyZW50Om51bGwsYmluZGluZ0luZGV4Oi0xLG91dHB1dEluZGV4Oi0xLGNoZWNrSW5kZXg6dCxmbGFnczplfD0xLGNoaWxkRmxhZ3M6MCxkaXJlY3RDaGlsZEZsYWdzOjAsY2hpbGRNYXRjaGVkUXVlcmllczowLG1hdGNoZWRRdWVyaWVzOnAsbWF0Y2hlZFF1ZXJ5SWRzOnkscmVmZXJlbmNlczptLG5nQ29udGVudEluZGV4OmksY2hpbGRDb3VudDpvLGJpbmRpbmdzOmIsYmluZGluZ0ZsYWdzOm1yKGIpLG91dHB1dHM6QSxlbGVtZW50OntuczpnLG5hbWU6dixhdHRyczpNLHRlbXBsYXRlOm51bGwsY29tcG9uZW50UHJvdmlkZXI6bnVsbCxjb21wb25lbnRWaWV3OmZ8fG51bGwsY29tcG9uZW50UmVuZGVyZXJUeXBlOmgscHVibGljUHJvdmlkZXJzOm51bGwsYWxsUHJvdmlkZXJzOm51bGwsaGFuZGxlRXZlbnQ6Y3x8TG59LHByb3ZpZGVyOm51bGwsdGV4dDpudWxsLHF1ZXJ5Om51bGwsbmdDb250ZW50Om51bGx9fWZ1bmN0aW9uIF9yKHQsZSxuKXt2YXIgaSxvPW4uZWxlbWVudCxhPXQucm9vdC5zZWxlY3Rvck9yTm9kZSxzPXQucmVuZGVyZXI7aWYodC5wYXJlbnR8fCFhKXtpPW8ubmFtZT9zLmNyZWF0ZUVsZW1lbnQoby5uYW1lLG8ubnMpOnMuY3JlYXRlQ29tbWVudCgiIik7dmFyIHU9b3IodCxlLG4pO3UmJnMuYXBwZW5kQ2hpbGQodSxpKX1lbHNlIGk9cy5zZWxlY3RSb290RWxlbWVudChhKTtpZihvLmF0dHJzKWZvcih2YXIgbD0wO2w8by5hdHRycy5sZW5ndGg7bCsrKXt2YXIgYz1PYmplY3Qoci5jKShvLmF0dHJzW2xdLDMpO3Muc2V0QXR0cmlidXRlKGksY1sxXSxjWzJdLGNbMF0pfXJldHVybiBpfWZ1bmN0aW9uIHdyKHQsZSxuLHIpe2Zvcih2YXIgaT0wO2k8bi5vdXRwdXRzLmxlbmd0aDtpKyspe3ZhciBvPW4ub3V0cHV0c1tpXSxhPXhyKHQsbi5ub2RlSW5kZXgsKGY9by5ldmVudE5hbWUsKGM9by50YXJnZXQpP2MrIjoiK2Y6ZikpLHM9by50YXJnZXQsdT10OyJjb21wb25lbnQiPT09by50YXJnZXQmJihzPW51bGwsdT1lKTt2YXIgbD11LnJlbmRlcmVyLmxpc3RlbihzfHxyLG8uZXZlbnROYW1lLGEpO3QuZGlzcG9zYWJsZXNbbi5vdXRwdXRJbmRleCtpXT1sfXZhciBjLGZ9ZnVuY3Rpb24geHIodCxlLG4pe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gWm4odCxlLG4scil9fWZ1bmN0aW9uIE9yKHQsZSxuLHIpe2lmKCFZbih0LGUsbixyKSlyZXR1cm4hMTt2YXIgaT1lLmJpbmRpbmdzW25dLG89SW4odCxlLm5vZGVJbmRleCksYT1vLnJlbmRlckVsZW1lbnQscz1pLm5hbWU7c3dpdGNoKDE1JmkuZmxhZ3Mpe2Nhc2UgMTohZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBhPWUuc2VjdXJpdHlDb250ZXh0LHM9YT90LnJvb3Quc2FuaXRpemVyLnNhbml0aXplKGEsbyk6bztzPW51bGwhPXM/cy50b1N0cmluZygpOm51bGw7dmFyIHU9dC5yZW5kZXJlcjtudWxsIT1vP3Uuc2V0QXR0cmlidXRlKG4saSxzLHIpOnUucmVtb3ZlQXR0cmlidXRlKG4saSxyKX0odCxpLGEsaS5ucyxzLHIpO2JyZWFrO2Nhc2UgMjohZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dC5yZW5kZXJlcjtyP2kuYWRkQ2xhc3MoZSxuKTppLnJlbW92ZUNsYXNzKGUsbil9KHQsYSxzLHIpO2JyZWFrO2Nhc2UgNDohZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz10LnJvb3Quc2FuaXRpemVyLnNhbml0aXplKENuLlNUWUxFLGkpO2lmKG51bGwhPW8pe289by50b1N0cmluZygpO3ZhciBhPWUuc3VmZml4O251bGwhPWEmJihvKz1hKX1lbHNlIG89bnVsbDt2YXIgcz10LnJlbmRlcmVyO251bGwhPW8/cy5zZXRTdHlsZShuLHIsbyk6cy5yZW1vdmVTdHlsZShuLHIpfSh0LGksYSxzLHIpO2JyZWFrO2Nhc2UgODohZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1lLnNlY3VyaXR5Q29udGV4dCxhPW8/dC5yb290LnNhbml0aXplci5zYW5pdGl6ZShvLGkpOmk7dC5yZW5kZXJlci5zZXRQcm9wZXJ0eShuLHIsYSl9KDMzNTU0NDMyJmUuZmxhZ3MmJjMyJmkuZmxhZ3M/by5jb21wb25lbnRWaWV3OnQsaSxhLHMscil9cmV0dXJuITB9dmFyIENyPW5ldyBPYmplY3QsU3I9Vm4oTiksRXI9Vm4oUCksa3I9Vm4oanQpO2Z1bmN0aW9uIFRyKHQsZSxuLHIpe3JldHVybiBuPVMobikse2luZGV4Oi0xLGRlcHM6aXIocixPKGUpKSxmbGFnczp0LHRva2VuOmUsdmFsdWU6bn19ZnVuY3Rpb24gSXIodCl7Zm9yKHZhciBlPXt9LG49W10scj0hMSxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBvPXRbaV07by50b2tlbj09PXN0JiYocj0hMCksMTA3Mzc0MTgyNCZvLmZsYWdzJiZuLnB1c2goby50b2tlbiksby5pbmRleD1pLGVbVm4oby50b2tlbildPW99cmV0dXJue2ZhY3Rvcnk6bnVsbCxwcm92aWRlcnNCeUtleTplLHByb3ZpZGVyczp0LG1vZHVsZXM6bixpc1Jvb3Q6cn19ZnVuY3Rpb24gQXIodCxlLG4pe3ZvaWQgMD09PW4mJihuPU4uVEhST1dfSUZfTk9UX0ZPVU5EKTt2YXIgcixpLG89Syh0KTt0cnl7aWYoOCZlLmZsYWdzKXJldHVybiBlLnRva2VuO2lmKDImZS5mbGFncyYmKG49bnVsbCksMSZlLmZsYWdzKXJldHVybiB0Ll9wYXJlbnQuZ2V0KGUudG9rZW4sbik7dmFyIGE9ZS50b2tlbktleTtzd2l0Y2goYSl7Y2FzZSBTcjpjYXNlIEVyOmNhc2Uga3I6cmV0dXJuIHR9dmFyIHM9dC5fZGVmLnByb3ZpZGVyc0J5S2V5W2FdO2lmKHMpe3ZhciB1PXQuX3Byb3ZpZGVyc1tzLmluZGV4XTtyZXR1cm4gdm9pZCAwPT09dSYmKHU9dC5fcHJvdmlkZXJzW3MuaW5kZXhdPWpyKHQscykpLHU9PT1Dcj92b2lkIDA6dX1pZihlLnRva2VuLm5nSW5qZWN0YWJsZURlZiYmKHI9dCxudWxsIT0oaT1lLnRva2VuLm5nSW5qZWN0YWJsZURlZikucHJvdmlkZWRJbiYmKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX2RlZi5tb2R1bGVzLmluZGV4T2YoaS5wcm92aWRlZEluKT4tMX0ocil8fCJyb290Ij09PWkucHJvdmlkZWRJbiYmci5fZGVmLmlzUm9vdCkpKXt2YXIgbD10Ll9wcm92aWRlcnMubGVuZ3RoO3JldHVybiB0Ll9kZWYucHJvdmlkZXJzQnlLZXlbZS50b2tlbktleV09e2ZsYWdzOjUxMjAsdmFsdWU6ZS50b2tlbi5uZ0luamVjdGFibGVEZWYuZmFjdG9yeSxkZXBzOltdLGluZGV4OmwsdG9rZW46ZS50b2tlbn0sdC5fcHJvdmlkZXJzW2xdPUNyLHQuX3Byb3ZpZGVyc1tsXT1qcih0LHQuX2RlZi5wcm92aWRlcnNCeUtleVtlLnRva2VuS2V5XSl9cmV0dXJuIDQmZS5mbGFncz9uOnQuX3BhcmVudC5nZXQoZS50b2tlbixuKX1maW5hbGx5e0sobyl9fWZ1bmN0aW9uIGpyKHQsZSl7dmFyIG47c3dpdGNoKDIwMTM0NzA2NyZlLmZsYWdzKXtjYXNlIDUxMjpuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uLmxlbmd0aDtzd2l0Y2goaSl7Y2FzZSAwOnJldHVybiBuZXcgZTtjYXNlIDE6cmV0dXJuIG5ldyBlKEFyKHQsblswXSkpO2Nhc2UgMjpyZXR1cm4gbmV3IGUoQXIodCxuWzBdKSxBcih0LG5bMV0pKTtjYXNlIDM6cmV0dXJuIG5ldyBlKEFyKHQsblswXSksQXIodCxuWzFdKSxBcih0LG5bMl0pKTtkZWZhdWx0OmZvcih2YXIgbz1uZXcgQXJyYXkoaSksYT0wO2E8aTthKyspb1thXT1Bcih0LG5bYV0pO3JldHVybiBuZXcoZS5iaW5kLmFwcGx5KGUsT2JqZWN0KHIuZCkoW3ZvaWQgMF0sbykpKX19KHQsZS52YWx1ZSxlLmRlcHMpO2JyZWFrO2Nhc2UgMTAyNDpuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uLmxlbmd0aDtzd2l0Y2goaSl7Y2FzZSAwOnJldHVybiBlKCk7Y2FzZSAxOnJldHVybiBlKEFyKHQsblswXSkpO2Nhc2UgMjpyZXR1cm4gZShBcih0LG5bMF0pLEFyKHQsblsxXSkpO2Nhc2UgMzpyZXR1cm4gZShBcih0LG5bMF0pLEFyKHQsblsxXSksQXIodCxuWzJdKSk7ZGVmYXVsdDpmb3IodmFyIG89QXJyYXkoaSksYT0wO2E8aTthKyspb1thXT1Bcih0LG5bYV0pO3JldHVybiBlLmFwcGx5KHZvaWQgMCxPYmplY3Qoci5kKShvKSl9fSh0LGUudmFsdWUsZS5kZXBzKTticmVhaztjYXNlIDIwNDg6bj1Bcih0LGUuZGVwc1swXSk7YnJlYWs7Y2FzZSAyNTY6bj1lLnZhbHVlfXJldHVybiBuPT09Q3J8fG51bGw9PW58fCJvYmplY3QiIT10eXBlb2Ygbnx8MTMxMDcyJmUuZmxhZ3N8fCJmdW5jdGlvbiIhPXR5cGVvZiBuLm5nT25EZXN0cm95fHwoZS5mbGFnc3w9MTMxMDcyKSx2b2lkIDA9PT1uP0NyOm59ZnVuY3Rpb24gUHIodCxlKXt2YXIgbj10LnZpZXdDb250YWluZXIuX2VtYmVkZGVkVmlld3M7aWYoKG51bGw9PWV8fGU+PW4ubGVuZ3RoKSYmKGU9bi5sZW5ndGgtMSksZTwwKXJldHVybiBudWxsO3ZhciByPW5bZV07cmV0dXJuIHIudmlld0NvbnRhaW5lclBhcmVudD1udWxsLERyKG4sZSksTW4uZGlydHlQYXJlbnRRdWVyaWVzKHIpLE5yKHIpLHJ9ZnVuY3Rpb24gTXIodCxlLG4pe3ZhciByPWU/Sm4oZSxlLmRlZi5sYXN0UmVuZGVyUm9vdE5vZGUpOnQucmVuZGVyRWxlbWVudDt1cihuLDIsbi5yZW5kZXJlci5wYXJlbnROb2RlKHIpLG4ucmVuZGVyZXIubmV4dFNpYmxpbmcociksdm9pZCAwKX1mdW5jdGlvbiBOcih0KXt1cih0LDMsbnVsbCxudWxsLHZvaWQgMCl9ZnVuY3Rpb24gUnIodCxlLG4pe2U+PXQubGVuZ3RoP3QucHVzaChuKTp0LnNwbGljZShlLDAsbil9ZnVuY3Rpb24gRHIodCxlKXtlPj10Lmxlbmd0aC0xP3QucG9wKCk6dC5zcGxpY2UoZSwxKX12YXIgTHI9bmV3IE9iamVjdDtmdW5jdGlvbiBGcih0LGUsbixyLGksbyl7cmV0dXJuIG5ldyBWcih0LGUsbixyLGksbyl9dmFyIFZyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIsaSxvLGEpe3ZhciBzPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gcy5zZWxlY3Rvcj1lLHMuY29tcG9uZW50VHlwZT1uLHMuX2lucHV0cz1pLHMuX291dHB1dHM9byxzLm5nQ29udGVudFNlbGVjdG9ycz1hLHMudmlld0RlZkZhY3Rvcnk9cixzfXJldHVybiBPYmplY3Qoci5iKShlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiaW5wdXRzIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9W10sZT10aGlzLl9pbnB1dHM7Zm9yKHZhciBuIGluIGUpdC5wdXNoKHtwcm9wTmFtZTpuLHRlbXBsYXRlTmFtZTplW25dfSk7cmV0dXJuIHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJvdXRwdXRzIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMuX291dHB1dHMpdC5wdXNoKHtwcm9wTmFtZTplLHRlbXBsYXRlTmFtZTp0aGlzLl9vdXRwdXRzW2VdfSk7cmV0dXJuIHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCFyKXRocm93IG5ldyBFcnJvcigibmdNb2R1bGUgc2hvdWxkIGJlIHByb3ZpZGVkIik7dmFyIGk9c3IodGhpcy52aWV3RGVmRmFjdG9yeSksbz1pLm5vZGVzWzBdLmVsZW1lbnQuY29tcG9uZW50UHJvdmlkZXIubm9kZUluZGV4LGE9TW4uY3JlYXRlUm9vdFZpZXcodCxlfHxbXSxuLGkscixMcikscz1BbihhLG8pLmluc3RhbmNlO3JldHVybiBuJiZhLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShJbihhLDApLnJlbmRlckVsZW1lbnQsIm5nLXZlcnNpb24iLEouZnVsbCksbmV3IFVyKGEsbmV3IFdyKGEpLHMpfSxlfSh4dCksVXI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scil7dmFyIGk9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBpLl92aWV3PWUsaS5fdmlld1JlZj1uLGkuX2NvbXBvbmVudD1yLGkuX2VsRGVmPWkuX3ZpZXcuZGVmLm5vZGVzWzBdLGkuaG9zdFZpZXc9bixpLmNoYW5nZURldGVjdG9yUmVmPW4saS5pbnN0YW5jZT1yLGl9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJsb2NhdGlvbiIse2dldDpmdW5jdGlvbigpe3JldHVybiBuZXcgY2UoSW4odGhpcy5fdmlldyx0aGlzLl9lbERlZi5ub2RlSW5kZXgpLnJlbmRlckVsZW1lbnQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiaW5qZWN0b3IiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFFyKHRoaXMuX3ZpZXcsdGhpcy5fZWxEZWYpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY29tcG9uZW50VHlwZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnQuY29uc3RydWN0b3J9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX3ZpZXdSZWYuZGVzdHJveSgpfSxlLnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24odCl7dGhpcy5fdmlld1JlZi5vbkRlc3Ryb3kodCl9LGV9KGZ1bmN0aW9uKCl7fSk7ZnVuY3Rpb24genIodCxlLG4pe3JldHVybiBuZXcgQnIodCxlLG4pfXZhciBCcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMuX3ZpZXc9dCx0aGlzLl9lbERlZj1lLHRoaXMuX2RhdGE9bix0aGlzLl9lbWJlZGRlZFZpZXdzPVtdfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImVsZW1lbnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGNlKHRoaXMuX2RhdGEucmVuZGVyRWxlbWVudCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpbmplY3RvciIse2dldDpmdW5jdGlvbigpe3JldHVybiBuZXcgUXIodGhpcy5fdmlldyx0aGlzLl9lbERlZil9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwYXJlbnRJbmplY3RvciIse2dldDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl92aWV3LGU9dGhpcy5fZWxEZWYucGFyZW50OyFlJiZ0OyllPSRuKHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHQ/bmV3IFFyKHQsZSk6bmV3IFFyKHRoaXMuX3ZpZXcsbnVsbCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZW1iZWRkZWRWaWV3cy5sZW5ndGgtMTt0Pj0wO3QtLSl7dmFyIGU9UHIodGhpcy5fZGF0YSx0KTtNbi5kZXN0cm95VmlldyhlKX19LHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9lbWJlZGRlZFZpZXdzW3RdO2lmKGUpe3ZhciBuPW5ldyBXcihlKTtyZXR1cm4gbi5hdHRhY2hUb1ZpZXdDb250YWluZXJSZWYodGhpcyksbn1yZXR1cm4gbnVsbH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJsZW5ndGgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW1iZWRkZWRWaWV3cy5sZW5ndGh9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuY3JlYXRlRW1iZWRkZWRWaWV3PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmNyZWF0ZUVtYmVkZGVkVmlldyhlfHx7fSk7cmV0dXJuIHRoaXMuaW5zZXJ0KHIsbikscn0sdC5wcm90b3R5cGUuY3JlYXRlQ29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89bnx8dGhpcy5wYXJlbnRJbmplY3RvcjtpfHx0IGluc3RhbmNlb2YgQXR8fChpPW8uZ2V0KGp0KSk7dmFyIGE9dC5jcmVhdGUobyxyLHZvaWQgMCxpKTtyZXR1cm4gdGhpcy5pbnNlcnQoYS5ob3N0VmlldyxlKSxhfSx0LnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxlKXtpZih0LmRlc3Ryb3llZCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnNlcnQgYSBkZXN0cm95ZWQgVmlldyBpbiBhIFZpZXdDb250YWluZXIhIik7dmFyIG4scixpLG8sYT10O3JldHVybiBpPWEuX3ZpZXcsbz0obj10aGlzLl9kYXRhKS52aWV3Q29udGFpbmVyLl9lbWJlZGRlZFZpZXdzLG51bGwhPT0ocj1lKSYmdm9pZCAwIT09cnx8KHI9by5sZW5ndGgpLGkudmlld0NvbnRhaW5lclBhcmVudD10aGlzLl92aWV3LFJyKG8scixpKSxmdW5jdGlvbih0LGUpe3ZhciBuPVhuKGUpO2lmKG4mJm4hPT10JiYhKDE2JmUuc3RhdGUpKXtlLnN0YXRlfD0xNjt2YXIgcj1uLnRlbXBsYXRlLl9wcm9qZWN0ZWRWaWV3cztyfHwocj1uLnRlbXBsYXRlLl9wcm9qZWN0ZWRWaWV3cz1bXSksci5wdXNoKGUpLGZ1bmN0aW9uKHQsbil7aWYoISg0Jm4uZmxhZ3MpKXtlLnBhcmVudC5kZWYubm9kZUZsYWdzfD00LG4uZmxhZ3N8PTQ7Zm9yKHZhciByPW4ucGFyZW50O3I7KXIuY2hpbGRGbGFnc3w9NCxyPXIucGFyZW50fX0oMCxlLnBhcmVudE5vZGVEZWYpfX0obixpKSxNbi5kaXJ0eVBhcmVudFF1ZXJpZXMoaSksTXIobixyPjA/b1tyLTFdOm51bGwsaSksYS5hdHRhY2hUb1ZpZXdDb250YWluZXJSZWYodGhpcyksdH0sdC5wcm90b3R5cGUubW92ZT1mdW5jdGlvbih0LGUpe2lmKHQuZGVzdHJveWVkKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG1vdmUgYSBkZXN0cm95ZWQgVmlldyBpbiBhIFZpZXdDb250YWluZXIhIik7dmFyIG4scixpLG8sYSxzPXRoaXMuX2VtYmVkZGVkVmlld3MuaW5kZXhPZih0Ll92aWV3KTtyZXR1cm4gaT1lLGE9KG89KG49dGhpcy5fZGF0YSkudmlld0NvbnRhaW5lci5fZW1iZWRkZWRWaWV3cylbcj1zXSxEcihvLHIpLG51bGw9PWkmJihpPW8ubGVuZ3RoKSxScihvLGksYSksTW4uZGlydHlQYXJlbnRRdWVyaWVzKGEpLE5yKGEpLE1yKG4saT4wP29baS0xXTpudWxsLGEpLHR9LHQucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2VtYmVkZGVkVmlld3MuaW5kZXhPZih0Ll92aWV3KX0sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPVByKHRoaXMuX2RhdGEsdCk7ZSYmTW4uZGVzdHJveVZpZXcoZSl9LHQucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbih0KXt2YXIgZT1Qcih0aGlzLl9kYXRhLHQpO3JldHVybiBlP25ldyBXcihlKTpudWxsfSx0fSgpO2Z1bmN0aW9uIEhyKHQpe3JldHVybiBuZXcgV3IodCl9dmFyIFdyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl92aWV3PXQsdGhpcy5fdmlld0NvbnRhaW5lclJlZj1udWxsLHRoaXMuX2FwcFJlZj1udWxsfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInJvb3ROb2RlcyIse2dldDpmdW5jdGlvbigpe3JldHVybiB1cih0aGlzLl92aWV3LDAsdm9pZCAwLHZvaWQgMCx0PVtdKSx0O3ZhciB0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiY29udGV4dCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92aWV3LmNvbnRleHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMCE9KDEyOCZ0aGlzLl92aWV3LnN0YXRlKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5tYXJrRm9yQ2hlY2s9ZnVuY3Rpb24oKXtRbih0aGlzLl92aWV3KX0sdC5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5fdmlldy5zdGF0ZSY9LTV9LHQucHJvdG90eXBlLmRldGVjdENoYW5nZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl92aWV3LnJvb3QucmVuZGVyZXJGYWN0b3J5O3QuYmVnaW4mJnQuYmVnaW4oKTt0cnl7TW4uY2hlY2tBbmRVcGRhdGVWaWV3KHRoaXMuX3ZpZXcpfWZpbmFsbHl7dC5lbmQmJnQuZW5kKCl9fSx0LnByb3RvdHlwZS5jaGVja05vQ2hhbmdlcz1mdW5jdGlvbigpe01uLmNoZWNrTm9DaGFuZ2VzVmlldyh0aGlzLl92aWV3KX0sdC5wcm90b3R5cGUucmVhdHRhY2g9ZnVuY3Rpb24oKXt0aGlzLl92aWV3LnN0YXRlfD00fSx0LnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24odCl7dGhpcy5fdmlldy5kaXNwb3NhYmxlc3x8KHRoaXMuX3ZpZXcuZGlzcG9zYWJsZXM9W10pLHRoaXMuX3ZpZXcuZGlzcG9zYWJsZXMucHVzaCh0KX0sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2FwcFJlZj90aGlzLl9hcHBSZWYuZGV0YWNoVmlldyh0aGlzKTp0aGlzLl92aWV3Q29udGFpbmVyUmVmJiZ0aGlzLl92aWV3Q29udGFpbmVyUmVmLmRldGFjaCh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodGhpcykpLE1uLmRlc3Ryb3lWaWV3KHRoaXMuX3ZpZXcpfSx0LnByb3RvdHlwZS5kZXRhY2hGcm9tQXBwUmVmPWZ1bmN0aW9uKCl7dGhpcy5fYXBwUmVmPW51bGwsTnIodGhpcy5fdmlldyksTW4uZGlydHlQYXJlbnRRdWVyaWVzKHRoaXMuX3ZpZXcpfSx0LnByb3RvdHlwZS5hdHRhY2hUb0FwcFJlZj1mdW5jdGlvbih0KXtpZih0aGlzLl92aWV3Q29udGFpbmVyUmVmKXRocm93IG5ldyBFcnJvcigiVGhpcyB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSBWaWV3Q29udGFpbmVyISIpO3RoaXMuX2FwcFJlZj10fSx0LnByb3RvdHlwZS5hdHRhY2hUb1ZpZXdDb250YWluZXJSZWY9ZnVuY3Rpb24odCl7aWYodGhpcy5fYXBwUmVmKXRocm93IG5ldyBFcnJvcigiVGhpcyB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQgZGlyZWN0bHkgdG8gdGhlIEFwcGxpY2F0aW9uUmVmISIpO3RoaXMuX3ZpZXdDb250YWluZXJSZWY9dH0sdH0oKTtmdW5jdGlvbiBxcih0LGUpe3JldHVybiBuZXcgWXIodCxlKX12YXIgWXI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciByPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gci5fcGFyZW50Vmlldz1lLHIuX2RlZj1uLHJ9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUuY3JlYXRlRW1iZWRkZWRWaWV3PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgV3IoTW4uY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3BhcmVudFZpZXcsdGhpcy5fZGVmLHRoaXMuX2RlZi5lbGVtZW50LnRlbXBsYXRlLHQpKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJlbGVtZW50UmVmIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBjZShJbih0aGlzLl9wYXJlbnRWaWV3LHRoaXMuX2RlZi5ub2RlSW5kZXgpLnJlbmRlckVsZW1lbnQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGV9KGdlKTtmdW5jdGlvbiBHcih0LGUpe3JldHVybiBuZXcgUXIodCxlKX12YXIgUXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy52aWV3PXQsdGhpcy5lbERlZj1lfXJldHVybiB0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9Ti5USFJPV19JRl9OT1RfRk9VTkQpLE1uLnJlc29sdmVEZXAodGhpcy52aWV3LHRoaXMuZWxEZWYsISF0aGlzLmVsRGVmJiYwIT0oMzM1NTQ0MzImdGhpcy5lbERlZi5mbGFncykse2ZsYWdzOjAsdG9rZW46dCx0b2tlbktleTpWbih0KX0sZSl9LHR9KCk7ZnVuY3Rpb24gS3IodCxlKXt2YXIgbj10LmRlZi5ub2Rlc1tlXTtpZigxJm4uZmxhZ3Mpe3ZhciByPUluKHQsbi5ub2RlSW5kZXgpO3JldHVybiBuLmVsZW1lbnQudGVtcGxhdGU/ci50ZW1wbGF0ZTpyLnJlbmRlckVsZW1lbnR9aWYoMiZuLmZsYWdzKXJldHVybiBUbih0LG4ubm9kZUluZGV4KS5yZW5kZXJUZXh0O2lmKDIwMjQwJm4uZmxhZ3MpcmV0dXJuIEFuKHQsbi5ub2RlSW5kZXgpLmluc3RhbmNlO3Rocm93IG5ldyBFcnJvcigiSWxsZWdhbCBzdGF0ZTogcmVhZCBub2RlVmFsdWUgZm9yIG5vZGUgaW5kZXggIitlKX1mdW5jdGlvbiBacih0KXtyZXR1cm4gbmV3IFhyKHQucmVuZGVyZXIpfXZhciBYcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5kZWxlZ2F0ZT10fXJldHVybiB0LnByb3RvdHlwZS5zZWxlY3RSb290RWxlbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5zZWxlY3RSb290RWxlbWVudCh0KX0sdC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbih0LGUpe3ZhciBuPU9iamVjdChyLmMpKHByKGUpLDIpLGk9dGhpcy5kZWxlZ2F0ZS5jcmVhdGVFbGVtZW50KG5bMV0sblswXSk7cmV0dXJuIHQmJnRoaXMuZGVsZWdhdGUuYXBwZW5kQ2hpbGQodCxpKSxpfSx0LnByb3RvdHlwZS5jcmVhdGVWaWV3Um9vdD1mdW5jdGlvbih0KXtyZXR1cm4gdH0sdC5wcm90b3R5cGUuY3JlYXRlVGVtcGxhdGVBbmNob3I9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kZWxlZ2F0ZS5jcmVhdGVDb21tZW50KCIiKTtyZXR1cm4gdCYmdGhpcy5kZWxlZ2F0ZS5hcHBlbmRDaGlsZCh0LGUpLGV9LHQucHJvdG90eXBlLmNyZWF0ZVRleHQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmRlbGVnYXRlLmNyZWF0ZVRleHQoZSk7cmV0dXJuIHQmJnRoaXMuZGVsZWdhdGUuYXBwZW5kQ2hpbGQodCxuKSxufSx0LnByb3RvdHlwZS5wcm9qZWN0Tm9kZXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0aGlzLmRlbGVnYXRlLmFwcGVuZENoaWxkKHQsZVtuXSl9LHQucHJvdG90eXBlLmF0dGFjaFZpZXdBZnRlcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLmRlbGVnYXRlLnBhcmVudE5vZGUodCkscj10aGlzLmRlbGVnYXRlLm5leHRTaWJsaW5nKHQpLGk9MDtpPGUubGVuZ3RoO2krKyl0aGlzLmRlbGVnYXRlLmluc2VydEJlZm9yZShuLGVbaV0scil9LHQucHJvdG90eXBlLmRldGFjaFZpZXc9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBuPXRbZV0scj10aGlzLmRlbGVnYXRlLnBhcmVudE5vZGUobik7dGhpcy5kZWxlZ2F0ZS5yZW1vdmVDaGlsZChyLG4pfX0sdC5wcm90b3R5cGUuZGVzdHJveVZpZXc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0aGlzLmRlbGVnYXRlLmRlc3Ryb3lOb2RlKGVbbl0pfSx0LnByb3RvdHlwZS5saXN0ZW49ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLmRlbGVnYXRlLmxpc3Rlbih0LGUsbil9LHQucHJvdG90eXBlLmxpc3Rlbkdsb2JhbD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKHQsZSxuKX0sdC5wcm90b3R5cGUuc2V0RWxlbWVudFByb3BlcnR5PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLmRlbGVnYXRlLnNldFByb3BlcnR5KHQsZSxuKX0sdC5wcm90b3R5cGUuc2V0RWxlbWVudEF0dHJpYnV0ZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9T2JqZWN0KHIuYykocHIoZSksMiksbz1pWzBdLGE9aVsxXTtudWxsIT1uP3RoaXMuZGVsZWdhdGUuc2V0QXR0cmlidXRlKHQsYSxuLG8pOnRoaXMuZGVsZWdhdGUucmVtb3ZlQXR0cmlidXRlKHQsYSxvKX0sdC5wcm90b3R5cGUuc2V0QmluZGluZ0RlYnVnSW5mbz1mdW5jdGlvbih0LGUsbil7fSx0LnByb3RvdHlwZS5zZXRFbGVtZW50Q2xhc3M9ZnVuY3Rpb24odCxlLG4pe24/dGhpcy5kZWxlZ2F0ZS5hZGRDbGFzcyh0LGUpOnRoaXMuZGVsZWdhdGUucmVtb3ZlQ2xhc3ModCxlKX0sdC5wcm90b3R5cGUuc2V0RWxlbWVudFN0eWxlPWZ1bmN0aW9uKHQsZSxuKXtudWxsIT1uP3RoaXMuZGVsZWdhdGUuc2V0U3R5bGUodCxlLG4pOnRoaXMuZGVsZWdhdGUucmVtb3ZlU3R5bGUodCxlKX0sdC5wcm90b3R5cGUuaW52b2tlRWxlbWVudE1ldGhvZD1mdW5jdGlvbih0LGUsbil7dFtlXS5hcHBseSh0LG4pfSx0LnByb3RvdHlwZS5zZXRUZXh0PWZ1bmN0aW9uKHQsZSl7dGhpcy5kZWxlZ2F0ZS5zZXRWYWx1ZSh0LGUpfSx0LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJSZW5kZXJlci5hbmltYXRlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQhIil9LHR9KCk7ZnVuY3Rpb24gJHIodCxlLG4scil7cmV0dXJuIG5ldyBKcih0LGUsbixyKX12YXIgSnI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLHIpe3RoaXMuX21vZHVsZVR5cGU9dCx0aGlzLl9wYXJlbnQ9ZSx0aGlzLl9ib290c3RyYXBDb21wb25lbnRzPW4sdGhpcy5fZGVmPXIsdGhpcy5fZGVzdHJveUxpc3RlbmVycz1bXSx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5pbmplY3Rvcj10aGlzLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Ll9kZWYsbj10Ll9wcm92aWRlcnM9bmV3IEFycmF5KGUucHJvdmlkZXJzLmxlbmd0aCkscj0wO3I8ZS5wcm92aWRlcnMubGVuZ3RoO3IrKyl7dmFyIGk9ZS5wcm92aWRlcnNbcl07NDA5NiZpLmZsYWdzfHx2b2lkIDA9PT1uW3JdJiYobltyXT1qcih0LGkpKX19KHRoaXMpfXJldHVybiB0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PWUmJihlPU4uVEhST1dfSUZfTk9UX0ZPVU5EKSx2b2lkIDA9PT1uJiYobj0wKTt2YXIgcj0wO3JldHVybiA0Jm4/cnw9MToyJm4mJihyfD00KSxBcih0aGlzLHt0b2tlbjp0LHRva2VuS2V5OlZuKHQpLGZsYWdzOnJ9LGUpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImluc3RhbmNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KHRoaXMuX21vZHVsZVR5cGUpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiY29tcG9uZW50RmFjdG9yeVJlc29sdmVyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KFR0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7aWYodGhpcy5fZGVzdHJveWVkKXRocm93IG5ldyBFcnJvcigiVGhlIG5nIG1vZHVsZSAiK08odGhpcy5pbnN0YW5jZS5jb25zdHJ1Y3RvcikrIiBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZC4iKTt0aGlzLl9kZXN0cm95ZWQ9ITAsZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5fZGVmLHI9bmV3IFNldCxpPTA7aTxuLnByb3ZpZGVycy5sZW5ndGg7aSsrKWlmKDEzMTA3MiZuLnByb3ZpZGVyc1tpXS5mbGFncyl7dmFyIG89dC5fcHJvdmlkZXJzW2ldO2lmKG8mJm8hPT1Dcil7dmFyIGE9by5uZ09uRGVzdHJveTsiZnVuY3Rpb24iIT10eXBlb2YgYXx8ci5oYXMobyl8fChhLmFwcGx5KG8pLHIuYWRkKG8pKX19fSh0aGlzKSx0aGlzLl9kZXN0cm95TGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQoKX0pfSx0LnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24odCl7dGhpcy5fZGVzdHJveUxpc3RlbmVycy5wdXNoKHQpfSx0fSgpLHRpPVZuKGZ1bmN0aW9uKCl7fSksZWk9Vm4oZnVuY3Rpb24oKXt9KSxuaT1WbihjZSkscmk9Vm4odmUpLGlpPVZuKGdlKSxvaT1WbihiZSksYWk9Vm4oTiksc2k9Vm4oUCk7ZnVuY3Rpb24gdWkodCxlLG4saSxvLGEscyx1KXt2YXIgbD1bXTtpZihzKWZvcih2YXIgYyBpbiBzKXt2YXIgZj1PYmplY3Qoci5jKShzW2NdLDIpO2xbZlswXV09e2ZsYWdzOjgsbmFtZTpjLG5vbk1pbmlmaWVkTmFtZTpmWzFdLG5zOm51bGwsc2VjdXJpdHlDb250ZXh0Om51bGwsc3VmZml4Om51bGx9fXZhciBoPVtdO2lmKHUpZm9yKHZhciBkIGluIHUpaC5wdXNoKHt0eXBlOjEscHJvcE5hbWU6ZCx0YXJnZXQ6bnVsbCxldmVudE5hbWU6dVtkXX0pO3JldHVybiBmaSh0LGV8PTE2Mzg0LG4saSxvLG8sYSxsLGgpfWZ1bmN0aW9uIGxpKHQsZSxuKXtyZXR1cm4gZmkoLTEsdHw9MTYsbnVsbCwwLGUsZSxuKX1mdW5jdGlvbiBjaSh0LGUsbixyLGkpe3JldHVybiBmaSgtMSx0LGUsMCxuLHIsaSl9ZnVuY3Rpb24gZmkodCxlLG4scixpLG8sYSxzLHUpe3ZhciBsPXJyKG4pLGM9bC5tYXRjaGVkUXVlcmllcyxmPWwucmVmZXJlbmNlcyxoPWwubWF0Y2hlZFF1ZXJ5SWRzO3V8fCh1PVtdKSxzfHwocz1bXSksbz1TKG8pO3ZhciBkPWlyKGEsTyhpKSk7cmV0dXJue25vZGVJbmRleDotMSxwYXJlbnQ6bnVsbCxyZW5kZXJQYXJlbnQ6bnVsbCxiaW5kaW5nSW5kZXg6LTEsb3V0cHV0SW5kZXg6LTEsY2hlY2tJbmRleDp0LGZsYWdzOmUsY2hpbGRGbGFnczowLGRpcmVjdENoaWxkRmxhZ3M6MCxjaGlsZE1hdGNoZWRRdWVyaWVzOjAsbWF0Y2hlZFF1ZXJpZXM6YyxtYXRjaGVkUXVlcnlJZHM6aCxyZWZlcmVuY2VzOmYsbmdDb250ZW50SW5kZXg6LTEsY2hpbGRDb3VudDpyLGJpbmRpbmdzOnMsYmluZGluZ0ZsYWdzOm1yKHMpLG91dHB1dHM6dSxlbGVtZW50Om51bGwscHJvdmlkZXI6e3Rva2VuOmksdmFsdWU6byxkZXBzOmR9LHRleHQ6bnVsbCxxdWVyeTpudWxsLG5nQ29udGVudDpudWxsfX1mdW5jdGlvbiBoaSh0LGUpe3JldHVybiB5aSh0LGUpfWZ1bmN0aW9uIGRpKHQsZSl7Zm9yKHZhciBuPXQ7bi5wYXJlbnQmJiF0cihuKTspbj1uLnBhcmVudDtyZXR1cm4gZ2kobi5wYXJlbnQsJG4obiksITAsZS5wcm92aWRlci52YWx1ZSxlLnByb3ZpZGVyLmRlcHMpfWZ1bmN0aW9uIHBpKHQsZSl7dmFyIG49Z2kodCxlLnBhcmVudCwoMzI3NjgmZS5mbGFncyk+MCxlLnByb3ZpZGVyLnZhbHVlLGUucHJvdmlkZXIuZGVwcyk7aWYoZS5vdXRwdXRzLmxlbmd0aClmb3IodmFyIHI9MDtyPGUub3V0cHV0cy5sZW5ndGg7cisrKXt2YXIgaT1lLm91dHB1dHNbcl0sbz1uW2kucHJvcE5hbWVdLnN1YnNjcmliZShtaSh0LGUucGFyZW50Lm5vZGVJbmRleCxpLmV2ZW50TmFtZSkpO3QuZGlzcG9zYWJsZXNbZS5vdXRwdXRJbmRleCtyXT1vLnVuc3Vic2NyaWJlLmJpbmQobyl9cmV0dXJuIG59ZnVuY3Rpb24gbWkodCxlLG4pe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gWm4odCxlLG4scil9fWZ1bmN0aW9uIHlpKHQsZSl7dmFyIG49KDgxOTImZS5mbGFncyk+MCxpPWUucHJvdmlkZXI7c3dpdGNoKDIwMTM0NzA2NyZlLmZsYWdzKXtjYXNlIDUxMjpyZXR1cm4gZ2kodCxlLnBhcmVudCxuLGkudmFsdWUsaS5kZXBzKTtjYXNlIDEwMjQ6cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLGksbyl7dmFyIGE9by5sZW5ndGg7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4gaSgpO2Nhc2UgMTpyZXR1cm4gaShiaSh0LGUsbixvWzBdKSk7Y2FzZSAyOnJldHVybiBpKGJpKHQsZSxuLG9bMF0pLGJpKHQsZSxuLG9bMV0pKTtjYXNlIDM6cmV0dXJuIGkoYmkodCxlLG4sb1swXSksYmkodCxlLG4sb1sxXSksYmkodCxlLG4sb1syXSkpO2RlZmF1bHQ6Zm9yKHZhciBzPUFycmF5KGEpLHU9MDt1PGE7dSsrKXNbdV09YmkodCxlLG4sb1t1XSk7cmV0dXJuIGkuYXBwbHkodm9pZCAwLE9iamVjdChyLmQpKHMpKX19KHQsZS5wYXJlbnQsbixpLnZhbHVlLGkuZGVwcyk7Y2FzZSAyMDQ4OnJldHVybiBiaSh0LGUucGFyZW50LG4saS5kZXBzWzBdKTtjYXNlIDI1NjpyZXR1cm4gaS52YWx1ZX19ZnVuY3Rpb24gZ2kodCxlLG4saSxvKXt2YXIgYT1vLmxlbmd0aDtzd2l0Y2goYSl7Y2FzZSAwOnJldHVybiBuZXcgaTtjYXNlIDE6cmV0dXJuIG5ldyBpKGJpKHQsZSxuLG9bMF0pKTtjYXNlIDI6cmV0dXJuIG5ldyBpKGJpKHQsZSxuLG9bMF0pLGJpKHQsZSxuLG9bMV0pKTtjYXNlIDM6cmV0dXJuIG5ldyBpKGJpKHQsZSxuLG9bMF0pLGJpKHQsZSxuLG9bMV0pLGJpKHQsZSxuLG9bMl0pKTtkZWZhdWx0OmZvcih2YXIgcz1uZXcgQXJyYXkoYSksdT0wO3U8YTt1Kyspc1t1XT1iaSh0LGUsbixvW3VdKTtyZXR1cm4gbmV3KGkuYmluZC5hcHBseShpLE9iamVjdChyLmQpKFt2b2lkIDBdLHMpKSl9fXZhciB2aT17fTtmdW5jdGlvbiBiaSh0LGUsbixyLGkpe2lmKHZvaWQgMD09PWkmJihpPU4uVEhST1dfSUZfTk9UX0ZPVU5EKSw4JnIuZmxhZ3MpcmV0dXJuIHIudG9rZW47dmFyIG89dDsyJnIuZmxhZ3MmJihpPW51bGwpO3ZhciBhPXIudG9rZW5LZXk7YT09PW9pJiYobj0hKCFlfHwhZS5lbGVtZW50LmNvbXBvbmVudFZpZXcpKSxlJiYxJnIuZmxhZ3MmJihuPSExLGU9ZS5wYXJlbnQpO2Zvcih2YXIgcz10O3M7KXtpZihlKXN3aXRjaChhKXtjYXNlIHRpOnJldHVybiBacihfaShzLGUsbikpO2Nhc2UgZWk6cmV0dXJuIF9pKHMsZSxuKS5yZW5kZXJlcjtjYXNlIG5pOnJldHVybiBuZXcgY2UoSW4ocyxlLm5vZGVJbmRleCkucmVuZGVyRWxlbWVudCk7Y2FzZSByaTpyZXR1cm4gSW4ocyxlLm5vZGVJbmRleCkudmlld0NvbnRhaW5lcjtjYXNlIGlpOmlmKGUuZWxlbWVudC50ZW1wbGF0ZSlyZXR1cm4gSW4ocyxlLm5vZGVJbmRleCkudGVtcGxhdGU7YnJlYWs7Y2FzZSBvaTpyZXR1cm4gSHIoX2kocyxlLG4pKTtjYXNlIGFpOmNhc2Ugc2k6cmV0dXJuIEdyKHMsZSk7ZGVmYXVsdDp2YXIgdT0obj9lLmVsZW1lbnQuYWxsUHJvdmlkZXJzOmUuZWxlbWVudC5wdWJsaWNQcm92aWRlcnMpW2FdO2lmKHUpe3ZhciBsPUFuKHMsdS5ub2RlSW5kZXgpO3JldHVybiBsfHwobD17aW5zdGFuY2U6eWkocyx1KX0scy5ub2Rlc1t1Lm5vZGVJbmRleF09bCksbC5pbnN0YW5jZX19bj10cihzKSxlPSRuKHMpLHM9cy5wYXJlbnQsNCZyLmZsYWdzJiYocz1udWxsKX12YXIgYz1vLnJvb3QuaW5qZWN0b3IuZ2V0KHIudG9rZW4sdmkpO3JldHVybiBjIT09dml8fGk9PT12aT9jOm8ucm9vdC5uZ01vZHVsZS5pbmplY3Rvci5nZXQoci50b2tlbixpKX1mdW5jdGlvbiBfaSh0LGUsbil7dmFyIHI7aWYobilyPUluKHQsZS5ub2RlSW5kZXgpLmNvbXBvbmVudFZpZXc7ZWxzZSBmb3Iocj10O3IucGFyZW50JiYhdHIocik7KXI9ci5wYXJlbnQ7cmV0dXJuIHJ9ZnVuY3Rpb24gd2kodCxlLG4scixpLG8pe2lmKDMyNzY4Jm4uZmxhZ3Mpe3ZhciBhPUluKHQsbi5wYXJlbnQubm9kZUluZGV4KS5jb21wb25lbnRWaWV3OzImYS5kZWYuZmxhZ3MmJihhLnN0YXRlfD04KX1pZihlLmluc3RhbmNlW24uYmluZGluZ3Nbcl0ubmFtZV09aSw1MjQyODgmbi5mbGFncyl7bz1vfHx7fTt2YXIgcz1UZS51bndyYXAodC5vbGRWYWx1ZXNbbi5iaW5kaW5nSW5kZXgrcl0pO29bbi5iaW5kaW5nc1tyXS5ub25NaW5pZmllZE5hbWVdPW5ldyBJZShzLGksMCE9KDImdC5zdGF0ZSkpfXJldHVybiB0Lm9sZFZhbHVlc1tuLmJpbmRpbmdJbmRleCtyXT1pLG99ZnVuY3Rpb24geGkodCxlKXtpZih0LmRlZi5ub2RlRmxhZ3MmZSlmb3IodmFyIG49dC5kZWYubm9kZXMscj0wLGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIG89bltpXSxhPW8ucGFyZW50O2ZvcighYSYmby5mbGFncyZlJiZDaSh0LGksby5mbGFncyZlLHIrKyksMD09KG8uY2hpbGRGbGFncyZlKSYmKGkrPW8uY2hpbGRDb3VudCk7YSYmMSZhLmZsYWdzJiZpPT09YS5ub2RlSW5kZXgrYS5jaGlsZENvdW50OylhLmRpcmVjdENoaWxkRmxhZ3MmZSYmKHI9T2kodCxhLGUscikpLGE9YS5wYXJlbnR9fWZ1bmN0aW9uIE9pKHQsZSxuLHIpe2Zvcih2YXIgaT1lLm5vZGVJbmRleCsxO2k8PWUubm9kZUluZGV4K2UuY2hpbGRDb3VudDtpKyspe3ZhciBvPXQuZGVmLm5vZGVzW2ldO28uZmxhZ3MmbiYmQ2kodCxpLG8uZmxhZ3MmbixyKyspLGkrPW8uY2hpbGRDb3VudH1yZXR1cm4gcn1mdW5jdGlvbiBDaSh0LGUsbixyKXt2YXIgaT1Bbih0LGUpO2lmKGkpe3ZhciBvPWkuaW5zdGFuY2U7byYmKE1uLnNldEN1cnJlbnROb2RlKHQsZSksMTA0ODU3NiZuJiZrbih0LDUxMixyKSYmby5uZ0FmdGVyQ29udGVudEluaXQoKSwyMDk3MTUyJm4mJm8ubmdBZnRlckNvbnRlbnRDaGVja2VkKCksNDE5NDMwNCZuJiZrbih0LDc2OCxyKSYmby5uZ0FmdGVyVmlld0luaXQoKSw4Mzg4NjA4Jm4mJm8ubmdBZnRlclZpZXdDaGVja2VkKCksMTMxMDcyJm4mJm8ubmdPbkRlc3Ryb3koKSl9fWZ1bmN0aW9uIFNpKHQsZSxuKXt2YXIgcj1bXTtmb3IodmFyIGkgaW4gbilyLnB1c2goe3Byb3BOYW1lOmksYmluZGluZ1R5cGU6bltpXX0pO3JldHVybntub2RlSW5kZXg6LTEscGFyZW50Om51bGwscmVuZGVyUGFyZW50Om51bGwsYmluZGluZ0luZGV4Oi0xLG91dHB1dEluZGV4Oi0xLGNoZWNrSW5kZXg6LTEsZmxhZ3M6dCxjaGlsZEZsYWdzOjAsZGlyZWN0Q2hpbGRGbGFnczowLGNoaWxkTWF0Y2hlZFF1ZXJpZXM6MCxuZ0NvbnRlbnRJbmRleDotMSxtYXRjaGVkUXVlcmllczp7fSxtYXRjaGVkUXVlcnlJZHM6MCxyZWZlcmVuY2VzOnt9LGNoaWxkQ291bnQ6MCxiaW5kaW5nczpbXSxiaW5kaW5nRmxhZ3M6MCxvdXRwdXRzOltdLGVsZW1lbnQ6bnVsbCxwcm92aWRlcjpudWxsLHRleHQ6bnVsbCxxdWVyeTp7aWQ6ZSxmaWx0ZXJJZDpucihlKSxiaW5kaW5nczpyfSxuZ0NvbnRlbnQ6bnVsbH19ZnVuY3Rpb24gRWkodCl7Zm9yKHZhciBlPXQuZGVmLm5vZGVNYXRjaGVkUXVlcmllczt0LnBhcmVudCYmZXIodCk7KXt2YXIgbj10LnBhcmVudE5vZGVEZWY7dD10LnBhcmVudDtmb3IodmFyIHI9bi5ub2RlSW5kZXgrbi5jaGlsZENvdW50LGk9MDtpPD1yO2krKyk2NzEwODg2NCYobz10LmRlZi5ub2Rlc1tpXSkuZmxhZ3MmJjUzNjg3MDkxMiZvLmZsYWdzJiYoby5xdWVyeS5maWx0ZXJJZCZlKT09PW8ucXVlcnkuZmlsdGVySWQmJlBuKHQsaSkuc2V0RGlydHkoKSwhKDEmby5mbGFncyYmaStvLmNoaWxkQ291bnQ8bi5ub2RlSW5kZXgpJiY2NzEwODg2NCZvLmNoaWxkRmxhZ3MmJjUzNjg3MDkxMiZvLmNoaWxkRmxhZ3N8fChpKz1vLmNoaWxkQ291bnQpfWlmKDEzNDIxNzcyOCZ0LmRlZi5ub2RlRmxhZ3MpZm9yKGk9MDtpPHQuZGVmLm5vZGVzLmxlbmd0aDtpKyspe3ZhciBvOzEzNDIxNzcyOCYobz10LmRlZi5ub2Rlc1tpXSkuZmxhZ3MmJjUzNjg3MDkxMiZvLmZsYWdzJiZQbih0LGkpLnNldERpcnR5KCksaSs9by5jaGlsZENvdW50fX1mdW5jdGlvbiBraSh0LGUpe3ZhciBuPVBuKHQsZS5ub2RlSW5kZXgpO2lmKG4uZGlydHkpe3ZhciByLGk9dm9pZCAwO2lmKDY3MTA4ODY0JmUuZmxhZ3Mpe3ZhciBvPWUucGFyZW50LnBhcmVudDtpPVRpKHQsby5ub2RlSW5kZXgsby5ub2RlSW5kZXgrby5jaGlsZENvdW50LGUucXVlcnksW10pLHI9QW4odCxlLnBhcmVudC5ub2RlSW5kZXgpLmluc3RhbmNlfWVsc2UgMTM0MjE3NzI4JmUuZmxhZ3MmJihpPVRpKHQsMCx0LmRlZi5ub2Rlcy5sZW5ndGgtMSxlLnF1ZXJ5LFtdKSxyPXQuY29tcG9uZW50KTtuLnJlc2V0KGkpO2Zvcih2YXIgYT1lLnF1ZXJ5LmJpbmRpbmdzLHM9ITEsdT0wO3U8YS5sZW5ndGg7dSsrKXt2YXIgbD1hW3VdLGM9dm9pZCAwO3N3aXRjaChsLmJpbmRpbmdUeXBlKXtjYXNlIDA6Yz1uLmZpcnN0O2JyZWFrO2Nhc2UgMTpjPW4scz0hMH1yW2wucHJvcE5hbWVdPWN9cyYmbi5ub3RpZnlPbkNoYW5nZXMoKX19ZnVuY3Rpb24gVGkodCxlLG4scixpKXtmb3IodmFyIG89ZTtvPD1uO28rKyl7dmFyIGE9dC5kZWYubm9kZXNbb10scz1hLm1hdGNoZWRRdWVyaWVzW3IuaWRdO2lmKG51bGwhPXMmJmkucHVzaChJaSh0LGEscykpLDEmYS5mbGFncyYmYS5lbGVtZW50LnRlbXBsYXRlJiYoYS5lbGVtZW50LnRlbXBsYXRlLm5vZGVNYXRjaGVkUXVlcmllcyZyLmZpbHRlcklkKT09PXIuZmlsdGVySWQpe3ZhciB1PUluKHQsbyk7aWYoKGEuY2hpbGRNYXRjaGVkUXVlcmllcyZyLmZpbHRlcklkKT09PXIuZmlsdGVySWQmJihUaSh0LG8rMSxvK2EuY2hpbGRDb3VudCxyLGkpLG8rPWEuY2hpbGRDb3VudCksMTY3NzcyMTYmYS5mbGFncylmb3IodmFyIGw9dS52aWV3Q29udGFpbmVyLl9lbWJlZGRlZFZpZXdzLGM9MDtjPGwubGVuZ3RoO2MrKyl7dmFyIGY9bFtjXSxoPVhuKGYpO2gmJmg9PT11JiZUaShmLDAsZi5kZWYubm9kZXMubGVuZ3RoLTEscixpKX12YXIgZD11LnRlbXBsYXRlLl9wcm9qZWN0ZWRWaWV3cztpZihkKWZvcihjPTA7YzxkLmxlbmd0aDtjKyspe3ZhciBwPWRbY107VGkocCwwLHAuZGVmLm5vZGVzLmxlbmd0aC0xLHIsaSl9fShhLmNoaWxkTWF0Y2hlZFF1ZXJpZXMmci5maWx0ZXJJZCkhPT1yLmZpbHRlcklkJiYobys9YS5jaGlsZENvdW50KX1yZXR1cm4gaX1mdW5jdGlvbiBJaSh0LGUsbil7aWYobnVsbCE9bilzd2l0Y2gobil7Y2FzZSAxOnJldHVybiBJbih0LGUubm9kZUluZGV4KS5yZW5kZXJFbGVtZW50O2Nhc2UgMDpyZXR1cm4gbmV3IGNlKEluKHQsZS5ub2RlSW5kZXgpLnJlbmRlckVsZW1lbnQpO2Nhc2UgMjpyZXR1cm4gSW4odCxlLm5vZGVJbmRleCkudGVtcGxhdGU7Y2FzZSAzOnJldHVybiBJbih0LGUubm9kZUluZGV4KS52aWV3Q29udGFpbmVyO2Nhc2UgNDpyZXR1cm4gQW4odCxlLm5vZGVJbmRleCkuaW5zdGFuY2V9fWZ1bmN0aW9uIEFpKHQsZSl7cmV0dXJue25vZGVJbmRleDotMSxwYXJlbnQ6bnVsbCxyZW5kZXJQYXJlbnQ6bnVsbCxiaW5kaW5nSW5kZXg6LTEsb3V0cHV0SW5kZXg6LTEsY2hlY2tJbmRleDotMSxmbGFnczo4LGNoaWxkRmxhZ3M6MCxkaXJlY3RDaGlsZEZsYWdzOjAsY2hpbGRNYXRjaGVkUXVlcmllczowLG1hdGNoZWRRdWVyaWVzOnt9LG1hdGNoZWRRdWVyeUlkczowLHJlZmVyZW5jZXM6e30sbmdDb250ZW50SW5kZXg6dCxjaGlsZENvdW50OjAsYmluZGluZ3M6W10sYmluZGluZ0ZsYWdzOjAsb3V0cHV0czpbXSxlbGVtZW50Om51bGwscHJvdmlkZXI6bnVsbCx0ZXh0Om51bGwscXVlcnk6bnVsbCxuZ0NvbnRlbnQ6e2luZGV4OmV9fX1mdW5jdGlvbiBqaSh0LGUsbil7dmFyIHI9b3IodCxlLG4pO3ImJmNyKHQsbi5uZ0NvbnRlbnQuaW5kZXgsMSxyLG51bGwsdm9pZCAwKX1mdW5jdGlvbiBQaSh0LGUpe3JldHVybiBSaSgxMjgsdCxuZXcgQXJyYXkoZSsxKSl9ZnVuY3Rpb24gTWkodCxlKXtyZXR1cm4gUmkoMzIsdCxuZXcgQXJyYXkoZSkpfWZ1bmN0aW9uIE5pKHQsZSl7Zm9yKHZhciBuPU9iamVjdC5rZXlzKGUpLHI9bi5sZW5ndGgsaT1uZXcgQXJyYXkociksbz0wO288cjtvKyspe3ZhciBhPW5bb107aVtlW2FdXT1hfXJldHVybiBSaSg2NCx0LGkpfWZ1bmN0aW9uIFJpKHQsZSxuKXtmb3IodmFyIHI9bmV3IEFycmF5KG4ubGVuZ3RoKSxpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciBvPW5baV07cltpXT17ZmxhZ3M6OCxuYW1lOm8sbnM6bnVsbCxub25NaW5pZmllZE5hbWU6byxzZWN1cml0eUNvbnRleHQ6bnVsbCxzdWZmaXg6bnVsbH19cmV0dXJue25vZGVJbmRleDotMSxwYXJlbnQ6bnVsbCxyZW5kZXJQYXJlbnQ6bnVsbCxiaW5kaW5nSW5kZXg6LTEsb3V0cHV0SW5kZXg6LTEsY2hlY2tJbmRleDplLGZsYWdzOnQsY2hpbGRGbGFnczowLGRpcmVjdENoaWxkRmxhZ3M6MCxjaGlsZE1hdGNoZWRRdWVyaWVzOjAsbWF0Y2hlZFF1ZXJpZXM6e30sbWF0Y2hlZFF1ZXJ5SWRzOjAscmVmZXJlbmNlczp7fSxuZ0NvbnRlbnRJbmRleDotMSxjaGlsZENvdW50OjAsYmluZGluZ3M6cixiaW5kaW5nRmxhZ3M6bXIociksb3V0cHV0czpbXSxlbGVtZW50Om51bGwscHJvdmlkZXI6bnVsbCx0ZXh0Om51bGwscXVlcnk6bnVsbCxuZ0NvbnRlbnQ6bnVsbH19ZnVuY3Rpb24gRGkodCxlLG4pe2Zvcih2YXIgcj1uZXcgQXJyYXkobi5sZW5ndGgtMSksaT0xO2k8bi5sZW5ndGg7aSsrKXJbaS0xXT17ZmxhZ3M6OCxuYW1lOm51bGwsbnM6bnVsbCxub25NaW5pZmllZE5hbWU6bnVsbCxzZWN1cml0eUNvbnRleHQ6bnVsbCxzdWZmaXg6bltpXX07cmV0dXJue25vZGVJbmRleDotMSxwYXJlbnQ6bnVsbCxyZW5kZXJQYXJlbnQ6bnVsbCxiaW5kaW5nSW5kZXg6LTEsb3V0cHV0SW5kZXg6LTEsY2hlY2tJbmRleDp0LGZsYWdzOjIsY2hpbGRGbGFnczowLGRpcmVjdENoaWxkRmxhZ3M6MCxjaGlsZE1hdGNoZWRRdWVyaWVzOjAsbWF0Y2hlZFF1ZXJpZXM6e30sbWF0Y2hlZFF1ZXJ5SWRzOjAscmVmZXJlbmNlczp7fSxuZ0NvbnRlbnRJbmRleDplLGNoaWxkQ291bnQ6MCxiaW5kaW5nczpyLGJpbmRpbmdGbGFnczo4LG91dHB1dHM6W10sZWxlbWVudDpudWxsLHByb3ZpZGVyOm51bGwsdGV4dDp7cHJlZml4Om5bMF19LHF1ZXJ5Om51bGwsbmdDb250ZW50Om51bGx9fWZ1bmN0aW9uIExpKHQsZSxuKXt2YXIgcixpPXQucmVuZGVyZXI7cj1pLmNyZWF0ZVRleHQobi50ZXh0LnByZWZpeCk7dmFyIG89b3IodCxlLG4pO3JldHVybiBvJiZpLmFwcGVuZENoaWxkKG8scikse3JlbmRlclRleHQ6cn19ZnVuY3Rpb24gRmkodCxlKXtyZXR1cm4obnVsbCE9dD90LnRvU3RyaW5nKCk6IiIpK2Uuc3VmZml4fWZ1bmN0aW9uIFZpKHQsZSxuLHIpe2Zvcih2YXIgaT0wLG89MCxhPTAscz0wLHU9MCxsPW51bGwsYz1udWxsLGY9ITEsaD0hMSxkPW51bGwscD0wO3A8ZS5sZW5ndGg7cCsrKXt2YXIgbT1lW3BdO2lmKG0ubm9kZUluZGV4PXAsbS5wYXJlbnQ9bCxtLmJpbmRpbmdJbmRleD1pLG0ub3V0cHV0SW5kZXg9byxtLnJlbmRlclBhcmVudD1jLGF8PW0uZmxhZ3MsdXw9bS5tYXRjaGVkUXVlcnlJZHMsbS5lbGVtZW50KXt2YXIgeT1tLmVsZW1lbnQ7eS5wdWJsaWNQcm92aWRlcnM9bD9sLmVsZW1lbnQucHVibGljUHJvdmlkZXJzOk9iamVjdC5jcmVhdGUobnVsbCkseS5hbGxQcm92aWRlcnM9eS5wdWJsaWNQcm92aWRlcnMsZj0hMSxoPSExLG0uZWxlbWVudC50ZW1wbGF0ZSYmKHV8PW0uZWxlbWVudC50ZW1wbGF0ZS5ub2RlTWF0Y2hlZFF1ZXJpZXMpfWlmKHppKGwsbSxlLmxlbmd0aCksaSs9bS5iaW5kaW5ncy5sZW5ndGgsbys9bS5vdXRwdXRzLmxlbmd0aCwhYyYmMyZtLmZsYWdzJiYoZD1tKSwyMDIyNCZtLmZsYWdzKXtmfHwoZj0hMCxsLmVsZW1lbnQucHVibGljUHJvdmlkZXJzPU9iamVjdC5jcmVhdGUobC5lbGVtZW50LnB1YmxpY1Byb3ZpZGVycyksbC5lbGVtZW50LmFsbFByb3ZpZGVycz1sLmVsZW1lbnQucHVibGljUHJvdmlkZXJzKTt2YXIgZz0wIT0oMzI3NjgmbS5mbGFncyk7MD09KDgxOTImbS5mbGFncyl8fGc/bC5lbGVtZW50LnB1YmxpY1Byb3ZpZGVyc1tWbihtLnByb3ZpZGVyLnRva2VuKV09bTooaHx8KGg9ITAsbC5lbGVtZW50LmFsbFByb3ZpZGVycz1PYmplY3QuY3JlYXRlKGwuZWxlbWVudC5wdWJsaWNQcm92aWRlcnMpKSxsLmVsZW1lbnQuYWxsUHJvdmlkZXJzW1ZuKG0ucHJvdmlkZXIudG9rZW4pXT1tKSxnJiYobC5lbGVtZW50LmNvbXBvbmVudFByb3ZpZGVyPW0pfWlmKGw/KGwuY2hpbGRGbGFnc3w9bS5mbGFncyxsLmRpcmVjdENoaWxkRmxhZ3N8PW0uZmxhZ3MsbC5jaGlsZE1hdGNoZWRRdWVyaWVzfD1tLm1hdGNoZWRRdWVyeUlkcyxtLmVsZW1lbnQmJm0uZWxlbWVudC50ZW1wbGF0ZSYmKGwuY2hpbGRNYXRjaGVkUXVlcmllc3w9bS5lbGVtZW50LnRlbXBsYXRlLm5vZGVNYXRjaGVkUXVlcmllcykpOnN8PW0uZmxhZ3MsbS5jaGlsZENvdW50PjApbD1tLFVpKG0pfHwoYz1tKTtlbHNlIGZvcig7bCYmcD09PWwubm9kZUluZGV4K2wuY2hpbGRDb3VudDspe3ZhciB2PWwucGFyZW50O3YmJih2LmNoaWxkRmxhZ3N8PWwuY2hpbGRGbGFncyx2LmNoaWxkTWF0Y2hlZFF1ZXJpZXN8PWwuY2hpbGRNYXRjaGVkUXVlcmllcyksYz0obD12KSYmVWkobCk/bC5yZW5kZXJQYXJlbnQ6bH19cmV0dXJue2ZhY3Rvcnk6bnVsbCxub2RlRmxhZ3M6YSxyb290Tm9kZUZsYWdzOnMsbm9kZU1hdGNoZWRRdWVyaWVzOnUsZmxhZ3M6dCxub2RlczplLHVwZGF0ZURpcmVjdGl2ZXM6bnx8TG4sdXBkYXRlUmVuZGVyZXI6cnx8TG4saGFuZGxlRXZlbnQ6ZnVuY3Rpb24odCxuLHIsaSl7cmV0dXJuIGVbbl0uZWxlbWVudC5oYW5kbGVFdmVudCh0LHIsaSl9LGJpbmRpbmdDb3VudDppLG91dHB1dENvdW50Om8sbGFzdFJlbmRlclJvb3ROb2RlOmR9fWZ1bmN0aW9uIFVpKHQpe3JldHVybiAwIT0oMSZ0LmZsYWdzKSYmbnVsbD09PXQuZWxlbWVudC5uYW1lfWZ1bmN0aW9uIHppKHQsZSxuKXt2YXIgcj1lLmVsZW1lbnQmJmUuZWxlbWVudC50ZW1wbGF0ZTtpZihyKXtpZighci5sYXN0UmVuZGVyUm9vdE5vZGUpdGhyb3cgbmV3IEVycm9yKCJJbGxlZ2FsIFN0YXRlOiBFbWJlZGRlZCB0ZW1wbGF0ZXMgd2l0aG91dCBub2RlcyBhcmUgbm90IGFsbG93ZWQhIik7aWYoci5sYXN0UmVuZGVyUm9vdE5vZGUmJjE2Nzc3MjE2JnIubGFzdFJlbmRlclJvb3ROb2RlLmZsYWdzKXRocm93IG5ldyBFcnJvcigiSWxsZWdhbCBTdGF0ZTogTGFzdCByb290IG5vZGUgb2YgYSB0ZW1wbGF0ZSBjYW4ndCBoYXZlIGVtYmVkZGVkIHZpZXdzLCBhdCBpbmRleCAiK2Uubm9kZUluZGV4KyIhIil9aWYoMjAyMjQmZS5mbGFncyYmMD09KDEmKHQ/dC5mbGFnczowKSkpdGhyb3cgbmV3IEVycm9yKCJJbGxlZ2FsIFN0YXRlOiBTdGF0aWNQcm92aWRlci9EaXJlY3RpdmUgbm9kZXMgbmVlZCB0byBiZSBjaGlsZHJlbiBvZiBlbGVtZW50cyBvciBhbmNob3JzLCBhdCBpbmRleCAiK2Uubm9kZUluZGV4KyIhIik7aWYoZS5xdWVyeSl7aWYoNjcxMDg4NjQmZS5mbGFncyYmKCF0fHwwPT0oMTYzODQmdC5mbGFncykpKXRocm93IG5ldyBFcnJvcigiSWxsZWdhbCBTdGF0ZTogQ29udGVudCBRdWVyeSBub2RlcyBuZWVkIHRvIGJlIGNoaWxkcmVuIG9mIGRpcmVjdGl2ZXMsIGF0IGluZGV4ICIrZS5ub2RlSW5kZXgrIiEiKTtpZigxMzQyMTc3MjgmZS5mbGFncyYmdCl0aHJvdyBuZXcgRXJyb3IoIklsbGVnYWwgU3RhdGU6IFZpZXcgUXVlcnkgbm9kZXMgaGF2ZSB0byBiZSB0b3AgbGV2ZWwgbm9kZXMsIGF0IGluZGV4ICIrZS5ub2RlSW5kZXgrIiEiKX1pZihlLmNoaWxkQ291bnQpe3ZhciBpPXQ/dC5ub2RlSW5kZXgrdC5jaGlsZENvdW50Om4tMTtpZihlLm5vZGVJbmRleDw9aSYmZS5ub2RlSW5kZXgrZS5jaGlsZENvdW50PmkpdGhyb3cgbmV3IEVycm9yKCJJbGxlZ2FsIFN0YXRlOiBjaGlsZENvdW50IG9mIG5vZGUgbGVhZHMgb3V0c2lkZSBvZiBwYXJlbnQsIGF0IGluZGV4ICIrZS5ub2RlSW5kZXgrIiEiKX19ZnVuY3Rpb24gQmkodCxlLG4scil7dmFyIGk9cWkodC5yb290LHQucmVuZGVyZXIsdCxlLG4pO3JldHVybiBZaShpLHQuY29tcG9uZW50LHIpLEdpKGkpLGl9ZnVuY3Rpb24gSGkodCxlLG4pe3ZhciByPXFpKHQsdC5yZW5kZXJlcixudWxsLG51bGwsZSk7cmV0dXJuIFlpKHIsbixuKSxHaShyKSxyfWZ1bmN0aW9uIFdpKHQsZSxuLHIpe3ZhciBpLG89ZS5lbGVtZW50LmNvbXBvbmVudFJlbmRlcmVyVHlwZTtyZXR1cm4gaT1vP3Qucm9vdC5yZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIocixvKTp0LnJvb3QucmVuZGVyZXIscWkodC5yb290LGksdCxlLmVsZW1lbnQuY29tcG9uZW50UHJvdmlkZXIsbil9ZnVuY3Rpb24gcWkodCxlLG4scixpKXt2YXIgbz1uZXcgQXJyYXkoaS5ub2Rlcy5sZW5ndGgpLGE9aS5vdXRwdXRDb3VudD9uZXcgQXJyYXkoaS5vdXRwdXRDb3VudCk6bnVsbDtyZXR1cm57ZGVmOmkscGFyZW50Om4sdmlld0NvbnRhaW5lclBhcmVudDpudWxsLHBhcmVudE5vZGVEZWY6cixjb250ZXh0Om51bGwsY29tcG9uZW50Om51bGwsbm9kZXM6byxzdGF0ZToxMyxyb290OnQscmVuZGVyZXI6ZSxvbGRWYWx1ZXM6bmV3IEFycmF5KGkuYmluZGluZ0NvdW50KSxkaXNwb3NhYmxlczphLGluaXRJbmRleDotMX19ZnVuY3Rpb24gWWkodCxlLG4pe3QuY29tcG9uZW50PWUsdC5jb250ZXh0PW59ZnVuY3Rpb24gR2kodCl7dmFyIGU7dHIodCkmJihlPUluKHQucGFyZW50LHQucGFyZW50Tm9kZURlZi5wYXJlbnQubm9kZUluZGV4KS5yZW5kZXJFbGVtZW50KTtmb3IodmFyIG49dC5kZWYscj10Lm5vZGVzLGk9MDtpPG4ubm9kZXMubGVuZ3RoO2krKyl7dmFyIG89bi5ub2Rlc1tpXTtNbi5zZXRDdXJyZW50Tm9kZSh0LGkpO3ZhciBhPXZvaWQgMDtzd2l0Y2goMjAxMzQ3MDY3Jm8uZmxhZ3Mpe2Nhc2UgMTp2YXIgcz1fcih0LGUsbyksdT12b2lkIDA7aWYoMzM1NTQ0MzImby5mbGFncyl7dmFyIGw9c3Ioby5lbGVtZW50LmNvbXBvbmVudFZpZXcpO3U9TW4uY3JlYXRlQ29tcG9uZW50Vmlldyh0LG8sbCxzKX13cih0LHUsbyxzKSxhPXtyZW5kZXJFbGVtZW50OnMsY29tcG9uZW50Vmlldzp1LHZpZXdDb250YWluZXI6bnVsbCx0ZW1wbGF0ZTpvLmVsZW1lbnQudGVtcGxhdGU/cXIodCxvKTp2b2lkIDB9LDE2Nzc3MjE2Jm8uZmxhZ3MmJihhLnZpZXdDb250YWluZXI9enIodCxvLGEpKTticmVhaztjYXNlIDI6YT1MaSh0LGUsbyk7YnJlYWs7Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDI1NjooYT1yW2ldKXx8NDA5NiZvLmZsYWdzfHwoYT17aW5zdGFuY2U6aGkodCxvKX0pO2JyZWFrO2Nhc2UgMTY6YT17aW5zdGFuY2U6ZGkodCxvKX07YnJlYWs7Y2FzZSAxNjM4NDooYT1yW2ldKXx8KGE9e2luc3RhbmNlOnBpKHQsbyl9KSwzMjc2OCZvLmZsYWdzJiZZaShJbih0LG8ucGFyZW50Lm5vZGVJbmRleCkuY29tcG9uZW50VmlldyxhLmluc3RhbmNlLGEuaW5zdGFuY2UpO2JyZWFrO2Nhc2UgMzI6Y2FzZSA2NDpjYXNlIDEyODphPXt2YWx1ZTp2b2lkIDB9O2JyZWFrO2Nhc2UgNjcxMDg4NjQ6Y2FzZSAxMzQyMTc3Mjg6YT1uZXcgaGU7YnJlYWs7Y2FzZSA4OmppKHQsZSxvKSxhPXZvaWQgMH1yW2ldPWF9bm8odCxlby5DcmVhdGVWaWV3Tm9kZXMpLGFvKHQsMjAxMzI2NTkyLDI2ODQzNTQ1NiwwKX1mdW5jdGlvbiBRaSh0KXtYaSh0KSxNbi51cGRhdGVEaXJlY3RpdmVzKHQsMSkscm8odCxlby5DaGVja05vQ2hhbmdlcyksTW4udXBkYXRlUmVuZGVyZXIodCwxKSxubyh0LGVvLkNoZWNrTm9DaGFuZ2VzKSx0LnN0YXRlJj0tOTd9ZnVuY3Rpb24gS2kodCl7MSZ0LnN0YXRlPyh0LnN0YXRlJj0tMix0LnN0YXRlfD0yKTp0LnN0YXRlJj0tMyxFbih0LDAsMjU2KSxYaSh0KSxNbi51cGRhdGVEaXJlY3RpdmVzKHQsMCkscm8odCxlby5DaGVja0FuZFVwZGF0ZSksYW8odCw2NzEwODg2NCw1MzY4NzA5MTIsMCk7dmFyIGU9RW4odCwyNTYsNTEyKTt4aSh0LDIwOTcxNTJ8KGU/MTA0ODU3NjowKSksTW4udXBkYXRlUmVuZGVyZXIodCwwKSxubyh0LGVvLkNoZWNrQW5kVXBkYXRlKSxhbyh0LDEzNDIxNzcyOCw1MzY4NzA5MTIsMCkseGkodCw4Mzg4NjA4fCgoZT1Fbih0LDUxMiw3NjgpKT80MTk0MzA0OjApKSwyJnQuZGVmLmZsYWdzJiYodC5zdGF0ZSY9LTkpLHQuc3RhdGUmPS05NyxFbih0LDc2OCwxMDI0KX1mdW5jdGlvbiBaaSh0LGUsbixpLG8sYSxzLHUsbCxjLGYsaCxkKXtyZXR1cm4gMD09PW4/ZnVuY3Rpb24odCxlLG4scixpLG8sYSxzLHUsbCxjLGYpe3N3aXRjaCgyMDEzNDcwNjcmZS5mbGFncyl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbih0LGUsbixyLGksbyxhLHMsdSxsLGMsZil7dmFyIGg9ZS5iaW5kaW5ncy5sZW5ndGgsZD0hMTtyZXR1cm4gaD4wJiZPcih0LGUsMCxuKSYmKGQ9ITApLGg+MSYmT3IodCxlLDEscikmJihkPSEwKSxoPjImJk9yKHQsZSwyLGkpJiYoZD0hMCksaD4zJiZPcih0LGUsMyxvKSYmKGQ9ITApLGg+NCYmT3IodCxlLDQsYSkmJihkPSEwKSxoPjUmJk9yKHQsZSw1LHMpJiYoZD0hMCksaD42JiZPcih0LGUsNix1KSYmKGQ9ITApLGg+NyYmT3IodCxlLDcsbCkmJihkPSEwKSxoPjgmJk9yKHQsZSw4LGMpJiYoZD0hMCksaD45JiZPcih0LGUsOSxmKSYmKGQ9ITApLGR9KHQsZSxuLHIsaSxvLGEscyx1LGwsYyxmKTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLHIsaSxvLGEscyx1LGwsYyxmKXt2YXIgaD0hMSxkPWUuYmluZGluZ3MscD1kLmxlbmd0aDtpZihwPjAmJlluKHQsZSwwLG4pJiYoaD0hMCkscD4xJiZZbih0LGUsMSxyKSYmKGg9ITApLHA+MiYmWW4odCxlLDIsaSkmJihoPSEwKSxwPjMmJlluKHQsZSwzLG8pJiYoaD0hMCkscD40JiZZbih0LGUsNCxhKSYmKGg9ITApLHA+NSYmWW4odCxlLDUscykmJihoPSEwKSxwPjYmJlluKHQsZSw2LHUpJiYoaD0hMCkscD43JiZZbih0LGUsNyxsKSYmKGg9ITApLHA+OCYmWW4odCxlLDgsYykmJihoPSEwKSxwPjkmJlluKHQsZSw5LGYpJiYoaD0hMCksaCl7dmFyIG09ZS50ZXh0LnByZWZpeDtwPjAmJihtKz1GaShuLGRbMF0pKSxwPjEmJihtKz1GaShyLGRbMV0pKSxwPjImJihtKz1GaShpLGRbMl0pKSxwPjMmJihtKz1GaShvLGRbM10pKSxwPjQmJihtKz1GaShhLGRbNF0pKSxwPjUmJihtKz1GaShzLGRbNV0pKSxwPjYmJihtKz1GaSh1LGRbNl0pKSxwPjcmJihtKz1GaShsLGRbN10pKSxwPjgmJihtKz1GaShjLGRbOF0pKSxwPjkmJihtKz1GaShmLGRbOV0pKTt2YXIgeT1Ubih0LGUubm9kZUluZGV4KS5yZW5kZXJUZXh0O3QucmVuZGVyZXIuc2V0VmFsdWUoeSxtKX1yZXR1cm4gaH0odCxlLG4scixpLG8sYSxzLHUsbCxjLGYpO2Nhc2UgMTYzODQ6cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLHIsaSxvLGEscyx1LGwsYyxmKXt2YXIgaD1Bbih0LGUubm9kZUluZGV4KSxkPWguaW5zdGFuY2UscD0hMSxtPXZvaWQgMCx5PWUuYmluZGluZ3MubGVuZ3RoO3JldHVybiB5PjAmJnFuKHQsZSwwLG4pJiYocD0hMCxtPXdpKHQsaCxlLDAsbixtKSkseT4xJiZxbih0LGUsMSxyKSYmKHA9ITAsbT13aSh0LGgsZSwxLHIsbSkpLHk+MiYmcW4odCxlLDIsaSkmJihwPSEwLG09d2kodCxoLGUsMixpLG0pKSx5PjMmJnFuKHQsZSwzLG8pJiYocD0hMCxtPXdpKHQsaCxlLDMsbyxtKSkseT40JiZxbih0LGUsNCxhKSYmKHA9ITAsbT13aSh0LGgsZSw0LGEsbSkpLHk+NSYmcW4odCxlLDUscykmJihwPSEwLG09d2kodCxoLGUsNSxzLG0pKSx5PjYmJnFuKHQsZSw2LHUpJiYocD0hMCxtPXdpKHQsaCxlLDYsdSxtKSkseT43JiZxbih0LGUsNyxsKSYmKHA9ITAsbT13aSh0LGgsZSw3LGwsbSkpLHk+OCYmcW4odCxlLDgsYykmJihwPSEwLG09d2kodCxoLGUsOCxjLG0pKSx5PjkmJnFuKHQsZSw5LGYpJiYocD0hMCxtPXdpKHQsaCxlLDksZixtKSksbSYmZC5uZ09uQ2hhbmdlcyhtKSw2NTUzNiZlLmZsYWdzJiZrbih0LDI1NixlLm5vZGVJbmRleCkmJmQubmdPbkluaXQoKSwyNjIxNDQmZS5mbGFncyYmZC5uZ0RvQ2hlY2soKSxwfSh0LGUsbixyLGksbyxhLHMsdSxsLGMsZik7Y2FzZSAzMjpjYXNlIDY0OmNhc2UgMTI4OnJldHVybiBmdW5jdGlvbih0LGUsbixyLGksbyxhLHMsdSxsLGMsZil7dmFyIGg9ZS5iaW5kaW5ncyxkPSExLHA9aC5sZW5ndGg7aWYocD4wJiZZbih0LGUsMCxuKSYmKGQ9ITApLHA+MSYmWW4odCxlLDEscikmJihkPSEwKSxwPjImJlluKHQsZSwyLGkpJiYoZD0hMCkscD4zJiZZbih0LGUsMyxvKSYmKGQ9ITApLHA+NCYmWW4odCxlLDQsYSkmJihkPSEwKSxwPjUmJlluKHQsZSw1LHMpJiYoZD0hMCkscD42JiZZbih0LGUsNix1KSYmKGQ9ITApLHA+NyYmWW4odCxlLDcsbCkmJihkPSEwKSxwPjgmJlluKHQsZSw4LGMpJiYoZD0hMCkscD45JiZZbih0LGUsOSxmKSYmKGQ9ITApLGQpe3ZhciBtPWpuKHQsZS5ub2RlSW5kZXgpLHk9dm9pZCAwO3N3aXRjaCgyMDEzNDcwNjcmZS5mbGFncyl7Y2FzZSAzMjp5PW5ldyBBcnJheShoLmxlbmd0aCkscD4wJiYoeVswXT1uKSxwPjEmJih5WzFdPXIpLHA+MiYmKHlbMl09aSkscD4zJiYoeVszXT1vKSxwPjQmJih5WzRdPWEpLHA+NSYmKHlbNV09cykscD42JiYoeVs2XT11KSxwPjcmJih5WzddPWwpLHA+OCYmKHlbOF09YykscD45JiYoeVs5XT1mKTticmVhaztjYXNlIDY0Onk9e30scD4wJiYoeVtoWzBdLm5hbWVdPW4pLHA+MSYmKHlbaFsxXS5uYW1lXT1yKSxwPjImJih5W2hbMl0ubmFtZV09aSkscD4zJiYoeVtoWzNdLm5hbWVdPW8pLHA+NCYmKHlbaFs0XS5uYW1lXT1hKSxwPjUmJih5W2hbNV0ubmFtZV09cykscD42JiYoeVtoWzZdLm5hbWVdPXUpLHA+NyYmKHlbaFs3XS5uYW1lXT1sKSxwPjgmJih5W2hbOF0ubmFtZV09YykscD45JiYoeVtoWzldLm5hbWVdPWYpO2JyZWFrO2Nhc2UgMTI4OnZhciBnPW47c3dpdGNoKHApe2Nhc2UgMTp5PWcudHJhbnNmb3JtKG4pO2JyZWFrO2Nhc2UgMjp5PWcudHJhbnNmb3JtKHIpO2JyZWFrO2Nhc2UgMzp5PWcudHJhbnNmb3JtKHIsaSk7YnJlYWs7Y2FzZSA0Onk9Zy50cmFuc2Zvcm0ocixpLG8pO2JyZWFrO2Nhc2UgNTp5PWcudHJhbnNmb3JtKHIsaSxvLGEpO2JyZWFrO2Nhc2UgNjp5PWcudHJhbnNmb3JtKHIsaSxvLGEscyk7YnJlYWs7Y2FzZSA3Onk9Zy50cmFuc2Zvcm0ocixpLG8sYSxzLHUpO2JyZWFrO2Nhc2UgODp5PWcudHJhbnNmb3JtKHIsaSxvLGEscyx1LGwpO2JyZWFrO2Nhc2UgOTp5PWcudHJhbnNmb3JtKHIsaSxvLGEscyx1LGwsYyk7YnJlYWs7Y2FzZSAxMDp5PWcudHJhbnNmb3JtKHIsaSxvLGEscyx1LGwsYyxmKX19bS52YWx1ZT15fXJldHVybiBkfSh0LGUsbixyLGksbyxhLHMsdSxsLGMsZik7ZGVmYXVsdDp0aHJvdyJ1bnJlYWNoYWJsZSJ9fSh0LGUsaSxvLGEscyx1LGwsYyxmLGgsZCk6ZnVuY3Rpb24odCxlLG4pe3N3aXRjaCgyMDEzNDcwNjcmZS5mbGFncyl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPSExLGk9MDtpPG4ubGVuZ3RoO2krKylPcih0LGUsaSxuW2ldKSYmKHI9ITApO3JldHVybiByfSh0LGUsbik7Y2FzZSAyOnJldHVybiBmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPWUuYmluZGluZ3MsaT0hMSxvPTA7bzxuLmxlbmd0aDtvKyspWW4odCxlLG8sbltvXSkmJihpPSEwKTtpZihpKXt2YXIgYT0iIjtmb3Iobz0wO288bi5sZW5ndGg7bysrKWErPUZpKG5bb10scltvXSk7YT1lLnRleHQucHJlZml4K2E7dmFyIHM9VG4odCxlLm5vZGVJbmRleCkucmVuZGVyVGV4dDt0LnJlbmRlcmVyLnNldFZhbHVlKHMsYSl9cmV0dXJuIGl9KHQsZSxuKTtjYXNlIDE2Mzg0OnJldHVybiBmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPUFuKHQsZS5ub2RlSW5kZXgpLGk9ci5pbnN0YW5jZSxvPSExLGE9dm9pZCAwLHM9MDtzPG4ubGVuZ3RoO3MrKylxbih0LGUscyxuW3NdKSYmKG89ITAsYT13aSh0LHIsZSxzLG5bc10sYSkpO3JldHVybiBhJiZpLm5nT25DaGFuZ2VzKGEpLDY1NTM2JmUuZmxhZ3MmJmtuKHQsMjU2LGUubm9kZUluZGV4KSYmaS5uZ09uSW5pdCgpLDI2MjE0NCZlLmZsYWdzJiZpLm5nRG9DaGVjaygpLG99KHQsZSxuKTtjYXNlIDMyOmNhc2UgNjQ6Y2FzZSAxMjg6cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9ZS5iaW5kaW5ncyxvPSExLGE9MDthPG4ubGVuZ3RoO2ErKylZbih0LGUsYSxuW2FdKSYmKG89ITApO2lmKG8pe3ZhciBzPWpuKHQsZS5ub2RlSW5kZXgpLHU9dm9pZCAwO3N3aXRjaCgyMDEzNDcwNjcmZS5mbGFncyl7Y2FzZSAzMjp1PW47YnJlYWs7Y2FzZSA2NDpmb3IodT17fSxhPTA7YTxuLmxlbmd0aDthKyspdVtpW2FdLm5hbWVdPW5bYV07YnJlYWs7Y2FzZSAxMjg6dmFyIGw9blswXSxjPW4uc2xpY2UoMSk7dT1sLnRyYW5zZm9ybS5hcHBseShsLE9iamVjdChyLmQpKGMpKX1zLnZhbHVlPXV9cmV0dXJuIG99KHQsZSxuKTtkZWZhdWx0OnRocm93InVucmVhY2hhYmxlIn19KHQsZSxpKX1mdW5jdGlvbiBYaSh0KXt2YXIgZT10LmRlZjtpZig0JmUubm9kZUZsYWdzKWZvcih2YXIgbj0wO248ZS5ub2Rlcy5sZW5ndGg7bisrKXt2YXIgcj1lLm5vZGVzW25dO2lmKDQmci5mbGFncyl7dmFyIGk9SW4odCxuKS50ZW1wbGF0ZS5fcHJvamVjdGVkVmlld3M7aWYoaSlmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIGE9aVtvXTthLnN0YXRlfD0zMixLbihhLHQpfX1lbHNlIDA9PSg0JnIuY2hpbGRGbGFncykmJihuKz1yLmNoaWxkQ291bnQpfX1mdW5jdGlvbiAkaSh0LGUsbixyLGksbyxhLHMsdSxsLGMsZixoKXtyZXR1cm4gMD09PW4/ZnVuY3Rpb24odCxlLG4scixpLG8sYSxzLHUsbCxjLGYpe3ZhciBoPWUuYmluZGluZ3MubGVuZ3RoO2g+MCYmR24odCxlLDAsbiksaD4xJiZHbih0LGUsMSxyKSxoPjImJkduKHQsZSwyLGkpLGg+MyYmR24odCxlLDMsbyksaD40JiZHbih0LGUsNCxhKSxoPjUmJkduKHQsZSw1LHMpLGg+NiYmR24odCxlLDYsdSksaD43JiZHbih0LGUsNyxsKSxoPjgmJkduKHQsZSw4LGMpLGg+OSYmR24odCxlLDksZil9KHQsZSxyLGksbyxhLHMsdSxsLGMsZixoKTpmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspR24odCxlLHIsbltyXSl9KHQsZSxyKSwhMX1mdW5jdGlvbiBKaSh0LGUpe2lmKFBuKHQsZS5ub2RlSW5kZXgpLmRpcnR5KXRocm93IE5uKE1uLmNyZWF0ZURlYnVnQ29udGV4dCh0LGUubm9kZUluZGV4KSwiUXVlcnkgIitlLnF1ZXJ5LmlkKyIgbm90IGRpcnR5IiwiUXVlcnkgIitlLnF1ZXJ5LmlkKyIgZGlydHkiLDAhPSgxJnQuc3RhdGUpKX1mdW5jdGlvbiB0byh0KXtpZighKDEyOCZ0LnN0YXRlKSl7aWYocm8odCxlby5EZXN0cm95KSxubyh0LGVvLkRlc3Ryb3kpLHhpKHQsMTMxMDcyKSx0LmRpc3Bvc2FibGVzKWZvcih2YXIgZT0wO2U8dC5kaXNwb3NhYmxlcy5sZW5ndGg7ZSsrKXQuZGlzcG9zYWJsZXNbZV0oKTshZnVuY3Rpb24odCl7aWYoMTYmdC5zdGF0ZSl7dmFyIGU9WG4odCk7aWYoZSl7dmFyIG49ZS50ZW1wbGF0ZS5fcHJvamVjdGVkVmlld3M7biYmKERyKG4sbi5pbmRleE9mKHQpKSxNbi5kaXJ0eVBhcmVudFF1ZXJpZXModCkpfX19KHQpLHQucmVuZGVyZXIuZGVzdHJveU5vZGUmJmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LmRlZi5ub2Rlcy5sZW5ndGgsbj0wO248ZTtuKyspe3ZhciByPXQuZGVmLm5vZGVzW25dOzEmci5mbGFncz90LnJlbmRlcmVyLmRlc3Ryb3lOb2RlKEluKHQsbikucmVuZGVyRWxlbWVudCk6MiZyLmZsYWdzP3QucmVuZGVyZXIuZGVzdHJveU5vZGUoVG4odCxuKS5yZW5kZXJUZXh0KTooNjcxMDg4NjQmci5mbGFnc3x8MTM0MjE3NzI4JnIuZmxhZ3MpJiZQbih0LG4pLmRlc3Ryb3koKX19KHQpLHRyKHQpJiZ0LnJlbmRlcmVyLmRlc3Ryb3koKSx0LnN0YXRlfD0xMjh9fXZhciBlbz1mdW5jdGlvbih0KXtyZXR1cm4gdFt0LkNyZWF0ZVZpZXdOb2Rlcz0wXT0iQ3JlYXRlVmlld05vZGVzIix0W3QuQ2hlY2tOb0NoYW5nZXM9MV09IkNoZWNrTm9DaGFuZ2VzIix0W3QuQ2hlY2tOb0NoYW5nZXNQcm9qZWN0ZWRWaWV3cz0yXT0iQ2hlY2tOb0NoYW5nZXNQcm9qZWN0ZWRWaWV3cyIsdFt0LkNoZWNrQW5kVXBkYXRlPTNdPSJDaGVja0FuZFVwZGF0ZSIsdFt0LkNoZWNrQW5kVXBkYXRlUHJvamVjdGVkVmlld3M9NF09IkNoZWNrQW5kVXBkYXRlUHJvamVjdGVkVmlld3MiLHRbdC5EZXN0cm95PTVdPSJEZXN0cm95Iix0fSh7fSk7ZnVuY3Rpb24gbm8odCxlKXt2YXIgbj10LmRlZjtpZigzMzU1NDQzMiZuLm5vZGVGbGFncylmb3IodmFyIHI9MDtyPG4ubm9kZXMubGVuZ3RoO3IrKyl7dmFyIGk9bi5ub2Rlc1tyXTszMzU1NDQzMiZpLmZsYWdzP2lvKEluKHQscikuY29tcG9uZW50VmlldyxlKTowPT0oMzM1NTQ0MzImaS5jaGlsZEZsYWdzKSYmKHIrPWkuY2hpbGRDb3VudCl9fWZ1bmN0aW9uIHJvKHQsZSl7dmFyIG49dC5kZWY7aWYoMTY3NzcyMTYmbi5ub2RlRmxhZ3MpZm9yKHZhciByPTA7cjxuLm5vZGVzLmxlbmd0aDtyKyspe3ZhciBpPW4ubm9kZXNbcl07aWYoMTY3NzcyMTYmaS5mbGFncylmb3IodmFyIG89SW4odCxyKS52aWV3Q29udGFpbmVyLl9lbWJlZGRlZFZpZXdzLGE9MDthPG8ubGVuZ3RoO2ErKylpbyhvW2FdLGUpO2Vsc2UgMD09KDE2Nzc3MjE2JmkuY2hpbGRGbGFncykmJihyKz1pLmNoaWxkQ291bnQpfX1mdW5jdGlvbiBpbyh0LGUpe3ZhciBuPXQuc3RhdGU7c3dpdGNoKGUpe2Nhc2UgZW8uQ2hlY2tOb0NoYW5nZXM6MD09KDEyOCZuKSYmKDEyPT0oMTImbik/UWkodCk6NjQmbiYmb28odCxlby5DaGVja05vQ2hhbmdlc1Byb2plY3RlZFZpZXdzKSk7YnJlYWs7Y2FzZSBlby5DaGVja05vQ2hhbmdlc1Byb2plY3RlZFZpZXdzOjA9PSgxMjgmbikmJigzMiZuP1FpKHQpOjY0Jm4mJm9vKHQsZSkpO2JyZWFrO2Nhc2UgZW8uQ2hlY2tBbmRVcGRhdGU6MD09KDEyOCZuKSYmKDEyPT0oMTImbik/S2kodCk6NjQmbiYmb28odCxlby5DaGVja0FuZFVwZGF0ZVByb2plY3RlZFZpZXdzKSk7YnJlYWs7Y2FzZSBlby5DaGVja0FuZFVwZGF0ZVByb2plY3RlZFZpZXdzOjA9PSgxMjgmbikmJigzMiZuP0tpKHQpOjY0Jm4mJm9vKHQsZSkpO2JyZWFrO2Nhc2UgZW8uRGVzdHJveTp0byh0KTticmVhaztjYXNlIGVvLkNyZWF0ZVZpZXdOb2RlczpHaSh0KX19ZnVuY3Rpb24gb28odCxlKXtybyh0LGUpLG5vKHQsZSl9ZnVuY3Rpb24gYW8odCxlLG4scil7aWYodC5kZWYubm9kZUZsYWdzJmUmJnQuZGVmLm5vZGVGbGFncyZuKWZvcih2YXIgaT10LmRlZi5ub2Rlcy5sZW5ndGgsbz0wO288aTtvKyspe3ZhciBhPXQuZGVmLm5vZGVzW29dO2lmKGEuZmxhZ3MmZSYmYS5mbGFncyZuKXN3aXRjaChNbi5zZXRDdXJyZW50Tm9kZSh0LGEubm9kZUluZGV4KSxyKXtjYXNlIDA6a2kodCxhKTticmVhaztjYXNlIDE6SmkodCxhKX1hLmNoaWxkRmxhZ3MmZSYmYS5jaGlsZEZsYWdzJm58fChvKz1hLmNoaWxkQ291bnQpfX12YXIgc289ITE7ZnVuY3Rpb24gdW8odCxlLG4scixpLG8pe3JldHVybiBIaShjbyh0LGksaS5pbmplY3Rvci5nZXQodWUpLGUsbikscixvKX1mdW5jdGlvbiBsbyh0LGUsbixyLGksbyl7dmFyIGE9aS5pbmplY3Rvci5nZXQodWUpLHM9Y28odCxpLG5ldyBxbyhhKSxlLG4pLHU9d28ocik7cmV0dXJuIEhvKEFvLmNyZWF0ZSxIaSxudWxsLFtzLHUsb10pfWZ1bmN0aW9uIGNvKHQsZSxuLHIsaSl7dmFyIG89ZS5pbmplY3Rvci5nZXQoU24pLGE9ZS5pbmplY3Rvci5nZXQoYXQpO3JldHVybntuZ01vZHVsZTplLGluamVjdG9yOnQscHJvamVjdGFibGVOb2RlczpyLHNlbGVjdG9yT3JOb2RlOmksc2FuaXRpemVyOm8scmVuZGVyZXJGYWN0b3J5Om4scmVuZGVyZXI6bi5jcmVhdGVSZW5kZXJlcihudWxsLG51bGwpLGVycm9ySGFuZGxlcjphfX1mdW5jdGlvbiBmbyh0LGUsbixyKXt2YXIgaT13byhuKTtyZXR1cm4gSG8oQW8uY3JlYXRlLEJpLG51bGwsW3QsZSxpLHJdKX1mdW5jdGlvbiBobyh0LGUsbixyKXtyZXR1cm4gbj1nby5nZXQoZS5lbGVtZW50LmNvbXBvbmVudFByb3ZpZGVyLnByb3ZpZGVyLnRva2VuKXx8d28obiksSG8oQW8uY3JlYXRlLFdpLG51bGwsW3QsZSxuLHJdKX1mdW5jdGlvbiBwbyh0LGUsbixyKXtyZXR1cm4gJHIodCxlLG4sZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCl7dmFyIGU9ITEsbj0hMTtyZXR1cm4gMD09PW1vLnNpemU/e2hhc092ZXJyaWRlczplLGhhc0RlcHJlY2F0ZWRPdmVycmlkZXM6bn06KHQucHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIHI9bW8uZ2V0KHQudG9rZW4pOzM4NDAmdC5mbGFncyYmciYmKGU9ITAsbj1ufHxyLmRlcHJlY2F0ZWRCZWhhdmlvcil9KSx0Lm1vZHVsZXMuZm9yRWFjaChmdW5jdGlvbih0KXt5by5mb3JFYWNoKGZ1bmN0aW9uKHIsaSl7aS5uZ0luamVjdGFibGVEZWYucHJvdmlkZWRJbj09PXQmJihlPSEwLG49bnx8ci5kZXByZWNhdGVkQmVoYXZpb3IpfSl9KSx7aGFzT3ZlcnJpZGVzOmUsaGFzRGVwcmVjYXRlZE92ZXJyaWRlczpufSl9KHQpLG49ZS5oYXNEZXByZWNhdGVkT3ZlcnJpZGVzO3JldHVybiBlLmhhc092ZXJyaWRlcz8oZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0LnByb3ZpZGVycy5sZW5ndGg7ZSsrKXt2YXIgcj10LnByb3ZpZGVyc1tlXTtuJiYoci5mbGFnc3w9NDA5Nik7dmFyIGk9bW8uZ2V0KHIudG9rZW4pO2kmJihyLmZsYWdzPS0zODQxJnIuZmxhZ3N8aS5mbGFncyxyLmRlcHM9aXIoaS5kZXBzKSxyLnZhbHVlPWkudmFsdWUpfWlmKHlvLnNpemU+MCl7dmFyIG89bmV3IFNldCh0Lm1vZHVsZXMpO3lvLmZvckVhY2goZnVuY3Rpb24oZSxyKXtpZihvLmhhcyhyLm5nSW5qZWN0YWJsZURlZi5wcm92aWRlZEluKSl7dmFyIGk9e3Rva2VuOnIsZmxhZ3M6ZS5mbGFnc3wobj80MDk2OjApLGRlcHM6aXIoZS5kZXBzKSx2YWx1ZTplLnZhbHVlLGluZGV4OnQucHJvdmlkZXJzLmxlbmd0aH07dC5wcm92aWRlcnMucHVzaChpKSx0LnByb3ZpZGVyc0J5S2V5W1ZuKHIpXT1pfX0pfX0odD10LmZhY3RvcnkoZnVuY3Rpb24oKXtyZXR1cm4gTG59KSksdCk6dH0ocikpfXZhciBtbz1uZXcgTWFwLHlvPW5ldyBNYXAsZ289bmV3IE1hcDtmdW5jdGlvbiB2byh0KXttby5zZXQodC50b2tlbix0KSwiZnVuY3Rpb24iPT10eXBlb2YgdC50b2tlbiYmdC50b2tlbi5uZ0luamVjdGFibGVEZWYmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRva2VuLm5nSW5qZWN0YWJsZURlZi5wcm92aWRlZEluJiZ5by5zZXQodC50b2tlbix0KX1mdW5jdGlvbiBibyh0LGUpe3ZhciBuPXNyKHNyKGUudmlld0RlZkZhY3RvcnkpLm5vZGVzWzBdLmVsZW1lbnQuY29tcG9uZW50Vmlldyk7Z28uc2V0KHQsbil9ZnVuY3Rpb24gX28oKXttby5jbGVhcigpLHlvLmNsZWFyKCksZ28uY2xlYXIoKX1mdW5jdGlvbiB3byh0KXtpZigwPT09bW8uc2l6ZSlyZXR1cm4gdDt2YXIgZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj1udWxsLHI9MDtyPHQubm9kZXMubGVuZ3RoO3IrKyl7dmFyIGk9dC5ub2Rlc1tyXTsxJmkuZmxhZ3MmJihuPWkpLG4mJjM4NDAmaS5mbGFncyYmbW8uaGFzKGkucHJvdmlkZXIudG9rZW4pJiYoZS5wdXNoKG4ubm9kZUluZGV4KSxuPW51bGwpfXJldHVybiBlfSh0KTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHQ7dD10LmZhY3RvcnkoZnVuY3Rpb24oKXtyZXR1cm4gTG59KTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylyKHQsZVtuXSk7cmV0dXJuIHQ7ZnVuY3Rpb24gcih0LGUpe2Zvcih2YXIgbj1lKzE7bjx0Lm5vZGVzLmxlbmd0aDtuKyspe3ZhciByPXQubm9kZXNbbl07aWYoMSZyLmZsYWdzKXJldHVybjtpZigzODQwJnIuZmxhZ3Mpe3ZhciBpPXIucHJvdmlkZXIsbz1tby5nZXQoaS50b2tlbik7byYmKHIuZmxhZ3M9LTM4NDEmci5mbGFnc3xvLmZsYWdzLGkuZGVwcz1pcihvLmRlcHMpLGkudmFsdWU9by52YWx1ZSl9fX19ZnVuY3Rpb24geG8odCxlLG4scixpLG8sYSxzLHUsbCxjLGYsaCl7dmFyIGQ9dC5kZWYubm9kZXNbZV07cmV0dXJuIFppKHQsZCxuLHIsaSxvLGEscyx1LGwsYyxmLGgpLDIyNCZkLmZsYWdzP2puKHQsZSkudmFsdWU6dm9pZCAwfWZ1bmN0aW9uIE9vKHQsZSxuLHIsaSxvLGEscyx1LGwsYyxmLGgpe3ZhciBkPXQuZGVmLm5vZGVzW2VdO3JldHVybiAkaSh0LGQsbixyLGksbyxhLHMsdSxsLGMsZixoKSwyMjQmZC5mbGFncz9qbih0LGUpLnZhbHVlOnZvaWQgMH1mdW5jdGlvbiBDbyh0KXtyZXR1cm4gSG8oQW8uZGV0ZWN0Q2hhbmdlcyxLaSxudWxsLFt0XSl9ZnVuY3Rpb24gU28odCl7cmV0dXJuIEhvKEFvLmNoZWNrTm9DaGFuZ2VzLFFpLG51bGwsW3RdKX1mdW5jdGlvbiBFbyh0KXtyZXR1cm4gSG8oQW8uZGVzdHJveSx0byxudWxsLFt0XSl9dmFyIGtvLFRvLElvLEFvPWZ1bmN0aW9uKHQpe3JldHVybiB0W3QuY3JlYXRlPTBdPSJjcmVhdGUiLHRbdC5kZXRlY3RDaGFuZ2VzPTFdPSJkZXRlY3RDaGFuZ2VzIix0W3QuY2hlY2tOb0NoYW5nZXM9Ml09ImNoZWNrTm9DaGFuZ2VzIix0W3QuZGVzdHJveT0zXT0iZGVzdHJveSIsdFt0LmhhbmRsZUV2ZW50PTRdPSJoYW5kbGVFdmVudCIsdH0oe30pO2Z1bmN0aW9uIGpvKHQsZSl7VG89dCxJbz1lfWZ1bmN0aW9uIFBvKHQsZSxuLHIpe3JldHVybiBqbyh0LGUpLEhvKEFvLmhhbmRsZUV2ZW50LHQuZGVmLmhhbmRsZUV2ZW50LG51bGwsW3QsZSxuLHJdKX1mdW5jdGlvbiBNbyh0LGUpe2lmKDEyOCZ0LnN0YXRlKXRocm93IERuKEFvW2tvXSk7cmV0dXJuIGpvKHQsVm8odCwwKSksdC5kZWYudXBkYXRlRGlyZWN0aXZlcyhmdW5jdGlvbih0LG4scil7Zm9yKHZhciBpPVtdLG89MztvPGFyZ3VtZW50cy5sZW5ndGg7bysrKWlbby0zXT1hcmd1bWVudHNbb107dmFyIGE9dC5kZWYubm9kZXNbbl07cmV0dXJuIDA9PT1lP1JvKHQsYSxyLGkpOkRvKHQsYSxyLGkpLDE2Mzg0JmEuZmxhZ3MmJmpvKHQsVm8odCxuKSksMjI0JmEuZmxhZ3M/am4odCxhLm5vZGVJbmRleCkudmFsdWU6dm9pZCAwfSx0KX1mdW5jdGlvbiBObyh0LGUpe2lmKDEyOCZ0LnN0YXRlKXRocm93IERuKEFvW2tvXSk7cmV0dXJuIGpvKHQsVW8odCwwKSksdC5kZWYudXBkYXRlUmVuZGVyZXIoZnVuY3Rpb24odCxuLHIpe2Zvcih2YXIgaT1bXSxvPTM7bzxhcmd1bWVudHMubGVuZ3RoO28rKylpW28tM109YXJndW1lbnRzW29dO3ZhciBhPXQuZGVmLm5vZGVzW25dO3JldHVybiAwPT09ZT9Sbyh0LGEscixpKTpEbyh0LGEscixpKSwzJmEuZmxhZ3MmJmpvKHQsVW8odCxuKSksMjI0JmEuZmxhZ3M/am4odCxhLm5vZGVJbmRleCkudmFsdWU6dm9pZCAwfSx0KX1mdW5jdGlvbiBSbyh0LGUsbixpKXtpZihaaS5hcHBseSh2b2lkIDAsT2JqZWN0KHIuZCkoW3QsZSxuXSxpKSkpe3ZhciBvPTE9PT1uP2lbMF06aTtpZigxNjM4NCZlLmZsYWdzKXtmb3IodmFyIGE9e30scz0wO3M8ZS5iaW5kaW5ncy5sZW5ndGg7cysrKXt2YXIgdT1lLmJpbmRpbmdzW3NdLGw9b1tzXTs4JnUuZmxhZ3MmJihhWyhkPXUubm9uTWluaWZpZWROYW1lLCJuZy1yZWZsZWN0LSIrKGQ9ZC5yZXBsYWNlKC9bJEBdL2csIl8iKS5yZXBsYWNlKExvLGZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3JldHVybiItIit0WzFdLnRvTG93ZXJDYXNlKCl9KSkpXT1GbyhsKSl9dmFyIGM9ZS5wYXJlbnQsZj1Jbih0LGMubm9kZUluZGV4KS5yZW5kZXJFbGVtZW50O2lmKGMuZWxlbWVudC5uYW1lKWZvcih2YXIgaCBpbiBhKW51bGwhPShsPWFbaF0pP3QucmVuZGVyZXIuc2V0QXR0cmlidXRlKGYsaCxsKTp0LnJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZShmLGgpO2Vsc2UgdC5yZW5kZXJlci5zZXRWYWx1ZShmLCJiaW5kaW5ncz0iK0pTT04uc3RyaW5naWZ5KGEsbnVsbCwyKSl9fXZhciBkfWZ1bmN0aW9uIERvKHQsZSxuLGkpeyRpLmFwcGx5KHZvaWQgMCxPYmplY3Qoci5kKShbdCxlLG5dLGkpKX12YXIgTG89LyhbQS1aXSkvZztmdW5jdGlvbiBGbyh0KXt0cnl7cmV0dXJuIG51bGwhPXQ/dC50b1N0cmluZygpLnNsaWNlKDAsMzApOnR9Y2F0Y2godCl7cmV0dXJuIltFUlJPUl0gRXhjZXB0aW9uIHdoaWxlIHRyeWluZyB0byBzZXJpYWxpemUgdGhlIHZhbHVlIn19ZnVuY3Rpb24gVm8odCxlKXtmb3IodmFyIG49ZTtuPHQuZGVmLm5vZGVzLmxlbmd0aDtuKyspe3ZhciByPXQuZGVmLm5vZGVzW25dO2lmKDE2Mzg0JnIuZmxhZ3MmJnIuYmluZGluZ3MmJnIuYmluZGluZ3MubGVuZ3RoKXJldHVybiBufXJldHVybiBudWxsfWZ1bmN0aW9uIFVvKHQsZSl7Zm9yKHZhciBuPWU7bjx0LmRlZi5ub2Rlcy5sZW5ndGg7bisrKXt2YXIgcj10LmRlZi5ub2Rlc1tuXTtpZigzJnIuZmxhZ3MmJnIuYmluZGluZ3MmJnIuYmluZGluZ3MubGVuZ3RoKXJldHVybiBufXJldHVybiBudWxsfXZhciB6bz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLnZpZXc9dCx0aGlzLm5vZGVJbmRleD1lLG51bGw9PWUmJih0aGlzLm5vZGVJbmRleD1lPTApLHRoaXMubm9kZURlZj10LmRlZi5ub2Rlc1tlXTtmb3IodmFyIG49dGhpcy5ub2RlRGVmLHI9dDtuJiYwPT0oMSZuLmZsYWdzKTspbj1uLnBhcmVudDtpZighbilmb3IoOyFuJiZyOyluPSRuKHIpLHI9ci5wYXJlbnQ7dGhpcy5lbERlZj1uLHRoaXMuZWxWaWV3PXJ9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZWxPckNvbXBWaWV3Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEluKHRoaXMuZWxWaWV3LHRoaXMuZWxEZWYubm9kZUluZGV4KS5jb21wb25lbnRWaWV3fHx0aGlzLnZpZXd9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpbmplY3RvciIse2dldDpmdW5jdGlvbigpe3JldHVybiBHcih0aGlzLmVsVmlldyx0aGlzLmVsRGVmKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImNvbXBvbmVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsT3JDb21wVmlldy5jb21wb25lbnR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjb250ZXh0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxPckNvbXBWaWV3LmNvbnRleHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwcm92aWRlclRva2VucyIse2dldDpmdW5jdGlvbigpe3ZhciB0PVtdO2lmKHRoaXMuZWxEZWYpZm9yKHZhciBlPXRoaXMuZWxEZWYubm9kZUluZGV4KzE7ZTw9dGhpcy5lbERlZi5ub2RlSW5kZXgrdGhpcy5lbERlZi5jaGlsZENvdW50O2UrKyl7dmFyIG49dGhpcy5lbFZpZXcuZGVmLm5vZGVzW2VdOzIwMjI0Jm4uZmxhZ3MmJnQucHVzaChuLnByb3ZpZGVyLnRva2VuKSxlKz1uLmNoaWxkQ291bnR9cmV0dXJuIHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJyZWZlcmVuY2VzIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9e307aWYodGhpcy5lbERlZil7Qm8odGhpcy5lbFZpZXcsdGhpcy5lbERlZix0KTtmb3IodmFyIGU9dGhpcy5lbERlZi5ub2RlSW5kZXgrMTtlPD10aGlzLmVsRGVmLm5vZGVJbmRleCt0aGlzLmVsRGVmLmNoaWxkQ291bnQ7ZSsrKXt2YXIgbj10aGlzLmVsVmlldy5kZWYubm9kZXNbZV07MjAyMjQmbi5mbGFncyYmQm8odGhpcy5lbFZpZXcsbix0KSxlKz1uLmNoaWxkQ291bnR9fXJldHVybiB0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiY29tcG9uZW50UmVuZGVyRWxlbWVudCIse2dldDpmdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKHQpe2Zvcig7dCYmIXRyKHQpOyl0PXQucGFyZW50O3JldHVybiB0LnBhcmVudD9Jbih0LnBhcmVudCwkbih0KS5ub2RlSW5kZXgpOm51bGx9KHRoaXMuZWxPckNvbXBWaWV3KTtyZXR1cm4gdD90LnJlbmRlckVsZW1lbnQ6dm9pZCAwfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicmVuZGVyTm9kZSIse2dldDpmdW5jdGlvbigpe3JldHVybiAyJnRoaXMubm9kZURlZi5mbGFncz9Kbih0aGlzLnZpZXcsdGhpcy5ub2RlRGVmKTpKbih0aGlzLmVsVmlldyx0aGlzLmVsRGVmKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5sb2dFcnJvcj1mdW5jdGlvbih0KXtmb3IodmFyIGUsbixpPVtdLG89MTtvPGFyZ3VtZW50cy5sZW5ndGg7bysrKWlbby0xXT1hcmd1bWVudHNbb107MiZ0aGlzLm5vZGVEZWYuZmxhZ3M/KGU9dGhpcy52aWV3LmRlZixuPXRoaXMubm9kZURlZi5ub2RlSW5kZXgpOihlPXRoaXMuZWxWaWV3LmRlZixuPXRoaXMuZWxEZWYubm9kZUluZGV4KTt2YXIgYT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPTA7cjw9ZTtyKyspMyZ0Lm5vZGVzW3JdLmZsYWdzJiZuKys7cmV0dXJuIG59KGUsbikscz0tMTtlLmZhY3RvcnkoZnVuY3Rpb24oKXtyZXR1cm4rK3M9PT1hPyhlPXQuZXJyb3IpLmJpbmQuYXBwbHkoZSxPYmplY3Qoci5kKShbdF0saSkpOkxuO3ZhciBlfSksczxhJiYodC5lcnJvcigiSWxsZWdhbCBzdGF0ZTogdGhlIFZpZXdEZWZpbml0aW9uRmFjdG9yeSBkaWQgbm90IGNhbGwgdGhlIGxvZ2dlciEiKSx0LmVycm9yLmFwcGx5KHQsT2JqZWN0KHIuZCkoaSkpKX0sdH0oKTtmdW5jdGlvbiBCbyh0LGUsbil7Zm9yKHZhciByIGluIGUucmVmZXJlbmNlcyluW3JdPUlpKHQsZSxlLnJlZmVyZW5jZXNbcl0pfWZ1bmN0aW9uIEhvKHQsZSxuLHIpe3ZhciBpPWtvLG89VG8sYT1Jbzt0cnl7a289dDt2YXIgcz1lLmFwcGx5KG4scik7cmV0dXJuIFRvPW8sSW89YSxrbz1pLHN9Y2F0Y2godCl7aWYocnQodCl8fCFUbyl0aHJvdyB0O3Rocm93IGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBFcnJvcnx8KHQ9bmV3IEVycm9yKHQudG9TdHJpbmcoKSkpLFJuKHQsZSksdH0odCxXbygpKX19ZnVuY3Rpb24gV28oKXtyZXR1cm4gVG8/bmV3IHpvKFRvLElvKTpudWxsfXZhciBxbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5kZWxlZ2F0ZT10fXJldHVybiB0LnByb3RvdHlwZS5jcmVhdGVSZW5kZXJlcj1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgWW8odGhpcy5kZWxlZ2F0ZS5jcmVhdGVSZW5kZXJlcih0LGUpKX0sdC5wcm90b3R5cGUuYmVnaW49ZnVuY3Rpb24oKXt0aGlzLmRlbGVnYXRlLmJlZ2luJiZ0aGlzLmRlbGVnYXRlLmJlZ2luKCl9LHQucHJvdG90eXBlLmVuZD1mdW5jdGlvbigpe3RoaXMuZGVsZWdhdGUuZW5kJiZ0aGlzLmRlbGVnYXRlLmVuZCgpfSx0LnByb3RvdHlwZS53aGVuUmVuZGVyaW5nRG9uZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlbGVnYXRlLndoZW5SZW5kZXJpbmdEb25lP3RoaXMuZGVsZWdhdGUud2hlblJlbmRlcmluZ0RvbmUoKTpQcm9taXNlLnJlc29sdmUobnVsbCl9LHR9KCksWW89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuZGVsZWdhdGU9dCx0aGlzLmRhdGE9dGhpcy5kZWxlZ2F0ZS5kYXRhfXJldHVybiB0LnByb3RvdHlwZS5kZXN0cm95Tm9kZT1mdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Q2UuZGVsZXRlKHQubmF0aXZlTm9kZSl9KFNlKHQpKSx0aGlzLmRlbGVnYXRlLmRlc3Ryb3lOb2RlJiZ0aGlzLmRlbGVnYXRlLmRlc3Ryb3lOb2RlKHQpfSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5kZWxlZ2F0ZS5kZXN0cm95KCl9LHQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmRlbGVnYXRlLmNyZWF0ZUVsZW1lbnQodCxlKSxyPVdvKCk7aWYocil7dmFyIGk9bmV3IHdlKG4sbnVsbCxyKTtpLm5hbWU9dCxFZShpKX1yZXR1cm4gbn0sdC5wcm90b3R5cGUuY3JlYXRlQ29tbWVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmRlbGVnYXRlLmNyZWF0ZUNvbW1lbnQodCksbj1XbygpO3JldHVybiBuJiZFZShuZXcgX2UoZSxudWxsLG4pKSxlfSx0LnByb3RvdHlwZS5jcmVhdGVUZXh0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGVsZWdhdGUuY3JlYXRlVGV4dCh0KSxuPVdvKCk7cmV0dXJuIG4mJkVlKG5ldyBfZShlLG51bGwsbikpLGV9LHQucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKHQsZSl7dmFyIG49U2UodCkscj1TZShlKTtuJiZyJiZuIGluc3RhbmNlb2Ygd2UmJm4uYWRkQ2hpbGQociksdGhpcy5kZWxlZ2F0ZS5hcHBlbmRDaGlsZCh0LGUpfSx0LnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVNlKHQpLGk9U2UoZSksbz1TZShuKTtyJiZpJiZyIGluc3RhbmNlb2Ygd2UmJnIuaW5zZXJ0QmVmb3JlKG8saSksdGhpcy5kZWxlZ2F0ZS5pbnNlcnRCZWZvcmUodCxlLG4pfSx0LnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbih0LGUpe3ZhciBuPVNlKHQpLHI9U2UoZSk7biYmciYmbiBpbnN0YW5jZW9mIHdlJiZuLnJlbW92ZUNoaWxkKHIpLHRoaXMuZGVsZWdhdGUucmVtb3ZlQ2hpbGQodCxlKX0sdC5wcm90b3R5cGUuc2VsZWN0Um9vdEVsZW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kZWxlZ2F0ZS5zZWxlY3RSb290RWxlbWVudCh0KSxuPVdvKCk7cmV0dXJuIG4mJkVlKG5ldyB3ZShlLG51bGwsbikpLGV9LHQucHJvdG90eXBlLnNldEF0dHJpYnV0ZT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1TZSh0KTtpJiZpIGluc3RhbmNlb2Ygd2UmJihpLmF0dHJpYnV0ZXNbcj9yKyI6IitlOmVdPW4pLHRoaXMuZGVsZWdhdGUuc2V0QXR0cmlidXRlKHQsZSxuLHIpfSx0LnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVNlKHQpO3ImJnIgaW5zdGFuY2VvZiB3ZSYmKHIuYXR0cmlidXRlc1tuP24rIjoiK2U6ZV09bnVsbCksdGhpcy5kZWxlZ2F0ZS5yZW1vdmVBdHRyaWJ1dGUodCxlLG4pfSx0LnByb3RvdHlwZS5hZGRDbGFzcz1mdW5jdGlvbih0LGUpe3ZhciBuPVNlKHQpO24mJm4gaW5zdGFuY2VvZiB3ZSYmKG4uY2xhc3Nlc1tlXT0hMCksdGhpcy5kZWxlZ2F0ZS5hZGRDbGFzcyh0LGUpfSx0LnByb3RvdHlwZS5yZW1vdmVDbGFzcz1mdW5jdGlvbih0LGUpe3ZhciBuPVNlKHQpO24mJm4gaW5zdGFuY2VvZiB3ZSYmKG4uY2xhc3Nlc1tlXT0hMSksdGhpcy5kZWxlZ2F0ZS5yZW1vdmVDbGFzcyh0LGUpfSx0LnByb3RvdHlwZS5zZXRTdHlsZT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1TZSh0KTtpJiZpIGluc3RhbmNlb2Ygd2UmJihpLnN0eWxlc1tlXT1uKSx0aGlzLmRlbGVnYXRlLnNldFN0eWxlKHQsZSxuLHIpfSx0LnByb3RvdHlwZS5yZW1vdmVTdHlsZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9U2UodCk7ciYmciBpbnN0YW5jZW9mIHdlJiYoci5zdHlsZXNbZV09bnVsbCksdGhpcy5kZWxlZ2F0ZS5yZW1vdmVTdHlsZSh0LGUsbil9LHQucHJvdG90eXBlLnNldFByb3BlcnR5PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1TZSh0KTtyJiZyIGluc3RhbmNlb2Ygd2UmJihyLnByb3BlcnRpZXNbZV09biksdGhpcy5kZWxlZ2F0ZS5zZXRQcm9wZXJ0eSh0LGUsbil9LHQucHJvdG90eXBlLmxpc3Rlbj1mdW5jdGlvbih0LGUsbil7aWYoInN0cmluZyIhPXR5cGVvZiB0KXt2YXIgcj1TZSh0KTtyJiZyLmxpc3RlbmVycy5wdXNoKG5ldyBmdW5jdGlvbih0LGUpe3RoaXMubmFtZT10LHRoaXMuY2FsbGJhY2s9ZX0oZSxuKSl9cmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKHQsZSxuKX0sdC5wcm90b3R5cGUucGFyZW50Tm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5wYXJlbnROb2RlKHQpfSx0LnByb3RvdHlwZS5uZXh0U2libGluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5uZXh0U2libGluZyh0KX0sdC5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5zZXRWYWx1ZSh0LGUpfSx0fSgpO2Z1bmN0aW9uIEdvKHQsZSxuKXtyZXR1cm4gbmV3IFFvKHQsZSxuKX12YXIgUW89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scil7dmFyIGk9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBpLm1vZHVsZVR5cGU9ZSxpLl9ib290c3RyYXBDb21wb25lbnRzPW4saS5fbmdNb2R1bGVEZWZGYWN0b3J5PXIsaX1yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKCl7aWYoIXNvKXtzbz0hMDt2YXIgdD10ZSgpP3tzZXRDdXJyZW50Tm9kZTpqbyxjcmVhdGVSb290VmlldzpsbyxjcmVhdGVFbWJlZGRlZFZpZXc6Zm8sY3JlYXRlQ29tcG9uZW50VmlldzpobyxjcmVhdGVOZ01vZHVsZVJlZjpwbyxvdmVycmlkZVByb3ZpZGVyOnZvLG92ZXJyaWRlQ29tcG9uZW50VmlldzpibyxjbGVhck92ZXJyaWRlczpfbyxjaGVja0FuZFVwZGF0ZVZpZXc6Q28sY2hlY2tOb0NoYW5nZXNWaWV3OlNvLGRlc3Ryb3lWaWV3OkVvLGNyZWF0ZURlYnVnQ29udGV4dDpmdW5jdGlvbih0LGUpe3JldHVybiBuZXcgem8odCxlKX0saGFuZGxlRXZlbnQ6UG8sdXBkYXRlRGlyZWN0aXZlczpNbyx1cGRhdGVSZW5kZXJlcjpOb306e3NldEN1cnJlbnROb2RlOmZ1bmN0aW9uKCl7fSxjcmVhdGVSb290Vmlldzp1byxjcmVhdGVFbWJlZGRlZFZpZXc6QmksY3JlYXRlQ29tcG9uZW50VmlldzpXaSxjcmVhdGVOZ01vZHVsZVJlZjokcixvdmVycmlkZVByb3ZpZGVyOkxuLG92ZXJyaWRlQ29tcG9uZW50VmlldzpMbixjbGVhck92ZXJyaWRlczpMbixjaGVja0FuZFVwZGF0ZVZpZXc6S2ksY2hlY2tOb0NoYW5nZXNWaWV3OlFpLGRlc3Ryb3lWaWV3OnRvLGNyZWF0ZURlYnVnQ29udGV4dDpmdW5jdGlvbih0LGUpe3JldHVybiBuZXcgem8odCxlKX0saGFuZGxlRXZlbnQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHQuZGVmLmhhbmRsZUV2ZW50KHQsZSxuLHIpfSx1cGRhdGVEaXJlY3RpdmVzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZGVmLnVwZGF0ZURpcmVjdGl2ZXMoMD09PWU/eG86T28sdCl9LHVwZGF0ZVJlbmRlcmVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZGVmLnVwZGF0ZVJlbmRlcmVyKDA9PT1lP3hvOk9vLHQpfX07TW4uc2V0Q3VycmVudE5vZGU9dC5zZXRDdXJyZW50Tm9kZSxNbi5jcmVhdGVSb290Vmlldz10LmNyZWF0ZVJvb3RWaWV3LE1uLmNyZWF0ZUVtYmVkZGVkVmlldz10LmNyZWF0ZUVtYmVkZGVkVmlldyxNbi5jcmVhdGVDb21wb25lbnRWaWV3PXQuY3JlYXRlQ29tcG9uZW50VmlldyxNbi5jcmVhdGVOZ01vZHVsZVJlZj10LmNyZWF0ZU5nTW9kdWxlUmVmLE1uLm92ZXJyaWRlUHJvdmlkZXI9dC5vdmVycmlkZVByb3ZpZGVyLE1uLm92ZXJyaWRlQ29tcG9uZW50Vmlldz10Lm92ZXJyaWRlQ29tcG9uZW50VmlldyxNbi5jbGVhck92ZXJyaWRlcz10LmNsZWFyT3ZlcnJpZGVzLE1uLmNoZWNrQW5kVXBkYXRlVmlldz10LmNoZWNrQW5kVXBkYXRlVmlldyxNbi5jaGVja05vQ2hhbmdlc1ZpZXc9dC5jaGVja05vQ2hhbmdlc1ZpZXcsTW4uZGVzdHJveVZpZXc9dC5kZXN0cm95VmlldyxNbi5yZXNvbHZlRGVwPWJpLE1uLmNyZWF0ZURlYnVnQ29udGV4dD10LmNyZWF0ZURlYnVnQ29udGV4dCxNbi5oYW5kbGVFdmVudD10LmhhbmRsZUV2ZW50LE1uLnVwZGF0ZURpcmVjdGl2ZXM9dC51cGRhdGVEaXJlY3RpdmVzLE1uLnVwZGF0ZVJlbmRlcmVyPXQudXBkYXRlUmVuZGVyZXIsTW4uZGlydHlQYXJlbnRRdWVyaWVzPUVpfX0oKTt2YXIgZT1zcih0aGlzLl9uZ01vZHVsZURlZkZhY3RvcnkpO3JldHVybiBNbi5jcmVhdGVOZ01vZHVsZVJlZih0aGlzLm1vZHVsZVR5cGUsdHx8Ti5OVUxMLHRoaXMuX2Jvb3RzdHJhcENvbXBvbmVudHMsZSl9LGV9KFB0KTtmdW5jdGlvbiBLbyh0LGUsbil7dCE9ZSYmJG8obil9ZnVuY3Rpb24gWm8odCxlKXtudWxsIT10JiYkbyhlKX1mdW5jdGlvbiBYbyh0LGUpe251bGw9PXQmJiRvKGUpfWZ1bmN0aW9uICRvKHQpe3Rocm93IG5ldyBFcnJvcigiQVNTRVJUSU9OIEVSUk9SOiAiK3QpfWZ1bmN0aW9uIEpvKHQsZSxuLHIpe3ZhciBpPXI/ZTpuO2kmJmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKz0yKWVbbisxXS5jYWxsKHRbZVtuXV0pfSh0LGkpfSJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlJiYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cubmdEZXZNb2RlPSEwKSwidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJihzZWxmLm5nRGV2TW9kZT0hMCksInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWwmJihnbG9iYWwubmdEZXZNb2RlPSEwKSk7dmFyIHRhLGVhLG5hLHJhLGlhLG9hLGFhLHNhLHVhLGxhLGNhPSJfX25nSG9zdExOb2RlX18iLGZhPVByb21pc2UucmVzb2x2ZShudWxsKSxoYT1bMCwwXSxkYT1udWxsLHBhPSExO2Z1bmN0aW9uIG1hKHQsZSl7dmFyIG49ZGE7cmV0dXJuIHNhPXQmJnQuZGF0YSx1YT10JiZ0LmRpcmVjdGl2ZXMsaWE9dCYmdC50Vmlldy5kYXRhLGFhPXQmJjE9PSgxJnQuZmxhZ3MpLHRhPXQmJnQucmVuZGVyZXIsdCYmdC5iaW5kaW5nSW5kZXg8MCYmKHQuYmluZGluZ0luZGV4PXQuYmluZGluZ1N0YXJ0SW5kZXgpLG51bGwhPWUmJihuYT1lLHJhPSEwKSxkYT10LG9hPXQmJnQucXVlcmllcyxufWZ1bmN0aW9uIHlhKHQpe3BhfHxKbyh1YSxkYS50Vmlldy52aWV3SG9va3MsZGEudFZpZXcudmlld0NoZWNrSG9va3MsYWEpLGRhLmZsYWdzJj0tNixkYS5saWZlY3ljbGVTdGFnZT0xLGRhLmJpbmRpbmdJbmRleD0tMSxtYSh0LG51bGwpfWZ1bmN0aW9uIGdhKCl7YmEoKTt2YXIgdD1kYS50Vmlldzt0LmZpcnN0VGVtcGxhdGVQYXNzPSExLHZhKHQuaG9zdEJpbmRpbmdzKSxmdW5jdGlvbih0KXtpZihudWxsIT10KWZvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSs9Mil4YSh0W2VdLHRbZSsxXSl9KHQuY29tcG9uZW50cyl9ZnVuY3Rpb24gdmEodCl7aWYobnVsbCE9dClmb3IodmFyIGU9ZGEudFZpZXcuZGlyZWN0aXZlcyxuPTA7bjx0Lmxlbmd0aDtuKz0yKXt2YXIgcj10W25dLGk9ZVtyXTtpLmhvc3RCaW5kaW5ncyYmaS5ob3N0QmluZGluZ3Mocix0W24rMV0pfX1mdW5jdGlvbiBiYSgpe2lmKCFwYSl7dmFyIHQ9ZGEudFZpZXc7KGZ1bmN0aW9uKHQsZSxuKXsxPT09dC5saWZlY3ljbGVTdGFnZSYmKEpvKHQuZGlyZWN0aXZlcyxlLmluaXRIb29rcyxlLmNoZWNrSG9va3MsbiksdC5saWZlY3ljbGVTdGFnZT0yKX0pKGRhLHQsYWEpLEpvKHVhLHQuY29udGVudEhvb2tzLHQuY29udGVudENoZWNrSG9va3MsYWEpfX1mdW5jdGlvbiBfYSh0LGUsbixyLGksbyl7dmFyIGEscyx1LGwsYyxmLGgsZCxwLG09cmEseT1uYTt0cnl7cmE9ITAsbmE9bnVsbDt2YXIgZz0yO251bGw9PXQmJihzPW51bGwsdT0yLGw9bnVsbCxjPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtyZXR1cm57cGFyZW50OmRhLGlkOi0xLGZsYWdzOjExLG5vZGU6bnVsbCxkYXRhOltdLGRpcmVjdGl2ZXM6bnVsbCx0VmlldzpuLGNsZWFudXA6bnVsbCxyZW5kZXJlcjplLGNoaWxkOm51bGwsdGFpbDpudWxsLG5leHQ6bnVsbCxiaW5kaW5nU3RhcnRJbmRleDotMSxiaW5kaW5nSW5kZXg6LTEsdGVtcGxhdGU6cixjb250ZXh0OmksZHluYW1pY1ZpZXdDb3VudDowLGxpZmVjeWNsZVN0YWdlOjEscXVlcmllczpudWxsLGluamVjdG9yOmRhJiZkYS5pbmplY3Rvcn19KDAscixmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQubmdQcml2YXRlRGF0YXx8KHQubmdQcml2YXRlRGF0YT1mdW5jdGlvbih0LGUpe3JldHVybntkYXRhOltdLGRpcmVjdGl2ZXM6bnVsbCxmaXJzdFRlbXBsYXRlUGFzczohMCxpbml0SG9va3M6bnVsbCxjaGVja0hvb2tzOm51bGwsY29udGVudEhvb2tzOm51bGwsY29udGVudENoZWNrSG9va3M6bnVsbCx2aWV3SG9va3M6bnVsbCx2aWV3Q2hlY2tIb29rczpudWxsLGRlc3Ryb3lIb29rczpudWxsLHBpcGVEZXN0cm95SG9va3M6bnVsbCxob3N0QmluZGluZ3M6bnVsbCxjb21wb25lbnRzOm51bGwsZGlyZWN0aXZlUmVnaXN0cnk6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOnQscGlwZVJlZ2lzdHJ5OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2UoKTplLGN1cnJlbnRNYXRjaGVzOm51bGx9fShlLG4pKX0oZSxpfHxudWxsLG98fG51bGwpLGUsbiksZj1yYT9uYTpuYSYmbmEucGFyZW50LGg9KHJhP29hOm5hJiZuYS5xdWVyaWVzKXx8ZiYmZi5xdWVyaWVzJiZmLnF1ZXJpZXMuY2hpbGQoKSxwPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtyZXR1cm57dHlwZTp0LG5hdGl2ZTpyLHZpZXc6ZSxwYXJlbnQ6bixjaGlsZDpudWxsLG5leHQ6bnVsbCxub2RlSW5qZWN0b3I6bj9uLm5vZGVJbmplY3RvcjpudWxsLGRhdGE6aSxxdWVyaWVzOm8sdE5vZGU6bnVsbCxwTmV4dE9yUGFyZW50Om51bGwsZHluYW1pY0xDb250YWluZXJOb2RlOm51bGx9fSh1LGRhLGYsbCwoZD1udWxsIT1jKT9jOm51bGwsaCksMj09KDImdSkmJmQmJihuZ0Rldk1vZGUmJlpvKGMubm9kZSwiTFZpZXcubm9kZSBzaG91bGQgbm90IGhhdmUgYmVlbiBpbml0aWFsaXplZCIpLGMubm9kZT1wKSxudWxsIT1zJiYobmdEZXZNb2RlJiZmdW5jdGlvbih0LGUpe251bGw9PWUmJihlPXNhKSxLbyhlLmxlbmd0aCx0LCJpbmRleCAiK3QrIiBleHBlY3RlZCB0byBiZSBhdCB0aGUgZW5kIG9mIGFyciAobGVuZ3RoICIrZS5sZW5ndGgrIikiKX0ocyksc2Fbc109cCxzPj1pYS5sZW5ndGg/aWFbc109bnVsbDpwLnROb2RlPWlhW3NdLHJhPyhvYT1udWxsLG5hLnZpZXchPT1kYSYmMiE9PW5hLnR5cGV8fChuZ0Rldk1vZGUmJlpvKG5hLmNoaWxkLCJwcmV2aW91c09yUGFyZW50Tm9kZSdzIGNoaWxkIHNob3VsZCBub3QgaGF2ZSBiZWVuIHNldC4iKSxuYS5jaGlsZD1wKSk6bmEmJihuZ0Rldk1vZGUmJlpvKG5hLm5leHQsInByZXZpb3VzT3JQYXJlbnROb2RlJ3MgbmV4dCBwcm9wZXJ0eSBzaG91bGQgbm90IGhhdmUgYmVlbiBzZXQgIitzKyIuIiksbmEubmV4dD1wLG5hLmR5bmFtaWNMQ29udGFpbmVyTm9kZSYmKG5hLmR5bmFtaWNMQ29udGFpbmVyTm9kZS5uZXh0PXApKSksbmE9cCxyYT0hMCx0PXAsZz0xKSxhPW1hKHQuZGF0YSx0KSxlKGcsbiksZ2EoKSx3YSgpfWZpbmFsbHl7eWEoYSkscmE9bSxuYT15fXJldHVybiB0fWZ1bmN0aW9uIHdhKCl7Zm9yKHZhciB0PWRhLmNoaWxkO251bGwhPT10O3Q9dC5uZXh0KWlmKDAhPT10LmR5bmFtaWNWaWV3Q291bnQmJnQudmlld3MpZm9yKHZhciBlPXQsbj0wO248ZS52aWV3cy5sZW5ndGg7bisrKXt2YXIgcj1lLnZpZXdzW25dO19hKHIsci5kYXRhLnRlbXBsYXRlLHIuZGF0YS5jb250ZXh0LHRhKX19ZnVuY3Rpb24geGEodCxlKXtuZ0Rldk1vZGUmJlNhKGUpO3ZhciBuLHIsaT1zYVtlXTtuZ0Rldk1vZGUmJihyPTMsWG8obj1pLCJzaG91bGQgYmUgY2FsbGVkIHdpdGggYSBub2RlIiksS28obi50eXBlLHIsInNob3VsZCBiZSBhICIrZnVuY3Rpb24odCl7cmV0dXJuIDE9PXQ/IlByb2plY3Rpb24iOjA9PXQ/IkNvbnRhaW5lciI6Mj09dD8iVmlldyI6Mz09dD8iRWxlbWVudCI6Ijx1bmtub3duPiJ9KHIpKSksbmdEZXZNb2RlJiZYbyhpLmRhdGEsIkNvbXBvbmVudCdzIGhvc3Qgbm9kZSBzaG91bGQgaGF2ZSBhbiBMVmlldyBhdHRhY2hlZC4iKTt2YXIgbyxhPWkuZGF0YTs4PT0oOCZhLmZsYWdzKSYmNiZhLmZsYWdzJiYobmdEZXZNb2RlJiZTYSh0LHVhKSxDYShhLGksZGEudFZpZXcuZGlyZWN0aXZlc1t0XSwobz11YVt0XSxBcnJheS5pc0FycmF5KG8pP29bMF06bykpKX1mdW5jdGlvbiBPYSh0KXt2YXIgZT1FYSh0KTtuZ0Rldk1vZGUmJlhvKGUuZGF0YSwiQ29tcG9uZW50IGhvc3Qgbm9kZSBzaG91bGQgYmUgYXR0YWNoZWQgdG8gYW4gTFZpZXciKSxDYShlLmRhdGEsZSxlLnZpZXcudFZpZXcuZGlyZWN0aXZlc1tlLnROb2RlLmZsYWdzPj4xM10sdCl9ZnVuY3Rpb24gQ2EodCxlLG4scil7dmFyIGk9bWEodCxlKSxvPW4udGVtcGxhdGU7dHJ5e28oMSZ0LmZsYWdzPzM6MixyKSxnYSgpLHdhKCl9ZmluYWxseXt5YShpKX19ZnVuY3Rpb24gU2EodCxlKXtudWxsPT1lJiYoZT1zYSksdD49KGU/ZS5sZW5ndGg6MCkmJiRvKCJpbmRleCBleHBlY3RlZCB0byBiZSBhIHZhbGlkIGRhdGEgaW5kZXgiKX1mdW5jdGlvbiBFYSh0KXtuZ0Rldk1vZGUmJlhvKHQsImV4cGVjdGluZyBjb21wb25lbnQgZ290IG51bGwiKTt2YXIgZT10W2NhXTtyZXR1cm4gbmdEZXZNb2RlJiZYbyh0LCJvYmplY3QgaXMgbm90IGEgY29tcG9uZW50IiksZX1sYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl92aWV3PXQsdGhpcy5jb250ZXh0PWV9cmV0dXJuIHQucHJvdG90eXBlLl9zZXRDb21wb25lbnRDb250ZXh0PWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmlldz10LHRoaXMuY29udGV4dD1lfSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5tYXJrRm9yQ2hlY2s9ZnVuY3Rpb24oKXshZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQ7bnVsbCE9ZS5wYXJlbnQ7KWUuZmxhZ3N8PTQsZT1lLnBhcmVudDt2YXIgbixyO2UuZmxhZ3N8PTQsbmdEZXZNb2RlJiZYbyhlLmNvbnRleHQsInJvb3RDb250ZXh0IiksKG49ZS5jb250ZXh0KS5jbGVhbj09ZmEmJihuLmNsZWFuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHQpe3JldHVybiByPXR9KSxuLnNjaGVkdWxlcihmdW5jdGlvbigpe3ZhciB0LGU7ZT1FYSgodD1mdW5jdGlvbih0KXtuZ0Rldk1vZGUmJlhvKHQsImNvbXBvbmVudCIpO2Zvcih2YXIgZT1FYSh0KS52aWV3O2UucGFyZW50OyllPWUucGFyZW50O3JldHVybiBlfShuLmNvbXBvbmVudCkpLmNvbnRleHQuY29tcG9uZW50KSxuZ0Rldk1vZGUmJlhvKGUuZGF0YSwiQ29tcG9uZW50IGhvc3Qgbm9kZSBzaG91bGQgYmUgYXR0YWNoZWQgdG8gYW4gTFZpZXciKSxmdW5jdGlvbihuLHIsaSxvKXt2YXIgYT1tYSh0LGUpO3RyeXtlYS5iZWdpbiYmZWEuYmVnaW4oKSxiYSgpLHZhKGhhKSx4YSgwLDApfWZpbmFsbHl7ZWEuZW5kJiZlYS5lbmQoKSx5YShhKX19KCkscihudWxsKSxuLmNsZWFuPWZhfSkpfSh0aGlzLl92aWV3KX0sdC5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5fdmlldy5mbGFncyY9LTl9LHQucHJvdG90eXBlLnJlYXR0YWNoPWZ1bmN0aW9uKCl7dGhpcy5fdmlldy5mbGFnc3w9OH0sdC5wcm90b3R5cGUuZGV0ZWN0Q2hhbmdlcz1mdW5jdGlvbigpe09hKHRoaXMuY29udGV4dCl9LHQucHJvdG90eXBlLmNoZWNrTm9DaGFuZ2VzPWZ1bmN0aW9uKCl7IWZ1bmN0aW9uKHQpe3BhPSEwO3RyeXtPYSh0KX1maW5hbGx5e3BhPSExfX0odGhpcy5jb250ZXh0KX0sdH0oKSxPYmplY3Qoci5iKShmdW5jdGlvbih0LGUsbil7dmFyIHI9bGEuY2FsbCh0aGlzLHQuZGF0YSxuKXx8dGhpcztyZXR1cm4gci5fbFZpZXdOb2RlPXQscn0sbGEpfSxES1RiOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgdH0pfW4uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiByfSl9LEVobWs6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pO3ZhciByLGk9bigiZWlocyIpO2Z1bmN0aW9uIG8oKXt0cnl7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfWNhdGNoKHQpe3JldHVybiBpLmEuZT10LGkuYX19ZnVuY3Rpb24gYSh0KXtyZXR1cm4gcj10LG99fSwiRW44KyI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pO3ZhciByPWZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yP1N5bWJvbC5pdGVyYXRvcjoiQEBpdGVyYXRvciJ9KCl9LCJGL1hMIjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBzfSk7dmFyIHI9bigibmtZNyIpLGk9bigiSVVUYiIpLG89bigiRzVKMSIpLGE9bigiUFU4TCIpO2Z1bmN0aW9uIHMoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49dFt0Lmxlbmd0aC0xXTtzd2l0Y2goT2JqZWN0KHIuYSkobik/dC5wb3AoKTpuPXZvaWQgMCx0Lmxlbmd0aCl7Y2FzZSAwOnJldHVybiBPYmplY3Qoby5iKShuKTtjYXNlIDE6cmV0dXJuIG4/T2JqZWN0KGkuYSkodCxuKTpPYmplY3QoYS5hKSh0WzBdKTtkZWZhdWx0OnJldHVybiBPYmplY3QoaS5hKSh0LG4pfX19LEZGT286ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gY30pO3ZhciByPW4oIm1yU0ciKSxpPW4oIjJCZGoiKSxvPW4oIjZhaHciKSxhPW4oInB1Z1QiKSxzPW4oIkwvVjkiKSx1PW4oImlMeFEiKSxsPW4oIkRLVGIiKSxjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIpe3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcztzd2l0Y2goaS5zeW5jRXJyb3JWYWx1ZT1udWxsLGkuc3luY0Vycm9yVGhyb3duPSExLGkuc3luY0Vycm9yVGhyb3dhYmxlPSExLGkuaXNTdG9wcGVkPSExLGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDppLmRlc3RpbmF0aW9uPW8uYTticmVhaztjYXNlIDE6aWYoIWUpe2kuZGVzdGluYXRpb249by5hO2JyZWFrfWlmKCJvYmplY3QiPT10eXBlb2YgZSl7aWYoaChlKSl7dmFyIGE9ZVtzLmFdKCk7aS5zeW5jRXJyb3JUaHJvd2FibGU9YS5zeW5jRXJyb3JUaHJvd2FibGUsaS5kZXN0aW5hdGlvbj1hLGEuYWRkKGkpfWVsc2UgaS5zeW5jRXJyb3JUaHJvd2FibGU9ITAsaS5kZXN0aW5hdGlvbj1uZXcgZihpLGUpO2JyZWFrfWRlZmF1bHQ6aS5zeW5jRXJyb3JUaHJvd2FibGU9ITAsaS5kZXN0aW5hdGlvbj1uZXcgZihpLGUsbixyKX1yZXR1cm4gaX1yZXR1cm4gci5iKGUsdCksZS5wcm90b3R5cGVbcy5hXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxlLmNyZWF0ZT1mdW5jdGlvbih0LG4scil7dmFyIGk9bmV3IGUodCxuLHIpO3JldHVybiBpLnN5bmNFcnJvclRocm93YWJsZT0hMSxpfSxlLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKHQpe3RoaXMuaXNTdG9wcGVkfHx0aGlzLl9uZXh0KHQpfSxlLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbih0KXt0aGlzLmlzU3RvcHBlZHx8KHRoaXMuaXNTdG9wcGVkPSEwLHRoaXMuX2Vycm9yKHQpKX0sZS5wcm90b3R5cGUuY29tcGxldGU9ZnVuY3Rpb24oKXt0aGlzLmlzU3RvcHBlZHx8KHRoaXMuaXNTdG9wcGVkPSEwLHRoaXMuX2NvbXBsZXRlKCkpfSxlLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbigpe3RoaXMuY2xvc2VkfHwodGhpcy5pc1N0b3BwZWQ9ITAsdC5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKSl9LGUucHJvdG90eXBlLl9uZXh0PWZ1bmN0aW9uKHQpe3RoaXMuZGVzdGluYXRpb24ubmV4dCh0KX0sZS5wcm90b3R5cGUuX2Vycm9yPWZ1bmN0aW9uKHQpe3RoaXMuZGVzdGluYXRpb24uZXJyb3IodCksdGhpcy51bnN1YnNjcmliZSgpfSxlLnByb3RvdHlwZS5fY29tcGxldGU9ZnVuY3Rpb24oKXt0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCksdGhpcy51bnN1YnNjcmliZSgpfSxlLnByb3RvdHlwZS5fdW5zdWJzY3JpYmVBbmRSZWN5Y2xlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcGFyZW50LGU9dGhpcy5fcGFyZW50cztyZXR1cm4gdGhpcy5fcGFyZW50PW51bGwsdGhpcy5fcGFyZW50cz1udWxsLHRoaXMudW5zdWJzY3JpYmUoKSx0aGlzLmNsb3NlZD0hMSx0aGlzLmlzU3RvcHBlZD0hMSx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9wYXJlbnRzPWUsdGhpc30sZX0oYS5hKSxmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIsYSl7dmFyIHMsdT10LmNhbGwodGhpcyl8fHRoaXM7dS5fcGFyZW50U3Vic2NyaWJlcj1lO3ZhciBsPXU7cmV0dXJuIE9iamVjdChpLmEpKG4pP3M9bjpuJiYocz1uLm5leHQscj1uLmVycm9yLGE9bi5jb21wbGV0ZSxuIT09by5hJiYobD1PYmplY3QuY3JlYXRlKG4pLE9iamVjdChpLmEpKGwudW5zdWJzY3JpYmUpJiZ1LmFkZChsLnVuc3Vic2NyaWJlLmJpbmQobCkpLGwudW5zdWJzY3JpYmU9dS51bnN1YnNjcmliZS5iaW5kKHUpKSksdS5fY29udGV4dD1sLHUuX25leHQ9cyx1Ll9lcnJvcj1yLHUuX2NvbXBsZXRlPWEsdX1yZXR1cm4gci5iKGUsdCksZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbih0KXtpZighdGhpcy5pc1N0b3BwZWQmJnRoaXMuX25leHQpe3ZhciBlPXRoaXMuX3BhcmVudFN1YnNjcmliZXI7dS5hLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcmJmUuc3luY0Vycm9yVGhyb3dhYmxlP3RoaXMuX190cnlPclNldEVycm9yKGUsdGhpcy5fbmV4dCx0KSYmdGhpcy51bnN1YnNjcmliZSgpOnRoaXMuX190cnlPclVuc3ViKHRoaXMuX25leHQsdCl9fSxlLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbih0KXtpZighdGhpcy5pc1N0b3BwZWQpe3ZhciBlPXRoaXMuX3BhcmVudFN1YnNjcmliZXIsbj11LmEudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZztpZih0aGlzLl9lcnJvciluJiZlLnN5bmNFcnJvclRocm93YWJsZT8odGhpcy5fX3RyeU9yU2V0RXJyb3IoZSx0aGlzLl9lcnJvcix0KSx0aGlzLnVuc3Vic2NyaWJlKCkpOih0aGlzLl9fdHJ5T3JVbnN1Yih0aGlzLl9lcnJvcix0KSx0aGlzLnVuc3Vic2NyaWJlKCkpO2Vsc2UgaWYoZS5zeW5jRXJyb3JUaHJvd2FibGUpbj8oZS5zeW5jRXJyb3JWYWx1ZT10LGUuc3luY0Vycm9yVGhyb3duPSEwKTpPYmplY3QobC5hKSh0KSx0aGlzLnVuc3Vic2NyaWJlKCk7ZWxzZXtpZih0aGlzLnVuc3Vic2NyaWJlKCksbil0aHJvdyB0O09iamVjdChsLmEpKHQpfX19LGUucHJvdG90eXBlLmNvbXBsZXRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZighdGhpcy5pc1N0b3BwZWQpe3ZhciBlPXRoaXMuX3BhcmVudFN1YnNjcmliZXI7aWYodGhpcy5fY29tcGxldGUpe3ZhciBuPWZ1bmN0aW9uKCl7cmV0dXJuIHQuX2NvbXBsZXRlLmNhbGwodC5fY29udGV4dCl9O3UuYS51c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nJiZlLnN5bmNFcnJvclRocm93YWJsZT8odGhpcy5fX3RyeU9yU2V0RXJyb3IoZSxuKSx0aGlzLnVuc3Vic2NyaWJlKCkpOih0aGlzLl9fdHJ5T3JVbnN1YihuKSx0aGlzLnVuc3Vic2NyaWJlKCkpfWVsc2UgdGhpcy51bnN1YnNjcmliZSgpfX0sZS5wcm90b3R5cGUuX190cnlPclVuc3ViPWZ1bmN0aW9uKHQsZSl7dHJ5e3QuY2FsbCh0aGlzLl9jb250ZXh0LGUpfWNhdGNoKHQpe2lmKHRoaXMudW5zdWJzY3JpYmUoKSx1LmEudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyl0aHJvdyB0O09iamVjdChsLmEpKHQpfX0sZS5wcm90b3R5cGUuX190cnlPclNldEVycm9yPWZ1bmN0aW9uKHQsZSxuKXtpZighdS5hLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpdGhyb3cgbmV3IEVycm9yKCJiYWQgY2FsbCIpO3RyeXtlLmNhbGwodGhpcy5fY29udGV4dCxuKX1jYXRjaChlKXtyZXR1cm4gdS5hLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmc/KHQuc3luY0Vycm9yVmFsdWU9ZSx0LnN5bmNFcnJvclRocm93bj0hMCwhMCk6KE9iamVjdChsLmEpKGUpLCEwKX1yZXR1cm4hMX0sZS5wcm90b3R5cGUuX3Vuc3Vic2NyaWJlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcGFyZW50U3Vic2NyaWJlcjt0aGlzLl9jb250ZXh0PW51bGwsdGhpcy5fcGFyZW50U3Vic2NyaWJlcj1udWxsLHQudW5zdWJzY3JpYmUoKX0sZX0oYyk7ZnVuY3Rpb24gaCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGN8fCJzeW5jRXJyb3JUaHJvd2FibGUiaW4gdCYmdFtzLmFdfX0sRlZTeTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJiIixmdW5jdGlvbigpe3JldHVybiByfSksbi5kKGUsImUiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSxuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLG4uZChlLCJjIixmdW5jdGlvbigpe3JldHVybiBhfSksbi5kKGUsImYiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSxuLmQoZSwiZCIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pO3ZhciByPWZ1bmN0aW9uKCl7fSxpPWZ1bmN0aW9uKCl7fSxvPWZ1bmN0aW9uKCl7fSxhPWZ1bmN0aW9uKCl7fSxzPWZ1bmN0aW9uKCl7fSx1PWZ1bmN0aW9uKCl7fX0sRnhiMTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBkfSk7dmFyIHI9bigiNmJsRiIpLGk9bigiK3RKNCIpLG89bigiUzVYUSIpLGE9bigidTY3RCIpLHM9bigiSmNSdiIpLHU9bigiMmVQbCIpLGw9bigiL1dZdiIpLGM9bigiTWNTbyIpLGY9bigiRW44KyIpLGg9bigieFRsYSIpLGQ9ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIHIuYSlyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQuX2lzU2NhbGFyPyhlLm5leHQodC52YWx1ZSksdm9pZCBlLmNvbXBsZXRlKCkpOnQuc3Vic2NyaWJlKGUpfTtpZih0JiYiZnVuY3Rpb24iPT10eXBlb2YgdFtoLmFdKXJldHVybiBPYmplY3Qocy5hKSh0KTtpZihPYmplY3QodS5hKSh0KSlyZXR1cm4gT2JqZWN0KGkuYSkodCk7aWYoT2JqZWN0KGwuYSkodCkpcmV0dXJuIE9iamVjdChvLmEpKHQpO2lmKHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0W2YuYV0pcmV0dXJuIE9iamVjdChhLmEpKHQpO3ZhciBlPU9iamVjdChjLmEpKHQpPyJhbiBpbnZhbGlkIG9iamVjdCI6IiciK3QrIiciO3Rocm93IG5ldyBUeXBlRXJyb3IoIllvdSBwcm92aWRlZCAiK2UrIiB3aGVyZSBhIHN0cmVhbSB3YXMgZXhwZWN0ZWQuIFlvdSBjYW4gcHJvdmlkZSBhbiBPYnNlcnZhYmxlLCBQcm9taXNlLCBBcnJheSwgb3IgSXRlcmFibGUuIil9fSxGenFjOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSxuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gc30pO3ZhciByPW4oIklwMFIiKSxpPW4oIkNjbkciKSxvPW5ldyBpLm8oImNkay1kaXItZG9jIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiBPYmplY3QoaS5WKShyLmQpfX0pLGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMudmFsdWU9Imx0ciIsdGhpcy5jaGFuZ2U9bmV3IGkubSx0JiYodGhpcy52YWx1ZT0odC5ib2R5P3QuYm9keS5kaXI6bnVsbCl8fCh0LmRvY3VtZW50RWxlbWVudD90LmRvY3VtZW50RWxlbWVudC5kaXI6bnVsbCl8fCJsdHIiKX1yZXR1cm4gdC5wcm90b3R5cGUubmdPbkRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmNoYW5nZS5jb21wbGV0ZSgpfSx0Lm5nSW5qZWN0YWJsZURlZj1PYmplY3QoaS5SKSh7ZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiBuZXcgdChPYmplY3QoaS5WKShvLDgpKX0sdG9rZW46dCxwcm92aWRlZEluOiJyb290In0pLHR9KCkscz1mdW5jdGlvbigpe319LEc1SjE6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLG4uZChlLCJiIixmdW5jdGlvbigpe3JldHVybiBvfSk7dmFyIHI9bigiNmJsRiIpLGk9bmV3IHIuYShmdW5jdGlvbih0KXtyZXR1cm4gdC5jb21wbGV0ZSgpfSk7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdD9mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHIuYShmdW5jdGlvbihlKXtyZXR1cm4gdC5zY2hlZHVsZShmdW5jdGlvbigpe3JldHVybiBlLmNvbXBsZXRlKCl9KX0pfSh0KTppfX0sR2kzaTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBhfSk7dmFyIHI9bigibXJTRyIpLGk9bigiRkZPbyIpLG89bigiVDFETSIpO2Z1bmN0aW9uIGEodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9by5hKSxmdW5jdGlvbihuKXtyZXR1cm4gbi5saWZ0KG5ldyBzKHQsZSkpfX12YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLmR1ZVRpbWU9dCx0aGlzLnNjaGVkdWxlcj1lfXJldHVybiB0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuc3Vic2NyaWJlKG5ldyB1KHQsdGhpcy5kdWVUaW1lLHRoaXMuc2NoZWR1bGVyKSl9LHR9KCksdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt2YXIgaT10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gaS5kdWVUaW1lPW4saS5zY2hlZHVsZXI9cixpLmRlYm91bmNlZFN1YnNjcmlwdGlvbj1udWxsLGkubGFzdFZhbHVlPW51bGwsaS5oYXNWYWx1ZT0hMSxpfXJldHVybiByLmIoZSx0KSxlLnByb3RvdHlwZS5fbmV4dD1mdW5jdGlvbih0KXt0aGlzLmNsZWFyRGVib3VuY2UoKSx0aGlzLmxhc3RWYWx1ZT10LHRoaXMuaGFzVmFsdWU9ITAsdGhpcy5hZGQodGhpcy5kZWJvdW5jZWRTdWJzY3JpcHRpb249dGhpcy5zY2hlZHVsZXIuc2NoZWR1bGUobCx0aGlzLmR1ZVRpbWUsdGhpcykpfSxlLnByb3RvdHlwZS5fY29tcGxldGU9ZnVuY3Rpb24oKXt0aGlzLmRlYm91bmNlZE5leHQoKSx0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCl9LGUucHJvdG90eXBlLmRlYm91bmNlZE5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLmNsZWFyRGVib3VuY2UoKSx0aGlzLmhhc1ZhbHVlKXt2YXIgdD10aGlzLmxhc3RWYWx1ZTt0aGlzLmxhc3RWYWx1ZT1udWxsLHRoaXMuaGFzVmFsdWU9ITEsdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHQpfX0sZS5wcm90b3R5cGUuY2xlYXJEZWJvdW5jZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZGVib3VuY2VkU3Vic2NyaXB0aW9uO251bGwhPT10JiYodGhpcy5yZW1vdmUodCksdC51bnN1YnNjcmliZSgpLHRoaXMuZGVib3VuY2VkU3Vic2NyaXB0aW9uPW51bGwpfSxlfShpLmEpO2Z1bmN0aW9uIGwodCl7dC5kZWJvdW5jZWROZXh0KCl9fSxJVVRiOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KTt2YXIgcj1uKCI2YmxGIiksaT1uKCJwdWdUIiksbz1uKCIrdEo0Iik7ZnVuY3Rpb24gYSh0LGUpe3JldHVybiBuZXcgci5hKGU/ZnVuY3Rpb24obil7dmFyIHI9bmV3IGkuYSxvPTA7cmV0dXJuIHIuYWRkKGUuc2NoZWR1bGUoZnVuY3Rpb24oKXtvIT09dC5sZW5ndGg/KG4ubmV4dCh0W28rK10pLG4uY2xvc2VkfHxyLmFkZCh0aGlzLnNjaGVkdWxlKCkpKTpuLmNvbXBsZXRlKCl9KSkscn06T2JqZWN0KG8uYSkodCkpfX0sSXAwUjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJ0IixmdW5jdGlvbigpe3JldHVybiBnfSksbi5kKGUsImwiLGZ1bmN0aW9uKCl7cmV0dXJuIGJ9KSxuLmQoZSwibSIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pLG4uZChlLCJ1IixmdW5jdGlvbigpe3JldHVybiBffSksbi5kKGUsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIE19KSxuLmQoZSwiaSIsZnVuY3Rpb24oKXtyZXR1cm4gd30pLG4uZChlLCJqIixmdW5jdGlvbigpe3JldHVybiBPfSksbi5kKGUsImsiLGZ1bmN0aW9uKCl7cmV0dXJuIFN9KSxuLmQoZSwibiIsZnVuY3Rpb24oKXtyZXR1cm4gVH0pLG4uZChlLCJkIixmdW5jdGlvbigpe3JldHVybiBOfSksbi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIFB9KSxuLmQoZSwicyIsZnVuY3Rpb24oKXtyZXR1cm4gUn0pLG4uZChlLCJxIixmdW5jdGlvbigpe3JldHVybiBMfSksbi5kKGUsInIiLGZ1bmN0aW9uKCl7cmV0dXJuIEZ9KSxuLmQoZSwicCIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLG4uZChlLCJmIixmdW5jdGlvbigpe3JldHVybiBhfSksbi5kKGUsImgiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSxuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pLG4uZChlLCJlIixmdW5jdGlvbigpe3JldHVybiBmfSksbi5kKGUsIm8iLGZ1bmN0aW9uKCl7cmV0dXJuIGh9KSxuLmQoZSwiZyIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pO3ZhciByPW4oIkNjbkciKSxpPW4oIm1yU0ciKSxvPWZ1bmN0aW9uKCl7fSxhPW5ldyByLm8oIkxvY2F0aW9uIEluaXRpYWxpemVkIikscz1mdW5jdGlvbigpe30sdT1uZXcgci5vKCJhcHBCYXNlSHJlZiIpLGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPXRoaXM7dGhpcy5fc3ViamVjdD1uZXcgci5tLHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3k9ZTt2YXIgaT10aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LmdldEJhc2VIcmVmKCk7dGhpcy5fYmFzZUhyZWY9dC5zdHJpcFRyYWlsaW5nU2xhc2goYyhpKSksdGhpcy5fcGxhdGZvcm1TdHJhdGVneS5vblBvcFN0YXRlKGZ1bmN0aW9uKHQpe24uX3N1YmplY3QuZW1pdCh7dXJsOm4ucGF0aCghMCkscG9wOiEwLHN0YXRlOnQuc3RhdGUsdHlwZTp0LnR5cGV9KX0pfXJldHVybiB0LnByb3RvdHlwZS5wYXRoPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0hMSksdGhpcy5ub3JtYWxpemUodGhpcy5fcGxhdGZvcm1TdHJhdGVneS5wYXRoKHQpKX0sdC5wcm90b3R5cGUuaXNDdXJyZW50UGF0aEVxdWFsVG89ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49IiIpLHRoaXMucGF0aCgpPT10aGlzLm5vcm1hbGl6ZShlK3Qubm9ybWFsaXplUXVlcnlQYXJhbXMobikpfSx0LnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuc3RyaXBUcmFpbGluZ1NsYXNoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJmUuc3RhcnRzV2l0aCh0KT9lLnN1YnN0cmluZyh0Lmxlbmd0aCk6ZX0odGhpcy5fYmFzZUhyZWYsYyhlKSkpfSx0LnByb3RvdHlwZS5wcmVwYXJlRXh0ZXJuYWxVcmw9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiIvIiE9PXRbMF0mJih0PSIvIit0KSx0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LnByZXBhcmVFeHRlcm5hbFVybCh0KX0sdC5wcm90b3R5cGUuZ289ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PWUmJihlPSIiKSx2b2lkIDA9PT1uJiYobj1udWxsKSx0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LnB1c2hTdGF0ZShuLCIiLHQsZSl9LHQucHJvdG90eXBlLnJlcGxhY2VTdGF0ZT1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09ZSYmKGU9IiIpLHZvaWQgMD09PW4mJihuPW51bGwpLHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kucmVwbGFjZVN0YXRlKG4sIiIsdCxlKX0sdC5wcm90b3R5cGUuZm9yd2FyZD1mdW5jdGlvbigpe3RoaXMuX3BsYXRmb3JtU3RyYXRlZ3kuZm9yd2FyZCgpfSx0LnByb3RvdHlwZS5iYWNrPWZ1bmN0aW9uKCl7dGhpcy5fcGxhdGZvcm1TdHJhdGVneS5iYWNrKCl9LHQucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX3N1YmplY3Quc3Vic2NyaWJlKHtuZXh0OnQsZXJyb3I6ZSxjb21wbGV0ZTpufSl9LHQubm9ybWFsaXplUXVlcnlQYXJhbXM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiI/IiE9PXRbMF0/Ij8iK3Q6dH0sdC5qb2luV2l0aFNsYXNoPWZ1bmN0aW9uKHQsZSl7aWYoMD09dC5sZW5ndGgpcmV0dXJuIGU7aWYoMD09ZS5sZW5ndGgpcmV0dXJuIHQ7dmFyIG49MDtyZXR1cm4gdC5lbmRzV2l0aCgiLyIpJiZuKyssZS5zdGFydHNXaXRoKCIvIikmJm4rKywyPT1uP3QrZS5zdWJzdHJpbmcoMSk6MT09bj90K2U6dCsiLyIrZX0sdC5zdHJpcFRyYWlsaW5nU2xhc2g9ZnVuY3Rpb24odCl7dmFyIGU9dC5tYXRjaCgvI3xcP3wkLyksbj1lJiZlLmluZGV4fHx0Lmxlbmd0aDtyZXR1cm4gdC5zbGljZSgwLG4tKCIvIj09PXRbbi0xXT8xOjApKSt0LnNsaWNlKG4pfSx0fSgpO2Z1bmN0aW9uIGModCl7cmV0dXJuIHQucmVwbGFjZSgvXC9pbmRleC5odG1sJC8sIiIpfXZhciBmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgcj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIHIuX3BsYXRmb3JtTG9jYXRpb249ZSxyLl9iYXNlSHJlZj0iIixudWxsIT1uJiYoci5fYmFzZUhyZWY9bikscn1yZXR1cm4gT2JqZWN0KGkuYikoZSx0KSxlLnByb3RvdHlwZS5vblBvcFN0YXRlPWZ1bmN0aW9uKHQpe3RoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25Qb3BTdGF0ZSh0KSx0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uSGFzaENoYW5nZSh0KX0sZS5wcm90b3R5cGUuZ2V0QmFzZUhyZWY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFzZUhyZWZ9LGUucHJvdG90eXBlLnBhdGg9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciBlPXRoaXMuX3BsYXRmb3JtTG9jYXRpb24uaGFzaDtyZXR1cm4gbnVsbD09ZSYmKGU9IiMiKSxlLmxlbmd0aD4wP2Uuc3Vic3RyaW5nKDEpOmV9LGUucHJvdG90eXBlLnByZXBhcmVFeHRlcm5hbFVybD1mdW5jdGlvbih0KXt2YXIgZT1sLmpvaW5XaXRoU2xhc2godGhpcy5fYmFzZUhyZWYsdCk7cmV0dXJuIGUubGVuZ3RoPjA/IiMiK2U6ZX0sZS5wcm90b3R5cGUucHVzaFN0YXRlPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXMucHJlcGFyZUV4dGVybmFsVXJsKG4rbC5ub3JtYWxpemVRdWVyeVBhcmFtcyhyKSk7MD09aS5sZW5ndGgmJihpPXRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWUpLHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucHVzaFN0YXRlKHQsZSxpKX0sZS5wcm90b3R5cGUucmVwbGFjZVN0YXRlPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXMucHJlcGFyZUV4dGVybmFsVXJsKG4rbC5ub3JtYWxpemVRdWVyeVBhcmFtcyhyKSk7MD09aS5sZW5ndGgmJihpPXRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWUpLHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucmVwbGFjZVN0YXRlKHQsZSxpKX0sZS5wcm90b3R5cGUuZm9yd2FyZD1mdW5jdGlvbigpe3RoaXMuX3BsYXRmb3JtTG9jYXRpb24uZm9yd2FyZCgpfSxlLnByb3RvdHlwZS5iYWNrPWZ1bmN0aW9uKCl7dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5iYWNrKCl9LGV9KHMpLGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciByPXQuY2FsbCh0aGlzKXx8dGhpcztpZihyLl9wbGF0Zm9ybUxvY2F0aW9uPWUsbnVsbD09biYmKG49ci5fcGxhdGZvcm1Mb2NhdGlvbi5nZXRCYXNlSHJlZkZyb21ET00oKSksbnVsbD09bil0aHJvdyBuZXcgRXJyb3IoIk5vIGJhc2UgaHJlZiBzZXQuIFBsZWFzZSBwcm92aWRlIGEgdmFsdWUgZm9yIHRoZSBBUFBfQkFTRV9IUkVGIHRva2VuIG9yIGFkZCBhIGJhc2UgZWxlbWVudCB0byB0aGUgZG9jdW1lbnQuIik7cmV0dXJuIHIuX2Jhc2VIcmVmPW4scn1yZXR1cm4gT2JqZWN0KGkuYikoZSx0KSxlLnByb3RvdHlwZS5vblBvcFN0YXRlPWZ1bmN0aW9uKHQpe3RoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25Qb3BTdGF0ZSh0KSx0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uSGFzaENoYW5nZSh0KX0sZS5wcm90b3R5cGUuZ2V0QmFzZUhyZWY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFzZUhyZWZ9LGUucHJvdG90eXBlLnByZXBhcmVFeHRlcm5hbFVybD1mdW5jdGlvbih0KXtyZXR1cm4gbC5qb2luV2l0aFNsYXNoKHRoaXMuX2Jhc2VIcmVmLHQpfSxlLnByb3RvdHlwZS5wYXRoPWZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQmJih0PSExKTt2YXIgZT10aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnBhdGhuYW1lK2wubm9ybWFsaXplUXVlcnlQYXJhbXModGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5zZWFyY2gpLG49dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5oYXNoO3JldHVybiBuJiZ0PyIiK2UrbjplfSxlLnByb3RvdHlwZS5wdXNoU3RhdGU9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwobitsLm5vcm1hbGl6ZVF1ZXJ5UGFyYW1zKHIpKTt0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnB1c2hTdGF0ZSh0LGUsaSl9LGUucHJvdG90eXBlLnJlcGxhY2VTdGF0ZT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLnByZXBhcmVFeHRlcm5hbFVybChuK2wubm9ybWFsaXplUXVlcnlQYXJhbXMocikpO3RoaXMuX3BsYXRmb3JtTG9jYXRpb24ucmVwbGFjZVN0YXRlKHQsZSxpKX0sZS5wcm90b3R5cGUuZm9yd2FyZD1mdW5jdGlvbigpe3RoaXMuX3BsYXRmb3JtTG9jYXRpb24uZm9yd2FyZCgpfSxlLnByb3RvdHlwZS5iYWNrPWZ1bmN0aW9uKCl7dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5iYWNrKCl9LGV9KHMpLGQ9dm9pZCAwLHA9WyJlbiIsW1siYSIsInAiXSxbIkFNIiwiUE0iXSxkXSxbWyJBTSIsIlBNIl0sZCxkXSxbWyJTIiwiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIl0sWyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sWyJTdSIsIk1vIiwiVHUiLCJXZSIsIlRoIiwiRnIiLCJTYSJdXSxkLFtbIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdLFsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl0sWyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdXSxkLFtbIkIiLCJBIl0sWyJCQyIsIkFEIl0sWyJCZWZvcmUgQ2hyaXN0IiwiQW5ubyBEb21pbmkiXV0sMCxbNiwwXSxbIk0vZC95eSIsIk1NTSBkLCB5IiwiTU1NTSBkLCB5IiwiRUVFRSwgTU1NTSBkLCB5Il0sWyJoOm1tIGEiLCJoOm1tOnNzIGEiLCJoOm1tOnNzIGEgeiIsImg6bW06c3MgYSB6enp6Il0sWyJ7MX0sIHswfSIsZCwiezF9ICdhdCcgezB9IixkXSxbIi4iLCIsIiwiOyIsIiUiLCIrIiwiLSIsIkUiLCJceGQ3IiwiXHUyMDMwIiwiXHUyMjFlIiwiTmFOIiwiOiJdLFsiIywjIzAuIyMjIiwiIywjIzAlIiwiXHhhNCMsIyMwLjAwIiwiI0UwIl0sIiQiLCJVUyBEb2xsYXIiLHt9LGZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguZmxvb3IoTWF0aC5hYnModCkpLG49dC50b1N0cmluZygpLnJlcGxhY2UoL15bXi5dKlwuPy8sIiIpLmxlbmd0aDtyZXR1cm4gMT09PWUmJjA9PT1uPzE6NX1dLG09e30seT1mdW5jdGlvbih0KXtyZXR1cm4gdFt0Llplcm89MF09Ilplcm8iLHRbdC5PbmU9MV09Ik9uZSIsdFt0LlR3bz0yXT0iVHdvIix0W3QuRmV3PTNdPSJGZXciLHRbdC5NYW55PTRdPSJNYW55Iix0W3QuT3RoZXI9NV09Ik90aGVyIix0fSh7fSksZz1uZXcgci5vKCJVc2VWNFBsdXJhbHMiKSx2PWZ1bmN0aW9uKCl7fSxiPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgcj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIHIubG9jYWxlPWUsci5kZXByZWNhdGVkUGx1cmFsRm49bixyfXJldHVybiBPYmplY3QoaS5iKShlLHQpLGUucHJvdG90eXBlLmdldFBsdXJhbENhdGVnb3J5PWZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuZGVwcmVjYXRlZFBsdXJhbEZuP3RoaXMuZGVwcmVjYXRlZFBsdXJhbEZuKGV8fHRoaXMubG9jYWxlLHQpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXy9nLCItIiksbj1tW2VdO2lmKG4pcmV0dXJuIG47dmFyIHI9ZS5zcGxpdCgiLSIpWzBdO2lmKG49bVtyXSlyZXR1cm4gbjtpZigiZW4iPT09cilyZXR1cm4gcDt0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgbG9jYWxlIGRhdGEgZm9yIHRoZSBsb2NhbGUgIicrdCsnIi4nKX0odClbMThdfShlfHx0aGlzLmxvY2FsZSkodCkpe2Nhc2UgeS5aZXJvOnJldHVybiJ6ZXJvIjtjYXNlIHkuT25lOnJldHVybiJvbmUiO2Nhc2UgeS5Ud286cmV0dXJuInR3byI7Y2FzZSB5LkZldzpyZXR1cm4iZmV3IjtjYXNlIHkuTWFueTpyZXR1cm4ibWFueSI7ZGVmYXVsdDpyZXR1cm4ib3RoZXIifX0sZX0odik7ZnVuY3Rpb24gXyh0LGUpe2U9ZW5jb2RlVVJJQ29tcG9uZW50KGUpO3RyeXtmb3IodmFyIG49T2JqZWN0KGkuZSkodC5zcGxpdCgiOyIpKSxyPW4ubmV4dCgpOyFyLmRvbmU7cj1uLm5leHQoKSl7dmFyIG89ci52YWx1ZSxhPW8uaW5kZXhPZigiPSIpLHM9T2JqZWN0KGkuYykoLTE9PWE/W28sIiJdOltvLnNsaWNlKDAsYSksby5zbGljZShhKzEpXSwyKSx1PXNbMV07aWYoc1swXS50cmltKCk9PT1lKXJldHVybiBkZWNvZGVVUklDb21wb25lbnQodSl9fWNhdGNoKHQpe2w9e2Vycm9yOnR9fWZpbmFsbHl7dHJ5e3ImJiFyLmRvbmUmJihjPW4ucmV0dXJuKSYmYy5jYWxsKG4pfWZpbmFsbHl7aWYobCl0aHJvdyBsLmVycm9yfX1yZXR1cm4gbnVsbDt2YXIgbCxjfXZhciB3PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyKXt0aGlzLl9pdGVyYWJsZURpZmZlcnM9dCx0aGlzLl9rZXlWYWx1ZURpZmZlcnM9ZSx0aGlzLl9uZ0VsPW4sdGhpcy5fcmVuZGVyZXI9cix0aGlzLl9pbml0aWFsQ2xhc3Nlcz1bXX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJrbGFzcyIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9yZW1vdmVDbGFzc2VzKHRoaXMuX2luaXRpYWxDbGFzc2VzKSx0aGlzLl9pbml0aWFsQ2xhc3Nlcz0ic3RyaW5nIj09dHlwZW9mIHQ/dC5zcGxpdCgvXHMrLyk6W10sdGhpcy5fYXBwbHlDbGFzc2VzKHRoaXMuX2luaXRpYWxDbGFzc2VzKSx0aGlzLl9hcHBseUNsYXNzZXModGhpcy5fcmF3Q2xhc3MpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibmdDbGFzcyIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9yZW1vdmVDbGFzc2VzKHRoaXMuX3Jhd0NsYXNzKSx0aGlzLl9hcHBseUNsYXNzZXModGhpcy5faW5pdGlhbENsYXNzZXMpLHRoaXMuX2l0ZXJhYmxlRGlmZmVyPW51bGwsdGhpcy5fa2V5VmFsdWVEaWZmZXI9bnVsbCx0aGlzLl9yYXdDbGFzcz0ic3RyaW5nIj09dHlwZW9mIHQ/dC5zcGxpdCgvXHMrLyk6dCx0aGlzLl9yYXdDbGFzcyYmKE9iamVjdChyLlJhKSh0aGlzLl9yYXdDbGFzcyk/dGhpcy5faXRlcmFibGVEaWZmZXI9dGhpcy5faXRlcmFibGVEaWZmZXJzLmZpbmQodGhpcy5fcmF3Q2xhc3MpLmNyZWF0ZSgpOnRoaXMuX2tleVZhbHVlRGlmZmVyPXRoaXMuX2tleVZhbHVlRGlmZmVycy5maW5kKHRoaXMuX3Jhd0NsYXNzKS5jcmVhdGUoKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUubmdEb0NoZWNrPWZ1bmN0aW9uKCl7aWYodGhpcy5faXRlcmFibGVEaWZmZXIpe3ZhciB0PXRoaXMuX2l0ZXJhYmxlRGlmZmVyLmRpZmYodGhpcy5fcmF3Q2xhc3MpO3QmJnRoaXMuX2FwcGx5SXRlcmFibGVDaGFuZ2VzKHQpfWVsc2UgaWYodGhpcy5fa2V5VmFsdWVEaWZmZXIpe3ZhciBlPXRoaXMuX2tleVZhbHVlRGlmZmVyLmRpZmYodGhpcy5fcmF3Q2xhc3MpO2UmJnRoaXMuX2FwcGx5S2V5VmFsdWVDaGFuZ2VzKGUpfX0sdC5wcm90b3R5cGUuX2FwcGx5S2V5VmFsdWVDaGFuZ2VzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dC5mb3JFYWNoQWRkZWRJdGVtKGZ1bmN0aW9uKHQpe3JldHVybiBlLl90b2dnbGVDbGFzcyh0LmtleSx0LmN1cnJlbnRWYWx1ZSl9KSx0LmZvckVhY2hDaGFuZ2VkSXRlbShmdW5jdGlvbih0KXtyZXR1cm4gZS5fdG9nZ2xlQ2xhc3ModC5rZXksdC5jdXJyZW50VmFsdWUpfSksdC5mb3JFYWNoUmVtb3ZlZEl0ZW0oZnVuY3Rpb24odCl7dC5wcmV2aW91c1ZhbHVlJiZlLl90b2dnbGVDbGFzcyh0LmtleSwhMSl9KX0sdC5wcm90b3R5cGUuX2FwcGx5SXRlcmFibGVDaGFuZ2VzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dC5mb3JFYWNoQWRkZWRJdGVtKGZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciIT10eXBlb2YgdC5pdGVtKXRocm93IG5ldyBFcnJvcigiTmdDbGFzcyBjYW4gb25seSB0b2dnbGUgQ1NTIGNsYXNzZXMgZXhwcmVzc2VkIGFzIHN0cmluZ3MsIGdvdCAiK09iamVjdChyLmZiKSh0Lml0ZW0pKTtlLl90b2dnbGVDbGFzcyh0Lml0ZW0sITApfSksdC5mb3JFYWNoUmVtb3ZlZEl0ZW0oZnVuY3Rpb24odCl7cmV0dXJuIGUuX3RvZ2dsZUNsYXNzKHQuaXRlbSwhMSl9KX0sdC5wcm90b3R5cGUuX2FwcGx5Q2xhc3Nlcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3QmJihBcnJheS5pc0FycmF5KHQpfHx0IGluc3RhbmNlb2YgU2V0P3QuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5fdG9nZ2xlQ2xhc3ModCwhMCl9KTpPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3JldHVybiBlLl90b2dnbGVDbGFzcyhuLCEhdFtuXSl9KSl9LHQucHJvdG90eXBlLl9yZW1vdmVDbGFzc2VzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dCYmKEFycmF5LmlzQXJyYXkodCl8fHQgaW5zdGFuY2VvZiBTZXQ/dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLl90b2dnbGVDbGFzcyh0LCExKX0pOk9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUuX3RvZ2dsZUNsYXNzKHQsITEpfSkpfSx0LnByb3RvdHlwZS5fdG9nZ2xlQ2xhc3M9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzOyh0PXQudHJpbSgpKSYmdC5zcGxpdCgvXHMrL2cpLmZvckVhY2goZnVuY3Rpb24odCl7ZT9uLl9yZW5kZXJlci5hZGRDbGFzcyhuLl9uZ0VsLm5hdGl2ZUVsZW1lbnQsdCk6bi5fcmVuZGVyZXIucmVtb3ZlQ2xhc3Mobi5fbmdFbC5uYXRpdmVFbGVtZW50LHQpfSl9LHR9KCkseD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4scil7dGhpcy4kaW1wbGljaXQ9dCx0aGlzLm5nRm9yT2Y9ZSx0aGlzLmluZGV4PW4sdGhpcy5jb3VudD1yfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImZpcnN0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmluZGV4fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibGFzdCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluZGV4PT09dGhpcy5jb3VudC0xfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZXZlbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluZGV4JTI9PTB9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJvZGQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ldmVufSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHR9KCksTz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMuX3ZpZXdDb250YWluZXI9dCx0aGlzLl90ZW1wbGF0ZT1lLHRoaXMuX2RpZmZlcnM9bix0aGlzLl9kaWZmZXI9bnVsbH1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJuZ0ZvclRyYWNrQnkiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdHJhY2tCeUZufSxzZXQ6ZnVuY3Rpb24odCl7T2JqZWN0KHIuVykoKSYmbnVsbCE9dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQmJmNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKCJ0cmFja0J5IG11c3QgYmUgYSBmdW5jdGlvbiwgYnV0IHJlY2VpdmVkICIrSlNPTi5zdHJpbmdpZnkodCkrIi4gU2VlIGh0dHBzOi8vYW5ndWxhci5pby9kb2NzL3RzL2xhdGVzdC9hcGkvY29tbW9uL2luZGV4L05nRm9yLWRpcmVjdGl2ZS5odG1sIyEjY2hhbmdlLXByb3BhZ2F0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLiIpLHRoaXMuX3RyYWNrQnlGbj10fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibmdGb3JUZW1wbGF0ZSIse3NldDpmdW5jdGlvbih0KXt0JiYodGhpcy5fdGVtcGxhdGU9dCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUubmdPbkNoYW5nZXM9ZnVuY3Rpb24odCl7aWYoIm5nRm9yT2YiaW4gdCl7dmFyIGU9dC5uZ0Zvck9mLmN1cnJlbnRWYWx1ZTtpZighdGhpcy5fZGlmZmVyJiZlKXRyeXt0aGlzLl9kaWZmZXI9dGhpcy5fZGlmZmVycy5maW5kKGUpLmNyZWF0ZSh0aGlzLm5nRm9yVHJhY2tCeSl9Y2F0Y2godCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnIitlKyInIG9mIHR5cGUgJyIrKChuPWUpLm5hbWV8fHR5cGVvZiBuKSsiJy4gTmdGb3Igb25seSBzdXBwb3J0cyBiaW5kaW5nIHRvIEl0ZXJhYmxlcyBzdWNoIGFzIEFycmF5cy4iKX19dmFyIG59LHQucHJvdG90eXBlLm5nRG9DaGVjaz1mdW5jdGlvbigpe2lmKHRoaXMuX2RpZmZlcil7dmFyIHQ9dGhpcy5fZGlmZmVyLmRpZmYodGhpcy5uZ0Zvck9mKTt0JiZ0aGlzLl9hcHBseUNoYW5nZXModCl9fSx0LnByb3RvdHlwZS5fYXBwbHlDaGFuZ2VzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1bXTt0LmZvckVhY2hPcGVyYXRpb24oZnVuY3Rpb24odCxyLGkpe2lmKG51bGw9PXQucHJldmlvdXNJbmRleCl7dmFyIG89ZS5fdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcoZS5fdGVtcGxhdGUsbmV3IHgobnVsbCxlLm5nRm9yT2YsLTEsLTEpLGkpLGE9bmV3IEModCxvKTtuLnB1c2goYSl9ZWxzZSBudWxsPT1pP2UuX3ZpZXdDb250YWluZXIucmVtb3ZlKHIpOihvPWUuX3ZpZXdDb250YWluZXIuZ2V0KHIpLGUuX3ZpZXdDb250YWluZXIubW92ZShvLGkpLGE9bmV3IEModCxvKSxuLnB1c2goYSkpfSk7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspdGhpcy5fcGVyVmlld0NoYW5nZShuW3JdLnZpZXcsbltyXS5yZWNvcmQpO3I9MDtmb3IodmFyIGk9dGhpcy5fdmlld0NvbnRhaW5lci5sZW5ndGg7cjxpO3IrKyl7dmFyIG89dGhpcy5fdmlld0NvbnRhaW5lci5nZXQocik7by5jb250ZXh0LmluZGV4PXIsby5jb250ZXh0LmNvdW50PWksby5jb250ZXh0Lm5nRm9yT2Y9dGhpcy5uZ0Zvck9mfXQuZm9yRWFjaElkZW50aXR5Q2hhbmdlKGZ1bmN0aW9uKHQpe2UuX3ZpZXdDb250YWluZXIuZ2V0KHQuY3VycmVudEluZGV4KS5jb250ZXh0LiRpbXBsaWNpdD10Lml0ZW19KX0sdC5wcm90b3R5cGUuX3BlclZpZXdDaGFuZ2U9ZnVuY3Rpb24odCxlKXt0LmNvbnRleHQuJGltcGxpY2l0PWUuaXRlbX0sdH0oKSxDPWZ1bmN0aW9uKHQsZSl7dGhpcy5yZWNvcmQ9dCx0aGlzLnZpZXc9ZX0sUz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl92aWV3Q29udGFpbmVyPXQsdGhpcy5fY29udGV4dD1uZXcgRSx0aGlzLl90aGVuVGVtcGxhdGVSZWY9bnVsbCx0aGlzLl9lbHNlVGVtcGxhdGVSZWY9bnVsbCx0aGlzLl90aGVuVmlld1JlZj1udWxsLHRoaXMuX2Vsc2VWaWV3UmVmPW51bGwsdGhpcy5fdGhlblRlbXBsYXRlUmVmPWV9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibmdJZiIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9jb250ZXh0LiRpbXBsaWNpdD10aGlzLl9jb250ZXh0Lm5nSWY9dCx0aGlzLl91cGRhdGVWaWV3KCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJuZ0lmVGhlbiIse3NldDpmdW5jdGlvbih0KXtrKCJuZ0lmVGhlbiIsdCksdGhpcy5fdGhlblRlbXBsYXRlUmVmPXQsdGhpcy5fdGhlblZpZXdSZWY9bnVsbCx0aGlzLl91cGRhdGVWaWV3KCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJuZ0lmRWxzZSIse3NldDpmdW5jdGlvbih0KXtrKCJuZ0lmRWxzZSIsdCksdGhpcy5fZWxzZVRlbXBsYXRlUmVmPXQsdGhpcy5fZWxzZVZpZXdSZWY9bnVsbCx0aGlzLl91cGRhdGVWaWV3KCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuX3VwZGF0ZVZpZXc9ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LiRpbXBsaWNpdD90aGlzLl90aGVuVmlld1JlZnx8KHRoaXMuX3ZpZXdDb250YWluZXIuY2xlYXIoKSx0aGlzLl9lbHNlVmlld1JlZj1udWxsLHRoaXMuX3RoZW5UZW1wbGF0ZVJlZiYmKHRoaXMuX3RoZW5WaWV3UmVmPXRoaXMuX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3RoZW5UZW1wbGF0ZVJlZix0aGlzLl9jb250ZXh0KSkpOnRoaXMuX2Vsc2VWaWV3UmVmfHwodGhpcy5fdmlld0NvbnRhaW5lci5jbGVhcigpLHRoaXMuX3RoZW5WaWV3UmVmPW51bGwsdGhpcy5fZWxzZVRlbXBsYXRlUmVmJiYodGhpcy5fZWxzZVZpZXdSZWY9dGhpcy5fdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fZWxzZVRlbXBsYXRlUmVmLHRoaXMuX2NvbnRleHQpKSl9LHR9KCksRT1mdW5jdGlvbigpe3RoaXMuJGltcGxpY2l0PW51bGwsdGhpcy5uZ0lmPW51bGx9O2Z1bmN0aW9uIGsodCxlKXtpZihlJiYhZS5jcmVhdGVFbWJlZGRlZFZpZXcpdGhyb3cgbmV3IEVycm9yKHQrIiBtdXN0IGJlIGEgVGVtcGxhdGVSZWYsIGJ1dCByZWNlaXZlZCAnIitPYmplY3Qoci5mYikoZSkrIicuIil9dmFyIFQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt0aGlzLl9kaWZmZXJzPXQsdGhpcy5fbmdFbD1lLHRoaXMuX3JlbmRlcmVyPW59cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibmdTdHlsZSIse3NldDpmdW5jdGlvbih0KXt0aGlzLl9uZ1N0eWxlPXQsIXRoaXMuX2RpZmZlciYmdCYmKHRoaXMuX2RpZmZlcj10aGlzLl9kaWZmZXJzLmZpbmQodCkuY3JlYXRlKCkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLm5nRG9DaGVjaz1mdW5jdGlvbigpe2lmKHRoaXMuX2RpZmZlcil7dmFyIHQ9dGhpcy5fZGlmZmVyLmRpZmYodGhpcy5fbmdTdHlsZSk7dCYmdGhpcy5fYXBwbHlDaGFuZ2VzKHQpfX0sdC5wcm90b3R5cGUuX2FwcGx5Q2hhbmdlcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3QuZm9yRWFjaFJlbW92ZWRJdGVtKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9zZXRTdHlsZSh0LmtleSxudWxsKX0pLHQuZm9yRWFjaEFkZGVkSXRlbShmdW5jdGlvbih0KXtyZXR1cm4gZS5fc2V0U3R5bGUodC5rZXksdC5jdXJyZW50VmFsdWUpfSksdC5mb3JFYWNoQ2hhbmdlZEl0ZW0oZnVuY3Rpb24odCl7cmV0dXJuIGUuX3NldFN0eWxlKHQua2V5LHQuY3VycmVudFZhbHVlKX0pfSx0LnByb3RvdHlwZS5fc2V0U3R5bGU9ZnVuY3Rpb24odCxlKXt2YXIgbj1PYmplY3QoaS5jKSh0LnNwbGl0KCIuIiksMikscj1uWzBdLG89blsxXTtudWxsIT0oZT1udWxsIT1lJiZvPyIiK2UrbzplKT90aGlzLl9yZW5kZXJlci5zZXRTdHlsZSh0aGlzLl9uZ0VsLm5hdGl2ZUVsZW1lbnQscixlKTp0aGlzLl9yZW5kZXJlci5yZW1vdmVTdHlsZSh0aGlzLl9uZ0VsLm5hdGl2ZUVsZW1lbnQscil9LHR9KCksST1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmNyZWF0ZVN1YnNjcmlwdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiB0LnN1YnNjcmliZSh7bmV4dDplLGVycm9yOmZ1bmN0aW9uKHQpe3Rocm93IHR9fSl9LHQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24odCl7dC51bnN1YnNjcmliZSgpfSx0LnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24odCl7dC51bnN1YnNjcmliZSgpfSx0fSgpLEE9bmV3KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuY3JlYXRlU3Vic2NyaXB0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudGhlbihlLGZ1bmN0aW9uKHQpe3Rocm93IHR9KX0sdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbih0KXt9LHQucHJvdG90eXBlLm9uRGVzdHJveT1mdW5jdGlvbih0KXt9LHR9KCkpLGo9bmV3IEksUD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5fcmVmPXQsdGhpcy5fbGF0ZXN0VmFsdWU9bnVsbCx0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlPW51bGwsdGhpcy5fc3Vic2NyaXB0aW9uPW51bGwsdGhpcy5fb2JqPW51bGwsdGhpcy5fc3RyYXRlZ3k9bnVsbH1yZXR1cm4gdC5wcm90b3R5cGUubmdPbkRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9zdWJzY3JpcHRpb24mJnRoaXMuX2Rpc3Bvc2UoKX0sdC5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vYmo/dCE9PXRoaXMuX29iaj8odGhpcy5fZGlzcG9zZSgpLHRoaXMudHJhbnNmb3JtKHQpKTp0aGlzLl9sYXRlc3RWYWx1ZT09PXRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWU/dGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZToodGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZT10aGlzLl9sYXRlc3RWYWx1ZSxyLlAud3JhcCh0aGlzLl9sYXRlc3RWYWx1ZSkpOih0JiZ0aGlzLl9zdWJzY3JpYmUodCksdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZT10aGlzLl9sYXRlc3RWYWx1ZSx0aGlzLl9sYXRlc3RWYWx1ZSl9LHQucHJvdG90eXBlLl9zdWJzY3JpYmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLl9vYmo9dCx0aGlzLl9zdHJhdGVneT10aGlzLl9zZWxlY3RTdHJhdGVneSh0KSx0aGlzLl9zdWJzY3JpcHRpb249dGhpcy5fc3RyYXRlZ3kuY3JlYXRlU3Vic2NyaXB0aW9uKHQsZnVuY3Rpb24obil7cmV0dXJuIGUuX3VwZGF0ZUxhdGVzdFZhbHVlKHQsbil9KX0sdC5wcm90b3R5cGUuX3NlbGVjdFN0cmF0ZWd5PWZ1bmN0aW9uKGUpe2lmKE9iamVjdChyLlRhKShlKSlyZXR1cm4gQTtpZihPYmplY3Qoci5TYSkoZSkpcmV0dXJuIGo7dGhyb3cgbj10LEVycm9yKCJJbnZhbGlkUGlwZUFyZ3VtZW50OiAnIitlKyInIGZvciBwaXBlICciK09iamVjdChyLmZiKShuKSsiJyIpO3ZhciBufSx0LnByb3RvdHlwZS5fZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX3N0cmF0ZWd5LmRpc3Bvc2UodGhpcy5fc3Vic2NyaXB0aW9uKSx0aGlzLl9sYXRlc3RWYWx1ZT1udWxsLHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWU9bnVsbCx0aGlzLl9zdWJzY3JpcHRpb249bnVsbCx0aGlzLl9vYmo9bnVsbH0sdC5wcm90b3R5cGUuX3VwZGF0ZUxhdGVzdFZhbHVlPWZ1bmN0aW9uKHQsZSl7dD09PXRoaXMuX29iaiYmKHRoaXMuX2xhdGVzdFZhbHVlPWUsdGhpcy5fcmVmLm1hcmtGb3JDaGVjaygpKX0sdH0oKSxNPWZ1bmN0aW9uKCl7fSxOPW5ldyByLm8oIkRvY3VtZW50VG9rZW4iKSxSPSJicm93c2VyIixEPSJzZXJ2ZXIiO2Z1bmN0aW9uIEwodCl7cmV0dXJuIHQ9PT1SfWZ1bmN0aW9uIEYodCl7cmV0dXJuIHQ9PT1EfX0sSmNSdjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIHI9bigieFRsYSIpLGk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPXRbci5hXSgpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuLnN1YnNjcmliZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJQcm92aWRlZCBvYmplY3QgZG9lcyBub3QgY29ycmVjdGx5IGltcGxlbWVudCBTeW1ib2wub2JzZXJ2YWJsZSIpO3JldHVybiBuLnN1YnNjcmliZShlKX19fSxLOUlhOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSxuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gZn0pO3ZhciByPW4oIm1yU0ciKSxpPW4oIjZibEYiKSxvPW4oIkZGT28iKSxhPW4oInB1Z1QiKSxzPW4oIjhnOEEiKSx1PW4oInVNYU8iKSxsPW4oIkwvVjkiKSxjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIG4uZGVzdGluYXRpb249ZSxufXJldHVybiByLmIoZSx0KSxlfShvLmEpLGY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5vYnNlcnZlcnM9W10sZS5jbG9zZWQ9ITEsZS5pc1N0b3BwZWQ9ITEsZS5oYXNFcnJvcj0hMSxlLnRocm93bkVycm9yPW51bGwsZX1yZXR1cm4gci5iKGUsdCksZS5wcm90b3R5cGVbbC5hXT1mdW5jdGlvbigpe3JldHVybiBuZXcgYyh0aGlzKX0sZS5wcm90b3R5cGUubGlmdD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgaCh0aGlzLHRoaXMpO3JldHVybiBlLm9wZXJhdG9yPXQsZX0sZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbih0KXtpZih0aGlzLmNsb3NlZCl0aHJvdyBuZXcgcy5hO2lmKCF0aGlzLmlzU3RvcHBlZClmb3IodmFyIGU9dGhpcy5vYnNlcnZlcnMsbj1lLmxlbmd0aCxyPWUuc2xpY2UoKSxpPTA7aTxuO2krKylyW2ldLm5leHQodCl9LGUucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKHQpe2lmKHRoaXMuY2xvc2VkKXRocm93IG5ldyBzLmE7dGhpcy5oYXNFcnJvcj0hMCx0aGlzLnRocm93bkVycm9yPXQsdGhpcy5pc1N0b3BwZWQ9ITA7Zm9yKHZhciBlPXRoaXMub2JzZXJ2ZXJzLG49ZS5sZW5ndGgscj1lLnNsaWNlKCksaT0wO2k8bjtpKyspcltpXS5lcnJvcih0KTt0aGlzLm9ic2VydmVycy5sZW5ndGg9MH0sZS5wcm90b3R5cGUuY29tcGxldGU9ZnVuY3Rpb24oKXtpZih0aGlzLmNsb3NlZCl0aHJvdyBuZXcgcy5hO3RoaXMuaXNTdG9wcGVkPSEwO2Zvcih2YXIgdD10aGlzLm9ic2VydmVycyxlPXQubGVuZ3RoLG49dC5zbGljZSgpLHI9MDtyPGU7cisrKW5bcl0uY29tcGxldGUoKTt0aGlzLm9ic2VydmVycy5sZW5ndGg9MH0sZS5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oKXt0aGlzLmlzU3RvcHBlZD0hMCx0aGlzLmNsb3NlZD0hMCx0aGlzLm9ic2VydmVycz1udWxsfSxlLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuY2xvc2VkKXRocm93IG5ldyBzLmE7cmV0dXJuIHQucHJvdG90eXBlLl90cnlTdWJzY3JpYmUuY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5fc3Vic2NyaWJlPWZ1bmN0aW9uKHQpe2lmKHRoaXMuY2xvc2VkKXRocm93IG5ldyBzLmE7cmV0dXJuIHRoaXMuaGFzRXJyb3I/KHQuZXJyb3IodGhpcy50aHJvd25FcnJvciksYS5hLkVNUFRZKTp0aGlzLmlzU3RvcHBlZD8odC5jb21wbGV0ZSgpLGEuYS5FTVBUWSk6KHRoaXMub2JzZXJ2ZXJzLnB1c2godCksbmV3IHUuYSh0aGlzLHQpKX0sZS5wcm90b3R5cGUuYXNPYnNlcnZhYmxlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGkuYTtyZXR1cm4gdC5zb3VyY2U9dGhpcyx0fSxlLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgaCh0LGUpfSxlfShpLmEpLGg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciByPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gci5kZXN0aW5hdGlvbj1lLHIuc291cmNlPW4scn1yZXR1cm4gci5iKGUsdCksZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmRlc3RpbmF0aW9uO2UmJmUubmV4dCYmZS5uZXh0KHQpfSxlLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmRlc3RpbmF0aW9uO2UmJmUuZXJyb3ImJnRoaXMuZGVzdGluYXRpb24uZXJyb3IodCl9LGUucHJvdG90eXBlLmNvbXBsZXRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kZXN0aW5hdGlvbjt0JiZ0LmNvbXBsZXRlJiZ0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCl9LGUucHJvdG90eXBlLl9zdWJzY3JpYmU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc291cmNlP3RoaXMuc291cmNlLnN1YnNjcmliZSh0KTphLmEuRU1QVFl9LGV9KGYpfSwiTC9WOSI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pO3ZhciByPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wuZm9yP1N5bWJvbC5mb3IoInJ4U3Vic2NyaWJlciIpOiJAQHJ4U3Vic2NyaWJlciJ9LExDNXA6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pLG4oIm42Z0ciKTt2YXIgcj1mdW5jdGlvbigpe319LE1HQlM6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pO3ZhciByPW4oIm1yU0ciKSxpPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiByLmIoZSx0KSxlLnByb3RvdHlwZS5ub3RpZnlOZXh0PWZ1bmN0aW9uKHQsZSxuLHIsaSl7dGhpcy5kZXN0aW5hdGlvbi5uZXh0KGUpfSxlLnByb3RvdHlwZS5ub3RpZnlFcnJvcj1mdW5jdGlvbih0LGUpe3RoaXMuZGVzdGluYXRpb24uZXJyb3IodCl9LGUucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlPWZ1bmN0aW9uKHQpe3RoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKX0sZX0obigiRkZPbyIpLmEpfSxNY1NvOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fW4uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiByfSl9LCJNaG0rIjpmdW5jdGlvbihtb2R1bGUsX193ZWJwYWNrX2V4cG9ydHNfXyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7X193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sImEiLGZ1bmN0aW9uKCl7cmV0dXJuIENodW5rTG9hZGVyU2VydmljZX0pO3ZhciByeGpzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX189X193ZWJwYWNrX3JlcXVpcmVfXygiMC91USIpLF9wYWdlX2NodW5rX3JlY29yZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fPV9fd2VicGFja19yZXF1aXJlX18oInJmMzAiKSxfZW52aXJvbm1lbnRzX2Vudmlyb25tZW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX189X193ZWJwYWNrX3JlcXVpcmVfXygiQXl0UiIpLF9hbmd1bGFyX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKCJDY25HIiksX2FuZ3VsYXJfY29tbW9uX2h0dHBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKCJ0L05hIiksQ2h1bmtMb2FkZXJTZXJ2aWNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQ2h1bmtMb2FkZXJTZXJ2aWNlKHQpe3ZhciBlPXRoaXM7dGhpcy5odHRwPXQsdGhpcy5yZWNvcmRzPV9wYWdlX2NodW5rX3JlY29yZF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fLmEsMCE9X2Vudmlyb25tZW50c19lbnZpcm9ubWVudF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fLmEucHJvZHVjdGlvbiYmdGhpcy5yZWNvcmRzLmZvckVhY2goZnVuY3Rpb24odCl7c2V0VGltZW91dChmdW5jdGlvbigpe2UubG9hZFBhZ2VDaHVuayh0LnBhZ2VOYW1lLGZ1bmN0aW9uKCl7fSl9KX0pfXJldHVybiBDaHVua0xvYWRlclNlcnZpY2UucHJvdG90eXBlLmFzeW5jTG9hZFBhZ2VDaHVuaz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49bmV3IFByb21pc2UoZnVuY3Rpb24obixyKXt2YXIgaT1lLnJlY29yZHMuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYWdlTmFtZT09dH0pO3ZvaWQgMCE9aT8oY29uc29sZS5sb2coIkxvYWRpbmcgOiAiK2kucGFnZU5hbWUrIiAoIitpLmNodW5rVVJMKyIsICIraS5jaHVua0xvYWRlZCsiKSBbQXN5bmNdIiksMD09aS5jaHVua0xvYWRlZD9lLmh0dHAuZ2V0KGkuY2h1bmtVUkwse3Jlc3BvbnNlVHlwZToidGV4dCJ9KS5zdWJzY3JpYmUoZnVuY3Rpb24odCl7cmV0dXJuIGUuYXN5bmNMb2FkRGF0YUNodW5rKHQsaSxuKX0sZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUubG9nKHQpfSk6bighMCkpOm4oITApfSk7cmV0dXJuIE9iamVjdChyeGpzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uYSkobil9LENodW5rTG9hZGVyU2VydmljZS5wcm90b3R5cGUubG9hZFBhZ2VDaHVuaz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLnJlY29yZHMuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYWdlTmFtZT09dH0pO3ZvaWQgMCE9cj8oY29uc29sZS5sb2coIkxvYWRpbmcgOiAiK3IucGFnZU5hbWUrIiAoIityLmNodW5rVVJMKyIpIiksMD09ci5jaHVua0xvYWRlZD90aGlzLmh0dHAuZ2V0KHIuY2h1bmtVUkwse3Jlc3BvbnNlVHlwZToidGV4dCJ9KS5zdWJzY3JpYmUoZnVuY3Rpb24odCl7cmV0dXJuIG4ubG9hZERhdGFDaHVuayh0LGUscil9LGZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLmxvZyh0KX0pOmUoKSk6ZSgpfSxDaHVua0xvYWRlclNlcnZpY2UucHJvdG90eXBlLmxvYWREYXRhQ2h1bms9ZnVuY3Rpb24oYmFzZTY0ZGF0YSxjYWxsYmFjayxyZWNvcmQpe3ZhciBkZWNvZGVkRGF0YT1hdG9iKGJhc2U2NGRhdGEpO2V2YWwoZGVjb2RlZERhdGEpLHJlY29yZC5jaHVua0xvYWRlZD0hMCxjb25zb2xlLmxvZygiTG9hZGVkIDogIityZWNvcmQucGFnZU5hbWUrIiAoIityZWNvcmQuY2h1bmtVUkwrIikiKSxjYWxsYmFjaygpfSxDaHVua0xvYWRlclNlcnZpY2UucHJvdG90eXBlLmFzeW5jTG9hZERhdGFDaHVuaz1mdW5jdGlvbihiYXNlNjRkYXRhLHJlY29yZCxyZXNvbHZlKXt2YXIgZGVjb2RlZERhdGE9YXRvYihiYXNlNjRkYXRhKTtldmFsKGRlY29kZWREYXRhKSxyZWNvcmQuY2h1bmtMb2FkZWQ9ITAsY29uc29sZS5sb2coIkxvYWRlZCA6ICIrcmVjb3JkLnBhZ2VOYW1lKyIgKCIrcmVjb3JkLmNodW5rVVJMKyIpIFtBc3luY10iKSxyZXNvbHZlKCEwKX0sQ2h1bmtMb2FkZXJTZXJ2aWNlLm5nSW5qZWN0YWJsZURlZj1fYW5ndWxhcl9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX18uUih7ZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiBuZXcgQ2h1bmtMb2FkZXJTZXJ2aWNlKF9hbmd1bGFyX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXy5WKF9hbmd1bGFyX2NvbW1vbl9odHRwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18uYykpfSx0b2tlbjpDaHVua0xvYWRlclNlcnZpY2UscHJvdmlkZWRJbjoicm9vdCJ9KSxDaHVua0xvYWRlclNlcnZpY2V9KCl9LCJNcitYIjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBpfSksbi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KTt2YXIgcj1uKCJDY25HIiksaT0obigiU01zbSIpLG4oIkZ6cWMiKSxuKCJXZjRwIiksci5NYSh7ZW5jYXBzdWxhdGlvbjoyLHN0eWxlczpbIi5tYXQtaWNvbntiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmlsbDpjdXJyZW50Q29sb3I7aGVpZ2h0OjI0cHg7d2lkdGg6MjRweH0ubWF0LWljb24ubWF0LWljb24taW5saW5le2ZvbnQtc2l6ZTppbmhlcml0O2hlaWdodDppbmhlcml0O2xpbmUtaGVpZ2h0OmluaGVyaXQ7d2lkdGg6aW5oZXJpdH1bZGlyPXJ0bF0gLm1hdC1pY29uLXJ0bC1taXJyb3J7dHJhbnNmb3JtOnNjYWxlKC0xLDEpfS5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb257ZGlzcGxheTpibG9ja30ubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbnttYXJnaW46YXV0b30iXSxkYXRhOnt9fSkpO2Z1bmN0aW9uIG8odCl7cmV0dXJuIHIuaWIoMixbci5YYShudWxsLDApXSxudWxsLG51bGwpfX0sTlNZTDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBrfSksbi5kKGUsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIGd0fSksbi5kKGUsImciLGZ1bmN0aW9uKCl7cmV0dXJuIHZ0fSksbi5kKGUsImUiLGZ1bmN0aW9uKCl7cmV0dXJuIEV9KSxuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gWXR9KSxuLmQoZSwiZCIsZnVuY3Rpb24oKXtyZXR1cm4gYWV9KSxuLmQoZSwiZiIsZnVuY3Rpb24oKXtyZXR1cm4gdWV9KSxuLmQoZSwiaCIsZnVuY3Rpb24oKXtyZXR1cm4gbGV9KTt2YXIgcj1uKCJtclNHIiksaT1uKCJpaFlZIik7ZnVuY3Rpb24gbygpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2Vzc31mdW5jdGlvbiBhKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgaS5kO2Nhc2UgMTpyZXR1cm4gdFswXTtkZWZhdWx0OnJldHVybiBuZXcgaS5uKHQpfX1mdW5jdGlvbiBzKHQsZSxuLHIsbyxhKXt2b2lkIDA9PT1vJiYobz17fSksdm9pZCAwPT09YSYmKGE9e30pO3ZhciBzPVtdLHU9W10sbD0tMSxjPW51bGw7aWYoci5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXQub2Zmc2V0LHI9bj09bCxmPXImJmN8fHt9O09iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24obil7dmFyIHI9bix1PXRbbl07aWYoIm9mZnNldCIhPT1uKXN3aXRjaChyPWUubm9ybWFsaXplUHJvcGVydHlOYW1lKHIscyksdSl7Y2FzZSBpLm86dT1vW25dO2JyZWFrO2Nhc2UgaS5hOnU9YVtuXTticmVhaztkZWZhdWx0OnU9ZS5ub3JtYWxpemVTdHlsZVZhbHVlKG4scix1LHMpfWZbcl09dX0pLHJ8fHUucHVzaChmKSxjPWYsbD1ufSkscy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gYW5pbWF0ZSBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcnM6XG4gLSAiK3Muam9pbigiXG4gLSAiKSk7cmV0dXJuIHV9ZnVuY3Rpb24gdSh0LGUsbixyKXtzd2l0Y2goZSl7Y2FzZSJzdGFydCI6dC5vblN0YXJ0KGZ1bmN0aW9uKCl7cmV0dXJuIHIobiYmbChuLCJzdGFydCIsdCkpfSk7YnJlYWs7Y2FzZSJkb25lIjp0Lm9uRG9uZShmdW5jdGlvbigpe3JldHVybiByKG4mJmwobiwiZG9uZSIsdCkpfSk7YnJlYWs7Y2FzZSJkZXN0cm95Ijp0Lm9uRGVzdHJveShmdW5jdGlvbigpe3JldHVybiByKG4mJmwobiwiZGVzdHJveSIsdCkpfSl9fWZ1bmN0aW9uIGwodCxlLG4pe3ZhciByPW4udG90YWxUaW1lLGk9Yyh0LmVsZW1lbnQsdC50cmlnZ2VyTmFtZSx0LmZyb21TdGF0ZSx0LnRvU3RhdGUsZXx8dC5waGFzZU5hbWUsdm9pZCAwPT1yP3QudG90YWxUaW1lOnIsISFuLmRpc2FibGVkKSxvPXQuX2RhdGE7cmV0dXJuIG51bGwhPW8mJihpLl9kYXRhPW8pLGl9ZnVuY3Rpb24gYyh0LGUsbixyLGksbyxhKXtyZXR1cm4gdm9pZCAwPT09aSYmKGk9IiIpLHZvaWQgMD09PW8mJihvPTApLHtlbGVtZW50OnQsdHJpZ2dlck5hbWU6ZSxmcm9tU3RhdGU6bix0b1N0YXRlOnIscGhhc2VOYW1lOmksdG90YWxUaW1lOm8sZGlzYWJsZWQ6ISFhfX1mdW5jdGlvbiBmKHQsZSxuKXt2YXIgcjtyZXR1cm4gdCBpbnN0YW5jZW9mIE1hcD8ocj10LmdldChlKSl8fHQuc2V0KGUscj1uKToocj10W2VdKXx8KHI9dFtlXT1uKSxyfWZ1bmN0aW9uIGgodCl7dmFyIGU9dC5pbmRleE9mKCI6Iik7cmV0dXJuW3Quc3Vic3RyaW5nKDEsZSksdC5zdWJzdHIoZSsxKV19dmFyIGQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4hMX0scD1mdW5jdGlvbih0LGUpe3JldHVybiExfSxtPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bXX0seT1vKCk7aWYoeXx8InVuZGVmaW5lZCIhPXR5cGVvZiBFbGVtZW50KXtpZihkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuY29udGFpbnMoZSl9LHl8fEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMpcD1mdW5jdGlvbih0LGUpe3JldHVybiB0Lm1hdGNoZXMoZSl9O2Vsc2V7dmFyIGc9RWxlbWVudC5wcm90b3R5cGUsdj1nLm1hdGNoZXNTZWxlY3Rvcnx8Zy5tb3pNYXRjaGVzU2VsZWN0b3J8fGcubXNNYXRjaGVzU2VsZWN0b3J8fGcub01hdGNoZXNTZWxlY3Rvcnx8Zy53ZWJraXRNYXRjaGVzU2VsZWN0b3I7diYmKHA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdi5hcHBseSh0LFtlXSl9KX1tPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1bXTtpZihuKWkucHVzaC5hcHBseShpLE9iamVjdChyLmQpKHQucXVlcnlTZWxlY3RvckFsbChlKSkpO2Vsc2V7dmFyIG89dC5xdWVyeVNlbGVjdG9yKGUpO28mJmkucHVzaChvKX1yZXR1cm4gaX19dmFyIGI9bnVsbCxfPSExO2Z1bmN0aW9uIHcodCl7Ynx8KGI9KCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQ/ZG9jdW1lbnQuYm9keTpudWxsKXx8e30sXz0hIWIuc3R5bGUmJiJXZWJraXRBcHBlYXJhbmNlImluIGIuc3R5bGUpO3ZhciBlPSEwO3JldHVybiBiLnN0eWxlJiYhZnVuY3Rpb24odCl7cmV0dXJuImVia2l0Ij09dC5zdWJzdHJpbmcoMSw2KX0odCkmJiEoZT10IGluIGIuc3R5bGUpJiZfJiYoZT0iV2Via2l0Iit0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpaW4gYi5zdHlsZSksZX12YXIgeD1wLE89ZCxDPW07ZnVuY3Rpb24gUyh0KXt2YXIgZT17fTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgcj1uLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csIiQxLSQyIik7ZVtyXT10W25dfSksZX12YXIgRT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLnZhbGlkYXRlU3R5bGVQcm9wZXJ0eT1mdW5jdGlvbih0KXtyZXR1cm4gdyh0KX0sdC5wcm90b3R5cGUubWF0Y2hlc0VsZW1lbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geCh0LGUpfSx0LnByb3RvdHlwZS5jb250YWluc0VsZW1lbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTyh0LGUpfSx0LnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIEModCxlLG4pfSx0LnByb3RvdHlwZS5jb21wdXRlU3R5bGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBufHwiIn0sdC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbih0LGUsbixyLG8sYSxzKXtyZXR1cm4gdm9pZCAwPT09YSYmKGE9W10pLG5ldyBpLmQobixyKX0sdH0oKSxrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5OT09QPW5ldyBFLHR9KCksVD0xZTM7ZnVuY3Rpb24gSSh0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7dmFyIGU9dC5tYXRjaCgvXigtP1tcLlxkXSspKG0/cykvKTtyZXR1cm4hZXx8ZS5sZW5ndGg8Mj8wOkEocGFyc2VGbG9hdChlWzFdKSxlWzJdKX1mdW5jdGlvbiBBKHQsZSl7c3dpdGNoKGUpe2Nhc2UicyI6cmV0dXJuIHQqVDtkZWZhdWx0OnJldHVybiB0fX1mdW5jdGlvbiBqKHQsZSxuKXtyZXR1cm4gdC5oYXNPd25Qcm9wZXJ0eSgiZHVyYXRpb24iKT90OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpPTAsbz0iIjtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBhPXQubWF0Y2goL14oLT9bXC5cZF0rKShtP3MpKD86XHMrKC0/W1wuXGRdKykobT9zKSk/KD86XHMrKFstYS16XSsoPzpcKC4rP1wpKT8pKT8kL2kpO2lmKG51bGw9PT1hKXJldHVybiBlLnB1c2goJ1RoZSBwcm92aWRlZCB0aW1pbmcgdmFsdWUgIicrdCsnIiBpcyBpbnZhbGlkLicpLHtkdXJhdGlvbjowLGRlbGF5OjAsZWFzaW5nOiIifTtyPUEocGFyc2VGbG9hdChhWzFdKSxhWzJdKTt2YXIgcz1hWzNdO251bGwhPXMmJihpPUEoTWF0aC5mbG9vcihwYXJzZUZsb2F0KHMpKSxhWzRdKSk7dmFyIHU9YVs1XTt1JiYobz11KX1lbHNlIHI9dDtpZighbil7dmFyIGw9ITEsYz1lLmxlbmd0aDtyPDAmJihlLnB1c2goIkR1cmF0aW9uIHZhbHVlcyBiZWxvdyAwIGFyZSBub3QgYWxsb3dlZCBmb3IgdGhpcyBhbmltYXRpb24gc3RlcC4iKSxsPSEwKSxpPDAmJihlLnB1c2goIkRlbGF5IHZhbHVlcyBiZWxvdyAwIGFyZSBub3QgYWxsb3dlZCBmb3IgdGhpcyBhbmltYXRpb24gc3RlcC4iKSxsPSEwKSxsJiZlLnNwbGljZShjLDAsJ1RoZSBwcm92aWRlZCB0aW1pbmcgdmFsdWUgIicrdCsnIiBpcyBpbnZhbGlkLicpfXJldHVybntkdXJhdGlvbjpyLGRlbGF5OmksZWFzaW5nOm99fSh0LGUsbil9ZnVuY3Rpb24gUCh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXtlW25dPXRbbl19KSxlfWZ1bmN0aW9uIE0odCxlLG4pe2lmKHZvaWQgMD09PW4mJihuPXt9KSxlKWZvcih2YXIgciBpbiB0KW5bcl09dFtyXTtlbHNlIFAodCxuKTtyZXR1cm4gbn1mdW5jdGlvbiBOKHQsZSxuKXtyZXR1cm4gbj9lKyI6IituKyI7IjoiIn1mdW5jdGlvbiBSKHQpe2Zvcih2YXIgZT0iIixuPTA7bjx0LnN0eWxlLmxlbmd0aDtuKyspZSs9TigwLHI9dC5zdHlsZS5pdGVtKG4pLHQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShyKSk7Zm9yKHZhciByIGluIHQuc3R5bGUpdC5zdHlsZS5oYXNPd25Qcm9wZXJ0eShyKSYmIXIuc3RhcnRzV2l0aCgiXyIpJiYoZSs9TigwLHIucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywiJDEtJDIiKS50b0xvd2VyQ2FzZSgpLHQuc3R5bGVbcl0pKTt0LnNldEF0dHJpYnV0ZSgic3R5bGUiLGUpfWZ1bmN0aW9uIEQodCxlKXt0LnN0eWxlJiYoT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgcj1XKG4pO3Quc3R5bGVbcl09ZVtuXX0pLG8oKSYmUih0KSl9ZnVuY3Rpb24gTCh0LGUpe3Quc3R5bGUmJihPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPVcoZSk7dC5zdHlsZVtuXT0iIn0pLG8oKSYmUih0KSl9ZnVuY3Rpb24gRih0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT8xPT10Lmxlbmd0aD90WzBdOk9iamVjdChpLmkpKHQpOnR9dmFyIFY9bmV3IFJlZ0V4cCgie3tcXHMqKC4rPylcXHMqfX0iLCJnIik7ZnVuY3Rpb24gVSh0KXt2YXIgZT1bXTtpZigic3RyaW5nIj09dHlwZW9mIHQpe2Zvcih2YXIgbj10LnRvU3RyaW5nKCkscj12b2lkIDA7cj1WLmV4ZWMobik7KWUucHVzaChyWzFdKTtWLmxhc3RJbmRleD0wfXJldHVybiBlfWZ1bmN0aW9uIHoodCxlLG4pe3ZhciByPXQudG9TdHJpbmcoKSxpPXIucmVwbGFjZShWLGZ1bmN0aW9uKHQscil7dmFyIGk9ZVtyXTtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eShyKXx8KG4ucHVzaCgiUGxlYXNlIHByb3ZpZGUgYSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBwYXJhbSAiK3IpLGk9IiIpLGkudG9TdHJpbmcoKX0pO3JldHVybiBpPT1yP3Q6aX1mdW5jdGlvbiBCKHQpe2Zvcih2YXIgZT1bXSxuPXQubmV4dCgpOyFuLmRvbmU7KWUucHVzaChuLnZhbHVlKSxuPXQubmV4dCgpO3JldHVybiBlfXZhciBIPS8tKyhbYS16MC05XSkvZztmdW5jdGlvbiBXKHQpe3JldHVybiB0LnJlcGxhY2UoSCxmdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gdFsxXS50b1VwcGVyQ2FzZSgpfSl9ZnVuY3Rpb24gcSh0LGUpe3JldHVybiAwPT09dHx8MD09PWV9ZnVuY3Rpb24gWSh0LGUsbil7dmFyIHI9T2JqZWN0LmtleXMobik7aWYoci5sZW5ndGgmJmUubGVuZ3RoKXt2YXIgaT1lWzBdLG89W107aWYoci5mb3JFYWNoKGZ1bmN0aW9uKHQpe2kuaGFzT3duUHJvcGVydHkodCl8fG8ucHVzaCh0KSxpW3RdPW5bdF19KSxvLmxlbmd0aClmb3IodmFyIGE9ZnVuY3Rpb24oKXt2YXIgbj1lW3NdO28uZm9yRWFjaChmdW5jdGlvbihlKXtuW2VdPVEodCxlKX0pfSxzPTE7czxlLmxlbmd0aDtzKyspYSgpfXJldHVybiBlfWZ1bmN0aW9uIEcodCxlLG4pe3N3aXRjaChlLnR5cGUpe2Nhc2UgNzpyZXR1cm4gdC52aXNpdFRyaWdnZXIoZSxuKTtjYXNlIDA6cmV0dXJuIHQudmlzaXRTdGF0ZShlLG4pO2Nhc2UgMTpyZXR1cm4gdC52aXNpdFRyYW5zaXRpb24oZSxuKTtjYXNlIDI6cmV0dXJuIHQudmlzaXRTZXF1ZW5jZShlLG4pO2Nhc2UgMzpyZXR1cm4gdC52aXNpdEdyb3VwKGUsbik7Y2FzZSA0OnJldHVybiB0LnZpc2l0QW5pbWF0ZShlLG4pO2Nhc2UgNTpyZXR1cm4gdC52aXNpdEtleWZyYW1lcyhlLG4pO2Nhc2UgNjpyZXR1cm4gdC52aXNpdFN0eWxlKGUsbik7Y2FzZSA4OnJldHVybiB0LnZpc2l0UmVmZXJlbmNlKGUsbik7Y2FzZSA5OnJldHVybiB0LnZpc2l0QW5pbWF0ZUNoaWxkKGUsbik7Y2FzZSAxMDpyZXR1cm4gdC52aXNpdEFuaW1hdGVSZWYoZSxuKTtjYXNlIDExOnJldHVybiB0LnZpc2l0UXVlcnkoZSxuKTtjYXNlIDEyOnJldHVybiB0LnZpc2l0U3RhZ2dlcihlLG4pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gcmVzb2x2ZSBhbmltYXRpb24gbWV0YWRhdGEgbm9kZSAjIitlLnR5cGUpfX1mdW5jdGlvbiBRKHQsZSl7cmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpW2VdfXZhciBLPSIqIixaPW5ldyBTZXQoWyJ0cnVlIiwiMSJdKSxYPW5ldyBTZXQoWyJmYWxzZSIsIjAiXSk7ZnVuY3Rpb24gJCh0LGUpe3ZhciBuPVouaGFzKHQpfHxYLmhhcyh0KSxyPVouaGFzKGUpfHxYLmhhcyhlKTtyZXR1cm4gZnVuY3Rpb24oaSxvKXt2YXIgYT10PT1LfHx0PT1pLHM9ZT09S3x8ZT09bztyZXR1cm4hYSYmbiYmImJvb2xlYW4iPT10eXBlb2YgaSYmKGE9aT9aLmhhcyh0KTpYLmhhcyh0KSksIXMmJnImJiJib29sZWFuIj09dHlwZW9mIG8mJihzPW8/Wi5oYXMoZSk6WC5oYXMoZSkpLGEmJnN9fXZhciBKPW5ldyBSZWdFeHAoInMqOnNlbGZzKiw/IiwiZyIpO2Z1bmN0aW9uIHR0KHQsZSxuKXtyZXR1cm4gbmV3IGV0KHQpLmJ1aWxkKGUsbil9dmFyIGV0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9kcml2ZXI9dH1yZXR1cm4gdC5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgbnQoZSk7cmV0dXJuIHRoaXMuX3Jlc2V0Q29udGV4dFN0eWxlVGltaW5nU3RhdGUobiksRyh0aGlzLEYodCksbil9LHQucHJvdG90eXBlLl9yZXNldENvbnRleHRTdHlsZVRpbWluZ1N0YXRlPWZ1bmN0aW9uKHQpe3QuY3VycmVudFF1ZXJ5U2VsZWN0b3I9IiIsdC5jb2xsZWN0ZWRTdHlsZXM9e30sdC5jb2xsZWN0ZWRTdHlsZXNbIiJdPXt9LHQuY3VycmVudFRpbWU9MH0sdC5wcm90b3R5cGUudmlzaXRUcmlnZ2VyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPWUucXVlcnlDb3VudD0wLGk9ZS5kZXBDb3VudD0wLG89W10sYT1bXTtyZXR1cm4iQCI9PXQubmFtZS5jaGFyQXQoMCkmJmUuZXJyb3JzLnB1c2goImFuaW1hdGlvbiB0cmlnZ2VycyBjYW5ub3QgYmUgcHJlZml4ZWQgd2l0aCBhbiBgQGAgc2lnbiAoZS5nLiB0cmlnZ2VyKCdAZm9vJywgWy4uLl0pKSIpLHQuZGVmaW5pdGlvbnMuZm9yRWFjaChmdW5jdGlvbih0KXtpZihuLl9yZXNldENvbnRleHRTdHlsZVRpbWluZ1N0YXRlKGUpLDA9PXQudHlwZSl7dmFyIHM9dCx1PXMubmFtZTt1LnRvU3RyaW5nKCkuc3BsaXQoL1xzKixccyovKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3MubmFtZT10LG8ucHVzaChuLnZpc2l0U3RhdGUocyxlKSl9KSxzLm5hbWU9dX1lbHNlIGlmKDE9PXQudHlwZSl7dmFyIGw9bi52aXNpdFRyYW5zaXRpb24odCxlKTtyKz1sLnF1ZXJ5Q291bnQsaSs9bC5kZXBDb3VudCxhLnB1c2gobCl9ZWxzZSBlLmVycm9ycy5wdXNoKCJvbmx5IHN0YXRlKCkgYW5kIHRyYW5zaXRpb24oKSBkZWZpbml0aW9ucyBjYW4gc2l0IGluc2lkZSBvZiBhIHRyaWdnZXIoKSIpfSkse3R5cGU6NyxuYW1lOnQubmFtZSxzdGF0ZXM6byx0cmFuc2l0aW9uczphLHF1ZXJ5Q291bnQ6cixkZXBDb3VudDppLG9wdGlvbnM6bnVsbH19LHQucHJvdG90eXBlLnZpc2l0U3RhdGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnZpc2l0U3R5bGUodC5zdHlsZXMsZSkscj10Lm9wdGlvbnMmJnQub3B0aW9ucy5wYXJhbXN8fG51bGw7aWYobi5jb250YWluc0R5bmFtaWNTdHlsZXMpe3ZhciBpPW5ldyBTZXQsbz1yfHx7fTtpZihuLnN0eWxlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKHJ0KHQpKXt2YXIgZT10O09iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7VShlW3RdKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe28uaGFzT3duUHJvcGVydHkodCl8fGkuYWRkKHQpfSl9KX19KSxpLnNpemUpe3ZhciBhPUIoaS52YWx1ZXMoKSk7ZS5lcnJvcnMucHVzaCgnc3RhdGUoIicrdC5uYW1lKyciLCAuLi4pIG11c3QgZGVmaW5lIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgdGhlIGZvbGxvd2luZyBzdHlsZSBzdWJzdGl0dXRpb25zOiAnK2Euam9pbigiLCAiKSl9fXJldHVybnt0eXBlOjAsbmFtZTp0Lm5hbWUsc3R5bGU6bixvcHRpb25zOnI/e3BhcmFtczpyfTpudWxsfX0sdC5wcm90b3R5cGUudmlzaXRUcmFuc2l0aW9uPWZ1bmN0aW9uKHQsZSl7ZS5xdWVyeUNvdW50PTAsZS5kZXBDb3VudD0wO3ZhciBuLHIsaSxvPUcodGhpcyxGKHQuYW5pbWF0aW9uKSxlKTtyZXR1cm57dHlwZToxLG1hdGNoZXJzOihuPXQuZXhwcixyPWUuZXJyb3JzLGk9W10sInN0cmluZyI9PXR5cGVvZiBuP24uc3BsaXQoL1xzKixccyovKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0LGUsbil7aWYoIjoiPT10WzBdKXt2YXIgcj1mdW5jdGlvbih0LGUpe3N3aXRjaCh0KXtjYXNlIjplbnRlciI6cmV0dXJuInZvaWQgPT4gKiI7Y2FzZSI6bGVhdmUiOnJldHVybiIqID0+IHZvaWQiO2Nhc2UiOmluY3JlbWVudCI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHBhcnNlRmxvYXQoZSk+cGFyc2VGbG9hdCh0KX07Y2FzZSI6ZGVjcmVtZW50IjpyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gcGFyc2VGbG9hdChlKTxwYXJzZUZsb2F0KHQpfTtkZWZhdWx0OnJldHVybiBlLnB1c2goJ1RoZSB0cmFuc2l0aW9uIGFsaWFzIHZhbHVlICInK3QrJyIgaXMgbm90IHN1cHBvcnRlZCcpLCIqID0+ICoifX0odCxuKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgcilyZXR1cm4gdm9pZCBlLnB1c2gocik7dD1yfXZhciBpPXQubWF0Y2goL14oXCp8Wy1cd10rKVxzKig8P1s9LV0+KVxzKihcKnxbLVx3XSspJC8pO2lmKG51bGw9PWl8fGkubGVuZ3RoPDQpcmV0dXJuIG4ucHVzaCgnVGhlIHByb3ZpZGVkIHRyYW5zaXRpb24gZXhwcmVzc2lvbiAiJyt0KyciIGlzIG5vdCBzdXBwb3J0ZWQnKSxlO3ZhciBvPWlbMV0sYT1pWzJdLHM9aVszXTtlLnB1c2goJChvLHMpKSwiPCIhPWFbMF18fG89PUsmJnM9PUt8fGUucHVzaCgkKHMsbykpfSh0LGkscil9KTppLnB1c2gobiksaSksYW5pbWF0aW9uOm8scXVlcnlDb3VudDplLnF1ZXJ5Q291bnQsZGVwQ291bnQ6ZS5kZXBDb3VudCxvcHRpb25zOml0KHQub3B0aW9ucyl9fSx0LnByb3RvdHlwZS52aXNpdFNlcXVlbmNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm57dHlwZToyLHN0ZXBzOnQuc3RlcHMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBHKG4sdCxlKX0pLG9wdGlvbnM6aXQodC5vcHRpb25zKX19LHQucHJvdG90eXBlLnZpc2l0R3JvdXA9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9ZS5jdXJyZW50VGltZSxpPTAsbz10LnN0ZXBzLm1hcChmdW5jdGlvbih0KXtlLmN1cnJlbnRUaW1lPXI7dmFyIG89RyhuLHQsZSk7cmV0dXJuIGk9TWF0aC5tYXgoaSxlLmN1cnJlbnRUaW1lKSxvfSk7cmV0dXJuIGUuY3VycmVudFRpbWU9aSx7dHlwZTozLHN0ZXBzOm8sb3B0aW9uczppdCh0Lm9wdGlvbnMpfX0sdC5wcm90b3R5cGUudmlzaXRBbmltYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj1mdW5jdGlvbih0LGUpe3ZhciBuPW51bGw7aWYodC5oYXNPd25Qcm9wZXJ0eSgiZHVyYXRpb24iKSluPXQ7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIG90KGoodCxlKS5kdXJhdGlvbiwwLCIiKTt2YXIgcj10O2lmKHIuc3BsaXQoL1xzKy8pLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuInsiPT10LmNoYXJBdCgwKSYmInsiPT10LmNoYXJBdCgxKX0pKXt2YXIgaT1vdCgwLDAsIiIpO3JldHVybiBpLmR5bmFtaWM9ITAsaS5zdHJWYWx1ZT1yLGl9cmV0dXJuIG90KChuPW58fGoocixlKSkuZHVyYXRpb24sbi5kZWxheSxuLmVhc2luZyl9KHQudGltaW5ncyxlLmVycm9ycyk7ZS5jdXJyZW50QW5pbWF0ZVRpbWluZ3M9cjt2YXIgbz10LnN0eWxlcz90LnN0eWxlczpPYmplY3QoaS5rKSh7fSk7aWYoNT09by50eXBlKW49dGhpcy52aXNpdEtleWZyYW1lcyhvLGUpO2Vsc2V7dmFyIGE9dC5zdHlsZXMscz0hMTtpZighYSl7cz0hMDt2YXIgdT17fTtyLmVhc2luZyYmKHUuZWFzaW5nPXIuZWFzaW5nKSxhPU9iamVjdChpLmspKHUpfWUuY3VycmVudFRpbWUrPXIuZHVyYXRpb24rci5kZWxheTt2YXIgbD10aGlzLnZpc2l0U3R5bGUoYSxlKTtsLmlzRW1wdHlTdGVwPXMsbj1sfXJldHVybiBlLmN1cnJlbnRBbmltYXRlVGltaW5ncz1udWxsLHt0eXBlOjQsdGltaW5nczpyLHN0eWxlOm4sb3B0aW9uczpudWxsfX0sdC5wcm90b3R5cGUudmlzaXRTdHlsZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX21ha2VTdHlsZUFzdCh0LGUpO3JldHVybiB0aGlzLl92YWxpZGF0ZVN0eWxlQXN0KG4sZSksbn0sdC5wcm90b3R5cGUuX21ha2VTdHlsZUFzdD1mdW5jdGlvbih0LGUpe3ZhciBuPVtdO0FycmF5LmlzQXJyYXkodC5zdHlsZXMpP3Quc3R5bGVzLmZvckVhY2goZnVuY3Rpb24odCl7InN0cmluZyI9PXR5cGVvZiB0P3Q9PWkuYT9uLnB1c2godCk6ZS5lcnJvcnMucHVzaCgiVGhlIHByb3ZpZGVkIHN0eWxlIHN0cmluZyB2YWx1ZSAiK3QrIiBpcyBub3QgYWxsb3dlZC4iKTpuLnB1c2godCl9KTpuLnB1c2godC5zdHlsZXMpO3ZhciByPSExLG89bnVsbDtyZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKHJ0KHQpKXt2YXIgZT10LG49ZS5lYXNpbmc7aWYobiYmKG89bixkZWxldGUgZS5lYXNpbmcpLCFyKWZvcih2YXIgaSBpbiBlKWlmKGVbaV0udG9TdHJpbmcoKS5pbmRleE9mKCJ7eyIpPj0wKXtyPSEwO2JyZWFrfX19KSx7dHlwZTo2LHN0eWxlczpuLGVhc2luZzpvLG9mZnNldDp0Lm9mZnNldCxjb250YWluc0R5bmFtaWNTdHlsZXM6cixvcHRpb25zOm51bGx9fSx0LnByb3RvdHlwZS5fdmFsaWRhdGVTdHlsZUFzdD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1lLmN1cnJlbnRBbmltYXRlVGltaW5ncyxpPWUuY3VycmVudFRpbWUsbz1lLmN1cnJlbnRUaW1lO3ImJm8+MCYmKG8tPXIuZHVyYXRpb24rci5kZWxheSksdC5zdHlsZXMuZm9yRWFjaChmdW5jdGlvbih0KXsic3RyaW5nIiE9dHlwZW9mIHQmJk9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24ocil7aWYobi5fZHJpdmVyLnZhbGlkYXRlU3R5bGVQcm9wZXJ0eShyKSl7dmFyIGEscyx1LGw9ZS5jb2xsZWN0ZWRTdHlsZXNbZS5jdXJyZW50UXVlcnlTZWxlY3Rvcl0sYz1sW3JdLGY9ITA7YyYmKG8hPWkmJm8+PWMuc3RhcnRUaW1lJiZpPD1jLmVuZFRpbWUmJihlLmVycm9ycy5wdXNoKCdUaGUgQ1NTIHByb3BlcnR5ICInK3IrJyIgdGhhdCBleGlzdHMgYmV0d2VlbiB0aGUgdGltZXMgb2YgIicrYy5zdGFydFRpbWUrJ21zIiBhbmQgIicrYy5lbmRUaW1lKydtcyIgaXMgYWxzbyBiZWluZyBhbmltYXRlZCBpbiBhIHBhcmFsbGVsIGFuaW1hdGlvbiBiZXR3ZWVuIHRoZSB0aW1lcyBvZiAiJytvKydtcyIgYW5kICInK2krJ21zIicpLGY9ITEpLG89Yy5zdGFydFRpbWUpLGYmJihsW3JdPXtzdGFydFRpbWU6byxlbmRUaW1lOml9KSxlLm9wdGlvbnMmJihhPWUuZXJyb3JzLHM9ZS5vcHRpb25zLnBhcmFtc3x8e30sKHU9VSh0W3JdKSkubGVuZ3RoJiZ1LmZvckVhY2goZnVuY3Rpb24odCl7cy5oYXNPd25Qcm9wZXJ0eSh0KXx8YS5wdXNoKCJVbmFibGUgdG8gcmVzb2x2ZSB0aGUgbG9jYWwgYW5pbWF0aW9uIHBhcmFtICIrdCsiIGluIHRoZSBnaXZlbiBsaXN0IG9mIHZhbHVlcyIpfSkpfWVsc2UgZS5lcnJvcnMucHVzaCgnVGhlIHByb3ZpZGVkIGFuaW1hdGlvbiBwcm9wZXJ0eSAiJytyKyciIGlzIG5vdCBhIHN1cHBvcnRlZCBDU1MgcHJvcGVydHkgZm9yIGFuaW1hdGlvbnMnKX0pfSl9LHQucHJvdG90eXBlLnZpc2l0S2V5ZnJhbWVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPXt0eXBlOjUsc3R5bGVzOltdLG9wdGlvbnM6bnVsbH07aWYoIWUuY3VycmVudEFuaW1hdGVUaW1pbmdzKXJldHVybiBlLmVycm9ycy5wdXNoKCJrZXlmcmFtZXMoKSBtdXN0IGJlIHBsYWNlZCBpbnNpZGUgb2YgYSBjYWxsIHRvIGFuaW1hdGUoKSIpLHI7dmFyIGk9MCxvPVtdLGE9ITEscz0hMSx1PTAsbD10LnN0ZXBzLm1hcChmdW5jdGlvbih0KXt2YXIgcj1uLl9tYWtlU3R5bGVBc3QodCxlKSxsPW51bGwhPXIub2Zmc2V0P3Iub2Zmc2V0OmZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gbnVsbDt2YXIgZT1udWxsO2lmKEFycmF5LmlzQXJyYXkodCkpdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKHJ0KHQpJiZ0Lmhhc093blByb3BlcnR5KCJvZmZzZXQiKSl7dmFyIG49dDtlPXBhcnNlRmxvYXQobi5vZmZzZXQpLGRlbGV0ZSBuLm9mZnNldH19KTtlbHNlIGlmKHJ0KHQpJiZ0Lmhhc093blByb3BlcnR5KCJvZmZzZXQiKSl7dmFyIG49dDtlPXBhcnNlRmxvYXQobi5vZmZzZXQpLGRlbGV0ZSBuLm9mZnNldH1yZXR1cm4gZX0oci5zdHlsZXMpLGM9MDtyZXR1cm4gbnVsbCE9bCYmKGkrKyxjPXIub2Zmc2V0PWwpLHM9c3x8YzwwfHxjPjEsYT1hfHxjPHUsdT1jLG8ucHVzaChjKSxyfSk7cyYmZS5lcnJvcnMucHVzaCgiUGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBrZXlmcmFtZSBvZmZzZXRzIGFyZSBiZXR3ZWVuIDAgYW5kIDEiKSxhJiZlLmVycm9ycy5wdXNoKCJQbGVhc2UgZW5zdXJlIHRoYXQgYWxsIGtleWZyYW1lIG9mZnNldHMgYXJlIGluIG9yZGVyIik7dmFyIGM9dC5zdGVwcy5sZW5ndGgsZj0wO2k+MCYmaTxjP2UuZXJyb3JzLnB1c2goIk5vdCBhbGwgc3R5bGUoKSBzdGVwcyB3aXRoaW4gdGhlIGRlY2xhcmVkIGtleWZyYW1lcygpIGNvbnRhaW4gb2Zmc2V0cyIpOjA9PWkmJihmPTEvKGMtMSkpO3ZhciBoPWMtMSxkPWUuY3VycmVudFRpbWUscD1lLmN1cnJlbnRBbmltYXRlVGltaW5ncyxtPXAuZHVyYXRpb247cmV0dXJuIGwuZm9yRWFjaChmdW5jdGlvbih0LGkpe3ZhciBhPWY+MD9pPT1oPzE6ZippOm9baV0scz1hKm07ZS5jdXJyZW50VGltZT1kK3AuZGVsYXkrcyxwLmR1cmF0aW9uPXMsbi5fdmFsaWRhdGVTdHlsZUFzdCh0LGUpLHQub2Zmc2V0PWEsci5zdHlsZXMucHVzaCh0KX0pLHJ9LHQucHJvdG90eXBlLnZpc2l0UmVmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJue3R5cGU6OCxhbmltYXRpb246Ryh0aGlzLEYodC5hbmltYXRpb24pLGUpLG9wdGlvbnM6aXQodC5vcHRpb25zKX19LHQucHJvdG90eXBlLnZpc2l0QW5pbWF0ZUNoaWxkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZGVwQ291bnQrKyx7dHlwZTo5LG9wdGlvbnM6aXQodC5vcHRpb25zKX19LHQucHJvdG90eXBlLnZpc2l0QW5pbWF0ZVJlZj1mdW5jdGlvbih0LGUpe3JldHVybnt0eXBlOjEwLGFuaW1hdGlvbjp0aGlzLnZpc2l0UmVmZXJlbmNlKHQuYW5pbWF0aW9uLGUpLG9wdGlvbnM6aXQodC5vcHRpb25zKX19LHQucHJvdG90eXBlLnZpc2l0UXVlcnk9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmN1cnJlbnRRdWVyeVNlbGVjdG9yLGk9dC5vcHRpb25zfHx7fTtlLnF1ZXJ5Q291bnQrKyxlLmN1cnJlbnRRdWVyeT10O3ZhciBvPU9iamVjdChyLmMpKGZ1bmN0aW9uKHQpe3ZhciBlPSEhdC5zcGxpdCgvXHMqLFxzKi8pLmZpbmQoZnVuY3Rpb24odCl7cmV0dXJuIjpzZWxmIj09dH0pO3JldHVybiBlJiYodD10LnJlcGxhY2UoSiwiIikpLFt0PXQucmVwbGFjZSgvQFwqL2csIi5uZy10cmlnZ2VyIikucmVwbGFjZSgvQFx3Ky9nLGZ1bmN0aW9uKHQpe3JldHVybiIubmctdHJpZ2dlci0iK3Quc3Vic3RyKDEpfSkucmVwbGFjZSgvOmFuaW1hdGluZy9nLCIubmctYW5pbWF0aW5nIiksZV19KHQuc2VsZWN0b3IpLDIpLGE9b1swXSxzPW9bMV07ZS5jdXJyZW50UXVlcnlTZWxlY3Rvcj1uLmxlbmd0aD9uKyIgIithOmEsZihlLmNvbGxlY3RlZFN0eWxlcyxlLmN1cnJlbnRRdWVyeVNlbGVjdG9yLHt9KTt2YXIgdT1HKHRoaXMsRih0LmFuaW1hdGlvbiksZSk7cmV0dXJuIGUuY3VycmVudFF1ZXJ5PW51bGwsZS5jdXJyZW50UXVlcnlTZWxlY3Rvcj1uLHt0eXBlOjExLHNlbGVjdG9yOmEsbGltaXQ6aS5saW1pdHx8MCxvcHRpb25hbDohIWkub3B0aW9uYWwsaW5jbHVkZVNlbGY6cyxhbmltYXRpb246dSxvcmlnaW5hbFNlbGVjdG9yOnQuc2VsZWN0b3Isb3B0aW9uczppdCh0Lm9wdGlvbnMpfX0sdC5wcm90b3R5cGUudmlzaXRTdGFnZ2VyPWZ1bmN0aW9uKHQsZSl7ZS5jdXJyZW50UXVlcnl8fGUuZXJyb3JzLnB1c2goInN0YWdnZXIoKSBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBvZiBxdWVyeSgpIik7dmFyIG49ImZ1bGwiPT09dC50aW1pbmdzP3tkdXJhdGlvbjowLGRlbGF5OjAsZWFzaW5nOiJmdWxsIn06aih0LnRpbWluZ3MsZS5lcnJvcnMsITApO3JldHVybnt0eXBlOjEyLGFuaW1hdGlvbjpHKHRoaXMsRih0LmFuaW1hdGlvbiksZSksdGltaW5nczpuLG9wdGlvbnM6bnVsbH19LHR9KCksbnQ9ZnVuY3Rpb24odCl7dGhpcy5lcnJvcnM9dCx0aGlzLnF1ZXJ5Q291bnQ9MCx0aGlzLmRlcENvdW50PTAsdGhpcy5jdXJyZW50VHJhbnNpdGlvbj1udWxsLHRoaXMuY3VycmVudFF1ZXJ5PW51bGwsdGhpcy5jdXJyZW50UXVlcnlTZWxlY3Rvcj1udWxsLHRoaXMuY3VycmVudEFuaW1hdGVUaW1pbmdzPW51bGwsdGhpcy5jdXJyZW50VGltZT0wLHRoaXMuY29sbGVjdGVkU3R5bGVzPXt9LHRoaXMub3B0aW9ucz1udWxsfTtmdW5jdGlvbiBydCh0KXtyZXR1cm4hQXJyYXkuaXNBcnJheSh0KSYmIm9iamVjdCI9PXR5cGVvZiB0fWZ1bmN0aW9uIGl0KHQpe3ZhciBlO3JldHVybiB0Pyh0PVAodCkpLnBhcmFtcyYmKHQucGFyYW1zPShlPXQucGFyYW1zKT9QKGUpOm51bGwpOnQ9e30sdH1mdW5jdGlvbiBvdCh0LGUsbil7cmV0dXJue2R1cmF0aW9uOnQsZGVsYXk6ZSxlYXNpbmc6bn19ZnVuY3Rpb24gYXQodCxlLG4scixpLG8sYSxzKXtyZXR1cm4gdm9pZCAwPT09YSYmKGE9bnVsbCksdm9pZCAwPT09cyYmKHM9ITEpLHt0eXBlOjEsZWxlbWVudDp0LGtleWZyYW1lczplLHByZVN0eWxlUHJvcHM6bixwb3N0U3R5bGVQcm9wczpyLGR1cmF0aW9uOmksZGVsYXk6byx0b3RhbFRpbWU6aStvLGVhc2luZzphLHN1YlRpbWVsaW5lOnN9fXZhciBzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9tYXA9bmV3IE1hcH1yZXR1cm4gdC5wcm90b3R5cGUuY29uc3VtZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9tYXAuZ2V0KHQpO3JldHVybiBlP3RoaXMuX21hcC5kZWxldGUodCk6ZT1bXSxlfSx0LnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9tYXAuZ2V0KHQpO258fHRoaXMuX21hcC5zZXQodCxuPVtdKSxuLnB1c2guYXBwbHkobixPYmplY3Qoci5kKShlKSl9LHQucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwLmhhcyh0KX0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9tYXAuY2xlYXIoKX0sdH0oKSx1dD1uZXcgUmVnRXhwKCI6ZW50ZXIiLCJnIiksbHQ9bmV3IFJlZ0V4cCgiOmxlYXZlIiwiZyIpO2Z1bmN0aW9uIGN0KHQsZSxuLHIsaSxvLGEscyx1LGwpe3JldHVybiB2b2lkIDA9PT1vJiYobz17fSksdm9pZCAwPT09YSYmKGE9e30pLHZvaWQgMD09PWwmJihsPVtdKSwobmV3IGZ0KS5idWlsZEtleWZyYW1lcyh0LGUsbixyLGksbyxhLHMsdSxsKX12YXIgZnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5idWlsZEtleWZyYW1lcz1mdW5jdGlvbih0LGUsbixyLGksbyxhLHMsdSxsKXt2b2lkIDA9PT1sJiYobD1bXSksdT11fHxuZXcgc3Q7dmFyIGM9bmV3IGR0KHQsZSx1LHIsaSxsLFtdKTtjLm9wdGlvbnM9cyxjLmN1cnJlbnRUaW1lbGluZS5zZXRTdHlsZXMoW29dLG51bGwsYy5lcnJvcnMscyksRyh0aGlzLG4sYyk7dmFyIGY9Yy50aW1lbGluZXMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbnRhaW5zQW5pbWF0aW9uKCl9KTtpZihmLmxlbmd0aCYmT2JqZWN0LmtleXMoYSkubGVuZ3RoKXt2YXIgaD1mW2YubGVuZ3RoLTFdO2guYWxsb3dPbmx5VGltZWxpbmVTdHlsZXMoKXx8aC5zZXRTdHlsZXMoW2FdLG51bGwsYy5lcnJvcnMscyl9cmV0dXJuIGYubGVuZ3RoP2YubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LmJ1aWxkS2V5ZnJhbWVzKCl9KTpbYXQoZSxbXSxbXSxbXSwwLDAsIiIsITEpXX0sdC5wcm90b3R5cGUudmlzaXRUcmlnZ2VyPWZ1bmN0aW9uKHQsZSl7fSx0LnByb3RvdHlwZS52aXNpdFN0YXRlPWZ1bmN0aW9uKHQsZSl7fSx0LnByb3RvdHlwZS52aXNpdFRyYW5zaXRpb249ZnVuY3Rpb24odCxlKXt9LHQucHJvdG90eXBlLnZpc2l0QW5pbWF0ZUNoaWxkPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5zdWJJbnN0cnVjdGlvbnMuY29uc3VtZShlLmVsZW1lbnQpO2lmKG4pe3ZhciByPWUuY3JlYXRlU3ViQ29udGV4dCh0Lm9wdGlvbnMpLGk9ZS5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWUsbz10aGlzLl92aXNpdFN1Ykluc3RydWN0aW9ucyhuLHIsci5vcHRpb25zKTtpIT1vJiZlLnRyYW5zZm9ybUludG9OZXdUaW1lbGluZShvKX1lLnByZXZpb3VzTm9kZT10fSx0LnByb3RvdHlwZS52aXNpdEFuaW1hdGVSZWY9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmNyZWF0ZVN1YkNvbnRleHQodC5vcHRpb25zKTtuLnRyYW5zZm9ybUludG9OZXdUaW1lbGluZSgpLHRoaXMudmlzaXRSZWZlcmVuY2UodC5hbmltYXRpb24sbiksZS50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmUobi5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWUpLGUucHJldmlvdXNOb2RlPXR9LHQucHJvdG90eXBlLl92aXNpdFN1Ykluc3RydWN0aW9ucz1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWUsaT1udWxsIT1uLmR1cmF0aW9uP0kobi5kdXJhdGlvbik6bnVsbCxvPW51bGwhPW4uZGVsYXk/SShuLmRlbGF5KTpudWxsO3JldHVybiAwIT09aSYmdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPWUuYXBwZW5kSW5zdHJ1Y3Rpb25Ub1RpbWVsaW5lKHQsaSxvKTtyPU1hdGgubWF4KHIsbi5kdXJhdGlvbituLmRlbGF5KX0pLHJ9LHQucHJvdG90eXBlLnZpc2l0UmVmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7ZS51cGRhdGVPcHRpb25zKHQub3B0aW9ucywhMCksRyh0aGlzLHQuYW5pbWF0aW9uLGUpLGUucHJldmlvdXNOb2RlPXR9LHQucHJvdG90eXBlLnZpc2l0U2VxdWVuY2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9ZS5zdWJDb250ZXh0Q291bnQsaT1lLG89dC5vcHRpb25zO2lmKG8mJihvLnBhcmFtc3x8by5kZWxheSkmJigoaT1lLmNyZWF0ZVN1YkNvbnRleHQobykpLnRyYW5zZm9ybUludG9OZXdUaW1lbGluZSgpLG51bGwhPW8uZGVsYXkpKXs2PT1pLnByZXZpb3VzTm9kZS50eXBlJiYoaS5jdXJyZW50VGltZWxpbmUuc25hcHNob3RDdXJyZW50U3R5bGVzKCksaS5wcmV2aW91c05vZGU9aHQpO3ZhciBhPUkoby5kZWxheSk7aS5kZWxheU5leHRTdGVwKGEpfXQuc3RlcHMubGVuZ3RoJiYodC5zdGVwcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBHKG4sdCxpKX0pLGkuY3VycmVudFRpbWVsaW5lLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpLGkuc3ViQ29udGV4dENvdW50PnImJmkudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKCkpLGUucHJldmlvdXNOb2RlPXR9LHQucHJvdG90eXBlLnZpc2l0R3JvdXA9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9W10saT1lLmN1cnJlbnRUaW1lbGluZS5jdXJyZW50VGltZSxvPXQub3B0aW9ucyYmdC5vcHRpb25zLmRlbGF5P0kodC5vcHRpb25zLmRlbGF5KTowO3Quc3RlcHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgcz1lLmNyZWF0ZVN1YkNvbnRleHQodC5vcHRpb25zKTtvJiZzLmRlbGF5TmV4dFN0ZXAobyksRyhuLGEscyksaT1NYXRoLm1heChpLHMuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lKSxyLnB1c2gocy5jdXJyZW50VGltZWxpbmUpfSksci5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmN1cnJlbnRUaW1lbGluZS5tZXJnZVRpbWVsaW5lQ29sbGVjdGVkU3R5bGVzKHQpfSksZS50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmUoaSksZS5wcmV2aW91c05vZGU9dH0sdC5wcm90b3R5cGUuX3Zpc2l0VGltaW5nPWZ1bmN0aW9uKHQsZSl7aWYodC5keW5hbWljKXt2YXIgbj10LnN0clZhbHVlO3JldHVybiBqKGUucGFyYW1zP3oobixlLnBhcmFtcyxlLmVycm9ycyk6bixlLmVycm9ycyl9cmV0dXJue2R1cmF0aW9uOnQuZHVyYXRpb24sZGVsYXk6dC5kZWxheSxlYXNpbmc6dC5lYXNpbmd9fSx0LnByb3RvdHlwZS52aXNpdEFuaW1hdGU9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmN1cnJlbnRBbmltYXRlVGltaW5ncz10aGlzLl92aXNpdFRpbWluZyh0LnRpbWluZ3MsZSkscj1lLmN1cnJlbnRUaW1lbGluZTtuLmRlbGF5JiYoZS5pbmNyZW1lbnRUaW1lKG4uZGVsYXkpLHIuc25hcHNob3RDdXJyZW50U3R5bGVzKCkpO3ZhciBpPXQuc3R5bGU7NT09aS50eXBlP3RoaXMudmlzaXRLZXlmcmFtZXMoaSxlKTooZS5pbmNyZW1lbnRUaW1lKG4uZHVyYXRpb24pLHRoaXMudmlzaXRTdHlsZShpLGUpLHIuYXBwbHlTdHlsZXNUb0tleWZyYW1lKCkpLGUuY3VycmVudEFuaW1hdGVUaW1pbmdzPW51bGwsZS5wcmV2aW91c05vZGU9dH0sdC5wcm90b3R5cGUudmlzaXRTdHlsZT1mdW5jdGlvbih0LGUpe3ZhciBuPWUuY3VycmVudFRpbWVsaW5lLHI9ZS5jdXJyZW50QW5pbWF0ZVRpbWluZ3M7IXImJm4uZ2V0Q3VycmVudFN0eWxlUHJvcGVydGllcygpLmxlbmd0aCYmbi5mb3J3YXJkRnJhbWUoKTt2YXIgaT1yJiZyLmVhc2luZ3x8dC5lYXNpbmc7dC5pc0VtcHR5U3RlcD9uLmFwcGx5RW1wdHlTdGVwKGkpOm4uc2V0U3R5bGVzKHQuc3R5bGVzLGksZS5lcnJvcnMsZS5vcHRpb25zKSxlLnByZXZpb3VzTm9kZT10fSx0LnByb3RvdHlwZS52aXNpdEtleWZyYW1lcz1mdW5jdGlvbih0LGUpe3ZhciBuPWUuY3VycmVudEFuaW1hdGVUaW1pbmdzLHI9ZS5jdXJyZW50VGltZWxpbmUuZHVyYXRpb24saT1uLmR1cmF0aW9uLG89ZS5jcmVhdGVTdWJDb250ZXh0KCkuY3VycmVudFRpbWVsaW5lO28uZWFzaW5nPW4uZWFzaW5nLHQuc3R5bGVzLmZvckVhY2goZnVuY3Rpb24odCl7by5mb3J3YXJkVGltZSgodC5vZmZzZXR8fDApKmkpLG8uc2V0U3R5bGVzKHQuc3R5bGVzLHQuZWFzaW5nLGUuZXJyb3JzLGUub3B0aW9ucyksby5hcHBseVN0eWxlc1RvS2V5ZnJhbWUoKX0pLGUuY3VycmVudFRpbWVsaW5lLm1lcmdlVGltZWxpbmVDb2xsZWN0ZWRTdHlsZXMobyksZS50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmUocitpKSxlLnByZXZpb3VzTm9kZT10fSx0LnByb3RvdHlwZS52aXNpdFF1ZXJ5PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPWUuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lLGk9dC5vcHRpb25zfHx7fSxvPWkuZGVsYXk/SShpLmRlbGF5KTowO28mJig2PT09ZS5wcmV2aW91c05vZGUudHlwZXx8MD09ciYmZS5jdXJyZW50VGltZWxpbmUuZ2V0Q3VycmVudFN0eWxlUHJvcGVydGllcygpLmxlbmd0aCkmJihlLmN1cnJlbnRUaW1lbGluZS5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKSxlLnByZXZpb3VzTm9kZT1odCk7dmFyIGE9cixzPWUuaW52b2tlUXVlcnkodC5zZWxlY3Rvcix0Lm9yaWdpbmFsU2VsZWN0b3IsdC5saW1pdCx0LmluY2x1ZGVTZWxmLCEhaS5vcHRpb25hbCxlLmVycm9ycyk7ZS5jdXJyZW50UXVlcnlUb3RhbD1zLmxlbmd0aDt2YXIgdT1udWxsO3MuZm9yRWFjaChmdW5jdGlvbihyLGkpe2UuY3VycmVudFF1ZXJ5SW5kZXg9aTt2YXIgcz1lLmNyZWF0ZVN1YkNvbnRleHQodC5vcHRpb25zLHIpO28mJnMuZGVsYXlOZXh0U3RlcChvKSxyPT09ZS5lbGVtZW50JiYodT1zLmN1cnJlbnRUaW1lbGluZSksRyhuLHQuYW5pbWF0aW9uLHMpLHMuY3VycmVudFRpbWVsaW5lLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpLGE9TWF0aC5tYXgoYSxzLmN1cnJlbnRUaW1lbGluZS5jdXJyZW50VGltZSl9KSxlLmN1cnJlbnRRdWVyeUluZGV4PTAsZS5jdXJyZW50UXVlcnlUb3RhbD0wLGUudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKGEpLHUmJihlLmN1cnJlbnRUaW1lbGluZS5tZXJnZVRpbWVsaW5lQ29sbGVjdGVkU3R5bGVzKHUpLGUuY3VycmVudFRpbWVsaW5lLnNuYXBzaG90Q3VycmVudFN0eWxlcygpKSxlLnByZXZpb3VzTm9kZT10fSx0LnByb3RvdHlwZS52aXNpdFN0YWdnZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnBhcmVudENvbnRleHQscj1lLmN1cnJlbnRUaW1lbGluZSxpPXQudGltaW5ncyxvPU1hdGguYWJzKGkuZHVyYXRpb24pLGE9byooZS5jdXJyZW50UXVlcnlUb3RhbC0xKSxzPW8qZS5jdXJyZW50UXVlcnlJbmRleDtzd2l0Y2goaS5kdXJhdGlvbjwwPyJyZXZlcnNlIjppLmVhc2luZyl7Y2FzZSJyZXZlcnNlIjpzPWEtczticmVhaztjYXNlImZ1bGwiOnM9bi5jdXJyZW50U3RhZ2dlclRpbWV9dmFyIHU9ZS5jdXJyZW50VGltZWxpbmU7cyYmdS5kZWxheU5leHRTdGVwKHMpO3ZhciBsPXUuY3VycmVudFRpbWU7Ryh0aGlzLHQuYW5pbWF0aW9uLGUpLGUucHJldmlvdXNOb2RlPXQsbi5jdXJyZW50U3RhZ2dlclRpbWU9ci5jdXJyZW50VGltZS1sKyhyLnN0YXJ0VGltZS1uLmN1cnJlbnRUaW1lbGluZS5zdGFydFRpbWUpfSx0fSgpLGh0PXt9LGR0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyLGksbyxhLHMpe3RoaXMuX2RyaXZlcj10LHRoaXMuZWxlbWVudD1lLHRoaXMuc3ViSW5zdHJ1Y3Rpb25zPW4sdGhpcy5fZW50ZXJDbGFzc05hbWU9cix0aGlzLl9sZWF2ZUNsYXNzTmFtZT1pLHRoaXMuZXJyb3JzPW8sdGhpcy50aW1lbGluZXM9YSx0aGlzLnBhcmVudENvbnRleHQ9bnVsbCx0aGlzLmN1cnJlbnRBbmltYXRlVGltaW5ncz1udWxsLHRoaXMucHJldmlvdXNOb2RlPWh0LHRoaXMuc3ViQ29udGV4dENvdW50PTAsdGhpcy5vcHRpb25zPXt9LHRoaXMuY3VycmVudFF1ZXJ5SW5kZXg9MCx0aGlzLmN1cnJlbnRRdWVyeVRvdGFsPTAsdGhpcy5jdXJyZW50U3RhZ2dlclRpbWU9MCx0aGlzLmN1cnJlbnRUaW1lbGluZT1zfHxuZXcgcHQodGhpcy5fZHJpdmVyLGUsMCksYS5wdXNoKHRoaXMuY3VycmVudFRpbWVsaW5lKX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwYXJhbXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnBhcmFtc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS51cGRhdGVPcHRpb25zPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZih0KXt2YXIgcj10LGk9dGhpcy5vcHRpb25zO251bGwhPXIuZHVyYXRpb24mJihpLmR1cmF0aW9uPUkoci5kdXJhdGlvbikpLG51bGwhPXIuZGVsYXkmJihpLmRlbGF5PUkoci5kZWxheSkpO3ZhciBvPXIucGFyYW1zO2lmKG8pe3ZhciBhPWkucGFyYW1zO2F8fChhPXRoaXMub3B0aW9ucy5wYXJhbXM9e30pLE9iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24odCl7ZSYmYS5oYXNPd25Qcm9wZXJ0eSh0KXx8KGFbdF09eihvW3RdLGEsbi5lcnJvcnMpKX0pfX19LHQucHJvdG90eXBlLl9jb3B5T3B0aW9ucz1mdW5jdGlvbigpe3ZhciB0PXt9O2lmKHRoaXMub3B0aW9ucyl7dmFyIGU9dGhpcy5vcHRpb25zLnBhcmFtcztpZihlKXt2YXIgbj10LnBhcmFtcz17fTtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe25bdF09ZVt0XX0pfX1yZXR1cm4gdH0sdC5wcm90b3R5cGUuY3JlYXRlU3ViQ29udGV4dD1mdW5jdGlvbihlLG4scil7dm9pZCAwPT09ZSYmKGU9bnVsbCk7dmFyIGk9bnx8dGhpcy5lbGVtZW50LG89bmV3IHQodGhpcy5fZHJpdmVyLGksdGhpcy5zdWJJbnN0cnVjdGlvbnMsdGhpcy5fZW50ZXJDbGFzc05hbWUsdGhpcy5fbGVhdmVDbGFzc05hbWUsdGhpcy5lcnJvcnMsdGhpcy50aW1lbGluZXMsdGhpcy5jdXJyZW50VGltZWxpbmUuZm9yayhpLHJ8fDApKTtyZXR1cm4gby5wcmV2aW91c05vZGU9dGhpcy5wcmV2aW91c05vZGUsby5jdXJyZW50QW5pbWF0ZVRpbWluZ3M9dGhpcy5jdXJyZW50QW5pbWF0ZVRpbWluZ3Msby5vcHRpb25zPXRoaXMuX2NvcHlPcHRpb25zKCksby51cGRhdGVPcHRpb25zKGUpLG8uY3VycmVudFF1ZXJ5SW5kZXg9dGhpcy5jdXJyZW50UXVlcnlJbmRleCxvLmN1cnJlbnRRdWVyeVRvdGFsPXRoaXMuY3VycmVudFF1ZXJ5VG90YWwsby5wYXJlbnRDb250ZXh0PXRoaXMsdGhpcy5zdWJDb250ZXh0Q291bnQrKyxvfSx0LnByb3RvdHlwZS50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHJldmlvdXNOb2RlPWh0LHRoaXMuY3VycmVudFRpbWVsaW5lPXRoaXMuY3VycmVudFRpbWVsaW5lLmZvcmsodGhpcy5lbGVtZW50LHQpLHRoaXMudGltZWxpbmVzLnB1c2godGhpcy5jdXJyZW50VGltZWxpbmUpLHRoaXMuY3VycmVudFRpbWVsaW5lfSx0LnByb3RvdHlwZS5hcHBlbmRJbnN0cnVjdGlvblRvVGltZWxpbmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXtkdXJhdGlvbjpudWxsIT1lP2U6dC5kdXJhdGlvbixkZWxheTp0aGlzLmN1cnJlbnRUaW1lbGluZS5jdXJyZW50VGltZSsobnVsbCE9bj9uOjApK3QuZGVsYXksZWFzaW5nOiIifSxpPW5ldyBtdCh0aGlzLl9kcml2ZXIsdC5lbGVtZW50LHQua2V5ZnJhbWVzLHQucHJlU3R5bGVQcm9wcyx0LnBvc3RTdHlsZVByb3BzLHIsdC5zdHJldGNoU3RhcnRpbmdLZXlmcmFtZSk7cmV0dXJuIHRoaXMudGltZWxpbmVzLnB1c2goaSkscn0sdC5wcm90b3R5cGUuaW5jcmVtZW50VGltZT1mdW5jdGlvbih0KXt0aGlzLmN1cnJlbnRUaW1lbGluZS5mb3J3YXJkVGltZSh0aGlzLmN1cnJlbnRUaW1lbGluZS5kdXJhdGlvbit0KX0sdC5wcm90b3R5cGUuZGVsYXlOZXh0U3RlcD1mdW5jdGlvbih0KXt0PjAmJnRoaXMuY3VycmVudFRpbWVsaW5lLmRlbGF5TmV4dFN0ZXAodCl9LHQucHJvdG90eXBlLmludm9rZVF1ZXJ5PWZ1bmN0aW9uKHQsZSxuLGksbyxhKXt2YXIgcz1bXTtpZihpJiZzLnB1c2godGhpcy5lbGVtZW50KSx0Lmxlbmd0aD4wKXt0PSh0PXQucmVwbGFjZSh1dCwiLiIrdGhpcy5fZW50ZXJDbGFzc05hbWUpKS5yZXBsYWNlKGx0LCIuIit0aGlzLl9sZWF2ZUNsYXNzTmFtZSk7dmFyIHU9dGhpcy5fZHJpdmVyLnF1ZXJ5KHRoaXMuZWxlbWVudCx0LDEhPW4pOzAhPT1uJiYodT1uPDA/dS5zbGljZSh1Lmxlbmd0aCtuLHUubGVuZ3RoKTp1LnNsaWNlKDAsbikpLHMucHVzaC5hcHBseShzLE9iamVjdChyLmQpKHUpKX1yZXR1cm4gb3x8MCE9cy5sZW5ndGh8fGEucHVzaCgnYHF1ZXJ5KCInK2UrJyIpYCByZXR1cm5lZCB6ZXJvIGVsZW1lbnRzLiAoVXNlIGBxdWVyeSgiJytlKyciLCB7IG9wdGlvbmFsOiB0cnVlIH0pYCBpZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGlzLiknKSxzfSx0fSgpLHB0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyKXt0aGlzLl9kcml2ZXI9dCx0aGlzLmVsZW1lbnQ9ZSx0aGlzLnN0YXJ0VGltZT1uLHRoaXMuX2VsZW1lbnRUaW1lbGluZVN0eWxlc0xvb2t1cD1yLHRoaXMuZHVyYXRpb249MCx0aGlzLl9wcmV2aW91c0tleWZyYW1lPXt9LHRoaXMuX2N1cnJlbnRLZXlmcmFtZT17fSx0aGlzLl9rZXlmcmFtZXM9bmV3IE1hcCx0aGlzLl9zdHlsZVN1bW1hcnk9e30sdGhpcy5fcGVuZGluZ1N0eWxlcz17fSx0aGlzLl9iYWNrRmlsbD17fSx0aGlzLl9jdXJyZW50RW1wdHlTdGVwS2V5ZnJhbWU9bnVsbCx0aGlzLl9lbGVtZW50VGltZWxpbmVTdHlsZXNMb29rdXB8fCh0aGlzLl9lbGVtZW50VGltZWxpbmVTdHlsZXNMb29rdXA9bmV3IE1hcCksdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcz1PYmplY3QuY3JlYXRlKHRoaXMuX2JhY2tGaWxsLHt9KSx0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlcz10aGlzLl9lbGVtZW50VGltZWxpbmVTdHlsZXNMb29rdXAuZ2V0KGUpLHRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzfHwodGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXM9dGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcyx0aGlzLl9lbGVtZW50VGltZWxpbmVTdHlsZXNMb29rdXAuc2V0KGUsdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcykpLHRoaXMuX2xvYWRLZXlmcmFtZSgpfXJldHVybiB0LnByb3RvdHlwZS5jb250YWluc0FuaW1hdGlvbj1mdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9rZXlmcmFtZXMuc2l6ZSl7Y2FzZSAwOnJldHVybiExO2Nhc2UgMTpyZXR1cm4gdGhpcy5nZXRDdXJyZW50U3R5bGVQcm9wZXJ0aWVzKCkubGVuZ3RoPjA7ZGVmYXVsdDpyZXR1cm4hMH19LHQucHJvdG90eXBlLmdldEN1cnJlbnRTdHlsZVByb3BlcnRpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5fY3VycmVudEtleWZyYW1lKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjdXJyZW50VGltZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0VGltZSt0aGlzLmR1cmF0aW9ufSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmRlbGF5TmV4dFN0ZXA9ZnVuY3Rpb24odCl7dmFyIGU9MT09dGhpcy5fa2V5ZnJhbWVzLnNpemUmJk9iamVjdC5rZXlzKHRoaXMuX3BlbmRpbmdTdHlsZXMpLmxlbmd0aDt0aGlzLmR1cmF0aW9ufHxlPyh0aGlzLmZvcndhcmRUaW1lKHRoaXMuY3VycmVudFRpbWUrdCksZSYmdGhpcy5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKSk6dGhpcy5zdGFydFRpbWUrPXR9LHQucHJvdG90eXBlLmZvcms9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdGhpcy5hcHBseVN0eWxlc1RvS2V5ZnJhbWUoKSxuZXcgdCh0aGlzLl9kcml2ZXIsZSxufHx0aGlzLmN1cnJlbnRUaW1lLHRoaXMuX2VsZW1lbnRUaW1lbGluZVN0eWxlc0xvb2t1cCl9LHQucHJvdG90eXBlLl9sb2FkS2V5ZnJhbWU9ZnVuY3Rpb24oKXt0aGlzLl9jdXJyZW50S2V5ZnJhbWUmJih0aGlzLl9wcmV2aW91c0tleWZyYW1lPXRoaXMuX2N1cnJlbnRLZXlmcmFtZSksdGhpcy5fY3VycmVudEtleWZyYW1lPXRoaXMuX2tleWZyYW1lcy5nZXQodGhpcy5kdXJhdGlvbiksdGhpcy5fY3VycmVudEtleWZyYW1lfHwodGhpcy5fY3VycmVudEtleWZyYW1lPU9iamVjdC5jcmVhdGUodGhpcy5fYmFja0ZpbGwse30pLHRoaXMuX2tleWZyYW1lcy5zZXQodGhpcy5kdXJhdGlvbix0aGlzLl9jdXJyZW50S2V5ZnJhbWUpKX0sdC5wcm90b3R5cGUuZm9yd2FyZEZyYW1lPWZ1bmN0aW9uKCl7dGhpcy5kdXJhdGlvbis9MSx0aGlzLl9sb2FkS2V5ZnJhbWUoKX0sdC5wcm90b3R5cGUuZm9yd2FyZFRpbWU9ZnVuY3Rpb24odCl7dGhpcy5hcHBseVN0eWxlc1RvS2V5ZnJhbWUoKSx0aGlzLmR1cmF0aW9uPXQsdGhpcy5fbG9hZEtleWZyYW1lKCl9LHQucHJvdG90eXBlLl91cGRhdGVTdHlsZT1mdW5jdGlvbih0LGUpe3RoaXMuX2xvY2FsVGltZWxpbmVTdHlsZXNbdF09ZSx0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlc1t0XT1lLHRoaXMuX3N0eWxlU3VtbWFyeVt0XT17dGltZTp0aGlzLmN1cnJlbnRUaW1lLHZhbHVlOmV9fSx0LnByb3RvdHlwZS5hbGxvd09ubHlUaW1lbGluZVN0eWxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50RW1wdHlTdGVwS2V5ZnJhbWUhPT10aGlzLl9jdXJyZW50S2V5ZnJhbWV9LHQucHJvdG90eXBlLmFwcGx5RW1wdHlTdGVwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dCYmKHRoaXMuX3ByZXZpb3VzS2V5ZnJhbWUuZWFzaW5nPXQpLE9iamVjdC5rZXlzKHRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuX2JhY2tGaWxsW3RdPWUuX2dsb2JhbFRpbWVsaW5lU3R5bGVzW3RdfHxpLmEsZS5fY3VycmVudEtleWZyYW1lW3RdPWkuYX0pLHRoaXMuX2N1cnJlbnRFbXB0eVN0ZXBLZXlmcmFtZT10aGlzLl9jdXJyZW50S2V5ZnJhbWV9LHQucHJvdG90eXBlLnNldFN0eWxlcz1mdW5jdGlvbih0LGUsbixyKXt2YXIgbz10aGlzO2UmJih0aGlzLl9wcmV2aW91c0tleWZyYW1lLmVhc2luZz1lKTt2YXIgYT1yJiZyLnBhcmFtc3x8e30scz1mdW5jdGlvbih0LGUpe3ZhciBuLHI9e307cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXsiKiI9PT10PyhuPW58fE9iamVjdC5rZXlzKGUpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JbdF09aS5hfSk6TSh0LCExLHIpfSkscn0odCx0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlcyk7T2JqZWN0LmtleXMocykuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT16KHNbdF0sYSxuKTtvLl9wZW5kaW5nU3R5bGVzW3RdPWUsby5fbG9jYWxUaW1lbGluZVN0eWxlcy5oYXNPd25Qcm9wZXJ0eSh0KXx8KG8uX2JhY2tGaWxsW3RdPW8uX2dsb2JhbFRpbWVsaW5lU3R5bGVzLmhhc093blByb3BlcnR5KHQpP28uX2dsb2JhbFRpbWVsaW5lU3R5bGVzW3RdOmkuYSksby5fdXBkYXRlU3R5bGUodCxlKX0pfSx0LnByb3RvdHlwZS5hcHBseVN0eWxlc1RvS2V5ZnJhbWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fcGVuZGluZ1N0eWxlcyxuPU9iamVjdC5rZXlzKGUpOzAhPW4ubGVuZ3RoJiYodGhpcy5fcGVuZGluZ1N0eWxlcz17fSxuLmZvckVhY2goZnVuY3Rpb24obil7dC5fY3VycmVudEtleWZyYW1lW25dPWVbbl19KSxPYmplY3Qua2V5cyh0aGlzLl9sb2NhbFRpbWVsaW5lU3R5bGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuX2N1cnJlbnRLZXlmcmFtZS5oYXNPd25Qcm9wZXJ0eShlKXx8KHQuX2N1cnJlbnRLZXlmcmFtZVtlXT10Ll9sb2NhbFRpbWVsaW5lU3R5bGVzW2VdKX0pKX0sdC5wcm90b3R5cGUuc25hcHNob3RDdXJyZW50U3R5bGVzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztPYmplY3Qua2V5cyh0aGlzLl9sb2NhbFRpbWVsaW5lU3R5bGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPXQuX2xvY2FsVGltZWxpbmVTdHlsZXNbZV07dC5fcGVuZGluZ1N0eWxlc1tlXT1uLHQuX3VwZGF0ZVN0eWxlKGUsbil9KX0sdC5wcm90b3R5cGUuZ2V0RmluYWxLZXlmcmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9rZXlmcmFtZXMuZ2V0KHRoaXMuZHVyYXRpb24pfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInByb3BlcnRpZXMiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcy5fY3VycmVudEtleWZyYW1lKXQucHVzaChlKTtyZXR1cm4gdH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5tZXJnZVRpbWVsaW5lQ29sbGVjdGVkU3R5bGVzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7T2JqZWN0LmtleXModC5fc3R5bGVTdW1tYXJ5KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciByPWUuX3N0eWxlU3VtbWFyeVtuXSxpPXQuX3N0eWxlU3VtbWFyeVtuXTsoIXJ8fGkudGltZT5yLnRpbWUpJiZlLl91cGRhdGVTdHlsZShuLGkudmFsdWUpfSl9LHQucHJvdG90eXBlLmJ1aWxkS2V5ZnJhbWVzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpO3ZhciBlPW5ldyBTZXQsbj1uZXcgU2V0LHI9MT09PXRoaXMuX2tleWZyYW1lcy5zaXplJiYwPT09dGhpcy5kdXJhdGlvbixvPVtdO3RoaXMuX2tleWZyYW1lcy5mb3JFYWNoKGZ1bmN0aW9uKGEscyl7dmFyIHU9TShhLCEwKTtPYmplY3Qua2V5cyh1KS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPXVbdF07cj09aS5vP2UuYWRkKHQpOnI9PWkuYSYmbi5hZGQodCl9KSxyfHwodS5vZmZzZXQ9cy90LmR1cmF0aW9uKSxvLnB1c2godSl9KTt2YXIgYT1lLnNpemU/QihlLnZhbHVlcygpKTpbXSxzPW4uc2l6ZT9CKG4udmFsdWVzKCkpOltdO2lmKHIpe3ZhciB1PW9bMF0sbD1QKHUpO3Uub2Zmc2V0PTAsbC5vZmZzZXQ9MSxvPVt1LGxdfXJldHVybiBhdCh0aGlzLmVsZW1lbnQsbyxhLHMsdGhpcy5kdXJhdGlvbix0aGlzLnN0YXJ0VGltZSx0aGlzLmVhc2luZywhMSl9LHR9KCksbXQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scixpLG8sYSxzKXt2b2lkIDA9PT1zJiYocz0hMSk7dmFyIHU9dC5jYWxsKHRoaXMsZSxuLGEuZGVsYXkpfHx0aGlzO3JldHVybiB1LmVsZW1lbnQ9bix1LmtleWZyYW1lcz1yLHUucHJlU3R5bGVQcm9wcz1pLHUucG9zdFN0eWxlUHJvcHM9byx1Ll9zdHJldGNoU3RhcnRpbmdLZXlmcmFtZT1zLHUudGltaW5ncz17ZHVyYXRpb246YS5kdXJhdGlvbixkZWxheTphLmRlbGF5LGVhc2luZzphLmVhc2luZ30sdX1yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5jb250YWluc0FuaW1hdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmtleWZyYW1lcy5sZW5ndGg+MX0sZS5wcm90b3R5cGUuYnVpbGRLZXlmcmFtZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmtleWZyYW1lcyxlPXRoaXMudGltaW5ncyxuPWUuZGVsYXkscj1lLmR1cmF0aW9uLGk9ZS5lYXNpbmc7aWYodGhpcy5fc3RyZXRjaFN0YXJ0aW5nS2V5ZnJhbWUmJm4pe3ZhciBvPVtdLGE9cituLHM9bi9hLHU9TSh0WzBdLCExKTt1Lm9mZnNldD0wLG8ucHVzaCh1KTt2YXIgbD1NKHRbMF0sITEpO2wub2Zmc2V0PXl0KHMpLG8ucHVzaChsKTtmb3IodmFyIGM9dC5sZW5ndGgtMSxmPTE7Zjw9YztmKyspe3ZhciBoPU0odFtmXSwhMSk7aC5vZmZzZXQ9eXQoKG4raC5vZmZzZXQqcikvYSksby5wdXNoKGgpfXI9YSxuPTAsaT0iIix0PW99cmV0dXJuIGF0KHRoaXMuZWxlbWVudCx0LHRoaXMucHJlU3R5bGVQcm9wcyx0aGlzLnBvc3RTdHlsZVByb3BzLHIsbixpLCEwKX0sZX0ocHQpO2Z1bmN0aW9uIHl0KHQsZSl7dm9pZCAwPT09ZSYmKGU9Myk7dmFyIG49TWF0aC5wb3coMTAsZS0xKTtyZXR1cm4gTWF0aC5yb3VuZCh0Km4pL259dmFyIGd0PWZ1bmN0aW9uKCl7fSx2dD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5ub3JtYWxpemVQcm9wZXJ0eU5hbWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gVyh0KX0sZS5wcm90b3R5cGUubm9ybWFsaXplU3R5bGVWYWx1ZT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT0iIixvPW4udG9TdHJpbmcoKS50cmltKCk7aWYoYnRbZV0mJjAhPT1uJiYiMCIhPT1uKWlmKCJudW1iZXIiPT10eXBlb2YgbilpPSJweCI7ZWxzZXt2YXIgYT1uLm1hdGNoKC9eWystXT9bXGRcLl0rKFthLXpdKikkLyk7YSYmMD09YVsxXS5sZW5ndGgmJnIucHVzaCgiUGxlYXNlIHByb3ZpZGUgYSBDU1MgdW5pdCB2YWx1ZSBmb3IgIit0KyI6IituKX1yZXR1cm4gbytpfSxlfShndCksYnQ9ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIndpZHRoLGhlaWdodCxtaW5XaWR0aCxtaW5IZWlnaHQsbWF4V2lkdGgsbWF4SGVpZ2h0LGxlZnQsdG9wLGJvdHRvbSxyaWdodCxmb250U2l6ZSxvdXRsaW5lV2lkdGgsb3V0bGluZU9mZnNldCxwYWRkaW5nVG9wLHBhZGRpbmdMZWZ0LHBhZGRpbmdCb3R0b20scGFkZGluZ1JpZ2h0LG1hcmdpblRvcCxtYXJnaW5MZWZ0LG1hcmdpbkJvdHRvbSxtYXJnaW5SaWdodCxib3JkZXJSYWRpdXMsYm9yZGVyV2lkdGgsYm9yZGVyVG9wV2lkdGgsYm9yZGVyTGVmdFdpZHRoLGJvcmRlclJpZ2h0V2lkdGgsYm9yZGVyQm90dG9tV2lkdGgsdGV4dEluZGVudCxwZXJzcGVjdGl2ZSIuc3BsaXQoIiwiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdPSEwfSksZX0oKTtmdW5jdGlvbiBfdCh0LGUsbixyLGksbyxhLHMsdSxsLGMsZixoKXtyZXR1cm57dHlwZTowLGVsZW1lbnQ6dCx0cmlnZ2VyTmFtZTplLGlzUmVtb3ZhbFRyYW5zaXRpb246aSxmcm9tU3RhdGU6bixmcm9tU3R5bGVzOm8sdG9TdGF0ZTpyLHRvU3R5bGVzOmEsdGltZWxpbmVzOnMscXVlcmllZEVsZW1lbnRzOnUscHJlU3R5bGVQcm9wczpsLHBvc3RTdHlsZVByb3BzOmMsdG90YWxUaW1lOmYsZXJyb3JzOmh9fXZhciB3dD17fSx4dD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMuX3RyaWdnZXJOYW1lPXQsdGhpcy5hc3Q9ZSx0aGlzLl9zdGF0ZVN0eWxlcz1ufXJldHVybiB0LnByb3RvdHlwZS5tYXRjaD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gdC5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0KGUsbixyLGkpfSl9KHRoaXMuYXN0Lm1hdGNoZXJzLHQsZSxuLHIpfSx0LnByb3RvdHlwZS5idWlsZFN0eWxlcz1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5fc3RhdGVTdHlsZXNbIioiXSxpPXRoaXMuX3N0YXRlU3R5bGVzW3RdLG89cj9yLmJ1aWxkU3R5bGVzKGUsbik6e307cmV0dXJuIGk/aS5idWlsZFN0eWxlcyhlLG4pOm99LHQucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKHQsZSxuLGksbyxhLHMsdSxsLGMpe3ZhciBoPVtdLGQ9dGhpcy5hc3Qub3B0aW9ucyYmdGhpcy5hc3Qub3B0aW9ucy5wYXJhbXN8fHd0LHA9dGhpcy5idWlsZFN0eWxlcyhuLHMmJnMucGFyYW1zfHx3dCxoKSxtPXUmJnUucGFyYW1zfHx3dCx5PXRoaXMuYnVpbGRTdHlsZXMoaSxtLGgpLGc9bmV3IFNldCx2PW5ldyBNYXAsYj1uZXcgTWFwLF89InZvaWQiPT09aSx3PXtwYXJhbXM6T2JqZWN0KHIuYSkoe30sZCxtKX0seD1jP1tdOmN0KHQsZSx0aGlzLmFzdC5hbmltYXRpb24sbyxhLHAseSx3LGwsaCksTz0wO2lmKHguZm9yRWFjaChmdW5jdGlvbih0KXtPPU1hdGgubWF4KHQuZHVyYXRpb24rdC5kZWxheSxPKX0pLGgubGVuZ3RoKXJldHVybiBfdChlLHRoaXMuX3RyaWdnZXJOYW1lLG4saSxfLHAseSxbXSxbXSx2LGIsTyxoKTt4LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49dC5lbGVtZW50LHI9Zih2LG4se30pO3QucHJlU3R5bGVQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiByW3RdPSEwfSk7dmFyIGk9ZihiLG4se30pO3QucG9zdFN0eWxlUHJvcHMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gaVt0XT0hMH0pLG4hPT1lJiZnLmFkZChuKX0pO3ZhciBDPUIoZy52YWx1ZXMoKSk7cmV0dXJuIF90KGUsdGhpcy5fdHJpZ2dlck5hbWUsbixpLF8scCx5LHgsQyx2LGIsTyl9LHR9KCksT3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5zdHlsZXM9dCx0aGlzLmRlZmF1bHRQYXJhbXM9ZX1yZXR1cm4gdC5wcm90b3R5cGUuYnVpbGRTdHlsZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj17fSxyPVAodGhpcy5kZWZhdWx0UGFyYW1zKTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj10W2VdO251bGwhPW4mJihyW2VdPW4pfSksdGhpcy5zdHlsZXMuc3R5bGVzLmZvckVhY2goZnVuY3Rpb24odCl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXt2YXIgaT10O09iamVjdC5rZXlzKGkpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG89aVt0XTtvLmxlbmd0aD4xJiYobz16KG8scixlKSksblt0XT1vfSl9fSksbn0sdH0oKSxDdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt2YXIgbj10aGlzO3RoaXMubmFtZT10LHRoaXMuYXN0PWUsdGhpcy50cmFuc2l0aW9uRmFjdG9yaWVzPVtdLHRoaXMuc3RhdGVzPXt9LGUuc3RhdGVzLmZvckVhY2goZnVuY3Rpb24odCl7bi5zdGF0ZXNbdC5uYW1lXT1uZXcgT3QodC5zdHlsZSx0Lm9wdGlvbnMmJnQub3B0aW9ucy5wYXJhbXN8fHt9KX0pLFN0KHRoaXMuc3RhdGVzLCJ0cnVlIiwiMSIpLFN0KHRoaXMuc3RhdGVzLCJmYWxzZSIsIjAiKSxlLnRyYW5zaXRpb25zLmZvckVhY2goZnVuY3Rpb24oZSl7bi50cmFuc2l0aW9uRmFjdG9yaWVzLnB1c2gobmV3IHh0KHQsZSxuLnN0YXRlcykpfSksdGhpcy5mYWxsYmFja1RyYW5zaXRpb249bmV3IHh0KHQse3R5cGU6MSxhbmltYXRpb246e3R5cGU6MixzdGVwczpbXSxvcHRpb25zOm51bGx9LG1hdGNoZXJzOltmdW5jdGlvbih0LGUpe3JldHVybiEwfV0sb3B0aW9uczpudWxsLHF1ZXJ5Q291bnQ6MCxkZXBDb3VudDowfSx0aGlzLnN0YXRlcyl9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiY29udGFpbnNRdWVyaWVzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXN0LnF1ZXJ5Q291bnQ+MH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5tYXRjaFRyYW5zaXRpb249ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHRoaXMudHJhbnNpdGlvbkZhY3Rvcmllcy5maW5kKGZ1bmN0aW9uKGkpe3JldHVybiBpLm1hdGNoKHQsZSxuLHIpfSl8fG51bGx9LHQucHJvdG90eXBlLm1hdGNoU3R5bGVzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5mYWxsYmFja1RyYW5zaXRpb24uYnVpbGRTdHlsZXModCxlLG4pfSx0fSgpO2Z1bmN0aW9uIFN0KHQsZSxuKXt0Lmhhc093blByb3BlcnR5KGUpP3QuaGFzT3duUHJvcGVydHkobil8fCh0W25dPXRbZV0pOnQuaGFzT3duUHJvcGVydHkobikmJih0W2VdPXRbbl0pfXZhciBFdD1uZXcgc3Qsa3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt0aGlzLmJvZHlOb2RlPXQsdGhpcy5fZHJpdmVyPWUsdGhpcy5fbm9ybWFsaXplcj1uLHRoaXMuX2FuaW1hdGlvbnM9e30sdGhpcy5fcGxheWVyc0J5SWQ9e30sdGhpcy5wbGF5ZXJzPVtdfXJldHVybiB0LnByb3RvdHlwZS5yZWdpc3Rlcj1mdW5jdGlvbih0LGUpe3ZhciBuPVtdLHI9dHQodGhpcy5fZHJpdmVyLGUsbik7aWYobi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gYnVpbGQgdGhlIGFuaW1hdGlvbiBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcnM6ICIrbi5qb2luKCJcbiIpKTt0aGlzLl9hbmltYXRpb25zW3RdPXJ9LHQucHJvdG90eXBlLl9idWlsZFBsYXllcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5lbGVtZW50LGk9cygwLHRoaXMuX25vcm1hbGl6ZXIsMCx0LmtleWZyYW1lcyxlLG4pO3JldHVybiB0aGlzLl9kcml2ZXIuYW5pbWF0ZShyLGksdC5kdXJhdGlvbix0LmRlbGF5LHQuZWFzaW5nLFtdLCEwKX0sdC5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgbyxzPVtdLHU9dGhpcy5fYW5pbWF0aW9uc1t0XSxsPW5ldyBNYXA7aWYodT8obz1jdCh0aGlzLl9kcml2ZXIsZSx1LCJuZy1lbnRlciIsIm5nLWxlYXZlIix7fSx7fSxuLEV0LHMpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPWYobCx0LmVsZW1lbnQse30pO3QucG9zdFN0eWxlUHJvcHMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XT1udWxsfSl9KToocy5wdXNoKCJUaGUgcmVxdWVzdGVkIGFuaW1hdGlvbiBkb2Vzbid0IGV4aXN0IG9yIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkIiksbz1bXSkscy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIHRoZSBhbmltYXRpb24gZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXJyb3JzOiAiK3Muam9pbigiXG4iKSk7bC5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXt0W25dPXIuX2RyaXZlci5jb21wdXRlU3R5bGUoZSxuLGkuYSl9KX0pO3ZhciBjPWEoby5tYXAoZnVuY3Rpb24odCl7dmFyIGU9bC5nZXQodC5lbGVtZW50KTtyZXR1cm4gci5fYnVpbGRQbGF5ZXIodCx7fSxlKX0pKTtyZXR1cm4gdGhpcy5fcGxheWVyc0J5SWRbdF09YyxjLm9uRGVzdHJveShmdW5jdGlvbigpe3JldHVybiByLmRlc3Ryb3kodCl9KSx0aGlzLnBsYXllcnMucHVzaChjKSxjfSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2dldFBsYXllcih0KTtlLmRlc3Ryb3koKSxkZWxldGUgdGhpcy5fcGxheWVyc0J5SWRbdF07dmFyIG49dGhpcy5wbGF5ZXJzLmluZGV4T2YoZSk7bj49MCYmdGhpcy5wbGF5ZXJzLnNwbGljZShuLDEpfSx0LnByb3RvdHlwZS5fZ2V0UGxheWVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3BsYXllcnNCeUlkW3RdO2lmKCFlKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGZpbmQgdGhlIHRpbWVsaW5lIHBsYXllciByZWZlcmVuY2VkIGJ5ICIrdCk7cmV0dXJuIGV9LHQucHJvdG90eXBlLmxpc3Rlbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1jKGUsIiIsIiIsIiIpO3JldHVybiB1KHRoaXMuX2dldFBsYXllcih0KSxuLGksciksZnVuY3Rpb24oKXt9fSx0LnByb3RvdHlwZS5jb21tYW5kPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCJyZWdpc3RlciIhPW4paWYoImNyZWF0ZSIhPW4pe3ZhciBpPXRoaXMuX2dldFBsYXllcih0KTtzd2l0Y2gobil7Y2FzZSJwbGF5IjppLnBsYXkoKTticmVhaztjYXNlInBhdXNlIjppLnBhdXNlKCk7YnJlYWs7Y2FzZSJyZXNldCI6aS5yZXNldCgpO2JyZWFrO2Nhc2UicmVzdGFydCI6aS5yZXN0YXJ0KCk7YnJlYWs7Y2FzZSJmaW5pc2giOmkuZmluaXNoKCk7YnJlYWs7Y2FzZSJpbml0IjppLmluaXQoKTticmVhaztjYXNlInNldFBvc2l0aW9uIjppLnNldFBvc2l0aW9uKHBhcnNlRmxvYXQoclswXSkpO2JyZWFrO2Nhc2UiZGVzdHJveSI6dGhpcy5kZXN0cm95KHQpfX1lbHNlIHRoaXMuY3JlYXRlKHQsZSxyWzBdfHx7fSk7ZWxzZSB0aGlzLnJlZ2lzdGVyKHQsclswXSl9LHR9KCksVHQ9W10sSXQ9e25hbWVzcGFjZUlkOiIiLHNldEZvclJlbW92YWw6ITEsc2V0Rm9yTW92ZTohMSxoYXNBbmltYXRpb246ITEscmVtb3ZlZEJlZm9yZVF1ZXJpZWQ6ITF9LEF0PXtuYW1lc3BhY2VJZDoiIixzZXRGb3JNb3ZlOiExLHNldEZvclJlbW92YWw6ITEsaGFzQW5pbWF0aW9uOiExLHJlbW92ZWRCZWZvcmVRdWVyaWVkOiEwfSxqdD0iX19uZ19yZW1vdmVkIixQdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt2b2lkIDA9PT1lJiYoZT0iIiksdGhpcy5uYW1lc3BhY2VJZD1lO3ZhciBuPXQmJnQuaGFzT3duUHJvcGVydHkoInZhbHVlIik7aWYodGhpcy52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dD90Om51bGx9KG4/dC52YWx1ZTp0KSxuKXt2YXIgcj1QKHQpO2RlbGV0ZSByLnZhbHVlLHRoaXMub3B0aW9ucz1yfWVsc2UgdGhpcy5vcHRpb25zPXt9O3RoaXMub3B0aW9ucy5wYXJhbXN8fCh0aGlzLm9wdGlvbnMucGFyYW1zPXt9KX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwYXJhbXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnBhcmFtc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5hYnNvcmJPcHRpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPXQucGFyYW1zO2lmKGUpe3ZhciBuPXRoaXMub3B0aW9ucy5wYXJhbXM7T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXtudWxsPT1uW3RdJiYoblt0XT1lW3RdKX0pfX0sdH0oKSxNdD1uZXcgUHQoInZvaWQiKSxOdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMuaWQ9dCx0aGlzLmhvc3RFbGVtZW50PWUsdGhpcy5fZW5naW5lPW4sdGhpcy5wbGF5ZXJzPVtdLHRoaXMuX3RyaWdnZXJzPXt9LHRoaXMuX3F1ZXVlPVtdLHRoaXMuX2VsZW1lbnRMaXN0ZW5lcnM9bmV3IE1hcCx0aGlzLl9ob3N0Q2xhc3NOYW1lPSJuZy10bnMtIit0LEJ0KGUsdGhpcy5faG9zdENsYXNzTmFtZSl9cmV0dXJuIHQucHJvdG90eXBlLmxpc3Rlbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaSxvPXRoaXM7aWYoIXRoaXMuX3RyaWdnZXJzLmhhc093blByb3BlcnR5KGUpKXRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGxpc3RlbiBvbiB0aGUgYW5pbWF0aW9uIHRyaWdnZXIgZXZlbnQgIicrbisnIiBiZWNhdXNlIHRoZSBhbmltYXRpb24gdHJpZ2dlciAiJytlKyJcIiBkb2Vzbid0IGV4aXN0ISIpO2lmKG51bGw9PW58fDA9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGxpc3RlbiBvbiB0aGUgYW5pbWF0aW9uIHRyaWdnZXIgIicrZSsnIiBiZWNhdXNlIHRoZSBwcm92aWRlZCBldmVudCBpcyB1bmRlZmluZWQhJyk7aWYoInN0YXJ0IiE9KGk9bikmJiJkb25lIiE9aSl0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBhbmltYXRpb24gdHJpZ2dlciBldmVudCAiJytuKyciIGZvciB0aGUgYW5pbWF0aW9uIHRyaWdnZXIgIicrZSsnIiBpcyBub3Qgc3VwcG9ydGVkIScpO3ZhciBhPWYodGhpcy5fZWxlbWVudExpc3RlbmVycyx0LFtdKSxzPXtuYW1lOmUscGhhc2U6bixjYWxsYmFjazpyfTthLnB1c2gocyk7dmFyIHU9Zih0aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LHQse30pO3JldHVybiB1Lmhhc093blByb3BlcnR5KGUpfHwoQnQodCwibmctdHJpZ2dlciIpLEJ0KHQsIm5nLXRyaWdnZXItIitlKSx1W2VdPU10KSxmdW5jdGlvbigpe28uX2VuZ2luZS5hZnRlckZsdXNoKGZ1bmN0aW9uKCl7dmFyIHQ9YS5pbmRleE9mKHMpO3Q+PTAmJmEuc3BsaWNlKHQsMSksby5fdHJpZ2dlcnNbZV18fGRlbGV0ZSB1W2VdfSl9fSx0LnByb3RvdHlwZS5yZWdpc3Rlcj1mdW5jdGlvbih0LGUpe3JldHVybiF0aGlzLl90cmlnZ2Vyc1t0XSYmKHRoaXMuX3RyaWdnZXJzW3RdPWUsITApfSx0LnByb3RvdHlwZS5fZ2V0VHJpZ2dlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl90cmlnZ2Vyc1t0XTtpZighZSl0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBhbmltYXRpb24gdHJpZ2dlciAiJyt0KyciIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIScpO3JldHVybiBlfSx0LnByb3RvdHlwZS50cmlnZ2VyPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXM7dm9pZCAwPT09ciYmKHI9ITApO3ZhciBvPXRoaXMuX2dldFRyaWdnZXIoZSksYT1uZXcgRHQodGhpcy5pZCxlLHQpLHM9dGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5nZXQodCk7c3x8KEJ0KHQsIm5nLXRyaWdnZXIiKSxCdCh0LCJuZy10cmlnZ2VyLSIrZSksdGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5zZXQodCxzPXt9KSk7dmFyIHU9c1tlXSxsPW5ldyBQdChuLHRoaXMuaWQpO2lmKCEobiYmbi5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKSkmJnUmJmwuYWJzb3JiT3B0aW9ucyh1Lm9wdGlvbnMpLHNbZV09bCx1fHwodT1NdCksInZvaWQiPT09bC52YWx1ZXx8dS52YWx1ZSE9PWwudmFsdWUpe3ZhciBjPWYodGhpcy5fZW5naW5lLnBsYXllcnNCeUVsZW1lbnQsdCxbXSk7Yy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QubmFtZXNwYWNlSWQ9PWkuaWQmJnQudHJpZ2dlck5hbWU9PWUmJnQucXVldWVkJiZ0LmRlc3Ryb3koKX0pO3ZhciBoPW8ubWF0Y2hUcmFuc2l0aW9uKHUudmFsdWUsbC52YWx1ZSx0LGwucGFyYW1zKSxkPSExO2lmKCFoKXtpZighcilyZXR1cm47aD1vLmZhbGxiYWNrVHJhbnNpdGlvbixkPSEwfXJldHVybiB0aGlzLl9lbmdpbmUudG90YWxRdWV1ZWRQbGF5ZXJzKyssdGhpcy5fcXVldWUucHVzaCh7ZWxlbWVudDp0LHRyaWdnZXJOYW1lOmUsdHJhbnNpdGlvbjpoLGZyb21TdGF0ZTp1LHRvU3RhdGU6bCxwbGF5ZXI6YSxpc0ZhbGxiYWNrVHJhbnNpdGlvbjpkfSksZHx8KEJ0KHQsIm5nLWFuaW1hdGUtcXVldWVkIiksYS5vblN0YXJ0KGZ1bmN0aW9uKCl7SHQodCwibmctYW5pbWF0ZS1xdWV1ZWQiKX0pKSxhLm9uRG9uZShmdW5jdGlvbigpe3ZhciBlPWkucGxheWVycy5pbmRleE9mKGEpO2U+PTAmJmkucGxheWVycy5zcGxpY2UoZSwxKTt2YXIgbj1pLl9lbmdpbmUucGxheWVyc0J5RWxlbWVudC5nZXQodCk7aWYobil7dmFyIHI9bi5pbmRleE9mKGEpO3I+PTAmJm4uc3BsaWNlKHIsMSl9fSksdGhpcy5wbGF5ZXJzLnB1c2goYSksYy5wdXNoKGEpLGF9aWYoIWZ1bmN0aW9uKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCkscj1PYmplY3Qua2V5cyhlKTtpZihuLmxlbmd0aCE9ci5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciBvPW5baV07aWYoIWUuaGFzT3duUHJvcGVydHkobyl8fHRbb10hPT1lW29dKXJldHVybiExfXJldHVybiEwfSh1LnBhcmFtcyxsLnBhcmFtcykpe3ZhciBwPVtdLG09by5tYXRjaFN0eWxlcyh1LnZhbHVlLHUucGFyYW1zLHApLHk9by5tYXRjaFN0eWxlcyhsLnZhbHVlLGwucGFyYW1zLHApO3AubGVuZ3RoP3RoaXMuX2VuZ2luZS5yZXBvcnRFcnJvcihwKTp0aGlzLl9lbmdpbmUuYWZ0ZXJGbHVzaChmdW5jdGlvbigpe0wodCxtKSxEKHQseSl9KX19LHQucHJvdG90eXBlLmRlcmVnaXN0ZXI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztkZWxldGUgdGhpcy5fdHJpZ2dlcnNbdF0sdGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5mb3JFYWNoKGZ1bmN0aW9uKGUsbil7ZGVsZXRlIGVbdF19KSx0aGlzLl9lbGVtZW50TGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24obixyKXtlLl9lbGVtZW50TGlzdGVuZXJzLnNldChyLG4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWUhPXR9KSl9KX0sdC5wcm90b3R5cGUuY2xlYXJFbGVtZW50Q2FjaGU9ZnVuY3Rpb24odCl7dGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5kZWxldGUodCksdGhpcy5fZWxlbWVudExpc3RlbmVycy5kZWxldGUodCk7dmFyIGU9dGhpcy5fZW5naW5lLnBsYXllcnNCeUVsZW1lbnQuZ2V0KHQpO2UmJihlLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQuZGVzdHJveSgpfSksdGhpcy5fZW5naW5lLnBsYXllcnNCeUVsZW1lbnQuZGVsZXRlKHQpKX0sdC5wcm90b3R5cGUuX3NpZ25hbFJlbW92YWxGb3JJbm5lclRyaWdnZXJzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO3ZvaWQgMD09PW4mJihuPSExKSx0aGlzLl9lbmdpbmUuZHJpdmVyLnF1ZXJ5KHQsIi5uZy10cmlnZ2VyIiwhMCkuZm9yRWFjaChmdW5jdGlvbih0KXtpZighdFtqdF0pe3ZhciBuPXIuX2VuZ2luZS5mZXRjaE5hbWVzcGFjZXNCeUVsZW1lbnQodCk7bi5zaXplP24uZm9yRWFjaChmdW5jdGlvbihuKXtyZXR1cm4gbi50cmlnZ2VyTGVhdmVBbmltYXRpb24odCxlLCExLCEwKX0pOnIuY2xlYXJFbGVtZW50Q2FjaGUodCl9fSl9LHQucHJvdG90eXBlLnRyaWdnZXJMZWF2ZUFuaW1hdGlvbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLG89dGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5nZXQodCk7aWYobyl7dmFyIHM9W107aWYoT2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbihlKXtpZihpLl90cmlnZ2Vyc1tlXSl7dmFyIG49aS50cmlnZ2VyKHQsZSwidm9pZCIscik7biYmcy5wdXNoKG4pfX0pLHMubGVuZ3RoKXJldHVybiB0aGlzLl9lbmdpbmUubWFya0VsZW1lbnRBc1JlbW92ZWQodGhpcy5pZCx0LCEwLGUpLG4mJmEocykub25Eb25lKGZ1bmN0aW9uKCl7cmV0dXJuIGkuX2VuZ2luZS5wcm9jZXNzTGVhdmVOb2RlKHQpfSksITB9cmV0dXJuITF9LHQucHJvdG90eXBlLnByZXBhcmVMZWF2ZUFuaW1hdGlvbkxpc3RlbmVycz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5fZWxlbWVudExpc3RlbmVycy5nZXQodCk7aWYobil7dmFyIHI9bmV3IFNldDtuLmZvckVhY2goZnVuY3Rpb24obil7dmFyIGk9bi5uYW1lO2lmKCFyLmhhcyhpKSl7ci5hZGQoaSk7dmFyIG89ZS5fdHJpZ2dlcnNbaV0uZmFsbGJhY2tUcmFuc2l0aW9uLGE9ZS5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5nZXQodClbaV18fE10LHM9bmV3IFB0KCJ2b2lkIiksdT1uZXcgRHQoZS5pZCxpLHQpO2UuX2VuZ2luZS50b3RhbFF1ZXVlZFBsYXllcnMrKyxlLl9xdWV1ZS5wdXNoKHtlbGVtZW50OnQsdHJpZ2dlck5hbWU6aSx0cmFuc2l0aW9uOm8sZnJvbVN0YXRlOmEsdG9TdGF0ZTpzLHBsYXllcjp1LGlzRmFsbGJhY2tUcmFuc2l0aW9uOiEwfSl9fSl9fSx0LnByb3RvdHlwZS5yZW1vdmVOb2RlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPXRoaXMuX2VuZ2luZTtpZih0LmNoaWxkRWxlbWVudENvdW50JiZ0aGlzLl9zaWduYWxSZW1vdmFsRm9ySW5uZXJUcmlnZ2Vycyh0LGUsITApLCF0aGlzLnRyaWdnZXJMZWF2ZUFuaW1hdGlvbih0LGUsITApKXt2YXIgaT0hMTtpZihyLnRvdGFsQW5pbWF0aW9ucyl7dmFyIG89ci5wbGF5ZXJzLmxlbmd0aD9yLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LmdldCh0KTpbXTtpZihvJiZvLmxlbmd0aClpPSEwO2Vsc2UgZm9yKHZhciBhPXQ7YT1hLnBhcmVudE5vZGU7KWlmKHIuc3RhdGVzQnlFbGVtZW50LmdldChhKSl7aT0hMDticmVha319dGhpcy5wcmVwYXJlTGVhdmVBbmltYXRpb25MaXN0ZW5lcnModCksaT9yLm1hcmtFbGVtZW50QXNSZW1vdmVkKHRoaXMuaWQsdCwhMSxlKTooci5hZnRlckZsdXNoKGZ1bmN0aW9uKCl7cmV0dXJuIG4uY2xlYXJFbGVtZW50Q2FjaGUodCl9KSxyLmRlc3Ryb3lJbm5lckFuaW1hdGlvbnModCksci5fb25SZW1vdmFsQ29tcGxldGUodCxlKSl9fSx0LnByb3RvdHlwZS5pbnNlcnROb2RlPWZ1bmN0aW9uKHQsZSl7QnQodCx0aGlzLl9ob3N0Q2xhc3NOYW1lKX0sdC5wcm90b3R5cGUuZHJhaW5RdWV1ZWRUcmFuc2l0aW9ucz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49W107cmV0dXJuIHRoaXMuX3F1ZXVlLmZvckVhY2goZnVuY3Rpb24ocil7dmFyIGk9ci5wbGF5ZXI7aWYoIWkuZGVzdHJveWVkKXt2YXIgbz1yLmVsZW1lbnQsYT1lLl9lbGVtZW50TGlzdGVuZXJzLmdldChvKTthJiZhLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZS5uYW1lPT1yLnRyaWdnZXJOYW1lKXt2YXIgbj1jKG8sci50cmlnZ2VyTmFtZSxyLmZyb21TdGF0ZS52YWx1ZSxyLnRvU3RhdGUudmFsdWUpO24uX2RhdGE9dCx1KHIucGxheWVyLGUucGhhc2UsbixlLmNhbGxiYWNrKX19KSxpLm1hcmtlZEZvckRlc3Ryb3k/ZS5fZW5naW5lLmFmdGVyRmx1c2goZnVuY3Rpb24oKXtpLmRlc3Ryb3koKX0pOm4ucHVzaChyKX19KSx0aGlzLl9xdWV1ZT1bXSxuLnNvcnQoZnVuY3Rpb24odCxuKXt2YXIgcj10LnRyYW5zaXRpb24uYXN0LmRlcENvdW50LGk9bi50cmFuc2l0aW9uLmFzdC5kZXBDb3VudDtyZXR1cm4gMD09cnx8MD09aT9yLWk6ZS5fZW5naW5lLmRyaXZlci5jb250YWluc0VsZW1lbnQodC5lbGVtZW50LG4uZWxlbWVudCk/MTotMX0pfSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKHQpe3RoaXMucGxheWVycy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmRlc3Ryb3koKX0pLHRoaXMuX3NpZ25hbFJlbW92YWxGb3JJbm5lclRyaWdnZXJzKHRoaXMuaG9zdEVsZW1lbnQsdCl9LHQucHJvdG90eXBlLmVsZW1lbnRDb250YWluc0RhdGE9ZnVuY3Rpb24odCl7dmFyIGU9ITE7cmV0dXJuIHRoaXMuX2VsZW1lbnRMaXN0ZW5lcnMuaGFzKHQpJiYoZT0hMCksISF0aGlzLl9xdWV1ZS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmVsZW1lbnQ9PT10fSl8fGV9LHR9KCksUnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt0aGlzLmJvZHlOb2RlPXQsdGhpcy5kcml2ZXI9ZSx0aGlzLl9ub3JtYWxpemVyPW4sdGhpcy5wbGF5ZXJzPVtdLHRoaXMubmV3SG9zdEVsZW1lbnRzPW5ldyBNYXAsdGhpcy5wbGF5ZXJzQnlFbGVtZW50PW5ldyBNYXAsdGhpcy5wbGF5ZXJzQnlRdWVyaWVkRWxlbWVudD1uZXcgTWFwLHRoaXMuc3RhdGVzQnlFbGVtZW50PW5ldyBNYXAsdGhpcy5kaXNhYmxlZE5vZGVzPW5ldyBTZXQsdGhpcy50b3RhbEFuaW1hdGlvbnM9MCx0aGlzLnRvdGFsUXVldWVkUGxheWVycz0wLHRoaXMuX25hbWVzcGFjZUxvb2t1cD17fSx0aGlzLl9uYW1lc3BhY2VMaXN0PVtdLHRoaXMuX2ZsdXNoRm5zPVtdLHRoaXMuX3doZW5RdWlldEZucz1bXSx0aGlzLm5hbWVzcGFjZXNCeUhvc3RFbGVtZW50PW5ldyBNYXAsdGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzPVtdLHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cz1bXSx0aGlzLm9uUmVtb3ZhbENvbXBsZXRlPWZ1bmN0aW9uKHQsZSl7fX1yZXR1cm4gdC5wcm90b3R5cGUuX29uUmVtb3ZhbENvbXBsZXRlPWZ1bmN0aW9uKHQsZSl7dGhpcy5vblJlbW92YWxDb21wbGV0ZSh0LGUpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInF1ZXVlZFBsYXllcnMiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5fbmFtZXNwYWNlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGxheWVycy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucXVldWVkJiZ0LnB1c2goZSl9KX0pLHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuY3JlYXRlTmFtZXNwYWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IE50KHQsZSx0aGlzKTtyZXR1cm4gZS5wYXJlbnROb2RlP3RoaXMuX2JhbGFuY2VOYW1lc3BhY2VMaXN0KG4sZSk6KHRoaXMubmV3SG9zdEVsZW1lbnRzLnNldChlLG4pLHRoaXMuY29sbGVjdEVudGVyRWxlbWVudChlKSksdGhpcy5fbmFtZXNwYWNlTG9va3VwW3RdPW59LHQucHJvdG90eXBlLl9iYWxhbmNlTmFtZXNwYWNlTGlzdD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX25hbWVzcGFjZUxpc3QubGVuZ3RoLTE7aWYobj49MCl7Zm9yKHZhciByPSExLGk9bjtpPj0wO2ktLSlpZih0aGlzLmRyaXZlci5jb250YWluc0VsZW1lbnQodGhpcy5fbmFtZXNwYWNlTGlzdFtpXS5ob3N0RWxlbWVudCxlKSl7dGhpcy5fbmFtZXNwYWNlTGlzdC5zcGxpY2UoaSsxLDAsdCkscj0hMDticmVha31yfHx0aGlzLl9uYW1lc3BhY2VMaXN0LnNwbGljZSgwLDAsdCl9ZWxzZSB0aGlzLl9uYW1lc3BhY2VMaXN0LnB1c2godCk7cmV0dXJuIHRoaXMubmFtZXNwYWNlc0J5SG9zdEVsZW1lbnQuc2V0KGUsdCksdH0sdC5wcm90b3R5cGUucmVnaXN0ZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9uYW1lc3BhY2VMb29rdXBbdF07cmV0dXJuIG58fChuPXRoaXMuY3JlYXRlTmFtZXNwYWNlKHQsZSkpLG59LHQucHJvdG90eXBlLnJlZ2lzdGVyVHJpZ2dlcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5fbmFtZXNwYWNlTG9va3VwW3RdO3ImJnIucmVnaXN0ZXIoZSxuKSYmdGhpcy50b3RhbEFuaW1hdGlvbnMrK30sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYodCl7dmFyIHI9dGhpcy5fZmV0Y2hOYW1lc3BhY2UodCk7dGhpcy5hZnRlckZsdXNoKGZ1bmN0aW9uKCl7bi5uYW1lc3BhY2VzQnlIb3N0RWxlbWVudC5kZWxldGUoci5ob3N0RWxlbWVudCksZGVsZXRlIG4uX25hbWVzcGFjZUxvb2t1cFt0XTt2YXIgZT1uLl9uYW1lc3BhY2VMaXN0LmluZGV4T2Yocik7ZT49MCYmbi5fbmFtZXNwYWNlTGlzdC5zcGxpY2UoZSwxKX0pLHRoaXMuYWZ0ZXJGbHVzaEFuaW1hdGlvbnNEb25lKGZ1bmN0aW9uKCl7cmV0dXJuIHIuZGVzdHJveShlKX0pfX0sdC5wcm90b3R5cGUuX2ZldGNoTmFtZXNwYWNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9uYW1lc3BhY2VMb29rdXBbdF19LHQucHJvdG90eXBlLmZldGNoTmFtZXNwYWNlc0J5RWxlbWVudD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgU2V0LG49dGhpcy5zdGF0ZXNCeUVsZW1lbnQuZ2V0KHQpO2lmKG4pZm9yKHZhciByPU9iamVjdC5rZXlzKG4pLGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89bltyW2ldXS5uYW1lc3BhY2VJZDtpZihvKXt2YXIgYT10aGlzLl9mZXRjaE5hbWVzcGFjZShvKTthJiZlLmFkZChhKX19cmV0dXJuIGV9LHQucHJvdG90eXBlLnRyaWdnZXI9ZnVuY3Rpb24odCxlLG4scil7aWYoTHQoZSkpe3ZhciBpPXRoaXMuX2ZldGNoTmFtZXNwYWNlKHQpO2lmKGkpcmV0dXJuIGkudHJpZ2dlcihlLG4sciksITB9cmV0dXJuITF9LHQucHJvdG90eXBlLmluc2VydE5vZGU9ZnVuY3Rpb24odCxlLG4scil7aWYoTHQoZSkpe3ZhciBpPWVbanRdO2lmKGkmJmkuc2V0Rm9yUmVtb3ZhbCl7aS5zZXRGb3JSZW1vdmFsPSExLGkuc2V0Rm9yTW92ZT0hMDt2YXIgbz10aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHMuaW5kZXhPZihlKTtvPj0wJiZ0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHMuc3BsaWNlKG8sMSl9aWYodCl7dmFyIGE9dGhpcy5fZmV0Y2hOYW1lc3BhY2UodCk7YSYmYS5pbnNlcnROb2RlKGUsbil9ciYmdGhpcy5jb2xsZWN0RW50ZXJFbGVtZW50KGUpfX0sdC5wcm90b3R5cGUuY29sbGVjdEVudGVyRWxlbWVudD1mdW5jdGlvbih0KXt0aGlzLmNvbGxlY3RlZEVudGVyRWxlbWVudHMucHVzaCh0KX0sdC5wcm90b3R5cGUubWFya0VsZW1lbnRBc0Rpc2FibGVkPWZ1bmN0aW9uKHQsZSl7ZT90aGlzLmRpc2FibGVkTm9kZXMuaGFzKHQpfHwodGhpcy5kaXNhYmxlZE5vZGVzLmFkZCh0KSxCdCh0LCJuZy1hbmltYXRlLWRpc2FibGVkIikpOnRoaXMuZGlzYWJsZWROb2Rlcy5oYXModCkmJih0aGlzLmRpc2FibGVkTm9kZXMuZGVsZXRlKHQpLEh0KHQsIm5nLWFuaW1hdGUtZGlzYWJsZWQiKSl9LHQucHJvdG90eXBlLnJlbW92ZU5vZGU9ZnVuY3Rpb24odCxlLG4pe2lmKEx0KGUpKXt2YXIgcj10P3RoaXMuX2ZldGNoTmFtZXNwYWNlKHQpOm51bGw7cj9yLnJlbW92ZU5vZGUoZSxuKTp0aGlzLm1hcmtFbGVtZW50QXNSZW1vdmVkKHQsZSwhMSxuKX1lbHNlIHRoaXMuX29uUmVtb3ZhbENvbXBsZXRlKGUsbil9LHQucHJvdG90eXBlLm1hcmtFbGVtZW50QXNSZW1vdmVkPWZ1bmN0aW9uKHQsZSxuLHIpe3RoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5wdXNoKGUpLGVbanRdPXtuYW1lc3BhY2VJZDp0LHNldEZvclJlbW92YWw6cixoYXNBbmltYXRpb246bixyZW1vdmVkQmVmb3JlUXVlcmllZDohMX19LHQucHJvdG90eXBlLmxpc3Rlbj1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiBMdChlKT90aGlzLl9mZXRjaE5hbWVzcGFjZSh0KS5saXN0ZW4oZSxuLHIsaSk6ZnVuY3Rpb24oKXt9fSx0LnByb3RvdHlwZS5fYnVpbGRJbnN0cnVjdGlvbj1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB0LnRyYW5zaXRpb24uYnVpbGQodGhpcy5kcml2ZXIsdC5lbGVtZW50LHQuZnJvbVN0YXRlLnZhbHVlLHQudG9TdGF0ZS52YWx1ZSxuLHIsdC5mcm9tU3RhdGUub3B0aW9ucyx0LnRvU3RhdGUub3B0aW9ucyxlLGkpfSx0LnByb3RvdHlwZS5kZXN0cm95SW5uZXJBbmltYXRpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLmRyaXZlci5xdWVyeSh0LCIubmctdHJpZ2dlciIsITApO24uZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5kZXN0cm95QWN0aXZlQW5pbWF0aW9uc0ZvckVsZW1lbnQodCl9KSwwIT10aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LnNpemUmJihuPXRoaXMuZHJpdmVyLnF1ZXJ5KHQsIi5uZy1hbmltYXRpbmciLCEwKSkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5maW5pc2hBY3RpdmVRdWVyaWVkQW5pbWF0aW9uT25FbGVtZW50KHQpfSl9LHQucHJvdG90eXBlLmRlc3Ryb3lBY3RpdmVBbmltYXRpb25zRm9yRWxlbWVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnBsYXllcnNCeUVsZW1lbnQuZ2V0KHQpO2UmJmUuZm9yRWFjaChmdW5jdGlvbih0KXt0LnF1ZXVlZD90Lm1hcmtlZEZvckRlc3Ryb3k9ITA6dC5kZXN0cm95KCl9KX0sdC5wcm90b3R5cGUuZmluaXNoQWN0aXZlUXVlcmllZEFuaW1hdGlvbk9uRWxlbWVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LmdldCh0KTtlJiZlLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQuZmluaXNoKCl9KX0sdC5wcm90b3R5cGUud2hlblJlbmRlcmluZ0RvbmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtpZih0LnBsYXllcnMubGVuZ3RoKXJldHVybiBhKHQucGxheWVycykub25Eb25lKGZ1bmN0aW9uKCl7cmV0dXJuIGUoKX0pO2UoKX0pfSx0LnByb3RvdHlwZS5wcm9jZXNzTGVhdmVOb2RlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10W2p0XTtpZihuJiZuLnNldEZvclJlbW92YWwpe2lmKHRbanRdPUl0LG4ubmFtZXNwYWNlSWQpe3RoaXMuZGVzdHJveUlubmVyQW5pbWF0aW9ucyh0KTt2YXIgcj10aGlzLl9mZXRjaE5hbWVzcGFjZShuLm5hbWVzcGFjZUlkKTtyJiZyLmNsZWFyRWxlbWVudENhY2hlKHQpfXRoaXMuX29uUmVtb3ZhbENvbXBsZXRlKHQsbi5zZXRGb3JSZW1vdmFsKX10aGlzLmRyaXZlci5tYXRjaGVzRWxlbWVudCh0LCIubmctYW5pbWF0ZS1kaXNhYmxlZCIpJiZ0aGlzLm1hcmtFbGVtZW50QXNEaXNhYmxlZCh0LCExKSx0aGlzLmRyaXZlci5xdWVyeSh0LCIubmctYW5pbWF0ZS1kaXNhYmxlZCIsITApLmZvckVhY2goZnVuY3Rpb24obil7ZS5tYXJrRWxlbWVudEFzRGlzYWJsZWQodCwhMSl9KX0sdC5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt2b2lkIDA9PT10JiYodD0tMSk7dmFyIG49W107aWYodGhpcy5uZXdIb3N0RWxlbWVudHMuc2l6ZSYmKHRoaXMubmV3SG9zdEVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5fYmFsYW5jZU5hbWVzcGFjZUxpc3QodCxuKX0pLHRoaXMubmV3SG9zdEVsZW1lbnRzLmNsZWFyKCkpLHRoaXMudG90YWxBbmltYXRpb25zJiZ0aGlzLmNvbGxlY3RlZEVudGVyRWxlbWVudHMubGVuZ3RoKWZvcih2YXIgcj0wO3I8dGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzLmxlbmd0aDtyKyspQnQodGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzW3JdLCJuZy1zdGFyLWluc2VydGVkIik7aWYodGhpcy5fbmFtZXNwYWNlTGlzdC5sZW5ndGgmJih0aGlzLnRvdGFsUXVldWVkUGxheWVyc3x8dGhpcy5jb2xsZWN0ZWRMZWF2ZUVsZW1lbnRzLmxlbmd0aCkpe3ZhciBpPVtdO3RyeXtuPXRoaXMuX2ZsdXNoQW5pbWF0aW9ucyhpLHQpfWZpbmFsbHl7Zm9yKHI9MDtyPGkubGVuZ3RoO3IrKylpW3JdKCl9fWVsc2UgZm9yKHI9MDtyPHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5sZW5ndGg7cisrKXRoaXMucHJvY2Vzc0xlYXZlTm9kZSh0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHNbcl0pO2lmKHRoaXMudG90YWxRdWV1ZWRQbGF5ZXJzPTAsdGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzLmxlbmd0aD0wLHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5sZW5ndGg9MCx0aGlzLl9mbHVzaEZucy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0KCl9KSx0aGlzLl9mbHVzaEZucz1bXSx0aGlzLl93aGVuUXVpZXRGbnMubGVuZ3RoKXt2YXIgbz10aGlzLl93aGVuUXVpZXRGbnM7dGhpcy5fd2hlblF1aWV0Rm5zPVtdLG4ubGVuZ3RoP2Eobikub25Eb25lKGZ1bmN0aW9uKCl7by5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0KCl9KX0pOm8uZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdCgpfSl9fSx0LnByb3RvdHlwZS5yZXBvcnRFcnJvcj1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBwcm9jZXNzIGFuaW1hdGlvbnMgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZmFpbGVkIHRyaWdnZXIgdHJhbnNpdGlvbnNcbiAiK3Quam9pbigiXG4iKSl9LHQucHJvdG90eXBlLl9mbHVzaEFuaW1hdGlvbnM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLG89bmV3IHN0LHM9W10sdT1uZXcgTWFwLGw9W10sYz1uZXcgTWFwLGg9bmV3IE1hcCxkPW5ldyBNYXAscD1uZXcgU2V0O3RoaXMuZGlzYWJsZWROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3AuYWRkKHQpO2Zvcih2YXIgZT1uLmRyaXZlci5xdWVyeSh0LCIubmctYW5pbWF0ZS1xdWV1ZWQiLCEwKSxyPTA7cjxlLmxlbmd0aDtyKyspcC5hZGQoZVtyXSl9KTt2YXIgbT10aGlzLmJvZHlOb2RlLHk9QXJyYXkuZnJvbSh0aGlzLnN0YXRlc0J5RWxlbWVudC5rZXlzKCkpLGc9VXQoeSx0aGlzLmNvbGxlY3RlZEVudGVyRWxlbWVudHMpLHY9bmV3IE1hcCxiPTA7Zy5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIG49Im5nLWVudGVyIitiKys7di5zZXQoZSxuKSx0LmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIEJ0KHQsbil9KX0pO2Zvcih2YXIgXz1bXSx3PW5ldyBTZXQseD1uZXcgU2V0LE89MDtPPHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5sZW5ndGg7TysrKShCPSh6PXRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50c1tPXSlbanRdKSYmQi5zZXRGb3JSZW1vdmFsJiYoXy5wdXNoKHopLHcuYWRkKHopLEIuaGFzQW5pbWF0aW9uP3RoaXMuZHJpdmVyLnF1ZXJ5KHosIi5uZy1zdGFyLWluc2VydGVkIiwhMCkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdy5hZGQodCl9KTp4LmFkZCh6KSk7dmFyIEM9bmV3IE1hcCxTPVV0KHksQXJyYXkuZnJvbSh3KSk7Uy5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIG49Im5nLWxlYXZlIitiKys7Qy5zZXQoZSxuKSx0LmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIEJ0KHQsbil9KX0pLHQucHVzaChmdW5jdGlvbigpe2cuZm9yRWFjaChmdW5jdGlvbih0LGUpe3ZhciBuPXYuZ2V0KGUpO3QuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gSHQodCxuKX0pfSksUy5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dmFyIG49Qy5nZXQoZSk7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBIdCh0LG4pfSl9KSxfLmZvckVhY2goZnVuY3Rpb24odCl7bi5wcm9jZXNzTGVhdmVOb2RlKHQpfSl9KTtmb3IodmFyIEU9W10saz1bXSxUPXRoaXMuX25hbWVzcGFjZUxpc3QubGVuZ3RoLTE7VD49MDtULS0pdGhpcy5fbmFtZXNwYWNlTGlzdFtUXS5kcmFpblF1ZXVlZFRyYW5zaXRpb25zKGUpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5wbGF5ZXIscj10LmVsZW1lbnQ7aWYoRS5wdXNoKGUpLG4uY29sbGVjdGVkRW50ZXJFbGVtZW50cy5sZW5ndGgpe3ZhciBpPXJbanRdO2lmKGkmJmkuc2V0Rm9yTW92ZSlyZXR1cm4gdm9pZCBlLmRlc3Ryb3koKX12YXIgYT0hbXx8IW4uZHJpdmVyLmNvbnRhaW5zRWxlbWVudChtLHIpLHU9Qy5nZXQocikscD12LmdldChyKSx5PW4uX2J1aWxkSW5zdHJ1Y3Rpb24odCxvLHAsdSxhKTtpZih5LmVycm9ycyYmeS5lcnJvcnMubGVuZ3RoKWsucHVzaCh5KTtlbHNle2lmKGEpcmV0dXJuIGUub25TdGFydChmdW5jdGlvbigpe3JldHVybiBMKHIseS5mcm9tU3R5bGVzKX0pLGUub25EZXN0cm95KGZ1bmN0aW9uKCl7cmV0dXJuIEQocix5LnRvU3R5bGVzKX0pLHZvaWQgcy5wdXNoKGUpO2lmKHQuaXNGYWxsYmFja1RyYW5zaXRpb24pcmV0dXJuIGUub25TdGFydChmdW5jdGlvbigpe3JldHVybiBMKHIseS5mcm9tU3R5bGVzKX0pLGUub25EZXN0cm95KGZ1bmN0aW9uKCl7cmV0dXJuIEQocix5LnRvU3R5bGVzKX0pLHZvaWQgcy5wdXNoKGUpO3kudGltZWxpbmVzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQuc3RyZXRjaFN0YXJ0aW5nS2V5ZnJhbWU9ITB9KSxvLmFwcGVuZChyLHkudGltZWxpbmVzKSxsLnB1c2goe2luc3RydWN0aW9uOnkscGxheWVyOmUsZWxlbWVudDpyfSkseS5xdWVyaWVkRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZihjLHQsW10pLnB1c2goZSl9KSx5LnByZVN0eWxlUHJvcHMuZm9yRWFjaChmdW5jdGlvbih0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKG4ubGVuZ3RoKXt2YXIgcj1oLmdldChlKTtyfHxoLnNldChlLHI9bmV3IFNldCksbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiByLmFkZCh0KX0pfX0pLHkucG9zdFN0eWxlUHJvcHMuZm9yRWFjaChmdW5jdGlvbih0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpLHI9ZC5nZXQoZSk7cnx8ZC5zZXQoZSxyPW5ldyBTZXQpLG4uZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gci5hZGQodCl9KX0pfX0pO2lmKGsubGVuZ3RoKXt2YXIgST1bXTtrLmZvckVhY2goZnVuY3Rpb24odCl7SS5wdXNoKCJAIit0LnRyaWdnZXJOYW1lKyIgaGFzIGZhaWxlZCBkdWUgdG86XG4iKSx0LmVycm9ycy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBJLnB1c2goIi0gIit0KyJcbiIpfSl9KSxFLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQuZGVzdHJveSgpfSksdGhpcy5yZXBvcnRFcnJvcihJKX12YXIgQT1uZXcgTWFwLGo9bmV3IE1hcDtsLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5lbGVtZW50O28uaGFzKGUpJiYoai5zZXQoZSxlKSxuLl9iZWZvcmVBbmltYXRpb25CdWlsZCh0LnBsYXllci5uYW1lc3BhY2VJZCx0Lmluc3RydWN0aW9uLEEpKX0pLHMuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT10LmVsZW1lbnQ7bi5fZ2V0UHJldmlvdXNQbGF5ZXJzKGUsITEsdC5uYW1lc3BhY2VJZCx0LnRyaWdnZXJOYW1lLG51bGwpLmZvckVhY2goZnVuY3Rpb24odCl7ZihBLGUsW10pLnB1c2godCksdC5kZXN0cm95KCl9KX0pO3ZhciBQPV8uZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBxdCh0LGgsZCl9KSxNPW5ldyBNYXA7VnQoTSx0aGlzLmRyaXZlcix4LGQsaS5hKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3F0KHQsaCxkKSYmUC5wdXNoKHQpfSk7dmFyIE49bmV3IE1hcDtnLmZvckVhY2goZnVuY3Rpb24odCxlKXtWdChOLG4uZHJpdmVyLG5ldyBTZXQodCksaCxpLm8pfSksUC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPU0uZ2V0KHQpLG49Ti5nZXQodCk7TS5zZXQodCxPYmplY3Qoci5hKSh7fSxlLG4pKX0pO3ZhciBSPVtdLEY9W10sVj17fTtsLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5lbGVtZW50LHI9dC5wbGF5ZXIsaT10Lmluc3RydWN0aW9uO2lmKG8uaGFzKGUpKXtpZihwLmhhcyhlKSlyZXR1cm4gci5vbkRlc3Ryb3koZnVuY3Rpb24oKXtyZXR1cm4gRChlLGkudG9TdHlsZXMpfSksci5kaXNhYmxlZD0hMCxyLm92ZXJyaWRlVG90YWxUaW1lKGkudG90YWxUaW1lKSx2b2lkIHMucHVzaChyKTt2YXIgbD1WO2lmKGouc2l6ZT4xKXtmb3IodmFyIGM9ZSxmPVtdO2M9Yy5wYXJlbnROb2RlOyl7dmFyIGg9ai5nZXQoYyk7aWYoaCl7bD1oO2JyZWFrfWYucHVzaChjKX1mLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGouc2V0KHQsbCl9KX12YXIgZD1uLl9idWlsZEFuaW1hdGlvbihyLm5hbWVzcGFjZUlkLGksQSx1LE4sTSk7aWYoci5zZXRSZWFsUGxheWVyKGQpLGw9PT1WKVIucHVzaChyKTtlbHNle3ZhciBtPW4ucGxheWVyc0J5RWxlbWVudC5nZXQobCk7bSYmbS5sZW5ndGgmJihyLnBhcmVudFBsYXllcj1hKG0pKSxzLnB1c2gocil9fWVsc2UgTChlLGkuZnJvbVN0eWxlcyksci5vbkRlc3Ryb3koZnVuY3Rpb24oKXtyZXR1cm4gRChlLGkudG9TdHlsZXMpfSksRi5wdXNoKHIpLHAuaGFzKGUpJiZzLnB1c2gocil9KSxGLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dS5nZXQodC5lbGVtZW50KTtpZihlJiZlLmxlbmd0aCl7dmFyIG49YShlKTt0LnNldFJlYWxQbGF5ZXIobil9fSkscy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QucGFyZW50UGxheWVyP3Quc3luY1BsYXllckV2ZW50cyh0LnBhcmVudFBsYXllcik6dC5kZXN0cm95KCl9KTtmb3IodmFyIFU9MDtVPF8ubGVuZ3RoO1UrKyl7dmFyIHosQj0oej1fW1VdKVtqdF07aWYoSHQoeiwibmctbGVhdmUiKSwhQnx8IUIuaGFzQW5pbWF0aW9uKXt2YXIgSD1bXTtpZihjLnNpemUpe3ZhciBXPWMuZ2V0KHopO1cmJlcubGVuZ3RoJiZILnB1c2guYXBwbHkoSCxPYmplY3Qoci5kKShXKSk7Zm9yKHZhciBxPXRoaXMuZHJpdmVyLnF1ZXJ5KHosIi5uZy1hbmltYXRpbmciLCEwKSxZPTA7WTxxLmxlbmd0aDtZKyspe3ZhciBHPWMuZ2V0KHFbWV0pO0cmJkcubGVuZ3RoJiZILnB1c2guYXBwbHkoSCxPYmplY3Qoci5kKShHKSl9fXZhciBRPUguZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiF0LmRlc3Ryb3llZH0pO1EubGVuZ3RoP1d0KHRoaXMseixRKTp0aGlzLnByb2Nlc3NMZWF2ZU5vZGUoeil9fXJldHVybiBfLmxlbmd0aD0wLFIuZm9yRWFjaChmdW5jdGlvbih0KXtuLnBsYXllcnMucHVzaCh0KSx0Lm9uRG9uZShmdW5jdGlvbigpe3QuZGVzdHJveSgpO3ZhciBlPW4ucGxheWVycy5pbmRleE9mKHQpO24ucGxheWVycy5zcGxpY2UoZSwxKX0pLHQucGxheSgpfSksUn0sdC5wcm90b3R5cGUuZWxlbWVudENvbnRhaW5zRGF0YT1mdW5jdGlvbih0LGUpe3ZhciBuPSExLHI9ZVtqdF07cmV0dXJuIHImJnIuc2V0Rm9yUmVtb3ZhbCYmKG49ITApLHRoaXMucGxheWVyc0J5RWxlbWVudC5oYXMoZSkmJihuPSEwKSx0aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LmhhcyhlKSYmKG49ITApLHRoaXMuc3RhdGVzQnlFbGVtZW50LmhhcyhlKSYmKG49ITApLHRoaXMuX2ZldGNoTmFtZXNwYWNlKHQpLmVsZW1lbnRDb250YWluc0RhdGEoZSl8fG59LHQucHJvdG90eXBlLmFmdGVyRmx1c2g9ZnVuY3Rpb24odCl7dGhpcy5fZmx1c2hGbnMucHVzaCh0KX0sdC5wcm90b3R5cGUuYWZ0ZXJGbHVzaEFuaW1hdGlvbnNEb25lPWZ1bmN0aW9uKHQpe3RoaXMuX3doZW5RdWlldEZucy5wdXNoKHQpfSx0LnByb3RvdHlwZS5fZ2V0UHJldmlvdXNQbGF5ZXJzPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89W107aWYoZSl7dmFyIGE9dGhpcy5wbGF5ZXJzQnlRdWVyaWVkRWxlbWVudC5nZXQodCk7YSYmKG89YSl9ZWxzZXt2YXIgcz10aGlzLnBsYXllcnNCeUVsZW1lbnQuZ2V0KHQpO2lmKHMpe3ZhciB1PSFpfHwidm9pZCI9PWk7cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QucXVldWVkfHwodXx8dC50cmlnZ2VyTmFtZT09cikmJm8ucHVzaCh0KX0pfX1yZXR1cm4obnx8cikmJihvPW8uZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiEobiYmbiE9dC5uYW1lc3BhY2VJZHx8ciYmciE9dC50cmlnZ2VyTmFtZSl9KSksb30sdC5wcm90b3R5cGUuX2JlZm9yZUFuaW1hdGlvbkJ1aWxkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxvLGE9ZS5lbGVtZW50LHM9ZS5pc1JlbW92YWxUcmFuc2l0aW9uP3ZvaWQgMDp0LHU9ZS5pc1JlbW92YWxUcmFuc2l0aW9uP3ZvaWQgMDplLnRyaWdnZXJOYW1lLGw9ZnVuY3Rpb24odCl7dmFyIHI9dC5lbGVtZW50LGk9ciE9PWEsbz1mKG4scixbXSk7Yy5fZ2V0UHJldmlvdXNQbGF5ZXJzKHIsaSxzLHUsZS50b1N0YXRlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0UmVhbFBsYXllcigpO2UuYmVmb3JlRGVzdHJveSYmZS5iZWZvcmVEZXN0cm95KCksdC5kZXN0cm95KCksby5wdXNoKHQpfSl9LGM9dGhpczt0cnl7Zm9yKHZhciBoPU9iamVjdChyLmUpKGUudGltZWxpbmVzKSxkPWgubmV4dCgpOyFkLmRvbmU7ZD1oLm5leHQoKSlsKGQudmFsdWUpfWNhdGNoKHQpe2k9e2Vycm9yOnR9fWZpbmFsbHl7dHJ5e2QmJiFkLmRvbmUmJihvPWgucmV0dXJuKSYmby5jYWxsKGgpfWZpbmFsbHl7aWYoaSl0aHJvdyBpLmVycm9yfX1MKGEsZS5mcm9tU3R5bGVzKX0sdC5wcm90b3R5cGUuX2J1aWxkQW5pbWF0aW9uPWZ1bmN0aW9uKHQsZSxuLHIsbyx1KXt2YXIgbD10aGlzLGM9ZS50cmlnZ2VyTmFtZSxoPWUuZWxlbWVudCxkPVtdLHA9bmV3IFNldCxtPW5ldyBTZXQseT1lLnRpbWVsaW5lcy5tYXAoZnVuY3Rpb24oZSl7dmFyIGE9ZS5lbGVtZW50O3AuYWRkKGEpO3ZhciBmPWFbanRdO2lmKGYmJmYucmVtb3ZlZEJlZm9yZVF1ZXJpZWQpcmV0dXJuIG5ldyBpLmQoZS5kdXJhdGlvbixlLmRlbGF5KTt2YXIgeSxnLHY9YSE9PWgsYj0oeT0obi5nZXQoYSl8fFR0KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0UmVhbFBsYXllcigpfSksZz1bXSxmdW5jdGlvbiB0KGUsbil7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBvPWVbcl07byBpbnN0YW5jZW9mIGkubj90KG8ucGxheWVycyxuKTpuLnB1c2gobyl9fSh5LGcpLGcpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hIXQuZWxlbWVudCYmdC5lbGVtZW50PT09YX0pLF89by5nZXQoYSksdz11LmdldChhKSx4PXMoMCxsLl9ub3JtYWxpemVyLDAsZS5rZXlmcmFtZXMsXyx3KSxPPWwuX2J1aWxkUGxheWVyKGUseCxiKTtpZihlLnN1YlRpbWVsaW5lJiZyJiZtLmFkZChhKSx2KXt2YXIgQz1uZXcgRHQodCxjLGEpO0Muc2V0UmVhbFBsYXllcihPKSxkLnB1c2goQyl9cmV0dXJuIE99KTtkLmZvckVhY2goZnVuY3Rpb24odCl7ZihsLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LHQuZWxlbWVudCxbXSkucHVzaCh0KSx0Lm9uRG9uZShmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0LGUsbil7dmFyIHI7aWYodCBpbnN0YW5jZW9mIE1hcCl7aWYocj10LmdldChlKSl7aWYoci5sZW5ndGgpe3ZhciBpPXIuaW5kZXhPZihuKTtyLnNwbGljZShpLDEpfTA9PXIubGVuZ3RoJiZ0LmRlbGV0ZShlKX19ZWxzZShyPXRbZV0pJiYoci5sZW5ndGgmJihpPXIuaW5kZXhPZihuKSxyLnNwbGljZShpLDEpKSwwPT1yLmxlbmd0aCYmZGVsZXRlIHRbZV0pO3JldHVybiByfShsLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LHQuZWxlbWVudCx0KX0pfSkscC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBCdCh0LCJuZy1hbmltYXRpbmciKX0pO3ZhciBnPWEoeSk7cmV0dXJuIGcub25EZXN0cm95KGZ1bmN0aW9uKCl7cC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBIdCh0LCJuZy1hbmltYXRpbmciKX0pLEQoaCxlLnRvU3R5bGVzKX0pLG0uZm9yRWFjaChmdW5jdGlvbih0KXtmKHIsdCxbXSkucHVzaChnKX0pLGd9LHQucHJvdG90eXBlLl9idWlsZFBsYXllcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGUubGVuZ3RoPjA/dGhpcy5kcml2ZXIuYW5pbWF0ZSh0LmVsZW1lbnQsZSx0LmR1cmF0aW9uLHQuZGVsYXksdC5lYXNpbmcsbik6bmV3IGkuZCh0LmR1cmF0aW9uLHQuZGVsYXkpfSx0fSgpLER0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5uYW1lc3BhY2VJZD10LHRoaXMudHJpZ2dlck5hbWU9ZSx0aGlzLmVsZW1lbnQ9bix0aGlzLl9wbGF5ZXI9bmV3IGkuZCx0aGlzLl9jb250YWluc1JlYWxQbGF5ZXI9ITEsdGhpcy5fcXVldWVkQ2FsbGJhY2tzPXt9LHRoaXMuZGVzdHJveWVkPSExLHRoaXMubWFya2VkRm9yRGVzdHJveT0hMSx0aGlzLmRpc2FibGVkPSExLHRoaXMucXVldWVkPSEwLHRoaXMudG90YWxUaW1lPTB9cmV0dXJuIHQucHJvdG90eXBlLnNldFJlYWxQbGF5ZXI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLl9jb250YWluc1JlYWxQbGF5ZXJ8fCh0aGlzLl9wbGF5ZXI9dCxPYmplY3Qua2V5cyh0aGlzLl9xdWV1ZWRDYWxsYmFja3MpLmZvckVhY2goZnVuY3Rpb24obil7ZS5fcXVldWVkQ2FsbGJhY2tzW25dLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIHUodCxuLHZvaWQgMCxlKX0pfSksdGhpcy5fcXVldWVkQ2FsbGJhY2tzPXt9LHRoaXMuX2NvbnRhaW5zUmVhbFBsYXllcj0hMCx0aGlzLm92ZXJyaWRlVG90YWxUaW1lKHQudG90YWxUaW1lKSx0aGlzLnF1ZXVlZD0hMSl9LHQucHJvdG90eXBlLmdldFJlYWxQbGF5ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGxheWVyfSx0LnByb3RvdHlwZS5vdmVycmlkZVRvdGFsVGltZT1mdW5jdGlvbih0KXt0aGlzLnRvdGFsVGltZT10fSx0LnByb3RvdHlwZS5zeW5jUGxheWVyRXZlbnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLl9wbGF5ZXI7bi50cmlnZ2VyQ2FsbGJhY2smJnQub25TdGFydChmdW5jdGlvbigpe3JldHVybiBuLnRyaWdnZXJDYWxsYmFjaygic3RhcnQiKX0pLHQub25Eb25lKGZ1bmN0aW9uKCl7cmV0dXJuIGUuZmluaXNoKCl9KSx0Lm9uRGVzdHJveShmdW5jdGlvbigpe3JldHVybiBlLmRlc3Ryb3koKX0pfSx0LnByb3RvdHlwZS5fcXVldWVFdmVudD1mdW5jdGlvbih0LGUpe2YodGhpcy5fcXVldWVkQ2FsbGJhY2tzLHQsW10pLnB1c2goZSl9LHQucHJvdG90eXBlLm9uRG9uZT1mdW5jdGlvbih0KXt0aGlzLnF1ZXVlZCYmdGhpcy5fcXVldWVFdmVudCgiZG9uZSIsdCksdGhpcy5fcGxheWVyLm9uRG9uZSh0KX0sdC5wcm90b3R5cGUub25TdGFydD1mdW5jdGlvbih0KXt0aGlzLnF1ZXVlZCYmdGhpcy5fcXVldWVFdmVudCgic3RhcnQiLHQpLHRoaXMuX3BsYXllci5vblN0YXJ0KHQpfSx0LnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24odCl7dGhpcy5xdWV1ZWQmJnRoaXMuX3F1ZXVlRXZlbnQoImRlc3Ryb3kiLHQpLHRoaXMuX3BsYXllci5vbkRlc3Ryb3kodCl9LHQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLl9wbGF5ZXIuaW5pdCgpfSx0LnByb3RvdHlwZS5oYXNTdGFydGVkPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMucXVldWVkJiZ0aGlzLl9wbGF5ZXIuaGFzU3RhcnRlZCgpfSx0LnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7IXRoaXMucXVldWVkJiZ0aGlzLl9wbGF5ZXIucGxheSgpfSx0LnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpeyF0aGlzLnF1ZXVlZCYmdGhpcy5fcGxheWVyLnBhdXNlKCl9LHQucHJvdG90eXBlLnJlc3RhcnQ9ZnVuY3Rpb24oKXshdGhpcy5xdWV1ZWQmJnRoaXMuX3BsYXllci5yZXN0YXJ0KCl9LHQucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbigpe3RoaXMuX3BsYXllci5maW5pc2goKX0sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZGVzdHJveWVkPSEwLHRoaXMuX3BsYXllci5kZXN0cm95KCl9LHQucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7IXRoaXMucXVldWVkJiZ0aGlzLl9wbGF5ZXIucmVzZXQoKX0sdC5wcm90b3R5cGUuc2V0UG9zaXRpb249ZnVuY3Rpb24odCl7dGhpcy5xdWV1ZWR8fHRoaXMuX3BsYXllci5zZXRQb3NpdGlvbih0KX0sdC5wcm90b3R5cGUuZ2V0UG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWV1ZWQ/MDp0aGlzLl9wbGF5ZXIuZ2V0UG9zaXRpb24oKX0sdC5wcm90b3R5cGUudHJpZ2dlckNhbGxiYWNrPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3BsYXllcjtlLnRyaWdnZXJDYWxsYmFjayYmZS50cmlnZ2VyQ2FsbGJhY2sodCl9LHR9KCk7ZnVuY3Rpb24gTHQodCl7cmV0dXJuIHQmJjE9PT10Lm5vZGVUeXBlfWZ1bmN0aW9uIEZ0KHQsZSl7dmFyIG49dC5zdHlsZS5kaXNwbGF5O3JldHVybiB0LnN0eWxlLmRpc3BsYXk9bnVsbCE9ZT9lOiJub25lIixufWZ1bmN0aW9uIFZ0KHQsZSxuLHIsaSl7dmFyIG89W107bi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBvLnB1c2goRnQodCkpfSk7dmFyIGE9W107ci5mb3JFYWNoKGZ1bmN0aW9uKG4scil7dmFyIG89e307bi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPW9bdF09ZS5jb21wdXRlU3R5bGUocix0LGkpO24mJjAhPW4ubGVuZ3RofHwocltqdF09QXQsYS5wdXNoKHIpKX0pLHQuc2V0KHIsbyl9KTt2YXIgcz0wO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIEZ0KHQsb1tzKytdKX0pLGF9ZnVuY3Rpb24gVXQodCxlKXt2YXIgbj1uZXcgTWFwO2lmKHQuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gbi5zZXQodCxbXSl9KSwwPT1lLmxlbmd0aClyZXR1cm4gbjt2YXIgcj1uZXcgU2V0KGUpLGk9bmV3IE1hcDtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uIHQoZSl7aWYoIWUpcmV0dXJuIDE7dmFyIG89aS5nZXQoZSk7aWYobylyZXR1cm4gbzt2YXIgYT1lLnBhcmVudE5vZGU7cmV0dXJuIG89bi5oYXMoYSk/YTpyLmhhcyhhKT8xOnQoYSksaS5zZXQoZSxvKSxvfSh0KTsxIT09ZSYmbi5nZXQoZSkucHVzaCh0KX0pLG59dmFyIHp0PSIkJGNsYXNzZXMiO2Z1bmN0aW9uIEJ0KHQsZSl7aWYodC5jbGFzc0xpc3QpdC5jbGFzc0xpc3QuYWRkKGUpO2Vsc2V7dmFyIG49dFt6dF07bnx8KG49dFt6dF09e30pLG5bZV09ITB9fWZ1bmN0aW9uIEh0KHQsZSl7aWYodC5jbGFzc0xpc3QpdC5jbGFzc0xpc3QucmVtb3ZlKGUpO2Vsc2V7dmFyIG49dFt6dF07biYmZGVsZXRlIG5bZV19fWZ1bmN0aW9uIFd0KHQsZSxuKXthKG4pLm9uRG9uZShmdW5jdGlvbigpe3JldHVybiB0LnByb2Nlc3NMZWF2ZU5vZGUoZSl9KX1mdW5jdGlvbiBxdCh0LGUsbil7dmFyIHI9bi5nZXQodCk7aWYoIXIpcmV0dXJuITE7dmFyIGk9ZS5nZXQodCk7cmV0dXJuIGk/ci5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBpLmFkZCh0KX0pOmUuc2V0KHQsciksbi5kZWxldGUodCksITB9dmFyIFl0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dmFyIHI9dGhpczt0aGlzLmJvZHlOb2RlPXQsdGhpcy5fZHJpdmVyPWUsdGhpcy5fdHJpZ2dlckNhY2hlPXt9LHRoaXMub25SZW1vdmFsQ29tcGxldGU9ZnVuY3Rpb24odCxlKXt9LHRoaXMuX3RyYW5zaXRpb25FbmdpbmU9bmV3IFJ0KHQsZSxuKSx0aGlzLl90aW1lbGluZUVuZ2luZT1uZXcga3QodCxlLG4pLHRoaXMuX3RyYW5zaXRpb25FbmdpbmUub25SZW1vdmFsQ29tcGxldGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gci5vblJlbW92YWxDb21wbGV0ZSh0LGUpfX1yZXR1cm4gdC5wcm90b3R5cGUucmVnaXN0ZXJUcmlnZ2VyPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89dCsiLSIrcixhPXRoaXMuX3RyaWdnZXJDYWNoZVtvXTtpZighYSl7dmFyIHM9W10sdT10dCh0aGlzLl9kcml2ZXIsaSxzKTtpZihzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoJ1RoZSBhbmltYXRpb24gdHJpZ2dlciAiJytyKyciIGhhcyBmYWlsZWQgdG8gYnVpbGQgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxuIC0gJytzLmpvaW4oIlxuIC0gIikpO2E9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IEN0KHQsZSl9KHIsdSksdGhpcy5fdHJpZ2dlckNhY2hlW29dPWF9dGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5yZWdpc3RlclRyaWdnZXIoZSxyLGEpfSx0LnByb3RvdHlwZS5yZWdpc3Rlcj1mdW5jdGlvbih0LGUpe3RoaXMuX3RyYW5zaXRpb25FbmdpbmUucmVnaXN0ZXIodCxlKX0sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbih0LGUpe3RoaXMuX3RyYW5zaXRpb25FbmdpbmUuZGVzdHJveSh0LGUpfSx0LnByb3RvdHlwZS5vbkluc2VydD1mdW5jdGlvbih0LGUsbixyKXt0aGlzLl90cmFuc2l0aW9uRW5naW5lLmluc2VydE5vZGUodCxlLG4scil9LHQucHJvdG90eXBlLm9uUmVtb3ZlPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl90cmFuc2l0aW9uRW5naW5lLnJlbW92ZU5vZGUodCxlLG4pfSx0LnByb3RvdHlwZS5kaXNhYmxlQW5pbWF0aW9ucz1mdW5jdGlvbih0LGUpe3RoaXMuX3RyYW5zaXRpb25FbmdpbmUubWFya0VsZW1lbnRBc0Rpc2FibGVkKHQsZSl9LHQucHJvdG90eXBlLnByb2Nlc3M9ZnVuY3Rpb24odCxlLG4saSl7aWYoIkAiPT1uLmNoYXJBdCgwKSl7dmFyIG89T2JqZWN0KHIuYykoaChuKSwyKTt0aGlzLl90aW1lbGluZUVuZ2luZS5jb21tYW5kKG9bMF0sZSxvWzFdLGkpfWVsc2UgdGhpcy5fdHJhbnNpdGlvbkVuZ2luZS50cmlnZ2VyKHQsZSxuLGkpfSx0LnByb3RvdHlwZS5saXN0ZW49ZnVuY3Rpb24odCxlLG4saSxvKXtpZigiQCI9PW4uY2hhckF0KDApKXt2YXIgYT1PYmplY3Qoci5jKShoKG4pLDIpO3JldHVybiB0aGlzLl90aW1lbGluZUVuZ2luZS5saXN0ZW4oYVswXSxlLGFbMV0sbyl9cmV0dXJuIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUubGlzdGVuKHQsZSxuLGksbyl9LHQucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQmJih0PS0xKSx0aGlzLl90cmFuc2l0aW9uRW5naW5lLmZsdXNoKHQpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInBsYXllcnMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5wbGF5ZXJzLmNvbmNhdCh0aGlzLl90aW1lbGluZUVuZ2luZS5wbGF5ZXJzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS53aGVuUmVuZGVyaW5nRG9uZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90cmFuc2l0aW9uRW5naW5lLndoZW5SZW5kZXJpbmdEb25lKCl9LHR9KCksR3Q9ImFuaW1hdGlvbiIsUXQ9ImFuaW1hdGlvbmVuZCIsS3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLHIsaSxvLGEpe3ZhciBzPXRoaXM7dGhpcy5fZWxlbWVudD10LHRoaXMuX25hbWU9ZSx0aGlzLl9kdXJhdGlvbj1uLHRoaXMuX2RlbGF5PXIsdGhpcy5fZWFzaW5nPWksdGhpcy5fZmlsbE1vZGU9byx0aGlzLl9vbkRvbmVGbj1hLHRoaXMuX2ZpbmlzaGVkPSExLHRoaXMuX2Rlc3Ryb3llZD0hMSx0aGlzLl9zdGFydFRpbWU9MCx0aGlzLl9wb3NpdGlvbj0wLHRoaXMuX2V2ZW50Rm49ZnVuY3Rpb24odCl7cmV0dXJuIHMuX2hhbmRsZUNhbGxiYWNrKHQpfX1yZXR1cm4gdC5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oKXt2YXIgdCxlLG47ZT10aGlzLl9kdXJhdGlvbisibXMgIit0aGlzLl9lYXNpbmcrIiAiK3RoaXMuX2RlbGF5KyJtcyAxIG5vcm1hbCAiK3RoaXMuX2ZpbGxNb2RlKyIgIit0aGlzLl9uYW1lLChuPWVlKHQ9dGhpcy5fZWxlbWVudCwiIikudHJpbSgpKS5sZW5ndGgmJihmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKSIsIj09PXQuY2hhckF0KG4pJiYwfShuKSxlPW4rIiwgIitlKSx0ZSh0LCIiLGUpLEp0KHRoaXMuX2VsZW1lbnQsdGhpcy5fZXZlbnRGbiwhMSksdGhpcy5fc3RhcnRUaW1lPURhdGUubm93KCl9LHQucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7WnQodGhpcy5fZWxlbWVudCx0aGlzLl9uYW1lLCJwYXVzZWQiKX0sdC5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7WnQodGhpcy5fZWxlbWVudCx0aGlzLl9uYW1lLCJydW5uaW5nIil9LHQucHJvdG90eXBlLnNldFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPVh0KHRoaXMuX2VsZW1lbnQsdGhpcy5fbmFtZSk7dGhpcy5fcG9zaXRpb249dCp0aGlzLl9kdXJhdGlvbix0ZSh0aGlzLl9lbGVtZW50LCJEZWxheSIsIi0iK3RoaXMuX3Bvc2l0aW9uKyJtcyIsZSl9LHQucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9ufSx0LnByb3RvdHlwZS5faGFuZGxlQ2FsbGJhY2s9ZnVuY3Rpb24odCl7dmFyIGU9dC5fbmdUZXN0TWFudWFsVGltZXN0YW1wfHxEYXRlLm5vdygpLG49MWUzKnBhcnNlRmxvYXQodC5lbGFwc2VkVGltZS50b0ZpeGVkKDMpKTt0LmFuaW1hdGlvbk5hbWU9PXRoaXMuX25hbWUmJk1hdGgubWF4KGUtdGhpcy5fc3RhcnRUaW1lLDApPj10aGlzLl9kZWxheSYmbj49dGhpcy5fZHVyYXRpb24mJnRoaXMuZmluaXNoKCl9LHQucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbigpe3RoaXMuX2ZpbmlzaGVkfHwodGhpcy5fZmluaXNoZWQ9ITAsdGhpcy5fb25Eb25lRm4oKSxKdCh0aGlzLl9lbGVtZW50LHRoaXMuX2V2ZW50Rm4sITApKX0sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0LGUsbixyO3RoaXMuX2Rlc3Ryb3llZHx8KHRoaXMuX2Rlc3Ryb3llZD0hMCx0aGlzLmZpbmlzaCgpLGU9dGhpcy5fbmFtZSwocj0kdChuPWVlKHQ9dGhpcy5fZWxlbWVudCwiIikuc3BsaXQoIiwiKSxlKSk+PTAmJihuLnNwbGljZShyLDEpLHRlKHQsIiIsbi5qb2luKCIsIikpKSl9LHR9KCk7ZnVuY3Rpb24gWnQodCxlLG4pe3RlKHQsIlBsYXlTdGF0ZSIsbixYdCh0LGUpKX1mdW5jdGlvbiBYdCh0LGUpe3ZhciBuPWVlKHQsIiIpO3JldHVybiBuLmluZGV4T2YoIiwiKT4wPyR0KG4uc3BsaXQoIiwiKSxlKTokdChbbl0sZSl9ZnVuY3Rpb24gJHQodCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25dLmluZGV4T2YoZSk+PTApcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gSnQodCxlLG4pe24/dC5yZW1vdmVFdmVudExpc3RlbmVyKFF0LGUpOnQuYWRkRXZlbnRMaXN0ZW5lcihRdCxlKX1mdW5jdGlvbiB0ZSh0LGUsbixyKXt2YXIgaT1HdCtlO2lmKG51bGwhPXIpe3ZhciBvPXQuc3R5bGVbaV07aWYoby5sZW5ndGgpe3ZhciBhPW8uc3BsaXQoIiwiKTthW3JdPW4sbj1hLmpvaW4oIiwiKX19dC5zdHlsZVtpXT1ufWZ1bmN0aW9uIGVlKHQsZSl7cmV0dXJuIHQuc3R5bGVbR3QrZV19dmFyIG5lPSJsaW5lYXIiLHJlPWZ1bmN0aW9uKHQpe3JldHVybiB0W3QuSU5JVElBTElaRUQ9MV09IklOSVRJQUxJWkVEIix0W3QuU1RBUlRFRD0yXT0iU1RBUlRFRCIsdFt0LkZJTklTSEVEPTNdPSJGSU5JU0hFRCIsdFt0LkRFU1RST1lFRD00XT0iREVTVFJPWUVEIix0fSh7fSksaWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLHIsaSxvLGEpe3RoaXMuZWxlbWVudD10LHRoaXMua2V5ZnJhbWVzPWUsdGhpcy5hbmltYXRpb25OYW1lPW4sdGhpcy5fZHVyYXRpb249cix0aGlzLl9kZWxheT1pLHRoaXMuX2ZpbmFsU3R5bGVzPWEsdGhpcy5fb25Eb25lRm5zPVtdLHRoaXMuX29uU3RhcnRGbnM9W10sdGhpcy5fb25EZXN0cm95Rm5zPVtdLHRoaXMuX3N0YXJ0ZWQ9ITEsdGhpcy5jdXJyZW50U25hcHNob3Q9e30sdGhpcy5zdGF0ZT0wLHRoaXMuZWFzaW5nPW98fG5lLHRoaXMudG90YWxUaW1lPXIraSx0aGlzLl9idWlsZFN0eWxlcigpfXJldHVybiB0LnByb3RvdHlwZS5vblN0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuX29uU3RhcnRGbnMucHVzaCh0KX0sdC5wcm90b3R5cGUub25Eb25lPWZ1bmN0aW9uKHQpe3RoaXMuX29uRG9uZUZucy5wdXNoKHQpfSx0LnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24odCl7dGhpcy5fb25EZXN0cm95Rm5zLnB1c2godCl9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmluaXQoKSx0aGlzLnN0YXRlPj1yZS5ERVNUUk9ZRUR8fCh0aGlzLnN0YXRlPXJlLkRFU1RST1lFRCx0aGlzLl9zdHlsZXIuZGVzdHJveSgpLHRoaXMuX2ZsdXNoU3RhcnRGbnMoKSx0aGlzLl9mbHVzaERvbmVGbnMoKSx0aGlzLl9vbkRlc3Ryb3lGbnMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdCgpfSksdGhpcy5fb25EZXN0cm95Rm5zPVtdKX0sdC5wcm90b3R5cGUuX2ZsdXNoRG9uZUZucz1mdW5jdGlvbigpe3RoaXMuX29uRG9uZUZucy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0KCl9KSx0aGlzLl9vbkRvbmVGbnM9W119LHQucHJvdG90eXBlLl9mbHVzaFN0YXJ0Rm5zPWZ1bmN0aW9uKCl7dGhpcy5fb25TdGFydEZucy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0KCl9KSx0aGlzLl9vblN0YXJ0Rm5zPVtdfSx0LnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oKXt0aGlzLmluaXQoKSx0aGlzLnN0YXRlPj1yZS5GSU5JU0hFRHx8KHRoaXMuc3RhdGU9cmUuRklOSVNIRUQsdGhpcy5fc3R5bGVyLmZpbmlzaCgpLHRoaXMuX2ZsdXNoU3RhcnRGbnMoKSx0aGlzLl9mbHVzaERvbmVGbnMoKSl9LHQucHJvdG90eXBlLnNldFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuX3N0eWxlci5zZXRQb3NpdGlvbih0KX0sdC5wcm90b3R5cGUuZ2V0UG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3R5bGVyLmdldFBvc2l0aW9uKCl9LHQucHJvdG90eXBlLmhhc1N0YXJ0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0ZT49cmUuU1RBUlRFRH0sdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3RoaXMuc3RhdGU+PXJlLklOSVRJQUxJWkVEfHwodGhpcy5zdGF0ZT1yZS5JTklUSUFMSVpFRCx0aGlzLl9zdHlsZXIuYXBwbHkoKSx0aGlzLl9kZWxheSYmdGhpcy5fc3R5bGVyLnBhdXNlKCkpfSx0LnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5pbml0KCksdGhpcy5oYXNTdGFydGVkKCl8fCh0aGlzLl9mbHVzaFN0YXJ0Rm5zKCksdGhpcy5zdGF0ZT1yZS5TVEFSVEVEKSx0aGlzLl9zdHlsZXIucmVzdW1lKCl9LHQucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5pbml0KCksdGhpcy5fc3R5bGVyLnBhdXNlKCl9LHQucHJvdG90eXBlLnJlc3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnJlc2V0KCksdGhpcy5wbGF5KCl9LHQucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5fc3R5bGVyLmRlc3Ryb3koKSx0aGlzLl9idWlsZFN0eWxlcigpLHRoaXMuX3N0eWxlci5hcHBseSgpfSx0LnByb3RvdHlwZS5fYnVpbGRTdHlsZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX3N0eWxlcj1uZXcgS3QodGhpcy5lbGVtZW50LHRoaXMuYW5pbWF0aW9uTmFtZSx0aGlzLl9kdXJhdGlvbix0aGlzLl9kZWxheSx0aGlzLmVhc2luZywiZm9yd2FyZHMiLGZ1bmN0aW9uKCl7cmV0dXJuIHQuZmluaXNoKCl9KX0sdC5wcm90b3R5cGUudHJpZ2dlckNhbGxiYWNrPWZ1bmN0aW9uKHQpe3ZhciBlPSJzdGFydCI9PXQ/dGhpcy5fb25TdGFydEZuczp0aGlzLl9vbkRvbmVGbnM7ZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0KCl9KSxlLmxlbmd0aD0wfSx0LnByb3RvdHlwZS5iZWZvcmVEZXN0cm95PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmluaXQoKTt2YXIgZT17fTtpZih0aGlzLmhhc1N0YXJ0ZWQoKSl7dmFyIG49dGhpcy5zdGF0ZT49cmUuRklOSVNIRUQ7T2JqZWN0LmtleXModGhpcy5fZmluYWxTdHlsZXMpLmZvckVhY2goZnVuY3Rpb24ocil7Im9mZnNldCIhPXImJihlW3JdPW4/dC5fZmluYWxTdHlsZXNbcl06USh0LmVsZW1lbnQscikpfSl9dGhpcy5jdXJyZW50U25hcHNob3Q9ZX0sdH0oKSxvZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dmFyIHI9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiByLmVsZW1lbnQ9ZSxyLl9zdGFydGluZ1N0eWxlcz17fSxyLl9faW5pdGlhbGl6ZWQ9ITEsci5fc3R5bGVzPVMobikscn1yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczshdGhpcy5fX2luaXRpYWxpemVkJiZ0aGlzLl9zdGFydGluZ1N0eWxlcyYmKHRoaXMuX19pbml0aWFsaXplZD0hMCxPYmplY3Qua2V5cyh0aGlzLl9zdHlsZXMpLmZvckVhY2goZnVuY3Rpb24odCl7ZS5fc3RhcnRpbmdTdHlsZXNbdF09ZS5lbGVtZW50LnN0eWxlW3RdfSksdC5wcm90b3R5cGUuaW5pdC5jYWxsKHRoaXMpKX0sZS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5fc3RhcnRpbmdTdHlsZXMmJih0aGlzLmluaXQoKSxPYmplY3Qua2V5cyh0aGlzLl9zdHlsZXMpLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUuX3N0eWxlc1t0XSl9KSx0LnByb3RvdHlwZS5wbGF5LmNhbGwodGhpcykpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9zdGFydGluZ1N0eWxlcyYmKE9iamVjdC5rZXlzKHRoaXMuX3N0YXJ0aW5nU3R5bGVzKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPWUuX3N0YXJ0aW5nU3R5bGVzW3RdO24/ZS5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHQsbik6ZS5lbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfSksdGhpcy5fc3RhcnRpbmdTdHlsZXM9bnVsbCx0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcykpfSxlfShpLmQpLGFlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuX2NvdW50PTAsdGhpcy5faGVhZD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJoZWFkIiksdGhpcy5fd2FybmluZ0lzc3VlZD0hMX1yZXR1cm4gdC5wcm90b3R5cGUudmFsaWRhdGVTdHlsZVByb3BlcnR5PWZ1bmN0aW9uKHQpe3JldHVybiB3KHQpfSx0LnByb3RvdHlwZS5tYXRjaGVzRWxlbWVudD1mdW5jdGlvbih0LGUpe3JldHVybiB4KHQsZSl9LHQucHJvdG90eXBlLmNvbnRhaW5zRWxlbWVudD1mdW5jdGlvbih0LGUpe3JldHVybiBPKHQsZSl9LHQucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQyh0LGUsbil9LHQucHJvdG90eXBlLmNvbXB1dGVTdHlsZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpW2VdfSx0LnByb3RvdHlwZS5idWlsZEtleWZyYW1lRWxlbWVudD1mdW5jdGlvbih0LGUsbil7dmFyIHI9IkBrZXlmcmFtZXMgIitlKyIge1xuIixpPSIiOyhuPW4ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBTKHQpfSkpLmZvckVhY2goZnVuY3Rpb24odCl7aT0iICI7dmFyIGU9cGFyc2VGbG9hdCh0Lm9mZnNldCk7cis9IiIraSsxMDAqZSsiJSB7XG4iLGkrPSIgIixPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPXRbZV07c3dpdGNoKGUpe2Nhc2Uib2Zmc2V0IjpyZXR1cm47Y2FzZSJlYXNpbmciOnJldHVybiB2b2lkKG4mJihyKz1pKyJhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiAiK24rIjtcbiIpKTtkZWZhdWx0OnJldHVybiB2b2lkKHIrPSIiK2krZSsiOiAiK24rIjtcbiIpfX0pLHIrPWkrIn1cbiJ9KSxyKz0ifVxuIjt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3JldHVybiBvLmlubmVySFRNTD1yLG99LHQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24odCxlLG4scixpLG8sYSl7dm9pZCAwPT09byYmKG89W10pLGEmJnRoaXMuX25vdGlmeUZhdWx0eVNjcnViYmVyKCk7dmFyIHM9by5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBpZX0pLHU9e307cShuLHIpJiZzLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dC5jdXJyZW50U25hcHNob3Q7T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdVt0XT1lW3RdfSl9KTt2YXIgbD1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gdCYmKEFycmF5LmlzQXJyYXkodCk/dDpbdF0pLmZvckVhY2goZnVuY3Rpb24odCl7T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXsib2Zmc2V0IiE9biYmImVhc2luZyIhPW4mJihlW25dPXRbbl0pfSl9KSxlfShlPVkodCxlLHUpKTtpZigwPT1uKXJldHVybiBuZXcgb2UodCxsKTt2YXIgYz0iZ2VuX2Nzc19rZl8iK3RoaXMuX2NvdW50KyssZj10aGlzLmJ1aWxkS2V5ZnJhbWVFbGVtZW50KHQsYyxlKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJoZWFkIikuYXBwZW5kQ2hpbGQoZik7dmFyIGg9bmV3IGllKHQsZSxjLG4scixpLGwpO3JldHVybiBoLm9uRGVzdHJveShmdW5jdGlvbigpe3ZhciB0Oyh0PWYpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9KSxofSx0LnByb3RvdHlwZS5fbm90aWZ5RmF1bHR5U2NydWJiZXI9ZnVuY3Rpb24oKXt0aGlzLl93YXJuaW5nSXNzdWVkfHwoY29uc29sZS53YXJuKCJAYW5ndWxhci9hbmltYXRpb25zOiBwbGVhc2UgbG9hZCB0aGUgd2ViLWFuaW1hdGlvbnMuanMgcG9seWZpbGwgdG8gYWxsb3cgcHJvZ3JhbW1hdGljIGFjY2Vzcy4uLlxuIiwiICB2aXNpdCBodHRwOi8vYml0Lmx5L0lXdWthbSB0byBsZWFybiBtb3JlIGFib3V0IHVzaW5nIHRoZSB3ZWItYW5pbWF0aW9uLWpzIHBvbHlmaWxsLiIpLHRoaXMuX3dhcm5pbmdJc3N1ZWQ9ITApfSx0fSgpLHNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5lbGVtZW50PXQsdGhpcy5rZXlmcmFtZXM9ZSx0aGlzLm9wdGlvbnM9bix0aGlzLl9vbkRvbmVGbnM9W10sdGhpcy5fb25TdGFydEZucz1bXSx0aGlzLl9vbkRlc3Ryb3lGbnM9W10sdGhpcy5faW5pdGlhbGl6ZWQ9ITEsdGhpcy5fZmluaXNoZWQ9ITEsdGhpcy5fc3RhcnRlZD0hMSx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy50aW1lPTAsdGhpcy5wYXJlbnRQbGF5ZXI9bnVsbCx0aGlzLmN1cnJlbnRTbmFwc2hvdD17fSx0aGlzLl9kdXJhdGlvbj1uLmR1cmF0aW9uLHRoaXMuX2RlbGF5PW4uZGVsYXl8fDAsdGhpcy50aW1lPXRoaXMuX2R1cmF0aW9uK3RoaXMuX2RlbGF5fXJldHVybiB0LnByb3RvdHlwZS5fb25GaW5pc2g9ZnVuY3Rpb24oKXt0aGlzLl9maW5pc2hlZHx8KHRoaXMuX2ZpbmlzaGVkPSEwLHRoaXMuX29uRG9uZUZucy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0KCl9KSx0aGlzLl9vbkRvbmVGbnM9W10pfSx0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5fYnVpbGRQbGF5ZXIoKSx0aGlzLl9wcmVwYXJlUGxheWVyQmVmb3JlU3RhcnQoKX0sdC5wcm90b3R5cGUuX2J1aWxkUGxheWVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZighdGhpcy5faW5pdGlhbGl6ZWQpe3RoaXMuX2luaXRpYWxpemVkPSEwO3ZhciBlPXRoaXMua2V5ZnJhbWVzO3RoaXMuZG9tUGxheWVyPXRoaXMuX3RyaWdnZXJXZWJBbmltYXRpb24odGhpcy5lbGVtZW50LGUsdGhpcy5vcHRpb25zKSx0aGlzLl9maW5hbEtleWZyYW1lPWUubGVuZ3RoP2VbZS5sZW5ndGgtMV06e30sdGhpcy5kb21QbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcigiZmluaXNoIixmdW5jdGlvbigpe3JldHVybiB0Ll9vbkZpbmlzaCgpfSl9fSx0LnByb3RvdHlwZS5fcHJlcGFyZVBsYXllckJlZm9yZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5fZGVsYXk/dGhpcy5fcmVzZXREb21QbGF5ZXJTdGF0ZSgpOnRoaXMuZG9tUGxheWVyLnBhdXNlKCl9LHQucHJvdG90eXBlLl90cmlnZ2VyV2ViQW5pbWF0aW9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdC5hbmltYXRlKGUsbil9LHQucHJvdG90eXBlLm9uU3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5fb25TdGFydEZucy5wdXNoKHQpfSx0LnByb3RvdHlwZS5vbkRvbmU9ZnVuY3Rpb24odCl7dGhpcy5fb25Eb25lRm5zLnB1c2godCl9LHQucHJvdG90eXBlLm9uRGVzdHJveT1mdW5jdGlvbih0KXt0aGlzLl9vbkRlc3Ryb3lGbnMucHVzaCh0KX0sdC5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuX2J1aWxkUGxheWVyKCksdGhpcy5oYXNTdGFydGVkKCl8fCh0aGlzLl9vblN0YXJ0Rm5zLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQoKX0pLHRoaXMuX29uU3RhcnRGbnM9W10sdGhpcy5fc3RhcnRlZD0hMCksdGhpcy5kb21QbGF5ZXIucGxheSgpfSx0LnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuaW5pdCgpLHRoaXMuZG9tUGxheWVyLnBhdXNlKCl9LHQucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbigpe3RoaXMuaW5pdCgpLHRoaXMuX29uRmluaXNoKCksdGhpcy5kb21QbGF5ZXIuZmluaXNoKCl9LHQucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5fcmVzZXREb21QbGF5ZXJTdGF0ZSgpLHRoaXMuX2Rlc3Ryb3llZD0hMSx0aGlzLl9maW5pc2hlZD0hMSx0aGlzLl9zdGFydGVkPSExfSx0LnByb3RvdHlwZS5fcmVzZXREb21QbGF5ZXJTdGF0ZT1mdW5jdGlvbigpe3RoaXMuZG9tUGxheWVyJiZ0aGlzLmRvbVBsYXllci5jYW5jZWwoKX0sdC5wcm90b3R5cGUucmVzdGFydD1mdW5jdGlvbigpe3RoaXMucmVzZXQoKSx0aGlzLnBsYXkoKX0sdC5wcm90b3R5cGUuaGFzU3RhcnRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGFydGVkfSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fZGVzdHJveWVkfHwodGhpcy5fZGVzdHJveWVkPSEwLHRoaXMuX3Jlc2V0RG9tUGxheWVyU3RhdGUoKSx0aGlzLl9vbkZpbmlzaCgpLHRoaXMuX29uRGVzdHJveUZucy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0KCl9KSx0aGlzLl9vbkRlc3Ryb3lGbnM9W10pfSx0LnByb3RvdHlwZS5zZXRQb3NpdGlvbj1mdW5jdGlvbih0KXt0aGlzLmRvbVBsYXllci5jdXJyZW50VGltZT10KnRoaXMudGltZX0sdC5wcm90b3R5cGUuZ2V0UG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21QbGF5ZXIuY3VycmVudFRpbWUvdGhpcy50aW1lfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInRvdGFsVGltZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWxheSt0aGlzLl9kdXJhdGlvbn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5iZWZvcmVEZXN0cm95PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXt9O3RoaXMuaGFzU3RhcnRlZCgpJiZPYmplY3Qua2V5cyh0aGlzLl9maW5hbEtleWZyYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKG4peyJvZmZzZXQiIT1uJiYoZVtuXT10Ll9maW5pc2hlZD90Ll9maW5hbEtleWZyYW1lW25dOlEodC5lbGVtZW50LG4pKX0pLHRoaXMuY3VycmVudFNuYXBzaG90PWV9LHQucHJvdG90eXBlLnRyaWdnZXJDYWxsYmFjaz1mdW5jdGlvbih0KXt2YXIgZT0ic3RhcnQiPT10P3RoaXMuX29uU3RhcnRGbnM6dGhpcy5fb25Eb25lRm5zO2UuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdCgpfSksZS5sZW5ndGg9MH0sdH0oKSx1ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9pc05hdGl2ZUltcGw9L1x7XHMqXFtuYXRpdmVccytjb2RlXF1ccypcfS8udGVzdChjZSgpLnRvU3RyaW5nKCkpLHRoaXMuX2Nzc0tleWZyYW1lc0RyaXZlcj1uZXcgYWV9cmV0dXJuIHQucHJvdG90eXBlLnZhbGlkYXRlU3R5bGVQcm9wZXJ0eT1mdW5jdGlvbih0KXtyZXR1cm4gdyh0KX0sdC5wcm90b3R5cGUubWF0Y2hlc0VsZW1lbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geCh0LGUpfSx0LnByb3RvdHlwZS5jb250YWluc0VsZW1lbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTyh0LGUpfSx0LnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIEModCxlLG4pfSx0LnByb3RvdHlwZS5jb21wdXRlU3R5bGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KVtlXX0sdC5wcm90b3R5cGUub3ZlcnJpZGVXZWJBbmltYXRpb25zU3VwcG9ydD1mdW5jdGlvbih0KXt0aGlzLl9pc05hdGl2ZUltcGw9dH0sdC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbih0LGUsbixyLGksbyxhKXtpZih2b2lkIDA9PT1vJiYobz1bXSksIWEmJiF0aGlzLl9pc05hdGl2ZUltcGwpcmV0dXJuIHRoaXMuX2Nzc0tleWZyYW1lc0RyaXZlci5hbmltYXRlKHQsZSxuLHIsaSxvKTt2YXIgcz17ZHVyYXRpb246bixkZWxheTpyLGZpbGw6MD09cj8iYm90aCI6ImZvcndhcmRzIn07aSYmKHMuZWFzaW5nPWkpO3ZhciB1PXt9LGw9by5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBzZX0pO3JldHVybiBxKG4scikmJmwuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT10LmN1cnJlbnRTbmFwc2hvdDtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB1W3RdPWVbdF19KX0pLGU9WSh0LGU9ZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIE0odCwhMSl9KSx1KSxuZXcgc2UodCxlLHMpfSx0fSgpO2Z1bmN0aW9uIGxlKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGNlKCl9ZnVuY3Rpb24gY2UoKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmdm9pZCAwIT09d2luZG93LmRvY3VtZW50JiZFbGVtZW50LnByb3RvdHlwZS5hbmltYXRlfHx7fX19LE96ZkI6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwibiIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pLG4uZChlLCJlIixmdW5jdGlvbigpe3JldHVybiBQfSksbi5kKGUsImYiLGZ1bmN0aW9uKCl7cmV0dXJuIHh9KSxuLmQoZSwiZyIsZnVuY3Rpb24oKXtyZXR1cm4gT30pLG4uZChlLCJsIixmdW5jdGlvbigpe3JldHVybiBOfSksbi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSxuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gTH0pLG4uZChlLCJjIixmdW5jdGlvbigpe3JldHVybiBGfSksbi5kKGUsImQiLGZ1bmN0aW9uKCl7cmV0dXJuIFN9KSxuLmQoZSwiaCIsZnVuY3Rpb24oKXtyZXR1cm4ga30pLG4uZChlLCJpIixmdW5jdGlvbigpe3JldHVybiBWfSksbi5kKGUsImsiLGZ1bmN0aW9uKCl7cmV0dXJuIEF9KSxuLmQoZSwiaiIsZnVuY3Rpb24oKXtyZXR1cm4gan0pLG4uZChlLCJtIixmdW5jdGlvbigpe3JldHVybiB6fSksbi5kKGUsIm8iLGZ1bmN0aW9uKCl7cmV0dXJuIEh9KTt2YXIgcj1uKCJDY25HIiksaT1uKCJJcDBSIiksbz1uKCIyNkZVIiksYT1uKCJWbkQvIikscz1uKCI2N1kvIiksdT1uKCJtclNHIik7ZnVuY3Rpb24gbCh0LGUpe3JldHVybiBmdW5jdGlvbigpe2lmKE9iamVjdChpLnEpKGUpKXt2YXIgbj0vXGJmbGV4LWxheW91dC0uKz9cYi9nO0FycmF5LmZyb20odC5xdWVyeVNlbGVjdG9yQWxsKCJbY2xhc3MqPSIrYysiXSIpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LmNvbnRhaW5zKGMrInNzciIpJiZ0LnBhcmVudE5vZGU/dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpOnQuY2xhc3NOYW1lLnJlcGxhY2UobiwiIil9KX19fXZhciBjPSJmbGV4LWxheW91dC0iLGY9bmV3IHIubygiRmxleCBMYXlvdXQgdG9rZW4sIGNvbGxlY3QgYWxsIGJyZWFrcG9pbnRzIGludG8gb25lIHByb3ZpZGVyIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiBudWxsfX0pLGg9W3thbGlhczoieHMiLG1lZGlhUXVlcnk6IihtaW4td2lkdGg6IDBweCkgYW5kIChtYXgtd2lkdGg6IDU5OXB4KSJ9LHthbGlhczoiZ3QteHMiLG92ZXJsYXBwaW5nOiEwLG1lZGlhUXVlcnk6IihtaW4td2lkdGg6IDYwMHB4KSJ9LHthbGlhczoibHQtc20iLG92ZXJsYXBwaW5nOiEwLG1lZGlhUXVlcnk6IihtYXgtd2lkdGg6IDU5OXB4KSJ9LHthbGlhczoic20iLG1lZGlhUXVlcnk6IihtaW4td2lkdGg6IDYwMHB4KSBhbmQgKG1heC13aWR0aDogOTU5cHgpIn0se2FsaWFzOiJndC1zbSIsb3ZlcmxhcHBpbmc6ITAsbWVkaWFRdWVyeToiKG1pbi13aWR0aDogOTYwcHgpIn0se2FsaWFzOiJsdC1tZCIsb3ZlcmxhcHBpbmc6ITAsbWVkaWFRdWVyeToiKG1heC13aWR0aDogOTU5cHgpIn0se2FsaWFzOiJtZCIsbWVkaWFRdWVyeToiKG1pbi13aWR0aDogOTYwcHgpIGFuZCAobWF4LXdpZHRoOiAxMjc5cHgpIn0se2FsaWFzOiJndC1tZCIsb3ZlcmxhcHBpbmc6ITAsbWVkaWFRdWVyeToiKG1pbi13aWR0aDogMTI4MHB4KSJ9LHthbGlhczoibHQtbGciLG92ZXJsYXBwaW5nOiEwLG1lZGlhUXVlcnk6IihtYXgtd2lkdGg6IDEyNzlweCkifSx7YWxpYXM6ImxnIixtZWRpYVF1ZXJ5OiIobWluLXdpZHRoOiAxMjgwcHgpIGFuZCAobWF4LXdpZHRoOiAxOTE5cHgpIn0se2FsaWFzOiJndC1sZyIsb3ZlcmxhcHBpbmc6ITAsbWVkaWFRdWVyeToiKG1pbi13aWR0aDogMTkyMHB4KSJ9LHthbGlhczoibHQteGwiLG92ZXJsYXBwaW5nOiEwLG1lZGlhUXVlcnk6IihtYXgtd2lkdGg6IDE5MjBweCkifSx7YWxpYXM6InhsIixtZWRpYVF1ZXJ5OiIobWluLXdpZHRoOiAxOTIwcHgpIGFuZCAobWF4LXdpZHRoOiA1MDAwcHgpIn1dLGQ9IihvcmllbnRhdGlvbjogbGFuZHNjYXBlKSBhbmQgKG1pbi13aWR0aDogOTYwcHgpIGFuZCAobWF4LXdpZHRoOiAxMjc5cHgpIixwPSIob3JpZW50YXRpb246IHBvcnRyYWl0KSBhbmQgKG1pbi13aWR0aDogNjAwcHgpIGFuZCAobWF4LXdpZHRoOiA4MzlweCkiLG09IihvcmllbnRhdGlvbjogcG9ydHJhaXQpIGFuZCAobWluLXdpZHRoOiA4NDBweCkiLHk9IihvcmllbnRhdGlvbjogbGFuZHNjYXBlKSBhbmQgKG1pbi13aWR0aDogMTI4MHB4KSIsZz17SEFORFNFVDoiKG9yaWVudGF0aW9uOiBwb3J0cmFpdCkgYW5kIChtYXgtd2lkdGg6IDU5OXB4KSwgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIGFuZCAobWF4LXdpZHRoOiA5NTlweCkiLFRBQkxFVDpwKyIgLCAiK2QsV0VCOm0rIiwgIit5KyIgIixIQU5EU0VUX1BPUlRSQUlUOiIob3JpZW50YXRpb246IHBvcnRyYWl0KSBhbmQgKG1heC13aWR0aDogNTk5cHgpIixUQUJMRVRfUE9SVFJBSVQ6cCsiICIsV0VCX1BPUlRSQUlUOiIiK20sSEFORFNFVF9MQU5EU0NBUEU6IihvcmllbnRhdGlvbjogbGFuZHNjYXBlKSBhbmQgKG1heC13aWR0aDogOTU5cHgpXSIsVEFCTEVUX0xBTkRTQ0FQRToiIitkLFdFQl9MQU5EU0NBUEU6IiIreX0sdj1be2FsaWFzOiJoYW5kc2V0IixtZWRpYVF1ZXJ5OmcuSEFORFNFVH0se2FsaWFzOiJoYW5kc2V0LmxhbmRzY2FwZSIsbWVkaWFRdWVyeTpnLkhBTkRTRVRfTEFORFNDQVBFfSx7YWxpYXM6ImhhbmRzZXQucG9ydHJhaXQiLG1lZGlhUXVlcnk6Zy5IQU5EU0VUX1BPUlRSQUlUfSx7YWxpYXM6InRhYmxldCIsbWVkaWFRdWVyeTpnLlRBQkxFVH0se2FsaWFzOiJ0YWJsZXQubGFuZHNjYXBlIixtZWRpYVF1ZXJ5OmcuVEFCTEVUfSx7YWxpYXM6InRhYmxldC5wb3J0cmFpdCIsbWVkaWFRdWVyeTpnLlRBQkxFVF9QT1JUUkFJVH0se2FsaWFzOiJ3ZWIiLG1lZGlhUXVlcnk6Zy5XRUIsb3ZlcmxhcHBpbmc6ITB9LHthbGlhczoid2ViLmxhbmRzY2FwZSIsbWVkaWFRdWVyeTpnLldFQl9MQU5EU0NBUEUsb3ZlcmxhcHBpbmc6ITB9LHthbGlhczoid2ViLnBvcnRyYWl0IixtZWRpYVF1ZXJ5OmcuV0VCX1BPUlRSQUlULG92ZXJsYXBwaW5nOiEwfV07ZnVuY3Rpb24gYih0KXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuLTFdPWFyZ3VtZW50c1tuXTtpZihudWxsPT10KXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7Zm9yKHZhciByPTAsaT1lO3I8aS5sZW5ndGg7cisrKXt2YXIgbz1pW3JdO2lmKG51bGwhPW8pZm9yKHZhciBhIGluIG8pby5oYXNPd25Qcm9wZXJ0eShhKSYmKHRbYV09b1thXSl9cmV0dXJuIHR9dmFyIF89LyhcLnwtfF8pL2c7ZnVuY3Rpb24gdyh0KXt2YXIgZT10Lmxlbmd0aD4wP3QuY2hhckF0KDApOiIiLG49dC5sZW5ndGg+MT90LnNsaWNlKDEpOiIiO3JldHVybiBlLnRvVXBwZXJDYXNlKCkrbn12YXIgeD17YWRkRmxleFRvUGFyZW50OiEwLGFkZE9yaWVudGF0aW9uQnBzOiExLGRpc2FibGVEZWZhdWx0QnBzOiExLGRpc2FibGVWZW5kb3JQcmVmaXhlczohMSxzZXJ2ZXJMb2FkZWQ6ITEsdXNlQ29sdW1uQmFzaXNaZXJvOiEwfSxPPW5ldyByLm8oIkZsZXggTGF5b3V0IHRva2VuLCBjb25maWcgb3B0aW9ucyBmb3IgdGhlIGxpYnJhcnkiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OmZ1bmN0aW9uKCl7cmV0dXJuIHh9fSksQz1uZXcgci5vKCJUb2tlbiAoQGFuZ3VsYXIvZmxleC1sYXlvdXQpIEJyZWFrcG9pbnRzIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbigpe3ZhciB0PU9iamVjdChyLlYpKGYpLGU9T2JqZWN0KHIuVikoTyksbj1bXS5jb25jYXQuYXBwbHkoW10sKHR8fFtdKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19KSk7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9W10pO3ZhciBuLHI9e307cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtyW3QuYWxpYXNdPXR9KSxlLmZvckVhY2goZnVuY3Rpb24odCl7clt0LmFsaWFzXT9iKHJbdC5hbGlhc10sdCk6clt0LmFsaWFzXT10fSksKG49T2JqZWN0LmtleXMocikubWFwKGZ1bmN0aW9uKHQpe3JldHVybiByW3RdfSkpLmZvckVhY2goZnVuY3Rpb24odCl7dC5zdWZmaXh8fCh0LnN1ZmZpeD10LmFsaWFzLnJlcGxhY2UoXywifCIpLnNwbGl0KCJ8IikubWFwKHcpLmpvaW4oIiIpLHQub3ZlcmxhcHBpbmc9ISF0Lm92ZXJsYXBwaW5nKX0pLG59KChlLmRpc2FibGVEZWZhdWx0QnBzP1tdOmgpLmNvbmNhdChlLmFkZE9yaWVudGF0aW9uQnBzP3Y6W10pLG4pfX0pLFM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX3JlZ2lzdHJ5PXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXRlbXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVnaXN0cnkuc2xpY2UoKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInNvcnRlZEl0ZW1zIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVnaXN0cnkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiEwPT09dC5vdmVybGFwcGluZ30pLGU9dGhpcy5fcmVnaXN0cnkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiEwIT09dC5vdmVybGFwcGluZ30pO3JldHVybiB0LmNvbmNhdChlKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5maW5kQnlBbGlhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVnaXN0cnkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5hbGlhcz09dH0pfHxudWxsfSx0LnByb3RvdHlwZS5maW5kQnlRdWVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVnaXN0cnkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5tZWRpYVF1ZXJ5PT10fSl8fG51bGx9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwib3ZlcmxhcHBpbmdzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlZ2lzdHJ5LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gMT09dC5vdmVybGFwcGluZ30pfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiYWxpYXNlcyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWdpc3RyeS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuYWxpYXN9KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInN1ZmZpeGVzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlZ2lzdHJ5Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5zdWZmaXg/dC5zdWZmaXg6IiJ9KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0Lm5nSW5qZWN0YWJsZURlZj1PYmplY3Qoci5SKSh7ZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiBuZXcgdChPYmplY3Qoci5WKShDKSl9LHRva2VuOnQscHJvdmlkZWRJbjoicm9vdCJ9KSx0fSgpLEU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLHIpe3ZvaWQgMD09PXQmJih0PSExKSx2b2lkIDA9PT1lJiYoZT0iYWxsIiksdm9pZCAwPT09biYmKG49IiIpLHZvaWQgMD09PXImJihyPSIiKSx0aGlzLm1hdGNoZXM9dCx0aGlzLm1lZGlhUXVlcnk9ZSx0aGlzLm1xQWxpYXM9bix0aGlzLnN1ZmZpeD1yfXJldHVybiB0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgdCh0aGlzLm1hdGNoZXMsdGhpcy5tZWRpYVF1ZXJ5LHRoaXMubXFBbGlhcyx0aGlzLnN1ZmZpeCl9LHR9KCksaz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMuX3pvbmU9dCx0aGlzLl9wbGF0Zm9ybUlkPWUsdGhpcy5fZG9jdW1lbnQ9bix0aGlzLl9yZWdpc3RyeT1uZXcgTWFwLHRoaXMuX3NvdXJjZT1uZXcgby5hKG5ldyBFKCEwKSksdGhpcy5fb2JzZXJ2YWJsZSQ9dGhpcy5fc291cmNlLmFzT2JzZXJ2YWJsZSgpfXJldHVybiB0LnByb3RvdHlwZS5pc0FjdGl2ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWdpc3RyeS5nZXQodCk7cmV0dXJuISFlJiZlLm1hdGNoZXN9LHQucHJvdG90eXBlLm9ic2VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnRoaXMucmVnaXN0ZXJRdWVyeSh0KSx0aGlzLl9vYnNlcnZhYmxlJC5waXBlKE9iamVjdChhLmEpKGZ1bmN0aW9uKGUpe3JldHVybiF0fHxlLm1lZGlhUXVlcnk9PT10fSkpfSx0LnByb3RvdHlwZS5yZWdpc3RlclF1ZXJ5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dD9bXToic3RyaW5nIj09dHlwZW9mIHQ/W3RdOihlPXt9LHQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiFlLmhhc093blByb3BlcnR5KHQpJiYoZVt0XT0hMCl9KSk7dmFyIGV9KHQpO24ubGVuZ3RoPjAmJih0aGlzLl9wcmVwYXJlUXVlcnlDU1Mobix0aGlzLl9kb2N1bWVudCksbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPWUuX3JlZ2lzdHJ5LmdldCh0KSxyPWZ1bmN0aW9uKG4pe2UuX3pvbmUucnVuKGZ1bmN0aW9uKCl7dmFyIHI9bmV3IEUobi5tYXRjaGVzLHQpO2UuX3NvdXJjZS5uZXh0KHIpfSl9O258fCgobj1lLl9idWlsZE1RTCh0KSkuYWRkTGlzdGVuZXIociksZS5fcmVnaXN0cnkuc2V0KHQsbikpLG4ubWF0Y2hlcyYmcihuKX0pKX0sdC5wcm90b3R5cGUuX2J1aWxkTVFMPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QoaS5xKSh0aGlzLl9wbGF0Zm9ybUlkKSYmd2luZG93Lm1hdGNoTWVkaWEoImFsbCIpLmFkZExpc3RlbmVyP3dpbmRvdy5tYXRjaE1lZGlhKHQpOnttYXRjaGVzOiJhbGwiPT09dHx8IiI9PT10LG1lZGlhOnQsYWRkTGlzdGVuZXI6ZnVuY3Rpb24oKXt9LHJlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKCl7fX19LHQucHJvdG90eXBlLl9wcmVwYXJlUXVlcnlDU1M9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hVFt0XX0pO2lmKG4ubGVuZ3RoPjApe3ZhciByPW4uam9pbigiLCAiKTt0cnl7dmFyIGk9ZS5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2kuc2V0QXR0cmlidXRlKCJ0eXBlIiwidGV4dC9jc3MiKSxpLnN0eWxlU2hlZXR8fGkuYXBwZW5kQ2hpbGQoZS5jcmVhdGVUZXh0Tm9kZSgiXG4vKlxuICBAYW5ndWxhci9mbGV4LWxheW91dCAtIHdvcmthcm91bmQgZm9yIHBvc3NpYmxlIGJyb3dzZXIgcXVpcmsgd2l0aCBtZWRpYVF1ZXJ5IGxpc3RlbmVyc1xuICBzZWUgaHR0cDovL2JpdC5seS8yc2Q0SE1QXG4qL1xuQG1lZGlhICIrcisiIHsuZngtcXVlcnktdGVzdHsgfX1cbiIpKSxlLmhlYWQuYXBwZW5kQ2hpbGQoaSksbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBUW3RdPWl9KX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKHQpfX19LHQubmdJbmplY3RhYmxlRGVmPU9iamVjdChyLlIpKHtmYWN0b3J5OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KE9iamVjdChyLlYpKHIueCksT2JqZWN0KHIuVikoci56KSxPYmplY3Qoci5WKShpLmQpKX0sdG9rZW46dCxwcm92aWRlZEluOiJyb290In0pLHR9KCksVD17fTtmdW5jdGlvbiBJKHQsZSl7cmV0dXJuIGIodCxlP3ttcUFsaWFzOmUuYWxpYXMsc3VmZml4OmUuc3VmZml4fTp7fSl9dmFyIEE9ZnVuY3Rpb24oKXt9LGo9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5icmVha3BvaW50cz10LHRoaXMubWVkaWFXYXRjaGVyPWUsdGhpcy5maWx0ZXJPdmVybGFwcz0hMCx0aGlzLl9yZWdpc3RlckJyZWFrUG9pbnRzKCksdGhpcy5vYnNlcnZhYmxlJD10aGlzLl9idWlsZE9ic2VydmFibGUoKX1yZXR1cm4gdC5wcm90b3R5cGUuaXNBY3RpdmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdG9NZWRpYVF1ZXJ5KHQpO3JldHVybiB0aGlzLm1lZGlhV2F0Y2hlci5pc0FjdGl2ZShlKX0sdC5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5vYnNlcnZhYmxlJC5zdWJzY3JpYmUodCxlLG4pfSx0LnByb3RvdHlwZS5hc09ic2VydmFibGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYnNlcnZhYmxlJH0sdC5wcm90b3R5cGUuX3JlZ2lzdGVyQnJlYWtQb2ludHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJyZWFrcG9pbnRzLnNvcnRlZEl0ZW1zLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5tZWRpYVF1ZXJ5fSk7dGhpcy5tZWRpYVdhdGNoZXIucmVnaXN0ZXJRdWVyeSh0KX0sdC5wcm90b3R5cGUuX2J1aWxkT2JzZXJ2YWJsZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzO3JldHVybiB0aGlzLm1lZGlhV2F0Y2hlci5vYnNlcnZlKCkucGlwZShPYmplY3QoYS5hKShmdW5jdGlvbih0KXtyZXR1cm4hMD09PXQubWF0Y2hlc30pLE9iamVjdChhLmEpKGZ1bmN0aW9uKG4pe3ZhciByPXQuYnJlYWtwb2ludHMuZmluZEJ5UXVlcnkobi5tZWRpYVF1ZXJ5KTtyZXR1cm4hcnx8IShlLmZpbHRlck92ZXJsYXBzJiZyLm92ZXJsYXBwaW5nKX0pLE9iamVjdChzLmEpKGZ1bmN0aW9uKGUpe3JldHVybiBJKGUsdC5fZmluZEJ5UXVlcnkoZS5tZWRpYVF1ZXJ5KSl9KSl9LHQucHJvdG90eXBlLl9maW5kQnlBbGlhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5icmVha3BvaW50cy5maW5kQnlBbGlhcyh0KX0sdC5wcm90b3R5cGUuX2ZpbmRCeVF1ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmJyZWFrcG9pbnRzLmZpbmRCeVF1ZXJ5KHQpfSx0LnByb3RvdHlwZS5fdG9NZWRpYVF1ZXJ5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2ZpbmRCeUFsaWFzKHQpfHx0aGlzLl9maW5kQnlRdWVyeSh0KTtyZXR1cm4gZT9lLm1lZGlhUXVlcnk6dH0sdC5uZ0luamVjdGFibGVEZWY9T2JqZWN0KHIuUikoe2ZhY3Rvcnk6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQoT2JqZWN0KHIuVikoUyksT2JqZWN0KHIuVikoaykpfSx0b2tlbjp0LHByb3ZpZGVkSW46InJvb3QifSksdH0oKSxQPWZ1bmN0aW9uKCl7fSxNPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuc3R5bGVzaGVldD1uZXcgTWFwfXJldHVybiB0LnByb3RvdHlwZS5hZGRTdHlsZVRvRWxlbWVudD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5zdHlsZXNoZWV0LmdldCh0KTtyP3Iuc2V0KGUsbik6dGhpcy5zdHlsZXNoZWV0LnNldCh0LG5ldyBNYXAoW1tlLG5dXSkpfSx0LnByb3RvdHlwZS5jbGVhclN0eWxlcz1mdW5jdGlvbigpe3RoaXMuc3R5bGVzaGVldC5jbGVhcigpfSx0LnByb3RvdHlwZS5nZXRTdHlsZUZvckVsZW1lbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnN0eWxlc2hlZXQuZ2V0KHQpLHI9IiI7aWYobil7dmFyIGk9bi5nZXQoZSk7Im51bWJlciIhPXR5cGVvZiBpJiYic3RyaW5nIiE9dHlwZW9mIGl8fChyPWkrIiIpfXJldHVybiByfSx0Lm5nSW5qZWN0YWJsZURlZj1PYmplY3Qoci5SKSh7ZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiBuZXcgdH0sdG9rZW46dCxwcm92aWRlZEluOiJyb290In0pLHR9KCksTj1uZXcgci5vKCJGbGV4TGF5b3V0U2VydmVyTG9hZGVkIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiExfX0pLFI9WyJyb3ciLCJjb2x1bW4iLCJyb3ctcmV2ZXJzZSIsImNvbHVtbi1yZXZlcnNlIl0sRD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMuX29wdGlvbnM9dCx0aGlzLl9tZWRpYU1vbml0b3I9ZSx0aGlzLl9vbk1lZGlhQ2hhbmdlcz1uLHRoaXMuX3N1YnNjcmliZXJzPVtdLHRoaXMuX3JlZ2lzdHJ5TWFwPXRoaXMuX2J1aWxkUmVnaXN0cnlNYXAoKSx0aGlzLl9zdWJzY3JpYmVycz10aGlzLl9jb25maWd1cmVDaGFuZ2VPYnNlcnZlcnMoKX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJyZWdpc3RyeUZyb21MYXJnZXN0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlZ2lzdHJ5TWFwLnNsaWNlKCkucmV2ZXJzZSgpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibWVkaWFNb25pdG9yIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21lZGlhTW9uaXRvcn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImFjdGl2YXRlZElucHV0S2V5Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FjdGl2YXRlZElucHV0S2V5fHx0aGlzLl9vcHRpb25zLmJhc2VLZXl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJhY3RpdmF0ZWRJbnB1dCIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYWN0aXZhdGVkSW5wdXRLZXk7cmV0dXJuIHRoaXMuaGFzS2V5VmFsdWUodCk/dGhpcy5fbG9va3VwS2V5VmFsdWUodCk6dGhpcy5fb3B0aW9ucy5kZWZhdWx0VmFsdWV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaGFzS2V5VmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX29wdGlvbnMuaW5wdXRLZXlzW3RdfSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbih0KXt0LnVuc3Vic2NyaWJlKCl9KSx0aGlzLl9zdWJzY3JpYmVycz1bXX0sdC5wcm90b3R5cGUuX2NvbmZpZ3VyZUNoYW5nZU9ic2VydmVycz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1bXTtyZXR1cm4gdGhpcy5fcmVnaXN0cnlNYXAuZm9yRWFjaChmdW5jdGlvbihuKXt0Ll9rZXlJblVzZShuLmtleSkmJmUucHVzaCh0Lm1lZGlhTW9uaXRvci5vYnNlcnZlKG4uYWxpYXMpLnBpcGUoT2JqZWN0KHMuYSkoZnVuY3Rpb24oZSl7cmV0dXJuKGU9ZS5jbG9uZSgpKS5wcm9wZXJ0eT10Ll9vcHRpb25zLmJhc2VLZXksZX0pKS5zdWJzY3JpYmUoZnVuY3Rpb24oZSl7dC5fb25Nb25pdG9yRXZlbnRzKGUpfSkpfSksZX0sdC5wcm90b3R5cGUuX2J1aWxkUmVnaXN0cnlNYXA9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLm1lZGlhTW9uaXRvci5icmVha3BvaW50cy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGIoe30sZSx7YmFzZUtleTp0Ll9vcHRpb25zLmJhc2VLZXksa2V5OnQuX29wdGlvbnMuYmFzZUtleStlLnN1ZmZpeH0pfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9rZXlJblVzZShlLmtleSl9KX0sdC5wcm90b3R5cGUuX29uTW9uaXRvckV2ZW50cz1mdW5jdGlvbih0KXt0LnByb3BlcnR5PT10aGlzLl9vcHRpb25zLmJhc2VLZXkmJih0LnZhbHVlPXRoaXMuX2NhbGN1bGF0ZUFjdGl2YXRlZFZhbHVlKHQpLHRoaXMuX29uTWVkaWFDaGFuZ2VzKHQpKX0sdC5wcm90b3R5cGUuX2tleUluVXNlPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10aGlzLl9sb29rdXBLZXlWYWx1ZSh0KX0sdC5wcm90b3R5cGUuX2NhbGN1bGF0ZUFjdGl2YXRlZFZhbHVlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX29wdGlvbnMuYmFzZUtleSt0LnN1ZmZpeCxuPXRoaXMuX2FjdGl2YXRlZElucHV0S2V5O3JldHVybiB0aGlzLl9hY3RpdmF0ZWRJbnB1dEtleT10aGlzLl92YWxpZGF0ZUlucHV0S2V5KG49dC5tYXRjaGVzP2U6bj09ZT8iIjpuKSx0aGlzLmFjdGl2YXRlZElucHV0fSx0LnByb3RvdHlwZS5fdmFsaWRhdGVJbnB1dEtleT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49ZnVuY3Rpb24odCl7cmV0dXJuIWUuX2tleUluVXNlKHQpfTtyZXR1cm4gbih0KSYmdGhpcy5tZWRpYU1vbml0b3IuYWN0aXZlT3ZlcmxhcHMuc29tZShmdW5jdGlvbihyKXt2YXIgaT1lLl9vcHRpb25zLmJhc2VLZXkrci5zdWZmaXg7cmV0dXJuIW4oaSkmJih0PWksITApfSksdH0sdC5wcm90b3R5cGUuX2xvb2t1cEtleVZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vcHRpb25zLmlucHV0S2V5c1t0XX0sdH0oKSxMPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5fbWVkaWFNb25pdG9yPXQsdGhpcy5fZWxlbWVudFJlZj1lLHRoaXMuX3N0eWxlcj1uLHRoaXMuX2lucHV0TWFwPXt9LHRoaXMuX2hhc0luaXRpYWxpemVkPSExfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImhhc01lZGlhUXVlcnlMaXN0ZW5lciIse2dldDpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fbXFBY3RpdmF0aW9ufSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiYWN0aXZhdGVkVmFsdWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbXFBY3RpdmF0aW9uP3RoaXMuX21xQWN0aXZhdGlvbi5hY3RpdmF0ZWRJbnB1dDp2b2lkIDB9LHNldDpmdW5jdGlvbih0KXt2YXIgZSxuPSJiYXNlS2V5Ijt0aGlzLl9tcUFjdGl2YXRpb24mJihlPXRoaXMuX2lucHV0TWFwW249dGhpcy5fbXFBY3RpdmF0aW9uLmFjdGl2YXRlZElucHV0S2V5XSx0aGlzLl9pbnB1dE1hcFtuXT10KTt2YXIgaSxvPW5ldyByLkcoZSx0LCExKTt0aGlzLm5nT25DaGFuZ2VzKCgoaT17fSlbbl09byxpKSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwYXJlbnRFbGVtZW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnROb2RlfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibmF0aXZlRWxlbWVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuX3F1ZXJ5SW5wdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2lucHV0TWFwW3RdfSx0LnByb3RvdHlwZS5uZ09uSW5pdD1mdW5jdGlvbigpe3RoaXMuX2Rpc3BsYXk9dGhpcy5fZ2V0RGlzcGxheVN0eWxlKCksdGhpcy5faGFzSW5pdGlhbGl6ZWQ9ITB9LHQucHJvdG90eXBlLm5nT25DaGFuZ2VzPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiQmFzZURpcmVjdGl2ZTo6bmdPbkNoYW5nZXMgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3M6ICIrdCl9LHQucHJvdG90eXBlLm5nT25EZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fbXFBY3RpdmF0aW9uJiZ0aGlzLl9tcUFjdGl2YXRpb24uZGVzdHJveSgpLGRlbGV0ZSB0aGlzLl9tZWRpYU1vbml0b3J9LHQucHJvdG90eXBlLl9nZXREZWZhdWx0VmFsPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fcXVlcnlJbnB1dCh0KTtyZXR1cm4gdm9pZCAwIT09biYmbnVsbCE9PW4mJiIiIT09bj9uOmV9LHQucHJvdG90eXBlLl9nZXREaXNwbGF5U3R5bGU9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXRoaXMubmF0aXZlRWxlbWVudCksdGhpcy5fc3R5bGVyLmxvb2t1cFN0eWxlKHQsImRpc3BsYXkiKX0sdC5wcm90b3R5cGUuX2dldEF0dHJpYnV0ZVZhbHVlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXRoaXMubmF0aXZlRWxlbWVudCksdGhpcy5fc3R5bGVyLmxvb2t1cEF0dHJpYnV0ZVZhbHVlKGUsdCl9LHQucHJvdG90eXBlLl9nZXRGbGV4Rmxvd0RpcmVjdGlvbj1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPSExKTt2YXIgbixyPSJyb3ciO2lmKHQmJihyPShuPXRoaXMuX3N0eWxlci5nZXRGbG93RGlyZWN0aW9uKHQpKVswXSwhblsxXSYmZSkpe3ZhciBpPWZ1bmN0aW9uKHQpe3ZhciBlLG4scj1mdW5jdGlvbih0KXt2YXIgZT0odD10P3QudG9Mb3dlckNhc2UoKToiIikuc3BsaXQoIiAiKSxuPWVbMF0scj1lWzFdLGk9ZVsyXTtyZXR1cm4gUi5maW5kKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09bn0pfHwobj1SWzBdKSwiaW5saW5lIj09PXImJihyPSJpbmxpbmUiIT09aT9pOiIiLGk9ImlubGluZSIpLFtuLGZ1bmN0aW9uKHQpe2lmKHQpc3dpdGNoKHQudG9Mb3dlckNhc2UoKSl7Y2FzZSJyZXZlcnNlIjpjYXNlIndyYXAtcmV2ZXJzZSI6Y2FzZSJyZXZlcnNlLXdyYXAiOnQ9IndyYXAtcmV2ZXJzZSI7YnJlYWs7Y2FzZSJubyI6Y2FzZSJub25lIjpjYXNlIm5vd3JhcCI6dD0ibm93cmFwIjticmVhaztkZWZhdWx0OnQ9IndyYXAifXJldHVybiB0fShyKSwhIWldfSh0KTtyZXR1cm4gbj1yWzJdLHZvaWQgMD09PShlPXJbMV0pJiYoZT1udWxsKSx2b2lkIDA9PT1uJiYobj0hMSkse2Rpc3BsYXk6bj8iaW5saW5lLWZsZXgiOiJmbGV4IiwiYm94LXNpemluZyI6ImJvcmRlci1ib3giLCJmbGV4LWRpcmVjdGlvbiI6clswXSwiZmxleC13cmFwIjplfHxudWxsfX0ocik7dGhpcy5fc3R5bGVyLmFwcGx5U3R5bGVUb0VsZW1lbnRzKGksW3RdKX1yZXR1cm4gci50cmltKCl8fCJyb3cifSx0LnByb3RvdHlwZS5fYXBwbHlTdHlsZVRvRWxlbWVudD1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09biYmKG49dGhpcy5uYXRpdmVFbGVtZW50KSx0aGlzLl9zdHlsZXIuYXBwbHlTdHlsZVRvRWxlbWVudChuLHQsZSl9LHQucHJvdG90eXBlLl9hcHBseVN0eWxlVG9FbGVtZW50cz1mdW5jdGlvbih0LGUpe3RoaXMuX3N0eWxlci5hcHBseVN0eWxlVG9FbGVtZW50cyh0LGUpfSx0LnByb3RvdHlwZS5fY2FjaGVJbnB1dD1mdW5jdGlvbih0LGUpe2lmKCJvYmplY3QiPT10eXBlb2YgZSlmb3IodmFyIG4gaW4gZSl0aGlzLl9pbnB1dE1hcFtuXT1lW25dO2Vsc2UgdCYmKHRoaXMuX2lucHV0TWFwW3RdPWUpfSx0LnByb3RvdHlwZS5fbGlzdGVuRm9yTWVkaWFRdWVyeUNoYW5nZXM9ZnVuY3Rpb24odCxlLG4pe2lmKCF0aGlzLl9tcUFjdGl2YXRpb24pe3ZhciByPW5ldyBmdW5jdGlvbih0LGUsbil7dGhpcy5iYXNlS2V5PXQsdGhpcy5kZWZhdWx0VmFsdWU9ZSx0aGlzLmlucHV0S2V5cz1ufSh0LGUsdGhpcy5faW5wdXRNYXApO3RoaXMuX21xQWN0aXZhdGlvbj1uZXcgRChyLHRoaXMuX21lZGlhTW9uaXRvcixmdW5jdGlvbih0KXtyZXR1cm4gbih0KX0pfXJldHVybiB0aGlzLl9tcUFjdGl2YXRpb259LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiY2hpbGRyZW5Ob2RlcyIse2dldDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4sZT1bXSxuPXQubGVuZ3RoO24tLTspZVtuXT10W25dO3JldHVybiBlfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmhhc1Jlc3BvbnNpdmVBUEk9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2lucHV0TWFwKS5sZW5ndGgtKHRoaXMuX2lucHV0TWFwW3RdPzE6MCk+MH0sdC5wcm90b3R5cGUuaGFzS2V5VmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21xQWN0aXZhdGlvbi5oYXNLZXlWYWx1ZSh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJoYXNJbml0aWFsaXplZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNJbml0aWFsaXplZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0fSgpLEY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scixpKXt2YXIgbz10LmNhbGwodGhpcyxuLHIsaSl8fHRoaXM7cmV0dXJuIG8uX2Jhc2VLZXk9ZSxvLl9tZWRpYU1vbml0b3I9bixvLl9lbGVtZW50UmVmPXIsby5fc3R5bGVyPWksb31yZXR1cm4gT2JqZWN0KHUuYikoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImFjdGl2ZUtleSIse2dldDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21xQWN0aXZhdGlvbixlPXQ/dC5hY3RpdmF0ZWRJbnB1dEtleTp0aGlzLl9iYXNlS2V5O3JldHVybiJjbGFzcyI9PT1lPyJrbGF6eiI6ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImlucHV0TWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lucHV0TWFwfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwibXFBY3RpdmF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21xQWN0aXZhdGlvbn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5oYXNSZXNwb25zaXZlQVBJPWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLmhhc1Jlc3BvbnNpdmVBUEkuY2FsbCh0aGlzLHRoaXMuX2Jhc2VLZXkpfSxlLnByb3RvdHlwZS5xdWVyeUlucHV0PWZ1bmN0aW9uKHQpe3JldHVybiB0P3RoaXMuX3F1ZXJ5SW5wdXQodCk6dm9pZCAwfSxlLnByb3RvdHlwZS5jYWNoZUlucHV0PWZ1bmN0aW9uKHQsZSxuKXtpZih2b2lkIDA9PT1uJiYobj0hMSksbil0aGlzLl9jYWNoZUlucHV0UmF3KHQsZSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXRoaXMuX2NhY2hlSW5wdXRBcnJheSh0LGUpO2Vsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiBlKXRoaXMuX2NhY2hlSW5wdXRPYmplY3QodCxlKTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY2xhc3MgdmFsdWUgJyIrdCsiJyBwcm92aWRlZC4gRGlkIHlvdSB3YW50IHRvIGNhY2hlIHRoZSByYXcgdmFsdWU/Iik7dGhpcy5fY2FjaGVJbnB1dFN0cmluZyh0LGUpfX0sZS5wcm90b3R5cGUubGlzdGVuRm9yTWVkaWFRdWVyeUNoYW5nZXM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLl9saXN0ZW5Gb3JNZWRpYVF1ZXJ5Q2hhbmdlcyh0LGUsbil9LGUucHJvdG90eXBlLl9jYWNoZUlucHV0UmF3PWZ1bmN0aW9uKHQsZSl7dCYmKHRoaXMuX2lucHV0TWFwW3RdPWUpfSxlLnByb3RvdHlwZS5fY2FjaGVJbnB1dEFycmF5PWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09dCYmKHQ9IiIpLHRoaXMuX2lucHV0TWFwW3RdPWU/ZS5qb2luKCIgIik6IiJ9LGUucHJvdG90eXBlLl9jYWNoZUlucHV0T2JqZWN0PWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09dCYmKHQ9IiIpO3ZhciBuPVtdO2lmKGUpZm9yKHZhciByIGluIGUpZVtyXSYmbi5wdXNoKHIpO3RoaXMuX2lucHV0TWFwW3RdPW4uam9pbigiICIpfSxlLnByb3RvdHlwZS5fY2FjaGVJbnB1dFN0cmluZz1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PXQmJih0PSIiKSx0aGlzLl9pbnB1dE1hcFt0XT1lfSxlfShMKSxWPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMuX2JyZWFrcG9pbnRzPXQsdGhpcy5fbWF0Y2hNZWRpYT1lLHRoaXMuX3JlZ2lzdGVyQnJlYWtwb2ludHMoKX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJicmVha3BvaW50cyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9icmVha3BvaW50cy5pdGVtcy5zbGljZSgpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiYWN0aXZlT3ZlcmxhcHMiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLl9icmVha3BvaW50cy5vdmVybGFwcGluZ3MucmV2ZXJzZSgpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gdC5fbWF0Y2hNZWRpYS5pc0FjdGl2ZShlLm1lZGlhUXVlcnkpfSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJhY3RpdmUiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9bnVsbDt0aGlzLmJyZWFrcG9pbnRzLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uKG4peyIiIT09bi5hbGlhcyYmIWUmJnQuX21hdGNoTWVkaWEuaXNBY3RpdmUobi5tZWRpYVF1ZXJ5KSYmKGU9bil9KTt2YXIgbj10aGlzLmJyZWFrcG9pbnRzWzBdO3JldHVybiBlfHwodGhpcy5fbWF0Y2hNZWRpYS5pc0FjdGl2ZShuLm1lZGlhUXVlcnkpP246bnVsbCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuaXNBY3RpdmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYnJlYWtwb2ludHMuZmluZEJ5QWxpYXModCl8fHRoaXMuX2JyZWFrcG9pbnRzLmZpbmRCeVF1ZXJ5KHQpO3JldHVybiB0aGlzLl9tYXRjaE1lZGlhLmlzQWN0aXZlKGU/ZS5tZWRpYVF1ZXJ5OnQpfSx0LnByb3RvdHlwZS5vYnNlcnZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2JyZWFrcG9pbnRzLmZpbmRCeUFsaWFzKHR8fCIiKXx8dGhpcy5fYnJlYWtwb2ludHMuZmluZEJ5UXVlcnkodHx8IiIpO3JldHVybiB0aGlzLl9tYXRjaE1lZGlhLm9ic2VydmUoZT9lLm1lZGlhUXVlcnk6dCkucGlwZShPYmplY3Qocy5hKShmdW5jdGlvbih0KXtyZXR1cm4gSSh0LGUpfSksT2JqZWN0KGEuYSkoZnVuY3Rpb24odCl7cmV0dXJuIWV8fCIiIT09dC5tcUFsaWFzfSkpfSx0LnByb3RvdHlwZS5fcmVnaXN0ZXJCcmVha3BvaW50cz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2JyZWFrcG9pbnRzLnNvcnRlZEl0ZW1zLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5tZWRpYVF1ZXJ5fSk7dGhpcy5fbWF0Y2hNZWRpYS5yZWdpc3RlclF1ZXJ5KHQpfSx0Lm5nSW5qZWN0YWJsZURlZj1PYmplY3Qoci5SKSh7ZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiBuZXcgdChPYmplY3Qoci5WKShTKSxPYmplY3Qoci5WKShrKSl9LHRva2VuOnQscHJvdmlkZWRJbjoicm9vdCJ9KSx0fSgpO2Z1bmN0aW9uIFUodCl7Zm9yKHZhciBlIGluIHQpe3ZhciBuPXRbZV18fCIiO3N3aXRjaChlKXtjYXNlImRpc3BsYXkiOnQuZGlzcGxheT0iZmxleCI9PT1uP1siLXdlYmtpdC1mbGV4IiwiZmxleCJdOiJpbmxpbmUtZmxleCI9PT1uP1siLXdlYmtpdC1pbmxpbmUtZmxleCIsImlubGluZS1mbGV4Il06bjticmVhaztjYXNlImFsaWduLWl0ZW1zIjpjYXNlImFsaWduLXNlbGYiOmNhc2UiYWxpZ24tY29udGVudCI6Y2FzZSJmbGV4IjpjYXNlImZsZXgtYmFzaXMiOmNhc2UiZmxleC1mbG93IjpjYXNlImZsZXgtZ3JvdyI6Y2FzZSJmbGV4LXNocmluayI6Y2FzZSJmbGV4LXdyYXAiOmNhc2UianVzdGlmeS1jb250ZW50Ijp0WyItd2Via2l0LSIrZV09bjticmVhaztjYXNlImZsZXgtZGlyZWN0aW9uIjp0WyItd2Via2l0LWZsZXgtZGlyZWN0aW9uIl09bj1ufHwicm93Iix0WyJmbGV4LWRpcmVjdGlvbiJdPW47YnJlYWs7Y2FzZSJvcmRlciI6dC5vcmRlcj10WyItd2Via2l0LSIrZV09aXNOYU4obik/IjAiOm59fXJldHVybiB0fXZhciB6PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyKXt0aGlzLl9zZXJ2ZXJTdHlsZXNoZWV0PXQsdGhpcy5fc2VydmVyTW9kdWxlTG9hZGVkPWUsdGhpcy5fcGxhdGZvcm1JZD1uLHRoaXMubGF5b3V0Q29uZmlnPXJ9cmV0dXJuIHQucHJvdG90eXBlLmFwcGx5U3R5bGVUb0VsZW1lbnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXt9OyJzdHJpbmciPT10eXBlb2YgZSYmKHJbZV09bixlPXIpLHI9dGhpcy5sYXlvdXRDb25maWcuZGlzYWJsZVZlbmRvclByZWZpeGVzP2U6VShlKSx0aGlzLl9hcHBseU11bHRpVmFsdWVTdHlsZVRvRWxlbWVudChyLHQpfSx0LnByb3RvdHlwZS5hcHBseVN0eWxlVG9FbGVtZW50cz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dm9pZCAwPT09ZSYmKGU9W10pO3ZhciByPXRoaXMubGF5b3V0Q29uZmlnLmRpc2FibGVWZW5kb3JQcmVmaXhlcz90OlUodCk7ZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe24uX2FwcGx5TXVsdGlWYWx1ZVN0eWxlVG9FbGVtZW50KHIsdCl9KX0sdC5wcm90b3R5cGUuZ2V0Rmxvd0RpcmVjdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmxvb2t1cFN0eWxlKHQsImZsZXgtZGlyZWN0aW9uIik7ZT09PUImJihlPSIiKTt2YXIgbj10aGlzLmxvb2t1cElubGluZVN0eWxlKHQsImZsZXgtZGlyZWN0aW9uIil8fE9iamVjdChpLnIpKHRoaXMuX3BsYXRmb3JtSWQpJiZ0aGlzLl9zZXJ2ZXJNb2R1bGVMb2FkZWQ/ZToiIjtyZXR1cm5bZXx8InJvdyIsbl19LHQucHJvdG90eXBlLmxvb2t1cEF0dHJpYnV0ZVZhbHVlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKGUpfHwiIn0sdC5wcm90b3R5cGUubG9va3VwSW5saW5lU3R5bGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0KGkucSkodGhpcy5fcGxhdGZvcm1JZCk/dC5zdHlsZVtlXTp0aGlzLl9nZXRTZXJ2ZXJTdHlsZSh0LGUpfSx0LnByb3RvdHlwZS5sb29rdXBTdHlsZT1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09biYmKG49ITEpO3ZhciByPSIiO3JldHVybiB0JiYoKHI9dGhpcy5sb29rdXBJbmxpbmVTdHlsZSh0LGUpKXx8KE9iamVjdChpLnEpKHRoaXMuX3BsYXRmb3JtSWQpP258fChyPWdldENvbXB1dGVkU3R5bGUodCkuZ2V0UHJvcGVydHlWYWx1ZShlKSk6dGhpcy5fc2VydmVyTW9kdWxlTG9hZGVkJiYocj10aGlzLl9zZXJ2ZXJTdHlsZXNoZWV0LmdldFN0eWxlRm9yRWxlbWVudCh0LGUpKSkpLHI/ci50cmltKCk6Qn0sdC5wcm90b3R5cGUuX2FwcGx5TXVsdGlWYWx1ZVN0eWxlVG9FbGVtZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztPYmplY3Qua2V5cyh0KS5zb3J0KCkuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgbz1BcnJheS5pc0FycmF5KHRbcl0pP3Rbcl06W3Rbcl1dO28uc29ydCgpO2Zvcih2YXIgYT0wLHM9bzthPHMubGVuZ3RoO2ErKyl7dmFyIHU9c1thXTtPYmplY3QoaS5xKShuLl9wbGF0Zm9ybUlkKXx8IW4uX3NlcnZlck1vZHVsZUxvYWRlZD9PYmplY3QoaS5xKShuLl9wbGF0Zm9ybUlkKT9lLnN0eWxlLnNldFByb3BlcnR5KHIsdSk6bi5fc2V0U2VydmVyU3R5bGUoZSxyLHUpOm4uX3NlcnZlclN0eWxlc2hlZXQuYWRkU3R5bGVUb0VsZW1lbnQoZSxyLHUpfX0pfSx0LnByb3RvdHlwZS5fc2V0U2VydmVyU3R5bGU9ZnVuY3Rpb24odCxlLG4pe2U9ZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCIkMS0kMiIpLnRvTG93ZXJDYXNlKCk7dmFyIHI9dGhpcy5fcmVhZFN0eWxlQXR0cmlidXRlKHQpO3JbZV09bnx8IiIsdGhpcy5fd3JpdGVTdHlsZUF0dHJpYnV0ZSh0LHIpfSx0LnByb3RvdHlwZS5fZ2V0U2VydmVyU3R5bGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcmVhZFN0eWxlQXR0cmlidXRlKHQpW2VdfHwiIn0sdC5wcm90b3R5cGUuX3JlYWRTdHlsZUF0dHJpYnV0ZT1mdW5jdGlvbih0KXt2YXIgZT17fSxuPXQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpO2lmKG4pZm9yKHZhciByPW4uc3BsaXQoLzsrL2cpLGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89cltpXS50cmltKCk7aWYoby5sZW5ndGg+MCl7dmFyIGE9by5pbmRleE9mKCI6Iik7aWYoLTE9PT1hKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBDU1Mgc3R5bGU6ICIrbyk7ZVtvLnN1YnN0cigwLGEpLnRyaW0oKV09by5zdWJzdHIoYSsxKS50cmltKCl9fXJldHVybiBlfSx0LnByb3RvdHlwZS5fd3JpdGVTdHlsZUF0dHJpYnV0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPSIiO2Zvcih2YXIgciBpbiBlKWVbcl0mJihuKz1yKyI6IitlW3JdKyI7Iik7dC5zZXRBdHRyaWJ1dGUoInN0eWxlIixuKX0sdC5uZ0luamVjdGFibGVEZWY9T2JqZWN0KHIuUikoe2ZhY3Rvcnk6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQoT2JqZWN0KHIuVikoTSw4KSxPYmplY3Qoci5WKShOLDgpLE9iamVjdChyLlYpKHIueiksT2JqZWN0KHIuVikoTykpfSx0b2tlbjp0LHByb3ZpZGVkSW46InJvb3QifSksdH0oKSxCPSJibG9jayI7ZnVuY3Rpb24gSCh0LGUsbil7dm9pZCAwPT09ZSYmKGU9IjEiKSx2b2lkIDA9PT1uJiYobj0iMSIpO3ZhciByPVtlLG4sdF0saT10LmluZGV4T2YoImNhbGMiKTtpZihpPjApclsyXT1XKHQuc3Vic3RyaW5nKGkpLnRyaW0oKSksMj09KG89dC5zdWJzdHIoMCxpKS50cmltKCkuc3BsaXQoIiAiKSkubGVuZ3RoJiYoclswXT1vWzBdLHJbMV09b1sxXSk7ZWxzZSBpZigwPT1pKXJbMl09Vyh0LnRyaW0oKSk7ZWxzZXt2YXIgbztyPTM9PT0obz10LnNwbGl0KCIgIikpLmxlbmd0aD9vOltlLG4sdF19cmV0dXJuIHJ9ZnVuY3Rpb24gVyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9bXHNdL2csIiIpLnJlcGxhY2UoL1tcL1wqXCtcLV0vZywiICQmICIpfX0sUFU4TDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIHI9bigiNmJsRiIpO2Z1bmN0aW9uIGkodCl7dmFyIGU9bmV3IHIuYShmdW5jdGlvbihlKXtlLm5leHQodCksZS5jb21wbGV0ZSgpfSk7cmV0dXJuIGUuX2lzU2NhbGFyPSEwLGUudmFsdWU9dCxlfX0sUGhqbjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIHI9bigicHNXMCIpO2Z1bmN0aW9uIGkodCxlKXtyZXR1cm4gT2JqZWN0KHIuYSkodCxlLDEpfX0sUzFuWDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oIm1yU0ciKSxpPW4oIks5SWEiKSxvPW4oIjZibEYiKSxhPW4oIkZGT28iKSxzPW4oInB1Z1QiKTtmdW5jdGlvbiB1KCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0LmxpZnQobmV3IGwodCkpfX12YXIgbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5jb25uZWN0YWJsZT10fXJldHVybiB0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25uZWN0YWJsZTtuLl9yZWZDb3VudCsrO3ZhciByPW5ldyBjKHQsbiksaT1lLnN1YnNjcmliZShyKTtyZXR1cm4gci5jbG9zZWR8fChyLmNvbm5lY3Rpb249bi5jb25uZWN0KCkpLGl9LHR9KCksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dmFyIHI9dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIHIuY29ubmVjdGFibGU9bixyfXJldHVybiByLmIoZSx0KSxlLnByb3RvdHlwZS5fdW5zdWJzY3JpYmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbm5lY3RhYmxlO2lmKHQpe3RoaXMuY29ubmVjdGFibGU9bnVsbDt2YXIgZT10Ll9yZWZDb3VudDtpZihlPD0wKXRoaXMuY29ubmVjdGlvbj1udWxsO2Vsc2UgaWYodC5fcmVmQ291bnQ9ZS0xLGU+MSl0aGlzLmNvbm5lY3Rpb249bnVsbDtlbHNle3ZhciBuPXRoaXMuY29ubmVjdGlvbixyPXQuX2Nvbm5lY3Rpb247dGhpcy5jb25uZWN0aW9uPW51bGwsIXJ8fG4mJnIhPT1ufHxyLnVuc3Vic2NyaWJlKCl9fWVsc2UgdGhpcy5jb25uZWN0aW9uPW51bGx9LGV9KGEuYSksZj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dmFyIHI9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiByLnNvdXJjZT1lLHIuc3ViamVjdEZhY3Rvcnk9bixyLl9yZWZDb3VudD0wLHIuX2lzQ29tcGxldGU9ITEscn1yZXR1cm4gci5iKGUsdCksZS5wcm90b3R5cGUuX3N1YnNjcmliZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuc3Vic2NyaWJlKHQpfSxlLnByb3RvdHlwZS5nZXRTdWJqZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3ViamVjdDtyZXR1cm4gdCYmIXQuaXNTdG9wcGVkfHwodGhpcy5fc3ViamVjdD10aGlzLnN1YmplY3RGYWN0b3J5KCkpLHRoaXMuX3N1YmplY3R9LGUucHJvdG90eXBlLmNvbm5lY3Q9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jb25uZWN0aW9uO3JldHVybiB0fHwodGhpcy5faXNDb21wbGV0ZT0hMSwodD10aGlzLl9jb25uZWN0aW9uPW5ldyBzLmEpLmFkZCh0aGlzLnNvdXJjZS5zdWJzY3JpYmUobmV3IGQodGhpcy5nZXRTdWJqZWN0KCksdGhpcykpKSx0LmNsb3NlZD8odGhpcy5fY29ubmVjdGlvbj1udWxsLHQ9cy5hLkVNUFRZKTp0aGlzLl9jb25uZWN0aW9uPXQpLHR9LGUucHJvdG90eXBlLnJlZkNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHUoKSh0aGlzKX0sZX0oby5hKS5wcm90b3R5cGUsaD17b3BlcmF0b3I6e3ZhbHVlOm51bGx9LF9yZWZDb3VudDp7dmFsdWU6MCx3cml0YWJsZTohMH0sX3N1YmplY3Q6e3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9LF9jb25uZWN0aW9uOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSxfc3Vic2NyaWJlOnt2YWx1ZTpmLl9zdWJzY3JpYmV9LF9pc0NvbXBsZXRlOnt2YWx1ZTpmLl9pc0NvbXBsZXRlLHdyaXRhYmxlOiEwfSxnZXRTdWJqZWN0Ont2YWx1ZTpmLmdldFN1YmplY3R9LGNvbm5lY3Q6e3ZhbHVlOmYuY29ubmVjdH0scmVmQ291bnQ6e3ZhbHVlOmYucmVmQ291bnR9fSxkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgcj10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gci5jb25uZWN0YWJsZT1uLHJ9cmV0dXJuIHIuYihlLHQpLGUucHJvdG90eXBlLl9lcnJvcj1mdW5jdGlvbihlKXt0aGlzLl91bnN1YnNjcmliZSgpLHQucHJvdG90eXBlLl9lcnJvci5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLl9jb21wbGV0ZT1mdW5jdGlvbigpe3RoaXMuY29ubmVjdGFibGUuX2lzQ29tcGxldGU9ITAsdGhpcy5fdW5zdWJzY3JpYmUoKSx0LnByb3RvdHlwZS5fY29tcGxldGUuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUuX3Vuc3Vic2NyaWJlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb25uZWN0YWJsZTtpZih0KXt0aGlzLmNvbm5lY3RhYmxlPW51bGw7dmFyIGU9dC5fY29ubmVjdGlvbjt0Ll9yZWZDb3VudD0wLHQuX3N1YmplY3Q9bnVsbCx0Ll9jb25uZWN0aW9uPW51bGwsZSYmZS51bnN1YnNjcmliZSgpfX0sZX0oaS5iKTtmdW5jdGlvbiBwKCl7cmV0dXJuIG5ldyBpLmF9ZnVuY3Rpb24gbSgpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdSgpKChlPXAsZnVuY3Rpb24odCl7dmFyIG47bj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOmZ1bmN0aW9uKCl7cmV0dXJuIGV9O3ZhciByPU9iamVjdC5jcmVhdGUodCxoKTtyZXR1cm4gci5zb3VyY2U9dCxyLnN1YmplY3RGYWN0b3J5PW4scn0pKHQpKTt2YXIgZX19bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KX0sUzVYUTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIHI9bigiREtUYiIpLGk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0LnRoZW4oZnVuY3Rpb24odCl7ZS5jbG9zZWR8fChlLm5leHQodCksZS5jb21wbGV0ZSgpKX0sZnVuY3Rpb24odCl7cmV0dXJuIGUuZXJyb3IodCl9KS50aGVuKG51bGwsci5hKSxlfX19LFNNc206ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCJJcDBSIiksaT1uKCJ0L05hIiksbz1uKCJDY25HIiksYT1uKCJaWWp0Iikscz1uKCJGL1hMIiksdT1uKCJWTnI0IiksbD1uKCJYbFB3IiksYz1uKCJ4TXlFIiksZj1uKCI2N1kvIiksaD1uKCJtclNHIiksZD1uKCJGRk9vIikscD1uKCJwdWdUIiksbT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5jYWxsYmFjaz10fXJldHVybiB0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuc3Vic2NyaWJlKG5ldyB5KHQsdGhpcy5jYWxsYmFjaykpfSx0fSgpLHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciByPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiByLmFkZChuZXcgcC5hKG4pKSxyfXJldHVybiBoLmIoZSx0KSxlfShkLmEpLGc9bigiUzFuWCIpLHY9bigiOVoxRiIpLGI9bigidDlmWiIpLF89bigiV2Y0cCIpLHc9bigibjZnRyIpO2Z1bmN0aW9uIHgodCl7cmV0dXJuIEVycm9yKCdVbmFibGUgdG8gZmluZCBpY29uIHdpdGggdGhlIG5hbWUgIicrdCsnIicpfWZ1bmN0aW9uIE8odCl7cmV0dXJuIEVycm9yKCJUaGUgVVJMIHByb3ZpZGVkIHRvIE1hdEljb25SZWdpc3RyeSB3YXMgbm90IHRydXN0ZWQgYXMgYSByZXNvdXJjZSBVUkwgdmlhIEFuZ3VsYXIncyBEb21TYW5pdGl6ZXIuIEF0dGVtcHRlZCBVUkwgd2FzIFwiIit0KyciLicpfWZ1bmN0aW9uIEModCl7cmV0dXJuIEVycm9yKCJUaGUgbGl0ZXJhbCBwcm92aWRlZCB0byBNYXRJY29uUmVnaXN0cnkgd2FzIG5vdCB0cnVzdGVkIGFzIHNhZmUgSFRNTCBieSBBbmd1bGFyJ3MgRG9tU2FuaXRpemVyLiBBdHRlbXB0ZWQgbGl0ZXJhbCB3YXMgXCIiK3QrJyIuJyl9bi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIEF9KSxuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gSX0pLG4uZChlLCJjIixmdW5jdGlvbigpe3JldHVybiBFfSk7dmFyIFM9ZnVuY3Rpb24odCl7dC5ub2RlTmFtZT90aGlzLnN2Z0VsZW1lbnQ9dDp0aGlzLnVybD10fSxFPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5faHR0cENsaWVudD10LHRoaXMuX3Nhbml0aXplcj1lLHRoaXMuX3N2Z0ljb25Db25maWdzPW5ldyBNYXAsdGhpcy5faWNvblNldENvbmZpZ3M9bmV3IE1hcCx0aGlzLl9jYWNoZWRJY29uc0J5VXJsPW5ldyBNYXAsdGhpcy5faW5Qcm9ncmVzc1VybEZldGNoZXM9bmV3IE1hcCx0aGlzLl9mb250Q3NzQ2xhc3Nlc0J5QWxpYXM9bmV3IE1hcCx0aGlzLl9kZWZhdWx0Rm9udFNldENsYXNzPSJtYXRlcmlhbC1pY29ucyIsdGhpcy5fZG9jdW1lbnQ9bn1yZXR1cm4gdC5wcm90b3R5cGUuYWRkU3ZnSWNvbj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmFkZFN2Z0ljb25Jbk5hbWVzcGFjZSgiIix0LGUpfSx0LnByb3RvdHlwZS5hZGRTdmdJY29uTGl0ZXJhbD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmFkZFN2Z0ljb25MaXRlcmFsSW5OYW1lc3BhY2UoIiIsdCxlKX0sdC5wcm90b3R5cGUuYWRkU3ZnSWNvbkluTmFtZXNwYWNlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5fYWRkU3ZnSWNvbkNvbmZpZyh0LGUsbmV3IFMobikpfSx0LnByb3RvdHlwZS5hZGRTdmdJY29uTGl0ZXJhbEluTmFtZXNwYWNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLl9zYW5pdGl6ZXIuc2FuaXRpemUoby5GLkhUTUwsbik7aWYoIXIpdGhyb3cgQyhuKTt2YXIgaT10aGlzLl9jcmVhdGVTdmdFbGVtZW50Rm9yU2luZ2xlSWNvbihyKTtyZXR1cm4gdGhpcy5fYWRkU3ZnSWNvbkNvbmZpZyh0LGUsbmV3IFMoaSkpfSx0LnByb3RvdHlwZS5hZGRTdmdJY29uU2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFkZFN2Z0ljb25TZXRJbk5hbWVzcGFjZSgiIix0KX0sdC5wcm90b3R5cGUuYWRkU3ZnSWNvblNldExpdGVyYWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYWRkU3ZnSWNvblNldExpdGVyYWxJbk5hbWVzcGFjZSgiIix0KX0sdC5wcm90b3R5cGUuYWRkU3ZnSWNvblNldEluTmFtZXNwYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2FkZFN2Z0ljb25TZXRDb25maWcodCxuZXcgUyhlKSl9LHQucHJvdG90eXBlLmFkZFN2Z0ljb25TZXRMaXRlcmFsSW5OYW1lc3BhY2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9zYW5pdGl6ZXIuc2FuaXRpemUoby5GLkhUTUwsZSk7aWYoIW4pdGhyb3cgQyhlKTt2YXIgcj10aGlzLl9zdmdFbGVtZW50RnJvbVN0cmluZyhuKTtyZXR1cm4gdGhpcy5fYWRkU3ZnSWNvblNldENvbmZpZyh0LG5ldyBTKHIpKX0sdC5wcm90b3R5cGUucmVnaXN0ZXJGb250Q2xhc3NBbGlhcz1mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10KSx0aGlzLl9mb250Q3NzQ2xhc3Nlc0J5QWxpYXMuc2V0KHQsZSksdGhpc30sdC5wcm90b3R5cGUuY2xhc3NOYW1lRm9yRm9udEFsaWFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9mb250Q3NzQ2xhc3Nlc0J5QWxpYXMuZ2V0KHQpfHx0fSx0LnByb3RvdHlwZS5zZXREZWZhdWx0Rm9udFNldENsYXNzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kZWZhdWx0Rm9udFNldENsYXNzPXQsdGhpc30sdC5wcm90b3R5cGUuZ2V0RGVmYXVsdEZvbnRTZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWZhdWx0Rm9udFNldENsYXNzfSx0LnByb3RvdHlwZS5nZXRTdmdJY29uRnJvbVVybD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5fc2FuaXRpemVyLnNhbml0aXplKG8uRi5SRVNPVVJDRV9VUkwsdCk7aWYoIW4pdGhyb3cgTyh0KTt2YXIgcj10aGlzLl9jYWNoZWRJY29uc0J5VXJsLmdldChuKTtyZXR1cm4gcj9PYmplY3Qocy5hKShrKHIpKTp0aGlzLl9sb2FkU3ZnSWNvbkZyb21Db25maWcobmV3IFModCkpLnBpcGUoT2JqZWN0KGMuYSkoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2NhY2hlZEljb25zQnlVcmwuc2V0KG4sdCl9KSxPYmplY3QoZi5hKShmdW5jdGlvbih0KXtyZXR1cm4gayh0KX0pKX0sdC5wcm90b3R5cGUuZ2V0TmFtZWRTdmdJY29uPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9IiIpO3ZhciBuPVQoZSx0KSxyPXRoaXMuX3N2Z0ljb25Db25maWdzLmdldChuKTtpZihyKXJldHVybiB0aGlzLl9nZXRTdmdGcm9tQ29uZmlnKHIpO3ZhciBpPXRoaXMuX2ljb25TZXRDb25maWdzLmdldChlKTtyZXR1cm4gaT90aGlzLl9nZXRTdmdGcm9tSWNvblNldENvbmZpZ3ModCxpKTpPYmplY3QobC5hKSh4KG4pKX0sdC5wcm90b3R5cGUuX2dldFN2Z0Zyb21Db25maWc9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc3ZnRWxlbWVudD9PYmplY3Qocy5hKShrKHQuc3ZnRWxlbWVudCkpOnRoaXMuX2xvYWRTdmdJY29uRnJvbUNvbmZpZyh0KS5waXBlKE9iamVjdChjLmEpKGZ1bmN0aW9uKGUpe3JldHVybiB0LnN2Z0VsZW1lbnQ9ZX0pLE9iamVjdChmLmEpKGZ1bmN0aW9uKHQpe3JldHVybiBrKHQpfSkpfSx0LnByb3RvdHlwZS5fZ2V0U3ZnRnJvbUljb25TZXRDb25maWdzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPXRoaXMuX2V4dHJhY3RJY29uV2l0aE5hbWVGcm9tQW55U2V0KHQsZSk7aWYocilyZXR1cm4gT2JqZWN0KHMuYSkocik7dmFyIGk9ZS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIXQuc3ZnRWxlbWVudH0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gbi5fbG9hZFN2Z0ljb25TZXRGcm9tQ29uZmlnKHQpLnBpcGUoT2JqZWN0KHYuYSkoZnVuY3Rpb24oZSl7dmFyIHI9bi5fc2FuaXRpemVyLnNhbml0aXplKG8uRi5SRVNPVVJDRV9VUkwsdC51cmwpO3JldHVybiBjb25zb2xlLmVycm9yKCJMb2FkaW5nIGljb24gc2V0IFVSTDogIityKyIgZmFpbGVkOiAiK2UubWVzc2FnZSksT2JqZWN0KHMuYSkobnVsbCl9KSl9KTtyZXR1cm4gT2JqZWN0KHUuYSkoaSkucGlwZShPYmplY3QoZi5hKShmdW5jdGlvbigpe3ZhciByPW4uX2V4dHJhY3RJY29uV2l0aE5hbWVGcm9tQW55U2V0KHQsZSk7aWYoIXIpdGhyb3cgeCh0KTtyZXR1cm4gcn0pKX0sdC5wcm90b3R5cGUuX2V4dHJhY3RJY29uV2l0aE5hbWVGcm9tQW55U2V0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUubGVuZ3RoLTE7bj49MDtuLS0pe3ZhciByPWVbbl07aWYoci5zdmdFbGVtZW50KXt2YXIgaT10aGlzLl9leHRyYWN0U3ZnSWNvbkZyb21TZXQoci5zdmdFbGVtZW50LHQpO2lmKGkpcmV0dXJuIGl9fXJldHVybiBudWxsfSx0LnByb3RvdHlwZS5fbG9hZFN2Z0ljb25Gcm9tQ29uZmlnPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuX2ZldGNoVXJsKHQudXJsKS5waXBlKE9iamVjdChmLmEpKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9jcmVhdGVTdmdFbGVtZW50Rm9yU2luZ2xlSWNvbih0KX0pKX0sdC5wcm90b3R5cGUuX2xvYWRTdmdJY29uU2V0RnJvbUNvbmZpZz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0LnN2Z0VsZW1lbnQ/T2JqZWN0KHMuYSkodC5zdmdFbGVtZW50KTp0aGlzLl9mZXRjaFVybCh0LnVybCkucGlwZShPYmplY3QoZi5hKShmdW5jdGlvbihuKXtyZXR1cm4gdC5zdmdFbGVtZW50fHwodC5zdmdFbGVtZW50PWUuX3N2Z0VsZW1lbnRGcm9tU3RyaW5nKG4pKSx0LnN2Z0VsZW1lbnR9KSl9LHQucHJvdG90eXBlLl9jcmVhdGVTdmdFbGVtZW50Rm9yU2luZ2xlSWNvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zdmdFbGVtZW50RnJvbVN0cmluZyh0KTtyZXR1cm4gdGhpcy5fc2V0U3ZnQXR0cmlidXRlcyhlKSxlfSx0LnByb3RvdHlwZS5fZXh0cmFjdFN2Z0ljb25Gcm9tU2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5xdWVyeVNlbGVjdG9yKCIjIitlKTtpZighbilyZXR1cm4gbnVsbDt2YXIgcj1uLmNsb25lTm9kZSghMCk7aWYoci5yZW1vdmVBdHRyaWJ1dGUoImlkIiksInN2ZyI9PT1yLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHRoaXMuX3NldFN2Z0F0dHJpYnV0ZXMocik7aWYoInN5bWJvbCI9PT1yLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHRoaXMuX3NldFN2Z0F0dHJpYnV0ZXModGhpcy5fdG9TdmdFbGVtZW50KHIpKTt2YXIgaT10aGlzLl9zdmdFbGVtZW50RnJvbVN0cmluZygiPHN2Zz48L3N2Zz4iKTtyZXR1cm4gaS5hcHBlbmRDaGlsZChyKSx0aGlzLl9zZXRTdmdBdHRyaWJ1dGVzKGkpfSx0LnByb3RvdHlwZS5fc3ZnRWxlbWVudEZyb21TdHJpbmc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7ZS5pbm5lckhUTUw9dDt2YXIgbj1lLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpO2lmKCFuKXRocm93IEVycm9yKCI8c3ZnPiB0YWcgbm90IGZvdW5kIik7cmV0dXJuIG59LHQucHJvdG90eXBlLl90b1N2Z0VsZW1lbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX3N2Z0VsZW1lbnRGcm9tU3RyaW5nKCI8c3ZnPjwvc3ZnPiIpLG49MDtuPHQuY2hpbGROb2Rlcy5sZW5ndGg7bisrKXQuY2hpbGROb2Rlc1tuXS5ub2RlVHlwZT09PXRoaXMuX2RvY3VtZW50LkVMRU1FTlRfTk9ERSYmZS5hcHBlbmRDaGlsZCh0LmNoaWxkTm9kZXNbbl0uY2xvbmVOb2RlKCEwKSk7cmV0dXJuIGV9LHQucHJvdG90eXBlLl9zZXRTdmdBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQpe3JldHVybiB0LnNldEF0dHJpYnV0ZSgiZml0IiwiIiksdC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKSx0LnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIiksdC5zZXRBdHRyaWJ1dGUoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCBtZWV0IiksdC5zZXRBdHRyaWJ1dGUoImZvY3VzYWJsZSIsImZhbHNlIiksdH0sdC5wcm90b3R5cGUuX2ZldGNoVXJsPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoIXRoaXMuX2h0dHBDbGllbnQpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIEh0dHBDbGllbnQgcHJvdmlkZXIgZm9yIHVzZSB3aXRoIEFuZ3VsYXIgTWF0ZXJpYWwgaWNvbnMuIFBsZWFzZSBpbmNsdWRlIHRoZSBIdHRwQ2xpZW50TW9kdWxlIGZyb20gQGFuZ3VsYXIvY29tbW9uL2h0dHAgaW4geW91ciBhcHAgaW1wb3J0cy4iKTtpZihudWxsPT10KXRocm93IEVycm9yKCdDYW5ub3QgZmV0Y2ggaWNvbiBmcm9tIFVSTCAiJyt0KyciLicpO3ZhciBuPXRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShvLkYuUkVTT1VSQ0VfVVJMLHQpO2lmKCFuKXRocm93IE8odCk7dmFyIHI9dGhpcy5faW5Qcm9ncmVzc1VybEZldGNoZXMuZ2V0KG4pO2lmKHIpcmV0dXJuIHI7dmFyIGksYT10aGlzLl9odHRwQ2xpZW50LmdldChuLHtyZXNwb25zZVR5cGU6InRleHQifSkucGlwZSgoaT1mdW5jdGlvbigpe3JldHVybiBlLl9pblByb2dyZXNzVXJsRmV0Y2hlcy5kZWxldGUobil9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmxpZnQobmV3IG0oaSkpfSksT2JqZWN0KGcuYSkoKSk7cmV0dXJuIHRoaXMuX2luUHJvZ3Jlc3NVcmxGZXRjaGVzLnNldChuLGEpLGF9LHQucHJvdG90eXBlLl9hZGRTdmdJY29uQ29uZmlnPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5fc3ZnSWNvbkNvbmZpZ3Muc2V0KFQodCxlKSxuKSx0aGlzfSx0LnByb3RvdHlwZS5fYWRkU3ZnSWNvblNldENvbmZpZz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2ljb25TZXRDb25maWdzLmdldCh0KTtyZXR1cm4gbj9uLnB1c2goZSk6dGhpcy5faWNvblNldENvbmZpZ3Muc2V0KHQsW2VdKSx0aGlzfSx0Lm5nSW5qZWN0YWJsZURlZj1PYmplY3Qoby5SKSh7ZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiBuZXcgdChPYmplY3Qoby5WKShpLmMsOCksT2JqZWN0KG8uVikoYS5jKSxPYmplY3Qoby5WKShyLmQsOCkpfSx0b2tlbjp0LHByb3ZpZGVkSW46InJvb3QifSksdH0oKTtmdW5jdGlvbiBrKHQpe3JldHVybiB0LmNsb25lTm9kZSghMCl9ZnVuY3Rpb24gVCh0LGUpe3JldHVybiB0KyI6IitlfXZhciBJPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIpe3ZhciBpPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBpLl9pY29uUmVnaXN0cnk9bixpLl9pbmxpbmU9ITEscnx8ZS5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIiksaX1yZXR1cm4gT2JqZWN0KGguYikoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImlubGluZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbmxpbmV9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9pbmxpbmU9T2JqZWN0KHcuYikodCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJmb250U2V0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvbnRTZXR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9mb250U2V0PXRoaXMuX2NsZWFudXBGb250VmFsdWUodCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJmb250SWNvbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb250SWNvbn0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2ZvbnRJY29uPXRoaXMuX2NsZWFudXBGb250VmFsdWUodCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuX3NwbGl0SWNvbk5hbWU9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuWyIiLCIiXTt2YXIgZT10LnNwbGl0KCI6Iik7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDE6cmV0dXJuWyIiLGVbMF1dO2Nhc2UgMjpyZXR1cm4gZTtkZWZhdWx0OnRocm93IEVycm9yKCdJbnZhbGlkIGljb24gbmFtZTogIicrdCsnIicpfX0sZS5wcm90b3R5cGUubmdPbkNoYW5nZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih0LnN2Z0ljb24paWYodGhpcy5zdmdJY29uKXt2YXIgbj10aGlzLl9zcGxpdEljb25OYW1lKHRoaXMuc3ZnSWNvbik7dGhpcy5faWNvblJlZ2lzdHJ5LmdldE5hbWVkU3ZnSWNvbihuWzFdLG5bMF0pLnBpcGUoT2JqZWN0KGIuYSkoMSkpLnN1YnNjcmliZShmdW5jdGlvbih0KXtyZXR1cm4gZS5fc2V0U3ZnRWxlbWVudCh0KX0sZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUubG9nKCJFcnJvciByZXRyaWV2aW5nIGljb246ICIrdC5tZXNzYWdlKX0pfWVsc2UgdGhpcy5fY2xlYXJTdmdFbGVtZW50KCk7dGhpcy5fdXNpbmdGb250SWNvbigpJiZ0aGlzLl91cGRhdGVGb250SWNvbkNsYXNzZXMoKX0sZS5wcm90b3R5cGUubmdPbkluaXQ9ZnVuY3Rpb24oKXt0aGlzLl91c2luZ0ZvbnRJY29uKCkmJnRoaXMuX3VwZGF0ZUZvbnRJY29uQ2xhc3NlcygpfSxlLnByb3RvdHlwZS5fdXNpbmdGb250SWNvbj1mdW5jdGlvbigpe3JldHVybiF0aGlzLnN2Z0ljb259LGUucHJvdG90eXBlLl9zZXRTdmdFbGVtZW50PWZ1bmN0aW9uKHQpe3RoaXMuX2NsZWFyU3ZnRWxlbWVudCgpLHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCh0KX0sZS5wcm90b3R5cGUuX2NsZWFyU3ZnRWxlbWVudD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsZT10LmNoaWxkTm9kZXMubGVuZ3RoLG49MDtuPGU7bisrKXQucmVtb3ZlQ2hpbGQodC5jaGlsZE5vZGVzW25dKX0sZS5wcm90b3R5cGUuX3VwZGF0ZUZvbnRJY29uQ2xhc3Nlcz1mdW5jdGlvbigpe2lmKHRoaXMuX3VzaW5nRm9udEljb24oKSl7dmFyIHQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LGU9dGhpcy5mb250U2V0P3RoaXMuX2ljb25SZWdpc3RyeS5jbGFzc05hbWVGb3JGb250QWxpYXModGhpcy5mb250U2V0KTp0aGlzLl9pY29uUmVnaXN0cnkuZ2V0RGVmYXVsdEZvbnRTZXRDbGFzcygpO2UhPXRoaXMuX3ByZXZpb3VzRm9udFNldENsYXNzJiYodGhpcy5fcHJldmlvdXNGb250U2V0Q2xhc3MmJnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9wcmV2aW91c0ZvbnRTZXRDbGFzcyksZSYmdC5jbGFzc0xpc3QuYWRkKGUpLHRoaXMuX3ByZXZpb3VzRm9udFNldENsYXNzPWUpLHRoaXMuZm9udEljb24hPXRoaXMuX3ByZXZpb3VzRm9udEljb25DbGFzcyYmKHRoaXMuX3ByZXZpb3VzRm9udEljb25DbGFzcyYmdC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX3ByZXZpb3VzRm9udEljb25DbGFzcyksdGhpcy5mb250SWNvbiYmdC5jbGFzc0xpc3QuYWRkKHRoaXMuZm9udEljb24pLHRoaXMuX3ByZXZpb3VzRm9udEljb25DbGFzcz10aGlzLmZvbnRJY29uKX19LGUucHJvdG90eXBlLl9jbGVhbnVwRm9udFZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnRyaW0oKS5zcGxpdCgiICIpWzBdOnR9LGV9KE9iamVjdChfLnUpKGZ1bmN0aW9uKHQpe3RoaXMuX2VsZW1lbnRSZWY9dH0pKSxBPWZ1bmN0aW9uKCl7fX0sVDFETTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIHI9bigiaDlEcSIpLGk9bmV3KG4oIkNTOVEiKS5hKShyLmEpfSxUeGpnOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgcj1uKCJabjhEIik7ZnVuY3Rpb24gaSgpe3JldHVybiBPYmplY3Qoci5hKSgxKX19LFVvZEg6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYyIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLG4uZChlLCJiIixmdW5jdGlvbigpe3JldHVybiB1fSksbi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTt2YXIgcj1uKCJtclNHIiksaT1uKCJXZjRwIiksbz0iYWNjZW50IixhPSJwcmltYXJ5IixzPVsibWF0LWJ1dHRvbiIsIm1hdC1mbGF0LWJ1dHRvbiIsIm1hdC1pY29uLWJ1dHRvbiIsIm1hdC1yYWlzZWQtYnV0dG9uIiwibWF0LXN0cm9rZWQtYnV0dG9uIiwibWF0LW1pbmktZmFiIiwibWF0LWZhYiJdLHU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scixpKXt2YXIgdT10LmNhbGwodGhpcyxlKXx8dGhpczt1Ll9wbGF0Zm9ybT1uLHUuX2ZvY3VzTW9uaXRvcj1yLHUuX2FuaW1hdGlvbk1vZGU9aSx1LmlzUm91bmRCdXR0b249dS5faGFzSG9zdEF0dHJpYnV0ZXMoIm1hdC1mYWIiLCJtYXQtbWluaS1mYWIiKSx1LmlzSWNvbkJ1dHRvbj11Ll9oYXNIb3N0QXR0cmlidXRlcygibWF0LWljb24tYnV0dG9uIik7Zm9yKHZhciBsPTAsYz1zO2w8Yy5sZW5ndGg7bCsrKXt2YXIgZj1jW2xdO3UuX2hhc0hvc3RBdHRyaWJ1dGVzKGYpJiZlLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChmKX1yZXR1cm4gdS5fZm9jdXNNb25pdG9yLm1vbml0b3IodS5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCEwKSx1LmlzUm91bmRCdXR0b24/dS5jb2xvcj1vOnUuX2hhc0hvc3RBdHRyaWJ1dGVzKCJtYXQtZmxhdC1idXR0b24iKSYmKHUuY29sb3I9YSksdX1yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5uZ09uRGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpfSxlLnByb3RvdHlwZS5mb2N1cz1mdW5jdGlvbigpe3RoaXMuX2dldEhvc3RFbGVtZW50KCkuZm9jdXMoKX0sZS5wcm90b3R5cGUuX2dldEhvc3RFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudH0sZS5wcm90b3R5cGUuX2lzUmlwcGxlRGlzYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNhYmxlUmlwcGxlfHx0aGlzLmRpc2FibGVkfSxlLnByb3RvdHlwZS5faGFzSG9zdEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiBlLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIHQuX2dldEhvc3RFbGVtZW50KCkuaGFzQXR0cmlidXRlKGUpfSl9LGV9KE9iamVjdChpLnUpKE9iamVjdChpLncpKE9iamVjdChpLnYpKGZ1bmN0aW9uKHQpe3RoaXMuX2VsZW1lbnRSZWY9dH0pKSkpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scixpKXtyZXR1cm4gdC5jYWxsKHRoaXMscixlLG4saSl8fHRoaXN9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUuX2hhbHREaXNhYmxlZEV2ZW50cz1mdW5jdGlvbih0KXt0aGlzLmRpc2FibGVkJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfSxlfSh1KSxjPWZ1bmN0aW9uKCl7fX0sIlY5cSsiOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSxuKCJDY25HIik7dmFyIHI9bigiSXAwUiIpLGk9bigiT3pmQiIpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7T2JqZWN0KHIucikoZSkmJiF0JiZjb25zb2xlLndhcm4oIldhcm5pbmc6IEZsZXggTGF5b3V0IGxvYWRlZCBvbiB0aGUgc2VydmVyIHdpdGhvdXQgRmxleExheW91dFNlcnZlck1vZHVsZSIpfXJldHVybiB0LndpdGhDb25maWc9ZnVuY3Rpb24oZSxuKXt2YXIgcj1PYmplY3QuYXNzaWduKHt9LGkuZiksbz1bXTtmb3IodmFyIGEgaW4gZSllW2FdPT09clthXXx8ITEhPT1lW2FdJiYhMCE9PWVbYV18fChyW2FdPWVbYV0pO3JldHVybiBlLnNlcnZlckxvYWRlZCYmby5wdXNoKHtwcm92aWRlOmkubCx1c2VWYWx1ZTohMH0pLEFycmF5LmlzQXJyYXkobikmJm8ucHVzaCh7cHJvdmlkZTppLmEsdXNlVmFsdWU6bixtdWx0aTohMH0pLG8ucHVzaCh7cHJvdmlkZTppLmcsdXNlVmFsdWU6cn0pLHtuZ01vZHVsZTp0LHByb3ZpZGVyczpvfX0sdH0oKX0sVk5yNDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBjfSk7dmFyIHI9bigibXJTRyIpLGk9bigiNmJsRiIpLG89bigiaXNieSIpLGE9bigiRzVKMSIpLHM9bigiem90bSIpLHU9bigiTUdCUyIpLGw9bigiNjdZLyIpO2Z1bmN0aW9uIGMoKXtmb3IodmFyIHQsZT1bXSxuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZVtlLmxlbmd0aC0xXSYmKHQ9ZS5wb3AoKSksMT09PWUubGVuZ3RoJiZPYmplY3Qoby5hKShlWzBdKSYmKGU9ZVswXSksMD09PWUubGVuZ3RoP2EuYTp0P2MoZSkucGlwZShPYmplY3QobC5hKShmdW5jdGlvbihlKXtyZXR1cm4gdC5hcHBseSh2b2lkIDAsZSl9KSk6bmV3IGkuYShmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGYodCxlKX0pfXZhciBmPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgcj10LmNhbGwodGhpcyxlKXx8dGhpcztyLnNvdXJjZXM9bixyLmNvbXBsZXRlZD0wLHIuaGF2ZVZhbHVlcz0wO3ZhciBpPW4ubGVuZ3RoO3IudmFsdWVzPW5ldyBBcnJheShpKTtmb3IodmFyIG89MDtvPGk7bysrKXt2YXIgYT1uW29dLHU9T2JqZWN0KHMuYSkocixhLG51bGwsbyk7dSYmci5hZGQodSl9cmV0dXJuIHJ9cmV0dXJuIHIuYihlLHQpLGUucHJvdG90eXBlLm5vdGlmeU5leHQ9ZnVuY3Rpb24odCxlLG4scixpKXt0aGlzLnZhbHVlc1tuXT1lLGkuX2hhc1ZhbHVlfHwoaS5faGFzVmFsdWU9ITAsdGhpcy5oYXZlVmFsdWVzKyspfSxlLnByb3RvdHlwZS5ub3RpZnlDb21wbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmRlc3RpbmF0aW9uLG49dGhpcy5oYXZlVmFsdWVzLHI9dGhpcy52YWx1ZXMsaT1yLmxlbmd0aDt0Ll9oYXNWYWx1ZT8odGhpcy5jb21wbGV0ZWQrKyx0aGlzLmNvbXBsZXRlZD09PWkmJihuPT09aSYmZS5uZXh0KHIpLGUuY29tcGxldGUoKSkpOmUuY29tcGxldGUoKX0sZX0odS5hKX0sIlZuRC8iOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KTt2YXIgcj1uKCJtclNHIiksaT1uKCJGRk9vIik7ZnVuY3Rpb24gbyh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi5saWZ0KG5ldyBhKHQsZSkpfX12YXIgYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLnByZWRpY2F0ZT10LHRoaXMudGhpc0FyZz1lfXJldHVybiB0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuc3Vic2NyaWJlKG5ldyBzKHQsdGhpcy5wcmVkaWNhdGUsdGhpcy50aGlzQXJnKSl9LHR9KCkscz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt2YXIgaT10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gaS5wcmVkaWNhdGU9bixpLnRoaXNBcmc9cixpLmNvdW50PTAsaX1yZXR1cm4gci5iKGUsdCksZS5wcm90b3R5cGUuX25leHQ9ZnVuY3Rpb24odCl7dmFyIGU7dHJ5e2U9dGhpcy5wcmVkaWNhdGUuY2FsbCh0aGlzLnRoaXNBcmcsdCx0aGlzLmNvdW50KyspfWNhdGNoKHQpe3JldHVybiB2b2lkIHRoaXMuZGVzdGluYXRpb24uZXJyb3IodCl9ZSYmdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHQpfSxlfShpLmEpfSxXZjRwOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImgiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSxuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pLG4uZChlLCJ3IixmdW5jdGlvbigpe3JldHVybiBmfSksbi5kKGUsInUiLGZ1bmN0aW9uKCl7cmV0dXJuIGh9KSxuLmQoZSwidiIsZnVuY3Rpb24oKXtyZXR1cm4gZH0pLG4uZChlLCJ0IixmdW5jdGlvbigpe3JldHVybiBTfSksbi5kKGUsImsiLGZ1bmN0aW9uKCl7cmV0dXJuIEV9KSxuLmQoZSwiZCIsZnVuY3Rpb24oKXtyZXR1cm4gcH0pLG4uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBtfSksbi5kKGUsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHl9KSxuLmQoZSwicyIsZnVuY3Rpb24oKXtyZXR1cm4gT30pLG4uZChlLCJlIixmdW5jdGlvbigpe3JldHVybiBDfSksbi5kKGUsImoiLGZ1bmN0aW9uKCl7cmV0dXJuIGt9KSxuLmQoZSwiaSIsZnVuY3Rpb24oKXtyZXR1cm4gVH0pLG4uZChlLCJuIixmdW5jdGlvbigpe3JldHVybiBXfSksbi5kKGUsImYiLGZ1bmN0aW9uKCl7cmV0dXJuIEJ9KSxuLmQoZSwibSIsZnVuY3Rpb24oKXtyZXR1cm4gSH0pLG4uZChlLCJsIixmdW5jdGlvbigpe3JldHVybiBVfSksbi5kKGUsInIiLGZ1bmN0aW9uKCl7cmV0dXJuIER9KSxuLmQoZSwiZyIsZnVuY3Rpb24oKXtyZXR1cm4gTn0pLG4uZChlLCJxIixmdW5jdGlvbigpe3JldHVybiBSfSksbi5kKGUsInAiLGZ1bmN0aW9uKCl7cmV0dXJuIEZ9KSxuLmQoZSwibyIsZnVuY3Rpb24oKXtyZXR1cm4gTH0pO3ZhciByPW4oIkNjbkciKSxpPW4oIm1yU0ciKSxvPW4oIm42Z0ciKSxhPW4oIks5SWEiKSxzPShuKCI2YmxGIiksbigiZFdaZyIpKSx1PShuKCJaWWp0IiksbigiWVNoMiIpKSxsPW5ldyByLm8oIm1hdC1zYW5pdHktY2hlY2tzIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiEwfX0pLGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX3Nhbml0eUNoZWNrc0VuYWJsZWQ9dCx0aGlzLl9oYXNEb25lR2xvYmFsQ2hlY2tzPSExLHRoaXMuX2hhc0NoZWNrZWRIYW1tZXI9ITEsdGhpcy5fZG9jdW1lbnQ9Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQ/ZG9jdW1lbnQ6bnVsbCx0aGlzLl93aW5kb3c9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdz93aW5kb3c6bnVsbCx0aGlzLl9hcmVDaGVja3NFbmFibGVkKCkmJiF0aGlzLl9oYXNEb25lR2xvYmFsQ2hlY2tzJiYodGhpcy5fY2hlY2tEb2N0eXBlSXNEZWZpbmVkKCksdGhpcy5fY2hlY2tUaGVtZUlzUHJlc2VudCgpLHRoaXMuX2hhc0RvbmVHbG9iYWxDaGVja3M9ITApfXJldHVybiB0LnByb3RvdHlwZS5fYXJlQ2hlY2tzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zYW5pdHlDaGVja3NFbmFibGVkJiZPYmplY3Qoci5XKSgpJiYhdGhpcy5faXNUZXN0RW52KCl9LHQucHJvdG90eXBlLl9pc1Rlc3RFbnY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd2luZG93JiYodGhpcy5fd2luZG93Ll9fa2FybWFfX3x8dGhpcy5fd2luZG93Lmphc21pbmUpfSx0LnByb3RvdHlwZS5fY2hlY2tEb2N0eXBlSXNEZWZpbmVkPWZ1bmN0aW9uKCl7dGhpcy5fZG9jdW1lbnQmJiF0aGlzLl9kb2N1bWVudC5kb2N0eXBlJiZjb25zb2xlLndhcm4oIkN1cnJlbnQgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBhIGRvY3R5cGUuIFRoaXMgbWF5IGNhdXNlIHNvbWUgQW5ndWxhciBNYXRlcmlhbCBjb21wb25lbnRzIG5vdCB0byBiZWhhdmUgYXMgZXhwZWN0ZWQuIil9LHQucHJvdG90eXBlLl9jaGVja1RoZW1lSXNQcmVzZW50PWZ1bmN0aW9uKCl7aWYodGhpcy5fZG9jdW1lbnQmJiJmdW5jdGlvbiI9PXR5cGVvZiBnZXRDb21wdXRlZFN0eWxlKXt2YXIgdD10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTGlzdC5hZGQoIm1hdC10aGVtZS1sb2FkZWQtbWFya2VyIiksdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KTt2YXIgZT1nZXRDb21wdXRlZFN0eWxlKHQpO2UmJiJub25lIiE9PWUuZGlzcGxheSYmY29uc29sZS53YXJuKCJDb3VsZCBub3QgZmluZCBBbmd1bGFyIE1hdGVyaWFsIGNvcmUgdGhlbWUuIE1vc3QgTWF0ZXJpYWwgY29tcG9uZW50cyBtYXkgbm90IHdvcmsgYXMgZXhwZWN0ZWQuIEZvciBtb3JlIGluZm8gcmVmZXIgdG8gdGhlIHRoZW1pbmcgZ3VpZGU6IGh0dHBzOi8vbWF0ZXJpYWwuYW5ndWxhci5pby9ndWlkZS90aGVtaW5nIiksdGhpcy5fZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KX19LHQucHJvdG90eXBlLl9jaGVja0hhbW1lcklzQXZhaWxhYmxlPWZ1bmN0aW9uKCl7IXRoaXMuX2hhc0NoZWNrZWRIYW1tZXImJnRoaXMuX3dpbmRvdyYmKHRoaXMuX2FyZUNoZWNrc0VuYWJsZWQoKSYmIXRoaXMuX3dpbmRvdy5IYW1tZXImJmNvbnNvbGUud2FybigiQ291bGQgbm90IGZpbmQgSGFtbWVySlMuIENlcnRhaW4gQW5ndWxhciBNYXRlcmlhbCBjb21wb25lbnRzIG1heSBub3Qgd29yayBjb3JyZWN0bHkuIiksdGhpcy5faGFzQ2hlY2tlZEhhbW1lcj0hMCl9LHR9KCk7ZnVuY3Rpb24gZih0KXtyZXR1cm4gZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe2Zvcih2YXIgZT1bXSxuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyllW25dPWFyZ3VtZW50c1tuXTt2YXIgcj10LmFwcGx5KHRoaXMsZSl8fHRoaXM7cmV0dXJuIHIuX2Rpc2FibGVkPSExLHJ9cmV0dXJuIE9iamVjdChpLmIpKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJkaXNhYmxlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNhYmxlZH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2Rpc2FibGVkPU9iamVjdChvLmIpKHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGV9KHQpfWZ1bmN0aW9uIGgodCxlKXtyZXR1cm4gZnVuY3Rpb24odCl7ZnVuY3Rpb24gbigpe2Zvcih2YXIgbj1bXSxyPTA7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyluW3JdPWFyZ3VtZW50c1tyXTt2YXIgaT10LmFwcGx5KHRoaXMsbil8fHRoaXM7cmV0dXJuIGkuY29sb3I9ZSxpfXJldHVybiBPYmplY3QoaS5iKShuLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSwiY29sb3IiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29sb3J9LHNldDpmdW5jdGlvbih0KXt2YXIgbj10fHxlO24hPT10aGlzLl9jb2xvciYmKHRoaXMuX2NvbG9yJiZ0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgibWF0LSIrdGhpcy5fY29sb3IpLG4mJnRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCJtYXQtIituKSx0aGlzLl9jb2xvcj1uKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxufSh0KX1mdW5jdGlvbiBkKHQpe3JldHVybiBmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7Zm9yKHZhciBlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbl09YXJndW1lbnRzW25dO3ZhciByPXQuYXBwbHkodGhpcyxlKXx8dGhpcztyZXR1cm4gci5fZGlzYWJsZVJpcHBsZT0hMSxyfXJldHVybiBPYmplY3QoaS5iKShlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiZGlzYWJsZVJpcHBsZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNhYmxlUmlwcGxlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZGlzYWJsZVJpcHBsZT1PYmplY3Qoby5iKSh0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlfSh0KX12YXIgcD1uZXcgci5vKCJNQVRfREFURV9MT0NBTEUiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OmZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdChyLlYpKHIucyl9fSksbT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9sb2NhbGVDaGFuZ2VzPW5ldyBhLmF9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibG9jYWxlQ2hhbmdlcyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2NhbGVDaGFuZ2VzfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmRlc2VyaWFsaXplPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHx0aGlzLmlzRGF0ZUluc3RhbmNlKHQpJiZ0aGlzLmlzVmFsaWQodCk/dDp0aGlzLmludmFsaWQoKX0sdC5wcm90b3R5cGUuc2V0TG9jYWxlPWZ1bmN0aW9uKHQpe3RoaXMubG9jYWxlPXQsdGhpcy5fbG9jYWxlQ2hhbmdlcy5uZXh0KCl9LHQucHJvdG90eXBlLmNvbXBhcmVEYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZ2V0WWVhcih0KS10aGlzLmdldFllYXIoZSl8fHRoaXMuZ2V0TW9udGgodCktdGhpcy5nZXRNb250aChlKXx8dGhpcy5nZXREYXRlKHQpLXRoaXMuZ2V0RGF0ZShlKX0sdC5wcm90b3R5cGUuc2FtZURhdGU9ZnVuY3Rpb24odCxlKXtpZih0JiZlKXt2YXIgbj10aGlzLmlzVmFsaWQodCkscj10aGlzLmlzVmFsaWQoZSk7cmV0dXJuIG4mJnI/IXRoaXMuY29tcGFyZURhdGUodCxlKTpuPT1yfXJldHVybiB0PT1lfSx0LnByb3RvdHlwZS5jbGFtcERhdGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlJiZ0aGlzLmNvbXBhcmVEYXRlKHQsZSk8MD9lOm4mJnRoaXMuY29tcGFyZURhdGUodCxuKT4wP246dH0sdH0oKSx5PW5ldyByLm8oIm1hdC1kYXRlLWZvcm1hdHMiKSxnPSJ1bmRlZmluZWQiIT10eXBlb2YgSW50bCx2PXtsb25nOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydDpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLG5hcnJvdzpbIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdfSxiPXgoMzEsZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KzEpfSksXz17bG9uZzpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnQ6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxuYXJyb3c6WyJTIiwiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIl19LHc9L15cZHs0fS1cZHsyfS1cZHsyfSg/OlRcZHsyfTpcZHsyfTpcZHsyfSg/OlwuXGQrKT8oPzpafCg/Oig/OlwrfC0pXGR7Mn06XGR7Mn0pKT8pPyQvO2Z1bmN0aW9uIHgodCxlKXtmb3IodmFyIG49QXJyYXkodCkscj0wO3I8dDtyKyspbltyXT1lKHIpO3JldHVybiBufXZhciBPPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgcj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIHIudXNlVXRjRm9yRGlzcGxheT0hMCx0LnByb3RvdHlwZS5zZXRMb2NhbGUuY2FsbChyLGUpLHIudXNlVXRjRm9yRGlzcGxheT0hbi5UUklERU5ULHIuX2NsYW1wRGF0ZT1uLlRSSURFTlR8fG4uRURHRSxyfXJldHVybiBPYmplY3QoaS5iKShlLHQpLGUucHJvdG90eXBlLmdldFllYXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RnVsbFllYXIoKX0sZS5wcm90b3R5cGUuZ2V0TW9udGg9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TW9udGgoKX0sZS5wcm90b3R5cGUuZ2V0RGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXRlKCl9LGUucHJvdG90eXBlLmdldERheU9mV2Vlaz1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXkoKX0sZS5wcm90b3R5cGUuZ2V0TW9udGhOYW1lcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKGcpe3ZhciBuPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLHttb250aDp0LHRpbWVab25lOiJ1dGMifSk7cmV0dXJuIHgoMTIsZnVuY3Rpb24odCl7cmV0dXJuIGUuX3N0cmlwRGlyZWN0aW9uYWxpdHlDaGFyYWN0ZXJzKGUuX2Zvcm1hdChuLG5ldyBEYXRlKDIwMTcsdCwxKSkpfSl9cmV0dXJuIHZbdF19LGUucHJvdG90eXBlLmdldERhdGVOYW1lcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoZyl7dmFyIGU9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUse2RheToibnVtZXJpYyIsdGltZVpvbmU6InV0YyJ9KTtyZXR1cm4geCgzMSxmdW5jdGlvbihuKXtyZXR1cm4gdC5fc3RyaXBEaXJlY3Rpb25hbGl0eUNoYXJhY3RlcnModC5fZm9ybWF0KGUsbmV3IERhdGUoMjAxNywwLG4rMSkpKX0pfXJldHVybiBifSxlLnByb3RvdHlwZS5nZXREYXlPZldlZWtOYW1lcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKGcpe3ZhciBuPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLHt3ZWVrZGF5OnQsdGltZVpvbmU6InV0YyJ9KTtyZXR1cm4geCg3LGZ1bmN0aW9uKHQpe3JldHVybiBlLl9zdHJpcERpcmVjdGlvbmFsaXR5Q2hhcmFjdGVycyhlLl9mb3JtYXQobixuZXcgRGF0ZSgyMDE3LDAsdCsxKSkpfSl9cmV0dXJuIF9bdF19LGUucHJvdG90eXBlLmdldFllYXJOYW1lPWZ1bmN0aW9uKHQpe2lmKGcpe3ZhciBlPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLHt5ZWFyOiJudW1lcmljIix0aW1lWm9uZToidXRjIn0pO3JldHVybiB0aGlzLl9zdHJpcERpcmVjdGlvbmFsaXR5Q2hhcmFjdGVycyh0aGlzLl9mb3JtYXQoZSx0KSl9cmV0dXJuIFN0cmluZyh0aGlzLmdldFllYXIodCkpfSxlLnByb3RvdHlwZS5nZXRGaXJzdERheU9mV2Vlaz1mdW5jdGlvbigpe3JldHVybiAwfSxlLnByb3RvdHlwZS5nZXROdW1EYXlzSW5Nb250aD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXREYXRlKHRoaXMuX2NyZWF0ZURhdGVXaXRoT3ZlcmZsb3codGhpcy5nZXRZZWFyKHQpLHRoaXMuZ2V0TW9udGgodCkrMSwwKSl9LGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNyZWF0ZURhdGUodGhpcy5nZXRZZWFyKHQpLHRoaXMuZ2V0TW9udGgodCksdGhpcy5nZXREYXRlKHQpKX0sZS5wcm90b3R5cGUuY3JlYXRlRGF0ZT1mdW5jdGlvbih0LGUsbil7aWYoZTwwfHxlPjExKXRocm93IEVycm9yKCdJbnZhbGlkIG1vbnRoIGluZGV4ICInK2UrJyIuIE1vbnRoIGluZGV4IGhhcyB0byBiZSBiZXR3ZWVuIDAgYW5kIDExLicpO2lmKG48MSl0aHJvdyBFcnJvcignSW52YWxpZCBkYXRlICInK24rJyIuIERhdGUgaGFzIHRvIGJlIGdyZWF0ZXIgdGhhbiAwLicpO3ZhciByPXRoaXMuX2NyZWF0ZURhdGVXaXRoT3ZlcmZsb3codCxlLG4pO2lmKHIuZ2V0TW9udGgoKSE9ZSl0aHJvdyBFcnJvcignSW52YWxpZCBkYXRlICInK24rJyIgZm9yIG1vbnRoIHdpdGggaW5kZXggIicrZSsnIi4nKTtyZXR1cm4gcn0sZS5wcm90b3R5cGUudG9kYXk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERhdGV9LGUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD9uZXcgRGF0ZSh0KTp0P25ldyBEYXRlKERhdGUucGFyc2UodCkpOm51bGx9LGUucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLmlzVmFsaWQodCkpdGhyb3cgRXJyb3IoIk5hdGl2ZURhdGVBZGFwdGVyOiBDYW5ub3QgZm9ybWF0IGludmFsaWQgZGF0ZS4iKTtpZihnKXt0aGlzLl9jbGFtcERhdGUmJih0LmdldEZ1bGxZZWFyKCk8MXx8dC5nZXRGdWxsWWVhcigpPjk5OTkpJiYodD10aGlzLmNsb25lKHQpKS5zZXRGdWxsWWVhcihNYXRoLm1heCgxLE1hdGgubWluKDk5OTksdC5nZXRGdWxsWWVhcigpKSkpLGU9T2JqZWN0KGkuYSkoe30sZSx7dGltZVpvbmU6InV0YyJ9KTt2YXIgbj1uZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLmxvY2FsZSxlKTtyZXR1cm4gdGhpcy5fc3RyaXBEaXJlY3Rpb25hbGl0eUNoYXJhY3RlcnModGhpcy5fZm9ybWF0KG4sdCkpfXJldHVybiB0aGlzLl9zdHJpcERpcmVjdGlvbmFsaXR5Q2hhcmFjdGVycyh0LnRvRGF0ZVN0cmluZygpKX0sZS5wcm90b3R5cGUuYWRkQ2FsZW5kYXJZZWFycz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmFkZENhbGVuZGFyTW9udGhzKHQsMTIqZSl9LGUucHJvdG90eXBlLmFkZENhbGVuZGFyTW9udGhzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0aGlzLmdldFllYXIodCksdGhpcy5nZXRNb250aCh0KStlLHRoaXMuZ2V0RGF0ZSh0KSk7cmV0dXJuIHRoaXMuZ2V0TW9udGgobikhPSgodGhpcy5nZXRNb250aCh0KStlKSUxMisxMiklMTImJihuPXRoaXMuX2NyZWF0ZURhdGVXaXRoT3ZlcmZsb3codGhpcy5nZXRZZWFyKG4pLHRoaXMuZ2V0TW9udGgobiksMCkpLG59LGUucHJvdG90eXBlLmFkZENhbGVuZGFyRGF5cz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9jcmVhdGVEYXRlV2l0aE92ZXJmbG93KHRoaXMuZ2V0WWVhcih0KSx0aGlzLmdldE1vbnRoKHQpLHRoaXMuZ2V0RGF0ZSh0KStlKX0sZS5wcm90b3R5cGUudG9Jc284NjAxPWZ1bmN0aW9uKHQpe3JldHVyblt0LmdldFVUQ0Z1bGxZZWFyKCksdGhpcy5fMmRpZ2l0KHQuZ2V0VVRDTW9udGgoKSsxKSx0aGlzLl8yZGlnaXQodC5nZXRVVENEYXRlKCkpXS5qb2luKCItIil9LGUucHJvdG90eXBlLmRlc2VyaWFsaXplPWZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoIWUpcmV0dXJuIG51bGw7aWYody50ZXN0KGUpKXt2YXIgbj1uZXcgRGF0ZShlKTtpZih0aGlzLmlzVmFsaWQobikpcmV0dXJuIG59fXJldHVybiB0LnByb3RvdHlwZS5kZXNlcmlhbGl6ZS5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLmlzRGF0ZUluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZX0sZS5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbih0KXtyZXR1cm4haXNOYU4odC5nZXRUaW1lKCkpfSxlLnByb3RvdHlwZS5pbnZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBEYXRlKE5hTil9LGUucHJvdG90eXBlLl9jcmVhdGVEYXRlV2l0aE92ZXJmbG93PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgRGF0ZSh0LGUsbik7cmV0dXJuIHQ+PTAmJnQ8MTAwJiZyLnNldEZ1bGxZZWFyKHRoaXMuZ2V0WWVhcihyKS0xOTAwKSxyfSxlLnByb3RvdHlwZS5fMmRpZ2l0PWZ1bmN0aW9uKHQpe3JldHVybigiMDAiK3QpLnNsaWNlKC0yKX0sZS5wcm90b3R5cGUuX3N0cmlwRGlyZWN0aW9uYWxpdHlDaGFyYWN0ZXJzPWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoL1tcdTIwMGVcdTIwMGZdL2csIiIpfSxlLnByb3RvdHlwZS5fZm9ybWF0PWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IERhdGUoRGF0ZS5VVEMoZS5nZXRGdWxsWWVhcigpLGUuZ2V0TW9udGgoKSxlLmdldERhdGUoKSxlLmdldEhvdXJzKCksZS5nZXRNaW51dGVzKCksZS5nZXRTZWNvbmRzKCksZS5nZXRNaWxsaXNlY29uZHMoKSkpO3JldHVybiB0LmZvcm1hdChuKX0sZX0obSksQz17cGFyc2U6e2RhdGVJbnB1dDpudWxsfSxkaXNwbGF5OntkYXRlSW5wdXQ6e3llYXI6Im51bWVyaWMiLG1vbnRoOiJudW1lcmljIixkYXk6Im51bWVyaWMifSxtb250aFllYXJMYWJlbDp7eWVhcjoibnVtZXJpYyIsbW9udGg6InNob3J0In0sZGF0ZUExMXlMYWJlbDp7eWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9LG1vbnRoWWVhckExMXlMYWJlbDp7eWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmcifX19LFM9ZnVuY3Rpb24oKXt9LEU9ZnVuY3Rpb24oKXt9LGs9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dmFyIG49dGhpczt0aGlzLl9saW5lcz10LHRoaXMuX2VsZW1lbnQ9ZSx0aGlzLl9zZXRMaW5lQ2xhc3ModGhpcy5fbGluZXMubGVuZ3RoKSx0aGlzLl9saW5lcy5jaGFuZ2VzLnN1YnNjcmliZShmdW5jdGlvbigpe24uX3NldExpbmVDbGFzcyhuLl9saW5lcy5sZW5ndGgpfSl9cmV0dXJuIHQucHJvdG90eXBlLl9zZXRMaW5lQ2xhc3M9ZnVuY3Rpb24odCl7dGhpcy5fcmVzZXRDbGFzc2VzKCksMj09PXR8fDM9PT10P3RoaXMuX3NldENsYXNzKCJtYXQtIit0KyItbGluZSIsITApOnQ+MyYmdGhpcy5fc2V0Q2xhc3MoIm1hdC1tdWx0aS1saW5lIiwhMCl9LHQucHJvdG90eXBlLl9yZXNldENsYXNzZXM9ZnVuY3Rpb24oKXt0aGlzLl9zZXRDbGFzcygibWF0LTItbGluZSIsITEpLHRoaXMuX3NldENsYXNzKCJtYXQtMy1saW5lIiwhMSksdGhpcy5fc2V0Q2xhc3MoIm1hdC1tdWx0aS1saW5lIiwhMSl9LHQucHJvdG90eXBlLl9zZXRDbGFzcz1mdW5jdGlvbih0LGUpe2U/dGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQodCk6dGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodCl9LHR9KCksVD1mdW5jdGlvbigpe30sST1mdW5jdGlvbigpe3ZhciB0PXtGQURJTkdfSU46MCxWSVNJQkxFOjEsRkFESU5HX09VVDoyLEhJRERFTjozfTtyZXR1cm4gdFt0LkZBRElOR19JTl09IkZBRElOR19JTiIsdFt0LlZJU0lCTEVdPSJWSVNJQkxFIix0W3QuRkFESU5HX09VVF09IkZBRElOR19PVVQiLHRbdC5ISURERU5dPSJISURERU4iLHR9KCksQT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMuX3JlbmRlcmVyPXQsdGhpcy5lbGVtZW50PWUsdGhpcy5jb25maWc9bix0aGlzLnN0YXRlPUkuSElEREVOfXJldHVybiB0LnByb3RvdHlwZS5mYWRlT3V0PWZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyZXIuZmFkZU91dFJpcHBsZSh0aGlzKX0sdH0oKSxqPXtlbnRlckR1cmF0aW9uOjQ1MCxleGl0RHVyYXRpb246NDAwfSxQPTgwMCxNPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyKXt2YXIgaT10aGlzO3RoaXMuX3RhcmdldD10LHRoaXMuX25nWm9uZT1lLHRoaXMuX2lzUG9pbnRlckRvd249ITEsdGhpcy5fdHJpZ2dlckV2ZW50cz1uZXcgTWFwLHRoaXMuX2FjdGl2ZVJpcHBsZXM9bmV3IFNldCx0aGlzLl9ldmVudE9wdGlvbnM9ISFPYmplY3Qocy5jKSgpJiZ7cGFzc2l2ZTohMH0sdGhpcy5vbk1vdXNlZG93bj1mdW5jdGlvbih0KXt2YXIgZT1pLl9sYXN0VG91Y2hTdGFydEV2ZW50JiZEYXRlLm5vdygpPGkuX2xhc3RUb3VjaFN0YXJ0RXZlbnQrUDtpLl90YXJnZXQucmlwcGxlRGlzYWJsZWR8fGV8fChpLl9pc1BvaW50ZXJEb3duPSEwLGkuZmFkZUluUmlwcGxlKHQuY2xpZW50WCx0LmNsaWVudFksaS5fdGFyZ2V0LnJpcHBsZUNvbmZpZykpfSx0aGlzLm9uVG91Y2hTdGFydD1mdW5jdGlvbih0KXtpLl90YXJnZXQucmlwcGxlRGlzYWJsZWR8fChpLl9sYXN0VG91Y2hTdGFydEV2ZW50PURhdGUubm93KCksaS5faXNQb2ludGVyRG93bj0hMCxpLmZhZGVJblJpcHBsZSh0LnRvdWNoZXNbMF0uY2xpZW50WCx0LnRvdWNoZXNbMF0uY2xpZW50WSxpLl90YXJnZXQucmlwcGxlQ29uZmlnKSl9LHRoaXMub25Qb2ludGVyVXA9ZnVuY3Rpb24oKXtpLl9pc1BvaW50ZXJEb3duJiYoaS5faXNQb2ludGVyRG93bj0hMSxpLl9hY3RpdmVSaXBwbGVzLmZvckVhY2goZnVuY3Rpb24odCl7IXQuY29uZmlnLnBlcnNpc3RlbnQmJih0LnN0YXRlPT09SS5WSVNJQkxFfHx0LmNvbmZpZy50ZXJtaW5hdGVPblBvaW50ZXJVcCYmdC5zdGF0ZT09PUkuRkFESU5HX0lOKSYmdC5mYWRlT3V0KCl9KSl9LHIuaXNCcm93c2VyJiYodGhpcy5fY29udGFpbmVyRWxlbWVudD1uLm5hdGl2ZUVsZW1lbnQsdGhpcy5fdHJpZ2dlckV2ZW50cy5zZXQoIm1vdXNlZG93biIsdGhpcy5vbk1vdXNlZG93biksdGhpcy5fdHJpZ2dlckV2ZW50cy5zZXQoIm1vdXNldXAiLHRoaXMub25Qb2ludGVyVXApLHRoaXMuX3RyaWdnZXJFdmVudHMuc2V0KCJtb3VzZWxlYXZlIix0aGlzLm9uUG9pbnRlclVwKSx0aGlzLl90cmlnZ2VyRXZlbnRzLnNldCgidG91Y2hzdGFydCIsdGhpcy5vblRvdWNoU3RhcnQpLHRoaXMuX3RyaWdnZXJFdmVudHMuc2V0KCJ0b3VjaGVuZCIsdGhpcy5vblBvaW50ZXJVcCkpfXJldHVybiB0LnByb3RvdHlwZS5mYWRlSW5SaXBwbGU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXM7dm9pZCAwPT09biYmKG49e30pO3ZhciBvPXRoaXMuX2NvbnRhaW5lclJlY3Q9dGhpcy5fY29udGFpbmVyUmVjdHx8dGhpcy5fY29udGFpbmVyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPU9iamVjdChpLmEpKHt9LGosbi5hbmltYXRpb24pO24uY2VudGVyZWQmJih0PW8ubGVmdCtvLndpZHRoLzIsZT1vLnRvcCtvLmhlaWdodC8yKTt2YXIgcz1uLnJhZGl1c3x8ZnVuY3Rpb24odCxlLG4pe3ZhciByPU1hdGgubWF4KE1hdGguYWJzKHQtbi5sZWZ0KSxNYXRoLmFicyh0LW4ucmlnaHQpKSxpPU1hdGgubWF4KE1hdGguYWJzKGUtbi50b3ApLE1hdGguYWJzKGUtbi5ib3R0b20pKTtyZXR1cm4gTWF0aC5zcXJ0KHIqcitpKmkpfSh0LGUsbyksdT10LW8ubGVmdCxsPWUtby50b3AsYz1hLmVudGVyRHVyYXRpb24vKG4uc3BlZWRGYWN0b3J8fDEpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJtYXQtcmlwcGxlLWVsZW1lbnQiKSxmLnN0eWxlLmxlZnQ9dS1zKyJweCIsZi5zdHlsZS50b3A9bC1zKyJweCIsZi5zdHlsZS5oZWlnaHQ9MipzKyJweCIsZi5zdHlsZS53aWR0aD0yKnMrInB4IixmLnN0eWxlLmJhY2tncm91bmRDb2xvcj1uLmNvbG9yfHxudWxsLGYuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWMrIm1zIix0aGlzLl9jb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKGYpLHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGYpLmdldFByb3BlcnR5VmFsdWUoIm9wYWNpdHkiKSxmLnN0eWxlLnRyYW5zZm9ybT0ic2NhbGUoMSkiO3ZhciBoPW5ldyBBKHRoaXMsZixuKTtyZXR1cm4gaC5zdGF0ZT1JLkZBRElOR19JTix0aGlzLl9hY3RpdmVSaXBwbGVzLmFkZChoKSxuLnBlcnNpc3RlbnR8fCh0aGlzLl9tb3N0UmVjZW50VHJhbnNpZW50UmlwcGxlPWgpLHRoaXMucnVuVGltZW91dE91dHNpZGVab25lKGZ1bmN0aW9uKCl7dmFyIHQ9aD09PXIuX21vc3RSZWNlbnRUcmFuc2llbnRSaXBwbGU7aC5zdGF0ZT1JLlZJU0lCTEUsbi5wZXJzaXN0ZW50fHx0JiZyLl9pc1BvaW50ZXJEb3dufHxoLmZhZGVPdXQoKX0sYyksaH0sdC5wcm90b3R5cGUuZmFkZU91dFJpcHBsZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9hY3RpdmVSaXBwbGVzLmRlbGV0ZSh0KTtpZih0PT09dGhpcy5fbW9zdFJlY2VudFRyYW5zaWVudFJpcHBsZSYmKHRoaXMuX21vc3RSZWNlbnRUcmFuc2llbnRSaXBwbGU9bnVsbCksdGhpcy5fYWN0aXZlUmlwcGxlcy5zaXplfHwodGhpcy5fY29udGFpbmVyUmVjdD1udWxsKSxlKXt2YXIgbj10LmVsZW1lbnQscj1PYmplY3QoaS5hKSh7fSxqLHQuY29uZmlnLmFuaW1hdGlvbik7bi5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249ci5leGl0RHVyYXRpb24rIm1zIixuLnN0eWxlLm9wYWNpdHk9IjAiLHQuc3RhdGU9SS5GQURJTkdfT1VULHRoaXMucnVuVGltZW91dE91dHNpZGVab25lKGZ1bmN0aW9uKCl7dC5zdGF0ZT1JLkhJRERFTixuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobil9LHIuZXhpdER1cmF0aW9uKX19LHQucHJvdG90eXBlLmZhZGVPdXRBbGw9ZnVuY3Rpb24oKXt0aGlzLl9hY3RpdmVSaXBwbGVzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQuZmFkZU91dCgpfSl9LHQucHJvdG90eXBlLnNldHVwVHJpZ2dlckV2ZW50cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3QmJnQhPT10aGlzLl90cmlnZ2VyRWxlbWVudCYmKHRoaXMuX3JlbW92ZVRyaWdnZXJFdmVudHMoKSx0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24oKXtlLl90cmlnZ2VyRXZlbnRzLmZvckVhY2goZnVuY3Rpb24obixyKXtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKHIsbixlLl9ldmVudE9wdGlvbnMpfSl9KSx0aGlzLl90cmlnZ2VyRWxlbWVudD10KX0sdC5wcm90b3R5cGUucnVuVGltZW91dE91dHNpZGVab25lPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9MCksdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKGZ1bmN0aW9uKCl7cmV0dXJuIHNldFRpbWVvdXQodCxlKX0pfSx0LnByb3RvdHlwZS5fcmVtb3ZlVHJpZ2dlckV2ZW50cz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fdHJpZ2dlckVsZW1lbnQmJnRoaXMuX3RyaWdnZXJFdmVudHMuZm9yRWFjaChmdW5jdGlvbihlLG4pe3QuX3RyaWdnZXJFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobixlLHQuX2V2ZW50T3B0aW9ucyl9KX0sdH0oKSxOPW5ldyByLm8oIm1hdC1yaXBwbGUtZ2xvYmFsLW9wdGlvbnMiKSxSPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyLGkpe3RoaXMuX2VsZW1lbnRSZWY9dCx0aGlzLl9hbmltYXRpb25Nb2RlPWksdGhpcy5yYWRpdXM9MCx0aGlzLnNwZWVkRmFjdG9yPTEsdGhpcy5fZGlzYWJsZWQ9ITEsdGhpcy5faXNJbml0aWFsaXplZD0hMSx0aGlzLl9nbG9iYWxPcHRpb25zPXJ8fHt9LHRoaXMuX3JpcHBsZVJlbmRlcmVyPW5ldyBNKHRoaXMsZSx0LG4pfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImRpc2FibGVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc2FibGVkfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZGlzYWJsZWQ9dCx0aGlzLl9zZXR1cFRyaWdnZXJFdmVudHNJZkVuYWJsZWQoKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInRyaWdnZXIiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdHJpZ2dlcnx8dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fdHJpZ2dlcj10LHRoaXMuX3NldHVwVHJpZ2dlckV2ZW50c0lmRW5hYmxlZCgpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLm5nT25Jbml0PWZ1bmN0aW9uKCl7dGhpcy5faXNJbml0aWFsaXplZD0hMCx0aGlzLl9zZXR1cFRyaWdnZXJFdmVudHNJZkVuYWJsZWQoKX0sdC5wcm90b3R5cGUubmdPbkRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVSZW5kZXJlci5fcmVtb3ZlVHJpZ2dlckV2ZW50cygpfSx0LnByb3RvdHlwZS5mYWRlT3V0QWxsPWZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlUmVuZGVyZXIuZmFkZU91dEFsbCgpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInJpcHBsZUNvbmZpZyIse2dldDpmdW5jdGlvbigpe3JldHVybntjZW50ZXJlZDp0aGlzLmNlbnRlcmVkLHJhZGl1czp0aGlzLnJhZGl1cyxjb2xvcjp0aGlzLmNvbG9yLGFuaW1hdGlvbjoiTm9vcEFuaW1hdGlvbnMiPT09dGhpcy5fYW5pbWF0aW9uTW9kZT97ZW50ZXJEdXJhdGlvbjowLGV4aXREdXJhdGlvbjowfTpPYmplY3QoaS5hKSh7fSx0aGlzLl9nbG9iYWxPcHRpb25zLmFuaW1hdGlvbix0aGlzLmFuaW1hdGlvbiksdGVybWluYXRlT25Qb2ludGVyVXA6dGhpcy5fZ2xvYmFsT3B0aW9ucy50ZXJtaW5hdGVPblBvaW50ZXJVcCxzcGVlZEZhY3Rvcjp0aGlzLnNwZWVkRmFjdG9yKih0aGlzLl9nbG9iYWxPcHRpb25zLmJhc2VTcGVlZEZhY3Rvcnx8MSl9fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicmlwcGxlRGlzYWJsZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNhYmxlZHx8ISF0aGlzLl9nbG9iYWxPcHRpb25zLmRpc2FibGVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLl9zZXR1cFRyaWdnZXJFdmVudHNJZkVuYWJsZWQ9ZnVuY3Rpb24oKXshdGhpcy5kaXNhYmxlZCYmdGhpcy5faXNJbml0aWFsaXplZCYmdGhpcy5fcmlwcGxlUmVuZGVyZXIuc2V0dXBUcmlnZ2VyRXZlbnRzKHRoaXMudHJpZ2dlcil9LHQucHJvdG90eXBlLmxhdW5jaD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHZvaWQgMD09PWUmJihlPTApLCJudW1iZXIiPT10eXBlb2YgdD90aGlzLl9yaXBwbGVSZW5kZXJlci5mYWRlSW5SaXBwbGUodCxlLE9iamVjdChpLmEpKHt9LHRoaXMucmlwcGxlQ29uZmlnLG4pKTp0aGlzLl9yaXBwbGVSZW5kZXJlci5mYWRlSW5SaXBwbGUoMCwwLE9iamVjdChpLmEpKHt9LHRoaXMucmlwcGxlQ29uZmlnLHQpKX0sdH0oKSxEPWZ1bmN0aW9uKCl7fSxMPWZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT0idW5jaGVja2VkIix0aGlzLmRpc2FibGVkPSExfSxGPWZ1bmN0aW9uKCl7fSxWPTAsVT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLl9sYWJlbElkPSJtYXQtb3B0Z3JvdXAtbGFiZWwtIitWKyssZX1yZXR1cm4gT2JqZWN0KGkuYikoZSx0KSxlfShmKGZ1bmN0aW9uKCl7fSkpLHo9MCxCPW5ldyByLm8oIk1BVF9PUFRJT05fUEFSRU5UX0NPTVBPTkVOVCIpLEg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLGkpe3RoaXMuX2VsZW1lbnQ9dCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZj1lLHRoaXMuX3BhcmVudD1uLHRoaXMuZ3JvdXA9aSx0aGlzLl9zZWxlY3RlZD0hMSx0aGlzLl9hY3RpdmU9ITEsdGhpcy5fZGlzYWJsZWQ9ITEsdGhpcy5faWQ9Im1hdC1vcHRpb24tIit6KyssdGhpcy5fbW9zdFJlY2VudFZpZXdWYWx1ZT0iIix0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlPW5ldyByLm0sdGhpcy5fc3RhdGVDaGFuZ2VzPW5ldyBhLmF9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibXVsdGlwbGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFyZW50JiZ0aGlzLl9wYXJlbnQubXVsdGlwbGV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJpZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInNlbGVjdGVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZGlzYWJsZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ncm91cCYmdGhpcy5ncm91cC5kaXNhYmxlZHx8dGhpcy5fZGlzYWJsZWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9kaXNhYmxlZD1PYmplY3Qoby5iKSh0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImRpc2FibGVSaXBwbGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFyZW50JiZ0aGlzLl9wYXJlbnQuZGlzYWJsZVJpcHBsZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImFjdGl2ZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hY3RpdmV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJ2aWV3VmFsdWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5fZ2V0SG9zdEVsZW1lbnQoKS50ZXh0Q29udGVudHx8IiIpLnRyaW0oKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5zZWxlY3Q9ZnVuY3Rpb24oKXt0aGlzLl9zZWxlY3RlZD0hMCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSx0aGlzLl9lbWl0U2VsZWN0aW9uQ2hhbmdlRXZlbnQoKX0sdC5wcm90b3R5cGUuZGVzZWxlY3Q9ZnVuY3Rpb24oKXt0aGlzLl9zZWxlY3RlZD0hMSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSx0aGlzLl9lbWl0U2VsZWN0aW9uQ2hhbmdlRXZlbnQoKX0sdC5wcm90b3R5cGUuZm9jdXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRIb3N0RWxlbWVudCgpOyJmdW5jdGlvbiI9PXR5cGVvZiB0LmZvY3VzJiZ0LmZvY3VzKCl9LHQucHJvdG90eXBlLnNldEFjdGl2ZVN0eWxlcz1mdW5jdGlvbigpe3RoaXMuX2FjdGl2ZXx8KHRoaXMuX2FjdGl2ZT0hMCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSl9LHQucHJvdG90eXBlLnNldEluYWN0aXZlU3R5bGVzPWZ1bmN0aW9uKCl7dGhpcy5fYWN0aXZlJiYodGhpcy5fYWN0aXZlPSExLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX0sdC5wcm90b3R5cGUuZ2V0TGFiZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3VmFsdWV9LHQucHJvdG90eXBlLl9oYW5kbGVLZXlkb3duPWZ1bmN0aW9uKHQpe3Qua2V5Q29kZSE9PXUuZCYmdC5rZXlDb2RlIT09dS5qfHwodGhpcy5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKSx0LnByZXZlbnREZWZhdWx0KCkpfSx0LnByb3RvdHlwZS5fc2VsZWN0VmlhSW50ZXJhY3Rpb249ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkfHwodGhpcy5fc2VsZWN0ZWQ9IXRoaXMubXVsdGlwbGV8fCF0aGlzLl9zZWxlY3RlZCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSx0aGlzLl9lbWl0U2VsZWN0aW9uQ2hhbmdlRXZlbnQoITApKX0sdC5wcm90b3R5cGUuX2dldFRhYkluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWQ/Ii0xIjoiMCJ9LHQucHJvdG90eXBlLl9nZXRIb3N0RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnR9LHQucHJvdG90eXBlLm5nQWZ0ZXJWaWV3Q2hlY2tlZD1mdW5jdGlvbigpe2lmKHRoaXMuX3NlbGVjdGVkKXt2YXIgdD10aGlzLnZpZXdWYWx1ZTt0IT09dGhpcy5fbW9zdFJlY2VudFZpZXdWYWx1ZSYmKHRoaXMuX21vc3RSZWNlbnRWaWV3VmFsdWU9dCx0aGlzLl9zdGF0ZUNoYW5nZXMubmV4dCgpKX19LHQucHJvdG90eXBlLm5nT25EZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCl9LHQucHJvdG90eXBlLl9lbWl0U2VsZWN0aW9uQ2hhbmdlRXZlbnQ9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ITEpLHRoaXMub25TZWxlY3Rpb25DaGFuZ2UuZW1pdChuZXcgZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT0hMSksdGhpcy5zb3VyY2U9dCx0aGlzLmlzVXNlcklucHV0PWV9KHRoaXMsdCkpfSx0fSgpLFc9ZnVuY3Rpb24oKXt9fSxYbFB3OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgcj1uKCI2YmxGIik7ZnVuY3Rpb24gaSh0LGUpe3JldHVybiBuZXcgci5hKGU/ZnVuY3Rpb24obil7cmV0dXJuIGUuc2NoZWR1bGUobywwLHtlcnJvcjp0LHN1YnNjcmliZXI6bn0pfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5lcnJvcih0KX0pfWZ1bmN0aW9uIG8odCl7dC5zdWJzY3JpYmVyLmVycm9yKHQuZXJyb3IpfX0sWVNoMjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJrIixmdW5jdGlvbigpe3JldHVybiByfSksbi5kKGUsImQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSxuLmQoZSwiZSIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLG4uZChlLCJqIixmdW5jdGlvbigpe3JldHVybiBhfSksbi5kKGUsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSxuLmQoZSwiZiIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pLG4uZChlLCJnIixmdW5jdGlvbigpe3JldHVybiBsfSksbi5kKGUsImwiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSxuLmQoZSwiaSIsZnVuY3Rpb24oKXtyZXR1cm4gZn0pLG4uZChlLCJiIixmdW5jdGlvbigpe3JldHVybiBofSksbi5kKGUsIm4iLGZ1bmN0aW9uKCl7cmV0dXJuIGR9KSxuLmQoZSwiaCIsZnVuY3Rpb24oKXtyZXR1cm4gcH0pLG4uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBtfSksbi5kKGUsIm0iLGZ1bmN0aW9uKCl7cmV0dXJuIHl9KTt2YXIgcj05LGk9MTMsbz0yNyxhPTMyLHM9MzUsdT0zNixsPTM3LGM9MzgsZj0zOSxoPTQwLGQ9NDgscD01NyxtPTY1LHk9OTB9LFlsYlE6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pLG4uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBvfSksbigibXJTRyIpLG4oIjZibEYiKSxuKCJGL1hMIik7dmFyIHI9bigiSzlJYSIpLGk9bigiQ2NuRyIpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt2b2lkIDA9PT10JiYodD0hMSksdm9pZCAwPT09biYmKG49ITApO3ZhciBpPXRoaXM7dGhpcy5fbXVsdGlwbGU9dCx0aGlzLl9lbWl0Q2hhbmdlcz1uLHRoaXMuX3NlbGVjdGlvbj1uZXcgU2V0LHRoaXMuX2Rlc2VsZWN0ZWRUb0VtaXQ9W10sdGhpcy5fc2VsZWN0ZWRUb0VtaXQ9W10sdGhpcy5vbkNoYW5nZT10aGlzLl9lbWl0Q2hhbmdlcz9uZXcgci5hOm51bGwsZSYmZS5sZW5ndGgmJih0P2UuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gaS5fbWFya1NlbGVjdGVkKHQpfSk6dGhpcy5fbWFya1NlbGVjdGVkKGVbMF0pLHRoaXMuX3NlbGVjdGVkVG9FbWl0Lmxlbmd0aD0wKX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJzZWxlY3RlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWxlY3RlZHx8KHRoaXMuX3NlbGVjdGVkPUFycmF5LmZyb20odGhpcy5fc2VsZWN0aW9uLnZhbHVlcygpKSksdGhpcy5fc2VsZWN0ZWR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT1bXSxuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyllW25dPWFyZ3VtZW50c1tuXTt0aGlzLl92ZXJpZnlWYWx1ZUFzc2lnbm1lbnQoZSksZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9tYXJrU2VsZWN0ZWQoZSl9KSx0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKX0sdC5wcm90b3R5cGUuZGVzZWxlY3Q9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbl09YXJndW1lbnRzW25dO3RoaXMuX3ZlcmlmeVZhbHVlQXNzaWdubWVudChlKSxlLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIHQuX3VubWFya1NlbGVjdGVkKGUpfSksdGhpcy5fZW1pdENoYW5nZUV2ZW50KCl9LHQucHJvdG90eXBlLnRvZ2dsZT1mdW5jdGlvbih0KXt0aGlzLmlzU2VsZWN0ZWQodCk/dGhpcy5kZXNlbGVjdCh0KTp0aGlzLnNlbGVjdCh0KX0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl91bm1hcmtBbGwoKSx0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKX0sdC5wcm90b3R5cGUuaXNTZWxlY3RlZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLmhhcyh0KX0sdC5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5fc2VsZWN0aW9uLnNpemV9LHQucHJvdG90eXBlLmhhc1ZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNFbXB0eSgpfSx0LnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKHQpe3RoaXMuX211bHRpcGxlJiZ0aGlzLl9zZWxlY3RlZCYmdGhpcy5fc2VsZWN0ZWQuc29ydCh0KX0sdC5wcm90b3R5cGUuX2VtaXRDaGFuZ2VFdmVudD1mdW5jdGlvbigpe3RoaXMuX3NlbGVjdGVkPW51bGwsKHRoaXMuX3NlbGVjdGVkVG9FbWl0Lmxlbmd0aHx8dGhpcy5fZGVzZWxlY3RlZFRvRW1pdC5sZW5ndGgpJiYodGhpcy5vbkNoYW5nZSYmdGhpcy5vbkNoYW5nZS5uZXh0KHtzb3VyY2U6dGhpcyxhZGRlZDp0aGlzLl9zZWxlY3RlZFRvRW1pdCxyZW1vdmVkOnRoaXMuX2Rlc2VsZWN0ZWRUb0VtaXR9KSx0aGlzLl9kZXNlbGVjdGVkVG9FbWl0PVtdLHRoaXMuX3NlbGVjdGVkVG9FbWl0PVtdKX0sdC5wcm90b3R5cGUuX21hcmtTZWxlY3RlZD1mdW5jdGlvbih0KXt0aGlzLmlzU2VsZWN0ZWQodCl8fCh0aGlzLl9tdWx0aXBsZXx8dGhpcy5fdW5tYXJrQWxsKCksdGhpcy5fc2VsZWN0aW9uLmFkZCh0KSx0aGlzLl9lbWl0Q2hhbmdlcyYmdGhpcy5fc2VsZWN0ZWRUb0VtaXQucHVzaCh0KSl9LHQucHJvdG90eXBlLl91bm1hcmtTZWxlY3RlZD1mdW5jdGlvbih0KXt0aGlzLmlzU2VsZWN0ZWQodCkmJih0aGlzLl9zZWxlY3Rpb24uZGVsZXRlKHQpLHRoaXMuX2VtaXRDaGFuZ2VzJiZ0aGlzLl9kZXNlbGVjdGVkVG9FbWl0LnB1c2godCkpfSx0LnByb3RvdHlwZS5fdW5tYXJrQWxsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmlzRW1wdHkoKXx8dGhpcy5fc2VsZWN0aW9uLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIHQuX3VubWFya1NlbGVjdGVkKGUpfSl9LHQucHJvdG90eXBlLl92ZXJpZnlWYWx1ZUFzc2lnbm1lbnQ9ZnVuY3Rpb24odCl7aWYodC5sZW5ndGg+MSYmIXRoaXMuX211bHRpcGxlKXRocm93IEVycm9yKCJDYW5ub3QgcGFzcyBtdWx0aXBsZSB2YWx1ZXMgaW50byBTZWxlY3Rpb25Nb2RlbCB3aXRoIHNpbmdsZS12YWx1ZSBtb2RlLiIpfSx0fSgpLGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fbGlzdGVuZXJzPVtdfXJldHVybiB0LnByb3RvdHlwZS5ub3RpZnk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPXRoaXMuX2xpc3RlbmVycztuPHIubGVuZ3RoO24rKykoMCxyW25dKSh0LGUpfSx0LnByb3RvdHlwZS5saXN0ZW49ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy5fbGlzdGVuZXJzLnB1c2godCksZnVuY3Rpb24oKXtlLl9saXN0ZW5lcnM9ZS5fbGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gdCE9PWV9KX19LHQucHJvdG90eXBlLm5nT25EZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fbGlzdGVuZXJzPVtdfSx0Lm5nSW5qZWN0YWJsZURlZj1PYmplY3QoaS5SKSh7ZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiBuZXcgdH0sdG9rZW46dCxwcm92aWRlZEluOiJyb290In0pLHR9KCl9LFpZQ2k6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCJtclNHIiksaT1uKCJDY25HIiksbz1uKCIyNkZVIiksYT1uKCIwL3VRIikscz1uKCJGL1hMIiksdT1uKCJLOUlhIiksbD1uKCI2YmxGIiksYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIG49dC5jYWxsKHRoaXMsIm5vIGVsZW1lbnRzIGluIHNlcXVlbmNlIil8fHRoaXM7cmV0dXJuIG4ubmFtZT0iRW1wdHlFcnJvciIsT2JqZWN0LnNldFByb3RvdHlwZU9mKG4sZS5wcm90b3R5cGUpLG59cmV0dXJuIHIuYihlLHQpLGV9KEVycm9yKSxmPW4oIlZuRC8iKSxoPW4oInQ5ZloiKSxkPW4oIkZGT28iKTtmdW5jdGlvbiBwKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD1udWxsKSxmdW5jdGlvbihlKXtyZXR1cm4gZS5saWZ0KG5ldyBtKHQpKX19dmFyIG09ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuZGVmYXVsdFZhbHVlPXR9cmV0dXJuIHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5zdWJzY3JpYmUobmV3IHkodCx0aGlzLmRlZmF1bHRWYWx1ZSkpfSx0fSgpLHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciByPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiByLmRlZmF1bHRWYWx1ZT1uLHIuaXNFbXB0eT0hMCxyfXJldHVybiByLmIoZSx0KSxlLnByb3RvdHlwZS5fbmV4dD1mdW5jdGlvbih0KXt0aGlzLmlzRW1wdHk9ITEsdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHQpfSxlLnByb3RvdHlwZS5fY29tcGxldGU9ZnVuY3Rpb24oKXt0aGlzLmlzRW1wdHkmJnRoaXMuZGVzdGluYXRpb24ubmV4dCh0aGlzLmRlZmF1bHRWYWx1ZSksdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpfSxlfShkLmEpLGc9bigieE15RSIpLHY9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PWIpLE9iamVjdChnLmEpKHtoYXNWYWx1ZTohMSxuZXh0OmZ1bmN0aW9uKCl7dGhpcy5oYXNWYWx1ZT0hMH0sY29tcGxldGU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYXNWYWx1ZSl0aHJvdyB0KCl9fSl9O2Z1bmN0aW9uIGIoKXtyZXR1cm4gbmV3IGN9dmFyIF89bigibUNoRiIpO2Z1bmN0aW9uIHcodCxlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPj0yO3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gci5waXBlKHQ/T2JqZWN0KGYuYSkoZnVuY3Rpb24oZSxuKXtyZXR1cm4gdChlLG4scil9KTpfLmEsT2JqZWN0KGguYSkoMSksbj9wKGUpOnYoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGN9KSl9fXZhciB4PW4oInBzVzAiKSxPPW4oIjY3WS8iKSxDPW4oIlBoam4iKSxTPW4oImI3bVciKSxFPW4oIkc1SjEiKTtmdW5jdGlvbiBrKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gMD09PXQ/T2JqZWN0KEUuYikoKTplLmxpZnQobmV3IFQodCkpfX12YXIgVD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7aWYodGhpcy50b3RhbD10LHRoaXMudG90YWw8MCl0aHJvdyBuZXcgUy5hfXJldHVybiB0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuc3Vic2NyaWJlKG5ldyBJKHQsdGhpcy50b3RhbCkpfSx0fSgpLEk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciByPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiByLnRvdGFsPW4sci5yaW5nPW5ldyBBcnJheSxyLmNvdW50PTAscn1yZXR1cm4gci5iKGUsdCksZS5wcm90b3R5cGUuX25leHQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yaW5nLG49dGhpcy50b3RhbCxyPXRoaXMuY291bnQrKztlLmxlbmd0aDxuP2UucHVzaCh0KTplW3Ilbl09dH0sZS5wcm90b3R5cGUuX2NvbXBsZXRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kZXN0aW5hdGlvbixlPXRoaXMuY291bnQ7aWYoZT4wKWZvcih2YXIgbj10aGlzLmNvdW50Pj10aGlzLnRvdGFsP3RoaXMudG90YWw6dGhpcy5jb3VudCxyPXRoaXMucmluZyxpPTA7aTxuO2krKyl7dmFyIG89ZSsrJW47dC5uZXh0KHJbb10pfXQuY29tcGxldGUoKX0sZX0oZC5hKTtmdW5jdGlvbiBBKHQsZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD49MjtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHIucGlwZSh0P09iamVjdChmLmEpKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQoZSxuLHIpfSk6Xy5hLGsoMSksbj9wKGUpOnYoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGN9KSl9fWZ1bmN0aW9uIGoodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4ubGlmdChuZXcgUCh0LGUsbikpfX12YXIgUD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMucHJlZGljYXRlPXQsdGhpcy50aGlzQXJnPWUsdGhpcy5zb3VyY2U9bn1yZXR1cm4gdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbih0LGUpe3JldHVybiBlLnN1YnNjcmliZShuZXcgTSh0LHRoaXMucHJlZGljYXRlLHRoaXMudGhpc0FyZyx0aGlzLnNvdXJjZSkpfSx0fSgpLE09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scixpKXt2YXIgbz10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gby5wcmVkaWNhdGU9bixvLnRoaXNBcmc9cixvLnNvdXJjZT1pLG8uaW5kZXg9MCxvLnRoaXNBcmc9cnx8byxvfXJldHVybiByLmIoZSx0KSxlLnByb3RvdHlwZS5ub3RpZnlDb21wbGV0ZT1mdW5jdGlvbih0KXt0aGlzLmRlc3RpbmF0aW9uLm5leHQodCksdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpfSxlLnByb3RvdHlwZS5fbmV4dD1mdW5jdGlvbih0KXt2YXIgZT0hMTt0cnl7ZT10aGlzLnByZWRpY2F0ZS5jYWxsKHRoaXMudGhpc0FyZyx0LHRoaXMuaW5kZXgrKyx0aGlzLnNvdXJjZSl9Y2F0Y2godCl7cmV0dXJuIHZvaWQgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcih0KX1lfHx0aGlzLm5vdGlmeUNvbXBsZXRlKCExKX0sZS5wcm90b3R5cGUuX2NvbXBsZXRlPWZ1bmN0aW9uKCl7dGhpcy5ub3RpZnlDb21wbGV0ZSghMCl9LGV9KGQuYSksTj1uKCI5WjFGIiksUj1uKCJUeGpnIiksRD1uKCJabjhEIik7ZnVuY3Rpb24gTCh0LGUpe3ZhciBuPSExO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPj0yJiYobj0hMCksZnVuY3Rpb24ocil7cmV0dXJuIHIubGlmdChuZXcgRih0LGUsbikpfX12YXIgRj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3ZvaWQgMD09PW4mJihuPSExKSx0aGlzLmFjY3VtdWxhdG9yPXQsdGhpcy5zZWVkPWUsdGhpcy5oYXNTZWVkPW59cmV0dXJuIHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5zdWJzY3JpYmUobmV3IFYodCx0aGlzLmFjY3VtdWxhdG9yLHRoaXMuc2VlZCx0aGlzLmhhc1NlZWQpKX0sdH0oKSxWPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIsaSl7dmFyIG89dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIG8uYWNjdW11bGF0b3I9bixvLl9zZWVkPXIsby5oYXNTZWVkPWksby5pbmRleD0wLG99cmV0dXJuIHIuYihlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwic2VlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWVkfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5oYXNTZWVkPSEwLHRoaXMuX3NlZWQ9dH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5fbmV4dD1mdW5jdGlvbih0KXtpZih0aGlzLmhhc1NlZWQpcmV0dXJuIHRoaXMuX3RyeU5leHQodCk7dGhpcy5zZWVkPXQsdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHQpfSxlLnByb3RvdHlwZS5fdHJ5TmV4dD1mdW5jdGlvbih0KXt2YXIgZSxuPXRoaXMuaW5kZXgrKzt0cnl7ZT10aGlzLmFjY3VtdWxhdG9yKHRoaXMuc2VlZCx0LG4pfWNhdGNoKHQpe3RoaXMuZGVzdGluYXRpb24uZXJyb3IodCl9dGhpcy5zZWVkPWUsdGhpcy5kZXN0aW5hdGlvbi5uZXh0KGUpfSxlfShkLmEpLFU9bigieTNCeSIpLHo9bigiSXAwUiIpLEI9bigiWllqdCIpO24uZChlLCJzIixmdW5jdGlvbigpe3JldHVybiBhbn0pLG4uZChlLCJ5IixmdW5jdGlvbigpe3JldHVybiBtbn0pLG4uZChlLCJ6IixmdW5jdGlvbigpe3JldHVybiB5bn0pLG4uZChlLCJBIixmdW5jdGlvbigpe3JldHVybiBnbn0pLG4uZChlLCJ2IixmdW5jdGlvbigpe3JldHVybiBmbn0pLG4uZChlLCJ1IixmdW5jdGlvbigpe3JldHVybiBjbn0pLG4uZChlLCJ4IixmdW5jdGlvbigpe3JldHVybiBwbn0pLG4uZChlLCJ0IixmdW5jdGlvbigpe3JldHVybiB1bn0pLG4uZChlLCJ3IixmdW5jdGlvbigpe3JldHVybiBkbn0pLG4uZChlLCJsIixmdW5jdGlvbigpe3JldHVybiBRZX0pLG4uZChlLCJuIixmdW5jdGlvbigpe3JldHVybiAkZX0pLG4uZChlLCJqIixmdW5jdGlvbigpe3JldHVybiBEZX0pLG4uZChlLCJrIixmdW5jdGlvbigpe3JldHVybiBxZX0pLG4uZChlLCJpIixmdW5jdGlvbigpe3JldHVybiBGZX0pLG4uZChlLCJnIixmdW5jdGlvbigpe3JldHVybiBvbn0pLG4uZChlLCJoIixmdW5jdGlvbigpe3JldHVybiB2bn0pLG4uZChlLCJtIixmdW5jdGlvbigpe3JldHVybiBsbn0pLG4uZChlLCJiIixmdW5jdGlvbigpe3JldHVybiBYZX0pLG4uZChlLCJkIixmdW5jdGlvbigpe3JldHVybiBubn0pLG4uZChlLCJlIixmdW5jdGlvbigpe3JldHVybiBlbn0pLG4uZChlLCJmIixmdW5jdGlvbigpe3JldHVybiB0bn0pLG4uZChlLCJvIixmdW5jdGlvbigpe3JldHVybiBybn0pLG4uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBvZX0pLG4uZChlLCJwIixmdW5jdGlvbigpe3JldHVybiBVZX0pLG4uZChlLCJjIixmdW5jdGlvbigpe3JldHVybiBUdH0pLG4uZChlLCJxIixmdW5jdGlvbigpe3JldHVybiBrdH0pLG4uZChlLCJyIixmdW5jdGlvbigpe3JldHVybiBvdH0pO3ZhciBIPWZ1bmN0aW9uKHQsZSl7dGhpcy5pZD10LHRoaXMudXJsPWV9LFc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scixpKXt2b2lkIDA9PT1yJiYocj0iaW1wZXJhdGl2ZSIpLHZvaWQgMD09PWkmJihpPW51bGwpO3ZhciBvPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIG8ubmF2aWdhdGlvblRyaWdnZXI9cixvLnJlc3RvcmVkU3RhdGU9aSxvfXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIk5hdmlnYXRpb25TdGFydChpZDogIit0aGlzLmlkKyIsIHVybDogJyIrdGhpcy51cmwrIicpIn0sZX0oSCkscT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt2YXIgaT10LmNhbGwodGhpcyxlLG4pfHx0aGlzO3JldHVybiBpLnVybEFmdGVyUmVkaXJlY3RzPXIsaX1yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJOYXZpZ2F0aW9uRW5kKGlkOiAiK3RoaXMuaWQrIiwgdXJsOiAnIit0aGlzLnVybCsiJywgdXJsQWZ0ZXJSZWRpcmVjdHM6ICciK3RoaXMudXJsQWZ0ZXJSZWRpcmVjdHMrIicpIn0sZX0oSCksWT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt2YXIgaT10LmNhbGwodGhpcyxlLG4pfHx0aGlzO3JldHVybiBpLnJlYXNvbj1yLGl9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iTmF2aWdhdGlvbkNhbmNlbChpZDogIit0aGlzLmlkKyIsIHVybDogJyIrdGhpcy51cmwrIicpIn0sZX0oSCksRz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXt2YXIgaT10LmNhbGwodGhpcyxlLG4pfHx0aGlzO3JldHVybiBpLmVycm9yPXIsaX1yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJOYXZpZ2F0aW9uRXJyb3IoaWQ6ICIrdGhpcy5pZCsiLCB1cmw6ICciK3RoaXMudXJsKyInLCBlcnJvcjogIit0aGlzLmVycm9yKyIpIn0sZX0oSCksUT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyLGkpe3ZhciBvPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIG8udXJsQWZ0ZXJSZWRpcmVjdHM9cixvLnN0YXRlPWksb31yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJSb3V0ZXNSZWNvZ25pemVkKGlkOiAiK3RoaXMuaWQrIiwgdXJsOiAnIit0aGlzLnVybCsiJywgdXJsQWZ0ZXJSZWRpcmVjdHM6ICciK3RoaXMudXJsQWZ0ZXJSZWRpcmVjdHMrIicsIHN0YXRlOiAiK3RoaXMuc3RhdGUrIikifSxlfShIKSxLPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIsaSl7dmFyIG89dC5jYWxsKHRoaXMsZSxuKXx8dGhpcztyZXR1cm4gby51cmxBZnRlclJlZGlyZWN0cz1yLG8uc3RhdGU9aSxvfXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkd1YXJkc0NoZWNrU3RhcnQoaWQ6ICIrdGhpcy5pZCsiLCB1cmw6ICciK3RoaXMudXJsKyInLCB1cmxBZnRlclJlZGlyZWN0czogJyIrdGhpcy51cmxBZnRlclJlZGlyZWN0cysiJywgc3RhdGU6ICIrdGhpcy5zdGF0ZSsiKSJ9LGV9KEgpLFo9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scixpLG8pe3ZhciBhPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIGEudXJsQWZ0ZXJSZWRpcmVjdHM9cixhLnN0YXRlPWksYS5zaG91bGRBY3RpdmF0ZT1vLGF9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iR3VhcmRzQ2hlY2tFbmQoaWQ6ICIrdGhpcy5pZCsiLCB1cmw6ICciK3RoaXMudXJsKyInLCB1cmxBZnRlclJlZGlyZWN0czogJyIrdGhpcy51cmxBZnRlclJlZGlyZWN0cysiJywgc3RhdGU6ICIrdGhpcy5zdGF0ZSsiLCBzaG91bGRBY3RpdmF0ZTogIit0aGlzLnNob3VsZEFjdGl2YXRlKyIpIn0sZX0oSCksWD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyLGkpe3ZhciBvPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIG8udXJsQWZ0ZXJSZWRpcmVjdHM9cixvLnN0YXRlPWksb31yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJSZXNvbHZlU3RhcnQoaWQ6ICIrdGhpcy5pZCsiLCB1cmw6ICciK3RoaXMudXJsKyInLCB1cmxBZnRlclJlZGlyZWN0czogJyIrdGhpcy51cmxBZnRlclJlZGlyZWN0cysiJywgc3RhdGU6ICIrdGhpcy5zdGF0ZSsiKSJ9LGV9KEgpLCQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scixpKXt2YXIgbz10LmNhbGwodGhpcyxlLG4pfHx0aGlzO3JldHVybiBvLnVybEFmdGVyUmVkaXJlY3RzPXIsby5zdGF0ZT1pLG99cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iUmVzb2x2ZUVuZChpZDogIit0aGlzLmlkKyIsIHVybDogJyIrdGhpcy51cmwrIicsIHVybEFmdGVyUmVkaXJlY3RzOiAnIit0aGlzLnVybEFmdGVyUmVkaXJlY3RzKyInLCBzdGF0ZTogIit0aGlzLnN0YXRlKyIpIn0sZX0oSCksSj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5yb3V0ZT10fXJldHVybiB0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJSb3V0ZUNvbmZpZ0xvYWRTdGFydChwYXRoOiAiK3RoaXMucm91dGUucGF0aCsiKSJ9LHR9KCksdHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMucm91dGU9dH1yZXR1cm4gdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iUm91dGVDb25maWdMb2FkRW5kKHBhdGg6ICIrdGhpcy5yb3V0ZS5wYXRoKyIpIn0sdH0oKSxldD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5zbmFwc2hvdD10fXJldHVybiB0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDaGlsZEFjdGl2YXRpb25TdGFydChwYXRoOiAnIisodGhpcy5zbmFwc2hvdC5yb3V0ZUNvbmZpZyYmdGhpcy5zbmFwc2hvdC5yb3V0ZUNvbmZpZy5wYXRofHwiIikrIicpIn0sdH0oKSxudD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5zbmFwc2hvdD10fXJldHVybiB0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDaGlsZEFjdGl2YXRpb25FbmQocGF0aDogJyIrKHRoaXMuc25hcHNob3Qucm91dGVDb25maWcmJnRoaXMuc25hcHNob3Qucm91dGVDb25maWcucGF0aHx8IiIpKyInKSJ9LHR9KCkscnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuc25hcHNob3Q9dH1yZXR1cm4gdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQWN0aXZhdGlvblN0YXJ0KHBhdGg6ICciKyh0aGlzLnNuYXBzaG90LnJvdXRlQ29uZmlnJiZ0aGlzLnNuYXBzaG90LnJvdXRlQ29uZmlnLnBhdGh8fCIiKSsiJykifSx0fSgpLGl0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLnNuYXBzaG90PXR9cmV0dXJuIHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkFjdGl2YXRpb25FbmQocGF0aDogJyIrKHRoaXMuc25hcHNob3Qucm91dGVDb25maWcmJnRoaXMuc25hcHNob3Qucm91dGVDb25maWcucGF0aHx8IiIpKyInKSJ9LHR9KCksb3Q9ZnVuY3Rpb24oKXt9LGF0PSJwcmltYXJ5IixzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5wYXJhbXM9dHx8e319cmV0dXJuIHQucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wYXJhbXMuaGFzT3duUHJvcGVydHkodCl9LHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtpZih0aGlzLmhhcyh0KSl7dmFyIGU9dGhpcy5wYXJhbXNbdF07cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZVswXTplfXJldHVybiBudWxsfSx0LnByb3RvdHlwZS5nZXRBbGw9ZnVuY3Rpb24odCl7aWYodGhpcy5oYXModCkpe3ZhciBlPXRoaXMucGFyYW1zW3RdO3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6W2VdfXJldHVybltdfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImtleXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHR9KCk7ZnVuY3Rpb24gdXQodCl7cmV0dXJuIG5ldyBzdCh0KX1mdW5jdGlvbiBsdCh0LGUsbil7dmFyIHI9bi5wYXRoLnNwbGl0KCIvIik7aWYoci5sZW5ndGg+dC5sZW5ndGgpcmV0dXJuIG51bGw7aWYoImZ1bGwiPT09bi5wYXRoTWF0Y2gmJihlLmhhc0NoaWxkcmVuKCl8fHIubGVuZ3RoPHQubGVuZ3RoKSlyZXR1cm4gbnVsbDtmb3IodmFyIGk9e30sbz0wO288ci5sZW5ndGg7bysrKXt2YXIgYT1yW29dLHM9dFtvXTtpZihhLnN0YXJ0c1dpdGgoIjoiKSlpW2Euc3Vic3RyaW5nKDEpXT1zO2Vsc2UgaWYoYSE9PXMucGF0aClyZXR1cm4gbnVsbH1yZXR1cm57Y29uc3VtZWQ6dC5zbGljZSgwLHIubGVuZ3RoKSxwb3NQYXJhbXM6aX19dmFyIGN0PWZ1bmN0aW9uKHQsZSl7dGhpcy5yb3V0ZXM9dCx0aGlzLm1vZHVsZT1lfTtmdW5jdGlvbiBmdCh0LGUpe3ZvaWQgMD09PWUmJihlPSIiKTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtodChyLGR0KGUscikpfX1mdW5jdGlvbiBodCh0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiXG4gICAgICBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJyIrZSsiJzogRW5jb3VudGVyZWQgdW5kZWZpbmVkIHJvdXRlLlxuICAgICAgVGhlIHJlYXNvbiBtaWdodCBiZSBhbiBleHRyYSBjb21tYS5cblxuICAgICAgRXhhbXBsZTpcbiAgICAgIGNvbnN0IHJvdXRlczogUm91dGVzID0gW1xuICAgICAgICB7IHBhdGg6ICcnLCByZWRpcmVjdFRvOiAnL2Rhc2hib2FyZCcsIHBhdGhNYXRjaDogJ2Z1bGwnIH0sXG4gICAgICAgIHsgcGF0aDogJ2Rhc2hib2FyZCcsICBjb21wb25lbnQ6IERhc2hib2FyZENvbXBvbmVudCB9LCwgPDwgdHdvIGNvbW1hc1xuICAgICAgICB7IHBhdGg6ICdkZXRhaWwvOmlkJywgY29tcG9uZW50OiBIZXJvRGV0YWlsQ29tcG9uZW50IH1cbiAgICAgIF07XG4gICAgIik7aWYoQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29uZmlndXJhdGlvbiBvZiByb3V0ZSAnIitlKyInOiBBcnJheSBjYW5ub3QgYmUgc3BlY2lmaWVkIik7aWYoIXQuY29tcG9uZW50JiYhdC5jaGlsZHJlbiYmIXQubG9hZENoaWxkcmVuJiZ0Lm91dGxldCYmdC5vdXRsZXQhPT1hdCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29uZmlndXJhdGlvbiBvZiByb3V0ZSAnIitlKyInOiBhIGNvbXBvbmVudGxlc3Mgcm91dGUgd2l0aG91dCBjaGlsZHJlbiBvciBsb2FkQ2hpbGRyZW4gY2Fubm90IGhhdmUgYSBuYW1lZCBvdXRsZXQgc2V0Iik7aWYodC5yZWRpcmVjdFRvJiZ0LmNoaWxkcmVuKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb25maWd1cmF0aW9uIG9mIHJvdXRlICciK2UrIic6IHJlZGlyZWN0VG8gYW5kIGNoaWxkcmVuIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyIik7aWYodC5yZWRpcmVjdFRvJiZ0LmxvYWRDaGlsZHJlbil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29uZmlndXJhdGlvbiBvZiByb3V0ZSAnIitlKyInOiByZWRpcmVjdFRvIGFuZCBsb2FkQ2hpbGRyZW4gY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIiKTtpZih0LmNoaWxkcmVuJiZ0LmxvYWRDaGlsZHJlbil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29uZmlndXJhdGlvbiBvZiByb3V0ZSAnIitlKyInOiBjaGlsZHJlbiBhbmQgbG9hZENoaWxkcmVuIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyIik7aWYodC5yZWRpcmVjdFRvJiZ0LmNvbXBvbmVudCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29uZmlndXJhdGlvbiBvZiByb3V0ZSAnIitlKyInOiByZWRpcmVjdFRvIGFuZCBjb21wb25lbnQgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIiKTtpZih0LnBhdGgmJnQubWF0Y2hlcil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29uZmlndXJhdGlvbiBvZiByb3V0ZSAnIitlKyInOiBwYXRoIGFuZCBtYXRjaGVyIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyIik7aWYodm9pZCAwPT09dC5yZWRpcmVjdFRvJiYhdC5jb21wb25lbnQmJiF0LmNoaWxkcmVuJiYhdC5sb2FkQ2hpbGRyZW4pdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJyIrZSsiJy4gT25lIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSBwcm92aWRlZDogY29tcG9uZW50LCByZWRpcmVjdFRvLCBjaGlsZHJlbiBvciBsb2FkQ2hpbGRyZW4iKTtpZih2b2lkIDA9PT10LnBhdGgmJnZvaWQgMD09PXQubWF0Y2hlcil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29uZmlndXJhdGlvbiBvZiByb3V0ZSAnIitlKyInOiByb3V0ZXMgbXVzdCBoYXZlIGVpdGhlciBhIHBhdGggb3IgYSBtYXRjaGVyIHNwZWNpZmllZCIpO2lmKCJzdHJpbmciPT10eXBlb2YgdC5wYXRoJiYiLyI9PT10LnBhdGguY2hhckF0KDApKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb25maWd1cmF0aW9uIG9mIHJvdXRlICciK2UrIic6IHBhdGggY2Fubm90IHN0YXJ0IHdpdGggYSBzbGFzaCIpO2lmKCIiPT09dC5wYXRoJiZ2b2lkIDAhPT10LnJlZGlyZWN0VG8mJnZvaWQgMD09PXQucGF0aE1hdGNoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb25maWd1cmF0aW9uIG9mIHJvdXRlICd7cGF0aDogXCIiK2UrJyIsIHJlZGlyZWN0VG86ICInK3QucmVkaXJlY3RUbysiXCJ9JzogcGxlYXNlIHByb3ZpZGUgJ3BhdGhNYXRjaCcuIFRoZSBkZWZhdWx0IHZhbHVlIG9mICdwYXRoTWF0Y2gnIGlzICdwcmVmaXgnLCBidXQgb2Z0ZW4gdGhlIGludGVudCBpcyB0byB1c2UgJ2Z1bGwnLiIpO2lmKHZvaWQgMCE9PXQucGF0aE1hdGNoJiYiZnVsbCIhPT10LnBhdGhNYXRjaCYmInByZWZpeCIhPT10LnBhdGhNYXRjaCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29uZmlndXJhdGlvbiBvZiByb3V0ZSAnIitlKyInOiBwYXRoTWF0Y2ggY2FuIG9ubHkgYmUgc2V0IHRvICdwcmVmaXgnIG9yICdmdWxsJyIpO3QuY2hpbGRyZW4mJmZ0KHQuY2hpbGRyZW4sZSl9ZnVuY3Rpb24gZHQodCxlKXtyZXR1cm4gZT90fHxlLnBhdGg/dCYmIWUucGF0aD90KyIvIjohdCYmZS5wYXRoP2UucGF0aDp0KyIvIitlLnBhdGg6IiI6dH1mdW5jdGlvbiBwdCh0KXt2YXIgZT10LmNoaWxkcmVuJiZ0LmNoaWxkcmVuLm1hcChwdCksbj1lP09iamVjdChyLmEpKHt9LHQse2NoaWxkcmVuOmV9KTpPYmplY3Qoci5hKSh7fSx0KTtyZXR1cm4hbi5jb21wb25lbnQmJihlfHxuLmxvYWRDaGlsZHJlbikmJm4ub3V0bGV0JiZuLm91dGxldCE9PWF0JiYobi5jb21wb25lbnQ9b3QpLG59ZnVuY3Rpb24gbXQodCxlKXt2YXIgbixyPU9iamVjdC5rZXlzKHQpLGk9T2JqZWN0LmtleXMoZSk7aWYoci5sZW5ndGghPWkubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKWlmKHRbbj1yW29dXSE9PWVbbl0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24geXQodCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sdCl9ZnVuY3Rpb24gZ3QodCl7cmV0dXJuIHQubGVuZ3RoPjA/dFt0Lmxlbmd0aC0xXTpudWxsfWZ1bmN0aW9uIHZ0KHQsZSl7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmZSh0W25dLG4pfWZ1bmN0aW9uIGJ0KHQpe3JldHVybiB0LnBpcGUoT2JqZWN0KEQuYSkoKSxqKGZ1bmN0aW9uKHQpe3JldHVybiEwPT09dH0pKX1mdW5jdGlvbiBfdCh0KXtyZXR1cm4gT2JqZWN0KGkuU2EpKHQpP3Q6T2JqZWN0KGkuVGEpKHQpP09iamVjdChhLmEpKFByb21pc2UucmVzb2x2ZSh0KSk6T2JqZWN0KHMuYSkodCl9ZnVuY3Rpb24gd3QodCxlLG4pe3JldHVybiBuP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIG10KHQsZSl9KHQucXVlcnlQYXJhbXMsZS5xdWVyeVBhcmFtcykmJmZ1bmN0aW9uIHQoZSxuKXtpZighU3QoZS5zZWdtZW50cyxuLnNlZ21lbnRzKSlyZXR1cm4hMTtpZihlLm51bWJlck9mQ2hpbGRyZW4hPT1uLm51bWJlck9mQ2hpbGRyZW4pcmV0dXJuITE7Zm9yKHZhciByIGluIG4uY2hpbGRyZW4pe2lmKCFlLmNoaWxkcmVuW3JdKXJldHVybiExO2lmKCF0KGUuY2hpbGRyZW5bcl0sbi5jaGlsZHJlbltyXSkpcmV0dXJuITF9cmV0dXJuITB9KHQucm9vdCxlLnJvb3QpOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmxlbmd0aDw9T2JqZWN0LmtleXModCkubGVuZ3RoJiZPYmplY3Qua2V5cyhlKS5ldmVyeShmdW5jdGlvbihuKXtyZXR1cm4gZVtuXT09PXRbbl19KX0odC5xdWVyeVBhcmFtcyxlLnF1ZXJ5UGFyYW1zKSYmZnVuY3Rpb24gdChlLG4pe3JldHVybiBmdW5jdGlvbiBlKG4scixpKXtpZihuLnNlZ21lbnRzLmxlbmd0aD5pLmxlbmd0aClyZXR1cm4hIVN0KGE9bi5zZWdtZW50cy5zbGljZSgwLGkubGVuZ3RoKSxpKSYmIXIuaGFzQ2hpbGRyZW4oKTtpZihuLnNlZ21lbnRzLmxlbmd0aD09PWkubGVuZ3RoKXtpZighU3Qobi5zZWdtZW50cyxpKSlyZXR1cm4hMTtmb3IodmFyIG8gaW4gci5jaGlsZHJlbil7aWYoIW4uY2hpbGRyZW5bb10pcmV0dXJuITE7aWYoIXQobi5jaGlsZHJlbltvXSxyLmNoaWxkcmVuW29dKSlyZXR1cm4hMX1yZXR1cm4hMH12YXIgYT1pLnNsaWNlKDAsbi5zZWdtZW50cy5sZW5ndGgpLHM9aS5zbGljZShuLnNlZ21lbnRzLmxlbmd0aCk7cmV0dXJuISFTdChuLnNlZ21lbnRzLGEpJiYhIW4uY2hpbGRyZW5bYXRdJiZlKG4uY2hpbGRyZW5bYXRdLHIscyl9KGUsbixuLnNlZ21lbnRzKX0odC5yb290LGUucm9vdCl9dmFyIHh0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5yb290PXQsdGhpcy5xdWVyeVBhcmFtcz1lLHRoaXMuZnJhZ21lbnQ9bn1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJxdWVyeVBhcmFtTWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3F1ZXJ5UGFyYW1NYXB8fCh0aGlzLl9xdWVyeVBhcmFtTWFwPXV0KHRoaXMucXVlcnlQYXJhbXMpKSx0aGlzLl9xdWVyeVBhcmFtTWFwfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIEl0LnNlcmlhbGl6ZSh0aGlzKX0sdH0oKSxPdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt2YXIgbj10aGlzO3RoaXMuc2VnbWVudHM9dCx0aGlzLmNoaWxkcmVuPWUsdGhpcy5wYXJlbnQ9bnVsbCx2dChlLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucGFyZW50PW59KX1yZXR1cm4gdC5wcm90b3R5cGUuaGFzQ2hpbGRyZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5udW1iZXJPZkNoaWxkcmVuPjB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibnVtYmVyT2ZDaGlsZHJlbiIse2dldDpmdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLmNoaWxkcmVuKS5sZW5ndGh9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gQXQodGhpcyl9LHR9KCksQ3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5wYXRoPXQsdGhpcy5wYXJhbWV0ZXJzPWV9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicGFyYW1ldGVyTWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcmFtZXRlck1hcHx8KHRoaXMuX3BhcmFtZXRlck1hcD11dCh0aGlzLnBhcmFtZXRlcnMpKSx0aGlzLl9wYXJhbWV0ZXJNYXB9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gRHQodGhpcyl9LHR9KCk7ZnVuY3Rpb24gU3QodCxlKXtyZXR1cm4gdC5sZW5ndGg9PT1lLmxlbmd0aCYmdC5ldmVyeShmdW5jdGlvbih0LG4pe3JldHVybiB0LnBhdGg9PT1lW25dLnBhdGh9KX1mdW5jdGlvbiBFdCh0LGUpe3ZhciBuPVtdO3JldHVybiB2dCh0LmNoaWxkcmVuLGZ1bmN0aW9uKHQscil7cj09PWF0JiYobj1uLmNvbmNhdChlKHQscikpKX0pLHZ0KHQuY2hpbGRyZW4sZnVuY3Rpb24odCxyKXtyIT09YXQmJihuPW4uY29uY2F0KGUodCxyKSkpfSksbn12YXIga3Q9ZnVuY3Rpb24oKXt9LFR0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHp0KHQpO3JldHVybiBuZXcgeHQoZS5wYXJzZVJvb3RTZWdtZW50KCksZS5wYXJzZVF1ZXJ5UGFyYW1zKCksZS5wYXJzZUZyYWdtZW50KCkpfSx0LnByb3RvdHlwZS5zZXJpYWxpemU9ZnVuY3Rpb24odCl7dmFyIGUsbjtyZXR1cm4iLyIrZnVuY3Rpb24gdChlLG4pe2lmKCFlLmhhc0NoaWxkcmVuKCkpcmV0dXJuIEF0KGUpO2lmKG4pe3ZhciByPWUuY2hpbGRyZW5bYXRdP3QoZS5jaGlsZHJlblthdF0sITEpOiIiLGk9W107cmV0dXJuIHZ0KGUuY2hpbGRyZW4sZnVuY3Rpb24oZSxuKXtuIT09YXQmJmkucHVzaChuKyI6Iit0KGUsITEpKX0pLGkubGVuZ3RoPjA/cisiKCIraS5qb2luKCIvLyIpKyIpIjpyfXZhciBvPUV0KGUsZnVuY3Rpb24obixyKXtyZXR1cm4gcj09PWF0P1t0KGUuY2hpbGRyZW5bYXRdLCExKV06W3IrIjoiK3QobiwhMSldfSk7cmV0dXJuIEF0KGUpKyIvKCIrby5qb2luKCIvLyIpKyIpIn0odC5yb290LCEwKSsoZT10LnF1ZXJ5UGFyYW1zLChuPU9iamVjdC5rZXlzKGUpLm1hcChmdW5jdGlvbih0KXt2YXIgbj1lW3RdO3JldHVybiBBcnJheS5pc0FycmF5KG4pP24ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBQdCh0KSsiPSIrUHQoZSl9KS5qb2luKCImIik6UHQodCkrIj0iK1B0KG4pfSkpLmxlbmd0aD8iPyIrbi5qb2luKCImIik6IiIpKygic3RyaW5nIj09dHlwZW9mIHQuZnJhZ21lbnQ/IiMiK2VuY29kZVVSSSh0LmZyYWdtZW50KToiIil9LHR9KCksSXQ9bmV3IFR0O2Z1bmN0aW9uIEF0KHQpe3JldHVybiB0LnNlZ21lbnRzLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gRHQodCl9KS5qb2luKCIvIil9ZnVuY3Rpb24ganQodCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh0KS5yZXBsYWNlKC8lNDAvZywiQCIpLnJlcGxhY2UoLyUzQS9naSwiOiIpLnJlcGxhY2UoLyUyNC9nLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIil9ZnVuY3Rpb24gUHQodCl7cmV0dXJuIGp0KHQpLnJlcGxhY2UoLyUzQi9naSwiOyIpfWZ1bmN0aW9uIE10KHQpe3JldHVybiBqdCh0KS5yZXBsYWNlKC9cKC9nLCIlMjgiKS5yZXBsYWNlKC9cKS9nLCIlMjkiKS5yZXBsYWNlKC8lMjYvZ2ksIiYiKX1mdW5jdGlvbiBOdCh0KXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHQpfWZ1bmN0aW9uIFJ0KHQpe3JldHVybiBOdCh0LnJlcGxhY2UoL1wrL2csIiUyMCIpKX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4iIitNdCh0LnBhdGgpKyhlPXQucGFyYW1ldGVycyxPYmplY3Qua2V5cyhlKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIjsiK010KHQpKyI9IitNdChlW3RdKX0pLmpvaW4oIiIpKTt2YXIgZX12YXIgTHQ9L15bXlwvKCk/Oz0jXSsvO2Z1bmN0aW9uIEZ0KHQpe3ZhciBlPXQubWF0Y2goTHQpO3JldHVybiBlP2VbMF06IiJ9dmFyIFZ0PS9eW149PyYjXSsvLFV0PS9eW14/JiNdKy8senQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMudXJsPXQsdGhpcy5yZW1haW5pbmc9dH1yZXR1cm4gdC5wcm90b3R5cGUucGFyc2VSb290U2VnbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN1bWVPcHRpb25hbCgiLyIpLCIiPT09dGhpcy5yZW1haW5pbmd8fHRoaXMucGVla1N0YXJ0c1dpdGgoIj8iKXx8dGhpcy5wZWVrU3RhcnRzV2l0aCgiIyIpP25ldyBPdChbXSx7fSk6bmV3IE90KFtdLHRoaXMucGFyc2VDaGlsZHJlbigpKX0sdC5wcm90b3R5cGUucGFyc2VRdWVyeVBhcmFtcz1mdW5jdGlvbigpe3ZhciB0PXt9O2lmKHRoaXMuY29uc3VtZU9wdGlvbmFsKCI/IikpZG97dGhpcy5wYXJzZVF1ZXJ5UGFyYW0odCl9d2hpbGUodGhpcy5jb25zdW1lT3B0aW9uYWwoIiYiKSk7cmV0dXJuIHR9LHQucHJvdG90eXBlLnBhcnNlRnJhZ21lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdW1lT3B0aW9uYWwoIiMiKT9kZWNvZGVVUklDb21wb25lbnQodGhpcy5yZW1haW5pbmcpOm51bGx9LHQucHJvdG90eXBlLnBhcnNlQ2hpbGRyZW49ZnVuY3Rpb24oKXtpZigiIj09PXRoaXMucmVtYWluaW5nKXJldHVybnt9O3RoaXMuY29uc3VtZU9wdGlvbmFsKCIvIik7dmFyIHQ9W107Zm9yKHRoaXMucGVla1N0YXJ0c1dpdGgoIigiKXx8dC5wdXNoKHRoaXMucGFyc2VTZWdtZW50KCkpO3RoaXMucGVla1N0YXJ0c1dpdGgoIi8iKSYmIXRoaXMucGVla1N0YXJ0c1dpdGgoIi8vIikmJiF0aGlzLnBlZWtTdGFydHNXaXRoKCIvKCIpOyl0aGlzLmNhcHR1cmUoIi8iKSx0LnB1c2godGhpcy5wYXJzZVNlZ21lbnQoKSk7dmFyIGU9e307dGhpcy5wZWVrU3RhcnRzV2l0aCgiLygiKSYmKHRoaXMuY2FwdHVyZSgiLyIpLGU9dGhpcy5wYXJzZVBhcmVucyghMCkpO3ZhciBuPXt9O3JldHVybiB0aGlzLnBlZWtTdGFydHNXaXRoKCIoIikmJihuPXRoaXMucGFyc2VQYXJlbnMoITEpKSwodC5sZW5ndGg+MHx8T2JqZWN0LmtleXMoZSkubGVuZ3RoPjApJiYoblthdF09bmV3IE90KHQsZSkpLG59LHQucHJvdG90eXBlLnBhcnNlU2VnbWVudD1mdW5jdGlvbigpe3ZhciB0PUZ0KHRoaXMucmVtYWluaW5nKTtpZigiIj09PXQmJnRoaXMucGVla1N0YXJ0c1dpdGgoIjsiKSl0aHJvdyBuZXcgRXJyb3IoIkVtcHR5IHBhdGggdXJsIHNlZ21lbnQgY2Fubm90IGhhdmUgcGFyYW1ldGVyczogJyIrdGhpcy5yZW1haW5pbmcrIicuIik7cmV0dXJuIHRoaXMuY2FwdHVyZSh0KSxuZXcgQ3QoTnQodCksdGhpcy5wYXJzZU1hdHJpeFBhcmFtcygpKX0sdC5wcm90b3R5cGUucGFyc2VNYXRyaXhQYXJhbXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9e307dGhpcy5jb25zdW1lT3B0aW9uYWwoIjsiKTspdGhpcy5wYXJzZVBhcmFtKHQpO3JldHVybiB0fSx0LnByb3RvdHlwZS5wYXJzZVBhcmFtPWZ1bmN0aW9uKHQpe3ZhciBlPUZ0KHRoaXMucmVtYWluaW5nKTtpZihlKXt0aGlzLmNhcHR1cmUoZSk7dmFyIG49IiI7aWYodGhpcy5jb25zdW1lT3B0aW9uYWwoIj0iKSl7dmFyIHI9RnQodGhpcy5yZW1haW5pbmcpO3ImJnRoaXMuY2FwdHVyZShuPXIpfXRbTnQoZSldPU50KG4pfX0sdC5wcm90b3R5cGUucGFyc2VRdWVyeVBhcmFtPWZ1bmN0aW9uKHQpe3ZhciBlLG49KGU9dGhpcy5yZW1haW5pbmcubWF0Y2goVnQpKT9lWzBdOiIiO2lmKG4pe3RoaXMuY2FwdHVyZShuKTt2YXIgcj0iIjtpZih0aGlzLmNvbnN1bWVPcHRpb25hbCgiPSIpKXt2YXIgaT1mdW5jdGlvbih0KXt2YXIgZT10Lm1hdGNoKFV0KTtyZXR1cm4gZT9lWzBdOiIifSh0aGlzLnJlbWFpbmluZyk7aSYmdGhpcy5jYXB0dXJlKHI9aSl9dmFyIG89UnQobiksYT1SdChyKTtpZih0Lmhhc093blByb3BlcnR5KG8pKXt2YXIgcz10W29dO0FycmF5LmlzQXJyYXkocyl8fCh0W29dPXM9W3NdKSxzLnB1c2goYSl9ZWxzZSB0W29dPWF9fSx0LnByb3RvdHlwZS5wYXJzZVBhcmVucz1mdW5jdGlvbih0KXt2YXIgZT17fTtmb3IodGhpcy5jYXB0dXJlKCIoIik7IXRoaXMuY29uc3VtZU9wdGlvbmFsKCIpIikmJnRoaXMucmVtYWluaW5nLmxlbmd0aD4wOyl7dmFyIG49RnQodGhpcy5yZW1haW5pbmcpLHI9dGhpcy5yZW1haW5pbmdbbi5sZW5ndGhdO2lmKCIvIiE9PXImJiIpIiE9PXImJiI7IiE9PXIpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGFyc2UgdXJsICciK3RoaXMudXJsKyInIik7dmFyIGk9dm9pZCAwO24uaW5kZXhPZigiOiIpPi0xPyhpPW4uc3Vic3RyKDAsbi5pbmRleE9mKCI6IikpLHRoaXMuY2FwdHVyZShpKSx0aGlzLmNhcHR1cmUoIjoiKSk6dCYmKGk9YXQpO3ZhciBvPXRoaXMucGFyc2VDaGlsZHJlbigpO2VbaV09MT09PU9iamVjdC5rZXlzKG8pLmxlbmd0aD9vW2F0XTpuZXcgT3QoW10sbyksdGhpcy5jb25zdW1lT3B0aW9uYWwoIi8vIil9cmV0dXJuIGV9LHQucHJvdG90eXBlLnBlZWtTdGFydHNXaXRoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlbWFpbmluZy5zdGFydHNXaXRoKHQpfSx0LnByb3RvdHlwZS5jb25zdW1lT3B0aW9uYWw9ZnVuY3Rpb24odCl7cmV0dXJuISF0aGlzLnBlZWtTdGFydHNXaXRoKHQpJiYodGhpcy5yZW1haW5pbmc9dGhpcy5yZW1haW5pbmcuc3Vic3RyaW5nKHQubGVuZ3RoKSwhMCl9LHQucHJvdG90eXBlLmNhcHR1cmU9ZnVuY3Rpb24odCl7aWYoIXRoaXMuY29uc3VtZU9wdGlvbmFsKHQpKXRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgIicrdCsnIi4nKX0sdH0oKSxCdD1mdW5jdGlvbih0KXt0aGlzLnNlZ21lbnRHcm91cD10fHxudWxsfSxIdD1mdW5jdGlvbih0KXt0aGlzLnVybFRyZWU9dH07ZnVuY3Rpb24gV3QodCl7cmV0dXJuIG5ldyBsLmEoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZXJyb3IobmV3IEJ0KHQpKX0pfWZ1bmN0aW9uIHF0KHQpe3JldHVybiBuZXcgbC5hKGZ1bmN0aW9uKGUpe3JldHVybiBlLmVycm9yKG5ldyBIdCh0KSl9KX1mdW5jdGlvbiBZdCh0KXtyZXR1cm4gbmV3IGwuYShmdW5jdGlvbihlKXtyZXR1cm4gZS5lcnJvcihuZXcgRXJyb3IoIk9ubHkgYWJzb2x1dGUgcmVkaXJlY3RzIGNhbiBoYXZlIG5hbWVkIG91dGxldHMuIHJlZGlyZWN0VG86ICciK3QrIiciKSl9KX12YXIgR3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLHIsbyl7dGhpcy5jb25maWdMb2FkZXI9ZSx0aGlzLnVybFNlcmlhbGl6ZXI9bix0aGlzLnVybFRyZWU9cix0aGlzLmNvbmZpZz1vLHRoaXMuYWxsb3dSZWRpcmVjdHM9ITAsdGhpcy5uZ01vZHVsZT10LmdldChpLnYpfXJldHVybiB0LnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuZXhwYW5kU2VnbWVudEdyb3VwKHRoaXMubmdNb2R1bGUsdGhpcy5jb25maWcsdGhpcy51cmxUcmVlLnJvb3QsYXQpLnBpcGUoT2JqZWN0KE8uYSkoZnVuY3Rpb24oZSl7cmV0dXJuIHQuY3JlYXRlVXJsVHJlZShlLHQudXJsVHJlZS5xdWVyeVBhcmFtcyx0LnVybFRyZWUuZnJhZ21lbnQpfSkpLnBpcGUoT2JqZWN0KE4uYSkoZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIEh0KXJldHVybiB0LmFsbG93UmVkaXJlY3RzPSExLHQubWF0Y2goZS51cmxUcmVlKTtpZihlIGluc3RhbmNlb2YgQnQpdGhyb3cgdC5ub01hdGNoRXJyb3IoZSk7dGhyb3cgZX0pKX0sdC5wcm90b3R5cGUubWF0Y2g9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy5leHBhbmRTZWdtZW50R3JvdXAodGhpcy5uZ01vZHVsZSx0aGlzLmNvbmZpZyx0LnJvb3QsYXQpLnBpcGUoT2JqZWN0KE8uYSkoZnVuY3Rpb24obil7cmV0dXJuIGUuY3JlYXRlVXJsVHJlZShuLHQucXVlcnlQYXJhbXMsdC5mcmFnbWVudCl9KSkucGlwZShPYmplY3QoTi5hKShmdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgQnQpdGhyb3cgZS5ub01hdGNoRXJyb3IodCk7dGhyb3cgdH0pKX0sdC5wcm90b3R5cGUubm9NYXRjaEVycm9yPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRXJyb3IoIkNhbm5vdCBtYXRjaCBhbnkgcm91dGVzLiBVUkwgU2VnbWVudDogJyIrdC5zZWdtZW50R3JvdXArIiciKX0sdC5wcm90b3R5cGUuY3JlYXRlVXJsVHJlZT1mdW5jdGlvbih0LGUsbil7dmFyIHIsaT10LnNlZ21lbnRzLmxlbmd0aD4wP25ldyBPdChbXSwoKHI9e30pW2F0XT10LHIpKTp0O3JldHVybiBuZXcgeHQoaSxlLG4pfSx0LnByb3RvdHlwZS5leHBhbmRTZWdtZW50R3JvdXA9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIDA9PT1uLnNlZ21lbnRzLmxlbmd0aCYmbi5oYXNDaGlsZHJlbigpP3RoaXMuZXhwYW5kQ2hpbGRyZW4odCxlLG4pLnBpcGUoT2JqZWN0KE8uYSkoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBPdChbXSx0KX0pKTp0aGlzLmV4cGFuZFNlZ21lbnQodCxuLGUsbi5zZWdtZW50cyxyLCEwKX0sdC5wcm90b3R5cGUuZXhwYW5kQ2hpbGRyZW49ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKG4saSl7aWYoMD09PU9iamVjdC5rZXlzKG4pLmxlbmd0aClyZXR1cm4gT2JqZWN0KHMuYSkoe30pO3ZhciBvPVtdLGE9W10sdT17fTtyZXR1cm4gdnQobixmdW5jdGlvbihuLGkpe3ZhciBzLGwsYz0ocz1pLGw9bixyLmV4cGFuZFNlZ21lbnRHcm91cCh0LGUsbCxzKSkucGlwZShPYmplY3QoTy5hKShmdW5jdGlvbih0KXtyZXR1cm4gdVtpXT10fSkpO2k9PT1hdD9vLnB1c2goYyk6YS5wdXNoKGMpfSkscy5hLmFwcGx5KG51bGwsby5jb25jYXQoYSkpLnBpcGUoT2JqZWN0KFIuYSkoKSxBKCksT2JqZWN0KE8uYSkoZnVuY3Rpb24oKXtyZXR1cm4gdX0pKX0obi5jaGlsZHJlbil9LHQucHJvdG90eXBlLmV4cGFuZFNlZ21lbnQ9ZnVuY3Rpb24odCxlLG4saSxvLGEpe3ZhciB1PXRoaXM7cmV0dXJuIHMuYS5hcHBseSh2b2lkIDAsT2JqZWN0KHIuZCkobikpLnBpcGUoT2JqZWN0KE8uYSkoZnVuY3Rpb24ocil7cmV0dXJuIHUuZXhwYW5kU2VnbWVudEFnYWluc3RSb3V0ZSh0LGUsbixyLGksbyxhKS5waXBlKE9iamVjdChOLmEpKGZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBCdClyZXR1cm4gT2JqZWN0KHMuYSkobnVsbCk7dGhyb3cgdH0pKX0pLE9iamVjdChSLmEpKCksdyhmdW5jdGlvbih0KXtyZXR1cm4hIXR9KSxPYmplY3QoTi5hKShmdW5jdGlvbih0LG4pe2lmKHQgaW5zdGFuY2VvZiBjfHwiRW1wdHlFcnJvciI9PT10Lm5hbWUpe2lmKHUubm9MZWZ0b3ZlcnNJblVybChlLGksbykpcmV0dXJuIE9iamVjdChzLmEpKG5ldyBPdChbXSx7fSkpO3Rocm93IG5ldyBCdChlKX10aHJvdyB0fSkpfSx0LnByb3RvdHlwZS5ub0xlZnRvdmVyc0luVXJsPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMD09PWUubGVuZ3RoJiYhdC5jaGlsZHJlbltuXX0sdC5wcm90b3R5cGUuZXhwYW5kU2VnbWVudEFnYWluc3RSb3V0ZT1mdW5jdGlvbih0LGUsbixyLGksbyxhKXtyZXR1cm4gWHQocikhPT1vP1d0KGUpOnZvaWQgMD09PXIucmVkaXJlY3RUbz90aGlzLm1hdGNoU2VnbWVudEFnYWluc3RSb3V0ZSh0LGUscixpKTphJiZ0aGlzLmFsbG93UmVkaXJlY3RzP3RoaXMuZXhwYW5kU2VnbWVudEFnYWluc3RSb3V0ZVVzaW5nUmVkaXJlY3QodCxlLG4scixpLG8pOld0KGUpfSx0LnByb3RvdHlwZS5leHBhbmRTZWdtZW50QWdhaW5zdFJvdXRlVXNpbmdSZWRpcmVjdD1mdW5jdGlvbih0LGUsbixyLGksbyl7cmV0dXJuIioqIj09PXIucGF0aD90aGlzLmV4cGFuZFdpbGRDYXJkV2l0aFBhcmFtc0FnYWluc3RSb3V0ZVVzaW5nUmVkaXJlY3QodCxuLHIsbyk6dGhpcy5leHBhbmRSZWd1bGFyU2VnbWVudEFnYWluc3RSb3V0ZVVzaW5nUmVkaXJlY3QodCxlLG4scixpLG8pfSx0LnByb3RvdHlwZS5leHBhbmRXaWxkQ2FyZFdpdGhQYXJhbXNBZ2FpbnN0Um91dGVVc2luZ1JlZGlyZWN0PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXMsbz10aGlzLmFwcGx5UmVkaXJlY3RDb21tYW5kcyhbXSxuLnJlZGlyZWN0VG8se30pO3JldHVybiBuLnJlZGlyZWN0VG8uc3RhcnRzV2l0aCgiLyIpP3F0KG8pOnRoaXMubGluZXJhbGl6ZVNlZ21lbnRzKG4sbykucGlwZShPYmplY3QoeC5hKShmdW5jdGlvbihuKXt2YXIgbz1uZXcgT3Qobix7fSk7cmV0dXJuIGkuZXhwYW5kU2VnbWVudCh0LG8sZSxuLHIsITEpfSkpfSx0LnByb3RvdHlwZS5leHBhbmRSZWd1bGFyU2VnbWVudEFnYWluc3RSb3V0ZVVzaW5nUmVkaXJlY3Q9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBhPXRoaXMscz1RdChlLHIsaSksdT1zLmNvbnN1bWVkU2VnbWVudHMsbD1zLmxhc3RDaGlsZCxjPXMucG9zaXRpb25hbFBhcmFtU2VnbWVudHM7aWYoIXMubWF0Y2hlZClyZXR1cm4gV3QoZSk7dmFyIGY9dGhpcy5hcHBseVJlZGlyZWN0Q29tbWFuZHModSxyLnJlZGlyZWN0VG8sYyk7cmV0dXJuIHIucmVkaXJlY3RUby5zdGFydHNXaXRoKCIvIik/cXQoZik6dGhpcy5saW5lcmFsaXplU2VnbWVudHMocixmKS5waXBlKE9iamVjdCh4LmEpKGZ1bmN0aW9uKHIpe3JldHVybiBhLmV4cGFuZFNlZ21lbnQodCxlLG4sci5jb25jYXQoaS5zbGljZShsKSksbywhMSl9KSl9LHQucHJvdG90eXBlLm1hdGNoU2VnbWVudEFnYWluc3RSb3V0ZT1mdW5jdGlvbih0LGUsbixpKXt2YXIgbz10aGlzO2lmKCIqKiI9PT1uLnBhdGgpcmV0dXJuIG4ubG9hZENoaWxkcmVuP3RoaXMuY29uZmlnTG9hZGVyLmxvYWQodC5pbmplY3RvcixuKS5waXBlKE9iamVjdChPLmEpKGZ1bmN0aW9uKHQpe3JldHVybiBuLl9sb2FkZWRDb25maWc9dCxuZXcgT3QoaSx7fSl9KSk6T2JqZWN0KHMuYSkobmV3IE90KGkse30pKTt2YXIgYT1RdChlLG4saSksdT1hLmNvbnN1bWVkU2VnbWVudHMsbD1hLmxhc3RDaGlsZDtpZighYS5tYXRjaGVkKXJldHVybiBXdChlKTt2YXIgYz1pLnNsaWNlKGwpO3JldHVybiB0aGlzLmdldENoaWxkQ29uZmlnKHQsbikucGlwZShPYmplY3QoeC5hKShmdW5jdGlvbih0KXt2YXIgbj10Lm1vZHVsZSxpPXQucm91dGVzLGE9ZnVuY3Rpb24odCxlLG4saSl7cmV0dXJuIG4ubGVuZ3RoPjAmJmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaS5zb21lKGZ1bmN0aW9uKG4pe3JldHVybiBadCh0LGUsbikmJlh0KG4pIT09YXR9KX0odCxuKT97c2VnbWVudEdyb3VwOkt0KG5ldyBPdChlLGZ1bmN0aW9uKHQsZSl7dmFyIG4saSxvPXt9O29bYXRdPWU7dHJ5e2Zvcih2YXIgYT1PYmplY3Qoci5lKSh0KSxzPWEubmV4dCgpOyFzLmRvbmU7cz1hLm5leHQoKSl7dmFyIHU9cy52YWx1ZTsiIj09PXUucGF0aCYmWHQodSkhPT1hdCYmKG9bWHQodSldPW5ldyBPdChbXSx7fSkpfX1jYXRjaCh0KXtuPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtzJiYhcy5kb25lJiYoaT1hLnJldHVybikmJmkuY2FsbChhKX1maW5hbGx5e2lmKG4pdGhyb3cgbi5lcnJvcn19cmV0dXJuIG99KGksbmV3IE90KG4sdC5jaGlsZHJlbikpKSksc2xpY2VkU2VnbWVudHM6W119OjA9PT1uLmxlbmd0aCYmZnVuY3Rpb24odCxlLG4pe3JldHVybiBpLnNvbWUoZnVuY3Rpb24obil7cmV0dXJuIFp0KHQsZSxuKX0pfSh0LG4pP3tzZWdtZW50R3JvdXA6S3QobmV3IE90KHQuc2VnbWVudHMsZnVuY3Rpb24odCxlLG4saSl7dmFyIG8sYSxzPXt9O3RyeXtmb3IodmFyIHU9T2JqZWN0KHIuZSkobiksbD11Lm5leHQoKTshbC5kb25lO2w9dS5uZXh0KCkpe3ZhciBjPWwudmFsdWU7WnQodCxlLGMpJiYhaVtYdChjKV0mJihzW1h0KGMpXT1uZXcgT3QoW10se30pKX19Y2F0Y2godCl7bz17ZXJyb3I6dH19ZmluYWxseXt0cnl7bCYmIWwuZG9uZSYmKGE9dS5yZXR1cm4pJiZhLmNhbGwodSl9ZmluYWxseXtpZihvKXRocm93IG8uZXJyb3J9fXJldHVybiBPYmplY3Qoci5hKSh7fSxpLHMpfSh0LG4saSx0LmNoaWxkcmVuKSkpLHNsaWNlZFNlZ21lbnRzOm59OntzZWdtZW50R3JvdXA6dCxzbGljZWRTZWdtZW50czpufX0oZSx1LGMsaSksbD1hLnNlZ21lbnRHcm91cCxmPWEuc2xpY2VkU2VnbWVudHM7cmV0dXJuIDA9PT1mLmxlbmd0aCYmbC5oYXNDaGlsZHJlbigpP28uZXhwYW5kQ2hpbGRyZW4obixpLGwpLnBpcGUoT2JqZWN0KE8uYSkoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBPdCh1LHQpfSkpOjA9PT1pLmxlbmd0aCYmMD09PWYubGVuZ3RoP09iamVjdChzLmEpKG5ldyBPdCh1LHt9KSk6by5leHBhbmRTZWdtZW50KG4sbCxpLGYsYXQsITApLnBpcGUoT2JqZWN0KE8uYSkoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBPdCh1LmNvbmNhdCh0LnNlZ21lbnRzKSx0LmNoaWxkcmVuKX0pKX0pKX0sdC5wcm90b3R5cGUuZ2V0Q2hpbGRDb25maWc9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiBlLmNoaWxkcmVuP09iamVjdChzLmEpKG5ldyBjdChlLmNoaWxkcmVuLHQpKTplLmxvYWRDaGlsZHJlbj92b2lkIDAhPT1lLl9sb2FkZWRDb25maWc/T2JqZWN0KHMuYSkoZS5fbG9hZGVkQ29uZmlnKTpmdW5jdGlvbih0LGUpe3ZhciBuPWUuY2FuTG9hZDtyZXR1cm4gbiYmMCE9PW4ubGVuZ3RoP2J0KE9iamVjdChhLmEpKG4pLnBpcGUoT2JqZWN0KE8uYSkoZnVuY3Rpb24obil7dmFyIHI9dC5nZXQobik7cmV0dXJuIF90KHIuY2FuTG9hZD9yLmNhbkxvYWQoZSk6cihlKSl9KSkpOk9iamVjdChzLmEpKCEwKX0odC5pbmplY3RvcixlKS5waXBlKE9iamVjdCh4LmEpKGZ1bmN0aW9uKHIpe3JldHVybiByP24uY29uZmlnTG9hZGVyLmxvYWQodC5pbmplY3RvcixlKS5waXBlKE9iamVjdChPLmEpKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9sb2FkZWRDb25maWc9dCx0fSkpOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbC5hKGZ1bmN0aW9uKGUpe3JldHVybiBlLmVycm9yKCgobj1FcnJvcigiTmF2aWdhdGlvbkNhbmNlbGluZ0Vycm9yOiBDYW5ub3QgbG9hZCBjaGlsZHJlbiBiZWNhdXNlIHRoZSBndWFyZCBvZiB0aGUgcm91dGUgXCJwYXRoOiAnIit0LnBhdGgrIidcIiByZXR1cm5lZCBmYWxzZSIpKS5uZ05hdmlnYXRpb25DYW5jZWxpbmdFcnJvcj0hMCxuKSk7dmFyIG59KX0oZSl9KSk6T2JqZWN0KHMuYSkobmV3IGN0KFtdLHQpKX0sdC5wcm90b3R5cGUubGluZXJhbGl6ZVNlZ21lbnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLHI9ZS5yb290Ozspe2lmKG49bi5jb25jYXQoci5zZWdtZW50cyksMD09PXIubnVtYmVyT2ZDaGlsZHJlbilyZXR1cm4gT2JqZWN0KHMuYSkobik7aWYoci5udW1iZXJPZkNoaWxkcmVuPjF8fCFyLmNoaWxkcmVuW2F0XSlyZXR1cm4gWXQodC5yZWRpcmVjdFRvKTtyPXIuY2hpbGRyZW5bYXRdfX0sdC5wcm90b3R5cGUuYXBwbHlSZWRpcmVjdENvbW1hbmRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5hcHBseVJlZGlyZWN0Q3JlYXRyZVVybFRyZWUoZSx0aGlzLnVybFNlcmlhbGl6ZXIucGFyc2UoZSksdCxuKX0sdC5wcm90b3R5cGUuYXBwbHlSZWRpcmVjdENyZWF0cmVVcmxUcmVlPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXMuY3JlYXRlU2VnbWVudEdyb3VwKHQsZS5yb290LG4scik7cmV0dXJuIG5ldyB4dChpLHRoaXMuY3JlYXRlUXVlcnlQYXJhbXMoZS5xdWVyeVBhcmFtcyx0aGlzLnVybFRyZWUucXVlcnlQYXJhbXMpLGUuZnJhZ21lbnQpfSx0LnByb3RvdHlwZS5jcmVhdGVRdWVyeVBhcmFtcz1mdW5jdGlvbih0LGUpe3ZhciBuPXt9O3JldHVybiB2dCh0LGZ1bmN0aW9uKHQscil7aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LnN0YXJ0c1dpdGgoIjoiKSl7dmFyIGk9dC5zdWJzdHJpbmcoMSk7bltyXT1lW2ldfWVsc2UgbltyXT10fSksbn0sdC5wcm90b3R5cGUuY3JlYXRlU2VnbWVudEdyb3VwPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXMsbz10aGlzLmNyZWF0ZVNlZ21lbnRzKHQsZS5zZWdtZW50cyxuLHIpLGE9e307cmV0dXJuIHZ0KGUuY2hpbGRyZW4sZnVuY3Rpb24oZSxvKXthW29dPWkuY3JlYXRlU2VnbWVudEdyb3VwKHQsZSxuLHIpfSksbmV3IE90KG8sYSl9LHQucHJvdG90eXBlLmNyZWF0ZVNlZ21lbnRzPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXM7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGguc3RhcnRzV2l0aCgiOiIpP2kuZmluZFBvc1BhcmFtKHQsZSxyKTppLmZpbmRPclJldHVybihlLG4pfSl9LHQucHJvdG90eXBlLmZpbmRQb3NQYXJhbT1mdW5jdGlvbih0LGUsbil7dmFyIHI9bltlLnBhdGguc3Vic3RyaW5nKDEpXTtpZighcil0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWRpcmVjdCB0byAnIit0KyInLiBDYW5ub3QgZmluZCAnIitlLnBhdGgrIicuIik7cmV0dXJuIHJ9LHQucHJvdG90eXBlLmZpbmRPclJldHVybj1mdW5jdGlvbih0LGUpe3ZhciBuLGksbz0wO3RyeXtmb3IodmFyIGE9T2JqZWN0KHIuZSkoZSkscz1hLm5leHQoKTshcy5kb25lO3M9YS5uZXh0KCkpe3ZhciB1PXMudmFsdWU7aWYodS5wYXRoPT09dC5wYXRoKXJldHVybiBlLnNwbGljZShvKSx1O28rK319Y2F0Y2godCl7bj17ZXJyb3I6dH19ZmluYWxseXt0cnl7cyYmIXMuZG9uZSYmKGk9YS5yZXR1cm4pJiZpLmNhbGwoYSl9ZmluYWxseXtpZihuKXRocm93IG4uZXJyb3J9fXJldHVybiB0fSx0fSgpO2Z1bmN0aW9uIFF0KHQsZSxuKXtpZigiIj09PWUucGF0aClyZXR1cm4iZnVsbCI9PT1lLnBhdGhNYXRjaCYmKHQuaGFzQ2hpbGRyZW4oKXx8bi5sZW5ndGg+MCk/e21hdGNoZWQ6ITEsY29uc3VtZWRTZWdtZW50czpbXSxsYXN0Q2hpbGQ6MCxwb3NpdGlvbmFsUGFyYW1TZWdtZW50czp7fX06e21hdGNoZWQ6ITAsY29uc3VtZWRTZWdtZW50czpbXSxsYXN0Q2hpbGQ6MCxwb3NpdGlvbmFsUGFyYW1TZWdtZW50czp7fX07dmFyIHI9KGUubWF0Y2hlcnx8bHQpKG4sdCxlKTtyZXR1cm4gcj97bWF0Y2hlZDohMCxjb25zdW1lZFNlZ21lbnRzOnIuY29uc3VtZWQsbGFzdENoaWxkOnIuY29uc3VtZWQubGVuZ3RoLHBvc2l0aW9uYWxQYXJhbVNlZ21lbnRzOnIucG9zUGFyYW1zfTp7bWF0Y2hlZDohMSxjb25zdW1lZFNlZ21lbnRzOltdLGxhc3RDaGlsZDowLHBvc2l0aW9uYWxQYXJhbVNlZ21lbnRzOnt9fX1mdW5jdGlvbiBLdCh0KXtpZigxPT09dC5udW1iZXJPZkNoaWxkcmVuJiZ0LmNoaWxkcmVuW2F0XSl7dmFyIGU9dC5jaGlsZHJlblthdF07cmV0dXJuIG5ldyBPdCh0LnNlZ21lbnRzLmNvbmNhdChlLnNlZ21lbnRzKSxlLmNoaWxkcmVuKX1yZXR1cm4gdH1mdW5jdGlvbiBadCh0LGUsbil7cmV0dXJuKCEodC5oYXNDaGlsZHJlbigpfHxlLmxlbmd0aD4wKXx8ImZ1bGwiIT09bi5wYXRoTWF0Y2gpJiYiIj09PW4ucGF0aCYmdm9pZCAwIT09bi5yZWRpcmVjdFRvfWZ1bmN0aW9uIFh0KHQpe3JldHVybiB0Lm91dGxldHx8YXR9dmFyICR0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9yb290PXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicm9vdCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290LnZhbHVlfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLnBhcmVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnBhdGhGcm9tUm9vdCh0KTtyZXR1cm4gZS5sZW5ndGg+MT9lW2UubGVuZ3RoLTJdOm51bGx9LHQucHJvdG90eXBlLmNoaWxkcmVuPWZ1bmN0aW9uKHQpe3ZhciBlPUp0KHQsdGhpcy5fcm9vdCk7cmV0dXJuIGU/ZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWV9KTpbXX0sdC5wcm90b3R5cGUuZmlyc3RDaGlsZD1mdW5jdGlvbih0KXt2YXIgZT1KdCh0LHRoaXMuX3Jvb3QpO3JldHVybiBlJiZlLmNoaWxkcmVuLmxlbmd0aD4wP2UuY2hpbGRyZW5bMF0udmFsdWU6bnVsbH0sdC5wcm90b3R5cGUuc2libGluZ3M9ZnVuY3Rpb24odCl7dmFyIGU9dGUodCx0aGlzLl9yb290KTtyZXR1cm4gZS5sZW5ndGg8Mj9bXTplW2UubGVuZ3RoLTJdLmNoaWxkcmVuLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZSE9PXR9KX0sdC5wcm90b3R5cGUucGF0aEZyb21Sb290PWZ1bmN0aW9uKHQpe3JldHVybiB0ZSh0LHRoaXMuX3Jvb3QpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZX0pfSx0fSgpO2Z1bmN0aW9uIEp0KHQsZSl7aWYodD09PWUudmFsdWUpcmV0dXJuIGU7dHJ5e2Zvcih2YXIgbj1PYmplY3Qoci5lKShlLmNoaWxkcmVuKSxpPW4ubmV4dCgpOyFpLmRvbmU7aT1uLm5leHQoKSl7dmFyIG89SnQodCxpLnZhbHVlKTtpZihvKXJldHVybiBvfX1jYXRjaCh0KXthPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtpJiYhaS5kb25lJiYocz1uLnJldHVybikmJnMuY2FsbChuKX1maW5hbGx5e2lmKGEpdGhyb3cgYS5lcnJvcn19cmV0dXJuIG51bGw7dmFyIGEsc31mdW5jdGlvbiB0ZSh0LGUpe2lmKHQ9PT1lLnZhbHVlKXJldHVybltlXTt0cnl7Zm9yKHZhciBuPU9iamVjdChyLmUpKGUuY2hpbGRyZW4pLGk9bi5uZXh0KCk7IWkuZG9uZTtpPW4ubmV4dCgpKXt2YXIgbz10ZSh0LGkudmFsdWUpO2lmKG8ubGVuZ3RoKXJldHVybiBvLnVuc2hpZnQoZSksb319Y2F0Y2godCl7YT17ZXJyb3I6dH19ZmluYWxseXt0cnl7aSYmIWkuZG9uZSYmKHM9bi5yZXR1cm4pJiZzLmNhbGwobil9ZmluYWxseXtpZihhKXRocm93IGEuZXJyb3J9fXJldHVybltdO3ZhciBhLHN9dmFyIGVlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMudmFsdWU9dCx0aGlzLmNoaWxkcmVuPWV9cmV0dXJuIHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlRyZWVOb2RlKCIrdGhpcy52YWx1ZSsiKSJ9LHR9KCk7ZnVuY3Rpb24gbmUodCl7dmFyIGU9e307cmV0dXJuIHQmJnQuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZVt0LnZhbHVlLm91dGxldF09dH0pLGV9dmFyIHJlPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgcj10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gci5zbmFwc2hvdD1uLGxlKHIsZSkscn1yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNuYXBzaG90LnRvU3RyaW5nKCl9LGV9KCR0KTtmdW5jdGlvbiBpZSh0LGUpe3ZhciBuPWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IHNlKFtdLHt9LHt9LCIiLHt9LGF0LGUsbnVsbCx0LnJvb3QsLTEse30pO3JldHVybiBuZXcgdWUoIiIsbmV3IGVlKG4sW10pKX0odCxlKSxyPW5ldyBvLmEoW25ldyBDdCgiIix7fSldKSxpPW5ldyBvLmEoe30pLGE9bmV3IG8uYSh7fSkscz1uZXcgby5hKHt9KSx1PW5ldyBvLmEoIiIpLGw9bmV3IG9lKHIsaSxzLHUsYSxhdCxlLG4ucm9vdCk7cmV0dXJuIGwuc25hcHNob3Q9bi5yb290LG5ldyByZShuZXcgZWUobCxbXSksbil9dmFyIG9lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyLGksbyxhLHMpe3RoaXMudXJsPXQsdGhpcy5wYXJhbXM9ZSx0aGlzLnF1ZXJ5UGFyYW1zPW4sdGhpcy5mcmFnbWVudD1yLHRoaXMuZGF0YT1pLHRoaXMub3V0bGV0PW8sdGhpcy5jb21wb25lbnQ9YSx0aGlzLl9mdXR1cmVTbmFwc2hvdD1zfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInJvdXRlQ29uZmlnIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Z1dHVyZVNuYXBzaG90LnJvdXRlQ29uZmlnfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicm9vdCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb3V0ZXJTdGF0ZS5yb290fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicGFyZW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JvdXRlclN0YXRlLnBhcmVudCh0aGlzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImZpcnN0Q2hpbGQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm91dGVyU3RhdGUuZmlyc3RDaGlsZCh0aGlzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImNoaWxkcmVuIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JvdXRlclN0YXRlLmNoaWxkcmVuKHRoaXMpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicGF0aEZyb21Sb290Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JvdXRlclN0YXRlLnBhdGhGcm9tUm9vdCh0aGlzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInBhcmFtTWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcmFtTWFwfHwodGhpcy5fcGFyYW1NYXA9dGhpcy5wYXJhbXMucGlwZShPYmplY3QoTy5hKShmdW5jdGlvbih0KXtyZXR1cm4gdXQodCl9KSkpLHRoaXMuX3BhcmFtTWFwfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicXVlcnlQYXJhbU1hcCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9xdWVyeVBhcmFtTWFwfHwodGhpcy5fcXVlcnlQYXJhbU1hcD10aGlzLnF1ZXJ5UGFyYW1zLnBpcGUoT2JqZWN0KE8uYSkoZnVuY3Rpb24odCl7cmV0dXJuIHV0KHQpfSkpKSx0aGlzLl9xdWVyeVBhcmFtTWFwfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc25hcHNob3Q/dGhpcy5zbmFwc2hvdC50b1N0cmluZygpOiJGdXR1cmUoIit0aGlzLl9mdXR1cmVTbmFwc2hvdCsiKSJ9LHR9KCk7ZnVuY3Rpb24gYWUodCxlKXt2b2lkIDA9PT1lJiYoZT0iZW1wdHlPbmx5Iik7dmFyIG49dC5wYXRoRnJvbVJvb3QsaT0wO2lmKCJhbHdheXMiIT09ZSlmb3IoaT1uLmxlbmd0aC0xO2k+PTE7KXt2YXIgbz1uW2ldLGE9bltpLTFdO2lmKG8ucm91dGVDb25maWcmJiIiPT09by5yb3V0ZUNvbmZpZy5wYXRoKWktLTtlbHNle2lmKGEuY29tcG9uZW50KWJyZWFrO2ktLX19cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybntwYXJhbXM6T2JqZWN0KHIuYSkoe30sdC5wYXJhbXMsZS5wYXJhbXMpLGRhdGE6T2JqZWN0KHIuYSkoe30sdC5kYXRhLGUuZGF0YSkscmVzb2x2ZTpPYmplY3Qoci5hKSh7fSx0LnJlc29sdmUsZS5fcmVzb2x2ZWREYXRhKX19LHtwYXJhbXM6e30sZGF0YTp7fSxyZXNvbHZlOnt9fSl9KG4uc2xpY2UoaSkpfXZhciBzZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4scixpLG8sYSxzLHUsbCxjKXt0aGlzLnVybD10LHRoaXMucGFyYW1zPWUsdGhpcy5xdWVyeVBhcmFtcz1uLHRoaXMuZnJhZ21lbnQ9cix0aGlzLmRhdGE9aSx0aGlzLm91dGxldD1vLHRoaXMuY29tcG9uZW50PWEsdGhpcy5yb3V0ZUNvbmZpZz1zLHRoaXMuX3VybFNlZ21lbnQ9dSx0aGlzLl9sYXN0UGF0aEluZGV4PWwsdGhpcy5fcmVzb2x2ZT1jfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInJvb3QiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm91dGVyU3RhdGUucm9vdH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInBhcmVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb3V0ZXJTdGF0ZS5wYXJlbnQodGhpcyl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJmaXJzdENoaWxkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JvdXRlclN0YXRlLmZpcnN0Q2hpbGQodGhpcyl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjaGlsZHJlbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb3V0ZXJTdGF0ZS5jaGlsZHJlbih0aGlzKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInBhdGhGcm9tUm9vdCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb3V0ZXJTdGF0ZS5wYXRoRnJvbVJvb3QodGhpcyl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwYXJhbU1hcCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXJhbU1hcHx8KHRoaXMuX3BhcmFtTWFwPXV0KHRoaXMucGFyYW1zKSksdGhpcy5fcGFyYW1NYXB9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJxdWVyeVBhcmFtTWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3F1ZXJ5UGFyYW1NYXB8fCh0aGlzLl9xdWVyeVBhcmFtTWFwPXV0KHRoaXMucXVlcnlQYXJhbXMpKSx0aGlzLl9xdWVyeVBhcmFtTWFwfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlJvdXRlKHVybDonIit0aGlzLnVybC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudG9TdHJpbmcoKX0pLmpvaW4oIi8iKSsiJywgcGF0aDonIisodGhpcy5yb3V0ZUNvbmZpZz90aGlzLnJvdXRlQ29uZmlnLnBhdGg6IiIpKyInKSJ9LHR9KCksdWU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciByPXQuY2FsbCh0aGlzLG4pfHx0aGlzO3JldHVybiByLnVybD1lLGxlKHIsbikscn1yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBjZSh0aGlzLl9yb290KX0sZX0oJHQpO2Z1bmN0aW9uIGxlKHQsZSl7ZS52YWx1ZS5fcm91dGVyU3RhdGU9dCxlLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGxlKHQsZSl9KX1mdW5jdGlvbiBjZSh0KXt2YXIgZT10LmNoaWxkcmVuLmxlbmd0aD4wPyIgeyAiK3QuY2hpbGRyZW4ubWFwKGNlKS5qb2luKCIsICIpKyIgfSAiOiIiO3JldHVybiIiK3QudmFsdWUrZX1mdW5jdGlvbiBmZSh0KXtpZih0LnNuYXBzaG90KXt2YXIgZT10LnNuYXBzaG90LG49dC5fZnV0dXJlU25hcHNob3Q7dC5zbmFwc2hvdD1uLG10KGUucXVlcnlQYXJhbXMsbi5xdWVyeVBhcmFtcyl8fHQucXVlcnlQYXJhbXMubmV4dChuLnF1ZXJ5UGFyYW1zKSxlLmZyYWdtZW50IT09bi5mcmFnbWVudCYmdC5mcmFnbWVudC5uZXh0KG4uZnJhZ21lbnQpLG10KGUucGFyYW1zLG4ucGFyYW1zKXx8dC5wYXJhbXMubmV4dChuLnBhcmFtcyksZnVuY3Rpb24odCxlKXtpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7KytuKWlmKCFtdCh0W25dLGVbbl0pKXJldHVybiExO3JldHVybiEwfShlLnVybCxuLnVybCl8fHQudXJsLm5leHQobi51cmwpLG10KGUuZGF0YSxuLmRhdGEpfHx0LmRhdGEubmV4dChuLmRhdGEpfWVsc2UgdC5zbmFwc2hvdD10Ll9mdXR1cmVTbmFwc2hvdCx0LmRhdGEubmV4dCh0Ll9mdXR1cmVTbmFwc2hvdC5kYXRhKX1mdW5jdGlvbiBoZSh0LGUpe3ZhciBuLHI7cmV0dXJuIG10KHQucGFyYW1zLGUucGFyYW1zKSYmU3Qobj10LnVybCxyPWUudXJsKSYmbi5ldmVyeShmdW5jdGlvbih0LGUpe3JldHVybiBtdCh0LnBhcmFtZXRlcnMscltlXS5wYXJhbWV0ZXJzKX0pJiYhKCF0LnBhcmVudCE9IWUucGFyZW50KSYmKCF0LnBhcmVudHx8aGUodC5wYXJlbnQsZS5wYXJlbnQpKX1mdW5jdGlvbiBkZSh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPXQmJiF0Lm91dGxldHMmJiF0LnNlZ21lbnRQYXRofWZ1bmN0aW9uIHBlKHQsZSxuLHIsaSl7dmFyIG89e307cmV0dXJuIHImJnZ0KHIsZnVuY3Rpb24odCxlKXtvW2VdPUFycmF5LmlzQXJyYXkodCk/dC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIiIrdH0pOiIiK3R9KSxuZXcgeHQobi5yb290PT09dD9lOmZ1bmN0aW9uIHQoZSxuLHIpe3ZhciBpPXt9O3JldHVybiB2dChlLmNoaWxkcmVuLGZ1bmN0aW9uKGUsbyl7aVtvXT1lPT09bj9yOnQoZSxuLHIpfSksbmV3IE90KGUuc2VnbWVudHMsaSl9KG4ucm9vdCx0LGUpLG8saSl9dmFyIG1lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7aWYodGhpcy5pc0Fic29sdXRlPXQsdGhpcy5udW1iZXJPZkRvdWJsZURvdHM9ZSx0aGlzLmNvbW1hbmRzPW4sdCYmbi5sZW5ndGg+MCYmZGUoblswXSkpdGhyb3cgbmV3IEVycm9yKCJSb290IHNlZ21lbnQgY2Fubm90IGhhdmUgbWF0cml4IHBhcmFtZXRlcnMiKTt2YXIgcj1uLmZpbmQoZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT10JiZ0Lm91dGxldHN9KTtpZihyJiZyIT09Z3QobikpdGhyb3cgbmV3IEVycm9yKCJ7b3V0bGV0czp7fX0gaGFzIHRvIGJlIHRoZSBsYXN0IGNvbW1hbmQiKX1yZXR1cm4gdC5wcm90b3R5cGUudG9Sb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNBYnNvbHV0ZSYmMT09PXRoaXMuY29tbWFuZHMubGVuZ3RoJiYiLyI9PXRoaXMuY29tbWFuZHNbMF19LHR9KCkseWU9ZnVuY3Rpb24odCxlLG4pe3RoaXMuc2VnbWVudEdyb3VwPXQsdGhpcy5wcm9jZXNzQ2hpbGRyZW49ZSx0aGlzLmluZGV4PW59O2Z1bmN0aW9uIGdlKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9dCYmdC5vdXRsZXRzP3Qub3V0bGV0c1thdF06IiIrdH1mdW5jdGlvbiB2ZSh0LGUsbil7aWYodHx8KHQ9bmV3IE90KFtdLHt9KSksMD09PXQuc2VnbWVudHMubGVuZ3RoJiZ0Lmhhc0NoaWxkcmVuKCkpcmV0dXJuIGJlKHQsZSxuKTt2YXIgcj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTAsaT1lLG89e21hdGNoOiExLHBhdGhJbmRleDowLGNvbW1hbmRJbmRleDowfTtpPHQuc2VnbWVudHMubGVuZ3RoOyl7aWYocj49bi5sZW5ndGgpcmV0dXJuIG87dmFyIGE9dC5zZWdtZW50c1tpXSxzPWdlKG5bcl0pLHU9cjxuLmxlbmd0aC0xP25bcisxXTpudWxsO2lmKGk+MCYmdm9pZCAwPT09cylicmVhaztpZihzJiZ1JiYib2JqZWN0Ij09dHlwZW9mIHUmJnZvaWQgMD09PXUub3V0bGV0cyl7aWYoIU9lKHMsdSxhKSlyZXR1cm4gbztyKz0yfWVsc2V7aWYoIU9lKHMse30sYSkpcmV0dXJuIG87cisrfWkrK31yZXR1cm57bWF0Y2g6ITAscGF0aEluZGV4OmksY29tbWFuZEluZGV4OnJ9fSh0LGUsbiksaT1uLnNsaWNlKHIuY29tbWFuZEluZGV4KTtpZihyLm1hdGNoJiZyLnBhdGhJbmRleDx0LnNlZ21lbnRzLmxlbmd0aCl7dmFyIG89bmV3IE90KHQuc2VnbWVudHMuc2xpY2UoMCxyLnBhdGhJbmRleCkse30pO3JldHVybiBvLmNoaWxkcmVuW2F0XT1uZXcgT3QodC5zZWdtZW50cy5zbGljZShyLnBhdGhJbmRleCksdC5jaGlsZHJlbiksYmUobywwLGkpfXJldHVybiByLm1hdGNoJiYwPT09aS5sZW5ndGg/bmV3IE90KHQuc2VnbWVudHMse30pOnIubWF0Y2gmJiF0Lmhhc0NoaWxkcmVuKCk/X2UodCxlLG4pOnIubWF0Y2g/YmUodCwwLGkpOl9lKHQsZSxuKX1mdW5jdGlvbiBiZSh0LGUsbil7aWYoMD09PW4ubGVuZ3RoKXJldHVybiBuZXcgT3QodC5zZWdtZW50cyx7fSk7dmFyIHI9ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCIhPXR5cGVvZiB0WzBdPygoZT17fSlbYXRdPXQsZSk6dm9pZCAwPT09dFswXS5vdXRsZXRzPygobj17fSlbYXRdPXQsbik6dFswXS5vdXRsZXRzO3ZhciBlLG59KG4pLGk9e307cmV0dXJuIHZ0KHIsZnVuY3Rpb24obixyKXtudWxsIT09biYmKGlbcl09dmUodC5jaGlsZHJlbltyXSxlLG4pKX0pLHZ0KHQuY2hpbGRyZW4sZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1yW2VdJiYoaVtlXT10KX0pLG5ldyBPdCh0LnNlZ21lbnRzLGkpfWZ1bmN0aW9uIF9lKHQsZSxuKXtmb3IodmFyIHI9dC5zZWdtZW50cy5zbGljZSgwLGUpLGk9MDtpPG4ubGVuZ3RoOyl7aWYoIm9iamVjdCI9PXR5cGVvZiBuW2ldJiZ2b2lkIDAhPT1uW2ldLm91dGxldHMpe3ZhciBvPXdlKG5baV0ub3V0bGV0cyk7cmV0dXJuIG5ldyBPdChyLG8pfWlmKDA9PT1pJiZkZShuWzBdKSlyLnB1c2gobmV3IEN0KHQuc2VnbWVudHNbZV0ucGF0aCxuWzBdKSksaSsrO2Vsc2V7dmFyIGE9Z2UobltpXSkscz1pPG4ubGVuZ3RoLTE/bltpKzFdOm51bGw7YSYmcyYmZGUocyk/KHIucHVzaChuZXcgQ3QoYSx4ZShzKSkpLGkrPTIpOihyLnB1c2gobmV3IEN0KGEse30pKSxpKyspfX1yZXR1cm4gbmV3IE90KHIse30pfWZ1bmN0aW9uIHdlKHQpe3ZhciBlPXt9O3JldHVybiB2dCh0LGZ1bmN0aW9uKHQsbil7bnVsbCE9PXQmJihlW25dPV9lKG5ldyBPdChbXSx7fSksMCx0KSl9KSxlfWZ1bmN0aW9uIHhlKHQpe3ZhciBlPXt9O3JldHVybiB2dCh0LGZ1bmN0aW9uKHQsbil7cmV0dXJuIGVbbl09IiIrdH0pLGV9ZnVuY3Rpb24gT2UodCxlLG4pe3JldHVybiB0PT1uLnBhdGgmJm10KGUsbi5wYXJhbWV0ZXJzKX12YXIgQ2U9ZnVuY3Rpb24odCl7dGhpcy5wYXRoPXQsdGhpcy5yb3V0ZT10aGlzLnBhdGhbdGhpcy5wYXRoLmxlbmd0aC0xXX0sU2U9ZnVuY3Rpb24odCxlKXt0aGlzLmNvbXBvbmVudD10LHRoaXMucm91dGU9ZX0sRWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLHIpe3RoaXMuZnV0dXJlPXQsdGhpcy5jdXJyPWUsdGhpcy5tb2R1bGVJbmplY3Rvcj1uLHRoaXMuZm9yd2FyZEV2ZW50PXIsdGhpcy5jYW5BY3RpdmF0ZUNoZWNrcz1bXSx0aGlzLmNhbkRlYWN0aXZhdGVDaGVja3M9W119cmV0dXJuIHQucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mdXR1cmUuX3Jvb3Q7dGhpcy5zZXR1cENoaWxkUm91dGVHdWFyZHMoZSx0aGlzLmN1cnI/dGhpcy5jdXJyLl9yb290Om51bGwsdCxbZS52YWx1ZV0pfSx0LnByb3RvdHlwZS5jaGVja0d1YXJkcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuaXNEZWFjdGl2YXRpbmcoKXx8dGhpcy5pc0FjdGl2YXRpbmcoKT90aGlzLnJ1bkNhbkRlYWN0aXZhdGVDaGVja3MoKS5waXBlKE9iamVjdCh4LmEpKGZ1bmN0aW9uKGUpe3JldHVybiBlP3QucnVuQ2FuQWN0aXZhdGVDaGVja3MoKTpPYmplY3Qocy5hKSghMSl9KSk6T2JqZWN0KHMuYSkoITApfSx0LnByb3RvdHlwZS5yZXNvbHZlRGF0YT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0aGlzLmlzQWN0aXZhdGluZygpP09iamVjdChhLmEpKHRoaXMuY2FuQWN0aXZhdGVDaGVja3MpLnBpcGUoT2JqZWN0KEMuYSkoZnVuY3Rpb24obil7cmV0dXJuIGUucnVuUmVzb2x2ZShuLnJvdXRlLHQpfSksZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49Mj9mdW5jdGlvbihuKXtyZXR1cm4gT2JqZWN0KFUuYSkoTCh0LGUpLGsoMSkscChlKSkobil9OmZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QoVS5hKShMKGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdChlLG4scisxKX0pLGsoMSkpKGUpfX0oZnVuY3Rpb24odCxlKXtyZXR1cm4gdH0pKTpPYmplY3Qocy5hKShudWxsKX0sdC5wcm90b3R5cGUuaXNEZWFjdGl2YXRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PXRoaXMuY2FuRGVhY3RpdmF0ZUNoZWNrcy5sZW5ndGh9LHQucHJvdG90eXBlLmlzQWN0aXZhdGluZz1mdW5jdGlvbigpe3JldHVybiAwIT09dGhpcy5jYW5BY3RpdmF0ZUNoZWNrcy5sZW5ndGh9LHQucHJvdG90eXBlLnNldHVwQ2hpbGRSb3V0ZUd1YXJkcz1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLG89bmUoZSk7dC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2kuc2V0dXBSb3V0ZUd1YXJkcyh0LG9bdC52YWx1ZS5vdXRsZXRdLG4sci5jb25jYXQoW3QudmFsdWVdKSksZGVsZXRlIG9bdC52YWx1ZS5vdXRsZXRdfSksdnQobyxmdW5jdGlvbih0LGUpe3JldHVybiBpLmRlYWN0aXZhdGVSb3V0ZUFuZEl0c0NoaWxkcmVuKHQsbi5nZXRDb250ZXh0KGUpKX0pfSx0LnByb3RvdHlwZS5zZXR1cFJvdXRlR3VhcmRzPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXQudmFsdWUsbz1lP2UudmFsdWU6bnVsbCxhPW4/bi5nZXRDb250ZXh0KHQudmFsdWUub3V0bGV0KTpudWxsO2lmKG8mJmkucm91dGVDb25maWc9PT1vLnJvdXRlQ29uZmlnKXt2YXIgcz10aGlzLnNob3VsZFJ1bkd1YXJkc0FuZFJlc29sdmVycyhvLGksaS5yb3V0ZUNvbmZpZy5ydW5HdWFyZHNBbmRSZXNvbHZlcnMpO3M/dGhpcy5jYW5BY3RpdmF0ZUNoZWNrcy5wdXNoKG5ldyBDZShyKSk6KGkuZGF0YT1vLmRhdGEsaS5fcmVzb2x2ZWREYXRhPW8uX3Jlc29sdmVkRGF0YSksdGhpcy5zZXR1cENoaWxkUm91dGVHdWFyZHModCxlLGkuY29tcG9uZW50P2E/YS5jaGlsZHJlbjpudWxsOm4scikscyYmdGhpcy5jYW5EZWFjdGl2YXRlQ2hlY2tzLnB1c2gobmV3IFNlKGEub3V0bGV0LmNvbXBvbmVudCxvKSl9ZWxzZSBvJiZ0aGlzLmRlYWN0aXZhdGVSb3V0ZUFuZEl0c0NoaWxkcmVuKGUsYSksdGhpcy5jYW5BY3RpdmF0ZUNoZWNrcy5wdXNoKG5ldyBDZShyKSksdGhpcy5zZXR1cENoaWxkUm91dGVHdWFyZHModCxudWxsLGkuY29tcG9uZW50P2E/YS5jaGlsZHJlbjpudWxsOm4scil9LHQucHJvdG90eXBlLnNob3VsZFJ1bkd1YXJkc0FuZFJlc29sdmVycz1mdW5jdGlvbih0LGUsbil7c3dpdGNoKG4pe2Nhc2UiYWx3YXlzIjpyZXR1cm4hMDtjYXNlInBhcmFtc09yUXVlcnlQYXJhbXNDaGFuZ2UiOnJldHVybiFoZSh0LGUpfHwhbXQodC5xdWVyeVBhcmFtcyxlLnF1ZXJ5UGFyYW1zKTtjYXNlInBhcmFtc0NoYW5nZSI6ZGVmYXVsdDpyZXR1cm4haGUodCxlKX19LHQucHJvdG90eXBlLmRlYWN0aXZhdGVSb3V0ZUFuZEl0c0NoaWxkcmVuPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPW5lKHQpLGk9dC52YWx1ZTt2dChyLGZ1bmN0aW9uKHQscil7bi5kZWFjdGl2YXRlUm91dGVBbmRJdHNDaGlsZHJlbih0LGkuY29tcG9uZW50P2U/ZS5jaGlsZHJlbi5nZXRDb250ZXh0KHIpOm51bGw6ZSl9KSx0aGlzLmNhbkRlYWN0aXZhdGVDaGVja3MucHVzaChuZXcgU2UoaS5jb21wb25lbnQmJmUmJmUub3V0bGV0JiZlLm91dGxldC5pc0FjdGl2YXRlZD9lLm91dGxldC5jb21wb25lbnQ6bnVsbCxpKSl9LHQucHJvdG90eXBlLnJ1bkNhbkRlYWN0aXZhdGVDaGVja3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiBPYmplY3QoYS5hKSh0aGlzLmNhbkRlYWN0aXZhdGVDaGVja3MpLnBpcGUoT2JqZWN0KHguYSkoZnVuY3Rpb24oZSl7cmV0dXJuIHQucnVuQ2FuRGVhY3RpdmF0ZShlLmNvbXBvbmVudCxlLnJvdXRlKX0pLGooZnVuY3Rpb24odCl7cmV0dXJuITA9PT10fSkpfSx0LnByb3RvdHlwZS5ydW5DYW5BY3RpdmF0ZUNoZWNrcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIE9iamVjdChhLmEpKHRoaXMuY2FuQWN0aXZhdGVDaGVja3MpLnBpcGUoT2JqZWN0KEMuYSkoZnVuY3Rpb24oZSl7cmV0dXJuIGJ0KE9iamVjdChhLmEpKFt0LmZpcmVDaGlsZEFjdGl2YXRpb25TdGFydChlLnJvdXRlLnBhcmVudCksdC5maXJlQWN0aXZhdGlvblN0YXJ0KGUucm91dGUpLHQucnVuQ2FuQWN0aXZhdGVDaGlsZChlLnBhdGgpLHQucnVuQ2FuQWN0aXZhdGUoZS5yb3V0ZSldKSl9KSxqKGZ1bmN0aW9uKHQpe3JldHVybiEwPT09dH0pKX0sdC5wcm90b3R5cGUuZmlyZUFjdGl2YXRpb25TdGFydD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXQmJnRoaXMuZm9yd2FyZEV2ZW50JiZ0aGlzLmZvcndhcmRFdmVudChuZXcgcnQodCkpLE9iamVjdChzLmEpKCEwKX0sdC5wcm90b3R5cGUuZmlyZUNoaWxkQWN0aXZhdGlvblN0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dCYmdGhpcy5mb3J3YXJkRXZlbnQmJnRoaXMuZm9yd2FyZEV2ZW50KG5ldyBldCh0KSksT2JqZWN0KHMuYSkoITApfSx0LnByb3RvdHlwZS5ydW5DYW5BY3RpdmF0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dC5yb3V0ZUNvbmZpZz90LnJvdXRlQ29uZmlnLmNhbkFjdGl2YXRlOm51bGw7cmV0dXJuIG4mJjAhPT1uLmxlbmd0aD9idChPYmplY3QoYS5hKShuKS5waXBlKE9iamVjdChPLmEpKGZ1bmN0aW9uKG4pe3ZhciByPWUuZ2V0VG9rZW4obix0KTtyZXR1cm4gX3Qoci5jYW5BY3RpdmF0ZT9yLmNhbkFjdGl2YXRlKHQsZS5mdXR1cmUpOnIodCxlLmZ1dHVyZSkpLnBpcGUodygpKX0pKSk6T2JqZWN0KHMuYSkoITApfSx0LnByb3RvdHlwZS5ydW5DYW5BY3RpdmF0ZUNoaWxkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10W3QubGVuZ3RoLTFdLHI9dC5zbGljZSgwLHQubGVuZ3RoLTEpLnJldmVyc2UoKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGUuZXh0cmFjdENhbkFjdGl2YXRlQ2hpbGQodCl9KS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10fSk7cmV0dXJuIGJ0KE9iamVjdChhLmEpKHIpLnBpcGUoT2JqZWN0KE8uYSkoZnVuY3Rpb24odCl7cmV0dXJuIGJ0KE9iamVjdChhLmEpKHQuZ3VhcmRzKS5waXBlKE9iamVjdChPLmEpKGZ1bmN0aW9uKHIpe3ZhciBpPWUuZ2V0VG9rZW4ocix0Lm5vZGUpO3JldHVybiBfdChpLmNhbkFjdGl2YXRlQ2hpbGQ/aS5jYW5BY3RpdmF0ZUNoaWxkKG4sZS5mdXR1cmUpOmkobixlLmZ1dHVyZSkpLnBpcGUodygpKX0pKSl9KSkpfSx0LnByb3RvdHlwZS5leHRyYWN0Q2FuQWN0aXZhdGVDaGlsZD1mdW5jdGlvbih0KXt2YXIgZT10LnJvdXRlQ29uZmlnP3Qucm91dGVDb25maWcuY2FuQWN0aXZhdGVDaGlsZDpudWxsO3JldHVybiBlJiYwIT09ZS5sZW5ndGg/e25vZGU6dCxndWFyZHM6ZX06bnVsbH0sdC5wcm90b3R5cGUucnVuQ2FuRGVhY3RpdmF0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1lJiZlLnJvdXRlQ29uZmlnP2Uucm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZTpudWxsO3JldHVybiByJiYwIT09ci5sZW5ndGg/T2JqZWN0KGEuYSkocikucGlwZShPYmplY3QoeC5hKShmdW5jdGlvbihyKXt2YXIgaT1uLmdldFRva2VuKHIsZSk7cmV0dXJuIF90KGkuY2FuRGVhY3RpdmF0ZT9pLmNhbkRlYWN0aXZhdGUodCxlLG4uY3VycixuLmZ1dHVyZSk6aSh0LGUsbi5jdXJyLG4uZnV0dXJlKSkucGlwZSh3KCkpfSkpLnBpcGUoaihmdW5jdGlvbih0KXtyZXR1cm4hMD09PXR9KSk6T2JqZWN0KHMuYSkoITApfSx0LnByb3RvdHlwZS5ydW5SZXNvbHZlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVzb2x2ZU5vZGUodC5fcmVzb2x2ZSx0KS5waXBlKE9iamVjdChPLmEpKGZ1bmN0aW9uKG4pe3JldHVybiB0Ll9yZXNvbHZlZERhdGE9bix0LmRhdGE9T2JqZWN0KHIuYSkoe30sdC5kYXRhLGFlKHQsZSkucmVzb2x2ZSksbnVsbH0pKX0sdC5wcm90b3R5cGUucmVzb2x2ZU5vZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9T2JqZWN0LmtleXModCk7aWYoMD09PXIubGVuZ3RoKXJldHVybiBPYmplY3Qocy5hKSh7fSk7aWYoMT09PXIubGVuZ3RoKXt2YXIgaT1yWzBdO3JldHVybiB0aGlzLmdldFJlc29sdmVyKHRbaV0sZSkucGlwZShPYmplY3QoTy5hKShmdW5jdGlvbih0KXtyZXR1cm4oZT17fSlbaV09dCxlO3ZhciBlfSkpfXZhciBvPXt9O3JldHVybiBPYmplY3QoYS5hKShyKS5waXBlKE9iamVjdCh4LmEpKGZ1bmN0aW9uKHIpe3JldHVybiBuLmdldFJlc29sdmVyKHRbcl0sZSkucGlwZShPYmplY3QoTy5hKShmdW5jdGlvbih0KXtyZXR1cm4gb1tyXT10LHR9KSl9KSkucGlwZShBKCksT2JqZWN0KE8uYSkoZnVuY3Rpb24oKXtyZXR1cm4gb30pKX0sdC5wcm90b3R5cGUuZ2V0UmVzb2x2ZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldFRva2VuKHQsZSk7cmV0dXJuIF90KG4ucmVzb2x2ZT9uLnJlc29sdmUoZSx0aGlzLmZ1dHVyZSk6bihlLHRoaXMuZnV0dXJlKSl9LHQucHJvdG90eXBlLmdldFRva2VuPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7Zm9yKHZhciBlPXQucGFyZW50O2U7ZT1lLnBhcmVudCl7dmFyIG49ZS5yb3V0ZUNvbmZpZztpZihuJiZuLl9sb2FkZWRDb25maWcpcmV0dXJuIG4uX2xvYWRlZENvbmZpZ31yZXR1cm4gbnVsbH0oZSk7cmV0dXJuKG4/bi5tb2R1bGUuaW5qZWN0b3I6dGhpcy5tb2R1bGVJbmplY3RvcikuZ2V0KHQpfSx0fSgpLGtlPWZ1bmN0aW9uKCl7fSxUZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4scixpKXt0aGlzLnJvb3RDb21wb25lbnRUeXBlPXQsdGhpcy5jb25maWc9ZSx0aGlzLnVybFRyZWU9bix0aGlzLnVybD1yLHRoaXMucGFyYW1zSW5oZXJpdGFuY2VTdHJhdGVneT1pfXJldHVybiB0LnByb3RvdHlwZS5yZWNvZ25pemU9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9amUodGhpcy51cmxUcmVlLnJvb3QsW10sW10sdGhpcy5jb25maWcpLnNlZ21lbnRHcm91cCxlPXRoaXMucHJvY2Vzc1NlZ21lbnRHcm91cCh0aGlzLmNvbmZpZyx0LGF0KSxuPW5ldyBzZShbXSxPYmplY3QuZnJlZXplKHt9KSxPYmplY3QuZnJlZXplKE9iamVjdChyLmEpKHt9LHRoaXMudXJsVHJlZS5xdWVyeVBhcmFtcykpLHRoaXMudXJsVHJlZS5mcmFnbWVudCx7fSxhdCx0aGlzLnJvb3RDb21wb25lbnRUeXBlLG51bGwsdGhpcy51cmxUcmVlLnJvb3QsLTEse30pLGk9bmV3IGVlKG4sZSksbz1uZXcgdWUodGhpcy51cmwsaSk7cmV0dXJuIHRoaXMuaW5oZXJpdFBhcmFtc0FuZERhdGEoby5fcm9vdCksT2JqZWN0KHMuYSkobyl9Y2F0Y2godCl7cmV0dXJuIG5ldyBsLmEoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZXJyb3IodCl9KX19LHQucHJvdG90eXBlLmluaGVyaXRQYXJhbXNBbmREYXRhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10LnZhbHVlLHI9YWUobix0aGlzLnBhcmFtc0luaGVyaXRhbmNlU3RyYXRlZ3kpO24ucGFyYW1zPU9iamVjdC5mcmVlemUoci5wYXJhbXMpLG4uZGF0YT1PYmplY3QuZnJlZXplKHIuZGF0YSksdC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmluaGVyaXRQYXJhbXNBbmREYXRhKHQpfSl9LHQucHJvdG90eXBlLnByb2Nlc3NTZWdtZW50R3JvdXA9ZnVuY3Rpb24odCxlLG4pe3JldHVybiAwPT09ZS5zZWdtZW50cy5sZW5ndGgmJmUuaGFzQ2hpbGRyZW4oKT90aGlzLnByb2Nlc3NDaGlsZHJlbih0LGUpOnRoaXMucHJvY2Vzc1NlZ21lbnQodCxlLGUuc2VnbWVudHMsbil9LHQucHJvdG90eXBlLnByb2Nlc3NDaGlsZHJlbj1mdW5jdGlvbih0LGUpe3ZhciBuLHI9dGhpcyxpPUV0KGUsZnVuY3Rpb24oZSxuKXtyZXR1cm4gci5wcm9jZXNzU2VnbWVudEdyb3VwKHQsZSxuKX0pO3JldHVybiBuPXt9LGkuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT1uW3QudmFsdWUub3V0bGV0XTtpZihlKXt2YXIgcj1lLnVybC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudG9TdHJpbmcoKX0pLmpvaW4oIi8iKSxpPXQudmFsdWUudXJsLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50b1N0cmluZygpfSkuam9pbigiLyIpO3Rocm93IG5ldyBFcnJvcigiVHdvIHNlZ21lbnRzIGNhbm5vdCBoYXZlIHRoZSBzYW1lIG91dGxldCBuYW1lOiAnIityKyInIGFuZCAnIitpKyInLiIpfW5bdC52YWx1ZS5vdXRsZXRdPXQudmFsdWV9KSxpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC52YWx1ZS5vdXRsZXQ9PT1hdD8tMTplLnZhbHVlLm91dGxldD09PWF0PzE6dC52YWx1ZS5vdXRsZXQubG9jYWxlQ29tcGFyZShlLnZhbHVlLm91dGxldCl9KSxpfSx0LnByb3RvdHlwZS5wcm9jZXNzU2VnbWVudD1mdW5jdGlvbih0LGUsbixpKXt0cnl7Zm9yKHZhciBvPU9iamVjdChyLmUpKHQpLGE9by5uZXh0KCk7IWEuZG9uZTthPW8ubmV4dCgpKXt2YXIgcz1hLnZhbHVlO3RyeXtyZXR1cm4gdGhpcy5wcm9jZXNzU2VnbWVudEFnYWluc3RSb3V0ZShzLGUsbixpKX1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBrZSkpdGhyb3cgdH19fWNhdGNoKHQpe3U9e2Vycm9yOnR9fWZpbmFsbHl7dHJ5e2EmJiFhLmRvbmUmJihsPW8ucmV0dXJuKSYmbC5jYWxsKG8pfWZpbmFsbHl7aWYodSl0aHJvdyB1LmVycm9yfX1pZih0aGlzLm5vTGVmdG92ZXJzSW5VcmwoZSxuLGkpKXJldHVybltdO3Rocm93IG5ldyBrZTt2YXIgdSxsfSx0LnByb3RvdHlwZS5ub0xlZnRvdmVyc0luVXJsPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMD09PWUubGVuZ3RoJiYhdC5jaGlsZHJlbltuXX0sdC5wcm90b3R5cGUucHJvY2Vzc1NlZ21lbnRBZ2FpbnN0Um91dGU9ZnVuY3Rpb24odCxlLG4saSl7aWYodC5yZWRpcmVjdFRvKXRocm93IG5ldyBrZTtpZigodC5vdXRsZXR8fGF0KSE9PWkpdGhyb3cgbmV3IGtlO3ZhciBvLGE9W10scz1bXTtpZigiKioiPT09dC5wYXRoKXt2YXIgdT1uLmxlbmd0aD4wP2d0KG4pLnBhcmFtZXRlcnM6e307bz1uZXcgc2Uobix1LE9iamVjdC5mcmVlemUoT2JqZWN0KHIuYSkoe30sdGhpcy51cmxUcmVlLnF1ZXJ5UGFyYW1zKSksdGhpcy51cmxUcmVlLmZyYWdtZW50LE5lKHQpLGksdC5jb21wb25lbnQsdCxJZShlKSxBZShlKStuLmxlbmd0aCxSZSh0KSl9ZWxzZXt2YXIgbD1mdW5jdGlvbih0LGUsbil7aWYoIiI9PT1lLnBhdGgpe2lmKCJmdWxsIj09PWUucGF0aE1hdGNoJiYodC5oYXNDaGlsZHJlbigpfHxuLmxlbmd0aD4wKSl0aHJvdyBuZXcga2U7cmV0dXJue2NvbnN1bWVkU2VnbWVudHM6W10sbGFzdENoaWxkOjAscGFyYW1ldGVyczp7fX19dmFyIGk9KGUubWF0Y2hlcnx8bHQpKG4sdCxlKTtpZighaSl0aHJvdyBuZXcga2U7dmFyIG89e307dnQoaS5wb3NQYXJhbXMsZnVuY3Rpb24odCxlKXtvW2VdPXQucGF0aH0pO3ZhciBhPWkuY29uc3VtZWQubGVuZ3RoPjA/T2JqZWN0KHIuYSkoe30sbyxpLmNvbnN1bWVkW2kuY29uc3VtZWQubGVuZ3RoLTFdLnBhcmFtZXRlcnMpOm87cmV0dXJue2NvbnN1bWVkU2VnbWVudHM6aS5jb25zdW1lZCxsYXN0Q2hpbGQ6aS5jb25zdW1lZC5sZW5ndGgscGFyYW1ldGVyczphfX0oZSx0LG4pO2E9bC5jb25zdW1lZFNlZ21lbnRzLHM9bi5zbGljZShsLmxhc3RDaGlsZCksbz1uZXcgc2UoYSxsLnBhcmFtZXRlcnMsT2JqZWN0LmZyZWV6ZShPYmplY3Qoci5hKSh7fSx0aGlzLnVybFRyZWUucXVlcnlQYXJhbXMpKSx0aGlzLnVybFRyZWUuZnJhZ21lbnQsTmUodCksaSx0LmNvbXBvbmVudCx0LEllKGUpLEFlKGUpK2EubGVuZ3RoLFJlKHQpKX12YXIgYz1mdW5jdGlvbih0KXtyZXR1cm4gdC5jaGlsZHJlbj90LmNoaWxkcmVuOnQubG9hZENoaWxkcmVuP3QuX2xvYWRlZENvbmZpZy5yb3V0ZXM6W119KHQpLGY9amUoZSxhLHMsYyksaD1mLnNlZ21lbnRHcm91cCxkPWYuc2xpY2VkU2VnbWVudHM7aWYoMD09PWQubGVuZ3RoJiZoLmhhc0NoaWxkcmVuKCkpe3ZhciBwPXRoaXMucHJvY2Vzc0NoaWxkcmVuKGMsaCk7cmV0dXJuW25ldyBlZShvLHApXX1pZigwPT09Yy5sZW5ndGgmJjA9PT1kLmxlbmd0aClyZXR1cm5bbmV3IGVlKG8sW10pXTt2YXIgbT10aGlzLnByb2Nlc3NTZWdtZW50KGMsaCxkLGF0KTtyZXR1cm5bbmV3IGVlKG8sbSldfSx0fSgpO2Z1bmN0aW9uIEllKHQpe2Zvcih2YXIgZT10O2UuX3NvdXJjZVNlZ21lbnQ7KWU9ZS5fc291cmNlU2VnbWVudDtyZXR1cm4gZX1mdW5jdGlvbiBBZSh0KXtmb3IodmFyIGU9dCxuPWUuX3NlZ21lbnRJbmRleFNoaWZ0P2UuX3NlZ21lbnRJbmRleFNoaWZ0OjA7ZS5fc291cmNlU2VnbWVudDspbis9KGU9ZS5fc291cmNlU2VnbWVudCkuX3NlZ21lbnRJbmRleFNoaWZ0P2UuX3NlZ21lbnRJbmRleFNoaWZ0OjA7cmV0dXJuIG4tMX1mdW5jdGlvbiBqZSh0LGUsbixpKXtpZihuLmxlbmd0aD4wJiZmdW5jdGlvbih0LGUsbil7cmV0dXJuIGkuc29tZShmdW5jdGlvbihuKXtyZXR1cm4gUGUodCxlLG4pJiZNZShuKSE9PWF0fSl9KHQsbikpe3ZhciBvPW5ldyBPdChlLGZ1bmN0aW9uKHQsZSxuLGkpe3ZhciBvLGEscz17fTtzW2F0XT1pLGkuX3NvdXJjZVNlZ21lbnQ9dCxpLl9zZWdtZW50SW5kZXhTaGlmdD1lLmxlbmd0aDt0cnl7Zm9yKHZhciB1PU9iamVjdChyLmUpKG4pLGw9dS5uZXh0KCk7IWwuZG9uZTtsPXUubmV4dCgpKXt2YXIgYz1sLnZhbHVlO2lmKCIiPT09Yy5wYXRoJiZNZShjKSE9PWF0KXt2YXIgZj1uZXcgT3QoW10se30pO2YuX3NvdXJjZVNlZ21lbnQ9dCxmLl9zZWdtZW50SW5kZXhTaGlmdD1lLmxlbmd0aCxzW01lKGMpXT1mfX19Y2F0Y2godCl7bz17ZXJyb3I6dH19ZmluYWxseXt0cnl7bCYmIWwuZG9uZSYmKGE9dS5yZXR1cm4pJiZhLmNhbGwodSl9ZmluYWxseXtpZihvKXRocm93IG8uZXJyb3J9fXJldHVybiBzfSh0LGUsaSxuZXcgT3Qobix0LmNoaWxkcmVuKSkpO3JldHVybiBvLl9zb3VyY2VTZWdtZW50PXQsby5fc2VnbWVudEluZGV4U2hpZnQ9ZS5sZW5ndGgse3NlZ21lbnRHcm91cDpvLHNsaWNlZFNlZ21lbnRzOltdfX1pZigwPT09bi5sZW5ndGgmJmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaS5zb21lKGZ1bmN0aW9uKG4pe3JldHVybiBQZSh0LGUsbil9KX0odCxuKSl7dmFyIGE9bmV3IE90KHQuc2VnbWVudHMsZnVuY3Rpb24odCxlLG4saSl7dmFyIG8sYSxzPXt9O3RyeXtmb3IodmFyIHU9T2JqZWN0KHIuZSkobiksbD11Lm5leHQoKTshbC5kb25lO2w9dS5uZXh0KCkpe3ZhciBjPWwudmFsdWU7aWYoUGUodCxlLGMpJiYhaVtNZShjKV0pe3ZhciBmPW5ldyBPdChbXSx7fSk7Zi5fc291cmNlU2VnbWVudD10LGYuX3NlZ21lbnRJbmRleFNoaWZ0PXQuc2VnbWVudHMubGVuZ3RoLHNbTWUoYyldPWZ9fX1jYXRjaCh0KXtvPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtsJiYhbC5kb25lJiYoYT11LnJldHVybikmJmEuY2FsbCh1KX1maW5hbGx5e2lmKG8pdGhyb3cgby5lcnJvcn19cmV0dXJuIE9iamVjdChyLmEpKHt9LGkscyl9KHQsbixpLHQuY2hpbGRyZW4pKTtyZXR1cm4gYS5fc291cmNlU2VnbWVudD10LGEuX3NlZ21lbnRJbmRleFNoaWZ0PWUubGVuZ3RoLHtzZWdtZW50R3JvdXA6YSxzbGljZWRTZWdtZW50czpufX12YXIgcz1uZXcgT3QodC5zZWdtZW50cyx0LmNoaWxkcmVuKTtyZXR1cm4gcy5fc291cmNlU2VnbWVudD10LHMuX3NlZ21lbnRJbmRleFNoaWZ0PWUubGVuZ3RoLHtzZWdtZW50R3JvdXA6cyxzbGljZWRTZWdtZW50czpufX1mdW5jdGlvbiBQZSh0LGUsbil7cmV0dXJuKCEodC5oYXNDaGlsZHJlbigpfHxlLmxlbmd0aD4wKXx8ImZ1bGwiIT09bi5wYXRoTWF0Y2gpJiYiIj09PW4ucGF0aCYmdm9pZCAwPT09bi5yZWRpcmVjdFRvfWZ1bmN0aW9uIE1lKHQpe3JldHVybiB0Lm91dGxldHx8YXR9ZnVuY3Rpb24gTmUodCl7cmV0dXJuIHQuZGF0YXx8e319ZnVuY3Rpb24gUmUodCl7cmV0dXJuIHQucmVzb2x2ZXx8e319dmFyIERlPWZ1bmN0aW9uKCl7fSxMZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLnNob3VsZERldGFjaD1mdW5jdGlvbih0KXtyZXR1cm4hMX0sdC5wcm90b3R5cGUuc3RvcmU9ZnVuY3Rpb24odCxlKXt9LHQucHJvdG90eXBlLnNob3VsZEF0dGFjaD1mdW5jdGlvbih0KXtyZXR1cm4hMX0sdC5wcm90b3R5cGUucmV0cmlldmU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGx9LHQucHJvdG90eXBlLnNob3VsZFJldXNlUm91dGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5yb3V0ZUNvbmZpZz09PWUucm91dGVDb25maWd9LHR9KCksRmU9bmV3IGkubygiUk9VVEVTIiksVmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLHIpe3RoaXMubG9hZGVyPXQsdGhpcy5jb21waWxlcj1lLHRoaXMub25Mb2FkU3RhcnRMaXN0ZW5lcj1uLHRoaXMub25Mb2FkRW5kTGlzdGVuZXI9cn1yZXR1cm4gdC5wcm90b3R5cGUubG9hZD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7cmV0dXJuIHRoaXMub25Mb2FkU3RhcnRMaXN0ZW5lciYmdGhpcy5vbkxvYWRTdGFydExpc3RlbmVyKGUpLHRoaXMubG9hZE1vZHVsZUZhY3RvcnkoZS5sb2FkQ2hpbGRyZW4pLnBpcGUoT2JqZWN0KE8uYSkoZnVuY3Rpb24ocil7bi5vbkxvYWRFbmRMaXN0ZW5lciYmbi5vbkxvYWRFbmRMaXN0ZW5lcihlKTt2YXIgaT1yLmNyZWF0ZSh0KTtyZXR1cm4gbmV3IGN0KHl0KGkuaW5qZWN0b3IuZ2V0KEZlKSkubWFwKHB0KSxpKX0pKX0sdC5wcm90b3R5cGUubG9hZE1vZHVsZUZhY3Rvcnk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/T2JqZWN0KGEuYSkodGhpcy5sb2FkZXIubG9hZCh0KSk6X3QodCgpKS5waXBlKE9iamVjdCh4LmEpKGZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgaS50P09iamVjdChzLmEpKHQpOk9iamVjdChhLmEpKGUuY29tcGlsZXIuY29tcGlsZU1vZHVsZUFzeW5jKHQpKX0pKX0sdH0oKSxVZT1mdW5jdGlvbigpe30semU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5zaG91bGRQcm9jZXNzVXJsPWZ1bmN0aW9uKHQpe3JldHVybiEwfSx0LnByb3RvdHlwZS5leHRyYWN0PWZ1bmN0aW9uKHQpe3JldHVybiB0fSx0LnByb3RvdHlwZS5tZXJnZT1mdW5jdGlvbih0LGUpe3JldHVybiB0fSx0fSgpO2Z1bmN0aW9uIEJlKHQpe3Rocm93IHR9ZnVuY3Rpb24gSGUodCxlLG4pe3JldHVybiBlLnBhcnNlKCIvIil9ZnVuY3Rpb24gV2UodCl7cmV0dXJuIE9iamVjdChzLmEpKG51bGwpfXZhciBxZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4scixhLHMsbCxjKXt2YXIgZj10aGlzO3RoaXMucm9vdENvbXBvbmVudFR5cGU9dCx0aGlzLnVybFNlcmlhbGl6ZXI9ZSx0aGlzLnJvb3RDb250ZXh0cz1uLHRoaXMubG9jYXRpb249cix0aGlzLmNvbmZpZz1jLHRoaXMubmF2aWdhdGlvbnM9bmV3IG8uYShudWxsKSx0aGlzLm5hdmlnYXRpb25JZD0wLHRoaXMuZXZlbnRzPW5ldyB1LmEsdGhpcy5lcnJvckhhbmRsZXI9QmUsdGhpcy5tYWxmb3JtZWRVcmlFcnJvckhhbmRsZXI9SGUsdGhpcy5uYXZpZ2F0ZWQ9ITEsdGhpcy5sYXN0U3VjY2Vzc2Z1bElkPS0xLHRoaXMuaG9va3M9e2JlZm9yZVByZWFjdGl2YXRpb246V2UsYWZ0ZXJQcmVhY3RpdmF0aW9uOldlfSx0aGlzLnVybEhhbmRsaW5nU3RyYXRlZ3k9bmV3IHplLHRoaXMucm91dGVSZXVzZVN0cmF0ZWd5PW5ldyBMZSx0aGlzLm9uU2FtZVVybE5hdmlnYXRpb249Imlnbm9yZSIsdGhpcy5wYXJhbXNJbmhlcml0YW5jZVN0cmF0ZWd5PSJlbXB0eU9ubHkiLHRoaXMubmdNb2R1bGU9YS5nZXQoaS52KSx0aGlzLnJlc2V0Q29uZmlnKGMpLHRoaXMuY3VycmVudFVybFRyZWU9bmV3IHh0KG5ldyBPdChbXSx7fSkse30sbnVsbCksdGhpcy5yYXdVcmxUcmVlPXRoaXMuY3VycmVudFVybFRyZWUsdGhpcy5jb25maWdMb2FkZXI9bmV3IFZlKHMsbCxmdW5jdGlvbih0KXtyZXR1cm4gZi50cmlnZ2VyRXZlbnQobmV3IEoodCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gZi50cmlnZ2VyRXZlbnQobmV3IHR0KHQpKX0pLHRoaXMucm91dGVyU3RhdGU9aWUodGhpcy5jdXJyZW50VXJsVHJlZSx0aGlzLnJvb3RDb21wb25lbnRUeXBlKSx0aGlzLnByb2Nlc3NOYXZpZ2F0aW9ucygpfXJldHVybiB0LnByb3RvdHlwZS5yZXNldFJvb3RDb21wb25lbnRUeXBlPWZ1bmN0aW9uKHQpe3RoaXMucm9vdENvbXBvbmVudFR5cGU9dCx0aGlzLnJvdXRlclN0YXRlLnJvb3QuY29tcG9uZW50PXRoaXMucm9vdENvbXBvbmVudFR5cGV9LHQucHJvdG90eXBlLmluaXRpYWxOYXZpZ2F0aW9uPWZ1bmN0aW9uKCl7dGhpcy5zZXRVcExvY2F0aW9uQ2hhbmdlTGlzdGVuZXIoKSwwPT09dGhpcy5uYXZpZ2F0aW9uSWQmJnRoaXMubmF2aWdhdGVCeVVybCh0aGlzLmxvY2F0aW9uLnBhdGgoITApLHtyZXBsYWNlVXJsOiEwfSl9LHQucHJvdG90eXBlLnNldFVwTG9jYXRpb25DaGFuZ2VMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5sb2NhdGlvblN1YnNjcmlwdGlvbnx8KHRoaXMubG9jYXRpb25TdWJzY3JpcHRpb249dGhpcy5sb2NhdGlvbi5zdWJzY3JpYmUoZnVuY3Rpb24oZSl7dmFyIG49dC5wYXJzZVVybChlLnVybCkscj0icG9wc3RhdGUiPT09ZS50eXBlPyJwb3BzdGF0ZSI6Imhhc2hjaGFuZ2UiLGk9ZS5zdGF0ZSYmZS5zdGF0ZS5uYXZpZ2F0aW9uSWQ/e25hdmlnYXRpb25JZDplLnN0YXRlLm5hdmlnYXRpb25JZH06bnVsbDtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5zY2hlZHVsZU5hdmlnYXRpb24obixyLGkse3JlcGxhY2VVcmw6ITB9KX0sMCl9KSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwidXJsIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VyaWFsaXplVXJsKHRoaXMuY3VycmVudFVybFRyZWUpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLnRyaWdnZXJFdmVudD1mdW5jdGlvbih0KXt0aGlzLmV2ZW50cy5uZXh0KHQpfSx0LnByb3RvdHlwZS5yZXNldENvbmZpZz1mdW5jdGlvbih0KXtmdCh0KSx0aGlzLmNvbmZpZz10Lm1hcChwdCksdGhpcy5uYXZpZ2F0ZWQ9ITEsdGhpcy5sYXN0U3VjY2Vzc2Z1bElkPS0xfSx0LnByb3RvdHlwZS5uZ09uRGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZGlzcG9zZSgpfSx0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5sb2NhdGlvblN1YnNjcmlwdGlvbiYmKHRoaXMubG9jYXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLmxvY2F0aW9uU3Vic2NyaXB0aW9uPW51bGwpfSx0LnByb3RvdHlwZS5jcmVhdGVVcmxUcmVlPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUucmVsYXRpdmVUbyxvPWUucXVlcnlQYXJhbXMsYT1lLmZyYWdtZW50LHM9ZS5wcmVzZXJ2ZVF1ZXJ5UGFyYW1zLHU9ZS5xdWVyeVBhcmFtc0hhbmRsaW5nLGw9ZS5wcmVzZXJ2ZUZyYWdtZW50O09iamVjdChpLlcpKCkmJnMmJmNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKCJwcmVzZXJ2ZVF1ZXJ5UGFyYW1zIGlzIGRlcHJlY2F0ZWQsIHVzZSBxdWVyeVBhcmFtc0hhbmRsaW5nIGluc3RlYWQuIik7dmFyIGM9bnx8dGhpcy5yb3V0ZXJTdGF0ZS5yb290LGY9bD90aGlzLmN1cnJlbnRVcmxUcmVlLmZyYWdtZW50OmEsaD1udWxsO2lmKHUpc3dpdGNoKHUpe2Nhc2UibWVyZ2UiOmg9T2JqZWN0KHIuYSkoe30sdGhpcy5jdXJyZW50VXJsVHJlZS5xdWVyeVBhcmFtcyxvKTticmVhaztjYXNlInByZXNlcnZlIjpoPXRoaXMuY3VycmVudFVybFRyZWUucXVlcnlQYXJhbXM7YnJlYWs7ZGVmYXVsdDpoPW98fG51bGx9ZWxzZSBoPXM/dGhpcy5jdXJyZW50VXJsVHJlZS5xdWVyeVBhcmFtczpvfHxudWxsO3JldHVybiBudWxsIT09aCYmKGg9dGhpcy5yZW1vdmVFbXB0eVByb3BzKGgpKSxmdW5jdGlvbih0LGUsbixpLG8pe2lmKDA9PT1uLmxlbmd0aClyZXR1cm4gcGUoZS5yb290LGUucm9vdCxlLGksbyk7dmFyIGE9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0WzBdJiYxPT09dC5sZW5ndGgmJiIvIj09PXRbMF0pcmV0dXJuIG5ldyBtZSghMCwwLHQpO3ZhciBlPTAsbj0hMSxpPXQucmVkdWNlKGZ1bmN0aW9uKHQsaSxvKXtpZigib2JqZWN0Ij09dHlwZW9mIGkmJm51bGwhPWkpe2lmKGkub3V0bGV0cyl7dmFyIGE9e307cmV0dXJuIHZ0KGkub3V0bGV0cyxmdW5jdGlvbih0LGUpe2FbZV09InN0cmluZyI9PXR5cGVvZiB0P3Quc3BsaXQoIi8iKTp0fSksT2JqZWN0KHIuZCkodCxbe291dGxldHM6YX1dKX1pZihpLnNlZ21lbnRQYXRoKXJldHVybiBPYmplY3Qoci5kKSh0LFtpLnNlZ21lbnRQYXRoXSl9cmV0dXJuInN0cmluZyIhPXR5cGVvZiBpP09iamVjdChyLmQpKHQsW2ldKTowPT09bz8oaS5zcGxpdCgiLyIpLmZvckVhY2goZnVuY3Rpb24ocixpKXswPT1pJiYiLiI9PT1yfHwoMD09aSYmIiI9PT1yP249ITA6Ii4uIj09PXI/ZSsrOiIiIT1yJiZ0LnB1c2gocikpfSksdCk6T2JqZWN0KHIuZCkodCxbaV0pfSxbXSk7cmV0dXJuIG5ldyBtZShuLGUsaSl9KG4pO2lmKGEudG9Sb290KCkpcmV0dXJuIHBlKGUucm9vdCxuZXcgT3QoW10se30pLGUsaSxvKTt2YXIgcz1mdW5jdGlvbih0LG4scil7aWYodC5pc0Fic29sdXRlKXJldHVybiBuZXcgeWUoZS5yb290LCEwLDApO2lmKC0xPT09ci5zbmFwc2hvdC5fbGFzdFBhdGhJbmRleClyZXR1cm4gbmV3IHllKHIuc25hcHNob3QuX3VybFNlZ21lbnQsITAsMCk7dmFyIGk9ZGUodC5jb21tYW5kc1swXSk/MDoxO3JldHVybiBmdW5jdGlvbihlLG4sbyl7Zm9yKHZhciBhPXIuc25hcHNob3QuX3VybFNlZ21lbnQscz1yLnNuYXBzaG90Ll9sYXN0UGF0aEluZGV4K2ksdT10Lm51bWJlck9mRG91YmxlRG90czt1PnM7KXtpZih1LT1zLCEoYT1hLnBhcmVudCkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG51bWJlciBvZiAnLi4vJyIpO3M9YS5zZWdtZW50cy5sZW5ndGh9cmV0dXJuIG5ldyB5ZShhLCExLHMtdSl9KCl9KGEsMCx0KSx1PXMucHJvY2Vzc0NoaWxkcmVuP2JlKHMuc2VnbWVudEdyb3VwLHMuaW5kZXgsYS5jb21tYW5kcyk6dmUocy5zZWdtZW50R3JvdXAscy5pbmRleCxhLmNvbW1hbmRzKTtyZXR1cm4gcGUocy5zZWdtZW50R3JvdXAsdSxlLGksbyl9KGMsdGhpcy5jdXJyZW50VXJsVHJlZSx0LGgsZil9LHQucHJvdG90eXBlLm5hdmlnYXRlQnlVcmw9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT17c2tpcExvY2F0aW9uQ2hhbmdlOiExfSk7dmFyIG49dCBpbnN0YW5jZW9mIHh0P3Q6dGhpcy5wYXJzZVVybCh0KSxyPXRoaXMudXJsSGFuZGxpbmdTdHJhdGVneS5tZXJnZShuLHRoaXMucmF3VXJsVHJlZSk7cmV0dXJuIHRoaXMuc2NoZWR1bGVOYXZpZ2F0aW9uKHIsImltcGVyYXRpdmUiLG51bGwsZSl9LHQucHJvdG90eXBlLm5hdmlnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXtza2lwTG9jYXRpb25DaGFuZ2U6ITF9KSxmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIG49dFtlXTtpZihudWxsPT1uKXRocm93IG5ldyBFcnJvcigiVGhlIHJlcXVlc3RlZCBwYXRoIGNvbnRhaW5zICIrbisiIHNlZ21lbnQgYXQgaW5kZXggIitlKX19KHQpLHRoaXMubmF2aWdhdGVCeVVybCh0aGlzLmNyZWF0ZVVybFRyZWUodCxlKSxlKX0sdC5wcm90b3R5cGUuc2VyaWFsaXplVXJsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnVybFNlcmlhbGl6ZXIuc2VyaWFsaXplKHQpfSx0LnByb3RvdHlwZS5wYXJzZVVybD1mdW5jdGlvbih0KXt2YXIgZTt0cnl7ZT10aGlzLnVybFNlcmlhbGl6ZXIucGFyc2UodCl9Y2F0Y2gobil7ZT10aGlzLm1hbGZvcm1lZFVyaUVycm9ySGFuZGxlcihuLHRoaXMudXJsU2VyaWFsaXplcix0KX1yZXR1cm4gZX0sdC5wcm90b3R5cGUuaXNBY3RpdmU9ZnVuY3Rpb24odCxlKXtpZih0IGluc3RhbmNlb2YgeHQpcmV0dXJuIHd0KHRoaXMuY3VycmVudFVybFRyZWUsdCxlKTt2YXIgbj10aGlzLnBhcnNlVXJsKHQpO3JldHVybiB3dCh0aGlzLmN1cnJlbnRVcmxUcmVlLG4sZSl9LHQucHJvdG90eXBlLnJlbW92ZUVtcHR5UHJvcHM9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpLnJlZHVjZShmdW5jdGlvbihlLG4pe3ZhciByPXRbbl07cmV0dXJuIG51bGwhPT1yJiZ2b2lkIDAhPT1yJiYoZVtuXT1yKSxlfSx7fSl9LHQucHJvdG90eXBlLnByb2Nlc3NOYXZpZ2F0aW9ucz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5uYXZpZ2F0aW9ucy5waXBlKE9iamVjdChDLmEpKGZ1bmN0aW9uKGUpe3JldHVybiBlPyh0LmV4ZWN1dGVTY2hlZHVsZWROYXZpZ2F0aW9uKGUpLGUucHJvbWlzZS5jYXRjaChmdW5jdGlvbigpe30pKTpPYmplY3Qocy5hKShudWxsKX0pKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXt9KX0sdC5wcm90b3R5cGUuc2NoZWR1bGVOYXZpZ2F0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXMubmF2aWdhdGlvbnMudmFsdWU7aWYoaSYmImltcGVyYXRpdmUiIT09ZSYmImltcGVyYXRpdmUiPT09aS5zb3VyY2UmJmkucmF3VXJsLnRvU3RyaW5nKCk9PT10LnRvU3RyaW5nKCkpcmV0dXJuIFByb21pc2UucmVzb2x2ZSghMCk7aWYoaSYmImhhc2hjaGFuZ2UiPT1lJiYicG9wc3RhdGUiPT09aS5zb3VyY2UmJmkucmF3VXJsLnRvU3RyaW5nKCk9PT10LnRvU3RyaW5nKCkpcmV0dXJuIFByb21pc2UucmVzb2x2ZSghMCk7aWYoaSYmInBvcHN0YXRlIj09ZSYmImhhc2hjaGFuZ2UiPT09aS5zb3VyY2UmJmkucmF3VXJsLnRvU3RyaW5nKCk9PT10LnRvU3RyaW5nKCkpcmV0dXJuIFByb21pc2UucmVzb2x2ZSghMCk7dmFyIG89bnVsbCxhPW51bGwscz1uZXcgUHJvbWlzZShmdW5jdGlvbih0LGUpe289dCxhPWV9KSx1PSsrdGhpcy5uYXZpZ2F0aW9uSWQ7cmV0dXJuIHRoaXMubmF2aWdhdGlvbnMubmV4dCh7aWQ6dSxzb3VyY2U6ZSxzdGF0ZTpuLHJhd1VybDp0LGV4dHJhczpyLHJlc29sdmU6byxyZWplY3Q6YSxwcm9taXNlOnN9KSxzLmNhdGNoKGZ1bmN0aW9uKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX0pfSx0LnByb3RvdHlwZS5leGVjdXRlU2NoZWR1bGVkTmF2aWdhdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dC5pZCxyPXQucmF3VXJsLGk9dC5leHRyYXMsbz10LnJlc29sdmUsYT10LnJlamVjdCxzPXQuc291cmNlLHU9dC5zdGF0ZSxsPXRoaXMudXJsSGFuZGxpbmdTdHJhdGVneS5leHRyYWN0KHIpLGM9IXRoaXMubmF2aWdhdGVkfHxsLnRvU3RyaW5nKCkhPT10aGlzLmN1cnJlbnRVcmxUcmVlLnRvU3RyaW5nKCk7KCJyZWxvYWQiPT09dGhpcy5vblNhbWVVcmxOYXZpZ2F0aW9ufHxjKSYmdGhpcy51cmxIYW5kbGluZ1N0cmF0ZWd5LnNob3VsZFByb2Nlc3NVcmwocik/KHRoaXMuZXZlbnRzLm5leHQobmV3IFcobix0aGlzLnNlcmlhbGl6ZVVybChsKSxzLHUpKSxQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiBlLnJ1bk5hdmlnYXRlKGwsciwhIWkuc2tpcExvY2F0aW9uQ2hhbmdlLCEhaS5yZXBsYWNlVXJsLG4sbnVsbCl9KS50aGVuKG8sYSkpOmMmJnRoaXMucmF3VXJsVHJlZSYmdGhpcy51cmxIYW5kbGluZ1N0cmF0ZWd5LnNob3VsZFByb2Nlc3NVcmwodGhpcy5yYXdVcmxUcmVlKT8odGhpcy5ldmVudHMubmV4dChuZXcgVyhuLHRoaXMuc2VyaWFsaXplVXJsKGwpLHMsdSkpLFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGUucnVuTmF2aWdhdGUobCxyLCExLCExLG4saWUobCxlLnJvb3RDb21wb25lbnRUeXBlKS5zbmFwc2hvdCl9KS50aGVuKG8sYSkpOih0aGlzLnJhd1VybFRyZWU9cixvKG51bGwpKX0sdC5wcm90b3R5cGUucnVuTmF2aWdhdGU9ZnVuY3Rpb24odCxlLG4saSxhLHUpe3ZhciBsPXRoaXM7cmV0dXJuIGEhPT10aGlzLm5hdmlnYXRpb25JZD8odGhpcy5ldmVudHMubmV4dChuZXcgWShhLHRoaXMuc2VyaWFsaXplVXJsKHQpLCJOYXZpZ2F0aW9uIElEICIrYSsiIGlzIG5vdCBlcXVhbCB0byB0aGUgY3VycmVudCBuYXZpZ2F0aW9uIGlkICIrdGhpcy5uYXZpZ2F0aW9uSWQpKSxQcm9taXNlLnJlc29sdmUoITEpKTpuZXcgUHJvbWlzZShmdW5jdGlvbihjLGYpe3ZhciBoLGQ9KHU/T2JqZWN0KHMuYSkoe2FwcGxpZWRVcmw6dCxzbmFwc2hvdDp1fSk6bmV3IEd0KGwubmdNb2R1bGUuaW5qZWN0b3IsbC5jb25maWdMb2FkZXIsbC51cmxTZXJpYWxpemVyLHQsbC5jb25maWcpLmFwcGx5KCkucGlwZShPYmplY3QoeC5hKShmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gdm9pZCAwPT09aSYmKGk9ImVtcHR5T25seSIpLG5ldyBUZSh0LGUsbixyLGkpLnJlY29nbml6ZSgpfShsLnJvb3RDb21wb25lbnRUeXBlLGwuY29uZmlnLGUsbC5zZXJpYWxpemVVcmwoZSksbC5wYXJhbXNJbmhlcml0YW5jZVN0cmF0ZWd5KS5waXBlKE9iamVjdChPLmEpKGZ1bmN0aW9uKG4pe3JldHVybiBsLmV2ZW50cy5uZXh0KG5ldyBRKGEsbC5zZXJpYWxpemVVcmwodCksbC5zZXJpYWxpemVVcmwoZSksbikpLHthcHBsaWVkVXJsOmUsc25hcHNob3Q6bn19KSl9KSkpLnBpcGUoT2JqZWN0KHguYSkoZnVuY3Rpb24odCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdD9PYmplY3Qocy5hKSh0KTpsLmhvb2tzLmJlZm9yZVByZWFjdGl2YXRpb24odC5zbmFwc2hvdCkucGlwZShPYmplY3QoTy5hKShmdW5jdGlvbigpe3JldHVybiB0fSkpfSkpLnBpcGUoT2JqZWN0KE8uYSkoZnVuY3Rpb24odCl7aWYoImJvb2xlYW4iPT10eXBlb2YgdClyZXR1cm4gdDt2YXIgZT10LmFwcGxpZWRVcmwsbj10LnNuYXBzaG90O3JldHVybihoPW5ldyBFZShuLGwucm91dGVyU3RhdGUuc25hcHNob3QsbC5uZ01vZHVsZS5pbmplY3RvcixmdW5jdGlvbih0KXtyZXR1cm4gbC50cmlnZ2VyRXZlbnQodCl9KSkuaW5pdGlhbGl6ZShsLnJvb3RDb250ZXh0cykse2FwcGxpZWRVcmw6ZSxzbmFwc2hvdDpufX0pKS5waXBlKE9iamVjdCh4LmEpKGZ1bmN0aW9uKGUpe2lmKCJib29sZWFuIj09dHlwZW9mIGV8fGwubmF2aWdhdGlvbklkIT09YSlyZXR1cm4gT2JqZWN0KHMuYSkoITEpO3ZhciBuPWUuYXBwbGllZFVybCxyPWUuc25hcHNob3Q7cmV0dXJuIGwudHJpZ2dlckV2ZW50KG5ldyBLKGEsbC5zZXJpYWxpemVVcmwodCksbC5zZXJpYWxpemVVcmwobikscikpLGguY2hlY2tHdWFyZHMoKS5waXBlKE9iamVjdChPLmEpKGZ1bmN0aW9uKGUpe3JldHVybiBsLnRyaWdnZXJFdmVudChuZXcgWihhLGwuc2VyaWFsaXplVXJsKHQpLGwuc2VyaWFsaXplVXJsKG4pLHIsZSkpLHthcHBsaWVkVXJsOm4sc25hcHNob3Q6cixzaG91bGRBY3RpdmF0ZTplfX0pKX0pKS5waXBlKE9iamVjdCh4LmEpKGZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGV8fGwubmF2aWdhdGlvbklkIT09YT9PYmplY3Qocy5hKSghMSk6ZS5zaG91bGRBY3RpdmF0ZSYmaC5pc0FjdGl2YXRpbmcoKT8obC50cmlnZ2VyRXZlbnQobmV3IFgoYSxsLnNlcmlhbGl6ZVVybCh0KSxsLnNlcmlhbGl6ZVVybChlLmFwcGxpZWRVcmwpLGUuc25hcHNob3QpKSxoLnJlc29sdmVEYXRhKGwucGFyYW1zSW5oZXJpdGFuY2VTdHJhdGVneSkucGlwZShPYmplY3QoTy5hKShmdW5jdGlvbigpe3JldHVybiBsLnRyaWdnZXJFdmVudChuZXcgJChhLGwuc2VyaWFsaXplVXJsKHQpLGwuc2VyaWFsaXplVXJsKGUuYXBwbGllZFVybCksZS5zbmFwc2hvdCkpLGV9KSkpOk9iamVjdChzLmEpKGUpfSkpLnBpcGUoT2JqZWN0KHguYSkoZnVuY3Rpb24odCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdHx8bC5uYXZpZ2F0aW9uSWQhPT1hP09iamVjdChzLmEpKCExKTpsLmhvb2tzLmFmdGVyUHJlYWN0aXZhdGlvbih0LnNuYXBzaG90KS5waXBlKE9iamVjdChPLmEpKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSl9KSkucGlwZShPYmplY3QoTy5hKShmdW5jdGlvbih0KXtpZigiYm9vbGVhbiI9PXR5cGVvZiB0fHxsLm5hdmlnYXRpb25JZCE9PWEpcmV0dXJuITE7dmFyIGUsbixpLHM9dC5hcHBsaWVkVXJsLHU9dC5zaG91bGRBY3RpdmF0ZTtyZXR1cm4gdT97YXBwbGllZFVybDpzLHN0YXRlOihpPWZ1bmN0aW9uIHQoZSxuLGkpe2lmKGkmJmUuc2hvdWxkUmV1c2VSb3V0ZShuLnZhbHVlLGkudmFsdWUuc25hcHNob3QpKXsoYz1pLnZhbHVlKS5fZnV0dXJlU25hcHNob3Q9bi52YWx1ZTt2YXIgYT1mdW5jdGlvbihlLG4saSl7cmV0dXJuIG4uY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKG4pe3RyeXtmb3IodmFyIG89T2JqZWN0KHIuZSkoaS5jaGlsZHJlbiksYT1vLm5leHQoKTshYS5kb25lO2E9by5uZXh0KCkpe3ZhciBzPWEudmFsdWU7aWYoZS5zaG91bGRSZXVzZVJvdXRlKHMudmFsdWUuc25hcHNob3Qsbi52YWx1ZSkpcmV0dXJuIHQoZSxuLHMpfX1jYXRjaCh0KXt1PXtlcnJvcjp0fX1maW5hbGx5e3RyeXthJiYhYS5kb25lJiYobD1vLnJldHVybikmJmwuY2FsbChvKX1maW5hbGx5e2lmKHUpdGhyb3cgdS5lcnJvcn19cmV0dXJuIHQoZSxuKTt2YXIgdSxsfSl9KGUsbixpKTtyZXR1cm4gbmV3IGVlKGMsYSl9dmFyIHM9ZS5yZXRyaWV2ZShuLnZhbHVlKTtpZihzKXt2YXIgdT1zLnJvdXRlO3JldHVybiBmdW5jdGlvbiB0KGUsbil7aWYoZS52YWx1ZS5yb3V0ZUNvbmZpZyE9PW4udmFsdWUucm91dGVDb25maWcpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVhdHRhY2ggQWN0aXZhdGVkUm91dGVTbmFwc2hvdCBjcmVhdGVkIGZyb20gYSBkaWZmZXJlbnQgcm91dGUiKTtpZihlLmNoaWxkcmVuLmxlbmd0aCE9PW4uY2hpbGRyZW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlYXR0YWNoIEFjdGl2YXRlZFJvdXRlU25hcHNob3Qgd2l0aCBhIGRpZmZlcmVudCBudW1iZXIgb2YgY2hpbGRyZW4iKTtuLnZhbHVlLl9mdXR1cmVTbmFwc2hvdD1lLnZhbHVlO2Zvcih2YXIgcj0wO3I8ZS5jaGlsZHJlbi5sZW5ndGg7KytyKXQoZS5jaGlsZHJlbltyXSxuLmNoaWxkcmVuW3JdKX0obix1KSx1fXZhciBsLGM9bmV3IG9lKG5ldyBvLmEoKGw9bi52YWx1ZSkudXJsKSxuZXcgby5hKGwucGFyYW1zKSxuZXcgby5hKGwucXVlcnlQYXJhbXMpLG5ldyBvLmEobC5mcmFnbWVudCksbmV3IG8uYShsLmRhdGEpLGwub3V0bGV0LGwuY29tcG9uZW50LGwpO3JldHVybiBhPW4uY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybiB0KGUsbil9KSxuZXcgZWUoYyxhKX0obC5yb3V0ZVJldXNlU3RyYXRlZ3ksKGU9dC5zbmFwc2hvdCkuX3Jvb3QsKG49bC5yb3V0ZXJTdGF0ZSk/bi5fcm9vdDp2b2lkIDApLG5ldyByZShpLGUpKSxzaG91bGRBY3RpdmF0ZTp1fTp7YXBwbGllZFVybDpzLHN0YXRlOm51bGwsc2hvdWxkQWN0aXZhdGU6dX19KSk7bC5hY3RpdmF0ZVJvdXRlcyhkLGwucm91dGVyU3RhdGUsbC5jdXJyZW50VXJsVHJlZSxhLHQsZSxuLGksYyxmKX0pfSx0LnByb3RvdHlwZS5hY3RpdmF0ZVJvdXRlcz1mdW5jdGlvbih0LGUsbixyLGksbyxhLHMsdSxsKXt2YXIgYyxmPXRoaXM7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCJib29sZWFuIiE9dHlwZW9mIHQmJnQuc2hvdWxkQWN0aXZhdGUmJnI9PT1mLm5hdmlnYXRpb25JZCYmdC5zdGF0ZSl7dmFyIG49dC5zdGF0ZTtpZihmLmN1cnJlbnRVcmxUcmVlPXQuYXBwbGllZFVybCxmLnJhd1VybFRyZWU9Zi51cmxIYW5kbGluZ1N0cmF0ZWd5Lm1lcmdlKGYuY3VycmVudFVybFRyZWUsbyksZi5yb3V0ZXJTdGF0ZT1uLCFhKXt2YXIgaT1mLnVybFNlcmlhbGl6ZXIuc2VyaWFsaXplKGYucmF3VXJsVHJlZSk7Zi5sb2NhdGlvbi5pc0N1cnJlbnRQYXRoRXF1YWxUbyhpKXx8cz9mLmxvY2F0aW9uLnJlcGxhY2VTdGF0ZShpLCIiLHtuYXZpZ2F0aW9uSWQ6cn0pOmYubG9jYXRpb24uZ28oaSwiIix7bmF2aWdhdGlvbklkOnJ9KX1uZXcgWWUoZi5yb3V0ZVJldXNlU3RyYXRlZ3ksbixlLGZ1bmN0aW9uKHQpe3JldHVybiBmLnRyaWdnZXJFdmVudCh0KX0pLmFjdGl2YXRlKGYucm9vdENvbnRleHRzKSxjPSEwfWVsc2UgYz0hMX0pLnRoZW4oZnVuY3Rpb24oKXtjPyhmLm5hdmlnYXRlZD0hMCxmLmxhc3RTdWNjZXNzZnVsSWQ9cixmLmV2ZW50cy5uZXh0KG5ldyBxKHIsZi5zZXJpYWxpemVVcmwoaSksZi5zZXJpYWxpemVVcmwoZi5jdXJyZW50VXJsVHJlZSkpKSx1KCEwKSk6KGYucmVzZXRVcmxUb0N1cnJlbnRVcmxUcmVlKCksZi5ldmVudHMubmV4dChuZXcgWShyLGYuc2VyaWFsaXplVXJsKGkpLCIiKSksdSghMSkpfSxmdW5jdGlvbih0KXtpZigoYT10KSYmYS5uZ05hdmlnYXRpb25DYW5jZWxpbmdFcnJvcilmLm5hdmlnYXRlZD0hMCxmLnJlc2V0U3RhdGVBbmRVcmwoZSxuLG8pLGYuZXZlbnRzLm5leHQobmV3IFkocixmLnNlcmlhbGl6ZVVybChpKSx0Lm1lc3NhZ2UpKSx1KCExKTtlbHNle2YucmVzZXRTdGF0ZUFuZFVybChlLG4sbyksZi5ldmVudHMubmV4dChuZXcgRyhyLGYuc2VyaWFsaXplVXJsKGkpLHQpKTt0cnl7dShmLmVycm9ySGFuZGxlcih0KSl9Y2F0Y2godCl7bCh0KX19dmFyIGF9KX0sdC5wcm90b3R5cGUucmVzZXRTdGF0ZUFuZFVybD1mdW5jdGlvbih0LGUsbil7dGhpcy5yb3V0ZXJTdGF0ZT10LHRoaXMuY3VycmVudFVybFRyZWU9ZSx0aGlzLnJhd1VybFRyZWU9dGhpcy51cmxIYW5kbGluZ1N0cmF0ZWd5Lm1lcmdlKHRoaXMuY3VycmVudFVybFRyZWUsbiksdGhpcy5yZXNldFVybFRvQ3VycmVudFVybFRyZWUoKX0sdC5wcm90b3R5cGUucmVzZXRVcmxUb0N1cnJlbnRVcmxUcmVlPWZ1bmN0aW9uKCl7dGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUodGhpcy51cmxTZXJpYWxpemVyLnNlcmlhbGl6ZSh0aGlzLnJhd1VybFRyZWUpLCIiLHtuYXZpZ2F0aW9uSWQ6dGhpcy5sYXN0U3VjY2Vzc2Z1bElkfSl9LHR9KCksWWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLHIpe3RoaXMucm91dGVSZXVzZVN0cmF0ZWd5PXQsdGhpcy5mdXR1cmVTdGF0ZT1lLHRoaXMuY3VyclN0YXRlPW4sdGhpcy5mb3J3YXJkRXZlbnQ9cn1yZXR1cm4gdC5wcm90b3R5cGUuYWN0aXZhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mdXR1cmVTdGF0ZS5fcm9vdCxuPXRoaXMuY3VyclN0YXRlP3RoaXMuY3VyclN0YXRlLl9yb290Om51bGw7dGhpcy5kZWFjdGl2YXRlQ2hpbGRSb3V0ZXMoZSxuLHQpLGZlKHRoaXMuZnV0dXJlU3RhdGUucm9vdCksdGhpcy5hY3RpdmF0ZUNoaWxkUm91dGVzKGUsbix0KX0sdC5wcm90b3R5cGUuZGVhY3RpdmF0ZUNoaWxkUm91dGVzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLGk9bmUoZSk7dC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXQudmFsdWUub3V0bGV0O3IuZGVhY3RpdmF0ZVJvdXRlcyh0LGlbZV0sbiksZGVsZXRlIGlbZV19KSx2dChpLGZ1bmN0aW9uKHQsZSl7ci5kZWFjdGl2YXRlUm91dGVBbmRJdHNDaGlsZHJlbih0LG4pfSl9LHQucHJvdG90eXBlLmRlYWN0aXZhdGVSb3V0ZXM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQudmFsdWUsaT1lP2UudmFsdWU6bnVsbDtpZihyPT09aSlpZihyLmNvbXBvbmVudCl7dmFyIG89bi5nZXRDb250ZXh0KHIub3V0bGV0KTtvJiZ0aGlzLmRlYWN0aXZhdGVDaGlsZFJvdXRlcyh0LGUsby5jaGlsZHJlbil9ZWxzZSB0aGlzLmRlYWN0aXZhdGVDaGlsZFJvdXRlcyh0LGUsbik7ZWxzZSBpJiZ0aGlzLmRlYWN0aXZhdGVSb3V0ZUFuZEl0c0NoaWxkcmVuKGUsbil9LHQucHJvdG90eXBlLmRlYWN0aXZhdGVSb3V0ZUFuZEl0c0NoaWxkcmVuPWZ1bmN0aW9uKHQsZSl7dGhpcy5yb3V0ZVJldXNlU3RyYXRlZ3kuc2hvdWxkRGV0YWNoKHQudmFsdWUuc25hcHNob3QpP3RoaXMuZGV0YWNoQW5kU3RvcmVSb3V0ZVN1YnRyZWUodCxlKTp0aGlzLmRlYWN0aXZhdGVSb3V0ZUFuZE91dGxldCh0LGUpfSx0LnByb3RvdHlwZS5kZXRhY2hBbmRTdG9yZVJvdXRlU3VidHJlZT1mdW5jdGlvbih0LGUpe3ZhciBuPWUuZ2V0Q29udGV4dCh0LnZhbHVlLm91dGxldCk7aWYobiYmbi5vdXRsZXQpe3ZhciByPW4ub3V0bGV0LmRldGFjaCgpLGk9bi5jaGlsZHJlbi5vbk91dGxldERlYWN0aXZhdGVkKCk7dGhpcy5yb3V0ZVJldXNlU3RyYXRlZ3kuc3RvcmUodC52YWx1ZS5zbmFwc2hvdCx7Y29tcG9uZW50UmVmOnIscm91dGU6dCxjb250ZXh0czppfSl9fSx0LnByb3RvdHlwZS5kZWFjdGl2YXRlUm91dGVBbmRPdXRsZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9ZS5nZXRDb250ZXh0KHQudmFsdWUub3V0bGV0KTtpZihyKXt2YXIgaT1uZSh0KSxvPXQudmFsdWUuY29tcG9uZW50P3IuY2hpbGRyZW46ZTt2dChpLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uZGVhY3RpdmF0ZVJvdXRlQW5kSXRzQ2hpbGRyZW4odCxvKX0pLHIub3V0bGV0JiYoci5vdXRsZXQuZGVhY3RpdmF0ZSgpLHIuY2hpbGRyZW4ub25PdXRsZXREZWFjdGl2YXRlZCgpKX19LHQucHJvdG90eXBlLmFjdGl2YXRlQ2hpbGRSb3V0ZXM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMsaT1uZShlKTt0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24odCl7ci5hY3RpdmF0ZVJvdXRlcyh0LGlbdC52YWx1ZS5vdXRsZXRdLG4pLHIuZm9yd2FyZEV2ZW50KG5ldyBpdCh0LnZhbHVlLnNuYXBzaG90KSl9KSx0LmNoaWxkcmVuLmxlbmd0aCYmdGhpcy5mb3J3YXJkRXZlbnQobmV3IG50KHQudmFsdWUuc25hcHNob3QpKX0sdC5wcm90b3R5cGUuYWN0aXZhdGVSb3V0ZXM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQudmFsdWUsaT1lP2UudmFsdWU6bnVsbDtpZihmZShyKSxyPT09aSlpZihyLmNvbXBvbmVudCl7dmFyIG89bi5nZXRPckNyZWF0ZUNvbnRleHQoci5vdXRsZXQpO3RoaXMuYWN0aXZhdGVDaGlsZFJvdXRlcyh0LGUsby5jaGlsZHJlbil9ZWxzZSB0aGlzLmFjdGl2YXRlQ2hpbGRSb3V0ZXModCxlLG4pO2Vsc2UgaWYoci5jb21wb25lbnQpaWYobz1uLmdldE9yQ3JlYXRlQ29udGV4dChyLm91dGxldCksdGhpcy5yb3V0ZVJldXNlU3RyYXRlZ3kuc2hvdWxkQXR0YWNoKHIuc25hcHNob3QpKXt2YXIgYT10aGlzLnJvdXRlUmV1c2VTdHJhdGVneS5yZXRyaWV2ZShyLnNuYXBzaG90KTt0aGlzLnJvdXRlUmV1c2VTdHJhdGVneS5zdG9yZShyLnNuYXBzaG90LG51bGwpLG8uY2hpbGRyZW4ub25PdXRsZXRSZUF0dGFjaGVkKGEuY29udGV4dHMpLG8uYXR0YWNoUmVmPWEuY29tcG9uZW50UmVmLG8ucm91dGU9YS5yb3V0ZS52YWx1ZSxvLm91dGxldCYmby5vdXRsZXQuYXR0YWNoKGEuY29tcG9uZW50UmVmLGEucm91dGUudmFsdWUpLEdlKGEucm91dGUpfWVsc2V7dmFyIHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXIuc25hcHNob3QucGFyZW50O2U7ZT1lLnBhcmVudCl7dmFyIG49ZS5yb3V0ZUNvbmZpZztpZihuJiZuLl9sb2FkZWRDb25maWcpcmV0dXJuIG4uX2xvYWRlZENvbmZpZztpZihuJiZuLmNvbXBvbmVudClyZXR1cm4gbnVsbH1yZXR1cm4gbnVsbH0oKSx1PXM/cy5tb2R1bGUuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOm51bGw7by5yb3V0ZT1yLG8ucmVzb2x2ZXI9dSxvLm91dGxldCYmby5vdXRsZXQuYWN0aXZhdGVXaXRoKHIsdSksdGhpcy5hY3RpdmF0ZUNoaWxkUm91dGVzKHQsbnVsbCxvLmNoaWxkcmVuKX1lbHNlIHRoaXMuYWN0aXZhdGVDaGlsZFJvdXRlcyh0LG51bGwsbil9LHR9KCk7ZnVuY3Rpb24gR2UodCl7ZmUodC52YWx1ZSksdC5jaGlsZHJlbi5mb3JFYWNoKEdlKX12YXIgUWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt2YXIgcj10aGlzO3RoaXMucm91dGVyPXQsdGhpcy5yb3V0ZT1lLHRoaXMubG9jYXRpb25TdHJhdGVneT1uLHRoaXMuY29tbWFuZHM9W10sdGhpcy5zdWJzY3JpcHRpb249dC5ldmVudHMuc3Vic2NyaWJlKGZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBxJiZyLnVwZGF0ZVRhcmdldFVybEFuZEhyZWYoKX0pfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInJvdXRlckxpbmsiLHtzZXQ6ZnVuY3Rpb24odCl7dGhpcy5jb21tYW5kcz1udWxsIT10P0FycmF5LmlzQXJyYXkodCk/dDpbdF06W119LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwcmVzZXJ2ZVF1ZXJ5UGFyYW1zIix7c2V0OmZ1bmN0aW9uKHQpe09iamVjdChpLlcpKCkmJmNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKCJwcmVzZXJ2ZVF1ZXJ5UGFyYW1zIGlzIGRlcHJlY2F0ZWQsIHVzZSBxdWVyeVBhcmFtc0hhbmRsaW5nIGluc3RlYWQuIiksdGhpcy5wcmVzZXJ2ZT10fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLm5nT25DaGFuZ2VzPWZ1bmN0aW9uKHQpe3RoaXMudXBkYXRlVGFyZ2V0VXJsQW5kSHJlZigpfSx0LnByb3RvdHlwZS5uZ09uRGVzdHJveT1mdW5jdGlvbigpe3RoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCl9LHQucHJvdG90eXBlLm9uQ2xpY2s9ZnVuY3Rpb24odCxlLG4scil7aWYoMCE9PXR8fGV8fG58fHIpcmV0dXJuITA7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnRhcmdldCYmIl9zZWxmIiE9dGhpcy50YXJnZXQpcmV0dXJuITA7dmFyIGk9e3NraXBMb2NhdGlvbkNoYW5nZTpLZSh0aGlzLnNraXBMb2NhdGlvbkNoYW5nZSkscmVwbGFjZVVybDpLZSh0aGlzLnJlcGxhY2VVcmwpfTtyZXR1cm4gdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLnVybFRyZWUsaSksITF9LHQucHJvdG90eXBlLnVwZGF0ZVRhcmdldFVybEFuZEhyZWY9ZnVuY3Rpb24oKXt0aGlzLmhyZWY9dGhpcy5sb2NhdGlvblN0cmF0ZWd5LnByZXBhcmVFeHRlcm5hbFVybCh0aGlzLnJvdXRlci5zZXJpYWxpemVVcmwodGhpcy51cmxUcmVlKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwidXJsVHJlZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKHRoaXMuY29tbWFuZHMse3JlbGF0aXZlVG86dGhpcy5yb3V0ZSxxdWVyeVBhcmFtczp0aGlzLnF1ZXJ5UGFyYW1zLGZyYWdtZW50OnRoaXMuZnJhZ21lbnQscHJlc2VydmVRdWVyeVBhcmFtczpLZSh0aGlzLnByZXNlcnZlKSxxdWVyeVBhcmFtc0hhbmRsaW5nOnRoaXMucXVlcnlQYXJhbXNIYW5kbGluZyxwcmVzZXJ2ZUZyYWdtZW50OktlKHRoaXMucHJlc2VydmVGcmFnbWVudCl9KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0fSgpO2Z1bmN0aW9uIEtlKHQpe3JldHVybiIiPT09dHx8ISF0fXZhciBaZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe3RoaXMub3V0bGV0PW51bGwsdGhpcy5yb3V0ZT1udWxsLHRoaXMucmVzb2x2ZXI9bnVsbCx0aGlzLmNoaWxkcmVuPW5ldyBYZSx0aGlzLmF0dGFjaFJlZj1udWxsfX0oKSxYZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLmNvbnRleHRzPW5ldyBNYXB9cmV0dXJuIHQucHJvdG90eXBlLm9uQ2hpbGRPdXRsZXRDcmVhdGVkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRPckNyZWF0ZUNvbnRleHQodCk7bi5vdXRsZXQ9ZSx0aGlzLmNvbnRleHRzLnNldCh0LG4pfSx0LnByb3RvdHlwZS5vbkNoaWxkT3V0bGV0RGVzdHJveWVkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0Q29udGV4dCh0KTtlJiYoZS5vdXRsZXQ9bnVsbCl9LHQucHJvdG90eXBlLm9uT3V0bGV0RGVhY3RpdmF0ZWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRleHRzO3JldHVybiB0aGlzLmNvbnRleHRzPW5ldyBNYXAsdH0sdC5wcm90b3R5cGUub25PdXRsZXRSZUF0dGFjaGVkPWZ1bmN0aW9uKHQpe3RoaXMuY29udGV4dHM9dH0sdC5wcm90b3R5cGUuZ2V0T3JDcmVhdGVDb250ZXh0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0Q29udGV4dCh0KTtyZXR1cm4gZXx8KGU9bmV3IFplLHRoaXMuY29udGV4dHMuc2V0KHQsZSkpLGV9LHQucHJvdG90eXBlLmdldENvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29udGV4dHMuZ2V0KHQpfHxudWxsfSx0fSgpLCRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyLG8pe3RoaXMucGFyZW50Q29udGV4dHM9dCx0aGlzLmxvY2F0aW9uPWUsdGhpcy5yZXNvbHZlcj1uLHRoaXMuY2hhbmdlRGV0ZWN0b3I9byx0aGlzLmFjdGl2YXRlZD1udWxsLHRoaXMuX2FjdGl2YXRlZFJvdXRlPW51bGwsdGhpcy5hY3RpdmF0ZUV2ZW50cz1uZXcgaS5tLHRoaXMuZGVhY3RpdmF0ZUV2ZW50cz1uZXcgaS5tLHRoaXMubmFtZT1yfHxhdCx0Lm9uQ2hpbGRPdXRsZXRDcmVhdGVkKHRoaXMubmFtZSx0aGlzKX1yZXR1cm4gdC5wcm90b3R5cGUubmdPbkRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnBhcmVudENvbnRleHRzLm9uQ2hpbGRPdXRsZXREZXN0cm95ZWQodGhpcy5uYW1lKX0sdC5wcm90b3R5cGUubmdPbkluaXQ9ZnVuY3Rpb24oKXtpZighdGhpcy5hY3RpdmF0ZWQpe3ZhciB0PXRoaXMucGFyZW50Q29udGV4dHMuZ2V0Q29udGV4dCh0aGlzLm5hbWUpO3QmJnQucm91dGUmJih0LmF0dGFjaFJlZj90aGlzLmF0dGFjaCh0LmF0dGFjaFJlZix0LnJvdXRlKTp0aGlzLmFjdGl2YXRlV2l0aCh0LnJvdXRlLHQucmVzb2x2ZXJ8fG51bGwpKX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiaXNBY3RpdmF0ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuYWN0aXZhdGVkfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiY29tcG9uZW50Iix7Z2V0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuYWN0aXZhdGVkKXRocm93IG5ldyBFcnJvcigiT3V0bGV0IGlzIG5vdCBhY3RpdmF0ZWQiKTtyZXR1cm4gdGhpcy5hY3RpdmF0ZWQuaW5zdGFuY2V9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJhY3RpdmF0ZWRSb3V0ZSIse2dldDpmdW5jdGlvbigpe2lmKCF0aGlzLmFjdGl2YXRlZCl0aHJvdyBuZXcgRXJyb3IoIk91dGxldCBpcyBub3QgYWN0aXZhdGVkIik7cmV0dXJuIHRoaXMuX2FjdGl2YXRlZFJvdXRlfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiYWN0aXZhdGVkUm91dGVEYXRhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FjdGl2YXRlZFJvdXRlP3RoaXMuX2FjdGl2YXRlZFJvdXRlLnNuYXBzaG90LmRhdGE6e319LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7aWYoIXRoaXMuYWN0aXZhdGVkKXRocm93IG5ldyBFcnJvcigiT3V0bGV0IGlzIG5vdCBhY3RpdmF0ZWQiKTt0aGlzLmxvY2F0aW9uLmRldGFjaCgpO3ZhciB0PXRoaXMuYWN0aXZhdGVkO3JldHVybiB0aGlzLmFjdGl2YXRlZD1udWxsLHRoaXMuX2FjdGl2YXRlZFJvdXRlPW51bGwsdH0sdC5wcm90b3R5cGUuYXR0YWNoPWZ1bmN0aW9uKHQsZSl7dGhpcy5hY3RpdmF0ZWQ9dCx0aGlzLl9hY3RpdmF0ZWRSb3V0ZT1lLHRoaXMubG9jYXRpb24uaW5zZXJ0KHQuaG9zdFZpZXcpfSx0LnByb3RvdHlwZS5kZWFjdGl2YXRlPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmF0ZWQpe3ZhciB0PXRoaXMuY29tcG9uZW50O3RoaXMuYWN0aXZhdGVkLmRlc3Ryb3koKSx0aGlzLmFjdGl2YXRlZD1udWxsLHRoaXMuX2FjdGl2YXRlZFJvdXRlPW51bGwsdGhpcy5kZWFjdGl2YXRlRXZlbnRzLmVtaXQodCl9fSx0LnByb3RvdHlwZS5hY3RpdmF0ZVdpdGg9ZnVuY3Rpb24odCxlKXtpZih0aGlzLmlzQWN0aXZhdGVkKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGFjdGl2YXRlIGFuIGFscmVhZHkgYWN0aXZhdGVkIG91dGxldCIpO3RoaXMuX2FjdGl2YXRlZFJvdXRlPXQ7dmFyIG49KGU9ZXx8dGhpcy5yZXNvbHZlcikucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkodC5fZnV0dXJlU25hcHNob3Qucm91dGVDb25maWcuY29tcG9uZW50KSxyPXRoaXMucGFyZW50Q29udGV4dHMuZ2V0T3JDcmVhdGVDb250ZXh0KHRoaXMubmFtZSkuY2hpbGRyZW4saT1uZXcgSmUodCxyLHRoaXMubG9jYXRpb24uaW5qZWN0b3IpO3RoaXMuYWN0aXZhdGVkPXRoaXMubG9jYXRpb24uY3JlYXRlQ29tcG9uZW50KG4sdGhpcy5sb2NhdGlvbi5sZW5ndGgsaSksdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKSx0aGlzLmFjdGl2YXRlRXZlbnRzLmVtaXQodGhpcy5hY3RpdmF0ZWQuaW5zdGFuY2UpfSx0fSgpLEplPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5yb3V0ZT10LHRoaXMuY2hpbGRDb250ZXh0cz1lLHRoaXMucGFyZW50PW59cmV0dXJuIHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09b2U/dGhpcy5yb3V0ZTp0PT09WGU/dGhpcy5jaGlsZENvbnRleHRzOnRoaXMucGFyZW50LmdldCh0LGUpfSx0fSgpLHRuPWZ1bmN0aW9uKCl7fSxlbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLnByZWxvYWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSgpLnBpcGUoT2JqZWN0KE4uYSkoZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0KHMuYSkobnVsbCl9KSl9LHR9KCksbm49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5wcmVsb2FkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdChzLmEpKG51bGwpfSx0fSgpLHJuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyLGkpe3RoaXMucm91dGVyPXQsdGhpcy5pbmplY3Rvcj1yLHRoaXMucHJlbG9hZGluZ1N0cmF0ZWd5PWksdGhpcy5sb2FkZXI9bmV3IFZlKGUsbixmdW5jdGlvbihlKXtyZXR1cm4gdC50cmlnZ2VyRXZlbnQobmV3IEooZSkpfSxmdW5jdGlvbihlKXtyZXR1cm4gdC50cmlnZ2VyRXZlbnQobmV3IHR0KGUpKX0pfXJldHVybiB0LnByb3RvdHlwZS5zZXRVcFByZWxvYWRpbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuc3Vic2NyaXB0aW9uPXRoaXMucm91dGVyLmV2ZW50cy5waXBlKE9iamVjdChmLmEpKGZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgcX0pLE9iamVjdChDLmEpKGZ1bmN0aW9uKCl7cmV0dXJuIHQucHJlbG9hZCgpfSkpLnN1YnNjcmliZShmdW5jdGlvbigpe30pfSx0LnByb3RvdHlwZS5wcmVsb2FkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pbmplY3Rvci5nZXQoaS52KTtyZXR1cm4gdGhpcy5wcm9jZXNzUm91dGVzKHQsdGhpcy5yb3V0ZXIuY29uZmlnKX0sdC5wcm90b3R5cGUubmdPbkRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfSx0LnByb3RvdHlwZS5wcm9jZXNzUm91dGVzPWZ1bmN0aW9uKHQsZSl7dmFyIG4saSxvPVtdO3RyeXtmb3IodmFyIHM9T2JqZWN0KHIuZSkoZSksdT1zLm5leHQoKTshdS5kb25lO3U9cy5uZXh0KCkpe3ZhciBsPXUudmFsdWU7aWYobC5sb2FkQ2hpbGRyZW4mJiFsLmNhbkxvYWQmJmwuX2xvYWRlZENvbmZpZyl7dmFyIGM9bC5fbG9hZGVkQ29uZmlnO28ucHVzaCh0aGlzLnByb2Nlc3NSb3V0ZXMoYy5tb2R1bGUsYy5yb3V0ZXMpKX1lbHNlIGwubG9hZENoaWxkcmVuJiYhbC5jYW5Mb2FkP28ucHVzaCh0aGlzLnByZWxvYWRDb25maWcodCxsKSk6bC5jaGlsZHJlbiYmby5wdXNoKHRoaXMucHJvY2Vzc1JvdXRlcyh0LGwuY2hpbGRyZW4pKX19Y2F0Y2godCl7bj17ZXJyb3I6dH19ZmluYWxseXt0cnl7dSYmIXUuZG9uZSYmKGk9cy5yZXR1cm4pJiZpLmNhbGwocyl9ZmluYWxseXtpZihuKXRocm93IG4uZXJyb3J9fXJldHVybiBPYmplY3QoYS5hKShvKS5waXBlKE9iamVjdChELmEpKCksT2JqZWN0KE8uYSkoZnVuY3Rpb24odCl7fSkpfSx0LnByb3RvdHlwZS5wcmVsb2FkQ29uZmlnPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gdGhpcy5wcmVsb2FkaW5nU3RyYXRlZ3kucHJlbG9hZChlLGZ1bmN0aW9uKCl7cmV0dXJuIG4ubG9hZGVyLmxvYWQodC5pbmplY3RvcixlKS5waXBlKE9iamVjdCh4LmEpKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9sb2FkZWRDb25maWc9dCxuLnByb2Nlc3NSb3V0ZXModC5tb2R1bGUsdC5yb3V0ZXMpfSkpfSl9LHR9KCksb249bmV3IGkubygiUk9VVEVSX0NPTkZJR1VSQVRJT04iKSxhbj1uZXcgaS5vKCJST1VURVJfRk9SUk9PVF9HVUFSRCIpLHNuPVt6Lmcse3Byb3ZpZGU6a3QsdXNlQ2xhc3M6VHR9LHtwcm92aWRlOnFlLHVzZUZhY3Rvcnk6ZG4sZGVwczpbaS5nLGt0LFhlLHouZyxpLnAsaS51LGkuaSxGZSxvbixbVWUsbmV3IGkueV0sW0RlLG5ldyBpLnldXX0sWGUse3Byb3ZpZGU6b2UsdXNlRmFjdG9yeTpwbixkZXBzOltxZV19LHtwcm92aWRlOmkudSx1c2VDbGFzczppLkl9LHJuLG5uLGVuLHtwcm92aWRlOm9uLHVzZVZhbHVlOntlbmFibGVUcmFjaW5nOiExfX1dO2Z1bmN0aW9uIHVuKCl7cmV0dXJuIG5ldyBpLncoIlJvdXRlciIscWUpfXZhciBsbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt9cmV0dXJuIHQuZm9yUm9vdD1mdW5jdGlvbihlLG4pe3JldHVybntuZ01vZHVsZTp0LHByb3ZpZGVyczpbc24saG4oZSkse3Byb3ZpZGU6YW4sdXNlRmFjdG9yeTpmbixkZXBzOltbcWUsbmV3IGkueSxuZXcgaS5IXV19LHtwcm92aWRlOm9uLHVzZVZhbHVlOm58fHt9fSx7cHJvdmlkZTp6LmgsdXNlRmFjdG9yeTpjbixkZXBzOlt6LnAsW25ldyBpLm4oei5hKSxuZXcgaS55XSxvbl19LHtwcm92aWRlOnRuLHVzZUV4aXN0aW5nOm4mJm4ucHJlbG9hZGluZ1N0cmF0ZWd5P24ucHJlbG9hZGluZ1N0cmF0ZWd5Om5ufSx7cHJvdmlkZTppLncsbXVsdGk6ITAsdXNlRmFjdG9yeTp1bn0sW21uLHtwcm92aWRlOmkuZCxtdWx0aTohMCx1c2VGYWN0b3J5OnluLGRlcHM6W21uXX0se3Byb3ZpZGU6dm4sdXNlRmFjdG9yeTpnbixkZXBzOlttbl19LHtwcm92aWRlOmkuYixtdWx0aTohMCx1c2VFeGlzdGluZzp2bn1dXX19LHQuZm9yQ2hpbGQ9ZnVuY3Rpb24oZSl7cmV0dXJue25nTW9kdWxlOnQscHJvdmlkZXJzOltobihlKV19fSx0fSgpO2Z1bmN0aW9uIGNuKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLG4udXNlSGFzaD9uZXcgei5lKHQsZSk6bmV3IHoubyh0LGUpfWZ1bmN0aW9uIGZuKHQpe2lmKHQpdGhyb3cgbmV3IEVycm9yKCJSb3V0ZXJNb2R1bGUuZm9yUm9vdCgpIGNhbGxlZCB0d2ljZS4gTGF6eSBsb2FkZWQgbW9kdWxlcyBzaG91bGQgdXNlIFJvdXRlck1vZHVsZS5mb3JDaGlsZCgpIGluc3RlYWQuIik7cmV0dXJuImd1YXJkZWQifWZ1bmN0aW9uIGhuKHQpe3JldHVyblt7cHJvdmlkZTppLmEsbXVsdGk6ITAsdXNlVmFsdWU6dH0se3Byb3ZpZGU6RmUsbXVsdGk6ITAsdXNlVmFsdWU6dH1dfWZ1bmN0aW9uIGRuKHQsZSxuLHIsaSxvLGEscyx1LGwsYyl7dm9pZCAwPT09dSYmKHU9e30pO3ZhciBmPW5ldyBxZShudWxsLGUsbixyLGksbyxhLHl0KHMpKTtpZihsJiYoZi51cmxIYW5kbGluZ1N0cmF0ZWd5PWwpLGMmJihmLnJvdXRlUmV1c2VTdHJhdGVneT1jKSx1LmVycm9ySGFuZGxlciYmKGYuZXJyb3JIYW5kbGVyPXUuZXJyb3JIYW5kbGVyKSx1Lm1hbGZvcm1lZFVyaUVycm9ySGFuZGxlciYmKGYubWFsZm9ybWVkVXJpRXJyb3JIYW5kbGVyPXUubWFsZm9ybWVkVXJpRXJyb3JIYW5kbGVyKSx1LmVuYWJsZVRyYWNpbmcpe3ZhciBoPU9iamVjdChCLnQpKCk7Zi5ldmVudHMuc3Vic2NyaWJlKGZ1bmN0aW9uKHQpe2gubG9nR3JvdXAoIlJvdXRlciBFdmVudDogIit0LmNvbnN0cnVjdG9yLm5hbWUpLGgubG9nKHQudG9TdHJpbmcoKSksaC5sb2codCksaC5sb2dHcm91cEVuZCgpfSl9cmV0dXJuIHUub25TYW1lVXJsTmF2aWdhdGlvbiYmKGYub25TYW1lVXJsTmF2aWdhdGlvbj11Lm9uU2FtZVVybE5hdmlnYXRpb24pLHUucGFyYW1zSW5oZXJpdGFuY2VTdHJhdGVneSYmKGYucGFyYW1zSW5oZXJpdGFuY2VTdHJhdGVneT11LnBhcmFtc0luaGVyaXRhbmNlU3RyYXRlZ3kpLGZ9ZnVuY3Rpb24gcG4odCl7cmV0dXJuIHQucm91dGVyU3RhdGUucm9vdH12YXIgbW49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuaW5qZWN0b3I9dCx0aGlzLmluaXROYXZpZ2F0aW9uPSExLHRoaXMucmVzdWx0T2ZQcmVhY3RpdmF0aW9uRG9uZT1uZXcgdS5hfXJldHVybiB0LnByb3RvdHlwZS5hcHBJbml0aWFsaXplcj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0KHouZixQcm9taXNlLnJlc29sdmUobnVsbCkpLnRoZW4oZnVuY3Rpb24oKXt2YXIgZT1udWxsLG49bmV3IFByb21pc2UoZnVuY3Rpb24odCl7cmV0dXJuIGU9dH0pLHI9dC5pbmplY3Rvci5nZXQocWUpLGk9dC5pbmplY3Rvci5nZXQob24pO2lmKHQuaXNMZWdhY3lEaXNhYmxlZChpKXx8dC5pc0xlZ2FjeUVuYWJsZWQoaSkpZSghMCk7ZWxzZSBpZigiZGlzYWJsZWQiPT09aS5pbml0aWFsTmF2aWdhdGlvbilyLnNldFVwTG9jYXRpb25DaGFuZ2VMaXN0ZW5lcigpLGUoITApO2Vsc2V7aWYoImVuYWJsZWQiIT09aS5pbml0aWFsTmF2aWdhdGlvbil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5pdGlhbE5hdmlnYXRpb24gb3B0aW9uczogJyIraS5pbml0aWFsTmF2aWdhdGlvbisiJyIpO3IuaG9va3MuYWZ0ZXJQcmVhY3RpdmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQuaW5pdE5hdmlnYXRpb24/T2JqZWN0KHMuYSkobnVsbCk6KHQuaW5pdE5hdmlnYXRpb249ITAsZSghMCksdC5yZXN1bHRPZlByZWFjdGl2YXRpb25Eb25lKX0sci5pbml0aWFsTmF2aWdhdGlvbigpfXJldHVybiBufSl9LHQucHJvdG90eXBlLmJvb3RzdHJhcExpc3RlbmVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW5qZWN0b3IuZ2V0KG9uKSxuPXRoaXMuaW5qZWN0b3IuZ2V0KHJuKSxyPXRoaXMuaW5qZWN0b3IuZ2V0KHFlKSxvPXRoaXMuaW5qZWN0b3IuZ2V0KGkuZyk7dD09PW8uY29tcG9uZW50c1swXSYmKHRoaXMuaXNMZWdhY3lFbmFibGVkKGUpP3IuaW5pdGlhbE5hdmlnYXRpb24oKTp0aGlzLmlzTGVnYWN5RGlzYWJsZWQoZSkmJnIuc2V0VXBMb2NhdGlvbkNoYW5nZUxpc3RlbmVyKCksbi5zZXRVcFByZWxvYWRpbmcoKSxyLnJlc2V0Um9vdENvbXBvbmVudFR5cGUoby5jb21wb25lbnRUeXBlc1swXSksdGhpcy5yZXN1bHRPZlByZWFjdGl2YXRpb25Eb25lLm5leHQobnVsbCksdGhpcy5yZXN1bHRPZlByZWFjdGl2YXRpb25Eb25lLmNvbXBsZXRlKCkpfSx0LnByb3RvdHlwZS5pc0xlZ2FjeUVuYWJsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuImxlZ2FjeV9lbmFibGVkIj09PXQuaW5pdGlhbE5hdmlnYXRpb258fCEwPT09dC5pbml0aWFsTmF2aWdhdGlvbnx8dm9pZCAwPT09dC5pbml0aWFsTmF2aWdhdGlvbn0sdC5wcm90b3R5cGUuaXNMZWdhY3lEaXNhYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4ibGVnYWN5X2Rpc2FibGVkIj09PXQuaW5pdGlhbE5hdmlnYXRpb258fCExPT09dC5pbml0aWFsTmF2aWdhdGlvbn0sdH0oKTtmdW5jdGlvbiB5bih0KXtyZXR1cm4gdC5hcHBJbml0aWFsaXplci5iaW5kKHQpfWZ1bmN0aW9uIGduKHQpe3JldHVybiB0LmJvb3RzdHJhcExpc3RlbmVyLmJpbmQodCl9dmFyIHZuPW5ldyBpLm8oIlJvdXRlciBJbml0aWFsaXplciIpfSxaWWp0OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsInEiLGZ1bmN0aW9uKCl7cmV0dXJuIHZ0fSksbi5kKGUsInMiLGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSxuLmQoZSwiciIsZnVuY3Rpb24oKXtyZXR1cm4gbHR9KSxuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gYnR9KSxuLmQoZSwiaiIsZnVuY3Rpb24oKXtyZXR1cm4gZ3R9KSxuLmQoZSwiaCIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pLG4uZChlLCJpIixmdW5jdGlvbigpe3JldHVybiB4fSksbi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSxuLmQoZSwiZCIsZnVuY3Rpb24oKXtyZXR1cm4gSX0pLG4uZChlLCJlIixmdW5jdGlvbigpe3JldHVybiBBfSksbi5kKGUsImYiLGZ1bmN0aW9uKCl7cmV0dXJuIG50fSksbi5kKGUsImciLGZ1bmN0aW9uKCl7cmV0dXJuIHJ0fSksbi5kKGUsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHV0fSksbi5kKGUsInQiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSxuLmQoZSwibCIsZnVuY3Rpb24oKXtyZXR1cm4gVX0pLG4uZChlLCJrIixmdW5jdGlvbigpe3JldHVybiB0dH0pLG4uZChlLCJuIixmdW5jdGlvbigpe3JldHVybiBpdH0pLG4uZChlLCJvIixmdW5jdGlvbigpe3JldHVybiBzdH0pLG4uZChlLCJtIixmdW5jdGlvbigpe3JldHVybiBNfSksbi5kKGUsInAiLGZ1bmN0aW9uKCl7cmV0dXJuIFB9KTt2YXIgcj1uKCJtclNHIiksaT1uKCJJcDBSIiksbz1uKCJDY25HIiksYT1udWxsO2Z1bmN0aW9uIHMoKXtyZXR1cm4gYX12YXIgdSxsPXtjbGFzczoiY2xhc3NOYW1lIixpbm5lckh0bWw6ImlubmVySFRNTCIscmVhZG9ubHk6InJlYWRPbmx5Iix0YWJpbmRleDoidGFiSW5kZXgifSxjPXsiXGIiOiJCYWNrc3BhY2UiLCJcdCI6IlRhYiIsIlx4N2YiOiJEZWxldGUiLCJceDFiIjoiRXNjYXBlIixEZWw6IkRlbGV0ZSIsRXNjOiJFc2NhcGUiLExlZnQ6IkFycm93TGVmdCIsUmlnaHQ6IkFycm93UmlnaHQiLFVwOiJBcnJvd1VwIixEb3duOiJBcnJvd0Rvd24iLE1lbnU6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLFdpbjoiT1MifSxmPXtBOiIxIixCOiIyIixDOiIzIixEOiI0IixFOiI1IixGOiI2IixHOiI3IixIOiI4IixJOiI5IixKOiIqIixLOiIrIixNOiItIixOOiIuIixPOiIvIiwiYCI6IjAiLCJceDkwIjoiTnVtTG9jayJ9O28uUGEuTm9kZSYmKHU9by5QYS5Ob2RlLnByb3RvdHlwZS5jb250YWluc3x8ZnVuY3Rpb24odCl7cmV0dXJuISEoMTYmdGhpcy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSl9KTt2YXIgaCxkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicGFyc2Ugbm90IGltcGxlbWVudGVkIil9LGUubWFrZUN1cnJlbnQ9ZnVuY3Rpb24oKXt2YXIgdDt0PW5ldyBlLGF8fChhPXQpfSxlLnByb3RvdHlwZS5oYXNQcm9wZXJ0eT1mdW5jdGlvbih0LGUpe3JldHVybiBlIGluIHR9LGUucHJvdG90eXBlLnNldFByb3BlcnR5PWZ1bmN0aW9uKHQsZSxuKXt0W2VdPW59LGUucHJvdG90eXBlLmdldFByb3BlcnR5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbZV19LGUucHJvdG90eXBlLmludm9rZT1mdW5jdGlvbih0LGUsbil7dmFyIGk7KGk9dClbZV0uYXBwbHkoaSxPYmplY3Qoci5kKShuKSl9LGUucHJvdG90eXBlLmxvZ0Vycm9yPWZ1bmN0aW9uKHQpe3dpbmRvdy5jb25zb2xlJiYoY29uc29sZS5lcnJvcj9jb25zb2xlLmVycm9yKHQpOmNvbnNvbGUubG9nKHQpKX0sZS5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKHQpe3dpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2cmJndpbmRvdy5jb25zb2xlLmxvZyh0KX0sZS5wcm90b3R5cGUubG9nR3JvdXA9ZnVuY3Rpb24odCl7d2luZG93LmNvbnNvbGUmJndpbmRvdy5jb25zb2xlLmdyb3VwJiZ3aW5kb3cuY29uc29sZS5ncm91cCh0KX0sZS5wcm90b3R5cGUubG9nR3JvdXBFbmQ9ZnVuY3Rpb24oKXt3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUuZ3JvdXBFbmQmJndpbmRvdy5jb25zb2xlLmdyb3VwRW5kKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiYXR0clRvUHJvcE1hcCIse2dldDpmdW5jdGlvbigpe3JldHVybiBsfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUuY2FsbCh0LGUpfSxlLnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcihlKX0sZS5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbD1mdW5jdGlvbih0LGUpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3JBbGwoZSl9LGUucHJvdG90eXBlLm9uPWZ1bmN0aW9uKHQsZSxuKXt0LmFkZEV2ZW50TGlzdGVuZXIoZSxuLCExKX0sZS5wcm90b3R5cGUub25BbmRDYW5jZWw9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoZSxuLCExKSxmdW5jdGlvbigpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4sITEpfX0sZS5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudD1mdW5jdGlvbih0LGUpe3QuZGlzcGF0Y2hFdmVudChlKX0sZS5wcm90b3R5cGUuY3JlYXRlTW91c2VFdmVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldERlZmF1bHREb2N1bWVudCgpLmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7cmV0dXJuIGUuaW5pdEV2ZW50KHQsITAsITApLGV9LGUucHJvdG90eXBlLmNyZWF0ZUV2ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RGVmYXVsdERvY3VtZW50KCkuY3JlYXRlRXZlbnQoIkV2ZW50Iik7cmV0dXJuIGUuaW5pdEV2ZW50KHQsITAsITApLGV9LGUucHJvdG90eXBlLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnJldHVyblZhbHVlPSExfSxlLnByb3RvdHlwZS5pc1ByZXZlbnRlZD1mdW5jdGlvbih0KXtyZXR1cm4gdC5kZWZhdWx0UHJldmVudGVkfHxudWxsIT10LnJldHVyblZhbHVlJiYhdC5yZXR1cm5WYWx1ZX0sZS5wcm90b3R5cGUuZ2V0SW5uZXJIVE1MPWZ1bmN0aW9uKHQpe3JldHVybiB0LmlubmVySFRNTH0sZS5wcm90b3R5cGUuZ2V0VGVtcGxhdGVDb250ZW50PWZ1bmN0aW9uKHQpe3JldHVybiJjb250ZW50ImluIHQmJnRoaXMuaXNUZW1wbGF0ZUVsZW1lbnQodCk/dC5jb250ZW50Om51bGx9LGUucHJvdG90eXBlLmdldE91dGVySFRNTD1mdW5jdGlvbih0KXtyZXR1cm4gdC5vdXRlckhUTUx9LGUucHJvdG90eXBlLm5vZGVOYW1lPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm5vZGVOYW1lfSxlLnByb3RvdHlwZS5ub2RlVmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZVZhbHVlfSxlLnByb3RvdHlwZS50eXBlPWZ1bmN0aW9uKHQpe3JldHVybiB0LnR5cGV9LGUucHJvdG90eXBlLmNvbnRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaGFzUHJvcGVydHkodCwiY29udGVudCIpP3QuY29udGVudDp0fSxlLnByb3RvdHlwZS5maXJzdENoaWxkPWZ1bmN0aW9uKHQpe3JldHVybiB0LmZpcnN0Q2hpbGR9LGUucHJvdG90eXBlLm5leHRTaWJsaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm5leHRTaWJsaW5nfSxlLnByb3RvdHlwZS5wYXJlbnRFbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0LnBhcmVudE5vZGV9LGUucHJvdG90eXBlLmNoaWxkTm9kZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY2hpbGROb2Rlc30sZS5wcm90b3R5cGUuY2hpbGROb2Rlc0FzTGlzdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5jaGlsZE5vZGVzLG49bmV3IEFycmF5KGUubGVuZ3RoKSxyPTA7cjxlLmxlbmd0aDtyKyspbltyXT1lW3JdO3JldHVybiBufSxlLnByb3RvdHlwZS5jbGVhck5vZGVzPWZ1bmN0aW9uKHQpe2Zvcig7dC5maXJzdENoaWxkOyl0LnJlbW92ZUNoaWxkKHQuZmlyc3RDaGlsZCl9LGUucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKHQsZSl7dC5hcHBlbmRDaGlsZChlKX0sZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQ9ZnVuY3Rpb24odCxlKXt0LnJlbW92ZUNoaWxkKGUpfSxlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQ9ZnVuY3Rpb24odCxlLG4pe3QucmVwbGFjZUNoaWxkKGUsbil9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksdH0sZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKHQsZSxuKXt0Lmluc2VydEJlZm9yZShuLGUpfSxlLnByb3RvdHlwZS5pbnNlcnRBbGxCZWZvcmU9ZnVuY3Rpb24odCxlLG4pe24uZm9yRWFjaChmdW5jdGlvbihuKXtyZXR1cm4gdC5pbnNlcnRCZWZvcmUobixlKX0pfSxlLnByb3RvdHlwZS5pbnNlcnRBZnRlcj1mdW5jdGlvbih0LGUsbil7dC5pbnNlcnRCZWZvcmUobixlLm5leHRTaWJsaW5nKX0sZS5wcm90b3R5cGUuc2V0SW5uZXJIVE1MPWZ1bmN0aW9uKHQsZSl7dC5pbm5lckhUTUw9ZX0sZS5wcm90b3R5cGUuZ2V0VGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gdC50ZXh0Q29udGVudH0sZS5wcm90b3R5cGUuc2V0VGV4dD1mdW5jdGlvbih0LGUpe3QudGV4dENvbnRlbnQ9ZX0sZS5wcm90b3R5cGUuZ2V0VmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWV9LGUucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKHQsZSl7dC52YWx1ZT1lfSxlLnByb3RvdHlwZS5nZXRDaGVja2VkPWZ1bmN0aW9uKHQpe3JldHVybiB0LmNoZWNrZWR9LGUucHJvdG90eXBlLnNldENoZWNrZWQ9ZnVuY3Rpb24odCxlKXt0LmNoZWNrZWQ9ZX0sZS5wcm90b3R5cGUuY3JlYXRlQ29tbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXREZWZhdWx0RG9jdW1lbnQoKS5jcmVhdGVDb21tZW50KHQpfSxlLnByb3RvdHlwZS5jcmVhdGVUZW1wbGF0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldERlZmF1bHREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7cmV0dXJuIGUuaW5uZXJIVE1MPXQsZX0sZS5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbih0LGUpe3JldHVybihlPWV8fHRoaXMuZ2V0RGVmYXVsdERvY3VtZW50KCkpLmNyZWF0ZUVsZW1lbnQodCl9LGUucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnROUz1mdW5jdGlvbih0LGUsbil7cmV0dXJuKG49bnx8dGhpcy5nZXREZWZhdWx0RG9jdW1lbnQoKSkuY3JlYXRlRWxlbWVudE5TKHQsZSl9LGUucHJvdG90eXBlLmNyZWF0ZVRleHROb2RlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKGU9ZXx8dGhpcy5nZXREZWZhdWx0RG9jdW1lbnQoKSkuY3JlYXRlVGV4dE5vZGUodCl9LGUucHJvdG90eXBlLmNyZWF0ZVNjcmlwdFRhZz1mdW5jdGlvbih0LGUsbil7dmFyIHI9KG49bnx8dGhpcy5nZXREZWZhdWx0RG9jdW1lbnQoKSkuY3JlYXRlRWxlbWVudCgiU0NSSVBUIik7cmV0dXJuIHIuc2V0QXR0cmlidXRlKHQsZSkscn0sZS5wcm90b3R5cGUuY3JlYXRlU3R5bGVFbGVtZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49KGU9ZXx8dGhpcy5nZXREZWZhdWx0RG9jdW1lbnQoKSkuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChuLHRoaXMuY3JlYXRlVGV4dE5vZGUodCxlKSksbn0sZS5wcm90b3R5cGUuY3JlYXRlU2hhZG93Um9vdD1mdW5jdGlvbih0KXtyZXR1cm4gdC5jcmVhdGVTaGFkb3dSb290KCl9LGUucHJvdG90eXBlLmdldFNoYWRvd1Jvb3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc2hhZG93Um9vdH0sZS5wcm90b3R5cGUuZ2V0SG9zdD1mdW5jdGlvbih0KXtyZXR1cm4gdC5ob3N0fSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5jbG9uZU5vZGUoITApfSxlLnByb3RvdHlwZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX0sZS5wcm90b3R5cGUuZ2V0RWxlbWVudHNCeVRhZ05hbWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKX0sZS5wcm90b3R5cGUuY2xhc3NMaXN0PWZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LmNsYXNzTGlzdCwwKX0sZS5wcm90b3R5cGUuYWRkQ2xhc3M9ZnVuY3Rpb24odCxlKXt0LmNsYXNzTGlzdC5hZGQoZSl9LGUucHJvdG90eXBlLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKHQsZSl7dC5jbGFzc0xpc3QucmVtb3ZlKGUpfSxlLnByb3RvdHlwZS5oYXNDbGFzcz1mdW5jdGlvbih0LGUpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucyhlKX0sZS5wcm90b3R5cGUuc2V0U3R5bGU9ZnVuY3Rpb24odCxlLG4pe3Quc3R5bGVbZV09bn0sZS5wcm90b3R5cGUucmVtb3ZlU3R5bGU9ZnVuY3Rpb24odCxlKXt0LnN0eWxlW2VdPSIifSxlLnByb3RvdHlwZS5nZXRTdHlsZT1mdW5jdGlvbih0LGUpe3JldHVybiB0LnN0eWxlW2VdfSxlLnByb3RvdHlwZS5oYXNTdHlsZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5nZXRTdHlsZSh0LGUpfHwiIjtyZXR1cm4gbj9yPT1uOnIubGVuZ3RoPjB9LGUucHJvdG90eXBlLnRhZ05hbWU9ZnVuY3Rpb24odCl7cmV0dXJuIHQudGFnTmFtZX0sZS5wcm90b3R5cGUuYXR0cmlidXRlTWFwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgTWFwLG49dC5hdHRyaWJ1dGVzLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bi5pdGVtKHIpO2Uuc2V0KGkubmFtZSxpLnZhbHVlKX1yZXR1cm4gZX0sZS5wcm90b3R5cGUuaGFzQXR0cmlidXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaGFzQXR0cmlidXRlKGUpfSxlLnByb3RvdHlwZS5oYXNBdHRyaWJ1dGVOUz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQuaGFzQXR0cmlidXRlTlMoZSxuKX0sZS5wcm90b3R5cGUuZ2V0QXR0cmlidXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKGUpfSxlLnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVOUz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQuZ2V0QXR0cmlidXRlTlMoZSxuKX0sZS5wcm90b3R5cGUuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKHQsZSxuKXt0LnNldEF0dHJpYnV0ZShlLG4pfSxlLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGVOUz1mdW5jdGlvbih0LGUsbixyKXt0LnNldEF0dHJpYnV0ZU5TKGUsbixyKX0sZS5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlPWZ1bmN0aW9uKHQsZSl7dC5yZW1vdmVBdHRyaWJ1dGUoZSl9LGUucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZU5TPWZ1bmN0aW9uKHQsZSxuKXt0LnJlbW92ZUF0dHJpYnV0ZU5TKGUsbil9LGUucHJvdG90eXBlLnRlbXBsYXRlQXdhcmVSb290PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzVGVtcGxhdGVFbGVtZW50KHQpP3RoaXMuY29udGVudCh0KTp0fSxlLnByb3RvdHlwZS5jcmVhdGVIdG1sRG9jdW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJmYWtlVGl0bGUiKX0sZS5wcm90b3R5cGUuZ2V0RGVmYXVsdERvY3VtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50fSxlLnByb3RvdHlwZS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfWNhdGNoKHQpe3JldHVybnt0b3A6MCxib3R0b206MCxsZWZ0OjAscmlnaHQ6MCx3aWR0aDowLGhlaWdodDowfX19LGUucHJvdG90eXBlLmdldFRpdGxlPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRpdGxlfSxlLnByb3RvdHlwZS5zZXRUaXRsZT1mdW5jdGlvbih0LGUpe3QudGl0bGU9ZXx8IiJ9LGUucHJvdG90eXBlLmVsZW1lbnRNYXRjaGVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuISF0aGlzLmlzRWxlbWVudE5vZGUodCkmJih0Lm1hdGNoZXMmJnQubWF0Y2hlcyhlKXx8dC5tc01hdGNoZXNTZWxlY3RvciYmdC5tc01hdGNoZXNTZWxlY3RvcihlKXx8dC53ZWJraXRNYXRjaGVzU2VsZWN0b3ImJnQud2Via2l0TWF0Y2hlc1NlbGVjdG9yKGUpKX0sZS5wcm90b3R5cGUuaXNUZW1wbGF0ZUVsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNFbGVtZW50Tm9kZSh0KSYmIlRFTVBMQVRFIj09PXQubm9kZU5hbWV9LGUucHJvdG90eXBlLmlzVGV4dE5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERX0sZS5wcm90b3R5cGUuaXNDb21tZW50Tm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5ub2RlVHlwZT09PU5vZGUuQ09NTUVOVF9OT0RFfSxlLnByb3RvdHlwZS5pc0VsZW1lbnROb2RlPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREV9LGUucHJvdG90eXBlLmhhc1NoYWRvd1Jvb3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQuc2hhZG93Um9vdCYmdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fSxlLnByb3RvdHlwZS5pc1NoYWRvd1Jvb3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50fSxlLnByb3RvdHlwZS5pbXBvcnRJbnRvRG9jPWZ1bmN0aW9uKHQpe3JldHVybiBkb2N1bWVudC5pbXBvcnROb2RlKHRoaXMudGVtcGxhdGVBd2FyZVJvb3QodCksITApfSxlLnByb3RvdHlwZS5hZG9wdE5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIGRvY3VtZW50LmFkb3B0Tm9kZSh0KX0sZS5wcm90b3R5cGUuZ2V0SHJlZj1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0sZS5wcm90b3R5cGUuZ2V0RXZlbnRLZXk9ZnVuY3Rpb24odCl7dmFyIGU9dC5rZXk7aWYobnVsbD09ZSl7aWYobnVsbD09KGU9dC5rZXlJZGVudGlmaWVyKSlyZXR1cm4iVW5pZGVudGlmaWVkIjtlLnN0YXJ0c1dpdGgoIlUrIikmJihlPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoZS5zdWJzdHJpbmcoMiksMTYpKSwzPT09dC5sb2NhdGlvbiYmZi5oYXNPd25Qcm9wZXJ0eShlKSYmKGU9ZltlXSkpfXJldHVybiBjW2VdfHxlfSxlLnByb3RvdHlwZS5nZXRHbG9iYWxFdmVudFRhcmdldD1mdW5jdGlvbih0LGUpe3JldHVybiJ3aW5kb3ciPT09ZT93aW5kb3c6ImRvY3VtZW50Ij09PWU/dDoiYm9keSI9PT1lP3QuYm9keTpudWxsfSxlLnByb3RvdHlwZS5nZXRIaXN0b3J5PWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5oaXN0b3J5fSxlLnByb3RvdHlwZS5nZXRMb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cubG9jYXRpb259LGUucHJvdG90eXBlLmdldEJhc2VIcmVmPWZ1bmN0aW9uKHQpe3ZhciBlLG49cHx8KHA9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYmFzZSIpKT9wLmdldEF0dHJpYnV0ZSgiaHJlZiIpOm51bGw7cmV0dXJuIG51bGw9PW4/bnVsbDooZT1uLGh8fChoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSksaC5zZXRBdHRyaWJ1dGUoImhyZWYiLGUpLCIvIj09PWgucGF0aG5hbWUuY2hhckF0KDApP2gucGF0aG5hbWU6Ii8iK2gucGF0aG5hbWUpfSxlLnByb3RvdHlwZS5yZXNldEJhc2VFbGVtZW50PWZ1bmN0aW9uKCl7cD1udWxsfSxlLnByb3RvdHlwZS5nZXRVc2VyQWdlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnR9LGUucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCxlLG4pe3RoaXMuc2V0QXR0cmlidXRlKHQsImRhdGEtIitlLG4pfSxlLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKHQsImRhdGEtIitlKX0sZS5wcm90b3R5cGUuZ2V0Q29tcHV0ZWRTdHlsZT1mdW5jdGlvbih0KXtyZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZSh0KX0sZS5wcm90b3R5cGUuc3VwcG9ydHNXZWJBbmltYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZX0sZS5wcm90b3R5cGUucGVyZm9ybWFuY2VOb3c9ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LnBlcmZvcm1hbmNlJiZ3aW5kb3cucGVyZm9ybWFuY2Uubm93P3dpbmRvdy5wZXJmb3JtYW5jZS5ub3coKToobmV3IERhdGUpLmdldFRpbWUoKX0sZS5wcm90b3R5cGUuc3VwcG9ydHNDb29raWVzPWZ1bmN0aW9uKCl7cmV0dXJuITB9LGUucHJvdG90eXBlLmdldENvb2tpZT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KGkudSkoZG9jdW1lbnQuY29va2llLHQpfSxlLnByb3RvdHlwZS5zZXRDb29raWU9ZnVuY3Rpb24odCxlKXtkb2N1bWVudC5jb29raWU9ZW5jb2RlVVJJQ29tcG9uZW50KHQpKyI9IitlbmNvZGVVUklDb21wb25lbnQoZSl9LGV9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT10LmNhbGwodGhpcyl8fHRoaXM7ZS5fYW5pbWF0aW9uUHJlZml4PW51bGwsZS5fdHJhbnNpdGlvbkVuZD1udWxsO3RyeXt2YXIgbj1lLmNyZWF0ZUVsZW1lbnQoImRpdiIsZG9jdW1lbnQpO2lmKG51bGwhPWUuZ2V0U3R5bGUobiwiYW5pbWF0aW9uTmFtZSIpKWUuX2FuaW1hdGlvblByZWZpeD0iIjtlbHNlIGZvcih2YXIgcj1bIldlYmtpdCIsIk1veiIsIk8iLCJtcyJdLGk9MDtpPHIubGVuZ3RoO2krKylpZihudWxsIT1lLmdldFN0eWxlKG4scltpXSsiQW5pbWF0aW9uTmFtZSIpKXtlLl9hbmltYXRpb25QcmVmaXg9Ii0iK3JbaV0udG9Mb3dlckNhc2UoKSsiLSI7YnJlYWt9dmFyIG89e1dlYmtpdFRyYW5zaXRpb246IndlYmtpdFRyYW5zaXRpb25FbmQiLE1velRyYW5zaXRpb246InRyYW5zaXRpb25lbmQiLE9UcmFuc2l0aW9uOiJvVHJhbnNpdGlvbkVuZCBvdHJhbnNpdGlvbmVuZCIsdHJhbnNpdGlvbjoidHJhbnNpdGlvbmVuZCJ9O09iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24odCl7bnVsbCE9ZS5nZXRTdHlsZShuLHQpJiYoZS5fdHJhbnNpdGlvbkVuZD1vW3RdKX0pfWNhdGNoKHQpe2UuX2FuaW1hdGlvblByZWZpeD1udWxsLGUuX3RyYW5zaXRpb25FbmQ9bnVsbH1yZXR1cm4gZX1yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5nZXREaXN0cmlidXRlZE5vZGVzPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERpc3RyaWJ1dGVkTm9kZXMoKX0sZS5wcm90b3R5cGUucmVzb2x2ZUFuZFNldEhyZWY9ZnVuY3Rpb24odCxlLG4pe3QuaHJlZj1udWxsPT1uP2U6ZSsiLy4uLyIrbn0sZS5wcm90b3R5cGUuc3VwcG9ydHNET01FdmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZS5wcm90b3R5cGUuc3VwcG9ydHNOYXRpdmVTaGFkb3dET009ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZG9jdW1lbnQuYm9keS5jcmVhdGVTaGFkb3dSb290fSxlLnByb3RvdHlwZS5nZXRBbmltYXRpb25QcmVmaXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uUHJlZml4P3RoaXMuX2FuaW1hdGlvblByZWZpeDoiIn0sZS5wcm90b3R5cGUuZ2V0VHJhbnNpdGlvbkVuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90cmFuc2l0aW9uRW5kP3RoaXMuX3RyYW5zaXRpb25FbmQ6IiJ9LGUucHJvdG90eXBlLnN1cHBvcnRzQW5pbWF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXRoaXMuX2FuaW1hdGlvblByZWZpeCYmbnVsbCE9dGhpcy5fdHJhbnNpdGlvbkVuZH0sZX0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5yZXNvdXJjZUxvYWRlclR5cGU9bnVsbH1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJhdHRyVG9Qcm9wTWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F0dHJUb1Byb3BNYXB9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9hdHRyVG9Qcm9wTWFwPXR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdH0oKSkpLHA9bnVsbCxtPWkuZDtmdW5jdGlvbiB5KCl7cmV0dXJuISF3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGV9dmFyIGc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX2RvYz1lLG4uX2luaXQoKSxufXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKCl7dGhpcy5sb2NhdGlvbj1zKCkuZ2V0TG9jYXRpb24oKSx0aGlzLl9oaXN0b3J5PXMoKS5nZXRIaXN0b3J5KCl9LGUucHJvdG90eXBlLmdldEJhc2VIcmVmRnJvbURPTT1mdW5jdGlvbigpe3JldHVybiBzKCkuZ2V0QmFzZUhyZWYodGhpcy5fZG9jKX0sZS5wcm90b3R5cGUub25Qb3BTdGF0ZT1mdW5jdGlvbih0KXtzKCkuZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGhpcy5fZG9jLCJ3aW5kb3ciKS5hZGRFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsdCwhMSl9LGUucHJvdG90eXBlLm9uSGFzaENoYW5nZT1mdW5jdGlvbih0KXtzKCkuZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGhpcy5fZG9jLCJ3aW5kb3ciKS5hZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIix0LCExKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJwYXRobmFtZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2F0aW9uLnBhdGhuYW1lfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5sb2NhdGlvbi5wYXRobmFtZT10fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwic2VhcmNoIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYXRpb24uc2VhcmNofSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiaGFzaCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2F0aW9uLmhhc2h9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUucHVzaFN0YXRlPWZ1bmN0aW9uKHQsZSxuKXt5KCk/dGhpcy5faGlzdG9yeS5wdXNoU3RhdGUodCxlLG4pOnRoaXMubG9jYXRpb24uaGFzaD1ufSxlLnByb3RvdHlwZS5yZXBsYWNlU3RhdGU9ZnVuY3Rpb24odCxlLG4pe3koKT90aGlzLl9oaXN0b3J5LnJlcGxhY2VTdGF0ZSh0LGUsbik6dGhpcy5sb2NhdGlvbi5oYXNoPW59LGUucHJvdG90eXBlLmZvcndhcmQ9ZnVuY3Rpb24oKXt0aGlzLl9oaXN0b3J5LmZvcndhcmQoKX0sZS5wcm90b3R5cGUuYmFjaz1mdW5jdGlvbigpe3RoaXMuX2hpc3RvcnkuYmFjaygpfSxlLmN0b3JQYXJhbWV0ZXJzPWZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpvLm4sYXJnczpbbV19XX1dfSxlfShpLnApLHY9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX2RvYz10LHRoaXMuX2RvbT1zKCl9cmV0dXJuIHQucHJvdG90eXBlLmFkZFRhZz1mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0hMSksdD90aGlzLl9nZXRPckNyZWF0ZUVsZW1lbnQodCxlKTpudWxsfSx0LnByb3RvdHlwZS5hZGRUYWdzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ITEpLHQ/dC5yZWR1Y2UoZnVuY3Rpb24odCxyKXtyZXR1cm4gciYmdC5wdXNoKG4uX2dldE9yQ3JlYXRlRWxlbWVudChyLGUpKSx0fSxbXSk6W119LHQucHJvdG90eXBlLmdldFRhZz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdGhpcy5fZG9tLnF1ZXJ5U2VsZWN0b3IodGhpcy5fZG9jLCJtZXRhWyIrdCsiXSIpfHxudWxsfSx0LnByb3RvdHlwZS5nZXRUYWdzPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybltdO3ZhciBlPXRoaXMuX2RvbS5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuX2RvYywibWV0YVsiK3QrIl0iKTtyZXR1cm4gZT9bXS5zbGljZS5jYWxsKGUpOltdfSx0LnByb3RvdHlwZS51cGRhdGVUYWc9ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm4gbnVsbDtlPWV8fHRoaXMuX3BhcnNlU2VsZWN0b3IodCk7dmFyIG49dGhpcy5nZXRUYWcoZSk7cmV0dXJuIG4/dGhpcy5fc2V0TWV0YUVsZW1lbnRBdHRyaWJ1dGVzKHQsbik6dGhpcy5fZ2V0T3JDcmVhdGVFbGVtZW50KHQsITApfSx0LnByb3RvdHlwZS5yZW1vdmVUYWc9ZnVuY3Rpb24odCl7dGhpcy5yZW1vdmVUYWdFbGVtZW50KHRoaXMuZ2V0VGFnKHQpKX0sdC5wcm90b3R5cGUucmVtb3ZlVGFnRWxlbWVudD1mdW5jdGlvbih0KXt0JiZ0aGlzLl9kb20ucmVtb3ZlKHQpfSx0LnByb3RvdHlwZS5fZ2V0T3JDcmVhdGVFbGVtZW50PWZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwPT09ZSYmKGU9ITEpLCFlKXt2YXIgbj10aGlzLl9wYXJzZVNlbGVjdG9yKHQpLHI9dGhpcy5nZXRUYWcobik7aWYociYmdGhpcy5fY29udGFpbnNBdHRyaWJ1dGVzKHQscikpcmV0dXJuIHJ9dmFyIGk9dGhpcy5fZG9tLmNyZWF0ZUVsZW1lbnQoIm1ldGEiKTt0aGlzLl9zZXRNZXRhRWxlbWVudEF0dHJpYnV0ZXModCxpKTt2YXIgbz10aGlzLl9kb20uZ2V0RWxlbWVudHNCeVRhZ05hbWUodGhpcy5fZG9jLCJoZWFkIilbMF07cmV0dXJuIHRoaXMuX2RvbS5hcHBlbmRDaGlsZChvLGkpLGl9LHQucHJvdG90eXBlLl9zZXRNZXRhRWxlbWVudEF0dHJpYnV0ZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3JldHVybiBuLl9kb20uc2V0QXR0cmlidXRlKGUscix0W3JdKX0pLGV9LHQucHJvdG90eXBlLl9wYXJzZVNlbGVjdG9yPWZ1bmN0aW9uKHQpe3ZhciBlPXQubmFtZT8ibmFtZSI6InByb3BlcnR5IjtyZXR1cm4gZSsnPSInK3RbZV0rJyInfSx0LnByb3RvdHlwZS5fY29udGFpbnNBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gT2JqZWN0LmtleXModCkuZXZlcnkoZnVuY3Rpb24ocil7cmV0dXJuIG4uX2RvbS5nZXRBdHRyaWJ1dGUoZSxyKT09PXRbcl19KX0sdH0oKSxiPW5ldyBvLm8oIlRSQU5TSVRJT05fSUQiKSxfPVt7cHJvdmlkZTpvLmQsdXNlRmFjdG9yeTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7bi5nZXQoby5lKS5kb25lUHJvbWlzZS50aGVuKGZ1bmN0aW9uKCl7dmFyIG49cygpO0FycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShuLnF1ZXJ5U2VsZWN0b3JBbGwoZSwic3R5bGVbbmctdHJhbnNpdGlvbl0iKSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBuLmdldEF0dHJpYnV0ZShlLCJuZy10cmFuc2l0aW9uIik9PT10fSkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gbi5yZW1vdmUodCl9KX0pfX0sZGVwczpbYixtLG8ucF0sbXVsdGk6ITB9XSx3PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5pbml0PWZ1bmN0aW9uKCl7T2JqZWN0KG8uWSkobmV3IHQpfSx0LnByb3RvdHlwZS5hZGRUb1dpbmRvdz1mdW5jdGlvbih0KXtvLlBhLmdldEFuZ3VsYXJUZXN0YWJpbGl0eT1mdW5jdGlvbihlLG4pe3ZvaWQgMD09PW4mJihuPSEwKTt2YXIgcj10LmZpbmRUZXN0YWJpbGl0eUluVHJlZShlLG4pO2lmKG51bGw9PXIpdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZmluZCB0ZXN0YWJpbGl0eSBmb3IgZWxlbWVudC4iKTtyZXR1cm4gcn0sby5QYS5nZXRBbGxBbmd1bGFyVGVzdGFiaWxpdGllcz1mdW5jdGlvbigpe3JldHVybiB0LmdldEFsbFRlc3RhYmlsaXRpZXMoKX0sby5QYS5nZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZ2V0QWxsUm9vdEVsZW1lbnRzKCl9LG8uUGEuZnJhbWV3b3JrU3RhYmlsaXplcnN8fChvLlBhLmZyYW1ld29ya1N0YWJpbGl6ZXJzPVtdKSxvLlBhLmZyYW1ld29ya1N0YWJpbGl6ZXJzLnB1c2goZnVuY3Rpb24odCl7dmFyIGU9by5QYS5nZXRBbGxBbmd1bGFyVGVzdGFiaWxpdGllcygpLG49ZS5sZW5ndGgscj0hMSxpPWZ1bmN0aW9uKGUpe3I9cnx8ZSwwPT0tLW4mJnQocil9O2UuZm9yRWFjaChmdW5jdGlvbih0KXt0LndoZW5TdGFibGUoaSl9KX0pfSx0LnByb3RvdHlwZS5maW5kVGVzdGFiaWxpdHlJblRyZWU9ZnVuY3Rpb24odCxlLG4pe2lmKG51bGw9PWUpcmV0dXJuIG51bGw7dmFyIHI9dC5nZXRUZXN0YWJpbGl0eShlKTtyZXR1cm4gbnVsbCE9cj9yOm4/cygpLmlzU2hhZG93Um9vdChlKT90aGlzLmZpbmRUZXN0YWJpbGl0eUluVHJlZSh0LHMoKS5nZXRIb3N0KGUpLCEwKTp0aGlzLmZpbmRUZXN0YWJpbGl0eUluVHJlZSh0LHMoKS5wYXJlbnRFbGVtZW50KGUpLCEwKTpudWxsfSx0fSgpLHg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX2RvYz10fXJldHVybiB0LnByb3RvdHlwZS5nZXRUaXRsZT1mdW5jdGlvbigpe3JldHVybiBzKCkuZ2V0VGl0bGUodGhpcy5fZG9jKX0sdC5wcm90b3R5cGUuc2V0VGl0bGU9ZnVuY3Rpb24odCl7cygpLnNldFRpdGxlKHRoaXMuX2RvYyx0KX0sdH0oKTtmdW5jdGlvbiBPKHQsZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBDT01QSUxFRCYmQ09NUElMRUR8fCgoby5QYS5uZz1vLlBhLm5nfHx7fSlbdF09ZSl9dmFyIEM9e0FwcGxpY2F0aW9uUmVmOm8uZyxOZ1pvbmU6by54fSxTPSJwcm9iZSIsRT0iY29yZVRva2VucyI7ZnVuY3Rpb24gayh0KXtyZXR1cm4gT2JqZWN0KG8uVSkodCl9ZnVuY3Rpb24gVCh0KXtyZXR1cm4gTyhTLGspLE8oRSxPYmplY3Qoci5hKSh7fSxDLCh0fHxbXSkucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbZS5uYW1lXT1lLnRva2VuLHR9LHt9KSkpLGZ1bmN0aW9uKCl7cmV0dXJuIGt9fXZhciBJPW5ldyBvLm8oIkV2ZW50TWFuYWdlclBsdWdpbnMiKSxBPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciBuPXRoaXM7dGhpcy5fem9uZT1lLHRoaXMuX2V2ZW50TmFtZVRvUGx1Z2luPW5ldyBNYXAsdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hbmFnZXI9bn0pLHRoaXMuX3BsdWdpbnM9dC5zbGljZSgpLnJldmVyc2UoKX1yZXR1cm4gdC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX2ZpbmRQbHVnaW5Gb3IoZSkuYWRkRXZlbnRMaXN0ZW5lcih0LGUsbil9LHQucHJvdG90eXBlLmFkZEdsb2JhbEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLl9maW5kUGx1Z2luRm9yKGUpLmFkZEdsb2JhbEV2ZW50TGlzdGVuZXIodCxlLG4pfSx0LnByb3RvdHlwZS5nZXRab25lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3pvbmV9LHQucHJvdG90eXBlLl9maW5kUGx1Z2luRm9yPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2V2ZW50TmFtZVRvUGx1Z2luLmdldCh0KTtpZihlKXJldHVybiBlO2Zvcih2YXIgbj10aGlzLl9wbHVnaW5zLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpZihpLnN1cHBvcnRzKHQpKXJldHVybiB0aGlzLl9ldmVudE5hbWVUb1BsdWdpbi5zZXQodCxpKSxpfXRocm93IG5ldyBFcnJvcigiTm8gZXZlbnQgbWFuYWdlciBwbHVnaW4gZm91bmQgZm9yIGV2ZW50ICIrdCl9LHR9KCksaj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5fZG9jPXR9cmV0dXJuIHQucHJvdG90eXBlLmFkZEdsb2JhbEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXMoKS5nZXRHbG9iYWxFdmVudFRhcmdldCh0aGlzLl9kb2MsdCk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBldmVudCB0YXJnZXQgIityKyIgZm9yIGV2ZW50ICIrZSk7cmV0dXJuIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihyLGUsbil9LHR9KCksUD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9zdHlsZXNTZXQ9bmV3IFNldH1yZXR1cm4gdC5wcm90b3R5cGUuYWRkU3R5bGVzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1uZXcgU2V0O3QuZm9yRWFjaChmdW5jdGlvbih0KXtlLl9zdHlsZXNTZXQuaGFzKHQpfHwoZS5fc3R5bGVzU2V0LmFkZCh0KSxuLmFkZCh0KSl9KSx0aGlzLm9uU3R5bGVzQWRkZWQobil9LHQucHJvdG90eXBlLm9uU3R5bGVzQWRkZWQ9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5nZXRBbGxTdHlsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9zdHlsZXNTZXQpfSx0fSgpLE09ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX2RvYz1lLG4uX2hvc3ROb2Rlcz1uZXcgU2V0LG4uX3N0eWxlTm9kZXM9bmV3IFNldCxuLl9ob3N0Tm9kZXMuYWRkKGUuaGVhZCksbn1yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5fYWRkU3R5bGVzVG9Ib3N0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpczt0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIHI9bi5fZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7ci50ZXh0Q29udGVudD10LG4uX3N0eWxlTm9kZXMuYWRkKGUuYXBwZW5kQ2hpbGQocikpfSl9LGUucHJvdG90eXBlLmFkZEhvc3Q9ZnVuY3Rpb24odCl7dGhpcy5fYWRkU3R5bGVzVG9Ib3N0KHRoaXMuX3N0eWxlc1NldCx0KSx0aGlzLl9ob3N0Tm9kZXMuYWRkKHQpfSxlLnByb3RvdHlwZS5yZW1vdmVIb3N0PWZ1bmN0aW9uKHQpe3RoaXMuX2hvc3ROb2Rlcy5kZWxldGUodCl9LGUucHJvdG90eXBlLm9uU3R5bGVzQWRkZWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLl9ob3N0Tm9kZXMuZm9yRWFjaChmdW5jdGlvbihuKXtyZXR1cm4gZS5fYWRkU3R5bGVzVG9Ib3N0KHQsbil9KX0sZS5wcm90b3R5cGUubmdPbkRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9zdHlsZU5vZGVzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHMoKS5yZW1vdmUodCl9KX0sZX0oUCksTj17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIseGh0bWw6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIn0sUj0vJUNPTVAlL2csRD0iX25naG9zdC0lQ09NUCUiLEw9Il9uZ2NvbnRlbnQtJUNPTVAlIjtmdW5jdGlvbiBGKHQsZSxuKXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyXTtBcnJheS5pc0FycmF5KGkpP0YodCxpLG4pOihpPWkucmVwbGFjZShSLHQpLG4ucHVzaChpKSl9cmV0dXJuIG59ZnVuY3Rpb24gVih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7ITE9PT10KGUpJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUucmV0dXJuVmFsdWU9ITEpfX12YXIgVT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLmV2ZW50TWFuYWdlcj10LHRoaXMuc2hhcmVkU3R5bGVzSG9zdD1lLHRoaXMucmVuZGVyZXJCeUNvbXBJZD1uZXcgTWFwLHRoaXMuZGVmYXVsdFJlbmRlcmVyPW5ldyB6KHQpfXJldHVybiB0LnByb3RvdHlwZS5jcmVhdGVSZW5kZXJlcj1mdW5jdGlvbih0LGUpe2lmKCF0fHwhZSlyZXR1cm4gdGhpcy5kZWZhdWx0UmVuZGVyZXI7c3dpdGNoKGUuZW5jYXBzdWxhdGlvbil7Y2FzZSBvLk8uRW11bGF0ZWQ6dmFyIG49dGhpcy5yZW5kZXJlckJ5Q29tcElkLmdldChlLmlkKTtyZXR1cm4gbnx8KG49bmV3IHEodGhpcy5ldmVudE1hbmFnZXIsdGhpcy5zaGFyZWRTdHlsZXNIb3N0LGUpLHRoaXMucmVuZGVyZXJCeUNvbXBJZC5zZXQoZS5pZCxuKSksbi5hcHBseVRvSG9zdCh0KSxuO2Nhc2Ugby5PLk5hdGl2ZTpjYXNlIG8uTy5TaGFkb3dEb206cmV0dXJuIG5ldyBZKHRoaXMuZXZlbnRNYW5hZ2VyLHRoaXMuc2hhcmVkU3R5bGVzSG9zdCx0LGUpO2RlZmF1bHQ6aWYoIXRoaXMucmVuZGVyZXJCeUNvbXBJZC5oYXMoZS5pZCkpe3ZhciByPUYoZS5pZCxlLnN0eWxlcyxbXSk7dGhpcy5zaGFyZWRTdHlsZXNIb3N0LmFkZFN0eWxlcyhyKSx0aGlzLnJlbmRlcmVyQnlDb21wSWQuc2V0KGUuaWQsdGhpcy5kZWZhdWx0UmVuZGVyZXIpfXJldHVybiB0aGlzLmRlZmF1bHRSZW5kZXJlcn19LHQucHJvdG90eXBlLmJlZ2luPWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24oKXt9LHR9KCksej1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5ldmVudE1hbmFnZXI9dCx0aGlzLmRhdGE9T2JqZWN0LmNyZWF0ZShudWxsKX1yZXR1cm4gdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbih0LGUpe3JldHVybiBlP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhOW2VdLHQpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCl9LHQucHJvdG90eXBlLmNyZWF0ZUNvbW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQodCl9LHQucHJvdG90eXBlLmNyZWF0ZVRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpfSx0LnByb3RvdHlwZS5hcHBlbmRDaGlsZD1mdW5jdGlvbih0LGUpe3QuYXBwZW5kQ2hpbGQoZSl9LHQucHJvdG90eXBlLmluc2VydEJlZm9yZT1mdW5jdGlvbih0LGUsbil7dCYmdC5pbnNlcnRCZWZvcmUoZSxuKX0sdC5wcm90b3R5cGUucmVtb3ZlQ2hpbGQ9ZnVuY3Rpb24odCxlKXt0JiZ0LnJlbW92ZUNoaWxkKGUpfSx0LnByb3RvdHlwZS5zZWxlY3RSb290RWxlbWVudD1mdW5jdGlvbih0KXt2YXIgZT0ic3RyaW5nIj09dHlwZW9mIHQ/ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KTp0O2lmKCFlKXRocm93IG5ldyBFcnJvcignVGhlIHNlbGVjdG9yICInK3QrJyIgZGlkIG5vdCBtYXRjaCBhbnkgZWxlbWVudHMnKTtyZXR1cm4gZS50ZXh0Q29udGVudD0iIixlfSx0LnByb3RvdHlwZS5wYXJlbnROb2RlPWZ1bmN0aW9uKHQpe3JldHVybiB0LnBhcmVudE5vZGV9LHQucHJvdG90eXBlLm5leHRTaWJsaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm5leHRTaWJsaW5nfSx0LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24odCxlLG4scil7aWYocil7ZT1yKyI6IitlO3ZhciBpPU5bcl07aT90LnNldEF0dHJpYnV0ZU5TKGksZSxuKTp0LnNldEF0dHJpYnV0ZShlLG4pfWVsc2UgdC5zZXRBdHRyaWJ1dGUoZSxuKX0sdC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlPWZ1bmN0aW9uKHQsZSxuKXtpZihuKXt2YXIgcj1OW25dO3I/dC5yZW1vdmVBdHRyaWJ1dGVOUyhyLGUpOnQucmVtb3ZlQXR0cmlidXRlKG4rIjoiK2UpfWVsc2UgdC5yZW1vdmVBdHRyaWJ1dGUoZSl9LHQucHJvdG90eXBlLmFkZENsYXNzPWZ1bmN0aW9uKHQsZSl7dC5jbGFzc0xpc3QuYWRkKGUpfSx0LnByb3RvdHlwZS5yZW1vdmVDbGFzcz1mdW5jdGlvbih0LGUpe3QuY2xhc3NMaXN0LnJlbW92ZShlKX0sdC5wcm90b3R5cGUuc2V0U3R5bGU9ZnVuY3Rpb24odCxlLG4scil7ciZvLkQuRGFzaENhc2U/dC5zdHlsZS5zZXRQcm9wZXJ0eShlLG4sciZvLkQuSW1wb3J0YW50PyJpbXBvcnRhbnQiOiIiKTp0LnN0eWxlW2VdPW59LHQucHJvdG90eXBlLnJlbW92ZVN0eWxlPWZ1bmN0aW9uKHQsZSxuKXtuJm8uRC5EYXNoQ2FzZT90LnN0eWxlLnJlbW92ZVByb3BlcnR5KGUpOnQuc3R5bGVbZV09IiJ9LHQucHJvdG90eXBlLnNldFByb3BlcnR5PWZ1bmN0aW9uKHQsZSxuKXtIKGUsInByb3BlcnR5IiksdFtlXT1ufSx0LnByb3RvdHlwZS5zZXRWYWx1ZT1mdW5jdGlvbih0LGUpe3Qubm9kZVZhbHVlPWV9LHQucHJvdG90eXBlLmxpc3Rlbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIEgoZSwibGlzdGVuZXIiKSwic3RyaW5nIj09dHlwZW9mIHQ/dGhpcy5ldmVudE1hbmFnZXIuYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0LGUsVihuKSk6dGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0LGUsVihuKSl9LHR9KCksQj0iQCIuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiBIKHQsZSl7aWYodC5jaGFyQ29kZUF0KDApPT09Qil0aHJvdyBuZXcgRXJyb3IoIkZvdW5kIHRoZSBzeW50aGV0aWMgIitlKyIgIit0KycuIFBsZWFzZSBpbmNsdWRlIGVpdGhlciAiQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUiIG9yICJOb29wQW5pbWF0aW9uc01vZHVsZSIgaW4geW91ciBhcHBsaWNhdGlvbi4nKX12YXIgVyxxPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIpe3ZhciBpPXQuY2FsbCh0aGlzLGUpfHx0aGlzO2kuY29tcG9uZW50PXI7dmFyIG89RihyLmlkLHIuc3R5bGVzLFtdKTtyZXR1cm4gbi5hZGRTdHlsZXMobyksaS5jb250ZW50QXR0cj1MLnJlcGxhY2UoUixyLmlkKSxpLmhvc3RBdHRyPUQucmVwbGFjZShSLHIuaWQpLGl9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUuYXBwbHlUb0hvc3Q9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuc2V0QXR0cmlidXRlLmNhbGwodGhpcyxlLHRoaXMuaG9zdEF0dHIsIiIpfSxlLnByb3RvdHlwZS5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudC5jYWxsKHRoaXMsZSxuKTtyZXR1cm4gdC5wcm90b3R5cGUuc2V0QXR0cmlidXRlLmNhbGwodGhpcyxyLHRoaXMuY29udGVudEF0dHIsIiIpLHJ9LGV9KHopLFk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scixpKXt2YXIgYT10LmNhbGwodGhpcyxlKXx8dGhpczthLnNoYXJlZFN0eWxlc0hvc3Q9bixhLmhvc3RFbD1yLGEuY29tcG9uZW50PWksYS5zaGFkb3dSb290PWkuZW5jYXBzdWxhdGlvbj09PW8uTy5TaGFkb3dEb20/ci5hdHRhY2hTaGFkb3coe21vZGU6Im9wZW4ifSk6ci5jcmVhdGVTaGFkb3dSb290KCksYS5zaGFyZWRTdHlsZXNIb3N0LmFkZEhvc3QoYS5zaGFkb3dSb290KTtmb3IodmFyIHM9RihpLmlkLGkuc3R5bGVzLFtdKSx1PTA7dTxzLmxlbmd0aDt1Kyspe3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7bC50ZXh0Q29udGVudD1zW3VdLGEuc2hhZG93Um9vdC5hcHBlbmRDaGlsZChsKX1yZXR1cm4gYX1yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5ub2RlT3JTaGFkb3dSb290PWZ1bmN0aW9uKHQpe3JldHVybiB0PT09dGhpcy5ob3N0RWw/dGhpcy5zaGFkb3dSb290OnR9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnNoYXJlZFN0eWxlc0hvc3QucmVtb3ZlSG9zdCh0aGlzLnNoYWRvd1Jvb3QpfSxlLnByb3RvdHlwZS5hcHBlbmRDaGlsZD1mdW5jdGlvbihlLG4pe3JldHVybiB0LnByb3RvdHlwZS5hcHBlbmRDaGlsZC5jYWxsKHRoaXMsdGhpcy5ub2RlT3JTaGFkb3dSb290KGUpLG4pfSxlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0LnByb3RvdHlwZS5pbnNlcnRCZWZvcmUuY2FsbCh0aGlzLHRoaXMubm9kZU9yU2hhZG93Um9vdChlKSxuLHIpfSxlLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbihlLG4pe3JldHVybiB0LnByb3RvdHlwZS5yZW1vdmVDaGlsZC5jYWxsKHRoaXMsdGhpcy5ub2RlT3JTaGFkb3dSb290KGUpLG4pfSxlLnByb3RvdHlwZS5wYXJlbnROb2RlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm5vZGVPclNoYWRvd1Jvb3QodC5wcm90b3R5cGUucGFyZW50Tm9kZS5jYWxsKHRoaXMsdGhpcy5ub2RlT3JTaGFkb3dSb290KGUpKSl9LGV9KHopLEc9InVuZGVmaW5lZCIhPXR5cGVvZiBab25lJiZab25lLl9fc3ltYm9sX198fGZ1bmN0aW9uKHQpe3JldHVybiJfX3pvbmVfc3ltYm9sX18iK3R9LFE9RygiYWRkRXZlbnRMaXN0ZW5lciIpLEs9RygicmVtb3ZlRXZlbnRMaXN0ZW5lciIpLFo9e30sWD0iX196b25lX3N5bWJvbF9fcHJvcGFnYXRpb25TdG9wcGVkIjsidW5kZWZpbmVkIiE9dHlwZW9mIFpvbmUmJlpvbmVbRygiQkxBQ0tfTElTVEVEX0VWRU5UUyIpXSYmKFc9e30pO3ZhciAkPWZ1bmN0aW9uKHQpe3JldHVybiEhVyYmVy5oYXNPd25Qcm9wZXJ0eSh0KX0sSj1mdW5jdGlvbih0KXt2YXIgZT1aW3QudHlwZV07aWYoZSl7dmFyIG49dGhpc1tlXTtpZihuKXt2YXIgcj1bdF07aWYoMT09PW4ubGVuZ3RoKXJldHVybihhPW5bMF0pLnpvbmUhPT1ab25lLmN1cnJlbnQ/YS56b25lLnJ1bihhLmhhbmRsZXIsdGhpcyxyKTphLmhhbmRsZXIuYXBwbHkodGhpcyxyKTtmb3IodmFyIGk9bi5zbGljZSgpLG89MDtvPGkubGVuZ3RoJiYhMCE9PXRbWF07bysrKXt2YXIgYTsoYT1pW29dKS56b25lIT09Wm9uZS5jdXJyZW50P2Euem9uZS5ydW4oYS5oYW5kbGVyLHRoaXMscik6YS5oYW5kbGVyLmFwcGx5KHRoaXMscil9fX19LHR0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIpe3ZhciBvPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBvLm5nWm9uZT1uLHImJk9iamVjdChpLnIpKHIpfHxvLnBhdGNoRXZlbnQoKSxvfXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLnBhdGNoRXZlbnQ9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEV2ZW50JiZFdmVudCYmRXZlbnQucHJvdG90eXBlJiYhRXZlbnQucHJvdG90eXBlLl9fem9uZV9zeW1ib2xfX3N0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbil7dmFyIHQ9RXZlbnQucHJvdG90eXBlLl9fem9uZV9zeW1ib2xfX3N0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbj1FdmVudC5wcm90b3R5cGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO0V2ZW50LnByb3RvdHlwZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb249ZnVuY3Rpb24oKXt0aGlzJiYodGhpc1tYXT0hMCksdCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0sZS5wcm90b3R5cGUuc3VwcG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuITB9LGUucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMsaT1uO2lmKCF0W1FdfHxvLnguaXNJbkFuZ3VsYXJab25lKCkmJiEkKGUpKXQuYWRkRXZlbnRMaXN0ZW5lcihlLGksITEpO2Vsc2V7dmFyIGE9WltlXTthfHwoYT1aW2VdPUcoIkFOR1VMQVIiK2UrIkZBTFNFIikpO3ZhciBzPXRbYV0sdT1zJiZzLmxlbmd0aD4wO3N8fChzPXRbYV09W10pO3ZhciBsPSQoZSk/Wm9uZS5yb290OlpvbmUuY3VycmVudDtpZigwPT09cy5sZW5ndGgpcy5wdXNoKHt6b25lOmwsaGFuZGxlcjppfSk7ZWxzZXtmb3IodmFyIGM9ITEsZj0wO2Y8cy5sZW5ndGg7ZisrKWlmKHNbZl0uaGFuZGxlcj09PWkpe2M9ITA7YnJlYWt9Y3x8cy5wdXNoKHt6b25lOmwsaGFuZGxlcjppfSl9dXx8dFtRXShlLEosITEpfXJldHVybiBmdW5jdGlvbigpe3JldHVybiByLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxlLGkpfX0sZS5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dFtLXTtpZighcilyZXR1cm4gdC5yZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5KHQsW2UsbiwhMV0pO3ZhciBpPVpbZV0sbz1pJiZ0W2ldO2lmKCFvKXJldHVybiB0LnJlbW92ZUV2ZW50TGlzdGVuZXIuYXBwbHkodCxbZSxuLCExXSk7Zm9yKHZhciBhPSExLHM9MDtzPG8ubGVuZ3RoO3MrKylpZihvW3NdLmhhbmRsZXI9PT1uKXthPSEwLG8uc3BsaWNlKHMsMSk7YnJlYWt9YT8wPT09by5sZW5ndGgmJnIuYXBwbHkodCxbZSxKLCExXSk6dC5yZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5KHQsW2UsbiwhMV0pfSxlfShqKSxldD17cGFuOiEwLHBhbnN0YXJ0OiEwLHBhbm1vdmU6ITAscGFuZW5kOiEwLHBhbmNhbmNlbDohMCxwYW5sZWZ0OiEwLHBhbnJpZ2h0OiEwLHBhbnVwOiEwLHBhbmRvd246ITAscGluY2g6ITAscGluY2hzdGFydDohMCxwaW5jaG1vdmU6ITAscGluY2hlbmQ6ITAscGluY2hjYW5jZWw6ITAscGluY2hpbjohMCxwaW5jaG91dDohMCxwcmVzczohMCxwcmVzc3VwOiEwLHJvdGF0ZTohMCxyb3RhdGVzdGFydDohMCxyb3RhdGVtb3ZlOiEwLHJvdGF0ZWVuZDohMCxyb3RhdGVjYW5jZWw6ITAsc3dpcGU6ITAsc3dpcGVsZWZ0OiEwLHN3aXBlcmlnaHQ6ITAsc3dpcGV1cDohMCxzd2lwZWRvd246ITAsdGFwOiEwfSxudD1uZXcgby5vKCJIYW1tZXJHZXN0dXJlQ29uZmlnIikscnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5ldmVudHM9W10sdGhpcy5vdmVycmlkZXM9e319cmV0dXJuIHQucHJvdG90eXBlLmJ1aWxkSGFtbWVyPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBIYW1tZXIodCx0aGlzLm9wdGlvbnMpO2Zvcih2YXIgbiBpbiBlLmdldCgicGluY2giKS5zZXQoe2VuYWJsZTohMH0pLGUuZ2V0KCJyb3RhdGUiKS5zZXQoe2VuYWJsZTohMH0pLHRoaXMub3ZlcnJpZGVzKWUuZ2V0KG4pLnNldCh0aGlzLm92ZXJyaWRlc1tuXSk7cmV0dXJuIGV9LHR9KCksaXQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scil7dmFyIGk9dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIGkuX2NvbmZpZz1uLGkuY29uc29sZT1yLGl9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUuc3VwcG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuISghZXQuaGFzT3duUHJvcGVydHkodC50b0xvd2VyQ2FzZSgpKSYmIXRoaXMuaXNDdXN0b21FdmVudCh0KXx8IXdpbmRvdy5IYW1tZXImJih0aGlzLmNvbnNvbGUud2FybigiSGFtbWVyLmpzIGlzIG5vdCBsb2FkZWQsIGNhbiBub3QgYmluZCAnIit0KyInIGV2ZW50LiIpLDEpKX0sZS5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcyxpPXRoaXMubWFuYWdlci5nZXRab25lKCk7cmV0dXJuIGU9ZS50b0xvd2VyQ2FzZSgpLGkucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24oKXt2YXIgbz1yLl9jb25maWcuYnVpbGRIYW1tZXIodCksYT1mdW5jdGlvbih0KXtpLnJ1bkd1YXJkZWQoZnVuY3Rpb24oKXtuKHQpfSl9O3JldHVybiBvLm9uKGUsYSksZnVuY3Rpb24oKXtyZXR1cm4gby5vZmYoZSxhKX19KX0sZS5wcm90b3R5cGUuaXNDdXN0b21FdmVudD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29uZmlnLmV2ZW50cy5pbmRleE9mKHQpPi0xfSxlfShqKSxvdD1bImFsdCIsImNvbnRyb2wiLCJtZXRhIiwic2hpZnQiXSxhdD17YWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmFsdEtleX0sY29udHJvbDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jdHJsS2V5fSxtZXRhOmZ1bmN0aW9uKHQpe3JldHVybiB0Lm1ldGFLZXl9LHNoaWZ0OmZ1bmN0aW9uKHQpe3JldHVybiB0LnNoaWZ0S2V5fX0sc3Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSl8fHRoaXN9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUuc3VwcG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPWUucGFyc2VFdmVudE5hbWUodCl9LGUucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUucGFyc2VFdmVudE5hbWUobiksbz1lLmV2ZW50Q2FsbGJhY2soaS5mdWxsS2V5LHIsdGhpcy5tYW5hZ2VyLmdldFpvbmUoKSk7cmV0dXJuIHRoaXMubWFuYWdlci5nZXRab25lKCkucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24oKXtyZXR1cm4gcygpLm9uQW5kQ2FuY2VsKHQsaS5kb21FdmVudE5hbWUsbyl9KX0sZS5wYXJzZUV2ZW50TmFtZT1mdW5jdGlvbih0KXt2YXIgbj10LnRvTG93ZXJDYXNlKCkuc3BsaXQoIi4iKSxyPW4uc2hpZnQoKTtpZigwPT09bi5sZW5ndGh8fCJrZXlkb3duIiE9PXImJiJrZXl1cCIhPT1yKXJldHVybiBudWxsO3ZhciBpPWUuX25vcm1hbGl6ZUtleShuLnBvcCgpKSxvPSIiO2lmKG90LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9bi5pbmRleE9mKHQpO2U+LTEmJihuLnNwbGljZShlLDEpLG8rPXQrIi4iKX0pLG8rPWksMCE9bi5sZW5ndGh8fDA9PT1pLmxlbmd0aClyZXR1cm4gbnVsbDt2YXIgYT17fTtyZXR1cm4gYS5kb21FdmVudE5hbWU9cixhLmZ1bGxLZXk9byxhfSxlLmdldEV2ZW50RnVsbEtleT1mdW5jdGlvbih0KXt2YXIgZT0iIixuPXMoKS5nZXRFdmVudEtleSh0KTtyZXR1cm4iICI9PT0obj1uLnRvTG93ZXJDYXNlKCkpP249InNwYWNlIjoiLiI9PT1uJiYobj0iZG90Iiksb3QuZm9yRWFjaChmdW5jdGlvbihyKXtyIT1uJiYoMCxhdFtyXSkodCkmJihlKz1yKyIuIil9KSxlKz1ufSxlLmV2ZW50Q2FsbGJhY2s9ZnVuY3Rpb24odCxuLHIpe3JldHVybiBmdW5jdGlvbihpKXtlLmdldEV2ZW50RnVsbEtleShpKT09PXQmJnIucnVuR3VhcmRlZChmdW5jdGlvbigpe3JldHVybiBuKGkpfSl9fSxlLl9ub3JtYWxpemVLZXk9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UiZXNjIjpyZXR1cm4iZXNjYXBlIjtkZWZhdWx0OnJldHVybiB0fX0sZX0oaiksdXQ9ZnVuY3Rpb24oKXt9LGx0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLl9kb2M9ZSxufXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLnNhbml0aXplPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09ZSlyZXR1cm4gbnVsbDtzd2l0Y2godCl7Y2FzZSBvLkYuTk9ORTpyZXR1cm4gZTtjYXNlIG8uRi5IVE1MOnJldHVybiBlIGluc3RhbmNlb2YgZnQ/ZS5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5Oih0aGlzLmNoZWNrTm90U2FmZVZhbHVlKGUsIkhUTUwiKSxPYmplY3Qoby5DYSkodGhpcy5fZG9jLFN0cmluZyhlKSkpO2Nhc2Ugby5GLlNUWUxFOnJldHVybiBlIGluc3RhbmNlb2YgaHQ/ZS5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5Oih0aGlzLmNoZWNrTm90U2FmZVZhbHVlKGUsIlN0eWxlIiksT2JqZWN0KG8uRGEpKGUpKTtjYXNlIG8uRi5TQ1JJUFQ6aWYoZSBpbnN0YW5jZW9mIGR0KXJldHVybiBlLmNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHk7dGhyb3cgdGhpcy5jaGVja05vdFNhZmVWYWx1ZShlLCJTY3JpcHQiKSxuZXcgRXJyb3IoInVuc2FmZSB2YWx1ZSB1c2VkIGluIGEgc2NyaXB0IGNvbnRleHQiKTtjYXNlIG8uRi5VUkw6cmV0dXJuIGUgaW5zdGFuY2VvZiBtdHx8ZSBpbnN0YW5jZW9mIHB0P2UuY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eToodGhpcy5jaGVja05vdFNhZmVWYWx1ZShlLCJVUkwiKSxPYmplY3Qoby5FYSkoU3RyaW5nKGUpKSk7Y2FzZSBvLkYuUkVTT1VSQ0VfVVJMOmlmKGUgaW5zdGFuY2VvZiBtdClyZXR1cm4gZS5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5O3Rocm93IHRoaXMuY2hlY2tOb3RTYWZlVmFsdWUoZSwiUmVzb3VyY2VVUkwiKSxuZXcgRXJyb3IoInVuc2FmZSB2YWx1ZSB1c2VkIGluIGEgcmVzb3VyY2UgVVJMIGNvbnRleHQgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpIik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgU2VjdXJpdHlDb250ZXh0ICIrdCsiIChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKSIpfX0sZS5wcm90b3R5cGUuY2hlY2tOb3RTYWZlVmFsdWU9ZnVuY3Rpb24odCxlKXtpZih0IGluc3RhbmNlb2YgY3QpdGhyb3cgbmV3IEVycm9yKCJSZXF1aXJlZCBhIHNhZmUgIitlKyIsIGdvdCBhICIrdC5nZXRUeXBlTmFtZSgpKyIgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpIil9LGUucHJvdG90eXBlLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZnQodCl9LGUucHJvdG90eXBlLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGh0KHQpfSxlLnByb3RvdHlwZS5ieXBhc3NTZWN1cml0eVRydXN0U2NyaXB0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZHQodCl9LGUucHJvdG90eXBlLmJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmw9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwdCh0KX0sZS5wcm90b3R5cGUuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbXQodCl9LGV9KHV0KSxjdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5PXR9cmV0dXJuIHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlNhZmVWYWx1ZSBtdXN0IHVzZSBbcHJvcGVydHldPWJpbmRpbmc6ICIrdGhpcy5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5KyIgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpIn0sdH0oKSxmdD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5nZXRUeXBlTmFtZT1mdW5jdGlvbigpe3JldHVybiJIVE1MIn0sZX0oY3QpLGh0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLmdldFR5cGVOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIlN0eWxlIn0sZX0oY3QpLGR0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLmdldFR5cGVOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIlNjcmlwdCJ9LGV9KGN0KSxwdD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5nZXRUeXBlTmFtZT1mdW5jdGlvbigpe3JldHVybiJVUkwifSxlfShjdCksbXQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUuZ2V0VHlwZU5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4iUmVzb3VyY2VVUkwifSxlfShjdCkseXQ9W3twcm92aWRlOm8ueix1c2VWYWx1ZTppLnN9LHtwcm92aWRlOm8uQSx1c2VWYWx1ZTpmdW5jdGlvbigpe2QubWFrZUN1cnJlbnQoKSx3LmluaXQoKX0sbXVsdGk6ITB9LHtwcm92aWRlOmkucCx1c2VDbGFzczpnLGRlcHM6W21dfSx7cHJvdmlkZTptLHVzZUZhY3Rvcnk6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnR9LGRlcHM6W119XSxndD1PYmplY3Qoby5RKShvLlgsImJyb3dzZXIiLHl0KTtmdW5jdGlvbiB2dCgpe3JldHVybiBuZXcgby5sfXZhciBidD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7aWYodCl0aHJvdyBuZXcgRXJyb3IoIkJyb3dzZXJNb2R1bGUgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQuIElmIHlvdSBuZWVkIGFjY2VzcyB0byBjb21tb24gZGlyZWN0aXZlcyBzdWNoIGFzIE5nSWYgYW5kIE5nRm9yIGZyb20gYSBsYXp5IGxvYWRlZCBtb2R1bGUsIGltcG9ydCBDb21tb25Nb2R1bGUgaW5zdGVhZC4iKX1yZXR1cm4gdC53aXRoU2VydmVyVHJhbnNpdGlvbj1mdW5jdGlvbihlKXtyZXR1cm57bmdNb2R1bGU6dCxwcm92aWRlcnM6W3twcm92aWRlOm8uYyx1c2VWYWx1ZTplLmFwcElkfSx7cHJvdmlkZTpiLHVzZUV4aXN0aW5nOm8uY30sX119fSx0fSgpOyJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3d9LFpuOEQ6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gb30pO3ZhciByPW4oInBzVzAiKSxpPW4oIm1DaEYiKTtmdW5jdGlvbiBvKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpLE9iamVjdChyLmEpKGkuYSx0KX19LGFlY2Q6ZnVuY3Rpb24obW9kdWxlLF9fd2VicGFja19leHBvcnRzX18sX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCJhIixmdW5jdGlvbigpe3JldHVybiBQcmVJbml0TG9hZGVyU2VydmljZX0pO3ZhciBfcGFnZV9jaHVua19yZWNvcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXz1fX3dlYnBhY2tfcmVxdWlyZV9fKCJyZjMwIiksX2Vudmlyb25tZW50c19lbnZpcm9ubWVudF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fPV9fd2VicGFja19yZXF1aXJlX18oIkF5dFIiKSxfYW5ndWxhcl9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX189X193ZWJwYWNrX3JlcXVpcmVfXygiQ2NuRyIpLF9hbmd1bGFyX2NvbW1vbl9odHRwX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX189X193ZWJwYWNrX3JlcXVpcmVfXygidC9OYSIpLFByZUluaXRMb2FkZXJTZXJ2aWNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gUHJlSW5pdExvYWRlclNlcnZpY2UodCl7dGhpcy5odHRwPXR9cmV0dXJuIFByZUluaXRMb2FkZXJTZXJ2aWNlLnByb3RvdHlwZS5sb2FkUGFnZUF0SW5pdD1mdW5jdGlvbigpe2lmKDAhPV9lbnZpcm9ubWVudHNfZW52aXJvbm1lbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXy5hLnByb2R1Y3Rpb24pe2NvbnNvbGUubG9nKCJJUEwgOiBJbml0aWFsIHBhZ2UgbG9hZGVyIFtBUFBfSU5JVElBTElaRVJdIik7dmFyIGN1cnJVcmw9d2luZG93LmxvY2F0aW9uLmhyZWYscmVnZXg9bmV3IFJlZ0V4cCgiI1xcLy4qIiksbWF0Y2hBcnJheT1jdXJyVXJsLm1hdGNoKHJlZ2V4KSxjdXJyUGF0aD1tYXRjaEFycmF5WzBdLnNsaWNlKDEpO2NvbnNvbGUubG9nKCJVUkwgOiAiK2N1cnJVcmwpLGNvbnNvbGUubG9nKCJQYXRoIDogIitjdXJyUGF0aCk7dmFyIHJlY29yZD1fcGFnZV9jaHVua19yZWNvcmRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5hLmZpbmQoZnVuY3Rpb24odCl7cmV0dXJuIHQucGFnZU5hbWU9PWN1cnJQYXRofSk7aWYodm9pZCAwIT1yZWNvcmQpe2lmKGNvbnNvbGUubG9nKCJJUEwgOiBDb3JyZXNwb25kaW5nIHJlY29yZCBmb3VuZCA6ICIrcmVjb3JkLnBhZ2VOYW1lKyIgKCIrcmVjb3JkLmNodW5rVVJMKyIpIiksMD09cmVjb3JkLmNodW5rTG9hZGVkKXt2YXIgcmVxPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihyZXEub3BlbigiR0VUIixyZWNvcmQuY2h1bmtVUkwsITEpLHJlcS5zZW5kKG51bGwpLDIwMD09PXJlcS5zdGF0dXMpe3ZhciBkZWNvZGVkRGF0YT1hdG9iKHJlcS5yZXNwb25zZVRleHQpO2V2YWwoZGVjb2RlZERhdGEpLHJlY29yZC5jaHVua0xvYWRlZD0hMCxjb25zb2xlLmxvZygiSVBMIDogTG9hZGVkIDogIityZWNvcmQucGFnZU5hbWUrIiAoIityZWNvcmQuY2h1bmtVUkwrIikiKX1lbHNlIGNvbnNvbGUubG9nKCJJUEwgOiBFcnJvciB3aGlsZSBnZXR0aW5nIGRhdGE6ICVkICglcykiLHJlcS5zdGF0dXMscmVxLnN0YXR1c1RleHQpfX1lbHNlIGNvbnNvbGUubG9nKCJJUEwgOiBObyByZWNvcmQgZm91bmQsIHBhZ2UgY2FuJ3QgYmUgbG9hZGVkIGluaXRpYWxseS5cbklQTCA6IFRoaXMgbWF5IGJlIGFuIGVycm9yIGlmIHRoZSBwYXRoIGlzIG5vdCBwYXJ0IG9mIHRoZSBtYWluIGNodW5rIHRoYXQgaXMgZW1iZWRkZWQgaW4gdGhlIGh0bWwgcGFnZSIpfX0sUHJlSW5pdExvYWRlclNlcnZpY2UubmdJbmplY3RhYmxlRGVmPV9hbmd1bGFyX2NvcmVfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXy5SKHtmYWN0b3J5OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQcmVJbml0TG9hZGVyU2VydmljZShfYW5ndWxhcl9jb3JlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18uVihfYW5ndWxhcl9jb21tb25faHR0cF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fLmMpKX0sdG9rZW46UHJlSW5pdExvYWRlclNlcnZpY2UscHJvdmlkZWRJbjoicm9vdCJ9KSxQcmVJbml0TG9hZGVyU2VydmljZX0oKX0sYjdtVzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIHI9bigibXJTRyIpLGk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPXQuY2FsbCh0aGlzLCJhcmd1bWVudCBvdXQgb2YgcmFuZ2UiKXx8dGhpcztyZXR1cm4gbi5uYW1lPSJBcmd1bWVudE91dE9mUmFuZ2VFcnJvciIsT2JqZWN0LnNldFByb3RvdHlwZU9mKG4sZS5wcm90b3R5cGUpLG59cmV0dXJuIHIuYihlLHQpLGV9KEVycm9yKX0sYm5lNTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBzfSk7dmFyIHI9bigiNmJsRiIpLGk9bigiaXNieSIpLG89bigiMkJkaiIpLGE9bigiNjdZLyIpO2Z1bmN0aW9uIHModCxlLG4sdSl7cmV0dXJuIE9iamVjdChvLmEpKG4pJiYodT1uLG49dm9pZCAwKSx1P3ModCxlLG4pLnBpcGUoT2JqZWN0KGEuYSkoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChpLmEpKHQpP3UuYXBwbHkodm9pZCAwLHQpOnUodCl9KSk6bmV3IHIuYShmdW5jdGlvbihyKXshZnVuY3Rpb24gdChlLG4scixpLG8pe3ZhciBhO2lmKGZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZW1vdmVFdmVudExpc3RlbmVyfShlKSl7dmFyIHM9ZTtlLmFkZEV2ZW50TGlzdGVuZXIobixyLG8pLGE9ZnVuY3Rpb24oKXtyZXR1cm4gcy5yZW1vdmVFdmVudExpc3RlbmVyKG4scixvKX19ZWxzZSBpZihmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQub24mJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9mZn0oZSkpe3ZhciB1PWU7ZS5vbihuLHIpLGE9ZnVuY3Rpb24oKXtyZXR1cm4gdS5vZmYobixyKX19ZWxzZSBpZihmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuYWRkTGlzdGVuZXImJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlbW92ZUxpc3RlbmVyfShlKSl7dmFyIGw9ZTtlLmFkZExpc3RlbmVyKG4sciksYT1mdW5jdGlvbigpe3JldHVybiBsLnJlbW92ZUxpc3RlbmVyKG4scil9fWVsc2V7aWYoIWV8fCFlLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGV2ZW50IHRhcmdldCIpO2Zvcih2YXIgYz0wLGY9ZS5sZW5ndGg7YzxmO2MrKyl0KGVbY10sbixyLGksbyl9aS5hZGQoYSl9KHQsZSxmdW5jdGlvbih0KXtyLm5leHQoYXJndW1lbnRzLmxlbmd0aD4xP0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk6dCl9LHIsbil9KX1PYmplY3R9LGJ1anQ6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLG4uZChlLCJiIixmdW5jdGlvbigpe3JldHVybiB1fSk7dmFyIHI9bigiQ2NuRyIpLGk9KG4oIlVvZEgiKSxuKCJJcDBSIiksbigiRnpxYyIpLG4oIldmNHAiKSksbz1uKCJkV1pnIiksYT1uKCJ3RncxIikscz0obigibExBUCIpLHIuTWEoe2VuY2Fwc3VsYXRpb246MixzdHlsZXM6WyIubWF0LWJ1dHRvbiwubWF0LWZsYXQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6MDtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo4OHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czoycHg7b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWZsYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtaWNvbi1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1zdHJva2VkLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LWJ1dHRvbltkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9Lm1hdC1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1mbGF0LWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmxhdC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eToxfS5tYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtZmxhdC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1pY29uLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LXN0cm9rZWQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtYnV0dG9uIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e3RyYW5zaXRpb246bm9uZTtvcGFjaXR5OjB9Lm1hdC1idXR0b246aG92ZXIgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uOmhvdmVyIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eToxfS5tYXQtcmFpc2VkLWJ1dHRvbntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6MDtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo4OHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czoycHg7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zaXRpb246YmFja2dyb3VuZCAuNHMgY3ViaWMtYmV6aWVyKC4yNSwuOCwuMjUsMSksYm94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoLjQsMCwuMiwxKX0ubWF0LXJhaXNlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH0ubWF0LXJhaXNlZC1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXJhaXNlZC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MX0ubWF0LXJhaXNlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MCAzcHggMXB4IC0ycHggcmdiYSgwLDAsMCwuMiksMCAycHggMnB4IDAgcmdiYSgwLDAsMCwuMTQpLDAgMXB4IDVweCAwIHJnYmEoMCwwLDAsLjEyKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXJhaXNlZC1idXR0b257dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtcmFpc2VkLWJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MCA1cHggNXB4IC0zcHggcmdiYSgwLDAsMCwuMiksMCA4cHggMTBweCAxcHggcmdiYSgwLDAsMCwuMTQpLDAgM3B4IDE0cHggMnB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRde2JveC1zaGFkb3c6bm9uZX0ubWF0LXN0cm9rZWQtYnV0dG9ue2JvcmRlcjoxcHggc29saWQgY3VycmVudENvbG9yO3BhZGRpbmc6MCAxNXB4O2xpbmUtaGVpZ2h0OjM0cHh9Lm1hdC1zdHJva2VkLWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgwLDAsMCwuMiksMCAwIDAgMCByZ2JhKDAsMCwwLC4xNCksMCAwIDAgMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgwLDAsMCwuMiksMCAwIDAgMCByZ2JhKDAsMCwwLC4xNCksMCAwIDAgMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1mYWJ7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOjA7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6ODhweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6MnB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjRzIGN1YmljLWJlemllciguMjUsLjgsLjI1LDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKC40LDAsLjIsMSk7bWluLXdpZHRoOjA7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6NTZweDtoZWlnaHQ6NTZweDtwYWRkaW5nOjA7ZmxleC1zaHJpbms6MH0ubWF0LWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LWZhYltkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9Lm1hdC1mYWIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWZhYi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eToxfS5tYXQtZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtZmFiOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MCAzcHggMXB4IC0ycHggcmdiYSgwLDAsMCwuMiksMCAycHggMnB4IDAgcmdiYSgwLDAsMCwuMTQpLDAgMXB4IDVweCAwIHJnYmEoMCwwLDAsLjEyKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LWZhYnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1mYWI6bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjAgNXB4IDVweCAtM3B4IHJnYmEoMCwwLDAsLjIpLDAgOHB4IDEwcHggMXB4IHJnYmEoMCwwLDAsLjE0KSwwIDNweCAxNHB4IDJweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1mYWJbZGlzYWJsZWRde2JveC1zaGFkb3c6bm9uZX0ubWF0LWZhYjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjAgM3B4IDVweCAtMXB4IHJnYmEoMCwwLDAsLjIpLDAgNnB4IDEwcHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggMThweCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWZhYjpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MCA3cHggOHB4IC00cHggcmdiYSgwLDAsMCwuMiksMCAxMnB4IDE3cHggMnB4IHJnYmEoMCwwLDAsLjE0KSwwIDVweCAyMnB4IDRweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1mYWIgLm1hdC1idXR0b24td3JhcHBlcntwYWRkaW5nOjE2cHggMDtkaXNwbGF5OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDoyNHB4fS5tYXQtbWluaS1mYWJ7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOjA7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6ODhweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6MnB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjRzIGN1YmljLWJlemllciguMjUsLjgsLjI1LDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKC40LDAsLjIsMSk7bWluLXdpZHRoOjA7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtwYWRkaW5nOjA7ZmxleC1zaHJpbms6MH0ubWF0LW1pbmktZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtbWluaS1mYWJbZGlzYWJsZWRde2N1cnNvcjpkZWZhdWx0fS5tYXQtbWluaS1mYWIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LW1pbmktZmFiLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5OjF9Lm1hdC1taW5pLWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LW1pbmktZmFiOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MCAzcHggMXB4IC0ycHggcmdiYSgwLDAsMCwuMiksMCAycHggMnB4IDAgcmdiYSgwLDAsMCwuMTQpLDAgMXB4IDVweCAwIHJnYmEoMCwwLDAsLjEyKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LW1pbmktZmFie3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LW1pbmktZmFiOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDVweCA1cHggLTNweCByZ2JhKDAsMCwwLC4yKSwwIDhweCAxMHB4IDFweCByZ2JhKDAsMCwwLC4xNCksMCAzcHggMTRweCAycHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtbWluaS1mYWJbZGlzYWJsZWRde2JveC1zaGFkb3c6bm9uZX0ubWF0LW1pbmktZmFiOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MCAzcHggNXB4IC0xcHggcmdiYSgwLDAsMCwuMiksMCA2cHggMTBweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCAxOHB4IDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtbWluaS1mYWI6bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjAgN3B4IDhweCAtNHB4IHJnYmEoMCwwLDAsLjIpLDAgMTJweCAxN3B4IDJweCByZ2JhKDAsMCwwLC4xNCksMCA1cHggMjJweCA0cHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtbWluaS1mYWIgLm1hdC1idXR0b24td3JhcHBlcntwYWRkaW5nOjhweCAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1pY29uLWJ1dHRvbntwYWRkaW5nOjA7bWluLXdpZHRoOjA7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtmbGV4LXNocmluazowO2xpbmUtaGVpZ2h0OjQwcHg7Ym9yZGVyLXJhZGl1czo1MCV9Lm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1pY29uLWJ1dHRvbiBpe2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWJ1dHRvbi1yaXBwbGV7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZTtib3JkZXItcmFkaXVzOmluaGVyaXR9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmFkaXVzOmluaGVyaXQ7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAuMnMgY3ViaWMtYmV6aWVyKC4zNSwwLC4yNSwxKSxiYWNrZ3JvdW5kLWNvbG9yIC4ycyBjdWJpYy1iZXppZXIoLjM1LDAsLjI1LDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e3RyYW5zaXRpb246bm9uZX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9fS5tYXQtYnV0dG9uLXJpcHBsZS1yb3VuZHtib3JkZXItcmFkaXVzOjUwJTt6LWluZGV4OjF9Lm1hdC1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWZsYXQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWljb24tYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LW1pbmktZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LXJhaXNlZC1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtc3Ryb2tlZC1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qe3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uLC5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b257ZGlzcGxheTpibG9jaztmb250LXNpemU6aW5oZXJpdDt3aWR0aDoyLjVlbTtoZWlnaHQ6Mi41ZW19QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OmFjdGl2ZSl7Lm1hdC1idXR0b24sLm1hdC1mYWIsLm1hdC1mbGF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uLC5tYXQtbWluaS1mYWIsLm1hdC1yYWlzZWQtYnV0dG9ue291dGxpbmU6c29saWQgMXB4fX0iXSxkYXRhOnt9fSkpO2Z1bmN0aW9uIHUodCl7cmV0dXJuIHIuaWIoMixbci5lYig0MDI2NTMxODQsMSx7cmlwcGxlOjB9KSwodCgpKCksci5PYSgxLDAsbnVsbCxudWxsLDEsInNwYW4iLFtbImNsYXNzIiwibWF0LWJ1dHRvbi13cmFwcGVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLHIuWGEobnVsbCwwKSwodCgpKCksci5PYSgzLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtYnV0dG9uLXJpcHBsZSBtYXQtcmlwcGxlIl0sWyJtYXRSaXBwbGUiLCIiXV0sW1syLCJtYXQtYnV0dG9uLXJpcHBsZS1yb3VuZCIsbnVsbF0sWzIsIm1hdC1yaXBwbGUtdW5ib3VuZGVkIixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLHIuTmEoNCwyMTI5OTIsW1sxLDRdXSwwLGkucSxbci5rLHIueCxvLmEsWzIsaS5nXSxbMixhLmFdXSx7Y2VudGVyZWQ6WzAsImNlbnRlcmVkIl0sZGlzYWJsZWQ6WzEsImRpc2FibGVkIl0sdHJpZ2dlcjpbMiwidHJpZ2dlciJdfSxudWxsKSwodCgpKCksci5PYSg1LDAsbnVsbCxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJtYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXkiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSldLGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5jb21wb25lbnQ7dChlLDQsMCxuLmlzSWNvbkJ1dHRvbixuLl9pc1JpcHBsZURpc2FibGVkKCksbi5fZ2V0SG9zdEVsZW1lbnQoKSl9LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5jb21wb25lbnQ7dChlLDMsMCxuLmlzUm91bmRCdXR0b258fG4uaXNJY29uQnV0dG9uLHIuWWEoZSw0KS51bmJvdW5kZWQpfSl9fSxjcm5kOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj17Ii4vc3VwcG9ydC1zZWN0aW9uL3N1cHBvcnQtc2VjdGlvbi1sYXllci5tb2R1bGUubmdmYWN0b3J5IjpbIk40bHAiLDBdLCIuL3RlYW0tcm9zdGVyL3RlYW0tcm9zdGVyLWxheWVyLm1vZHVsZS5uZ2ZhY3RvcnkiOlsiVGtZayIsMV0sIi4vd2lraS1saWdodHByb3h5L3dpa2ktbGlnaHRwcm94eS1sYXllci5tb2R1bGUubmdmYWN0b3J5IjpbImdEamMiLDJdfTtmdW5jdGlvbiBpKHQpe3ZhciBlPXJbdF07cmV0dXJuIGU/bi5lKGVbMV0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gbihlWzBdKX0pOlByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXt2YXIgZT1uZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIG1vZHVsZSAiJyt0KyciLicpO3Rocm93IGUuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZX0pfWkua2V5cz1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyhyKX0saS5pZD0iY3JuZCIsdC5leHBvcnRzPWl9LGRXWmc6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLG4uZChlLCJjIixmdW5jdGlvbigpe3JldHVybiB1fSksbi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTt2YXIgcixpPW4oIkNjbkciKSxvPW4oIklwMFIiKSxhPSJ1bmRlZmluZWQiIT10eXBlb2YgSW50bCYmSW50bC52OEJyZWFrSXRlcmF0b3Iscz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5fcGxhdGZvcm1JZD10LHRoaXMuaXNCcm93c2VyPXRoaXMuX3BsYXRmb3JtSWQ/T2JqZWN0KG8ucSkodGhpcy5fcGxhdGZvcm1JZCk6Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmISFkb2N1bWVudCx0aGlzLkVER0U9dGhpcy5pc0Jyb3dzZXImJi8oZWRnZSkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHRoaXMuVFJJREVOVD10aGlzLmlzQnJvd3NlciYmLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0aGlzLkJMSU5LPXRoaXMuaXNCcm93c2VyJiYhKCF3aW5kb3cuY2hyb21lJiYhYSkmJiJ1bmRlZmluZWQiIT10eXBlb2YgQ1NTJiYhdGhpcy5FREdFJiYhdGhpcy5UUklERU5ULHRoaXMuV0VCS0lUPXRoaXMuaXNCcm93c2VyJiYvQXBwbGVXZWJLaXQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhdGhpcy5CTElOSyYmIXRoaXMuRURHRSYmIXRoaXMuVFJJREVOVCx0aGlzLklPUz10aGlzLmlzQnJvd3NlciYmL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiF3aW5kb3cuTVNTdHJlYW0sdGhpcy5GSVJFRk9YPXRoaXMuaXNCcm93c2VyJiYvKGZpcmVmb3h8bWluZWZpZWxkKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksdGhpcy5BTkRST0lEPXRoaXMuaXNCcm93c2VyJiYvYW5kcm9pZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiF0aGlzLlRSSURFTlQsdGhpcy5TQUZBUkk9dGhpcy5pc0Jyb3dzZXImJi9zYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZ0aGlzLldFQktJVH1yZXR1cm4gdC5uZ0luamVjdGFibGVEZWY9T2JqZWN0KGkuUikoe2ZhY3Rvcnk6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQoT2JqZWN0KGkuVikoaS56LDgpKX0sdG9rZW46dCxwcm92aWRlZEluOiJyb290In0pLHR9KCk7ZnVuY3Rpb24gdSgpe2lmKG51bGw9PXImJiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXRyeXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsbnVsbCxPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcj0hMH19KSl9ZmluYWxseXtyPXJ8fCExfXJldHVybiByfXZhciBsPWZ1bmN0aW9uKCl7fX0sZURrUDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBOfSksbi5kKGUsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIEV9KSxuLmQoZSwiZCIsZnVuY3Rpb24oKXtyZXR1cm4gU30pLG4uZChlLCJmIixmdW5jdGlvbigpe3JldHVybiBQfSksbi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSxuLmQoZSwiZyIsZnVuY3Rpb24oKXtyZXR1cm4gQ30pLG4uZChlLCJlIixmdW5jdGlvbigpe3JldHVybiBMfSksbi5kKGUsImgiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSxuLmQoZSwiaSIsZnVuY3Rpb24oKXtyZXR1cm4gRH0pO3ZhciByPW4oIkNjbkciKSxpPW4oIm42Z0ciKSxvPW4oInFBbFMiKSxhPW4oIklwMFIiKSxzPW4oIm1yU0ciKSx1PW4oIks5SWEiKSxsPW4oInB1Z1QiKSxjPW4oIjZibEYiKSxmPW4oInQ5ZloiKSxoPW4oImRXWmciKSxkPW4oIjRjMzUiKSxwPShuKCJZU2gyIiksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5lbmFibGU9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLmRpc2FibGU9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLmF0dGFjaD1mdW5jdGlvbigpe30sdH0oKSksbT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuc2Nyb2xsU3RyYXRlZ3k9bmV3IHAsdGhpcy5wYW5lbENsYXNzPSIiLHRoaXMuaGFzQmFja2Ryb3A9ITEsdGhpcy5iYWNrZHJvcENsYXNzPSJjZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wIix0JiZPYmplY3Qua2V5cyh0KS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PXRbZV19KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3JldHVybiBlW25dPXRbbl19KX19KCk7ZnVuY3Rpb24geSh0LGUpe2lmKCJ0b3AiIT09ZSYmImJvdHRvbSIhPT1lJiYiY2VudGVyIiE9PWUpdGhyb3cgRXJyb3IoIkNvbm5lY3RlZFBvc2l0aW9uOiBJbnZhbGlkICIrdCsnICInK2UrJyIuIEV4cGVjdGVkICJ0b3AiLCAiYm90dG9tIiBvciAiY2VudGVyIi4nKX1mdW5jdGlvbiBnKHQsZSl7aWYoInN0YXJ0IiE9PWUmJiJlbmQiIT09ZSYmImNlbnRlciIhPT1lKXRocm93IEVycm9yKCJDb25uZWN0ZWRQb3NpdGlvbjogSW52YWxpZCAiK3QrJyAiJytlKyciLiBFeHBlY3RlZCAic3RhcnQiLCAiZW5kIiBvciAiY2VudGVyIi4nKX12YXIgdj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl92aWV3cG9ydFJ1bGVyPXQsdGhpcy5fcHJldmlvdXNIVE1MU3R5bGVzPXt0b3A6IiIsbGVmdDoiIn0sdGhpcy5faXNFbmFibGVkPSExLHRoaXMuX2RvY3VtZW50PWV9cmV0dXJuIHQucHJvdG90eXBlLmF0dGFjaD1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7aWYodGhpcy5fY2FuQmVFbmFibGVkKCkpe3ZhciB0PXRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudDt0aGlzLl9wcmV2aW91c1Njcm9sbFBvc2l0aW9uPXRoaXMuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTY3JvbGxQb3NpdGlvbigpLHRoaXMuX3ByZXZpb3VzSFRNTFN0eWxlcy5sZWZ0PXQuc3R5bGUubGVmdHx8IiIsdGhpcy5fcHJldmlvdXNIVE1MU3R5bGVzLnRvcD10LnN0eWxlLnRvcHx8IiIsdC5zdHlsZS5sZWZ0PU9iamVjdChpLmMpKC10aGlzLl9wcmV2aW91c1Njcm9sbFBvc2l0aW9uLmxlZnQpLHQuc3R5bGUudG9wPU9iamVjdChpLmMpKC10aGlzLl9wcmV2aW91c1Njcm9sbFBvc2l0aW9uLnRvcCksdC5jbGFzc0xpc3QuYWRkKCJjZGstZ2xvYmFsLXNjcm9sbGJsb2NrIiksdGhpcy5faXNFbmFibGVkPSEwfX0sdC5wcm90b3R5cGUuZGlzYWJsZT1mdW5jdGlvbigpe2lmKHRoaXMuX2lzRW5hYmxlZCl7dmFyIHQ9dGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9dGhpcy5fZG9jdW1lbnQuYm9keSxuPXQuc3R5bGUuc2Nyb2xsQmVoYXZpb3J8fCIiLHI9ZS5zdHlsZS5zY3JvbGxCZWhhdmlvcnx8IiI7dGhpcy5faXNFbmFibGVkPSExLHQuc3R5bGUubGVmdD10aGlzLl9wcmV2aW91c0hUTUxTdHlsZXMubGVmdCx0LnN0eWxlLnRvcD10aGlzLl9wcmV2aW91c0hUTUxTdHlsZXMudG9wLHQuY2xhc3NMaXN0LnJlbW92ZSgiY2RrLWdsb2JhbC1zY3JvbGxibG9jayIpLHQuc3R5bGUuc2Nyb2xsQmVoYXZpb3I9ZS5zdHlsZS5zY3JvbGxCZWhhdmlvcj0iYXV0byIsd2luZG93LnNjcm9sbCh0aGlzLl9wcmV2aW91c1Njcm9sbFBvc2l0aW9uLmxlZnQsdGhpcy5fcHJldmlvdXNTY3JvbGxQb3NpdGlvbi50b3ApLHQuc3R5bGUuc2Nyb2xsQmVoYXZpb3I9bixlLnN0eWxlLnNjcm9sbEJlaGF2aW9yPXJ9fSx0LnByb3RvdHlwZS5fY2FuQmVFbmFibGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiY2RrLWdsb2JhbC1zY3JvbGxibG9jayIpfHx0aGlzLl9pc0VuYWJsZWQpcmV0dXJuITE7dmFyIHQ9dGhpcy5fZG9jdW1lbnQuYm9keSxlPXRoaXMuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTaXplKCk7cmV0dXJuIHQuc2Nyb2xsSGVpZ2h0PmUuaGVpZ2h0fHx0LnNjcm9sbFdpZHRoPmUud2lkdGh9LHR9KCk7ZnVuY3Rpb24gYigpe3JldHVybiBFcnJvcigiU2Nyb2xsIHN0cmF0ZWd5IGhhcyBhbHJlYWR5IGJlZW4gYXR0YWNoZWQuIil9dmFyIF89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLHIpe3ZhciBpPXRoaXM7dGhpcy5fc2Nyb2xsRGlzcGF0Y2hlcj10LHRoaXMuX25nWm9uZT1lLHRoaXMuX3ZpZXdwb3J0UnVsZXI9bix0aGlzLl9jb25maWc9cix0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb249bnVsbCx0aGlzLl9kZXRhY2g9ZnVuY3Rpb24oKXtpLmRpc2FibGUoKSxpLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkmJmkuX25nWm9uZS5ydW4oZnVuY3Rpb24oKXtyZXR1cm4gaS5fb3ZlcmxheVJlZi5kZXRhY2goKX0pfX1yZXR1cm4gdC5wcm90b3R5cGUuYXR0YWNoPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX292ZXJsYXlSZWYpdGhyb3cgYigpO3RoaXMuX292ZXJsYXlSZWY9dH0sdC5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZighdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uKXt2YXIgZT10aGlzLl9zY3JvbGxEaXNwYXRjaGVyLnNjcm9sbGVkKDApO3RoaXMuX2NvbmZpZyYmdGhpcy5fY29uZmlnLnRocmVzaG9sZCYmdGhpcy5fY29uZmlnLnRocmVzaG9sZD4xPyh0aGlzLl9pbml0aWFsU2Nyb2xsUG9zaXRpb249dGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCkudG9wLHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbj1lLnN1YnNjcmliZShmdW5jdGlvbigpe3ZhciBlPXQuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTY3JvbGxQb3NpdGlvbigpLnRvcDtNYXRoLmFicyhlLXQuX2luaXRpYWxTY3JvbGxQb3NpdGlvbik+dC5fY29uZmlnLnRocmVzaG9sZD90Ll9kZXRhY2goKTp0Ll9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCl9KSk6dGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uPWUuc3Vic2NyaWJlKHRoaXMuX2RldGFjaCl9fSx0LnByb3RvdHlwZS5kaXNhYmxlPWZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uJiYodGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uPW51bGwpfSx0fSgpO2Z1bmN0aW9uIHcodCxlKXtyZXR1cm4gZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB0LmJvdHRvbTxlLnRvcHx8dC50b3A+ZS5ib3R0b218fHQucmlnaHQ8ZS5sZWZ0fHx0LmxlZnQ+ZS5yaWdodH0pfWZ1bmN0aW9uIHgodCxlKXtyZXR1cm4gZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB0LnRvcDxlLnRvcHx8dC5ib3R0b20+ZS5ib3R0b218fHQubGVmdDxlLmxlZnR8fHQucmlnaHQ+ZS5yaWdodH0pfXZhciBPPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyKXt0aGlzLl9zY3JvbGxEaXNwYXRjaGVyPXQsdGhpcy5fdmlld3BvcnRSdWxlcj1lLHRoaXMuX25nWm9uZT1uLHRoaXMuX2NvbmZpZz1yLHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbj1udWxsfXJldHVybiB0LnByb3RvdHlwZS5hdHRhY2g9ZnVuY3Rpb24odCl7aWYodGhpcy5fb3ZlcmxheVJlZil0aHJvdyBiKCk7dGhpcy5fb3ZlcmxheVJlZj10fSx0LnByb3RvdHlwZS5lbmFibGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbnx8KHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbj10aGlzLl9zY3JvbGxEaXNwYXRjaGVyLnNjcm9sbGVkKHRoaXMuX2NvbmZpZz90aGlzLl9jb25maWcuc2Nyb2xsVGhyb3R0bGU6MCkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7aWYodC5fb3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpLHQuX2NvbmZpZyYmdC5fY29uZmlnLmF1dG9DbG9zZSl7dmFyIGU9dC5fb3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXQuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTaXplKCkscj1uLndpZHRoLGk9bi5oZWlnaHQ7dyhlLFt7d2lkdGg6cixoZWlnaHQ6aSxib3R0b206aSxyaWdodDpyLHRvcDowLGxlZnQ6MH1dKSYmKHQuZGlzYWJsZSgpLHQuX25nWm9uZS5ydW4oZnVuY3Rpb24oKXtyZXR1cm4gdC5fb3ZlcmxheVJlZi5kZXRhY2goKX0pKX19KSl9LHQucHJvdG90eXBlLmRpc2FibGU9ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb24mJih0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb249bnVsbCl9LHR9KCksQz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4scil7dmFyIGk9dGhpczt0aGlzLl9zY3JvbGxEaXNwYXRjaGVyPXQsdGhpcy5fdmlld3BvcnRSdWxlcj1lLHRoaXMuX25nWm9uZT1uLHRoaXMubm9vcD1mdW5jdGlvbigpe3JldHVybiBuZXcgcH0sdGhpcy5jbG9zZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IF8oaS5fc2Nyb2xsRGlzcGF0Y2hlcixpLl9uZ1pvbmUsaS5fdmlld3BvcnRSdWxlcix0KX0sdGhpcy5ibG9jaz1mdW5jdGlvbigpe3JldHVybiBuZXcgdihpLl92aWV3cG9ydFJ1bGVyLGkuX2RvY3VtZW50KX0sdGhpcy5yZXBvc2l0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgTyhpLl9zY3JvbGxEaXNwYXRjaGVyLGkuX3ZpZXdwb3J0UnVsZXIsaS5fbmdab25lLHQpfSx0aGlzLl9kb2N1bWVudD1yfXJldHVybiB0Lm5nSW5qZWN0YWJsZURlZj1PYmplY3Qoci5SKSh7ZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiBuZXcgdChPYmplY3Qoci5WKShvLmMpLE9iamVjdChyLlYpKG8uZSksT2JqZWN0KHIuVikoci54KSxPYmplY3Qoci5WKShhLmQpKX0sdG9rZW46dCxwcm92aWRlZEluOiJyb290In0pLHR9KCksUz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGU9dGhpczt0aGlzLl9hdHRhY2hlZE92ZXJsYXlzPVtdLHRoaXMuX2tleWRvd25MaXN0ZW5lcj1mdW5jdGlvbih0KXtlLl9hdHRhY2hlZE92ZXJsYXlzLmxlbmd0aCYmZS5fYXR0YWNoZWRPdmVybGF5c1tlLl9hdHRhY2hlZE92ZXJsYXlzLmxlbmd0aC0xXS5fa2V5ZG93bkV2ZW50cy5uZXh0KHQpfSx0aGlzLl9kb2N1bWVudD10fXJldHVybiB0LnByb3RvdHlwZS5uZ09uRGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2RldGFjaCgpfSx0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5faXNBdHRhY2hlZHx8KHRoaXMuX2RvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5fa2V5ZG93bkxpc3RlbmVyLCEwKSx0aGlzLl9pc0F0dGFjaGVkPSEwKSx0aGlzLl9hdHRhY2hlZE92ZXJsYXlzLnB1c2godCl9LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9hdHRhY2hlZE92ZXJsYXlzLmluZGV4T2YodCk7ZT4tMSYmdGhpcy5fYXR0YWNoZWRPdmVybGF5cy5zcGxpY2UoZSwxKSwwPT09dGhpcy5fYXR0YWNoZWRPdmVybGF5cy5sZW5ndGgmJnRoaXMuX2RldGFjaCgpfSx0LnByb3RvdHlwZS5fZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5faXNBdHRhY2hlZCYmKHRoaXMuX2RvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5fa2V5ZG93bkxpc3RlbmVyLCEwKSx0aGlzLl9pc0F0dGFjaGVkPSExKX0sdC5uZ0luamVjdGFibGVEZWY9T2JqZWN0KHIuUikoe2ZhY3Rvcnk6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQoT2JqZWN0KHIuVikoYS5kKSl9LHRva2VuOnQscHJvdmlkZWRJbjoicm9vdCJ9KSx0fSgpLEU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX2RvY3VtZW50PXR9cmV0dXJuIHQucHJvdG90eXBlLm5nT25EZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyRWxlbWVudCYmdGhpcy5fY29udGFpbmVyRWxlbWVudC5wYXJlbnROb2RlJiZ0aGlzLl9jb250YWluZXJFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fY29udGFpbmVyRWxlbWVudCl9LHQucHJvdG90eXBlLmdldENvbnRhaW5lckVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGFpbmVyRWxlbWVudHx8dGhpcy5fY3JlYXRlQ29udGFpbmVyKCksdGhpcy5fY29udGFpbmVyRWxlbWVudH0sdC5wcm90b3R5cGUuX2NyZWF0ZUNvbnRhaW5lcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuY2xhc3NMaXN0LmFkZCgiY2RrLW92ZXJsYXktY29udGFpbmVyIiksdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KSx0aGlzLl9jb250YWluZXJFbGVtZW50PXR9LHQubmdJbmplY3RhYmxlRGVmPU9iamVjdChyLlIpKHtmYWN0b3J5OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KE9iamVjdChyLlYpKGEuZCkpfSx0b2tlbjp0LHByb3ZpZGVkSW46InJvb3QifSksdH0oKSxrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyLGksbyxhKXt0aGlzLl9wb3J0YWxPdXRsZXQ9dCx0aGlzLl9ob3N0PWUsdGhpcy5fcGFuZT1uLHRoaXMuX2NvbmZpZz1yLHRoaXMuX25nWm9uZT1pLHRoaXMuX2tleWJvYXJkRGlzcGF0Y2hlcj1vLHRoaXMuX2RvY3VtZW50PWEsdGhpcy5fYmFja2Ryb3BFbGVtZW50PW51bGwsdGhpcy5fYmFja2Ryb3BDbGljaz1uZXcgdS5hLHRoaXMuX2F0dGFjaG1lbnRzPW5ldyB1LmEsdGhpcy5fZGV0YWNobWVudHM9bmV3IHUuYSx0aGlzLl9rZXlkb3duRXZlbnRzPW5ldyB1LmEsci5zY3JvbGxTdHJhdGVneSYmci5zY3JvbGxTdHJhdGVneS5hdHRhY2godGhpcyl9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwib3ZlcmxheUVsZW1lbnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFuZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImJhY2tkcm9wRWxlbWVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNrZHJvcEVsZW1lbnR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJob3N0RWxlbWVudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ob3N0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmF0dGFjaD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5fcG9ydGFsT3V0bGV0LmF0dGFjaCh0KTtyZXR1cm4gdGhpcy5fY29uZmlnLnBvc2l0aW9uU3RyYXRlZ3kmJnRoaXMuX2NvbmZpZy5wb3NpdGlvblN0cmF0ZWd5LmF0dGFjaCh0aGlzKSx0aGlzLl91cGRhdGVTdGFja2luZ09yZGVyKCksdGhpcy5fdXBkYXRlRWxlbWVudFNpemUoKSx0aGlzLl91cGRhdGVFbGVtZW50RGlyZWN0aW9uKCksdGhpcy5fY29uZmlnLnNjcm9sbFN0cmF0ZWd5JiZ0aGlzLl9jb25maWcuc2Nyb2xsU3RyYXRlZ3kuZW5hYmxlKCksdGhpcy5fbmdab25lLm9uU3RhYmxlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoT2JqZWN0KGYuYSkoMSkpLnN1YnNjcmliZShmdW5jdGlvbigpe2UuaGFzQXR0YWNoZWQoKSYmZS51cGRhdGVQb3NpdGlvbigpfSksdGhpcy5fdG9nZ2xlUG9pbnRlckV2ZW50cyghMCksdGhpcy5fY29uZmlnLmhhc0JhY2tkcm9wJiZ0aGlzLl9hdHRhY2hCYWNrZHJvcCgpLHRoaXMuX2NvbmZpZy5wYW5lbENsYXNzJiZ0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX3BhbmUsdGhpcy5fY29uZmlnLnBhbmVsQ2xhc3MsITApLHRoaXMuX2F0dGFjaG1lbnRzLm5leHQoKSx0aGlzLl9rZXlib2FyZERpc3BhdGNoZXIuYWRkKHRoaXMpLG59LHQucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe2lmKHRoaXMuaGFzQXR0YWNoZWQoKSl7dGhpcy5kZXRhY2hCYWNrZHJvcCgpLHRoaXMuX3RvZ2dsZVBvaW50ZXJFdmVudHMoITEpLHRoaXMuX2NvbmZpZy5wb3NpdGlvblN0cmF0ZWd5JiZ0aGlzLl9jb25maWcucG9zaXRpb25TdHJhdGVneS5kZXRhY2gmJnRoaXMuX2NvbmZpZy5wb3NpdGlvblN0cmF0ZWd5LmRldGFjaCgpLHRoaXMuX2NvbmZpZy5zY3JvbGxTdHJhdGVneSYmdGhpcy5fY29uZmlnLnNjcm9sbFN0cmF0ZWd5LmRpc2FibGUoKTt2YXIgdD10aGlzLl9wb3J0YWxPdXRsZXQuZGV0YWNoKCk7cmV0dXJuIHRoaXMuX2RldGFjaG1lbnRzLm5leHQoKSx0aGlzLl9rZXlib2FyZERpc3BhdGNoZXIucmVtb3ZlKHRoaXMpLHR9fSx0LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5oYXNBdHRhY2hlZCgpO3RoaXMuX2NvbmZpZy5wb3NpdGlvblN0cmF0ZWd5JiZ0aGlzLl9jb25maWcucG9zaXRpb25TdHJhdGVneS5kaXNwb3NlKCksdGhpcy5fY29uZmlnLnNjcm9sbFN0cmF0ZWd5JiZ0aGlzLl9jb25maWcuc2Nyb2xsU3RyYXRlZ3kuZGlzYWJsZSgpLHRoaXMuZGV0YWNoQmFja2Ryb3AoKSx0aGlzLl9rZXlib2FyZERpc3BhdGNoZXIucmVtb3ZlKHRoaXMpLHRoaXMuX3BvcnRhbE91dGxldC5kaXNwb3NlKCksdGhpcy5fYXR0YWNobWVudHMuY29tcGxldGUoKSx0aGlzLl9iYWNrZHJvcENsaWNrLmNvbXBsZXRlKCksdGhpcy5fa2V5ZG93bkV2ZW50cy5jb21wbGV0ZSgpLHRoaXMuX2hvc3QmJnRoaXMuX2hvc3QucGFyZW50Tm9kZSYmKHRoaXMuX2hvc3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9ob3N0KSx0aGlzLl9ob3N0PW51bGwpLHRoaXMuX3BhbmU9bnVsbCx0JiZ0aGlzLl9kZXRhY2htZW50cy5uZXh0KCksdGhpcy5fZGV0YWNobWVudHMuY29tcGxldGUoKX0sdC5wcm90b3R5cGUuaGFzQXR0YWNoZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCl9LHQucHJvdG90eXBlLmJhY2tkcm9wQ2xpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2Ryb3BDbGljay5hc09ic2VydmFibGUoKX0sdC5wcm90b3R5cGUuYXR0YWNobWVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXR0YWNobWVudHMuYXNPYnNlcnZhYmxlKCl9LHQucHJvdG90eXBlLmRldGFjaG1lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RldGFjaG1lbnRzLmFzT2JzZXJ2YWJsZSgpfSx0LnByb3RvdHlwZS5rZXlkb3duRXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2tleWRvd25FdmVudHMuYXNPYnNlcnZhYmxlKCl9LHQucHJvdG90eXBlLmdldENvbmZpZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb25maWd9LHQucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9uPWZ1bmN0aW9uKCl7dGhpcy5fY29uZmlnLnBvc2l0aW9uU3RyYXRlZ3kmJnRoaXMuX2NvbmZpZy5wb3NpdGlvblN0cmF0ZWd5LmFwcGx5KCl9LHQucHJvdG90eXBlLnVwZGF0ZVNpemU9ZnVuY3Rpb24odCl7dGhpcy5fY29uZmlnPU9iamVjdChzLmEpKHt9LHRoaXMuX2NvbmZpZyx0KSx0aGlzLl91cGRhdGVFbGVtZW50U2l6ZSgpfSx0LnByb3RvdHlwZS5zZXREaXJlY3Rpb249ZnVuY3Rpb24odCl7dGhpcy5fY29uZmlnPU9iamVjdChzLmEpKHt9LHRoaXMuX2NvbmZpZyx7ZGlyZWN0aW9uOnR9KSx0aGlzLl91cGRhdGVFbGVtZW50RGlyZWN0aW9uKCl9LHQucHJvdG90eXBlLmdldERpcmVjdGlvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbmZpZy5kaXJlY3Rpb247cmV0dXJuIHQ/InN0cmluZyI9PXR5cGVvZiB0P3Q6dC52YWx1ZToibHRyIn0sdC5wcm90b3R5cGUuX3VwZGF0ZUVsZW1lbnREaXJlY3Rpb249ZnVuY3Rpb24oKXt0aGlzLl9ob3N0LnNldEF0dHJpYnV0ZSgiZGlyIix0aGlzLmdldERpcmVjdGlvbigpKX0sdC5wcm90b3R5cGUuX3VwZGF0ZUVsZW1lbnRTaXplPWZ1bmN0aW9uKCl7KHRoaXMuX2NvbmZpZy53aWR0aHx8MD09PXRoaXMuX2NvbmZpZy53aWR0aCkmJih0aGlzLl9wYW5lLnN0eWxlLndpZHRoPU9iamVjdChpLmMpKHRoaXMuX2NvbmZpZy53aWR0aCkpLCh0aGlzLl9jb25maWcuaGVpZ2h0fHwwPT09dGhpcy5fY29uZmlnLmhlaWdodCkmJih0aGlzLl9wYW5lLnN0eWxlLmhlaWdodD1PYmplY3QoaS5jKSh0aGlzLl9jb25maWcuaGVpZ2h0KSksKHRoaXMuX2NvbmZpZy5taW5XaWR0aHx8MD09PXRoaXMuX2NvbmZpZy5taW5XaWR0aCkmJih0aGlzLl9wYW5lLnN0eWxlLm1pbldpZHRoPU9iamVjdChpLmMpKHRoaXMuX2NvbmZpZy5taW5XaWR0aCkpLCh0aGlzLl9jb25maWcubWluSGVpZ2h0fHwwPT09dGhpcy5fY29uZmlnLm1pbkhlaWdodCkmJih0aGlzLl9wYW5lLnN0eWxlLm1pbkhlaWdodD1PYmplY3QoaS5jKSh0aGlzLl9jb25maWcubWluSGVpZ2h0KSksKHRoaXMuX2NvbmZpZy5tYXhXaWR0aHx8MD09PXRoaXMuX2NvbmZpZy5tYXhXaWR0aCkmJih0aGlzLl9wYW5lLnN0eWxlLm1heFdpZHRoPU9iamVjdChpLmMpKHRoaXMuX2NvbmZpZy5tYXhXaWR0aCkpLCh0aGlzLl9jb25maWcubWF4SGVpZ2h0fHwwPT09dGhpcy5fY29uZmlnLm1heEhlaWdodCkmJih0aGlzLl9wYW5lLnN0eWxlLm1heEhlaWdodD1PYmplY3QoaS5jKSh0aGlzLl9jb25maWcubWF4SGVpZ2h0KSl9LHQucHJvdG90eXBlLl90b2dnbGVQb2ludGVyRXZlbnRzPWZ1bmN0aW9uKHQpe3RoaXMuX3BhbmUuc3R5bGUucG9pbnRlckV2ZW50cz10PyJhdXRvIjoibm9uZSJ9LHQucHJvdG90eXBlLl9hdHRhY2hCYWNrZHJvcD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fYmFja2Ryb3BFbGVtZW50PXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuX2JhY2tkcm9wRWxlbWVudC5jbGFzc0xpc3QuYWRkKCJjZGstb3ZlcmxheS1iYWNrZHJvcCIpLHRoaXMuX2NvbmZpZy5iYWNrZHJvcENsYXNzJiZ0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX2JhY2tkcm9wRWxlbWVudCx0aGlzLl9jb25maWcuYmFja2Ryb3BDbGFzcywhMCksdGhpcy5faG9zdC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLl9iYWNrZHJvcEVsZW1lbnQsdGhpcy5faG9zdCksdGhpcy5fYmFja2Ryb3BFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXtyZXR1cm4gdC5fYmFja2Ryb3BDbGljay5uZXh0KGUpfSksInVuZGVmaW5lZCIhPXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU/dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKGZ1bmN0aW9uKCl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7dC5fYmFja2Ryb3BFbGVtZW50JiZ0Ll9iYWNrZHJvcEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgiY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZyIpfSl9KTp0aGlzLl9iYWNrZHJvcEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgiY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZyIpfSx0LnByb3RvdHlwZS5fdXBkYXRlU3RhY2tpbmdPcmRlcj1mdW5jdGlvbigpe3RoaXMuX2hvc3QubmV4dFNpYmxpbmcmJnRoaXMuX2hvc3QucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLl9ob3N0KX0sdC5wcm90b3R5cGUuZGV0YWNoQmFja2Ryb3A9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fYmFja2Ryb3BFbGVtZW50O2lmKGUpe3ZhciBuPWZ1bmN0aW9uKCl7ZSYmZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksdC5fYmFja2Ryb3BFbGVtZW50PT1lJiYodC5fYmFja2Ryb3BFbGVtZW50PW51bGwpfTtlLmNsYXNzTGlzdC5yZW1vdmUoImNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmciKSx0aGlzLl9jb25maWcuYmFja2Ryb3BDbGFzcyYmdGhpcy5fdG9nZ2xlQ2xhc3NlcyhlLHRoaXMuX2NvbmZpZy5iYWNrZHJvcENsYXNzLCExKSxlLmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLG4pLGUuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIsdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKGZ1bmN0aW9uKCl7cmV0dXJuIHNldFRpbWVvdXQobiw1MDApfSl9fSx0LnByb3RvdHlwZS5fdG9nZ2xlQ2xhc3Nlcz1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5jbGFzc0xpc3Q7T2JqZWN0KGkuYSkoZSkuZm9yRWFjaChmdW5jdGlvbih0KXtuP3IuYWRkKHQpOnIucmVtb3ZlKHQpfSl9LHR9KCksVD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4scil7dmFyIGk9dGhpczt0aGlzLl92aWV3cG9ydFJ1bGVyPWUsdGhpcy5fZG9jdW1lbnQ9bix0aGlzLl9wbGF0Zm9ybT1yLHRoaXMuX2lzSW5pdGlhbFJlbmRlcj0hMCx0aGlzLl9sYXN0Qm91bmRpbmdCb3hTaXplPXt3aWR0aDowLGhlaWdodDowfSx0aGlzLl9pc1B1c2hlZD0hMSx0aGlzLl9jYW5QdXNoPSEwLHRoaXMuX2dyb3dBZnRlck9wZW49ITEsdGhpcy5faGFzRmxleGlibGVEaW1lbnNpb25zPSEwLHRoaXMuX3Bvc2l0aW9uTG9ja2VkPSExLHRoaXMuX3ZpZXdwb3J0TWFyZ2luPTAsdGhpcy5zY3JvbGxhYmxlcz1bXSx0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnM9W10sdGhpcy5fcG9zaXRpb25DaGFuZ2VzPW5ldyB1LmEsdGhpcy5fcmVzaXplU3Vic2NyaXB0aW9uPWwuYS5FTVBUWSx0aGlzLl9vZmZzZXRYPTAsdGhpcy5fb2Zmc2V0WT0wLHRoaXMuX3Bvc2l0aW9uQ2hhbmdlU3Vic2NyaXB0aW9ucz0wLHRoaXMucG9zaXRpb25DaGFuZ2VzPWMuYS5jcmVhdGUoZnVuY3Rpb24odCl7dmFyIGU9aS5fcG9zaXRpb25DaGFuZ2VzLnN1YnNjcmliZSh0KTtyZXR1cm4gaS5fcG9zaXRpb25DaGFuZ2VTdWJzY3JpcHRpb25zKyssZnVuY3Rpb24oKXtlLnVuc3Vic2NyaWJlKCksaS5fcG9zaXRpb25DaGFuZ2VTdWJzY3JpcHRpb25zLS19fSksdGhpcy5zZXRPcmlnaW4odCl9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicG9zaXRpb25zIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9uc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5hdHRhY2g9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih0aGlzLl9vdmVybGF5UmVmJiZ0IT09dGhpcy5fb3ZlcmxheVJlZil0aHJvdyBFcnJvcigiVGhpcyBwb3NpdGlvbiBzdHJhdGVneSBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIGFuIG92ZXJsYXkiKTt0aGlzLl92YWxpZGF0ZVBvc2l0aW9ucygpLHQuaG9zdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgiY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveCIpLHRoaXMuX292ZXJsYXlSZWY9dCx0aGlzLl9ib3VuZGluZ0JveD10Lmhvc3RFbGVtZW50LHRoaXMuX3BhbmU9dC5vdmVybGF5RWxlbWVudCx0aGlzLl9yZXNpemVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9yZXNpemVTdWJzY3JpcHRpb249dGhpcy5fdmlld3BvcnRSdWxlci5jaGFuZ2UoKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSgpfSl9LHQucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKCl7aWYoISh0aGlzLl9pc0Rpc3Bvc2VkfHx0aGlzLl9wbGF0Zm9ybSYmIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcikpaWYoIXRoaXMuX2lzSW5pdGlhbFJlbmRlciYmdGhpcy5fcG9zaXRpb25Mb2NrZWQmJnRoaXMuX2xhc3RQb3NpdGlvbil0aGlzLnJlYXBwbHlMYXN0UG9zaXRpb24oKTtlbHNle3RoaXMuX3Jlc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXMoKSx0aGlzLl9yZXNldEJvdW5kaW5nQm94U3R5bGVzKCksdGhpcy5fdmlld3BvcnRSZWN0PXRoaXMuX2dldE5hcnJvd2VkVmlld3BvcnRSZWN0KCksdGhpcy5fb3JpZ2luUmVjdD10aGlzLl9vcmlnaW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdGhpcy5fb3ZlcmxheVJlY3Q9dGhpcy5fcGFuZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtmb3IodmFyIHQsZT10aGlzLl9vcmlnaW5SZWN0LG49dGhpcy5fb3ZlcmxheVJlY3Qscj10aGlzLl92aWV3cG9ydFJlY3QsaT1bXSxvPTAsYT10aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnM7bzxhLmxlbmd0aDtvKyspe3ZhciBzPWFbb10sdT10aGlzLl9nZXRPcmlnaW5Qb2ludChlLHMpLGw9dGhpcy5fZ2V0T3ZlcmxheVBvaW50KHUsbixzKSxjPXRoaXMuX2dldE92ZXJsYXlGaXQobCxuLHIscyk7aWYoYy5pc0NvbXBsZXRlbHlXaXRoaW5WaWV3cG9ydClyZXR1cm4gdGhpcy5faXNQdXNoZWQ9ITEsdm9pZCB0aGlzLl9hcHBseVBvc2l0aW9uKHMsdSk7dGhpcy5fY2FuRml0V2l0aEZsZXhpYmxlRGltZW5zaW9ucyhjLGwscik/aS5wdXNoKHtwb3NpdGlvbjpzLG9yaWdpbjp1LG92ZXJsYXlSZWN0Om4sYm91bmRpbmdCb3hSZWN0OnRoaXMuX2NhbGN1bGF0ZUJvdW5kaW5nQm94UmVjdCh1LHMpfSk6KCF0fHx0Lm92ZXJsYXlGaXQudmlzaWJsZUFyZWE8Yy52aXNpYmxlQXJlYSkmJih0PXtvdmVybGF5Rml0OmMsb3ZlcmxheVBvaW50Omwsb3JpZ2luUG9pbnQ6dSxwb3NpdGlvbjpzLG92ZXJsYXlSZWN0Om59KX1pZihpLmxlbmd0aCl7Zm9yKHZhciBmPW51bGwsaD0tMSxkPTAscD1pO2Q8cC5sZW5ndGg7ZCsrKXt2YXIgbT1wW2RdLHk9bS5ib3VuZGluZ0JveFJlY3Qud2lkdGgqbS5ib3VuZGluZ0JveFJlY3QuaGVpZ2h0KihtLnBvc2l0aW9uLndlaWdodHx8MSk7eT5oJiYoaD15LGY9bSl9cmV0dXJuIHRoaXMuX2lzUHVzaGVkPSExLHZvaWQgdGhpcy5fYXBwbHlQb3NpdGlvbihmLnBvc2l0aW9uLGYub3JpZ2luKX1pZih0aGlzLl9jYW5QdXNoKXJldHVybiB0aGlzLl9pc1B1c2hlZD0hMCx2b2lkIHRoaXMuX2FwcGx5UG9zaXRpb24odC5wb3NpdGlvbix0Lm9yaWdpblBvaW50KTt0aGlzLl9hcHBseVBvc2l0aW9uKHQucG9zaXRpb24sdC5vcmlnaW5Qb2ludCl9fSx0LnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLl9yZXNpemVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKX0sdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX2lzRGlzcG9zZWR8fCh0aGlzLmRldGFjaCgpLHRoaXMuX2JvdW5kaW5nQm94PW51bGwsdGhpcy5fcG9zaXRpb25DaGFuZ2VzLmNvbXBsZXRlKCksdGhpcy5faXNEaXNwb3NlZD0hMCl9LHQucHJvdG90eXBlLnJlYXBwbHlMYXN0UG9zaXRpb249ZnVuY3Rpb24oKXtpZighdGhpcy5faXNEaXNwb3NlZCYmKCF0aGlzLl9wbGF0Zm9ybXx8dGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKSl7dGhpcy5fb3JpZ2luUmVjdD10aGlzLl9vcmlnaW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdGhpcy5fb3ZlcmxheVJlY3Q9dGhpcy5fcGFuZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0aGlzLl92aWV3cG9ydFJlY3Q9dGhpcy5fZ2V0TmFycm93ZWRWaWV3cG9ydFJlY3QoKTt2YXIgdD10aGlzLl9sYXN0UG9zaXRpb258fHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9uc1swXSxlPXRoaXMuX2dldE9yaWdpblBvaW50KHRoaXMuX29yaWdpblJlY3QsdCk7dGhpcy5fYXBwbHlQb3NpdGlvbih0LGUpfX0sdC5wcm90b3R5cGUud2l0aFNjcm9sbGFibGVDb250YWluZXJzPWZ1bmN0aW9uKHQpe3RoaXMuc2Nyb2xsYWJsZXM9dH0sdC5wcm90b3R5cGUud2l0aFBvc2l0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHJlZmVycmVkUG9zaXRpb25zPXQsLTE9PT10LmluZGV4T2YodGhpcy5fbGFzdFBvc2l0aW9uKSYmKHRoaXMuX2xhc3RQb3NpdGlvbj1udWxsKSx0aGlzLl92YWxpZGF0ZVBvc2l0aW9ucygpLHRoaXN9LHQucHJvdG90eXBlLndpdGhWaWV3cG9ydE1hcmdpbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdmlld3BvcnRNYXJnaW49dCx0aGlzfSx0LnByb3RvdHlwZS53aXRoRmxleGlibGVEaW1lbnNpb25zPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0hMCksdGhpcy5faGFzRmxleGlibGVEaW1lbnNpb25zPXQsdGhpc30sdC5wcm90b3R5cGUud2l0aEdyb3dBZnRlck9wZW49ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSEwKSx0aGlzLl9ncm93QWZ0ZXJPcGVuPXQsdGhpc30sdC5wcm90b3R5cGUud2l0aFB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSEwKSx0aGlzLl9jYW5QdXNoPXQsdGhpc30sdC5wcm90b3R5cGUud2l0aExvY2tlZFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0hMCksdGhpcy5fcG9zaXRpb25Mb2NrZWQ9dCx0aGlzfSx0LnByb3RvdHlwZS5zZXRPcmlnaW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX29yaWdpbj10IGluc3RhbmNlb2Ygci5rP3QubmF0aXZlRWxlbWVudDp0LHRoaXN9LHQucHJvdG90eXBlLndpdGhEZWZhdWx0T2Zmc2V0WD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fb2Zmc2V0WD10LHRoaXN9LHQucHJvdG90eXBlLndpdGhEZWZhdWx0T2Zmc2V0WT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fb2Zmc2V0WT10LHRoaXN9LHQucHJvdG90eXBlLndpdGhUcmFuc2Zvcm1PcmlnaW5Pbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtT3JpZ2luU2VsZWN0b3I9dCx0aGlzfSx0LnByb3RvdHlwZS5fZ2V0T3JpZ2luUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbjtpZigiY2VudGVyIj09ZS5vcmlnaW5YKW49dC5sZWZ0K3Qud2lkdGgvMjtlbHNle3ZhciByPXRoaXMuX2lzUnRsKCk/dC5yaWdodDp0LmxlZnQsaT10aGlzLl9pc1J0bCgpP3QubGVmdDp0LnJpZ2h0O249InN0YXJ0Ij09ZS5vcmlnaW5YP3I6aX1yZXR1cm57eDpuLHk6ImNlbnRlciI9PWUub3JpZ2luWT90LnRvcCt0LmhlaWdodC8yOiJ0b3AiPT1lLm9yaWdpblk/dC50b3A6dC5ib3R0b219fSx0LnByb3RvdHlwZS5fZ2V0T3ZlcmxheVBvaW50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtyZXR1cm4gcj0iY2VudGVyIj09bi5vdmVybGF5WD8tZS53aWR0aC8yOiJzdGFydCI9PT1uLm92ZXJsYXlYP3RoaXMuX2lzUnRsKCk/LWUud2lkdGg6MDp0aGlzLl9pc1J0bCgpPzA6LWUud2lkdGgse3g6dC54K3IseTp0LnkrKCJjZW50ZXIiPT1uLm92ZXJsYXlZPy1lLmhlaWdodC8yOiJ0b3AiPT1uLm92ZXJsYXlZPzA6LWUuaGVpZ2h0KX19LHQucHJvdG90eXBlLl9nZXRPdmVybGF5Rml0PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXQueCxvPXQueSxhPXRoaXMuX2dldE9mZnNldChyLCJ4Iikscz10aGlzLl9nZXRPZmZzZXQociwieSIpO2EmJihpKz1hKSxzJiYobys9cyk7dmFyIHU9MC1vLGw9bytlLmhlaWdodC1uLmhlaWdodCxjPXRoaXMuX3N1YnRyYWN0T3ZlcmZsb3dzKGUud2lkdGgsMC1pLGkrZS53aWR0aC1uLndpZHRoKSxmPXRoaXMuX3N1YnRyYWN0T3ZlcmZsb3dzKGUuaGVpZ2h0LHUsbCksaD1jKmY7cmV0dXJue3Zpc2libGVBcmVhOmgsaXNDb21wbGV0ZWx5V2l0aGluVmlld3BvcnQ6ZS53aWR0aCplLmhlaWdodD09PWgsZml0c0luVmlld3BvcnRWZXJ0aWNhbGx5OmY9PT1lLmhlaWdodCxmaXRzSW5WaWV3cG9ydEhvcml6b250YWxseTpjPT1lLndpZHRofX0sdC5wcm90b3R5cGUuX2NhbkZpdFdpdGhGbGV4aWJsZURpbWVuc2lvbnM9ZnVuY3Rpb24odCxlLG4pe2lmKHRoaXMuX2hhc0ZsZXhpYmxlRGltZW5zaW9ucyl7dmFyIHI9bi5ib3R0b20tZS55LGk9bi5yaWdodC1lLngsbz10aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpLm1pbkhlaWdodCxhPXRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkubWluV2lkdGg7cmV0dXJuKHQuZml0c0luVmlld3BvcnRWZXJ0aWNhbGx5fHxudWxsIT1vJiZvPD1yKSYmKHQuZml0c0luVmlld3BvcnRIb3Jpem9udGFsbHl8fG51bGwhPWEmJmE8PWkpfX0sdC5wcm90b3R5cGUuX3B1c2hPdmVybGF5T25TY3JlZW49ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl92aWV3cG9ydFJlY3Qscj1NYXRoLm1heCh0LngrZS53aWR0aC1uLnJpZ2h0LDApLGk9TWF0aC5tYXgodC55K2UuaGVpZ2h0LW4uYm90dG9tLDApLG89TWF0aC5tYXgobi50b3AtdC55LDApLGE9TWF0aC5tYXgobi5sZWZ0LXQueCwwKTtyZXR1cm57eDp0LngrKGUud2lkdGg8PW4ud2lkdGg/YXx8LXI6bi5sZWZ0LXQueCkseTp0LnkrKGUuaGVpZ2h0PD1uLmhlaWdodD9vfHwtaTpuLnRvcC10LnkpfX0sdC5wcm90b3R5cGUuX2FwcGx5UG9zaXRpb249ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9zZXRUcmFuc2Zvcm1PcmlnaW4odCksdGhpcy5fc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXMoZSx0KSx0aGlzLl9zZXRCb3VuZGluZ0JveFN0eWxlcyhlLHQpLHRoaXMuX2xhc3RQb3NpdGlvbj10LHRoaXMuX3Bvc2l0aW9uQ2hhbmdlU3Vic2NyaXB0aW9ucz4wKXt2YXIgbj1uZXcgZnVuY3Rpb24odCxlKXt0aGlzLmNvbm5lY3Rpb25QYWlyPXQsdGhpcy5zY3JvbGxhYmxlVmlld1Byb3BlcnRpZXM9ZX0odCx0aGlzLl9nZXRTY3JvbGxWaXNpYmlsaXR5KCkpO3RoaXMuX3Bvc2l0aW9uQ2hhbmdlcy5uZXh0KG4pfXRoaXMuX2lzSW5pdGlhbFJlbmRlcj0hMX0sdC5wcm90b3R5cGUuX3NldFRyYW5zZm9ybU9yaWdpbj1mdW5jdGlvbih0KXtpZih0aGlzLl90cmFuc2Zvcm1PcmlnaW5TZWxlY3Rvcil7dmFyIGUsbj10aGlzLl9ib3VuZGluZ0JveC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuX3RyYW5zZm9ybU9yaWdpblNlbGVjdG9yKSxyPXQub3ZlcmxheVk7ZT0iY2VudGVyIj09PXQub3ZlcmxheVg/ImNlbnRlciI6dGhpcy5faXNSdGwoKT8ic3RhcnQiPT09dC5vdmVybGF5WD8icmlnaHQiOiJsZWZ0Ijoic3RhcnQiPT09dC5vdmVybGF5WD8ibGVmdCI6InJpZ2h0Ijtmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKyluW2ldLnN0eWxlLnRyYW5zZm9ybU9yaWdpbj1lKyIgIityfX0sdC5wcm90b3R5cGUuX2NhbGN1bGF0ZUJvdW5kaW5nQm94UmVjdD1mdW5jdGlvbih0LGUpe3ZhciBuLHIsaSxvLGEscyx1PXRoaXMuX3ZpZXdwb3J0UmVjdCxsPXRoaXMuX2lzUnRsKCk7aWYoInRvcCI9PT1lLm92ZXJsYXlZKXI9dC55LG49dS5ib3R0b20tdC55O2Vsc2UgaWYoImJvdHRvbSI9PT1lLm92ZXJsYXlZKW49dS5oZWlnaHQtKGk9dS5oZWlnaHQtdC55KzIqdGhpcy5fdmlld3BvcnRNYXJnaW4pK3RoaXMuX3ZpZXdwb3J0TWFyZ2luO2Vsc2V7dmFyIGM9TWF0aC5taW4odS5ib3R0b20tdC55LHQueS11LmxlZnQpLGY9dGhpcy5fbGFzdEJvdW5kaW5nQm94U2l6ZS5oZWlnaHQ7cj10LnktYywobj0yKmMpPmYmJiF0aGlzLl9pc0luaXRpYWxSZW5kZXImJiF0aGlzLl9ncm93QWZ0ZXJPcGVuJiYocj10LnktZi8yKX1pZigiZW5kIj09PWUub3ZlcmxheVgmJiFsfHwic3RhcnQiPT09ZS5vdmVybGF5WCYmbClzPXUucmlnaHQtdC54K3RoaXMuX3ZpZXdwb3J0TWFyZ2luLG89dC54LXUubGVmdDtlbHNlIGlmKCJzdGFydCI9PT1lLm92ZXJsYXlYJiYhbHx8ImVuZCI9PT1lLm92ZXJsYXlYJiZsKWE9dC54LG89dS5yaWdodC10Lng7ZWxzZXtjPU1hdGgubWluKHUucmlnaHQtdC54LHQueC11LnRvcCk7dmFyIGg9dGhpcy5fbGFzdEJvdW5kaW5nQm94U2l6ZS53aWR0aDthPXQueC1jLChvPTIqYyk+aCYmIXRoaXMuX2lzSW5pdGlhbFJlbmRlciYmIXRoaXMuX2dyb3dBZnRlck9wZW4mJihhPXQueC1oLzIpfXJldHVybnt0b3A6cixsZWZ0OmEsYm90dG9tOmkscmlnaHQ6cyx3aWR0aDpvLGhlaWdodDpufX0sdC5wcm90b3R5cGUuX3NldEJvdW5kaW5nQm94U3R5bGVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fY2FsY3VsYXRlQm91bmRpbmdCb3hSZWN0KHQsZSk7dGhpcy5faXNJbml0aWFsUmVuZGVyfHx0aGlzLl9ncm93QWZ0ZXJPcGVufHwobi5oZWlnaHQ9TWF0aC5taW4obi5oZWlnaHQsdGhpcy5fbGFzdEJvdW5kaW5nQm94U2l6ZS5oZWlnaHQpLG4ud2lkdGg9TWF0aC5taW4obi53aWR0aCx0aGlzLl9sYXN0Qm91bmRpbmdCb3hTaXplLndpZHRoKSk7dmFyIHI9e307aWYodGhpcy5faGFzRXhhY3RQb3NpdGlvbigpKXIudG9wPXIubGVmdD0iMCIsci5ib3R0b209ci5yaWdodD0iIixyLndpZHRoPXIuaGVpZ2h0PSIxMDAlIjtlbHNle3ZhciBvPXRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkubWF4SGVpZ2h0LGE9dGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5tYXhXaWR0aDtyLmhlaWdodD1PYmplY3QoaS5jKShuLmhlaWdodCksci50b3A9T2JqZWN0KGkuYykobi50b3ApLHIuYm90dG9tPU9iamVjdChpLmMpKG4uYm90dG9tKSxyLndpZHRoPU9iamVjdChpLmMpKG4ud2lkdGgpLHIubGVmdD1PYmplY3QoaS5jKShuLmxlZnQpLHIucmlnaHQ9T2JqZWN0KGkuYykobi5yaWdodCksci5hbGlnbkl0ZW1zPSJjZW50ZXIiPT09ZS5vdmVybGF5WD8iY2VudGVyIjoiZW5kIj09PWUub3ZlcmxheVg/ImZsZXgtZW5kIjoiZmxleC1zdGFydCIsci5qdXN0aWZ5Q29udGVudD0iY2VudGVyIj09PWUub3ZlcmxheVk/ImNlbnRlciI6ImJvdHRvbSI9PT1lLm92ZXJsYXlZPyJmbGV4LWVuZCI6ImZsZXgtc3RhcnQiLG8mJihyLm1heEhlaWdodD1PYmplY3QoaS5jKShvKSksYSYmKHIubWF4V2lkdGg9T2JqZWN0KGkuYykoYSkpfXRoaXMuX2xhc3RCb3VuZGluZ0JveFNpemU9bixJKHRoaXMuX2JvdW5kaW5nQm94LnN0eWxlLHIpfSx0LnByb3RvdHlwZS5fcmVzZXRCb3VuZGluZ0JveFN0eWxlcz1mdW5jdGlvbigpe0kodGhpcy5fYm91bmRpbmdCb3guc3R5bGUse3RvcDoiMCIsbGVmdDoiMCIscmlnaHQ6IjAiLGJvdHRvbToiMCIsaGVpZ2h0OiIiLHdpZHRoOiIiLGFsaWduSXRlbXM6IiIsanVzdGlmeUNvbnRlbnQ6IiJ9KX0sdC5wcm90b3R5cGUuX3Jlc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXM9ZnVuY3Rpb24oKXtJKHRoaXMuX3BhbmUuc3R5bGUse3RvcDoiIixsZWZ0OiIiLGJvdHRvbToiIixyaWdodDoiIixwb3NpdGlvbjoiIn0pfSx0LnByb3RvdHlwZS5fc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj17fTt0aGlzLl9oYXNFeGFjdFBvc2l0aW9uKCk/KEkobix0aGlzLl9nZXRFeGFjdE92ZXJsYXlZKGUsdCkpLEkobix0aGlzLl9nZXRFeGFjdE92ZXJsYXlYKGUsdCkpKTpuLnBvc2l0aW9uPSJzdGF0aWMiO3ZhciByPSIiLGk9dGhpcy5fZ2V0T2Zmc2V0KGUsIngiKSxvPXRoaXMuX2dldE9mZnNldChlLCJ5Iik7aSYmKHIrPSJ0cmFuc2xhdGVYKCIraSsicHgpICIpLG8mJihyKz0idHJhbnNsYXRlWSgiK28rInB4KSIpLG4udHJhbnNmb3JtPXIudHJpbSgpLHRoaXMuX2hhc0ZsZXhpYmxlRGltZW5zaW9ucyYmdGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5tYXhIZWlnaHQmJihuLm1heEhlaWdodD0iIiksdGhpcy5faGFzRmxleGlibGVEaW1lbnNpb25zJiZ0aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpLm1heFdpZHRoJiYobi5tYXhXaWR0aD0iIiksSSh0aGlzLl9wYW5lLnN0eWxlLG4pfSx0LnByb3RvdHlwZS5fZ2V0RXhhY3RPdmVybGF5WT1mdW5jdGlvbih0LGUpe3ZhciBuPXt0b3A6bnVsbCxib3R0b206bnVsbH0scj10aGlzLl9nZXRPdmVybGF5UG9pbnQoZSx0aGlzLl9vdmVybGF5UmVjdCx0KTtyZXR1cm4gdGhpcy5faXNQdXNoZWQmJihyPXRoaXMuX3B1c2hPdmVybGF5T25TY3JlZW4ocix0aGlzLl9vdmVybGF5UmVjdCkpLCJib3R0b20iPT09dC5vdmVybGF5WT9uLmJvdHRvbT10aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LShyLnkrdGhpcy5fb3ZlcmxheVJlY3QuaGVpZ2h0KSsicHgiOm4udG9wPU9iamVjdChpLmMpKHIueSksbn0sdC5wcm90b3R5cGUuX2dldEV4YWN0T3ZlcmxheVg9ZnVuY3Rpb24odCxlKXt2YXIgbj17bGVmdDpudWxsLHJpZ2h0Om51bGx9LHI9dGhpcy5fZ2V0T3ZlcmxheVBvaW50KGUsdGhpcy5fb3ZlcmxheVJlY3QsdCk7cmV0dXJuIHRoaXMuX2lzUHVzaGVkJiYocj10aGlzLl9wdXNoT3ZlcmxheU9uU2NyZWVuKHIsdGhpcy5fb3ZlcmxheVJlY3QpKSwicmlnaHQiPT0odGhpcy5faXNSdGwoKT8iZW5kIj09PXQub3ZlcmxheVg/ImxlZnQiOiJyaWdodCI6ImVuZCI9PT10Lm92ZXJsYXlYPyJyaWdodCI6ImxlZnQiKT9uLnJpZ2h0PXRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aC0oci54K3RoaXMuX292ZXJsYXlSZWN0LndpZHRoKSsicHgiOm4ubGVmdD1PYmplY3QoaS5jKShyLngpLG59LHQucHJvdG90eXBlLl9nZXRTY3JvbGxWaXNpYmlsaXR5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fb3JpZ2luLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9dGhpcy5fcGFuZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXRoaXMuc2Nyb2xsYWJsZXMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfSk7cmV0dXJue2lzT3JpZ2luQ2xpcHBlZDp4KHQsbiksaXNPcmlnaW5PdXRzaWRlVmlldzp3KHQsbiksaXNPdmVybGF5Q2xpcHBlZDp4KGUsbiksaXNPdmVybGF5T3V0c2lkZVZpZXc6dyhlLG4pfX0sdC5wcm90b3R5cGUuX3N1YnRyYWN0T3ZlcmZsb3dzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyllW24tMV09YXJndW1lbnRzW25dO3JldHVybiBlLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0LU1hdGgubWF4KGUsMCl9LHQpfSx0LnByb3RvdHlwZS5fZ2V0TmFycm93ZWRWaWV3cG9ydFJlY3Q9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsZT10aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LG49dGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCk7cmV0dXJue3RvcDpuLnRvcCt0aGlzLl92aWV3cG9ydE1hcmdpbixsZWZ0Om4ubGVmdCt0aGlzLl92aWV3cG9ydE1hcmdpbixyaWdodDpuLmxlZnQrdC10aGlzLl92aWV3cG9ydE1hcmdpbixib3R0b206bi50b3ArZS10aGlzLl92aWV3cG9ydE1hcmdpbix3aWR0aDp0LTIqdGhpcy5fdmlld3BvcnRNYXJnaW4saGVpZ2h0OmUtMip0aGlzLl92aWV3cG9ydE1hcmdpbn19LHQucHJvdG90eXBlLl9pc1J0bD1mdW5jdGlvbigpe3JldHVybiJydGwiPT09dGhpcy5fb3ZlcmxheVJlZi5nZXREaXJlY3Rpb24oKX0sdC5wcm90b3R5cGUuX2hhc0V4YWN0UG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5faGFzRmxleGlibGVEaW1lbnNpb25zfHx0aGlzLl9pc1B1c2hlZH0sdC5wcm90b3R5cGUuX2dldE9mZnNldD1mdW5jdGlvbih0LGUpe3JldHVybiJ4Ij09PWU/bnVsbD09dC5vZmZzZXRYP3RoaXMuX29mZnNldFg6dC5vZmZzZXRYOm51bGw9PXQub2Zmc2V0WT90aGlzLl9vZmZzZXRZOnQub2Zmc2V0WX0sdC5wcm90b3R5cGUuX3ZhbGlkYXRlUG9zaXRpb25zPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX3ByZWZlcnJlZFBvc2l0aW9ucy5sZW5ndGgpdGhyb3cgRXJyb3IoIkZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneTogQXQgbGVhc3Qgb25lIHBvc2l0aW9uIGlzIHJlcXVpcmVkLiIpO3RoaXMuX3ByZWZlcnJlZFBvc2l0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHQpe2coIm9yaWdpblgiLHQub3JpZ2luWCkseSgib3JpZ2luWSIsdC5vcmlnaW5ZKSxnKCJvdmVybGF5WCIsdC5vdmVybGF5WCkseSgib3ZlcmxheVkiLHQub3ZlcmxheVkpfSl9LHR9KCk7ZnVuY3Rpb24gSSh0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pO3JldHVybiB0fXZhciBBPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyLGksbyl7dGhpcy5fcHJlZmVycmVkUG9zaXRpb25zPVtdLHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3k9bmV3IFQobixyLGksbykud2l0aEZsZXhpYmxlRGltZW5zaW9ucyghMSkud2l0aFB1c2goITEpLndpdGhWaWV3cG9ydE1hcmdpbigwKSx0aGlzLndpdGhGYWxsYmFja1Bvc2l0aW9uKHQsZSl9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiX2lzUnRsIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuInJ0bCI9PT10aGlzLl9vdmVybGF5UmVmLmdldERpcmVjdGlvbigpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwib25Qb3NpdGlvbkNoYW5nZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LnBvc2l0aW9uQ2hhbmdlc30sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInBvc2l0aW9ucyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnN9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuYXR0YWNoPWZ1bmN0aW9uKHQpe3RoaXMuX292ZXJsYXlSZWY9dCx0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmF0dGFjaCh0KSx0aGlzLl9kaXJlY3Rpb24mJih0LnNldERpcmVjdGlvbih0aGlzLl9kaXJlY3Rpb24pLHRoaXMuX2RpcmVjdGlvbj1udWxsKX0sdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuZGlzcG9zZSgpfSx0LnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmRldGFjaCgpfSx0LnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbigpe3RoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuYXBwbHkoKX0sdC5wcm90b3R5cGUucmVjYWxjdWxhdGVMYXN0UG9zaXRpb249ZnVuY3Rpb24oKXt0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LnJlYXBwbHlMYXN0UG9zaXRpb24oKX0sdC5wcm90b3R5cGUud2l0aFNjcm9sbGFibGVDb250YWluZXJzPWZ1bmN0aW9uKHQpe3RoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kud2l0aFNjcm9sbGFibGVDb250YWluZXJzKHQpfSx0LnByb3RvdHlwZS53aXRoRmFsbGJhY2tQb3NpdGlvbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uZXcgZnVuY3Rpb24odCxlLG4scil7dGhpcy5vZmZzZXRYPW4sdGhpcy5vZmZzZXRZPXIsdGhpcy5vcmlnaW5YPXQub3JpZ2luWCx0aGlzLm9yaWdpblk9dC5vcmlnaW5ZLHRoaXMub3ZlcmxheVg9ZS5vdmVybGF5WCx0aGlzLm92ZXJsYXlZPWUub3ZlcmxheVl9KHQsZSxuLHIpO3JldHVybiB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMucHVzaChpKSx0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LndpdGhQb3NpdGlvbnModGhpcy5fcHJlZmVycmVkUG9zaXRpb25zKSx0aGlzfSx0LnByb3RvdHlwZS53aXRoRGlyZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vdmVybGF5UmVmP3RoaXMuX292ZXJsYXlSZWYuc2V0RGlyZWN0aW9uKHQpOnRoaXMuX2RpcmVjdGlvbj10LHRoaXN9LHQucHJvdG90eXBlLndpdGhPZmZzZXRYPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LndpdGhEZWZhdWx0T2Zmc2V0WCh0KSx0aGlzfSx0LnByb3RvdHlwZS53aXRoT2Zmc2V0WT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcG9zaXRpb25TdHJhdGVneS53aXRoRGVmYXVsdE9mZnNldFkodCksdGhpc30sdC5wcm90b3R5cGUud2l0aExvY2tlZFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LndpdGhMb2NrZWRQb3NpdGlvbih0KSx0aGlzfSx0LnByb3RvdHlwZS53aXRoUG9zaXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnM9dC5zbGljZSgpLHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kud2l0aFBvc2l0aW9ucyh0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMpLHRoaXN9LHQucHJvdG90eXBlLnNldE9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcG9zaXRpb25TdHJhdGVneS5zZXRPcmlnaW4odCksdGhpc30sdH0oKSxqPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuX2Nzc1Bvc2l0aW9uPSJzdGF0aWMiLHRoaXMuX3RvcE9mZnNldD0iIix0aGlzLl9ib3R0b21PZmZzZXQ9IiIsdGhpcy5fbGVmdE9mZnNldD0iIix0aGlzLl9yaWdodE9mZnNldD0iIix0aGlzLl9hbGlnbkl0ZW1zPSIiLHRoaXMuX2p1c3RpZnlDb250ZW50PSIiLHRoaXMuX3dpZHRoPSIiLHRoaXMuX2hlaWdodD0iIn1yZXR1cm4gdC5wcm90b3R5cGUuYXR0YWNoPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0Q29uZmlnKCk7dGhpcy5fb3ZlcmxheVJlZj10LHRoaXMuX3dpZHRoJiYhZS53aWR0aCYmdC51cGRhdGVTaXplKHt3aWR0aDp0aGlzLl93aWR0aH0pLHRoaXMuX2hlaWdodCYmIWUuaGVpZ2h0JiZ0LnVwZGF0ZVNpemUoe2hlaWdodDp0aGlzLl9oZWlnaHR9KSx0Lmhvc3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoImNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyIil9LHQucHJvdG90eXBlLnRvcD1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9IiIpLHRoaXMuX2JvdHRvbU9mZnNldD0iIix0aGlzLl90b3BPZmZzZXQ9dCx0aGlzLl9hbGlnbkl0ZW1zPSJmbGV4LXN0YXJ0Iix0aGlzfSx0LnByb3RvdHlwZS5sZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0iIiksdGhpcy5fcmlnaHRPZmZzZXQ9IiIsdGhpcy5fbGVmdE9mZnNldD10LHRoaXMuX2p1c3RpZnlDb250ZW50PSJmbGV4LXN0YXJ0Iix0aGlzfSx0LnByb3RvdHlwZS5ib3R0b209ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSIiKSx0aGlzLl90b3BPZmZzZXQ9IiIsdGhpcy5fYm90dG9tT2Zmc2V0PXQsdGhpcy5fYWxpZ25JdGVtcz0iZmxleC1lbmQiLHRoaXN9LHQucHJvdG90eXBlLnJpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0iIiksdGhpcy5fbGVmdE9mZnNldD0iIix0aGlzLl9yaWdodE9mZnNldD10LHRoaXMuX2p1c3RpZnlDb250ZW50PSJmbGV4LWVuZCIsdGhpc30sdC5wcm90b3R5cGUud2lkdGg9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSIiKSx0aGlzLl9vdmVybGF5UmVmP3RoaXMuX292ZXJsYXlSZWYudXBkYXRlU2l6ZSh7d2lkdGg6dH0pOnRoaXMuX3dpZHRoPXQsdGhpc30sdC5wcm90b3R5cGUuaGVpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0iIiksdGhpcy5fb3ZlcmxheVJlZj90aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVNpemUoe2hlaWdodDp0fSk6dGhpcy5faGVpZ2h0PXQsdGhpc30sdC5wcm90b3R5cGUuY2VudGVySG9yaXpvbnRhbGx5PWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0iIiksdGhpcy5sZWZ0KHQpLHRoaXMuX2p1c3RpZnlDb250ZW50PSJjZW50ZXIiLHRoaXN9LHQucHJvdG90eXBlLmNlbnRlclZlcnRpY2FsbHk9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSIiKSx0aGlzLnRvcCh0KSx0aGlzLl9hbGlnbkl0ZW1zPSJjZW50ZXIiLHRoaXN9LHQucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKCl7aWYodGhpcy5fb3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpKXt2YXIgdD10aGlzLl9vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LnN0eWxlLGU9dGhpcy5fb3ZlcmxheVJlZi5ob3N0RWxlbWVudC5zdHlsZSxuPXRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCk7dC5wb3NpdGlvbj10aGlzLl9jc3NQb3NpdGlvbix0Lm1hcmdpbkxlZnQ9IjEwMCUiPT09bi53aWR0aD8iMCI6dGhpcy5fbGVmdE9mZnNldCx0Lm1hcmdpblRvcD0iMTAwJSI9PT1uLmhlaWdodD8iMCI6dGhpcy5fdG9wT2Zmc2V0LHQubWFyZ2luQm90dG9tPXRoaXMuX2JvdHRvbU9mZnNldCx0Lm1hcmdpblJpZ2h0PXRoaXMuX3JpZ2h0T2Zmc2V0LGUuanVzdGlmeUNvbnRlbnQ9IjEwMCUiPT09bi53aWR0aD8iZmxleC1zdGFydCI6dGhpcy5fanVzdGlmeUNvbnRlbnQsZS5hbGlnbkl0ZW1zPSIxMDAlIj09PW4uaGVpZ2h0PyJmbGV4LXN0YXJ0Ijp0aGlzLl9hbGlnbkl0ZW1zfX0sdC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe30sdH0oKSxQPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5fdmlld3BvcnRSdWxlcj10LHRoaXMuX2RvY3VtZW50PWUsdGhpcy5fcGxhdGZvcm09bn1yZXR1cm4gdC5wcm90b3R5cGUuZ2xvYmFsPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBqfSx0LnByb3RvdHlwZS5jb25uZWN0ZWRUbz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyBBKGUsbix0LHRoaXMuX3ZpZXdwb3J0UnVsZXIsdGhpcy5fZG9jdW1lbnQpfSx0LnByb3RvdHlwZS5mbGV4aWJsZUNvbm5lY3RlZFRvPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVCh0LHRoaXMuX3ZpZXdwb3J0UnVsZXIsdGhpcy5fZG9jdW1lbnQsdGhpcy5fcGxhdGZvcm0pfSx0Lm5nSW5qZWN0YWJsZURlZj1PYmplY3Qoci5SKSh7ZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiBuZXcgdChPYmplY3Qoci5WKShvLmUpLE9iamVjdChyLlYpKGEuZCksT2JqZWN0KHIuVikoaC5hLDgpKX0sdG9rZW46dCxwcm92aWRlZEluOiJyb290In0pLHR9KCksTT0wLE49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLHIsaSxvLGEscyx1KXt0aGlzLnNjcm9sbFN0cmF0ZWdpZXM9dCx0aGlzLl9vdmVybGF5Q29udGFpbmVyPWUsdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyPW4sdGhpcy5fcG9zaXRpb25CdWlsZGVyPXIsdGhpcy5fa2V5Ym9hcmREaXNwYXRjaGVyPWksdGhpcy5faW5qZWN0b3I9byx0aGlzLl9uZ1pvbmU9YSx0aGlzLl9kb2N1bWVudD1zLHRoaXMuX2RpcmVjdGlvbmFsaXR5PXV9cmV0dXJuIHQucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jcmVhdGVIb3N0RWxlbWVudCgpLG49dGhpcy5fY3JlYXRlUGFuZUVsZW1lbnQoZSkscj10aGlzLl9jcmVhdGVQb3J0YWxPdXRsZXQobiksaT1uZXcgbSh0KTtyZXR1cm4gaS5kaXJlY3Rpb249aS5kaXJlY3Rpb258fHRoaXMuX2RpcmVjdGlvbmFsaXR5LnZhbHVlLG5ldyBrKHIsZSxuLGksdGhpcy5fbmdab25lLHRoaXMuX2tleWJvYXJkRGlzcGF0Y2hlcix0aGlzLl9kb2N1bWVudCl9LHQucHJvdG90eXBlLnBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uQnVpbGRlcn0sdC5wcm90b3R5cGUuX2NyZWF0ZVBhbmVFbGVtZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBlLmlkPSJjZGstb3ZlcmxheS0iK00rKyxlLmNsYXNzTGlzdC5hZGQoImNkay1vdmVybGF5LXBhbmUiKSx0LmFwcGVuZENoaWxkKGUpLGV9LHQucHJvdG90eXBlLl9jcmVhdGVIb3N0RWxlbWVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiB0aGlzLl9vdmVybGF5Q29udGFpbmVyLmdldENvbnRhaW5lckVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0KSx0fSx0LnByb3RvdHlwZS5fY3JlYXRlUG9ydGFsT3V0bGV0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hcHBSZWZ8fCh0aGlzLl9hcHBSZWY9dGhpcy5faW5qZWN0b3IuZ2V0KHIuZykpLG5ldyBkLmIodCx0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsdGhpcy5fYXBwUmVmLHRoaXMuX2luamVjdG9yKX0sdH0oKSxSPW5ldyByLm8oImNkay1jb25uZWN0ZWQtb3ZlcmxheS1zY3JvbGwtc3RyYXRlZ3kiKTtmdW5jdGlvbiBEKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpfX12YXIgTD1mdW5jdGlvbigpe319LGVpaHM6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pO3ZhciByPXtlOnt9fX0sZ0kzQjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oIjZibEYiKSxpPW4oIlQxRE0iKSxvPW4oImlzYnkiKTtmdW5jdGlvbiBhKHQpe3JldHVybiFPYmplY3Qoby5hKSh0KSYmdC1wYXJzZUZsb2F0KHQpKzE+PTB9dmFyIHM9bigibmtZNyIpO2Z1bmN0aW9uIHUodCxlLG4pe3ZvaWQgMD09PXQmJih0PTApO3ZhciBvPS0xO3JldHVybiBhKGUpP289TnVtYmVyKGUpPDE/MTpOdW1iZXIoZSk6T2JqZWN0KHMuYSkoZSkmJihuPWUpLE9iamVjdChzLmEpKG4pfHwobj1pLmEpLG5ldyByLmEoZnVuY3Rpb24oZSl7dmFyIHI9YSh0KT90Oit0LW4ubm93KCk7cmV0dXJuIG4uc2NoZWR1bGUobCxyLHtpbmRleDowLHBlcmlvZDpvLHN1YnNjcmliZXI6ZX0pfSl9ZnVuY3Rpb24gbCh0KXt2YXIgZT10LmluZGV4LG49dC5wZXJpb2Qscj10LnN1YnNjcmliZXI7aWYoci5uZXh0KGUpLCFyLmNsb3NlZCl7aWYoLTE9PT1uKXJldHVybiByLmNvbXBsZXRlKCk7dC5pbmRleD1lKzEsdGhpcy5zY2hlZHVsZSh0LG4pfX1uLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pfSxnSWNZOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSxuKCJtclNHIik7dmFyIHI9bigiQ2NuRyIpO24oIlZOcjQiKSxuKCIwL3VRIiksbigiNjdZLyIpLG4oIlpZanQiKTt2YXIgaT1uZXcgci5vKCJOZ1ZhbHVlQWNjZXNzb3IiKX0saDlEcTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oIm1yU0ciKSxpPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXtyZXR1cm4gdC5jYWxsKHRoaXMpfHx0aGlzfXJldHVybiByLmIoZSx0KSxlLnByb3RvdHlwZS5zY2hlZHVsZT1mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0wKSx0aGlzfSxlfShuKCJwdWdUIikuYSk7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KTt2YXIgbz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dmFyIHI9dC5jYWxsKHRoaXMsZSxuKXx8dGhpcztyZXR1cm4gci5zY2hlZHVsZXI9ZSxyLndvcms9bixyLnBlbmRpbmc9ITEscn1yZXR1cm4gci5iKGUsdCksZS5wcm90b3R5cGUuc2NoZWR1bGU9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx0aGlzLmNsb3NlZClyZXR1cm4gdGhpczt0aGlzLnN0YXRlPXQ7dmFyIG49dGhpcy5pZCxyPXRoaXMuc2NoZWR1bGVyO3JldHVybiBudWxsIT1uJiYodGhpcy5pZD10aGlzLnJlY3ljbGVBc3luY0lkKHIsbixlKSksdGhpcy5wZW5kaW5nPSEwLHRoaXMuZGVsYXk9ZSx0aGlzLmlkPXRoaXMuaWR8fHRoaXMucmVxdWVzdEFzeW5jSWQocix0aGlzLmlkLGUpLHRoaXN9LGUucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49MCksc2V0SW50ZXJ2YWwodC5mbHVzaC5iaW5kKHQsdGhpcyksbil9LGUucHJvdG90eXBlLnJlY3ljbGVBc3luY0lkPWZ1bmN0aW9uKHQsZSxuKXtpZih2b2lkIDA9PT1uJiYobj0wKSxudWxsIT09biYmdGhpcy5kZWxheT09PW4mJiExPT09dGhpcy5wZW5kaW5nKXJldHVybiBlO2NsZWFySW50ZXJ2YWwoZSl9LGUucHJvdG90eXBlLmV4ZWN1dGU9ZnVuY3Rpb24odCxlKXtpZih0aGlzLmNsb3NlZClyZXR1cm4gbmV3IEVycm9yKCJleGVjdXRpbmcgYSBjYW5jZWxsZWQgYWN0aW9uIik7dGhpcy5wZW5kaW5nPSExO3ZhciBuPXRoaXMuX2V4ZWN1dGUodCxlKTtpZihuKXJldHVybiBuOyExPT09dGhpcy5wZW5kaW5nJiZudWxsIT10aGlzLmlkJiYodGhpcy5pZD10aGlzLnJlY3ljbGVBc3luY0lkKHRoaXMuc2NoZWR1bGVyLHRoaXMuaWQsbnVsbCkpfSxlLnByb3RvdHlwZS5fZXhlY3V0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPSExLHI9dm9pZCAwO3RyeXt0aGlzLndvcmsodCl9Y2F0Y2godCl7bj0hMCxyPSEhdCYmdHx8bmV3IEVycm9yKHQpfWlmKG4pcmV0dXJuIHRoaXMudW5zdWJzY3JpYmUoKSxyfSxlLnByb3RvdHlwZS5fdW5zdWJzY3JpYmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmlkLGU9dGhpcy5zY2hlZHVsZXIsbj1lLmFjdGlvbnMscj1uLmluZGV4T2YodGhpcyk7dGhpcy53b3JrPW51bGwsdGhpcy5zdGF0ZT1udWxsLHRoaXMucGVuZGluZz0hMSx0aGlzLnNjaGVkdWxlcj1udWxsLC0xIT09ciYmbi5zcGxpY2UociwxKSxudWxsIT10JiYodGhpcy5pZD10aGlzLnJlY3ljbGVBc3luY0lkKGUsdCxudWxsKSksdGhpcy5kZWxheT1udWxsfSxlfShpKX0saFVXUDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiByfSksbigibXJTRyIpLG4oIkNjbkciKSxuKCJJcDBSIiksbigiT3pmQiIpO3ZhciByPWZ1bmN0aW9uKCl7fX0saUx4UTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIHI9ITEsaT17UHJvbWlzZTp2b2lkIDAsc2V0IHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcodCl7cj10fSxnZXQgdXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZygpe3JldHVybiByfX19LGloWVk6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pLG4uZChlLCJjIixmdW5jdGlvbigpe3JldHVybiBpfSksbi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSxuLmQoZSwiZSIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLG4uZChlLCJmIixmdW5jdGlvbigpe3JldHVybiBkfSksbi5kKGUsImciLGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSxuLmQoZSwiaCIsZnVuY3Rpb24oKXtyZXR1cm4gcH0pLG4uZChlLCJpIixmdW5jdGlvbigpe3JldHVybiBsfSksbi5kKGUsImoiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSxuLmQoZSwiayIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLG4uZChlLCJsIixmdW5jdGlvbigpe3JldHVybiBofSksbi5kKGUsIm0iLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSxuLmQoZSwiZCIsZnVuY3Rpb24oKXtyZXR1cm4geX0pLG4uZChlLCJvIixmdW5jdGlvbigpe3JldHVybiB2fSksbi5kKGUsIm4iLGZ1bmN0aW9uKCl7cmV0dXJuIGd9KTt2YXIgcj1mdW5jdGlvbigpe30saT1mdW5jdGlvbigpe30sbz0iKiI7ZnVuY3Rpb24gYSh0LGUpe3JldHVybnt0eXBlOjcsbmFtZTp0LGRlZmluaXRpb25zOmUsb3B0aW9uczp7fX19ZnVuY3Rpb24gcyh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1udWxsKSx7dHlwZTo0LHN0eWxlczplLHRpbWluZ3M6dH19ZnVuY3Rpb24gdSh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1udWxsKSx7dHlwZTozLHN0ZXBzOnQsb3B0aW9uczplfX1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPW51bGwpLHt0eXBlOjIsc3RlcHM6dCxvcHRpb25zOmV9fWZ1bmN0aW9uIGModCl7cmV0dXJue3R5cGU6NixzdHlsZXM6dCxvZmZzZXQ6bnVsbH19ZnVuY3Rpb24gZih0LGUsbil7cmV0dXJue3R5cGU6MCxuYW1lOnQsc3R5bGVzOmUsb3B0aW9uczpufX1mdW5jdGlvbiBoKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49bnVsbCkse3R5cGU6MSxleHByOnQsYW5pbWF0aW9uOmUsb3B0aW9uczpufX1mdW5jdGlvbiBkKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD1udWxsKSx7dHlwZTo5LG9wdGlvbnM6dH19ZnVuY3Rpb24gcCh0LGUsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPW51bGwpLHt0eXBlOjExLHNlbGVjdG9yOnQsYW5pbWF0aW9uOmUsb3B0aW9uczpufX1mdW5jdGlvbiBtKHQpe1Byb21pc2UucmVzb2x2ZShudWxsKS50aGVuKHQpfXZhciB5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PWUmJihlPTApLHRoaXMuX29uRG9uZUZucz1bXSx0aGlzLl9vblN0YXJ0Rm5zPVtdLHRoaXMuX29uRGVzdHJveUZucz1bXSx0aGlzLl9zdGFydGVkPSExLHRoaXMuX2Rlc3Ryb3llZD0hMSx0aGlzLl9maW5pc2hlZD0hMSx0aGlzLnBhcmVudFBsYXllcj1udWxsLHRoaXMudG90YWxUaW1lPXQrZX1yZXR1cm4gdC5wcm90b3R5cGUuX29uRmluaXNoPWZ1bmN0aW9uKCl7dGhpcy5fZmluaXNoZWR8fCh0aGlzLl9maW5pc2hlZD0hMCx0aGlzLl9vbkRvbmVGbnMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdCgpfSksdGhpcy5fb25Eb25lRm5zPVtdKX0sdC5wcm90b3R5cGUub25TdGFydD1mdW5jdGlvbih0KXt0aGlzLl9vblN0YXJ0Rm5zLnB1c2godCl9LHQucHJvdG90eXBlLm9uRG9uZT1mdW5jdGlvbih0KXt0aGlzLl9vbkRvbmVGbnMucHVzaCh0KX0sdC5wcm90b3R5cGUub25EZXN0cm95PWZ1bmN0aW9uKHQpe3RoaXMuX29uRGVzdHJveUZucy5wdXNoKHQpfSx0LnByb3RvdHlwZS5oYXNTdGFydGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0YXJ0ZWR9LHQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmhhc1N0YXJ0ZWQoKXx8KHRoaXMuX29uU3RhcnQoKSx0aGlzLnRyaWdnZXJNaWNyb3Rhc2soKSksdGhpcy5fc3RhcnRlZD0hMH0sdC5wcm90b3R5cGUudHJpZ2dlck1pY3JvdGFzaz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7bShmdW5jdGlvbigpe3JldHVybiB0Ll9vbkZpbmlzaCgpfSl9LHQucHJvdG90eXBlLl9vblN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5fb25TdGFydEZucy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0KCl9KSx0aGlzLl9vblN0YXJ0Rm5zPVtdfSx0LnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUucmVzdGFydD1mdW5jdGlvbigpe30sdC5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKCl7dGhpcy5fb25GaW5pc2goKX0sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2Rlc3Ryb3llZHx8KHRoaXMuX2Rlc3Ryb3llZD0hMCx0aGlzLmhhc1N0YXJ0ZWQoKXx8dGhpcy5fb25TdGFydCgpLHRoaXMuZmluaXNoKCksdGhpcy5fb25EZXN0cm95Rm5zLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQoKX0pLHRoaXMuX29uRGVzdHJveUZucz1bXSl9LHQucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5zZXRQb3NpdGlvbj1mdW5jdGlvbih0KXt9LHQucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LHQucHJvdG90eXBlLnRyaWdnZXJDYWxsYmFjaz1mdW5jdGlvbih0KXt2YXIgZT0ic3RhcnQiPT10P3RoaXMuX29uU3RhcnRGbnM6dGhpcy5fb25Eb25lRm5zO2UuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdCgpfSksZS5sZW5ndGg9MH0sdH0oKSxnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgZT10aGlzO3RoaXMuX29uRG9uZUZucz1bXSx0aGlzLl9vblN0YXJ0Rm5zPVtdLHRoaXMuX2ZpbmlzaGVkPSExLHRoaXMuX3N0YXJ0ZWQ9ITEsdGhpcy5fZGVzdHJveWVkPSExLHRoaXMuX29uRGVzdHJveUZucz1bXSx0aGlzLnBhcmVudFBsYXllcj1udWxsLHRoaXMudG90YWxUaW1lPTAsdGhpcy5wbGF5ZXJzPXQ7dmFyIG49MCxyPTAsaT0wLG89dGhpcy5wbGF5ZXJzLmxlbmd0aDswPT1vP20oZnVuY3Rpb24oKXtyZXR1cm4gZS5fb25GaW5pc2goKX0pOnRoaXMucGxheWVycy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Qub25Eb25lKGZ1bmN0aW9uKCl7KytuPT1vJiZlLl9vbkZpbmlzaCgpfSksdC5vbkRlc3Ryb3koZnVuY3Rpb24oKXsrK3I9PW8mJmUuX29uRGVzdHJveSgpfSksdC5vblN0YXJ0KGZ1bmN0aW9uKCl7KytpPT1vJiZlLl9vblN0YXJ0KCl9KX0pLHRoaXMudG90YWxUaW1lPXRoaXMucGxheWVycy5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5tYXgodCxlLnRvdGFsVGltZSl9LDApfXJldHVybiB0LnByb3RvdHlwZS5fb25GaW5pc2g9ZnVuY3Rpb24oKXt0aGlzLl9maW5pc2hlZHx8KHRoaXMuX2ZpbmlzaGVkPSEwLHRoaXMuX29uRG9uZUZucy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0KCl9KSx0aGlzLl9vbkRvbmVGbnM9W10pfSx0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXJzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5pdCgpfSl9LHQucHJvdG90eXBlLm9uU3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5fb25TdGFydEZucy5wdXNoKHQpfSx0LnByb3RvdHlwZS5fb25TdGFydD1mdW5jdGlvbigpe3RoaXMuaGFzU3RhcnRlZCgpfHwodGhpcy5fc3RhcnRlZD0hMCx0aGlzLl9vblN0YXJ0Rm5zLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQoKX0pLHRoaXMuX29uU3RhcnRGbnM9W10pfSx0LnByb3RvdHlwZS5vbkRvbmU9ZnVuY3Rpb24odCl7dGhpcy5fb25Eb25lRm5zLnB1c2godCl9LHQucHJvdG90eXBlLm9uRGVzdHJveT1mdW5jdGlvbih0KXt0aGlzLl9vbkRlc3Ryb3lGbnMucHVzaCh0KX0sdC5wcm90b3R5cGUuaGFzU3RhcnRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGFydGVkfSx0LnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnRQbGF5ZXJ8fHRoaXMuaW5pdCgpLHRoaXMuX29uU3RhcnQoKSx0aGlzLnBsYXllcnMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdC5wbGF5KCl9KX0sdC5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLnBsYXllcnMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdC5wYXVzZSgpfSl9LHQucHJvdG90eXBlLnJlc3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnBsYXllcnMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXN0YXJ0KCl9KX0sdC5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKCl7dGhpcy5fb25GaW5pc2goKSx0aGlzLnBsYXllcnMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdC5maW5pc2goKX0pfSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fb25EZXN0cm95KCl9LHQucHJvdG90eXBlLl9vbkRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9kZXN0cm95ZWR8fCh0aGlzLl9kZXN0cm95ZWQ9ITAsdGhpcy5fb25GaW5pc2goKSx0aGlzLnBsYXllcnMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdC5kZXN0cm95KCl9KSx0aGlzLl9vbkRlc3Ryb3lGbnMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdCgpfSksdGhpcy5fb25EZXN0cm95Rm5zPVtdKX0sdC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLnBsYXllcnMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXNldCgpfSksdGhpcy5fZGVzdHJveWVkPSExLHRoaXMuX2ZpbmlzaGVkPSExLHRoaXMuX3N0YXJ0ZWQ9ITF9LHQucHJvdG90eXBlLnNldFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXQqdGhpcy50b3RhbFRpbWU7dGhpcy5wbGF5ZXJzLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49dC50b3RhbFRpbWU/TWF0aC5taW4oMSxlL3QudG90YWxUaW1lKToxO3Quc2V0UG9zaXRpb24obil9KX0sdC5wcm90b3R5cGUuZ2V0UG9zaXRpb249ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0aGlzLnBsYXllcnMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj1lLmdldFBvc2l0aW9uKCk7dD1NYXRoLm1pbihuLHQpfSksdH0sdC5wcm90b3R5cGUuYmVmb3JlRGVzdHJveT1mdW5jdGlvbigpe3RoaXMucGxheWVycy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuYmVmb3JlRGVzdHJveSYmdC5iZWZvcmVEZXN0cm95KCl9KX0sdC5wcm90b3R5cGUudHJpZ2dlckNhbGxiYWNrPWZ1bmN0aW9uKHQpe3ZhciBlPSJzdGFydCI9PXQ/dGhpcy5fb25TdGFydEZuczp0aGlzLl9vbkRvbmVGbnM7ZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0KCl9KSxlLmxlbmd0aD0wfSx0fSgpLHY9IiEifSxpc2J5OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KTt2YXIgcj1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aH19LGxMQVA6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4geX0pLG4uZChlLCJjIixmdW5jdGlvbigpe3JldHVybiB3fSksbi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIHh9KSxuLmQoZSwiZCIsZnVuY3Rpb24oKXtyZXR1cm4gT30pO3ZhciByPW4oIklwMFIiKSxpPW4oIkNjbkciKSxvPW4oIks5SWEiKSxhPW4oInB1Z1QiKSxzPW4oIkYvWEwiKSx1PW4oIllTaDIiKSxsPW4oInhNeUUiKSxjPW4oIkdpM2kiKSxmPW4oIlZuRC8iKSxoPW4oIjY3WS8iKSxkPW4oInQ5ZloiKSxwPW4oIm1yU0ciKSxtPW4oImRXWmciKTtuKCJuNmdHIik7dmFyIHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fb3JpZ2luPSJwcm9ncmFtIixlfXJldHVybiBPYmplY3QocC5iKShlLHQpLGUucHJvdG90eXBlLnNldEZvY3VzT3JpZ2luPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vcmlnaW49dCx0aGlzfSxlLnByb3RvdHlwZS5zZXRBY3RpdmVJdGVtPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLnNldEFjdGl2ZUl0ZW0uY2FsbCh0aGlzLGUpLHRoaXMuYWN0aXZlSXRlbSYmdGhpcy5hY3RpdmVJdGVtLmZvY3VzKHRoaXMuX29yaWdpbil9LGV9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgZT10aGlzO3RoaXMuX2l0ZW1zPXQsdGhpcy5fYWN0aXZlSXRlbUluZGV4PS0xLHRoaXMuX3dyYXA9ITEsdGhpcy5fbGV0dGVyS2V5U3RyZWFtPW5ldyBvLmEsdGhpcy5fdHlwZWFoZWFkU3Vic2NyaXB0aW9uPWEuYS5FTVBUWSx0aGlzLl92ZXJ0aWNhbD0hMCx0aGlzLl9za2lwUHJlZGljYXRlRm49ZnVuY3Rpb24odCl7cmV0dXJuIHQuZGlzYWJsZWR9LHRoaXMuX3ByZXNzZWRMZXR0ZXJzPVtdLHRoaXMudGFiT3V0PW5ldyBvLmEsdGhpcy5jaGFuZ2U9bmV3IG8uYSx0IGluc3RhbmNlb2YgaS5CJiZ0LmNoYW5nZXMuc3Vic2NyaWJlKGZ1bmN0aW9uKHQpe2lmKGUuX2FjdGl2ZUl0ZW0pe3ZhciBuPXQudG9BcnJheSgpLmluZGV4T2YoZS5fYWN0aXZlSXRlbSk7bj4tMSYmbiE9PWUuX2FjdGl2ZUl0ZW1JbmRleCYmKGUuX2FjdGl2ZUl0ZW1JbmRleD1uKX19KX1yZXR1cm4gdC5wcm90b3R5cGUuc2tpcFByZWRpY2F0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fc2tpcFByZWRpY2F0ZUZuPXQsdGhpc30sdC5wcm90b3R5cGUud2l0aFdyYXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JhcD0hMCx0aGlzfSx0LnByb3RvdHlwZS53aXRoVmVydGljYWxPcmllbnRhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9ITApLHRoaXMuX3ZlcnRpY2FsPXQsdGhpc30sdC5wcm90b3R5cGUud2l0aEhvcml6b250YWxPcmllbnRhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faG9yaXpvbnRhbD10LHRoaXN9LHQucHJvdG90eXBlLndpdGhUeXBlQWhlYWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih2b2lkIDA9PT10JiYodD0yMDApLHRoaXMuX2l0ZW1zLmxlbmd0aCYmdGhpcy5faXRlbXMuc29tZShmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdC5nZXRMYWJlbH0pKXRocm93IEVycm9yKCJMaXN0S2V5TWFuYWdlciBpdGVtcyBpbiB0eXBlYWhlYWQgbW9kZSBtdXN0IGltcGxlbWVudCB0aGUgYGdldExhYmVsYCBtZXRob2QuIik7cmV0dXJuIHRoaXMuX3R5cGVhaGVhZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3R5cGVhaGVhZFN1YnNjcmlwdGlvbj10aGlzLl9sZXR0ZXJLZXlTdHJlYW0ucGlwZShPYmplY3QobC5hKShmdW5jdGlvbih0KXtyZXR1cm4gZS5fcHJlc3NlZExldHRlcnMucHVzaCh0KX0pLE9iamVjdChjLmEpKHQpLE9iamVjdChmLmEpKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX3ByZXNzZWRMZXR0ZXJzLmxlbmd0aD4wfSksT2JqZWN0KGguYSkoZnVuY3Rpb24oKXtyZXR1cm4gZS5fcHJlc3NlZExldHRlcnMuam9pbigiIil9KSkuc3Vic2NyaWJlKGZ1bmN0aW9uKHQpe2Zvcih2YXIgbj1lLl9nZXRJdGVtc0FycmF5KCkscj0xO3I8bi5sZW5ndGgrMTtyKyspe3ZhciBpPShlLl9hY3RpdmVJdGVtSW5kZXgrciklbi5sZW5ndGgsbz1uW2ldO2lmKCFlLl9za2lwUHJlZGljYXRlRm4obykmJjA9PT1vLmdldExhYmVsKCkudG9VcHBlckNhc2UoKS50cmltKCkuaW5kZXhPZih0KSl7ZS5zZXRBY3RpdmVJdGVtKGkpO2JyZWFrfX1lLl9wcmVzc2VkTGV0dGVycz1bXX0pLHRoaXN9LHQucHJvdG90eXBlLnNldEFjdGl2ZUl0ZW09ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYWN0aXZlSXRlbUluZGV4O3RoaXMudXBkYXRlQWN0aXZlSXRlbSh0KSx0aGlzLl9hY3RpdmVJdGVtSW5kZXghPT1lJiZ0aGlzLmNoYW5nZS5uZXh0KHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCl9LHQucHJvdG90eXBlLm9uS2V5ZG93bj1mdW5jdGlvbih0KXt2YXIgZT10LmtleUNvZGU7c3dpdGNoKGUpe2Nhc2UgdS5rOnJldHVybiB2b2lkIHRoaXMudGFiT3V0Lm5leHQoKTtjYXNlIHUuYjppZih0aGlzLl92ZXJ0aWNhbCl7dGhpcy5zZXROZXh0SXRlbUFjdGl2ZSgpO2JyZWFrfXJldHVybjtjYXNlIHUubDppZih0aGlzLl92ZXJ0aWNhbCl7dGhpcy5zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKTticmVha31yZXR1cm47Y2FzZSB1Lmk6aWYoImx0ciI9PT10aGlzLl9ob3Jpem9udGFsKXt0aGlzLnNldE5leHRJdGVtQWN0aXZlKCk7YnJlYWt9aWYoInJ0bCI9PT10aGlzLl9ob3Jpem9udGFsKXt0aGlzLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO2JyZWFrfXJldHVybjtjYXNlIHUuZzppZigibHRyIj09PXRoaXMuX2hvcml6b250YWwpe3RoaXMuc2V0UHJldmlvdXNJdGVtQWN0aXZlKCk7YnJlYWt9aWYoInJ0bCI9PT10aGlzLl9ob3Jpem9udGFsKXt0aGlzLnNldE5leHRJdGVtQWN0aXZlKCk7YnJlYWt9cmV0dXJuO2RlZmF1bHQ6cmV0dXJuIHZvaWQodC5rZXkmJjE9PT10LmtleS5sZW5ndGg/dGhpcy5fbGV0dGVyS2V5U3RyZWFtLm5leHQodC5rZXkudG9Mb2NhbGVVcHBlckNhc2UoKSk6KGU+PXUuYSYmZTw9dS5tfHxlPj11Lm4mJmU8PXUuaCkmJnRoaXMuX2xldHRlcktleVN0cmVhbS5uZXh0KFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpKX10aGlzLl9wcmVzc2VkTGV0dGVycz1bXSx0LnByZXZlbnREZWZhdWx0KCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiYWN0aXZlSXRlbUluZGV4Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImFjdGl2ZUl0ZW0iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWN0aXZlSXRlbX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5zZXRGaXJzdEl0ZW1BY3RpdmU9ZnVuY3Rpb24oKXt0aGlzLl9zZXRBY3RpdmVJdGVtQnlJbmRleCgwLDEpfSx0LnByb3RvdHlwZS5zZXRMYXN0SXRlbUFjdGl2ZT1mdW5jdGlvbigpe3RoaXMuX3NldEFjdGl2ZUl0ZW1CeUluZGV4KHRoaXMuX2l0ZW1zLmxlbmd0aC0xLC0xKX0sdC5wcm90b3R5cGUuc2V0TmV4dEl0ZW1BY3RpdmU9ZnVuY3Rpb24oKXt0aGlzLl9hY3RpdmVJdGVtSW5kZXg8MD90aGlzLnNldEZpcnN0SXRlbUFjdGl2ZSgpOnRoaXMuX3NldEFjdGl2ZUl0ZW1CeURlbHRhKDEpfSx0LnByb3RvdHlwZS5zZXRQcmV2aW91c0l0ZW1BY3RpdmU9ZnVuY3Rpb24oKXt0aGlzLl9hY3RpdmVJdGVtSW5kZXg8MCYmdGhpcy5fd3JhcD90aGlzLnNldExhc3RJdGVtQWN0aXZlKCk6dGhpcy5fc2V0QWN0aXZlSXRlbUJ5RGVsdGEoLTEpfSx0LnByb3RvdHlwZS51cGRhdGVBY3RpdmVJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2dldEl0ZW1zQXJyYXkoKSxuPSJudW1iZXIiPT10eXBlb2YgdD90OmUuaW5kZXhPZih0KTt0aGlzLl9hY3RpdmVJdGVtSW5kZXg9bix0aGlzLl9hY3RpdmVJdGVtPWVbbl19LHQucHJvdG90eXBlLnVwZGF0ZUFjdGl2ZUl0ZW1JbmRleD1mdW5jdGlvbih0KXt0aGlzLnVwZGF0ZUFjdGl2ZUl0ZW0odCl9LHQucHJvdG90eXBlLl9zZXRBY3RpdmVJdGVtQnlEZWx0YT1mdW5jdGlvbih0KXt0aGlzLl93cmFwP3RoaXMuX3NldEFjdGl2ZUluV3JhcE1vZGUodCk6dGhpcy5fc2V0QWN0aXZlSW5EZWZhdWx0TW9kZSh0KX0sdC5wcm90b3R5cGUuX3NldEFjdGl2ZUluV3JhcE1vZGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2dldEl0ZW1zQXJyYXkoKSxuPTE7bjw9ZS5sZW5ndGg7bisrKXt2YXIgcj0odGhpcy5fYWN0aXZlSXRlbUluZGV4K3QqbitlLmxlbmd0aCklZS5sZW5ndGg7aWYoIXRoaXMuX3NraXBQcmVkaWNhdGVGbihlW3JdKSlyZXR1cm4gdm9pZCB0aGlzLnNldEFjdGl2ZUl0ZW0ocil9fSx0LnByb3RvdHlwZS5fc2V0QWN0aXZlSW5EZWZhdWx0TW9kZT1mdW5jdGlvbih0KXt0aGlzLl9zZXRBY3RpdmVJdGVtQnlJbmRleCh0aGlzLl9hY3RpdmVJdGVtSW5kZXgrdCx0KX0sdC5wcm90b3R5cGUuX3NldEFjdGl2ZUl0ZW1CeUluZGV4PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fZ2V0SXRlbXNBcnJheSgpO2lmKG5bdF0pe2Zvcig7dGhpcy5fc2tpcFByZWRpY2F0ZUZuKG5bdF0pOylpZighblt0Kz1lXSlyZXR1cm47dGhpcy5zZXRBY3RpdmVJdGVtKHQpfX0sdC5wcm90b3R5cGUuX2dldEl0ZW1zQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXRlbXMgaW5zdGFuY2VvZiBpLkI/dGhpcy5faXRlbXMudG9BcnJheSgpOnRoaXMuX2l0ZW1zfSx0fSgpKSxnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9wbGF0Zm9ybT10fXJldHVybiB0LnByb3RvdHlwZS5pc0Rpc2FibGVkPWZ1bmN0aW9uKHQpe3JldHVybiB0Lmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKX0sdC5wcm90b3R5cGUuaXNWaXNpYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4hISh0Lm9mZnNldFdpZHRofHx0Lm9mZnNldEhlaWdodHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0Q2xpZW50UmVjdHMmJnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSh0KSYmInZpc2libGUiPT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS52aXNpYmlsaXR5fSx0LnByb3RvdHlwZS5pc1RhYmJhYmxlPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpcmV0dXJuITE7dmFyIGU9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiB0LmZyYW1lRWxlbWVudH1jYXRjaCh0KXtyZXR1cm4gbnVsbH19KHQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93KTtpZihlKXt2YXIgbj1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoLTE9PT1iKGUpKXJldHVybiExO2lmKCh0aGlzLl9wbGF0Zm9ybS5CTElOS3x8dGhpcy5fcGxhdGZvcm0uV0VCS0lUKSYmIm9iamVjdCI9PT1uKXJldHVybiExO2lmKCh0aGlzLl9wbGF0Zm9ybS5CTElOS3x8dGhpcy5fcGxhdGZvcm0uV0VCS0lUKSYmIXRoaXMuaXNWaXNpYmxlKGUpKXJldHVybiExfXZhciByPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxpPWIodCk7aWYodC5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpKXJldHVybi0xIT09aTtpZigiaWZyYW1lIj09PXIpcmV0dXJuITE7aWYoImF1ZGlvIj09PXIpe2lmKCF0Lmhhc0F0dHJpYnV0ZSgiY29udHJvbHMiKSlyZXR1cm4hMTtpZih0aGlzLl9wbGF0Zm9ybS5CTElOSylyZXR1cm4hMH1pZigidmlkZW8iPT09cil7aWYoIXQuaGFzQXR0cmlidXRlKCJjb250cm9scyIpJiZ0aGlzLl9wbGF0Zm9ybS5UUklERU5UKXJldHVybiExO2lmKHRoaXMuX3BsYXRmb3JtLkJMSU5LfHx0aGlzLl9wbGF0Zm9ybS5GSVJFRk9YKXJldHVybiEwfXJldHVybigib2JqZWN0IiE9PXJ8fCF0aGlzLl9wbGF0Zm9ybS5CTElOSyYmIXRoaXMuX3BsYXRmb3JtLldFQktJVCkmJiEodGhpcy5fcGxhdGZvcm0uV0VCS0lUJiZ0aGlzLl9wbGF0Zm9ybS5JT1MmJiFmdW5jdGlvbih0KXt2YXIgZT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj0iaW5wdXQiPT09ZSYmdC50eXBlO3JldHVybiJ0ZXh0Ij09PW58fCJwYXNzd29yZCI9PT1ufHwic2VsZWN0Ij09PWV8fCJ0ZXh0YXJlYSI9PT1lfSh0KSkmJnQudGFiSW5kZXg+PTB9LHQucHJvdG90eXBlLmlzRm9jdXNhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4hZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiJpbnB1dCI9PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKX0odCkmJiJoaWRkZW4iPT10LnR5cGV9KHQpJiYoZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1lfHwic2VsZWN0Ij09PWV8fCJidXR0b24iPT09ZXx8InRleHRhcmVhIj09PWV9KHQpfHxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuImEiPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9KHQpJiZ0Lmhhc0F0dHJpYnV0ZSgiaHJlZiIpfSh0KXx8dC5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpfHx2KHQpKX0odCkmJiF0aGlzLmlzRGlzYWJsZWQodCkmJnRoaXMuaXNWaXNpYmxlKHQpfSx0Lm5nSW5qZWN0YWJsZURlZj1PYmplY3QoaS5SKSh7ZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiBuZXcgdChPYmplY3QoaS5WKShtLmEpKX0sdG9rZW46dCxwcm92aWRlZEluOiJyb290In0pLHR9KCk7ZnVuY3Rpb24gdih0KXtpZighdC5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil8fHZvaWQgMD09PXQudGFiSW5kZXgpcmV0dXJuITE7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoInRhYmluZGV4Iik7cmV0dXJuIi0zMjc2OCIhPWUmJiEoIWV8fGlzTmFOKHBhcnNlSW50KGUsMTApKSl9ZnVuY3Rpb24gYih0KXtpZighdih0KSlyZXR1cm4gbnVsbDt2YXIgZT1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKXx8IiIsMTApO3JldHVybiBpc05hTihlKT8tMTplfXZhciBfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyLGkpe3ZvaWQgMD09PWkmJihpPSExKSx0aGlzLl9lbGVtZW50PXQsdGhpcy5fY2hlY2tlcj1lLHRoaXMuX25nWm9uZT1uLHRoaXMuX2RvY3VtZW50PXIsdGhpcy5fZW5hYmxlZD0hMCxpfHx0aGlzLmF0dGFjaEFuY2hvcnMoKX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJlbmFibGVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuYWJsZWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9lbmFibGVkPXQsdGhpcy5fc3RhcnRBbmNob3ImJnRoaXMuX2VuZEFuY2hvciYmKHRoaXMuX3N0YXJ0QW5jaG9yLnRhYkluZGV4PXRoaXMuX2VuZEFuY2hvci50YWJJbmRleD10aGlzLl9lbmFibGVkPzA6LTEpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9zdGFydEFuY2hvciYmdGhpcy5fc3RhcnRBbmNob3IucGFyZW50Tm9kZSYmdGhpcy5fc3RhcnRBbmNob3IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9zdGFydEFuY2hvciksdGhpcy5fZW5kQW5jaG9yJiZ0aGlzLl9lbmRBbmNob3IucGFyZW50Tm9kZSYmdGhpcy5fZW5kQW5jaG9yLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fZW5kQW5jaG9yKSx0aGlzLl9zdGFydEFuY2hvcj10aGlzLl9lbmRBbmNob3I9bnVsbH0sdC5wcm90b3R5cGUuYXR0YWNoQW5jaG9ycz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fc3RhcnRBbmNob3J8fCh0aGlzLl9zdGFydEFuY2hvcj10aGlzLl9jcmVhdGVBbmNob3IoKSksdGhpcy5fZW5kQW5jaG9yfHwodGhpcy5fZW5kQW5jaG9yPXRoaXMuX2NyZWF0ZUFuY2hvcigpKSx0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24oKXt0Ll9zdGFydEFuY2hvci5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsZnVuY3Rpb24oKXt0LmZvY3VzTGFzdFRhYmJhYmxlRWxlbWVudCgpfSksdC5fZW5kQW5jaG9yLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIixmdW5jdGlvbigpe3QuZm9jdXNGaXJzdFRhYmJhYmxlRWxlbWVudCgpfSksdC5fZWxlbWVudC5wYXJlbnROb2RlJiYodC5fZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0Ll9zdGFydEFuY2hvcix0Ll9lbGVtZW50KSx0Ll9lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQuX2VuZEFuY2hvcix0Ll9lbGVtZW50Lm5leHRTaWJsaW5nKSl9KX0sdC5wcm90b3R5cGUuZm9jdXNJbml0aWFsRWxlbWVudFdoZW5SZWFkeT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe3QuX2V4ZWN1dGVPblN0YWJsZShmdW5jdGlvbigpe3JldHVybiBlKHQuZm9jdXNJbml0aWFsRWxlbWVudCgpKX0pfSl9LHQucHJvdG90eXBlLmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnRXaGVuUmVhZHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXt0Ll9leGVjdXRlT25TdGFibGUoZnVuY3Rpb24oKXtyZXR1cm4gZSh0LmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQoKSl9KX0pfSx0LnByb3RvdHlwZS5mb2N1c0xhc3RUYWJiYWJsZUVsZW1lbnRXaGVuUmVhZHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXt0Ll9leGVjdXRlT25TdGFibGUoZnVuY3Rpb24oKXtyZXR1cm4gZSh0LmZvY3VzTGFzdFRhYmJhYmxlRWxlbWVudCgpKX0pfSl9LHQucHJvdG90eXBlLl9nZXRSZWdpb25Cb3VuZGFyeT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbY2RrLWZvY3VzLXJlZ2lvbi0iK3QrIl0sIFtjZGtGb2N1c1JlZ2lvbiIrdCsiXSwgW2Nkay1mb2N1cy0iK3QrIl0iKSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXS5oYXNBdHRyaWJ1dGUoImNkay1mb2N1cy0iK3QpP2NvbnNvbGUud2FybigiRm91bmQgdXNlIG9mIGRlcHJlY2F0ZWQgYXR0cmlidXRlICdjZGstZm9jdXMtIit0KyInLCB1c2UgJ2Nka0ZvY3VzUmVnaW9uIit0KyInIGluc3RlYWQuIFRoZSBkZXByZWNhdGVkIGF0dHJpYnV0ZSB3aWxsIGJlIHJlbW92ZWQgaW4gNy4wLjAuIixlW25dKTplW25dLmhhc0F0dHJpYnV0ZSgiY2RrLWZvY3VzLXJlZ2lvbi0iK3QpJiZjb25zb2xlLndhcm4oIkZvdW5kIHVzZSBvZiBkZXByZWNhdGVkIGF0dHJpYnV0ZSAnY2RrLWZvY3VzLXJlZ2lvbi0iK3QrIicsIHVzZSAnY2RrRm9jdXNSZWdpb24iK3QrIicgaW5zdGVhZC4gVGhlIGRlcHJlY2F0ZWQgYXR0cmlidXRlIHdpbGwgYmUgcmVtb3ZlZCBpbiA3LjAuMC4iLGVbbl0pO3JldHVybiJzdGFydCI9PXQ/ZS5sZW5ndGg/ZVswXTp0aGlzLl9nZXRGaXJzdFRhYmJhYmxlRWxlbWVudCh0aGlzLl9lbGVtZW50KTplLmxlbmd0aD9lW2UubGVuZ3RoLTFdOnRoaXMuX2dldExhc3RUYWJiYWJsZUVsZW1lbnQodGhpcy5fZWxlbWVudCl9LHQucHJvdG90eXBlLmZvY3VzSW5pdGlhbEVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIltjZGstZm9jdXMtaW5pdGlhbF0sIFtjZGtGb2N1c0luaXRpYWxdIik7cmV0dXJuIHQ/KHQuaGFzQXR0cmlidXRlKCJjZGstZm9jdXMtaW5pdGlhbCIpJiZjb25zb2xlLndhcm4oIkZvdW5kIHVzZSBvZiBkZXByZWNhdGVkIGF0dHJpYnV0ZSAnY2RrLWZvY3VzLWluaXRpYWwnLCB1c2UgJ2Nka0ZvY3VzSW5pdGlhbCcgaW5zdGVhZC4gVGhlIGRlcHJlY2F0ZWQgYXR0cmlidXRlIHdpbGwgYmUgcmVtb3ZlZCBpbiA3LjAuMCIsdCksdC5mb2N1cygpLCEwKTp0aGlzLmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQoKX0sdC5wcm90b3R5cGUuZm9jdXNGaXJzdFRhYmJhYmxlRWxlbWVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldFJlZ2lvbkJvdW5kYXJ5KCJzdGFydCIpO3JldHVybiB0JiZ0LmZvY3VzKCksISF0fSx0LnByb3RvdHlwZS5mb2N1c0xhc3RUYWJiYWJsZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRSZWdpb25Cb3VuZGFyeSgiZW5kIik7cmV0dXJuIHQmJnQuZm9jdXMoKSwhIXR9LHQucHJvdG90eXBlLl9nZXRGaXJzdFRhYmJhYmxlRWxlbWVudD1mdW5jdGlvbih0KXtpZih0aGlzLl9jaGVja2VyLmlzRm9jdXNhYmxlKHQpJiZ0aGlzLl9jaGVja2VyLmlzVGFiYmFibGUodCkpcmV0dXJuIHQ7Zm9yKHZhciBlPXQuY2hpbGRyZW58fHQuY2hpbGROb2RlcyxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl0ubm9kZVR5cGU9PT10aGlzLl9kb2N1bWVudC5FTEVNRU5UX05PREU/dGhpcy5fZ2V0Rmlyc3RUYWJiYWJsZUVsZW1lbnQoZVtuXSk6bnVsbDtpZihyKXJldHVybiByfXJldHVybiBudWxsfSx0LnByb3RvdHlwZS5fZ2V0TGFzdFRhYmJhYmxlRWxlbWVudD1mdW5jdGlvbih0KXtpZih0aGlzLl9jaGVja2VyLmlzRm9jdXNhYmxlKHQpJiZ0aGlzLl9jaGVja2VyLmlzVGFiYmFibGUodCkpcmV0dXJuIHQ7Zm9yKHZhciBlPXQuY2hpbGRyZW58fHQuY2hpbGROb2RlcyxuPWUubGVuZ3RoLTE7bj49MDtuLS0pe3ZhciByPWVbbl0ubm9kZVR5cGU9PT10aGlzLl9kb2N1bWVudC5FTEVNRU5UX05PREU/dGhpcy5fZ2V0TGFzdFRhYmJhYmxlRWxlbWVudChlW25dKTpudWxsO2lmKHIpcmV0dXJuIHJ9cmV0dXJuIG51bGx9LHQucHJvdG90eXBlLl9jcmVhdGVBbmNob3I9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gdC50YWJJbmRleD10aGlzLl9lbmFibGVkPzA6LTEsdC5jbGFzc0xpc3QuYWRkKCJjZGstdmlzdWFsbHktaGlkZGVuIiksdC5jbGFzc0xpc3QuYWRkKCJjZGstZm9jdXMtdHJhcC1hbmNob3IiKSx0fSx0LnByb3RvdHlwZS5fZXhlY3V0ZU9uU3RhYmxlPWZ1bmN0aW9uKHQpe3RoaXMuX25nWm9uZS5pc1N0YWJsZT90KCk6dGhpcy5fbmdab25lLm9uU3RhYmxlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoT2JqZWN0KGQuYSkoMSkpLnN1YnNjcmliZSh0KX0sdH0oKSx3PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5fY2hlY2tlcj10LHRoaXMuX25nWm9uZT1lLHRoaXMuX2RvY3VtZW50PW59cmV0dXJuIHQucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0hMSksbmV3IF8odCx0aGlzLl9jaGVja2VyLHRoaXMuX25nWm9uZSx0aGlzLl9kb2N1bWVudCxlKX0sdC5uZ0luamVjdGFibGVEZWY9T2JqZWN0KGkuUikoe2ZhY3Rvcnk6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQoT2JqZWN0KGkuVikoZyksT2JqZWN0KGkuVikoaS54KSxPYmplY3QoaS5WKShyLmQpKX0sdG9rZW46dCxwcm92aWRlZEluOiJyb290In0pLHR9KCkseD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9uZ1pvbmU9dCx0aGlzLl9wbGF0Zm9ybT1lLHRoaXMuX29yaWdpbj1udWxsLHRoaXMuX3dpbmRvd0ZvY3VzZWQ9ITEsdGhpcy5fZWxlbWVudEluZm89bmV3IE1hcCx0aGlzLl91bnJlZ2lzdGVyR2xvYmFsTGlzdGVuZXJzPWZ1bmN0aW9uKCl7fSx0aGlzLl9tb25pdG9yZWRFbGVtZW50Q291bnQ9MH1yZXR1cm4gdC5wcm90b3R5cGUubW9uaXRvcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYodm9pZCAwPT09ZSYmKGU9ITEpLCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpcmV0dXJuIE9iamVjdChzLmEpKG51bGwpO2lmKHRoaXMuX2VsZW1lbnRJbmZvLmhhcyh0KSl7dmFyIHI9dGhpcy5fZWxlbWVudEluZm8uZ2V0KHQpO3JldHVybiByLmNoZWNrQ2hpbGRyZW49ZSxyLnN1YmplY3QuYXNPYnNlcnZhYmxlKCl9dmFyIGk9e3VubGlzdGVuOmZ1bmN0aW9uKCl7fSxjaGVja0NoaWxkcmVuOmUsc3ViamVjdDpuZXcgby5hfTt0aGlzLl9lbGVtZW50SW5mby5zZXQodCxpKSx0aGlzLl9pbmNyZW1lbnRNb25pdG9yZWRFbGVtZW50Q291bnQoKTt2YXIgYT1mdW5jdGlvbihlKXtyZXR1cm4gbi5fb25Gb2N1cyhlLHQpfSx1PWZ1bmN0aW9uKGUpe3JldHVybiBuLl9vbkJsdXIoZSx0KX07cmV0dXJuIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcihmdW5jdGlvbigpe3QuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLGEsITApLHQuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdSwhMCl9KSxpLnVubGlzdGVuPWZ1bmN0aW9uKCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsYSwhMCksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJibHVyIix1LCEwKX0saS5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpfSx0LnByb3RvdHlwZS5zdG9wTW9uaXRvcmluZz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9lbGVtZW50SW5mby5nZXQodCk7ZSYmKGUudW5saXN0ZW4oKSxlLnN1YmplY3QuY29tcGxldGUoKSx0aGlzLl9zZXRDbGFzc2VzKHQpLHRoaXMuX2VsZW1lbnRJbmZvLmRlbGV0ZSh0KSx0aGlzLl9kZWNyZW1lbnRNb25pdG9yZWRFbGVtZW50Q291bnQoKSl9LHQucHJvdG90eXBlLmZvY3VzVmlhPWZ1bmN0aW9uKHQsZSl7dGhpcy5fc2V0T3JpZ2luRm9yQ3VycmVudEV2ZW50UXVldWUoZSksImZ1bmN0aW9uIj09dHlwZW9mIHQuZm9jdXMmJnQuZm9jdXMoKX0sdC5wcm90b3R5cGUubmdPbkRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2VsZW1lbnRJbmZvLmZvckVhY2goZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5zdG9wTW9uaXRvcmluZyhuKX0pfSx0LnByb3RvdHlwZS5fcmVnaXN0ZXJHbG9iYWxMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKHRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcil7dmFyIGU9ZnVuY3Rpb24oKXt0Ll9sYXN0VG91Y2hUYXJnZXQ9bnVsbCx0Ll9zZXRPcmlnaW5Gb3JDdXJyZW50RXZlbnRRdWV1ZSgia2V5Ym9hcmQiKX0sbj1mdW5jdGlvbigpe3QuX2xhc3RUb3VjaFRhcmdldHx8dC5fc2V0T3JpZ2luRm9yQ3VycmVudEV2ZW50UXVldWUoIm1vdXNlIil9LHI9ZnVuY3Rpb24oZSl7bnVsbCE9dC5fdG91Y2hUaW1lb3V0SWQmJmNsZWFyVGltZW91dCh0Ll90b3VjaFRpbWVvdXRJZCksdC5fbGFzdFRvdWNoVGFyZ2V0PWUudGFyZ2V0LHQuX3RvdWNoVGltZW91dElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5fbGFzdFRvdWNoVGFyZ2V0PW51bGx9LDY1MCl9LGk9ZnVuY3Rpb24oKXt0Ll93aW5kb3dGb2N1c2VkPSEwLHQuX3dpbmRvd0ZvY3VzVGltZW91dElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5fd2luZG93Rm9jdXNlZD0hMX0pfTt0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixlLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLG4sITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHIsIU9iamVjdChtLmMpKCl8fHtwYXNzaXZlOiEwLGNhcHR1cmU6ITB9KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLGkpfSksdGhpcy5fdW5yZWdpc3Rlckdsb2JhbExpc3RlbmVycz1mdW5jdGlvbigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLGUsITApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsbiwhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsciwhT2JqZWN0KG0uYykoKXx8e3Bhc3NpdmU6ITAsY2FwdHVyZTohMH0pLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsaSksY2xlYXJUaW1lb3V0KHQuX3dpbmRvd0ZvY3VzVGltZW91dElkKSxjbGVhclRpbWVvdXQodC5fdG91Y2hUaW1lb3V0SWQpLGNsZWFyVGltZW91dCh0Ll9vcmlnaW5UaW1lb3V0SWQpfX19LHQucHJvdG90eXBlLl90b2dnbGVDbGFzcz1mdW5jdGlvbih0LGUsbil7bj90LmNsYXNzTGlzdC5hZGQoZSk6dC5jbGFzc0xpc3QucmVtb3ZlKGUpfSx0LnByb3RvdHlwZS5fc2V0Q2xhc3Nlcz1mdW5jdGlvbih0LGUpe3RoaXMuX2VsZW1lbnRJbmZvLmdldCh0KSYmKHRoaXMuX3RvZ2dsZUNsYXNzKHQsImNkay1mb2N1c2VkIiwhIWUpLHRoaXMuX3RvZ2dsZUNsYXNzKHQsImNkay10b3VjaC1mb2N1c2VkIiwidG91Y2giPT09ZSksdGhpcy5fdG9nZ2xlQ2xhc3ModCwiY2RrLWtleWJvYXJkLWZvY3VzZWQiLCJrZXlib2FyZCI9PT1lKSx0aGlzLl90b2dnbGVDbGFzcyh0LCJjZGstbW91c2UtZm9jdXNlZCIsIm1vdXNlIj09PWUpLHRoaXMuX3RvZ2dsZUNsYXNzKHQsImNkay1wcm9ncmFtLWZvY3VzZWQiLCJwcm9ncmFtIj09PWUpKX0sdC5wcm90b3R5cGUuX3NldE9yaWdpbkZvckN1cnJlbnRFdmVudFF1ZXVlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKGZ1bmN0aW9uKCl7ZS5fb3JpZ2luPXQsZS5fb3JpZ2luVGltZW91dElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gZS5fb3JpZ2luPW51bGx9KX0pfSx0LnByb3RvdHlwZS5fd2FzQ2F1c2VkQnlUb3VjaD1mdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDtyZXR1cm4gdGhpcy5fbGFzdFRvdWNoVGFyZ2V0IGluc3RhbmNlb2YgTm9kZSYmZSBpbnN0YW5jZW9mIE5vZGUmJihlPT09dGhpcy5fbGFzdFRvdWNoVGFyZ2V0fHxlLmNvbnRhaW5zKHRoaXMuX2xhc3RUb3VjaFRhcmdldCkpfSx0LnByb3RvdHlwZS5fb25Gb2N1cz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2VsZW1lbnRJbmZvLmdldChlKTtpZihuJiYobi5jaGVja0NoaWxkcmVufHxlPT09dC50YXJnZXQpKXt2YXIgcj10aGlzLl9vcmlnaW47cnx8KHI9dGhpcy5fd2luZG93Rm9jdXNlZCYmdGhpcy5fbGFzdEZvY3VzT3JpZ2luP3RoaXMuX2xhc3RGb2N1c09yaWdpbjp0aGlzLl93YXNDYXVzZWRCeVRvdWNoKHQpPyJ0b3VjaCI6InByb2dyYW0iKSx0aGlzLl9zZXRDbGFzc2VzKGUsciksdGhpcy5fZW1pdE9yaWdpbihuLnN1YmplY3QsciksdGhpcy5fbGFzdEZvY3VzT3JpZ2luPXJ9fSx0LnByb3RvdHlwZS5fb25CbHVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fZWxlbWVudEluZm8uZ2V0KGUpOyFufHxuLmNoZWNrQ2hpbGRyZW4mJnQucmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIE5vZGUmJmUuY29udGFpbnModC5yZWxhdGVkVGFyZ2V0KXx8KHRoaXMuX3NldENsYXNzZXMoZSksdGhpcy5fZW1pdE9yaWdpbihuLnN1YmplY3QsbnVsbCkpfSx0LnByb3RvdHlwZS5fZW1pdE9yaWdpbj1mdW5jdGlvbih0LGUpe3RoaXMuX25nWm9uZS5ydW4oZnVuY3Rpb24oKXtyZXR1cm4gdC5uZXh0KGUpfSl9LHQucHJvdG90eXBlLl9pbmNyZW1lbnRNb25pdG9yZWRFbGVtZW50Q291bnQ9ZnVuY3Rpb24oKXsxPT0rK3RoaXMuX21vbml0b3JlZEVsZW1lbnRDb3VudCYmdGhpcy5fcmVnaXN0ZXJHbG9iYWxMaXN0ZW5lcnMoKX0sdC5wcm90b3R5cGUuX2RlY3JlbWVudE1vbml0b3JlZEVsZW1lbnRDb3VudD1mdW5jdGlvbigpey0tdGhpcy5fbW9uaXRvcmVkRWxlbWVudENvdW50fHwodGhpcy5fdW5yZWdpc3Rlckdsb2JhbExpc3RlbmVycygpLHRoaXMuX3VucmVnaXN0ZXJHbG9iYWxMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt9KX0sdC5uZ0luamVjdGFibGVEZWY9T2JqZWN0KGkuUikoe2ZhY3Rvcnk6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQoT2JqZWN0KGkuVikoaS54KSxPYmplY3QoaS5WKShtLmEpKX0sdG9rZW46dCxwcm92aWRlZEluOiJyb290In0pLHR9KCk7ZnVuY3Rpb24gTyh0KXtyZXR1cm4gMD09PXQuYnV0dG9uc319LGx6bGo6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLG4uZChlLCJkIixmdW5jdGlvbigpe3JldHVybiBvfSksbi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSxuLmQoZSwiYyIsZnVuY3Rpb24oKXtyZXR1cm4gc30pO3ZhciByPW4oIkNjbkciKSxpPShuKCJGVlN5IiksbigiRnpxYyIpLG4oIldmNHAiKSxyLk1hKHtlbmNhcHN1bGF0aW9uOjIsc3R5bGVzOlsiLm1hdC1jYXJke3RyYW5zaXRpb246Ym94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoLjQsMCwuMiwxKTtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6MjRweDtib3JkZXItcmFkaXVzOjJweH0ubWF0LWNhcmQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDNweCAxcHggLTJweCByZ2JhKDAsMCwwLC4yKSwwIDJweCAycHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggNXB4IDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZCAubWF0LWRpdmlkZXItaG9yaXpvbnRhbHtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7d2lkdGg6MTAwJX1bZGlyPXJ0bF0gLm1hdC1jYXJkIC5tYXQtZGl2aWRlci1ob3Jpem9udGFse2xlZnQ6YXV0bztyaWdodDowfS5tYXQtY2FyZCAubWF0LWRpdmlkZXItaG9yaXpvbnRhbC5tYXQtZGl2aWRlci1pbnNldHtwb3NpdGlvbjpzdGF0aWM7bWFyZ2luOjB9Lm1hdC1jYXJkLm1hdC1jYXJkLWZsYXR7Ym94LXNoYWRvdzpub25lfUBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDphY3RpdmUpey5tYXQtY2FyZHtvdXRsaW5lOnNvbGlkIDFweH19Lm1hdC1jYXJkLWFjdGlvbnMsLm1hdC1jYXJkLWNvbnRlbnQsLm1hdC1jYXJkLXN1YnRpdGxlLC5tYXQtY2FyZC10aXRsZXtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206MTZweH0ubWF0LWNhcmQtYWN0aW9uc3ttYXJnaW4tbGVmdDotMTZweDttYXJnaW4tcmlnaHQ6LTE2cHg7cGFkZGluZzo4cHggMH0ubWF0LWNhcmQtYWN0aW9ucy1hbGlnbi1lbmR7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0ubWF0LWNhcmQtaW1hZ2V7d2lkdGg6Y2FsYygxMDAlICsgNDhweCk7bWFyZ2luOjAgLTI0cHggMTZweCAtMjRweH0ubWF0LWNhcmQteGwtaW1hZ2V7d2lkdGg6MjQwcHg7aGVpZ2h0OjI0MHB4O21hcmdpbjotOHB4fS5tYXQtY2FyZC1mb290ZXJ7ZGlzcGxheTpibG9jazttYXJnaW46MCAtMjRweCAtMjRweCAtMjRweH0ubWF0LWNhcmQtYWN0aW9ucyAubWF0LWJ1dHRvbiwubWF0LWNhcmQtYWN0aW9ucyAubWF0LXJhaXNlZC1idXR0b257bWFyZ2luOjAgNHB4fS5tYXQtY2FyZC1oZWFkZXJ7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvd30ubWF0LWNhcmQtaGVhZGVyLXRleHR7bWFyZ2luOjAgOHB4fS5tYXQtY2FyZC1hdmF0YXJ7aGVpZ2h0OjQwcHg7d2lkdGg6NDBweDtib3JkZXItcmFkaXVzOjUwJTtmbGV4LXNocmluazowfS5tYXQtY2FyZC1sZy1pbWFnZSwubWF0LWNhcmQtbWQtaW1hZ2UsLm1hdC1jYXJkLXNtLWltYWdle21hcmdpbjotOHB4IDB9Lm1hdC1jYXJkLXRpdGxlLWdyb3Vwe2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjttYXJnaW46MCAtOHB4fS5tYXQtY2FyZC1zbS1pbWFnZXt3aWR0aDo4MHB4O2hlaWdodDo4MHB4fS5tYXQtY2FyZC1tZC1pbWFnZXt3aWR0aDoxMTJweDtoZWlnaHQ6MTEycHh9Lm1hdC1jYXJkLWxnLWltYWdle3dpZHRoOjE1MnB4O2hlaWdodDoxNTJweH1AbWVkaWEgKG1heC13aWR0aDo1OTlweCl7Lm1hdC1jYXJke3BhZGRpbmc6MjRweCAxNnB4fS5tYXQtY2FyZC1hY3Rpb25ze21hcmdpbi1sZWZ0Oi04cHg7bWFyZ2luLXJpZ2h0Oi04cHh9Lm1hdC1jYXJkLWltYWdle3dpZHRoOmNhbGMoMTAwJSArIDMycHgpO21hcmdpbjoxNnB4IC0xNnB4fS5tYXQtY2FyZC10aXRsZS1ncm91cHttYXJnaW46MH0ubWF0LWNhcmQteGwtaW1hZ2V7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MH0ubWF0LWNhcmQtaGVhZGVye21hcmdpbjotOHB4IDAgMCAwfS5tYXQtY2FyZC1mb290ZXJ7bWFyZ2luLWxlZnQ6LTE2cHg7bWFyZ2luLXJpZ2h0Oi0xNnB4fX0ubWF0LWNhcmQtY29udGVudD46Zmlyc3QtY2hpbGQsLm1hdC1jYXJkPjpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9Lm1hdC1jYXJkLWNvbnRlbnQ+Omxhc3QtY2hpbGQ6bm90KC5tYXQtY2FyZC1mb290ZXIpLC5tYXQtY2FyZD46bGFzdC1jaGlsZDpub3QoLm1hdC1jYXJkLWZvb3Rlcil7bWFyZ2luLWJvdHRvbTowfS5tYXQtY2FyZC1pbWFnZTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOi0yNHB4fS5tYXQtY2FyZD4ubWF0LWNhcmQtYWN0aW9uczpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206LTE2cHg7cGFkZGluZy1ib3R0b206MH0ubWF0LWNhcmQtYWN0aW9ucyAubWF0LWJ1dHRvbjpmaXJzdC1jaGlsZCwubWF0LWNhcmQtYWN0aW9ucyAubWF0LXJhaXNlZC1idXR0b246Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MH0ubWF0LWNhcmQtc3VidGl0bGU6bm90KDpmaXJzdC1jaGlsZCksLm1hdC1jYXJkLXRpdGxlOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi10b3A6LTRweH0ubWF0LWNhcmQtaGVhZGVyIC5tYXQtY2FyZC1zdWJ0aXRsZTpub3QoOmZpcnN0LWNoaWxkKXttYXJnaW4tdG9wOi04cHh9Lm1hdC1jYXJkPi5tYXQtY2FyZC14bC1pbWFnZTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOi04cHh9Lm1hdC1jYXJkPi5tYXQtY2FyZC14bC1pbWFnZTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206LThweH0iXSxkYXRhOnt9fSkpO2Z1bmN0aW9uIG8odCl7cmV0dXJuIHIuaWIoMixbci5YYShudWxsLDApLHIuWGEobnVsbCwxKV0sbnVsbCxudWxsKX12YXIgYT1yLk1hKHtlbmNhcHN1bGF0aW9uOjIsc3R5bGVzOltdLGRhdGE6e319KTtmdW5jdGlvbiBzKHQpe3JldHVybiByLmliKDIsW3IuWGEobnVsbCwwKSwodCgpKCksci5PYSgxLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtY2FyZC1oZWFkZXItdGV4dCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxyLlhhKG51bGwsMSksci5YYShudWxsLDIpXSxudWxsLG51bGwpfX0sbUNoRjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIHR9bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KX0sbVZzYTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oIkNjbkciKTtuKCI0YzM1IiksbigiaWhZWSIpLG4oIm1yU0ciKSxuKCJsTEFQIiksbigiV2Y0cCIpLG4oIks5SWEiKSxuKCJwMGliIiksbigiRi9YTCIpLG4oImg5RHEiKSxuKCJwdWdUIiksbigibjZnRyIpLG4oIllTaDIiKSxuKCJWbkQvIiksbigidDlmWiIpLG4oIk1HQlMiKSxuKCJ6b3RtIiksbigiNjdZLyIpLG4oIjAvdVEiKSxuKCJwMFNqIiksbigibnkyNCIpLG4oIlQxRE0iKSxuKCJGRk9vIiksbigiNjBpVSIpLG4oImVEa1AiKSxuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLG4uZChlLCJiIixmdW5jdGlvbigpe3JldHVybiBhfSksbi5kKGUsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KTt2YXIgaT1uZXcgci5vKCJtYXQtbWVudS1zY3JvbGwtc3RyYXRlZ3kiKTtmdW5jdGlvbiBvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpfX12YXIgYT1mdW5jdGlvbigpe319LG1yU0c6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLG4uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBvfSksbi5kKGUsImUiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSxuLmQoZSwiYyIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLG4uZChlLCJkIixmdW5jdGlvbigpe3JldHVybiB1fSk7dmFyIHI9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9O2Z1bmN0aW9uIGkodCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fXIodCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgbil9dmFyIG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIGkgaW4gZT1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsaSkmJih0W2ldPWVbaV0pO3JldHVybiB0fTtmdW5jdGlvbiBhKHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnRbU3ltYm9sLml0ZXJhdG9yXSxuPTA7cmV0dXJuIGU/ZS5jYWxsKHQpOntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHQmJm4+PXQubGVuZ3RoJiYodD12b2lkIDApLHt2YWx1ZTp0JiZ0W24rK10sZG9uZTohdH19fX1mdW5jdGlvbiBzKHQsZSl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdO2lmKCFuKXJldHVybiB0O3ZhciByLGksbz1uLmNhbGwodCksYT1bXTt0cnl7Zm9yKDsodm9pZCAwPT09ZXx8ZS0tID4wKSYmIShyPW8ubmV4dCgpKS5kb25lOylhLnB1c2goci52YWx1ZSl9Y2F0Y2godCl7aT17ZXJyb3I6dH19ZmluYWxseXt0cnl7ciYmIXIuZG9uZSYmKG49by5yZXR1cm4pJiZuLmNhbGwobyl9ZmluYWxseXtpZihpKXRocm93IGkuZXJyb3J9fXJldHVybiBhfWZ1bmN0aW9uIHUoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdD10LmNvbmNhdChzKGFyZ3VtZW50c1tlXSkpO3JldHVybiB0fX0sbjZnRzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIG51bGwhPXQmJiIiK3QhPSJmYWxzZSJ9ZnVuY3Rpb24gaSh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0wKSxmdW5jdGlvbih0KXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdCh0KSkmJiFpc05hTihOdW1iZXIodCkpfSh0KT9OdW1iZXIodCk6ZX1mdW5jdGlvbiBvKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP3Q6W3RdfWZ1bmN0aW9uIGEodCl7cmV0dXJuIG51bGw9PXQ/IiI6InN0cmluZyI9PXR5cGVvZiB0P3Q6dCsicHgifW4uZChlLCJiIixmdW5jdGlvbigpe3JldHVybiByfSksbi5kKGUsImQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSxuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLG4uZChlLCJjIixmdW5jdGlvbigpe3JldHVybiBhfSl9LG5rWTc6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zY2hlZHVsZX1uLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pfSxueTI0OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KTt2YXIgcj1uKCJtclNHIiksaT1uKCJNR0JTIiksbz1uKCJ6b3RtIik7ZnVuY3Rpb24gYSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUubGlmdChuZXcgcyh0KSl9fXZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLm5vdGlmaWVyPXR9cmV0dXJuIHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgdSh0KSxyPU9iamVjdChvLmEpKG4sdGhpcy5ub3RpZmllcik7cmV0dXJuIHImJiFyLmNsb3NlZD8obi5hZGQociksZS5zdWJzY3JpYmUobikpOm59LHR9KCksdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3JldHVybiB0LmNhbGwodGhpcyxlKXx8dGhpc31yZXR1cm4gci5iKGUsdCksZS5wcm90b3R5cGUubm90aWZ5TmV4dD1mdW5jdGlvbih0LGUsbixyLGkpe3RoaXMuY29tcGxldGUoKX0sZS5wcm90b3R5cGUubm90aWZ5Q29tcGxldGU9ZnVuY3Rpb24oKXt9LGV9KGkuYSl9LHAwU2o6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCJJVVRiIiksaT1uKCJQVThMIiksbz1uKCJHNUoxIiksYT1uKCJua1k3Iikscz1uKCJGL1hMIiksdT1uKCIwL3VRIiksbD1uKCJUeGpnIik7ZnVuY3Rpb24gYygpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49dFt0Lmxlbmd0aC0xXTtPYmplY3QoYS5hKShuKT90LnBvcCgpOm49bnVsbDt2YXIgYz10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07cmV0dXJuIDE9PT10Lmxlbmd0aHx8Mj09PXQubGVuZ3RoJiZPYmplY3QoYS5hKSh0WzFdKT9PYmplY3QodS5hKSh0WzBdKTpPYmplY3QobC5hKSgpKHMuYS5hcHBseSh2b2lkIDAsdCkpfSgxIT09Y3x8bj9jPjA/T2JqZWN0KHIuYSkodCxuKTpPYmplY3Qoby5iKShuKTpPYmplY3QoaS5hKSh0WzBdKSxlKX19bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KX0scDBpYjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBzfSk7dmFyIHI9bigiNmJsRiIpLGk9bigibmtZNyIpLG89bigiWm44RCIpLGE9bigiSVVUYiIpO2Z1bmN0aW9uIHMoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLHM9bnVsbCx1PXRbdC5sZW5ndGgtMV07cmV0dXJuIE9iamVjdChpLmEpKHUpPyhzPXQucG9wKCksdC5sZW5ndGg+MSYmIm51bWJlciI9PXR5cGVvZiB0W3QubGVuZ3RoLTFdJiYobj10LnBvcCgpKSk6Im51bWJlciI9PXR5cGVvZiB1JiYobj10LnBvcCgpKSxudWxsPT09cyYmMT09PXQubGVuZ3RoJiZ0WzBdaW5zdGFuY2VvZiByLmE/dFswXTpPYmplY3Qoby5hKShuKShPYmplY3QoYS5hKSh0LHMpKX19LHBNblM6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gc30pO3ZhciByPW4oIkNjbkciKSxpPW4oIlpZQ2kiKSxvPXIuTWEoe2VuY2Fwc3VsYXRpb246MixzdHlsZXM6W10sZGF0YTp7fX0pO2Z1bmN0aW9uIGEodCl7cmV0dXJuIHIuaWIoMCxbKHQoKSgpLHIuT2EoMCwxNjc3NzIxNixudWxsLG51bGwsMSwicm91dGVyLW91dGxldCIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksci5OYSgxLDIxMjk5MixudWxsLDAsaS5uLFtpLmIsci5OLHIuaixbOCxudWxsXSxyLmhdLG51bGwsbnVsbCldLGZ1bmN0aW9uKHQsZSl7dChlLDEsMCl9LG51bGwpfXZhciBzPXIuS2EoIm5nLWNvbXBvbmVudCIsaS5yLGZ1bmN0aW9uKHQpe3JldHVybiByLmliKDAsWyh0KCkoKSxyLk9hKDAsMCxudWxsLG51bGwsMSwibmctY29tcG9uZW50IixbXSxudWxsLG51bGwsbnVsbCxhLG8pKSxyLk5hKDEsNDkxNTIsbnVsbCwwLGkucixbXSxudWxsLG51bGwpXSxudWxsLG51bGwpfSx7fSx7fSxbXSl9LHBaaE06ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gcn0pO3ZhciByPWZ1bmN0aW9uKCl7fX0scHNXMDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiB1fSk7dmFyIHI9bigibXJTRyIpLGk9bigiem90bSIpLG89bigiTUdCUyIpLGE9bigiNjdZLyIpLHM9bigiMC91USIpO2Z1bmN0aW9uIHUodCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpLCJmdW5jdGlvbiI9PXR5cGVvZiBlP2Z1bmN0aW9uKHIpe3JldHVybiByLnBpcGUodShmdW5jdGlvbihuLHIpe3JldHVybiBPYmplY3Qocy5hKSh0KG4scikpLnBpcGUoT2JqZWN0KGEuYSkoZnVuY3Rpb24odCxpKXtyZXR1cm4gZShuLHQscixpKX0pKX0sbikpfTooIm51bWJlciI9PXR5cGVvZiBlJiYobj1lKSxmdW5jdGlvbihlKXtyZXR1cm4gZS5saWZ0KG5ldyBsKHQsbikpfSl9dmFyIGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dm9pZCAwPT09ZSYmKGU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSx0aGlzLnByb2plY3Q9dCx0aGlzLmNvbmN1cnJlbnQ9ZX1yZXR1cm4gdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbih0LGUpe3JldHVybiBlLnN1YnNjcmliZShuZXcgYyh0LHRoaXMucHJvamVjdCx0aGlzLmNvbmN1cnJlbnQpKX0sdH0oKSxjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIpe3ZvaWQgMD09PXImJihyPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7dmFyIGk9dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIGkucHJvamVjdD1uLGkuY29uY3VycmVudD1yLGkuaGFzQ29tcGxldGVkPSExLGkuYnVmZmVyPVtdLGkuYWN0aXZlPTAsaS5pbmRleD0wLGl9cmV0dXJuIHIuYihlLHQpLGUucHJvdG90eXBlLl9uZXh0PWZ1bmN0aW9uKHQpe3RoaXMuYWN0aXZlPHRoaXMuY29uY3VycmVudD90aGlzLl90cnlOZXh0KHQpOnRoaXMuYnVmZmVyLnB1c2godCl9LGUucHJvdG90eXBlLl90cnlOZXh0PWZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5pbmRleCsrO3RyeXtlPXRoaXMucHJvamVjdCh0LG4pfWNhdGNoKHQpe3JldHVybiB2b2lkIHRoaXMuZGVzdGluYXRpb24uZXJyb3IodCl9dGhpcy5hY3RpdmUrKyx0aGlzLl9pbm5lclN1YihlLHQsbil9LGUucHJvdG90eXBlLl9pbm5lclN1Yj1mdW5jdGlvbih0LGUsbil7dGhpcy5hZGQoT2JqZWN0KGkuYSkodGhpcyx0LGUsbikpfSxlLnByb3RvdHlwZS5fY29tcGxldGU9ZnVuY3Rpb24oKXt0aGlzLmhhc0NvbXBsZXRlZD0hMCwwPT09dGhpcy5hY3RpdmUmJjA9PT10aGlzLmJ1ZmZlci5sZW5ndGgmJnRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKX0sZS5wcm90b3R5cGUubm90aWZ5TmV4dD1mdW5jdGlvbih0LGUsbixyLGkpe3RoaXMuZGVzdGluYXRpb24ubmV4dChlKX0sZS5wcm90b3R5cGUubm90aWZ5Q29tcGxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5idWZmZXI7dGhpcy5yZW1vdmUodCksdGhpcy5hY3RpdmUtLSxlLmxlbmd0aD4wP3RoaXMuX25leHQoZS5zaGlmdCgpKTowPT09dGhpcy5hY3RpdmUmJnRoaXMuaGFzQ29tcGxldGVkJiZ0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCl9LGV9KG8uYSl9LHB1Z1Q6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKCJpc2J5IiksaT1uKCJNY1NvIiksbz1uKCIyQmRqIiksYT1uKCJFaG1rIikscz1uKCJlaWhzIiksdT1uKCJtclNHIiksbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciByPXQuY2FsbCh0aGlzLG4/bi5sZW5ndGgrIiBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIHVuc3Vic2NyaXB0aW9uOlxuICAiK24ubWFwKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUrMSsiKSAiK3QudG9TdHJpbmcoKX0pLmpvaW4oIlxuICAiKToiIil8fHRoaXM7cmV0dXJuIHIuZXJyb3JzPW4sci5uYW1lPSJVbnN1YnNjcmlwdGlvbkVycm9yIixPYmplY3Quc2V0UHJvdG90eXBlT2YocixlLnByb3RvdHlwZSkscn1yZXR1cm4gdS5iKGUsdCksZX0oRXJyb3IpO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBjfSk7dmFyIGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuY2xvc2VkPSExLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuX3BhcmVudHM9bnVsbCx0aGlzLl9zdWJzY3JpcHRpb25zPW51bGwsdCYmKHRoaXMuX3Vuc3Vic2NyaWJlPXQpfXZhciBlO3JldHVybiB0LnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbigpe3ZhciB0LGU9ITE7aWYoIXRoaXMuY2xvc2VkKXt2YXIgbj10aGlzLl9wYXJlbnQsdT10aGlzLl9wYXJlbnRzLGM9dGhpcy5fdW5zdWJzY3JpYmUsaD10aGlzLl9zdWJzY3JpcHRpb25zO3RoaXMuY2xvc2VkPSEwLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuX3BhcmVudHM9bnVsbCx0aGlzLl9zdWJzY3JpcHRpb25zPW51bGw7Zm9yKHZhciBkPS0xLHA9dT91Lmxlbmd0aDowO247KW4ucmVtb3ZlKHRoaXMpLG49KytkPHAmJnVbZF18fG51bGw7aWYoT2JqZWN0KG8uYSkoYykmJk9iamVjdChhLmEpKGMpLmNhbGwodGhpcyk9PT1zLmEmJihlPSEwLHQ9dHx8KHMuYS5lIGluc3RhbmNlb2YgbD9mKHMuYS5lLmVycm9ycyk6W3MuYS5lXSkpLE9iamVjdChyLmEpKGgpKWZvcihkPS0xLHA9aC5sZW5ndGg7KytkPHA7KXt2YXIgbT1oW2RdO2lmKE9iamVjdChpLmEpKG0pJiZPYmplY3QoYS5hKShtLnVuc3Vic2NyaWJlKS5jYWxsKG0pPT09cy5hKXtlPSEwLHQ9dHx8W107dmFyIHk9cy5hLmU7eSBpbnN0YW5jZW9mIGw/dD10LmNvbmNhdChmKHkuZXJyb3JzKSk6dC5wdXNoKHkpfX1pZihlKXRocm93IG5ldyBsKHQpfX0sdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe2lmKCFlfHxlPT09dC5FTVBUWSlyZXR1cm4gdC5FTVBUWTtpZihlPT09dGhpcylyZXR1cm4gdGhpczt2YXIgbj1lO3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJmdW5jdGlvbiI6bj1uZXcgdChlKTtjYXNlIm9iamVjdCI6aWYobi5jbG9zZWR8fCJmdW5jdGlvbiIhPXR5cGVvZiBuLnVuc3Vic2NyaWJlKXJldHVybiBuO2lmKHRoaXMuY2xvc2VkKXJldHVybiBuLnVuc3Vic2NyaWJlKCksbjtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbi5fYWRkUGFyZW50KXt2YXIgcj1uOyhuPW5ldyB0KS5fc3Vic2NyaXB0aW9ucz1bcl19YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoInVucmVjb2duaXplZCB0ZWFyZG93biAiK2UrIiBhZGRlZCB0byBTdWJzY3JpcHRpb24uIil9cmV0dXJuKHRoaXMuX3N1YnNjcmlwdGlvbnN8fCh0aGlzLl9zdWJzY3JpcHRpb25zPVtdKSkucHVzaChuKSxuLl9hZGRQYXJlbnQodGhpcyksbn0sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3N1YnNjcmlwdGlvbnM7aWYoZSl7dmFyIG49ZS5pbmRleE9mKHQpOy0xIT09biYmZS5zcGxpY2UobiwxKX19LHQucHJvdG90eXBlLl9hZGRQYXJlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcGFyZW50LG49dGhpcy5fcGFyZW50cztlJiZlIT09dD9uPy0xPT09bi5pbmRleE9mKHQpJiZuLnB1c2godCk6dGhpcy5fcGFyZW50cz1bdF06dGhpcy5fcGFyZW50PXR9LHQuRU1QVFk9KChlPW5ldyB0KS5jbG9zZWQ9ITAsZSksdH0oKTtmdW5jdGlvbiBmKHQpe3JldHVybiB0LnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0LmNvbmNhdChlIGluc3RhbmNlb2YgbD9lLmVycm9yczplKX0sW10pfX0scUFsUzpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oImRXWmciKSxpPW4oIkNjbkciKSxvPW4oImJuZTUiKSxhPW4oIkYvWEwiKSxzPW4oIks5SWEiKSx1PW4oIjZibEYiKSxsPW4oInAwaWIiKSxjPW4oIlQxRE0iKSxmPW4oIm1yU0ciKSxoPW4oIkVobWsiKSxkPW4oImVpaHMiKSxwPW4oIk1HQlMiKSxtPW4oInpvdG0iKSx5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmR1cmF0aW9uU2VsZWN0b3I9dH1yZXR1cm4gdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbih0LGUpe3JldHVybiBlLnN1YnNjcmliZShuZXcgZyh0LHRoaXMuZHVyYXRpb25TZWxlY3RvcikpfSx0fSgpLGc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciByPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiByLmR1cmF0aW9uU2VsZWN0b3I9bixyLmhhc1ZhbHVlPSExLHJ9cmV0dXJuIGYuYihlLHQpLGUucHJvdG90eXBlLl9uZXh0PWZ1bmN0aW9uKHQpe2lmKHRoaXMudmFsdWU9dCx0aGlzLmhhc1ZhbHVlPSEwLCF0aGlzLnRocm90dGxlZCl7dmFyIGU9T2JqZWN0KGguYSkodGhpcy5kdXJhdGlvblNlbGVjdG9yKSh0KTtpZihlPT09ZC5hKXRoaXMuZGVzdGluYXRpb24uZXJyb3IoZC5hLmUpO2Vsc2V7dmFyIG49T2JqZWN0KG0uYSkodGhpcyxlKTshbnx8bi5jbG9zZWQ/dGhpcy5jbGVhclRocm90dGxlKCk6dGhpcy5hZGQodGhpcy50aHJvdHRsZWQ9bil9fX0sZS5wcm90b3R5cGUuY2xlYXJUaHJvdHRsZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMudmFsdWUsZT10aGlzLmhhc1ZhbHVlLG49dGhpcy50aHJvdHRsZWQ7biYmKHRoaXMucmVtb3ZlKG4pLHRoaXMudGhyb3R0bGVkPW51bGwsbi51bnN1YnNjcmliZSgpKSxlJiYodGhpcy52YWx1ZT1udWxsLHRoaXMuaGFzVmFsdWU9ITEsdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHQpKX0sZS5wcm90b3R5cGUubm90aWZ5TmV4dD1mdW5jdGlvbih0LGUsbixyKXt0aGlzLmNsZWFyVGhyb3R0bGUoKX0sZS5wcm90b3R5cGUubm90aWZ5Q29tcGxldGU9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyVGhyb3R0bGUoKX0sZX0ocC5hKSx2PW4oImdJM0IiKTtmdW5jdGlvbiBiKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWMuYSksbj1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qodi5hKSh0LGUpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5saWZ0KG5ldyB5KG4pKX07dmFyIG59dmFyIF89bigiVm5ELyIpO24uZChlLCJjIixmdW5jdGlvbigpe3JldHVybiB3fSksbi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIHh9KSxuLmQoZSwiZSIsZnVuY3Rpb24oKXtyZXR1cm4gT30pLG4uZChlLCJkIixmdW5jdGlvbigpe3JldHVybiBDfSksbi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIFN9KTt2YXIgdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9uZ1pvbmU9dCx0aGlzLl9wbGF0Zm9ybT1lLHRoaXMuX3Njcm9sbGVkPW5ldyBzLmEsdGhpcy5fZ2xvYmFsU3Vic2NyaXB0aW9uPW51bGwsdGhpcy5fc2Nyb2xsZWRDb3VudD0wLHRoaXMuc2Nyb2xsQ29udGFpbmVycz1uZXcgTWFwfXJldHVybiB0LnByb3RvdHlwZS5yZWdpc3Rlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dC5lbGVtZW50U2Nyb2xsZWQoKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtyZXR1cm4gZS5fc2Nyb2xsZWQubmV4dCh0KX0pO3RoaXMuc2Nyb2xsQ29udGFpbmVycy5zZXQodCxuKX0sdC5wcm90b3R5cGUuZGVyZWdpc3Rlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnNjcm9sbENvbnRhaW5lcnMuZ2V0KHQpO2UmJihlLnVuc3Vic2NyaWJlKCksdGhpcy5zY3JvbGxDb250YWluZXJzLmRlbGV0ZSh0KSl9LHQucHJvdG90eXBlLnNjcm9sbGVkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHZvaWQgMD09PXQmJih0PTIwKSx0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXI/dS5hLmNyZWF0ZShmdW5jdGlvbihuKXtlLl9nbG9iYWxTdWJzY3JpcHRpb258fGUuX2FkZEdsb2JhbExpc3RlbmVyKCk7dmFyIHI9dD4wP2UuX3Njcm9sbGVkLnBpcGUoYih0KSkuc3Vic2NyaWJlKG4pOmUuX3Njcm9sbGVkLnN1YnNjcmliZShuKTtyZXR1cm4gZS5fc2Nyb2xsZWRDb3VudCsrLGZ1bmN0aW9uKCl7ci51bnN1YnNjcmliZSgpLGUuX3Njcm9sbGVkQ291bnQtLSxlLl9zY3JvbGxlZENvdW50fHxlLl9yZW1vdmVHbG9iYWxMaXN0ZW5lcigpfX0pOk9iamVjdChhLmEpKCl9LHQucHJvdG90eXBlLm5nT25EZXN0cm95PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9yZW1vdmVHbG9iYWxMaXN0ZW5lcigpLHRoaXMuc2Nyb2xsQ29udGFpbmVycy5mb3JFYWNoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuZGVyZWdpc3RlcihuKX0pLHRoaXMuX3Njcm9sbGVkLmNvbXBsZXRlKCl9LHQucHJvdG90eXBlLmFuY2VzdG9yU2Nyb2xsZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldEFuY2VzdG9yU2Nyb2xsQ29udGFpbmVycyh0KTtyZXR1cm4gdGhpcy5zY3JvbGxlZChlKS5waXBlKE9iamVjdChfLmEpKGZ1bmN0aW9uKHQpe3JldHVybiF0fHxuLmluZGV4T2YodCk+LTF9KSl9LHQucHJvdG90eXBlLmdldEFuY2VzdG9yU2Nyb2xsQ29udGFpbmVycz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49W107cmV0dXJuIHRoaXMuc2Nyb2xsQ29udGFpbmVycy5mb3JFYWNoKGZ1bmN0aW9uKHIsaSl7ZS5fc2Nyb2xsYWJsZUNvbnRhaW5zRWxlbWVudChpLHQpJiZuLnB1c2goaSl9KSxufSx0LnByb3RvdHlwZS5fc2Nyb2xsYWJsZUNvbnRhaW5zRWxlbWVudD1mdW5jdGlvbih0LGUpe3ZhciBuPWUubmF0aXZlRWxlbWVudCxyPXQuZ2V0RWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnQ7ZG97aWYobj09cilyZXR1cm4hMH13aGlsZShuPW4ucGFyZW50RWxlbWVudCk7cmV0dXJuITF9LHQucHJvdG90eXBlLl9hZGRHbG9iYWxMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fZ2xvYmFsU3Vic2NyaXB0aW9uPXRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcihmdW5jdGlvbigpe3JldHVybiBPYmplY3Qoby5hKSh3aW5kb3cuZG9jdW1lbnQsInNjcm9sbCIpLnN1YnNjcmliZShmdW5jdGlvbigpe3JldHVybiB0Ll9zY3JvbGxlZC5uZXh0KCl9KX0pfSx0LnByb3RvdHlwZS5fcmVtb3ZlR2xvYmFsTGlzdGVuZXI9ZnVuY3Rpb24oKXt0aGlzLl9nbG9iYWxTdWJzY3JpcHRpb24mJih0aGlzLl9nbG9iYWxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9nbG9iYWxTdWJzY3JpcHRpb249bnVsbCl9LHQubmdJbmplY3RhYmxlRGVmPU9iamVjdChpLlIpKHtmYWN0b3J5OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KE9iamVjdChpLlYpKGkueCksT2JqZWN0KGkuVikoci5hKSl9LHRva2VuOnQscHJvdmlkZWRJbjoicm9vdCJ9KSx0fSgpLHg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt2YXIgcj10aGlzO3RoaXMuX2VsZW1lbnRSZWY9dCx0aGlzLl9zY3JvbGw9ZSx0aGlzLl9uZ1pvbmU9bix0aGlzLl9lbGVtZW50U2Nyb2xsZWQ9bmV3IHMuYSx0aGlzLl9zY3JvbGxMaXN0ZW5lcj1mdW5jdGlvbih0KXtyZXR1cm4gci5fZWxlbWVudFNjcm9sbGVkLm5leHQodCl9fXJldHVybiB0LnByb3RvdHlwZS5uZ09uSW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKGZ1bmN0aW9uKCl7dC5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHQuX3Njcm9sbExpc3RlbmVyKX0pLHRoaXMuX3Njcm9sbC5yZWdpc3Rlcih0aGlzKX0sdC5wcm90b3R5cGUubmdPbkRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGwuZGVyZWdpc3Rlcih0aGlzKSx0aGlzLl9zY3JvbGxMaXN0ZW5lciYmdGhpcy5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX3Njcm9sbExpc3RlbmVyKX0sdC5wcm90b3R5cGUuZWxlbWVudFNjcm9sbGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsZW1lbnRTY3JvbGxlZC5hc09ic2VydmFibGUoKX0sdC5wcm90b3R5cGUuZ2V0RWxlbWVudFJlZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGVtZW50UmVmfSx0fSgpLE89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dmFyIG49dGhpczt0aGlzLl9wbGF0Zm9ybT10LHRoaXMuX2NoYW5nZT10LmlzQnJvd3Nlcj9lLnJ1bk91dHNpZGVBbmd1bGFyKGZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdChsLmEpKE9iamVjdChvLmEpKHdpbmRvdywicmVzaXplIiksT2JqZWN0KG8uYSkod2luZG93LCJvcmllbnRhdGlvbmNoYW5nZSIpKX0pOk9iamVjdChhLmEpKCksdGhpcy5faW52YWxpZGF0ZUNhY2hlPXRoaXMuY2hhbmdlKCkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7cmV0dXJuIG4uX3VwZGF0ZVZpZXdwb3J0U2l6ZSgpfSl9cmV0dXJuIHQucHJvdG90eXBlLm5nT25EZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5faW52YWxpZGF0ZUNhY2hlLnVuc3Vic2NyaWJlKCl9LHQucHJvdG90eXBlLmdldFZpZXdwb3J0U2l6ZT1mdW5jdGlvbigpe3RoaXMuX3ZpZXdwb3J0U2l6ZXx8dGhpcy5fdXBkYXRlVmlld3BvcnRTaXplKCk7dmFyIHQ9e3dpZHRoOnRoaXMuX3ZpZXdwb3J0U2l6ZS53aWR0aCxoZWlnaHQ6dGhpcy5fdmlld3BvcnRTaXplLmhlaWdodH07cmV0dXJuIHRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcnx8KHRoaXMuX3ZpZXdwb3J0U2l6ZT1udWxsKSx0fSx0LnByb3RvdHlwZS5nZXRWaWV3cG9ydFJlY3Q9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKSxlPXRoaXMuZ2V0Vmlld3BvcnRTaXplKCksbj1lLndpZHRoLHI9ZS5oZWlnaHQ7cmV0dXJue3RvcDp0LnRvcCxsZWZ0OnQubGVmdCxib3R0b206dC50b3ArcixyaWdodDp0LmxlZnQrbixoZWlnaHQ6cix3aWR0aDpufX0sdC5wcm90b3R5cGUuZ2V0Vmlld3BvcnRTY3JvbGxQb3NpdGlvbj1mdW5jdGlvbigpe2lmKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpcmV0dXJue3RvcDowLGxlZnQ6MH07dmFyIHQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt0b3A6LXQudG9wfHxkb2N1bWVudC5ib2R5LnNjcm9sbFRvcHx8d2luZG93LnNjcm9sbFl8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fDAsbGVmdDotdC5sZWZ0fHxkb2N1bWVudC5ib2R5LnNjcm9sbExlZnR8fHdpbmRvdy5zY3JvbGxYfHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8MH19LHQucHJvdG90eXBlLmNoYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9MjApLHQ+MD90aGlzLl9jaGFuZ2UucGlwZShiKHQpKTp0aGlzLl9jaGFuZ2V9LHQucHJvdG90eXBlLl91cGRhdGVWaWV3cG9ydFNpemU9ZnVuY3Rpb24oKXt0aGlzLl92aWV3cG9ydFNpemU9dGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyP3t3aWR0aDp3aW5kb3cuaW5uZXJXaWR0aCxoZWlnaHQ6d2luZG93LmlubmVySGVpZ2h0fTp7d2lkdGg6MCxoZWlnaHQ6MH19LHQubmdJbmplY3RhYmxlRGVmPU9iamVjdChpLlIpKHtmYWN0b3J5OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KE9iamVjdChpLlYpKHIuYSksT2JqZWN0KGkuVikoaS54KSl9LHRva2VuOnQscHJvdmlkZWRJbjoicm9vdCJ9KSx0fSgpLEM9e3Byb3ZpZGU6TyxkZXBzOltbbmV3IGkueSxuZXcgaS5ILE9dLHIuYSxpLnhdLHVzZUZhY3Rvcnk6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0fHxuZXcgTyhlLG4pfX0sUz1mdW5jdGlvbigpe319LHJmMzA6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pO3ZhciByPWZ1bmN0aW9uKHQsZSl7dGhpcy5wYWdlTmFtZT10LHRoaXMuY2h1bmtVUkw9ZSx0aGlzLmNodW5rTG9hZGVkPSExfSxpPVtuZXcgcigiL3N1cHBvcnQiLCJodHRwOi8vMjAxOC5pZ2VtLm9yZy93aWtpL2ltYWdlcy85LzkxL1QtLUdPX1BhcmlzLVNhY2xheS0tc3VwcG9ydF9jaHVuay5iYXNlNjQudHh0IiksbmV3IHIoIi90ZWFtIiwiaHR0cDovLzIwMTguaWdlbS5vcmcvd2lraS9pbWFnZXMvNy83NC9ULS1HT19QYXJpcy1TYWNsYXktLXRlYW1fY2h1bmsuYmFzZTY0LnR4dCIpLG5ldyByKCIvbGFibm90ZWJvb2siLCJodHRwOi8vMjAxOC5pZ2VtLm9yZy93aWtpL2ltYWdlcy8wLzAyL1QtLUdPX1BhcmlzLVNhY2xheS0tbGFibm90ZWJvb2tfY2h1bmsuYmFzZTY0LnR4dCIpXX0sInQvTmEiOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImsiLGZ1bmN0aW9uKCl7cmV0dXJuIE19KSxuLmQoZSwibiIsZnVuY3Rpb24oKXtyZXR1cm4gRn0pLG4uZChlLCJvIixmdW5jdGlvbigpe3JldHVybiBWfSksbi5kKGUsImwiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSxuLmQoZSwibSIsZnVuY3Rpb24oKXtyZXR1cm4gRH0pLG4uZChlLCJiIixmdW5jdGlvbigpe3JldHVybiBofSksbi5kKGUsImYiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSxuLmQoZSwiYyIsZnVuY3Rpb24oKXtyZXR1cm4ga30pLG4uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBJfSksbi5kKGUsImQiLGZ1bmN0aW9uKCl7cmV0dXJuIEJ9KSxuLmQoZSwiZSIsZnVuY3Rpb24oKXtyZXR1cm4gen0pLG4uZChlLCJqIixmdW5jdGlvbigpe3JldHVybiBVfSksbi5kKGUsImciLGZ1bmN0aW9uKCl7cmV0dXJuIE59KSxuLmQoZSwiaSIsZnVuY3Rpb24oKXtyZXR1cm4gUH0pLG4uZChlLCJoIixmdW5jdGlvbigpe3JldHVybiBMfSk7dmFyIHI9bigibXJTRyIpLGk9bigiQ2NuRyIpLG89bigiRi9YTCIpLGE9bigiNmJsRiIpLHM9bigiUGhqbiIpLHU9bigiVm5ELyIpLGw9bigiNjdZLyIpLGM9bigiSXAwUiIpLGY9ZnVuY3Rpb24oKXt9LGg9ZnVuY3Rpb24oKXt9LGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBlPXRoaXM7dGhpcy5ub3JtYWxpemVkTmFtZXM9bmV3IE1hcCx0aGlzLmxhenlVcGRhdGU9bnVsbCx0P3RoaXMubGF6eUluaXQ9InN0cmluZyI9PXR5cGVvZiB0P2Z1bmN0aW9uKCl7ZS5oZWFkZXJzPW5ldyBNYXAsdC5zcGxpdCgiXG4iKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXQuaW5kZXhPZigiOiIpO2lmKG4+MCl7dmFyIHI9dC5zbGljZSgwLG4pLGk9ci50b0xvd2VyQ2FzZSgpLG89dC5zbGljZShuKzEpLnRyaW0oKTtlLm1heWJlU2V0Tm9ybWFsaXplZE5hbWUocixpKSxlLmhlYWRlcnMuaGFzKGkpP2UuaGVhZGVycy5nZXQoaSkucHVzaChvKTplLmhlYWRlcnMuc2V0KGksW29dKX19KX06ZnVuY3Rpb24oKXtlLmhlYWRlcnM9bmV3IE1hcCxPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciByPXRbbl0saT1uLnRvTG93ZXJDYXNlKCk7InN0cmluZyI9PXR5cGVvZiByJiYocj1bcl0pLHIubGVuZ3RoPjAmJihlLmhlYWRlcnMuc2V0KGksciksZS5tYXliZVNldE5vcm1hbGl6ZWROYW1lKG4saSkpfSl9OnRoaXMuaGVhZGVycz1uZXcgTWFwfXJldHVybiB0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW5pdCgpLHRoaXMuaGVhZGVycy5oYXModC50b0xvd2VyQ2FzZSgpKX0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3RoaXMuaW5pdCgpO3ZhciBlPXRoaXMuaGVhZGVycy5nZXQodC50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gZSYmZS5sZW5ndGg+MD9lWzBdOm51bGx9LHQucHJvdG90eXBlLmtleXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbml0KCksQXJyYXkuZnJvbSh0aGlzLm5vcm1hbGl6ZWROYW1lcy52YWx1ZXMoKSl9LHQucHJvdG90eXBlLmdldEFsbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbml0KCksdGhpcy5oZWFkZXJzLmdldCh0LnRvTG93ZXJDYXNlKCkpfHxudWxsfSx0LnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jbG9uZSh7bmFtZTp0LHZhbHVlOmUsb3A6ImEifSl9LHQucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNsb25lKHtuYW1lOnQsdmFsdWU6ZSxvcDoicyJ9KX0sdC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY2xvbmUoe25hbWU6dCx2YWx1ZTplLG9wOiJkIn0pfSx0LnByb3RvdHlwZS5tYXliZVNldE5vcm1hbGl6ZWROYW1lPWZ1bmN0aW9uKHQsZSl7dGhpcy5ub3JtYWxpemVkTmFtZXMuaGFzKGUpfHx0aGlzLm5vcm1hbGl6ZWROYW1lcy5zZXQoZSx0KX0sdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5sYXp5SW5pdCYmKHRoaXMubGF6eUluaXQgaW5zdGFuY2VvZiB0P3RoaXMuY29weUZyb20odGhpcy5sYXp5SW5pdCk6dGhpcy5sYXp5SW5pdCgpLHRoaXMubGF6eUluaXQ9bnVsbCx0aGlzLmxhenlVcGRhdGUmJih0aGlzLmxhenlVcGRhdGUuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseVVwZGF0ZSh0KX0pLHRoaXMubGF6eVVwZGF0ZT1udWxsKSl9LHQucHJvdG90eXBlLmNvcHlGcm9tPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dC5pbml0KCksQXJyYXkuZnJvbSh0LmhlYWRlcnMua2V5cygpKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe2UuaGVhZGVycy5zZXQobix0LmhlYWRlcnMuZ2V0KG4pKSxlLm5vcm1hbGl6ZWROYW1lcy5zZXQobix0Lm5vcm1hbGl6ZWROYW1lcy5nZXQobikpfSl9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKGUpe3ZhciBuPW5ldyB0O3JldHVybiBuLmxhenlJbml0PXRoaXMubGF6eUluaXQmJnRoaXMubGF6eUluaXQgaW5zdGFuY2VvZiB0P3RoaXMubGF6eUluaXQ6dGhpcyxuLmxhenlVcGRhdGU9KHRoaXMubGF6eVVwZGF0ZXx8W10pLmNvbmNhdChbZV0pLG59LHQucHJvdG90eXBlLmFwcGx5VXBkYXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXQubmFtZS50b0xvd2VyQ2FzZSgpO3N3aXRjaCh0Lm9wKXtjYXNlImEiOmNhc2UicyI6dmFyIG49dC52YWx1ZTtpZigic3RyaW5nIj09dHlwZW9mIG4mJihuPVtuXSksMD09PW4ubGVuZ3RoKXJldHVybjt0aGlzLm1heWJlU2V0Tm9ybWFsaXplZE5hbWUodC5uYW1lLGUpO3ZhciBpPSgiYSI9PT10Lm9wP3RoaXMuaGVhZGVycy5nZXQoZSk6dm9pZCAwKXx8W107aS5wdXNoLmFwcGx5KGksT2JqZWN0KHIuZCkobikpLHRoaXMuaGVhZGVycy5zZXQoZSxpKTticmVhaztjYXNlImQiOnZhciBvPXQudmFsdWU7aWYobyl7dmFyIGE9dGhpcy5oZWFkZXJzLmdldChlKTtpZighYSlyZXR1cm47MD09PShhPWEuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybi0xPT09by5pbmRleE9mKHQpfSkpLmxlbmd0aD8odGhpcy5oZWFkZXJzLmRlbGV0ZShlKSx0aGlzLm5vcm1hbGl6ZWROYW1lcy5kZWxldGUoZSkpOnRoaXMuaGVhZGVycy5zZXQoZSxhKX1lbHNlIHRoaXMuaGVhZGVycy5kZWxldGUoZSksdGhpcy5ub3JtYWxpemVkTmFtZXMuZGVsZXRlKGUpfX0sdC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuaW5pdCgpLEFycmF5LmZyb20odGhpcy5ub3JtYWxpemVkTmFtZXMua2V5cygpKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3JldHVybiB0KGUubm9ybWFsaXplZE5hbWVzLmdldChuKSxlLmhlYWRlcnMuZ2V0KG4pKX0pfSx0fSgpLHA9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5lbmNvZGVLZXk9ZnVuY3Rpb24odCl7cmV0dXJuIG0odCl9LHQucHJvdG90eXBlLmVuY29kZVZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiBtKHQpfSx0LnByb3RvdHlwZS5kZWNvZGVLZXk9ZnVuY3Rpb24odCl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX0sdC5wcm90b3R5cGUuZGVjb2RlVmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX0sdH0oKTtmdW5jdGlvbiBtKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQodCkucmVwbGFjZSgvJTQwL2dpLCJAIikucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2dpLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIikucmVwbGFjZSgvJTNCL2dpLCI7IikucmVwbGFjZSgvJTJCL2dpLCIrIikucmVwbGFjZSgvJTNEL2dpLCI9IikucmVwbGFjZSgvJTNGL2dpLCI/IikucmVwbGFjZSgvJTJGL2dpLCIvIil9dmFyIHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PXt9KTt2YXIgZSxuLGksbz10aGlzO2lmKHRoaXMudXBkYXRlcz1udWxsLHRoaXMuY2xvbmVGcm9tPW51bGwsdGhpcy5lbmNvZGVyPXQuZW5jb2Rlcnx8bmV3IHAsdC5mcm9tU3RyaW5nKXtpZih0LmZyb21PYmplY3QpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc3BlY2lmeSBib3RoIGZyb21TdHJpbmcgYW5kIGZyb21PYmplY3QuIik7dGhpcy5tYXA9KGU9dC5mcm9tU3RyaW5nLG49dGhpcy5lbmNvZGVyLGk9bmV3IE1hcCxlLmxlbmd0aD4wJiZlLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT10LmluZGV4T2YoIj0iKSxvPU9iamVjdChyLmMpKC0xPT1lP1tuLmRlY29kZUtleSh0KSwiIl06W24uZGVjb2RlS2V5KHQuc2xpY2UoMCxlKSksbi5kZWNvZGVWYWx1ZSh0LnNsaWNlKGUrMSkpXSwyKSxhPW9bMF0scz1vWzFdLHU9aS5nZXQoYSl8fFtdO3UucHVzaChzKSxpLnNldChhLHUpfSksaSl9ZWxzZSB0LmZyb21PYmplY3Q/KHRoaXMubWFwPW5ldyBNYXAsT2JqZWN0LmtleXModC5mcm9tT2JqZWN0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZnJvbU9iamVjdFtlXTtvLm1hcC5zZXQoZSxBcnJheS5pc0FycmF5KG4pP246W25dKX0pKTp0aGlzLm1hcD1udWxsfXJldHVybiB0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW5pdCgpLHRoaXMubWFwLmhhcyh0KX0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3RoaXMuaW5pdCgpO3ZhciBlPXRoaXMubWFwLmdldCh0KTtyZXR1cm4gZT9lWzBdOm51bGx9LHQucHJvdG90eXBlLmdldEFsbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbml0KCksdGhpcy5tYXAuZ2V0KHQpfHxudWxsfSx0LnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5pdCgpLEFycmF5LmZyb20odGhpcy5tYXAua2V5cygpKX0sdC5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY2xvbmUoe3BhcmFtOnQsdmFsdWU6ZSxvcDoiYSJ9KX0sdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY2xvbmUoe3BhcmFtOnQsdmFsdWU6ZSxvcDoicyJ9KX0sdC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY2xvbmUoe3BhcmFtOnQsdmFsdWU6ZSxvcDoiZCJ9KX0sdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLmluaXQoKSx0aGlzLmtleXMoKS5tYXAoZnVuY3Rpb24oZSl7dmFyIG49dC5lbmNvZGVyLmVuY29kZUtleShlKTtyZXR1cm4gdC5tYXAuZ2V0KGUpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gbisiPSIrdC5lbmNvZGVyLmVuY29kZVZhbHVlKGUpfSkuam9pbigiJiIpfSkuam9pbigiJiIpfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbihlKXt2YXIgbj1uZXcgdCh7ZW5jb2Rlcjp0aGlzLmVuY29kZXJ9KTtyZXR1cm4gbi5jbG9uZUZyb209dGhpcy5jbG9uZUZyb218fHRoaXMsbi51cGRhdGVzPSh0aGlzLnVwZGF0ZXN8fFtdKS5jb25jYXQoW2VdKSxufSx0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztudWxsPT09dGhpcy5tYXAmJih0aGlzLm1hcD1uZXcgTWFwKSxudWxsIT09dGhpcy5jbG9uZUZyb20mJih0aGlzLmNsb25lRnJvbS5pbml0KCksdGhpcy5jbG9uZUZyb20ua2V5cygpLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIHQubWFwLnNldChlLHQuY2xvbmVGcm9tLm1hcC5nZXQoZSkpfSksdGhpcy51cGRhdGVzLmZvckVhY2goZnVuY3Rpb24oZSl7c3dpdGNoKGUub3Ape2Nhc2UiYSI6Y2FzZSJzIjp2YXIgbj0oImEiPT09ZS5vcD90Lm1hcC5nZXQoZS5wYXJhbSk6dm9pZCAwKXx8W107bi5wdXNoKGUudmFsdWUpLHQubWFwLnNldChlLnBhcmFtLG4pO2JyZWFrO2Nhc2UiZCI6aWYodm9pZCAwPT09ZS52YWx1ZSl7dC5tYXAuZGVsZXRlKGUucGFyYW0pO2JyZWFrfXZhciByPXQubWFwLmdldChlLnBhcmFtKXx8W10saT1yLmluZGV4T2YoZS52YWx1ZSk7LTEhPT1pJiZyLnNwbGljZShpLDEpLHIubGVuZ3RoPjA/dC5tYXAuc2V0KGUucGFyYW0scik6dC5tYXAuZGVsZXRlKGUucGFyYW0pfX0pLHRoaXMuY2xvbmVGcm9tPW51bGwpfSx0fSgpO2Z1bmN0aW9uIGcodCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfWZ1bmN0aW9uIHYodCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBCbG9iJiZ0IGluc3RhbmNlb2YgQmxvYn1mdW5jdGlvbiBiKHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgRm9ybURhdGEmJnQgaW5zdGFuY2VvZiBGb3JtRGF0YX12YXIgXz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4scil7dmFyIGk7aWYodGhpcy51cmw9ZSx0aGlzLmJvZHk9bnVsbCx0aGlzLnJlcG9ydFByb2dyZXNzPSExLHRoaXMud2l0aENyZWRlbnRpYWxzPSExLHRoaXMucmVzcG9uc2VUeXBlPSJqc29uIix0aGlzLm1ldGhvZD10LnRvVXBwZXJDYXNlKCksZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UiREVMRVRFIjpjYXNlIkdFVCI6Y2FzZSJIRUFEIjpjYXNlIk9QVElPTlMiOmNhc2UiSlNPTlAiOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuITB9fSh0aGlzLm1ldGhvZCl8fHI/KHRoaXMuYm9keT12b2lkIDAhPT1uP246bnVsbCxpPXIpOmk9bixpJiYodGhpcy5yZXBvcnRQcm9ncmVzcz0hIWkucmVwb3J0UHJvZ3Jlc3MsdGhpcy53aXRoQ3JlZGVudGlhbHM9ISFpLndpdGhDcmVkZW50aWFscyxpLnJlc3BvbnNlVHlwZSYmKHRoaXMucmVzcG9uc2VUeXBlPWkucmVzcG9uc2VUeXBlKSxpLmhlYWRlcnMmJih0aGlzLmhlYWRlcnM9aS5oZWFkZXJzKSxpLnBhcmFtcyYmKHRoaXMucGFyYW1zPWkucGFyYW1zKSksdGhpcy5oZWFkZXJzfHwodGhpcy5oZWFkZXJzPW5ldyBkKSx0aGlzLnBhcmFtcyl7dmFyIG89dGhpcy5wYXJhbXMudG9TdHJpbmcoKTtpZigwPT09by5sZW5ndGgpdGhpcy51cmxXaXRoUGFyYW1zPWU7ZWxzZXt2YXIgYT1lLmluZGV4T2YoIj8iKTt0aGlzLnVybFdpdGhQYXJhbXM9ZSsoLTE9PT1hPyI/IjphPGUubGVuZ3RoLTE/IiYiOiIiKStvfX1lbHNlIHRoaXMucGFyYW1zPW5ldyB5LHRoaXMudXJsV2l0aFBhcmFtcz1lfXJldHVybiB0LnByb3RvdHlwZS5zZXJpYWxpemVCb2R5PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLmJvZHk/bnVsbDpnKHRoaXMuYm9keSl8fHYodGhpcy5ib2R5KXx8Yih0aGlzLmJvZHkpfHwic3RyaW5nIj09dHlwZW9mIHRoaXMuYm9keT90aGlzLmJvZHk6dGhpcy5ib2R5IGluc3RhbmNlb2YgeT90aGlzLmJvZHkudG9TdHJpbmcoKToib2JqZWN0Ij09dHlwZW9mIHRoaXMuYm9keXx8ImJvb2xlYW4iPT10eXBlb2YgdGhpcy5ib2R5fHxBcnJheS5pc0FycmF5KHRoaXMuYm9keSk/SlNPTi5zdHJpbmdpZnkodGhpcy5ib2R5KTp0aGlzLmJvZHkudG9TdHJpbmcoKX0sdC5wcm90b3R5cGUuZGV0ZWN0Q29udGVudFR5cGVIZWFkZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMuYm9keT9udWxsOmIodGhpcy5ib2R5KT9udWxsOnYodGhpcy5ib2R5KT90aGlzLmJvZHkudHlwZXx8bnVsbDpnKHRoaXMuYm9keSk/bnVsbDoic3RyaW5nIj09dHlwZW9mIHRoaXMuYm9keT8idGV4dC9wbGFpbiI6dGhpcy5ib2R5IGluc3RhbmNlb2YgeT8iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgiOiJvYmplY3QiPT10eXBlb2YgdGhpcy5ib2R5fHwibnVtYmVyIj09dHlwZW9mIHRoaXMuYm9keXx8QXJyYXkuaXNBcnJheSh0aGlzLmJvZHkpPyJhcHBsaWNhdGlvbi9qc29uIjpudWxsfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5tZXRob2R8fHRoaXMubWV0aG9kLHI9ZS51cmx8fHRoaXMudXJsLGk9ZS5yZXNwb25zZVR5cGV8fHRoaXMucmVzcG9uc2VUeXBlLG89dm9pZCAwIT09ZS5ib2R5P2UuYm9keTp0aGlzLmJvZHksYT12b2lkIDAhPT1lLndpdGhDcmVkZW50aWFscz9lLndpdGhDcmVkZW50aWFsczp0aGlzLndpdGhDcmVkZW50aWFscyxzPXZvaWQgMCE9PWUucmVwb3J0UHJvZ3Jlc3M/ZS5yZXBvcnRQcm9ncmVzczp0aGlzLnJlcG9ydFByb2dyZXNzLHU9ZS5oZWFkZXJzfHx0aGlzLmhlYWRlcnMsbD1lLnBhcmFtc3x8dGhpcy5wYXJhbXM7cmV0dXJuIHZvaWQgMCE9PWUuc2V0SGVhZGVycyYmKHU9T2JqZWN0LmtleXMoZS5zZXRIZWFkZXJzKS5yZWR1Y2UoZnVuY3Rpb24odCxuKXtyZXR1cm4gdC5zZXQobixlLnNldEhlYWRlcnNbbl0pfSx1KSksZS5zZXRQYXJhbXMmJihsPU9iamVjdC5rZXlzKGUuc2V0UGFyYW1zKS5yZWR1Y2UoZnVuY3Rpb24odCxuKXtyZXR1cm4gdC5zZXQobixlLnNldFBhcmFtc1tuXSl9LGwpKSxuZXcgdChuLHIsbyx7cGFyYW1zOmwsaGVhZGVyczp1LHJlcG9ydFByb2dyZXNzOnMscmVzcG9uc2VUeXBlOmksd2l0aENyZWRlbnRpYWxzOmF9KX0sdH0oKSx3PWZ1bmN0aW9uKHQpe3JldHVybiB0W3QuU2VudD0wXT0iU2VudCIsdFt0LlVwbG9hZFByb2dyZXNzPTFdPSJVcGxvYWRQcm9ncmVzcyIsdFt0LlJlc3BvbnNlSGVhZGVyPTJdPSJSZXNwb25zZUhlYWRlciIsdFt0LkRvd25sb2FkUHJvZ3Jlc3M9M109IkRvd25sb2FkUHJvZ3Jlc3MiLHRbdC5SZXNwb25zZT00XT0iUmVzcG9uc2UiLHRbdC5Vc2VyPTVdPSJVc2VyIix0fSh7fSkseD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0LGUsbil7dm9pZCAwPT09ZSYmKGU9MjAwKSx2b2lkIDA9PT1uJiYobj0iT0siKSx0aGlzLmhlYWRlcnM9dC5oZWFkZXJzfHxuZXcgZCx0aGlzLnN0YXR1cz12b2lkIDAhPT10LnN0YXR1cz90LnN0YXR1czplLHRoaXMuc3RhdHVzVGV4dD10LnN0YXR1c1RleHR8fG4sdGhpcy51cmw9dC51cmx8fG51bGwsdGhpcy5vaz10aGlzLnN0YXR1cz49MjAwJiZ0aGlzLnN0YXR1czwzMDB9fSgpLE89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIG4udHlwZT13LlJlc3BvbnNlSGVhZGVyLG59cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXt9KSxuZXcgZSh7aGVhZGVyczp0LmhlYWRlcnN8fHRoaXMuaGVhZGVycyxzdGF0dXM6dm9pZCAwIT09dC5zdGF0dXM/dC5zdGF0dXM6dGhpcy5zdGF0dXMsc3RhdHVzVGV4dDp0LnN0YXR1c1RleHR8fHRoaXMuc3RhdHVzVGV4dCx1cmw6dC51cmx8fHRoaXMudXJsfHx2b2lkIDB9KX0sZX0oeCksQz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gbi50eXBlPXcuUmVzcG9uc2Usbi5ib2R5PXZvaWQgMCE9PWUuYm9keT9lLmJvZHk6bnVsbCxufXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD17fSksbmV3IGUoe2JvZHk6dm9pZCAwIT09dC5ib2R5P3QuYm9keTp0aGlzLmJvZHksaGVhZGVyczp0LmhlYWRlcnN8fHRoaXMuaGVhZGVycyxzdGF0dXM6dm9pZCAwIT09dC5zdGF0dXM/dC5zdGF0dXM6dGhpcy5zdGF0dXMsc3RhdHVzVGV4dDp0LnN0YXR1c1RleHR8fHRoaXMuc3RhdHVzVGV4dCx1cmw6dC51cmx8fHRoaXMudXJsfHx2b2lkIDB9KX0sZX0oeCksUz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUsMCwiVW5rbm93biBFcnJvciIpfHx0aGlzO3JldHVybiBuLm5hbWU9Ikh0dHBFcnJvclJlc3BvbnNlIixuLm9rPSExLG4ubWVzc2FnZT1uLnN0YXR1cz49MjAwJiZuLnN0YXR1czwzMDA/Ikh0dHAgZmFpbHVyZSBkdXJpbmcgcGFyc2luZyBmb3IgIisoZS51cmx8fCIodW5rbm93biB1cmwpIik6Ikh0dHAgZmFpbHVyZSByZXNwb25zZSBmb3IgIisoZS51cmx8fCIodW5rbm93biB1cmwpIikrIjogIitlLnN0YXR1cysiICIrZS5zdGF0dXNUZXh0LG4uZXJyb3I9ZS5lcnJvcnx8bnVsbCxufXJldHVybiBPYmplY3Qoci5iKShlLHQpLGV9KHgpO2Z1bmN0aW9uIEUodCxlKXtyZXR1cm57Ym9keTplLGhlYWRlcnM6dC5oZWFkZXJzLG9ic2VydmU6dC5vYnNlcnZlLHBhcmFtczp0LnBhcmFtcyxyZXBvcnRQcm9ncmVzczp0LnJlcG9ydFByb2dyZXNzLHJlc3BvbnNlVHlwZTp0LnJlc3BvbnNlVHlwZSx3aXRoQ3JlZGVudGlhbHM6dC53aXRoQ3JlZGVudGlhbHN9fXZhciBrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmhhbmRsZXI9dH1yZXR1cm4gdC5wcm90b3R5cGUucmVxdWVzdD1mdW5jdGlvbih0LGUsbil7dmFyIHIsaT10aGlzO2lmKHZvaWQgMD09PW4mJihuPXt9KSx0IGluc3RhbmNlb2YgXylyPXQ7ZWxzZXt2YXIgYTthPW4uaGVhZGVycyBpbnN0YW5jZW9mIGQ/bi5oZWFkZXJzOm5ldyBkKG4uaGVhZGVycyk7dmFyIGM9dm9pZCAwO24ucGFyYW1zJiYoYz1uLnBhcmFtcyBpbnN0YW5jZW9mIHk/bi5wYXJhbXM6bmV3IHkoe2Zyb21PYmplY3Q6bi5wYXJhbXN9KSkscj1uZXcgXyh0LGUsdm9pZCAwIT09bi5ib2R5P24uYm9keTpudWxsLHtoZWFkZXJzOmEscGFyYW1zOmMscmVwb3J0UHJvZ3Jlc3M6bi5yZXBvcnRQcm9ncmVzcyxyZXNwb25zZVR5cGU6bi5yZXNwb25zZVR5cGV8fCJqc29uIix3aXRoQ3JlZGVudGlhbHM6bi53aXRoQ3JlZGVudGlhbHN9KX12YXIgZj1PYmplY3Qoby5hKShyKS5waXBlKE9iamVjdChzLmEpKGZ1bmN0aW9uKHQpe3JldHVybiBpLmhhbmRsZXIuaGFuZGxlKHQpfSkpO2lmKHQgaW5zdGFuY2VvZiBffHwiZXZlbnRzIj09PW4ub2JzZXJ2ZSlyZXR1cm4gZjt2YXIgaD1mLnBpcGUoT2JqZWN0KHUuYSkoZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBDfSkpO3N3aXRjaChuLm9ic2VydmV8fCJib2R5Iil7Y2FzZSJib2R5Ijpzd2l0Y2goci5yZXNwb25zZVR5cGUpe2Nhc2UiYXJyYXlidWZmZXIiOnJldHVybiBoLnBpcGUoT2JqZWN0KGwuYSkoZnVuY3Rpb24odCl7aWYobnVsbCE9PXQuYm9keSYmISh0LmJvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpdGhyb3cgbmV3IEVycm9yKCJSZXNwb25zZSBpcyBub3QgYW4gQXJyYXlCdWZmZXIuIik7cmV0dXJuIHQuYm9keX0pKTtjYXNlImJsb2IiOnJldHVybiBoLnBpcGUoT2JqZWN0KGwuYSkoZnVuY3Rpb24odCl7aWYobnVsbCE9PXQuYm9keSYmISh0LmJvZHkgaW5zdGFuY2VvZiBCbG9iKSl0aHJvdyBuZXcgRXJyb3IoIlJlc3BvbnNlIGlzIG5vdCBhIEJsb2IuIik7cmV0dXJuIHQuYm9keX0pKTtjYXNlInRleHQiOnJldHVybiBoLnBpcGUoT2JqZWN0KGwuYSkoZnVuY3Rpb24odCl7aWYobnVsbCE9PXQuYm9keSYmInN0cmluZyIhPXR5cGVvZiB0LmJvZHkpdGhyb3cgbmV3IEVycm9yKCJSZXNwb25zZSBpcyBub3QgYSBzdHJpbmcuIik7cmV0dXJuIHQuYm9keX0pKTtjYXNlImpzb24iOmRlZmF1bHQ6cmV0dXJuIGgucGlwZShPYmplY3QobC5hKShmdW5jdGlvbih0KXtyZXR1cm4gdC5ib2R5fSkpfWNhc2UicmVzcG9uc2UiOnJldHVybiBoO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbnJlYWNoYWJsZTogdW5oYW5kbGVkIG9ic2VydmUgdHlwZSAiK24ub2JzZXJ2ZSsifSIpfX0sdC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSx0aGlzLnJlcXVlc3QoIkRFTEVURSIsdCxlKX0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSx0aGlzLnJlcXVlc3QoIkdFVCIsdCxlKX0sdC5wcm90b3R5cGUuaGVhZD1mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksdGhpcy5yZXF1ZXN0KCJIRUFEIix0LGUpfSx0LnByb3RvdHlwZS5qc29ucD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlcXVlc3QoIkpTT05QIix0LHtwYXJhbXM6KG5ldyB5KS5hcHBlbmQoZSwiSlNPTlBfQ0FMTEJBQ0siKSxvYnNlcnZlOiJib2R5IixyZXNwb25zZVR5cGU6Impzb24ifSl9LHQucHJvdG90eXBlLm9wdGlvbnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLHRoaXMucmVxdWVzdCgiT1BUSU9OUyIsdCxlKX0sdC5wcm90b3R5cGUucGF0Y2g9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj17fSksdGhpcy5yZXF1ZXN0KCJQQVRDSCIsdCxFKG4sZSkpfSx0LnByb3RvdHlwZS5wb3N0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49e30pLHRoaXMucmVxdWVzdCgiUE9TVCIsdCxFKG4sZSkpfSx0LnByb3RvdHlwZS5wdXQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj17fSksdGhpcy5yZXF1ZXN0KCJQVVQiLHQsRShuLGUpKX0sdH0oKSxUPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMubmV4dD10LHRoaXMuaW50ZXJjZXB0b3I9ZX1yZXR1cm4gdC5wcm90b3R5cGUuaGFuZGxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmludGVyY2VwdG9yLmludGVyY2VwdCh0LHRoaXMubmV4dCl9LHR9KCksST1uZXcgaS5vKCJIVFRQX0lOVEVSQ0VQVE9SUyIpLEE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5pbnRlcmNlcHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5oYW5kbGUodCl9LHR9KCksaj0vXlwpXF1cfScsP1xuLyxQPWZ1bmN0aW9uKCl7fSxNPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fSx0fSgpLE49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMueGhyRmFjdG9yeT10fXJldHVybiB0LnByb3RvdHlwZS5oYW5kbGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZigiSlNPTlAiPT09dC5tZXRob2QpdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gY29uc3RydWN0IEpzb25wIHJlcXVlc3Qgd2l0aG91dCBKc29ucENsaWVudE1vZHVsZSBpbnN0YWxsZWQuIik7cmV0dXJuIG5ldyBhLmEoZnVuY3Rpb24obil7dmFyIHI9ZS54aHJGYWN0b3J5LmJ1aWxkKCk7aWYoci5vcGVuKHQubWV0aG9kLHQudXJsV2l0aFBhcmFtcyksdC53aXRoQ3JlZGVudGlhbHMmJihyLndpdGhDcmVkZW50aWFscz0hMCksdC5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odCxlKXtyZXR1cm4gci5zZXRSZXF1ZXN0SGVhZGVyKHQsZS5qb2luKCIsIikpfSksdC5oZWFkZXJzLmhhcygiQWNjZXB0Iil8fHIuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IiwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIiksIXQuaGVhZGVycy5oYXMoIkNvbnRlbnQtVHlwZSIpKXt2YXIgaT10LmRldGVjdENvbnRlbnRUeXBlSGVhZGVyKCk7bnVsbCE9PWkmJnIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixpKX1pZih0LnJlc3BvbnNlVHlwZSl7dmFyIG89dC5yZXNwb25zZVR5cGUudG9Mb3dlckNhc2UoKTtyLnJlc3BvbnNlVHlwZT0ianNvbiIhPT1vP286InRleHQifXZhciBhPXQuc2VyaWFsaXplQm9keSgpLHM9bnVsbCx1PWZ1bmN0aW9uKCl7aWYobnVsbCE9PXMpcmV0dXJuIHM7dmFyIGU9MTIyMz09PXIuc3RhdHVzPzIwNDpyLnN0YXR1cyxuPXIuc3RhdHVzVGV4dHx8Ik9LIixpPW5ldyBkKHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpLG89ZnVuY3Rpb24odCl7cmV0dXJuInJlc3BvbnNlVVJMImluIHQmJnQucmVzcG9uc2VVUkw/dC5yZXNwb25zZVVSTDovXlgtUmVxdWVzdC1VUkw6L20udGVzdCh0LmdldEFsbFJlc3BvbnNlSGVhZGVycygpKT90LmdldFJlc3BvbnNlSGVhZGVyKCJYLVJlcXVlc3QtVVJMIik6bnVsbH0ocil8fHQudXJsO3JldHVybiBzPW5ldyBPKHtoZWFkZXJzOmksc3RhdHVzOmUsc3RhdHVzVGV4dDpuLHVybDpvfSl9LGw9ZnVuY3Rpb24oKXt2YXIgZT11KCksaT1lLmhlYWRlcnMsbz1lLnN0YXR1cyxhPWUuc3RhdHVzVGV4dCxzPWUudXJsLGw9bnVsbDsyMDQhPT1vJiYobD12b2lkIDA9PT1yLnJlc3BvbnNlP3IucmVzcG9uc2VUZXh0OnIucmVzcG9uc2UpLDA9PT1vJiYobz1sPzIwMDowKTt2YXIgYz1vPj0yMDAmJm88MzAwO2lmKCJqc29uIj09PXQucmVzcG9uc2VUeXBlJiYic3RyaW5nIj09dHlwZW9mIGwpe3ZhciBmPWw7bD1sLnJlcGxhY2UoaiwiIik7dHJ5e2w9IiIhPT1sP0pTT04ucGFyc2UobCk6bnVsbH1jYXRjaCh0KXtsPWYsYyYmKGM9ITEsbD17ZXJyb3I6dCx0ZXh0Omx9KX19Yz8obi5uZXh0KG5ldyBDKHtib2R5OmwsaGVhZGVyczppLHN0YXR1czpvLHN0YXR1c1RleHQ6YSx1cmw6c3x8dm9pZCAwfSkpLG4uY29tcGxldGUoKSk6bi5lcnJvcihuZXcgUyh7ZXJyb3I6bCxoZWFkZXJzOmksc3RhdHVzOm8sc3RhdHVzVGV4dDphLHVybDpzfHx2b2lkIDB9KSl9LGM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFMoe2Vycm9yOnQsc3RhdHVzOnIuc3RhdHVzfHwwLHN0YXR1c1RleHQ6ci5zdGF0dXNUZXh0fHwiVW5rbm93biBFcnJvciJ9KTtuLmVycm9yKGUpfSxmPSExLGg9ZnVuY3Rpb24oZSl7Znx8KG4ubmV4dCh1KCkpLGY9ITApO3ZhciBpPXt0eXBlOncuRG93bmxvYWRQcm9ncmVzcyxsb2FkZWQ6ZS5sb2FkZWR9O2UubGVuZ3RoQ29tcHV0YWJsZSYmKGkudG90YWw9ZS50b3RhbCksInRleHQiPT09dC5yZXNwb25zZVR5cGUmJnIucmVzcG9uc2VUZXh0JiYoaS5wYXJ0aWFsVGV4dD1yLnJlc3BvbnNlVGV4dCksbi5uZXh0KGkpfSxwPWZ1bmN0aW9uKHQpe3ZhciBlPXt0eXBlOncuVXBsb2FkUHJvZ3Jlc3MsbG9hZGVkOnQubG9hZGVkfTt0Lmxlbmd0aENvbXB1dGFibGUmJihlLnRvdGFsPXQudG90YWwpLG4ubmV4dChlKX07cmV0dXJuIHIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsbCksci5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyksdC5yZXBvcnRQcm9ncmVzcyYmKHIuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGgpLG51bGwhPT1hJiZyLnVwbG9hZCYmci51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLHApKSxyLnNlbmQoYSksbi5uZXh0KHt0eXBlOncuU2VudH0pLGZ1bmN0aW9uKCl7ci5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsYyksci5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixsKSx0LnJlcG9ydFByb2dyZXNzJiYoci5yZW1vdmVFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsaCksbnVsbCE9PWEmJnIudXBsb2FkJiZyLnVwbG9hZC5yZW1vdmVFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIscCkpLHIuYWJvcnQoKX19KX0sdH0oKSxSPW5ldyBpLm8oIlhTUkZfQ09PS0lFX05BTUUiKSxEPW5ldyBpLm8oIlhTUkZfSEVBREVSX05BTUUiKSxMPWZ1bmN0aW9uKCl7fSxGPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5kb2M9dCx0aGlzLnBsYXRmb3JtPWUsdGhpcy5jb29raWVOYW1lPW4sdGhpcy5sYXN0Q29va2llU3RyaW5nPSIiLHRoaXMubGFzdFRva2VuPW51bGwsdGhpcy5wYXJzZUNvdW50PTB9cmV0dXJuIHQucHJvdG90eXBlLmdldFRva2VuPWZ1bmN0aW9uKCl7aWYoInNlcnZlciI9PT10aGlzLnBsYXRmb3JtKXJldHVybiBudWxsO3ZhciB0PXRoaXMuZG9jLmNvb2tpZXx8IiI7cmV0dXJuIHQhPT10aGlzLmxhc3RDb29raWVTdHJpbmcmJih0aGlzLnBhcnNlQ291bnQrKyx0aGlzLmxhc3RUb2tlbj1PYmplY3QoYy51KSh0LHRoaXMuY29va2llTmFtZSksdGhpcy5sYXN0Q29va2llU3RyaW5nPXQpLHRoaXMubGFzdFRva2VufSx0fSgpLFY9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy50b2tlblNlcnZpY2U9dCx0aGlzLmhlYWRlck5hbWU9ZX1yZXR1cm4gdC5wcm90b3R5cGUuaW50ZXJjZXB0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC51cmwudG9Mb3dlckNhc2UoKTtpZigiR0VUIj09PXQubWV0aG9kfHwiSEVBRCI9PT10Lm1ldGhvZHx8bi5zdGFydHNXaXRoKCJodHRwOi8vIil8fG4uc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSlyZXR1cm4gZS5oYW5kbGUodCk7dmFyIHI9dGhpcy50b2tlblNlcnZpY2UuZ2V0VG9rZW4oKTtyZXR1cm4gbnVsbD09PXJ8fHQuaGVhZGVycy5oYXModGhpcy5oZWFkZXJOYW1lKXx8KHQ9dC5jbG9uZSh7aGVhZGVyczp0LmhlYWRlcnMuc2V0KHRoaXMuaGVhZGVyTmFtZSxyKX0pKSxlLmhhbmRsZSh0KX0sdH0oKSxVPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMuYmFja2VuZD10LHRoaXMuaW5qZWN0b3I9ZSx0aGlzLmNoYWluPW51bGx9cmV0dXJuIHQucHJvdG90eXBlLmhhbmRsZT1mdW5jdGlvbih0KXtpZihudWxsPT09dGhpcy5jaGFpbil7dmFyIGU9dGhpcy5pbmplY3Rvci5nZXQoSSxbXSk7dGhpcy5jaGFpbj1lLnJlZHVjZVJpZ2h0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBUKHQsZSl9LHRoaXMuYmFja2VuZCl9cmV0dXJuIHRoaXMuY2hhaW4uaGFuZGxlKHQpfSx0fSgpLHo9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LmRpc2FibGU9ZnVuY3Rpb24oKXtyZXR1cm57bmdNb2R1bGU6dCxwcm92aWRlcnM6W3twcm92aWRlOlYsdXNlQ2xhc3M6QX1dfX0sdC53aXRoT3B0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLHtuZ01vZHVsZTp0LHByb3ZpZGVyczpbZS5jb29raWVOYW1lP3twcm92aWRlOlIsdXNlVmFsdWU6ZS5jb29raWVOYW1lfTpbXSxlLmhlYWRlck5hbWU/e3Byb3ZpZGU6RCx1c2VWYWx1ZTplLmhlYWRlck5hbWV9OltdXX19LHR9KCksQj1mdW5jdGlvbigpe319LHQ5Zlo6ZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gc30pO3ZhciByPW4oIm1yU0ciKSxpPW4oIkZGT28iKSxvPW4oImI3bVciKSxhPW4oIkc1SjEiKTtmdW5jdGlvbiBzKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gMD09PXQ/T2JqZWN0KGEuYikoKTplLmxpZnQobmV3IHUodCkpfX12YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7aWYodGhpcy50b3RhbD10LHRoaXMudG90YWw8MCl0aHJvdyBuZXcgby5hfXJldHVybiB0LnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuc3Vic2NyaWJlKG5ldyBsKHQsdGhpcy50b3RhbCkpfSx0fSgpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciByPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiByLnRvdGFsPW4sci5jb3VudD0wLHJ9cmV0dXJuIHIuYihlLHQpLGUucHJvdG90eXBlLl9uZXh0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudG90YWwsbj0rK3RoaXMuY291bnQ7bjw9ZSYmKHRoaXMuZGVzdGluYXRpb24ubmV4dCh0KSxuPT09ZSYmKHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKSx0aGlzLnVuc3Vic2NyaWJlKCkpKX0sZX0oaS5hKX0sdTY3RDpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIHI9bigiRW44KyIpLGk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgbj10W3IuYV0oKTs7KXt2YXIgaT1uLm5leHQoKTtpZihpLmRvbmUpe2UuY29tcGxldGUoKTticmVha31pZihlLm5leHQoaS52YWx1ZSksZS5jbG9zZWQpYnJlYWt9cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4ucmV0dXJuJiZlLmFkZChmdW5jdGlvbigpe24ucmV0dXJuJiZuLnJldHVybigpfSksZX19fSx1TWFPOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgcj1uKCJtclNHIiksaT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dmFyIHI9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiByLnN1YmplY3Q9ZSxyLnN1YnNjcmliZXI9bixyLmNsb3NlZD0hMSxyfXJldHVybiByLmIoZSx0KSxlLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbigpe2lmKCF0aGlzLmNsb3NlZCl7dGhpcy5jbG9zZWQ9ITA7dmFyIHQ9dGhpcy5zdWJqZWN0LGU9dC5vYnNlcnZlcnM7aWYodGhpcy5zdWJqZWN0PW51bGwsZSYmMCE9PWUubGVuZ3RoJiYhdC5pc1N0b3BwZWQmJiF0LmNsb3NlZCl7dmFyIG49ZS5pbmRleE9mKHRoaXMuc3Vic2NyaWJlcik7LTEhPT1uJiZlLnNwbGljZShuLDEpfX19LGV9KG4oInB1Z1QiKS5hKX0sd0Z3MTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJkIixmdW5jdGlvbigpe3JldHVybiBwfSksbi5kKGUsImYiLGZ1bmN0aW9uKCl7cmV0dXJuIHl9KSxuLmQoZSwiZyIsZnVuY3Rpb24oKXtyZXR1cm4gZ30pLG4uZChlLCJlIixmdW5jdGlvbigpe3JldHVybiBtfSksbi5kKGUsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGJ9KSxuLmQoZSwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pLG4uZChlLCJjIixmdW5jdGlvbigpe3JldHVybiBzfSk7dmFyIHI9bigibXJTRyIpLGk9bigiaWhZWSIpLG89bigiQ2NuRyIpLGE9KG4oIlpZanQiKSxuKCJOU1lMIikpLHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciByPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gci5fbmV4dEFuaW1hdGlvbklkPTAsci5fcmVuZGVyZXI9ZS5jcmVhdGVSZW5kZXJlcihuLmJvZHkse2lkOiIwIixlbmNhcHN1bGF0aW9uOm8uTy5Ob25lLHN0eWxlczpbXSxkYXRhOnthbmltYXRpb246W119fSkscn1yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9uZXh0QW5pbWF0aW9uSWQudG9TdHJpbmcoKTt0aGlzLl9uZXh0QW5pbWF0aW9uSWQrKzt2YXIgbj1BcnJheS5pc0FycmF5KHQpP09iamVjdChpLmkpKHQpOnQ7cmV0dXJuIGModGhpcy5fcmVuZGVyZXIsbnVsbCxlLCJyZWdpc3RlciIsW25dKSxuZXcgdShlLHRoaXMuX3JlbmRlcmVyKX0sZX0oaS5iKSx1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgcj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIHIuX2lkPWUsci5fcmVuZGVyZXI9bixyfXJldHVybiBPYmplY3Qoci5iKShlLHQpLGUucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgbCh0aGlzLl9pZCx0LGV8fHt9LHRoaXMuX3JlbmRlcmVyKX0sZX0oaS5jKSxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixyKXt0aGlzLmlkPXQsdGhpcy5lbGVtZW50PWUsdGhpcy5fcmVuZGVyZXI9cix0aGlzLnBhcmVudFBsYXllcj1udWxsLHRoaXMuX3N0YXJ0ZWQ9ITEsdGhpcy50b3RhbFRpbWU9MCx0aGlzLl9jb21tYW5kKCJjcmVhdGUiLG4pfXJldHVybiB0LnByb3RvdHlwZS5fbGlzdGVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQsIkBAIit0aGlzLmlkKyI6Iit0LGUpfSx0LnByb3RvdHlwZS5fY29tbWFuZD1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuLTFdPWFyZ3VtZW50c1tuXTtyZXR1cm4gYyh0aGlzLl9yZW5kZXJlcix0aGlzLmVsZW1lbnQsdGhpcy5pZCx0LGUpfSx0LnByb3RvdHlwZS5vbkRvbmU9ZnVuY3Rpb24odCl7dGhpcy5fbGlzdGVuKCJkb25lIix0KX0sdC5wcm90b3R5cGUub25TdGFydD1mdW5jdGlvbih0KXt0aGlzLl9saXN0ZW4oInN0YXJ0Iix0KX0sdC5wcm90b3R5cGUub25EZXN0cm95PWZ1bmN0aW9uKHQpe3RoaXMuX2xpc3RlbigiZGVzdHJveSIsdCl9LHQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLl9jb21tYW5kKCJpbml0Iil9LHQucHJvdG90eXBlLmhhc1N0YXJ0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhcnRlZH0sdC5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuX2NvbW1hbmQoInBsYXkiKSx0aGlzLl9zdGFydGVkPSEwfSx0LnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuX2NvbW1hbmQoInBhdXNlIil9LHQucHJvdG90eXBlLnJlc3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLl9jb21tYW5kKCJyZXN0YXJ0Iil9LHQucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbigpe3RoaXMuX2NvbW1hbmQoImZpbmlzaCIpfSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fY29tbWFuZCgiZGVzdHJveSIpfSx0LnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuX2NvbW1hbmQoInJlc2V0Iil9LHQucHJvdG90eXBlLnNldFBvc2l0aW9uPWZ1bmN0aW9uKHQpe3RoaXMuX2NvbW1hbmQoInNldFBvc2l0aW9uIix0KX0sdC5wcm90b3R5cGUuZ2V0UG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdH0oKTtmdW5jdGlvbiBjKHQsZSxuLHIsaSl7cmV0dXJuIHQuc2V0UHJvcGVydHkoZSwiQEAiK24rIjoiK3IsaSl9dmFyIGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt0aGlzLmRlbGVnYXRlPXQsdGhpcy5lbmdpbmU9ZSx0aGlzLl96b25lPW4sdGhpcy5fY3VycmVudElkPTAsdGhpcy5fbWljcm90YXNrSWQ9MSx0aGlzLl9hbmltYXRpb25DYWxsYmFja3NCdWZmZXI9W10sdGhpcy5fcmVuZGVyZXJDYWNoZT1uZXcgTWFwLHRoaXMuX2NkUmVjdXJEZXB0aD0wLHRoaXMucHJvbWlzZT1Qcm9taXNlLnJlc29sdmUoMCksZS5vblJlbW92YWxDb21wbGV0ZT1mdW5jdGlvbih0LGUpe2UmJmUucGFyZW50Tm9kZSh0KSYmZS5yZW1vdmVDaGlsZCh0LnBhcmVudE5vZGUsdCl9fXJldHVybiB0LnByb3RvdHlwZS5jcmVhdGVSZW5kZXJlcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmRlbGVnYXRlLmNyZWF0ZVJlbmRlcmVyKHQsZSk7aWYoISh0JiZlJiZlLmRhdGEmJmUuZGF0YS5hbmltYXRpb24pKXt2YXIgaT10aGlzLl9yZW5kZXJlckNhY2hlLmdldChyKTtyZXR1cm4gaXx8KGk9bmV3IGgoIiIscix0aGlzLmVuZ2luZSksdGhpcy5fcmVuZGVyZXJDYWNoZS5zZXQocixpKSksaX12YXIgbz1lLmlkLGE9ZS5pZCsiLSIrdGhpcy5fY3VycmVudElkO3JldHVybiB0aGlzLl9jdXJyZW50SWQrKyx0aGlzLmVuZ2luZS5yZWdpc3RlcihhLHQpLGUuZGF0YS5hbmltYXRpb24uZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gbi5lbmdpbmUucmVnaXN0ZXJUcmlnZ2VyKG8sYSx0LGUubmFtZSxlKX0pLG5ldyBkKHRoaXMsYSxyLHRoaXMuZW5naW5lKX0sdC5wcm90b3R5cGUuYmVnaW49ZnVuY3Rpb24oKXt0aGlzLl9jZFJlY3VyRGVwdGgrKyx0aGlzLmRlbGVnYXRlLmJlZ2luJiZ0aGlzLmRlbGVnYXRlLmJlZ2luKCl9LHQucHJvdG90eXBlLl9zY2hlZHVsZUNvdW50VGFzaz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oZnVuY3Rpb24oKXt0Ll9taWNyb3Rhc2tJZCsrfSl9LHQucHJvdG90eXBlLnNjaGVkdWxlTGlzdGVuZXJDYWxsYmFjaz1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpczt0Pj0wJiZ0PHRoaXMuX21pY3JvdGFza0lkP3RoaXMuX3pvbmUucnVuKGZ1bmN0aW9uKCl7cmV0dXJuIGUobil9KTooMD09dGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2tzQnVmZmVyLmxlbmd0aCYmUHJvbWlzZS5yZXNvbHZlKG51bGwpLnRoZW4oZnVuY3Rpb24oKXtpLl96b25lLnJ1bihmdW5jdGlvbigpe2kuX2FuaW1hdGlvbkNhbGxiYWNrc0J1ZmZlci5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdChyLmMpKHQsMik7KDAsZVswXSkoZVsxXSl9KSxpLl9hbmltYXRpb25DYWxsYmFja3NCdWZmZXI9W119KX0pLHRoaXMuX2FuaW1hdGlvbkNhbGxiYWNrc0J1ZmZlci5wdXNoKFtlLG5dKSl9LHQucHJvdG90eXBlLmVuZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fY2RSZWN1ckRlcHRoLS0sMD09dGhpcy5fY2RSZWN1ckRlcHRoJiZ0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZ1bmN0aW9uKCl7dC5fc2NoZWR1bGVDb3VudFRhc2soKSx0LmVuZ2luZS5mbHVzaCh0Ll9taWNyb3Rhc2tJZCl9KSx0aGlzLmRlbGVnYXRlLmVuZCYmdGhpcy5kZWxlZ2F0ZS5lbmQoKX0sdC5wcm90b3R5cGUud2hlblJlbmRlcmluZ0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmdpbmUud2hlblJlbmRlcmluZ0RvbmUoKX0sdH0oKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5uYW1lc3BhY2VJZD10LHRoaXMuZGVsZWdhdGU9ZSx0aGlzLmVuZ2luZT1uLHRoaXMuZGVzdHJveU5vZGU9dGhpcy5kZWxlZ2F0ZS5kZXN0cm95Tm9kZT9mdW5jdGlvbih0KXtyZXR1cm4gZS5kZXN0cm95Tm9kZSh0KX06bnVsbH1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJkYXRhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVsZWdhdGUuZGF0YX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5lbmdpbmUuZGVzdHJveSh0aGlzLm5hbWVzcGFjZUlkLHRoaXMuZGVsZWdhdGUpLHRoaXMuZGVsZWdhdGUuZGVzdHJveSgpfSx0LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZGVsZWdhdGUuY3JlYXRlRWxlbWVudCh0LGUpfSx0LnByb3RvdHlwZS5jcmVhdGVDb21tZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRlbGVnYXRlLmNyZWF0ZUNvbW1lbnQodCl9LHQucHJvdG90eXBlLmNyZWF0ZVRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGVsZWdhdGUuY3JlYXRlVGV4dCh0KX0sdC5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ9ZnVuY3Rpb24odCxlKXt0aGlzLmRlbGVnYXRlLmFwcGVuZENoaWxkKHQsZSksdGhpcy5lbmdpbmUub25JbnNlcnQodGhpcy5uYW1lc3BhY2VJZCxlLHQsITEpfSx0LnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24odCxlLG4pe3RoaXMuZGVsZWdhdGUuaW5zZXJ0QmVmb3JlKHQsZSxuKSx0aGlzLmVuZ2luZS5vbkluc2VydCh0aGlzLm5hbWVzcGFjZUlkLGUsdCwhMCl9LHQucHJvdG90eXBlLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKHQsZSl7dGhpcy5lbmdpbmUub25SZW1vdmUodGhpcy5uYW1lc3BhY2VJZCxlLHRoaXMuZGVsZWdhdGUpfSx0LnByb3RvdHlwZS5zZWxlY3RSb290RWxlbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5zZWxlY3RSb290RWxlbWVudCh0KX0sdC5wcm90b3R5cGUucGFyZW50Tm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5wYXJlbnROb2RlKHQpfSx0LnByb3RvdHlwZS5uZXh0U2libGluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5uZXh0U2libGluZyh0KX0sdC5wcm90b3R5cGUuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKHQsZSxuLHIpe3RoaXMuZGVsZWdhdGUuc2V0QXR0cmlidXRlKHQsZSxuLHIpfSx0LnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGU9ZnVuY3Rpb24odCxlLG4pe3RoaXMuZGVsZWdhdGUucmVtb3ZlQXR0cmlidXRlKHQsZSxuKX0sdC5wcm90b3R5cGUuYWRkQ2xhc3M9ZnVuY3Rpb24odCxlKXt0aGlzLmRlbGVnYXRlLmFkZENsYXNzKHQsZSl9LHQucHJvdG90eXBlLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKHQsZSl7dGhpcy5kZWxlZ2F0ZS5yZW1vdmVDbGFzcyh0LGUpfSx0LnByb3RvdHlwZS5zZXRTdHlsZT1mdW5jdGlvbih0LGUsbixyKXt0aGlzLmRlbGVnYXRlLnNldFN0eWxlKHQsZSxuLHIpfSx0LnByb3RvdHlwZS5yZW1vdmVTdHlsZT1mdW5jdGlvbih0LGUsbil7dGhpcy5kZWxlZ2F0ZS5yZW1vdmVTdHlsZSh0LGUsbil9LHQucHJvdG90eXBlLnNldFByb3BlcnR5PWZ1bmN0aW9uKHQsZSxuKXsiQCI9PWUuY2hhckF0KDApJiYiQC5kaXNhYmxlZCI9PWU/dGhpcy5kaXNhYmxlQW5pbWF0aW9ucyh0LCEhbik6dGhpcy5kZWxlZ2F0ZS5zZXRQcm9wZXJ0eSh0LGUsbil9LHQucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKHQsZSl7dGhpcy5kZWxlZ2F0ZS5zZXRWYWx1ZSh0LGUpfSx0LnByb3RvdHlwZS5saXN0ZW49ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLmRlbGVnYXRlLmxpc3Rlbih0LGUsbil9LHQucHJvdG90eXBlLmRpc2FibGVBbmltYXRpb25zPWZ1bmN0aW9uKHQsZSl7dGhpcy5lbmdpbmUuZGlzYWJsZUFuaW1hdGlvbnModCxlKX0sdH0oKSxkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIsaSl7dmFyIG89dC5jYWxsKHRoaXMsbixyLGkpfHx0aGlzO3JldHVybiBvLmZhY3Rvcnk9ZSxvLm5hbWVzcGFjZUlkPW4sb31yZXR1cm4gT2JqZWN0KHIuYikoZSx0KSxlLnByb3RvdHlwZS5zZXRQcm9wZXJ0eT1mdW5jdGlvbih0LGUsbil7IkAiPT1lLmNoYXJBdCgwKT8iLiI9PWUuY2hhckF0KDEpJiYiQC5kaXNhYmxlZCI9PWU/dGhpcy5kaXNhYmxlQW5pbWF0aW9ucyh0LG49dm9pZCAwPT09bnx8ISFuKTp0aGlzLmVuZ2luZS5wcm9jZXNzKHRoaXMubmFtZXNwYWNlSWQsdCxlLnN1YnN0cigxKSxuKTp0aGlzLmRlbGVnYXRlLnNldFByb3BlcnR5KHQsZSxuKX0sZS5wcm90b3R5cGUubGlzdGVuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxvLGEscz10aGlzO2lmKCJAIj09ZS5jaGFyQXQoMCkpe3ZhciB1PWZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlImJvZHkiOnJldHVybiBkb2N1bWVudC5ib2R5O2Nhc2UiZG9jdW1lbnQiOnJldHVybiBkb2N1bWVudDtjYXNlIndpbmRvdyI6cmV0dXJuIHdpbmRvdztkZWZhdWx0OnJldHVybiB0fX0odCksbD1lLnN1YnN0cigxKSxjPSIiO3JldHVybiJAIiE9bC5jaGFyQXQoMCkmJihsPShpPU9iamVjdChyLmMpKChvPWwsYT1vLmluZGV4T2YoIi4iKSxbby5zdWJzdHJpbmcoMCxhKSxvLnN1YnN0cihhKzEpXSksMikpWzBdLGM9aVsxXSksdGhpcy5lbmdpbmUubGlzdGVuKHRoaXMubmFtZXNwYWNlSWQsdSxsLGMsZnVuY3Rpb24odCl7cy5mYWN0b3J5LnNjaGVkdWxlTGlzdGVuZXJDYWxsYmFjayh0Ll9kYXRhfHwtMSxuLHQpfSl9cmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKHQsZSxuKX0sZX0oaCkscD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbixyKXtyZXR1cm4gdC5jYWxsKHRoaXMsZS5ib2R5LG4scil8fHRoaXN9cmV0dXJuIE9iamVjdChyLmIpKGUsdCksZX0oYS5iKTtmdW5jdGlvbiBtKCl7cmV0dXJuIE9iamVjdChhLmgpKCk/bmV3IGEuZjpuZXcgYS5kfWZ1bmN0aW9uIHkoKXtyZXR1cm4gbmV3IGEuZ31mdW5jdGlvbiBnKHQsZSxuKXtyZXR1cm4gbmV3IGYodCxlLG4pfXZhciB2PW5ldyBvLm8oIkFuaW1hdGlvbk1vZHVsZVR5cGUiKSxiPWZ1bmN0aW9uKCl7fX0seE15RTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBzfSk7dmFyIHI9bigibXJTRyIpLGk9bigiRkZPbyIpLG89bigiK3VtSyIpLGE9bigiMkJkaiIpO2Z1bmN0aW9uIHModCxlLG4pe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gci5saWZ0KG5ldyB1KHQsZSxuKSl9fXZhciB1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5uZXh0T3JPYnNlcnZlcj10LHRoaXMuZXJyb3I9ZSx0aGlzLmNvbXBsZXRlPW59cmV0dXJuIHQucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5zdWJzY3JpYmUobmV3IGwodCx0aGlzLm5leHRPck9ic2VydmVyLHRoaXMuZXJyb3IsdGhpcy5jb21wbGV0ZSkpfSx0fSgpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scixpKXt2YXIgcz10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gcy5fdGFwTmV4dD1vLmEscy5fdGFwRXJyb3I9by5hLHMuX3RhcENvbXBsZXRlPW8uYSxzLl90YXBFcnJvcj1yfHxvLmEscy5fdGFwQ29tcGxldGU9aXx8by5hLE9iamVjdChhLmEpKG4pPyhzLl9jb250ZXh0PXMscy5fdGFwTmV4dD1uKTpuJiYocy5fY29udGV4dD1uLHMuX3RhcE5leHQ9bi5uZXh0fHxvLmEscy5fdGFwRXJyb3I9bi5lcnJvcnx8by5hLHMuX3RhcENvbXBsZXRlPW4uY29tcGxldGV8fG8uYSksc31yZXR1cm4gci5iKGUsdCksZS5wcm90b3R5cGUuX25leHQ9ZnVuY3Rpb24odCl7dHJ5e3RoaXMuX3RhcE5leHQuY2FsbCh0aGlzLl9jb250ZXh0LHQpfWNhdGNoKHQpe3JldHVybiB2b2lkIHRoaXMuZGVzdGluYXRpb24uZXJyb3IodCl9dGhpcy5kZXN0aW5hdGlvbi5uZXh0KHQpfSxlLnByb3RvdHlwZS5fZXJyb3I9ZnVuY3Rpb24odCl7dHJ5e3RoaXMuX3RhcEVycm9yLmNhbGwodGhpcy5fY29udGV4dCx0KX1jYXRjaCh0KXtyZXR1cm4gdm9pZCB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKHQpfXRoaXMuZGVzdGluYXRpb24uZXJyb3IodCl9LGUucHJvdG90eXBlLl9jb21wbGV0ZT1mdW5jdGlvbigpe3RyeXt0aGlzLl90YXBDb21wbGV0ZS5jYWxsKHRoaXMuX2NvbnRleHQpfWNhdGNoKHQpe3JldHVybiB2b2lkIHRoaXMuZGVzdGluYXRpb24uZXJyb3IodCl9cmV0dXJuIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKX0sZX0oaS5hKX0seFRsYTpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiByfSk7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLm9ic2VydmFibGV8fCJAQG9ic2VydmFibGUifSx5M0J5OmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSxuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gb30pO3ZhciByPW4oIit1bUsiKTtmdW5jdGlvbiBpKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBvKHQpfWZ1bmN0aW9uIG8odCl7cmV0dXJuIHQ/MT09PXQubGVuZ3RoP3RbMF06ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUodCl9LGUpfTpyLmF9fSx6VW5iOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5yKGUpO3ZhciByLGk9bigiQ2NuRyIpLG89bigiQXl0UiIpLGE9bigiSXAwUiIpLHM9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXt0aGlzLnBsYXRmb3JtSWQ9dCx0aGlzLmFwcElkPWU7dmFyIG49T2JqZWN0KGEucSkodCk/ImluIHRoZSBicm93c2VyIjoib24gdGhlIHNlcnZlciI7Y29uc29sZS5sb2coIlJ1bm5pbmcgIituKyIgd2l0aCBhcHBJZD0iK2UpfX0oKSx1PW4oImRXWmciKSxsPW4oIm1yU0ciKSxjPW4oIm5rWTciKSxmPW4oImlzYnkiKSxoPW4oIk1HQlMiKSxkPW4oInpvdG0iKSxwPW4oIklVVGIiKSxtPXt9LHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMucmVzdWx0U2VsZWN0b3I9dH1yZXR1cm4gdC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbih0LGUpe3JldHVybiBlLnN1YnNjcmliZShuZXcgZyh0LHRoaXMucmVzdWx0U2VsZWN0b3IpKX0sdH0oKSxnPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgcj10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gci5yZXN1bHRTZWxlY3Rvcj1uLHIuYWN0aXZlPTAsci52YWx1ZXM9W10sci5vYnNlcnZhYmxlcz1bXSxyfXJldHVybiBsLmIoZSx0KSxlLnByb3RvdHlwZS5fbmV4dD1mdW5jdGlvbih0KXt0aGlzLnZhbHVlcy5wdXNoKG0pLHRoaXMub2JzZXJ2YWJsZXMucHVzaCh0KX0sZS5wcm90b3R5cGUuX2NvbXBsZXRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vYnNlcnZhYmxlcyxlPXQubGVuZ3RoO2lmKDA9PT1lKXRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtlbHNle3RoaXMuYWN0aXZlPWUsdGhpcy50b1Jlc3BvbmQ9ZTtmb3IodmFyIG49MDtuPGU7bisrKXt2YXIgcj10W25dO3RoaXMuYWRkKE9iamVjdChkLmEpKHRoaXMscixyLG4pKX19fSxlLnByb3RvdHlwZS5ub3RpZnlDb21wbGV0ZT1mdW5jdGlvbih0KXswPT0odGhpcy5hY3RpdmUtPTEpJiZ0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCl9LGUucHJvdG90eXBlLm5vdGlmeU5leHQ9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz10aGlzLnZhbHVlcyxhPXRoaXMudG9SZXNwb25kP29bbl09PT1tPy0tdGhpcy50b1Jlc3BvbmQ6dGhpcy50b1Jlc3BvbmQ6MDtvW25dPWUsMD09PWEmJih0aGlzLnJlc3VsdFNlbGVjdG9yP3RoaXMuX3RyeVJlc3VsdFNlbGVjdG9yKG8pOnRoaXMuZGVzdGluYXRpb24ubmV4dChvLnNsaWNlKCkpKX0sZS5wcm90b3R5cGUuX3RyeVJlc3VsdFNlbGVjdG9yPWZ1bmN0aW9uKHQpe3ZhciBlO3RyeXtlPXRoaXMucmVzdWx0U2VsZWN0b3IuYXBwbHkodGhpcyx0KX1jYXRjaCh0KXtyZXR1cm4gdm9pZCB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKHQpfXRoaXMuZGVzdGluYXRpb24ubmV4dChlKX0sZX0oaC5hKSx2PW4oIks5SWEiKSxiPW4oIjZibEYiKSxfPW4oIjJCZGoiKSx3PW4oIjY3WS8iKSx4PW4oIm55MjQiKSxPPW4oInAwU2oiKSxDPW4oIm42Z0ciKSxTPW5ldyBTZXQsRT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5wbGF0Zm9ybT10LHRoaXMuX21hdGNoTWVkaWE9dGhpcy5wbGF0Zm9ybS5pc0Jyb3dzZXImJndpbmRvdy5tYXRjaE1lZGlhP3dpbmRvdy5tYXRjaE1lZGlhLmJpbmQod2luZG93KTprfXJldHVybiB0LnByb3RvdHlwZS5tYXRjaE1lZGlhPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnBsYXRmb3JtLldFQktJVCYmZnVuY3Rpb24odCl7aWYoIVMuaGFzKHQpKXRyeXtyfHwoKHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwidGV4dC9jc3MiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHIpKSxyLnNoZWV0JiYoci5zaGVldC5pbnNlcnRSdWxlKCJAbWVkaWEgIit0KyIgey5meC1xdWVyeS10ZXN0eyB9fSIsMCksUy5hZGQodCkpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IodCl9fSh0KSx0aGlzLl9tYXRjaE1lZGlhKHQpfSx0Lm5nSW5qZWN0YWJsZURlZj1PYmplY3QoaS5SKSh7ZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiBuZXcgdChPYmplY3QoaS5WKSh1LmEpKX0sdG9rZW46dCxwcm92aWRlZEluOiJyb290In0pLHR9KCk7ZnVuY3Rpb24gayh0KXtyZXR1cm57bWF0Y2hlczoiYWxsIj09PXR8fCIiPT09dCxtZWRpYTp0LGFkZExpc3RlbmVyOmZ1bmN0aW9uKCl7fSxyZW1vdmVMaXN0ZW5lcjpmdW5jdGlvbigpe319fXZhciBUPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMubWVkaWFNYXRjaGVyPXQsdGhpcy56b25lPWUsdGhpcy5fcXVlcmllcz1uZXcgTWFwLHRoaXMuX2Rlc3Ryb3lTdWJqZWN0PW5ldyB2LmF9cmV0dXJuIHQucHJvdG90eXBlLm5nT25EZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fZGVzdHJveVN1YmplY3QubmV4dCgpLHRoaXMuX2Rlc3Ryb3lTdWJqZWN0LmNvbXBsZXRlKCl9LHQucHJvdG90eXBlLmlzTWF0Y2hlZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiBJKE9iamVjdChDLmEpKHQpKS5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9yZWdpc3RlclF1ZXJ5KHQpLm1xbC5tYXRjaGVzfSl9LHQucHJvdG90eXBlLm9ic2VydmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49bnVsbCxyPW51bGw7cmV0dXJuIE9iamVjdChjLmEpKHRbdC5sZW5ndGgtMV0pJiYocj10LnBvcCgpKSwiZnVuY3Rpb24iPT10eXBlb2YgdFt0Lmxlbmd0aC0xXSYmKG49dC5wb3AoKSksMT09PXQubGVuZ3RoJiZPYmplY3QoZi5hKSh0WzBdKSYmKHQ9dFswXSksT2JqZWN0KHAuYSkodCxyKS5saWZ0KG5ldyB5KG4pKX0oSShPYmplY3QoQy5hKSh0KSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9yZWdpc3RlclF1ZXJ5KHQpLm9ic2VydmFibGV9KSkucGlwZShPYmplY3Qody5hKShmdW5jdGlvbih0KXtyZXR1cm57bWF0Y2hlczp0LnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubWF0Y2hlc30pfX0pKX0sdC5wcm90b3R5cGUuX3JlZ2lzdGVyUXVlcnk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih0aGlzLl9xdWVyaWVzLmhhcyh0KSlyZXR1cm4gdGhpcy5fcXVlcmllcy5nZXQodCk7dmFyIG49dGhpcy5tZWRpYU1hdGNoZXIubWF0Y2hNZWRpYSh0KSxyPXtvYnNlcnZhYmxlOmZ1bmN0aW9uIHQoZSxuLHIpe3JldHVybiByP3QoZSxuKS5waXBlKE9iamVjdCh3LmEpKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QoZi5hKSh0KT9yLmFwcGx5KHZvaWQgMCx0KTpyKHQpfSkpOm5ldyBiLmEoZnVuY3Rpb24odCl7dmFyIHIsaT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSxuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdC5uZXh0KDE9PT1lLmxlbmd0aD9lWzBdOmUpfTt0cnl7cj1lKGkpfWNhdGNoKGUpe3JldHVybiB2b2lkIHQuZXJyb3IoZSl9aWYoT2JqZWN0KF8uYSkobikpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG4oaSxyKX19KX0oZnVuY3Rpb24odCl7bi5hZGRMaXN0ZW5lcihmdW5jdGlvbihuKXtyZXR1cm4gZS56b25lLnJ1bihmdW5jdGlvbigpe3JldHVybiB0KG4pfSl9KX0sZnVuY3Rpb24odCl7bi5yZW1vdmVMaXN0ZW5lcihmdW5jdGlvbihuKXtyZXR1cm4gZS56b25lLnJ1bihmdW5jdGlvbigpe3JldHVybiB0KG4pfSl9KX0pLnBpcGUoT2JqZWN0KHguYSkodGhpcy5fZGVzdHJveVN1YmplY3QpLE9iamVjdChPLmEpKG4pLE9iamVjdCh3LmEpKGZ1bmN0aW9uKHQpe3JldHVybnttYXRjaGVzOnQubWF0Y2hlc319KSksbXFsOm59O3JldHVybiB0aGlzLl9xdWVyaWVzLnNldCh0LHIpLHJ9LHQubmdJbmplY3RhYmxlRGVmPU9iamVjdChpLlIpKHtmYWN0b3J5OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KE9iamVjdChpLlYpKEUpLE9iamVjdChpLlYpKGkueCkpfSx0b2tlbjp0LHByb3ZpZGVkSW46InJvb3QifSksdH0oKTtmdW5jdGlvbiBJKHQpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5zcGxpdCgiLCIpfSkucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuY29uY2F0KGUpfSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKX0pfXZhciBBLGosUD17WFNtYWxsOiIobWF4LXdpZHRoOiA1OTlweCkiLFNtYWxsOiIobWluLXdpZHRoOiA2MDBweCkgYW5kIChtYXgtd2lkdGg6IDk1OXB4KSIsTWVkaXVtOiIobWluLXdpZHRoOiA5NjBweCkgYW5kIChtYXgtd2lkdGg6IDEyNzlweCkiLExhcmdlOiIobWluLXdpZHRoOiAxMjgwcHgpIGFuZCAobWF4LXdpZHRoOiAxOTE5cHgpIixYTGFyZ2U6IihtaW4td2lkdGg6IDE5MjBweCkiLEhhbmRzZXQ6IihtYXgtd2lkdGg6IDU5OXB4KSBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdCksIChtYXgtd2lkdGg6IDk1OXB4KSBhbmQgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIixUYWJsZXQ6IihtaW4td2lkdGg6IDYwMHB4KSBhbmQgKG1heC13aWR0aDogODM5cHgpIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KSwgKG1pbi13aWR0aDogOTYwcHgpIGFuZCAobWF4LXdpZHRoOiAxMjc5cHgpIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSkiLFdlYjoiKG1pbi13aWR0aDogODQwcHgpIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KSwgKG1pbi13aWR0aDogMTI4MHB4KSBhbmQgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIixIYW5kc2V0UG9ydHJhaXQ6IihtYXgtd2lkdGg6IDU5OXB4KSBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdCkiLFRhYmxldFBvcnRyYWl0OiIobWluLXdpZHRoOiA2MDBweCkgYW5kIChtYXgtd2lkdGg6IDgzOXB4KSBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdCkiLFdlYlBvcnRyYWl0OiIobWluLXdpZHRoOiA4NDBweCkgYW5kIChvcmllbnRhdGlvbjogcG9ydHJhaXQpIixIYW5kc2V0TGFuZHNjYXBlOiIobWF4LXdpZHRoOiA5NTlweCkgYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKSIsVGFibGV0TGFuZHNjYXBlOiIobWluLXdpZHRoOiA5NjBweCkgYW5kIChtYXgtd2lkdGg6IDEyNzlweCkgYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKSIsV2ViTGFuZHNjYXBlOiIobWluLXdpZHRoOiAxMjgwcHgpIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSkifSxNPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dmFyIHI9dGhpczt0aGlzLmJyZWFrcG9pbnRPYnNlcnZlcj10LHRoaXMucm91dGVyPWUsdGhpcy5jaHVua0xvYWRlcj1uLHRoaXMuc2hvd1N1Ym1lbnU9ITEsdGhpcy5vcGVuZWRTaWRlTmF2PSEwLHRoaXMuaXNIYW5kc2V0JD10aGlzLmJyZWFrcG9pbnRPYnNlcnZlci5vYnNlcnZlKFAuSGFuZHNldCkucGlwZShPYmplY3Qody5hKShmdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaGVzfSkpLHRoaXMucm91dGVyTGlua0NodW5rUHJvY2Vzc2luZz1mdW5jdGlvbih0KXtyLnJvdXRlckxpbmtDaHVua1Byb2Nlc3NpbmdVbmJvdW5kKHQscil9fXJldHVybiB0LnByb3RvdHlwZS5yb3V0ZXJMaW5rQ2h1bmtQcm9jZXNzaW5nVW5ib3VuZD1mdW5jdGlvbih0LGUpe2UuY2h1bmtMb2FkZXIubG9hZFBhZ2VDaHVuayh0LGZ1bmN0aW9uKCl7ZS5yb3V0ZXIubmF2aWdhdGVCeVVybCh0KX0pfSx0LnByb3RvdHlwZS5vcGVuU2lkZU5hdj1mdW5jdGlvbigpe3RoaXMub3BlbmVkU2lkZU5hdj0hMCE9PXRoaXMub3BlbmVkU2lkZU5hdn0sdC5wcm90b3R5cGUubmdPbkluaXQ9ZnVuY3Rpb24oKXt9LHR9KCksTj1uKCJwTW5TIiksUj1uKCJsemxqIiksRD1uKCJGVlN5IiksTD1uKCJnSTNCIiksRj1mdW5jdGlvbih0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn0sVj0oMT09PShBPUYpLmxlbmd0aCYmKGo9QSxBPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEYoaih0KSxlKX0pLHtsZWZ0OmZ1bmN0aW9uKHQsZSxuLHIpe2ZvcihudWxsPT1uJiYobj0wKSxudWxsPT1yJiYocj10Lmxlbmd0aCk7bjxyOyl7dmFyIGk9bityPj4+MTtBKHRbaV0sZSk8MD9uPWkrMTpyPWl9cmV0dXJuIG59LHJpZ2h0OmZ1bmN0aW9uKHQsZSxuLHIpe2ZvcihudWxsPT1uJiYobj0wKSxudWxsPT1yJiYocj10Lmxlbmd0aCk7bjxyOyl7dmFyIGk9bityPj4+MTtBKHRbaV0sZSk+MD9yPWk6bj1pKzF9cmV0dXJuIG59fSkucmlnaHQsVT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXQ/TmFOOit0fSx6PWZ1bmN0aW9uKHQsZSl7dmFyIG4scixpLG89dC5sZW5ndGgsYT0tMTtpZihudWxsPT1lKXtmb3IoOysrYTxvOylpZihudWxsIT0obj10W2FdKSYmbj49bilmb3Iocj1pPW47KythPG87KW51bGwhPShuPXRbYV0pJiYocj5uJiYocj1uKSxpPG4mJihpPW4pKX1lbHNlIGZvcig7KythPG87KWlmKG51bGwhPShuPWUodFthXSxhLHQpKSYmbj49bilmb3Iocj1pPW47KythPG87KW51bGwhPShuPWUodFthXSxhLHQpKSYmKHI+biYmKHI9biksaTxuJiYoaT1uKSk7cmV0dXJuW3IsaV19LEI9QXJyYXkucHJvdG90eXBlLnNsaWNlLEg9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxXPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxxPWZ1bmN0aW9uKHQsZSxuKXt0PSt0LGU9K2Usbj0oaT1hcmd1bWVudHMubGVuZ3RoKTwyPyhlPXQsdD0wLDEpOmk8Mz8xOituO2Zvcih2YXIgcj0tMSxpPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKGUtdCkvbikpLG89bmV3IEFycmF5KGkpOysrcjxpOylvW3JdPXQrcipuO3JldHVybiBvfSxZPU1hdGguc3FydCg1MCksRz1NYXRoLnNxcnQoMTApLFE9TWF0aC5zcXJ0KDIpLEs9ZnVuY3Rpb24odCxlLG4pe3ZhciByLGksbyxhLHM9LTE7aWYobj0rbiwodD0rdCk9PShlPStlKSYmbj4wKXJldHVyblt0XTtpZigocj1lPHQpJiYoaT10LHQ9ZSxlPWkpLDA9PT0oYT1aKHQsZSxuKSl8fCFpc0Zpbml0ZShhKSlyZXR1cm5bXTtpZihhPjApZm9yKHQ9TWF0aC5jZWlsKHQvYSksZT1NYXRoLmZsb29yKGUvYSksbz1uZXcgQXJyYXkoaT1NYXRoLmNlaWwoZS10KzEpKTsrK3M8aTspb1tzXT0odCtzKSphO2Vsc2UgZm9yKHQ9TWF0aC5mbG9vcih0KmEpLGU9TWF0aC5jZWlsKGUqYSksbz1uZXcgQXJyYXkoaT1NYXRoLmNlaWwodC1lKzEpKTsrK3M8aTspb1tzXT0odC1zKS9hO3JldHVybiByJiZvLnJldmVyc2UoKSxvfTtmdW5jdGlvbiBaKHQsZSxuKXt2YXIgcj0oZS10KS9NYXRoLm1heCgwLG4pLGk9TWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApLG89ci9NYXRoLnBvdygxMCxpKTtyZXR1cm4gaT49MD8obz49WT8xMDpvPj1HPzU6bz49UT8yOjEpKk1hdGgucG93KDEwLGkpOi1NYXRoLnBvdygxMCwtaSkvKG8+PVk/MTA6bz49Rz81Om8+PVE/MjoxKX1mdW5jdGlvbiBYKHQsZSxuKXt2YXIgcj1NYXRoLmFicyhlLXQpL01hdGgubWF4KDAsbiksaT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIpL01hdGguTE4xMCkpLG89ci9pO3JldHVybiBvPj1ZP2kqPTEwOm8+PUc/aSo9NTpvPj1RJiYoaSo9MiksZTx0Py1pOml9dmFyICQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIpKzF9O0FycmF5O3ZhciBKPXt2YWx1ZTpmdW5jdGlvbigpe319O2Z1bmN0aW9uIHR0KCl7Zm9yKHZhciB0LGU9MCxuPWFyZ3VtZW50cy5sZW5ndGgscj17fTtlPG47KytlKXtpZighKHQ9YXJndW1lbnRzW2VdKyIiKXx8dCBpbiByKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyBldChyKX1mdW5jdGlvbiBldCh0KXt0aGlzLl89dH1mdW5jdGlvbiBudCh0LGUpe2Zvcih2YXIgbixyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKChuPXRbcl0pLm5hbWU9PT1lKXJldHVybiBuLnZhbHVlfWZ1bmN0aW9uIHJ0KHQsZSxuKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTsrK3IpaWYodFtyXS5uYW1lPT09ZSl7dFtyXT1KLHQ9dC5zbGljZSgwLHIpLmNvbmNhdCh0LnNsaWNlKHIrMSkpO2JyZWFrfXJldHVybiBudWxsIT1uJiZ0LnB1c2goe25hbWU6ZSx2YWx1ZTpufSksdH1ldC5wcm90b3R5cGU9dHQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpldCxvbjpmdW5jdGlvbih0LGUpe3ZhciBuLHIsaT10aGlzLl8sbz0ocj1pLCh0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPSIiLG49dC5pbmRleE9mKCIuIik7aWYobj49MCYmKGU9dC5zbGljZShuKzEpLHQ9dC5zbGljZSgwLG4pKSx0JiYhci5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6ZX19KSksYT0tMSxzPW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK2UpO2Zvcig7KythPHM7KWlmKG49KHQ9b1thXSkudHlwZSlpW25dPXJ0KGlbbl0sdC5uYW1lLGUpO2Vsc2UgaWYobnVsbD09ZSlmb3IobiBpbiBpKWlbbl09cnQoaVtuXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK2E8czspaWYoKG49KHQ9b1thXSkudHlwZSkmJihuPW50KGlbbl0sdC5uYW1lKSkpcmV0dXJuIG59LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxlPXRoaXMuXztmb3IodmFyIG4gaW4gZSl0W25dPWVbbl0uc2xpY2UoKTtyZXR1cm4gbmV3IGV0KHQpfSxjYWxsOmZ1bmN0aW9uKHQsZSl7aWYoKG49YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgbixyLGk9bmV3IEFycmF5KG4pLG89MDtvPG47KytvKWlbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLG49KHI9dGhpcy5fW3RdKS5sZW5ndGg7bzxuOysrbylyW29dLnZhbHVlLmFwcGx5KGUsaSl9LGFwcGx5OmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgcj10aGlzLl9bdF0saT0wLG89ci5sZW5ndGg7aTxvOysraSlyW2ldLnZhbHVlLmFwcGx5KGUsbil9fTt2YXIgaXQ9dHQsb3Q9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLGF0PXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpvdCx4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9LHN0PWZ1bmN0aW9uKHQpe3ZhciBlPXQrPSIiLG49ZS5pbmRleE9mKCI6Iik7cmV0dXJuIG4+PTAmJiJ4bWxucyIhPT0oZT10LnNsaWNlKDAsbikpJiYodD10LnNsaWNlKG4rMSkpLGF0Lmhhc093blByb3BlcnR5KGUpP3tzcGFjZTphdFtlXSxsb2NhbDp0fTp0fSx1dD1mdW5jdGlvbih0KXt2YXIgZT1zdCh0KTtyZXR1cm4oZS5sb2NhbD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50LG49dGhpcy5uYW1lc3BhY2VVUkk7cmV0dXJuIG49PT1vdCYmZS5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09b3Q/ZS5jcmVhdGVFbGVtZW50KHQpOmUuY3JlYXRlRWxlbWVudE5TKG4sdCl9fSkoZSl9O2Z1bmN0aW9uIGx0KCl7fXZhciBjdD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9sdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fTtmdW5jdGlvbiBmdCgpe3JldHVybltdfXZhciBodD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9mdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSxkdD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXRjaGVzKHQpfX07aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCl7dmFyIHB0PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtpZighcHQubWF0Y2hlcyl7dmFyIG10PXB0LndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8cHQubXNNYXRjaGVzU2VsZWN0b3J8fHB0Lm1vek1hdGNoZXNTZWxlY3Rvcnx8cHQub01hdGNoZXNTZWxlY3RvcjtkdD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbXQuY2FsbCh0aGlzLHQpfX19fXZhciB5dD1kdCxndD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEFycmF5KHQubGVuZ3RoKX07ZnVuY3Rpb24gdnQodCxlKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPWV9dnQucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp2dCxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LGUpfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fTt2YXIgYnQ9IiQiO2Z1bmN0aW9uIF90KHQsZSxuLHIsaSxvKXtmb3IodmFyIGEscz0wLHU9ZS5sZW5ndGgsbD1vLmxlbmd0aDtzPGw7KytzKShhPWVbc10pPyhhLl9fZGF0YV9fPW9bc10scltzXT1hKTpuW3NdPW5ldyB2dCh0LG9bc10pO2Zvcig7czx1OysrcykoYT1lW3NdKSYmKGlbc109YSl9ZnVuY3Rpb24gd3QodCxlLG4scixpLG8sYSl7dmFyIHMsdSxsLGM9e30sZj1lLmxlbmd0aCxoPW8ubGVuZ3RoLGQ9bmV3IEFycmF5KGYpO2ZvcihzPTA7czxmOysrcykodT1lW3NdKSYmKGRbc109bD1idCthLmNhbGwodSx1Ll9fZGF0YV9fLHMsZSksbCBpbiBjP2lbc109dTpjW2xdPXUpO2ZvcihzPTA7czxoOysrcykodT1jW2w9YnQrYS5jYWxsKHQsb1tzXSxzLG8pXSk/KHJbc109dSx1Ll9fZGF0YV9fPW9bc10sY1tsXT1udWxsKTpuW3NdPW5ldyB2dCh0LG9bc10pO2ZvcihzPTA7czxmOysrcykodT1lW3NdKSYmY1tkW3NdXT09PXUmJihpW3NdPXUpfWZ1bmN0aW9uIHh0KHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfXZhciBPdD1mdW5jdGlvbih0KXtyZXR1cm4gdC5vd25lckRvY3VtZW50JiZ0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHQuZG9jdW1lbnQmJnR8fHQuZGVmYXVsdFZpZXd9O2Z1bmN0aW9uIEN0KHQsZSl7cmV0dXJuIHQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShlKXx8T3QodCkuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLmdldFByb3BlcnR5VmFsdWUoZSl9ZnVuY3Rpb24gU3QodCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIEV0KHQpe3JldHVybiB0LmNsYXNzTGlzdHx8bmV3IGt0KHQpfWZ1bmN0aW9uIGt0KHQpe3RoaXMuX25vZGU9dCx0aGlzLl9uYW1lcz1TdCh0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfWZ1bmN0aW9uIFR0KHQsZSl7Zm9yKHZhciBuPUV0KHQpLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspbi5hZGQoZVtyXSl9ZnVuY3Rpb24gSXQodCxlKXtmb3IodmFyIG49RXQodCkscj0tMSxpPWUubGVuZ3RoOysrcjxpOyluLnJlbW92ZShlW3JdKX1mdW5jdGlvbiBBdCgpe3RoaXMudGV4dENvbnRlbnQ9IiJ9ZnVuY3Rpb24ganQoKXt0aGlzLmlubmVySFRNTD0iIn1mdW5jdGlvbiBQdCgpe3RoaXMubmV4dFNpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKX1mdW5jdGlvbiBNdCgpe3RoaXMucHJldmlvdXNTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIE50KCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gUnQoKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBEdCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuY2xvbmVOb2RlKCExKSx0aGlzLm5leHRTaWJsaW5nKX1mdW5jdGlvbiBMdCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuY2xvbmVOb2RlKCEwKSx0aGlzLm5leHRTaWJsaW5nKX1rdC5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbih0KXt0aGlzLl9uYW1lcy5pbmRleE9mKHQpPDAmJih0aGlzLl9uYW1lcy5wdXNoKHQpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9uYW1lcy5pbmRleE9mKHQpO2U+PTAmJih0aGlzLl9uYW1lcy5zcGxpY2UoZSwxKSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZih0KT49MH19O3ZhciBGdD17fSxWdD1udWxsO2Z1bmN0aW9uIFV0KHQsZSxuKXtyZXR1cm4gdD16dCh0LGUsbiksZnVuY3Rpb24oZSl7dmFyIG49ZS5yZWxhdGVkVGFyZ2V0O24mJihuPT09dGhpc3x8OCZuLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsZSl9fWZ1bmN0aW9uIHp0KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIGk9VnQ7VnQ9cjt0cnl7dC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxlLG4pfWZpbmFsbHl7VnQ9aX19fWZ1bmN0aW9uIEJ0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuX19vbjtpZihlKXtmb3IodmFyIG4scj0wLGk9LTEsbz1lLmxlbmd0aDtyPG87KytyKW49ZVtyXSx0LnR5cGUmJm4udHlwZSE9PXQudHlwZXx8bi5uYW1lIT09dC5uYW1lP2VbKytpXT1uOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLnR5cGUsbi5saXN0ZW5lcixuLmNhcHR1cmUpOysraT9lLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBIdCh0LGUsbil7dmFyIHI9RnQuaGFzT3duUHJvcGVydHkodC50eXBlKT9VdDp6dDtyZXR1cm4gZnVuY3Rpb24oaSxvLGEpe3ZhciBzLHU9dGhpcy5fX29uLGw9cihlLG8sYSk7aWYodSlmb3IodmFyIGM9MCxmPXUubGVuZ3RoO2M8ZjsrK2MpaWYoKHM9dVtjXSkudHlwZT09PXQudHlwZSYmcy5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXIscy5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXI9bCxzLmNhcHR1cmU9biksdm9pZChzLnZhbHVlPWUpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsbCxuKSxzPXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTplLGxpc3RlbmVyOmwsY2FwdHVyZTpufSx1P3UucHVzaChzKTp0aGlzLl9fb249W3NdfX1mdW5jdGlvbiBXdCh0LGUsbil7dmFyIHI9T3QodCksaT1yLkN1c3RvbUV2ZW50OyJmdW5jdGlvbiI9PXR5cGVvZiBpP2k9bmV3IGkoZSxuKTooaT1yLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLG4/KGkuaW5pdEV2ZW50KGUsbi5idWJibGVzLG4uY2FuY2VsYWJsZSksaS5kZXRhaWw9bi5kZXRhaWwpOmkuaW5pdEV2ZW50KGUsITEsITEpKSx0LmRpc3BhdGNoRXZlbnQoaSl9InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmKCJvbm1vdXNlZW50ZXIiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoRnQ9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO3ZhciBxdD1bbnVsbF07ZnVuY3Rpb24gWXQodCxlKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPWV9ZnVuY3Rpb24gR3QoKXtyZXR1cm4gbmV3IFl0KFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0scXQpfVl0LnByb3RvdHlwZT1HdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOll0LHNlbGVjdDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Y3QodCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxyPW5ldyBBcnJheShuKSxpPTA7aTxuOysraSlmb3IodmFyIG8sYSxzPWVbaV0sdT1zLmxlbmd0aCxsPXJbaV09bmV3IEFycmF5KHUpLGM9MDtjPHU7KytjKShvPXNbY10pJiYoYT10LmNhbGwobyxvLl9fZGF0YV9fLGMscykpJiYoIl9fZGF0YV9fImluIG8mJihhLl9fZGF0YV9fPW8uX19kYXRhX18pLGxbY109YSk7cmV0dXJuIG5ldyBZdChyLHRoaXMuX3BhcmVudHMpfSxzZWxlY3RBbGw6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWh0KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgscj1bXSxpPVtdLG89MDtvPG47KytvKWZvcih2YXIgYSxzPWVbb10sdT1zLmxlbmd0aCxsPTA7bDx1OysrbCkoYT1zW2xdKSYmKHIucHVzaCh0LmNhbGwoYSxhLl9fZGF0YV9fLGwscykpLGkucHVzaChhKSk7cmV0dXJuIG5ldyBZdChyLGkpfSxmaWx0ZXI6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXl0KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgscj1uZXcgQXJyYXkobiksaT0wO2k8bjsrK2kpZm9yKHZhciBvLGE9ZVtpXSxzPWEubGVuZ3RoLHU9cltpXT1bXSxsPTA7bDxzOysrbCkobz1hW2xdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxsLGEpJiZ1LnB1c2gobyk7cmV0dXJuIG5ldyBZdChyLHRoaXMuX3BhcmVudHMpfSxkYXRhOmZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuIHA9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxjPS0xLHRoaXMuZWFjaChmdW5jdGlvbih0KXtwWysrY109dH0pLHA7dmFyIG4scj1lP3d0Ol90LGk9dGhpcy5fcGFyZW50cyxvPXRoaXMuX2dyb3VwczsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKG49dCx0PWZ1bmN0aW9uKCl7cmV0dXJuIG59KTtmb3IodmFyIGE9by5sZW5ndGgscz1uZXcgQXJyYXkoYSksdT1uZXcgQXJyYXkoYSksbD1uZXcgQXJyYXkoYSksYz0wO2M8YTsrK2Mpe3ZhciBmPWlbY10saD1vW2NdLGQ9aC5sZW5ndGgscD10LmNhbGwoZixmJiZmLl9fZGF0YV9fLGMsaSksbT1wLmxlbmd0aCx5PXVbY109bmV3IEFycmF5KG0pLGc9c1tjXT1uZXcgQXJyYXkobSk7cihmLGgseSxnLGxbY109bmV3IEFycmF5KGQpLHAsZSk7Zm9yKHZhciB2LGIsXz0wLHc9MDtfPG07KytfKWlmKHY9eVtfXSl7Zm9yKF8+PXcmJih3PV8rMSk7IShiPWdbd10pJiYrK3c8bTspO3YuX25leHQ9Ynx8bnVsbH19cmV0dXJuKHM9bmV3IFl0KHMsaSkpLl9lbnRlcj11LHMuX2V4aXQ9bCxzfSxlbnRlcjpmdW5jdGlvbigpe3JldHVybiBuZXcgWXQodGhpcy5fZW50ZXJ8fHRoaXMuX2dyb3Vwcy5tYXAoZ3QpLHRoaXMuX3BhcmVudHMpfSxleGl0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBZdCh0aGlzLl9leGl0fHx0aGlzLl9ncm91cHMubWFwKGd0KSx0aGlzLl9wYXJlbnRzKX0sbWVyZ2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPXQuX2dyb3VwcyxyPWUubGVuZ3RoLGk9TWF0aC5taW4ocixuLmxlbmd0aCksbz1uZXcgQXJyYXkociksYT0wO2E8aTsrK2EpZm9yKHZhciBzLHU9ZVthXSxsPW5bYV0sYz11Lmxlbmd0aCxmPW9bYV09bmV3IEFycmF5KGMpLGg9MDtoPGM7KytoKShzPXVbaF18fGxbaF0pJiYoZltoXT1zKTtmb3IoO2E8cjsrK2Epb1thXT1lW2FdO3JldHVybiBuZXcgWXQobyx0aGlzLl9wYXJlbnRzKX0sb3JkZXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9LTEsbj10Lmxlbmd0aDsrK2U8bjspZm9yKHZhciByLGk9dFtlXSxvPWkubGVuZ3RoLTEsYT1pW29dOy0tbz49MDspKHI9aVtvXSkmJihhJiZhIT09ci5uZXh0U2libGluZyYmYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyLGEpLGE9cik7cmV0dXJuIHRoaXN9LHNvcnQ6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3JldHVybiBlJiZuP3QoZS5fX2RhdGFfXyxuLl9fZGF0YV9fKTohZS0hbn10fHwodD14dCk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxyPW4ubGVuZ3RoLGk9bmV3IEFycmF5KHIpLG89MDtvPHI7KytvKXtmb3IodmFyIGEscz1uW29dLHU9cy5sZW5ndGgsbD1pW29dPW5ldyBBcnJheSh1KSxjPTA7Yzx1OysrYykoYT1zW2NdKSYmKGxbY109YSk7bC5zb3J0KGUpfXJldHVybiBuZXcgWXQoaSx0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxjYWxsOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbigpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksZT0tMTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dFsrK2VdPXRoaXN9KSx0fSxub2RlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPTAsbj10Lmxlbmd0aDtlPG47KytlKWZvcih2YXIgcj10W2VdLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpe3ZhciBhPXJbaV07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeysrdH0pLHR9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj0wLHI9ZS5sZW5ndGg7bjxyOysrbilmb3IodmFyIGksbz1lW25dLGE9MCxzPW8ubGVuZ3RoO2E8czsrK2EpKGk9b1thXSkmJnQuY2FsbChpLGkuX19kYXRhX18sYSxvKTtyZXR1cm4gdGhpc30sYXR0cjpmdW5jdGlvbih0LGUpe3ZhciBuPXN0KHQpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7dmFyIHI9dGhpcy5ub2RlKCk7cmV0dXJuIG4ubG9jYWw/ci5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOnIuZ2V0QXR0cmlidXRlKG4pfXJldHVybiB0aGlzLmVhY2goKG51bGw9PWU/bi5sb2NhbD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19OiJmdW5jdGlvbiI9PXR5cGVvZiBlP24ubG9jYWw/ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KTp0aGlzLnNldEF0dHJpYnV0ZSh0LG4pfX06bi5sb2NhbD9mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfX06ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSh0LGUpfX0pKG4sZSkpfSxzdHlsZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2Z1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1yP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCk6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LHIsbil9fTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUsbil9fSkodCxlLG51bGw9PW4/IiI6bikpOkN0KHRoaXMubm9kZSgpLHQpfSxwcm9wZXJ0eTpmdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1lP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3RdfX06ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP2RlbGV0ZSB0aGlzW3RdOnRoaXNbdF09bn19OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpc1t0XT1lfX0pKHQsZSkpOnRoaXMubm9kZSgpW3RdfSxjbGFzc2VkOmZ1bmN0aW9uKHQsZSl7dmFyIG49U3QodCsiIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIHI9RXQodGhpcy5ub2RlKCkpLGk9LTEsbz1uLmxlbmd0aDsrK2k8bzspaWYoIXIuY29udGFpbnMobltpXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24oKXsoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk/VHQ6SXQpKHRoaXMsdCl9fTplP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe1R0KHRoaXMsdCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtJdCh0aGlzLHQpfX0pKG4sZSkpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P0F0OigiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KSh0KSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LGh0bWw6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/anQ6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PWU/IiI6ZX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPXR9fSkodCkpOnRoaXMubm9kZSgpLmlubmVySFRNTH0scmFpc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKFB0KX0sbG93ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKE10KX0sYXBwZW5kOmZ1bmN0aW9uKHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dXQodCk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGluc2VydDpmdW5jdGlvbih0LGUpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dXQodCkscj1udWxsPT1lP050OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6Y3QoZSk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKFJ0KX0sY2xvbmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2VsZWN0KHQ/THQ6RHQpfSxkYXR1bTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsdCk6dGhpcy5ub2RlKCkuX19kYXRhX199LG9uOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpLG89KHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9IiIsbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKGU9dC5zbGljZShuKzEpLHQ9dC5zbGljZSgwLG4pKSx7dHlwZTp0LG5hbWU6ZX19KSxhPW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7Zm9yKHM9ZT9IdDpCdCxudWxsPT1uJiYobj0hMSkscj0wO3I8YTsrK3IpdGhpcy5lYWNoKHMob1tyXSxlLG4pKTtyZXR1cm4gdGhpc312YXIgcz10aGlzLm5vZGUoKS5fX29uO2lmKHMpZm9yKHZhciB1LGw9MCxjPXMubGVuZ3RoO2w8YzsrK2wpZm9yKHI9MCx1PXNbbF07cjxhOysrcilpZigoaT1vW3JdKS50eXBlPT09dS50eXBlJiZpLm5hbWU9PT11Lm5hbWUpcmV0dXJuIHUudmFsdWV9LGRpc3BhdGNoOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gV3QodGhpcyx0LGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFd0KHRoaXMsdCxlKX19KSh0LGUpKX19O3ZhciBRdD1HdCxLdD1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFl0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgWXQoW1t0XV0scXQpfSxadD0wO2Z1bmN0aW9uIFh0KCl7dGhpcy5fPSJAIisoKytadCkudG9TdHJpbmcoMzYpfVh0LnByb3RvdHlwZT0oZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFh0fSkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpYdCxnZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuXzshKGUgaW4gdCk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdFtlXX0sc2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbdGhpcy5fXT1lfSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuXyBpbiB0JiZkZWxldGUgdFt0aGlzLl9dfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fTt2YXIgJHQ9ZnVuY3Rpb24odCxlLG4pe3QucHJvdG90eXBlPWUucHJvdG90eXBlPW4sbi5jb25zdHJ1Y3Rvcj10fTtmdW5jdGlvbiBKdCh0LGUpe3ZhciBuPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgciBpbiBlKW5bcl09ZVtyXTtyZXR1cm4gbn1mdW5jdGlvbiB0ZSgpe312YXIgZWU9IlxccyooWystXT9cXGQrKVxccyoiLG5lPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLHJlPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixpZT0vXiMoWzAtOWEtZl17M30pJC8sb2U9L14jKFswLTlhLWZdezZ9KSQvLGFlPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tlZSxlZSxlZV0rIlxcKSQiKSxzZT1uZXcgUmVnRXhwKCJecmdiXFwoIitbcmUscmUscmVdKyJcXCkkIiksdWU9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tlZSxlZSxlZSxuZV0rIlxcKSQiKSxsZT1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW3JlLHJlLHJlLG5lXSsiXFwpJCIpLGNlPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tuZSxyZSxyZV0rIlxcKSQiKSxmZT1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW25lLHJlLHJlLG5lXSsiXFwpJCIpLGhlPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIGRlKHQpe3ZhciBlO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwoZT1pZS5leGVjKHQpKT9uZXcgdmUoKGU9cGFyc2VJbnQoZVsxXSwxNikpPj44JjE1fGU+PjQmMjQwLGU+PjQmMTV8MjQwJmUsKDE1JmUpPDw0fDE1JmUsMSk6KGU9b2UuZXhlYyh0KSk/cGUocGFyc2VJbnQoZVsxXSwxNikpOihlPWFlLmV4ZWModCkpP25ldyB2ZShlWzFdLGVbMl0sZVszXSwxKTooZT1zZS5leGVjKHQpKT9uZXcgdmUoMjU1KmVbMV0vMTAwLDI1NSplWzJdLzEwMCwyNTUqZVszXS8xMDAsMSk6KGU9dWUuZXhlYyh0KSk/bWUoZVsxXSxlWzJdLGVbM10sZVs0XSk6KGU9bGUuZXhlYyh0KSk/bWUoMjU1KmVbMV0vMTAwLDI1NSplWzJdLzEwMCwyNTUqZVszXS8xMDAsZVs0XSk6KGU9Y2UuZXhlYyh0KSk/X2UoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCwxKTooZT1mZS5leGVjKHQpKT9fZShlWzFdLGVbMl0vMTAwLGVbM10vMTAwLGVbNF0pOmhlLmhhc093blByb3BlcnR5KHQpP3BlKGhlW3RdKToidHJhbnNwYXJlbnQiPT09dD9uZXcgdmUoTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBwZSh0KXtyZXR1cm4gbmV3IHZlKHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCwxKX1mdW5jdGlvbiBtZSh0LGUsbixyKXtyZXR1cm4gcjw9MCYmKHQ9ZT1uPU5hTiksbmV3IHZlKHQsZSxuLHIpfWZ1bmN0aW9uIHllKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdGV8fCh0PWRlKHQpKSx0P25ldyB2ZSgodD10LnJnYigpKS5yLHQuZyx0LmIsdC5vcGFjaXR5KTpuZXcgdmV9ZnVuY3Rpb24gZ2UodCxlLG4scil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3llKHQpOm5ldyB2ZSh0LGUsbixudWxsPT1yPzE6cil9ZnVuY3Rpb24gdmUodCxlLG4scil7dGhpcy5yPSt0LHRoaXMuZz0rZSx0aGlzLmI9K24sdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIGJlKHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2PyIwIjoiIikrdC50b1N0cmluZygxNil9ZnVuY3Rpb24gX2UodCxlLG4scil7cmV0dXJuIHI8PTA/dD1lPW49TmFOOm48PTB8fG4+PTE/dD1lPU5hTjplPD0wJiYodD1OYU4pLG5ldyB4ZSh0LGUsbixyKX1mdW5jdGlvbiB3ZSh0LGUsbixyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIHhlKXJldHVybiBuZXcgeGUodC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgdGV8fCh0PWRlKHQpKSwhdClyZXR1cm4gbmV3IHhlO2lmKHQgaW5zdGFuY2VvZiB4ZSlyZXR1cm4gdDt2YXIgZT0odD10LnJnYigpKS5yLzI1NSxuPXQuZy8yNTUscj10LmIvMjU1LGk9TWF0aC5taW4oZSxuLHIpLG89TWF0aC5tYXgoZSxuLHIpLGE9TmFOLHM9by1pLHU9KG8raSkvMjtyZXR1cm4gcz8oYT1lPT09bz8obi1yKS9zKzYqKG48cik6bj09PW8/KHItZSkvcysyOihlLW4pL3MrNCxzLz11PC41P28raToyLW8taSxhKj02MCk6cz11PjAmJnU8MT8wOmEsbmV3IHhlKGEscyx1LHQub3BhY2l0eSl9KHQpOm5ldyB4ZSh0LGUsbixudWxsPT1yPzE6cil9ZnVuY3Rpb24geGUodCxlLG4scil7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIE9lKHQsZSxuKXtyZXR1cm4gMjU1Kih0PDYwP2UrKG4tZSkqdC82MDp0PDE4MD9uOnQ8MjQwP2UrKG4tZSkqKDI0MC10KS82MDplKX0kdCh0ZSxkZSx7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5oZXgoKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKSsiIn19KSwkdCh2ZSxnZSxKdCh0ZSx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8xLy43Ok1hdGgucG93KDEvLjcsdCksbmV3IHZlKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyB2ZSh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9dGhpcy5yJiZ0aGlzLnI8PTI1NSYmMDw9dGhpcy5nJiZ0aGlzLmc8PTI1NSYmMDw9dGhpcy5iJiZ0aGlzLmI8PTI1NSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpmdW5jdGlvbigpe3JldHVybiIjIitiZSh0aGlzLnIpK2JlKHRoaXMuZykrYmUodGhpcy5iKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksJHQoeGUsd2UsSnQodGUse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyB4ZSh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyB4ZSh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksZT1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxuPXRoaXMubCxyPW4rKG48LjU/bjoxLW4pKmUsaT0yKm4tcjtyZXR1cm4gbmV3IHZlKE9lKHQ+PTI0MD90LTI0MDp0KzEyMCxpLHIpLE9lKHQsaSxyKSxPZSh0PDEyMD90KzI0MDp0LTEyMCxpLHIpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfX0pKTt2YXIgQ2U9TWF0aC5QSS8xODAsU2U9MTgwL01hdGguUEksRWU9Ljk2NDIyLGtlPTEsVGU9LjgyNTIxLEllPTQvMjksQWU9Ni8yOSxqZT0zKkFlKkFlLFBlPUFlKkFlKkFlO2Z1bmN0aW9uIE1lKHQpe2lmKHQgaW5zdGFuY2VvZiBOZSlyZXR1cm4gbmV3IE5lKHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIFVlKXtpZihpc05hTih0LmgpKXJldHVybiBuZXcgTmUodC5sLDAsMCx0Lm9wYWNpdHkpO3ZhciBlPXQuaCpDZTtyZXR1cm4gbmV3IE5lKHQubCxNYXRoLmNvcyhlKSp0LmMsTWF0aC5zaW4oZSkqdC5jLHQub3BhY2l0eSl9dCBpbnN0YW5jZW9mIHZlfHwodD15ZSh0KSk7dmFyIG4scixpPUZlKHQuciksbz1GZSh0LmcpLGE9RmUodC5iKSxzPVJlKCguMjIyNTA0NSppKy43MTY4Nzg2Km8rLjA2MDYxNjkqYSkva2UpO3JldHVybiBpPT09byYmbz09PWE/bj1yPXM6KG49UmUoKC40MzYwNzQ3KmkrLjM4NTA2NDkqbysuMTQzMDgwNCphKS9FZSkscj1SZSgoLjAxMzkzMjIqaSsuMDk3MTA0NSpvKy43MTQxNzMzKmEpL1RlKSksbmV3IE5lKDExNipzLTE2LDUwMCoobi1zKSwyMDAqKHMtciksdC5vcGFjaXR5KX1mdW5jdGlvbiBOZSh0LGUsbixyKXt0aGlzLmw9K3QsdGhpcy5hPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gUmUodCl7cmV0dXJuIHQ+UGU/TWF0aC5wb3codCwxLzMpOnQvamUrSWV9ZnVuY3Rpb24gRGUodCl7cmV0dXJuIHQ+QWU/dCp0KnQ6amUqKHQtSWUpfWZ1bmN0aW9uIExlKHQpe3JldHVybiAyNTUqKHQ8PS4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSl9ZnVuY3Rpb24gRmUodCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gVmUodCxlLG4scil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2Z1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBVZSlyZXR1cm4gbmV3IFVlKHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIE5lfHwodD1NZSh0KSksMD09PXQuYSYmMD09PXQuYilyZXR1cm4gbmV3IFVlKE5hTiwwLHQubCx0Lm9wYWNpdHkpO3ZhciBlPU1hdGguYXRhbjIodC5iLHQuYSkqU2U7cmV0dXJuIG5ldyBVZShlPDA/ZSszNjA6ZSxNYXRoLnNxcnQodC5hKnQuYSt0LmIqdC5iKSx0LmwsdC5vcGFjaXR5KX0odCk6bmV3IFVlKHQsZSxuLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBVZSh0LGUsbixyKXt0aGlzLmg9K3QsdGhpcy5jPStlLHRoaXMubD0rbix0aGlzLm9wYWNpdHk9K3J9JHQoTmUsZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP01lKHQpOm5ldyBOZSh0LGUsbixudWxsPT1yPzE6cil9LEp0KHRlLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IE5lKHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgTmUodGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD0odGhpcy5sKzE2KS8xMTYsZT1pc05hTih0aGlzLmEpP3Q6dCt0aGlzLmEvNTAwLG49aXNOYU4odGhpcy5iKT90OnQtdGhpcy5iLzIwMDtyZXR1cm4gbmV3IHZlKExlKDMuMTMzODU2MSooZT1FZSpEZShlKSktMS42MTY4NjY3Kih0PWtlKkRlKHQpKS0uNDkwNjE0Nioobj1UZSpEZShuKSkpLExlKC0uOTc4NzY4NCplKzEuOTE2MTQxNSp0Ky4wMzM0NTQqbiksTGUoLjA3MTk0NTMqZS0uMjI4OTkxNCp0KzEuNDA1MjQyNypuKSx0aGlzLm9wYWNpdHkpfX0pKSwkdChVZSxWZSxKdCh0ZSx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBVZSh0aGlzLmgsdGhpcy5jLHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IFVlKHRoaXMuaCx0aGlzLmMsdGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIE1lKHRoaXMpLnJnYigpfX0pKTt2YXIgemU9LS4yOTIyNyxCZT0tLjkwNjQ5LEhlPTEuOTcyOTQsV2U9SGUqQmUscWU9MS43ODI3NypIZSxZZT0xLjc4Mjc3KnplLSAtLjE0ODYxKkJlO2Z1bmN0aW9uIEdlKHQsZSxuLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9mdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgUWUpcmV0dXJuIG5ldyBRZSh0LmgsdC5zLHQubCx0Lm9wYWNpdHkpO3QgaW5zdGFuY2VvZiB2ZXx8KHQ9eWUodCkpO3ZhciBlPXQuZy8yNTUsbj10LmIvMjU1LHI9KFllKm4rV2UqKHQuci8yNTUpLXFlKmUpLyhZZStXZS1xZSksaT1uLXIsbz0oSGUqKGUtciktemUqaSkvQmUsYT1NYXRoLnNxcnQobypvK2kqaSkvKEhlKnIqKDEtcikpLHM9YT9NYXRoLmF0YW4yKG8saSkqU2UtMTIwOk5hTjtyZXR1cm4gbmV3IFFlKHM8MD9zKzM2MDpzLGEscix0Lm9wYWNpdHkpfSh0KTpuZXcgUWUodCxlLG4sbnVsbD09cj8xOnIpfWZ1bmN0aW9uIFFlKHQsZSxuLHIpe3RoaXMuaD0rdCx0aGlzLnM9K2UsdGhpcy5sPStuLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBLZSh0LGUsbixyLGkpe3ZhciBvPXQqdCxhPW8qdDtyZXR1cm4oKDEtMyp0KzMqby1hKSplKyg0LTYqbyszKmEpKm4rKDErMyp0KzMqby0zKmEpKnIrYSppKS82fSR0KFFlLEdlLEp0KHRlLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgUWUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgUWUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKkNlLGU9K3RoaXMubCxuPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqZSooMS1lKSxyPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyB2ZSgyNTUqKGUrbiooLS4xNDg2MSpyKzEuNzgyNzcqaSkpLDI1NSooZStuKih6ZSpyK0JlKmkpKSwyNTUqKGUrbiooSGUqcikpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBaZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19O2Z1bmN0aW9uIFhlKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0K24qZX19ZnVuY3Rpb24gJGUodCxlKXt2YXIgbj1lLXQ7cmV0dXJuIG4/WGUodCxuPjE4MHx8bjwtMTgwP24tMzYwKk1hdGgucm91bmQobi8zNjApOm4pOlplKGlzTmFOKHQpP2U6dCl9ZnVuY3Rpb24gSmUodCxlKXt2YXIgbj1lLXQ7cmV0dXJuIG4/WGUodCxuKTpaZShpc05hTih0KT9lOnQpfXZhciB0bj1mdW5jdGlvbiB0KGUpe3ZhciBuPWZ1bmN0aW9uKHQpe3JldHVybiAxPT0odD0rdCk/SmU6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbi1lP2Z1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD1NYXRoLnBvdyh0LG4pLGU9TWF0aC5wb3coZSxuKS10LG49MS9uLGZ1bmN0aW9uKHIpe3JldHVybiBNYXRoLnBvdyh0K3IqZSxuKX19KGUsbix0KTpaZShpc05hTihlKT9uOmUpfX0oZSk7ZnVuY3Rpb24gcih0LGUpe3ZhciByPW4oKHQ9Z2UodCkpLnIsKGU9Z2UoZSkpLnIpLGk9bih0LmcsZS5nKSxvPW4odC5iLGUuYiksYT1KZSh0Lm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQucj1yKGUpLHQuZz1pKGUpLHQuYj1vKGUpLHQub3BhY2l0eT1hKGUpLHQrIiJ9fXJldHVybiByLmdhbW1hPXQscn0oMSk7ZnVuY3Rpb24gZW4odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuLHIsaT1lLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShpKSxzPW5ldyBBcnJheShpKTtmb3Iobj0wO248aTsrK24pcj1nZShlW25dKSxvW25dPXIucnx8MCxhW25dPXIuZ3x8MCxzW25dPXIuYnx8MDtyZXR1cm4gbz10KG8pLGE9dChhKSxzPXQocyksci5vcGFjaXR5PTEsZnVuY3Rpb24odCl7cmV0dXJuIHIucj1vKHQpLHIuZz1hKHQpLHIuYj1zKHQpLHIrIiJ9fX12YXIgbm4scm4sb24sYW4sc249ZW4oZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgtMTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIHI9bjw9MD9uPTA6bj49MT8obj0xLGUtMSk6TWF0aC5mbG9vcihuKmUpLGk9dFtyXSxvPXRbcisxXTtyZXR1cm4gS2UoKG4tci9lKSplLHI+MD90W3ItMV06MippLW8saSxvLHI8ZS0xP3RbcisyXToyKm8taSl9fSksdW49KGVuKGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihuKXt2YXIgcj1NYXRoLmZsb29yKCgobiU9MSk8MD8rK246bikqZSk7cmV0dXJuIEtlKChuLXIvZSkqZSx0WyhyK2UtMSklZV0sdFtyJWVdLHRbKHIrMSklZV0sdFsocisyKSVlXSl9fSksZnVuY3Rpb24odCxlKXtyZXR1cm4gZS09dD0rdCxmdW5jdGlvbihuKXtyZXR1cm4gdCtlKm59fSksbG49L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLGNuPW5ldyBSZWdFeHAobG4uc291cmNlLCJnIiksZm49ZnVuY3Rpb24odCxlKXt2YXIgbixyLGksbz1sbi5sYXN0SW5kZXg9Y24ubGFzdEluZGV4PTAsYT0tMSxzPVtdLHU9W107Zm9yKHQrPSIiLGUrPSIiOyhuPWxuLmV4ZWModCkpJiYocj1jbi5leGVjKGUpKTspKGk9ci5pbmRleCk+byYmKGk9ZS5zbGljZShvLGkpLHNbYV0/c1thXSs9aTpzWysrYV09aSksKG49blswXSk9PT0ocj1yWzBdKT9zW2FdP3NbYV0rPXI6c1srK2FdPXI6KHNbKythXT1udWxsLHUucHVzaCh7aTphLHg6dW4obixyKX0pKSxvPWNuLmxhc3RJbmRleDtyZXR1cm4gbzxlLmxlbmd0aCYmKGk9ZS5zbGljZShvKSxzW2FdP3NbYV0rPWk6c1srK2FdPWkpLHMubGVuZ3RoPDI/dVswXT9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSkrIiJ9fSh1WzBdLngpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0oZSk6KGU9dS5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBuLHI9MDtyPGU7KytyKXNbKG49dVtyXSkuaV09bi54KHQpO3JldHVybiBzLmpvaW4oIiIpfSl9LGhuPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj10eXBlb2YgZTtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT09cj9aZShlKTooIm51bWJlciI9PT1yP3VuOiJzdHJpbmciPT09cj8obj1kZShlKSk/KGU9bix0bik6Zm46ZSBpbnN0YW5jZW9mIGRlP3RuOmUgaW5zdGFuY2VvZiBEYXRlP2Z1bmN0aW9uKHQsZSl7dmFyIG49bmV3IERhdGU7cmV0dXJuIGUtPXQ9K3QsZnVuY3Rpb24ocil7cmV0dXJuIG4uc2V0VGltZSh0K2Uqciksbn19OkFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24odCxlKXt2YXIgbixyPWU/ZS5sZW5ndGg6MCxpPXQ/TWF0aC5taW4ocix0Lmxlbmd0aCk6MCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShyKTtmb3Iobj0wO248aTsrK24pb1tuXT1obih0W25dLGVbbl0pO2Zvcig7bjxyOysrbilhW25dPWVbbl07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihuPTA7bjxpOysrbilhW25dPW9bbl0odCk7cmV0dXJuIGF9fToiZnVuY3Rpb24iIT10eXBlb2YgZS52YWx1ZU9mJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZ3x8aXNOYU4oZSk/ZnVuY3Rpb24odCxlKXt2YXIgbixyPXt9LGk9e307Zm9yKG4gaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV8fChlPXt9KSxlKW4gaW4gdD9yW25dPWhuKHRbbl0sZVtuXSk6aVtuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3IobiBpbiByKWlbbl09cltuXSh0KTtyZXR1cm4gaX19OnVuKSh0LGUpfSxkbj1mdW5jdGlvbih0LGUpe3JldHVybiBlLT10PSt0LGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnJvdW5kKHQrZSpuKX19LHBuPTE4MC9NYXRoLlBJLG1uPXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9LHluPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXt2YXIgYSxzLHU7cmV0dXJuKGE9TWF0aC5zcXJ0KHQqdCtlKmUpKSYmKHQvPWEsZS89YSksKHU9dCpuK2UqcikmJihuLT10KnUsci09ZSp1KSwocz1NYXRoLnNxcnQobipuK3IqcikpJiYobi89cyxyLz1zLHUvPXMpLHQqcjxlKm4mJih0PS10LGU9LWUsdT0tdSxhPS1hKSx7dHJhbnNsYXRlWDppLHRyYW5zbGF0ZVk6byxyb3RhdGU6TWF0aC5hdGFuMihlLHQpKnBuLHNrZXdYOk1hdGguYXRhbih1KSpwbixzY2FsZVg6YSxzY2FsZVk6c319O2Z1bmN0aW9uIGduKHQsZSxuLHIpe2Z1bmN0aW9uIGkodCl7cmV0dXJuIHQubGVuZ3RoP3QucG9wKCkrIiAiOiIifXJldHVybiBmdW5jdGlvbihvLGEpe3ZhciBzPVtdLHU9W107cmV0dXJuIG89dChvKSxhPXQoYSksZnVuY3Rpb24odCxyLGksbyxhLHMpe2lmKHQhPT1pfHxyIT09byl7dmFyIHU9YS5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLGUsbnVsbCxuKTtzLnB1c2goe2k6dS00LHg6dW4odCxpKX0se2k6dS0yLHg6dW4ocixvKX0pfWVsc2UoaXx8bykmJmEucHVzaCgidHJhbnNsYXRlKCIraStlK28rbil9KG8udHJhbnNsYXRlWCxvLnRyYW5zbGF0ZVksYS50cmFuc2xhdGVYLGEudHJhbnNsYXRlWSxzLHUpLGZ1bmN0aW9uKHQsZSxuLG8pe3QhPT1lPyh0LWU+MTgwP2UrPTM2MDplLXQ+MTgwJiYodCs9MzYwKSxvLnB1c2goe2k6bi5wdXNoKGkobikrInJvdGF0ZSgiLG51bGwsciktMix4OnVuKHQsZSl9KSk6ZSYmbi5wdXNoKGkobikrInJvdGF0ZSgiK2Urcil9KG8ucm90YXRlLGEucm90YXRlLHMsdSksZnVuY3Rpb24odCxlLG4sbyl7dCE9PWU/by5wdXNoKHtpOm4ucHVzaChpKG4pKyJza2V3WCgiLG51bGwsciktMix4OnVuKHQsZSl9KTplJiZuLnB1c2goaShuKSsic2tld1goIitlK3IpfShvLnNrZXdYLGEuc2tld1gscyx1KSxmdW5jdGlvbih0LGUsbixyLG8sYSl7aWYodCE9PW58fGUhPT1yKXt2YXIgcz1vLnB1c2goaShvKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIik7YS5wdXNoKHtpOnMtNCx4OnVuKHQsbil9LHtpOnMtMix4OnVuKGUscil9KX1lbHNlIDE9PT1uJiYxPT09cnx8by5wdXNoKGkobykrInNjYWxlKCIrbisiLCIrcisiKSIpfShvLnNjYWxlWCxvLnNjYWxlWSxhLnNjYWxlWCxhLnNjYWxlWSxzLHUpLG89YT1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPS0xLHI9dS5sZW5ndGg7KytuPHI7KXNbKGU9dVtuXSkuaV09ZS54KHQpO3JldHVybiBzLmpvaW4oIiIpfX19dmFyIHZuPWduKGZ1bmN0aW9uKHQpe3JldHVybiJub25lIj09PXQ/bW46KG5ufHwobm49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIikscm49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG9uPWRvY3VtZW50LmRlZmF1bHRWaWV3KSxubi5zdHlsZS50cmFuc2Zvcm09dCx0PW9uLmdldENvbXB1dGVkU3R5bGUocm4uYXBwZW5kQ2hpbGQobm4pLG51bGwpLmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpLHJuLnJlbW92ZUNoaWxkKG5uKSx0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSx5bigrdFswXSwrdFsxXSwrdFsyXSwrdFszXSwrdFs0XSwrdFs1XSkpfSwicHgsICIsInB4KSIsImRlZykiKSxibj1nbihmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9tbjooYW58fChhbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKSxhbi5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsdCksKHQ9YW4udHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSk/eW4oKHQ9dC5tYXRyaXgpLmEsdC5iLHQuYyx0LmQsdC5lLHQuZik6bW4pfSwiLCAiLCIpIiwiKSIpO2Z1bmN0aW9uIF9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciByPXQoKGU9d2UoZSkpLmgsKG49d2UobikpLmgpLGk9SmUoZS5zLG4ucyksbz1KZShlLmwsbi5sKSxhPUplKGUub3BhY2l0eSxuLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5oPXIodCksZS5zPWkodCksZS5sPW8odCksZS5vcGFjaXR5PWEodCksZSsiIn19fWZ1bmN0aW9uIHduKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciByPXQoKGU9VmUoZSkpLmgsKG49VmUobikpLmgpLGk9SmUoZS5jLG4uYyksbz1KZShlLmwsbi5sKSxhPUplKGUub3BhY2l0eSxuLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5oPXIodCksZS5jPWkodCksZS5sPW8odCksZS5vcGFjaXR5PWEodCksZSsiIn19fWZ1bmN0aW9uIHhuKHQpe3JldHVybiBmdW5jdGlvbiBlKG4pe2Z1bmN0aW9uIHIoZSxyKXt2YXIgaT10KChlPUdlKGUpKS5oLChyPUdlKHIpKS5oKSxvPUplKGUucyxyLnMpLGE9SmUoZS5sLHIubCkscz1KZShlLm9wYWNpdHksci5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuaD1pKHQpLGUucz1vKHQpLGUubD1hKE1hdGgucG93KHQsbikpLGUub3BhY2l0eT1zKHQpLGUrIiJ9fXJldHVybiBuPStuLHIuZ2FtbWE9ZSxyfSgxKX1NYXRoLF9uKCRlKSxfbihKZSksd24oJGUpLHduKEplKSx4bigkZSk7dmFyIE9uLENuLFNuPXhuKEplKSxFbj0wLGtuPTAsVG49MCxJbj0xZTMsQW49MCxqbj0wLFBuPTAsTW49Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUsTm49Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6ZnVuY3Rpb24odCl7c2V0VGltZW91dCh0LDE3KX07ZnVuY3Rpb24gUm4oKXtyZXR1cm4gam58fChObihEbiksam49TW4ubm93KCkrUG4pfWZ1bmN0aW9uIERuKCl7am49MH1mdW5jdGlvbiBMbigpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24gRm4odCxlLG4pe3ZhciByPW5ldyBMbjtyZXR1cm4gci5yZXN0YXJ0KHQsZSxuKSxyfWZ1bmN0aW9uIFZuKCl7am49KEFuPU1uLm5vdygpKStQbixFbj1rbj0wO3RyeXshZnVuY3Rpb24oKXtSbigpLCsrRW47Zm9yKHZhciB0LGU9T247ZTspKHQ9am4tZS5fdGltZSk+PTAmJmUuX2NhbGwuY2FsbChudWxsLHQpLGU9ZS5fbmV4dDstLUVufSgpfWZpbmFsbHl7RW49MCxmdW5jdGlvbigpe2Zvcih2YXIgdCxlLG49T24scj0xLzA7bjspbi5fY2FsbD8ocj5uLl90aW1lJiYocj1uLl90aW1lKSx0PW4sbj1uLl9uZXh0KTooZT1uLl9uZXh0LG4uX25leHQ9bnVsbCxuPXQ/dC5fbmV4dD1lOk9uPWUpO0NuPXQsem4ocil9KCksam49MH19ZnVuY3Rpb24gVW4oKXt2YXIgdD1Nbi5ub3coKSxlPXQtQW47ZT5JbiYmKFBuLT1lLEFuPXQpfWZ1bmN0aW9uIHpuKHQpe0VufHwoa24mJihrbj1jbGVhclRpbWVvdXQoa24pKSx0LWpuPjI0Pyh0PDEvMCYmKGtuPXNldFRpbWVvdXQoVm4sdC1Nbi5ub3coKS1QbikpLFRuJiYoVG49Y2xlYXJJbnRlcnZhbChUbikpKTooVG58fChBbj1Nbi5ub3coKSxUbj1zZXRJbnRlcnZhbChVbixJbikpLEVuPTEsTm4oVm4pKSl9TG4ucHJvdG90eXBlPUZuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TG4scmVzdGFydDpmdW5jdGlvbih0LGUsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTtuPShudWxsPT1uP1JuKCk6K24pKyhudWxsPT1lPzA6K2UpLHRoaXMuX25leHR8fENuPT09dGhpc3x8KENuP0NuLl9uZXh0PXRoaXM6T249dGhpcyxDbj10aGlzKSx0aGlzLl9jYWxsPXQsdGhpcy5fdGltZT1uLHpuKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLHpuKCkpfX07dmFyIEJuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgTG47cmV0dXJuIHIucmVzdGFydChmdW5jdGlvbihuKXtyLnN0b3AoKSx0KG4rZSl9LGU9bnVsbD09ZT8wOitlLG4pLHJ9LEhuPWl0KCJzdGFydCIsImVuZCIsImludGVycnVwdCIpLFduPVtdLHFuPTAsWW49MSxHbj0yLFFuPTMsS249NCxabj01LFhuPTYsJG49ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBhPXQuX190cmFuc2l0aW9uO2lmKGEpe2lmKG4gaW4gYSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTshZnVuY3Rpb24odCxlLG4pe3ZhciByLGk9dC5fX3RyYW5zaXRpb247ZnVuY3Rpb24gbyh1KXt2YXIgbCxjLGYsaDtpZihuLnN0YXRlIT09WW4pcmV0dXJuIHMoKTtmb3IobCBpbiBpKWlmKChoPWlbbF0pLm5hbWU9PT1uLm5hbWUpe2lmKGguc3RhdGU9PT1RbilyZXR1cm4gQm4obyk7aC5zdGF0ZT09PUtuPyhoLnN0YXRlPVhuLGgudGltZXIuc3RvcCgpLGgub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18saC5pbmRleCxoLmdyb3VwKSxkZWxldGUgaVtsXSk6K2w8ZSYmKGguc3RhdGU9WG4saC50aW1lci5zdG9wKCksZGVsZXRlIGlbbF0pfWlmKEJuKGZ1bmN0aW9uKCl7bi5zdGF0ZT09PVFuJiYobi5zdGF0ZT1LbixuLnRpbWVyLnJlc3RhcnQoYSxuLmRlbGF5LG4udGltZSksYSh1KSl9KSxuLnN0YXRlPUduLG4ub24uY2FsbCgic3RhcnQiLHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApLG4uc3RhdGU9PT1Hbil7Zm9yKG4uc3RhdGU9UW4scj1uZXcgQXJyYXkoZj1uLnR3ZWVuLmxlbmd0aCksbD0wLGM9LTE7bDxmOysrbCkoaD1uLnR3ZWVuW2xdLnZhbHVlLmNhbGwodCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCkpJiYoclsrK2NdPWgpO3IubGVuZ3RoPWMrMX19ZnVuY3Rpb24gYShlKXtmb3IodmFyIGk9ZTxuLmR1cmF0aW9uP24uZWFzZS5jYWxsKG51bGwsZS9uLmR1cmF0aW9uKToobi50aW1lci5yZXN0YXJ0KHMpLG4uc3RhdGU9Wm4sMSksbz0tMSxhPXIubGVuZ3RoOysrbzxhOylyW29dLmNhbGwobnVsbCxpKTtuLnN0YXRlPT09Wm4mJihuLm9uLmNhbGwoImVuZCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCkscygpKX1mdW5jdGlvbiBzKCl7Zm9yKHZhciByIGluIG4uc3RhdGU9WG4sbi50aW1lci5zdG9wKCksZGVsZXRlIGlbZV0saSlyZXR1cm47ZGVsZXRlIHQuX190cmFuc2l0aW9ufWlbZV09bixuLnRpbWVyPUZuKGZ1bmN0aW9uKHQpe24uc3RhdGU9WW4sbi50aW1lci5yZXN0YXJ0KG8sbi5kZWxheSxuLnRpbWUpLG4uZGVsYXk8PXQmJm8odC1uLmRlbGF5KX0sMCxuLnRpbWUpfSh0LG4se25hbWU6ZSxpbmRleDpyLGdyb3VwOmksb246SG4sdHdlZW46V24sdGltZTpvLnRpbWUsZGVsYXk6by5kZWxheSxkdXJhdGlvbjpvLmR1cmF0aW9uLGVhc2U6by5lYXNlLHRpbWVyOm51bGwsc3RhdGU6cW59KX07ZnVuY3Rpb24gSm4odCxlKXt2YXIgbj1lcih0LGUpO2lmKG4uc3RhdGU+cW4pdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTtyZXR1cm4gbn1mdW5jdGlvbiB0cih0LGUpe3ZhciBuPWVyKHQsZSk7aWYobi5zdGF0ZT5Hbil0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTtyZXR1cm4gbn1mdW5jdGlvbiBlcih0LGUpe3ZhciBuPXQuX190cmFuc2l0aW9uO2lmKCFufHwhKG49bltlXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBufWZ1bmN0aW9uIG5yKHQsZSxuKXt2YXIgcj10Ll9pZDtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dHIodGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtlXT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGZ1bmN0aW9uKHQpe3JldHVybiBlcih0LHIpLnZhbHVlW2VdfX12YXIgcnI9ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4oIm51bWJlciI9PXR5cGVvZiBlP3VuOmUgaW5zdGFuY2VvZiBkZT90bjoobj1kZShlKSk/KGU9bix0bik6Zm4pKHQsZSl9LGlyPVF0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcixvcj0wO2Z1bmN0aW9uIGFyKHQsZSxuLHIpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZSx0aGlzLl9uYW1lPW4sdGhpcy5faWQ9cn1mdW5jdGlvbiBzcigpe3JldHVybisrb3J9dmFyIHVyPVF0LnByb3RvdHlwZTtmdW5jdGlvbiBscih0KXtyZXR1cm4rdH1hci5wcm90b3R5cGU9KGZ1bmN0aW9uKHQpe3JldHVybiBRdCgpLnRyYW5zaXRpb24odCl9KS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmFyLHNlbGVjdDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9uYW1lLG49dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWN0KHQpKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz1uZXcgQXJyYXkoaSksYT0wO2E8aTsrK2EpZm9yKHZhciBzLHUsbD1yW2FdLGM9bC5sZW5ndGgsZj1vW2FdPW5ldyBBcnJheShjKSxoPTA7aDxjOysraCkocz1sW2hdKSYmKHU9dC5jYWxsKHMscy5fX2RhdGFfXyxoLGwpKSYmKCJfX2RhdGFfXyJpbiBzJiYodS5fX2RhdGFfXz1zLl9fZGF0YV9fKSxmW2hdPXUsJG4oZltoXSxlLG4saCxmLGVyKHMsbikpKTtyZXR1cm4gbmV3IGFyKG8sdGhpcy5fcGFyZW50cyxlLG4pfSxzZWxlY3RBbGw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbmFtZSxuPXRoaXMuX2lkOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1odCh0KSk7Zm9yKHZhciByPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89W10sYT1bXSxzPTA7czxpOysrcylmb3IodmFyIHUsbD1yW3NdLGM9bC5sZW5ndGgsZj0wO2Y8YzsrK2YpaWYodT1sW2ZdKXtmb3IodmFyIGgsZD10LmNhbGwodSx1Ll9fZGF0YV9fLGYsbCkscD1lcih1LG4pLG09MCx5PWQubGVuZ3RoO208eTsrK20pKGg9ZFttXSkmJiRuKGgsZSxuLG0sZCxwKTtvLnB1c2goZCksYS5wdXNoKHUpfXJldHVybiBuZXcgYXIobyxhLGUsbil9LGZpbHRlcjpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9eXQodCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxyPW5ldyBBcnJheShuKSxpPTA7aTxuOysraSlmb3IodmFyIG8sYT1lW2ldLHM9YS5sZW5ndGgsdT1yW2ldPVtdLGw9MDtsPHM7KytsKShvPWFbbF0pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLGwsYSkmJnUucHVzaChvKTtyZXR1cm4gbmV3IGFyKHIsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sbWVyZ2U6ZnVuY3Rpb24odCl7aWYodC5faWQhPT10aGlzLl9pZCl0aHJvdyBuZXcgRXJyb3I7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPXQuX2dyb3VwcyxyPWUubGVuZ3RoLGk9TWF0aC5taW4ocixuLmxlbmd0aCksbz1uZXcgQXJyYXkociksYT0wO2E8aTsrK2EpZm9yKHZhciBzLHU9ZVthXSxsPW5bYV0sYz11Lmxlbmd0aCxmPW9bYV09bmV3IEFycmF5KGMpLGg9MDtoPGM7KytoKShzPXVbaF18fGxbaF0pJiYoZltoXT1zKTtmb3IoO2E8cjsrK2Epb1thXT1lW2FdO3JldHVybiBuZXcgYXIobyx0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxzZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGlyKHRoaXMuX2dyb3Vwcyx0aGlzLl9wYXJlbnRzKX0sdHJhbnNpdGlvbjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9uYW1lLGU9dGhpcy5faWQsbj1zcigpLHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHM9cltvXSx1PXMubGVuZ3RoLGw9MDtsPHU7KytsKWlmKGE9c1tsXSl7dmFyIGM9ZXIoYSxlKTskbihhLHQsbixsLHMse3RpbWU6Yy50aW1lK2MuZGVsYXkrYy5kdXJhdGlvbixkZWxheTowLGR1cmF0aW9uOmMuZHVyYXRpb24sZWFzZTpjLmVhc2V9KX1yZXR1cm4gbmV3IGFyKHIsdGhpcy5fcGFyZW50cyx0LG4pfSxjYWxsOnVyLmNhbGwsbm9kZXM6dXIubm9kZXMsbm9kZTp1ci5ub2RlLHNpemU6dXIuc2l6ZSxlbXB0eTp1ci5lbXB0eSxlYWNoOnVyLmVhY2gsb246ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP2VyKHRoaXMubm9kZSgpLG4pLm9uLm9uKHQpOnRoaXMuZWFjaChmdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvPWZ1bmN0aW9uKHQpe3JldHVybih0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24odCl7dmFyIGU9dC5pbmRleE9mKCIuIik7cmV0dXJuIGU+PTAmJih0PXQuc2xpY2UoMCxlKSksIXR8fCJzdGFydCI9PT10fSl9KGUpP0puOnRyO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPW8odGhpcyx0KSxzPWEub247cyE9PXImJihpPShyPXMpLmNvcHkoKSkub24oZSxuKSxhLm9uPWl9fShuLHQsZSkpfSxhdHRyOmZ1bmN0aW9uKHQsZSl7dmFyIG49c3QodCkscj0idHJhbnNmb3JtIj09PW4/Ym46cnI7cmV0dXJuIHRoaXMuYXR0clR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIGU/KG4ubG9jYWw/ZnVuY3Rpb24odCxlLG4pe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSxzPW4odGhpcyk7aWYobnVsbCE9cylyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCkpPT09cz9udWxsOmE9PT1yJiZzPT09aT9vOm89ZShyPWEsaT1zKTt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvO3JldHVybiBmdW5jdGlvbigpe3ZhciBhLHM9bih0aGlzKTtpZihudWxsIT1zKXJldHVybihhPXRoaXMuZ2V0QXR0cmlidXRlKHQpKT09PXM/bnVsbDphPT09ciYmcz09PWk/bzpvPWUocj1hLGk9cyk7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fSkobixyLG5yKHRoaXMsImF0dHIuIit0LGUpKTpudWxsPT1lPyhuLmxvY2FsP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX0pKG4pOihuLmxvY2FsP2Z1bmN0aW9uKHQsZSxuKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTtyZXR1cm4gbz09PW4/bnVsbDpvPT09cj9pOmk9ZShyPW8sbil9fTpmdW5jdGlvbih0LGUsbil7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZSh0KTtyZXR1cm4gbz09PW4/bnVsbDpvPT09cj9pOmk9ZShyPW8sbil9fSkobixyLGUrIiIpKX0sYXR0clR3ZWVuOmZ1bmN0aW9uKHQsZSl7dmFyIG49ImF0dHIuIit0O2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4obj10aGlzLnR3ZWVuKG4pKSYmbi5fdmFsdWU7aWYobnVsbD09ZSlyZXR1cm4gdGhpcy50d2VlbihuLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjt2YXIgcj1zdCh0KTtyZXR1cm4gdGhpcy50d2VlbihuLChyLmxvY2FsP2Z1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3ZhciBuPXRoaXMscj1lLmFwcGx5KG4sYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24oZSl7bi5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwscihlKSl9fXJldHVybiBuLl92YWx1ZT1lLG59OmZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3ZhciBuPXRoaXMscj1lLmFwcGx5KG4sYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24oZSl7bi5zZXRBdHRyaWJ1dGUodCxyKGUpKX19cmV0dXJuIG4uX3ZhbHVlPWUsbn0pKHIsZSkpfSxzdHlsZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9InRyYW5zZm9ybSI9PSh0Kz0iIik/dm46cnI7cmV0dXJuIG51bGw9PWU/dGhpcy5zdHlsZVR3ZWVuKHQsZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89Q3QodGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLEN0KHRoaXMsdCkpO3JldHVybiBvPT09YT9udWxsOm89PT1uJiZhPT09cj9pOmk9ZShuPW8scj1hKX19KHQscikpLm9uKCJlbmQuc3R5bGUuIit0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fSh0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLG4pe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1DdCh0aGlzLHQpLHM9bih0aGlzKTtyZXR1cm4gbnVsbD09cyYmKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCkscz1DdCh0aGlzLHQpKSxhPT09cz9udWxsOmE9PT1yJiZzPT09aT9vOm89ZShyPWEsaT1zKX19KHQscixucih0aGlzLCJzdHlsZS4iK3QsZSkpOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPUN0KHRoaXMsdCk7cmV0dXJuIG89PT1uP251bGw6bz09PXI/aTppPWUocj1vLG4pfX0odCxyLGUrIiIpLG4pfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09ZSlyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLGZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiByKCl7dmFyIHI9dGhpcyxpPWUuYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbihlKXtyLnN0eWxlLnNldFByb3BlcnR5KHQsaShlKSxuKX19cmV0dXJuIHIuX3ZhbHVlPWUscn0odCxlLG51bGw9PW4/IiI6bikpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09ZT8iIjplfX0obnIodGhpcywidGV4dCIsdCkpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KG51bGw9PXQ/IiI6dCsiIikpfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsKHQ9dGhpcy5faWQsZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBuIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtuIT09dClyZXR1cm47ZSYmZS5yZW1vdmVDaGlsZCh0aGlzKX0pKTt2YXIgdH0sdHdlZW46ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcixpPWVyKHRoaXMubm9kZSgpLG4pLnR3ZWVuLG89MCxhPWkubGVuZ3RoO288YTsrK28paWYoKHI9aVtvXSkubmFtZT09PXQpcmV0dXJuIHIudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09ZT9mdW5jdGlvbih0LGUpe3ZhciBuLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9dHIodGhpcyx0KSxvPWkudHdlZW47aWYobyE9PW4pZm9yKHZhciBhPTAscz0ocj1uPW8pLmxlbmd0aDthPHM7KythKWlmKHJbYV0ubmFtZT09PWUpeyhyPXIuc2xpY2UoKSkuc3BsaWNlKGEsMSk7YnJlYWt9aS50d2Vlbj1yfX06ZnVuY3Rpb24odCxlLG4pe3ZhciByLGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXRyKHRoaXMsdCksYT1vLnR3ZWVuO2lmKGEhPT1yKXtpPShyPWEpLnNsaWNlKCk7Zm9yKHZhciBzPXtuYW1lOmUsdmFsdWU6bn0sdT0wLGw9aS5sZW5ndGg7dTxsOysrdSlpZihpW3VdLm5hbWU9PT1lKXtpW3VdPXM7YnJlYWt9dT09PWwmJmkucHVzaChzKX1vLnR3ZWVuPWl9fSkobix0LGUpKX0sZGVsYXk6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbigpe0puKHRoaXMsdCkuZGVsYXk9K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT0rZSxmdW5jdGlvbigpe0puKHRoaXMsdCkuZGVsYXk9ZX19KShlLHQpKTplcih0aGlzLm5vZGUoKSxlKS5kZWxheX0sZHVyYXRpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbigpe3RyKHRoaXMsdCkuZHVyYXRpb249K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT0rZSxmdW5jdGlvbigpe3RyKHRoaXMsdCkuZHVyYXRpb249ZX19KShlLHQpKTplcih0aGlzLm5vZGUoKSxlKS5kdXJhdGlvbn0sZWFzZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dHIodGhpcyx0KS5lYXNlPWV9fShlLHQpKTplcih0aGlzLm5vZGUoKSxlKS5lYXNlfX0sZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBNYXRoLnBvdyh0LGUpfXJldHVybiBlPStlLG4uZXhwb25lbnQ9dCxufSgzKSxmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIDEtTWF0aC5wb3coMS10LGUpfXJldHVybiBlPStlLG4uZXhwb25lbnQ9dCxufSgzKSxmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdyh0LGUpOjItTWF0aC5wb3coMi10LGUpKS8yfXJldHVybiBlPStlLG4uZXhwb25lbnQ9dCxufSgzKSxNYXRoLGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdCp0KigoZSsxKSp0LWUpfXJldHVybiBlPStlLG4ub3ZlcnNob290PXQsbn0oMS43MDE1OCksZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybi0tdCp0KigoZSsxKSp0K2UpKzF9cmV0dXJuIGU9K2Usbi5vdmVyc2hvb3Q9dCxufSgxLjcwMTU4KSxmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKCh0Kj0yKTwxP3QqdCooKGUrMSkqdC1lKToodC09MikqdCooKGUrMSkqdCtlKSsyKS8yfXJldHVybiBlPStlLG4ub3ZlcnNob290PXQsbn0oMS43MDE1OCk7dmFyIGNyPTIqTWF0aC5QSSxmcj0oZnVuY3Rpb24gdChlLG4pe3ZhciByPU1hdGguYXNpbigxLyhlPU1hdGgubWF4KDEsZSkpKSoobi89Y3IpO2Z1bmN0aW9uIGkodCl7cmV0dXJuIGUqTWF0aC5wb3coMiwxMCotLXQpKk1hdGguc2luKChyLXQpL24pfXJldHVybiBpLmFtcGxpdHVkZT1mdW5jdGlvbihlKXtyZXR1cm4gdChlLG4qY3IpfSxpLnBlcmlvZD1mdW5jdGlvbihuKXtyZXR1cm4gdChlLG4pfSxpfSgxLC4zKSxmdW5jdGlvbiB0KGUsbil7dmFyIHI9TWF0aC5hc2luKDEvKGU9TWF0aC5tYXgoMSxlKSkpKihuLz1jcik7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gMS1lKk1hdGgucG93KDIsLTEwKih0PSt0KSkqTWF0aC5zaW4oKHQrcikvbil9cmV0dXJuIGkuYW1wbGl0dWRlPWZ1bmN0aW9uKGUpe3JldHVybiB0KGUsbipjcil9LGkucGVyaW9kPWZ1bmN0aW9uKG4pe3JldHVybiB0KGUsbil9LGl9KDEsLjMpLGZ1bmN0aW9uIHQoZSxuKXt2YXIgcj1NYXRoLmFzaW4oMS8oZT1NYXRoLm1heCgxLGUpKSkqKG4vPWNyKTtmdW5jdGlvbiBpKHQpe3JldHVybigodD0yKnQtMSk8MD9lKk1hdGgucG93KDIsMTAqdCkqTWF0aC5zaW4oKHItdCkvbik6Mi1lKk1hdGgucG93KDIsLTEwKnQpKk1hdGguc2luKChyK3QpL24pKS8yfXJldHVybiBpLmFtcGxpdHVkZT1mdW5jdGlvbihlKXtyZXR1cm4gdChlLG4qY3IpfSxpLnBlcmlvZD1mdW5jdGlvbihuKXtyZXR1cm4gdChlLG4pfSxpfSgxLC4zKSx7dGltZTpudWxsLGRlbGF5OjAsZHVyYXRpb246MjUwLGVhc2U6ZnVuY3Rpb24odCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQqdDoodC09MikqdCp0KzIpLzJ9fSk7ZnVuY3Rpb24gaHIodCxlKXtmb3IodmFyIG47IShuPXQuX190cmFuc2l0aW9uKXx8IShuPW5bZV0pOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm4gZnIudGltZT1SbigpLGZyO3JldHVybiBufWZ1bmN0aW9uIGRyKHQpe3JldHVybnt0eXBlOnR9fVF0LnByb3RvdHlwZS5pbnRlcnJ1cHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeyFmdW5jdGlvbih0LGUpe3ZhciBuLHIsaSxvPXQuX190cmFuc2l0aW9uLGE9ITA7aWYobyl7Zm9yKGkgaW4gZT1udWxsPT1lP251bGw6ZSsiIixvKShuPW9baV0pLm5hbWU9PT1lPyhyPW4uc3RhdGU+R24mJm4uc3RhdGU8Wm4sbi5zdGF0ZT1YbixuLnRpbWVyLnN0b3AoKSxyJiZuLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCksZGVsZXRlIG9baV0pOmE9ITE7YSYmZGVsZXRlIHQuX190cmFuc2l0aW9ufX0odGhpcyx0KX0pfSxRdC5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbih0KXt2YXIgZSxuO3QgaW5zdGFuY2VvZiBhcj8oZT10Ll9pZCx0PXQuX25hbWUpOihlPXNyKCksKG49ZnIpLnRpbWU9Um4oKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHM9cltvXSx1PXMubGVuZ3RoLGw9MDtsPHU7KytsKShhPXNbbF0pJiYkbihhLHQsZSxsLHMsbnx8aHIoYSxlKSk7cmV0dXJuIG5ldyBhcihyLHRoaXMuX3BhcmVudHMsdCxlKX0sWyJlIiwidyJdLm1hcChkciksWyJuIiwicyJdLm1hcChkciksWyJuIiwiZSIsInMiLCJ3IiwibnciLCJuZSIsInNlIiwic3ciXS5tYXAoZHIpLE1hdGgsTWF0aCxNYXRoLE1hdGgsQXJyYXk7dmFyIHByPU1hdGguUEksbXI9Mipwcix5cj1tci0xZS02O2Z1bmN0aW9uIGdyKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9ZnVuY3Rpb24gdnIoKXtyZXR1cm4gbmV3IGdyfWdyLnByb3RvdHlwZT12ci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmdyLG1vdmVUbzpmdW5jdGlvbih0LGUpe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rZSl9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStlKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LGUsbixyKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArZSsiLCIrKHRoaXMuX3gxPStuKSsiLCIrKHRoaXMuX3kxPStyKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LGUsbixyLGksbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK2UrIiwiKyArbisiLCIrICtyKyIsIisodGhpcy5feDE9K2kpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXRoaXMuX3gxLGE9dGhpcy5feTEscz0obj0rbiktKHQ9K3QpLHU9KHI9K3IpLShlPStlKSxsPW8tdCxjPWEtZSxmPWwqbCtjKmM7aWYoKGk9K2kpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIraSk7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPWUpO2Vsc2UgaWYoZj4xZS02KWlmKE1hdGguYWJzKGMqcy11KmwpPjFlLTYmJmkpe3ZhciBoPW4tbyxkPXItYSxwPXMqcyt1KnUsbT1oKmgrZCpkLHk9TWF0aC5zcXJ0KHApLGc9TWF0aC5zcXJ0KGYpLHY9aSpNYXRoLnRhbigocHItTWF0aC5hY29zKChwK2YtbSkvKDIqeSpnKSkpLzIpLGI9di9nLF89di95O01hdGguYWJzKGItMSk+MWUtNiYmKHRoaXMuXys9IkwiKyh0K2IqbCkrIiwiKyhlK2IqYykpLHRoaXMuXys9IkEiK2krIiwiK2krIiwwLDAsIisgKyhjKmg+bCpkKSsiLCIrKHRoaXMuX3gxPXQrXypzKSsiLCIrKHRoaXMuX3kxPWUrXyp1KX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPWUpfSxhcmM6ZnVuY3Rpb24odCxlLG4scixpLG8pe3Q9K3QsZT0rZTt2YXIgYT0obj0rbikqTWF0aC5jb3Mocikscz1uKk1hdGguc2luKHIpLHU9dCthLGw9ZStzLGM9MV5vLGY9bz9yLWk6aS1yO2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIituKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrdSsiLCIrbDooTWF0aC5hYnModGhpcy5feDEtdSk+MWUtNnx8TWF0aC5hYnModGhpcy5feTEtbCk+MWUtNikmJih0aGlzLl8rPSJMIit1KyIsIitsKSxuJiYoZjwwJiYoZj1mJW1yK21yKSxmPnlyP3RoaXMuXys9IkEiK24rIiwiK24rIiwwLDEsIitjKyIsIisodC1hKSsiLCIrKGUtcykrIkEiK24rIiwiK24rIiwwLDEsIitjKyIsIisodGhpcy5feDE9dSkrIiwiKyh0aGlzLl95MT1sKTpmPjFlLTYmJih0aGlzLl8rPSJBIituKyIsIituKyIsMCwiKyArKGY+PXByKSsiLCIrYysiLCIrKHRoaXMuX3gxPXQrbipNYXRoLmNvcyhpKSkrIiwiKyh0aGlzLl95MT1lK24qTWF0aC5zaW4oaSkpKSl9LHJlY3Q6ZnVuY3Rpb24odCxlLG4scil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStlKSsiaCIrICtuKyJ2IisgK3IrImgiKy1uKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07dmFyIGJyPXZyO2Z1bmN0aW9uIF9yKCl7fWZ1bmN0aW9uIHdyKHQsZSl7dmFyIG49bmV3IF9yO2lmKHQgaW5zdGFuY2VvZiBfcil0LmVhY2goZnVuY3Rpb24odCxlKXtuLnNldChlLHQpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgcixpPS0xLG89dC5sZW5ndGg7aWYobnVsbD09ZSlmb3IoOysraTxvOyluLnNldChpLHRbaV0pO2Vsc2UgZm9yKDsrK2k8bzspbi5zZXQoZShyPXRbaV0saSx0KSxyKX1lbHNlIGlmKHQpZm9yKHZhciBhIGluIHQpbi5zZXQoYSx0W2FdKTtyZXR1cm4gbn1mdW5jdGlvbiB4cigpe31fci5wcm90b3R5cGU9d3IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpfcixoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIiQiK3QgaW4gdGhpc30sZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyIkIit0XX0sc2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXNbIiQiK3RdPWUsdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPSIkIit0O3JldHVybiBlIGluIHRoaXMmJmRlbGV0ZSB0aGlzW2VdfSxjbGVhcjpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKSIkIj09PXRbMF0mJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpIiQiPT09ZVswXSYmdC5wdXNoKGUuc2xpY2UoMSkpO3JldHVybiB0fSx2YWx1ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcykiJCI9PT1lWzBdJiZ0LnB1c2godGhpc1tlXSk7cmV0dXJuIHR9LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcykiJCI9PT1lWzBdJiZ0LnB1c2goe2tleTplLnNsaWNlKDEpLHZhbHVlOnRoaXNbZV19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBlIGluIHRoaXMpIiQiPT09ZVswXSYmKyt0O3JldHVybiB0fSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKWlmKCIkIj09PXRbMF0pcmV0dXJuITE7cmV0dXJuITB9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMpIiQiPT09ZVswXSYmdCh0aGlzW2VdLGUuc2xpY2UoMSksdGhpcyl9fTt2YXIgT3I9d3IucHJvdG90eXBlO3hyLnByb3RvdHlwZT0oZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgeHI7aWYodCBpbnN0YW5jZW9mIHhyKXQuZWFjaChmdW5jdGlvbih0KXtuLmFkZCh0KX0pO2Vsc2UgaWYodCl7dmFyIHI9LTEsaT10Lmxlbmd0aDtpZihudWxsPT1lKWZvcig7KytyPGk7KW4uYWRkKHRbcl0pO2Vsc2UgZm9yKDsrK3I8aTspbi5hZGQoZSh0W3JdLHIsdCkpfXJldHVybiBufSkucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp4cixoYXM6T3IuaGFzLGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1siJCIrKHQrPSIiKV09dCx0aGlzfSxyZW1vdmU6T3IucmVtb3ZlLGNsZWFyOk9yLmNsZWFyLHZhbHVlczpPci5rZXlzLHNpemU6T3Iuc2l6ZSxlbXB0eTpPci5lbXB0eSxlYWNoOk9yLmVhY2h9LEFycmF5O3ZhciBDcj17fSxTcj17fSxFcj0zNCxrcj0xMCxUcj0xMztmdW5jdGlvbiBJcih0KXtyZXR1cm4gbmV3IEZ1bmN0aW9uKCJkIiwicmV0dXJuIHsiK3QubWFwKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpKyI6IGRbIitlKyJdIn0pLmpvaW4oIiwiKSsifSIpfXZhciBBcj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgUmVnRXhwKCdbIicrdCsiXG5ccl0iKSxuPXQuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiByKHQsZSl7dmFyIHIsaT1bXSxvPXQubGVuZ3RoLGE9MCxzPTAsdT1vPD0wLGw9ITE7ZnVuY3Rpb24gYygpe2lmKHUpcmV0dXJuIFNyO2lmKGwpcmV0dXJuIGw9ITEsQ3I7dmFyIGUscixpPWE7aWYodC5jaGFyQ29kZUF0KGkpPT09RXIpe2Zvcig7YSsrPG8mJnQuY2hhckNvZGVBdChhKSE9PUVyfHx0LmNoYXJDb2RlQXQoKythKT09PUVyOyk7cmV0dXJuKGU9YSk+PW8/dT0hMDoocj10LmNoYXJDb2RlQXQoYSsrKSk9PT1rcj9sPSEwOnI9PT1UciYmKGw9ITAsdC5jaGFyQ29kZUF0KGEpPT09a3ImJisrYSksdC5zbGljZShpKzEsZS0xKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDthPG87KXtpZigocj10LmNoYXJDb2RlQXQoZT1hKyspKT09PWtyKWw9ITA7ZWxzZSBpZihyPT09VHIpbD0hMCx0LmNoYXJDb2RlQXQoYSk9PT1rciYmKythO2Vsc2UgaWYociE9PW4pY29udGludWU7cmV0dXJuIHQuc2xpY2UoaSxlKX1yZXR1cm4gdT0hMCx0LnNsaWNlKGksbyl9Zm9yKHQuY2hhckNvZGVBdChvLTEpPT09a3ImJi0tbyx0LmNoYXJDb2RlQXQoby0xKT09PVRyJiYtLW87KHI9YygpKSE9PVNyOyl7Zm9yKHZhciBmPVtdO3IhPT1DciYmciE9PVNyOylmLnB1c2gocikscj1jKCk7ZSYmbnVsbD09KGY9ZShmLHMrKykpfHxpLnB1c2goZil9cmV0dXJuIGl9ZnVuY3Rpb24gaShlKXtyZXR1cm4gZS5tYXAobykuam9pbih0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsPT10PyIiOmUudGVzdCh0Kz0iIik/JyInK3QucmVwbGFjZSgvIi9nLCciIicpKyciJzp0fXJldHVybntwYXJzZTpmdW5jdGlvbih0LGUpe3ZhciBuLGksbz1yKHQsZnVuY3Rpb24odCxyKXtpZihuKXJldHVybiBuKHQsci0xKTtpPXQsbj1lP2Z1bmN0aW9uKHQsZSl7dmFyIG49SXIodCk7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7cmV0dXJuIGUobihyKSxpLHQpfX0odCxlKTpJcih0KX0pO3JldHVybiBvLmNvbHVtbnM9aXx8W10sb30scGFyc2VSb3dzOnIsZm9ybWF0OmZ1bmN0aW9uKGUsbil7cmV0dXJuIG51bGw9PW4mJihuPWZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdC5jcmVhdGUobnVsbCksbj1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gZXx8bi5wdXNoKGVbcl09cil9KSxufShlKSksW24ubWFwKG8pLmpvaW4odCldLmNvbmNhdChlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gbi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG8oZVt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGkpLmpvaW4oIlxuIil9fX0sanI9QXIoIiwiKS5wYXJzZSxQcj1BcigiXHQiKS5wYXJzZTtmdW5jdGlvbiBNcih0KXtpZighdC5vayl0aHJvdyBuZXcgRXJyb3IodC5zdGF0dXMrIiAiK3Quc3RhdHVzVGV4dCk7cmV0dXJuIHQudGV4dCgpfXZhciBOcj1mdW5jdGlvbih0LGUpe3JldHVybiBmZXRjaCh0LGUpLnRoZW4oTXIpfTtmdW5jdGlvbiBScih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3JldHVybiAyPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIG4mJihyPW4sbj12b2lkIDApLE5yKGUsbikudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gdChlLHIpfSl9fWZ1bmN0aW9uIERyKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiBOcihlLG4pLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuKG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhlLHQpfSl9fVJyKGpyKSxScihQciksRHIoImFwcGxpY2F0aW9uL3htbCIpLERyKCJ0ZXh0L2h0bWwiKTt2YXIgTHI9RHIoImltYWdlL3N2Zyt4bWwiKTtmdW5jdGlvbiBGcih0LGUsbixyKXtpZihpc05hTihlKXx8aXNOYU4obikpcmV0dXJuIHQ7dmFyIGksbyxhLHMsdSxsLGMsZixoLGQ9dC5fcm9vdCxwPXtkYXRhOnJ9LG09dC5feDAseT10Ll95MCxnPXQuX3gxLHY9dC5feTE7aWYoIWQpcmV0dXJuIHQuX3Jvb3Q9cCx0O2Zvcig7ZC5sZW5ndGg7KWlmKChsPWU+PShvPShtK2cpLzIpKT9tPW86Zz1vLChjPW4+PShhPSh5K3YpLzIpKT95PWE6dj1hLGk9ZCwhKGQ9ZFtmPWM8PDF8bF0pKXJldHVybiBpW2ZdPXAsdDtpZihzPSt0Ll94LmNhbGwobnVsbCxkLmRhdGEpLHU9K3QuX3kuY2FsbChudWxsLGQuZGF0YSksZT09PXMmJm49PT11KXJldHVybiBwLm5leHQ9ZCxpP2lbZl09cDp0Ll9yb290PXAsdDtkb3tpPWk/aVtmXT1uZXcgQXJyYXkoNCk6dC5fcm9vdD1uZXcgQXJyYXkoNCksKGw9ZT49KG89KG0rZykvMikpP209bzpnPW8sKGM9bj49KGE9KHkrdikvMikpP3k9YTp2PWF9d2hpbGUoKGY9Yzw8MXxsKT09KGg9KHU+PWEpPDwxfHM+PW8pKTtyZXR1cm4gaVtoXT1kLGlbZl09cCx0fXZhciBWcj1mdW5jdGlvbih0LGUsbixyLGkpe3RoaXMubm9kZT10LHRoaXMueDA9ZSx0aGlzLnkwPW4sdGhpcy54MT1yLHRoaXMueTE9aX07ZnVuY3Rpb24gVXIodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24genIodCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gQnIodCxlLG4scixpLG8pe3RoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5feDA9bix0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiBIcih0KXtmb3IodmFyIGU9e2RhdGE6dC5kYXRhfSxuPWU7dD10Lm5leHQ7KW49bi5uZXh0PXtkYXRhOnQuZGF0YX07cmV0dXJuIGV9dmFyIFdyPShmdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IEJyKG51bGw9PWU/VXI6ZSxudWxsPT1uP3pyOm4sTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9yOnIuYWRkQWxsKHQpfSkucHJvdG90eXBlPUJyLnByb3RvdHlwZTtXci5jb3B5PWZ1bmN0aW9uKCl7dmFyIHQsZSxuPW5ldyBCcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpLHI9dGhpcy5fcm9vdDtpZighcilyZXR1cm4gbjtpZighci5sZW5ndGgpcmV0dXJuIG4uX3Jvb3Q9SHIociksbjtmb3IodD1be3NvdXJjZTpyLHRhcmdldDpuLl9yb290PW5ldyBBcnJheSg0KX1dO3I9dC5wb3AoKTspZm9yKHZhciBpPTA7aTw0OysraSkoZT1yLnNvdXJjZVtpXSkmJihlLmxlbmd0aD90LnB1c2goe3NvdXJjZTplLHRhcmdldDpyLnRhcmdldFtpXT1uZXcgQXJyYXkoNCl9KTpyLnRhcmdldFtpXT1IcihlKSk7cmV0dXJuIG59LFdyLmFkZD1mdW5jdGlvbih0KXt2YXIgZT0rdGhpcy5feC5jYWxsKG51bGwsdCksbj0rdGhpcy5feS5jYWxsKG51bGwsdCk7cmV0dXJuIEZyKHRoaXMuY292ZXIoZSxuKSxlLG4sdCl9LFdyLmFkZEFsbD1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvPXQubGVuZ3RoLGE9bmV3IEFycmF5KG8pLHM9bmV3IEFycmF5KG8pLHU9MS8wLGw9MS8wLGM9LTEvMCxmPS0xLzA7Zm9yKG49MDtuPG87KytuKWlzTmFOKHI9K3RoaXMuX3guY2FsbChudWxsLGU9dFtuXSkpfHxpc05hTihpPSt0aGlzLl95LmNhbGwobnVsbCxlKSl8fChhW25dPXIsc1tuXT1pLHI8dSYmKHU9cikscj5jJiYoYz1yKSxpPGwmJihsPWkpLGk+ZiYmKGY9aSkpO2ZvcihjPHUmJih1PXRoaXMuX3gwLGM9dGhpcy5feDEpLGY8bCYmKGw9dGhpcy5feTAsZj10aGlzLl95MSksdGhpcy5jb3Zlcih1LGwpLmNvdmVyKGMsZiksbj0wO248bzsrK24pRnIodGhpcyxhW25dLHNbbl0sdFtuXSk7cmV0dXJuIHRoaXN9LFdyLmNvdmVyPWZ1bmN0aW9uKHQsZSl7aWYoaXNOYU4odD0rdCl8fGlzTmFOKGU9K2UpKXJldHVybiB0aGlzO3ZhciBuPXRoaXMuX3gwLHI9dGhpcy5feTAsaT10aGlzLl94MSxvPXRoaXMuX3kxO2lmKGlzTmFOKG4pKWk9KG49TWF0aC5mbG9vcih0KSkrMSxvPShyPU1hdGguZmxvb3IoZSkpKzE7ZWxzZXtpZighKG4+dHx8dD5pfHxyPmV8fGU+bykpcmV0dXJuIHRoaXM7dmFyIGEscyx1PWktbixsPXRoaXMuX3Jvb3Q7c3dpdGNoKHM9KGU8KHIrbykvMik8PDF8dDwobitpKS8yKXtjYXNlIDA6ZG97KGE9bmV3IEFycmF5KDQpKVtzXT1sLGw9YX13aGlsZShvPXIrKHUqPTIpLHQ+KGk9bit1KXx8ZT5vKTticmVhaztjYXNlIDE6ZG97KGE9bmV3IEFycmF5KDQpKVtzXT1sLGw9YX13aGlsZShvPXIrKHUqPTIpLChuPWktdSk+dHx8ZT5vKTticmVhaztjYXNlIDI6ZG97KGE9bmV3IEFycmF5KDQpKVtzXT1sLGw9YX13aGlsZShyPW8tKHUqPTIpLHQ+KGk9bit1KXx8cj5lKTticmVhaztjYXNlIDM6ZG97KGE9bmV3IEFycmF5KDQpKVtzXT1sLGw9YX13aGlsZShyPW8tKHUqPTIpLChuPWktdSk+dHx8cj5lKX10aGlzLl9yb290JiZ0aGlzLl9yb290Lmxlbmd0aCYmKHRoaXMuX3Jvb3Q9bCl9cmV0dXJuIHRoaXMuX3gwPW4sdGhpcy5feTA9cix0aGlzLl94MT1pLHRoaXMuX3kxPW8sdGhpc30sV3IuZGF0YT1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLnZpc2l0KGZ1bmN0aW9uKGUpe2lmKCFlLmxlbmd0aClkb3t0LnB1c2goZS5kYXRhKX13aGlsZShlPWUubmV4dCl9KSx0fSxXci5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5jb3ZlcigrdFswXVswXSwrdFswXVsxXSkuY292ZXIoK3RbMV1bMF0sK3RbMV1bMV0pOmlzTmFOKHRoaXMuX3gwKT92b2lkIDA6W1t0aGlzLl94MCx0aGlzLl95MF0sW3RoaXMuX3gxLHRoaXMuX3kxXV19LFdyLmZpbmQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByLGksbyxhLHMsdSxsLGM9dGhpcy5feDAsZj10aGlzLl95MCxoPXRoaXMuX3gxLGQ9dGhpcy5feTEscD1bXSxtPXRoaXMuX3Jvb3Q7Zm9yKG0mJnAucHVzaChuZXcgVnIobSxjLGYsaCxkKSksbnVsbD09bj9uPTEvMDooYz10LW4sZj1lLW4saD10K24sZD1lK24sbio9bik7dT1wLnBvcCgpOylpZighKCEobT11Lm5vZGUpfHwoaT11LngwKT5ofHwobz11LnkwKT5kfHwoYT11LngxKTxjfHwocz11LnkxKTxmKSlpZihtLmxlbmd0aCl7dmFyIHk9KGkrYSkvMixnPShvK3MpLzI7cC5wdXNoKG5ldyBWcihtWzNdLHksZyxhLHMpLG5ldyBWcihtWzJdLGksZyx5LHMpLG5ldyBWcihtWzFdLHksbyxhLGcpLG5ldyBWcihtWzBdLGksbyx5LGcpKSwobD0oZT49Zyk8PDF8dD49eSkmJih1PXBbcC5sZW5ndGgtMV0scFtwLmxlbmd0aC0xXT1wW3AubGVuZ3RoLTEtbF0scFtwLmxlbmd0aC0xLWxdPXUpfWVsc2V7dmFyIHY9dC0rdGhpcy5feC5jYWxsKG51bGwsbS5kYXRhKSxiPWUtK3RoaXMuX3kuY2FsbChudWxsLG0uZGF0YSksXz12KnYrYipiO2lmKF88bil7dmFyIHc9TWF0aC5zcXJ0KG49Xyk7Yz10LXcsZj1lLXcsaD10K3csZD1lK3cscj1tLmRhdGF9fXJldHVybiByfSxXci5yZW1vdmU9ZnVuY3Rpb24odCl7aWYoaXNOYU4obz0rdGhpcy5feC5jYWxsKG51bGwsdCkpfHxpc05hTihhPSt0aGlzLl95LmNhbGwobnVsbCx0KSkpcmV0dXJuIHRoaXM7dmFyIGUsbixyLGksbyxhLHMsdSxsLGMsZixoLGQ9dGhpcy5fcm9vdCxwPXRoaXMuX3gwLG09dGhpcy5feTAseT10aGlzLl94MSxnPXRoaXMuX3kxO2lmKCFkKXJldHVybiB0aGlzO2lmKGQubGVuZ3RoKWZvcig7Oyl7aWYoKGw9bz49KHM9KHAreSkvMikpP3A9czp5PXMsKGM9YT49KHU9KG0rZykvMikpP209dTpnPXUsZT1kLCEoZD1kW2Y9Yzw8MXxsXSkpcmV0dXJuIHRoaXM7aWYoIWQubGVuZ3RoKWJyZWFrOyhlW2YrMSYzXXx8ZVtmKzImM118fGVbZiszJjNdKSYmKG49ZSxoPWYpfWZvcig7ZC5kYXRhIT09dDspaWYocj1kLCEoZD1kLm5leHQpKXJldHVybiB0aGlzO3JldHVybihpPWQubmV4dCkmJmRlbGV0ZSBkLm5leHQscj8oaT9yLm5leHQ9aTpkZWxldGUgci5uZXh0LHRoaXMpOmU/KGk/ZVtmXT1pOmRlbGV0ZSBlW2ZdLChkPWVbMF18fGVbMV18fGVbMl18fGVbM10pJiZkPT09KGVbM118fGVbMl18fGVbMV18fGVbMF0pJiYhZC5sZW5ndGgmJihuP25baF09ZDp0aGlzLl9yb290PWQpLHRoaXMpOih0aGlzLl9yb290PWksdGhpcyl9LFdyLnJlbW92ZUFsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoO2U8bjsrK2UpdGhpcy5yZW1vdmUodFtlXSk7cmV0dXJuIHRoaXN9LFdyLnJvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdH0sV3Iuc2l6ZT1mdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIHRoaXMudmlzaXQoZnVuY3Rpb24oZSl7aWYoIWUubGVuZ3RoKWRveysrdH13aGlsZShlPWUubmV4dCl9KSx0fSxXci52aXNpdD1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLGEscz1bXSx1PXRoaXMuX3Jvb3Q7Zm9yKHUmJnMucHVzaChuZXcgVnIodSx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO2U9cy5wb3AoKTspaWYoIXQodT1lLm5vZGUscj1lLngwLGk9ZS55MCxvPWUueDEsYT1lLnkxKSYmdS5sZW5ndGgpe3ZhciBsPShyK28pLzIsYz0oaSthKS8yOyhuPXVbM10pJiZzLnB1c2gobmV3IFZyKG4sbCxjLG8sYSkpLChuPXVbMl0pJiZzLnB1c2gobmV3IFZyKG4scixjLGwsYSkpLChuPXVbMV0pJiZzLnB1c2gobmV3IFZyKG4sbCxpLG8sYykpLChuPXVbMF0pJiZzLnB1c2gobmV3IFZyKG4scixpLGwsYykpfXJldHVybiB0aGlzfSxXci52aXNpdEFmdGVyPWZ1bmN0aW9uKHQpe3ZhciBlLG49W10scj1bXTtmb3IodGhpcy5fcm9vdCYmbi5wdXNoKG5ldyBWcih0aGlzLl9yb290LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7ZT1uLnBvcCgpOyl7dmFyIGk9ZS5ub2RlO2lmKGkubGVuZ3RoKXt2YXIgbyxhPWUueDAscz1lLnkwLHU9ZS54MSxsPWUueTEsYz0oYSt1KS8yLGY9KHMrbCkvMjsobz1pWzBdKSYmbi5wdXNoKG5ldyBWcihvLGEscyxjLGYpKSwobz1pWzFdKSYmbi5wdXNoKG5ldyBWcihvLGMscyx1LGYpKSwobz1pWzJdKSYmbi5wdXNoKG5ldyBWcihvLGEsZixjLGwpKSwobz1pWzNdKSYmbi5wdXNoKG5ldyBWcihvLGMsZix1LGwpKX1yLnB1c2goZSl9Zm9yKDtlPXIucG9wKCk7KXQoZS5ub2RlLGUueDAsZS55MCxlLngxLGUueTEpO3JldHVybiB0aGlzfSxXci54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl94PXQsdGhpcyk6dGhpcy5feH0sV3IueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feT10LHRoaXMpOnRoaXMuX3l9LE1hdGgsTWF0aC5zcXJ0KDUpO3ZhciBxcj1mdW5jdGlvbih0LGUpe2lmKChuPSh0PWU/dC50b0V4cG9uZW50aWFsKGUtMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgbixyPXQuc2xpY2UoMCxuKTtyZXR1cm5bci5sZW5ndGg+MT9yWzBdK3Iuc2xpY2UoMik6ciwrdC5zbGljZShuKzEpXX0sWXI9ZnVuY3Rpb24odCl7cmV0dXJuKHQ9cXIoTWF0aC5hYnModCkpKT90WzFdOk5hTn0sR3I9L14oPzooLik/KFs8Pj1eXSkpPyhbK1wtXCggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pO2Z1bmN0aW9uIFFyKHQpe3JldHVybiBuZXcgS3IodCl9ZnVuY3Rpb24gS3IodCl7aWYoIShlPUdyLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIGU7dGhpcy5maWxsPWVbMV18fCIgIix0aGlzLmFsaWduPWVbMl18fCI+Iix0aGlzLnNpZ249ZVszXXx8Ii0iLHRoaXMuc3ltYm9sPWVbNF18fCIiLHRoaXMuemVybz0hIWVbNV0sdGhpcy53aWR0aD1lWzZdJiYrZVs2XSx0aGlzLmNvbW1hPSEhZVs3XSx0aGlzLnByZWNpc2lvbj1lWzhdJiYrZVs4XS5zbGljZSgxKSx0aGlzLnRyaW09ISFlWzldLHRoaXMudHlwZT1lWzEwXXx8IiJ9UXIucHJvdG90eXBlPUtyLnByb3RvdHlwZSxLci5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/IjAiOiIiKSsobnVsbD09dGhpcy53aWR0aD8iIjpNYXRoLm1heCgxLDB8dGhpcy53aWR0aCkpKyh0aGlzLmNvbW1hPyIsIjoiIikrKG51bGw9PXRoaXMucHJlY2lzaW9uPyIiOiIuIitNYXRoLm1heCgwLDB8dGhpcy5wcmVjaXNpb24pKSsodGhpcy50cmltPyJ+IjoiIikrdGhpcy50eXBlfTt2YXIgWnIsWHIsJHIsSnIsdGk9ZnVuY3Rpb24odCl7dDpmb3IodmFyIGUsbj10Lmxlbmd0aCxyPTEsaT0tMTtyPG47KytyKXN3aXRjaCh0W3JdKXtjYXNlIi4iOmk9ZT1yO2JyZWFrO2Nhc2UiMCI6MD09PWkmJihpPXIpLGU9cjticmVhaztkZWZhdWx0OmlmKGk+MCl7aWYoISt0W3JdKWJyZWFrIHQ7aT0wfX1yZXR1cm4gaT4wP3Quc2xpY2UoMCxpKSt0LnNsaWNlKGUrMSk6dH0sZWk9ZnVuY3Rpb24odCxlKXt2YXIgbj1xcih0LGUpO2lmKCFuKXJldHVybiB0KyIiO3ZhciByPW5bMF0saT1uWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfSxuaT17IiUiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuKDEwMCp0KS50b0ZpeGVkKGUpfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiB0KyIifSxkOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDEwKX0sZTpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvRXhwb25lbnRpYWwoZSl9LGY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0ZpeGVkKGUpfSxnOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9QcmVjaXNpb24oZSl9LG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoOCl9LHA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZWkoMTAwKnQsZSl9LHI6ZWksczpmdW5jdGlvbih0LGUpe3ZhciBuPXFyKHQsZSk7aWYoIW4pcmV0dXJuIHQrIiI7dmFyIHI9blswXSxpPW5bMV0sbz1pLShacj0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihpLzMpKSkpKzEsYT1yLmxlbmd0aDtyZXR1cm4gbz09PWE/cjpvPmE/cituZXcgQXJyYXkoby1hKzEpLmpvaW4oIjAiKTpvPjA/ci5zbGljZSgwLG8pKyIuIityLnNsaWNlKG8pOiIwLiIrbmV3IEFycmF5KDEtbykuam9pbigiMCIpK3FyKHQsTWF0aC5tYXgoMCxlK28tMSkpWzBdfSxYOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KX19LHJpPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxpaT1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIlx4YjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtYcj1mdW5jdGlvbih0KXt2YXIgZSxuLHI9dC5ncm91cGluZyYmdC50aG91c2FuZHM/KGU9dC5ncm91cGluZyxuPXQudGhvdXNhbmRzLGZ1bmN0aW9uKHQscil7Zm9yKHZhciBpPXQubGVuZ3RoLG89W10sYT0wLHM9ZVswXSx1PTA7aT4wJiZzPjAmJih1K3MrMT5yJiYocz1NYXRoLm1heCgxLHItdSkpLG8ucHVzaCh0LnN1YnN0cmluZyhpLT1zLGkrcykpLCEoKHUrPXMrMSk+cikpOylzPWVbYT0oYSsxKSVlLmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4obil9KTpyaSxpPXQuY3VycmVuY3ksbz10LmRlY2ltYWwsYT10Lm51bWVyYWxzP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKGUpe3JldHVybiB0WytlXX0pfX0odC5udW1lcmFscyk6cmkscz10LnBlcmNlbnR8fCIlIjtmdW5jdGlvbiB1KHQpe3ZhciBlPSh0PVFyKHQpKS5maWxsLG49dC5hbGlnbix1PXQuc2lnbixsPXQuc3ltYm9sLGM9dC56ZXJvLGY9dC53aWR0aCxoPXQuY29tbWEsZD10LnByZWNpc2lvbixwPXQudHJpbSxtPXQudHlwZTsibiI9PT1tPyhoPSEwLG09ImciKTpuaVttXXx8KG51bGw9PWQmJihkPTEyKSxwPSEwLG09ImciKSwoY3x8IjAiPT09ZSYmIj0iPT09bikmJihjPSEwLGU9IjAiLG49Ij0iKTt2YXIgeT0iJCI9PT1sP2lbMF06IiMiPT09bCYmL1tib3hYXS8udGVzdChtKT8iMCIrbS50b0xvd2VyQ2FzZSgpOiIiLGc9IiQiPT09bD9pWzFdOi9bJXBdLy50ZXN0KG0pP3M6IiIsdj1uaVttXSxiPS9bZGVmZ3BycyVdLy50ZXN0KG0pO2Z1bmN0aW9uIF8odCl7dmFyIGkscyxsLF89eSx3PWc7aWYoImMiPT09bSl3PXYodCkrdyx0PSIiO2Vsc2V7dmFyIHg9KHQ9K3QpPDA7aWYodD12KE1hdGguYWJzKHQpLGQpLHAmJih0PXRpKHQpKSx4JiYwPT0rdCYmKHg9ITEpLF89KHg/IigiPT09dT91OiItIjoiLSI9PT11fHwiKCI9PT11PyIiOnUpK18sdz0oInMiPT09bT9paVs4K1pyLzNdOiIiKSt3Kyh4JiYiKCI9PT11PyIpIjoiIiksYilmb3IoaT0tMSxzPXQubGVuZ3RoOysraTxzOylpZig0OD4obD10LmNoYXJDb2RlQXQoaSkpfHxsPjU3KXt3PSg0Nj09PWw/byt0LnNsaWNlKGkrMSk6dC5zbGljZShpKSkrdyx0PXQuc2xpY2UoMCxpKTticmVha319aCYmIWMmJih0PXIodCwxLzApKTt2YXIgTz1fLmxlbmd0aCt0Lmxlbmd0aCt3Lmxlbmd0aCxDPU88Zj9uZXcgQXJyYXkoZi1PKzEpLmpvaW4oZSk6IiI7c3dpdGNoKGgmJmMmJih0PXIoQyt0LEMubGVuZ3RoP2Ytdy5sZW5ndGg6MS8wKSxDPSIiKSxuKXtjYXNlIjwiOnQ9Xyt0K3crQzticmVhaztjYXNlIj0iOnQ9XytDK3QrdzticmVhaztjYXNlIl4iOnQ9Qy5zbGljZSgwLE89Qy5sZW5ndGg+PjEpK18rdCt3K0Muc2xpY2UoTyk7YnJlYWs7ZGVmYXVsdDp0PUMrXyt0K3d9cmV0dXJuIGEodCl9cmV0dXJuIGQ9bnVsbD09ZD82Oi9bZ3Byc10vLnRlc3QobSk/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxkKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxkKSksXy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSxffXJldHVybntmb3JtYXQ6dSxmb3JtYXRQcmVmaXg6ZnVuY3Rpb24odCxlKXt2YXIgbj11KCgodD1Rcih0KSkudHlwZT0iZiIsdCkpLHI9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoWXIoZSkvMykpKSxpPU1hdGgucG93KDEwLC1yKSxvPWlpWzgrci8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4oaSp0KStvfX19fSh7ZGVjaW1hbDoiLiIsdGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl19KSwkcj1Yci5mb3JtYXQsSnI9WHIuZm9ybWF0UHJlZml4O3ZhciBvaT1mdW5jdGlvbigpe3JldHVybiBuZXcgYWl9O2Z1bmN0aW9uIGFpKCl7dGhpcy5yZXNldCgpfWFpLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YWkscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXt1aShzaSx0LHRoaXMudCksdWkodGhpcyxzaS5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9c2kudDp0aGlzLnM9c2kudH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgc2k9bmV3IGFpO2Z1bmN0aW9uIHVpKHQsZSxuKXt2YXIgcj10LnM9ZStuLGk9ci1lO3QudD1lLShyLWkpKyhuLWkpfXZhciBsaT1NYXRoLlBJLGNpPWxpLzIsZmk9MipsaSxoaT1saS8xODAsZGk9KE1hdGgsTWF0aC5hdGFuKSxwaT1NYXRoLmF0YW4yLG1pPU1hdGguY29zLHlpPShNYXRoLE1hdGgsTWF0aCxNYXRoLE1hdGgsTWF0aC5zaW4pLGdpPShNYXRoLE1hdGguc3FydCk7ZnVuY3Rpb24gdmkodCl7cmV0dXJuIHQ+MT9jaTp0PC0xPy1jaTpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gYmkodCxlKXtyZXR1cm5bdD5saT90LWZpOnQ8LWxpP3QrZmk6dCxlXX1mdW5jdGlvbiBfaSgpe31mdW5jdGlvbiB3aSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgcj1taShlKSxpPW1pKG4pLG89dChyKmkpO3JldHVybltvKmkqeWkoZSksbyp5aShuKV19fWZ1bmN0aW9uIHhpKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciByPWdpKGUqZStuKm4pLGk9dChyKSxvPXlpKGkpLGE9bWkoaSk7cmV0dXJuW3BpKGUqbyxyKmEpLHZpKHImJm4qby9yKV19fWZ1bmN0aW9uIE9pKHQsZSl7cmV0dXJuW3QsZV19ZnVuY3Rpb24gQ2kodCl7dmFyIGU9MCxuPXQuY2hpbGRyZW4scj1uJiZuLmxlbmd0aDtpZihyKWZvcig7LS1yPj0wOyllKz1uW3JdLnZhbHVlO2Vsc2UgZT0xO3QudmFsdWU9ZX1mdW5jdGlvbiBTaSh0LGUpe3ZhciBuLHIsaSxvLGEscz1uZXcgSWkodCksdT0rdC52YWx1ZSYmKHMudmFsdWU9dC52YWx1ZSksbD1bc107Zm9yKG51bGw9PWUmJihlPUVpKTtuPWwucG9wKCk7KWlmKHUmJihuLnZhbHVlPStuLmRhdGEudmFsdWUpLChpPWUobi5kYXRhKSkmJihhPWkubGVuZ3RoKSlmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkoYSksbz1hLTE7bz49MDstLW8pbC5wdXNoKHI9bi5jaGlsZHJlbltvXT1uZXcgSWkoaVtvXSkpLHIucGFyZW50PW4sci5kZXB0aD1uLmRlcHRoKzE7cmV0dXJuIHMuZWFjaEJlZm9yZShUaSl9ZnVuY3Rpb24gRWkodCl7cmV0dXJuIHQuY2hpbGRyZW59ZnVuY3Rpb24ga2kodCl7dC5kYXRhPXQuZGF0YS5kYXRhfWZ1bmN0aW9uIFRpKHQpe3ZhciBlPTA7ZG97dC5oZWlnaHQ9ZX13aGlsZSgodD10LnBhcmVudCkmJnQuaGVpZ2h0PCsrZSl9ZnVuY3Rpb24gSWkodCl7dGhpcy5kYXRhPXQsdGhpcy5kZXB0aD10aGlzLmhlaWdodD0wLHRoaXMucGFyZW50PW51bGx9TWF0aCxvaSgpLG9pKCksb2koKSxiaS5pbnZlcnQ9Ymksb2koKSxvaSgpLG9pKCksb2koKSxvaSgpLF9pLnByb3RvdHlwZT17Y29uc3RydWN0b3I6X2kscG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLnN0cmVhbS5wb2ludCh0LGUpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX0sbWkoMzAqaGkpLHdpKGZ1bmN0aW9uKHQpe3JldHVybiBnaSgyLygxK3QpKX0pLmludmVydD14aShmdW5jdGlvbih0KXtyZXR1cm4gMip2aSh0LzIpfSksd2koZnVuY3Rpb24odCl7cmV0dXJuKHQ9KGU9dCk+MT8wOmU8LTE/bGk6TWF0aC5hY29zKGUpKSYmdC95aSh0KTt2YXIgZX0pLmludmVydD14aShmdW5jdGlvbih0KXtyZXR1cm4gdH0pLE9pLmludmVydD1PaSx4aShkaSkseGkodmkpLHhpKGZ1bmN0aW9uKHQpe3JldHVybiAyKmRpKHQpfSksSWkucHJvdG90eXBlPVNpLnByb3RvdHlwZT17Y29uc3RydWN0b3I6SWksY291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoQ2kpfSxlYWNoOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG89dGhpcyxhPVtvXTtkb3tmb3IoZT1hLnJldmVyc2UoKSxhPVtdO289ZS5wb3AoKTspaWYodChvKSxuPW8uY2hpbGRyZW4pZm9yKHI9MCxpPW4ubGVuZ3RoO3I8aTsrK3IpYS5wdXNoKG5bcl0pfXdoaWxlKGEubGVuZ3RoKTtyZXR1cm4gdGhpc30sZWFjaEFmdGVyOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuLHIsaT10aGlzLG89W2ldLGE9W107aT1vLnBvcCgpOylpZihhLnB1c2goaSksZT1pLmNoaWxkcmVuKWZvcihuPTAscj1lLmxlbmd0aDtuPHI7KytuKW8ucHVzaChlW25dKTtmb3IoO2k9YS5wb3AoKTspdChpKTtyZXR1cm4gdGhpc30sZWFjaEJlZm9yZTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyPXRoaXMsaT1bcl07cj1pLnBvcCgpOylpZih0KHIpLGU9ci5jaGlsZHJlbilmb3Iobj1lLmxlbmd0aC0xO24+PTA7LS1uKWkucHVzaChlW25dKTtyZXR1cm4gdGhpc30sc3VtOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hBZnRlcihmdW5jdGlvbihlKXtmb3IodmFyIG49K3QoZS5kYXRhKXx8MCxyPWUuY2hpbGRyZW4saT1yJiZyLmxlbmd0aDstLWk+PTA7KW4rPXJbaV0udmFsdWU7ZS52YWx1ZT1ufSl9LHNvcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaEJlZm9yZShmdW5jdGlvbihlKXtlLmNoaWxkcmVuJiZlLmNoaWxkcmVuLnNvcnQodCl9KX0scGF0aDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPWZ1bmN0aW9uKHQsZSl7aWYodD09PWUpcmV0dXJuIHQ7dmFyIG49dC5hbmNlc3RvcnMoKSxyPWUuYW5jZXN0b3JzKCksaT1udWxsO2Zvcih0PW4ucG9wKCksZT1yLnBvcCgpO3Q9PT1lOylpPXQsdD1uLnBvcCgpLGU9ci5wb3AoKTtyZXR1cm4gaX0oZSx0KSxyPVtlXTtlIT09bjspci5wdXNoKGU9ZS5wYXJlbnQpO2Zvcih2YXIgaT1yLmxlbmd0aDt0IT09bjspci5zcGxpY2UoaSwwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LGFuY2VzdG9yczpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9W3RdO3Q9dC5wYXJlbnQ7KWUucHVzaCh0KTtyZXR1cm4gZX0sZGVzY2VuZGFudHM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3QucHVzaChlKX0pLHR9LGxlYXZlczpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24oZSl7ZS5jaGlsZHJlbnx8dC5wdXNoKGUpfSksdH0sbGlua3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9W107cmV0dXJuIHQuZWFjaChmdW5jdGlvbihuKXtuIT09dCYmZS5wdXNoKHtzb3VyY2U6bi5wYXJlbnQsdGFyZ2V0Om59KX0pLGV9LGNvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gU2kodGhpcykuZWFjaEJlZm9yZShraSl9fSxBcnJheTt2YXIgQWk9ZnVuY3Rpb24odCxlLG4scixpKXtmb3IodmFyIG8sYT10LmNoaWxkcmVuLHM9LTEsdT1hLmxlbmd0aCxsPXQudmFsdWUmJihyLWUpL3QudmFsdWU7KytzPHU7KShvPWFbc10pLnkwPW4sby55MT1pLG8ueDA9ZSxvLngxPWUrPW8udmFsdWUqbH07T2JqZWN0LmNyZWF0ZShJaS5wcm90b3R5cGUpO3ZhciBqaT1mdW5jdGlvbih0LGUsbixyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4scz0tMSx1PWEubGVuZ3RoLGw9dC52YWx1ZSYmKGktbikvdC52YWx1ZTsrK3M8dTspKG89YVtzXSkueDA9ZSxvLngxPXIsby55MD1uLG8ueTE9bis9by52YWx1ZSpsfSxQaT0oMStNYXRoLnNxcnQoNSkpLzI7ZnVuY3Rpb24gTWkodCxlLG4scixpLG8pe2Zvcih2YXIgYSxzLHUsbCxjLGYsaCxkLHAsbSx5LGc9W10sdj1lLmNoaWxkcmVuLGI9MCxfPTAsdz12Lmxlbmd0aCx4PWUudmFsdWU7Yjx3Oyl7dT1pLW4sbD1vLXI7ZG97Yz12W18rK10udmFsdWV9d2hpbGUoIWMmJl88dyk7Zm9yKGY9aD1jLHk9YypjKihtPU1hdGgubWF4KGwvdSx1L2wpLyh4KnQpKSxwPU1hdGgubWF4KGgveSx5L2YpO188dzsrK18pe2lmKGMrPXM9dltfXS52YWx1ZSxzPGYmJihmPXMpLHM+aCYmKGg9cykseT1jKmMqbSwoZD1NYXRoLm1heChoL3kseS9mKSk+cCl7Yy09czticmVha31wPWR9Zy5wdXNoKGE9e3ZhbHVlOmMsZGljZTp1PGwsY2hpbGRyZW46di5zbGljZShiLF8pfSksYS5kaWNlP0FpKGEsbixyLGkseD9yKz1sKmMveDpvKTpqaShhLG4scix4P24rPXUqYy94OmksbykseC09YyxiPV99cmV0dXJuIGd9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0LG4scixpLG8pe01pKGUsdCxuLHIsaSxvKX1yZXR1cm4gbi5yYXRpbz1mdW5jdGlvbihlKXtyZXR1cm4gdCgoZT0rZSk+MT9lOjEpfSxufSkoUGkpLGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0LG4scixpLG8pe2lmKChhPXQuX3NxdWFyaWZ5KSYmYS5yYXRpbz09PWUpZm9yKHZhciBhLHMsdSxsLGMsZj0tMSxoPWEubGVuZ3RoLGQ9dC52YWx1ZTsrK2Y8aDspe2Zvcih1PShzPWFbZl0pLmNoaWxkcmVuLGw9cy52YWx1ZT0wLGM9dS5sZW5ndGg7bDxjOysrbClzLnZhbHVlKz11W2xdLnZhbHVlO3MuZGljZT9BaShzLG4scixpLHIrPShvLXIpKnMudmFsdWUvZCk6amkocyxuLHIsbis9KGktbikqcy52YWx1ZS9kLG8pLGQtPXMudmFsdWV9ZWxzZSB0Ll9zcXVhcmlmeT1hPU1pKGUsdCxuLHIsaSxvKSxhLnJhdGlvPWV9cmV0dXJuIG4ucmF0aW89ZnVuY3Rpb24oZSl7cmV0dXJuIHQoKGU9K2UpPjE/ZToxKX0sbn0oUGkpO3ZhciBOaT1mdW5jdGlvbigpe3JldHVybiBNYXRoLnJhbmRvbSgpfSxSaT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQsbil7cmV0dXJuIHQ9bnVsbD09dD8wOit0LG49bnVsbD09bj8xOituLDE9PT1hcmd1bWVudHMubGVuZ3RoPyhuPXQsdD0wKTpuLT10LGZ1bmN0aW9uKCl7cmV0dXJuIGUoKSpuK3R9fXJldHVybiBuLnNvdXJjZT10LG59KE5pKSxmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCxuKXt2YXIgcixpO3JldHVybiB0PW51bGw9PXQ/MDordCxuPW51bGw9PW4/MTorbixmdW5jdGlvbigpe3ZhciBvO2lmKG51bGwhPXIpbz1yLHI9bnVsbDtlbHNlIGRve3I9MiplKCktMSxvPTIqZSgpLTEsaT1yKnIrbypvfXdoaWxlKCFpfHxpPjEpO3JldHVybiB0K24qbypNYXRoLnNxcnQoLTIqTWF0aC5sb2coaSkvaSl9fXJldHVybiBuLnNvdXJjZT10LG59KE5pKSksRGk9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbigpe3ZhciB0PVJpLnNvdXJjZShlKS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKHQoKSl9fXJldHVybiBuLnNvdXJjZT10LG59KE5pKSxmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAscj0wO3I8dDsrK3Ipbis9ZSgpO3JldHVybiBufX1yZXR1cm4gbi5zb3VyY2U9dCxufShOaSkpLExpPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7dmFyIG49RGkuc291cmNlKGUpKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBuKCkvdH19cmV0dXJuIG4uc291cmNlPXQsbn0oTmkpLGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2coMS1lKCkpL3R9fXJldHVybiBuLnNvdXJjZT10LG59KE5pKSxBcnJheS5wcm90b3R5cGUpLEZpPUxpLm1hcCxWaT1MaS5zbGljZSxVaT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LHppPWZ1bmN0aW9uKHQpe3JldHVybit0fSxCaT1bMCwxXTtmdW5jdGlvbiBIaSh0LGUpe3JldHVybihlLT10PSt0KT9mdW5jdGlvbihuKXtyZXR1cm4obi10KS9lfTpVaShlKX1mdW5jdGlvbiBXaSh0LGUsbixyKXt2YXIgaT10WzBdLG89dFsxXSxhPWVbMF0scz1lWzFdO3JldHVybiBvPGk/KGk9bihvLGkpLGE9cihzLGEpKTooaT1uKGksbyksYT1yKGEscykpLGZ1bmN0aW9uKHQpe3JldHVybiBhKGkodCkpfX1mdW5jdGlvbiBxaSh0LGUsbixyKXt2YXIgaT1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCktMSxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShpKSxzPS0xO2Zvcih0W2ldPHRbMF0mJih0PXQuc2xpY2UoKS5yZXZlcnNlKCksZT1lLnNsaWNlKCkucmV2ZXJzZSgpKTsrK3M8aTspb1tzXT1uKHRbc10sdFtzKzFdKSxhW3NdPXIoZVtzXSxlW3MrMV0pO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1WKHQsZSwxLGkpLTE7cmV0dXJuIGFbbl0ob1tuXShlKSl9fXZhciBZaT1mdW5jdGlvbih0LGUsbil7dmFyIHIsaT10WzBdLG89dFt0Lmxlbmd0aC0xXSxhPVgoaSxvLG51bGw9PWU/MTA6ZSk7c3dpdGNoKChuPVFyKG51bGw9PW4/IixmIjpuKSkudHlwZSl7Y2FzZSJzIjp2YXIgcz1NYXRoLm1heChNYXRoLmFicyhpKSxNYXRoLmFicyhvKSk7cmV0dXJuIG51bGwhPW4ucHJlY2lzaW9ufHxpc05hTihyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoWXIoZSkvMykpKS1ZcihNYXRoLmFicyh0KSkpfShhLHMpKXx8KG4ucHJlY2lzaW9uPXIpLEpyKG4scyk7Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6bnVsbCE9bi5wcmVjaXNpb258fGlzTmFOKHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1NYXRoLmFicyh0KSxlPU1hdGguYWJzKGUpLXQsTWF0aC5tYXgoMCxZcihlKS1Zcih0KSkrMX0oYSxNYXRoLm1heChNYXRoLmFicyhpKSxNYXRoLmFicyhvKSkpKXx8KG4ucHJlY2lzaW9uPXItKCJlIj09PW4udHlwZSkpO2JyZWFrO2Nhc2UiZiI6Y2FzZSIlIjpudWxsIT1uLnByZWNpc2lvbnx8aXNOYU4ocj1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5tYXgoMCwtWXIoTWF0aC5hYnModCkpKX0oYSkpfHwobi5wcmVjaXNpb249ci0yKigiJSI9PT1uLnR5cGUpKX1yZXR1cm4gJHIobil9O2Z1bmN0aW9uIEdpKCl7dmFyIHQ9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGksbz1CaSxhPUJpLHM9aG4sdT0hMTtmdW5jdGlvbiBsKCl7cmV0dXJuIG49TWF0aC5taW4oby5sZW5ndGgsYS5sZW5ndGgpPjI/cWk6V2kscj1pPW51bGwsY31mdW5jdGlvbiBjKGUpe3JldHVybihyfHwocj1uKG8sYSx1P2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciByPXQoZT0rZSxuPStuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PWU/MDp0Pj1uPzE6cih0KX19fSh0KTp0LHMpKSkoK2UpfXJldHVybiBjLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4oaXx8KGk9bihhLG8sSGksdT9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgcj10KGU9K2Usbj0rbik7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0PD0wP2U6dD49MT9uOnIodCl9fX0oZSk6ZSkpKSgrdCl9LGMuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUZpLmNhbGwodCx6aSksbCgpKTpvLnNsaWNlKCl9LGMucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9VmkuY2FsbCh0KSxsKCkpOmEuc2xpY2UoKX0sYy5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhPVZpLmNhbGwodCkscz1kbixsKCl9LGMuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ISF0LGwoKSk6dX0sYy5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LGwoKSk6c30sbCgpfShIaSx1bik7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiBlPXQsR2koKS5kb21haW4oZS5kb21haW4oKSkucmFuZ2UoZS5yYW5nZSgpKS5pbnRlcnBvbGF0ZShlLmludGVycG9sYXRlKCkpLmNsYW1wKGUuY2xhbXAoKSk7dmFyIGV9LGZ1bmN0aW9uKHQpe3ZhciBlPXQuZG9tYWluO3JldHVybiB0LnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuPWUoKTtyZXR1cm4gSyhuWzBdLG5bbi5sZW5ndGgtMV0sbnVsbD09dD8xMDp0KX0sdC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIFlpKGUoKSx0LG4pfSx0Lm5pY2U9ZnVuY3Rpb24obil7bnVsbD09biYmKG49MTApO3ZhciByLGk9ZSgpLG89MCxhPWkubGVuZ3RoLTEscz1pW29dLHU9aVthXTtyZXR1cm4gdTxzJiYocj1zLHM9dSx1PXIscj1vLG89YSxhPXIpLChyPVoocyx1LG4pKT4wP3I9WihzPU1hdGguZmxvb3Iocy9yKSpyLHU9TWF0aC5jZWlsKHUvcikqcixuKTpyPDAmJihyPVoocz1NYXRoLmNlaWwocypyKS9yLHU9TWF0aC5mbG9vcih1KnIpL3IsbikpLHI+MD8oaVtvXT1NYXRoLmZsb29yKHMvcikqcixpW2FdPU1hdGguY2VpbCh1L3IpKnIsZShpKSk6cjwwJiYoaVtvXT1NYXRoLmNlaWwocypyKS9yLGlbYV09TWF0aC5mbG9vcih1KnIpL3IsZShpKSksdH0sdH0odCl9dmFyIFFpPW5ldyBEYXRlLEtpPW5ldyBEYXRlO2Z1bmN0aW9uIFppKHQsZSxuLHIpe2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQoZT1uZXcgRGF0ZSgrZSkpLGV9cmV0dXJuIGkuZmxvb3I9aSxpLmNlaWw9ZnVuY3Rpb24obil7cmV0dXJuIHQobj1uZXcgRGF0ZShuLTEpKSxlKG4sMSksdChuKSxufSxpLnJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBlPWkodCksbj1pLmNlaWwodCk7cmV0dXJuIHQtZTxuLXQ/ZTpufSxpLm9mZnNldD1mdW5jdGlvbih0LG4pe3JldHVybiBlKHQ9bmV3IERhdGUoK3QpLG51bGw9PW4/MTpNYXRoLmZsb29yKG4pKSx0fSxpLnJhbmdlPWZ1bmN0aW9uKG4scixvKXt2YXIgYSxzPVtdO2lmKG49aS5jZWlsKG4pLG89bnVsbD09bz8xOk1hdGguZmxvb3IobyksIShuPHImJm8+MCkpcmV0dXJuIHM7ZG97cy5wdXNoKGE9bmV3IERhdGUoK24pKSxlKG4sbyksdChuKX13aGlsZShhPG4mJm48cik7cmV0dXJuIHN9LGkuZmlsdGVyPWZ1bmN0aW9uKG4pe3JldHVybiBaaShmdW5jdGlvbihlKXtpZihlPj1lKWZvcig7dChlKSwhbihlKTspZS5zZXRUaW1lKGUtMSl9LGZ1bmN0aW9uKHQscil7aWYodD49dClpZihyPDApZm9yKDsrK3I8PTA7KWZvcig7ZSh0LC0xKSwhbih0KTspO2Vsc2UgZm9yKDstLXI+PTA7KWZvcig7ZSh0LDEpLCFuKHQpOyk7fSl9LG4mJihpLmNvdW50PWZ1bmN0aW9uKGUscil7cmV0dXJuIFFpLnNldFRpbWUoK2UpLEtpLnNldFRpbWUoK3IpLHQoUWkpLHQoS2kpLE1hdGguZmxvb3IobihRaSxLaSkpfSxpLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/aS5maWx0ZXIocj9mdW5jdGlvbihlKXtyZXR1cm4gcihlKSV0PT0wfTpmdW5jdGlvbihlKXtyZXR1cm4gaS5jb3VudCgwLGUpJXQ9PTB9KTppOm51bGx9KSxpfXZhciBYaT1aaShmdW5jdGlvbigpe30sZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrZSl9LGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pO1hpLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/WmkoZnVuY3Rpb24oZSl7ZS5zZXRUaW1lKE1hdGguZmxvb3IoZS90KSp0KX0sZnVuY3Rpb24oZSxuKXtlLnNldFRpbWUoK2Urbip0KX0sZnVuY3Rpb24oZSxuKXtyZXR1cm4obi1lKS90fSk6WGk6bnVsbH07dmFyICRpPTZlNCxKaT02MDQ4ZTUsdG89KFppKGZ1bmN0aW9uKHQpe3Quc2V0VGltZSgxZTMqTWF0aC5mbG9vcih0LzFlMykpfSxmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCsxZTMqZSl9LGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvMWUzfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENTZWNvbmRzKCl9KSxaaShmdW5jdGlvbih0KXt0LnNldFRpbWUoTWF0aC5mbG9vcih0LyRpKSokaSl9LGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqJGkpfSxmdW5jdGlvbih0LGUpe3JldHVybihlLXQpLyRpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNaW51dGVzKCl9KSxaaShmdW5jdGlvbih0KXt2YXIgZT10LmdldFRpbWV6b25lT2Zmc2V0KCkqJGklMzZlNTtlPDAmJihlKz0zNmU1KSx0LnNldFRpbWUoMzZlNSpNYXRoLmZsb29yKCgrdC1lKS8zNmU1KStlKX0sZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrMzZlNSplKX0sZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS8zNmU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRIb3VycygpfSksWmkoZnVuY3Rpb24odCl7dC5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxlKXt0LnNldERhdGUodC5nZXREYXRlKCkrZSl9LGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdC0oZS5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqJGkpLzg2NGU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXRlKCktMX0pKTtmdW5jdGlvbiBlbyh0KXtyZXR1cm4gWmkoZnVuY3Rpb24oZSl7ZS5zZXREYXRlKGUuZ2V0RGF0ZSgpLShlLmdldERheSgpKzctdCklNyksZS5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxlKXt0LnNldERhdGUodC5nZXREYXRlKCkrNyplKX0sZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10LShlLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSokaSkvSml9KX12YXIgbm89ZW8oMCkscm89ZW8oMSksaW89KGVvKDIpLGVvKDMpLGVvKDQpKSxvbz0oZW8oNSksZW8oNiksWmkoZnVuY3Rpb24odCl7dC5zZXREYXRlKDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsZSl7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrZSl9LGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKGUuZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfSksWmkoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsZSl7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrZSl9LGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KSk7b28uZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9aaShmdW5jdGlvbihlKXtlLnNldEZ1bGxZZWFyKE1hdGguZmxvb3IoZS5nZXRGdWxsWWVhcigpL3QpKnQpLGUuc2V0TW9udGgoMCwxKSxlLnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihlLG4pe2Uuc2V0RnVsbFllYXIoZS5nZXRGdWxsWWVhcigpK24qdCl9KTpudWxsfTt2YXIgYW89b28sc289KFppKGZ1bmN0aW9uKHQpe3Quc2V0VVRDU2Vjb25kcygwLDApfSxmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKiRpKX0sZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS8kaX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTWludXRlcygpfSksWmkoZnVuY3Rpb24odCl7dC5zZXRVVENNaW51dGVzKDAsMCwwKX0sZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrMzZlNSplKX0sZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS8zNmU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENIb3VycygpfSksWmkoZnVuY3Rpb24odCl7dC5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxlKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrZSl9LGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvODY0ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0RhdGUoKS0xfSkpO2Z1bmN0aW9uIHVvKHQpe3JldHVybiBaaShmdW5jdGlvbihlKXtlLnNldFVUQ0RhdGUoZS5nZXRVVENEYXRlKCktKGUuZ2V0VVRDRGF5KCkrNy10KSU3KSxlLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LGUpe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKSs3KmUpfSxmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL0ppfSl9dmFyIGxvPXVvKDApLGNvPXVvKDEpLGZvPSh1bygyKSx1bygzKSx1byg0KSksaG89KHVvKDUpLHVvKDYpLFppKGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LGUpe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK2UpfSxmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihlLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pLFppKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LGUpe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK2UpfSxmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSkpO2hvLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/WmkoZnVuY3Rpb24oZSl7ZS5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKGUuZ2V0VVRDRnVsbFllYXIoKS90KSp0KSxlLnNldFVUQ01vbnRoKDAsMSksZS5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24oZSxuKXtlLnNldFVUQ0Z1bGxZZWFyKGUuZ2V0VVRDRnVsbFllYXIoKStuKnQpfSk6bnVsbH07dmFyIHBvPWhvO2Z1bmN0aW9uIG1vKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIGU9bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBlLnNldEZ1bGxZZWFyKHQueSksZX1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiB5byh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBlPW5ldyBEYXRlKERhdGUuVVRDKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSk7cmV0dXJuIGUuc2V0VVRDRnVsbFllYXIodC55KSxlfXJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKX1mdW5jdGlvbiBnbyh0KXtyZXR1cm57eTp0LG06MCxkOjEsSDowLE06MCxTOjAsTDowfX12YXIgdm8sYm8sX28sd289eyItIjoiIixfOiIgIiwwOiIwIn0seG89L15ccypcZCsvLE9vPS9eJS8sQ289L1tcXF4kKis/fFtcXSgpLnt9XS9nO2Z1bmN0aW9uIFNvKHQsZSxuKXt2YXIgcj10PDA/Ii0iOiIiLGk9KHI/LXQ6dCkrIiIsbz1pLmxlbmd0aDtyZXR1cm4gcisobzxuP25ldyBBcnJheShuLW8rMSkuam9pbihlKStpOmkpfWZ1bmN0aW9uIEVvKHQpe3JldHVybiB0LnJlcGxhY2UoQ28sIlxcJCYiKX1mdW5jdGlvbiBrbyh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoRW8pLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBUbyh0KXtmb3IodmFyIGU9e30sbj0tMSxyPXQubGVuZ3RoOysrbjxyOyllW3Rbbl0udG9Mb3dlckNhc2UoKV09bjtyZXR1cm4gZX1mdW5jdGlvbiBJbyh0LGUsbil7dmFyIHI9eG8uZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIHI/KHQudz0rclswXSxuK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBBbyh0LGUsbil7dmFyIHI9eG8uZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIHI/KHQudT0rclswXSxuK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBqbyh0LGUsbil7dmFyIHI9eG8uZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIHI/KHQuVT0rclswXSxuK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBQbyh0LGUsbil7dmFyIHI9eG8uZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIHI/KHQuVj0rclswXSxuK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBNbyh0LGUsbil7dmFyIHI9eG8uZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIHI/KHQuVz0rclswXSxuK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBObyh0LGUsbil7dmFyIHI9eG8uZXhlYyhlLnNsaWNlKG4sbis0KSk7cmV0dXJuIHI/KHQueT0rclswXSxuK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBSbyh0LGUsbil7dmFyIHI9eG8uZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIHI/KHQueT0rclswXSsoK3JbMF0+Njg/MTkwMDoyZTMpLG4rclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIERvKHQsZSxuKXt2YXIgcj0vXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhlLnNsaWNlKG4sbis2KSk7cmV0dXJuIHI/KHQuWj1yWzFdPzA6LShyWzJdKyhyWzNdfHwiMDAiKSksbityWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gTG8odCxlLG4pe3ZhciByPXhvLmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiByPyh0Lm09clswXS0xLG4rclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEZvKHQsZSxuKXt2YXIgcj14by5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gcj8odC5kPStyWzBdLG4rclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFZvKHQsZSxuKXt2YXIgcj14by5leGVjKGUuc2xpY2UobixuKzMpKTtyZXR1cm4gcj8odC5tPTAsdC5kPStyWzBdLG4rclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFVvKHQsZSxuKXt2YXIgcj14by5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gcj8odC5IPStyWzBdLG4rclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHpvKHQsZSxuKXt2YXIgcj14by5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gcj8odC5NPStyWzBdLG4rclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEJvKHQsZSxuKXt2YXIgcj14by5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gcj8odC5TPStyWzBdLG4rclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEhvKHQsZSxuKXt2YXIgcj14by5leGVjKGUuc2xpY2UobixuKzMpKTtyZXR1cm4gcj8odC5MPStyWzBdLG4rclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFdvKHQsZSxuKXt2YXIgcj14by5leGVjKGUuc2xpY2UobixuKzYpKTtyZXR1cm4gcj8odC5MPU1hdGguZmxvb3IoclswXS8xZTMpLG4rclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHFvKHQsZSxuKXt2YXIgcj1Pby5leGVjKGUuc2xpY2UobixuKzEpKTtyZXR1cm4gcj9uK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIFlvKHQsZSxuKXt2YXIgcj14by5leGVjKGUuc2xpY2UobikpO3JldHVybiByPyh0LlE9K3JbMF0sbityWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gR28odCxlLG4pe3ZhciByPXhvLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIHI/KHQuUT0xZTMqK3JbMF0sbityWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUW8odCxlKXtyZXR1cm4gU28odC5nZXREYXRlKCksZSwyKX1mdW5jdGlvbiBLbyh0LGUpe3JldHVybiBTbyh0LmdldEhvdXJzKCksZSwyKX1mdW5jdGlvbiBabyh0LGUpe3JldHVybiBTbyh0LmdldEhvdXJzKCklMTJ8fDEyLGUsMil9ZnVuY3Rpb24gWG8odCxlKXtyZXR1cm4gU28oMSt0by5jb3VudChhbyh0KSx0KSxlLDMpfWZ1bmN0aW9uICRvKHQsZSl7cmV0dXJuIFNvKHQuZ2V0TWlsbGlzZWNvbmRzKCksZSwzKX1mdW5jdGlvbiBKbyh0LGUpe3JldHVybiAkbyh0LGUpKyIwMDAifWZ1bmN0aW9uIHRhKHQsZSl7cmV0dXJuIFNvKHQuZ2V0TW9udGgoKSsxLGUsMil9ZnVuY3Rpb24gZWEodCxlKXtyZXR1cm4gU28odC5nZXRNaW51dGVzKCksZSwyKX1mdW5jdGlvbiBuYSh0LGUpe3JldHVybiBTbyh0LmdldFNlY29uZHMoKSxlLDIpfWZ1bmN0aW9uIHJhKHQpe3ZhciBlPXQuZ2V0RGF5KCk7cmV0dXJuIDA9PT1lPzc6ZX1mdW5jdGlvbiBpYSh0LGUpe3JldHVybiBTbyhuby5jb3VudChhbyh0KSx0KSxlLDIpfWZ1bmN0aW9uIG9hKHQsZSl7dmFyIG49dC5nZXREYXkoKTtyZXR1cm4gdD1uPj00fHwwPT09bj9pbyh0KTppby5jZWlsKHQpLFNvKGlvLmNvdW50KGFvKHQpLHQpKyg0PT09YW8odCkuZ2V0RGF5KCkpLGUsMil9ZnVuY3Rpb24gYWEodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gc2EodCxlKXtyZXR1cm4gU28ocm8uY291bnQoYW8odCksdCksZSwyKX1mdW5jdGlvbiB1YSh0LGUpe3JldHVybiBTbyh0LmdldEZ1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gbGEodCxlKXtyZXR1cm4gU28odC5nZXRGdWxsWWVhcigpJTFlNCxlLDQpfWZ1bmN0aW9uIGNhKHQpe3ZhciBlPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4oZT4wPyItIjooZSo9LTEsIisiKSkrU28oZS82MHwwLCIwIiwyKStTbyhlJTYwLCIwIiwyKX1mdW5jdGlvbiBmYSh0LGUpe3JldHVybiBTbyh0LmdldFVUQ0RhdGUoKSxlLDIpfWZ1bmN0aW9uIGhhKHQsZSl7cmV0dXJuIFNvKHQuZ2V0VVRDSG91cnMoKSxlLDIpfWZ1bmN0aW9uIGRhKHQsZSl7cmV0dXJuIFNvKHQuZ2V0VVRDSG91cnMoKSUxMnx8MTIsZSwyKX1mdW5jdGlvbiBwYSh0LGUpe3JldHVybiBTbygxK3NvLmNvdW50KHBvKHQpLHQpLGUsMyl9ZnVuY3Rpb24gbWEodCxlKXtyZXR1cm4gU28odC5nZXRVVENNaWxsaXNlY29uZHMoKSxlLDMpfWZ1bmN0aW9uIHlhKHQsZSl7cmV0dXJuIG1hKHQsZSkrIjAwMCJ9ZnVuY3Rpb24gZ2EodCxlKXtyZXR1cm4gU28odC5nZXRVVENNb250aCgpKzEsZSwyKX1mdW5jdGlvbiB2YSh0LGUpe3JldHVybiBTbyh0LmdldFVUQ01pbnV0ZXMoKSxlLDIpfWZ1bmN0aW9uIGJhKHQsZSl7cmV0dXJuIFNvKHQuZ2V0VVRDU2Vjb25kcygpLGUsMil9ZnVuY3Rpb24gX2EodCl7dmFyIGU9dC5nZXRVVENEYXkoKTtyZXR1cm4gMD09PWU/NzplfWZ1bmN0aW9uIHdhKHQsZSl7cmV0dXJuIFNvKGxvLmNvdW50KHBvKHQpLHQpLGUsMil9ZnVuY3Rpb24geGEodCxlKXt2YXIgbj10LmdldFVUQ0RheSgpO3JldHVybiB0PW4+PTR8fDA9PT1uP2ZvKHQpOmZvLmNlaWwodCksU28oZm8uY291bnQocG8odCksdCkrKDQ9PT1wbyh0KS5nZXRVVENEYXkoKSksZSwyKX1mdW5jdGlvbiBPYSh0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiBDYSh0LGUpe3JldHVybiBTbyhjby5jb3VudChwbyh0KSx0KSxlLDIpfWZ1bmN0aW9uIFNhKHQsZSl7cmV0dXJuIFNvKHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsZSwyKX1mdW5jdGlvbiBFYSh0LGUpe3JldHVybiBTbyh0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24ga2EoKXtyZXR1cm4iKzAwMDAifWZ1bmN0aW9uIFRhKCl7cmV0dXJuIiUifWZ1bmN0aW9uIElhKHQpe3JldHVybit0fWZ1bmN0aW9uIEFhKHQpe3JldHVybiBNYXRoLmZsb29yKCt0LzFlMyl9IWZ1bmN0aW9uKHQpe3ZvPWZ1bmN0aW9uKGUpe3ZhciBuPXQuZGF0ZVRpbWUscj10LmRhdGUsaT10LnRpbWUsbz10LnBlcmlvZHMsYT10LmRheXMscz10LnNob3J0RGF5cyx1PXQubW9udGhzLGw9dC5zaG9ydE1vbnRocyxjPWtvKG8pLGY9VG8obyksaD1rbyhhKSxkPVRvKGEpLHA9a28ocyksbT1UbyhzKSx5PWtvKHUpLGc9VG8odSksdj1rbyhsKSxiPVRvKGwpLF89e2E6ZnVuY3Rpb24odCl7cmV0dXJuIHNbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24odCl7cmV0dXJuIGFbdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24odCl7cmV0dXJuIGxbdC5nZXRNb250aCgpXX0sQjpmdW5jdGlvbih0KXtyZXR1cm4gdVt0LmdldE1vbnRoKCldfSxjOm51bGwsZDpRbyxlOlFvLGY6Sm8sSDpLbyxJOlpvLGo6WG8sTDokbyxtOnRhLE06ZWEscDpmdW5jdGlvbih0KXtyZXR1cm4gb1srKHQuZ2V0SG91cnMoKT49MTIpXX0sUTpJYSxzOkFhLFM6bmEsdTpyYSxVOmlhLFY6b2EsdzphYSxXOnNhLHg6bnVsbCxYOm51bGwseTp1YSxZOmxhLFo6Y2EsIiUiOlRhfSx3PXthOmZ1bmN0aW9uKHQpe3JldHVybiBzW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0VVRDRGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBsW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6ZmEsZTpmYSxmOnlhLEg6aGEsSTpkYSxqOnBhLEw6bWEsbTpnYSxNOnZhLHA6ZnVuY3Rpb24odCl7cmV0dXJuIG9bKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19LFE6SWEsczpBYSxTOmJhLHU6X2EsVTp3YSxWOnhhLHc6T2EsVzpDYSx4Om51bGwsWDpudWxsLHk6U2EsWTpFYSxaOmthLCIlIjpUYX0seD17YTpmdW5jdGlvbih0LGUsbil7dmFyIHI9cC5leGVjKGUuc2xpY2UobikpO3JldHVybiByPyh0Lnc9bVtyWzBdLnRvTG93ZXJDYXNlKCldLG4rclswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1oLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIHI/KHQudz1kW3JbMF0udG9Mb3dlckNhc2UoKV0sbityWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXYuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gcj8odC5tPWJbclswXS50b0xvd2VyQ2FzZSgpXSxuK3JbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbih0LGUsbil7dmFyIHI9eS5leGVjKGUuc2xpY2UobikpO3JldHVybiByPyh0Lm09Z1tyWzBdLnRvTG93ZXJDYXNlKCldLG4rclswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gUyh0LG4sZSxyKX0sZDpGbyxlOkZvLGY6V28sSDpVbyxJOlVvLGo6Vm8sTDpIbyxtOkxvLE06em8scDpmdW5jdGlvbih0LGUsbil7dmFyIHI9Yy5leGVjKGUuc2xpY2UobikpO3JldHVybiByPyh0LnA9ZltyWzBdLnRvTG93ZXJDYXNlKCldLG4rclswXS5sZW5ndGgpOi0xfSxROllvLHM6R28sUzpCbyx1OkFvLFU6am8sVjpQbyx3OklvLFc6TW8seDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFModCxyLGUsbil9LFg6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBTKHQsaSxlLG4pfSx5OlJvLFk6Tm8sWjpEbywiJSI6cW99O2Z1bmN0aW9uIE8odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIHIsaSxvLGE9W10scz0tMSx1PTAsbD10Lmxlbmd0aDtmb3IobiBpbnN0YW5jZW9mIERhdGV8fChuPW5ldyBEYXRlKCtuKSk7KytzPGw7KTM3PT09dC5jaGFyQ29kZUF0KHMpJiYoYS5wdXNoKHQuc2xpY2UodSxzKSksbnVsbCE9KGk9d29bcj10LmNoYXJBdCgrK3MpXSk/cj10LmNoYXJBdCgrK3MpOmk9ImUiPT09cj8iICI6IjAiLChvPWVbcl0pJiYocj1vKG4saSkpLGEucHVzaChyKSx1PXMrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKHUscykpLGEuam9pbigiIil9fWZ1bmN0aW9uIEModCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIHIsaSxvPWdvKDE5MDApO2lmKFMobyx0LG4rPSIiLDApIT1uLmxlbmd0aClyZXR1cm4gbnVsbDtpZigiUSJpbiBvKXJldHVybiBuZXcgRGF0ZShvLlEpO2lmKCJwImluIG8mJihvLkg9by5IJTEyKzEyKm8ucCksIlYiaW4gbyl7aWYoby5WPDF8fG8uVj41MylyZXR1cm4gbnVsbDsidyJpbiBvfHwoby53PTEpLCJaImluIG8/KHI9KGk9KHI9eW8oZ28oby55KSkpLmdldFVUQ0RheSgpKT40fHwwPT09aT9jby5jZWlsKHIpOmNvKHIpLHI9c28ub2Zmc2V0KHIsNyooby5WLTEpKSxvLnk9ci5nZXRVVENGdWxsWWVhcigpLG8ubT1yLmdldFVUQ01vbnRoKCksby5kPXIuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KHI9KGk9KHI9ZShnbyhvLnkpKSkuZ2V0RGF5KCkpPjR8fDA9PT1pP3JvLmNlaWwocik6cm8ocikscj10by5vZmZzZXQociw3KihvLlYtMSkpLG8ueT1yLmdldEZ1bGxZZWFyKCksby5tPXIuZ2V0TW9udGgoKSxvLmQ9ci5nZXREYXRlKCkrKG8udys2KSU3KX1lbHNlKCJXImluIG98fCJVImluIG8pJiYoInciaW4gb3x8KG8udz0idSJpbiBvP28udSU3OiJXImluIG8/MTowKSxpPSJaImluIG8/eW8oZ28oby55KSkuZ2V0VVRDRGF5KCk6ZShnbyhvLnkpKS5nZXREYXkoKSxvLm09MCxvLmQ9IlciaW4gbz8oby53KzYpJTcrNypvLlctKGkrNSklNzpvLncrNypvLlUtKGkrNiklNyk7cmV0dXJuIloiaW4gbz8oby5IKz1vLlovMTAwfDAsby5NKz1vLlolMTAwLHlvKG8pKTplKG8pfX1mdW5jdGlvbiBTKHQsZSxuLHIpe2Zvcih2YXIgaSxvLGE9MCxzPWUubGVuZ3RoLHU9bi5sZW5ndGg7YTxzOyl7aWYocj49dSlyZXR1cm4tMTtpZigzNz09PShpPWUuY2hhckNvZGVBdChhKyspKSl7aWYoaT1lLmNoYXJBdChhKyspLCEobz14W2kgaW4gd28/ZS5jaGFyQXQoYSsrKTppXSl8fChyPW8odCxuLHIpKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9bi5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9cmV0dXJuIF8ueD1PKHIsXyksXy5YPU8oaSxfKSxfLmM9TyhuLF8pLHcueD1PKHIsdyksdy5YPU8oaSx3KSx3LmM9TyhuLHcpLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9Tyh0Kz0iIixfKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgZT1DKHQrPSIiLG1vKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9Tyh0Kz0iIix3KTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgZT1DKHQseW8pO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9fX0oKSxibz12by51dGNGb3JtYXQsX289dm8udXRjUGFyc2V9KHtkYXRlVGltZToiJXgsICVYIixkYXRlOiIlLW0vJS1kLyVZIix0aW1lOiIlLUk6JU06JVMgJXAiLHBlcmlvZHM6WyJBTSIsIlBNIl0sZGF5czpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sbW9udGhzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydE1vbnRoczpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdfSksRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmd8fGJvKCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKSwrbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpfHxfbygiJVktJW0tJWRUJUg6JU06JVMuJUxaIik7dmFyIGphPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aC82fDAsbj1uZXcgQXJyYXkoZSkscj0wO3I8ZTspbltyXT0iIyIrdC5zbGljZSg2KnIsNiorK3IpO3JldHVybiBufSxQYT0oamEoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpLGphKCI3ZmM5N2ZiZWFlZDRmZGMwODZmZmZmOTkzODZjYjBmMDAyN2ZiZjViMTc2NjY2NjYiKSxqYSgiMWI5ZTc3ZDk1ZjAyNzU3MGIzZTcyOThhNjZhNjFlZTZhYjAyYTY3NjFkNjY2NjY2IiksamEoImE2Y2VlMzFmNzhiNGIyZGY4YTMzYTAyY2ZiOWE5OWUzMWExY2ZkYmY2ZmZmN2YwMGNhYjJkNjZhM2Q5YWZmZmY5OWIxNTkyOCIpLGphKCJmYmI0YWViM2NkZTNjY2ViYzVkZWNiZTRmZWQ5YTZmZmZmY2NlNWQ4YmRmZGRhZWNmMmYyZjIiKSxqYSgiYjNlMmNkZmRjZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIiksamEoImU0MWExYzM3N2ViODRkYWY0YTk4NGVhM2ZmN2YwMGZmZmYzM2E2NTYyOGY3ODFiZjk5OTk5OSIpLGphKCI2NmMyYTVmYzhkNjI4ZGEwY2JlNzhhYzNhNmQ4NTRmZmQ5MmZlNWM0OTRiM2IzYjMiKSxqYSgiOGRkM2M3ZmZmZmIzYmViYWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZmIiksZnVuY3Rpb24odCl7cmV0dXJuIHNuKHRbdC5sZW5ndGgtMV0pfSk7ZnVuY3Rpb24gTWEodCl7dmFyIGU9dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4oZS0xLE1hdGguZmxvb3IobiplKSkpXX19UGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZDhiMzY1ZjVmNWY1NWFiNGFjIiwiYTY2MTFhZGZjMjdkODBjZGMxMDE4NTcxIiwiYTY2MTFhZGZjMjdkZjVmNWY1ODBjZGMxMDE4NTcxIiwiOGM1MTBhZDhiMzY1ZjZlOGMzYzdlYWU1NWFiNGFjMDE2NjVlIiwiOGM1MTBhZDhiMzY1ZjZlOGMzZjVmNWY1YzdlYWU1NWFiNGFjMDE2NjVlIiwiOGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzYzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwiOGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwiNTQzMDA1OGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzYzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlMDAzYzMwIiwiNTQzMDA1OGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlMDAzYzMwIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiYWY4ZGMzZjdmN2Y3N2ZiZjdiIiwiN2IzMjk0YzJhNWNmYTZkYmEwMDA4ODM3IiwiN2IzMjk0YzJhNWNmZjdmN2Y3YTZkYmEwMDA4ODM3IiwiNzYyYTgzYWY4ZGMzZTdkNGU4ZDlmMGQzN2ZiZjdiMWI3ODM3IiwiNzYyYTgzYWY4ZGMzZTdkNGU4ZjdmN2Y3ZDlmMGQzN2ZiZjdiMWI3ODM3IiwiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3IiwiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZjdmN2Y3ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3IiwiNDAwMDRiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3MDA0NDFiIiwiNDAwMDRiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZjdmN2Y3ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3MDA0NDFiIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZTlhM2M5ZjdmN2Y3YTFkNzZhIiwiZDAxYzhiZjFiNmRhYjhlMTg2NGRhYzI2IiwiZDAxYzhiZjFiNmRhZjdmN2Y3YjhlMTg2NGRhYzI2IiwiYzUxYjdkZTlhM2M5ZmRlMGVmZTZmNWQwYTFkNzZhNGQ5MjIxIiwiYzUxYjdkZTlhM2M5ZmRlMGVmZjdmN2Y3ZTZmNWQwYTFkNzZhNGQ5MjIxIiwiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwiOGUwMTUyYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5IiwiOGUwMTUyYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5IikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiOTk4ZWMzZjdmN2Y3ZjFhMzQwIiwiNWUzYzk5YjJhYmQyZmRiODYzZTY2MTAxIiwiNWUzYzk5YjJhYmQyZjdmN2Y3ZmRiODYzZTY2MTAxIiwiNTQyNzg4OTk4ZWMzZDhkYWViZmVlMGI2ZjFhMzQwYjM1ODA2IiwiNTQyNzg4OTk4ZWMzZDhkYWViZjdmN2Y3ZmVlMGI2ZjFhMzQwYjM1ODA2IiwiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2IiwiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZjdmN2Y3ZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2IiwiMmQwMDRiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2N2YzYjA4IiwiMmQwMDRiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZjdmN2Y3ZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2N2YzYjA4IikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZWY4YTYyZjdmN2Y3NjdhOWNmIiwiY2EwMDIwZjRhNTgyOTJjNWRlMDU3MWIwIiwiY2EwMDIwZjRhNTgyZjdmN2Y3OTJjNWRlMDU3MWIwIiwiYjIxODJiZWY4YTYyZmRkYmM3ZDFlNWYwNjdhOWNmMjE2NmFjIiwiYjIxODJiZWY4YTYyZmRkYmM3ZjdmN2Y3ZDFlNWYwNjdhOWNmMjE2NmFjIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZjdmN2Y3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjMDUzMDYxIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZjdmN2Y3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjMDUzMDYxIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZWY4YTYyZmZmZmZmOTk5OTk5IiwiY2EwMDIwZjRhNTgyYmFiYWJhNDA0MDQwIiwiY2EwMDIwZjRhNTgyZmZmZmZmYmFiYWJhNDA0MDQwIiwiYjIxODJiZWY4YTYyZmRkYmM3ZTBlMGUwOTk5OTk5NGQ0ZDRkIiwiYjIxODJiZWY4YTYyZmRkYmM3ZmZmZmZmZTBlMGUwOTk5OTk5NGQ0ZDRkIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTFiZmRiIiwiZDcxOTFjZmRhZTYxYWJkOWU5MmM3YmI2IiwiZDcxOTFjZmRhZTYxZmZmZmJmYWJkOWU5MmM3YmI2IiwiZDczMDI3ZmM4ZDU5ZmVlMDkwZTBmM2Y4OTFiZmRiNDU3NWI0IiwiZDczMDI3ZmM4ZDU5ZmVlMDkwZmZmZmJmZTBmM2Y4OTFiZmRiNDU3NWI0IiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0IiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZmZmZmJmZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0MzEzNjk1IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZmZmZmJmZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0MzEzNjk1IikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTFjZjYwIiwiZDcxOTFjZmRhZTYxYTZkOTZhMWE5NjQxIiwiZDcxOTFjZmRhZTYxZmZmZmJmYTZkOTZhMWE5NjQxIiwiZDczMDI3ZmM4ZDU5ZmVlMDhiZDllZjhiOTFjZjYwMWE5ODUwIiwiZDczMDI3ZmM4ZDU5ZmVlMDhiZmZmZmJmZDllZjhiOTFjZjYwMWE5ODUwIiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwIiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwIiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwMDA2ODM3IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwMDA2ODM3IikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTlkNTk0IiwiZDcxOTFjZmRhZTYxYWJkZGE0MmI4M2JhIiwiZDcxOTFjZmRhZTYxZmZmZmJmYWJkZGE0MmI4M2JhIiwiZDUzZTRmZmM4ZDU5ZmVlMDhiZTZmNTk4OTlkNTk0MzI4OGJkIiwiZDUzZTRmZmM4ZDU5ZmVlMDhiZmZmZmJmZTZmNTk4OTlkNTk0MzI4OGJkIiwiZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkIiwiZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkIiwiOWUwMTQyZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkNWU0ZmEyIiwiOWUwMTQyZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkNWU0ZmEyIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZTVmNWY5OTlkOGM5MmNhMjVmIiwiZWRmOGZiYjJlMmUyNjZjMmE0MjM4YjQ1IiwiZWRmOGZiYjJlMmUyNjZjMmE0MmNhMjVmMDA2ZDJjIiwiZWRmOGZiY2NlY2U2OTlkOGM5NjZjMmE0MmNhMjVmMDA2ZDJjIiwiZWRmOGZiY2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA1ODI0IiwiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA1ODI0IiwiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA2ZDJjMDA0NDFiIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZTBlY2Y0OWViY2RhODg1NmE3IiwiZWRmOGZiYjNjZGUzOGM5NmM2ODg0MTlkIiwiZWRmOGZiYjNjZGUzOGM5NmM2ODg1NmE3ODEwZjdjIiwiZWRmOGZiYmZkM2U2OWViY2RhOGM5NmM2ODg1NmE3ODEwZjdjIiwiZWRmOGZiYmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkNmUwMTZiIiwiZjdmY2ZkZTBlY2Y0YmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkNmUwMTZiIiwiZjdmY2ZkZTBlY2Y0YmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkODEwZjdjNGQwMDRiIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZTBmM2RiYThkZGI1NDNhMmNhIiwiZjBmOWU4YmFlNGJjN2JjY2M0MmI4Y2JlIiwiZjBmOWU4YmFlNGJjN2JjY2M0NDNhMmNhMDg2OGFjIiwiZjBmOWU4Y2NlYmM1YThkZGI1N2JjY2M0NDNhMmNhMDg2OGFjIiwiZjBmOWU4Y2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg1ODllIiwiZjdmY2YwZTBmM2RiY2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg1ODllIiwiZjdmY2YwZTBmM2RiY2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg2OGFjMDg0MDgxIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlOGM4ZmRiYjg0ZTM0YTMzIiwiZmVmMGQ5ZmRjYzhhZmM4ZDU5ZDczMDFmIiwiZmVmMGQ5ZmRjYzhhZmM4ZDU5ZTM0YTMzYjMwMDAwIiwiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5ZTM0YTMzYjMwMDAwIiwiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmOTkwMDAwIiwiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmOTkwMDAwIiwiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmYjMwMDAwN2YwMDAwIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZWNlMmYwYTZiZGRiMWM5MDk5IiwiZjZlZmY3YmRjOWUxNjdhOWNmMDI4MThhIiwiZjZlZmY3YmRjOWUxNjdhOWNmMWM5MDk5MDE2YzU5IiwiZjZlZmY3ZDBkMWU2YTZiZGRiNjdhOWNmMWM5MDk5MDE2YzU5IiwiZjZlZmY3ZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2NDUwIiwiZmZmN2ZiZWNlMmYwZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2NDUwIiwiZmZmN2ZiZWNlMmYwZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2YzU5MDE0NjM2IikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZWNlN2YyYTZiZGRiMmI4Y2JlIiwiZjFlZWY2YmRjOWUxNzRhOWNmMDU3MGIwIiwiZjFlZWY2YmRjOWUxNzRhOWNmMmI4Y2JlMDQ1YThkIiwiZjFlZWY2ZDBkMWU2YTZiZGRiNzRhOWNmMmI4Y2JlMDQ1YThkIiwiZjFlZWY2ZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDM0ZTdiIiwiZmZmN2ZiZWNlN2YyZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDM0ZTdiIiwiZmZmN2ZiZWNlN2YyZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDQ1YThkMDIzODU4IikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZTdlMWVmYzk5NGM3ZGQxYzc3IiwiZjFlZWY2ZDdiNWQ4ZGY2NWIwY2UxMjU2IiwiZjFlZWY2ZDdiNWQ4ZGY2NWIwZGQxYzc3OTgwMDQzIiwiZjFlZWY2ZDRiOWRhYzk5NGM3ZGY2NWIwZGQxYzc3OTgwMDQzIiwiZjFlZWY2ZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTEwMDNmIiwiZjdmNGY5ZTdlMWVmZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTEwMDNmIiwiZjdmNGY5ZTdlMWVmZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTgwMDQzNjcwMDFmIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZmRlMGRkZmE5ZmI1YzUxYjhhIiwiZmVlYmUyZmJiNGI5Zjc2OGExYWUwMTdlIiwiZmVlYmUyZmJiNGI5Zjc2OGExYzUxYjhhN2EwMTc3IiwiZmVlYmUyZmNjNWMwZmE5ZmI1Zjc2OGExYzUxYjhhN2EwMTc3IiwiZmVlYmUyZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3IiwiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3IiwiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3NDkwMDZhIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZWRmOGIxN2ZjZGJiMmM3ZmI4IiwiZmZmZmNjYTFkYWI0NDFiNmM0MjI1ZWE4IiwiZmZmZmNjYTFkYWI0NDFiNmM0MmM3ZmI4MjUzNDk0IiwiZmZmZmNjYzdlOWI0N2ZjZGJiNDFiNmM0MmM3ZmI4MjUzNDk0IiwiZmZmZmNjYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MGMyYzg0IiwiZmZmZmQ5ZWRmOGIxYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MGMyYzg0IiwiZmZmZmQ5ZWRmOGIxYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MjUzNDk0MDgxZDU4IikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZjdmY2I5YWRkZDhlMzFhMzU0IiwiZmZmZmNjYzJlNjk5NzhjNjc5MjM4NDQzIiwiZmZmZmNjYzJlNjk5NzhjNjc5MzFhMzU0MDA2ODM3IiwiZmZmZmNjZDlmMGEzYWRkZDhlNzhjNjc5MzFhMzU0MDA2ODM3IiwiZmZmZmNjZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA1YTMyIiwiZmZmZmU1ZjdmY2I5ZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA1YTMyIiwiZmZmZmU1ZjdmY2I5ZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA2ODM3MDA0NTI5IikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZmZmN2JjZmVjNDRmZDk1ZjBlIiwiZmZmZmQ0ZmVkOThlZmU5OTI5Y2M0YzAyIiwiZmZmZmQ0ZmVkOThlZmU5OTI5ZDk1ZjBlOTkzNDA0IiwiZmZmZmQ0ZmVlMzkxZmVjNDRmZmU5OTI5ZDk1ZjBlOTkzNDA0IiwiZmZmZmQ0ZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOGMyZDA0IiwiZmZmZmU1ZmZmN2JjZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOGMyZDA0IiwiZmZmZmU1ZmZmN2JjZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOTkzNDA0NjYyNTA2IikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZmZlZGEwZmViMjRjZjAzYjIwIiwiZmZmZmIyZmVjYzVjZmQ4ZDNjZTMxYTFjIiwiZmZmZmIyZmVjYzVjZmQ4ZDNjZjAzYjIwYmQwMDI2IiwiZmZmZmIyZmVkOTc2ZmViMjRjZmQ4ZDNjZjAzYjIwYmQwMDI2IiwiZmZmZmIyZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYjEwMDI2IiwiZmZmZmNjZmZlZGEwZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYjEwMDI2IiwiZmZmZmNjZmZlZGEwZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYmQwMDI2ODAwMDI2IikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZGVlYmY3OWVjYWUxMzE4MmJkIiwiZWZmM2ZmYmRkN2U3NmJhZWQ2MjE3MWI1IiwiZWZmM2ZmYmRkN2U3NmJhZWQ2MzE4MmJkMDg1MTljIiwiZWZmM2ZmYzZkYmVmOWVjYWUxNmJhZWQ2MzE4MmJkMDg1MTljIiwiZWZmM2ZmYzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg0NTk0IiwiZjdmYmZmZGVlYmY3YzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg0NTk0IiwiZjdmYmZmZGVlYmY3YzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg1MTljMDgzMDZiIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZTVmNWUwYTFkOTliMzFhMzU0IiwiZWRmOGU5YmFlNGIzNzRjNDc2MjM4YjQ1IiwiZWRmOGU5YmFlNGIzNzRjNDc2MzFhMzU0MDA2ZDJjIiwiZWRmOGU5YzdlOWMwYTFkOTliNzRjNDc2MzFhMzU0MDA2ZDJjIiwiZWRmOGU5YzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA1YTMyIiwiZjdmY2Y1ZTVmNWUwYzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA1YTMyIiwiZjdmY2Y1ZTVmNWUwYzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA2ZDJjMDA0NDFiIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZjBmMGYwYmRiZGJkNjM2MzYzIiwiZjdmN2Y3Y2NjY2NjOTY5Njk2NTI1MjUyIiwiZjdmN2Y3Y2NjY2NjOTY5Njk2NjM2MzYzMjUyNTI1IiwiZjdmN2Y3ZDlkOWQ5YmRiZGJkOTY5Njk2NjM2MzYzMjUyNTI1IiwiZjdmN2Y3ZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1IiwiZmZmZmZmZjBmMGYwZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1IiwiZmZmZmZmZjBmMGYwZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1MDAwMDAwIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZWZlZGY1YmNiZGRjNzU2YmIxIiwiZjJmMGY3Y2JjOWUyOWU5YWM4NmE1MWEzIiwiZjJmMGY3Y2JjOWUyOWU5YWM4NzU2YmIxNTQyNzhmIiwiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4NzU2YmIxNTQyNzhmIiwiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNGExNDg2IiwiZmNmYmZkZWZlZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNGExNDg2IiwiZmNmYmZkZWZlZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNTQyNzhmM2YwMDdkIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlMGQyZmM5MjcyZGUyZDI2IiwiZmVlNWQ5ZmNhZTkxZmI2YTRhY2IxODFkIiwiZmVlNWQ5ZmNhZTkxZmI2YTRhZGUyZDI2YTUwZjE1IiwiZmVlNWQ5ZmNiYmExZmM5MjcyZmI2YTRhZGUyZDI2YTUwZjE1IiwiZmVlNWQ5ZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkOTkwMDBkIiwiZmZmNWYwZmVlMGQyZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkOTkwMDBkIiwiZmZmNWYwZmVlMGQyZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkYTUwZjE1NjcwMDBkIikubWFwKGphKSksUGEobmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlNmNlZmRhZTZiZTY1NTBkIiwiZmVlZGRlZmRiZTg1ZmQ4ZDNjZDk0NzAxIiwiZmVlZGRlZmRiZTg1ZmQ4ZDNjZTY1NTBkYTYzNjAzIiwiZmVlZGRlZmRkMGEyZmRhZTZiZmQ4ZDNjZTY1NTBkYTYzNjAzIiwiZmVlZGRlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxOGMyZDA0IiwiZmZmNWViZmVlNmNlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxOGMyZDA0IiwiZmZmNWViZmVlNmNlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxYTYzNjAzN2YyNzA0IikubWFwKGphKSksU24oR2UoMzAwLC41LDApLEdlKC0yNDAsLjUsMSkpLFNuKEdlKC0xMDAsLjc1LC4zNSksR2UoODAsMS41LC44KSksU24oR2UoMjYwLC43NSwuMzUpLEdlKDgwLDEuNSwuOCkpLEdlKCksZ2UoKSxNYXRoLE1hdGgsTWEoamEoIjQ0MDE1NDQ0MDI1NjQ1MDQ1NzQ1MDU1OTQ2MDc1YTQ2MDg1YzQ2MGE1ZDQ2MGI1ZTQ3MGQ2MDQ3MGU2MTQ3MTA2MzQ3MTE2NDQ3MTM2NTQ4MTQ2NzQ4MTY2ODQ4MTc2OTQ4MTg2YTQ4MWE2YzQ4MWI2ZDQ4MWM2ZTQ4MWQ2ZjQ4MWY3MDQ4MjA3MTQ4MjE3MzQ4MjM3NDQ4MjQ3NTQ4MjU3NjQ4MjY3NzQ4Mjg3ODQ4Mjk3OTQ3MmE3YTQ3MmM3YTQ3MmQ3YjQ3MmU3YzQ3MmY3ZDQ2MzA3ZTQ2MzI3ZTQ2MzM3ZjQ2MzQ4MDQ1MzU4MTQ1Mzc4MTQ1Mzg4MjQ0Mzk4MzQ0M2E4MzQ0M2I4NDQzM2Q4NDQzM2U4NTQyM2Y4NTQyNDA4NjQyNDE4NjQxNDI4NzQxNDQ4NzQwNDU4ODQwNDY4ODNmNDc4ODNmNDg4OTNlNDk4OTNlNGE4OTNlNGM4YTNkNGQ4YTNkNGU4YTNjNGY4YTNjNTA4YjNiNTE4YjNiNTI4YjNhNTM4YjNhNTQ4YzM5NTU4YzM5NTY4YzM4NTg4YzM4NTk4YzM3NWE4YzM3NWI4ZDM2NWM4ZDM2NWQ4ZDM1NWU4ZDM1NWY4ZDM0NjA4ZDM0NjE4ZDMzNjI4ZDMzNjM4ZDMyNjQ4ZTMyNjU4ZTMxNjY4ZTMxNjc4ZTMxNjg4ZTMwNjk4ZTMwNmE4ZTJmNmI4ZTJmNmM4ZTJlNmQ4ZTJlNmU4ZTJlNmY4ZTJkNzA4ZTJkNzE4ZTJjNzE4ZTJjNzI4ZTJjNzM4ZTJiNzQ4ZTJiNzU4ZTJhNzY4ZTJhNzc4ZTJhNzg4ZTI5Nzk4ZTI5N2E4ZTI5N2I4ZTI4N2M4ZTI4N2Q4ZTI3N2U4ZTI3N2Y4ZTI3ODA4ZTI2ODE4ZTI2ODI4ZTI2ODI4ZTI1ODM4ZTI1ODQ4ZTI1ODU4ZTI0ODY4ZTI0ODc4ZTIzODg4ZTIzODk4ZTIzOGE4ZDIyOGI4ZDIyOGM4ZDIyOGQ4ZDIxOGU4ZDIxOGY4ZDIxOTA4ZDIxOTE4YzIwOTI4YzIwOTI4YzIwOTM4YzFmOTQ4YzFmOTU4YjFmOTY4YjFmOTc4YjFmOTg4YjFmOTk4YTFmOWE4YTFlOWI4YTFlOWM4OTFlOWQ4OTFmOWU4OTFmOWY4ODFmYTA4ODFmYTE4ODFmYTE4NzFmYTI4NzIwYTM4NjIwYTQ4NjIxYTU4NTIxYTY4NTIyYTc4NTIyYTg4NDIzYTk4MzI0YWE4MzI1YWI4MjI1YWM4MjI2YWQ4MTI3YWQ4MTI4YWU4MDI5YWY3ZjJhYjA3ZjJjYjE3ZTJkYjI3ZDJlYjM3YzJmYjQ3YzMxYjU3YjMyYjY3YTM0YjY3OTM1Yjc3OTM3Yjg3ODM4Yjk3NzNhYmE3NjNiYmI3NTNkYmM3NDNmYmM3MzQwYmQ3MjQyYmU3MTQ0YmY3MDQ2YzA2ZjQ4YzE2ZTRhYzE2ZDRjYzI2YzRlYzM2YjUwYzQ2YTUyYzU2OTU0YzU2ODU2YzY2NzU4Yzc2NTVhYzg2NDVjYzg2MzVlYzk2MjYwY2E2MDYzY2I1ZjY1Y2I1ZTY3Y2M1YzY5Y2Q1YjZjY2Q1YTZlY2U1ODcwY2Y1NzczZDA1Njc1ZDA1NDc3ZDE1MzdhZDE1MTdjZDI1MDdmZDM0ZTgxZDM0ZDg0ZDQ0Yjg2ZDU0OTg5ZDU0ODhiZDY0NjhlZDY0NTkwZDc0MzkzZDc0MTk1ZDg0MDk4ZDgzZTliZDkzYzlkZDkzYmEwZGEzOWEyZGEzN2E1ZGIzNmE4ZGIzNGFhZGMzMmFkZGMzMGIwZGQyZmIyZGQyZGI1ZGUyYmI4ZGUyOWJhZGUyOGJkZGYyNmMwZGYyNWMyZGYyM2M1ZTAyMWM4ZTAyMGNhZTExZmNkZTExZGQwZTExY2QyZTIxYmQ1ZTIxYWQ4ZTIxOWRhZTMxOWRkZTMxOGRmZTMxOGUyZTQxOGU1ZTQxOWU3ZTQxOWVhZTUxYWVjZTUxYmVmZTUxY2YxZTUxZGY0ZTYxZWY2ZTYyMGY4ZTYyMWZiZTcyM2ZkZTcyNSIpKSxNYShqYSgiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTA5MDIwMjBiMDIwMjBkMDMwMzBmMDMwMzEyMDQwNDE0MDUwNDE2MDYwNTE4MDYwNTFhMDcwNjFjMDgwNzFlMDkwNzIwMGEwODIyMGIwOTI0MGMwOTI2MGQwYTI5MGUwYjJiMTAwYjJkMTEwYzJmMTIwZDMxMTMwZDM0MTQwZTM2MTUwZTM4MTYwZjNiMTgwZjNkMTkxMDNmMWExMDQyMWMxMDQ0MWQxMTQ3MWUxMTQ5MjAxMTRiMjExMTRlMjIxMTUwMjQxMjUzMjUxMjU1MjcxMjU4MjkxMTVhMmExMTVjMmMxMTVmMmQxMTYxMmYxMTYzMzExMTY1MzMxMDY3MzQxMDY5MzYxMDZiMzgxMDZjMzkwZjZlM2IwZjcwM2QwZjcxM2YwZjcyNDAwZjc0NDIwZjc1NDQwZjc2NDUxMDc3NDcxMDc4NDkxMDc4NGExMDc5NGMxMTdhNGUxMTdiNGYxMjdiNTExMjdjNTIxMzdjNTQxMzdkNTYxNDdkNTcxNTdlNTkxNTdlNWExNjdlNWMxNjdmNWQxNzdmNWYxODdmNjAxODgwNjIxOTgwNjQxYTgwNjUxYTgwNjcxYjgwNjgxYzgxNmExYzgxNmIxZDgxNmQxZDgxNmUxZTgxNzAxZjgxNzIxZjgxNzMyMDgxNzUyMTgxNzYyMTgxNzgyMjgxNzkyMjgyN2IyMzgyN2MyMzgyN2UyNDgyODAyNTgyODEyNTgxODMyNjgxODQyNjgxODYyNzgxODgyNzgxODkyODgxOGIyOTgxOGMyOTgxOGUyYTgxOTAyYTgxOTEyYjgxOTMyYjgwOTQyYzgwOTYyYzgwOTgyZDgwOTkyZDgwOWIyZTdmOWMyZTdmOWUyZjdmYTAyZjdmYTEzMDdlYTMzMDdlYTUzMTdlYTYzMTdkYTgzMjdkYWEzMzdkYWIzMzdjYWQzNDdjYWUzNDdiYjAzNTdiYjIzNTdiYjMzNjdhYjUzNjdhYjczNzc5YjgzNzc5YmEzODc4YmMzOTc4YmQzOTc3YmYzYTc3YzAzYTc2YzIzYjc1YzQzYzc1YzUzYzc0YzczZDczYzgzZTczY2EzZTcyY2MzZjcxY2Q0MDcxY2Y0MDcwZDA0MTZmZDI0MjZmZDM0MzZlZDU0NDZkZDY0NTZjZDg0NTZjZDk0NjZiZGI0NzZhZGM0ODY5ZGU0OTY4ZGY0YTY4ZTA0YzY3ZTI0ZDY2ZTM0ZTY1ZTQ0ZjY0ZTU1MDY0ZTc1MjYzZTg1MzYyZTk1NDYyZWE1NjYxZWI1NzYwZWM1ODYwZWQ1YTVmZWU1YjVlZWY1ZDVlZjA1ZjVlZjE2MDVkZjI2MjVkZjI2NDVjZjM2NTVjZjQ2NzVjZjQ2OTVjZjU2YjVjZjY2YzVjZjY2ZTVjZjc3MDVjZjc3MjVjZjg3NDVjZjg3NjVjZjk3ODVkZjk3OTVkZjk3YjVkZmE3ZDVlZmE3ZjVlZmE4MTVmZmI4MzVmZmI4NTYwZmI4NzYxZmM4OTYxZmM4YTYyZmM4YzYzZmM4ZTY0ZmM5MDY1ZmQ5MjY2ZmQ5NDY3ZmQ5NjY4ZmQ5ODY5ZmQ5YTZhZmQ5YjZiZmU5ZDZjZmU5ZjZkZmVhMTZlZmVhMzZmZmVhNTcxZmVhNzcyZmVhOTczZmVhYTc0ZmVhYzc2ZmVhZTc3ZmViMDc4ZmViMjdhZmViNDdiZmViNjdjZmViNzdlZmViOTdmZmViYjgxZmViZDgyZmViZjg0ZmVjMTg1ZmVjMjg3ZmVjNDg4ZmVjNjhhZmVjODhjZmVjYThkZmVjYzhmZmVjZDkwZmVjZjkyZmVkMTk0ZmVkMzk1ZmVkNTk3ZmVkNzk5ZmVkODlhZmRkYTljZmRkYzllZmRkZWEwZmRlMGExZmRlMmEzZmRlM2E1ZmRlNWE3ZmRlN2E5ZmRlOWFhZmRlYmFjZmNlY2FlZmNlZWIwZmNmMGIyZmNmMmI0ZmNmNGI2ZmNmNmI4ZmNmN2I5ZmNmOWJiZmNmYmJkZmNmZGJmIikpLE1hKGphKCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMGEwMjAyMGMwMjAyMGUwMzAyMTAwNDAzMTIwNDAzMTQwNTA0MTcwNjA0MTkwNzA1MWIwODA1MWQwOTA2MWYwYTA3MjIwYjA3MjQwYzA4MjYwZDA4MjkwZTA5MmIxMDA5MmQxMTBhMzAxMjBhMzIxNDBiMzQxNTBiMzcxNjBiMzkxODBjM2MxOTBjM2UxYjBjNDExYzBjNDMxZTBjNDUxZjBjNDgyMTBjNGEyMzBjNGMyNDBjNGYyNjBjNTEyODBiNTMyOTBiNTUyYjBiNTcyZDBiNTkyZjBhNWIzMTBhNWMzMjBhNWUzNDBhNWYzNjA5NjEzODA5NjIzOTA5NjMzYjA5NjQzZDA5NjUzZTA5NjY0MDBhNjc0MjBhNjg0NDBhNjg0NTBhNjk0NzBiNmE0OTBiNmE0YTBjNmI0YzBjNmI0ZDBkNmM0ZjBkNmM1MTBlNmM1MjBlNmQ1NDBmNmQ1NTBmNmQ1NzEwNmU1OTEwNmU1YTExNmU1YzEyNmU1ZDEyNmU1ZjEzNmU2MTEzNmU2MjE0NmU2NDE1NmU2NTE1NmU2NzE2NmU2OTE2NmU2YTE3NmU2YzE4NmU2ZDE4NmU2ZjE5NmU3MTE5NmU3MjFhNmU3NDFhNmU3NTFiNmU3NzFjNmQ3ODFjNmQ3YTFkNmQ3YzFkNmQ3ZDFlNmQ3ZjFlNmM4MDFmNmM4MjIwNmM4NDIwNmI4NTIxNmI4NzIxNmI4ODIyNmE4YTIyNmE4YzIzNjk4ZDIzNjk4ZjI0Njk5MDI1Njg5MjI1Njg5MzI2Njc5NTI2Njc5NzI3NjY5ODI3NjY5YTI4NjU5YjI5NjQ5ZDI5NjQ5ZjJhNjNhMDJhNjNhMjJiNjJhMzJjNjFhNTJjNjBhNjJkNjBhODJlNWZhOTJlNWVhYjJmNWVhZDMwNWRhZTMwNWNiMDMxNWJiMTMyNWFiMzMyNWFiNDMzNTliNjM0NThiNzM1NTdiOTM1NTZiYTM2NTViYzM3NTRiZDM4NTNiZjM5NTJjMDNhNTFjMTNhNTBjMzNiNGZjNDNjNGVjNjNkNGRjNzNlNGNjODNmNGJjYTQwNGFjYjQxNDljYzQyNDhjZTQzNDdjZjQ0NDZkMDQ1NDVkMjQ2NDRkMzQ3NDNkNDQ4NDJkNTRhNDFkNzRiM2ZkODRjM2VkOTRkM2RkYTRlM2NkYjUwM2JkZDUxM2FkZTUyMzhkZjUzMzdlMDU1MzZlMTU2MzVlMjU3MzRlMzU5MzNlNDVhMzFlNTVjMzBlNjVkMmZlNzVlMmVlODYwMmRlOTYxMmJlYTYzMmFlYjY0MjllYjY2MjhlYzY3MjZlZDY5MjVlZTZhMjRlZjZjMjNlZjZlMjFmMDZmMjBmMTcxMWZmMTczMWRmMjc0MWNmMzc2MWJmMzc4MTlmNDc5MThmNTdiMTdmNTdkMTVmNjdlMTRmNjgwMTNmNzgyMTJmNzg0MTBmODg1MGZmODg3MGVmODg5MGNmOThiMGJmOThjMGFmOThlMDlmYTkwMDhmYTkyMDdmYTk0MDdmYjk2MDZmYjk3MDZmYjk5MDZmYjliMDZmYjlkMDdmYzlmMDdmY2ExMDhmY2EzMDlmY2E1MGFmY2E2MGNmY2E4MGRmY2FhMGZmY2FjMTFmY2FlMTJmY2IwMTRmY2IyMTZmY2I0MThmYmI2MWFmYmI4MWRmYmJhMWZmYmJjMjFmYmJlMjNmYWMwMjZmYWMyMjhmYWM0MmFmYWM2MmRmOWM3MmZmOWM5MzJmOWNiMzVmOGNkMzdmOGNmM2FmN2QxM2RmN2QzNDBmNmQ1NDNmNmQ3NDZmNWQ5NDlmNWRiNGNmNGRkNGZmNGRmNTNmNGUxNTZmM2UzNWFmM2U1NWRmMmU2NjFmMmU4NjVmMmVhNjlmMWVjNmRmMWVkNzFmMWVmNzVmMWYxNzlmMmYyN2RmMmY0ODJmM2Y1ODZmM2Y2OGFmNGY4OGVmNWY5OTJmNmZhOTZmOGZiOWFmOWZjOWRmYWZkYTFmY2ZmYTQiKSksTWEoamEoIjBkMDg4NzEwMDc4ODEzMDc4OTE2MDc4YTE5MDY4YzFiMDY4ZDFkMDY4ZTIwMDY4ZjIyMDY5MDI0MDY5MTI2MDU5MTI4MDU5MjJhMDU5MzJjMDU5NDJlMDU5NTJmMDU5NjMxMDU5NzMzMDU5NzM1MDQ5ODM3MDQ5OTM4MDQ5YTNhMDQ5YTNjMDQ5YjNlMDQ5YzNmMDQ5YzQxMDQ5ZDQzMDM5ZTQ0MDM5ZTQ2MDM5ZjQ4MDM5ZjQ5MDNhMDRiMDNhMTRjMDJhMTRlMDJhMjUwMDJhMjUxMDJhMzUzMDJhMzU1MDJhNDU2MDFhNDU4MDFhNDU5MDFhNTViMDFhNTVjMDFhNjVlMDFhNjYwMDFhNjYxMDBhNzYzMDBhNzY0MDBhNzY2MDBhNzY3MDBhODY5MDBhODZhMDBhODZjMDBhODZlMDBhODZmMDBhODcxMDBhODcyMDFhODc0MDFhODc1MDFhODc3MDFhODc4MDFhODdhMDJhODdiMDJhODdkMDNhODdlMDNhODgwMDRhODgxMDRhNzgzMDVhNzg0MDVhNzg2MDZhNjg3MDdhNjg4MDhhNjhhMDlhNThiMGFhNThkMGJhNThlMGNhNDhmMGRhNDkxMGVhMzkyMGZhMzk0MTBhMjk1MTFhMTk2MTNhMTk4MTRhMDk5MTU5ZjlhMTY5ZjljMTc5ZTlkMTg5ZDllMTk5ZGEwMWE5Y2ExMWI5YmEyMWQ5YWEzMWU5YWE1MWY5OWE2MjA5OGE3MjE5N2E4MjI5NmFhMjM5NWFiMjQ5NGFjMjY5NGFkMjc5M2FlMjg5MmIwMjk5MWIxMmE5MGIyMmI4ZmIzMmM4ZWI0MmU4ZGI1MmY4Y2I2MzA4YmI3MzE4YWI4MzI4OWJhMzM4OGJiMzQ4OGJjMzU4N2JkMzc4NmJlMzg4NWJmMzk4NGMwM2E4M2MxM2I4MmMyM2M4MWMzM2Q4MGM0M2U3ZmM1NDA3ZWM2NDE3ZGM3NDI3Y2M4NDM3YmM5NDQ3YWNhNDU3YWNiNDY3OWNjNDc3OGNjNDk3N2NkNGE3NmNlNGI3NWNmNGM3NGQwNGQ3M2QxNGU3MmQyNGY3MWQzNTE3MWQ0NTI3MGQ1NTM2ZmQ1NTQ2ZWQ2NTU2ZGQ3NTY2Y2Q4NTc2YmQ5NTg2YWRhNWE2YWRhNWI2OWRiNWM2OGRjNWQ2N2RkNWU2NmRlNWY2NWRlNjE2NGRmNjI2M2UwNjM2M2UxNjQ2MmUyNjU2MWUyNjY2MGUzNjg1ZmU0Njk1ZWU1NmE1ZGU1NmI1ZGU2NmM1Y2U3NmU1YmU3NmY1YWU4NzA1OWU5NzE1OGU5NzI1N2VhNzQ1N2ViNzU1NmViNzY1NWVjNzc1NGVkNzk1M2VkN2E1MmVlN2I1MWVmN2M1MWVmN2U1MGYwN2Y0ZmYwODA0ZWYxODE0ZGYxODM0Y2YyODQ0YmYzODU0YmYzODc0YWY0ODg0OWY0ODk0OGY1OGI0N2Y1OGM0NmY2OGQ0NWY2OGY0NGY3OTA0NGY3OTE0M2Y3OTM0MmY4OTQ0MWY4OTU0MGY5OTczZmY5OTgzZWY5OWEzZWZhOWIzZGZhOWMzY2ZhOWUzYmZiOWYzYWZiYTEzOWZiYTIzOGZjYTMzOGZjYTUzN2ZjYTYzNmZjYTgzNWZjYTkzNGZkYWIzM2ZkYWMzM2ZkYWUzMmZkYWYzMWZkYjEzMGZkYjIyZmZkYjQyZmZkYjUyZWZlYjcyZGZlYjgyY2ZlYmEyY2ZlYmIyYmZlYmQyYWZlYmUyYWZlYzAyOWZkYzIyOWZkYzMyOGZkYzUyN2ZkYzYyN2ZkYzgyN2ZkY2EyNmZkY2IyNmZjY2QyNWZjY2UyNWZjZDAyNWZjZDIyNWZiZDMyNGZiZDUyNGZiZDcyNGZhZDgyNGZhZGEyNGY5ZGMyNGY5ZGQyNWY4ZGYyNWY4ZTEyNWY3ZTIyNWY3ZTQyNWY2ZTYyNmY2ZTgyNmY1ZTkyNmY1ZWIyN2Y0ZWQyN2YzZWUyN2YzZjAyN2YyZjIyN2YxZjQyNmYxZjUyNWYwZjcyNGYwZjkyMSIpKTt2YXIgTmE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxSYT1NYXRoLmFicyxEYT1NYXRoLmF0YW4yLExhPU1hdGguY29zLEZhPU1hdGgubWF4LFZhPU1hdGgubWluLFVhPU1hdGguc2luLHphPU1hdGguc3FydCxCYT0xZS0xMixIYT1NYXRoLlBJLFdhPUhhLzIscWE9MipIYTtmdW5jdGlvbiBZYSh0KXtyZXR1cm4gdD49MT9XYTp0PD0tMT8tV2E6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIEdhKHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIFFhKHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uIEthKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gWmEodCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gWGEodCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gJGEodCxlLG4scixpLG8sYSl7dmFyIHM9dC1uLHU9ZS1yLGw9KGE/bzotbykvemEocypzK3UqdSksYz1sKnUsZj0tbCpzLGg9dCtjLGQ9ZStmLHA9bitjLG09citmLHk9KGgrcCkvMixnPShkK20pLzIsdj1wLWgsYj1tLWQsXz12KnYrYipiLHc9aS1vLHg9aCptLXAqZCxPPShiPDA/LTE6MSkqemEoRmEoMCx3KncqXy14KngpKSxDPSh4KmItdipPKS9fLFM9KC14KnYtYipPKS9fLEU9KHgqYit2Kk8pL18saz0oLXgqditiKk8pL18sVD1DLXksST1TLWcsQT1FLXksaj1rLWc7cmV0dXJuIFQqVCtJKkk+QSpBK2oqaiYmKEM9RSxTPWspLHtjeDpDLGN5OlMseDAxOi1jLHkwMTotZix4MTE6QyooaS93LTEpLHkxMTpTKihpL3ctMSl9fXZhciBKYT1mdW5jdGlvbigpe3ZhciB0PUdhLGU9UWEsbj1OYSgwKSxyPW51bGwsaT1LYSxvPVphLGE9WGEscz1udWxsO2Z1bmN0aW9uIHUoKXt2YXIgdSxsLGMsZj0rdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD0rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1XYSxwPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLVdhLG09UmEocC1kKSx5PXA+ZDtpZihzfHwocz11PWJyKCkpLGg8ZiYmKGw9aCxoPWYsZj1sKSxoPkJhKWlmKG0+cWEtQmEpcy5tb3ZlVG8oaCpMYShkKSxoKlVhKGQpKSxzLmFyYygwLDAsaCxkLHAsIXkpLGY+QmEmJihzLm1vdmVUbyhmKkxhKHApLGYqVWEocCkpLHMuYXJjKDAsMCxmLHAsZCx5KSk7ZWxzZXt2YXIgZyx2LGI9ZCxfPXAsdz1kLHg9cCxPPW0sQz1tLFM9YS5hcHBseSh0aGlzLGFyZ3VtZW50cykvMixFPVM+QmEmJihyPytyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp6YShmKmYraCpoKSksaz1WYShSYShoLWYpLzIsK24uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxUPWssST1rO2lmKEU+QmEpe3ZhciBBPVlhKEUvZipVYShTKSksaj1ZYShFL2gqVWEoUykpOyhPLT0yKkEpPkJhPyh3Kz1BKj15PzE6LTEseC09QSk6KE89MCx3PXg9KGQrcCkvMiksKEMtPTIqaik+QmE/KGIrPWoqPXk/MTotMSxfLT1qKTooQz0wLGI9Xz0oZCtwKS8yKX12YXIgUD1oKkxhKGIpLE09aCpVYShiKSxOPWYqTGEoeCksUj1mKlVhKHgpO2lmKGs+QmEpe3ZhciBEPWgqTGEoXyksTD1oKlVhKF8pLEY9ZipMYSh3KSxWPWYqVWEodyk7aWYobTxIYSl7dmFyIFU9Tz5CYT9mdW5jdGlvbih0LGUsbixyLGksbyxhLHMpe3ZhciB1PUYtUCxsPVYtTSxjPWEtRCxmPXMtTCxoPShjKihNLUwpLWYqKFAtRCkpLyhmKnUtYypsKTtyZXR1cm5bUCtoKnUsTStoKmxdfSgwLDAsMCwwLDAsMCxOLFIpOltOLFJdLHo9UC1VWzBdLEI9TS1VWzFdLEg9RC1VWzBdLFc9TC1VWzFdLHE9MS9VYSgoKGM9KHoqSCtCKlcpLyh6YSh6KnorQipCKSp6YShIKkgrVypXKSkpPjE/MDpjPC0xP0hhOk1hdGguYWNvcyhjKSkvMiksWT16YShVWzBdKlVbMF0rVVsxXSpVWzFdKTtUPVZhKGssKGYtWSkvKHEtMSkpLEk9VmEoaywoaC1ZKS8ocSsxKSl9fUM+QmE/ST5CYT8oZz0kYShGLFYsUCxNLGgsSSx5KSx2PSRhKEQsTCxOLFIsaCxJLHkpLHMubW92ZVRvKGcuY3grZy54MDEsZy5jeStnLnkwMSksSTxrP3MuYXJjKGcuY3gsZy5jeSxJLERhKGcueTAxLGcueDAxKSxEYSh2LnkwMSx2LngwMSksIXkpOihzLmFyYyhnLmN4LGcuY3ksSSxEYShnLnkwMSxnLngwMSksRGEoZy55MTEsZy54MTEpLCF5KSxzLmFyYygwLDAsaCxEYShnLmN5K2cueTExLGcuY3grZy54MTEpLERhKHYuY3krdi55MTEsdi5jeCt2LngxMSksIXkpLHMuYXJjKHYuY3gsdi5jeSxJLERhKHYueTExLHYueDExKSxEYSh2LnkwMSx2LngwMSksIXkpKSk6KHMubW92ZVRvKFAsTSkscy5hcmMoMCwwLGgsYixfLCF5KSk6cy5tb3ZlVG8oUCxNKSxmPkJhJiZPPkJhP1Q+QmE/KGc9JGEoTixSLEQsTCxmLC1ULHkpLHY9JGEoUCxNLEYsVixmLC1ULHkpLHMubGluZVRvKGcuY3grZy54MDEsZy5jeStnLnkwMSksVDxrP3MuYXJjKGcuY3gsZy5jeSxULERhKGcueTAxLGcueDAxKSxEYSh2LnkwMSx2LngwMSksIXkpOihzLmFyYyhnLmN4LGcuY3ksVCxEYShnLnkwMSxnLngwMSksRGEoZy55MTEsZy54MTEpLCF5KSxzLmFyYygwLDAsZixEYShnLmN5K2cueTExLGcuY3grZy54MTEpLERhKHYuY3krdi55MTEsdi5jeCt2LngxMSkseSkscy5hcmModi5jeCx2LmN5LFQsRGEodi55MTEsdi54MTEpLERhKHYueTAxLHYueDAxKSwheSkpKTpzLmFyYygwLDAsZix4LHcseSk6cy5saW5lVG8oTixSKX1lbHNlIHMubW92ZVRvKDAsMCk7aWYocy5jbG9zZVBhdGgoKSx1KXJldHVybiBzPW51bGwsdSsiInx8bnVsbH1yZXR1cm4gdS5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBuPSgrdC5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixyPSgraS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1IYS8yO3JldHVybltMYShyKSpuLFVhKHIpKm5dfSx1LmlubmVyUmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6TmEoK2UpLHUpOnR9LHUub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOYSgrdCksdSk6ZX0sdS5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOYSgrdCksdSk6bn0sdS5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TmEoK3QpLHUpOnJ9LHUuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5hKCt0KSx1KTppfSx1LmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TmEoK3QpLHUpOm99LHUucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOYSgrdCksdSk6YX0sdS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW51bGw9PXQ/bnVsbDp0LHUpOnN9LHV9O2Z1bmN0aW9uIHRzKHQpe3RoaXMuX2NvbnRleHQ9dH10cy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8odCxlKX19fTt2YXIgZXM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB0cyh0KX07ZnVuY3Rpb24gbnModCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gcnModCl7cmV0dXJuIHRbMV19dmFyIGlzPWZ1bmN0aW9uKCl7dmFyIHQ9bnMsZT1ycyxuPU5hKCEwKSxyPW51bGwsaT1lcyxvPW51bGw7ZnVuY3Rpb24gYShhKXt2YXIgcyx1LGwsYz1hLmxlbmd0aCxmPSExO2ZvcihudWxsPT1yJiYobz1pKGw9YnIoKSkpLHM9MDtzPD1jOysrcykhKHM8YyYmbih1PWFbc10scyxhKSk9PT1mJiYoKGY9IWYpP28ubGluZVN0YXJ0KCk6by5saW5lRW5kKCkpLGYmJm8ucG9pbnQoK3QodSxzLGEpLCtlKHUscyxhKSk7aWYobClyZXR1cm4gbz1udWxsLGwrIiJ8fG51bGx9cmV0dXJuIGEueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOk5hKCtlKSxhKTp0fSxhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOYSgrdCksYSk6ZX0sYS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TmEoISF0KSxhKTpufSxhLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbnVsbCE9ciYmKG89aShyKSksYSk6aX0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P3I9bz1udWxsOm89aShyPXQpLGEpOnJ9LGF9LG9zPWZ1bmN0aW9uKCl7dmFyIHQ9bnMsZT1udWxsLG49TmEoMCkscj1ycyxpPU5hKCEwKSxvPW51bGwsYT1lcyxzPW51bGw7ZnVuY3Rpb24gdSh1KXt2YXIgbCxjLGYsaCxkLHA9dS5sZW5ndGgsbT0hMSx5PW5ldyBBcnJheShwKSxnPW5ldyBBcnJheShwKTtmb3IobnVsbD09byYmKHM9YShkPWJyKCkpKSxsPTA7bDw9cDsrK2wpe2lmKCEobDxwJiZpKGg9dVtsXSxsLHUpKT09PW0paWYobT0hbSljPWwscy5hcmVhU3RhcnQoKSxzLmxpbmVTdGFydCgpO2Vsc2V7Zm9yKHMubGluZUVuZCgpLHMubGluZVN0YXJ0KCksZj1sLTE7Zj49YzstLWYpcy5wb2ludCh5W2ZdLGdbZl0pO3MubGluZUVuZCgpLHMuYXJlYUVuZCgpfW0mJih5W2xdPSt0KGgsbCx1KSxnW2xdPStuKGgsbCx1KSxzLnBvaW50KGU/K2UoaCxsLHUpOnlbbF0scj8rcihoLGwsdSk6Z1tsXSkpfWlmKGQpcmV0dXJuIHM9bnVsbCxkKyIifHxudWxsfWZ1bmN0aW9uIGwoKXtyZXR1cm4gaXMoKS5kZWZpbmVkKGkpLmN1cnZlKGEpLmNvbnRleHQobyl9cmV0dXJuIHUueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOk5hKCtuKSxlPW51bGwsdSk6dH0sdS54MD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOk5hKCtlKSx1KTp0fSx1LngxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5hKCt0KSx1KTplfSx1Lnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOYSgrdCkscj1udWxsLHUpOm59LHUueTA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOYSgrdCksdSk6bn0sdS55MT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT10P251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOYSgrdCksdSk6cn0sdS5saW5lWDA9dS5saW5lWTA9ZnVuY3Rpb24oKXtyZXR1cm4gbCgpLngodCkueShuKX0sdS5saW5lWTE9ZnVuY3Rpb24oKXtyZXR1cm4gbCgpLngodCkueShyKX0sdS5saW5lWDE9ZnVuY3Rpb24oKXtyZXR1cm4gbCgpLngoZSkueShuKX0sdS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TmEoISF0KSx1KTppfSx1LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbnVsbCE9byYmKHM9YShvKSksdSk6YX0sdS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P289cz1udWxsOnM9YShvPXQpLHUpOm99LHV9O2Z1bmN0aW9uIGFzKHQpe3RoaXMuX2N1cnZlPXR9YXMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhU3RhcnQoKX0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmFyZWFFbmQoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5saW5lRW5kKCl9LHBvaW50OmZ1bmN0aW9uKHQsZSl7dGhpcy5fY3VydmUucG9pbnQoZSpNYXRoLnNpbih0KSxlKi1NYXRoLmNvcyh0KSl9fSxBcnJheSxNYXRoLnNxcnQoMS8zKSxNYXRoLnNpbihIYS8xMCksTWF0aC5zaW4oNypIYS8xMCk7dmFyIHNzPShNYXRoLnNpbihxYS8xMCksTWF0aC5jb3MocWEvMTApLE1hdGguc3FydCgzKSxNYXRoLnNxcnQoMyksTWF0aC5zcXJ0KDEyKSxmdW5jdGlvbigpe30pO2Z1bmN0aW9uIHVzKHQsZSxuKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oKDIqdC5feDArdC5feDEpLzMsKDIqdC5feTArdC5feTEpLzMsKHQuX3gwKzIqdC5feDEpLzMsKHQuX3kwKzIqdC5feTEpLzMsKHQuX3gwKzQqdC5feDErZSkvNiwodC5feTArNCp0Ll95MStuKS82KX1mdW5jdGlvbiBscyh0KXt0aGlzLl9jb250ZXh0PXR9bHMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMzp1cyh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKTtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godD0rdCxlPStlLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9jb250ZXh0LmxpbmVUbygoNSp0aGlzLl94MCt0aGlzLl94MSkvNiwoNSp0aGlzLl95MCt0aGlzLl95MSkvNik7ZGVmYXVsdDp1cyh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1lfX07dmFyIGNzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbHModCl9O2Z1bmN0aW9uIGZzKHQsZSl7dGhpcy5fYmFzaXM9bmV3IGxzKHQpLHRoaXMuX2JldGE9ZX1mdW5jdGlvbiBocyh0LGUsbil7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtZSksdC5feTIrdC5fayoodC5feTEtbiksdC5feDIsdC5feTIpfWZ1bmN0aW9uIGRzKHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtZSkvNn1mdW5jdGlvbiBwcyh0LGUpe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLWUpLzZ9ZnVuY3Rpb24gbXModCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1lKS82fWZ1bmN0aW9uIHlzKHQsZSxuKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsYT10Ll95MjtpZih0Ll9sMDFfYT5CYSl7dmFyIHM9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsdT0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ocipzLXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL3UsaT0oaSpzLXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL3V9aWYodC5fbDIzX2E+QmEpe3ZhciBsPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLGM9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qbCt0Ll94MSp0Ll9sMjNfMmEtZSp0Ll9sMTJfMmEpL2MsYT0oYSpsK3QuX3kxKnQuX2wyM18yYS1uKnQuX2wxMl8yYSkvY310Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sYSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gZ3ModCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9ZX1mdW5jdGlvbiB2cyh0LGUpe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1lfWZ1bmN0aW9uIGJzKHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPWV9ZnVuY3Rpb24gX3ModCl7cmV0dXJuIHQ8MD8tMToxfWZ1bmN0aW9uIHdzKHQsZSxuKXt2YXIgcj10Ll94MS10Ll94MCxpPWUtdC5feDEsbz0odC5feTEtdC5feTApLyhyfHxpPDAmJi0wKSxhPShuLXQuX3kxKS8oaXx8cjwwJiYtMCkscz0obyppK2EqcikvKHIraSk7cmV0dXJuKF9zKG8pK19zKGEpKSpNYXRoLm1pbihNYXRoLmFicyhvKSxNYXRoLmFicyhhKSwuNSpNYXRoLmFicyhzKSl8fDB9ZnVuY3Rpb24geHModCxlKXt2YXIgbj10Ll94MS10Ll94MDtyZXR1cm4gbj8oMyoodC5feTEtdC5feTApL24tZSkvMjplfWZ1bmN0aW9uIE9zKHQsZSxuKXt2YXIgcj10Ll94MCxpPXQuX3gxLG89dC5feTEsYT0oaS1yKS8zO3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyK2EsdC5feTArYSplLGktYSxvLWEqbixpLG8pfWZ1bmN0aW9uIENzKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBTcyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gRXMoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBrcyh0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIFRzKHQsZSl7dmFyIG49ZSxyPWUuUixpPW4uVTtpP2kuTD09PW4/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksbi5VPXIsbi5SPXIuTCxuLlImJihuLlIuVT1uKSxyLkw9bn1mdW5jdGlvbiBJcyh0LGUpe3ZhciBuPWUscj1lLkwsaT1uLlU7aT9pLkw9PT1uP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLG4uVT1yLG4uTD1yLlIsbi5MJiYobi5MLlU9biksci5SPW59ZnVuY3Rpb24gQXModCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZzLnByb3RvdHlwZT17bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdLHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxlPXRoaXMuX3ksbj10Lmxlbmd0aC0xO2lmKG4+MClmb3IodmFyIHIsaT10WzBdLG89ZVswXSxhPXRbbl0taSxzPWVbbl0tbyx1PS0xOysrdTw9bjspdGhpcy5fYmFzaXMucG9pbnQodGhpcy5fYmV0YSp0W3VdKygxLXRoaXMuX2JldGEpKihpKyhyPXUvbikqYSksdGhpcy5fYmV0YSplW3VdKygxLXRoaXMuX2JldGEpKihvK3IqcykpO3RoaXMuX3g9dGhpcy5feT1udWxsLHRoaXMuX2Jhc2lzLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLl94LnB1c2goK3QpLHRoaXMuX3kucHVzaCgrZSl9fSxmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIDE9PT1lP25ldyBscyh0KTpuZXcgZnModCxlKX1yZXR1cm4gbi5iZXRhPWZ1bmN0aW9uKGUpe3JldHVybiB0KCtlKX0sbn0oLjg1KSxkcy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6aHModGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9ZTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OmhzKHRoaXMsdCxlKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPWV9fSxmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIG5ldyBkcyh0LGUpfXJldHVybiBuLnRlbnNpb249ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSgwKSxwcy5wcm90b3R5cGU9e2FyZWFTdGFydDpzcyxhcmVhRW5kOnNzLGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1lO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9ZSk7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1lO2JyZWFrO2RlZmF1bHQ6aHModGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19LGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gbmV3IHBzKHQsZSl9cmV0dXJuIG4udGVuc2lvbj1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KDApLG1zLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OmhzKHRoaXMsdCxlKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPWV9fSxmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIG5ldyBtcyh0LGUpfXJldHVybiBuLnRlbnNpb249ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSgwKSxncy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe2lmKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7dmFyIG49dGhpcy5feDItdCxyPXRoaXMuX3kyLWU7dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhuKm4rcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OnlzKHRoaXMsdCxlKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX0sZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBlP25ldyBncyh0LGUpOm5ldyBkcyh0LDApfXJldHVybiBuLmFscGhhPWZ1bmN0aW9uKGUpe3JldHVybiB0KCtlKX0sbn0oLjUpLHZzLnByb3RvdHlwZT17YXJlYVN0YXJ0OnNzLGFyZWFFbmQ6c3MsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtpZih0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe3ZhciBuPXRoaXMuX3gyLXQscj10aGlzLl95Mi1lO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3cobipuK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1lO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9ZSk7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1lO2JyZWFrO2RlZmF1bHQ6eXModGhpcyx0LGUpfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPWV9fSxmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGU/bmV3IHZzKHQsZSk6bmV3IHBzKHQsMCl9cmV0dXJuIG4uYWxwaGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSguNSksYnMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7aWYodD0rdCxlPStlLHRoaXMuX3BvaW50KXt2YXIgbj10aGlzLl94Mi10LHI9dGhpcy5feTItZTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KG4qbityKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OnlzKHRoaXMsdCxlKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX0sZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBlP25ldyBicyh0LGUpOm5ldyBtcyh0LDApfXJldHVybiBuLmFscGhhPWZ1bmN0aW9uKGUpe3JldHVybiB0KCtlKX0sbn0oLjUpLENzLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3QwPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpO2JyZWFrO2Nhc2UgMzpPcyh0aGlzLHRoaXMuX3QwLHhzKHRoaXMsdGhpcy5fdDApKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7dmFyIG49TmFOO2lmKGU9K2UsKHQ9K3QpIT09dGhpcy5feDF8fGUhPT10aGlzLl95MSl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MyxPcyh0aGlzLHhzKHRoaXMsbj13cyh0aGlzLHQsZSkpLG4pO2JyZWFrO2RlZmF1bHQ6T3ModGhpcyx0aGlzLl90MCxuPXdzKHRoaXMsdCxlKSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1lLHRoaXMuX3QwPW59fX0sKChmdW5jdGlvbih0KXt0aGlzLl9jb250ZXh0PW5ldyBTcyh0KX0pLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKENzLnByb3RvdHlwZSkpLnBvaW50PWZ1bmN0aW9uKHQsZSl7Q3MucHJvdG90eXBlLnBvaW50LmNhbGwodGhpcyxlLHQpfSxTcy5wcm90b3R5cGU9e21vdmVUbzpmdW5jdGlvbih0LGUpe3RoaXMuX2NvbnRleHQubW92ZVRvKGUsdCl9LGNsb3NlUGF0aDpmdW5jdGlvbigpe3RoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LGxpbmVUbzpmdW5jdGlvbih0LGUpe3RoaXMuX2NvbnRleHQubGluZVRvKGUsdCl9LGJlemllckN1cnZlVG86ZnVuY3Rpb24odCxlLG4scixpLG8pe3RoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhlLHQscixuLG8saSl9fSxFcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkVzLGluc2VydDpmdW5jdGlvbih0LGUpe3ZhciBuLHIsaTtpZih0KXtpZihlLlA9dCxlLk49dC5OLHQuTiYmKHQuTi5QPWUpLHQuTj1lLHQuUil7Zm9yKHQ9dC5SO3QuTDspdD10Lkw7dC5MPWV9ZWxzZSB0LlI9ZTtuPXR9ZWxzZSB0aGlzLl8/KHQ9QXModGhpcy5fKSxlLlA9bnVsbCxlLk49dCx0LlA9dC5MPWUsbj10KTooZS5QPWUuTj1udWxsLHRoaXMuXz1lLG49bnVsbCk7Zm9yKGUuTD1lLlI9bnVsbCxlLlU9bixlLkM9ITAsdD1lO24mJm4uQzspbj09PShyPW4uVSkuTD8oaT1yLlIpJiZpLkM/KG4uQz1pLkM9ITEsci5DPSEwLHQ9cik6KHQ9PT1uLlImJihUcyh0aGlzLG4pLG49KHQ9bikuVSksbi5DPSExLHIuQz0hMCxJcyh0aGlzLHIpKTooaT1yLkwpJiZpLkM/KG4uQz1pLkM9ITEsci5DPSEwLHQ9cik6KHQ9PT1uLkwmJihJcyh0aGlzLG4pLG49KHQ9bikuVSksbi5DPSExLHIuQz0hMCxUcyh0aGlzLHIpKSxuPXQuVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3QuTiYmKHQuTi5QPXQuUCksdC5QJiYodC5QLk49dC5OKSx0Lk49dC5QPW51bGw7dmFyIGUsbixyLGk9dC5VLG89dC5MLGE9dC5SO2lmKG49bz9hP0FzKGEpOm86YSxpP2kuTD09PXQ/aS5MPW46aS5SPW46dGhpcy5fPW4sbyYmYT8ocj1uLkMsbi5DPXQuQyxuLkw9byxvLlU9bixuIT09YT8oaT1uLlUsbi5VPXQuVSxpLkw9dD1uLlIsbi5SPWEsYS5VPW4pOihuLlU9aSxpPW4sdD1uLlIpKToocj10LkMsdD1uKSx0JiYodC5VPWkpLCFyKWlmKHQmJnQuQyl0LkM9ITE7ZWxzZXtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKChlPWkuUikuQyYmKGUuQz0hMSxpLkM9ITAsVHModGhpcyxpKSxlPWkuUiksZS5MJiZlLkwuQ3x8ZS5SJiZlLlIuQyl7ZS5SJiZlLlIuQ3x8KGUuTC5DPSExLGUuQz0hMCxJcyh0aGlzLGUpLGU9aS5SKSxlLkM9aS5DLGkuQz1lLlIuQz0hMSxUcyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKChlPWkuTCkuQyYmKGUuQz0hMSxpLkM9ITAsSXModGhpcyxpKSxlPWkuTCksZS5MJiZlLkwuQ3x8ZS5SJiZlLlIuQyl7ZS5MJiZlLkwuQ3x8KGUuUi5DPSExLGUuQz0hMCxUcyh0aGlzLGUpLGU9aS5MKSxlLkM9aS5DLGkuQz1lLkwuQz0hMSxJcyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfWUuQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIGpzPUVzO2Z1bmN0aW9uIFBzKHQsZSxuLHIpe3ZhciBpPVtudWxsLG51bGxdLG89dHUucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PWUsbiYmTnMoaSx0LGUsbiksciYmTnMoaSxlLHQsciksJHNbdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksJHNbZS5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBNcyh0LGUsbil7dmFyIHI9W2Usbl07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gTnModCxlLG4scil7dFswXXx8dFsxXT90LmxlZnQ9PT1uP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9ZSx0LnJpZ2h0PW4pfWZ1bmN0aW9uIFJzKHQsZSxuLHIsaSl7dmFyIG8sYT10WzBdLHM9dFsxXSx1PWFbMF0sbD1hWzFdLGM9MCxmPTEsaD1zWzBdLXUsZD1zWzFdLWw7aWYobz1lLXUsaHx8IShvPjApKXtpZihvLz1oLGg8MCl7aWYobzxjKXJldHVybjtvPGYmJihmPW8pfWVsc2UgaWYoaD4wKXtpZihvPmYpcmV0dXJuO28+YyYmKGM9byl9aWYobz1yLXUsaHx8IShvPDApKXtpZihvLz1oLGg8MCl7aWYobz5mKXJldHVybjtvPmMmJihjPW8pfWVsc2UgaWYoaD4wKXtpZihvPGMpcmV0dXJuO288ZiYmKGY9byl9aWYobz1uLWwsZHx8IShvPjApKXtpZihvLz1kLGQ8MCl7aWYobzxjKXJldHVybjtvPGYmJihmPW8pfWVsc2UgaWYoZD4wKXtpZihvPmYpcmV0dXJuO28+YyYmKGM9byl9aWYobz1pLWwsZHx8IShvPDApKXtpZihvLz1kLGQ8MCl7aWYobz5mKXJldHVybjtvPmMmJihjPW8pfWVsc2UgaWYoZD4wKXtpZihvPGMpcmV0dXJuO288ZiYmKGY9byl9cmV0dXJuIShjPjB8fGY8MSl8fChjPjAmJih0WzBdPVt1K2MqaCxsK2MqZF0pLGY8MSYmKHRbMV09W3UrZipoLGwrZipkXSksITApfX19fX1mdW5jdGlvbiBEcyh0LGUsbixyLGkpe3ZhciBvPXRbMV07aWYobylyZXR1cm4hMDt2YXIgYSxzLHU9dFswXSxsPXQubGVmdCxjPXQucmlnaHQsZj1sWzBdLGg9bFsxXSxkPWNbMF0scD1jWzFdLG09KGYrZCkvMix5PShoK3ApLzI7aWYocD09PWgpe2lmKG08ZXx8bT49cilyZXR1cm47aWYoZj5kKXtpZih1KXtpZih1WzFdPj1pKXJldHVybn1lbHNlIHU9W20sbl07bz1bbSxpXX1lbHNle2lmKHUpe2lmKHVbMV08bilyZXR1cm59ZWxzZSB1PVttLGldO289W20sbl19fWVsc2UgaWYocz15LShhPShmLWQpLyhwLWgpKSptLGE8LTF8fGE+MSlpZihmPmQpe2lmKHUpe2lmKHVbMV0+PWkpcmV0dXJufWVsc2UgdT1bKG4tcykvYSxuXTtvPVsoaS1zKS9hLGldfWVsc2V7aWYodSl7aWYodVsxXTxuKXJldHVybn1lbHNlIHU9WyhpLXMpL2EsaV07bz1bKG4tcykvYSxuXX1lbHNlIGlmKGg8cCl7aWYodSl7aWYodVswXT49cilyZXR1cm59ZWxzZSB1PVtlLGEqZStzXTtvPVtyLGEqcitzXX1lbHNle2lmKHUpe2lmKHVbMF08ZSlyZXR1cm59ZWxzZSB1PVtyLGEqcitzXTtvPVtlLGEqZStzXX1yZXR1cm4gdFswXT11LHRbMV09bywhMH1mdW5jdGlvbiBMcyh0LGUpe3ZhciBuPXQuc2l0ZSxyPWUubGVmdCxpPWUucmlnaHQ7cmV0dXJuIG49PT1pJiYoaT1yLHI9biksaT9NYXRoLmF0YW4yKGlbMV0tclsxXSxpWzBdLXJbMF0pOihuPT09cj8ocj1lWzFdLGk9ZVswXSk6KHI9ZVswXSxpPWVbMV0pLE1hdGguYXRhbjIoclswXS1pWzBdLGlbMV0tclsxXSkpfWZ1bmN0aW9uIEZzKHQsZSl7cmV0dXJuIGVbKyhlLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiBWcyh0LGUpe3JldHVybiBlWysoZS5sZWZ0PT09dC5zaXRlKV19dmFyIFVzLHpzPVtdO2Z1bmN0aW9uIEJzKHQpe3ZhciBlPXQuUCxuPXQuTjtpZihlJiZuKXt2YXIgcj1lLnNpdGUsaT10LnNpdGUsbz1uLnNpdGU7aWYociE9PW8pe3ZhciBhPWlbMF0scz1pWzFdLHU9clswXS1hLGw9clsxXS1zLGM9b1swXS1hLGY9b1sxXS1zLGg9MioodSpmLWwqYyk7aWYoIShoPj0tbnUpKXt2YXIgZD11KnUrbCpsLHA9YypjK2YqZixtPShmKmQtbCpwKS9oLHk9KHUqcC1jKmQpL2gsZz16cy5wb3AoKXx8bmV3IGZ1bmN0aW9uKCl7a3ModGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfTtnLmFyYz10LGcuc2l0ZT1pLGcueD1tK2EsZy55PShnLmN5PXkrcykrTWF0aC5zcXJ0KG0qbSt5KnkpLHQuY2lyY2xlPWc7Zm9yKHZhciB2PW51bGwsYj1Kcy5fO2I7KWlmKGcueTxiLnl8fGcueT09PWIueSYmZy54PD1iLngpe2lmKCFiLkwpe3Y9Yi5QO2JyZWFrfWI9Yi5MfWVsc2V7aWYoIWIuUil7dj1iO2JyZWFrfWI9Yi5SfUpzLmluc2VydCh2LGcpLHZ8fChVcz1nKX19fX1mdW5jdGlvbiBIcyh0KXt2YXIgZT10LmNpcmNsZTtlJiYoZS5QfHwoVXM9ZS5OKSxKcy5yZW1vdmUoZSksenMucHVzaChlKSxrcyhlKSx0LmNpcmNsZT1udWxsKX12YXIgV3M9W107ZnVuY3Rpb24gcXModCl7dmFyIGU9V3MucG9wKCl8fG5ldyBmdW5jdGlvbigpe2tzKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH07cmV0dXJuIGUuc2l0ZT10LGV9ZnVuY3Rpb24gWXModCl7SHModCksWHMucmVtb3ZlKHQpLFdzLnB1c2godCksa3ModCl9ZnVuY3Rpb24gR3ModCl7dmFyIGU9dC5jaXJjbGUsbj1lLngscj1lLmN5LGk9W24scl0sbz10LlAsYT10Lk4scz1bdF07WXModCk7Zm9yKHZhciB1PW87dS5jaXJjbGUmJk1hdGguYWJzKG4tdS5jaXJjbGUueCk8ZXUmJk1hdGguYWJzKHItdS5jaXJjbGUuY3kpPGV1OylvPXUuUCxzLnVuc2hpZnQodSksWXModSksdT1vO3MudW5zaGlmdCh1KSxIcyh1KTtmb3IodmFyIGw9YTtsLmNpcmNsZSYmTWF0aC5hYnMobi1sLmNpcmNsZS54KTxldSYmTWF0aC5hYnMoci1sLmNpcmNsZS5jeSk8ZXU7KWE9bC5OLHMucHVzaChsKSxZcyhsKSxsPWE7cy5wdXNoKGwpLEhzKGwpO3ZhciBjLGY9cy5sZW5ndGg7Zm9yKGM9MTtjPGY7KytjKU5zKChsPXNbY10pLmVkZ2UsKHU9c1tjLTFdKS5zaXRlLGwuc2l0ZSxpKTsobD1zW2YtMV0pLmVkZ2U9UHMoKHU9c1swXSkuc2l0ZSxsLnNpdGUsbnVsbCxpKSxCcyh1KSxCcyhsKX1mdW5jdGlvbiBRcyh0KXtmb3IodmFyIGUsbixyLGksbz10WzBdLGE9dFsxXSxzPVhzLl87czspaWYoKHI9S3MocyxhKS1vKT5ldSlzPXMuTDtlbHNle2lmKCEoKGk9by1acyhzLGEpKT5ldSkpe3I+LWV1PyhlPXMuUCxuPXMpOmk+LWV1PyhlPXMsbj1zLk4pOmU9bj1zO2JyZWFrfWlmKCFzLlIpe2U9czticmVha31zPXMuUn0hZnVuY3Rpb24odCl7JHNbdC5pbmRleF09e3NpdGU6dCxoYWxmZWRnZXM6W119fSh0KTt2YXIgdT1xcyh0KTtpZihYcy5pbnNlcnQoZSx1KSxlfHxuKXtpZihlPT09bilyZXR1cm4gSHMoZSksbj1xcyhlLnNpdGUpLFhzLmluc2VydCh1LG4pLHUuZWRnZT1uLmVkZ2U9UHMoZS5zaXRlLHUuc2l0ZSksQnMoZSksdm9pZCBCcyhuKTtpZihuKXtIcyhlKSxIcyhuKTt2YXIgbD1lLnNpdGUsYz1sWzBdLGY9bFsxXSxoPXRbMF0tYyxkPXRbMV0tZixwPW4uc2l0ZSxtPXBbMF0tYyx5PXBbMV0tZixnPTIqKGgqeS1kKm0pLHY9aCpoK2QqZCxiPW0qbSt5KnksXz1bKHkqdi1kKmIpL2crYywoaCpiLW0qdikvZytmXTtOcyhuLmVkZ2UsbCxwLF8pLHUuZWRnZT1QcyhsLHQsbnVsbCxfKSxuLmVkZ2U9UHModCxwLG51bGwsXyksQnMoZSksQnMobil9ZWxzZSB1LmVkZ2U9UHMoZS5zaXRlLHUuc2l0ZSl9fWZ1bmN0aW9uIEtzKHQsZSl7dmFyIG49dC5zaXRlLHI9blswXSxpPW5bMV0sbz1pLWU7aWYoIW8pcmV0dXJuIHI7dmFyIGE9dC5QO2lmKCFhKXJldHVybi0xLzA7dmFyIHM9KG49YS5zaXRlKVswXSx1PW5bMV0sbD11LWU7aWYoIWwpcmV0dXJuIHM7dmFyIGM9cy1yLGY9MS9vLTEvbCxoPWMvbDtyZXR1cm4gZj8oLWgrTWF0aC5zcXJ0KGgqaC0yKmYqKGMqYy8oLTIqbCktdStsLzIraS1vLzIpKSkvZityOihyK3MpLzJ9ZnVuY3Rpb24gWnModCxlKXt2YXIgbj10Lk47aWYobilyZXR1cm4gS3MobixlKTt2YXIgcj10LnNpdGU7cmV0dXJuIHJbMV09PT1lP3JbMF06MS8wfXZhciBYcywkcyxKcyx0dSxldT0xZS02LG51PTFlLTEyO2Z1bmN0aW9uIHJ1KHQsZSl7cmV0dXJuIGVbMV0tdFsxXXx8ZVswXS10WzBdfWZ1bmN0aW9uIGl1KHQsZSl7dmFyIG4scixpLG89dC5zb3J0KHJ1KS5wb3AoKTtmb3IodHU9W10sJHM9bmV3IEFycmF5KHQubGVuZ3RoKSxYcz1uZXcganMsSnM9bmV3IGpzOzspaWYoaT1VcyxvJiYoIWl8fG9bMV08aS55fHxvWzFdPT09aS55JiZvWzBdPGkueCkpb1swXT09PW4mJm9bMV09PT1yfHwoUXMobyksbj1vWzBdLHI9b1sxXSksbz10LnBvcCgpO2Vsc2V7aWYoIWkpYnJlYWs7R3MoaS5hcmMpfWlmKGZ1bmN0aW9uKCl7Zm9yKHZhciB0LGUsbixyLGk9MCxvPSRzLmxlbmd0aDtpPG87KytpKWlmKCh0PSRzW2ldKSYmKHI9KGU9dC5oYWxmZWRnZXMpLmxlbmd0aCkpe3ZhciBhPW5ldyBBcnJheShyKSxzPW5ldyBBcnJheShyKTtmb3Iobj0wO248cjsrK24pYVtuXT1uLHNbbl09THModCx0dVtlW25dXSk7Zm9yKGEuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBzW2VdLXNbdF19KSxuPTA7bjxyOysrbilzW25dPWVbYVtuXV07Zm9yKG49MDtuPHI7KytuKWVbbl09c1tuXX19KCksZSl7dmFyIGE9K2VbMF1bMF0scz0rZVswXVsxXSx1PStlWzFdWzBdLGw9K2VbMV1bMV07IWZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaSxvPXR1Lmxlbmd0aDtvLS07KURzKGk9dHVbb10sdCxlLG4scikmJlJzKGksdCxlLG4scikmJihNYXRoLmFicyhpWzBdWzBdLWlbMV1bMF0pPmV1fHxNYXRoLmFicyhpWzBdWzFdLWlbMV1bMV0pPmV1KXx8ZGVsZXRlIHR1W29dfShhLHMsdSxsKSxmdW5jdGlvbih0LGUsbixyKXt2YXIgaSxvLGEscyx1LGwsYyxmLGgsZCxwLG0seT0kcy5sZW5ndGgsZz0hMDtmb3IoaT0wO2k8eTsrK2kpaWYobz0kc1tpXSl7Zm9yKGE9by5zaXRlLHM9KHU9by5oYWxmZWRnZXMpLmxlbmd0aDtzLS07KXR1W3Vbc11dfHx1LnNwbGljZShzLDEpO2ZvcihzPTAsbD11Lmxlbmd0aDtzPGw7KXA9KGQ9VnMobyx0dVt1W3NdXSkpWzBdLG09ZFsxXSxmPShjPUZzKG8sdHVbdVsrK3MlbF1dKSlbMF0saD1jWzFdLChNYXRoLmFicyhwLWYpPmV1fHxNYXRoLmFicyhtLWgpPmV1KSYmKHUuc3BsaWNlKHMsMCx0dS5wdXNoKE1zKGEsZCxNYXRoLmFicyhwLXQpPGV1JiZyLW0+ZXU/W3QsTWF0aC5hYnMoZi10KTxldT9oOnJdOk1hdGguYWJzKG0tcik8ZXUmJm4tcD5ldT9bTWF0aC5hYnMoaC1yKTxldT9mOm4scl06TWF0aC5hYnMocC1uKTxldSYmbS1lPmV1P1tuLE1hdGguYWJzKGYtbik8ZXU/aDplXTpNYXRoLmFicyhtLWUpPGV1JiZwLXQ+ZXU/W01hdGguYWJzKGgtZSk8ZXU/Zjp0LGVdOm51bGwpKS0xKSwrK2wpO2wmJihnPSExKX1pZihnKXt2YXIgdixiLF8sdz0xLzA7Zm9yKGk9MCxnPW51bGw7aTx5OysraSkobz0kc1tpXSkmJihfPSh2PShhPW8uc2l0ZSlbMF0tdCkqdisoYj1hWzFdLWUpKmIpPHcmJih3PV8sZz1vKTtpZihnKXt2YXIgeD1bdCxlXSxPPVt0LHJdLEM9W24scl0sUz1bbixlXTtnLmhhbGZlZGdlcy5wdXNoKHR1LnB1c2goTXMoYT1nLnNpdGUseCxPKSktMSx0dS5wdXNoKE1zKGEsTyxDKSktMSx0dS5wdXNoKE1zKGEsQyxTKSktMSx0dS5wdXNoKE1zKGEsUyx4KSktMSl9fWZvcihpPTA7aTx5OysraSkobz0kc1tpXSkmJihvLmhhbGZlZGdlcy5sZW5ndGh8fGRlbGV0ZSAkc1tpXSl9KGEscyx1LGwpfXRoaXMuZWRnZXM9dHUsdGhpcy5jZWxscz0kcyxYcz1Kcz10dT0kcz1udWxsfWZ1bmN0aW9uIG91KHQsZSxuKXt0aGlzLms9dCx0aGlzLng9ZSx0aGlzLnk9bn1mdW5jdGlvbiBhdSh0LGUsbil7dmFyIHIsaT1LdCh0KSxvPU1hdGgubWluKHBhcnNlSW50KGkuc3R5bGUoIndpZHRoIikpLHBhcnNlSW50KGkuc3R5bGUoImhlaWdodCIpKSkvMixhPXBhcnNlSW50KGkuc3R5bGUoIndpZHRoIikpLzItbyxzPXBhcnNlSW50KGkuc3R5bGUoImhlaWdodCIpKS8yLW8sdT1NYXRoLm1heChuLm1pblZhbHVlLE1hdGgubWluKG4ubWF4VmFsdWUsZSkpL24ubWF4VmFsdWUsbD1NYXRoLmZsb29yKDEwMCpNYXRoLnJhbmRvbSgpKSsxO3I9bi53YXZlSGVpZ2h0U2NhbGluZz9HaSgpLnJhbmdlKFswLG4ud2F2ZUhlaWdodCwwXSkuZG9tYWluKFswLDUwLDEwMF0pOkdpKCkucmFuZ2UoW24ud2F2ZUhlaWdodCxuLndhdmVIZWlnaHRdKS5kb21haW4oWzAsMTAwXSk7dmFyIGM9bi50ZXh0U2l6ZSpvLzIsZj1wYXJzZUZsb2F0KGUpLnRvRml4ZWQoMiksaD1uLnZhbHVlQ291bnRVcD9uLm1pblZhbHVlOmYsZD1uLmRpc3BsYXlQZXJjZW50P24uY3VzdG9tUGVyY2VudDoiIixwPW4uY2lyY2xlVGhpY2tuZXNzKm8sbT1wK24uY2lyY2xlRmlsbEdhcCpvLHk9by1tLGc9eSpyKDEwMCp1KSx2PTErbi53YXZlQ291bnQsYj0yKnkvbi53YXZlQ291bnQqdixfPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpfTtwYXJzZUZsb2F0KGYpIT1wYXJzZUZsb2F0KF8oZikpJiYoXz1mdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VGbG9hdCh0KS50b0ZpeGVkKDEpfSkscGFyc2VGbG9hdChmKSE9cGFyc2VGbG9hdChfKGYpKSYmKF89ZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlRmxvYXQodCkudG9GaXhlZCgyKX0pO2Zvcih2YXIgdz1bXSx4PTA7eDw9NDAqdjt4Kyspdy5wdXNoKHt4OngvKDQwKnYpLHk6eC80MH0pO3ZhciBPPUdpKCkucmFuZ2UoWzAsMipNYXRoLlBJXSkuZG9tYWluKFswLDFdKSxDPUdpKCkucmFuZ2UoWzAsb10pLmRvbWFpbihbMCxvXSksUz1HaSgpLnJhbmdlKFswLGJdKS5kb21haW4oWzAsMV0pLEU9R2koKS5yYW5nZShbMCxnXSkuZG9tYWluKFswLDFdKSxrPUdpKCkucmFuZ2UoW20rMip5K2csbS1nXSkuZG9tYWluKFswLDFdKSxUPUdpKCkucmFuZ2UoWzAsYi0yKnldKS5kb21haW4oWzAsMV0pLEk9R2koKS5yYW5nZShbbSsyKnksbSsuNypjXSkuZG9tYWluKFswLDFdKSxBPWkuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrYSsiLCIrcysiKSIpLGo9SmEoKS5zdGFydEFuZ2xlKE8oMCkpLmVuZEFuZ2xlKE8oMSkpLm91dGVyUmFkaXVzKEMobykpLmlubmVyUmFkaXVzKEMoby1wKSk7QS5hcHBlbmQoInBhdGgiKS5hdHRyKCJkIixqKS5zdHlsZSgiZmlsbCIsbi5jaXJjbGVDb2xvcikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbysiLCIrbysiKSIpO3ZhciBQPUEuYXBwZW5kKCJ0ZXh0IikudGV4dChfKGgpK2QpLmF0dHIoImNsYXNzIiwibGlxdWlkRmlsbEdhdWdlVGV4dCIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigiZm9udC1zaXplIixjKyJweCIpLnN0eWxlKCJmaWxsIixuLnRleHRDb2xvcikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbysiLCIrSShuLnRleHRWZXJ0UG9zaXRpb24pKyIpIiksTT1vcygpLngoZnVuY3Rpb24odCl7cmV0dXJuIFModC54KX0pLnkwKGZ1bmN0aW9uKHQpe3JldHVybiBFKE1hdGguc2luKDIqTWF0aC5QSSpuLndhdmVPZmZzZXQqLTErMipNYXRoLlBJKigxLW4ud2F2ZUNvdW50KSsyKnQueSpNYXRoLlBJKSl9KS55MShmdW5jdGlvbih0KXtyZXR1cm4gMip5K2d9KSxOPUEuYXBwZW5kKCJkZWZzIikuYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIiwiY2xpcFdhdmUiK2wudG9TdHJpbmcoKSksUj1OLmFwcGVuZCgicGF0aCIpLmRhdHVtKHcpLmF0dHIoImQiLE0pLmF0dHIoIlQiLDApLEQ9QS5hcHBlbmQoImciKS5hdHRyKCJjbGlwLXBhdGgiLCJ1cmwoI2NsaXBXYXZlIitsLnRvU3RyaW5nKCkrIikiKTtELmFwcGVuZCgiY2lyY2xlIikuYXR0cigiY3giLG8pLmF0dHIoImN5IixvKS5hdHRyKCJyIix5KS5zdHlsZSgiZmlsbCIsbi53YXZlQ29sb3IpO3ZhciBMPUQuYXBwZW5kKCJ0ZXh0IikudGV4dChfKGgpK2QpLmF0dHIoImNsYXNzIiwibGlxdWlkRmlsbEdhdWdlVGV4dCIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigiZm9udC1zaXplIixjKyJweCIpLnN0eWxlKCJmaWxsIixuLndhdmVUZXh0Q29sb3IpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK28rIiwiK0kobi50ZXh0VmVydFBvc2l0aW9uKSsiKSIpO2lmKG4udmFsdWVDb3VudFVwKXt2YXIgRj1mdW5jdGlvbigpe3ZhciB0PWhuKGgsZik7cmV0dXJuIGZ1bmN0aW9uKGUpe1AudGV4dChfKHQoZSkpK2QpLEwudGV4dChfKHQoZSkpK2QpfX07UC50cmFuc2l0aW9uKCkuZHVyYXRpb24obi53YXZlUmlzZVRpbWUpLnR3ZWVuKCJ0ZXh0IixGKSxMLnRyYW5zaXRpb24oKS5kdXJhdGlvbihuLndhdmVSaXNlVGltZSkudHdlZW4oInRleHQiLEYpfXZhciBWPW0rMip5LWI7ZnVuY3Rpb24gVSgpe1IuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrVChSLmF0dHIoIlQiKSkrIiwwKSIpLFIudHJhbnNpdGlvbigpLmR1cmF0aW9uKG4ud2F2ZUFuaW1hdGVUaW1lKigxLVIuYXR0cigiVCIpKSkuZWFzZShscikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrVCgxKSsiLDApIikuYXR0cigiVCIsMSkub24oImVuZCIsZnVuY3Rpb24oKXtSLmF0dHIoIlQiLDApLFUoKX0pfXJldHVybiBuLndhdmVSaXNlP04uYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrVisiLCIraygwKSsiKSIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihuLndhdmVSaXNlVGltZSkuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrVisiLCIrayh1KSsiKSIpLm9uKCJzdGFydCIsZnVuY3Rpb24oKXtSLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgxLDApIil9KTpOLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK1YrIiwiK2sodSkrIikiKSxuLndhdmVBbmltYXRlJiZVKCkse3VwZGF0ZSh0KXt2YXIgZT1wYXJzZUZsb2F0KHQpLnRvRml4ZWQoMiksaT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KX07cGFyc2VGbG9hdChlKSE9cGFyc2VGbG9hdChpKGUpKSYmKGk9ZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlRmxvYXQodCkudG9GaXhlZCgxKX0pLHBhcnNlRmxvYXQoZSkhPXBhcnNlRmxvYXQoaShlKSkmJihpPWZ1bmN0aW9uKHQpe3JldHVybiBwYXJzZUZsb2F0KHQpLnRvRml4ZWQoMil9KTt2YXIgbz1mdW5jdGlvbigpe3ZhciBlPWhuKFAudGV4dCgpLHBhcnNlRmxvYXQodCkudG9GaXhlZCgyKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe1AudGV4dChpKGUodCkpK2QpLEwudGV4dChpKGUodCkpK2QpfX07UC50cmFuc2l0aW9uKCkuZHVyYXRpb24obi53YXZlUmlzZVRpbWUpLnR3ZWVuKCJ0ZXh0IixvKSxMLnRyYW5zaXRpb24oKS5kdXJhdGlvbihuLndhdmVSaXNlVGltZSkudHdlZW4oInRleHQiLG8pO3ZhciBhLHM9TWF0aC5tYXgobi5taW5WYWx1ZSxNYXRoLm1pbihuLm1heFZhbHVlLHQpKS9uLm1heFZhbHVlLHU9eSpyKDEwMCpzKSxsPUdpKCkucmFuZ2UoW20rMip5K3UsbS11XSkuZG9tYWluKFswLDFdKShzKSxjPUdpKCkucmFuZ2UoWzAsYl0pLmRvbWFpbihbMCwxXSksZj1HaSgpLnJhbmdlKFswLHVdKS5kb21haW4oWzAsMV0pO2E9bi53YXZlSGVpZ2h0U2NhbGluZz9Mci5hcmVhKCkueChmdW5jdGlvbih0KXtyZXR1cm4gYyh0LngpfSkueTAoZnVuY3Rpb24odCl7cmV0dXJuIGYoTWF0aC5zaW4oMipNYXRoLlBJKm4ud2F2ZU9mZnNldCotMSsyKk1hdGguUEkqKDEtbi53YXZlQ291bnQpKzIqdC55Kk1hdGguUEkpKX0pLnkxKGZ1bmN0aW9uKHQpe3JldHVybiAyKnkrdX0pOk07dmFyIGg9bi53YXZlQW5pbWF0ZT9UKDEpOjA7Ui50cmFuc2l0aW9uKCkuZHVyYXRpb24oMCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKG4ud2F2ZUFuaW1hdGU/bi53YXZlQW5pbWF0ZVRpbWUqKDEtUi5hdHRyKCJUIikpOm4ud2F2ZVJpc2VUaW1lKS5lYXNlKGxyKS5hdHRyKCJkIixhKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitoKyIsMCkiKS5hdHRyKCJUIiwiMSIpLm9uKCJlbmQiLGZ1bmN0aW9uKCl7bi53YXZlQW5pbWF0ZSYmKFIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrVCgwKSsiLDApIiksVSgpKX0pLE4udHJhbnNpdGlvbigpLmR1cmF0aW9uKG4ud2F2ZVJpc2VUaW1lKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitWKyIsIitsKyIpIil9fX1pdS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOml1LHBvbHlnb25zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lZGdlcztyZXR1cm4gdGhpcy5jZWxscy5tYXAoZnVuY3Rpb24oZSl7dmFyIG49ZS5oYWxmZWRnZXMubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBGcyhlLHRbbl0pfSk7cmV0dXJuIG4uZGF0YT1lLnNpdGUuZGF0YSxufSl9LHRyaWFuZ2xlczpmdW5jdGlvbigpe3ZhciB0PVtdLGU9dGhpcy5lZGdlcztyZXR1cm4gdGhpcy5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKG4scil7aWYobz0oaT1uLmhhbGZlZGdlcykubGVuZ3RoKWZvcih2YXIgaSxvLGEscyx1LGwsYz1uLnNpdGUsZj0tMSxoPWVbaVtvLTFdXSxkPWgubGVmdD09PWM/aC5yaWdodDpoLmxlZnQ7KytmPG87KWE9ZCxkPShoPWVbaVtmXV0pLmxlZnQ9PT1jP2gucmlnaHQ6aC5sZWZ0LGEmJmQmJnI8YS5pbmRleCYmcjxkLmluZGV4JiYoKHM9YylbMF0tKGw9ZClbMF0pKigodT1hKVsxXS1zWzFdKS0oc1swXS11WzBdKSoobFsxXS1zWzFdKTwwJiZ0LnB1c2goW2MuZGF0YSxhLmRhdGEsZC5kYXRhXSl9KSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSl9LGZpbmQ6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcixpLG89dGhpcyxhPW8uX2ZvdW5kfHwwLHM9by5jZWxscy5sZW5ndGg7IShpPW8uY2VsbHNbYV0pOylpZigrK2E+PXMpcmV0dXJuIG51bGw7dmFyIHU9dC1pLnNpdGVbMF0sbD1lLWkuc2l0ZVsxXSxjPXUqdStsKmw7ZG97aT1vLmNlbGxzW3I9YV0sYT1udWxsLGkuaGFsZmVkZ2VzLmZvckVhY2goZnVuY3Rpb24obil7dmFyIHI9by5lZGdlc1tuXSxzPXIubGVmdDtpZihzIT09aS5zaXRlJiZzfHwocz1yLnJpZ2h0KSl7dmFyIHU9dC1zWzBdLGw9ZS1zWzFdLGY9dSp1K2wqbDtmPGMmJihjPWYsYT1zLmluZGV4KX19KX13aGlsZShudWxsIT09YSk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09bnx8Yzw9bipuP2kuc2l0ZTpudWxsfX0sb3UucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvdSxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgb3UodGhpcy5rKnQsdGhpcy54LHRoaXMueSl9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiAwPT09dCYwPT09ZT90aGlzOm5ldyBvdSh0aGlzLmssdGhpcy54K3RoaXMuayp0LHRoaXMueSt0aGlzLmsqZSl9LGFwcGx5OmZ1bmN0aW9uKHQpe3JldHVyblt0WzBdKnRoaXMuayt0aGlzLngsdFsxXSp0aGlzLmsrdGhpcy55XX0sYXBwbHlYOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnh9LGFwcGx5WTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy55fSxpbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuWyh0WzBdLXRoaXMueCkvdGhpcy5rLCh0WzFdLXRoaXMueSkvdGhpcy5rXX0saW52ZXJ0WDpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLngpL3RoaXMua30saW52ZXJ0WTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnkpL3RoaXMua30scmVzY2FsZVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSxyZXNjYWxlWTpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMueCsiLCIrdGhpcy55KyIpIHNjYWxlKCIrdGhpcy5rKyIpIn19LG5ldyBvdSgxLDAsMCk7dmFyIHN1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuZHluX3dpZHRoPTUwMH1yZXR1cm4gdC5wcm90b3R5cGUubmdBZnRlckNvbnRlbnRJbml0PWZ1bmN0aW9uKCl7dmFyIHQsZTt0aGlzLmR5bl93aWR0aD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZDNjb250YWluZXIiKS5jbGllbnRXaWR0aCx0PUt0KCIjZDN0YXJnZXQiKS5hcHBlbmQoImRlZnMiKS5hcHBlbmQoImxpbmVhckdyYWRpZW50IikuYXR0cigiaWQiLCJhbmltYXRlLWdyYWRpZW50IikuYXR0cigieDEiLCIwJSIpLmF0dHIoInkxIiwiMCUiKS5hdHRyKCJ4MiIsIjEwMCUiKS5hdHRyKCJ5MiIsIjAiKS5hdHRyKCJzcHJlYWRNZXRob2QiLCJyZWZsZWN0IiksZT1bIiMwMDFhZmQiLCIjNmI2N2ZjIiwiIzUzOTBlMyIsIiMzNTZjYzYiLCIjNTM5MGUzIiwiIzZiNjdmYyIsIiMwMDFhZmQiXSx0LnNlbGVjdEFsbCgiLnN0b3AiKS5kYXRhKGUpLmVudGVyKCkuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixmdW5jdGlvbih0LG4pe3JldHVybiBuLyhlLmxlbmd0aC0xKX0pLmF0dHIoInN0b3AtY29sb3IiLGZ1bmN0aW9uKHQpe3JldHVybiB0fSksdC5hcHBlbmQoImFuaW1hdGUiKS5hdHRyKCJhdHRyaWJ1dGVOYW1lIiwieDEiKS5hdHRyKCJ2YWx1ZXMiLCIwJTsxMDAlIikuYXR0cigiZHVyIiwiN3MiKS5hdHRyKCJyZXBlYXRDb3VudCIsImluZGVmaW5pdGUiKSx0LmFwcGVuZCgiYW5pbWF0ZSIpLmF0dHIoImF0dHJpYnV0ZU5hbWUiLCJ4MiIpLmF0dHIoInZhbHVlcyIsIjEwMCU7MjAwJSIpLmF0dHIoImR1ciIsIjdzIikuYXR0cigicmVwZWF0Q291bnQiLCJpbmRlZmluaXRlIik7dmFyIG49e21pblZhbHVlOjAsbWF4VmFsdWU6MTAwLGNpcmNsZVRoaWNrbmVzczouMDUsY2lyY2xlRmlsbEdhcDouMDUsY2lyY2xlQ29sb3I6IiMxNzhCQ0EiLHdhdmVIZWlnaHQ6LjA1LHdhdmVDb3VudDoxLHdhdmVSaXNlVGltZToxZTMsd2F2ZUFuaW1hdGVUaW1lOjE4ZTMsd2F2ZVJpc2U6ITAsd2F2ZUhlaWdodFNjYWxpbmc6ITAsd2F2ZUFuaW1hdGU6ITAsd2F2ZUNvbG9yOiIjMTc4QkNBIix3YXZlT2Zmc2V0OjAsdGV4dFZlcnRQb3NpdGlvbjouNSx0ZXh0U2l6ZToxLHZhbHVlQ291bnRVcDohMCxkaXNwbGF5UGVyY2VudDohMCx0ZXh0Q29sb3I6IiMwNDU2ODEiLHdhdmVUZXh0Q29sb3I6IiNBNERCZjgiLGN1c3RvbVBlcmNlbnQ6IiUifTtuLnZhbHVlQ291bnRVcD0hMCxuLmNpcmNsZVRoaWNrbmVzcz0uMTUsbi5jaXJjbGVDb2xvcj0iIzgwODAxNSIsbi50ZXh0Q29sb3I9IiM1NTU1MDAiLG4ud2F2ZVRleHRDb2xvcj0iI0ZGRkZBQSIsbi53YXZlQ29sb3I9IiNBQUFBMzkiLG4udGV4dFZlcnRQb3NpdGlvbj0uOCxuLndhdmVBbmltYXRlVGltZT0xZTMsbi53YXZlSGVpZ2h0PS4wNSxuLndhdmVBbmltYXRlPSEwLG4ud2F2ZVJpc2U9ITEsbi53YXZlSGVpZ2h0U2NhbGluZz0hMSxuLndhdmVPZmZzZXQ9LjI1LG4udGV4dFNpemU9LjUsbi53YXZlQ291bnQ9MyxuLmRpc3BsYXlQZXJjZW50PSEwLG4ubWluVmFsdWU9MCxuLm1heFZhbHVlPTYwMCxuLmN1c3RvbVBlcmNlbnQ9IiBubW9sL0wiO3ZhciByPWF1KCIjZDNpbnB1dGdhdWdlIiwyMjAsbik7T2JqZWN0KEwuYSkoMTUwMCwxNTAwKS5zdWJzY3JpYmUoZnVuY3Rpb24odCl7cmV0dXJuIHIudXBkYXRlKE1hdGguZmxvb3IoMTAwKk1hdGgucmFuZG9tKCkpKzI1MCl9KTt2YXIgaT17bWluVmFsdWU6MCxtYXhWYWx1ZToxMDAsY2lyY2xlVGhpY2tuZXNzOi4wNSxjaXJjbGVGaWxsR2FwOi4wNSxjaXJjbGVDb2xvcjoiIzE3OEJDQSIsd2F2ZUhlaWdodDouMDUsd2F2ZUNvdW50OjEsd2F2ZVJpc2VUaW1lOjFlMyx3YXZlQW5pbWF0ZVRpbWU6MThlMyx3YXZlUmlzZTohMCx3YXZlSGVpZ2h0U2NhbGluZzohMCx3YXZlQW5pbWF0ZTohMCx3YXZlQ29sb3I6IiMxNzhCQ0EiLHdhdmVPZmZzZXQ6MCx0ZXh0VmVydFBvc2l0aW9uOi41LHRleHRTaXplOjEsdmFsdWVDb3VudFVwOiEwLGRpc3BsYXlQZXJjZW50OiEwLHRleHRDb2xvcjoiIzA0NTY4MSIsd2F2ZVRleHRDb2xvcjoiI0E0REJmOCIsY3VzdG9tUGVyY2VudDoiJSJ9O2kudmFsdWVDb3VudFVwPSEwLGkuY2lyY2xlVGhpY2tuZXNzPS4xNSxpLmNpcmNsZUNvbG9yPSIjODAzNTdjIixpLnRleHRDb2xvcj0iIzU1NTUwMCIsaS53YXZlVGV4dENvbG9yPSIjRkZGRkFBIixpLndhdmVDb2xvcj0iI0FBQUEzOSIsaS50ZXh0VmVydFBvc2l0aW9uPS44LGkud2F2ZUFuaW1hdGVUaW1lPTFlMyxpLndhdmVIZWlnaHQ9LjA1LGkud2F2ZUFuaW1hdGU9ITAsaS53YXZlUmlzZT0hMSxpLndhdmVIZWlnaHRTY2FsaW5nPSExLGkud2F2ZU9mZnNldD0uMjUsaS50ZXh0U2l6ZT0uNSxpLndhdmVDb3VudD0zLGkuZGlzcGxheVBlcmNlbnQ9ITAsaS5taW5WYWx1ZT0wLGkubWF4VmFsdWU9NjAwLGkuY3VzdG9tUGVyY2VudD0iIG5tb2wvTCI7dmFyIG8sYSxzLHUsbCxjLGYsaCxkLHA9YXUoIiNkM291dGdhdWdlIiw0NSxpKTtPYmplY3QoTC5hKSgxNTAwLDE1MDApLnN1YnNjcmliZShmdW5jdGlvbih0KXtyZXR1cm4gcC51cGRhdGUoTWF0aC5mbG9vcig0MCpNYXRoLnJhbmRvbSgpKSs1MCl9KSxzPUt0KCIjZDNiaW1vZGFsIiksdT1HaSgpLmRvbWFpbihbMzAsMTEwXSkucmFuZ2UoWzQwLDI3MF0pLGw9R2koKS5kb21haW4oWzAsLjFdKS5yYW5nZShbMTUwLDIwXSksZj0oYz1bNzksNTQsNzQsNjIsODUsNTUsODgsODUsNTEsODUsNTQsODQsNzgsNDcsODMsNTIsNjIsODQsNTIsNzksNTEsNDcsNzgsNjksNzQsODMsNTUsNzYsNzgsNzksNzMsNzcsNjYsODAsNzQsNTIsNDgsODAsNTksOTAsODAsNTgsODQsNTgsNzMsODMsNjQsNTMsODIsNTksNzUsOTAsNTQsODAsNTQsODMsNzEsNjQsNzcsODEsNTksODQsNDgsODIsNjAsOTIsNzgsNzgsNjUsNzMsODIsNTYsNzksNzEsNjIsNzYsNjAsNzgsNzYsODMsNzUsODIsNzAsNjUsNzMsODgsNzYsODAsNDgsODYsNjAsOTAsNTAsNzgsNjMsNzIsODQsNzUsNTEsODIsNjIsODgsNDksODMsODEsNDcsODQsNTIsODYsODEsNzUsNTksODksNzksNTksODEsNTAsODUsNTksODcsNTMsNjksNzcsNTYsODgsODEsNDUsODIsNTUsOTAsNDUsODMsNTYsODksNDYsODIsNTEsODYsNTMsNzksODEsNjAsODIsNzcsNzYsNTksODAsNDksOTYsNTMsNzcsNzcsNjUsODEsNzEsNzAsODEsOTMsNTMsODksNDUsODYsNTgsNzgsNjYsNzYsNjMsODgsNTIsOTMsNDksNTcsNzcsNjgsODEsODEsNzMsNTAsODUsNzQsNTUsNzcsODMsODMsNTEsNzgsODQsNDYsODMsNTUsODEsNTcsNzYsODQsNzcsODEsODcsNzcsNTEsNzgsNjAsODIsOTEsNTMsNzgsNDYsNzcsODQsNDksODMsNzEsODAsNDksNzUsNjQsNzYsNTMsOTQsNTUsNzYsNTAsODIsNTQsNzUsNzgsNzksNzgsNzgsNzAsNzksNzAsNTQsODYsNTAsOTAsNTQsNTQsNzcsNzksNjQsNzUsNDcsODYsNjMsODUsODIsNTcsODIsNjcsNzQsNTQsODMsNzMsNzMsODgsODAsNzEsODMsNTYsNzksNzgsODQsNTgsODMsNDMsNjAsNzUsODEsNDYsOTAsNDYsNzRdKS5sZW5ndGgsaD1mdW5jdGlvbigpe3ZhciB0PVcsZT16LG49JDtmdW5jdGlvbiByKHIpe3ZhciBpLG8sYT1yLmxlbmd0aCxzPW5ldyBBcnJheShhKTtmb3IoaT0wO2k8YTsrK2kpc1tpXT10KHJbaV0saSxyKTt2YXIgdT1lKHMpLGw9dVswXSxjPXVbMV0sZj1uKHMsbCxjKTtBcnJheS5pc0FycmF5KGYpfHwoZj1YKGwsYyxmKSxmPXEoTWF0aC5jZWlsKGwvZikqZixNYXRoLmZsb29yKGMvZikqZixmKSk7Zm9yKHZhciBoPWYubGVuZ3RoO2ZbMF08PWw7KWYuc2hpZnQoKSwtLWg7Zm9yKDtmW2gtMV0+YzspZi5wb3AoKSwtLWg7dmFyIGQscD1uZXcgQXJyYXkoaCsxKTtmb3IoaT0wO2k8PWg7KytpKShkPXBbaV09W10pLngwPWk+MD9mW2ktMV06bCxkLngxPWk8aD9mW2ldOmM7Zm9yKGk9MDtpPGE7KytpKWw8PShvPXNbaV0pJiZvPD1jJiZwW1YoZixvLDAsaCldLnB1c2gocltpXSk7cmV0dXJuIHB9cmV0dXJuIHIudmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpIKGUpLHIpOnR9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SChbdFswXSx0WzFdXSkscik6ZX0sci50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9IKEIuY2FsbCh0KSk6SCh0KSxyKTpufSxyfSgpLmRvbWFpbih1LmRvbWFpbigpKS50aHJlc2hvbGRzKDQwKShjKSxkPShvPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmFicyh0Lz03KTw9MT8uNzUqKDEtdCp0KS83OjB9LGE9dS50aWNrcyg0MCksZnVuY3Rpb24odCl7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGUpe3JldHVybltlLGZ1bmN0aW9uKHQsZSl7dmFyIG4scj10Lmxlbmd0aCxpPXIsbz0tMSxhPTA7aWYobnVsbD09ZSlmb3IoOysrbzxyOylpc05hTihuPVUodFtvXSkpPy0taTphKz1uO2Vsc2UgZm9yKDsrK288cjspaXNOYU4obj1VKGUodFtvXSkpKT8tLWk6YSs9bjtpZihpKXJldHVybiBhL2l9KHQsZnVuY3Rpb24odCl7cmV0dXJuIG8oZS10KX0pXX0pfSkoYykscy5pbnNlcnQoImciLCIqIikuYXR0cigiZmlsbCIsIiNiYmIiKS5zZWxlY3RBbGwoInJlY3QiKS5kYXRhKGgpLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsZnVuY3Rpb24odCl7cmV0dXJuIHUodC54MCkrMX0pLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiBsKHQubGVuZ3RoL2YpfSkuYXR0cigid2lkdGgiLGZ1bmN0aW9uKHQpe3JldHVybiB1KHQueDEpLXUodC54MCktMX0pLmF0dHIoImhlaWdodCIsZnVuY3Rpb24odCl7cmV0dXJuIGwoMCktbCh0Lmxlbmd0aC9mKX0pLHMuYXBwZW5kKCJwYXRoIikuZGF0dW0oZCkuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJzdHJva2UiLCIjMDAwIikuYXR0cigic3Ryb2tlLXdpZHRoIiwxLjUpLmF0dHIoInN0cm9rZS1saW5lam9pbiIsInJvdW5kIikuYXR0cigiZCIsaXMoKS5jdXJ2ZShjcykueChmdW5jdGlvbih0KXtyZXR1cm4gdSh0WzBdKX0pLnkoZnVuY3Rpb24odCl7cmV0dXJuIGwodFsxXSl9KSl9LHR9KCksdXU9aS5NYSh7ZW5jYXBzdWxhdGlvbjowLHN0eWxlczpbWyIuZ3JpZC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbjoyMHB4fS5kYXNoYm9hcmQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWFsaWduOmxlZnR9LmRhc2hib2FyZC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzphdXRvfW1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo3MDB9XG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXNoYm9hcmQuY29tcG9uZW50LmNzcy5tYXAqLyJdXSxkYXRhOnt9fSk7ZnVuY3Rpb24gbHUodCl7cmV0dXJuIGkuaWIoMCxbKHQoKSgpLGkuT2EoMCwwLG51bGwsbnVsbCw1MiwiZGl2IixbWyJjbGFzcyIsImdyaWQtY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLk9hKDEsMCxudWxsLG51bGwsMSwiaDEiLFtbImNsYXNzIiwibWF0LWgxIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLmdiKC0xLG51bGwsWyJNZVRocml4IDogQ2xlYW5pbmcgaG9zcGl0YWwgZWZmbHVlbnQgc2luY2UgMjAxOCJdKSksKHQoKSgpLGkuT2EoMywwLG51bGwsbnVsbCw0OSwibWF0LWNhcmQiLFtbImNsYXNzIiwiZGFzaGJvYXJkLWNhcmQgbWF0LWNhcmQiXV0sbnVsbCxudWxsLG51bGwsUi5kLFIuYSkpLGkuTmEoNCw0OTE1MixudWxsLDAsRC5hLFtdLG51bGwsbnVsbCksKHQoKSgpLGkuT2EoNSwwLG51bGwsMCw0LCJtYXQtY2FyZC1oZWFkZXIiLFtbImNsYXNzIiwibWF0LWNhcmQtaGVhZGVyIl1dLG51bGwsbnVsbCxudWxsLFIuYyxSLmIpKSxpLk5hKDYsNDkxNTIsbnVsbCwwLEQuYyxbXSxudWxsLG51bGwpLCh0KCkoKSxpLk9hKDcsMCxudWxsLDEsMiwibWF0LWNhcmQtdGl0bGUiLFtbImNsYXNzIiwibWF0LWNhcmQtdGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksaS5OYSg4LDE2Mzg0LG51bGwsMCxELmUsW10sbnVsbCxudWxsKSwodCgpKCksaS5nYigtMSxudWxsLFsiIE91ciBQcm9qZWN0ICJdKSksKHQoKSgpLGkuT2EoMTAsMCxudWxsLDAsNDIsIm1hdC1jYXJkLWNvbnRlbnQiLFtbImNsYXNzIiwiZGFzaGJvYXJkLWNhcmQtY29udGVudCBtYXQtY2FyZC1jb250ZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLGkuTmEoMTEsMTYzODQsbnVsbCwwLEQuYixbXSxudWxsLG51bGwpLCh0KCkoKSxpLk9hKDEyLDAsbnVsbCxudWxsLDQwLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLk9hKDEzLDAsbnVsbCxudWxsLDI0LCJkaXYiLFtbImlkIiwiZDNjb250YWluZXIiXSxbInN0eWxlIiwibWFyZ2luOiBhdXRvOyJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwodCgpKCksaS5PYSgxNCwwLG51bGwsbnVsbCwyMywiOnN2ZzpzdmciLFtbImhlaWdodCIsIjUwMCJdLFsiaWQiLCJkM3RhcmdldCJdLFsic3R5bGUiLCJkaXNwbGF5OiBibG9jazttYXJnaW46IGF1dG87Il0sWyJ3aWR0aCIsIjY3NCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwodCgpKCksaS5PYSgxNSwwLG51bGwsbnVsbCw1LCI6c3ZnOmciLFtbInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgyMCwxMDApIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLk9hKDE2LDAsbnVsbCxudWxsLDEsIjpzdmc6dGV4dCIsW1siZm9udC1zaXplIiwiMzAiXSxbInRleHQtYW5jaG9yIiwibWlkZGxlIl0sWyJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoNzAsLTIwKSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwodCgpKCksaS5nYigtMSxudWxsLFsiTVRYIl0pKSwodCgpKCksaS5PYSgxOCwwLG51bGwsbnVsbCwxLCI6c3ZnOnRleHQiLFtbImZvbnQtc2l6ZSIsIjE1Il0sWyJ0ZXh0LWFuY2hvciIsIm1pZGRsZSJdLFsidHJhbnNmb3JtIiwidHJhbnNsYXRlKDcwLC01KSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwodCgpKCksaS5nYigtMSxudWxsLFsiSG9zcGl0YWwgZWZmbHVlbnRzIl0pKSwodCgpKCksaS5PYSgyMCwwLG51bGwsbnVsbCwwLCI6c3ZnOmciLFtbImlkIiwiZDNpbnB1dGdhdWdlIl0sWyJzdHlsZSIsImhlaWdodDogMTUwcHg7d2lkdGg6IDE1MHB4OyJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwodCgpKCksaS5PYSgyMSwwLG51bGwsbnVsbCwwLCI6c3ZnOnJlY3QiLFtbImhlaWdodCIsIjUwIl0sWyJzdHlsZSIsImZpbGw6IHRyYW5zcGFyZW50OyBzdHJva2U6ICM1YTAwMzZGRjsgc3Ryb2tlLXdpZHRoOiA1cHgiXSxbIndpZHRoIiwiNjc1Il0sWyJ4IiwiMCJdLFsieSIsIjI3MCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwodCgpKCksaS5PYSgyMiwwLG51bGwsbnVsbCwwLCI6c3ZnOnJlY3QiLFtbImhlaWdodCIsIjE1MCJdLFsic3R5bGUiLCJmaWxsOiB0cmFuc3BhcmVudDsgc3Ryb2tlOiAjNWEwMDM2RkY7IHN0cm9rZS13aWR0aDogNXB4OyJdLFsid2lkdGgiLCIxNTAiXSxbIngiLCIyNTAiXSxbInkiLCIyMDAiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuT2EoMjMsMCxudWxsLG51bGwsMCwiOnN2ZzpyZWN0IixbWyJoZWlnaHQiLCI1MCJdLFsic3R5bGUiLCJmaWxsOiB1cmwoJyNhbmltYXRlLWdyYWRpZW50Jyk7Il0sWyJ3aWR0aCIsIjY3NSJdLFsieCIsIjAiXSxbInkiLCIyNzAiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuT2EoMjQsMCxudWxsLG51bGwsMCwiOnN2ZzpyZWN0IixbWyJoZWlnaHQiLCIxNTAiXSxbInN0eWxlIiwiZmlsbDogdXJsKCcjYW5pbWF0ZS1ncmFkaWVudCcpOyJdLFsid2lkdGgiLCIxNTAiXSxbIngiLCIyNTAiXSxbInkiLCIyMDAiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuT2EoMjUsMCxudWxsLG51bGwsMCwiOnN2ZzpyZWN0IixbWyJoZWlnaHQiLCIxNTAiXSxbInN0eWxlIiwiZmlsbDogdXJsKCcjYW5pbWF0ZS1ncmFkaWVudCcpOyJdLFsid2lkdGgiLCIxNTAiXSxbIngiLCIyNTAiXSxbInkiLCIyMDAiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuT2EoMjYsMCxudWxsLG51bGwsNSwiOnN2ZzpnIixbWyJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoNDcwLDEwMCkiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuT2EoMjcsMCxudWxsLG51bGwsMSwiOnN2Zzp0ZXh0IixbWyJmb250LXNpemUiLCIzMCJdLFsidGV4dC1hbmNob3IiLCJtaWRkbGUiXSxbInRyYW5zZm9ybSIsInRyYW5zbGF0ZSg3MCwtMjApIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLmdiKC0xLG51bGwsWyJNVFgiXSkpLCh0KCkoKSxpLk9hKDI5LDAsbnVsbCxudWxsLDEsIjpzdmc6dGV4dCIsW1siZm9udC1zaXplIiwiMTUiXSxbInRleHQtYW5jaG9yIiwibWlkZGxlIl0sWyJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoNzAsLTUpIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLmdiKC0xLG51bGwsWyJXYXN0ZXdhdGVyIG91dHB1dCJdKSksKHQoKSgpLGkuT2EoMzEsMCxudWxsLG51bGwsMCwiOnN2ZzpnIixbWyJpZCIsImQzb3V0Z2F1Z2UiXSxbInN0eWxlIiwiaGVpZ2h0OiAxNTBweDt3aWR0aDogMTUwcHg7Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLk9hKDMyLDAsbnVsbCxudWxsLDUsIjpzdmc6ZyIsW1sidHJhbnNmb3JtIiwidHJhbnNsYXRlKDE4MCwyMCkiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuT2EoMzMsMCxudWxsLG51bGwsMSwiOnN2Zzp0ZXh0IixbWyJmb250LXNpemUiLCIxNSJdLFsidGV4dC1hbmNob3IiLCJtaWRkbGUiXSxbInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgxNDUsMTYzKSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwodCgpKCksaS5nYigtMSxudWxsLFsiQmFjdGVyaWFsIHBvcHVsYXRpb24iXSkpLCh0KCkoKSxpLk9hKDM1LDAsbnVsbCxudWxsLDEsIjpzdmc6dGV4dCIsW1siZm9udC1zaXplIiwiMTAiXSxbInRleHQtYW5jaG9yIiwibWlkZGxlIl0sWyJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMTQ1LDE3NSkiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuZ2IoLTEsbnVsbCxbIkJpbW9kYWwgZGlzdHJpYnV0aW9uIl0pKSwodCgpKCksaS5PYSgzNywwLG51bGwsbnVsbCwwLCI6c3ZnOmciLFtbImlkIiwiZDNiaW1vZGFsIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLk9hKDM4LDAsbnVsbCxudWxsLDE0LCJkaXYiLFtbInN0eWxlIiwicGFkZGluZzogMTBweDsiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuZ2IoLTEsbnVsbCxbIiBPdXIgcHJvamVjdCBpcyBhIGdlbmVyYWwtcHVycG9zZSBiYWN0ZXJpYWwgcGxhdGZvcm0gZm9yIGRydWcgZGVncmFkYXRpb24uIEFzIGEgcHJvb2Ygb2YgY29uY2VwdCwgd2UgaGF2ZSBjaG9zZW4gdG8gZm9jdXMgb24gdGhlIGN5dG90b3hpYyBkcnVncyB1c2VkIGluIHRoZSB0cmVhdG1lbnQgb2YgY2FuY2VyLCBhcyB0aGVpciBjb25jZW50cmF0aW9ucyBhcmUgYWxhcm1pbmdseSBoaWdoIGluIGhvc3BpdGFsIHdhc3Rld2F0ZXIgZWZmbHVlbnRzLiBUaHJvdWdoIGEgdG9vbGtpdCBvZiBicm9hZC0gYW5kIG5hcnJvdy1zcGVjdHJ1bSBlbnp5bWVzLCB3ZSBhaW0gdG8gYWNoaWV2ZSBjbGVhcmFuY2Ugb2YgdGhlIG1haW4gY2hlbW90aGVyYXBldXRpYyBhZ2VudHMsIGxpa2UgbWV0aG90cmV4YXRlLCA1LWZsdW9yb3VyYWNpbCBvciBkb3hvcnViaWNpbi4gIl0pKSwodCgpKCksaS5PYSg0MCwwLG51bGwsbnVsbCwwLCJiciIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuT2EoNDEsMCxudWxsLG51bGwsMCwiYnIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLmdiKC0xLG51bGwsWycgV2UgYXJlIHRha2luZyBvbiB0aHJlZSBtYWluIGNoYWxsZW5nZXMgOiBlZmZpY2llbnQgZW50cnkgb2YgdGhlc2UgbW9sZWN1bGVzIGluIHRoZSBiYWN0ZXJpYWwgY2VsbCwgdGhyb3VnaCBjaGFubmVscyBhbmQgdHJhbnNwb3J0ZXJzICh1cmFjaWwtbGlrZSB0cmFuc3BvcnRlciB1cmFBLCBjcnlwdGljIGZvbGF0ZS1hbmFsb2d1ZSB0cmFuc3BvcnRlciBhYmdUIC4uLiksIHByb3BlciBkZWdyYWRhdGlvbiB0aHJvdWdoIG1ldGFib2xpemluZyBlbnp5bWVzIChjYXJib3h5cGVwdGlkYXNlIEcyLCBjeXRvY2hyb21lIFA0NTAgXHUyMDI2KSwgYW5kIGxvbmcgdGVybSBvcGVyYXRpb24gb2YgdGhlIGJpb3JlYWN0b3IgdGhvdWdoIGEgYmlzdGFibGUsICJzdGVtLWNlbGwgbGlrZSIsIHBvcHVsYXRpb24gb2YgYmFjdGVyaWEsIGFsbGV2aWF0aW5nIHRoZSBuZWVkIGZvciByZWd1bGFyIHJlc2VlZGluZyB3aXRoIGZyZXNoIGNsb25lcy4gJ10pKSwodCgpKCksaS5PYSg0MywwLG51bGwsbnVsbCwwLCJiciIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuT2EoNDQsMCxudWxsLG51bGwsMSwiaDMiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLmdiKC0xLG51bGwsWyJQcm9qZWN0IHNpZ25pZmljYW5jZSJdKSksKHQoKSgpLGkuZ2IoLTEsbnVsbCxbIiBQaGFybWFjZXV0aWNhbCBkcnVncyBhcmUgYSBwYXJ0aWN1bGFybHkgY29uY2VybmluZyBzb3VyY2Ugb2YgcG9sbHV0aW9uIDogc2VsZWN0ZWQgdG8gYmUgYmlvbG9naWNhbGx5IGFjdGl2ZSBhdCBsb3cgY29uY2VudHJhdGlvbiAmIGRlc2lnbmVkIHRvIHJlc2lzdCBiaW9kZWdyYWRhdGlvbiwgZHJ1Z3MgY29uc3RpdHV0ZSBhIGNsYXNzIG9mIGhpZ2ggcmVtYW5lbmNlIHBvbGx1dGFudHMgcm91dGluZWx5IGZvdW5kIGluIHRoZSBlbnZpcm9ubWVudCwgZXZlbiBpbiBvdXIgZHJpbmtpbmcgd2F0ZXIuICJdKSksKHQoKSgpLGkuT2EoNDcsMCxudWxsLG51bGwsMCwiYnIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLk9hKDQ4LDAsbnVsbCxudWxsLDAsImJyIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwodCgpKCksaS5nYigtMSxudWxsLFsiIFRob3VnaCBwaHlzaWNhbCAmIGNoZW1pY2FsIHNvbHV0aW9ucyBleGlzdCwgaW4gdGhlIGZvcm0gb2Ygb3pvbmUgYW5kIFVWIHRyZWF0bWVudCwgb3VyIHNvbHV0aW9uIGNhbiBvZmZlciB0aGUgZmxleGliaWxpdHkgYW5kIGVmZmljaWVuY3kgb2YgYSBiaW9yZWFjdG9yLWJhc2VkIGFwcHJvYWNoLiAiXSkpLCh0KCkoKSxpLk9hKDUwLDAsbnVsbCxudWxsLDAsImJyIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwodCgpKCksaS5PYSg1MSwwLG51bGwsbnVsbCwwLCJiciIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuZ2IoLTEsbnVsbCxbJyBPdXIgInN0ZW0tY2VsbCBsaWtlIiBhcHByb2FjaCB0byBiYWN0ZXJpYWwgcG9wdWxhdGlvbiBtYWtlcyBpdCBhbiBvcHRpb24gd2l0aCBwb3RlbnRpYWxseSBsb3dlciBvbmdvaW5nIGNvc3RzLCBhbmQgb3VyIGRlZ3JhZGF0aW9uIGVuenltZXMgYWxsb3cgdGFyZ2V0ZWQgZGVncmFkYXRpb24gb2YgcGFydGljdWxhcmx5IHJlc2lsaWVudCBtb2xlY3VsZXMgOiBib3RoIHdlYWtuZXNzZXMgb2YgY29udmVudGlvbmFsIG1ldGhvZHMgb2Ygd2FzdGV3YXRlciB0cmVhdG1lbnQuICddKSldLG51bGwsbnVsbCl9dmFyIGN1PWkuS2EoImRhc2hib2FyZCIsc3UsZnVuY3Rpb24odCl7cmV0dXJuIGkuaWIoMCxbKHQoKSgpLGkuT2EoMCwwLG51bGwsbnVsbCwxLCJkYXNoYm9hcmQiLFtdLG51bGwsbnVsbCxudWxsLGx1LHV1KSksaS5OYSgxLDEwOTc3MjgsbnVsbCwwLHN1LFtdLG51bGwsbnVsbCldLG51bGwsbnVsbCl9LHt9LHt9LFtdKSxmdT1uKCJwdWdUIiksaHU9MCxkdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9vcGVuQ2xvc2VBbGxBY3Rpb25zPW5ldyB2LmEsdGhpcy5pZD0iY2RrLWFjY29yZGlvbi0iK2h1KyssdGhpcy5fbXVsdGk9ITF9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibXVsdGkiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbXVsdGl9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9tdWx0aT1PYmplY3QoQy5iKSh0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5vcGVuQWxsPWZ1bmN0aW9uKCl7dGhpcy5fb3BlbkNsb3NlQWxsKCEwKX0sdC5wcm90b3R5cGUuY2xvc2VBbGw9ZnVuY3Rpb24oKXt0aGlzLl9vcGVuQ2xvc2VBbGwoITEpfSx0LnByb3RvdHlwZS5fb3BlbkNsb3NlQWxsPWZ1bmN0aW9uKHQpe3RoaXMubXVsdGkmJnRoaXMuX29wZW5DbG9zZUFsbEFjdGlvbnMubmV4dCh0KX0sdH0oKSxwdT0wLG11PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dmFyIHI9dGhpczt0aGlzLmFjY29yZGlvbj10LHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fZXhwYW5zaW9uRGlzcGF0Y2hlcj1uLHRoaXMuX29wZW5DbG9zZUFsbFN1YnNjcmlwdGlvbj1mdS5hLkVNUFRZLHRoaXMuY2xvc2VkPW5ldyBpLm0sdGhpcy5vcGVuZWQ9bmV3IGkubSx0aGlzLmRlc3Ryb3llZD1uZXcgaS5tLHRoaXMuZXhwYW5kZWRDaGFuZ2U9bmV3IGkubSx0aGlzLmlkPSJjZGstYWNjb3JkaW9uLWNoaWxkLSIrcHUrKyx0aGlzLl9leHBhbmRlZD0hMSx0aGlzLl9kaXNhYmxlZD0hMSx0aGlzLl9yZW1vdmVVbmlxdWVTZWxlY3Rpb25MaXN0ZW5lcj1mdW5jdGlvbigpe30sdGhpcy5fcmVtb3ZlVW5pcXVlU2VsZWN0aW9uTGlzdGVuZXI9bi5saXN0ZW4oZnVuY3Rpb24odCxlKXtyLmFjY29yZGlvbiYmIXIuYWNjb3JkaW9uLm11bHRpJiZyLmFjY29yZGlvbi5pZD09PWUmJnIuaWQhPT10JiYoci5leHBhbmRlZD0hMSl9KSx0aGlzLmFjY29yZGlvbiYmKHRoaXMuX29wZW5DbG9zZUFsbFN1YnNjcmlwdGlvbj10aGlzLl9zdWJzY3JpYmVUb09wZW5DbG9zZUFsbEFjdGlvbnMoKSl9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZXhwYW5kZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXhwYW5kZWR9LHNldDpmdW5jdGlvbih0KXt0PU9iamVjdChDLmIpKHQpLHRoaXMuX2V4cGFuZGVkIT09dCYmKHRoaXMuX2V4cGFuZGVkPXQsdGhpcy5leHBhbmRlZENoYW5nZS5lbWl0KHQpLHQ/KHRoaXMub3BlbmVkLmVtaXQoKSx0aGlzLl9leHBhbnNpb25EaXNwYXRjaGVyLm5vdGlmeSh0aGlzLmlkLHRoaXMuYWNjb3JkaW9uP3RoaXMuYWNjb3JkaW9uLmlkOnRoaXMuaWQpKTp0aGlzLmNsb3NlZC5lbWl0KCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZGlzYWJsZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9kaXNhYmxlZD1PYmplY3QoQy5iKSh0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5uZ09uRGVzdHJveT1mdW5jdGlvbigpe3RoaXMub3BlbmVkLmNvbXBsZXRlKCksdGhpcy5jbG9zZWQuY29tcGxldGUoKSx0aGlzLmRlc3Ryb3llZC5lbWl0KCksdGhpcy5kZXN0cm95ZWQuY29tcGxldGUoKSx0aGlzLl9yZW1vdmVVbmlxdWVTZWxlY3Rpb25MaXN0ZW5lcigpLHRoaXMuX29wZW5DbG9zZUFsbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfSx0LnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkfHwodGhpcy5leHBhbmRlZD0hdGhpcy5leHBhbmRlZCl9LHQucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZHx8KHRoaXMuZXhwYW5kZWQ9ITEpfSx0LnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZHx8KHRoaXMuZXhwYW5kZWQ9ITApfSx0LnByb3RvdHlwZS5fc3Vic2NyaWJlVG9PcGVuQ2xvc2VBbGxBY3Rpb25zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5hY2NvcmRpb24uX29wZW5DbG9zZUFsbEFjdGlvbnMuc3Vic2NyaWJlKGZ1bmN0aW9uKGUpe3QuZGlzYWJsZWR8fCh0LmV4cGFuZGVkPWUpfSl9LHR9KCkseXU9ZnVuY3Rpb24oKXt9LGd1PW4oImloWVkiKSx2dT1uKCI0YzM1IiksYnU9bigicDBpYiIpLF91PW4oIlZuRC8iKSx3dT1uKCJ0OWZaIikseHU9bigiWVNoMiIpLE91PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuX2hpZGVUb2dnbGU9ITEsZS5kaXNwbGF5TW9kZT0iZGVmYXVsdCIsZX1yZXR1cm4gT2JqZWN0KGwuYikoZSx0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImhpZGVUb2dnbGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGlkZVRvZ2dsZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2hpZGVUb2dnbGU9T2JqZWN0KEMuYikodCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksZX0oZHUpLEN1PTAsU3U9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scixpKXt2YXIgbz10LmNhbGwodGhpcyxlLG4scil8fHRoaXM7cmV0dXJuIG8uX3ZpZXdDb250YWluZXJSZWY9aSxvLl9oaWRlVG9nZ2xlPSExLG8uX2lucHV0Q2hhbmdlcz1uZXcgdi5hLG8uX2hlYWRlcklkPSJtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci0iK0N1Kyssby5hY2NvcmRpb249ZSxvfXJldHVybiBPYmplY3QobC5iKShlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiaGlkZVRvZ2dsZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9oaWRlVG9nZ2xlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5faGlkZVRvZ2dsZT1PYmplY3QoQy5iKSh0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5fZ2V0SGlkZVRvZ2dsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFjY29yZGlvbj90aGlzLmFjY29yZGlvbi5oaWRlVG9nZ2xlOnRoaXMuaGlkZVRvZ2dsZX0sZS5wcm90b3R5cGUuX2hhc1NwYWNpbmc9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuYWNjb3JkaW9uJiYiZGVmYXVsdCI9PT0odGhpcy5leHBhbmRlZD90aGlzLmFjY29yZGlvbi5kaXNwbGF5TW9kZTp0aGlzLl9nZXRFeHBhbmRlZFN0YXRlKCkpfSxlLnByb3RvdHlwZS5fZ2V0RXhwYW5kZWRTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmV4cGFuZGVkPyJleHBhbmRlZCI6ImNvbGxhcHNlZCJ9LGUucHJvdG90eXBlLm5nQWZ0ZXJDb250ZW50SW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fbGF6eUNvbnRlbnQmJnRoaXMub3BlbmVkLnBpcGUoT2JqZWN0KE8uYSkobnVsbCksT2JqZWN0KF91LmEpKGZ1bmN0aW9uKCl7cmV0dXJuIHQuZXhwYW5kZWQmJiF0Ll9wb3J0YWx9KSxPYmplY3Qod3UuYSkoMSkpLnN1YnNjcmliZShmdW5jdGlvbigpe3QuX3BvcnRhbD1uZXcgdnUuZCh0Ll9sYXp5Q29udGVudC5fdGVtcGxhdGUsdC5fdmlld0NvbnRhaW5lclJlZil9KX0sZS5wcm90b3R5cGUubmdPbkNoYW5nZXM9ZnVuY3Rpb24odCl7dGhpcy5faW5wdXRDaGFuZ2VzLm5leHQodCl9LGUucHJvdG90eXBlLm5nT25EZXN0cm95PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUubmdPbkRlc3Ryb3kuY2FsbCh0aGlzKSx0aGlzLl9pbnB1dENoYW5nZXMuY29tcGxldGUoKX0sZS5wcm90b3R5cGUuX2JvZHlBbmltYXRpb249ZnVuY3Rpb24odCl7dmFyIGU9dC5lbGVtZW50LmNsYXNzTGlzdCxuPXQucGhhc2VOYW1lLHI9dC50b1N0YXRlOyJkb25lIj09PW4mJiJleHBhbmRlZCI9PT1yP2UuYWRkKCJtYXQtZXhwYW5kZWQiKToic3RhcnQiPT09biYmImNvbGxhcHNlZCI9PT1yJiZlLnJlbW92ZSgibWF0LWV4cGFuZGVkIil9LGV9KG11KSxFdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4scil7dmFyIGk9dGhpczt0aGlzLnBhbmVsPXQsdGhpcy5fZWxlbWVudD1lLHRoaXMuX2ZvY3VzTW9uaXRvcj1uLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPXIsdGhpcy5fcGFyZW50Q2hhbmdlU3Vic2NyaXB0aW9uPWZ1LmEuRU1QVFksdGhpcy5fcGFyZW50Q2hhbmdlU3Vic2NyaXB0aW9uPU9iamVjdChidS5hKSh0Lm9wZW5lZCx0LmNsb3NlZCx0Ll9pbnB1dENoYW5nZXMucGlwZShPYmplY3QoX3UuYSkoZnVuY3Rpb24odCl7cmV0dXJuISghdC5oaWRlVG9nZ2xlJiYhdC5kaXNhYmxlZCl9KSkpLnN1YnNjcmliZShmdW5jdGlvbigpe3JldHVybiBpLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX0pLG4ubW9uaXRvcihlLm5hdGl2ZUVsZW1lbnQpfXJldHVybiB0LnByb3RvdHlwZS5fdG9nZ2xlPWZ1bmN0aW9uKCl7dGhpcy5wYW5lbC50b2dnbGUoKX0sdC5wcm90b3R5cGUuX2lzRXhwYW5kZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5lbC5leHBhbmRlZH0sdC5wcm90b3R5cGUuX2dldEV4cGFuZGVkU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5lbC5fZ2V0RXhwYW5kZWRTdGF0ZSgpfSx0LnByb3RvdHlwZS5fZ2V0UGFuZWxJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbmVsLmlkfSx0LnByb3RvdHlwZS5fc2hvd1RvZ2dsZT1mdW5jdGlvbigpe3JldHVybiF0aGlzLnBhbmVsLmhpZGVUb2dnbGUmJiF0aGlzLnBhbmVsLmRpc2FibGVkfSx0LnByb3RvdHlwZS5fa2V5ZG93bj1mdW5jdGlvbih0KXtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIHh1Lmo6Y2FzZSB4dS5kOnQucHJldmVudERlZmF1bHQoKSx0aGlzLl90b2dnbGUoKTticmVhaztkZWZhdWx0OnJldHVybn19LHQucHJvdG90eXBlLm5nT25EZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50Q2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCl9LHR9KCksa3U9ZnVuY3Rpb24oKXt9LFR1PWZ1bmN0aW9uKCl7fSxJdT1mdW5jdGlvbigpe30sQXU9bigiWWxiUSIpLGp1PW4oImxMQVAiKSxQdT1pLk1hKHtlbmNhcHN1bGF0aW9uOjIsc3R5bGVzOlsiLm1hdC1leHBhbnNpb24tcGFuZWx7dHJhbnNpdGlvbjpib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllciguNCwwLC4yLDEpO2JveC1zaXppbmc6Y29udGVudC1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MDt0cmFuc2l0aW9uOm1hcmdpbiAyMjVtcyBjdWJpYy1iZXppZXIoLjQsMCwuMiwxKX0ubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjAgM3B4IDFweCAtMnB4IHJnYmEoMCwwLDAsLjIpLDAgMnB4IDJweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCA1cHggMCByZ2JhKDAsMCwwLC4xMil9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OmFjdGl2ZSl7Lm1hdC1leHBhbnNpb24tcGFuZWx7b3V0bGluZTpzb2xpZCAxcHh9fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnR7b3ZlcmZsb3c6aGlkZGVufS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnQubWF0LWV4cGFuZGVke292ZXJmbG93OnZpc2libGV9Lm1hdC1leHBhbnNpb24tcGFuZWwtYm9keXtwYWRkaW5nOjAgMjRweCAxNnB4fS5tYXQtZXhwYW5zaW9uLXBhbmVsLXNwYWNpbmd7bWFyZ2luOjE2cHggMH0ubWF0LWFjY29yZGlvbj4ubWF0LWV4cGFuc2lvbi1wYW5lbC1zcGFjaW5nOmZpcnN0LWNoaWxkLC5tYXQtYWNjb3JkaW9uPjpmaXJzdC1jaGlsZDpub3QoLm1hdC1leHBhbnNpb24tcGFuZWwpIC5tYXQtZXhwYW5zaW9uLXBhbmVsLXNwYWNpbmd7bWFyZ2luLXRvcDowfS5tYXQtYWNjb3JkaW9uPi5tYXQtZXhwYW5zaW9uLXBhbmVsLXNwYWNpbmc6bGFzdC1jaGlsZCwubWF0LWFjY29yZGlvbj46bGFzdC1jaGlsZDpub3QoLm1hdC1leHBhbnNpb24tcGFuZWwpIC5tYXQtZXhwYW5zaW9uLXBhbmVsLXNwYWNpbmd7bWFyZ2luLWJvdHRvbTowfS5tYXQtYWN0aW9uLXJvd3tib3JkZXItdG9wLXN0eWxlOnNvbGlkO2JvcmRlci10b3Atd2lkdGg6MXB4O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO3BhZGRpbmc6MTZweCA4cHggMTZweCAyNHB4fS5tYXQtYWN0aW9uLXJvdyBidXR0b24ubWF0LWJ1dHRvbnttYXJnaW4tbGVmdDo4cHh9W2Rpcj1ydGxdIC5tYXQtYWN0aW9uLXJvdyBidXR0b24ubWF0LWJ1dHRvbnttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDo4cHh9Il0sZGF0YTp7YW5pbWF0aW9uOlt7dHlwZTo3LG5hbWU6ImJvZHlFeHBhbnNpb24iLGRlZmluaXRpb25zOlt7dHlwZTowLG5hbWU6ImNvbGxhcHNlZCIsc3R5bGVzOnt0eXBlOjYsc3R5bGVzOntoZWlnaHQ6IjBweCIsdmlzaWJpbGl0eToiaGlkZGVuIn0sb2Zmc2V0Om51bGx9LG9wdGlvbnM6dm9pZCAwfSx7dHlwZTowLG5hbWU6ImV4cGFuZGVkIixzdHlsZXM6e3R5cGU6NixzdHlsZXM6e2hlaWdodDoiKiIsdmlzaWJpbGl0eToidmlzaWJsZSJ9LG9mZnNldDpudWxsfSxvcHRpb25zOnZvaWQgMH0se3R5cGU6MSxleHByOiJleHBhbmRlZCA8PT4gY29sbGFwc2VkIixhbmltYXRpb246e3R5cGU6NCxzdHlsZXM6bnVsbCx0aW1pbmdzOiIyMjVtcyBjdWJpYy1iZXppZXIoMC40LDAuMCwwLjIsMSkifSxvcHRpb25zOm51bGx9XSxvcHRpb25zOnt9fV19fSk7ZnVuY3Rpb24gTXUodCl7cmV0dXJuIGkuaWIoMCxbKHQoKSgpLGkuRmEoMCxudWxsLG51bGwsMCkpXSxudWxsLG51bGwpfWZ1bmN0aW9uIE51KHQpe3JldHVybiBpLmliKDIsW2kuWGEobnVsbCwwKSwodCgpKCksaS5PYSgxLDAsW1siYm9keSIsMV1dLG51bGwsNSwiZGl2IixbWyJjbGFzcyIsIm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudCJdLFsicm9sZSIsInJlZ2lvbiJdXSxbWzI0LCJAYm9keUV4cGFuc2lvbiIsMF0sWzEsImFyaWEtbGFiZWxsZWRieSIsMF0sWzgsImlkIiwwXV0sW1tudWxsLCJAYm9keUV4cGFuc2lvbi5kb25lIl0sW251bGwsIkBib2R5RXhwYW5zaW9uLnN0YXJ0Il1dLGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0hMCxpPXQuY29tcG9uZW50O3JldHVybiJAYm9keUV4cGFuc2lvbi5kb25lIj09PWUmJihyPSExIT09aS5fYm9keUFuaW1hdGlvbihuKSYmciksIkBib2R5RXhwYW5zaW9uLnN0YXJ0Ij09PWUmJihyPSExIT09aS5fYm9keUFuaW1hdGlvbihuKSYmcikscn0sbnVsbCxudWxsKSksKHQoKSgpLGkuT2EoMiwwLG51bGwsbnVsbCwzLCJkaXYiLFtbImNsYXNzIiwibWF0LWV4cGFuc2lvbi1wYW5lbC1ib2R5Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLGkuWGEobnVsbCwxKSwodCgpKCksaS5GYSgxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLE11KSksaS5OYSg1LDIxMjk5MixudWxsLDAsdnUuYSxbaS5qLGkuTl0se3BvcnRhbDpbMCwicG9ydGFsIl19LG51bGwpLGkuWGEobnVsbCwyKV0sZnVuY3Rpb24odCxlKXt0KGUsNSwwLGUuY29tcG9uZW50Ll9wb3J0YWwpfSxmdW5jdGlvbih0LGUpe3ZhciBuPWUuY29tcG9uZW50O3QoZSwxLDAsbi5fZ2V0RXhwYW5kZWRTdGF0ZSgpLG4uX2hlYWRlcklkLG4uaWQpfSl9dmFyIFJ1PWkuTWEoe2VuY2Fwc3VsYXRpb246MixzdHlsZXM6WyIubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJ7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXI7cGFkZGluZzowIDI0cHh9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmZvY3VzLC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpob3ZlcntvdXRsaW5lOjB9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLm1hdC1leHBhbmRlZDpmb2N1cywubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIubWF0LWV4cGFuZGVkOmhvdmVye2JhY2tncm91bmQ6aW5oZXJpdH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKXtjdXJzb3I6cG9pbnRlcn0ubWF0LWNvbnRlbnR7ZGlzcGxheTpmbGV4O2ZsZXg6MTtmbGV4LWRpcmVjdGlvbjpyb3c7b3ZlcmZsb3c6aGlkZGVufS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbiwubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGV7ZGlzcGxheTpmbGV4O2ZsZXgtZ3JvdzoxO21hcmdpbi1yaWdodDoxNnB4fVtkaXI9cnRsXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24sW2Rpcj1ydGxdIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZXttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDoxNnB4fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbntmbGV4LWdyb3c6Mn0ubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3I6OmFmdGVye2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MCAycHggMnB4IDA7Y29udGVudDonJztkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjNweDt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Il0sZGF0YTp7YW5pbWF0aW9uOlt7dHlwZTo3LG5hbWU6ImluZGljYXRvclJvdGF0ZSIsZGVmaW5pdGlvbnM6W3t0eXBlOjAsbmFtZToiY29sbGFwc2VkIixzdHlsZXM6e3R5cGU6NixzdHlsZXM6e3RyYW5zZm9ybToicm90YXRlKDBkZWcpIn0sb2Zmc2V0Om51bGx9LG9wdGlvbnM6dm9pZCAwfSx7dHlwZTowLG5hbWU6ImV4cGFuZGVkIixzdHlsZXM6e3R5cGU6NixzdHlsZXM6e3RyYW5zZm9ybToicm90YXRlKDE4MGRlZykifSxvZmZzZXQ6bnVsbH0sb3B0aW9uczp2b2lkIDB9LHt0eXBlOjEsZXhwcjoiZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCIsYW5pbWF0aW9uOnt0eXBlOjQsc3R5bGVzOm51bGwsdGltaW5nczoiMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwwLjAsMC4yLDEpIn0sb3B0aW9uczpudWxsfV0sb3B0aW9uczp7fX0se3R5cGU6NyxuYW1lOiJleHBhbnNpb25IZWlnaHQiLGRlZmluaXRpb25zOlt7dHlwZTowLG5hbWU6ImNvbGxhcHNlZCIsc3R5bGVzOnt0eXBlOjYsc3R5bGVzOntoZWlnaHQ6Int7Y29sbGFwc2VkSGVpZ2h0fX0ifSxvZmZzZXQ6bnVsbH0sb3B0aW9uczp7cGFyYW1zOntjb2xsYXBzZWRIZWlnaHQ6IjQ4cHgifX19LHt0eXBlOjAsbmFtZToiZXhwYW5kZWQiLHN0eWxlczp7dHlwZTo2LHN0eWxlczp7aGVpZ2h0OiJ7e2V4cGFuZGVkSGVpZ2h0fX0ifSxvZmZzZXQ6bnVsbH0sb3B0aW9uczp7cGFyYW1zOntleHBhbmRlZEhlaWdodDoiNjRweCJ9fX0se3R5cGU6MSxleHByOiJleHBhbmRlZCA8PT4gY29sbGFwc2VkIixhbmltYXRpb246e3R5cGU6MyxzdGVwczpbe3R5cGU6MTEsc2VsZWN0b3I6IkBpbmRpY2F0b3JSb3RhdGUiLGFuaW1hdGlvbjp7dHlwZTo5LG9wdGlvbnM6bnVsbH0sb3B0aW9uczp7b3B0aW9uYWw6ITB9fSx7dHlwZTo0LHN0eWxlczpudWxsLHRpbWluZ3M6IjIyNW1zIGN1YmljLWJlemllcigwLjQsMC4wLDAuMiwxKSJ9XSxvcHRpb25zOm51bGx9LG9wdGlvbnM6bnVsbH1dLG9wdGlvbnM6e319XX19KTtmdW5jdGlvbiBEdSh0KXtyZXR1cm4gaS5pYigwLFsodCgpKCksaS5PYSgwLDAsbnVsbCxudWxsLDAsInNwYW4iLFtbImNsYXNzIiwibWF0LWV4cGFuc2lvbi1pbmRpY2F0b3IiXV0sW1syNCwiQGluZGljYXRvclJvdGF0ZSIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKV0sbnVsbCxmdW5jdGlvbih0LGUpe3QoZSwwLDAsZS5jb21wb25lbnQuX2dldEV4cGFuZGVkU3RhdGUoKSl9KX1mdW5jdGlvbiBMdSh0KXtyZXR1cm4gaS5pYigyLFsodCgpKCksaS5PYSgwLDAsbnVsbCxudWxsLDMsInNwYW4iLFtbImNsYXNzIiwibWF0LWNvbnRlbnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksaS5YYShudWxsLDApLGkuWGEobnVsbCwxKSxpLlhhKG51bGwsMiksKHQoKSgpLGkuRmEoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxEdSkpLGkuTmEoNSwxNjM4NCxudWxsLDAsYS5rLFtpLk4saS5LXSx7bmdJZjpbMCwibmdJZiJdfSxudWxsKV0sZnVuY3Rpb24odCxlKXt0KGUsNSwwLGUuY29tcG9uZW50Ll9zaG93VG9nZ2xlKCkpfSxudWxsKX12YXIgRnU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5uZ09uSW5pdD1mdW5jdGlvbigpe30sdH0oKSxWdT1pLk1hKHtlbmNhcHN1bGF0aW9uOjAsc3R5bGVzOltbIiNnY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MjBweH1cbi8qIyBzb3VyY2VNYXBwaW5nVVJMPXNpdGVtYXAuY29tcG9uZW50LmNzcy5tYXAqLyJdXSxkYXRhOnt9fSk7ZnVuY3Rpb24gVXUodCl7cmV0dXJuIGkuaWIoMCxbKHQoKSgpLGkuT2EoMCwwLG51bGwsbnVsbCwzNSwiZGl2IixbWyJpZCIsImdjb250YWluZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuT2EoMSwwLG51bGwsbnVsbCwxLCJoMSIsW1siY2xhc3MiLCJtYXQtaDEiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuZ2IoLTEsbnVsbCxbIlNpdGUgbWFwcyJdKSksKHQoKSgpLGkuT2EoMywwLG51bGwsbnVsbCwzMiwibWF0LWFjY29yZGlvbiIsW1siY2xhc3MiLCJtYXQtYWNjb3JkaW9uIl0sWyJtdWx0aSIsInRydWUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksaS5OYSg0LDE2Mzg0LG51bGwsMCxPdSxbXSx7bXVsdGk6WzAsIm11bHRpIl19LG51bGwpLCh0KCkoKSxpLk9hKDUsMTY3NzcyMTYsbnVsbCxudWxsLDE0LCJtYXQtZXhwYW5zaW9uLXBhbmVsIixbWyJjbGFzcyIsIm1hdC1leHBhbnNpb24tcGFuZWwiXV0sW1syLCJtYXQtZXhwYW5kZWQiLG51bGxdLFsyLCJtYXQtZXhwYW5zaW9uLXBhbmVsLXNwYWNpbmciLG51bGxdXSxudWxsLG51bGwsTnUsUHUpKSxpLk5hKDYsMTc1MzA4OCxudWxsLDEsU3UsW1szLE91XSxpLmgsQXUuYixpLk5dLG51bGwsbnVsbCksaS5lYigzMzU1NDQzMjAsMSx7X2xhenlDb250ZW50OjB9KSxpLmRiKDI1NixudWxsLE91LHZvaWQgMCxbXSksKHQoKSgpLGkuT2EoOSwwLG51bGwsMCw5LCJtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlciIsW1siY2xhc3MiLCJtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlciJdLFsicm9sZSIsImJ1dHRvbiJdXSxbWzEsImlkIiwwXSxbMSwidGFiaW5kZXgiLDBdLFsxLCJhcmlhLWNvbnRyb2xzIiwwXSxbMSwiYXJpYS1leHBhbmRlZCIsMF0sWzEsImFyaWEtZGlzYWJsZWQiLDBdLFsyLCJtYXQtZXhwYW5kZWQiLG51bGxdLFs0MCwiQGV4cGFuc2lvbkhlaWdodCIsMF1dLFtbbnVsbCwiY2xpY2siXSxbbnVsbCwia2V5ZG93biJdXSxmdW5jdGlvbih0LGUsbil7dmFyIHI9ITA7cmV0dXJuImNsaWNrIj09PWUmJihyPSExIT09aS5ZYSh0LDEwKS5fdG9nZ2xlKCkmJnIpLCJrZXlkb3duIj09PWUmJihyPSExIT09aS5ZYSh0LDEwKS5fa2V5ZG93bihuKSYmcikscn0sTHUsUnUpKSxpLk5hKDEwLDE4MDIyNCxudWxsLDAsRXUsW1N1LGkuayxqdS5iLGkuaF0sbnVsbCxudWxsKSxpLmJiKDExLHtjb2xsYXBzZWRIZWlnaHQ6MCxleHBhbmRlZEhlaWdodDoxfSksaS5iYigxMix7dmFsdWU6MCxwYXJhbXM6MX0pLCh0KCkoKSxpLk9hKDEzLDAsbnVsbCwwLDIsIm1hdC1wYW5lbC10aXRsZSIsW1siY2xhc3MiLCJtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxpLk5hKDE0LDE2Mzg0LG51bGwsMCxUdSxbXSxudWxsLG51bGwpLCh0KCkoKSxpLmdiKC0xLG51bGwsWyIgUHJvamVjdCBkZXNpZ24gIl0pKSwodCgpKCksaS5PYSgxNiwwLG51bGwsMSwyLCJtYXQtcGFuZWwtZGVzY3JpcHRpb24iLFtbImNsYXNzIiwibWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24iXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksaS5OYSgxNywxNjM4NCxudWxsLDAsa3UsW10sbnVsbCxudWxsKSwodCgpKCksaS5nYigtMSxudWxsLFsiIFRoZW9yZXRpY2FsIHVuZGVycGlubmluZyBvZiBvdXIgcHJvamVjdCAiXSkpLCh0KCkoKSxpLmdiKC0xLDEsWyIgQUFBQUFBQUFBQUFhICJdKSksKHQoKSgpLGkuT2EoMjAsMTY3NzcyMTYsbnVsbCxudWxsLDE1LCJtYXQtZXhwYW5zaW9uLXBhbmVsIixbWyJjbGFzcyIsIm1hdC1leHBhbnNpb24tcGFuZWwiXV0sW1syLCJtYXQtZXhwYW5kZWQiLG51bGxdLFsyLCJtYXQtZXhwYW5zaW9uLXBhbmVsLXNwYWNpbmciLG51bGxdXSxudWxsLG51bGwsTnUsUHUpKSxpLk5hKDIxLDE3NTMwODgsbnVsbCwxLFN1LFtbMyxPdV0saS5oLEF1LmIsaS5OXSxudWxsLG51bGwpLGkuZWIoMzM1NTQ0MzIwLDIse19sYXp5Q29udGVudDowfSksaS5kYigyNTYsbnVsbCxPdSx2b2lkIDAsW10pLCh0KCkoKSxpLk9hKDI0LDAsbnVsbCwwLDksIm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIixbWyJjbGFzcyIsIm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIl0sWyJyb2xlIiwiYnV0dG9uIl1dLFtbMSwiaWQiLDBdLFsxLCJ0YWJpbmRleCIsMF0sWzEsImFyaWEtY29udHJvbHMiLDBdLFsxLCJhcmlhLWV4cGFuZGVkIiwwXSxbMSwiYXJpYS1kaXNhYmxlZCIsMF0sWzIsIm1hdC1leHBhbmRlZCIsbnVsbF0sWzQwLCJAZXhwYW5zaW9uSGVpZ2h0IiwwXV0sW1tudWxsLCJjbGljayJdLFtudWxsLCJrZXlkb3duIl1dLGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0hMDtyZXR1cm4iY2xpY2siPT09ZSYmKHI9ITEhPT1pLllhKHQsMjUpLl90b2dnbGUoKSYmciksImtleWRvd24iPT09ZSYmKHI9ITEhPT1pLllhKHQsMjUpLl9rZXlkb3duKG4pJiZyKSxyfSxMdSxSdSkpLGkuTmEoMjUsMTgwMjI0LG51bGwsMCxFdSxbU3UsaS5rLGp1LmIsaS5oXSxudWxsLG51bGwpLGkuYmIoMjYse2NvbGxhcHNlZEhlaWdodDowLGV4cGFuZGVkSGVpZ2h0OjF9KSxpLmJiKDI3LHt2YWx1ZTowLHBhcmFtczoxfSksKHQoKSgpLGkuT2EoMjgsMCxudWxsLDAsMiwibWF0LXBhbmVsLXRpdGxlIixbWyJjbGFzcyIsIm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLGkuTmEoMjksMTYzODQsbnVsbCwwLFR1LFtdLG51bGwsbnVsbCksKHQoKSgpLGkuZ2IoLTEsbnVsbCxbIiBNYXRlcmlhbCBhbmQgbWV0aG9kICJdKSksKHQoKSgpLGkuT2EoMzEsMCxudWxsLDEsMiwibWF0LXBhbmVsLWRlc2NyaXB0aW9uIixbWyJjbGFzcyIsIm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLGkuTmEoMzIsMTYzODQsbnVsbCwwLGt1LFtdLG51bGwsbnVsbCksKHQoKSgpLGkuZ2IoLTEsbnVsbCxbIiBPdXIgZXhwZXJpbWVudGFsIGRlc2lnbnMgJiByZXN1bHRzICJdKSksKHQoKSgpLGkuT2EoMzQsMCxudWxsLDEsMSwicCIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuZ2IoLTEsbnVsbCxbIkknbSB2aXNpYmxlIGJlY2F1c2UgSSBhbSBvcGVuIl0pKV0sZnVuY3Rpb24odCxlKXt0KGUsNCwwLCJ0cnVlIil9LGZ1bmN0aW9uKHQsZSl7dChlLDUsMCxpLllhKGUsNikuZXhwYW5kZWQsaS5ZYShlLDYpLl9oYXNTcGFjaW5nKCkpLHQoZSw5LDAsaS5ZYShlLDEwKS5wYW5lbC5faGVhZGVySWQsaS5ZYShlLDEwKS5wYW5lbC5kaXNhYmxlZD8tMTowLGkuWWEoZSwxMCkuX2dldFBhbmVsSWQoKSxpLllhKGUsMTApLl9pc0V4cGFuZGVkKCksaS5ZYShlLDEwKS5wYW5lbC5kaXNhYmxlZCxpLllhKGUsMTApLl9pc0V4cGFuZGVkKCksdChlLDEyLDAsaS5ZYShlLDEwKS5fZ2V0RXhwYW5kZWRTdGF0ZSgpLHQoZSwxMSwwLGkuWWEoZSwxMCkuY29sbGFwc2VkSGVpZ2h0LGkuWWEoZSwxMCkuZXhwYW5kZWRIZWlnaHQpKSksdChlLDIwLDAsaS5ZYShlLDIxKS5leHBhbmRlZCxpLllhKGUsMjEpLl9oYXNTcGFjaW5nKCkpLHQoZSwyNCwwLGkuWWEoZSwyNSkucGFuZWwuX2hlYWRlcklkLGkuWWEoZSwyNSkucGFuZWwuZGlzYWJsZWQ/LTE6MCxpLllhKGUsMjUpLl9nZXRQYW5lbElkKCksaS5ZYShlLDI1KS5faXNFeHBhbmRlZCgpLGkuWWEoZSwyNSkucGFuZWwuZGlzYWJsZWQsaS5ZYShlLDI1KS5faXNFeHBhbmRlZCgpLHQoZSwyNywwLGkuWWEoZSwyNSkuX2dldEV4cGFuZGVkU3RhdGUoKSx0KGUsMjYsMCxpLllhKGUsMjUpLmNvbGxhcHNlZEhlaWdodCxpLllhKGUsMjUpLmV4cGFuZGVkSGVpZ2h0KSkpfSl9dmFyIHp1PWkuS2EoImFwcC1zaXRlbWFwIixGdSxmdW5jdGlvbih0KXtyZXR1cm4gaS5pYigwLFsodCgpKCksaS5PYSgwLDAsbnVsbCxudWxsLDEsImFwcC1zaXRlbWFwIixbXSxudWxsLG51bGwsbnVsbCxVdSxWdSkpLGkuTmEoMSwxMTQ2ODgsbnVsbCwwLEZ1LFtdLG51bGwsbnVsbCldLGZ1bmN0aW9uKHQsZSl7dChlLDEsMCl9LG51bGwpfSx7fSx7fSxbXSksQnU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5uZ09uSW5pdD1mdW5jdGlvbigpe30sdH0oKSxIdT1pLk1hKHtlbmNhcHN1bGF0aW9uOjAsc3R5bGVzOltbIiNnY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MjBweH0uZGFzaGJvYXJkLWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpsZWZ0fS5kYXNoYm9hcmQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6YXV0b30uZ3JpZC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbjoyMHB4fVxuLyojIHNvdXJjZU1hcHBpbmdVUkw9cHJvamVjdC1kZXRhaWxzLmNvbXBvbmVudC5jc3MubWFwKi8iXV0sZGF0YTp7fX0pO2Z1bmN0aW9uIFd1KHQpe3JldHVybiBpLmliKDAsWyh0KCkoKSxpLk9hKDAsMCxudWxsLG51bGwsNCwiZGl2IixbWyJjbGFzcyIsImdyaWQtY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLk9hKDEsMCxudWxsLG51bGwsMSwiaDEiLFtbImNsYXNzIiwibWF0LWgxIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLmdiKC0xLG51bGwsWyJQcm9qZWN0IGRldGFpbHMiXSkpLCh0KCkoKSxpLk9hKDMsMCxudWxsLG51bGwsMSwibWF0LWNhcmQiLFtbImNsYXNzIiwiZGFzaGJvYXJkLWNhcmQgbWF0LWNhcmQiXV0sbnVsbCxudWxsLG51bGwsUi5kLFIuYSkpLGkuTmEoNCw0OTE1MixudWxsLDAsRC5hLFtdLG51bGwsbnVsbCldLG51bGwsbnVsbCl9dmFyIHF1PWkuS2EoImFwcC1wcm9qZWN0LWRldGFpbHMiLEJ1LGZ1bmN0aW9uKHQpe3JldHVybiBpLmliKDAsWyh0KCkoKSxpLk9hKDAsMCxudWxsLG51bGwsMSwiYXBwLXByb2plY3QtZGV0YWlscyIsW10sbnVsbCxudWxsLG51bGwsV3UsSHUpKSxpLk5hKDEsMTE0Njg4LG51bGwsMCxCdSxbXSxudWxsLG51bGwpXSxmdW5jdGlvbih0LGUpe3QoZSwxLDApfSxudWxsKX0se30se30sW10pLFl1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUubmdPbkluaXQ9ZnVuY3Rpb24oKXt9LHR9KCksR3U9aS5NYSh7ZW5jYXBzdWxhdGlvbjowLHN0eWxlczpbWyIjZ2NvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjIwcHh9LmRhc2hib2FyZC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246bGVmdH0uZGFzaGJvYXJkLWNhcmRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmF1dG99LmdyaWQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MjBweH1cbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWJpb2xvZ3ktc2VjdGlvbi5jb21wb25lbnQuY3NzLm1hcCovIl1dLGRhdGE6e319KTtmdW5jdGlvbiBRdSh0KXtyZXR1cm4gaS5pYigwLFsodCgpKCksaS5PYSgwLDAsbnVsbCxudWxsLDQsImRpdiIsW1siY2xhc3MiLCJncmlkLWNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwodCgpKCksaS5PYSgxLDAsbnVsbCxudWxsLDEsImgxIixbWyJjbGFzcyIsIm1hdC1oMSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwodCgpKCksaS5nYigtMSxudWxsLFsiQmlvbG9neSJdKSksKHQoKSgpLGkuT2EoMywwLG51bGwsbnVsbCwxLCJtYXQtY2FyZCIsW1siY2xhc3MiLCJkYXNoYm9hcmQtY2FyZCBtYXQtY2FyZCJdXSxudWxsLG51bGwsbnVsbCxSLmQsUi5hKSksaS5OYSg0LDQ5MTUyLG51bGwsMCxELmEsW10sbnVsbCxudWxsKV0sbnVsbCxudWxsKX12YXIgS3U9aS5LYSgiYXBwLWJpb2xvZ3ktc2VjdGlvbiIsWXUsZnVuY3Rpb24odCl7cmV0dXJuIGkuaWIoMCxbKHQoKSgpLGkuT2EoMCwwLG51bGwsbnVsbCwxLCJhcHAtYmlvbG9neS1zZWN0aW9uIixbXSxudWxsLG51bGwsbnVsbCxRdSxHdSkpLGkuTmEoMSwxMTQ2ODgsbnVsbCwwLFl1LFtdLG51bGwsbnVsbCldLGZ1bmN0aW9uKHQsZSl7dChlLDEsMCl9LG51bGwpfSx7fSx7fSxbXSksWnU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5uZ09uSW5pdD1mdW5jdGlvbigpe30sdH0oKSxYdT1pLk1hKHtlbmNhcHN1bGF0aW9uOjAsc3R5bGVzOltbIiNnY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MjBweH0uZGFzaGJvYXJkLWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpsZWZ0fS5kYXNoYm9hcmQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6YXV0b30uZ3JpZC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbjoyMHB4fVxuLyojIHNvdXJjZU1hcHBpbmdVUkw9Y29tcHV0aW5nLXNlY3Rpb24uY29tcG9uZW50LmNzcy5tYXAqLyJdXSxkYXRhOnt9fSk7ZnVuY3Rpb24gJHUodCl7cmV0dXJuIGkuaWIoMCxbKHQoKSgpLGkuT2EoMCwwLG51bGwsbnVsbCw0LCJkaXYiLFtbImNsYXNzIiwiZ3JpZC1jb250YWluZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuT2EoMSwwLG51bGwsbnVsbCwxLCJoMSIsW1siY2xhc3MiLCJtYXQtaDEiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuZ2IoLTEsbnVsbCxbIk1vZGVsaW5nICYgU29mdHdhcmUiXSkpLCh0KCkoKSxpLk9hKDMsMCxudWxsLG51bGwsMSwibWF0LWNhcmQiLFtbImNsYXNzIiwiZGFzaGJvYXJkLWNhcmQgbWF0LWNhcmQiXV0sbnVsbCxudWxsLG51bGwsUi5kLFIuYSkpLGkuTmEoNCw0OTE1MixudWxsLDAsRC5hLFtdLG51bGwsbnVsbCldLG51bGwsbnVsbCl9dmFyIEp1PWkuS2EoImFwcC1jb21wdXRpbmctc2VjdGlvbiIsWnUsZnVuY3Rpb24odCl7cmV0dXJuIGkuaWIoMCxbKHQoKSgpLGkuT2EoMCwwLG51bGwsbnVsbCwxLCJhcHAtY29tcHV0aW5nLXNlY3Rpb24iLFtdLG51bGwsbnVsbCxudWxsLCR1LFh1KSksaS5OYSgxLDExNDY4OCxudWxsLDAsWnUsW10sbnVsbCxudWxsKV0sZnVuY3Rpb24odCxlKXt0KGUsMSwwKX0sbnVsbCl9LHt9LHt9LFtdKSx0bD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLm5nT25Jbml0PWZ1bmN0aW9uKCl7fSx0fSgpLGVsPWkuTWEoe2VuY2Fwc3VsYXRpb246MCxzdHlsZXM6W1siI2djb250YWluZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbjoyMHB4fS5kYXNoYm9hcmQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWFsaWduOmxlZnR9LmRhc2hib2FyZC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzphdXRvfS5ncmlkLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjIwcHh9XG4vKiMgc291cmNlTWFwcGluZ1VSTD1odW1hbi1wcmFjdGljZS1zZWN0aW9uLmNvbXBvbmVudC5jc3MubWFwKi8iXV0sZGF0YTp7fX0pO2Z1bmN0aW9uIG5sKHQpe3JldHVybiBpLmliKDAsWyh0KCkoKSxpLk9hKDAsMCxudWxsLG51bGwsNCwiZGl2IixbWyJjbGFzcyIsImdyaWQtY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLk9hKDEsMCxudWxsLG51bGwsMSwiaDEiLFtbImNsYXNzIiwibWF0LWgxIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLmdiKC0xLG51bGwsWyJIdW1hbiBQcmFjdGljZXMiXSkpLCh0KCkoKSxpLk9hKDMsMCxudWxsLG51bGwsMSwibWF0LWNhcmQiLFtbImNsYXNzIiwiZGFzaGJvYXJkLWNhcmQgbWF0LWNhcmQiXV0sbnVsbCxudWxsLG51bGwsUi5kLFIuYSkpLGkuTmEoNCw0OTE1MixudWxsLDAsRC5hLFtdLG51bGwsbnVsbCldLG51bGwsbnVsbCl9dmFyIHJsPWkuS2EoImFwcC1odW1hbi1wcmFjdGljZS1zZWN0aW9uIix0bCxmdW5jdGlvbih0KXtyZXR1cm4gaS5pYigwLFsodCgpKCksaS5PYSgwLDAsbnVsbCxudWxsLDEsImFwcC1odW1hbi1wcmFjdGljZS1zZWN0aW9uIixbXSxudWxsLG51bGwsbnVsbCxubCxlbCkpLGkuTmEoMSwxMTQ2ODgsbnVsbCwwLHRsLFtdLG51bGwsbnVsbCldLGZ1bmN0aW9uKHQsZSl7dChlLDEsMCl9LG51bGwpfSx7fSx7fSxbXSksaWw9bigiOG1NciIpLG9sPW4oIkZ6cWMiKSxhbD1uKCJXZjRwIiksc2w9aS5NYSh7ZW5jYXBzdWxhdGlvbjoyLHN0eWxlczpbIkBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDphY3RpdmUpey5tYXQtdG9vbGJhcntvdXRsaW5lOnNvbGlkIDFweH19Lm1hdC10b29sYmFyLXJvdywubWF0LXRvb2xiYXItc2luZ2xlLXJvd3tkaXNwbGF5OmZsZXg7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MCAxNnB4O3dpZHRoOjEwMCU7ZmxleC1kaXJlY3Rpb246cm93O2FsaWduLWl0ZW1zOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1hdC10b29sYmFyLW11bHRpcGxlLXJvd3N7ZGlzcGxheTpmbGV4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47d2lkdGg6MTAwJX0ubWF0LXRvb2xiYXItbXVsdGlwbGUtcm93c3ttaW4taGVpZ2h0OjY0cHh9Lm1hdC10b29sYmFyLXJvdywubWF0LXRvb2xiYXItc2luZ2xlLXJvd3toZWlnaHQ6NjRweH1AbWVkaWEgKG1heC13aWR0aDo1OTlweCl7Lm1hdC10b29sYmFyLW11bHRpcGxlLXJvd3N7bWluLWhlaWdodDo1NnB4fS5tYXQtdG9vbGJhci1yb3csLm1hdC10b29sYmFyLXNpbmdsZS1yb3d7aGVpZ2h0OjU2cHh9fSJdLGRhdGE6e319KTtmdW5jdGlvbiB1bCh0KXtyZXR1cm4gaS5pYigyLFtpLlhhKG51bGwsMCksaS5YYShudWxsLDEpXSxudWxsLG51bGwpfXZhciBsbD1uKCJidWp0IiksY2w9bigiVW9kSCIpLGZsPW4oIndGdzEiKSxobD1uKCJNcitYIiksZGw9bigiU01zbSIpLHBsPW4oImJuZTUiKSxtbD1uKCJHaTNpIik7ZnVuY3Rpb24geWwodCl7dGhyb3cgRXJyb3IoIkEgZHJhd2VyIHdhcyBhbHJlYWR5IGRlY2xhcmVkIGZvciAncG9zaXRpb249XCIiK3QrIlwiJyIpfXZhciBnbD1uZXcgaS5vKCJNQVRfRFJBV0VSX0RFRkFVTFRfQVVUT1NJWkUiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OmZ1bmN0aW9uKCl7cmV0dXJuITF9fSksdmw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9dCx0aGlzLl9jb250YWluZXI9ZX1yZXR1cm4gdC5wcm90b3R5cGUubmdBZnRlckNvbnRlbnRJbml0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9jb250YWluZXIuX2NvbnRlbnRNYXJnaW5DaGFuZ2VzLnN1YnNjcmliZShmdW5jdGlvbigpe3QuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSl9LHR9KCksYmw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLHIsbyxhKXt2YXIgcz10aGlzO3RoaXMuX2VsZW1lbnRSZWY9dCx0aGlzLl9mb2N1c1RyYXBGYWN0b3J5PWUsdGhpcy5fZm9jdXNNb25pdG9yPW4sdGhpcy5fcGxhdGZvcm09cix0aGlzLl9uZ1pvbmU9byx0aGlzLl9kb2M9YSx0aGlzLl9lbGVtZW50Rm9jdXNlZEJlZm9yZURyYXdlcldhc09wZW5lZD1udWxsLHRoaXMuX2VuYWJsZUFuaW1hdGlvbnM9ITEsdGhpcy5fcG9zaXRpb249InN0YXJ0Iix0aGlzLl9tb2RlPSJvdmVyIix0aGlzLl9kaXNhYmxlQ2xvc2U9ITEsdGhpcy5fYXV0b0ZvY3VzPSEwLHRoaXMuX2FuaW1hdGlvblN0YXJ0ZWQ9bmV3IGkubSx0aGlzLl9hbmltYXRpb25TdGF0ZT0idm9pZCIsdGhpcy5vcGVuZWRDaGFuZ2U9bmV3IGkubSghMCksdGhpcy5vblBvc2l0aW9uQ2hhbmdlZD1uZXcgaS5tLHRoaXMuX21vZGVDaGFuZ2VkPW5ldyB2LmEsdGhpcy5fb3BlbmVkPSExLHRoaXMub3BlbmVkQ2hhbmdlLnN1YnNjcmliZShmdW5jdGlvbih0KXt0PyhzLl9kb2MmJihzLl9lbGVtZW50Rm9jdXNlZEJlZm9yZURyYXdlcldhc09wZW5lZD1zLl9kb2MuYWN0aXZlRWxlbWVudCkscy5faXNGb2N1c1RyYXBFbmFibGVkJiZzLl9mb2N1c1RyYXAmJnMuX3RyYXBGb2N1cygpKTpzLl9yZXN0b3JlRm9jdXMoKX0pLHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcihmdW5jdGlvbigpe09iamVjdChwbC5hKShzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsImtleWRvd24iKS5waXBlKE9iamVjdChfdS5hKShmdW5jdGlvbih0KXtyZXR1cm4gdC5rZXlDb2RlPT09eHUuZSYmIXMuZGlzYWJsZUNsb3NlfSkpLnN1YnNjcmliZShmdW5jdGlvbih0KXtyZXR1cm4gcy5fbmdab25lLnJ1bihmdW5jdGlvbigpe3MuY2xvc2UoKSx0LnN0b3BQcm9wYWdhdGlvbigpfSl9KX0pfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInBvc2l0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9ufSxzZXQ6ZnVuY3Rpb24odCl7KHQ9ImVuZCI9PT10PyJlbmQiOiJzdGFydCIpIT10aGlzLl9wb3NpdGlvbiYmKHRoaXMuX3Bvc2l0aW9uPXQsdGhpcy5vblBvc2l0aW9uQ2hhbmdlZC5lbWl0KCkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwibW9kZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb2RlfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fbW9kZT10LHRoaXMuX21vZGVDaGFuZ2VkLm5leHQoKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImRpc2FibGVDbG9zZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNhYmxlQ2xvc2V9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9kaXNhYmxlQ2xvc2U9T2JqZWN0KEMuYikodCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJhdXRvRm9jdXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXV0b0ZvY3VzfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fYXV0b0ZvY3VzPU9iamVjdChDLmIpKHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiX29wZW5lZFN0cmVhbSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wZW5lZENoYW5nZS5waXBlKE9iamVjdChfdS5hKShmdW5jdGlvbih0KXtyZXR1cm4gdH0pLE9iamVjdCh3LmEpKGZ1bmN0aW9uKCl7fSkpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwib3BlbmVkU3RhcnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uU3RhcnRlZC5waXBlKE9iamVjdChfdS5hKShmdW5jdGlvbih0KXtyZXR1cm4gdC5mcm9tU3RhdGUhPT10LnRvU3RhdGUmJjA9PT10LnRvU3RhdGUuaW5kZXhPZigib3BlbiIpfSksT2JqZWN0KHcuYSkoZnVuY3Rpb24oKXt9KSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJfY2xvc2VkU3RyZWFtIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3BlbmVkQ2hhbmdlLnBpcGUoT2JqZWN0KF91LmEpKGZ1bmN0aW9uKHQpe3JldHVybiF0fSksT2JqZWN0KHcuYSkoZnVuY3Rpb24oKXt9KSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjbG9zZWRTdGFydCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbmltYXRpb25TdGFydGVkLnBpcGUoT2JqZWN0KF91LmEpKGZ1bmN0aW9uKHQpe3JldHVybiB0LmZyb21TdGF0ZSE9PXQudG9TdGF0ZSYmInZvaWQiPT09dC50b1N0YXRlfSksT2JqZWN0KHcuYSkoZnVuY3Rpb24oKXt9KSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJfaXNGb2N1c1RyYXBFbmFibGVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3BlbmVkJiYic2lkZSIhPT10aGlzLm1vZGV9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5wcm90b3R5cGUuX3RyYXBGb2N1cz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5hdXRvRm9jdXMmJnRoaXMuX2ZvY3VzVHJhcC5mb2N1c0luaXRpYWxFbGVtZW50V2hlblJlYWR5KCkudGhlbihmdW5jdGlvbihlKXtlfHwiZnVuY3Rpb24iIT10eXBlb2YgdC5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzfHx0Ll9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKX0pfSx0LnByb3RvdHlwZS5fcmVzdG9yZUZvY3VzPWZ1bmN0aW9uKCl7aWYodGhpcy5hdXRvRm9jdXMpe3ZhciB0PXRoaXMuX2RvYyYmdGhpcy5fZG9jLmFjdGl2ZUVsZW1lbnQ7dCYmdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHQpJiYodGhpcy5fZWxlbWVudEZvY3VzZWRCZWZvcmVEcmF3ZXJXYXNPcGVuZWQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD90aGlzLl9mb2N1c01vbml0b3IuZm9jdXNWaWEodGhpcy5fZWxlbWVudEZvY3VzZWRCZWZvcmVEcmF3ZXJXYXNPcGVuZWQsdGhpcy5fb3BlbmVkVmlhKTp0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYmx1cigpKSx0aGlzLl9lbGVtZW50Rm9jdXNlZEJlZm9yZURyYXdlcldhc09wZW5lZD1udWxsLHRoaXMuX29wZW5lZFZpYT1udWxsfX0sdC5wcm90b3R5cGUubmdBZnRlckNvbnRlbnRJbml0PWZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNUcmFwPXRoaXMuX2ZvY3VzVHJhcEZhY3RvcnkuY3JlYXRlKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCksdGhpcy5fZm9jdXNUcmFwLmVuYWJsZWQ9dGhpcy5faXNGb2N1c1RyYXBFbmFibGVkfSx0LnByb3RvdHlwZS5uZ0FmdGVyQ29udGVudENoZWNrZWQ9ZnVuY3Rpb24oKXt0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJih0aGlzLl9lbmFibGVBbmltYXRpb25zPSEwKX0sdC5wcm90b3R5cGUubmdPbkRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c1RyYXAmJnRoaXMuX2ZvY3VzVHJhcC5kZXN0cm95KCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwib3BlbmVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29wZW5lZH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMudG9nZ2xlKE9iamVjdChDLmIpKHQpKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRvZ2dsZSghMCx0KX0sdC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b2dnbGUoITEpfSx0LnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiB2b2lkIDA9PT10JiYodD0hdGhpcy5vcGVuZWQpLHZvaWQgMD09PWUmJihlPSJwcm9ncmFtIiksdGhpcy5fb3BlbmVkPXQsdD8odGhpcy5fYW5pbWF0aW9uU3RhdGU9dGhpcy5fZW5hYmxlQW5pbWF0aW9ucz8ib3BlbiI6Im9wZW4taW5zdGFudCIsdGhpcy5fb3BlbmVkVmlhPWUpOih0aGlzLl9hbmltYXRpb25TdGF0ZT0idm9pZCIsdGhpcy5fcmVzdG9yZUZvY3VzKCkpLHRoaXMuX2ZvY3VzVHJhcCYmKHRoaXMuX2ZvY3VzVHJhcC5lbmFibGVkPXRoaXMuX2lzRm9jdXNUcmFwRW5hYmxlZCksbmV3IFByb21pc2UoZnVuY3Rpb24odCl7bi5vcGVuZWRDaGFuZ2UucGlwZShPYmplY3Qod3UuYSkoMSkpLnN1YnNjcmliZShmdW5jdGlvbihlKXtyZXR1cm4gdChlPyJvcGVuIjoiY2xvc2UiKX0pfSl9LHQucHJvdG90eXBlLl9vbkFuaW1hdGlvblN0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuX2FuaW1hdGlvblN0YXJ0ZWQuZW1pdCh0KX0sdC5wcm90b3R5cGUuX29uQW5pbWF0aW9uRW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZnJvbVN0YXRlLG49dC50b1N0YXRlOygwPT09bi5pbmRleE9mKCJvcGVuIikmJiJ2b2lkIj09PWV8fCJ2b2lkIj09PW4mJjA9PT1lLmluZGV4T2YoIm9wZW4iKSkmJnRoaXMub3BlbmVkQ2hhbmdlLmVtaXQodGhpcy5fb3BlbmVkKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJfd2lkdGgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50JiZ0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGh8fDB9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdH0oKSxfbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4scixvLGEpe3ZvaWQgMD09PW8mJihvPSExKTt2YXIgcz10aGlzO3RoaXMuX2Rpcj10LHRoaXMuX2VsZW1lbnQ9ZSx0aGlzLl9uZ1pvbmU9bix0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZj1yLHRoaXMuX2FuaW1hdGlvbk1vZGU9YSx0aGlzLmJhY2tkcm9wQ2xpY2s9bmV3IGkubSx0aGlzLl9kZXN0cm95ZWQ9bmV3IHYuYSx0aGlzLl9kb0NoZWNrU3ViamVjdD1uZXcgdi5hLHRoaXMuX2NvbnRlbnRNYXJnaW5zPXtsZWZ0Om51bGwscmlnaHQ6bnVsbH0sdGhpcy5fY29udGVudE1hcmdpbkNoYW5nZXM9bmV3IHYuYSx0JiZ0LmNoYW5nZS5waXBlKE9iamVjdCh4LmEpKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZShmdW5jdGlvbigpe3MuX3ZhbGlkYXRlRHJhd2VycygpLHMuX3VwZGF0ZUNvbnRlbnRNYXJnaW5zKCl9KSx0aGlzLl9hdXRvc2l6ZT1vfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInN0YXJ0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0YXJ0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiZW5kIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImF1dG9zaXplIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F1dG9zaXplfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fYXV0b3NpemU9T2JqZWN0KEMuYikodCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJoYXNCYWNrZHJvcCIse2dldDpmdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLl9iYWNrZHJvcE92ZXJyaWRlPyF0aGlzLl9zdGFydHx8InNpZGUiIT09dGhpcy5fc3RhcnQubW9kZXx8IXRoaXMuX2VuZHx8InNpZGUiIT09dGhpcy5fZW5kLm1vZGU6dGhpcy5fYmFja2Ryb3BPdmVycmlkZX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2JhY2tkcm9wT3ZlcnJpZGU9bnVsbD09dD9udWxsOk9iamVjdChDLmIpKHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLm5nQWZ0ZXJDb250ZW50SW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fZHJhd2Vycy5jaGFuZ2VzLnBpcGUoT2JqZWN0KE8uYSkobnVsbCkpLnN1YnNjcmliZShmdW5jdGlvbigpe3QuX3ZhbGlkYXRlRHJhd2VycygpLHQuX2RyYXdlcnMuZm9yRWFjaChmdW5jdGlvbihlKXt0Ll93YXRjaERyYXdlclRvZ2dsZShlKSx0Ll93YXRjaERyYXdlclBvc2l0aW9uKGUpLHQuX3dhdGNoRHJhd2VyTW9kZShlKX0pLCghdC5fZHJhd2Vycy5sZW5ndGh8fHQuX2lzRHJhd2VyT3Blbih0Ll9zdGFydCl8fHQuX2lzRHJhd2VyT3Blbih0Ll9lbmQpKSYmdC5fdXBkYXRlQ29udGVudE1hcmdpbnMoKSx0Ll9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX0pLHRoaXMuX2RvQ2hlY2tTdWJqZWN0LnBpcGUoT2JqZWN0KG1sLmEpKDEwKSxPYmplY3QoeC5hKSh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtyZXR1cm4gdC5fdXBkYXRlQ29udGVudE1hcmdpbnMoKX0pfSx0LnByb3RvdHlwZS5uZ09uRGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2RvQ2hlY2tTdWJqZWN0LmNvbXBsZXRlKCksdGhpcy5fZGVzdHJveWVkLm5leHQoKSx0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKX0sdC5wcm90b3R5cGUub3Blbj1mdW5jdGlvbigpe3RoaXMuX2RyYXdlcnMuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdC5vcGVuKCl9KX0sdC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLl9kcmF3ZXJzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xvc2UoKX0pfSx0LnByb3RvdHlwZS5uZ0RvQ2hlY2s9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2F1dG9zaXplJiZ0aGlzLl9pc1B1c2hlZCgpJiZ0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24oKXtyZXR1cm4gdC5fZG9DaGVja1N1YmplY3QubmV4dCgpfSl9LHQucHJvdG90eXBlLl93YXRjaERyYXdlclRvZ2dsZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3QuX2FuaW1hdGlvblN0YXJ0ZWQucGlwZShPYmplY3QoeC5hKSh0aGlzLl9kcmF3ZXJzLmNoYW5nZXMpLE9iamVjdChfdS5hKShmdW5jdGlvbih0KXtyZXR1cm4gdC5mcm9tU3RhdGUhPT10LnRvU3RhdGV9KSkuc3Vic2NyaWJlKGZ1bmN0aW9uKHQpeyJvcGVuLWluc3RhbnQiIT09dC50b1N0YXRlJiYiTm9vcEFuaW1hdGlvbnMiIT09ZS5fYW5pbWF0aW9uTW9kZSYmZS5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoIm1hdC1kcmF3ZXItdHJhbnNpdGlvbiIpLGUuX3VwZGF0ZUNvbnRlbnRNYXJnaW5zKCksZS5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9KSwic2lkZSIhPT10Lm1vZGUmJnQub3BlbmVkQ2hhbmdlLnBpcGUoT2JqZWN0KHguYSkodGhpcy5fZHJhd2Vycy5jaGFuZ2VzKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX3NldENvbnRhaW5lckNsYXNzKHQub3BlbmVkKX0pfSx0LnByb3RvdHlwZS5fd2F0Y2hEcmF3ZXJQb3NpdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3QmJnQub25Qb3NpdGlvbkNoYW5nZWQucGlwZShPYmplY3QoeC5hKSh0aGlzLl9kcmF3ZXJzLmNoYW5nZXMpKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtlLl9uZ1pvbmUub25NaWNyb3Rhc2tFbXB0eS5hc09ic2VydmFibGUoKS5waXBlKE9iamVjdCh3dS5hKSgxKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7ZS5fdmFsaWRhdGVEcmF3ZXJzKCl9KX0pfSx0LnByb3RvdHlwZS5fd2F0Y2hEcmF3ZXJNb2RlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dCYmdC5fbW9kZUNoYW5nZWQucGlwZShPYmplY3QoeC5hKShPYmplY3QoYnUuYSkodGhpcy5fZHJhd2Vycy5jaGFuZ2VzLHRoaXMuX2Rlc3Ryb3llZCkpKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtlLl91cGRhdGVDb250ZW50TWFyZ2lucygpLGUuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSl9LHQucHJvdG90eXBlLl9zZXRDb250YWluZXJDbGFzcz1mdW5jdGlvbih0KXt0P3RoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCJtYXQtZHJhd2VyLW9wZW5lZCIpOnRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJtYXQtZHJhd2VyLW9wZW5lZCIpfSx0LnByb3RvdHlwZS5fdmFsaWRhdGVEcmF3ZXJzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9zdGFydD10aGlzLl9lbmQ9bnVsbCx0aGlzLl9kcmF3ZXJzLmZvckVhY2goZnVuY3Rpb24oZSl7ImVuZCI9PWUucG9zaXRpb24/KG51bGwhPXQuX2VuZCYmeWwoImVuZCIpLHQuX2VuZD1lKToobnVsbCE9dC5fc3RhcnQmJnlsKCJzdGFydCIpLHQuX3N0YXJ0PWUpfSksdGhpcy5fcmlnaHQ9dGhpcy5fbGVmdD1udWxsLHRoaXMuX2RpciYmInJ0bCI9PT10aGlzLl9kaXIudmFsdWU/KHRoaXMuX2xlZnQ9dGhpcy5fZW5kLHRoaXMuX3JpZ2h0PXRoaXMuX3N0YXJ0KToodGhpcy5fbGVmdD10aGlzLl9zdGFydCx0aGlzLl9yaWdodD10aGlzLl9lbmQpfSx0LnByb3RvdHlwZS5faXNQdXNoZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNEcmF3ZXJPcGVuKHRoaXMuX3N0YXJ0KSYmIm92ZXIiIT10aGlzLl9zdGFydC5tb2RlfHx0aGlzLl9pc0RyYXdlck9wZW4odGhpcy5fZW5kKSYmIm92ZXIiIT10aGlzLl9lbmQubW9kZX0sdC5wcm90b3R5cGUuX29uQmFja2Ryb3BDbGlja2VkPWZ1bmN0aW9uKCl7dGhpcy5iYWNrZHJvcENsaWNrLmVtaXQoKSx0aGlzLl9jbG9zZU1vZGFsRHJhd2VyKCl9LHQucHJvdG90eXBlLl9jbG9zZU1vZGFsRHJhd2VyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztbdGhpcy5fc3RhcnQsdGhpcy5fZW5kXS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiFlLmRpc2FibGVDbG9zZSYmdC5fY2FuSGF2ZUJhY2tkcm9wKGUpfSkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gdC5jbG9zZSgpfSl9LHQucHJvdG90eXBlLl9pc1Nob3dpbmdCYWNrZHJvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0RyYXdlck9wZW4odGhpcy5fc3RhcnQpJiZ0aGlzLl9jYW5IYXZlQmFja2Ryb3AodGhpcy5fc3RhcnQpfHx0aGlzLl9pc0RyYXdlck9wZW4odGhpcy5fZW5kKSYmdGhpcy5fY2FuSGF2ZUJhY2tkcm9wKHRoaXMuX2VuZCl9LHQucHJvdG90eXBlLl9jYW5IYXZlQmFja2Ryb3A9ZnVuY3Rpb24odCl7cmV0dXJuInNpZGUiIT09dC5tb2RlfHwhIXRoaXMuX2JhY2tkcm9wT3ZlcnJpZGV9LHQucHJvdG90eXBlLl9pc0RyYXdlck9wZW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJnQub3BlbmVkfSx0LnByb3RvdHlwZS5fdXBkYXRlQ29udGVudE1hcmdpbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9MCxuPTA7aWYodGhpcy5fbGVmdCYmdGhpcy5fbGVmdC5vcGVuZWQmJigic2lkZSI9PXRoaXMuX2xlZnQubW9kZT9lKz10aGlzLl9sZWZ0Ll93aWR0aDoicHVzaCI9PXRoaXMuX2xlZnQubW9kZSYmKGUrPXI9dGhpcy5fbGVmdC5fd2lkdGgsbi09cikpLHRoaXMuX3JpZ2h0JiZ0aGlzLl9yaWdodC5vcGVuZWQpaWYoInNpZGUiPT10aGlzLl9yaWdodC5tb2RlKW4rPXRoaXMuX3JpZ2h0Ll93aWR0aDtlbHNlIGlmKCJwdXNoIj09dGhpcy5fcmlnaHQubW9kZSl7dmFyIHI7bis9cj10aGlzLl9yaWdodC5fd2lkdGgsZS09cn1lPT09dGhpcy5fY29udGVudE1hcmdpbnMubGVmdCYmbj09PXRoaXMuX2NvbnRlbnRNYXJnaW5zLnJpZ2h0fHwodGhpcy5fY29udGVudE1hcmdpbnM9e2xlZnQ6ZSxyaWdodDpufSx0aGlzLl9uZ1pvbmUucnVuKGZ1bmN0aW9uKCl7cmV0dXJuIHQuX2NvbnRlbnRNYXJnaW5DaGFuZ2VzLm5leHQodC5fY29udGVudE1hcmdpbnMpfSkpfSx0fSgpLHdsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSxuKXx8dGhpc31yZXR1cm4gT2JqZWN0KGwuYikoZSx0KSxlfSh2bCkseGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fZml4ZWRJblZpZXdwb3J0PSExLGUuX2ZpeGVkVG9wR2FwPTAsZS5fZml4ZWRCb3R0b21HYXA9MCxlfXJldHVybiBPYmplY3QobC5iKShlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiZml4ZWRJblZpZXdwb3J0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpeGVkSW5WaWV3cG9ydH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2ZpeGVkSW5WaWV3cG9ydD1PYmplY3QoQy5iKSh0KX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImZpeGVkVG9wR2FwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpeGVkVG9wR2FwfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fZml4ZWRUb3BHYXA9T2JqZWN0KEMuZCkodCl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJmaXhlZEJvdHRvbUdhcCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9maXhlZEJvdHRvbUdhcH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2ZpeGVkQm90dG9tR2FwPU9iamVjdChDLmQpKHQpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGV9KGJsKSxPbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gT2JqZWN0KGwuYikoZSx0KSxlfShfbCksQ2w9ZnVuY3Rpb24oKXt9LFNsPW4oInFBbFMiKSxFbD1pLk1hKHtlbmNhcHN1bGF0aW9uOjIsc3R5bGVzOltdLGRhdGE6e319KTtmdW5jdGlvbiBrbCh0KXtyZXR1cm4gaS5pYigyLFtpLlhhKG51bGwsMCldLG51bGwsbnVsbCl9dmFyIFRsPWkuTWEoe2VuY2Fwc3VsYXRpb246MixzdHlsZXM6W10sZGF0YTp7YW5pbWF0aW9uOlt7dHlwZTo3LG5hbWU6InRyYW5zZm9ybSIsZGVmaW5pdGlvbnM6W3t0eXBlOjAsbmFtZToib3Blbiwgb3Blbi1pbnN0YW50IixzdHlsZXM6e3R5cGU6NixzdHlsZXM6e3RyYW5zZm9ybToidHJhbnNsYXRlM2QoMCwgMCwgMCkiLHZpc2liaWxpdHk6InZpc2libGUifSxvZmZzZXQ6bnVsbH0sb3B0aW9uczp2b2lkIDB9LHt0eXBlOjAsbmFtZToidm9pZCIsc3R5bGVzOnt0eXBlOjYsc3R5bGVzOnsiYm94LXNoYWRvdyI6Im5vbmUiLHZpc2liaWxpdHk6ImhpZGRlbiJ9LG9mZnNldDpudWxsfSxvcHRpb25zOnZvaWQgMH0se3R5cGU6MSxleHByOiJ2b2lkID0+IG9wZW4taW5zdGFudCIsYW5pbWF0aW9uOnt0eXBlOjQsc3R5bGVzOm51bGwsdGltaW5nczoiMG1zIn0sb3B0aW9uczpudWxsfSx7dHlwZToxLGV4cHI6InZvaWQgPD0+IG9wZW4sIG9wZW4taW5zdGFudCA9PiB2b2lkIixhbmltYXRpb246e3R5cGU6NCxzdHlsZXM6bnVsbCx0aW1pbmdzOiI0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSJ9LG9wdGlvbnM6bnVsbH1dLG9wdGlvbnM6e319XX19KTtmdW5jdGlvbiBJbCh0KXtyZXR1cm4gaS5pYigyLFtpLlhhKG51bGwsMCldLG51bGwsbnVsbCl9dmFyIEFsPWkuTWEoe2VuY2Fwc3VsYXRpb246MixzdHlsZXM6WyIubWF0LWRyYXdlci1jb250YWluZXJ7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoxO2JveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbn0ubWF0LWRyYXdlci1jb250YWluZXJbZnVsbHNjcmVlbl17dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGV9Lm1hdC1kcmF3ZXItY29udGFpbmVyW2Z1bGxzY3JlZW5dLm1hdC1kcmF3ZXItb3BlbmVke292ZXJmbG93OmhpZGRlbn0ubWF0LWRyYXdlci1jb250YWluZXIubWF0LWRyYXdlci1jb250YWluZXItZXhwbGljaXQtYmFja2Ryb3AgLm1hdC1kcmF3ZXItc2lkZXt6LWluZGV4OjN9Lm1hdC1kcmF3ZXItYmFja2Ryb3B7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jazt6LWluZGV4OjM7dmlzaWJpbGl0eTpoaWRkZW59Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bnt2aXNpYmlsaXR5OnZpc2libGV9Lm1hdC1kcmF3ZXItdHJhbnNpdGlvbiAubWF0LWRyYXdlci1iYWNrZHJvcHt0cmFuc2l0aW9uLWR1cmF0aW9uOi40czt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjI1LC44LC4yNSwxKTt0cmFuc2l0aW9uLXByb3BlcnR5OmJhY2tncm91bmQtY29sb3IsdmlzaWJpbGl0eX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsubWF0LWRyYXdlci1iYWNrZHJvcHtvcGFjaXR5Oi41fX0ubWF0LWRyYXdlci1jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MTtkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlO292ZXJmbG93OmF1dG99Lm1hdC1kcmF3ZXItdHJhbnNpdGlvbiAubWF0LWRyYXdlci1jb250ZW50e3RyYW5zaXRpb24tZHVyYXRpb246LjRzO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjUsLjgsLjI1LDEpO3RyYW5zaXRpb24tcHJvcGVydHk6dHJhbnNmb3JtLG1hcmdpbi1sZWZ0LG1hcmdpbi1yaWdodH0ubWF0LWRyYXdlcntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjQ7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDt6LWluZGV4OjM7b3V0bGluZTowO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdy15OmF1dG87dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCl9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OmFjdGl2ZSl7Lm1hdC1kcmF3ZXIsW2Rpcj1ydGxdIC5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItZW5ke2JvcmRlci1yaWdodDpzb2xpZCAxcHggY3VycmVudENvbG9yfX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsubWF0LWRyYXdlci5tYXQtZHJhd2VyLWVuZCxbZGlyPXJ0bF0gLm1hdC1kcmF3ZXJ7Ym9yZGVyLWxlZnQ6c29saWQgMXB4IGN1cnJlbnRDb2xvcjtib3JkZXItcmlnaHQ6bm9uZX19Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1zaWRle3otaW5kZXg6Mn0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLWVuZHtyaWdodDowO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCl9W2Rpcj1ydGxdIC5tYXQtZHJhd2Vye3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCl9W2Rpcj1ydGxdIC5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItZW5ke2xlZnQ6MDtyaWdodDphdXRvO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApfS5tYXQtZHJhd2VyOm5vdCgubWF0LWRyYXdlci1zaWRlKXtib3gtc2hhZG93OjAgOHB4IDEwcHggLTVweCByZ2JhKDAsMCwwLC4yKSwwIDE2cHggMjRweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgNnB4IDMwcHggNXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LXNpZGVuYXYtZml4ZWR7cG9zaXRpb246Zml4ZWR9Il0sZGF0YTp7fX0pO2Z1bmN0aW9uIGpsKHQpe3JldHVybiBpLmliKDAsWyh0KCkoKSxpLk9hKDAsMCxudWxsLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsIm1hdC1kcmF3ZXItYmFja2Ryb3AiXV0sW1syLCJtYXQtZHJhd2VyLXNob3duIixudWxsXV0sW1tudWxsLCJjbGljayJdXSxmdW5jdGlvbih0LGUsbil7dmFyIHI9ITA7cmV0dXJuImNsaWNrIj09PWUmJihyPSExIT09dC5jb21wb25lbnQuX29uQmFja2Ryb3BDbGlja2VkKCkmJnIpLHJ9LG51bGwsbnVsbCkpXSxudWxsLGZ1bmN0aW9uKHQsZSl7dChlLDAsMCxlLmNvbXBvbmVudC5faXNTaG93aW5nQmFja2Ryb3AoKSl9KX1mdW5jdGlvbiBQbCh0KXtyZXR1cm4gaS5pYigwLFsodCgpKCksaS5PYSgwLDAsbnVsbCxudWxsLDMsIm1hdC1zaWRlbmF2LWNvbnRlbnQiLFtbImNka1Njcm9sbGFibGUiLCIiXSxbImNsYXNzIiwibWF0LWRyYXdlci1jb250ZW50IG1hdC1zaWRlbmF2LWNvbnRlbnQiXV0sW1s0LCJtYXJnaW4tbGVmdCIsInB4Il0sWzQsIm1hcmdpbi1yaWdodCIsInB4Il1dLG51bGwsbnVsbCxrbCxFbCkpLGkuTmEoMSwyMTI5OTIsW1sxLDRdXSwwLFNsLmEsW2kuayxTbC5jLGkueF0sbnVsbCxudWxsKSxpLk5hKDIsMTA5NzcyOCxudWxsLDAsd2wsW2kuaCxPbF0sbnVsbCxudWxsKSxpLlhhKDAsMildLGZ1bmN0aW9uKHQsZSl7dChlLDEsMCl9LGZ1bmN0aW9uKHQsZSl7dChlLDAsMCxpLllhKGUsMikuX2NvbnRhaW5lci5fY29udGVudE1hcmdpbnMubGVmdCxpLllhKGUsMikuX2NvbnRhaW5lci5fY29udGVudE1hcmdpbnMucmlnaHQpfSl9ZnVuY3Rpb24gTWwodCl7cmV0dXJuIGkuaWIoMixbaS5lYig2NzEwODg2NDAsMSx7c2Nyb2xsYWJsZTowfSksKHQoKSgpLGkuRmEoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxqbCkpLGkuTmEoMiwxNjM4NCxudWxsLDAsYS5rLFtpLk4saS5LXSx7bmdJZjpbMCwibmdJZiJdfSxudWxsKSxpLlhhKG51bGwsMCksaS5YYShudWxsLDEpLCh0KCkoKSxpLkZhKDE2Nzc3MjE2LG51bGwsbnVsbCwxLG51bGwsUGwpKSxpLk5hKDYsMTYzODQsbnVsbCwwLGEuayxbaS5OLGkuS10se25nSWY6WzAsIm5nSWYiXX0sbnVsbCldLGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5jb21wb25lbnQ7dChlLDIsMCxuLmhhc0JhY2tkcm9wKSx0KGUsNiwwLCFuLl9jb250ZW50KX0sbnVsbCl9dmFyIE5sPW4oIjAvUTYiKSxSbD1uKCJMQzVwIik7bigiZ0ljWSIpO3ZhciBEbD1pLk1hKHtlbmNhcHN1bGF0aW9uOjIsc3R5bGVzOlsiLm1hdC1kaXZpZGVye2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyLXRvcC13aWR0aDoxcHg7Ym9yZGVyLXRvcC1zdHlsZTpzb2xpZH0ubWF0LWRpdmlkZXIubWF0LWRpdmlkZXItdmVydGljYWx7Ym9yZGVyLXRvcDowO2JvcmRlci1yaWdodC13aWR0aDoxcHg7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkfS5tYXQtZGl2aWRlci5tYXQtZGl2aWRlci1pbnNldHttYXJnaW4tbGVmdDo4MHB4fVtkaXI9cnRsXSAubWF0LWRpdmlkZXIubWF0LWRpdmlkZXItaW5zZXR7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6ODBweH0ubWF0LXN1YmhlYWRlcntkaXNwbGF5OmZsZXg7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MTZweDthbGlnbi1pdGVtczpjZW50ZXJ9Lm1hdC1saXN0IC5tYXQtc3ViaGVhZGVyLC5tYXQtbmF2LWxpc3QgLm1hdC1zdWJoZWFkZXIsLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LXN1YmhlYWRlcnttYXJnaW46MH0ubWF0LWxpc3QsLm1hdC1uYXYtbGlzdCwubWF0LXNlbGVjdGlvbi1saXN0e3BhZGRpbmctdG9wOjhweDtkaXNwbGF5OmJsb2NrfS5tYXQtbGlzdCAubWF0LXN1YmhlYWRlciwubWF0LW5hdi1saXN0IC5tYXQtc3ViaGVhZGVyLC5tYXQtc2VsZWN0aW9uLWxpc3QgLm1hdC1zdWJoZWFkZXJ7aGVpZ2h0OjQ4cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWxpc3QgLm1hdC1zdWJoZWFkZXI6Zmlyc3QtY2hpbGQsLm1hdC1uYXYtbGlzdCAubWF0LXN1YmhlYWRlcjpmaXJzdC1jaGlsZCwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtc3ViaGVhZGVyOmZpcnN0LWNoaWxke21hcmdpbi10b3A6LThweH0ubWF0LWxpc3QgLm1hdC1saXN0LWl0ZW0sLm1hdC1saXN0IC5tYXQtbGlzdC1vcHRpb24sLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSwubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1vcHRpb24sLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbSwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1vcHRpb257ZGlzcGxheTpibG9jaztoZWlnaHQ6NDhweH0ubWF0LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWl0ZW0tY29udGVudCwubWF0LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaXRlbS1jb250ZW50LC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWl0ZW0tY29udGVudCwubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudCwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQsLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnR7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MCAxNnB4O3Bvc2l0aW9uOnJlbGF0aXZlO2hlaWdodDppbmhlcml0fS5tYXQtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50LXJldmVyc2UsLm1hdC1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaXRlbS1jb250ZW50LXJldmVyc2UsLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50LXJldmVyc2UsLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQtcmV2ZXJzZXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO3BhZGRpbmc6MCAxNnB4O2ZsZXgtZGlyZWN0aW9uOnJvdy1yZXZlcnNlO2p1c3RpZnktY29udGVudDpzcGFjZS1hcm91bmR9Lm1hdC1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pdGVtLXJpcHBsZSwubWF0LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaXRlbS1yaXBwbGUsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1yaXBwbGUsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1pdGVtLXJpcHBsZSwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pdGVtLXJpcHBsZSwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tcmlwcGxle3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1saXN0IC5tYXQtbGlzdC1pdGVtLm1hdC1saXN0LWl0ZW0td2l0aC1hdmF0YXIsLm1hdC1saXN0IC5tYXQtbGlzdC1vcHRpb24ubWF0LWxpc3QtaXRlbS13aXRoLWF2YXRhciwubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtLm1hdC1saXN0LWl0ZW0td2l0aC1hdmF0YXIsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3Qtb3B0aW9uLm1hdC1saXN0LWl0ZW0td2l0aC1hdmF0YXIsLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbS5tYXQtbGlzdC1pdGVtLXdpdGgtYXZhdGFyLC5tYXQtc2VsZWN0aW9uLWxpc3QgLm1hdC1saXN0LW9wdGlvbi5tYXQtbGlzdC1pdGVtLXdpdGgtYXZhdGFye2hlaWdodDo1NnB4fS5tYXQtbGlzdCAubWF0LWxpc3QtaXRlbS5tYXQtMi1saW5lLC5tYXQtbGlzdCAubWF0LWxpc3Qtb3B0aW9uLm1hdC0yLWxpbmUsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbS5tYXQtMi1saW5lLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LW9wdGlvbi5tYXQtMi1saW5lLC5tYXQtc2VsZWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW0ubWF0LTItbGluZSwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1vcHRpb24ubWF0LTItbGluZXtoZWlnaHQ6NzJweH0ubWF0LWxpc3QgLm1hdC1saXN0LWl0ZW0ubWF0LTMtbGluZSwubWF0LWxpc3QgLm1hdC1saXN0LW9wdGlvbi5tYXQtMy1saW5lLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW0ubWF0LTMtbGluZSwubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1vcHRpb24ubWF0LTMtbGluZSwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtLm1hdC0zLWxpbmUsLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3Qtb3B0aW9uLm1hdC0zLWxpbmV7aGVpZ2h0Ojg4cHh9Lm1hdC1saXN0IC5tYXQtbGlzdC1pdGVtLm1hdC1tdWx0aS1saW5lLC5tYXQtbGlzdCAubWF0LWxpc3Qtb3B0aW9uLm1hdC1tdWx0aS1saW5lLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW0ubWF0LW11bHRpLWxpbmUsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3Qtb3B0aW9uLm1hdC1tdWx0aS1saW5lLC5tYXQtc2VsZWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW0ubWF0LW11bHRpLWxpbmUsLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3Qtb3B0aW9uLm1hdC1tdWx0aS1saW5le2hlaWdodDphdXRvfS5tYXQtbGlzdCAubWF0LWxpc3QtaXRlbS5tYXQtbXVsdGktbGluZSAubWF0LWxpc3QtaXRlbS1jb250ZW50LC5tYXQtbGlzdCAubWF0LWxpc3Qtb3B0aW9uLm1hdC1tdWx0aS1saW5lIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbS5tYXQtbXVsdGktbGluZSAubWF0LWxpc3QtaXRlbS1jb250ZW50LC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LW9wdGlvbi5tYXQtbXVsdGktbGluZSAubWF0LWxpc3QtaXRlbS1jb250ZW50LC5tYXQtc2VsZWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW0ubWF0LW11bHRpLWxpbmUgLm1hdC1saXN0LWl0ZW0tY29udGVudCwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1vcHRpb24ubWF0LW11bHRpLWxpbmUgLm1hdC1saXN0LWl0ZW0tY29udGVudHtwYWRkaW5nLXRvcDoxNnB4O3BhZGRpbmctYm90dG9tOjE2cHh9Lm1hdC1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC10ZXh0LC5tYXQtbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC10ZXh0LC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LXRleHQsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC10ZXh0LC5tYXQtc2VsZWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LXRleHQsLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC10ZXh0e2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47d2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MH0ubWF0LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LXRleHQ+KiwubWF0LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtdGV4dD4qLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LXRleHQ+KiwubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LXRleHQ+KiwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC10ZXh0PiosLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC10ZXh0Pip7bWFyZ2luOjA7cGFkZGluZzowO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6aW5oZXJpdH0ubWF0LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LXRleHQ6ZW1wdHksLm1hdC1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LXRleHQ6ZW1wdHksLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtdGV4dDplbXB0eSwubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LXRleHQ6ZW1wdHksLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtdGV4dDplbXB0eSwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LXRleHQ6ZW1wdHl7ZGlzcGxheTpub25lfS5tYXQtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50IC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSwubWF0LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaXRlbS1jb250ZW50IC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSwubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQgLm1hdC1saXN0LXRleHQ6bm90KDpudGgtY2hpbGQoMikpLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaXRlbS1jb250ZW50IC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQgLm1hdC1saXN0LXRleHQ6bm90KDpudGgtY2hpbGQoMikpLC5tYXQtc2VsZWN0aW9uLWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaXRlbS1jb250ZW50IC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKXtwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjE2cHh9W2Rpcj1ydGxdIC5tYXQtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50IC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSxbZGlyPXJ0bF0gLm1hdC1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudCAubWF0LWxpc3QtdGV4dDpub3QoOm50aC1jaGlsZCgyKSksW2Rpcj1ydGxdIC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWl0ZW0tY29udGVudCAubWF0LWxpc3QtdGV4dDpub3QoOm50aC1jaGlsZCgyKSksW2Rpcj1ydGxdIC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaXRlbS1jb250ZW50IC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSxbZGlyPXJ0bF0gLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50IC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSxbZGlyPXJ0bF0gLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQgLm1hdC1saXN0LXRleHQ6bm90KDpudGgtY2hpbGQoMikpe3BhZGRpbmctcmlnaHQ6MTZweDtwYWRkaW5nLWxlZnQ6MH0ubWF0LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlIC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSwubWF0LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaXRlbS1jb250ZW50LXJldmVyc2UgLm1hdC1saXN0LXRleHQ6bm90KDpudGgtY2hpbGQoMikpLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlIC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSwubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlIC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQtcmV2ZXJzZSAubWF0LWxpc3QtdGV4dDpub3QoOm50aC1jaGlsZCgyKSksLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQtcmV2ZXJzZSAubWF0LWxpc3QtdGV4dDpub3QoOm50aC1jaGlsZCgyKSl7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDoxNnB4fVtkaXI9cnRsXSAubWF0LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlIC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSxbZGlyPXJ0bF0gLm1hdC1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlIC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSxbZGlyPXJ0bF0gLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50LXJldmVyc2UgLm1hdC1saXN0LXRleHQ6bm90KDpudGgtY2hpbGQoMikpLFtkaXI9cnRsXSAubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlIC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSxbZGlyPXJ0bF0gLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50LXJldmVyc2UgLm1hdC1saXN0LXRleHQ6bm90KDpudGgtY2hpbGQoMikpLFtkaXI9cnRsXSAubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlIC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKXtwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjE2cHh9Lm1hdC1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1hdmF0YXIsLm1hdC1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWF2YXRhciwubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1hdmF0YXIsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1hdmF0YXIsLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtYXZhdGFyLC5tYXQtc2VsZWN0aW9uLWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtYXZhdGFye2ZsZXgtc2hyaW5rOjA7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtib3JkZXItcmFkaXVzOjUwJX0ubWF0LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWF2YXRhcn4ubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWF2YXRhcn4ubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtYXZhdGFyfi5tYXQtZGl2aWRlci1pbnNldCwubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWF2YXRhcn4ubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtYXZhdGFyfi5tYXQtZGl2aWRlci1pbnNldCwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWF2YXRhcn4ubWF0LWRpdmlkZXItaW5zZXR7bWFyZ2luLWxlZnQ6NzJweDt3aWR0aDpjYWxjKDEwMCUgLSA3MnB4KX1bZGlyPXJ0bF0gLm1hdC1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1hdmF0YXJ+Lm1hdC1kaXZpZGVyLWluc2V0LFtkaXI9cnRsXSAubWF0LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtYXZhdGFyfi5tYXQtZGl2aWRlci1pbnNldCxbZGlyPXJ0bF0gLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtYXZhdGFyfi5tYXQtZGl2aWRlci1pbnNldCxbZGlyPXJ0bF0gLm1hdC1uYXYtbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1hdmF0YXJ+Lm1hdC1kaXZpZGVyLWluc2V0LFtkaXI9cnRsXSAubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1hdmF0YXJ+Lm1hdC1kaXZpZGVyLWluc2V0LFtkaXI9cnRsXSAubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWF2YXRhcn4ubWF0LWRpdmlkZXItaW5zZXR7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6NzJweH0ubWF0LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWljb24sLm1hdC1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWljb24sLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaWNvbiwubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWljb24sLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaWNvbiwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWljb257ZmxleC1zaHJpbms6MDt3aWR0aDoyNHB4O2hlaWdodDoyNHB4O2ZvbnQtc2l6ZToyNHB4O2JveC1zaXppbmc6Y29udGVudC1ib3g7Ym9yZGVyLXJhZGl1czo1MCU7cGFkZGluZzo0cHh9Lm1hdC1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pY29ufi5tYXQtZGl2aWRlci1pbnNldCwubWF0LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaWNvbn4ubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaWNvbn4ubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1pY29ufi5tYXQtZGl2aWRlci1pbnNldCwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pY29ufi5tYXQtZGl2aWRlci1pbnNldCwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWljb25+Lm1hdC1kaXZpZGVyLWluc2V0e21hcmdpbi1sZWZ0OjY0cHg7d2lkdGg6Y2FsYygxMDAlIC0gNjRweCl9W2Rpcj1ydGxdIC5tYXQtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaWNvbn4ubWF0LWRpdmlkZXItaW5zZXQsW2Rpcj1ydGxdIC5tYXQtbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1pY29ufi5tYXQtZGl2aWRlci1pbnNldCxbZGlyPXJ0bF0gLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaWNvbn4ubWF0LWRpdmlkZXItaW5zZXQsW2Rpcj1ydGxdIC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaWNvbn4ubWF0LWRpdmlkZXItaW5zZXQsW2Rpcj1ydGxdIC5tYXQtc2VsZWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWljb25+Lm1hdC1kaXZpZGVyLWluc2V0LFtkaXI9cnRsXSAubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWljb25+Lm1hdC1kaXZpZGVyLWluc2V0e21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OjY0cHh9Lm1hdC1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtZGl2aWRlciwubWF0LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWRpdmlkZXIsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWRpdmlkZXIsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtZGl2aWRlciwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtZGl2aWRlciwubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1kaXZpZGVye3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowO2xlZnQ6MDt3aWR0aDoxMDAlO21hcmdpbjowfVtkaXI9cnRsXSAubWF0LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1kaXZpZGVyLFtkaXI9cnRsXSAubWF0LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWRpdmlkZXIsW2Rpcj1ydGxdIC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1kaXZpZGVyLFtkaXI9cnRsXSAubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1kaXZpZGVyLFtkaXI9cnRsXSAubWF0LXNlbGVjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtIC5tYXQtZGl2aWRlcixbZGlyPXJ0bF0gLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtZGl2aWRlcnttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDowfS5tYXQtbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWRpdmlkZXIubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1saXN0IC5tYXQtbGlzdC1vcHRpb24gLm1hdC1kaXZpZGVyLm1hdC1kaXZpZGVyLWluc2V0LC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW0gLm1hdC1kaXZpZGVyLm1hdC1kaXZpZGVyLWluc2V0LC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LW9wdGlvbiAubWF0LWRpdmlkZXIubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbSAubWF0LWRpdmlkZXIubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1zZWxlY3Rpb24tbGlzdCAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtZGl2aWRlci5tYXQtZGl2aWRlci1pbnNldHtwb3NpdGlvbjphYnNvbHV0ZX0ubWF0LWxpc3RbZGVuc2VdLC5tYXQtbmF2LWxpc3RbZGVuc2VdLC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2Vde3BhZGRpbmctdG9wOjRweDtkaXNwbGF5OmJsb2NrfS5tYXQtbGlzdFtkZW5zZV0gLm1hdC1zdWJoZWFkZXIsLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1zdWJoZWFkZXIsLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1zdWJoZWFkZXJ7aGVpZ2h0OjQwcHg7bGluZS1oZWlnaHQ6OHB4fS5tYXQtbGlzdFtkZW5zZV0gLm1hdC1zdWJoZWFkZXI6Zmlyc3QtY2hpbGQsLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1zdWJoZWFkZXI6Zmlyc3QtY2hpbGQsLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1zdWJoZWFkZXI6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDotNHB4fS5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0sLm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uLC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtLC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24sLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0sLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbntkaXNwbGF5OmJsb2NrO2hlaWdodDo0MHB4fS5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWl0ZW0tY29udGVudCwubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudCwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50LC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudCwubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50LC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2FsaWduLWl0ZW1zOmNlbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzowIDE2cHg7cG9zaXRpb246cmVsYXRpdmU7aGVpZ2h0OmluaGVyaXR9Lm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50LXJldmVyc2UsLm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQtcmV2ZXJzZSwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50LXJldmVyc2UsLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaXRlbS1jb250ZW50LXJldmVyc2UsLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlLC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNle2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7cGFkZGluZzowIDE2cHg7ZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2U7anVzdGlmeS1jb250ZW50OnNwYWNlLWFyb3VuZH0ubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pdGVtLXJpcHBsZSwubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tcmlwcGxlLC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pdGVtLXJpcHBsZSwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1pdGVtLXJpcHBsZSwubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1yaXBwbGUsLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaXRlbS1yaXBwbGV7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtLm1hdC1saXN0LWl0ZW0td2l0aC1hdmF0YXIsLm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uLm1hdC1saXN0LWl0ZW0td2l0aC1hdmF0YXIsLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0ubWF0LWxpc3QtaXRlbS13aXRoLWF2YXRhciwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uLm1hdC1saXN0LWl0ZW0td2l0aC1hdmF0YXIsLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0ubWF0LWxpc3QtaXRlbS13aXRoLWF2YXRhciwubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uLm1hdC1saXN0LWl0ZW0td2l0aC1hdmF0YXJ7aGVpZ2h0OjQ4cHh9Lm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbS5tYXQtMi1saW5lLC5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbi5tYXQtMi1saW5lLC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtLm1hdC0yLWxpbmUsLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbi5tYXQtMi1saW5lLC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtLm1hdC0yLWxpbmUsLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbi5tYXQtMi1saW5le2hlaWdodDo2MHB4fS5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0ubWF0LTMtbGluZSwubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24ubWF0LTMtbGluZSwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbS5tYXQtMy1saW5lLC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24ubWF0LTMtbGluZSwubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbS5tYXQtMy1saW5lLC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24ubWF0LTMtbGluZXtoZWlnaHQ6NzZweH0ubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtLm1hdC1tdWx0aS1saW5lLC5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbi5tYXQtbXVsdGktbGluZSwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbS5tYXQtbXVsdGktbGluZSwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uLm1hdC1tdWx0aS1saW5lLC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtLm1hdC1tdWx0aS1saW5lLC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24ubWF0LW11bHRpLWxpbmV7aGVpZ2h0OmF1dG99Lm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbS5tYXQtbXVsdGktbGluZSAubWF0LWxpc3QtaXRlbS1jb250ZW50LC5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbi5tYXQtbXVsdGktbGluZSAubWF0LWxpc3QtaXRlbS1jb250ZW50LC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtLm1hdC1tdWx0aS1saW5lIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQsLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbi5tYXQtbXVsdGktbGluZSAubWF0LWxpc3QtaXRlbS1jb250ZW50LC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtLm1hdC1tdWx0aS1saW5lIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQsLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbi5tYXQtbXVsdGktbGluZSAubWF0LWxpc3QtaXRlbS1jb250ZW50e3BhZGRpbmctdG9wOjE2cHg7cGFkZGluZy1ib3R0b206MTZweH0ubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC10ZXh0LC5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtdGV4dCwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtdGV4dCwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC10ZXh0LC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC10ZXh0LC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LXRleHR7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjt3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowfS5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LXRleHQ+KiwubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LXRleHQ+KiwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtdGV4dD4qLC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LXRleHQ+KiwubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtdGV4dD4qLC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LXRleHQ+KnttYXJnaW46MDtwYWRkaW5nOjA7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZTppbmhlcml0fS5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LXRleHQ6ZW1wdHksLm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC10ZXh0OmVtcHR5LC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC10ZXh0OmVtcHR5LC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LXRleHQ6ZW1wdHksLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LXRleHQ6ZW1wdHksLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtdGV4dDplbXB0eXtkaXNwbGF5Om5vbmV9Lm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50IC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSwubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudCAubWF0LWxpc3QtdGV4dDpub3QoOm50aC1jaGlsZCgyKSksLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWl0ZW0tY29udGVudCAubWF0LWxpc3QtdGV4dDpub3QoOm50aC1jaGlsZCgyKSksLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaXRlbS1jb250ZW50IC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSwubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50IC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSwubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQgLm1hdC1saXN0LXRleHQ6bm90KDpudGgtY2hpbGQoMikpe3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MTZweH1bZGlyPXJ0bF0gLm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50IC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSxbZGlyPXJ0bF0gLm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQgLm1hdC1saXN0LXRleHQ6bm90KDpudGgtY2hpbGQoMikpLFtkaXI9cnRsXSAubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50IC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSxbZGlyPXJ0bF0gLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaXRlbS1jb250ZW50IC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSxbZGlyPXJ0bF0gLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWl0ZW0tY29udGVudCAubWF0LWxpc3QtdGV4dDpub3QoOm50aC1jaGlsZCgyKSksW2Rpcj1ydGxdIC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudCAubWF0LWxpc3QtdGV4dDpub3QoOm50aC1jaGlsZCgyKSl7cGFkZGluZy1yaWdodDoxNnB4O3BhZGRpbmctbGVmdDowfS5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlIC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSwubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlIC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50LXJldmVyc2UgLm1hdC1saXN0LXRleHQ6bm90KDpudGgtY2hpbGQoMikpLC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlIC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSwubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaXRlbS1jb250ZW50LXJldmVyc2UgLm1hdC1saXN0LXRleHQ6bm90KDpudGgtY2hpbGQoMikpLC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlIC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjE2cHh9W2Rpcj1ydGxdIC5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlIC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSxbZGlyPXJ0bF0gLm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQtcmV2ZXJzZSAubWF0LWxpc3QtdGV4dDpub3QoOm50aC1jaGlsZCgyKSksW2Rpcj1ydGxdIC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQtcmV2ZXJzZSAubWF0LWxpc3QtdGV4dDpub3QoOm50aC1jaGlsZCgyKSksW2Rpcj1ydGxdIC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlIC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSxbZGlyPXJ0bF0gLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWl0ZW0tY29udGVudC1yZXZlcnNlIC5tYXQtbGlzdC10ZXh0Om5vdCg6bnRoLWNoaWxkKDIpKSxbZGlyPXJ0bF0gLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaXRlbS1jb250ZW50LXJldmVyc2UgLm1hdC1saXN0LXRleHQ6bm90KDpudGgtY2hpbGQoMikpe3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MTZweH0ubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1hdmF0YXIsLm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1hdmF0YXIsLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWF2YXRhciwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1hdmF0YXIsLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWF2YXRhciwubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1hdmF0YXJ7ZmxleC1zaHJpbms6MDt3aWR0aDozNnB4O2hlaWdodDozNnB4O2JvcmRlci1yYWRpdXM6NTAlfS5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWF2YXRhcn4ubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1hdmF0YXJ+Lm1hdC1kaXZpZGVyLWluc2V0LC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1hdmF0YXJ+Lm1hdC1kaXZpZGVyLWluc2V0LC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWF2YXRhcn4ubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWF2YXRhcn4ubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtYXZhdGFyfi5tYXQtZGl2aWRlci1pbnNldHttYXJnaW4tbGVmdDo2OHB4O3dpZHRoOmNhbGMoMTAwJSAtIDY4cHgpfVtkaXI9cnRsXSAubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1hdmF0YXJ+Lm1hdC1kaXZpZGVyLWluc2V0LFtkaXI9cnRsXSAubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWF2YXRhcn4ubWF0LWRpdmlkZXItaW5zZXQsW2Rpcj1ydGxdIC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1hdmF0YXJ+Lm1hdC1kaXZpZGVyLWluc2V0LFtkaXI9cnRsXSAubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1hdmF0YXJ+Lm1hdC1kaXZpZGVyLWluc2V0LFtkaXI9cnRsXSAubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtYXZhdGFyfi5tYXQtZGl2aWRlci1pbnNldCxbZGlyPXJ0bF0gLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtYXZhdGFyfi5tYXQtZGl2aWRlci1pbnNldHttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDo2OHB4fS5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWljb24sLm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1pY29uLC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pY29uLC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWljb24sLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saXN0LWljb24sLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaWNvbntmbGV4LXNocmluazowO3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Zm9udC1zaXplOjIwcHg7Ym94LXNpemluZzpjb250ZW50LWJveDtib3JkZXItcmFkaXVzOjUwJTtwYWRkaW5nOjRweH0ubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pY29ufi5tYXQtZGl2aWRlci1pbnNldCwubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saXN0LWljb25+Lm1hdC1kaXZpZGVyLWluc2V0LC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pY29ufi5tYXQtZGl2aWRlci1pbnNldCwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGlzdC1pY29ufi5tYXQtZGl2aWRlci1pbnNldCwubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaWNvbn4ubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaWNvbn4ubWF0LWRpdmlkZXItaW5zZXR7bWFyZ2luLWxlZnQ6NjBweDt3aWR0aDpjYWxjKDEwMCUgLSA2MHB4KX1bZGlyPXJ0bF0gLm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpc3QtaWNvbn4ubWF0LWRpdmlkZXItaW5zZXQsW2Rpcj1ydGxdIC5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaWNvbn4ubWF0LWRpdmlkZXItaW5zZXQsW2Rpcj1ydGxdIC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pY29ufi5tYXQtZGl2aWRlci1pbnNldCxbZGlyPXJ0bF0gLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaWNvbn4ubWF0LWRpdmlkZXItaW5zZXQsW2Rpcj1ydGxdIC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGlzdC1pY29ufi5tYXQtZGl2aWRlci1pbnNldCxbZGlyPXJ0bF0gLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpc3QtaWNvbn4ubWF0LWRpdmlkZXItaW5zZXR7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6NjBweH0ubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtZGl2aWRlciwubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1kaXZpZGVyLC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtZGl2aWRlciwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtZGl2aWRlciwubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWRpdmlkZXIsLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWRpdmlkZXJ7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjA7bGVmdDowO3dpZHRoOjEwMCU7bWFyZ2luOjB9W2Rpcj1ydGxdIC5tYXQtbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1kaXZpZGVyLFtkaXI9cnRsXSAubWF0LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1kaXZpZGVyLFtkaXI9cnRsXSAubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWRpdmlkZXIsW2Rpcj1ydGxdIC5tYXQtbmF2LWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1kaXZpZGVyLFtkaXI9cnRsXSAubWF0LXNlbGVjdGlvbi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWRpdmlkZXIsW2Rpcj1ydGxdIC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1kaXZpZGVye21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OjB9Lm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWRpdmlkZXIubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1saXN0W2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtZGl2aWRlci5tYXQtZGl2aWRlci1pbnNldCwubWF0LW5hdi1saXN0W2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWRpdmlkZXIubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1uYXYtbGlzdFtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWRpdmlkZXIubWF0LWRpdmlkZXItaW5zZXQsLm1hdC1zZWxlY3Rpb24tbGlzdFtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1kaXZpZGVyLm1hdC1kaXZpZGVyLWluc2V0LC5tYXQtc2VsZWN0aW9uLWxpc3RbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1kaXZpZGVyLm1hdC1kaXZpZGVyLWluc2V0e3Bvc2l0aW9uOmFic29sdXRlfS5tYXQtbmF2LWxpc3QgYXt0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjppbmhlcml0fS5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW17Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTowfS5tYXQtbGlzdC1vcHRpb246bm90KC5tYXQtbGlzdC1pdGVtLWRpc2FibGVkKXtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOjB9Il0sZGF0YTp7fX0pO2Z1bmN0aW9uIExsKHQpe3JldHVybiBpLmliKDIsW2kuWGEobnVsbCwwKV0sbnVsbCxudWxsKX12YXIgRmw9aS5NYSh7ZW5jYXBzdWxhdGlvbjoyLHN0eWxlczpbXSxkYXRhOnt9fSk7ZnVuY3Rpb24gVmwodCl7cmV0dXJuIGkuaWIoMixbKHQoKSgpLGkuT2EoMCwwLG51bGwsbnVsbCw2LCJkaXYiLFtbImNsYXNzIiwibWF0LWxpc3QtaXRlbS1jb250ZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLk9hKDEsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC1saXN0LWl0ZW0tcmlwcGxlIG1hdC1yaXBwbGUiXSxbIm1hdC1yaXBwbGUiLCIiXV0sW1syLCJtYXQtcmlwcGxlLXVuYm91bmRlZCIsbnVsbF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSxpLk5hKDIsMjEyOTkyLG51bGwsMCxhbC5xLFtpLmssaS54LHUuYSxbMixhbC5nXSxbMixmbC5hXV0se2Rpc2FibGVkOlswLCJkaXNhYmxlZCJdLHRyaWdnZXI6WzEsInRyaWdnZXIiXX0sbnVsbCksaS5YYShudWxsLDApLCh0KCkoKSxpLk9hKDQsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC1saXN0LXRleHQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksaS5YYShudWxsLDEpLGkuWGEobnVsbCwyKV0sZnVuY3Rpb24odCxlKXt2YXIgbj1lLmNvbXBvbmVudDt0KGUsMiwwLG4uX2lzUmlwcGxlRGlzYWJsZWQoKSxuLl9nZXRIb3N0RWxlbWVudCgpKX0sZnVuY3Rpb24odCxlKXt0KGUsMSwwLGkuWWEoZSwyKS51bmJvdW5kZWQpfSl9dmFyIFVsPW4oIlpZQ2kiKSx6bD1uKCIyMUxiIiksQmw9bigiT3pmQiIpLEhsPW4oIk1obSsiKSxXbD1pLk1hKHtlbmNhcHN1bGF0aW9uOjAsc3R5bGVzOltbImJvZHlbX25nY29udGVudC0lQ09NUCVde21hcmdpbjoyZW19LmZpbGwtdG9vbGJhci1zcGFjZVtfbmdjb250ZW50LSVDT01QJV17ZmxleDoxIDEgYXV0b30uc2lkZW5hdi1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlfS5zaWRlbmF2W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMDBweDtib3gtc2hhZG93OjNweCAwIDZweCByZ2JhKDAsMCwwLC4yNCl9I3NpdGVtYXBidXRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowO3dpZHRoOjEwMCV9bWF0LWljb25bX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6M3B4fSNzaWRlbmF2ZmxleGNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde21heC13aWR0aDoxMDAwcHh9XG4vKiMgc291cmNlTWFwcGluZ1VSTD1hcHAuY29tcG9uZW50LmNzcy5tYXAqLyJdXSxkYXRhOnt9fSk7ZnVuY3Rpb24gcWwodCl7cmV0dXJuIGkuaWIoMCxbKHQoKSgpLGkuT2EoMCwwLG51bGwsbnVsbCwxMzAsImRpdiIsW1siY2xhc3MiLCJtYXQtYXBwLWJhY2tncm91bmQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKHQoKSgpLGkuT2EoMSwwLG51bGwsbnVsbCwxNywibWF0LXRvb2xiYXIiLFtbImNsYXNzIiwibWF0LXRvb2xiYXIiXSxbImNvbG9yIiwiYWNjZW50Il1dLFtbMiwibWF0LXRvb2xiYXItbXVsdGlwbGUtcm93cyIsbnVsbF0sWzIsIm1hdC10b29sYmFyLXNpbmdsZS1yb3ciLG51bGxdXSxudWxsLG51bGwsdWwsc2wpKSxpLk5hKDIsNDI0MzQ1NixudWxsLDEsaWwuYSxbaS5rLHUuYSxhLmRdLHtjb2xvcjpbMCwiY29sb3IiXX0sbnVsbCksaS5lYig2MDM5Nzk3NzYsMSx7X3Rvb2xiYXJSb3dzOjF9KSwodCgpKCksaS5PYSg0LDAsbnVsbCwwLDQsImJ1dHRvbiIsW1sibWF0LWljb24tYnV0dG9uIiwiIl1dLFtbOCwiZGlzYWJsZWQiLDBdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLFtbbnVsbCwiY2xpY2siXV0sZnVuY3Rpb24odCxlLG4pe3ZhciByPSEwO3JldHVybiJjbGljayI9PT1lJiYocj0hMSE9PXQuY29tcG9uZW50Lm9wZW5TaWRlTmF2KCkmJnIpLHJ9LGxsLmIsbGwuYSkpLGkuTmEoNSwxODAyMjQsbnVsbCwwLGNsLmIsW2kuayx1LmEsanUuYixbMixmbC5hXV0sbnVsbCxudWxsKSwodCgpKCksaS5PYSg2LDAsbnVsbCwwLDIsIm1hdC1pY29uIixbWyJjbGFzcyIsIm1hdC1pY29uIl0sWyJyb2xlIiwiaW1nIl1dLFtbMiwibWF0LWljb24taW5saW5lIixudWxsXV0sbnVsbCxudWxsLGhsLmIsaGwuYSkpLGkuTmEoNyw2Mzg5NzYsbnVsbCwwLGRsLmEsW2kuayxkbC5jLFs4LG51bGxdXSxudWxsLG51bGwpLCh0KCkoKSxpLmdiKC0xLDAsWyJtZW51Il0pKSwodCgpKCksaS5PYSg5LDAsbnVsbCwwLDAsInNwYW4iLFtbImNsYXNzIiwiZmlsbC10b29sYmFyLXNwYWNlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLk9hKDEwLDAsbnVsbCwwLDEsInNwYW4iLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLmdiKC0xLG51bGwsWyJNZVRocmlYIl0pKSwodCgpKCksaS5PYSgxMiwwLG51bGwsMCwwLCJzcGFuIixbWyJzdHlsZSIsIndpZHRoOjAuMmVtIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLk9hKDEzLDAsbnVsbCwwLDAsImltZyIsW1sic3JjIiwiaHR0cDovLzIwMTguaWdlbS5vcmcvd2lraS9pbWFnZXMvYy9jMC9ULS1HT19QYXJpcy1TYWNsYXktLWdvLXBzLXdoaXRlLnBuZyJdLFsic3R5bGUiLCJtYXgtaGVpZ2h0OjEwMCU7IHdpZHRoOmF1dG87IHBhZGRpbmc6MWVtOyJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwodCgpKCksaS5PYSgxNCwwLG51bGwsMCwwLCJzcGFuIixbWyJzdHlsZSIsIndpZHRoOjAuMmVtIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLk9hKDE1LDAsbnVsbCwwLDMsInNwYW4iLFtbInN0eWxlIiwidGV4dC1hbGlnbjogY2VudGVyO2xpbmUtaGVpZ2h0OiA4NSU7IGZvbnQtc2l6ZTogbWVkaXVtOyJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwodCgpKCksaS5nYigtMSxudWxsLFsiVGVhbSBHTyJdKSksKHQoKSgpLGkuT2EoMTcsMCxudWxsLG51bGwsMCwiYnIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLmdiKC0xLG51bGwsWyJQYXJpc1NhY2xheSJdKSksKHQoKSgpLGkuT2EoMTksMCxudWxsLG51bGwsMTExLCJtYXQtc2lkZW5hdi1jb250YWluZXIiLFtbImNsYXNzIiwic2lkZW5hdi1jb250YWluZXIgbWF0LWRyYXdlci1jb250YWluZXIgbWF0LXNpZGVuYXYtY29udGFpbmVyIl1dLFtbMiwibWF0LWRyYXdlci1jb250YWluZXItZXhwbGljaXQtYmFja2Ryb3AiLG51bGxdXSxudWxsLG51bGwsTWwsQWwpKSxpLk5hKDIwLDE0OTA5NDQsbnVsbCwyLE9sLFtbMixvbC5iXSxpLmssaS54LGkuaCxnbCxbMixmbC5hXV0sbnVsbCxudWxsKSxpLmViKDYwMzk3OTc3NiwyLHtfZHJhd2VyczoxfSksaS5lYigzMzU1NDQzMjAsMyx7X2NvbnRlbnQ6MH0pLCh0KCkoKSxpLk9hKDIzLDAsbnVsbCwwLDk5LCJtYXQtc2lkZW5hdiIsW1siY2xhc3MiLCJzaWRlbmF2IG1hdC1kcmF3ZXIgbWF0LXNpZGVuYXYiXSxbImZpeGVkSW5WaWV3cG9ydCIsInRydWUiXSxbInRhYkluZGV4IiwiLTEiXV0sW1sxLCJyb2xlIiwwXSxbNDAsIkB0cmFuc2Zvcm0iLDBdLFsxLCJhbGlnbiIsMF0sWzIsIm1hdC1kcmF3ZXItZW5kIixudWxsXSxbMiwibWF0LWRyYXdlci1vdmVyIixudWxsXSxbMiwibWF0LWRyYXdlci1wdXNoIixudWxsXSxbMiwibWF0LWRyYXdlci1zaWRlIixudWxsXSxbMiwibWF0LXNpZGVuYXYtZml4ZWQiLG51bGxdLFs0LCJ0b3AiLCJweCJdLFs0LCJib3R0b20iLCJweCJdXSxbWyJjb21wb25lbnQiLCJAdHJhbnNmb3JtLnN0YXJ0Il0sWyJjb21wb25lbnQiLCJAdHJhbnNmb3JtLmRvbmUiXV0sZnVuY3Rpb24odCxlLG4pe3ZhciByPSEwO3JldHVybiJjb21wb25lbnQ6QHRyYW5zZm9ybS5zdGFydCI9PT1lJiYocj0hMSE9PWkuWWEodCwyNCkuX29uQW5pbWF0aW9uU3RhcnQobikmJnIpLCJjb21wb25lbnQ6QHRyYW5zZm9ybS5kb25lIj09PWUmJihyPSExIT09aS5ZYSh0LDI0KS5fb25BbmltYXRpb25FbmQobikmJnIpLHJ9LElsLFRsKSksaS5OYSgyNCwzMzI1OTUyLFtbMiw0XSxbImRyYXdlciIsNF1dLDAseGwsW2kuayxqdS5jLGp1LmIsdS5hLGkueCxbMixhLmRdXSx7bW9kZTpbMCwibW9kZSJdLG9wZW5lZDpbMSwib3BlbmVkIl0sZml4ZWRJblZpZXdwb3J0OlsyLCJmaXhlZEluVmlld3BvcnQiXX0sbnVsbCksaS5hYigxMzEwNzIsYS5iLFtpLmhdKSxpLmFiKDEzMTA3MixhLmIsW2kuaF0pLCh0KCkoKSxpLk9hKDI3LDAsbnVsbCwwLDksIm1hdC10b29sYmFyIixbWyJjbGFzcyIsIm1hdC10b29sYmFyIl0sWyJjb2xvciIsInByaW1hcnkiXSxbInN0eWxlIiwibWFyZ2luLXRvcDogMTVweDsiXV0sW1syLCJtYXQtdG9vbGJhci1tdWx0aXBsZS1yb3dzIixudWxsXSxbMiwibWF0LXRvb2xiYXItc2luZ2xlLXJvdyIsbnVsbF1dLG51bGwsbnVsbCx1bCxzbCkpLGkuTmEoMjgsNDI0MzQ1NixudWxsLDEsaWwuYSxbaS5rLHUuYSxhLmRdLHtjb2xvcjpbMCwiY29sb3IiXX0sbnVsbCksaS5lYig2MDM5Nzk3NzYsNCx7X3Rvb2xiYXJSb3dzOjF9KSwodCgpKCksaS5nYigtMSwwLFsiTmF2aWdhdGlvbiAiXSkpLCh0KCkoKSxpLk9hKDMxLDAsbnVsbCwwLDAsInNwYW4iLFtbImNsYXNzIiwiZmlsbC10b29sYmFyLXNwYWNlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLCh0KCkoKSxpLk9hKDMyLDAsbnVsbCwwLDQsImJ1dHRvbiIsW1sibWF0LWljb24tYnV0dG9uIiwiIl1dLFtbOCwiZGlzYWJsZWQiLDBdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLFtbbnVsbCwiY2xpY2siXV0sZnVuY3Rpb24odCxlLG4pe3ZhciByPSEwO3JldHVybiJjbGljayI9PT1lJiYocj0hMSE9PXQuY29tcG9uZW50Lm9wZW5TaWRlTmF2KCkmJnIpLHJ9LGxsLmIsbGwuYSkpLGkuTmEoMzMsMTgwMjI0LG51bGwsMCxjbC5iLFtpLmssdS5hLGp1LmIsWzIsZmwuYV1dLG51bGwsbnVsbCksKHQoKSgpLGkuT2EoMzQsMCxudWxsLDAsMiwibWF0LWljb24iLFtbImNsYXNzIiwibWF0LWljb24iXSxbInJvbGUiLCJpbWciXV0sW1syLCJtYXQtaWNvbi1pbmxpbmUiLG51bGxdXSxudWxsLG51bGwsaGwuYixobC5hKSksaS5OYSgzNSw2Mzg5NzYsbnVsbCwwLGRsLmEsW2kuayxkbC5jLFs4LG51bGxdXSxudWxsLG51bGwpLCh0KCkoKSxpLmdiKC0xLDAsWyJrZXlib2FyZF9hcnJvd19sZWZ0Il0pKSwodCgpKCksaS5PYSgzNywwLG51bGwsMCw4NSwibWF0LW5hdi1saXN0IixbWyJjbGFzcyIsIm1hdC1uYXYtbGlzdCJdLFsicm9sZSIsIm5hdmlnYXRpb24iXV0sbnVsbCxudWxsLG51bGwsTGwsRGwpKSxpLk5hKDM4LDQ5MTUyLG51bGwsMCxObC5lLFtdLG51bGwsbnVsbCksKHQoKSgpLGkuT2EoMzksMCxudWxsLDAsNywiYSIsW1siY2xhc3MiLCJtYXQtbGlzdC1pdGVtIl0sWyJtYXQtbGlzdC1pdGVtIiwiIl1dLFtbMiwibWF0LWxpc3QtaXRlbS1hdmF0YXIiLG51bGxdLFsyLCJtYXQtbGlzdC1pdGVtLXdpdGgtYXZhdGFyIixudWxsXV0sW1tudWxsLCJjbGljayJdLFtudWxsLCJmb2N1cyJdLFtudWxsLCJibHVyIl1dLGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0hMCxvPXQuY29tcG9uZW50O3JldHVybiJmb2N1cyI9PT1lJiYocj0hMSE9PWkuWWEodCw0MCkuX2hhbmRsZUZvY3VzKCkmJnIpLCJibHVyIj09PWUmJihyPSExIT09aS5ZYSh0LDQwKS5faGFuZGxlQmx1cigpJiZyKSwiY2xpY2siPT09ZSYmKHI9ITEhPT1vLnJvdXRlckxpbmtDaHVua1Byb2Nlc3NpbmcoIi9kYXNoYm9hcmQiKSYmcikscn0sVmwsRmwpKSxpLk5hKDQwLDEwOTc3MjgsbnVsbCwyLE5sLmIsW2kuayxbMixObC5lXV0sbnVsbCxudWxsKSxpLmViKDYwMzk3OTc3Niw1LHtfbGluZXM6MX0pLGkuZWIoMzM1NTQ0MzIwLDYse19hdmF0YXI6MH0pLCh0KCkoKSxpLk9hKDQzLDAsbnVsbCwyLDIsIm1hdC1pY29uIixbWyJjbGFzcyIsIm1hdC1pY29uIl0sWyJyb2xlIiwiaW1nIl1dLFtbMiwibWF0LWljb24taW5saW5lIixudWxsXV0sbnVsbCxudWxsLGhsLmIsaGwuYSkpLGkuTmEoNDQsNjM4OTc2LG51bGwsMCxkbC5hLFtpLmssZGwuYyxbOCxudWxsXV0sbnVsbCxudWxsKSwodCgpKCksaS5nYigtMSwwLFsiZGFzaGJvYXJkIl0pKSwodCgpKCksaS5nYigtMSwyLFsiIE1haW4gcGFnZSJdKSksKHQoKSgpLGkuT2EoNDcsMCxudWxsLDAsNywiYSIsW1siY2xhc3MiLCJtYXQtbGlzdC1pdGVtIl0sWyJtYXQtbGlzdC1pdGVtIiwiIl1dLFtbMiwibWF0LWxpc3QtaXRlbS1hdmF0YXIiLG51bGxdLFsyLCJtYXQtbGlzdC1pdGVtLXdpdGgtYXZhdGFyIixudWxsXV0sW1tudWxsLCJjbGljayJdLFtudWxsLCJmb2N1cyJdLFtudWxsLCJibHVyIl1dLGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0hMCxvPXQuY29tcG9uZW50O3JldHVybiJmb2N1cyI9PT1lJiYocj0hMSE9PWkuWWEodCw0OCkuX2hhbmRsZUZvY3VzKCkmJnIpLCJibHVyIj09PWUmJihyPSExIT09aS5ZYSh0LDQ4KS5faGFuZGxlQmx1cigpJiZyKSwiY2xpY2siPT09ZSYmKHI9ITEhPT1vLnJvdXRlckxpbmtDaHVua1Byb2Nlc3NpbmcoIi9wcm9qZWN0IikmJnIpLHJ9LFZsLEZsKSksaS5OYSg0OCwxMDk3NzI4LG51bGwsMixObC5iLFtpLmssWzIsTmwuZV1dLG51bGwsbnVsbCksaS5lYig2MDM5Nzk3NzYsNyx7X2xpbmVzOjF9KSxpLmViKDMzNTU0NDMyMCw4LHtfYXZhdGFyOjB9KSwodCgpKCksaS5PYSg1MSwwLG51bGwsMiwyLCJtYXQtaWNvbiIsW1siY2xhc3MiLCJtYXQtaWNvbiJdLFsicm9sZSIsImltZyJdXSxbWzIsIm1hdC1pY29uLWlubGluZSIsbnVsbF1dLG51bGwsbnVsbCxobC5iLGhsLmEpKSxpLk5hKDUyLDYzODk3NixudWxsLDAsZGwuYSxbaS5rLGRsLmMsWzgsbnVsbF1dLG51bGwsbnVsbCksKHQoKSgpLGkuZ2IoLTEsMCxbImFzc2Vzc21lbnQiXSkpLCh0KCkoKSxpLmdiKC0xLDIsWyIgUHJvamVjdCBkZXRhaWxzIl0pKSwodCgpKCksaS5PYSg1NSwwLG51bGwsMCw3LCJhIixbWyJjbGFzcyIsIm1hdC1saXN0LWl0ZW0iXSxbIm1hdC1saXN0LWl0ZW0iLCIiXV0sW1syLCJtYXQtbGlzdC1pdGVtLWF2YXRhciIsbnVsbF0sWzIsIm1hdC1saXN0LWl0ZW0td2l0aC1hdmF0YXIiLG51bGxdXSxbW251bGwsImNsaWNrIl0sW251bGwsImZvY3VzIl0sW251bGwsImJsdXIiXV0sZnVuY3Rpb24odCxlLG4pe3ZhciByPSEwLG89dC5jb21wb25lbnQ7cmV0dXJuImZvY3VzIj09PWUmJihyPSExIT09aS5ZYSh0LDU2KS5faGFuZGxlRm9jdXMoKSYmciksImJsdXIiPT09ZSYmKHI9ITEhPT1pLllhKHQsNTYpLl9oYW5kbGVCbHVyKCkmJnIpLCJjbGljayI9PT1lJiYocj0hMSE9PW8ucm91dGVyTGlua0NodW5rUHJvY2Vzc2luZygiL2Jpb2xvZ3kiKSYmcikscn0sVmwsRmwpKSxpLk5hKDU2LDEwOTc3MjgsbnVsbCwyLE5sLmIsW2kuayxbMixObC5lXV0sbnVsbCxudWxsKSxpLmViKDYwMzk3OTc3Niw5LHtfbGluZXM6MX0pLGkuZWIoMzM1NTQ0MzIwLDEwLHtfYXZhdGFyOjB9KSwodCgpKCksaS5PYSg1OSwwLG51bGwsMiwyLCJtYXQtaWNvbiIsW1siY2xhc3MiLCJtYXQtaWNvbiJdLFsicm9sZSIsImltZyJdXSxbWzIsIm1hdC1pY29uLWlubGluZSIsbnVsbF1dLG51bGwsbnVsbCxobC5iLGhsLmEpKSxpLk5hKDYwLDYzODk3NixudWxsLDAsZGwuYSxbaS5rLGRsLmMsWzgsbnVsbF1dLG51bGwsbnVsbCksKHQoKSgpLGkuZ2IoLTEsMCxbImJsdXJfY2lyY3VsYXIiXSkpLCh0KCkoKSxpLmdiKC0xLDIsWyIgQmlvbG9neSJdKSksKHQoKSgpLGkuT2EoNjMsMCxudWxsLDAsOSwiYSIsW1siY2xhc3MiLCJtYXQtbGlzdC1pdGVtIl0sWyJtYXQtbGlzdC1pdGVtIiwiIl1dLFtbMiwibWF0LWxpc3QtaXRlbS1hdmF0YXIiLG51bGxdLFsyLCJtYXQtbGlzdC1pdGVtLXdpdGgtYXZhdGFyIixudWxsXSxbMSwidGFyZ2V0IiwwXSxbOCwiaHJlZiIsNF1dLFtbbnVsbCwiZm9jdXMiXSxbbnVsbCwiYmx1ciJdLFtudWxsLCJjbGljayJdXSxmdW5jdGlvbih0LGUsbil7dmFyIHI9ITA7cmV0dXJuImZvY3VzIj09PWUmJihyPSExIT09aS5ZYSh0LDY0KS5faGFuZGxlRm9jdXMoKSYmciksImJsdXIiPT09ZSYmKHI9ITEhPT1pLllhKHQsNjQpLl9oYW5kbGVCbHVyKCkmJnIpLCJjbGljayI9PT1lJiYocj0hMSE9PWkuWWEodCw2Nykub25DbGljayhuLmJ1dHRvbixuLmN0cmxLZXksbi5tZXRhS2V5LG4uc2hpZnRLZXkpJiZyKSxyfSxWbCxGbCkpLGkuTmEoNjQsMTA5NzcyOCxudWxsLDIsTmwuYixbaS5rLFsyLE5sLmVdXSxudWxsLG51bGwpLGkuZWIoNjAzOTc5Nzc2LDExLHtfbGluZXM6MX0pLGkuZWIoMzM1NTQ0MzIwLDEyLHtfYXZhdGFyOjB9KSxpLk5hKDY3LDY3MTc0NCxudWxsLDAsVWwubCxbVWwuayxVbC5hLGEuaF0se3JvdXRlckxpbms6WzAsInJvdXRlckxpbmsiXX0sbnVsbCksaS5aYSg2OCwxKSwodCgpKCksaS5PYSg2OSwwLG51bGwsMiwyLCJtYXQtaWNvbiIsW1siY2xhc3MiLCJtYXQtaWNvbiJdLFsicm9sZSIsImltZyJdXSxbWzIsIm1hdC1pY29uLWlubGluZSIsbnVsbF1dLG51bGwsbnVsbCxobC5iLGhsLmEpKSxpLk5hKDcwLDYzODk3NixudWxsLDAsZGwuYSxbaS5rLGRsLmMsWzgsbnVsbF1dLG51bGwsbnVsbCksKHQoKSgpLGkuZ2IoLTEsMCxbIm1lbW9yeSJdKSksKHQoKSgpLGkuZ2IoLTEsMixbIiBDb21wdXRpbmciXSkpLCh0KCkoKSxpLk9hKDczLDAsbnVsbCwwLDksImEiLFtbImNsYXNzIiwibWF0LWxpc3QtaXRlbSJdLFsibWF0LWxpc3QtaXRlbSIsIiJdXSxbWzIsIm1hdC1saXN0LWl0ZW0tYXZhdGFyIixudWxsXSxbMiwibWF0LWxpc3QtaXRlbS13aXRoLWF2YXRhciIsbnVsbF0sWzEsInRhcmdldCIsMF0sWzgsImhyZWYiLDRdXSxbW251bGwsImZvY3VzIl0sW251bGwsImJsdXIiXSxbbnVsbCwiY2xpY2siXV0sZnVuY3Rpb24odCxlLG4pe3ZhciByPSEwO3JldHVybiJmb2N1cyI9PT1lJiYocj0hMSE9PWkuWWEodCw3NCkuX2hhbmRsZUZvY3VzKCkmJnIpLCJibHVyIj09PWUmJihyPSExIT09aS5ZYSh0LDc0KS5faGFuZGxlQmx1cigpJiZyKSwiY2xpY2siPT09ZSYmKHI9ITEhPT1pLllhKHQsNzcpLm9uQ2xpY2sobi5idXR0b24sbi5jdHJsS2V5LG4ubWV0YUtleSxuLnNoaWZ0S2V5KSYmcikscn0sVmwsRmwpKSxpLk5hKDc0LDEwOTc3MjgsbnVsbCwyLE5sLmIsW2kuayxbMixObC5lXV0sbnVsbCxudWxsKSxpLmViKDYwMzk3OTc3NiwxMyx7X2xpbmVzOjF9KSxpLmViKDMzNTU0NDMyMCwxNCx7X2F2YXRhcjowfSksaS5OYSg3Nyw2NzE3NDQsbnVsbCwwLFVsLmwsW1VsLmssVWwuYSxhLmhdLHtyb3V0ZXJMaW5rOlswLCJyb3V0ZXJMaW5rIl19LG51bGwpLGkuWmEoNzgsMSksKHQoKSgpLGkuT2EoNzksMCxudWxsLDIsMiwibWF0LWljb24iLFtbImNsYXNzIiwibWF0LWljb24iXSxbInJvbGUiLCJpbWciXV0sW1syLCJtYXQtaWNvbi1pbmxpbmUiLG51bGxdXSxudWxsLG51bGwsaGwuYixobC5hKSksaS5OYSg4MCw2Mzg5NzYsbnVsbCwwLGRsLmEsW2kuayxkbC5jLFs4LG51bGxdXSxudWxsLG51bGwpLCh0KCkoKSxpLmdiKC0xLDAsWyJhY2Nlc3NpYmlsaXR5X25ldyJdKSksKHQoKSgpLGkuZ2IoLTEsMixbIiBIdW1hbiBQcmFjdGljZXMiXSkpLCh0KCkoKSxpLk9hKDgzLDAsbnVsbCwwLDksImEiLFtbImNsYXNzIiwibWF0LWxpc3QtaXRlbSJdLFsibWF0LWxpc3QtaXRlbSIsIiJdXSxbWzIsIm1hdC1saXN0LWl0ZW0tYXZhdGFyIixudWxsXSxbMiwibWF0LWxpc3QtaXRlbS13aXRoLWF2YXRhciIsbnVsbF0sWzEsInRhcmdldCIsMF0sWzgsImhyZWYiLDRdXSxbW251bGwsImZvY3VzIl0sW251bGwsImJsdXIiXSxbbnVsbCwiY2xpY2siXV0sZnVuY3Rpb24odCxlLG4pe3ZhciByPSEwO3JldHVybiJmb2N1cyI9PT1lJiYocj0hMSE9PWkuWWEodCw4NCkuX2hhbmRsZUZvY3VzKCkmJnIpLCJibHVyIj09PWUmJihyPSExIT09aS5ZYSh0LDg0KS5faGFuZGxlQmx1cigpJiZyKSwiY2xpY2siPT09ZSYmKHI9ITEhPT1pLllhKHQsODcpLm9uQ2xpY2sobi5idXR0b24sbi5jdHJsS2V5LG4ubWV0YUtleSxuLnNoaWZ0S2V5KSYmcikscn0sVmwsRmwpKSxpLk5hKDg0LDEwOTc3MjgsbnVsbCwyLE5sLmIsW2kuayxbMixObC5lXV0sbnVsbCxudWxsKSxpLmViKDYwMzk3OTc3NiwxNSx7X2xpbmVzOjF9KSxpLmViKDMzNTU0NDMyMCwxNix7X2F2YXRhcjowfSksaS5OYSg4Nyw2NzE3NDQsbnVsbCwwLFVsLmwsW1VsLmssVWwuYSxhLmhdLHtyb3V0ZXJMaW5rOlswLCJyb3V0ZXJMaW5rIl19LG51bGwpLGkuWmEoODgsMSksKHQoKSgpLGkuT2EoODksMCxudWxsLDIsMiwibWF0LWljb24iLFtbImNsYXNzIiwibWF0LWljb24iXSxbInJvbGUiLCJpbWciXV0sW1syLCJtYXQtaWNvbi1pbmxpbmUiLG51bGxdXSxudWxsLG51bGwsaGwuYixobC5hKSksaS5OYSg5MCw2Mzg5NzYsbnVsbCwwLGRsLmEsW2kuayxkbC5jLFs4LG51bGxdXSxudWxsLG51bGwpLCh0KCkoKSxpLmdiKC0xLDAsWyJwZW9wbGUiXSkpLCh0KCkoKSxpLmdiKC0xLDIsWyIgT3VyIHRlYW0iXSkpLCh0KCkoKSxpLk9hKDkzLDAsbnVsbCwwLDksImEiLFtbImNsYXNzIiwibWF0LWxpc3QtaXRlbSJdLFsibWF0LWxpc3QtaXRlbSIsIiJdXSxbWzIsIm1hdC1saXN0LWl0ZW0tYXZhdGFyIixudWxsXSxbMiwibWF0LWxpc3QtaXRlbS13aXRoLWF2YXRhciIsbnVsbF0sWzEsInRhcmdldCIsMF0sWzgsImhyZWYiLDRdXSxbW251bGwsImZvY3VzIl0sW251bGwsImJsdXIiXSxbbnVsbCwiY2xpY2siXV0sZnVuY3Rpb24odCxlLG4pe3ZhciByPSEwO3JldHVybiJmb2N1cyI9PT1lJiYocj0hMSE9PWkuWWEodCw5NCkuX2hhbmRsZUZvY3VzKCkmJnIpLCJibHVyIj09PWUmJihyPSExIT09aS5ZYSh0LDk0KS5faGFuZGxlQmx1cigpJiZyKSwiY2xpY2siPT09ZSYmKHI9ITEhPT1pLllhKHQsOTcpLm9uQ2xpY2sobi5idXR0b24sbi5jdHJsS2V5LG4ubWV0YUtleSxuLnNoaWZ0S2V5KSYmcikscn0sVmwsRmwpKSxpLk5hKDk0LDEwOTc3MjgsbnVsbCwyLE5sLmIsW2kuayxbMixObC5lXV0sbnVsbCxudWxsKSxpLmViKDYwMzk3OTc3NiwxNyx7X2xpbmVzOjF9KSxpLmViKDMzNTU0NDMyMCwxOCx7X2F2YXRhcjowfSksaS5OYSg5Nyw2NzE3NDQsbnVsbCwwLFVsLmwsW1VsLmssVWwuYSxhLmhdLHtyb3V0ZXJMaW5rOlswLCJyb3V0ZXJMaW5rIl19LG51bGwpLGkuWmEoOTgsMSksKHQoKSgpLGkuT2EoOTksMCxudWxsLDIsMiwibWF0LWljb24iLFtbImNsYXNzIiwibWF0LWljb24iXSxbInJvbGUiLCJpbWciXV0sW1syLCJtYXQtaWNvbi1pbmxpbmUiLG51bGxdXSxudWxsLG51bGwsaGwuYixobC5hKSksaS5OYSgxMDAsNjM4OTc2LG51bGwsMCxkbC5hLFtpLmssZGwuYyxbOCxudWxsXV0sbnVsbCxudWxsKSwodCgpKCksaS5nYigtMSwwLFsiZm9sZGVyX3NwZWNpYWwiXSkpLCh0KCkoKSxpLmdiKC0xLDIsWyIgU3VwcG9ydCJdKSksKHQoKSgpLGkuT2EoMTAzLDAsbnVsbCwwLDksImEiLFtbImNsYXNzIiwibWF0LWxpc3QtaXRlbSJdLFsibWF0LWxpc3QtaXRlbSIsIiJdXSxbWzIsIm1hdC1saXN0LWl0ZW0tYXZhdGFyIixudWxsXSxbMiwibWF0LWxpc3QtaXRlbS13aXRoLWF2YXRhciIsbnVsbF0sWzEsInRhcmdldCIsMF0sWzgsImhyZWYiLDRdXSxbW251bGwsImZvY3VzIl0sW251bGwsImJsdXIiXSxbbnVsbCwiY2xpY2siXV0sZnVuY3Rpb24odCxlLG4pe3ZhciByPSEwO3JldHVybiJmb2N1cyI9PT1lJiYocj0hMSE9PWkuWWEodCwxMDQpLl9oYW5kbGVGb2N1cygpJiZyKSwiYmx1ciI9PT1lJiYocj0hMSE9PWkuWWEodCwxMDQpLl9oYW5kbGVCbHVyKCkmJnIpLCJjbGljayI9PT1lJiYocj0hMSE9PWkuWWEodCwxMDcpLm9uQ2xpY2sobi5idXR0b24sbi5jdHJsS2V5LG4ubWV0YUtleSxuLnNoaWZ0S2V5KSYmcikscn0sVmwsRmwpKSxpLk5hKDEwNCwxMDk3NzI4LG51bGwsMixObC5iLFtpLmssWzIsTmwuZV1dLG51bGwsbnVsbCksaS5lYig2MDM5Nzk3NzYsMTkse19saW5lczoxfSksaS5lYigzMzU1NDQzMjAsMjAse19hdmF0YXI6MH0pLGkuTmEoMTA3LDY3MTc0NCxudWxsLDAsVWwubCxbVWwuayxVbC5hLGEuaF0se3JvdXRlckxpbms6WzAsInJvdXRlckxpbmsiXX0sbnVsbCksaS5aYSgxMDgsMSksKHQoKSgpLGkuT2EoMTA5LDAsbnVsbCwyLDIsIm1hdC1pY29uIixbWyJjbGFzcyIsIm1hdC1pY29uIl0sWyJyb2xlIiwiaW1nIl1dLFtbMiwibWF0LWljb24taW5saW5lIixudWxsXV0sbnVsbCxudWxsLGhsLmIsaGwuYSkpLGkuTmEoMTEwLDYzODk3NixudWxsLDAsZGwuYSxbaS5rLGRsLmMsWzgsbnVsbF1dLG51bGwsbnVsbCksKHQoKSgpLGkuZ2IoLTEsMCxbImJvb2siXSkpLCh0KCkoKSxpLmdiKC0xLDIsWyJMYWIgTm90ZWJvb2siXSkpLCh0KCkoKSxpLk9hKDExMywwLG51bGwsMCw5LCJhIixbWyJjbGFzcyIsIm1hdC1saXN0LWl0ZW0iXSxbImlkIiwic2l0ZW1hcGJ1dCJdLFsibWF0LWxpc3QtaXRlbSIsIiJdXSxbWzIsIm1hdC1saXN0LWl0ZW0tYXZhdGFyIixudWxsXSxbMiwibWF0LWxpc3QtaXRlbS13aXRoLWF2YXRhciIsbnVsbF0sWzEsInRhcmdldCIsMF0sWzgsImhyZWYiLDRdXSxbW251bGwsImZvY3VzIl0sW251bGwsImJsdXIiXSxbbnVsbCwiY2xpY2siXV0sZnVuY3Rpb24odCxlLG4pe3ZhciByPSEwO3JldHVybiJmb2N1cyI9PT1lJiYocj0hMSE9PWkuWWEodCwxMTQpLl9oYW5kbGVGb2N1cygpJiZyKSwiYmx1ciI9PT1lJiYocj0hMSE9PWkuWWEodCwxMTQpLl9oYW5kbGVCbHVyKCkmJnIpLCJjbGljayI9PT1lJiYocj0hMSE9PWkuWWEodCwxMTcpLm9uQ2xpY2sobi5idXR0b24sbi5jdHJsS2V5LG4ubWV0YUtleSxuLnNoaWZ0S2V5KSYmcikscn0sVmwsRmwpKSxpLk5hKDExNCwxMDk3NzI4LG51bGwsMixObC5iLFtpLmssWzIsTmwuZV1dLG51bGwsbnVsbCksaS5lYig2MDM5Nzk3NzYsMjEse19saW5lczoxfSksaS5lYigzMzU1NDQzMjAsMjIse19hdmF0YXI6MH0pLGkuTmEoMTE3LDY3MTc0NCxudWxsLDAsVWwubCxbVWwuayxVbC5hLGEuaF0se3JvdXRlckxpbms6WzAsInJvdXRlckxpbmsiXX0sbnVsbCksaS5aYSgxMTgsMSksKHQoKSgpLGkuT2EoMTE5LDAsbnVsbCwyLDIsIm1hdC1pY29uIixbWyJjbGFzcyIsIm1hdC1pY29uIl0sWyJyb2xlIiwiaW1nIl1dLFtbMiwibWF0LWljb24taW5saW5lIixudWxsXV0sbnVsbCxudWxsLGhsLmIsaGwuYSkpLGkuTmEoMTIwLDYzODk3NixudWxsLDAsZGwuYSxbaS5rLGRsLmMsWzgsbnVsbF1dLG51bGwsbnVsbCksKHQoKSgpLGkuZ2IoLTEsMCxbImFwcHMiXSkpLCh0KCkoKSxpLmdiKC0xLDIsWyIgU2l0ZSBtYXAiXSkpLCh0KCkoKSxpLk9hKDEyMywwLG51bGwsMSw3LCJtYXQtc2lkZW5hdi1jb250ZW50IixbWyJjbGFzcyIsIm1hdC1kcmF3ZXItY29udGVudCBtYXQtc2lkZW5hdi1jb250ZW50Il0sWyJmeExheW91dCIsInJvdyJdLFsiZnhMYXlvdXRBbGlnbiIsImNlbnRlciJdXSxbWzQsIm1hcmdpbi1sZWZ0IiwicHgiXSxbNCwibWFyZ2luLXJpZ2h0IiwicHgiXV0sbnVsbCxudWxsLGtsLEVsKSksaS5OYSgxMjQsMTA5NzcyOCxbWzMsNF1dLDAsd2wsW2kuaCxPbF0sbnVsbCxudWxsKSxpLk5hKDEyNSw3MzcyODAsbnVsbCwwLHpsLmUsW0JsLmksaS5rLEJsLm1dLHtsYXlvdXQ6WzAsImxheW91dCJdfSxudWxsKSxpLk5hKDEyNiw3MzcyODAsbnVsbCwwLHpsLmQsW0JsLmksaS5rLFs2LHpsLmVdLEJsLm1dLHthbGlnbjpbMCwiYWxpZ24iXX0sbnVsbCksKHQoKSgpLGkuT2EoMTI3LDAsbnVsbCwwLDMsImRpdiIsW1siZnhGbGV4IiwiMSAwIDUwMHB4Il0sWyJpZCIsInNpZGVuYXZmbGV4Y29udGVudCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxpLk5hKDEyOCw3MzcyODAsbnVsbCwwLHpsLmEsW0JsLmksaS5rLFszLHpsLmVdLEJsLm0sQmwuZ10se2ZsZXg6WzAsImZsZXgiXX0sbnVsbCksKHQoKSgpLGkuT2EoMTI5LDE2Nzc3MjE2LG51bGwsbnVsbCwxLCJyb3V0ZXItb3V0bGV0IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxpLk5hKDEzMCwyMTI5OTIsbnVsbCwwLFVsLm4sW1VsLmIsaS5OLGkuaixbOCxudWxsXSxpLmhdLG51bGwsbnVsbCldLGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5jb21wb25lbnQ7dChlLDIsMCwiYWNjZW50IiksdChlLDcsMCksdChlLDIwLDApLHQoZSwyNCwwLGkuaGIoZSwyNCwwLGkuWWEoZSwyNSkudHJhbnNmb3JtKG4uaXNIYW5kc2V0JCkpPyJvdmVyIjoic2lkZSIsbi5vcGVuZWRTaWRlTmF2LCJ0cnVlIiksdChlLDI4LDAsInByaW1hcnkiKSx0KGUsMzUsMCksdChlLDQ0LDApLHQoZSw1MiwwKSx0KGUsNjAsMCksdChlLDY3LDAsdChlLDY4LDAsIi4uL2NvbXB1dGluZyIpKSx0KGUsNzAsMCksdChlLDc3LDAsdChlLDc4LDAsIi4uL2h1bWFuLXByYWN0aWNlcyIpKSx0KGUsODAsMCksdChlLDg3LDAsdChlLDg4LDAsIi4uL3RlYW0iKSksdChlLDkwLDApLHQoZSw5NywwLHQoZSw5OCwwLCIuLi9zdXBwb3J0IikpLHQoZSwxMDAsMCksdChlLDEwNywwLHQoZSwxMDgsMCwiLi4vbGFibm90ZWJvb2siKSksdChlLDExMCwwKSx0KGUsMTE3LDAsdChlLDExOCwwLCIuLi9zaXRlbWFwIikpLHQoZSwxMjAsMCksdChlLDEyNSwwLCJyb3ciKSx0KGUsMTI2LDAsImNlbnRlciIpLHQoZSwxMjgsMCwiMSAwIDUwMHB4IiksdChlLDEzMCwwKX0sZnVuY3Rpb24odCxlKXt2YXIgbj1lLmNvbXBvbmVudDt0KGUsMSwwLGkuWWEoZSwyKS5fdG9vbGJhclJvd3MubGVuZ3RoLCFpLllhKGUsMikuX3Rvb2xiYXJSb3dzLmxlbmd0aCksdChlLDQsMCxpLllhKGUsNSkuZGlzYWJsZWR8fG51bGwsIk5vb3BBbmltYXRpb25zIj09PWkuWWEoZSw1KS5fYW5pbWF0aW9uTW9kZSksdChlLDYsMCxpLllhKGUsNykuaW5saW5lKSx0KGUsMTksMCxpLllhKGUsMjApLl9iYWNrZHJvcE92ZXJyaWRlKSx0KGUsMjMsMCxpLmhiKGUsMjMsMCxpLllhKGUsMjYpLnRyYW5zZm9ybShuLmlzSGFuZHNldCQpKT8iZGlhbG9nIjoibmF2aWdhdGlvbiIsaS5ZYShlLDI0KS5fYW5pbWF0aW9uU3RhdGUsbnVsbCwiZW5kIj09PWkuWWEoZSwyNCkucG9zaXRpb24sIm92ZXIiPT09aS5ZYShlLDI0KS5tb2RlLCJwdXNoIj09PWkuWWEoZSwyNCkubW9kZSwic2lkZSI9PT1pLllhKGUsMjQpLm1vZGUsaS5ZYShlLDI0KS5maXhlZEluVmlld3BvcnQsaS5ZYShlLDI0KS5maXhlZEluVmlld3BvcnQ/aS5ZYShlLDI0KS5maXhlZFRvcEdhcDpudWxsLGkuWWEoZSwyNCkuZml4ZWRJblZpZXdwb3J0P2kuWWEoZSwyNCkuZml4ZWRCb3R0b21HYXA6bnVsbCksdChlLDI3LDAsaS5ZYShlLDI4KS5fdG9vbGJhclJvd3MubGVuZ3RoLCFpLllhKGUsMjgpLl90b29sYmFyUm93cy5sZW5ndGgpLHQoZSwzMiwwLGkuWWEoZSwzMykuZGlzYWJsZWR8fG51bGwsIk5vb3BBbmltYXRpb25zIj09PWkuWWEoZSwzMykuX2FuaW1hdGlvbk1vZGUpLHQoZSwzNCwwLGkuWWEoZSwzNSkuaW5saW5lKSx0KGUsMzksMCxpLllhKGUsNDApLl9hdmF0YXIsaS5ZYShlLDQwKS5fYXZhdGFyKSx0KGUsNDMsMCxpLllhKGUsNDQpLmlubGluZSksdChlLDQ3LDAsaS5ZYShlLDQ4KS5fYXZhdGFyLGkuWWEoZSw0OCkuX2F2YXRhciksdChlLDUxLDAsaS5ZYShlLDUyKS5pbmxpbmUpLHQoZSw1NSwwLGkuWWEoZSw1NikuX2F2YXRhcixpLllhKGUsNTYpLl9hdmF0YXIpLHQoZSw1OSwwLGkuWWEoZSw2MCkuaW5saW5lKSx0KGUsNjMsMCxpLllhKGUsNjQpLl9hdmF0YXIsaS5ZYShlLDY0KS5fYXZhdGFyLGkuWWEoZSw2NykudGFyZ2V0LGkuWWEoZSw2NykuaHJlZiksdChlLDY5LDAsaS5ZYShlLDcwKS5pbmxpbmUpLHQoZSw3MywwLGkuWWEoZSw3NCkuX2F2YXRhcixpLllhKGUsNzQpLl9hdmF0YXIsaS5ZYShlLDc3KS50YXJnZXQsaS5ZYShlLDc3KS5ocmVmKSx0KGUsNzksMCxpLllhKGUsODApLmlubGluZSksdChlLDgzLDAsaS5ZYShlLDg0KS5fYXZhdGFyLGkuWWEoZSw4NCkuX2F2YXRhcixpLllhKGUsODcpLnRhcmdldCxpLllhKGUsODcpLmhyZWYpLHQoZSw4OSwwLGkuWWEoZSw5MCkuaW5saW5lKSx0KGUsOTMsMCxpLllhKGUsOTQpLl9hdmF0YXIsaS5ZYShlLDk0KS5fYXZhdGFyLGkuWWEoZSw5NykudGFyZ2V0LGkuWWEoZSw5NykuaHJlZiksdChlLDk5LDAsaS5ZYShlLDEwMCkuaW5saW5lKSx0KGUsMTAzLDAsaS5ZYShlLDEwNCkuX2F2YXRhcixpLllhKGUsMTA0KS5fYXZhdGFyLGkuWWEoZSwxMDcpLnRhcmdldCxpLllhKGUsMTA3KS5ocmVmKSx0KGUsMTA5LDAsaS5ZYShlLDExMCkuaW5saW5lKSx0KGUsMTEzLDAsaS5ZYShlLDExNCkuX2F2YXRhcixpLllhKGUsMTE0KS5fYXZhdGFyLGkuWWEoZSwxMTcpLnRhcmdldCxpLllhKGUsMTE3KS5ocmVmKSx0KGUsMTE5LDAsaS5ZYShlLDEyMCkuaW5saW5lKSx0KGUsMTIzLDAsaS5ZYShlLDEyNCkuX2NvbnRhaW5lci5fY29udGVudE1hcmdpbnMubGVmdCxpLllhKGUsMTI0KS5fY29udGFpbmVyLl9jb250ZW50TWFyZ2lucy5yaWdodCl9KX12YXIgWWw9aS5LYSgiYXBwLXJvb3QiLE0sZnVuY3Rpb24odCl7cmV0dXJuIGkuaWIoMCxbKHQoKSgpLGkuT2EoMCwwLG51bGwsbnVsbCwxLCJhcHAtcm9vdCIsW10sbnVsbCxudWxsLG51bGwscWwsV2wpKSxpLk5hKDEsMTE0Njg4LG51bGwsMCxNLFtULFVsLmssSGwuYV0sbnVsbCxudWxsKV0sZnVuY3Rpb24odCxlKXt0KGUsMSwwKX0sbnVsbCl9LHt9LHt9LFtdKSxHbD1uKCJaWWp0IiksUWw9bigiTlNZTCIpLEtsPW4oImVEa1AiKSxabD1uKCJtVnNhIiksWGw9bigidC9OYSIpLCRsPW4oImFlY2QiKSxKbD1uKCJoVVdQIiksdGM9bigiM3BKUSIpLGVjPW4oIlY5cSsiKSxuYz1uKCIwL3VRIikscmM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5yb3V0ZXI9dCx0aGlzLmNodW5rTG9hZGVyPWV9cmV0dXJuIHQucHJvdG90eXBlLmNhbkFjdGl2YXRlPWZ1bmN0aW9uKHQsZSl7aWYoMD09by5hLnByb2R1Y3Rpb24pcmV0dXJuIE9iamVjdChuYy5hKShuZXcgUHJvbWlzZShmdW5jdGlvbih0LGUpe3QoITApfSkpO3ZhciBuPWUudXJsO3JldHVybiBjb25zb2xlLmxvZygiQ2h1bmtHdWFyZCA6ICIrbiksdGhpcy5jaHVua0xvYWRlci5hc3luY0xvYWRQYWdlQ2h1bmsobil9LHQubmdJbmplY3RhYmxlRGVmPWkuUih7ZmFjdG9yeTpmdW5jdGlvbigpe3JldHVybiBuZXcgdChpLlYoVWwuayksaS5WKEhsLmEpKX0sdG9rZW46dCxwcm92aWRlZEluOiJyb290In0pLHR9KCksaWM9ZnVuY3Rpb24oKXt9LG9jPW4oInBaaE0iKSxhYz1pLkxhKHMsW01dLGZ1bmN0aW9uKHQpe3JldHVybiBpLlZhKFtpLldhKDUxMixpLmosaS5BYSxbWzgsW04uYSxjdSx6dSxxdSxLdSxKdSxybCxZbF1dLFszLGkual0saS52XSksaS5XYSg1MTIwLGkucyxpLkphLFtbMyxpLnNdXSksaS5XYSg0NjA4LGEubSxhLmwsW2kucyxbMixhLnRdXSksaS5XYSg1MTIwLGkucSxpLkhhLFtdKSxpLldhKDUxMjAsaS5yLGkuSWEsW10pLGkuV2EoNDYwOCxHbC5jLEdsLnIsW2EuZF0pLGkuV2EoNjE0NCxpLkUsbnVsbCxbR2wuY10pLGkuV2EoNDYwOCxHbC5mLEdsLmcsW10pLGkuV2EoNTEyMCxHbC5kLGZ1bmN0aW9uKHQsZSxuLHIsaSxvLGEpe3JldHVybltuZXcgR2wuayh0LGUsbiksbmV3IEdsLm8ociksbmV3IEdsLm4oaSxvLGEpXX0sW2EuZCxpLngsWzIsaS56XSxhLmQsYS5kLEdsLmYsaS5CYV0pLGkuV2EoNDYwOCxHbC5lLEdsLmUsW0dsLmQsaS54XSksaS5XYSgxMzU2ODAsR2wubSxHbC5tLFthLmRdKSxpLldhKDQ2MDgsR2wubCxHbC5sLFtHbC5lLEdsLm1dKSxpLldhKDUxMjAsUWwuYSxmbC5lLFtdKSxpLldhKDUxMjAsUWwuYyxmbC5mLFtdKSxpLldhKDQ2MDgsUWwuYixmbC5kLFthLmQsUWwuYSxRbC5jXSksaS5XYSg1MTIwLGkuQyxmbC5nLFtHbC5sLFFsLmIsaS54XSksaS5XYSg2MTQ0LEdsLnAsbnVsbCxbR2wubV0pLGkuV2EoNDYwOCxpLkwsaS5MLFtpLnhdKSxpLldhKDQ2MDgsR2wuaCxHbC5oLFthLmRdKSxpLldhKDQ2MDgsR2wuaSxHbC5pLFthLmRdKSxpLldhKDQ2MDgsZ3UuYixmbC5jLFtpLkMsR2wuYl0pLGkuV2EoNDYwOCxCbC5rLEJsLmosW0JsLmQsQmwuaF0pLGkuV2EoNTEyMCxVbC5oLFVsLkEsW1VsLnldKSxpLldhKDUxMjAsaS5iLGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bQmwubih0LGUpLG5dfSxbYS5kLGkueixVbC5oXSksaS5XYSg1MTIwLFVsLmEsVWwueCxbVWwua10pLGkuV2EoNDYwOCxVbC5kLFVsLmQsW10pLGkuV2EoNjE0NCxVbC5mLG51bGwsW1VsLmRdKSxpLldhKDEzNTY4MCxVbC5vLFVsLm8sW1VsLmssaS51LGkuaSxpLnAsVWwuZl0pLGkuV2EoNDYwOCxVbC5lLFVsLmUsW10pLGkuV2EoNDYwOCxLbC5hLEtsLmEsW0tsLmcsS2wuYyxpLmosS2wuZixLbC5kLGkucCxpLngsYS5kLG9sLmJdKSxpLldhKDUxMjAsS2wuaCxLbC5pLFtLbC5hXSksaS5XYSg1MTIwLFpsLmEsWmwuYyxbS2wuYV0pLGkuV2EoNDYwOCxYbC5oLFhsLm4sW2EuZCxpLnosWGwubF0pLGkuV2EoNDYwOCxYbC5vLFhsLm8sW1hsLmgsWGwubV0pLGkuV2EoNTEyMCxYbC5hLGZ1bmN0aW9uKHQpe3JldHVyblt0XX0sW1hsLm9dKSxpLldhKDEwNzM3NDIzMzYsYS5jLGEuYyxbXSksaS5XYSgxMDI0LGkubCxHbC5xLFtdKSxpLldhKDEwMjQsaS53LGZ1bmN0aW9uKCl7cmV0dXJuW1VsLnQoKV19LFtdKSxpLldhKDUxMixVbC55LFVsLnksW2kucF0pLGkuV2EoNTEyLFhsLmssWGwuayxbXSksaS5XYSgyMDQ4LFhsLmksbnVsbCxbWGwua10pLGkuV2EoNTEyLFhsLmcsWGwuZyxbWGwuaV0pLGkuV2EoMjA0OCxYbC5iLG51bGwsW1hsLmddKSxpLldhKDUxMixYbC5mLFhsLmosW1hsLmIsaS5wXSksaS5XYSg1MTIsWGwuYyxYbC5jLFtYbC5mXSksaS5XYSg1MTIsJGwuYSwkbC5hLFtYbC5jXSksaS5XYSgxMDI0LGkuZCxmdW5jdGlvbih0LGUsbil7cmV0dXJuW0dsLnModCksVWwueihlKSwocj1uLGZ1bmN0aW9uKCl7cmV0dXJuIHIubG9hZFBhZ2VBdEluaXQoKX0pXTt2YXIgcn0sW1syLGkud10sVWwueSwkbC5hXSksaS5XYSg1MTIsaS5lLGkuZSxbWzIsaS5kXV0pLGkuV2EoMTMxNTg0LGkuZyxpLmcsW2kueCxpLkJhLGkucCxpLmwsaS5qLGkuZV0pLGkuV2EoMTA3Mzc0MjMzNixpLmYsaS5mLFtpLmddKSxpLldhKDEwNzM3NDIzMzYsR2wuYSxHbC5hLFtbMyxHbC5hXV0pLGkuV2EoMTA3Mzc0MjMzNixmbC5iLGZsLmIsW10pLGkuV2EoMTA3Mzc0MjMzNixvbC5hLG9sLmEsW10pLGkuV2EoMTA3Mzc0MjMzNixhbC5oLGFsLmgsW1syLGFsLmJdXSksaS5XYSgxMDczNzQyMzM2LGlsLmIsaWwuYixbXSksaS5XYSgxMDczNzQyMzM2LHUuYix1LmIsW10pLGkuV2EoMTA3Mzc0MjMzNixhbC5yLGFsLnIsW10pLGkuV2EoMTA3Mzc0MjMzNixjbC5jLGNsLmMsW10pLGkuV2EoMTA3Mzc0MjMzNixTbC5iLFNsLmIsW10pLGkuV2EoMTA3Mzc0MjMzNixDbCxDbCxbXSksaS5XYSgxMDczNzQyMzM2LGRsLmIsZGwuYixbXSksaS5XYSgxMDczNzQyMzM2LGFsLmksYWwuaSxbXSksaS5XYSgxMDczNzQyMzM2LGFsLnAsYWwucCxbXSksaS5XYSgxMDczNzQyMzM2LFJsLmEsUmwuYSxbXSksaS5XYSgxMDczNzQyMzM2LE5sLmMsTmwuYyxbXSksaS5XYSgxMDczNzQyMzM2LHl1LHl1LFtdKSxpLldhKDEwNzM3NDIzMzYsdnUuYyx2dS5jLFtdKSxpLldhKDEwNzM3NDIzMzYsSXUsSXUsW10pLGkuV2EoMTA3Mzc0MjMzNixCbC5lLEJsLmUsW10pLGkuV2EoMTA3Mzc0MjMzNix6bC5jLHpsLmMsW10pLGkuV2EoMTA3Mzc0MjMzNixKbC5hLEpsLmEsW10pLGkuV2EoMTA3Mzc0MjMzNix0Yy5hLHRjLmEsW10pLGkuV2EoMTA3Mzc0MjMzNixlYy5hLGVjLmEsW1syLEJsLmxdLGkuel0pLGkuV2EoMTAyNCxVbC5zLFVsLnYsW1szLFVsLmtdXSksaS5XYSg1MTIsVWwucSxVbC5jLFtdKSxpLldhKDUxMixVbC5iLFVsLmIsW10pLGkuV2EoMjU2LFVsLmcse3VzZUhhc2g6ITB9LFtdKSxpLldhKDEwMjQsYS5oLFVsLnUsW2EucCxbMixhLmFdLFVsLmddKSxpLldhKDUxMixhLmcsYS5nLFthLmhdKSxpLldhKDUxMixpLmksaS5pLFtdKSxpLldhKDUxMixpLnUsaS5JLFtpLmksWzIsaS5KXV0pLGkuV2EoMTAyNCxVbC5pLGZ1bmN0aW9uKCl7cmV0dXJuW1t7cGF0aDoiZGFzaGJvYXJkIixjb21wb25lbnQ6c3UsY2FuQWN0aXZhdGU6W3JjXX0se3BhdGg6InNpdGVtYXAiLGNvbXBvbmVudDpGdSxjYW5BY3RpdmF0ZTpbcmNdfSx7cGF0aDoibGFibm90ZWJvb2svOnBhZ2VwYXRoIixsb2FkQ2hpbGRyZW46Ii4vd2lraS1saWdodHByb3h5L3dpa2ktbGlnaHRwcm94eS1sYXllci5tb2R1bGUjV2lraUxpZ2h0cHJveHlMYXllck1vZHVsZSIsY2FuQWN0aXZhdGU6W3JjXX0se3BhdGg6ImxhYm5vdGVib29rIixsb2FkQ2hpbGRyZW46Ii4vd2lraS1saWdodHByb3h5L3dpa2ktbGlnaHRwcm94eS1sYXllci5tb2R1bGUjV2lraUxpZ2h0cHJveHlMYXllck1vZHVsZSIsY2FuQWN0aXZhdGU6W3JjXX0se3BhdGg6InRlYW0iLGxvYWRDaGlsZHJlbjoiLi90ZWFtLXJvc3Rlci90ZWFtLXJvc3Rlci1sYXllci5tb2R1bGUjVGVhbVJvc3RlckxheWVyTW9kdWxlIixjYW5BY3RpdmF0ZTpbcmNdfSx7cGF0aDoicHJvamVjdCIsY29tcG9uZW50OkJ1LGNhbkFjdGl2YXRlOltyY119LHtwYXRoOiJiaW9sb2d5Iixjb21wb25lbnQ6WXUsY2FuQWN0aXZhdGU6W3JjXX0se3BhdGg6ImNvbXB1dGluZyIsY29tcG9uZW50Olp1LGNhbkFjdGl2YXRlOltyY119LHtwYXRoOiJodW1hbi1wcmFjdGljZXMiLGNvbXBvbmVudDp0bCxjYW5BY3RpdmF0ZTpbcmNdfSx7cGF0aDoic3VwcG9ydCIsbG9hZENoaWxkcmVuOiIuL3N1cHBvcnQtc2VjdGlvbi9zdXBwb3J0LXNlY3Rpb24tbGF5ZXIubW9kdWxlI1N1cHBvcnRTZWN0aW9uTGF5ZXJNb2R1bGUiLGNhbkFjdGl2YXRlOltyY119LHtwYXRoOiIiLHJlZGlyZWN0VG86ImRhc2hib2FyZCIscGF0aE1hdGNoOiJmdWxsIn1dXX0sW10pLGkuV2EoMTAyNCxVbC5rLFVsLncsW2kuZyxVbC5xLFVsLmIsYS5nLGkucCxpLnUsaS5pLFVsLmksVWwuZyxbMixVbC5wXSxbMixVbC5qXV0pLGkuV2EoMTA3Mzc0MjMzNixVbC5tLFVsLm0sW1syLFVsLnNdLFsyLFVsLmtdXSksaS5XYSgxMDczNzQyMzM2LGljLGljLFtdKSxpLldhKDEwNzM3NDIzMzYsRC5kLEQuZCxbXSksaS5XYSgxMDczNzQyMzM2LEtsLmUsS2wuZSxbXSksaS5XYSgxMDczNzQyMzM2LFpsLmIsWmwuYixbXSksaS5XYSgxMDczNzQyMzM2LFhsLmUsWGwuZSxbXSksaS5XYSgxMDczNzQyMzM2LFhsLmQsWGwuZCxbXSksaS5XYSgxMDczNzQyMzM2LG9jLmEsb2MuYSxbXSksaS5XYSgxMDI0LGkuYyxpLkdhLFtdKSxpLldhKDEwNzM3NDIzMzYscyxzLFtpLnosaS5jXSksaS5XYSgyNTYsaS5aLCEwLFtdKSxpLldhKDI1NixmbC5hLCJCcm93c2VyQW5pbWF0aW9ucyIsW10pLGkuV2EoMjU2LFhsLmwsIlhTUkYtVE9LRU4iLFtdKSxpLldhKDI1NixYbC5tLCJYLVhTUkYtVE9LRU4iLFtdKV0pfSk7by5hLnByb2R1Y3Rpb24mJk9iamVjdChpLlMpKCksR2wuaigpLmJvb3RzdHJhcE1vZHVsZUZhY3RvcnkoYWMpLmNhdGNoKGZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLmxvZyh0KX0pfSx6b3RtOmZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigibXJTRyIpLGk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scil7dmFyIGk9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBpLnBhcmVudD1lLGkub3V0ZXJWYWx1ZT1uLGkub3V0ZXJJbmRleD1yLGkuaW5kZXg9MCxpfXJldHVybiByLmIoZSx0KSxlLnByb3RvdHlwZS5fbmV4dD1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5ub3RpZnlOZXh0KHRoaXMub3V0ZXJWYWx1ZSx0LHRoaXMub3V0ZXJJbmRleCx0aGlzLmluZGV4KyssdGhpcyl9LGUucHJvdG90eXBlLl9lcnJvcj1mdW5jdGlvbih0KXt0aGlzLnBhcmVudC5ub3RpZnlFcnJvcih0LHRoaXMpLHRoaXMudW5zdWJzY3JpYmUoKX0sZS5wcm90b3R5cGUuX2NvbXBsZXRlPWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnQubm90aWZ5Q29tcGxldGUodGhpcyksdGhpcy51bnN1YnNjcmliZSgpfSxlfShuKCJGRk9vIikuYSksbz1uKCJGeGIxIik7ZnVuY3Rpb24gYSh0LGUsbixyKXt2YXIgYT1uZXcgaSh0LG4scik7cmV0dXJuIE9iamVjdChvLmEpKGUpKGEpfW4uZChlLCJhIixmdW5jdGlvbigpe3JldHVybiBhfSl9fSxbWzQsM11dXSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPW1haW4uanMubWFw");eval(base64script); </script>
+
.container {
 +
  position: relative;
 +
  margin: auto;
 +
  background-color: white;
 +
  height: 100%;
 +
}
 +
.waiteranimationdiv {
 +
margin-left: auto;
 +
margin-right: auto;
 +
width: 100%;
 +
}
  
 +
</style>
 +
<div id="removeme">
 +
<nav>
 +
  <div id='cssmenu'>
 +
    <ul>
 +
      <li></li>
 +
      <li><a><span>Project</span></a>
 +
       
 +
      </li>
  
 +
      <li><a><span>Lab</span></a>
 +
       
 +
      </li>
 +
 +
      <li><a><span>Parts</span></a>
 +
      </li>
 +
      <li><a ><span>Model</span></a>
 +
       
 +
      </li>
 +
 +
      <li><a ><span>Contribution</span></a>
 +
       
 +
      </li>
 +
      <li><a ><span>Human practice</span></a></li>
 +
      <li><a ><span>Acknowledgement</span></a>
 +
      </li>
 +
    </ul>
 +
  </div>
 +
</nav>
 +
<div class="container"><div class="waiteranimationdiv"><img class="spinner" src="https://static.igem.org/mediawiki/2018/c/cc/T--GO_Paris-Saclay--mascotte_spinner.png"> Loading, please wait <progress id="progress" value="0"></progress><span id="progdisplay"></span></div></div>
 +
</div>
  
<script>
 
setTimeout(function(){
 
$(".body").append($("#bigmaindiv"));
 
$('#top_title').remove();
 
$('#bigmaindiv').insertBefore('#content');
 
}, 2000);
 
</script>
 
 
<style>
 
<style>
#content{
+
.spinner {
background-color: #FFFFFF00;
+
  width: 40px;
width: 0px;
+
 
padding: 0px;
+
  margin: 100px auto;
border: none;
+
  -webkit-animation: sk-rotateplane 1.2s infinite ease-in-out;
margin-left: 0px;
+
  animation: sk-rotateplane 1.2s infinite ease-in-out;
margin-right: auto;
+
 
}
 
}
#bigmaindiv
+
 
{
+
@-webkit-keyframes sk-rotateplane {
width:100vw;
+
  0% { -webkit-transform: perspective(120px) }
position:absolute;
+
  50% { -webkit-transform: perspective(120px) rotateY(180deg) }
background-color: white;
+
  100% { -webkit-transform: perspective(120px) rotateY(180deg)  rotateX(180deg) }
margin-left : 0px;
+
margin-top: 25px
+
margin-right : 0px;
+
 
}
 
}
body{
+
 
background-color: #FFFFFF;
+
@keyframes sk-rotateplane {
 +
  0% {
 +
    transform: perspective(120px) rotateX(0deg) rotateY(0deg);
 +
    -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg)
 +
  } 50% {
 +
    transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
 +
    -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg)
 +
  } 100% {
 +
    transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
 +
    -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
 +
  }
 
}
 
}
 +
 
</style>
 
</style>
 +
 +
<!-- end predisplay -->
 +
 +
  <meta charset="utf-8">
 +
  <base href="https://2018.igem.org/Team:GO_Paris-Saclay">
 +
  <meta name="viewport" content="width=device-width, initial-scale=1">
 +
 +
<div id="bigmaindiv">
 +
<app-root></app-root>
 +
</div>
 +
 +
<script>
 +
$('#top_title').remove();
 +
var progressBar = document.getElementById("progress");
 +
var display = document.getElementById("progdisplay");
 +
 +
function reqListener () {
 +
  var b64_csstext = this.responseText;
 +
  console.log("Received CSS results");
 +
  var css_text = atob(b64_csstext);
 +
  $('head').append("<style>"+css_text+"</style>");
 +
}
 +
 +
var oReq = new XMLHttpRequest();
 +
oReq.addEventListener("load", reqListener);
 +
oReq.open("GET", "https://static.igem.org/mediawiki/2018/2/22/T--GO_Paris-Saclay--maincss.txt");
 +
console.log("Sending CSS XHR...");
 +
oReq.send();
 +
 +
 +
function JSreqLoader () {
 +
  var b64_text = this.responseText;
 +
  console.log("Received JS results");
 +
 +
  var js_text = atob(b64_text);
 +
eval(js_text);
 +
 +
 +
setTimeout(function(){
 +
    $(".body").append($("#bigmaindiv"));
 +
 +
$('#removeme').remove();
 +
$('#bigmaindiv').insertBefore('#content'); }, 0);
 +
setTimeout(function(){
 +
    $('#cssmenu').prepend('<div id="menu-button">Menu</div>');
 +
    $('#cssmenu #menu-button').on('click', function(){
 +
      var menu = $(this).next('ul');
 +
      if (menu.hasClass('open')) {
 +
        menu.removeClass('open');
 +
      }
 +
      else {
 +
        menu.addClass('open');
 +
      }
 +
    });
 +
},1000);
 +
}
 +
 +
 +
const req = new XMLHttpRequest();
 +
req.addEventListener("load", JSreqLoader);
 +
 +
req.open('GET', 'https://static.igem.org/mediawiki/2018/e/ee/T--GO_Paris-Saclay--mainscript.txt', true);
 +
console.log("Sending JS XHR...");
 +
req.onprogress = function(e) {
 +
    if (e.lengthComputable) {
 +
        progressBar.max = e.total;
 +
        progressBar.value = e.loaded;
 +
        display.innerText = Math.floor((e.loaded / e.total) * 100) + '%';
 +
    }
 +
};
 +
req.send(null);
 +
 +
</script>
 +
<script src="https://2018.igem.org/common/MathJax-2.5-latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
 +
<script type="text/x-mathjax-config">
 +
MathJax.Hub.Config({
 +
    tex2jax: {
 +
        inlineMath: [ ['$','$'], ["\\(","\\)"] ],
 +
        displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
 +
        processEscapes: true,
 +
        processEnvironments: true
 +
    },
 +
    // Center justify equations in code and markdown cells. Elsewhere
 +
    // we use CSS to left justify single line equations in code cells.
 +
    displayAlign: 'center',
 +
    "HTML-CSS": {
 +
        styles: {'.MathJax_Display': {"margin": 0}},
 +
        linebreaks: { automatic: true }
 +
    }
 +
});
 +
</script>
 
</html>
 
</html>

Latest revision as of 22:07, 13 October 2018