{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Robot Framework Jupyter example\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [],
   "source": [
    "*** Settings ***\n",
    "\n",
    "Library  SeleniumLibrary\n",
    "Library  SeleniumScreenshots\n",
    "\n",
    "Suite teardown  Close all browsers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [],
   "source": [
    "*** Keywords ***\n",
    "\n",
    "Open url\n",
    "    [Arguments]  ${url}\n",
    "    Open browser  ${url}  browser=headlessfirefox\n",
    "    Set window size  800  600"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<p><a href=\"javascript:(function(el){var w=window.open();var d='PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJQcmFnbWEiIGNvbnRlbnQ9Im5vLWNhY2hlIj4KPG1ldGEgaHR0cC1lcXVpdj0iRXhwaXJlcyIgY29udGVudD0iLTEiPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgo8bWV0YSBjb250ZW50PSJSb2JvdCBGcmFtZXdvcmsgMy4xIChQeXRob24gMy42Ljggb24gbGludXgpIiBuYW1lPSJHZW5lcmF0b3IiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBRUFJQUJvQkFBQUZnQUFBQ2dBQUFBUUFBQUFJQUFBQUFFQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLY0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQXFBQUFBQUFBQUFBQUFBQUFBQUFBQUxJQUFBRC9BQUFBNEFBQUFOd0FBQURjQUFBQTNBQUFBTndBQUFEY0FBQUEzQUFBQU53QUFBRGNBQUFBNEFBQUFQOEFBQUN4QUFBQUFBQUFBS1lBQUFEL0FBQUF1d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQy9BQUFBL3dBQUFLa0FBQUQ2QUFBQXpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU44QUFBRC9BQUFBK2dBQUFNTUFBQUFBQUFBQUFnQUFBR3NBQUFCckFBQUFhd0FBQUdzQUFBQnJBQUFBYXdBQUFHc0FBQUJyQUFBQURBQUFBQUFBQUFEYUFBQUEvd0FBQVBvQUFBRERBQUFBQUFBQUFJc0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFORUFBQUFBQUFBQTJnQUFBUDhBQUFENkFBQUF3d0FBQUFBQUFBQUFBQUFBTWdBQUFESUFBQUF5QUFBQU1nQUFBRElBQUFBeUFBQUFNZ0FBQURJQUFBQUZBQUFBQUFBQUFOb0FBQUQvQUFBQStnQUFBTU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGFBQUFBL3dBQUFQb0FBQUREQUFBQUFBQUFBRHdBQUFCOEFBQUFBQUFBQUdBQUFBQmNBQUFBQUFBQUFIOEFBQUJLQUFBQUFBQUFBQUFBQUFBQUFBQUEyZ0FBQVA4QUFBRDZBQUFBd3dBQUFBQUFBQURDQUFBQS93QUFBQ2tBQUFEcUFBQUE0UUFBQUFBQUFBRDdBQUFBL3dBQUFMQUFBQUFHQUFBQUFBQUFBTm9BQUFEL0FBQUErZ0FBQU1NQUFBQUFBQUFBSXdBQUFQNEFBQUQvQUFBQS93QUFBR0FBQUFBQUFBQUFBQUFBQU1rQUFBRC9BQUFBaWdBQUFBQUFBQURhQUFBQS93QUFBUG9BQUFEREFBQUFBQUFBQUFBQUFBQUlBQUFBY0FBQUFCa0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFZ0FBQUFBQUFBQUFBQUFBMmdBQUFQOEFBQUQ3QUFBQXl3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU40QUFBRC9BQUFBcXdBQUFQOEFBQUN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTElBQUFEL0FBQUFzZ0FBQUFBQUFBQzVBQUFBL3dBQUFNb0FBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNa0FBQUQvQUFBQXZBQUFBQUFBQUFBQUFBQUFBQUFBQUt3QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBclFBQUFBQUFBQUFBd0FNQUFJQUJBQUFmK0FBQVAvd0FBRC84QUFBZ0JBQUFQL3dBQUQvOEFBQS8vQUFBSkl3QUFESEVBQUEvL0FBQVAvd0FBQi80QUFDQUFRQUF3QU1BQUE9PSI+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+Ci8qIEdlbmVyaWMgYW5kIG1pc2Mgc3R5bGVzICovCmJvZHkgewogICAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICBjb2xvcjogYmxhY2s7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQp0YWJsZSB7CiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDFlbTsKfQp0aCwgdGQgewogICAgdmVydGljYWwtYWxpZ246IHRvcDsKfQpiciB7CiAgICBtc28tZGF0YS1wbGFjZW1lbnQ6IHNhbWUtY2VsbDsgLyogbWFpbnRhaW4gbGluZSBicmVha3MgaW4gRXhjZWwgKi8KfQpociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KYSwgYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6ICMxNWM7Cn0KYSA+IGltZyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTVjICFpbXBvcnRhbnQ7Cn0KYTpob3ZlciwgYTphY3RpdmUgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICBjb2xvcjogIzYxYzsKfQoucGFyZW50LW5hbWUgewogICAgZm9udC1zaXplOiAwLjdlbTsKICAgIGxldHRlci1zcGFjaW5nOiAtMC4wN2VtOwp9Ci5tZXNzYWdlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQovKiBIZWFkZXJzICovCiNoZWFkZXIgewogICAgd2lkdGg6IDY1ZW07CiAgICBoZWlnaHQ6IDNlbTsKICAgIG1hcmdpbjogNnB4IDA7Cn0KaDEgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBtYXJnaW46IDAgMCAwLjVlbSAwOwogICAgd2lkdGg6IDc1JTsKfQpoMiB7CiAgICBjbGVhcjogbGVmdDsKfQojZ2VuZXJhdGVkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLyogRG9jdW1lbnRhdGlvbiBoZWFkZXJzICovCi5kb2MgPiBoMiB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9Ci5kb2MgPiBoMyB7CiAgICBmb250LXNpemU6IDEuMWVtOwp9Ci5kb2MgPiBoNCB7CiAgICBmb250LXNpemU6IDEuMGVtOwp9Ci8qIFN0YXR1cyB0ZXh0IGNvbG9ycyAtLSAhaW1wb3J0YW50IGFsbG93cyB1c2luZyB0aGVtIGluIGxpbmtzICovCi5mYWlsIHsKICAgIGNvbG9yOiAjZjMzICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoucGFzcyB7CiAgICBjb2xvcjogIzM5MyAhaW1wb3J0YW50Owp9Ci5sYWJlbCB7CiAgICBwYWRkaW5nOiAycHggNXB4OwogICAgZm9udC1zaXplOiAwLjc1ZW07CiAgICBsZXR0ZXItc3BhY2luZzogMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KLmxhYmVsLmRlYnVnLCAubGFiZWwudHJhY2UsIC5sYWJlbC5lcnJvciwgLmxhYmVsLmtleXdvcmQgewogICAgbGV0dGVyLXNwYWNpbmc6IDA7Cn0KLmxhYmVsLmVycm9yLCAubGFiZWwuZmFpbCwgLmxhYmVsLnBhc3MsIC5sYWJlbC53YXJuIHsKICAgIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoubGFiZWwuZXJyb3IsIC5sYWJlbC5mYWlsIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOTUzNGY7Cn0KLmxhYmVsLnBhc3MgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzVjYjg1YzsKfQoubGFiZWwud2FybiB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWM5NzFmOwp9Ci8qIFRvcCByaWdodCBoZWFkZXIgKi8KI3RvcC1yaWdodC1oZWFkZXIgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgcmlnaHQ6IDA7CiAgICB6LWluZGV4OiAxMDAwOwogICAgd2lkdGg6IDEyZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KI3JlcG9ydC1vci1sb2ctbGluayBhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogYmxhY2s7CiAgICBjb2xvcjogd2hpdGU7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKICAgIHBhZGRpbmc6IDAuM2VtIDA7CiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7Cn0KI3JlcG9ydC1vci1sb2ctbGluayBhOmhvdmVyIHsKICAgIGNvbG9yOiAjZGRkOwp9CiNsb2ctbGV2ZWwtc2VsZWN0b3IgewogICAgcGFkZGluZzogMC4zZW0gMDsKICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiAjZGRkOwp9Ci8qIFN0YXRpc3RpY3MgdGFibGUgKi8KLnN0YXRpc3RpY3MgewogICAgd2lkdGg6IDY1ZW07CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBtYXJnaW4tYm90dG9tOiAxZW07Cn0KLnN0YXRpc3RpY3MgdHI6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Y0ZjRmNDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQouc3RhdGlzdGljcyB0aCwgLnN0YXRpc3RpY3MgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwp9Ci5zdGF0aXN0aWNzIHRoIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICBwYWRkaW5nOiAwLjJlbSAwLjNlbTsKfQouc3RhdGlzdGljcyB0ZCB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9Ci5zdGF0cy1jb2wtc3RhdCB7CiAgICB3aWR0aDogNC41ZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLnN0YXRzLWNvbC1lbGFwc2VkIHsKICAgIHdpZHRoOiA1LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc3RhdHMtY29sLWdyYXBoIHsKICAgIHdpZHRoOiA5ZW07Cn0KdGguc3RhdHMtY29sLWdyYXBoOmhvdmVyIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQouc3RhdC1uYW1lIHsKICAgIGZsb2F0OiBsZWZ0Owp9Ci5zdGF0LW5hbWUgYSwgLnN0YXQtbmFtZSBzcGFuIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci50YWctbGlua3MgewogICAgZm9udC1zaXplOiAwLjllbTsKICAgIGZsb2F0OiByaWdodDsKICAgIG1hcmdpbi10b3A6IDAuMDVlbTsKfQoudGFnLWxpbmtzIHNwYW4gewogICAgbWFyZ2luLWxlZnQ6IDAuMmVtOwp9Ci8qIFN0YXRpc3RpY3MgZ3JhcGggKi8KLmdyYXBoLCAuZW1wdHktZ3JhcGggewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHdpZHRoOiBhdXRvOwogICAgaGVpZ2h0OiA3cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYmFja2dyb3VuZDogI2YzMzsKfQouZW1wdHktZ3JhcGggewogICAgYmFja2dyb3VuZDogI2VlZTsKfQoucGFzcy1iYXIsIC5mYWlsLWJhciB7CiAgICBmbG9hdDogbGVmdDsKICAgIGhlaWdodDogMTAwJTsKfQoucGFzcy1iYXIgewogICAgYmFja2dyb3VuZDogIzFkNDsKfQovKiBUYWJsZXNvcnRlciAtIGFkYXB0ZWQgZnJvbSBwcm92aWRlZCBCbHVlIFNraW4gKi8KLnRhYmxlc29ydGVyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQ3dBSkFJQUFBSDkvZndBQUFDSDVCQUVBQUFFQUxBQUFBQUFMQUFrQUFBSVJqQU9uQnIzY25JcjBXVWpUckM5ZTlCUUFPdz09KTsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgcmlnaHQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLnRhYmxlc29ydGVyLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Ci50YWJsZXNvcnRlci1oZWFkZXJBc2MgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBS0VBQUFBQUFIOS9md0FBQUFBQUFDSDVCQUVBQUFJQUxBQUFBQUFMQUFrQUFBSVVsQlduRnIzY25JcjBXUU95Qm12enAxM0NweFFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjICFpbXBvcnRhbnQ7Cn0KLnRhYmxlc29ydGVyLWhlYWRlckRlc2MgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBS0VBQUFBQUFIOS9md0FBQUFBQUFDSDVCQUVBQUFJQUxBQUFBQUFMQUFrQUFBSVVsQVduQnIzY25JcjBXUk95RG12enAxM0NweFFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjICFpbXBvcnRhbnQ7Cn0KLnNvcnRlci1mYWxzZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5zb3J0ZXItZmFsc2U6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgovKiBJY29ucyBhcmUgZnJvbSBPcGVuIEljb25pYyA8aHR0cHM6Ly91c2VpY29uaWMuY29tL29wZW4vPi4KICAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiAqLwovKiBDb250YWluZXJzICovCi5zdWl0ZSwgLnRlc3QsICNlcnJvcnMgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHBhZGRpbmc6IDAuM2VtIDAuMmVtOwogICAgbWFyZ2luOiAwLjJlbSAwOwp9Ci50ZXN0IHsKICAgIGJvcmRlci1zdHlsZTogZGFzaGVkOwp9CiNlcnJvcnMsIC5tZXNzYWdlcywgLm1ldGFkYXRhIHsKICAgIHdpZHRoOiAxMDAlOwogICAgYm9yZGVyLXNwYWNpbmc6IDA7Cn0KLmNoaWxkcmVuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBtYXJnaW4tbGVmdDogMS40ZW07Cn0KLnN1aXRlLCAudGVzdCwgLmtleXdvcmQgewogICAgbWFyZ2luLWxlZnQ6IC0wLjJlbTsKfQojczEsIC5zdWl0ZSA+IC5jaGlsZHJlbiA+IC5rZXl3b3JkIHsKICAgIG1hcmdpbi1sZWZ0OiAwOwp9Ci8qIFN1aXRlLCB0ZXN0IGFuZCBrdyBoZWFkZXJzICovCi5lbGVtZW50LWhlYWRlciB7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQouZWxlbWVudC1oZWFkZXI6aG92ZXIgewogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKICAgIGJvcmRlci1jb2xvcjogI2NjYzsKfQouZWxlbWVudC1oZWFkZXItdG9nZ2xlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDNweDsKICAgIHRvcDogNXB4OwogICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFZQUFBQUdDQVFBQUFCS3hTZkRBQUFBQW1KTFIwUUEvNGVQekw4QUFBQUpjRWhaY3dBQUN4TUFBQXNUQVFDYW5CZ0FBQUFIZEVsTlJRZmVDUjBKQ2hTa1p6MjBBQUFBR2tsRVFWUUkxMk5nUUFLTURLekluUDhJRGhPcU1rNEc3QUFBTlF3QkU0MjdQWVVBQUFBQVNVVk9SSzVDWUlJPSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0k0SWlCb1pXbG5hSFE5SWpnaUlIWnBaWGRDYjNnOUlqQWdNQ0E0SURnaVBnb2dJRHh3WVhSb0lHUTlJazB3SURCMk1tZzRkaTB5YUMwNGVpSWdkSEpoYm5ObWIzSnRQU0owY21GdWMyeGhkR1VvTUNBektTSWdMejRLUEM5emRtYyspLCBub25lOwogICAgaGVpZ2h0OiAxMHB4OwogICAgd2lkdGg6IDEwcHg7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDZweCA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9Ci5jbG9zZWQgPiAuZWxlbWVudC1oZWFkZXItdG9nZ2xlIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFZQUFBQUdDQVFBQUFCS3hTZkRBQUFBQW1KTFIwUUEvNGVQekw4QUFBQUpjRWhaY3dBQUN4TUFBQXNUQVFDYW5CZ0FBQUFIZEVsTlJRZmVDUjBKQ0RIZFZZdHhBQUFBTTBsRVFWUUkxMDNNTVFxQU1CUUZ3Vkh5SVRhQjNQK1cxc0t6U0JDM21XNmhSRncwcFVCNUR2RjFidTlGTjBSTTNYL3dBazk4Q1VudkZUYWtBQUFBQUVsRlRrU3VRbUNDKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMHpJREIyTTJndE0zWXlhRE4yTTJneWRpMHphRE4yTFRKb0xUTjJMVE5vTFRKNklpQXZQZ284TDNOMlp6ND0pLCBub25lOwp9Ci5lbGVtZW50LWhlYWRlcjpob3ZlciA+IC5lbGVtZW50LWhlYWRlci10b2dnbGUgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQouZWxlbWVudC1oZWFkZXItcmlnaHQ6aG92ZXIgfiAuZWxlbWVudC1oZWFkZXItdG9nZ2xlIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50Owp9Ci5lbGVtZW50LWhlYWRlci1sZWZ0IHsKICAgIHBhZGRpbmc6IDNweCA4MHB4IDNweCAyMHB4Owp9Ci5lbGVtZW50LWhlYWRlci1yaWdodCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICByaWdodDogMDsKICAgIHRvcDogMDsKICAgIHBhZGRpbmc6IDNweDsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoubmFtZSB7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQouZWxhcHNlZCB7CiAgICBmbG9hdDogcmlnaHQ7CiAgICBjb2xvcjogIzk5OTsKICAgIHBhZGRpbmctbGVmdDogMWVtOwp9Ci5saW5rIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFnQUFBQUlDQVlBQUFERUQ3NkxBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUxFd0FBQ3hNQkFKcWNHQUFBQUhsSlJFRlVHSlZ0enJFSndtQVFCdENuNkFTdUlLVElCaFkyZ21naEJpSllCMXVkd2sxMEI4RkpiS01CY1FGYnRia2ZKSHJWd2Z1KzQvaWRKUjY0WTlIN0UzaGlnajVPM1M4WTQ0QXBMbmpoblhDTkdoVjJ5TkdnZ0RKd2lDMDJnYXZVYnBERnZzY1JvNFFkWE9NS0RIQnVmejNITFlLek5uNEFiU2tWM2ZuY0dRWUFBQUFBU1VWT1JLNUNZSUk9KTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMDFMamc0TGpBell5MHVNVGd1TURFdExqTTJMakF6TFM0MU15NHdPUzB1TWpjdU1TMHVOVE11TWpVdExqYzFMalEzWVM0MUxqVWdNQ0F4SURBZ0xqWTVMalk1WXk0eE1TMHVNVEV1TWpRdExqRTNMak00TFM0eU1pNHpOUzB1TVRJdU56Z3RMakEzSURFdU1EWXVNakl1TXprdU16a3VNemtnTVM0d05DQXdJREV1TkRSc0xURXVOU0F4TGpWakxTNDBOQzQwTkMwdU9DNDBPQzB4TGpBMkxqUTNMUzR5TmkwdU1ERXRMalF4TFM0eE15MHVOREV0TGpFellTNDFMalVnTUNBeElEQXRMalV1T0RoekxqTTBMakl5TGpnMExqSTFZeTQxTGpBeklERXVNaTB1TVRZZ01TNDRNUzB1Tnpoc01TNDFMVEV1TldNdU56Z3RMamM0TGpjNExUSXVNRFFnTUMweUxqZ3hMUzR5T0MwdU1qZ3RMall4TFM0ME5TMHVPVGN0TGpVekxTNHhPQzB1TURRdExqTTRMUzR3TkMwdU5UWXRMakF6ZW0wdE1pQXlMak14WXkwdU5TMHVNREl0TVM0eE9TNHhOUzB4TGpjNExqYzFiQzB4TGpVZ01TNDFZeTB1TnpndU56Z3RMamM0SURJdU1EUWdNQ0F5TGpneExqVTJMalUySURFdU16WXVOeklnTWk0d05pNDBOeTR5TnkwdU1TNDFNeTB1TWpVdU56VXRMalEzWVM0MUxqVWdNQ0F4SURBdExqWTVMUzQyT1dNdExqRXhMakV4TFM0eU5DNHhOeTB1TXpndU1qSXRMak0xTGpFeUxTNDNPQzR3TnkweExqQTJMUzR5TWkwdU16a3RMak01TFM0ek9TMHhMakEwSURBdE1TNDBOR3d4TGpVdE1TNDFZeTQwTFM0MExqYzFMUzQwTlNBeExqQXpMUzQwTkM0eU9DNHdNUzQwTnk0d09TNDBOeTR3T1dFdU5TNDFJREFnTVNBd0lDNDBOQzB1T0RoekxTNHpOQzB1TWkwdU9EUXRMakl5ZWlJS0lDQXZQZ284TDNOMlp6ND0pLCBub25lOwp9Ci5leHBhbmQgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQWdBQUFBSUNBWUFBQURFRDc2TEFBQUFCSE5DU1ZRSUNBZ0lmQWhraUFBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBRHRKUkVGVUdKVmpZQ0FDS0RBd01CeUEwbGpGRGpBd01QeG5ZR0I0QUJWUWdMTC9RK1ZRQkI2Z3NlR21JaXZDa0VSWGhGVVNXUkZPU2F3QUFFbDdFM3V2MWlNY0FBQUFBRWxGVGtTdVFtQ0MpOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJNElpQm9aV2xuYUhROUlqZ2lJSFpwWlhkQ2IzZzlJakFnTUNBNElEZ2lQZ29nSUR4d1lYUm9JR1E5SWsweExqVWdNR3d0TVM0MUlERXVOU0EwSURRZ05DMDBMVEV1TlMweExqVXRNaTQxSURJdU5TMHlMalV0TWk0MWVpSWdkSEpoYm5ObWIzSnRQU0owY21GdWMyeGhkR1VvTUNBeEtTSWdMejRLUEM5emRtYyspLCBub25lOwp9Ci5jb2xsYXBzZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBZ0FBQUFJQ0FZQUFBREVENzZMQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFMRXdBQUN4TUJBSnFjR0FBQUFDNUpSRUZVR0pWallDQVJORUF4VHNuL1VJeWhDRmtTUXhHNlRoUStDNUlwaldoRzF5TmI0WURGVGRqRU1BRUFDaThRKys5WTlUQUFBQUFBU1VWT1JLNUNZSUk9KTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMDBJREJzTFRRZ05DQXhMalVnTVM0MUlESXVOUzB5TGpVZ01pNDFJREl1TlNBeExqVXRNUzQxTFRRdE5Ib2lJSFJ5WVc1elptOXliVDBpZEhKaGJuTnNZWFJsS0RBZ01Ta2lJQzgrQ2p3dmMzWm5QZz09KSwgbm9uZTsKfQouZXhwYW5kLCAuY29sbGFwc2UsIC5saW5rIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgZGlzcGxheTogYmxvY2s7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICBtYXJnaW46IDAgNHB4OwogICAgaGVpZ2h0OiAxNHB4OwogICAgd2lkdGg6IDE0cHg7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDhweCA4cHg7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQoubGluayB7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDEwcHggMTBweDsKfQouZWxlbWVudC1oZWFkZXI6aG92ZXIgYSB7CiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwp9Ci5leHBhbmQ6aG92ZXIsIC5jb2xsYXBzZTpob3ZlciwgLmxpbms6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQovKiBNZXNzYWdlcyBhbmQgZXJyb3JzICovCi5tZXNzYWdlcyAudGltZSwgLm1lc3NhZ2VzIC5tZXNzYWdlIHsKICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICBmb250LXNpemU6IDEuMWVtOwp9CiNlcnJvcnMgLm1lc3NhZ2UgewogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMS4yZW07Cn0KLm1lc3NhZ2Utcm93IHsKICAgIGhlaWdodDogMjBweDsKfQoudGltZSB7CiAgICB3aWR0aDogNy41ZW07Cn0KLmVycm9yLXRpbWUgewogICAgd2lkdGg6IDExZW07CiAgICBmb250LXNpemU6IDAuOWVtOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoubGV2ZWwgewogICAgd2lkdGg6IDVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc2VsZWN0LW1lc3NhZ2UgewogICAgd2lkdGg6IDI0cHg7Cn0KLnNlbGVjdC1tZXNzYWdlID4gZGl2IHsKICAgIGZsb2F0OiByaWdodDsKICAgIG1hcmdpbi1yaWdodDogMnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgd2lkdGg6IDE2cHg7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDEycHggMTJweDsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7Cn0KLm1lc3NhZ2Utcm93OmhvdmVyIC5zZWxlY3QtbWVzc2FnZSBkaXYgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQXdBQUFBTUNBUUFBQUQ4ZkpSc0FBQUFBbUpMUjBRQS80ZVB6TDhBQUFBSmNFaFpjd0FBQ3hNQUFBc1RBUUNhbkJnQUFBQUhkRWxOUlFmZUNSME1PemhXS1pRT0FBQUFTVWxFUVZRWTAzMlBzUkhBSUF3RFg5QmtpY0QrVzhVTUVxZWdBUUpXS1ovKzNzTFpKaEZHUUVaek5hSWE0aWJoNjZFbjg2N1ZOYUllb1A1V3BwTnVJR29BbE9tM2c1VkMxQWRZZVF2MUJaUFJTZ0FBQUFCSlJVNUVya0pnZ2c9PSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0k0SWlCb1pXbG5hSFE5SWpnaUlIWnBaWGRDYjNnOUlqQWdNQ0E0SURnaVBnb2dJRHh3WVhSb0lHUTlJazB3SURCMk1XZzRkaTB4YUMwNGVtMHdJREoyTVdnMmRpMHhhQzAyZW0wd0lESjJNV2c0ZGkweGFDMDRlbTB3SURKMk1XZzJkaTB4YUMwMmVpSWdMejRLUEM5emRtYyspLCBub25lOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQouc2VsZWN0LW1lc3NhZ2U6aG92ZXIgZGl2IHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2M7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLyogTWVzc2FnZSB0YWJsZXMgLSB0aGVzZSBNVVNUIE5PVCBiZSBjb21iaW5lZCB0b2dldGhlciBiZWNhdXNlIG90aGVyd2lzZQogICBkeW5hbWljYWxseSBhbHRlcmluZyB0aGVtIGJhc2VkIG9uIHZpc2libGUgbG9nIGxldmVsIGlzIG5vdCBwb3NzaWJsZS4gKi8KLnRyYWNlLW1lc3NhZ2UgewogICAgZGlzcGxheTogdGFibGU7Cn0KLmRlYnVnLW1lc3NhZ2UgewogICAgZGlzcGxheTogdGFibGU7Cn0KLyogTWV0YWRhdGEgKi8KLm1ldGFkYXRhIHRoIHsKICAgIHdpZHRoOiAxMi41ZW07CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIHBhZGRpbmc6IDA7Cn0KLm1ldGFkYXRhIHRkIHsKICAgIHBhZGRpbmc6IDAuMmVtOwp9Ci5rZXl3b3JkLW1ldGFkYXRhIHsKICAgIGZvbnQtc2l6ZTogMC45ZW07Cn0KLyogQ3VzdG9tIHN0eWxlcyBmb3Igc3RhdGlzdGljcyAqLwojdG90YWwtc3RhdHMgdHI6aG92ZXIsICN0YWctc3RhdHMgdHI6aG92ZXIgewogICAgY3Vyc29yOiBkZWZhdWx0Owp9Cjwvc3R5bGU+CjxzdHlsZSBtZWRpYT0icHJpbnQiIHR5cGU9InRleHQvY3NzIj4KYm9keSB7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogOHB0Owp9CmE6bGluaywgYTp2aXNpdGVkIHsKICAgIGNvbG9yOiBibGFjazsKfQojaGVhZGVyIHsKICAgIHdpZHRoOiBhdXRvOwp9Ci5kZXRhaWxzLCAuc3RhdGlzdGljcyB7CiAgICB3aWR0aDogMTAwJTsKfQojZ2VuZXJhdGVkLWFnbywgI3RvcC1yaWdodC1oZWFkZXIsICNub3JtYWwtc2VsZWN0b3IsICNzZWFyY2gtYnV0dG9ucywKLmZvbGRpbmctYnV0dG9uLCAuZXhwYW5kLCAuaGlkZGVuLCAuZGV0YWlscy1jb2wtdG9nZ2xlIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLmVsZW1lbnQtaGVhZGVyLXRleHQsIC5jaGlsZHJlbiB7CiAgICBtYXJnaW46IDA7Cn0KI3Rlc3QtZGV0YWlscyB7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgdGFibGUtbGF5b3V0OiBhdXRvOwp9CiN0ZXN0LWRldGFpbHMgdGgsICN0ZXN0LWRldGFpbHMgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Cn0KLmRldGFpbHMtY29sLWhlYWRlciB7CiAgICBwYWRkaW5nOiAwOwp9CiNwcmludC1zZWxlY3RvciB7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwp9Ci50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGJhY2tncm91bmQ6ICNkZGQgIWltcG9ydGFudDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgojamF2YXNjcmlwdC1kaXNhYmxlZCB7CiAgICB3aWR0aDogNjAwcHg7CiAgICBtYXJnaW46IDEwMHB4IGF1dG8gMCBhdXRvOwogICAgcGFkZGluZzogMjBweDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9CiNqYXZhc2NyaXB0LWRpc2FibGVkIGgxIHsKICAgIHdpZHRoOiAxMDAlOwogICAgZmxvYXQ6IG5vbmU7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgdWwgewogICAgZm9udC1zaXplOiAxLjJlbTsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCBsaSB7CiAgICBtYXJnaW46IDAuNWVtIDA7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgYiB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLmRvYyA+ICogewogICAgbWFyZ2luOiAwLjdlbSAxZW0gMC4xZW0gMWVtOwogICAgcGFkZGluZzogMDsKfQouZG9jID4gcCwgLmRvYyA+IGgxLCAuZG9jID4gaDIsIC5kb2MgPiBoMywgLmRvYyA+IGg0IHsKICAgIG1hcmdpbjogMC43ZW0gMCAwLjFlbSAwOwp9Ci5kb2MgPiAqOmZpcnN0LWNoaWxkIHsKICAgIG1hcmdpbi10b3A6IDAuMWVtOwp9Ci5kb2MgdGFibGUgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGVtcHR5LWNlbGxzOiBzaG93OwogICAgZm9udC1zaXplOiAwLjllbTsKfQouZG9jIHRhYmxlIHRoLCAuZG9jIHRhYmxlIHRkIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwogICAgaGVpZ2h0OiAxLjJlbTsKfQouZG9jIHRhYmxlIHRoIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKfQouZG9jIHByZSB7CiAgICBmb250LXNpemU6IDEuMWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgIGJhY2tncm91bmQ6ICNmNGY0ZjQ7Cn0KLmRvYyBjb2RlIHsKICAgIHBhZGRpbmc6IDAgMC4yZW07CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgYmFja2dyb3VuZDogI2VlZTsKfQouZG9jIGxpIHsKICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsKICAgIGxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwp9Ci5kb2MgaW1nIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmRvYyBociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KPC9zdHlsZT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp2YXIgTEVWRUxTID0ge1RSQUNFOiAwLCBERUJVRzogMSwgSU5GTzogMiwgV0FSTjogMywgRkFJTDogNCwgTk9ORTogNX07CmZ1bmN0aW9uIHRvZ2dsZVN1aXRlKHN1aXRlSWQpIHsKICAgIHRvZ2dsZUVsZW1lbnQoc3VpdGVJZCwgWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXSk7Cn0KZnVuY3Rpb24gdG9nZ2xlVGVzdCh0ZXN0SWQpIHsKICAgIHRvZ2dsZUVsZW1lbnQodGVzdElkLCBbJ2tleXdvcmQnXSk7Cn0KZnVuY3Rpb24gdG9nZ2xlS2V5d29yZChrd0lkKSB7CiAgICB0b2dnbGVFbGVtZW50KGt3SWQsIFsna2V5d29yZCcsICdtZXNzYWdlJ10pOwp9CmZ1bmN0aW9uIHRvZ2dsZUVsZW1lbnQoZWxlbWVudElkLCBjaGlsZHJlbk5hbWVzKSB7CiAgICB2YXIgZWxlbWVudCA9ICQoJyMnICsgZWxlbWVudElkKTsKICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oJy5jaGlsZHJlbicpOwogICAgY2hpbGRyZW4udG9nZ2xlKDEwMCwgJycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBlbGVtZW50LmNoaWxkcmVuKCcuZWxlbWVudC1oZWFkZXInKS50b2dnbGVDbGFzcygnY2xvc2VkJyk7CiAgICB9KTsKICAgIHBvcHVsYXRlQ2hpbGRyZW4oZWxlbWVudElkLCBjaGlsZHJlbiwgY2hpbGRyZW5OYW1lcyk7Cn0KZnVuY3Rpb24gcG9wdWxhdGVDaGlsZHJlbihlbGVtZW50SWQsIGNoaWxkRWxlbWVudCwgY2hpbGRyZW5OYW1lcykgewogICAgaWYgKCFjaGlsZEVsZW1lbnQuaGFzQ2xhc3MoJ3BvcHVsYXRlZCcpKSB7CiAgICAgICAgdmFyIGVsZW1lbnQgPSB3aW5kb3cudGVzdGRhdGEuZmluZExvYWRlZChlbGVtZW50SWQpOwogICAgICAgIHZhciBjYWxsYmFjayA9IGRyYXdDYWxsYmFjayhlbGVtZW50LCBjaGlsZEVsZW1lbnQsIGNoaWxkcmVuTmFtZXMpOwogICAgICAgIGVsZW1lbnQuY2FsbFdoZW5DaGlsZHJlblJlYWR5KGNhbGxiYWNrKTsKICAgICAgICBjaGlsZEVsZW1lbnQuYWRkQ2xhc3MoJ3BvcHVsYXRlZCcpOwogICAgfQp9CmZ1bmN0aW9uIGRyYXdDYWxsYmFjayhlbGVtZW50LCBjaGlsZEVsZW1lbnQsIGNoaWxkcmVuTmFtZXMpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdXRpbC5tYXAoY2hpbGRyZW5OYW1lcywgZnVuY3Rpb24gKGNoaWxkTmFtZSkgewogICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBlbGVtZW50W2NoaWxkTmFtZSArICdzJ10oKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gY2hpbGROYW1lICsgJ1RlbXBsYXRlJzsKICAgICAgICAgICAgdXRpbC5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkgewogICAgICAgICAgICAgICAgJC50bXBsKHRlbXBsYXRlLCBjaGlsZCkuYXBwZW5kVG8oY2hpbGRFbGVtZW50KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9Cn0KZnVuY3Rpb24gZXhwYW5kU3VpdGUoc3VpdGUpIHsKICAgIGlmIChzdWl0ZS5zdGF0dXMgPT0gIlBBU1MiKQogICAgICAgIGV4cGFuZEVsZW1lbnQoc3VpdGUpOwogICAgZWxzZQogICAgICAgIGV4cGFuZENyaXRpY2FsRmFpbGVkKHN1aXRlKTsKfQpmdW5jdGlvbiBleHBhbmRFbGVtZW50KGl0ZW0pIHsKICAgIHZhciBlbGVtZW50ID0gJCgnIycgKyBpdGVtLmlkKTsKICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oJy5jaGlsZHJlbicpOwogICAgLy8gLmNzcyBpcyBmYXN0ZXIgdGhhbiAuc2hvdyBhbmQgLnNob3cgdy8gY2FsbGJhY2sgaXMgdGVycmlibHkgc2xvdwogICAgY2hpbGRyZW4uY3NzKHsnZGlzcGxheSc6ICdibG9jayd9KTsKICAgIHBvcHVsYXRlQ2hpbGRyZW4oaXRlbS5pZCwgY2hpbGRyZW4sIGl0ZW0uY2hpbGRyZW5OYW1lcyk7CiAgICBlbGVtZW50LmNoaWxkcmVuKCcuZWxlbWVudC1oZWFkZXInKS5yZW1vdmVDbGFzcygnY2xvc2VkJyk7Cn0KZnVuY3Rpb24gZXhwYW5kRWxlbWVudFdpdGhJZChlbGVtZW50aWQpIHsKICAgIGV4cGFuZEVsZW1lbnQod2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQoZWxlbWVudGlkKSk7Cn0KZnVuY3Rpb24gZXhwYW5kQ3JpdGljYWxGYWlsZWQoZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQuc3RhdHVzID09ICJGQUlMIikgewogICAgICAgIHdpbmRvdy5lbGVtZW50c1RvRXhwYW5kID0gW2VsZW1lbnRdOwogICAgICAgIHdpbmRvdy5leHBhbmREZWNpZGVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmV0dXJuIGUuc3RhdHVzID09ICJGQUlMIiAmJiAoZS5pc0NyaXRpY2FsID09PSB1bmRlZmluZWQgfHwgZS5pc0NyaXRpY2FsKTsKICAgICAgICB9OwogICAgICAgIGV4cGFuZFJlY3Vyc2l2ZWx5KCk7CiAgICB9Cn0KZnVuY3Rpb24gZXhwYW5kQWxsKGVsZW1lbnRJZCkgewogICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQgPSBbd2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQoZWxlbWVudElkKV07CiAgICB3aW5kb3cuZXhwYW5kRGVjaWRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07CiAgICBleHBhbmRSZWN1cnNpdmVseSgpOwp9CmZ1bmN0aW9uIGV4cGFuZFJlY3Vyc2l2ZWx5KCkgewogICAgaWYgKCF3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5sZW5ndGgpCiAgICAgICAgcmV0dXJuOwogICAgdmFyIGVsZW1lbnQgPSB3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5wb3AoKTsKICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50SGlkZGVuQnlVc2VyKGVsZW1lbnQuaWQpKSB7CiAgICAgICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQgPSBbXTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBleHBhbmRFbGVtZW50KGVsZW1lbnQpOwogICAgZWxlbWVudC5jYWxsV2hlbkNoaWxkcmVuUmVhZHkoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oKTsKICAgICAgICBmb3IgKHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cuZXhwYW5kRGVjaWRlcihjaGlsZHJlbltpXSkpCiAgICAgICAgICAgICAgICB3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5wdXNoKGNoaWxkcmVuW2ldKTsKICAgICAgICB9CiAgICAgICAgaWYgKHdpbmRvdy5lbGVtZW50c1RvRXhwYW5kLmxlbmd0aCkKICAgICAgICAgICAgc2V0VGltZW91dChleHBhbmRSZWN1cnNpdmVseSwgMCk7CiAgICB9KTsKfQpmdW5jdGlvbiBlbGVtZW50SGlkZGVuQnlVc2VyKGlkKSB7CiAgICB2YXIgZWxlbWVudCA9ICQoJyMnICsgaWQpOwogICAgcmV0dXJuICFlbGVtZW50LmlzKCI6dmlzaWJsZSIpOwp9CmZ1bmN0aW9uIGNvbGxhcHNlQWxsKGlkKSB7CiAgICB2YXIgZWxlbWVudCA9ICQoJyMnICsgaWQpOwogICAgZWxlbWVudC5maW5kKCcuY2hpbGRyZW4nKS5jc3MoeydkaXNwbGF5JzogJ25vbmUnfSk7CiAgICBlbGVtZW50LmZpbmQoJy5lbGVtZW50LWhlYWRlcicpLmFkZENsYXNzKCdjbG9zZWQnKTsKfQpmdW5jdGlvbiBsb2dMZXZlbFNlbGVjdGVkKGxldmVsKSB7CiAgICB2YXIgYW5jaG9ycyA9IGdldFZpZXdBbmNob3JFbGVtZW50cygpOwogICAgc2V0TWVzc2FnZVZpc2liaWxpdHkobGV2ZWwpOwogICAgc2Nyb2xsVG9TaG9ydGVzdFZpc2libGVBbmNob3JFbGVtZW50KGFuY2hvcnMpOwp9CmZ1bmN0aW9uIGdldFZpZXdBbmNob3JFbGVtZW50cygpIHsKICAgIHZhciBlbGVtMSA9ICQoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCgxMDAsIDApKTsKICAgIHZhciBlbGVtMiA9ICQoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCgxMDAsIDIwKSk7CiAgICByZXR1cm4gW2VsZW0xLCBlbGVtMl07Cn0KZnVuY3Rpb24gc2Nyb2xsVG9TaG9ydGVzdFZpc2libGVBbmNob3JFbGVtZW50KGFuY2hvcnMpIHsKICAgIGFuY2hvcnMgPSB1dGlsLm1hcChhbmNob3JzLCBjbG9zZXN0VmlzaWJsZVBhcmVudCk7CiAgICB2YXIgc2hvcnRlc3QgPSBhbmNob3JzWzBdOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhbmNob3JzLmxlbmd0aDsgaSsrKQogICAgICAgIGlmIChzaG9ydGVzdC5oZWlnaHQoKSA+IGFuY2hvcnNbaV0uaGVpZ2h0KCkpCiAgICAgICAgICAgIHNob3J0ZXN0ID0gYW5jaG9yc1tpXTsKICAgIHNob3J0ZXN0LmdldCgpWzBdLnNjcm9sbEludG9WaWV3KHRydWUpOwp9CmZ1bmN0aW9uIHNldE1lc3NhZ2VWaXNpYmlsaXR5KGxldmVsKSB7CiAgICBsZXZlbCA9IHBhcnNlSW50KGxldmVsKTsKICAgIGNoYW5nZUNsYXNzRGlzcGxheSgiLnRyYWNlLW1lc3NhZ2UiLCBsZXZlbCA8PSBMRVZFTFMuVFJBQ0UpOwogICAgY2hhbmdlQ2xhc3NEaXNwbGF5KCIuZGVidWctbWVzc2FnZSIsIGxldmVsIDw9IExFVkVMUy5ERUJVRyk7CiAgICBjaGFuZ2VDbGFzc0Rpc3BsYXkoIi5pbmZvLW1lc3NhZ2UiLCBsZXZlbCA8PSBMRVZFTFMuSU5GTyk7Cn0KZnVuY3Rpb24gY2xvc2VzdFZpc2libGVQYXJlbnQoZWxlbSkgewogICAgd2hpbGUgKCFlbGVtLmlzKCI6dmlzaWJsZSIpKQogICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudCgpOwogICAgcmV0dXJuIGVsZW07Cn0KZnVuY3Rpb24gY2hhbmdlQ2xhc3NEaXNwbGF5KGNsYXp6LCB2aXNpYmxlKSB7CiAgICB2YXIgc3R5bGVzID0gZG9jdW1lbnQuc3R5bGVTaGVldHM7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBydWxlcyA9IGdldFJ1bGVzKHN0eWxlc1tpXSk7CiAgICAgICAgaWYgKHJ1bGVzID09PSBudWxsKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJ1bGVzLmxlbmd0aDsgaisrKQogICAgICAgICAgICBpZiAocnVsZXNbal0uc2VsZWN0b3JUZXh0ID09PSBjbGF6eikKICAgICAgICAgICAgICAgIHJ1bGVzW2pdLnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID8gInRhYmxlIiA6ICJub25lIjsKICAgIH0KfQpmdW5jdGlvbiBnZXRSdWxlcyhzdHlsZSkgewogICAgLy8gV2l0aCBDaHJvbWUgZXh0ZXJuYWwgQ1NTIGZpbGVzIHNlZW0gdG8gaGF2ZSBvbmx5IG51bGwgcm9sZXMgYW5kIHdpdGgKICAgIC8vIEZpcmVmb3ggYWNjZXNzaW5nIHJ1bGVzIGNhbiByZXN1bHQgdG8gc2VjdXJpdHkgZXJyb3IuCiAgICAvLyBOZWl0aGVyIG9mIHRoZXNlIGFyZSBhIHByb2JsZW0gb24gd2l0aCBnZW5lcmF0ZWQgbG9ncy4KICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIHN0eWxlLmNzc1J1bGVzIHx8IHN0eWxlLnJ1bGVzOwogICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9CmZ1bmN0aW9uIHNlbGVjdE1lc3NhZ2UocGFyZW50SWQpIHsKICAgIHZhciBlbGVtZW50ID0gJCgnIycgKyBwYXJlbnRJZCkuZmluZCgnLm1lc3NhZ2UnKS5nZXQoMCk7CiAgICBzZWxlY3RUZXh0KGVsZW1lbnQpOwp9CmZ1bmN0aW9uIHNlbGVjdFRleHQoZWxlbWVudCkgewogICAgLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy85ODUyNzIKICAgIHZhciByYW5nZSwgc2VsZWN0aW9uOwogICAgaWYgKGRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKSB7ICAvLyBJRSA4CiAgICAgICAgcmFuZ2UgPSBkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOwogICAgICAgIHJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KGVsZW1lbnQpOwogICAgICAgIHJhbmdlLnNlbGVjdCgpOwogICAgfSBlbHNlIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7ICAvLyBPdGhlcnMKICAgICAgICBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTsKICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTsKICAgIH0KfQpmdW5jdGlvbiBMb2dMZXZlbENvbnRyb2xsZXIobWluTGV2ZWwsIGRlZmF1bHRMZXZlbCkgewogICAgbWluTGV2ZWwgPSBMRVZFTFNbbWluTGV2ZWxdOwogICAgZGVmYXVsdExldmVsID0gTEVWRUxTW2RlZmF1bHRMZXZlbF07CiAgICBmdW5jdGlvbiBzaG93TG9nTGV2ZWxTZWxlY3RvcigpIHsKICAgICAgICByZXR1cm4gbWluTGV2ZWwgPCBMRVZFTFMuSU5GTzsKICAgIH0KICAgIGZ1bmN0aW9uIGRlZmF1bHRMb2dMZXZlbCgpIHsKICAgICAgICBpZiAobWluTGV2ZWwgPiBkZWZhdWx0TGV2ZWwpCiAgICAgICAgICAgIHJldHVybiBtaW5MZXZlbDsKICAgICAgICByZXR1cm4gZGVmYXVsdExldmVsOwogICAgfQogICAgZnVuY3Rpb24gc2hvd1RyYWNlKCkgewogICAgICAgIHJldHVybiBtaW5MZXZlbCA9PSBMRVZFTFMuVFJBQ0U7CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIHNob3dMb2dMZXZlbFNlbGVjdG9yOiBzaG93TG9nTGV2ZWxTZWxlY3RvciwKICAgICAgICBkZWZhdWx0TG9nTGV2ZWw6IGRlZmF1bHRMb2dMZXZlbCwKICAgICAgICBzaG93VHJhY2U6IHNob3dUcmFjZQogICAgfTsKfQo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKiEgalF1ZXJ5IHYzLjMuMSB8IChjKSBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiOyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUuZG9jdW1lbnQ/dChlLCEwKTpmdW5jdGlvbihlKXtpZighZS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gdChlKX06dChlKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7dmFyIG49W10scj1lLmRvY3VtZW50LGk9T2JqZWN0LmdldFByb3RvdHlwZU9mLG89bi5zbGljZSxhPW4uY29uY2F0LHM9bi5wdXNoLHU9bi5pbmRleE9mLGw9e30sYz1sLnRvU3RyaW5nLGY9bC5oYXNPd25Qcm9wZXJ0eSxwPWYudG9TdHJpbmcsZD1wLmNhbGwoT2JqZWN0KSxoPXt9LGc9ZnVuY3Rpb24gZSh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmIm51bWJlciIhPXR5cGVvZiB0Lm5vZGVUeXBlfSx5PWZ1bmN0aW9uIGUodCl7cmV0dXJuIG51bGwhPXQmJnQ9PT10LndpbmRvd30sdj17dHlwZTohMCxzcmM6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIG0oZSx0LG4pe3ZhciBpLG89KHQ9dHx8cikuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoby50ZXh0PWUsbilmb3IoaSBpbiB2KW5baV0mJihvW2ldPW5baV0pO3QuaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2xbYy5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9dmFyIGI9IjMuMy4xIix3PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyB3LmZuLmluaXQoZSx0KX0sVD0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7dy5mbj13LnByb3RvdHlwZT17anF1ZXJ5OiIzLjMuMSIsY29uc3RydWN0b3I6dyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIG8uY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP28uY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHR9LGVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcubWFwKHRoaXMsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHQsbix0KX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soby5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKyhlPDA/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobj49MCYmbjx0P1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpzLHNvcnQ6bi5zb3J0LHNwbGljZTpuLnNwbGljZX0sdy5leHRlbmQ9dy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8sYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGw9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fGcoYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKW49YVt0XSxhIT09KHI9ZVt0XSkmJihsJiZyJiYody5pc1BsYWluT2JqZWN0KHIpfHwoaT1BcnJheS5pc0FycmF5KHIpKSk/KGk/KGk9ITEsbz1uJiZBcnJheS5pc0FycmF5KG4pP246W10pOm89biYmdy5pc1BsYWluT2JqZWN0KG4pP246e30sYVt0XT13LmV4dGVuZChsLG8scikpOnZvaWQgMCE9PXImJihhW3RdPXIpKTtyZXR1cm4gYX0sdy5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKCIzLjMuMSIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4hKCFlfHwiW29iamVjdCBPYmplY3RdIiE9PWMuY2FsbChlKSkmJighKHQ9aShlKSl8fCJmdW5jdGlvbiI9PXR5cGVvZihuPWYuY2FsbCh0LCJjb25zdHJ1Y3RvciIpJiZ0LmNvbnN0cnVjdG9yKSYmcC5jYWxsKG4pPT09ZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbihlKXttKGUpfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2lmKEMoZSkpe2ZvcihuPWUubGVuZ3RoO3I8bjtyKyspaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrfWVsc2UgZm9yKHIgaW4gZSlpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWs7cmV0dXJuIGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6KGUrIiIpLnJlcGxhY2UoVCwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoQyhPYmplY3QoZSkpP3cubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOnMuY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTp1LmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0rdC5sZW5ndGgscj0wLGk9ZS5sZW5ndGg7cjxuO3IrKyllW2krK109dFtyXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIsaT1bXSxvPTAsYT1lLmxlbmd0aCxzPSFuO288YTtvKyspKHI9IXQoZVtvXSxvKSkhPT1zJiZpLnB1c2goZVtvXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPTAscz1bXTtpZihDKGUpKWZvcihyPWUubGVuZ3RoO288cjtvKyspbnVsbCE9KGk9dChlW29dLG8sbikpJiZzLnB1c2goaSk7ZWxzZSBmb3IobyBpbiBlKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmcy5wdXNoKGkpO3JldHVybiBhLmFwcGx5KFtdLHMpfSxndWlkOjEsc3VwcG9ydDpofSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKHcuZm5bU3ltYm9sLml0ZXJhdG9yXT1uW1N5bWJvbC5pdGVyYXRvcl0pLHcuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtsWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIEMoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49eChlKTtyZXR1cm4hZyhlKSYmIXkoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmdD4wJiZ0LTEgaW4gZSl9dmFyIEU9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHMsdSxsLGMsZixwLGQsaCxnLHksdixtLHgsYj0ic2l6emxlIisxKm5ldyBEYXRlLHc9ZS5kb2N1bWVudCxUPTAsQz0wLEU9YWUoKSxrPWFlKCksUz1hZSgpLEQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihmPSEwKSwwfSxOPXt9Lmhhc093blByb3BlcnR5LEE9W10saj1BLnBvcCxxPUEucHVzaCxMPUEucHVzaCxIPUEuc2xpY2UsTz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX0sUD0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLFI9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixJPSJcXFsiK00rIiooIitSKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrUisiKSl8KSIrTSsiKlxcXSIsVz0iOigiK1IrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK0krIikqKXwuKilcXCl8KSIsJD1uZXcgUmVnRXhwKE0rIisiLCJnIiksQj1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLEY9bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSxfPW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksej1uZXcgUmVnRXhwKCI9IitNKyIqKFteXFxdJ1wiXSo/KSIrTSsiKlxcXSIsImciKSxYPW5ldyBSZWdFeHAoVyksVT1uZXcgUmVnRXhwKCJeIitSKyIkIiksVj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitSKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK1IrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK1IrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitJKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrVyksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitNKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitNKyIqKD86KFsrLV18KSIrTSsiKihcXGQrKXwpKSIrTSsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrUCsiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK00rIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrTSsiKigoPzotXFxkKT9cXGQqKSIrTSsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sRz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFk9L15oXGQkL2ksUT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sSj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLEs9L1srfl0vLFo9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitNKyI/fCgiK00rIil8LikiLCJpZyIpLGVlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iMHgiK3QtNjU1MzY7cmV0dXJuIHIhPT1yfHxuP3Q6cjwwP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShyPj4xMHw1NTI5NiwxMDIzJnJ8NTYzMjApfSx0ZT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxuZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PyJcMCI9PT1lPyJcdWZmZmQiOmUuc2xpY2UoMCwtMSkrIlxcIitlLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2V9LHJlPWZ1bmN0aW9uKCl7cCgpfSxpZT1tZShmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJigiZm9ybSJpbiBlfHwibGFiZWwiaW4gZSl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7TC5hcHBseShBPUguY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksQVt3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtMPXthcHBseTpBLmxlbmd0aD9mdW5jdGlvbihlLHQpe3EuYXBwbHkoZSxILmNhbGwodCkpfTpmdW5jdGlvbihlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDt3aGlsZShlW24rK109dFtyKytdKTtlLmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBvZShlLHQscixpKXt2YXIgbyxzLGwsYyxmLGgsdixtPXQmJnQub3duZXJEb2N1bWVudCxUPXQ/dC5ub2RlVHlwZTo5O2lmKHI9cnx8W10sInN0cmluZyIhPXR5cGVvZiBlfHwhZXx8MSE9PVQmJjkhPT1UJiYxMSE9PVQpcmV0dXJuIHI7aWYoIWkmJigodD90Lm93bmVyRG9jdW1lbnR8fHQ6dykhPT1kJiZwKHQpLHQ9dHx8ZCxnKSl7aWYoMTEhPT1UJiYoZj1KLmV4ZWMoZSkpKWlmKG89ZlsxXSl7aWYoOT09PVQpe2lmKCEobD10LmdldEVsZW1lbnRCeUlkKG8pKSlyZXR1cm4gcjtpZihsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZSBpZihtJiYobD1tLmdldEVsZW1lbnRCeUlkKG8pKSYmeCh0LGwpJiZsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZXtpZihmWzJdKXJldHVybiBMLmFwcGx5KHIsdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkscjtpZigobz1mWzNdKSYmbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZ0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEwuYXBwbHkocix0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobykpLHJ9aWYobi5xc2EmJiFTW2UrIiAiXSYmKCF5fHwheS50ZXN0KGUpKSl7aWYoMSE9PVQpbT10LHY9ZTtlbHNlIGlmKCJvYmplY3QiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXsoYz10LmdldEF0dHJpYnV0ZSgiaWQiKSk/Yz1jLnJlcGxhY2UodGUsbmUpOnQuc2V0QXR0cmlidXRlKCJpZCIsYz1iKSxzPShoPWEoZSkpLmxlbmd0aDt3aGlsZShzLS0paFtzXT0iIyIrYysiICIrdmUoaFtzXSk7dj1oLmpvaW4oIiwiKSxtPUsudGVzdChlKSYmZ2UodC5wYXJlbnROb2RlKXx8dH1pZih2KXRyeXtyZXR1cm4gTC5hcHBseShyLG0ucXVlcnlTZWxlY3RvckFsbCh2KSkscn1jYXRjaChlKXt9ZmluYWxseXtjPT09YiYmdC5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gdShlLnJlcGxhY2UoQiwiJDEiKSx0LHIsaSl9ZnVuY3Rpb24gYWUoKXt2YXIgZT1bXTtmdW5jdGlvbiB0KG4saSl7cmV0dXJuIGUucHVzaChuKyIgIik+ci5jYWNoZUxlbmd0aCYmZGVsZXRlIHRbZS5zaGlmdCgpXSx0W24rIiAiXT1pfXJldHVybiB0fWZ1bmN0aW9uIHNlKGUpe3JldHVybiBlW2JdPSEwLGV9ZnVuY3Rpb24gdWUoZSl7dmFyIHQ9ZC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGxlKGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLGk9bi5sZW5ndGg7d2hpbGUoaS0tKXIuYXR0ckhhbmRsZVtuW2ldXT10fWZ1bmN0aW9uIGNlKGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBmZShlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gcGUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PW58fCJidXR0b24iPT09bikmJnQudHlwZT09PWV9fWZ1bmN0aW9uIGRlKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4iZm9ybSJpbiB0P3QucGFyZW50Tm9kZSYmITE9PT10LmRpc2FibGVkPyJsYWJlbCJpbiB0PyJsYWJlbCJpbiB0LnBhcmVudE5vZGU/dC5wYXJlbnROb2RlLmRpc2FibGVkPT09ZTp0LmRpc2FibGVkPT09ZTp0LmlzRGlzYWJsZWQ9PT1lfHx0LmlzRGlzYWJsZWQhPT0hZSYmaWUodCk9PT1lOnQuZGlzYWJsZWQ9PT1lOiJsYWJlbCJpbiB0JiZ0LmRpc2FibGVkPT09ZX19ZnVuY3Rpb24gaGUoZSl7cmV0dXJuIHNlKGZ1bmN0aW9uKHQpe3JldHVybiB0PSt0LHNlKGZ1bmN0aW9uKG4scil7dmFyIGksbz1lKFtdLG4ubGVuZ3RoLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKW5baT1vW2FdXSYmKG5baV09IShyW2ldPW5baV0pKX0pfSl9ZnVuY3Rpb24gZ2UoZSl7cmV0dXJuIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1uPW9lLnN1cHBvcnQ9e30sbz1vZS5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuISF0JiYiSFRNTCIhPT10Lm5vZGVOYW1lfSxwPW9lLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0LGksYT1lP2Uub3duZXJEb2N1bWVudHx8ZTp3O3JldHVybiBhIT09ZCYmOT09PWEubm9kZVR5cGUmJmEuZG9jdW1lbnRFbGVtZW50PyhkPWEsaD1kLmRvY3VtZW50RWxlbWVudCxnPSFvKGQpLHchPT1kJiYoaT1kLmRlZmF1bHRWaWV3KSYmaS50b3AhPT1pJiYoaS5hZGRFdmVudExpc3RlbmVyP2kuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixyZSwhMSk6aS5hdHRhY2hFdmVudCYmaS5hdHRhY2hFdmVudCgib251bmxvYWQiLHJlKSksbi5hdHRyaWJ1dGVzPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsYXNzTmFtZT0iaSIsIWUuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLG4uZ2V0RWxlbWVudHNCeVRhZ05hbWU9dWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXBwZW5kQ2hpbGQoZC5jcmVhdGVDb21tZW50KCIiKSksIWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxuLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9US50ZXN0KGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksbi5nZXRCeUlkPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBoLmFwcGVuZENoaWxkKGUpLmlkPWIsIWQuZ2V0RWxlbWVudHNCeU5hbWV8fCFkLmdldEVsZW1lbnRzQnlOYW1lKGIpLmxlbmd0aH0pLG4uZ2V0QnlJZD8oci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0sci5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09dH19LHIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG4scixpLG89dC5nZXRFbGVtZW50QnlJZChlKTtpZihvKXtpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb119cmV0dXJuW119fSksci5maW5kLlRBRz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6bi5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sci5maW5kLkNMQVNTPW4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZylyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfSx2PVtdLHk9W10sKG4ucXNhPVEudGVzdChkLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKHVlKGZ1bmN0aW9uKGUpe2guYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitiKyInPjwvYT48c2VsZWN0IGlkPSciK2IrIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmeS5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8eS5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK1ArIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitiKyItXSIpLmxlbmd0aHx8eS5wdXNoKCJ+PSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHkucHVzaCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitiKyIrKiIpLmxlbmd0aHx8eS5wdXNoKCIuIy4rWyt+XSIpfSksdWUoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIHQ9ZC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3Quc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmeS5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ5LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksaC5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnkucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx5LnB1c2goIiwuKjoiKX0pKSwobi5tYXRjaGVzU2VsZWN0b3I9US50ZXN0KG09aC5tYXRjaGVzfHxoLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8aC5tb3pNYXRjaGVzU2VsZWN0b3J8fGgub01hdGNoZXNTZWxlY3Rvcnx8aC5tc01hdGNoZXNTZWxlY3RvcikpJiZ1ZShmdW5jdGlvbihlKXtuLmRpc2Nvbm5lY3RlZE1hdGNoPW0uY2FsbChlLCIqIiksbS5jYWxsKGUsIltzIT0nJ106eCIpLHYucHVzaCgiIT0iLFcpfSkseT15Lmxlbmd0aCYmbmV3IFJlZ0V4cCh5LmpvaW4oInwiKSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSksdD1RLnRlc3QoaC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikseD10fHxRLnRlc3QoaC5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxEPXQ/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gZj0hMCwwO3ZhciByPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiByfHwoMSYocj0oZS5vd25lckRvY3VtZW50fHxlKT09PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSl8fCFuLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PXI/ZT09PWR8fGUub3duZXJEb2N1bWVudD09PXcmJngodyxlKT8tMTp0PT09ZHx8dC5vd25lckRvY3VtZW50PT09dyYmeCh3LHQpPzE6Yz9PKGMsZSktTyhjLHQpOjA6NCZyPy0xOjEpfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBmPSEwLDA7dmFyIG4scj0wLGk9ZS5wYXJlbnROb2RlLG89dC5wYXJlbnROb2RlLGE9W2VdLHM9W3RdO2lmKCFpfHwhbylyZXR1cm4gZT09PWQ/LTE6dD09PWQ/MTppPy0xOm8/MTpjP08oYyxlKS1PKGMsdCk6MDtpZihpPT09bylyZXR1cm4gY2UoZSx0KTtuPWU7d2hpbGUobj1uLnBhcmVudE5vZGUpYS51bnNoaWZ0KG4pO249dDt3aGlsZShuPW4ucGFyZW50Tm9kZSlzLnVuc2hpZnQobik7d2hpbGUoYVtyXT09PXNbcl0pcisrO3JldHVybiByP2NlKGFbcl0sc1tyXSk6YVtyXT09PXc/LTE6c1tyXT09PXc/MTowfSxkKTpkfSxvZS5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG9lKGUsbnVsbCxudWxsLHQpfSxvZS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSx0KXtpZigoZS5vd25lckRvY3VtZW50fHxlKSE9PWQmJnAoZSksdD10LnJlcGxhY2UoeiwiPSckMSddIiksbi5tYXRjaGVzU2VsZWN0b3ImJmcmJiFTW3QrIiAiXSYmKCF2fHwhdi50ZXN0KHQpKSYmKCF5fHwheS50ZXN0KHQpKSl0cnl7dmFyIHI9bS5jYWxsKGUsdCk7aWYocnx8bi5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiByfWNhdGNoKGUpe31yZXR1cm4gb2UodCxkLG51bGwsW2VdKS5sZW5ndGg+MH0sb2UuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS5vd25lckRvY3VtZW50fHxlKSE9PWQmJnAoZSkseChlLHQpfSxvZS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPT1kJiZwKGUpO3ZhciBpPXIuYXR0ckhhbmRsZVt0LnRvTG93ZXJDYXNlKCldLG89aSYmTi5jYWxsKHIuYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP2koZSx0LCFnKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PW8/bzpuLmF0dHJpYnV0ZXN8fCFnP2UuZ2V0QXR0cmlidXRlKHQpOihvPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJm8uc3BlY2lmaWVkP28udmFsdWU6bnVsbH0sb2UuZXNjYXBlPWZ1bmN0aW9uKGUpe3JldHVybihlKyIiKS5yZXBsYWNlKHRlLG5lKX0sb2UuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSxvZS51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LHI9W10saT0wLG89MDtpZihmPSFuLmRldGVjdER1cGxpY2F0ZXMsYz0hbi5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydChEKSxmKXt3aGlsZSh0PWVbbysrXSl0PT09ZVtvXSYmKGk9ci5wdXNoKG8pKTt3aGlsZShpLS0pZS5zcGxpY2UocltpXSwxKX1yZXR1cm4gYz1udWxsLGV9LGk9b2UuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9MCxvPWUubm9kZVR5cGU7aWYobyl7aWYoMT09PW98fDk9PT1vfHwxMT09PW8pe2lmKCJzdHJpbmciPT10eXBlb2YgZS50ZXh0Q29udGVudClyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9aShlKX1lbHNlIGlmKDM9PT1vfHw0PT09bylyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSB3aGlsZSh0PWVbcisrXSluKz1pKHQpO3JldHVybiBufSwocj1vZS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpzZSxtYXRjaDpWLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnJlcGxhY2UoWixlZSksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UoWixlZSksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fG9lLmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJm9lLmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzZdJiZlWzJdO3JldHVybiBWLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXT9lWzJdPWVbNF18fGVbNV18fCIiOm4mJlgudGVzdChuKSYmKHQ9YShuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoWixlZSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9RVtlKyIgIl07cmV0dXJuIHR8fCh0PW5ldyBSZWdFeHAoIihefCIrTSsiKSIrZSsiKCIrTSsifCQpIikpJiZFKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdCgic3RyaW5nIj09dHlwZW9mIGUuY2xhc3NOYW1lJiZlLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIGk9b2UuYXR0cihyLGUpO3JldHVybiBudWxsPT1pPyIhPSI9PT10OiF0fHwoaSs9IiIsIj0iPT09dD9pPT09bjoiIT0iPT09dD9pIT09bjoiXj0iPT09dD9uJiYwPT09aS5pbmRleE9mKG4pOiIqPSI9PT10P24mJmkuaW5kZXhPZihuKT4tMToiJD0iPT09dD9uJiZpLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT10PygiICIraS5yZXBsYWNlKCQsIiAiKSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PXQmJihpPT09bnx8aS5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSIpKX19LENISUxEOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89Im50aCIhPT1lLnNsaWNlKDAsMyksYT0ibGFzdCIhPT1lLnNsaWNlKC00KSxzPSJvZi10eXBlIj09PXQ7cmV0dXJuIDE9PT1yJiYwPT09aT9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24odCxuLHUpe3ZhciBsLGMsZixwLGQsaCxnPW8hPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIseT10LnBhcmVudE5vZGUsdj1zJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbT0hdSYmIXMseD0hMTtpZih5KXtpZihvKXt3aGlsZShnKXtwPXQ7d2hpbGUocD1wW2ddKWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09djoxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtoPWc9Im9ubHkiPT09ZSYmIWgmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoaD1bYT95LmZpcnN0Q2hpbGQ6eS5sYXN0Q2hpbGRdLGEmJm0pe3g9KGQ9KGw9KGM9KGY9KHA9eSlbYl18fChwW2JdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbZV18fFtdKVswXT09PVQmJmxbMV0pJiZsWzJdLHA9ZCYmeS5jaGlsZE5vZGVzW2RdO3doaWxlKHA9KytkJiZwJiZwW2ddfHwoeD1kPTApfHxoLnBvcCgpKWlmKDE9PT1wLm5vZGVUeXBlJiYrK3gmJnA9PT10KXtjW2VdPVtULGQseF07YnJlYWt9fWVsc2UgaWYobSYmKHg9ZD0obD0oYz0oZj0ocD10KVtiXXx8KHBbYl09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVtlXXx8W10pWzBdPT09VCYmbFsxXSksITE9PT14KXdoaWxlKHA9KytkJiZwJiZwW2ddfHwoeD1kPTApfHxoLnBvcCgpKWlmKChzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXY6MT09PXAubm9kZVR5cGUpJiYrK3gmJihtJiYoKGM9KGY9cFtiXXx8KHBbYl09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVtlXT1bVCx4XSkscD09PXQpKWJyZWFrO3JldHVybih4LT1pKT09PXJ8fHglcj09MCYmeC9yPj0wfX19LFBTRVVETzpmdW5jdGlvbihlLHQpe3ZhciBuLGk9ci5wc2V1ZG9zW2VdfHxyLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8b2UuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIitlKTtyZXR1cm4gaVtiXT9pKHQpOmkubGVuZ3RoPjE/KG49W2UsZSwiIix0XSxyLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT9zZShmdW5jdGlvbihlLG4pe3ZhciByLG89aShlLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKWVbcj1PKGUsb1thXSldPSEobltyXT1vW2FdKX0pOmZ1bmN0aW9uKGUpe3JldHVybiBpKGUsMCxuKX0pOml9fSxwc2V1ZG9zOntub3Q6c2UoZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1bXSxyPXMoZS5yZXBsYWNlKEIsIiQxIikpO3JldHVybiByW2JdP3NlKGZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLGE9cihlLG51bGwsaSxbXSkscz1lLmxlbmd0aDt3aGlsZShzLS0pKG89YVtzXSkmJihlW3NdPSEodFtzXT1vKSl9KTpmdW5jdGlvbihlLGksbyl7cmV0dXJuIHRbMF09ZSxyKHQsbnVsbCxvLG4pLHRbMF09bnVsbCwhbi5wb3AoKX19KSxoYXM6c2UoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBvZShlLHQpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOnNlKGZ1bmN0aW9uKGUpe3JldHVybiBlPWUucmVwbGFjZShaLGVlKSxmdW5jdGlvbih0KXtyZXR1cm4odC50ZXh0Q29udGVudHx8dC5pbm5lclRleHR8fGkodCkpLmluZGV4T2YoZSk+LTF9fSksbGFuZzpzZShmdW5jdGlvbihlKXtyZXR1cm4gVS50ZXN0KGV8fCIiKXx8b2UuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrZSksZT1lLnJlcGxhY2UoWixlZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXt2YXIgbjtkb3tpZihuPWc/dC5sYW5nOnQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHx0LmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybihuPW4udG9Mb3dlckNhc2UoKSk9PT1lfHwwPT09bi5pbmRleE9mKGUrIi0iKX13aGlsZSgodD10LnBhcmVudE5vZGUpJiYxPT09dC5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKHQpe3ZhciBuPWUubG9jYXRpb24mJmUubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PXQuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1ofSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWQuYWN0aXZlRWxlbWVudCYmKCFkLmhhc0ZvY3VzfHxkLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmRlKCExKSxkaXNhYmxlZDpkZSghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIXIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBZLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBHLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PXQudG9Mb3dlckNhc2UoKSl9LGZpcnN0OmhlKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpoZShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6aGUoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjpoZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpoZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OmhlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOy0tcj49MDspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6aGUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0pLnBzZXVkb3MubnRoPXIucHNldWRvcy5lcTtmb3IodCBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlyLnBzZXVkb3NbdF09ZmUodCk7Zm9yKHQgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlyLnBzZXVkb3NbdF09cGUodCk7ZnVuY3Rpb24geWUoKXt9eWUucHJvdG90eXBlPXIuZmlsdGVycz1yLnBzZXVkb3Msci5zZXRGaWx0ZXJzPW5ldyB5ZSxhPW9lLnRva2VuaXplPWZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLGEscyx1LGwsYz1rW2UrIiAiXTtpZihjKXJldHVybiB0PzA6Yy5zbGljZSgwKTtzPWUsdT1bXSxsPXIucHJlRmlsdGVyO3doaWxlKHMpe24mJiEoaT1GLmV4ZWMocykpfHwoaSYmKHM9cy5zbGljZShpWzBdLmxlbmd0aCl8fHMpLHUucHVzaChvPVtdKSksbj0hMSwoaT1fLmV4ZWMocykpJiYobj1pLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6aVswXS5yZXBsYWNlKEIsIiAiKX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2ZvcihhIGluIHIuZmlsdGVyKSEoaT1WW2FdLmV4ZWMocykpfHxsW2FdJiYhKGk9bFthXShpKSl8fChuPWkuc2hpZnQoKSxvLnB1c2goe3ZhbHVlOm4sdHlwZTphLG1hdGNoZXM6aX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P3MubGVuZ3RoOnM/b2UuZXJyb3IoZSk6ayhlLHUpLnNsaWNlKDApfTtmdW5jdGlvbiB2ZShlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoLHI9IiI7dDxuO3QrKylyKz1lW3RdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIG1lKGUsdCxuKXt2YXIgcj10LmRpcixpPXQubmV4dCxvPWl8fHIsYT1uJiYicGFyZW50Tm9kZSI9PT1vLHM9QysrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixpKXt3aGlsZSh0PXRbcl0paWYoMT09PXQubm9kZVR5cGV8fGEpcmV0dXJuIGUodCxuLGkpO3JldHVybiExfTpmdW5jdGlvbih0LG4sdSl7dmFyIGwsYyxmLHA9W1Qsc107aWYodSl7d2hpbGUodD10W3JdKWlmKCgxPT09dC5ub2RlVHlwZXx8YSkmJmUodCxuLHUpKXJldHVybiEwfWVsc2Ugd2hpbGUodD10W3JdKWlmKDE9PT10Lm5vZGVUeXBlfHxhKWlmKGY9dFtiXXx8KHRbYl09e30pLGM9Zlt0LnVuaXF1ZUlEXXx8KGZbdC51bmlxdWVJRF09e30pLGkmJmk9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpdD10W3JdfHx0O2Vsc2V7aWYoKGw9Y1tvXSkmJmxbMF09PT1UJiZsWzFdPT09cylyZXR1cm4gcFsyXT1sWzJdO2lmKGNbb109cCxwWzJdPWUodCxuLHUpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB4ZShlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5jdGlvbih0LG4scil7dmFyIGk9ZS5sZW5ndGg7d2hpbGUoaS0tKWlmKCFlW2ldKHQsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06ZVswXX1mdW5jdGlvbiBiZShlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKW9lKGUsdFtyXSxuKTtyZXR1cm4gbn1mdW5jdGlvbiB3ZShlLHQsbixyLGkpe2Zvcih2YXIgbyxhPVtdLHM9MCx1PWUubGVuZ3RoLGw9bnVsbCE9dDtzPHU7cysrKShvPWVbc10pJiYobiYmIW4obyxyLGkpfHwoYS5wdXNoKG8pLGwmJnQucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIFRlKGUsdCxuLHIsaSxvKXtyZXR1cm4gciYmIXJbYl0mJihyPVRlKHIpKSxpJiYhaVtiXSYmKGk9VGUoaSxvKSksc2UoZnVuY3Rpb24obyxhLHMsdSl7dmFyIGwsYyxmLHA9W10sZD1bXSxoPWEubGVuZ3RoLGc9b3x8YmUodHx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLHk9IWV8fCFvJiZ0P2c6d2UoZyxwLGUscyx1KSx2PW4/aXx8KG8/ZTpofHxyKT9bXTphOnk7aWYobiYmbih5LHYscyx1KSxyKXtsPXdlKHYsZCkscihsLFtdLHMsdSksYz1sLmxlbmd0aDt3aGlsZShjLS0pKGY9bFtjXSkmJih2W2RbY11dPSEoeVtkW2NdXT1mKSl9aWYobyl7aWYoaXx8ZSl7aWYoaSl7bD1bXSxjPXYubGVuZ3RoO3doaWxlKGMtLSkoZj12W2NdKSYmbC5wdXNoKHlbY109Zik7aShudWxsLHY9W10sbCx1KX1jPXYubGVuZ3RoO3doaWxlKGMtLSkoZj12W2NdKSYmKGw9aT9PKG8sZik6cFtjXSk+LTEmJihvW2xdPSEoYVtsXT1mKSl9fWVsc2Ugdj13ZSh2PT09YT92LnNwbGljZShoLHYubGVuZ3RoKTp2KSxpP2kobnVsbCxhLHYsdSk6TC5hcHBseShhLHYpfSl9ZnVuY3Rpb24gQ2UoZSl7Zm9yKHZhciB0LG4saSxvPWUubGVuZ3RoLGE9ci5yZWxhdGl2ZVtlWzBdLnR5cGVdLHM9YXx8ci5yZWxhdGl2ZVsiICJdLHU9YT8xOjAsYz1tZShmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9LHMsITApLGY9bWUoZnVuY3Rpb24oZSl7cmV0dXJuIE8odCxlKT4tMX0scywhMCkscD1bZnVuY3Rpb24oZSxuLHIpe3ZhciBpPSFhJiYocnx8biE9PWwpfHwoKHQ9bikubm9kZVR5cGU/YyhlLG4scik6ZihlLG4scikpO3JldHVybiB0PW51bGwsaX1dO3U8bzt1KyspaWYobj1yLnJlbGF0aXZlW2VbdV0udHlwZV0pcD1bbWUoeGUocCksbildO2Vsc2V7aWYoKG49ci5maWx0ZXJbZVt1XS50eXBlXS5hcHBseShudWxsLGVbdV0ubWF0Y2hlcykpW2JdKXtmb3IoaT0rK3U7aTxvO2krKylpZihyLnJlbGF0aXZlW2VbaV0udHlwZV0pYnJlYWs7cmV0dXJuIFRlKHU+MSYmeGUocCksdT4xJiZ2ZShlLnNsaWNlKDAsdS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbdS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKEIsIiQxIiksbix1PGkmJkNlKGUuc2xpY2UodSxpKSksaTxvJiZDZShlPWUuc2xpY2UoaSkpLGk8byYmdmUoZSkpfXAucHVzaChuKX1yZXR1cm4geGUocCl9ZnVuY3Rpb24gRWUoZSx0KXt2YXIgbj10Lmxlbmd0aD4wLGk9ZS5sZW5ndGg+MCxvPWZ1bmN0aW9uKG8sYSxzLHUsYyl7dmFyIGYsaCx5LHY9MCxtPSIwIix4PW8mJltdLGI9W10sdz1sLEM9b3x8aSYmci5maW5kLlRBRygiKiIsYyksRT1UKz1udWxsPT13PzE6TWF0aC5yYW5kb20oKXx8LjEsaz1DLmxlbmd0aDtmb3IoYyYmKGw9YT09PWR8fGF8fGMpO20hPT1rJiZudWxsIT0oZj1DW21dKTttKyspe2lmKGkmJmYpe2g9MCxhfHxmLm93bmVyRG9jdW1lbnQ9PT1kfHwocChmKSxzPSFnKTt3aGlsZSh5PWVbaCsrXSlpZih5KGYsYXx8ZCxzKSl7dS5wdXNoKGYpO2JyZWFrfWMmJihUPUUpfW4mJigoZj0heSYmZikmJnYtLSxvJiZ4LnB1c2goZikpfWlmKHYrPW0sbiYmbSE9PXYpe2g9MDt3aGlsZSh5PXRbaCsrXSl5KHgsYixhLHMpO2lmKG8pe2lmKHY+MCl3aGlsZShtLS0peFttXXx8YlttXXx8KGJbbV09ai5jYWxsKHUpKTtiPXdlKGIpfUwuYXBwbHkodSxiKSxjJiYhbyYmYi5sZW5ndGg+MCYmdit0Lmxlbmd0aD4xJiZvZS51bmlxdWVTb3J0KHUpfXJldHVybiBjJiYoVD1FLGw9dykseH07cmV0dXJuIG4/c2Uobyk6b31yZXR1cm4gcz1vZS5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPVtdLG89U1tlKyIgIl07aWYoIW8pe3R8fCh0PWEoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKShvPUNlKHRbbl0pKVtiXT9yLnB1c2gobyk6aS5wdXNoKG8pOyhvPVMoZSxFZShpLHIpKSkuc2VsZWN0b3I9ZX1yZXR1cm4gb30sdT1vZS5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4saSl7dmFyIG8sdSxsLGMsZixwPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLGQ9IWkmJmEoZT1wLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1kLmxlbmd0aCl7aWYoKHU9ZFswXT1kWzBdLnNsaWNlKDApKS5sZW5ndGg+MiYmIklEIj09PShsPXVbMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZnJiZyLnJlbGF0aXZlW3VbMV0udHlwZV0pe2lmKCEodD0oci5maW5kLklEKGwubWF0Y2hlc1swXS5yZXBsYWNlKFosZWUpLHQpfHxbXSlbMF0pKXJldHVybiBuO3AmJih0PXQucGFyZW50Tm9kZSksZT1lLnNsaWNlKHUuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfW89Vi5uZWVkc0NvbnRleHQudGVzdChlKT8wOnUubGVuZ3RoO3doaWxlKG8tLSl7aWYobD11W29dLHIucmVsYXRpdmVbYz1sLnR5cGVdKWJyZWFrO2lmKChmPXIuZmluZFtjXSkmJihpPWYobC5tYXRjaGVzWzBdLnJlcGxhY2UoWixlZSksSy50ZXN0KHVbMF0udHlwZSkmJmdlKHQucGFyZW50Tm9kZSl8fHQpKSl7aWYodS5zcGxpY2UobywxKSwhKGU9aS5sZW5ndGgmJnZlKHUpKSlyZXR1cm4gTC5hcHBseShuLGkpLG47YnJlYWt9fX1yZXR1cm4ocHx8cyhlLGQpKShpLHQsIWcsbiwhdHx8Sy50ZXN0KGUpJiZnZSh0LnBhcmVudE5vZGUpfHx0KSxufSxuLnNvcnRTdGFibGU9Yi5zcGxpdCgiIikuc29ydChEKS5qb2luKCIiKT09PWIsbi5kZXRlY3REdXBsaWNhdGVzPSEhZixwKCksbi5zb3J0RGV0YWNoZWQ9dWUoZnVuY3Rpb24oZSl7cmV0dXJuIDEmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksdWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8bGUoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGUsdCxuKXtpZighbilyZXR1cm4gZS5nZXRBdHRyaWJ1dGUodCwidHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/MToyKX0pLG4uYXR0cmlidXRlcyYmdWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8aW5wdXQvPiIsZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8bGUoInZhbHVlIixmdW5jdGlvbihlLHQsbil7aWYoIW4mJiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGUuZGVmYXVsdFZhbHVlfSksdWUoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGxlKFAsZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKCFuKXJldHVybiEwPT09ZVt0XT90LnRvTG93ZXJDYXNlKCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSksb2V9KGUpO3cuZmluZD1FLHcuZXhwcj1FLnNlbGVjdG9ycyx3LmV4cHJbIjoiXT13LmV4cHIucHNldWRvcyx3LnVuaXF1ZVNvcnQ9dy51bmlxdWU9RS51bmlxdWVTb3J0LHcudGV4dD1FLmdldFRleHQsdy5pc1hNTERvYz1FLmlzWE1MLHcuY29udGFpbnM9RS5jb250YWlucyx3LmVzY2FwZVNlbGVjdG9yPUUuZXNjYXBlO3ZhciBrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxpPXZvaWQgMCE9PW47d2hpbGUoKGU9ZVt0XSkmJjkhPT1lLm5vZGVUeXBlKWlmKDE9PT1lLm5vZGVUeXBlKXtpZihpJiZ3KGUpLmlzKG4pKWJyZWFrO3IucHVzaChlKX1yZXR1cm4gcn0sUz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXTtlO2U9ZS5uZXh0U2libGluZykxPT09ZS5ub2RlVHlwZSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn0sRD13LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O2Z1bmN0aW9uIE4oZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfXZhciBBPS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIGooZSx0LG4pe3JldHVybiBnKHQpP3cuZ3JlcChlLGZ1bmN0aW9uKGUscil7cmV0dXJuISF0LmNhbGwoZSxyLGUpIT09bn0pOnQubm9kZVR5cGU/dy5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10IT09bn0pOiJzdHJpbmciIT10eXBlb2YgdD93LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gdS5jYWxsKHQsZSk+LTEhPT1ufSk6dy5maWx0ZXIodCxlLG4pfXcuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP3cuZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106dy5maW5kLm1hdGNoZXMoZSx3LmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LHcuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayh3KGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7dDxyO3QrKylpZih3LmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKXcuZmluZChlLGlbdF0sbik7cmV0dXJuIHI+MT93LnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITApKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFqKHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZELnRlc3QoZSk/dyhlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBxLEw9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsody5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxvO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8cSwic3RyaW5nIj09dHlwZW9mIGUpe2lmKCEoaT0iPCI9PT1lWzBdJiYiPiI9PT1lW2UubGVuZ3RoLTFdJiZlLmxlbmd0aD49Mz9bbnVsbCxlLG51bGxdOkwuZXhlYyhlKSl8fCFpWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoaVsxXSl7aWYodD10IGluc3RhbmNlb2Ygdz90WzBdOnQsdy5tZXJnZSh0aGlzLHcucGFyc2VIVE1MKGlbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6ciwhMCkpLEEudGVzdChpWzFdKSYmdy5pc1BsYWluT2JqZWN0KHQpKWZvcihpIGluIHQpZyh0aGlzW2ldKT90aGlzW2ldKHRbaV0pOnRoaXMuYXR0cihpLHRbaV0pO3JldHVybiB0aGlzfXJldHVybihvPXIuZ2V0RWxlbWVudEJ5SWQoaVsyXSkpJiYodGhpc1swXT1vLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOmcoZSk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KGUpOmUodyk6dy5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT13LmZuLHE9dyhyKTt2YXIgSD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxPPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O3cuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9dyhlLHRoaXMpLG49dC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxuO2UrKylpZih3LmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT0ic3RyaW5nIiE9dHlwZW9mIGUmJncoZSk7aWYoIUQudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZ3LmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKG8ubGVuZ3RoPjE/dy51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/dS5jYWxsKHcoZSksdGhpc1swXSk6dS5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayh3LnVuaXF1ZVNvcnQody5tZXJnZSh0aGlzLmdldCgpLHcoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSk7ZnVuY3Rpb24gUChlLHQpe3doaWxlKChlPWVbdF0pJiYxIT09ZS5ub2RlVHlwZSk7cmV0dXJuIGV9dy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gayhlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gUChlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBQKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGsoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGsoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBrKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBTKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gUyhlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gTihlLCJpZnJhbWUiKT9lLmNvbnRlbnREb2N1bWVudDooTihlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLHcubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24obixyKXt2YXIgaT13Lm1hcCh0aGlzLHQsbik7cmV0dXJuIlVudGlsIiE9PWUuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihpPXcuZmlsdGVyKHIsaSkpLHRoaXMubGVuZ3RoPjEmJihPW2VdfHx3LnVuaXF1ZVNvcnQoaSksSC50ZXN0KGUpJiZpLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2soaSl9fSk7dmFyIE09L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBSKGUpe3ZhciB0PXt9O3JldHVybiB3LmVhY2goZS5tYXRjaChNKXx8W10sZnVuY3Rpb24oZSxuKXt0W25dPSEwfSksdH13LkNhbGxiYWNrcz1mdW5jdGlvbihlKXtlPSJzdHJpbmciPT10eXBlb2YgZT9SKGUpOncuZXh0ZW5kKHt9LGUpO3ZhciB0LG4scixpLG89W10sYT1bXSxzPS0xLHU9ZnVuY3Rpb24oKXtmb3IoaT1pfHxlLm9uY2Uscj10PSEwO2EubGVuZ3RoO3M9LTEpe249YS5zaGlmdCgpO3doaWxlKCsrczxvLmxlbmd0aCkhMT09PW9bc10uYXBwbHkoblswXSxuWzFdKSYmZS5zdG9wT25GYWxzZSYmKHM9by5sZW5ndGgsbj0hMSl9ZS5tZW1vcnl8fChuPSExKSx0PSExLGkmJihvPW4/W106IiIpfSxsPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG4mJiF0JiYocz1vLmxlbmd0aC0xLGEucHVzaChuKSksZnVuY3Rpb24gdChuKXt3LmVhY2gobixmdW5jdGlvbihuLHIpe2cocik/ZS51bmlxdWUmJmwuaGFzKHIpfHxvLnB1c2gocik6ciYmci5sZW5ndGgmJiJzdHJpbmciIT09eChyKSYmdChyKX0pfShhcmd1bWVudHMpLG4mJiF0JiZ1KCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB3LmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGUsdCl7dmFyIG47d2hpbGUoKG49dy5pbkFycmF5KHQsbyxuKSk+LTEpby5zcGxpY2UobiwxKSxuPD1zJiZzLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/dy5pbkFycmF5KGUsbyk+LTE6by5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG89W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gaT1hPVtdLG89bj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFvfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9YT1bXSxufHx0fHwobz1uPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWl9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsbil7cmV0dXJuIGl8fChuPVtlLChuPW58fFtdKS5zbGljZT9uLnNsaWNlKCk6bl0sYS5wdXNoKG4pLHR8fHUoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBsLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBsfTtmdW5jdGlvbiBJKGUpe3JldHVybiBlfWZ1bmN0aW9uIFcoZSl7dGhyb3cgZX1mdW5jdGlvbiAkKGUsdCxuLHIpe3ZhciBpO3RyeXtlJiZnKGk9ZS5wcm9taXNlKT9pLmNhbGwoZSkuZG9uZSh0KS5mYWlsKG4pOmUmJmcoaT1lLnRoZW4pP2kuY2FsbChlLHQsbik6dC5hcHBseSh2b2lkIDAsW2VdLnNsaWNlKHIpKX1jYXRjaChlKXtuLmFwcGx5KHZvaWQgMCxbZV0pfX13LmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24odCl7dmFyIG49W1sibm90aWZ5IiwicHJvZ3Jlc3MiLHcuQ2FsbGJhY2tzKCJtZW1vcnkiKSx3LkNhbGxiYWNrcygibWVtb3J5IiksMl0sWyJyZXNvbHZlIiwiZG9uZSIsdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMCwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLHI9InBlbmRpbmciLGk9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBvLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sImNhdGNoIjpmdW5jdGlvbihlKXtyZXR1cm4gaS50aGVuKG51bGwsZSl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7cmV0dXJuIHcuRGVmZXJyZWQoZnVuY3Rpb24odCl7dy5lYWNoKG4sZnVuY3Rpb24obixyKXt2YXIgaT1nKGVbcls0XV0pJiZlW3JbNF1dO29bclsxXV0oZnVuY3Rpb24oKXt2YXIgZT1pJiZpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlJiZnKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkucHJvZ3Jlc3ModC5ub3RpZnkpLmRvbmUodC5yZXNvbHZlKS5mYWlsKHQucmVqZWN0KTp0W3JbMF0rIldpdGgiXSh0aGlzLGk/W2VdOmFyZ3VtZW50cyl9KX0pLGU9bnVsbH0pLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbih0LHIsaSl7dmFyIG89MDtmdW5jdGlvbiBhKHQsbixyLGkpe3JldHVybiBmdW5jdGlvbigpe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMsbD1mdW5jdGlvbigpe3ZhciBlLGw7aWYoISh0PG8pKXtpZigoZT1yLmFwcGx5KHMsdSkpPT09bi5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7bD1lJiYoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJmUudGhlbixnKGwpP2k/bC5jYWxsKGUsYShvLG4sSSxpKSxhKG8sbixXLGkpKToobysrLGwuY2FsbChlLGEobyxuLEksaSksYShvLG4sVyxpKSxhKG8sbixJLG4ubm90aWZ5V2l0aCkpKToociE9PUkmJihzPXZvaWQgMCx1PVtlXSksKGl8fG4ucmVzb2x2ZVdpdGgpKHMsdSkpfX0sYz1pP2w6ZnVuY3Rpb24oKXt0cnl7bCgpfWNhdGNoKGUpe3cuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYmdy5EZWZlcnJlZC5leGNlcHRpb25Ib29rKGUsYy5zdGFja1RyYWNlKSx0KzE+PW8mJihyIT09VyYmKHM9dm9pZCAwLHU9W2VdKSxuLnJlamVjdFdpdGgocyx1KSl9fTt0P2MoKToody5EZWZlcnJlZC5nZXRTdGFja0hvb2smJihjLnN0YWNrVHJhY2U9dy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksZS5zZXRUaW1lb3V0KGMpKX19cmV0dXJuIHcuRGVmZXJyZWQoZnVuY3Rpb24oZSl7blswXVszXS5hZGQoYSgwLGUsZyhpKT9pOkksZS5ub3RpZnlXaXRoKSksblsxXVszXS5hZGQoYSgwLGUsZyh0KT90OkkpKSxuWzJdWzNdLmFkZChhKDAsZSxnKHIpP3I6VykpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lP3cuZXh0ZW5kKGUsaSk6aX19LG89e307cmV0dXJuIHcuZWFjaChuLGZ1bmN0aW9uKGUsdCl7dmFyIGE9dFsyXSxzPXRbNV07aVt0WzFdXT1hLmFkZCxzJiZhLmFkZChmdW5jdGlvbigpe3I9c30sblszLWVdWzJdLmRpc2FibGUsblszLWVdWzNdLmRpc2FibGUsblswXVsyXS5sb2NrLG5bMF1bM10ubG9jayksYS5hZGQodFszXS5maXJlKSxvW3RbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIG9bdFswXSsiV2l0aCJdKHRoaXM9PT1vP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sb1t0WzBdKyJXaXRoIl09YS5maXJlV2l0aH0pLGkucHJvbWlzZShvKSx0JiZ0LmNhbGwobyxvKSxvfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj10LHI9QXJyYXkobiksaT1vLmNhbGwoYXJndW1lbnRzKSxhPXcuRGVmZXJyZWQoKSxzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuKXtyW2VdPXRoaXMsaVtlXT1hcmd1bWVudHMubGVuZ3RoPjE/by5jYWxsKGFyZ3VtZW50cyk6biwtLXR8fGEucmVzb2x2ZVdpdGgocixpKX19O2lmKHQ8PTEmJigkKGUsYS5kb25lKHMobikpLnJlc29sdmUsYS5yZWplY3QsIXQpLCJwZW5kaW5nIj09PWEuc3RhdGUoKXx8ZyhpW25dJiZpW25dLnRoZW4pKSlyZXR1cm4gYS50aGVuKCk7d2hpbGUobi0tKSQoaVtuXSxzKG4pLGEucmVqZWN0KTtyZXR1cm4gYS5wcm9taXNlKCl9fSk7dmFyIEI9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87dy5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKHQsbil7ZS5jb25zb2xlJiZlLmNvbnNvbGUud2FybiYmdCYmQi50ZXN0KHQubmFtZSkmJmUuY29uc29sZS53YXJuKCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiAiK3QubWVzc2FnZSx0LnN0YWNrLG4pfSx3LnJlYWR5RXhjZXB0aW9uPWZ1bmN0aW9uKHQpe2Uuc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IHR9KX07dmFyIEY9dy5EZWZlcnJlZCgpO3cuZm4ucmVhZHk9ZnVuY3Rpb24oZSl7cmV0dXJuIEYudGhlbihlKVsiY2F0Y2giXShmdW5jdGlvbihlKXt3LnJlYWR5RXhjZXB0aW9uKGUpfSksdGhpc30sdy5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oZSl7KCEwPT09ZT8tLXcucmVhZHlXYWl0OncuaXNSZWFkeSl8fCh3LmlzUmVhZHk9ITAsITAhPT1lJiYtLXcucmVhZHlXYWl0PjB8fEYucmVzb2x2ZVdpdGgocixbd10pKX19KSx3LnJlYWR5LnRoZW49Ri50aGVuO2Z1bmN0aW9uIF8oKXtyLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLF8pLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsXyksdy5yZWFkeSgpfSJjb21wbGV0ZSI9PT1yLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PXIucmVhZHlTdGF0ZSYmIXIuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2Uuc2V0VGltZW91dCh3LnJlYWR5KTooci5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixfKSxlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLF8pKTt2YXIgej1mdW5jdGlvbihlLHQsbixyLGksbyxhKXt2YXIgcz0wLHU9ZS5sZW5ndGgsbD1udWxsPT1uO2lmKCJvYmplY3QiPT09eChuKSl7aT0hMDtmb3IocyBpbiBuKXooZSx0LHMsbltzXSwhMCxvLGEpfWVsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsZyhyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbCh3KGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LFg9L14tbXMtLyxVPS8tKFthLXpdKS9nO2Z1bmN0aW9uIFYoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIEcoZSl7cmV0dXJuIGUucmVwbGFjZShYLCJtcy0iKS5yZXBsYWNlKFUsVil9dmFyIFk9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBRKCl7dGhpcy5leHBhbmRvPXcuZXhwYW5kbytRLnVpZCsrfVEudWlkPTEsUS5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9e30sWShlKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdGhpcy5leHBhbmRvLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pKSksdH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMuY2FjaGUoZSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KWlbRyh0KV09bjtlbHNlIGZvcihyIGluIHQpaVtHKHIpXT10W3JdO3JldHVybiBpfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW0codCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJnZvaWQgMD09PW4/dGhpcy5nZXQoZSx0KToodGhpcy5zZXQoZSx0LG4pLHZvaWQgMCE9PW4/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09dCl7bj0odD1BcnJheS5pc0FycmF5KHQpP3QubWFwKEcpOih0PUcodCkpaW4gcj9bdF06dC5tYXRjaChNKXx8W10pLmxlbmd0aDt3aGlsZShuLS0pZGVsZXRlIHJbdFtuXV19KHZvaWQgMD09PXR8fHcuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIXcuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBKPW5ldyBRLEs9bmV3IFEsWj0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLGVlPS9bQS1aXS9nO2Z1bmN0aW9uIHRlKGUpe3JldHVybiJ0cnVlIj09PWV8fCJmYWxzZSIhPT1lJiYoIm51bGwiPT09ZT9udWxsOmU9PT0rZSsiIj8rZTpaLnRlc3QoZSk/SlNPTi5wYXJzZShlKTplKX1mdW5jdGlvbiBuZShlLHQsbil7dmFyIHI7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShlZSwiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49ZS5nZXRBdHRyaWJ1dGUocikpKXt0cnl7bj10ZShuKX1jYXRjaChlKXt9Sy5zZXQoZSx0LG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59dy5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIEsuaGFzRGF0YShlKXx8Si5oYXNEYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gSy5hY2Nlc3MoZSx0LG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7Sy5yZW1vdmUoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBKLmFjY2VzcyhlLHQsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7Si5yZW1vdmUoZSx0KX19KSx3LmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvPXRoaXNbMF0sYT1vJiZvLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09ZSl7aWYodGhpcy5sZW5ndGgmJihpPUsuZ2V0KG8pLDE9PT1vLm5vZGVUeXBlJiYhSi5nZXQobywiaGFzRGF0YUF0dHJzIikpKXtuPWEubGVuZ3RoO3doaWxlKG4tLSlhW25dJiYwPT09KHI9YVtuXS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpJiYocj1HKHIuc2xpY2UoNSkpLG5lKG8scixpW3JdKSk7Si5zZXQobywiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGl9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP3RoaXMuZWFjaChmdW5jdGlvbigpe0suc2V0KHRoaXMsZSl9KTp6KHRoaXMsZnVuY3Rpb24odCl7dmFyIG47aWYobyYmdm9pZCAwPT09dCl7aWYodm9pZCAwIT09KG49Sy5nZXQobyxlKSkpcmV0dXJuIG47aWYodm9pZCAwIT09KG49bmUobyxlKSkpcmV0dXJuIG59ZWxzZSB0aGlzLmVhY2goZnVuY3Rpb24oKXtLLnNldCh0aGlzLGUsdCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Sy5yZW1vdmUodGhpcyxlKX0pfX0pLHcuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoZSlyZXR1cm4gdD0odHx8ImZ4IikrInF1ZXVlIixyPUouZ2V0KGUsdCksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9Si5hY2Nlc3MoZSx0LHcubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKGUsdCl7dD10fHwiZngiO3ZhciBuPXcucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89dy5fcXVldWVIb29rcyhlLHQpLGE9ZnVuY3Rpb24oKXt3LmRlcXVldWUoZSx0KX07ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGEsbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gSi5nZXQoZSxuKXx8Si5hY2Nlc3MoZSxuLHtlbXB0eTp3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtKLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSx3LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPSJmeCIsbi0tKSxhcmd1bWVudHMubGVuZ3RoPG4/dy5xdWV1ZSh0aGlzWzBdLGUpOnZvaWQgMD09PXQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj13LnF1ZXVlKHRoaXMsZSx0KTt3Ll9xdWV1ZUhvb2tzKHRoaXMsZSksImZ4Ij09PWUmJiJpbnByb2dyZXNzIiE9PW5bMF0mJncuZGVxdWV1ZSh0aGlzLGUpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3cuZGVxdWV1ZSh0aGlzLGUpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTEsaT13LkRlZmVycmVkKCksbz10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8aS5yZXNvbHZlV2l0aChvLFtvXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHwiZngiO3doaWxlKGEtLSkobj1KLmdldChvW2FdLGUrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksaS5wcm9taXNlKHQpfX0pO3ZhciByZT0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxpZT1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrcmUrIikoW2EteiVdKikkIiwiaSIpLG9lPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sYWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmdy5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSkmJiJub25lIj09PXcuY3NzKGUsImRpc3BsYXkiKX0sc2U9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhPXt9O2ZvcihvIGluIHQpYVtvXT1lLnN0eWxlW29dLGUuc3R5bGVbb109dFtvXTtpPW4uYXBwbHkoZSxyfHxbXSk7Zm9yKG8gaW4gdCllLnN0eWxlW29dPWFbb107cmV0dXJuIGl9O2Z1bmN0aW9uIHVlKGUsdCxuLHIpe3ZhciBpLG8sYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gdy5jc3MoZSx0LCIiKX0sdT1zKCksbD1uJiZuWzNdfHwody5jc3NOdW1iZXJbdF0/IiI6InB4IiksYz0ody5jc3NOdW1iZXJbdF18fCJweCIhPT1sJiYrdSkmJmllLmV4ZWMody5jc3MoZSx0KSk7aWYoYyYmY1szXSE9PWwpe3UvPTIsbD1sfHxjWzNdLGM9K3V8fDE7d2hpbGUoYS0tKXcuc3R5bGUoZSx0LGMrbCksKDEtbykqKDEtKG89cygpL3V8fC41KSk8PTAmJihhPTApLGMvPW87Yyo9Mix3LnN0eWxlKGUsdCxjK2wpLG49bnx8W119cmV0dXJuIG4mJihjPStjfHwrdXx8MCxpPW5bMV0/YysoblsxXSsxKSpuWzJdOituWzJdLHImJihyLnVuaXQ9bCxyLnN0YXJ0PWMsci5lbmQ9aSkpLGl9dmFyIGxlPXt9O2Z1bmN0aW9uIGNlKGUpe3ZhciB0LG49ZS5vd25lckRvY3VtZW50LHI9ZS5ub2RlTmFtZSxpPWxlW3JdO3JldHVybiBpfHwodD1uLmJvZHkuYXBwZW5kQ2hpbGQobi5jcmVhdGVFbGVtZW50KHIpKSxpPXcuY3NzKHQsImRpc3BsYXkiKSx0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksIm5vbmUiPT09aSYmKGk9ImJsb2NrIiksbGVbcl09aSxpKX1mdW5jdGlvbiBmZShlLHQpe2Zvcih2YXIgbixyLGk9W10sbz0wLGE9ZS5sZW5ndGg7bzxhO28rKykocj1lW29dKS5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LHQ/KCJub25lIj09PW4mJihpW29dPUouZ2V0KHIsImRpc3BsYXkiKXx8bnVsbCxpW29dfHwoci5zdHlsZS5kaXNwbGF5PSIiKSksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJmFlKHIpJiYoaVtvXT1jZShyKSkpOiJub25lIiE9PW4mJihpW29dPSJub25lIixKLnNldChyLCJkaXNwbGF5IixuKSkpO2ZvcihvPTA7bzxhO28rKyludWxsIT1pW29dJiYoZVtvXS5zdHlsZS5kaXNwbGF5PWlbb10pO3JldHVybiBlfXcuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIGZlKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIGZlKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2FlKHRoaXMpP3codGhpcykuc2hvdygpOncodGhpcykuaGlkZSgpfSl9fSk7dmFyIHBlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLGRlPS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pLGhlPS9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxnZT17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2dlLm9wdGdyb3VwPWdlLm9wdGlvbixnZS50Ym9keT1nZS50Zm9vdD1nZS5jb2xncm91cD1nZS5jYXB0aW9uPWdlLnRoZWFkLGdlLnRoPWdlLnRkO2Z1bmN0aW9uIHllKGUsdCl7dmFyIG47cmV0dXJuIG49InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHx8IioiKToidW5kZWZpbmVkIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbD9lLnF1ZXJ5U2VsZWN0b3JBbGwodHx8IioiKTpbXSx2b2lkIDA9PT10fHx0JiZOKGUsdCk/dy5tZXJnZShbZV0sbik6bn1mdW5jdGlvbiB2ZShlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylKLnNldChlW25dLCJnbG9iYWxFdmFsIiwhdHx8Si5nZXQodFtuXSwiZ2xvYmFsRXZhbCIpKX12YXIgbWU9Lzx8JiM/XHcrOy87ZnVuY3Rpb24geGUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZigib2JqZWN0Ij09PXgobykpdy5tZXJnZShwLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYobWUudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KGRlLmV4ZWMobyl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1nZVtzXXx8Z2UuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXSt3Lmh0bWxQcmVmaWx0ZXIobykrdVsyXSxjPXVbMF07d2hpbGUoYy0tKWE9YS5sYXN0Q2hpbGQ7dy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtmLnRleHRDb250ZW50PSIiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiZ3LmluQXJyYXkobyxyKT4tMSlpJiZpLnB1c2gobyk7ZWxzZSBpZihsPXcuY29udGFpbnMoby5vd25lckRvY3VtZW50LG8pLGE9eWUoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksbCYmdmUoYSksbil7Yz0wO3doaWxlKG89YVtjKytdKWhlLnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKX1yZXR1cm4gZn0hZnVuY3Rpb24oKXt2YXIgZT1yLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChyLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSx0PXIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksdC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksZS5hcHBlbmRDaGlsZCh0KSxoLmNoZWNrQ2xvbmU9ZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsZS5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLGgubm9DbG9uZUNoZWNrZWQ9ISFlLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZX0oKTt2YXIgYmU9ci5kb2N1bWVudEVsZW1lbnQsd2U9L15rZXkvLFRlPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxDZT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gRWUoKXtyZXR1cm4hMH1mdW5jdGlvbiBrZSgpe3JldHVybiExfWZ1bmN0aW9uIFNlKCl7dHJ5e3JldHVybiByLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX1mdW5jdGlvbiBEZShlLHQsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIHQpeyJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCk7Zm9yKHMgaW4gdClEZShlLHMsbixyLHRbc10sbyk7cmV0dXJuIGV9aWYobnVsbD09ciYmbnVsbD09aT8oaT1uLHI9bj12b2lkIDApOm51bGw9PWkmJigic3RyaW5nIj09dHlwZW9mIG4/KGk9cixyPXZvaWQgMCk6KGk9cixyPW4sbj12b2lkIDApKSwhMT09PWkpaT1rZTtlbHNlIGlmKCFpKXJldHVybiBlO3JldHVybiAxPT09byYmKGE9aSwoaT1mdW5jdGlvbihlKXtyZXR1cm4gdygpLm9mZihlKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPXcuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC5hZGQodGhpcyx0LGkscixuKX0pfXcuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHk9Si5nZXQoZSk7aWYoeSl7bi5oYW5kbGVyJiYobj0obz1uKS5oYW5kbGVyLGk9by5zZWxlY3RvciksaSYmdy5maW5kLm1hdGNoZXNTZWxlY3RvcihiZSxpKSxuLmd1aWR8fChuLmd1aWQ9dy5ndWlkKyspLCh1PXkuZXZlbnRzKXx8KHU9eS5ldmVudHM9e30pLChhPXkuaGFuZGxlKXx8KGE9eS5oYW5kbGU9ZnVuY3Rpb24odCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB3JiZ3LmV2ZW50LnRyaWdnZXJlZCE9PXQudHlwZT93LmV2ZW50LmRpc3BhdGNoLmFwcGx5KGUsYXJndW1lbnRzKTp2b2lkIDB9KSxsPSh0PSh0fHwiIikubWF0Y2goTSl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0pZD1nPShzPUNlLmV4ZWModFtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShpP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkLGY9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxjPXcuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJncuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LG8pLChwPXVbZF0pfHwoKHA9dVtkXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKGUscixoLGEpfHxlLmFkZEV2ZW50TGlzdGVuZXImJmUuYWRkRXZlbnRMaXN0ZW5lcihkLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwoZSxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpwLnB1c2goYyksdy5ldmVudC5nbG9iYWxbZF09ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx5PUouaGFzRGF0YShlKSYmSi5nZXQoZSk7aWYoeSYmKHU9eS5ldmVudHMpKXtsPSh0PSh0fHwiIikubWF0Y2goTSl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0paWYocz1DZS5leGVjKHRbbF0pfHxbXSxkPWc9c1sxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7Zj13LmV2ZW50LnNwZWNpYWxbZF18fHt9LHA9dVtkPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJigiKioiIT09cnx8IWMuc2VsZWN0b3IpfHwocC5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbChlLGMpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbChlLGgseS5oYW5kbGUpfHx3LnJlbW92ZUV2ZW50KGUsZCx5LmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSl3LmV2ZW50LnJlbW92ZShlLGQrdFtsXSxuLHIsITApO3cuaXNFbXB0eU9iamVjdCh1KSYmSi5yZW1vdmUoZSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5ldmVudC5maXgoZSksbixyLGksbyxhLHMsdT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksbD0oSi5nZXQodGhpcywiZXZlbnRzIil8fHt9KVt0LnR5cGVdfHxbXSxjPXcuZXZlbnQuc3BlY2lhbFt0LnR5cGVdfHx7fTtmb3IodVswXT10LG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXVbbl09YXJndW1lbnRzW25dO2lmKHQuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8ITEhPT1jLnByZURpc3BhdGNoLmNhbGwodGhpcyx0KSl7cz13LmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyx0LGwpLG49MDt3aGlsZSgobz1zW24rK10pJiYhdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXt0LmN1cnJlbnRUYXJnZXQ9by5lbGVtLHI9MDt3aGlsZSgoYT1vLmhhbmRsZXJzW3IrK10pJiYhdC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKXQucm5hbWVzcGFjZSYmIXQucm5hbWVzcGFjZS50ZXN0KGEubmFtZXNwYWNlKXx8KHQuaGFuZGxlT2JqPWEsdC5kYXRhPWEuZGF0YSx2b2lkIDAhPT0oaT0oKHcuZXZlbnQuc3BlY2lhbFthLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8YS5oYW5kbGVyKS5hcHBseShvLmVsZW0sdSkpJiYhMT09PSh0LnJlc3VsdD1pKSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsdCksdC5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoImNsaWNrIj09PWUudHlwZSYmZS5idXR0b24+PTEpKWZvcig7bCE9PXRoaXM7bD1sLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWwubm9kZVR5cGUmJigiY2xpY2siIT09ZS50eXBlfHwhMCE9PWwuZGlzYWJsZWQpKXtmb3Iobz1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbaT0ocj10W25dKS5zZWxlY3RvcisiICJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD93KGksdGhpcykuaW5kZXgobCk+LTE6dy5maW5kKGksdGhpcyxudWxsLFtsXSkubGVuZ3RoKSxhW2ldJiZvLnB1c2gocik7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOm99KX1yZXR1cm4gbD10aGlzLHU8dC5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOnQuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHcuRXZlbnQucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpnKHQpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0KHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbZV19LHNldDpmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVt3LmV4cGFuZG9dP2U6bmV3IHcuRXZlbnQoZSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXMhPT1TZSgpJiZ0aGlzLmZvY3VzKXJldHVybiB0aGlzLmZvY3VzKCksITF9LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzPT09U2UoKSYmdGhpcy5ibHVyKXJldHVybiB0aGlzLmJsdXIoKSwhMX0sZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGNsaWNrOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYoImNoZWNrYm94Ij09PXRoaXMudHlwZSYmdGhpcy5jbGljayYmTih0aGlzLCJpbnB1dCIpKXJldHVybiB0aGlzLmNsaWNrKCksITF9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3JldHVybiBOKGUudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnJlc3VsdCYmZS5vcmlnaW5hbEV2ZW50JiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fX0sdy5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0sdy5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHcuRXZlbnQpKXJldHVybiBuZXcgdy5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlP0VlOmtlLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJncuZXh0ZW5kKHRoaXMsdCksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1t3LmV4cGFuZG9dPSEwfSx3LkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6dy5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6a2UsaXNQcm9wYWdhdGlvblN0b3BwZWQ6a2UsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6a2UsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUVlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSx3LmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsImNoYXIiOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYnV0dG9uO3JldHVybiBudWxsPT1lLndoaWNoJiZ3ZS50ZXN0KGUudHlwZSk/bnVsbCE9ZS5jaGFyQ29kZT9lLmNoYXJDb2RlOmUua2V5Q29kZTohZS53aGljaCYmdm9pZCAwIT09dCYmVGUudGVzdChlLnR5cGUpPzEmdD8xOjImdD8zOjQmdD8yOjA6ZS53aGljaH19LHcuZXZlbnQuYWRkUHJvcCksdy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLHQpe3cuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LG89ZS5oYW5kbGVPYmo7cmV0dXJuIGkmJihpPT09cnx8dy5jb250YWlucyhyLGkpKXx8KGUudHlwZT1vLm9yaWdUeXBlLG49by5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnR5cGU9dCksbn19fSksdy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBEZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIERlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLHcoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PXQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0fHwobj10LHQ9dm9pZCAwKSwhMT09PW4mJihuPWtlKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt3LmV2ZW50LnJlbW92ZSh0aGlzLGUsbix0KX0pfX0pO3ZhciBOZT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksQWU9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksamU9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2kscWU9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nO2Z1bmN0aW9uIExlKGUsdCl7cmV0dXJuIE4oZSwidGFibGUiKSYmTigxMSE9PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIik/dyhlKS5jaGlsZHJlbigidGJvZHkiKVswXXx8ZTplfWZ1bmN0aW9uIEhlKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gT2UoZSl7cmV0dXJuInRydWUvIj09PShlLnR5cGV8fCIiKS5zbGljZSgwLDUpP2UudHlwZT1lLnR5cGUuc2xpY2UoNSk6ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIFBlKGUsdCl7dmFyIG4scixpLG8sYSxzLHUsbDtpZigxPT09dC5ub2RlVHlwZSl7aWYoSi5oYXNEYXRhKGUpJiYobz1KLmFjY2VzcyhlKSxhPUouc2V0KHQsbyksbD1vLmV2ZW50cykpe2RlbGV0ZSBhLmhhbmRsZSxhLmV2ZW50cz17fTtmb3IoaSBpbiBsKWZvcihuPTAscj1sW2ldLmxlbmd0aDtuPHI7bisrKXcuZXZlbnQuYWRkKHQsaSxsW2ldW25dKX1LLmhhc0RhdGEoZSkmJihzPUsuYWNjZXNzKGUpLHU9dy5leHRlbmQoe30scyksSy5zZXQodCx1KSl9fWZ1bmN0aW9uIE1lKGUsdCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyJpbnB1dCI9PT1uJiZwZS50ZXN0KGUudHlwZSk/dC5jaGVja2VkPWUuY2hlY2tlZDoiaW5wdXQiIT09biYmInRleHRhcmVhIiE9PW58fCh0LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gUmUoZSx0LG4scil7dD1hLmFwcGx5KFtdLHQpO3ZhciBpLG8scyx1LGwsYyxmPTAscD1lLmxlbmd0aCxkPXAtMSx5PXRbMF0sdj1nKHkpO2lmKHZ8fHA+MSYmInN0cmluZyI9PXR5cGVvZiB5JiYhaC5jaGVja0Nsb25lJiZqZS50ZXN0KHkpKXJldHVybiBlLmVhY2goZnVuY3Rpb24oaSl7dmFyIG89ZS5lcShpKTt2JiYodFswXT15LmNhbGwodGhpcyxpLG8uaHRtbCgpKSksUmUobyx0LG4scil9KTtpZihwJiYoaT14ZSh0LGVbMF0ub3duZXJEb2N1bWVudCwhMSxlLHIpLG89aS5maXJzdENoaWxkLDE9PT1pLmNoaWxkTm9kZXMubGVuZ3RoJiYoaT1vKSxvfHxyKSl7Zm9yKHU9KHM9dy5tYXAoeWUoaSwic2NyaXB0IiksSGUpKS5sZW5ndGg7ZjxwO2YrKylsPWksZiE9PWQmJihsPXcuY2xvbmUobCwhMCwhMCksdSYmdy5tZXJnZShzLHllKGwsInNjcmlwdCIpKSksbi5jYWxsKGVbZl0sbCxmKTtpZih1KWZvcihjPXNbcy5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCx3Lm1hcChzLE9lKSxmPTA7Zjx1O2YrKylsPXNbZl0saGUudGVzdChsLnR5cGV8fCIiKSYmIUouYWNjZXNzKGwsImdsb2JhbEV2YWwiKSYmdy5jb250YWlucyhjLGwpJiYobC5zcmMmJiJtb2R1bGUiIT09KGwudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/dy5fZXZhbFVybCYmdy5fZXZhbFVybChsLnNyYyk6bShsLnRleHRDb250ZW50LnJlcGxhY2UocWUsIiIpLGMsbCkpfXJldHVybiBlfWZ1bmN0aW9uIEllKGUsdCxuKXtmb3IodmFyIHIsaT10P3cuZmlsdGVyKHQsZSk6ZSxvPTA7bnVsbCE9KHI9aVtvXSk7bysrKW58fDEhPT1yLm5vZGVUeXBlfHx3LmNsZWFuRGF0YSh5ZShyKSksci5wYXJlbnROb2RlJiYobiYmdy5jb250YWlucyhyLm93bmVyRG9jdW1lbnQscikmJnZlKHllKHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiBlfXcuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoTmUsIjwkMT48LyQyPiIpfSxjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNsb25lTm9kZSghMCksdT13LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKTtpZighKGgubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fHcuaXNYTUxEb2MoZSkpKWZvcihhPXllKHMpLHI9MCxpPShvPXllKGUpKS5sZW5ndGg7cjxpO3IrKylNZShvW3JdLGFbcl0pO2lmKHQpaWYobilmb3Iobz1vfHx5ZShlKSxhPWF8fHllKHMpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspUGUob1tyXSxhW3JdKTtlbHNlIFBlKGUscyk7cmV0dXJuKGE9eWUocywic2NyaXB0IikpLmxlbmd0aD4wJiZ2ZShhLCF1JiZ5ZShlLCJzY3JpcHQiKSksc30sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHIsaT13LmV2ZW50LnNwZWNpYWwsbz0wO3ZvaWQgMCE9PShuPWVbb10pO28rKylpZihZKG4pKXtpZih0PW5bSi5leHBhbmRvXSl7aWYodC5ldmVudHMpZm9yKHIgaW4gdC5ldmVudHMpaVtyXT93LmV2ZW50LnJlbW92ZShuLHIpOncucmVtb3ZlRXZlbnQobixyLHQuaGFuZGxlKTtuW0ouZXhwYW5kb109dm9pZCAwfW5bSy5leHBhbmRvXSYmKG5bSy5leHBhbmRvXT12b2lkIDApfX19KSx3LmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiBJZSh0aGlzLGUsITApfSxyZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIEllKHRoaXMsZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHoodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT93LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUmUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fExlKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9TGUodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYody5jbGVhbkRhdGEoeWUoZSwhMSkpLGUudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB3LmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIUFlLnRlc3QoZSkmJiFnZVsoZGUuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9dy5odG1sUHJlZmlsdGVyKGUpO3RyeXtmb3IoO248cjtuKyspMT09PSh0PXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKHcuY2xlYW5EYXRhKHllKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIFJlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTt3LmluQXJyYXkodGhpcyxlKTwwJiYody5jbGVhbkRhdGEoeWUodGhpcykpLG4mJm4ucmVwbGFjZUNoaWxkKHQsdGhpcykpfSxlKX19KSx3LmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLHI9W10saT13KGUpLG89aS5sZW5ndGgtMSxhPTA7YTw9bzthKyspbj1hPT09bz90aGlzOnRoaXMuY2xvbmUoITApLHcoaVthXSlbdF0obikscy5hcHBseShyLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhyKX19KTt2YXIgV2U9bmV3IFJlZ0V4cCgiXigiK3JlKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksJGU9ZnVuY3Rpb24odCl7dmFyIG49dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiBuJiZuLm9wZW5lcnx8KG49ZSksbi5nZXRDb21wdXRlZFN0eWxlKHQpfSxCZT1uZXcgUmVnRXhwKG9lLmpvaW4oInwiKSwiaSIpOyFmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtpZihjKXtsLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGMuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIsYmUuYXBwZW5kQ2hpbGQobCkuYXBwZW5kQ2hpbGQoYyk7dmFyIHQ9ZS5nZXRDb21wdXRlZFN0eWxlKGMpO2k9IjElIiE9PXQudG9wLHU9MTI9PT1uKHQubWFyZ2luTGVmdCksYy5zdHlsZS5yaWdodD0iNjAlIixzPTM2PT09bih0LnJpZ2h0KSxvPTM2PT09bih0LndpZHRoKSxjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYT0zNj09PWMub2Zmc2V0V2lkdGh8fCJhYnNvbHV0ZSIsYmUucmVtb3ZlQ2hpbGQobCksYz1udWxsfX1mdW5jdGlvbiBuKGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBpLG8sYSxzLHUsbD1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ci5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLnN0eWxlJiYoYy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixoLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09Yy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCx3LmV4dGVuZChoLHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiB0KCksb30scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHN9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLGl9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiB0KCksdX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0KCksYX19KSl9KCk7ZnVuY3Rpb24gRmUoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5zdHlsZTtyZXR1cm4obj1ufHwkZShlKSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSl8fHcuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHwoYT13LnN0eWxlKGUsdCkpLCFoLnBpeGVsQm94U3R5bGVzKCkmJldlLnRlc3QoYSkmJkJlLnRlc3QodCkmJihyPXMud2lkdGgsaT1zLm1pbldpZHRoLG89cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1pLHMubWF4V2lkdGg9bykpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uIF9lKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX12YXIgemU9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFhlPS9eLS0vLFVlPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxWZT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn0sR2U9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFllPXIuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7ZnVuY3Rpb24gUWUoZSl7aWYoZSBpbiBZZSlyZXR1cm4gZTt2YXIgdD1lWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPUdlLmxlbmd0aDt3aGlsZShuLS0paWYoKGU9R2Vbbl0rdClpbiBZZSlyZXR1cm4gZX1mdW5jdGlvbiBKZShlKXt2YXIgdD13LmNzc1Byb3BzW2VdO3JldHVybiB0fHwodD13LmNzc1Byb3BzW2VdPVFlKGUpfHxlKSx0fWZ1bmN0aW9uIEtlKGUsdCxuKXt2YXIgcj1pZS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTp0fWZ1bmN0aW9uIFplKGUsdCxuLHIsaSxvKXt2YXIgYT0id2lkdGgiPT09dD8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPXcuY3NzKGUsbitvZVthXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHUtPXcuY3NzKGUsInBhZGRpbmciK29lW2FdLCEwLGkpKSwibWFyZ2luIiE9PW4mJih1LT13LmNzcyhlLCJib3JkZXIiK29lW2FdKyJXaWR0aCIsITAsaSkpKToodSs9dy5jc3MoZSwicGFkZGluZyIrb2VbYV0sITAsaSksInBhZGRpbmciIT09bj91Kz13LmNzcyhlLCJib3JkZXIiK29lW2FdKyJXaWR0aCIsITAsaSk6cys9dy5jc3MoZSwiYm9yZGVyIitvZVthXSsiV2lkdGgiLCEwLGkpKTtyZXR1cm4hciYmbz49MCYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSkpLHV9ZnVuY3Rpb24gZXQoZSx0LG4pe3ZhciByPSRlKGUpLGk9RmUoZSx0LHIpLG89ImJvcmRlci1ib3giPT09dy5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSxhPW87aWYoV2UudGVzdChpKSl7aWYoIW4pcmV0dXJuIGk7aT0iYXV0byJ9cmV0dXJuIGE9YSYmKGguYm94U2l6aW5nUmVsaWFibGUoKXx8aT09PWUuc3R5bGVbdF0pLCgiYXV0byI9PT1pfHwhcGFyc2VGbG9hdChpKSYmImlubGluZSI9PT13LmNzcyhlLCJkaXNwbGF5IiwhMSxyKSkmJihpPWVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLGE9ITApLChpPXBhcnNlRmxvYXQoaSl8fDApK1plKGUsdCxufHwobz8iYm9yZGVyIjoiY29udGVudCIpLGEscixpKSsicHgifXcuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49RmUoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8sYSxzPUcodCksdT1YZS50ZXN0KHQpLGw9ZS5zdHlsZTtpZih1fHwodD1KZShzKSksYT13LmNzc0hvb2tzW3RdfHx3LmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KGk9YS5nZXQoZSwhMSxyKSk/aTpsW3RdOyJzdHJpbmciPT0obz10eXBlb2YgbikmJihpPWllLmV4ZWMobikpJiZpWzFdJiYobj11ZShlLHQsaSksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09PW4mJigibnVtYmVyIj09PW8mJihuKz1pJiZpWzNdfHwody5jc3NOdW1iZXJbc10/IiI6InB4IikpLGguY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT10LmluZGV4T2YoImJhY2tncm91bmQiKXx8KGxbdF09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KGUsbixyKSl8fCh1P2wuc2V0UHJvcGVydHkodCxuKTpsW3RdPW4pKX19LGNzczpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1HKHQpO3JldHVybiBYZS50ZXN0KHQpfHwodD1KZShzKSksKGE9dy5jc3NIb29rc1t0XXx8dy5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9RmUoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gVmUmJihpPVZlW3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSwhMD09PW58fGlzRmluaXRlKG8pP298fDA6aSk6aX19KSx3LmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGUsdCl7dy5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbixyKXtpZihuKXJldHVybiF6ZS50ZXN0KHcuY3NzKGUsImRpc3BsYXkiKSl8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/ZXQoZSx0LHIpOnNlKGUsVWUsZnVuY3Rpb24oKXtyZXR1cm4gZXQoZSx0LHIpfSl9LHNldDpmdW5jdGlvbihlLG4scil7dmFyIGksbz0kZShlKSxhPSJib3JkZXItYm94Ij09PXcuY3NzKGUsImJveFNpemluZyIsITEsbykscz1yJiZaZShlLHQscixhLG8pO3JldHVybiBhJiZoLnNjcm9sbGJveFNpemUoKT09PW8ucG9zaXRpb24mJihzLT1NYXRoLmNlaWwoZVsib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tcGFyc2VGbG9hdChvW3RdKS1aZShlLHQsImJvcmRlciIsITEsbyktLjUpKSxzJiYoaT1pZS5leGVjKG4pKSYmInB4IiE9PShpWzNdfHwicHgiKSYmKGUuc3R5bGVbdF09bixuPXcuY3NzKGUsdCkpLEtlKGUsbixzKX19fSksdy5jc3NIb29rcy5tYXJnaW5MZWZ0PV9lKGgucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChGZShlLCJtYXJnaW5MZWZ0IikpfHxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtc2UoZSx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLHcuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGUsdCl7dy5jc3NIb29rc1tlK3RdPXtleHBhbmQ6ZnVuY3Rpb24obil7Zm9yKHZhciByPTAsaT17fSxvPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO3I8NDtyKyspaVtlK29lW3JdK3RdPW9bcl18fG9bci0yXXx8b1swXTtyZXR1cm4gaX19LCJtYXJnaW4iIT09ZSYmKHcuY3NzSG9va3NbZSt0XS5zZXQ9S2UpfSksdy5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fSxhPTA7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHI9JGUoZSksaT10Lmxlbmd0aDthPGk7YSsrKW9bdFthXV09dy5jc3MoZSx0W2FdLCExLHIpO3JldHVybiBvfXJldHVybiB2b2lkIDAhPT1uP3cuc3R5bGUoZSx0LG4pOncuY3NzKGUsdCl9LGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfX0pO2Z1bmN0aW9uIHR0KGUsdCxuLHIsaSl7cmV0dXJuIG5ldyB0dC5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfXcuVHdlZW49dHQsdHQucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0dCxpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHx3LmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9b3x8KHcuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgZT10dC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6dHQucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49dHQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz10PXcuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTp0dC5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSx0dC5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9dHQucHJvdG90eXBlLHR0LnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gMSE9PWUuZWxlbS5ub2RlVHlwZXx8bnVsbCE9ZS5lbGVtW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtlLnByb3BdP2UuZWxlbVtlLnByb3BdOih0PXcuY3NzKGUuZWxlbSxlLnByb3AsIiIpKSYmImF1dG8iIT09dD90OjB9LHNldDpmdW5jdGlvbihlKXt3LmZ4LnN0ZXBbZS5wcm9wXT93LmZ4LnN0ZXBbZS5wcm9wXShlKToxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsPT1lLmVsZW0uc3R5bGVbdy5jc3NQcm9wc1tlLnByb3BdXSYmIXcuY3NzSG9va3NbZS5wcm9wXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzp3LnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSx0dC5wcm9wSG9va3Muc2Nyb2xsVG9wPXR0LnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LHcuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sdy5meD10dC5wcm90b3R5cGUuaW5pdCx3LmZ4LnN0ZXA9e307dmFyIG50LHJ0LGl0PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxvdD0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIGF0KCl7cnQmJighMT09PXIuaGlkZGVuJiZlLnJlcXVlc3RBbmltYXRpb25GcmFtZT9lLnJlcXVlc3RBbmltYXRpb25GcmFtZShhdCk6ZS5zZXRUaW1lb3V0KGF0LHcuZnguaW50ZXJ2YWwpLHcuZngudGljaygpKX1mdW5jdGlvbiBzdCgpe3JldHVybiBlLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtudD12b2lkIDB9KSxudD1EYXRlLm5vdygpfWZ1bmN0aW9uIHV0KGUsdCl7dmFyIG4scj0wLGk9e2hlaWdodDplfTtmb3IodD10PzE6MDtyPDQ7cis9Mi10KWlbIm1hcmdpbiIrKG49b2Vbcl0pXT1pWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoaS5vcGFjaXR5PWkud2lkdGg9ZSksaX1mdW5jdGlvbiBsdChlLHQsbil7Zm9yKHZhciByLGk9KHB0LnR3ZWVuZXJzW3RdfHxbXSkuY29uY2F0KHB0LnR3ZWVuZXJzWyIqIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGN0KGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLGY9IndpZHRoImluIHR8fCJoZWlnaHQiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZhZShlKSx5PUouZ2V0KGUsImZ4c2hvdyIpO24ucXVldWV8fChudWxsPT0oYT13Ll9xdWV1ZUhvb2tzKGUsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLHcucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSk7Zm9yKHIgaW4gdClpZihpPXRbcl0saXQudGVzdChpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1pfHwheXx8dm9pZCAwPT09eVtyXSljb250aW51ZTtnPSEwfWRbcl09eSYmeVtyXXx8dy5zdHlsZShlLHIpfWlmKCh1PSF3LmlzRW1wdHlPYmplY3QodCkpfHwhdy5pc0VtcHR5T2JqZWN0KGQpKXtmJiYxPT09ZS5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2gub3ZlcmZsb3csaC5vdmVyZmxvd1gsaC5vdmVyZmxvd1ldLG51bGw9PShsPXkmJnkuZGlzcGxheSkmJihsPUouZ2V0KGUsImRpc3BsYXkiKSksIm5vbmUiPT09KGM9dy5jc3MoZSwiZGlzcGxheSIpKSYmKGw/Yz1sOihmZShbZV0sITApLGw9ZS5zdHlsZS5kaXNwbGF5fHxsLGM9dy5jc3MoZSwiZGlzcGxheSIpLGZlKFtlXSkpKSwoImlubGluZSI9PT1jfHwiaW5saW5lLWJsb2NrIj09PWMmJm51bGwhPWwpJiYibm9uZSI9PT13LmNzcyhlLCJmbG9hdCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2guZGlzcGxheT1sfSksbnVsbD09bCYmKGM9aC5kaXNwbGF5LGw9Im5vbmUiPT09Yz8iIjpjKSksaC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKGgub3ZlcmZsb3c9ImhpZGRlbiIscC5hbHdheXMoZnVuY3Rpb24oKXtoLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0saC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxoLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITE7Zm9yKHIgaW4gZCl1fHwoeT8iaGlkZGVuImluIHkmJihnPXkuaGlkZGVuKTp5PUouYWNjZXNzKGUsImZ4c2hvdyIse2Rpc3BsYXk6bH0pLG8mJih5LmhpZGRlbj0hZyksZyYmZmUoW2VdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtnfHxmZShbZV0pLEoucmVtb3ZlKGUsImZ4c2hvdyIpO2ZvcihyIGluIGQpdy5zdHlsZShlLHIsZFtyXSl9KSksdT1sdChnP3lbcl06MCxyLHApLHIgaW4geXx8KHlbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX19ZnVuY3Rpb24gZnQoZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYocj1HKG4pLGk9dFtyXSxvPWVbbl0sQXJyYXkuaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLChhPXcuY3NzSG9va3Nbcl0pJiYiZXhwYW5kImluIGEpe289YS5leHBhbmQobyksZGVsZXRlIGVbcl07Zm9yKG4gaW4gbyluIGluIGV8fChlW25dPW9bbl0sdFtuXT1pKX1lbHNlIHRbcl09aX1mdW5jdGlvbiBwdChlLHQsbil7dmFyIHIsaSxvPTAsYT1wdC5wcmVmaWx0ZXJzLmxlbmd0aCxzPXcuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKGkpcmV0dXJuITE7Zm9yKHZhciB0PW50fHxzdCgpLG49TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLXQpLHI9MS0obi9sLmR1cmF0aW9ufHwwKSxvPTAsYT1sLnR3ZWVucy5sZW5ndGg7bzxhO28rKylsLnR3ZWVuc1tvXS5ydW4ocik7cmV0dXJuIHMubm90aWZ5V2l0aChlLFtsLHIsbl0pLHI8MSYmYT9uOihhfHxzLm5vdGlmeVdpdGgoZSxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKGUsW2xdKSwhMSl9LGw9cy5wcm9taXNlKHtlbGVtOmUscHJvcHM6dy5leHRlbmQoe30sdCksb3B0czp3LmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6dy5lYXNpbmcuX2RlZmF1bHR9LG4pLG9yaWdpbmFsUHJvcGVydGllczp0LG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTpudHx8c3QoKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciByPXcuVHdlZW4oZSxsLm9wdHMsdCxuLGwub3B0cy5zcGVjaWFsRWFzaW5nW3RdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPTAscj10P2wudHdlZW5zLmxlbmd0aDowO2lmKGkpcmV0dXJuIHRoaXM7Zm9yKGk9ITA7bjxyO24rKylsLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIHQ/KHMubm90aWZ5V2l0aChlLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgoZSxbbCx0XSkpOnMucmVqZWN0V2l0aChlLFtsLHRdKSx0aGlzfX0pLGM9bC5wcm9wcztmb3IoZnQoYyxsLm9wdHMuc3BlY2lhbEVhc2luZyk7bzxhO28rKylpZihyPXB0LnByZWZpbHRlcnNbb10uY2FsbChsLGUsYyxsLm9wdHMpKXJldHVybiBnKHIuc3RvcCkmJih3Ll9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0b3A9ci5zdG9wLmJpbmQocikpLHI7cmV0dXJuIHcubWFwKGMsbHQsbCksZyhsLm9wdHMuc3RhcnQpJiZsLm9wdHMuc3RhcnQuY2FsbChlLGwpLGwucHJvZ3Jlc3MobC5vcHRzLnByb2dyZXNzKS5kb25lKGwub3B0cy5kb25lLGwub3B0cy5jb21wbGV0ZSkuZmFpbChsLm9wdHMuZmFpbCkuYWx3YXlzKGwub3B0cy5hbHdheXMpLHcuZngudGltZXIody5leHRlbmQodSx7ZWxlbTplLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbH13LkFuaW1hdGlvbj13LmV4dGVuZChwdCx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKGUsdCk7cmV0dXJuIHVlKG4uZWxlbSxlLGllLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7ZyhlKT8odD1lLGU9WyIqIl0pOmU9ZS5tYXRjaChNKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluPWVbcl0scHQudHdlZW5lcnNbbl09cHQudHdlZW5lcnNbbl18fFtdLHB0LnR3ZWVuZXJzW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W2N0XSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P3B0LnByZWZpbHRlcnMudW5zaGlmdChlKTpwdC5wcmVmaWx0ZXJzLnB1c2goZSl9fSksdy5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP3cuZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8ZyhlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYhZyh0KSYmdH07cmV0dXJuIHcuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIHcuZnguc3BlZWRzP3IuZHVyYXRpb249dy5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj13LmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXtnKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZ3LmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sdy5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoYWUpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXcuaXNFbXB0eU9iamVjdChlKSxvPXcuc3BlZWQodCxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgdD1wdCh0aGlzLHcuZXh0ZW5kKHt9LGUpLG8pOyhpfHxKLmdldCh0aGlzLCJmaW5pc2giKSkmJnQuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fCExPT09by5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG4pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihuPXQsdD1lLGU9dm9pZCAwKSx0JiYhMSE9PWUmJnRoaXMucXVldWUoZXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ITAsaT1udWxsIT1lJiZlKyJxdWV1ZUhvb2tzIixvPXcudGltZXJzLGE9Si5nZXQodGhpcyk7aWYoaSlhW2ldJiZhW2ldLnN0b3AmJnIoYVtpXSk7ZWxzZSBmb3IoaSBpbiBhKWFbaV0mJmFbaV0uc3RvcCYmb3QudGVzdChpKSYmcihhW2ldKTtmb3IoaT1vLmxlbmd0aDtpLS07KW9baV0uZWxlbSE9PXRoaXN8fG51bGwhPWUmJm9baV0ucXVldWUhPT1lfHwob1tpXS5hbmltLnN0b3AobiksdD0hMSxvLnNwbGljZShpLDEpKTshdCYmbnx8dy5kZXF1ZXVlKHRoaXMsZSl9KX0sZmluaXNoOmZ1bmN0aW9uKGUpe3JldHVybiExIT09ZSYmKGU9ZXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQsbj1KLmdldCh0aGlzKSxyPW5bZSsicXVldWUiXSxpPW5bZSsicXVldWVIb29rcyJdLG89dy50aW1lcnMsYT1yP3IubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLHcucXVldWUodGhpcyxlLFtdKSxpJiZpLnN0b3AmJmkuc3RvcC5jYWxsKHRoaXMsITApLHQ9by5sZW5ndGg7dC0tOylvW3RdLmVsZW09PT10aGlzJiZvW3RdLnF1ZXVlPT09ZSYmKG9bdF0uYW5pbS5zdG9wKCEwKSxvLnNwbGljZSh0LDEpKTtmb3IodD0wO3Q8YTt0Kyspclt0XSYmclt0XS5maW5pc2gmJnJbdF0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIG4uZmluaXNofSl9fSksdy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHQpe3ZhciBuPXcuZm5bdF07dy5mblt0XT1mdW5jdGlvbihlLHIsaSl7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09dHlwZW9mIGU/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKHV0KHQsITApLGUscixpKX19KSx3LmVhY2goe3NsaWRlRG93bjp1dCgic2hvdyIpLHNsaWRlVXA6dXQoImhpZGUiKSxzbGlkZVRvZ2dsZTp1dCgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSksdy50aW1lcnM9W10sdy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49dy50aW1lcnM7Zm9yKG50PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8dy5meC5zdG9wKCksbnQ9dm9pZCAwfSx3LmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe3cudGltZXJzLnB1c2goZSksdy5meC5zdGFydCgpfSx3LmZ4LmludGVydmFsPTEzLHcuZnguc3RhcnQ9ZnVuY3Rpb24oKXtydHx8KHJ0PSEwLGF0KCkpfSx3LmZ4LnN0b3A9ZnVuY3Rpb24oKXtydD1udWxsfSx3LmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSx3LmZuLmRlbGF5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9dy5meD93LmZ4LnNwZWVkc1t0XXx8dDp0LG49bnx8ImZ4Iix0aGlzLnF1ZXVlKG4sZnVuY3Rpb24obixyKXt2YXIgaT1lLnNldFRpbWVvdXQobix0KTtyLnN0b3A9ZnVuY3Rpb24oKXtlLmNsZWFyVGltZW91dChpKX19KX0sZnVuY3Rpb24oKXt2YXIgZT1yLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdD1yLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKHIuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO2UudHlwZT0iY2hlY2tib3giLGguY2hlY2tPbj0iIiE9PWUudmFsdWUsaC5vcHRTZWxlY3RlZD10LnNlbGVjdGVkLChlPXIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWU9InQiLGUudHlwZT0icmFkaW8iLGgucmFkaW9WYWx1ZT0idCI9PT1lLnZhbHVlfSgpO3ZhciBkdCxodD13LmV4cHIuYXR0ckhhbmRsZTt3LmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsdy5hdHRyLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt3LnJlbW92ZUF0dHIodGhpcyxlKX0pfX0pLHcuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgZS5nZXRBdHRyaWJ1dGU/dy5wcm9wKGUsdCxuKTooMT09PW8mJncuaXNYTUxEb2MoZSl8fChpPXcuYXR0ckhvb2tzW3QudG9Mb3dlckNhc2UoKV18fCh3LmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP2R0OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCB3LnJlbW92ZUF0dHIoZSx0KTppJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuKyIiKSxuKTppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOm51bGw9PShyPXcuZmluZC5hdHRyKGUsdCkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZighaC5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmTihlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXQmJnQubWF0Y2goTSk7aWYoaSYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1pW3IrK10pZS5yZW1vdmVBdHRyaWJ1dGUobil9fSksZHQ9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuITE9PT10P3cucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LHcuZWFjaCh3LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciBuPWh0W3RdfHx3LmZpbmQuYXR0cjtodFt0XT1mdW5jdGlvbihlLHQscil7dmFyIGksbyxhPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcnx8KG89aHRbYV0saHRbYV09aSxpPW51bGwhPW4oZSx0LHIpP2E6bnVsbCxodFthXT1vKSxpfX0pO3ZhciBndD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLHl0PS9eKD86YXxhcmVhKSQvaTt3LmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsdy5wcm9wLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t3LnByb3BGaXhbZV18fGVdfSl9fSksdy5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1lLm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuIDE9PT1vJiZ3LmlzWE1MRG9jKGUpfHwodD13LnByb3BGaXhbdF18fHQsaT13LnByb3BIb29rc1t0XSksdm9pZCAwIT09bj9pJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjplW3RdPW46aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjplW3RdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5maW5kLmF0dHIoZSwidGFiaW5kZXgiKTtyZXR1cm4gdD9wYXJzZUludCh0LDEwKTpndC50ZXN0KGUubm9kZU5hbWUpfHx5dC50ZXN0KGUubm9kZU5hbWUpJiZlLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSxoLm9wdFNlbGVjdGVkfHwody5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTt0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLHcuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7dy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pO2Z1bmN0aW9uIHZ0KGUpe3JldHVybihlLm1hdGNoKE0pfHxbXSkuam9pbigiICIpfWZ1bmN0aW9uIG10KGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIHh0KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6InN0cmluZyI9PXR5cGVvZiBlP2UubWF0Y2goTSl8fFtdOltdfXcuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyx1PTA7aWYoZyhlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3codGhpcykuYWRkQ2xhc3MoZS5jYWxsKHRoaXMsdCxtdCh0aGlzKSkpfSk7aWYoKHQ9eHQoZSkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPW10KG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit2dChpKSsiICIpe2E9MDt3aGlsZShvPXRbYSsrXSlyLmluZGV4T2YoIiAiK28rIiAiKTwwJiYocis9bysiICIpO2khPT0ocz12dChyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzLHU9MDtpZihnKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7dyh0aGlzKS5yZW1vdmVDbGFzcyhlLmNhbGwodGhpcyx0LG10KHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKCh0PXh0KGUpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT1tdChuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIrdnQoaSkrIiAiKXthPTA7d2hpbGUobz10W2ErK10pd2hpbGUoci5pbmRleE9mKCIgIitvKyIgIik+LTEpcj1yLnJlcGxhY2UoIiAiK28rIiAiLCIgIik7aSE9PShzPXZ0KHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZSxyPSJzdHJpbmciPT09bnx8QXJyYXkuaXNBcnJheShlKTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0JiZyP3Q/dGhpcy5hZGRDbGFzcyhlKTp0aGlzLnJlbW92ZUNsYXNzKGUpOmcoZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3codGhpcykudG9nZ2xlQ2xhc3MoZS5jYWxsKHRoaXMsbixtdCh0aGlzKSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LGksbyxhO2lmKHIpe2k9MCxvPXcodGhpcyksYT14dChlKTt3aGlsZSh0PWFbaSsrXSlvLmhhc0NsYXNzKHQpP28ucmVtb3ZlQ2xhc3ModCk6by5hZGRDbGFzcyh0KX1lbHNlIHZvaWQgMCE9PWUmJiJib29sZWFuIiE9PW58fCgodD1tdCh0aGlzKSkmJkouc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLHQpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHR8fCExPT09ZT8iIjpKLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPTA7dD0iICIrZSsiICI7d2hpbGUobj10aGlzW3IrK10paWYoMT09PW4ubm9kZVR5cGUmJigiICIrdnQobXQobikpKyIgIikuaW5kZXhPZih0KT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgYnQ9L1xyL2c7dy5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiByPWcoZSksdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciBpOzE9PT10aGlzLm5vZGVUeXBlJiYobnVsbD09KGk9cj9lLmNhbGwodGhpcyxuLHcodGhpcykudmFsKCkpOmUpP2k9IiI6Im51bWJlciI9PXR5cGVvZiBpP2krPSIiOkFycmF5LmlzQXJyYXkoaSkmJihpPXcubWFwKGksZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZSsiIn0pKSwodD13LnZhbEhvb2tzW3RoaXMudHlwZV18fHcudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJzZXQiaW4gdCYmdm9pZCAwIT09dC5zZXQodGhpcyxpLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1pKSl9KTtpZihpKXJldHVybih0PXcudmFsSG9va3NbaS50eXBlXXx8dy52YWxIb29rc1tpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiB0JiZ2b2lkIDAhPT0obj10LmdldChpLCJ2YWx1ZSIpKT9uOiJzdHJpbmciPT10eXBlb2Yobj1pLnZhbHVlKT9uLnJlcGxhY2UoYnQsIiIpOm51bGw9PW4/IiI6bn19fSksdy5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD13LmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6dnQody50ZXh0KGUpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPWUub3B0aW9ucyxvPWUuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PWUudHlwZSxzPWE/bnVsbDpbXSx1PWE/bysxOmkubGVuZ3RoO2ZvcihyPW88MD91OmE/bzowO3I8dTtyKyspaWYoKChuPWlbcl0pLnNlbGVjdGVkfHxyPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IU4obi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD13KG4pLnZhbCgpLGEpcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89dy5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pKChyPWlbYV0pLnNlbGVjdGVkPXcuaW5BcnJheSh3LnZhbEhvb2tzLm9wdGlvbi5nZXQociksbyk+LTEpJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX19KSx3LmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXt3LnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9dy5pbkFycmF5KHcoZSkudmFsKCksdCk+LTF9fSxoLmNoZWNrT258fCh3LnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSksaC5mb2N1c2luPSJvbmZvY3VzaW4iaW4gZTt2YXIgd3Q9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFR0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O3cuZXh0ZW5kKHcuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24odCxuLGksbyl7dmFyIGEscyx1LGwsYyxwLGQsaCx2PVtpfHxyXSxtPWYuY2FsbCh0LCJ0eXBlIik/dC50eXBlOnQseD1mLmNhbGwodCwibmFtZXNwYWNlIik/dC5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihzPWg9dT1pPWl8fHIsMyE9PWkubm9kZVR5cGUmJjghPT1pLm5vZGVUeXBlJiYhd3QudGVzdChtK3cuZXZlbnQudHJpZ2dlcmVkKSYmKG0uaW5kZXhPZigiLiIpPi0xJiYobT0oeD1tLnNwbGl0KCIuIikpLnNoaWZ0KCkseC5zb3J0KCkpLGM9bS5pbmRleE9mKCI6Iik8MCYmIm9uIittLHQ9dFt3LmV4cGFuZG9dP3Q6bmV3IHcuRXZlbnQobSwib2JqZWN0Ij09dHlwZW9mIHQmJnQpLHQuaXNUcmlnZ2VyPW8/MjozLHQubmFtZXNwYWNlPXguam9pbigiLiIpLHQucm5hbWVzcGFjZT10Lm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIit4LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsdC5yZXN1bHQ9dm9pZCAwLHQudGFyZ2V0fHwodC50YXJnZXQ9aSksbj1udWxsPT1uP1t0XTp3Lm1ha2VBcnJheShuLFt0XSksZD13LmV2ZW50LnNwZWNpYWxbbV18fHt9LG98fCFkLnRyaWdnZXJ8fCExIT09ZC50cmlnZ2VyLmFwcGx5KGksbikpKXtpZighbyYmIWQubm9CdWJibGUmJiF5KGkpKXtmb3IobD1kLmRlbGVnYXRlVHlwZXx8bSx3dC50ZXN0KGwrbSl8fChzPXMucGFyZW50Tm9kZSk7cztzPXMucGFyZW50Tm9kZSl2LnB1c2gocyksdT1zO3U9PT0oaS5vd25lckRvY3VtZW50fHxyKSYmdi5wdXNoKHUuZGVmYXVsdFZpZXd8fHUucGFyZW50V2luZG93fHxlKX1hPTA7d2hpbGUoKHM9dlthKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSloPXMsdC50eXBlPWE+MT9sOmQuYmluZFR5cGV8fG0sKHA9KEouZ2V0KHMsImV2ZW50cyIpfHx7fSlbdC50eXBlXSYmSi5nZXQocywiaGFuZGxlIikpJiZwLmFwcGx5KHMsbiksKHA9YyYmc1tjXSkmJnAuYXBwbHkmJlkocykmJih0LnJlc3VsdD1wLmFwcGx5KHMsbiksITE9PT10LnJlc3VsdCYmdC5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gdC50eXBlPW0sb3x8dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8ZC5fZGVmYXVsdCYmITEhPT1kLl9kZWZhdWx0LmFwcGx5KHYucG9wKCksbil8fCFZKGkpfHxjJiZnKGlbbV0pJiYheShpKSYmKCh1PWlbY10pJiYoaVtjXT1udWxsKSx3LmV2ZW50LnRyaWdnZXJlZD1tLHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5hZGRFdmVudExpc3RlbmVyKG0sVHQpLGlbbV0oKSx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmgucmVtb3ZlRXZlbnRMaXN0ZW5lcihtLFR0KSx3LmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsdSYmKGlbY109dSkpLHQucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXcuZXh0ZW5kKG5ldyB3LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMH0pO3cuZXZlbnQudHJpZ2dlcihyLG51bGwsdCl9fSksdy5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gdy5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKX19KSxoLmZvY3VzaW58fHcuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbihlKXt3LmV2ZW50LnNpbXVsYXRlKHQsZS50YXJnZXQsdy5ldmVudC5maXgoZSkpfTt3LmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGk9Si5hY2Nlc3Mocix0KTtpfHxyLmFkZEV2ZW50TGlzdGVuZXIoZSxuLCEwKSxKLmFjY2VzcyhyLHQsKGl8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxpPUouYWNjZXNzKHIsdCktMTtpP0ouYWNjZXNzKHIsdCxpKTooci5yZW1vdmVFdmVudExpc3RlbmVyKGUsbiwhMCksSi5yZW1vdmUocix0KSl9fX0pO3ZhciBDdD1lLmxvY2F0aW9uLEV0PURhdGUubm93KCksa3Q9L1w/Lzt3LnBhcnNlWE1MPWZ1bmN0aW9uKHQpe3ZhciBuO2lmKCF0fHwic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dHJ5e249KG5ldyBlLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsInRleHQveG1sIil9Y2F0Y2goZSl7bj12b2lkIDB9cmV0dXJuIG4mJiFuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8dy5lcnJvcigiSW52YWxpZCBYTUw6ICIrdCksbn07dmFyIFN0PS9cW1xdJC8sRHQ9L1xyP1xuL2csTnQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLEF0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBqdChlLHQsbixyKXt2YXIgaTtpZihBcnJheS5pc0FycmF5KHQpKXcuZWFjaCh0LGZ1bmN0aW9uKHQsaSl7bnx8U3QudGVzdChlKT9yKGUsaSk6anQoZSsiWyIrKCJvYmplY3QiPT10eXBlb2YgaSYmbnVsbCE9aT90OiIiKSsiXSIsaSxuLHIpfSk7ZWxzZSBpZihufHwib2JqZWN0IiE9PXgodCkpcihlLHQpO2Vsc2UgZm9yKGkgaW4gdClqdChlKyJbIitpKyJdIix0W2ldLG4scil9dy5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3ZhciBuPWcodCk/dCgpOnQ7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYoQXJyYXkuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF3LmlzUGxhaW5PYmplY3QoZSkpdy5lYWNoKGUsZnVuY3Rpb24oKXtpKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKG4gaW4gZSlqdChuLGVbbl0sdCxpKTtyZXR1cm4gci5qb2luKCImIil9LHcuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXcucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBlP3cubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXcodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZBdC50ZXN0KHRoaXMubm9kZU5hbWUpJiYhTnQudGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IXBlLnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49dyh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOkFycmF5LmlzQXJyYXkobik/dy5tYXAobixmdW5jdGlvbihlKXtyZXR1cm57bmFtZTp0Lm5hbWUsdmFsdWU6ZS5yZXBsYWNlKER0LCJcclxuIil9fSk6e25hbWU6dC5uYW1lLHZhbHVlOm4ucmVwbGFjZShEdCwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBxdD0vJTIwL2csTHQ9LyMuKiQvLEh0PS8oWz8mXSlfPVteJl0qLyxPdD0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLFB0PS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLE10PS9eKD86R0VUfEhFQUQpJC8sUnQ9L15cL1wvLyxJdD17fSxXdD17fSwkdD0iKi8iLmNvbmNhdCgiKiIpLEJ0PXIuY3JlYXRlRWxlbWVudCgiYSIpO0J0LmhyZWY9Q3QuaHJlZjtmdW5jdGlvbiBGdChlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXsic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iKiIpO3ZhciByLGk9MCxvPXQudG9Mb3dlckNhc2UoKS5tYXRjaChNKXx8W107aWYoZyhuKSl3aGlsZShyPW9baSsrXSkiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwoZVtyXT1lW3JdfHxbXSkudW5zaGlmdChuKSk6KGVbcl09ZVtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uIF90KGUsdCxuLHIpe3ZhciBpPXt9LG89ZT09PVd0O2Z1bmN0aW9uIGEocyl7dmFyIHU7cmV0dXJuIGlbc109ITAsdy5lYWNoKGVbc118fFtdLGZ1bmN0aW9uKGUscyl7dmFyIGw9cyh0LG4scik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBsfHxvfHxpW2xdP28/ISh1PWwpOnZvaWQgMDoodC5kYXRhVHlwZXMudW5zaGlmdChsKSxhKGwpLCExKX0pLHV9cmV0dXJuIGEodC5kYXRhVHlwZXNbMF0pfHwhaVsiKiJdJiZhKCIqIil9ZnVuY3Rpb24genQoZSx0KXt2YXIgbixyLGk9dy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIHQpdm9pZCAwIT09dFtuXSYmKChpW25dP2U6cnx8KHI9e30pKVtuXT10W25dKTtyZXR1cm4gciYmdy5leHRlbmQoITAsZSxyKSxlfWZ1bmN0aW9uIFh0KGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IoaSBpbiBzKWlmKHNbaV0mJnNbaV0udGVzdChyKSl7dS51bnNoaWZ0KGkpO2JyZWFrfWlmKHVbMF1pbiBuKW89dVswXTtlbHNle2ZvcihpIGluIG4pe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbaSsiICIrdVswXV0pe289aTticmVha31hfHwoYT1pKX1vPW98fGF9aWYobylyZXR1cm4gbyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dfWZ1bmN0aW9uIFV0KGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD17fSxjPWUuZGF0YVR5cGVzLnNsaWNlKCk7aWYoY1sxXSlmb3IoYSBpbiBlLmNvbnZlcnRlcnMpbFthLnRvTG93ZXJDYXNlKCldPWUuY29udmVydGVyc1thXTtvPWMuc2hpZnQoKTt3aGlsZShvKWlmKGUucmVzcG9uc2VGaWVsZHNbb10mJihuW2UucmVzcG9uc2VGaWVsZHNbb11dPXQpLCF1JiZyJiZlLmRhdGFGaWx0ZXImJih0PWUuZGF0YUZpbHRlcih0LGUuZGF0YVR5cGUpKSx1PW8sbz1jLnNoaWZ0KCkpaWYoIioiPT09bylvPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09byl7aWYoIShhPWxbdSsiICIrb118fGxbIiogIitvXSkpZm9yKGkgaW4gbClpZigocz1pLnNwbGl0KCIgIikpWzFdPT09byYmKGE9bFt1KyIgIitzWzBdXXx8bFsiKiAiK3NbMF1dKSl7ITA9PT1hP2E9bFtpXTohMCE9PWxbaV0mJihvPXNbMF0sYy51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmZVsidGhyb3dzIl0pdD1hKHQpO2Vsc2UgdHJ5e3Q9YSh0KX1jYXRjaChlKXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjphP2U6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK299fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6dH19dy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOkN0LmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOlB0LnRlc3QoQ3QucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6JHQsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOncucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P3p0KHp0KGUsdy5hamF4U2V0dGluZ3MpLHQpOnp0KHcuYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkZ0KEl0KSxhamF4VHJhbnNwb3J0OkZ0KFd0KSxhamF4OmZ1bmN0aW9uKHQsbil7Im9iamVjdCI9PXR5cGVvZiB0JiYobj10LHQ9dm9pZCAwKSxuPW58fHt9O3ZhciBpLG8sYSxzLHUsbCxjLGYscCxkLGg9dy5hamF4U2V0dXAoe30sbiksZz1oLmNvbnRleHR8fGgseT1oLmNvbnRleHQmJihnLm5vZGVUeXBlfHxnLmpxdWVyeSk/dyhnKTp3LmV2ZW50LHY9dy5EZWZlcnJlZCgpLG09dy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikseD1oLnN0YXR1c0NvZGV8fHt9LGI9e30sVD17fSxDPSJjYW5jZWxlZCIsRT17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGMpe2lmKCFzKXtzPXt9O3doaWxlKHQ9T3QuZXhlYyhhKSlzW3RbMV0udG9Mb3dlckNhc2UoKV09dFsyXX10PXNbZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09dD9udWxsOnR9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBjP2E6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1jJiYoZT1UW2UudG9Mb3dlckNhc2UoKV09VFtlLnRvTG93ZXJDYXNlKCldfHxlLGJbZV09dCksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09YyYmKGgubWltZVR5cGU9ZSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihlKXt2YXIgdDtpZihlKWlmKGMpRS5hbHdheXMoZVtFLnN0YXR1c10pO2Vsc2UgZm9yKHQgaW4gZSl4W3RdPVt4W3RdLGVbdF1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHxDO3JldHVybiBpJiZpLmFib3J0KHQpLGsoMCx0KSx0aGlzfX07aWYodi5wcm9taXNlKEUpLGgudXJsPSgodHx8aC51cmx8fEN0LmhyZWYpKyIiKS5yZXBsYWNlKFJ0LEN0LnByb3RvY29sKyIvLyIpLGgudHlwZT1uLm1ldGhvZHx8bi50eXBlfHxoLm1ldGhvZHx8aC50eXBlLGguZGF0YVR5cGVzPShoLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goTSl8fFsiIl0sbnVsbD09aC5jcm9zc0RvbWFpbil7bD1yLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7bC5ocmVmPWgudXJsLGwuaHJlZj1sLmhyZWYsaC5jcm9zc0RvbWFpbj1CdC5wcm90b2NvbCsiLy8iK0J0Lmhvc3QhPWwucHJvdG9jb2wrIi8vIitsLmhvc3R9Y2F0Y2goZSl7aC5jcm9zc0RvbWFpbj0hMH19aWYoaC5kYXRhJiZoLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGguZGF0YSYmKGguZGF0YT13LnBhcmFtKGguZGF0YSxoLnRyYWRpdGlvbmFsKSksX3QoSXQsaCxuLEUpLGMpcmV0dXJuIEU7KGY9dy5ldmVudCYmaC5nbG9iYWwpJiYwPT13LmFjdGl2ZSsrJiZ3LmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGgudHlwZT1oLnR5cGUudG9VcHBlckNhc2UoKSxoLmhhc0NvbnRlbnQ9IU10LnRlc3QoaC50eXBlKSxvPWgudXJsLnJlcGxhY2UoTHQsIiIpLGguaGFzQ29udGVudD9oLmRhdGEmJmgucHJvY2Vzc0RhdGEmJjA9PT0oaC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoaC5kYXRhPWguZGF0YS5yZXBsYWNlKHF0LCIrIikpOihkPWgudXJsLnNsaWNlKG8ubGVuZ3RoKSxoLmRhdGEmJihoLnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIGguZGF0YSkmJihvKz0oa3QudGVzdChvKT8iJiI6Ij8iKStoLmRhdGEsZGVsZXRlIGguZGF0YSksITE9PT1oLmNhY2hlJiYobz1vLnJlcGxhY2UoSHQsIiQxIiksZD0oa3QudGVzdChvKT8iJiI6Ij8iKSsiXz0iK0V0KysrZCksaC51cmw9bytkKSxoLmlmTW9kaWZpZWQmJih3Lmxhc3RNb2RpZmllZFtvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsdy5sYXN0TW9kaWZpZWRbb10pLHcuZXRhZ1tvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIix3LmV0YWdbb10pKSwoaC5kYXRhJiZoLmhhc0NvbnRlbnQmJiExIT09aC5jb250ZW50VHlwZXx8bi5jb250ZW50VHlwZSkmJkUuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixoLmNvbnRlbnRUeXBlKSxFLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsaC5kYXRhVHlwZXNbMF0mJmguYWNjZXB0c1toLmRhdGFUeXBlc1swXV0/aC5hY2NlcHRzW2guZGF0YVR5cGVzWzBdXSsoIioiIT09aC5kYXRhVHlwZXNbMF0/IiwgIiskdCsiOyBxPTAuMDEiOiIiKTpoLmFjY2VwdHNbIioiXSk7Zm9yKHAgaW4gaC5oZWFkZXJzKUUuc2V0UmVxdWVzdEhlYWRlcihwLGguaGVhZGVyc1twXSk7aWYoaC5iZWZvcmVTZW5kJiYoITE9PT1oLmJlZm9yZVNlbmQuY2FsbChnLEUsaCl8fGMpKXJldHVybiBFLmFib3J0KCk7aWYoQz0iYWJvcnQiLG0uYWRkKGguY29tcGxldGUpLEUuZG9uZShoLnN1Y2Nlc3MpLEUuZmFpbChoLmVycm9yKSxpPV90KFd0LGgsbixFKSl7aWYoRS5yZWFkeVN0YXRlPTEsZiYmeS50cmlnZ2VyKCJhamF4U2VuZCIsW0UsaF0pLGMpcmV0dXJuIEU7aC5hc3luYyYmaC50aW1lb3V0PjAmJih1PWUuc2V0VGltZW91dChmdW5jdGlvbigpe0UuYWJvcnQoInRpbWVvdXQiKX0saC50aW1lb3V0KSk7dHJ5e2M9ITEsaS5zZW5kKGIsayl9Y2F0Y2goZSl7aWYoYyl0aHJvdyBlO2soLTEsZSl9fWVsc2UgaygtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gayh0LG4scixzKXt2YXIgbCxwLGQsYixULEM9bjtjfHwoYz0hMCx1JiZlLmNsZWFyVGltZW91dCh1KSxpPXZvaWQgMCxhPXN8fCIiLEUucmVhZHlTdGF0ZT10PjA/NDowLGw9dD49MjAwJiZ0PDMwMHx8MzA0PT09dCxyJiYoYj1YdChoLEUscikpLGI9VXQoaCxiLEUsbCksbD8oaC5pZk1vZGlmaWVkJiYoKFQ9RS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKSYmKHcubGFzdE1vZGlmaWVkW29dPVQpLChUPUUuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJih3LmV0YWdbb109VCkpLDIwND09PXR8fCJIRUFEIj09PWgudHlwZT9DPSJub2NvbnRlbnQiOjMwND09PXQ/Qz0ibm90bW9kaWZpZWQiOihDPWIuc3RhdGUscD1iLmRhdGEsbD0hKGQ9Yi5lcnJvcikpKTooZD1DLCF0JiZDfHwoQz0iZXJyb3IiLHQ8MCYmKHQ9MCkpKSxFLnN0YXR1cz10LEUuc3RhdHVzVGV4dD0obnx8QykrIiIsbD92LnJlc29sdmVXaXRoKGcsW3AsQyxFXSk6di5yZWplY3RXaXRoKGcsW0UsQyxkXSksRS5zdGF0dXNDb2RlKHgpLHg9dm9pZCAwLGYmJnkudHJpZ2dlcihsPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW0UsaCxsP3A6ZF0pLG0uZmlyZVdpdGgoZyxbRSxDXSksZiYmKHkudHJpZ2dlcigiYWpheENvbXBsZXRlIixbRSxoXSksLS13LmFjdGl2ZXx8dy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIEV9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB3LmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdy5nZXQoZSx2b2lkIDAsdCwic2NyaXB0Iil9fSksdy5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsdCl7d1t0XT1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4gZyhuKSYmKGk9aXx8cixyPW4sbj12b2lkIDApLHcuYWpheCh3LmV4dGVuZCh7dXJsOmUsdHlwZTp0LGRhdGFUeXBlOmksZGF0YTpuLHN1Y2Nlc3M6cn0sdy5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSksdy5fZXZhbFVybD1mdW5jdGlvbihlKXtyZXR1cm4gdy5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSx3LmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpc1swXSYmKGcoZSkmJihlPWUuY2FsbCh0aGlzWzBdKSksdD13KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihlKXtyZXR1cm4gZyhlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7dyh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dyh0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD1nKGUpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7dyh0aGlzKS53cmFwQWxsKHQ/ZS5jYWxsKHRoaXMsbik6ZSl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7dyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSx3LmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIXcuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LHcuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSx3LmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBWdD17MDoyMDAsMTIyMzoyMDR9LEd0PXcuYWpheFNldHRpbmdzLnhocigpO2guY29ycz0hIUd0JiYid2l0aENyZWRlbnRpYWxzImluIEd0LGguYWpheD1HdD0hIUd0LHcuYWpheFRyYW5zcG9ydChmdW5jdGlvbih0KXt2YXIgbixyO2lmKGguY29yc3x8R3QmJiF0LmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGksbyl7dmFyIGEscz10LnhocigpO2lmKHMub3Blbih0LnR5cGUsdC51cmwsdC5hc3luYyx0LnVzZXJuYW1lLHQucGFzc3dvcmQpLHQueGhyRmllbGRzKWZvcihhIGluIHQueGhyRmllbGRzKXNbYV09dC54aHJGaWVsZHNbYV07dC5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUodC5taW1lVHlwZSksdC5jcm9zc0RvbWFpbnx8aVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoaVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihhIGluIGkpcy5zZXRSZXF1ZXN0SGVhZGVyKGEsaVthXSk7bj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtuJiYobj1yPXMub25sb2FkPXMub25lcnJvcj1zLm9uYWJvcnQ9cy5vbnRpbWVvdXQ9cy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09ZT9zLmFib3J0KCk6ImVycm9yIj09PWU/Im51bWJlciIhPXR5cGVvZiBzLnN0YXR1cz9vKDAsImVycm9yIik6byhzLnN0YXR1cyxzLnN0YXR1c1RleHQpOm8oVnRbcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInRleHQiIT09KHMucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHMucmVzcG9uc2VUZXh0P3tiaW5hcnk6cy5yZXNwb25zZX06e3RleHQ6cy5yZXNwb25zZVRleHR9LHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPW4oKSxyPXMub25lcnJvcj1zLm9udGltZW91dD1uKCJlcnJvciIpLHZvaWQgMCE9PXMub25hYm9ydD9zLm9uYWJvcnQ9cjpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1zLnJlYWR5U3RhdGUmJmUuc2V0VGltZW91dChmdW5jdGlvbigpe24mJnIoKX0pfSxuPW4oImFib3J0Iik7dHJ5e3Muc2VuZCh0Lmhhc0NvbnRlbnQmJnQuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYobil0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX0pLHcuYWpheFByZWZpbHRlcihmdW5jdGlvbihlKXtlLmNyb3NzRG9tYWluJiYoZS5jb250ZW50cy5zY3JpcHQ9ITEpfSksdy5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZ2xvYmFsRXZhbChlKSxlfX19KSx3LmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS5jYWNoZSYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9IkdFVCIpfSksdy5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2lmKGUuY3Jvc3NEb21haW4pe3ZhciB0LG47cmV0dXJue3NlbmQ6ZnVuY3Rpb24oaSxvKXt0PXcoIjxzY3JpcHQ+IikucHJvcCh7Y2hhcnNldDplLnNjcmlwdENoYXJzZXQsc3JjOmUudXJsfSkub24oImxvYWQgZXJyb3IiLG49ZnVuY3Rpb24oZSl7dC5yZW1vdmUoKSxuPW51bGwsZSYmbygiZXJyb3IiPT09ZS50eXBlPzQwNDoyMDAsZS50eXBlKX0pLHIuaGVhZC5hcHBlbmRDaGlsZCh0WzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX19KTt2YXIgWXQ9W10sUXQ9Lyg9KVw/KD89JnwkKXxcP1w/Lzt3LmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9WXQucG9wKCl8fHcuZXhwYW5kbysiXyIrRXQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLHcuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24odCxuLHIpe3ZhciBpLG8sYSxzPSExIT09dC5qc29ucCYmKFF0LnRlc3QodC51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgdC5kYXRhJiYwPT09KHQuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmUXQudGVzdCh0LmRhdGEpJiYiZGF0YSIpO2lmKHN8fCJqc29ucCI9PT10LmRhdGFUeXBlc1swXSlyZXR1cm4gaT10Lmpzb25wQ2FsbGJhY2s9Zyh0Lmpzb25wQ2FsbGJhY2spP3QuanNvbnBDYWxsYmFjaygpOnQuanNvbnBDYWxsYmFjayxzP3Rbc109dFtzXS5yZXBsYWNlKFF0LCIkMSIraSk6ITEhPT10Lmpzb25wJiYodC51cmwrPShrdC50ZXN0KHQudXJsKT8iJiI6Ij8iKSt0Lmpzb25wKyI9IitpKSx0LmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gYXx8dy5lcnJvcihpKyIgd2FzIG5vdCBjYWxsZWQiKSxhWzBdfSx0LmRhdGFUeXBlc1swXT0ianNvbiIsbz1lW2ldLGVbaV09ZnVuY3Rpb24oKXthPWFyZ3VtZW50c30sci5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1vP3coZSkucmVtb3ZlUHJvcChpKTplW2ldPW8sdFtpXSYmKHQuanNvbnBDYWxsYmFjaz1uLmpzb25wQ2FsbGJhY2ssWXQucHVzaChpKSksYSYmZyhvKSYmbyhhWzBdKSxhPW89dm9pZCAwfSksInNjcmlwdCJ9KSxoLmNyZWF0ZUhUTUxEb2N1bWVudD1mdW5jdGlvbigpe3ZhciBlPXIuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5O3JldHVybiBlLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1lLmNoaWxkTm9kZXMubGVuZ3RofSgpLHcucGFyc2VIVE1MPWZ1bmN0aW9uKGUsdCxuKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuW107ImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKTt2YXIgaSxvLGE7cmV0dXJuIHR8fChoLmNyZWF0ZUhUTUxEb2N1bWVudD8oKGk9KHQ9ci5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpKS5jcmVhdGVFbGVtZW50KCJiYXNlIikpLmhyZWY9ci5sb2NhdGlvbi5ocmVmLHQuaGVhZC5hcHBlbmRDaGlsZChpKSk6dD1yKSxvPUEuZXhlYyhlKSxhPSFuJiZbXSxvP1t0LmNyZWF0ZUVsZW1lbnQob1sxXSldOihvPXhlKFtlXSx0LGEpLGEmJmEubGVuZ3RoJiZ3KGEpLnJlbW92ZSgpLHcubWVyZ2UoW10sby5jaGlsZE5vZGVzKSl9LHcuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybiBzPi0xJiYocj12dChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksZyh0KT8obj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksYS5sZW5ndGg+MCYmdy5hamF4KHt1cmw6ZSx0eXBlOml8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP3coIjxkaXY+IikuYXBwZW5kKHcucGFyc2VIVE1MKGUpKS5maW5kKHIpOmUpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pfSksdGhpc30sdy5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oZSx0KXt3LmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksdy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZ3JlcCh3LnRpbWVycyxmdW5jdGlvbih0KXtyZXR1cm4gZT09PXQuZWxlbX0pLmxlbmd0aH0sdy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYz13LmNzcyhlLCJwb3NpdGlvbiIpLGY9dyhlKSxwPXt9OyJzdGF0aWMiPT09YyYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1mLm9mZnNldCgpLG89dy5jc3MoZSwidG9wIiksdT13LmNzcyhlLCJsZWZ0IiksKGw9KCJhYnNvbHV0ZSI9PT1jfHwiZml4ZWQiPT09YykmJihvK3UpLmluZGV4T2YoImF1dG8iKT4tMSk/KGE9KHI9Zi5wb3NpdGlvbigpKS50b3AsaT1yLmxlZnQpOihhPXBhcnNlRmxvYXQobyl8fDAsaT1wYXJzZUZsb2F0KHUpfHwwKSxnKHQpJiYodD10LmNhbGwoZSxuLHcuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihwLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihwLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxwKTpmLmNzcyhwKX19LHcuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oZSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt3Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIHQsbixyPXRoaXNbMF07aWYocilyZXR1cm4gci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8odD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6dC50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OnQubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH19LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxpPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT13LmNzcyhyLCJwb3NpdGlvbiIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT13LmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5wYXJlbnROb2RlO2UmJmUhPT1yJiYxPT09ZS5ub2RlVHlwZSYmKChpPXcoZSkub2Zmc2V0KCkpLnRvcCs9dy5jc3MoZSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxpLmxlZnQrPXcuY3NzKGUsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOnQudG9wLWkudG9wLXcuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LWkubGVmdC13LmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmInN0YXRpYyI9PT13LmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV8fGJlfSl9fSksdy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIG49InBhZ2VZT2Zmc2V0Ij09PXQ7dy5mbltlXT1mdW5jdGlvbihyKXtyZXR1cm4geih0aGlzLGZ1bmN0aW9uKGUscixpKXt2YXIgbztpZih5KGUpP289ZTo5PT09ZS5ub2RlVHlwZSYmKG89ZS5kZWZhdWx0Vmlldyksdm9pZCAwPT09aSlyZXR1cm4gbz9vW3RdOmVbcl07bz9vLnNjcm9sbFRvKG4/by5wYWdlWE9mZnNldDppLG4/aTpvLnBhZ2VZT2Zmc2V0KTplW3JdPWl9LGUscixhcmd1bWVudHMubGVuZ3RoKX19KSx3LmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSx0KXt3LmNzc0hvb2tzW3RdPV9lKGgucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLG4pe2lmKG4pcmV0dXJuIG49RmUoZSx0KSxXZS50ZXN0KG4pP3coZSkucG9zaXRpb24oKVt0XSsicHgiOm59KX0pLHcuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsdCl7dy5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50OnQsIiI6Im91dGVyIitlfSxmdW5jdGlvbihuLHIpe3cuZm5bcl09ZnVuY3Rpb24oaSxvKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2YgaSkscz1ufHwoITA9PT1pfHwhMD09PW8/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB6KHRoaXMsZnVuY3Rpb24odCxuLGkpe3ZhciBvO3JldHVybiB5KHQpPzA9PT1yLmluZGV4T2YoIm91dGVyIik/dFsiaW5uZXIiK2VdOnQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2VdOjk9PT10Lm5vZGVUeXBlPyhvPXQuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KHQuYm9keVsic2Nyb2xsIitlXSxvWyJzY3JvbGwiK2VdLHQuYm9keVsib2Zmc2V0IitlXSxvWyJvZmZzZXQiK2VdLG9bImNsaWVudCIrZV0pKTp2b2lkIDA9PT1pP3cuY3NzKHQsbixzKTp3LnN0eWxlKHQsbixpLHMpfSx0LGE/aTp2b2lkIDAsYSl9fSl9KSx3LmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXt3LmZuW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKHQsbnVsbCxlLG4pOnRoaXMudHJpZ2dlcih0KX19KSx3LmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9fSksdy5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9uKGUsbnVsbCx0LG4pfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vZmYoZSxudWxsLHQpfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwiKioiLG4pfX0pLHcucHJveHk9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYobj1lW3RdLHQ9ZSxlPW4pLGcoZSkpcmV0dXJuIHI9by5jYWxsKGFyZ3VtZW50cywyKSxpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChvLmNhbGwoYXJndW1lbnRzKSkpfSxpLmd1aWQ9ZS5ndWlkPWUuZ3VpZHx8dy5ndWlkKyssaX0sdy5ob2xkUmVhZHk9ZnVuY3Rpb24oZSl7ZT93LnJlYWR5V2FpdCsrOncucmVhZHkoITApfSx3LmlzQXJyYXk9QXJyYXkuaXNBcnJheSx3LnBhcnNlSlNPTj1KU09OLnBhcnNlLHcubm9kZU5hbWU9Tix3LmlzRnVuY3Rpb249Zyx3LmlzV2luZG93PXksdy5jYW1lbENhc2U9Ryx3LnR5cGU9eCx3Lm5vdz1EYXRlLm5vdyx3LmlzTnVtZXJpYz1mdW5jdGlvbihlKXt2YXIgdD13LnR5cGUoZSk7cmV0dXJuKCJudW1iZXIiPT09dHx8InN0cmluZyI9PT10KSYmIWlzTmFOKGUtcGFyc2VGbG9hdChlKSl9LCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB3fSk7dmFyIEp0PWUualF1ZXJ5LEt0PWUuJDtyZXR1cm4gdy5ub0NvbmZsaWN0PWZ1bmN0aW9uKHQpe3JldHVybiBlLiQ9PT13JiYoZS4kPUt0KSx0JiZlLmpRdWVyeT09PXcmJihlLmpRdWVyeT1KdCksd30sdHx8KGUualF1ZXJ5PWUuJD13KSx3fSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAqIGpRdWVyeSBUZW1wbGF0ZXMgUGx1Z2luIDEuMC4wcHJlCiAqIGh0dHA6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdG1wbAogKiBSZXF1aXJlcyBqUXVlcnkgMS40LjIKICoKICogQ29weXJpZ2h0IFNvZnR3YXJlIEZyZWVkb20gQ29uc2VydmFuY3ksIEluYy4KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICovCihmdW5jdGlvbihhKXt2YXIgcj1hLmZuLmRvbU1hbmlwLGQ9Il90bXBsaXRlbSIscT0vXltePF0qKDxbXHdcV10rPilbXj5dKiR8XHtce1whIC8sYj17fSxmPXt9LGUscD17a2V5OjAsZGF0YTp7fX0saT0wLGM9MCxsPVtdO2Z1bmN0aW9uIGcoZyxkLGgsZSl7dmFyIGM9e2RhdGE6ZXx8KGU9PT0wfHxlPT09ZmFsc2UpP2U6ZD9kLmRhdGE6e30sX3dyYXA6ZD9kLl93cmFwOm51bGwsdG1wbDpudWxsLHBhcmVudDpkfHxudWxsLG5vZGVzOltdLGNhbGxzOnUsbmVzdDp3LHdyYXA6eCxodG1sOnYsdXBkYXRlOnR9O2cmJmEuZXh0ZW5kKGMsZyx7bm9kZXM6W10scGFyZW50OmR9KTtpZihoKXtjLnRtcGw9aDtjLl9jdG50PWMuX2N0bnR8fGMudG1wbChhLGMpO2Mua2V5PSsraTsobC5sZW5ndGg/ZjpiKVtpXT1jfXJldHVybiBjfWEuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGYsZCl7YS5mbltmXT1mdW5jdGlvbihuKXt2YXIgZz1bXSxpPWEobiksayxoLG0sbCxqPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2U9Ynx8e307aWYoaiYmai5ub2RlVHlwZT09PTExJiZqLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmaS5sZW5ndGg9PT0xKXtpW2RdKHRoaXNbMF0pO2c9dGhpc31lbHNle2ZvcihoPTAsbT1pLmxlbmd0aDtoPG07aCsrKXtjPWg7az0oaD4wP3RoaXMuY2xvbmUodHJ1ZSk6dGhpcykuZ2V0KCk7YShpW2hdKVtkXShrKTtnPWcuY29uY2F0KGspfWM9MDtnPXRoaXMucHVzaFN0YWNrKGcsZixpLnNlbGVjdG9yKX1sPWU7ZT1udWxsO2EudG1wbC5jb21wbGV0ZShsKTtyZXR1cm4gZ319KTthLmZuLmV4dGVuZCh7dG1wbDpmdW5jdGlvbihkLGMsYil7cmV0dXJuIGEudG1wbCh0aGlzWzBdLGQsYyxiKX0sdG1wbEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gYS50bXBsSXRlbSh0aGlzWzBdKX0sdGVtcGxhdGU6ZnVuY3Rpb24oYil7cmV0dXJuIGEudGVtcGxhdGUoYix0aGlzWzBdKX0sZG9tTWFuaXA6ZnVuY3Rpb24oZCxtLGspe2lmKGRbMF0mJmEuaXNBcnJheShkWzBdKSl7dmFyIGc9YS5tYWtlQXJyYXkoYXJndW1lbnRzKSxoPWRbMF0saj1oLmxlbmd0aCxpPTAsZjt3aGlsZShpPGomJiEoZj1hLmRhdGEoaFtpKytdLCJ0bXBsSXRlbSIpKSk7aWYoZiYmYylnWzJdPWZ1bmN0aW9uKGIpe2EudG1wbC5hZnRlck1hbmlwKHRoaXMsYixrKX07ci5hcHBseSh0aGlzLGcpfWVsc2Ugci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Yz0wOyFlJiZhLnRtcGwuY29tcGxldGUoYik7cmV0dXJuIHRoaXN9fSk7YS5leHRlbmQoe3RtcGw6ZnVuY3Rpb24oZCxoLGUsYyl7dmFyIGksaz0hYztpZihrKXtjPXA7ZD1hLnRlbXBsYXRlW2RdfHxhLnRlbXBsYXRlKG51bGwsZCk7Zj17fX1lbHNlIGlmKCFkKXtkPWMudG1wbDtiW2Mua2V5XT1jO2Mubm9kZXM9W107Yy53cmFwcGVkJiZuKGMsYy53cmFwcGVkKTtyZXR1cm4gYShqKGMsbnVsbCxjLnRtcGwoYSxjKSkpfWlmKCFkKXJldHVybltdO2lmKHR5cGVvZiBoPT09ImZ1bmN0aW9uIiloPWguY2FsbChjfHx7fSk7ZSYmZS53cmFwcGVkJiZuKGUsZS53cmFwcGVkKTtpPWEuaXNBcnJheShoKT9hLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhP2coZSxjLGQsYSk6bnVsbH0pOltnKGUsYyxkLGgpXTtyZXR1cm4gaz9hKGooYyxudWxsLGkpKTppfSx0bXBsSXRlbTpmdW5jdGlvbihiKXt2YXIgYztpZihiIGluc3RhbmNlb2YgYSliPWJbMF07d2hpbGUoYiYmYi5ub2RlVHlwZT09PTEmJiEoYz1hLmRhdGEoYiwidG1wbEl0ZW0iKSkmJihiPWIucGFyZW50Tm9kZSkpO3JldHVybiBjfHxwfSx0ZW1wbGF0ZTpmdW5jdGlvbihjLGIpe2lmKGIpe2lmKHR5cGVvZiBiPT09InN0cmluZyIpYj1vKGIpO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIGEpYj1iWzBdfHx7fTtpZihiLm5vZGVUeXBlKWI9YS5kYXRhKGIsInRtcGwiKXx8YS5kYXRhKGIsInRtcGwiLG8oYi5pbm5lckhUTUwpKTtyZXR1cm4gdHlwZW9mIGM9PT0ic3RyaW5nIj8oYS50ZW1wbGF0ZVtjXT1iKTpifXJldHVybiBjP3R5cGVvZiBjIT09InN0cmluZyI/YS50ZW1wbGF0ZShudWxsLGMpOmEudGVtcGxhdGVbY118fGEudGVtcGxhdGUobnVsbCxxLnRlc3QoYyk/YzphKGMpKTpudWxsfSxlbmNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuKCIiK2EpLnNwbGl0KCImIikuam9pbigiJmFtcDsiKS5zcGxpdCgiPCIpLmpvaW4oIiZsdDsiKS5zcGxpdCgiPiIpLmpvaW4oIiZndDsiKS5zcGxpdCgnIicpLmpvaW4oIiYjMzQ7Iikuc3BsaXQoIiciKS5qb2luKCImIzM5OyIpfX0pO2EuZXh0ZW5kKGEudG1wbCx7dGFnOnt0bXBsOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiJpZigkbm90bnVsbF8xKXtfXz1fXy5jb25jYXQoJGl0ZW0ubmVzdCgkMSwkMikpO30ifSx3cmFwOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiIkaXRlbS5jYWxscyhfXywkMSwkMik7X189W107IixjbG9zZToiY2FsbD0kaXRlbS5jYWxscygpO19fPWNhbGwuXy5jb25jYXQoJGl0ZW0ud3JhcChjYWxsLF9fKSk7In0sZWFjaDp7X2RlZmF1bHQ6eyQyOiIkaW5kZXgsICR2YWx1ZSJ9LG9wZW46ImlmKCRub3RudWxsXzEpeyQuZWFjaCgkMWEsZnVuY3Rpb24oJDIpe3dpdGgodGhpcyl7IixjbG9zZToifX0pO30ifSwiaWYiOntvcGVuOiJpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsiLGNsb3NlOiJ9In0sImVsc2UiOntfZGVmYXVsdDp7JDE6InRydWUifSxvcGVuOiJ9ZWxzZSBpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsifSxodG1sOntvcGVuOiJpZigkbm90bnVsbF8xKXtfXy5wdXNoKCQxYSk7fSJ9LCI9Ijp7X2RlZmF1bHQ6eyQxOiIkZGF0YSJ9LG9wZW46ImlmKCRub3RudWxsXzEpe19fLnB1c2goJC5lbmNvZGUoJDFhKSk7fSJ9LCIhIjp7b3BlbjoiIn19LGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yj17fX0sYWZ0ZXJNYW5pcDpmdW5jdGlvbihmLGIsZCl7dmFyIGU9Yi5ub2RlVHlwZT09PTExP2EubWFrZUFycmF5KGIuY2hpbGROb2Rlcyk6Yi5ub2RlVHlwZT09PTE/W2JdOltdO2QuY2FsbChmLGIpO20oZSk7YysrfX0pO2Z1bmN0aW9uIGooZSxnLGYpe3ZhciBiLGM9Zj9hLm1hcChmLGZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2Uua2V5P2EucmVwbGFjZSgvKDxcdyspKD89W1xzPl0pKD8hW14+XSpfdG1wbGl0ZW0pKFtePl0qKS9nLCIkMSAiK2QrJz0iJytlLmtleSsnIiAkMicpOmE6aihhLGUsYS5fY3RudCl9KTplO2lmKGcpcmV0dXJuIGM7Yz1jLmpvaW4oIiIpO2MucmVwbGFjZSgvXlxzKihbXjxcc11bXjxdKik/KDxbXHdcV10rPikoW14+XSpbXj5cc10pP1xzKiQvLGZ1bmN0aW9uKGYsYyxlLGQpe2I9YShlKS5nZXQoKTttKGIpO2lmKGMpYj1rKGMpLmNvbmNhdChiKTtpZihkKWI9Yi5jb25jYXQoayhkKSl9KTtyZXR1cm4gYj9iOmsoYyl9ZnVuY3Rpb24gayhjKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlubmVySFRNTD1jO3JldHVybiBhLm1ha2VBcnJheShiLmNoaWxkTm9kZXMpfWZ1bmN0aW9uIG8oYil7cmV0dXJuIG5ldyBGdW5jdGlvbigialF1ZXJ5IiwiJGl0ZW0iLCJ2YXIgJD1qUXVlcnksY2FsbCxfXz1bXSwkZGF0YT0kaXRlbS5kYXRhO3dpdGgoJGRhdGEpe19fLnB1c2goJyIrYS50cmltKGIpLnJlcGxhY2UoLyhbXFwnXSkvZywiXFwkMSIpLnJlcGxhY2UoL1tcclx0XG5dL2csIiAiKS5yZXBsYWNlKC9cJFx7KFteXH1dKilcfS9nLCJ7ez0gJDF9fSIpLnJlcGxhY2UoL1x7XHsoXC8/KShcdyt8LikoPzpcKCgoPzpbXlx9XXxcfSg/IVx9KSkqPyk/XCkpPyg/OlxzKyguKj8pPyk/KFwoKCg/OlteXH1dfFx9KD8hXH0pKSo/KVwpKT9ccypcfVx9L2csZnVuY3Rpb24obSxsLGssZyxiLGMsZCl7dmFyIGo9YS50bXBsLnRhZ1trXSxpLGUsZjtpZighail0aHJvdyJVbmtub3duIHRlbXBsYXRlIHRhZzogIitrO2k9ai5fZGVmYXVsdHx8W107aWYoYyYmIS9cdyQvLnRlc3QoYikpe2IrPWM7Yz0iIn1pZihiKXtiPWgoYik7ZD1kPyIsIitoKGQpKyIpIjpjPyIpIjoiIjtlPWM/Yi5pbmRleE9mKCIuIik+LTE/YitoKGMpOiIoIitiKyIpLmNhbGwoJGl0ZW0iK2Q6YjtmPWM/ZToiKHR5cGVvZigiK2IrIik9PT0nZnVuY3Rpb24nPygiK2IrIikuY2FsbCgkaXRlbSk6KCIrYisiKSkifWVsc2UgZj1lPWkuJDF8fCJudWxsIjtnPWgoZyk7cmV0dXJuIicpOyIraltsPyJjbG9zZSI6Im9wZW4iXS5zcGxpdCgiJG5vdG51bGxfMSIpLmpvaW4oYj8idHlwZW9mKCIrYisiKSE9PSd1bmRlZmluZWQnICYmICgiK2IrIikhPW51bGwiOiJ0cnVlIikuc3BsaXQoIiQxYSIpLmpvaW4oZikuc3BsaXQoIiQxIikuam9pbihlKS5zcGxpdCgiJDIiKS5qb2luKGd8fGkuJDJ8fCIiKSsiX18ucHVzaCgnIn0pKyInKTt9cmV0dXJuIF9fOyIpfWZ1bmN0aW9uIG4oYyxiKXtjLl93cmFwPWooYyx0cnVlLGEuaXNBcnJheShiKT9iOltxLnRlc3QoYik/YjphKGIpLmh0bWwoKV0pLmpvaW4oIiIpfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGE/YS5yZXBsYWNlKC9cXCcvZywiJyIpLnJlcGxhY2UoL1xcXFwvZywiXFwiKTpudWxsfWZ1bmN0aW9uIHMoYil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5hcHBlbmRDaGlsZChiLmNsb25lTm9kZSh0cnVlKSk7cmV0dXJuIGEuaW5uZXJIVE1MfWZ1bmN0aW9uIG0obyl7dmFyIG49Il8iK2MsayxqLGw9e30sZSxwLGg7Zm9yKGU9MCxwPW8ubGVuZ3RoO2U8cDtlKyspe2lmKChrPW9bZV0pLm5vZGVUeXBlIT09MSljb250aW51ZTtqPWsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTtmb3IoaD1qLmxlbmd0aC0xO2g+PTA7aC0tKW0oaltoXSk7bShrKX1mdW5jdGlvbiBtKGope3ZhciBwLGg9aixrLGUsbTtpZihtPWouZ2V0QXR0cmlidXRlKGQpKXt3aGlsZShoLnBhcmVudE5vZGUmJihoPWgucGFyZW50Tm9kZSkubm9kZVR5cGU9PT0xJiYhKHA9aC5nZXRBdHRyaWJ1dGUoZCkpKTtpZihwIT09bSl7aD1oLnBhcmVudE5vZGU/aC5ub2RlVHlwZT09PTExPzA6aC5nZXRBdHRyaWJ1dGUoZCl8fDA6MDtpZighKGU9YlttXSkpe2U9ZlttXTtlPWcoZSxiW2hdfHxmW2hdKTtlLmtleT0rK2k7YltpXT1lfWMmJm8obSl9ai5yZW1vdmVBdHRyaWJ1dGUoZCl9ZWxzZSBpZihjJiYoZT1hLmRhdGEoaiwidG1wbEl0ZW0iKSkpe28oZS5rZXkpO2JbZS5rZXldPWU7aD1hLmRhdGEoai5wYXJlbnROb2RlLCJ0bXBsSXRlbSIpO2g9aD9oLmtleTowfWlmKGUpe2s9ZTt3aGlsZShrJiZrLmtleSE9aCl7ay5ub2Rlcy5wdXNoKGopO2s9ay5wYXJlbnR9ZGVsZXRlIGUuX2N0bnQ7ZGVsZXRlIGUuX3dyYXA7YS5kYXRhKGosInRtcGxJdGVtIixlKX1mdW5jdGlvbiBvKGEpe2E9YStuO2U9bFthXT1sW2FdfHxnKGUsYltlLnBhcmVudC5rZXkrbl18fGUucGFyZW50KX19fWZ1bmN0aW9uIHUoYSxkLGMsYil7aWYoIWEpcmV0dXJuIGwucG9wKCk7bC5wdXNoKHtfOmEsdG1wbDpkLGl0ZW06dGhpcyxkYXRhOmMsb3B0aW9uczpifSl9ZnVuY3Rpb24gdyhkLGMsYil7cmV0dXJuIGEudG1wbChhLnRlbXBsYXRlKGQpLGMsYix0aGlzKX1mdW5jdGlvbiB4KGIsZCl7dmFyIGM9Yi5vcHRpb25zfHx7fTtjLndyYXBwZWQ9ZDtyZXR1cm4gYS50bXBsKGEudGVtcGxhdGUoYi50bXBsKSxiLmRhdGEsYyxiLml0ZW0pfWZ1bmN0aW9uIHYoZCxjKXt2YXIgYj10aGlzLl93cmFwO3JldHVybiBhLm1hcChhKGEuaXNBcnJheShiKT9iLmpvaW4oIiIpOmIpLmZpbHRlcihkfHwiKiIpLGZ1bmN0aW9uKGEpe3JldHVybiBjP2EuaW5uZXJUZXh0fHxhLnRleHRDb250ZW50OmEub3V0ZXJIVE1MfHxzKGEpfSl9ZnVuY3Rpb24gdCgpe3ZhciBiPXRoaXMubm9kZXM7YS50bXBsKG51bGwsbnVsbCxudWxsLHRoaXMpLmluc2VydEJlZm9yZShiWzBdKTthKGIpLnJlbW92ZSgpfX0pKGpRdWVyeSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiFmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImpxdWVyeSJdLGUpOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUocmVxdWlyZSgianF1ZXJ5IikpOmUoalF1ZXJ5KX0oZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1lLnRhYmxlc29ydGVyPXt2ZXJzaW9uOiIyLjMwLjUiLHBhcnNlcnM6W10sd2lkZ2V0czpbXSxkZWZhdWx0czp7dGhlbWU6ImRlZmF1bHQiLHdpZHRoRml4ZWQ6ITEsc2hvd1Byb2Nlc3Npbmc6ITEsaGVhZGVyVGVtcGxhdGU6Intjb250ZW50fSIsb25SZW5kZXJUZW1wbGF0ZTpudWxsLG9uUmVuZGVySGVhZGVyOm51bGwsY2FuY2VsU2VsZWN0aW9uOiEwLHRhYkluZGV4OiEwLGRhdGVGb3JtYXQ6Im1tZGR5eXl5Iixzb3J0TXVsdGlTb3J0S2V5OiJzaGlmdEtleSIsc29ydFJlc2V0S2V5OiJjdHJsS2V5Iix1c051bWJlckZvcm1hdDohMCxkZWxheUluaXQ6ITEsc2VydmVyU2lkZVNvcnRpbmc6ITEscmVzb3J0OiEwLGhlYWRlcnM6e30saWdub3JlQ2FzZTohMCxzb3J0Rm9yY2U6bnVsbCxzb3J0TGlzdDpbXSxzb3J0QXBwZW5kOm51bGwsc29ydFN0YWJsZTohMSxzb3J0SW5pdGlhbE9yZGVyOiJhc2MiLHNvcnRMb2NhbGVDb21wYXJlOiExLHNvcnRSZXNldDohMSxzb3J0UmVzdGFydDohMSxlbXB0eVRvOiJib3R0b20iLHN0cmluZ1RvOiJtYXgiLGR1cGxpY2F0ZVNwYW46ITAsdGV4dEV4dHJhY3Rpb246ImJhc2ljIix0ZXh0QXR0cmlidXRlOiJkYXRhLXRleHQiLHRleHRTb3J0ZXI6bnVsbCxudW1iZXJTb3J0ZXI6bnVsbCxpbml0V2lkZ2V0czohMCx3aWRnZXRDbGFzczoid2lkZ2V0LXtuYW1lfSIsd2lkZ2V0czpbXSx3aWRnZXRPcHRpb25zOnt6ZWJyYTpbImV2ZW4iLCJvZGQiXX0saW5pdGlhbGl6ZWQ6bnVsbCx0YWJsZUNsYXNzOiIiLGNzc0FzYzoiIixjc3NEZXNjOiIiLGNzc05vbmU6IiIsY3NzSGVhZGVyOiIiLGNzc0hlYWRlclJvdzoiIixjc3NQcm9jZXNzaW5nOiIiLGNzc0NoaWxkUm93OiJ0YWJsZXNvcnRlci1jaGlsZFJvdyIsY3NzSW5mb0Jsb2NrOiJ0YWJsZXNvcnRlci1pbmZvT25seSIsY3NzTm9Tb3J0OiJ0YWJsZXNvcnRlci1ub1NvcnQiLGNzc0lnbm9yZVJvdzoidGFibGVzb3J0ZXItaWdub3JlUm93Iixjc3NJY29uOiJ0YWJsZXNvcnRlci1pY29uIixjc3NJY29uTm9uZToiIixjc3NJY29uQXNjOiIiLGNzc0ljb25EZXNjOiIiLGNzc0ljb25EaXNhYmxlZDoiIixwb2ludGVyQ2xpY2s6ImNsaWNrIixwb2ludGVyRG93bjoibW91c2Vkb3duIixwb2ludGVyVXA6Im1vdXNldXAiLHNlbGVjdG9ySGVhZGVyczoiPiB0aGVhZCB0aCwgPiB0aGVhZCB0ZCIsc2VsZWN0b3JTb3J0OiJ0aCwgdGQiLHNlbGVjdG9yUmVtb3ZlOiIucmVtb3ZlLW1lIixkZWJ1ZzohMSxoZWFkZXJMaXN0OltdLGVtcHRpZXM6e30sc3RyaW5nczp7fSxwYXJzZXJzOltdLGdsb2JhbGl6ZTowLGltZ0F0dHI6MH0sY3NzOnt0YWJsZToidGFibGVzb3J0ZXIiLGNzc0hhc0NoaWxkOiJ0YWJsZXNvcnRlci1oYXNDaGlsZFJvdyIsY2hpbGRSb3c6InRhYmxlc29ydGVyLWNoaWxkUm93Iixjb2xncm91cDoidGFibGVzb3J0ZXItY29sZ3JvdXAiLGhlYWRlcjoidGFibGVzb3J0ZXItaGVhZGVyIixoZWFkZXJSb3c6InRhYmxlc29ydGVyLWhlYWRlclJvdyIsaGVhZGVySW46InRhYmxlc29ydGVyLWhlYWRlci1pbm5lciIsaWNvbjoidGFibGVzb3J0ZXItaWNvbiIscHJvY2Vzc2luZzoidGFibGVzb3J0ZXItcHJvY2Vzc2luZyIsc29ydEFzYzoidGFibGVzb3J0ZXItaGVhZGVyQXNjIixzb3J0RGVzYzoidGFibGVzb3J0ZXItaGVhZGVyRGVzYyIsc29ydE5vbmU6InRhYmxlc29ydGVyLWhlYWRlclVuU29ydGVkIn0sbGFuZ3VhZ2U6e3NvcnRBc2M6IkFzY2VuZGluZyBzb3J0IGFwcGxpZWQsICIsc29ydERlc2M6IkRlc2NlbmRpbmcgc29ydCBhcHBsaWVkLCAiLHNvcnROb25lOiJObyBzb3J0IGFwcGxpZWQsICIsc29ydERpc2FibGVkOiJzb3J0aW5nIGlzIGRpc2FibGVkIixuZXh0QXNjOiJhY3RpdmF0ZSB0byBhcHBseSBhbiBhc2NlbmRpbmcgc29ydCIsbmV4dERlc2M6ImFjdGl2YXRlIHRvIGFwcGx5IGEgZGVzY2VuZGluZyBzb3J0IixuZXh0Tm9uZToiYWN0aXZhdGUgdG8gcmVtb3ZlIHRoZSBzb3J0In0scmVnZXg6e3RlbXBsYXRlQ29udGVudDovXHtjb250ZW50XH0vZyx0ZW1wbGF0ZUljb246L1x7aWNvblx9L2csdGVtcGxhdGVOYW1lOi9ce25hbWVcfS9pLHNwYWNlczovXHMrL2csbm9uV29yZDovXFcvZyxmb3JtRWxlbWVudHM6LyhpbnB1dHxzZWxlY3R8YnV0dG9ufHRleHRhcmVhKS9pLGNodW5rOi8oXihbK1wtXT8oPzpcZCopKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPyk/JHxeMHhbMC05YS1mXSskfFxkKykvZ2ksY2h1bmtzOi8oXlxcMHxcXDAkKS8saGV4Oi9eMHhbMC05YS1mXSskL2ksY29tbWE6LywvZyxkaWdpdE5vblVTOi9bXHN8XC5dL2csZGlnaXROZWdhdGl2ZVRlc3Q6L15ccypcKFsuXGRdK1wpLyxkaWdpdE5lZ2F0aXZlUmVwbGFjZTovXlxzKlwoKFsuXGRdKylcKS8sZGlnaXRUZXN0Oi9eW1wtKyhdP1xkK1spXT8kLyxkaWdpdFJlcGxhY2U6L1ssLiciXHNdL2d9LHN0cmluZzp7bWF4OjEsbWluOi0xLGVtcHR5bWluOjEsZW1wdHltYXg6LTEsemVybzowLG5vbmU6MCwibnVsbCI6MCx0b3A6ITAsYm90dG9tOiExfSxrZXlDb2Rlczp7ZW50ZXI6MTN9LGRhdGVzOnt9LGluc3RhbmNlTWV0aG9kczp7fSxzZXR1cDpmdW5jdGlvbihyLG8pe2lmKHImJnIudEhlYWQmJjAhPT1yLnRCb2RpZXMubGVuZ3RoJiYhMCE9PXIuaGFzSW5pdGlhbGl6ZWQpe3ZhciBzPSIiLGE9ZShyKSxuPWUubWV0YWRhdGE7ci5oYXNJbml0aWFsaXplZD0hMSxyLmlzUHJvY2Vzc2luZz0hMCxyLmNvbmZpZz1vLGUuZGF0YShyLCJ0YWJsZXNvcnRlciIsbyksdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkluaXRpYWxpemluZyB0YWJsZXNvcnRlciB2Iit0LnZlcnNpb24pLGUuZGF0YShyLCJzdGFydG92ZXJhbGx0aW1lciIsbmV3IERhdGUpKSxvLnN1cHBvcnRzRGF0YU9iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZVswXT1wYXJzZUludChlWzBdLDEwKSxlWzBdPjF8fDE9PT1lWzBdJiZwYXJzZUludChlWzFdLDEwKT49NH0oZS5mbi5qcXVlcnkuc3BsaXQoIi4iKSksby5lbXB0eVRvPW8uZW1wdHlUby50b0xvd2VyQ2FzZSgpLG8uc3RyaW5nVG89by5zdHJpbmdUby50b0xvd2VyQ2FzZSgpLG8ubGFzdD17c29ydExpc3Q6W10sY2xpY2tlZEluZGV4Oi0xfSwvdGFibGVzb3J0ZXJcLS8udGVzdChhLmF0dHIoImNsYXNzIikpfHwocz0iIiE9PW8udGhlbWU/IiB0YWJsZXNvcnRlci0iK28udGhlbWU6IiIpLG8ubmFtZXNwYWNlP28ubmFtZXNwYWNlPSIuIitvLm5hbWVzcGFjZS5yZXBsYWNlKHQucmVnZXgubm9uV29yZCwiIik6by5uYW1lc3BhY2U9Ii50YWJsZXNvcnRlciIrTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiksby50YWJsZT1yLG8uJHRhYmxlPWEuYWRkQ2xhc3ModC5jc3MudGFibGUrIiAiK28udGFibGVDbGFzcytzKyIgIitvLm5hbWVzcGFjZS5zbGljZSgxKSkuYXR0cigicm9sZSIsImdyaWQiKSxvLiRoZWFkZXJzPWEuZmluZChvLnNlbGVjdG9ySGVhZGVycyksby4kdGFibGUuY2hpbGRyZW4oKS5jaGlsZHJlbigidHIiKS5hdHRyKCJyb2xlIiwicm93Iiksby4kdGJvZGllcz1hLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrby5jc3NJbmZvQmxvY2srIikiKS5hdHRyKHsiYXJpYS1saXZlIjoicG9saXRlIiwiYXJpYS1yZWxldmFudCI6ImFsbCJ9KSxvLiR0YWJsZS5jaGlsZHJlbigiY2FwdGlvbiIpLmxlbmd0aCYmKChzPW8uJHRhYmxlLmNoaWxkcmVuKCJjYXB0aW9uIilbMF0pLmlkfHwocy5pZD1vLm5hbWVzcGFjZS5zbGljZSgxKSsiY2FwdGlvbiIpLG8uJHRhYmxlLmF0dHIoImFyaWEtbGFiZWxsZWRieSIscy5pZCkpLG8ud2lkZ2V0SW5pdD17fSxvLnRleHRFeHRyYWN0aW9uPW8uJHRhYmxlLmF0dHIoImRhdGEtdGV4dC1leHRyYWN0aW9uIil8fG8udGV4dEV4dHJhY3Rpb258fCJiYXNpYyIsdC5idWlsZEhlYWRlcnMobyksdC5maXhDb2x1bW5XaWR0aChyKSx0LmFkZFdpZGdldEZyb21DbGFzcyhyKSx0LmFwcGx5V2lkZ2V0T3B0aW9ucyhyKSx0LnNldHVwUGFyc2VycyhvKSxvLnRvdGFsUm93cz0wLG8uZGVidWcmJnQudmFsaWRhdGVPcHRpb25zKG8pLG8uZGVsYXlJbml0fHx0LmJ1aWxkQ2FjaGUobyksdC5iaW5kRXZlbnRzKHIsby4kaGVhZGVycywhMCksdC5iaW5kTWV0aG9kcyhvKSxvLnN1cHBvcnRzRGF0YU9iamVjdCYmdm9pZCAwIT09YS5kYXRhKCkuc29ydGxpc3Q/by5zb3J0TGlzdD1hLmRhdGEoKS5zb3J0bGlzdDpuJiZhLm1ldGFkYXRhKCkmJmEubWV0YWRhdGEoKS5zb3J0bGlzdCYmKG8uc29ydExpc3Q9YS5tZXRhZGF0YSgpLnNvcnRsaXN0KSx0LmFwcGx5V2lkZ2V0KHIsITApLG8uc29ydExpc3QubGVuZ3RoPjA/dC5zb3J0T24obyxvLnNvcnRMaXN0LHt9LCFvLmluaXRXaWRnZXRzKToodC5zZXRIZWFkZXJzQ3NzKG8pLG8uaW5pdFdpZGdldHMmJnQuYXBwbHlXaWRnZXQociwhMSkpLG8uc2hvd1Byb2Nlc3NpbmcmJmEudW5iaW5kKCJzb3J0QmVnaW4iK28ubmFtZXNwYWNlKyIgc29ydEVuZCIrby5uYW1lc3BhY2UpLmJpbmQoInNvcnRCZWdpbiIrby5uYW1lc3BhY2UrIiBzb3J0RW5kIitvLm5hbWVzcGFjZSxmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoby50aW1lclByb2Nlc3NpbmcpLHQuaXNQcm9jZXNzaW5nKHIpLCJzb3J0QmVnaW4iPT09ZS50eXBlJiYoby50aW1lclByb2Nlc3Npbmc9c2V0VGltZW91dChmdW5jdGlvbigpe3QuaXNQcm9jZXNzaW5nKHIsITApfSw1MDApKX0pLHIuaGFzSW5pdGlhbGl6ZWQ9ITAsci5pc1Byb2Nlc3Npbmc9ITEsdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlLmxvZygiT3ZlcmFsbCBpbml0aWFsaXphdGlvbiB0aW1lOiIrdC5iZW5jaG1hcmsoZS5kYXRhKHIsInN0YXJ0b3ZlcmFsbHRpbWVyIikpKSx0LmRlYnVnKG8sImNvcmUiKSYmY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSxhLnRyaWdnZXJIYW5kbGVyKCJ0YWJsZXNvcnRlci1pbml0aWFsaXplZCIsciksImZ1bmN0aW9uIj09dHlwZW9mIG8uaW5pdGlhbGl6ZWQmJm8uaW5pdGlhbGl6ZWQocil9ZWxzZSB0LmRlYnVnKG8sImNvcmUiKSYmKHIuaGFzSW5pdGlhbGl6ZWQ/Y29uc29sZS53YXJuKCJTdG9wcGluZyBpbml0aWFsaXphdGlvbi4gVGFibGVzb3J0ZXIgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCIpOmNvbnNvbGUuZXJyb3IoIlN0b3BwaW5nIGluaXRpYWxpemF0aW9uISBObyB0YWJsZSwgdGhlYWQgb3IgdGJvZHkiLHIpKX0sYmluZE1ldGhvZHM6ZnVuY3Rpb24ocil7dmFyIG89ci4kdGFibGUscz1yLm5hbWVzcGFjZSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgYWRkUm93cyB1cGRhdGVDZWxsIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyBkZXN0cm95IG1vdXNldXAgbW91c2VsZWF2ZSAiLnNwbGl0KCIgIikuam9pbihzKyIgIik7by51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLmJpbmQoInNvcnRSZXNldCIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5zb3J0UmVzZXQodGhpcy5jb25maWcsZnVuY3Rpb24oZSl7ZS5pc0FwcGx5aW5nV2lkZ2V0cz9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5hcHBseVdpZGdldChlLCIiLHIpfSwxMDApOnQuYXBwbHlXaWRnZXQoZSwiIixyKX0pfSkuYmluZCgidXBkYXRlQWxsIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQWxsKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGUiK3MrIiB1cGRhdGVSb3dzIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGVIZWFkZXJzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUhlYWRlcnModGhpcy5jb25maWcscil9KS5iaW5kKCJ1cGRhdGVDZWxsIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC51cGRhdGVDZWxsKHRoaXMuY29uZmlnLHIsbyxzKX0pLmJpbmQoImFkZFJvd3MiK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFkZFJvd3ModGhpcy5jb25maWcscixvLHMpfSkuYmluZCgidXBkYXRlQ29tcGxldGUiK3MsZnVuY3Rpb24oKXt0aGlzLmlzVXBkYXRpbmc9ITF9KS5iaW5kKCJzb3J0b24iK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnNvcnRPbih0aGlzLmNvbmZpZyxyLG8scyl9KS5iaW5kKCJhcHBlbmRDYWNoZSIrcyxmdW5jdGlvbihyLG8scyl7ci5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGVuZENhY2hlKHRoaXMuY29uZmlnLHMpLGUuaXNGdW5jdGlvbihvKSYmbyh0aGlzKX0pLmJpbmQoInVwZGF0ZUNhY2hlIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQ2FjaGUodGhpcy5jb25maWcscixvKX0pLmJpbmQoImFwcGx5V2lkZ2V0SWQiK3MsZnVuY3Rpb24oZSxyKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuYXBwbHlXaWRnZXRJZCh0aGlzLHIpfSkuYmluZCgiYXBwbHlXaWRnZXRzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGx5V2lkZ2V0KHRoaXMsITEscil9KS5iaW5kKCJyZWZyZXNoV2lkZ2V0cyIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlZnJlc2hXaWRnZXRzKHRoaXMscixvKX0pLmJpbmQoInJlbW92ZVdpZGdldCIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlbW92ZVdpZGdldCh0aGlzLHIsbyl9KS5iaW5kKCJkZXN0cm95IitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuZGVzdHJveSh0aGlzLHIsbyl9KS5iaW5kKCJyZXNldFRvTG9hZFN0YXRlIitzLGZ1bmN0aW9uKG8pe28uc3RvcFByb3BhZ2F0aW9uKCksdC5yZW1vdmVXaWRnZXQodGhpcywhMCwhMSk7dmFyIHM9ZS5leHRlbmQoITAse30sci5vcmlnaW5hbFNldHRpbmdzKTsocj1lLmV4dGVuZCghMCx7fSx0LmRlZmF1bHRzLHMpKS5vcmlnaW5hbFNldHRpbmdzPXMsdGhpcy5oYXNJbml0aWFsaXplZD0hMSx0LnNldHVwKHRoaXMscil9KX0sYmluZEV2ZW50czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbj0ocj1lKHIpWzBdKS5jb25maWcsaT1uLm5hbWVzcGFjZSxsPW51bGw7ITAhPT1zJiYoby5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfaGVhZGVycyIpLChhPXQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpKS5sZW5ndGgmJiJUQUJMRSI9PT1hWzBdLm5vZGVOYW1lJiZhWzBdIT09ciYmZShhWzBdKS5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfdGFibGUiKSksYT0obi5wb2ludGVyRG93bisiICIrbi5wb2ludGVyVXArIiAiK24ucG9pbnRlckNsaWNrKyIgc29ydCBrZXl1cCAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikuc3BsaXQoIiAiKS5qb2luKGkrIiAiKSxvLmZpbmQobi5zZWxlY3RvclNvcnQpLmFkZChvLmZpbHRlcihuLnNlbGVjdG9yU29ydCkpLnVuYmluZChhKS5iaW5kKGEsZnVuY3Rpb24ocixvKXt2YXIgcyxhLGksZD1lKHIudGFyZ2V0KSxjPSIgIityLnR5cGUrIiAiO2lmKCEoMSE9PShyLndoaWNofHxyLmJ1dHRvbikmJiFjLm1hdGNoKCIgIituLnBvaW50ZXJDbGljaysiIHwgc29ydCB8IGtleXVwICIpfHwiIGtleXVwICI9PT1jJiZyLndoaWNoIT09dC5rZXlDb2Rlcy5lbnRlcnx8Yy5tYXRjaCgiICIrbi5wb2ludGVyQ2xpY2srIiAiKSYmdm9pZCAwIT09ci53aGljaHx8Yy5tYXRjaCgiICIrbi5wb2ludGVyVXArIiAiKSYmbCE9PXIudGFyZ2V0JiYhMCE9PW8pKXtpZihjLm1hdGNoKCIgIituLnBvaW50ZXJEb3duKyIgIikpcmV0dXJuIGw9ci50YXJnZXQsdm9pZCgiMSI9PT0oaT1kLmpxdWVyeS5zcGxpdCgiLiIpKVswXSYmaVsxXTw0JiZyLnByZXZlbnREZWZhdWx0KCkpO2lmKGw9bnVsbCxzPXQuZ2V0Q2xvc2VzdChlKHRoaXMpLCIuIit0LmNzcy5oZWFkZXIpLHQucmVnZXguZm9ybUVsZW1lbnRzLnRlc3Qoci50YXJnZXQubm9kZU5hbWUpfHxkLmhhc0NsYXNzKG4uY3NzTm9Tb3J0KXx8ZC5wYXJlbnRzKCIuIituLmNzc05vU29ydCkubGVuZ3RoPjB8fHMuaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHxkLnBhcmVudHMoImJ1dHRvbiIpLmxlbmd0aD4wKXJldHVybiFuLmNhbmNlbFNlbGVjdGlvbjtuLmRlbGF5SW5pdCYmdC5pc0VtcHR5T2JqZWN0KG4uY2FjaGUpJiZ0LmJ1aWxkQ2FjaGUobiksbi5sYXN0LmNsaWNrZWRJbmRleD1zLmF0dHIoImRhdGEtY29sdW1uIil8fHMuaW5kZXgoKSwoYT1uLiRoZWFkZXJJbmRleGVkW24ubGFzdC5jbGlja2VkSW5kZXhdWzBdKSYmIWEuc29ydERpc2FibGVkJiZ0LmluaXRTb3J0KG4sYSxyKX19KSxuLmNhbmNlbFNlbGVjdGlvbiYmby5hdHRyKCJ1bnNlbGVjdGFibGUiLCJvbiIpLmJpbmQoInNlbGVjdHN0YXJ0IiwhMSkuY3NzKHsidXNlci1zZWxlY3QiOiJub25lIixNb3pVc2VyU2VsZWN0OiJub25lIn0pfSxidWlsZEhlYWRlcnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG47Zm9yKHIuaGVhZGVyTGlzdD1bXSxyLmhlYWRlckNvbnRlbnQ9W10sci5zb3J0VmFycz1bXSx0LmRlYnVnKHIsImNvcmUiKSYmKGE9bmV3IERhdGUpLHIuY29sdW1ucz10LmNvbXB1dGVDb2x1bW5JbmRleChyLiR0YWJsZS5jaGlsZHJlbigidGhlYWQsIHRmb290IikuY2hpbGRyZW4oInRyIikpLHM9ci5jc3NJY29uPyc8aSBjbGFzcz0iJysoci5jc3NJY29uPT09dC5jc3MuaWNvbj90LmNzcy5pY29uOnIuY3NzSWNvbisiICIrdC5jc3MuaWNvbikrJyI+PC9pPic6IiIsci4kaGVhZGVycz1lKGUubWFwKHIuJHRhYmxlLmZpbmQoci5zZWxlY3RvckhlYWRlcnMpLGZ1bmN0aW9uKG8sYSl7dmFyIG4saSxsLGQsYyxnPWUobyk7aWYoIXQuZ2V0Q2xvc2VzdChnLCJ0ciIpLmhhc0NsYXNzKHIuY3NzSWdub3JlUm93KSlyZXR1cm4vKHRofHRkKS9pLnRlc3Qoby5ub2RlTmFtZSl8fChjPXQuZ2V0Q2xvc2VzdChnLCJ0aCwgdGQiKSxnLmF0dHIoImRhdGEtY29sdW1uIixjLmF0dHIoImRhdGEtY29sdW1uIikpKSxuPXQuZ2V0Q29sdW1uRGF0YShyLnRhYmxlLHIuaGVhZGVycyxhLCEwKSxyLmhlYWRlckNvbnRlbnRbYV09Zy5odG1sKCksIiI9PT1yLmhlYWRlclRlbXBsYXRlfHxnLmZpbmQoIi4iK3QuY3NzLmhlYWRlckluKS5sZW5ndGh8fChkPXIuaGVhZGVyVGVtcGxhdGUucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlQ29udGVudCxnLmh0bWwoKSkucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlSWNvbixnLmZpbmQoIi4iK3QuY3NzLmljb24pLmxlbmd0aD8iIjpzKSxyLm9uUmVuZGVyVGVtcGxhdGUmJihpPXIub25SZW5kZXJUZW1wbGF0ZS5hcHBseShnLFthLGRdKSkmJiJzdHJpbmciPT10eXBlb2YgaSYmKGQ9aSksZy5odG1sKCc8ZGl2IGNsYXNzPSInK3QuY3NzLmhlYWRlckluKyciPicrZCsiPC9kaXY+IikpLHIub25SZW5kZXJIZWFkZXImJnIub25SZW5kZXJIZWFkZXIuYXBwbHkoZyxbYSxyLHIuJHRhYmxlXSksbD1wYXJzZUludChnLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG8uY29sdW1uPWwsYz10LmdldE9yZGVyKHQuZ2V0RGF0YShnLG4sInNvcnRJbml0aWFsT3JkZXIiKXx8ci5zb3J0SW5pdGlhbE9yZGVyKSxyLnNvcnRWYXJzW2xdPXtjb3VudDotMSxvcmRlcjpjP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxsb2NrZWRPcmRlcjohMX0sdm9pZCAwIT09KGM9dC5nZXREYXRhKGcsbiwibG9ja2VkT3JkZXIiKXx8ITEpJiYhMSE9PWMmJihyLnNvcnRWYXJzW2xdLmxvY2tlZE9yZGVyPSEwLHIuc29ydFZhcnNbbF0ub3JkZXI9dC5nZXRPcmRlcihjKT9bMSwxXTpbMCwwXSksci5oZWFkZXJMaXN0W2FdPW8sZy5hZGRDbGFzcyh0LmNzcy5oZWFkZXIrIiAiK3IuY3NzSGVhZGVyKSx0LmdldENsb3Nlc3QoZywidHIiKS5hZGRDbGFzcyh0LmNzcy5oZWFkZXJSb3crIiAiK3IuY3NzSGVhZGVyUm93KS5hdHRyKCJyb2xlIiwicm93Iiksci50YWJJbmRleCYmZy5hdHRyKCJ0YWJpbmRleCIsMCksb30pKSxyLiRoZWFkZXJJbmRleGVkPVtdLG49MDtuPHIuY29sdW1ucztuKyspdC5pc0VtcHR5T2JqZWN0KHIuc29ydFZhcnNbbl0pJiYoci5zb3J0VmFyc1tuXT17fSksbz1yLiRoZWFkZXJzLmZpbHRlcignW2RhdGEtY29sdW1uPSInK24rJyJdJyksci4kaGVhZGVySW5kZXhlZFtuXT1vLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcigiOmxhc3QiKTpvLmZpbHRlcigiOmxhc3QiKTplKCk7ci4kdGFibGUuZmluZChyLnNlbGVjdG9ySGVhZGVycykuYXR0cih7c2NvcGU6ImNvbCIscm9sZToiY29sdW1uaGVhZGVyIn0pLHQudXBkYXRlSGVhZGVyKHIpLHQuZGVidWcociwiY29yZSIpJiYoY29uc29sZS5sb2coIkJ1aWx0IGhlYWRlcnM6Iit0LmJlbmNobWFyayhhKSksY29uc29sZS5sb2coci4kaGVhZGVycykpfSxhZGRJbnN0YW5jZU1ldGhvZHM6ZnVuY3Rpb24ocil7ZS5leHRlbmQodC5pbnN0YW5jZU1ldGhvZHMscil9LHNldHVwUGFyc2VyczpmdW5jdGlvbihlLHIpe3ZhciBvLHMsYSxuLGksbCxkLGMsZyxwLHUsZixoLG0sYj1lLnRhYmxlLHk9MCx3PXQuZGVidWcoZSwiY29yZSIpLHg9e307aWYoZS4kdGJvZGllcz1lLiR0YWJsZS5jaGlsZHJlbigidGJvZHk6bm90KC4iK2UuY3NzSW5mb0Jsb2NrKyIpIiksaD12b2lkIDA9PT1yP2UuJHRib2RpZXM6ciwwPT09KG09aC5sZW5ndGgpKXJldHVybiB3P2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgcGFyc2VyIGNhY2hlIik6IiI7Zm9yKHcmJihmPW5ldyBEYXRlLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiRGV0ZWN0aW5nIHBhcnNlcnMgZm9yIGVhY2ggY29sdW1uIikpLHM9e2V4dHJhY3RvcnM6W10scGFyc2VyczpbXX07eTxtOyl7aWYoKG89aFt5XS5yb3dzKS5sZW5ndGgpZm9yKGk9MCxuPWUuY29sdW1ucyxsPTA7bDxuO2wrKyl7aWYoKGQ9ZS4kaGVhZGVySW5kZXhlZFtpXSkmJmQubGVuZ3RoJiYoYz10LmdldENvbHVtbkRhdGEoYixlLmhlYWRlcnMsaSksdT10LmdldFBhcnNlckJ5SWQodC5nZXREYXRhKGQsYywiZXh0cmFjdG9yIikpLHA9dC5nZXRQYXJzZXJCeUlkKHQuZ2V0RGF0YShkLGMsInNvcnRlciIpKSxnPSJmYWxzZSI9PT10LmdldERhdGEoZCxjLCJwYXJzZXIiKSxlLmVtcHRpZXNbaV09KHQuZ2V0RGF0YShkLGMsImVtcHR5Iil8fGUuZW1wdHlUb3x8KGUuZW1wdHlUb0JvdHRvbT8iYm90dG9tIjoidG9wIikpLnRvTG93ZXJDYXNlKCksZS5zdHJpbmdzW2ldPSh0LmdldERhdGEoZCxjLCJzdHJpbmciKXx8ZS5zdHJpbmdUb3x8Im1heCIpLnRvTG93ZXJDYXNlKCksZyYmKHA9dC5nZXRQYXJzZXJCeUlkKCJuby1wYXJzZXIiKSksdXx8KHU9ITEpLHB8fChwPXQuZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKGUsbywtMSxpKSksdyYmKHhbIigiK2krIikgIitkLnRleHQoKV09e3BhcnNlcjpwLmlkLGV4dHJhY3Rvcjp1P3UuaWQ6Im5vbmUiLHN0cmluZzplLnN0cmluZ3NbaV0sZW1wdHk6ZS5lbXB0aWVzW2ldfSkscy5wYXJzZXJzW2ldPXAscy5leHRyYWN0b3JzW2ldPXUsKGE9ZFswXS5jb2xTcGFuLTEpPjApKWZvcihpKz1hLG4rPWE7YSsxPjA7KXMucGFyc2Vyc1tpLWFdPXAscy5leHRyYWN0b3JzW2ktYV09dSxhLS07aSsrfXkrPXMucGFyc2Vycy5sZW5ndGg/bToxfXcmJih0LmlzRW1wdHlPYmplY3QoeCk/Y29uc29sZS53YXJuKCIgIE5vIHBhcnNlcnMgZGV0ZWN0ZWQhIik6Y29uc29sZVtjb25zb2xlLnRhYmxlPyJ0YWJsZSI6ImxvZyJdKHgpLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgZGV0ZWN0aW5nIHBhcnNlcnMiK3QuYmVuY2htYXJrKGYpKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpLGUucGFyc2Vycz1zLnBhcnNlcnMsZS5leHRyYWN0b3JzPXMuZXh0cmFjdG9yc30sYWRkUGFyc2VyOmZ1bmN0aW9uKGUpe3ZhciByLG89dC5wYXJzZXJzLmxlbmd0aCxzPSEwO2ZvcihyPTA7cjxvO3IrKyl0LnBhcnNlcnNbcl0uaWQudG9Mb3dlckNhc2UoKT09PWUuaWQudG9Mb3dlckNhc2UoKSYmKHM9ITEpO3MmJih0LnBhcnNlcnNbdC5wYXJzZXJzLmxlbmd0aF09ZSl9LGdldFBhcnNlckJ5SWQ6ZnVuY3Rpb24oZSl7aWYoImZhbHNlIj09ZSlyZXR1cm4hMTt2YXIgcixvPXQucGFyc2Vycy5sZW5ndGg7Zm9yKHI9MDtyPG87cisrKWlmKHQucGFyc2Vyc1tyXS5pZC50b0xvd2VyQ2FzZSgpPT09ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHQucGFyc2Vyc1tyXTtyZXR1cm4hMX0sZGV0ZWN0UGFyc2VyRm9yQ29sdW1uOmZ1bmN0aW9uKHIsbyxzLGEpe2Zvcih2YXIgbixpLGwsZD10LnBhcnNlcnMubGVuZ3RoLGM9ITEsZz0iIixwPXQuZGVidWcociwiY29yZSIpLHU9ITA7IiI9PT1nJiZ1OykobD1vWysrc10pJiZzPDUwP2wuY2xhc3NOYW1lLmluZGV4T2YodC5jc3NJZ25vcmVSb3cpPDAmJihjPW9bc10uY2VsbHNbYV0sZz10LmdldEVsZW1lbnRUZXh0KHIsYyxhKSxpPWUoYykscCYmY29uc29sZS5sb2coIkNoZWNraW5nIGlmIHZhbHVlIHdhcyBlbXB0eSBvbiByb3cgIitzKyIsIGNvbHVtbjogIithKyc6ICInK2crJyInKSk6dT0hMTtmb3IoOy0tZD49MDspaWYoKG49dC5wYXJzZXJzW2RdKSYmInRleHQiIT09bi5pZCYmbi5pcyYmbi5pcyhnLHIudGFibGUsYyxpKSlyZXR1cm4gbjtyZXR1cm4gdC5nZXRQYXJzZXJCeUlkKCJ0ZXh0Iil9LGdldEVsZW1lbnRUZXh0OmZ1bmN0aW9uKHIsbyxzKXtpZighbylyZXR1cm4iIjt2YXIgYSxuPXIudGV4dEV4dHJhY3Rpb258fCIiLGk9by5qcXVlcnk/bzplKG8pO3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8iYmFzaWMiPT09biYmdm9pZCAwIT09KGE9aS5hdHRyKHIudGV4dEF0dHJpYnV0ZSkpP2UudHJpbShhKTplLnRyaW0oby50ZXh0Q29udGVudHx8aS50ZXh0KCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP2UudHJpbShuKGlbMF0sci50YWJsZSxzKSk6ImZ1bmN0aW9uIj09dHlwZW9mKGE9dC5nZXRDb2x1bW5EYXRhKHIudGFibGUsbixzKSk/ZS50cmltKGEoaVswXSxyLnRhYmxlLHMpKTplLnRyaW0oaVswXS50ZXh0Q29udGVudHx8aS50ZXh0KCkpfSxnZXRQYXJzZWRUZXh0OmZ1bmN0aW9uKGUscixvLHMpe3ZvaWQgMD09PXMmJihzPXQuZ2V0RWxlbWVudFRleHQoZSxyLG8pKTt2YXIgYT0iIitzLG49ZS5wYXJzZXJzW29dLGk9ZS5leHRyYWN0b3JzW29dO3JldHVybiBuJiYoaSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuZm9ybWF0JiYocz1pLmZvcm1hdChzLGUudGFibGUscixvKSksYT0ibm8tcGFyc2VyIj09PW4uaWQ/IiI6bi5mb3JtYXQoIiIrcyxlLnRhYmxlLHIsbyksZS5pZ25vcmVDYXNlJiYic3RyaW5nIj09dHlwZW9mIGEmJihhPWEudG9Mb3dlckNhc2UoKSkpLGF9LGJ1aWxkQ2FjaGU6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYyxnLHAsdSxmLGgsbSxiLHksdyx4LHYsQywkLEksRCxSLFQ9ci50YWJsZSxMPXIucGFyc2VycyxBPXQuZGVidWcociwiY29yZSIpO2lmKHIuJHRib2RpZXM9ci4kdGFibGUuY2hpbGRyZW4oInRib2R5Om5vdCguIityLmNzc0luZm9CbG9jaysiKSIpLGc9dm9pZCAwPT09cz9yLiR0Ym9kaWVzOnMsci5jYWNoZT17fSxyLnRvdGFsUm93cz0wLCFMKXJldHVybiBBP2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgY2FjaGUiKToiIjtmb3IoQSYmKG09bmV3IERhdGUpLHIuc2hvd1Byb2Nlc3NpbmcmJnQuaXNQcm9jZXNzaW5nKFQsITApLGM9MDtjPGcubGVuZ3RoO2MrKyl7Zm9yKHg9W10sYT1yLmNhY2hlW2NdPXtub3JtYWxpemVkOltdfSxiPWdbY10mJmdbY10ucm93cy5sZW5ndGh8fDAsbD0wO2w8YjsrK2wpaWYoeT17Y2hpbGQ6W10scmF3OltdfSxwPWUoZ1tjXS5yb3dzW2xdKSx1PVtdLCFwLmhhc0NsYXNzKHIuc2VsZWN0b3JSZW1vdmUuc2xpY2UoMSkpKWlmKHAuaGFzQ2xhc3Moci5jc3NDaGlsZFJvdykmJjAhPT1sKWZvcihEPWEubm9ybWFsaXplZC5sZW5ndGgtMSwodz1hLm5vcm1hbGl6ZWRbRF1bci5jb2x1bW5zXSkuJHJvdz13LiRyb3cuYWRkKHApLHAucHJldigpLmhhc0NsYXNzKHIuY3NzQ2hpbGRSb3cpfHxwLnByZXYoKS5hZGRDbGFzcyh0LmNzcy5jc3NIYXNDaGlsZCksZj1wLmNoaWxkcmVuKCJ0aCwgdGQiKSxEPXcuY2hpbGQubGVuZ3RoLHcuY2hpbGRbRF09W10sQz0wLEk9ci5jb2x1bW5zLGQ9MDtkPEk7ZCsrKShoPWZbZF0pJiYody5jaGlsZFtEXVtkXT10LmdldFBhcnNlZFRleHQocixoLGQpLCh2PWZbZF0uY29sU3Bhbi0xKT4wJiYoQys9dixJKz12KSksQysrO2Vsc2V7Zm9yKHkuJHJvdz1wLHkub3JkZXI9bCxDPTAsST1yLmNvbHVtbnMsZD0wO2Q8STsrK2Qpe2lmKChoPXBbMF0uY2VsbHNbZF0pJiZDPHIuY29sdW1ucyYmKCEoJD12b2lkIDAhPT1MW0NdKSYmQSYmY29uc29sZS53YXJuKCJObyBwYXJzZXIgZm91bmQgZm9yIHJvdzogIitsKyIsIGNvbHVtbjogIitkKyc7IGNlbGwgY29udGFpbmluZzogIicrZShoKS50ZXh0KCkrJyI7IGRvZXMgaXQgaGF2ZSBhIGhlYWRlcj8nKSxuPXQuZ2V0RWxlbWVudFRleHQocixoLEMpLHkucmF3W0NdPW4saT10LmdldFBhcnNlZFRleHQocixoLEMsbiksdVtDXT1pLCQmJiJudW1lcmljIj09PShMW0NdLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpJiYoeFtDXT1NYXRoLm1heChNYXRoLmFicyhpKXx8MCx4W0NdfHwwKSksKHY9aC5jb2xTcGFuLTEpPjApKXtmb3IoUj0wO1I8PXY7KWk9ci5kdXBsaWNhdGVTcGFufHwwPT09Uj9uOiJzdHJpbmciIT10eXBlb2Ygci50ZXh0RXh0cmFjdGlvbj90LmdldEVsZW1lbnRUZXh0KHIsaCxDK1IpfHwiIjoiIix5LnJhd1tDK1JdPWksdVtDK1JdPWksUisrO0MrPXYsSSs9dn1DKyt9dVtyLmNvbHVtbnNdPXksYS5ub3JtYWxpemVkW2Eubm9ybWFsaXplZC5sZW5ndGhdPXV9YS5jb2xNYXg9eCxyLnRvdGFsUm93cys9YS5ub3JtYWxpemVkLmxlbmd0aH1pZihyLnNob3dQcm9jZXNzaW5nJiZ0LmlzUHJvY2Vzc2luZyhUKSxBKXtmb3IoRD1NYXRoLm1pbig1LHIuY2FjaGVbMF0ubm9ybWFsaXplZC5sZW5ndGgpLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiQnVpbGRpbmcgY2FjaGUgZm9yICIrci50b3RhbFJvd3MrIiByb3dzIChzaG93aW5nICIrRCsiIHJvd3MgaW4gbG9nKSBhbmQgIityLmNvbHVtbnMrIiBjb2x1bW5zIit0LmJlbmNobWFyayhtKSksbj17fSxkPTA7ZDxyLmNvbHVtbnM7ZCsrKWZvcihDPTA7QzxEO0MrKyluWyJyb3c6ICIrQ118fChuWyJyb3c6ICIrQ109e30pLG5bInJvdzogIitDXVtyLiRoZWFkZXJJbmRleGVkW2RdLnRleHQoKV09ci5jYWNoZVswXS5ub3JtYWxpemVkW0NdW2RdO2NvbnNvbGVbY29uc29sZS50YWJsZT8idGFibGUiOiJsb2ciXShuKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9ZS5pc0Z1bmN0aW9uKG8pJiZvKFQpfSxnZXRDb2x1bW5UZXh0OmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG09ImZ1bmN0aW9uIj09dHlwZW9mIHMsYj0iYWxsIj09PW8seT17cmF3OltdLHBhcnNlZDpbXSwkY2VsbDpbXX0sdz0ocj1lKHIpWzBdKS5jb25maWc7aWYoIXQuaXNFbXB0eU9iamVjdCh3KSl7Zm9yKGM9dy4kdGJvZGllcy5sZW5ndGgsbj0wO248YztuKyspZm9yKGc9KGw9dy5jYWNoZVtuXS5ub3JtYWxpemVkKS5sZW5ndGgsaT0wO2k8ZztpKyspZD1sW2ldLGEmJiFkW3cuY29sdW1uc10uJHJvdy5pcyhhKXx8KGg9ITAsdT1iP2Quc2xpY2UoMCx3LmNvbHVtbnMpOmRbb10sZD1kW3cuY29sdW1uc10scD1iP2QucmF3OmQucmF3W29dLGY9Yj9kLiRyb3cuY2hpbGRyZW4oKTpkLiRyb3cuY2hpbGRyZW4oKS5lcShvKSxtJiYoaD1zKHt0Ym9keUluZGV4Om4scm93SW5kZXg6aSxwYXJzZWQ6dSxyYXc6cCwkcm93OmQuJHJvdywkY2VsbDpmfSkpLCExIT09aCYmKHkucGFyc2VkW3kucGFyc2VkLmxlbmd0aF09dSx5LnJhd1t5LnJhdy5sZW5ndGhdPXAseS4kY2VsbFt5LiRjZWxsLmxlbmd0aF09ZikpO3JldHVybiB5fXQuZGVidWcodywiY29yZSIpJiZjb25zb2xlLndhcm4oIk5vIGNhY2hlIGZvdW5kIC0gYWJvcnRpbmcgZ2V0Q29sdW1uVGV4dCBmdW5jdGlvbiEiKX0sc2V0SGVhZGVyc0NzczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ci5zb3J0TGlzdCxuPWEubGVuZ3RoLGk9dC5jc3Muc29ydE5vbmUrIiAiK3IuY3NzTm9uZSxsPVt0LmNzcy5zb3J0QXNjKyIgIityLmNzc0FzYyx0LmNzcy5zb3J0RGVzYysiICIrci5jc3NEZXNjXSxkPVtyLmNzc0ljb25Bc2Msci5jc3NJY29uRGVzYyxyLmNzc0ljb25Ob25lXSxjPVsiYXNjZW5kaW5nIiwiZGVzY2VuZGluZyJdLGc9ZnVuY3Rpb24oZSxyKXtlLnJlbW92ZUNsYXNzKGkpLmFkZENsYXNzKGxbcl0pLmF0dHIoImFyaWEtc29ydCIsY1tyXSkuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZFsyXSkuYWRkQ2xhc3MoZFtyXSl9LHA9ci4kdGFibGUuZmluZCgidGZvb3QgdHIiKS5jaGlsZHJlbigidGQsIHRoIikuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKSx1PXIuJGhlYWRlcnMuYWRkKGUoInRoZWFkICIrci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKS5hZGRDbGFzcyhpKS5hdHRyKCJhcmlhLXNvcnQiLCJub25lIikuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZC5qb2luKCIgIikpLmVuZCgpO2Zvcih1Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKGRbMl0pLHIuY3NzSWNvbkRpc2FibGVkJiZ1LmZpbHRlcigiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKHIuY3NzSWNvbkRpc2FibGVkKSxvPTA7bzxuO28rKylpZigyIT09YVtvXVsxXSl7aWYodT1yLiRoZWFkZXJzLmZpbHRlcihmdW5jdGlvbihlKXtmb3IodmFyIG89ITAscz1yLiRoZWFkZXJzLmVxKGUpLGE9cGFyc2VJbnQocy5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxuPWErdC5nZXRDbG9zZXN0KHMsInRoLCB0ZCIpWzBdLmNvbFNwYW47YTxuO2ErKylvPSEhbyYmKG98fHQuaXNWYWx1ZUluQXJyYXkoYSxyLnNvcnRMaXN0KT4tMSk7cmV0dXJuIG99KSwodT11Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcignW2RhdGEtY29sdW1uPSInK2Fbb11bMF0rJyJdJysoMT09PW4/IjpsYXN0IjoiIikpKS5sZW5ndGgpZm9yKHM9MDtzPHUubGVuZ3RoO3MrKyl1W3NdLnNvcnREaXNhYmxlZHx8Zyh1LmVxKHMpLGFbb11bMV0pO3AubGVuZ3RoJiZnKHAuZmlsdGVyKCdbZGF0YS1jb2x1bW49IicrYVtvXVswXSsnIl0nKSxhW29dWzFdKX1mb3Iobj1yLiRoZWFkZXJzLmxlbmd0aCxvPTA7bzxuO28rKyl0LnNldENvbHVtbkFyaWFMYWJlbChyLHIuJGhlYWRlcnMuZXEobykpfSxnZXRDbG9zZXN0OmZ1bmN0aW9uKHQscil7cmV0dXJuIGUuZm4uY2xvc2VzdD90LmNsb3Nlc3Qocik6dC5pcyhyKT90OnQucGFyZW50cyhyKS5maWx0ZXIoIjpmaXJzdCIpfSxzZXRDb2x1bW5BcmlhTGFiZWw6ZnVuY3Rpb24ocixvLHMpe2lmKG8ubGVuZ3RoKXt2YXIgYT1wYXJzZUludChvLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG49ci5zb3J0VmFyc1thXSxpPW8uaGFzQ2xhc3ModC5jc3Muc29ydEFzYyk/InNvcnRBc2MiOm8uaGFzQ2xhc3ModC5jc3Muc29ydERlc2MpPyJzb3J0RGVzYyI6InNvcnROb25lIixsPWUudHJpbShvLnRleHQoKSkrIjogIit0Lmxhbmd1YWdlW2ldO28uaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHwhMT09PXM/bCs9dC5sYW5ndWFnZS5zb3J0RGlzYWJsZWQ6KGk9KG4uY291bnQrMSklbi5vcmRlci5sZW5ndGgscz1uLm9yZGVyW2ldLGwrPXQubGFuZ3VhZ2VbMD09PXM/Im5leHRBc2MiOjE9PT1zPyJuZXh0RGVzYyI6Im5leHROb25lIl0pLG8uYXR0cigiYXJpYS1sYWJlbCIsbCl9fSx1cGRhdGVIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9ZS4kaGVhZGVycy5sZW5ndGg7Zm9yKHI9MDtyPGk7cisrKXM9ZS4kaGVhZGVycy5lcShyKSxhPXQuZ2V0Q29sdW1uRGF0YShuLGUuaGVhZGVycyxyLCEwKSxvPSJmYWxzZSI9PT10LmdldERhdGEocyxhLCJzb3J0ZXIiKXx8ImZhbHNlIj09PXQuZ2V0RGF0YShzLGEsInBhcnNlciIpLHQuc2V0Q29sdW1uU29ydChlLHMsbyl9LHNldENvbHVtblNvcnQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBvPWUudGFibGUuaWQ7dFswXS5zb3J0RGlzYWJsZWQ9cix0W3I/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgic29ydGVyLWZhbHNlIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsIiIrciksZS50YWJJbmRleCYmKHI/dC5yZW1vdmVBdHRyKCJ0YWJpbmRleCIpOnQuYXR0cigidGFiaW5kZXgiLCIwIikpLG8mJihyP3QucmVtb3ZlQXR0cigiYXJpYS1jb250cm9scyIpOnQuYXR0cigiYXJpYS1jb250cm9scyIsbykpfSx1cGRhdGVIZWFkZXJTb3J0Q291bnQ6ZnVuY3Rpb24ocixvKXt2YXIgcyxhLG4saSxsLGQsYyxnLHA9b3x8ci5zb3J0TGlzdCx1PXAubGVuZ3RoO2ZvcihyLnNvcnRMaXN0PVtdLGk9MDtpPHU7aSsrKWlmKGM9cFtpXSwocz1wYXJzZUludChjWzBdLDEwKSk8ci5jb2x1bW5zKXtzd2l0Y2goci5zb3J0VmFyc1tzXS5vcmRlcnx8KGc9dC5nZXRPcmRlcihyLnNvcnRJbml0aWFsT3JkZXIpP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxyLnNvcnRWYXJzW3NdLm9yZGVyPWcsci5zb3J0VmFyc1tzXS5jb3VudD0wKSxnPXIuc29ydFZhcnNbc10ub3JkZXIsYT0oIiIrY1sxXSkubWF0Y2goL14oMXxkfHN8b3xuKS8pLGE9YT9hWzBdOiIiKXtjYXNlIjEiOmNhc2UiZCI6YT0xO2JyZWFrO2Nhc2UicyI6YT1sfHwwO2JyZWFrO2Nhc2UibyI6YT0wPT09KGQ9Z1sobHx8MCklZy5sZW5ndGhdKT8xOjE9PT1kPzA6MjticmVhaztjYXNlIm4iOmE9Z1srK3Iuc29ydFZhcnNbc10uY291bnQlZy5sZW5ndGhdO2JyZWFrO2RlZmF1bHQ6YT0wfWw9MD09PWk/YTpsLG49W3MscGFyc2VJbnQoYSwxMCl8fDBdLHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPW4sYT1lLmluQXJyYXkoblsxXSxnKSxyLnNvcnRWYXJzW3NdLmNvdW50PWE+PTA/YTpuWzFdJWcubGVuZ3RofX0sdXBkYXRlQWxsOmZ1bmN0aW9uKGUscixvKXt2YXIgcz1lLnRhYmxlO3MuaXNVcGRhdGluZz0hMCx0LnJlZnJlc2hXaWRnZXRzKHMsITAsITApLHQuYnVpbGRIZWFkZXJzKGUpLHQuYmluZEV2ZW50cyhzLGUuJGhlYWRlcnMsITApLHQuYmluZE1ldGhvZHMoZSksdC5jb21tb25VcGRhdGUoZSxyLG8pfSx1cGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UudGFibGUuaXNVcGRhdGluZz0hMCx0LnVwZGF0ZUhlYWRlcihlKSx0LmNvbW1vblVwZGF0ZShlLHIsbyl9LHVwZGF0ZUhlYWRlcnM6ZnVuY3Rpb24oZSxyKXtlLnRhYmxlLmlzVXBkYXRpbmc9ITAsdC5idWlsZEhlYWRlcnMoZSksdC5iaW5kRXZlbnRzKGUudGFibGUsZS4kaGVhZGVycywhMCksdC5yZXNvcnRDb21wbGV0ZShlLHIpfSx1cGRhdGVDZWxsOmZ1bmN0aW9uKHIsbyxzLGEpe2lmKGUobykuY2xvc2VzdCgidHIiKS5oYXNDbGFzcyhyLmNzc0NoaWxkUm93KSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ1cGRhdGVDZWxsIiBmb3IgY2hpbGQgcm93IGNvbnRlbnQgaGFzIGJlZW4gZGlzYWJsZWQsIHVzZSAidXBkYXRlIiBpbnN0ZWFkJyk7ZWxzZXtpZih0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkpcmV0dXJuIHQudXBkYXRlSGVhZGVyKHIpLHZvaWQgdC5jb21tb25VcGRhdGUocixzLGEpO3IudGFibGUuaXNVcGRhdGluZz0hMCxyLiR0YWJsZS5maW5kKHIuc2VsZWN0b3JSZW1vdmUpLnJlbW92ZSgpO3ZhciBuLGksbCxkLGMsZyxwPXIuJHRib2RpZXMsdT1lKG8pLGY9cC5pbmRleCh0LmdldENsb3Nlc3QodSwidGJvZHkiKSksaD1yLmNhY2hlW2ZdLG09dC5nZXRDbG9zZXN0KHUsInRyIik7aWYobz11WzBdLHAubGVuZ3RoJiZmPj0wKXtpZihsPXAuZXEoZikuZmluZCgidHIiKS5ub3QoIi4iK3IuY3NzQ2hpbGRSb3cpLmluZGV4KG0pLGM9aC5ub3JtYWxpemVkW2xdLChnPW1bMF0uY2VsbHMubGVuZ3RoKSE9PXIuY29sdW1ucylmb3IoZD0wLG49ITEsaT0wO2k8ZztpKyspbnx8bVswXS5jZWxsc1tpXT09PW8/bj0hMDpkKz1tWzBdLmNlbGxzW2ldLmNvbFNwYW47ZWxzZSBkPXUuaW5kZXgoKTtuPXQuZ2V0RWxlbWVudFRleHQocixvLGQpLGNbci5jb2x1bW5zXS5yYXdbZF09bixuPXQuZ2V0UGFyc2VkVGV4dChyLG8sZCxuKSxjW2RdPW4sIm51bWVyaWMiPT09KHIucGFyc2Vyc1tkXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKGguY29sTWF4W2RdPU1hdGgubWF4KE1hdGguYWJzKG4pfHwwLGguY29sTWF4W2RdfHwwKSksITEhPT0obj0idW5kZWZpbmVkIiE9PXM/czpyLnJlc29ydCk/dC5jaGVja1Jlc29ydChyLG4sYSk6dC5yZXNvcnRDb21wbGV0ZShyLGEpfWVsc2UgdC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUuZXJyb3IoInVwZGF0ZUNlbGwgYWJvcnRlZCwgdGJvZHkgbWlzc2luZyBvciBub3Qgd2l0aGluIHRoZSBpbmRpY2F0ZWQgdGFibGUiKSxyLnRhYmxlLmlzVXBkYXRpbmc9ITF9fSxhZGRSb3dzOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG0sYix5LHc9InN0cmluZyI9PXR5cGVvZiBvJiYxPT09ci4kdGJvZGllcy5sZW5ndGgmJi88dHIvLnRlc3Qob3x8IiIpLHg9ci50YWJsZTtpZih3KW89ZShvKSxyLiR0Ym9kaWVzLmFwcGVuZChvKTtlbHNlIGlmKCEobyYmbyBpbnN0YW5jZW9mIGUmJnQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpWzBdPT09ci50YWJsZSkpcmV0dXJuIHQuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmVycm9yKCJhZGRSb3dzIG1ldGhvZCByZXF1aXJlcyAoMSkgYSBqUXVlcnkgc2VsZWN0b3IgcmVmZXJlbmNlIHRvIHJvd3MgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgdGFibGUsIG9yICgyKSByb3cgSFRNTCBzdHJpbmcgdG8gYmUgYWRkZWQgdG8gYSB0YWJsZSB3aXRoIG9ubHkgb25lIHRib2R5IiksITE7aWYoeC5pc1VwZGF0aW5nPSEwLHQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSl0LnVwZGF0ZUhlYWRlcihyKSx0LmNvbW1vblVwZGF0ZShyLHMsYSk7ZWxzZXtmb3IoYz1vLmZpbHRlcigidHIiKS5hdHRyKCJyb2xlIiwicm93IikubGVuZ3RoLGw9ci4kdGJvZGllcy5pbmRleChvLnBhcmVudHMoInRib2R5IikuZmlsdGVyKCI6Zmlyc3QiKSksci5wYXJzZXJzJiZyLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhyKSxkPTA7ZDxjO2QrKyl7Zm9yKGY9MCxwPW9bZF0uY2VsbHMubGVuZ3RoLHU9ci5jYWNoZVtsXS5ub3JtYWxpemVkLmxlbmd0aCxtPVtdLGg9e2NoaWxkOltdLHJhdzpbXSwkcm93Om8uZXEoZCksb3JkZXI6dX0sZz0wO2c8cDtnKyspYj1vW2RdLmNlbGxzW2ddLG49dC5nZXRFbGVtZW50VGV4dChyLGIsZiksaC5yYXdbZl09bixpPXQuZ2V0UGFyc2VkVGV4dChyLGIsZixuKSxtW2ZdPWksIm51bWVyaWMiPT09KHIucGFyc2Vyc1tmXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKHIuY2FjaGVbbF0uY29sTWF4W2ZdPU1hdGgubWF4KE1hdGguYWJzKGkpfHwwLHIuY2FjaGVbbF0uY29sTWF4W2ZdfHwwKSksKHk9Yi5jb2xTcGFuLTEpPjAmJihmKz15KSxmKys7bVtyLmNvbHVtbnNdPWgsci5jYWNoZVtsXS5ub3JtYWxpemVkW3VdPW19dC5jaGVja1Jlc29ydChyLHMsYSl9fSx1cGRhdGVDYWNoZTpmdW5jdGlvbihlLHIsbyl7ZS5wYXJzZXJzJiZlLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhlLG8pLHQuYnVpbGRDYWNoZShlLHIsbyl9LGFwcGVuZENhY2hlOmZ1bmN0aW9uKGUscil7dmFyIG8scyxhLG4saSxsLGQsYz1lLnRhYmxlLGc9ZS4kdGJvZGllcyxwPVtdLHU9ZS5jYWNoZTtpZih0LmlzRW1wdHlPYmplY3QodSkpcmV0dXJuIGUuYXBwZW5kZXI/ZS5hcHBlbmRlcihjLHApOmMuaXNVcGRhdGluZz9lLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpOiIiO2Zvcih0LmRlYnVnKGUsImNvcmUiKSYmKGQ9bmV3IERhdGUpLGw9MDtsPGcubGVuZ3RoO2wrKylpZigoYT1nLmVxKGwpKS5sZW5ndGgpe2ZvcihuPXQucHJvY2Vzc1Rib2R5KGMsYSwhMCkscz0obz11W2xdLm5vcm1hbGl6ZWQpLmxlbmd0aCxpPTA7aTxzO2krKylwW3AubGVuZ3RoXT1vW2ldW2UuY29sdW1uc10uJHJvdyxlLmFwcGVuZGVyJiYoIWUucGFnZXJ8fGUucGFnZXIucmVtb3ZlUm93c3x8ZS5wYWdlci5hamF4KXx8bi5hcHBlbmQob1tpXVtlLmNvbHVtbnNdLiRyb3cpO3QucHJvY2Vzc1Rib2R5KGMsbiwhMSl9ZS5hcHBlbmRlciYmZS5hcHBlbmRlcihjLHApLHQuZGVidWcoZSwiY29yZSIpJiZjb25zb2xlLmxvZygiUmVidWlsdCB0YWJsZSIrdC5iZW5jaG1hcmsoZCkpLHJ8fGUuYXBwZW5kZXJ8fHQuYXBwbHlXaWRnZXQoYyksYy5pc1VwZGF0aW5nJiZlLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpfSxjb21tb25VcGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UuJHRhYmxlLmZpbmQoZS5zZWxlY3RvclJlbW92ZSkucmVtb3ZlKCksdC5zZXR1cFBhcnNlcnMoZSksdC5idWlsZENhY2hlKGUpLHQuY2hlY2tSZXNvcnQoZSxyLG8pfSxpbml0U29ydDpmdW5jdGlvbihyLG8scyl7aWYoci50YWJsZS5pc1VwZGF0aW5nKXJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0U29ydChyLG8scyl9LDUwKTt2YXIgYSxuLGksbCxkLGMsZyxwPSFzW3Iuc29ydE11bHRpU29ydEtleV0sdT1yLnRhYmxlLGY9ci4kaGVhZGVycy5sZW5ndGgsaD10LmdldENsb3Nlc3QoZShvKSwidGgsIHRkIiksbT1wYXJzZUludChoLmF0dHIoImRhdGEtY29sdW1uIiksMTApLGI9ci5zb3J0VmFyc1ttXS5vcmRlcjtpZihoPWhbMF0sci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsdSksYz0oci5zb3J0VmFyc1ttXS5jb3VudCsxKSViLmxlbmd0aCxyLnNvcnRWYXJzW21dLmNvdW50PXNbci5zb3J0UmVzZXRLZXldPzI6YyxyLnNvcnRSZXN0YXJ0KWZvcihpPTA7aTxmO2krKylnPXIuJGhlYWRlcnMuZXEoaSksbSE9PShjPXBhcnNlSW50KGcuYXR0cigiZGF0YS1jb2x1bW4iKSwxMCkpJiYocHx8Zy5oYXNDbGFzcyh0LmNzcy5zb3J0Tm9uZSkpJiYoci5zb3J0VmFyc1tjXS5jb3VudD0tMSk7aWYocCl7aWYoci5zb3J0TGlzdD1bXSxyLmxhc3Quc29ydExpc3Q9W10sbnVsbCE9PXIuc29ydEZvcmNlKWZvcihhPXIuc29ydEZvcmNlLG49MDtuPGEubGVuZ3RoO24rKylhW25dWzBdIT09bSYmKHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPWFbbl0pO2lmKChsPWJbci5zb3J0VmFyc1ttXS5jb3VudF0pPDImJihyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1bbSxsXSxoLmNvbFNwYW4+MSkpZm9yKG49MTtuPGguY29sU3BhbjtuKyspci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20rbixsXSxyLnNvcnRWYXJzW20rbl0uY291bnQ9ZS5pbkFycmF5KGwsYil9ZWxzZSBpZihyLnNvcnRMaXN0PWUuZXh0ZW5kKFtdLHIubGFzdC5zb3J0TGlzdCksdC5pc1ZhbHVlSW5BcnJheShtLHIuc29ydExpc3QpPj0wKWZvcihuPTA7bjxyLnNvcnRMaXN0Lmxlbmd0aDtuKyspKGM9ci5zb3J0TGlzdFtuXSlbMF09PT1tJiYoY1sxXT1iW3Iuc29ydFZhcnNbbV0uY291bnRdLDI9PT1jWzFdJiYoci5zb3J0TGlzdC5zcGxpY2UobiwxKSxyLnNvcnRWYXJzW21dLmNvdW50PS0xKSk7ZWxzZSBpZigobD1iW3Iuc29ydFZhcnNbbV0uY291bnRdKTwyJiYoci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20sbF0saC5jb2xTcGFuPjEpKWZvcihuPTE7bjxoLmNvbFNwYW47bisrKXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttK24sbF0sci5zb3J0VmFyc1ttK25dLmNvdW50PWUuaW5BcnJheShsLGIpO2lmKHIubGFzdC5zb3J0TGlzdD1lLmV4dGVuZChbXSxyLnNvcnRMaXN0KSxyLnNvcnRMaXN0Lmxlbmd0aCYmci5zb3J0QXBwZW5kJiYoYT1lLmlzQXJyYXkoci5zb3J0QXBwZW5kKT9yLnNvcnRBcHBlbmQ6ci5zb3J0QXBwZW5kW3Iuc29ydExpc3RbMF1bMF1dLCF0LmlzRW1wdHlPYmplY3QoYSkpKWZvcihuPTA7bjxhLmxlbmd0aDtuKyspaWYoYVtuXVswXSE9PW0mJnQuaXNWYWx1ZUluQXJyYXkoYVtuXVswXSxyLnNvcnRMaXN0KTwwKXtpZihsPWFbbl1bMV0sZD0oIiIrbCkubWF0Y2goL14oYXxkfHN8b3xuKS8pKXN3aXRjaChjPXIuc29ydExpc3RbMF1bMV0sZFswXSl7Y2FzZSJkIjpsPTE7YnJlYWs7Y2FzZSJzIjpsPWM7YnJlYWs7Y2FzZSJvIjpsPTA9PT1jPzE6MDticmVhaztjYXNlIm4iOmw9KGMrMSklYi5sZW5ndGg7YnJlYWs7ZGVmYXVsdDpsPTB9ci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W2Fbbl1bMF0sbF19ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRCZWdpbiIsdSksc2V0VGltZW91dChmdW5jdGlvbigpe3Quc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVmb3JlRW5kIix1KSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEVuZCIsdSl9LDEpfSxtdWx0aXNvcnQ6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9W10sbD0wLGQ9ZS50ZXh0U29ydGVyfHwiIixjPWUuc29ydExpc3QsZz1jLmxlbmd0aCxwPWUuJHRib2RpZXMubGVuZ3RoO2lmKCFlLnNlcnZlclNpZGVTb3J0aW5nJiYhdC5pc0VtcHR5T2JqZWN0KGUuY2FjaGUpKXtpZih0LmRlYnVnKGUsImNvcmUiKSYmKG89bmV3IERhdGUpLCJvYmplY3QiPT10eXBlb2YgZClmb3Iocz1lLmNvbHVtbnM7cy0tOykiZnVuY3Rpb24iPT10eXBlb2YoYT10LmdldENvbHVtbkRhdGEobixkLHMpKSYmKGlbc109YSk7Zm9yKHI9MDtyPHA7cisrKXM9ZS5jYWNoZVtyXS5jb2xNYXgsZS5jYWNoZVtyXS5ub3JtYWxpemVkLnNvcnQoZnVuY3Rpb24ocixvKXt2YXIgYSxwLHUsZixoLG0sYjtmb3IoYT0wO2E8ZzthKyspe2lmKHU9Y1thXVswXSxmPWNbYV1bMV0sbD0wPT09ZixlLnNvcnRTdGFibGUmJnJbdV09PT1vW3VdJiYxPT09ZylyZXR1cm4gcltlLmNvbHVtbnNdLm9yZGVyLW9bZS5jb2x1bW5zXS5vcmRlcjtpZihwPS9uL2kudGVzdCh0LmdldFNvcnRUeXBlKGUucGFyc2Vycyx1KSkscCYmZS5zdHJpbmdzW3VdPyhwPSJib29sZWFuIj09dHlwZW9mIHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/KGw/MTotMSkqKHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/LTE6MSk6ZS5zdHJpbmdzW3VdP3Quc3RyaW5nW2Uuc3RyaW5nc1t1XV18fDA6MCxoPWUubnVtYmVyU29ydGVyP2UubnVtYmVyU29ydGVyKHJbdV0sb1t1XSxsLHNbdV0sbik6dFsic29ydE51bWVyaWMiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSxwLHNbdV0sdSxlKSk6KG09bD9yOm8sYj1sP286cixoPSJmdW5jdGlvbiI9PXR5cGVvZiBkP2QobVt1XSxiW3VdLGwsdSxuKToiZnVuY3Rpb24iPT10eXBlb2YgaVt1XT9pW3VdKG1bdV0sYlt1XSxsLHUsbik6dFsic29ydE5hdHVyYWwiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSx1LGUpKSxoKXJldHVybiBofXJldHVybiByW2UuY29sdW1uc10ub3JkZXItb1tlLmNvbHVtbnNdLm9yZGVyfSk7dC5kZWJ1ZyhlLCJjb3JlIikmJmNvbnNvbGUubG9nKCJBcHBseWluZyBzb3J0ICIrYy50b1N0cmluZygpK3QuYmVuY2htYXJrKG8pKX19LHJlc29ydENvbXBsZXRlOmZ1bmN0aW9uKHQscil7dC50YWJsZS5pc1VwZGF0aW5nJiZ0LiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLHQudGFibGUpLGUuaXNGdW5jdGlvbihyKSYmcih0LnRhYmxlKX0sY2hlY2tSZXNvcnQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhPWUuaXNBcnJheShvKT9vOnIuc29ydExpc3Q7ITE9PT0odm9pZCAwPT09bz9yLnJlc29ydDpvKXx8ci5zZXJ2ZXJTaWRlU29ydGluZ3x8ci50YWJsZS5pc1Byb2Nlc3Npbmc/KHQucmVzb3J0Q29tcGxldGUocixzKSx0LmFwcGx5V2lkZ2V0KHIudGFibGUsITEpKTphLmxlbmd0aD90LnNvcnRPbihyLGEsZnVuY3Rpb24oKXt0LnJlc29ydENvbXBsZXRlKHIscyl9LCEwKTp0LnNvcnRSZXNldChyLGZ1bmN0aW9uKCl7dC5yZXNvcnRDb21wbGV0ZShyLHMpLHQuYXBwbHlXaWRnZXQoci50YWJsZSwhMSl9KX0sc29ydE9uOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuPXIudGFibGU7ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsbiksdC51cGRhdGVIZWFkZXJTb3J0Q291bnQocixvKSx0LnNldEhlYWRlcnNDc3Mociksci5kZWxheUluaXQmJnQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSYmdC5idWlsZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVnaW4iLG4pLHQubXVsdGlzb3J0KHIpLHQuYXBwZW5kQ2FjaGUocixhKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZm9yZUVuZCIsbiksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRFbmQiLG4pLHQuYXBwbHlXaWRnZXQobiksZS5pc0Z1bmN0aW9uKHMpJiZzKG4pfSxzb3J0UmVzZXQ6ZnVuY3Rpb24ocixvKXtyLnNvcnRMaXN0PVtdLHQuc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpO3ZhciBzO2ZvcihzPTA7czxyLmNvbHVtbnM7cysrKXIuc29ydFZhcnNbc10uY291bnQ9LTE7ZS5pc0Z1bmN0aW9uKG8pJiZvKHIudGFibGUpfSxnZXRTb3J0VHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiBlJiZlW3RdP2VbdF0udHlwZXx8IiI6IiJ9LGdldE9yZGVyOmZ1bmN0aW9uKGUpe3JldHVybi9eZC9pLnRlc3QoZSl8fDE9PT1lfSxzb3J0TmF0dXJhbDpmdW5jdGlvbihlLHIpe2lmKGU9PT1yKXJldHVybiAwO2U9ZS50b1N0cmluZygpLHI9ci50b1N0cmluZygpO3ZhciBvLHMsYSxuLGksbCxkPXQucmVnZXg7aWYoZC5oZXgudGVzdChyKSl7aWYobz1wYXJzZUludCgoZXx8IiIpLm1hdGNoKGQuaGV4KSwxNikscz1wYXJzZUludCgocnx8IiIpLm1hdGNoKGQuaGV4KSwxNiksbzxzKXJldHVybi0xO2lmKG8+cylyZXR1cm4gMX1mb3Iobz0oZXx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIikscz0ocnx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIiksbD1NYXRoLm1heChvLmxlbmd0aCxzLmxlbmd0aCksaT0wO2k8bDtpKyspe2lmKGE9aXNOYU4ob1tpXSk/b1tpXXx8MDpwYXJzZUZsb2F0KG9baV0pfHwwLG49aXNOYU4oc1tpXSk/c1tpXXx8MDpwYXJzZUZsb2F0KHNbaV0pfHwwLGlzTmFOKGEpIT09aXNOYU4obikpcmV0dXJuIGlzTmFOKGEpPzE6LTE7aWYodHlwZW9mIGEhPXR5cGVvZiBuJiYoYSs9IiIsbis9IiIpLGE8bilyZXR1cm4tMTtpZihhPm4pcmV0dXJuIDF9cmV0dXJuIDB9LHNvcnROYXR1cmFsQXNjOmZ1bmN0aW9uKGUscixvLHMpe2lmKGU9PT1yKXJldHVybiAwO3ZhciBhPXQuc3RyaW5nW3MuZW1wdGllc1tvXXx8cy5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8tMToxOi1hfHwtMToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOmF8fDE6dC5zb3J0TmF0dXJhbChlLHIpfSxzb3J0TmF0dXJhbERlc2M6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGE9dC5zdHJpbmdbcy5lbXB0aWVzW29dfHxzLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWE/ImJvb2xlYW4iPT10eXBlb2YgYT9hPy0xOjE6YXx8MToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOi1hfHwtMTp0LnNvcnROYXR1cmFsKHIsZSl9LHNvcnRUZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+dD8xOmU8dD8tMTowfSxnZXRUZXh0VmFsdWU6ZnVuY3Rpb24oZSx0LHIpe2lmKHIpe3ZhciBvLHM9ZT9lLmxlbmd0aDowLGE9cit0O2ZvcihvPTA7bzxzO28rKylhKz1lLmNoYXJDb2RlQXQobyk7cmV0dXJuIHQqYX1yZXR1cm4gMH0sc29ydE51bWVyaWNBc2M6ZnVuY3Rpb24oZSxyLG8scyxhLG4pe2lmKGU9PT1yKXJldHVybiAwO3ZhciBpPXQuc3RyaW5nW24uZW1wdGllc1thXXx8bi5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8tMToxOi1pfHwtMToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOml8fDE6KGlzTmFOKGUpJiYoZT10LmdldFRleHRWYWx1ZShlLG8scykpLGlzTmFOKHIpJiYocj10LmdldFRleHRWYWx1ZShyLG8scykpLGUtcil9LHNvcnROdW1lcmljRGVzYzpmdW5jdGlvbihlLHIsbyxzLGEsbil7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGk9dC5zdHJpbmdbbi5lbXB0aWVzW2FdfHxuLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWk/ImJvb2xlYW4iPT10eXBlb2YgaT9pPy0xOjE6aXx8MToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOi1pfHwtMTooaXNOYU4oZSkmJihlPXQuZ2V0VGV4dFZhbHVlKGUsbyxzKSksaXNOYU4ocikmJihyPXQuZ2V0VGV4dFZhbHVlKHIsbyxzKSksci1lKX0sc29ydE51bWVyaWM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSxhZGRXaWRnZXQ6ZnVuY3Rpb24oZSl7ZS5pZCYmIXQuaXNFbXB0eU9iamVjdCh0LmdldFdpZGdldEJ5SWQoZS5pZCkpJiZjb25zb2xlLndhcm4oJyInK2UuaWQrJyIgd2lkZ2V0IHdhcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UhJyksdC53aWRnZXRzW3Qud2lkZ2V0cy5sZW5ndGhdPWV9LGhhc1dpZGdldDpmdW5jdGlvbih0LHIpe3JldHVybih0PWUodCkpLmxlbmd0aCYmdFswXS5jb25maWcmJnRbMF0uY29uZmlnLndpZGdldEluaXRbcl18fCExfSxnZXRXaWRnZXRCeUlkOmZ1bmN0aW9uKGUpe3ZhciByLG8scz10LndpZGdldHMubGVuZ3RoO2ZvcihyPTA7cjxzO3IrKylpZigobz10LndpZGdldHNbcl0pJiZvLmlkJiZvLmlkLnRvTG93ZXJDYXNlKCk9PT1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIG99LGFwcGx5V2lkZ2V0T3B0aW9uczpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbj1yLmNvbmZpZyxpPW4ud2lkZ2V0cy5sZW5ndGg7aWYoaSlmb3Iobz0wO288aTtvKyspKHM9dC5nZXRXaWRnZXRCeUlkKG4ud2lkZ2V0c1tvXSkpJiZzLm9wdGlvbnMmJihhPWUuZXh0ZW5kKCEwLHt9LHMub3B0aW9ucyksbi53aWRnZXRPcHRpb25zPWUuZXh0ZW5kKCEwLGEsbi53aWRnZXRPcHRpb25zKSxlLmV4dGVuZCghMCx0LmRlZmF1bHRzLndpZGdldE9wdGlvbnMscy5vcHRpb25zKSl9LGFkZFdpZGdldEZyb21DbGFzczpmdW5jdGlvbihlKXt2YXIgcixvLHM9ZS5jb25maWcsYT0iXiIrcy53aWRnZXRDbGFzcy5yZXBsYWNlKHQucmVnZXgudGVtcGxhdGVOYW1lLCIoXFxTKykrIikrIiQiLG49bmV3IFJlZ0V4cChhLCJnIiksaT0oZS5jbGFzc05hbWV8fCIiKS5zcGxpdCh0LnJlZ2V4LnNwYWNlcyk7aWYoaS5sZW5ndGgpZm9yKHI9aS5sZW5ndGgsbz0wO288cjtvKyspaVtvXS5tYXRjaChuKSYmKHMud2lkZ2V0c1tzLndpZGdldHMubGVuZ3RoXT1pW29dLnJlcGxhY2UobiwiJDEiKSl9LGFwcGx5V2lkZ2V0SWQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsPShyPWUocilbMF0pLmNvbmZpZyxkPWwud2lkZ2V0T3B0aW9ucyxjPXQuZGVidWcobCwiY29yZSIpLGc9dC5nZXRXaWRnZXRCeUlkKG8pO2cmJihpPWcuaWQsYT0hMSxlLmluQXJyYXkoaSxsLndpZGdldHMpPDAmJihsLndpZGdldHNbbC53aWRnZXRzLmxlbmd0aF09aSksYyYmKG49bmV3IERhdGUpLCFzJiZsLndpZGdldEluaXRbaV18fChsLndpZGdldEluaXRbaV09ITAsci5oYXNJbml0aWFsaXplZCYmdC5hcHBseVdpZGdldE9wdGlvbnMociksImZ1bmN0aW9uIj09dHlwZW9mIGcuaW5pdCYmKGE9ITAsYyYmY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJJbml0aWFsaXppbmcgIitpKyIgd2lkZ2V0IiksZy5pbml0KHIsZyxsLGQpKSksc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGcuZm9ybWF0fHwoYT0hMCxjJiZjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIlVwZGF0aW5nICIraSsiIHdpZGdldCIpLGcuZm9ybWF0KHIsbCxkLCExKSksYyYmYSYmKGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisocz8iaW5pdGlhbGl6aW5nICI6ImFwcGx5aW5nICIpK2krIiB3aWRnZXQiK3QuYmVuY2htYXJrKG4pKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpKX0sYXBwbHlXaWRnZXQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYz0ocj1lKHIpWzBdKS5jb25maWcsZz10LmRlYnVnKGMsImNvcmUiKSxwPVtdO2lmKCExPT09b3x8IXIuaGFzSW5pdGlhbGl6ZWR8fCFyLmlzQXBwbHlpbmdXaWRnZXRzJiYhci5pc1VwZGF0aW5nKXtpZihnJiYoZD1uZXcgRGF0ZSksdC5hZGRXaWRnZXRGcm9tQ2xhc3MociksY2xlYXJUaW1lb3V0KGMudGltZXJSZWFkeSksYy53aWRnZXRzLmxlbmd0aCl7Zm9yKHIuaXNBcHBseWluZ1dpZGdldHM9ITAsYy53aWRnZXRzPWUuZ3JlcChjLndpZGdldHMsZnVuY3Rpb24odCxyKXtyZXR1cm4gZS5pbkFycmF5KHQsYy53aWRnZXRzKT09PXJ9KSxuPShpPWMud2lkZ2V0c3x8W10pLmxlbmd0aCxhPTA7YTxuO2ErKykobD10LmdldFdpZGdldEJ5SWQoaVthXSkpJiZsLmlkPyhsLnByaW9yaXR5fHwobC5wcmlvcml0eT0xMCkscFthXT1sKTpnJiZjb25zb2xlLndhcm4oJyInK2lbYV0rJyIgd2FzIGVuYWJsZWQsIGJ1dCB0aGUgd2lkZ2V0IGNvZGUgaGFzIG5vdCBiZWVuIGxvYWRlZCEnKTtmb3IocC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucHJpb3JpdHk8dC5wcmlvcml0eT8tMTplLnByaW9yaXR5PT09dC5wcmlvcml0eT8wOjF9KSxuPXAubGVuZ3RoLGcmJmNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiU3RhcnQgIisobz8iaW5pdGlhbGl6aW5nIjoiYXBwbHlpbmciKSsiIHdpZGdldHMiKSxhPTA7YTxuO2ErKykobD1wW2FdKSYmbC5pZCYmdC5hcHBseVdpZGdldElkKHIsbC5pZCxvKTtnJiZjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9Yy50aW1lclJlYWR5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmlzQXBwbHlpbmdXaWRnZXRzPSExLGUuZGF0YShyLCJsYXN0V2lkZ2V0QXBwbGljYXRpb24iLG5ldyBEYXRlKSxjLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidGFibGVzb3J0ZXItcmVhZHkiKSxvfHwiZnVuY3Rpb24iIT10eXBlb2Ygc3x8cyhyKSxnJiYobD1jLndpZGdldHMubGVuZ3RoLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisoITA9PT1vPyJpbml0aWFsaXppbmcgIjoiYXBwbHlpbmcgIikrbCsiIHdpZGdldCIrKDEhPT1sPyJzIjoiIikrdC5iZW5jaG1hcmsoZCkpKX0sMTApfX0scmVtb3ZlV2lkZ2V0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkPShyPWUocilbMF0pLmNvbmZpZztpZighMD09PW8pZm9yKG89W10sbD10LndpZGdldHMubGVuZ3RoLGk9MDtpPGw7aSsrKShuPXQud2lkZ2V0c1tpXSkmJm4uaWQmJihvW28ubGVuZ3RoXT1uLmlkKTtlbHNlIG89KGUuaXNBcnJheShvKT9vLmpvaW4oIiwiKTpvfHwiIikudG9Mb3dlckNhc2UoKS5zcGxpdCgvW1xzLF0rLyk7Zm9yKGw9by5sZW5ndGgsYT0wO2E8bDthKyspbj10LmdldFdpZGdldEJ5SWQob1thXSksKGk9ZS5pbkFycmF5KG9bYV0sZC53aWRnZXRzKSk+PTAmJiEwIT09cyYmZC53aWRnZXRzLnNwbGljZShpLDEpLG4mJm4ucmVtb3ZlJiYodC5kZWJ1ZyhkLCJjb3JlIikmJmNvbnNvbGUubG9nKChzPyJSZWZyZXNoaW5nIjoiUmVtb3ZpbmciKSsnICInK29bYV0rJyIgd2lkZ2V0Jyksbi5yZW1vdmUocixkLGQud2lkZ2V0T3B0aW9ucyxzKSxkLndpZGdldEluaXRbb1thXV09ITEpO2QuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJ3aWRnZXRSZW1vdmVFbmQiLHIpfSxyZWZyZXNoV2lkZ2V0czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbixpPShyPWUocilbMF0pLmNvbmZpZy53aWRnZXRzLGw9dC53aWRnZXRzLGQ9bC5sZW5ndGgsYz1bXSxnPWZ1bmN0aW9uKHQpe2UodCkudHJpZ2dlckhhbmRsZXIoInJlZnJlc2hDb21wbGV0ZSIpfTtmb3IoYT0wO2E8ZDthKyspKG49bFthXSkmJm4uaWQmJihvfHxlLmluQXJyYXkobi5pZCxpKTwwKSYmKGNbYy5sZW5ndGhdPW4uaWQpO3QucmVtb3ZlV2lkZ2V0KHIsYy5qb2luKCIsIiksITApLCEwIT09cz8odC5hcHBseVdpZGdldChyLG98fCExLGcpLG8mJnQuYXBwbHlXaWRnZXQociwhMSxnKSk6ZyhyKX0sYmVuY2htYXJrOmZ1bmN0aW9uKGUpe3JldHVybiIgKCIrKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWUuZ2V0VGltZSgpKSsiIG1zKSJ9LGxvZzpmdW5jdGlvbigpe2NvbnNvbGUubG9nKGFyZ3VtZW50cyl9LGRlYnVnOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJighMD09PWUuZGVidWd8fCJzdHJpbmciPT10eXBlb2YgZS5kZWJ1ZyYmZS5kZWJ1Zy5pbmRleE9mKHQpPi0xKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0saXNWYWx1ZUluQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgcixvPXQmJnQubGVuZ3RofHwwO2ZvcihyPTA7cjxvO3IrKylpZih0W3JdWzBdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX0sZm9ybWF0RmxvYXQ6ZnVuY3Rpb24ocixvKXtpZigic3RyaW5nIiE9dHlwZW9mIHJ8fCIiPT09cilyZXR1cm4gcjt2YXIgcztyZXR1cm4gcj0obyYmby5jb25maWc/ITEhPT1vLmNvbmZpZy51c051bWJlckZvcm1hdDp2b2lkIDA9PT1vfHxvKT9yLnJlcGxhY2UodC5yZWdleC5jb21tYSwiIik6ci5yZXBsYWNlKHQucmVnZXguZGlnaXROb25VUywiIikucmVwbGFjZSh0LnJlZ2V4LmNvbW1hLCIuIiksdC5yZWdleC5kaWdpdE5lZ2F0aXZlVGVzdC50ZXN0KHIpJiYocj1yLnJlcGxhY2UodC5yZWdleC5kaWdpdE5lZ2F0aXZlUmVwbGFjZSwiLSQxIikpLHM9cGFyc2VGbG9hdChyKSxpc05hTihzKT9lLnRyaW0ocik6c30saXNEaWdpdDpmdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZSk/dC5yZWdleC5kaWdpdFRlc3QudGVzdChlLnRvU3RyaW5nKCkucmVwbGFjZSh0LnJlZ2V4LmRpZ2l0UmVwbGFjZSwiIikpOiIiIT09ZX0sY29tcHV0ZUNvbHVtbkluZGV4OmZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZyxwLHUsZj1vJiZvLmNvbHVtbnN8fDAsaD1bXSxtPW5ldyBBcnJheShmKTtmb3Iocz0wO3M8ci5sZW5ndGg7cysrKWZvcihkPXJbc10uY2VsbHMsYT0wO2E8ZC5sZW5ndGg7YSsrKXtmb3IoYz1zLGc9KGw9ZFthXSkucm93U3Bhbnx8MSxwPWwuY29sU3Bhbnx8MSx2b2lkIDA9PT1oW2NdJiYoaFtjXT1bXSksbj0wO248aFtjXS5sZW5ndGgrMTtuKyspaWYodm9pZCAwPT09aFtjXVtuXSl7dT1uO2JyZWFrfWZvcihmJiZsLmNlbGxJbmRleD09PXV8fChsLnNldEF0dHJpYnV0ZT9sLnNldEF0dHJpYnV0ZSgiZGF0YS1jb2x1bW4iLHUpOmUobCkuYXR0cigiZGF0YS1jb2x1bW4iLHUpKSxuPWM7bjxjK2c7bisrKWZvcih2b2lkIDA9PT1oW25dJiYoaFtuXT1bXSksbT1oW25dLGk9dTtpPHUrcDtpKyspbVtpXT0ieCJ9cmV0dXJuIHQuY2hlY2tDb2x1bW5Db3VudChyLGgsbS5sZW5ndGgpLG0ubGVuZ3RofSxjaGVja0NvbHVtbkNvdW50OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbyxzLGE9ITAsbj1bXTtmb3Iobz0wO288dC5sZW5ndGg7bysrKWlmKHRbb10mJihzPXRbb10ubGVuZ3RoLHRbb10ubGVuZ3RoIT09cikpe2E9ITE7YnJlYWt9YXx8KGUuZWFjaChmdW5jdGlvbihlLHQpe3ZhciByPXQucGFyZW50RWxlbWVudC5ub2RlTmFtZTtuLmluZGV4T2Yocik8MCYmbi5wdXNoKHIpfSksY29uc29sZS5lcnJvcigiSW52YWxpZCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlICIrbi5qb2luKCIgb3IgIikrIjsgZXhwZWN0ZWQgIityKyIsIGJ1dCBmb3VuZCAiK3MrIiBjb2x1bW5zIikpfSxmaXhDb2x1bW5XaWR0aDpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbixpLGw9KHI9ZShyKVswXSkuY29uZmlnLGQ9bC4kdGFibGUuY2hpbGRyZW4oImNvbGdyb3VwIik7aWYoZC5sZW5ndGgmJmQuaGFzQ2xhc3ModC5jc3MuY29sZ3JvdXApJiZkLnJlbW92ZSgpLGwud2lkdGhGaXhlZCYmMD09PWwuJHRhYmxlLmNoaWxkcmVuKCJjb2xncm91cCIpLmxlbmd0aCl7Zm9yKGQ9ZSgnPGNvbGdyb3VwIGNsYXNzPSInK3QuY3NzLmNvbGdyb3VwKyciPicpLG89bC4kdGFibGUud2lkdGgoKSxuPShhPWwuJHRib2RpZXMuZmluZCgidHI6Zmlyc3QiKS5jaGlsZHJlbigiOnZpc2libGUiKSkubGVuZ3RoLGk9MDtpPG47aSsrKXM9cGFyc2VJbnQoYS5lcShpKS53aWR0aCgpL28qMWUzLDEwKS8xMCsiJSIsZC5hcHBlbmQoZSgiPGNvbD4iKS5jc3MoIndpZHRoIixzKSk7bC4kdGFibGUucHJlcGVuZChkKX19LGdldERhdGE6ZnVuY3Rpb24odCxyLG8pe3ZhciBzLGEsbj0iIixpPWUodCk7cmV0dXJuIGkubGVuZ3RoPyhzPSEhZS5tZXRhZGF0YSYmaS5tZXRhZGF0YSgpLGE9IiAiKyhpLmF0dHIoImNsYXNzIil8fCIiKSx2b2lkIDAhPT1pLmRhdGEobyl8fHZvaWQgMCE9PWkuZGF0YShvLnRvTG93ZXJDYXNlKCkpP24rPWkuZGF0YShvKXx8aS5kYXRhKG8udG9Mb3dlckNhc2UoKSk6cyYmdm9pZCAwIT09c1tvXT9uKz1zW29dOnImJnZvaWQgMCE9PXJbb10/bis9cltvXToiICIhPT1hJiZhLm1hdGNoKCIgIitvKyItIikmJihuPWEubWF0Y2gobmV3IFJlZ0V4cCgiXFxzIitvKyItKFtcXHctXSspIikpWzFdfHwiIiksZS50cmltKG4pKToiIn0sZ2V0Q29sdW1uRGF0YTpmdW5jdGlvbih0LHIsbyxzLGEpe2lmKCJvYmplY3QiIT10eXBlb2Ygcnx8bnVsbD09PXIpcmV0dXJuIHI7dmFyIG4saT0odD1lKHQpWzBdKS5jb25maWcsbD1hfHxpLiRoZWFkZXJzLGQ9aS4kaGVhZGVySW5kZXhlZCYmaS4kaGVhZGVySW5kZXhlZFtvXXx8bC5maW5kKCdbZGF0YS1jb2x1bW49IicrbysnIl06bGFzdCcpO2lmKHZvaWQgMCE9PXJbb10pcmV0dXJuIHM/cltvXTpyW2wuaW5kZXgoZCldO2ZvcihuIGluIHIpaWYoInN0cmluZyI9PXR5cGVvZiBuJiZkLmZpbHRlcihuKS5hZGQoZC5maW5kKG4pKS5sZW5ndGgpcmV0dXJuIHJbbl19LGlzUHJvY2Vzc2luZzpmdW5jdGlvbihyLG8scyl7dmFyIGE9KHI9ZShyKSlbMF0uY29uZmlnLG49c3x8ci5maW5kKCIuIit0LmNzcy5oZWFkZXIpO28/KHZvaWQgMCE9PXMmJmEuc29ydExpc3QubGVuZ3RoPjAmJihuPW4uZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuc29ydERpc2FibGVkJiZ0LmlzVmFsdWVJbkFycmF5KHBhcnNlRmxvYXQoZSh0aGlzKS5hdHRyKCJkYXRhLWNvbHVtbiIpKSxhLnNvcnRMaXN0KT49MH0pKSxyLmFkZChuKS5hZGRDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpKTpyLmFkZChuKS5yZW1vdmVDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpfSxwcm9jZXNzVGJvZHk6ZnVuY3Rpb24odCxyLG8pe2lmKHQ9ZSh0KVswXSxvKXJldHVybiB0LmlzUHJvY2Vzc2luZz0hMCxyLmJlZm9yZSgnPGNvbGdyb3VwIGNsYXNzPSJ0YWJsZXNvcnRlci1zYXZlbXlwbGFjZSIvPicpLGUuZm4uZGV0YWNoP3IuZGV0YWNoKCk6ci5yZW1vdmUoKTt2YXIgcz1lKHQpLmZpbmQoImNvbGdyb3VwLnRhYmxlc29ydGVyLXNhdmVteXBsYWNlIik7ci5pbnNlcnRBZnRlcihzKSxzLnJlbW92ZSgpLHQuaXNQcm9jZXNzaW5nPSExfSxjbGVhclRhYmxlQm9keTpmdW5jdGlvbih0KXtlKHQpWzBdLmNvbmZpZy4kdGJvZGllcy5jaGlsZHJlbigpLmRldGFjaCgpfSxjaGFyYWN0ZXJFcXVpdmFsZW50czp7YToiw6HDoMOiw6PDpMSFw6UiLEE6IsOBw4DDgsODw4TEhMOFIixjOiLDp8SHxI0iLEM6IsOHxIbEjCIsZToiw6nDqMOqw6vEm8SZIixFOiLDicOIw4rDi8SaxJgiLGk6IsOtw6zEsMOuw6/EsSIsSToiw43DjMSww47DjyIsbzoiw7PDssO0w7XDtsWNIixPOiLDk8OSw5TDlcOWxYwiLHNzOiLDnyIsU1M6IuG6niIsdToiw7rDucO7w7zFryIsVToiw5rDmcObw5zFriJ9LHJlcGxhY2VBY2NlbnRzOmZ1bmN0aW9uKGUpe3ZhciByLG89IlsiLHM9dC5jaGFyYWN0ZXJFcXVpdmFsZW50cztpZighdC5jaGFyYWN0ZXJSZWdleCl7dC5jaGFyYWN0ZXJSZWdleEFycmF5PXt9O2ZvcihyIGluIHMpInN0cmluZyI9PXR5cGVvZiByJiYobys9c1tyXSx0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl09bmV3IFJlZ0V4cCgiWyIrc1tyXSsiXSIsImciKSk7dC5jaGFyYWN0ZXJSZWdleD1uZXcgUmVnRXhwKG8rIl0iKX1pZih0LmNoYXJhY3RlclJlZ2V4LnRlc3QoZSkpZm9yKHIgaW4gcykic3RyaW5nIj09dHlwZW9mIHImJihlPWUucmVwbGFjZSh0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl0scikpO3JldHVybiBlfSx2YWxpZGF0ZU9wdGlvbnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG4saT0iaGVhZGVycyBzb3J0Rm9yY2Ugc29ydExpc3Qgc29ydEFwcGVuZCB3aWRnZXRzIi5zcGxpdCgiICIpLGw9ci5vcmlnaW5hbFNldHRpbmdzO2lmKGwpe3QuZGVidWcociwiY29yZSIpJiYobj1uZXcgRGF0ZSk7Zm9yKG8gaW4gbClpZigidW5kZWZpbmVkIj09PShhPXR5cGVvZiB0LmRlZmF1bHRzW29dKSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ0YWJsZS5jb25maWcuJytvKyciIG9wdGlvbiBub3QgcmVjb2duaXplZCcpO2Vsc2UgaWYoIm9iamVjdCI9PT1hKWZvcihzIGluIGxbb10pYT10LmRlZmF1bHRzW29dJiZ0eXBlb2YgdC5kZWZhdWx0c1tvXVtzXSxlLmluQXJyYXkobyxpKTwwJiYidW5kZWZpbmVkIj09PWEmJmNvbnNvbGUud2FybignVGFibGVzb3J0ZXIgV2FybmluZyEgInRhYmxlLmNvbmZpZy4nK28rIi4iK3MrJyIgb3B0aW9uIG5vdCByZWNvZ25pemVkJyk7dC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ2YWxpZGF0ZSBvcHRpb25zIHRpbWU6Iit0LmJlbmNobWFyayhuKSl9fSxyZXN0b3JlSGVhZGVyczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ZShyKVswXS5jb25maWcsbj1hLiR0YWJsZS5maW5kKGEuc2VsZWN0b3JIZWFkZXJzKSxpPW4ubGVuZ3RoO2ZvcihvPTA7bzxpO28rKykocz1uLmVxKG8pKS5maW5kKCIuIit0LmNzcy5oZWFkZXJJbikubGVuZ3RoJiZzLmh0bWwoYS5oZWFkZXJDb250ZW50W29dKX0sZGVzdHJveTpmdW5jdGlvbihyLG8scyl7aWYoKHI9ZShyKVswXSkuaGFzSW5pdGlhbGl6ZWQpe3QucmVtb3ZlV2lkZ2V0KHIsITAsITEpO3ZhciBhLG49ZShyKSxpPXIuY29uZmlnLGw9bi5maW5kKCJ0aGVhZDpmaXJzdCIpLGQ9bC5maW5kKCJ0ci4iK3QuY3NzLmhlYWRlclJvdykucmVtb3ZlQ2xhc3ModC5jc3MuaGVhZGVyUm93KyIgIitpLmNzc0hlYWRlclJvdyksYz1uLmZpbmQoInRmb290OmZpcnN0ID4gdHIiKS5jaGlsZHJlbigidGgsIHRkIik7ITE9PT1vJiZlLmluQXJyYXkoInVpdGhlbWUiLGkud2lkZ2V0cyk+PTAmJihuLnRyaWdnZXJIYW5kbGVyKCJhcHBseVdpZGdldElkIixbInVpdGhlbWUiXSksbi50cmlnZ2VySGFuZGxlcigiYXBwbHlXaWRnZXRJZCIsWyJ6ZWJyYSJdKSksbC5maW5kKCJ0ciIpLm5vdChkKS5yZW1vdmUoKSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgdXBkYXRlQ2VsbCBhZGRSb3dzIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyByZW1vdmVXaWRnZXQgZGVzdHJveSBtb3VzZXVwIG1vdXNlbGVhdmUgIisia2V5cHJlc3Mgc29ydEJlZ2luIHNvcnRFbmQgcmVzZXRUb0xvYWRTdGF0ZSAiLnNwbGl0KCIgIikuam9pbihpLm5hbWVzcGFjZSsiICIpLG4ucmVtb3ZlRGF0YSgidGFibGVzb3J0ZXIiKS51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLGkuJGhlYWRlcnMuYWRkKGMpLnJlbW92ZUNsYXNzKFt0LmNzcy5oZWFkZXIsaS5jc3NIZWFkZXIsaS5jc3NBc2MsaS5jc3NEZXNjLHQuY3NzLnNvcnRBc2MsdC5jc3Muc29ydERlc2MsdC5jc3Muc29ydE5vbmVdLmpvaW4oIiAiKSkucmVtb3ZlQXR0cigiZGF0YS1jb2x1bW4iKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSxkLmZpbmQoaS5zZWxlY3RvclNvcnQpLnVuYmluZCgibW91c2Vkb3duIG1vdXNldXAga2V5cHJlc3MgIi5zcGxpdCgiICIpLmpvaW4oaS5uYW1lc3BhY2UrIiAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLHQucmVzdG9yZUhlYWRlcnMociksbi50b2dnbGVDbGFzcyh0LmNzcy50YWJsZSsiICIraS50YWJsZUNsYXNzKyIgdGFibGVzb3J0ZXItIitpLnRoZW1lLCExPT09byksbi5yZW1vdmVDbGFzcyhpLm5hbWVzcGFjZS5zbGljZSgxKSksci5oYXNJbml0aWFsaXplZD0hMSxkZWxldGUgci5jb25maWcuY2FjaGUsImZ1bmN0aW9uIj09dHlwZW9mIHMmJnMociksdC5kZWJ1ZyhpLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ0YWJsZXNvcnRlciBoYXMgYmVlbiByZW1vdmVkIil9fX07ZS5mbi50YWJsZXNvcnRlcj1mdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxzPWUuZXh0ZW5kKCEwLHt9LHQuZGVmYXVsdHMscix0Lmluc3RhbmNlTWV0aG9kcyk7cy5vcmlnaW5hbFNldHRpbmdzPXIsIW8uaGFzSW5pdGlhbGl6ZWQmJnQuYnVpbGRUYWJsZSYmIlRBQkxFIiE9PXRoaXMubm9kZU5hbWU/dC5idWlsZFRhYmxlKG8scyk6dC5zZXR1cChvLHMpfSl9LHdpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2d8fCh0LmxvZ3M9W10sY29uc29sZT17fSxjb25zb2xlLmxvZz1jb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj1jb25zb2xlLnRhYmxlPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50czphcmd1bWVudHNbMF07dC5sb2dzW3QubG9ncy5sZW5ndGhdPXtkYXRlOkRhdGUubm93KCksbG9nOmV9fSksdC5hZGRQYXJzZXIoe2lkOiJuby1wYXJzZXIiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbigpe3JldHVybiIifSx0eXBlOiJ0ZXh0In0pLHQuYWRkUGFyc2VyKHtpZDoidGV4dCIsaXM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9by5jb25maWc7cmV0dXJuIHImJihyPWUudHJpbShzLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpLHI9cy5zb3J0TG9jYWxlQ29tcGFyZT90LnJlcGxhY2VBY2NlbnRzKHIpOnIpLHJ9LHR5cGU6InRleHQifSksdC5yZWdleC5ub25kaWdpdD0vW15cdywuIFwtKCldL2csdC5hZGRQYXJzZXIoe2lkOiJkaWdpdCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNEaWdpdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC5jdXJyZW5jeVJlcGxhY2U9L1srXC0sLiBdL2csdC5yZWdleC5jdXJyZW5jeVRlc3Q9L15cKD9cZCtbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXXxbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXVxkK1wpPyQvLHQuYWRkUGFyc2VyKHtpZDoiY3VycmVuY3kiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiBlPShlfHwiIikucmVwbGFjZSh0LnJlZ2V4LmN1cnJlbmN5UmVwbGFjZSwiIiksdC5yZWdleC5jdXJyZW5jeVRlc3QudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC51cmxQcm90b2NvbFRlc3Q9L14oaHR0cHM/fGZ0cHxmaWxlKTpcL1wvLyx0LnJlZ2V4LnVybFByb3RvY29sUmVwbGFjZT0vKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLyh3d3dcLik/Lyx0LmFkZFBhcnNlcih7aWQ6InVybCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgudXJsUHJvdG9jb2xUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihyKXtyZXR1cm4gcj9lLnRyaW0oci5yZXBsYWNlKHQucmVnZXgudXJsUHJvdG9jb2xSZXBsYWNlLCIiKSk6cn0sdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhc2g9Ly0vZyx0LnJlZ2V4Lmlzb0RhdGU9L15cZHs0fVtcL1wtXVxkezEsMn1bXC9cLV1cZHsxLDJ9Lyx0LmFkZFBhcnNlcih7aWQ6Imlzb0RhdGUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4Lmlzb0RhdGUudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGFzaCwiLyIpKTplO3JldHVybiByIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocik/ci5nZXRUaW1lKCk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnBlcmNlbnQ9LyUvZyx0LnJlZ2V4LnBlcmNlbnRUZXN0PS8oXGRccyo/JXwlXHMqP1xkKS8sdC5hZGRQYXJzZXIoe2lkOiJwZXJjZW50IixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC5wZXJjZW50VGVzdC50ZXN0KGUpJiZlLmxlbmd0aDwxNX0sZm9ybWF0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGU/dC5mb3JtYXRGbG9hdChlLnJlcGxhY2UodC5yZWdleC5wZXJjZW50LCIiKSxyKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoiaW1hZ2UiLGlzOmZ1bmN0aW9uKGUsdCxyLG8pe3JldHVybiBvLmZpbmQoImltZyIpLmxlbmd0aD4wfSxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3JldHVybiBlKG8pLmZpbmQoImltZyIpLmF0dHIoci5jb25maWcuaW1nQXR0cnx8ImFsdCIpfHx0fSxwYXJzZWQ6ITAsdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhdGVSZXBsYWNlPS8oXFMpKFtBUF1NKSQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0MT0vXltBLVpdezMsMTB9XC4/XHMrXGR7MSwyfSw/XHMrKFxkezR9KShccytcZHsxLDJ9OlxkezJ9KDpcZHsyfSk/KFxzK1tBUF1NKT8pPyQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0Mj0vXlxkezEsMn1ccytbQS1aXXszLDEwfVxzK1xkezR9L2ksdC5hZGRQYXJzZXIoe2lkOiJ1c0xvbmdEYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC51c0xvbmdEYXRlVGVzdDEudGVzdChlKXx8dC5yZWdleC51c0xvbmdEYXRlVGVzdDIudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGF0ZVJlcGxhY2UsIiQxICQyIikpOmU7cmV0dXJuIHIgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShyKT9yLmdldFRpbWUoKTplfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXguc2hvcnREYXRlVGVzdD0vKF5cZHsxLDJ9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezR9KXwoXlxkezR9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezEsMn0pLyx0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2U9L1tcLS4sXS9nLHQucmVnZXguc2hvcnREYXRlWFhZPS8oXGR7MSwyfSlbXC9cc10oXGR7MSwyfSlbXC9cc10oXGR7NH0pLyx0LnJlZ2V4LnNob3J0RGF0ZVlNRD0vKFxkezR9KVtcL1xzXShcZHsxLDJ9KVtcL1xzXShcZHsxLDJ9KS8sdC5jb252ZXJ0Rm9ybWF0PWZ1bmN0aW9uKGUscil7ZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLCJtbWRkeXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMS8kMiIpOiJkZG1teXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMi8kMSIpOiJ5eXl5bW1kZCI9PT1yJiYoZT1lLnJlcGxhY2UodC5yZWdleC5zaG9ydERhdGVZTUQsIiQxLyQyLyQzIikpO3ZhciBvPW5ldyBEYXRlKGUpO3JldHVybiBvIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUobyk/by5nZXRUaW1lKCk6IiJ9LHQuYWRkUGFyc2VyKHtpZDoic2hvcnREYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLHQucmVnZXguc2hvcnREYXRlVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZSl7dmFyIGE9ci5jb25maWcsbj1hLiRoZWFkZXJJbmRleGVkW3NdLGk9bi5sZW5ndGgmJm4uZGF0YSgiZGF0ZUZvcm1hdCIpfHx0LmdldERhdGEobix0LmdldENvbHVtbkRhdGEocixhLmhlYWRlcnMscyksImRhdGVGb3JtYXQiKXx8YS5kYXRlRm9ybWF0O3JldHVybiBuLmxlbmd0aCYmbi5kYXRhKCJkYXRlRm9ybWF0IixpKSx0LmNvbnZlcnRGb3JtYXQoZSxpKXx8ZX1yZXR1cm4gZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnRpbWVUZXN0PS9eKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSkkfF4oKD86WzAxXVxkfFsyXVswLTRdKTpbMC01XVxkKSQvaSx0LnJlZ2V4LnRpbWVNYXRjaD0vKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSl8KCg/OlswMV1cZHxbMl1bMC00XSk6WzAtNV1cZCkvaSx0LmFkZFBhcnNlcih7aWQ6InRpbWUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4LnRpbWVUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcixvPShlfHwiIikubWF0Y2godC5yZWdleC50aW1lTWF0Y2gpLHM9bmV3IERhdGUoZSksYT1lJiYobnVsbCE9PW8/b1swXToiMDA6MDAgQU0iKSxuPWE/bmV3IERhdGUoIjIwMDAvMDEvMDEgIithLnJlcGxhY2UodC5yZWdleC5kYXRlUmVwbGFjZSwiJDEgJDIiKSk6YTtyZXR1cm4gbiBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKG4pPyhyPXMgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShzKT9zLmdldFRpbWUoKTowLHI/cGFyc2VGbG9hdChuLmdldFRpbWUoKSsiLiIrcy5nZXRUaW1lKCkpOm4uZ2V0VGltZSgpKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoibWV0YWRhdGEiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHM9ci5jb25maWcsYT1zLnBhcnNlck1ldGFkYXRhTmFtZT9zLnBhcnNlck1ldGFkYXRhTmFtZToic29ydFZhbHVlIjtyZXR1cm4gZShvKS5tZXRhZGF0YSgpW2FdfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkV2lkZ2V0KHtpZDoiemVicmEiLHByaW9yaXR5OjkwLGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZz1uZXcgUmVnRXhwKHIuY3NzQ2hpbGRSb3csImkiKSxwPXIuJHRib2RpZXMuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV90YWJsZSIpLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrci5jc3NJbmZvQmxvY2srIikiKSk7Zm9yKGw9MDtsPHAubGVuZ3RoO2wrKylmb3Iobj0wLGM9KHM9cC5lcShsKS5jaGlsZHJlbigidHI6dmlzaWJsZSIpLm5vdChyLnNlbGVjdG9yUmVtb3ZlKSkubGVuZ3RoLGQ9MDtkPGM7ZCsrKWE9cy5lcShkKSxnLnRlc3QoYVswXS5jbGFzc05hbWUpfHxuKyssaT1uJTI9PTAsYS5yZW1vdmVDbGFzcyhvLnplYnJhW2k/MTowXSkuYWRkQ2xhc3Moby56ZWJyYVtpPzA6MV0pfSxyZW1vdmU6ZnVuY3Rpb24oZSxyLG8scyl7aWYoIXMpe3ZhciBhLG4saT1yLiR0Ym9kaWVzLGw9KG8uemVicmF8fFsiZXZlbiIsIm9kZCJdKS5qb2luKCIgIik7Zm9yKGE9MDthPGkubGVuZ3RoO2ErKykobj10LnByb2Nlc3NUYm9keShlLGkuZXEoYSksITApKS5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKGwpLHQucHJvY2Vzc1Rib2R5KGUsbiwhMSl9fX0pfShlKSxlLnRhYmxlc29ydGVyfSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAgICBDb3B5cmlnaHQgMjAwOC0yMDEzCiAgICAgICAgTWF0dGhpYXMgRWhtYW5uLAogICAgICAgIE1pY2hhZWwgR2VyaGFldXNlciwKICAgICAgICBDYXJzdGVuIE1pbGxlciwKICAgICAgICBCaWFuY2EgVmFsZW50aW4sCiAgICAgICAgQWxmcmVkIFdhc3Nlcm1hbm4sCiAgICAgICAgUGV0ZXIgV2lsZmFocnQKICAgIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBvciBMR1BMIFZlcnNpb24gMyBsaWNlbnNlcy4KICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLgogICAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8+LgoqLwooZnVuY3Rpb24oKXt2YXIgZSxyLG47KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG8oZSxyKXtyZXR1cm4gQy5jYWxsKGUscil9ZnVuY3Rpb24gaShlLHIpe3ZhciBuLHQsbyxpLGEsdSxjLGYscyxsLHA9ciYmci5zcGxpdCgiLyIpLGg9ay5tYXAsZD1oJiZoWyIqIl18fHt9O2lmKGUmJiIuIj09PWUuY2hhckF0KDApKWlmKHIpe2ZvcihwPXAuc2xpY2UoMCxwLmxlbmd0aC0xKSxlPXAuY29uY2F0KGUuc3BsaXQoIi8iKSksZj0wO2UubGVuZ3RoPmY7Zis9MSlpZihsPWVbZl0sIi4iPT09bCllLnNwbGljZShmLDEpLGYtPTE7ZWxzZSBpZigiLi4iPT09bCl7aWYoMT09PWYmJigiLi4iPT09ZVsyXXx8Ii4uIj09PWVbMF0pKWJyZWFrO2Y+MCYmKGUuc3BsaWNlKGYtMSwyKSxmLT0yKX1lPWUuam9pbigiLyIpfWVsc2UgMD09PWUuaW5kZXhPZigiLi8iKSYmKGU9ZS5zdWJzdHJpbmcoMikpO2lmKChwfHxkKSYmaCl7Zm9yKG49ZS5zcGxpdCgiLyIpLGY9bi5sZW5ndGg7Zj4wO2YtPTEpe2lmKHQ9bi5zbGljZSgwLGYpLmpvaW4oIi8iKSxwKWZvcihzPXAubGVuZ3RoO3M+MDtzLT0xKWlmKG89aFtwLnNsaWNlKDAscykuam9pbigiLyIpXSxvJiYobz1vW3RdKSl7aT1vLGE9ZjticmVha31pZihpKWJyZWFrOyF1JiZkJiZkW3RdJiYodT1kW3RdLGM9Zil9IWkmJnUmJihpPXUsYT1jKSxpJiYobi5zcGxpY2UoMCxhLGkpLGU9bi5qb2luKCIvIikpfXJldHVybiBlfWZ1bmN0aW9uIGEoZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaC5hcHBseSh0LHYuY2FsbChhcmd1bWVudHMsMCkuY29uY2F0KFtlLHJdKSl9fWZ1bmN0aW9uIHUoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBpKHIsZSl9fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe2JbZV09cn19ZnVuY3Rpb24gZihlKXtpZihvKG0sZSkpe3ZhciByPW1bZV07ZGVsZXRlIG1bZV0seVtlXT0hMCxwLmFwcGx5KHQscil9aWYoIW8oYixlKSYmIW8oeSxlKSl0aHJvdyBFcnJvcigiTm8gIitlKTtyZXR1cm4gYltlXX1mdW5jdGlvbiBzKGUpe3ZhciByLG49ZT9lLmluZGV4T2YoIiEiKTotMTtyZXR1cm4gbj4tMSYmKHI9ZS5zdWJzdHJpbmcoMCxuKSxlPWUuc3Vic3RyaW5nKG4rMSxlLmxlbmd0aCkpLFtyLGVdfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGsmJmsuY29uZmlnJiZrLmNvbmZpZ1tlXXx8e319fXZhciBwLGgsZCxnLGI9e30sbT17fSxrPXt9LHk9e30sQz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHY9W10uc2xpY2U7ZD1mdW5jdGlvbihlLHIpe3ZhciBuLHQ9cyhlKSxvPXRbMF07cmV0dXJuIGU9dFsxXSxvJiYobz1pKG8sciksbj1mKG8pKSxvP2U9biYmbi5ub3JtYWxpemU/bi5ub3JtYWxpemUoZSx1KHIpKTppKGUscik6KGU9aShlLHIpLHQ9cyhlKSxvPXRbMF0sZT10WzFdLG8mJihuPWYobykpKSx7ZjpvP28rIiEiK2U6ZSxuOmUscHI6byxwOm59fSxnPXtyZXF1aXJlOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUpfSxleHBvcnRzOmZ1bmN0aW9uKGUpe3ZhciByPWJbZV07cmV0dXJuIHIhPT12b2lkIDA/cjpiW2VdPXt9fSxtb2R1bGU6ZnVuY3Rpb24oZSl7cmV0dXJue2lkOmUsdXJpOiIiLGV4cG9ydHM6YltlXSxjb25maWc6bChlKX19fSxwPWZ1bmN0aW9uKGUscixuLGkpe3ZhciB1LHMsbCxwLGgsayxDPVtdO2lmKGk9aXx8ZSwiZnVuY3Rpb24iPT10eXBlb2Ygbil7Zm9yKHI9IXIubGVuZ3RoJiZuLmxlbmd0aD9bInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl06cixoPTA7ci5sZW5ndGg+aDtoKz0xKWlmKHA9ZChyW2hdLGkpLHM9cC5mLCJyZXF1aXJlIj09PXMpQ1toXT1nLnJlcXVpcmUoZSk7ZWxzZSBpZigiZXhwb3J0cyI9PT1zKUNbaF09Zy5leHBvcnRzKGUpLGs9ITA7ZWxzZSBpZigibW9kdWxlIj09PXMpdT1DW2hdPWcubW9kdWxlKGUpO2Vsc2UgaWYobyhiLHMpfHxvKG0scyl8fG8oeSxzKSlDW2hdPWYocyk7ZWxzZXtpZighcC5wKXRocm93IEVycm9yKGUrIiBtaXNzaW5nICIrcyk7cC5wLmxvYWQocC5uLGEoaSwhMCksYyhzKSx7fSksQ1toXT1iW3NdfWw9bi5hcHBseShiW2VdLEMpLGUmJih1JiZ1LmV4cG9ydHMhPT10JiZ1LmV4cG9ydHMhPT1iW2VdP2JbZV09dS5leHBvcnRzOmw9PT10JiZrfHwoYltlXT1sKSl9ZWxzZSBlJiYoYltlXT1uKX0sZT1yPWg9ZnVuY3Rpb24oZSxyLG4sbyxpKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/Z1tlXT9nW2VdKHIpOmYoZChlLHIpLmYpOihlLnNwbGljZXx8KGs9ZSxyLnNwbGljZT8oZT1yLHI9bixuPW51bGwpOmU9dCkscj1yfHxmdW5jdGlvbigpe30sImZ1bmN0aW9uIj09dHlwZW9mIG4mJihuPW8sbz1pKSxvP3AodCxlLHIsbik6c2V0VGltZW91dChmdW5jdGlvbigpe3AodCxlLHIsbil9LDQpLGgpfSxoLmNvbmZpZz1mdW5jdGlvbihlKXtyZXR1cm4gaz1lLGsuZGVwcyYmaChrLmRlcHMsay5jYWxsYmFjayksaH0sbj1mdW5jdGlvbihlLHIsbil7ci5zcGxpY2V8fChuPXIscj1bXSksbyhiLGUpfHxvKG0sZSl8fChtW2VdPVtlLHIsbl0pfSxuLmFtZD17alF1ZXJ5OiEwfX0pKCksbigiLi4vbm9kZV9tb2R1bGVzL2FsbW9uZC9hbG1vbmQiLGZ1bmN0aW9uKCl7fSksbigianhnIixbXSxmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiJvYmplY3QiIT10eXBlb2YgSlhHfHxKWEcuZXh0ZW5kfHwoZT1KWEcpLGUuZXh0ZW5kPWZ1bmN0aW9uKGUscixuLHQpe3ZhciBvLGk7bj1ufHwhMSx0PXR8fCExO2ZvcihvIGluIHIpKCFufHxuJiZyLmhhc093blByb3BlcnR5KG8pKSYmKGk9dD9vLnRvTG93ZXJDYXNlKCk6byxlW2ldPXJbb10pfSxlLmV4dGVuZChlLHtib2FyZHM6e30scmVhZGVyczp7fSxlbGVtZW50czp7fSxyZWdpc3RlckVsZW1lbnQ6ZnVuY3Rpb24oZSxyKXtlPWUudG9Mb3dlckNhc2UoKSx0aGlzLmVsZW1lbnRzW2VdPXJ9LHJlZ2lzdGVyUmVhZGVyOmZ1bmN0aW9uKGUscil7dmFyIG4sdDtmb3Iobj0wO3IubGVuZ3RoPm47bisrKXQ9cltuXS50b0xvd2VyQ2FzZSgpLCJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLnJlYWRlcnNbdF0mJih0aGlzLnJlYWRlcnNbdF09ZSl9LHNob3J0Y3V0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbcl0uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sZ2V0UmVmOmZ1bmN0aW9uKGUscil7cmV0dXJuIGUuc2VsZWN0KHIpfSxnZXRSZWZlcmVuY2U6ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZS5zZWxlY3Qocil9LGRlYnVnSW50OmZ1bmN0aW9uKCl7dmFyIGUscjtmb3IoZT0wO2FyZ3VtZW50cy5sZW5ndGg+ZTtlKyspcj1hcmd1bWVudHNbZV0sIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZz9jb25zb2xlLmxvZyhyKToib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVidWciKSYmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZWJ1ZyIpLmlubmVySFRNTCs9cisiPGJyLz4iKX0sZGVidWdXU1Q6ZnVuY3Rpb24oKXt2YXIgcj1FcnJvcigpO2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJnIuc3RhY2smJihlLmRlYnVnSW50KCJzdGFja3RyYWNlIiksZS5kZWJ1Z0ludChyLnN0YWNrLnNwbGl0KCJcbiIpLnNsaWNlKDEpLmpvaW4oIlxuIikpKX0sZGVidWdMaW5lOmZ1bmN0aW9uKCl7dmFyIHI9RXJyb3IoKTtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZyLnN0YWNrJiZlLmRlYnVnSW50KCJDYWxsZWQgZnJvbSIsci5zdGFjay5zcGxpdCgiXG4iKS5zbGljZSgyLDMpLmpvaW4oIlxuIikpfSxkZWJ1ZzpmdW5jdGlvbigpe2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pLGV9KSxuKCJ1dGlscy96aXAiLFsianhnIl0sZnVuY3Rpb24oZSl7dmFyIHI9WzAsMTI4LDY0LDE5MiwzMiwxNjAsOTYsMjI0LDE2LDE0NCw4MCwyMDgsNDgsMTc2LDExMiwyNDAsOCwxMzYsNzIsMjAwLDQwLDE2OCwxMDQsMjMyLDI0LDE1Miw4OCwyMTYsNTYsMTg0LDEyMCwyNDgsNCwxMzIsNjgsMTk2LDM2LDE2NCwxMDAsMjI4LDIwLDE0OCw4NCwyMTIsNTIsMTgwLDExNiwyNDQsMTIsMTQwLDc2LDIwNCw0NCwxNzIsMTA4LDIzNiwyOCwxNTYsOTIsMjIwLDYwLDE4OCwxMjQsMjUyLDIsMTMwLDY2LDE5NCwzNCwxNjIsOTgsMjI2LDE4LDE0Niw4MiwyMTAsNTAsMTc4LDExNCwyNDIsMTAsMTM4LDc0LDIwMiw0MiwxNzAsMTA2LDIzNCwyNiwxNTQsOTAsMjE4LDU4LDE4NiwxMjIsMjUwLDYsMTM0LDcwLDE5OCwzOCwxNjYsMTAyLDIzMCwyMiwxNTAsODYsMjE0LDU0LDE4MiwxMTgsMjQ2LDE0LDE0Miw3OCwyMDYsNDYsMTc0LDExMCwyMzgsMzAsMTU4LDk0LDIyMiw2MiwxOTAsMTI2LDI1NCwxLDEyOSw2NSwxOTMsMzMsMTYxLDk3LDIyNSwxNywxNDUsODEsMjA5LDQ5LDE3NywxMTMsMjQxLDksMTM3LDczLDIwMSw0MSwxNjksMTA1LDIzMywyNSwxNTMsODksMjE3LDU3LDE4NSwxMjEsMjQ5LDUsMTMzLDY5LDE5NywzNywxNjUsMTAxLDIyOSwyMSwxNDksODUsMjEzLDUzLDE4MSwxMTcsMjQ1LDEzLDE0MSw3NywyMDUsNDUsMTczLDEwOSwyMzcsMjksMTU3LDkzLDIyMSw2MSwxODksMTI1LDI1MywzLDEzMSw2NywxOTUsMzUsMTYzLDk5LDIyNywxOSwxNDcsODMsMjExLDUxLDE3OSwxMTUsMjQzLDExLDEzOSw3NSwyMDMsNDMsMTcxLDEwNywyMzUsMjcsMTU1LDkxLDIxOSw1OSwxODcsMTIzLDI1MSw3LDEzNSw3MSwxOTksMzksMTY3LDEwMywyMzEsMjMsMTUxLDg3LDIxNSw1NSwxODMsMTE5LDI0NywxNSwxNDMsNzksMjA3LDQ3LDE3NSwxMTEsMjM5LDMxLDE1OSw5NSwyMjMsNjMsMTkxLDEyNywyNTVdLG49WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSx0PVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsOTksOTldLG89WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3N10saT1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sYT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sdT0yNTY7cmV0dXJuIGUuVXRpbD1lLlV0aWx8fHt9LGUuVXRpbC5VbnppcD1mdW5jdGlvbihjKXtmdW5jdGlvbiBmKCl7cmV0dXJuIFIrPTgsTz5YP2NbWCsrXTotMX1mdW5jdGlvbiBzKCl7Qj0xfWZ1bmN0aW9uIGwoKXt2YXIgZTt0cnl7cmV0dXJuIFIrKyxlPTEmQixCPj49MSwwPT09QiYmKEI9ZigpLGU9MSZCLEI9MTI4fEI+PjEpLGV9Y2F0Y2gocil7dGhyb3cgcn19ZnVuY3Rpb24gcChlKXt2YXIgbj0wLHQ9ZTt0cnl7Zm9yKDt0LS07KW49bjw8MXxsKCk7ZSYmKG49cltuXT4+OC1lKX1jYXRjaChvKXt0aHJvdyBvfXJldHVybiBufWZ1bmN0aW9uIGgoKXtKPTB9ZnVuY3Rpb24gZChlKXtqKyssR1tKKytdPWUsei5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpLDMyNzY4PT09SiYmKEo9MCl9ZnVuY3Rpb24gZygpe3RoaXMuYjA9MCx0aGlzLmIxPTAsdGhpcy5qdW1wPW51bGwsdGhpcy5qdW1wcG9zPS0xfWZ1bmN0aW9uIGIoKXtmb3IoOzspe2lmKE1bSF0+PXgpcmV0dXJuLTE7aWYoVVtNW0hdXT09PUgpcmV0dXJuIE1bSF0rKztNW0hdKyt9fWZ1bmN0aW9uIG0oKXt2YXIgZSxyPVBbRl07aWYoMTc9PT1IKXJldHVybi0xO2lmKEYrKyxIKyssZT1iKCksZT49MClyLmIwPWU7ZWxzZSBpZihyLmIwPTMyNzY4LG0oKSlyZXR1cm4tMTtpZihlPWIoKSxlPj0wKXIuYjE9ZSxyLmp1bXA9bnVsbDtlbHNlIGlmKHIuYjE9MzI3Njgsci5qdW1wPVBbRl0sci5qdW1wcG9zPUYsbSgpKXJldHVybi0xO3JldHVybiBILS0sMH1mdW5jdGlvbiBrKGUscixuKXt2YXIgdDtmb3IoUD1lLEY9MCxVPW4seD1yLHQ9MDsxNz50O3QrKylNW3RdPTA7cmV0dXJuIEg9MCxtKCk/LTE6MH1mdW5jdGlvbiB5KGUpe2Zvcih2YXIgcixuLHQsbz0wLGk9ZVtvXTs7KWlmKHQ9bCgpKXtpZighKDMyNzY4JmkuYjEpKXJldHVybiBpLmIxO2ZvcihpPWkuanVtcCxyPWUubGVuZ3RoLG49MDtyPm47bisrKWlmKGVbbl09PT1pKXtvPW47YnJlYWt9fWVsc2V7aWYoISgzMjc2OCZpLmIwKSlyZXR1cm4gaS5iMDtvKyssaT1lW29dfX1mdW5jdGlvbiBDKCl7dmFyIHUsYyxiLG0sQyx2LEEsaix3LFUseCxTLHosSSxFLEwsTztkbyBpZih1PWwoKSxiPXAoMiksMD09PWIpZm9yKHMoKSxVPWYoKSxVfD1mKCk8PDgsUz1mKCksU3w9ZigpPDw4LDY1NTM1JihVXn5TKSYmZS5kZWJ1ZygiQmxvY2tMZW4gY2hlY2tzdW0gbWlzbWF0Y2hcbiIpO1UtLTspYz1mKCksZChjKTtlbHNlIGlmKDE9PT1iKWZvcig7OylpZihDPXJbcCg3KV0+PjEsQz4yMz8oQz1DPDwxfGwoKSxDPjE5OT8oQy09MTI4LEM9Qzw8MXxsKCkpOihDLT00OCxDPjE0MyYmKEMrPTEzNikpKTpDKz0yNTYsMjU2PkMpZChDKTtlbHNle2lmKDI1Nj09PUMpYnJlYWs7Zm9yKEMtPTI1Nyx3PXAodFtDXSkrbltDXSxDPXJbcCg1KV0+PjMsaVtDXT44Pyh4PXAoOCkseHw9cChpW0NdLTgpPDw4KTp4PXAoaVtDXSkseCs9b1tDXSxDPTA7dz5DO0MrKyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgaWYoMj09PWIpe2ZvcihBPUFycmF5KDMyMCksST0yNTcrcCg1KSxFPTErcCg1KSxMPTQrcCg0KSxDPTA7MTk+QztDKyspQVtDXT0wO2ZvcihDPTA7TD5DO0MrKylBW2FbQ11dPXAoMyk7Zm9yKHc9cS5sZW5ndGgsbT0wO3c+bTttKyspcVttXT1uZXcgZztpZihrKHEsMTksQSwwKSlyZXR1cm4gaCgpLDE7Zm9yKHo9SStFLG09MCxPPS0xO3o+bTspaWYoTysrLEM9eShxKSwxNj5DKUFbbSsrXT1DO2Vsc2UgaWYoMTY9PT1DKXtpZihDPTMrcCgyKSxtK0M+eilyZXR1cm4gaCgpLDE7Zm9yKHY9bT9BW20tMV06MDtDLS07KUFbbSsrXT12fWVsc2V7aWYoQz0xNz09PUM/MytwKDMpOjExK3AoNyksbStDPnopcmV0dXJuIGgoKSwxO2Zvcig7Qy0tOylBW20rK109MH1mb3Iodz1ULmxlbmd0aCxtPTA7dz5tO20rKylUW21dPW5ldyBnO2lmKGsoVCxJLEEsMCkpcmV0dXJuIGgoKSwxO2Zvcih3PVQubGVuZ3RoLG09MDt3Pm07bSsrKXFbbV09bmV3IGc7Zm9yKGo9W10sbT1JO0EubGVuZ3RoPm07bSsrKWpbbS1JXT1BW21dO2lmKGsocSxFLGosMCkpcmV0dXJuIGgoKSwxO2Zvcig7OylpZihDPXkoVCksQz49MjU2KXtpZihDLT0yNTYsMD09PUMpYnJlYWs7Zm9yKEMtPTEsdz1wKHRbQ10pK25bQ10sQz15KHEpLGlbQ10+OD8oeD1wKDgpLHh8PXAoaVtDXS04KTw8OCk6eD1wKGlbQ10pLHgrPW9bQ107dy0tOyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgZChDKX13aGlsZSghdSk7cmV0dXJuIGgoKSxzKCksMH1mdW5jdGlvbiB2KCl7dmFyIGUscixuLHQsbyxpLGEsYyxzPVtdO3RyeXtpZih6PVtdLEw9ITEsc1swXT1mKCksc1sxXT1mKCksMTIwPT09c1swXSYmMjE4PT09c1sxXSYmKEMoKSxFW0ldPVt6LmpvaW4oIiIpLCJnZW9uZXh0Lmd4dCJdLEkrKyksMzE9PT1zWzBdJiYxMzk9PT1zWzFdJiYoUygpLEVbSV09W3ouam9pbigiIiksImZpbGUiXSxJKyspLDgwPT09c1swXSYmNzU9PT1zWzFdJiYoTD0hMCxzWzJdPWYoKSxzWzNdPWYoKSwzPT09c1syXSYmND09PXNbM10pKXtmb3Ioc1swXT1mKCksc1sxXT1mKCksQT1mKCksQXw9ZigpPDw4LGM9ZigpLGN8PWYoKTw8OCxmKCksZigpLGYoKSxmKCksYT1mKCksYXw9ZigpPDw4LGF8PWYoKTw8MTYsYXw9ZigpPDwyNCxpPWYoKSxpfD1mKCk8PDgsaXw9ZigpPDwxNixpfD1mKCk8PDI0LG89ZigpLG98PWYoKTw8OCxvfD1mKCk8PDE2LG98PWYoKTw8MjQsdD1mKCksdHw9ZigpPDw4LG49ZigpLG58PWYoKTw8OCxlPTAsTj1bXTt0LS07KXI9ZigpLCIvIj09PXJ8IjoiPT09cj9lPTA6dS0xPmUmJihOW2UrK109U3RyaW5nLmZyb21DaGFyQ29kZShyKSk7Zm9yKHd8fCh3PU4pLGU9MDtuPmU7KXI9ZigpLGUrKztqPTAsOD09PWMmJihDKCksRVtJXT1BcnJheSgyKSxFW0ldWzBdPXouam9pbigiIiksRVtJXVsxXT1OLmpvaW4oIiIpLEkrKyksUygpfX1jYXRjaChsKXt0aHJvdyBsfX12YXIgQSxqLHcsVSx4LFMsej1bXSxJPTAsRT1bXSxHPUFycmF5KDMyNzY4KSxKPTAsTD0hMSxPPWMubGVuZ3RoLFg9MCxCPTEsUj0wLFQ9QXJyYXkoMjg4KSxxPUFycmF5KDMyKSxGPTAsUD1udWxsLEg9KEFycmF5KDY0KSxBcnJheSg2NCksMCksTT1BcnJheSgxNyksTj1bXTtNWzBdPTAsUz1mdW5jdGlvbigpe3ZhciBlLHIsbix0LG8saSxhPVtdO2lmKDgmQSYmKGFbMF09ZigpLGFbMV09ZigpLGFbMl09ZigpLGFbM109ZigpLDgwPT09YVswXSYmNzU9PT1hWzFdJiY3PT09YVsyXSYmOD09PWFbM10/KGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQpOmU9YVswXXxhWzFdPDw4fGFbMl08PDE2fGFbM108PDI0LHI9ZigpLHJ8PWYoKTw8OCxyfD1mKCk8PDE2LHJ8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCksTCYmdigpLGFbMF09ZigpLDg9PT1hWzBdKXtpZihBPWYoKSxmKCksZigpLGYoKSxmKCksZigpLHQ9ZigpLDQmQSlmb3IoYVswXT1mKCksYVsyXT1mKCksSD1hWzBdKzI1NiphWzFdLG89MDtIPm87bysrKWYoKTtpZig4JkEpZm9yKG89MCxOPVtdLGk9ZigpO2k7KSgiNyI9PT1pfHwiOiI9PT1pKSYmKG89MCksdS0xPm8mJihOW28rK109aSksaT1mKCk7aWYoMTYmQSlmb3IoaT1mKCk7aTspaT1mKCk7MiZBJiYoZigpLGYoKSksQygpLGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCxMJiZ2KCl9fSxlLlV0aWwuVW56aXAucHJvdG90eXBlLnVuemlwRmlsZT1mdW5jdGlvbihlKXt2YXIgcjtmb3IodGhpcy51bnppcCgpLHI9MDtFLmxlbmd0aD5yO3IrKylpZihFW3JdWzFdPT09ZSlyZXR1cm4gRVtyXVswXTtyZXR1cm4iIn0sZS5VdGlsLlVuemlwLnByb3RvdHlwZS51bnppcD1mdW5jdGlvbigpe3JldHVybiB2KCksRX19LGUuVXRpbH0pLG4oInV0aWxzL2VuY29kaW5nIixbImp4ZyJdLGZ1bmN0aW9uKGUpe3ZhciByPTAsbj1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsOCw4LDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEwLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDQsMywzLDExLDYsNiw2LDUsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDAsMTIsMjQsMzYsNjAsOTYsODQsMTIsMTIsMTIsNDgsNzIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMCwxMiwxMiwxMiwxMiwxMiwwLDEyLDAsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTJdO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuVVRGOD17ZW5jb2RlOmZ1bmN0aW9uKGUpe3ZhciByLG4sdD0iIixvPWUubGVuZ3RoO2lmKGU9ZS5yZXBsYWNlKC9cclxuL2csIlxuIiksImZ1bmN0aW9uIj09dHlwZW9mIHVuZXNjYXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZW5jb2RlVVJJQ29tcG9uZW50KXJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpO2ZvcihyPTA7bz5yO3IrKyluPWUuY2hhckNvZGVBdChyKSwxMjg+bj90Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKG4pOm4+MTI3JiYyMDQ4Pm4/KHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTkyfG4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKToodCs9U3RyaW5nLmZyb21DaGFyQ29kZSgyMjR8bj4+MTIpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKTtyZXR1cm4gdH0sZGVjb2RlOmZ1bmN0aW9uKGUpe3ZhciB0LG8saSxhPTAsdT0wLGM9cixmPVtdLHM9ZS5sZW5ndGgsbD1bXTtmb3IodD0wO3M+dDt0Kyspbz1lLmNoYXJDb2RlQXQodCksaT1uW29dLHU9YyE9PXI/NjMmb3x1PDw2OjI1NT4+aSZvLGM9blsyNTYrYytpXSxjPT09ciYmKHU+NjU1MzU/Zi5wdXNoKDU1MjMyKyh1Pj4xMCksNTYzMjArKDEwMjMmdSkpOmYucHVzaCh1KSxhKyssMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSksZj1bXSkpO3JldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGYpKSxsLmpvaW4oIiIpfSxhc2NpaUNoYXJDb2RlQXQ6ZnVuY3Rpb24oZSxyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7aWYobj4yNTUpc3dpdGNoKG4pe2Nhc2UgODM2NDpuPTEyODticmVhaztjYXNlIDgyMTg6bj0xMzA7YnJlYWs7Y2FzZSA0MDI6bj0xMzE7YnJlYWs7Y2FzZSA4MjIyOm49MTMyO2JyZWFrO2Nhc2UgODIzMDpuPTEzMzticmVhaztjYXNlIDgyMjQ6bj0xMzQ7YnJlYWs7Y2FzZSA4MjI1Om49MTM1O2JyZWFrO2Nhc2UgNzEwOm49MTM2O2JyZWFrO2Nhc2UgODI0MDpuPTEzNzticmVhaztjYXNlIDM1MjpuPTEzODticmVhaztjYXNlIDgyNDk6bj0xMzk7YnJlYWs7Y2FzZSAzMzg6bj0xNDA7YnJlYWs7Y2FzZSAzODE6bj0xNDI7YnJlYWs7Y2FzZSA4MjE2Om49MTQ1O2JyZWFrO2Nhc2UgODIxNzpuPTE0NjticmVhaztjYXNlIDgyMjA6bj0xNDc7YnJlYWs7Y2FzZSA4MjIxOm49MTQ4O2JyZWFrO2Nhc2UgODIyNjpuPTE0OTticmVhaztjYXNlIDgyMTE6bj0xNTA7YnJlYWs7Y2FzZSA4MjEyOm49MTUxO2JyZWFrO2Nhc2UgNzMyOm49MTUyO2JyZWFrO2Nhc2UgODQ4MjpuPTE1MzticmVhaztjYXNlIDM1MzpuPTE1NDticmVhaztjYXNlIDgyNTA6bj0xNTU7YnJlYWs7Y2FzZSAzMzk6bj0xNTY7YnJlYWs7Y2FzZSAzODI6bj0xNTg7YnJlYWs7Y2FzZSAzNzY6bj0xNTk7YnJlYWs7ZGVmYXVsdDp9cmV0dXJuIG59fSxlLlV0aWwuVVRGOH0pLG4oInV0aWxzL2Jhc2U2NCIsWyJqeGciLCJ1dGlscy9lbmNvZGluZyJdLGZ1bmN0aW9uKGUscil7ZnVuY3Rpb24gbihlLHIpe3JldHVybiAyNTUmZS5jaGFyQ29kZUF0KHIpfWZ1bmN0aW9uIHQoZSxyKXt2YXIgbj1vLmluZGV4T2YoZS5jaGFyQXQocikpO2lmKC0xPT09bil0aHJvdyBFcnJvcigiSlNYR3JhcGgvdXRpbHMvYmFzZTY0OiBDYW4ndCBkZWNvZGUgc3RyaW5nIChpbnZhbGlkIGNoYXJhY3RlcikuIik7cmV0dXJuIG59dmFyIG89IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGk9Ij0iO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuQmFzZTY0PXtlbmNvZGU6ZnVuY3Rpb24oZSl7dmFyIHQsYSx1LGMsZixzPVtdO2ZvcihmPXIuZW5jb2RlKGUpLHU9Zi5sZW5ndGgsYz11JTMsdD0wO3UtYz50O3QrPTMpYT1uKGYsdCk8PDE2fG4oZix0KzEpPDw4fG4oZix0KzIpLHMucHVzaChvLmNoYXJBdChhPj4xOCksby5jaGFyQXQoNjMmYT4+MTIpLG8uY2hhckF0KDYzJmE+PjYpLG8uY2hhckF0KDYzJmEpKTtzd2l0Y2goYyl7Y2FzZSAxOmE9bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjIpLG8uY2hhckF0KDYzJmE8PDQpLGksaSk7YnJlYWs7Y2FzZSAyOmE9bihmLHUtMik8PDh8bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjEwKSxvLmNoYXJBdCg2MyZhPj40KSxvLmNoYXJBdCg2MyZhPDwyKSxpKX1yZXR1cm4gcy5qb2luKCIiKX0sZGVjb2RlOmZ1bmN0aW9uKGUsbil7dmFyIG8sYSx1LGMsZixzLGw9W10scD1bXTtpZihvPWUucmVwbGFjZSgvW15BLVphLXowLTlcK1wvPV0vZywiIiksdT1vLmxlbmd0aCwwIT09dSU0KXRocm93IEVycm9yKCJKU1hHcmFwaC91dGlscy9iYXNlNjQ6IENhbid0IGRlY29kZSBzdHJpbmcgKGludmFsaWQgaW5wdXQgbGVuZ3RoKS4iKTtmb3Ioby5jaGFyQXQodS0xKT09PWkmJihjPTEsby5jaGFyQXQodS0yKT09PWkmJihjPTIpLHUtPTQpLGE9MDt1PmE7YSs9NClmPXQobyxhKTw8MTh8dChvLGErMSk8PDEyfHQobyxhKzIpPDw2fHQobyxhKzMpLHAucHVzaChmPj4xNiwyNTUmZj4+OCwyNTUmZiksMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxwKSkscD1bXSk7c3dpdGNoKGMpe2Nhc2UgMTpmPXQobyx1KTw8MTJ8dChvLHUrMSk8PDZ8dChvLHUrMikscC5wdXNoKGY+PjEwLDI1NSZmPj4yKTticmVhaztjYXNlIDI6Zj10KG8sYSk8PDZ8dChvLGErMSkscC5wdXNoKGY+PjQpfXJldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHApKSxzPWwuam9pbigiIiksbiYmKHM9ci5kZWNvZGUocykpLHN9LGRlY29kZUFzQXJyYXk6ZnVuY3Rpb24oZSl7dmFyIHIsbj10aGlzLmRlY29kZShlKSx0PVtdLG89bi5sZW5ndGg7Zm9yKHI9MDtvPnI7cisrKXRbcl09bi5jaGFyQ29kZUF0KHIpO3JldHVybiB0fX0sZS5VdGlsLkJhc2U2NH0pLG4oIi4uL2J1aWxkL2NvbXByZXNzb3IuZGVwcy5qcyIsWyJqeGciLCJ1dGlscy96aXAiLCJ1dGlscy9iYXNlNjQiXSxmdW5jdGlvbihlLHIsbil7cmV0dXJuIGUuZGVjb21wcmVzcz1mdW5jdGlvbihlKXtyZXR1cm4gdW5lc2NhcGUobmV3IHIuVW56aXAobi5kZWNvZGVBc0FycmF5KGUpKS51bnppcCgpWzBdWzBdKX0sZX0pLHdpbmRvdy5KWEc9cigiLi4vYnVpbGQvY29tcHJlc3Nvci5kZXBzLmpzIil9KSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuZmlsZUxvYWRpbmcgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIGZpbGVMb2FkaW5nQ2FsbGJhY2tzID0ge307CiAgICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICBmdW5jdGlvbiBsb2FkS2V5d29yZHNGaWxlKGZpbGVuYW1lLCBjYWxsYmFjaykgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSA9IGNhbGxiYWNrOwogICAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOwogICAgICAgIC8vIHRpbWVzdGFtcCBhcyBhbiBhcmd1bWVudCB0byBwcmV2ZW50IGJyb3dzZXJzIGZyb20gY2FjaGluZyBzY3JpcHRzCiAgICAgICAgLy8gc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg2NjYxOS9ob3ctdG8tZm9yY2UtaWUtdG8tcmVsb2FkLWphdmFzY3JpcHQKICAgICAgICBzY3JpcHQuc3JjID0gZmlsZW5hbWUrJz90aW1lPScrdGltZXN0YW1wOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHBhcmVudCkgewogICAgICAgIHZhciBjYWxsYWJsZUxpc3QgPSBbXTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxhYmxlKSB7CiAgICAgICAgICAgIGlmICghcGFyZW50LmlzQ2hpbGRyZW5Mb2FkZWQpIHsKICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdC5wdXNoKGNhbGxhYmxlKTsKICAgICAgICAgICAgICAgIGlmIChjYWxsYWJsZUxpc3QubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBsb2FkS2V5d29yZHNGaWxlKHBhcmVudC5jaGlsZEZpbGVOYW1lLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYWJsZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdFtpXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbm90aWZ5RmlsZUxvYWRlZChmaWxlbmFtZSkgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSgpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXRDYWxsYmFja0hhbmRsZXJGb3JLZXl3b3JkczogZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHMsCiAgICAgICAgbm90aWZ5OiBub3RpZnlGaWxlTG9hZGVkCiAgICB9Cn0oKSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5tb2RlbCA9IChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBTdWl0ZShkYXRhKSB7CiAgICAgICAgdmFyIHN1aXRlID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAgc3VpdGUuc291cmNlID0gZGF0YS5zb3VyY2U7CiAgICAgICAgc3VpdGUucmVsYXRpdmVTb3VyY2UgPSBkYXRhLnJlbGF0aXZlU291cmNlOwogICAgICAgIHN1aXRlLmZ1bGxOYW1lID0gZGF0YS5wYXJlbnQgPyBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIGRhdGEubmFtZSA6IGRhdGEubmFtZTsKICAgICAgICBzZXRTdGF0cyhzdWl0ZSwgZGF0YS5zdGF0aXN0aWNzKTsKICAgICAgICBzdWl0ZS5tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGE7CiAgICAgICAgc3VpdGUucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdUZXN0Jyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVTdWl0ZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignU3VpdGUnKTsKICAgICAgICBzdWl0ZS5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXTsKICAgICAgICBzdWl0ZS5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSBmdW5jdGlvbiAoY2FsbGFibGUpIHsgY2FsbGFibGUoKTsgfTsKICAgICAgICBzdWl0ZS5tZXNzYWdlID0gZGF0YS5tZXNzYWdlOwogICAgICAgIHN1aXRlLmNoaWxkcmVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc3VpdGUua2V5d29yZHMoKS5jb25jYXQoc3VpdGUudGVzdHMoKSkuY29uY2F0KHN1aXRlLnN1aXRlcygpKTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLnNlYXJjaFRlc3RzID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkgewogICAgICAgICAgICB2YXIgdGVzdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHN1aXRlcyA9IHRoaXMuc3VpdGVzKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc3VpdGVzKQogICAgICAgICAgICAgICAgdGVzdHMgPSB0ZXN0cy5jb25jYXQoc3VpdGVzW2ldLnNlYXJjaFRlc3RzKHByZWRpY2F0ZSkpOwogICAgICAgICAgICByZXR1cm4gdGVzdHMuY29uY2F0KHV0aWwuZmlsdGVyKHRoaXMudGVzdHMoKSwgcHJlZGljYXRlKSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5zZWFyY2hUZXN0c0luU3VpdGUgPSBmdW5jdGlvbiAocGF0dGVybiwgbWF0Y2hlcikgewogICAgICAgICAgICBpZiAoIW1hdGNoZXIpCiAgICAgICAgICAgICAgICBtYXRjaGVyID0gdXRpbC5NYXRjaGVyKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzQW55KFtzdWl0ZS5mdWxsTmFtZSwgc3VpdGUubmFtZV0pKQogICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlLmFsbFRlc3RzKCk7CiAgICAgICAgICAgIHZhciB0ZXN0cyA9IFtdOwogICAgICAgICAgICB2YXIgc3VpdGVzID0gdGhpcy5zdWl0ZXMoKTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzdWl0ZXMpCiAgICAgICAgICAgICAgICB0ZXN0cyA9IHRlc3RzLmNvbmNhdChzdWl0ZXNbaV0uc2VhcmNoVGVzdHNJblN1aXRlKHBhdHRlcm4sIG1hdGNoZXIpKTsKICAgICAgICAgICAgcmV0dXJuIHRlc3RzOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuc2VhcmNoVGVzdHNCeVRhZyA9IGZ1bmN0aW9uICh0YWcpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICBpZiAodGFnLmluZm8gPT0gImNyaXRpY2FsIiB8fCB0YWcuaW5mbyA9PSAibm9uLWNyaXRpY2FsIikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3QudGFncywgdGFnLmxhYmVsKTsKICAgICAgICAgICAgICAgIGlmICh0YWcuY29tYmluZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnUGF0dGVybih0ZXN0LnRhZ3MsIHRhZy5jb21iaW5lZCk7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWcodGVzdC50YWdzLCB0YWcubGFiZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLmZpbmRTdWl0ZUJ5TmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuYWxsVGVzdHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBzdWl0ZS5zZWFyY2hUZXN0cyhmdW5jdGlvbiAodGVzdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuY3JpdGljYWxUZXN0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5pc0NyaXRpY2FsOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRhaW5zVGFnKHRlc3RUYWdzLCB0YWduYW1lKSB7CiAgICAgICAgdGVzdFRhZ3MgPSB1dGlsLm1hcCh0ZXN0VGFncywgdXRpbC5ub3JtYWxpemUpOwogICAgICAgIHJldHVybiB1dGlsLmNvbnRhaW5zKHRlc3RUYWdzLCB1dGlsLm5vcm1hbGl6ZSh0YWduYW1lKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHBhdHRlcm4pIHsKICAgICAgICB2YXIgcGF0dGVybnM7CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignTk9UJykgIT0gLTEpIHsKICAgICAgICAgICAgcGF0dGVybnMgPSBwYXR0ZXJuLnNwbGl0KCdOT1QnKTsKICAgICAgICAgICAgaWYgKCF1dGlsLm5vcm1hbGl6ZShwYXR0ZXJuc1swXSkpCiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5hbGwodXRpbC5tYXAocGF0dGVybnMuc2xpY2UoMSksIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwYXR0ZXJuc1swXSkgJiYKICAgICAgICAgICAgICAgIHV0aWwuYWxsKHV0aWwubWFwKHBhdHRlcm5zLnNsaWNlKDEpLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignT1InKSAhPSAtMSkgewogICAgICAgICAgICBwYXR0ZXJucyA9IHBhdHRlcm4uc3BsaXQoJ09SJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFueSh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ0FORCcpICE9IC0xKSB7CiAgICAgICAgICAgIHBhdHRlcm5zID0gcGF0dGVybi5zcGxpdCgnQU5EJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFsbCh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1dGlsLk1hdGNoZXIocGF0dGVybikubWF0Y2hlc0FueSh0ZXN0VGFncyk7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpIHsKICAgICAgICBpZiAoc3VpdGUuZnVsbE5hbWUgPT0gbmFtZSkKICAgICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgICAgIHZhciBzdWJTdWl0ZXMgPSBzdWl0ZS5zdWl0ZXMoKTsKICAgICAgICBmb3IgKHZhciBpIGluIHN1YlN1aXRlcykgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmaW5kU3VpdGVCeU5hbWUoc3ViU3VpdGVzW2ldLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG1hdGNoKQogICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0YXRzKHN1aXRlLCBzdGF0cykgewogICAgICAgIGZvciAodmFyIG5hbWUgaW4gc3RhdHMpIHsKICAgICAgICAgICAgc3VpdGVbbmFtZV0gPSBzdGF0c1tuYW1lXTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNb2RlbE9iamVjdChkYXRhKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lLAogICAgICAgICAgICBkb2M6IGRhdGEuZG9jLAogICAgICAgICAgICBzdGF0dXM6IGRhdGEuc3RhdHVzLAogICAgICAgICAgICB0aW1lczogZGF0YS50aW1lcywKICAgICAgICAgICAgaWQ6IGRhdGEucGFyZW50ID8gZGF0YS5wYXJlbnQuaWQgKyAnLScgKyBkYXRhLmlkIDogZGF0YS5pZAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUZXN0KGRhdGEpIHsKICAgICAgICB2YXIgdGVzdCA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIHRlc3QuZnVsbE5hbWUgPSBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIHRlc3QubmFtZTsKICAgICAgICB0ZXN0LmZvcm1hdFBhcmVudE5hbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB1dGlsLmZvcm1hdFBhcmVudE5hbWUodGVzdCk7IH07CiAgICAgICAgdGVzdC50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIHRlc3QucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgdGVzdC5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJ107CiAgICAgICAgdGVzdC5pc0NoaWxkcmVuTG9hZGVkID0gZGF0YS5pc0NoaWxkcmVuTG9hZGVkOwogICAgICAgIHRlc3QuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHRlc3QpOwogICAgICAgIHRlc3QuY2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0ZXN0LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5rZXl3b3JkcygpOwogICAgICAgIH07CiAgICAgICAgdGVzdC5pc0NyaXRpY2FsID0gZGF0YS5pc0NyaXRpY2FsOwogICAgICAgIHRlc3QudGFncyA9IGRhdGEudGFnczsKICAgICAgICB0ZXN0Lm1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7CiAgICAgICAgdGVzdC5tYXRjaGVzVGFnUGF0dGVybiA9IGZ1bmN0aW9uIChwYXR0ZXJuKSB7CiAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdC50YWdzLCBwYXR0ZXJuKTsKICAgICAgICB9OwogICAgICAgIHRlc3QubWF0Y2hlc05hbWVQYXR0ZXJuID0gZnVuY3Rpb24gKHBhdHRlcm4pIHsKICAgICAgICAgICAgcmV0dXJuIHV0aWwuTWF0Y2hlcihwYXR0ZXJuKS5tYXRjaGVzQW55KFt0ZXN0Lm5hbWUsIHRlc3QuZnVsbE5hbWVdKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiB0ZXN0OwogICAgfQogICAgZnVuY3Rpb24gS2V5d29yZChkYXRhKSB7CiAgICAgICAgdmFyIGt3ID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAga3cubGlibmFtZSA9IGRhdGEubGlibmFtZTsKICAgICAgICBrdy50eXBlID0gZGF0YS50eXBlOwogICAgICAgIGt3LmFyZ3VtZW50cyA9IGRhdGEuYXJnczsKICAgICAgICBrdy5hc3NpZ24gPSBkYXRhLmFzc2lnbiArIChkYXRhLmFzc2lnbiA/ICcgPScgOiAnJyk7CiAgICAgICAga3cudGFncyA9IGRhdGEudGFnczsKICAgICAgICBrdy50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIGt3LnBvcHVsYXRlTWVzc2FnZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignTWVzc2FnZScpOwogICAgICAgIGt3LnBvcHVsYXRlS2V5d29yZHMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignS2V5d29yZCcpOwogICAgICAgIGt3LmNoaWxkcmVuTmFtZXMgPSBbJ2tleXdvcmQnLCAnbWVzc2FnZSddOwogICAgICAgIGt3LmlzQ2hpbGRyZW5Mb2FkZWQgPSBkYXRhLmlzQ2hpbGRyZW5Mb2FkZWQ7CiAgICAgICAga3cuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKGt3KTsKICAgICAgICBrdy5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGt3LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4ga3cua2V5d29yZHMoKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBrdzsKICAgIH0KICAgIGZ1bmN0aW9uIE1lc3NhZ2UobGV2ZWwsIGRhdGUsIHRleHQsIGxpbmspIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsZXZlbDogbGV2ZWwsCiAgICAgICAgICAgIHRpbWU6IHV0aWwudGltZUZyb21EYXRlKGRhdGUpLAogICAgICAgICAgICBkYXRlOiB1dGlsLmRhdGVGcm9tRGF0ZShkYXRlKSwKICAgICAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICAgICAgbGluazogbGluawogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUaW1lcyh0aW1lZGF0YSkgewogICAgICAgIHZhciBzdGFydCA9IHRpbWVkYXRhWzBdOwogICAgICAgIHZhciBlbmQgPSB0aW1lZGF0YVsxXTsKICAgICAgICB2YXIgZWxhcHNlZCA9IHRpbWVkYXRhWzJdOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGVsYXBzZWRNaWxsaXM6IGVsYXBzZWQsCiAgICAgICAgICAgIGVsYXBzZWRUaW1lOiB1dGlsLmZvcm1hdEVsYXBzZWQoZWxhcHNlZCksCiAgICAgICAgICAgIHN0YXJ0VGltZTogdXRpbC5kYXRlVGltZUZyb21EYXRlKHN0YXJ0KSwKICAgICAgICAgICAgZW5kVGltZTogIHV0aWwuZGF0ZVRpbWVGcm9tRGF0ZShlbmQpCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKG5hbWUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHBvcHVsYXRvcikgewogICAgICAgICAgICBwb3B1bGF0ZUl0ZXJhYmxlKHRoaXMsIG5hbWUsIHBvcHVsYXRvcik7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvcHVsYXRlSXRlcmFibGUob2JqLCBuYW1lLCBwb3B1bGF0b3IpIHsKICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpICsgJ3MnOwogICAgICAgIG9ialtuYW1lXSA9IGNyZWF0ZUdldEFsbEZ1bmN0aW9uKHBvcHVsYXRvci5udW1iZXJPZkl0ZW1zLCBwb3B1bGF0b3IuY3JlYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZXRBbGxGdW5jdGlvbihudW1iZXJPZkVsZW1lbnRzLCBjcmVhdG9yKSB7CiAgICAgICAgdmFyIGNhY2hlZCA9IG51bGw7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGNhY2hlZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FjaGVkID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bWJlck9mRWxlbWVudHMoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVkLnB1c2goY3JlYXRvcihpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBTdWl0ZTogU3VpdGUsCiAgICAgICAgVGVzdDogVGVzdCwKICAgICAgICBLZXl3b3JkOiBLZXl3b3JkLAogICAgICAgIE1lc3NhZ2U6IE1lc3NhZ2UsCiAgICAgICAgVGltZXM6IFRpbWVzLAogICAgICAgIGNvbnRhaW5zVGFnOiBjb250YWluc1RhZywgIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICAgICAgY29udGFpbnNUYWdQYXR0ZXJuOiBjb250YWluc1RhZ1BhdHRlcm4gIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICB9Owp9KCkpOwp3aW5kb3cuc3RhdHMgPSAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gU3RhdGlzdGljcyh0b3RhbEVsZW1zLCB0YWdFbGVtcywgc3VpdGVFbGVtcykgewogICAgICAgIHJldHVybiB7dG90YWw6IHV0aWwubWFwKHRvdGFsRWxlbXMsIHRvdGFsU3RhdEVsZW0pLAogICAgICAgICAgICAgICAgdGFnOiAgIHV0aWwubWFwKHRhZ0VsZW1zLCB0YWdTdGF0RWxlbSksCiAgICAgICAgICAgICAgICBzdWl0ZTogdXRpbC5tYXAoc3VpdGVFbGVtcywgc3VpdGVTdGF0RWxlbSl9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdEVsZW0oc3RhdCkgewogICAgICAgIHN0YXQudG90YWwgPSBzdGF0LnBhc3MgKyBzdGF0LmZhaWw7CiAgICAgICAgdmFyIHBlcmNlbnRzID0gY2FsY3VsYXRlUGVyY2VudHMoc3RhdC50b3RhbCwgc3RhdC5wYXNzLCBzdGF0LmZhaWwpOwogICAgICAgIHN0YXQucGFzc1BlcmNlbnQgPSBwZXJjZW50c1swXTsKICAgICAgICBzdGF0LmZhaWxQZXJjZW50ID0gcGVyY2VudHNbMV07CiAgICAgICAgdmFyIHdpZHRocyA9IGNhbGN1bGF0ZVdpZHRocyhzdGF0LnBhc3NQZXJjZW50LCBzdGF0LmZhaWxQZXJjZW50KTsKICAgICAgICBzdGF0LnBhc3NXaWR0aCA9IHdpZHRoc1swXTsKICAgICAgICBzdGF0LmZhaWxXaWR0aCA9IHdpZHRoc1sxXTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHRvdGFsU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC50eXBlID0gc3RhdC5sYWJlbCA9PSAnQ3JpdGljYWwgVGVzdHMnID8gJ2NyaXRpY2FsJyA6ICdhbGwnOwogICAgICAgIHJldHVybiBzdGF0OwogICAgfQogICAgZnVuY3Rpb24gdGFnU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC5saW5rcyA9IHBhcnNlTGlua3Moc3RhdC5saW5rcyk7CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRFbGVtKGRhdGEpIHsKICAgICAgICB2YXIgc3RhdCA9IHN0YXRFbGVtKGRhdGEpOwogICAgICAgIHN0YXQuZnVsbE5hbWUgPSBzdGF0LmxhYmVsOwogICAgICAgIHN0YXQuZm9ybWF0UGFyZW50TmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWwuZm9ybWF0UGFyZW50TmFtZShzdGF0KTsgfTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTGlua3MobGlua3NEYXRhKSB7CiAgICAgICAgaWYgKCFsaW5rc0RhdGEpCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICByZXR1cm4gdXRpbC5tYXAobGlua3NEYXRhLnNwbGl0KCc6OjonKSwgZnVuY3Rpb24gKGxpbmspIHsKICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGxpbmsuaW5kZXhPZignOicpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt0aXRsZTogbGluay5zbGljZSgwLCBpbmRleCksIHVybDogbGluay5zbGljZShpbmRleCsxKX07CiAgICAgICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gY2FsY3VsYXRlUGVyY2VudHModG90YWwsIHBhc3NlZCwgZmFpbGVkKSB7CiAgICAgICAgaWYgKHRvdGFsID09IDApCiAgICAgICAgICAgIHJldHVybiBbMC4wLCAwLjBdOwogICAgICAgIHZhciBwYXNzID0gMTAwLjAgKiBwYXNzZWQgLyB0b3RhbDsKICAgICAgICB2YXIgZmFpbCA9IDEwMC4wICogZmFpbGVkIC8gdG90YWw7CiAgICAgICAgaWYgKHBhc3MgPiAwICYmIHBhc3MgPCAwLjEpCiAgICAgICAgICAgIHJldHVybiBbMC4xLCA5OS45XTsKICAgICAgICBpZiAoZmFpbCA+IDAgJiYgZmFpbCA8IDAuMSkKICAgICAgICAgICAgcmV0dXJuIFs5OS45LCAwLjFdOwogICAgICAgIHJldHVybiBbTWF0aC5yb3VuZChwYXNzKjEwKS8xMCwgTWF0aC5yb3VuZChmYWlsKjEwKS8xMF07CiAgICB9CiAgICBmdW5jdGlvbiBjYWxjdWxhdGVXaWR0aHMobnVtMSwgbnVtMikgewogICAgICAgIGlmIChudW0xICsgbnVtMiA9PSAwKQogICAgICAgICAgICByZXR1cm4gWzAuMCwgMC4wXTsKICAgICAgICAvLyBNYWtlIHNtYWxsIHBlcmNlbnRhZ2VzIGJldHRlciB2aXNpYmxlCiAgICAgICAgaWYgKG51bTEgPiAwICYmIG51bTEgPCAxKQogICAgICAgICAgICByZXR1cm4gWzEuMCwgOTkuMF07CiAgICAgICAgaWYgKG51bTIgPiAwICYmIG51bTIgPCAxKQogICAgICAgICAgICByZXR1cm4gWzk5LjAsIDEuMF07CiAgICAgICAgLy8gSGFuZGxlIHNpdHVhdGlvbiB3aGVyZSBib3RoIGFyZSByb3VuZGVkIHVwCiAgICAgICAgd2hpbGUgKG51bTEgKyBudW0yID4gMTAwKSB7CiAgICAgICAgICAgIGlmIChudW0xID4gbnVtMikKICAgICAgICAgICAgICAgIG51bTEgLT0gMC4xOwogICAgICAgICAgICBpZiAobnVtMiA+IG51bTEpCiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtudW0xLCBudW0yXTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgU3RhdGlzdGljczogU3RhdGlzdGljcwogICAgfTsKfSgpKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LnV0aWwgPSBmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBtYXAoZWxlbXMsIGZ1bmMpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIHJldFtpXSA9IGZ1bmMoZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gZmlsdGVyKGVsZW1zLCBwcmVkaWNhdGUpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbXNbaV0pKQogICAgICAgICAgICAgICAgcmV0LnB1c2goZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gYWxsKGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmICghZWxlbXNbaV0pCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYW55KGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChlbGVtc1tpXSkKICAgICAgICAgICAgICAgIHJldHVybiBlbGVtc1tpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gY29udGFpbnMoZWxlbXMsIGUpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgaWYgKGVsZW1zW2ldID09IGUpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gbGFzdChpdGVtcykgewogICAgICAgIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGgtMV07CiAgICB9CiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyZsdDsvZywgJzwnKS5yZXBsYWNlKC8mZ3Q7L2csICc+JykucmVwbGFjZSgvJmFtcDsvZywgJyYnKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTsKICAgIH0KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnJykucmVwbGFjZSgvXy9nLCAnJyk7CiAgICB9CiAgICBmdW5jdGlvbiByZWdleHBFc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLVtcXXt9KCkrPyouLFxcXiR8I10vZywgIlxcJCYiKTsKICAgIH0KICAgIGZ1bmN0aW9uIE1hdGNoZXIocGF0dGVybikgewogICAgICAgIHBhdHRlcm4gPSByZWdleHBFc2NhcGUobm9ybWFsaXplKHBhdHRlcm4pKTsKICAgICAgICB2YXIgcmVQYXR0ZXJuID0gJ14nICsgcGF0dGVybi5yZXBsYWNlKC9cXFw/L2csICcuJykucmVwbGFjZSgvXFxcKi9nLCAnW1xcc1xcU10qJykgKyAnJCc7CiAgICAgICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAocmVQYXR0ZXJuKTsKICAgICAgICBmdW5jdGlvbiBtYXRjaGVzKHN0cmluZykgewogICAgICAgICAgICByZXR1cm4gcmVnZXhwLnRlc3Qobm9ybWFsaXplKHN0cmluZykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBtYXRjaGVzOiBtYXRjaGVzLAogICAgICAgICAgICBtYXRjaGVzQW55OiBmdW5jdGlvbiAoc3RyaW5ncykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspCiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMoc3RyaW5nc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdFBhcmVudE5hbWUoaXRlbSkgewogICAgICAgIHZhciBwYXJlbnROYW1lID0gaXRlbS5mdWxsTmFtZS5zbGljZSgwLCBpdGVtLmZ1bGxOYW1lLmxlbmd0aCAtIGl0ZW0ubmFtZS5sZW5ndGgpOwogICAgICAgIHJldHVybiBwYXJlbnROYW1lLnJlcGxhY2UoL1wuL2csICcgLiAnKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRpbWVGcm9tRGF0ZShkYXRlKSB7CiAgICAgICAgaWYgKCFkYXRlKQogICAgICAgICAgICByZXR1cm4gJ04vQSc7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlLmdldFNlY29uZHMoKSwgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlRnJvbURhdGUoZGF0ZSkgewogICAgICAgIGlmICghZGF0ZSkKICAgICAgICAgICAgcmV0dXJuICdOL0EnOwogICAgICAgIHJldHVybiBwYWRUbyhkYXRlLmdldEZ1bGxZZWFyKCksIDQpICsKICAgICAgICAgICAgICAgcGFkVG8oZGF0ZS5nZXRNb250aCgpICsgMSwgMikgKwogICAgICAgICAgICAgICBwYWRUbyhkYXRlLmdldERhdGUoKSwgMik7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlVGltZUZyb21EYXRlKGRhdGUpIHsKICAgICAgICBpZiAoIWRhdGUpCiAgICAgICAgICAgIHJldHVybiAnTi9BJzsKICAgICAgICByZXR1cm4gZGF0ZUZyb21EYXRlKGRhdGUpICsgJyAnICsgdGltZUZyb21EYXRlKGRhdGUpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0VGltZShob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzKSB7CiAgICAgICAgcmV0dXJuIHBhZFRvKGhvdXJzLCAyKSArICc6JyArCiAgICAgICAgICAgICAgIHBhZFRvKG1pbnV0ZXMsIDIpICsgJzonICsKICAgICAgICAgICAgICAgcGFkVG8oc2Vjb25kcywgMikgKyAnLicgKwogICAgICAgICAgICAgICBwYWRUbyhtaWxsaXNlY29uZHMsIDMpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0RWxhcHNlZChlbGFwc2VkKSB7CiAgICAgICAgdmFyIG1pbGxpcyA9IGVsYXBzZWQ7CiAgICAgICAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAoNjAgKiA2MCAqIDEwMDApKTsKICAgICAgICBtaWxsaXMgLT0gaG91cnMgKiA2MCAqIDYwICogMTAwMDsKICAgICAgICB2YXIgbWludXRlcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gKDYwICogMTAwMCkpOwogICAgICAgIG1pbGxpcyAtPSBtaW51dGVzICogNjAgKiAxMDAwOwogICAgICAgIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAxMDAwKTsKICAgICAgICBtaWxsaXMgLT0gc2Vjb25kcyAqIDEwMDA7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpcyk7CiAgICB9CiAgICBmdW5jdGlvbiBwYWRUbyhudW1iZXIsIGxlbikgewogICAgICAgIHZhciBudW1TdHJpbmcgPSBudW1iZXIgKyAiIjsKICAgICAgICB3aGlsZSAobnVtU3RyaW5nLmxlbmd0aCA8IGxlbikgbnVtU3RyaW5nID0gIjAiICsgbnVtU3RyaW5nOwogICAgICAgIHJldHVybiBudW1TdHJpbmc7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lc3RhbXAobWlsbGlzKSB7CiAgICAgICAgLy8gdXNlZCBhbHNvIGJ5IHRvb2xzIHRoYXQgZG8gbm90IHNldCB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMKICAgICAgICB2YXIgYmFzZSA9IHdpbmRvdy5vdXRwdXQgPyB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMgOiAwOwogICAgICAgIHJldHVybiBuZXcgRGF0ZShiYXNlICsgbWlsbGlzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZFN0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7CiAgICAgICAgdmFyIGR0ID0gZGF0ZVRpbWVGcm9tRGF0ZShkYXRlKS5zbGljZSgwLCAxNyk7ICAvLyBkcm9wIG1pbGxpcwogICAgICAgIHZhciBvZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgICAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnOwogICAgICAgIHZhciBoaCA9IE1hdGguZmxvb3IoTWF0aC5hYnMob2Zmc2V0KSAvIDYwKTsKICAgICAgICB2YXIgbW0gPSBNYXRoLmFicyhvZmZzZXQpICUgNjA7CiAgICAgICAgcmV0dXJuIGR0ICsgJyBVVEMnICsgc2lnbiArIHBhZFRvKGhoLCAyKSArICc6JyArIHBhZFRvKG1tLCAyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICBmdW5jdGlvbiB0aW1lU3RyaW5nKHRpbWUsIHNob3J0VW5pdCkgewogICAgICAgICAgICB2YXIgdW5pdCA9IHt5OiAneWVhcicsIGQ6ICdkYXknLCBoOiAnaG91cicsIG06ICdtaW51dGUnLAogICAgICAgICAgICAgICAgICAgICAgICBzOiAnc2Vjb25kJ31bc2hvcnRVbml0XTsKICAgICAgICAgICAgdmFyIGVuZCA9IHRpbWUgPT0gMSA/ICcgJyA6ICdzICc7CiAgICAgICAgICAgIHJldHVybiB0aW1lICsgJyAnICsgdW5pdCArIGVuZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY29tcGVuc2F0ZUxlYXBZZWFycyhkYXlzLCB5ZWFycykgewogICAgICAgICAgICAvLyBOb3QgYSBwZXJmZWN0IGFsZ29yaXRobSBidXQgb3VnaHQgdG8gYmUgZW5vdWdoCiAgICAgICAgICAgIHJldHVybiBkYXlzIC0gTWF0aC5mbG9vcih5ZWFycyAvIDQpOwogICAgICAgIH0KICAgICAgICB2YXIgZ2VuZXJhdGVkID0gTWF0aC5yb3VuZCh0aW1lc3RhbXAgLyAxMDAwKTsKICAgICAgICB2YXIgY3VycmVudCA9IE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTsKICAgICAgICB2YXIgZWxhcHNlZCA9IGN1cnJlbnQgLSBnZW5lcmF0ZWQ7CiAgICAgICAgdmFyIHByZWZpeCA9ICcnOwogICAgICAgIGlmIChlbGFwc2VkIDwgMCkgewogICAgICAgICAgICBwcmVmaXggPSAnLSAnOwogICAgICAgICAgICBlbGFwc2VkID0gTWF0aC5hYnMoZWxhcHNlZCk7CiAgICAgICAgfQogICAgICAgIHZhciBzZWNzICA9IGVsYXBzZWQgJSA2MDsKICAgICAgICB2YXIgbWlucyAgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyA2MCkgJSA2MDsKICAgICAgICB2YXIgaG91cnMgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjApKSAlIDI0OwogICAgICAgIHZhciBkYXlzICA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCkpICUgMzY1OwogICAgICAgIHZhciB5ZWFycyA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCozNjUpKTsKICAgICAgICBpZiAoeWVhcnMpIHsKICAgICAgICAgICAgZGF5cyA9IGNvbXBlbnNhdGVMZWFwWWVhcnMoZGF5cywgeWVhcnMpOwogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyh5ZWFycywgJ3knKSArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKTsKICAgICAgICB9IGVsc2UgaWYgKGRheXMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKSArIHRpbWVTdHJpbmcoaG91cnMsICdoJyk7CiAgICAgICAgfSBlbHNlIGlmIChob3VycykgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhob3VycywgJ2gnKSArIHRpbWVTdHJpbmcobWlucywgJ20nKTsKICAgICAgICB9IGVsc2UgaWYgKG1pbnMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcobWlucywgJ20nKSArIHRpbWVTdHJpbmcoc2VjcywgJ3MnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhzZWNzLCAncycpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmcocXVlcnkpIHsKICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgaWYgKCFxdWVyeSkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB2YXIgcGFyYW1zID0gcXVlcnkuc3BsaXQoJyYnKTsKICAgICAgICB2YXIgcGFydHM7CiAgICAgICAgZnVuY3Rpb24gZGVjb2RlKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpdGVtLnJlcGxhY2UoJysnLCAnICcpKTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcmFtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBwYXJ0cyA9IHBhcmFtc1tpXS5zcGxpdCgnPScpOwogICAgICAgICAgICByZXN1bHRbZGVjb2RlKHBhcnRzLnNoaWZ0KCkpXSA9IGRlY29kZShwYXJ0cy5qb2luKCc9JykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBtYXA6IG1hcCwKICAgICAgICBmaWx0ZXI6IGZpbHRlciwKICAgICAgICBhbGw6IGFsbCwKICAgICAgICBhbnk6IGFueSwKICAgICAgICBjb250YWluczogY29udGFpbnMsCiAgICAgICAgbGFzdDogbGFzdCwKICAgICAgICBlc2NhcGU6IGVzY2FwZSwKICAgICAgICB1bmVzY2FwZTogdW5lc2NhcGUsCiAgICAgICAgbm9ybWFsaXplOiBub3JtYWxpemUsCiAgICAgICAgcmVnZXhwRXNjYXBlOiByZWdleHBFc2NhcGUsCiAgICAgICAgTWF0Y2hlcjogTWF0Y2hlciwKICAgICAgICBmb3JtYXRQYXJlbnROYW1lOiBmb3JtYXRQYXJlbnROYW1lLAogICAgICAgIHRpbWVGcm9tRGF0ZTogdGltZUZyb21EYXRlLAogICAgICAgIGRhdGVGcm9tRGF0ZTogZGF0ZUZyb21EYXRlLAogICAgICAgIGRhdGVUaW1lRnJvbURhdGU6IGRhdGVUaW1lRnJvbURhdGUsCiAgICAgICAgZm9ybWF0RWxhcHNlZDogZm9ybWF0RWxhcHNlZCwKICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRTdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZFN0cmluZywKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZywKICAgICAgICBwYXJzZVF1ZXJ5U3RyaW5nOiBwYXJzZVF1ZXJ5U3RyaW5nCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy50ZXN0ZGF0YSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBlbGVtZW50c0J5SWQgPSB7fTsKICAgIHZhciBpZENvdW50ZXIgPSAwOwogICAgdmFyIF9zdGF0aXN0aWNzID0gbnVsbDsKICAgIHZhciBMRVZFTFMgPSBbJ1RSQUNFJywgJ0RFQlVHJywgJ0lORk8nLCAnV0FSTicsICdFUlJPUicsICdGQUlMJ107CiAgICB2YXIgU1RBVFVTRVMgPSBbJ0ZBSUwnLCAnUEFTUycsICdOT1RfUlVOJ107CiAgICB2YXIgS0VZV09SRFMgPSBbJ0tFWVdPUkQnLCAnU0VUVVAnLCAnVEVBUkRPV04nLCAnRk9SJywgJ1ZBUiddOwogICAgZnVuY3Rpb24gYWRkRWxlbWVudChlbGVtKSB7CiAgICAgICAgaWYgKCFlbGVtLmlkKQogICAgICAgICAgICBlbGVtLmlkID0gdW5pcXVlSWQoKTsKICAgICAgICBlbGVtZW50c0J5SWRbZWxlbS5pZF0gPSBlbGVtOwogICAgICAgIHJldHVybiBlbGVtOwogICAgfQogICAgZnVuY3Rpb24gdW5pcXVlSWQoKSB7CiAgICAgICAgaWRDb3VudGVyKys7CiAgICAgICAgcmV0dXJuICdlbGVtZW50LWlkLScgKyBpZENvdW50ZXI7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lcyhzdGF0cykgewogICAgICAgIHZhciBzdGFydE1pbGxpcyA9IHN0YXRzWzFdOwogICAgICAgIHZhciBlbGFwc2VkID0gc3RhdHNbMl07CiAgICAgICAgaWYgKHN0YXJ0TWlsbGlzID09PSBudWxsKQogICAgICAgICAgICByZXR1cm4gW251bGwsIG51bGwsIGVsYXBzZWRdOwogICAgICAgIHJldHVybiBbdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMpLAogICAgICAgICAgICAgICAgdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMgKyBlbGFwc2VkKSwKICAgICAgICAgICAgICAgIGVsYXBzZWRdOwogICAgfQogICAgZnVuY3Rpb24gbWVzc2FnZShlbGVtZW50LCBzdHJpbmdzKSB7CiAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQobW9kZWwuTWVzc2FnZShMRVZFTFNbZWxlbWVudFsxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnRpbWVzdGFtcChlbGVtZW50WzBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncy5nZXQoZWxlbWVudFszXSkpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlU3RhdHVzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIFNUQVRVU0VTW3N0YXRzWzBdXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoaWxkQ3JlYXRvcihwYXJlbnQsIGNoaWxkVHlwZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoZWxlbSwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQoY2hpbGRUeXBlKHBhcmVudCwgZWxlbSwgc3RyaW5ncywgaW5kZXgpKTsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlS2V5d29yZChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIGt3ID0gbW9kZWwuS2V5d29yZCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICB0eXBlOiBLRVlXT1JEU1tlbGVtZW50WzBdXSwKICAgICAgICAgICAgaWQ6ICdrJyArIChpbmRleCArIDEpLAogICAgICAgICAgICBuYW1lOiBzdHJpbmdzLmdldChlbGVtZW50WzFdKSwKICAgICAgICAgICAgbGlibmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFsyXSksCiAgICAgICAgICAgIHRpbWVvdXQ6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pLAogICAgICAgICAgICBhcmdzOiBzdHJpbmdzLmdldChlbGVtZW50WzVdKSwKICAgICAgICAgICAgYXNzaWduOiBzdHJpbmdzLmdldChlbGVtZW50WzZdKSwKICAgICAgICAgICAgdGFnczogc3RyaW5ncy5nZXQoZWxlbWVudFs3XSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbNF0pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzdGF0dXM6IHBhcnNlU3RhdHVzKGVsZW1lbnRbOF0sIHN0cmluZ3MpLAogICAgICAgICAgICB0aW1lczogbW9kZWwuVGltZXModGltZXMoZWxlbWVudFs4XSkpLAogICAgICAgICAgICBpc0NoaWxkcmVuTG9hZGVkOiB0eXBlb2YoZWxlbWVudFs5XSkgIT09ICdudW1iZXInCiAgICAgICAgfSk7CiAgICAgICAgbGF6eVBvcHVsYXRlS2V5d29yZHNGcm9tRmlsZShrdywgZWxlbWVudFs5XSwgc3RyaW5ncyk7CiAgICAgICAga3cucG9wdWxhdGVNZXNzYWdlcyhQb3B1bGF0b3IoZWxlbWVudFsxMF0sIHN0cmluZ3MsIG1lc3NhZ2UpKTsKICAgICAgICByZXR1cm4ga3c7CiAgICB9CiAgICBmdW5jdGlvbiBsYXp5UG9wdWxhdGVLZXl3b3Jkc0Zyb21GaWxlKHBhcmVudCwgbW9kZWxPckluZGV4LCBzdHJpbmdzKSB7CiAgICAgICAgdmFyIG1vZGVsLCBpbmRleCwgcG9wdWxhdG9yOwogICAgICAgIHZhciBjcmVhdG9yID0gY2hpbGRDcmVhdG9yKHBhcmVudCwgY3JlYXRlS2V5d29yZCk7CiAgICAgICAgaWYgKHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkKSB7CiAgICAgICAgICAgIG1vZGVsID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwb3B1bGF0b3IgPSBQb3B1bGF0b3IobW9kZWwsIHN0cmluZ3MsIGNyZWF0b3IpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluZGV4ID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwYXJlbnQuY2hpbGRGaWxlTmFtZSA9IHdpbmRvdy5zZXR0aW5nc1snc3BsaXRMb2dCYXNlJ10gKyAnLScgKyBpbmRleCArICcuanMnOwogICAgICAgICAgICBwb3B1bGF0b3IgPSBTcGxpdExvZ1BvcHVsYXRvcihpbmRleCwgY3JlYXRvcik7CiAgICAgICAgfQogICAgICAgIHBhcmVudC5wb3B1bGF0ZUtleXdvcmRzKHBvcHVsYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiB0YWdzKHRhZ2xpc3QsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gdXRpbC5tYXAodGFnbGlzdCwgc3RyaW5ncy5nZXQpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlVGVzdChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1c0VsZW1lbnQgPSBlbGVtZW50WzVdOwogICAgICAgIHZhciB0ZXN0ID0gbW9kZWwuVGVzdCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICBpZDogJ3QnICsgKGluZGV4ICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzNdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZW91dDogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIGlzQ3JpdGljYWw6IGVsZW1lbnRbMl0sCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoc3RhdHVzRWxlbWVudCksCiAgICAgICAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBtc2cgPSBjcmVhdGVNZXNzYWdlKHN0YXR1c0VsZW1lbnQsIHN0cmluZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbXNnOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKHN0YXR1c0VsZW1lbnQpKSwKICAgICAgICAgICAgdGFnczogdGFncyhlbGVtZW50WzRdLCBzdHJpbmdzKSwKICAgICAgICAgICAgaXNDaGlsZHJlbkxvYWRlZDogdHlwZW9mKGVsZW1lbnRbNl0pICE9PSAnbnVtYmVyJwogICAgICAgIH0pOwogICAgICAgIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUodGVzdCwgZWxlbWVudFs2XSwgc3RyaW5ncyk7CiAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNZXNzYWdlKHN0YXR1c0VsZW1lbnQsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gc3RhdHVzRWxlbWVudC5sZW5ndGggPT0gNCA/IHN0cmluZ3MuZ2V0KHN0YXR1c0VsZW1lbnRbM10pIDogJyc7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVTdWl0ZShwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1c0VsZW1lbnQgPSBlbGVtZW50WzVdOwogICAgICAgIHZhciBzdWl0ZSA9IG1vZGVsLlN1aXRlKHsKICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgICAgIGlkOiAncycgKyAoKGluZGV4IHx8IDApICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBzb3VyY2U6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMV0pLAogICAgICAgICAgICByZWxhdGl2ZVNvdXJjZTogc3RyaW5ncy5nZXQoZWxlbWVudFsyXSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzdGF0dXM6IHBhcnNlU3RhdHVzKHN0YXR1c0VsZW1lbnQpLAogICAgICAgICAgICBtZXNzYWdlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbXNnID0gY3JlYXRlTWVzc2FnZShzdGF0dXNFbGVtZW50LCBzdHJpbmdzKTsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1zZzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhzdGF0dXNFbGVtZW50KSksCiAgICAgICAgICAgIHN0YXRpc3RpY3M6IHN1aXRlU3RhdHModXRpbC5sYXN0KGVsZW1lbnQpKSwKICAgICAgICAgICAgbWV0YWRhdGE6IHBhcnNlTWV0YWRhdGEoZWxlbWVudFs0XSwgc3RyaW5ncykKICAgICAgICB9KTsKICAgICAgICBzdWl0ZS5wb3B1bGF0ZUtleXdvcmRzKFBvcHVsYXRvcihlbGVtZW50WzhdLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZUtleXdvcmQpKSk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyhQb3B1bGF0b3IoZWxlbWVudFs3XSwgc3RyaW5ncywgY2hpbGRDcmVhdG9yKHN1aXRlLCBjcmVhdGVUZXN0KSkpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlU3VpdGVzKFBvcHVsYXRvcihlbGVtZW50WzZdLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZVN1aXRlKSkpOwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTWV0YWRhdGEoZGF0YSwgc3RyaW5ncykgewogICAgICAgIHZhciBtZXRhZGF0YSA9IFtdOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxkYXRhLmxlbmd0aDsgaSs9MikgewogICAgICAgICAgICBtZXRhZGF0YS5wdXNoKFtzdHJpbmdzLmdldChkYXRhW2ldKSwgc3RyaW5ncy5nZXQoZGF0YVtpKzFdKV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWV0YWRhdGE7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG90YWw6IHN0YXRzWzBdLAogICAgICAgICAgICB0b3RhbFBhc3NlZDogc3RhdHNbMV0sCiAgICAgICAgICAgIHRvdGFsRmFpbGVkOiBzdGF0c1swXSAtIHN0YXRzWzFdLAogICAgICAgICAgICBjcml0aWNhbDogc3RhdHNbMl0sCiAgICAgICAgICAgIGNyaXRpY2FsUGFzc2VkOiBzdGF0c1szXSwKICAgICAgICAgICAgY3JpdGljYWxGYWlsZWQ6IHN0YXRzWzJdIC0gc3RhdHNbM10KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gUG9wdWxhdG9yKGl0ZW1zLCBzdHJpbmdzLCBjcmVhdG9yKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbnVtYmVyT2ZJdGVtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY3JlYXRvcjogZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRvcihpdGVtc1tpbmRleF0sIHN0cmluZ3MsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBTcGxpdExvZ1BvcHVsYXRvcihzdHJ1Y3R1cmVJbmRleCwgY3JlYXRvcikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG51bWJlck9mSXRlbXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3dbJ2tleXdvcmRzJytzdHJ1Y3R1cmVJbmRleF0ubGVuZ3RoOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjcmVhdG9yOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdG9yKHdpbmRvd1sna2V5d29yZHMnK3N0cnVjdHVyZUluZGV4XVtpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3dbJ3N0cmluZ3MnK3N0cnVjdHVyZUluZGV4XSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3VpdGUoKSB7CiAgICAgICAgdmFyIGVsZW0gPSB3aW5kb3cub3V0cHV0LnN1aXRlOwogICAgICAgIGlmIChlbGVtZW50c0J5SWRbZWxlbS5pZF0pCiAgICAgICAgICAgIHJldHVybiBlbGVtOwogICAgICAgIHZhciByb290ID0gYWRkRWxlbWVudChjcmVhdGVTdWl0ZShudWxsLCBlbGVtLCBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKSk7CiAgICAgICAgd2luZG93Lm91dHB1dC5zdWl0ZSA9IHJvb3Q7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kTG9hZGVkKGlkKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnRzQnlJZFtpZF07CiAgICB9CiAgICBmdW5jdGlvbiBlbnN1cmVMb2FkZWQoaWQsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGlkcyA9IGlkLnNwbGl0KCctJyk7CiAgICAgICAgdmFyIHJvb3QgPSBzdWl0ZSgpOwogICAgICAgIGlkcy5zaGlmdCgpOwogICAgICAgIGxvYWRJdGVtcyhpZHMsIHJvb3QsIFtyb290LmlkXSwgY2FsbGJhY2spOwogICAgfQogICAgZnVuY3Rpb24gbG9hZEl0ZW1zKGlkcywgY3VycmVudCwgcmVzdWx0LCBjYWxsYmFjaykgewogICAgICAgIGlmICghaWRzLmxlbmd0aCkgewogICAgICAgICAgICBjYWxsYmFjayhyZXN1bHQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQuY2FsbFdoZW5DaGlsZHJlblJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGlkID0gaWRzLnNoaWZ0KCk7CiAgICAgICAgICAgIHZhciB0eXBlID0gaWRbMF07CiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGlkLnN1YnN0cmluZygxKSkgLSAxOwogICAgICAgICAgICB2YXIgaXRlbSA9IHNlbGVjdEZyb20oY3VycmVudCwgdHlwZSwgaW5kZXgpOwogICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0uaWQpOwogICAgICAgICAgICBlbHNlICAgIC8vIEludmFsaWQgaWQuIFNob3VsZCB0aGlzIGJlIHJlcG9ydGVkIHNvbWV3aGVyZT8KICAgICAgICAgICAgICAgIGlkcyA9IFtdOwogICAgICAgICAgICBsb2FkSXRlbXMoaWRzLCBpdGVtLCByZXN1bHQsIGNhbGxiYWNrKTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlbGVjdEZyb20oZWxlbWVudCwgdHlwZSwgaW5kZXgpIHsKICAgICAgICBpZiAodHlwZSA9PT0gJ2snKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmtleXdvcmRzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3QnKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRlc3RzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnN1aXRlcygpW2luZGV4XTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBlcnJvckl0ZXJhdG9yKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlKHdpbmRvdy5vdXRwdXQuZXJyb3JzLnNoaWZ0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaGFzTmV4dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5vdXRwdXQuZXJyb3JzLmxlbmd0aCA+IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdGlzdGljcygpIHsKICAgICAgICBpZiAoIV9zdGF0aXN0aWNzKSB7CiAgICAgICAgICAgIHZhciBzdGF0RGF0YSA9IHdpbmRvdy5vdXRwdXQuc3RhdHM7CiAgICAgICAgICAgIF9zdGF0aXN0aWNzID0gc3RhdHMuU3RhdGlzdGljcyhzdGF0RGF0YVswXSwgc3RhdERhdGFbMV0sIHN0YXREYXRhWzJdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9zdGF0aXN0aWNzOwogICAgfQogICAgZnVuY3Rpb24gU3RyaW5nU3RvcmUoc3RyaW5ncykgewogICAgICAgIGZ1bmN0aW9uIGdldFRleHQoaWQpIHsKICAgICAgICAgICAgdmFyIHRleHQgPSBzdHJpbmdzW2lkXTsKICAgICAgICAgICAgaWYgKCF0ZXh0KQogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICBpZiAodGV4dFswXSA9PSAnKicpCiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgIHZhciBleHRyYWN0ZWQgPSBleHRyYWN0KHRleHQpOwogICAgICAgICAgICBzdHJpbmdzW2lkXSA9ICcqJyArIGV4dHJhY3RlZDsKICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RlZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZXh0cmFjdCh0ZXh0KSB7CiAgICAgICAgICAgIHZhciBkZWNvZGVkID0gSlhHLlV0aWwuQmFzZTY0LmRlY29kZUFzQXJyYXkodGV4dCk7CiAgICAgICAgICAgIHZhciBleHRyYWN0ZWQgPSAobmV3IEpYRy5VdGlsLlVuemlwKGRlY29kZWQpKS51bnppcCgpWzBdWzBdOwogICAgICAgICAgICByZXR1cm4gSlhHLlV0aWwuVVRGOC5kZWNvZGUoZXh0cmFjdGVkKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZ2V0KGlkKSB7CiAgICAgICAgICAgIGlmIChpZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIHJldHVybiBnZXRUZXh0KGlkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHtnZXQ6IGdldH07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIHN1aXRlOiBzdWl0ZSwKICAgICAgICBlcnJvckl0ZXJhdG9yOiBlcnJvckl0ZXJhdG9yLAogICAgICAgIGZpbmRMb2FkZWQ6IGZpbmRMb2FkZWQsCiAgICAgICAgZW5zdXJlTG9hZGVkOiBlbnN1cmVMb2FkZWQsCiAgICAgICAgc3RhdGlzdGljczogc3RhdGlzdGljcywKICAgICAgICBTdHJpbmdTdG9yZTogU3RyaW5nU3RvcmUsICAvLyBleHBvc2VkIGZvciB0ZXN0cwogICAgICAgIExFVkVMUzogTEVWRUxTCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmZ1bmN0aW9uIHJlbW92ZUphdmFTY3JpcHREaXNhYmxlZFdhcm5pbmcoKSB7CiAgICAvLyBOb3QgdXNpbmcgalF1ZXJ5IGhlcmUgZm9yIG1heGltdW0gc3BlZWQKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqYXZhc2NyaXB0LWRpc2FibGVkJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKfQpmdW5jdGlvbiBhZGRKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKGVycm9yKSB7CiAgICBpZiAod2luZG93LmNvbnNvbGUpCiAgICAgICAgY29uc29sZS5lcnJvcignT3BlbmluZyBmYWlsZWQ6ICcgKyBlcnJvci5uYW1lICsgJzogJyArIGVycm9yLm1lc3NhZ2UpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2phdmFzY3JpcHQtZGlzYWJsZWQnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKfQpmdW5jdGlvbiBpbml0TGF5b3V0KHN1aXRlTmFtZSwgdHlwZSkgewogICAgcGFyc2VUZW1wbGF0ZXMoKTsKICAgIHNldFRpdGxlKHN1aXRlTmFtZSwgdHlwZSk7CiAgICBhZGRIZWFkZXIoKTsKICAgIGFkZFJlcG9ydE9yTG9nTGluayh0eXBlKTsKfQpmdW5jdGlvbiBwYXJzZVRlbXBsYXRlcygpIHsKICAgICQoJ3NjcmlwdFt0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiXScpLm1hcChmdW5jdGlvbiAoaWR4LCBlbGVtKSB7CiAgICAgICAgJC50ZW1wbGF0ZShlbGVtLmlkLCBlbGVtLnRleHQpOwogICAgfSk7Cn0KZnVuY3Rpb24gdGVzdE9yVGFzayh0ZXh0KSB7CiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC97KC4qKX0vLCBmdW5jdGlvbiAobWF0Y2gsIGdyb3VwLCBvZmZzZXQsIHN0cmluZykgewogICAgICAgIGlmICghd2luZG93LnNldHRpbmdzLnJwYSkKICAgICAgICAgICAgcmV0dXJuIGdyb3VwOwogICAgICAgIHJldHVybiB7J1RFU1QnOiAnVEFTSycsICdUZXN0JzogJ1Rhc2snLCAndGVzdCc6ICd0YXNrJ31bZ3JvdXBdOwogICAgfSk7Cn0KZnVuY3Rpb24gc2V0VGl0bGUoc3VpdGVOYW1lLCB0eXBlKSB7CiAgICB2YXIgZ2l2ZW5UaXRsZSA9IHdpbmRvdy5zZXR0aW5ncy50aXRsZTsKICAgIHZhciB0aXRsZSA9IGdpdmVuVGl0bGUgPyBnaXZlblRpdGxlIDogc3VpdGVOYW1lICsgIiAiICsgdHlwZTsKICAgIGRvY3VtZW50LnRpdGxlID0gdXRpbC51bmVzY2FwZSh0aXRsZSk7Cn0KZnVuY3Rpb24gYWRkSGVhZGVyKCkgewogICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwudGltZXN0YW1wKHdpbmRvdy5vdXRwdXQuZ2VuZXJhdGVkKTsKICAgICQudG1wbCgnPGgxPiR7dGl0bGV9PC9oMT4nICsKICAgICAgICAgICAnPGRpdiBpZD0iZ2VuZXJhdGVkIj4nICsKICAgICAgICAgICAgICc8c3Bhbj5HZW5lcmF0ZWQ8YnI+JHtnZW5lcmF0ZWR9PC9zcGFuPjxicj4nICsKICAgICAgICAgICAgICc8c3BhbiBpZD0iZ2VuZXJhdGVkLWFnbyI+JHthZ299IGFnbzwvc3Bhbj4nICsKICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgJzxkaXYgaWQ9InRvcC1yaWdodC1oZWFkZXIiPicgKwogICAgICAgICAgICAgJzxkaXYgaWQ9InJlcG9ydC1vci1sb2ctbGluayI+PGEgaHJlZj0iIyI+PC9hPjwvZGl2PicgKwogICAgICAgICAgICc8L2Rpdj4nLCB7CiAgICAgICAgZ2VuZXJhdGVkOiB1dGlsLmNyZWF0ZUdlbmVyYXRlZFN0cmluZyhnZW5lcmF0ZWQpLAogICAgICAgIGFnbzogdXRpbC5jcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmcoZ2VuZXJhdGVkKSwKICAgICAgICB0aXRsZTogZG9jdW1lbnQudGl0bGUKICAgIH0pLmFwcGVuZFRvKCQoJyNoZWFkZXInKSk7Cn0KZnVuY3Rpb24gYWRkUmVwb3J0T3JMb2dMaW5rKG15VHlwZSkgewogICAgdmFyIHVybDsKICAgIHZhciB0ZXh0OwogICAgdmFyIGNvbnRhaW5lciA9ICQoJyNyZXBvcnQtb3ItbG9nLWxpbmsnKTsKICAgIGlmIChteVR5cGUgPT0gJ1JlcG9ydCcpIHsKICAgICAgICB1cmwgPSB3aW5kb3cuc2V0dGluZ3MubG9nVVJMOwogICAgICAgIHRleHQgPSAnTE9HJzsKICAgIH0gZWxzZSB7CiAgICAgICAgdXJsID0gd2luZG93LnNldHRpbmdzLnJlcG9ydFVSTDsKICAgICAgICB0ZXh0ID0gJ1JFUE9SVCc7CiAgICB9CiAgICBpZiAodXJsKSB7CiAgICAgICAgY29udGFpbmVyLmZpbmQoJ2EnKS5hdHRyKCdocmVmJywgdXJsKTsKICAgICAgICBjb250YWluZXIuZmluZCgnYScpLnRleHQodGV4dCk7CiAgICB9IGVsc2UgewogICAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTsKICAgIH0KfQpmdW5jdGlvbiBhZGRTdGF0aXN0aWNzKCkgewogICAgdmFyIHN0YXRIZWFkZXJzID0KICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+VG90YWw8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5QYXNzPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+RmFpbDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPkVsYXBzZWQ8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+UGFzcyAvIEZhaWw8L3RoPic7CiAgICB2YXIgc3RhdFRhYmxlID0KICAgICAgICAnPGgyPntUZXN0fSBTdGF0aXN0aWNzPC9oMj4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0idG90YWwtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlRvdGFsIFN0YXRpc3RpY3M8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPicgKwogICAgICAgICc8dGFibGUgY2xhc3M9InN0YXRpc3RpY3MiIGlkPSJ0YWctc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgVGFnPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0ic3VpdGUtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgU3VpdGU8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPic7CiAgICAkKHRlc3RPclRhc2soc3RhdFRhYmxlKSkuYXBwZW5kVG8oJyNzdGF0aXN0aWNzLWNvbnRhaW5lcicpOwogICAgdXRpbC5tYXAoWyd0b3RhbCcsICd0YWcnLCAnc3VpdGUnXSwgYWRkU3RhdFRhYmxlKTsKICAgIGFkZFRvb2x0aXBzVG9FbGFwc2VkVGltZXMoKTsKICAgIGVuYWJsZVN0YXRpc3RpY3NTb3J0ZXIoKTsKfQpmdW5jdGlvbiBhZGRUb29sdGlwc1RvRWxhcHNlZFRpbWVzKCkgewogICAgJCgnLnN0YXRzLWNvbC1lbGFwc2VkJykuYXR0cigndGl0bGUnLAogICAgICAgIHRlc3RPclRhc2soJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZXNlIHt0ZXN0fXMuICcpICsKICAgICAgICAnRXhjbHVkZXMgc3VpdGUgc2V0dXBzIGFuZCB0ZWFyZG93bnMuJyk7CiAgICAkKCcjc3VpdGUtc3RhdHMnKS5maW5kKCcuc3RhdHMtY29sLWVsYXBzZWQnKS5hdHRyKCd0aXRsZScsCiAgICAgICAgJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoaXMgc3VpdGUuJyk7Cn0KZnVuY3Rpb24gZW5hYmxlU3RhdGlzdGljc1NvcnRlcigpIHsKICAgICQudGFibGVzb3J0ZXIuYWRkUGFyc2VyKHsKICAgICAgICBpZDogJ3N0YXROYW1lJywKICAgICAgICB0eXBlOiAnbnVtZXJpYycsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZywgdGFibGUsIGNlbGwsIGNlbGxJbmRleCkgewogICAgICAgICAgICAvLyBSb3dzIGhhdmUgY2xhc3MgaW4gZm9ybWF0ICdyb3ctPGluZGV4PicuCiAgICAgICAgICAgIHZhciBpbmRleCA9ICQoY2VsbCkucGFyZW50KCkuYXR0cignY2xhc3MnKS5zdWJzdHJpbmcoNCk7CiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbmRleCk7CiAgICAgICAgfQogICAgfSk7CiAgICAkKCIuc3RhdGlzdGljcyIpLnRhYmxlc29ydGVyKHsKICAgICAgICBzb3J0SW5pdGlhbE9yZGVyOiAnZGVzYycsCiAgICAgICAgaGVhZGVyczogezA6IHtzb3J0ZXI6J3N0YXROYW1lJywgc29ydEluaXRpYWxPcmRlcjogJ2FzYyd9LAogICAgICAgICAgICAgICAgICA1OiB7c29ydGVyOiBmYWxzZX19CiAgICB9KTsKfQpmdW5jdGlvbiBhZGRTdGF0VGFibGUodGFibGVOYW1lKSB7CiAgICB2YXIgc3RhdHMgPSB3aW5kb3cudGVzdGRhdGEuc3RhdGlzdGljcygpW3RhYmxlTmFtZV07CiAgICBpZiAodGFibGVOYW1lID09ICd0YWcnICYmIHN0YXRzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgcmVuZGVyTm9UYWdTdGF0VGFibGUoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmVuZGVyU3RhdFRhYmxlKHRhYmxlTmFtZSwgc3RhdHMpOwogICAgfQp9CmZ1bmN0aW9uIHJlbmRlck5vVGFnU3RhdFRhYmxlKCkgewogICAgJCgnPHRib2R5Pjx0ciBjbGFzcz0icm93LTAiPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5ObyBUYWdzPC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZWxhcHNlZCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZ3JhcGgiPicgKwogICAgICAgICAgJzxkaXYgY2xhc3M9ImVtcHR5LWdyYXBoIj48L2Rpdj4nICsKICAgICAgICAnPC90ZD4nICsKICAgICAgJzwvdHI+PC90Ym9keT4nKS5hcHBlbmRUbygnI3RhZy1zdGF0cycpOwp9CmZ1bmN0aW9uIHJlbmRlclN0YXRUYWJsZSh0YWJsZU5hbWUsIHN0YXRzKSB7CiAgICB2YXIgdGVtcGxhdGUgPSB0YWJsZU5hbWUgKyAnU3RhdGlzdGljc1Jvd1RlbXBsYXRlJzsKICAgIHZhciB0Ym9keSA9ICQoJzx0Ym9keT48L3Rib2R5PicpOwogICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0YXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgJC50bXBsKHRlbXBsYXRlLCBzdGF0c1tpXSwge2luZGV4OiBpfSkuYXBwZW5kVG8odGJvZHkpOwogICAgfQogICAgdGJvZHkuYXBwZW5kVG8oJyMnICsgdGFibGVOYW1lICsgJy1zdGF0cycpOwp9CiQudGVtcGxhdGUoJ3N0YXRDb2x1bW5zVGVtcGxhdGUnLAogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7dG90YWx9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke3Bhc3N9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke2ZhaWx9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1lbGFwc2VkIj4ke2VsYXBzZWR9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+JyArCiAgICAgICd7e2lmIHRvdGFsfX0nICsKICAgICAgJzxkaXYgY2xhc3M9ImdyYXBoIj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0icGFzcy1iYXIiIHN0eWxlPSJ3aWR0aDogJHtwYXNzV2lkdGh9JSIgdGl0bGU9IiR7cGFzc1BlcmNlbnR9JSI+PC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9ImZhaWwtYmFyIiBzdHlsZT0id2lkdGg6ICR7ZmFpbFdpZHRofSUiIHRpdGxlPSIke2ZhaWxQZXJjZW50fSUiPjwvZGl2PicgKwogICAgICAnPC9kaXY+JyArCiAgICAgICd7e2Vsc2V9fScgKwogICAgICAnPGRpdiBjbGFzcz0iZW1wdHktZ3JhcGgiPjwvZGl2PicgKwogICAgICAne3svaWZ9fScgKwogICAgJzwvdGQ+JwopOwokLnRlbXBsYXRlKCdzdWl0ZVN0YXR1c01lc3NhZ2VUZW1wbGF0ZScsCiAgICAnJHtjcml0aWNhbH0gY3JpdGljYWwge3s9IHRlc3RPclRhc2soInt0ZXN0fSIpfX0sICcgKwogICAgJyR7Y3JpdGljYWxQYXNzZWR9IHBhc3NlZCwgJyArCiAgICAnPHNwYW4gY2xhc3M9Int7aWYgY3JpdGljYWxGYWlsZWR9fWZhaWx7e2Vsc2V9fXBhc3N7ey9pZn19Ij4ke2NyaXRpY2FsRmFpbGVkfSBmYWlsZWQ8L3NwYW4+PGJyPicgKwogICAgJyR7dG90YWx9IHt7PSB0ZXN0T3JUYXNrKCJ7dGVzdH0iKX19IHRvdGFsLCAnICsKICAgICcke3RvdGFsUGFzc2VkfSBwYXNzZWQsICcgKwogICAgJzxzcGFuIGNsYXNzPSJ7e2lmIHRvdGFsRmFpbGVkfX1mYWlse3tlbHNlfX1wYXNze3svaWZ9fSI+JHt0b3RhbEZhaWxlZH0gZmFpbGVkPC9zcGFuPicKKTsKLy8gRm9yIGNvbXBsZXRlIGNyb3NzLWJyb3dzZXIgZXhwZXJpZW5jZS4uCi8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX29yZGVyLmh0bWwKZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGV2ZW50KSB7CiAgICB2YXIgZXZlbnQgPSBldmVudCB8fCB3aW5kb3cuZXZlbnQ7CiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKfQo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0ID0ge307Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN1aXRlIl0gPSBbMSwyLDMsMCxbXSxbMSwwLDU1MzldLFtdLFtbNCwwLDEsMCxbXSxbMSwxMTUsNDkzMV0sW1swLDUsMCwwLDAsNiwwLDAsWzEsMTE3LDQ2MDJdLFtbMCw3LDgsMCw5LDEwLDAsMCxbMSwxMTgsNDUzOF0sW10sW1sxMTksMiwxMV1dXSxbMCwxMiw4LDAsMTMsMTQsMCwwLFsxLDQ2NTgsNjFdLFtdLFtdXV0sW11dLFswLDE1LDgsMCwxNiwxNywwLDAsWzEsNDcxOSwxODldLFtdLFtbNDkwOCwyLDE4XV1dLFswLDE5LDIwLDAsMjEsMjIsMCwwLFsxLDQ5MDgsMTM3XSxbXSxbWzQ5OTEsMiwyM10sWzQ5OTQsMiwyNF0sWzQ5OTUsMiwyNV0sWzUwMDgsMiwyNl0sWzUwMDksMiwyN11dXV1dXSxbWzIsMjgsOCwwLDI5LDAsMCwwLFsxLDUwNDcsNDkxXSxbXSxbXV1dLFsxLDEsMSwxXV07Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN0cmluZ3MiXSA9IFtdOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJzdHJpbmdzIl0gPSB3aW5kb3cub3V0cHV0WyJzdHJpbmdzIl0uY29uY2F0KFsiKiIsIipKdXB5dGVyIiwiKi9ob21lL2RhdGFrdXJyZS9Xb3JrL3JvYm90a2VybmVsL2V4YW1wbGVzIiwiKi4uLy4uLy4uLy4uL2hvbWUvZGF0YWt1cnJlL1dvcmsvcm9ib3RrZXJuZWwvZXhhbXBsZXMiLCIqU2hvdyB0aGUgbmV3IFJvYm90IEZyYW1ld29yayBsb2dvIiwiKk9wZW4gdXJsIiwiKjxhIGhyZWY9XCJodHRwczovL3R3aXR0ZXIuY29tL3JvYm90ZnJhbWV3b3JrXCI+aHR0cHM6Ly90d2l0dGVyLmNvbS9yb2JvdGZyYW1ld29ya1x4M2MvYT4iLCIqT3BlbiBCcm93c2VyIiwiKlNlbGVuaXVtTGlicmFyeSIsIio8cD5PcGVucyBhIG5ldyBicm93c2VyIGluc3RhbmNlIHRvIHRoZSBnaXZlbiA8Y29kZT51cmxceDNjL2NvZGU+Llx4M2MvcD4iLCIqJHt1cmx9LCBicm93c2VyPWhlYWRsZXNzZmlyZWZveCIsIipPcGVuaW5nIGJyb3dzZXIgJ2hlYWRsZXNzZmlyZWZveCcgdG8gYmFzZSB1cmwgJzxhIGhyZWY9XCJodHRwczovL3R3aXR0ZXIuY29tL3JvYm90ZnJhbWV3b3JrXCI+aHR0cHM6Ly90d2l0dGVyLmNvbS9yb2JvdGZyYW1ld29ya1x4M2MvYT4nLiIsIipTZXQgV2luZG93IFNpemUiLCIqPHA+U2V0cyBjdXJyZW50IHdpbmRvd3Mgc2l6ZSB0byBnaXZlbiA8Y29kZT53aWR0aFx4M2MvY29kZT4gYW5kIDxjb2RlPmhlaWdodFx4M2MvY29kZT4uXHgzYy9wPiIsIio4MDAsIDYwMCIsIipQYWdlIFNob3VsZCBDb250YWluIiwiKjxwPlZlcmlmaWVzIHRoYXQgY3VycmVudCBwYWdlIGNvbnRhaW5zIDxjb2RlPnRleHRceDNjL2NvZGU+Llx4M2MvcD4iLCIqUm9ib3QgRnJhbWV3b3JrIiwiKkN1cnJlbnQgcGFnZSBjb250YWlucyB0ZXh0ICdSb2JvdCBGcmFtZXdvcmsnLiIsIipDYXB0dXJlIGFuZCBjcm9wIHBhZ2Ugc2NyZWVuc2hvdCIsIipTZWxlbml1bVNjcmVlbnNob3RzIiwiKjxwPkNhcHR1cmVzIGEgcGFnZSBzY3JlZW5zaG90IHdpdGggdGhlIGdpdmVuIDxjb2RlPmZpbGVuYW1lXHgzYy9jb2RlPiBhbmQgY3JvcHMgaXQgdG8gbWF0Y2ggdGhlIGNvbWJpbmVkIGJvdW5kaW5nIGJveCBvZiB0aGUgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIDxjb2RlPmxvY2F0b3JzXHgzYy9jb2RlPi5ceDNjL3A+IiwiKnJvYm90ZnJhbWV3b3JrLnBuZywgY3NzPS5Qcm9maWxlQXZhdGFyLWltYWdlIiwiKlx4M2MvdGQ+XHgzYy90cj48dHI+PHRkIGNvbHNwYW49XCIzXCI+PGE+PGltZyBzcmM9XCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQU53QUFBRGNDQVlBQUFBYldzK0JBQUFrQkVsRVFWUjRuTzJkZVhnVVZiNzN2N1YwcDVQT1JraENRb0pCSWdsN1dHUlI0a0RHSzhpTHNpaU9MSTdDS0w2OERnUUJ4V0VXd0ptcktEcUEyL1ZSWEs3ZThXWEdrWUVaSCtmVkFCbFJZVkNCUWNWcnVLSXNCcEJWSU9tazAxMVY1LzBqbktLNnU3cFRuVjZxdXZ0OG5xY2ZRblYxOWFucTh6Mi84L3VkYzM2SHcrYjNDQmdNUmx6Z3pTNEFnNUZLTU1FeEdIR0VDWTdCaUNOTWNBeEdIQkhOTGtDcVU1cnVRRzluQnE3S3pFQ3BJdzNab29oTVVVQ21LQ0pURU9BVUJXVFJZMEw3OFZ4Yis4OTIzaXVoV1pMUUxNdG9sbVEwU1JKY2tuenAveEthSlJrWEpRbmZ0YmJoYTVjTEI1dGJjTXpkWnZJZHB6Wk1jSEVpejI3RDFiblpHSnlUamF0enN0QTNLeE5YWldiQXdYZStrNUZydXl3K283Z1ZCUTFOTG56VjFJeTlGNXJ3cnd0TjJIMytBaTU0cFU2WGcyRWNqZzBMUkovQ05EdEdkTW5Ca0p4c0RNL054cENjTEpTbU84d3VWa2lPdExSaTc0VW03RDUvRVhzdlhNU25QMXpBV1kvWDdHSWxIVXh3VVNEZmJzZlU3b1g0WDRYNUdKV1hnNkswTkxPTEZCVWFXOTNZZWU0OC9uN3FERGFmT01Xc1lCUmdndXNrZmJLY3VLVzRHeVoyeThlMWVibG1GeWN1YkQvekE5NCtlUm9iajUvRTRaWldzNHVUa0REQmhVRmhtaDEzOXVpTzZTVkZHSmFiYlhaeFRHWEh1ZlA0djQwbnNLSHhlL3pnWlYxUG96REJkWUJURVBDVGtpTE1LaTNDOVFWZHpTNk9KWG43KzlONG8vRUUvblRzZTdPTFlubVk0SFRnT1E3WEYrVGh6dEppVE8zZURVNUJNTHRJQ2NFUFhpLytkT3g3dlA3ZENmenozSG16aTJOSm1PQTBGS2JaTWYvS0hyaTdyQlRkSGNrUitEQ0xiMXd0ZU9GSUkxNDQxSWlMRWd1MlVKamdBQXpPeWNLaThqTGMyYU83MlVWSk90eUtncGVQTk9LcGI0L2k2K1lXczR0ak9pa3R1QjkxN1lKVi9YcW5USlRSYk43Ky9qUWUrdS8vd1ZkTkxyT0xZaG9wS2JpS1RDZFc5K3VOeWNXRmhzNG5BTGpZRmluaE1mcU1aRUx3NnRGaitQVlhCM0d5elJQcllsbU9sQkpjUVpvZC85N25LdHpiczdURGM1bklPbytSWitkV0ZEeitQNGV3K3VCaHRNaHlQSXBsQ1ZKQ2NHazhqNFhsWmZoVnhaWElGa1BQUFNTRWdPT1kxS0tCRWVFZGM3ZGgyWDkvalQ5OGR4eEpYeEdSQW9LYjFyMGJudWhmZ1o0WjZTSFBZeFl0ZGhoNXRudk9YOFQ4THhxd0s4bUhFNUpXY0wyYzZYaDVjSCtNemM4TGVSNFRXdnd3OHF6ZmFEeUIrNzg0Z0RPZTVQVHZrbTRCcXNCeFdGYlJDMS8rZUhSSXNaRkx6UXdUVy95Z3p6cFVDeitydEJoZlhYOHRacFFXeDZOSWNTZXBMRnhWZGhiK2E5Z0FETXpPQ25xT1FnQ2VxU3docUR0MUJuZnQzWS92a3lpYW1SUVd6czd6ZUtUdlZkZzlkbFJJc1FGTWJJbkV1TUo4SFBpM2F0eGRWbUoyVWFKR3dsdTRxM096OGNhd2dhaklkQVk5aC9scGlVL2RxYk9ZODYvOU9KN2dLU0lTMnNJOTJ2Y3FmRHBtVkVpeEFVeHN5Y0M0d3E3NDZ2clJ1T3VLeEo1K2w1Q0N5eEZGZkZBOUhNc3FlcGxkRkVZY3lSWkYvT2VRQVhobFNIOElDVHBXbW5DQ3E4ak13R2MxMStDNnJsMTAzMC9vL2pIREVIT3VLTUVIMWNPUlo3T1pYWlN3U1NqQlRleVdqNzFqUnFFc3hDQjJZclo3akhDNU5pOFgrMnF1UVdWbWh0bEZDWXVFRWR5eWlsNTRlOVJRT0R1WW1zVklIWHFrTzdCN3pDaU1TNkNWK0pZWG5NQngrTVBRZ1hpMDcxWE1lakVDeUJSRi9MOXJodUtlQkJrNnNMVGdza1FCSDFRUHg2d2V5VG5yZ0JFZGVJN0Qrc0g5c1haQUpYaUxCMU1zSzdoaVJ4cDJqeG5GRm9jeURITi9lUm5lR2w1bGRqRkNZa25COVVoM1lOZDFJem9jWDJNdy9KbGFYSWk2YTRiQmJ0RXBSWllUWE0rTWRPeTZiZ1N1MElsRUVzS0Mvb3lPdWFHd0s5NjdacGdsczYxWlNuRDlzekx4eVk5R29ydE9IbjRDc0lXaERNT016Yy9EdHRGWEk4dGlVVzNMQ083S2pIVFVqeDZHZ2pSN3dIdUVFQmFoWklSRXIvY3pza3NPM3IxbUtHd1dhcWd0SWJnQ3V4M2JxNGVqVUdjVERKYnlnR0VFanVOMFJYZHRYaTcrTW1Ld05TbzZMQ0M0SEZIRVAwWmZqUjU2M1VnbU5rWVlCQlBkVFVVRitNT3dnU2FVS0JCVEJlY1FlTHgzN1REMHo4N1VmWitKalJFdXdlck1qTkppckJsUUdlZlNCR0thNERnQW00WVB4c2d1T1FIdnNXZ2tJMUwwNnRDaThqTGNYMTVtUW1rdVk1cmcxZy91aHh1NzVRY2NaOTFJUmpRSTFyMWMwNzhDVTRxTUpRQ09CYVlJYmxsRkw5eGRGcGlNbFlYK0dkRkVyeTV4SEljTnd3ZGhsRWt6bU9JdXVOdEtpdkJvMzZ0MDMyTlNZOFFEQjgvam5aRkRRaTd6aWhWeEZWeGxaZ2IrYzNEL2VINGxnNkZMbnQyR3Y0MFlIUGNwWUhFVG5GTVE4TTZvb2NnUXJUZmRocEdhRE1ySnduT0Qrc2IxTytNbXVEOE1HNGh5WjJLdHptVWtQL2VVbFdMT0ZmRmJTeGNYd1MwcUw4TVVnMXRETVJqeDVqK3ErbUpBa0xIZ2FCTnp3VlZsWjJGMXY5NEJ4OWxZRzhNcU9IZ2VHNGRYSVkyUHZmMko2VGRraWdJMmp4d01VZWRHV1BpZllTVXFNcDF4OGVkaXVuWmgvZUQrSFc0VFpSVWtTUUxQOCtBNERwSWtnUkNDOTk1N0QzLy8rOS94eVNlZm9MR3hFYWRQbndiSGNWQVV4ZXppV2dJNnVKeVJrWUZ1M2JwaHdJQUJxS21wd1l3Wk0xQlFVS0NlQXdCOEhLeEhwTnhkVm9JdHA4L2lUOGUrajlsM3hDelYrUjA5dXVPL2hnNkl4YVZqZ2lSSlVCUUZnaURnalRmZXdDT1BQSUtEQncrQzR6aklzZ3hCRUtBb2lqb1RKdFc3eER6UHE4OUNVUlJ3SE9mem1qTm5EbGF1WElsdTNib0JBQVFMTGdiVm8wbVMwR2ZianBpbFZJOUpzOVBGSnVJcG5ZbWlpb1VyS2MvemNMdmQrTWxQZm9LZi9leG5PSGp3SUFSQmdDekxzTmxza0M5dGkwdXRJS01kUlZGOHJKZWlLRkFVQlMrOTlCS0dEaDJLN2R1M20xaTY4TWtTUmZ4SERMdVdNUkhjYzRQNkljOGVtQlhYeWhtVlhDNFhKa3lZZ00yYk42c3R0eXpMNEhsZXRYQ1VWTGR1QUZScnI3VjBoQkQxYjQ3amNQYnNXWXdmUHg1Ly9ldGZ6UzV1V0V3dUxzUzA3dDFpY3Uyb0MrN0grWG1ZVVZvVTdjdEdIVnBoUEI0UHpwOC9qNXR1dWdtN2QrOEcwQzRvV1piVjFscFJGTWl5REVLSStqbEdPL1I1YUo4TGZWYXlMRU9XWmN5WU1RTnZ2dm1tK2h3VGdXY0c5a0ZPRE5JelJGMXdyK240YlZhc250U0N1ZDF1M0h6enpkaXhZd2U4WHEvYWFqTWlnNHFQTm1wMzNua25ObTdjbURDaUszS2s0ZkgrZ2NOWmtSTFZtcldpc2h5bE9pdTNyZGlSSklUQTVYSmg0c1NKMkxseko0RExFVFZtd2FJRElVVHRpbFBSYmQ2OE9XRWF0TGxscGVpZkZkMEI4YWpkZWI3ZGhxVlg5WXpXNVdKT2MzTXpKazJhaEYyN2RxbkhPSTVUZlJKR1pPZzFYbTF0YmJqampqdncxbHR2bVZXc2tQai83anpINFptQmZhTDZIVkVUM09yK0ZaYWVtT3p2czkxODg4M1l0V3VYZXB6Nkc5VC9ZRVFHZlliK1k1WmVyeGQzM0hHSEpYMDZ2ZWh6VFVFZXhoY0dMcFR1TEZFUlhOOU1KMmIzc1BiT2xNeG5NNWRFOXVtZUhsZ1pOYmNvS2pYdHFVRjlBbG9IcTQyNU1aL05mQkxWcDZ2SWRHSjJsTFk2anZoT1IrZmw0Z2FkL2Jtc051YkdmRFp6U1VTZlRzdkt5dktvYkhNYzhVREQ2djRWRVJjaUZ0RHBSbDZ2RnkwdExaZzhlYktQejliUmZFaFJGTlZaRkhRQVhCQUVqQnMzRGdNR0RFQ2FUdExhVklMbmVUUTJOcUt1cmc1SGpoeFJaK0FRUW1DejJkRFc1anMxcWlPZmpoQ0NhZE9tK1ZoQkszRkZSanJ1S1N2RkM0ZS9pK2c2RVFsdWZHRlh5MjRuNWUrei9mT2YvMVIvYkNxaVVORFpKWFRtUko4K2ZiQnAweWFVbDVlcjEwOWw2TE9VWlJsUFB2a2tsaTlmcmpaUUhvK253ODlyWjZmUTdpWEhjWmd5WlFvQWE4NjlYRkhaQzY4Y2FZUTNnaDVSUkYzS1IvcEdmMkF3V2tUcXM5RnpGVVZCWldVbDNuMzNYZlRxMVV0OUw5VmZWREE4eitPaGh4N0NFMDg4b2ZwaVJodWpSUFBwaWgxcG1IZGxqNGl1MFdrTGQxM1hYQXpMelk3b3kyTkpNSi9ONlBJYU9pK3dUNTgrcUsrdlI3ZHUzWHk2UlZhdEZQR0dQb2VGQ3hjQ0FCNTg4RUhERFJwOXhoVHEwd0hBYmJmZEZvUFNSczdTcTNyaTJXK1BkbnIyVktjRnQ2aThaMmMvR2hOa1dWWi9SSmZMRlRETzFobWZyWGZ2M3RpeVpRc0tDZ3BVc1RMYUVmM21HU3FLZ3RyYVdoQkM4TUFERDBUczAzRWNoNmxUcC9wWVZTdFFtdTdBcE9KQy9QWEVxVTU5dmxQTmRNK01kRXdwS3VqVUY4WUthcm1hbTVzeGVmTGtzTWZacU1ob1Y2bXlzaEoxZFhVb0tVbU16ZHJOaGxxclJZc1c0ZmUvLzczUE9qbWpQaDM5MStQeFlQcjA2WGozM1hjRHJLQVZXQkpCdXZST0NXNXhlWmtseDkwVVJjSGl4WXZ4NFljZkFvak1aNnVycTBOcGFTbGIzVzBRN1dMVVJZc1dSZXpUS1lxQ21UTm40dENoUTVheGJwVHJ1blpCVlhaV3B6NGJ0dUN5UkJFL0t3dHM5YTB3N2xaZlg0OVhYbmxGL1g4NDQyeitQbHR4Y2JHNlJJZjVheDNqdndoMTRjS0ZlT0tKSndDRTErRFJjem1PUTNOek0rYk9uV3M1Q3dlMFo2THJER0hYcEptbFJRRjdKMXZCdW5FY2gxLzk2bGRxQzluUjNFaFJGTUh6UEVSUlZJV3A5ZG5vZS9SOVJtam9PS1VnQ0tyNGFtdHJzWHIxYXAvM2VaN1hIY1AwOSttb3hmemdndzlRVjFlbit1RldXWTg0dmFRSTJaMVlMeGUyNEJaY2VVWGdSU3hRSVQvKytHTjg5dGxuaHJ1QXpHZUxMWkg2ZER6UHErZS8rT0tMUHJzcVdVRndhUUtQbi9Zb0R2dHpZUWx1V0U1MndPYUpWcmg1QU5peVpVdFlDWDZZenhaYkl2WHBhTEJMVVJSczI3Wk5UZkprcGQ3Ry8rNFp1QU5VUjRRbHVIdDF2c0FxRCtEVFR6OVYvMlkrbS9sRTZ0UFI4M2llUjNOek14b2FHdFRaUTJiVk9mOXlEOHpPd3ZBd3g2SU4xeXlSNHpEVHdybEtUcHc0QVFDR1cwRkJFTkNuVHg5czNicVYrV3d4d04rbm8rTjBhOWV1TlNRNGJTNFpSVkZ3N3R3NWNCeG42cFF2dlhweFY1ajdFaGdXM0UxRkJjajBjeEt0MFpsczU5U3BVejRPZTBmSXNvelhYMzlkelp2SWlDMkNJSURqT015Yk53K1RKMDgydXpoUjQ3WXdzM3NaRnR5czBrQUgwVXAyZ09kNU5XT3lrUloweElnUnFLcXFzdFFzaG1SR0crNmZOV3VXeWFXSkhvVnBkdnhiUVo3aDh3MEp6aWtJdUVsblAyNnJRY1A3UnVqYnR6M1pKMXZ4SFI5bzExQVFCUFRyMTgvczRrU1ZHVHJHS0JpR2F0clU3dDNnc09EWW14WWFFVE9hazRRS2pTMUFqUStpS0tyZHlveU01Tm9uOE5aaTQ5MUtRNEticEROdjBncGpid3lHRmNpeGlhakpOOWF0TkNTNGNUb3BGQmdNeG1YR0Z4clRTSWVDcTg3TFJZN05Oem9wc3k0WWcrSERCSU14amc0bmc5Mm9jNkZvSkZOSk52eTNzdElHWXZ4bndHaFhUR3MvNzcrUzJreTA5d1A0amtHeHFHNGdnN0t6a0crMzRZekhHL0s4RG4vVmFDYkJUR2EwZ1JkdElFWTdURUdETlA3SDlRUnFOblRHalhhRERqcnRqVTEvMDJlaWdUV2lJUzJjVXhBd05NZDMzWTkveTh4b2g0YTg2YXgycjllTGp6LytHQjk5OUJIMjdkdUhFeWRPNFB2djIzZldMQ29xUW5GeE1RWVBIb3pxNm1xTUhEa1NOcHROSFJQMDN4N0xET2ozYXkydTBmUVVxVXBOZmg1ZU8zbzg1RGtoQlRjbXYwdGdOSktKVFJjcWxxKy8vaHBQUC8wMDNucnJMWnc1YzBhMVh0bzVnTjkrK3kwRVFjQmYvdklYY0J5SC9QeDhUSnMyRGJXMXRhaW9xTEJFZzBZSXdaRWpSN0Jod3daODg4MDNrR1VaaFlXRm1EcDFLa2FPSEdsMjhTeEpkVjZYRHM4SktianJ1Z1pld1B5cVlBMjA2N0k0amtOVFV4TisrY3RmNHRWWFgxVXRISVdtNU5OMkZiWEhUcDA2aFJkZWVBSHIxNi9IbkRsejhQREREeU0vUDkvSHlrVGJwNlBsMTFvd3VzZENXMXNiVnF4WWdXZWZmVmE5RC9yK21qVnJNSEhpUkx6ODhzdkl6YzFWcitlZjR5UVZLWGVtSTg5bXd6bHZjRDh1NUs5b1JMR3BEQlZCZlgwOUJnOGVqUFhyMTZ2TFNEcHpMVm1XOGZMTEw2T3Fxa3BkYmhRcmFEb0RyZEFVUmNIbm4zK08wYU5IWTkyNmRaQWtDUUFDZ2p2dnZQTU94bzRkaTliV1ZoKy9sQUg4dUlOcFhxRUYxelUzbW1WSkttZ0ZmZkhGRnpGeDRrUjg5OTEzUGtHUXpsd1BhSy9RWjgrZXhlVEprL0hNTTg5QWtxU1liSGJCY2UxWnFiVVIwWlVyVjZLNnVocGZmUEdGV2hadDBFUWJhVzFvYU1EU3BVc0JXQ1BJWXhWR2Q1QVlPYWpnaHVRRXJ2Tmg0MitYNFhrZXp6Ly9QT2JQbisremVoem9YQlRQUHdRdlNSSVdMMTZNWjU1NUptWVdoRnJWdlh2M1l2anc0VmkxYWhYYTJ0cDhoalpFVVZTdElRME1VZkc5OXRwcmFHNXVqa25aRWhVOTNXZ0ora3NPeWc3YytUR1Z4OStvUmFPaTJycDFLNVlzV1FMZzhwN2c5Ti9Pb0wyR3RpdTNkT2xTYk55NDBlZjZuUkUwL1p5MnkrdjFldkhvbzQ5aTlPalIyTGR2WDhCKzNmUjh2ZnRURkFWdGJXM1lzV09ISllJOFZtR2dqbTYwQkJkY1R1ZlNnQ1U3aEJBY1Bud1lQLzNwVHlGSlVzd3FtOVppM252dnZUaDgrSEJZS1NTQ1FUL2YwTkNBc1dQSDRyZS8vVzJucmtjSDZ1bFFCNk9kUExzTkpZN2dHNzJFWmVGU0dXMk9qbVhMbHFrcmtHTTFMcWtkZUc1dGJVVnRiYTNhbGV2TTk5SElxZGZyeFZOUFBZVVJJMFpnOSs3ZGhySlM2MEh2UFQ4L24xazRQMEpadVJDQ1l4Wk9DMDBUOE9tbm4rTFBmLzZ6ei9GWUJBMjBnOHl5TE9QZGQ5L0ZqaDA3T3YxZGdpRGc4T0hEcUttcHdRTVBQSUNXbGhZQXZqTmV3b1huZVZ4enpUVnNNTnlQZ1NHMG95dTRISnVJd2pTN3o3RlVENWhRUy9ia2swK3E2KzVrV1E0NkRFQ2pmOXE4SHRRNjZSMzNoK2IwMEs3eGUreXh4OVJyZDRRMkg0Z3N5M2orK2VjeGF0UW83TjY5VzdWTzlMcEdCRVBMckoxMU1uUG1UT1RsNVRFTDU4ZFZ6dURyL1hRRjF5c2pQZkFnZTZnNGQrNGMzbjc3YmNNVnpML0xxZTBPaHRzZDVUZ09XN2R1eGZIam9hY09VZWkxRHgwNmhPdXZ2eDVMbGl6QmhRc1gxUGZDUmZzWlFnaEtTMHV4ZXZWcU5hakN1RXd2cDQ1K0xxRXJ1SjQ2Z3JQZTluanhoZU00TlZvWTd1Y0FvS0NnQUZPbVRNRXR0OXlDN3QyNys3eG5GRUlJTm0vZWJEanY1cVpObXpCa3lCQjg4TUVINnBoYkpOMUh5cUJCZzFCWFY0ZjgvSHpZYkRiV3BmUkRUejhVWGNGZEdlSURxY3o3Nzc5dnVOSlNuNC9uZVR6OTlOTTRldlFvM256elRmenhqMy9FTjk5OGc2ZWZmdHJuSEtOczNiclZrRkIzN2RxRldiTm13ZVZ5K1ZqVlNNUWhDQUpXckZpQlBYdjJvS0xpOGxiVGJGcVhMejNUSFVIZjAzMVNUSENCY0J5SC9mdjNCd3h5QjRPR3pWOTQ0UVhNbmozYlJ5U0NJR0RldkhuSXljbFI5N2MyQWlFRSsvYnRDL3A5V2hZc1dLRE9nelFpTXUxZ3Q3WVJvQ0lkTW1RSVhucnBKUXdZTUVBOWJ2YUtCcXNpOGp4S0hHazQ1bTRMZUUrM2FTME5vZEJVaFJDQ2I3LzkxckNWSUlSZzFLaFJ1T3V1dTRLZWYvdnR0K082NjY0THF4eU5qWTI2QXRWYTNpKy8vRklkeUFaZ3lJSnFKMklEOEpsWjhzQUREK0Q5OTk5WHMyMnh1Wk1kVXhKRVE3cFByc0F2UXNsb3A3VzFGWUN4Q3NmelBNYU5HeGYwZkZyQmI3NzU1ckI4T1k3ajFDelRldC9KY1J6MjdOa0RRdHAzSGczSFo2TnI4WUQyb1lqS3lrcHMzNzRkcTFhdFFucDZ1cVUyMDdBNkJYYWI3bkhkbXBNZjVPUlV4ais2YUlRZVBkbzNZTmV6Y1BRYVhic2FTejVEenc4MkRLSGQ1b21Xazg2RUNXZHpFNDdqWUxmYnNYanhZdXpidHc4alI0NVV1OURhb1ExR2FMcmE5WTJXcmcrWEgrVGtWSWJqT09UazVLQ3BxY25IRW1qZjExb3ludWVSblowZGRDMGJyYlRGeGNVKzY5RkVVUXc2WDFJUUJLU25wNk80T0REeHFIWlA3WnljSFBYdllOUEJ0SDZvZHFWNno1NDk4ZXFycjJMTW1ERUIzODB3VHRkd0xGeWVYNVl1cXlWOU5RT3YxNHRKa3lZRjljZW9iMGNyc2QxdXg0UUpFd0RvZDhGb0JSOHpaZ3l5c3Rwbkp2QThyNGJ2OWE0dnl6SW1USmdROUgzNlBkZGZmejBjRGtmSXZSYW80S2pZQ0NHWVAzOCs5dTdkRzdaZnlRZ2tMTUg1LzZCc2xLVTk5TDFvMFNLa3BhVUZEVm9BbDhXMVlNRUNwS2VuQjUxSlFoZHVPaHdPTEZxMFNLMzBWQUI2MTA5TFM4UFNwVXQxUlVSbnBmQThENmZUaWRyYTJwQzdoY3F5ckM2OXVlS0tLN0JseXhhc1hidldaeFUzby9QazJRd0tyb3N0c0pmSnNjUUtVQlFGVlZWVlFiZGJvc01BTnBzTm8wZVB4dTkrOTd1UTYrT29oVk1VQlE4OTlCQnV1KzAyMVVvRk8vK0pKNTVBVlZWVlVFRnFmYTBWSzFhZ3VybzY2UDFRMGQ1MTExMzQ3TFBQTUhic1dBREJmVVJHZU9RSENUd0dDRTV2emlUemtTLzdPZmZjY3cvZWZ2dHRWRlpXcWwwMm1qZmY2WFRpL3Z2dlIzMTl2VTh1ZlQzL1IvczV1OTJPMTE5L0hjdVhMMGRtWnFhYXdZdWVjK1dWVjJMRGhnMllOMjllMEM0aURXYlFseWlLMkxwMUt4NTg4RUhZN1hiVnlsS0wyNnRYTDJ6Y3VCRXZ2dmdpbkU2bk9sZVM3cEhIaUl4Z1hjcUFKeXZyOUVDWTNpNTMyUVJCd0kwMzNvZ2JicmdCSDMzMEVmYnYzdytYeTRXS2lncU1IajBhaFlXRm5ZcmlpYUtJMy96bU41Zy9mejYyYmR1R2hvWUdwS2VubzZxcUNqVTFOZW81UmplVnA5M1RSeDk5VkIxSE8zRGdBQndPQjY2KyttcGNlKzIxUG9FV1JuUUpRM0E2Rmk3NjVVbEkvQ043TlRVMXFLbXBDZGgxbFFvekhHakY3OUtsQzZaTm02WTdvMFhyNXhtQmxpTXZMdyszM25wcmdMQlllRDkyZERYcXc2WDZNcHhRK00vR29BTHd6NmJjbVlyc24xS2NkbUdwNkdnVWxPWWhNWEk5UVJCOFp2TnJsOWJRc2theUhvNFJITVBqY0Y1Q29DQ01yVkZUaEk1bWwwUnFMZnlYN2dDWHg3NzhmU29qRm82ZVk5TnBhZGs4eU5oajUvWHJnMjR0OHJBb0ZZTVJFUjVGdjlmQUJNZGd4SUMySUJvS0lqaldwMmN3SWlHWTBXSVdqc0dJQVdGWk9MZk1CTWRnUkVKcmtFaXlydUIrQ0xIN0I0UEI2SmdmdkpMdWNWM0JuZTFnMjFRR2d4R2FNeDZQN25FbU9BWWpCZ1RiNnp1STRQVFZ5V0F3akhHbUxRd0xkNGI1Y0F4R1JKd094OElkYTNYSHREQU1SckxUR0VSRHVndWZEcmUweHJRd2lRamR1WWF1RE5BdTl2UmZMWkNzYUNjNWE1OEZ3RkxuK1hNb2lJYVk0QXhDaGFWZGtTMUpFbmJ1M0luRGh3OG52ZUJvZzVPYm00dWFtaG80blU1MVJVT3kzM3RuT09ScTBUMnVLN2hETGU2QUI1bnFENVphTTU3bklVa1NObXpZZ0YvODRoYzRjZUtFdWd3bW1hRVduUkFDaDhPQisrNjdEdzgvL0RBeU1qTFk4aDQvWkVKd0lweWdpVXdJanZ0OUlKWEZCbHhlNnlaSkVsYXVYSW5aczJlck85blFiWitTK1VVdEhDRUVicmNiYTlldXhZUUpFOURjM013RTU4ZkJJTllOQUhpNG1xSDNPbkRoWWh5TGFIMW9nN050MnpZOC92ampQbnVycFVyU0hicndsZloyZHU3Y2lXWExscVY4WSt6UGdmTVhkVFVGVnpONG5Eb0p2ZGNYeC9YVGFhY3FkSUhvOHVYTHpTNktKYUNOelByMTY5SFkyR2h5YWF6RjU4ZU82Mm9LcDA1Q0pQZi9IN1BMbHhBUVFuRDI3Rm5zM3IzYjdLSllBaHFsbEdVWjI3WnR3NXc1Yzh3dWttWDQ5Y2hoK1BYSVlicnZzVmh1R0RRME5PaW1MRWhGdENraGpoNDlhbkpwRWdjbXVEQndPcDJRSkltTk9RRnFRaU9hTzVOaERGWnp3cUJ2Mzc2d3M0MU9BUGdPRXd3ZE90VHM0aVFNVEhBR1VSUUZkcnNkTTJmT05Mc29sb0NLcmFpb0tHQ25IVVp3bU9BTVF0T2FMMSsrSEYyNmRERzdPS1pEL2Jkbm4zMFdEZ2ZiTWRjb1RIQmhvQ2dLaW91TDhkWmJiNkdrcEVUTjd5aUtZa0J1LzJSN1VYOU5PM2R5N2RxMW1EcDFLaHY0RGdNbU9JTm9kOGVwcnE3R25qMTdzR1RKRW5XWDAyU0hqcnRsWldWaCt2VHArT1NUVDNEZmZmZXBNMUFZeG1EaEpZUDRwemN2TEN6RVk0ODlobFdyVnFWTUZtTnF5ZWk4VXJwSkpMTnd4bUdDQ3dQL3ZRVzBZMUhKanZiZXRmdllwZEl6aUFaTWNBWUp0VTkzS3VCL3I2bDA3OUdFK1hBTVJoeGhnbU13NGdnVEhJTVJSNUpHY0lRUWRVNmZFZitDYm16SU5pU01EM1JZd2VpV3ljbEtVZ21PVHFnMUlqaTZoaXZWSzBDODREaE8zWTIxb2FIQjdPS1lSdElJanM2R01Mb0NlOGVPSFRoMTZwVDZXVVpza1dVWmdpQ0E0emo4N1c5L003czRwcEUwZ3N2T3psYVh6aGdSVUd0cksrYk5tOGNzWEp5Z2t3UCs4WTkvNExYWFhqTzVOT2FSTklJcktDaFFsNHdZNVoxMzNzR01HVFBVN280c3l6NmIwRE02RDEwTlRsOGN4K0dqano3Q2xDbFQ0RFdRMlZzN2YxTVFCR1JrWkFCQXd2ODJTU080UVlNR2hmVmpVRXU0YWRNbTNINzc3WkFrU2JXTWNwQzl2UmpHb1ltRzZML2J0Mi9IcEVtVDRISzVERitEZmw0UUJQVHQyOWNuQVcraWtqU0NtekJoUXNDTTlsRFFIMDBRQkd6YXRBbDMzbmtudkY2djRjOHpRa1BGQWdBN2QrN0VsQ2xUY1BIaXhiQ21nbEd4VmxkWHcrbDBxdDMvUlA1OWtrWndZOGVPUldGaG9lRzA0OW9XV0ZFVWJOeTRFYk5teldLejM2TUVmYjY3ZHUzQ2pUZmVpS2FtSnAvQVZrZG9CVHQ3OW16MU4wbjRsSVFrU2ZCNnZlUzU1NTRqQUlnZ0NFUVFCTUp4SE9FNGpnaUNRQUNFZkhFY1IzaWVKN2ZjY2d1UlpabDR2VjRpU1JMeGVyMUVVUlN6YjgveXlMSk1KRWxTWDRxaWtPM2J0NVBNekV4RHo5Ly94Zk04RVFTQmxKZVhFNC9IWS9idFJZMmtzWEE4ejJQdTNMa1lOV3FVejJDMlVXdkZmTHJJSUZIdzJmeXgyV3hZdjM1OVVpMS9TaHJCMFI5NjQ4YU5LQ29xQW5CNUtZbVJiZ2hoUGwxRVJNTm4wMElJd2VPUFA0NGYvZWhIQ1Iwa0NjQTAyeHBsRkVWUnU0SDc5KzhuSlNVbFJCUkZ3bkdjb1M0TXgzRkVGRVcxSzhyelBMbjExbHVKeCtNaHNpeWJmWHVXUjVJa0lzc3krZkRERDRuVDZTUTh6eE9lNTRrb2lvVG4rYkM3bE92V3JWT3ZLVW1TMmJjWE5aSkdjUDU4L3ZubnBMaTRPS28rbmRmckpiSXNFMFZSVXY1RnhhQTlGb25QUnA4M3ovTmszYnAxWmxlZm1KRTBYVXAvK3ZmdmoyM2J0cUdrcE1Sbk5rbG5mVHJ0Uk9lRWo1UkZBVzNFa1JBU3NjOUdyN1ZtelJvc1dMQWd5cVcxRGtrck9BRG8zYnMzdG16Wmd1TGlZZ0NSK1hSMHlJQWsrRGhRdEtDTkR5RUU5ZlgxVWZIWjFxMWJod1VMRmlTWHorWUhSNUwwN3JSYkJCODRjQURqeDQvSHlaTW5EU2U5NFM2bHdLTVdqZWQ1bEpXVjRlNjc3MGIzN3QzamNBZldobHphSjY2K3ZoNmJObTFTbjJrNEU4aTFVTEVCeVowckpta0Y1ODhYWDN5QjhlUEhxenVXQXBjSFVlbmFPRWI4MElwcXpabzFXTGh3b2NrbGlnOUozYVhVRXFsUHg0Z3VxZUt6K1pNeWdnTWk4K2tZMFNWVmZEWi9Va1p3NUZMeTB0NjllNk91cmc3RnhjVStVVFpHZk5GYXRsVGEvaXRsZkRoL21FOFhYMUxWWi9NbmRab1dQNWhQRjE5UzFXZnpKMlVGQnpDZkxwNmtxcy9tVDhvS2p2bDA4U1ZWZlRaL1V0YUg4MmYvL3YwWU4yNGNUcDQ4cWZwd2RBWThlMFFkUTFNZjBFYUwvc3R4SE5hdVhZdmEybHF6aTJnSlVyZXA4YU5mdjM3WXZuMDcrdmZ2RCtCeW5zdGtudlVRYmJRYk9BTHQ2OW1lZmZaWi9Qem5QemU1Wk5hQkNlNFNraVNodkx3Y0gzNzRJV3ByYTJHejJkUUp1a3h3eHFDWnVnZ2hxS3FxUW4xOVBlYk9uWnZTWFVoL1dKZnlFdHBjSm9RUUhEdDJESys4OGdvMmI5Nk0vZnYzczJHQ0RoQUVBVjI2ZE1INDhlTXhmZnAwVEpnd3dXZFJhakt0Mm80RUpyZ2dhSWNKWEM2WG1xV1pvWS9ENFVDM2J0MThka2RsQk1JRUZ3VHF2OUVLeEFpTnRocXhaeFljSnJnZytGY2cxbUtIUnR0OVpNOHFPS3daNmdBbU5tUDQrOEFNZlppRll6RGlDTE53REVZY1lZSmpNT0lJRXh5REVVZVk0QmlNT01JRXgyREVFU1k0QmlPT01NRXhHSEdFQ1k3QmlDTk1jQXhHSEdHQ1l6RGlDQk1jZ3hGSG1PQVlqRGpDQk1kZ3hCRnh4eWQ3ekM1RFVFUlJRTCtLM3NqS2RKcGRGRVlDY1BMMEdSdzhkTVRzWW9TRSs5ZVhEWlplbnNNQktDdnRqdHpzTExPTHdyQW9oQURIVDUzQzZiTS9tRjJVRGhHZHpreXp5OUFocDMrNENJVVE1T1ZrbTEwVWhzVlFGQVhIVDU5RHE5dUxSS2pMWWxwYW10bGxNRVJ6cXdjS2FVTFhuRXkyQXBzQkFKQmsrVkpqRENSS1BlYU9uZjdCMGwxS2YyeWlnTHhzSjRRZ1NXcFlTb1RVb00wcjRkeEZWOEtsY3hBVHJYSktzb0l6NTV1UmwrMkVUUXpNZFpobzk4TUlINWU3RFJkZGJnQ0o5M3NuNUxDQVFnak9YblRCMWRwbWRsRVljWVFRZ3ZQTnJhcllFaEhSN0FKMEZrSUlMcmE0NGZaS3lNMU1EOXJGWkNRSGJSNHZMcmpja0JOOEs3R0VyNlVlcjRUVDU1dmhjak5ybDR3b2hPQ0NxeFhubWxvU1hteEFBbHM0TFlRUVhIUzUwZHJtUlc1bUJrUWg0ZHNSQmdDM3g0c0x6YTFRRWl3d0VvcWtxcGxlU2NhWkMwMW9acjVkUXFNb0JPZWJXL0JEVTB0U2lRMUlFZ3VuaFJDZ3FjVU50OGVMSEdlNmJpU1RZVjFhMmp4b2NybVRUbWlVcEJNY3BkM2FOU1BEWVVkV3VnTThuMWpoNDFURDQ1VndzY1VOcjVUYzI0SWxyZUFvTFc0UFd0dTh5RXhQZzlPUmhnUWJ0a2w2WkVWQlUwdTcvNTBLSkwzZ2dQYWdTbE9MR3kxdEhtU2xPNUNlWmpPN1NDa1BJUVROclcwcDUyK25oT0Fvc3F6Z2ZITUxYSzBDc3AwTzJHMHBkZnVXZ0FCb3VTUzBaUFhUUXBHU05jNHJ5emg3MFFXSDNZYXNEQWNiUm9nVGJvOFhUUzF1U0hMaWo2ZDFscFFVSE1YdDhjTHQ4U0xOTGlJanpRNkhuWFUxb3cwaEJDNjNCeTF1VDFJTVhFZEtTZ3VPMHVhUjBPYVJJQW84TWh4MlpLVFpFMjVTck5XUVpCbXVTd0dyUkp2UkgwdTQ0MmZPczZmaEJ3ZkFrV2FEdzI1alZpOE1GSVdndGMyRFZvODM2Y1A3bllWWk9CMElnTlkyTDFyYnZPQTVEaG1POXU0bUcwUVBoQkRBN2ZIQTdaSGc5cVJHYUQ4U21PQTZRTkdFcjBXQmg4TnVRMGFhSFVLS0IxcmF2TzBDWTEzRzhHQmR5azVpdDRsSXM0bHcyRVdJUW1wWXZqYVBoRGF2aEZhUEZ3b0xnSFFLWnVFNmljY3J3ZU9WME5RQ0NKY3NYNXBOaEYwVWtpYmdJc2tLUEpLa0NvMVpzc2hoZ29zQ3NxekExZHFtcmtBWEJSNDJVWUFvQ0xDSjdTL2U0aUtVWkJsZVNZWWtLL0JLTWp5U3pBUVdBNWpnWW9Ba0s1Y0dkeThIRVFTZWl2Q3lHTTBZY0NlRXdDc3JrRFRpOHNwTVhQR0NDUzVPeUlvQzJSUG85NGdDRDFFUUlBZzhlSTREeDdVbnh1SEErZjVmOHplMWxnb2hJT3BMLy85QWV3TWd5d29rUllhaU1HR1pDUk9jeVZ5MmhveFVJTFZqMnd4R25HR0NZekRpQ0JNY2d4RkhtT0FZakRqeS93SC9WRjBBT2hlTFFRQUFBQUJKUlU1RXJrSmdnZz09XCIgc3R5bGU9XCJtYXgtd2lkdGg6ODAwcHg7XCI+XHgzYy9hPiIsImVOclZ6a0Zxd3pBUWhlR3JpT3lsQ2FUVXRDUTVRSmIxQWNwWUdjV1NaWTA5STl2TjdadEFhYy9RNWMvamcvZEJlSTNsWmk2NFl1c2xUdFVFNGRHRW1Na2MwZlJDNGJSNzFqc0FsUGdGV2xrSVhyWWh6dzNHZWZWRm03RU1hODZicENhbHFLRUxhcWQ3N2JrYzNLc1Y3cmdHd1pFMmxzRXFaU3B4R2RVTFVkR2VxOXE5ZTNNSHlMR0RYd1lhSzlrSi9ZQTNVbWgvVlB1blFFaDVFZjlZTzM1MEZadyswN3lRM0YzUzNmay92VDBDbnQwM3FnYVZEUT09IiwiZU5xdFV6MXYyekFRM2YwcnJoa2lLZ2dvQmRsaWVDaUNMRm1Tb2kwNkJJRkJVeWVaaWtRcTVDbVdVT2kvbC9wd0k3dHV1cFNMZE1kMzk5NTk4SzVCV1pQU0dYeDJyWlpiYTdTcEhkeUxOL0ZWV2xYUnpZS2x0WmFrakFZbVJWRnNoSHdKNGVjQy9Ia1RGcFRPVWRLNlZNNzVOT3Y4dFViYlhzSk9LRnFueHE0M3hwQWpLNm9LaytsMk9RU2ZESVFWdk5QdGFRWjBDb3phQ2swS082VVRzK1A1bHlIZzAyb0Z3VDRtbUlmc0ZicWhFSjk1Q2t5TXJFdlV4S1ZGUVhoWFlHK3hZTVFGNGZJZ3cramx6a3FmSVlnaWtZdUdaOFprQllwS09TNU5PZmlpUW0xY05GWVJYZk5yZmpVWnZGU2E1eTQ0VEh1c1pXT1NsdmROMHNudFZoVUpHM2xuWXJyaHJ4c2RIN1gzZi9kd3dqcWtiNnBFVXhQN2lQMFNydUk0bnVzR0xCd2U1UnlKT1RhVmZUcTdPWHZtU2hwTlFtbm4xYzh1cHhrOU9xd1RNOXRFWWJOam1mMnhTTFhWcy9MUkQvY1VjQVllMlVZa0oyeUkrWS81N2t1eXQ4S2h0M3o5MkR5a1BlbmhUUWpuR1MxWEVDLy9JT2dPWGQzUlZ1MWZFaU5iNDkrR2ZQS0ZzUERmRzlCanVwQU5PQzk2MkREM0ZEOURkUEdiR1M2aWhZZjlVTFQxSXdXaDIzY28vd1hGRGtRNyIsImVOclZqMUZPd3pBUVJLOWk5ZDllcENJaVVPa0IrQ1FIUUJ1elRqWnh2T211azVUYjAwb0l6c0RmUEkyZU5QTk8rTW1sZDIrNFlSdVZsK3FTeXV3U1ozSW5kSU5TZWozYzZRVUFDbC9CcWlqQjR6N2xTNE44MldLeFppN1Rsdk91WXpPT2JLbEw1cGV2T2tnNWhpZXYwa2xOaWpQdG9wTTN5bFI0blMwcVViRkJxdm1IOEJ5T2tMbURYdzJNSy9rRjQ0UTlHYlEvVnZ0bmdaTEpxdkhXOWxRL09sbkwvY290WE1Ob2gvTi9XbnNDUElkdmRreVVqUT09IiwiZU5xbFZFMXYyekFNdmVkWDhERE1kdXlrYVk4TmNtaUJBc09BQVN0MjJDRUlCczJSYlcyS0ZNaHkwcUROZjU5a2ZWaDI0MlhBZFBBSDlmaElQbEY4ZXNGNUl3a3I0YUUrc2J3U25QR21ocy9vZ0w3bGd1emwvU1F1R3BaTHdobkVOYVk0bDF6VUdlU0M3My9za0NnSlV6K0kwcDhvLzUzQTZ3VFVPaUFCSklNUFV1MWptUUV2aWxxL0tTNGtySUExbEdZZytkNS9IOGxXVnU2dnBkQ3J3cVNzbk1PeU5SZGNRRXlVYWJFRUFoK3BYSUpQYWs0eEsyV2xOdExVWmFLWFRVTTUvWHB1c0RoMVphekpKbGw2SENrZ3RsaExCYXVWaWhSeTZTV3diQVR6UmNmcmtDOGtQUHN2STRES3dQRWJRenlJYnZSWm1ZTGg3YzNwWWkzRFJKeHFuclNSV0h6WHhwRDRESmpXZU1UMUM1TFZmSWRlNHQ2dVhtMHVxUUc2RTV4YjQ2V0FQWUlFWnBhYXNMYXFIc05GaVhUOWJVc0U1YnNHR0tuZjkwY3ZuMCt0OWFvQzNubGNBcDFPYW9HK0FHTzhHSEZjQXVVVUVvd0swR3VBWWJuMjlnUkNYaW5ST3Z6blFRelRNUGUySytaS0VnYit6MHFZWjNlMy9Pa3M3UGlZaGFNbjZZWkZDTlF4LzQ1VG1Sd0oyL0pqME1OdURLV2hKMHpoTG5rM2t0NUI5TFUvSjZhRmxMSFpZU2JyOVdLVHdjMjBtMUF3dlJrZ2JnMml4emJFM0cyZ3hWaE5ORUJGZXp4QlUrdkI3WUgzazJnZHpiOEtYaENLSHc1SXRlaU03RkNKbzAwRWlHMGh1bDFFZndEUzM2MHIiLCIqQ2xvc2UgQWxsIEJyb3dzZXJzIiwiKjxwPkNsb3NlcyBhbGwgb3BlbiBicm93c2VycyBhbmQgcmVzZXRzIHRoZSBicm93c2VyIGNhY2hlLlx4M2MvcD4iXSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN0YXRzIl0gPSBbW3siZWxhcHNlZCI6IjAwOjAwOjA1IiwiZmFpbCI6MCwibGFiZWwiOiJDcml0aWNhbCBUZXN0cyIsInBhc3MiOjF9LHsiZWxhcHNlZCI6IjAwOjAwOjA1IiwiZmFpbCI6MCwibGFiZWwiOiJBbGwgVGVzdHMiLCJwYXNzIjoxfV0sW10sW3siZWxhcHNlZCI6IjAwOjAwOjA2IiwiZmFpbCI6MCwiaWQiOiJzMSIsImxhYmVsIjoiSnVweXRlciIsIm5hbWUiOiJKdXB5dGVyIiwicGFzcyI6MX1dXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiZXJyb3JzIl0gPSBbXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiYmFzZU1pbGxpcyJdID0gMTU0NjY2ODc3MjQ1NTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiZ2VuZXJhdGVkIl0gPSA1NTYwOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuc2V0dGluZ3MgPSB7ImRlZmF1bHRMZXZlbCI6IlRSQUNFIiwibWluTGV2ZWwiOiJJTkZPIiwicmVwb3J0VVJMIjpudWxsLCJycGEiOmZhbHNlLCJzcGxpdExvZ0Jhc2UiOiJsb2ciLCJ0aXRsZSI6IiJ9Owo8L3NjcmlwdD4KPHRpdGxlPjwvdGl0bGU+CjwvaGVhZD4KPGJvZHk+CjxkaXYgaWQ9ImphdmFzY3JpcHQtZGlzYWJsZWQiPgogIDxoMT5PcGVuaW5nIFJvYm90IEZyYW1ld29yayBsb2cgZmFpbGVkPC9oMT4KICA8dWw+CiAgICA8bGk+VmVyaWZ5IHRoYXQgeW91IGhhdmUgPGI+SmF2YVNjcmlwdCBlbmFibGVkPC9iPiBpbiB5b3VyIGJyb3dzZXIuPC9saT4KICAgIDxsaT5NYWtlIHN1cmUgeW91IGFyZSB1c2luZyBhIDxiPm1vZGVybiBlbm91Z2ggYnJvd3NlcjwvYj4uIElmIHVzaW5nIEludGVybmV0IEV4cGxvcmVyLCB2ZXJzaW9uIDggb3IgbmV3ZXIgaXMgcmVxdWlyZWQuPC9saT4KICAgIDxsaT5DaGVjayBhcmUgdGhlcmUgbWVzc2FnZXMgaW4geW91ciBicm93c2VyJ3MgPGI+SmF2YVNjcmlwdCBlcnJvciBsb2c8L2I+LiBQbGVhc2UgcmVwb3J0IHRoZSBwcm9ibGVtIGlmIHlvdSBzdXNwZWN0IHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnLjwvbGk+CiAgPC91bD4KPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5yZW1vdmVKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKCk7PC9zY3JpcHQ+Cgo8ZGl2IGlkPSJoZWFkZXIiPjwvZGl2Pgo8ZGl2IGlkPSJzdGF0aXN0aWNzLWNvbnRhaW5lciI+PC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgICB2YXIgdG9wc3VpdGUgPSB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgYWRkSmF2YVNjcmlwdERpc2FibGVkV2FybmluZyhlcnJvcik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW5pdExheW91dCh0b3BzdWl0ZS5uYW1lLCAnTG9nJyk7CiAgICBhZGRTdGF0aXN0aWNzKCk7CiAgICBhZGRFcnJvcnMoKTsKICAgIGFkZEV4ZWN1dGlvbkxvZyh0b3BzdWl0ZSk7CiAgICBhZGRMb2dMZXZlbFNlbGVjdG9yKHdpbmRvdy5zZXR0aW5nc1snbWluTGV2ZWwnXSwgd2luZG93LnNldHRpbmdzWydkZWZhdWx0TGV2ZWwnXSk7CiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpIHsKICAgICAgICBtYWtlRWxlbWVudFZpc2libGUod2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZXhwYW5kU3VpdGUodG9wc3VpdGUpOwogICAgfQp9KTsKCmZ1bmN0aW9uIGFkZExvZ0xldmVsU2VsZWN0b3IobWluTGV2ZWwsIGRlZmF1bHRMZXZlbCkgewogICAgdmFyIGNvbnRyb2xsZXIgPSBMb2dMZXZlbENvbnRyb2xsZXIobWluTGV2ZWwsIGRlZmF1bHRMZXZlbCk7CiAgICBpZiAoY29udHJvbGxlci5zaG93TG9nTGV2ZWxTZWxlY3RvcigpKSB7CiAgICAgICAgdmFyIHNlbGVjdG9yID0gJC50bXBsKCdsb2dMZXZlbFNlbGVjdG9yVGVtcGxhdGUnLCBjb250cm9sbGVyKTsKICAgICAgICBzZWxlY3Rvci5maW5kKCdzZWxlY3QnKS52YWwoY29udHJvbGxlci5kZWZhdWx0TG9nTGV2ZWwoKSk7CiAgICAgICAgc2VsZWN0b3IuYXBwZW5kVG8oJCgnI3RvcC1yaWdodC1oZWFkZXInKSk7CiAgICAgICAgJCgnI3JlcG9ydC1vci1sb2ctbGluaycpLmZpbmQoJ2EnKS5jc3Moeydib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzJzogJzAnfSk7CiAgICAgICAgc2V0TWVzc2FnZVZpc2liaWxpdHkoY29udHJvbGxlci5kZWZhdWx0TG9nTGV2ZWwoKSk7CiAgICB9Cn0KCmZ1bmN0aW9uIGFkZEVycm9ycygpIHsKICAgIHZhciBlcnJvcnMgPSB3aW5kb3cudGVzdGRhdGEuZXJyb3JJdGVyYXRvcigpOwogICAgaWYgKGVycm9ycy5oYXNOZXh0KCkpIHsKICAgICAgICAkLnRtcGwoJ2Vycm9ySGVhZGVyVGVtcGxhdGUnKS5hcHBlbmRUbygkKCdib2R5JykpOwogICAgICAgIGRyYXdFcnJvcnNSZWN1cnNpdmVseShlcnJvcnMsICQoJyNlcnJvcnMnKSk7CiAgICB9Cn0KCmZ1bmN0aW9uIGRyYXdFcnJvcnNSZWN1cnNpdmVseShlcnJvcnMsIHRhcmdldCkgewogICAgdmFyIGVsZW1lbnRzID0gcG9wRnJvbUl0ZXJhdG9yKGVycm9ycywgMTApOwogICAgJC50bXBsKCdlcnJvclRlbXBsYXRlJywgZWxlbWVudHMpLmFwcGVuZFRvKHRhcmdldCk7CiAgICBpZiAoZXJyb3JzLmhhc05leHQoKSkKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgZHJhd0Vycm9yc1JlY3Vyc2l2ZWx5KGVycm9ycywgdGFyZ2V0KTsgfSwgMCk7CiAgICBlbHNlIHsKICAgICAgICAvLyBFcnJvcnMgbWF5IGhhdmUgbW92ZWQgc2Nyb2xsIHBvc2l0aW9uLiBSZXNldHRpbmcgbG9jYXRpb24gcmUtc2Nyb2xscy4KICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpCiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHdpbmRvdy5sb2NhdGlvbi5oYXNoKTsKICAgICAgICBoaWdobGlnaHRMaW5rVGFyZ2V0KCk7CiAgICB9Cn0KCmZ1bmN0aW9uIGhpZ2hsaWdodExpbmtUYXJnZXQoKSB7CiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpIHsKICAgICAgICB2YXIgdGFyZ2V0ID0gJCh3aW5kb3cubG9jYXRpb24uaGFzaCk7CiAgICAgICAgaGlnaGxpZ2h0KHRhcmdldCk7CiAgICB9Cn0KCmZ1bmN0aW9uIGhpZ2hsaWdodChlbGVtZW50LCBjb2xvcikgewogICAgaWYgKGNvbG9yID09PSB1bmRlZmluZWQpCiAgICAgICAgY29sb3IgPSAyNDI7CiAgICBpZiAoY29sb3IgPCAyNTUpIHsKICAgICAgICBlbGVtZW50LmNzcyh7J2JhY2tncm91bmQtY29sb3InOiAncmdiKCcrY29sb3IrJywnK2NvbG9yKycsJytjb2xvcisnKSd9KTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgaGlnaGxpZ2h0KGVsZW1lbnQsIGNvbG9yKzEpOyB9LCAzMDApOwogICAgfSBlbHNlIHsKICAgICAgICBlbGVtZW50LmNzcyh7J2JhY2tncm91bmQtY29sb3InOiAnJ30pOwogICAgfQp9CgpmdW5jdGlvbiBwb3BGcm9tSXRlcmF0b3IoaXRlcmF0b3IsIHVwVG8pIHsKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkgPiAwICYmIHJlc3VsdC5sZW5ndGggPCB1cFRvKQogICAgICAgIHJlc3VsdC5wdXNoKGl0ZXJhdG9yLm5leHQoKSk7CiAgICByZXR1cm4gcmVzdWx0Owp9CgpmdW5jdGlvbiBtYWtlRWxlbWVudFZpc2libGUoaWQpIHsKICAgIHdpbmRvdy50ZXN0ZGF0YS5lbnN1cmVMb2FkZWQoaWQsIGZ1bmN0aW9uIChpZHMpIHsKICAgICAgICB1dGlsLm1hcChpZHMsIGV4cGFuZEVsZW1lbnRXaXRoSWQpOwogICAgICAgIGlmIChpZHMubGVuZ3RoKSB7CiAgICAgICAgICAgIGV4cGFuZENyaXRpY2FsRmFpbGVkKHdpbmRvdy50ZXN0ZGF0YS5maW5kTG9hZGVkKHV0aWwubGFzdChpZHMpKSk7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyc7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gaWQ7CiAgICAgICAgICAgIGhpZ2hsaWdodExpbmtUYXJnZXQoKTsKICAgICAgICB9CiAgICB9KTsKfQoKZnVuY3Rpb24gYWRkRXhlY3V0aW9uTG9nKG1haW4pIHsKICAgICQoJ2JvZHknKS5hcHBlbmQoJCh0ZXN0T3JUYXNrKCc8aDI+e1Rlc3R9IEV4ZWN1dGlvbiBMb2c8L2gyPicpKSwKICAgICAgICAgICAgICAgICAgICAgJC50bXBsKCdzdWl0ZVRlbXBsYXRlJywgbWFpbikpOwp9Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0b3RhbFN0YXRpc3RpY3NSb3dUZW1wbGF0ZSI+CiAgPHRyIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPHNwYW4+e3todG1sIGxhYmVsfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC90ZD4KICAgIHt7dG1wbCgkZGF0YSkgJ3N0YXRDb2x1bW5zVGVtcGxhdGUnfX0KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idGFnU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgY2xhc3M9InJvdy0keyRpdGVtLmluZGV4fSI+CiAgICA8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIiB0aXRsZT0ie3todG1sIGRvY319Ij4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8c3Bhbj57e2h0bWwgbGFiZWx9fTwvc3Bhbj4KICAgICAgICB7e2lmIGluZm99fSgke2luZm99KXt7L2lmfX0KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InRhZy1saW5rcyI+CiAgICAgICAge3tlYWNoIGxpbmtzfX0KICAgICAgICA8c3Bhbj5bPGEgaHJlZj0ie3todG1sICR2YWx1ZS51cmx9fSIgdGl0bGU9Int7aHRtbCAkdmFsdWUudXJsfX0iPnt7aHRtbCAkdmFsdWUudGl0bGV9fTwvYT5dPC9zcGFuPgogICAgICAgIHt7L2VhY2h9fQogICAgICA8L2Rpdj4KICAgIDwvdGQ+CiAgICB7e3RtcGwoJGRhdGEpICdzdGF0Q29sdW1uc1RlbXBsYXRlJ319CiAgPC90cj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1aXRlU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgb25jbGljaz0ibWFrZUVsZW1lbnRWaXNpYmxlKCcke2lkfScpIiBjbGFzcz0icm93LSR7JGl0ZW0uaW5kZXh9Ij4KICAgIDx0ZCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiIHRpdGxlPSJ7e2h0bWwgbGFiZWx9fSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPGEgaHJlZj0iIyR7aWR9Ij48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBmb3JtYXRQYXJlbnROYW1lfX08L3NwYW4+e3todG1sIG5hbWV9fTwvYT4KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJlcnJvckhlYWRlclRlbXBsYXRlIj4KICA8aDI+e3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX0gRXhlY3V0aW9uIEVycm9yczwvaDI+CiAgPHRhYmxlIGlkPSJlcnJvcnMiPjwvdGFibGU+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJlcnJvclRlbXBsYXRlIj4KICA8dHIgaWQ9IiR7aWR9IiBjbGFzcz0ibWVzc2FnZS1yb3ciPgogICAgPHRkIGNsYXNzPSJlcnJvci10aW1lIj4KICAgICAge3tpZiBsaW5rfX0KICAgICAgPGEgb25jbGljaz0ibWFrZUVsZW1lbnRWaXNpYmxlKCcke2xpbmt9JykiIGhyZWY9IiMke2xpbmt9IiB0aXRsZT0iTGluayB0byBkZXRhaWxzIj4ke2RhdGV9ICR7dGltZX08L2E+CiAgICAgIHt7ZWxzZX19CiAgICAgICR7ZGF0ZX0gJHt0aW1lfQogICAgICB7ey9pZn19CiAgICA8L3RkPgogICAgPHRkIGNsYXNzPSIke2xldmVsLnRvTG93ZXJDYXNlKCl9IGxldmVsIj48c3BhbiBjbGFzcz0ibGFiZWwgJHtsZXZlbC50b0xvd2VyQ2FzZSgpfSI+JHtsZXZlbH08L3NwYW4+PC90ZD4KICAgIDx0ZCBjbGFzcz0ibWVzc2FnZSI+e3todG1sIHRleHR9fTwvdGQ+CiAgICA8dGQgY2xhc3M9InNlbGVjdC1tZXNzYWdlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OnNlbGVjdE1lc3NhZ2UoJyR7aWR9JykiIHRpdGxlPSJTZWxlY3QgbWVzc2FnZSB0ZXh0Ij4KICAgICAgPGRpdj48L2Rpdj4KICAgIDwvdGQ+CiAgPC90cj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1aXRlVGVtcGxhdGUiPgogIDxkaXYgaWQ9IiR7aWR9IiBjbGFzcz0ic3VpdGUiPgogICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXIgY2xvc2VkIiBvbmNsaWNrPSJ0b2dnbGVTdWl0ZSgnJHtpZH0nKSI+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLWxlZnQiIHRpdGxlPSJ7e2h0bWwgZnVsbE5hbWV9fSI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImVsYXBzZWQiIHRpdGxlPSJFbGFwc2VkIHRpbWUiPiR7dGltZXMuZWxhcHNlZFRpbWV9PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJsYWJlbCAke3N0YXR1cy50b0xvd2VyQ2FzZSgpfSI+U1VJVEU8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPnt7aHRtbCBuYW1lfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1yaWdodCIgb25jbGljaz0ic3RvcFByb3BhZ2F0aW9uKGV2ZW50KSIgdGl0bGU9IiI+CiAgICAgICAgPGEgY2xhc3M9ImV4cGFuZCIgdGl0bGU9IkV4cGFuZCBhbGwiIGhyZWY9ImphdmFzY3JpcHQ6ZXhwYW5kQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImNvbGxhcHNlIiB0aXRsZT0iQ29sbGFwc2UgYWxsIiBocmVmPSJqYXZhc2NyaXB0OmNvbGxhcHNlQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImxpbmsiIHRpdGxlPSJMaW5rIHRvIHRoaXMgc3VpdGUiIGhyZWY9IiMke2lkfSIgb25jbGljaz0ibWFrZUVsZW1lbnRWaXNpYmxlKCcke2lkfScpIj48L2E+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci10b2dnbGUiIHRpdGxlPSJUb2dnbGUgdmlzaWJpbGl0eSI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNoaWxkcmVuIj4KICAgICAgPHRhYmxlIGNsYXNzPSJtZXRhZGF0YSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPkZ1bGwgTmFtZTo8L3RoPgogICAgICAgICAgPHRkPnt7aHRtbCBmdWxsTmFtZX19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7aWYgZG9jKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sIGRvYygpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIHt7ZWFjaCBtZXRhZGF0YX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPnt7aHRtbCAkdmFsdWVbMF19fTo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCAkdmFsdWVbMV19fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9lYWNofX0KICAgICAgICB7e2lmIHNvdXJjZX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlNvdXJjZTo8L3RoPgogICAgICAgICAge3tpZiByZWxhdGl2ZVNvdXJjZX19CiAgICAgICAgICA8dGQ+PGEgaHJlZj0iJHtyZWxhdGl2ZVNvdXJjZX0iPnt7aHRtbCBzb3VyY2V9fTwvYT48L3RkPgogICAgICAgICAge3tlbHNlfX0KICAgICAgICAgIDx0ZD57e2h0bWwgc291cmNlfX08L3RkPgogICAgICAgICAge3svaWZ9fQogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5TdGFydCAvIEVuZCAvIEVsYXBzZWQ6PC90aD4KICAgICAgICAgIDx0ZD4ke3RpbWVzLnN0YXJ0VGltZX0gLyAke3RpbWVzLmVuZFRpbWV9IC8gJHt0aW1lcy5lbGFwc2VkVGltZX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlN0YXR1czo8L3RoPgogICAgICAgICAgPHRkPnt7dG1wbCgkZGF0YSkgJ3N1aXRlU3RhdHVzTWVzc2FnZVRlbXBsYXRlJ319PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7aWYgbWVzc2FnZSgpfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+TWVzc2FnZTo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJtZXNzYWdlIj57e2h0bWwgbWVzc2FnZSgpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0ZXN0VGVtcGxhdGUiPgogIDxkaXYgaWQ9IiR7aWR9IiBjbGFzcz0idGVzdCI+CiAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlciBjbG9zZWQiIG9uY2xpY2s9InRvZ2dsZVRlc3QoJyR7aWR9JykiPgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1sZWZ0IiB0aXRsZT0ie3todG1sIGZ1bGxOYW1lfX0iPgogICAgICAgIDxzcGFuIGNsYXNzPSJlbGFwc2VkIiB0aXRsZT0iRWxhcHNlZCB0aW1lIj4ke3RpbWVzLmVsYXBzZWRUaW1lfTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0ibGFiZWwgJHtzdGF0dXMudG9Mb3dlckNhc2UoKX0iPnt7PSB0ZXN0T3JUYXNrKCd7VEVTVH0nKX19PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIj57e2h0bWwgbmFtZX19PC9zcGFuPgogICAgICAgIHt7aWYgIWlzQ3JpdGljYWx9fShub24tY3JpdGljYWwpe3svaWZ9fQogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXItcmlnaHQiIG9uY2xpY2s9InN0b3BQcm9wYWdhdGlvbihldmVudCkiIHRpdGxlPSIiPgogICAgICAgIDxhIGNsYXNzPSJleHBhbmQiIHRpdGxlPSJFeHBhbmQgYWxsIiBocmVmPSJqYXZhc2NyaXB0OmV4cGFuZEFsbCgnJHtpZH0nKSI+PC9hPgogICAgICAgIDxhIGNsYXNzPSJjb2xsYXBzZSIgdGl0bGU9IkNvbGxhcHNlIGFsbCIgaHJlZj0iamF2YXNjcmlwdDpjb2xsYXBzZUFsbCgnJHtpZH0nKSI+PC9hPgogICAgICAgIDxhIGNsYXNzPSJsaW5rIiB0aXRsZT0iTGluayB0byB0aGlzIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19IiBocmVmPSIjJHtpZH0iIG9uY2xpY2s9Im1ha2VFbGVtZW50VmlzaWJsZSgnJHtpZH0nKSI+PC9hPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXItdG9nZ2xlIiB0aXRsZT0iVG9nZ2xlIHZpc2liaWxpdHkiPjwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJjaGlsZHJlbiI+CiAgICAgIDx0YWJsZSBjbGFzcz0ibWV0YWRhdGEiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5GdWxsIE5hbWU6PC90aD4KICAgICAgICAgIDx0ZD57e2h0bWwgZnVsbE5hbWV9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7e2lmIGRvYygpfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+RG9jdW1lbnRhdGlvbjo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCBkb2MoKX19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgICB7e2lmIHRhZ3MubGVuZ3RofX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+VGFnczo8L3RoPgogICAgICAgICAgPHRkPnt7aHRtbCB0YWdzLmpvaW4oJywgJyl9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgICAge3tpZiB0aW1lb3V0fX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+VGltZW91dDo8L3RoPgogICAgICAgICAgPHRkPnt7aHRtbCB0aW1lb3V0fX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5TdGFydCAvIEVuZCAvIEVsYXBzZWQ6PC90aD4KICAgICAgICAgIDx0ZD4ke3RpbWVzLnN0YXJ0VGltZX0gLyAke3RpbWVzLmVuZFRpbWV9IC8gJHt0aW1lcy5lbGFwc2VkVGltZX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlN0YXR1czo8L3RoPgogICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPSJsYWJlbCAke3N0YXR1cy50b0xvd2VyQ2FzZSgpfSI+JHtzdGF0dXN9PC9zcGFuPiAoe3tpZiBpc0NyaXRpY2FsfX1jcml0aWNhbHt7ZWxzZX19bm9uLWNyaXRpY2Fse3svaWZ9fSk8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3tpZiBtZXNzYWdlKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5NZXNzYWdlOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9Im1lc3NhZ2UiPnt7aHRtbCBtZXNzYWdlKCl9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgIDwvdGFibGU+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9ImtleXdvcmRUZW1wbGF0ZSI+CiAgPGRpdiBpZD0iJHtpZH0iIGNsYXNzPSJrZXl3b3JkIj4KICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyIGNsb3NlZCIgb25jbGljaz0idG9nZ2xlS2V5d29yZCgnJHtpZH0nKSI+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLWxlZnQiIHRpdGxlPSJ7e2h0bWwgbmFtZX19Ij4KICAgICAgICA8c3BhbiBjbGFzcz0iZWxhcHNlZCIgdGl0bGU9IkVsYXBzZWQgdGltZSI+JHt0aW1lcy5lbGFwc2VkVGltZX08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImxhYmVsIGtleXdvcmQgJHtzdGF0dXMudG9Mb3dlckNhc2UoKX0iPiR7dHlwZX08L3NwYW4+CiAgICAgICAgPHNwYW4+e3todG1sIGFzc2lnbn19PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIj48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBsaWJuYW1lfX17e2lmIGxpYm5hbWV9fSAuIHt7L2lmfX08L3NwYW4+e3todG1sIG5hbWV9fTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iYXJnIj57e2h0bWwgYXJndW1lbnRzfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1yaWdodCIgb25jbGljaz0ic3RvcFByb3BhZ2F0aW9uKGV2ZW50KSI+CiAgICAgICAgPGEgY2xhc3M9ImV4cGFuZCIgdGl0bGU9IkV4cGFuZCBhbGwiIGhyZWY9ImphdmFzY3JpcHQ6ZXhwYW5kQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImNvbGxhcHNlIiB0aXRsZT0iQ29sbGFwc2UgYWxsIiBocmVmPSJqYXZhc2NyaXB0OmNvbGxhcHNlQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImxpbmsiIHRpdGxlPSJMaW5rIHRvIHRoaXMga2V5d29yZCIgaHJlZj0iIyR7aWR9IiBvbmNsaWNrPSJtYWtlRWxlbWVudFZpc2libGUoJyR7aWR9JykiPjwvYT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLXRvZ2dsZSIgdGl0bGU9IlRvZ2dsZSB2aXNpYmlsaXR5Ij48L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iY2hpbGRyZW4iPgogICAgICA8dGFibGUgY2xhc3M9Im1ldGFkYXRhIGtleXdvcmQtbWV0YWRhdGEiPgogICAgICAgIHt7aWYgZG9jKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sIGRvYygpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIHt7aWYgdGFnc319CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlRhZ3M6PC90aD4KICAgICAgICAgIDx0ZD57e2h0bWwgdGFnc319PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgICB7e2lmIHRpbWVvdXR9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5UaW1lb3V0OjwvdGg+CiAgICAgICAgICA8dGQ+e3todG1sIHRpbWVvdXR9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlN0YXJ0IC8gRW5kIC8gRWxhcHNlZDo8L3RoPgogICAgICAgICAgPHRkPiR7dGltZXMuc3RhcnRUaW1lfSAvICR7dGltZXMuZW5kVGltZX0gLyAke3RpbWVzLmVsYXBzZWRUaW1lfTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ibWVzc2FnZVRlbXBsYXRlIj4KICA8dGFibGUgaWQ9IiR7aWR9IiBjbGFzcz0ibWVzc2FnZXMgJHtsZXZlbC50b0xvd2VyQ2FzZSgpfS1tZXNzYWdlIj4KICAgIDx0ciBjbGFzcz0ibWVzc2FnZS1yb3ciPgogICAgICA8dGQgY2xhc3M9InRpbWUiPiR7dGltZX08L3RkPgogICAgICA8dGQgY2xhc3M9IiR7bGV2ZWwudG9Mb3dlckNhc2UoKX0gbGV2ZWwiPjxzcGFuIGNsYXNzPSJsYWJlbCAke2xldmVsLnRvTG93ZXJDYXNlKCl9Ij4ke2xldmVsfTwvc3Bhbj48L3RkPgogICAgICA8dGQgY2xhc3M9Im1lc3NhZ2UiPnt7aHRtbCB0ZXh0fX08L3RkPgogICAgICA8dGQgY2xhc3M9InNlbGVjdC1tZXNzYWdlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OnNlbGVjdE1lc3NhZ2UoJyR7aWR9JykiIHRpdGxlPSJTZWxlY3QgbWVzc2FnZSB0ZXh0Ij4KICAgICAgICA8ZGl2PjwvZGl2PgogICAgICA8L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ibG9nTGV2ZWxTZWxlY3RvclRlbXBsYXRlIj4KICA8ZGl2IGlkPSJsb2ctbGV2ZWwtc2VsZWN0b3IiPgogIExvZyBsZXZlbDoKICAgIDxzZWxlY3Qgb25jaGFuZ2U9ImxvZ0xldmVsU2VsZWN0ZWQodGhpcy5vcHRpb25zW3NlbGVjdGVkSW5kZXhdLnZhbHVlKSI+CiAgICAgIDxvcHRpb24gdmFsdWU9IjIiPklORk88L29wdGlvbj4KICAgICAgPG9wdGlvbiB2YWx1ZT0iMSI+REVCVUc8L29wdGlvbj4KICAgICAge3tpZiBzaG93VHJhY2UoKX19PG9wdGlvbiB2YWx1ZT0iMCI+VFJBQ0U8L29wdGlvbj57ey9pZn19CiAgICA8L3NlbGVjdD4KICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8L2JvZHk+CjwvaHRtbD4K';w.document.open();w.document.write(window.atob(d));w.document.close();var a=w.document.createElement('a');a.appendChild(w.document.createTextNode('Download'));a.href='data:text/html;base64,' + d;a.download='log.html';a.style='position:fixed;top:0;right:0;color:white;background:black;text-decoration:none;font-weight:bold;padding:7px 14px;border-radius:0 0 0 5px;';w.document.body.append(a);})(this);\">Log</a> | <a href=\"javascript:(function(el){var w=window.open();var d='PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJQcmFnbWEiIGNvbnRlbnQ9Im5vLWNhY2hlIj4KPG1ldGEgaHR0cC1lcXVpdj0iRXhwaXJlcyIgY29udGVudD0iLTEiPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgo8bWV0YSBjb250ZW50PSJSb2JvdCBGcmFtZXdvcmsgMy4xIChQeXRob24gMy42Ljggb24gbGludXgpIiBuYW1lPSJHZW5lcmF0b3IiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBRUFJQUJvQkFBQUZnQUFBQ2dBQUFBUUFBQUFJQUFBQUFFQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLY0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQXFBQUFBQUFBQUFBQUFBQUFBQUFBQUxJQUFBRC9BQUFBNEFBQUFOd0FBQURjQUFBQTNBQUFBTndBQUFEY0FBQUEzQUFBQU53QUFBRGNBQUFBNEFBQUFQOEFBQUN4QUFBQUFBQUFBS1lBQUFEL0FBQUF1d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQy9BQUFBL3dBQUFLa0FBQUQ2QUFBQXpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU44QUFBRC9BQUFBK2dBQUFNTUFBQUFBQUFBQUFnQUFBR3NBQUFCckFBQUFhd0FBQUdzQUFBQnJBQUFBYXdBQUFHc0FBQUJyQUFBQURBQUFBQUFBQUFEYUFBQUEvd0FBQVBvQUFBRERBQUFBQUFBQUFJc0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFORUFBQUFBQUFBQTJnQUFBUDhBQUFENkFBQUF3d0FBQUFBQUFBQUFBQUFBTWdBQUFESUFBQUF5QUFBQU1nQUFBRElBQUFBeUFBQUFNZ0FBQURJQUFBQUZBQUFBQUFBQUFOb0FBQUQvQUFBQStnQUFBTU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGFBQUFBL3dBQUFQb0FBQUREQUFBQUFBQUFBRHdBQUFCOEFBQUFBQUFBQUdBQUFBQmNBQUFBQUFBQUFIOEFBQUJLQUFBQUFBQUFBQUFBQUFBQUFBQUEyZ0FBQVA4QUFBRDZBQUFBd3dBQUFBQUFBQURDQUFBQS93QUFBQ2tBQUFEcUFBQUE0UUFBQUFBQUFBRDdBQUFBL3dBQUFMQUFBQUFHQUFBQUFBQUFBTm9BQUFEL0FBQUErZ0FBQU1NQUFBQUFBQUFBSXdBQUFQNEFBQUQvQUFBQS93QUFBR0FBQUFBQUFBQUFBQUFBQU1rQUFBRC9BQUFBaWdBQUFBQUFBQURhQUFBQS93QUFBUG9BQUFEREFBQUFBQUFBQUFBQUFBQUlBQUFBY0FBQUFCa0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFZ0FBQUFBQUFBQUFBQUFBMmdBQUFQOEFBQUQ3QUFBQXl3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU40QUFBRC9BQUFBcXdBQUFQOEFBQUN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTElBQUFEL0FBQUFzZ0FBQUFBQUFBQzVBQUFBL3dBQUFNb0FBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNa0FBQUQvQUFBQXZBQUFBQUFBQUFBQUFBQUFBQUFBQUt3QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBclFBQUFBQUFBQUFBd0FNQUFJQUJBQUFmK0FBQVAvd0FBRC84QUFBZ0JBQUFQL3dBQUQvOEFBQS8vQUFBSkl3QUFESEVBQUEvL0FBQVAvd0FBQi80QUFDQUFRQUF3QU1BQUE9PSI+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+Ci8qIEdlbmVyaWMgYW5kIG1pc2Mgc3R5bGVzICovCmJvZHkgewogICAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICBjb2xvcjogYmxhY2s7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQp0YWJsZSB7CiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDFlbTsKfQp0aCwgdGQgewogICAgdmVydGljYWwtYWxpZ246IHRvcDsKfQpiciB7CiAgICBtc28tZGF0YS1wbGFjZW1lbnQ6IHNhbWUtY2VsbDsgLyogbWFpbnRhaW4gbGluZSBicmVha3MgaW4gRXhjZWwgKi8KfQpociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KYSwgYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6ICMxNWM7Cn0KYSA+IGltZyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTVjICFpbXBvcnRhbnQ7Cn0KYTpob3ZlciwgYTphY3RpdmUgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICBjb2xvcjogIzYxYzsKfQoucGFyZW50LW5hbWUgewogICAgZm9udC1zaXplOiAwLjdlbTsKICAgIGxldHRlci1zcGFjaW5nOiAtMC4wN2VtOwp9Ci5tZXNzYWdlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQovKiBIZWFkZXJzICovCiNoZWFkZXIgewogICAgd2lkdGg6IDY1ZW07CiAgICBoZWlnaHQ6IDNlbTsKICAgIG1hcmdpbjogNnB4IDA7Cn0KaDEgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBtYXJnaW46IDAgMCAwLjVlbSAwOwogICAgd2lkdGg6IDc1JTsKfQpoMiB7CiAgICBjbGVhcjogbGVmdDsKfQojZ2VuZXJhdGVkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLyogRG9jdW1lbnRhdGlvbiBoZWFkZXJzICovCi5kb2MgPiBoMiB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9Ci5kb2MgPiBoMyB7CiAgICBmb250LXNpemU6IDEuMWVtOwp9Ci5kb2MgPiBoNCB7CiAgICBmb250LXNpemU6IDEuMGVtOwp9Ci8qIFN0YXR1cyB0ZXh0IGNvbG9ycyAtLSAhaW1wb3J0YW50IGFsbG93cyB1c2luZyB0aGVtIGluIGxpbmtzICovCi5mYWlsIHsKICAgIGNvbG9yOiAjZjMzICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoucGFzcyB7CiAgICBjb2xvcjogIzM5MyAhaW1wb3J0YW50Owp9Ci5sYWJlbCB7CiAgICBwYWRkaW5nOiAycHggNXB4OwogICAgZm9udC1zaXplOiAwLjc1ZW07CiAgICBsZXR0ZXItc3BhY2luZzogMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KLmxhYmVsLmRlYnVnLCAubGFiZWwudHJhY2UsIC5sYWJlbC5lcnJvciwgLmxhYmVsLmtleXdvcmQgewogICAgbGV0dGVyLXNwYWNpbmc6IDA7Cn0KLmxhYmVsLmVycm9yLCAubGFiZWwuZmFpbCwgLmxhYmVsLnBhc3MsIC5sYWJlbC53YXJuIHsKICAgIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoubGFiZWwuZXJyb3IsIC5sYWJlbC5mYWlsIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOTUzNGY7Cn0KLmxhYmVsLnBhc3MgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzVjYjg1YzsKfQoubGFiZWwud2FybiB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWM5NzFmOwp9Ci8qIFRvcCByaWdodCBoZWFkZXIgKi8KI3RvcC1yaWdodC1oZWFkZXIgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgcmlnaHQ6IDA7CiAgICB6LWluZGV4OiAxMDAwOwogICAgd2lkdGg6IDEyZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KI3JlcG9ydC1vci1sb2ctbGluayBhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogYmxhY2s7CiAgICBjb2xvcjogd2hpdGU7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKICAgIHBhZGRpbmc6IDAuM2VtIDA7CiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7Cn0KI3JlcG9ydC1vci1sb2ctbGluayBhOmhvdmVyIHsKICAgIGNvbG9yOiAjZGRkOwp9CiNsb2ctbGV2ZWwtc2VsZWN0b3IgewogICAgcGFkZGluZzogMC4zZW0gMDsKICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiAjZGRkOwp9Ci8qIFN0YXRpc3RpY3MgdGFibGUgKi8KLnN0YXRpc3RpY3MgewogICAgd2lkdGg6IDY1ZW07CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBtYXJnaW4tYm90dG9tOiAxZW07Cn0KLnN0YXRpc3RpY3MgdHI6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Y0ZjRmNDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQouc3RhdGlzdGljcyB0aCwgLnN0YXRpc3RpY3MgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwp9Ci5zdGF0aXN0aWNzIHRoIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICBwYWRkaW5nOiAwLjJlbSAwLjNlbTsKfQouc3RhdGlzdGljcyB0ZCB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9Ci5zdGF0cy1jb2wtc3RhdCB7CiAgICB3aWR0aDogNC41ZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLnN0YXRzLWNvbC1lbGFwc2VkIHsKICAgIHdpZHRoOiA1LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc3RhdHMtY29sLWdyYXBoIHsKICAgIHdpZHRoOiA5ZW07Cn0KdGguc3RhdHMtY29sLWdyYXBoOmhvdmVyIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQouc3RhdC1uYW1lIHsKICAgIGZsb2F0OiBsZWZ0Owp9Ci5zdGF0LW5hbWUgYSwgLnN0YXQtbmFtZSBzcGFuIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci50YWctbGlua3MgewogICAgZm9udC1zaXplOiAwLjllbTsKICAgIGZsb2F0OiByaWdodDsKICAgIG1hcmdpbi10b3A6IDAuMDVlbTsKfQoudGFnLWxpbmtzIHNwYW4gewogICAgbWFyZ2luLWxlZnQ6IDAuMmVtOwp9Ci8qIFN0YXRpc3RpY3MgZ3JhcGggKi8KLmdyYXBoLCAuZW1wdHktZ3JhcGggewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHdpZHRoOiBhdXRvOwogICAgaGVpZ2h0OiA3cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYmFja2dyb3VuZDogI2YzMzsKfQouZW1wdHktZ3JhcGggewogICAgYmFja2dyb3VuZDogI2VlZTsKfQoucGFzcy1iYXIsIC5mYWlsLWJhciB7CiAgICBmbG9hdDogbGVmdDsKICAgIGhlaWdodDogMTAwJTsKfQoucGFzcy1iYXIgewogICAgYmFja2dyb3VuZDogIzFkNDsKfQovKiBUYWJsZXNvcnRlciAtIGFkYXB0ZWQgZnJvbSBwcm92aWRlZCBCbHVlIFNraW4gKi8KLnRhYmxlc29ydGVyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQ3dBSkFJQUFBSDkvZndBQUFDSDVCQUVBQUFFQUxBQUFBQUFMQUFrQUFBSVJqQU9uQnIzY25JcjBXVWpUckM5ZTlCUUFPdz09KTsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgcmlnaHQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLnRhYmxlc29ydGVyLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Ci50YWJsZXNvcnRlci1oZWFkZXJBc2MgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBS0VBQUFBQUFIOS9md0FBQUFBQUFDSDVCQUVBQUFJQUxBQUFBQUFMQUFrQUFBSVVsQlduRnIzY25JcjBXUU95Qm12enAxM0NweFFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjICFpbXBvcnRhbnQ7Cn0KLnRhYmxlc29ydGVyLWhlYWRlckRlc2MgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBS0VBQUFBQUFIOS9md0FBQUFBQUFDSDVCQUVBQUFJQUxBQUFBQUFMQUFrQUFBSVVsQVduQnIzY25JcjBXUk95RG12enAxM0NweFFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjICFpbXBvcnRhbnQ7Cn0KLnNvcnRlci1mYWxzZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5zb3J0ZXItZmFsc2U6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgovKiBHZW5lcmljIHRhYmxlIHN0eWxlcyAqLwp0YWJsZSB7CiAgICBtYXJnaW46IDAgMXB4OwogICAgYmFja2dyb3VuZDogd2hpdGU7Cn0KdHIgewogICAgYmFja2dyb3VuZDogd2hpdGU7Cn0KdGggewogICAgYmFja2dyb3VuZDogI2RkZDsKICAgIGNvbG9yOiBibGFjazsKfQovKiBTdW1tYXJ5IGFuZCB0b3RhbC90YWcvc3VpdGUgZGV0YWlscyAqLwouZGV0YWlscyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGNsZWFyOiBib3RoOwogICAgd2lkdGg6IDY1ZW07CiAgICBtYXJnaW4tYm90dG9tOiAxZW07Cn0KLmRldGFpbHMgdGggewogICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICB3aWR0aDogMTBlbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgIHBhZGRpbmc6IDAuMmVtIDAuNGVtOwp9Ci5kZXRhaWxzIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICBwYWRkaW5nOiAwLjJlbSAwLjRlbTsKfQouc2VsZWN0b3IgdGgsIC5zZWxlY3RvciB0ZCB7CiAgICBwYWRkaW5nLXRvcDogMC41ZW07CiAgICBwYWRkaW5nLWJvdHRvbTogMC41ZW07CiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwp9Ci5maXJzdC1zZWxlY3RvciB0aCwgLmZpcnN0LXNlbGVjdG9yIHRkewogICAgcGFkZGluZy1ib3R0b206IDAuMmVtOwp9Ci5taWRkbGUtc2VsZWN0b3IgdGgsIC5taWRkbGUtc2VsZWN0b3IgdGQgewogICAgcGFkZGluZy10b3A6IDAuMmVtOwogICAgcGFkZGluZy1ib3R0b206IDAuMmVtOwp9Ci5sYXN0LXNlbGVjdG9yIHRoLCAubGFzdC1zZWxlY3RvciB0ZHsKICAgIHBhZGRpbmctdG9wOiAwLjJlbTsKfQojcHJpbnQtc2VsZWN0b3IgewogICAgZGlzcGxheTogbm9uZTsKfQovKiBTZWFyY2ggKi8KI3NlYXJjaC1zdWl0ZSwgI3NlYXJjaC10ZXN0LCAjc2VhcmNoLWluY2x1ZGUsICNzZWFyY2gtZXhjbHVkZSB7CiAgICB3aWR0aDogMjVlbTsKfQojc2VhcmNoIGE6aG92ZXIgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CiNzZWFyY2gtaGVscCBkaXYgewogICAgbWFyZ2luOiAwLjVlbSAwLjVlbSAwLjdlbSAwOwogICAgcGFkZGluZzogMC43ZW07CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQojc2VhcmNoLWhlbHAgaDMsICNzZWFyY2gtaGVscCBwIHsKICAgIG1hcmdpbjogMCAwIDAuN2VtIDA7Cn0KLnNlYXJjaC1oZWxwLWV4YW1wbGVzIHsKICAgIHRhYmxlLWxheW91dDogYXV0bzsKICAgIHdpZHRoOiAxMDAlOwp9Ci5zZWFyY2gtaGVscC1leGFtcGxlcywgLnNlYXJjaC1oZWxwLWV4YW1wbGVzIHRyLAouc2VhcmNoLWhlbHAtZXhhbXBsZXMgdGgsIC5zZWFyY2gtaGVscC1leGFtcGxlcyB0ZCB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIG1hcmdpbjogMDsKfQouc2VhcmNoLWhlbHAtZXhhbXBsZXMgdGgsIC5zZWFyY2gtaGVscC1leGFtcGxlcyB0ZCB7CiAgICBwYWRkaW5nOiAwLjJlbSAwLjdlbSAwLjJlbSAwOwp9Ci5oZWxwLWl0ZW0gewogICAgd2lkdGg6IDEwJTsKfQouaGVscC1leHBsYW5hdGlvbiB7CiAgICB3aWR0aDogNjUlOwp9Ci5oZWxwLWV4YW1wbGVzIHsKICAgIHdpZHRoOiAyNSU7Cn0KLyogVGFicyAtIGFkYXB0ZWQgZnJvbSBodHRwOi8vd3d3Lmh0bWxkb2cuY29tL2FydGljbGVzL3RhYnMgKi8KI2RldGFpbC10YWJzIHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luOiAwIDFlbTsKfQouZGV0YWlsLXRhYiB7CiAgICBmbG9hdDogbGVmdDsKICAgIGJhY2tncm91bmQ6ICNkZGQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDsKICAgIG1hcmdpbjogMCAwLjVlbSAwIDA7CiAgICBwYWRkaW5nLXRvcDogMC4xZW07CiAgICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDsKfQouZGV0YWlsLXRhYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwp9Ci5kZXRhaWwtdGFiIGEgewogICAgY29sb3I6IGJsYWNrOwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBwYWRkaW5nOiAwIDFlbTsKfQouZGV0YWlsLXRhYi1zZWxlY3RlZCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0b3A6IDFweDsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9Ci5kZXRhaWwtdGFiLXNlbGVjdGVkOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9Ci8qIFRlc3QgZGV0YWlscyB0YWJsZSAqLwojdGVzdC1kZXRhaWxzIHsKICAgIHdpZHRoOiAxMDAlOwogICAgYm9yZGVyLXNwYWNpbmc6IDFweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2M7Cn0KI3Rlc3QtZGV0YWlscyA+IHRib2R5ID4gdHI6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Y0ZjRmNDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQojdGVzdC1kZXRhaWxzIHRoLCAjdGVzdC1kZXRhaWxzIHRkIHsKICAgIHBhZGRpbmc6IDAuMmVtOwp9Ci5kZXRhaWxzLWxpbWl0ZWQgewogICAgbWF4LWhlaWdodDogMjBlbTsKICAgIG92ZXJmbG93OiBhdXRvOwp9Ci5kZXRhaWxzLWNvbC1oZWFkZXIgewogICAgcGFkZGluZy1yaWdodDogMWVtOwp9Ci5kZXRhaWxzLWNvbC10b2dnbGUgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBjb2xvcjogIzZjNmM2YzsgLyogc2FtZSBhcyBpbiBzb3J0IGljb24gKi8KICAgIGN1cnNvcjogcG9pbnRlcjsKfQouZGV0YWlscy1jb2wtdG9nZ2xlOmhvdmVyIHsKICAgIGNvbG9yOiBibGFjazsKfQouZGV0YWlscy1jb2wtbmFtZSB7CiAgICBtaW4td2lkdGg6IDIwZW07CiAgICBmb250LXdlaWdodDogYm9sZDsKfQouZGV0YWlscy1jb2wtZG9jIHsKICAgIG1pbi13aWR0aDogMTBlbTsKfQouZGV0YWlscy1jb2wtdGFncyB7CiAgICBtaW4td2lkdGg6IDEwZW07Cn0KLmRldGFpbHMtY29sLWNyaXQgewogICAgd2lkdGg6IDMuNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5kZXRhaWxzLWNvbC1zdGF0dXMgewogICAgd2lkdGg6IDQuNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5kZXRhaWxzLWNvbC1tc2cgewogICAgbWluLXdpZHRoOiAyMGVtOwp9Ci5kZXRhaWxzLWNvbC1lbGFwc2VkIHsKICAgIHdpZHRoOiA3ZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLmRldGFpbHMtY29sLXRpbWVzIHsKICAgIHdpZHRoOiAxMWVtOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouaGlkZGVuIC5kZXRhaWxzLWNvbC1oZWFkZXIsIHRkLmhpZGRlbiA+IGRpdiB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5oaWRkZW4gewogICAgd2lkdGg6IDEzcHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwp9CnRoLmhpZGRlbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Cjwvc3R5bGU+CjxzdHlsZSBtZWRpYT0icHJpbnQiIHR5cGU9InRleHQvY3NzIj4KYm9keSB7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogOHB0Owp9CmE6bGluaywgYTp2aXNpdGVkIHsKICAgIGNvbG9yOiBibGFjazsKfQojaGVhZGVyIHsKICAgIHdpZHRoOiBhdXRvOwp9Ci5kZXRhaWxzLCAuc3RhdGlzdGljcyB7CiAgICB3aWR0aDogMTAwJTsKfQojZ2VuZXJhdGVkLWFnbywgI3RvcC1yaWdodC1oZWFkZXIsICNub3JtYWwtc2VsZWN0b3IsICNzZWFyY2gtYnV0dG9ucywKLmZvbGRpbmctYnV0dG9uLCAuZXhwYW5kLCAuaGlkZGVuLCAuZGV0YWlscy1jb2wtdG9nZ2xlIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLmVsZW1lbnQtaGVhZGVyLXRleHQsIC5jaGlsZHJlbiB7CiAgICBtYXJnaW46IDA7Cn0KI3Rlc3QtZGV0YWlscyB7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgdGFibGUtbGF5b3V0OiBhdXRvOwp9CiN0ZXN0LWRldGFpbHMgdGgsICN0ZXN0LWRldGFpbHMgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Cn0KLmRldGFpbHMtY29sLWhlYWRlciB7CiAgICBwYWRkaW5nOiAwOwp9CiNwcmludC1zZWxlY3RvciB7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwp9Ci50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGJhY2tncm91bmQ6ICNkZGQgIWltcG9ydGFudDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgojamF2YXNjcmlwdC1kaXNhYmxlZCB7CiAgICB3aWR0aDogNjAwcHg7CiAgICBtYXJnaW46IDEwMHB4IGF1dG8gMCBhdXRvOwogICAgcGFkZGluZzogMjBweDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9CiNqYXZhc2NyaXB0LWRpc2FibGVkIGgxIHsKICAgIHdpZHRoOiAxMDAlOwogICAgZmxvYXQ6IG5vbmU7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgdWwgewogICAgZm9udC1zaXplOiAxLjJlbTsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCBsaSB7CiAgICBtYXJnaW46IDAuNWVtIDA7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgYiB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLmRvYyA+ICogewogICAgbWFyZ2luOiAwLjdlbSAxZW0gMC4xZW0gMWVtOwogICAgcGFkZGluZzogMDsKfQouZG9jID4gcCwgLmRvYyA+IGgxLCAuZG9jID4gaDIsIC5kb2MgPiBoMywgLmRvYyA+IGg0IHsKICAgIG1hcmdpbjogMC43ZW0gMCAwLjFlbSAwOwp9Ci5kb2MgPiAqOmZpcnN0LWNoaWxkIHsKICAgIG1hcmdpbi10b3A6IDAuMWVtOwp9Ci5kb2MgdGFibGUgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGVtcHR5LWNlbGxzOiBzaG93OwogICAgZm9udC1zaXplOiAwLjllbTsKfQouZG9jIHRhYmxlIHRoLCAuZG9jIHRhYmxlIHRkIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwogICAgaGVpZ2h0OiAxLjJlbTsKfQouZG9jIHRhYmxlIHRoIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKfQouZG9jIHByZSB7CiAgICBmb250LXNpemU6IDEuMWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgIGJhY2tncm91bmQ6ICNmNGY0ZjQ7Cn0KLmRvYyBjb2RlIHsKICAgIHBhZGRpbmc6IDAgMC4yZW07CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgYmFja2dyb3VuZDogI2VlZTsKfQouZG9jIGxpIHsKICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsKICAgIGxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwp9Ci5kb2MgaW1nIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmRvYyBociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KPC9zdHlsZT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKiEgalF1ZXJ5IHYzLjMuMSB8IChjKSBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiOyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUuZG9jdW1lbnQ/dChlLCEwKTpmdW5jdGlvbihlKXtpZighZS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gdChlKX06dChlKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7dmFyIG49W10scj1lLmRvY3VtZW50LGk9T2JqZWN0LmdldFByb3RvdHlwZU9mLG89bi5zbGljZSxhPW4uY29uY2F0LHM9bi5wdXNoLHU9bi5pbmRleE9mLGw9e30sYz1sLnRvU3RyaW5nLGY9bC5oYXNPd25Qcm9wZXJ0eSxwPWYudG9TdHJpbmcsZD1wLmNhbGwoT2JqZWN0KSxoPXt9LGc9ZnVuY3Rpb24gZSh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmIm51bWJlciIhPXR5cGVvZiB0Lm5vZGVUeXBlfSx5PWZ1bmN0aW9uIGUodCl7cmV0dXJuIG51bGwhPXQmJnQ9PT10LndpbmRvd30sdj17dHlwZTohMCxzcmM6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIG0oZSx0LG4pe3ZhciBpLG89KHQ9dHx8cikuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoby50ZXh0PWUsbilmb3IoaSBpbiB2KW5baV0mJihvW2ldPW5baV0pO3QuaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2xbYy5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9dmFyIGI9IjMuMy4xIix3PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyB3LmZuLmluaXQoZSx0KX0sVD0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7dy5mbj13LnByb3RvdHlwZT17anF1ZXJ5OiIzLjMuMSIsY29uc3RydWN0b3I6dyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIG8uY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP28uY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHR9LGVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcubWFwKHRoaXMsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHQsbix0KX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soby5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKyhlPDA/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobj49MCYmbjx0P1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpzLHNvcnQ6bi5zb3J0LHNwbGljZTpuLnNwbGljZX0sdy5leHRlbmQ9dy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8sYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGw9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fGcoYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKW49YVt0XSxhIT09KHI9ZVt0XSkmJihsJiZyJiYody5pc1BsYWluT2JqZWN0KHIpfHwoaT1BcnJheS5pc0FycmF5KHIpKSk/KGk/KGk9ITEsbz1uJiZBcnJheS5pc0FycmF5KG4pP246W10pOm89biYmdy5pc1BsYWluT2JqZWN0KG4pP246e30sYVt0XT13LmV4dGVuZChsLG8scikpOnZvaWQgMCE9PXImJihhW3RdPXIpKTtyZXR1cm4gYX0sdy5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKCIzLjMuMSIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4hKCFlfHwiW29iamVjdCBPYmplY3RdIiE9PWMuY2FsbChlKSkmJighKHQ9aShlKSl8fCJmdW5jdGlvbiI9PXR5cGVvZihuPWYuY2FsbCh0LCJjb25zdHJ1Y3RvciIpJiZ0LmNvbnN0cnVjdG9yKSYmcC5jYWxsKG4pPT09ZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbihlKXttKGUpfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2lmKEMoZSkpe2ZvcihuPWUubGVuZ3RoO3I8bjtyKyspaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrfWVsc2UgZm9yKHIgaW4gZSlpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWs7cmV0dXJuIGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6KGUrIiIpLnJlcGxhY2UoVCwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoQyhPYmplY3QoZSkpP3cubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOnMuY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTp1LmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0rdC5sZW5ndGgscj0wLGk9ZS5sZW5ndGg7cjxuO3IrKyllW2krK109dFtyXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIsaT1bXSxvPTAsYT1lLmxlbmd0aCxzPSFuO288YTtvKyspKHI9IXQoZVtvXSxvKSkhPT1zJiZpLnB1c2goZVtvXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPTAscz1bXTtpZihDKGUpKWZvcihyPWUubGVuZ3RoO288cjtvKyspbnVsbCE9KGk9dChlW29dLG8sbikpJiZzLnB1c2goaSk7ZWxzZSBmb3IobyBpbiBlKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmcy5wdXNoKGkpO3JldHVybiBhLmFwcGx5KFtdLHMpfSxndWlkOjEsc3VwcG9ydDpofSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKHcuZm5bU3ltYm9sLml0ZXJhdG9yXT1uW1N5bWJvbC5pdGVyYXRvcl0pLHcuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtsWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIEMoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49eChlKTtyZXR1cm4hZyhlKSYmIXkoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmdD4wJiZ0LTEgaW4gZSl9dmFyIEU9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHMsdSxsLGMsZixwLGQsaCxnLHksdixtLHgsYj0ic2l6emxlIisxKm5ldyBEYXRlLHc9ZS5kb2N1bWVudCxUPTAsQz0wLEU9YWUoKSxrPWFlKCksUz1hZSgpLEQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihmPSEwKSwwfSxOPXt9Lmhhc093blByb3BlcnR5LEE9W10saj1BLnBvcCxxPUEucHVzaCxMPUEucHVzaCxIPUEuc2xpY2UsTz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX0sUD0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLFI9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixJPSJcXFsiK00rIiooIitSKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrUisiKSl8KSIrTSsiKlxcXSIsVz0iOigiK1IrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK0krIikqKXwuKilcXCl8KSIsJD1uZXcgUmVnRXhwKE0rIisiLCJnIiksQj1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLEY9bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSxfPW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksej1uZXcgUmVnRXhwKCI9IitNKyIqKFteXFxdJ1wiXSo/KSIrTSsiKlxcXSIsImciKSxYPW5ldyBSZWdFeHAoVyksVT1uZXcgUmVnRXhwKCJeIitSKyIkIiksVj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitSKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK1IrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK1IrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitJKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrVyksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitNKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitNKyIqKD86KFsrLV18KSIrTSsiKihcXGQrKXwpKSIrTSsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrUCsiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK00rIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrTSsiKigoPzotXFxkKT9cXGQqKSIrTSsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sRz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFk9L15oXGQkL2ksUT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sSj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLEs9L1srfl0vLFo9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitNKyI/fCgiK00rIil8LikiLCJpZyIpLGVlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iMHgiK3QtNjU1MzY7cmV0dXJuIHIhPT1yfHxuP3Q6cjwwP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShyPj4xMHw1NTI5NiwxMDIzJnJ8NTYzMjApfSx0ZT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxuZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PyJcMCI9PT1lPyJcdWZmZmQiOmUuc2xpY2UoMCwtMSkrIlxcIitlLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2V9LHJlPWZ1bmN0aW9uKCl7cCgpfSxpZT1tZShmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJigiZm9ybSJpbiBlfHwibGFiZWwiaW4gZSl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7TC5hcHBseShBPUguY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksQVt3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtMPXthcHBseTpBLmxlbmd0aD9mdW5jdGlvbihlLHQpe3EuYXBwbHkoZSxILmNhbGwodCkpfTpmdW5jdGlvbihlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDt3aGlsZShlW24rK109dFtyKytdKTtlLmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBvZShlLHQscixpKXt2YXIgbyxzLGwsYyxmLGgsdixtPXQmJnQub3duZXJEb2N1bWVudCxUPXQ/dC5ub2RlVHlwZTo5O2lmKHI9cnx8W10sInN0cmluZyIhPXR5cGVvZiBlfHwhZXx8MSE9PVQmJjkhPT1UJiYxMSE9PVQpcmV0dXJuIHI7aWYoIWkmJigodD90Lm93bmVyRG9jdW1lbnR8fHQ6dykhPT1kJiZwKHQpLHQ9dHx8ZCxnKSl7aWYoMTEhPT1UJiYoZj1KLmV4ZWMoZSkpKWlmKG89ZlsxXSl7aWYoOT09PVQpe2lmKCEobD10LmdldEVsZW1lbnRCeUlkKG8pKSlyZXR1cm4gcjtpZihsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZSBpZihtJiYobD1tLmdldEVsZW1lbnRCeUlkKG8pKSYmeCh0LGwpJiZsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZXtpZihmWzJdKXJldHVybiBMLmFwcGx5KHIsdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkscjtpZigobz1mWzNdKSYmbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZ0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEwuYXBwbHkocix0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobykpLHJ9aWYobi5xc2EmJiFTW2UrIiAiXSYmKCF5fHwheS50ZXN0KGUpKSl7aWYoMSE9PVQpbT10LHY9ZTtlbHNlIGlmKCJvYmplY3QiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXsoYz10LmdldEF0dHJpYnV0ZSgiaWQiKSk/Yz1jLnJlcGxhY2UodGUsbmUpOnQuc2V0QXR0cmlidXRlKCJpZCIsYz1iKSxzPShoPWEoZSkpLmxlbmd0aDt3aGlsZShzLS0paFtzXT0iIyIrYysiICIrdmUoaFtzXSk7dj1oLmpvaW4oIiwiKSxtPUsudGVzdChlKSYmZ2UodC5wYXJlbnROb2RlKXx8dH1pZih2KXRyeXtyZXR1cm4gTC5hcHBseShyLG0ucXVlcnlTZWxlY3RvckFsbCh2KSkscn1jYXRjaChlKXt9ZmluYWxseXtjPT09YiYmdC5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gdShlLnJlcGxhY2UoQiwiJDEiKSx0LHIsaSl9ZnVuY3Rpb24gYWUoKXt2YXIgZT1bXTtmdW5jdGlvbiB0KG4saSl7cmV0dXJuIGUucHVzaChuKyIgIik+ci5jYWNoZUxlbmd0aCYmZGVsZXRlIHRbZS5zaGlmdCgpXSx0W24rIiAiXT1pfXJldHVybiB0fWZ1bmN0aW9uIHNlKGUpe3JldHVybiBlW2JdPSEwLGV9ZnVuY3Rpb24gdWUoZSl7dmFyIHQ9ZC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGxlKGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLGk9bi5sZW5ndGg7d2hpbGUoaS0tKXIuYXR0ckhhbmRsZVtuW2ldXT10fWZ1bmN0aW9uIGNlKGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBmZShlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gcGUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PW58fCJidXR0b24iPT09bikmJnQudHlwZT09PWV9fWZ1bmN0aW9uIGRlKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4iZm9ybSJpbiB0P3QucGFyZW50Tm9kZSYmITE9PT10LmRpc2FibGVkPyJsYWJlbCJpbiB0PyJsYWJlbCJpbiB0LnBhcmVudE5vZGU/dC5wYXJlbnROb2RlLmRpc2FibGVkPT09ZTp0LmRpc2FibGVkPT09ZTp0LmlzRGlzYWJsZWQ9PT1lfHx0LmlzRGlzYWJsZWQhPT0hZSYmaWUodCk9PT1lOnQuZGlzYWJsZWQ9PT1lOiJsYWJlbCJpbiB0JiZ0LmRpc2FibGVkPT09ZX19ZnVuY3Rpb24gaGUoZSl7cmV0dXJuIHNlKGZ1bmN0aW9uKHQpe3JldHVybiB0PSt0LHNlKGZ1bmN0aW9uKG4scil7dmFyIGksbz1lKFtdLG4ubGVuZ3RoLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKW5baT1vW2FdXSYmKG5baV09IShyW2ldPW5baV0pKX0pfSl9ZnVuY3Rpb24gZ2UoZSl7cmV0dXJuIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1uPW9lLnN1cHBvcnQ9e30sbz1vZS5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuISF0JiYiSFRNTCIhPT10Lm5vZGVOYW1lfSxwPW9lLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0LGksYT1lP2Uub3duZXJEb2N1bWVudHx8ZTp3O3JldHVybiBhIT09ZCYmOT09PWEubm9kZVR5cGUmJmEuZG9jdW1lbnRFbGVtZW50PyhkPWEsaD1kLmRvY3VtZW50RWxlbWVudCxnPSFvKGQpLHchPT1kJiYoaT1kLmRlZmF1bHRWaWV3KSYmaS50b3AhPT1pJiYoaS5hZGRFdmVudExpc3RlbmVyP2kuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixyZSwhMSk6aS5hdHRhY2hFdmVudCYmaS5hdHRhY2hFdmVudCgib251bmxvYWQiLHJlKSksbi5hdHRyaWJ1dGVzPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsYXNzTmFtZT0iaSIsIWUuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLG4uZ2V0RWxlbWVudHNCeVRhZ05hbWU9dWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXBwZW5kQ2hpbGQoZC5jcmVhdGVDb21tZW50KCIiKSksIWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxuLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9US50ZXN0KGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksbi5nZXRCeUlkPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBoLmFwcGVuZENoaWxkKGUpLmlkPWIsIWQuZ2V0RWxlbWVudHNCeU5hbWV8fCFkLmdldEVsZW1lbnRzQnlOYW1lKGIpLmxlbmd0aH0pLG4uZ2V0QnlJZD8oci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0sci5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09dH19LHIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG4scixpLG89dC5nZXRFbGVtZW50QnlJZChlKTtpZihvKXtpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb119cmV0dXJuW119fSksci5maW5kLlRBRz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6bi5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sci5maW5kLkNMQVNTPW4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZylyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfSx2PVtdLHk9W10sKG4ucXNhPVEudGVzdChkLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKHVlKGZ1bmN0aW9uKGUpe2guYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitiKyInPjwvYT48c2VsZWN0IGlkPSciK2IrIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmeS5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8eS5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK1ArIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitiKyItXSIpLmxlbmd0aHx8eS5wdXNoKCJ+PSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHkucHVzaCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitiKyIrKiIpLmxlbmd0aHx8eS5wdXNoKCIuIy4rWyt+XSIpfSksdWUoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIHQ9ZC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3Quc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmeS5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ5LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksaC5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnkucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx5LnB1c2goIiwuKjoiKX0pKSwobi5tYXRjaGVzU2VsZWN0b3I9US50ZXN0KG09aC5tYXRjaGVzfHxoLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8aC5tb3pNYXRjaGVzU2VsZWN0b3J8fGgub01hdGNoZXNTZWxlY3Rvcnx8aC5tc01hdGNoZXNTZWxlY3RvcikpJiZ1ZShmdW5jdGlvbihlKXtuLmRpc2Nvbm5lY3RlZE1hdGNoPW0uY2FsbChlLCIqIiksbS5jYWxsKGUsIltzIT0nJ106eCIpLHYucHVzaCgiIT0iLFcpfSkseT15Lmxlbmd0aCYmbmV3IFJlZ0V4cCh5LmpvaW4oInwiKSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSksdD1RLnRlc3QoaC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikseD10fHxRLnRlc3QoaC5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxEPXQ/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gZj0hMCwwO3ZhciByPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiByfHwoMSYocj0oZS5vd25lckRvY3VtZW50fHxlKT09PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSl8fCFuLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PXI/ZT09PWR8fGUub3duZXJEb2N1bWVudD09PXcmJngodyxlKT8tMTp0PT09ZHx8dC5vd25lckRvY3VtZW50PT09dyYmeCh3LHQpPzE6Yz9PKGMsZSktTyhjLHQpOjA6NCZyPy0xOjEpfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBmPSEwLDA7dmFyIG4scj0wLGk9ZS5wYXJlbnROb2RlLG89dC5wYXJlbnROb2RlLGE9W2VdLHM9W3RdO2lmKCFpfHwhbylyZXR1cm4gZT09PWQ/LTE6dD09PWQ/MTppPy0xOm8/MTpjP08oYyxlKS1PKGMsdCk6MDtpZihpPT09bylyZXR1cm4gY2UoZSx0KTtuPWU7d2hpbGUobj1uLnBhcmVudE5vZGUpYS51bnNoaWZ0KG4pO249dDt3aGlsZShuPW4ucGFyZW50Tm9kZSlzLnVuc2hpZnQobik7d2hpbGUoYVtyXT09PXNbcl0pcisrO3JldHVybiByP2NlKGFbcl0sc1tyXSk6YVtyXT09PXc/LTE6c1tyXT09PXc/MTowfSxkKTpkfSxvZS5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG9lKGUsbnVsbCxudWxsLHQpfSxvZS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSx0KXtpZigoZS5vd25lckRvY3VtZW50fHxlKSE9PWQmJnAoZSksdD10LnJlcGxhY2UoeiwiPSckMSddIiksbi5tYXRjaGVzU2VsZWN0b3ImJmcmJiFTW3QrIiAiXSYmKCF2fHwhdi50ZXN0KHQpKSYmKCF5fHwheS50ZXN0KHQpKSl0cnl7dmFyIHI9bS5jYWxsKGUsdCk7aWYocnx8bi5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiByfWNhdGNoKGUpe31yZXR1cm4gb2UodCxkLG51bGwsW2VdKS5sZW5ndGg+MH0sb2UuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS5vd25lckRvY3VtZW50fHxlKSE9PWQmJnAoZSkseChlLHQpfSxvZS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPT1kJiZwKGUpO3ZhciBpPXIuYXR0ckhhbmRsZVt0LnRvTG93ZXJDYXNlKCldLG89aSYmTi5jYWxsKHIuYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP2koZSx0LCFnKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PW8/bzpuLmF0dHJpYnV0ZXN8fCFnP2UuZ2V0QXR0cmlidXRlKHQpOihvPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJm8uc3BlY2lmaWVkP28udmFsdWU6bnVsbH0sb2UuZXNjYXBlPWZ1bmN0aW9uKGUpe3JldHVybihlKyIiKS5yZXBsYWNlKHRlLG5lKX0sb2UuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSxvZS51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LHI9W10saT0wLG89MDtpZihmPSFuLmRldGVjdER1cGxpY2F0ZXMsYz0hbi5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydChEKSxmKXt3aGlsZSh0PWVbbysrXSl0PT09ZVtvXSYmKGk9ci5wdXNoKG8pKTt3aGlsZShpLS0pZS5zcGxpY2UocltpXSwxKX1yZXR1cm4gYz1udWxsLGV9LGk9b2UuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9MCxvPWUubm9kZVR5cGU7aWYobyl7aWYoMT09PW98fDk9PT1vfHwxMT09PW8pe2lmKCJzdHJpbmciPT10eXBlb2YgZS50ZXh0Q29udGVudClyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9aShlKX1lbHNlIGlmKDM9PT1vfHw0PT09bylyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSB3aGlsZSh0PWVbcisrXSluKz1pKHQpO3JldHVybiBufSwocj1vZS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpzZSxtYXRjaDpWLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnJlcGxhY2UoWixlZSksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UoWixlZSksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fG9lLmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJm9lLmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzZdJiZlWzJdO3JldHVybiBWLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXT9lWzJdPWVbNF18fGVbNV18fCIiOm4mJlgudGVzdChuKSYmKHQ9YShuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoWixlZSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9RVtlKyIgIl07cmV0dXJuIHR8fCh0PW5ldyBSZWdFeHAoIihefCIrTSsiKSIrZSsiKCIrTSsifCQpIikpJiZFKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdCgic3RyaW5nIj09dHlwZW9mIGUuY2xhc3NOYW1lJiZlLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIGk9b2UuYXR0cihyLGUpO3JldHVybiBudWxsPT1pPyIhPSI9PT10OiF0fHwoaSs9IiIsIj0iPT09dD9pPT09bjoiIT0iPT09dD9pIT09bjoiXj0iPT09dD9uJiYwPT09aS5pbmRleE9mKG4pOiIqPSI9PT10P24mJmkuaW5kZXhPZihuKT4tMToiJD0iPT09dD9uJiZpLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT10PygiICIraS5yZXBsYWNlKCQsIiAiKSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PXQmJihpPT09bnx8aS5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSIpKX19LENISUxEOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89Im50aCIhPT1lLnNsaWNlKDAsMyksYT0ibGFzdCIhPT1lLnNsaWNlKC00KSxzPSJvZi10eXBlIj09PXQ7cmV0dXJuIDE9PT1yJiYwPT09aT9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24odCxuLHUpe3ZhciBsLGMsZixwLGQsaCxnPW8hPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIseT10LnBhcmVudE5vZGUsdj1zJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbT0hdSYmIXMseD0hMTtpZih5KXtpZihvKXt3aGlsZShnKXtwPXQ7d2hpbGUocD1wW2ddKWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09djoxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtoPWc9Im9ubHkiPT09ZSYmIWgmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoaD1bYT95LmZpcnN0Q2hpbGQ6eS5sYXN0Q2hpbGRdLGEmJm0pe3g9KGQ9KGw9KGM9KGY9KHA9eSlbYl18fChwW2JdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbZV18fFtdKVswXT09PVQmJmxbMV0pJiZsWzJdLHA9ZCYmeS5jaGlsZE5vZGVzW2RdO3doaWxlKHA9KytkJiZwJiZwW2ddfHwoeD1kPTApfHxoLnBvcCgpKWlmKDE9PT1wLm5vZGVUeXBlJiYrK3gmJnA9PT10KXtjW2VdPVtULGQseF07YnJlYWt9fWVsc2UgaWYobSYmKHg9ZD0obD0oYz0oZj0ocD10KVtiXXx8KHBbYl09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVtlXXx8W10pWzBdPT09VCYmbFsxXSksITE9PT14KXdoaWxlKHA9KytkJiZwJiZwW2ddfHwoeD1kPTApfHxoLnBvcCgpKWlmKChzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXY6MT09PXAubm9kZVR5cGUpJiYrK3gmJihtJiYoKGM9KGY9cFtiXXx8KHBbYl09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVtlXT1bVCx4XSkscD09PXQpKWJyZWFrO3JldHVybih4LT1pKT09PXJ8fHglcj09MCYmeC9yPj0wfX19LFBTRVVETzpmdW5jdGlvbihlLHQpe3ZhciBuLGk9ci5wc2V1ZG9zW2VdfHxyLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8b2UuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIitlKTtyZXR1cm4gaVtiXT9pKHQpOmkubGVuZ3RoPjE/KG49W2UsZSwiIix0XSxyLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT9zZShmdW5jdGlvbihlLG4pe3ZhciByLG89aShlLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKWVbcj1PKGUsb1thXSldPSEobltyXT1vW2FdKX0pOmZ1bmN0aW9uKGUpe3JldHVybiBpKGUsMCxuKX0pOml9fSxwc2V1ZG9zOntub3Q6c2UoZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1bXSxyPXMoZS5yZXBsYWNlKEIsIiQxIikpO3JldHVybiByW2JdP3NlKGZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLGE9cihlLG51bGwsaSxbXSkscz1lLmxlbmd0aDt3aGlsZShzLS0pKG89YVtzXSkmJihlW3NdPSEodFtzXT1vKSl9KTpmdW5jdGlvbihlLGksbyl7cmV0dXJuIHRbMF09ZSxyKHQsbnVsbCxvLG4pLHRbMF09bnVsbCwhbi5wb3AoKX19KSxoYXM6c2UoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBvZShlLHQpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOnNlKGZ1bmN0aW9uKGUpe3JldHVybiBlPWUucmVwbGFjZShaLGVlKSxmdW5jdGlvbih0KXtyZXR1cm4odC50ZXh0Q29udGVudHx8dC5pbm5lclRleHR8fGkodCkpLmluZGV4T2YoZSk+LTF9fSksbGFuZzpzZShmdW5jdGlvbihlKXtyZXR1cm4gVS50ZXN0KGV8fCIiKXx8b2UuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrZSksZT1lLnJlcGxhY2UoWixlZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXt2YXIgbjtkb3tpZihuPWc/dC5sYW5nOnQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHx0LmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybihuPW4udG9Mb3dlckNhc2UoKSk9PT1lfHwwPT09bi5pbmRleE9mKGUrIi0iKX13aGlsZSgodD10LnBhcmVudE5vZGUpJiYxPT09dC5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKHQpe3ZhciBuPWUubG9jYXRpb24mJmUubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PXQuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1ofSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWQuYWN0aXZlRWxlbWVudCYmKCFkLmhhc0ZvY3VzfHxkLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmRlKCExKSxkaXNhYmxlZDpkZSghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIXIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBZLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBHLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PXQudG9Mb3dlckNhc2UoKSl9LGZpcnN0OmhlKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpoZShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6aGUoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjpoZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpoZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OmhlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOy0tcj49MDspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6aGUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0pLnBzZXVkb3MubnRoPXIucHNldWRvcy5lcTtmb3IodCBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlyLnBzZXVkb3NbdF09ZmUodCk7Zm9yKHQgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlyLnBzZXVkb3NbdF09cGUodCk7ZnVuY3Rpb24geWUoKXt9eWUucHJvdG90eXBlPXIuZmlsdGVycz1yLnBzZXVkb3Msci5zZXRGaWx0ZXJzPW5ldyB5ZSxhPW9lLnRva2VuaXplPWZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLGEscyx1LGwsYz1rW2UrIiAiXTtpZihjKXJldHVybiB0PzA6Yy5zbGljZSgwKTtzPWUsdT1bXSxsPXIucHJlRmlsdGVyO3doaWxlKHMpe24mJiEoaT1GLmV4ZWMocykpfHwoaSYmKHM9cy5zbGljZShpWzBdLmxlbmd0aCl8fHMpLHUucHVzaChvPVtdKSksbj0hMSwoaT1fLmV4ZWMocykpJiYobj1pLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6aVswXS5yZXBsYWNlKEIsIiAiKX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2ZvcihhIGluIHIuZmlsdGVyKSEoaT1WW2FdLmV4ZWMocykpfHxsW2FdJiYhKGk9bFthXShpKSl8fChuPWkuc2hpZnQoKSxvLnB1c2goe3ZhbHVlOm4sdHlwZTphLG1hdGNoZXM6aX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P3MubGVuZ3RoOnM/b2UuZXJyb3IoZSk6ayhlLHUpLnNsaWNlKDApfTtmdW5jdGlvbiB2ZShlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoLHI9IiI7dDxuO3QrKylyKz1lW3RdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIG1lKGUsdCxuKXt2YXIgcj10LmRpcixpPXQubmV4dCxvPWl8fHIsYT1uJiYicGFyZW50Tm9kZSI9PT1vLHM9QysrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixpKXt3aGlsZSh0PXRbcl0paWYoMT09PXQubm9kZVR5cGV8fGEpcmV0dXJuIGUodCxuLGkpO3JldHVybiExfTpmdW5jdGlvbih0LG4sdSl7dmFyIGwsYyxmLHA9W1Qsc107aWYodSl7d2hpbGUodD10W3JdKWlmKCgxPT09dC5ub2RlVHlwZXx8YSkmJmUodCxuLHUpKXJldHVybiEwfWVsc2Ugd2hpbGUodD10W3JdKWlmKDE9PT10Lm5vZGVUeXBlfHxhKWlmKGY9dFtiXXx8KHRbYl09e30pLGM9Zlt0LnVuaXF1ZUlEXXx8KGZbdC51bmlxdWVJRF09e30pLGkmJmk9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpdD10W3JdfHx0O2Vsc2V7aWYoKGw9Y1tvXSkmJmxbMF09PT1UJiZsWzFdPT09cylyZXR1cm4gcFsyXT1sWzJdO2lmKGNbb109cCxwWzJdPWUodCxuLHUpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB4ZShlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5jdGlvbih0LG4scil7dmFyIGk9ZS5sZW5ndGg7d2hpbGUoaS0tKWlmKCFlW2ldKHQsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06ZVswXX1mdW5jdGlvbiBiZShlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKW9lKGUsdFtyXSxuKTtyZXR1cm4gbn1mdW5jdGlvbiB3ZShlLHQsbixyLGkpe2Zvcih2YXIgbyxhPVtdLHM9MCx1PWUubGVuZ3RoLGw9bnVsbCE9dDtzPHU7cysrKShvPWVbc10pJiYobiYmIW4obyxyLGkpfHwoYS5wdXNoKG8pLGwmJnQucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIFRlKGUsdCxuLHIsaSxvKXtyZXR1cm4gciYmIXJbYl0mJihyPVRlKHIpKSxpJiYhaVtiXSYmKGk9VGUoaSxvKSksc2UoZnVuY3Rpb24obyxhLHMsdSl7dmFyIGwsYyxmLHA9W10sZD1bXSxoPWEubGVuZ3RoLGc9b3x8YmUodHx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLHk9IWV8fCFvJiZ0P2c6d2UoZyxwLGUscyx1KSx2PW4/aXx8KG8/ZTpofHxyKT9bXTphOnk7aWYobiYmbih5LHYscyx1KSxyKXtsPXdlKHYsZCkscihsLFtdLHMsdSksYz1sLmxlbmd0aDt3aGlsZShjLS0pKGY9bFtjXSkmJih2W2RbY11dPSEoeVtkW2NdXT1mKSl9aWYobyl7aWYoaXx8ZSl7aWYoaSl7bD1bXSxjPXYubGVuZ3RoO3doaWxlKGMtLSkoZj12W2NdKSYmbC5wdXNoKHlbY109Zik7aShudWxsLHY9W10sbCx1KX1jPXYubGVuZ3RoO3doaWxlKGMtLSkoZj12W2NdKSYmKGw9aT9PKG8sZik6cFtjXSk+LTEmJihvW2xdPSEoYVtsXT1mKSl9fWVsc2Ugdj13ZSh2PT09YT92LnNwbGljZShoLHYubGVuZ3RoKTp2KSxpP2kobnVsbCxhLHYsdSk6TC5hcHBseShhLHYpfSl9ZnVuY3Rpb24gQ2UoZSl7Zm9yKHZhciB0LG4saSxvPWUubGVuZ3RoLGE9ci5yZWxhdGl2ZVtlWzBdLnR5cGVdLHM9YXx8ci5yZWxhdGl2ZVsiICJdLHU9YT8xOjAsYz1tZShmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9LHMsITApLGY9bWUoZnVuY3Rpb24oZSl7cmV0dXJuIE8odCxlKT4tMX0scywhMCkscD1bZnVuY3Rpb24oZSxuLHIpe3ZhciBpPSFhJiYocnx8biE9PWwpfHwoKHQ9bikubm9kZVR5cGU/YyhlLG4scik6ZihlLG4scikpO3JldHVybiB0PW51bGwsaX1dO3U8bzt1KyspaWYobj1yLnJlbGF0aXZlW2VbdV0udHlwZV0pcD1bbWUoeGUocCksbildO2Vsc2V7aWYoKG49ci5maWx0ZXJbZVt1XS50eXBlXS5hcHBseShudWxsLGVbdV0ubWF0Y2hlcykpW2JdKXtmb3IoaT0rK3U7aTxvO2krKylpZihyLnJlbGF0aXZlW2VbaV0udHlwZV0pYnJlYWs7cmV0dXJuIFRlKHU+MSYmeGUocCksdT4xJiZ2ZShlLnNsaWNlKDAsdS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbdS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKEIsIiQxIiksbix1PGkmJkNlKGUuc2xpY2UodSxpKSksaTxvJiZDZShlPWUuc2xpY2UoaSkpLGk8byYmdmUoZSkpfXAucHVzaChuKX1yZXR1cm4geGUocCl9ZnVuY3Rpb24gRWUoZSx0KXt2YXIgbj10Lmxlbmd0aD4wLGk9ZS5sZW5ndGg+MCxvPWZ1bmN0aW9uKG8sYSxzLHUsYyl7dmFyIGYsaCx5LHY9MCxtPSIwIix4PW8mJltdLGI9W10sdz1sLEM9b3x8aSYmci5maW5kLlRBRygiKiIsYyksRT1UKz1udWxsPT13PzE6TWF0aC5yYW5kb20oKXx8LjEsaz1DLmxlbmd0aDtmb3IoYyYmKGw9YT09PWR8fGF8fGMpO20hPT1rJiZudWxsIT0oZj1DW21dKTttKyspe2lmKGkmJmYpe2g9MCxhfHxmLm93bmVyRG9jdW1lbnQ9PT1kfHwocChmKSxzPSFnKTt3aGlsZSh5PWVbaCsrXSlpZih5KGYsYXx8ZCxzKSl7dS5wdXNoKGYpO2JyZWFrfWMmJihUPUUpfW4mJigoZj0heSYmZikmJnYtLSxvJiZ4LnB1c2goZikpfWlmKHYrPW0sbiYmbSE9PXYpe2g9MDt3aGlsZSh5PXRbaCsrXSl5KHgsYixhLHMpO2lmKG8pe2lmKHY+MCl3aGlsZShtLS0peFttXXx8YlttXXx8KGJbbV09ai5jYWxsKHUpKTtiPXdlKGIpfUwuYXBwbHkodSxiKSxjJiYhbyYmYi5sZW5ndGg+MCYmdit0Lmxlbmd0aD4xJiZvZS51bmlxdWVTb3J0KHUpfXJldHVybiBjJiYoVD1FLGw9dykseH07cmV0dXJuIG4/c2Uobyk6b31yZXR1cm4gcz1vZS5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPVtdLG89U1tlKyIgIl07aWYoIW8pe3R8fCh0PWEoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKShvPUNlKHRbbl0pKVtiXT9yLnB1c2gobyk6aS5wdXNoKG8pOyhvPVMoZSxFZShpLHIpKSkuc2VsZWN0b3I9ZX1yZXR1cm4gb30sdT1vZS5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4saSl7dmFyIG8sdSxsLGMsZixwPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLGQ9IWkmJmEoZT1wLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1kLmxlbmd0aCl7aWYoKHU9ZFswXT1kWzBdLnNsaWNlKDApKS5sZW5ndGg+MiYmIklEIj09PShsPXVbMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZnJiZyLnJlbGF0aXZlW3VbMV0udHlwZV0pe2lmKCEodD0oci5maW5kLklEKGwubWF0Y2hlc1swXS5yZXBsYWNlKFosZWUpLHQpfHxbXSlbMF0pKXJldHVybiBuO3AmJih0PXQucGFyZW50Tm9kZSksZT1lLnNsaWNlKHUuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfW89Vi5uZWVkc0NvbnRleHQudGVzdChlKT8wOnUubGVuZ3RoO3doaWxlKG8tLSl7aWYobD11W29dLHIucmVsYXRpdmVbYz1sLnR5cGVdKWJyZWFrO2lmKChmPXIuZmluZFtjXSkmJihpPWYobC5tYXRjaGVzWzBdLnJlcGxhY2UoWixlZSksSy50ZXN0KHVbMF0udHlwZSkmJmdlKHQucGFyZW50Tm9kZSl8fHQpKSl7aWYodS5zcGxpY2UobywxKSwhKGU9aS5sZW5ndGgmJnZlKHUpKSlyZXR1cm4gTC5hcHBseShuLGkpLG47YnJlYWt9fX1yZXR1cm4ocHx8cyhlLGQpKShpLHQsIWcsbiwhdHx8Sy50ZXN0KGUpJiZnZSh0LnBhcmVudE5vZGUpfHx0KSxufSxuLnNvcnRTdGFibGU9Yi5zcGxpdCgiIikuc29ydChEKS5qb2luKCIiKT09PWIsbi5kZXRlY3REdXBsaWNhdGVzPSEhZixwKCksbi5zb3J0RGV0YWNoZWQ9dWUoZnVuY3Rpb24oZSl7cmV0dXJuIDEmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksdWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8bGUoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGUsdCxuKXtpZighbilyZXR1cm4gZS5nZXRBdHRyaWJ1dGUodCwidHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/MToyKX0pLG4uYXR0cmlidXRlcyYmdWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8aW5wdXQvPiIsZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8bGUoInZhbHVlIixmdW5jdGlvbihlLHQsbil7aWYoIW4mJiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGUuZGVmYXVsdFZhbHVlfSksdWUoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGxlKFAsZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKCFuKXJldHVybiEwPT09ZVt0XT90LnRvTG93ZXJDYXNlKCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSksb2V9KGUpO3cuZmluZD1FLHcuZXhwcj1FLnNlbGVjdG9ycyx3LmV4cHJbIjoiXT13LmV4cHIucHNldWRvcyx3LnVuaXF1ZVNvcnQ9dy51bmlxdWU9RS51bmlxdWVTb3J0LHcudGV4dD1FLmdldFRleHQsdy5pc1hNTERvYz1FLmlzWE1MLHcuY29udGFpbnM9RS5jb250YWlucyx3LmVzY2FwZVNlbGVjdG9yPUUuZXNjYXBlO3ZhciBrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxpPXZvaWQgMCE9PW47d2hpbGUoKGU9ZVt0XSkmJjkhPT1lLm5vZGVUeXBlKWlmKDE9PT1lLm5vZGVUeXBlKXtpZihpJiZ3KGUpLmlzKG4pKWJyZWFrO3IucHVzaChlKX1yZXR1cm4gcn0sUz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXTtlO2U9ZS5uZXh0U2libGluZykxPT09ZS5ub2RlVHlwZSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn0sRD13LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O2Z1bmN0aW9uIE4oZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfXZhciBBPS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIGooZSx0LG4pe3JldHVybiBnKHQpP3cuZ3JlcChlLGZ1bmN0aW9uKGUscil7cmV0dXJuISF0LmNhbGwoZSxyLGUpIT09bn0pOnQubm9kZVR5cGU/dy5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10IT09bn0pOiJzdHJpbmciIT10eXBlb2YgdD93LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gdS5jYWxsKHQsZSk+LTEhPT1ufSk6dy5maWx0ZXIodCxlLG4pfXcuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP3cuZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106dy5maW5kLm1hdGNoZXMoZSx3LmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LHcuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayh3KGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7dDxyO3QrKylpZih3LmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKXcuZmluZChlLGlbdF0sbik7cmV0dXJuIHI+MT93LnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITApKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFqKHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZELnRlc3QoZSk/dyhlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBxLEw9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsody5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxvO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8cSwic3RyaW5nIj09dHlwZW9mIGUpe2lmKCEoaT0iPCI9PT1lWzBdJiYiPiI9PT1lW2UubGVuZ3RoLTFdJiZlLmxlbmd0aD49Mz9bbnVsbCxlLG51bGxdOkwuZXhlYyhlKSl8fCFpWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoaVsxXSl7aWYodD10IGluc3RhbmNlb2Ygdz90WzBdOnQsdy5tZXJnZSh0aGlzLHcucGFyc2VIVE1MKGlbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6ciwhMCkpLEEudGVzdChpWzFdKSYmdy5pc1BsYWluT2JqZWN0KHQpKWZvcihpIGluIHQpZyh0aGlzW2ldKT90aGlzW2ldKHRbaV0pOnRoaXMuYXR0cihpLHRbaV0pO3JldHVybiB0aGlzfXJldHVybihvPXIuZ2V0RWxlbWVudEJ5SWQoaVsyXSkpJiYodGhpc1swXT1vLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOmcoZSk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KGUpOmUodyk6dy5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT13LmZuLHE9dyhyKTt2YXIgSD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxPPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O3cuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9dyhlLHRoaXMpLG49dC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxuO2UrKylpZih3LmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT0ic3RyaW5nIiE9dHlwZW9mIGUmJncoZSk7aWYoIUQudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZ3LmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKG8ubGVuZ3RoPjE/dy51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/dS5jYWxsKHcoZSksdGhpc1swXSk6dS5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayh3LnVuaXF1ZVNvcnQody5tZXJnZSh0aGlzLmdldCgpLHcoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSk7ZnVuY3Rpb24gUChlLHQpe3doaWxlKChlPWVbdF0pJiYxIT09ZS5ub2RlVHlwZSk7cmV0dXJuIGV9dy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gayhlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gUChlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBQKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGsoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGsoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBrKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBTKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gUyhlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gTihlLCJpZnJhbWUiKT9lLmNvbnRlbnREb2N1bWVudDooTihlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLHcubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24obixyKXt2YXIgaT13Lm1hcCh0aGlzLHQsbik7cmV0dXJuIlVudGlsIiE9PWUuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihpPXcuZmlsdGVyKHIsaSkpLHRoaXMubGVuZ3RoPjEmJihPW2VdfHx3LnVuaXF1ZVNvcnQoaSksSC50ZXN0KGUpJiZpLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2soaSl9fSk7dmFyIE09L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBSKGUpe3ZhciB0PXt9O3JldHVybiB3LmVhY2goZS5tYXRjaChNKXx8W10sZnVuY3Rpb24oZSxuKXt0W25dPSEwfSksdH13LkNhbGxiYWNrcz1mdW5jdGlvbihlKXtlPSJzdHJpbmciPT10eXBlb2YgZT9SKGUpOncuZXh0ZW5kKHt9LGUpO3ZhciB0LG4scixpLG89W10sYT1bXSxzPS0xLHU9ZnVuY3Rpb24oKXtmb3IoaT1pfHxlLm9uY2Uscj10PSEwO2EubGVuZ3RoO3M9LTEpe249YS5zaGlmdCgpO3doaWxlKCsrczxvLmxlbmd0aCkhMT09PW9bc10uYXBwbHkoblswXSxuWzFdKSYmZS5zdG9wT25GYWxzZSYmKHM9by5sZW5ndGgsbj0hMSl9ZS5tZW1vcnl8fChuPSExKSx0PSExLGkmJihvPW4/W106IiIpfSxsPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG4mJiF0JiYocz1vLmxlbmd0aC0xLGEucHVzaChuKSksZnVuY3Rpb24gdChuKXt3LmVhY2gobixmdW5jdGlvbihuLHIpe2cocik/ZS51bmlxdWUmJmwuaGFzKHIpfHxvLnB1c2gocik6ciYmci5sZW5ndGgmJiJzdHJpbmciIT09eChyKSYmdChyKX0pfShhcmd1bWVudHMpLG4mJiF0JiZ1KCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB3LmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGUsdCl7dmFyIG47d2hpbGUoKG49dy5pbkFycmF5KHQsbyxuKSk+LTEpby5zcGxpY2UobiwxKSxuPD1zJiZzLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/dy5pbkFycmF5KGUsbyk+LTE6by5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG89W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gaT1hPVtdLG89bj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFvfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9YT1bXSxufHx0fHwobz1uPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWl9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsbil7cmV0dXJuIGl8fChuPVtlLChuPW58fFtdKS5zbGljZT9uLnNsaWNlKCk6bl0sYS5wdXNoKG4pLHR8fHUoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBsLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBsfTtmdW5jdGlvbiBJKGUpe3JldHVybiBlfWZ1bmN0aW9uIFcoZSl7dGhyb3cgZX1mdW5jdGlvbiAkKGUsdCxuLHIpe3ZhciBpO3RyeXtlJiZnKGk9ZS5wcm9taXNlKT9pLmNhbGwoZSkuZG9uZSh0KS5mYWlsKG4pOmUmJmcoaT1lLnRoZW4pP2kuY2FsbChlLHQsbik6dC5hcHBseSh2b2lkIDAsW2VdLnNsaWNlKHIpKX1jYXRjaChlKXtuLmFwcGx5KHZvaWQgMCxbZV0pfX13LmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24odCl7dmFyIG49W1sibm90aWZ5IiwicHJvZ3Jlc3MiLHcuQ2FsbGJhY2tzKCJtZW1vcnkiKSx3LkNhbGxiYWNrcygibWVtb3J5IiksMl0sWyJyZXNvbHZlIiwiZG9uZSIsdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMCwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLHI9InBlbmRpbmciLGk9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBvLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sImNhdGNoIjpmdW5jdGlvbihlKXtyZXR1cm4gaS50aGVuKG51bGwsZSl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7cmV0dXJuIHcuRGVmZXJyZWQoZnVuY3Rpb24odCl7dy5lYWNoKG4sZnVuY3Rpb24obixyKXt2YXIgaT1nKGVbcls0XV0pJiZlW3JbNF1dO29bclsxXV0oZnVuY3Rpb24oKXt2YXIgZT1pJiZpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlJiZnKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkucHJvZ3Jlc3ModC5ub3RpZnkpLmRvbmUodC5yZXNvbHZlKS5mYWlsKHQucmVqZWN0KTp0W3JbMF0rIldpdGgiXSh0aGlzLGk/W2VdOmFyZ3VtZW50cyl9KX0pLGU9bnVsbH0pLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbih0LHIsaSl7dmFyIG89MDtmdW5jdGlvbiBhKHQsbixyLGkpe3JldHVybiBmdW5jdGlvbigpe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMsbD1mdW5jdGlvbigpe3ZhciBlLGw7aWYoISh0PG8pKXtpZigoZT1yLmFwcGx5KHMsdSkpPT09bi5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7bD1lJiYoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJmUudGhlbixnKGwpP2k/bC5jYWxsKGUsYShvLG4sSSxpKSxhKG8sbixXLGkpKToobysrLGwuY2FsbChlLGEobyxuLEksaSksYShvLG4sVyxpKSxhKG8sbixJLG4ubm90aWZ5V2l0aCkpKToociE9PUkmJihzPXZvaWQgMCx1PVtlXSksKGl8fG4ucmVzb2x2ZVdpdGgpKHMsdSkpfX0sYz1pP2w6ZnVuY3Rpb24oKXt0cnl7bCgpfWNhdGNoKGUpe3cuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYmdy5EZWZlcnJlZC5leGNlcHRpb25Ib29rKGUsYy5zdGFja1RyYWNlKSx0KzE+PW8mJihyIT09VyYmKHM9dm9pZCAwLHU9W2VdKSxuLnJlamVjdFdpdGgocyx1KSl9fTt0P2MoKToody5EZWZlcnJlZC5nZXRTdGFja0hvb2smJihjLnN0YWNrVHJhY2U9dy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksZS5zZXRUaW1lb3V0KGMpKX19cmV0dXJuIHcuRGVmZXJyZWQoZnVuY3Rpb24oZSl7blswXVszXS5hZGQoYSgwLGUsZyhpKT9pOkksZS5ub3RpZnlXaXRoKSksblsxXVszXS5hZGQoYSgwLGUsZyh0KT90OkkpKSxuWzJdWzNdLmFkZChhKDAsZSxnKHIpP3I6VykpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lP3cuZXh0ZW5kKGUsaSk6aX19LG89e307cmV0dXJuIHcuZWFjaChuLGZ1bmN0aW9uKGUsdCl7dmFyIGE9dFsyXSxzPXRbNV07aVt0WzFdXT1hLmFkZCxzJiZhLmFkZChmdW5jdGlvbigpe3I9c30sblszLWVdWzJdLmRpc2FibGUsblszLWVdWzNdLmRpc2FibGUsblswXVsyXS5sb2NrLG5bMF1bM10ubG9jayksYS5hZGQodFszXS5maXJlKSxvW3RbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIG9bdFswXSsiV2l0aCJdKHRoaXM9PT1vP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sb1t0WzBdKyJXaXRoIl09YS5maXJlV2l0aH0pLGkucHJvbWlzZShvKSx0JiZ0LmNhbGwobyxvKSxvfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj10LHI9QXJyYXkobiksaT1vLmNhbGwoYXJndW1lbnRzKSxhPXcuRGVmZXJyZWQoKSxzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuKXtyW2VdPXRoaXMsaVtlXT1hcmd1bWVudHMubGVuZ3RoPjE/by5jYWxsKGFyZ3VtZW50cyk6biwtLXR8fGEucmVzb2x2ZVdpdGgocixpKX19O2lmKHQ8PTEmJigkKGUsYS5kb25lKHMobikpLnJlc29sdmUsYS5yZWplY3QsIXQpLCJwZW5kaW5nIj09PWEuc3RhdGUoKXx8ZyhpW25dJiZpW25dLnRoZW4pKSlyZXR1cm4gYS50aGVuKCk7d2hpbGUobi0tKSQoaVtuXSxzKG4pLGEucmVqZWN0KTtyZXR1cm4gYS5wcm9taXNlKCl9fSk7dmFyIEI9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87dy5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKHQsbil7ZS5jb25zb2xlJiZlLmNvbnNvbGUud2FybiYmdCYmQi50ZXN0KHQubmFtZSkmJmUuY29uc29sZS53YXJuKCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiAiK3QubWVzc2FnZSx0LnN0YWNrLG4pfSx3LnJlYWR5RXhjZXB0aW9uPWZ1bmN0aW9uKHQpe2Uuc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IHR9KX07dmFyIEY9dy5EZWZlcnJlZCgpO3cuZm4ucmVhZHk9ZnVuY3Rpb24oZSl7cmV0dXJuIEYudGhlbihlKVsiY2F0Y2giXShmdW5jdGlvbihlKXt3LnJlYWR5RXhjZXB0aW9uKGUpfSksdGhpc30sdy5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oZSl7KCEwPT09ZT8tLXcucmVhZHlXYWl0OncuaXNSZWFkeSl8fCh3LmlzUmVhZHk9ITAsITAhPT1lJiYtLXcucmVhZHlXYWl0PjB8fEYucmVzb2x2ZVdpdGgocixbd10pKX19KSx3LnJlYWR5LnRoZW49Ri50aGVuO2Z1bmN0aW9uIF8oKXtyLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLF8pLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsXyksdy5yZWFkeSgpfSJjb21wbGV0ZSI9PT1yLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PXIucmVhZHlTdGF0ZSYmIXIuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2Uuc2V0VGltZW91dCh3LnJlYWR5KTooci5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixfKSxlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLF8pKTt2YXIgej1mdW5jdGlvbihlLHQsbixyLGksbyxhKXt2YXIgcz0wLHU9ZS5sZW5ndGgsbD1udWxsPT1uO2lmKCJvYmplY3QiPT09eChuKSl7aT0hMDtmb3IocyBpbiBuKXooZSx0LHMsbltzXSwhMCxvLGEpfWVsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsZyhyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbCh3KGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LFg9L14tbXMtLyxVPS8tKFthLXpdKS9nO2Z1bmN0aW9uIFYoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIEcoZSl7cmV0dXJuIGUucmVwbGFjZShYLCJtcy0iKS5yZXBsYWNlKFUsVil9dmFyIFk9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBRKCl7dGhpcy5leHBhbmRvPXcuZXhwYW5kbytRLnVpZCsrfVEudWlkPTEsUS5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9e30sWShlKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdGhpcy5leHBhbmRvLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pKSksdH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMuY2FjaGUoZSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KWlbRyh0KV09bjtlbHNlIGZvcihyIGluIHQpaVtHKHIpXT10W3JdO3JldHVybiBpfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW0codCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJnZvaWQgMD09PW4/dGhpcy5nZXQoZSx0KToodGhpcy5zZXQoZSx0LG4pLHZvaWQgMCE9PW4/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09dCl7bj0odD1BcnJheS5pc0FycmF5KHQpP3QubWFwKEcpOih0PUcodCkpaW4gcj9bdF06dC5tYXRjaChNKXx8W10pLmxlbmd0aDt3aGlsZShuLS0pZGVsZXRlIHJbdFtuXV19KHZvaWQgMD09PXR8fHcuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIXcuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBKPW5ldyBRLEs9bmV3IFEsWj0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLGVlPS9bQS1aXS9nO2Z1bmN0aW9uIHRlKGUpe3JldHVybiJ0cnVlIj09PWV8fCJmYWxzZSIhPT1lJiYoIm51bGwiPT09ZT9udWxsOmU9PT0rZSsiIj8rZTpaLnRlc3QoZSk/SlNPTi5wYXJzZShlKTplKX1mdW5jdGlvbiBuZShlLHQsbil7dmFyIHI7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShlZSwiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49ZS5nZXRBdHRyaWJ1dGUocikpKXt0cnl7bj10ZShuKX1jYXRjaChlKXt9Sy5zZXQoZSx0LG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59dy5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIEsuaGFzRGF0YShlKXx8Si5oYXNEYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gSy5hY2Nlc3MoZSx0LG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7Sy5yZW1vdmUoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBKLmFjY2VzcyhlLHQsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7Si5yZW1vdmUoZSx0KX19KSx3LmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvPXRoaXNbMF0sYT1vJiZvLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09ZSl7aWYodGhpcy5sZW5ndGgmJihpPUsuZ2V0KG8pLDE9PT1vLm5vZGVUeXBlJiYhSi5nZXQobywiaGFzRGF0YUF0dHJzIikpKXtuPWEubGVuZ3RoO3doaWxlKG4tLSlhW25dJiYwPT09KHI9YVtuXS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpJiYocj1HKHIuc2xpY2UoNSkpLG5lKG8scixpW3JdKSk7Si5zZXQobywiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGl9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP3RoaXMuZWFjaChmdW5jdGlvbigpe0suc2V0KHRoaXMsZSl9KTp6KHRoaXMsZnVuY3Rpb24odCl7dmFyIG47aWYobyYmdm9pZCAwPT09dCl7aWYodm9pZCAwIT09KG49Sy5nZXQobyxlKSkpcmV0dXJuIG47aWYodm9pZCAwIT09KG49bmUobyxlKSkpcmV0dXJuIG59ZWxzZSB0aGlzLmVhY2goZnVuY3Rpb24oKXtLLnNldCh0aGlzLGUsdCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Sy5yZW1vdmUodGhpcyxlKX0pfX0pLHcuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoZSlyZXR1cm4gdD0odHx8ImZ4IikrInF1ZXVlIixyPUouZ2V0KGUsdCksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9Si5hY2Nlc3MoZSx0LHcubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKGUsdCl7dD10fHwiZngiO3ZhciBuPXcucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89dy5fcXVldWVIb29rcyhlLHQpLGE9ZnVuY3Rpb24oKXt3LmRlcXVldWUoZSx0KX07ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGEsbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gSi5nZXQoZSxuKXx8Si5hY2Nlc3MoZSxuLHtlbXB0eTp3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtKLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSx3LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPSJmeCIsbi0tKSxhcmd1bWVudHMubGVuZ3RoPG4/dy5xdWV1ZSh0aGlzWzBdLGUpOnZvaWQgMD09PXQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj13LnF1ZXVlKHRoaXMsZSx0KTt3Ll9xdWV1ZUhvb2tzKHRoaXMsZSksImZ4Ij09PWUmJiJpbnByb2dyZXNzIiE9PW5bMF0mJncuZGVxdWV1ZSh0aGlzLGUpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3cuZGVxdWV1ZSh0aGlzLGUpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTEsaT13LkRlZmVycmVkKCksbz10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8aS5yZXNvbHZlV2l0aChvLFtvXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHwiZngiO3doaWxlKGEtLSkobj1KLmdldChvW2FdLGUrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksaS5wcm9taXNlKHQpfX0pO3ZhciByZT0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxpZT1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrcmUrIikoW2EteiVdKikkIiwiaSIpLG9lPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sYWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmdy5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSkmJiJub25lIj09PXcuY3NzKGUsImRpc3BsYXkiKX0sc2U9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhPXt9O2ZvcihvIGluIHQpYVtvXT1lLnN0eWxlW29dLGUuc3R5bGVbb109dFtvXTtpPW4uYXBwbHkoZSxyfHxbXSk7Zm9yKG8gaW4gdCllLnN0eWxlW29dPWFbb107cmV0dXJuIGl9O2Z1bmN0aW9uIHVlKGUsdCxuLHIpe3ZhciBpLG8sYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gdy5jc3MoZSx0LCIiKX0sdT1zKCksbD1uJiZuWzNdfHwody5jc3NOdW1iZXJbdF0/IiI6InB4IiksYz0ody5jc3NOdW1iZXJbdF18fCJweCIhPT1sJiYrdSkmJmllLmV4ZWMody5jc3MoZSx0KSk7aWYoYyYmY1szXSE9PWwpe3UvPTIsbD1sfHxjWzNdLGM9K3V8fDE7d2hpbGUoYS0tKXcuc3R5bGUoZSx0LGMrbCksKDEtbykqKDEtKG89cygpL3V8fC41KSk8PTAmJihhPTApLGMvPW87Yyo9Mix3LnN0eWxlKGUsdCxjK2wpLG49bnx8W119cmV0dXJuIG4mJihjPStjfHwrdXx8MCxpPW5bMV0/YysoblsxXSsxKSpuWzJdOituWzJdLHImJihyLnVuaXQ9bCxyLnN0YXJ0PWMsci5lbmQ9aSkpLGl9dmFyIGxlPXt9O2Z1bmN0aW9uIGNlKGUpe3ZhciB0LG49ZS5vd25lckRvY3VtZW50LHI9ZS5ub2RlTmFtZSxpPWxlW3JdO3JldHVybiBpfHwodD1uLmJvZHkuYXBwZW5kQ2hpbGQobi5jcmVhdGVFbGVtZW50KHIpKSxpPXcuY3NzKHQsImRpc3BsYXkiKSx0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksIm5vbmUiPT09aSYmKGk9ImJsb2NrIiksbGVbcl09aSxpKX1mdW5jdGlvbiBmZShlLHQpe2Zvcih2YXIgbixyLGk9W10sbz0wLGE9ZS5sZW5ndGg7bzxhO28rKykocj1lW29dKS5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LHQ/KCJub25lIj09PW4mJihpW29dPUouZ2V0KHIsImRpc3BsYXkiKXx8bnVsbCxpW29dfHwoci5zdHlsZS5kaXNwbGF5PSIiKSksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJmFlKHIpJiYoaVtvXT1jZShyKSkpOiJub25lIiE9PW4mJihpW29dPSJub25lIixKLnNldChyLCJkaXNwbGF5IixuKSkpO2ZvcihvPTA7bzxhO28rKyludWxsIT1pW29dJiYoZVtvXS5zdHlsZS5kaXNwbGF5PWlbb10pO3JldHVybiBlfXcuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIGZlKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIGZlKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2FlKHRoaXMpP3codGhpcykuc2hvdygpOncodGhpcykuaGlkZSgpfSl9fSk7dmFyIHBlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLGRlPS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pLGhlPS9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxnZT17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2dlLm9wdGdyb3VwPWdlLm9wdGlvbixnZS50Ym9keT1nZS50Zm9vdD1nZS5jb2xncm91cD1nZS5jYXB0aW9uPWdlLnRoZWFkLGdlLnRoPWdlLnRkO2Z1bmN0aW9uIHllKGUsdCl7dmFyIG47cmV0dXJuIG49InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHx8IioiKToidW5kZWZpbmVkIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbD9lLnF1ZXJ5U2VsZWN0b3JBbGwodHx8IioiKTpbXSx2b2lkIDA9PT10fHx0JiZOKGUsdCk/dy5tZXJnZShbZV0sbik6bn1mdW5jdGlvbiB2ZShlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylKLnNldChlW25dLCJnbG9iYWxFdmFsIiwhdHx8Si5nZXQodFtuXSwiZ2xvYmFsRXZhbCIpKX12YXIgbWU9Lzx8JiM/XHcrOy87ZnVuY3Rpb24geGUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZigib2JqZWN0Ij09PXgobykpdy5tZXJnZShwLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYobWUudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KGRlLmV4ZWMobyl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1nZVtzXXx8Z2UuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXSt3Lmh0bWxQcmVmaWx0ZXIobykrdVsyXSxjPXVbMF07d2hpbGUoYy0tKWE9YS5sYXN0Q2hpbGQ7dy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtmLnRleHRDb250ZW50PSIiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiZ3LmluQXJyYXkobyxyKT4tMSlpJiZpLnB1c2gobyk7ZWxzZSBpZihsPXcuY29udGFpbnMoby5vd25lckRvY3VtZW50LG8pLGE9eWUoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksbCYmdmUoYSksbil7Yz0wO3doaWxlKG89YVtjKytdKWhlLnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKX1yZXR1cm4gZn0hZnVuY3Rpb24oKXt2YXIgZT1yLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChyLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSx0PXIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksdC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksZS5hcHBlbmRDaGlsZCh0KSxoLmNoZWNrQ2xvbmU9ZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsZS5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLGgubm9DbG9uZUNoZWNrZWQ9ISFlLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZX0oKTt2YXIgYmU9ci5kb2N1bWVudEVsZW1lbnQsd2U9L15rZXkvLFRlPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxDZT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gRWUoKXtyZXR1cm4hMH1mdW5jdGlvbiBrZSgpe3JldHVybiExfWZ1bmN0aW9uIFNlKCl7dHJ5e3JldHVybiByLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX1mdW5jdGlvbiBEZShlLHQsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIHQpeyJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCk7Zm9yKHMgaW4gdClEZShlLHMsbixyLHRbc10sbyk7cmV0dXJuIGV9aWYobnVsbD09ciYmbnVsbD09aT8oaT1uLHI9bj12b2lkIDApOm51bGw9PWkmJigic3RyaW5nIj09dHlwZW9mIG4/KGk9cixyPXZvaWQgMCk6KGk9cixyPW4sbj12b2lkIDApKSwhMT09PWkpaT1rZTtlbHNlIGlmKCFpKXJldHVybiBlO3JldHVybiAxPT09byYmKGE9aSwoaT1mdW5jdGlvbihlKXtyZXR1cm4gdygpLm9mZihlKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPXcuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC5hZGQodGhpcyx0LGkscixuKX0pfXcuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHk9Si5nZXQoZSk7aWYoeSl7bi5oYW5kbGVyJiYobj0obz1uKS5oYW5kbGVyLGk9by5zZWxlY3RvciksaSYmdy5maW5kLm1hdGNoZXNTZWxlY3RvcihiZSxpKSxuLmd1aWR8fChuLmd1aWQ9dy5ndWlkKyspLCh1PXkuZXZlbnRzKXx8KHU9eS5ldmVudHM9e30pLChhPXkuaGFuZGxlKXx8KGE9eS5oYW5kbGU9ZnVuY3Rpb24odCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB3JiZ3LmV2ZW50LnRyaWdnZXJlZCE9PXQudHlwZT93LmV2ZW50LmRpc3BhdGNoLmFwcGx5KGUsYXJndW1lbnRzKTp2b2lkIDB9KSxsPSh0PSh0fHwiIikubWF0Y2goTSl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0pZD1nPShzPUNlLmV4ZWModFtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShpP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkLGY9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxjPXcuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJncuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LG8pLChwPXVbZF0pfHwoKHA9dVtkXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKGUscixoLGEpfHxlLmFkZEV2ZW50TGlzdGVuZXImJmUuYWRkRXZlbnRMaXN0ZW5lcihkLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwoZSxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpwLnB1c2goYyksdy5ldmVudC5nbG9iYWxbZF09ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx5PUouaGFzRGF0YShlKSYmSi5nZXQoZSk7aWYoeSYmKHU9eS5ldmVudHMpKXtsPSh0PSh0fHwiIikubWF0Y2goTSl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0paWYocz1DZS5leGVjKHRbbF0pfHxbXSxkPWc9c1sxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7Zj13LmV2ZW50LnNwZWNpYWxbZF18fHt9LHA9dVtkPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJigiKioiIT09cnx8IWMuc2VsZWN0b3IpfHwocC5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbChlLGMpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbChlLGgseS5oYW5kbGUpfHx3LnJlbW92ZUV2ZW50KGUsZCx5LmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSl3LmV2ZW50LnJlbW92ZShlLGQrdFtsXSxuLHIsITApO3cuaXNFbXB0eU9iamVjdCh1KSYmSi5yZW1vdmUoZSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5ldmVudC5maXgoZSksbixyLGksbyxhLHMsdT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksbD0oSi5nZXQodGhpcywiZXZlbnRzIil8fHt9KVt0LnR5cGVdfHxbXSxjPXcuZXZlbnQuc3BlY2lhbFt0LnR5cGVdfHx7fTtmb3IodVswXT10LG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXVbbl09YXJndW1lbnRzW25dO2lmKHQuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8ITEhPT1jLnByZURpc3BhdGNoLmNhbGwodGhpcyx0KSl7cz13LmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyx0LGwpLG49MDt3aGlsZSgobz1zW24rK10pJiYhdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXt0LmN1cnJlbnRUYXJnZXQ9by5lbGVtLHI9MDt3aGlsZSgoYT1vLmhhbmRsZXJzW3IrK10pJiYhdC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKXQucm5hbWVzcGFjZSYmIXQucm5hbWVzcGFjZS50ZXN0KGEubmFtZXNwYWNlKXx8KHQuaGFuZGxlT2JqPWEsdC5kYXRhPWEuZGF0YSx2b2lkIDAhPT0oaT0oKHcuZXZlbnQuc3BlY2lhbFthLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8YS5oYW5kbGVyKS5hcHBseShvLmVsZW0sdSkpJiYhMT09PSh0LnJlc3VsdD1pKSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsdCksdC5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoImNsaWNrIj09PWUudHlwZSYmZS5idXR0b24+PTEpKWZvcig7bCE9PXRoaXM7bD1sLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWwubm9kZVR5cGUmJigiY2xpY2siIT09ZS50eXBlfHwhMCE9PWwuZGlzYWJsZWQpKXtmb3Iobz1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbaT0ocj10W25dKS5zZWxlY3RvcisiICJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD93KGksdGhpcykuaW5kZXgobCk+LTE6dy5maW5kKGksdGhpcyxudWxsLFtsXSkubGVuZ3RoKSxhW2ldJiZvLnB1c2gocik7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOm99KX1yZXR1cm4gbD10aGlzLHU8dC5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOnQuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHcuRXZlbnQucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpnKHQpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0KHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbZV19LHNldDpmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVt3LmV4cGFuZG9dP2U6bmV3IHcuRXZlbnQoZSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXMhPT1TZSgpJiZ0aGlzLmZvY3VzKXJldHVybiB0aGlzLmZvY3VzKCksITF9LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzPT09U2UoKSYmdGhpcy5ibHVyKXJldHVybiB0aGlzLmJsdXIoKSwhMX0sZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGNsaWNrOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYoImNoZWNrYm94Ij09PXRoaXMudHlwZSYmdGhpcy5jbGljayYmTih0aGlzLCJpbnB1dCIpKXJldHVybiB0aGlzLmNsaWNrKCksITF9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3JldHVybiBOKGUudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnJlc3VsdCYmZS5vcmlnaW5hbEV2ZW50JiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fX0sdy5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0sdy5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHcuRXZlbnQpKXJldHVybiBuZXcgdy5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlP0VlOmtlLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJncuZXh0ZW5kKHRoaXMsdCksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1t3LmV4cGFuZG9dPSEwfSx3LkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6dy5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6a2UsaXNQcm9wYWdhdGlvblN0b3BwZWQ6a2UsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6a2UsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUVlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSx3LmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsImNoYXIiOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYnV0dG9uO3JldHVybiBudWxsPT1lLndoaWNoJiZ3ZS50ZXN0KGUudHlwZSk/bnVsbCE9ZS5jaGFyQ29kZT9lLmNoYXJDb2RlOmUua2V5Q29kZTohZS53aGljaCYmdm9pZCAwIT09dCYmVGUudGVzdChlLnR5cGUpPzEmdD8xOjImdD8zOjQmdD8yOjA6ZS53aGljaH19LHcuZXZlbnQuYWRkUHJvcCksdy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLHQpe3cuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LG89ZS5oYW5kbGVPYmo7cmV0dXJuIGkmJihpPT09cnx8dy5jb250YWlucyhyLGkpKXx8KGUudHlwZT1vLm9yaWdUeXBlLG49by5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnR5cGU9dCksbn19fSksdy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBEZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIERlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLHcoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PXQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0fHwobj10LHQ9dm9pZCAwKSwhMT09PW4mJihuPWtlKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt3LmV2ZW50LnJlbW92ZSh0aGlzLGUsbix0KX0pfX0pO3ZhciBOZT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksQWU9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksamU9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2kscWU9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nO2Z1bmN0aW9uIExlKGUsdCl7cmV0dXJuIE4oZSwidGFibGUiKSYmTigxMSE9PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIik/dyhlKS5jaGlsZHJlbigidGJvZHkiKVswXXx8ZTplfWZ1bmN0aW9uIEhlKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gT2UoZSl7cmV0dXJuInRydWUvIj09PShlLnR5cGV8fCIiKS5zbGljZSgwLDUpP2UudHlwZT1lLnR5cGUuc2xpY2UoNSk6ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIFBlKGUsdCl7dmFyIG4scixpLG8sYSxzLHUsbDtpZigxPT09dC5ub2RlVHlwZSl7aWYoSi5oYXNEYXRhKGUpJiYobz1KLmFjY2VzcyhlKSxhPUouc2V0KHQsbyksbD1vLmV2ZW50cykpe2RlbGV0ZSBhLmhhbmRsZSxhLmV2ZW50cz17fTtmb3IoaSBpbiBsKWZvcihuPTAscj1sW2ldLmxlbmd0aDtuPHI7bisrKXcuZXZlbnQuYWRkKHQsaSxsW2ldW25dKX1LLmhhc0RhdGEoZSkmJihzPUsuYWNjZXNzKGUpLHU9dy5leHRlbmQoe30scyksSy5zZXQodCx1KSl9fWZ1bmN0aW9uIE1lKGUsdCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyJpbnB1dCI9PT1uJiZwZS50ZXN0KGUudHlwZSk/dC5jaGVja2VkPWUuY2hlY2tlZDoiaW5wdXQiIT09biYmInRleHRhcmVhIiE9PW58fCh0LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gUmUoZSx0LG4scil7dD1hLmFwcGx5KFtdLHQpO3ZhciBpLG8scyx1LGwsYyxmPTAscD1lLmxlbmd0aCxkPXAtMSx5PXRbMF0sdj1nKHkpO2lmKHZ8fHA+MSYmInN0cmluZyI9PXR5cGVvZiB5JiYhaC5jaGVja0Nsb25lJiZqZS50ZXN0KHkpKXJldHVybiBlLmVhY2goZnVuY3Rpb24oaSl7dmFyIG89ZS5lcShpKTt2JiYodFswXT15LmNhbGwodGhpcyxpLG8uaHRtbCgpKSksUmUobyx0LG4scil9KTtpZihwJiYoaT14ZSh0LGVbMF0ub3duZXJEb2N1bWVudCwhMSxlLHIpLG89aS5maXJzdENoaWxkLDE9PT1pLmNoaWxkTm9kZXMubGVuZ3RoJiYoaT1vKSxvfHxyKSl7Zm9yKHU9KHM9dy5tYXAoeWUoaSwic2NyaXB0IiksSGUpKS5sZW5ndGg7ZjxwO2YrKylsPWksZiE9PWQmJihsPXcuY2xvbmUobCwhMCwhMCksdSYmdy5tZXJnZShzLHllKGwsInNjcmlwdCIpKSksbi5jYWxsKGVbZl0sbCxmKTtpZih1KWZvcihjPXNbcy5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCx3Lm1hcChzLE9lKSxmPTA7Zjx1O2YrKylsPXNbZl0saGUudGVzdChsLnR5cGV8fCIiKSYmIUouYWNjZXNzKGwsImdsb2JhbEV2YWwiKSYmdy5jb250YWlucyhjLGwpJiYobC5zcmMmJiJtb2R1bGUiIT09KGwudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/dy5fZXZhbFVybCYmdy5fZXZhbFVybChsLnNyYyk6bShsLnRleHRDb250ZW50LnJlcGxhY2UocWUsIiIpLGMsbCkpfXJldHVybiBlfWZ1bmN0aW9uIEllKGUsdCxuKXtmb3IodmFyIHIsaT10P3cuZmlsdGVyKHQsZSk6ZSxvPTA7bnVsbCE9KHI9aVtvXSk7bysrKW58fDEhPT1yLm5vZGVUeXBlfHx3LmNsZWFuRGF0YSh5ZShyKSksci5wYXJlbnROb2RlJiYobiYmdy5jb250YWlucyhyLm93bmVyRG9jdW1lbnQscikmJnZlKHllKHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiBlfXcuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoTmUsIjwkMT48LyQyPiIpfSxjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNsb25lTm9kZSghMCksdT13LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKTtpZighKGgubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fHcuaXNYTUxEb2MoZSkpKWZvcihhPXllKHMpLHI9MCxpPShvPXllKGUpKS5sZW5ndGg7cjxpO3IrKylNZShvW3JdLGFbcl0pO2lmKHQpaWYobilmb3Iobz1vfHx5ZShlKSxhPWF8fHllKHMpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspUGUob1tyXSxhW3JdKTtlbHNlIFBlKGUscyk7cmV0dXJuKGE9eWUocywic2NyaXB0IikpLmxlbmd0aD4wJiZ2ZShhLCF1JiZ5ZShlLCJzY3JpcHQiKSksc30sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHIsaT13LmV2ZW50LnNwZWNpYWwsbz0wO3ZvaWQgMCE9PShuPWVbb10pO28rKylpZihZKG4pKXtpZih0PW5bSi5leHBhbmRvXSl7aWYodC5ldmVudHMpZm9yKHIgaW4gdC5ldmVudHMpaVtyXT93LmV2ZW50LnJlbW92ZShuLHIpOncucmVtb3ZlRXZlbnQobixyLHQuaGFuZGxlKTtuW0ouZXhwYW5kb109dm9pZCAwfW5bSy5leHBhbmRvXSYmKG5bSy5leHBhbmRvXT12b2lkIDApfX19KSx3LmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiBJZSh0aGlzLGUsITApfSxyZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIEllKHRoaXMsZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHoodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT93LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUmUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fExlKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9TGUodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYody5jbGVhbkRhdGEoeWUoZSwhMSkpLGUudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB3LmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIUFlLnRlc3QoZSkmJiFnZVsoZGUuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9dy5odG1sUHJlZmlsdGVyKGUpO3RyeXtmb3IoO248cjtuKyspMT09PSh0PXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKHcuY2xlYW5EYXRhKHllKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIFJlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTt3LmluQXJyYXkodGhpcyxlKTwwJiYody5jbGVhbkRhdGEoeWUodGhpcykpLG4mJm4ucmVwbGFjZUNoaWxkKHQsdGhpcykpfSxlKX19KSx3LmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLHI9W10saT13KGUpLG89aS5sZW5ndGgtMSxhPTA7YTw9bzthKyspbj1hPT09bz90aGlzOnRoaXMuY2xvbmUoITApLHcoaVthXSlbdF0obikscy5hcHBseShyLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhyKX19KTt2YXIgV2U9bmV3IFJlZ0V4cCgiXigiK3JlKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksJGU9ZnVuY3Rpb24odCl7dmFyIG49dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiBuJiZuLm9wZW5lcnx8KG49ZSksbi5nZXRDb21wdXRlZFN0eWxlKHQpfSxCZT1uZXcgUmVnRXhwKG9lLmpvaW4oInwiKSwiaSIpOyFmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtpZihjKXtsLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGMuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIsYmUuYXBwZW5kQ2hpbGQobCkuYXBwZW5kQ2hpbGQoYyk7dmFyIHQ9ZS5nZXRDb21wdXRlZFN0eWxlKGMpO2k9IjElIiE9PXQudG9wLHU9MTI9PT1uKHQubWFyZ2luTGVmdCksYy5zdHlsZS5yaWdodD0iNjAlIixzPTM2PT09bih0LnJpZ2h0KSxvPTM2PT09bih0LndpZHRoKSxjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYT0zNj09PWMub2Zmc2V0V2lkdGh8fCJhYnNvbHV0ZSIsYmUucmVtb3ZlQ2hpbGQobCksYz1udWxsfX1mdW5jdGlvbiBuKGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBpLG8sYSxzLHUsbD1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ci5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLnN0eWxlJiYoYy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixoLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09Yy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCx3LmV4dGVuZChoLHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiB0KCksb30scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHN9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLGl9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiB0KCksdX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0KCksYX19KSl9KCk7ZnVuY3Rpb24gRmUoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5zdHlsZTtyZXR1cm4obj1ufHwkZShlKSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSl8fHcuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHwoYT13LnN0eWxlKGUsdCkpLCFoLnBpeGVsQm94U3R5bGVzKCkmJldlLnRlc3QoYSkmJkJlLnRlc3QodCkmJihyPXMud2lkdGgsaT1zLm1pbldpZHRoLG89cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1pLHMubWF4V2lkdGg9bykpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uIF9lKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX12YXIgemU9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFhlPS9eLS0vLFVlPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxWZT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn0sR2U9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFllPXIuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7ZnVuY3Rpb24gUWUoZSl7aWYoZSBpbiBZZSlyZXR1cm4gZTt2YXIgdD1lWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPUdlLmxlbmd0aDt3aGlsZShuLS0paWYoKGU9R2Vbbl0rdClpbiBZZSlyZXR1cm4gZX1mdW5jdGlvbiBKZShlKXt2YXIgdD13LmNzc1Byb3BzW2VdO3JldHVybiB0fHwodD13LmNzc1Byb3BzW2VdPVFlKGUpfHxlKSx0fWZ1bmN0aW9uIEtlKGUsdCxuKXt2YXIgcj1pZS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTp0fWZ1bmN0aW9uIFplKGUsdCxuLHIsaSxvKXt2YXIgYT0id2lkdGgiPT09dD8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPXcuY3NzKGUsbitvZVthXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHUtPXcuY3NzKGUsInBhZGRpbmciK29lW2FdLCEwLGkpKSwibWFyZ2luIiE9PW4mJih1LT13LmNzcyhlLCJib3JkZXIiK29lW2FdKyJXaWR0aCIsITAsaSkpKToodSs9dy5jc3MoZSwicGFkZGluZyIrb2VbYV0sITAsaSksInBhZGRpbmciIT09bj91Kz13LmNzcyhlLCJib3JkZXIiK29lW2FdKyJXaWR0aCIsITAsaSk6cys9dy5jc3MoZSwiYm9yZGVyIitvZVthXSsiV2lkdGgiLCEwLGkpKTtyZXR1cm4hciYmbz49MCYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSkpLHV9ZnVuY3Rpb24gZXQoZSx0LG4pe3ZhciByPSRlKGUpLGk9RmUoZSx0LHIpLG89ImJvcmRlci1ib3giPT09dy5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSxhPW87aWYoV2UudGVzdChpKSl7aWYoIW4pcmV0dXJuIGk7aT0iYXV0byJ9cmV0dXJuIGE9YSYmKGguYm94U2l6aW5nUmVsaWFibGUoKXx8aT09PWUuc3R5bGVbdF0pLCgiYXV0byI9PT1pfHwhcGFyc2VGbG9hdChpKSYmImlubGluZSI9PT13LmNzcyhlLCJkaXNwbGF5IiwhMSxyKSkmJihpPWVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLGE9ITApLChpPXBhcnNlRmxvYXQoaSl8fDApK1plKGUsdCxufHwobz8iYm9yZGVyIjoiY29udGVudCIpLGEscixpKSsicHgifXcuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49RmUoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8sYSxzPUcodCksdT1YZS50ZXN0KHQpLGw9ZS5zdHlsZTtpZih1fHwodD1KZShzKSksYT13LmNzc0hvb2tzW3RdfHx3LmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KGk9YS5nZXQoZSwhMSxyKSk/aTpsW3RdOyJzdHJpbmciPT0obz10eXBlb2YgbikmJihpPWllLmV4ZWMobikpJiZpWzFdJiYobj11ZShlLHQsaSksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09PW4mJigibnVtYmVyIj09PW8mJihuKz1pJiZpWzNdfHwody5jc3NOdW1iZXJbc10/IiI6InB4IikpLGguY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT10LmluZGV4T2YoImJhY2tncm91bmQiKXx8KGxbdF09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KGUsbixyKSl8fCh1P2wuc2V0UHJvcGVydHkodCxuKTpsW3RdPW4pKX19LGNzczpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1HKHQpO3JldHVybiBYZS50ZXN0KHQpfHwodD1KZShzKSksKGE9dy5jc3NIb29rc1t0XXx8dy5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9RmUoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gVmUmJihpPVZlW3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSwhMD09PW58fGlzRmluaXRlKG8pP298fDA6aSk6aX19KSx3LmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGUsdCl7dy5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbixyKXtpZihuKXJldHVybiF6ZS50ZXN0KHcuY3NzKGUsImRpc3BsYXkiKSl8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/ZXQoZSx0LHIpOnNlKGUsVWUsZnVuY3Rpb24oKXtyZXR1cm4gZXQoZSx0LHIpfSl9LHNldDpmdW5jdGlvbihlLG4scil7dmFyIGksbz0kZShlKSxhPSJib3JkZXItYm94Ij09PXcuY3NzKGUsImJveFNpemluZyIsITEsbykscz1yJiZaZShlLHQscixhLG8pO3JldHVybiBhJiZoLnNjcm9sbGJveFNpemUoKT09PW8ucG9zaXRpb24mJihzLT1NYXRoLmNlaWwoZVsib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tcGFyc2VGbG9hdChvW3RdKS1aZShlLHQsImJvcmRlciIsITEsbyktLjUpKSxzJiYoaT1pZS5leGVjKG4pKSYmInB4IiE9PShpWzNdfHwicHgiKSYmKGUuc3R5bGVbdF09bixuPXcuY3NzKGUsdCkpLEtlKGUsbixzKX19fSksdy5jc3NIb29rcy5tYXJnaW5MZWZ0PV9lKGgucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChGZShlLCJtYXJnaW5MZWZ0IikpfHxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtc2UoZSx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLHcuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGUsdCl7dy5jc3NIb29rc1tlK3RdPXtleHBhbmQ6ZnVuY3Rpb24obil7Zm9yKHZhciByPTAsaT17fSxvPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO3I8NDtyKyspaVtlK29lW3JdK3RdPW9bcl18fG9bci0yXXx8b1swXTtyZXR1cm4gaX19LCJtYXJnaW4iIT09ZSYmKHcuY3NzSG9va3NbZSt0XS5zZXQ9S2UpfSksdy5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fSxhPTA7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHI9JGUoZSksaT10Lmxlbmd0aDthPGk7YSsrKW9bdFthXV09dy5jc3MoZSx0W2FdLCExLHIpO3JldHVybiBvfXJldHVybiB2b2lkIDAhPT1uP3cuc3R5bGUoZSx0LG4pOncuY3NzKGUsdCl9LGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfX0pO2Z1bmN0aW9uIHR0KGUsdCxuLHIsaSl7cmV0dXJuIG5ldyB0dC5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfXcuVHdlZW49dHQsdHQucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0dCxpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHx3LmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9b3x8KHcuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgZT10dC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6dHQucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49dHQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz10PXcuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTp0dC5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSx0dC5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9dHQucHJvdG90eXBlLHR0LnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gMSE9PWUuZWxlbS5ub2RlVHlwZXx8bnVsbCE9ZS5lbGVtW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtlLnByb3BdP2UuZWxlbVtlLnByb3BdOih0PXcuY3NzKGUuZWxlbSxlLnByb3AsIiIpKSYmImF1dG8iIT09dD90OjB9LHNldDpmdW5jdGlvbihlKXt3LmZ4LnN0ZXBbZS5wcm9wXT93LmZ4LnN0ZXBbZS5wcm9wXShlKToxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsPT1lLmVsZW0uc3R5bGVbdy5jc3NQcm9wc1tlLnByb3BdXSYmIXcuY3NzSG9va3NbZS5wcm9wXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzp3LnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSx0dC5wcm9wSG9va3Muc2Nyb2xsVG9wPXR0LnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LHcuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sdy5meD10dC5wcm90b3R5cGUuaW5pdCx3LmZ4LnN0ZXA9e307dmFyIG50LHJ0LGl0PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxvdD0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIGF0KCl7cnQmJighMT09PXIuaGlkZGVuJiZlLnJlcXVlc3RBbmltYXRpb25GcmFtZT9lLnJlcXVlc3RBbmltYXRpb25GcmFtZShhdCk6ZS5zZXRUaW1lb3V0KGF0LHcuZnguaW50ZXJ2YWwpLHcuZngudGljaygpKX1mdW5jdGlvbiBzdCgpe3JldHVybiBlLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtudD12b2lkIDB9KSxudD1EYXRlLm5vdygpfWZ1bmN0aW9uIHV0KGUsdCl7dmFyIG4scj0wLGk9e2hlaWdodDplfTtmb3IodD10PzE6MDtyPDQ7cis9Mi10KWlbIm1hcmdpbiIrKG49b2Vbcl0pXT1pWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoaS5vcGFjaXR5PWkud2lkdGg9ZSksaX1mdW5jdGlvbiBsdChlLHQsbil7Zm9yKHZhciByLGk9KHB0LnR3ZWVuZXJzW3RdfHxbXSkuY29uY2F0KHB0LnR3ZWVuZXJzWyIqIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGN0KGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLGY9IndpZHRoImluIHR8fCJoZWlnaHQiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZhZShlKSx5PUouZ2V0KGUsImZ4c2hvdyIpO24ucXVldWV8fChudWxsPT0oYT13Ll9xdWV1ZUhvb2tzKGUsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLHcucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSk7Zm9yKHIgaW4gdClpZihpPXRbcl0saXQudGVzdChpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1pfHwheXx8dm9pZCAwPT09eVtyXSljb250aW51ZTtnPSEwfWRbcl09eSYmeVtyXXx8dy5zdHlsZShlLHIpfWlmKCh1PSF3LmlzRW1wdHlPYmplY3QodCkpfHwhdy5pc0VtcHR5T2JqZWN0KGQpKXtmJiYxPT09ZS5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2gub3ZlcmZsb3csaC5vdmVyZmxvd1gsaC5vdmVyZmxvd1ldLG51bGw9PShsPXkmJnkuZGlzcGxheSkmJihsPUouZ2V0KGUsImRpc3BsYXkiKSksIm5vbmUiPT09KGM9dy5jc3MoZSwiZGlzcGxheSIpKSYmKGw/Yz1sOihmZShbZV0sITApLGw9ZS5zdHlsZS5kaXNwbGF5fHxsLGM9dy5jc3MoZSwiZGlzcGxheSIpLGZlKFtlXSkpKSwoImlubGluZSI9PT1jfHwiaW5saW5lLWJsb2NrIj09PWMmJm51bGwhPWwpJiYibm9uZSI9PT13LmNzcyhlLCJmbG9hdCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2guZGlzcGxheT1sfSksbnVsbD09bCYmKGM9aC5kaXNwbGF5LGw9Im5vbmUiPT09Yz8iIjpjKSksaC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKGgub3ZlcmZsb3c9ImhpZGRlbiIscC5hbHdheXMoZnVuY3Rpb24oKXtoLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0saC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxoLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITE7Zm9yKHIgaW4gZCl1fHwoeT8iaGlkZGVuImluIHkmJihnPXkuaGlkZGVuKTp5PUouYWNjZXNzKGUsImZ4c2hvdyIse2Rpc3BsYXk6bH0pLG8mJih5LmhpZGRlbj0hZyksZyYmZmUoW2VdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtnfHxmZShbZV0pLEoucmVtb3ZlKGUsImZ4c2hvdyIpO2ZvcihyIGluIGQpdy5zdHlsZShlLHIsZFtyXSl9KSksdT1sdChnP3lbcl06MCxyLHApLHIgaW4geXx8KHlbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX19ZnVuY3Rpb24gZnQoZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYocj1HKG4pLGk9dFtyXSxvPWVbbl0sQXJyYXkuaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLChhPXcuY3NzSG9va3Nbcl0pJiYiZXhwYW5kImluIGEpe289YS5leHBhbmQobyksZGVsZXRlIGVbcl07Zm9yKG4gaW4gbyluIGluIGV8fChlW25dPW9bbl0sdFtuXT1pKX1lbHNlIHRbcl09aX1mdW5jdGlvbiBwdChlLHQsbil7dmFyIHIsaSxvPTAsYT1wdC5wcmVmaWx0ZXJzLmxlbmd0aCxzPXcuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKGkpcmV0dXJuITE7Zm9yKHZhciB0PW50fHxzdCgpLG49TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLXQpLHI9MS0obi9sLmR1cmF0aW9ufHwwKSxvPTAsYT1sLnR3ZWVucy5sZW5ndGg7bzxhO28rKylsLnR3ZWVuc1tvXS5ydW4ocik7cmV0dXJuIHMubm90aWZ5V2l0aChlLFtsLHIsbl0pLHI8MSYmYT9uOihhfHxzLm5vdGlmeVdpdGgoZSxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKGUsW2xdKSwhMSl9LGw9cy5wcm9taXNlKHtlbGVtOmUscHJvcHM6dy5leHRlbmQoe30sdCksb3B0czp3LmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6dy5lYXNpbmcuX2RlZmF1bHR9LG4pLG9yaWdpbmFsUHJvcGVydGllczp0LG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTpudHx8c3QoKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciByPXcuVHdlZW4oZSxsLm9wdHMsdCxuLGwub3B0cy5zcGVjaWFsRWFzaW5nW3RdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPTAscj10P2wudHdlZW5zLmxlbmd0aDowO2lmKGkpcmV0dXJuIHRoaXM7Zm9yKGk9ITA7bjxyO24rKylsLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIHQ/KHMubm90aWZ5V2l0aChlLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgoZSxbbCx0XSkpOnMucmVqZWN0V2l0aChlLFtsLHRdKSx0aGlzfX0pLGM9bC5wcm9wcztmb3IoZnQoYyxsLm9wdHMuc3BlY2lhbEVhc2luZyk7bzxhO28rKylpZihyPXB0LnByZWZpbHRlcnNbb10uY2FsbChsLGUsYyxsLm9wdHMpKXJldHVybiBnKHIuc3RvcCkmJih3Ll9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0b3A9ci5zdG9wLmJpbmQocikpLHI7cmV0dXJuIHcubWFwKGMsbHQsbCksZyhsLm9wdHMuc3RhcnQpJiZsLm9wdHMuc3RhcnQuY2FsbChlLGwpLGwucHJvZ3Jlc3MobC5vcHRzLnByb2dyZXNzKS5kb25lKGwub3B0cy5kb25lLGwub3B0cy5jb21wbGV0ZSkuZmFpbChsLm9wdHMuZmFpbCkuYWx3YXlzKGwub3B0cy5hbHdheXMpLHcuZngudGltZXIody5leHRlbmQodSx7ZWxlbTplLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbH13LkFuaW1hdGlvbj13LmV4dGVuZChwdCx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKGUsdCk7cmV0dXJuIHVlKG4uZWxlbSxlLGllLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7ZyhlKT8odD1lLGU9WyIqIl0pOmU9ZS5tYXRjaChNKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluPWVbcl0scHQudHdlZW5lcnNbbl09cHQudHdlZW5lcnNbbl18fFtdLHB0LnR3ZWVuZXJzW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W2N0XSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P3B0LnByZWZpbHRlcnMudW5zaGlmdChlKTpwdC5wcmVmaWx0ZXJzLnB1c2goZSl9fSksdy5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP3cuZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8ZyhlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYhZyh0KSYmdH07cmV0dXJuIHcuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIHcuZnguc3BlZWRzP3IuZHVyYXRpb249dy5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj13LmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXtnKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZ3LmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sdy5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoYWUpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXcuaXNFbXB0eU9iamVjdChlKSxvPXcuc3BlZWQodCxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgdD1wdCh0aGlzLHcuZXh0ZW5kKHt9LGUpLG8pOyhpfHxKLmdldCh0aGlzLCJmaW5pc2giKSkmJnQuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fCExPT09by5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG4pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihuPXQsdD1lLGU9dm9pZCAwKSx0JiYhMSE9PWUmJnRoaXMucXVldWUoZXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ITAsaT1udWxsIT1lJiZlKyJxdWV1ZUhvb2tzIixvPXcudGltZXJzLGE9Si5nZXQodGhpcyk7aWYoaSlhW2ldJiZhW2ldLnN0b3AmJnIoYVtpXSk7ZWxzZSBmb3IoaSBpbiBhKWFbaV0mJmFbaV0uc3RvcCYmb3QudGVzdChpKSYmcihhW2ldKTtmb3IoaT1vLmxlbmd0aDtpLS07KW9baV0uZWxlbSE9PXRoaXN8fG51bGwhPWUmJm9baV0ucXVldWUhPT1lfHwob1tpXS5hbmltLnN0b3AobiksdD0hMSxvLnNwbGljZShpLDEpKTshdCYmbnx8dy5kZXF1ZXVlKHRoaXMsZSl9KX0sZmluaXNoOmZ1bmN0aW9uKGUpe3JldHVybiExIT09ZSYmKGU9ZXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQsbj1KLmdldCh0aGlzKSxyPW5bZSsicXVldWUiXSxpPW5bZSsicXVldWVIb29rcyJdLG89dy50aW1lcnMsYT1yP3IubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLHcucXVldWUodGhpcyxlLFtdKSxpJiZpLnN0b3AmJmkuc3RvcC5jYWxsKHRoaXMsITApLHQ9by5sZW5ndGg7dC0tOylvW3RdLmVsZW09PT10aGlzJiZvW3RdLnF1ZXVlPT09ZSYmKG9bdF0uYW5pbS5zdG9wKCEwKSxvLnNwbGljZSh0LDEpKTtmb3IodD0wO3Q8YTt0Kyspclt0XSYmclt0XS5maW5pc2gmJnJbdF0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIG4uZmluaXNofSl9fSksdy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHQpe3ZhciBuPXcuZm5bdF07dy5mblt0XT1mdW5jdGlvbihlLHIsaSl7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09dHlwZW9mIGU/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKHV0KHQsITApLGUscixpKX19KSx3LmVhY2goe3NsaWRlRG93bjp1dCgic2hvdyIpLHNsaWRlVXA6dXQoImhpZGUiKSxzbGlkZVRvZ2dsZTp1dCgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSksdy50aW1lcnM9W10sdy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49dy50aW1lcnM7Zm9yKG50PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8dy5meC5zdG9wKCksbnQ9dm9pZCAwfSx3LmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe3cudGltZXJzLnB1c2goZSksdy5meC5zdGFydCgpfSx3LmZ4LmludGVydmFsPTEzLHcuZnguc3RhcnQ9ZnVuY3Rpb24oKXtydHx8KHJ0PSEwLGF0KCkpfSx3LmZ4LnN0b3A9ZnVuY3Rpb24oKXtydD1udWxsfSx3LmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSx3LmZuLmRlbGF5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9dy5meD93LmZ4LnNwZWVkc1t0XXx8dDp0LG49bnx8ImZ4Iix0aGlzLnF1ZXVlKG4sZnVuY3Rpb24obixyKXt2YXIgaT1lLnNldFRpbWVvdXQobix0KTtyLnN0b3A9ZnVuY3Rpb24oKXtlLmNsZWFyVGltZW91dChpKX19KX0sZnVuY3Rpb24oKXt2YXIgZT1yLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdD1yLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKHIuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO2UudHlwZT0iY2hlY2tib3giLGguY2hlY2tPbj0iIiE9PWUudmFsdWUsaC5vcHRTZWxlY3RlZD10LnNlbGVjdGVkLChlPXIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWU9InQiLGUudHlwZT0icmFkaW8iLGgucmFkaW9WYWx1ZT0idCI9PT1lLnZhbHVlfSgpO3ZhciBkdCxodD13LmV4cHIuYXR0ckhhbmRsZTt3LmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsdy5hdHRyLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt3LnJlbW92ZUF0dHIodGhpcyxlKX0pfX0pLHcuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgZS5nZXRBdHRyaWJ1dGU/dy5wcm9wKGUsdCxuKTooMT09PW8mJncuaXNYTUxEb2MoZSl8fChpPXcuYXR0ckhvb2tzW3QudG9Mb3dlckNhc2UoKV18fCh3LmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP2R0OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCB3LnJlbW92ZUF0dHIoZSx0KTppJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuKyIiKSxuKTppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOm51bGw9PShyPXcuZmluZC5hdHRyKGUsdCkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZighaC5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmTihlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXQmJnQubWF0Y2goTSk7aWYoaSYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1pW3IrK10pZS5yZW1vdmVBdHRyaWJ1dGUobil9fSksZHQ9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuITE9PT10P3cucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LHcuZWFjaCh3LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciBuPWh0W3RdfHx3LmZpbmQuYXR0cjtodFt0XT1mdW5jdGlvbihlLHQscil7dmFyIGksbyxhPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcnx8KG89aHRbYV0saHRbYV09aSxpPW51bGwhPW4oZSx0LHIpP2E6bnVsbCxodFthXT1vKSxpfX0pO3ZhciBndD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLHl0PS9eKD86YXxhcmVhKSQvaTt3LmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsdy5wcm9wLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t3LnByb3BGaXhbZV18fGVdfSl9fSksdy5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1lLm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuIDE9PT1vJiZ3LmlzWE1MRG9jKGUpfHwodD13LnByb3BGaXhbdF18fHQsaT13LnByb3BIb29rc1t0XSksdm9pZCAwIT09bj9pJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjplW3RdPW46aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjplW3RdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5maW5kLmF0dHIoZSwidGFiaW5kZXgiKTtyZXR1cm4gdD9wYXJzZUludCh0LDEwKTpndC50ZXN0KGUubm9kZU5hbWUpfHx5dC50ZXN0KGUubm9kZU5hbWUpJiZlLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSxoLm9wdFNlbGVjdGVkfHwody5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTt0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLHcuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7dy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pO2Z1bmN0aW9uIHZ0KGUpe3JldHVybihlLm1hdGNoKE0pfHxbXSkuam9pbigiICIpfWZ1bmN0aW9uIG10KGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIHh0KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6InN0cmluZyI9PXR5cGVvZiBlP2UubWF0Y2goTSl8fFtdOltdfXcuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyx1PTA7aWYoZyhlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3codGhpcykuYWRkQ2xhc3MoZS5jYWxsKHRoaXMsdCxtdCh0aGlzKSkpfSk7aWYoKHQ9eHQoZSkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPW10KG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit2dChpKSsiICIpe2E9MDt3aGlsZShvPXRbYSsrXSlyLmluZGV4T2YoIiAiK28rIiAiKTwwJiYocis9bysiICIpO2khPT0ocz12dChyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzLHU9MDtpZihnKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7dyh0aGlzKS5yZW1vdmVDbGFzcyhlLmNhbGwodGhpcyx0LG10KHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKCh0PXh0KGUpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT1tdChuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIrdnQoaSkrIiAiKXthPTA7d2hpbGUobz10W2ErK10pd2hpbGUoci5pbmRleE9mKCIgIitvKyIgIik+LTEpcj1yLnJlcGxhY2UoIiAiK28rIiAiLCIgIik7aSE9PShzPXZ0KHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZSxyPSJzdHJpbmciPT09bnx8QXJyYXkuaXNBcnJheShlKTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0JiZyP3Q/dGhpcy5hZGRDbGFzcyhlKTp0aGlzLnJlbW92ZUNsYXNzKGUpOmcoZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3codGhpcykudG9nZ2xlQ2xhc3MoZS5jYWxsKHRoaXMsbixtdCh0aGlzKSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LGksbyxhO2lmKHIpe2k9MCxvPXcodGhpcyksYT14dChlKTt3aGlsZSh0PWFbaSsrXSlvLmhhc0NsYXNzKHQpP28ucmVtb3ZlQ2xhc3ModCk6by5hZGRDbGFzcyh0KX1lbHNlIHZvaWQgMCE9PWUmJiJib29sZWFuIiE9PW58fCgodD1tdCh0aGlzKSkmJkouc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLHQpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHR8fCExPT09ZT8iIjpKLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPTA7dD0iICIrZSsiICI7d2hpbGUobj10aGlzW3IrK10paWYoMT09PW4ubm9kZVR5cGUmJigiICIrdnQobXQobikpKyIgIikuaW5kZXhPZih0KT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgYnQ9L1xyL2c7dy5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiByPWcoZSksdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciBpOzE9PT10aGlzLm5vZGVUeXBlJiYobnVsbD09KGk9cj9lLmNhbGwodGhpcyxuLHcodGhpcykudmFsKCkpOmUpP2k9IiI6Im51bWJlciI9PXR5cGVvZiBpP2krPSIiOkFycmF5LmlzQXJyYXkoaSkmJihpPXcubWFwKGksZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZSsiIn0pKSwodD13LnZhbEhvb2tzW3RoaXMudHlwZV18fHcudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJzZXQiaW4gdCYmdm9pZCAwIT09dC5zZXQodGhpcyxpLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1pKSl9KTtpZihpKXJldHVybih0PXcudmFsSG9va3NbaS50eXBlXXx8dy52YWxIb29rc1tpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiB0JiZ2b2lkIDAhPT0obj10LmdldChpLCJ2YWx1ZSIpKT9uOiJzdHJpbmciPT10eXBlb2Yobj1pLnZhbHVlKT9uLnJlcGxhY2UoYnQsIiIpOm51bGw9PW4/IiI6bn19fSksdy5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD13LmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6dnQody50ZXh0KGUpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPWUub3B0aW9ucyxvPWUuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PWUudHlwZSxzPWE/bnVsbDpbXSx1PWE/bysxOmkubGVuZ3RoO2ZvcihyPW88MD91OmE/bzowO3I8dTtyKyspaWYoKChuPWlbcl0pLnNlbGVjdGVkfHxyPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IU4obi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD13KG4pLnZhbCgpLGEpcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89dy5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pKChyPWlbYV0pLnNlbGVjdGVkPXcuaW5BcnJheSh3LnZhbEhvb2tzLm9wdGlvbi5nZXQociksbyk+LTEpJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX19KSx3LmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXt3LnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9dy5pbkFycmF5KHcoZSkudmFsKCksdCk+LTF9fSxoLmNoZWNrT258fCh3LnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSksaC5mb2N1c2luPSJvbmZvY3VzaW4iaW4gZTt2YXIgd3Q9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFR0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O3cuZXh0ZW5kKHcuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24odCxuLGksbyl7dmFyIGEscyx1LGwsYyxwLGQsaCx2PVtpfHxyXSxtPWYuY2FsbCh0LCJ0eXBlIik/dC50eXBlOnQseD1mLmNhbGwodCwibmFtZXNwYWNlIik/dC5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihzPWg9dT1pPWl8fHIsMyE9PWkubm9kZVR5cGUmJjghPT1pLm5vZGVUeXBlJiYhd3QudGVzdChtK3cuZXZlbnQudHJpZ2dlcmVkKSYmKG0uaW5kZXhPZigiLiIpPi0xJiYobT0oeD1tLnNwbGl0KCIuIikpLnNoaWZ0KCkseC5zb3J0KCkpLGM9bS5pbmRleE9mKCI6Iik8MCYmIm9uIittLHQ9dFt3LmV4cGFuZG9dP3Q6bmV3IHcuRXZlbnQobSwib2JqZWN0Ij09dHlwZW9mIHQmJnQpLHQuaXNUcmlnZ2VyPW8/MjozLHQubmFtZXNwYWNlPXguam9pbigiLiIpLHQucm5hbWVzcGFjZT10Lm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIit4LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsdC5yZXN1bHQ9dm9pZCAwLHQudGFyZ2V0fHwodC50YXJnZXQ9aSksbj1udWxsPT1uP1t0XTp3Lm1ha2VBcnJheShuLFt0XSksZD13LmV2ZW50LnNwZWNpYWxbbV18fHt9LG98fCFkLnRyaWdnZXJ8fCExIT09ZC50cmlnZ2VyLmFwcGx5KGksbikpKXtpZighbyYmIWQubm9CdWJibGUmJiF5KGkpKXtmb3IobD1kLmRlbGVnYXRlVHlwZXx8bSx3dC50ZXN0KGwrbSl8fChzPXMucGFyZW50Tm9kZSk7cztzPXMucGFyZW50Tm9kZSl2LnB1c2gocyksdT1zO3U9PT0oaS5vd25lckRvY3VtZW50fHxyKSYmdi5wdXNoKHUuZGVmYXVsdFZpZXd8fHUucGFyZW50V2luZG93fHxlKX1hPTA7d2hpbGUoKHM9dlthKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSloPXMsdC50eXBlPWE+MT9sOmQuYmluZFR5cGV8fG0sKHA9KEouZ2V0KHMsImV2ZW50cyIpfHx7fSlbdC50eXBlXSYmSi5nZXQocywiaGFuZGxlIikpJiZwLmFwcGx5KHMsbiksKHA9YyYmc1tjXSkmJnAuYXBwbHkmJlkocykmJih0LnJlc3VsdD1wLmFwcGx5KHMsbiksITE9PT10LnJlc3VsdCYmdC5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gdC50eXBlPW0sb3x8dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8ZC5fZGVmYXVsdCYmITEhPT1kLl9kZWZhdWx0LmFwcGx5KHYucG9wKCksbil8fCFZKGkpfHxjJiZnKGlbbV0pJiYheShpKSYmKCh1PWlbY10pJiYoaVtjXT1udWxsKSx3LmV2ZW50LnRyaWdnZXJlZD1tLHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5hZGRFdmVudExpc3RlbmVyKG0sVHQpLGlbbV0oKSx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmgucmVtb3ZlRXZlbnRMaXN0ZW5lcihtLFR0KSx3LmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsdSYmKGlbY109dSkpLHQucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXcuZXh0ZW5kKG5ldyB3LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMH0pO3cuZXZlbnQudHJpZ2dlcihyLG51bGwsdCl9fSksdy5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gdy5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKX19KSxoLmZvY3VzaW58fHcuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbihlKXt3LmV2ZW50LnNpbXVsYXRlKHQsZS50YXJnZXQsdy5ldmVudC5maXgoZSkpfTt3LmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGk9Si5hY2Nlc3Mocix0KTtpfHxyLmFkZEV2ZW50TGlzdGVuZXIoZSxuLCEwKSxKLmFjY2VzcyhyLHQsKGl8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxpPUouYWNjZXNzKHIsdCktMTtpP0ouYWNjZXNzKHIsdCxpKTooci5yZW1vdmVFdmVudExpc3RlbmVyKGUsbiwhMCksSi5yZW1vdmUocix0KSl9fX0pO3ZhciBDdD1lLmxvY2F0aW9uLEV0PURhdGUubm93KCksa3Q9L1w/Lzt3LnBhcnNlWE1MPWZ1bmN0aW9uKHQpe3ZhciBuO2lmKCF0fHwic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dHJ5e249KG5ldyBlLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsInRleHQveG1sIil9Y2F0Y2goZSl7bj12b2lkIDB9cmV0dXJuIG4mJiFuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8dy5lcnJvcigiSW52YWxpZCBYTUw6ICIrdCksbn07dmFyIFN0PS9cW1xdJC8sRHQ9L1xyP1xuL2csTnQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLEF0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBqdChlLHQsbixyKXt2YXIgaTtpZihBcnJheS5pc0FycmF5KHQpKXcuZWFjaCh0LGZ1bmN0aW9uKHQsaSl7bnx8U3QudGVzdChlKT9yKGUsaSk6anQoZSsiWyIrKCJvYmplY3QiPT10eXBlb2YgaSYmbnVsbCE9aT90OiIiKSsiXSIsaSxuLHIpfSk7ZWxzZSBpZihufHwib2JqZWN0IiE9PXgodCkpcihlLHQpO2Vsc2UgZm9yKGkgaW4gdClqdChlKyJbIitpKyJdIix0W2ldLG4scil9dy5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3ZhciBuPWcodCk/dCgpOnQ7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYoQXJyYXkuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF3LmlzUGxhaW5PYmplY3QoZSkpdy5lYWNoKGUsZnVuY3Rpb24oKXtpKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKG4gaW4gZSlqdChuLGVbbl0sdCxpKTtyZXR1cm4gci5qb2luKCImIil9LHcuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXcucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBlP3cubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXcodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZBdC50ZXN0KHRoaXMubm9kZU5hbWUpJiYhTnQudGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IXBlLnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49dyh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOkFycmF5LmlzQXJyYXkobik/dy5tYXAobixmdW5jdGlvbihlKXtyZXR1cm57bmFtZTp0Lm5hbWUsdmFsdWU6ZS5yZXBsYWNlKER0LCJcclxuIil9fSk6e25hbWU6dC5uYW1lLHZhbHVlOm4ucmVwbGFjZShEdCwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBxdD0vJTIwL2csTHQ9LyMuKiQvLEh0PS8oWz8mXSlfPVteJl0qLyxPdD0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLFB0PS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLE10PS9eKD86R0VUfEhFQUQpJC8sUnQ9L15cL1wvLyxJdD17fSxXdD17fSwkdD0iKi8iLmNvbmNhdCgiKiIpLEJ0PXIuY3JlYXRlRWxlbWVudCgiYSIpO0J0LmhyZWY9Q3QuaHJlZjtmdW5jdGlvbiBGdChlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXsic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iKiIpO3ZhciByLGk9MCxvPXQudG9Mb3dlckNhc2UoKS5tYXRjaChNKXx8W107aWYoZyhuKSl3aGlsZShyPW9baSsrXSkiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwoZVtyXT1lW3JdfHxbXSkudW5zaGlmdChuKSk6KGVbcl09ZVtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uIF90KGUsdCxuLHIpe3ZhciBpPXt9LG89ZT09PVd0O2Z1bmN0aW9uIGEocyl7dmFyIHU7cmV0dXJuIGlbc109ITAsdy5lYWNoKGVbc118fFtdLGZ1bmN0aW9uKGUscyl7dmFyIGw9cyh0LG4scik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBsfHxvfHxpW2xdP28/ISh1PWwpOnZvaWQgMDoodC5kYXRhVHlwZXMudW5zaGlmdChsKSxhKGwpLCExKX0pLHV9cmV0dXJuIGEodC5kYXRhVHlwZXNbMF0pfHwhaVsiKiJdJiZhKCIqIil9ZnVuY3Rpb24genQoZSx0KXt2YXIgbixyLGk9dy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIHQpdm9pZCAwIT09dFtuXSYmKChpW25dP2U6cnx8KHI9e30pKVtuXT10W25dKTtyZXR1cm4gciYmdy5leHRlbmQoITAsZSxyKSxlfWZ1bmN0aW9uIFh0KGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IoaSBpbiBzKWlmKHNbaV0mJnNbaV0udGVzdChyKSl7dS51bnNoaWZ0KGkpO2JyZWFrfWlmKHVbMF1pbiBuKW89dVswXTtlbHNle2ZvcihpIGluIG4pe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbaSsiICIrdVswXV0pe289aTticmVha31hfHwoYT1pKX1vPW98fGF9aWYobylyZXR1cm4gbyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dfWZ1bmN0aW9uIFV0KGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD17fSxjPWUuZGF0YVR5cGVzLnNsaWNlKCk7aWYoY1sxXSlmb3IoYSBpbiBlLmNvbnZlcnRlcnMpbFthLnRvTG93ZXJDYXNlKCldPWUuY29udmVydGVyc1thXTtvPWMuc2hpZnQoKTt3aGlsZShvKWlmKGUucmVzcG9uc2VGaWVsZHNbb10mJihuW2UucmVzcG9uc2VGaWVsZHNbb11dPXQpLCF1JiZyJiZlLmRhdGFGaWx0ZXImJih0PWUuZGF0YUZpbHRlcih0LGUuZGF0YVR5cGUpKSx1PW8sbz1jLnNoaWZ0KCkpaWYoIioiPT09bylvPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09byl7aWYoIShhPWxbdSsiICIrb118fGxbIiogIitvXSkpZm9yKGkgaW4gbClpZigocz1pLnNwbGl0KCIgIikpWzFdPT09byYmKGE9bFt1KyIgIitzWzBdXXx8bFsiKiAiK3NbMF1dKSl7ITA9PT1hP2E9bFtpXTohMCE9PWxbaV0mJihvPXNbMF0sYy51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmZVsidGhyb3dzIl0pdD1hKHQpO2Vsc2UgdHJ5e3Q9YSh0KX1jYXRjaChlKXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjphP2U6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK299fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6dH19dy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOkN0LmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOlB0LnRlc3QoQ3QucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6JHQsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOncucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P3p0KHp0KGUsdy5hamF4U2V0dGluZ3MpLHQpOnp0KHcuYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkZ0KEl0KSxhamF4VHJhbnNwb3J0OkZ0KFd0KSxhamF4OmZ1bmN0aW9uKHQsbil7Im9iamVjdCI9PXR5cGVvZiB0JiYobj10LHQ9dm9pZCAwKSxuPW58fHt9O3ZhciBpLG8sYSxzLHUsbCxjLGYscCxkLGg9dy5hamF4U2V0dXAoe30sbiksZz1oLmNvbnRleHR8fGgseT1oLmNvbnRleHQmJihnLm5vZGVUeXBlfHxnLmpxdWVyeSk/dyhnKTp3LmV2ZW50LHY9dy5EZWZlcnJlZCgpLG09dy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikseD1oLnN0YXR1c0NvZGV8fHt9LGI9e30sVD17fSxDPSJjYW5jZWxlZCIsRT17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGMpe2lmKCFzKXtzPXt9O3doaWxlKHQ9T3QuZXhlYyhhKSlzW3RbMV0udG9Mb3dlckNhc2UoKV09dFsyXX10PXNbZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09dD9udWxsOnR9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBjP2E6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1jJiYoZT1UW2UudG9Mb3dlckNhc2UoKV09VFtlLnRvTG93ZXJDYXNlKCldfHxlLGJbZV09dCksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09YyYmKGgubWltZVR5cGU9ZSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihlKXt2YXIgdDtpZihlKWlmKGMpRS5hbHdheXMoZVtFLnN0YXR1c10pO2Vsc2UgZm9yKHQgaW4gZSl4W3RdPVt4W3RdLGVbdF1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHxDO3JldHVybiBpJiZpLmFib3J0KHQpLGsoMCx0KSx0aGlzfX07aWYodi5wcm9taXNlKEUpLGgudXJsPSgodHx8aC51cmx8fEN0LmhyZWYpKyIiKS5yZXBsYWNlKFJ0LEN0LnByb3RvY29sKyIvLyIpLGgudHlwZT1uLm1ldGhvZHx8bi50eXBlfHxoLm1ldGhvZHx8aC50eXBlLGguZGF0YVR5cGVzPShoLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goTSl8fFsiIl0sbnVsbD09aC5jcm9zc0RvbWFpbil7bD1yLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7bC5ocmVmPWgudXJsLGwuaHJlZj1sLmhyZWYsaC5jcm9zc0RvbWFpbj1CdC5wcm90b2NvbCsiLy8iK0J0Lmhvc3QhPWwucHJvdG9jb2wrIi8vIitsLmhvc3R9Y2F0Y2goZSl7aC5jcm9zc0RvbWFpbj0hMH19aWYoaC5kYXRhJiZoLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGguZGF0YSYmKGguZGF0YT13LnBhcmFtKGguZGF0YSxoLnRyYWRpdGlvbmFsKSksX3QoSXQsaCxuLEUpLGMpcmV0dXJuIEU7KGY9dy5ldmVudCYmaC5nbG9iYWwpJiYwPT13LmFjdGl2ZSsrJiZ3LmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGgudHlwZT1oLnR5cGUudG9VcHBlckNhc2UoKSxoLmhhc0NvbnRlbnQ9IU10LnRlc3QoaC50eXBlKSxvPWgudXJsLnJlcGxhY2UoTHQsIiIpLGguaGFzQ29udGVudD9oLmRhdGEmJmgucHJvY2Vzc0RhdGEmJjA9PT0oaC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoaC5kYXRhPWguZGF0YS5yZXBsYWNlKHF0LCIrIikpOihkPWgudXJsLnNsaWNlKG8ubGVuZ3RoKSxoLmRhdGEmJihoLnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIGguZGF0YSkmJihvKz0oa3QudGVzdChvKT8iJiI6Ij8iKStoLmRhdGEsZGVsZXRlIGguZGF0YSksITE9PT1oLmNhY2hlJiYobz1vLnJlcGxhY2UoSHQsIiQxIiksZD0oa3QudGVzdChvKT8iJiI6Ij8iKSsiXz0iK0V0KysrZCksaC51cmw9bytkKSxoLmlmTW9kaWZpZWQmJih3Lmxhc3RNb2RpZmllZFtvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsdy5sYXN0TW9kaWZpZWRbb10pLHcuZXRhZ1tvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIix3LmV0YWdbb10pKSwoaC5kYXRhJiZoLmhhc0NvbnRlbnQmJiExIT09aC5jb250ZW50VHlwZXx8bi5jb250ZW50VHlwZSkmJkUuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixoLmNvbnRlbnRUeXBlKSxFLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsaC5kYXRhVHlwZXNbMF0mJmguYWNjZXB0c1toLmRhdGFUeXBlc1swXV0/aC5hY2NlcHRzW2guZGF0YVR5cGVzWzBdXSsoIioiIT09aC5kYXRhVHlwZXNbMF0/IiwgIiskdCsiOyBxPTAuMDEiOiIiKTpoLmFjY2VwdHNbIioiXSk7Zm9yKHAgaW4gaC5oZWFkZXJzKUUuc2V0UmVxdWVzdEhlYWRlcihwLGguaGVhZGVyc1twXSk7aWYoaC5iZWZvcmVTZW5kJiYoITE9PT1oLmJlZm9yZVNlbmQuY2FsbChnLEUsaCl8fGMpKXJldHVybiBFLmFib3J0KCk7aWYoQz0iYWJvcnQiLG0uYWRkKGguY29tcGxldGUpLEUuZG9uZShoLnN1Y2Nlc3MpLEUuZmFpbChoLmVycm9yKSxpPV90KFd0LGgsbixFKSl7aWYoRS5yZWFkeVN0YXRlPTEsZiYmeS50cmlnZ2VyKCJhamF4U2VuZCIsW0UsaF0pLGMpcmV0dXJuIEU7aC5hc3luYyYmaC50aW1lb3V0PjAmJih1PWUuc2V0VGltZW91dChmdW5jdGlvbigpe0UuYWJvcnQoInRpbWVvdXQiKX0saC50aW1lb3V0KSk7dHJ5e2M9ITEsaS5zZW5kKGIsayl9Y2F0Y2goZSl7aWYoYyl0aHJvdyBlO2soLTEsZSl9fWVsc2UgaygtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gayh0LG4scixzKXt2YXIgbCxwLGQsYixULEM9bjtjfHwoYz0hMCx1JiZlLmNsZWFyVGltZW91dCh1KSxpPXZvaWQgMCxhPXN8fCIiLEUucmVhZHlTdGF0ZT10PjA/NDowLGw9dD49MjAwJiZ0PDMwMHx8MzA0PT09dCxyJiYoYj1YdChoLEUscikpLGI9VXQoaCxiLEUsbCksbD8oaC5pZk1vZGlmaWVkJiYoKFQ9RS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKSYmKHcubGFzdE1vZGlmaWVkW29dPVQpLChUPUUuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJih3LmV0YWdbb109VCkpLDIwND09PXR8fCJIRUFEIj09PWgudHlwZT9DPSJub2NvbnRlbnQiOjMwND09PXQ/Qz0ibm90bW9kaWZpZWQiOihDPWIuc3RhdGUscD1iLmRhdGEsbD0hKGQ9Yi5lcnJvcikpKTooZD1DLCF0JiZDfHwoQz0iZXJyb3IiLHQ8MCYmKHQ9MCkpKSxFLnN0YXR1cz10LEUuc3RhdHVzVGV4dD0obnx8QykrIiIsbD92LnJlc29sdmVXaXRoKGcsW3AsQyxFXSk6di5yZWplY3RXaXRoKGcsW0UsQyxkXSksRS5zdGF0dXNDb2RlKHgpLHg9dm9pZCAwLGYmJnkudHJpZ2dlcihsPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW0UsaCxsP3A6ZF0pLG0uZmlyZVdpdGgoZyxbRSxDXSksZiYmKHkudHJpZ2dlcigiYWpheENvbXBsZXRlIixbRSxoXSksLS13LmFjdGl2ZXx8dy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIEV9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB3LmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdy5nZXQoZSx2b2lkIDAsdCwic2NyaXB0Iil9fSksdy5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsdCl7d1t0XT1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4gZyhuKSYmKGk9aXx8cixyPW4sbj12b2lkIDApLHcuYWpheCh3LmV4dGVuZCh7dXJsOmUsdHlwZTp0LGRhdGFUeXBlOmksZGF0YTpuLHN1Y2Nlc3M6cn0sdy5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSksdy5fZXZhbFVybD1mdW5jdGlvbihlKXtyZXR1cm4gdy5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSx3LmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpc1swXSYmKGcoZSkmJihlPWUuY2FsbCh0aGlzWzBdKSksdD13KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihlKXtyZXR1cm4gZyhlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7dyh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dyh0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD1nKGUpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7dyh0aGlzKS53cmFwQWxsKHQ/ZS5jYWxsKHRoaXMsbik6ZSl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7dyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSx3LmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIXcuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LHcuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSx3LmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBWdD17MDoyMDAsMTIyMzoyMDR9LEd0PXcuYWpheFNldHRpbmdzLnhocigpO2guY29ycz0hIUd0JiYid2l0aENyZWRlbnRpYWxzImluIEd0LGguYWpheD1HdD0hIUd0LHcuYWpheFRyYW5zcG9ydChmdW5jdGlvbih0KXt2YXIgbixyO2lmKGguY29yc3x8R3QmJiF0LmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGksbyl7dmFyIGEscz10LnhocigpO2lmKHMub3Blbih0LnR5cGUsdC51cmwsdC5hc3luYyx0LnVzZXJuYW1lLHQucGFzc3dvcmQpLHQueGhyRmllbGRzKWZvcihhIGluIHQueGhyRmllbGRzKXNbYV09dC54aHJGaWVsZHNbYV07dC5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUodC5taW1lVHlwZSksdC5jcm9zc0RvbWFpbnx8aVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoaVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihhIGluIGkpcy5zZXRSZXF1ZXN0SGVhZGVyKGEsaVthXSk7bj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtuJiYobj1yPXMub25sb2FkPXMub25lcnJvcj1zLm9uYWJvcnQ9cy5vbnRpbWVvdXQ9cy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09ZT9zLmFib3J0KCk6ImVycm9yIj09PWU/Im51bWJlciIhPXR5cGVvZiBzLnN0YXR1cz9vKDAsImVycm9yIik6byhzLnN0YXR1cyxzLnN0YXR1c1RleHQpOm8oVnRbcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInRleHQiIT09KHMucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHMucmVzcG9uc2VUZXh0P3tiaW5hcnk6cy5yZXNwb25zZX06e3RleHQ6cy5yZXNwb25zZVRleHR9LHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPW4oKSxyPXMub25lcnJvcj1zLm9udGltZW91dD1uKCJlcnJvciIpLHZvaWQgMCE9PXMub25hYm9ydD9zLm9uYWJvcnQ9cjpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1zLnJlYWR5U3RhdGUmJmUuc2V0VGltZW91dChmdW5jdGlvbigpe24mJnIoKX0pfSxuPW4oImFib3J0Iik7dHJ5e3Muc2VuZCh0Lmhhc0NvbnRlbnQmJnQuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYobil0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX0pLHcuYWpheFByZWZpbHRlcihmdW5jdGlvbihlKXtlLmNyb3NzRG9tYWluJiYoZS5jb250ZW50cy5zY3JpcHQ9ITEpfSksdy5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZ2xvYmFsRXZhbChlKSxlfX19KSx3LmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS5jYWNoZSYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9IkdFVCIpfSksdy5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2lmKGUuY3Jvc3NEb21haW4pe3ZhciB0LG47cmV0dXJue3NlbmQ6ZnVuY3Rpb24oaSxvKXt0PXcoIjxzY3JpcHQ+IikucHJvcCh7Y2hhcnNldDplLnNjcmlwdENoYXJzZXQsc3JjOmUudXJsfSkub24oImxvYWQgZXJyb3IiLG49ZnVuY3Rpb24oZSl7dC5yZW1vdmUoKSxuPW51bGwsZSYmbygiZXJyb3IiPT09ZS50eXBlPzQwNDoyMDAsZS50eXBlKX0pLHIuaGVhZC5hcHBlbmRDaGlsZCh0WzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX19KTt2YXIgWXQ9W10sUXQ9Lyg9KVw/KD89JnwkKXxcP1w/Lzt3LmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9WXQucG9wKCl8fHcuZXhwYW5kbysiXyIrRXQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLHcuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24odCxuLHIpe3ZhciBpLG8sYSxzPSExIT09dC5qc29ucCYmKFF0LnRlc3QodC51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgdC5kYXRhJiYwPT09KHQuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmUXQudGVzdCh0LmRhdGEpJiYiZGF0YSIpO2lmKHN8fCJqc29ucCI9PT10LmRhdGFUeXBlc1swXSlyZXR1cm4gaT10Lmpzb25wQ2FsbGJhY2s9Zyh0Lmpzb25wQ2FsbGJhY2spP3QuanNvbnBDYWxsYmFjaygpOnQuanNvbnBDYWxsYmFjayxzP3Rbc109dFtzXS5yZXBsYWNlKFF0LCIkMSIraSk6ITEhPT10Lmpzb25wJiYodC51cmwrPShrdC50ZXN0KHQudXJsKT8iJiI6Ij8iKSt0Lmpzb25wKyI9IitpKSx0LmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gYXx8dy5lcnJvcihpKyIgd2FzIG5vdCBjYWxsZWQiKSxhWzBdfSx0LmRhdGFUeXBlc1swXT0ianNvbiIsbz1lW2ldLGVbaV09ZnVuY3Rpb24oKXthPWFyZ3VtZW50c30sci5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1vP3coZSkucmVtb3ZlUHJvcChpKTplW2ldPW8sdFtpXSYmKHQuanNvbnBDYWxsYmFjaz1uLmpzb25wQ2FsbGJhY2ssWXQucHVzaChpKSksYSYmZyhvKSYmbyhhWzBdKSxhPW89dm9pZCAwfSksInNjcmlwdCJ9KSxoLmNyZWF0ZUhUTUxEb2N1bWVudD1mdW5jdGlvbigpe3ZhciBlPXIuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5O3JldHVybiBlLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1lLmNoaWxkTm9kZXMubGVuZ3RofSgpLHcucGFyc2VIVE1MPWZ1bmN0aW9uKGUsdCxuKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuW107ImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKTt2YXIgaSxvLGE7cmV0dXJuIHR8fChoLmNyZWF0ZUhUTUxEb2N1bWVudD8oKGk9KHQ9ci5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpKS5jcmVhdGVFbGVtZW50KCJiYXNlIikpLmhyZWY9ci5sb2NhdGlvbi5ocmVmLHQuaGVhZC5hcHBlbmRDaGlsZChpKSk6dD1yKSxvPUEuZXhlYyhlKSxhPSFuJiZbXSxvP1t0LmNyZWF0ZUVsZW1lbnQob1sxXSldOihvPXhlKFtlXSx0LGEpLGEmJmEubGVuZ3RoJiZ3KGEpLnJlbW92ZSgpLHcubWVyZ2UoW10sby5jaGlsZE5vZGVzKSl9LHcuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybiBzPi0xJiYocj12dChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksZyh0KT8obj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksYS5sZW5ndGg+MCYmdy5hamF4KHt1cmw6ZSx0eXBlOml8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP3coIjxkaXY+IikuYXBwZW5kKHcucGFyc2VIVE1MKGUpKS5maW5kKHIpOmUpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pfSksdGhpc30sdy5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oZSx0KXt3LmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksdy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZ3JlcCh3LnRpbWVycyxmdW5jdGlvbih0KXtyZXR1cm4gZT09PXQuZWxlbX0pLmxlbmd0aH0sdy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYz13LmNzcyhlLCJwb3NpdGlvbiIpLGY9dyhlKSxwPXt9OyJzdGF0aWMiPT09YyYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1mLm9mZnNldCgpLG89dy5jc3MoZSwidG9wIiksdT13LmNzcyhlLCJsZWZ0IiksKGw9KCJhYnNvbHV0ZSI9PT1jfHwiZml4ZWQiPT09YykmJihvK3UpLmluZGV4T2YoImF1dG8iKT4tMSk/KGE9KHI9Zi5wb3NpdGlvbigpKS50b3AsaT1yLmxlZnQpOihhPXBhcnNlRmxvYXQobyl8fDAsaT1wYXJzZUZsb2F0KHUpfHwwKSxnKHQpJiYodD10LmNhbGwoZSxuLHcuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihwLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihwLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxwKTpmLmNzcyhwKX19LHcuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oZSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt3Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIHQsbixyPXRoaXNbMF07aWYocilyZXR1cm4gci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8odD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6dC50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OnQubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH19LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxpPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT13LmNzcyhyLCJwb3NpdGlvbiIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT13LmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5wYXJlbnROb2RlO2UmJmUhPT1yJiYxPT09ZS5ub2RlVHlwZSYmKChpPXcoZSkub2Zmc2V0KCkpLnRvcCs9dy5jc3MoZSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxpLmxlZnQrPXcuY3NzKGUsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOnQudG9wLWkudG9wLXcuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LWkubGVmdC13LmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmInN0YXRpYyI9PT13LmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV8fGJlfSl9fSksdy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIG49InBhZ2VZT2Zmc2V0Ij09PXQ7dy5mbltlXT1mdW5jdGlvbihyKXtyZXR1cm4geih0aGlzLGZ1bmN0aW9uKGUscixpKXt2YXIgbztpZih5KGUpP289ZTo5PT09ZS5ub2RlVHlwZSYmKG89ZS5kZWZhdWx0Vmlldyksdm9pZCAwPT09aSlyZXR1cm4gbz9vW3RdOmVbcl07bz9vLnNjcm9sbFRvKG4/by5wYWdlWE9mZnNldDppLG4/aTpvLnBhZ2VZT2Zmc2V0KTplW3JdPWl9LGUscixhcmd1bWVudHMubGVuZ3RoKX19KSx3LmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSx0KXt3LmNzc0hvb2tzW3RdPV9lKGgucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLG4pe2lmKG4pcmV0dXJuIG49RmUoZSx0KSxXZS50ZXN0KG4pP3coZSkucG9zaXRpb24oKVt0XSsicHgiOm59KX0pLHcuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsdCl7dy5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50OnQsIiI6Im91dGVyIitlfSxmdW5jdGlvbihuLHIpe3cuZm5bcl09ZnVuY3Rpb24oaSxvKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2YgaSkscz1ufHwoITA9PT1pfHwhMD09PW8/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB6KHRoaXMsZnVuY3Rpb24odCxuLGkpe3ZhciBvO3JldHVybiB5KHQpPzA9PT1yLmluZGV4T2YoIm91dGVyIik/dFsiaW5uZXIiK2VdOnQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2VdOjk9PT10Lm5vZGVUeXBlPyhvPXQuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KHQuYm9keVsic2Nyb2xsIitlXSxvWyJzY3JvbGwiK2VdLHQuYm9keVsib2Zmc2V0IitlXSxvWyJvZmZzZXQiK2VdLG9bImNsaWVudCIrZV0pKTp2b2lkIDA9PT1pP3cuY3NzKHQsbixzKTp3LnN0eWxlKHQsbixpLHMpfSx0LGE/aTp2b2lkIDAsYSl9fSl9KSx3LmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXt3LmZuW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKHQsbnVsbCxlLG4pOnRoaXMudHJpZ2dlcih0KX19KSx3LmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9fSksdy5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9uKGUsbnVsbCx0LG4pfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vZmYoZSxudWxsLHQpfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwiKioiLG4pfX0pLHcucHJveHk9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYobj1lW3RdLHQ9ZSxlPW4pLGcoZSkpcmV0dXJuIHI9by5jYWxsKGFyZ3VtZW50cywyKSxpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChvLmNhbGwoYXJndW1lbnRzKSkpfSxpLmd1aWQ9ZS5ndWlkPWUuZ3VpZHx8dy5ndWlkKyssaX0sdy5ob2xkUmVhZHk9ZnVuY3Rpb24oZSl7ZT93LnJlYWR5V2FpdCsrOncucmVhZHkoITApfSx3LmlzQXJyYXk9QXJyYXkuaXNBcnJheSx3LnBhcnNlSlNPTj1KU09OLnBhcnNlLHcubm9kZU5hbWU9Tix3LmlzRnVuY3Rpb249Zyx3LmlzV2luZG93PXksdy5jYW1lbENhc2U9Ryx3LnR5cGU9eCx3Lm5vdz1EYXRlLm5vdyx3LmlzTnVtZXJpYz1mdW5jdGlvbihlKXt2YXIgdD13LnR5cGUoZSk7cmV0dXJuKCJudW1iZXIiPT09dHx8InN0cmluZyI9PT10KSYmIWlzTmFOKGUtcGFyc2VGbG9hdChlKSl9LCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB3fSk7dmFyIEp0PWUualF1ZXJ5LEt0PWUuJDtyZXR1cm4gdy5ub0NvbmZsaWN0PWZ1bmN0aW9uKHQpe3JldHVybiBlLiQ9PT13JiYoZS4kPUt0KSx0JiZlLmpRdWVyeT09PXcmJihlLmpRdWVyeT1KdCksd30sdHx8KGUualF1ZXJ5PWUuJD13KSx3fSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAqIGpRdWVyeSBUZW1wbGF0ZXMgUGx1Z2luIDEuMC4wcHJlCiAqIGh0dHA6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdG1wbAogKiBSZXF1aXJlcyBqUXVlcnkgMS40LjIKICoKICogQ29weXJpZ2h0IFNvZnR3YXJlIEZyZWVkb20gQ29uc2VydmFuY3ksIEluYy4KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICovCihmdW5jdGlvbihhKXt2YXIgcj1hLmZuLmRvbU1hbmlwLGQ9Il90bXBsaXRlbSIscT0vXltePF0qKDxbXHdcV10rPilbXj5dKiR8XHtce1whIC8sYj17fSxmPXt9LGUscD17a2V5OjAsZGF0YTp7fX0saT0wLGM9MCxsPVtdO2Z1bmN0aW9uIGcoZyxkLGgsZSl7dmFyIGM9e2RhdGE6ZXx8KGU9PT0wfHxlPT09ZmFsc2UpP2U6ZD9kLmRhdGE6e30sX3dyYXA6ZD9kLl93cmFwOm51bGwsdG1wbDpudWxsLHBhcmVudDpkfHxudWxsLG5vZGVzOltdLGNhbGxzOnUsbmVzdDp3LHdyYXA6eCxodG1sOnYsdXBkYXRlOnR9O2cmJmEuZXh0ZW5kKGMsZyx7bm9kZXM6W10scGFyZW50OmR9KTtpZihoKXtjLnRtcGw9aDtjLl9jdG50PWMuX2N0bnR8fGMudG1wbChhLGMpO2Mua2V5PSsraTsobC5sZW5ndGg/ZjpiKVtpXT1jfXJldHVybiBjfWEuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGYsZCl7YS5mbltmXT1mdW5jdGlvbihuKXt2YXIgZz1bXSxpPWEobiksayxoLG0sbCxqPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2U9Ynx8e307aWYoaiYmai5ub2RlVHlwZT09PTExJiZqLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmaS5sZW5ndGg9PT0xKXtpW2RdKHRoaXNbMF0pO2c9dGhpc31lbHNle2ZvcihoPTAsbT1pLmxlbmd0aDtoPG07aCsrKXtjPWg7az0oaD4wP3RoaXMuY2xvbmUodHJ1ZSk6dGhpcykuZ2V0KCk7YShpW2hdKVtkXShrKTtnPWcuY29uY2F0KGspfWM9MDtnPXRoaXMucHVzaFN0YWNrKGcsZixpLnNlbGVjdG9yKX1sPWU7ZT1udWxsO2EudG1wbC5jb21wbGV0ZShsKTtyZXR1cm4gZ319KTthLmZuLmV4dGVuZCh7dG1wbDpmdW5jdGlvbihkLGMsYil7cmV0dXJuIGEudG1wbCh0aGlzWzBdLGQsYyxiKX0sdG1wbEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gYS50bXBsSXRlbSh0aGlzWzBdKX0sdGVtcGxhdGU6ZnVuY3Rpb24oYil7cmV0dXJuIGEudGVtcGxhdGUoYix0aGlzWzBdKX0sZG9tTWFuaXA6ZnVuY3Rpb24oZCxtLGspe2lmKGRbMF0mJmEuaXNBcnJheShkWzBdKSl7dmFyIGc9YS5tYWtlQXJyYXkoYXJndW1lbnRzKSxoPWRbMF0saj1oLmxlbmd0aCxpPTAsZjt3aGlsZShpPGomJiEoZj1hLmRhdGEoaFtpKytdLCJ0bXBsSXRlbSIpKSk7aWYoZiYmYylnWzJdPWZ1bmN0aW9uKGIpe2EudG1wbC5hZnRlck1hbmlwKHRoaXMsYixrKX07ci5hcHBseSh0aGlzLGcpfWVsc2Ugci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Yz0wOyFlJiZhLnRtcGwuY29tcGxldGUoYik7cmV0dXJuIHRoaXN9fSk7YS5leHRlbmQoe3RtcGw6ZnVuY3Rpb24oZCxoLGUsYyl7dmFyIGksaz0hYztpZihrKXtjPXA7ZD1hLnRlbXBsYXRlW2RdfHxhLnRlbXBsYXRlKG51bGwsZCk7Zj17fX1lbHNlIGlmKCFkKXtkPWMudG1wbDtiW2Mua2V5XT1jO2Mubm9kZXM9W107Yy53cmFwcGVkJiZuKGMsYy53cmFwcGVkKTtyZXR1cm4gYShqKGMsbnVsbCxjLnRtcGwoYSxjKSkpfWlmKCFkKXJldHVybltdO2lmKHR5cGVvZiBoPT09ImZ1bmN0aW9uIiloPWguY2FsbChjfHx7fSk7ZSYmZS53cmFwcGVkJiZuKGUsZS53cmFwcGVkKTtpPWEuaXNBcnJheShoKT9hLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhP2coZSxjLGQsYSk6bnVsbH0pOltnKGUsYyxkLGgpXTtyZXR1cm4gaz9hKGooYyxudWxsLGkpKTppfSx0bXBsSXRlbTpmdW5jdGlvbihiKXt2YXIgYztpZihiIGluc3RhbmNlb2YgYSliPWJbMF07d2hpbGUoYiYmYi5ub2RlVHlwZT09PTEmJiEoYz1hLmRhdGEoYiwidG1wbEl0ZW0iKSkmJihiPWIucGFyZW50Tm9kZSkpO3JldHVybiBjfHxwfSx0ZW1wbGF0ZTpmdW5jdGlvbihjLGIpe2lmKGIpe2lmKHR5cGVvZiBiPT09InN0cmluZyIpYj1vKGIpO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIGEpYj1iWzBdfHx7fTtpZihiLm5vZGVUeXBlKWI9YS5kYXRhKGIsInRtcGwiKXx8YS5kYXRhKGIsInRtcGwiLG8oYi5pbm5lckhUTUwpKTtyZXR1cm4gdHlwZW9mIGM9PT0ic3RyaW5nIj8oYS50ZW1wbGF0ZVtjXT1iKTpifXJldHVybiBjP3R5cGVvZiBjIT09InN0cmluZyI/YS50ZW1wbGF0ZShudWxsLGMpOmEudGVtcGxhdGVbY118fGEudGVtcGxhdGUobnVsbCxxLnRlc3QoYyk/YzphKGMpKTpudWxsfSxlbmNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuKCIiK2EpLnNwbGl0KCImIikuam9pbigiJmFtcDsiKS5zcGxpdCgiPCIpLmpvaW4oIiZsdDsiKS5zcGxpdCgiPiIpLmpvaW4oIiZndDsiKS5zcGxpdCgnIicpLmpvaW4oIiYjMzQ7Iikuc3BsaXQoIiciKS5qb2luKCImIzM5OyIpfX0pO2EuZXh0ZW5kKGEudG1wbCx7dGFnOnt0bXBsOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiJpZigkbm90bnVsbF8xKXtfXz1fXy5jb25jYXQoJGl0ZW0ubmVzdCgkMSwkMikpO30ifSx3cmFwOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiIkaXRlbS5jYWxscyhfXywkMSwkMik7X189W107IixjbG9zZToiY2FsbD0kaXRlbS5jYWxscygpO19fPWNhbGwuXy5jb25jYXQoJGl0ZW0ud3JhcChjYWxsLF9fKSk7In0sZWFjaDp7X2RlZmF1bHQ6eyQyOiIkaW5kZXgsICR2YWx1ZSJ9LG9wZW46ImlmKCRub3RudWxsXzEpeyQuZWFjaCgkMWEsZnVuY3Rpb24oJDIpe3dpdGgodGhpcyl7IixjbG9zZToifX0pO30ifSwiaWYiOntvcGVuOiJpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsiLGNsb3NlOiJ9In0sImVsc2UiOntfZGVmYXVsdDp7JDE6InRydWUifSxvcGVuOiJ9ZWxzZSBpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsifSxodG1sOntvcGVuOiJpZigkbm90bnVsbF8xKXtfXy5wdXNoKCQxYSk7fSJ9LCI9Ijp7X2RlZmF1bHQ6eyQxOiIkZGF0YSJ9LG9wZW46ImlmKCRub3RudWxsXzEpe19fLnB1c2goJC5lbmNvZGUoJDFhKSk7fSJ9LCIhIjp7b3BlbjoiIn19LGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yj17fX0sYWZ0ZXJNYW5pcDpmdW5jdGlvbihmLGIsZCl7dmFyIGU9Yi5ub2RlVHlwZT09PTExP2EubWFrZUFycmF5KGIuY2hpbGROb2Rlcyk6Yi5ub2RlVHlwZT09PTE/W2JdOltdO2QuY2FsbChmLGIpO20oZSk7YysrfX0pO2Z1bmN0aW9uIGooZSxnLGYpe3ZhciBiLGM9Zj9hLm1hcChmLGZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2Uua2V5P2EucmVwbGFjZSgvKDxcdyspKD89W1xzPl0pKD8hW14+XSpfdG1wbGl0ZW0pKFtePl0qKS9nLCIkMSAiK2QrJz0iJytlLmtleSsnIiAkMicpOmE6aihhLGUsYS5fY3RudCl9KTplO2lmKGcpcmV0dXJuIGM7Yz1jLmpvaW4oIiIpO2MucmVwbGFjZSgvXlxzKihbXjxcc11bXjxdKik/KDxbXHdcV10rPikoW14+XSpbXj5cc10pP1xzKiQvLGZ1bmN0aW9uKGYsYyxlLGQpe2I9YShlKS5nZXQoKTttKGIpO2lmKGMpYj1rKGMpLmNvbmNhdChiKTtpZihkKWI9Yi5jb25jYXQoayhkKSl9KTtyZXR1cm4gYj9iOmsoYyl9ZnVuY3Rpb24gayhjKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlubmVySFRNTD1jO3JldHVybiBhLm1ha2VBcnJheShiLmNoaWxkTm9kZXMpfWZ1bmN0aW9uIG8oYil7cmV0dXJuIG5ldyBGdW5jdGlvbigialF1ZXJ5IiwiJGl0ZW0iLCJ2YXIgJD1qUXVlcnksY2FsbCxfXz1bXSwkZGF0YT0kaXRlbS5kYXRhO3dpdGgoJGRhdGEpe19fLnB1c2goJyIrYS50cmltKGIpLnJlcGxhY2UoLyhbXFwnXSkvZywiXFwkMSIpLnJlcGxhY2UoL1tcclx0XG5dL2csIiAiKS5yZXBsYWNlKC9cJFx7KFteXH1dKilcfS9nLCJ7ez0gJDF9fSIpLnJlcGxhY2UoL1x7XHsoXC8/KShcdyt8LikoPzpcKCgoPzpbXlx9XXxcfSg/IVx9KSkqPyk/XCkpPyg/OlxzKyguKj8pPyk/KFwoKCg/OlteXH1dfFx9KD8hXH0pKSo/KVwpKT9ccypcfVx9L2csZnVuY3Rpb24obSxsLGssZyxiLGMsZCl7dmFyIGo9YS50bXBsLnRhZ1trXSxpLGUsZjtpZighail0aHJvdyJVbmtub3duIHRlbXBsYXRlIHRhZzogIitrO2k9ai5fZGVmYXVsdHx8W107aWYoYyYmIS9cdyQvLnRlc3QoYikpe2IrPWM7Yz0iIn1pZihiKXtiPWgoYik7ZD1kPyIsIitoKGQpKyIpIjpjPyIpIjoiIjtlPWM/Yi5pbmRleE9mKCIuIik+LTE/YitoKGMpOiIoIitiKyIpLmNhbGwoJGl0ZW0iK2Q6YjtmPWM/ZToiKHR5cGVvZigiK2IrIik9PT0nZnVuY3Rpb24nPygiK2IrIikuY2FsbCgkaXRlbSk6KCIrYisiKSkifWVsc2UgZj1lPWkuJDF8fCJudWxsIjtnPWgoZyk7cmV0dXJuIicpOyIraltsPyJjbG9zZSI6Im9wZW4iXS5zcGxpdCgiJG5vdG51bGxfMSIpLmpvaW4oYj8idHlwZW9mKCIrYisiKSE9PSd1bmRlZmluZWQnICYmICgiK2IrIikhPW51bGwiOiJ0cnVlIikuc3BsaXQoIiQxYSIpLmpvaW4oZikuc3BsaXQoIiQxIikuam9pbihlKS5zcGxpdCgiJDIiKS5qb2luKGd8fGkuJDJ8fCIiKSsiX18ucHVzaCgnIn0pKyInKTt9cmV0dXJuIF9fOyIpfWZ1bmN0aW9uIG4oYyxiKXtjLl93cmFwPWooYyx0cnVlLGEuaXNBcnJheShiKT9iOltxLnRlc3QoYik/YjphKGIpLmh0bWwoKV0pLmpvaW4oIiIpfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGE/YS5yZXBsYWNlKC9cXCcvZywiJyIpLnJlcGxhY2UoL1xcXFwvZywiXFwiKTpudWxsfWZ1bmN0aW9uIHMoYil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5hcHBlbmRDaGlsZChiLmNsb25lTm9kZSh0cnVlKSk7cmV0dXJuIGEuaW5uZXJIVE1MfWZ1bmN0aW9uIG0obyl7dmFyIG49Il8iK2MsayxqLGw9e30sZSxwLGg7Zm9yKGU9MCxwPW8ubGVuZ3RoO2U8cDtlKyspe2lmKChrPW9bZV0pLm5vZGVUeXBlIT09MSljb250aW51ZTtqPWsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTtmb3IoaD1qLmxlbmd0aC0xO2g+PTA7aC0tKW0oaltoXSk7bShrKX1mdW5jdGlvbiBtKGope3ZhciBwLGg9aixrLGUsbTtpZihtPWouZ2V0QXR0cmlidXRlKGQpKXt3aGlsZShoLnBhcmVudE5vZGUmJihoPWgucGFyZW50Tm9kZSkubm9kZVR5cGU9PT0xJiYhKHA9aC5nZXRBdHRyaWJ1dGUoZCkpKTtpZihwIT09bSl7aD1oLnBhcmVudE5vZGU/aC5ub2RlVHlwZT09PTExPzA6aC5nZXRBdHRyaWJ1dGUoZCl8fDA6MDtpZighKGU9YlttXSkpe2U9ZlttXTtlPWcoZSxiW2hdfHxmW2hdKTtlLmtleT0rK2k7YltpXT1lfWMmJm8obSl9ai5yZW1vdmVBdHRyaWJ1dGUoZCl9ZWxzZSBpZihjJiYoZT1hLmRhdGEoaiwidG1wbEl0ZW0iKSkpe28oZS5rZXkpO2JbZS5rZXldPWU7aD1hLmRhdGEoai5wYXJlbnROb2RlLCJ0bXBsSXRlbSIpO2g9aD9oLmtleTowfWlmKGUpe2s9ZTt3aGlsZShrJiZrLmtleSE9aCl7ay5ub2Rlcy5wdXNoKGopO2s9ay5wYXJlbnR9ZGVsZXRlIGUuX2N0bnQ7ZGVsZXRlIGUuX3dyYXA7YS5kYXRhKGosInRtcGxJdGVtIixlKX1mdW5jdGlvbiBvKGEpe2E9YStuO2U9bFthXT1sW2FdfHxnKGUsYltlLnBhcmVudC5rZXkrbl18fGUucGFyZW50KX19fWZ1bmN0aW9uIHUoYSxkLGMsYil7aWYoIWEpcmV0dXJuIGwucG9wKCk7bC5wdXNoKHtfOmEsdG1wbDpkLGl0ZW06dGhpcyxkYXRhOmMsb3B0aW9uczpifSl9ZnVuY3Rpb24gdyhkLGMsYil7cmV0dXJuIGEudG1wbChhLnRlbXBsYXRlKGQpLGMsYix0aGlzKX1mdW5jdGlvbiB4KGIsZCl7dmFyIGM9Yi5vcHRpb25zfHx7fTtjLndyYXBwZWQ9ZDtyZXR1cm4gYS50bXBsKGEudGVtcGxhdGUoYi50bXBsKSxiLmRhdGEsYyxiLml0ZW0pfWZ1bmN0aW9uIHYoZCxjKXt2YXIgYj10aGlzLl93cmFwO3JldHVybiBhLm1hcChhKGEuaXNBcnJheShiKT9iLmpvaW4oIiIpOmIpLmZpbHRlcihkfHwiKiIpLGZ1bmN0aW9uKGEpe3JldHVybiBjP2EuaW5uZXJUZXh0fHxhLnRleHRDb250ZW50OmEub3V0ZXJIVE1MfHxzKGEpfSl9ZnVuY3Rpb24gdCgpe3ZhciBiPXRoaXMubm9kZXM7YS50bXBsKG51bGwsbnVsbCxudWxsLHRoaXMpLmluc2VydEJlZm9yZShiWzBdKTthKGIpLnJlbW92ZSgpfX0pKGpRdWVyeSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiFmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImpxdWVyeSJdLGUpOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUocmVxdWlyZSgianF1ZXJ5IikpOmUoalF1ZXJ5KX0oZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1lLnRhYmxlc29ydGVyPXt2ZXJzaW9uOiIyLjMwLjUiLHBhcnNlcnM6W10sd2lkZ2V0czpbXSxkZWZhdWx0czp7dGhlbWU6ImRlZmF1bHQiLHdpZHRoRml4ZWQ6ITEsc2hvd1Byb2Nlc3Npbmc6ITEsaGVhZGVyVGVtcGxhdGU6Intjb250ZW50fSIsb25SZW5kZXJUZW1wbGF0ZTpudWxsLG9uUmVuZGVySGVhZGVyOm51bGwsY2FuY2VsU2VsZWN0aW9uOiEwLHRhYkluZGV4OiEwLGRhdGVGb3JtYXQ6Im1tZGR5eXl5Iixzb3J0TXVsdGlTb3J0S2V5OiJzaGlmdEtleSIsc29ydFJlc2V0S2V5OiJjdHJsS2V5Iix1c051bWJlckZvcm1hdDohMCxkZWxheUluaXQ6ITEsc2VydmVyU2lkZVNvcnRpbmc6ITEscmVzb3J0OiEwLGhlYWRlcnM6e30saWdub3JlQ2FzZTohMCxzb3J0Rm9yY2U6bnVsbCxzb3J0TGlzdDpbXSxzb3J0QXBwZW5kOm51bGwsc29ydFN0YWJsZTohMSxzb3J0SW5pdGlhbE9yZGVyOiJhc2MiLHNvcnRMb2NhbGVDb21wYXJlOiExLHNvcnRSZXNldDohMSxzb3J0UmVzdGFydDohMSxlbXB0eVRvOiJib3R0b20iLHN0cmluZ1RvOiJtYXgiLGR1cGxpY2F0ZVNwYW46ITAsdGV4dEV4dHJhY3Rpb246ImJhc2ljIix0ZXh0QXR0cmlidXRlOiJkYXRhLXRleHQiLHRleHRTb3J0ZXI6bnVsbCxudW1iZXJTb3J0ZXI6bnVsbCxpbml0V2lkZ2V0czohMCx3aWRnZXRDbGFzczoid2lkZ2V0LXtuYW1lfSIsd2lkZ2V0czpbXSx3aWRnZXRPcHRpb25zOnt6ZWJyYTpbImV2ZW4iLCJvZGQiXX0saW5pdGlhbGl6ZWQ6bnVsbCx0YWJsZUNsYXNzOiIiLGNzc0FzYzoiIixjc3NEZXNjOiIiLGNzc05vbmU6IiIsY3NzSGVhZGVyOiIiLGNzc0hlYWRlclJvdzoiIixjc3NQcm9jZXNzaW5nOiIiLGNzc0NoaWxkUm93OiJ0YWJsZXNvcnRlci1jaGlsZFJvdyIsY3NzSW5mb0Jsb2NrOiJ0YWJsZXNvcnRlci1pbmZvT25seSIsY3NzTm9Tb3J0OiJ0YWJsZXNvcnRlci1ub1NvcnQiLGNzc0lnbm9yZVJvdzoidGFibGVzb3J0ZXItaWdub3JlUm93Iixjc3NJY29uOiJ0YWJsZXNvcnRlci1pY29uIixjc3NJY29uTm9uZToiIixjc3NJY29uQXNjOiIiLGNzc0ljb25EZXNjOiIiLGNzc0ljb25EaXNhYmxlZDoiIixwb2ludGVyQ2xpY2s6ImNsaWNrIixwb2ludGVyRG93bjoibW91c2Vkb3duIixwb2ludGVyVXA6Im1vdXNldXAiLHNlbGVjdG9ySGVhZGVyczoiPiB0aGVhZCB0aCwgPiB0aGVhZCB0ZCIsc2VsZWN0b3JTb3J0OiJ0aCwgdGQiLHNlbGVjdG9yUmVtb3ZlOiIucmVtb3ZlLW1lIixkZWJ1ZzohMSxoZWFkZXJMaXN0OltdLGVtcHRpZXM6e30sc3RyaW5nczp7fSxwYXJzZXJzOltdLGdsb2JhbGl6ZTowLGltZ0F0dHI6MH0sY3NzOnt0YWJsZToidGFibGVzb3J0ZXIiLGNzc0hhc0NoaWxkOiJ0YWJsZXNvcnRlci1oYXNDaGlsZFJvdyIsY2hpbGRSb3c6InRhYmxlc29ydGVyLWNoaWxkUm93Iixjb2xncm91cDoidGFibGVzb3J0ZXItY29sZ3JvdXAiLGhlYWRlcjoidGFibGVzb3J0ZXItaGVhZGVyIixoZWFkZXJSb3c6InRhYmxlc29ydGVyLWhlYWRlclJvdyIsaGVhZGVySW46InRhYmxlc29ydGVyLWhlYWRlci1pbm5lciIsaWNvbjoidGFibGVzb3J0ZXItaWNvbiIscHJvY2Vzc2luZzoidGFibGVzb3J0ZXItcHJvY2Vzc2luZyIsc29ydEFzYzoidGFibGVzb3J0ZXItaGVhZGVyQXNjIixzb3J0RGVzYzoidGFibGVzb3J0ZXItaGVhZGVyRGVzYyIsc29ydE5vbmU6InRhYmxlc29ydGVyLWhlYWRlclVuU29ydGVkIn0sbGFuZ3VhZ2U6e3NvcnRBc2M6IkFzY2VuZGluZyBzb3J0IGFwcGxpZWQsICIsc29ydERlc2M6IkRlc2NlbmRpbmcgc29ydCBhcHBsaWVkLCAiLHNvcnROb25lOiJObyBzb3J0IGFwcGxpZWQsICIsc29ydERpc2FibGVkOiJzb3J0aW5nIGlzIGRpc2FibGVkIixuZXh0QXNjOiJhY3RpdmF0ZSB0byBhcHBseSBhbiBhc2NlbmRpbmcgc29ydCIsbmV4dERlc2M6ImFjdGl2YXRlIHRvIGFwcGx5IGEgZGVzY2VuZGluZyBzb3J0IixuZXh0Tm9uZToiYWN0aXZhdGUgdG8gcmVtb3ZlIHRoZSBzb3J0In0scmVnZXg6e3RlbXBsYXRlQ29udGVudDovXHtjb250ZW50XH0vZyx0ZW1wbGF0ZUljb246L1x7aWNvblx9L2csdGVtcGxhdGVOYW1lOi9ce25hbWVcfS9pLHNwYWNlczovXHMrL2csbm9uV29yZDovXFcvZyxmb3JtRWxlbWVudHM6LyhpbnB1dHxzZWxlY3R8YnV0dG9ufHRleHRhcmVhKS9pLGNodW5rOi8oXihbK1wtXT8oPzpcZCopKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPyk/JHxeMHhbMC05YS1mXSskfFxkKykvZ2ksY2h1bmtzOi8oXlxcMHxcXDAkKS8saGV4Oi9eMHhbMC05YS1mXSskL2ksY29tbWE6LywvZyxkaWdpdE5vblVTOi9bXHN8XC5dL2csZGlnaXROZWdhdGl2ZVRlc3Q6L15ccypcKFsuXGRdK1wpLyxkaWdpdE5lZ2F0aXZlUmVwbGFjZTovXlxzKlwoKFsuXGRdKylcKS8sZGlnaXRUZXN0Oi9eW1wtKyhdP1xkK1spXT8kLyxkaWdpdFJlcGxhY2U6L1ssLiciXHNdL2d9LHN0cmluZzp7bWF4OjEsbWluOi0xLGVtcHR5bWluOjEsZW1wdHltYXg6LTEsemVybzowLG5vbmU6MCwibnVsbCI6MCx0b3A6ITAsYm90dG9tOiExfSxrZXlDb2Rlczp7ZW50ZXI6MTN9LGRhdGVzOnt9LGluc3RhbmNlTWV0aG9kczp7fSxzZXR1cDpmdW5jdGlvbihyLG8pe2lmKHImJnIudEhlYWQmJjAhPT1yLnRCb2RpZXMubGVuZ3RoJiYhMCE9PXIuaGFzSW5pdGlhbGl6ZWQpe3ZhciBzPSIiLGE9ZShyKSxuPWUubWV0YWRhdGE7ci5oYXNJbml0aWFsaXplZD0hMSxyLmlzUHJvY2Vzc2luZz0hMCxyLmNvbmZpZz1vLGUuZGF0YShyLCJ0YWJsZXNvcnRlciIsbyksdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkluaXRpYWxpemluZyB0YWJsZXNvcnRlciB2Iit0LnZlcnNpb24pLGUuZGF0YShyLCJzdGFydG92ZXJhbGx0aW1lciIsbmV3IERhdGUpKSxvLnN1cHBvcnRzRGF0YU9iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZVswXT1wYXJzZUludChlWzBdLDEwKSxlWzBdPjF8fDE9PT1lWzBdJiZwYXJzZUludChlWzFdLDEwKT49NH0oZS5mbi5qcXVlcnkuc3BsaXQoIi4iKSksby5lbXB0eVRvPW8uZW1wdHlUby50b0xvd2VyQ2FzZSgpLG8uc3RyaW5nVG89by5zdHJpbmdUby50b0xvd2VyQ2FzZSgpLG8ubGFzdD17c29ydExpc3Q6W10sY2xpY2tlZEluZGV4Oi0xfSwvdGFibGVzb3J0ZXJcLS8udGVzdChhLmF0dHIoImNsYXNzIikpfHwocz0iIiE9PW8udGhlbWU/IiB0YWJsZXNvcnRlci0iK28udGhlbWU6IiIpLG8ubmFtZXNwYWNlP28ubmFtZXNwYWNlPSIuIitvLm5hbWVzcGFjZS5yZXBsYWNlKHQucmVnZXgubm9uV29yZCwiIik6by5uYW1lc3BhY2U9Ii50YWJsZXNvcnRlciIrTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiksby50YWJsZT1yLG8uJHRhYmxlPWEuYWRkQ2xhc3ModC5jc3MudGFibGUrIiAiK28udGFibGVDbGFzcytzKyIgIitvLm5hbWVzcGFjZS5zbGljZSgxKSkuYXR0cigicm9sZSIsImdyaWQiKSxvLiRoZWFkZXJzPWEuZmluZChvLnNlbGVjdG9ySGVhZGVycyksby4kdGFibGUuY2hpbGRyZW4oKS5jaGlsZHJlbigidHIiKS5hdHRyKCJyb2xlIiwicm93Iiksby4kdGJvZGllcz1hLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrby5jc3NJbmZvQmxvY2srIikiKS5hdHRyKHsiYXJpYS1saXZlIjoicG9saXRlIiwiYXJpYS1yZWxldmFudCI6ImFsbCJ9KSxvLiR0YWJsZS5jaGlsZHJlbigiY2FwdGlvbiIpLmxlbmd0aCYmKChzPW8uJHRhYmxlLmNoaWxkcmVuKCJjYXB0aW9uIilbMF0pLmlkfHwocy5pZD1vLm5hbWVzcGFjZS5zbGljZSgxKSsiY2FwdGlvbiIpLG8uJHRhYmxlLmF0dHIoImFyaWEtbGFiZWxsZWRieSIscy5pZCkpLG8ud2lkZ2V0SW5pdD17fSxvLnRleHRFeHRyYWN0aW9uPW8uJHRhYmxlLmF0dHIoImRhdGEtdGV4dC1leHRyYWN0aW9uIil8fG8udGV4dEV4dHJhY3Rpb258fCJiYXNpYyIsdC5idWlsZEhlYWRlcnMobyksdC5maXhDb2x1bW5XaWR0aChyKSx0LmFkZFdpZGdldEZyb21DbGFzcyhyKSx0LmFwcGx5V2lkZ2V0T3B0aW9ucyhyKSx0LnNldHVwUGFyc2VycyhvKSxvLnRvdGFsUm93cz0wLG8uZGVidWcmJnQudmFsaWRhdGVPcHRpb25zKG8pLG8uZGVsYXlJbml0fHx0LmJ1aWxkQ2FjaGUobyksdC5iaW5kRXZlbnRzKHIsby4kaGVhZGVycywhMCksdC5iaW5kTWV0aG9kcyhvKSxvLnN1cHBvcnRzRGF0YU9iamVjdCYmdm9pZCAwIT09YS5kYXRhKCkuc29ydGxpc3Q/by5zb3J0TGlzdD1hLmRhdGEoKS5zb3J0bGlzdDpuJiZhLm1ldGFkYXRhKCkmJmEubWV0YWRhdGEoKS5zb3J0bGlzdCYmKG8uc29ydExpc3Q9YS5tZXRhZGF0YSgpLnNvcnRsaXN0KSx0LmFwcGx5V2lkZ2V0KHIsITApLG8uc29ydExpc3QubGVuZ3RoPjA/dC5zb3J0T24obyxvLnNvcnRMaXN0LHt9LCFvLmluaXRXaWRnZXRzKToodC5zZXRIZWFkZXJzQ3NzKG8pLG8uaW5pdFdpZGdldHMmJnQuYXBwbHlXaWRnZXQociwhMSkpLG8uc2hvd1Byb2Nlc3NpbmcmJmEudW5iaW5kKCJzb3J0QmVnaW4iK28ubmFtZXNwYWNlKyIgc29ydEVuZCIrby5uYW1lc3BhY2UpLmJpbmQoInNvcnRCZWdpbiIrby5uYW1lc3BhY2UrIiBzb3J0RW5kIitvLm5hbWVzcGFjZSxmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoby50aW1lclByb2Nlc3NpbmcpLHQuaXNQcm9jZXNzaW5nKHIpLCJzb3J0QmVnaW4iPT09ZS50eXBlJiYoby50aW1lclByb2Nlc3Npbmc9c2V0VGltZW91dChmdW5jdGlvbigpe3QuaXNQcm9jZXNzaW5nKHIsITApfSw1MDApKX0pLHIuaGFzSW5pdGlhbGl6ZWQ9ITAsci5pc1Byb2Nlc3Npbmc9ITEsdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlLmxvZygiT3ZlcmFsbCBpbml0aWFsaXphdGlvbiB0aW1lOiIrdC5iZW5jaG1hcmsoZS5kYXRhKHIsInN0YXJ0b3ZlcmFsbHRpbWVyIikpKSx0LmRlYnVnKG8sImNvcmUiKSYmY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSxhLnRyaWdnZXJIYW5kbGVyKCJ0YWJsZXNvcnRlci1pbml0aWFsaXplZCIsciksImZ1bmN0aW9uIj09dHlwZW9mIG8uaW5pdGlhbGl6ZWQmJm8uaW5pdGlhbGl6ZWQocil9ZWxzZSB0LmRlYnVnKG8sImNvcmUiKSYmKHIuaGFzSW5pdGlhbGl6ZWQ/Y29uc29sZS53YXJuKCJTdG9wcGluZyBpbml0aWFsaXphdGlvbi4gVGFibGVzb3J0ZXIgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCIpOmNvbnNvbGUuZXJyb3IoIlN0b3BwaW5nIGluaXRpYWxpemF0aW9uISBObyB0YWJsZSwgdGhlYWQgb3IgdGJvZHkiLHIpKX0sYmluZE1ldGhvZHM6ZnVuY3Rpb24ocil7dmFyIG89ci4kdGFibGUscz1yLm5hbWVzcGFjZSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgYWRkUm93cyB1cGRhdGVDZWxsIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyBkZXN0cm95IG1vdXNldXAgbW91c2VsZWF2ZSAiLnNwbGl0KCIgIikuam9pbihzKyIgIik7by51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLmJpbmQoInNvcnRSZXNldCIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5zb3J0UmVzZXQodGhpcy5jb25maWcsZnVuY3Rpb24oZSl7ZS5pc0FwcGx5aW5nV2lkZ2V0cz9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5hcHBseVdpZGdldChlLCIiLHIpfSwxMDApOnQuYXBwbHlXaWRnZXQoZSwiIixyKX0pfSkuYmluZCgidXBkYXRlQWxsIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQWxsKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGUiK3MrIiB1cGRhdGVSb3dzIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGVIZWFkZXJzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUhlYWRlcnModGhpcy5jb25maWcscil9KS5iaW5kKCJ1cGRhdGVDZWxsIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC51cGRhdGVDZWxsKHRoaXMuY29uZmlnLHIsbyxzKX0pLmJpbmQoImFkZFJvd3MiK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFkZFJvd3ModGhpcy5jb25maWcscixvLHMpfSkuYmluZCgidXBkYXRlQ29tcGxldGUiK3MsZnVuY3Rpb24oKXt0aGlzLmlzVXBkYXRpbmc9ITF9KS5iaW5kKCJzb3J0b24iK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnNvcnRPbih0aGlzLmNvbmZpZyxyLG8scyl9KS5iaW5kKCJhcHBlbmRDYWNoZSIrcyxmdW5jdGlvbihyLG8scyl7ci5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGVuZENhY2hlKHRoaXMuY29uZmlnLHMpLGUuaXNGdW5jdGlvbihvKSYmbyh0aGlzKX0pLmJpbmQoInVwZGF0ZUNhY2hlIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQ2FjaGUodGhpcy5jb25maWcscixvKX0pLmJpbmQoImFwcGx5V2lkZ2V0SWQiK3MsZnVuY3Rpb24oZSxyKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuYXBwbHlXaWRnZXRJZCh0aGlzLHIpfSkuYmluZCgiYXBwbHlXaWRnZXRzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGx5V2lkZ2V0KHRoaXMsITEscil9KS5iaW5kKCJyZWZyZXNoV2lkZ2V0cyIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlZnJlc2hXaWRnZXRzKHRoaXMscixvKX0pLmJpbmQoInJlbW92ZVdpZGdldCIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlbW92ZVdpZGdldCh0aGlzLHIsbyl9KS5iaW5kKCJkZXN0cm95IitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuZGVzdHJveSh0aGlzLHIsbyl9KS5iaW5kKCJyZXNldFRvTG9hZFN0YXRlIitzLGZ1bmN0aW9uKG8pe28uc3RvcFByb3BhZ2F0aW9uKCksdC5yZW1vdmVXaWRnZXQodGhpcywhMCwhMSk7dmFyIHM9ZS5leHRlbmQoITAse30sci5vcmlnaW5hbFNldHRpbmdzKTsocj1lLmV4dGVuZCghMCx7fSx0LmRlZmF1bHRzLHMpKS5vcmlnaW5hbFNldHRpbmdzPXMsdGhpcy5oYXNJbml0aWFsaXplZD0hMSx0LnNldHVwKHRoaXMscil9KX0sYmluZEV2ZW50czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbj0ocj1lKHIpWzBdKS5jb25maWcsaT1uLm5hbWVzcGFjZSxsPW51bGw7ITAhPT1zJiYoby5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfaGVhZGVycyIpLChhPXQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpKS5sZW5ndGgmJiJUQUJMRSI9PT1hWzBdLm5vZGVOYW1lJiZhWzBdIT09ciYmZShhWzBdKS5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfdGFibGUiKSksYT0obi5wb2ludGVyRG93bisiICIrbi5wb2ludGVyVXArIiAiK24ucG9pbnRlckNsaWNrKyIgc29ydCBrZXl1cCAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikuc3BsaXQoIiAiKS5qb2luKGkrIiAiKSxvLmZpbmQobi5zZWxlY3RvclNvcnQpLmFkZChvLmZpbHRlcihuLnNlbGVjdG9yU29ydCkpLnVuYmluZChhKS5iaW5kKGEsZnVuY3Rpb24ocixvKXt2YXIgcyxhLGksZD1lKHIudGFyZ2V0KSxjPSIgIityLnR5cGUrIiAiO2lmKCEoMSE9PShyLndoaWNofHxyLmJ1dHRvbikmJiFjLm1hdGNoKCIgIituLnBvaW50ZXJDbGljaysiIHwgc29ydCB8IGtleXVwICIpfHwiIGtleXVwICI9PT1jJiZyLndoaWNoIT09dC5rZXlDb2Rlcy5lbnRlcnx8Yy5tYXRjaCgiICIrbi5wb2ludGVyQ2xpY2srIiAiKSYmdm9pZCAwIT09ci53aGljaHx8Yy5tYXRjaCgiICIrbi5wb2ludGVyVXArIiAiKSYmbCE9PXIudGFyZ2V0JiYhMCE9PW8pKXtpZihjLm1hdGNoKCIgIituLnBvaW50ZXJEb3duKyIgIikpcmV0dXJuIGw9ci50YXJnZXQsdm9pZCgiMSI9PT0oaT1kLmpxdWVyeS5zcGxpdCgiLiIpKVswXSYmaVsxXTw0JiZyLnByZXZlbnREZWZhdWx0KCkpO2lmKGw9bnVsbCxzPXQuZ2V0Q2xvc2VzdChlKHRoaXMpLCIuIit0LmNzcy5oZWFkZXIpLHQucmVnZXguZm9ybUVsZW1lbnRzLnRlc3Qoci50YXJnZXQubm9kZU5hbWUpfHxkLmhhc0NsYXNzKG4uY3NzTm9Tb3J0KXx8ZC5wYXJlbnRzKCIuIituLmNzc05vU29ydCkubGVuZ3RoPjB8fHMuaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHxkLnBhcmVudHMoImJ1dHRvbiIpLmxlbmd0aD4wKXJldHVybiFuLmNhbmNlbFNlbGVjdGlvbjtuLmRlbGF5SW5pdCYmdC5pc0VtcHR5T2JqZWN0KG4uY2FjaGUpJiZ0LmJ1aWxkQ2FjaGUobiksbi5sYXN0LmNsaWNrZWRJbmRleD1zLmF0dHIoImRhdGEtY29sdW1uIil8fHMuaW5kZXgoKSwoYT1uLiRoZWFkZXJJbmRleGVkW24ubGFzdC5jbGlja2VkSW5kZXhdWzBdKSYmIWEuc29ydERpc2FibGVkJiZ0LmluaXRTb3J0KG4sYSxyKX19KSxuLmNhbmNlbFNlbGVjdGlvbiYmby5hdHRyKCJ1bnNlbGVjdGFibGUiLCJvbiIpLmJpbmQoInNlbGVjdHN0YXJ0IiwhMSkuY3NzKHsidXNlci1zZWxlY3QiOiJub25lIixNb3pVc2VyU2VsZWN0OiJub25lIn0pfSxidWlsZEhlYWRlcnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG47Zm9yKHIuaGVhZGVyTGlzdD1bXSxyLmhlYWRlckNvbnRlbnQ9W10sci5zb3J0VmFycz1bXSx0LmRlYnVnKHIsImNvcmUiKSYmKGE9bmV3IERhdGUpLHIuY29sdW1ucz10LmNvbXB1dGVDb2x1bW5JbmRleChyLiR0YWJsZS5jaGlsZHJlbigidGhlYWQsIHRmb290IikuY2hpbGRyZW4oInRyIikpLHM9ci5jc3NJY29uPyc8aSBjbGFzcz0iJysoci5jc3NJY29uPT09dC5jc3MuaWNvbj90LmNzcy5pY29uOnIuY3NzSWNvbisiICIrdC5jc3MuaWNvbikrJyI+PC9pPic6IiIsci4kaGVhZGVycz1lKGUubWFwKHIuJHRhYmxlLmZpbmQoci5zZWxlY3RvckhlYWRlcnMpLGZ1bmN0aW9uKG8sYSl7dmFyIG4saSxsLGQsYyxnPWUobyk7aWYoIXQuZ2V0Q2xvc2VzdChnLCJ0ciIpLmhhc0NsYXNzKHIuY3NzSWdub3JlUm93KSlyZXR1cm4vKHRofHRkKS9pLnRlc3Qoby5ub2RlTmFtZSl8fChjPXQuZ2V0Q2xvc2VzdChnLCJ0aCwgdGQiKSxnLmF0dHIoImRhdGEtY29sdW1uIixjLmF0dHIoImRhdGEtY29sdW1uIikpKSxuPXQuZ2V0Q29sdW1uRGF0YShyLnRhYmxlLHIuaGVhZGVycyxhLCEwKSxyLmhlYWRlckNvbnRlbnRbYV09Zy5odG1sKCksIiI9PT1yLmhlYWRlclRlbXBsYXRlfHxnLmZpbmQoIi4iK3QuY3NzLmhlYWRlckluKS5sZW5ndGh8fChkPXIuaGVhZGVyVGVtcGxhdGUucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlQ29udGVudCxnLmh0bWwoKSkucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlSWNvbixnLmZpbmQoIi4iK3QuY3NzLmljb24pLmxlbmd0aD8iIjpzKSxyLm9uUmVuZGVyVGVtcGxhdGUmJihpPXIub25SZW5kZXJUZW1wbGF0ZS5hcHBseShnLFthLGRdKSkmJiJzdHJpbmciPT10eXBlb2YgaSYmKGQ9aSksZy5odG1sKCc8ZGl2IGNsYXNzPSInK3QuY3NzLmhlYWRlckluKyciPicrZCsiPC9kaXY+IikpLHIub25SZW5kZXJIZWFkZXImJnIub25SZW5kZXJIZWFkZXIuYXBwbHkoZyxbYSxyLHIuJHRhYmxlXSksbD1wYXJzZUludChnLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG8uY29sdW1uPWwsYz10LmdldE9yZGVyKHQuZ2V0RGF0YShnLG4sInNvcnRJbml0aWFsT3JkZXIiKXx8ci5zb3J0SW5pdGlhbE9yZGVyKSxyLnNvcnRWYXJzW2xdPXtjb3VudDotMSxvcmRlcjpjP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxsb2NrZWRPcmRlcjohMX0sdm9pZCAwIT09KGM9dC5nZXREYXRhKGcsbiwibG9ja2VkT3JkZXIiKXx8ITEpJiYhMSE9PWMmJihyLnNvcnRWYXJzW2xdLmxvY2tlZE9yZGVyPSEwLHIuc29ydFZhcnNbbF0ub3JkZXI9dC5nZXRPcmRlcihjKT9bMSwxXTpbMCwwXSksci5oZWFkZXJMaXN0W2FdPW8sZy5hZGRDbGFzcyh0LmNzcy5oZWFkZXIrIiAiK3IuY3NzSGVhZGVyKSx0LmdldENsb3Nlc3QoZywidHIiKS5hZGRDbGFzcyh0LmNzcy5oZWFkZXJSb3crIiAiK3IuY3NzSGVhZGVyUm93KS5hdHRyKCJyb2xlIiwicm93Iiksci50YWJJbmRleCYmZy5hdHRyKCJ0YWJpbmRleCIsMCksb30pKSxyLiRoZWFkZXJJbmRleGVkPVtdLG49MDtuPHIuY29sdW1ucztuKyspdC5pc0VtcHR5T2JqZWN0KHIuc29ydFZhcnNbbl0pJiYoci5zb3J0VmFyc1tuXT17fSksbz1yLiRoZWFkZXJzLmZpbHRlcignW2RhdGEtY29sdW1uPSInK24rJyJdJyksci4kaGVhZGVySW5kZXhlZFtuXT1vLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcigiOmxhc3QiKTpvLmZpbHRlcigiOmxhc3QiKTplKCk7ci4kdGFibGUuZmluZChyLnNlbGVjdG9ySGVhZGVycykuYXR0cih7c2NvcGU6ImNvbCIscm9sZToiY29sdW1uaGVhZGVyIn0pLHQudXBkYXRlSGVhZGVyKHIpLHQuZGVidWcociwiY29yZSIpJiYoY29uc29sZS5sb2coIkJ1aWx0IGhlYWRlcnM6Iit0LmJlbmNobWFyayhhKSksY29uc29sZS5sb2coci4kaGVhZGVycykpfSxhZGRJbnN0YW5jZU1ldGhvZHM6ZnVuY3Rpb24ocil7ZS5leHRlbmQodC5pbnN0YW5jZU1ldGhvZHMscil9LHNldHVwUGFyc2VyczpmdW5jdGlvbihlLHIpe3ZhciBvLHMsYSxuLGksbCxkLGMsZyxwLHUsZixoLG0sYj1lLnRhYmxlLHk9MCx3PXQuZGVidWcoZSwiY29yZSIpLHg9e307aWYoZS4kdGJvZGllcz1lLiR0YWJsZS5jaGlsZHJlbigidGJvZHk6bm90KC4iK2UuY3NzSW5mb0Jsb2NrKyIpIiksaD12b2lkIDA9PT1yP2UuJHRib2RpZXM6ciwwPT09KG09aC5sZW5ndGgpKXJldHVybiB3P2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgcGFyc2VyIGNhY2hlIik6IiI7Zm9yKHcmJihmPW5ldyBEYXRlLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiRGV0ZWN0aW5nIHBhcnNlcnMgZm9yIGVhY2ggY29sdW1uIikpLHM9e2V4dHJhY3RvcnM6W10scGFyc2VyczpbXX07eTxtOyl7aWYoKG89aFt5XS5yb3dzKS5sZW5ndGgpZm9yKGk9MCxuPWUuY29sdW1ucyxsPTA7bDxuO2wrKyl7aWYoKGQ9ZS4kaGVhZGVySW5kZXhlZFtpXSkmJmQubGVuZ3RoJiYoYz10LmdldENvbHVtbkRhdGEoYixlLmhlYWRlcnMsaSksdT10LmdldFBhcnNlckJ5SWQodC5nZXREYXRhKGQsYywiZXh0cmFjdG9yIikpLHA9dC5nZXRQYXJzZXJCeUlkKHQuZ2V0RGF0YShkLGMsInNvcnRlciIpKSxnPSJmYWxzZSI9PT10LmdldERhdGEoZCxjLCJwYXJzZXIiKSxlLmVtcHRpZXNbaV09KHQuZ2V0RGF0YShkLGMsImVtcHR5Iil8fGUuZW1wdHlUb3x8KGUuZW1wdHlUb0JvdHRvbT8iYm90dG9tIjoidG9wIikpLnRvTG93ZXJDYXNlKCksZS5zdHJpbmdzW2ldPSh0LmdldERhdGEoZCxjLCJzdHJpbmciKXx8ZS5zdHJpbmdUb3x8Im1heCIpLnRvTG93ZXJDYXNlKCksZyYmKHA9dC5nZXRQYXJzZXJCeUlkKCJuby1wYXJzZXIiKSksdXx8KHU9ITEpLHB8fChwPXQuZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKGUsbywtMSxpKSksdyYmKHhbIigiK2krIikgIitkLnRleHQoKV09e3BhcnNlcjpwLmlkLGV4dHJhY3Rvcjp1P3UuaWQ6Im5vbmUiLHN0cmluZzplLnN0cmluZ3NbaV0sZW1wdHk6ZS5lbXB0aWVzW2ldfSkscy5wYXJzZXJzW2ldPXAscy5leHRyYWN0b3JzW2ldPXUsKGE9ZFswXS5jb2xTcGFuLTEpPjApKWZvcihpKz1hLG4rPWE7YSsxPjA7KXMucGFyc2Vyc1tpLWFdPXAscy5leHRyYWN0b3JzW2ktYV09dSxhLS07aSsrfXkrPXMucGFyc2Vycy5sZW5ndGg/bToxfXcmJih0LmlzRW1wdHlPYmplY3QoeCk/Y29uc29sZS53YXJuKCIgIE5vIHBhcnNlcnMgZGV0ZWN0ZWQhIik6Y29uc29sZVtjb25zb2xlLnRhYmxlPyJ0YWJsZSI6ImxvZyJdKHgpLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgZGV0ZWN0aW5nIHBhcnNlcnMiK3QuYmVuY2htYXJrKGYpKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpLGUucGFyc2Vycz1zLnBhcnNlcnMsZS5leHRyYWN0b3JzPXMuZXh0cmFjdG9yc30sYWRkUGFyc2VyOmZ1bmN0aW9uKGUpe3ZhciByLG89dC5wYXJzZXJzLmxlbmd0aCxzPSEwO2ZvcihyPTA7cjxvO3IrKyl0LnBhcnNlcnNbcl0uaWQudG9Mb3dlckNhc2UoKT09PWUuaWQudG9Mb3dlckNhc2UoKSYmKHM9ITEpO3MmJih0LnBhcnNlcnNbdC5wYXJzZXJzLmxlbmd0aF09ZSl9LGdldFBhcnNlckJ5SWQ6ZnVuY3Rpb24oZSl7aWYoImZhbHNlIj09ZSlyZXR1cm4hMTt2YXIgcixvPXQucGFyc2Vycy5sZW5ndGg7Zm9yKHI9MDtyPG87cisrKWlmKHQucGFyc2Vyc1tyXS5pZC50b0xvd2VyQ2FzZSgpPT09ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHQucGFyc2Vyc1tyXTtyZXR1cm4hMX0sZGV0ZWN0UGFyc2VyRm9yQ29sdW1uOmZ1bmN0aW9uKHIsbyxzLGEpe2Zvcih2YXIgbixpLGwsZD10LnBhcnNlcnMubGVuZ3RoLGM9ITEsZz0iIixwPXQuZGVidWcociwiY29yZSIpLHU9ITA7IiI9PT1nJiZ1OykobD1vWysrc10pJiZzPDUwP2wuY2xhc3NOYW1lLmluZGV4T2YodC5jc3NJZ25vcmVSb3cpPDAmJihjPW9bc10uY2VsbHNbYV0sZz10LmdldEVsZW1lbnRUZXh0KHIsYyxhKSxpPWUoYykscCYmY29uc29sZS5sb2coIkNoZWNraW5nIGlmIHZhbHVlIHdhcyBlbXB0eSBvbiByb3cgIitzKyIsIGNvbHVtbjogIithKyc6ICInK2crJyInKSk6dT0hMTtmb3IoOy0tZD49MDspaWYoKG49dC5wYXJzZXJzW2RdKSYmInRleHQiIT09bi5pZCYmbi5pcyYmbi5pcyhnLHIudGFibGUsYyxpKSlyZXR1cm4gbjtyZXR1cm4gdC5nZXRQYXJzZXJCeUlkKCJ0ZXh0Iil9LGdldEVsZW1lbnRUZXh0OmZ1bmN0aW9uKHIsbyxzKXtpZighbylyZXR1cm4iIjt2YXIgYSxuPXIudGV4dEV4dHJhY3Rpb258fCIiLGk9by5qcXVlcnk/bzplKG8pO3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8iYmFzaWMiPT09biYmdm9pZCAwIT09KGE9aS5hdHRyKHIudGV4dEF0dHJpYnV0ZSkpP2UudHJpbShhKTplLnRyaW0oby50ZXh0Q29udGVudHx8aS50ZXh0KCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP2UudHJpbShuKGlbMF0sci50YWJsZSxzKSk6ImZ1bmN0aW9uIj09dHlwZW9mKGE9dC5nZXRDb2x1bW5EYXRhKHIudGFibGUsbixzKSk/ZS50cmltKGEoaVswXSxyLnRhYmxlLHMpKTplLnRyaW0oaVswXS50ZXh0Q29udGVudHx8aS50ZXh0KCkpfSxnZXRQYXJzZWRUZXh0OmZ1bmN0aW9uKGUscixvLHMpe3ZvaWQgMD09PXMmJihzPXQuZ2V0RWxlbWVudFRleHQoZSxyLG8pKTt2YXIgYT0iIitzLG49ZS5wYXJzZXJzW29dLGk9ZS5leHRyYWN0b3JzW29dO3JldHVybiBuJiYoaSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuZm9ybWF0JiYocz1pLmZvcm1hdChzLGUudGFibGUscixvKSksYT0ibm8tcGFyc2VyIj09PW4uaWQ/IiI6bi5mb3JtYXQoIiIrcyxlLnRhYmxlLHIsbyksZS5pZ25vcmVDYXNlJiYic3RyaW5nIj09dHlwZW9mIGEmJihhPWEudG9Mb3dlckNhc2UoKSkpLGF9LGJ1aWxkQ2FjaGU6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYyxnLHAsdSxmLGgsbSxiLHksdyx4LHYsQywkLEksRCxSLFQ9ci50YWJsZSxMPXIucGFyc2VycyxBPXQuZGVidWcociwiY29yZSIpO2lmKHIuJHRib2RpZXM9ci4kdGFibGUuY2hpbGRyZW4oInRib2R5Om5vdCguIityLmNzc0luZm9CbG9jaysiKSIpLGc9dm9pZCAwPT09cz9yLiR0Ym9kaWVzOnMsci5jYWNoZT17fSxyLnRvdGFsUm93cz0wLCFMKXJldHVybiBBP2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgY2FjaGUiKToiIjtmb3IoQSYmKG09bmV3IERhdGUpLHIuc2hvd1Byb2Nlc3NpbmcmJnQuaXNQcm9jZXNzaW5nKFQsITApLGM9MDtjPGcubGVuZ3RoO2MrKyl7Zm9yKHg9W10sYT1yLmNhY2hlW2NdPXtub3JtYWxpemVkOltdfSxiPWdbY10mJmdbY10ucm93cy5sZW5ndGh8fDAsbD0wO2w8YjsrK2wpaWYoeT17Y2hpbGQ6W10scmF3OltdfSxwPWUoZ1tjXS5yb3dzW2xdKSx1PVtdLCFwLmhhc0NsYXNzKHIuc2VsZWN0b3JSZW1vdmUuc2xpY2UoMSkpKWlmKHAuaGFzQ2xhc3Moci5jc3NDaGlsZFJvdykmJjAhPT1sKWZvcihEPWEubm9ybWFsaXplZC5sZW5ndGgtMSwodz1hLm5vcm1hbGl6ZWRbRF1bci5jb2x1bW5zXSkuJHJvdz13LiRyb3cuYWRkKHApLHAucHJldigpLmhhc0NsYXNzKHIuY3NzQ2hpbGRSb3cpfHxwLnByZXYoKS5hZGRDbGFzcyh0LmNzcy5jc3NIYXNDaGlsZCksZj1wLmNoaWxkcmVuKCJ0aCwgdGQiKSxEPXcuY2hpbGQubGVuZ3RoLHcuY2hpbGRbRF09W10sQz0wLEk9ci5jb2x1bW5zLGQ9MDtkPEk7ZCsrKShoPWZbZF0pJiYody5jaGlsZFtEXVtkXT10LmdldFBhcnNlZFRleHQocixoLGQpLCh2PWZbZF0uY29sU3Bhbi0xKT4wJiYoQys9dixJKz12KSksQysrO2Vsc2V7Zm9yKHkuJHJvdz1wLHkub3JkZXI9bCxDPTAsST1yLmNvbHVtbnMsZD0wO2Q8STsrK2Qpe2lmKChoPXBbMF0uY2VsbHNbZF0pJiZDPHIuY29sdW1ucyYmKCEoJD12b2lkIDAhPT1MW0NdKSYmQSYmY29uc29sZS53YXJuKCJObyBwYXJzZXIgZm91bmQgZm9yIHJvdzogIitsKyIsIGNvbHVtbjogIitkKyc7IGNlbGwgY29udGFpbmluZzogIicrZShoKS50ZXh0KCkrJyI7IGRvZXMgaXQgaGF2ZSBhIGhlYWRlcj8nKSxuPXQuZ2V0RWxlbWVudFRleHQocixoLEMpLHkucmF3W0NdPW4saT10LmdldFBhcnNlZFRleHQocixoLEMsbiksdVtDXT1pLCQmJiJudW1lcmljIj09PShMW0NdLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpJiYoeFtDXT1NYXRoLm1heChNYXRoLmFicyhpKXx8MCx4W0NdfHwwKSksKHY9aC5jb2xTcGFuLTEpPjApKXtmb3IoUj0wO1I8PXY7KWk9ci5kdXBsaWNhdGVTcGFufHwwPT09Uj9uOiJzdHJpbmciIT10eXBlb2Ygci50ZXh0RXh0cmFjdGlvbj90LmdldEVsZW1lbnRUZXh0KHIsaCxDK1IpfHwiIjoiIix5LnJhd1tDK1JdPWksdVtDK1JdPWksUisrO0MrPXYsSSs9dn1DKyt9dVtyLmNvbHVtbnNdPXksYS5ub3JtYWxpemVkW2Eubm9ybWFsaXplZC5sZW5ndGhdPXV9YS5jb2xNYXg9eCxyLnRvdGFsUm93cys9YS5ub3JtYWxpemVkLmxlbmd0aH1pZihyLnNob3dQcm9jZXNzaW5nJiZ0LmlzUHJvY2Vzc2luZyhUKSxBKXtmb3IoRD1NYXRoLm1pbig1LHIuY2FjaGVbMF0ubm9ybWFsaXplZC5sZW5ndGgpLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiQnVpbGRpbmcgY2FjaGUgZm9yICIrci50b3RhbFJvd3MrIiByb3dzIChzaG93aW5nICIrRCsiIHJvd3MgaW4gbG9nKSBhbmQgIityLmNvbHVtbnMrIiBjb2x1bW5zIit0LmJlbmNobWFyayhtKSksbj17fSxkPTA7ZDxyLmNvbHVtbnM7ZCsrKWZvcihDPTA7QzxEO0MrKyluWyJyb3c6ICIrQ118fChuWyJyb3c6ICIrQ109e30pLG5bInJvdzogIitDXVtyLiRoZWFkZXJJbmRleGVkW2RdLnRleHQoKV09ci5jYWNoZVswXS5ub3JtYWxpemVkW0NdW2RdO2NvbnNvbGVbY29uc29sZS50YWJsZT8idGFibGUiOiJsb2ciXShuKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9ZS5pc0Z1bmN0aW9uKG8pJiZvKFQpfSxnZXRDb2x1bW5UZXh0OmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG09ImZ1bmN0aW9uIj09dHlwZW9mIHMsYj0iYWxsIj09PW8seT17cmF3OltdLHBhcnNlZDpbXSwkY2VsbDpbXX0sdz0ocj1lKHIpWzBdKS5jb25maWc7aWYoIXQuaXNFbXB0eU9iamVjdCh3KSl7Zm9yKGM9dy4kdGJvZGllcy5sZW5ndGgsbj0wO248YztuKyspZm9yKGc9KGw9dy5jYWNoZVtuXS5ub3JtYWxpemVkKS5sZW5ndGgsaT0wO2k8ZztpKyspZD1sW2ldLGEmJiFkW3cuY29sdW1uc10uJHJvdy5pcyhhKXx8KGg9ITAsdT1iP2Quc2xpY2UoMCx3LmNvbHVtbnMpOmRbb10sZD1kW3cuY29sdW1uc10scD1iP2QucmF3OmQucmF3W29dLGY9Yj9kLiRyb3cuY2hpbGRyZW4oKTpkLiRyb3cuY2hpbGRyZW4oKS5lcShvKSxtJiYoaD1zKHt0Ym9keUluZGV4Om4scm93SW5kZXg6aSxwYXJzZWQ6dSxyYXc6cCwkcm93OmQuJHJvdywkY2VsbDpmfSkpLCExIT09aCYmKHkucGFyc2VkW3kucGFyc2VkLmxlbmd0aF09dSx5LnJhd1t5LnJhdy5sZW5ndGhdPXAseS4kY2VsbFt5LiRjZWxsLmxlbmd0aF09ZikpO3JldHVybiB5fXQuZGVidWcodywiY29yZSIpJiZjb25zb2xlLndhcm4oIk5vIGNhY2hlIGZvdW5kIC0gYWJvcnRpbmcgZ2V0Q29sdW1uVGV4dCBmdW5jdGlvbiEiKX0sc2V0SGVhZGVyc0NzczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ci5zb3J0TGlzdCxuPWEubGVuZ3RoLGk9dC5jc3Muc29ydE5vbmUrIiAiK3IuY3NzTm9uZSxsPVt0LmNzcy5zb3J0QXNjKyIgIityLmNzc0FzYyx0LmNzcy5zb3J0RGVzYysiICIrci5jc3NEZXNjXSxkPVtyLmNzc0ljb25Bc2Msci5jc3NJY29uRGVzYyxyLmNzc0ljb25Ob25lXSxjPVsiYXNjZW5kaW5nIiwiZGVzY2VuZGluZyJdLGc9ZnVuY3Rpb24oZSxyKXtlLnJlbW92ZUNsYXNzKGkpLmFkZENsYXNzKGxbcl0pLmF0dHIoImFyaWEtc29ydCIsY1tyXSkuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZFsyXSkuYWRkQ2xhc3MoZFtyXSl9LHA9ci4kdGFibGUuZmluZCgidGZvb3QgdHIiKS5jaGlsZHJlbigidGQsIHRoIikuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKSx1PXIuJGhlYWRlcnMuYWRkKGUoInRoZWFkICIrci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKS5hZGRDbGFzcyhpKS5hdHRyKCJhcmlhLXNvcnQiLCJub25lIikuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZC5qb2luKCIgIikpLmVuZCgpO2Zvcih1Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKGRbMl0pLHIuY3NzSWNvbkRpc2FibGVkJiZ1LmZpbHRlcigiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKHIuY3NzSWNvbkRpc2FibGVkKSxvPTA7bzxuO28rKylpZigyIT09YVtvXVsxXSl7aWYodT1yLiRoZWFkZXJzLmZpbHRlcihmdW5jdGlvbihlKXtmb3IodmFyIG89ITAscz1yLiRoZWFkZXJzLmVxKGUpLGE9cGFyc2VJbnQocy5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxuPWErdC5nZXRDbG9zZXN0KHMsInRoLCB0ZCIpWzBdLmNvbFNwYW47YTxuO2ErKylvPSEhbyYmKG98fHQuaXNWYWx1ZUluQXJyYXkoYSxyLnNvcnRMaXN0KT4tMSk7cmV0dXJuIG99KSwodT11Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcignW2RhdGEtY29sdW1uPSInK2Fbb11bMF0rJyJdJysoMT09PW4/IjpsYXN0IjoiIikpKS5sZW5ndGgpZm9yKHM9MDtzPHUubGVuZ3RoO3MrKyl1W3NdLnNvcnREaXNhYmxlZHx8Zyh1LmVxKHMpLGFbb11bMV0pO3AubGVuZ3RoJiZnKHAuZmlsdGVyKCdbZGF0YS1jb2x1bW49IicrYVtvXVswXSsnIl0nKSxhW29dWzFdKX1mb3Iobj1yLiRoZWFkZXJzLmxlbmd0aCxvPTA7bzxuO28rKyl0LnNldENvbHVtbkFyaWFMYWJlbChyLHIuJGhlYWRlcnMuZXEobykpfSxnZXRDbG9zZXN0OmZ1bmN0aW9uKHQscil7cmV0dXJuIGUuZm4uY2xvc2VzdD90LmNsb3Nlc3Qocik6dC5pcyhyKT90OnQucGFyZW50cyhyKS5maWx0ZXIoIjpmaXJzdCIpfSxzZXRDb2x1bW5BcmlhTGFiZWw6ZnVuY3Rpb24ocixvLHMpe2lmKG8ubGVuZ3RoKXt2YXIgYT1wYXJzZUludChvLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG49ci5zb3J0VmFyc1thXSxpPW8uaGFzQ2xhc3ModC5jc3Muc29ydEFzYyk/InNvcnRBc2MiOm8uaGFzQ2xhc3ModC5jc3Muc29ydERlc2MpPyJzb3J0RGVzYyI6InNvcnROb25lIixsPWUudHJpbShvLnRleHQoKSkrIjogIit0Lmxhbmd1YWdlW2ldO28uaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHwhMT09PXM/bCs9dC5sYW5ndWFnZS5zb3J0RGlzYWJsZWQ6KGk9KG4uY291bnQrMSklbi5vcmRlci5sZW5ndGgscz1uLm9yZGVyW2ldLGwrPXQubGFuZ3VhZ2VbMD09PXM/Im5leHRBc2MiOjE9PT1zPyJuZXh0RGVzYyI6Im5leHROb25lIl0pLG8uYXR0cigiYXJpYS1sYWJlbCIsbCl9fSx1cGRhdGVIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9ZS4kaGVhZGVycy5sZW5ndGg7Zm9yKHI9MDtyPGk7cisrKXM9ZS4kaGVhZGVycy5lcShyKSxhPXQuZ2V0Q29sdW1uRGF0YShuLGUuaGVhZGVycyxyLCEwKSxvPSJmYWxzZSI9PT10LmdldERhdGEocyxhLCJzb3J0ZXIiKXx8ImZhbHNlIj09PXQuZ2V0RGF0YShzLGEsInBhcnNlciIpLHQuc2V0Q29sdW1uU29ydChlLHMsbyl9LHNldENvbHVtblNvcnQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBvPWUudGFibGUuaWQ7dFswXS5zb3J0RGlzYWJsZWQ9cix0W3I/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgic29ydGVyLWZhbHNlIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsIiIrciksZS50YWJJbmRleCYmKHI/dC5yZW1vdmVBdHRyKCJ0YWJpbmRleCIpOnQuYXR0cigidGFiaW5kZXgiLCIwIikpLG8mJihyP3QucmVtb3ZlQXR0cigiYXJpYS1jb250cm9scyIpOnQuYXR0cigiYXJpYS1jb250cm9scyIsbykpfSx1cGRhdGVIZWFkZXJTb3J0Q291bnQ6ZnVuY3Rpb24ocixvKXt2YXIgcyxhLG4saSxsLGQsYyxnLHA9b3x8ci5zb3J0TGlzdCx1PXAubGVuZ3RoO2ZvcihyLnNvcnRMaXN0PVtdLGk9MDtpPHU7aSsrKWlmKGM9cFtpXSwocz1wYXJzZUludChjWzBdLDEwKSk8ci5jb2x1bW5zKXtzd2l0Y2goci5zb3J0VmFyc1tzXS5vcmRlcnx8KGc9dC5nZXRPcmRlcihyLnNvcnRJbml0aWFsT3JkZXIpP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxyLnNvcnRWYXJzW3NdLm9yZGVyPWcsci5zb3J0VmFyc1tzXS5jb3VudD0wKSxnPXIuc29ydFZhcnNbc10ub3JkZXIsYT0oIiIrY1sxXSkubWF0Y2goL14oMXxkfHN8b3xuKS8pLGE9YT9hWzBdOiIiKXtjYXNlIjEiOmNhc2UiZCI6YT0xO2JyZWFrO2Nhc2UicyI6YT1sfHwwO2JyZWFrO2Nhc2UibyI6YT0wPT09KGQ9Z1sobHx8MCklZy5sZW5ndGhdKT8xOjE9PT1kPzA6MjticmVhaztjYXNlIm4iOmE9Z1srK3Iuc29ydFZhcnNbc10uY291bnQlZy5sZW5ndGhdO2JyZWFrO2RlZmF1bHQ6YT0wfWw9MD09PWk/YTpsLG49W3MscGFyc2VJbnQoYSwxMCl8fDBdLHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPW4sYT1lLmluQXJyYXkoblsxXSxnKSxyLnNvcnRWYXJzW3NdLmNvdW50PWE+PTA/YTpuWzFdJWcubGVuZ3RofX0sdXBkYXRlQWxsOmZ1bmN0aW9uKGUscixvKXt2YXIgcz1lLnRhYmxlO3MuaXNVcGRhdGluZz0hMCx0LnJlZnJlc2hXaWRnZXRzKHMsITAsITApLHQuYnVpbGRIZWFkZXJzKGUpLHQuYmluZEV2ZW50cyhzLGUuJGhlYWRlcnMsITApLHQuYmluZE1ldGhvZHMoZSksdC5jb21tb25VcGRhdGUoZSxyLG8pfSx1cGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UudGFibGUuaXNVcGRhdGluZz0hMCx0LnVwZGF0ZUhlYWRlcihlKSx0LmNvbW1vblVwZGF0ZShlLHIsbyl9LHVwZGF0ZUhlYWRlcnM6ZnVuY3Rpb24oZSxyKXtlLnRhYmxlLmlzVXBkYXRpbmc9ITAsdC5idWlsZEhlYWRlcnMoZSksdC5iaW5kRXZlbnRzKGUudGFibGUsZS4kaGVhZGVycywhMCksdC5yZXNvcnRDb21wbGV0ZShlLHIpfSx1cGRhdGVDZWxsOmZ1bmN0aW9uKHIsbyxzLGEpe2lmKGUobykuY2xvc2VzdCgidHIiKS5oYXNDbGFzcyhyLmNzc0NoaWxkUm93KSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ1cGRhdGVDZWxsIiBmb3IgY2hpbGQgcm93IGNvbnRlbnQgaGFzIGJlZW4gZGlzYWJsZWQsIHVzZSAidXBkYXRlIiBpbnN0ZWFkJyk7ZWxzZXtpZih0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkpcmV0dXJuIHQudXBkYXRlSGVhZGVyKHIpLHZvaWQgdC5jb21tb25VcGRhdGUocixzLGEpO3IudGFibGUuaXNVcGRhdGluZz0hMCxyLiR0YWJsZS5maW5kKHIuc2VsZWN0b3JSZW1vdmUpLnJlbW92ZSgpO3ZhciBuLGksbCxkLGMsZyxwPXIuJHRib2RpZXMsdT1lKG8pLGY9cC5pbmRleCh0LmdldENsb3Nlc3QodSwidGJvZHkiKSksaD1yLmNhY2hlW2ZdLG09dC5nZXRDbG9zZXN0KHUsInRyIik7aWYobz11WzBdLHAubGVuZ3RoJiZmPj0wKXtpZihsPXAuZXEoZikuZmluZCgidHIiKS5ub3QoIi4iK3IuY3NzQ2hpbGRSb3cpLmluZGV4KG0pLGM9aC5ub3JtYWxpemVkW2xdLChnPW1bMF0uY2VsbHMubGVuZ3RoKSE9PXIuY29sdW1ucylmb3IoZD0wLG49ITEsaT0wO2k8ZztpKyspbnx8bVswXS5jZWxsc1tpXT09PW8/bj0hMDpkKz1tWzBdLmNlbGxzW2ldLmNvbFNwYW47ZWxzZSBkPXUuaW5kZXgoKTtuPXQuZ2V0RWxlbWVudFRleHQocixvLGQpLGNbci5jb2x1bW5zXS5yYXdbZF09bixuPXQuZ2V0UGFyc2VkVGV4dChyLG8sZCxuKSxjW2RdPW4sIm51bWVyaWMiPT09KHIucGFyc2Vyc1tkXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKGguY29sTWF4W2RdPU1hdGgubWF4KE1hdGguYWJzKG4pfHwwLGguY29sTWF4W2RdfHwwKSksITEhPT0obj0idW5kZWZpbmVkIiE9PXM/czpyLnJlc29ydCk/dC5jaGVja1Jlc29ydChyLG4sYSk6dC5yZXNvcnRDb21wbGV0ZShyLGEpfWVsc2UgdC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUuZXJyb3IoInVwZGF0ZUNlbGwgYWJvcnRlZCwgdGJvZHkgbWlzc2luZyBvciBub3Qgd2l0aGluIHRoZSBpbmRpY2F0ZWQgdGFibGUiKSxyLnRhYmxlLmlzVXBkYXRpbmc9ITF9fSxhZGRSb3dzOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG0sYix5LHc9InN0cmluZyI9PXR5cGVvZiBvJiYxPT09ci4kdGJvZGllcy5sZW5ndGgmJi88dHIvLnRlc3Qob3x8IiIpLHg9ci50YWJsZTtpZih3KW89ZShvKSxyLiR0Ym9kaWVzLmFwcGVuZChvKTtlbHNlIGlmKCEobyYmbyBpbnN0YW5jZW9mIGUmJnQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpWzBdPT09ci50YWJsZSkpcmV0dXJuIHQuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmVycm9yKCJhZGRSb3dzIG1ldGhvZCByZXF1aXJlcyAoMSkgYSBqUXVlcnkgc2VsZWN0b3IgcmVmZXJlbmNlIHRvIHJvd3MgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgdGFibGUsIG9yICgyKSByb3cgSFRNTCBzdHJpbmcgdG8gYmUgYWRkZWQgdG8gYSB0YWJsZSB3aXRoIG9ubHkgb25lIHRib2R5IiksITE7aWYoeC5pc1VwZGF0aW5nPSEwLHQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSl0LnVwZGF0ZUhlYWRlcihyKSx0LmNvbW1vblVwZGF0ZShyLHMsYSk7ZWxzZXtmb3IoYz1vLmZpbHRlcigidHIiKS5hdHRyKCJyb2xlIiwicm93IikubGVuZ3RoLGw9ci4kdGJvZGllcy5pbmRleChvLnBhcmVudHMoInRib2R5IikuZmlsdGVyKCI6Zmlyc3QiKSksci5wYXJzZXJzJiZyLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhyKSxkPTA7ZDxjO2QrKyl7Zm9yKGY9MCxwPW9bZF0uY2VsbHMubGVuZ3RoLHU9ci5jYWNoZVtsXS5ub3JtYWxpemVkLmxlbmd0aCxtPVtdLGg9e2NoaWxkOltdLHJhdzpbXSwkcm93Om8uZXEoZCksb3JkZXI6dX0sZz0wO2c8cDtnKyspYj1vW2RdLmNlbGxzW2ddLG49dC5nZXRFbGVtZW50VGV4dChyLGIsZiksaC5yYXdbZl09bixpPXQuZ2V0UGFyc2VkVGV4dChyLGIsZixuKSxtW2ZdPWksIm51bWVyaWMiPT09KHIucGFyc2Vyc1tmXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKHIuY2FjaGVbbF0uY29sTWF4W2ZdPU1hdGgubWF4KE1hdGguYWJzKGkpfHwwLHIuY2FjaGVbbF0uY29sTWF4W2ZdfHwwKSksKHk9Yi5jb2xTcGFuLTEpPjAmJihmKz15KSxmKys7bVtyLmNvbHVtbnNdPWgsci5jYWNoZVtsXS5ub3JtYWxpemVkW3VdPW19dC5jaGVja1Jlc29ydChyLHMsYSl9fSx1cGRhdGVDYWNoZTpmdW5jdGlvbihlLHIsbyl7ZS5wYXJzZXJzJiZlLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhlLG8pLHQuYnVpbGRDYWNoZShlLHIsbyl9LGFwcGVuZENhY2hlOmZ1bmN0aW9uKGUscil7dmFyIG8scyxhLG4saSxsLGQsYz1lLnRhYmxlLGc9ZS4kdGJvZGllcyxwPVtdLHU9ZS5jYWNoZTtpZih0LmlzRW1wdHlPYmplY3QodSkpcmV0dXJuIGUuYXBwZW5kZXI/ZS5hcHBlbmRlcihjLHApOmMuaXNVcGRhdGluZz9lLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpOiIiO2Zvcih0LmRlYnVnKGUsImNvcmUiKSYmKGQ9bmV3IERhdGUpLGw9MDtsPGcubGVuZ3RoO2wrKylpZigoYT1nLmVxKGwpKS5sZW5ndGgpe2ZvcihuPXQucHJvY2Vzc1Rib2R5KGMsYSwhMCkscz0obz11W2xdLm5vcm1hbGl6ZWQpLmxlbmd0aCxpPTA7aTxzO2krKylwW3AubGVuZ3RoXT1vW2ldW2UuY29sdW1uc10uJHJvdyxlLmFwcGVuZGVyJiYoIWUucGFnZXJ8fGUucGFnZXIucmVtb3ZlUm93c3x8ZS5wYWdlci5hamF4KXx8bi5hcHBlbmQob1tpXVtlLmNvbHVtbnNdLiRyb3cpO3QucHJvY2Vzc1Rib2R5KGMsbiwhMSl9ZS5hcHBlbmRlciYmZS5hcHBlbmRlcihjLHApLHQuZGVidWcoZSwiY29yZSIpJiZjb25zb2xlLmxvZygiUmVidWlsdCB0YWJsZSIrdC5iZW5jaG1hcmsoZCkpLHJ8fGUuYXBwZW5kZXJ8fHQuYXBwbHlXaWRnZXQoYyksYy5pc1VwZGF0aW5nJiZlLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpfSxjb21tb25VcGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UuJHRhYmxlLmZpbmQoZS5zZWxlY3RvclJlbW92ZSkucmVtb3ZlKCksdC5zZXR1cFBhcnNlcnMoZSksdC5idWlsZENhY2hlKGUpLHQuY2hlY2tSZXNvcnQoZSxyLG8pfSxpbml0U29ydDpmdW5jdGlvbihyLG8scyl7aWYoci50YWJsZS5pc1VwZGF0aW5nKXJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0U29ydChyLG8scyl9LDUwKTt2YXIgYSxuLGksbCxkLGMsZyxwPSFzW3Iuc29ydE11bHRpU29ydEtleV0sdT1yLnRhYmxlLGY9ci4kaGVhZGVycy5sZW5ndGgsaD10LmdldENsb3Nlc3QoZShvKSwidGgsIHRkIiksbT1wYXJzZUludChoLmF0dHIoImRhdGEtY29sdW1uIiksMTApLGI9ci5zb3J0VmFyc1ttXS5vcmRlcjtpZihoPWhbMF0sci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsdSksYz0oci5zb3J0VmFyc1ttXS5jb3VudCsxKSViLmxlbmd0aCxyLnNvcnRWYXJzW21dLmNvdW50PXNbci5zb3J0UmVzZXRLZXldPzI6YyxyLnNvcnRSZXN0YXJ0KWZvcihpPTA7aTxmO2krKylnPXIuJGhlYWRlcnMuZXEoaSksbSE9PShjPXBhcnNlSW50KGcuYXR0cigiZGF0YS1jb2x1bW4iKSwxMCkpJiYocHx8Zy5oYXNDbGFzcyh0LmNzcy5zb3J0Tm9uZSkpJiYoci5zb3J0VmFyc1tjXS5jb3VudD0tMSk7aWYocCl7aWYoci5zb3J0TGlzdD1bXSxyLmxhc3Quc29ydExpc3Q9W10sbnVsbCE9PXIuc29ydEZvcmNlKWZvcihhPXIuc29ydEZvcmNlLG49MDtuPGEubGVuZ3RoO24rKylhW25dWzBdIT09bSYmKHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPWFbbl0pO2lmKChsPWJbci5zb3J0VmFyc1ttXS5jb3VudF0pPDImJihyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1bbSxsXSxoLmNvbFNwYW4+MSkpZm9yKG49MTtuPGguY29sU3BhbjtuKyspci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20rbixsXSxyLnNvcnRWYXJzW20rbl0uY291bnQ9ZS5pbkFycmF5KGwsYil9ZWxzZSBpZihyLnNvcnRMaXN0PWUuZXh0ZW5kKFtdLHIubGFzdC5zb3J0TGlzdCksdC5pc1ZhbHVlSW5BcnJheShtLHIuc29ydExpc3QpPj0wKWZvcihuPTA7bjxyLnNvcnRMaXN0Lmxlbmd0aDtuKyspKGM9ci5zb3J0TGlzdFtuXSlbMF09PT1tJiYoY1sxXT1iW3Iuc29ydFZhcnNbbV0uY291bnRdLDI9PT1jWzFdJiYoci5zb3J0TGlzdC5zcGxpY2UobiwxKSxyLnNvcnRWYXJzW21dLmNvdW50PS0xKSk7ZWxzZSBpZigobD1iW3Iuc29ydFZhcnNbbV0uY291bnRdKTwyJiYoci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20sbF0saC5jb2xTcGFuPjEpKWZvcihuPTE7bjxoLmNvbFNwYW47bisrKXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttK24sbF0sci5zb3J0VmFyc1ttK25dLmNvdW50PWUuaW5BcnJheShsLGIpO2lmKHIubGFzdC5zb3J0TGlzdD1lLmV4dGVuZChbXSxyLnNvcnRMaXN0KSxyLnNvcnRMaXN0Lmxlbmd0aCYmci5zb3J0QXBwZW5kJiYoYT1lLmlzQXJyYXkoci5zb3J0QXBwZW5kKT9yLnNvcnRBcHBlbmQ6ci5zb3J0QXBwZW5kW3Iuc29ydExpc3RbMF1bMF1dLCF0LmlzRW1wdHlPYmplY3QoYSkpKWZvcihuPTA7bjxhLmxlbmd0aDtuKyspaWYoYVtuXVswXSE9PW0mJnQuaXNWYWx1ZUluQXJyYXkoYVtuXVswXSxyLnNvcnRMaXN0KTwwKXtpZihsPWFbbl1bMV0sZD0oIiIrbCkubWF0Y2goL14oYXxkfHN8b3xuKS8pKXN3aXRjaChjPXIuc29ydExpc3RbMF1bMV0sZFswXSl7Y2FzZSJkIjpsPTE7YnJlYWs7Y2FzZSJzIjpsPWM7YnJlYWs7Y2FzZSJvIjpsPTA9PT1jPzE6MDticmVhaztjYXNlIm4iOmw9KGMrMSklYi5sZW5ndGg7YnJlYWs7ZGVmYXVsdDpsPTB9ci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W2Fbbl1bMF0sbF19ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRCZWdpbiIsdSksc2V0VGltZW91dChmdW5jdGlvbigpe3Quc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVmb3JlRW5kIix1KSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEVuZCIsdSl9LDEpfSxtdWx0aXNvcnQ6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9W10sbD0wLGQ9ZS50ZXh0U29ydGVyfHwiIixjPWUuc29ydExpc3QsZz1jLmxlbmd0aCxwPWUuJHRib2RpZXMubGVuZ3RoO2lmKCFlLnNlcnZlclNpZGVTb3J0aW5nJiYhdC5pc0VtcHR5T2JqZWN0KGUuY2FjaGUpKXtpZih0LmRlYnVnKGUsImNvcmUiKSYmKG89bmV3IERhdGUpLCJvYmplY3QiPT10eXBlb2YgZClmb3Iocz1lLmNvbHVtbnM7cy0tOykiZnVuY3Rpb24iPT10eXBlb2YoYT10LmdldENvbHVtbkRhdGEobixkLHMpKSYmKGlbc109YSk7Zm9yKHI9MDtyPHA7cisrKXM9ZS5jYWNoZVtyXS5jb2xNYXgsZS5jYWNoZVtyXS5ub3JtYWxpemVkLnNvcnQoZnVuY3Rpb24ocixvKXt2YXIgYSxwLHUsZixoLG0sYjtmb3IoYT0wO2E8ZzthKyspe2lmKHU9Y1thXVswXSxmPWNbYV1bMV0sbD0wPT09ZixlLnNvcnRTdGFibGUmJnJbdV09PT1vW3VdJiYxPT09ZylyZXR1cm4gcltlLmNvbHVtbnNdLm9yZGVyLW9bZS5jb2x1bW5zXS5vcmRlcjtpZihwPS9uL2kudGVzdCh0LmdldFNvcnRUeXBlKGUucGFyc2Vycyx1KSkscCYmZS5zdHJpbmdzW3VdPyhwPSJib29sZWFuIj09dHlwZW9mIHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/KGw/MTotMSkqKHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/LTE6MSk6ZS5zdHJpbmdzW3VdP3Quc3RyaW5nW2Uuc3RyaW5nc1t1XV18fDA6MCxoPWUubnVtYmVyU29ydGVyP2UubnVtYmVyU29ydGVyKHJbdV0sb1t1XSxsLHNbdV0sbik6dFsic29ydE51bWVyaWMiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSxwLHNbdV0sdSxlKSk6KG09bD9yOm8sYj1sP286cixoPSJmdW5jdGlvbiI9PXR5cGVvZiBkP2QobVt1XSxiW3VdLGwsdSxuKToiZnVuY3Rpb24iPT10eXBlb2YgaVt1XT9pW3VdKG1bdV0sYlt1XSxsLHUsbik6dFsic29ydE5hdHVyYWwiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSx1LGUpKSxoKXJldHVybiBofXJldHVybiByW2UuY29sdW1uc10ub3JkZXItb1tlLmNvbHVtbnNdLm9yZGVyfSk7dC5kZWJ1ZyhlLCJjb3JlIikmJmNvbnNvbGUubG9nKCJBcHBseWluZyBzb3J0ICIrYy50b1N0cmluZygpK3QuYmVuY2htYXJrKG8pKX19LHJlc29ydENvbXBsZXRlOmZ1bmN0aW9uKHQscil7dC50YWJsZS5pc1VwZGF0aW5nJiZ0LiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLHQudGFibGUpLGUuaXNGdW5jdGlvbihyKSYmcih0LnRhYmxlKX0sY2hlY2tSZXNvcnQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhPWUuaXNBcnJheShvKT9vOnIuc29ydExpc3Q7ITE9PT0odm9pZCAwPT09bz9yLnJlc29ydDpvKXx8ci5zZXJ2ZXJTaWRlU29ydGluZ3x8ci50YWJsZS5pc1Byb2Nlc3Npbmc/KHQucmVzb3J0Q29tcGxldGUocixzKSx0LmFwcGx5V2lkZ2V0KHIudGFibGUsITEpKTphLmxlbmd0aD90LnNvcnRPbihyLGEsZnVuY3Rpb24oKXt0LnJlc29ydENvbXBsZXRlKHIscyl9LCEwKTp0LnNvcnRSZXNldChyLGZ1bmN0aW9uKCl7dC5yZXNvcnRDb21wbGV0ZShyLHMpLHQuYXBwbHlXaWRnZXQoci50YWJsZSwhMSl9KX0sc29ydE9uOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuPXIudGFibGU7ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsbiksdC51cGRhdGVIZWFkZXJTb3J0Q291bnQocixvKSx0LnNldEhlYWRlcnNDc3Mociksci5kZWxheUluaXQmJnQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSYmdC5idWlsZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVnaW4iLG4pLHQubXVsdGlzb3J0KHIpLHQuYXBwZW5kQ2FjaGUocixhKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZm9yZUVuZCIsbiksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRFbmQiLG4pLHQuYXBwbHlXaWRnZXQobiksZS5pc0Z1bmN0aW9uKHMpJiZzKG4pfSxzb3J0UmVzZXQ6ZnVuY3Rpb24ocixvKXtyLnNvcnRMaXN0PVtdLHQuc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpO3ZhciBzO2ZvcihzPTA7czxyLmNvbHVtbnM7cysrKXIuc29ydFZhcnNbc10uY291bnQ9LTE7ZS5pc0Z1bmN0aW9uKG8pJiZvKHIudGFibGUpfSxnZXRTb3J0VHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiBlJiZlW3RdP2VbdF0udHlwZXx8IiI6IiJ9LGdldE9yZGVyOmZ1bmN0aW9uKGUpe3JldHVybi9eZC9pLnRlc3QoZSl8fDE9PT1lfSxzb3J0TmF0dXJhbDpmdW5jdGlvbihlLHIpe2lmKGU9PT1yKXJldHVybiAwO2U9ZS50b1N0cmluZygpLHI9ci50b1N0cmluZygpO3ZhciBvLHMsYSxuLGksbCxkPXQucmVnZXg7aWYoZC5oZXgudGVzdChyKSl7aWYobz1wYXJzZUludCgoZXx8IiIpLm1hdGNoKGQuaGV4KSwxNikscz1wYXJzZUludCgocnx8IiIpLm1hdGNoKGQuaGV4KSwxNiksbzxzKXJldHVybi0xO2lmKG8+cylyZXR1cm4gMX1mb3Iobz0oZXx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIikscz0ocnx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIiksbD1NYXRoLm1heChvLmxlbmd0aCxzLmxlbmd0aCksaT0wO2k8bDtpKyspe2lmKGE9aXNOYU4ob1tpXSk/b1tpXXx8MDpwYXJzZUZsb2F0KG9baV0pfHwwLG49aXNOYU4oc1tpXSk/c1tpXXx8MDpwYXJzZUZsb2F0KHNbaV0pfHwwLGlzTmFOKGEpIT09aXNOYU4obikpcmV0dXJuIGlzTmFOKGEpPzE6LTE7aWYodHlwZW9mIGEhPXR5cGVvZiBuJiYoYSs9IiIsbis9IiIpLGE8bilyZXR1cm4tMTtpZihhPm4pcmV0dXJuIDF9cmV0dXJuIDB9LHNvcnROYXR1cmFsQXNjOmZ1bmN0aW9uKGUscixvLHMpe2lmKGU9PT1yKXJldHVybiAwO3ZhciBhPXQuc3RyaW5nW3MuZW1wdGllc1tvXXx8cy5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8tMToxOi1hfHwtMToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOmF8fDE6dC5zb3J0TmF0dXJhbChlLHIpfSxzb3J0TmF0dXJhbERlc2M6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGE9dC5zdHJpbmdbcy5lbXB0aWVzW29dfHxzLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWE/ImJvb2xlYW4iPT10eXBlb2YgYT9hPy0xOjE6YXx8MToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOi1hfHwtMTp0LnNvcnROYXR1cmFsKHIsZSl9LHNvcnRUZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+dD8xOmU8dD8tMTowfSxnZXRUZXh0VmFsdWU6ZnVuY3Rpb24oZSx0LHIpe2lmKHIpe3ZhciBvLHM9ZT9lLmxlbmd0aDowLGE9cit0O2ZvcihvPTA7bzxzO28rKylhKz1lLmNoYXJDb2RlQXQobyk7cmV0dXJuIHQqYX1yZXR1cm4gMH0sc29ydE51bWVyaWNBc2M6ZnVuY3Rpb24oZSxyLG8scyxhLG4pe2lmKGU9PT1yKXJldHVybiAwO3ZhciBpPXQuc3RyaW5nW24uZW1wdGllc1thXXx8bi5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8tMToxOi1pfHwtMToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOml8fDE6KGlzTmFOKGUpJiYoZT10LmdldFRleHRWYWx1ZShlLG8scykpLGlzTmFOKHIpJiYocj10LmdldFRleHRWYWx1ZShyLG8scykpLGUtcil9LHNvcnROdW1lcmljRGVzYzpmdW5jdGlvbihlLHIsbyxzLGEsbil7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGk9dC5zdHJpbmdbbi5lbXB0aWVzW2FdfHxuLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWk/ImJvb2xlYW4iPT10eXBlb2YgaT9pPy0xOjE6aXx8MToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOi1pfHwtMTooaXNOYU4oZSkmJihlPXQuZ2V0VGV4dFZhbHVlKGUsbyxzKSksaXNOYU4ocikmJihyPXQuZ2V0VGV4dFZhbHVlKHIsbyxzKSksci1lKX0sc29ydE51bWVyaWM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSxhZGRXaWRnZXQ6ZnVuY3Rpb24oZSl7ZS5pZCYmIXQuaXNFbXB0eU9iamVjdCh0LmdldFdpZGdldEJ5SWQoZS5pZCkpJiZjb25zb2xlLndhcm4oJyInK2UuaWQrJyIgd2lkZ2V0IHdhcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UhJyksdC53aWRnZXRzW3Qud2lkZ2V0cy5sZW5ndGhdPWV9LGhhc1dpZGdldDpmdW5jdGlvbih0LHIpe3JldHVybih0PWUodCkpLmxlbmd0aCYmdFswXS5jb25maWcmJnRbMF0uY29uZmlnLndpZGdldEluaXRbcl18fCExfSxnZXRXaWRnZXRCeUlkOmZ1bmN0aW9uKGUpe3ZhciByLG8scz10LndpZGdldHMubGVuZ3RoO2ZvcihyPTA7cjxzO3IrKylpZigobz10LndpZGdldHNbcl0pJiZvLmlkJiZvLmlkLnRvTG93ZXJDYXNlKCk9PT1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIG99LGFwcGx5V2lkZ2V0T3B0aW9uczpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbj1yLmNvbmZpZyxpPW4ud2lkZ2V0cy5sZW5ndGg7aWYoaSlmb3Iobz0wO288aTtvKyspKHM9dC5nZXRXaWRnZXRCeUlkKG4ud2lkZ2V0c1tvXSkpJiZzLm9wdGlvbnMmJihhPWUuZXh0ZW5kKCEwLHt9LHMub3B0aW9ucyksbi53aWRnZXRPcHRpb25zPWUuZXh0ZW5kKCEwLGEsbi53aWRnZXRPcHRpb25zKSxlLmV4dGVuZCghMCx0LmRlZmF1bHRzLndpZGdldE9wdGlvbnMscy5vcHRpb25zKSl9LGFkZFdpZGdldEZyb21DbGFzczpmdW5jdGlvbihlKXt2YXIgcixvLHM9ZS5jb25maWcsYT0iXiIrcy53aWRnZXRDbGFzcy5yZXBsYWNlKHQucmVnZXgudGVtcGxhdGVOYW1lLCIoXFxTKykrIikrIiQiLG49bmV3IFJlZ0V4cChhLCJnIiksaT0oZS5jbGFzc05hbWV8fCIiKS5zcGxpdCh0LnJlZ2V4LnNwYWNlcyk7aWYoaS5sZW5ndGgpZm9yKHI9aS5sZW5ndGgsbz0wO288cjtvKyspaVtvXS5tYXRjaChuKSYmKHMud2lkZ2V0c1tzLndpZGdldHMubGVuZ3RoXT1pW29dLnJlcGxhY2UobiwiJDEiKSl9LGFwcGx5V2lkZ2V0SWQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsPShyPWUocilbMF0pLmNvbmZpZyxkPWwud2lkZ2V0T3B0aW9ucyxjPXQuZGVidWcobCwiY29yZSIpLGc9dC5nZXRXaWRnZXRCeUlkKG8pO2cmJihpPWcuaWQsYT0hMSxlLmluQXJyYXkoaSxsLndpZGdldHMpPDAmJihsLndpZGdldHNbbC53aWRnZXRzLmxlbmd0aF09aSksYyYmKG49bmV3IERhdGUpLCFzJiZsLndpZGdldEluaXRbaV18fChsLndpZGdldEluaXRbaV09ITAsci5oYXNJbml0aWFsaXplZCYmdC5hcHBseVdpZGdldE9wdGlvbnMociksImZ1bmN0aW9uIj09dHlwZW9mIGcuaW5pdCYmKGE9ITAsYyYmY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJJbml0aWFsaXppbmcgIitpKyIgd2lkZ2V0IiksZy5pbml0KHIsZyxsLGQpKSksc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGcuZm9ybWF0fHwoYT0hMCxjJiZjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIlVwZGF0aW5nICIraSsiIHdpZGdldCIpLGcuZm9ybWF0KHIsbCxkLCExKSksYyYmYSYmKGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisocz8iaW5pdGlhbGl6aW5nICI6ImFwcGx5aW5nICIpK2krIiB3aWRnZXQiK3QuYmVuY2htYXJrKG4pKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpKX0sYXBwbHlXaWRnZXQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYz0ocj1lKHIpWzBdKS5jb25maWcsZz10LmRlYnVnKGMsImNvcmUiKSxwPVtdO2lmKCExPT09b3x8IXIuaGFzSW5pdGlhbGl6ZWR8fCFyLmlzQXBwbHlpbmdXaWRnZXRzJiYhci5pc1VwZGF0aW5nKXtpZihnJiYoZD1uZXcgRGF0ZSksdC5hZGRXaWRnZXRGcm9tQ2xhc3MociksY2xlYXJUaW1lb3V0KGMudGltZXJSZWFkeSksYy53aWRnZXRzLmxlbmd0aCl7Zm9yKHIuaXNBcHBseWluZ1dpZGdldHM9ITAsYy53aWRnZXRzPWUuZ3JlcChjLndpZGdldHMsZnVuY3Rpb24odCxyKXtyZXR1cm4gZS5pbkFycmF5KHQsYy53aWRnZXRzKT09PXJ9KSxuPShpPWMud2lkZ2V0c3x8W10pLmxlbmd0aCxhPTA7YTxuO2ErKykobD10LmdldFdpZGdldEJ5SWQoaVthXSkpJiZsLmlkPyhsLnByaW9yaXR5fHwobC5wcmlvcml0eT0xMCkscFthXT1sKTpnJiZjb25zb2xlLndhcm4oJyInK2lbYV0rJyIgd2FzIGVuYWJsZWQsIGJ1dCB0aGUgd2lkZ2V0IGNvZGUgaGFzIG5vdCBiZWVuIGxvYWRlZCEnKTtmb3IocC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucHJpb3JpdHk8dC5wcmlvcml0eT8tMTplLnByaW9yaXR5PT09dC5wcmlvcml0eT8wOjF9KSxuPXAubGVuZ3RoLGcmJmNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiU3RhcnQgIisobz8iaW5pdGlhbGl6aW5nIjoiYXBwbHlpbmciKSsiIHdpZGdldHMiKSxhPTA7YTxuO2ErKykobD1wW2FdKSYmbC5pZCYmdC5hcHBseVdpZGdldElkKHIsbC5pZCxvKTtnJiZjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9Yy50aW1lclJlYWR5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmlzQXBwbHlpbmdXaWRnZXRzPSExLGUuZGF0YShyLCJsYXN0V2lkZ2V0QXBwbGljYXRpb24iLG5ldyBEYXRlKSxjLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidGFibGVzb3J0ZXItcmVhZHkiKSxvfHwiZnVuY3Rpb24iIT10eXBlb2Ygc3x8cyhyKSxnJiYobD1jLndpZGdldHMubGVuZ3RoLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisoITA9PT1vPyJpbml0aWFsaXppbmcgIjoiYXBwbHlpbmcgIikrbCsiIHdpZGdldCIrKDEhPT1sPyJzIjoiIikrdC5iZW5jaG1hcmsoZCkpKX0sMTApfX0scmVtb3ZlV2lkZ2V0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkPShyPWUocilbMF0pLmNvbmZpZztpZighMD09PW8pZm9yKG89W10sbD10LndpZGdldHMubGVuZ3RoLGk9MDtpPGw7aSsrKShuPXQud2lkZ2V0c1tpXSkmJm4uaWQmJihvW28ubGVuZ3RoXT1uLmlkKTtlbHNlIG89KGUuaXNBcnJheShvKT9vLmpvaW4oIiwiKTpvfHwiIikudG9Mb3dlckNhc2UoKS5zcGxpdCgvW1xzLF0rLyk7Zm9yKGw9by5sZW5ndGgsYT0wO2E8bDthKyspbj10LmdldFdpZGdldEJ5SWQob1thXSksKGk9ZS5pbkFycmF5KG9bYV0sZC53aWRnZXRzKSk+PTAmJiEwIT09cyYmZC53aWRnZXRzLnNwbGljZShpLDEpLG4mJm4ucmVtb3ZlJiYodC5kZWJ1ZyhkLCJjb3JlIikmJmNvbnNvbGUubG9nKChzPyJSZWZyZXNoaW5nIjoiUmVtb3ZpbmciKSsnICInK29bYV0rJyIgd2lkZ2V0Jyksbi5yZW1vdmUocixkLGQud2lkZ2V0T3B0aW9ucyxzKSxkLndpZGdldEluaXRbb1thXV09ITEpO2QuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJ3aWRnZXRSZW1vdmVFbmQiLHIpfSxyZWZyZXNoV2lkZ2V0czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbixpPShyPWUocilbMF0pLmNvbmZpZy53aWRnZXRzLGw9dC53aWRnZXRzLGQ9bC5sZW5ndGgsYz1bXSxnPWZ1bmN0aW9uKHQpe2UodCkudHJpZ2dlckhhbmRsZXIoInJlZnJlc2hDb21wbGV0ZSIpfTtmb3IoYT0wO2E8ZDthKyspKG49bFthXSkmJm4uaWQmJihvfHxlLmluQXJyYXkobi5pZCxpKTwwKSYmKGNbYy5sZW5ndGhdPW4uaWQpO3QucmVtb3ZlV2lkZ2V0KHIsYy5qb2luKCIsIiksITApLCEwIT09cz8odC5hcHBseVdpZGdldChyLG98fCExLGcpLG8mJnQuYXBwbHlXaWRnZXQociwhMSxnKSk6ZyhyKX0sYmVuY2htYXJrOmZ1bmN0aW9uKGUpe3JldHVybiIgKCIrKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWUuZ2V0VGltZSgpKSsiIG1zKSJ9LGxvZzpmdW5jdGlvbigpe2NvbnNvbGUubG9nKGFyZ3VtZW50cyl9LGRlYnVnOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJighMD09PWUuZGVidWd8fCJzdHJpbmciPT10eXBlb2YgZS5kZWJ1ZyYmZS5kZWJ1Zy5pbmRleE9mKHQpPi0xKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0saXNWYWx1ZUluQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgcixvPXQmJnQubGVuZ3RofHwwO2ZvcihyPTA7cjxvO3IrKylpZih0W3JdWzBdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX0sZm9ybWF0RmxvYXQ6ZnVuY3Rpb24ocixvKXtpZigic3RyaW5nIiE9dHlwZW9mIHJ8fCIiPT09cilyZXR1cm4gcjt2YXIgcztyZXR1cm4gcj0obyYmby5jb25maWc/ITEhPT1vLmNvbmZpZy51c051bWJlckZvcm1hdDp2b2lkIDA9PT1vfHxvKT9yLnJlcGxhY2UodC5yZWdleC5jb21tYSwiIik6ci5yZXBsYWNlKHQucmVnZXguZGlnaXROb25VUywiIikucmVwbGFjZSh0LnJlZ2V4LmNvbW1hLCIuIiksdC5yZWdleC5kaWdpdE5lZ2F0aXZlVGVzdC50ZXN0KHIpJiYocj1yLnJlcGxhY2UodC5yZWdleC5kaWdpdE5lZ2F0aXZlUmVwbGFjZSwiLSQxIikpLHM9cGFyc2VGbG9hdChyKSxpc05hTihzKT9lLnRyaW0ocik6c30saXNEaWdpdDpmdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZSk/dC5yZWdleC5kaWdpdFRlc3QudGVzdChlLnRvU3RyaW5nKCkucmVwbGFjZSh0LnJlZ2V4LmRpZ2l0UmVwbGFjZSwiIikpOiIiIT09ZX0sY29tcHV0ZUNvbHVtbkluZGV4OmZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZyxwLHUsZj1vJiZvLmNvbHVtbnN8fDAsaD1bXSxtPW5ldyBBcnJheShmKTtmb3Iocz0wO3M8ci5sZW5ndGg7cysrKWZvcihkPXJbc10uY2VsbHMsYT0wO2E8ZC5sZW5ndGg7YSsrKXtmb3IoYz1zLGc9KGw9ZFthXSkucm93U3Bhbnx8MSxwPWwuY29sU3Bhbnx8MSx2b2lkIDA9PT1oW2NdJiYoaFtjXT1bXSksbj0wO248aFtjXS5sZW5ndGgrMTtuKyspaWYodm9pZCAwPT09aFtjXVtuXSl7dT1uO2JyZWFrfWZvcihmJiZsLmNlbGxJbmRleD09PXV8fChsLnNldEF0dHJpYnV0ZT9sLnNldEF0dHJpYnV0ZSgiZGF0YS1jb2x1bW4iLHUpOmUobCkuYXR0cigiZGF0YS1jb2x1bW4iLHUpKSxuPWM7bjxjK2c7bisrKWZvcih2b2lkIDA9PT1oW25dJiYoaFtuXT1bXSksbT1oW25dLGk9dTtpPHUrcDtpKyspbVtpXT0ieCJ9cmV0dXJuIHQuY2hlY2tDb2x1bW5Db3VudChyLGgsbS5sZW5ndGgpLG0ubGVuZ3RofSxjaGVja0NvbHVtbkNvdW50OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbyxzLGE9ITAsbj1bXTtmb3Iobz0wO288dC5sZW5ndGg7bysrKWlmKHRbb10mJihzPXRbb10ubGVuZ3RoLHRbb10ubGVuZ3RoIT09cikpe2E9ITE7YnJlYWt9YXx8KGUuZWFjaChmdW5jdGlvbihlLHQpe3ZhciByPXQucGFyZW50RWxlbWVudC5ub2RlTmFtZTtuLmluZGV4T2Yocik8MCYmbi5wdXNoKHIpfSksY29uc29sZS5lcnJvcigiSW52YWxpZCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlICIrbi5qb2luKCIgb3IgIikrIjsgZXhwZWN0ZWQgIityKyIsIGJ1dCBmb3VuZCAiK3MrIiBjb2x1bW5zIikpfSxmaXhDb2x1bW5XaWR0aDpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbixpLGw9KHI9ZShyKVswXSkuY29uZmlnLGQ9bC4kdGFibGUuY2hpbGRyZW4oImNvbGdyb3VwIik7aWYoZC5sZW5ndGgmJmQuaGFzQ2xhc3ModC5jc3MuY29sZ3JvdXApJiZkLnJlbW92ZSgpLGwud2lkdGhGaXhlZCYmMD09PWwuJHRhYmxlLmNoaWxkcmVuKCJjb2xncm91cCIpLmxlbmd0aCl7Zm9yKGQ9ZSgnPGNvbGdyb3VwIGNsYXNzPSInK3QuY3NzLmNvbGdyb3VwKyciPicpLG89bC4kdGFibGUud2lkdGgoKSxuPShhPWwuJHRib2RpZXMuZmluZCgidHI6Zmlyc3QiKS5jaGlsZHJlbigiOnZpc2libGUiKSkubGVuZ3RoLGk9MDtpPG47aSsrKXM9cGFyc2VJbnQoYS5lcShpKS53aWR0aCgpL28qMWUzLDEwKS8xMCsiJSIsZC5hcHBlbmQoZSgiPGNvbD4iKS5jc3MoIndpZHRoIixzKSk7bC4kdGFibGUucHJlcGVuZChkKX19LGdldERhdGE6ZnVuY3Rpb24odCxyLG8pe3ZhciBzLGEsbj0iIixpPWUodCk7cmV0dXJuIGkubGVuZ3RoPyhzPSEhZS5tZXRhZGF0YSYmaS5tZXRhZGF0YSgpLGE9IiAiKyhpLmF0dHIoImNsYXNzIil8fCIiKSx2b2lkIDAhPT1pLmRhdGEobyl8fHZvaWQgMCE9PWkuZGF0YShvLnRvTG93ZXJDYXNlKCkpP24rPWkuZGF0YShvKXx8aS5kYXRhKG8udG9Mb3dlckNhc2UoKSk6cyYmdm9pZCAwIT09c1tvXT9uKz1zW29dOnImJnZvaWQgMCE9PXJbb10/bis9cltvXToiICIhPT1hJiZhLm1hdGNoKCIgIitvKyItIikmJihuPWEubWF0Y2gobmV3IFJlZ0V4cCgiXFxzIitvKyItKFtcXHctXSspIikpWzFdfHwiIiksZS50cmltKG4pKToiIn0sZ2V0Q29sdW1uRGF0YTpmdW5jdGlvbih0LHIsbyxzLGEpe2lmKCJvYmplY3QiIT10eXBlb2Ygcnx8bnVsbD09PXIpcmV0dXJuIHI7dmFyIG4saT0odD1lKHQpWzBdKS5jb25maWcsbD1hfHxpLiRoZWFkZXJzLGQ9aS4kaGVhZGVySW5kZXhlZCYmaS4kaGVhZGVySW5kZXhlZFtvXXx8bC5maW5kKCdbZGF0YS1jb2x1bW49IicrbysnIl06bGFzdCcpO2lmKHZvaWQgMCE9PXJbb10pcmV0dXJuIHM/cltvXTpyW2wuaW5kZXgoZCldO2ZvcihuIGluIHIpaWYoInN0cmluZyI9PXR5cGVvZiBuJiZkLmZpbHRlcihuKS5hZGQoZC5maW5kKG4pKS5sZW5ndGgpcmV0dXJuIHJbbl19LGlzUHJvY2Vzc2luZzpmdW5jdGlvbihyLG8scyl7dmFyIGE9KHI9ZShyKSlbMF0uY29uZmlnLG49c3x8ci5maW5kKCIuIit0LmNzcy5oZWFkZXIpO28/KHZvaWQgMCE9PXMmJmEuc29ydExpc3QubGVuZ3RoPjAmJihuPW4uZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuc29ydERpc2FibGVkJiZ0LmlzVmFsdWVJbkFycmF5KHBhcnNlRmxvYXQoZSh0aGlzKS5hdHRyKCJkYXRhLWNvbHVtbiIpKSxhLnNvcnRMaXN0KT49MH0pKSxyLmFkZChuKS5hZGRDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpKTpyLmFkZChuKS5yZW1vdmVDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpfSxwcm9jZXNzVGJvZHk6ZnVuY3Rpb24odCxyLG8pe2lmKHQ9ZSh0KVswXSxvKXJldHVybiB0LmlzUHJvY2Vzc2luZz0hMCxyLmJlZm9yZSgnPGNvbGdyb3VwIGNsYXNzPSJ0YWJsZXNvcnRlci1zYXZlbXlwbGFjZSIvPicpLGUuZm4uZGV0YWNoP3IuZGV0YWNoKCk6ci5yZW1vdmUoKTt2YXIgcz1lKHQpLmZpbmQoImNvbGdyb3VwLnRhYmxlc29ydGVyLXNhdmVteXBsYWNlIik7ci5pbnNlcnRBZnRlcihzKSxzLnJlbW92ZSgpLHQuaXNQcm9jZXNzaW5nPSExfSxjbGVhclRhYmxlQm9keTpmdW5jdGlvbih0KXtlKHQpWzBdLmNvbmZpZy4kdGJvZGllcy5jaGlsZHJlbigpLmRldGFjaCgpfSxjaGFyYWN0ZXJFcXVpdmFsZW50czp7YToiw6HDoMOiw6PDpMSFw6UiLEE6IsOBw4DDgsODw4TEhMOFIixjOiLDp8SHxI0iLEM6IsOHxIbEjCIsZToiw6nDqMOqw6vEm8SZIixFOiLDicOIw4rDi8SaxJgiLGk6IsOtw6zEsMOuw6/EsSIsSToiw43DjMSww47DjyIsbzoiw7PDssO0w7XDtsWNIixPOiLDk8OSw5TDlcOWxYwiLHNzOiLDnyIsU1M6IuG6niIsdToiw7rDucO7w7zFryIsVToiw5rDmcObw5zFriJ9LHJlcGxhY2VBY2NlbnRzOmZ1bmN0aW9uKGUpe3ZhciByLG89IlsiLHM9dC5jaGFyYWN0ZXJFcXVpdmFsZW50cztpZighdC5jaGFyYWN0ZXJSZWdleCl7dC5jaGFyYWN0ZXJSZWdleEFycmF5PXt9O2ZvcihyIGluIHMpInN0cmluZyI9PXR5cGVvZiByJiYobys9c1tyXSx0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl09bmV3IFJlZ0V4cCgiWyIrc1tyXSsiXSIsImciKSk7dC5jaGFyYWN0ZXJSZWdleD1uZXcgUmVnRXhwKG8rIl0iKX1pZih0LmNoYXJhY3RlclJlZ2V4LnRlc3QoZSkpZm9yKHIgaW4gcykic3RyaW5nIj09dHlwZW9mIHImJihlPWUucmVwbGFjZSh0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl0scikpO3JldHVybiBlfSx2YWxpZGF0ZU9wdGlvbnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG4saT0iaGVhZGVycyBzb3J0Rm9yY2Ugc29ydExpc3Qgc29ydEFwcGVuZCB3aWRnZXRzIi5zcGxpdCgiICIpLGw9ci5vcmlnaW5hbFNldHRpbmdzO2lmKGwpe3QuZGVidWcociwiY29yZSIpJiYobj1uZXcgRGF0ZSk7Zm9yKG8gaW4gbClpZigidW5kZWZpbmVkIj09PShhPXR5cGVvZiB0LmRlZmF1bHRzW29dKSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ0YWJsZS5jb25maWcuJytvKyciIG9wdGlvbiBub3QgcmVjb2duaXplZCcpO2Vsc2UgaWYoIm9iamVjdCI9PT1hKWZvcihzIGluIGxbb10pYT10LmRlZmF1bHRzW29dJiZ0eXBlb2YgdC5kZWZhdWx0c1tvXVtzXSxlLmluQXJyYXkobyxpKTwwJiYidW5kZWZpbmVkIj09PWEmJmNvbnNvbGUud2FybignVGFibGVzb3J0ZXIgV2FybmluZyEgInRhYmxlLmNvbmZpZy4nK28rIi4iK3MrJyIgb3B0aW9uIG5vdCByZWNvZ25pemVkJyk7dC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ2YWxpZGF0ZSBvcHRpb25zIHRpbWU6Iit0LmJlbmNobWFyayhuKSl9fSxyZXN0b3JlSGVhZGVyczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ZShyKVswXS5jb25maWcsbj1hLiR0YWJsZS5maW5kKGEuc2VsZWN0b3JIZWFkZXJzKSxpPW4ubGVuZ3RoO2ZvcihvPTA7bzxpO28rKykocz1uLmVxKG8pKS5maW5kKCIuIit0LmNzcy5oZWFkZXJJbikubGVuZ3RoJiZzLmh0bWwoYS5oZWFkZXJDb250ZW50W29dKX0sZGVzdHJveTpmdW5jdGlvbihyLG8scyl7aWYoKHI9ZShyKVswXSkuaGFzSW5pdGlhbGl6ZWQpe3QucmVtb3ZlV2lkZ2V0KHIsITAsITEpO3ZhciBhLG49ZShyKSxpPXIuY29uZmlnLGw9bi5maW5kKCJ0aGVhZDpmaXJzdCIpLGQ9bC5maW5kKCJ0ci4iK3QuY3NzLmhlYWRlclJvdykucmVtb3ZlQ2xhc3ModC5jc3MuaGVhZGVyUm93KyIgIitpLmNzc0hlYWRlclJvdyksYz1uLmZpbmQoInRmb290OmZpcnN0ID4gdHIiKS5jaGlsZHJlbigidGgsIHRkIik7ITE9PT1vJiZlLmluQXJyYXkoInVpdGhlbWUiLGkud2lkZ2V0cyk+PTAmJihuLnRyaWdnZXJIYW5kbGVyKCJhcHBseVdpZGdldElkIixbInVpdGhlbWUiXSksbi50cmlnZ2VySGFuZGxlcigiYXBwbHlXaWRnZXRJZCIsWyJ6ZWJyYSJdKSksbC5maW5kKCJ0ciIpLm5vdChkKS5yZW1vdmUoKSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgdXBkYXRlQ2VsbCBhZGRSb3dzIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyByZW1vdmVXaWRnZXQgZGVzdHJveSBtb3VzZXVwIG1vdXNlbGVhdmUgIisia2V5cHJlc3Mgc29ydEJlZ2luIHNvcnRFbmQgcmVzZXRUb0xvYWRTdGF0ZSAiLnNwbGl0KCIgIikuam9pbihpLm5hbWVzcGFjZSsiICIpLG4ucmVtb3ZlRGF0YSgidGFibGVzb3J0ZXIiKS51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLGkuJGhlYWRlcnMuYWRkKGMpLnJlbW92ZUNsYXNzKFt0LmNzcy5oZWFkZXIsaS5jc3NIZWFkZXIsaS5jc3NBc2MsaS5jc3NEZXNjLHQuY3NzLnNvcnRBc2MsdC5jc3Muc29ydERlc2MsdC5jc3Muc29ydE5vbmVdLmpvaW4oIiAiKSkucmVtb3ZlQXR0cigiZGF0YS1jb2x1bW4iKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSxkLmZpbmQoaS5zZWxlY3RvclNvcnQpLnVuYmluZCgibW91c2Vkb3duIG1vdXNldXAga2V5cHJlc3MgIi5zcGxpdCgiICIpLmpvaW4oaS5uYW1lc3BhY2UrIiAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLHQucmVzdG9yZUhlYWRlcnMociksbi50b2dnbGVDbGFzcyh0LmNzcy50YWJsZSsiICIraS50YWJsZUNsYXNzKyIgdGFibGVzb3J0ZXItIitpLnRoZW1lLCExPT09byksbi5yZW1vdmVDbGFzcyhpLm5hbWVzcGFjZS5zbGljZSgxKSksci5oYXNJbml0aWFsaXplZD0hMSxkZWxldGUgci5jb25maWcuY2FjaGUsImZ1bmN0aW9uIj09dHlwZW9mIHMmJnMociksdC5kZWJ1ZyhpLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ0YWJsZXNvcnRlciBoYXMgYmVlbiByZW1vdmVkIil9fX07ZS5mbi50YWJsZXNvcnRlcj1mdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxzPWUuZXh0ZW5kKCEwLHt9LHQuZGVmYXVsdHMscix0Lmluc3RhbmNlTWV0aG9kcyk7cy5vcmlnaW5hbFNldHRpbmdzPXIsIW8uaGFzSW5pdGlhbGl6ZWQmJnQuYnVpbGRUYWJsZSYmIlRBQkxFIiE9PXRoaXMubm9kZU5hbWU/dC5idWlsZFRhYmxlKG8scyk6dC5zZXR1cChvLHMpfSl9LHdpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2d8fCh0LmxvZ3M9W10sY29uc29sZT17fSxjb25zb2xlLmxvZz1jb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj1jb25zb2xlLnRhYmxlPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50czphcmd1bWVudHNbMF07dC5sb2dzW3QubG9ncy5sZW5ndGhdPXtkYXRlOkRhdGUubm93KCksbG9nOmV9fSksdC5hZGRQYXJzZXIoe2lkOiJuby1wYXJzZXIiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbigpe3JldHVybiIifSx0eXBlOiJ0ZXh0In0pLHQuYWRkUGFyc2VyKHtpZDoidGV4dCIsaXM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9by5jb25maWc7cmV0dXJuIHImJihyPWUudHJpbShzLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpLHI9cy5zb3J0TG9jYWxlQ29tcGFyZT90LnJlcGxhY2VBY2NlbnRzKHIpOnIpLHJ9LHR5cGU6InRleHQifSksdC5yZWdleC5ub25kaWdpdD0vW15cdywuIFwtKCldL2csdC5hZGRQYXJzZXIoe2lkOiJkaWdpdCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNEaWdpdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC5jdXJyZW5jeVJlcGxhY2U9L1srXC0sLiBdL2csdC5yZWdleC5jdXJyZW5jeVRlc3Q9L15cKD9cZCtbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXXxbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXVxkK1wpPyQvLHQuYWRkUGFyc2VyKHtpZDoiY3VycmVuY3kiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiBlPShlfHwiIikucmVwbGFjZSh0LnJlZ2V4LmN1cnJlbmN5UmVwbGFjZSwiIiksdC5yZWdleC5jdXJyZW5jeVRlc3QudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC51cmxQcm90b2NvbFRlc3Q9L14oaHR0cHM/fGZ0cHxmaWxlKTpcL1wvLyx0LnJlZ2V4LnVybFByb3RvY29sUmVwbGFjZT0vKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLyh3d3dcLik/Lyx0LmFkZFBhcnNlcih7aWQ6InVybCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgudXJsUHJvdG9jb2xUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihyKXtyZXR1cm4gcj9lLnRyaW0oci5yZXBsYWNlKHQucmVnZXgudXJsUHJvdG9jb2xSZXBsYWNlLCIiKSk6cn0sdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhc2g9Ly0vZyx0LnJlZ2V4Lmlzb0RhdGU9L15cZHs0fVtcL1wtXVxkezEsMn1bXC9cLV1cZHsxLDJ9Lyx0LmFkZFBhcnNlcih7aWQ6Imlzb0RhdGUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4Lmlzb0RhdGUudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGFzaCwiLyIpKTplO3JldHVybiByIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocik/ci5nZXRUaW1lKCk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnBlcmNlbnQ9LyUvZyx0LnJlZ2V4LnBlcmNlbnRUZXN0PS8oXGRccyo/JXwlXHMqP1xkKS8sdC5hZGRQYXJzZXIoe2lkOiJwZXJjZW50IixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC5wZXJjZW50VGVzdC50ZXN0KGUpJiZlLmxlbmd0aDwxNX0sZm9ybWF0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGU/dC5mb3JtYXRGbG9hdChlLnJlcGxhY2UodC5yZWdleC5wZXJjZW50LCIiKSxyKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoiaW1hZ2UiLGlzOmZ1bmN0aW9uKGUsdCxyLG8pe3JldHVybiBvLmZpbmQoImltZyIpLmxlbmd0aD4wfSxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3JldHVybiBlKG8pLmZpbmQoImltZyIpLmF0dHIoci5jb25maWcuaW1nQXR0cnx8ImFsdCIpfHx0fSxwYXJzZWQ6ITAsdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhdGVSZXBsYWNlPS8oXFMpKFtBUF1NKSQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0MT0vXltBLVpdezMsMTB9XC4/XHMrXGR7MSwyfSw/XHMrKFxkezR9KShccytcZHsxLDJ9OlxkezJ9KDpcZHsyfSk/KFxzK1tBUF1NKT8pPyQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0Mj0vXlxkezEsMn1ccytbQS1aXXszLDEwfVxzK1xkezR9L2ksdC5hZGRQYXJzZXIoe2lkOiJ1c0xvbmdEYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC51c0xvbmdEYXRlVGVzdDEudGVzdChlKXx8dC5yZWdleC51c0xvbmdEYXRlVGVzdDIudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGF0ZVJlcGxhY2UsIiQxICQyIikpOmU7cmV0dXJuIHIgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShyKT9yLmdldFRpbWUoKTplfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXguc2hvcnREYXRlVGVzdD0vKF5cZHsxLDJ9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezR9KXwoXlxkezR9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezEsMn0pLyx0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2U9L1tcLS4sXS9nLHQucmVnZXguc2hvcnREYXRlWFhZPS8oXGR7MSwyfSlbXC9cc10oXGR7MSwyfSlbXC9cc10oXGR7NH0pLyx0LnJlZ2V4LnNob3J0RGF0ZVlNRD0vKFxkezR9KVtcL1xzXShcZHsxLDJ9KVtcL1xzXShcZHsxLDJ9KS8sdC5jb252ZXJ0Rm9ybWF0PWZ1bmN0aW9uKGUscil7ZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLCJtbWRkeXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMS8kMiIpOiJkZG1teXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMi8kMSIpOiJ5eXl5bW1kZCI9PT1yJiYoZT1lLnJlcGxhY2UodC5yZWdleC5zaG9ydERhdGVZTUQsIiQxLyQyLyQzIikpO3ZhciBvPW5ldyBEYXRlKGUpO3JldHVybiBvIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUobyk/by5nZXRUaW1lKCk6IiJ9LHQuYWRkUGFyc2VyKHtpZDoic2hvcnREYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLHQucmVnZXguc2hvcnREYXRlVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZSl7dmFyIGE9ci5jb25maWcsbj1hLiRoZWFkZXJJbmRleGVkW3NdLGk9bi5sZW5ndGgmJm4uZGF0YSgiZGF0ZUZvcm1hdCIpfHx0LmdldERhdGEobix0LmdldENvbHVtbkRhdGEocixhLmhlYWRlcnMscyksImRhdGVGb3JtYXQiKXx8YS5kYXRlRm9ybWF0O3JldHVybiBuLmxlbmd0aCYmbi5kYXRhKCJkYXRlRm9ybWF0IixpKSx0LmNvbnZlcnRGb3JtYXQoZSxpKXx8ZX1yZXR1cm4gZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnRpbWVUZXN0PS9eKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSkkfF4oKD86WzAxXVxkfFsyXVswLTRdKTpbMC01XVxkKSQvaSx0LnJlZ2V4LnRpbWVNYXRjaD0vKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSl8KCg/OlswMV1cZHxbMl1bMC00XSk6WzAtNV1cZCkvaSx0LmFkZFBhcnNlcih7aWQ6InRpbWUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4LnRpbWVUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcixvPShlfHwiIikubWF0Y2godC5yZWdleC50aW1lTWF0Y2gpLHM9bmV3IERhdGUoZSksYT1lJiYobnVsbCE9PW8/b1swXToiMDA6MDAgQU0iKSxuPWE/bmV3IERhdGUoIjIwMDAvMDEvMDEgIithLnJlcGxhY2UodC5yZWdleC5kYXRlUmVwbGFjZSwiJDEgJDIiKSk6YTtyZXR1cm4gbiBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKG4pPyhyPXMgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShzKT9zLmdldFRpbWUoKTowLHI/cGFyc2VGbG9hdChuLmdldFRpbWUoKSsiLiIrcy5nZXRUaW1lKCkpOm4uZ2V0VGltZSgpKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoibWV0YWRhdGEiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHM9ci5jb25maWcsYT1zLnBhcnNlck1ldGFkYXRhTmFtZT9zLnBhcnNlck1ldGFkYXRhTmFtZToic29ydFZhbHVlIjtyZXR1cm4gZShvKS5tZXRhZGF0YSgpW2FdfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkV2lkZ2V0KHtpZDoiemVicmEiLHByaW9yaXR5OjkwLGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZz1uZXcgUmVnRXhwKHIuY3NzQ2hpbGRSb3csImkiKSxwPXIuJHRib2RpZXMuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV90YWJsZSIpLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrci5jc3NJbmZvQmxvY2srIikiKSk7Zm9yKGw9MDtsPHAubGVuZ3RoO2wrKylmb3Iobj0wLGM9KHM9cC5lcShsKS5jaGlsZHJlbigidHI6dmlzaWJsZSIpLm5vdChyLnNlbGVjdG9yUmVtb3ZlKSkubGVuZ3RoLGQ9MDtkPGM7ZCsrKWE9cy5lcShkKSxnLnRlc3QoYVswXS5jbGFzc05hbWUpfHxuKyssaT1uJTI9PTAsYS5yZW1vdmVDbGFzcyhvLnplYnJhW2k/MTowXSkuYWRkQ2xhc3Moby56ZWJyYVtpPzA6MV0pfSxyZW1vdmU6ZnVuY3Rpb24oZSxyLG8scyl7aWYoIXMpe3ZhciBhLG4saT1yLiR0Ym9kaWVzLGw9KG8uemVicmF8fFsiZXZlbiIsIm9kZCJdKS5qb2luKCIgIik7Zm9yKGE9MDthPGkubGVuZ3RoO2ErKykobj10LnByb2Nlc3NUYm9keShlLGkuZXEoYSksITApKS5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKGwpLHQucHJvY2Vzc1Rib2R5KGUsbiwhMSl9fX0pfShlKSxlLnRhYmxlc29ydGVyfSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAgICBDb3B5cmlnaHQgMjAwOC0yMDEzCiAgICAgICAgTWF0dGhpYXMgRWhtYW5uLAogICAgICAgIE1pY2hhZWwgR2VyaGFldXNlciwKICAgICAgICBDYXJzdGVuIE1pbGxlciwKICAgICAgICBCaWFuY2EgVmFsZW50aW4sCiAgICAgICAgQWxmcmVkIFdhc3Nlcm1hbm4sCiAgICAgICAgUGV0ZXIgV2lsZmFocnQKICAgIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBvciBMR1BMIFZlcnNpb24gMyBsaWNlbnNlcy4KICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLgogICAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8+LgoqLwooZnVuY3Rpb24oKXt2YXIgZSxyLG47KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG8oZSxyKXtyZXR1cm4gQy5jYWxsKGUscil9ZnVuY3Rpb24gaShlLHIpe3ZhciBuLHQsbyxpLGEsdSxjLGYscyxsLHA9ciYmci5zcGxpdCgiLyIpLGg9ay5tYXAsZD1oJiZoWyIqIl18fHt9O2lmKGUmJiIuIj09PWUuY2hhckF0KDApKWlmKHIpe2ZvcihwPXAuc2xpY2UoMCxwLmxlbmd0aC0xKSxlPXAuY29uY2F0KGUuc3BsaXQoIi8iKSksZj0wO2UubGVuZ3RoPmY7Zis9MSlpZihsPWVbZl0sIi4iPT09bCllLnNwbGljZShmLDEpLGYtPTE7ZWxzZSBpZigiLi4iPT09bCl7aWYoMT09PWYmJigiLi4iPT09ZVsyXXx8Ii4uIj09PWVbMF0pKWJyZWFrO2Y+MCYmKGUuc3BsaWNlKGYtMSwyKSxmLT0yKX1lPWUuam9pbigiLyIpfWVsc2UgMD09PWUuaW5kZXhPZigiLi8iKSYmKGU9ZS5zdWJzdHJpbmcoMikpO2lmKChwfHxkKSYmaCl7Zm9yKG49ZS5zcGxpdCgiLyIpLGY9bi5sZW5ndGg7Zj4wO2YtPTEpe2lmKHQ9bi5zbGljZSgwLGYpLmpvaW4oIi8iKSxwKWZvcihzPXAubGVuZ3RoO3M+MDtzLT0xKWlmKG89aFtwLnNsaWNlKDAscykuam9pbigiLyIpXSxvJiYobz1vW3RdKSl7aT1vLGE9ZjticmVha31pZihpKWJyZWFrOyF1JiZkJiZkW3RdJiYodT1kW3RdLGM9Zil9IWkmJnUmJihpPXUsYT1jKSxpJiYobi5zcGxpY2UoMCxhLGkpLGU9bi5qb2luKCIvIikpfXJldHVybiBlfWZ1bmN0aW9uIGEoZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaC5hcHBseSh0LHYuY2FsbChhcmd1bWVudHMsMCkuY29uY2F0KFtlLHJdKSl9fWZ1bmN0aW9uIHUoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBpKHIsZSl9fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe2JbZV09cn19ZnVuY3Rpb24gZihlKXtpZihvKG0sZSkpe3ZhciByPW1bZV07ZGVsZXRlIG1bZV0seVtlXT0hMCxwLmFwcGx5KHQscil9aWYoIW8oYixlKSYmIW8oeSxlKSl0aHJvdyBFcnJvcigiTm8gIitlKTtyZXR1cm4gYltlXX1mdW5jdGlvbiBzKGUpe3ZhciByLG49ZT9lLmluZGV4T2YoIiEiKTotMTtyZXR1cm4gbj4tMSYmKHI9ZS5zdWJzdHJpbmcoMCxuKSxlPWUuc3Vic3RyaW5nKG4rMSxlLmxlbmd0aCkpLFtyLGVdfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGsmJmsuY29uZmlnJiZrLmNvbmZpZ1tlXXx8e319fXZhciBwLGgsZCxnLGI9e30sbT17fSxrPXt9LHk9e30sQz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHY9W10uc2xpY2U7ZD1mdW5jdGlvbihlLHIpe3ZhciBuLHQ9cyhlKSxvPXRbMF07cmV0dXJuIGU9dFsxXSxvJiYobz1pKG8sciksbj1mKG8pKSxvP2U9biYmbi5ub3JtYWxpemU/bi5ub3JtYWxpemUoZSx1KHIpKTppKGUscik6KGU9aShlLHIpLHQ9cyhlKSxvPXRbMF0sZT10WzFdLG8mJihuPWYobykpKSx7ZjpvP28rIiEiK2U6ZSxuOmUscHI6byxwOm59fSxnPXtyZXF1aXJlOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUpfSxleHBvcnRzOmZ1bmN0aW9uKGUpe3ZhciByPWJbZV07cmV0dXJuIHIhPT12b2lkIDA/cjpiW2VdPXt9fSxtb2R1bGU6ZnVuY3Rpb24oZSl7cmV0dXJue2lkOmUsdXJpOiIiLGV4cG9ydHM6YltlXSxjb25maWc6bChlKX19fSxwPWZ1bmN0aW9uKGUscixuLGkpe3ZhciB1LHMsbCxwLGgsayxDPVtdO2lmKGk9aXx8ZSwiZnVuY3Rpb24iPT10eXBlb2Ygbil7Zm9yKHI9IXIubGVuZ3RoJiZuLmxlbmd0aD9bInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl06cixoPTA7ci5sZW5ndGg+aDtoKz0xKWlmKHA9ZChyW2hdLGkpLHM9cC5mLCJyZXF1aXJlIj09PXMpQ1toXT1nLnJlcXVpcmUoZSk7ZWxzZSBpZigiZXhwb3J0cyI9PT1zKUNbaF09Zy5leHBvcnRzKGUpLGs9ITA7ZWxzZSBpZigibW9kdWxlIj09PXMpdT1DW2hdPWcubW9kdWxlKGUpO2Vsc2UgaWYobyhiLHMpfHxvKG0scyl8fG8oeSxzKSlDW2hdPWYocyk7ZWxzZXtpZighcC5wKXRocm93IEVycm9yKGUrIiBtaXNzaW5nICIrcyk7cC5wLmxvYWQocC5uLGEoaSwhMCksYyhzKSx7fSksQ1toXT1iW3NdfWw9bi5hcHBseShiW2VdLEMpLGUmJih1JiZ1LmV4cG9ydHMhPT10JiZ1LmV4cG9ydHMhPT1iW2VdP2JbZV09dS5leHBvcnRzOmw9PT10JiZrfHwoYltlXT1sKSl9ZWxzZSBlJiYoYltlXT1uKX0sZT1yPWg9ZnVuY3Rpb24oZSxyLG4sbyxpKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/Z1tlXT9nW2VdKHIpOmYoZChlLHIpLmYpOihlLnNwbGljZXx8KGs9ZSxyLnNwbGljZT8oZT1yLHI9bixuPW51bGwpOmU9dCkscj1yfHxmdW5jdGlvbigpe30sImZ1bmN0aW9uIj09dHlwZW9mIG4mJihuPW8sbz1pKSxvP3AodCxlLHIsbik6c2V0VGltZW91dChmdW5jdGlvbigpe3AodCxlLHIsbil9LDQpLGgpfSxoLmNvbmZpZz1mdW5jdGlvbihlKXtyZXR1cm4gaz1lLGsuZGVwcyYmaChrLmRlcHMsay5jYWxsYmFjayksaH0sbj1mdW5jdGlvbihlLHIsbil7ci5zcGxpY2V8fChuPXIscj1bXSksbyhiLGUpfHxvKG0sZSl8fChtW2VdPVtlLHIsbl0pfSxuLmFtZD17alF1ZXJ5OiEwfX0pKCksbigiLi4vbm9kZV9tb2R1bGVzL2FsbW9uZC9hbG1vbmQiLGZ1bmN0aW9uKCl7fSksbigianhnIixbXSxmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiJvYmplY3QiIT10eXBlb2YgSlhHfHxKWEcuZXh0ZW5kfHwoZT1KWEcpLGUuZXh0ZW5kPWZ1bmN0aW9uKGUscixuLHQpe3ZhciBvLGk7bj1ufHwhMSx0PXR8fCExO2ZvcihvIGluIHIpKCFufHxuJiZyLmhhc093blByb3BlcnR5KG8pKSYmKGk9dD9vLnRvTG93ZXJDYXNlKCk6byxlW2ldPXJbb10pfSxlLmV4dGVuZChlLHtib2FyZHM6e30scmVhZGVyczp7fSxlbGVtZW50czp7fSxyZWdpc3RlckVsZW1lbnQ6ZnVuY3Rpb24oZSxyKXtlPWUudG9Mb3dlckNhc2UoKSx0aGlzLmVsZW1lbnRzW2VdPXJ9LHJlZ2lzdGVyUmVhZGVyOmZ1bmN0aW9uKGUscil7dmFyIG4sdDtmb3Iobj0wO3IubGVuZ3RoPm47bisrKXQ9cltuXS50b0xvd2VyQ2FzZSgpLCJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLnJlYWRlcnNbdF0mJih0aGlzLnJlYWRlcnNbdF09ZSl9LHNob3J0Y3V0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbcl0uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sZ2V0UmVmOmZ1bmN0aW9uKGUscil7cmV0dXJuIGUuc2VsZWN0KHIpfSxnZXRSZWZlcmVuY2U6ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZS5zZWxlY3Qocil9LGRlYnVnSW50OmZ1bmN0aW9uKCl7dmFyIGUscjtmb3IoZT0wO2FyZ3VtZW50cy5sZW5ndGg+ZTtlKyspcj1hcmd1bWVudHNbZV0sIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZz9jb25zb2xlLmxvZyhyKToib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVidWciKSYmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZWJ1ZyIpLmlubmVySFRNTCs9cisiPGJyLz4iKX0sZGVidWdXU1Q6ZnVuY3Rpb24oKXt2YXIgcj1FcnJvcigpO2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJnIuc3RhY2smJihlLmRlYnVnSW50KCJzdGFja3RyYWNlIiksZS5kZWJ1Z0ludChyLnN0YWNrLnNwbGl0KCJcbiIpLnNsaWNlKDEpLmpvaW4oIlxuIikpKX0sZGVidWdMaW5lOmZ1bmN0aW9uKCl7dmFyIHI9RXJyb3IoKTtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZyLnN0YWNrJiZlLmRlYnVnSW50KCJDYWxsZWQgZnJvbSIsci5zdGFjay5zcGxpdCgiXG4iKS5zbGljZSgyLDMpLmpvaW4oIlxuIikpfSxkZWJ1ZzpmdW5jdGlvbigpe2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pLGV9KSxuKCJ1dGlscy96aXAiLFsianhnIl0sZnVuY3Rpb24oZSl7dmFyIHI9WzAsMTI4LDY0LDE5MiwzMiwxNjAsOTYsMjI0LDE2LDE0NCw4MCwyMDgsNDgsMTc2LDExMiwyNDAsOCwxMzYsNzIsMjAwLDQwLDE2OCwxMDQsMjMyLDI0LDE1Miw4OCwyMTYsNTYsMTg0LDEyMCwyNDgsNCwxMzIsNjgsMTk2LDM2LDE2NCwxMDAsMjI4LDIwLDE0OCw4NCwyMTIsNTIsMTgwLDExNiwyNDQsMTIsMTQwLDc2LDIwNCw0NCwxNzIsMTA4LDIzNiwyOCwxNTYsOTIsMjIwLDYwLDE4OCwxMjQsMjUyLDIsMTMwLDY2LDE5NCwzNCwxNjIsOTgsMjI2LDE4LDE0Niw4MiwyMTAsNTAsMTc4LDExNCwyNDIsMTAsMTM4LDc0LDIwMiw0MiwxNzAsMTA2LDIzNCwyNiwxNTQsOTAsMjE4LDU4LDE4NiwxMjIsMjUwLDYsMTM0LDcwLDE5OCwzOCwxNjYsMTAyLDIzMCwyMiwxNTAsODYsMjE0LDU0LDE4MiwxMTgsMjQ2LDE0LDE0Miw3OCwyMDYsNDYsMTc0LDExMCwyMzgsMzAsMTU4LDk0LDIyMiw2MiwxOTAsMTI2LDI1NCwxLDEyOSw2NSwxOTMsMzMsMTYxLDk3LDIyNSwxNywxNDUsODEsMjA5LDQ5LDE3NywxMTMsMjQxLDksMTM3LDczLDIwMSw0MSwxNjksMTA1LDIzMywyNSwxNTMsODksMjE3LDU3LDE4NSwxMjEsMjQ5LDUsMTMzLDY5LDE5NywzNywxNjUsMTAxLDIyOSwyMSwxNDksODUsMjEzLDUzLDE4MSwxMTcsMjQ1LDEzLDE0MSw3NywyMDUsNDUsMTczLDEwOSwyMzcsMjksMTU3LDkzLDIyMSw2MSwxODksMTI1LDI1MywzLDEzMSw2NywxOTUsMzUsMTYzLDk5LDIyNywxOSwxNDcsODMsMjExLDUxLDE3OSwxMTUsMjQzLDExLDEzOSw3NSwyMDMsNDMsMTcxLDEwNywyMzUsMjcsMTU1LDkxLDIxOSw1OSwxODcsMTIzLDI1MSw3LDEzNSw3MSwxOTksMzksMTY3LDEwMywyMzEsMjMsMTUxLDg3LDIxNSw1NSwxODMsMTE5LDI0NywxNSwxNDMsNzksMjA3LDQ3LDE3NSwxMTEsMjM5LDMxLDE1OSw5NSwyMjMsNjMsMTkxLDEyNywyNTVdLG49WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSx0PVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsOTksOTldLG89WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3N10saT1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sYT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sdT0yNTY7cmV0dXJuIGUuVXRpbD1lLlV0aWx8fHt9LGUuVXRpbC5VbnppcD1mdW5jdGlvbihjKXtmdW5jdGlvbiBmKCl7cmV0dXJuIFIrPTgsTz5YP2NbWCsrXTotMX1mdW5jdGlvbiBzKCl7Qj0xfWZ1bmN0aW9uIGwoKXt2YXIgZTt0cnl7cmV0dXJuIFIrKyxlPTEmQixCPj49MSwwPT09QiYmKEI9ZigpLGU9MSZCLEI9MTI4fEI+PjEpLGV9Y2F0Y2gocil7dGhyb3cgcn19ZnVuY3Rpb24gcChlKXt2YXIgbj0wLHQ9ZTt0cnl7Zm9yKDt0LS07KW49bjw8MXxsKCk7ZSYmKG49cltuXT4+OC1lKX1jYXRjaChvKXt0aHJvdyBvfXJldHVybiBufWZ1bmN0aW9uIGgoKXtKPTB9ZnVuY3Rpb24gZChlKXtqKyssR1tKKytdPWUsei5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpLDMyNzY4PT09SiYmKEo9MCl9ZnVuY3Rpb24gZygpe3RoaXMuYjA9MCx0aGlzLmIxPTAsdGhpcy5qdW1wPW51bGwsdGhpcy5qdW1wcG9zPS0xfWZ1bmN0aW9uIGIoKXtmb3IoOzspe2lmKE1bSF0+PXgpcmV0dXJuLTE7aWYoVVtNW0hdXT09PUgpcmV0dXJuIE1bSF0rKztNW0hdKyt9fWZ1bmN0aW9uIG0oKXt2YXIgZSxyPVBbRl07aWYoMTc9PT1IKXJldHVybi0xO2lmKEYrKyxIKyssZT1iKCksZT49MClyLmIwPWU7ZWxzZSBpZihyLmIwPTMyNzY4LG0oKSlyZXR1cm4tMTtpZihlPWIoKSxlPj0wKXIuYjE9ZSxyLmp1bXA9bnVsbDtlbHNlIGlmKHIuYjE9MzI3Njgsci5qdW1wPVBbRl0sci5qdW1wcG9zPUYsbSgpKXJldHVybi0xO3JldHVybiBILS0sMH1mdW5jdGlvbiBrKGUscixuKXt2YXIgdDtmb3IoUD1lLEY9MCxVPW4seD1yLHQ9MDsxNz50O3QrKylNW3RdPTA7cmV0dXJuIEg9MCxtKCk/LTE6MH1mdW5jdGlvbiB5KGUpe2Zvcih2YXIgcixuLHQsbz0wLGk9ZVtvXTs7KWlmKHQ9bCgpKXtpZighKDMyNzY4JmkuYjEpKXJldHVybiBpLmIxO2ZvcihpPWkuanVtcCxyPWUubGVuZ3RoLG49MDtyPm47bisrKWlmKGVbbl09PT1pKXtvPW47YnJlYWt9fWVsc2V7aWYoISgzMjc2OCZpLmIwKSlyZXR1cm4gaS5iMDtvKyssaT1lW29dfX1mdW5jdGlvbiBDKCl7dmFyIHUsYyxiLG0sQyx2LEEsaix3LFUseCxTLHosSSxFLEwsTztkbyBpZih1PWwoKSxiPXAoMiksMD09PWIpZm9yKHMoKSxVPWYoKSxVfD1mKCk8PDgsUz1mKCksU3w9ZigpPDw4LDY1NTM1JihVXn5TKSYmZS5kZWJ1ZygiQmxvY2tMZW4gY2hlY2tzdW0gbWlzbWF0Y2hcbiIpO1UtLTspYz1mKCksZChjKTtlbHNlIGlmKDE9PT1iKWZvcig7OylpZihDPXJbcCg3KV0+PjEsQz4yMz8oQz1DPDwxfGwoKSxDPjE5OT8oQy09MTI4LEM9Qzw8MXxsKCkpOihDLT00OCxDPjE0MyYmKEMrPTEzNikpKTpDKz0yNTYsMjU2PkMpZChDKTtlbHNle2lmKDI1Nj09PUMpYnJlYWs7Zm9yKEMtPTI1Nyx3PXAodFtDXSkrbltDXSxDPXJbcCg1KV0+PjMsaVtDXT44Pyh4PXAoOCkseHw9cChpW0NdLTgpPDw4KTp4PXAoaVtDXSkseCs9b1tDXSxDPTA7dz5DO0MrKyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgaWYoMj09PWIpe2ZvcihBPUFycmF5KDMyMCksST0yNTcrcCg1KSxFPTErcCg1KSxMPTQrcCg0KSxDPTA7MTk+QztDKyspQVtDXT0wO2ZvcihDPTA7TD5DO0MrKylBW2FbQ11dPXAoMyk7Zm9yKHc9cS5sZW5ndGgsbT0wO3c+bTttKyspcVttXT1uZXcgZztpZihrKHEsMTksQSwwKSlyZXR1cm4gaCgpLDE7Zm9yKHo9SStFLG09MCxPPS0xO3o+bTspaWYoTysrLEM9eShxKSwxNj5DKUFbbSsrXT1DO2Vsc2UgaWYoMTY9PT1DKXtpZihDPTMrcCgyKSxtK0M+eilyZXR1cm4gaCgpLDE7Zm9yKHY9bT9BW20tMV06MDtDLS07KUFbbSsrXT12fWVsc2V7aWYoQz0xNz09PUM/MytwKDMpOjExK3AoNyksbStDPnopcmV0dXJuIGgoKSwxO2Zvcig7Qy0tOylBW20rK109MH1mb3Iodz1ULmxlbmd0aCxtPTA7dz5tO20rKylUW21dPW5ldyBnO2lmKGsoVCxJLEEsMCkpcmV0dXJuIGgoKSwxO2Zvcih3PVQubGVuZ3RoLG09MDt3Pm07bSsrKXFbbV09bmV3IGc7Zm9yKGo9W10sbT1JO0EubGVuZ3RoPm07bSsrKWpbbS1JXT1BW21dO2lmKGsocSxFLGosMCkpcmV0dXJuIGgoKSwxO2Zvcig7OylpZihDPXkoVCksQz49MjU2KXtpZihDLT0yNTYsMD09PUMpYnJlYWs7Zm9yKEMtPTEsdz1wKHRbQ10pK25bQ10sQz15KHEpLGlbQ10+OD8oeD1wKDgpLHh8PXAoaVtDXS04KTw8OCk6eD1wKGlbQ10pLHgrPW9bQ107dy0tOyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgZChDKX13aGlsZSghdSk7cmV0dXJuIGgoKSxzKCksMH1mdW5jdGlvbiB2KCl7dmFyIGUscixuLHQsbyxpLGEsYyxzPVtdO3RyeXtpZih6PVtdLEw9ITEsc1swXT1mKCksc1sxXT1mKCksMTIwPT09c1swXSYmMjE4PT09c1sxXSYmKEMoKSxFW0ldPVt6LmpvaW4oIiIpLCJnZW9uZXh0Lmd4dCJdLEkrKyksMzE9PT1zWzBdJiYxMzk9PT1zWzFdJiYoUygpLEVbSV09W3ouam9pbigiIiksImZpbGUiXSxJKyspLDgwPT09c1swXSYmNzU9PT1zWzFdJiYoTD0hMCxzWzJdPWYoKSxzWzNdPWYoKSwzPT09c1syXSYmND09PXNbM10pKXtmb3Ioc1swXT1mKCksc1sxXT1mKCksQT1mKCksQXw9ZigpPDw4LGM9ZigpLGN8PWYoKTw8OCxmKCksZigpLGYoKSxmKCksYT1mKCksYXw9ZigpPDw4LGF8PWYoKTw8MTYsYXw9ZigpPDwyNCxpPWYoKSxpfD1mKCk8PDgsaXw9ZigpPDwxNixpfD1mKCk8PDI0LG89ZigpLG98PWYoKTw8OCxvfD1mKCk8PDE2LG98PWYoKTw8MjQsdD1mKCksdHw9ZigpPDw4LG49ZigpLG58PWYoKTw8OCxlPTAsTj1bXTt0LS07KXI9ZigpLCIvIj09PXJ8IjoiPT09cj9lPTA6dS0xPmUmJihOW2UrK109U3RyaW5nLmZyb21DaGFyQ29kZShyKSk7Zm9yKHd8fCh3PU4pLGU9MDtuPmU7KXI9ZigpLGUrKztqPTAsOD09PWMmJihDKCksRVtJXT1BcnJheSgyKSxFW0ldWzBdPXouam9pbigiIiksRVtJXVsxXT1OLmpvaW4oIiIpLEkrKyksUygpfX1jYXRjaChsKXt0aHJvdyBsfX12YXIgQSxqLHcsVSx4LFMsej1bXSxJPTAsRT1bXSxHPUFycmF5KDMyNzY4KSxKPTAsTD0hMSxPPWMubGVuZ3RoLFg9MCxCPTEsUj0wLFQ9QXJyYXkoMjg4KSxxPUFycmF5KDMyKSxGPTAsUD1udWxsLEg9KEFycmF5KDY0KSxBcnJheSg2NCksMCksTT1BcnJheSgxNyksTj1bXTtNWzBdPTAsUz1mdW5jdGlvbigpe3ZhciBlLHIsbix0LG8saSxhPVtdO2lmKDgmQSYmKGFbMF09ZigpLGFbMV09ZigpLGFbMl09ZigpLGFbM109ZigpLDgwPT09YVswXSYmNzU9PT1hWzFdJiY3PT09YVsyXSYmOD09PWFbM10/KGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQpOmU9YVswXXxhWzFdPDw4fGFbMl08PDE2fGFbM108PDI0LHI9ZigpLHJ8PWYoKTw8OCxyfD1mKCk8PDE2LHJ8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCksTCYmdigpLGFbMF09ZigpLDg9PT1hWzBdKXtpZihBPWYoKSxmKCksZigpLGYoKSxmKCksZigpLHQ9ZigpLDQmQSlmb3IoYVswXT1mKCksYVsyXT1mKCksSD1hWzBdKzI1NiphWzFdLG89MDtIPm87bysrKWYoKTtpZig4JkEpZm9yKG89MCxOPVtdLGk9ZigpO2k7KSgiNyI9PT1pfHwiOiI9PT1pKSYmKG89MCksdS0xPm8mJihOW28rK109aSksaT1mKCk7aWYoMTYmQSlmb3IoaT1mKCk7aTspaT1mKCk7MiZBJiYoZigpLGYoKSksQygpLGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCxMJiZ2KCl9fSxlLlV0aWwuVW56aXAucHJvdG90eXBlLnVuemlwRmlsZT1mdW5jdGlvbihlKXt2YXIgcjtmb3IodGhpcy51bnppcCgpLHI9MDtFLmxlbmd0aD5yO3IrKylpZihFW3JdWzFdPT09ZSlyZXR1cm4gRVtyXVswXTtyZXR1cm4iIn0sZS5VdGlsLlVuemlwLnByb3RvdHlwZS51bnppcD1mdW5jdGlvbigpe3JldHVybiB2KCksRX19LGUuVXRpbH0pLG4oInV0aWxzL2VuY29kaW5nIixbImp4ZyJdLGZ1bmN0aW9uKGUpe3ZhciByPTAsbj1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsOCw4LDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEwLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDQsMywzLDExLDYsNiw2LDUsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDAsMTIsMjQsMzYsNjAsOTYsODQsMTIsMTIsMTIsNDgsNzIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMCwxMiwxMiwxMiwxMiwxMiwwLDEyLDAsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTJdO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuVVRGOD17ZW5jb2RlOmZ1bmN0aW9uKGUpe3ZhciByLG4sdD0iIixvPWUubGVuZ3RoO2lmKGU9ZS5yZXBsYWNlKC9cclxuL2csIlxuIiksImZ1bmN0aW9uIj09dHlwZW9mIHVuZXNjYXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZW5jb2RlVVJJQ29tcG9uZW50KXJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpO2ZvcihyPTA7bz5yO3IrKyluPWUuY2hhckNvZGVBdChyKSwxMjg+bj90Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKG4pOm4+MTI3JiYyMDQ4Pm4/KHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTkyfG4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKToodCs9U3RyaW5nLmZyb21DaGFyQ29kZSgyMjR8bj4+MTIpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKTtyZXR1cm4gdH0sZGVjb2RlOmZ1bmN0aW9uKGUpe3ZhciB0LG8saSxhPTAsdT0wLGM9cixmPVtdLHM9ZS5sZW5ndGgsbD1bXTtmb3IodD0wO3M+dDt0Kyspbz1lLmNoYXJDb2RlQXQodCksaT1uW29dLHU9YyE9PXI/NjMmb3x1PDw2OjI1NT4+aSZvLGM9blsyNTYrYytpXSxjPT09ciYmKHU+NjU1MzU/Zi5wdXNoKDU1MjMyKyh1Pj4xMCksNTYzMjArKDEwMjMmdSkpOmYucHVzaCh1KSxhKyssMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSksZj1bXSkpO3JldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGYpKSxsLmpvaW4oIiIpfSxhc2NpaUNoYXJDb2RlQXQ6ZnVuY3Rpb24oZSxyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7aWYobj4yNTUpc3dpdGNoKG4pe2Nhc2UgODM2NDpuPTEyODticmVhaztjYXNlIDgyMTg6bj0xMzA7YnJlYWs7Y2FzZSA0MDI6bj0xMzE7YnJlYWs7Y2FzZSA4MjIyOm49MTMyO2JyZWFrO2Nhc2UgODIzMDpuPTEzMzticmVhaztjYXNlIDgyMjQ6bj0xMzQ7YnJlYWs7Y2FzZSA4MjI1Om49MTM1O2JyZWFrO2Nhc2UgNzEwOm49MTM2O2JyZWFrO2Nhc2UgODI0MDpuPTEzNzticmVhaztjYXNlIDM1MjpuPTEzODticmVhaztjYXNlIDgyNDk6bj0xMzk7YnJlYWs7Y2FzZSAzMzg6bj0xNDA7YnJlYWs7Y2FzZSAzODE6bj0xNDI7YnJlYWs7Y2FzZSA4MjE2Om49MTQ1O2JyZWFrO2Nhc2UgODIxNzpuPTE0NjticmVhaztjYXNlIDgyMjA6bj0xNDc7YnJlYWs7Y2FzZSA4MjIxOm49MTQ4O2JyZWFrO2Nhc2UgODIyNjpuPTE0OTticmVhaztjYXNlIDgyMTE6bj0xNTA7YnJlYWs7Y2FzZSA4MjEyOm49MTUxO2JyZWFrO2Nhc2UgNzMyOm49MTUyO2JyZWFrO2Nhc2UgODQ4MjpuPTE1MzticmVhaztjYXNlIDM1MzpuPTE1NDticmVhaztjYXNlIDgyNTA6bj0xNTU7YnJlYWs7Y2FzZSAzMzk6bj0xNTY7YnJlYWs7Y2FzZSAzODI6bj0xNTg7YnJlYWs7Y2FzZSAzNzY6bj0xNTk7YnJlYWs7ZGVmYXVsdDp9cmV0dXJuIG59fSxlLlV0aWwuVVRGOH0pLG4oInV0aWxzL2Jhc2U2NCIsWyJqeGciLCJ1dGlscy9lbmNvZGluZyJdLGZ1bmN0aW9uKGUscil7ZnVuY3Rpb24gbihlLHIpe3JldHVybiAyNTUmZS5jaGFyQ29kZUF0KHIpfWZ1bmN0aW9uIHQoZSxyKXt2YXIgbj1vLmluZGV4T2YoZS5jaGFyQXQocikpO2lmKC0xPT09bil0aHJvdyBFcnJvcigiSlNYR3JhcGgvdXRpbHMvYmFzZTY0OiBDYW4ndCBkZWNvZGUgc3RyaW5nIChpbnZhbGlkIGNoYXJhY3RlcikuIik7cmV0dXJuIG59dmFyIG89IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGk9Ij0iO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuQmFzZTY0PXtlbmNvZGU6ZnVuY3Rpb24oZSl7dmFyIHQsYSx1LGMsZixzPVtdO2ZvcihmPXIuZW5jb2RlKGUpLHU9Zi5sZW5ndGgsYz11JTMsdD0wO3UtYz50O3QrPTMpYT1uKGYsdCk8PDE2fG4oZix0KzEpPDw4fG4oZix0KzIpLHMucHVzaChvLmNoYXJBdChhPj4xOCksby5jaGFyQXQoNjMmYT4+MTIpLG8uY2hhckF0KDYzJmE+PjYpLG8uY2hhckF0KDYzJmEpKTtzd2l0Y2goYyl7Y2FzZSAxOmE9bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjIpLG8uY2hhckF0KDYzJmE8PDQpLGksaSk7YnJlYWs7Y2FzZSAyOmE9bihmLHUtMik8PDh8bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjEwKSxvLmNoYXJBdCg2MyZhPj40KSxvLmNoYXJBdCg2MyZhPDwyKSxpKX1yZXR1cm4gcy5qb2luKCIiKX0sZGVjb2RlOmZ1bmN0aW9uKGUsbil7dmFyIG8sYSx1LGMsZixzLGw9W10scD1bXTtpZihvPWUucmVwbGFjZSgvW15BLVphLXowLTlcK1wvPV0vZywiIiksdT1vLmxlbmd0aCwwIT09dSU0KXRocm93IEVycm9yKCJKU1hHcmFwaC91dGlscy9iYXNlNjQ6IENhbid0IGRlY29kZSBzdHJpbmcgKGludmFsaWQgaW5wdXQgbGVuZ3RoKS4iKTtmb3Ioby5jaGFyQXQodS0xKT09PWkmJihjPTEsby5jaGFyQXQodS0yKT09PWkmJihjPTIpLHUtPTQpLGE9MDt1PmE7YSs9NClmPXQobyxhKTw8MTh8dChvLGErMSk8PDEyfHQobyxhKzIpPDw2fHQobyxhKzMpLHAucHVzaChmPj4xNiwyNTUmZj4+OCwyNTUmZiksMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxwKSkscD1bXSk7c3dpdGNoKGMpe2Nhc2UgMTpmPXQobyx1KTw8MTJ8dChvLHUrMSk8PDZ8dChvLHUrMikscC5wdXNoKGY+PjEwLDI1NSZmPj4yKTticmVhaztjYXNlIDI6Zj10KG8sYSk8PDZ8dChvLGErMSkscC5wdXNoKGY+PjQpfXJldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHApKSxzPWwuam9pbigiIiksbiYmKHM9ci5kZWNvZGUocykpLHN9LGRlY29kZUFzQXJyYXk6ZnVuY3Rpb24oZSl7dmFyIHIsbj10aGlzLmRlY29kZShlKSx0PVtdLG89bi5sZW5ndGg7Zm9yKHI9MDtvPnI7cisrKXRbcl09bi5jaGFyQ29kZUF0KHIpO3JldHVybiB0fX0sZS5VdGlsLkJhc2U2NH0pLG4oIi4uL2J1aWxkL2NvbXByZXNzb3IuZGVwcy5qcyIsWyJqeGciLCJ1dGlscy96aXAiLCJ1dGlscy9iYXNlNjQiXSxmdW5jdGlvbihlLHIsbil7cmV0dXJuIGUuZGVjb21wcmVzcz1mdW5jdGlvbihlKXtyZXR1cm4gdW5lc2NhcGUobmV3IHIuVW56aXAobi5kZWNvZGVBc0FycmF5KGUpKS51bnppcCgpWzBdWzBdKX0sZX0pLHdpbmRvdy5KWEc9cigiLi4vYnVpbGQvY29tcHJlc3Nvci5kZXBzLmpzIil9KSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuZmlsZUxvYWRpbmcgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIGZpbGVMb2FkaW5nQ2FsbGJhY2tzID0ge307CiAgICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICBmdW5jdGlvbiBsb2FkS2V5d29yZHNGaWxlKGZpbGVuYW1lLCBjYWxsYmFjaykgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSA9IGNhbGxiYWNrOwogICAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOwogICAgICAgIC8vIHRpbWVzdGFtcCBhcyBhbiBhcmd1bWVudCB0byBwcmV2ZW50IGJyb3dzZXJzIGZyb20gY2FjaGluZyBzY3JpcHRzCiAgICAgICAgLy8gc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg2NjYxOS9ob3ctdG8tZm9yY2UtaWUtdG8tcmVsb2FkLWphdmFzY3JpcHQKICAgICAgICBzY3JpcHQuc3JjID0gZmlsZW5hbWUrJz90aW1lPScrdGltZXN0YW1wOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHBhcmVudCkgewogICAgICAgIHZhciBjYWxsYWJsZUxpc3QgPSBbXTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxhYmxlKSB7CiAgICAgICAgICAgIGlmICghcGFyZW50LmlzQ2hpbGRyZW5Mb2FkZWQpIHsKICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdC5wdXNoKGNhbGxhYmxlKTsKICAgICAgICAgICAgICAgIGlmIChjYWxsYWJsZUxpc3QubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBsb2FkS2V5d29yZHNGaWxlKHBhcmVudC5jaGlsZEZpbGVOYW1lLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYWJsZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdFtpXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbm90aWZ5RmlsZUxvYWRlZChmaWxlbmFtZSkgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSgpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXRDYWxsYmFja0hhbmRsZXJGb3JLZXl3b3JkczogZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHMsCiAgICAgICAgbm90aWZ5OiBub3RpZnlGaWxlTG9hZGVkCiAgICB9Cn0oKSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5tb2RlbCA9IChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBTdWl0ZShkYXRhKSB7CiAgICAgICAgdmFyIHN1aXRlID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAgc3VpdGUuc291cmNlID0gZGF0YS5zb3VyY2U7CiAgICAgICAgc3VpdGUucmVsYXRpdmVTb3VyY2UgPSBkYXRhLnJlbGF0aXZlU291cmNlOwogICAgICAgIHN1aXRlLmZ1bGxOYW1lID0gZGF0YS5wYXJlbnQgPyBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIGRhdGEubmFtZSA6IGRhdGEubmFtZTsKICAgICAgICBzZXRTdGF0cyhzdWl0ZSwgZGF0YS5zdGF0aXN0aWNzKTsKICAgICAgICBzdWl0ZS5tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGE7CiAgICAgICAgc3VpdGUucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdUZXN0Jyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVTdWl0ZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignU3VpdGUnKTsKICAgICAgICBzdWl0ZS5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXTsKICAgICAgICBzdWl0ZS5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSBmdW5jdGlvbiAoY2FsbGFibGUpIHsgY2FsbGFibGUoKTsgfTsKICAgICAgICBzdWl0ZS5tZXNzYWdlID0gZGF0YS5tZXNzYWdlOwogICAgICAgIHN1aXRlLmNoaWxkcmVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc3VpdGUua2V5d29yZHMoKS5jb25jYXQoc3VpdGUudGVzdHMoKSkuY29uY2F0KHN1aXRlLnN1aXRlcygpKTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLnNlYXJjaFRlc3RzID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkgewogICAgICAgICAgICB2YXIgdGVzdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHN1aXRlcyA9IHRoaXMuc3VpdGVzKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc3VpdGVzKQogICAgICAgICAgICAgICAgdGVzdHMgPSB0ZXN0cy5jb25jYXQoc3VpdGVzW2ldLnNlYXJjaFRlc3RzKHByZWRpY2F0ZSkpOwogICAgICAgICAgICByZXR1cm4gdGVzdHMuY29uY2F0KHV0aWwuZmlsdGVyKHRoaXMudGVzdHMoKSwgcHJlZGljYXRlKSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5zZWFyY2hUZXN0c0luU3VpdGUgPSBmdW5jdGlvbiAocGF0dGVybiwgbWF0Y2hlcikgewogICAgICAgICAgICBpZiAoIW1hdGNoZXIpCiAgICAgICAgICAgICAgICBtYXRjaGVyID0gdXRpbC5NYXRjaGVyKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzQW55KFtzdWl0ZS5mdWxsTmFtZSwgc3VpdGUubmFtZV0pKQogICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlLmFsbFRlc3RzKCk7CiAgICAgICAgICAgIHZhciB0ZXN0cyA9IFtdOwogICAgICAgICAgICB2YXIgc3VpdGVzID0gdGhpcy5zdWl0ZXMoKTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzdWl0ZXMpCiAgICAgICAgICAgICAgICB0ZXN0cyA9IHRlc3RzLmNvbmNhdChzdWl0ZXNbaV0uc2VhcmNoVGVzdHNJblN1aXRlKHBhdHRlcm4sIG1hdGNoZXIpKTsKICAgICAgICAgICAgcmV0dXJuIHRlc3RzOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuc2VhcmNoVGVzdHNCeVRhZyA9IGZ1bmN0aW9uICh0YWcpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICBpZiAodGFnLmluZm8gPT0gImNyaXRpY2FsIiB8fCB0YWcuaW5mbyA9PSAibm9uLWNyaXRpY2FsIikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3QudGFncywgdGFnLmxhYmVsKTsKICAgICAgICAgICAgICAgIGlmICh0YWcuY29tYmluZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnUGF0dGVybih0ZXN0LnRhZ3MsIHRhZy5jb21iaW5lZCk7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWcodGVzdC50YWdzLCB0YWcubGFiZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLmZpbmRTdWl0ZUJ5TmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuYWxsVGVzdHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBzdWl0ZS5zZWFyY2hUZXN0cyhmdW5jdGlvbiAodGVzdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuY3JpdGljYWxUZXN0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5pc0NyaXRpY2FsOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRhaW5zVGFnKHRlc3RUYWdzLCB0YWduYW1lKSB7CiAgICAgICAgdGVzdFRhZ3MgPSB1dGlsLm1hcCh0ZXN0VGFncywgdXRpbC5ub3JtYWxpemUpOwogICAgICAgIHJldHVybiB1dGlsLmNvbnRhaW5zKHRlc3RUYWdzLCB1dGlsLm5vcm1hbGl6ZSh0YWduYW1lKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHBhdHRlcm4pIHsKICAgICAgICB2YXIgcGF0dGVybnM7CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignTk9UJykgIT0gLTEpIHsKICAgICAgICAgICAgcGF0dGVybnMgPSBwYXR0ZXJuLnNwbGl0KCdOT1QnKTsKICAgICAgICAgICAgaWYgKCF1dGlsLm5vcm1hbGl6ZShwYXR0ZXJuc1swXSkpCiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5hbGwodXRpbC5tYXAocGF0dGVybnMuc2xpY2UoMSksIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwYXR0ZXJuc1swXSkgJiYKICAgICAgICAgICAgICAgIHV0aWwuYWxsKHV0aWwubWFwKHBhdHRlcm5zLnNsaWNlKDEpLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignT1InKSAhPSAtMSkgewogICAgICAgICAgICBwYXR0ZXJucyA9IHBhdHRlcm4uc3BsaXQoJ09SJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFueSh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ0FORCcpICE9IC0xKSB7CiAgICAgICAgICAgIHBhdHRlcm5zID0gcGF0dGVybi5zcGxpdCgnQU5EJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFsbCh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1dGlsLk1hdGNoZXIocGF0dGVybikubWF0Y2hlc0FueSh0ZXN0VGFncyk7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpIHsKICAgICAgICBpZiAoc3VpdGUuZnVsbE5hbWUgPT0gbmFtZSkKICAgICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgICAgIHZhciBzdWJTdWl0ZXMgPSBzdWl0ZS5zdWl0ZXMoKTsKICAgICAgICBmb3IgKHZhciBpIGluIHN1YlN1aXRlcykgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmaW5kU3VpdGVCeU5hbWUoc3ViU3VpdGVzW2ldLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG1hdGNoKQogICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0YXRzKHN1aXRlLCBzdGF0cykgewogICAgICAgIGZvciAodmFyIG5hbWUgaW4gc3RhdHMpIHsKICAgICAgICAgICAgc3VpdGVbbmFtZV0gPSBzdGF0c1tuYW1lXTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNb2RlbE9iamVjdChkYXRhKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lLAogICAgICAgICAgICBkb2M6IGRhdGEuZG9jLAogICAgICAgICAgICBzdGF0dXM6IGRhdGEuc3RhdHVzLAogICAgICAgICAgICB0aW1lczogZGF0YS50aW1lcywKICAgICAgICAgICAgaWQ6IGRhdGEucGFyZW50ID8gZGF0YS5wYXJlbnQuaWQgKyAnLScgKyBkYXRhLmlkIDogZGF0YS5pZAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUZXN0KGRhdGEpIHsKICAgICAgICB2YXIgdGVzdCA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIHRlc3QuZnVsbE5hbWUgPSBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIHRlc3QubmFtZTsKICAgICAgICB0ZXN0LmZvcm1hdFBhcmVudE5hbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB1dGlsLmZvcm1hdFBhcmVudE5hbWUodGVzdCk7IH07CiAgICAgICAgdGVzdC50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIHRlc3QucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgdGVzdC5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJ107CiAgICAgICAgdGVzdC5pc0NoaWxkcmVuTG9hZGVkID0gZGF0YS5pc0NoaWxkcmVuTG9hZGVkOwogICAgICAgIHRlc3QuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHRlc3QpOwogICAgICAgIHRlc3QuY2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0ZXN0LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5rZXl3b3JkcygpOwogICAgICAgIH07CiAgICAgICAgdGVzdC5pc0NyaXRpY2FsID0gZGF0YS5pc0NyaXRpY2FsOwogICAgICAgIHRlc3QudGFncyA9IGRhdGEudGFnczsKICAgICAgICB0ZXN0Lm1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7CiAgICAgICAgdGVzdC5tYXRjaGVzVGFnUGF0dGVybiA9IGZ1bmN0aW9uIChwYXR0ZXJuKSB7CiAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdC50YWdzLCBwYXR0ZXJuKTsKICAgICAgICB9OwogICAgICAgIHRlc3QubWF0Y2hlc05hbWVQYXR0ZXJuID0gZnVuY3Rpb24gKHBhdHRlcm4pIHsKICAgICAgICAgICAgcmV0dXJuIHV0aWwuTWF0Y2hlcihwYXR0ZXJuKS5tYXRjaGVzQW55KFt0ZXN0Lm5hbWUsIHRlc3QuZnVsbE5hbWVdKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiB0ZXN0OwogICAgfQogICAgZnVuY3Rpb24gS2V5d29yZChkYXRhKSB7CiAgICAgICAgdmFyIGt3ID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAga3cubGlibmFtZSA9IGRhdGEubGlibmFtZTsKICAgICAgICBrdy50eXBlID0gZGF0YS50eXBlOwogICAgICAgIGt3LmFyZ3VtZW50cyA9IGRhdGEuYXJnczsKICAgICAgICBrdy5hc3NpZ24gPSBkYXRhLmFzc2lnbiArIChkYXRhLmFzc2lnbiA/ICcgPScgOiAnJyk7CiAgICAgICAga3cudGFncyA9IGRhdGEudGFnczsKICAgICAgICBrdy50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIGt3LnBvcHVsYXRlTWVzc2FnZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignTWVzc2FnZScpOwogICAgICAgIGt3LnBvcHVsYXRlS2V5d29yZHMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignS2V5d29yZCcpOwogICAgICAgIGt3LmNoaWxkcmVuTmFtZXMgPSBbJ2tleXdvcmQnLCAnbWVzc2FnZSddOwogICAgICAgIGt3LmlzQ2hpbGRyZW5Mb2FkZWQgPSBkYXRhLmlzQ2hpbGRyZW5Mb2FkZWQ7CiAgICAgICAga3cuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKGt3KTsKICAgICAgICBrdy5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGt3LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4ga3cua2V5d29yZHMoKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBrdzsKICAgIH0KICAgIGZ1bmN0aW9uIE1lc3NhZ2UobGV2ZWwsIGRhdGUsIHRleHQsIGxpbmspIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsZXZlbDogbGV2ZWwsCiAgICAgICAgICAgIHRpbWU6IHV0aWwudGltZUZyb21EYXRlKGRhdGUpLAogICAgICAgICAgICBkYXRlOiB1dGlsLmRhdGVGcm9tRGF0ZShkYXRlKSwKICAgICAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICAgICAgbGluazogbGluawogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUaW1lcyh0aW1lZGF0YSkgewogICAgICAgIHZhciBzdGFydCA9IHRpbWVkYXRhWzBdOwogICAgICAgIHZhciBlbmQgPSB0aW1lZGF0YVsxXTsKICAgICAgICB2YXIgZWxhcHNlZCA9IHRpbWVkYXRhWzJdOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGVsYXBzZWRNaWxsaXM6IGVsYXBzZWQsCiAgICAgICAgICAgIGVsYXBzZWRUaW1lOiB1dGlsLmZvcm1hdEVsYXBzZWQoZWxhcHNlZCksCiAgICAgICAgICAgIHN0YXJ0VGltZTogdXRpbC5kYXRlVGltZUZyb21EYXRlKHN0YXJ0KSwKICAgICAgICAgICAgZW5kVGltZTogIHV0aWwuZGF0ZVRpbWVGcm9tRGF0ZShlbmQpCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKG5hbWUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHBvcHVsYXRvcikgewogICAgICAgICAgICBwb3B1bGF0ZUl0ZXJhYmxlKHRoaXMsIG5hbWUsIHBvcHVsYXRvcik7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvcHVsYXRlSXRlcmFibGUob2JqLCBuYW1lLCBwb3B1bGF0b3IpIHsKICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpICsgJ3MnOwogICAgICAgIG9ialtuYW1lXSA9IGNyZWF0ZUdldEFsbEZ1bmN0aW9uKHBvcHVsYXRvci5udW1iZXJPZkl0ZW1zLCBwb3B1bGF0b3IuY3JlYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZXRBbGxGdW5jdGlvbihudW1iZXJPZkVsZW1lbnRzLCBjcmVhdG9yKSB7CiAgICAgICAgdmFyIGNhY2hlZCA9IG51bGw7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGNhY2hlZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FjaGVkID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bWJlck9mRWxlbWVudHMoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVkLnB1c2goY3JlYXRvcihpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBTdWl0ZTogU3VpdGUsCiAgICAgICAgVGVzdDogVGVzdCwKICAgICAgICBLZXl3b3JkOiBLZXl3b3JkLAogICAgICAgIE1lc3NhZ2U6IE1lc3NhZ2UsCiAgICAgICAgVGltZXM6IFRpbWVzLAogICAgICAgIGNvbnRhaW5zVGFnOiBjb250YWluc1RhZywgIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICAgICAgY29udGFpbnNUYWdQYXR0ZXJuOiBjb250YWluc1RhZ1BhdHRlcm4gIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICB9Owp9KCkpOwp3aW5kb3cuc3RhdHMgPSAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gU3RhdGlzdGljcyh0b3RhbEVsZW1zLCB0YWdFbGVtcywgc3VpdGVFbGVtcykgewogICAgICAgIHJldHVybiB7dG90YWw6IHV0aWwubWFwKHRvdGFsRWxlbXMsIHRvdGFsU3RhdEVsZW0pLAogICAgICAgICAgICAgICAgdGFnOiAgIHV0aWwubWFwKHRhZ0VsZW1zLCB0YWdTdGF0RWxlbSksCiAgICAgICAgICAgICAgICBzdWl0ZTogdXRpbC5tYXAoc3VpdGVFbGVtcywgc3VpdGVTdGF0RWxlbSl9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdEVsZW0oc3RhdCkgewogICAgICAgIHN0YXQudG90YWwgPSBzdGF0LnBhc3MgKyBzdGF0LmZhaWw7CiAgICAgICAgdmFyIHBlcmNlbnRzID0gY2FsY3VsYXRlUGVyY2VudHMoc3RhdC50b3RhbCwgc3RhdC5wYXNzLCBzdGF0LmZhaWwpOwogICAgICAgIHN0YXQucGFzc1BlcmNlbnQgPSBwZXJjZW50c1swXTsKICAgICAgICBzdGF0LmZhaWxQZXJjZW50ID0gcGVyY2VudHNbMV07CiAgICAgICAgdmFyIHdpZHRocyA9IGNhbGN1bGF0ZVdpZHRocyhzdGF0LnBhc3NQZXJjZW50LCBzdGF0LmZhaWxQZXJjZW50KTsKICAgICAgICBzdGF0LnBhc3NXaWR0aCA9IHdpZHRoc1swXTsKICAgICAgICBzdGF0LmZhaWxXaWR0aCA9IHdpZHRoc1sxXTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHRvdGFsU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC50eXBlID0gc3RhdC5sYWJlbCA9PSAnQ3JpdGljYWwgVGVzdHMnID8gJ2NyaXRpY2FsJyA6ICdhbGwnOwogICAgICAgIHJldHVybiBzdGF0OwogICAgfQogICAgZnVuY3Rpb24gdGFnU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC5saW5rcyA9IHBhcnNlTGlua3Moc3RhdC5saW5rcyk7CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRFbGVtKGRhdGEpIHsKICAgICAgICB2YXIgc3RhdCA9IHN0YXRFbGVtKGRhdGEpOwogICAgICAgIHN0YXQuZnVsbE5hbWUgPSBzdGF0LmxhYmVsOwogICAgICAgIHN0YXQuZm9ybWF0UGFyZW50TmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWwuZm9ybWF0UGFyZW50TmFtZShzdGF0KTsgfTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTGlua3MobGlua3NEYXRhKSB7CiAgICAgICAgaWYgKCFsaW5rc0RhdGEpCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICByZXR1cm4gdXRpbC5tYXAobGlua3NEYXRhLnNwbGl0KCc6OjonKSwgZnVuY3Rpb24gKGxpbmspIHsKICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGxpbmsuaW5kZXhPZignOicpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt0aXRsZTogbGluay5zbGljZSgwLCBpbmRleCksIHVybDogbGluay5zbGljZShpbmRleCsxKX07CiAgICAgICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gY2FsY3VsYXRlUGVyY2VudHModG90YWwsIHBhc3NlZCwgZmFpbGVkKSB7CiAgICAgICAgaWYgKHRvdGFsID09IDApCiAgICAgICAgICAgIHJldHVybiBbMC4wLCAwLjBdOwogICAgICAgIHZhciBwYXNzID0gMTAwLjAgKiBwYXNzZWQgLyB0b3RhbDsKICAgICAgICB2YXIgZmFpbCA9IDEwMC4wICogZmFpbGVkIC8gdG90YWw7CiAgICAgICAgaWYgKHBhc3MgPiAwICYmIHBhc3MgPCAwLjEpCiAgICAgICAgICAgIHJldHVybiBbMC4xLCA5OS45XTsKICAgICAgICBpZiAoZmFpbCA+IDAgJiYgZmFpbCA8IDAuMSkKICAgICAgICAgICAgcmV0dXJuIFs5OS45LCAwLjFdOwogICAgICAgIHJldHVybiBbTWF0aC5yb3VuZChwYXNzKjEwKS8xMCwgTWF0aC5yb3VuZChmYWlsKjEwKS8xMF07CiAgICB9CiAgICBmdW5jdGlvbiBjYWxjdWxhdGVXaWR0aHMobnVtMSwgbnVtMikgewogICAgICAgIGlmIChudW0xICsgbnVtMiA9PSAwKQogICAgICAgICAgICByZXR1cm4gWzAuMCwgMC4wXTsKICAgICAgICAvLyBNYWtlIHNtYWxsIHBlcmNlbnRhZ2VzIGJldHRlciB2aXNpYmxlCiAgICAgICAgaWYgKG51bTEgPiAwICYmIG51bTEgPCAxKQogICAgICAgICAgICByZXR1cm4gWzEuMCwgOTkuMF07CiAgICAgICAgaWYgKG51bTIgPiAwICYmIG51bTIgPCAxKQogICAgICAgICAgICByZXR1cm4gWzk5LjAsIDEuMF07CiAgICAgICAgLy8gSGFuZGxlIHNpdHVhdGlvbiB3aGVyZSBib3RoIGFyZSByb3VuZGVkIHVwCiAgICAgICAgd2hpbGUgKG51bTEgKyBudW0yID4gMTAwKSB7CiAgICAgICAgICAgIGlmIChudW0xID4gbnVtMikKICAgICAgICAgICAgICAgIG51bTEgLT0gMC4xOwogICAgICAgICAgICBpZiAobnVtMiA+IG51bTEpCiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtudW0xLCBudW0yXTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgU3RhdGlzdGljczogU3RhdGlzdGljcwogICAgfTsKfSgpKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LnV0aWwgPSBmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBtYXAoZWxlbXMsIGZ1bmMpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIHJldFtpXSA9IGZ1bmMoZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gZmlsdGVyKGVsZW1zLCBwcmVkaWNhdGUpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbXNbaV0pKQogICAgICAgICAgICAgICAgcmV0LnB1c2goZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gYWxsKGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmICghZWxlbXNbaV0pCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYW55KGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChlbGVtc1tpXSkKICAgICAgICAgICAgICAgIHJldHVybiBlbGVtc1tpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gY29udGFpbnMoZWxlbXMsIGUpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgaWYgKGVsZW1zW2ldID09IGUpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gbGFzdChpdGVtcykgewogICAgICAgIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGgtMV07CiAgICB9CiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyZsdDsvZywgJzwnKS5yZXBsYWNlKC8mZ3Q7L2csICc+JykucmVwbGFjZSgvJmFtcDsvZywgJyYnKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTsKICAgIH0KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnJykucmVwbGFjZSgvXy9nLCAnJyk7CiAgICB9CiAgICBmdW5jdGlvbiByZWdleHBFc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLVtcXXt9KCkrPyouLFxcXiR8I10vZywgIlxcJCYiKTsKICAgIH0KICAgIGZ1bmN0aW9uIE1hdGNoZXIocGF0dGVybikgewogICAgICAgIHBhdHRlcm4gPSByZWdleHBFc2NhcGUobm9ybWFsaXplKHBhdHRlcm4pKTsKICAgICAgICB2YXIgcmVQYXR0ZXJuID0gJ14nICsgcGF0dGVybi5yZXBsYWNlKC9cXFw/L2csICcuJykucmVwbGFjZSgvXFxcKi9nLCAnW1xcc1xcU10qJykgKyAnJCc7CiAgICAgICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAocmVQYXR0ZXJuKTsKICAgICAgICBmdW5jdGlvbiBtYXRjaGVzKHN0cmluZykgewogICAgICAgICAgICByZXR1cm4gcmVnZXhwLnRlc3Qobm9ybWFsaXplKHN0cmluZykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBtYXRjaGVzOiBtYXRjaGVzLAogICAgICAgICAgICBtYXRjaGVzQW55OiBmdW5jdGlvbiAoc3RyaW5ncykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspCiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMoc3RyaW5nc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdFBhcmVudE5hbWUoaXRlbSkgewogICAgICAgIHZhciBwYXJlbnROYW1lID0gaXRlbS5mdWxsTmFtZS5zbGljZSgwLCBpdGVtLmZ1bGxOYW1lLmxlbmd0aCAtIGl0ZW0ubmFtZS5sZW5ndGgpOwogICAgICAgIHJldHVybiBwYXJlbnROYW1lLnJlcGxhY2UoL1wuL2csICcgLiAnKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRpbWVGcm9tRGF0ZShkYXRlKSB7CiAgICAgICAgaWYgKCFkYXRlKQogICAgICAgICAgICByZXR1cm4gJ04vQSc7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlLmdldFNlY29uZHMoKSwgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlRnJvbURhdGUoZGF0ZSkgewogICAgICAgIGlmICghZGF0ZSkKICAgICAgICAgICAgcmV0dXJuICdOL0EnOwogICAgICAgIHJldHVybiBwYWRUbyhkYXRlLmdldEZ1bGxZZWFyKCksIDQpICsKICAgICAgICAgICAgICAgcGFkVG8oZGF0ZS5nZXRNb250aCgpICsgMSwgMikgKwogICAgICAgICAgICAgICBwYWRUbyhkYXRlLmdldERhdGUoKSwgMik7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlVGltZUZyb21EYXRlKGRhdGUpIHsKICAgICAgICBpZiAoIWRhdGUpCiAgICAgICAgICAgIHJldHVybiAnTi9BJzsKICAgICAgICByZXR1cm4gZGF0ZUZyb21EYXRlKGRhdGUpICsgJyAnICsgdGltZUZyb21EYXRlKGRhdGUpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0VGltZShob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzKSB7CiAgICAgICAgcmV0dXJuIHBhZFRvKGhvdXJzLCAyKSArICc6JyArCiAgICAgICAgICAgICAgIHBhZFRvKG1pbnV0ZXMsIDIpICsgJzonICsKICAgICAgICAgICAgICAgcGFkVG8oc2Vjb25kcywgMikgKyAnLicgKwogICAgICAgICAgICAgICBwYWRUbyhtaWxsaXNlY29uZHMsIDMpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0RWxhcHNlZChlbGFwc2VkKSB7CiAgICAgICAgdmFyIG1pbGxpcyA9IGVsYXBzZWQ7CiAgICAgICAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAoNjAgKiA2MCAqIDEwMDApKTsKICAgICAgICBtaWxsaXMgLT0gaG91cnMgKiA2MCAqIDYwICogMTAwMDsKICAgICAgICB2YXIgbWludXRlcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gKDYwICogMTAwMCkpOwogICAgICAgIG1pbGxpcyAtPSBtaW51dGVzICogNjAgKiAxMDAwOwogICAgICAgIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAxMDAwKTsKICAgICAgICBtaWxsaXMgLT0gc2Vjb25kcyAqIDEwMDA7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpcyk7CiAgICB9CiAgICBmdW5jdGlvbiBwYWRUbyhudW1iZXIsIGxlbikgewogICAgICAgIHZhciBudW1TdHJpbmcgPSBudW1iZXIgKyAiIjsKICAgICAgICB3aGlsZSAobnVtU3RyaW5nLmxlbmd0aCA8IGxlbikgbnVtU3RyaW5nID0gIjAiICsgbnVtU3RyaW5nOwogICAgICAgIHJldHVybiBudW1TdHJpbmc7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lc3RhbXAobWlsbGlzKSB7CiAgICAgICAgLy8gdXNlZCBhbHNvIGJ5IHRvb2xzIHRoYXQgZG8gbm90IHNldCB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMKICAgICAgICB2YXIgYmFzZSA9IHdpbmRvdy5vdXRwdXQgPyB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMgOiAwOwogICAgICAgIHJldHVybiBuZXcgRGF0ZShiYXNlICsgbWlsbGlzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZFN0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7CiAgICAgICAgdmFyIGR0ID0gZGF0ZVRpbWVGcm9tRGF0ZShkYXRlKS5zbGljZSgwLCAxNyk7ICAvLyBkcm9wIG1pbGxpcwogICAgICAgIHZhciBvZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgICAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnOwogICAgICAgIHZhciBoaCA9IE1hdGguZmxvb3IoTWF0aC5hYnMob2Zmc2V0KSAvIDYwKTsKICAgICAgICB2YXIgbW0gPSBNYXRoLmFicyhvZmZzZXQpICUgNjA7CiAgICAgICAgcmV0dXJuIGR0ICsgJyBVVEMnICsgc2lnbiArIHBhZFRvKGhoLCAyKSArICc6JyArIHBhZFRvKG1tLCAyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICBmdW5jdGlvbiB0aW1lU3RyaW5nKHRpbWUsIHNob3J0VW5pdCkgewogICAgICAgICAgICB2YXIgdW5pdCA9IHt5OiAneWVhcicsIGQ6ICdkYXknLCBoOiAnaG91cicsIG06ICdtaW51dGUnLAogICAgICAgICAgICAgICAgICAgICAgICBzOiAnc2Vjb25kJ31bc2hvcnRVbml0XTsKICAgICAgICAgICAgdmFyIGVuZCA9IHRpbWUgPT0gMSA/ICcgJyA6ICdzICc7CiAgICAgICAgICAgIHJldHVybiB0aW1lICsgJyAnICsgdW5pdCArIGVuZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY29tcGVuc2F0ZUxlYXBZZWFycyhkYXlzLCB5ZWFycykgewogICAgICAgICAgICAvLyBOb3QgYSBwZXJmZWN0IGFsZ29yaXRobSBidXQgb3VnaHQgdG8gYmUgZW5vdWdoCiAgICAgICAgICAgIHJldHVybiBkYXlzIC0gTWF0aC5mbG9vcih5ZWFycyAvIDQpOwogICAgICAgIH0KICAgICAgICB2YXIgZ2VuZXJhdGVkID0gTWF0aC5yb3VuZCh0aW1lc3RhbXAgLyAxMDAwKTsKICAgICAgICB2YXIgY3VycmVudCA9IE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTsKICAgICAgICB2YXIgZWxhcHNlZCA9IGN1cnJlbnQgLSBnZW5lcmF0ZWQ7CiAgICAgICAgdmFyIHByZWZpeCA9ICcnOwogICAgICAgIGlmIChlbGFwc2VkIDwgMCkgewogICAgICAgICAgICBwcmVmaXggPSAnLSAnOwogICAgICAgICAgICBlbGFwc2VkID0gTWF0aC5hYnMoZWxhcHNlZCk7CiAgICAgICAgfQogICAgICAgIHZhciBzZWNzICA9IGVsYXBzZWQgJSA2MDsKICAgICAgICB2YXIgbWlucyAgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyA2MCkgJSA2MDsKICAgICAgICB2YXIgaG91cnMgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjApKSAlIDI0OwogICAgICAgIHZhciBkYXlzICA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCkpICUgMzY1OwogICAgICAgIHZhciB5ZWFycyA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCozNjUpKTsKICAgICAgICBpZiAoeWVhcnMpIHsKICAgICAgICAgICAgZGF5cyA9IGNvbXBlbnNhdGVMZWFwWWVhcnMoZGF5cywgeWVhcnMpOwogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyh5ZWFycywgJ3knKSArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKTsKICAgICAgICB9IGVsc2UgaWYgKGRheXMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKSArIHRpbWVTdHJpbmcoaG91cnMsICdoJyk7CiAgICAgICAgfSBlbHNlIGlmIChob3VycykgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhob3VycywgJ2gnKSArIHRpbWVTdHJpbmcobWlucywgJ20nKTsKICAgICAgICB9IGVsc2UgaWYgKG1pbnMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcobWlucywgJ20nKSArIHRpbWVTdHJpbmcoc2VjcywgJ3MnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhzZWNzLCAncycpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmcocXVlcnkpIHsKICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgaWYgKCFxdWVyeSkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB2YXIgcGFyYW1zID0gcXVlcnkuc3BsaXQoJyYnKTsKICAgICAgICB2YXIgcGFydHM7CiAgICAgICAgZnVuY3Rpb24gZGVjb2RlKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpdGVtLnJlcGxhY2UoJysnLCAnICcpKTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcmFtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBwYXJ0cyA9IHBhcmFtc1tpXS5zcGxpdCgnPScpOwogICAgICAgICAgICByZXN1bHRbZGVjb2RlKHBhcnRzLnNoaWZ0KCkpXSA9IGRlY29kZShwYXJ0cy5qb2luKCc9JykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBtYXA6IG1hcCwKICAgICAgICBmaWx0ZXI6IGZpbHRlciwKICAgICAgICBhbGw6IGFsbCwKICAgICAgICBhbnk6IGFueSwKICAgICAgICBjb250YWluczogY29udGFpbnMsCiAgICAgICAgbGFzdDogbGFzdCwKICAgICAgICBlc2NhcGU6IGVzY2FwZSwKICAgICAgICB1bmVzY2FwZTogdW5lc2NhcGUsCiAgICAgICAgbm9ybWFsaXplOiBub3JtYWxpemUsCiAgICAgICAgcmVnZXhwRXNjYXBlOiByZWdleHBFc2NhcGUsCiAgICAgICAgTWF0Y2hlcjogTWF0Y2hlciwKICAgICAgICBmb3JtYXRQYXJlbnROYW1lOiBmb3JtYXRQYXJlbnROYW1lLAogICAgICAgIHRpbWVGcm9tRGF0ZTogdGltZUZyb21EYXRlLAogICAgICAgIGRhdGVGcm9tRGF0ZTogZGF0ZUZyb21EYXRlLAogICAgICAgIGRhdGVUaW1lRnJvbURhdGU6IGRhdGVUaW1lRnJvbURhdGUsCiAgICAgICAgZm9ybWF0RWxhcHNlZDogZm9ybWF0RWxhcHNlZCwKICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRTdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZFN0cmluZywKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZywKICAgICAgICBwYXJzZVF1ZXJ5U3RyaW5nOiBwYXJzZVF1ZXJ5U3RyaW5nCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy50ZXN0ZGF0YSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBlbGVtZW50c0J5SWQgPSB7fTsKICAgIHZhciBpZENvdW50ZXIgPSAwOwogICAgdmFyIF9zdGF0aXN0aWNzID0gbnVsbDsKICAgIHZhciBMRVZFTFMgPSBbJ1RSQUNFJywgJ0RFQlVHJywgJ0lORk8nLCAnV0FSTicsICdFUlJPUicsICdGQUlMJ107CiAgICB2YXIgU1RBVFVTRVMgPSBbJ0ZBSUwnLCAnUEFTUycsICdOT1RfUlVOJ107CiAgICB2YXIgS0VZV09SRFMgPSBbJ0tFWVdPUkQnLCAnU0VUVVAnLCAnVEVBUkRPV04nLCAnRk9SJywgJ1ZBUiddOwogICAgZnVuY3Rpb24gYWRkRWxlbWVudChlbGVtKSB7CiAgICAgICAgaWYgKCFlbGVtLmlkKQogICAgICAgICAgICBlbGVtLmlkID0gdW5pcXVlSWQoKTsKICAgICAgICBlbGVtZW50c0J5SWRbZWxlbS5pZF0gPSBlbGVtOwogICAgICAgIHJldHVybiBlbGVtOwogICAgfQogICAgZnVuY3Rpb24gdW5pcXVlSWQoKSB7CiAgICAgICAgaWRDb3VudGVyKys7CiAgICAgICAgcmV0dXJuICdlbGVtZW50LWlkLScgKyBpZENvdW50ZXI7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lcyhzdGF0cykgewogICAgICAgIHZhciBzdGFydE1pbGxpcyA9IHN0YXRzWzFdOwogICAgICAgIHZhciBlbGFwc2VkID0gc3RhdHNbMl07CiAgICAgICAgaWYgKHN0YXJ0TWlsbGlzID09PSBudWxsKQogICAgICAgICAgICByZXR1cm4gW251bGwsIG51bGwsIGVsYXBzZWRdOwogICAgICAgIHJldHVybiBbdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMpLAogICAgICAgICAgICAgICAgdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMgKyBlbGFwc2VkKSwKICAgICAgICAgICAgICAgIGVsYXBzZWRdOwogICAgfQogICAgZnVuY3Rpb24gbWVzc2FnZShlbGVtZW50LCBzdHJpbmdzKSB7CiAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQobW9kZWwuTWVzc2FnZShMRVZFTFNbZWxlbWVudFsxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnRpbWVzdGFtcChlbGVtZW50WzBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncy5nZXQoZWxlbWVudFszXSkpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlU3RhdHVzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIFNUQVRVU0VTW3N0YXRzWzBdXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoaWxkQ3JlYXRvcihwYXJlbnQsIGNoaWxkVHlwZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoZWxlbSwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQoY2hpbGRUeXBlKHBhcmVudCwgZWxlbSwgc3RyaW5ncywgaW5kZXgpKTsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlS2V5d29yZChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIGt3ID0gbW9kZWwuS2V5d29yZCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICB0eXBlOiBLRVlXT1JEU1tlbGVtZW50WzBdXSwKICAgICAgICAgICAgaWQ6ICdrJyArIChpbmRleCArIDEpLAogICAgICAgICAgICBuYW1lOiBzdHJpbmdzLmdldChlbGVtZW50WzFdKSwKICAgICAgICAgICAgbGlibmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFsyXSksCiAgICAgICAgICAgIHRpbWVvdXQ6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pLAogICAgICAgICAgICBhcmdzOiBzdHJpbmdzLmdldChlbGVtZW50WzVdKSwKICAgICAgICAgICAgYXNzaWduOiBzdHJpbmdzLmdldChlbGVtZW50WzZdKSwKICAgICAgICAgICAgdGFnczogc3RyaW5ncy5nZXQoZWxlbWVudFs3XSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbNF0pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzdGF0dXM6IHBhcnNlU3RhdHVzKGVsZW1lbnRbOF0sIHN0cmluZ3MpLAogICAgICAgICAgICB0aW1lczogbW9kZWwuVGltZXModGltZXMoZWxlbWVudFs4XSkpLAogICAgICAgICAgICBpc0NoaWxkcmVuTG9hZGVkOiB0eXBlb2YoZWxlbWVudFs5XSkgIT09ICdudW1iZXInCiAgICAgICAgfSk7CiAgICAgICAgbGF6eVBvcHVsYXRlS2V5d29yZHNGcm9tRmlsZShrdywgZWxlbWVudFs5XSwgc3RyaW5ncyk7CiAgICAgICAga3cucG9wdWxhdGVNZXNzYWdlcyhQb3B1bGF0b3IoZWxlbWVudFsxMF0sIHN0cmluZ3MsIG1lc3NhZ2UpKTsKICAgICAgICByZXR1cm4ga3c7CiAgICB9CiAgICBmdW5jdGlvbiBsYXp5UG9wdWxhdGVLZXl3b3Jkc0Zyb21GaWxlKHBhcmVudCwgbW9kZWxPckluZGV4LCBzdHJpbmdzKSB7CiAgICAgICAgdmFyIG1vZGVsLCBpbmRleCwgcG9wdWxhdG9yOwogICAgICAgIHZhciBjcmVhdG9yID0gY2hpbGRDcmVhdG9yKHBhcmVudCwgY3JlYXRlS2V5d29yZCk7CiAgICAgICAgaWYgKHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkKSB7CiAgICAgICAgICAgIG1vZGVsID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwb3B1bGF0b3IgPSBQb3B1bGF0b3IobW9kZWwsIHN0cmluZ3MsIGNyZWF0b3IpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluZGV4ID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwYXJlbnQuY2hpbGRGaWxlTmFtZSA9IHdpbmRvdy5zZXR0aW5nc1snc3BsaXRMb2dCYXNlJ10gKyAnLScgKyBpbmRleCArICcuanMnOwogICAgICAgICAgICBwb3B1bGF0b3IgPSBTcGxpdExvZ1BvcHVsYXRvcihpbmRleCwgY3JlYXRvcik7CiAgICAgICAgfQogICAgICAgIHBhcmVudC5wb3B1bGF0ZUtleXdvcmRzKHBvcHVsYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiB0YWdzKHRhZ2xpc3QsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gdXRpbC5tYXAodGFnbGlzdCwgc3RyaW5ncy5nZXQpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlVGVzdChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1c0VsZW1lbnQgPSBlbGVtZW50WzVdOwogICAgICAgIHZhciB0ZXN0ID0gbW9kZWwuVGVzdCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICBpZDogJ3QnICsgKGluZGV4ICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzNdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZW91dDogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIGlzQ3JpdGljYWw6IGVsZW1lbnRbMl0sCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoc3RhdHVzRWxlbWVudCksCiAgICAgICAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBtc2cgPSBjcmVhdGVNZXNzYWdlKHN0YXR1c0VsZW1lbnQsIHN0cmluZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbXNnOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKHN0YXR1c0VsZW1lbnQpKSwKICAgICAgICAgICAgdGFnczogdGFncyhlbGVtZW50WzRdLCBzdHJpbmdzKSwKICAgICAgICAgICAgaXNDaGlsZHJlbkxvYWRlZDogdHlwZW9mKGVsZW1lbnRbNl0pICE9PSAnbnVtYmVyJwogICAgICAgIH0pOwogICAgICAgIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUodGVzdCwgZWxlbWVudFs2XSwgc3RyaW5ncyk7CiAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNZXNzYWdlKHN0YXR1c0VsZW1lbnQsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gc3RhdHVzRWxlbWVudC5sZW5ndGggPT0gNCA/IHN0cmluZ3MuZ2V0KHN0YXR1c0VsZW1lbnRbM10pIDogJyc7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVTdWl0ZShwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1c0VsZW1lbnQgPSBlbGVtZW50WzVdOwogICAgICAgIHZhciBzdWl0ZSA9IG1vZGVsLlN1aXRlKHsKICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgICAgIGlkOiAncycgKyAoKGluZGV4IHx8IDApICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBzb3VyY2U6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMV0pLAogICAgICAgICAgICByZWxhdGl2ZVNvdXJjZTogc3RyaW5ncy5nZXQoZWxlbWVudFsyXSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzdGF0dXM6IHBhcnNlU3RhdHVzKHN0YXR1c0VsZW1lbnQpLAogICAgICAgICAgICBtZXNzYWdlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbXNnID0gY3JlYXRlTWVzc2FnZShzdGF0dXNFbGVtZW50LCBzdHJpbmdzKTsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1zZzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhzdGF0dXNFbGVtZW50KSksCiAgICAgICAgICAgIHN0YXRpc3RpY3M6IHN1aXRlU3RhdHModXRpbC5sYXN0KGVsZW1lbnQpKSwKICAgICAgICAgICAgbWV0YWRhdGE6IHBhcnNlTWV0YWRhdGEoZWxlbWVudFs0XSwgc3RyaW5ncykKICAgICAgICB9KTsKICAgICAgICBzdWl0ZS5wb3B1bGF0ZUtleXdvcmRzKFBvcHVsYXRvcihlbGVtZW50WzhdLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZUtleXdvcmQpKSk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyhQb3B1bGF0b3IoZWxlbWVudFs3XSwgc3RyaW5ncywgY2hpbGRDcmVhdG9yKHN1aXRlLCBjcmVhdGVUZXN0KSkpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlU3VpdGVzKFBvcHVsYXRvcihlbGVtZW50WzZdLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZVN1aXRlKSkpOwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTWV0YWRhdGEoZGF0YSwgc3RyaW5ncykgewogICAgICAgIHZhciBtZXRhZGF0YSA9IFtdOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxkYXRhLmxlbmd0aDsgaSs9MikgewogICAgICAgICAgICBtZXRhZGF0YS5wdXNoKFtzdHJpbmdzLmdldChkYXRhW2ldKSwgc3RyaW5ncy5nZXQoZGF0YVtpKzFdKV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWV0YWRhdGE7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG90YWw6IHN0YXRzWzBdLAogICAgICAgICAgICB0b3RhbFBhc3NlZDogc3RhdHNbMV0sCiAgICAgICAgICAgIHRvdGFsRmFpbGVkOiBzdGF0c1swXSAtIHN0YXRzWzFdLAogICAgICAgICAgICBjcml0aWNhbDogc3RhdHNbMl0sCiAgICAgICAgICAgIGNyaXRpY2FsUGFzc2VkOiBzdGF0c1szXSwKICAgICAgICAgICAgY3JpdGljYWxGYWlsZWQ6IHN0YXRzWzJdIC0gc3RhdHNbM10KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gUG9wdWxhdG9yKGl0ZW1zLCBzdHJpbmdzLCBjcmVhdG9yKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbnVtYmVyT2ZJdGVtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY3JlYXRvcjogZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRvcihpdGVtc1tpbmRleF0sIHN0cmluZ3MsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBTcGxpdExvZ1BvcHVsYXRvcihzdHJ1Y3R1cmVJbmRleCwgY3JlYXRvcikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG51bWJlck9mSXRlbXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3dbJ2tleXdvcmRzJytzdHJ1Y3R1cmVJbmRleF0ubGVuZ3RoOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjcmVhdG9yOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdG9yKHdpbmRvd1sna2V5d29yZHMnK3N0cnVjdHVyZUluZGV4XVtpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3dbJ3N0cmluZ3MnK3N0cnVjdHVyZUluZGV4XSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3VpdGUoKSB7CiAgICAgICAgdmFyIGVsZW0gPSB3aW5kb3cub3V0cHV0LnN1aXRlOwogICAgICAgIGlmIChlbGVtZW50c0J5SWRbZWxlbS5pZF0pCiAgICAgICAgICAgIHJldHVybiBlbGVtOwogICAgICAgIHZhciByb290ID0gYWRkRWxlbWVudChjcmVhdGVTdWl0ZShudWxsLCBlbGVtLCBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKSk7CiAgICAgICAgd2luZG93Lm91dHB1dC5zdWl0ZSA9IHJvb3Q7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kTG9hZGVkKGlkKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnRzQnlJZFtpZF07CiAgICB9CiAgICBmdW5jdGlvbiBlbnN1cmVMb2FkZWQoaWQsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGlkcyA9IGlkLnNwbGl0KCctJyk7CiAgICAgICAgdmFyIHJvb3QgPSBzdWl0ZSgpOwogICAgICAgIGlkcy5zaGlmdCgpOwogICAgICAgIGxvYWRJdGVtcyhpZHMsIHJvb3QsIFtyb290LmlkXSwgY2FsbGJhY2spOwogICAgfQogICAgZnVuY3Rpb24gbG9hZEl0ZW1zKGlkcywgY3VycmVudCwgcmVzdWx0LCBjYWxsYmFjaykgewogICAgICAgIGlmICghaWRzLmxlbmd0aCkgewogICAgICAgICAgICBjYWxsYmFjayhyZXN1bHQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQuY2FsbFdoZW5DaGlsZHJlblJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGlkID0gaWRzLnNoaWZ0KCk7CiAgICAgICAgICAgIHZhciB0eXBlID0gaWRbMF07CiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGlkLnN1YnN0cmluZygxKSkgLSAxOwogICAgICAgICAgICB2YXIgaXRlbSA9IHNlbGVjdEZyb20oY3VycmVudCwgdHlwZSwgaW5kZXgpOwogICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0uaWQpOwogICAgICAgICAgICBlbHNlICAgIC8vIEludmFsaWQgaWQuIFNob3VsZCB0aGlzIGJlIHJlcG9ydGVkIHNvbWV3aGVyZT8KICAgICAgICAgICAgICAgIGlkcyA9IFtdOwogICAgICAgICAgICBsb2FkSXRlbXMoaWRzLCBpdGVtLCByZXN1bHQsIGNhbGxiYWNrKTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlbGVjdEZyb20oZWxlbWVudCwgdHlwZSwgaW5kZXgpIHsKICAgICAgICBpZiAodHlwZSA9PT0gJ2snKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmtleXdvcmRzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3QnKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRlc3RzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnN1aXRlcygpW2luZGV4XTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBlcnJvckl0ZXJhdG9yKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlKHdpbmRvdy5vdXRwdXQuZXJyb3JzLnNoaWZ0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaGFzTmV4dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5vdXRwdXQuZXJyb3JzLmxlbmd0aCA+IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdGlzdGljcygpIHsKICAgICAgICBpZiAoIV9zdGF0aXN0aWNzKSB7CiAgICAgICAgICAgIHZhciBzdGF0RGF0YSA9IHdpbmRvdy5vdXRwdXQuc3RhdHM7CiAgICAgICAgICAgIF9zdGF0aXN0aWNzID0gc3RhdHMuU3RhdGlzdGljcyhzdGF0RGF0YVswXSwgc3RhdERhdGFbMV0sIHN0YXREYXRhWzJdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9zdGF0aXN0aWNzOwogICAgfQogICAgZnVuY3Rpb24gU3RyaW5nU3RvcmUoc3RyaW5ncykgewogICAgICAgIGZ1bmN0aW9uIGdldFRleHQoaWQpIHsKICAgICAgICAgICAgdmFyIHRleHQgPSBzdHJpbmdzW2lkXTsKICAgICAgICAgICAgaWYgKCF0ZXh0KQogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICBpZiAodGV4dFswXSA9PSAnKicpCiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgIHZhciBleHRyYWN0ZWQgPSBleHRyYWN0KHRleHQpOwogICAgICAgICAgICBzdHJpbmdzW2lkXSA9ICcqJyArIGV4dHJhY3RlZDsKICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RlZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZXh0cmFjdCh0ZXh0KSB7CiAgICAgICAgICAgIHZhciBkZWNvZGVkID0gSlhHLlV0aWwuQmFzZTY0LmRlY29kZUFzQXJyYXkodGV4dCk7CiAgICAgICAgICAgIHZhciBleHRyYWN0ZWQgPSAobmV3IEpYRy5VdGlsLlVuemlwKGRlY29kZWQpKS51bnppcCgpWzBdWzBdOwogICAgICAgICAgICByZXR1cm4gSlhHLlV0aWwuVVRGOC5kZWNvZGUoZXh0cmFjdGVkKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZ2V0KGlkKSB7CiAgICAgICAgICAgIGlmIChpZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIHJldHVybiBnZXRUZXh0KGlkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHtnZXQ6IGdldH07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIHN1aXRlOiBzdWl0ZSwKICAgICAgICBlcnJvckl0ZXJhdG9yOiBlcnJvckl0ZXJhdG9yLAogICAgICAgIGZpbmRMb2FkZWQ6IGZpbmRMb2FkZWQsCiAgICAgICAgZW5zdXJlTG9hZGVkOiBlbnN1cmVMb2FkZWQsCiAgICAgICAgc3RhdGlzdGljczogc3RhdGlzdGljcywKICAgICAgICBTdHJpbmdTdG9yZTogU3RyaW5nU3RvcmUsICAvLyBleHBvc2VkIGZvciB0ZXN0cwogICAgICAgIExFVkVMUzogTEVWRUxTCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmZ1bmN0aW9uIHJlbW92ZUphdmFTY3JpcHREaXNhYmxlZFdhcm5pbmcoKSB7CiAgICAvLyBOb3QgdXNpbmcgalF1ZXJ5IGhlcmUgZm9yIG1heGltdW0gc3BlZWQKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqYXZhc2NyaXB0LWRpc2FibGVkJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKfQpmdW5jdGlvbiBhZGRKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKGVycm9yKSB7CiAgICBpZiAod2luZG93LmNvbnNvbGUpCiAgICAgICAgY29uc29sZS5lcnJvcignT3BlbmluZyBmYWlsZWQ6ICcgKyBlcnJvci5uYW1lICsgJzogJyArIGVycm9yLm1lc3NhZ2UpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2phdmFzY3JpcHQtZGlzYWJsZWQnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKfQpmdW5jdGlvbiBpbml0TGF5b3V0KHN1aXRlTmFtZSwgdHlwZSkgewogICAgcGFyc2VUZW1wbGF0ZXMoKTsKICAgIHNldFRpdGxlKHN1aXRlTmFtZSwgdHlwZSk7CiAgICBhZGRIZWFkZXIoKTsKICAgIGFkZFJlcG9ydE9yTG9nTGluayh0eXBlKTsKfQpmdW5jdGlvbiBwYXJzZVRlbXBsYXRlcygpIHsKICAgICQoJ3NjcmlwdFt0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiXScpLm1hcChmdW5jdGlvbiAoaWR4LCBlbGVtKSB7CiAgICAgICAgJC50ZW1wbGF0ZShlbGVtLmlkLCBlbGVtLnRleHQpOwogICAgfSk7Cn0KZnVuY3Rpb24gdGVzdE9yVGFzayh0ZXh0KSB7CiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC97KC4qKX0vLCBmdW5jdGlvbiAobWF0Y2gsIGdyb3VwLCBvZmZzZXQsIHN0cmluZykgewogICAgICAgIGlmICghd2luZG93LnNldHRpbmdzLnJwYSkKICAgICAgICAgICAgcmV0dXJuIGdyb3VwOwogICAgICAgIHJldHVybiB7J1RFU1QnOiAnVEFTSycsICdUZXN0JzogJ1Rhc2snLCAndGVzdCc6ICd0YXNrJ31bZ3JvdXBdOwogICAgfSk7Cn0KZnVuY3Rpb24gc2V0VGl0bGUoc3VpdGVOYW1lLCB0eXBlKSB7CiAgICB2YXIgZ2l2ZW5UaXRsZSA9IHdpbmRvdy5zZXR0aW5ncy50aXRsZTsKICAgIHZhciB0aXRsZSA9IGdpdmVuVGl0bGUgPyBnaXZlblRpdGxlIDogc3VpdGVOYW1lICsgIiAiICsgdHlwZTsKICAgIGRvY3VtZW50LnRpdGxlID0gdXRpbC51bmVzY2FwZSh0aXRsZSk7Cn0KZnVuY3Rpb24gYWRkSGVhZGVyKCkgewogICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwudGltZXN0YW1wKHdpbmRvdy5vdXRwdXQuZ2VuZXJhdGVkKTsKICAgICQudG1wbCgnPGgxPiR7dGl0bGV9PC9oMT4nICsKICAgICAgICAgICAnPGRpdiBpZD0iZ2VuZXJhdGVkIj4nICsKICAgICAgICAgICAgICc8c3Bhbj5HZW5lcmF0ZWQ8YnI+JHtnZW5lcmF0ZWR9PC9zcGFuPjxicj4nICsKICAgICAgICAgICAgICc8c3BhbiBpZD0iZ2VuZXJhdGVkLWFnbyI+JHthZ299IGFnbzwvc3Bhbj4nICsKICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgJzxkaXYgaWQ9InRvcC1yaWdodC1oZWFkZXIiPicgKwogICAgICAgICAgICAgJzxkaXYgaWQ9InJlcG9ydC1vci1sb2ctbGluayI+PGEgaHJlZj0iIyI+PC9hPjwvZGl2PicgKwogICAgICAgICAgICc8L2Rpdj4nLCB7CiAgICAgICAgZ2VuZXJhdGVkOiB1dGlsLmNyZWF0ZUdlbmVyYXRlZFN0cmluZyhnZW5lcmF0ZWQpLAogICAgICAgIGFnbzogdXRpbC5jcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmcoZ2VuZXJhdGVkKSwKICAgICAgICB0aXRsZTogZG9jdW1lbnQudGl0bGUKICAgIH0pLmFwcGVuZFRvKCQoJyNoZWFkZXInKSk7Cn0KZnVuY3Rpb24gYWRkUmVwb3J0T3JMb2dMaW5rKG15VHlwZSkgewogICAgdmFyIHVybDsKICAgIHZhciB0ZXh0OwogICAgdmFyIGNvbnRhaW5lciA9ICQoJyNyZXBvcnQtb3ItbG9nLWxpbmsnKTsKICAgIGlmIChteVR5cGUgPT0gJ1JlcG9ydCcpIHsKICAgICAgICB1cmwgPSB3aW5kb3cuc2V0dGluZ3MubG9nVVJMOwogICAgICAgIHRleHQgPSAnTE9HJzsKICAgIH0gZWxzZSB7CiAgICAgICAgdXJsID0gd2luZG93LnNldHRpbmdzLnJlcG9ydFVSTDsKICAgICAgICB0ZXh0ID0gJ1JFUE9SVCc7CiAgICB9CiAgICBpZiAodXJsKSB7CiAgICAgICAgY29udGFpbmVyLmZpbmQoJ2EnKS5hdHRyKCdocmVmJywgdXJsKTsKICAgICAgICBjb250YWluZXIuZmluZCgnYScpLnRleHQodGV4dCk7CiAgICB9IGVsc2UgewogICAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTsKICAgIH0KfQpmdW5jdGlvbiBhZGRTdGF0aXN0aWNzKCkgewogICAgdmFyIHN0YXRIZWFkZXJzID0KICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+VG90YWw8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5QYXNzPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+RmFpbDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPkVsYXBzZWQ8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+UGFzcyAvIEZhaWw8L3RoPic7CiAgICB2YXIgc3RhdFRhYmxlID0KICAgICAgICAnPGgyPntUZXN0fSBTdGF0aXN0aWNzPC9oMj4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0idG90YWwtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlRvdGFsIFN0YXRpc3RpY3M8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPicgKwogICAgICAgICc8dGFibGUgY2xhc3M9InN0YXRpc3RpY3MiIGlkPSJ0YWctc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgVGFnPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0ic3VpdGUtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgU3VpdGU8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPic7CiAgICAkKHRlc3RPclRhc2soc3RhdFRhYmxlKSkuYXBwZW5kVG8oJyNzdGF0aXN0aWNzLWNvbnRhaW5lcicpOwogICAgdXRpbC5tYXAoWyd0b3RhbCcsICd0YWcnLCAnc3VpdGUnXSwgYWRkU3RhdFRhYmxlKTsKICAgIGFkZFRvb2x0aXBzVG9FbGFwc2VkVGltZXMoKTsKICAgIGVuYWJsZVN0YXRpc3RpY3NTb3J0ZXIoKTsKfQpmdW5jdGlvbiBhZGRUb29sdGlwc1RvRWxhcHNlZFRpbWVzKCkgewogICAgJCgnLnN0YXRzLWNvbC1lbGFwc2VkJykuYXR0cigndGl0bGUnLAogICAgICAgIHRlc3RPclRhc2soJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZXNlIHt0ZXN0fXMuICcpICsKICAgICAgICAnRXhjbHVkZXMgc3VpdGUgc2V0dXBzIGFuZCB0ZWFyZG93bnMuJyk7CiAgICAkKCcjc3VpdGUtc3RhdHMnKS5maW5kKCcuc3RhdHMtY29sLWVsYXBzZWQnKS5hdHRyKCd0aXRsZScsCiAgICAgICAgJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoaXMgc3VpdGUuJyk7Cn0KZnVuY3Rpb24gZW5hYmxlU3RhdGlzdGljc1NvcnRlcigpIHsKICAgICQudGFibGVzb3J0ZXIuYWRkUGFyc2VyKHsKICAgICAgICBpZDogJ3N0YXROYW1lJywKICAgICAgICB0eXBlOiAnbnVtZXJpYycsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZywgdGFibGUsIGNlbGwsIGNlbGxJbmRleCkgewogICAgICAgICAgICAvLyBSb3dzIGhhdmUgY2xhc3MgaW4gZm9ybWF0ICdyb3ctPGluZGV4PicuCiAgICAgICAgICAgIHZhciBpbmRleCA9ICQoY2VsbCkucGFyZW50KCkuYXR0cignY2xhc3MnKS5zdWJzdHJpbmcoNCk7CiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbmRleCk7CiAgICAgICAgfQogICAgfSk7CiAgICAkKCIuc3RhdGlzdGljcyIpLnRhYmxlc29ydGVyKHsKICAgICAgICBzb3J0SW5pdGlhbE9yZGVyOiAnZGVzYycsCiAgICAgICAgaGVhZGVyczogezA6IHtzb3J0ZXI6J3N0YXROYW1lJywgc29ydEluaXRpYWxPcmRlcjogJ2FzYyd9LAogICAgICAgICAgICAgICAgICA1OiB7c29ydGVyOiBmYWxzZX19CiAgICB9KTsKfQpmdW5jdGlvbiBhZGRTdGF0VGFibGUodGFibGVOYW1lKSB7CiAgICB2YXIgc3RhdHMgPSB3aW5kb3cudGVzdGRhdGEuc3RhdGlzdGljcygpW3RhYmxlTmFtZV07CiAgICBpZiAodGFibGVOYW1lID09ICd0YWcnICYmIHN0YXRzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgcmVuZGVyTm9UYWdTdGF0VGFibGUoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmVuZGVyU3RhdFRhYmxlKHRhYmxlTmFtZSwgc3RhdHMpOwogICAgfQp9CmZ1bmN0aW9uIHJlbmRlck5vVGFnU3RhdFRhYmxlKCkgewogICAgJCgnPHRib2R5Pjx0ciBjbGFzcz0icm93LTAiPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5ObyBUYWdzPC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZWxhcHNlZCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZ3JhcGgiPicgKwogICAgICAgICAgJzxkaXYgY2xhc3M9ImVtcHR5LWdyYXBoIj48L2Rpdj4nICsKICAgICAgICAnPC90ZD4nICsKICAgICAgJzwvdHI+PC90Ym9keT4nKS5hcHBlbmRUbygnI3RhZy1zdGF0cycpOwp9CmZ1bmN0aW9uIHJlbmRlclN0YXRUYWJsZSh0YWJsZU5hbWUsIHN0YXRzKSB7CiAgICB2YXIgdGVtcGxhdGUgPSB0YWJsZU5hbWUgKyAnU3RhdGlzdGljc1Jvd1RlbXBsYXRlJzsKICAgIHZhciB0Ym9keSA9ICQoJzx0Ym9keT48L3Rib2R5PicpOwogICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0YXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgJC50bXBsKHRlbXBsYXRlLCBzdGF0c1tpXSwge2luZGV4OiBpfSkuYXBwZW5kVG8odGJvZHkpOwogICAgfQogICAgdGJvZHkuYXBwZW5kVG8oJyMnICsgdGFibGVOYW1lICsgJy1zdGF0cycpOwp9CiQudGVtcGxhdGUoJ3N0YXRDb2x1bW5zVGVtcGxhdGUnLAogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7dG90YWx9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke3Bhc3N9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke2ZhaWx9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1lbGFwc2VkIj4ke2VsYXBzZWR9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+JyArCiAgICAgICd7e2lmIHRvdGFsfX0nICsKICAgICAgJzxkaXYgY2xhc3M9ImdyYXBoIj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0icGFzcy1iYXIiIHN0eWxlPSJ3aWR0aDogJHtwYXNzV2lkdGh9JSIgdGl0bGU9IiR7cGFzc1BlcmNlbnR9JSI+PC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9ImZhaWwtYmFyIiBzdHlsZT0id2lkdGg6ICR7ZmFpbFdpZHRofSUiIHRpdGxlPSIke2ZhaWxQZXJjZW50fSUiPjwvZGl2PicgKwogICAgICAnPC9kaXY+JyArCiAgICAgICd7e2Vsc2V9fScgKwogICAgICAnPGRpdiBjbGFzcz0iZW1wdHktZ3JhcGgiPjwvZGl2PicgKwogICAgICAne3svaWZ9fScgKwogICAgJzwvdGQ+JwopOwokLnRlbXBsYXRlKCdzdWl0ZVN0YXR1c01lc3NhZ2VUZW1wbGF0ZScsCiAgICAnJHtjcml0aWNhbH0gY3JpdGljYWwge3s9IHRlc3RPclRhc2soInt0ZXN0fSIpfX0sICcgKwogICAgJyR7Y3JpdGljYWxQYXNzZWR9IHBhc3NlZCwgJyArCiAgICAnPHNwYW4gY2xhc3M9Int7aWYgY3JpdGljYWxGYWlsZWR9fWZhaWx7e2Vsc2V9fXBhc3N7ey9pZn19Ij4ke2NyaXRpY2FsRmFpbGVkfSBmYWlsZWQ8L3NwYW4+PGJyPicgKwogICAgJyR7dG90YWx9IHt7PSB0ZXN0T3JUYXNrKCJ7dGVzdH0iKX19IHRvdGFsLCAnICsKICAgICcke3RvdGFsUGFzc2VkfSBwYXNzZWQsICcgKwogICAgJzxzcGFuIGNsYXNzPSJ7e2lmIHRvdGFsRmFpbGVkfX1mYWlse3tlbHNlfX1wYXNze3svaWZ9fSI+JHt0b3RhbEZhaWxlZH0gZmFpbGVkPC9zcGFuPicKKTsKLy8gRm9yIGNvbXBsZXRlIGNyb3NzLWJyb3dzZXIgZXhwZXJpZW5jZS4uCi8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX29yZGVyLmh0bWwKZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGV2ZW50KSB7CiAgICB2YXIgZXZlbnQgPSBldmVudCB8fCB3aW5kb3cuZXZlbnQ7CiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKfQo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpzdG9yYWdlID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHByZWZpeCA9ICdyb2JvdC1mcmFtZXdvcmstJzsKICAgIHZhciBzdG9yYWdlOwogICAgZnVuY3Rpb24gaW5pdCh1c2VyKSB7CiAgICAgICAgcHJlZml4ICs9IHVzZXIgKyAnLSc7CiAgICAgICAgc3RvcmFnZSA9IGdldFN0b3JhZ2UoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFN0b3JhZ2UoKSB7CiAgICAgICAgLy8gVXNlIGxvY2FsU3RvcmFnZSBpZiBpdCdzIGFjY2Vzc2libGUsIG5vcm1hbCBvYmplY3Qgb3RoZXJ3aXNlLgogICAgICAgIC8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExMjE0NDA0CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocHJlZml4LCBwcmVmaXgpOwogICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShwcmVmaXgpOwogICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlOwogICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0KG5hbWUsIGRlZmF1bHRWYWx1ZSkgewogICAgICAgIHZhciB2YWx1ZSA9IHN0b3JhZ2VbcHJlZml4ICsgbmFtZV07CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgZnVuY3Rpb24gc2V0KG5hbWUsIHZhbHVlKSB7CiAgICAgICAgc3RvcmFnZVtwcmVmaXggKyBuYW1lXSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIHtpbml0OiBpbml0LCBnZXQ6IGdldCwgc2V0OiBzZXR9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXQgPSB7fTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3VpdGUiXSA9IFsxLDIsMywwLFtdLFsxLDAsNTUzOV0sW10sW1s0LDAsMSwwLFtdLFsxLDExNSw0OTMxXSxbXV1dLFtdLFsxLDEsMSwxXV07Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN0cmluZ3MiXSA9IFtdOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJzdHJpbmdzIl0gPSB3aW5kb3cub3V0cHV0WyJzdHJpbmdzIl0uY29uY2F0KFsiKiIsIipKdXB5dGVyIiwiKi9ob21lL2RhdGFrdXJyZS9Xb3JrL3JvYm90a2VybmVsL2V4YW1wbGVzIiwiKi4uLy4uLy4uLy4uL2hvbWUvZGF0YWt1cnJlL1dvcmsvcm9ib3RrZXJuZWwvZXhhbXBsZXMiLCIqU2hvdyB0aGUgbmV3IFJvYm90IEZyYW1ld29yayBsb2dvIl0pOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJzdGF0cyJdID0gW1t7ImVsYXBzZWQiOiIwMDowMDowNSIsImZhaWwiOjAsImxhYmVsIjoiQ3JpdGljYWwgVGVzdHMiLCJwYXNzIjoxfSx7ImVsYXBzZWQiOiIwMDowMDowNSIsImZhaWwiOjAsImxhYmVsIjoiQWxsIFRlc3RzIiwicGFzcyI6MX1dLFtdLFt7ImVsYXBzZWQiOiIwMDowMDowNiIsImZhaWwiOjAsImlkIjoiczEiLCJsYWJlbCI6Ikp1cHl0ZXIiLCJuYW1lIjoiSnVweXRlciIsInBhc3MiOjF9XV07Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbImJhc2VNaWxsaXMiXSA9IDE1NDY2Njg3NzI0NTU7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbImdlbmVyYXRlZCJdID0gNTU2MDsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LnNldHRpbmdzID0geyJiYWNrZ3JvdW5kIjp7ImZhaWwiOiIjZjY2Iiwibm9uQ3JpdGljYWxGYWlsIjoiIzllOSIsInBhc3MiOiIjOWU5In0sImxvZ1VSTCI6bnVsbCwicnBhIjpmYWxzZSwidGl0bGUiOiIifTsKPC9zY3JpcHQ+Cjx0aXRsZT48L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8ZGl2IGlkPSJqYXZhc2NyaXB0LWRpc2FibGVkIj4KICA8aDE+T3BlbmluZyBSb2JvdCBGcmFtZXdvcmsgcmVwb3J0IGZhaWxlZDwvaDE+CiAgPHVsPgogICAgPGxpPlZlcmlmeSB0aGF0IHlvdSBoYXZlIDxiPkphdmFTY3JpcHQgZW5hYmxlZDwvYj4gaW4geW91ciBicm93c2VyLjwvbGk+CiAgICA8bGk+TWFrZSBzdXJlIHlvdSBhcmUgdXNpbmcgYSA8Yj5tb2Rlcm4gZW5vdWdoIGJyb3dzZXI8L2I+LiBJZiB1c2luZyBJbnRlcm5ldCBFeHBsb3JlciwgdmVyc2lvbiA4IG9yIG5ld2VyIGlzIHJlcXVpcmVkLjwvbGk+CiAgICA8bGk+Q2hlY2sgYXJlIHRoZXJlIG1lc3NhZ2VzIGluIHlvdXIgYnJvd3NlcidzIDxiPkphdmFTY3JpcHQgZXJyb3IgbG9nPC9iPi4gUGxlYXNlIHJlcG9ydCB0aGUgcHJvYmxlbSBpZiB5b3Ugc3VzcGVjdCB5b3UgaGF2ZSBlbmNvdW50ZXJlZCBhIGJ1Zy48L2xpPgogIDwvdWw+CjwvZGl2Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+cmVtb3ZlSmF2YVNjcmlwdERpc2FibGVkV2FybmluZygpOzwvc2NyaXB0PgoKPGRpdiBpZD0iaGVhZGVyIj48L2Rpdj4KPGRpdiBpZD0ic3RhdGlzdGljcy1jb250YWluZXIiPjwvZGl2Pgo8ZGl2IGlkPSJ0ZXN0LWRldGFpbHMtY29udGFpbmVyIj48L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgewogICAgdHJ5IHsKICAgICAgICB2YXIgdG9wc3VpdGUgPSB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgYWRkSmF2YVNjcmlwdERpc2FibGVkV2FybmluZyhlcnJvcik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgd2luZG93LnByZXZMb2NhdGlvbkhhc2ggPSAnJzsKICAgIHNldEJhY2tncm91bmQodG9wc3VpdGUpOwogICAgaW5pdExheW91dCh0b3BzdWl0ZS5uYW1lLCAnUmVwb3J0Jyk7CiAgICBzdG9yYWdlLmluaXQoJ3JlcG9ydCcpOwogICAgYWRkU3VtbWFyeSh0b3BzdWl0ZSk7CiAgICBhZGRTdGF0aXN0aWNzKCk7CiAgICBhZGREZXRhaWxzKCk7CiAgICB3aW5kb3cub25oYXNoY2hhbmdlID0gc2hvd0RldGFpbHNCeUhhc2g7Cn0pOwoKZnVuY3Rpb24gc2V0QmFja2dyb3VuZCh0b3BzdWl0ZSkgewogICAgdmFyIGNvbG9yOwogICAgaWYgKHRvcHN1aXRlLmNyaXRpY2FsRmFpbGVkKQogICAgICAgIGNvbG9yID0gd2luZG93LnNldHRpbmdzLmJhY2tncm91bmQuZmFpbDsKICAgIGVsc2UgaWYgKHRvcHN1aXRlLnRvdGFsRmFpbGVkKQogICAgICAgIGNvbG9yID0gd2luZG93LnNldHRpbmdzLmJhY2tncm91bmQubm9uQ3JpdGljYWxGYWlsOwogICAgZWxzZQogICAgICAgIGNvbG9yID0gd2luZG93LnNldHRpbmdzLmJhY2tncm91bmQucGFzczsKICAgICQoJ2JvZHknKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCBjb2xvcik7Cn0KCmZ1bmN0aW9uIGFkZFN1bW1hcnkodG9wc3VpdGUpIHsKICAgIHZhciBvcHRzID0ge2xvZ1VSTDogd2luZG93LnNldHRpbmdzLmxvZ1VSTH07CiAgICAkLnRtcGwoJ3N1bW1hcnlUYWJsZVRlbXBsYXRlJywgdG9wc3VpdGUsIG9wdHMpLmluc2VydEFmdGVyKCQoJyNoZWFkZXInKSk7Cn0KCmZ1bmN0aW9uIGFkZERldGFpbHMoKSB7CiAgICBhZGRDdXN0b21Tb3J0ZXJzRm9yRGV0YWlscygpOwogICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoKQogICAgICAgIHNob3dEZXRhaWxzQnlIYXNoKCk7CiAgICBlbHNlCiAgICAgICAgcmVuZGVyVG90YWxTZWxlY3RvcigpOwp9CgpmdW5jdGlvbiBhZGRDdXN0b21Tb3J0ZXJzRm9yRGV0YWlscygpIHsKICAgICQudGFibGVzb3J0ZXIuYWRkUGFyc2VyKHsKICAgICAgICBpZDogJ2NyaXRpY2FsaXR5JywKICAgICAgICB0eXBlOiAnbnVtZXJpYycsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMgPT09ICd5ZXMnID8gMCA6IDE7CiAgICAgICAgfQogICAgfSk7CiAgICAkLnRhYmxlc29ydGVyLmFkZFBhcnNlcih7CiAgICAgICAgaWQ6ICd0aW1lcycsCiAgICAgICAgdHlwZTogJ3RleHQnLAogICAgICAgIGlzOiBmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIGRvIG5vdCBhdXRvLWRldGVjdAogICAgICAgIH0sCiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIHJldHVybiBzLnN1YnN0cmluZygwLCAyMSk7ICAvLyByZXR1cm4gb25seSBzdGFydCB0aW1lCiAgICAgICAgfQogICAgfSk7Cn0KCmZ1bmN0aW9uIHNob3dEZXRhaWxzQnlIYXNoKCkgewogICAgLy8gQ2Fubm90IHVzZSB3aW5kb3cubG9jYXRpb24uaGFzaCBiZWNhdXNlIEZpcmVmb3ggaW5jb3JyZWN0bHkgZGVjb2RlcyBpdDoKICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTcwMzU1Mi9lbmNvZGluZy1vZi13aW5kb3ctbG9jYXRpb24taGFzaAogICAgdmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnIycpLnNsaWNlKDEpLmpvaW4oJyMnKTsKICAgIGlmICghaGFzaCB8fCBoYXNoID09IHdpbmRvdy5wcmV2TG9jYXRpb25IYXNoKQogICAgICAgIHJldHVybjsKICAgIHZhciBwYXJ0cyA9IGhhc2guc3BsaXQoJz8nKTsKICAgIHZhciBuYW1lID0gcGFydHMuc2hpZnQoKTsKICAgIHZhciBxdWVyeSA9IHBhcnRzLmpvaW4oJz8nKTsKICAgIGlmIChuYW1lID09ICdzZWFyY2gnKSB7CiAgICAgICAgdmFyIHBhcmFtcyA9IHV0aWwucGFyc2VRdWVyeVN0cmluZyhxdWVyeSk7CiAgICAgICAgc2VhcmNoRXhlY3V0ZWQocGFyYW1zLnN1aXRlIHx8ICcnLCBwYXJhbXMudGVzdCB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuaW5jbHVkZSB8fCAnJywgcGFyYW1zLmV4Y2x1ZGUgfHwgJycpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHF1ZXJ5ID0gZGVjb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KTsKICAgIHZhciBhY3Rpb24gPSB7J3RvdGFscyc6IHRvdGFsRGV0YWlsU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICd0YWdzJzogICB0YWdEZXRhaWxTZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgJ3N1aXRlcyc6IHN1aXRlRGV0YWlsU2VsZWN0ZWR9W25hbWVdOwogICAgaWYgKGFjdGlvbikKICAgICAgICBhY3Rpb24ocXVlcnkpOwp9CgpmdW5jdGlvbiB0b3RhbERldGFpbFNlbGVjdGVkKG5hbWUpIHsKICAgIHJlbmRlclRvdGFsU2VsZWN0b3IobmFtZSk7CiAgICBpZiAobmFtZSkgewogICAgICAgIHJlbmRlclRvdGFsRGV0YWlscyhuYW1lKTsKICAgICAgICB2YXIgdGl0bGUgPSBuYW1lID09ICdjcml0aWNhbCcgPyAnQ3JpdGljYWwge1Rlc3R9cycgOiAnQWxsIHtUZXN0fXMnCiAgICAgICAgdXBkYXRlUHJpbnRTZWxlY3Rvcih0ZXN0T3JUYXNrKHRpdGxlKSk7CiAgICB9CiAgICBzY3JvbGxUb1NlbGVjdG9yKCd0b3RhbHMnLCBuYW1lKTsKfQoKZnVuY3Rpb24gcmVuZGVyVG90YWxTZWxlY3RvcihuYW1lKSB7CiAgICB2YXIgYXJncyA9IHtsaW5rVGFyZ2V0OiAobmFtZSkgPyAndG90YWxzPycrbmFtZSA6ICd0b3RhbHMnLAogICAgICAgICAgICAgICAgdG90YWxUYWJTdGF0dXM6ICdkZXRhaWwtdGFiLXNlbGVjdGVkJ307CiAgICByZW5kZXJTZWxlY3RvcihhcmdzLCAndG90YWxEZXRhaWxzU2VsZWN0b3JUZW1wbGF0ZScsIHtzZWxlY3RlZDogbmFtZX0pOwp9CgpmdW5jdGlvbiByZW5kZXJUb3RhbERldGFpbHMobmFtZSkgewogICAgdmFyIGluZGV4ID0gKG5hbWUgPT0gJ2NyaXRpY2FsJykgPyAwIDogMTsKICAgIHZhciBzdGF0ID0gd2luZG93LnRlc3RkYXRhLnN0YXRpc3RpY3MoKS50b3RhbFtpbmRleF07CiAgICB2YXIgdGVzdHMgPSBnZXRUb3RhbFRlc3RzKG5hbWUpOwogICAgc3RhdC50b3RhbFRpbWUgPSBjYWxjdWxhdGVUb3RhbFRpbWUodGVzdHMpOwogICAgJC50bXBsKCd0YWdPclRvdGFsRGV0YWlsc1RlbXBsYXRlJywgc3RhdCkuYXBwZW5kVG8oJyNkZXRhaWxzLWhlYWRlcicpOwogICAgZHJhd1Rlc3REZXRhaWxzVGFibGUodGVzdHMsIHRydWUpOwp9CgpmdW5jdGlvbiB1cGRhdGVQcmludFNlbGVjdG9yKG5hbWUsIGluZm8pIHsKICAgIGlmIChpbmZvKQogICAgICAgIG5hbWUgKz0gJyAoJyArIGluZm8gKyAnKSc7CiAgICAkKCcjcHJpbnQtc2VsZWN0b3InKS5odG1sKG5hbWUpOwp9CgpmdW5jdGlvbiB0YWdEZXRhaWxTZWxlY3RlZChuYW1lKSB7CiAgICByZW5kZXJUYWdTZWxlY3RvcihuYW1lKTsKICAgIGlmIChuYW1lKSB7CiAgICAgICAgdmFyIHRhZyA9IGZpbmRUYWcobmFtZSk7CiAgICAgICAgaWYgKHRhZykgewogICAgICAgICAgICByZW5kZXJUYWdEZXRhaWxzKHRhZyk7CiAgICAgICAgICAgIHVwZGF0ZVByaW50U2VsZWN0b3IobmFtZSwgdGFnLmluZm8pOwogICAgICAgIH0KICAgIH0KICAgIHNjcm9sbFRvU2VsZWN0b3IoJ3RhZ3MnLCBuYW1lKTsKfQoKZnVuY3Rpb24gZmluZFRhZyhuYW1lKSB7CiAgICB2YXIgdGFncyA9IHdpbmRvdy50ZXN0ZGF0YS5zdGF0aXN0aWNzKCkudGFnOwogICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRhZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBpZiAodGFnc1tpXS5sYWJlbCA9PSBuYW1lKQogICAgICAgICAgICByZXR1cm4gdGFnc1tpXTsKICAgIH0KICAgIHJldHVybiBudWxsOwp9CgpmdW5jdGlvbiByZW5kZXJUYWdTZWxlY3RvcihuYW1lKSB7CiAgICB2YXIgYXJncyA9IHtsaW5rVGFyZ2V0OiAobmFtZSkgPyAndGFncz8nK25hbWUgOiAndGFncycsCiAgICAgICAgICAgICAgICB0YWdUYWJTdGF0dXM6ICdkZXRhaWwtdGFiLXNlbGVjdGVkJ307CiAgICB2YXIgc3RhdHMgPSB7dGFnczogd2luZG93LnRlc3RkYXRhLnN0YXRpc3RpY3MoKS50YWcsIHNlbGVjdGVkOiBuYW1lfTsKICAgIHJlbmRlclNlbGVjdG9yKGFyZ3MsICd0YWdEZXRhaWxzU2VsZWN0b3JUZW1wbGF0ZScsIHN0YXRzKTsKfQoKZnVuY3Rpb24gcmVuZGVyVGFnRGV0YWlscyh0YWcpIHsKICAgIHZhciB0ZXN0cyA9IGdldFRlc3RzSGF2aW5nVGFnKHRhZyk7CiAgICB0YWcudG90YWxUaW1lID0gY2FsY3VsYXRlVG90YWxUaW1lKHRlc3RzKTsKICAgICQudG1wbCgndGFnT3JUb3RhbERldGFpbHNUZW1wbGF0ZScsIHRhZykuYXBwZW5kVG8oJyNkZXRhaWxzLWhlYWRlcicpOwogICAgZHJhd1Rlc3REZXRhaWxzVGFibGUodGVzdHMsIHRydWUpOwp9CgpmdW5jdGlvbiBzdWl0ZURldGFpbFNlbGVjdGVkKGlkKSB7CiAgICByZW5kZXJTdWl0ZVNlbGVjdG9yKGlkKTsKICAgIGlmIChpZCkKICAgICAgICByZW5kZXJTdWl0ZURldGFpbHMoaWQpOwogICAgc2Nyb2xsVG9TZWxlY3Rvcignc3VpdGVzJywgaWQpOwp9CgpmdW5jdGlvbiByZW5kZXJTdWl0ZVNlbGVjdG9yKGlkKSB7CiAgICB2YXIgYXJncyA9IHtsaW5rVGFyZ2V0OiAoaWQpID8gJ3N1aXRlcz8nK2lkIDogJ3N1aXRlcycsCiAgICAgICAgICAgICAgICBzdWl0ZVRhYlN0YXR1czogJ2RldGFpbC10YWItc2VsZWN0ZWQnfTsKICAgIHZhciBzdGF0cyA9IHtzdWl0ZXM6IHdpbmRvdy50ZXN0ZGF0YS5zdGF0aXN0aWNzKCkuc3VpdGUsCiAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGlkfTsKICAgIHJlbmRlclNlbGVjdG9yKGFyZ3MsICdzdWl0ZURldGFpbHNTZWxlY3RvclRlbXBsYXRlJywgc3RhdHMpOwp9CgpmdW5jdGlvbiByZW5kZXJTdWl0ZURldGFpbHMoaWQpIHsKICAgIHdpbmRvdy50ZXN0ZGF0YS5lbnN1cmVMb2FkZWQoaWQsIGZ1bmN0aW9uIChpZHMpIHsKICAgICAgICB2YXIgc3VpdGUgPSB3aW5kb3cudGVzdGRhdGEuZmluZExvYWRlZChpZCk7CiAgICAgICAgdmFyIG9wdHMgPSB7bG9nVVJMOiB3aW5kb3cuc2V0dGluZ3MubG9nVVJMfTsKICAgICAgICAkLnRtcGwoJ3N1aXRlRGV0YWlsc1RlbXBsYXRlJywgc3VpdGUsIG9wdHMpLmFwcGVuZFRvKCcjZGV0YWlscy1oZWFkZXInKTsKICAgICAgICBkcmF3VGVzdERldGFpbHNUYWJsZShzdWl0ZS5hbGxUZXN0cygpLCBmYWxzZSk7CiAgICAgICAgdXBkYXRlUHJpbnRTZWxlY3RvcihzdWl0ZS5mdWxsTmFtZSk7CiAgICB9KTsKfQoKZnVuY3Rpb24gc2VhcmNoRXhlY3V0ZWQoc3VpdGUsIHRlc3QsIGluY2x1ZGUsIGV4Y2x1ZGUpIHsKICAgIHJlbmRlclNlYXJjaFNlbGVjdG9yKHN1aXRlLCB0ZXN0LCBpbmNsdWRlLCBleGNsdWRlKTsKICAgIGlmIChzdWl0ZSB8fCB0ZXN0IHx8IGluY2x1ZGUgfHwgZXhjbHVkZSkgewogICAgICAgIHJlbmRlclNlYXJjaERldGFpbHMoc3VpdGUsIHRlc3QsIGluY2x1ZGUsIGV4Y2x1ZGUpOwogICAgICAgIHNjcm9sbFRvU2VsZWN0b3IoJ3NlYXJjaCcgKwogICAgICAgICAgICAgICAgICAgICAgICAgJz9zdWl0ZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHN1aXRlKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAnJnRlc3Q9JyArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXN0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAnJmluY2x1ZGU9JyArIGVuY29kZVVSSUNvbXBvbmVudChpbmNsdWRlKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAnJmV4Y2x1ZGU9JyArIGVuY29kZVVSSUNvbXBvbmVudChleGNsdWRlKSk7CiAgICB9IGVsc2UgewogICAgICAgIHNjcm9sbFRvU2VsZWN0b3IoJ3NlYXJjaCcpOwogICAgfQp9CgpmdW5jdGlvbiByZW5kZXJTZWFyY2hTZWxlY3RvcihzdWl0ZSwgdGVzdCwgaW5jbHVkZSwgZXhjbHVkZSkgewogICAgdmFyIGFyZ3MgPSB7bGlua1RhcmdldDogKHN1aXRlIHx8IHRlc3QgfHwgaW5jbHVkZSB8fCBleGNsdWRlKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3NlYXJjaD9zdWl0ZT0nICsgc3VpdGUgKyAnJnRlc3Q9JyArIHRlc3QgKyAnJmluY2x1ZGU9JyArIGluY2x1ZGUgKyAnJmV4Y2x1ZGU9JyArIGV4Y2x1ZGUpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWFyY2gnLAogICAgICAgICAgICAgICAgc2VhcmNoVGFiU3RhdHVzOiAnZGV0YWlsLXRhYi1zZWxlY3RlZCd9OwogICAgdmFyIHNlYXJjaCA9IHtzdWl0ZTogc3VpdGUsIHRlc3Q6IHRlc3QsIGluY2x1ZGU6IGluY2x1ZGUsIGV4Y2x1ZGU6IGV4Y2x1ZGV9OwogICAgcmVuZGVyU2VsZWN0b3IoYXJncywgJ3NlYXJjaFNlbGVjdG9yVGVtcGxhdGUnLCBzZWFyY2gpOwp9CgpmdW5jdGlvbiByZW5kZXJTZWFyY2hEZXRhaWxzKHN1aXRlLCB0ZXN0LCBpbmNsdWRlLCBleGNsdWRlKSB7CiAgICB2YXIgdGVzdHMgPSBzZWFyY2hUZXN0cyh1dGlsLmVzY2FwZShzdWl0ZSksIHV0aWwuZXNjYXBlKHRlc3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5lc2NhcGUoaW5jbHVkZSksIHV0aWwuZXNjYXBlKGV4Y2x1ZGUpKTsKICAgIHZhciBwYXNzZWQgPSBjYWxjdWxhdGVQYXNzZWQodGVzdHMpOwogICAgdmFyIHN0YXRzID0ge3RvdGFsOiB0ZXN0cy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgcGFzczogcGFzc2VkLAogICAgICAgICAgICAgICAgIGZhaWw6IHRlc3RzLmxlbmd0aCAtIHBhc3NlZCwKICAgICAgICAgICAgICAgICB0b3RhbFRpbWU6IGNhbGN1bGF0ZVRvdGFsVGltZSh0ZXN0cyl9OwogICAgJC50bXBsKCd0YWdPclRvdGFsRGV0YWlsc1RlbXBsYXRlJywgc3RhdHMpLmFwcGVuZFRvKCcjZGV0YWlscy1oZWFkZXInKTsKICAgIGRyYXdUZXN0RGV0YWlsc1RhYmxlKHRlc3RzLCB0cnVlKTsKfQoKZnVuY3Rpb24gc2VhcmNoVGVzdHMoc3VpdGVQYXR0ZXJuLCB0ZXN0UGF0dGVybiwgaW5jbHVkZVBhdHRlcm4sIGV4Y2x1ZGVQYXR0ZXJuKSB7CiAgICB2YXIgdGVzdHM7CiAgICBpZiAoc3VpdGVQYXR0ZXJuKQogICAgICAgIHRlc3RzID0gd2luZG93LnRlc3RkYXRhLnN1aXRlKCkuc2VhcmNoVGVzdHNJblN1aXRlKHN1aXRlUGF0dGVybik7CiAgICBlbHNlCiAgICAgICAgdGVzdHMgPSB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKS5hbGxUZXN0cygpOwogICAgcmV0dXJuIHV0aWwuZmlsdGVyKHRlc3RzLCBmdW5jdGlvbiAodGVzdCkgewogICAgICAgIGlmICh0ZXN0UGF0dGVybiAmJiAhdGVzdC5tYXRjaGVzTmFtZVBhdHRlcm4odGVzdFBhdHRlcm4pKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKGluY2x1ZGVQYXR0ZXJuICYmICF0ZXN0Lm1hdGNoZXNUYWdQYXR0ZXJuKGluY2x1ZGVQYXR0ZXJuKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiAhKGV4Y2x1ZGVQYXR0ZXJuICYmIHRlc3QubWF0Y2hlc1RhZ1BhdHRlcm4oZXhjbHVkZVBhdHRlcm4pKTsKICAgIH0pOwp9CgpmdW5jdGlvbiBzY3JvbGxUb1NlbGVjdG9yKGJhc2UsIHF1ZXJ5KSB7CiAgICAkKCcjdGVzdC1kZXRhaWxzLWNvbnRhaW5lcicpLmNzcygnbWluLWhlaWdodCcsICQod2luZG93KS5oZWlnaHQoKSk7CiAgICB2YXIgYW5jaG9yID0gcXVlcnkgPyBiYXNlICsgJz8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KSA6IGJhc2U7CiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9ICcnOwogICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSB3aW5kb3cucHJldkxvY2F0aW9uSGFzaCA9IGFuY2hvcjsKfQoKZnVuY3Rpb24gcmVuZGVyU2VsZWN0b3IoYXJncywgdGVtcGxhdGUsIHN0YXRzKSB7CiAgICB3aW5kb3cuZWxlbWVudHNUb1JlbmRlciA9IFtdOwogICAgdmFyIGNvbnRhaW5lciA9ICQoJyN0ZXN0LWRldGFpbHMtY29udGFpbmVyJyk7CiAgICBjb250YWluZXIuZW1wdHkoKTsKICAgICQudG1wbCgnZGV0YWlsc0hlYWRlclRlbXBsYXRlJywgYXJncykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICQudG1wbCh0ZW1wbGF0ZSwgc3RhdHMpLmFwcGVuZFRvKGNvbnRhaW5lcik7Cn0KCmZ1bmN0aW9uIGRyYXdUZXN0RGV0YWlsc1RhYmxlKHRlc3RzLCBzb3J0QnlTdGF0dXMpIHsKICAgIGlmICghdGVzdHMubGVuZ3RoKQogICAgICAgIHJldHVybjsKICAgIHJlbmRlclRlc3REZXRhaWxzSGVhZGVyKCk7CiAgICB3aW5kb3cuZWxlbWVudHNUb1JlbmRlciA9IHRlc3RzOwogICAgdmFyIHRhcmdldCA9ICQoJyN0ZXN0LWRldGFpbHMnKS5maW5kKCd0Ym9keScpOwogICAgcmVuZGVyVGVzdERldGFpbHMoc29ydEJ5U3RhdHVzLCB0YXJnZXQpOwp9CgpmdW5jdGlvbiByZW5kZXJUZXN0RGV0YWlsc0hlYWRlcigpIHsKICAgIHZhciBoZWFkZXIgPSAkLnRtcGwoJ3Rlc3REZXRhaWxzVGFibGVUZW1wbGF0ZScpOwogICAgaGlkZUhpZGRlbkRldGFpbHNDb2x1bW5zKGhlYWRlcik7CiAgICBoZWFkZXIuYXBwZW5kVG8oJyN0ZXN0LWRldGFpbHMtY29udGFpbmVyJyk7Cn0KCmZ1bmN0aW9uIHNvcnRCeVN0YXR1cyh0MSwgdDIpIHsKICAgIGlmICh0MS5zdGF0dXMgIT0gdDIuc3RhdHVzKQogICAgICAgIHJldHVybiB0MS5zdGF0dXMgPT0gJ0ZBSUwnID8gLTEgOiAxOwogICAgaWYgKHQxLmlzQ3JpdGljYWwgIT0gdDIuaXNDcml0aWNhbCkKICAgICAgICByZXR1cm4gdDEuaXNDcml0aWNhbCA/IC0xIDogMTsKICAgIHJldHVybiB0MS5mdWxsTmFtZSA8IHQyLmZ1bGxOYW1lID8gLTEgOiAxOwp9CgpmdW5jdGlvbiBnZXRUZXN0c0hhdmluZ1RhZyh0YWcpIHsKICAgIHJldHVybiB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKS5zZWFyY2hUZXN0c0J5VGFnKHRhZykuc29ydChzb3J0QnlTdGF0dXMpOwp9CgpmdW5jdGlvbiBnZXRUb3RhbFRlc3RzKG5hbWUpIHsKICAgIGlmIChuYW1lID09ICdjcml0aWNhbCcpCiAgICAgICAgcmV0dXJuIHdpbmRvdy50ZXN0ZGF0YS5zdWl0ZSgpLmNyaXRpY2FsVGVzdHMoKS5zb3J0KHNvcnRCeVN0YXR1cyk7CiAgICByZXR1cm4gd2luZG93LnRlc3RkYXRhLnN1aXRlKCkuYWxsVGVzdHMoKS5zb3J0KHNvcnRCeVN0YXR1cyk7Cn0KCmZ1bmN0aW9uIGNhbGN1bGF0ZVRvdGFsVGltZSh0ZXN0cykgewogICAgdmFyIHRvdGFsID0gMDsKICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0ZXN0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKICAgICAgICB0b3RhbCArPSB0ZXN0c1tpXS50aW1lcy5lbGFwc2VkTWlsbGlzOwogICAgcmV0dXJuIHV0aWwuZm9ybWF0RWxhcHNlZCh0b3RhbCk7Cn0KCmZ1bmN0aW9uIGNhbGN1bGF0ZVBhc3NlZCh0ZXN0cykgewogICAgdmFyIHBhc3NlZCA9IHV0aWwuZmlsdGVyKHRlc3RzLCBmdW5jdGlvbiAodGVzdCkgewogICAgICAgIHJldHVybiB0ZXN0LnN0YXR1cyA9PSAnUEFTUyc7CiAgICB9KTsKICAgIHJldHVybiBwYXNzZWQubGVuZ3RoOwp9CgpmdW5jdGlvbiByZW5kZXJUZXN0RGV0YWlscyhzb3J0QnlTdGF0dXMsIHRhcmdldCkgewogICAgaWYgKCF3aW5kb3cuZWxlbWVudHNUb1JlbmRlci5sZW5ndGgpCiAgICAgICAgcmV0dXJuOwogICAgdmFyIHRlc3RzID0gcG9wVXBUbyh3aW5kb3cuZWxlbWVudHNUb1JlbmRlciwgNTApOwogICAgcmVuZGVyVGVzdERldGFpbHNSb3dzKHRlc3RzLCB0YXJnZXQpOwogICAgaWYgKHdpbmRvdy5lbGVtZW50c1RvUmVuZGVyLmxlbmd0aCkKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtyZW5kZXJUZXN0RGV0YWlscyhzb3J0QnlTdGF0dXMsIHRhcmdldCk7fSwgMCk7CiAgICBlbHNlCiAgICAgICAgY29uZmlndXJlVGFibGVTb3J0ZXIoc29ydEJ5U3RhdHVzKTsKfQoKZnVuY3Rpb24gcmVuZGVyVGVzdERldGFpbHNSb3dzKHRlc3RzLCB0YXJnZXQpIHsKICAgIHZhciByb3dzID0gJC50bXBsKCd0ZXN0RGV0YWlsc1RhYmxlUm93VGVtcGxhdGUnLCB0ZXN0cywKICAgICAgICAgICAgICAgICAgICAgIHtsb2dVUkw6IHdpbmRvdy5zZXR0aW5ncy5sb2dVUkx9KTsKICAgIHJvd3MuZmluZCgnYScpLmNsaWNrKHN0b3BQcm9wYWdhdGlvbik7CiAgICBoaWRlSGlkZGVuRGV0YWlsc0NvbHVtbnMocm93cyk7CiAgICByb3dzLmFwcGVuZFRvKHRhcmdldCk7Cn0KCmZ1bmN0aW9uIGNvbmZpZ3VyZVRhYmxlU29ydGVyKHNvcnRCeVN0YXR1cykgewogICAgdmFyIGNvbmZpZyA9IHtoZWFkZXJzOiB7Mzoge3NvcnRlcjogJ2NyaXRpY2FsaXR5J30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OiB7c29ydEluaXRpYWxPcmRlcjogJ2Rlc2MnfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6IHtzb3J0ZXI6ICd0aW1lcyd9fSwKICAgICAgICAgICAgICAgICAgc2VsZWN0b3JTb3J0OiAnLmRldGFpbHMtY29sLWhlYWRlcid9OwogICAgaWYgKHNvcnRCeVN0YXR1cykKICAgICAgICBjb25maWdbJ3NvcnRMaXN0J10gPSBbWzQsIDBdLCBbMywgMF1dOwogICAgJCgnI3Rlc3QtZGV0YWlscycpLnRhYmxlc29ydGVyKGNvbmZpZyk7Cn0KCmZ1bmN0aW9uIHBvcFVwVG8obGlzdCwgdXBUbykgewogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgd2hpbGUgKGxpc3QubGVuZ3RoID4gMCAmJiByZXN1bHQubGVuZ3RoIDwgdXBUbykKICAgICAgICByZXN1bHQucHVzaChsaXN0LnNoaWZ0KCkpOwogICAgcmV0dXJuIHJlc3VsdDsKfQoKZnVuY3Rpb24gdG9nZ2xlRGV0YWlsc0NvbHVtbihuYW1lKSB7CiAgICB2YXIgY29sdW1uID0gJCgnLmRldGFpbHMtY29sLScgKyBuYW1lKTsKICAgIGNvbHVtbi50b2dnbGVDbGFzcygnaGlkZGVuJyk7CiAgICB2YXIgaGlkZGVuID0gY29sdW1uLmhhc0NsYXNzKCdoaWRkZW4nKTsKICAgIHN0b3JhZ2Uuc2V0KG5hbWUsIGhpZGRlbiA/ICdoaWRkZW4nIDogJ3Zpc2libGUnKTsKICAgIGNvbHVtbi5maW5kKCcuZGV0YWlscy1jb2wtdG9nZ2xlJykuaHRtbChoaWRkZW4gPyAnJmhlbGxpcDsnIDogJyZ0aW1lczsnKTsKfQoKZnVuY3Rpb24gaGlkZUhpZGRlbkRldGFpbHNDb2x1bW5zKGVsZW0pIHsKICAgIHZhciBuYW1lcyA9IFsnZG9jJywgJ3RhZ3MnLCAnbXNnJywgJ2VsYXBzZWQnLCAndGltZXMnXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgbmFtZSA9IG5hbWVzW2ldOwogICAgICAgIGlmIChzdG9yYWdlLmdldChuYW1lLCAndmlzaWJsZScpID09ICdoaWRkZW4nKSB7CiAgICAgICAgICAgIHZhciBjb2x1bW4gPSBlbGVtLmZpbmQoJy5kZXRhaWxzLWNvbC0nICsgbmFtZSk7CiAgICAgICAgICAgIGNvbHVtbi5hZGRDbGFzcygnaGlkZGVuJyk7CiAgICAgICAgICAgIGNvbHVtbi5maW5kKCcuZGV0YWlscy1jb2wtdG9nZ2xlJykuaHRtbCgnJmhlbGxpcDsnKTsKICAgICAgICB9CiAgICB9Cn0KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1bW1hcnlUYWJsZVRlbXBsYXRlIj4KICA8aDI+U3VtbWFyeSBJbmZvcm1hdGlvbjwvaDI+CiAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIj4KICAgIDx0cj4KICAgICAgPHRoPlN0YXR1czo8L3RoPgogICAgICB7e2lmIGNyaXRpY2FsRmFpbGVkfX0KICAgICAgPHRkPjxhIGhyZWY9IiN0b3RhbHM/Y3JpdGljYWwiIG9uY2xpY2s9InRvdGFsRGV0YWlsU2VsZWN0ZWQoJ2NyaXRpY2FsJykiCiAgICAgICAgICAgICBjbGFzcz0iZmFpbCI+JHtjcml0aWNhbEZhaWxlZH0gY3JpdGljYWwge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX17e2lmIGNyaXRpY2FsRmFpbGVkICE9IDF9fXN7ey9pZn19IGZhaWxlZDwvYT48L3RkPgogICAgICB7e2Vsc2UgdG90YWxGYWlsZWR9fQogICAgICA8dGQ+PGEgaHJlZj0iI3RvdGFscz9jcml0aWNhbCIgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgnY3JpdGljYWwnKSIKICAgICAgICAgICAgIGNsYXNzPSJwYXNzIj5BbGwgY3JpdGljYWwge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX1zIHBhc3NlZDwvYT48L3RkPgogICAgICB7e2Vsc2V9fQogICAgICA8dGQ+PGEgaHJlZj0iI3RvdGFscz9hbGwiIG9uY2xpY2s9InRvdGFsRGV0YWlsU2VsZWN0ZWQoJ2FsbCcpIgogICAgICAgICAgICAgY2xhc3M9InBhc3MiPkFsbCB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXMgcGFzc2VkPC9hPjwvdGQ+CiAgICAgIHt7L2lmfX0KICAgIDwvdHI+CiAgICB7e2lmIGRvYygpfX0KICAgIDx0cj4KICAgICAgPHRoPkRvY3VtZW50YXRpb246PC90aD4KICAgICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCBkb2MoKX19PC90ZD4KICAgIDwvdHI+CiAgICB7ey9pZn19CiAgICB7e2VhY2ggbWV0YWRhdGF9fQogICAgPHRyPgogICAgICA8dGg+e3todG1sICR2YWx1ZVswXX19OjwvdGg+CiAgICAgIDx0ZCBjbGFzcz0iZG9jIj57e2h0bWwgJHZhbHVlWzFdfX08L3RkPgogICAgPC90cj4KICAgIHt7L2VhY2h9fQogICAge3tpZiB0aW1lcy5zdGFydFRpbWUgIT0gJ04vQSd9fQogICAgPHRyPgogICAgICA8dGg+U3RhcnQgVGltZTo8L3RoPgogICAgICA8dGQ+JHt0aW1lcy5zdGFydFRpbWV9PC90ZD4KICAgIDwvdHI+CiAgICB7ey9pZn19CiAgICB7e2lmIHRpbWVzLmVuZFRpbWUgIT0gJ04vQSd9fQogICAgPHRyPgogICAgICA8dGg+RW5kIFRpbWU6PC90aD4KICAgICAgPHRkPiR7dGltZXMuZW5kVGltZX08L3RkPgogICAgPC90cj4KICAgIHt7L2lmfX0KICAgIDx0cj4KICAgICAgPHRoPkVsYXBzZWQgVGltZTo8L3RoPgogICAgICA8dGQ+JHt0aW1lcy5lbGFwc2VkVGltZX08L3RkPgogICAgPC90cj4KICAgIHt7aWYgJGl0ZW0ubG9nVVJMfX0KICAgIDx0cj4KICAgICAgPHRoPkxvZyBGaWxlOjwvdGg+CiAgICAgIDx0ZD48YSBocmVmPSIkeyRpdGVtLmxvZ1VSTH0iPiR7JGl0ZW0ubG9nVVJMfTwvYT48L3RkPgogICAgPC90cj4KICAgIHt7L2lmfX0KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idG90YWxTdGF0aXN0aWNzUm93VGVtcGxhdGUiPgogIDx0ciBvbmNsaWNrPSJ0b3RhbERldGFpbFNlbGVjdGVkKCcke3R5cGV9JykiIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPGEgaHJlZj0iI3RvdGFscz8ke3R5cGV9Ij57e2h0bWwgbGFiZWx9fTwvYT4KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0YWdTdGF0aXN0aWNzUm93VGVtcGxhdGUiPgogIDx0ciBvbmNsaWNrPSJ0YWdEZXRhaWxTZWxlY3RlZCgnJHtsYWJlbH0nKSIgY2xhc3M9InJvdy0keyRpdGVtLmluZGV4fSI+CiAgICA8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIiB0aXRsZT0ie3todG1sIGRvY319Ij4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8YSBocmVmPSIjdGFncz8ke2xhYmVsfSI+e3todG1sIGxhYmVsfX08L2E+CiAgICAgICAge3tpZiBpbmZvfX0oJHtpbmZvfSl7ey9pZn19CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJ0YWctbGlua3MiPgogICAgICAgIHt7ZWFjaCBsaW5rc319CiAgICAgICAgPHNwYW4+WzxhIGhyZWY9Int7aHRtbCAkdmFsdWUudXJsfX0iIG9uY2xpY2s9InN0b3BQcm9wYWdhdGlvbihldmVudCkiCiAgICAgICAgICAgICAgICAgIHRpdGxlPSJ7e2h0bWwgJHZhbHVlLnVybH19Ij57e2h0bWwgJHZhbHVlLnRpdGxlfX08L2E+XTwvc3Bhbj4KICAgICAgICB7ey9lYWNofX0KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJzdWl0ZVN0YXRpc3RpY3NSb3dUZW1wbGF0ZSI+CiAgPHRyIG9uY2xpY2s9InN1aXRlRGV0YWlsU2VsZWN0ZWQoJyR7aWR9JykiIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSIgdGl0bGU9Int7aHRtbCBsYWJlbH19Ij4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8YSBocmVmPSIjc3VpdGVzPyR7aWR9Ij48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBmb3JtYXRQYXJlbnROYW1lfX08L3NwYW4+e3todG1sIG5hbWV9fTwvYT4KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJkZXRhaWxzSGVhZGVyVGVtcGxhdGUiPgogIDxoMiBpZD0iJHtsaW5rVGFyZ2V0fSI+e3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX0gRGV0YWlsczwvaDI+CiAgPHVsIGlkPSJkZXRhaWwtdGFicyI+CiAgICA8bGkgY2xhc3M9IiR7dG90YWxUYWJTdGF0dXN9IGRldGFpbC10YWIiPgogICAgICA8YSBocmVmPSIjdG90YWxzIiBvbmNsaWNrPSJyZW5kZXJUb3RhbFNlbGVjdG9yKCkiPlRvdGFsczwvYT4KICAgIDwvbGk+CiAgICA8bGkgY2xhc3M9IiR7dGFnVGFiU3RhdHVzfSBkZXRhaWwtdGFiIj4KICAgICAgPGEgaHJlZj0iI3RhZ3MiIG9uY2xpY2s9InJlbmRlclRhZ1NlbGVjdG9yKCkiPlRhZ3M8L2E+CiAgICA8L2xpPgogICAgPGxpIGNsYXNzPSIke3N1aXRlVGFiU3RhdHVzfSBkZXRhaWwtdGFiIj4KICAgICAgPGEgaHJlZj0iI3N1aXRlcyIgb25jbGljaz0icmVuZGVyU3VpdGVTZWxlY3RvcigpIj5TdWl0ZXM8L2E+CiAgICA8L2xpPgogICAgPGxpIGNsYXNzPSIke3NlYXJjaFRhYlN0YXR1c30gZGV0YWlsLXRhYiI+CiAgICAgIDxhIGhyZWY9IiNzZWFyY2giIG9uY2xpY2s9InJlbmRlclNlYXJjaFNlbGVjdG9yKCkiPlNlYXJjaDwvYT4KICAgIDwvbGk+CiAgPC91bD4KPC9zY3JpcHQ+Cgo8c2NyaXB0ICB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0b3RhbERldGFpbHNTZWxlY3RvclRlbXBsYXRlIj4KICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGlkPSJkZXRhaWxzLWhlYWRlciI+CiAgICA8dHIgY2xhc3M9InNlbGVjdG9yIj4KICAgICAgPHRoPlR5cGU6PC90aD4KICAgICAgPHRkIGlkPSJub3JtYWwtc2VsZWN0b3IiPgogICAgICAgIDxpbnB1dCBpZD0icmFkaW8tY3JpdGljYWwiIHR5cGU9InJhZGlvIiBuYW1lPSJ0b3RhbHMtcmFkaW8iCiAgICAgICAgICAgICAgIG9uY2xpY2s9InRvdGFsRGV0YWlsU2VsZWN0ZWQoJ2NyaXRpY2FsJykiCiAgICAgICAgICAgICAgIHt7aWYgc2VsZWN0ZWQgPT0gJ2NyaXRpY2FsJ319Y2hlY2tlZD0iY2hlY2tlZCJ7ey9pZn19PgogICAgICAgIDxsYWJlbCBmb3I9InJhZGlvLWNyaXRpY2FsIj5Dcml0aWNhbCB7ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fXM8L2xhYmVsPjxicj4KICAgICAgICA8aW5wdXQgaWQ9InJhZGlvLWFsbCIgdHlwZT0icmFkaW8iIG5hbWU9InRvdGFscy1yYWRpbyIKICAgICAgICAgICAgICAgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgnYWxsJykiCiAgICAgICAgICAgICAgIHt7aWYgc2VsZWN0ZWQgPT0gJ2FsbCd9fWNoZWNrZWQ9ImNoZWNrZWQie3svaWZ9fT4KICAgICAgICA8bGFiZWwgZm9yPSJyYWRpby1hbGwiPkFsbCB7ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fXM8L2xhYmVsPgogICAgICA8L3RkPgogICAgICA8dGQgaWQ9InByaW50LXNlbGVjdG9yIj48L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgIHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRhZ0RldGFpbHNTZWxlY3RvclRlbXBsYXRlIj4KICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGlkPSJkZXRhaWxzLWhlYWRlciI+CiAgICA8dHIgY2xhc3M9InNlbGVjdG9yIj4KICAgICAgPHRoPk5hbWU6PC90aD4KICAgICAgPHRkIGlkPSJub3JtYWwtc2VsZWN0b3IiPgogICAgICAgIDxzZWxlY3QgaWQ9InRhZy1kZXRhaWwtc2VsZWN0b3IiCiAgICAgICAgICAgICAgICBvbmNoYW5nZT0idGFnRGV0YWlsU2VsZWN0ZWQodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpIj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+U2VsZWN0IHRhZy4uLjwvb3B0aW9uPgogICAgICAgICAge3tlYWNoIHRhZ3N9fQogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iJHskdmFsdWUubGFiZWx9IgogICAgICAgICAgICAgICAgICB7e2lmICR2YWx1ZS5sYWJlbCA9PSBzZWxlY3RlZH19c2VsZWN0ZWQ9InNlbGVjdGVkInt7L2lmfX0+CiAgICAgICAgICAgIHt7aHRtbCAkdmFsdWUubGFiZWx9fSB7e2lmICR2YWx1ZS5pbmZvfX0oJHskdmFsdWUuaW5mb30pe3svaWZ9fQogICAgICAgICAgPC9vcHRpb24+CiAgICAgICAgICB7ey9lYWNofX0KICAgICAgICA8L3NlbGVjdD4KICAgICAgPC90ZD4KICAgICAgPHRkIGlkPSJwcmludC1zZWxlY3RvciI+PC90ZD4KICAgIDwvdHI+CiAgPC90YWJsZT4KPC9zY3JpcHQ+Cgo8c2NyaXB0ICB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJzdWl0ZURldGFpbHNTZWxlY3RvclRlbXBsYXRlIj4KICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGlkPSJkZXRhaWxzLWhlYWRlciI+CiAgICA8dHIgY2xhc3M9InNlbGVjdG9yIj4KICAgICAgPHRoPk5hbWU6PC90aD4KICAgICAgPHRkIGlkPSJub3JtYWwtc2VsZWN0b3IiPgogICAgICAgIDxzZWxlY3QgaWQ9InN1aXRlLWRldGFpbC1zZWxlY3RvciIKICAgICAgICAgICAgICAgIG9uY2hhbmdlPSJzdWl0ZURldGFpbFNlbGVjdGVkKHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlKSI+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPlNlbGVjdCBzdWl0ZS4uLjwvb3B0aW9uPgogICAgICAgICAge3tlYWNoIHN1aXRlc319CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIkeyR2YWx1ZS5pZH0iCiAgICAgICAgICAgICAgICAgIHt7aWYgJHZhbHVlLmlkID09IHNlbGVjdGVkfX1zZWxlY3RlZD0ic2VsZWN0ZWQie3svaWZ9fT4KICAgICAgICAgICAge3todG1sICR2YWx1ZS5sYWJlbH19CiAgICAgICAgICA8L29wdGlvbj4KICAgICAgICAgIHt7L2VhY2h9fQogICAgICAgIDwvc2VsZWN0PgogICAgICA8L3RkPgogICAgICA8dGQgaWQ9InByaW50LXNlbGVjdG9yIj48L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgIHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InNlYXJjaFNlbGVjdG9yVGVtcGxhdGUiPgogIDxmb3JtIGFjdGlvbj0iamF2YXNjcmlwdDp2b2lkKDApIj4KICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgaWQ9ImRldGFpbHMtaGVhZGVyIj4KICAgICAgPHRyIGNsYXNzPSJzZWxlY3RvciBmaXJzdC1zZWxlY3RvciI+CiAgICAgICAgPHRoPjxsYWJlbCBmb3I9InNlYXJjaC1zdWl0ZSI+U3VpdGU6PC9sYWJlbD48L3RoPgogICAgICAgIDx0ZD48aW5wdXQgaWQ9InNlYXJjaC1zdWl0ZSIgdHlwZT0idGV4dCIgdmFsdWU9IiR7c3VpdGV9Ij48L3RkPgogICAgICA8L3RyPgogICAgICA8dHIgY2xhc3M9InNlbGVjdG9yIG1pZGRsZS1zZWxlY3RvciI+CiAgICAgICAgPHRoPjxsYWJlbCBmb3I9InNlYXJjaC10ZXN0Ij57ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fTo8L2xhYmVsPjwvdGg+CiAgICAgICAgPHRkPjxpbnB1dCBpZD0ic2VhcmNoLXRlc3QiIHR5cGU9InRleHQiIHZhbHVlPSIke3Rlc3R9Ij48L3RkPgogICAgICA8L3RyPgogICAgICA8dHIgY2xhc3M9InNlbGVjdG9yIG1pZGRsZS1zZWxlY3RvciI+CiAgICAgICAgPHRoPjxsYWJlbCBmb3I9InNlYXJjaC1pbmNsdWRlIj5JbmNsdWRlOjwvbGFiZWw+PC90aD4KICAgICAgICA8dGQ+PGlucHV0IGlkPSJzZWFyY2gtaW5jbHVkZSIgdHlwZT0idGV4dCIgdmFsdWU9IiR7aW5jbHVkZX0iPjwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0ic2VsZWN0b3IgbWlkZGxlLXNlbGVjdG9yIj4KICAgICAgICA8dGg+PGxhYmVsIGZvcj0ic2VhcmNoLWV4Y2x1ZGUiPkV4Y2x1ZGU6PC9sYWJlbD48L3RoPgogICAgICAgIDx0ZD48aW5wdXQgaWQ9InNlYXJjaC1leGNsdWRlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iJHtleGNsdWRlfSI+PC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyIGNsYXNzPSJzZWxlY3RvciBsYXN0LXNlbGVjdG9yIiBpZD0ic2VhcmNoLWJ1dHRvbnMiPgogICAgICAgIDx0aD48L3RoPgogICAgICAgIDx0ZD4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giCiAgICAgICAgICAgICAgICAgb25jbGljaz0ic2VhcmNoRXhlY3V0ZWQoJCgnI3NlYXJjaC1zdWl0ZScpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtdGVzdCcpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtaW5jbHVkZScpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtZXhjbHVkZScpLnZhbCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ij4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJDbGVhciIKICAgICAgICAgICAgICAgICBvbmNsaWNrPSIkKCcjc2VhcmNoLXN1aXRlJykudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjc2VhcmNoLXRlc3QnKS52YWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtaW5jbHVkZScpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3NlYXJjaC1leGNsdWRlJykudmFsKCcnKTsiPgogICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSIkKCcjc2VhcmNoLWhlbHAnKS50b2dnbGUoKSIKICAgICAgICAgICAgIHRpdGxlPSJUb2dnbGUgc2VhcmNoIGhlbHAuIj5IZWxwPC9hPgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBpZD0ic2VhcmNoLWhlbHAiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KICAgICAgICA8dGg+PC90aD4KICAgICAgICA8dGQ+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8aDM+U2VhcmNoIGZpZWxkczwvaDM+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIHt7PSB0ZXN0T3JUYXNrKCd7VGVzdH0nKX19cyBjYW4gYmUgc2VhcmNoZWQgYmFzZWQgb24gc3VpdGUgYW5kCiAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX0gbmFtZXMgYXMgd2VsbCBhcyBiYXNlZCBvbiB0YWdzLiBJZgogICAgICAgICAgICAgIG11bHRpcGxlIHNlYXJjaCBjcml0ZXJpYSBhcmUgdXNlZCwgb25seQogICAgICAgICAgICAgIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19cyBtYXRjaGluZyBhbGwgb2YgdGhlbSBhcmUgaW5jbHVkZWQuCiAgICAgICAgICAgICAgU2VhcmNoIGZpZWxkcyBoYXZlIHNhbWUgc2VtYW50aWNzIGFzCiAgICAgICAgICAgICAgPGVtPiYjODIwOTsmIzgyMDk7c3VpdGU8L2VtPiwKICAgICAgICAgICAgICA8ZW0+JiM4MjA5OyYjODIwOTt7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fTwvZW0+LAogICAgICAgICAgICAgIDxlbT4mIzgyMDk7JiM4MjA5O2luY2x1ZGU8L2VtPiBhbmQKICAgICAgICAgICAgICA8ZW0+JiM4MjA5OyYjODIwOTtleGNsdWRlPC9lbT4gY29tbWFuZCBsaW5lIG9wdGlvbnMsIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9InNlYXJjaC1oZWxwLWV4YW1wbGVzIj4KICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJoZWxwLWl0ZW0iPgogICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImhlbHAtZXhwbGFuYXRpb24iPgogICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImhlbHAtZXhhbXBsZXM+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPkZpZWxkPC90aD4KICAgICAgICAgICAgICAgIDx0aD5FeHBsYW5hdGlvbjwvdGg+CiAgICAgICAgICAgICAgICA8dGg+RXhhbXBsZXM8L3RoPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPlN1aXRlPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX1zIGluIG1hdGNoaW5nIHN1aXRlcyBhcmUgaW5jbHVkZWQuCiAgICAgICAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGNhbiBtYXRjaCBlaXRoZXIgc3VpdGUncyBuYW1lIG9yIGl0cyBmdWxsIG5hbWUKICAgICAgICAgICAgICAgICAgdGhhdCBjb250YWlucyBhbHNvIHBhcmVudCBzdWl0ZSBuYW1lcy4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+TXkgU3VpdGU8YnI+Um9vdC5QYXJlbnQuU3VpKjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+e3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX08L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICBNYXRjaGluZyB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXMgYXJlIGluY2x1ZGVkLiBUaGUKICAgICAgICAgICAgICAgICAgcGF0dGVybiBjYW4gbWF0Y2ggZWl0aGVyIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19J3MgbmFtZQogICAgICAgICAgICAgICAgICBvciBpdHMgZnVsbCBuYW1lIHRoYXQgY29udGFpbnMgYWxzbyBwYXJlbnQgc3VpdGUgbmFtZXMuCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPkV4YW1wbGUgTmFtZTxicj5Sb290LlBhKi5UPz8/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD5JbmNsdWRlPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX1zIHRoYXQgY29udGFpbiBtYXRjaGluZyB0YWdzIGFyZQogICAgICAgICAgICAgICAgICBpbmNsdWRlZC4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+c21va2U8YnI+YnVnLSo8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPkV4Y2x1ZGU8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICB7ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fXMgdGhhdCBjb250YWluIG1hdGNoaW5nIHRhZ3MgYXJlCiAgICAgICAgICAgICAgICAgIG5vdCBpbmNsdWRlZC4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+c2xvdzxicj5mZWF0dXJlLTQ/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8aDM+UGF0dGVybnM8L2gzPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBBbGwgc2VhcmNoZXMgc3VwcG9ydCA8ZW0+KjwvZW0+IGFuZCA8ZW0+PzwvZW0+IHdpbGRjYXJkcyBhbmQgYXJlCiAgICAgICAgICAgICAgY2FzZSwgc3BhY2UgYW5kIHVuZGVyc2NvcmUgaW5zZW5zaXRpdmUuIFRhZyByZWxhdGVkIHNlYXJjaGVzIGFsc28KICAgICAgICAgICAgICBzdXBwb3J0IDxlbT5BTkQ8L2VtPiwgPGVtPk9SPC9lbT4gYW5kIDxlbT5OT1Q8L2VtPiAoY2FzZS1zZW5zaXRpdmUpCiAgICAgICAgICAgICAgY29tYmluaW5nIG9wZXJhdG9ycy4gSWYgb3BlcmF0b3JzIGFyZSB1c2VkIHRvZ2V0aGVyLCB0aGVpcgogICAgICAgICAgICAgIHByZWNlZGVuY2UsIGZyb20gaGlnaGVzdCB0byBsb3dlc3QsIGlzIDxlbT5BTkQ8L2VtPiwgPGVtPk9SPC9lbT4sCiAgICAgICAgICAgICAgPGVtPk5PVDwvZW0+LiBTZWUgPGVtPlNpbXBsZSBwYXR0ZXJuczwvZW0+IGFuZAogICAgICAgICAgICAgIDxlbT5UYWcgcGF0dGVybnM8L2VtPiBzZWN0aW9ucyBpbgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9yb2JvdGZyYW1ld29yay5vcmcvcm9ib3RmcmFtZXdvcmsvI3VzZXItZ3VpZGUiPlJvYm90CiAgICAgICAgICAgICAgRnJhbWV3b3JrIFVzZXIgR3VpZGU8L2E+IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJzZWFyY2gtaGVscC1leGFtcGxlcyI+CiAgICAgICAgICAgICAgPGNvbCBjbGFzcz0iaGVscC1pdGVtIj4KICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJoZWxwLWV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJoZWxwLWV4YW1wbGVzPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0aD5QYXR0ZXJuPC90aD4KICAgICAgICAgICAgICAgIDx0aD5FeHBsYW5hdGlvbjwvdGg+CiAgICAgICAgICAgICAgICA8dGg+RXhhbXBsZXM8L3RoPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPio8L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgYW55dGhpbmcsIGV2ZW4gYW4gZW1wdHkgc3RyaW5nLjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+Zio8YnI+c3ByaW50LSo8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPj88L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIuPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5mPz88YnI+c3ByaW50LTE/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD5BTkQ8L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgaWYgYWxsIHBhdHRlcm5zIG1hdGNoLjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+Zm9vIEFORCBiYXI8YnI+eCBBTkQgeSogQU5EIHo/PzwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+T1I8L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgaWYgYW55IHBhdHRlcm4gbWF0Y2hlcy48L3RkPgogICAgICAgICAgICAgICAgPHRkPmZvbyBPUiBiYXI8YnI+eCBPUiB5KiBPUiB6MSBBTkQgejI8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPk5PVDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgTWF0Y2hlcyBpZiAob3B0aW9uYWwpIHBhdHRlcm4gYmVmb3JlIG1hdGNoZXMgYW5kIHBhdHRlcm4KICAgICAgICAgICAgICAgICAgICBhZnRlciBkb2VzIG5vdC4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+Zm9vIE5PVCBiYXI8YnI+KiBOT1QgaWQtKiBBTkQgc21va2U8YnI+Tk9UIGJhcjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICA8L3RhYmxlPgogIDwvZm9ybT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRhZ09yVG90YWxEZXRhaWxzVGVtcGxhdGUiPgogIDx0cj4KICAgIDx0aD5TdGF0dXM6PC90aD4KICAgIDx0ZD4ke3RvdGFsfSB0b3RhbCwgJHtwYXNzfSBwYXNzZWQsIHt7aWYgZmFpbH19PHNwYW4gY2xhc3M9ImZhaWwiPiR7ZmFpbH0gZmFpbGVkPC9zcGFuPnt7ZWxzZX19PHNwYW4gY2xhc3M9InBhc3MiPjAgZmFpbGVkPC9zcGFuPnt7L2lmfX08L3RkPgogIDwvdHI+CiAge3tpZiBkb2N9fQogIDx0cj4KICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICA8dGQ+e3todG1sIGRvY319PC90ZD4KICA8L3RyPgogIHt7L2lmfX0KICB7e2lmIGNvbWJpbmVkfX0KICA8dHI+CiAgICA8dGg+UGF0dGVybjo8L3RoPgogICAgPHRkPnt7aHRtbCBjb21iaW5lZH19PC90ZD4KICA8L3RyPgogIHt7L2lmfX0KICB7e2lmIGxpbmtzfX17e2lmIGxpbmtzLmxlbmd0aH19CiAgPHRyPgogICAgPHRoPkxpbmtzOjwvdGg+CiAgICA8dGQ+e3tlYWNoIGxpbmtzfX08YSBocmVmPSJ7e2h0bWwgJHZhbHVlLnVybH19IgogICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Int7aHRtbCAkdmFsdWUudXJsfX0iPnt7aHRtbCAkdmFsdWUudGl0bGV9fTwvYT4gJm5ic3A7IHt7L2VhY2h9fTwvdGQ+CiAgPC90cj4KICB7ey9pZn19e3svaWZ9fQogIDx0cj4KICAgIDx0aD5Ub3RhbCBUaW1lOjwvdGg+CiAgICA8dGQ+JHt0b3RhbFRpbWV9PC90ZD4KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ic3VpdGVEZXRhaWxzVGVtcGxhdGUiPgogIDx0cj4KICAgIDx0aD5TdGF0dXM6PC90aD4KICAgIDx0ZD57e3RtcGwoJGRhdGEpICdzdWl0ZVN0YXR1c01lc3NhZ2VUZW1wbGF0ZSd9fTwvdGQ+CiAgPC90cj4KICB7e2lmIGRvYygpfX0KICA8dHI+CiAgICA8dGg+RG9jdW1lbnRhdGlvbjo8L3RoPgogICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCBkb2MoKX19PC90ZD4KICA8L3RyPgogIHt7L2lmfX0KICB7e2VhY2ggbWV0YWRhdGF9fQogIDx0cj4KICAgIDx0aD57e2h0bWwgJHZhbHVlWzBdfX06PC90aD4KICAgIDx0ZCBjbGFzcz0iZG9jIj57e2h0bWwgJHZhbHVlWzFdfX08L3RkPgogIDwvdHI+CiAge3svZWFjaH19CiAge3tpZiBtZXNzYWdlKCl9fQogIDx0cj4KICAgIDx0aD5NZXNzYWdlOjwvdGg+CiAgICA8dGQgY2xhc3M9Im1lc3NhZ2UiPnt7aHRtbCBtZXNzYWdlKCl9fTwvdGQ+CiAgPC90cj4KICB7ey9pZn19CiAgPHRyPgogICAgPHRoPlN0YXJ0IC8gRW5kIFRpbWU6PC90aD4KICAgIDx0ZD4ke3RpbWVzLnN0YXJ0VGltZX0gLyAke3RpbWVzLmVuZFRpbWV9PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0aD5FbGFwc2VkIFRpbWU6PC90aD4KICAgIDx0ZD4ke3RpbWVzLmVsYXBzZWRUaW1lfTwvdGQ+CiAgPC90cj4KICB7e2lmICRpdGVtLmxvZ1VSTH19CiAgPHRyPgogICAgPHRoPkxvZyBGaWxlOjwvdGg+CiAgICA8dGQ+PGEgaHJlZj0iJHskaXRlbS5sb2dVUkx9IyR7aWR9IgogICAgICAgICAgIHRpdGxlPSJ7e2h0bWwgZnVsbE5hbWV9fSI+JHskaXRlbS5sb2dVUkx9IyR7aWR9PC9hPjwvdGQ+CiAgPC90cj4KICB7ey9pZn19Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0ZXN0RGV0YWlsc1RhYmxlVGVtcGxhdGUiPgogIDx0YWJsZSBpZD0idGVzdC1kZXRhaWxzIj4KICAgIDx0aGVhZD4KICAgICAgPHRyPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtbmFtZSIgdGl0bGU9Ik5hbWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5OYW1lPC9kaXY+CiAgICAgICAgPC90aD4KICAgICAgICA8dGggY2xhc3M9ImRldGFpbHMtY29sLWRvYyIgdGl0bGU9IkRvY3VtZW50YXRpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtdG9nZ2xlJyBvbmNsaWNrPSJ0b2dnbGVEZXRhaWxzQ29sdW1uKCdkb2MnKSI+JnRpbWVzOzwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5Eb2N1bWVudGF0aW9uPC9kaXY+CiAgICAgICAgPC90aD4KICAgICAgICA8dGggY2xhc3M9ImRldGFpbHMtY29sLXRhZ3MiIHRpdGxlPSJUYWdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLXRvZ2dsZScgb25jbGljaz0idG9nZ2xlRGV0YWlsc0NvbHVtbigndGFncycpIj4mdGltZXM7PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC1oZWFkZXInPlRhZ3M8L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtY3JpdCIgdGl0bGU9IkNyaXRpY2FsIj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLWhlYWRlcic+Q3JpdC48L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtc3RhdHVzIiB0aXRsZT0iU3RhdHVzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLWhlYWRlcic+U3RhdHVzPC9kaXY+CiAgICAgICAgPC90aD4KICAgICAgICA8dGggY2xhc3M9ImRldGFpbHMtY29sLW1zZyIgdGl0bGU9Ik1lc3NhZ2UiPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtdG9nZ2xlJyBvbmNsaWNrPSJ0b2dnbGVEZXRhaWxzQ29sdW1uKCdtc2cnKSI+JnRpbWVzOzwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5NZXNzYWdlPC9kaXY+CiAgICAgICAgPC90aD4KICAgICAgICA8dGggY2xhc3M9ImRldGFpbHMtY29sLWVsYXBzZWQiIHRpdGxlPSJFbGFwc2VkIFRpbWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtdG9nZ2xlJyBvbmNsaWNrPSJ0b2dnbGVEZXRhaWxzQ29sdW1uKCdlbGFwc2VkJykiPiZ0aW1lczs8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLWhlYWRlcic+RWxhcHNlZDwvZGl2PgogICAgICAgIDwvdGg+CiAgICAgICAgPHRoIGNsYXNzPSJkZXRhaWxzLWNvbC10aW1lcyIgdGl0bGU9IlN0YXJ0IFRpbWUgLyBFbmQgVGltZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC10b2dnbGUnIG9uY2xpY2s9InRvZ2dsZURldGFpbHNDb2x1bW4oJ3RpbWVzJykiPiZ0aW1lczs8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLWhlYWRlcic+U3RhcnQgLyBFbmQ8L2Rpdj4KICAgICAgICA8L3RoPgogICAgICA8L3RyPgogICAgPC90aGVhZD4KICAgIDx0Ym9keT48L3Rib2R5PgogIDwvdGFibGU+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0ZXN0RGV0YWlsc1RhYmxlUm93VGVtcGxhdGUiPgogIHt7aWYgJGl0ZW0ubG9nVVJMfX0KICA8dHIgb25jbGljaz0ibG9jYXRpb24gPSAnJHskaXRlbS5sb2dVUkx9IyR7aWR9JyIgdGl0bGU9Int7aHRtbCBmdWxsTmFtZX19Ij4KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtbmFtZSI+CiAgICAgIDxkaXY+PGEgaHJlZj0iJHskaXRlbS5sb2dVUkx9IyR7aWR9Ij48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBmb3JtYXRQYXJlbnROYW1lfX08L3NwYW4+e3todG1sIG5hbWV9fTwvYT48L2Rpdj4KICAgIDwvdGQ+CiAge3tlbHNlfX0KICA8dHIgdGl0bGU9Int7aHRtbCBmdWxsTmFtZX19Ij4KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtbmFtZSI+CiAgICAgIDxkaXY+PHNwYW4gY2xhc3M9InBhcmVudC1uYW1lIj57e2h0bWwgZm9ybWF0UGFyZW50TmFtZX19PC9zcGFuPnt7aHRtbCBuYW1lfX08L2Rpdj4KICAgIDwvdGQ+CiAge3svaWZ9fQogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1kb2MiPjxkaXYgY2xhc3M9ImRvYyBkZXRhaWxzLWxpbWl0ZWQiPnt7aHRtbCBkb2MoKX19PC9kaXY+PC90ZD4KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtdGFncyI+PGRpdj57e2h0bWwgdGFncy5qb2luKCcsICcpfX08L2Rpdj48L3RkPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1jcml0Ij48ZGl2Pnt7aWYgaXNDcml0aWNhbH19eWVze3tlbHNlfX1ub3t7L2lmfX08L2Rpdj48L3RkPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1zdGF0dXMiPjxkaXY+PHNwYW4gY2xhc3M9ImxhYmVsICR7c3RhdHVzLnRvTG93ZXJDYXNlKCl9Ij4ke3N0YXR1c308L3NwYW4+PC9kaXY+PC90ZD4KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtbXNnIj48ZGl2IGNsYXNzPSJtZXNzYWdlIGRldGFpbHMtbGltaXRlZCI+e3todG1sIG1lc3NhZ2UoKX19PC9kaXY+PC90ZD4KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtZWxhcHNlZCI+PGRpdj4ke3RpbWVzLmVsYXBzZWRUaW1lfTwvZGl2PjwvdGQ+CiAgICA8dGQgY2xhc3M9ImRldGFpbHMtY29sLXRpbWVzIj48ZGl2PiR7dGltZXMuc3RhcnRUaW1lfTxicj4ke3RpbWVzLmVuZFRpbWV9PC9kaXY+PC90ZD4KICA8L3RyPgo8L3NjcmlwdD4KCjwvYm9keT4KPC9odG1sPgo=';w.document.open();w.document.write(window.atob(d));w.document.close();var a=w.document.createElement('a');a.appendChild(w.document.createTextNode('Download'));a.href='data:text/html;base64,' + d;a.download='report.html';a.style='position:fixed;top:0;right:0;color:white;background:black;text-decoration:none;font-weight:bold;padding:7px 14px;border-radius:0 0 0 5px;';w.document.body.append(a);})(this);\">Report</a></p>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAANwAAADcCAYAAAAbWs+BAAAkBElEQVR4nO2deXgUVb73v7V0p5PORkhCQoJBIgl7WGRR4kDGK8iLsiiOLI7CKL68DgQBxWEWwJmrKDqA2/VRXK7e8WXGkYEZH+fVABlRYVCBQcVruKIsBpBVIOmk011V5/0jnKK6u7pTnV6quvt8nqcfQnV19anq8z2/8/udc36Hw+b3CBgMRlzgzS4Ag5FKMMExGHGECY7BiCNMcAxGHBHNLkCqU5ruQG9nBq7KzECpIw3ZoohMUUCmKCJTEOAUBWTRY0L78Vxb+8923iuhWZLQLMtolmQ0SRJcknzp/xKaJRkXJQnftbbha5cLB5tbcMzdZvIdpzZMcHEiz27D1bnZGJyTjatzstA3KxNXZWbAwXe+k5Fruyw+o7gVBQ1NLnzV1Iy9F5rwrwtN2H3+Ai54pU6Xg2Ecjg0LRJ/CNDtGdMnBkJxsDM/NxpCcLJSmO8wuVkiOtLRi74Um7D5/EXsvXMSnP1zAWY/X7GIlHUxwUSDfbsfU7oX4X4X5GJWXg6K0NLOLFBUaW93Yee48/n7qDDafOMWsYBRgguskfbKcuKW4GyZ2y8e1eblmFycubD/zA94+eRobj5/E4ZZWs4uTkDDBhUFhmh139uiO6SVFGJabbXZxTGXHufP4v40nsKHxe/zgZV1PozDBdYBTEPCTkiLMKi3C9QVdzS6OJXn7+9N4o/EE/nTse7OLYnmY4HTgOQ7XF+ThztJiTO3eDU5BMLtICcEPXi/+dOx7vP7dCfzz3Hmzi2NJmOA0FKbZMf/KHri7rBTdHckR+DCLb1wteOFII1441IiLEgu2UJjgAAzOycKi8jLc2aO72UVJOtyKgpePNOKpb4/i6+YWs4tjOiktuB917YJV/XqnTJTRbN7+/jQe+u//wVdNLrOLYhopKbiKTCdW9+uNycWFhs4nALjYFinhMfqMZELw6tFj+PVXB3GyzRPrYlmOlBJcQZod/97nKtzbs7TDc5nIOo+RZ+dWFDz+P4ew+uBhtMhyPIplCVJCcGk8j4XlZfhVxZXIFkPPPSSEgOOY1KKBEeEdc7dh2X9/jT98dxxJXxGRAoKb1r0bnuhfgZ4Z6SHPYxYtdhh5tnvOX8T8LxqwK8mHE5JWcL2c6Xh5cH+Mzc8LeR4TWvww8qzfaDyB+784gDOe5PTvkm4BqsBxWFbRC1/+eHRIsZFLzQwTW/ygzzpUCz+rtBhfXX8tZpQWx6NIcSepLFxVdhb+a9gADMzOCnqOQgCeqSwhqDt1Bnft3Y/vkyiamRQWzs7zeKTvVdg9dlRIsQFMbInEuMJ8HPi3atxdVmJ2UaJGwlu4q3Oz8cawgajIdAY9h/lpiU/dqbOY86/9OJ7gKSIS2sI92vcqfDpmVEixAUxsycC4wq746vrRuOuKxJ5+l5CCyxFFfFA9HMsqepldFEYcyRZF/OeQAXhlSH8ICTpWmnCCq8jMwGc11+C6rl1030/o/jHDEHOuKMEH1cORZ7OZXZSwSSjBTeyWj71jRqEsxCB2YrZ7jHC5Ni8X+2quQWVmhtlFCYuEEdyyil54e9RQODuYmsVIHXqkO7B7zCiMS6CV+JYXnMBx+MPQgXi071XMejECyBRF/L9rhuKeBBk6sLTgskQBH1QPx6weyTnrgBEdeI7D+sH9sXZAJXiLB1MsK7hiRxp2jxnFFocyDHN/eRneGl5ldjFCYknB9Uh3YNd1IzocX2Mw/JlaXIi6a4bBbtEpRZYTXM+MdOy6bgSu0IlEEsKC/oyOuaGwK967Zpgls61ZSnD9szLxyY9GortOHn4CsIWhDMOMzc/DttFXI8tiUW3LCO7KjHTUjx6GgjR7wHuEEBahZIREr/czsksO3r1mKGwWaqgtIbgCux3bq4ejUGcTDJbygGEEjuN0RXdtXi7+MmKwNSo6LCC4HFHEP0ZfjR563UgmNkYYBBPdTUUF+MOwgSaUKBBTBecQeLx37TD0z87UfZ+JjREuwerMjNJirBlQGefSBGKa4DgAm4YPxsguOQHvsWgkI1L06tCi8jLcX15mQmkuY5rg1g/uhxu75QccZ91IRjQI1r1c078CU4qMJQCOBaYIbllFL9xdFpiMlYX+GdFEry5xHIcNwwdhlEkzmOIuuNtKivBo36t032NSY8QDB8/jnZFDQi7zihVxFVxlZgb+c3D/eH4lg6FLnt2Gv40YHPcpYHETnFMQ8M6oocgQrTfdhpGaDMrJwnOD+sb1O+MmuD8MG4hyZ2KtzmUkP/eUlWLOFfFbSxcXwS0qL8MUg1tDMRjx5j+q+mJAkLHgaBNzwVVlZ2F1v94Bx9lYG8MqOHgeG4dXIY2Pvf2J6TdkigI2jxwMUedGWPifYSUqMp1x8ediunZh/eD+HW4TZRUkSQLP8+A4DpIkgRCC9957D3//+9/xySefoLGxEadPnwbHcVAUxeziWgI6uJyRkYFu3bphwIABqKmpwYwZM1BQUKCeAwB8HKxHpNxdVoItp8/iT8e+j9l3xCzV+R09uuO/hg6IxaVjgiRJUBQFgiDgjTfewCOPPIKDBw+C4zjIsgxBEKAoijoTJtW7xDzPq89CURRwHOfzmjNnDlauXIlu3boBAAQLLgbVo0mS0GfbjpilVI9Js9PFJuIpnYmiioUrKc/zcLvd+MlPfoKf/exnOHjwIARBgCzLsNlskC9ti0utIKMdRVF8rJeiKFAUBS+99BKGDh2K7du3m1i68MkSRfxHDLuWMRHcc4P6Ic8emBXXyhmVXC4XJkyYgM2bN6sttyzL4HletXCUVLduAFRrr7V0hBD1b47jcPbsWYwfPx5//etfzS5uWEwuLsS07t1icu2oC+7H+XmYUVoU7ctGHVphPB4Pzp8/j5tuugm7d+8G0C4oWZbV1lpRFMiyDEKI+jlGO/R5aJ8LfVayLEOWZcyYMQNvvvmm+hwTgWcG9kFODNIzRF1wr+n4bVasntSCud1u3HzzzdixYwe8Xq/aajMig4qPNmp33nknNm7cmDCiK3Kk4fH+gcNZkRLVmrWishylOiu3rdiRJITA5XJh4sSJ2LlzJ4DLETVmwaIDIUTtilPRbd68OWEatLllpeifFd0B8ajdeb7dhqVX9YzW5WJOc3MzJk2ahF27dqnHOI5TfRJGZOg1Xm1tbbjjjjvw1ltvmVWskPj/7jzH4ZmBfaL6HVET3Or+FZaemOzvs918883YtWuXepz6G9T/YEQGfYb+Y5Zerxd33HGHJX06vehzTUEexhcGLpTuLFERXN9MJ2b3sPbOlMxnM5dE9umeHlgZNbcoKjXtqUF9AloHq425MZ/NfBLVp6vIdGJ2lLY6jvhOR+fl4gad/bmsNubGfDZzSUSfTsvKyvKobHMc8UDD6v4VERciFtDpRl6vFy0tLZg8ebKPz9bRfEhRFNVZFHQAXBAEjBs3DgMGDECaTtLaVILneTQ2NqKurg5HjhxRZ+AQQmCz2dDW5js1qiOfjhCCadOm+VhBK3FFRjruKSvFC4e/i+g6EQlufGFXy24n5e+z/fOf/1R/bCqiUNDZJXTmRJ8+fbBp0yaUl5er109l6LOUZRlPPvkkli9frjZQHo+nw89rZ6fQ7iXHcZgyZQoAa869XFHZC68caYQ3gh5RRF3KR/pGf2AwWkTqs9FzFUVBZWUl3n33XfTq1Ut9L9VfVDA8z+Ohhx7CE088ofpiRhujRPPpih1pmHdlj4iu0WkLd13XXAzLzY7oy2NJMJ/N6PIaOi+wT58+qK+vR7du3Xy6RVatFPGGPoeFCxcCAB588EHDDRp9xhTq0wHAbbfdFoPSRs7Sq3ri2W+Pdnr2VKcFt6i8Z2c/GhNkWVZ/RJfLFTDO1hmfrXfv3tiyZQsKCgpUsTLaEf3mGSqKgtraWhBC8MADD0Ts03Ech6lTp/pYVStQmu7ApOJC/PXEqU59vlPNdM+MdEwpKujUF8YKarmam5sxefLksMfZqMhoV6myshJ1dXUoKUmMzdrNhlqrRYsW4fe//73POjmjPh391+PxYPr06Xj33XcDrKAVWBJBuvROCW5xeZklx90URcHixYvx4YcfAojMZ6urq0NpaSlb3W0Q7WLURYsWRezTKYqCmTNn4tChQ5axbpTrunZBVXZWpz4btuCyRBE/Kwts9a0w7lZfX49XXnlF/X8442z+PltxcbG6RIf5ax3jvwh14cKFeOKJJwCE1+DRczmOQ3NzM+bOnWs5Cwe0Z6LrDGHXpJmlRQF7J1vBunEch1/96ldqC9nR3EhRFMHzPERRVIWp9dnoe/R9RmjoOKUgCKr4amtrsXr1ap/3eZ7XHcP09+moxfzggw9QV1en+uFWWY84vaQI2Z1YLxe24BZceUXgRSxQIT/++GN89tlnhruAzGeLLZH6dDzPq+e/+OKLPrsqWUFwaQKPn/YoDvtzYQluWE52wOaJVrh5ANiyZUtYCX6YzxZbIvXpaLBLURRs27ZNTfJkpd7G/+4ZuANUR4QluHt1vsAqD+DTTz9V/2Y+m/lE6tPR83ieR3NzMxoaGtTZQ2bVOf9yD8zOwvAwx6IN1yyR4zDTwrlKTpw4AQCGW0FBENCnTx9s3bqV+WwxwN+no+N0a9euNSQ4bS4ZRVFw7tw5cBxn6pQvvXpxV5j7EhgW3E1FBcj0cxKt0Zls59SpUz4Oe0fIsozXX39dzZvIiC2CIIDjOMybNw+TJ082uzhR47Yws3sZFtys0kAH0Up2gOd5NWOykRZ0xIgRqKqqstQshmRGG+6fNWuWyaWJHoVpdvxbQZ7h8w0JzikIuElnP26rQcP7Rujbtz3ZJ1vxHR9o11AQBPTr18/s4kSVGTrGKBiGatrU7t3gsODYmxYaETOak4QKjS1AjQ+iKKrdyoyM5Non8NZi491KQ4KbpDNv0gpjbwyGFcixiajJN9atNCS4cTopFBgMxmXGFxrTSIeCq87LRY7NNzopsy4Yg+HDBIMxjg4ng92oc6FoJFNJNvy3stIGYvxnwGhXTGs/77+S2ky09wP4jkGxqG4gg7KzkG+34YzHG/K8Dn/VaCbBTGa0gRdtIEY7TEGDNP7H9QRqNnTGjXaDDjrtjU1/02eigTWiIS2cUxAwNMd33Y9/y8xoh4a86ax2r9eLjz/+GB999BH27duHEydO4Pvv23fWLCoqQnFxMQYPHozq6mqMHDkSNptNHRP03x7LDOj3ay2u0fQUqUpNfh5eO3o85DkhBTcmv0tgNJKJTRcqlq+//hpPP/003nrrLZw5c0a1Xto5gN9++y0EQcBf/vIXcByH/Px8TJs2DbW1taioqLBEg0YIwZEjR7BhwwZ88803kGUZhYWFmDp1KkaOHGl28SxJdV6XDs8JKbjrugZewPyqYA2067I4jkNTUxN++ctf4tVXX1UtHIWm5NN2FbXHTp06hRdeeAHr16/HnDlz8PDDDyM/P9/HykTbp6Pl11owusdCW1sbVqxYgWeffVa9D/r+mjVrMHHiRLz88svIzc1Vr+ef4yQVKXemI89mwzlvcD8u5K9oRLGpDBVBfX09Bg8ejPXr16vLSDpzLVmW8fLLL6OqqkpdbhQraDoDrdAURcHnn3+O0aNHY926dZAkCQACgjvvvPMOxo4di9bWVh+/lAH8uINpXqEF1zU3mmVJKmgFffHFFzFx4kR89913PkGQzlwPaK/QZ8+exeTJk/HMM89AkqSYbHbBce1ZqbUR0ZUrV6K6uhpffPGFWhZt0EQbaW1oaMDSpUsBWCPIYxVGd5AYOajghuQErvNh42+X4Xkezz//PObPn++zehzoXBTPPwQvSRIWL16MZ555JmYWhFrVvXv3Yvjw4Vi1ahXa2tp8hjZEUVStIQ0MUfG99tpraG5ujknZEhU93WgJ+ksOyg7c+TGVx9+oRaOi2rp1K5YsWQLg8p7g9N/OoL2Gtiu3dOlSbNy40ef6nRE0/Zy2y+v1evHoo49i9OjR2LdvX8B+3fR8vftTFAVtbW3YsWOHJYI8VmGgjm60BBdcTufSgCU7hBAcPnwYP/3pTyFJUswqm9Zi3nvvvTh8+HBYKSSCQT/f0NCAsWPH4re//W2nrkcH6ulQB6OdPLsNJY7gG72EZeFSGW2OjmXLlqkrkGM1LqkdeG5tbUVtba3alevM99HIqdfrxVNPPYURI0Zg9+7dhrJS60HvPT8/n1k4P0JZuRCCYxZOC00T8Omnn+LPf/6zz/FYBA20g8yyLOPdd9/Fjh07Ov1dgiDg8OHDqKmpwQMPPICWlhYAvjNewoXneVxzzTVsMNyPgSG0oyu4HJuIwjS7z7FUD5hQS/bkk0+q6+5kWQ46DECjf9q8HtQ66R33h+b00K7xe+yxx9Rrd4Q2H4gsy3j++ecxatQo7N69W7VO9LpGBEPLrJ11MnPmTOTl5TEL58dVzuDr/XQF1ysjPfAge6g4d+4c3n77bcMVzL/Lqe0Ohtsd5TgOW7duxfHjoacOUei1Dx06hOuvvx5LlizBhQsX1PfCRfsZQghKS0uxevVqNajCuEwvp45+LqEruJ46grPe9njxheM4NVoY7ucAoKCgAFOmTMEtt9yC7t27+7xnFEIINm/ebDjv5qZNmzBkyBB88MEH6phbJN1HyqBBg1BXV4f8/HzYbDbWpfRDTz8UXcFdGeIDqcz7779vuNJSn4/neTz99NM4evQo3nzzTfzxj3/EN998g6efftrnHKNs3brVkFB37dqFWbNmweVy+VjVSMQhCAJWrFiBPXv2oKLi8lbTbFqXLz3THUHf031STHCBcByH/fv3BwxyB4OGzV944QXMnj3bRySCIGDevHnIyclR97c2AiEE+/btC/p9WhYsWKDOgzQiMu1gt7YRoCIdMmQIXnrpJQwYMEA9bvaKBqsi8jxKHGk45m4LeE+3aS0NodBUhRCCb7/91rCVIIRg1KhRuOuuu4Kef/vtt+O6664LqxyNjY26AtVa3i+//FIdyAZgyIJqJ2ID8JlZ8sADD+D9999Xs22xuZMdUxJEQ7pPrsAvQslop7W1FYCxCsfzPMaNGxf0fFrBb7755rB8OY7j1CzTet/JcRz27NkDQtp3Hg3HZ6Nr8YD2oYjKykps374dq1atQnp6uqU207A6BXab7nHdmpMf5ORUxj+6aIQePdo3YNezcPQaXbsaSz5Dzw82DKHd5omWk86ECWdzE47jYLfbsXjxYuzbtw8jR45Uu9DaoQ1GaLra9Y2Wrg+XH+TkVIbjOOTk5KCpqcnHEmjf11oynueRnZ0ddC0brbTFxcU+69FEUQw6X1IQBKSnp6O4ODDxqHZP7ZycHPXvYNPBtH6odqV6z5498eqrr2LMmDEB380wTtdwLFyeX5YuqyV9NQOv14tJkyYF9ceob0crsd1ux4QJEwDod8FoBR8zZgyystpnJvA8r4bv9a4vyzImTJgQ9H36Pddffz0cDkfIvRao4KjYCCGYP38+9u7dG7ZfyQgkLMH5/6BslKU99L1o0SKkpaUFDVoAl8W1YMECpKenB51JQhduOhwOLFq0SK30VAB6109LS8PSpUt1RURnpfA8D6fTidra2pC7hcqyrC69ueKKK7BlyxasXbvWZxU3o/Pk2QwKrostsJfJscQKUBQFVVVVQbdbosMANpsNo0ePxu9+97uQ6+OohVMUBQ899BBuu+021UoFO/+JJ55AVVVVUEFqfa0VK1aguro66P1Q0d5111347LPPMHbsWADBfURGeOQHCTwGCE5vziTzkS/7Offccw/efvttVFZWql02mjff6XTi/vvvR319vU8ufT3/R/s5u92O119/HcuXL0dmZqaawYuec+WVV2LDhg2YN29e0C4iDWbQlyiK2Lp1Kx588EHY7XbVylKL26tXL2zcuBEvvvginE6nOleS7pHHiIxgXcqAJyvr9ECY3i532QRBwI033ogbbrgBH330Efbv3w+Xy4WKigqMHj0ahYWFnYriiaKI3/zmN5g/fz62bduGhoYGpKeno6qqCjU1Neo5RjeVp93TRx99VB1HO3DgABwOB66++mpce+21PoEWRnQJQ3A6Fi765UlI/CN7NTU1qKmpCdh1lQozHGjF79KlC6ZNm6Y7o0Xr5xmBliMvLw+33nprgLBYeD92dDXqw6X6MpxQ+M/GoALwz6bcmYrsn1KcdmGp6GgUlOYhMXI9QRB8ZvNrl9bQskayHo4RHMPjcF5CoCCMrVFThI5ml0RqLfyX7gCXx778fSojFo6eY9Npadk8yNhj5/Xrg24t8rAoFYMRER5Fv9fABMdgxIC2IBoKIjjWp2cwIiGY0WIWjsGIAWFZOLfMBMdgREJrkEiyruB+CLH7B4PB6JgfvJLucV3Bne1g21QGgxGaMx6P7nEmOAYjBgTb6zuI4PTVyWAwjHGmLQwLd4b5cAxGRJwOx8Ida3XHtDAMRrLTGERDugufDre0xrQwiQjduYauDNAu9vRfLZCsaCc5a58FwFLn+XMoiIaY4AxChaVdkS1JEnbu3InDhw8nveBog5Obm4uamho4nU51RUOy33tnOORq0T2uK7hDLe6AB5nqD5ZaM57nIUkSNmzYgF/84hc4ceKEugwmmaEWnRACh8OB++67Dw8//DAyMjLY8h4/ZEJwIpygiUwIjvt9IJXFBlxe6yZJElauXInZs2erO9nQbZ+S+UUtHCEEbrcba9euxYQJE9Dc3MwE58fBINYNAHi4mqH3OnDhYhyLaH1og7Nt2zY8/vjjPnurpUrSHbrwlfZ2du7ciWXLlqV8Y+zPgfMXdTUFVzN4nDoJvdcXx/XTaacqdIHo8uXLzS6KJaCNzPr169HY2GhyaazF58eO62oKp05CJPf/H7PLlxAQQnD27Fns3r3b7KJYAhqllGUZ27Ztw5w5c8wukmX49chh+PXIYbrvsVhuGDQ0NOimLEhFtCkhjh49anJpEgcmuDBwOp2QJImNOQFqQiOaO5NhDFZzwqBv376ws41OAPgOEwwdOtTs4iQMTHAGURQFdrsdM2fONLsoloCKraioKGCnHUZwmOAMQtOaL1++HF26dDG7OKZD/bdnn30WDgfbMdcoTHBhoCgKiouL8dZbb6GkpETN7yiKYkBu/2R7UX9NO3dy7dq1mDp1Khv4DgMmOINod8eprq7Gnj17sGTJEnWX02SHjrtlZWVh+vTp+OSTT3DfffepM1AYxmDhJYP4pzcvLCzEY489hlWrVqVMFmNqyei8UrpJJLNwxmGCCwP/vQW0Y1HJjvbetfvYpdIziAZMcAYJtU93KuB/r6l079GE+XAMRhxhgmMw4ggTHIMRR5JGcIQQdU6fEf+CbmzINiSMD3RYweiWyclKUgmOTqg1Iji6hivVK0C84DhO3Y21oaHB7OKYRtIIjs6GMLoCe8eOHTh16pT6WUZskWUZgiCA4zj87W9/M7s4ppE0gsvOzlaXzhgRUGtrK+bNm8csXJygkwP+8Y9/4LXXXjO5NOaRNIIrKChQl4wY5Z133sGMGTPU7o4syz6b0DM6D10NTl8cx+Gjjz7ClClT4DWQ2Vs7f1MQBGRkZABAwv82SSO4QYMGhfVjUEu4adMm3H777ZAkSbWMcpC9vRjGoYmG6L/bt2/HpEmT4HK5DF+Dfl4QBPTt29cnAW+ikjSCmzBhQsCM9lDQH00QBGzatAl33nknvF6v4c8zQkPFAgA7d+7ElClTcPHixbCmglGxVldXw+l0qt3/RP59kkZwY8eORWFhoeG049oWWFEUbNy4EbNmzWKz36MEfb67du3CjTfeiKamJp/AVkdoBTt79mz1N0n4lIQkSfB6veS5554jAIggCEQQBMJxHOE4jgiCQACEfHEcR3ieJ7fccguRZZl4vV4iSRLxer1EURSzb8/yyLJMJElSX4qikO3bt5PMzExDz9//xfM8EQSBlJeXE4/HY/btRY2ksXA8z2Pu3LkYNWqUz2C2UWvFfLrIIFHw2fyx2WxYv359Ui1/ShrB0R9648aNKCoqAnB5KYmRbghhPl1ERMNn00IIweOPP44f/ehHCR0kCcA02xplFEVRu4H79+8nJSUlRBRFwnGcoS4Mx3FEFEW1K8rzPLn11luJx+MhsiybfXuWR5IkIssy+fDDD4nT6SQ8zxOe54koioTn+bC7lOvWrVOvKUmS2bcXNZJGcP58/vnnpLi4OKo+ndfrJbIsE0VRUv5FxaA9FonPRp83z/Nk3bp1ZlefmJE0XUp/+vfvj23btqGkpMRnNklnfTrtROeEj5RFAW3EkRASsc9Gr7VmzRosWLAgyqW1DkkrOADo3bs3tmzZguLiYgCR+XR0yIAk+DhQtKCNDyEE9fX1UfHZ1q1bhwULFiSXz+YHR5L07rRbBB84cADjx4/HyZMnDSe94S6lwKMWjed5lJWV4e6770b37t3jcAfWhlzaJ66+vh6bNm1Sn2k4E8i1ULEByZ0rJmkF588XX3yB8ePHqzuWApcHUenaOEb80IpqzZo1WLhwocklig9J3aXUEqlPx4guqeKz+ZMyggMi8+kY0SVVfDZ/UkZw5FLy0t69e6Ourg7FxcU+UTZGfNFatlTa/itlfDh/mE8XX1LVZ/MndZoWP5hPF19S1WfzJ2UFBzCfLp6kqs/mT8oKjvl08SVVfTZ/UtaH82f//v0YN24cTp48qfpwdAY8e0QdQ1Mf0EaL/stxHNauXYva2lqzi2gJUrep8aNfv37Yvn07+vfvD+BynstknvUQbbQbOALt69meffZZ/PznPze5ZNaBCe4SkiShvLwcH374IWpra2Gz2dQJukxwxqCZugghqKqqQn19PebOnZvSXUh/WJfyEtpcJoQQHDt2DK+88go2b96M/fv3s2GCDhAEAV26dMH48eMxffp0TJgwwWdRajKt2o4EJrggaIcJXC6XmqWZoY/D4UC3bt18dkdlBMIEFwTqv9EKxAiNthqxZxYcJrgg+Fcg1mKHRtt9ZM8qOKwZ6gAmNmP4+8AMfZiFYzDiCLNwDEYcYYJjMOIIExyDEUeY4BiMOMIEx2DEESY4BiOOMMExGHGECY7BiCNMcAxGHGGCYzDiCBMcgxFHmOAYjDjCBMdgxBFxxyd7zC5DUERRQL+K3sjKdJpdFEYCcPL0GRw8dMTsYoSE+9eXDZZensMBKCvtjtzsLLOLwrAohADHT53C6bM/mF2UDhGdzkyzy9Ahp3+4CIUQ5OVkm10UhsVQFAXHT59Dq9uLRKjLYlpamtllMERzqwcKaULXnEy2ApsBAJBk+VJjDCRKPeaOnf7B0l1Kf2yigLxsJ4QgSWpYSoTUoM0r4dxFV8KlcxATrXJKsoIz55uRl+2ETQzMdZho98MIH5e7DRddbgCJ93sn5LCAQgjOXnTB1dpmdlEYcYQQgvPNrarYEhHR7AJ0FkIILra44fZKyM1MD9rFZCQHbR4vLrjckBN8K7GEr6Uer4TT55vhcjNrl4wohOCCqxXnmloSXmxAAls4LYQQXHS50drmRW5mBkQh4dsRBgC3x4sLza1QEiwwEoqkqpleScaZC01oZr5dQqMoBOebW/BDU0tSiQ1IEgunhRCgqcUNt8eLHGe6biSTYV1a2jxocrmTTmiUpBMcpd3aNSPDYUdWugM8n1jh41TD45VwscUNr5Tc24IlreAoLW4PWtu8yExPg9ORhgQbtkl6ZEVBU0u7/50KJL3ggPagSlOLGy1tHmSlO5CeZjO7SCkPIQTNrW0p52+nhOAosqzgfHMLXK0Csp0O2G0pdfuWgABouSS0ZPXTQpGSNc4ryzh70QWH3YasDAcbRogTbo8XTS1uSHLij6d1lpQUHMXt8cLt8SLNLiIjzQ6HnXU1ow0hBC63By1uT1IMXEdKSguO0uaR0OaRIAo8Mhx2ZKTZE25SrNWQZBmuSwGrRJvRH0u442fOs6fhBwfAkWaDw25jVi8MFIWgtc2DVo836cP7nYVZOB0IgNY2L1rbvOA5DhmO9u4mG0QPhBDA7fHA7ZHg9qRGaD8SmOA6QNGEr0WBh8NuQ0aaHUKKB1ravO0CY13G8GBdyk5it4lIs4lw2EWIQmpYvjaPhDavhFaPFwoLgHQKZuE6iccrweOV0NQCCJcsX5pNhF0UkibgIskKPJKkCo1ZsshhgosCsqzA1dqmrkAXBR42UYAoCLCJ7S/e4iKUZBleSYYkK/BKMjySzAQWA5jgYoAkK5cGdy8HEQSeivCyGM0YcCeEwCsrkDTi8spMXPGCCS5OyIoC2RPo94gCD1EQIAg8eI4Dx7UnxuHA+f5f8ze1lgohIOpL//9AewMgywokRYaiMGGZCROcyVy2hoxUILVj2wxGnGGCYzDiCBMcgxFHmOAYjDjy/wH/VF0AOheLQQAAAABJRU5ErkJggg=="
     },
     "metadata": {
      "image/png": {
       "height": 220,
       "width": 220
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "*** Test Cases ***\n",
    "\n",
    "Show the new Robot Framework logo\n",
    "    Open url  https://twitter.com/robotframework\n",
    "    Page should contain  Robot Framework\n",
    "    Capture and crop page screenshot  robotframework.png\n",
    "    ...  css=.ProfileAvatar-image "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<p><a href=\"javascript:(function(el){var w=window.open();var d='PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJQcmFnbWEiIGNvbnRlbnQ9Im5vLWNhY2hlIj4KPG1ldGEgaHR0cC1lcXVpdj0iRXhwaXJlcyIgY29udGVudD0iLTEiPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgo8bWV0YSBjb250ZW50PSJSb2JvdCBGcmFtZXdvcmsgMy4xIChQeXRob24gMy42Ljggb24gbGludXgpIiBuYW1lPSJHZW5lcmF0b3IiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBRUFJQUJvQkFBQUZnQUFBQ2dBQUFBUUFBQUFJQUFBQUFFQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLY0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQXFBQUFBQUFBQUFBQUFBQUFBQUFBQUxJQUFBRC9BQUFBNEFBQUFOd0FBQURjQUFBQTNBQUFBTndBQUFEY0FBQUEzQUFBQU53QUFBRGNBQUFBNEFBQUFQOEFBQUN4QUFBQUFBQUFBS1lBQUFEL0FBQUF1d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQy9BQUFBL3dBQUFLa0FBQUQ2QUFBQXpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU44QUFBRC9BQUFBK2dBQUFNTUFBQUFBQUFBQUFnQUFBR3NBQUFCckFBQUFhd0FBQUdzQUFBQnJBQUFBYXdBQUFHc0FBQUJyQUFBQURBQUFBQUFBQUFEYUFBQUEvd0FBQVBvQUFBRERBQUFBQUFBQUFJc0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFORUFBQUFBQUFBQTJnQUFBUDhBQUFENkFBQUF3d0FBQUFBQUFBQUFBQUFBTWdBQUFESUFBQUF5QUFBQU1nQUFBRElBQUFBeUFBQUFNZ0FBQURJQUFBQUZBQUFBQUFBQUFOb0FBQUQvQUFBQStnQUFBTU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGFBQUFBL3dBQUFQb0FBQUREQUFBQUFBQUFBRHdBQUFCOEFBQUFBQUFBQUdBQUFBQmNBQUFBQUFBQUFIOEFBQUJLQUFBQUFBQUFBQUFBQUFBQUFBQUEyZ0FBQVA4QUFBRDZBQUFBd3dBQUFBQUFBQURDQUFBQS93QUFBQ2tBQUFEcUFBQUE0UUFBQUFBQUFBRDdBQUFBL3dBQUFMQUFBQUFHQUFBQUFBQUFBTm9BQUFEL0FBQUErZ0FBQU1NQUFBQUFBQUFBSXdBQUFQNEFBQUQvQUFBQS93QUFBR0FBQUFBQUFBQUFBQUFBQU1rQUFBRC9BQUFBaWdBQUFBQUFBQURhQUFBQS93QUFBUG9BQUFEREFBQUFBQUFBQUFBQUFBQUlBQUFBY0FBQUFCa0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFZ0FBQUFBQUFBQUFBQUFBMmdBQUFQOEFBQUQ3QUFBQXl3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU40QUFBRC9BQUFBcXdBQUFQOEFBQUN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTElBQUFEL0FBQUFzZ0FBQUFBQUFBQzVBQUFBL3dBQUFNb0FBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNa0FBQUQvQUFBQXZBQUFBQUFBQUFBQUFBQUFBQUFBQUt3QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBclFBQUFBQUFBQUFBd0FNQUFJQUJBQUFmK0FBQVAvd0FBRC84QUFBZ0JBQUFQL3dBQUQvOEFBQS8vQUFBSkl3QUFESEVBQUEvL0FBQVAvd0FBQi80QUFDQUFRQUF3QU1BQUE9PSI+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+Ci8qIEdlbmVyaWMgYW5kIG1pc2Mgc3R5bGVzICovCmJvZHkgewogICAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICBjb2xvcjogYmxhY2s7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQp0YWJsZSB7CiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDFlbTsKfQp0aCwgdGQgewogICAgdmVydGljYWwtYWxpZ246IHRvcDsKfQpiciB7CiAgICBtc28tZGF0YS1wbGFjZW1lbnQ6IHNhbWUtY2VsbDsgLyogbWFpbnRhaW4gbGluZSBicmVha3MgaW4gRXhjZWwgKi8KfQpociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KYSwgYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6ICMxNWM7Cn0KYSA+IGltZyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTVjICFpbXBvcnRhbnQ7Cn0KYTpob3ZlciwgYTphY3RpdmUgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICBjb2xvcjogIzYxYzsKfQoucGFyZW50LW5hbWUgewogICAgZm9udC1zaXplOiAwLjdlbTsKICAgIGxldHRlci1zcGFjaW5nOiAtMC4wN2VtOwp9Ci5tZXNzYWdlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQovKiBIZWFkZXJzICovCiNoZWFkZXIgewogICAgd2lkdGg6IDY1ZW07CiAgICBoZWlnaHQ6IDNlbTsKICAgIG1hcmdpbjogNnB4IDA7Cn0KaDEgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBtYXJnaW46IDAgMCAwLjVlbSAwOwogICAgd2lkdGg6IDc1JTsKfQpoMiB7CiAgICBjbGVhcjogbGVmdDsKfQojZ2VuZXJhdGVkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLyogRG9jdW1lbnRhdGlvbiBoZWFkZXJzICovCi5kb2MgPiBoMiB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9Ci5kb2MgPiBoMyB7CiAgICBmb250LXNpemU6IDEuMWVtOwp9Ci5kb2MgPiBoNCB7CiAgICBmb250LXNpemU6IDEuMGVtOwp9Ci8qIFN0YXR1cyB0ZXh0IGNvbG9ycyAtLSAhaW1wb3J0YW50IGFsbG93cyB1c2luZyB0aGVtIGluIGxpbmtzICovCi5mYWlsIHsKICAgIGNvbG9yOiAjZjMzICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoucGFzcyB7CiAgICBjb2xvcjogIzM5MyAhaW1wb3J0YW50Owp9Ci5sYWJlbCB7CiAgICBwYWRkaW5nOiAycHggNXB4OwogICAgZm9udC1zaXplOiAwLjc1ZW07CiAgICBsZXR0ZXItc3BhY2luZzogMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KLmxhYmVsLmRlYnVnLCAubGFiZWwudHJhY2UsIC5sYWJlbC5lcnJvciwgLmxhYmVsLmtleXdvcmQgewogICAgbGV0dGVyLXNwYWNpbmc6IDA7Cn0KLmxhYmVsLmVycm9yLCAubGFiZWwuZmFpbCwgLmxhYmVsLnBhc3MsIC5sYWJlbC53YXJuIHsKICAgIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoubGFiZWwuZXJyb3IsIC5sYWJlbC5mYWlsIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOTUzNGY7Cn0KLmxhYmVsLnBhc3MgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzVjYjg1YzsKfQoubGFiZWwud2FybiB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWM5NzFmOwp9Ci8qIFRvcCByaWdodCBoZWFkZXIgKi8KI3RvcC1yaWdodC1oZWFkZXIgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgcmlnaHQ6IDA7CiAgICB6LWluZGV4OiAxMDAwOwogICAgd2lkdGg6IDEyZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KI3JlcG9ydC1vci1sb2ctbGluayBhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogYmxhY2s7CiAgICBjb2xvcjogd2hpdGU7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKICAgIHBhZGRpbmc6IDAuM2VtIDA7CiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7Cn0KI3JlcG9ydC1vci1sb2ctbGluayBhOmhvdmVyIHsKICAgIGNvbG9yOiAjZGRkOwp9CiNsb2ctbGV2ZWwtc2VsZWN0b3IgewogICAgcGFkZGluZzogMC4zZW0gMDsKICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiAjZGRkOwp9Ci8qIFN0YXRpc3RpY3MgdGFibGUgKi8KLnN0YXRpc3RpY3MgewogICAgd2lkdGg6IDY1ZW07CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBtYXJnaW4tYm90dG9tOiAxZW07Cn0KLnN0YXRpc3RpY3MgdHI6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Y0ZjRmNDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQouc3RhdGlzdGljcyB0aCwgLnN0YXRpc3RpY3MgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwp9Ci5zdGF0aXN0aWNzIHRoIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICBwYWRkaW5nOiAwLjJlbSAwLjNlbTsKfQouc3RhdGlzdGljcyB0ZCB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9Ci5zdGF0cy1jb2wtc3RhdCB7CiAgICB3aWR0aDogNC41ZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLnN0YXRzLWNvbC1lbGFwc2VkIHsKICAgIHdpZHRoOiA1LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc3RhdHMtY29sLWdyYXBoIHsKICAgIHdpZHRoOiA5ZW07Cn0KdGguc3RhdHMtY29sLWdyYXBoOmhvdmVyIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQouc3RhdC1uYW1lIHsKICAgIGZsb2F0OiBsZWZ0Owp9Ci5zdGF0LW5hbWUgYSwgLnN0YXQtbmFtZSBzcGFuIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci50YWctbGlua3MgewogICAgZm9udC1zaXplOiAwLjllbTsKICAgIGZsb2F0OiByaWdodDsKICAgIG1hcmdpbi10b3A6IDAuMDVlbTsKfQoudGFnLWxpbmtzIHNwYW4gewogICAgbWFyZ2luLWxlZnQ6IDAuMmVtOwp9Ci8qIFN0YXRpc3RpY3MgZ3JhcGggKi8KLmdyYXBoLCAuZW1wdHktZ3JhcGggewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHdpZHRoOiBhdXRvOwogICAgaGVpZ2h0OiA3cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYmFja2dyb3VuZDogI2YzMzsKfQouZW1wdHktZ3JhcGggewogICAgYmFja2dyb3VuZDogI2VlZTsKfQoucGFzcy1iYXIsIC5mYWlsLWJhciB7CiAgICBmbG9hdDogbGVmdDsKICAgIGhlaWdodDogMTAwJTsKfQoucGFzcy1iYXIgewogICAgYmFja2dyb3VuZDogIzFkNDsKfQovKiBUYWJsZXNvcnRlciAtIGFkYXB0ZWQgZnJvbSBwcm92aWRlZCBCbHVlIFNraW4gKi8KLnRhYmxlc29ydGVyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQ3dBSkFJQUFBSDkvZndBQUFDSDVCQUVBQUFFQUxBQUFBQUFMQUFrQUFBSVJqQU9uQnIzY25JcjBXVWpUckM5ZTlCUUFPdz09KTsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgcmlnaHQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLnRhYmxlc29ydGVyLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Ci50YWJsZXNvcnRlci1oZWFkZXJBc2MgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBS0VBQUFBQUFIOS9md0FBQUFBQUFDSDVCQUVBQUFJQUxBQUFBQUFMQUFrQUFBSVVsQlduRnIzY25JcjBXUU95Qm12enAxM0NweFFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjICFpbXBvcnRhbnQ7Cn0KLnRhYmxlc29ydGVyLWhlYWRlckRlc2MgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBS0VBQUFBQUFIOS9md0FBQUFBQUFDSDVCQUVBQUFJQUxBQUFBQUFMQUFrQUFBSVVsQVduQnIzY25JcjBXUk95RG12enAxM0NweFFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjICFpbXBvcnRhbnQ7Cn0KLnNvcnRlci1mYWxzZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5zb3J0ZXItZmFsc2U6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgovKiBJY29ucyBhcmUgZnJvbSBPcGVuIEljb25pYyA8aHR0cHM6Ly91c2VpY29uaWMuY29tL29wZW4vPi4KICAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiAqLwovKiBDb250YWluZXJzICovCi5zdWl0ZSwgLnRlc3QsICNlcnJvcnMgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHBhZGRpbmc6IDAuM2VtIDAuMmVtOwogICAgbWFyZ2luOiAwLjJlbSAwOwp9Ci50ZXN0IHsKICAgIGJvcmRlci1zdHlsZTogZGFzaGVkOwp9CiNlcnJvcnMsIC5tZXNzYWdlcywgLm1ldGFkYXRhIHsKICAgIHdpZHRoOiAxMDAlOwogICAgYm9yZGVyLXNwYWNpbmc6IDA7Cn0KLmNoaWxkcmVuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBtYXJnaW4tbGVmdDogMS40ZW07Cn0KLnN1aXRlLCAudGVzdCwgLmtleXdvcmQgewogICAgbWFyZ2luLWxlZnQ6IC0wLjJlbTsKfQojczEsIC5zdWl0ZSA+IC5jaGlsZHJlbiA+IC5rZXl3b3JkIHsKICAgIG1hcmdpbi1sZWZ0OiAwOwp9Ci8qIFN1aXRlLCB0ZXN0IGFuZCBrdyBoZWFkZXJzICovCi5lbGVtZW50LWhlYWRlciB7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQouZWxlbWVudC1oZWFkZXI6aG92ZXIgewogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKICAgIGJvcmRlci1jb2xvcjogI2NjYzsKfQouZWxlbWVudC1oZWFkZXItdG9nZ2xlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDNweDsKICAgIHRvcDogNXB4OwogICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFZQUFBQUdDQVFBQUFCS3hTZkRBQUFBQW1KTFIwUUEvNGVQekw4QUFBQUpjRWhaY3dBQUN4TUFBQXNUQVFDYW5CZ0FBQUFIZEVsTlJRZmVDUjBKQ2hTa1p6MjBBQUFBR2tsRVFWUUkxMk5nUUFLTURLekluUDhJRGhPcU1rNEc3QUFBTlF3QkU0MjdQWVVBQUFBQVNVVk9SSzVDWUlJPSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0k0SWlCb1pXbG5hSFE5SWpnaUlIWnBaWGRDYjNnOUlqQWdNQ0E0SURnaVBnb2dJRHh3WVhSb0lHUTlJazB3SURCMk1tZzRkaTB5YUMwNGVpSWdkSEpoYm5ObWIzSnRQU0owY21GdWMyeGhkR1VvTUNBektTSWdMejRLUEM5emRtYyspLCBub25lOwogICAgaGVpZ2h0OiAxMHB4OwogICAgd2lkdGg6IDEwcHg7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDZweCA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9Ci5jbG9zZWQgPiAuZWxlbWVudC1oZWFkZXItdG9nZ2xlIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFZQUFBQUdDQVFBQUFCS3hTZkRBQUFBQW1KTFIwUUEvNGVQekw4QUFBQUpjRWhaY3dBQUN4TUFBQXNUQVFDYW5CZ0FBQUFIZEVsTlJRZmVDUjBKQ0RIZFZZdHhBQUFBTTBsRVFWUUkxMDNNTVFxQU1CUUZ3Vkh5SVRhQjNQK1cxc0t6U0JDM21XNmhSRncwcFVCNUR2RjFidTlGTjBSTTNYL3dBazk4Q1VudkZUYWtBQUFBQUVsRlRrU3VRbUNDKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMHpJREIyTTJndE0zWXlhRE4yTTJneWRpMHphRE4yTFRKb0xUTjJMVE5vTFRKNklpQXZQZ284TDNOMlp6ND0pLCBub25lOwp9Ci5lbGVtZW50LWhlYWRlcjpob3ZlciA+IC5lbGVtZW50LWhlYWRlci10b2dnbGUgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQouZWxlbWVudC1oZWFkZXItcmlnaHQ6aG92ZXIgfiAuZWxlbWVudC1oZWFkZXItdG9nZ2xlIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50Owp9Ci5lbGVtZW50LWhlYWRlci1sZWZ0IHsKICAgIHBhZGRpbmc6IDNweCA4MHB4IDNweCAyMHB4Owp9Ci5lbGVtZW50LWhlYWRlci1yaWdodCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICByaWdodDogMDsKICAgIHRvcDogMDsKICAgIHBhZGRpbmc6IDNweDsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoubmFtZSB7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQouZWxhcHNlZCB7CiAgICBmbG9hdDogcmlnaHQ7CiAgICBjb2xvcjogIzk5OTsKICAgIHBhZGRpbmctbGVmdDogMWVtOwp9Ci5saW5rIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFnQUFBQUlDQVlBQUFERUQ3NkxBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUxFd0FBQ3hNQkFKcWNHQUFBQUhsSlJFRlVHSlZ0enJFSndtQVFCdENuNkFTdUlLVElCaFkyZ21naEJpSllCMXVkd2sxMEI4RkpiS01CY1FGYnRia2ZKSHJWd2Z1KzQvaWRKUjY0WTlIN0UzaGlnajVPM1M4WTQ0QXBMbmpoblhDTkdoVjJ5TkdnZ0RKd2lDMDJnYXZVYnBERnZzY1JvNFFkWE9NS0RIQnVmejNITFlLek5uNEFiU2tWM2ZuY0dRWUFBQUFBU1VWT1JLNUNZSUk9KTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMDFMamc0TGpBell5MHVNVGd1TURFdExqTTJMakF6TFM0MU15NHdPUzB1TWpjdU1TMHVOVE11TWpVdExqYzFMalEzWVM0MUxqVWdNQ0F4SURBZ0xqWTVMalk1WXk0eE1TMHVNVEV1TWpRdExqRTNMak00TFM0eU1pNHpOUzB1TVRJdU56Z3RMakEzSURFdU1EWXVNakl1TXprdU16a3VNemtnTVM0d05DQXdJREV1TkRSc0xURXVOU0F4TGpWakxTNDBOQzQwTkMwdU9DNDBPQzB4TGpBMkxqUTNMUzR5TmkwdU1ERXRMalF4TFM0eE15MHVOREV0TGpFellTNDFMalVnTUNBeElEQXRMalV1T0RoekxqTTBMakl5TGpnMExqSTFZeTQxTGpBeklERXVNaTB1TVRZZ01TNDRNUzB1Tnpoc01TNDFMVEV1TldNdU56Z3RMamM0TGpjNExUSXVNRFFnTUMweUxqZ3hMUzR5T0MwdU1qZ3RMall4TFM0ME5TMHVPVGN0TGpVekxTNHhPQzB1TURRdExqTTRMUzR3TkMwdU5UWXRMakF6ZW0wdE1pQXlMak14WXkwdU5TMHVNREl0TVM0eE9TNHhOUzB4TGpjNExqYzFiQzB4TGpVZ01TNDFZeTB1TnpndU56Z3RMamM0SURJdU1EUWdNQ0F5TGpneExqVTJMalUySURFdU16WXVOeklnTWk0d05pNDBOeTR5TnkwdU1TNDFNeTB1TWpVdU56VXRMalEzWVM0MUxqVWdNQ0F4SURBdExqWTVMUzQyT1dNdExqRXhMakV4TFM0eU5DNHhOeTB1TXpndU1qSXRMak0xTGpFeUxTNDNPQzR3TnkweExqQTJMUzR5TWkwdU16a3RMak01TFM0ek9TMHhMakEwSURBdE1TNDBOR3d4TGpVdE1TNDFZeTQwTFM0MExqYzFMUzQwTlNBeExqQXpMUzQwTkM0eU9DNHdNUzQwTnk0d09TNDBOeTR3T1dFdU5TNDFJREFnTVNBd0lDNDBOQzB1T0RoekxTNHpOQzB1TWkwdU9EUXRMakl5ZWlJS0lDQXZQZ284TDNOMlp6ND0pLCBub25lOwp9Ci5leHBhbmQgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQWdBQUFBSUNBWUFBQURFRDc2TEFBQUFCSE5DU1ZRSUNBZ0lmQWhraUFBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBRHRKUkVGVUdKVmpZQ0FDS0RBd01CeUEwbGpGRGpBd01QeG5ZR0I0QUJWUWdMTC9RK1ZRQkI2Z3NlR21JaXZDa0VSWGhGVVNXUkZPU2F3QUFFbDdFM3V2MWlNY0FBQUFBRWxGVGtTdVFtQ0MpOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJNElpQm9aV2xuYUhROUlqZ2lJSFpwWlhkQ2IzZzlJakFnTUNBNElEZ2lQZ29nSUR4d1lYUm9JR1E5SWsweExqVWdNR3d0TVM0MUlERXVOU0EwSURRZ05DMDBMVEV1TlMweExqVXRNaTQxSURJdU5TMHlMalV0TWk0MWVpSWdkSEpoYm5ObWIzSnRQU0owY21GdWMyeGhkR1VvTUNBeEtTSWdMejRLUEM5emRtYyspLCBub25lOwp9Ci5jb2xsYXBzZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBZ0FBQUFJQ0FZQUFBREVENzZMQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFMRXdBQUN4TUJBSnFjR0FBQUFDNUpSRUZVR0pWallDQVJORUF4VHNuL1VJeWhDRmtTUXhHNlRoUStDNUlwaldoRzF5TmI0WURGVGRqRU1BRUFDaThRKys5WTlUQUFBQUFBU1VWT1JLNUNZSUk9KTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMDBJREJzTFRRZ05DQXhMalVnTVM0MUlESXVOUzB5TGpVZ01pNDFJREl1TlNBeExqVXRNUzQxTFRRdE5Ib2lJSFJ5WVc1elptOXliVDBpZEhKaGJuTnNZWFJsS0RBZ01Ta2lJQzgrQ2p3dmMzWm5QZz09KSwgbm9uZTsKfQouZXhwYW5kLCAuY29sbGFwc2UsIC5saW5rIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgZGlzcGxheTogYmxvY2s7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICBtYXJnaW46IDAgNHB4OwogICAgaGVpZ2h0OiAxNHB4OwogICAgd2lkdGg6IDE0cHg7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDhweCA4cHg7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQoubGluayB7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDEwcHggMTBweDsKfQouZWxlbWVudC1oZWFkZXI6aG92ZXIgYSB7CiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwp9Ci5leHBhbmQ6aG92ZXIsIC5jb2xsYXBzZTpob3ZlciwgLmxpbms6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQovKiBNZXNzYWdlcyBhbmQgZXJyb3JzICovCi5tZXNzYWdlcyAudGltZSwgLm1lc3NhZ2VzIC5tZXNzYWdlIHsKICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICBmb250LXNpemU6IDEuMWVtOwp9CiNlcnJvcnMgLm1lc3NhZ2UgewogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMS4yZW07Cn0KLm1lc3NhZ2Utcm93IHsKICAgIGhlaWdodDogMjBweDsKfQoudGltZSB7CiAgICB3aWR0aDogNy41ZW07Cn0KLmVycm9yLXRpbWUgewogICAgd2lkdGg6IDExZW07CiAgICBmb250LXNpemU6IDAuOWVtOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoubGV2ZWwgewogICAgd2lkdGg6IDVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc2VsZWN0LW1lc3NhZ2UgewogICAgd2lkdGg6IDI0cHg7Cn0KLnNlbGVjdC1tZXNzYWdlID4gZGl2IHsKICAgIGZsb2F0OiByaWdodDsKICAgIG1hcmdpbi1yaWdodDogMnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgd2lkdGg6IDE2cHg7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDEycHggMTJweDsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7Cn0KLm1lc3NhZ2Utcm93OmhvdmVyIC5zZWxlY3QtbWVzc2FnZSBkaXYgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQXdBQUFBTUNBUUFBQUQ4ZkpSc0FBQUFBbUpMUjBRQS80ZVB6TDhBQUFBSmNFaFpjd0FBQ3hNQUFBc1RBUUNhbkJnQUFBQUhkRWxOUlFmZUNSME1PemhXS1pRT0FBQUFTVWxFUVZRWTAzMlBzUkhBSUF3RFg5QmtpY0QrVzhVTUVxZWdBUUpXS1ovKzNzTFpKaEZHUUVaek5hSWE0aWJoNjZFbjg2N1ZOYUllb1A1V3BwTnVJR29BbE9tM2c1VkMxQWRZZVF2MUJaUFJTZ0FBQUFCSlJVNUVya0pnZ2c9PSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0k0SWlCb1pXbG5hSFE5SWpnaUlIWnBaWGRDYjNnOUlqQWdNQ0E0SURnaVBnb2dJRHh3WVhSb0lHUTlJazB3SURCMk1XZzRkaTB4YUMwNGVtMHdJREoyTVdnMmRpMHhhQzAyZW0wd0lESjJNV2c0ZGkweGFDMDRlbTB3SURKMk1XZzJkaTB4YUMwMmVpSWdMejRLUEM5emRtYyspLCBub25lOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQouc2VsZWN0LW1lc3NhZ2U6aG92ZXIgZGl2IHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2M7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLyogTWVzc2FnZSB0YWJsZXMgLSB0aGVzZSBNVVNUIE5PVCBiZSBjb21iaW5lZCB0b2dldGhlciBiZWNhdXNlIG90aGVyd2lzZQogICBkeW5hbWljYWxseSBhbHRlcmluZyB0aGVtIGJhc2VkIG9uIHZpc2libGUgbG9nIGxldmVsIGlzIG5vdCBwb3NzaWJsZS4gKi8KLnRyYWNlLW1lc3NhZ2UgewogICAgZGlzcGxheTogdGFibGU7Cn0KLmRlYnVnLW1lc3NhZ2UgewogICAgZGlzcGxheTogdGFibGU7Cn0KLyogTWV0YWRhdGEgKi8KLm1ldGFkYXRhIHRoIHsKICAgIHdpZHRoOiAxMi41ZW07CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIHBhZGRpbmc6IDA7Cn0KLm1ldGFkYXRhIHRkIHsKICAgIHBhZGRpbmc6IDAuMmVtOwp9Ci5rZXl3b3JkLW1ldGFkYXRhIHsKICAgIGZvbnQtc2l6ZTogMC45ZW07Cn0KLyogQ3VzdG9tIHN0eWxlcyBmb3Igc3RhdGlzdGljcyAqLwojdG90YWwtc3RhdHMgdHI6aG92ZXIsICN0YWctc3RhdHMgdHI6aG92ZXIgewogICAgY3Vyc29yOiBkZWZhdWx0Owp9Cjwvc3R5bGU+CjxzdHlsZSBtZWRpYT0icHJpbnQiIHR5cGU9InRleHQvY3NzIj4KYm9keSB7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogOHB0Owp9CmE6bGluaywgYTp2aXNpdGVkIHsKICAgIGNvbG9yOiBibGFjazsKfQojaGVhZGVyIHsKICAgIHdpZHRoOiBhdXRvOwp9Ci5kZXRhaWxzLCAuc3RhdGlzdGljcyB7CiAgICB3aWR0aDogMTAwJTsKfQojZ2VuZXJhdGVkLWFnbywgI3RvcC1yaWdodC1oZWFkZXIsICNub3JtYWwtc2VsZWN0b3IsICNzZWFyY2gtYnV0dG9ucywKLmZvbGRpbmctYnV0dG9uLCAuZXhwYW5kLCAuaGlkZGVuLCAuZGV0YWlscy1jb2wtdG9nZ2xlIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLmVsZW1lbnQtaGVhZGVyLXRleHQsIC5jaGlsZHJlbiB7CiAgICBtYXJnaW46IDA7Cn0KI3Rlc3QtZGV0YWlscyB7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgdGFibGUtbGF5b3V0OiBhdXRvOwp9CiN0ZXN0LWRldGFpbHMgdGgsICN0ZXN0LWRldGFpbHMgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Cn0KLmRldGFpbHMtY29sLWhlYWRlciB7CiAgICBwYWRkaW5nOiAwOwp9CiNwcmludC1zZWxlY3RvciB7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwp9Ci50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGJhY2tncm91bmQ6ICNkZGQgIWltcG9ydGFudDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgojamF2YXNjcmlwdC1kaXNhYmxlZCB7CiAgICB3aWR0aDogNjAwcHg7CiAgICBtYXJnaW46IDEwMHB4IGF1dG8gMCBhdXRvOwogICAgcGFkZGluZzogMjBweDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9CiNqYXZhc2NyaXB0LWRpc2FibGVkIGgxIHsKICAgIHdpZHRoOiAxMDAlOwogICAgZmxvYXQ6IG5vbmU7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgdWwgewogICAgZm9udC1zaXplOiAxLjJlbTsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCBsaSB7CiAgICBtYXJnaW46IDAuNWVtIDA7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgYiB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLmRvYyA+ICogewogICAgbWFyZ2luOiAwLjdlbSAxZW0gMC4xZW0gMWVtOwogICAgcGFkZGluZzogMDsKfQouZG9jID4gcCwgLmRvYyA+IGgxLCAuZG9jID4gaDIsIC5kb2MgPiBoMywgLmRvYyA+IGg0IHsKICAgIG1hcmdpbjogMC43ZW0gMCAwLjFlbSAwOwp9Ci5kb2MgPiAqOmZpcnN0LWNoaWxkIHsKICAgIG1hcmdpbi10b3A6IDAuMWVtOwp9Ci5kb2MgdGFibGUgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGVtcHR5LWNlbGxzOiBzaG93OwogICAgZm9udC1zaXplOiAwLjllbTsKfQouZG9jIHRhYmxlIHRoLCAuZG9jIHRhYmxlIHRkIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwogICAgaGVpZ2h0OiAxLjJlbTsKfQouZG9jIHRhYmxlIHRoIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKfQouZG9jIHByZSB7CiAgICBmb250LXNpemU6IDEuMWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgIGJhY2tncm91bmQ6ICNmNGY0ZjQ7Cn0KLmRvYyBjb2RlIHsKICAgIHBhZGRpbmc6IDAgMC4yZW07CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgYmFja2dyb3VuZDogI2VlZTsKfQouZG9jIGxpIHsKICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsKICAgIGxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwp9Ci5kb2MgaW1nIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmRvYyBociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KPC9zdHlsZT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp2YXIgTEVWRUxTID0ge1RSQUNFOiAwLCBERUJVRzogMSwgSU5GTzogMiwgV0FSTjogMywgRkFJTDogNCwgTk9ORTogNX07CmZ1bmN0aW9uIHRvZ2dsZVN1aXRlKHN1aXRlSWQpIHsKICAgIHRvZ2dsZUVsZW1lbnQoc3VpdGVJZCwgWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXSk7Cn0KZnVuY3Rpb24gdG9nZ2xlVGVzdCh0ZXN0SWQpIHsKICAgIHRvZ2dsZUVsZW1lbnQodGVzdElkLCBbJ2tleXdvcmQnXSk7Cn0KZnVuY3Rpb24gdG9nZ2xlS2V5d29yZChrd0lkKSB7CiAgICB0b2dnbGVFbGVtZW50KGt3SWQsIFsna2V5d29yZCcsICdtZXNzYWdlJ10pOwp9CmZ1bmN0aW9uIHRvZ2dsZUVsZW1lbnQoZWxlbWVudElkLCBjaGlsZHJlbk5hbWVzKSB7CiAgICB2YXIgZWxlbWVudCA9ICQoJyMnICsgZWxlbWVudElkKTsKICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oJy5jaGlsZHJlbicpOwogICAgY2hpbGRyZW4udG9nZ2xlKDEwMCwgJycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBlbGVtZW50LmNoaWxkcmVuKCcuZWxlbWVudC1oZWFkZXInKS50b2dnbGVDbGFzcygnY2xvc2VkJyk7CiAgICB9KTsKICAgIHBvcHVsYXRlQ2hpbGRyZW4oZWxlbWVudElkLCBjaGlsZHJlbiwgY2hpbGRyZW5OYW1lcyk7Cn0KZnVuY3Rpb24gcG9wdWxhdGVDaGlsZHJlbihlbGVtZW50SWQsIGNoaWxkRWxlbWVudCwgY2hpbGRyZW5OYW1lcykgewogICAgaWYgKCFjaGlsZEVsZW1lbnQuaGFzQ2xhc3MoJ3BvcHVsYXRlZCcpKSB7CiAgICAgICAgdmFyIGVsZW1lbnQgPSB3aW5kb3cudGVzdGRhdGEuZmluZExvYWRlZChlbGVtZW50SWQpOwogICAgICAgIHZhciBjYWxsYmFjayA9IGRyYXdDYWxsYmFjayhlbGVtZW50LCBjaGlsZEVsZW1lbnQsIGNoaWxkcmVuTmFtZXMpOwogICAgICAgIGVsZW1lbnQuY2FsbFdoZW5DaGlsZHJlblJlYWR5KGNhbGxiYWNrKTsKICAgICAgICBjaGlsZEVsZW1lbnQuYWRkQ2xhc3MoJ3BvcHVsYXRlZCcpOwogICAgfQp9CmZ1bmN0aW9uIGRyYXdDYWxsYmFjayhlbGVtZW50LCBjaGlsZEVsZW1lbnQsIGNoaWxkcmVuTmFtZXMpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdXRpbC5tYXAoY2hpbGRyZW5OYW1lcywgZnVuY3Rpb24gKGNoaWxkTmFtZSkgewogICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBlbGVtZW50W2NoaWxkTmFtZSArICdzJ10oKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gY2hpbGROYW1lICsgJ1RlbXBsYXRlJzsKICAgICAgICAgICAgdXRpbC5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkgewogICAgICAgICAgICAgICAgJC50bXBsKHRlbXBsYXRlLCBjaGlsZCkuYXBwZW5kVG8oY2hpbGRFbGVtZW50KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9Cn0KZnVuY3Rpb24gZXhwYW5kU3VpdGUoc3VpdGUpIHsKICAgIGlmIChzdWl0ZS5zdGF0dXMgPT0gIlBBU1MiKQogICAgICAgIGV4cGFuZEVsZW1lbnQoc3VpdGUpOwogICAgZWxzZQogICAgICAgIGV4cGFuZENyaXRpY2FsRmFpbGVkKHN1aXRlKTsKfQpmdW5jdGlvbiBleHBhbmRFbGVtZW50KGl0ZW0pIHsKICAgIHZhciBlbGVtZW50ID0gJCgnIycgKyBpdGVtLmlkKTsKICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oJy5jaGlsZHJlbicpOwogICAgLy8gLmNzcyBpcyBmYXN0ZXIgdGhhbiAuc2hvdyBhbmQgLnNob3cgdy8gY2FsbGJhY2sgaXMgdGVycmlibHkgc2xvdwogICAgY2hpbGRyZW4uY3NzKHsnZGlzcGxheSc6ICdibG9jayd9KTsKICAgIHBvcHVsYXRlQ2hpbGRyZW4oaXRlbS5pZCwgY2hpbGRyZW4sIGl0ZW0uY2hpbGRyZW5OYW1lcyk7CiAgICBlbGVtZW50LmNoaWxkcmVuKCcuZWxlbWVudC1oZWFkZXInKS5yZW1vdmVDbGFzcygnY2xvc2VkJyk7Cn0KZnVuY3Rpb24gZXhwYW5kRWxlbWVudFdpdGhJZChlbGVtZW50aWQpIHsKICAgIGV4cGFuZEVsZW1lbnQod2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQoZWxlbWVudGlkKSk7Cn0KZnVuY3Rpb24gZXhwYW5kQ3JpdGljYWxGYWlsZWQoZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQuc3RhdHVzID09ICJGQUlMIikgewogICAgICAgIHdpbmRvdy5lbGVtZW50c1RvRXhwYW5kID0gW2VsZW1lbnRdOwogICAgICAgIHdpbmRvdy5leHBhbmREZWNpZGVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmV0dXJuIGUuc3RhdHVzID09ICJGQUlMIiAmJiAoZS5pc0NyaXRpY2FsID09PSB1bmRlZmluZWQgfHwgZS5pc0NyaXRpY2FsKTsKICAgICAgICB9OwogICAgICAgIGV4cGFuZFJlY3Vyc2l2ZWx5KCk7CiAgICB9Cn0KZnVuY3Rpb24gZXhwYW5kQWxsKGVsZW1lbnRJZCkgewogICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQgPSBbd2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQoZWxlbWVudElkKV07CiAgICB3aW5kb3cuZXhwYW5kRGVjaWRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07CiAgICBleHBhbmRSZWN1cnNpdmVseSgpOwp9CmZ1bmN0aW9uIGV4cGFuZFJlY3Vyc2l2ZWx5KCkgewogICAgaWYgKCF3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5sZW5ndGgpCiAgICAgICAgcmV0dXJuOwogICAgdmFyIGVsZW1lbnQgPSB3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5wb3AoKTsKICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50SGlkZGVuQnlVc2VyKGVsZW1lbnQuaWQpKSB7CiAgICAgICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQgPSBbXTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBleHBhbmRFbGVtZW50KGVsZW1lbnQpOwogICAgZWxlbWVudC5jYWxsV2hlbkNoaWxkcmVuUmVhZHkoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oKTsKICAgICAgICBmb3IgKHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cuZXhwYW5kRGVjaWRlcihjaGlsZHJlbltpXSkpCiAgICAgICAgICAgICAgICB3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5wdXNoKGNoaWxkcmVuW2ldKTsKICAgICAgICB9CiAgICAgICAgaWYgKHdpbmRvdy5lbGVtZW50c1RvRXhwYW5kLmxlbmd0aCkKICAgICAgICAgICAgc2V0VGltZW91dChleHBhbmRSZWN1cnNpdmVseSwgMCk7CiAgICB9KTsKfQpmdW5jdGlvbiBlbGVtZW50SGlkZGVuQnlVc2VyKGlkKSB7CiAgICB2YXIgZWxlbWVudCA9ICQoJyMnICsgaWQpOwogICAgcmV0dXJuICFlbGVtZW50LmlzKCI6dmlzaWJsZSIpOwp9CmZ1bmN0aW9uIGNvbGxhcHNlQWxsKGlkKSB7CiAgICB2YXIgZWxlbWVudCA9ICQoJyMnICsgaWQpOwogICAgZWxlbWVudC5maW5kKCcuY2hpbGRyZW4nKS5jc3MoeydkaXNwbGF5JzogJ25vbmUnfSk7CiAgICBlbGVtZW50LmZpbmQoJy5lbGVtZW50LWhlYWRlcicpLmFkZENsYXNzKCdjbG9zZWQnKTsKfQpmdW5jdGlvbiBsb2dMZXZlbFNlbGVjdGVkKGxldmVsKSB7CiAgICB2YXIgYW5jaG9ycyA9IGdldFZpZXdBbmNob3JFbGVtZW50cygpOwogICAgc2V0TWVzc2FnZVZpc2liaWxpdHkobGV2ZWwpOwogICAgc2Nyb2xsVG9TaG9ydGVzdFZpc2libGVBbmNob3JFbGVtZW50KGFuY2hvcnMpOwp9CmZ1bmN0aW9uIGdldFZpZXdBbmNob3JFbGVtZW50cygpIHsKICAgIHZhciBlbGVtMSA9ICQoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCgxMDAsIDApKTsKICAgIHZhciBlbGVtMiA9ICQoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCgxMDAsIDIwKSk7CiAgICByZXR1cm4gW2VsZW0xLCBlbGVtMl07Cn0KZnVuY3Rpb24gc2Nyb2xsVG9TaG9ydGVzdFZpc2libGVBbmNob3JFbGVtZW50KGFuY2hvcnMpIHsKICAgIGFuY2hvcnMgPSB1dGlsLm1hcChhbmNob3JzLCBjbG9zZXN0VmlzaWJsZVBhcmVudCk7CiAgICB2YXIgc2hvcnRlc3QgPSBhbmNob3JzWzBdOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhbmNob3JzLmxlbmd0aDsgaSsrKQogICAgICAgIGlmIChzaG9ydGVzdC5oZWlnaHQoKSA+IGFuY2hvcnNbaV0uaGVpZ2h0KCkpCiAgICAgICAgICAgIHNob3J0ZXN0ID0gYW5jaG9yc1tpXTsKICAgIHNob3J0ZXN0LmdldCgpWzBdLnNjcm9sbEludG9WaWV3KHRydWUpOwp9CmZ1bmN0aW9uIHNldE1lc3NhZ2VWaXNpYmlsaXR5KGxldmVsKSB7CiAgICBsZXZlbCA9IHBhcnNlSW50KGxldmVsKTsKICAgIGNoYW5nZUNsYXNzRGlzcGxheSgiLnRyYWNlLW1lc3NhZ2UiLCBsZXZlbCA8PSBMRVZFTFMuVFJBQ0UpOwogICAgY2hhbmdlQ2xhc3NEaXNwbGF5KCIuZGVidWctbWVzc2FnZSIsIGxldmVsIDw9IExFVkVMUy5ERUJVRyk7CiAgICBjaGFuZ2VDbGFzc0Rpc3BsYXkoIi5pbmZvLW1lc3NhZ2UiLCBsZXZlbCA8PSBMRVZFTFMuSU5GTyk7Cn0KZnVuY3Rpb24gY2xvc2VzdFZpc2libGVQYXJlbnQoZWxlbSkgewogICAgd2hpbGUgKCFlbGVtLmlzKCI6dmlzaWJsZSIpKQogICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudCgpOwogICAgcmV0dXJuIGVsZW07Cn0KZnVuY3Rpb24gY2hhbmdlQ2xhc3NEaXNwbGF5KGNsYXp6LCB2aXNpYmxlKSB7CiAgICB2YXIgc3R5bGVzID0gZG9jdW1lbnQuc3R5bGVTaGVldHM7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBydWxlcyA9IGdldFJ1bGVzKHN0eWxlc1tpXSk7CiAgICAgICAgaWYgKHJ1bGVzID09PSBudWxsKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJ1bGVzLmxlbmd0aDsgaisrKQogICAgICAgICAgICBpZiAocnVsZXNbal0uc2VsZWN0b3JUZXh0ID09PSBjbGF6eikKICAgICAgICAgICAgICAgIHJ1bGVzW2pdLnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID8gInRhYmxlIiA6ICJub25lIjsKICAgIH0KfQpmdW5jdGlvbiBnZXRSdWxlcyhzdHlsZSkgewogICAgLy8gV2l0aCBDaHJvbWUgZXh0ZXJuYWwgQ1NTIGZpbGVzIHNlZW0gdG8gaGF2ZSBvbmx5IG51bGwgcm9sZXMgYW5kIHdpdGgKICAgIC8vIEZpcmVmb3ggYWNjZXNzaW5nIHJ1bGVzIGNhbiByZXN1bHQgdG8gc2VjdXJpdHkgZXJyb3IuCiAgICAvLyBOZWl0aGVyIG9mIHRoZXNlIGFyZSBhIHByb2JsZW0gb24gd2l0aCBnZW5lcmF0ZWQgbG9ncy4KICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIHN0eWxlLmNzc1J1bGVzIHx8IHN0eWxlLnJ1bGVzOwogICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9CmZ1bmN0aW9uIHNlbGVjdE1lc3NhZ2UocGFyZW50SWQpIHsKICAgIHZhciBlbGVtZW50ID0gJCgnIycgKyBwYXJlbnRJZCkuZmluZCgnLm1lc3NhZ2UnKS5nZXQoMCk7CiAgICBzZWxlY3RUZXh0KGVsZW1lbnQpOwp9CmZ1bmN0aW9uIHNlbGVjdFRleHQoZWxlbWVudCkgewogICAgLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy85ODUyNzIKICAgIHZhciByYW5nZSwgc2VsZWN0aW9uOwogICAgaWYgKGRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKSB7ICAvLyBJRSA4CiAgICAgICAgcmFuZ2UgPSBkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOwogICAgICAgIHJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KGVsZW1lbnQpOwogICAgICAgIHJhbmdlLnNlbGVjdCgpOwogICAgfSBlbHNlIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7ICAvLyBPdGhlcnMKICAgICAgICBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTsKICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTsKICAgIH0KfQpmdW5jdGlvbiBMb2dMZXZlbENvbnRyb2xsZXIobWluTGV2ZWwsIGRlZmF1bHRMZXZlbCkgewogICAgbWluTGV2ZWwgPSBMRVZFTFNbbWluTGV2ZWxdOwogICAgZGVmYXVsdExldmVsID0gTEVWRUxTW2RlZmF1bHRMZXZlbF07CiAgICBmdW5jdGlvbiBzaG93TG9nTGV2ZWxTZWxlY3RvcigpIHsKICAgICAgICByZXR1cm4gbWluTGV2ZWwgPCBMRVZFTFMuSU5GTzsKICAgIH0KICAgIGZ1bmN0aW9uIGRlZmF1bHRMb2dMZXZlbCgpIHsKICAgICAgICBpZiAobWluTGV2ZWwgPiBkZWZhdWx0TGV2ZWwpCiAgICAgICAgICAgIHJldHVybiBtaW5MZXZlbDsKICAgICAgICByZXR1cm4gZGVmYXVsdExldmVsOwogICAgfQogICAgZnVuY3Rpb24gc2hvd1RyYWNlKCkgewogICAgICAgIHJldHVybiBtaW5MZXZlbCA9PSBMRVZFTFMuVFJBQ0U7CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIHNob3dMb2dMZXZlbFNlbGVjdG9yOiBzaG93TG9nTGV2ZWxTZWxlY3RvciwKICAgICAgICBkZWZhdWx0TG9nTGV2ZWw6IGRlZmF1bHRMb2dMZXZlbCwKICAgICAgICBzaG93VHJhY2U6IHNob3dUcmFjZQogICAgfTsKfQo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKiEgalF1ZXJ5IHYzLjMuMSB8IChjKSBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiOyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUuZG9jdW1lbnQ/dChlLCEwKTpmdW5jdGlvbihlKXtpZighZS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gdChlKX06dChlKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7dmFyIG49W10scj1lLmRvY3VtZW50LGk9T2JqZWN0LmdldFByb3RvdHlwZU9mLG89bi5zbGljZSxhPW4uY29uY2F0LHM9bi5wdXNoLHU9bi5pbmRleE9mLGw9e30sYz1sLnRvU3RyaW5nLGY9bC5oYXNPd25Qcm9wZXJ0eSxwPWYudG9TdHJpbmcsZD1wLmNhbGwoT2JqZWN0KSxoPXt9LGc9ZnVuY3Rpb24gZSh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmIm51bWJlciIhPXR5cGVvZiB0Lm5vZGVUeXBlfSx5PWZ1bmN0aW9uIGUodCl7cmV0dXJuIG51bGwhPXQmJnQ9PT10LndpbmRvd30sdj17dHlwZTohMCxzcmM6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIG0oZSx0LG4pe3ZhciBpLG89KHQ9dHx8cikuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoby50ZXh0PWUsbilmb3IoaSBpbiB2KW5baV0mJihvW2ldPW5baV0pO3QuaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2xbYy5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9dmFyIGI9IjMuMy4xIix3PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyB3LmZuLmluaXQoZSx0KX0sVD0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7dy5mbj13LnByb3RvdHlwZT17anF1ZXJ5OiIzLjMuMSIsY29uc3RydWN0b3I6dyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIG8uY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP28uY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHR9LGVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcubWFwKHRoaXMsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHQsbix0KX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soby5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKyhlPDA/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobj49MCYmbjx0P1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpzLHNvcnQ6bi5zb3J0LHNwbGljZTpuLnNwbGljZX0sdy5leHRlbmQ9dy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8sYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGw9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fGcoYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKW49YVt0XSxhIT09KHI9ZVt0XSkmJihsJiZyJiYody5pc1BsYWluT2JqZWN0KHIpfHwoaT1BcnJheS5pc0FycmF5KHIpKSk/KGk/KGk9ITEsbz1uJiZBcnJheS5pc0FycmF5KG4pP246W10pOm89biYmdy5pc1BsYWluT2JqZWN0KG4pP246e30sYVt0XT13LmV4dGVuZChsLG8scikpOnZvaWQgMCE9PXImJihhW3RdPXIpKTtyZXR1cm4gYX0sdy5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKCIzLjMuMSIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4hKCFlfHwiW29iamVjdCBPYmplY3RdIiE9PWMuY2FsbChlKSkmJighKHQ9aShlKSl8fCJmdW5jdGlvbiI9PXR5cGVvZihuPWYuY2FsbCh0LCJjb25zdHJ1Y3RvciIpJiZ0LmNvbnN0cnVjdG9yKSYmcC5jYWxsKG4pPT09ZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbihlKXttKGUpfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2lmKEMoZSkpe2ZvcihuPWUubGVuZ3RoO3I8bjtyKyspaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrfWVsc2UgZm9yKHIgaW4gZSlpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWs7cmV0dXJuIGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6KGUrIiIpLnJlcGxhY2UoVCwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoQyhPYmplY3QoZSkpP3cubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOnMuY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTp1LmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0rdC5sZW5ndGgscj0wLGk9ZS5sZW5ndGg7cjxuO3IrKyllW2krK109dFtyXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIsaT1bXSxvPTAsYT1lLmxlbmd0aCxzPSFuO288YTtvKyspKHI9IXQoZVtvXSxvKSkhPT1zJiZpLnB1c2goZVtvXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPTAscz1bXTtpZihDKGUpKWZvcihyPWUubGVuZ3RoO288cjtvKyspbnVsbCE9KGk9dChlW29dLG8sbikpJiZzLnB1c2goaSk7ZWxzZSBmb3IobyBpbiBlKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmcy5wdXNoKGkpO3JldHVybiBhLmFwcGx5KFtdLHMpfSxndWlkOjEsc3VwcG9ydDpofSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKHcuZm5bU3ltYm9sLml0ZXJhdG9yXT1uW1N5bWJvbC5pdGVyYXRvcl0pLHcuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtsWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIEMoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49eChlKTtyZXR1cm4hZyhlKSYmIXkoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmdD4wJiZ0LTEgaW4gZSl9dmFyIEU9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHMsdSxsLGMsZixwLGQsaCxnLHksdixtLHgsYj0ic2l6emxlIisxKm5ldyBEYXRlLHc9ZS5kb2N1bWVudCxUPTAsQz0wLEU9YWUoKSxrPWFlKCksUz1hZSgpLEQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihmPSEwKSwwfSxOPXt9Lmhhc093blByb3BlcnR5LEE9W10saj1BLnBvcCxxPUEucHVzaCxMPUEucHVzaCxIPUEuc2xpY2UsTz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX0sUD0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLFI9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixJPSJcXFsiK00rIiooIitSKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrUisiKSl8KSIrTSsiKlxcXSIsVz0iOigiK1IrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK0krIikqKXwuKilcXCl8KSIsJD1uZXcgUmVnRXhwKE0rIisiLCJnIiksQj1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLEY9bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSxfPW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksej1uZXcgUmVnRXhwKCI9IitNKyIqKFteXFxdJ1wiXSo/KSIrTSsiKlxcXSIsImciKSxYPW5ldyBSZWdFeHAoVyksVT1uZXcgUmVnRXhwKCJeIitSKyIkIiksVj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitSKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK1IrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK1IrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitJKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrVyksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitNKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitNKyIqKD86KFsrLV18KSIrTSsiKihcXGQrKXwpKSIrTSsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrUCsiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK00rIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrTSsiKigoPzotXFxkKT9cXGQqKSIrTSsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sRz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFk9L15oXGQkL2ksUT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sSj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLEs9L1srfl0vLFo9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitNKyI/fCgiK00rIil8LikiLCJpZyIpLGVlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iMHgiK3QtNjU1MzY7cmV0dXJuIHIhPT1yfHxuP3Q6cjwwP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShyPj4xMHw1NTI5NiwxMDIzJnJ8NTYzMjApfSx0ZT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxuZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PyJcMCI9PT1lPyJcdWZmZmQiOmUuc2xpY2UoMCwtMSkrIlxcIitlLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2V9LHJlPWZ1bmN0aW9uKCl7cCgpfSxpZT1tZShmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJigiZm9ybSJpbiBlfHwibGFiZWwiaW4gZSl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7TC5hcHBseShBPUguY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksQVt3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtMPXthcHBseTpBLmxlbmd0aD9mdW5jdGlvbihlLHQpe3EuYXBwbHkoZSxILmNhbGwodCkpfTpmdW5jdGlvbihlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDt3aGlsZShlW24rK109dFtyKytdKTtlLmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBvZShlLHQscixpKXt2YXIgbyxzLGwsYyxmLGgsdixtPXQmJnQub3duZXJEb2N1bWVudCxUPXQ/dC5ub2RlVHlwZTo5O2lmKHI9cnx8W10sInN0cmluZyIhPXR5cGVvZiBlfHwhZXx8MSE9PVQmJjkhPT1UJiYxMSE9PVQpcmV0dXJuIHI7aWYoIWkmJigodD90Lm93bmVyRG9jdW1lbnR8fHQ6dykhPT1kJiZwKHQpLHQ9dHx8ZCxnKSl7aWYoMTEhPT1UJiYoZj1KLmV4ZWMoZSkpKWlmKG89ZlsxXSl7aWYoOT09PVQpe2lmKCEobD10LmdldEVsZW1lbnRCeUlkKG8pKSlyZXR1cm4gcjtpZihsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZSBpZihtJiYobD1tLmdldEVsZW1lbnRCeUlkKG8pKSYmeCh0LGwpJiZsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZXtpZihmWzJdKXJldHVybiBMLmFwcGx5KHIsdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkscjtpZigobz1mWzNdKSYmbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZ0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEwuYXBwbHkocix0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobykpLHJ9aWYobi5xc2EmJiFTW2UrIiAiXSYmKCF5fHwheS50ZXN0KGUpKSl7aWYoMSE9PVQpbT10LHY9ZTtlbHNlIGlmKCJvYmplY3QiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXsoYz10LmdldEF0dHJpYnV0ZSgiaWQiKSk/Yz1jLnJlcGxhY2UodGUsbmUpOnQuc2V0QXR0cmlidXRlKCJpZCIsYz1iKSxzPShoPWEoZSkpLmxlbmd0aDt3aGlsZShzLS0paFtzXT0iIyIrYysiICIrdmUoaFtzXSk7dj1oLmpvaW4oIiwiKSxtPUsudGVzdChlKSYmZ2UodC5wYXJlbnROb2RlKXx8dH1pZih2KXRyeXtyZXR1cm4gTC5hcHBseShyLG0ucXVlcnlTZWxlY3RvckFsbCh2KSkscn1jYXRjaChlKXt9ZmluYWxseXtjPT09YiYmdC5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gdShlLnJlcGxhY2UoQiwiJDEiKSx0LHIsaSl9ZnVuY3Rpb24gYWUoKXt2YXIgZT1bXTtmdW5jdGlvbiB0KG4saSl7cmV0dXJuIGUucHVzaChuKyIgIik+ci5jYWNoZUxlbmd0aCYmZGVsZXRlIHRbZS5zaGlmdCgpXSx0W24rIiAiXT1pfXJldHVybiB0fWZ1bmN0aW9uIHNlKGUpe3JldHVybiBlW2JdPSEwLGV9ZnVuY3Rpb24gdWUoZSl7dmFyIHQ9ZC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGxlKGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLGk9bi5sZW5ndGg7d2hpbGUoaS0tKXIuYXR0ckhhbmRsZVtuW2ldXT10fWZ1bmN0aW9uIGNlKGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBmZShlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gcGUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PW58fCJidXR0b24iPT09bikmJnQudHlwZT09PWV9fWZ1bmN0aW9uIGRlKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4iZm9ybSJpbiB0P3QucGFyZW50Tm9kZSYmITE9PT10LmRpc2FibGVkPyJsYWJlbCJpbiB0PyJsYWJlbCJpbiB0LnBhcmVudE5vZGU/dC5wYXJlbnROb2RlLmRpc2FibGVkPT09ZTp0LmRpc2FibGVkPT09ZTp0LmlzRGlzYWJsZWQ9PT1lfHx0LmlzRGlzYWJsZWQhPT0hZSYmaWUodCk9PT1lOnQuZGlzYWJsZWQ9PT1lOiJsYWJlbCJpbiB0JiZ0LmRpc2FibGVkPT09ZX19ZnVuY3Rpb24gaGUoZSl7cmV0dXJuIHNlKGZ1bmN0aW9uKHQpe3JldHVybiB0PSt0LHNlKGZ1bmN0aW9uKG4scil7dmFyIGksbz1lKFtdLG4ubGVuZ3RoLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKW5baT1vW2FdXSYmKG5baV09IShyW2ldPW5baV0pKX0pfSl9ZnVuY3Rpb24gZ2UoZSl7cmV0dXJuIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1uPW9lLnN1cHBvcnQ9e30sbz1vZS5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuISF0JiYiSFRNTCIhPT10Lm5vZGVOYW1lfSxwPW9lLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0LGksYT1lP2Uub3duZXJEb2N1bWVudHx8ZTp3O3JldHVybiBhIT09ZCYmOT09PWEubm9kZVR5cGUmJmEuZG9jdW1lbnRFbGVtZW50PyhkPWEsaD1kLmRvY3VtZW50RWxlbWVudCxnPSFvKGQpLHchPT1kJiYoaT1kLmRlZmF1bHRWaWV3KSYmaS50b3AhPT1pJiYoaS5hZGRFdmVudExpc3RlbmVyP2kuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixyZSwhMSk6aS5hdHRhY2hFdmVudCYmaS5hdHRhY2hFdmVudCgib251bmxvYWQiLHJlKSksbi5hdHRyaWJ1dGVzPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsYXNzTmFtZT0iaSIsIWUuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLG4uZ2V0RWxlbWVudHNCeVRhZ05hbWU9dWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXBwZW5kQ2hpbGQoZC5jcmVhdGVDb21tZW50KCIiKSksIWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxuLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9US50ZXN0KGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksbi5nZXRCeUlkPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBoLmFwcGVuZENoaWxkKGUpLmlkPWIsIWQuZ2V0RWxlbWVudHNCeU5hbWV8fCFkLmdldEVsZW1lbnRzQnlOYW1lKGIpLmxlbmd0aH0pLG4uZ2V0QnlJZD8oci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0sci5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09dH19LHIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG4scixpLG89dC5nZXRFbGVtZW50QnlJZChlKTtpZihvKXtpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb119cmV0dXJuW119fSksci5maW5kLlRBRz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6bi5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sci5maW5kLkNMQVNTPW4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZylyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfSx2PVtdLHk9W10sKG4ucXNhPVEudGVzdChkLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKHVlKGZ1bmN0aW9uKGUpe2guYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitiKyInPjwvYT48c2VsZWN0IGlkPSciK2IrIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmeS5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8eS5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK1ArIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitiKyItXSIpLmxlbmd0aHx8eS5wdXNoKCJ+PSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHkucHVzaCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitiKyIrKiIpLmxlbmd0aHx8eS5wdXNoKCIuIy4rWyt+XSIpfSksdWUoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIHQ9ZC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3Quc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmeS5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ5LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksaC5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnkucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx5LnB1c2goIiwuKjoiKX0pKSwobi5tYXRjaGVzU2VsZWN0b3I9US50ZXN0KG09aC5tYXRjaGVzfHxoLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8aC5tb3pNYXRjaGVzU2VsZWN0b3J8fGgub01hdGNoZXNTZWxlY3Rvcnx8aC5tc01hdGNoZXNTZWxlY3RvcikpJiZ1ZShmdW5jdGlvbihlKXtuLmRpc2Nvbm5lY3RlZE1hdGNoPW0uY2FsbChlLCIqIiksbS5jYWxsKGUsIltzIT0nJ106eCIpLHYucHVzaCgiIT0iLFcpfSkseT15Lmxlbmd0aCYmbmV3IFJlZ0V4cCh5LmpvaW4oInwiKSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSksdD1RLnRlc3QoaC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikseD10fHxRLnRlc3QoaC5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxEPXQ/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gZj0hMCwwO3ZhciByPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiByfHwoMSYocj0oZS5vd25lckRvY3VtZW50fHxlKT09PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSl8fCFuLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PXI/ZT09PWR8fGUub3duZXJEb2N1bWVudD09PXcmJngodyxlKT8tMTp0PT09ZHx8dC5vd25lckRvY3VtZW50PT09dyYmeCh3LHQpPzE6Yz9PKGMsZSktTyhjLHQpOjA6NCZyPy0xOjEpfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBmPSEwLDA7dmFyIG4scj0wLGk9ZS5wYXJlbnROb2RlLG89dC5wYXJlbnROb2RlLGE9W2VdLHM9W3RdO2lmKCFpfHwhbylyZXR1cm4gZT09PWQ/LTE6dD09PWQ/MTppPy0xOm8/MTpjP08oYyxlKS1PKGMsdCk6MDtpZihpPT09bylyZXR1cm4gY2UoZSx0KTtuPWU7d2hpbGUobj1uLnBhcmVudE5vZGUpYS51bnNoaWZ0KG4pO249dDt3aGlsZShuPW4ucGFyZW50Tm9kZSlzLnVuc2hpZnQobik7d2hpbGUoYVtyXT09PXNbcl0pcisrO3JldHVybiByP2NlKGFbcl0sc1tyXSk6YVtyXT09PXc/LTE6c1tyXT09PXc/MTowfSxkKTpkfSxvZS5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG9lKGUsbnVsbCxudWxsLHQpfSxvZS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSx0KXtpZigoZS5vd25lckRvY3VtZW50fHxlKSE9PWQmJnAoZSksdD10LnJlcGxhY2UoeiwiPSckMSddIiksbi5tYXRjaGVzU2VsZWN0b3ImJmcmJiFTW3QrIiAiXSYmKCF2fHwhdi50ZXN0KHQpKSYmKCF5fHwheS50ZXN0KHQpKSl0cnl7dmFyIHI9bS5jYWxsKGUsdCk7aWYocnx8bi5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiByfWNhdGNoKGUpe31yZXR1cm4gb2UodCxkLG51bGwsW2VdKS5sZW5ndGg+MH0sb2UuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS5vd25lckRvY3VtZW50fHxlKSE9PWQmJnAoZSkseChlLHQpfSxvZS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPT1kJiZwKGUpO3ZhciBpPXIuYXR0ckhhbmRsZVt0LnRvTG93ZXJDYXNlKCldLG89aSYmTi5jYWxsKHIuYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP2koZSx0LCFnKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PW8/bzpuLmF0dHJpYnV0ZXN8fCFnP2UuZ2V0QXR0cmlidXRlKHQpOihvPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJm8uc3BlY2lmaWVkP28udmFsdWU6bnVsbH0sb2UuZXNjYXBlPWZ1bmN0aW9uKGUpe3JldHVybihlKyIiKS5yZXBsYWNlKHRlLG5lKX0sb2UuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSxvZS51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LHI9W10saT0wLG89MDtpZihmPSFuLmRldGVjdER1cGxpY2F0ZXMsYz0hbi5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydChEKSxmKXt3aGlsZSh0PWVbbysrXSl0PT09ZVtvXSYmKGk9ci5wdXNoKG8pKTt3aGlsZShpLS0pZS5zcGxpY2UocltpXSwxKX1yZXR1cm4gYz1udWxsLGV9LGk9b2UuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9MCxvPWUubm9kZVR5cGU7aWYobyl7aWYoMT09PW98fDk9PT1vfHwxMT09PW8pe2lmKCJzdHJpbmciPT10eXBlb2YgZS50ZXh0Q29udGVudClyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9aShlKX1lbHNlIGlmKDM9PT1vfHw0PT09bylyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSB3aGlsZSh0PWVbcisrXSluKz1pKHQpO3JldHVybiBufSwocj1vZS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpzZSxtYXRjaDpWLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnJlcGxhY2UoWixlZSksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UoWixlZSksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fG9lLmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJm9lLmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzZdJiZlWzJdO3JldHVybiBWLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXT9lWzJdPWVbNF18fGVbNV18fCIiOm4mJlgudGVzdChuKSYmKHQ9YShuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoWixlZSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9RVtlKyIgIl07cmV0dXJuIHR8fCh0PW5ldyBSZWdFeHAoIihefCIrTSsiKSIrZSsiKCIrTSsifCQpIikpJiZFKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdCgic3RyaW5nIj09dHlwZW9mIGUuY2xhc3NOYW1lJiZlLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIGk9b2UuYXR0cihyLGUpO3JldHVybiBudWxsPT1pPyIhPSI9PT10OiF0fHwoaSs9IiIsIj0iPT09dD9pPT09bjoiIT0iPT09dD9pIT09bjoiXj0iPT09dD9uJiYwPT09aS5pbmRleE9mKG4pOiIqPSI9PT10P24mJmkuaW5kZXhPZihuKT4tMToiJD0iPT09dD9uJiZpLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT10PygiICIraS5yZXBsYWNlKCQsIiAiKSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PXQmJihpPT09bnx8aS5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSIpKX19LENISUxEOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89Im50aCIhPT1lLnNsaWNlKDAsMyksYT0ibGFzdCIhPT1lLnNsaWNlKC00KSxzPSJvZi10eXBlIj09PXQ7cmV0dXJuIDE9PT1yJiYwPT09aT9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24odCxuLHUpe3ZhciBsLGMsZixwLGQsaCxnPW8hPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIseT10LnBhcmVudE5vZGUsdj1zJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbT0hdSYmIXMseD0hMTtpZih5KXtpZihvKXt3aGlsZShnKXtwPXQ7d2hpbGUocD1wW2ddKWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09djoxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtoPWc9Im9ubHkiPT09ZSYmIWgmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoaD1bYT95LmZpcnN0Q2hpbGQ6eS5sYXN0Q2hpbGRdLGEmJm0pe3g9KGQ9KGw9KGM9KGY9KHA9eSlbYl18fChwW2JdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbZV18fFtdKVswXT09PVQmJmxbMV0pJiZsWzJdLHA9ZCYmeS5jaGlsZE5vZGVzW2RdO3doaWxlKHA9KytkJiZwJiZwW2ddfHwoeD1kPTApfHxoLnBvcCgpKWlmKDE9PT1wLm5vZGVUeXBlJiYrK3gmJnA9PT10KXtjW2VdPVtULGQseF07YnJlYWt9fWVsc2UgaWYobSYmKHg9ZD0obD0oYz0oZj0ocD10KVtiXXx8KHBbYl09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVtlXXx8W10pWzBdPT09VCYmbFsxXSksITE9PT14KXdoaWxlKHA9KytkJiZwJiZwW2ddfHwoeD1kPTApfHxoLnBvcCgpKWlmKChzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXY6MT09PXAubm9kZVR5cGUpJiYrK3gmJihtJiYoKGM9KGY9cFtiXXx8KHBbYl09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVtlXT1bVCx4XSkscD09PXQpKWJyZWFrO3JldHVybih4LT1pKT09PXJ8fHglcj09MCYmeC9yPj0wfX19LFBTRVVETzpmdW5jdGlvbihlLHQpe3ZhciBuLGk9ci5wc2V1ZG9zW2VdfHxyLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8b2UuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIitlKTtyZXR1cm4gaVtiXT9pKHQpOmkubGVuZ3RoPjE/KG49W2UsZSwiIix0XSxyLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT9zZShmdW5jdGlvbihlLG4pe3ZhciByLG89aShlLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKWVbcj1PKGUsb1thXSldPSEobltyXT1vW2FdKX0pOmZ1bmN0aW9uKGUpe3JldHVybiBpKGUsMCxuKX0pOml9fSxwc2V1ZG9zOntub3Q6c2UoZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1bXSxyPXMoZS5yZXBsYWNlKEIsIiQxIikpO3JldHVybiByW2JdP3NlKGZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLGE9cihlLG51bGwsaSxbXSkscz1lLmxlbmd0aDt3aGlsZShzLS0pKG89YVtzXSkmJihlW3NdPSEodFtzXT1vKSl9KTpmdW5jdGlvbihlLGksbyl7cmV0dXJuIHRbMF09ZSxyKHQsbnVsbCxvLG4pLHRbMF09bnVsbCwhbi5wb3AoKX19KSxoYXM6c2UoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBvZShlLHQpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOnNlKGZ1bmN0aW9uKGUpe3JldHVybiBlPWUucmVwbGFjZShaLGVlKSxmdW5jdGlvbih0KXtyZXR1cm4odC50ZXh0Q29udGVudHx8dC5pbm5lclRleHR8fGkodCkpLmluZGV4T2YoZSk+LTF9fSksbGFuZzpzZShmdW5jdGlvbihlKXtyZXR1cm4gVS50ZXN0KGV8fCIiKXx8b2UuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrZSksZT1lLnJlcGxhY2UoWixlZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXt2YXIgbjtkb3tpZihuPWc/dC5sYW5nOnQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHx0LmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybihuPW4udG9Mb3dlckNhc2UoKSk9PT1lfHwwPT09bi5pbmRleE9mKGUrIi0iKX13aGlsZSgodD10LnBhcmVudE5vZGUpJiYxPT09dC5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKHQpe3ZhciBuPWUubG9jYXRpb24mJmUubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PXQuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1ofSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWQuYWN0aXZlRWxlbWVudCYmKCFkLmhhc0ZvY3VzfHxkLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmRlKCExKSxkaXNhYmxlZDpkZSghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIXIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBZLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBHLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PXQudG9Mb3dlckNhc2UoKSl9LGZpcnN0OmhlKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpoZShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6aGUoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjpoZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpoZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OmhlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOy0tcj49MDspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6aGUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0pLnBzZXVkb3MubnRoPXIucHNldWRvcy5lcTtmb3IodCBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlyLnBzZXVkb3NbdF09ZmUodCk7Zm9yKHQgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlyLnBzZXVkb3NbdF09cGUodCk7ZnVuY3Rpb24geWUoKXt9eWUucHJvdG90eXBlPXIuZmlsdGVycz1yLnBzZXVkb3Msci5zZXRGaWx0ZXJzPW5ldyB5ZSxhPW9lLnRva2VuaXplPWZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLGEscyx1LGwsYz1rW2UrIiAiXTtpZihjKXJldHVybiB0PzA6Yy5zbGljZSgwKTtzPWUsdT1bXSxsPXIucHJlRmlsdGVyO3doaWxlKHMpe24mJiEoaT1GLmV4ZWMocykpfHwoaSYmKHM9cy5zbGljZShpWzBdLmxlbmd0aCl8fHMpLHUucHVzaChvPVtdKSksbj0hMSwoaT1fLmV4ZWMocykpJiYobj1pLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6aVswXS5yZXBsYWNlKEIsIiAiKX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2ZvcihhIGluIHIuZmlsdGVyKSEoaT1WW2FdLmV4ZWMocykpfHxsW2FdJiYhKGk9bFthXShpKSl8fChuPWkuc2hpZnQoKSxvLnB1c2goe3ZhbHVlOm4sdHlwZTphLG1hdGNoZXM6aX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P3MubGVuZ3RoOnM/b2UuZXJyb3IoZSk6ayhlLHUpLnNsaWNlKDApfTtmdW5jdGlvbiB2ZShlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoLHI9IiI7dDxuO3QrKylyKz1lW3RdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIG1lKGUsdCxuKXt2YXIgcj10LmRpcixpPXQubmV4dCxvPWl8fHIsYT1uJiYicGFyZW50Tm9kZSI9PT1vLHM9QysrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixpKXt3aGlsZSh0PXRbcl0paWYoMT09PXQubm9kZVR5cGV8fGEpcmV0dXJuIGUodCxuLGkpO3JldHVybiExfTpmdW5jdGlvbih0LG4sdSl7dmFyIGwsYyxmLHA9W1Qsc107aWYodSl7d2hpbGUodD10W3JdKWlmKCgxPT09dC5ub2RlVHlwZXx8YSkmJmUodCxuLHUpKXJldHVybiEwfWVsc2Ugd2hpbGUodD10W3JdKWlmKDE9PT10Lm5vZGVUeXBlfHxhKWlmKGY9dFtiXXx8KHRbYl09e30pLGM9Zlt0LnVuaXF1ZUlEXXx8KGZbdC51bmlxdWVJRF09e30pLGkmJmk9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpdD10W3JdfHx0O2Vsc2V7aWYoKGw9Y1tvXSkmJmxbMF09PT1UJiZsWzFdPT09cylyZXR1cm4gcFsyXT1sWzJdO2lmKGNbb109cCxwWzJdPWUodCxuLHUpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB4ZShlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5jdGlvbih0LG4scil7dmFyIGk9ZS5sZW5ndGg7d2hpbGUoaS0tKWlmKCFlW2ldKHQsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06ZVswXX1mdW5jdGlvbiBiZShlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKW9lKGUsdFtyXSxuKTtyZXR1cm4gbn1mdW5jdGlvbiB3ZShlLHQsbixyLGkpe2Zvcih2YXIgbyxhPVtdLHM9MCx1PWUubGVuZ3RoLGw9bnVsbCE9dDtzPHU7cysrKShvPWVbc10pJiYobiYmIW4obyxyLGkpfHwoYS5wdXNoKG8pLGwmJnQucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIFRlKGUsdCxuLHIsaSxvKXtyZXR1cm4gciYmIXJbYl0mJihyPVRlKHIpKSxpJiYhaVtiXSYmKGk9VGUoaSxvKSksc2UoZnVuY3Rpb24obyxhLHMsdSl7dmFyIGwsYyxmLHA9W10sZD1bXSxoPWEubGVuZ3RoLGc9b3x8YmUodHx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLHk9IWV8fCFvJiZ0P2c6d2UoZyxwLGUscyx1KSx2PW4/aXx8KG8/ZTpofHxyKT9bXTphOnk7aWYobiYmbih5LHYscyx1KSxyKXtsPXdlKHYsZCkscihsLFtdLHMsdSksYz1sLmxlbmd0aDt3aGlsZShjLS0pKGY9bFtjXSkmJih2W2RbY11dPSEoeVtkW2NdXT1mKSl9aWYobyl7aWYoaXx8ZSl7aWYoaSl7bD1bXSxjPXYubGVuZ3RoO3doaWxlKGMtLSkoZj12W2NdKSYmbC5wdXNoKHlbY109Zik7aShudWxsLHY9W10sbCx1KX1jPXYubGVuZ3RoO3doaWxlKGMtLSkoZj12W2NdKSYmKGw9aT9PKG8sZik6cFtjXSk+LTEmJihvW2xdPSEoYVtsXT1mKSl9fWVsc2Ugdj13ZSh2PT09YT92LnNwbGljZShoLHYubGVuZ3RoKTp2KSxpP2kobnVsbCxhLHYsdSk6TC5hcHBseShhLHYpfSl9ZnVuY3Rpb24gQ2UoZSl7Zm9yKHZhciB0LG4saSxvPWUubGVuZ3RoLGE9ci5yZWxhdGl2ZVtlWzBdLnR5cGVdLHM9YXx8ci5yZWxhdGl2ZVsiICJdLHU9YT8xOjAsYz1tZShmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9LHMsITApLGY9bWUoZnVuY3Rpb24oZSl7cmV0dXJuIE8odCxlKT4tMX0scywhMCkscD1bZnVuY3Rpb24oZSxuLHIpe3ZhciBpPSFhJiYocnx8biE9PWwpfHwoKHQ9bikubm9kZVR5cGU/YyhlLG4scik6ZihlLG4scikpO3JldHVybiB0PW51bGwsaX1dO3U8bzt1KyspaWYobj1yLnJlbGF0aXZlW2VbdV0udHlwZV0pcD1bbWUoeGUocCksbildO2Vsc2V7aWYoKG49ci5maWx0ZXJbZVt1XS50eXBlXS5hcHBseShudWxsLGVbdV0ubWF0Y2hlcykpW2JdKXtmb3IoaT0rK3U7aTxvO2krKylpZihyLnJlbGF0aXZlW2VbaV0udHlwZV0pYnJlYWs7cmV0dXJuIFRlKHU+MSYmeGUocCksdT4xJiZ2ZShlLnNsaWNlKDAsdS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbdS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKEIsIiQxIiksbix1PGkmJkNlKGUuc2xpY2UodSxpKSksaTxvJiZDZShlPWUuc2xpY2UoaSkpLGk8byYmdmUoZSkpfXAucHVzaChuKX1yZXR1cm4geGUocCl9ZnVuY3Rpb24gRWUoZSx0KXt2YXIgbj10Lmxlbmd0aD4wLGk9ZS5sZW5ndGg+MCxvPWZ1bmN0aW9uKG8sYSxzLHUsYyl7dmFyIGYsaCx5LHY9MCxtPSIwIix4PW8mJltdLGI9W10sdz1sLEM9b3x8aSYmci5maW5kLlRBRygiKiIsYyksRT1UKz1udWxsPT13PzE6TWF0aC5yYW5kb20oKXx8LjEsaz1DLmxlbmd0aDtmb3IoYyYmKGw9YT09PWR8fGF8fGMpO20hPT1rJiZudWxsIT0oZj1DW21dKTttKyspe2lmKGkmJmYpe2g9MCxhfHxmLm93bmVyRG9jdW1lbnQ9PT1kfHwocChmKSxzPSFnKTt3aGlsZSh5PWVbaCsrXSlpZih5KGYsYXx8ZCxzKSl7dS5wdXNoKGYpO2JyZWFrfWMmJihUPUUpfW4mJigoZj0heSYmZikmJnYtLSxvJiZ4LnB1c2goZikpfWlmKHYrPW0sbiYmbSE9PXYpe2g9MDt3aGlsZSh5PXRbaCsrXSl5KHgsYixhLHMpO2lmKG8pe2lmKHY+MCl3aGlsZShtLS0peFttXXx8YlttXXx8KGJbbV09ai5jYWxsKHUpKTtiPXdlKGIpfUwuYXBwbHkodSxiKSxjJiYhbyYmYi5sZW5ndGg+MCYmdit0Lmxlbmd0aD4xJiZvZS51bmlxdWVTb3J0KHUpfXJldHVybiBjJiYoVD1FLGw9dykseH07cmV0dXJuIG4/c2Uobyk6b31yZXR1cm4gcz1vZS5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPVtdLG89U1tlKyIgIl07aWYoIW8pe3R8fCh0PWEoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKShvPUNlKHRbbl0pKVtiXT9yLnB1c2gobyk6aS5wdXNoKG8pOyhvPVMoZSxFZShpLHIpKSkuc2VsZWN0b3I9ZX1yZXR1cm4gb30sdT1vZS5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4saSl7dmFyIG8sdSxsLGMsZixwPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLGQ9IWkmJmEoZT1wLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1kLmxlbmd0aCl7aWYoKHU9ZFswXT1kWzBdLnNsaWNlKDApKS5sZW5ndGg+MiYmIklEIj09PShsPXVbMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZnJiZyLnJlbGF0aXZlW3VbMV0udHlwZV0pe2lmKCEodD0oci5maW5kLklEKGwubWF0Y2hlc1swXS5yZXBsYWNlKFosZWUpLHQpfHxbXSlbMF0pKXJldHVybiBuO3AmJih0PXQucGFyZW50Tm9kZSksZT1lLnNsaWNlKHUuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfW89Vi5uZWVkc0NvbnRleHQudGVzdChlKT8wOnUubGVuZ3RoO3doaWxlKG8tLSl7aWYobD11W29dLHIucmVsYXRpdmVbYz1sLnR5cGVdKWJyZWFrO2lmKChmPXIuZmluZFtjXSkmJihpPWYobC5tYXRjaGVzWzBdLnJlcGxhY2UoWixlZSksSy50ZXN0KHVbMF0udHlwZSkmJmdlKHQucGFyZW50Tm9kZSl8fHQpKSl7aWYodS5zcGxpY2UobywxKSwhKGU9aS5sZW5ndGgmJnZlKHUpKSlyZXR1cm4gTC5hcHBseShuLGkpLG47YnJlYWt9fX1yZXR1cm4ocHx8cyhlLGQpKShpLHQsIWcsbiwhdHx8Sy50ZXN0KGUpJiZnZSh0LnBhcmVudE5vZGUpfHx0KSxufSxuLnNvcnRTdGFibGU9Yi5zcGxpdCgiIikuc29ydChEKS5qb2luKCIiKT09PWIsbi5kZXRlY3REdXBsaWNhdGVzPSEhZixwKCksbi5zb3J0RGV0YWNoZWQ9dWUoZnVuY3Rpb24oZSl7cmV0dXJuIDEmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksdWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8bGUoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGUsdCxuKXtpZighbilyZXR1cm4gZS5nZXRBdHRyaWJ1dGUodCwidHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/MToyKX0pLG4uYXR0cmlidXRlcyYmdWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8aW5wdXQvPiIsZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8bGUoInZhbHVlIixmdW5jdGlvbihlLHQsbil7aWYoIW4mJiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGUuZGVmYXVsdFZhbHVlfSksdWUoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGxlKFAsZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKCFuKXJldHVybiEwPT09ZVt0XT90LnRvTG93ZXJDYXNlKCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSksb2V9KGUpO3cuZmluZD1FLHcuZXhwcj1FLnNlbGVjdG9ycyx3LmV4cHJbIjoiXT13LmV4cHIucHNldWRvcyx3LnVuaXF1ZVNvcnQ9dy51bmlxdWU9RS51bmlxdWVTb3J0LHcudGV4dD1FLmdldFRleHQsdy5pc1hNTERvYz1FLmlzWE1MLHcuY29udGFpbnM9RS5jb250YWlucyx3LmVzY2FwZVNlbGVjdG9yPUUuZXNjYXBlO3ZhciBrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxpPXZvaWQgMCE9PW47d2hpbGUoKGU9ZVt0XSkmJjkhPT1lLm5vZGVUeXBlKWlmKDE9PT1lLm5vZGVUeXBlKXtpZihpJiZ3KGUpLmlzKG4pKWJyZWFrO3IucHVzaChlKX1yZXR1cm4gcn0sUz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXTtlO2U9ZS5uZXh0U2libGluZykxPT09ZS5ub2RlVHlwZSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn0sRD13LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O2Z1bmN0aW9uIE4oZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfXZhciBBPS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIGooZSx0LG4pe3JldHVybiBnKHQpP3cuZ3JlcChlLGZ1bmN0aW9uKGUscil7cmV0dXJuISF0LmNhbGwoZSxyLGUpIT09bn0pOnQubm9kZVR5cGU/dy5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10IT09bn0pOiJzdHJpbmciIT10eXBlb2YgdD93LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gdS5jYWxsKHQsZSk+LTEhPT1ufSk6dy5maWx0ZXIodCxlLG4pfXcuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP3cuZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106dy5maW5kLm1hdGNoZXMoZSx3LmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LHcuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayh3KGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7dDxyO3QrKylpZih3LmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKXcuZmluZChlLGlbdF0sbik7cmV0dXJuIHI+MT93LnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITApKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFqKHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZELnRlc3QoZSk/dyhlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBxLEw9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsody5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxvO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8cSwic3RyaW5nIj09dHlwZW9mIGUpe2lmKCEoaT0iPCI9PT1lWzBdJiYiPiI9PT1lW2UubGVuZ3RoLTFdJiZlLmxlbmd0aD49Mz9bbnVsbCxlLG51bGxdOkwuZXhlYyhlKSl8fCFpWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoaVsxXSl7aWYodD10IGluc3RhbmNlb2Ygdz90WzBdOnQsdy5tZXJnZSh0aGlzLHcucGFyc2VIVE1MKGlbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6ciwhMCkpLEEudGVzdChpWzFdKSYmdy5pc1BsYWluT2JqZWN0KHQpKWZvcihpIGluIHQpZyh0aGlzW2ldKT90aGlzW2ldKHRbaV0pOnRoaXMuYXR0cihpLHRbaV0pO3JldHVybiB0aGlzfXJldHVybihvPXIuZ2V0RWxlbWVudEJ5SWQoaVsyXSkpJiYodGhpc1swXT1vLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOmcoZSk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KGUpOmUodyk6dy5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT13LmZuLHE9dyhyKTt2YXIgSD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxPPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O3cuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9dyhlLHRoaXMpLG49dC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxuO2UrKylpZih3LmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT0ic3RyaW5nIiE9dHlwZW9mIGUmJncoZSk7aWYoIUQudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZ3LmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKG8ubGVuZ3RoPjE/dy51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/dS5jYWxsKHcoZSksdGhpc1swXSk6dS5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayh3LnVuaXF1ZVNvcnQody5tZXJnZSh0aGlzLmdldCgpLHcoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSk7ZnVuY3Rpb24gUChlLHQpe3doaWxlKChlPWVbdF0pJiYxIT09ZS5ub2RlVHlwZSk7cmV0dXJuIGV9dy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gayhlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gUChlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBQKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGsoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGsoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBrKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBTKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gUyhlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gTihlLCJpZnJhbWUiKT9lLmNvbnRlbnREb2N1bWVudDooTihlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLHcubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24obixyKXt2YXIgaT13Lm1hcCh0aGlzLHQsbik7cmV0dXJuIlVudGlsIiE9PWUuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihpPXcuZmlsdGVyKHIsaSkpLHRoaXMubGVuZ3RoPjEmJihPW2VdfHx3LnVuaXF1ZVNvcnQoaSksSC50ZXN0KGUpJiZpLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2soaSl9fSk7dmFyIE09L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBSKGUpe3ZhciB0PXt9O3JldHVybiB3LmVhY2goZS5tYXRjaChNKXx8W10sZnVuY3Rpb24oZSxuKXt0W25dPSEwfSksdH13LkNhbGxiYWNrcz1mdW5jdGlvbihlKXtlPSJzdHJpbmciPT10eXBlb2YgZT9SKGUpOncuZXh0ZW5kKHt9LGUpO3ZhciB0LG4scixpLG89W10sYT1bXSxzPS0xLHU9ZnVuY3Rpb24oKXtmb3IoaT1pfHxlLm9uY2Uscj10PSEwO2EubGVuZ3RoO3M9LTEpe249YS5zaGlmdCgpO3doaWxlKCsrczxvLmxlbmd0aCkhMT09PW9bc10uYXBwbHkoblswXSxuWzFdKSYmZS5zdG9wT25GYWxzZSYmKHM9by5sZW5ndGgsbj0hMSl9ZS5tZW1vcnl8fChuPSExKSx0PSExLGkmJihvPW4/W106IiIpfSxsPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG4mJiF0JiYocz1vLmxlbmd0aC0xLGEucHVzaChuKSksZnVuY3Rpb24gdChuKXt3LmVhY2gobixmdW5jdGlvbihuLHIpe2cocik/ZS51bmlxdWUmJmwuaGFzKHIpfHxvLnB1c2gocik6ciYmci5sZW5ndGgmJiJzdHJpbmciIT09eChyKSYmdChyKX0pfShhcmd1bWVudHMpLG4mJiF0JiZ1KCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB3LmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGUsdCl7dmFyIG47d2hpbGUoKG49dy5pbkFycmF5KHQsbyxuKSk+LTEpby5zcGxpY2UobiwxKSxuPD1zJiZzLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/dy5pbkFycmF5KGUsbyk+LTE6by5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG89W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gaT1hPVtdLG89bj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFvfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9YT1bXSxufHx0fHwobz1uPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWl9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsbil7cmV0dXJuIGl8fChuPVtlLChuPW58fFtdKS5zbGljZT9uLnNsaWNlKCk6bl0sYS5wdXNoKG4pLHR8fHUoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBsLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBsfTtmdW5jdGlvbiBJKGUpe3JldHVybiBlfWZ1bmN0aW9uIFcoZSl7dGhyb3cgZX1mdW5jdGlvbiAkKGUsdCxuLHIpe3ZhciBpO3RyeXtlJiZnKGk9ZS5wcm9taXNlKT9pLmNhbGwoZSkuZG9uZSh0KS5mYWlsKG4pOmUmJmcoaT1lLnRoZW4pP2kuY2FsbChlLHQsbik6dC5hcHBseSh2b2lkIDAsW2VdLnNsaWNlKHIpKX1jYXRjaChlKXtuLmFwcGx5KHZvaWQgMCxbZV0pfX13LmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24odCl7dmFyIG49W1sibm90aWZ5IiwicHJvZ3Jlc3MiLHcuQ2FsbGJhY2tzKCJtZW1vcnkiKSx3LkNhbGxiYWNrcygibWVtb3J5IiksMl0sWyJyZXNvbHZlIiwiZG9uZSIsdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMCwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLHI9InBlbmRpbmciLGk9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBvLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sImNhdGNoIjpmdW5jdGlvbihlKXtyZXR1cm4gaS50aGVuKG51bGwsZSl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7cmV0dXJuIHcuRGVmZXJyZWQoZnVuY3Rpb24odCl7dy5lYWNoKG4sZnVuY3Rpb24obixyKXt2YXIgaT1nKGVbcls0XV0pJiZlW3JbNF1dO29bclsxXV0oZnVuY3Rpb24oKXt2YXIgZT1pJiZpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlJiZnKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkucHJvZ3Jlc3ModC5ub3RpZnkpLmRvbmUodC5yZXNvbHZlKS5mYWlsKHQucmVqZWN0KTp0W3JbMF0rIldpdGgiXSh0aGlzLGk/W2VdOmFyZ3VtZW50cyl9KX0pLGU9bnVsbH0pLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbih0LHIsaSl7dmFyIG89MDtmdW5jdGlvbiBhKHQsbixyLGkpe3JldHVybiBmdW5jdGlvbigpe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMsbD1mdW5jdGlvbigpe3ZhciBlLGw7aWYoISh0PG8pKXtpZigoZT1yLmFwcGx5KHMsdSkpPT09bi5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7bD1lJiYoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJmUudGhlbixnKGwpP2k/bC5jYWxsKGUsYShvLG4sSSxpKSxhKG8sbixXLGkpKToobysrLGwuY2FsbChlLGEobyxuLEksaSksYShvLG4sVyxpKSxhKG8sbixJLG4ubm90aWZ5V2l0aCkpKToociE9PUkmJihzPXZvaWQgMCx1PVtlXSksKGl8fG4ucmVzb2x2ZVdpdGgpKHMsdSkpfX0sYz1pP2w6ZnVuY3Rpb24oKXt0cnl7bCgpfWNhdGNoKGUpe3cuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYmdy5EZWZlcnJlZC5leGNlcHRpb25Ib29rKGUsYy5zdGFja1RyYWNlKSx0KzE+PW8mJihyIT09VyYmKHM9dm9pZCAwLHU9W2VdKSxuLnJlamVjdFdpdGgocyx1KSl9fTt0P2MoKToody5EZWZlcnJlZC5nZXRTdGFja0hvb2smJihjLnN0YWNrVHJhY2U9dy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksZS5zZXRUaW1lb3V0KGMpKX19cmV0dXJuIHcuRGVmZXJyZWQoZnVuY3Rpb24oZSl7blswXVszXS5hZGQoYSgwLGUsZyhpKT9pOkksZS5ub3RpZnlXaXRoKSksblsxXVszXS5hZGQoYSgwLGUsZyh0KT90OkkpKSxuWzJdWzNdLmFkZChhKDAsZSxnKHIpP3I6VykpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lP3cuZXh0ZW5kKGUsaSk6aX19LG89e307cmV0dXJuIHcuZWFjaChuLGZ1bmN0aW9uKGUsdCl7dmFyIGE9dFsyXSxzPXRbNV07aVt0WzFdXT1hLmFkZCxzJiZhLmFkZChmdW5jdGlvbigpe3I9c30sblszLWVdWzJdLmRpc2FibGUsblszLWVdWzNdLmRpc2FibGUsblswXVsyXS5sb2NrLG5bMF1bM10ubG9jayksYS5hZGQodFszXS5maXJlKSxvW3RbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIG9bdFswXSsiV2l0aCJdKHRoaXM9PT1vP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sb1t0WzBdKyJXaXRoIl09YS5maXJlV2l0aH0pLGkucHJvbWlzZShvKSx0JiZ0LmNhbGwobyxvKSxvfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj10LHI9QXJyYXkobiksaT1vLmNhbGwoYXJndW1lbnRzKSxhPXcuRGVmZXJyZWQoKSxzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuKXtyW2VdPXRoaXMsaVtlXT1hcmd1bWVudHMubGVuZ3RoPjE/by5jYWxsKGFyZ3VtZW50cyk6biwtLXR8fGEucmVzb2x2ZVdpdGgocixpKX19O2lmKHQ8PTEmJigkKGUsYS5kb25lKHMobikpLnJlc29sdmUsYS5yZWplY3QsIXQpLCJwZW5kaW5nIj09PWEuc3RhdGUoKXx8ZyhpW25dJiZpW25dLnRoZW4pKSlyZXR1cm4gYS50aGVuKCk7d2hpbGUobi0tKSQoaVtuXSxzKG4pLGEucmVqZWN0KTtyZXR1cm4gYS5wcm9taXNlKCl9fSk7dmFyIEI9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87dy5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKHQsbil7ZS5jb25zb2xlJiZlLmNvbnNvbGUud2FybiYmdCYmQi50ZXN0KHQubmFtZSkmJmUuY29uc29sZS53YXJuKCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiAiK3QubWVzc2FnZSx0LnN0YWNrLG4pfSx3LnJlYWR5RXhjZXB0aW9uPWZ1bmN0aW9uKHQpe2Uuc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IHR9KX07dmFyIEY9dy5EZWZlcnJlZCgpO3cuZm4ucmVhZHk9ZnVuY3Rpb24oZSl7cmV0dXJuIEYudGhlbihlKVsiY2F0Y2giXShmdW5jdGlvbihlKXt3LnJlYWR5RXhjZXB0aW9uKGUpfSksdGhpc30sdy5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oZSl7KCEwPT09ZT8tLXcucmVhZHlXYWl0OncuaXNSZWFkeSl8fCh3LmlzUmVhZHk9ITAsITAhPT1lJiYtLXcucmVhZHlXYWl0PjB8fEYucmVzb2x2ZVdpdGgocixbd10pKX19KSx3LnJlYWR5LnRoZW49Ri50aGVuO2Z1bmN0aW9uIF8oKXtyLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLF8pLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsXyksdy5yZWFkeSgpfSJjb21wbGV0ZSI9PT1yLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PXIucmVhZHlTdGF0ZSYmIXIuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2Uuc2V0VGltZW91dCh3LnJlYWR5KTooci5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixfKSxlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLF8pKTt2YXIgej1mdW5jdGlvbihlLHQsbixyLGksbyxhKXt2YXIgcz0wLHU9ZS5sZW5ndGgsbD1udWxsPT1uO2lmKCJvYmplY3QiPT09eChuKSl7aT0hMDtmb3IocyBpbiBuKXooZSx0LHMsbltzXSwhMCxvLGEpfWVsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsZyhyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbCh3KGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LFg9L14tbXMtLyxVPS8tKFthLXpdKS9nO2Z1bmN0aW9uIFYoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIEcoZSl7cmV0dXJuIGUucmVwbGFjZShYLCJtcy0iKS5yZXBsYWNlKFUsVil9dmFyIFk9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBRKCl7dGhpcy5leHBhbmRvPXcuZXhwYW5kbytRLnVpZCsrfVEudWlkPTEsUS5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9e30sWShlKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdGhpcy5leHBhbmRvLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pKSksdH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMuY2FjaGUoZSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KWlbRyh0KV09bjtlbHNlIGZvcihyIGluIHQpaVtHKHIpXT10W3JdO3JldHVybiBpfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW0codCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJnZvaWQgMD09PW4/dGhpcy5nZXQoZSx0KToodGhpcy5zZXQoZSx0LG4pLHZvaWQgMCE9PW4/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09dCl7bj0odD1BcnJheS5pc0FycmF5KHQpP3QubWFwKEcpOih0PUcodCkpaW4gcj9bdF06dC5tYXRjaChNKXx8W10pLmxlbmd0aDt3aGlsZShuLS0pZGVsZXRlIHJbdFtuXV19KHZvaWQgMD09PXR8fHcuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIXcuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBKPW5ldyBRLEs9bmV3IFEsWj0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLGVlPS9bQS1aXS9nO2Z1bmN0aW9uIHRlKGUpe3JldHVybiJ0cnVlIj09PWV8fCJmYWxzZSIhPT1lJiYoIm51bGwiPT09ZT9udWxsOmU9PT0rZSsiIj8rZTpaLnRlc3QoZSk/SlNPTi5wYXJzZShlKTplKX1mdW5jdGlvbiBuZShlLHQsbil7dmFyIHI7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShlZSwiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49ZS5nZXRBdHRyaWJ1dGUocikpKXt0cnl7bj10ZShuKX1jYXRjaChlKXt9Sy5zZXQoZSx0LG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59dy5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIEsuaGFzRGF0YShlKXx8Si5oYXNEYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gSy5hY2Nlc3MoZSx0LG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7Sy5yZW1vdmUoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBKLmFjY2VzcyhlLHQsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7Si5yZW1vdmUoZSx0KX19KSx3LmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvPXRoaXNbMF0sYT1vJiZvLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09ZSl7aWYodGhpcy5sZW5ndGgmJihpPUsuZ2V0KG8pLDE9PT1vLm5vZGVUeXBlJiYhSi5nZXQobywiaGFzRGF0YUF0dHJzIikpKXtuPWEubGVuZ3RoO3doaWxlKG4tLSlhW25dJiYwPT09KHI9YVtuXS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpJiYocj1HKHIuc2xpY2UoNSkpLG5lKG8scixpW3JdKSk7Si5zZXQobywiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGl9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP3RoaXMuZWFjaChmdW5jdGlvbigpe0suc2V0KHRoaXMsZSl9KTp6KHRoaXMsZnVuY3Rpb24odCl7dmFyIG47aWYobyYmdm9pZCAwPT09dCl7aWYodm9pZCAwIT09KG49Sy5nZXQobyxlKSkpcmV0dXJuIG47aWYodm9pZCAwIT09KG49bmUobyxlKSkpcmV0dXJuIG59ZWxzZSB0aGlzLmVhY2goZnVuY3Rpb24oKXtLLnNldCh0aGlzLGUsdCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Sy5yZW1vdmUodGhpcyxlKX0pfX0pLHcuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoZSlyZXR1cm4gdD0odHx8ImZ4IikrInF1ZXVlIixyPUouZ2V0KGUsdCksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9Si5hY2Nlc3MoZSx0LHcubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKGUsdCl7dD10fHwiZngiO3ZhciBuPXcucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89dy5fcXVldWVIb29rcyhlLHQpLGE9ZnVuY3Rpb24oKXt3LmRlcXVldWUoZSx0KX07ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGEsbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gSi5nZXQoZSxuKXx8Si5hY2Nlc3MoZSxuLHtlbXB0eTp3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtKLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSx3LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPSJmeCIsbi0tKSxhcmd1bWVudHMubGVuZ3RoPG4/dy5xdWV1ZSh0aGlzWzBdLGUpOnZvaWQgMD09PXQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj13LnF1ZXVlKHRoaXMsZSx0KTt3Ll9xdWV1ZUhvb2tzKHRoaXMsZSksImZ4Ij09PWUmJiJpbnByb2dyZXNzIiE9PW5bMF0mJncuZGVxdWV1ZSh0aGlzLGUpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3cuZGVxdWV1ZSh0aGlzLGUpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTEsaT13LkRlZmVycmVkKCksbz10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8aS5yZXNvbHZlV2l0aChvLFtvXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHwiZngiO3doaWxlKGEtLSkobj1KLmdldChvW2FdLGUrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksaS5wcm9taXNlKHQpfX0pO3ZhciByZT0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxpZT1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrcmUrIikoW2EteiVdKikkIiwiaSIpLG9lPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sYWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmdy5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSkmJiJub25lIj09PXcuY3NzKGUsImRpc3BsYXkiKX0sc2U9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhPXt9O2ZvcihvIGluIHQpYVtvXT1lLnN0eWxlW29dLGUuc3R5bGVbb109dFtvXTtpPW4uYXBwbHkoZSxyfHxbXSk7Zm9yKG8gaW4gdCllLnN0eWxlW29dPWFbb107cmV0dXJuIGl9O2Z1bmN0aW9uIHVlKGUsdCxuLHIpe3ZhciBpLG8sYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gdy5jc3MoZSx0LCIiKX0sdT1zKCksbD1uJiZuWzNdfHwody5jc3NOdW1iZXJbdF0/IiI6InB4IiksYz0ody5jc3NOdW1iZXJbdF18fCJweCIhPT1sJiYrdSkmJmllLmV4ZWMody5jc3MoZSx0KSk7aWYoYyYmY1szXSE9PWwpe3UvPTIsbD1sfHxjWzNdLGM9K3V8fDE7d2hpbGUoYS0tKXcuc3R5bGUoZSx0LGMrbCksKDEtbykqKDEtKG89cygpL3V8fC41KSk8PTAmJihhPTApLGMvPW87Yyo9Mix3LnN0eWxlKGUsdCxjK2wpLG49bnx8W119cmV0dXJuIG4mJihjPStjfHwrdXx8MCxpPW5bMV0/YysoblsxXSsxKSpuWzJdOituWzJdLHImJihyLnVuaXQ9bCxyLnN0YXJ0PWMsci5lbmQ9aSkpLGl9dmFyIGxlPXt9O2Z1bmN0aW9uIGNlKGUpe3ZhciB0LG49ZS5vd25lckRvY3VtZW50LHI9ZS5ub2RlTmFtZSxpPWxlW3JdO3JldHVybiBpfHwodD1uLmJvZHkuYXBwZW5kQ2hpbGQobi5jcmVhdGVFbGVtZW50KHIpKSxpPXcuY3NzKHQsImRpc3BsYXkiKSx0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksIm5vbmUiPT09aSYmKGk9ImJsb2NrIiksbGVbcl09aSxpKX1mdW5jdGlvbiBmZShlLHQpe2Zvcih2YXIgbixyLGk9W10sbz0wLGE9ZS5sZW5ndGg7bzxhO28rKykocj1lW29dKS5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LHQ/KCJub25lIj09PW4mJihpW29dPUouZ2V0KHIsImRpc3BsYXkiKXx8bnVsbCxpW29dfHwoci5zdHlsZS5kaXNwbGF5PSIiKSksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJmFlKHIpJiYoaVtvXT1jZShyKSkpOiJub25lIiE9PW4mJihpW29dPSJub25lIixKLnNldChyLCJkaXNwbGF5IixuKSkpO2ZvcihvPTA7bzxhO28rKyludWxsIT1pW29dJiYoZVtvXS5zdHlsZS5kaXNwbGF5PWlbb10pO3JldHVybiBlfXcuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIGZlKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIGZlKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2FlKHRoaXMpP3codGhpcykuc2hvdygpOncodGhpcykuaGlkZSgpfSl9fSk7dmFyIHBlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLGRlPS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pLGhlPS9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxnZT17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2dlLm9wdGdyb3VwPWdlLm9wdGlvbixnZS50Ym9keT1nZS50Zm9vdD1nZS5jb2xncm91cD1nZS5jYXB0aW9uPWdlLnRoZWFkLGdlLnRoPWdlLnRkO2Z1bmN0aW9uIHllKGUsdCl7dmFyIG47cmV0dXJuIG49InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHx8IioiKToidW5kZWZpbmVkIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbD9lLnF1ZXJ5U2VsZWN0b3JBbGwodHx8IioiKTpbXSx2b2lkIDA9PT10fHx0JiZOKGUsdCk/dy5tZXJnZShbZV0sbik6bn1mdW5jdGlvbiB2ZShlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylKLnNldChlW25dLCJnbG9iYWxFdmFsIiwhdHx8Si5nZXQodFtuXSwiZ2xvYmFsRXZhbCIpKX12YXIgbWU9Lzx8JiM/XHcrOy87ZnVuY3Rpb24geGUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZigib2JqZWN0Ij09PXgobykpdy5tZXJnZShwLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYobWUudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KGRlLmV4ZWMobyl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1nZVtzXXx8Z2UuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXSt3Lmh0bWxQcmVmaWx0ZXIobykrdVsyXSxjPXVbMF07d2hpbGUoYy0tKWE9YS5sYXN0Q2hpbGQ7dy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtmLnRleHRDb250ZW50PSIiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiZ3LmluQXJyYXkobyxyKT4tMSlpJiZpLnB1c2gobyk7ZWxzZSBpZihsPXcuY29udGFpbnMoby5vd25lckRvY3VtZW50LG8pLGE9eWUoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksbCYmdmUoYSksbil7Yz0wO3doaWxlKG89YVtjKytdKWhlLnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKX1yZXR1cm4gZn0hZnVuY3Rpb24oKXt2YXIgZT1yLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChyLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSx0PXIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksdC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksZS5hcHBlbmRDaGlsZCh0KSxoLmNoZWNrQ2xvbmU9ZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsZS5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLGgubm9DbG9uZUNoZWNrZWQ9ISFlLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZX0oKTt2YXIgYmU9ci5kb2N1bWVudEVsZW1lbnQsd2U9L15rZXkvLFRlPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxDZT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gRWUoKXtyZXR1cm4hMH1mdW5jdGlvbiBrZSgpe3JldHVybiExfWZ1bmN0aW9uIFNlKCl7dHJ5e3JldHVybiByLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX1mdW5jdGlvbiBEZShlLHQsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIHQpeyJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCk7Zm9yKHMgaW4gdClEZShlLHMsbixyLHRbc10sbyk7cmV0dXJuIGV9aWYobnVsbD09ciYmbnVsbD09aT8oaT1uLHI9bj12b2lkIDApOm51bGw9PWkmJigic3RyaW5nIj09dHlwZW9mIG4/KGk9cixyPXZvaWQgMCk6KGk9cixyPW4sbj12b2lkIDApKSwhMT09PWkpaT1rZTtlbHNlIGlmKCFpKXJldHVybiBlO3JldHVybiAxPT09byYmKGE9aSwoaT1mdW5jdGlvbihlKXtyZXR1cm4gdygpLm9mZihlKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPXcuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC5hZGQodGhpcyx0LGkscixuKX0pfXcuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHk9Si5nZXQoZSk7aWYoeSl7bi5oYW5kbGVyJiYobj0obz1uKS5oYW5kbGVyLGk9by5zZWxlY3RvciksaSYmdy5maW5kLm1hdGNoZXNTZWxlY3RvcihiZSxpKSxuLmd1aWR8fChuLmd1aWQ9dy5ndWlkKyspLCh1PXkuZXZlbnRzKXx8KHU9eS5ldmVudHM9e30pLChhPXkuaGFuZGxlKXx8KGE9eS5oYW5kbGU9ZnVuY3Rpb24odCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB3JiZ3LmV2ZW50LnRyaWdnZXJlZCE9PXQudHlwZT93LmV2ZW50LmRpc3BhdGNoLmFwcGx5KGUsYXJndW1lbnRzKTp2b2lkIDB9KSxsPSh0PSh0fHwiIikubWF0Y2goTSl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0pZD1nPShzPUNlLmV4ZWModFtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShpP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkLGY9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxjPXcuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJncuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LG8pLChwPXVbZF0pfHwoKHA9dVtkXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKGUscixoLGEpfHxlLmFkZEV2ZW50TGlzdGVuZXImJmUuYWRkRXZlbnRMaXN0ZW5lcihkLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwoZSxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpwLnB1c2goYyksdy5ldmVudC5nbG9iYWxbZF09ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx5PUouaGFzRGF0YShlKSYmSi5nZXQoZSk7aWYoeSYmKHU9eS5ldmVudHMpKXtsPSh0PSh0fHwiIikubWF0Y2goTSl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0paWYocz1DZS5leGVjKHRbbF0pfHxbXSxkPWc9c1sxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7Zj13LmV2ZW50LnNwZWNpYWxbZF18fHt9LHA9dVtkPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJigiKioiIT09cnx8IWMuc2VsZWN0b3IpfHwocC5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbChlLGMpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbChlLGgseS5oYW5kbGUpfHx3LnJlbW92ZUV2ZW50KGUsZCx5LmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSl3LmV2ZW50LnJlbW92ZShlLGQrdFtsXSxuLHIsITApO3cuaXNFbXB0eU9iamVjdCh1KSYmSi5yZW1vdmUoZSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5ldmVudC5maXgoZSksbixyLGksbyxhLHMsdT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksbD0oSi5nZXQodGhpcywiZXZlbnRzIil8fHt9KVt0LnR5cGVdfHxbXSxjPXcuZXZlbnQuc3BlY2lhbFt0LnR5cGVdfHx7fTtmb3IodVswXT10LG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXVbbl09YXJndW1lbnRzW25dO2lmKHQuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8ITEhPT1jLnByZURpc3BhdGNoLmNhbGwodGhpcyx0KSl7cz13LmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyx0LGwpLG49MDt3aGlsZSgobz1zW24rK10pJiYhdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXt0LmN1cnJlbnRUYXJnZXQ9by5lbGVtLHI9MDt3aGlsZSgoYT1vLmhhbmRsZXJzW3IrK10pJiYhdC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKXQucm5hbWVzcGFjZSYmIXQucm5hbWVzcGFjZS50ZXN0KGEubmFtZXNwYWNlKXx8KHQuaGFuZGxlT2JqPWEsdC5kYXRhPWEuZGF0YSx2b2lkIDAhPT0oaT0oKHcuZXZlbnQuc3BlY2lhbFthLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8YS5oYW5kbGVyKS5hcHBseShvLmVsZW0sdSkpJiYhMT09PSh0LnJlc3VsdD1pKSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsdCksdC5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoImNsaWNrIj09PWUudHlwZSYmZS5idXR0b24+PTEpKWZvcig7bCE9PXRoaXM7bD1sLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWwubm9kZVR5cGUmJigiY2xpY2siIT09ZS50eXBlfHwhMCE9PWwuZGlzYWJsZWQpKXtmb3Iobz1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbaT0ocj10W25dKS5zZWxlY3RvcisiICJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD93KGksdGhpcykuaW5kZXgobCk+LTE6dy5maW5kKGksdGhpcyxudWxsLFtsXSkubGVuZ3RoKSxhW2ldJiZvLnB1c2gocik7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOm99KX1yZXR1cm4gbD10aGlzLHU8dC5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOnQuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHcuRXZlbnQucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpnKHQpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0KHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbZV19LHNldDpmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVt3LmV4cGFuZG9dP2U6bmV3IHcuRXZlbnQoZSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXMhPT1TZSgpJiZ0aGlzLmZvY3VzKXJldHVybiB0aGlzLmZvY3VzKCksITF9LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzPT09U2UoKSYmdGhpcy5ibHVyKXJldHVybiB0aGlzLmJsdXIoKSwhMX0sZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGNsaWNrOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYoImNoZWNrYm94Ij09PXRoaXMudHlwZSYmdGhpcy5jbGljayYmTih0aGlzLCJpbnB1dCIpKXJldHVybiB0aGlzLmNsaWNrKCksITF9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3JldHVybiBOKGUudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnJlc3VsdCYmZS5vcmlnaW5hbEV2ZW50JiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fX0sdy5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0sdy5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHcuRXZlbnQpKXJldHVybiBuZXcgdy5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlP0VlOmtlLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJncuZXh0ZW5kKHRoaXMsdCksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1t3LmV4cGFuZG9dPSEwfSx3LkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6dy5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6a2UsaXNQcm9wYWdhdGlvblN0b3BwZWQ6a2UsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6a2UsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUVlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSx3LmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsImNoYXIiOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYnV0dG9uO3JldHVybiBudWxsPT1lLndoaWNoJiZ3ZS50ZXN0KGUudHlwZSk/bnVsbCE9ZS5jaGFyQ29kZT9lLmNoYXJDb2RlOmUua2V5Q29kZTohZS53aGljaCYmdm9pZCAwIT09dCYmVGUudGVzdChlLnR5cGUpPzEmdD8xOjImdD8zOjQmdD8yOjA6ZS53aGljaH19LHcuZXZlbnQuYWRkUHJvcCksdy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLHQpe3cuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LG89ZS5oYW5kbGVPYmo7cmV0dXJuIGkmJihpPT09cnx8dy5jb250YWlucyhyLGkpKXx8KGUudHlwZT1vLm9yaWdUeXBlLG49by5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnR5cGU9dCksbn19fSksdy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBEZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIERlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLHcoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PXQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0fHwobj10LHQ9dm9pZCAwKSwhMT09PW4mJihuPWtlKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt3LmV2ZW50LnJlbW92ZSh0aGlzLGUsbix0KX0pfX0pO3ZhciBOZT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksQWU9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksamU9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2kscWU9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nO2Z1bmN0aW9uIExlKGUsdCl7cmV0dXJuIE4oZSwidGFibGUiKSYmTigxMSE9PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIik/dyhlKS5jaGlsZHJlbigidGJvZHkiKVswXXx8ZTplfWZ1bmN0aW9uIEhlKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gT2UoZSl7cmV0dXJuInRydWUvIj09PShlLnR5cGV8fCIiKS5zbGljZSgwLDUpP2UudHlwZT1lLnR5cGUuc2xpY2UoNSk6ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIFBlKGUsdCl7dmFyIG4scixpLG8sYSxzLHUsbDtpZigxPT09dC5ub2RlVHlwZSl7aWYoSi5oYXNEYXRhKGUpJiYobz1KLmFjY2VzcyhlKSxhPUouc2V0KHQsbyksbD1vLmV2ZW50cykpe2RlbGV0ZSBhLmhhbmRsZSxhLmV2ZW50cz17fTtmb3IoaSBpbiBsKWZvcihuPTAscj1sW2ldLmxlbmd0aDtuPHI7bisrKXcuZXZlbnQuYWRkKHQsaSxsW2ldW25dKX1LLmhhc0RhdGEoZSkmJihzPUsuYWNjZXNzKGUpLHU9dy5leHRlbmQoe30scyksSy5zZXQodCx1KSl9fWZ1bmN0aW9uIE1lKGUsdCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyJpbnB1dCI9PT1uJiZwZS50ZXN0KGUudHlwZSk/dC5jaGVja2VkPWUuY2hlY2tlZDoiaW5wdXQiIT09biYmInRleHRhcmVhIiE9PW58fCh0LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gUmUoZSx0LG4scil7dD1hLmFwcGx5KFtdLHQpO3ZhciBpLG8scyx1LGwsYyxmPTAscD1lLmxlbmd0aCxkPXAtMSx5PXRbMF0sdj1nKHkpO2lmKHZ8fHA+MSYmInN0cmluZyI9PXR5cGVvZiB5JiYhaC5jaGVja0Nsb25lJiZqZS50ZXN0KHkpKXJldHVybiBlLmVhY2goZnVuY3Rpb24oaSl7dmFyIG89ZS5lcShpKTt2JiYodFswXT15LmNhbGwodGhpcyxpLG8uaHRtbCgpKSksUmUobyx0LG4scil9KTtpZihwJiYoaT14ZSh0LGVbMF0ub3duZXJEb2N1bWVudCwhMSxlLHIpLG89aS5maXJzdENoaWxkLDE9PT1pLmNoaWxkTm9kZXMubGVuZ3RoJiYoaT1vKSxvfHxyKSl7Zm9yKHU9KHM9dy5tYXAoeWUoaSwic2NyaXB0IiksSGUpKS5sZW5ndGg7ZjxwO2YrKylsPWksZiE9PWQmJihsPXcuY2xvbmUobCwhMCwhMCksdSYmdy5tZXJnZShzLHllKGwsInNjcmlwdCIpKSksbi5jYWxsKGVbZl0sbCxmKTtpZih1KWZvcihjPXNbcy5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCx3Lm1hcChzLE9lKSxmPTA7Zjx1O2YrKylsPXNbZl0saGUudGVzdChsLnR5cGV8fCIiKSYmIUouYWNjZXNzKGwsImdsb2JhbEV2YWwiKSYmdy5jb250YWlucyhjLGwpJiYobC5zcmMmJiJtb2R1bGUiIT09KGwudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/dy5fZXZhbFVybCYmdy5fZXZhbFVybChsLnNyYyk6bShsLnRleHRDb250ZW50LnJlcGxhY2UocWUsIiIpLGMsbCkpfXJldHVybiBlfWZ1bmN0aW9uIEllKGUsdCxuKXtmb3IodmFyIHIsaT10P3cuZmlsdGVyKHQsZSk6ZSxvPTA7bnVsbCE9KHI9aVtvXSk7bysrKW58fDEhPT1yLm5vZGVUeXBlfHx3LmNsZWFuRGF0YSh5ZShyKSksci5wYXJlbnROb2RlJiYobiYmdy5jb250YWlucyhyLm93bmVyRG9jdW1lbnQscikmJnZlKHllKHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiBlfXcuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoTmUsIjwkMT48LyQyPiIpfSxjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNsb25lTm9kZSghMCksdT13LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKTtpZighKGgubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fHcuaXNYTUxEb2MoZSkpKWZvcihhPXllKHMpLHI9MCxpPShvPXllKGUpKS5sZW5ndGg7cjxpO3IrKylNZShvW3JdLGFbcl0pO2lmKHQpaWYobilmb3Iobz1vfHx5ZShlKSxhPWF8fHllKHMpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspUGUob1tyXSxhW3JdKTtlbHNlIFBlKGUscyk7cmV0dXJuKGE9eWUocywic2NyaXB0IikpLmxlbmd0aD4wJiZ2ZShhLCF1JiZ5ZShlLCJzY3JpcHQiKSksc30sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHIsaT13LmV2ZW50LnNwZWNpYWwsbz0wO3ZvaWQgMCE9PShuPWVbb10pO28rKylpZihZKG4pKXtpZih0PW5bSi5leHBhbmRvXSl7aWYodC5ldmVudHMpZm9yKHIgaW4gdC5ldmVudHMpaVtyXT93LmV2ZW50LnJlbW92ZShuLHIpOncucmVtb3ZlRXZlbnQobixyLHQuaGFuZGxlKTtuW0ouZXhwYW5kb109dm9pZCAwfW5bSy5leHBhbmRvXSYmKG5bSy5leHBhbmRvXT12b2lkIDApfX19KSx3LmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiBJZSh0aGlzLGUsITApfSxyZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIEllKHRoaXMsZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHoodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT93LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUmUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fExlKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9TGUodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYody5jbGVhbkRhdGEoeWUoZSwhMSkpLGUudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB3LmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIUFlLnRlc3QoZSkmJiFnZVsoZGUuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9dy5odG1sUHJlZmlsdGVyKGUpO3RyeXtmb3IoO248cjtuKyspMT09PSh0PXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKHcuY2xlYW5EYXRhKHllKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIFJlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTt3LmluQXJyYXkodGhpcyxlKTwwJiYody5jbGVhbkRhdGEoeWUodGhpcykpLG4mJm4ucmVwbGFjZUNoaWxkKHQsdGhpcykpfSxlKX19KSx3LmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLHI9W10saT13KGUpLG89aS5sZW5ndGgtMSxhPTA7YTw9bzthKyspbj1hPT09bz90aGlzOnRoaXMuY2xvbmUoITApLHcoaVthXSlbdF0obikscy5hcHBseShyLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhyKX19KTt2YXIgV2U9bmV3IFJlZ0V4cCgiXigiK3JlKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksJGU9ZnVuY3Rpb24odCl7dmFyIG49dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiBuJiZuLm9wZW5lcnx8KG49ZSksbi5nZXRDb21wdXRlZFN0eWxlKHQpfSxCZT1uZXcgUmVnRXhwKG9lLmpvaW4oInwiKSwiaSIpOyFmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtpZihjKXtsLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGMuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIsYmUuYXBwZW5kQ2hpbGQobCkuYXBwZW5kQ2hpbGQoYyk7dmFyIHQ9ZS5nZXRDb21wdXRlZFN0eWxlKGMpO2k9IjElIiE9PXQudG9wLHU9MTI9PT1uKHQubWFyZ2luTGVmdCksYy5zdHlsZS5yaWdodD0iNjAlIixzPTM2PT09bih0LnJpZ2h0KSxvPTM2PT09bih0LndpZHRoKSxjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYT0zNj09PWMub2Zmc2V0V2lkdGh8fCJhYnNvbHV0ZSIsYmUucmVtb3ZlQ2hpbGQobCksYz1udWxsfX1mdW5jdGlvbiBuKGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBpLG8sYSxzLHUsbD1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ci5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLnN0eWxlJiYoYy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixoLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09Yy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCx3LmV4dGVuZChoLHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiB0KCksb30scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHN9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLGl9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiB0KCksdX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0KCksYX19KSl9KCk7ZnVuY3Rpb24gRmUoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5zdHlsZTtyZXR1cm4obj1ufHwkZShlKSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSl8fHcuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHwoYT13LnN0eWxlKGUsdCkpLCFoLnBpeGVsQm94U3R5bGVzKCkmJldlLnRlc3QoYSkmJkJlLnRlc3QodCkmJihyPXMud2lkdGgsaT1zLm1pbldpZHRoLG89cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1pLHMubWF4V2lkdGg9bykpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uIF9lKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX12YXIgemU9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFhlPS9eLS0vLFVlPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxWZT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn0sR2U9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFllPXIuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7ZnVuY3Rpb24gUWUoZSl7aWYoZSBpbiBZZSlyZXR1cm4gZTt2YXIgdD1lWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPUdlLmxlbmd0aDt3aGlsZShuLS0paWYoKGU9R2Vbbl0rdClpbiBZZSlyZXR1cm4gZX1mdW5jdGlvbiBKZShlKXt2YXIgdD13LmNzc1Byb3BzW2VdO3JldHVybiB0fHwodD13LmNzc1Byb3BzW2VdPVFlKGUpfHxlKSx0fWZ1bmN0aW9uIEtlKGUsdCxuKXt2YXIgcj1pZS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTp0fWZ1bmN0aW9uIFplKGUsdCxuLHIsaSxvKXt2YXIgYT0id2lkdGgiPT09dD8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPXcuY3NzKGUsbitvZVthXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHUtPXcuY3NzKGUsInBhZGRpbmciK29lW2FdLCEwLGkpKSwibWFyZ2luIiE9PW4mJih1LT13LmNzcyhlLCJib3JkZXIiK29lW2FdKyJXaWR0aCIsITAsaSkpKToodSs9dy5jc3MoZSwicGFkZGluZyIrb2VbYV0sITAsaSksInBhZGRpbmciIT09bj91Kz13LmNzcyhlLCJib3JkZXIiK29lW2FdKyJXaWR0aCIsITAsaSk6cys9dy5jc3MoZSwiYm9yZGVyIitvZVthXSsiV2lkdGgiLCEwLGkpKTtyZXR1cm4hciYmbz49MCYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSkpLHV9ZnVuY3Rpb24gZXQoZSx0LG4pe3ZhciByPSRlKGUpLGk9RmUoZSx0LHIpLG89ImJvcmRlci1ib3giPT09dy5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSxhPW87aWYoV2UudGVzdChpKSl7aWYoIW4pcmV0dXJuIGk7aT0iYXV0byJ9cmV0dXJuIGE9YSYmKGguYm94U2l6aW5nUmVsaWFibGUoKXx8aT09PWUuc3R5bGVbdF0pLCgiYXV0byI9PT1pfHwhcGFyc2VGbG9hdChpKSYmImlubGluZSI9PT13LmNzcyhlLCJkaXNwbGF5IiwhMSxyKSkmJihpPWVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLGE9ITApLChpPXBhcnNlRmxvYXQoaSl8fDApK1plKGUsdCxufHwobz8iYm9yZGVyIjoiY29udGVudCIpLGEscixpKSsicHgifXcuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49RmUoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8sYSxzPUcodCksdT1YZS50ZXN0KHQpLGw9ZS5zdHlsZTtpZih1fHwodD1KZShzKSksYT13LmNzc0hvb2tzW3RdfHx3LmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KGk9YS5nZXQoZSwhMSxyKSk/aTpsW3RdOyJzdHJpbmciPT0obz10eXBlb2YgbikmJihpPWllLmV4ZWMobikpJiZpWzFdJiYobj11ZShlLHQsaSksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09PW4mJigibnVtYmVyIj09PW8mJihuKz1pJiZpWzNdfHwody5jc3NOdW1iZXJbc10/IiI6InB4IikpLGguY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT10LmluZGV4T2YoImJhY2tncm91bmQiKXx8KGxbdF09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KGUsbixyKSl8fCh1P2wuc2V0UHJvcGVydHkodCxuKTpsW3RdPW4pKX19LGNzczpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1HKHQpO3JldHVybiBYZS50ZXN0KHQpfHwodD1KZShzKSksKGE9dy5jc3NIb29rc1t0XXx8dy5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9RmUoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gVmUmJihpPVZlW3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSwhMD09PW58fGlzRmluaXRlKG8pP298fDA6aSk6aX19KSx3LmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGUsdCl7dy5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbixyKXtpZihuKXJldHVybiF6ZS50ZXN0KHcuY3NzKGUsImRpc3BsYXkiKSl8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/ZXQoZSx0LHIpOnNlKGUsVWUsZnVuY3Rpb24oKXtyZXR1cm4gZXQoZSx0LHIpfSl9LHNldDpmdW5jdGlvbihlLG4scil7dmFyIGksbz0kZShlKSxhPSJib3JkZXItYm94Ij09PXcuY3NzKGUsImJveFNpemluZyIsITEsbykscz1yJiZaZShlLHQscixhLG8pO3JldHVybiBhJiZoLnNjcm9sbGJveFNpemUoKT09PW8ucG9zaXRpb24mJihzLT1NYXRoLmNlaWwoZVsib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tcGFyc2VGbG9hdChvW3RdKS1aZShlLHQsImJvcmRlciIsITEsbyktLjUpKSxzJiYoaT1pZS5leGVjKG4pKSYmInB4IiE9PShpWzNdfHwicHgiKSYmKGUuc3R5bGVbdF09bixuPXcuY3NzKGUsdCkpLEtlKGUsbixzKX19fSksdy5jc3NIb29rcy5tYXJnaW5MZWZ0PV9lKGgucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChGZShlLCJtYXJnaW5MZWZ0IikpfHxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtc2UoZSx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLHcuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGUsdCl7dy5jc3NIb29rc1tlK3RdPXtleHBhbmQ6ZnVuY3Rpb24obil7Zm9yKHZhciByPTAsaT17fSxvPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO3I8NDtyKyspaVtlK29lW3JdK3RdPW9bcl18fG9bci0yXXx8b1swXTtyZXR1cm4gaX19LCJtYXJnaW4iIT09ZSYmKHcuY3NzSG9va3NbZSt0XS5zZXQ9S2UpfSksdy5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fSxhPTA7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHI9JGUoZSksaT10Lmxlbmd0aDthPGk7YSsrKW9bdFthXV09dy5jc3MoZSx0W2FdLCExLHIpO3JldHVybiBvfXJldHVybiB2b2lkIDAhPT1uP3cuc3R5bGUoZSx0LG4pOncuY3NzKGUsdCl9LGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfX0pO2Z1bmN0aW9uIHR0KGUsdCxuLHIsaSl7cmV0dXJuIG5ldyB0dC5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfXcuVHdlZW49dHQsdHQucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0dCxpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHx3LmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9b3x8KHcuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgZT10dC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6dHQucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49dHQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz10PXcuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTp0dC5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSx0dC5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9dHQucHJvdG90eXBlLHR0LnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gMSE9PWUuZWxlbS5ub2RlVHlwZXx8bnVsbCE9ZS5lbGVtW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtlLnByb3BdP2UuZWxlbVtlLnByb3BdOih0PXcuY3NzKGUuZWxlbSxlLnByb3AsIiIpKSYmImF1dG8iIT09dD90OjB9LHNldDpmdW5jdGlvbihlKXt3LmZ4LnN0ZXBbZS5wcm9wXT93LmZ4LnN0ZXBbZS5wcm9wXShlKToxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsPT1lLmVsZW0uc3R5bGVbdy5jc3NQcm9wc1tlLnByb3BdXSYmIXcuY3NzSG9va3NbZS5wcm9wXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzp3LnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSx0dC5wcm9wSG9va3Muc2Nyb2xsVG9wPXR0LnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LHcuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sdy5meD10dC5wcm90b3R5cGUuaW5pdCx3LmZ4LnN0ZXA9e307dmFyIG50LHJ0LGl0PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxvdD0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIGF0KCl7cnQmJighMT09PXIuaGlkZGVuJiZlLnJlcXVlc3RBbmltYXRpb25GcmFtZT9lLnJlcXVlc3RBbmltYXRpb25GcmFtZShhdCk6ZS5zZXRUaW1lb3V0KGF0LHcuZnguaW50ZXJ2YWwpLHcuZngudGljaygpKX1mdW5jdGlvbiBzdCgpe3JldHVybiBlLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtudD12b2lkIDB9KSxudD1EYXRlLm5vdygpfWZ1bmN0aW9uIHV0KGUsdCl7dmFyIG4scj0wLGk9e2hlaWdodDplfTtmb3IodD10PzE6MDtyPDQ7cis9Mi10KWlbIm1hcmdpbiIrKG49b2Vbcl0pXT1pWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoaS5vcGFjaXR5PWkud2lkdGg9ZSksaX1mdW5jdGlvbiBsdChlLHQsbil7Zm9yKHZhciByLGk9KHB0LnR3ZWVuZXJzW3RdfHxbXSkuY29uY2F0KHB0LnR3ZWVuZXJzWyIqIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGN0KGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLGY9IndpZHRoImluIHR8fCJoZWlnaHQiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZhZShlKSx5PUouZ2V0KGUsImZ4c2hvdyIpO24ucXVldWV8fChudWxsPT0oYT13Ll9xdWV1ZUhvb2tzKGUsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLHcucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSk7Zm9yKHIgaW4gdClpZihpPXRbcl0saXQudGVzdChpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1pfHwheXx8dm9pZCAwPT09eVtyXSljb250aW51ZTtnPSEwfWRbcl09eSYmeVtyXXx8dy5zdHlsZShlLHIpfWlmKCh1PSF3LmlzRW1wdHlPYmplY3QodCkpfHwhdy5pc0VtcHR5T2JqZWN0KGQpKXtmJiYxPT09ZS5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2gub3ZlcmZsb3csaC5vdmVyZmxvd1gsaC5vdmVyZmxvd1ldLG51bGw9PShsPXkmJnkuZGlzcGxheSkmJihsPUouZ2V0KGUsImRpc3BsYXkiKSksIm5vbmUiPT09KGM9dy5jc3MoZSwiZGlzcGxheSIpKSYmKGw/Yz1sOihmZShbZV0sITApLGw9ZS5zdHlsZS5kaXNwbGF5fHxsLGM9dy5jc3MoZSwiZGlzcGxheSIpLGZlKFtlXSkpKSwoImlubGluZSI9PT1jfHwiaW5saW5lLWJsb2NrIj09PWMmJm51bGwhPWwpJiYibm9uZSI9PT13LmNzcyhlLCJmbG9hdCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2guZGlzcGxheT1sfSksbnVsbD09bCYmKGM9aC5kaXNwbGF5LGw9Im5vbmUiPT09Yz8iIjpjKSksaC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKGgub3ZlcmZsb3c9ImhpZGRlbiIscC5hbHdheXMoZnVuY3Rpb24oKXtoLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0saC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxoLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITE7Zm9yKHIgaW4gZCl1fHwoeT8iaGlkZGVuImluIHkmJihnPXkuaGlkZGVuKTp5PUouYWNjZXNzKGUsImZ4c2hvdyIse2Rpc3BsYXk6bH0pLG8mJih5LmhpZGRlbj0hZyksZyYmZmUoW2VdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtnfHxmZShbZV0pLEoucmVtb3ZlKGUsImZ4c2hvdyIpO2ZvcihyIGluIGQpdy5zdHlsZShlLHIsZFtyXSl9KSksdT1sdChnP3lbcl06MCxyLHApLHIgaW4geXx8KHlbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX19ZnVuY3Rpb24gZnQoZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYocj1HKG4pLGk9dFtyXSxvPWVbbl0sQXJyYXkuaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLChhPXcuY3NzSG9va3Nbcl0pJiYiZXhwYW5kImluIGEpe289YS5leHBhbmQobyksZGVsZXRlIGVbcl07Zm9yKG4gaW4gbyluIGluIGV8fChlW25dPW9bbl0sdFtuXT1pKX1lbHNlIHRbcl09aX1mdW5jdGlvbiBwdChlLHQsbil7dmFyIHIsaSxvPTAsYT1wdC5wcmVmaWx0ZXJzLmxlbmd0aCxzPXcuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKGkpcmV0dXJuITE7Zm9yKHZhciB0PW50fHxzdCgpLG49TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLXQpLHI9MS0obi9sLmR1cmF0aW9ufHwwKSxvPTAsYT1sLnR3ZWVucy5sZW5ndGg7bzxhO28rKylsLnR3ZWVuc1tvXS5ydW4ocik7cmV0dXJuIHMubm90aWZ5V2l0aChlLFtsLHIsbl0pLHI8MSYmYT9uOihhfHxzLm5vdGlmeVdpdGgoZSxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKGUsW2xdKSwhMSl9LGw9cy5wcm9taXNlKHtlbGVtOmUscHJvcHM6dy5leHRlbmQoe30sdCksb3B0czp3LmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6dy5lYXNpbmcuX2RlZmF1bHR9LG4pLG9yaWdpbmFsUHJvcGVydGllczp0LG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTpudHx8c3QoKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciByPXcuVHdlZW4oZSxsLm9wdHMsdCxuLGwub3B0cy5zcGVjaWFsRWFzaW5nW3RdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPTAscj10P2wudHdlZW5zLmxlbmd0aDowO2lmKGkpcmV0dXJuIHRoaXM7Zm9yKGk9ITA7bjxyO24rKylsLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIHQ/KHMubm90aWZ5V2l0aChlLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgoZSxbbCx0XSkpOnMucmVqZWN0V2l0aChlLFtsLHRdKSx0aGlzfX0pLGM9bC5wcm9wcztmb3IoZnQoYyxsLm9wdHMuc3BlY2lhbEVhc2luZyk7bzxhO28rKylpZihyPXB0LnByZWZpbHRlcnNbb10uY2FsbChsLGUsYyxsLm9wdHMpKXJldHVybiBnKHIuc3RvcCkmJih3Ll9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0b3A9ci5zdG9wLmJpbmQocikpLHI7cmV0dXJuIHcubWFwKGMsbHQsbCksZyhsLm9wdHMuc3RhcnQpJiZsLm9wdHMuc3RhcnQuY2FsbChlLGwpLGwucHJvZ3Jlc3MobC5vcHRzLnByb2dyZXNzKS5kb25lKGwub3B0cy5kb25lLGwub3B0cy5jb21wbGV0ZSkuZmFpbChsLm9wdHMuZmFpbCkuYWx3YXlzKGwub3B0cy5hbHdheXMpLHcuZngudGltZXIody5leHRlbmQodSx7ZWxlbTplLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbH13LkFuaW1hdGlvbj13LmV4dGVuZChwdCx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKGUsdCk7cmV0dXJuIHVlKG4uZWxlbSxlLGllLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7ZyhlKT8odD1lLGU9WyIqIl0pOmU9ZS5tYXRjaChNKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluPWVbcl0scHQudHdlZW5lcnNbbl09cHQudHdlZW5lcnNbbl18fFtdLHB0LnR3ZWVuZXJzW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W2N0XSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P3B0LnByZWZpbHRlcnMudW5zaGlmdChlKTpwdC5wcmVmaWx0ZXJzLnB1c2goZSl9fSksdy5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP3cuZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8ZyhlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYhZyh0KSYmdH07cmV0dXJuIHcuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIHcuZnguc3BlZWRzP3IuZHVyYXRpb249dy5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj13LmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXtnKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZ3LmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sdy5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoYWUpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXcuaXNFbXB0eU9iamVjdChlKSxvPXcuc3BlZWQodCxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgdD1wdCh0aGlzLHcuZXh0ZW5kKHt9LGUpLG8pOyhpfHxKLmdldCh0aGlzLCJmaW5pc2giKSkmJnQuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fCExPT09by5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG4pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihuPXQsdD1lLGU9dm9pZCAwKSx0JiYhMSE9PWUmJnRoaXMucXVldWUoZXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ITAsaT1udWxsIT1lJiZlKyJxdWV1ZUhvb2tzIixvPXcudGltZXJzLGE9Si5nZXQodGhpcyk7aWYoaSlhW2ldJiZhW2ldLnN0b3AmJnIoYVtpXSk7ZWxzZSBmb3IoaSBpbiBhKWFbaV0mJmFbaV0uc3RvcCYmb3QudGVzdChpKSYmcihhW2ldKTtmb3IoaT1vLmxlbmd0aDtpLS07KW9baV0uZWxlbSE9PXRoaXN8fG51bGwhPWUmJm9baV0ucXVldWUhPT1lfHwob1tpXS5hbmltLnN0b3AobiksdD0hMSxvLnNwbGljZShpLDEpKTshdCYmbnx8dy5kZXF1ZXVlKHRoaXMsZSl9KX0sZmluaXNoOmZ1bmN0aW9uKGUpe3JldHVybiExIT09ZSYmKGU9ZXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQsbj1KLmdldCh0aGlzKSxyPW5bZSsicXVldWUiXSxpPW5bZSsicXVldWVIb29rcyJdLG89dy50aW1lcnMsYT1yP3IubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLHcucXVldWUodGhpcyxlLFtdKSxpJiZpLnN0b3AmJmkuc3RvcC5jYWxsKHRoaXMsITApLHQ9by5sZW5ndGg7dC0tOylvW3RdLmVsZW09PT10aGlzJiZvW3RdLnF1ZXVlPT09ZSYmKG9bdF0uYW5pbS5zdG9wKCEwKSxvLnNwbGljZSh0LDEpKTtmb3IodD0wO3Q8YTt0Kyspclt0XSYmclt0XS5maW5pc2gmJnJbdF0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIG4uZmluaXNofSl9fSksdy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHQpe3ZhciBuPXcuZm5bdF07dy5mblt0XT1mdW5jdGlvbihlLHIsaSl7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09dHlwZW9mIGU/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKHV0KHQsITApLGUscixpKX19KSx3LmVhY2goe3NsaWRlRG93bjp1dCgic2hvdyIpLHNsaWRlVXA6dXQoImhpZGUiKSxzbGlkZVRvZ2dsZTp1dCgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSksdy50aW1lcnM9W10sdy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49dy50aW1lcnM7Zm9yKG50PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8dy5meC5zdG9wKCksbnQ9dm9pZCAwfSx3LmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe3cudGltZXJzLnB1c2goZSksdy5meC5zdGFydCgpfSx3LmZ4LmludGVydmFsPTEzLHcuZnguc3RhcnQ9ZnVuY3Rpb24oKXtydHx8KHJ0PSEwLGF0KCkpfSx3LmZ4LnN0b3A9ZnVuY3Rpb24oKXtydD1udWxsfSx3LmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSx3LmZuLmRlbGF5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9dy5meD93LmZ4LnNwZWVkc1t0XXx8dDp0LG49bnx8ImZ4Iix0aGlzLnF1ZXVlKG4sZnVuY3Rpb24obixyKXt2YXIgaT1lLnNldFRpbWVvdXQobix0KTtyLnN0b3A9ZnVuY3Rpb24oKXtlLmNsZWFyVGltZW91dChpKX19KX0sZnVuY3Rpb24oKXt2YXIgZT1yLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdD1yLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKHIuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO2UudHlwZT0iY2hlY2tib3giLGguY2hlY2tPbj0iIiE9PWUudmFsdWUsaC5vcHRTZWxlY3RlZD10LnNlbGVjdGVkLChlPXIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWU9InQiLGUudHlwZT0icmFkaW8iLGgucmFkaW9WYWx1ZT0idCI9PT1lLnZhbHVlfSgpO3ZhciBkdCxodD13LmV4cHIuYXR0ckhhbmRsZTt3LmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsdy5hdHRyLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt3LnJlbW92ZUF0dHIodGhpcyxlKX0pfX0pLHcuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgZS5nZXRBdHRyaWJ1dGU/dy5wcm9wKGUsdCxuKTooMT09PW8mJncuaXNYTUxEb2MoZSl8fChpPXcuYXR0ckhvb2tzW3QudG9Mb3dlckNhc2UoKV18fCh3LmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP2R0OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCB3LnJlbW92ZUF0dHIoZSx0KTppJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuKyIiKSxuKTppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOm51bGw9PShyPXcuZmluZC5hdHRyKGUsdCkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZighaC5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmTihlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXQmJnQubWF0Y2goTSk7aWYoaSYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1pW3IrK10pZS5yZW1vdmVBdHRyaWJ1dGUobil9fSksZHQ9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuITE9PT10P3cucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LHcuZWFjaCh3LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciBuPWh0W3RdfHx3LmZpbmQuYXR0cjtodFt0XT1mdW5jdGlvbihlLHQscil7dmFyIGksbyxhPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcnx8KG89aHRbYV0saHRbYV09aSxpPW51bGwhPW4oZSx0LHIpP2E6bnVsbCxodFthXT1vKSxpfX0pO3ZhciBndD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLHl0PS9eKD86YXxhcmVhKSQvaTt3LmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsdy5wcm9wLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t3LnByb3BGaXhbZV18fGVdfSl9fSksdy5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1lLm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuIDE9PT1vJiZ3LmlzWE1MRG9jKGUpfHwodD13LnByb3BGaXhbdF18fHQsaT13LnByb3BIb29rc1t0XSksdm9pZCAwIT09bj9pJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjplW3RdPW46aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjplW3RdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5maW5kLmF0dHIoZSwidGFiaW5kZXgiKTtyZXR1cm4gdD9wYXJzZUludCh0LDEwKTpndC50ZXN0KGUubm9kZU5hbWUpfHx5dC50ZXN0KGUubm9kZU5hbWUpJiZlLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSxoLm9wdFNlbGVjdGVkfHwody5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTt0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLHcuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7dy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pO2Z1bmN0aW9uIHZ0KGUpe3JldHVybihlLm1hdGNoKE0pfHxbXSkuam9pbigiICIpfWZ1bmN0aW9uIG10KGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIHh0KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6InN0cmluZyI9PXR5cGVvZiBlP2UubWF0Y2goTSl8fFtdOltdfXcuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyx1PTA7aWYoZyhlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3codGhpcykuYWRkQ2xhc3MoZS5jYWxsKHRoaXMsdCxtdCh0aGlzKSkpfSk7aWYoKHQ9eHQoZSkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPW10KG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit2dChpKSsiICIpe2E9MDt3aGlsZShvPXRbYSsrXSlyLmluZGV4T2YoIiAiK28rIiAiKTwwJiYocis9bysiICIpO2khPT0ocz12dChyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzLHU9MDtpZihnKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7dyh0aGlzKS5yZW1vdmVDbGFzcyhlLmNhbGwodGhpcyx0LG10KHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKCh0PXh0KGUpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT1tdChuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIrdnQoaSkrIiAiKXthPTA7d2hpbGUobz10W2ErK10pd2hpbGUoci5pbmRleE9mKCIgIitvKyIgIik+LTEpcj1yLnJlcGxhY2UoIiAiK28rIiAiLCIgIik7aSE9PShzPXZ0KHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZSxyPSJzdHJpbmciPT09bnx8QXJyYXkuaXNBcnJheShlKTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0JiZyP3Q/dGhpcy5hZGRDbGFzcyhlKTp0aGlzLnJlbW92ZUNsYXNzKGUpOmcoZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3codGhpcykudG9nZ2xlQ2xhc3MoZS5jYWxsKHRoaXMsbixtdCh0aGlzKSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LGksbyxhO2lmKHIpe2k9MCxvPXcodGhpcyksYT14dChlKTt3aGlsZSh0PWFbaSsrXSlvLmhhc0NsYXNzKHQpP28ucmVtb3ZlQ2xhc3ModCk6by5hZGRDbGFzcyh0KX1lbHNlIHZvaWQgMCE9PWUmJiJib29sZWFuIiE9PW58fCgodD1tdCh0aGlzKSkmJkouc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLHQpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHR8fCExPT09ZT8iIjpKLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPTA7dD0iICIrZSsiICI7d2hpbGUobj10aGlzW3IrK10paWYoMT09PW4ubm9kZVR5cGUmJigiICIrdnQobXQobikpKyIgIikuaW5kZXhPZih0KT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgYnQ9L1xyL2c7dy5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiByPWcoZSksdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciBpOzE9PT10aGlzLm5vZGVUeXBlJiYobnVsbD09KGk9cj9lLmNhbGwodGhpcyxuLHcodGhpcykudmFsKCkpOmUpP2k9IiI6Im51bWJlciI9PXR5cGVvZiBpP2krPSIiOkFycmF5LmlzQXJyYXkoaSkmJihpPXcubWFwKGksZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZSsiIn0pKSwodD13LnZhbEhvb2tzW3RoaXMudHlwZV18fHcudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJzZXQiaW4gdCYmdm9pZCAwIT09dC5zZXQodGhpcyxpLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1pKSl9KTtpZihpKXJldHVybih0PXcudmFsSG9va3NbaS50eXBlXXx8dy52YWxIb29rc1tpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiB0JiZ2b2lkIDAhPT0obj10LmdldChpLCJ2YWx1ZSIpKT9uOiJzdHJpbmciPT10eXBlb2Yobj1pLnZhbHVlKT9uLnJlcGxhY2UoYnQsIiIpOm51bGw9PW4/IiI6bn19fSksdy5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD13LmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6dnQody50ZXh0KGUpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPWUub3B0aW9ucyxvPWUuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PWUudHlwZSxzPWE/bnVsbDpbXSx1PWE/bysxOmkubGVuZ3RoO2ZvcihyPW88MD91OmE/bzowO3I8dTtyKyspaWYoKChuPWlbcl0pLnNlbGVjdGVkfHxyPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IU4obi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD13KG4pLnZhbCgpLGEpcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89dy5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pKChyPWlbYV0pLnNlbGVjdGVkPXcuaW5BcnJheSh3LnZhbEhvb2tzLm9wdGlvbi5nZXQociksbyk+LTEpJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX19KSx3LmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXt3LnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9dy5pbkFycmF5KHcoZSkudmFsKCksdCk+LTF9fSxoLmNoZWNrT258fCh3LnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSksaC5mb2N1c2luPSJvbmZvY3VzaW4iaW4gZTt2YXIgd3Q9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFR0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O3cuZXh0ZW5kKHcuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24odCxuLGksbyl7dmFyIGEscyx1LGwsYyxwLGQsaCx2PVtpfHxyXSxtPWYuY2FsbCh0LCJ0eXBlIik/dC50eXBlOnQseD1mLmNhbGwodCwibmFtZXNwYWNlIik/dC5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihzPWg9dT1pPWl8fHIsMyE9PWkubm9kZVR5cGUmJjghPT1pLm5vZGVUeXBlJiYhd3QudGVzdChtK3cuZXZlbnQudHJpZ2dlcmVkKSYmKG0uaW5kZXhPZigiLiIpPi0xJiYobT0oeD1tLnNwbGl0KCIuIikpLnNoaWZ0KCkseC5zb3J0KCkpLGM9bS5pbmRleE9mKCI6Iik8MCYmIm9uIittLHQ9dFt3LmV4cGFuZG9dP3Q6bmV3IHcuRXZlbnQobSwib2JqZWN0Ij09dHlwZW9mIHQmJnQpLHQuaXNUcmlnZ2VyPW8/MjozLHQubmFtZXNwYWNlPXguam9pbigiLiIpLHQucm5hbWVzcGFjZT10Lm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIit4LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsdC5yZXN1bHQ9dm9pZCAwLHQudGFyZ2V0fHwodC50YXJnZXQ9aSksbj1udWxsPT1uP1t0XTp3Lm1ha2VBcnJheShuLFt0XSksZD13LmV2ZW50LnNwZWNpYWxbbV18fHt9LG98fCFkLnRyaWdnZXJ8fCExIT09ZC50cmlnZ2VyLmFwcGx5KGksbikpKXtpZighbyYmIWQubm9CdWJibGUmJiF5KGkpKXtmb3IobD1kLmRlbGVnYXRlVHlwZXx8bSx3dC50ZXN0KGwrbSl8fChzPXMucGFyZW50Tm9kZSk7cztzPXMucGFyZW50Tm9kZSl2LnB1c2gocyksdT1zO3U9PT0oaS5vd25lckRvY3VtZW50fHxyKSYmdi5wdXNoKHUuZGVmYXVsdFZpZXd8fHUucGFyZW50V2luZG93fHxlKX1hPTA7d2hpbGUoKHM9dlthKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSloPXMsdC50eXBlPWE+MT9sOmQuYmluZFR5cGV8fG0sKHA9KEouZ2V0KHMsImV2ZW50cyIpfHx7fSlbdC50eXBlXSYmSi5nZXQocywiaGFuZGxlIikpJiZwLmFwcGx5KHMsbiksKHA9YyYmc1tjXSkmJnAuYXBwbHkmJlkocykmJih0LnJlc3VsdD1wLmFwcGx5KHMsbiksITE9PT10LnJlc3VsdCYmdC5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gdC50eXBlPW0sb3x8dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8ZC5fZGVmYXVsdCYmITEhPT1kLl9kZWZhdWx0LmFwcGx5KHYucG9wKCksbil8fCFZKGkpfHxjJiZnKGlbbV0pJiYheShpKSYmKCh1PWlbY10pJiYoaVtjXT1udWxsKSx3LmV2ZW50LnRyaWdnZXJlZD1tLHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5hZGRFdmVudExpc3RlbmVyKG0sVHQpLGlbbV0oKSx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmgucmVtb3ZlRXZlbnRMaXN0ZW5lcihtLFR0KSx3LmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsdSYmKGlbY109dSkpLHQucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXcuZXh0ZW5kKG5ldyB3LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMH0pO3cuZXZlbnQudHJpZ2dlcihyLG51bGwsdCl9fSksdy5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gdy5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKX19KSxoLmZvY3VzaW58fHcuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbihlKXt3LmV2ZW50LnNpbXVsYXRlKHQsZS50YXJnZXQsdy5ldmVudC5maXgoZSkpfTt3LmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGk9Si5hY2Nlc3Mocix0KTtpfHxyLmFkZEV2ZW50TGlzdGVuZXIoZSxuLCEwKSxKLmFjY2VzcyhyLHQsKGl8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxpPUouYWNjZXNzKHIsdCktMTtpP0ouYWNjZXNzKHIsdCxpKTooci5yZW1vdmVFdmVudExpc3RlbmVyKGUsbiwhMCksSi5yZW1vdmUocix0KSl9fX0pO3ZhciBDdD1lLmxvY2F0aW9uLEV0PURhdGUubm93KCksa3Q9L1w/Lzt3LnBhcnNlWE1MPWZ1bmN0aW9uKHQpe3ZhciBuO2lmKCF0fHwic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dHJ5e249KG5ldyBlLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsInRleHQveG1sIil9Y2F0Y2goZSl7bj12b2lkIDB9cmV0dXJuIG4mJiFuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8dy5lcnJvcigiSW52YWxpZCBYTUw6ICIrdCksbn07dmFyIFN0PS9cW1xdJC8sRHQ9L1xyP1xuL2csTnQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLEF0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBqdChlLHQsbixyKXt2YXIgaTtpZihBcnJheS5pc0FycmF5KHQpKXcuZWFjaCh0LGZ1bmN0aW9uKHQsaSl7bnx8U3QudGVzdChlKT9yKGUsaSk6anQoZSsiWyIrKCJvYmplY3QiPT10eXBlb2YgaSYmbnVsbCE9aT90OiIiKSsiXSIsaSxuLHIpfSk7ZWxzZSBpZihufHwib2JqZWN0IiE9PXgodCkpcihlLHQpO2Vsc2UgZm9yKGkgaW4gdClqdChlKyJbIitpKyJdIix0W2ldLG4scil9dy5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3ZhciBuPWcodCk/dCgpOnQ7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYoQXJyYXkuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF3LmlzUGxhaW5PYmplY3QoZSkpdy5lYWNoKGUsZnVuY3Rpb24oKXtpKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKG4gaW4gZSlqdChuLGVbbl0sdCxpKTtyZXR1cm4gci5qb2luKCImIil9LHcuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXcucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBlP3cubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXcodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZBdC50ZXN0KHRoaXMubm9kZU5hbWUpJiYhTnQudGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IXBlLnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49dyh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOkFycmF5LmlzQXJyYXkobik/dy5tYXAobixmdW5jdGlvbihlKXtyZXR1cm57bmFtZTp0Lm5hbWUsdmFsdWU6ZS5yZXBsYWNlKER0LCJcclxuIil9fSk6e25hbWU6dC5uYW1lLHZhbHVlOm4ucmVwbGFjZShEdCwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBxdD0vJTIwL2csTHQ9LyMuKiQvLEh0PS8oWz8mXSlfPVteJl0qLyxPdD0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLFB0PS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLE10PS9eKD86R0VUfEhFQUQpJC8sUnQ9L15cL1wvLyxJdD17fSxXdD17fSwkdD0iKi8iLmNvbmNhdCgiKiIpLEJ0PXIuY3JlYXRlRWxlbWVudCgiYSIpO0J0LmhyZWY9Q3QuaHJlZjtmdW5jdGlvbiBGdChlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXsic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iKiIpO3ZhciByLGk9MCxvPXQudG9Mb3dlckNhc2UoKS5tYXRjaChNKXx8W107aWYoZyhuKSl3aGlsZShyPW9baSsrXSkiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwoZVtyXT1lW3JdfHxbXSkudW5zaGlmdChuKSk6KGVbcl09ZVtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uIF90KGUsdCxuLHIpe3ZhciBpPXt9LG89ZT09PVd0O2Z1bmN0aW9uIGEocyl7dmFyIHU7cmV0dXJuIGlbc109ITAsdy5lYWNoKGVbc118fFtdLGZ1bmN0aW9uKGUscyl7dmFyIGw9cyh0LG4scik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBsfHxvfHxpW2xdP28/ISh1PWwpOnZvaWQgMDoodC5kYXRhVHlwZXMudW5zaGlmdChsKSxhKGwpLCExKX0pLHV9cmV0dXJuIGEodC5kYXRhVHlwZXNbMF0pfHwhaVsiKiJdJiZhKCIqIil9ZnVuY3Rpb24genQoZSx0KXt2YXIgbixyLGk9dy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIHQpdm9pZCAwIT09dFtuXSYmKChpW25dP2U6cnx8KHI9e30pKVtuXT10W25dKTtyZXR1cm4gciYmdy5leHRlbmQoITAsZSxyKSxlfWZ1bmN0aW9uIFh0KGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IoaSBpbiBzKWlmKHNbaV0mJnNbaV0udGVzdChyKSl7dS51bnNoaWZ0KGkpO2JyZWFrfWlmKHVbMF1pbiBuKW89dVswXTtlbHNle2ZvcihpIGluIG4pe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbaSsiICIrdVswXV0pe289aTticmVha31hfHwoYT1pKX1vPW98fGF9aWYobylyZXR1cm4gbyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dfWZ1bmN0aW9uIFV0KGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD17fSxjPWUuZGF0YVR5cGVzLnNsaWNlKCk7aWYoY1sxXSlmb3IoYSBpbiBlLmNvbnZlcnRlcnMpbFthLnRvTG93ZXJDYXNlKCldPWUuY29udmVydGVyc1thXTtvPWMuc2hpZnQoKTt3aGlsZShvKWlmKGUucmVzcG9uc2VGaWVsZHNbb10mJihuW2UucmVzcG9uc2VGaWVsZHNbb11dPXQpLCF1JiZyJiZlLmRhdGFGaWx0ZXImJih0PWUuZGF0YUZpbHRlcih0LGUuZGF0YVR5cGUpKSx1PW8sbz1jLnNoaWZ0KCkpaWYoIioiPT09bylvPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09byl7aWYoIShhPWxbdSsiICIrb118fGxbIiogIitvXSkpZm9yKGkgaW4gbClpZigocz1pLnNwbGl0KCIgIikpWzFdPT09byYmKGE9bFt1KyIgIitzWzBdXXx8bFsiKiAiK3NbMF1dKSl7ITA9PT1hP2E9bFtpXTohMCE9PWxbaV0mJihvPXNbMF0sYy51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmZVsidGhyb3dzIl0pdD1hKHQpO2Vsc2UgdHJ5e3Q9YSh0KX1jYXRjaChlKXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjphP2U6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK299fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6dH19dy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOkN0LmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOlB0LnRlc3QoQ3QucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6JHQsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOncucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P3p0KHp0KGUsdy5hamF4U2V0dGluZ3MpLHQpOnp0KHcuYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkZ0KEl0KSxhamF4VHJhbnNwb3J0OkZ0KFd0KSxhamF4OmZ1bmN0aW9uKHQsbil7Im9iamVjdCI9PXR5cGVvZiB0JiYobj10LHQ9dm9pZCAwKSxuPW58fHt9O3ZhciBpLG8sYSxzLHUsbCxjLGYscCxkLGg9dy5hamF4U2V0dXAoe30sbiksZz1oLmNvbnRleHR8fGgseT1oLmNvbnRleHQmJihnLm5vZGVUeXBlfHxnLmpxdWVyeSk/dyhnKTp3LmV2ZW50LHY9dy5EZWZlcnJlZCgpLG09dy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikseD1oLnN0YXR1c0NvZGV8fHt9LGI9e30sVD17fSxDPSJjYW5jZWxlZCIsRT17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGMpe2lmKCFzKXtzPXt9O3doaWxlKHQ9T3QuZXhlYyhhKSlzW3RbMV0udG9Mb3dlckNhc2UoKV09dFsyXX10PXNbZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09dD9udWxsOnR9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBjP2E6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1jJiYoZT1UW2UudG9Mb3dlckNhc2UoKV09VFtlLnRvTG93ZXJDYXNlKCldfHxlLGJbZV09dCksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09YyYmKGgubWltZVR5cGU9ZSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihlKXt2YXIgdDtpZihlKWlmKGMpRS5hbHdheXMoZVtFLnN0YXR1c10pO2Vsc2UgZm9yKHQgaW4gZSl4W3RdPVt4W3RdLGVbdF1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHxDO3JldHVybiBpJiZpLmFib3J0KHQpLGsoMCx0KSx0aGlzfX07aWYodi5wcm9taXNlKEUpLGgudXJsPSgodHx8aC51cmx8fEN0LmhyZWYpKyIiKS5yZXBsYWNlKFJ0LEN0LnByb3RvY29sKyIvLyIpLGgudHlwZT1uLm1ldGhvZHx8bi50eXBlfHxoLm1ldGhvZHx8aC50eXBlLGguZGF0YVR5cGVzPShoLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goTSl8fFsiIl0sbnVsbD09aC5jcm9zc0RvbWFpbil7bD1yLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7bC5ocmVmPWgudXJsLGwuaHJlZj1sLmhyZWYsaC5jcm9zc0RvbWFpbj1CdC5wcm90b2NvbCsiLy8iK0J0Lmhvc3QhPWwucHJvdG9jb2wrIi8vIitsLmhvc3R9Y2F0Y2goZSl7aC5jcm9zc0RvbWFpbj0hMH19aWYoaC5kYXRhJiZoLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGguZGF0YSYmKGguZGF0YT13LnBhcmFtKGguZGF0YSxoLnRyYWRpdGlvbmFsKSksX3QoSXQsaCxuLEUpLGMpcmV0dXJuIEU7KGY9dy5ldmVudCYmaC5nbG9iYWwpJiYwPT13LmFjdGl2ZSsrJiZ3LmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGgudHlwZT1oLnR5cGUudG9VcHBlckNhc2UoKSxoLmhhc0NvbnRlbnQ9IU10LnRlc3QoaC50eXBlKSxvPWgudXJsLnJlcGxhY2UoTHQsIiIpLGguaGFzQ29udGVudD9oLmRhdGEmJmgucHJvY2Vzc0RhdGEmJjA9PT0oaC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoaC5kYXRhPWguZGF0YS5yZXBsYWNlKHF0LCIrIikpOihkPWgudXJsLnNsaWNlKG8ubGVuZ3RoKSxoLmRhdGEmJihoLnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIGguZGF0YSkmJihvKz0oa3QudGVzdChvKT8iJiI6Ij8iKStoLmRhdGEsZGVsZXRlIGguZGF0YSksITE9PT1oLmNhY2hlJiYobz1vLnJlcGxhY2UoSHQsIiQxIiksZD0oa3QudGVzdChvKT8iJiI6Ij8iKSsiXz0iK0V0KysrZCksaC51cmw9bytkKSxoLmlmTW9kaWZpZWQmJih3Lmxhc3RNb2RpZmllZFtvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsdy5sYXN0TW9kaWZpZWRbb10pLHcuZXRhZ1tvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIix3LmV0YWdbb10pKSwoaC5kYXRhJiZoLmhhc0NvbnRlbnQmJiExIT09aC5jb250ZW50VHlwZXx8bi5jb250ZW50VHlwZSkmJkUuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixoLmNvbnRlbnRUeXBlKSxFLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsaC5kYXRhVHlwZXNbMF0mJmguYWNjZXB0c1toLmRhdGFUeXBlc1swXV0/aC5hY2NlcHRzW2guZGF0YVR5cGVzWzBdXSsoIioiIT09aC5kYXRhVHlwZXNbMF0/IiwgIiskdCsiOyBxPTAuMDEiOiIiKTpoLmFjY2VwdHNbIioiXSk7Zm9yKHAgaW4gaC5oZWFkZXJzKUUuc2V0UmVxdWVzdEhlYWRlcihwLGguaGVhZGVyc1twXSk7aWYoaC5iZWZvcmVTZW5kJiYoITE9PT1oLmJlZm9yZVNlbmQuY2FsbChnLEUsaCl8fGMpKXJldHVybiBFLmFib3J0KCk7aWYoQz0iYWJvcnQiLG0uYWRkKGguY29tcGxldGUpLEUuZG9uZShoLnN1Y2Nlc3MpLEUuZmFpbChoLmVycm9yKSxpPV90KFd0LGgsbixFKSl7aWYoRS5yZWFkeVN0YXRlPTEsZiYmeS50cmlnZ2VyKCJhamF4U2VuZCIsW0UsaF0pLGMpcmV0dXJuIEU7aC5hc3luYyYmaC50aW1lb3V0PjAmJih1PWUuc2V0VGltZW91dChmdW5jdGlvbigpe0UuYWJvcnQoInRpbWVvdXQiKX0saC50aW1lb3V0KSk7dHJ5e2M9ITEsaS5zZW5kKGIsayl9Y2F0Y2goZSl7aWYoYyl0aHJvdyBlO2soLTEsZSl9fWVsc2UgaygtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gayh0LG4scixzKXt2YXIgbCxwLGQsYixULEM9bjtjfHwoYz0hMCx1JiZlLmNsZWFyVGltZW91dCh1KSxpPXZvaWQgMCxhPXN8fCIiLEUucmVhZHlTdGF0ZT10PjA/NDowLGw9dD49MjAwJiZ0PDMwMHx8MzA0PT09dCxyJiYoYj1YdChoLEUscikpLGI9VXQoaCxiLEUsbCksbD8oaC5pZk1vZGlmaWVkJiYoKFQ9RS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKSYmKHcubGFzdE1vZGlmaWVkW29dPVQpLChUPUUuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJih3LmV0YWdbb109VCkpLDIwND09PXR8fCJIRUFEIj09PWgudHlwZT9DPSJub2NvbnRlbnQiOjMwND09PXQ/Qz0ibm90bW9kaWZpZWQiOihDPWIuc3RhdGUscD1iLmRhdGEsbD0hKGQ9Yi5lcnJvcikpKTooZD1DLCF0JiZDfHwoQz0iZXJyb3IiLHQ8MCYmKHQ9MCkpKSxFLnN0YXR1cz10LEUuc3RhdHVzVGV4dD0obnx8QykrIiIsbD92LnJlc29sdmVXaXRoKGcsW3AsQyxFXSk6di5yZWplY3RXaXRoKGcsW0UsQyxkXSksRS5zdGF0dXNDb2RlKHgpLHg9dm9pZCAwLGYmJnkudHJpZ2dlcihsPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW0UsaCxsP3A6ZF0pLG0uZmlyZVdpdGgoZyxbRSxDXSksZiYmKHkudHJpZ2dlcigiYWpheENvbXBsZXRlIixbRSxoXSksLS13LmFjdGl2ZXx8dy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIEV9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB3LmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdy5nZXQoZSx2b2lkIDAsdCwic2NyaXB0Iil9fSksdy5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsdCl7d1t0XT1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4gZyhuKSYmKGk9aXx8cixyPW4sbj12b2lkIDApLHcuYWpheCh3LmV4dGVuZCh7dXJsOmUsdHlwZTp0LGRhdGFUeXBlOmksZGF0YTpuLHN1Y2Nlc3M6cn0sdy5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSksdy5fZXZhbFVybD1mdW5jdGlvbihlKXtyZXR1cm4gdy5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSx3LmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpc1swXSYmKGcoZSkmJihlPWUuY2FsbCh0aGlzWzBdKSksdD13KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihlKXtyZXR1cm4gZyhlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7dyh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dyh0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD1nKGUpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7dyh0aGlzKS53cmFwQWxsKHQ/ZS5jYWxsKHRoaXMsbik6ZSl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7dyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSx3LmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIXcuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LHcuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSx3LmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBWdD17MDoyMDAsMTIyMzoyMDR9LEd0PXcuYWpheFNldHRpbmdzLnhocigpO2guY29ycz0hIUd0JiYid2l0aENyZWRlbnRpYWxzImluIEd0LGguYWpheD1HdD0hIUd0LHcuYWpheFRyYW5zcG9ydChmdW5jdGlvbih0KXt2YXIgbixyO2lmKGguY29yc3x8R3QmJiF0LmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGksbyl7dmFyIGEscz10LnhocigpO2lmKHMub3Blbih0LnR5cGUsdC51cmwsdC5hc3luYyx0LnVzZXJuYW1lLHQucGFzc3dvcmQpLHQueGhyRmllbGRzKWZvcihhIGluIHQueGhyRmllbGRzKXNbYV09dC54aHJGaWVsZHNbYV07dC5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUodC5taW1lVHlwZSksdC5jcm9zc0RvbWFpbnx8aVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoaVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihhIGluIGkpcy5zZXRSZXF1ZXN0SGVhZGVyKGEsaVthXSk7bj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtuJiYobj1yPXMub25sb2FkPXMub25lcnJvcj1zLm9uYWJvcnQ9cy5vbnRpbWVvdXQ9cy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09ZT9zLmFib3J0KCk6ImVycm9yIj09PWU/Im51bWJlciIhPXR5cGVvZiBzLnN0YXR1cz9vKDAsImVycm9yIik6byhzLnN0YXR1cyxzLnN0YXR1c1RleHQpOm8oVnRbcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInRleHQiIT09KHMucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHMucmVzcG9uc2VUZXh0P3tiaW5hcnk6cy5yZXNwb25zZX06e3RleHQ6cy5yZXNwb25zZVRleHR9LHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPW4oKSxyPXMub25lcnJvcj1zLm9udGltZW91dD1uKCJlcnJvciIpLHZvaWQgMCE9PXMub25hYm9ydD9zLm9uYWJvcnQ9cjpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1zLnJlYWR5U3RhdGUmJmUuc2V0VGltZW91dChmdW5jdGlvbigpe24mJnIoKX0pfSxuPW4oImFib3J0Iik7dHJ5e3Muc2VuZCh0Lmhhc0NvbnRlbnQmJnQuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYobil0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX0pLHcuYWpheFByZWZpbHRlcihmdW5jdGlvbihlKXtlLmNyb3NzRG9tYWluJiYoZS5jb250ZW50cy5zY3JpcHQ9ITEpfSksdy5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZ2xvYmFsRXZhbChlKSxlfX19KSx3LmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS5jYWNoZSYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9IkdFVCIpfSksdy5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2lmKGUuY3Jvc3NEb21haW4pe3ZhciB0LG47cmV0dXJue3NlbmQ6ZnVuY3Rpb24oaSxvKXt0PXcoIjxzY3JpcHQ+IikucHJvcCh7Y2hhcnNldDplLnNjcmlwdENoYXJzZXQsc3JjOmUudXJsfSkub24oImxvYWQgZXJyb3IiLG49ZnVuY3Rpb24oZSl7dC5yZW1vdmUoKSxuPW51bGwsZSYmbygiZXJyb3IiPT09ZS50eXBlPzQwNDoyMDAsZS50eXBlKX0pLHIuaGVhZC5hcHBlbmRDaGlsZCh0WzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX19KTt2YXIgWXQ9W10sUXQ9Lyg9KVw/KD89JnwkKXxcP1w/Lzt3LmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9WXQucG9wKCl8fHcuZXhwYW5kbysiXyIrRXQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLHcuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24odCxuLHIpe3ZhciBpLG8sYSxzPSExIT09dC5qc29ucCYmKFF0LnRlc3QodC51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgdC5kYXRhJiYwPT09KHQuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmUXQudGVzdCh0LmRhdGEpJiYiZGF0YSIpO2lmKHN8fCJqc29ucCI9PT10LmRhdGFUeXBlc1swXSlyZXR1cm4gaT10Lmpzb25wQ2FsbGJhY2s9Zyh0Lmpzb25wQ2FsbGJhY2spP3QuanNvbnBDYWxsYmFjaygpOnQuanNvbnBDYWxsYmFjayxzP3Rbc109dFtzXS5yZXBsYWNlKFF0LCIkMSIraSk6ITEhPT10Lmpzb25wJiYodC51cmwrPShrdC50ZXN0KHQudXJsKT8iJiI6Ij8iKSt0Lmpzb25wKyI9IitpKSx0LmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gYXx8dy5lcnJvcihpKyIgd2FzIG5vdCBjYWxsZWQiKSxhWzBdfSx0LmRhdGFUeXBlc1swXT0ianNvbiIsbz1lW2ldLGVbaV09ZnVuY3Rpb24oKXthPWFyZ3VtZW50c30sci5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1vP3coZSkucmVtb3ZlUHJvcChpKTplW2ldPW8sdFtpXSYmKHQuanNvbnBDYWxsYmFjaz1uLmpzb25wQ2FsbGJhY2ssWXQucHVzaChpKSksYSYmZyhvKSYmbyhhWzBdKSxhPW89dm9pZCAwfSksInNjcmlwdCJ9KSxoLmNyZWF0ZUhUTUxEb2N1bWVudD1mdW5jdGlvbigpe3ZhciBlPXIuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5O3JldHVybiBlLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1lLmNoaWxkTm9kZXMubGVuZ3RofSgpLHcucGFyc2VIVE1MPWZ1bmN0aW9uKGUsdCxuKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuW107ImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKTt2YXIgaSxvLGE7cmV0dXJuIHR8fChoLmNyZWF0ZUhUTUxEb2N1bWVudD8oKGk9KHQ9ci5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpKS5jcmVhdGVFbGVtZW50KCJiYXNlIikpLmhyZWY9ci5sb2NhdGlvbi5ocmVmLHQuaGVhZC5hcHBlbmRDaGlsZChpKSk6dD1yKSxvPUEuZXhlYyhlKSxhPSFuJiZbXSxvP1t0LmNyZWF0ZUVsZW1lbnQob1sxXSldOihvPXhlKFtlXSx0LGEpLGEmJmEubGVuZ3RoJiZ3KGEpLnJlbW92ZSgpLHcubWVyZ2UoW10sby5jaGlsZE5vZGVzKSl9LHcuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybiBzPi0xJiYocj12dChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksZyh0KT8obj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksYS5sZW5ndGg+MCYmdy5hamF4KHt1cmw6ZSx0eXBlOml8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP3coIjxkaXY+IikuYXBwZW5kKHcucGFyc2VIVE1MKGUpKS5maW5kKHIpOmUpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pfSksdGhpc30sdy5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oZSx0KXt3LmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksdy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZ3JlcCh3LnRpbWVycyxmdW5jdGlvbih0KXtyZXR1cm4gZT09PXQuZWxlbX0pLmxlbmd0aH0sdy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYz13LmNzcyhlLCJwb3NpdGlvbiIpLGY9dyhlKSxwPXt9OyJzdGF0aWMiPT09YyYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1mLm9mZnNldCgpLG89dy5jc3MoZSwidG9wIiksdT13LmNzcyhlLCJsZWZ0IiksKGw9KCJhYnNvbHV0ZSI9PT1jfHwiZml4ZWQiPT09YykmJihvK3UpLmluZGV4T2YoImF1dG8iKT4tMSk/KGE9KHI9Zi5wb3NpdGlvbigpKS50b3AsaT1yLmxlZnQpOihhPXBhcnNlRmxvYXQobyl8fDAsaT1wYXJzZUZsb2F0KHUpfHwwKSxnKHQpJiYodD10LmNhbGwoZSxuLHcuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihwLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihwLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxwKTpmLmNzcyhwKX19LHcuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oZSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt3Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIHQsbixyPXRoaXNbMF07aWYocilyZXR1cm4gci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8odD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6dC50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OnQubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH19LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxpPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT13LmNzcyhyLCJwb3NpdGlvbiIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT13LmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5wYXJlbnROb2RlO2UmJmUhPT1yJiYxPT09ZS5ub2RlVHlwZSYmKChpPXcoZSkub2Zmc2V0KCkpLnRvcCs9dy5jc3MoZSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxpLmxlZnQrPXcuY3NzKGUsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOnQudG9wLWkudG9wLXcuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LWkubGVmdC13LmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmInN0YXRpYyI9PT13LmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV8fGJlfSl9fSksdy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIG49InBhZ2VZT2Zmc2V0Ij09PXQ7dy5mbltlXT1mdW5jdGlvbihyKXtyZXR1cm4geih0aGlzLGZ1bmN0aW9uKGUscixpKXt2YXIgbztpZih5KGUpP289ZTo5PT09ZS5ub2RlVHlwZSYmKG89ZS5kZWZhdWx0Vmlldyksdm9pZCAwPT09aSlyZXR1cm4gbz9vW3RdOmVbcl07bz9vLnNjcm9sbFRvKG4/by5wYWdlWE9mZnNldDppLG4/aTpvLnBhZ2VZT2Zmc2V0KTplW3JdPWl9LGUscixhcmd1bWVudHMubGVuZ3RoKX19KSx3LmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSx0KXt3LmNzc0hvb2tzW3RdPV9lKGgucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLG4pe2lmKG4pcmV0dXJuIG49RmUoZSx0KSxXZS50ZXN0KG4pP3coZSkucG9zaXRpb24oKVt0XSsicHgiOm59KX0pLHcuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsdCl7dy5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50OnQsIiI6Im91dGVyIitlfSxmdW5jdGlvbihuLHIpe3cuZm5bcl09ZnVuY3Rpb24oaSxvKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2YgaSkscz1ufHwoITA9PT1pfHwhMD09PW8/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB6KHRoaXMsZnVuY3Rpb24odCxuLGkpe3ZhciBvO3JldHVybiB5KHQpPzA9PT1yLmluZGV4T2YoIm91dGVyIik/dFsiaW5uZXIiK2VdOnQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2VdOjk9PT10Lm5vZGVUeXBlPyhvPXQuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KHQuYm9keVsic2Nyb2xsIitlXSxvWyJzY3JvbGwiK2VdLHQuYm9keVsib2Zmc2V0IitlXSxvWyJvZmZzZXQiK2VdLG9bImNsaWVudCIrZV0pKTp2b2lkIDA9PT1pP3cuY3NzKHQsbixzKTp3LnN0eWxlKHQsbixpLHMpfSx0LGE/aTp2b2lkIDAsYSl9fSl9KSx3LmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXt3LmZuW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKHQsbnVsbCxlLG4pOnRoaXMudHJpZ2dlcih0KX19KSx3LmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9fSksdy5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9uKGUsbnVsbCx0LG4pfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vZmYoZSxudWxsLHQpfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwiKioiLG4pfX0pLHcucHJveHk9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYobj1lW3RdLHQ9ZSxlPW4pLGcoZSkpcmV0dXJuIHI9by5jYWxsKGFyZ3VtZW50cywyKSxpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChvLmNhbGwoYXJndW1lbnRzKSkpfSxpLmd1aWQ9ZS5ndWlkPWUuZ3VpZHx8dy5ndWlkKyssaX0sdy5ob2xkUmVhZHk9ZnVuY3Rpb24oZSl7ZT93LnJlYWR5V2FpdCsrOncucmVhZHkoITApfSx3LmlzQXJyYXk9QXJyYXkuaXNBcnJheSx3LnBhcnNlSlNPTj1KU09OLnBhcnNlLHcubm9kZU5hbWU9Tix3LmlzRnVuY3Rpb249Zyx3LmlzV2luZG93PXksdy5jYW1lbENhc2U9Ryx3LnR5cGU9eCx3Lm5vdz1EYXRlLm5vdyx3LmlzTnVtZXJpYz1mdW5jdGlvbihlKXt2YXIgdD13LnR5cGUoZSk7cmV0dXJuKCJudW1iZXIiPT09dHx8InN0cmluZyI9PT10KSYmIWlzTmFOKGUtcGFyc2VGbG9hdChlKSl9LCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB3fSk7dmFyIEp0PWUualF1ZXJ5LEt0PWUuJDtyZXR1cm4gdy5ub0NvbmZsaWN0PWZ1bmN0aW9uKHQpe3JldHVybiBlLiQ9PT13JiYoZS4kPUt0KSx0JiZlLmpRdWVyeT09PXcmJihlLmpRdWVyeT1KdCksd30sdHx8KGUualF1ZXJ5PWUuJD13KSx3fSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAqIGpRdWVyeSBUZW1wbGF0ZXMgUGx1Z2luIDEuMC4wcHJlCiAqIGh0dHA6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdG1wbAogKiBSZXF1aXJlcyBqUXVlcnkgMS40LjIKICoKICogQ29weXJpZ2h0IFNvZnR3YXJlIEZyZWVkb20gQ29uc2VydmFuY3ksIEluYy4KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICovCihmdW5jdGlvbihhKXt2YXIgcj1hLmZuLmRvbU1hbmlwLGQ9Il90bXBsaXRlbSIscT0vXltePF0qKDxbXHdcV10rPilbXj5dKiR8XHtce1whIC8sYj17fSxmPXt9LGUscD17a2V5OjAsZGF0YTp7fX0saT0wLGM9MCxsPVtdO2Z1bmN0aW9uIGcoZyxkLGgsZSl7dmFyIGM9e2RhdGE6ZXx8KGU9PT0wfHxlPT09ZmFsc2UpP2U6ZD9kLmRhdGE6e30sX3dyYXA6ZD9kLl93cmFwOm51bGwsdG1wbDpudWxsLHBhcmVudDpkfHxudWxsLG5vZGVzOltdLGNhbGxzOnUsbmVzdDp3LHdyYXA6eCxodG1sOnYsdXBkYXRlOnR9O2cmJmEuZXh0ZW5kKGMsZyx7bm9kZXM6W10scGFyZW50OmR9KTtpZihoKXtjLnRtcGw9aDtjLl9jdG50PWMuX2N0bnR8fGMudG1wbChhLGMpO2Mua2V5PSsraTsobC5sZW5ndGg/ZjpiKVtpXT1jfXJldHVybiBjfWEuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGYsZCl7YS5mbltmXT1mdW5jdGlvbihuKXt2YXIgZz1bXSxpPWEobiksayxoLG0sbCxqPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2U9Ynx8e307aWYoaiYmai5ub2RlVHlwZT09PTExJiZqLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmaS5sZW5ndGg9PT0xKXtpW2RdKHRoaXNbMF0pO2c9dGhpc31lbHNle2ZvcihoPTAsbT1pLmxlbmd0aDtoPG07aCsrKXtjPWg7az0oaD4wP3RoaXMuY2xvbmUodHJ1ZSk6dGhpcykuZ2V0KCk7YShpW2hdKVtkXShrKTtnPWcuY29uY2F0KGspfWM9MDtnPXRoaXMucHVzaFN0YWNrKGcsZixpLnNlbGVjdG9yKX1sPWU7ZT1udWxsO2EudG1wbC5jb21wbGV0ZShsKTtyZXR1cm4gZ319KTthLmZuLmV4dGVuZCh7dG1wbDpmdW5jdGlvbihkLGMsYil7cmV0dXJuIGEudG1wbCh0aGlzWzBdLGQsYyxiKX0sdG1wbEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gYS50bXBsSXRlbSh0aGlzWzBdKX0sdGVtcGxhdGU6ZnVuY3Rpb24oYil7cmV0dXJuIGEudGVtcGxhdGUoYix0aGlzWzBdKX0sZG9tTWFuaXA6ZnVuY3Rpb24oZCxtLGspe2lmKGRbMF0mJmEuaXNBcnJheShkWzBdKSl7dmFyIGc9YS5tYWtlQXJyYXkoYXJndW1lbnRzKSxoPWRbMF0saj1oLmxlbmd0aCxpPTAsZjt3aGlsZShpPGomJiEoZj1hLmRhdGEoaFtpKytdLCJ0bXBsSXRlbSIpKSk7aWYoZiYmYylnWzJdPWZ1bmN0aW9uKGIpe2EudG1wbC5hZnRlck1hbmlwKHRoaXMsYixrKX07ci5hcHBseSh0aGlzLGcpfWVsc2Ugci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Yz0wOyFlJiZhLnRtcGwuY29tcGxldGUoYik7cmV0dXJuIHRoaXN9fSk7YS5leHRlbmQoe3RtcGw6ZnVuY3Rpb24oZCxoLGUsYyl7dmFyIGksaz0hYztpZihrKXtjPXA7ZD1hLnRlbXBsYXRlW2RdfHxhLnRlbXBsYXRlKG51bGwsZCk7Zj17fX1lbHNlIGlmKCFkKXtkPWMudG1wbDtiW2Mua2V5XT1jO2Mubm9kZXM9W107Yy53cmFwcGVkJiZuKGMsYy53cmFwcGVkKTtyZXR1cm4gYShqKGMsbnVsbCxjLnRtcGwoYSxjKSkpfWlmKCFkKXJldHVybltdO2lmKHR5cGVvZiBoPT09ImZ1bmN0aW9uIiloPWguY2FsbChjfHx7fSk7ZSYmZS53cmFwcGVkJiZuKGUsZS53cmFwcGVkKTtpPWEuaXNBcnJheShoKT9hLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhP2coZSxjLGQsYSk6bnVsbH0pOltnKGUsYyxkLGgpXTtyZXR1cm4gaz9hKGooYyxudWxsLGkpKTppfSx0bXBsSXRlbTpmdW5jdGlvbihiKXt2YXIgYztpZihiIGluc3RhbmNlb2YgYSliPWJbMF07d2hpbGUoYiYmYi5ub2RlVHlwZT09PTEmJiEoYz1hLmRhdGEoYiwidG1wbEl0ZW0iKSkmJihiPWIucGFyZW50Tm9kZSkpO3JldHVybiBjfHxwfSx0ZW1wbGF0ZTpmdW5jdGlvbihjLGIpe2lmKGIpe2lmKHR5cGVvZiBiPT09InN0cmluZyIpYj1vKGIpO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIGEpYj1iWzBdfHx7fTtpZihiLm5vZGVUeXBlKWI9YS5kYXRhKGIsInRtcGwiKXx8YS5kYXRhKGIsInRtcGwiLG8oYi5pbm5lckhUTUwpKTtyZXR1cm4gdHlwZW9mIGM9PT0ic3RyaW5nIj8oYS50ZW1wbGF0ZVtjXT1iKTpifXJldHVybiBjP3R5cGVvZiBjIT09InN0cmluZyI/YS50ZW1wbGF0ZShudWxsLGMpOmEudGVtcGxhdGVbY118fGEudGVtcGxhdGUobnVsbCxxLnRlc3QoYyk/YzphKGMpKTpudWxsfSxlbmNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuKCIiK2EpLnNwbGl0KCImIikuam9pbigiJmFtcDsiKS5zcGxpdCgiPCIpLmpvaW4oIiZsdDsiKS5zcGxpdCgiPiIpLmpvaW4oIiZndDsiKS5zcGxpdCgnIicpLmpvaW4oIiYjMzQ7Iikuc3BsaXQoIiciKS5qb2luKCImIzM5OyIpfX0pO2EuZXh0ZW5kKGEudG1wbCx7dGFnOnt0bXBsOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiJpZigkbm90bnVsbF8xKXtfXz1fXy5jb25jYXQoJGl0ZW0ubmVzdCgkMSwkMikpO30ifSx3cmFwOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiIkaXRlbS5jYWxscyhfXywkMSwkMik7X189W107IixjbG9zZToiY2FsbD0kaXRlbS5jYWxscygpO19fPWNhbGwuXy5jb25jYXQoJGl0ZW0ud3JhcChjYWxsLF9fKSk7In0sZWFjaDp7X2RlZmF1bHQ6eyQyOiIkaW5kZXgsICR2YWx1ZSJ9LG9wZW46ImlmKCRub3RudWxsXzEpeyQuZWFjaCgkMWEsZnVuY3Rpb24oJDIpe3dpdGgodGhpcyl7IixjbG9zZToifX0pO30ifSwiaWYiOntvcGVuOiJpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsiLGNsb3NlOiJ9In0sImVsc2UiOntfZGVmYXVsdDp7JDE6InRydWUifSxvcGVuOiJ9ZWxzZSBpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsifSxodG1sOntvcGVuOiJpZigkbm90bnVsbF8xKXtfXy5wdXNoKCQxYSk7fSJ9LCI9Ijp7X2RlZmF1bHQ6eyQxOiIkZGF0YSJ9LG9wZW46ImlmKCRub3RudWxsXzEpe19fLnB1c2goJC5lbmNvZGUoJDFhKSk7fSJ9LCIhIjp7b3BlbjoiIn19LGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yj17fX0sYWZ0ZXJNYW5pcDpmdW5jdGlvbihmLGIsZCl7dmFyIGU9Yi5ub2RlVHlwZT09PTExP2EubWFrZUFycmF5KGIuY2hpbGROb2Rlcyk6Yi5ub2RlVHlwZT09PTE/W2JdOltdO2QuY2FsbChmLGIpO20oZSk7YysrfX0pO2Z1bmN0aW9uIGooZSxnLGYpe3ZhciBiLGM9Zj9hLm1hcChmLGZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2Uua2V5P2EucmVwbGFjZSgvKDxcdyspKD89W1xzPl0pKD8hW14+XSpfdG1wbGl0ZW0pKFtePl0qKS9nLCIkMSAiK2QrJz0iJytlLmtleSsnIiAkMicpOmE6aihhLGUsYS5fY3RudCl9KTplO2lmKGcpcmV0dXJuIGM7Yz1jLmpvaW4oIiIpO2MucmVwbGFjZSgvXlxzKihbXjxcc11bXjxdKik/KDxbXHdcV10rPikoW14+XSpbXj5cc10pP1xzKiQvLGZ1bmN0aW9uKGYsYyxlLGQpe2I9YShlKS5nZXQoKTttKGIpO2lmKGMpYj1rKGMpLmNvbmNhdChiKTtpZihkKWI9Yi5jb25jYXQoayhkKSl9KTtyZXR1cm4gYj9iOmsoYyl9ZnVuY3Rpb24gayhjKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlubmVySFRNTD1jO3JldHVybiBhLm1ha2VBcnJheShiLmNoaWxkTm9kZXMpfWZ1bmN0aW9uIG8oYil7cmV0dXJuIG5ldyBGdW5jdGlvbigialF1ZXJ5IiwiJGl0ZW0iLCJ2YXIgJD1qUXVlcnksY2FsbCxfXz1bXSwkZGF0YT0kaXRlbS5kYXRhO3dpdGgoJGRhdGEpe19fLnB1c2goJyIrYS50cmltKGIpLnJlcGxhY2UoLyhbXFwnXSkvZywiXFwkMSIpLnJlcGxhY2UoL1tcclx0XG5dL2csIiAiKS5yZXBsYWNlKC9cJFx7KFteXH1dKilcfS9nLCJ7ez0gJDF9fSIpLnJlcGxhY2UoL1x7XHsoXC8/KShcdyt8LikoPzpcKCgoPzpbXlx9XXxcfSg/IVx9KSkqPyk/XCkpPyg/OlxzKyguKj8pPyk/KFwoKCg/OlteXH1dfFx9KD8hXH0pKSo/KVwpKT9ccypcfVx9L2csZnVuY3Rpb24obSxsLGssZyxiLGMsZCl7dmFyIGo9YS50bXBsLnRhZ1trXSxpLGUsZjtpZighail0aHJvdyJVbmtub3duIHRlbXBsYXRlIHRhZzogIitrO2k9ai5fZGVmYXVsdHx8W107aWYoYyYmIS9cdyQvLnRlc3QoYikpe2IrPWM7Yz0iIn1pZihiKXtiPWgoYik7ZD1kPyIsIitoKGQpKyIpIjpjPyIpIjoiIjtlPWM/Yi5pbmRleE9mKCIuIik+LTE/YitoKGMpOiIoIitiKyIpLmNhbGwoJGl0ZW0iK2Q6YjtmPWM/ZToiKHR5cGVvZigiK2IrIik9PT0nZnVuY3Rpb24nPygiK2IrIikuY2FsbCgkaXRlbSk6KCIrYisiKSkifWVsc2UgZj1lPWkuJDF8fCJudWxsIjtnPWgoZyk7cmV0dXJuIicpOyIraltsPyJjbG9zZSI6Im9wZW4iXS5zcGxpdCgiJG5vdG51bGxfMSIpLmpvaW4oYj8idHlwZW9mKCIrYisiKSE9PSd1bmRlZmluZWQnICYmICgiK2IrIikhPW51bGwiOiJ0cnVlIikuc3BsaXQoIiQxYSIpLmpvaW4oZikuc3BsaXQoIiQxIikuam9pbihlKS5zcGxpdCgiJDIiKS5qb2luKGd8fGkuJDJ8fCIiKSsiX18ucHVzaCgnIn0pKyInKTt9cmV0dXJuIF9fOyIpfWZ1bmN0aW9uIG4oYyxiKXtjLl93cmFwPWooYyx0cnVlLGEuaXNBcnJheShiKT9iOltxLnRlc3QoYik/YjphKGIpLmh0bWwoKV0pLmpvaW4oIiIpfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGE/YS5yZXBsYWNlKC9cXCcvZywiJyIpLnJlcGxhY2UoL1xcXFwvZywiXFwiKTpudWxsfWZ1bmN0aW9uIHMoYil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5hcHBlbmRDaGlsZChiLmNsb25lTm9kZSh0cnVlKSk7cmV0dXJuIGEuaW5uZXJIVE1MfWZ1bmN0aW9uIG0obyl7dmFyIG49Il8iK2MsayxqLGw9e30sZSxwLGg7Zm9yKGU9MCxwPW8ubGVuZ3RoO2U8cDtlKyspe2lmKChrPW9bZV0pLm5vZGVUeXBlIT09MSljb250aW51ZTtqPWsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTtmb3IoaD1qLmxlbmd0aC0xO2g+PTA7aC0tKW0oaltoXSk7bShrKX1mdW5jdGlvbiBtKGope3ZhciBwLGg9aixrLGUsbTtpZihtPWouZ2V0QXR0cmlidXRlKGQpKXt3aGlsZShoLnBhcmVudE5vZGUmJihoPWgucGFyZW50Tm9kZSkubm9kZVR5cGU9PT0xJiYhKHA9aC5nZXRBdHRyaWJ1dGUoZCkpKTtpZihwIT09bSl7aD1oLnBhcmVudE5vZGU/aC5ub2RlVHlwZT09PTExPzA6aC5nZXRBdHRyaWJ1dGUoZCl8fDA6MDtpZighKGU9YlttXSkpe2U9ZlttXTtlPWcoZSxiW2hdfHxmW2hdKTtlLmtleT0rK2k7YltpXT1lfWMmJm8obSl9ai5yZW1vdmVBdHRyaWJ1dGUoZCl9ZWxzZSBpZihjJiYoZT1hLmRhdGEoaiwidG1wbEl0ZW0iKSkpe28oZS5rZXkpO2JbZS5rZXldPWU7aD1hLmRhdGEoai5wYXJlbnROb2RlLCJ0bXBsSXRlbSIpO2g9aD9oLmtleTowfWlmKGUpe2s9ZTt3aGlsZShrJiZrLmtleSE9aCl7ay5ub2Rlcy5wdXNoKGopO2s9ay5wYXJlbnR9ZGVsZXRlIGUuX2N0bnQ7ZGVsZXRlIGUuX3dyYXA7YS5kYXRhKGosInRtcGxJdGVtIixlKX1mdW5jdGlvbiBvKGEpe2E9YStuO2U9bFthXT1sW2FdfHxnKGUsYltlLnBhcmVudC5rZXkrbl18fGUucGFyZW50KX19fWZ1bmN0aW9uIHUoYSxkLGMsYil7aWYoIWEpcmV0dXJuIGwucG9wKCk7bC5wdXNoKHtfOmEsdG1wbDpkLGl0ZW06dGhpcyxkYXRhOmMsb3B0aW9uczpifSl9ZnVuY3Rpb24gdyhkLGMsYil7cmV0dXJuIGEudG1wbChhLnRlbXBsYXRlKGQpLGMsYix0aGlzKX1mdW5jdGlvbiB4KGIsZCl7dmFyIGM9Yi5vcHRpb25zfHx7fTtjLndyYXBwZWQ9ZDtyZXR1cm4gYS50bXBsKGEudGVtcGxhdGUoYi50bXBsKSxiLmRhdGEsYyxiLml0ZW0pfWZ1bmN0aW9uIHYoZCxjKXt2YXIgYj10aGlzLl93cmFwO3JldHVybiBhLm1hcChhKGEuaXNBcnJheShiKT9iLmpvaW4oIiIpOmIpLmZpbHRlcihkfHwiKiIpLGZ1bmN0aW9uKGEpe3JldHVybiBjP2EuaW5uZXJUZXh0fHxhLnRleHRDb250ZW50OmEub3V0ZXJIVE1MfHxzKGEpfSl9ZnVuY3Rpb24gdCgpe3ZhciBiPXRoaXMubm9kZXM7YS50bXBsKG51bGwsbnVsbCxudWxsLHRoaXMpLmluc2VydEJlZm9yZShiWzBdKTthKGIpLnJlbW92ZSgpfX0pKGpRdWVyeSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiFmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImpxdWVyeSJdLGUpOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUocmVxdWlyZSgianF1ZXJ5IikpOmUoalF1ZXJ5KX0oZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1lLnRhYmxlc29ydGVyPXt2ZXJzaW9uOiIyLjMwLjUiLHBhcnNlcnM6W10sd2lkZ2V0czpbXSxkZWZhdWx0czp7dGhlbWU6ImRlZmF1bHQiLHdpZHRoRml4ZWQ6ITEsc2hvd1Byb2Nlc3Npbmc6ITEsaGVhZGVyVGVtcGxhdGU6Intjb250ZW50fSIsb25SZW5kZXJUZW1wbGF0ZTpudWxsLG9uUmVuZGVySGVhZGVyOm51bGwsY2FuY2VsU2VsZWN0aW9uOiEwLHRhYkluZGV4OiEwLGRhdGVGb3JtYXQ6Im1tZGR5eXl5Iixzb3J0TXVsdGlTb3J0S2V5OiJzaGlmdEtleSIsc29ydFJlc2V0S2V5OiJjdHJsS2V5Iix1c051bWJlckZvcm1hdDohMCxkZWxheUluaXQ6ITEsc2VydmVyU2lkZVNvcnRpbmc6ITEscmVzb3J0OiEwLGhlYWRlcnM6e30saWdub3JlQ2FzZTohMCxzb3J0Rm9yY2U6bnVsbCxzb3J0TGlzdDpbXSxzb3J0QXBwZW5kOm51bGwsc29ydFN0YWJsZTohMSxzb3J0SW5pdGlhbE9yZGVyOiJhc2MiLHNvcnRMb2NhbGVDb21wYXJlOiExLHNvcnRSZXNldDohMSxzb3J0UmVzdGFydDohMSxlbXB0eVRvOiJib3R0b20iLHN0cmluZ1RvOiJtYXgiLGR1cGxpY2F0ZVNwYW46ITAsdGV4dEV4dHJhY3Rpb246ImJhc2ljIix0ZXh0QXR0cmlidXRlOiJkYXRhLXRleHQiLHRleHRTb3J0ZXI6bnVsbCxudW1iZXJTb3J0ZXI6bnVsbCxpbml0V2lkZ2V0czohMCx3aWRnZXRDbGFzczoid2lkZ2V0LXtuYW1lfSIsd2lkZ2V0czpbXSx3aWRnZXRPcHRpb25zOnt6ZWJyYTpbImV2ZW4iLCJvZGQiXX0saW5pdGlhbGl6ZWQ6bnVsbCx0YWJsZUNsYXNzOiIiLGNzc0FzYzoiIixjc3NEZXNjOiIiLGNzc05vbmU6IiIsY3NzSGVhZGVyOiIiLGNzc0hlYWRlclJvdzoiIixjc3NQcm9jZXNzaW5nOiIiLGNzc0NoaWxkUm93OiJ0YWJsZXNvcnRlci1jaGlsZFJvdyIsY3NzSW5mb0Jsb2NrOiJ0YWJsZXNvcnRlci1pbmZvT25seSIsY3NzTm9Tb3J0OiJ0YWJsZXNvcnRlci1ub1NvcnQiLGNzc0lnbm9yZVJvdzoidGFibGVzb3J0ZXItaWdub3JlUm93Iixjc3NJY29uOiJ0YWJsZXNvcnRlci1pY29uIixjc3NJY29uTm9uZToiIixjc3NJY29uQXNjOiIiLGNzc0ljb25EZXNjOiIiLGNzc0ljb25EaXNhYmxlZDoiIixwb2ludGVyQ2xpY2s6ImNsaWNrIixwb2ludGVyRG93bjoibW91c2Vkb3duIixwb2ludGVyVXA6Im1vdXNldXAiLHNlbGVjdG9ySGVhZGVyczoiPiB0aGVhZCB0aCwgPiB0aGVhZCB0ZCIsc2VsZWN0b3JTb3J0OiJ0aCwgdGQiLHNlbGVjdG9yUmVtb3ZlOiIucmVtb3ZlLW1lIixkZWJ1ZzohMSxoZWFkZXJMaXN0OltdLGVtcHRpZXM6e30sc3RyaW5nczp7fSxwYXJzZXJzOltdLGdsb2JhbGl6ZTowLGltZ0F0dHI6MH0sY3NzOnt0YWJsZToidGFibGVzb3J0ZXIiLGNzc0hhc0NoaWxkOiJ0YWJsZXNvcnRlci1oYXNDaGlsZFJvdyIsY2hpbGRSb3c6InRhYmxlc29ydGVyLWNoaWxkUm93Iixjb2xncm91cDoidGFibGVzb3J0ZXItY29sZ3JvdXAiLGhlYWRlcjoidGFibGVzb3J0ZXItaGVhZGVyIixoZWFkZXJSb3c6InRhYmxlc29ydGVyLWhlYWRlclJvdyIsaGVhZGVySW46InRhYmxlc29ydGVyLWhlYWRlci1pbm5lciIsaWNvbjoidGFibGVzb3J0ZXItaWNvbiIscHJvY2Vzc2luZzoidGFibGVzb3J0ZXItcHJvY2Vzc2luZyIsc29ydEFzYzoidGFibGVzb3J0ZXItaGVhZGVyQXNjIixzb3J0RGVzYzoidGFibGVzb3J0ZXItaGVhZGVyRGVzYyIsc29ydE5vbmU6InRhYmxlc29ydGVyLWhlYWRlclVuU29ydGVkIn0sbGFuZ3VhZ2U6e3NvcnRBc2M6IkFzY2VuZGluZyBzb3J0IGFwcGxpZWQsICIsc29ydERlc2M6IkRlc2NlbmRpbmcgc29ydCBhcHBsaWVkLCAiLHNvcnROb25lOiJObyBzb3J0IGFwcGxpZWQsICIsc29ydERpc2FibGVkOiJzb3J0aW5nIGlzIGRpc2FibGVkIixuZXh0QXNjOiJhY3RpdmF0ZSB0byBhcHBseSBhbiBhc2NlbmRpbmcgc29ydCIsbmV4dERlc2M6ImFjdGl2YXRlIHRvIGFwcGx5IGEgZGVzY2VuZGluZyBzb3J0IixuZXh0Tm9uZToiYWN0aXZhdGUgdG8gcmVtb3ZlIHRoZSBzb3J0In0scmVnZXg6e3RlbXBsYXRlQ29udGVudDovXHtjb250ZW50XH0vZyx0ZW1wbGF0ZUljb246L1x7aWNvblx9L2csdGVtcGxhdGVOYW1lOi9ce25hbWVcfS9pLHNwYWNlczovXHMrL2csbm9uV29yZDovXFcvZyxmb3JtRWxlbWVudHM6LyhpbnB1dHxzZWxlY3R8YnV0dG9ufHRleHRhcmVhKS9pLGNodW5rOi8oXihbK1wtXT8oPzpcZCopKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPyk/JHxeMHhbMC05YS1mXSskfFxkKykvZ2ksY2h1bmtzOi8oXlxcMHxcXDAkKS8saGV4Oi9eMHhbMC05YS1mXSskL2ksY29tbWE6LywvZyxkaWdpdE5vblVTOi9bXHN8XC5dL2csZGlnaXROZWdhdGl2ZVRlc3Q6L15ccypcKFsuXGRdK1wpLyxkaWdpdE5lZ2F0aXZlUmVwbGFjZTovXlxzKlwoKFsuXGRdKylcKS8sZGlnaXRUZXN0Oi9eW1wtKyhdP1xkK1spXT8kLyxkaWdpdFJlcGxhY2U6L1ssLiciXHNdL2d9LHN0cmluZzp7bWF4OjEsbWluOi0xLGVtcHR5bWluOjEsZW1wdHltYXg6LTEsemVybzowLG5vbmU6MCwibnVsbCI6MCx0b3A6ITAsYm90dG9tOiExfSxrZXlDb2Rlczp7ZW50ZXI6MTN9LGRhdGVzOnt9LGluc3RhbmNlTWV0aG9kczp7fSxzZXR1cDpmdW5jdGlvbihyLG8pe2lmKHImJnIudEhlYWQmJjAhPT1yLnRCb2RpZXMubGVuZ3RoJiYhMCE9PXIuaGFzSW5pdGlhbGl6ZWQpe3ZhciBzPSIiLGE9ZShyKSxuPWUubWV0YWRhdGE7ci5oYXNJbml0aWFsaXplZD0hMSxyLmlzUHJvY2Vzc2luZz0hMCxyLmNvbmZpZz1vLGUuZGF0YShyLCJ0YWJsZXNvcnRlciIsbyksdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkluaXRpYWxpemluZyB0YWJsZXNvcnRlciB2Iit0LnZlcnNpb24pLGUuZGF0YShyLCJzdGFydG92ZXJhbGx0aW1lciIsbmV3IERhdGUpKSxvLnN1cHBvcnRzRGF0YU9iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZVswXT1wYXJzZUludChlWzBdLDEwKSxlWzBdPjF8fDE9PT1lWzBdJiZwYXJzZUludChlWzFdLDEwKT49NH0oZS5mbi5qcXVlcnkuc3BsaXQoIi4iKSksby5lbXB0eVRvPW8uZW1wdHlUby50b0xvd2VyQ2FzZSgpLG8uc3RyaW5nVG89by5zdHJpbmdUby50b0xvd2VyQ2FzZSgpLG8ubGFzdD17c29ydExpc3Q6W10sY2xpY2tlZEluZGV4Oi0xfSwvdGFibGVzb3J0ZXJcLS8udGVzdChhLmF0dHIoImNsYXNzIikpfHwocz0iIiE9PW8udGhlbWU/IiB0YWJsZXNvcnRlci0iK28udGhlbWU6IiIpLG8ubmFtZXNwYWNlP28ubmFtZXNwYWNlPSIuIitvLm5hbWVzcGFjZS5yZXBsYWNlKHQucmVnZXgubm9uV29yZCwiIik6by5uYW1lc3BhY2U9Ii50YWJsZXNvcnRlciIrTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiksby50YWJsZT1yLG8uJHRhYmxlPWEuYWRkQ2xhc3ModC5jc3MudGFibGUrIiAiK28udGFibGVDbGFzcytzKyIgIitvLm5hbWVzcGFjZS5zbGljZSgxKSkuYXR0cigicm9sZSIsImdyaWQiKSxvLiRoZWFkZXJzPWEuZmluZChvLnNlbGVjdG9ySGVhZGVycyksby4kdGFibGUuY2hpbGRyZW4oKS5jaGlsZHJlbigidHIiKS5hdHRyKCJyb2xlIiwicm93Iiksby4kdGJvZGllcz1hLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrby5jc3NJbmZvQmxvY2srIikiKS5hdHRyKHsiYXJpYS1saXZlIjoicG9saXRlIiwiYXJpYS1yZWxldmFudCI6ImFsbCJ9KSxvLiR0YWJsZS5jaGlsZHJlbigiY2FwdGlvbiIpLmxlbmd0aCYmKChzPW8uJHRhYmxlLmNoaWxkcmVuKCJjYXB0aW9uIilbMF0pLmlkfHwocy5pZD1vLm5hbWVzcGFjZS5zbGljZSgxKSsiY2FwdGlvbiIpLG8uJHRhYmxlLmF0dHIoImFyaWEtbGFiZWxsZWRieSIscy5pZCkpLG8ud2lkZ2V0SW5pdD17fSxvLnRleHRFeHRyYWN0aW9uPW8uJHRhYmxlLmF0dHIoImRhdGEtdGV4dC1leHRyYWN0aW9uIil8fG8udGV4dEV4dHJhY3Rpb258fCJiYXNpYyIsdC5idWlsZEhlYWRlcnMobyksdC5maXhDb2x1bW5XaWR0aChyKSx0LmFkZFdpZGdldEZyb21DbGFzcyhyKSx0LmFwcGx5V2lkZ2V0T3B0aW9ucyhyKSx0LnNldHVwUGFyc2VycyhvKSxvLnRvdGFsUm93cz0wLG8uZGVidWcmJnQudmFsaWRhdGVPcHRpb25zKG8pLG8uZGVsYXlJbml0fHx0LmJ1aWxkQ2FjaGUobyksdC5iaW5kRXZlbnRzKHIsby4kaGVhZGVycywhMCksdC5iaW5kTWV0aG9kcyhvKSxvLnN1cHBvcnRzRGF0YU9iamVjdCYmdm9pZCAwIT09YS5kYXRhKCkuc29ydGxpc3Q/by5zb3J0TGlzdD1hLmRhdGEoKS5zb3J0bGlzdDpuJiZhLm1ldGFkYXRhKCkmJmEubWV0YWRhdGEoKS5zb3J0bGlzdCYmKG8uc29ydExpc3Q9YS5tZXRhZGF0YSgpLnNvcnRsaXN0KSx0LmFwcGx5V2lkZ2V0KHIsITApLG8uc29ydExpc3QubGVuZ3RoPjA/dC5zb3J0T24obyxvLnNvcnRMaXN0LHt9LCFvLmluaXRXaWRnZXRzKToodC5zZXRIZWFkZXJzQ3NzKG8pLG8uaW5pdFdpZGdldHMmJnQuYXBwbHlXaWRnZXQociwhMSkpLG8uc2hvd1Byb2Nlc3NpbmcmJmEudW5iaW5kKCJzb3J0QmVnaW4iK28ubmFtZXNwYWNlKyIgc29ydEVuZCIrby5uYW1lc3BhY2UpLmJpbmQoInNvcnRCZWdpbiIrby5uYW1lc3BhY2UrIiBzb3J0RW5kIitvLm5hbWVzcGFjZSxmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoby50aW1lclByb2Nlc3NpbmcpLHQuaXNQcm9jZXNzaW5nKHIpLCJzb3J0QmVnaW4iPT09ZS50eXBlJiYoby50aW1lclByb2Nlc3Npbmc9c2V0VGltZW91dChmdW5jdGlvbigpe3QuaXNQcm9jZXNzaW5nKHIsITApfSw1MDApKX0pLHIuaGFzSW5pdGlhbGl6ZWQ9ITAsci5pc1Byb2Nlc3Npbmc9ITEsdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlLmxvZygiT3ZlcmFsbCBpbml0aWFsaXphdGlvbiB0aW1lOiIrdC5iZW5jaG1hcmsoZS5kYXRhKHIsInN0YXJ0b3ZlcmFsbHRpbWVyIikpKSx0LmRlYnVnKG8sImNvcmUiKSYmY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSxhLnRyaWdnZXJIYW5kbGVyKCJ0YWJsZXNvcnRlci1pbml0aWFsaXplZCIsciksImZ1bmN0aW9uIj09dHlwZW9mIG8uaW5pdGlhbGl6ZWQmJm8uaW5pdGlhbGl6ZWQocil9ZWxzZSB0LmRlYnVnKG8sImNvcmUiKSYmKHIuaGFzSW5pdGlhbGl6ZWQ/Y29uc29sZS53YXJuKCJTdG9wcGluZyBpbml0aWFsaXphdGlvbi4gVGFibGVzb3J0ZXIgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCIpOmNvbnNvbGUuZXJyb3IoIlN0b3BwaW5nIGluaXRpYWxpemF0aW9uISBObyB0YWJsZSwgdGhlYWQgb3IgdGJvZHkiLHIpKX0sYmluZE1ldGhvZHM6ZnVuY3Rpb24ocil7dmFyIG89ci4kdGFibGUscz1yLm5hbWVzcGFjZSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgYWRkUm93cyB1cGRhdGVDZWxsIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyBkZXN0cm95IG1vdXNldXAgbW91c2VsZWF2ZSAiLnNwbGl0KCIgIikuam9pbihzKyIgIik7by51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLmJpbmQoInNvcnRSZXNldCIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5zb3J0UmVzZXQodGhpcy5jb25maWcsZnVuY3Rpb24oZSl7ZS5pc0FwcGx5aW5nV2lkZ2V0cz9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5hcHBseVdpZGdldChlLCIiLHIpfSwxMDApOnQuYXBwbHlXaWRnZXQoZSwiIixyKX0pfSkuYmluZCgidXBkYXRlQWxsIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQWxsKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGUiK3MrIiB1cGRhdGVSb3dzIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGVIZWFkZXJzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUhlYWRlcnModGhpcy5jb25maWcscil9KS5iaW5kKCJ1cGRhdGVDZWxsIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC51cGRhdGVDZWxsKHRoaXMuY29uZmlnLHIsbyxzKX0pLmJpbmQoImFkZFJvd3MiK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFkZFJvd3ModGhpcy5jb25maWcscixvLHMpfSkuYmluZCgidXBkYXRlQ29tcGxldGUiK3MsZnVuY3Rpb24oKXt0aGlzLmlzVXBkYXRpbmc9ITF9KS5iaW5kKCJzb3J0b24iK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnNvcnRPbih0aGlzLmNvbmZpZyxyLG8scyl9KS5iaW5kKCJhcHBlbmRDYWNoZSIrcyxmdW5jdGlvbihyLG8scyl7ci5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGVuZENhY2hlKHRoaXMuY29uZmlnLHMpLGUuaXNGdW5jdGlvbihvKSYmbyh0aGlzKX0pLmJpbmQoInVwZGF0ZUNhY2hlIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQ2FjaGUodGhpcy5jb25maWcscixvKX0pLmJpbmQoImFwcGx5V2lkZ2V0SWQiK3MsZnVuY3Rpb24oZSxyKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuYXBwbHlXaWRnZXRJZCh0aGlzLHIpfSkuYmluZCgiYXBwbHlXaWRnZXRzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGx5V2lkZ2V0KHRoaXMsITEscil9KS5iaW5kKCJyZWZyZXNoV2lkZ2V0cyIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlZnJlc2hXaWRnZXRzKHRoaXMscixvKX0pLmJpbmQoInJlbW92ZVdpZGdldCIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlbW92ZVdpZGdldCh0aGlzLHIsbyl9KS5iaW5kKCJkZXN0cm95IitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuZGVzdHJveSh0aGlzLHIsbyl9KS5iaW5kKCJyZXNldFRvTG9hZFN0YXRlIitzLGZ1bmN0aW9uKG8pe28uc3RvcFByb3BhZ2F0aW9uKCksdC5yZW1vdmVXaWRnZXQodGhpcywhMCwhMSk7dmFyIHM9ZS5leHRlbmQoITAse30sci5vcmlnaW5hbFNldHRpbmdzKTsocj1lLmV4dGVuZCghMCx7fSx0LmRlZmF1bHRzLHMpKS5vcmlnaW5hbFNldHRpbmdzPXMsdGhpcy5oYXNJbml0aWFsaXplZD0hMSx0LnNldHVwKHRoaXMscil9KX0sYmluZEV2ZW50czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbj0ocj1lKHIpWzBdKS5jb25maWcsaT1uLm5hbWVzcGFjZSxsPW51bGw7ITAhPT1zJiYoby5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfaGVhZGVycyIpLChhPXQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpKS5sZW5ndGgmJiJUQUJMRSI9PT1hWzBdLm5vZGVOYW1lJiZhWzBdIT09ciYmZShhWzBdKS5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfdGFibGUiKSksYT0obi5wb2ludGVyRG93bisiICIrbi5wb2ludGVyVXArIiAiK24ucG9pbnRlckNsaWNrKyIgc29ydCBrZXl1cCAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikuc3BsaXQoIiAiKS5qb2luKGkrIiAiKSxvLmZpbmQobi5zZWxlY3RvclNvcnQpLmFkZChvLmZpbHRlcihuLnNlbGVjdG9yU29ydCkpLnVuYmluZChhKS5iaW5kKGEsZnVuY3Rpb24ocixvKXt2YXIgcyxhLGksZD1lKHIudGFyZ2V0KSxjPSIgIityLnR5cGUrIiAiO2lmKCEoMSE9PShyLndoaWNofHxyLmJ1dHRvbikmJiFjLm1hdGNoKCIgIituLnBvaW50ZXJDbGljaysiIHwgc29ydCB8IGtleXVwICIpfHwiIGtleXVwICI9PT1jJiZyLndoaWNoIT09dC5rZXlDb2Rlcy5lbnRlcnx8Yy5tYXRjaCgiICIrbi5wb2ludGVyQ2xpY2srIiAiKSYmdm9pZCAwIT09ci53aGljaHx8Yy5tYXRjaCgiICIrbi5wb2ludGVyVXArIiAiKSYmbCE9PXIudGFyZ2V0JiYhMCE9PW8pKXtpZihjLm1hdGNoKCIgIituLnBvaW50ZXJEb3duKyIgIikpcmV0dXJuIGw9ci50YXJnZXQsdm9pZCgiMSI9PT0oaT1kLmpxdWVyeS5zcGxpdCgiLiIpKVswXSYmaVsxXTw0JiZyLnByZXZlbnREZWZhdWx0KCkpO2lmKGw9bnVsbCxzPXQuZ2V0Q2xvc2VzdChlKHRoaXMpLCIuIit0LmNzcy5oZWFkZXIpLHQucmVnZXguZm9ybUVsZW1lbnRzLnRlc3Qoci50YXJnZXQubm9kZU5hbWUpfHxkLmhhc0NsYXNzKG4uY3NzTm9Tb3J0KXx8ZC5wYXJlbnRzKCIuIituLmNzc05vU29ydCkubGVuZ3RoPjB8fHMuaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHxkLnBhcmVudHMoImJ1dHRvbiIpLmxlbmd0aD4wKXJldHVybiFuLmNhbmNlbFNlbGVjdGlvbjtuLmRlbGF5SW5pdCYmdC5pc0VtcHR5T2JqZWN0KG4uY2FjaGUpJiZ0LmJ1aWxkQ2FjaGUobiksbi5sYXN0LmNsaWNrZWRJbmRleD1zLmF0dHIoImRhdGEtY29sdW1uIil8fHMuaW5kZXgoKSwoYT1uLiRoZWFkZXJJbmRleGVkW24ubGFzdC5jbGlja2VkSW5kZXhdWzBdKSYmIWEuc29ydERpc2FibGVkJiZ0LmluaXRTb3J0KG4sYSxyKX19KSxuLmNhbmNlbFNlbGVjdGlvbiYmby5hdHRyKCJ1bnNlbGVjdGFibGUiLCJvbiIpLmJpbmQoInNlbGVjdHN0YXJ0IiwhMSkuY3NzKHsidXNlci1zZWxlY3QiOiJub25lIixNb3pVc2VyU2VsZWN0OiJub25lIn0pfSxidWlsZEhlYWRlcnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG47Zm9yKHIuaGVhZGVyTGlzdD1bXSxyLmhlYWRlckNvbnRlbnQ9W10sci5zb3J0VmFycz1bXSx0LmRlYnVnKHIsImNvcmUiKSYmKGE9bmV3IERhdGUpLHIuY29sdW1ucz10LmNvbXB1dGVDb2x1bW5JbmRleChyLiR0YWJsZS5jaGlsZHJlbigidGhlYWQsIHRmb290IikuY2hpbGRyZW4oInRyIikpLHM9ci5jc3NJY29uPyc8aSBjbGFzcz0iJysoci5jc3NJY29uPT09dC5jc3MuaWNvbj90LmNzcy5pY29uOnIuY3NzSWNvbisiICIrdC5jc3MuaWNvbikrJyI+PC9pPic6IiIsci4kaGVhZGVycz1lKGUubWFwKHIuJHRhYmxlLmZpbmQoci5zZWxlY3RvckhlYWRlcnMpLGZ1bmN0aW9uKG8sYSl7dmFyIG4saSxsLGQsYyxnPWUobyk7aWYoIXQuZ2V0Q2xvc2VzdChnLCJ0ciIpLmhhc0NsYXNzKHIuY3NzSWdub3JlUm93KSlyZXR1cm4vKHRofHRkKS9pLnRlc3Qoby5ub2RlTmFtZSl8fChjPXQuZ2V0Q2xvc2VzdChnLCJ0aCwgdGQiKSxnLmF0dHIoImRhdGEtY29sdW1uIixjLmF0dHIoImRhdGEtY29sdW1uIikpKSxuPXQuZ2V0Q29sdW1uRGF0YShyLnRhYmxlLHIuaGVhZGVycyxhLCEwKSxyLmhlYWRlckNvbnRlbnRbYV09Zy5odG1sKCksIiI9PT1yLmhlYWRlclRlbXBsYXRlfHxnLmZpbmQoIi4iK3QuY3NzLmhlYWRlckluKS5sZW5ndGh8fChkPXIuaGVhZGVyVGVtcGxhdGUucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlQ29udGVudCxnLmh0bWwoKSkucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlSWNvbixnLmZpbmQoIi4iK3QuY3NzLmljb24pLmxlbmd0aD8iIjpzKSxyLm9uUmVuZGVyVGVtcGxhdGUmJihpPXIub25SZW5kZXJUZW1wbGF0ZS5hcHBseShnLFthLGRdKSkmJiJzdHJpbmciPT10eXBlb2YgaSYmKGQ9aSksZy5odG1sKCc8ZGl2IGNsYXNzPSInK3QuY3NzLmhlYWRlckluKyciPicrZCsiPC9kaXY+IikpLHIub25SZW5kZXJIZWFkZXImJnIub25SZW5kZXJIZWFkZXIuYXBwbHkoZyxbYSxyLHIuJHRhYmxlXSksbD1wYXJzZUludChnLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG8uY29sdW1uPWwsYz10LmdldE9yZGVyKHQuZ2V0RGF0YShnLG4sInNvcnRJbml0aWFsT3JkZXIiKXx8ci5zb3J0SW5pdGlhbE9yZGVyKSxyLnNvcnRWYXJzW2xdPXtjb3VudDotMSxvcmRlcjpjP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxsb2NrZWRPcmRlcjohMX0sdm9pZCAwIT09KGM9dC5nZXREYXRhKGcsbiwibG9ja2VkT3JkZXIiKXx8ITEpJiYhMSE9PWMmJihyLnNvcnRWYXJzW2xdLmxvY2tlZE9yZGVyPSEwLHIuc29ydFZhcnNbbF0ub3JkZXI9dC5nZXRPcmRlcihjKT9bMSwxXTpbMCwwXSksci5oZWFkZXJMaXN0W2FdPW8sZy5hZGRDbGFzcyh0LmNzcy5oZWFkZXIrIiAiK3IuY3NzSGVhZGVyKSx0LmdldENsb3Nlc3QoZywidHIiKS5hZGRDbGFzcyh0LmNzcy5oZWFkZXJSb3crIiAiK3IuY3NzSGVhZGVyUm93KS5hdHRyKCJyb2xlIiwicm93Iiksci50YWJJbmRleCYmZy5hdHRyKCJ0YWJpbmRleCIsMCksb30pKSxyLiRoZWFkZXJJbmRleGVkPVtdLG49MDtuPHIuY29sdW1ucztuKyspdC5pc0VtcHR5T2JqZWN0KHIuc29ydFZhcnNbbl0pJiYoci5zb3J0VmFyc1tuXT17fSksbz1yLiRoZWFkZXJzLmZpbHRlcignW2RhdGEtY29sdW1uPSInK24rJyJdJyksci4kaGVhZGVySW5kZXhlZFtuXT1vLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcigiOmxhc3QiKTpvLmZpbHRlcigiOmxhc3QiKTplKCk7ci4kdGFibGUuZmluZChyLnNlbGVjdG9ySGVhZGVycykuYXR0cih7c2NvcGU6ImNvbCIscm9sZToiY29sdW1uaGVhZGVyIn0pLHQudXBkYXRlSGVhZGVyKHIpLHQuZGVidWcociwiY29yZSIpJiYoY29uc29sZS5sb2coIkJ1aWx0IGhlYWRlcnM6Iit0LmJlbmNobWFyayhhKSksY29uc29sZS5sb2coci4kaGVhZGVycykpfSxhZGRJbnN0YW5jZU1ldGhvZHM6ZnVuY3Rpb24ocil7ZS5leHRlbmQodC5pbnN0YW5jZU1ldGhvZHMscil9LHNldHVwUGFyc2VyczpmdW5jdGlvbihlLHIpe3ZhciBvLHMsYSxuLGksbCxkLGMsZyxwLHUsZixoLG0sYj1lLnRhYmxlLHk9MCx3PXQuZGVidWcoZSwiY29yZSIpLHg9e307aWYoZS4kdGJvZGllcz1lLiR0YWJsZS5jaGlsZHJlbigidGJvZHk6bm90KC4iK2UuY3NzSW5mb0Jsb2NrKyIpIiksaD12b2lkIDA9PT1yP2UuJHRib2RpZXM6ciwwPT09KG09aC5sZW5ndGgpKXJldHVybiB3P2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgcGFyc2VyIGNhY2hlIik6IiI7Zm9yKHcmJihmPW5ldyBEYXRlLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiRGV0ZWN0aW5nIHBhcnNlcnMgZm9yIGVhY2ggY29sdW1uIikpLHM9e2V4dHJhY3RvcnM6W10scGFyc2VyczpbXX07eTxtOyl7aWYoKG89aFt5XS5yb3dzKS5sZW5ndGgpZm9yKGk9MCxuPWUuY29sdW1ucyxsPTA7bDxuO2wrKyl7aWYoKGQ9ZS4kaGVhZGVySW5kZXhlZFtpXSkmJmQubGVuZ3RoJiYoYz10LmdldENvbHVtbkRhdGEoYixlLmhlYWRlcnMsaSksdT10LmdldFBhcnNlckJ5SWQodC5nZXREYXRhKGQsYywiZXh0cmFjdG9yIikpLHA9dC5nZXRQYXJzZXJCeUlkKHQuZ2V0RGF0YShkLGMsInNvcnRlciIpKSxnPSJmYWxzZSI9PT10LmdldERhdGEoZCxjLCJwYXJzZXIiKSxlLmVtcHRpZXNbaV09KHQuZ2V0RGF0YShkLGMsImVtcHR5Iil8fGUuZW1wdHlUb3x8KGUuZW1wdHlUb0JvdHRvbT8iYm90dG9tIjoidG9wIikpLnRvTG93ZXJDYXNlKCksZS5zdHJpbmdzW2ldPSh0LmdldERhdGEoZCxjLCJzdHJpbmciKXx8ZS5zdHJpbmdUb3x8Im1heCIpLnRvTG93ZXJDYXNlKCksZyYmKHA9dC5nZXRQYXJzZXJCeUlkKCJuby1wYXJzZXIiKSksdXx8KHU9ITEpLHB8fChwPXQuZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKGUsbywtMSxpKSksdyYmKHhbIigiK2krIikgIitkLnRleHQoKV09e3BhcnNlcjpwLmlkLGV4dHJhY3Rvcjp1P3UuaWQ6Im5vbmUiLHN0cmluZzplLnN0cmluZ3NbaV0sZW1wdHk6ZS5lbXB0aWVzW2ldfSkscy5wYXJzZXJzW2ldPXAscy5leHRyYWN0b3JzW2ldPXUsKGE9ZFswXS5jb2xTcGFuLTEpPjApKWZvcihpKz1hLG4rPWE7YSsxPjA7KXMucGFyc2Vyc1tpLWFdPXAscy5leHRyYWN0b3JzW2ktYV09dSxhLS07aSsrfXkrPXMucGFyc2Vycy5sZW5ndGg/bToxfXcmJih0LmlzRW1wdHlPYmplY3QoeCk/Y29uc29sZS53YXJuKCIgIE5vIHBhcnNlcnMgZGV0ZWN0ZWQhIik6Y29uc29sZVtjb25zb2xlLnRhYmxlPyJ0YWJsZSI6ImxvZyJdKHgpLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgZGV0ZWN0aW5nIHBhcnNlcnMiK3QuYmVuY2htYXJrKGYpKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpLGUucGFyc2Vycz1zLnBhcnNlcnMsZS5leHRyYWN0b3JzPXMuZXh0cmFjdG9yc30sYWRkUGFyc2VyOmZ1bmN0aW9uKGUpe3ZhciByLG89dC5wYXJzZXJzLmxlbmd0aCxzPSEwO2ZvcihyPTA7cjxvO3IrKyl0LnBhcnNlcnNbcl0uaWQudG9Mb3dlckNhc2UoKT09PWUuaWQudG9Mb3dlckNhc2UoKSYmKHM9ITEpO3MmJih0LnBhcnNlcnNbdC5wYXJzZXJzLmxlbmd0aF09ZSl9LGdldFBhcnNlckJ5SWQ6ZnVuY3Rpb24oZSl7aWYoImZhbHNlIj09ZSlyZXR1cm4hMTt2YXIgcixvPXQucGFyc2Vycy5sZW5ndGg7Zm9yKHI9MDtyPG87cisrKWlmKHQucGFyc2Vyc1tyXS5pZC50b0xvd2VyQ2FzZSgpPT09ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHQucGFyc2Vyc1tyXTtyZXR1cm4hMX0sZGV0ZWN0UGFyc2VyRm9yQ29sdW1uOmZ1bmN0aW9uKHIsbyxzLGEpe2Zvcih2YXIgbixpLGwsZD10LnBhcnNlcnMubGVuZ3RoLGM9ITEsZz0iIixwPXQuZGVidWcociwiY29yZSIpLHU9ITA7IiI9PT1nJiZ1OykobD1vWysrc10pJiZzPDUwP2wuY2xhc3NOYW1lLmluZGV4T2YodC5jc3NJZ25vcmVSb3cpPDAmJihjPW9bc10uY2VsbHNbYV0sZz10LmdldEVsZW1lbnRUZXh0KHIsYyxhKSxpPWUoYykscCYmY29uc29sZS5sb2coIkNoZWNraW5nIGlmIHZhbHVlIHdhcyBlbXB0eSBvbiByb3cgIitzKyIsIGNvbHVtbjogIithKyc6ICInK2crJyInKSk6dT0hMTtmb3IoOy0tZD49MDspaWYoKG49dC5wYXJzZXJzW2RdKSYmInRleHQiIT09bi5pZCYmbi5pcyYmbi5pcyhnLHIudGFibGUsYyxpKSlyZXR1cm4gbjtyZXR1cm4gdC5nZXRQYXJzZXJCeUlkKCJ0ZXh0Iil9LGdldEVsZW1lbnRUZXh0OmZ1bmN0aW9uKHIsbyxzKXtpZighbylyZXR1cm4iIjt2YXIgYSxuPXIudGV4dEV4dHJhY3Rpb258fCIiLGk9by5qcXVlcnk/bzplKG8pO3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8iYmFzaWMiPT09biYmdm9pZCAwIT09KGE9aS5hdHRyKHIudGV4dEF0dHJpYnV0ZSkpP2UudHJpbShhKTplLnRyaW0oby50ZXh0Q29udGVudHx8aS50ZXh0KCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP2UudHJpbShuKGlbMF0sci50YWJsZSxzKSk6ImZ1bmN0aW9uIj09dHlwZW9mKGE9dC5nZXRDb2x1bW5EYXRhKHIudGFibGUsbixzKSk/ZS50cmltKGEoaVswXSxyLnRhYmxlLHMpKTplLnRyaW0oaVswXS50ZXh0Q29udGVudHx8aS50ZXh0KCkpfSxnZXRQYXJzZWRUZXh0OmZ1bmN0aW9uKGUscixvLHMpe3ZvaWQgMD09PXMmJihzPXQuZ2V0RWxlbWVudFRleHQoZSxyLG8pKTt2YXIgYT0iIitzLG49ZS5wYXJzZXJzW29dLGk9ZS5leHRyYWN0b3JzW29dO3JldHVybiBuJiYoaSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuZm9ybWF0JiYocz1pLmZvcm1hdChzLGUudGFibGUscixvKSksYT0ibm8tcGFyc2VyIj09PW4uaWQ/IiI6bi5mb3JtYXQoIiIrcyxlLnRhYmxlLHIsbyksZS5pZ25vcmVDYXNlJiYic3RyaW5nIj09dHlwZW9mIGEmJihhPWEudG9Mb3dlckNhc2UoKSkpLGF9LGJ1aWxkQ2FjaGU6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYyxnLHAsdSxmLGgsbSxiLHksdyx4LHYsQywkLEksRCxSLFQ9ci50YWJsZSxMPXIucGFyc2VycyxBPXQuZGVidWcociwiY29yZSIpO2lmKHIuJHRib2RpZXM9ci4kdGFibGUuY2hpbGRyZW4oInRib2R5Om5vdCguIityLmNzc0luZm9CbG9jaysiKSIpLGc9dm9pZCAwPT09cz9yLiR0Ym9kaWVzOnMsci5jYWNoZT17fSxyLnRvdGFsUm93cz0wLCFMKXJldHVybiBBP2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgY2FjaGUiKToiIjtmb3IoQSYmKG09bmV3IERhdGUpLHIuc2hvd1Byb2Nlc3NpbmcmJnQuaXNQcm9jZXNzaW5nKFQsITApLGM9MDtjPGcubGVuZ3RoO2MrKyl7Zm9yKHg9W10sYT1yLmNhY2hlW2NdPXtub3JtYWxpemVkOltdfSxiPWdbY10mJmdbY10ucm93cy5sZW5ndGh8fDAsbD0wO2w8YjsrK2wpaWYoeT17Y2hpbGQ6W10scmF3OltdfSxwPWUoZ1tjXS5yb3dzW2xdKSx1PVtdLCFwLmhhc0NsYXNzKHIuc2VsZWN0b3JSZW1vdmUuc2xpY2UoMSkpKWlmKHAuaGFzQ2xhc3Moci5jc3NDaGlsZFJvdykmJjAhPT1sKWZvcihEPWEubm9ybWFsaXplZC5sZW5ndGgtMSwodz1hLm5vcm1hbGl6ZWRbRF1bci5jb2x1bW5zXSkuJHJvdz13LiRyb3cuYWRkKHApLHAucHJldigpLmhhc0NsYXNzKHIuY3NzQ2hpbGRSb3cpfHxwLnByZXYoKS5hZGRDbGFzcyh0LmNzcy5jc3NIYXNDaGlsZCksZj1wLmNoaWxkcmVuKCJ0aCwgdGQiKSxEPXcuY2hpbGQubGVuZ3RoLHcuY2hpbGRbRF09W10sQz0wLEk9ci5jb2x1bW5zLGQ9MDtkPEk7ZCsrKShoPWZbZF0pJiYody5jaGlsZFtEXVtkXT10LmdldFBhcnNlZFRleHQocixoLGQpLCh2PWZbZF0uY29sU3Bhbi0xKT4wJiYoQys9dixJKz12KSksQysrO2Vsc2V7Zm9yKHkuJHJvdz1wLHkub3JkZXI9bCxDPTAsST1yLmNvbHVtbnMsZD0wO2Q8STsrK2Qpe2lmKChoPXBbMF0uY2VsbHNbZF0pJiZDPHIuY29sdW1ucyYmKCEoJD12b2lkIDAhPT1MW0NdKSYmQSYmY29uc29sZS53YXJuKCJObyBwYXJzZXIgZm91bmQgZm9yIHJvdzogIitsKyIsIGNvbHVtbjogIitkKyc7IGNlbGwgY29udGFpbmluZzogIicrZShoKS50ZXh0KCkrJyI7IGRvZXMgaXQgaGF2ZSBhIGhlYWRlcj8nKSxuPXQuZ2V0RWxlbWVudFRleHQocixoLEMpLHkucmF3W0NdPW4saT10LmdldFBhcnNlZFRleHQocixoLEMsbiksdVtDXT1pLCQmJiJudW1lcmljIj09PShMW0NdLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpJiYoeFtDXT1NYXRoLm1heChNYXRoLmFicyhpKXx8MCx4W0NdfHwwKSksKHY9aC5jb2xTcGFuLTEpPjApKXtmb3IoUj0wO1I8PXY7KWk9ci5kdXBsaWNhdGVTcGFufHwwPT09Uj9uOiJzdHJpbmciIT10eXBlb2Ygci50ZXh0RXh0cmFjdGlvbj90LmdldEVsZW1lbnRUZXh0KHIsaCxDK1IpfHwiIjoiIix5LnJhd1tDK1JdPWksdVtDK1JdPWksUisrO0MrPXYsSSs9dn1DKyt9dVtyLmNvbHVtbnNdPXksYS5ub3JtYWxpemVkW2Eubm9ybWFsaXplZC5sZW5ndGhdPXV9YS5jb2xNYXg9eCxyLnRvdGFsUm93cys9YS5ub3JtYWxpemVkLmxlbmd0aH1pZihyLnNob3dQcm9jZXNzaW5nJiZ0LmlzUHJvY2Vzc2luZyhUKSxBKXtmb3IoRD1NYXRoLm1pbig1LHIuY2FjaGVbMF0ubm9ybWFsaXplZC5sZW5ndGgpLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiQnVpbGRpbmcgY2FjaGUgZm9yICIrci50b3RhbFJvd3MrIiByb3dzIChzaG93aW5nICIrRCsiIHJvd3MgaW4gbG9nKSBhbmQgIityLmNvbHVtbnMrIiBjb2x1bW5zIit0LmJlbmNobWFyayhtKSksbj17fSxkPTA7ZDxyLmNvbHVtbnM7ZCsrKWZvcihDPTA7QzxEO0MrKyluWyJyb3c6ICIrQ118fChuWyJyb3c6ICIrQ109e30pLG5bInJvdzogIitDXVtyLiRoZWFkZXJJbmRleGVkW2RdLnRleHQoKV09ci5jYWNoZVswXS5ub3JtYWxpemVkW0NdW2RdO2NvbnNvbGVbY29uc29sZS50YWJsZT8idGFibGUiOiJsb2ciXShuKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9ZS5pc0Z1bmN0aW9uKG8pJiZvKFQpfSxnZXRDb2x1bW5UZXh0OmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG09ImZ1bmN0aW9uIj09dHlwZW9mIHMsYj0iYWxsIj09PW8seT17cmF3OltdLHBhcnNlZDpbXSwkY2VsbDpbXX0sdz0ocj1lKHIpWzBdKS5jb25maWc7aWYoIXQuaXNFbXB0eU9iamVjdCh3KSl7Zm9yKGM9dy4kdGJvZGllcy5sZW5ndGgsbj0wO248YztuKyspZm9yKGc9KGw9dy5jYWNoZVtuXS5ub3JtYWxpemVkKS5sZW5ndGgsaT0wO2k8ZztpKyspZD1sW2ldLGEmJiFkW3cuY29sdW1uc10uJHJvdy5pcyhhKXx8KGg9ITAsdT1iP2Quc2xpY2UoMCx3LmNvbHVtbnMpOmRbb10sZD1kW3cuY29sdW1uc10scD1iP2QucmF3OmQucmF3W29dLGY9Yj9kLiRyb3cuY2hpbGRyZW4oKTpkLiRyb3cuY2hpbGRyZW4oKS5lcShvKSxtJiYoaD1zKHt0Ym9keUluZGV4Om4scm93SW5kZXg6aSxwYXJzZWQ6dSxyYXc6cCwkcm93OmQuJHJvdywkY2VsbDpmfSkpLCExIT09aCYmKHkucGFyc2VkW3kucGFyc2VkLmxlbmd0aF09dSx5LnJhd1t5LnJhdy5sZW5ndGhdPXAseS4kY2VsbFt5LiRjZWxsLmxlbmd0aF09ZikpO3JldHVybiB5fXQuZGVidWcodywiY29yZSIpJiZjb25zb2xlLndhcm4oIk5vIGNhY2hlIGZvdW5kIC0gYWJvcnRpbmcgZ2V0Q29sdW1uVGV4dCBmdW5jdGlvbiEiKX0sc2V0SGVhZGVyc0NzczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ci5zb3J0TGlzdCxuPWEubGVuZ3RoLGk9dC5jc3Muc29ydE5vbmUrIiAiK3IuY3NzTm9uZSxsPVt0LmNzcy5zb3J0QXNjKyIgIityLmNzc0FzYyx0LmNzcy5zb3J0RGVzYysiICIrci5jc3NEZXNjXSxkPVtyLmNzc0ljb25Bc2Msci5jc3NJY29uRGVzYyxyLmNzc0ljb25Ob25lXSxjPVsiYXNjZW5kaW5nIiwiZGVzY2VuZGluZyJdLGc9ZnVuY3Rpb24oZSxyKXtlLnJlbW92ZUNsYXNzKGkpLmFkZENsYXNzKGxbcl0pLmF0dHIoImFyaWEtc29ydCIsY1tyXSkuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZFsyXSkuYWRkQ2xhc3MoZFtyXSl9LHA9ci4kdGFibGUuZmluZCgidGZvb3QgdHIiKS5jaGlsZHJlbigidGQsIHRoIikuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKSx1PXIuJGhlYWRlcnMuYWRkKGUoInRoZWFkICIrci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKS5hZGRDbGFzcyhpKS5hdHRyKCJhcmlhLXNvcnQiLCJub25lIikuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZC5qb2luKCIgIikpLmVuZCgpO2Zvcih1Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKGRbMl0pLHIuY3NzSWNvbkRpc2FibGVkJiZ1LmZpbHRlcigiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKHIuY3NzSWNvbkRpc2FibGVkKSxvPTA7bzxuO28rKylpZigyIT09YVtvXVsxXSl7aWYodT1yLiRoZWFkZXJzLmZpbHRlcihmdW5jdGlvbihlKXtmb3IodmFyIG89ITAscz1yLiRoZWFkZXJzLmVxKGUpLGE9cGFyc2VJbnQocy5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxuPWErdC5nZXRDbG9zZXN0KHMsInRoLCB0ZCIpWzBdLmNvbFNwYW47YTxuO2ErKylvPSEhbyYmKG98fHQuaXNWYWx1ZUluQXJyYXkoYSxyLnNvcnRMaXN0KT4tMSk7cmV0dXJuIG99KSwodT11Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcignW2RhdGEtY29sdW1uPSInK2Fbb11bMF0rJyJdJysoMT09PW4/IjpsYXN0IjoiIikpKS5sZW5ndGgpZm9yKHM9MDtzPHUubGVuZ3RoO3MrKyl1W3NdLnNvcnREaXNhYmxlZHx8Zyh1LmVxKHMpLGFbb11bMV0pO3AubGVuZ3RoJiZnKHAuZmlsdGVyKCdbZGF0YS1jb2x1bW49IicrYVtvXVswXSsnIl0nKSxhW29dWzFdKX1mb3Iobj1yLiRoZWFkZXJzLmxlbmd0aCxvPTA7bzxuO28rKyl0LnNldENvbHVtbkFyaWFMYWJlbChyLHIuJGhlYWRlcnMuZXEobykpfSxnZXRDbG9zZXN0OmZ1bmN0aW9uKHQscil7cmV0dXJuIGUuZm4uY2xvc2VzdD90LmNsb3Nlc3Qocik6dC5pcyhyKT90OnQucGFyZW50cyhyKS5maWx0ZXIoIjpmaXJzdCIpfSxzZXRDb2x1bW5BcmlhTGFiZWw6ZnVuY3Rpb24ocixvLHMpe2lmKG8ubGVuZ3RoKXt2YXIgYT1wYXJzZUludChvLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG49ci5zb3J0VmFyc1thXSxpPW8uaGFzQ2xhc3ModC5jc3Muc29ydEFzYyk/InNvcnRBc2MiOm8uaGFzQ2xhc3ModC5jc3Muc29ydERlc2MpPyJzb3J0RGVzYyI6InNvcnROb25lIixsPWUudHJpbShvLnRleHQoKSkrIjogIit0Lmxhbmd1YWdlW2ldO28uaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHwhMT09PXM/bCs9dC5sYW5ndWFnZS5zb3J0RGlzYWJsZWQ6KGk9KG4uY291bnQrMSklbi5vcmRlci5sZW5ndGgscz1uLm9yZGVyW2ldLGwrPXQubGFuZ3VhZ2VbMD09PXM/Im5leHRBc2MiOjE9PT1zPyJuZXh0RGVzYyI6Im5leHROb25lIl0pLG8uYXR0cigiYXJpYS1sYWJlbCIsbCl9fSx1cGRhdGVIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9ZS4kaGVhZGVycy5sZW5ndGg7Zm9yKHI9MDtyPGk7cisrKXM9ZS4kaGVhZGVycy5lcShyKSxhPXQuZ2V0Q29sdW1uRGF0YShuLGUuaGVhZGVycyxyLCEwKSxvPSJmYWxzZSI9PT10LmdldERhdGEocyxhLCJzb3J0ZXIiKXx8ImZhbHNlIj09PXQuZ2V0RGF0YShzLGEsInBhcnNlciIpLHQuc2V0Q29sdW1uU29ydChlLHMsbyl9LHNldENvbHVtblNvcnQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBvPWUudGFibGUuaWQ7dFswXS5zb3J0RGlzYWJsZWQ9cix0W3I/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgic29ydGVyLWZhbHNlIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsIiIrciksZS50YWJJbmRleCYmKHI/dC5yZW1vdmVBdHRyKCJ0YWJpbmRleCIpOnQuYXR0cigidGFiaW5kZXgiLCIwIikpLG8mJihyP3QucmVtb3ZlQXR0cigiYXJpYS1jb250cm9scyIpOnQuYXR0cigiYXJpYS1jb250cm9scyIsbykpfSx1cGRhdGVIZWFkZXJTb3J0Q291bnQ6ZnVuY3Rpb24ocixvKXt2YXIgcyxhLG4saSxsLGQsYyxnLHA9b3x8ci5zb3J0TGlzdCx1PXAubGVuZ3RoO2ZvcihyLnNvcnRMaXN0PVtdLGk9MDtpPHU7aSsrKWlmKGM9cFtpXSwocz1wYXJzZUludChjWzBdLDEwKSk8ci5jb2x1bW5zKXtzd2l0Y2goci5zb3J0VmFyc1tzXS5vcmRlcnx8KGc9dC5nZXRPcmRlcihyLnNvcnRJbml0aWFsT3JkZXIpP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxyLnNvcnRWYXJzW3NdLm9yZGVyPWcsci5zb3J0VmFyc1tzXS5jb3VudD0wKSxnPXIuc29ydFZhcnNbc10ub3JkZXIsYT0oIiIrY1sxXSkubWF0Y2goL14oMXxkfHN8b3xuKS8pLGE9YT9hWzBdOiIiKXtjYXNlIjEiOmNhc2UiZCI6YT0xO2JyZWFrO2Nhc2UicyI6YT1sfHwwO2JyZWFrO2Nhc2UibyI6YT0wPT09KGQ9Z1sobHx8MCklZy5sZW5ndGhdKT8xOjE9PT1kPzA6MjticmVhaztjYXNlIm4iOmE9Z1srK3Iuc29ydFZhcnNbc10uY291bnQlZy5sZW5ndGhdO2JyZWFrO2RlZmF1bHQ6YT0wfWw9MD09PWk/YTpsLG49W3MscGFyc2VJbnQoYSwxMCl8fDBdLHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPW4sYT1lLmluQXJyYXkoblsxXSxnKSxyLnNvcnRWYXJzW3NdLmNvdW50PWE+PTA/YTpuWzFdJWcubGVuZ3RofX0sdXBkYXRlQWxsOmZ1bmN0aW9uKGUscixvKXt2YXIgcz1lLnRhYmxlO3MuaXNVcGRhdGluZz0hMCx0LnJlZnJlc2hXaWRnZXRzKHMsITAsITApLHQuYnVpbGRIZWFkZXJzKGUpLHQuYmluZEV2ZW50cyhzLGUuJGhlYWRlcnMsITApLHQuYmluZE1ldGhvZHMoZSksdC5jb21tb25VcGRhdGUoZSxyLG8pfSx1cGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UudGFibGUuaXNVcGRhdGluZz0hMCx0LnVwZGF0ZUhlYWRlcihlKSx0LmNvbW1vblVwZGF0ZShlLHIsbyl9LHVwZGF0ZUhlYWRlcnM6ZnVuY3Rpb24oZSxyKXtlLnRhYmxlLmlzVXBkYXRpbmc9ITAsdC5idWlsZEhlYWRlcnMoZSksdC5iaW5kRXZlbnRzKGUudGFibGUsZS4kaGVhZGVycywhMCksdC5yZXNvcnRDb21wbGV0ZShlLHIpfSx1cGRhdGVDZWxsOmZ1bmN0aW9uKHIsbyxzLGEpe2lmKGUobykuY2xvc2VzdCgidHIiKS5oYXNDbGFzcyhyLmNzc0NoaWxkUm93KSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ1cGRhdGVDZWxsIiBmb3IgY2hpbGQgcm93IGNvbnRlbnQgaGFzIGJlZW4gZGlzYWJsZWQsIHVzZSAidXBkYXRlIiBpbnN0ZWFkJyk7ZWxzZXtpZih0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkpcmV0dXJuIHQudXBkYXRlSGVhZGVyKHIpLHZvaWQgdC5jb21tb25VcGRhdGUocixzLGEpO3IudGFibGUuaXNVcGRhdGluZz0hMCxyLiR0YWJsZS5maW5kKHIuc2VsZWN0b3JSZW1vdmUpLnJlbW92ZSgpO3ZhciBuLGksbCxkLGMsZyxwPXIuJHRib2RpZXMsdT1lKG8pLGY9cC5pbmRleCh0LmdldENsb3Nlc3QodSwidGJvZHkiKSksaD1yLmNhY2hlW2ZdLG09dC5nZXRDbG9zZXN0KHUsInRyIik7aWYobz11WzBdLHAubGVuZ3RoJiZmPj0wKXtpZihsPXAuZXEoZikuZmluZCgidHIiKS5ub3QoIi4iK3IuY3NzQ2hpbGRSb3cpLmluZGV4KG0pLGM9aC5ub3JtYWxpemVkW2xdLChnPW1bMF0uY2VsbHMubGVuZ3RoKSE9PXIuY29sdW1ucylmb3IoZD0wLG49ITEsaT0wO2k8ZztpKyspbnx8bVswXS5jZWxsc1tpXT09PW8/bj0hMDpkKz1tWzBdLmNlbGxzW2ldLmNvbFNwYW47ZWxzZSBkPXUuaW5kZXgoKTtuPXQuZ2V0RWxlbWVudFRleHQocixvLGQpLGNbci5jb2x1bW5zXS5yYXdbZF09bixuPXQuZ2V0UGFyc2VkVGV4dChyLG8sZCxuKSxjW2RdPW4sIm51bWVyaWMiPT09KHIucGFyc2Vyc1tkXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKGguY29sTWF4W2RdPU1hdGgubWF4KE1hdGguYWJzKG4pfHwwLGguY29sTWF4W2RdfHwwKSksITEhPT0obj0idW5kZWZpbmVkIiE9PXM/czpyLnJlc29ydCk/dC5jaGVja1Jlc29ydChyLG4sYSk6dC5yZXNvcnRDb21wbGV0ZShyLGEpfWVsc2UgdC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUuZXJyb3IoInVwZGF0ZUNlbGwgYWJvcnRlZCwgdGJvZHkgbWlzc2luZyBvciBub3Qgd2l0aGluIHRoZSBpbmRpY2F0ZWQgdGFibGUiKSxyLnRhYmxlLmlzVXBkYXRpbmc9ITF9fSxhZGRSb3dzOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG0sYix5LHc9InN0cmluZyI9PXR5cGVvZiBvJiYxPT09ci4kdGJvZGllcy5sZW5ndGgmJi88dHIvLnRlc3Qob3x8IiIpLHg9ci50YWJsZTtpZih3KW89ZShvKSxyLiR0Ym9kaWVzLmFwcGVuZChvKTtlbHNlIGlmKCEobyYmbyBpbnN0YW5jZW9mIGUmJnQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpWzBdPT09ci50YWJsZSkpcmV0dXJuIHQuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmVycm9yKCJhZGRSb3dzIG1ldGhvZCByZXF1aXJlcyAoMSkgYSBqUXVlcnkgc2VsZWN0b3IgcmVmZXJlbmNlIHRvIHJvd3MgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgdGFibGUsIG9yICgyKSByb3cgSFRNTCBzdHJpbmcgdG8gYmUgYWRkZWQgdG8gYSB0YWJsZSB3aXRoIG9ubHkgb25lIHRib2R5IiksITE7aWYoeC5pc1VwZGF0aW5nPSEwLHQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSl0LnVwZGF0ZUhlYWRlcihyKSx0LmNvbW1vblVwZGF0ZShyLHMsYSk7ZWxzZXtmb3IoYz1vLmZpbHRlcigidHIiKS5hdHRyKCJyb2xlIiwicm93IikubGVuZ3RoLGw9ci4kdGJvZGllcy5pbmRleChvLnBhcmVudHMoInRib2R5IikuZmlsdGVyKCI6Zmlyc3QiKSksci5wYXJzZXJzJiZyLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhyKSxkPTA7ZDxjO2QrKyl7Zm9yKGY9MCxwPW9bZF0uY2VsbHMubGVuZ3RoLHU9ci5jYWNoZVtsXS5ub3JtYWxpemVkLmxlbmd0aCxtPVtdLGg9e2NoaWxkOltdLHJhdzpbXSwkcm93Om8uZXEoZCksb3JkZXI6dX0sZz0wO2c8cDtnKyspYj1vW2RdLmNlbGxzW2ddLG49dC5nZXRFbGVtZW50VGV4dChyLGIsZiksaC5yYXdbZl09bixpPXQuZ2V0UGFyc2VkVGV4dChyLGIsZixuKSxtW2ZdPWksIm51bWVyaWMiPT09KHIucGFyc2Vyc1tmXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKHIuY2FjaGVbbF0uY29sTWF4W2ZdPU1hdGgubWF4KE1hdGguYWJzKGkpfHwwLHIuY2FjaGVbbF0uY29sTWF4W2ZdfHwwKSksKHk9Yi5jb2xTcGFuLTEpPjAmJihmKz15KSxmKys7bVtyLmNvbHVtbnNdPWgsci5jYWNoZVtsXS5ub3JtYWxpemVkW3VdPW19dC5jaGVja1Jlc29ydChyLHMsYSl9fSx1cGRhdGVDYWNoZTpmdW5jdGlvbihlLHIsbyl7ZS5wYXJzZXJzJiZlLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhlLG8pLHQuYnVpbGRDYWNoZShlLHIsbyl9LGFwcGVuZENhY2hlOmZ1bmN0aW9uKGUscil7dmFyIG8scyxhLG4saSxsLGQsYz1lLnRhYmxlLGc9ZS4kdGJvZGllcyxwPVtdLHU9ZS5jYWNoZTtpZih0LmlzRW1wdHlPYmplY3QodSkpcmV0dXJuIGUuYXBwZW5kZXI/ZS5hcHBlbmRlcihjLHApOmMuaXNVcGRhdGluZz9lLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpOiIiO2Zvcih0LmRlYnVnKGUsImNvcmUiKSYmKGQ9bmV3IERhdGUpLGw9MDtsPGcubGVuZ3RoO2wrKylpZigoYT1nLmVxKGwpKS5sZW5ndGgpe2ZvcihuPXQucHJvY2Vzc1Rib2R5KGMsYSwhMCkscz0obz11W2xdLm5vcm1hbGl6ZWQpLmxlbmd0aCxpPTA7aTxzO2krKylwW3AubGVuZ3RoXT1vW2ldW2UuY29sdW1uc10uJHJvdyxlLmFwcGVuZGVyJiYoIWUucGFnZXJ8fGUucGFnZXIucmVtb3ZlUm93c3x8ZS5wYWdlci5hamF4KXx8bi5hcHBlbmQob1tpXVtlLmNvbHVtbnNdLiRyb3cpO3QucHJvY2Vzc1Rib2R5KGMsbiwhMSl9ZS5hcHBlbmRlciYmZS5hcHBlbmRlcihjLHApLHQuZGVidWcoZSwiY29yZSIpJiZjb25zb2xlLmxvZygiUmVidWlsdCB0YWJsZSIrdC5iZW5jaG1hcmsoZCkpLHJ8fGUuYXBwZW5kZXJ8fHQuYXBwbHlXaWRnZXQoYyksYy5pc1VwZGF0aW5nJiZlLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpfSxjb21tb25VcGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UuJHRhYmxlLmZpbmQoZS5zZWxlY3RvclJlbW92ZSkucmVtb3ZlKCksdC5zZXR1cFBhcnNlcnMoZSksdC5idWlsZENhY2hlKGUpLHQuY2hlY2tSZXNvcnQoZSxyLG8pfSxpbml0U29ydDpmdW5jdGlvbihyLG8scyl7aWYoci50YWJsZS5pc1VwZGF0aW5nKXJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0U29ydChyLG8scyl9LDUwKTt2YXIgYSxuLGksbCxkLGMsZyxwPSFzW3Iuc29ydE11bHRpU29ydEtleV0sdT1yLnRhYmxlLGY9ci4kaGVhZGVycy5sZW5ndGgsaD10LmdldENsb3Nlc3QoZShvKSwidGgsIHRkIiksbT1wYXJzZUludChoLmF0dHIoImRhdGEtY29sdW1uIiksMTApLGI9ci5zb3J0VmFyc1ttXS5vcmRlcjtpZihoPWhbMF0sci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsdSksYz0oci5zb3J0VmFyc1ttXS5jb3VudCsxKSViLmxlbmd0aCxyLnNvcnRWYXJzW21dLmNvdW50PXNbci5zb3J0UmVzZXRLZXldPzI6YyxyLnNvcnRSZXN0YXJ0KWZvcihpPTA7aTxmO2krKylnPXIuJGhlYWRlcnMuZXEoaSksbSE9PShjPXBhcnNlSW50KGcuYXR0cigiZGF0YS1jb2x1bW4iKSwxMCkpJiYocHx8Zy5oYXNDbGFzcyh0LmNzcy5zb3J0Tm9uZSkpJiYoci5zb3J0VmFyc1tjXS5jb3VudD0tMSk7aWYocCl7aWYoci5zb3J0TGlzdD1bXSxyLmxhc3Quc29ydExpc3Q9W10sbnVsbCE9PXIuc29ydEZvcmNlKWZvcihhPXIuc29ydEZvcmNlLG49MDtuPGEubGVuZ3RoO24rKylhW25dWzBdIT09bSYmKHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPWFbbl0pO2lmKChsPWJbci5zb3J0VmFyc1ttXS5jb3VudF0pPDImJihyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1bbSxsXSxoLmNvbFNwYW4+MSkpZm9yKG49MTtuPGguY29sU3BhbjtuKyspci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20rbixsXSxyLnNvcnRWYXJzW20rbl0uY291bnQ9ZS5pbkFycmF5KGwsYil9ZWxzZSBpZihyLnNvcnRMaXN0PWUuZXh0ZW5kKFtdLHIubGFzdC5zb3J0TGlzdCksdC5pc1ZhbHVlSW5BcnJheShtLHIuc29ydExpc3QpPj0wKWZvcihuPTA7bjxyLnNvcnRMaXN0Lmxlbmd0aDtuKyspKGM9ci5zb3J0TGlzdFtuXSlbMF09PT1tJiYoY1sxXT1iW3Iuc29ydFZhcnNbbV0uY291bnRdLDI9PT1jWzFdJiYoci5zb3J0TGlzdC5zcGxpY2UobiwxKSxyLnNvcnRWYXJzW21dLmNvdW50PS0xKSk7ZWxzZSBpZigobD1iW3Iuc29ydFZhcnNbbV0uY291bnRdKTwyJiYoci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20sbF0saC5jb2xTcGFuPjEpKWZvcihuPTE7bjxoLmNvbFNwYW47bisrKXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttK24sbF0sci5zb3J0VmFyc1ttK25dLmNvdW50PWUuaW5BcnJheShsLGIpO2lmKHIubGFzdC5zb3J0TGlzdD1lLmV4dGVuZChbXSxyLnNvcnRMaXN0KSxyLnNvcnRMaXN0Lmxlbmd0aCYmci5zb3J0QXBwZW5kJiYoYT1lLmlzQXJyYXkoci5zb3J0QXBwZW5kKT9yLnNvcnRBcHBlbmQ6ci5zb3J0QXBwZW5kW3Iuc29ydExpc3RbMF1bMF1dLCF0LmlzRW1wdHlPYmplY3QoYSkpKWZvcihuPTA7bjxhLmxlbmd0aDtuKyspaWYoYVtuXVswXSE9PW0mJnQuaXNWYWx1ZUluQXJyYXkoYVtuXVswXSxyLnNvcnRMaXN0KTwwKXtpZihsPWFbbl1bMV0sZD0oIiIrbCkubWF0Y2goL14oYXxkfHN8b3xuKS8pKXN3aXRjaChjPXIuc29ydExpc3RbMF1bMV0sZFswXSl7Y2FzZSJkIjpsPTE7YnJlYWs7Y2FzZSJzIjpsPWM7YnJlYWs7Y2FzZSJvIjpsPTA9PT1jPzE6MDticmVhaztjYXNlIm4iOmw9KGMrMSklYi5sZW5ndGg7YnJlYWs7ZGVmYXVsdDpsPTB9ci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W2Fbbl1bMF0sbF19ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRCZWdpbiIsdSksc2V0VGltZW91dChmdW5jdGlvbigpe3Quc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVmb3JlRW5kIix1KSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEVuZCIsdSl9LDEpfSxtdWx0aXNvcnQ6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9W10sbD0wLGQ9ZS50ZXh0U29ydGVyfHwiIixjPWUuc29ydExpc3QsZz1jLmxlbmd0aCxwPWUuJHRib2RpZXMubGVuZ3RoO2lmKCFlLnNlcnZlclNpZGVTb3J0aW5nJiYhdC5pc0VtcHR5T2JqZWN0KGUuY2FjaGUpKXtpZih0LmRlYnVnKGUsImNvcmUiKSYmKG89bmV3IERhdGUpLCJvYmplY3QiPT10eXBlb2YgZClmb3Iocz1lLmNvbHVtbnM7cy0tOykiZnVuY3Rpb24iPT10eXBlb2YoYT10LmdldENvbHVtbkRhdGEobixkLHMpKSYmKGlbc109YSk7Zm9yKHI9MDtyPHA7cisrKXM9ZS5jYWNoZVtyXS5jb2xNYXgsZS5jYWNoZVtyXS5ub3JtYWxpemVkLnNvcnQoZnVuY3Rpb24ocixvKXt2YXIgYSxwLHUsZixoLG0sYjtmb3IoYT0wO2E8ZzthKyspe2lmKHU9Y1thXVswXSxmPWNbYV1bMV0sbD0wPT09ZixlLnNvcnRTdGFibGUmJnJbdV09PT1vW3VdJiYxPT09ZylyZXR1cm4gcltlLmNvbHVtbnNdLm9yZGVyLW9bZS5jb2x1bW5zXS5vcmRlcjtpZihwPS9uL2kudGVzdCh0LmdldFNvcnRUeXBlKGUucGFyc2Vycyx1KSkscCYmZS5zdHJpbmdzW3VdPyhwPSJib29sZWFuIj09dHlwZW9mIHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/KGw/MTotMSkqKHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/LTE6MSk6ZS5zdHJpbmdzW3VdP3Quc3RyaW5nW2Uuc3RyaW5nc1t1XV18fDA6MCxoPWUubnVtYmVyU29ydGVyP2UubnVtYmVyU29ydGVyKHJbdV0sb1t1XSxsLHNbdV0sbik6dFsic29ydE51bWVyaWMiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSxwLHNbdV0sdSxlKSk6KG09bD9yOm8sYj1sP286cixoPSJmdW5jdGlvbiI9PXR5cGVvZiBkP2QobVt1XSxiW3VdLGwsdSxuKToiZnVuY3Rpb24iPT10eXBlb2YgaVt1XT9pW3VdKG1bdV0sYlt1XSxsLHUsbik6dFsic29ydE5hdHVyYWwiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSx1LGUpKSxoKXJldHVybiBofXJldHVybiByW2UuY29sdW1uc10ub3JkZXItb1tlLmNvbHVtbnNdLm9yZGVyfSk7dC5kZWJ1ZyhlLCJjb3JlIikmJmNvbnNvbGUubG9nKCJBcHBseWluZyBzb3J0ICIrYy50b1N0cmluZygpK3QuYmVuY2htYXJrKG8pKX19LHJlc29ydENvbXBsZXRlOmZ1bmN0aW9uKHQscil7dC50YWJsZS5pc1VwZGF0aW5nJiZ0LiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLHQudGFibGUpLGUuaXNGdW5jdGlvbihyKSYmcih0LnRhYmxlKX0sY2hlY2tSZXNvcnQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhPWUuaXNBcnJheShvKT9vOnIuc29ydExpc3Q7ITE9PT0odm9pZCAwPT09bz9yLnJlc29ydDpvKXx8ci5zZXJ2ZXJTaWRlU29ydGluZ3x8ci50YWJsZS5pc1Byb2Nlc3Npbmc/KHQucmVzb3J0Q29tcGxldGUocixzKSx0LmFwcGx5V2lkZ2V0KHIudGFibGUsITEpKTphLmxlbmd0aD90LnNvcnRPbihyLGEsZnVuY3Rpb24oKXt0LnJlc29ydENvbXBsZXRlKHIscyl9LCEwKTp0LnNvcnRSZXNldChyLGZ1bmN0aW9uKCl7dC5yZXNvcnRDb21wbGV0ZShyLHMpLHQuYXBwbHlXaWRnZXQoci50YWJsZSwhMSl9KX0sc29ydE9uOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuPXIudGFibGU7ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsbiksdC51cGRhdGVIZWFkZXJTb3J0Q291bnQocixvKSx0LnNldEhlYWRlcnNDc3Mociksci5kZWxheUluaXQmJnQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSYmdC5idWlsZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVnaW4iLG4pLHQubXVsdGlzb3J0KHIpLHQuYXBwZW5kQ2FjaGUocixhKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZm9yZUVuZCIsbiksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRFbmQiLG4pLHQuYXBwbHlXaWRnZXQobiksZS5pc0Z1bmN0aW9uKHMpJiZzKG4pfSxzb3J0UmVzZXQ6ZnVuY3Rpb24ocixvKXtyLnNvcnRMaXN0PVtdLHQuc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpO3ZhciBzO2ZvcihzPTA7czxyLmNvbHVtbnM7cysrKXIuc29ydFZhcnNbc10uY291bnQ9LTE7ZS5pc0Z1bmN0aW9uKG8pJiZvKHIudGFibGUpfSxnZXRTb3J0VHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiBlJiZlW3RdP2VbdF0udHlwZXx8IiI6IiJ9LGdldE9yZGVyOmZ1bmN0aW9uKGUpe3JldHVybi9eZC9pLnRlc3QoZSl8fDE9PT1lfSxzb3J0TmF0dXJhbDpmdW5jdGlvbihlLHIpe2lmKGU9PT1yKXJldHVybiAwO2U9ZS50b1N0cmluZygpLHI9ci50b1N0cmluZygpO3ZhciBvLHMsYSxuLGksbCxkPXQucmVnZXg7aWYoZC5oZXgudGVzdChyKSl7aWYobz1wYXJzZUludCgoZXx8IiIpLm1hdGNoKGQuaGV4KSwxNikscz1wYXJzZUludCgocnx8IiIpLm1hdGNoKGQuaGV4KSwxNiksbzxzKXJldHVybi0xO2lmKG8+cylyZXR1cm4gMX1mb3Iobz0oZXx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIikscz0ocnx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIiksbD1NYXRoLm1heChvLmxlbmd0aCxzLmxlbmd0aCksaT0wO2k8bDtpKyspe2lmKGE9aXNOYU4ob1tpXSk/b1tpXXx8MDpwYXJzZUZsb2F0KG9baV0pfHwwLG49aXNOYU4oc1tpXSk/c1tpXXx8MDpwYXJzZUZsb2F0KHNbaV0pfHwwLGlzTmFOKGEpIT09aXNOYU4obikpcmV0dXJuIGlzTmFOKGEpPzE6LTE7aWYodHlwZW9mIGEhPXR5cGVvZiBuJiYoYSs9IiIsbis9IiIpLGE8bilyZXR1cm4tMTtpZihhPm4pcmV0dXJuIDF9cmV0dXJuIDB9LHNvcnROYXR1cmFsQXNjOmZ1bmN0aW9uKGUscixvLHMpe2lmKGU9PT1yKXJldHVybiAwO3ZhciBhPXQuc3RyaW5nW3MuZW1wdGllc1tvXXx8cy5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8tMToxOi1hfHwtMToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOmF8fDE6dC5zb3J0TmF0dXJhbChlLHIpfSxzb3J0TmF0dXJhbERlc2M6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGE9dC5zdHJpbmdbcy5lbXB0aWVzW29dfHxzLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWE/ImJvb2xlYW4iPT10eXBlb2YgYT9hPy0xOjE6YXx8MToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOi1hfHwtMTp0LnNvcnROYXR1cmFsKHIsZSl9LHNvcnRUZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+dD8xOmU8dD8tMTowfSxnZXRUZXh0VmFsdWU6ZnVuY3Rpb24oZSx0LHIpe2lmKHIpe3ZhciBvLHM9ZT9lLmxlbmd0aDowLGE9cit0O2ZvcihvPTA7bzxzO28rKylhKz1lLmNoYXJDb2RlQXQobyk7cmV0dXJuIHQqYX1yZXR1cm4gMH0sc29ydE51bWVyaWNBc2M6ZnVuY3Rpb24oZSxyLG8scyxhLG4pe2lmKGU9PT1yKXJldHVybiAwO3ZhciBpPXQuc3RyaW5nW24uZW1wdGllc1thXXx8bi5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8tMToxOi1pfHwtMToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOml8fDE6KGlzTmFOKGUpJiYoZT10LmdldFRleHRWYWx1ZShlLG8scykpLGlzTmFOKHIpJiYocj10LmdldFRleHRWYWx1ZShyLG8scykpLGUtcil9LHNvcnROdW1lcmljRGVzYzpmdW5jdGlvbihlLHIsbyxzLGEsbil7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGk9dC5zdHJpbmdbbi5lbXB0aWVzW2FdfHxuLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWk/ImJvb2xlYW4iPT10eXBlb2YgaT9pPy0xOjE6aXx8MToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOi1pfHwtMTooaXNOYU4oZSkmJihlPXQuZ2V0VGV4dFZhbHVlKGUsbyxzKSksaXNOYU4ocikmJihyPXQuZ2V0VGV4dFZhbHVlKHIsbyxzKSksci1lKX0sc29ydE51bWVyaWM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSxhZGRXaWRnZXQ6ZnVuY3Rpb24oZSl7ZS5pZCYmIXQuaXNFbXB0eU9iamVjdCh0LmdldFdpZGdldEJ5SWQoZS5pZCkpJiZjb25zb2xlLndhcm4oJyInK2UuaWQrJyIgd2lkZ2V0IHdhcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UhJyksdC53aWRnZXRzW3Qud2lkZ2V0cy5sZW5ndGhdPWV9LGhhc1dpZGdldDpmdW5jdGlvbih0LHIpe3JldHVybih0PWUodCkpLmxlbmd0aCYmdFswXS5jb25maWcmJnRbMF0uY29uZmlnLndpZGdldEluaXRbcl18fCExfSxnZXRXaWRnZXRCeUlkOmZ1bmN0aW9uKGUpe3ZhciByLG8scz10LndpZGdldHMubGVuZ3RoO2ZvcihyPTA7cjxzO3IrKylpZigobz10LndpZGdldHNbcl0pJiZvLmlkJiZvLmlkLnRvTG93ZXJDYXNlKCk9PT1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIG99LGFwcGx5V2lkZ2V0T3B0aW9uczpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbj1yLmNvbmZpZyxpPW4ud2lkZ2V0cy5sZW5ndGg7aWYoaSlmb3Iobz0wO288aTtvKyspKHM9dC5nZXRXaWRnZXRCeUlkKG4ud2lkZ2V0c1tvXSkpJiZzLm9wdGlvbnMmJihhPWUuZXh0ZW5kKCEwLHt9LHMub3B0aW9ucyksbi53aWRnZXRPcHRpb25zPWUuZXh0ZW5kKCEwLGEsbi53aWRnZXRPcHRpb25zKSxlLmV4dGVuZCghMCx0LmRlZmF1bHRzLndpZGdldE9wdGlvbnMscy5vcHRpb25zKSl9LGFkZFdpZGdldEZyb21DbGFzczpmdW5jdGlvbihlKXt2YXIgcixvLHM9ZS5jb25maWcsYT0iXiIrcy53aWRnZXRDbGFzcy5yZXBsYWNlKHQucmVnZXgudGVtcGxhdGVOYW1lLCIoXFxTKykrIikrIiQiLG49bmV3IFJlZ0V4cChhLCJnIiksaT0oZS5jbGFzc05hbWV8fCIiKS5zcGxpdCh0LnJlZ2V4LnNwYWNlcyk7aWYoaS5sZW5ndGgpZm9yKHI9aS5sZW5ndGgsbz0wO288cjtvKyspaVtvXS5tYXRjaChuKSYmKHMud2lkZ2V0c1tzLndpZGdldHMubGVuZ3RoXT1pW29dLnJlcGxhY2UobiwiJDEiKSl9LGFwcGx5V2lkZ2V0SWQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsPShyPWUocilbMF0pLmNvbmZpZyxkPWwud2lkZ2V0T3B0aW9ucyxjPXQuZGVidWcobCwiY29yZSIpLGc9dC5nZXRXaWRnZXRCeUlkKG8pO2cmJihpPWcuaWQsYT0hMSxlLmluQXJyYXkoaSxsLndpZGdldHMpPDAmJihsLndpZGdldHNbbC53aWRnZXRzLmxlbmd0aF09aSksYyYmKG49bmV3IERhdGUpLCFzJiZsLndpZGdldEluaXRbaV18fChsLndpZGdldEluaXRbaV09ITAsci5oYXNJbml0aWFsaXplZCYmdC5hcHBseVdpZGdldE9wdGlvbnMociksImZ1bmN0aW9uIj09dHlwZW9mIGcuaW5pdCYmKGE9ITAsYyYmY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJJbml0aWFsaXppbmcgIitpKyIgd2lkZ2V0IiksZy5pbml0KHIsZyxsLGQpKSksc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGcuZm9ybWF0fHwoYT0hMCxjJiZjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIlVwZGF0aW5nICIraSsiIHdpZGdldCIpLGcuZm9ybWF0KHIsbCxkLCExKSksYyYmYSYmKGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisocz8iaW5pdGlhbGl6aW5nICI6ImFwcGx5aW5nICIpK2krIiB3aWRnZXQiK3QuYmVuY2htYXJrKG4pKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpKX0sYXBwbHlXaWRnZXQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYz0ocj1lKHIpWzBdKS5jb25maWcsZz10LmRlYnVnKGMsImNvcmUiKSxwPVtdO2lmKCExPT09b3x8IXIuaGFzSW5pdGlhbGl6ZWR8fCFyLmlzQXBwbHlpbmdXaWRnZXRzJiYhci5pc1VwZGF0aW5nKXtpZihnJiYoZD1uZXcgRGF0ZSksdC5hZGRXaWRnZXRGcm9tQ2xhc3MociksY2xlYXJUaW1lb3V0KGMudGltZXJSZWFkeSksYy53aWRnZXRzLmxlbmd0aCl7Zm9yKHIuaXNBcHBseWluZ1dpZGdldHM9ITAsYy53aWRnZXRzPWUuZ3JlcChjLndpZGdldHMsZnVuY3Rpb24odCxyKXtyZXR1cm4gZS5pbkFycmF5KHQsYy53aWRnZXRzKT09PXJ9KSxuPShpPWMud2lkZ2V0c3x8W10pLmxlbmd0aCxhPTA7YTxuO2ErKykobD10LmdldFdpZGdldEJ5SWQoaVthXSkpJiZsLmlkPyhsLnByaW9yaXR5fHwobC5wcmlvcml0eT0xMCkscFthXT1sKTpnJiZjb25zb2xlLndhcm4oJyInK2lbYV0rJyIgd2FzIGVuYWJsZWQsIGJ1dCB0aGUgd2lkZ2V0IGNvZGUgaGFzIG5vdCBiZWVuIGxvYWRlZCEnKTtmb3IocC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucHJpb3JpdHk8dC5wcmlvcml0eT8tMTplLnByaW9yaXR5PT09dC5wcmlvcml0eT8wOjF9KSxuPXAubGVuZ3RoLGcmJmNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiU3RhcnQgIisobz8iaW5pdGlhbGl6aW5nIjoiYXBwbHlpbmciKSsiIHdpZGdldHMiKSxhPTA7YTxuO2ErKykobD1wW2FdKSYmbC5pZCYmdC5hcHBseVdpZGdldElkKHIsbC5pZCxvKTtnJiZjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9Yy50aW1lclJlYWR5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmlzQXBwbHlpbmdXaWRnZXRzPSExLGUuZGF0YShyLCJsYXN0V2lkZ2V0QXBwbGljYXRpb24iLG5ldyBEYXRlKSxjLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidGFibGVzb3J0ZXItcmVhZHkiKSxvfHwiZnVuY3Rpb24iIT10eXBlb2Ygc3x8cyhyKSxnJiYobD1jLndpZGdldHMubGVuZ3RoLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisoITA9PT1vPyJpbml0aWFsaXppbmcgIjoiYXBwbHlpbmcgIikrbCsiIHdpZGdldCIrKDEhPT1sPyJzIjoiIikrdC5iZW5jaG1hcmsoZCkpKX0sMTApfX0scmVtb3ZlV2lkZ2V0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkPShyPWUocilbMF0pLmNvbmZpZztpZighMD09PW8pZm9yKG89W10sbD10LndpZGdldHMubGVuZ3RoLGk9MDtpPGw7aSsrKShuPXQud2lkZ2V0c1tpXSkmJm4uaWQmJihvW28ubGVuZ3RoXT1uLmlkKTtlbHNlIG89KGUuaXNBcnJheShvKT9vLmpvaW4oIiwiKTpvfHwiIikudG9Mb3dlckNhc2UoKS5zcGxpdCgvW1xzLF0rLyk7Zm9yKGw9by5sZW5ndGgsYT0wO2E8bDthKyspbj10LmdldFdpZGdldEJ5SWQob1thXSksKGk9ZS5pbkFycmF5KG9bYV0sZC53aWRnZXRzKSk+PTAmJiEwIT09cyYmZC53aWRnZXRzLnNwbGljZShpLDEpLG4mJm4ucmVtb3ZlJiYodC5kZWJ1ZyhkLCJjb3JlIikmJmNvbnNvbGUubG9nKChzPyJSZWZyZXNoaW5nIjoiUmVtb3ZpbmciKSsnICInK29bYV0rJyIgd2lkZ2V0Jyksbi5yZW1vdmUocixkLGQud2lkZ2V0T3B0aW9ucyxzKSxkLndpZGdldEluaXRbb1thXV09ITEpO2QuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJ3aWRnZXRSZW1vdmVFbmQiLHIpfSxyZWZyZXNoV2lkZ2V0czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbixpPShyPWUocilbMF0pLmNvbmZpZy53aWRnZXRzLGw9dC53aWRnZXRzLGQ9bC5sZW5ndGgsYz1bXSxnPWZ1bmN0aW9uKHQpe2UodCkudHJpZ2dlckhhbmRsZXIoInJlZnJlc2hDb21wbGV0ZSIpfTtmb3IoYT0wO2E8ZDthKyspKG49bFthXSkmJm4uaWQmJihvfHxlLmluQXJyYXkobi5pZCxpKTwwKSYmKGNbYy5sZW5ndGhdPW4uaWQpO3QucmVtb3ZlV2lkZ2V0KHIsYy5qb2luKCIsIiksITApLCEwIT09cz8odC5hcHBseVdpZGdldChyLG98fCExLGcpLG8mJnQuYXBwbHlXaWRnZXQociwhMSxnKSk6ZyhyKX0sYmVuY2htYXJrOmZ1bmN0aW9uKGUpe3JldHVybiIgKCIrKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWUuZ2V0VGltZSgpKSsiIG1zKSJ9LGxvZzpmdW5jdGlvbigpe2NvbnNvbGUubG9nKGFyZ3VtZW50cyl9LGRlYnVnOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJighMD09PWUuZGVidWd8fCJzdHJpbmciPT10eXBlb2YgZS5kZWJ1ZyYmZS5kZWJ1Zy5pbmRleE9mKHQpPi0xKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0saXNWYWx1ZUluQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgcixvPXQmJnQubGVuZ3RofHwwO2ZvcihyPTA7cjxvO3IrKylpZih0W3JdWzBdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX0sZm9ybWF0RmxvYXQ6ZnVuY3Rpb24ocixvKXtpZigic3RyaW5nIiE9dHlwZW9mIHJ8fCIiPT09cilyZXR1cm4gcjt2YXIgcztyZXR1cm4gcj0obyYmby5jb25maWc/ITEhPT1vLmNvbmZpZy51c051bWJlckZvcm1hdDp2b2lkIDA9PT1vfHxvKT9yLnJlcGxhY2UodC5yZWdleC5jb21tYSwiIik6ci5yZXBsYWNlKHQucmVnZXguZGlnaXROb25VUywiIikucmVwbGFjZSh0LnJlZ2V4LmNvbW1hLCIuIiksdC5yZWdleC5kaWdpdE5lZ2F0aXZlVGVzdC50ZXN0KHIpJiYocj1yLnJlcGxhY2UodC5yZWdleC5kaWdpdE5lZ2F0aXZlUmVwbGFjZSwiLSQxIikpLHM9cGFyc2VGbG9hdChyKSxpc05hTihzKT9lLnRyaW0ocik6c30saXNEaWdpdDpmdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZSk/dC5yZWdleC5kaWdpdFRlc3QudGVzdChlLnRvU3RyaW5nKCkucmVwbGFjZSh0LnJlZ2V4LmRpZ2l0UmVwbGFjZSwiIikpOiIiIT09ZX0sY29tcHV0ZUNvbHVtbkluZGV4OmZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZyxwLHUsZj1vJiZvLmNvbHVtbnN8fDAsaD1bXSxtPW5ldyBBcnJheShmKTtmb3Iocz0wO3M8ci5sZW5ndGg7cysrKWZvcihkPXJbc10uY2VsbHMsYT0wO2E8ZC5sZW5ndGg7YSsrKXtmb3IoYz1zLGc9KGw9ZFthXSkucm93U3Bhbnx8MSxwPWwuY29sU3Bhbnx8MSx2b2lkIDA9PT1oW2NdJiYoaFtjXT1bXSksbj0wO248aFtjXS5sZW5ndGgrMTtuKyspaWYodm9pZCAwPT09aFtjXVtuXSl7dT1uO2JyZWFrfWZvcihmJiZsLmNlbGxJbmRleD09PXV8fChsLnNldEF0dHJpYnV0ZT9sLnNldEF0dHJpYnV0ZSgiZGF0YS1jb2x1bW4iLHUpOmUobCkuYXR0cigiZGF0YS1jb2x1bW4iLHUpKSxuPWM7bjxjK2c7bisrKWZvcih2b2lkIDA9PT1oW25dJiYoaFtuXT1bXSksbT1oW25dLGk9dTtpPHUrcDtpKyspbVtpXT0ieCJ9cmV0dXJuIHQuY2hlY2tDb2x1bW5Db3VudChyLGgsbS5sZW5ndGgpLG0ubGVuZ3RofSxjaGVja0NvbHVtbkNvdW50OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbyxzLGE9ITAsbj1bXTtmb3Iobz0wO288dC5sZW5ndGg7bysrKWlmKHRbb10mJihzPXRbb10ubGVuZ3RoLHRbb10ubGVuZ3RoIT09cikpe2E9ITE7YnJlYWt9YXx8KGUuZWFjaChmdW5jdGlvbihlLHQpe3ZhciByPXQucGFyZW50RWxlbWVudC5ub2RlTmFtZTtuLmluZGV4T2Yocik8MCYmbi5wdXNoKHIpfSksY29uc29sZS5lcnJvcigiSW52YWxpZCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlICIrbi5qb2luKCIgb3IgIikrIjsgZXhwZWN0ZWQgIityKyIsIGJ1dCBmb3VuZCAiK3MrIiBjb2x1bW5zIikpfSxmaXhDb2x1bW5XaWR0aDpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbixpLGw9KHI9ZShyKVswXSkuY29uZmlnLGQ9bC4kdGFibGUuY2hpbGRyZW4oImNvbGdyb3VwIik7aWYoZC5sZW5ndGgmJmQuaGFzQ2xhc3ModC5jc3MuY29sZ3JvdXApJiZkLnJlbW92ZSgpLGwud2lkdGhGaXhlZCYmMD09PWwuJHRhYmxlLmNoaWxkcmVuKCJjb2xncm91cCIpLmxlbmd0aCl7Zm9yKGQ9ZSgnPGNvbGdyb3VwIGNsYXNzPSInK3QuY3NzLmNvbGdyb3VwKyciPicpLG89bC4kdGFibGUud2lkdGgoKSxuPShhPWwuJHRib2RpZXMuZmluZCgidHI6Zmlyc3QiKS5jaGlsZHJlbigiOnZpc2libGUiKSkubGVuZ3RoLGk9MDtpPG47aSsrKXM9cGFyc2VJbnQoYS5lcShpKS53aWR0aCgpL28qMWUzLDEwKS8xMCsiJSIsZC5hcHBlbmQoZSgiPGNvbD4iKS5jc3MoIndpZHRoIixzKSk7bC4kdGFibGUucHJlcGVuZChkKX19LGdldERhdGE6ZnVuY3Rpb24odCxyLG8pe3ZhciBzLGEsbj0iIixpPWUodCk7cmV0dXJuIGkubGVuZ3RoPyhzPSEhZS5tZXRhZGF0YSYmaS5tZXRhZGF0YSgpLGE9IiAiKyhpLmF0dHIoImNsYXNzIil8fCIiKSx2b2lkIDAhPT1pLmRhdGEobyl8fHZvaWQgMCE9PWkuZGF0YShvLnRvTG93ZXJDYXNlKCkpP24rPWkuZGF0YShvKXx8aS5kYXRhKG8udG9Mb3dlckNhc2UoKSk6cyYmdm9pZCAwIT09c1tvXT9uKz1zW29dOnImJnZvaWQgMCE9PXJbb10/bis9cltvXToiICIhPT1hJiZhLm1hdGNoKCIgIitvKyItIikmJihuPWEubWF0Y2gobmV3IFJlZ0V4cCgiXFxzIitvKyItKFtcXHctXSspIikpWzFdfHwiIiksZS50cmltKG4pKToiIn0sZ2V0Q29sdW1uRGF0YTpmdW5jdGlvbih0LHIsbyxzLGEpe2lmKCJvYmplY3QiIT10eXBlb2Ygcnx8bnVsbD09PXIpcmV0dXJuIHI7dmFyIG4saT0odD1lKHQpWzBdKS5jb25maWcsbD1hfHxpLiRoZWFkZXJzLGQ9aS4kaGVhZGVySW5kZXhlZCYmaS4kaGVhZGVySW5kZXhlZFtvXXx8bC5maW5kKCdbZGF0YS1jb2x1bW49IicrbysnIl06bGFzdCcpO2lmKHZvaWQgMCE9PXJbb10pcmV0dXJuIHM/cltvXTpyW2wuaW5kZXgoZCldO2ZvcihuIGluIHIpaWYoInN0cmluZyI9PXR5cGVvZiBuJiZkLmZpbHRlcihuKS5hZGQoZC5maW5kKG4pKS5sZW5ndGgpcmV0dXJuIHJbbl19LGlzUHJvY2Vzc2luZzpmdW5jdGlvbihyLG8scyl7dmFyIGE9KHI9ZShyKSlbMF0uY29uZmlnLG49c3x8ci5maW5kKCIuIit0LmNzcy5oZWFkZXIpO28/KHZvaWQgMCE9PXMmJmEuc29ydExpc3QubGVuZ3RoPjAmJihuPW4uZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuc29ydERpc2FibGVkJiZ0LmlzVmFsdWVJbkFycmF5KHBhcnNlRmxvYXQoZSh0aGlzKS5hdHRyKCJkYXRhLWNvbHVtbiIpKSxhLnNvcnRMaXN0KT49MH0pKSxyLmFkZChuKS5hZGRDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpKTpyLmFkZChuKS5yZW1vdmVDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpfSxwcm9jZXNzVGJvZHk6ZnVuY3Rpb24odCxyLG8pe2lmKHQ9ZSh0KVswXSxvKXJldHVybiB0LmlzUHJvY2Vzc2luZz0hMCxyLmJlZm9yZSgnPGNvbGdyb3VwIGNsYXNzPSJ0YWJsZXNvcnRlci1zYXZlbXlwbGFjZSIvPicpLGUuZm4uZGV0YWNoP3IuZGV0YWNoKCk6ci5yZW1vdmUoKTt2YXIgcz1lKHQpLmZpbmQoImNvbGdyb3VwLnRhYmxlc29ydGVyLXNhdmVteXBsYWNlIik7ci5pbnNlcnRBZnRlcihzKSxzLnJlbW92ZSgpLHQuaXNQcm9jZXNzaW5nPSExfSxjbGVhclRhYmxlQm9keTpmdW5jdGlvbih0KXtlKHQpWzBdLmNvbmZpZy4kdGJvZGllcy5jaGlsZHJlbigpLmRldGFjaCgpfSxjaGFyYWN0ZXJFcXVpdmFsZW50czp7YToiw6HDoMOiw6PDpMSFw6UiLEE6IsOBw4DDgsODw4TEhMOFIixjOiLDp8SHxI0iLEM6IsOHxIbEjCIsZToiw6nDqMOqw6vEm8SZIixFOiLDicOIw4rDi8SaxJgiLGk6IsOtw6zEsMOuw6/EsSIsSToiw43DjMSww47DjyIsbzoiw7PDssO0w7XDtsWNIixPOiLDk8OSw5TDlcOWxYwiLHNzOiLDnyIsU1M6IuG6niIsdToiw7rDucO7w7zFryIsVToiw5rDmcObw5zFriJ9LHJlcGxhY2VBY2NlbnRzOmZ1bmN0aW9uKGUpe3ZhciByLG89IlsiLHM9dC5jaGFyYWN0ZXJFcXVpdmFsZW50cztpZighdC5jaGFyYWN0ZXJSZWdleCl7dC5jaGFyYWN0ZXJSZWdleEFycmF5PXt9O2ZvcihyIGluIHMpInN0cmluZyI9PXR5cGVvZiByJiYobys9c1tyXSx0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl09bmV3IFJlZ0V4cCgiWyIrc1tyXSsiXSIsImciKSk7dC5jaGFyYWN0ZXJSZWdleD1uZXcgUmVnRXhwKG8rIl0iKX1pZih0LmNoYXJhY3RlclJlZ2V4LnRlc3QoZSkpZm9yKHIgaW4gcykic3RyaW5nIj09dHlwZW9mIHImJihlPWUucmVwbGFjZSh0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl0scikpO3JldHVybiBlfSx2YWxpZGF0ZU9wdGlvbnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG4saT0iaGVhZGVycyBzb3J0Rm9yY2Ugc29ydExpc3Qgc29ydEFwcGVuZCB3aWRnZXRzIi5zcGxpdCgiICIpLGw9ci5vcmlnaW5hbFNldHRpbmdzO2lmKGwpe3QuZGVidWcociwiY29yZSIpJiYobj1uZXcgRGF0ZSk7Zm9yKG8gaW4gbClpZigidW5kZWZpbmVkIj09PShhPXR5cGVvZiB0LmRlZmF1bHRzW29dKSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ0YWJsZS5jb25maWcuJytvKyciIG9wdGlvbiBub3QgcmVjb2duaXplZCcpO2Vsc2UgaWYoIm9iamVjdCI9PT1hKWZvcihzIGluIGxbb10pYT10LmRlZmF1bHRzW29dJiZ0eXBlb2YgdC5kZWZhdWx0c1tvXVtzXSxlLmluQXJyYXkobyxpKTwwJiYidW5kZWZpbmVkIj09PWEmJmNvbnNvbGUud2FybignVGFibGVzb3J0ZXIgV2FybmluZyEgInRhYmxlLmNvbmZpZy4nK28rIi4iK3MrJyIgb3B0aW9uIG5vdCByZWNvZ25pemVkJyk7dC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ2YWxpZGF0ZSBvcHRpb25zIHRpbWU6Iit0LmJlbmNobWFyayhuKSl9fSxyZXN0b3JlSGVhZGVyczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ZShyKVswXS5jb25maWcsbj1hLiR0YWJsZS5maW5kKGEuc2VsZWN0b3JIZWFkZXJzKSxpPW4ubGVuZ3RoO2ZvcihvPTA7bzxpO28rKykocz1uLmVxKG8pKS5maW5kKCIuIit0LmNzcy5oZWFkZXJJbikubGVuZ3RoJiZzLmh0bWwoYS5oZWFkZXJDb250ZW50W29dKX0sZGVzdHJveTpmdW5jdGlvbihyLG8scyl7aWYoKHI9ZShyKVswXSkuaGFzSW5pdGlhbGl6ZWQpe3QucmVtb3ZlV2lkZ2V0KHIsITAsITEpO3ZhciBhLG49ZShyKSxpPXIuY29uZmlnLGw9bi5maW5kKCJ0aGVhZDpmaXJzdCIpLGQ9bC5maW5kKCJ0ci4iK3QuY3NzLmhlYWRlclJvdykucmVtb3ZlQ2xhc3ModC5jc3MuaGVhZGVyUm93KyIgIitpLmNzc0hlYWRlclJvdyksYz1uLmZpbmQoInRmb290OmZpcnN0ID4gdHIiKS5jaGlsZHJlbigidGgsIHRkIik7ITE9PT1vJiZlLmluQXJyYXkoInVpdGhlbWUiLGkud2lkZ2V0cyk+PTAmJihuLnRyaWdnZXJIYW5kbGVyKCJhcHBseVdpZGdldElkIixbInVpdGhlbWUiXSksbi50cmlnZ2VySGFuZGxlcigiYXBwbHlXaWRnZXRJZCIsWyJ6ZWJyYSJdKSksbC5maW5kKCJ0ciIpLm5vdChkKS5yZW1vdmUoKSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgdXBkYXRlQ2VsbCBhZGRSb3dzIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyByZW1vdmVXaWRnZXQgZGVzdHJveSBtb3VzZXVwIG1vdXNlbGVhdmUgIisia2V5cHJlc3Mgc29ydEJlZ2luIHNvcnRFbmQgcmVzZXRUb0xvYWRTdGF0ZSAiLnNwbGl0KCIgIikuam9pbihpLm5hbWVzcGFjZSsiICIpLG4ucmVtb3ZlRGF0YSgidGFibGVzb3J0ZXIiKS51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLGkuJGhlYWRlcnMuYWRkKGMpLnJlbW92ZUNsYXNzKFt0LmNzcy5oZWFkZXIsaS5jc3NIZWFkZXIsaS5jc3NBc2MsaS5jc3NEZXNjLHQuY3NzLnNvcnRBc2MsdC5jc3Muc29ydERlc2MsdC5jc3Muc29ydE5vbmVdLmpvaW4oIiAiKSkucmVtb3ZlQXR0cigiZGF0YS1jb2x1bW4iKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSxkLmZpbmQoaS5zZWxlY3RvclNvcnQpLnVuYmluZCgibW91c2Vkb3duIG1vdXNldXAga2V5cHJlc3MgIi5zcGxpdCgiICIpLmpvaW4oaS5uYW1lc3BhY2UrIiAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLHQucmVzdG9yZUhlYWRlcnMociksbi50b2dnbGVDbGFzcyh0LmNzcy50YWJsZSsiICIraS50YWJsZUNsYXNzKyIgdGFibGVzb3J0ZXItIitpLnRoZW1lLCExPT09byksbi5yZW1vdmVDbGFzcyhpLm5hbWVzcGFjZS5zbGljZSgxKSksci5oYXNJbml0aWFsaXplZD0hMSxkZWxldGUgci5jb25maWcuY2FjaGUsImZ1bmN0aW9uIj09dHlwZW9mIHMmJnMociksdC5kZWJ1ZyhpLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ0YWJsZXNvcnRlciBoYXMgYmVlbiByZW1vdmVkIil9fX07ZS5mbi50YWJsZXNvcnRlcj1mdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxzPWUuZXh0ZW5kKCEwLHt9LHQuZGVmYXVsdHMscix0Lmluc3RhbmNlTWV0aG9kcyk7cy5vcmlnaW5hbFNldHRpbmdzPXIsIW8uaGFzSW5pdGlhbGl6ZWQmJnQuYnVpbGRUYWJsZSYmIlRBQkxFIiE9PXRoaXMubm9kZU5hbWU/dC5idWlsZFRhYmxlKG8scyk6dC5zZXR1cChvLHMpfSl9LHdpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2d8fCh0LmxvZ3M9W10sY29uc29sZT17fSxjb25zb2xlLmxvZz1jb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj1jb25zb2xlLnRhYmxlPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50czphcmd1bWVudHNbMF07dC5sb2dzW3QubG9ncy5sZW5ndGhdPXtkYXRlOkRhdGUubm93KCksbG9nOmV9fSksdC5hZGRQYXJzZXIoe2lkOiJuby1wYXJzZXIiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbigpe3JldHVybiIifSx0eXBlOiJ0ZXh0In0pLHQuYWRkUGFyc2VyKHtpZDoidGV4dCIsaXM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9by5jb25maWc7cmV0dXJuIHImJihyPWUudHJpbShzLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpLHI9cy5zb3J0TG9jYWxlQ29tcGFyZT90LnJlcGxhY2VBY2NlbnRzKHIpOnIpLHJ9LHR5cGU6InRleHQifSksdC5yZWdleC5ub25kaWdpdD0vW15cdywuIFwtKCldL2csdC5hZGRQYXJzZXIoe2lkOiJkaWdpdCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNEaWdpdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC5jdXJyZW5jeVJlcGxhY2U9L1srXC0sLiBdL2csdC5yZWdleC5jdXJyZW5jeVRlc3Q9L15cKD9cZCtbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXXxbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXVxkK1wpPyQvLHQuYWRkUGFyc2VyKHtpZDoiY3VycmVuY3kiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiBlPShlfHwiIikucmVwbGFjZSh0LnJlZ2V4LmN1cnJlbmN5UmVwbGFjZSwiIiksdC5yZWdleC5jdXJyZW5jeVRlc3QudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC51cmxQcm90b2NvbFRlc3Q9L14oaHR0cHM/fGZ0cHxmaWxlKTpcL1wvLyx0LnJlZ2V4LnVybFByb3RvY29sUmVwbGFjZT0vKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLyh3d3dcLik/Lyx0LmFkZFBhcnNlcih7aWQ6InVybCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgudXJsUHJvdG9jb2xUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihyKXtyZXR1cm4gcj9lLnRyaW0oci5yZXBsYWNlKHQucmVnZXgudXJsUHJvdG9jb2xSZXBsYWNlLCIiKSk6cn0sdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhc2g9Ly0vZyx0LnJlZ2V4Lmlzb0RhdGU9L15cZHs0fVtcL1wtXVxkezEsMn1bXC9cLV1cZHsxLDJ9Lyx0LmFkZFBhcnNlcih7aWQ6Imlzb0RhdGUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4Lmlzb0RhdGUudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGFzaCwiLyIpKTplO3JldHVybiByIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocik/ci5nZXRUaW1lKCk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnBlcmNlbnQ9LyUvZyx0LnJlZ2V4LnBlcmNlbnRUZXN0PS8oXGRccyo/JXwlXHMqP1xkKS8sdC5hZGRQYXJzZXIoe2lkOiJwZXJjZW50IixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC5wZXJjZW50VGVzdC50ZXN0KGUpJiZlLmxlbmd0aDwxNX0sZm9ybWF0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGU/dC5mb3JtYXRGbG9hdChlLnJlcGxhY2UodC5yZWdleC5wZXJjZW50LCIiKSxyKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoiaW1hZ2UiLGlzOmZ1bmN0aW9uKGUsdCxyLG8pe3JldHVybiBvLmZpbmQoImltZyIpLmxlbmd0aD4wfSxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3JldHVybiBlKG8pLmZpbmQoImltZyIpLmF0dHIoci5jb25maWcuaW1nQXR0cnx8ImFsdCIpfHx0fSxwYXJzZWQ6ITAsdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhdGVSZXBsYWNlPS8oXFMpKFtBUF1NKSQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0MT0vXltBLVpdezMsMTB9XC4/XHMrXGR7MSwyfSw/XHMrKFxkezR9KShccytcZHsxLDJ9OlxkezJ9KDpcZHsyfSk/KFxzK1tBUF1NKT8pPyQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0Mj0vXlxkezEsMn1ccytbQS1aXXszLDEwfVxzK1xkezR9L2ksdC5hZGRQYXJzZXIoe2lkOiJ1c0xvbmdEYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC51c0xvbmdEYXRlVGVzdDEudGVzdChlKXx8dC5yZWdleC51c0xvbmdEYXRlVGVzdDIudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGF0ZVJlcGxhY2UsIiQxICQyIikpOmU7cmV0dXJuIHIgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShyKT9yLmdldFRpbWUoKTplfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXguc2hvcnREYXRlVGVzdD0vKF5cZHsxLDJ9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezR9KXwoXlxkezR9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezEsMn0pLyx0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2U9L1tcLS4sXS9nLHQucmVnZXguc2hvcnREYXRlWFhZPS8oXGR7MSwyfSlbXC9cc10oXGR7MSwyfSlbXC9cc10oXGR7NH0pLyx0LnJlZ2V4LnNob3J0RGF0ZVlNRD0vKFxkezR9KVtcL1xzXShcZHsxLDJ9KVtcL1xzXShcZHsxLDJ9KS8sdC5jb252ZXJ0Rm9ybWF0PWZ1bmN0aW9uKGUscil7ZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLCJtbWRkeXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMS8kMiIpOiJkZG1teXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMi8kMSIpOiJ5eXl5bW1kZCI9PT1yJiYoZT1lLnJlcGxhY2UodC5yZWdleC5zaG9ydERhdGVZTUQsIiQxLyQyLyQzIikpO3ZhciBvPW5ldyBEYXRlKGUpO3JldHVybiBvIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUobyk/by5nZXRUaW1lKCk6IiJ9LHQuYWRkUGFyc2VyKHtpZDoic2hvcnREYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLHQucmVnZXguc2hvcnREYXRlVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZSl7dmFyIGE9ci5jb25maWcsbj1hLiRoZWFkZXJJbmRleGVkW3NdLGk9bi5sZW5ndGgmJm4uZGF0YSgiZGF0ZUZvcm1hdCIpfHx0LmdldERhdGEobix0LmdldENvbHVtbkRhdGEocixhLmhlYWRlcnMscyksImRhdGVGb3JtYXQiKXx8YS5kYXRlRm9ybWF0O3JldHVybiBuLmxlbmd0aCYmbi5kYXRhKCJkYXRlRm9ybWF0IixpKSx0LmNvbnZlcnRGb3JtYXQoZSxpKXx8ZX1yZXR1cm4gZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnRpbWVUZXN0PS9eKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSkkfF4oKD86WzAxXVxkfFsyXVswLTRdKTpbMC01XVxkKSQvaSx0LnJlZ2V4LnRpbWVNYXRjaD0vKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSl8KCg/OlswMV1cZHxbMl1bMC00XSk6WzAtNV1cZCkvaSx0LmFkZFBhcnNlcih7aWQ6InRpbWUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4LnRpbWVUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcixvPShlfHwiIikubWF0Y2godC5yZWdleC50aW1lTWF0Y2gpLHM9bmV3IERhdGUoZSksYT1lJiYobnVsbCE9PW8/b1swXToiMDA6MDAgQU0iKSxuPWE/bmV3IERhdGUoIjIwMDAvMDEvMDEgIithLnJlcGxhY2UodC5yZWdleC5kYXRlUmVwbGFjZSwiJDEgJDIiKSk6YTtyZXR1cm4gbiBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKG4pPyhyPXMgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShzKT9zLmdldFRpbWUoKTowLHI/cGFyc2VGbG9hdChuLmdldFRpbWUoKSsiLiIrcy5nZXRUaW1lKCkpOm4uZ2V0VGltZSgpKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoibWV0YWRhdGEiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHM9ci5jb25maWcsYT1zLnBhcnNlck1ldGFkYXRhTmFtZT9zLnBhcnNlck1ldGFkYXRhTmFtZToic29ydFZhbHVlIjtyZXR1cm4gZShvKS5tZXRhZGF0YSgpW2FdfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkV2lkZ2V0KHtpZDoiemVicmEiLHByaW9yaXR5OjkwLGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZz1uZXcgUmVnRXhwKHIuY3NzQ2hpbGRSb3csImkiKSxwPXIuJHRib2RpZXMuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV90YWJsZSIpLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrci5jc3NJbmZvQmxvY2srIikiKSk7Zm9yKGw9MDtsPHAubGVuZ3RoO2wrKylmb3Iobj0wLGM9KHM9cC5lcShsKS5jaGlsZHJlbigidHI6dmlzaWJsZSIpLm5vdChyLnNlbGVjdG9yUmVtb3ZlKSkubGVuZ3RoLGQ9MDtkPGM7ZCsrKWE9cy5lcShkKSxnLnRlc3QoYVswXS5jbGFzc05hbWUpfHxuKyssaT1uJTI9PTAsYS5yZW1vdmVDbGFzcyhvLnplYnJhW2k/MTowXSkuYWRkQ2xhc3Moby56ZWJyYVtpPzA6MV0pfSxyZW1vdmU6ZnVuY3Rpb24oZSxyLG8scyl7aWYoIXMpe3ZhciBhLG4saT1yLiR0Ym9kaWVzLGw9KG8uemVicmF8fFsiZXZlbiIsIm9kZCJdKS5qb2luKCIgIik7Zm9yKGE9MDthPGkubGVuZ3RoO2ErKykobj10LnByb2Nlc3NUYm9keShlLGkuZXEoYSksITApKS5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKGwpLHQucHJvY2Vzc1Rib2R5KGUsbiwhMSl9fX0pfShlKSxlLnRhYmxlc29ydGVyfSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAgICBDb3B5cmlnaHQgMjAwOC0yMDEzCiAgICAgICAgTWF0dGhpYXMgRWhtYW5uLAogICAgICAgIE1pY2hhZWwgR2VyaGFldXNlciwKICAgICAgICBDYXJzdGVuIE1pbGxlciwKICAgICAgICBCaWFuY2EgVmFsZW50aW4sCiAgICAgICAgQWxmcmVkIFdhc3Nlcm1hbm4sCiAgICAgICAgUGV0ZXIgV2lsZmFocnQKICAgIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBvciBMR1BMIFZlcnNpb24gMyBsaWNlbnNlcy4KICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLgogICAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8+LgoqLwooZnVuY3Rpb24oKXt2YXIgZSxyLG47KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG8oZSxyKXtyZXR1cm4gQy5jYWxsKGUscil9ZnVuY3Rpb24gaShlLHIpe3ZhciBuLHQsbyxpLGEsdSxjLGYscyxsLHA9ciYmci5zcGxpdCgiLyIpLGg9ay5tYXAsZD1oJiZoWyIqIl18fHt9O2lmKGUmJiIuIj09PWUuY2hhckF0KDApKWlmKHIpe2ZvcihwPXAuc2xpY2UoMCxwLmxlbmd0aC0xKSxlPXAuY29uY2F0KGUuc3BsaXQoIi8iKSksZj0wO2UubGVuZ3RoPmY7Zis9MSlpZihsPWVbZl0sIi4iPT09bCllLnNwbGljZShmLDEpLGYtPTE7ZWxzZSBpZigiLi4iPT09bCl7aWYoMT09PWYmJigiLi4iPT09ZVsyXXx8Ii4uIj09PWVbMF0pKWJyZWFrO2Y+MCYmKGUuc3BsaWNlKGYtMSwyKSxmLT0yKX1lPWUuam9pbigiLyIpfWVsc2UgMD09PWUuaW5kZXhPZigiLi8iKSYmKGU9ZS5zdWJzdHJpbmcoMikpO2lmKChwfHxkKSYmaCl7Zm9yKG49ZS5zcGxpdCgiLyIpLGY9bi5sZW5ndGg7Zj4wO2YtPTEpe2lmKHQ9bi5zbGljZSgwLGYpLmpvaW4oIi8iKSxwKWZvcihzPXAubGVuZ3RoO3M+MDtzLT0xKWlmKG89aFtwLnNsaWNlKDAscykuam9pbigiLyIpXSxvJiYobz1vW3RdKSl7aT1vLGE9ZjticmVha31pZihpKWJyZWFrOyF1JiZkJiZkW3RdJiYodT1kW3RdLGM9Zil9IWkmJnUmJihpPXUsYT1jKSxpJiYobi5zcGxpY2UoMCxhLGkpLGU9bi5qb2luKCIvIikpfXJldHVybiBlfWZ1bmN0aW9uIGEoZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaC5hcHBseSh0LHYuY2FsbChhcmd1bWVudHMsMCkuY29uY2F0KFtlLHJdKSl9fWZ1bmN0aW9uIHUoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBpKHIsZSl9fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe2JbZV09cn19ZnVuY3Rpb24gZihlKXtpZihvKG0sZSkpe3ZhciByPW1bZV07ZGVsZXRlIG1bZV0seVtlXT0hMCxwLmFwcGx5KHQscil9aWYoIW8oYixlKSYmIW8oeSxlKSl0aHJvdyBFcnJvcigiTm8gIitlKTtyZXR1cm4gYltlXX1mdW5jdGlvbiBzKGUpe3ZhciByLG49ZT9lLmluZGV4T2YoIiEiKTotMTtyZXR1cm4gbj4tMSYmKHI9ZS5zdWJzdHJpbmcoMCxuKSxlPWUuc3Vic3RyaW5nKG4rMSxlLmxlbmd0aCkpLFtyLGVdfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGsmJmsuY29uZmlnJiZrLmNvbmZpZ1tlXXx8e319fXZhciBwLGgsZCxnLGI9e30sbT17fSxrPXt9LHk9e30sQz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHY9W10uc2xpY2U7ZD1mdW5jdGlvbihlLHIpe3ZhciBuLHQ9cyhlKSxvPXRbMF07cmV0dXJuIGU9dFsxXSxvJiYobz1pKG8sciksbj1mKG8pKSxvP2U9biYmbi5ub3JtYWxpemU/bi5ub3JtYWxpemUoZSx1KHIpKTppKGUscik6KGU9aShlLHIpLHQ9cyhlKSxvPXRbMF0sZT10WzFdLG8mJihuPWYobykpKSx7ZjpvP28rIiEiK2U6ZSxuOmUscHI6byxwOm59fSxnPXtyZXF1aXJlOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUpfSxleHBvcnRzOmZ1bmN0aW9uKGUpe3ZhciByPWJbZV07cmV0dXJuIHIhPT12b2lkIDA/cjpiW2VdPXt9fSxtb2R1bGU6ZnVuY3Rpb24oZSl7cmV0dXJue2lkOmUsdXJpOiIiLGV4cG9ydHM6YltlXSxjb25maWc6bChlKX19fSxwPWZ1bmN0aW9uKGUscixuLGkpe3ZhciB1LHMsbCxwLGgsayxDPVtdO2lmKGk9aXx8ZSwiZnVuY3Rpb24iPT10eXBlb2Ygbil7Zm9yKHI9IXIubGVuZ3RoJiZuLmxlbmd0aD9bInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl06cixoPTA7ci5sZW5ndGg+aDtoKz0xKWlmKHA9ZChyW2hdLGkpLHM9cC5mLCJyZXF1aXJlIj09PXMpQ1toXT1nLnJlcXVpcmUoZSk7ZWxzZSBpZigiZXhwb3J0cyI9PT1zKUNbaF09Zy5leHBvcnRzKGUpLGs9ITA7ZWxzZSBpZigibW9kdWxlIj09PXMpdT1DW2hdPWcubW9kdWxlKGUpO2Vsc2UgaWYobyhiLHMpfHxvKG0scyl8fG8oeSxzKSlDW2hdPWYocyk7ZWxzZXtpZighcC5wKXRocm93IEVycm9yKGUrIiBtaXNzaW5nICIrcyk7cC5wLmxvYWQocC5uLGEoaSwhMCksYyhzKSx7fSksQ1toXT1iW3NdfWw9bi5hcHBseShiW2VdLEMpLGUmJih1JiZ1LmV4cG9ydHMhPT10JiZ1LmV4cG9ydHMhPT1iW2VdP2JbZV09dS5leHBvcnRzOmw9PT10JiZrfHwoYltlXT1sKSl9ZWxzZSBlJiYoYltlXT1uKX0sZT1yPWg9ZnVuY3Rpb24oZSxyLG4sbyxpKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/Z1tlXT9nW2VdKHIpOmYoZChlLHIpLmYpOihlLnNwbGljZXx8KGs9ZSxyLnNwbGljZT8oZT1yLHI9bixuPW51bGwpOmU9dCkscj1yfHxmdW5jdGlvbigpe30sImZ1bmN0aW9uIj09dHlwZW9mIG4mJihuPW8sbz1pKSxvP3AodCxlLHIsbik6c2V0VGltZW91dChmdW5jdGlvbigpe3AodCxlLHIsbil9LDQpLGgpfSxoLmNvbmZpZz1mdW5jdGlvbihlKXtyZXR1cm4gaz1lLGsuZGVwcyYmaChrLmRlcHMsay5jYWxsYmFjayksaH0sbj1mdW5jdGlvbihlLHIsbil7ci5zcGxpY2V8fChuPXIscj1bXSksbyhiLGUpfHxvKG0sZSl8fChtW2VdPVtlLHIsbl0pfSxuLmFtZD17alF1ZXJ5OiEwfX0pKCksbigiLi4vbm9kZV9tb2R1bGVzL2FsbW9uZC9hbG1vbmQiLGZ1bmN0aW9uKCl7fSksbigianhnIixbXSxmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiJvYmplY3QiIT10eXBlb2YgSlhHfHxKWEcuZXh0ZW5kfHwoZT1KWEcpLGUuZXh0ZW5kPWZ1bmN0aW9uKGUscixuLHQpe3ZhciBvLGk7bj1ufHwhMSx0PXR8fCExO2ZvcihvIGluIHIpKCFufHxuJiZyLmhhc093blByb3BlcnR5KG8pKSYmKGk9dD9vLnRvTG93ZXJDYXNlKCk6byxlW2ldPXJbb10pfSxlLmV4dGVuZChlLHtib2FyZHM6e30scmVhZGVyczp7fSxlbGVtZW50czp7fSxyZWdpc3RlckVsZW1lbnQ6ZnVuY3Rpb24oZSxyKXtlPWUudG9Mb3dlckNhc2UoKSx0aGlzLmVsZW1lbnRzW2VdPXJ9LHJlZ2lzdGVyUmVhZGVyOmZ1bmN0aW9uKGUscil7dmFyIG4sdDtmb3Iobj0wO3IubGVuZ3RoPm47bisrKXQ9cltuXS50b0xvd2VyQ2FzZSgpLCJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLnJlYWRlcnNbdF0mJih0aGlzLnJlYWRlcnNbdF09ZSl9LHNob3J0Y3V0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbcl0uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sZ2V0UmVmOmZ1bmN0aW9uKGUscil7cmV0dXJuIGUuc2VsZWN0KHIpfSxnZXRSZWZlcmVuY2U6ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZS5zZWxlY3Qocil9LGRlYnVnSW50OmZ1bmN0aW9uKCl7dmFyIGUscjtmb3IoZT0wO2FyZ3VtZW50cy5sZW5ndGg+ZTtlKyspcj1hcmd1bWVudHNbZV0sIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZz9jb25zb2xlLmxvZyhyKToib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVidWciKSYmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZWJ1ZyIpLmlubmVySFRNTCs9cisiPGJyLz4iKX0sZGVidWdXU1Q6ZnVuY3Rpb24oKXt2YXIgcj1FcnJvcigpO2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJnIuc3RhY2smJihlLmRlYnVnSW50KCJzdGFja3RyYWNlIiksZS5kZWJ1Z0ludChyLnN0YWNrLnNwbGl0KCJcbiIpLnNsaWNlKDEpLmpvaW4oIlxuIikpKX0sZGVidWdMaW5lOmZ1bmN0aW9uKCl7dmFyIHI9RXJyb3IoKTtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZyLnN0YWNrJiZlLmRlYnVnSW50KCJDYWxsZWQgZnJvbSIsci5zdGFjay5zcGxpdCgiXG4iKS5zbGljZSgyLDMpLmpvaW4oIlxuIikpfSxkZWJ1ZzpmdW5jdGlvbigpe2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pLGV9KSxuKCJ1dGlscy96aXAiLFsianhnIl0sZnVuY3Rpb24oZSl7dmFyIHI9WzAsMTI4LDY0LDE5MiwzMiwxNjAsOTYsMjI0LDE2LDE0NCw4MCwyMDgsNDgsMTc2LDExMiwyNDAsOCwxMzYsNzIsMjAwLDQwLDE2OCwxMDQsMjMyLDI0LDE1Miw4OCwyMTYsNTYsMTg0LDEyMCwyNDgsNCwxMzIsNjgsMTk2LDM2LDE2NCwxMDAsMjI4LDIwLDE0OCw4NCwyMTIsNTIsMTgwLDExNiwyNDQsMTIsMTQwLDc2LDIwNCw0NCwxNzIsMTA4LDIzNiwyOCwxNTYsOTIsMjIwLDYwLDE4OCwxMjQsMjUyLDIsMTMwLDY2LDE5NCwzNCwxNjIsOTgsMjI2LDE4LDE0Niw4MiwyMTAsNTAsMTc4LDExNCwyNDIsMTAsMTM4LDc0LDIwMiw0MiwxNzAsMTA2LDIzNCwyNiwxNTQsOTAsMjE4LDU4LDE4NiwxMjIsMjUwLDYsMTM0LDcwLDE5OCwzOCwxNjYsMTAyLDIzMCwyMiwxNTAsODYsMjE0LDU0LDE4MiwxMTgsMjQ2LDE0LDE0Miw3OCwyMDYsNDYsMTc0LDExMCwyMzgsMzAsMTU4LDk0LDIyMiw2MiwxOTAsMTI2LDI1NCwxLDEyOSw2NSwxOTMsMzMsMTYxLDk3LDIyNSwxNywxNDUsODEsMjA5LDQ5LDE3NywxMTMsMjQxLDksMTM3LDczLDIwMSw0MSwxNjksMTA1LDIzMywyNSwxNTMsODksMjE3LDU3LDE4NSwxMjEsMjQ5LDUsMTMzLDY5LDE5NywzNywxNjUsMTAxLDIyOSwyMSwxNDksODUsMjEzLDUzLDE4MSwxMTcsMjQ1LDEzLDE0MSw3NywyMDUsNDUsMTczLDEwOSwyMzcsMjksMTU3LDkzLDIyMSw2MSwxODksMTI1LDI1MywzLDEzMSw2NywxOTUsMzUsMTYzLDk5LDIyNywxOSwxNDcsODMsMjExLDUxLDE3OSwxMTUsMjQzLDExLDEzOSw3NSwyMDMsNDMsMTcxLDEwNywyMzUsMjcsMTU1LDkxLDIxOSw1OSwxODcsMTIzLDI1MSw3LDEzNSw3MSwxOTksMzksMTY3LDEwMywyMzEsMjMsMTUxLDg3LDIxNSw1NSwxODMsMTE5LDI0NywxNSwxNDMsNzksMjA3LDQ3LDE3NSwxMTEsMjM5LDMxLDE1OSw5NSwyMjMsNjMsMTkxLDEyNywyNTVdLG49WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSx0PVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsOTksOTldLG89WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3N10saT1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sYT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sdT0yNTY7cmV0dXJuIGUuVXRpbD1lLlV0aWx8fHt9LGUuVXRpbC5VbnppcD1mdW5jdGlvbihjKXtmdW5jdGlvbiBmKCl7cmV0dXJuIFIrPTgsTz5YP2NbWCsrXTotMX1mdW5jdGlvbiBzKCl7Qj0xfWZ1bmN0aW9uIGwoKXt2YXIgZTt0cnl7cmV0dXJuIFIrKyxlPTEmQixCPj49MSwwPT09QiYmKEI9ZigpLGU9MSZCLEI9MTI4fEI+PjEpLGV9Y2F0Y2gocil7dGhyb3cgcn19ZnVuY3Rpb24gcChlKXt2YXIgbj0wLHQ9ZTt0cnl7Zm9yKDt0LS07KW49bjw8MXxsKCk7ZSYmKG49cltuXT4+OC1lKX1jYXRjaChvKXt0aHJvdyBvfXJldHVybiBufWZ1bmN0aW9uIGgoKXtKPTB9ZnVuY3Rpb24gZChlKXtqKyssR1tKKytdPWUsei5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpLDMyNzY4PT09SiYmKEo9MCl9ZnVuY3Rpb24gZygpe3RoaXMuYjA9MCx0aGlzLmIxPTAsdGhpcy5qdW1wPW51bGwsdGhpcy5qdW1wcG9zPS0xfWZ1bmN0aW9uIGIoKXtmb3IoOzspe2lmKE1bSF0+PXgpcmV0dXJuLTE7aWYoVVtNW0hdXT09PUgpcmV0dXJuIE1bSF0rKztNW0hdKyt9fWZ1bmN0aW9uIG0oKXt2YXIgZSxyPVBbRl07aWYoMTc9PT1IKXJldHVybi0xO2lmKEYrKyxIKyssZT1iKCksZT49MClyLmIwPWU7ZWxzZSBpZihyLmIwPTMyNzY4LG0oKSlyZXR1cm4tMTtpZihlPWIoKSxlPj0wKXIuYjE9ZSxyLmp1bXA9bnVsbDtlbHNlIGlmKHIuYjE9MzI3Njgsci5qdW1wPVBbRl0sci5qdW1wcG9zPUYsbSgpKXJldHVybi0xO3JldHVybiBILS0sMH1mdW5jdGlvbiBrKGUscixuKXt2YXIgdDtmb3IoUD1lLEY9MCxVPW4seD1yLHQ9MDsxNz50O3QrKylNW3RdPTA7cmV0dXJuIEg9MCxtKCk/LTE6MH1mdW5jdGlvbiB5KGUpe2Zvcih2YXIgcixuLHQsbz0wLGk9ZVtvXTs7KWlmKHQ9bCgpKXtpZighKDMyNzY4JmkuYjEpKXJldHVybiBpLmIxO2ZvcihpPWkuanVtcCxyPWUubGVuZ3RoLG49MDtyPm47bisrKWlmKGVbbl09PT1pKXtvPW47YnJlYWt9fWVsc2V7aWYoISgzMjc2OCZpLmIwKSlyZXR1cm4gaS5iMDtvKyssaT1lW29dfX1mdW5jdGlvbiBDKCl7dmFyIHUsYyxiLG0sQyx2LEEsaix3LFUseCxTLHosSSxFLEwsTztkbyBpZih1PWwoKSxiPXAoMiksMD09PWIpZm9yKHMoKSxVPWYoKSxVfD1mKCk8PDgsUz1mKCksU3w9ZigpPDw4LDY1NTM1JihVXn5TKSYmZS5kZWJ1ZygiQmxvY2tMZW4gY2hlY2tzdW0gbWlzbWF0Y2hcbiIpO1UtLTspYz1mKCksZChjKTtlbHNlIGlmKDE9PT1iKWZvcig7OylpZihDPXJbcCg3KV0+PjEsQz4yMz8oQz1DPDwxfGwoKSxDPjE5OT8oQy09MTI4LEM9Qzw8MXxsKCkpOihDLT00OCxDPjE0MyYmKEMrPTEzNikpKTpDKz0yNTYsMjU2PkMpZChDKTtlbHNle2lmKDI1Nj09PUMpYnJlYWs7Zm9yKEMtPTI1Nyx3PXAodFtDXSkrbltDXSxDPXJbcCg1KV0+PjMsaVtDXT44Pyh4PXAoOCkseHw9cChpW0NdLTgpPDw4KTp4PXAoaVtDXSkseCs9b1tDXSxDPTA7dz5DO0MrKyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgaWYoMj09PWIpe2ZvcihBPUFycmF5KDMyMCksST0yNTcrcCg1KSxFPTErcCg1KSxMPTQrcCg0KSxDPTA7MTk+QztDKyspQVtDXT0wO2ZvcihDPTA7TD5DO0MrKylBW2FbQ11dPXAoMyk7Zm9yKHc9cS5sZW5ndGgsbT0wO3c+bTttKyspcVttXT1uZXcgZztpZihrKHEsMTksQSwwKSlyZXR1cm4gaCgpLDE7Zm9yKHo9SStFLG09MCxPPS0xO3o+bTspaWYoTysrLEM9eShxKSwxNj5DKUFbbSsrXT1DO2Vsc2UgaWYoMTY9PT1DKXtpZihDPTMrcCgyKSxtK0M+eilyZXR1cm4gaCgpLDE7Zm9yKHY9bT9BW20tMV06MDtDLS07KUFbbSsrXT12fWVsc2V7aWYoQz0xNz09PUM/MytwKDMpOjExK3AoNyksbStDPnopcmV0dXJuIGgoKSwxO2Zvcig7Qy0tOylBW20rK109MH1mb3Iodz1ULmxlbmd0aCxtPTA7dz5tO20rKylUW21dPW5ldyBnO2lmKGsoVCxJLEEsMCkpcmV0dXJuIGgoKSwxO2Zvcih3PVQubGVuZ3RoLG09MDt3Pm07bSsrKXFbbV09bmV3IGc7Zm9yKGo9W10sbT1JO0EubGVuZ3RoPm07bSsrKWpbbS1JXT1BW21dO2lmKGsocSxFLGosMCkpcmV0dXJuIGgoKSwxO2Zvcig7OylpZihDPXkoVCksQz49MjU2KXtpZihDLT0yNTYsMD09PUMpYnJlYWs7Zm9yKEMtPTEsdz1wKHRbQ10pK25bQ10sQz15KHEpLGlbQ10+OD8oeD1wKDgpLHh8PXAoaVtDXS04KTw8OCk6eD1wKGlbQ10pLHgrPW9bQ107dy0tOyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgZChDKX13aGlsZSghdSk7cmV0dXJuIGgoKSxzKCksMH1mdW5jdGlvbiB2KCl7dmFyIGUscixuLHQsbyxpLGEsYyxzPVtdO3RyeXtpZih6PVtdLEw9ITEsc1swXT1mKCksc1sxXT1mKCksMTIwPT09c1swXSYmMjE4PT09c1sxXSYmKEMoKSxFW0ldPVt6LmpvaW4oIiIpLCJnZW9uZXh0Lmd4dCJdLEkrKyksMzE9PT1zWzBdJiYxMzk9PT1zWzFdJiYoUygpLEVbSV09W3ouam9pbigiIiksImZpbGUiXSxJKyspLDgwPT09c1swXSYmNzU9PT1zWzFdJiYoTD0hMCxzWzJdPWYoKSxzWzNdPWYoKSwzPT09c1syXSYmND09PXNbM10pKXtmb3Ioc1swXT1mKCksc1sxXT1mKCksQT1mKCksQXw9ZigpPDw4LGM9ZigpLGN8PWYoKTw8OCxmKCksZigpLGYoKSxmKCksYT1mKCksYXw9ZigpPDw4LGF8PWYoKTw8MTYsYXw9ZigpPDwyNCxpPWYoKSxpfD1mKCk8PDgsaXw9ZigpPDwxNixpfD1mKCk8PDI0LG89ZigpLG98PWYoKTw8OCxvfD1mKCk8PDE2LG98PWYoKTw8MjQsdD1mKCksdHw9ZigpPDw4LG49ZigpLG58PWYoKTw8OCxlPTAsTj1bXTt0LS07KXI9ZigpLCIvIj09PXJ8IjoiPT09cj9lPTA6dS0xPmUmJihOW2UrK109U3RyaW5nLmZyb21DaGFyQ29kZShyKSk7Zm9yKHd8fCh3PU4pLGU9MDtuPmU7KXI9ZigpLGUrKztqPTAsOD09PWMmJihDKCksRVtJXT1BcnJheSgyKSxFW0ldWzBdPXouam9pbigiIiksRVtJXVsxXT1OLmpvaW4oIiIpLEkrKyksUygpfX1jYXRjaChsKXt0aHJvdyBsfX12YXIgQSxqLHcsVSx4LFMsej1bXSxJPTAsRT1bXSxHPUFycmF5KDMyNzY4KSxKPTAsTD0hMSxPPWMubGVuZ3RoLFg9MCxCPTEsUj0wLFQ9QXJyYXkoMjg4KSxxPUFycmF5KDMyKSxGPTAsUD1udWxsLEg9KEFycmF5KDY0KSxBcnJheSg2NCksMCksTT1BcnJheSgxNyksTj1bXTtNWzBdPTAsUz1mdW5jdGlvbigpe3ZhciBlLHIsbix0LG8saSxhPVtdO2lmKDgmQSYmKGFbMF09ZigpLGFbMV09ZigpLGFbMl09ZigpLGFbM109ZigpLDgwPT09YVswXSYmNzU9PT1hWzFdJiY3PT09YVsyXSYmOD09PWFbM10/KGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQpOmU9YVswXXxhWzFdPDw4fGFbMl08PDE2fGFbM108PDI0LHI9ZigpLHJ8PWYoKTw8OCxyfD1mKCk8PDE2LHJ8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCksTCYmdigpLGFbMF09ZigpLDg9PT1hWzBdKXtpZihBPWYoKSxmKCksZigpLGYoKSxmKCksZigpLHQ9ZigpLDQmQSlmb3IoYVswXT1mKCksYVsyXT1mKCksSD1hWzBdKzI1NiphWzFdLG89MDtIPm87bysrKWYoKTtpZig4JkEpZm9yKG89MCxOPVtdLGk9ZigpO2k7KSgiNyI9PT1pfHwiOiI9PT1pKSYmKG89MCksdS0xPm8mJihOW28rK109aSksaT1mKCk7aWYoMTYmQSlmb3IoaT1mKCk7aTspaT1mKCk7MiZBJiYoZigpLGYoKSksQygpLGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCxMJiZ2KCl9fSxlLlV0aWwuVW56aXAucHJvdG90eXBlLnVuemlwRmlsZT1mdW5jdGlvbihlKXt2YXIgcjtmb3IodGhpcy51bnppcCgpLHI9MDtFLmxlbmd0aD5yO3IrKylpZihFW3JdWzFdPT09ZSlyZXR1cm4gRVtyXVswXTtyZXR1cm4iIn0sZS5VdGlsLlVuemlwLnByb3RvdHlwZS51bnppcD1mdW5jdGlvbigpe3JldHVybiB2KCksRX19LGUuVXRpbH0pLG4oInV0aWxzL2VuY29kaW5nIixbImp4ZyJdLGZ1bmN0aW9uKGUpe3ZhciByPTAsbj1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsOCw4LDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEwLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDQsMywzLDExLDYsNiw2LDUsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDAsMTIsMjQsMzYsNjAsOTYsODQsMTIsMTIsMTIsNDgsNzIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMCwxMiwxMiwxMiwxMiwxMiwwLDEyLDAsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTJdO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuVVRGOD17ZW5jb2RlOmZ1bmN0aW9uKGUpe3ZhciByLG4sdD0iIixvPWUubGVuZ3RoO2lmKGU9ZS5yZXBsYWNlKC9cclxuL2csIlxuIiksImZ1bmN0aW9uIj09dHlwZW9mIHVuZXNjYXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZW5jb2RlVVJJQ29tcG9uZW50KXJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpO2ZvcihyPTA7bz5yO3IrKyluPWUuY2hhckNvZGVBdChyKSwxMjg+bj90Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKG4pOm4+MTI3JiYyMDQ4Pm4/KHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTkyfG4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKToodCs9U3RyaW5nLmZyb21DaGFyQ29kZSgyMjR8bj4+MTIpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKTtyZXR1cm4gdH0sZGVjb2RlOmZ1bmN0aW9uKGUpe3ZhciB0LG8saSxhPTAsdT0wLGM9cixmPVtdLHM9ZS5sZW5ndGgsbD1bXTtmb3IodD0wO3M+dDt0Kyspbz1lLmNoYXJDb2RlQXQodCksaT1uW29dLHU9YyE9PXI/NjMmb3x1PDw2OjI1NT4+aSZvLGM9blsyNTYrYytpXSxjPT09ciYmKHU+NjU1MzU/Zi5wdXNoKDU1MjMyKyh1Pj4xMCksNTYzMjArKDEwMjMmdSkpOmYucHVzaCh1KSxhKyssMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSksZj1bXSkpO3JldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGYpKSxsLmpvaW4oIiIpfSxhc2NpaUNoYXJDb2RlQXQ6ZnVuY3Rpb24oZSxyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7aWYobj4yNTUpc3dpdGNoKG4pe2Nhc2UgODM2NDpuPTEyODticmVhaztjYXNlIDgyMTg6bj0xMzA7YnJlYWs7Y2FzZSA0MDI6bj0xMzE7YnJlYWs7Y2FzZSA4MjIyOm49MTMyO2JyZWFrO2Nhc2UgODIzMDpuPTEzMzticmVhaztjYXNlIDgyMjQ6bj0xMzQ7YnJlYWs7Y2FzZSA4MjI1Om49MTM1O2JyZWFrO2Nhc2UgNzEwOm49MTM2O2JyZWFrO2Nhc2UgODI0MDpuPTEzNzticmVhaztjYXNlIDM1MjpuPTEzODticmVhaztjYXNlIDgyNDk6bj0xMzk7YnJlYWs7Y2FzZSAzMzg6bj0xNDA7YnJlYWs7Y2FzZSAzODE6bj0xNDI7YnJlYWs7Y2FzZSA4MjE2Om49MTQ1O2JyZWFrO2Nhc2UgODIxNzpuPTE0NjticmVhaztjYXNlIDgyMjA6bj0xNDc7YnJlYWs7Y2FzZSA4MjIxOm49MTQ4O2JyZWFrO2Nhc2UgODIyNjpuPTE0OTticmVhaztjYXNlIDgyMTE6bj0xNTA7YnJlYWs7Y2FzZSA4MjEyOm49MTUxO2JyZWFrO2Nhc2UgNzMyOm49MTUyO2JyZWFrO2Nhc2UgODQ4MjpuPTE1MzticmVhaztjYXNlIDM1MzpuPTE1NDticmVhaztjYXNlIDgyNTA6bj0xNTU7YnJlYWs7Y2FzZSAzMzk6bj0xNTY7YnJlYWs7Y2FzZSAzODI6bj0xNTg7YnJlYWs7Y2FzZSAzNzY6bj0xNTk7YnJlYWs7ZGVmYXVsdDp9cmV0dXJuIG59fSxlLlV0aWwuVVRGOH0pLG4oInV0aWxzL2Jhc2U2NCIsWyJqeGciLCJ1dGlscy9lbmNvZGluZyJdLGZ1bmN0aW9uKGUscil7ZnVuY3Rpb24gbihlLHIpe3JldHVybiAyNTUmZS5jaGFyQ29kZUF0KHIpfWZ1bmN0aW9uIHQoZSxyKXt2YXIgbj1vLmluZGV4T2YoZS5jaGFyQXQocikpO2lmKC0xPT09bil0aHJvdyBFcnJvcigiSlNYR3JhcGgvdXRpbHMvYmFzZTY0OiBDYW4ndCBkZWNvZGUgc3RyaW5nIChpbnZhbGlkIGNoYXJhY3RlcikuIik7cmV0dXJuIG59dmFyIG89IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGk9Ij0iO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuQmFzZTY0PXtlbmNvZGU6ZnVuY3Rpb24oZSl7dmFyIHQsYSx1LGMsZixzPVtdO2ZvcihmPXIuZW5jb2RlKGUpLHU9Zi5sZW5ndGgsYz11JTMsdD0wO3UtYz50O3QrPTMpYT1uKGYsdCk8PDE2fG4oZix0KzEpPDw4fG4oZix0KzIpLHMucHVzaChvLmNoYXJBdChhPj4xOCksby5jaGFyQXQoNjMmYT4+MTIpLG8uY2hhckF0KDYzJmE+PjYpLG8uY2hhckF0KDYzJmEpKTtzd2l0Y2goYyl7Y2FzZSAxOmE9bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjIpLG8uY2hhckF0KDYzJmE8PDQpLGksaSk7YnJlYWs7Y2FzZSAyOmE9bihmLHUtMik8PDh8bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjEwKSxvLmNoYXJBdCg2MyZhPj40KSxvLmNoYXJBdCg2MyZhPDwyKSxpKX1yZXR1cm4gcy5qb2luKCIiKX0sZGVjb2RlOmZ1bmN0aW9uKGUsbil7dmFyIG8sYSx1LGMsZixzLGw9W10scD1bXTtpZihvPWUucmVwbGFjZSgvW15BLVphLXowLTlcK1wvPV0vZywiIiksdT1vLmxlbmd0aCwwIT09dSU0KXRocm93IEVycm9yKCJKU1hHcmFwaC91dGlscy9iYXNlNjQ6IENhbid0IGRlY29kZSBzdHJpbmcgKGludmFsaWQgaW5wdXQgbGVuZ3RoKS4iKTtmb3Ioby5jaGFyQXQodS0xKT09PWkmJihjPTEsby5jaGFyQXQodS0yKT09PWkmJihjPTIpLHUtPTQpLGE9MDt1PmE7YSs9NClmPXQobyxhKTw8MTh8dChvLGErMSk8PDEyfHQobyxhKzIpPDw2fHQobyxhKzMpLHAucHVzaChmPj4xNiwyNTUmZj4+OCwyNTUmZiksMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxwKSkscD1bXSk7c3dpdGNoKGMpe2Nhc2UgMTpmPXQobyx1KTw8MTJ8dChvLHUrMSk8PDZ8dChvLHUrMikscC5wdXNoKGY+PjEwLDI1NSZmPj4yKTticmVhaztjYXNlIDI6Zj10KG8sYSk8PDZ8dChvLGErMSkscC5wdXNoKGY+PjQpfXJldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHApKSxzPWwuam9pbigiIiksbiYmKHM9ci5kZWNvZGUocykpLHN9LGRlY29kZUFzQXJyYXk6ZnVuY3Rpb24oZSl7dmFyIHIsbj10aGlzLmRlY29kZShlKSx0PVtdLG89bi5sZW5ndGg7Zm9yKHI9MDtvPnI7cisrKXRbcl09bi5jaGFyQ29kZUF0KHIpO3JldHVybiB0fX0sZS5VdGlsLkJhc2U2NH0pLG4oIi4uL2J1aWxkL2NvbXByZXNzb3IuZGVwcy5qcyIsWyJqeGciLCJ1dGlscy96aXAiLCJ1dGlscy9iYXNlNjQiXSxmdW5jdGlvbihlLHIsbil7cmV0dXJuIGUuZGVjb21wcmVzcz1mdW5jdGlvbihlKXtyZXR1cm4gdW5lc2NhcGUobmV3IHIuVW56aXAobi5kZWNvZGVBc0FycmF5KGUpKS51bnppcCgpWzBdWzBdKX0sZX0pLHdpbmRvdy5KWEc9cigiLi4vYnVpbGQvY29tcHJlc3Nvci5kZXBzLmpzIil9KSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuZmlsZUxvYWRpbmcgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIGZpbGVMb2FkaW5nQ2FsbGJhY2tzID0ge307CiAgICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICBmdW5jdGlvbiBsb2FkS2V5d29yZHNGaWxlKGZpbGVuYW1lLCBjYWxsYmFjaykgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSA9IGNhbGxiYWNrOwogICAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOwogICAgICAgIC8vIHRpbWVzdGFtcCBhcyBhbiBhcmd1bWVudCB0byBwcmV2ZW50IGJyb3dzZXJzIGZyb20gY2FjaGluZyBzY3JpcHRzCiAgICAgICAgLy8gc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg2NjYxOS9ob3ctdG8tZm9yY2UtaWUtdG8tcmVsb2FkLWphdmFzY3JpcHQKICAgICAgICBzY3JpcHQuc3JjID0gZmlsZW5hbWUrJz90aW1lPScrdGltZXN0YW1wOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHBhcmVudCkgewogICAgICAgIHZhciBjYWxsYWJsZUxpc3QgPSBbXTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxhYmxlKSB7CiAgICAgICAgICAgIGlmICghcGFyZW50LmlzQ2hpbGRyZW5Mb2FkZWQpIHsKICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdC5wdXNoKGNhbGxhYmxlKTsKICAgICAgICAgICAgICAgIGlmIChjYWxsYWJsZUxpc3QubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBsb2FkS2V5d29yZHNGaWxlKHBhcmVudC5jaGlsZEZpbGVOYW1lLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYWJsZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdFtpXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbm90aWZ5RmlsZUxvYWRlZChmaWxlbmFtZSkgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSgpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXRDYWxsYmFja0hhbmRsZXJGb3JLZXl3b3JkczogZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHMsCiAgICAgICAgbm90aWZ5OiBub3RpZnlGaWxlTG9hZGVkCiAgICB9Cn0oKSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5tb2RlbCA9IChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBTdWl0ZShkYXRhKSB7CiAgICAgICAgdmFyIHN1aXRlID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAgc3VpdGUuc291cmNlID0gZGF0YS5zb3VyY2U7CiAgICAgICAgc3VpdGUucmVsYXRpdmVTb3VyY2UgPSBkYXRhLnJlbGF0aXZlU291cmNlOwogICAgICAgIHN1aXRlLmZ1bGxOYW1lID0gZGF0YS5wYXJlbnQgPyBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIGRhdGEubmFtZSA6IGRhdGEubmFtZTsKICAgICAgICBzZXRTdGF0cyhzdWl0ZSwgZGF0YS5zdGF0aXN0aWNzKTsKICAgICAgICBzdWl0ZS5tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGE7CiAgICAgICAgc3VpdGUucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdUZXN0Jyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVTdWl0ZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignU3VpdGUnKTsKICAgICAgICBzdWl0ZS5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXTsKICAgICAgICBzdWl0ZS5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSBmdW5jdGlvbiAoY2FsbGFibGUpIHsgY2FsbGFibGUoKTsgfTsKICAgICAgICBzdWl0ZS5tZXNzYWdlID0gZGF0YS5tZXNzYWdlOwogICAgICAgIHN1aXRlLmNoaWxkcmVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc3VpdGUua2V5d29yZHMoKS5jb25jYXQoc3VpdGUudGVzdHMoKSkuY29uY2F0KHN1aXRlLnN1aXRlcygpKTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLnNlYXJjaFRlc3RzID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkgewogICAgICAgICAgICB2YXIgdGVzdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHN1aXRlcyA9IHRoaXMuc3VpdGVzKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc3VpdGVzKQogICAgICAgICAgICAgICAgdGVzdHMgPSB0ZXN0cy5jb25jYXQoc3VpdGVzW2ldLnNlYXJjaFRlc3RzKHByZWRpY2F0ZSkpOwogICAgICAgICAgICByZXR1cm4gdGVzdHMuY29uY2F0KHV0aWwuZmlsdGVyKHRoaXMudGVzdHMoKSwgcHJlZGljYXRlKSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5zZWFyY2hUZXN0c0luU3VpdGUgPSBmdW5jdGlvbiAocGF0dGVybiwgbWF0Y2hlcikgewogICAgICAgICAgICBpZiAoIW1hdGNoZXIpCiAgICAgICAgICAgICAgICBtYXRjaGVyID0gdXRpbC5NYXRjaGVyKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzQW55KFtzdWl0ZS5mdWxsTmFtZSwgc3VpdGUubmFtZV0pKQogICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlLmFsbFRlc3RzKCk7CiAgICAgICAgICAgIHZhciB0ZXN0cyA9IFtdOwogICAgICAgICAgICB2YXIgc3VpdGVzID0gdGhpcy5zdWl0ZXMoKTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzdWl0ZXMpCiAgICAgICAgICAgICAgICB0ZXN0cyA9IHRlc3RzLmNvbmNhdChzdWl0ZXNbaV0uc2VhcmNoVGVzdHNJblN1aXRlKHBhdHRlcm4sIG1hdGNoZXIpKTsKICAgICAgICAgICAgcmV0dXJuIHRlc3RzOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuc2VhcmNoVGVzdHNCeVRhZyA9IGZ1bmN0aW9uICh0YWcpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICBpZiAodGFnLmluZm8gPT0gImNyaXRpY2FsIiB8fCB0YWcuaW5mbyA9PSAibm9uLWNyaXRpY2FsIikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3QudGFncywgdGFnLmxhYmVsKTsKICAgICAgICAgICAgICAgIGlmICh0YWcuY29tYmluZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnUGF0dGVybih0ZXN0LnRhZ3MsIHRhZy5jb21iaW5lZCk7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWcodGVzdC50YWdzLCB0YWcubGFiZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLmZpbmRTdWl0ZUJ5TmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuYWxsVGVzdHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBzdWl0ZS5zZWFyY2hUZXN0cyhmdW5jdGlvbiAodGVzdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuY3JpdGljYWxUZXN0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5pc0NyaXRpY2FsOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRhaW5zVGFnKHRlc3RUYWdzLCB0YWduYW1lKSB7CiAgICAgICAgdGVzdFRhZ3MgPSB1dGlsLm1hcCh0ZXN0VGFncywgdXRpbC5ub3JtYWxpemUpOwogICAgICAgIHJldHVybiB1dGlsLmNvbnRhaW5zKHRlc3RUYWdzLCB1dGlsLm5vcm1hbGl6ZSh0YWduYW1lKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHBhdHRlcm4pIHsKICAgICAgICB2YXIgcGF0dGVybnM7CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignTk9UJykgIT0gLTEpIHsKICAgICAgICAgICAgcGF0dGVybnMgPSBwYXR0ZXJuLnNwbGl0KCdOT1QnKTsKICAgICAgICAgICAgaWYgKCF1dGlsLm5vcm1hbGl6ZShwYXR0ZXJuc1swXSkpCiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5hbGwodXRpbC5tYXAocGF0dGVybnMuc2xpY2UoMSksIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwYXR0ZXJuc1swXSkgJiYKICAgICAgICAgICAgICAgIHV0aWwuYWxsKHV0aWwubWFwKHBhdHRlcm5zLnNsaWNlKDEpLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignT1InKSAhPSAtMSkgewogICAgICAgICAgICBwYXR0ZXJucyA9IHBhdHRlcm4uc3BsaXQoJ09SJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFueSh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ0FORCcpICE9IC0xKSB7CiAgICAgICAgICAgIHBhdHRlcm5zID0gcGF0dGVybi5zcGxpdCgnQU5EJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFsbCh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1dGlsLk1hdGNoZXIocGF0dGVybikubWF0Y2hlc0FueSh0ZXN0VGFncyk7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpIHsKICAgICAgICBpZiAoc3VpdGUuZnVsbE5hbWUgPT0gbmFtZSkKICAgICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgICAgIHZhciBzdWJTdWl0ZXMgPSBzdWl0ZS5zdWl0ZXMoKTsKICAgICAgICBmb3IgKHZhciBpIGluIHN1YlN1aXRlcykgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmaW5kU3VpdGVCeU5hbWUoc3ViU3VpdGVzW2ldLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG1hdGNoKQogICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0YXRzKHN1aXRlLCBzdGF0cykgewogICAgICAgIGZvciAodmFyIG5hbWUgaW4gc3RhdHMpIHsKICAgICAgICAgICAgc3VpdGVbbmFtZV0gPSBzdGF0c1tuYW1lXTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNb2RlbE9iamVjdChkYXRhKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lLAogICAgICAgICAgICBkb2M6IGRhdGEuZG9jLAogICAgICAgICAgICBzdGF0dXM6IGRhdGEuc3RhdHVzLAogICAgICAgICAgICB0aW1lczogZGF0YS50aW1lcywKICAgICAgICAgICAgaWQ6IGRhdGEucGFyZW50ID8gZGF0YS5wYXJlbnQuaWQgKyAnLScgKyBkYXRhLmlkIDogZGF0YS5pZAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUZXN0KGRhdGEpIHsKICAgICAgICB2YXIgdGVzdCA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIHRlc3QuZnVsbE5hbWUgPSBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIHRlc3QubmFtZTsKICAgICAgICB0ZXN0LmZvcm1hdFBhcmVudE5hbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB1dGlsLmZvcm1hdFBhcmVudE5hbWUodGVzdCk7IH07CiAgICAgICAgdGVzdC50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIHRlc3QucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgdGVzdC5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJ107CiAgICAgICAgdGVzdC5pc0NoaWxkcmVuTG9hZGVkID0gZGF0YS5pc0NoaWxkcmVuTG9hZGVkOwogICAgICAgIHRlc3QuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHRlc3QpOwogICAgICAgIHRlc3QuY2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0ZXN0LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5rZXl3b3JkcygpOwogICAgICAgIH07CiAgICAgICAgdGVzdC5pc0NyaXRpY2FsID0gZGF0YS5pc0NyaXRpY2FsOwogICAgICAgIHRlc3QudGFncyA9IGRhdGEudGFnczsKICAgICAgICB0ZXN0Lm1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7CiAgICAgICAgdGVzdC5tYXRjaGVzVGFnUGF0dGVybiA9IGZ1bmN0aW9uIChwYXR0ZXJuKSB7CiAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdC50YWdzLCBwYXR0ZXJuKTsKICAgICAgICB9OwogICAgICAgIHRlc3QubWF0Y2hlc05hbWVQYXR0ZXJuID0gZnVuY3Rpb24gKHBhdHRlcm4pIHsKICAgICAgICAgICAgcmV0dXJuIHV0aWwuTWF0Y2hlcihwYXR0ZXJuKS5tYXRjaGVzQW55KFt0ZXN0Lm5hbWUsIHRlc3QuZnVsbE5hbWVdKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiB0ZXN0OwogICAgfQogICAgZnVuY3Rpb24gS2V5d29yZChkYXRhKSB7CiAgICAgICAgdmFyIGt3ID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAga3cubGlibmFtZSA9IGRhdGEubGlibmFtZTsKICAgICAgICBrdy50eXBlID0gZGF0YS50eXBlOwogICAgICAgIGt3LmFyZ3VtZW50cyA9IGRhdGEuYXJnczsKICAgICAgICBrdy5hc3NpZ24gPSBkYXRhLmFzc2lnbiArIChkYXRhLmFzc2lnbiA/ICcgPScgOiAnJyk7CiAgICAgICAga3cudGFncyA9IGRhdGEudGFnczsKICAgICAgICBrdy50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIGt3LnBvcHVsYXRlTWVzc2FnZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignTWVzc2FnZScpOwogICAgICAgIGt3LnBvcHVsYXRlS2V5d29yZHMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignS2V5d29yZCcpOwogICAgICAgIGt3LmNoaWxkcmVuTmFtZXMgPSBbJ2tleXdvcmQnLCAnbWVzc2FnZSddOwogICAgICAgIGt3LmlzQ2hpbGRyZW5Mb2FkZWQgPSBkYXRhLmlzQ2hpbGRyZW5Mb2FkZWQ7CiAgICAgICAga3cuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKGt3KTsKICAgICAgICBrdy5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGt3LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4ga3cua2V5d29yZHMoKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBrdzsKICAgIH0KICAgIGZ1bmN0aW9uIE1lc3NhZ2UobGV2ZWwsIGRhdGUsIHRleHQsIGxpbmspIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsZXZlbDogbGV2ZWwsCiAgICAgICAgICAgIHRpbWU6IHV0aWwudGltZUZyb21EYXRlKGRhdGUpLAogICAgICAgICAgICBkYXRlOiB1dGlsLmRhdGVGcm9tRGF0ZShkYXRlKSwKICAgICAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICAgICAgbGluazogbGluawogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUaW1lcyh0aW1lZGF0YSkgewogICAgICAgIHZhciBzdGFydCA9IHRpbWVkYXRhWzBdOwogICAgICAgIHZhciBlbmQgPSB0aW1lZGF0YVsxXTsKICAgICAgICB2YXIgZWxhcHNlZCA9IHRpbWVkYXRhWzJdOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGVsYXBzZWRNaWxsaXM6IGVsYXBzZWQsCiAgICAgICAgICAgIGVsYXBzZWRUaW1lOiB1dGlsLmZvcm1hdEVsYXBzZWQoZWxhcHNlZCksCiAgICAgICAgICAgIHN0YXJ0VGltZTogdXRpbC5kYXRlVGltZUZyb21EYXRlKHN0YXJ0KSwKICAgICAgICAgICAgZW5kVGltZTogIHV0aWwuZGF0ZVRpbWVGcm9tRGF0ZShlbmQpCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKG5hbWUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHBvcHVsYXRvcikgewogICAgICAgICAgICBwb3B1bGF0ZUl0ZXJhYmxlKHRoaXMsIG5hbWUsIHBvcHVsYXRvcik7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvcHVsYXRlSXRlcmFibGUob2JqLCBuYW1lLCBwb3B1bGF0b3IpIHsKICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpICsgJ3MnOwogICAgICAgIG9ialtuYW1lXSA9IGNyZWF0ZUdldEFsbEZ1bmN0aW9uKHBvcHVsYXRvci5udW1iZXJPZkl0ZW1zLCBwb3B1bGF0b3IuY3JlYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZXRBbGxGdW5jdGlvbihudW1iZXJPZkVsZW1lbnRzLCBjcmVhdG9yKSB7CiAgICAgICAgdmFyIGNhY2hlZCA9IG51bGw7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGNhY2hlZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FjaGVkID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bWJlck9mRWxlbWVudHMoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVkLnB1c2goY3JlYXRvcihpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBTdWl0ZTogU3VpdGUsCiAgICAgICAgVGVzdDogVGVzdCwKICAgICAgICBLZXl3b3JkOiBLZXl3b3JkLAogICAgICAgIE1lc3NhZ2U6IE1lc3NhZ2UsCiAgICAgICAgVGltZXM6IFRpbWVzLAogICAgICAgIGNvbnRhaW5zVGFnOiBjb250YWluc1RhZywgIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICAgICAgY29udGFpbnNUYWdQYXR0ZXJuOiBjb250YWluc1RhZ1BhdHRlcm4gIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICB9Owp9KCkpOwp3aW5kb3cuc3RhdHMgPSAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gU3RhdGlzdGljcyh0b3RhbEVsZW1zLCB0YWdFbGVtcywgc3VpdGVFbGVtcykgewogICAgICAgIHJldHVybiB7dG90YWw6IHV0aWwubWFwKHRvdGFsRWxlbXMsIHRvdGFsU3RhdEVsZW0pLAogICAgICAgICAgICAgICAgdGFnOiAgIHV0aWwubWFwKHRhZ0VsZW1zLCB0YWdTdGF0RWxlbSksCiAgICAgICAgICAgICAgICBzdWl0ZTogdXRpbC5tYXAoc3VpdGVFbGVtcywgc3VpdGVTdGF0RWxlbSl9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdEVsZW0oc3RhdCkgewogICAgICAgIHN0YXQudG90YWwgPSBzdGF0LnBhc3MgKyBzdGF0LmZhaWw7CiAgICAgICAgdmFyIHBlcmNlbnRzID0gY2FsY3VsYXRlUGVyY2VudHMoc3RhdC50b3RhbCwgc3RhdC5wYXNzLCBzdGF0LmZhaWwpOwogICAgICAgIHN0YXQucGFzc1BlcmNlbnQgPSBwZXJjZW50c1swXTsKICAgICAgICBzdGF0LmZhaWxQZXJjZW50ID0gcGVyY2VudHNbMV07CiAgICAgICAgdmFyIHdpZHRocyA9IGNhbGN1bGF0ZVdpZHRocyhzdGF0LnBhc3NQZXJjZW50LCBzdGF0LmZhaWxQZXJjZW50KTsKICAgICAgICBzdGF0LnBhc3NXaWR0aCA9IHdpZHRoc1swXTsKICAgICAgICBzdGF0LmZhaWxXaWR0aCA9IHdpZHRoc1sxXTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHRvdGFsU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC50eXBlID0gc3RhdC5sYWJlbCA9PSAnQ3JpdGljYWwgVGVzdHMnID8gJ2NyaXRpY2FsJyA6ICdhbGwnOwogICAgICAgIHJldHVybiBzdGF0OwogICAgfQogICAgZnVuY3Rpb24gdGFnU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC5saW5rcyA9IHBhcnNlTGlua3Moc3RhdC5saW5rcyk7CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRFbGVtKGRhdGEpIHsKICAgICAgICB2YXIgc3RhdCA9IHN0YXRFbGVtKGRhdGEpOwogICAgICAgIHN0YXQuZnVsbE5hbWUgPSBzdGF0LmxhYmVsOwogICAgICAgIHN0YXQuZm9ybWF0UGFyZW50TmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWwuZm9ybWF0UGFyZW50TmFtZShzdGF0KTsgfTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTGlua3MobGlua3NEYXRhKSB7CiAgICAgICAgaWYgKCFsaW5rc0RhdGEpCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICByZXR1cm4gdXRpbC5tYXAobGlua3NEYXRhLnNwbGl0KCc6OjonKSwgZnVuY3Rpb24gKGxpbmspIHsKICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGxpbmsuaW5kZXhPZignOicpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt0aXRsZTogbGluay5zbGljZSgwLCBpbmRleCksIHVybDogbGluay5zbGljZShpbmRleCsxKX07CiAgICAgICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gY2FsY3VsYXRlUGVyY2VudHModG90YWwsIHBhc3NlZCwgZmFpbGVkKSB7CiAgICAgICAgaWYgKHRvdGFsID09IDApCiAgICAgICAgICAgIHJldHVybiBbMC4wLCAwLjBdOwogICAgICAgIHZhciBwYXNzID0gMTAwLjAgKiBwYXNzZWQgLyB0b3RhbDsKICAgICAgICB2YXIgZmFpbCA9IDEwMC4wICogZmFpbGVkIC8gdG90YWw7CiAgICAgICAgaWYgKHBhc3MgPiAwICYmIHBhc3MgPCAwLjEpCiAgICAgICAgICAgIHJldHVybiBbMC4xLCA5OS45XTsKICAgICAgICBpZiAoZmFpbCA+IDAgJiYgZmFpbCA8IDAuMSkKICAgICAgICAgICAgcmV0dXJuIFs5OS45LCAwLjFdOwogICAgICAgIHJldHVybiBbTWF0aC5yb3VuZChwYXNzKjEwKS8xMCwgTWF0aC5yb3VuZChmYWlsKjEwKS8xMF07CiAgICB9CiAgICBmdW5jdGlvbiBjYWxjdWxhdGVXaWR0aHMobnVtMSwgbnVtMikgewogICAgICAgIGlmIChudW0xICsgbnVtMiA9PSAwKQogICAgICAgICAgICByZXR1cm4gWzAuMCwgMC4wXTsKICAgICAgICAvLyBNYWtlIHNtYWxsIHBlcmNlbnRhZ2VzIGJldHRlciB2aXNpYmxlCiAgICAgICAgaWYgKG51bTEgPiAwICYmIG51bTEgPCAxKQogICAgICAgICAgICByZXR1cm4gWzEuMCwgOTkuMF07CiAgICAgICAgaWYgKG51bTIgPiAwICYmIG51bTIgPCAxKQogICAgICAgICAgICByZXR1cm4gWzk5LjAsIDEuMF07CiAgICAgICAgLy8gSGFuZGxlIHNpdHVhdGlvbiB3aGVyZSBib3RoIGFyZSByb3VuZGVkIHVwCiAgICAgICAgd2hpbGUgKG51bTEgKyBudW0yID4gMTAwKSB7CiAgICAgICAgICAgIGlmIChudW0xID4gbnVtMikKICAgICAgICAgICAgICAgIG51bTEgLT0gMC4xOwogICAgICAgICAgICBpZiAobnVtMiA+IG51bTEpCiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtudW0xLCBudW0yXTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgU3RhdGlzdGljczogU3RhdGlzdGljcwogICAgfTsKfSgpKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LnV0aWwgPSBmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBtYXAoZWxlbXMsIGZ1bmMpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIHJldFtpXSA9IGZ1bmMoZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gZmlsdGVyKGVsZW1zLCBwcmVkaWNhdGUpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbXNbaV0pKQogICAgICAgICAgICAgICAgcmV0LnB1c2goZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gYWxsKGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmICghZWxlbXNbaV0pCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYW55KGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChlbGVtc1tpXSkKICAgICAgICAgICAgICAgIHJldHVybiBlbGVtc1tpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gY29udGFpbnMoZWxlbXMsIGUpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgaWYgKGVsZW1zW2ldID09IGUpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gbGFzdChpdGVtcykgewogICAgICAgIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGgtMV07CiAgICB9CiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyZsdDsvZywgJzwnKS5yZXBsYWNlKC8mZ3Q7L2csICc+JykucmVwbGFjZSgvJmFtcDsvZywgJyYnKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTsKICAgIH0KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnJykucmVwbGFjZSgvXy9nLCAnJyk7CiAgICB9CiAgICBmdW5jdGlvbiByZWdleHBFc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLVtcXXt9KCkrPyouLFxcXiR8I10vZywgIlxcJCYiKTsKICAgIH0KICAgIGZ1bmN0aW9uIE1hdGNoZXIocGF0dGVybikgewogICAgICAgIHBhdHRlcm4gPSByZWdleHBFc2NhcGUobm9ybWFsaXplKHBhdHRlcm4pKTsKICAgICAgICB2YXIgcmVQYXR0ZXJuID0gJ14nICsgcGF0dGVybi5yZXBsYWNlKC9cXFw/L2csICcuJykucmVwbGFjZSgvXFxcKi9nLCAnW1xcc1xcU10qJykgKyAnJCc7CiAgICAgICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAocmVQYXR0ZXJuKTsKICAgICAgICBmdW5jdGlvbiBtYXRjaGVzKHN0cmluZykgewogICAgICAgICAgICByZXR1cm4gcmVnZXhwLnRlc3Qobm9ybWFsaXplKHN0cmluZykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBtYXRjaGVzOiBtYXRjaGVzLAogICAgICAgICAgICBtYXRjaGVzQW55OiBmdW5jdGlvbiAoc3RyaW5ncykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspCiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMoc3RyaW5nc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdFBhcmVudE5hbWUoaXRlbSkgewogICAgICAgIHZhciBwYXJlbnROYW1lID0gaXRlbS5mdWxsTmFtZS5zbGljZSgwLCBpdGVtLmZ1bGxOYW1lLmxlbmd0aCAtIGl0ZW0ubmFtZS5sZW5ndGgpOwogICAgICAgIHJldHVybiBwYXJlbnROYW1lLnJlcGxhY2UoL1wuL2csICcgLiAnKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRpbWVGcm9tRGF0ZShkYXRlKSB7CiAgICAgICAgaWYgKCFkYXRlKQogICAgICAgICAgICByZXR1cm4gJ04vQSc7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlLmdldFNlY29uZHMoKSwgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlRnJvbURhdGUoZGF0ZSkgewogICAgICAgIGlmICghZGF0ZSkKICAgICAgICAgICAgcmV0dXJuICdOL0EnOwogICAgICAgIHJldHVybiBwYWRUbyhkYXRlLmdldEZ1bGxZZWFyKCksIDQpICsKICAgICAgICAgICAgICAgcGFkVG8oZGF0ZS5nZXRNb250aCgpICsgMSwgMikgKwogICAgICAgICAgICAgICBwYWRUbyhkYXRlLmdldERhdGUoKSwgMik7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlVGltZUZyb21EYXRlKGRhdGUpIHsKICAgICAgICBpZiAoIWRhdGUpCiAgICAgICAgICAgIHJldHVybiAnTi9BJzsKICAgICAgICByZXR1cm4gZGF0ZUZyb21EYXRlKGRhdGUpICsgJyAnICsgdGltZUZyb21EYXRlKGRhdGUpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0VGltZShob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzKSB7CiAgICAgICAgcmV0dXJuIHBhZFRvKGhvdXJzLCAyKSArICc6JyArCiAgICAgICAgICAgICAgIHBhZFRvKG1pbnV0ZXMsIDIpICsgJzonICsKICAgICAgICAgICAgICAgcGFkVG8oc2Vjb25kcywgMikgKyAnLicgKwogICAgICAgICAgICAgICBwYWRUbyhtaWxsaXNlY29uZHMsIDMpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0RWxhcHNlZChlbGFwc2VkKSB7CiAgICAgICAgdmFyIG1pbGxpcyA9IGVsYXBzZWQ7CiAgICAgICAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAoNjAgKiA2MCAqIDEwMDApKTsKICAgICAgICBtaWxsaXMgLT0gaG91cnMgKiA2MCAqIDYwICogMTAwMDsKICAgICAgICB2YXIgbWludXRlcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gKDYwICogMTAwMCkpOwogICAgICAgIG1pbGxpcyAtPSBtaW51dGVzICogNjAgKiAxMDAwOwogICAgICAgIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAxMDAwKTsKICAgICAgICBtaWxsaXMgLT0gc2Vjb25kcyAqIDEwMDA7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpcyk7CiAgICB9CiAgICBmdW5jdGlvbiBwYWRUbyhudW1iZXIsIGxlbikgewogICAgICAgIHZhciBudW1TdHJpbmcgPSBudW1iZXIgKyAiIjsKICAgICAgICB3aGlsZSAobnVtU3RyaW5nLmxlbmd0aCA8IGxlbikgbnVtU3RyaW5nID0gIjAiICsgbnVtU3RyaW5nOwogICAgICAgIHJldHVybiBudW1TdHJpbmc7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lc3RhbXAobWlsbGlzKSB7CiAgICAgICAgLy8gdXNlZCBhbHNvIGJ5IHRvb2xzIHRoYXQgZG8gbm90IHNldCB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMKICAgICAgICB2YXIgYmFzZSA9IHdpbmRvdy5vdXRwdXQgPyB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMgOiAwOwogICAgICAgIHJldHVybiBuZXcgRGF0ZShiYXNlICsgbWlsbGlzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZFN0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7CiAgICAgICAgdmFyIGR0ID0gZGF0ZVRpbWVGcm9tRGF0ZShkYXRlKS5zbGljZSgwLCAxNyk7ICAvLyBkcm9wIG1pbGxpcwogICAgICAgIHZhciBvZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgICAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnOwogICAgICAgIHZhciBoaCA9IE1hdGguZmxvb3IoTWF0aC5hYnMob2Zmc2V0KSAvIDYwKTsKICAgICAgICB2YXIgbW0gPSBNYXRoLmFicyhvZmZzZXQpICUgNjA7CiAgICAgICAgcmV0dXJuIGR0ICsgJyBVVEMnICsgc2lnbiArIHBhZFRvKGhoLCAyKSArICc6JyArIHBhZFRvKG1tLCAyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICBmdW5jdGlvbiB0aW1lU3RyaW5nKHRpbWUsIHNob3J0VW5pdCkgewogICAgICAgICAgICB2YXIgdW5pdCA9IHt5OiAneWVhcicsIGQ6ICdkYXknLCBoOiAnaG91cicsIG06ICdtaW51dGUnLAogICAgICAgICAgICAgICAgICAgICAgICBzOiAnc2Vjb25kJ31bc2hvcnRVbml0XTsKICAgICAgICAgICAgdmFyIGVuZCA9IHRpbWUgPT0gMSA/ICcgJyA6ICdzICc7CiAgICAgICAgICAgIHJldHVybiB0aW1lICsgJyAnICsgdW5pdCArIGVuZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY29tcGVuc2F0ZUxlYXBZZWFycyhkYXlzLCB5ZWFycykgewogICAgICAgICAgICAvLyBOb3QgYSBwZXJmZWN0IGFsZ29yaXRobSBidXQgb3VnaHQgdG8gYmUgZW5vdWdoCiAgICAgICAgICAgIHJldHVybiBkYXlzIC0gTWF0aC5mbG9vcih5ZWFycyAvIDQpOwogICAgICAgIH0KICAgICAgICB2YXIgZ2VuZXJhdGVkID0gTWF0aC5yb3VuZCh0aW1lc3RhbXAgLyAxMDAwKTsKICAgICAgICB2YXIgY3VycmVudCA9IE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTsKICAgICAgICB2YXIgZWxhcHNlZCA9IGN1cnJlbnQgLSBnZW5lcmF0ZWQ7CiAgICAgICAgdmFyIHByZWZpeCA9ICcnOwogICAgICAgIGlmIChlbGFwc2VkIDwgMCkgewogICAgICAgICAgICBwcmVmaXggPSAnLSAnOwogICAgICAgICAgICBlbGFwc2VkID0gTWF0aC5hYnMoZWxhcHNlZCk7CiAgICAgICAgfQogICAgICAgIHZhciBzZWNzICA9IGVsYXBzZWQgJSA2MDsKICAgICAgICB2YXIgbWlucyAgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyA2MCkgJSA2MDsKICAgICAgICB2YXIgaG91cnMgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjApKSAlIDI0OwogICAgICAgIHZhciBkYXlzICA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCkpICUgMzY1OwogICAgICAgIHZhciB5ZWFycyA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCozNjUpKTsKICAgICAgICBpZiAoeWVhcnMpIHsKICAgICAgICAgICAgZGF5cyA9IGNvbXBlbnNhdGVMZWFwWWVhcnMoZGF5cywgeWVhcnMpOwogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyh5ZWFycywgJ3knKSArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKTsKICAgICAgICB9IGVsc2UgaWYgKGRheXMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKSArIHRpbWVTdHJpbmcoaG91cnMsICdoJyk7CiAgICAgICAgfSBlbHNlIGlmIChob3VycykgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhob3VycywgJ2gnKSArIHRpbWVTdHJpbmcobWlucywgJ20nKTsKICAgICAgICB9IGVsc2UgaWYgKG1pbnMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcobWlucywgJ20nKSArIHRpbWVTdHJpbmcoc2VjcywgJ3MnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhzZWNzLCAncycpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmcocXVlcnkpIHsKICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgaWYgKCFxdWVyeSkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB2YXIgcGFyYW1zID0gcXVlcnkuc3BsaXQoJyYnKTsKICAgICAgICB2YXIgcGFydHM7CiAgICAgICAgZnVuY3Rpb24gZGVjb2RlKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpdGVtLnJlcGxhY2UoJysnLCAnICcpKTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcmFtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBwYXJ0cyA9IHBhcmFtc1tpXS5zcGxpdCgnPScpOwogICAgICAgICAgICByZXN1bHRbZGVjb2RlKHBhcnRzLnNoaWZ0KCkpXSA9IGRlY29kZShwYXJ0cy5qb2luKCc9JykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBtYXA6IG1hcCwKICAgICAgICBmaWx0ZXI6IGZpbHRlciwKICAgICAgICBhbGw6IGFsbCwKICAgICAgICBhbnk6IGFueSwKICAgICAgICBjb250YWluczogY29udGFpbnMsCiAgICAgICAgbGFzdDogbGFzdCwKICAgICAgICBlc2NhcGU6IGVzY2FwZSwKICAgICAgICB1bmVzY2FwZTogdW5lc2NhcGUsCiAgICAgICAgbm9ybWFsaXplOiBub3JtYWxpemUsCiAgICAgICAgcmVnZXhwRXNjYXBlOiByZWdleHBFc2NhcGUsCiAgICAgICAgTWF0Y2hlcjogTWF0Y2hlciwKICAgICAgICBmb3JtYXRQYXJlbnROYW1lOiBmb3JtYXRQYXJlbnROYW1lLAogICAgICAgIHRpbWVGcm9tRGF0ZTogdGltZUZyb21EYXRlLAogICAgICAgIGRhdGVGcm9tRGF0ZTogZGF0ZUZyb21EYXRlLAogICAgICAgIGRhdGVUaW1lRnJvbURhdGU6IGRhdGVUaW1lRnJvbURhdGUsCiAgICAgICAgZm9ybWF0RWxhcHNlZDogZm9ybWF0RWxhcHNlZCwKICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRTdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZFN0cmluZywKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZywKICAgICAgICBwYXJzZVF1ZXJ5U3RyaW5nOiBwYXJzZVF1ZXJ5U3RyaW5nCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy50ZXN0ZGF0YSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBlbGVtZW50c0J5SWQgPSB7fTsKICAgIHZhciBpZENvdW50ZXIgPSAwOwogICAgdmFyIF9zdGF0aXN0aWNzID0gbnVsbDsKICAgIHZhciBMRVZFTFMgPSBbJ1RSQUNFJywgJ0RFQlVHJywgJ0lORk8nLCAnV0FSTicsICdFUlJPUicsICdGQUlMJ107CiAgICB2YXIgU1RBVFVTRVMgPSBbJ0ZBSUwnLCAnUEFTUycsICdOT1RfUlVOJ107CiAgICB2YXIgS0VZV09SRFMgPSBbJ0tFWVdPUkQnLCAnU0VUVVAnLCAnVEVBUkRPV04nLCAnRk9SJywgJ1ZBUiddOwogICAgZnVuY3Rpb24gYWRkRWxlbWVudChlbGVtKSB7CiAgICAgICAgaWYgKCFlbGVtLmlkKQogICAgICAgICAgICBlbGVtLmlkID0gdW5pcXVlSWQoKTsKICAgICAgICBlbGVtZW50c0J5SWRbZWxlbS5pZF0gPSBlbGVtOwogICAgICAgIHJldHVybiBlbGVtOwogICAgfQogICAgZnVuY3Rpb24gdW5pcXVlSWQoKSB7CiAgICAgICAgaWRDb3VudGVyKys7CiAgICAgICAgcmV0dXJuICdlbGVtZW50LWlkLScgKyBpZENvdW50ZXI7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lcyhzdGF0cykgewogICAgICAgIHZhciBzdGFydE1pbGxpcyA9IHN0YXRzWzFdOwogICAgICAgIHZhciBlbGFwc2VkID0gc3RhdHNbMl07CiAgICAgICAgaWYgKHN0YXJ0TWlsbGlzID09PSBudWxsKQogICAgICAgICAgICByZXR1cm4gW251bGwsIG51bGwsIGVsYXBzZWRdOwogICAgICAgIHJldHVybiBbdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMpLAogICAgICAgICAgICAgICAgdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMgKyBlbGFwc2VkKSwKICAgICAgICAgICAgICAgIGVsYXBzZWRdOwogICAgfQogICAgZnVuY3Rpb24gbWVzc2FnZShlbGVtZW50LCBzdHJpbmdzKSB7CiAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQobW9kZWwuTWVzc2FnZShMRVZFTFNbZWxlbWVudFsxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnRpbWVzdGFtcChlbGVtZW50WzBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncy5nZXQoZWxlbWVudFszXSkpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlU3RhdHVzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIFNUQVRVU0VTW3N0YXRzWzBdXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoaWxkQ3JlYXRvcihwYXJlbnQsIGNoaWxkVHlwZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoZWxlbSwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQoY2hpbGRUeXBlKHBhcmVudCwgZWxlbSwgc3RyaW5ncywgaW5kZXgpKTsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlS2V5d29yZChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIGt3ID0gbW9kZWwuS2V5d29yZCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICB0eXBlOiBLRVlXT1JEU1tlbGVtZW50WzBdXSwKICAgICAgICAgICAgaWQ6ICdrJyArIChpbmRleCArIDEpLAogICAgICAgICAgICBuYW1lOiBzdHJpbmdzLmdldChlbGVtZW50WzFdKSwKICAgICAgICAgICAgbGlibmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFsyXSksCiAgICAgICAgICAgIHRpbWVvdXQ6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pLAogICAgICAgICAgICBhcmdzOiBzdHJpbmdzLmdldChlbGVtZW50WzVdKSwKICAgICAgICAgICAgYXNzaWduOiBzdHJpbmdzLmdldChlbGVtZW50WzZdKSwKICAgICAgICAgICAgdGFnczogc3RyaW5ncy5nZXQoZWxlbWVudFs3XSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbNF0pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzdGF0dXM6IHBhcnNlU3RhdHVzKGVsZW1lbnRbOF0sIHN0cmluZ3MpLAogICAgICAgICAgICB0aW1lczogbW9kZWwuVGltZXModGltZXMoZWxlbWVudFs4XSkpLAogICAgICAgICAgICBpc0NoaWxkcmVuTG9hZGVkOiB0eXBlb2YoZWxlbWVudFs5XSkgIT09ICdudW1iZXInCiAgICAgICAgfSk7CiAgICAgICAgbGF6eVBvcHVsYXRlS2V5d29yZHNGcm9tRmlsZShrdywgZWxlbWVudFs5XSwgc3RyaW5ncyk7CiAgICAgICAga3cucG9wdWxhdGVNZXNzYWdlcyhQb3B1bGF0b3IoZWxlbWVudFsxMF0sIHN0cmluZ3MsIG1lc3NhZ2UpKTsKICAgICAgICByZXR1cm4ga3c7CiAgICB9CiAgICBmdW5jdGlvbiBsYXp5UG9wdWxhdGVLZXl3b3Jkc0Zyb21GaWxlKHBhcmVudCwgbW9kZWxPckluZGV4LCBzdHJpbmdzKSB7CiAgICAgICAgdmFyIG1vZGVsLCBpbmRleCwgcG9wdWxhdG9yOwogICAgICAgIHZhciBjcmVhdG9yID0gY2hpbGRDcmVhdG9yKHBhcmVudCwgY3JlYXRlS2V5d29yZCk7CiAgICAgICAgaWYgKHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkKSB7CiAgICAgICAgICAgIG1vZGVsID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwb3B1bGF0b3IgPSBQb3B1bGF0b3IobW9kZWwsIHN0cmluZ3MsIGNyZWF0b3IpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluZGV4ID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwYXJlbnQuY2hpbGRGaWxlTmFtZSA9IHdpbmRvdy5zZXR0aW5nc1snc3BsaXRMb2dCYXNlJ10gKyAnLScgKyBpbmRleCArICcuanMnOwogICAgICAgICAgICBwb3B1bGF0b3IgPSBTcGxpdExvZ1BvcHVsYXRvcihpbmRleCwgY3JlYXRvcik7CiAgICAgICAgfQogICAgICAgIHBhcmVudC5wb3B1bGF0ZUtleXdvcmRzKHBvcHVsYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiB0YWdzKHRhZ2xpc3QsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gdXRpbC5tYXAodGFnbGlzdCwgc3RyaW5ncy5nZXQpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlVGVzdChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1c0VsZW1lbnQgPSBlbGVtZW50WzVdOwogICAgICAgIHZhciB0ZXN0ID0gbW9kZWwuVGVzdCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICBpZDogJ3QnICsgKGluZGV4ICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzNdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZW91dDogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIGlzQ3JpdGljYWw6IGVsZW1lbnRbMl0sCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoc3RhdHVzRWxlbWVudCksCiAgICAgICAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBtc2cgPSBjcmVhdGVNZXNzYWdlKHN0YXR1c0VsZW1lbnQsIHN0cmluZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbXNnOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKHN0YXR1c0VsZW1lbnQpKSwKICAgICAgICAgICAgdGFnczogdGFncyhlbGVtZW50WzRdLCBzdHJpbmdzKSwKICAgICAgICAgICAgaXNDaGlsZHJlbkxvYWRlZDogdHlwZW9mKGVsZW1lbnRbNl0pICE9PSAnbnVtYmVyJwogICAgICAgIH0pOwogICAgICAgIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUodGVzdCwgZWxlbWVudFs2XSwgc3RyaW5ncyk7CiAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNZXNzYWdlKHN0YXR1c0VsZW1lbnQsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gc3RhdHVzRWxlbWVudC5sZW5ndGggPT0gNCA/IHN0cmluZ3MuZ2V0KHN0YXR1c0VsZW1lbnRbM10pIDogJyc7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVTdWl0ZShwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1c0VsZW1lbnQgPSBlbGVtZW50WzVdOwogICAgICAgIHZhciBzdWl0ZSA9IG1vZGVsLlN1aXRlKHsKICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgICAgIGlkOiAncycgKyAoKGluZGV4IHx8IDApICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBzb3VyY2U6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMV0pLAogICAgICAgICAgICByZWxhdGl2ZVNvdXJjZTogc3RyaW5ncy5nZXQoZWxlbWVudFsyXSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzdGF0dXM6IHBhcnNlU3RhdHVzKHN0YXR1c0VsZW1lbnQpLAogICAgICAgICAgICBtZXNzYWdlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbXNnID0gY3JlYXRlTWVzc2FnZShzdGF0dXNFbGVtZW50LCBzdHJpbmdzKTsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1zZzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhzdGF0dXNFbGVtZW50KSksCiAgICAgICAgICAgIHN0YXRpc3RpY3M6IHN1aXRlU3RhdHModXRpbC5sYXN0KGVsZW1lbnQpKSwKICAgICAgICAgICAgbWV0YWRhdGE6IHBhcnNlTWV0YWRhdGEoZWxlbWVudFs0XSwgc3RyaW5ncykKICAgICAgICB9KTsKICAgICAgICBzdWl0ZS5wb3B1bGF0ZUtleXdvcmRzKFBvcHVsYXRvcihlbGVtZW50WzhdLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZUtleXdvcmQpKSk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyhQb3B1bGF0b3IoZWxlbWVudFs3XSwgc3RyaW5ncywgY2hpbGRDcmVhdG9yKHN1aXRlLCBjcmVhdGVUZXN0KSkpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlU3VpdGVzKFBvcHVsYXRvcihlbGVtZW50WzZdLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZVN1aXRlKSkpOwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTWV0YWRhdGEoZGF0YSwgc3RyaW5ncykgewogICAgICAgIHZhciBtZXRhZGF0YSA9IFtdOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxkYXRhLmxlbmd0aDsgaSs9MikgewogICAgICAgICAgICBtZXRhZGF0YS5wdXNoKFtzdHJpbmdzLmdldChkYXRhW2ldKSwgc3RyaW5ncy5nZXQoZGF0YVtpKzFdKV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWV0YWRhdGE7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG90YWw6IHN0YXRzWzBdLAogICAgICAgICAgICB0b3RhbFBhc3NlZDogc3RhdHNbMV0sCiAgICAgICAgICAgIHRvdGFsRmFpbGVkOiBzdGF0c1swXSAtIHN0YXRzWzFdLAogICAgICAgICAgICBjcml0aWNhbDogc3RhdHNbMl0sCiAgICAgICAgICAgIGNyaXRpY2FsUGFzc2VkOiBzdGF0c1szXSwKICAgICAgICAgICAgY3JpdGljYWxGYWlsZWQ6IHN0YXRzWzJdIC0gc3RhdHNbM10KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gUG9wdWxhdG9yKGl0ZW1zLCBzdHJpbmdzLCBjcmVhdG9yKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbnVtYmVyT2ZJdGVtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY3JlYXRvcjogZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRvcihpdGVtc1tpbmRleF0sIHN0cmluZ3MsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBTcGxpdExvZ1BvcHVsYXRvcihzdHJ1Y3R1cmVJbmRleCwgY3JlYXRvcikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG51bWJlck9mSXRlbXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3dbJ2tleXdvcmRzJytzdHJ1Y3R1cmVJbmRleF0ubGVuZ3RoOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjcmVhdG9yOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdG9yKHdpbmRvd1sna2V5d29yZHMnK3N0cnVjdHVyZUluZGV4XVtpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3dbJ3N0cmluZ3MnK3N0cnVjdHVyZUluZGV4XSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3VpdGUoKSB7CiAgICAgICAgdmFyIGVsZW0gPSB3aW5kb3cub3V0cHV0LnN1aXRlOwogICAgICAgIGlmIChlbGVtZW50c0J5SWRbZWxlbS5pZF0pCiAgICAgICAgICAgIHJldHVybiBlbGVtOwogICAgICAgIHZhciByb290ID0gYWRkRWxlbWVudChjcmVhdGVTdWl0ZShudWxsLCBlbGVtLCBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKSk7CiAgICAgICAgd2luZG93Lm91dHB1dC5zdWl0ZSA9IHJvb3Q7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kTG9hZGVkKGlkKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnRzQnlJZFtpZF07CiAgICB9CiAgICBmdW5jdGlvbiBlbnN1cmVMb2FkZWQoaWQsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGlkcyA9IGlkLnNwbGl0KCctJyk7CiAgICAgICAgdmFyIHJvb3QgPSBzdWl0ZSgpOwogICAgICAgIGlkcy5zaGlmdCgpOwogICAgICAgIGxvYWRJdGVtcyhpZHMsIHJvb3QsIFtyb290LmlkXSwgY2FsbGJhY2spOwogICAgfQogICAgZnVuY3Rpb24gbG9hZEl0ZW1zKGlkcywgY3VycmVudCwgcmVzdWx0LCBjYWxsYmFjaykgewogICAgICAgIGlmICghaWRzLmxlbmd0aCkgewogICAgICAgICAgICBjYWxsYmFjayhyZXN1bHQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQuY2FsbFdoZW5DaGlsZHJlblJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGlkID0gaWRzLnNoaWZ0KCk7CiAgICAgICAgICAgIHZhciB0eXBlID0gaWRbMF07CiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGlkLnN1YnN0cmluZygxKSkgLSAxOwogICAgICAgICAgICB2YXIgaXRlbSA9IHNlbGVjdEZyb20oY3VycmVudCwgdHlwZSwgaW5kZXgpOwogICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0uaWQpOwogICAgICAgICAgICBlbHNlICAgIC8vIEludmFsaWQgaWQuIFNob3VsZCB0aGlzIGJlIHJlcG9ydGVkIHNvbWV3aGVyZT8KICAgICAgICAgICAgICAgIGlkcyA9IFtdOwogICAgICAgICAgICBsb2FkSXRlbXMoaWRzLCBpdGVtLCByZXN1bHQsIGNhbGxiYWNrKTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlbGVjdEZyb20oZWxlbWVudCwgdHlwZSwgaW5kZXgpIHsKICAgICAgICBpZiAodHlwZSA9PT0gJ2snKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmtleXdvcmRzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3QnKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRlc3RzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnN1aXRlcygpW2luZGV4XTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBlcnJvckl0ZXJhdG9yKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlKHdpbmRvdy5vdXRwdXQuZXJyb3JzLnNoaWZ0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaGFzTmV4dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5vdXRwdXQuZXJyb3JzLmxlbmd0aCA+IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdGlzdGljcygpIHsKICAgICAgICBpZiAoIV9zdGF0aXN0aWNzKSB7CiAgICAgICAgICAgIHZhciBzdGF0RGF0YSA9IHdpbmRvdy5vdXRwdXQuc3RhdHM7CiAgICAgICAgICAgIF9zdGF0aXN0aWNzID0gc3RhdHMuU3RhdGlzdGljcyhzdGF0RGF0YVswXSwgc3RhdERhdGFbMV0sIHN0YXREYXRhWzJdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9zdGF0aXN0aWNzOwogICAgfQogICAgZnVuY3Rpb24gU3RyaW5nU3RvcmUoc3RyaW5ncykgewogICAgICAgIGZ1bmN0aW9uIGdldFRleHQoaWQpIHsKICAgICAgICAgICAgdmFyIHRleHQgPSBzdHJpbmdzW2lkXTsKICAgICAgICAgICAgaWYgKCF0ZXh0KQogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICBpZiAodGV4dFswXSA9PSAnKicpCiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgIHZhciBleHRyYWN0ZWQgPSBleHRyYWN0KHRleHQpOwogICAgICAgICAgICBzdHJpbmdzW2lkXSA9ICcqJyArIGV4dHJhY3RlZDsKICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RlZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZXh0cmFjdCh0ZXh0KSB7CiAgICAgICAgICAgIHZhciBkZWNvZGVkID0gSlhHLlV0aWwuQmFzZTY0LmRlY29kZUFzQXJyYXkodGV4dCk7CiAgICAgICAgICAgIHZhciBleHRyYWN0ZWQgPSAobmV3IEpYRy5VdGlsLlVuemlwKGRlY29kZWQpKS51bnppcCgpWzBdWzBdOwogICAgICAgICAgICByZXR1cm4gSlhHLlV0aWwuVVRGOC5kZWNvZGUoZXh0cmFjdGVkKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZ2V0KGlkKSB7CiAgICAgICAgICAgIGlmIChpZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIHJldHVybiBnZXRUZXh0KGlkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHtnZXQ6IGdldH07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIHN1aXRlOiBzdWl0ZSwKICAgICAgICBlcnJvckl0ZXJhdG9yOiBlcnJvckl0ZXJhdG9yLAogICAgICAgIGZpbmRMb2FkZWQ6IGZpbmRMb2FkZWQsCiAgICAgICAgZW5zdXJlTG9hZGVkOiBlbnN1cmVMb2FkZWQsCiAgICAgICAgc3RhdGlzdGljczogc3RhdGlzdGljcywKICAgICAgICBTdHJpbmdTdG9yZTogU3RyaW5nU3RvcmUsICAvLyBleHBvc2VkIGZvciB0ZXN0cwogICAgICAgIExFVkVMUzogTEVWRUxTCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmZ1bmN0aW9uIHJlbW92ZUphdmFTY3JpcHREaXNhYmxlZFdhcm5pbmcoKSB7CiAgICAvLyBOb3QgdXNpbmcgalF1ZXJ5IGhlcmUgZm9yIG1heGltdW0gc3BlZWQKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqYXZhc2NyaXB0LWRpc2FibGVkJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKfQpmdW5jdGlvbiBhZGRKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKGVycm9yKSB7CiAgICBpZiAod2luZG93LmNvbnNvbGUpCiAgICAgICAgY29uc29sZS5lcnJvcignT3BlbmluZyBmYWlsZWQ6ICcgKyBlcnJvci5uYW1lICsgJzogJyArIGVycm9yLm1lc3NhZ2UpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2phdmFzY3JpcHQtZGlzYWJsZWQnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKfQpmdW5jdGlvbiBpbml0TGF5b3V0KHN1aXRlTmFtZSwgdHlwZSkgewogICAgcGFyc2VUZW1wbGF0ZXMoKTsKICAgIHNldFRpdGxlKHN1aXRlTmFtZSwgdHlwZSk7CiAgICBhZGRIZWFkZXIoKTsKICAgIGFkZFJlcG9ydE9yTG9nTGluayh0eXBlKTsKfQpmdW5jdGlvbiBwYXJzZVRlbXBsYXRlcygpIHsKICAgICQoJ3NjcmlwdFt0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiXScpLm1hcChmdW5jdGlvbiAoaWR4LCBlbGVtKSB7CiAgICAgICAgJC50ZW1wbGF0ZShlbGVtLmlkLCBlbGVtLnRleHQpOwogICAgfSk7Cn0KZnVuY3Rpb24gdGVzdE9yVGFzayh0ZXh0KSB7CiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC97KC4qKX0vLCBmdW5jdGlvbiAobWF0Y2gsIGdyb3VwLCBvZmZzZXQsIHN0cmluZykgewogICAgICAgIGlmICghd2luZG93LnNldHRpbmdzLnJwYSkKICAgICAgICAgICAgcmV0dXJuIGdyb3VwOwogICAgICAgIHJldHVybiB7J1RFU1QnOiAnVEFTSycsICdUZXN0JzogJ1Rhc2snLCAndGVzdCc6ICd0YXNrJ31bZ3JvdXBdOwogICAgfSk7Cn0KZnVuY3Rpb24gc2V0VGl0bGUoc3VpdGVOYW1lLCB0eXBlKSB7CiAgICB2YXIgZ2l2ZW5UaXRsZSA9IHdpbmRvdy5zZXR0aW5ncy50aXRsZTsKICAgIHZhciB0aXRsZSA9IGdpdmVuVGl0bGUgPyBnaXZlblRpdGxlIDogc3VpdGVOYW1lICsgIiAiICsgdHlwZTsKICAgIGRvY3VtZW50LnRpdGxlID0gdXRpbC51bmVzY2FwZSh0aXRsZSk7Cn0KZnVuY3Rpb24gYWRkSGVhZGVyKCkgewogICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwudGltZXN0YW1wKHdpbmRvdy5vdXRwdXQuZ2VuZXJhdGVkKTsKICAgICQudG1wbCgnPGgxPiR7dGl0bGV9PC9oMT4nICsKICAgICAgICAgICAnPGRpdiBpZD0iZ2VuZXJhdGVkIj4nICsKICAgICAgICAgICAgICc8c3Bhbj5HZW5lcmF0ZWQ8YnI+JHtnZW5lcmF0ZWR9PC9zcGFuPjxicj4nICsKICAgICAgICAgICAgICc8c3BhbiBpZD0iZ2VuZXJhdGVkLWFnbyI+JHthZ299IGFnbzwvc3Bhbj4nICsKICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgJzxkaXYgaWQ9InRvcC1yaWdodC1oZWFkZXIiPicgKwogICAgICAgICAgICAgJzxkaXYgaWQ9InJlcG9ydC1vci1sb2ctbGluayI+PGEgaHJlZj0iIyI+PC9hPjwvZGl2PicgKwogICAgICAgICAgICc8L2Rpdj4nLCB7CiAgICAgICAgZ2VuZXJhdGVkOiB1dGlsLmNyZWF0ZUdlbmVyYXRlZFN0cmluZyhnZW5lcmF0ZWQpLAogICAgICAgIGFnbzogdXRpbC5jcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmcoZ2VuZXJhdGVkKSwKICAgICAgICB0aXRsZTogZG9jdW1lbnQudGl0bGUKICAgIH0pLmFwcGVuZFRvKCQoJyNoZWFkZXInKSk7Cn0KZnVuY3Rpb24gYWRkUmVwb3J0T3JMb2dMaW5rKG15VHlwZSkgewogICAgdmFyIHVybDsKICAgIHZhciB0ZXh0OwogICAgdmFyIGNvbnRhaW5lciA9ICQoJyNyZXBvcnQtb3ItbG9nLWxpbmsnKTsKICAgIGlmIChteVR5cGUgPT0gJ1JlcG9ydCcpIHsKICAgICAgICB1cmwgPSB3aW5kb3cuc2V0dGluZ3MubG9nVVJMOwogICAgICAgIHRleHQgPSAnTE9HJzsKICAgIH0gZWxzZSB7CiAgICAgICAgdXJsID0gd2luZG93LnNldHRpbmdzLnJlcG9ydFVSTDsKICAgICAgICB0ZXh0ID0gJ1JFUE9SVCc7CiAgICB9CiAgICBpZiAodXJsKSB7CiAgICAgICAgY29udGFpbmVyLmZpbmQoJ2EnKS5hdHRyKCdocmVmJywgdXJsKTsKICAgICAgICBjb250YWluZXIuZmluZCgnYScpLnRleHQodGV4dCk7CiAgICB9IGVsc2UgewogICAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTsKICAgIH0KfQpmdW5jdGlvbiBhZGRTdGF0aXN0aWNzKCkgewogICAgdmFyIHN0YXRIZWFkZXJzID0KICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+VG90YWw8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5QYXNzPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+RmFpbDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPkVsYXBzZWQ8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+UGFzcyAvIEZhaWw8L3RoPic7CiAgICB2YXIgc3RhdFRhYmxlID0KICAgICAgICAnPGgyPntUZXN0fSBTdGF0aXN0aWNzPC9oMj4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0idG90YWwtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlRvdGFsIFN0YXRpc3RpY3M8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPicgKwogICAgICAgICc8dGFibGUgY2xhc3M9InN0YXRpc3RpY3MiIGlkPSJ0YWctc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgVGFnPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0ic3VpdGUtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgU3VpdGU8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPic7CiAgICAkKHRlc3RPclRhc2soc3RhdFRhYmxlKSkuYXBwZW5kVG8oJyNzdGF0aXN0aWNzLWNvbnRhaW5lcicpOwogICAgdXRpbC5tYXAoWyd0b3RhbCcsICd0YWcnLCAnc3VpdGUnXSwgYWRkU3RhdFRhYmxlKTsKICAgIGFkZFRvb2x0aXBzVG9FbGFwc2VkVGltZXMoKTsKICAgIGVuYWJsZVN0YXRpc3RpY3NTb3J0ZXIoKTsKfQpmdW5jdGlvbiBhZGRUb29sdGlwc1RvRWxhcHNlZFRpbWVzKCkgewogICAgJCgnLnN0YXRzLWNvbC1lbGFwc2VkJykuYXR0cigndGl0bGUnLAogICAgICAgIHRlc3RPclRhc2soJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZXNlIHt0ZXN0fXMuICcpICsKICAgICAgICAnRXhjbHVkZXMgc3VpdGUgc2V0dXBzIGFuZCB0ZWFyZG93bnMuJyk7CiAgICAkKCcjc3VpdGUtc3RhdHMnKS5maW5kKCcuc3RhdHMtY29sLWVsYXBzZWQnKS5hdHRyKCd0aXRsZScsCiAgICAgICAgJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoaXMgc3VpdGUuJyk7Cn0KZnVuY3Rpb24gZW5hYmxlU3RhdGlzdGljc1NvcnRlcigpIHsKICAgICQudGFibGVzb3J0ZXIuYWRkUGFyc2VyKHsKICAgICAgICBpZDogJ3N0YXROYW1lJywKICAgICAgICB0eXBlOiAnbnVtZXJpYycsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZywgdGFibGUsIGNlbGwsIGNlbGxJbmRleCkgewogICAgICAgICAgICAvLyBSb3dzIGhhdmUgY2xhc3MgaW4gZm9ybWF0ICdyb3ctPGluZGV4PicuCiAgICAgICAgICAgIHZhciBpbmRleCA9ICQoY2VsbCkucGFyZW50KCkuYXR0cignY2xhc3MnKS5zdWJzdHJpbmcoNCk7CiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbmRleCk7CiAgICAgICAgfQogICAgfSk7CiAgICAkKCIuc3RhdGlzdGljcyIpLnRhYmxlc29ydGVyKHsKICAgICAgICBzb3J0SW5pdGlhbE9yZGVyOiAnZGVzYycsCiAgICAgICAgaGVhZGVyczogezA6IHtzb3J0ZXI6J3N0YXROYW1lJywgc29ydEluaXRpYWxPcmRlcjogJ2FzYyd9LAogICAgICAgICAgICAgICAgICA1OiB7c29ydGVyOiBmYWxzZX19CiAgICB9KTsKfQpmdW5jdGlvbiBhZGRTdGF0VGFibGUodGFibGVOYW1lKSB7CiAgICB2YXIgc3RhdHMgPSB3aW5kb3cudGVzdGRhdGEuc3RhdGlzdGljcygpW3RhYmxlTmFtZV07CiAgICBpZiAodGFibGVOYW1lID09ICd0YWcnICYmIHN0YXRzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgcmVuZGVyTm9UYWdTdGF0VGFibGUoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmVuZGVyU3RhdFRhYmxlKHRhYmxlTmFtZSwgc3RhdHMpOwogICAgfQp9CmZ1bmN0aW9uIHJlbmRlck5vVGFnU3RhdFRhYmxlKCkgewogICAgJCgnPHRib2R5Pjx0ciBjbGFzcz0icm93LTAiPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5ObyBUYWdzPC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZWxhcHNlZCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZ3JhcGgiPicgKwogICAgICAgICAgJzxkaXYgY2xhc3M9ImVtcHR5LWdyYXBoIj48L2Rpdj4nICsKICAgICAgICAnPC90ZD4nICsKICAgICAgJzwvdHI+PC90Ym9keT4nKS5hcHBlbmRUbygnI3RhZy1zdGF0cycpOwp9CmZ1bmN0aW9uIHJlbmRlclN0YXRUYWJsZSh0YWJsZU5hbWUsIHN0YXRzKSB7CiAgICB2YXIgdGVtcGxhdGUgPSB0YWJsZU5hbWUgKyAnU3RhdGlzdGljc1Jvd1RlbXBsYXRlJzsKICAgIHZhciB0Ym9keSA9ICQoJzx0Ym9keT48L3Rib2R5PicpOwogICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0YXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgJC50bXBsKHRlbXBsYXRlLCBzdGF0c1tpXSwge2luZGV4OiBpfSkuYXBwZW5kVG8odGJvZHkpOwogICAgfQogICAgdGJvZHkuYXBwZW5kVG8oJyMnICsgdGFibGVOYW1lICsgJy1zdGF0cycpOwp9CiQudGVtcGxhdGUoJ3N0YXRDb2x1bW5zVGVtcGxhdGUnLAogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7dG90YWx9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke3Bhc3N9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke2ZhaWx9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1lbGFwc2VkIj4ke2VsYXBzZWR9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+JyArCiAgICAgICd7e2lmIHRvdGFsfX0nICsKICAgICAgJzxkaXYgY2xhc3M9ImdyYXBoIj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0icGFzcy1iYXIiIHN0eWxlPSJ3aWR0aDogJHtwYXNzV2lkdGh9JSIgdGl0bGU9IiR7cGFzc1BlcmNlbnR9JSI+PC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9ImZhaWwtYmFyIiBzdHlsZT0id2lkdGg6ICR7ZmFpbFdpZHRofSUiIHRpdGxlPSIke2ZhaWxQZXJjZW50fSUiPjwvZGl2PicgKwogICAgICAnPC9kaXY+JyArCiAgICAgICd7e2Vsc2V9fScgKwogICAgICAnPGRpdiBjbGFzcz0iZW1wdHktZ3JhcGgiPjwvZGl2PicgKwogICAgICAne3svaWZ9fScgKwogICAgJzwvdGQ+JwopOwokLnRlbXBsYXRlKCdzdWl0ZVN0YXR1c01lc3NhZ2VUZW1wbGF0ZScsCiAgICAnJHtjcml0aWNhbH0gY3JpdGljYWwge3s9IHRlc3RPclRhc2soInt0ZXN0fSIpfX0sICcgKwogICAgJyR7Y3JpdGljYWxQYXNzZWR9IHBhc3NlZCwgJyArCiAgICAnPHNwYW4gY2xhc3M9Int7aWYgY3JpdGljYWxGYWlsZWR9fWZhaWx7e2Vsc2V9fXBhc3N7ey9pZn19Ij4ke2NyaXRpY2FsRmFpbGVkfSBmYWlsZWQ8L3NwYW4+PGJyPicgKwogICAgJyR7dG90YWx9IHt7PSB0ZXN0T3JUYXNrKCJ7dGVzdH0iKX19IHRvdGFsLCAnICsKICAgICcke3RvdGFsUGFzc2VkfSBwYXNzZWQsICcgKwogICAgJzxzcGFuIGNsYXNzPSJ7e2lmIHRvdGFsRmFpbGVkfX1mYWlse3tlbHNlfX1wYXNze3svaWZ9fSI+JHt0b3RhbEZhaWxlZH0gZmFpbGVkPC9zcGFuPicKKTsKLy8gRm9yIGNvbXBsZXRlIGNyb3NzLWJyb3dzZXIgZXhwZXJpZW5jZS4uCi8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX29yZGVyLmh0bWwKZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGV2ZW50KSB7CiAgICB2YXIgZXZlbnQgPSBldmVudCB8fCB3aW5kb3cuZXZlbnQ7CiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKfQo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0ID0ge307Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN1aXRlIl0gPSBbMSwyLDMsMCxbXSxbMSwwLDYyMDldLFtdLFtbNCwwLDEsMCxbXSxbMSwxMDgsNTYwMl0sW1swLDUsMCwwLDAsNiwwLDAsWzEsMTA5LDU0NzBdLFtbMCw3LDgsMCw5LDEwLDAsMCxbMSwxMTAsNTQxM10sW10sW1sxMTEsMiwxMV1dXSxbMCwxMiw4LDAsMTMsMTQsMCwwLFsxLDU1MjQsNTVdLFtdLFtdXV0sW11dLFswLDE1LDgsMCwxNiwxNywwLDAsWzEsNTU4MCwxNl0sW10sW1s1NTk2LDIsMThdXV0sWzAsMTksMjAsMCwyMSwyMiwwLDAsWzEsNTU5NiwxMTNdLFtdLFtbNTY2OCwyLDIzXSxbNTY3MCwyLDI0XSxbNTY3MCwyLDI1XSxbNTY4NywyLDI2XSxbNTY4OCwyLDI3XV1dXV1dLFtbMiwyOCw4LDAsMjksMCwwLDAsWzEsNTcxMiw0OTZdLFtdLFtdXV0sWzEsMSwxLDFdXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3RyaW5ncyJdID0gW107Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN0cmluZ3MiXSA9IHdpbmRvdy5vdXRwdXRbInN0cmluZ3MiXS5jb25jYXQoWyIqIiwiKkp1cHl0ZXIiLCIqL2hvbWUvZGF0YWt1cnJlL1dvcmsvcm9ib3RrZXJuZWwvZXhhbXBsZXMiLCIqLi4vLi4vLi4vLi4vaG9tZS9kYXRha3VycmUvV29yay9yb2JvdGtlcm5lbC9leGFtcGxlcyIsIipTaG93IFBsb25lIGxvZ28iLCIqT3BlbiB1cmwiLCIqPGEgaHJlZj1cImh0dHBzOi8vcGxvbmUub3JnXCI+aHR0cHM6Ly9wbG9uZS5vcmdceDNjL2E+IiwiKk9wZW4gQnJvd3NlciIsIipTZWxlbml1bUxpYnJhcnkiLCIqPHA+T3BlbnMgYSBuZXcgYnJvd3NlciBpbnN0YW5jZSB0byB0aGUgZ2l2ZW4gPGNvZGU+dXJsXHgzYy9jb2RlPi5ceDNjL3A+IiwiKiR7dXJsfSwgYnJvd3Nlcj1oZWFkbGVzc2ZpcmVmb3giLCIqT3BlbmluZyBicm93c2VyICdoZWFkbGVzc2ZpcmVmb3gnIHRvIGJhc2UgdXJsICc8YSBocmVmPVwiaHR0cHM6Ly9wbG9uZS5vcmdcIj5odHRwczovL3Bsb25lLm9yZ1x4M2MvYT4nLiIsIipTZXQgV2luZG93IFNpemUiLCIqPHA+U2V0cyBjdXJyZW50IHdpbmRvd3Mgc2l6ZSB0byBnaXZlbiA8Y29kZT53aWR0aFx4M2MvY29kZT4gYW5kIDxjb2RlPmhlaWdodFx4M2MvY29kZT4uXHgzYy9wPiIsIio4MDAsIDYwMCIsIipQYWdlIFNob3VsZCBDb250YWluIEVsZW1lbnQiLCIqPHA+VmVyaWZpZXMgdGhhdCBlbGVtZW50IDxjb2RlPmxvY2F0b3JceDNjL2NvZGU+IGlzIGZvdW5kIG9uIHRoZSBjdXJyZW50IHBhZ2UuXHgzYy9wPiIsIipjc3M9Lm5hdmJhci1icmFuZCIsIipDdXJyZW50IHBhZ2UgY29udGFpbnMgZWxlbWVudCAnY3NzPS5uYXZiYXItYnJhbmQnLiIsIipDYXB0dXJlIGFuZCBjcm9wIHBhZ2Ugc2NyZWVuc2hvdCIsIipTZWxlbml1bVNjcmVlbnNob3RzIiwiKjxwPkNhcHR1cmVzIGEgcGFnZSBzY3JlZW5zaG90IHdpdGggdGhlIGdpdmVuIDxjb2RlPmZpbGVuYW1lXHgzYy9jb2RlPiBhbmQgY3JvcHMgaXQgdG8gbWF0Y2ggdGhlIGNvbWJpbmVkIGJvdW5kaW5nIGJveCBvZiB0aGUgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIDxjb2RlPmxvY2F0b3JzXHgzYy9jb2RlPi5ceDNjL3A+IiwiKnBsb25lLnBuZywgY3NzPS5uYXZiYXItYnJhbmQiLCIqXHgzYy90ZD5ceDNjL3RyPjx0cj48dGQgY29sc3Bhbj1cIjNcIj48YT48aW1nIHNyYz1cImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBTXNBQUFCb0NBWUFBQUJmY3dSekFBQU1vMGxFUVZSNG5PMmR6MDhiWnhySHYxbVpYYnRkM0luUnhsT0JsTEVVSkx2YTBIRWlGWkFpWmJpRlU4YVhWWFBDSEhPcStRY0srUXR3VHpuYW5PZ041MUp5c3lOdEJhblVNQ1JTc0pSSUhpUlFUYXVZZ2V6R2x2Q3FlM0RzTUQvOUdvOW5TSGcrRWhMMmpGKy9Icy8zZlo5ZjcrdExWeU5UZjRJZ2lLNzh4ZThPRU1USEFvbUZJQmdoc1JBRUl5UVdnbUNFeEVJUWpKQllDSUlSRWd0Qk1ISUpBT1ZaQ0lLQkFMNy95ZTgrRU1SSEFabGhCTUVJaVlVZ0dDR3hFQVFqSkJhQ1lJVEVRaENNa0ZnSWdoRVNDMEV3UW1JaENFWklMQVRCQ0ltRklCZ2hzUkFFSXlRV2dtQ0V4RUlRakpCWUNJSVJFZ3RCTUVKaUlRaEdTQ3dFd1FpSmhTQVlJYkVRQkNNa0ZvSmdoTVJDRUl3RS9PNkFFd0lYd3QxNEZBSVhndmhsR0NJL0RDNDQxRG11YW5Xb1doMmxTZzFhNHdRcnlqNjB4b21QUFNZK1pTN2grNS9PMWI1aFhIQUlkK05YSU1lamtCUFJubDlmMkRsQVh0bkhvL0xCQUhwSFhHVE9sVmpteEZGa1p4TzYyZU9zcUZvZDg0VVhLRlhldU5BemdqZ25ZaEg1TUpabkU1Q0VpT3R0RjNZT3NQQjRCNnBXZDcxdDRtTGh1MWpTeVRFczM0bmJ6aVpIalNZSzVRTW8xV01vMWJjQUFQWHdIWVRMbndFQUpPRXlSRDRNU1JqQkYwRnJGMHhybkdBbTl3dVU2dkZnUGdSeElmQlZMT25rR0hMeWRjdGpUOVFhc3BzcUNqdnN2b2VjaUNJekplQzJ4UXlsTlU2dzhMaU0vTmJlbWZ0clJPU0g4Y1hmZWpNWmQ0L3F6TE9jc2YxZVhrdTRqMjlpeVV3TFdMNlRNRDIvWFQxRzVuRzVMMThqblJ6RGtuUU5WN21RNmRoODRZVnJnaW5OVDFvS3N4dXFWa2QrYXc4L2JLclFHazNtOWgrVVhtT3ArT3BNZlNYNng1YzhpeFFic1JUS2lySVA4ZUhQT3FHSS9EQnk4blVVMDVNb3BpZngzWlFBenNiY2FwUGYyb1A0OEdmTGlOanluVGhFUHR6L2grZ0RnUXRoYVdZY2xZVVp5UEhlSTM2RVAzZ3VGb0VMWWUzYnBPbjUrY0lMcE5lZTY1NlQ0MUZzM2IrRmRISU1VaXdDS1JaQmRqYUJyZnUzdWdwR2E1eEFYbjJHSHpaVjNmTmNjQWhyOTI2NEVuSHJGeTRZd05xOUcwaUxvMzUzaFdEQTg2UmtMalZodWxFWEh1K1lUQ09CQ3lHWG1yQnNRK0JDeU1rVFNQMzRyT3Y3WmRaM3dBV0hNSGZxaGhTNEVMS3pDWk00KzJWWHF5T3Y3RnNlNDRJQmlIelkwbXpMcFNaMEFRemlmT0twV0tUWWlDazh2S0xzSTd1aG1zOFZJbzZ6Unk4SnkvVGFjd2hjU0hlanpvbWp5RzZvcmtiSVZLM2UxYWZnZ2dGa1o3L1NpUmNBbHU5OGhabjhVOWY2Y3BHUTQxSDg4OHJmVVRtczQ3OG4vME5oUUFscFQ4Mnc1VHR4M2VOZHJXNDd1cmREdzA3MGtwZVJWNS9oeU9CTUw4K2EvYVpCb3pXYVNLODlOL2xUVWl3Q3dTSWdRVGpUSGxDdmpYeU9mM3orMTRHK2wyZGlTU2ZIVEk3MVV1bTE3Zm5xNGJ1dWJaYlVHdlA3YTQwVFpEY3J1dWNrSWVLYnM1OVozekU5TjRpazdLY09GeHpxMUFOeW9kYi8zZnpacytLWldPVDRGZDNqSjJyTk1ZUmJVbXVtbWVBMFo2bjlXaXEreHE0aFQ1Rk8rdU5jcTFyZDFCZVcyZlNzU0VJRXQ2KzIvZ2JWYnI4M0tSY01kTnBpN2FlcTFTSHlZVHgrOVFmS2Yvd0hBaGR5RE1mM2cyYytpOUd4dFhPRTI2aGFIWm4xbDVaT3ZwUDUxbzNzcHFvTFc5K05SeTFIZVM5UXRicGxMc2d0NUhnVWMrS29wWCtuVkkrUjNWQ3gwdVY3K1BQQnJPN3hUTzRwVksyT1Jla2E1QVJ2RWtpcFVzT0QwcXVlWnYyME9JcnZwZ1hMV2I2d2M0QVZaZC9SRDhsdXFoRDVZUUFZYUpERUU3SElpYWdwQXNhU21jOHIrMUNxeDFpYUdZZkloMXZsK0dvTjJZM0ttVWVQVWtYL0pRcGNDQUlYOGlVelBpZ1RrQXNHc1BidFRVZ3grOUZaNU1QSXB5YVFtUmFRV24zRy9QbmxSQlJ6NHBqdExOSUs4VThpdTZGaTRiSHpJTVFGQXlqT1R6cGVCem5ScWo0dlZXcEkvZmlyN2ZmdVJTVFJFN0cwVmQvbWlWcGpYbmVpVk45Q1huVU9FV2VtQk13bFJ5SHlZV2lOSmtxVk43YkZrMHIxR0x1R0VWMU9SQzBqY29ORUVpS21XallXUDQyRjB2d1V2alpjY3p0RVBveXQrN2NRV3k0eURVRGZUUWxNN1dhbUJleHFkV1FOZWE0MkxFSTVqUlNMb0RnL2llVERuNW5PSHdTZWlFWGc5TFo0U1hXdmJENDdtOUI5Z1Z3d0FEa1JoUlFiUWZMaHYyMEZjMW9zZzNJSTdlQ0NBY3RJbkJzaHoreHN3aVNVZGpHcXF0VmIxeWNlTlgzK3RXOXY5aFM2M3RYcUtKUVBvRFdhbG0wQ3dPTE1PUExLbnFVSTg2a0prMUJXbFAyT0g4c0ZoNUNaMXRmNWlYd1lTelBqdnBYOGVDU1d3ZGpsSWo5c085SzE4aGtKeTFsSnFSN2o3cWt5RXkreitaSVF3Zkpzd3ZKRzZkY3g1WUlCMC9WNG90WWdyK3JObDZYaUt5ek5qT3ZPbFdJUlNFS0V5ZGRZVWZhUldYOXBhdE9ZUCtLQ0FhVEZNZFBzSXZMRHV1dC8xR2hDeW0yYVRLbEMrUUJwY1ZUbnR5NUsxNURmMnZQRmJQWmxXWEZKUFhTbEhUbkJPeDYveTFoMzVaYnY4RFVmUmpFOWFmOCtYNFl0WjdHalJ0T1YwVEl0anVrZTcycDFrMUNBVnE0bnM3NWpxaWhJSjhlNmltVzcrdFl5dU5KcTh5WGtlRlJuWG9wZm1xOXRaanFtZTV6ZFZHMTlqcnl5ajNSeVROZFBPUjYxTmU4R2lVYytpMytGaTFiTys2QkNpMXd3NE9oVVczSFVhRUplL2RXVmtkTDQzbTB6eVk3ODFwN3VKbVR4YzV4TVJhM1JSRjdaMDgxWVZsYUZNWitVM2FpWXp0RWZWL1ZpU2ZnakZrL3lMTWFTRXJmTXNtNE84VkdqYVhrVGV1MmoyTEdyMVNIbE5uc0tzenBoOUEyN1JSeU43OHN5cUhWYk90RnRJQks0a002MzJhNis3Zm9hbzBEUHNpekNEWHk1YXdRdTZFbzdoZklCc28ybTdRcEorMGlNM2tmeGVrZVlSK1dEenNZYWJzSWFBV3RqTjVEME0vT1dLbSt3S0YyelBXNGNLTDhJQmh6UFAwOTRJaFpWcStQMnFjZHVPZFRhZXhPbWNPK21TVENQeWdlMmZvQnhCSFdybUhLNytoYVo5WmUyeDVYcThjQk1RTGNRK2JCck14MEw3YlU5dlNMeXc1NVhhWHNpRnFWNmpEbDhpSktjSldzdUNaSE9QbUduS2FrMUNNdEZaS1pqRVBuaHpqNWlUcmExY1FSMjY2SnJqUk5QYjdTTGpCL3JrVHdSaTFYV1hPVERUQ1A2MHN5NGJwcFd0VHJtMTU3cmJrcXRoMmlTVlRXQnNYOFhHYTlOVXFjMVFFNThzcUZqcFhxTUk0TnZrVTZPSXJQdUxKYkN2UnVtOEsvQWhWQ2NuOFJNN3VtWlJuSGpNdDd0NnZFbnM0dWw4UnFmQmE5Tm04UEd5VWV6cjRCblZjZDVSVjloUENlT09rNmx4c1NWRWJ0VmxFNElYTWkwNk1wdEo5dFBlbzA2K3JFazRDd1J1UE9DWjJJeDFsNjF5aG11MnA3ZkxlRW9jS0dlUThCR1IvS28wVVIrNjlNVlM3ZlZwTWJqVHp6eXQ3WU5zOWZIc2dlQloySlJ0YnFwSEh4Ukd1OXJaT25GeVpOaUl4YXp5dDY1TnNHTWZlczJPQmp6S25malVkdlpvelhMNmpQK3ZlelIxZy9HNE12eTdGZGRQMXRhSFBWZFZKNHVLN2F5VGUxMldsRitjL1puN0JLT1ZvaDgyTFNqVEt2RXhINmw1bm5BNkQvTWlXT21DdTdUbE5TYWFVSFoycjJicGtFaUxZNWE3cEJqTkpVSFJYYWpvbHZZeHdVRDJMcC95MUxZcmMxSnJpT1hta0F1TmVHcllEeE5TcXBhSFE5S3I3QW9mVENIV2c3N041akovYUliU1F2bEEyeFgzOW9tMmxpZFFpNDRoRnpxdWttUVM2Vlg1M3BXQVZybEtLY2pnZTJicW8zVnBudnB0ZWNvemsvcVhwTlBUU0NmbXVoVUNGdXhzTDdqV1E2b0hiMDhYWG5kRHR4b2pXWm5vQlF1aDB4K1Y5dFg5Y1BYOUh6ZnNLWGlhMndiYkd1UkQ2TTQvNDNwaHBaWGY3VzBveCtVWGpQVkJyWGJOWnA2ajhvSG5xOWZPUXVxVmpmdGU5YU5rbHJEdk0wcVVqdWhyQ2o3bnRkYVpUZXRWMm0yNit2c052QllVZlo5QzhyNFV1NGlyejZEY3YrV3ZqcVZENk95Y0J1cEg3YzY5VWVxVm9lVWV3cEppRUNLalVBOWZJZVNXbU15ditSRUZEblpQS05zVjQrUlhudmg3Z2NhSU8za0xldWlLNkExNm1xTkpyS3pDY2RseSsxcVp6K0tFb0hXTEZpcXZNSFN6SGpYNWRXNzc3ZVo4ak42NmR0ZXh5SWZSbWwrMGpJdjBNL1BSRWl4RVN4SzF5enQzKzNxTVNTRHVkY1BhWEZVdDhtRWV2aHVZRittd0lVZ3g2UGdRaC9FWDZxODZacHJhdjhvMU9sUnVsWGw4S1pyVlRKZ2ppQjJXMHNpY0NHa2t4OENCNnpYUkk1SEljWE11KzJvV2gyRm5ZT0I3UVhXQzc3dW91OGtHQUNkaS9Tby9MdmpEZDdlUU0vcDE4TGNGZ3B4OGZEOTkxbTQ0QkFLOTI1MExidHVqNkRLYjYxaVJJRUxRcmo4V1dkYlZDZGFLL3QyU0NoRVgvZ3VsamFaYVFGTDBuamY1UnFuT1dvMGtTNDg5eXgvUUh6YW5CdXhBQit5K3BtcFdGK2lPV28wa2Qyc0lMdXhTN01KNFJyblNpeHR1T0JRYTcrbytCWG1kZlRBKzBWVjVkOWQvWFV2Z21oekxzVmlSSXFOUU9TSE8za0NnZnNNcXRaYVVxeHFqVTUwaHlBR3lVY2hGb0k0RC9qeU0za0U4VEZDWWlFSVJrZ3NCTUVJaVlVZ0dDR3hFQVFqSkJhQ1lJVEVRaENNa0ZnSWdoRVNDMEV3UW1JaENFWklMQVRCQ0ltRklCZ2hzUkFFSXlRV2dtQ0V4RUlRakpCWUNJSVJFZ3RCTUVKaUlRaEdTQ3dFd1FpSmhTQVlJYkVRQkNNa0ZvSmc1TkxsNUw5b0t5U0NZSUJtRm9KZ2hNUkNFSXlRV0FpQ0VSSUxRVEJDWWlFSVJrZ3NCTUVJaVlVZ0dDR3hFQVFqL3dkTGgwemtYY292emdBQUFBQkpSVTVFcmtKZ2dnPT1cIiBzdHlsZT1cIm1heC13aWR0aDo4MDBweDtcIj5ceDNjL2E+IiwiZU5yVnprRnF3ekFRaGVHcmlPeWxDYVRVdENRNVFKYjFBY3BZR2NXU1pZMDlJOXZON1p0QWFjL1E1Yy9qZy9kQmVJM2xaaTY0WXVzbFR0VUU0ZEdFbU1rYzBmUkM0YlI3MWpzQWxQZ0ZXbGtJWHJZaHp3M0dlZlZGbTdFTWE4NmJwQ2FscUtFTGFxZDc3YmtjM0tzVjdyZ0d3WkUybHNFcVpTcHhHZFVMVWRHZXE5cTllM01IeUxHRFh3WWFLOWtKL1lBM1VtaC9WUHVuUUVoNUVmOVlPMzUwRlp3KzA3eVEzRjNTM2ZrL3ZUMENudDAzcWdhVkRRPT0iLCJlTnF0VXoxdjJ6QVEzZjBycmhraUtnZ29CZGxpZUNpQ0xGbVNvaTA2QklGQlV5ZVppa1FxNUNtV1VPaS9sL3B3STd0dXVwU0xkTWQzOTk1OThLNUJXWlBTR1h4MnJaWmJhN1NwSGR5TE4vRlZXbFhSellLbHRaYWtqQVltUlZGc2hId0o0ZWNDL0hrVEZwVE9VZEs2Vk03NU5Pdjh0VWJiWHNKT0tGcW54cTQzeHBBaks2b0trK2wyT1FTZkRJUVZ2TlB0YVFaMENvemFDazBLTzZVVHMrUDVseUhnMDJvRndUNG1tSWZzRmJxaEVKOTVDa3lNckV2VXhLVkZRWGhYWUcreFlNUUY0ZklndytqbHprcWZJWWdpa1l1R1o4WmtCWXBLT1M1Tk9maWlRbTFjTkZZUlhmTnJmalVadkZTYTV5NDRUSHVzWldPU2x2ZE4wc250VmhVSkczbG5ZcnJocnhzZEg3WDNmL2R3d2pxa2I2cEVVeFA3aVAwU3J1STRudXNHTEJ3ZTVSeUpPVGFWZlRxN09Ydm1TaHBOUW1ubjFjOHVweGs5T3F3VE05dEVZYk5qbWYyeFNMWFZzL0xSRC9jVWNBWWUyVVlrSjJ5SStZLzU3a3V5dDhLaHQzejkyRHlrUGVuaFRRam5HUzFYRUMvL0lPZ09YZDNSVnUxZkVpTmI0OStHZlBLRnNQRGZHOUJqdXBBTk9DOTYyREQzRkQ5RGRQR2JHUzZpaFlmOVVMVDFJd1doMjNjby93WEZEa1E3IiwiZU5yVmoxRk93ekFRUks5aTlkOWVwQ0lpVU9rQitDUUhRQnV6VGpaeHZPbXVrNVRiMDBvSXpzRGZQSTJlTlBOTytNbWxkMis0WVJ1VmwrcVN5dXdTWjNJbmRJTlNlajNjNlFVQUNsL0JxaWpCNHo3bFM0TjgyV0t4Wmk3VGx2T3VZek9PYktsTDVwZXZPa2c1aGlldjBrbE5palB0b3BNM3lsUjRuUzBxVWJGQnF2bUg4QnlPa0xtRFh3Mk1LL2tGNDRROUdiUS9WdnRuZ1pMSnF2SFc5bFEvT2xuTC9jb3RYTU5vaC9OL1duc0NQSWR2ZGt5VWpRPT0iLCJlTnFsVkQxdjJ6QVEzZjByYmlncXlaSWRKMk1NRHcwUUlBalFvZWpRd1RBS1dxWXN0alJsVUtRZG8vRi9MeWwraUZLc09FQTQ2T1A0N3QzZDQvRWVYM0F1QldGYitGYWZXRjd5aWxXeWhtZDBRRDl6VHZiaWZoUVhrdVdDVkF6aUdsT2NpNHJYR2VTODJ2L2VJYjRsVFAwZ1N0Y28vNXZBdnhHb2RVQWNTQVpmaE5ySElvT3FLR3I5cHJnUXNBQW1LYzFBVkh2L2ZTUWJVYnEvaGtLdkVwTnQ2UnptamJtb09NUkVtV1p6SVBDVmlqbjRwS1lVczYwbzFVYWF1a3owc21rb3B6OC9KT2FudG93bFdTVnpqeU1GeEJacnFXQ3hVSkZDTHIwNEZwSXpYM1M4RFBsQ3dyUC9NZ0tvREJ5L01jUzk2RWFmaFNrWVhsK2RMdGJTVDhTcDVrbWx3UHlYTm9iRVo4QzB4Z091MzVFb3B6djBFbmQyOVdweVNRM1FuZURVR2k4RjdCQWtNTEhVaERWVmRSZ3VTcVRyYjFvaUtOODF3RUQ5dmo4NitUdzExcXNLZU9kaENYUTZxUVg2QW96eFlzUmhDWlJUU0RBb1FLY0IrdVhhMnhNSWVhVkU2L0RKZytpblllNXRXOHlWSkF6OHcwcVlaM3UzL09uTTdQaVloS01uYVlkRkNOUXgzOGVwVEk2RWJhcGowTU51REtXaEo0emhMbmt6a3Q1QTlMVS9KNmFGbEZIdU1CUDFjcmJLNEdiY1RpZ1kzL1FRdHdiUllldGo3bGJRWUt3bUdxQ2lQWnhBMW5wd2UrRDlLRnBHVTRZT2E4UW5hNDdZSmxwRm9GNFEzYzZpL3hIWnFuaz0iLCIqQ2xvc2UgQWxsIEJyb3dzZXJzIiwiKjxwPkNsb3NlcyBhbGwgb3BlbiBicm93c2VycyBhbmQgcmVzZXRzIHRoZSBicm93c2VyIGNhY2hlLlx4M2MvcD4iXSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN0YXRzIl0gPSBbW3siZWxhcHNlZCI6IjAwOjAwOjA2IiwiZmFpbCI6MCwibGFiZWwiOiJDcml0aWNhbCBUZXN0cyIsInBhc3MiOjF9LHsiZWxhcHNlZCI6IjAwOjAwOjA2IiwiZmFpbCI6MCwibGFiZWwiOiJBbGwgVGVzdHMiLCJwYXNzIjoxfV0sW10sW3siZWxhcHNlZCI6IjAwOjAwOjA2IiwiZmFpbCI6MCwiaWQiOiJzMSIsImxhYmVsIjoiSnVweXRlciIsIm5hbWUiOiJKdXB5dGVyIiwicGFzcyI6MX1dXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiZXJyb3JzIl0gPSBbXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiYmFzZU1pbGxpcyJdID0gMTU0NjY2ODc3OTAzMjsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiZ2VuZXJhdGVkIl0gPSA2MjIwOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuc2V0dGluZ3MgPSB7ImRlZmF1bHRMZXZlbCI6IlRSQUNFIiwibWluTGV2ZWwiOiJJTkZPIiwicmVwb3J0VVJMIjpudWxsLCJycGEiOmZhbHNlLCJzcGxpdExvZ0Jhc2UiOiJsb2ciLCJ0aXRsZSI6IiJ9Owo8L3NjcmlwdD4KPHRpdGxlPjwvdGl0bGU+CjwvaGVhZD4KPGJvZHk+CjxkaXYgaWQ9ImphdmFzY3JpcHQtZGlzYWJsZWQiPgogIDxoMT5PcGVuaW5nIFJvYm90IEZyYW1ld29yayBsb2cgZmFpbGVkPC9oMT4KICA8dWw+CiAgICA8bGk+VmVyaWZ5IHRoYXQgeW91IGhhdmUgPGI+SmF2YVNjcmlwdCBlbmFibGVkPC9iPiBpbiB5b3VyIGJyb3dzZXIuPC9saT4KICAgIDxsaT5NYWtlIHN1cmUgeW91IGFyZSB1c2luZyBhIDxiPm1vZGVybiBlbm91Z2ggYnJvd3NlcjwvYj4uIElmIHVzaW5nIEludGVybmV0IEV4cGxvcmVyLCB2ZXJzaW9uIDggb3IgbmV3ZXIgaXMgcmVxdWlyZWQuPC9saT4KICAgIDxsaT5DaGVjayBhcmUgdGhlcmUgbWVzc2FnZXMgaW4geW91ciBicm93c2VyJ3MgPGI+SmF2YVNjcmlwdCBlcnJvciBsb2c8L2I+LiBQbGVhc2UgcmVwb3J0IHRoZSBwcm9ibGVtIGlmIHlvdSBzdXNwZWN0IHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnLjwvbGk+CiAgPC91bD4KPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5yZW1vdmVKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKCk7PC9zY3JpcHQ+Cgo8ZGl2IGlkPSJoZWFkZXIiPjwvZGl2Pgo8ZGl2IGlkPSJzdGF0aXN0aWNzLWNvbnRhaW5lciI+PC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgICB2YXIgdG9wc3VpdGUgPSB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgYWRkSmF2YVNjcmlwdERpc2FibGVkV2FybmluZyhlcnJvcik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW5pdExheW91dCh0b3BzdWl0ZS5uYW1lLCAnTG9nJyk7CiAgICBhZGRTdGF0aXN0aWNzKCk7CiAgICBhZGRFcnJvcnMoKTsKICAgIGFkZEV4ZWN1dGlvbkxvZyh0b3BzdWl0ZSk7CiAgICBhZGRMb2dMZXZlbFNlbGVjdG9yKHdpbmRvdy5zZXR0aW5nc1snbWluTGV2ZWwnXSwgd2luZG93LnNldHRpbmdzWydkZWZhdWx0TGV2ZWwnXSk7CiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpIHsKICAgICAgICBtYWtlRWxlbWVudFZpc2libGUod2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZXhwYW5kU3VpdGUodG9wc3VpdGUpOwogICAgfQp9KTsKCmZ1bmN0aW9uIGFkZExvZ0xldmVsU2VsZWN0b3IobWluTGV2ZWwsIGRlZmF1bHRMZXZlbCkgewogICAgdmFyIGNvbnRyb2xsZXIgPSBMb2dMZXZlbENvbnRyb2xsZXIobWluTGV2ZWwsIGRlZmF1bHRMZXZlbCk7CiAgICBpZiAoY29udHJvbGxlci5zaG93TG9nTGV2ZWxTZWxlY3RvcigpKSB7CiAgICAgICAgdmFyIHNlbGVjdG9yID0gJC50bXBsKCdsb2dMZXZlbFNlbGVjdG9yVGVtcGxhdGUnLCBjb250cm9sbGVyKTsKICAgICAgICBzZWxlY3Rvci5maW5kKCdzZWxlY3QnKS52YWwoY29udHJvbGxlci5kZWZhdWx0TG9nTGV2ZWwoKSk7CiAgICAgICAgc2VsZWN0b3IuYXBwZW5kVG8oJCgnI3RvcC1yaWdodC1oZWFkZXInKSk7CiAgICAgICAgJCgnI3JlcG9ydC1vci1sb2ctbGluaycpLmZpbmQoJ2EnKS5jc3Moeydib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzJzogJzAnfSk7CiAgICAgICAgc2V0TWVzc2FnZVZpc2liaWxpdHkoY29udHJvbGxlci5kZWZhdWx0TG9nTGV2ZWwoKSk7CiAgICB9Cn0KCmZ1bmN0aW9uIGFkZEVycm9ycygpIHsKICAgIHZhciBlcnJvcnMgPSB3aW5kb3cudGVzdGRhdGEuZXJyb3JJdGVyYXRvcigpOwogICAgaWYgKGVycm9ycy5oYXNOZXh0KCkpIHsKICAgICAgICAkLnRtcGwoJ2Vycm9ySGVhZGVyVGVtcGxhdGUnKS5hcHBlbmRUbygkKCdib2R5JykpOwogICAgICAgIGRyYXdFcnJvcnNSZWN1cnNpdmVseShlcnJvcnMsICQoJyNlcnJvcnMnKSk7CiAgICB9Cn0KCmZ1bmN0aW9uIGRyYXdFcnJvcnNSZWN1cnNpdmVseShlcnJvcnMsIHRhcmdldCkgewogICAgdmFyIGVsZW1lbnRzID0gcG9wRnJvbUl0ZXJhdG9yKGVycm9ycywgMTApOwogICAgJC50bXBsKCdlcnJvclRlbXBsYXRlJywgZWxlbWVudHMpLmFwcGVuZFRvKHRhcmdldCk7CiAgICBpZiAoZXJyb3JzLmhhc05leHQoKSkKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgZHJhd0Vycm9yc1JlY3Vyc2l2ZWx5KGVycm9ycywgdGFyZ2V0KTsgfSwgMCk7CiAgICBlbHNlIHsKICAgICAgICAvLyBFcnJvcnMgbWF5IGhhdmUgbW92ZWQgc2Nyb2xsIHBvc2l0aW9uLiBSZXNldHRpbmcgbG9jYXRpb24gcmUtc2Nyb2xscy4KICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpCiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHdpbmRvdy5sb2NhdGlvbi5oYXNoKTsKICAgICAgICBoaWdobGlnaHRMaW5rVGFyZ2V0KCk7CiAgICB9Cn0KCmZ1bmN0aW9uIGhpZ2hsaWdodExpbmtUYXJnZXQoKSB7CiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpIHsKICAgICAgICB2YXIgdGFyZ2V0ID0gJCh3aW5kb3cubG9jYXRpb24uaGFzaCk7CiAgICAgICAgaGlnaGxpZ2h0KHRhcmdldCk7CiAgICB9Cn0KCmZ1bmN0aW9uIGhpZ2hsaWdodChlbGVtZW50LCBjb2xvcikgewogICAgaWYgKGNvbG9yID09PSB1bmRlZmluZWQpCiAgICAgICAgY29sb3IgPSAyNDI7CiAgICBpZiAoY29sb3IgPCAyNTUpIHsKICAgICAgICBlbGVtZW50LmNzcyh7J2JhY2tncm91bmQtY29sb3InOiAncmdiKCcrY29sb3IrJywnK2NvbG9yKycsJytjb2xvcisnKSd9KTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgaGlnaGxpZ2h0KGVsZW1lbnQsIGNvbG9yKzEpOyB9LCAzMDApOwogICAgfSBlbHNlIHsKICAgICAgICBlbGVtZW50LmNzcyh7J2JhY2tncm91bmQtY29sb3InOiAnJ30pOwogICAgfQp9CgpmdW5jdGlvbiBwb3BGcm9tSXRlcmF0b3IoaXRlcmF0b3IsIHVwVG8pIHsKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkgPiAwICYmIHJlc3VsdC5sZW5ndGggPCB1cFRvKQogICAgICAgIHJlc3VsdC5wdXNoKGl0ZXJhdG9yLm5leHQoKSk7CiAgICByZXR1cm4gcmVzdWx0Owp9CgpmdW5jdGlvbiBtYWtlRWxlbWVudFZpc2libGUoaWQpIHsKICAgIHdpbmRvdy50ZXN0ZGF0YS5lbnN1cmVMb2FkZWQoaWQsIGZ1bmN0aW9uIChpZHMpIHsKICAgICAgICB1dGlsLm1hcChpZHMsIGV4cGFuZEVsZW1lbnRXaXRoSWQpOwogICAgICAgIGlmIChpZHMubGVuZ3RoKSB7CiAgICAgICAgICAgIGV4cGFuZENyaXRpY2FsRmFpbGVkKHdpbmRvdy50ZXN0ZGF0YS5maW5kTG9hZGVkKHV0aWwubGFzdChpZHMpKSk7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyc7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gaWQ7CiAgICAgICAgICAgIGhpZ2hsaWdodExpbmtUYXJnZXQoKTsKICAgICAgICB9CiAgICB9KTsKfQoKZnVuY3Rpb24gYWRkRXhlY3V0aW9uTG9nKG1haW4pIHsKICAgICQoJ2JvZHknKS5hcHBlbmQoJCh0ZXN0T3JUYXNrKCc8aDI+e1Rlc3R9IEV4ZWN1dGlvbiBMb2c8L2gyPicpKSwKICAgICAgICAgICAgICAgICAgICAgJC50bXBsKCdzdWl0ZVRlbXBsYXRlJywgbWFpbikpOwp9Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0b3RhbFN0YXRpc3RpY3NSb3dUZW1wbGF0ZSI+CiAgPHRyIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPHNwYW4+e3todG1sIGxhYmVsfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC90ZD4KICAgIHt7dG1wbCgkZGF0YSkgJ3N0YXRDb2x1bW5zVGVtcGxhdGUnfX0KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idGFnU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgY2xhc3M9InJvdy0keyRpdGVtLmluZGV4fSI+CiAgICA8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIiB0aXRsZT0ie3todG1sIGRvY319Ij4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8c3Bhbj57e2h0bWwgbGFiZWx9fTwvc3Bhbj4KICAgICAgICB7e2lmIGluZm99fSgke2luZm99KXt7L2lmfX0KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InRhZy1saW5rcyI+CiAgICAgICAge3tlYWNoIGxpbmtzfX0KICAgICAgICA8c3Bhbj5bPGEgaHJlZj0ie3todG1sICR2YWx1ZS51cmx9fSIgdGl0bGU9Int7aHRtbCAkdmFsdWUudXJsfX0iPnt7aHRtbCAkdmFsdWUudGl0bGV9fTwvYT5dPC9zcGFuPgogICAgICAgIHt7L2VhY2h9fQogICAgICA8L2Rpdj4KICAgIDwvdGQ+CiAgICB7e3RtcGwoJGRhdGEpICdzdGF0Q29sdW1uc1RlbXBsYXRlJ319CiAgPC90cj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1aXRlU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgb25jbGljaz0ibWFrZUVsZW1lbnRWaXNpYmxlKCcke2lkfScpIiBjbGFzcz0icm93LSR7JGl0ZW0uaW5kZXh9Ij4KICAgIDx0ZCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiIHRpdGxlPSJ7e2h0bWwgbGFiZWx9fSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPGEgaHJlZj0iIyR7aWR9Ij48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBmb3JtYXRQYXJlbnROYW1lfX08L3NwYW4+e3todG1sIG5hbWV9fTwvYT4KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJlcnJvckhlYWRlclRlbXBsYXRlIj4KICA8aDI+e3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX0gRXhlY3V0aW9uIEVycm9yczwvaDI+CiAgPHRhYmxlIGlkPSJlcnJvcnMiPjwvdGFibGU+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJlcnJvclRlbXBsYXRlIj4KICA8dHIgaWQ9IiR7aWR9IiBjbGFzcz0ibWVzc2FnZS1yb3ciPgogICAgPHRkIGNsYXNzPSJlcnJvci10aW1lIj4KICAgICAge3tpZiBsaW5rfX0KICAgICAgPGEgb25jbGljaz0ibWFrZUVsZW1lbnRWaXNpYmxlKCcke2xpbmt9JykiIGhyZWY9IiMke2xpbmt9IiB0aXRsZT0iTGluayB0byBkZXRhaWxzIj4ke2RhdGV9ICR7dGltZX08L2E+CiAgICAgIHt7ZWxzZX19CiAgICAgICR7ZGF0ZX0gJHt0aW1lfQogICAgICB7ey9pZn19CiAgICA8L3RkPgogICAgPHRkIGNsYXNzPSIke2xldmVsLnRvTG93ZXJDYXNlKCl9IGxldmVsIj48c3BhbiBjbGFzcz0ibGFiZWwgJHtsZXZlbC50b0xvd2VyQ2FzZSgpfSI+JHtsZXZlbH08L3NwYW4+PC90ZD4KICAgIDx0ZCBjbGFzcz0ibWVzc2FnZSI+e3todG1sIHRleHR9fTwvdGQ+CiAgICA8dGQgY2xhc3M9InNlbGVjdC1tZXNzYWdlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OnNlbGVjdE1lc3NhZ2UoJyR7aWR9JykiIHRpdGxlPSJTZWxlY3QgbWVzc2FnZSB0ZXh0Ij4KICAgICAgPGRpdj48L2Rpdj4KICAgIDwvdGQ+CiAgPC90cj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1aXRlVGVtcGxhdGUiPgogIDxkaXYgaWQ9IiR7aWR9IiBjbGFzcz0ic3VpdGUiPgogICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXIgY2xvc2VkIiBvbmNsaWNrPSJ0b2dnbGVTdWl0ZSgnJHtpZH0nKSI+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLWxlZnQiIHRpdGxlPSJ7e2h0bWwgZnVsbE5hbWV9fSI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImVsYXBzZWQiIHRpdGxlPSJFbGFwc2VkIHRpbWUiPiR7dGltZXMuZWxhcHNlZFRpbWV9PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJsYWJlbCAke3N0YXR1cy50b0xvd2VyQ2FzZSgpfSI+U1VJVEU8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPnt7aHRtbCBuYW1lfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1yaWdodCIgb25jbGljaz0ic3RvcFByb3BhZ2F0aW9uKGV2ZW50KSIgdGl0bGU9IiI+CiAgICAgICAgPGEgY2xhc3M9ImV4cGFuZCIgdGl0bGU9IkV4cGFuZCBhbGwiIGhyZWY9ImphdmFzY3JpcHQ6ZXhwYW5kQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImNvbGxhcHNlIiB0aXRsZT0iQ29sbGFwc2UgYWxsIiBocmVmPSJqYXZhc2NyaXB0OmNvbGxhcHNlQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImxpbmsiIHRpdGxlPSJMaW5rIHRvIHRoaXMgc3VpdGUiIGhyZWY9IiMke2lkfSIgb25jbGljaz0ibWFrZUVsZW1lbnRWaXNpYmxlKCcke2lkfScpIj48L2E+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci10b2dnbGUiIHRpdGxlPSJUb2dnbGUgdmlzaWJpbGl0eSI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNoaWxkcmVuIj4KICAgICAgPHRhYmxlIGNsYXNzPSJtZXRhZGF0YSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPkZ1bGwgTmFtZTo8L3RoPgogICAgICAgICAgPHRkPnt7aHRtbCBmdWxsTmFtZX19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7aWYgZG9jKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sIGRvYygpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIHt7ZWFjaCBtZXRhZGF0YX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPnt7aHRtbCAkdmFsdWVbMF19fTo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCAkdmFsdWVbMV19fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9lYWNofX0KICAgICAgICB7e2lmIHNvdXJjZX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlNvdXJjZTo8L3RoPgogICAgICAgICAge3tpZiByZWxhdGl2ZVNvdXJjZX19CiAgICAgICAgICA8dGQ+PGEgaHJlZj0iJHtyZWxhdGl2ZVNvdXJjZX0iPnt7aHRtbCBzb3VyY2V9fTwvYT48L3RkPgogICAgICAgICAge3tlbHNlfX0KICAgICAgICAgIDx0ZD57e2h0bWwgc291cmNlfX08L3RkPgogICAgICAgICAge3svaWZ9fQogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5TdGFydCAvIEVuZCAvIEVsYXBzZWQ6PC90aD4KICAgICAgICAgIDx0ZD4ke3RpbWVzLnN0YXJ0VGltZX0gLyAke3RpbWVzLmVuZFRpbWV9IC8gJHt0aW1lcy5lbGFwc2VkVGltZX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlN0YXR1czo8L3RoPgogICAgICAgICAgPHRkPnt7dG1wbCgkZGF0YSkgJ3N1aXRlU3RhdHVzTWVzc2FnZVRlbXBsYXRlJ319PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7aWYgbWVzc2FnZSgpfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+TWVzc2FnZTo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJtZXNzYWdlIj57e2h0bWwgbWVzc2FnZSgpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0ZXN0VGVtcGxhdGUiPgogIDxkaXYgaWQ9IiR7aWR9IiBjbGFzcz0idGVzdCI+CiAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlciBjbG9zZWQiIG9uY2xpY2s9InRvZ2dsZVRlc3QoJyR7aWR9JykiPgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1sZWZ0IiB0aXRsZT0ie3todG1sIGZ1bGxOYW1lfX0iPgogICAgICAgIDxzcGFuIGNsYXNzPSJlbGFwc2VkIiB0aXRsZT0iRWxhcHNlZCB0aW1lIj4ke3RpbWVzLmVsYXBzZWRUaW1lfTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0ibGFiZWwgJHtzdGF0dXMudG9Mb3dlckNhc2UoKX0iPnt7PSB0ZXN0T3JUYXNrKCd7VEVTVH0nKX19PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIj57e2h0bWwgbmFtZX19PC9zcGFuPgogICAgICAgIHt7aWYgIWlzQ3JpdGljYWx9fShub24tY3JpdGljYWwpe3svaWZ9fQogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXItcmlnaHQiIG9uY2xpY2s9InN0b3BQcm9wYWdhdGlvbihldmVudCkiIHRpdGxlPSIiPgogICAgICAgIDxhIGNsYXNzPSJleHBhbmQiIHRpdGxlPSJFeHBhbmQgYWxsIiBocmVmPSJqYXZhc2NyaXB0OmV4cGFuZEFsbCgnJHtpZH0nKSI+PC9hPgogICAgICAgIDxhIGNsYXNzPSJjb2xsYXBzZSIgdGl0bGU9IkNvbGxhcHNlIGFsbCIgaHJlZj0iamF2YXNjcmlwdDpjb2xsYXBzZUFsbCgnJHtpZH0nKSI+PC9hPgogICAgICAgIDxhIGNsYXNzPSJsaW5rIiB0aXRsZT0iTGluayB0byB0aGlzIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19IiBocmVmPSIjJHtpZH0iIG9uY2xpY2s9Im1ha2VFbGVtZW50VmlzaWJsZSgnJHtpZH0nKSI+PC9hPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXItdG9nZ2xlIiB0aXRsZT0iVG9nZ2xlIHZpc2liaWxpdHkiPjwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJjaGlsZHJlbiI+CiAgICAgIDx0YWJsZSBjbGFzcz0ibWV0YWRhdGEiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5GdWxsIE5hbWU6PC90aD4KICAgICAgICAgIDx0ZD57e2h0bWwgZnVsbE5hbWV9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7e2lmIGRvYygpfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+RG9jdW1lbnRhdGlvbjo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCBkb2MoKX19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgICB7e2lmIHRhZ3MubGVuZ3RofX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+VGFnczo8L3RoPgogICAgICAgICAgPHRkPnt7aHRtbCB0YWdzLmpvaW4oJywgJyl9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgICAge3tpZiB0aW1lb3V0fX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+VGltZW91dDo8L3RoPgogICAgICAgICAgPHRkPnt7aHRtbCB0aW1lb3V0fX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5TdGFydCAvIEVuZCAvIEVsYXBzZWQ6PC90aD4KICAgICAgICAgIDx0ZD4ke3RpbWVzLnN0YXJ0VGltZX0gLyAke3RpbWVzLmVuZFRpbWV9IC8gJHt0aW1lcy5lbGFwc2VkVGltZX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlN0YXR1czo8L3RoPgogICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPSJsYWJlbCAke3N0YXR1cy50b0xvd2VyQ2FzZSgpfSI+JHtzdGF0dXN9PC9zcGFuPiAoe3tpZiBpc0NyaXRpY2FsfX1jcml0aWNhbHt7ZWxzZX19bm9uLWNyaXRpY2Fse3svaWZ9fSk8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3tpZiBtZXNzYWdlKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5NZXNzYWdlOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9Im1lc3NhZ2UiPnt7aHRtbCBtZXNzYWdlKCl9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgIDwvdGFibGU+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9ImtleXdvcmRUZW1wbGF0ZSI+CiAgPGRpdiBpZD0iJHtpZH0iIGNsYXNzPSJrZXl3b3JkIj4KICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyIGNsb3NlZCIgb25jbGljaz0idG9nZ2xlS2V5d29yZCgnJHtpZH0nKSI+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLWxlZnQiIHRpdGxlPSJ7e2h0bWwgbmFtZX19Ij4KICAgICAgICA8c3BhbiBjbGFzcz0iZWxhcHNlZCIgdGl0bGU9IkVsYXBzZWQgdGltZSI+JHt0aW1lcy5lbGFwc2VkVGltZX08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImxhYmVsIGtleXdvcmQgJHtzdGF0dXMudG9Mb3dlckNhc2UoKX0iPiR7dHlwZX08L3NwYW4+CiAgICAgICAgPHNwYW4+e3todG1sIGFzc2lnbn19PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIj48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBsaWJuYW1lfX17e2lmIGxpYm5hbWV9fSAuIHt7L2lmfX08L3NwYW4+e3todG1sIG5hbWV9fTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iYXJnIj57e2h0bWwgYXJndW1lbnRzfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1yaWdodCIgb25jbGljaz0ic3RvcFByb3BhZ2F0aW9uKGV2ZW50KSI+CiAgICAgICAgPGEgY2xhc3M9ImV4cGFuZCIgdGl0bGU9IkV4cGFuZCBhbGwiIGhyZWY9ImphdmFzY3JpcHQ6ZXhwYW5kQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImNvbGxhcHNlIiB0aXRsZT0iQ29sbGFwc2UgYWxsIiBocmVmPSJqYXZhc2NyaXB0OmNvbGxhcHNlQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImxpbmsiIHRpdGxlPSJMaW5rIHRvIHRoaXMga2V5d29yZCIgaHJlZj0iIyR7aWR9IiBvbmNsaWNrPSJtYWtlRWxlbWVudFZpc2libGUoJyR7aWR9JykiPjwvYT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLXRvZ2dsZSIgdGl0bGU9IlRvZ2dsZSB2aXNpYmlsaXR5Ij48L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iY2hpbGRyZW4iPgogICAgICA8dGFibGUgY2xhc3M9Im1ldGFkYXRhIGtleXdvcmQtbWV0YWRhdGEiPgogICAgICAgIHt7aWYgZG9jKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sIGRvYygpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIHt7aWYgdGFnc319CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlRhZ3M6PC90aD4KICAgICAgICAgIDx0ZD57e2h0bWwgdGFnc319PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgICB7e2lmIHRpbWVvdXR9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5UaW1lb3V0OjwvdGg+CiAgICAgICAgICA8dGQ+e3todG1sIHRpbWVvdXR9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlN0YXJ0IC8gRW5kIC8gRWxhcHNlZDo8L3RoPgogICAgICAgICAgPHRkPiR7dGltZXMuc3RhcnRUaW1lfSAvICR7dGltZXMuZW5kVGltZX0gLyAke3RpbWVzLmVsYXBzZWRUaW1lfTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ibWVzc2FnZVRlbXBsYXRlIj4KICA8dGFibGUgaWQ9IiR7aWR9IiBjbGFzcz0ibWVzc2FnZXMgJHtsZXZlbC50b0xvd2VyQ2FzZSgpfS1tZXNzYWdlIj4KICAgIDx0ciBjbGFzcz0ibWVzc2FnZS1yb3ciPgogICAgICA8dGQgY2xhc3M9InRpbWUiPiR7dGltZX08L3RkPgogICAgICA8dGQgY2xhc3M9IiR7bGV2ZWwudG9Mb3dlckNhc2UoKX0gbGV2ZWwiPjxzcGFuIGNsYXNzPSJsYWJlbCAke2xldmVsLnRvTG93ZXJDYXNlKCl9Ij4ke2xldmVsfTwvc3Bhbj48L3RkPgogICAgICA8dGQgY2xhc3M9Im1lc3NhZ2UiPnt7aHRtbCB0ZXh0fX08L3RkPgogICAgICA8dGQgY2xhc3M9InNlbGVjdC1tZXNzYWdlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OnNlbGVjdE1lc3NhZ2UoJyR7aWR9JykiIHRpdGxlPSJTZWxlY3QgbWVzc2FnZSB0ZXh0Ij4KICAgICAgICA8ZGl2PjwvZGl2PgogICAgICA8L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ibG9nTGV2ZWxTZWxlY3RvclRlbXBsYXRlIj4KICA8ZGl2IGlkPSJsb2ctbGV2ZWwtc2VsZWN0b3IiPgogIExvZyBsZXZlbDoKICAgIDxzZWxlY3Qgb25jaGFuZ2U9ImxvZ0xldmVsU2VsZWN0ZWQodGhpcy5vcHRpb25zW3NlbGVjdGVkSW5kZXhdLnZhbHVlKSI+CiAgICAgIDxvcHRpb24gdmFsdWU9IjIiPklORk88L29wdGlvbj4KICAgICAgPG9wdGlvbiB2YWx1ZT0iMSI+REVCVUc8L29wdGlvbj4KICAgICAge3tpZiBzaG93VHJhY2UoKX19PG9wdGlvbiB2YWx1ZT0iMCI+VFJBQ0U8L29wdGlvbj57ey9pZn19CiAgICA8L3NlbGVjdD4KICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8L2JvZHk+CjwvaHRtbD4K';w.document.open();w.document.write(window.atob(d));w.document.close();var a=w.document.createElement('a');a.appendChild(w.document.createTextNode('Download'));a.href='data:text/html;base64,' + d;a.download='log.html';a.style='position:fixed;top:0;right:0;color:white;background:black;text-decoration:none;font-weight:bold;padding:7px 14px;border-radius:0 0 0 5px;';w.document.body.append(a);})(this);\">Log</a> | <a href=\"javascript:(function(el){var w=window.open();var d='PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJQcmFnbWEiIGNvbnRlbnQ9Im5vLWNhY2hlIj4KPG1ldGEgaHR0cC1lcXVpdj0iRXhwaXJlcyIgY29udGVudD0iLTEiPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgo8bWV0YSBjb250ZW50PSJSb2JvdCBGcmFtZXdvcmsgMy4xIChQeXRob24gMy42Ljggb24gbGludXgpIiBuYW1lPSJHZW5lcmF0b3IiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBRUFJQUJvQkFBQUZnQUFBQ2dBQUFBUUFBQUFJQUFBQUFFQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLY0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQXFBQUFBQUFBQUFBQUFBQUFBQUFBQUxJQUFBRC9BQUFBNEFBQUFOd0FBQURjQUFBQTNBQUFBTndBQUFEY0FBQUEzQUFBQU53QUFBRGNBQUFBNEFBQUFQOEFBQUN4QUFBQUFBQUFBS1lBQUFEL0FBQUF1d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQy9BQUFBL3dBQUFLa0FBQUQ2QUFBQXpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU44QUFBRC9BQUFBK2dBQUFNTUFBQUFBQUFBQUFnQUFBR3NBQUFCckFBQUFhd0FBQUdzQUFBQnJBQUFBYXdBQUFHc0FBQUJyQUFBQURBQUFBQUFBQUFEYUFBQUEvd0FBQVBvQUFBRERBQUFBQUFBQUFJc0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFORUFBQUFBQUFBQTJnQUFBUDhBQUFENkFBQUF3d0FBQUFBQUFBQUFBQUFBTWdBQUFESUFBQUF5QUFBQU1nQUFBRElBQUFBeUFBQUFNZ0FBQURJQUFBQUZBQUFBQUFBQUFOb0FBQUQvQUFBQStnQUFBTU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGFBQUFBL3dBQUFQb0FBQUREQUFBQUFBQUFBRHdBQUFCOEFBQUFBQUFBQUdBQUFBQmNBQUFBQUFBQUFIOEFBQUJLQUFBQUFBQUFBQUFBQUFBQUFBQUEyZ0FBQVA4QUFBRDZBQUFBd3dBQUFBQUFBQURDQUFBQS93QUFBQ2tBQUFEcUFBQUE0UUFBQUFBQUFBRDdBQUFBL3dBQUFMQUFBQUFHQUFBQUFBQUFBTm9BQUFEL0FBQUErZ0FBQU1NQUFBQUFBQUFBSXdBQUFQNEFBQUQvQUFBQS93QUFBR0FBQUFBQUFBQUFBQUFBQU1rQUFBRC9BQUFBaWdBQUFBQUFBQURhQUFBQS93QUFBUG9BQUFEREFBQUFBQUFBQUFBQUFBQUlBQUFBY0FBQUFCa0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFZ0FBQUFBQUFBQUFBQUFBMmdBQUFQOEFBQUQ3QUFBQXl3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU40QUFBRC9BQUFBcXdBQUFQOEFBQUN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTElBQUFEL0FBQUFzZ0FBQUFBQUFBQzVBQUFBL3dBQUFNb0FBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNa0FBQUQvQUFBQXZBQUFBQUFBQUFBQUFBQUFBQUFBQUt3QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBclFBQUFBQUFBQUFBd0FNQUFJQUJBQUFmK0FBQVAvd0FBRC84QUFBZ0JBQUFQL3dBQUQvOEFBQS8vQUFBSkl3QUFESEVBQUEvL0FBQVAvd0FBQi80QUFDQUFRQUF3QU1BQUE9PSI+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+Ci8qIEdlbmVyaWMgYW5kIG1pc2Mgc3R5bGVzICovCmJvZHkgewogICAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICBjb2xvcjogYmxhY2s7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQp0YWJsZSB7CiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDFlbTsKfQp0aCwgdGQgewogICAgdmVydGljYWwtYWxpZ246IHRvcDsKfQpiciB7CiAgICBtc28tZGF0YS1wbGFjZW1lbnQ6IHNhbWUtY2VsbDsgLyogbWFpbnRhaW4gbGluZSBicmVha3MgaW4gRXhjZWwgKi8KfQpociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KYSwgYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6ICMxNWM7Cn0KYSA+IGltZyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTVjICFpbXBvcnRhbnQ7Cn0KYTpob3ZlciwgYTphY3RpdmUgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICBjb2xvcjogIzYxYzsKfQoucGFyZW50LW5hbWUgewogICAgZm9udC1zaXplOiAwLjdlbTsKICAgIGxldHRlci1zcGFjaW5nOiAtMC4wN2VtOwp9Ci5tZXNzYWdlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQovKiBIZWFkZXJzICovCiNoZWFkZXIgewogICAgd2lkdGg6IDY1ZW07CiAgICBoZWlnaHQ6IDNlbTsKICAgIG1hcmdpbjogNnB4IDA7Cn0KaDEgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBtYXJnaW46IDAgMCAwLjVlbSAwOwogICAgd2lkdGg6IDc1JTsKfQpoMiB7CiAgICBjbGVhcjogbGVmdDsKfQojZ2VuZXJhdGVkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLyogRG9jdW1lbnRhdGlvbiBoZWFkZXJzICovCi5kb2MgPiBoMiB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9Ci5kb2MgPiBoMyB7CiAgICBmb250LXNpemU6IDEuMWVtOwp9Ci5kb2MgPiBoNCB7CiAgICBmb250LXNpemU6IDEuMGVtOwp9Ci8qIFN0YXR1cyB0ZXh0IGNvbG9ycyAtLSAhaW1wb3J0YW50IGFsbG93cyB1c2luZyB0aGVtIGluIGxpbmtzICovCi5mYWlsIHsKICAgIGNvbG9yOiAjZjMzICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoucGFzcyB7CiAgICBjb2xvcjogIzM5MyAhaW1wb3J0YW50Owp9Ci5sYWJlbCB7CiAgICBwYWRkaW5nOiAycHggNXB4OwogICAgZm9udC1zaXplOiAwLjc1ZW07CiAgICBsZXR0ZXItc3BhY2luZzogMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KLmxhYmVsLmRlYnVnLCAubGFiZWwudHJhY2UsIC5sYWJlbC5lcnJvciwgLmxhYmVsLmtleXdvcmQgewogICAgbGV0dGVyLXNwYWNpbmc6IDA7Cn0KLmxhYmVsLmVycm9yLCAubGFiZWwuZmFpbCwgLmxhYmVsLnBhc3MsIC5sYWJlbC53YXJuIHsKICAgIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoubGFiZWwuZXJyb3IsIC5sYWJlbC5mYWlsIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOTUzNGY7Cn0KLmxhYmVsLnBhc3MgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzVjYjg1YzsKfQoubGFiZWwud2FybiB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWM5NzFmOwp9Ci8qIFRvcCByaWdodCBoZWFkZXIgKi8KI3RvcC1yaWdodC1oZWFkZXIgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgcmlnaHQ6IDA7CiAgICB6LWluZGV4OiAxMDAwOwogICAgd2lkdGg6IDEyZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KI3JlcG9ydC1vci1sb2ctbGluayBhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogYmxhY2s7CiAgICBjb2xvcjogd2hpdGU7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKICAgIHBhZGRpbmc6IDAuM2VtIDA7CiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7Cn0KI3JlcG9ydC1vci1sb2ctbGluayBhOmhvdmVyIHsKICAgIGNvbG9yOiAjZGRkOwp9CiNsb2ctbGV2ZWwtc2VsZWN0b3IgewogICAgcGFkZGluZzogMC4zZW0gMDsKICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiAjZGRkOwp9Ci8qIFN0YXRpc3RpY3MgdGFibGUgKi8KLnN0YXRpc3RpY3MgewogICAgd2lkdGg6IDY1ZW07CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBtYXJnaW4tYm90dG9tOiAxZW07Cn0KLnN0YXRpc3RpY3MgdHI6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Y0ZjRmNDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQouc3RhdGlzdGljcyB0aCwgLnN0YXRpc3RpY3MgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwp9Ci5zdGF0aXN0aWNzIHRoIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICBwYWRkaW5nOiAwLjJlbSAwLjNlbTsKfQouc3RhdGlzdGljcyB0ZCB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9Ci5zdGF0cy1jb2wtc3RhdCB7CiAgICB3aWR0aDogNC41ZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLnN0YXRzLWNvbC1lbGFwc2VkIHsKICAgIHdpZHRoOiA1LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc3RhdHMtY29sLWdyYXBoIHsKICAgIHdpZHRoOiA5ZW07Cn0KdGguc3RhdHMtY29sLWdyYXBoOmhvdmVyIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQouc3RhdC1uYW1lIHsKICAgIGZsb2F0OiBsZWZ0Owp9Ci5zdGF0LW5hbWUgYSwgLnN0YXQtbmFtZSBzcGFuIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci50YWctbGlua3MgewogICAgZm9udC1zaXplOiAwLjllbTsKICAgIGZsb2F0OiByaWdodDsKICAgIG1hcmdpbi10b3A6IDAuMDVlbTsKfQoudGFnLWxpbmtzIHNwYW4gewogICAgbWFyZ2luLWxlZnQ6IDAuMmVtOwp9Ci8qIFN0YXRpc3RpY3MgZ3JhcGggKi8KLmdyYXBoLCAuZW1wdHktZ3JhcGggewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHdpZHRoOiBhdXRvOwogICAgaGVpZ2h0OiA3cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYmFja2dyb3VuZDogI2YzMzsKfQouZW1wdHktZ3JhcGggewogICAgYmFja2dyb3VuZDogI2VlZTsKfQoucGFzcy1iYXIsIC5mYWlsLWJhciB7CiAgICBmbG9hdDogbGVmdDsKICAgIGhlaWdodDogMTAwJTsKfQoucGFzcy1iYXIgewogICAgYmFja2dyb3VuZDogIzFkNDsKfQovKiBUYWJsZXNvcnRlciAtIGFkYXB0ZWQgZnJvbSBwcm92aWRlZCBCbHVlIFNraW4gKi8KLnRhYmxlc29ydGVyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQ3dBSkFJQUFBSDkvZndBQUFDSDVCQUVBQUFFQUxBQUFBQUFMQUFrQUFBSVJqQU9uQnIzY25JcjBXVWpUckM5ZTlCUUFPdz09KTsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgcmlnaHQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLnRhYmxlc29ydGVyLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Ci50YWJsZXNvcnRlci1oZWFkZXJBc2MgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBS0VBQUFBQUFIOS9md0FBQUFBQUFDSDVCQUVBQUFJQUxBQUFBQUFMQUFrQUFBSVVsQlduRnIzY25JcjBXUU95Qm12enAxM0NweFFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjICFpbXBvcnRhbnQ7Cn0KLnRhYmxlc29ydGVyLWhlYWRlckRlc2MgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBS0VBQUFBQUFIOS9md0FBQUFBQUFDSDVCQUVBQUFJQUxBQUFBQUFMQUFrQUFBSVVsQVduQnIzY25JcjBXUk95RG12enAxM0NweFFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjICFpbXBvcnRhbnQ7Cn0KLnNvcnRlci1mYWxzZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5zb3J0ZXItZmFsc2U6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgovKiBHZW5lcmljIHRhYmxlIHN0eWxlcyAqLwp0YWJsZSB7CiAgICBtYXJnaW46IDAgMXB4OwogICAgYmFja2dyb3VuZDogd2hpdGU7Cn0KdHIgewogICAgYmFja2dyb3VuZDogd2hpdGU7Cn0KdGggewogICAgYmFja2dyb3VuZDogI2RkZDsKICAgIGNvbG9yOiBibGFjazsKfQovKiBTdW1tYXJ5IGFuZCB0b3RhbC90YWcvc3VpdGUgZGV0YWlscyAqLwouZGV0YWlscyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGNsZWFyOiBib3RoOwogICAgd2lkdGg6IDY1ZW07CiAgICBtYXJnaW4tYm90dG9tOiAxZW07Cn0KLmRldGFpbHMgdGggewogICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICB3aWR0aDogMTBlbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgIHBhZGRpbmc6IDAuMmVtIDAuNGVtOwp9Ci5kZXRhaWxzIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICBwYWRkaW5nOiAwLjJlbSAwLjRlbTsKfQouc2VsZWN0b3IgdGgsIC5zZWxlY3RvciB0ZCB7CiAgICBwYWRkaW5nLXRvcDogMC41ZW07CiAgICBwYWRkaW5nLWJvdHRvbTogMC41ZW07CiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwp9Ci5maXJzdC1zZWxlY3RvciB0aCwgLmZpcnN0LXNlbGVjdG9yIHRkewogICAgcGFkZGluZy1ib3R0b206IDAuMmVtOwp9Ci5taWRkbGUtc2VsZWN0b3IgdGgsIC5taWRkbGUtc2VsZWN0b3IgdGQgewogICAgcGFkZGluZy10b3A6IDAuMmVtOwogICAgcGFkZGluZy1ib3R0b206IDAuMmVtOwp9Ci5sYXN0LXNlbGVjdG9yIHRoLCAubGFzdC1zZWxlY3RvciB0ZHsKICAgIHBhZGRpbmctdG9wOiAwLjJlbTsKfQojcHJpbnQtc2VsZWN0b3IgewogICAgZGlzcGxheTogbm9uZTsKfQovKiBTZWFyY2ggKi8KI3NlYXJjaC1zdWl0ZSwgI3NlYXJjaC10ZXN0LCAjc2VhcmNoLWluY2x1ZGUsICNzZWFyY2gtZXhjbHVkZSB7CiAgICB3aWR0aDogMjVlbTsKfQojc2VhcmNoIGE6aG92ZXIgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CiNzZWFyY2gtaGVscCBkaXYgewogICAgbWFyZ2luOiAwLjVlbSAwLjVlbSAwLjdlbSAwOwogICAgcGFkZGluZzogMC43ZW07CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQojc2VhcmNoLWhlbHAgaDMsICNzZWFyY2gtaGVscCBwIHsKICAgIG1hcmdpbjogMCAwIDAuN2VtIDA7Cn0KLnNlYXJjaC1oZWxwLWV4YW1wbGVzIHsKICAgIHRhYmxlLWxheW91dDogYXV0bzsKICAgIHdpZHRoOiAxMDAlOwp9Ci5zZWFyY2gtaGVscC1leGFtcGxlcywgLnNlYXJjaC1oZWxwLWV4YW1wbGVzIHRyLAouc2VhcmNoLWhlbHAtZXhhbXBsZXMgdGgsIC5zZWFyY2gtaGVscC1leGFtcGxlcyB0ZCB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIG1hcmdpbjogMDsKfQouc2VhcmNoLWhlbHAtZXhhbXBsZXMgdGgsIC5zZWFyY2gtaGVscC1leGFtcGxlcyB0ZCB7CiAgICBwYWRkaW5nOiAwLjJlbSAwLjdlbSAwLjJlbSAwOwp9Ci5oZWxwLWl0ZW0gewogICAgd2lkdGg6IDEwJTsKfQouaGVscC1leHBsYW5hdGlvbiB7CiAgICB3aWR0aDogNjUlOwp9Ci5oZWxwLWV4YW1wbGVzIHsKICAgIHdpZHRoOiAyNSU7Cn0KLyogVGFicyAtIGFkYXB0ZWQgZnJvbSBodHRwOi8vd3d3Lmh0bWxkb2cuY29tL2FydGljbGVzL3RhYnMgKi8KI2RldGFpbC10YWJzIHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luOiAwIDFlbTsKfQouZGV0YWlsLXRhYiB7CiAgICBmbG9hdDogbGVmdDsKICAgIGJhY2tncm91bmQ6ICNkZGQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDsKICAgIG1hcmdpbjogMCAwLjVlbSAwIDA7CiAgICBwYWRkaW5nLXRvcDogMC4xZW07CiAgICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDsKfQouZGV0YWlsLXRhYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwp9Ci5kZXRhaWwtdGFiIGEgewogICAgY29sb3I6IGJsYWNrOwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBwYWRkaW5nOiAwIDFlbTsKfQouZGV0YWlsLXRhYi1zZWxlY3RlZCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0b3A6IDFweDsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9Ci5kZXRhaWwtdGFiLXNlbGVjdGVkOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9Ci8qIFRlc3QgZGV0YWlscyB0YWJsZSAqLwojdGVzdC1kZXRhaWxzIHsKICAgIHdpZHRoOiAxMDAlOwogICAgYm9yZGVyLXNwYWNpbmc6IDFweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2M7Cn0KI3Rlc3QtZGV0YWlscyA+IHRib2R5ID4gdHI6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Y0ZjRmNDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQojdGVzdC1kZXRhaWxzIHRoLCAjdGVzdC1kZXRhaWxzIHRkIHsKICAgIHBhZGRpbmc6IDAuMmVtOwp9Ci5kZXRhaWxzLWxpbWl0ZWQgewogICAgbWF4LWhlaWdodDogMjBlbTsKICAgIG92ZXJmbG93OiBhdXRvOwp9Ci5kZXRhaWxzLWNvbC1oZWFkZXIgewogICAgcGFkZGluZy1yaWdodDogMWVtOwp9Ci5kZXRhaWxzLWNvbC10b2dnbGUgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBjb2xvcjogIzZjNmM2YzsgLyogc2FtZSBhcyBpbiBzb3J0IGljb24gKi8KICAgIGN1cnNvcjogcG9pbnRlcjsKfQouZGV0YWlscy1jb2wtdG9nZ2xlOmhvdmVyIHsKICAgIGNvbG9yOiBibGFjazsKfQouZGV0YWlscy1jb2wtbmFtZSB7CiAgICBtaW4td2lkdGg6IDIwZW07CiAgICBmb250LXdlaWdodDogYm9sZDsKfQouZGV0YWlscy1jb2wtZG9jIHsKICAgIG1pbi13aWR0aDogMTBlbTsKfQouZGV0YWlscy1jb2wtdGFncyB7CiAgICBtaW4td2lkdGg6IDEwZW07Cn0KLmRldGFpbHMtY29sLWNyaXQgewogICAgd2lkdGg6IDMuNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5kZXRhaWxzLWNvbC1zdGF0dXMgewogICAgd2lkdGg6IDQuNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5kZXRhaWxzLWNvbC1tc2cgewogICAgbWluLXdpZHRoOiAyMGVtOwp9Ci5kZXRhaWxzLWNvbC1lbGFwc2VkIHsKICAgIHdpZHRoOiA3ZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLmRldGFpbHMtY29sLXRpbWVzIHsKICAgIHdpZHRoOiAxMWVtOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouaGlkZGVuIC5kZXRhaWxzLWNvbC1oZWFkZXIsIHRkLmhpZGRlbiA+IGRpdiB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5oaWRkZW4gewogICAgd2lkdGg6IDEzcHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwp9CnRoLmhpZGRlbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Cjwvc3R5bGU+CjxzdHlsZSBtZWRpYT0icHJpbnQiIHR5cGU9InRleHQvY3NzIj4KYm9keSB7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogOHB0Owp9CmE6bGluaywgYTp2aXNpdGVkIHsKICAgIGNvbG9yOiBibGFjazsKfQojaGVhZGVyIHsKICAgIHdpZHRoOiBhdXRvOwp9Ci5kZXRhaWxzLCAuc3RhdGlzdGljcyB7CiAgICB3aWR0aDogMTAwJTsKfQojZ2VuZXJhdGVkLWFnbywgI3RvcC1yaWdodC1oZWFkZXIsICNub3JtYWwtc2VsZWN0b3IsICNzZWFyY2gtYnV0dG9ucywKLmZvbGRpbmctYnV0dG9uLCAuZXhwYW5kLCAuaGlkZGVuLCAuZGV0YWlscy1jb2wtdG9nZ2xlIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLmVsZW1lbnQtaGVhZGVyLXRleHQsIC5jaGlsZHJlbiB7CiAgICBtYXJnaW46IDA7Cn0KI3Rlc3QtZGV0YWlscyB7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgdGFibGUtbGF5b3V0OiBhdXRvOwp9CiN0ZXN0LWRldGFpbHMgdGgsICN0ZXN0LWRldGFpbHMgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Cn0KLmRldGFpbHMtY29sLWhlYWRlciB7CiAgICBwYWRkaW5nOiAwOwp9CiNwcmludC1zZWxlY3RvciB7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwp9Ci50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGJhY2tncm91bmQ6ICNkZGQgIWltcG9ydGFudDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgojamF2YXNjcmlwdC1kaXNhYmxlZCB7CiAgICB3aWR0aDogNjAwcHg7CiAgICBtYXJnaW46IDEwMHB4IGF1dG8gMCBhdXRvOwogICAgcGFkZGluZzogMjBweDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9CiNqYXZhc2NyaXB0LWRpc2FibGVkIGgxIHsKICAgIHdpZHRoOiAxMDAlOwogICAgZmxvYXQ6IG5vbmU7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgdWwgewogICAgZm9udC1zaXplOiAxLjJlbTsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCBsaSB7CiAgICBtYXJnaW46IDAuNWVtIDA7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgYiB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLmRvYyA+ICogewogICAgbWFyZ2luOiAwLjdlbSAxZW0gMC4xZW0gMWVtOwogICAgcGFkZGluZzogMDsKfQouZG9jID4gcCwgLmRvYyA+IGgxLCAuZG9jID4gaDIsIC5kb2MgPiBoMywgLmRvYyA+IGg0IHsKICAgIG1hcmdpbjogMC43ZW0gMCAwLjFlbSAwOwp9Ci5kb2MgPiAqOmZpcnN0LWNoaWxkIHsKICAgIG1hcmdpbi10b3A6IDAuMWVtOwp9Ci5kb2MgdGFibGUgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGVtcHR5LWNlbGxzOiBzaG93OwogICAgZm9udC1zaXplOiAwLjllbTsKfQouZG9jIHRhYmxlIHRoLCAuZG9jIHRhYmxlIHRkIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwogICAgaGVpZ2h0OiAxLjJlbTsKfQouZG9jIHRhYmxlIHRoIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKfQouZG9jIHByZSB7CiAgICBmb250LXNpemU6IDEuMWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgIGJhY2tncm91bmQ6ICNmNGY0ZjQ7Cn0KLmRvYyBjb2RlIHsKICAgIHBhZGRpbmc6IDAgMC4yZW07CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgYmFja2dyb3VuZDogI2VlZTsKfQouZG9jIGxpIHsKICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsKICAgIGxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwp9Ci5kb2MgaW1nIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmRvYyBociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KPC9zdHlsZT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKiEgalF1ZXJ5IHYzLjMuMSB8IChjKSBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiOyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUuZG9jdW1lbnQ/dChlLCEwKTpmdW5jdGlvbihlKXtpZighZS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gdChlKX06dChlKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7dmFyIG49W10scj1lLmRvY3VtZW50LGk9T2JqZWN0LmdldFByb3RvdHlwZU9mLG89bi5zbGljZSxhPW4uY29uY2F0LHM9bi5wdXNoLHU9bi5pbmRleE9mLGw9e30sYz1sLnRvU3RyaW5nLGY9bC5oYXNPd25Qcm9wZXJ0eSxwPWYudG9TdHJpbmcsZD1wLmNhbGwoT2JqZWN0KSxoPXt9LGc9ZnVuY3Rpb24gZSh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmIm51bWJlciIhPXR5cGVvZiB0Lm5vZGVUeXBlfSx5PWZ1bmN0aW9uIGUodCl7cmV0dXJuIG51bGwhPXQmJnQ9PT10LndpbmRvd30sdj17dHlwZTohMCxzcmM6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIG0oZSx0LG4pe3ZhciBpLG89KHQ9dHx8cikuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoby50ZXh0PWUsbilmb3IoaSBpbiB2KW5baV0mJihvW2ldPW5baV0pO3QuaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2xbYy5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9dmFyIGI9IjMuMy4xIix3PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyB3LmZuLmluaXQoZSx0KX0sVD0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7dy5mbj13LnByb3RvdHlwZT17anF1ZXJ5OiIzLjMuMSIsY29uc3RydWN0b3I6dyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIG8uY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP28uY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHR9LGVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcubWFwKHRoaXMsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHQsbix0KX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soby5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKyhlPDA/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobj49MCYmbjx0P1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpzLHNvcnQ6bi5zb3J0LHNwbGljZTpuLnNwbGljZX0sdy5leHRlbmQ9dy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8sYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGw9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fGcoYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKW49YVt0XSxhIT09KHI9ZVt0XSkmJihsJiZyJiYody5pc1BsYWluT2JqZWN0KHIpfHwoaT1BcnJheS5pc0FycmF5KHIpKSk/KGk/KGk9ITEsbz1uJiZBcnJheS5pc0FycmF5KG4pP246W10pOm89biYmdy5pc1BsYWluT2JqZWN0KG4pP246e30sYVt0XT13LmV4dGVuZChsLG8scikpOnZvaWQgMCE9PXImJihhW3RdPXIpKTtyZXR1cm4gYX0sdy5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKCIzLjMuMSIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4hKCFlfHwiW29iamVjdCBPYmplY3RdIiE9PWMuY2FsbChlKSkmJighKHQ9aShlKSl8fCJmdW5jdGlvbiI9PXR5cGVvZihuPWYuY2FsbCh0LCJjb25zdHJ1Y3RvciIpJiZ0LmNvbnN0cnVjdG9yKSYmcC5jYWxsKG4pPT09ZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbihlKXttKGUpfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2lmKEMoZSkpe2ZvcihuPWUubGVuZ3RoO3I8bjtyKyspaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrfWVsc2UgZm9yKHIgaW4gZSlpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWs7cmV0dXJuIGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6KGUrIiIpLnJlcGxhY2UoVCwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoQyhPYmplY3QoZSkpP3cubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOnMuY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTp1LmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0rdC5sZW5ndGgscj0wLGk9ZS5sZW5ndGg7cjxuO3IrKyllW2krK109dFtyXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIsaT1bXSxvPTAsYT1lLmxlbmd0aCxzPSFuO288YTtvKyspKHI9IXQoZVtvXSxvKSkhPT1zJiZpLnB1c2goZVtvXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPTAscz1bXTtpZihDKGUpKWZvcihyPWUubGVuZ3RoO288cjtvKyspbnVsbCE9KGk9dChlW29dLG8sbikpJiZzLnB1c2goaSk7ZWxzZSBmb3IobyBpbiBlKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmcy5wdXNoKGkpO3JldHVybiBhLmFwcGx5KFtdLHMpfSxndWlkOjEsc3VwcG9ydDpofSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKHcuZm5bU3ltYm9sLml0ZXJhdG9yXT1uW1N5bWJvbC5pdGVyYXRvcl0pLHcuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtsWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIEMoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49eChlKTtyZXR1cm4hZyhlKSYmIXkoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmdD4wJiZ0LTEgaW4gZSl9dmFyIEU9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHMsdSxsLGMsZixwLGQsaCxnLHksdixtLHgsYj0ic2l6emxlIisxKm5ldyBEYXRlLHc9ZS5kb2N1bWVudCxUPTAsQz0wLEU9YWUoKSxrPWFlKCksUz1hZSgpLEQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihmPSEwKSwwfSxOPXt9Lmhhc093blByb3BlcnR5LEE9W10saj1BLnBvcCxxPUEucHVzaCxMPUEucHVzaCxIPUEuc2xpY2UsTz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX0sUD0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLFI9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixJPSJcXFsiK00rIiooIitSKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrUisiKSl8KSIrTSsiKlxcXSIsVz0iOigiK1IrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK0krIikqKXwuKilcXCl8KSIsJD1uZXcgUmVnRXhwKE0rIisiLCJnIiksQj1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLEY9bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSxfPW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksej1uZXcgUmVnRXhwKCI9IitNKyIqKFteXFxdJ1wiXSo/KSIrTSsiKlxcXSIsImciKSxYPW5ldyBSZWdFeHAoVyksVT1uZXcgUmVnRXhwKCJeIitSKyIkIiksVj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitSKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK1IrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK1IrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitJKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrVyksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitNKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitNKyIqKD86KFsrLV18KSIrTSsiKihcXGQrKXwpKSIrTSsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrUCsiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK00rIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrTSsiKigoPzotXFxkKT9cXGQqKSIrTSsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sRz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFk9L15oXGQkL2ksUT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sSj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLEs9L1srfl0vLFo9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitNKyI/fCgiK00rIil8LikiLCJpZyIpLGVlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iMHgiK3QtNjU1MzY7cmV0dXJuIHIhPT1yfHxuP3Q6cjwwP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShyPj4xMHw1NTI5NiwxMDIzJnJ8NTYzMjApfSx0ZT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxuZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PyJcMCI9PT1lPyJcdWZmZmQiOmUuc2xpY2UoMCwtMSkrIlxcIitlLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2V9LHJlPWZ1bmN0aW9uKCl7cCgpfSxpZT1tZShmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJigiZm9ybSJpbiBlfHwibGFiZWwiaW4gZSl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7TC5hcHBseShBPUguY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksQVt3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtMPXthcHBseTpBLmxlbmd0aD9mdW5jdGlvbihlLHQpe3EuYXBwbHkoZSxILmNhbGwodCkpfTpmdW5jdGlvbihlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDt3aGlsZShlW24rK109dFtyKytdKTtlLmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBvZShlLHQscixpKXt2YXIgbyxzLGwsYyxmLGgsdixtPXQmJnQub3duZXJEb2N1bWVudCxUPXQ/dC5ub2RlVHlwZTo5O2lmKHI9cnx8W10sInN0cmluZyIhPXR5cGVvZiBlfHwhZXx8MSE9PVQmJjkhPT1UJiYxMSE9PVQpcmV0dXJuIHI7aWYoIWkmJigodD90Lm93bmVyRG9jdW1lbnR8fHQ6dykhPT1kJiZwKHQpLHQ9dHx8ZCxnKSl7aWYoMTEhPT1UJiYoZj1KLmV4ZWMoZSkpKWlmKG89ZlsxXSl7aWYoOT09PVQpe2lmKCEobD10LmdldEVsZW1lbnRCeUlkKG8pKSlyZXR1cm4gcjtpZihsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZSBpZihtJiYobD1tLmdldEVsZW1lbnRCeUlkKG8pKSYmeCh0LGwpJiZsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZXtpZihmWzJdKXJldHVybiBMLmFwcGx5KHIsdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkscjtpZigobz1mWzNdKSYmbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZ0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEwuYXBwbHkocix0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobykpLHJ9aWYobi5xc2EmJiFTW2UrIiAiXSYmKCF5fHwheS50ZXN0KGUpKSl7aWYoMSE9PVQpbT10LHY9ZTtlbHNlIGlmKCJvYmplY3QiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXsoYz10LmdldEF0dHJpYnV0ZSgiaWQiKSk/Yz1jLnJlcGxhY2UodGUsbmUpOnQuc2V0QXR0cmlidXRlKCJpZCIsYz1iKSxzPShoPWEoZSkpLmxlbmd0aDt3aGlsZShzLS0paFtzXT0iIyIrYysiICIrdmUoaFtzXSk7dj1oLmpvaW4oIiwiKSxtPUsudGVzdChlKSYmZ2UodC5wYXJlbnROb2RlKXx8dH1pZih2KXRyeXtyZXR1cm4gTC5hcHBseShyLG0ucXVlcnlTZWxlY3RvckFsbCh2KSkscn1jYXRjaChlKXt9ZmluYWxseXtjPT09YiYmdC5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gdShlLnJlcGxhY2UoQiwiJDEiKSx0LHIsaSl9ZnVuY3Rpb24gYWUoKXt2YXIgZT1bXTtmdW5jdGlvbiB0KG4saSl7cmV0dXJuIGUucHVzaChuKyIgIik+ci5jYWNoZUxlbmd0aCYmZGVsZXRlIHRbZS5zaGlmdCgpXSx0W24rIiAiXT1pfXJldHVybiB0fWZ1bmN0aW9uIHNlKGUpe3JldHVybiBlW2JdPSEwLGV9ZnVuY3Rpb24gdWUoZSl7dmFyIHQ9ZC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGxlKGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLGk9bi5sZW5ndGg7d2hpbGUoaS0tKXIuYXR0ckhhbmRsZVtuW2ldXT10fWZ1bmN0aW9uIGNlKGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBmZShlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gcGUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PW58fCJidXR0b24iPT09bikmJnQudHlwZT09PWV9fWZ1bmN0aW9uIGRlKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4iZm9ybSJpbiB0P3QucGFyZW50Tm9kZSYmITE9PT10LmRpc2FibGVkPyJsYWJlbCJpbiB0PyJsYWJlbCJpbiB0LnBhcmVudE5vZGU/dC5wYXJlbnROb2RlLmRpc2FibGVkPT09ZTp0LmRpc2FibGVkPT09ZTp0LmlzRGlzYWJsZWQ9PT1lfHx0LmlzRGlzYWJsZWQhPT0hZSYmaWUodCk9PT1lOnQuZGlzYWJsZWQ9PT1lOiJsYWJlbCJpbiB0JiZ0LmRpc2FibGVkPT09ZX19ZnVuY3Rpb24gaGUoZSl7cmV0dXJuIHNlKGZ1bmN0aW9uKHQpe3JldHVybiB0PSt0LHNlKGZ1bmN0aW9uKG4scil7dmFyIGksbz1lKFtdLG4ubGVuZ3RoLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKW5baT1vW2FdXSYmKG5baV09IShyW2ldPW5baV0pKX0pfSl9ZnVuY3Rpb24gZ2UoZSl7cmV0dXJuIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1uPW9lLnN1cHBvcnQ9e30sbz1vZS5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuISF0JiYiSFRNTCIhPT10Lm5vZGVOYW1lfSxwPW9lLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0LGksYT1lP2Uub3duZXJEb2N1bWVudHx8ZTp3O3JldHVybiBhIT09ZCYmOT09PWEubm9kZVR5cGUmJmEuZG9jdW1lbnRFbGVtZW50PyhkPWEsaD1kLmRvY3VtZW50RWxlbWVudCxnPSFvKGQpLHchPT1kJiYoaT1kLmRlZmF1bHRWaWV3KSYmaS50b3AhPT1pJiYoaS5hZGRFdmVudExpc3RlbmVyP2kuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixyZSwhMSk6aS5hdHRhY2hFdmVudCYmaS5hdHRhY2hFdmVudCgib251bmxvYWQiLHJlKSksbi5hdHRyaWJ1dGVzPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsYXNzTmFtZT0iaSIsIWUuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLG4uZ2V0RWxlbWVudHNCeVRhZ05hbWU9dWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXBwZW5kQ2hpbGQoZC5jcmVhdGVDb21tZW50KCIiKSksIWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxuLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9US50ZXN0KGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksbi5nZXRCeUlkPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBoLmFwcGVuZENoaWxkKGUpLmlkPWIsIWQuZ2V0RWxlbWVudHNCeU5hbWV8fCFkLmdldEVsZW1lbnRzQnlOYW1lKGIpLmxlbmd0aH0pLG4uZ2V0QnlJZD8oci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0sci5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09dH19LHIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG4scixpLG89dC5nZXRFbGVtZW50QnlJZChlKTtpZihvKXtpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb119cmV0dXJuW119fSksci5maW5kLlRBRz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6bi5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sci5maW5kLkNMQVNTPW4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZylyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfSx2PVtdLHk9W10sKG4ucXNhPVEudGVzdChkLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKHVlKGZ1bmN0aW9uKGUpe2guYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitiKyInPjwvYT48c2VsZWN0IGlkPSciK2IrIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmeS5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8eS5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK1ArIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitiKyItXSIpLmxlbmd0aHx8eS5wdXNoKCJ+PSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHkucHVzaCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitiKyIrKiIpLmxlbmd0aHx8eS5wdXNoKCIuIy4rWyt+XSIpfSksdWUoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIHQ9ZC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3Quc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmeS5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ5LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksaC5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnkucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx5LnB1c2goIiwuKjoiKX0pKSwobi5tYXRjaGVzU2VsZWN0b3I9US50ZXN0KG09aC5tYXRjaGVzfHxoLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8aC5tb3pNYXRjaGVzU2VsZWN0b3J8fGgub01hdGNoZXNTZWxlY3Rvcnx8aC5tc01hdGNoZXNTZWxlY3RvcikpJiZ1ZShmdW5jdGlvbihlKXtuLmRpc2Nvbm5lY3RlZE1hdGNoPW0uY2FsbChlLCIqIiksbS5jYWxsKGUsIltzIT0nJ106eCIpLHYucHVzaCgiIT0iLFcpfSkseT15Lmxlbmd0aCYmbmV3IFJlZ0V4cCh5LmpvaW4oInwiKSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSksdD1RLnRlc3QoaC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikseD10fHxRLnRlc3QoaC5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxEPXQ/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gZj0hMCwwO3ZhciByPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiByfHwoMSYocj0oZS5vd25lckRvY3VtZW50fHxlKT09PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSl8fCFuLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PXI/ZT09PWR8fGUub3duZXJEb2N1bWVudD09PXcmJngodyxlKT8tMTp0PT09ZHx8dC5vd25lckRvY3VtZW50PT09dyYmeCh3LHQpPzE6Yz9PKGMsZSktTyhjLHQpOjA6NCZyPy0xOjEpfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBmPSEwLDA7dmFyIG4scj0wLGk9ZS5wYXJlbnROb2RlLG89dC5wYXJlbnROb2RlLGE9W2VdLHM9W3RdO2lmKCFpfHwhbylyZXR1cm4gZT09PWQ/LTE6dD09PWQ/MTppPy0xOm8/MTpjP08oYyxlKS1PKGMsdCk6MDtpZihpPT09bylyZXR1cm4gY2UoZSx0KTtuPWU7d2hpbGUobj1uLnBhcmVudE5vZGUpYS51bnNoaWZ0KG4pO249dDt3aGlsZShuPW4ucGFyZW50Tm9kZSlzLnVuc2hpZnQobik7d2hpbGUoYVtyXT09PXNbcl0pcisrO3JldHVybiByP2NlKGFbcl0sc1tyXSk6YVtyXT09PXc/LTE6c1tyXT09PXc/MTowfSxkKTpkfSxvZS5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG9lKGUsbnVsbCxudWxsLHQpfSxvZS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSx0KXtpZigoZS5vd25lckRvY3VtZW50fHxlKSE9PWQmJnAoZSksdD10LnJlcGxhY2UoeiwiPSckMSddIiksbi5tYXRjaGVzU2VsZWN0b3ImJmcmJiFTW3QrIiAiXSYmKCF2fHwhdi50ZXN0KHQpKSYmKCF5fHwheS50ZXN0KHQpKSl0cnl7dmFyIHI9bS5jYWxsKGUsdCk7aWYocnx8bi5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiByfWNhdGNoKGUpe31yZXR1cm4gb2UodCxkLG51bGwsW2VdKS5sZW5ndGg+MH0sb2UuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS5vd25lckRvY3VtZW50fHxlKSE9PWQmJnAoZSkseChlLHQpfSxvZS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPT1kJiZwKGUpO3ZhciBpPXIuYXR0ckhhbmRsZVt0LnRvTG93ZXJDYXNlKCldLG89aSYmTi5jYWxsKHIuYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP2koZSx0LCFnKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PW8/bzpuLmF0dHJpYnV0ZXN8fCFnP2UuZ2V0QXR0cmlidXRlKHQpOihvPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJm8uc3BlY2lmaWVkP28udmFsdWU6bnVsbH0sb2UuZXNjYXBlPWZ1bmN0aW9uKGUpe3JldHVybihlKyIiKS5yZXBsYWNlKHRlLG5lKX0sb2UuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSxvZS51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LHI9W10saT0wLG89MDtpZihmPSFuLmRldGVjdER1cGxpY2F0ZXMsYz0hbi5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydChEKSxmKXt3aGlsZSh0PWVbbysrXSl0PT09ZVtvXSYmKGk9ci5wdXNoKG8pKTt3aGlsZShpLS0pZS5zcGxpY2UocltpXSwxKX1yZXR1cm4gYz1udWxsLGV9LGk9b2UuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9MCxvPWUubm9kZVR5cGU7aWYobyl7aWYoMT09PW98fDk9PT1vfHwxMT09PW8pe2lmKCJzdHJpbmciPT10eXBlb2YgZS50ZXh0Q29udGVudClyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9aShlKX1lbHNlIGlmKDM9PT1vfHw0PT09bylyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSB3aGlsZSh0PWVbcisrXSluKz1pKHQpO3JldHVybiBufSwocj1vZS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpzZSxtYXRjaDpWLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnJlcGxhY2UoWixlZSksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UoWixlZSksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fG9lLmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJm9lLmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzZdJiZlWzJdO3JldHVybiBWLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXT9lWzJdPWVbNF18fGVbNV18fCIiOm4mJlgudGVzdChuKSYmKHQ9YShuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoWixlZSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9RVtlKyIgIl07cmV0dXJuIHR8fCh0PW5ldyBSZWdFeHAoIihefCIrTSsiKSIrZSsiKCIrTSsifCQpIikpJiZFKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdCgic3RyaW5nIj09dHlwZW9mIGUuY2xhc3NOYW1lJiZlLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIGk9b2UuYXR0cihyLGUpO3JldHVybiBudWxsPT1pPyIhPSI9PT10OiF0fHwoaSs9IiIsIj0iPT09dD9pPT09bjoiIT0iPT09dD9pIT09bjoiXj0iPT09dD9uJiYwPT09aS5pbmRleE9mKG4pOiIqPSI9PT10P24mJmkuaW5kZXhPZihuKT4tMToiJD0iPT09dD9uJiZpLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT10PygiICIraS5yZXBsYWNlKCQsIiAiKSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PXQmJihpPT09bnx8aS5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSIpKX19LENISUxEOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89Im50aCIhPT1lLnNsaWNlKDAsMyksYT0ibGFzdCIhPT1lLnNsaWNlKC00KSxzPSJvZi10eXBlIj09PXQ7cmV0dXJuIDE9PT1yJiYwPT09aT9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24odCxuLHUpe3ZhciBsLGMsZixwLGQsaCxnPW8hPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIseT10LnBhcmVudE5vZGUsdj1zJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbT0hdSYmIXMseD0hMTtpZih5KXtpZihvKXt3aGlsZShnKXtwPXQ7d2hpbGUocD1wW2ddKWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09djoxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtoPWc9Im9ubHkiPT09ZSYmIWgmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoaD1bYT95LmZpcnN0Q2hpbGQ6eS5sYXN0Q2hpbGRdLGEmJm0pe3g9KGQ9KGw9KGM9KGY9KHA9eSlbYl18fChwW2JdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbZV18fFtdKVswXT09PVQmJmxbMV0pJiZsWzJdLHA9ZCYmeS5jaGlsZE5vZGVzW2RdO3doaWxlKHA9KytkJiZwJiZwW2ddfHwoeD1kPTApfHxoLnBvcCgpKWlmKDE9PT1wLm5vZGVUeXBlJiYrK3gmJnA9PT10KXtjW2VdPVtULGQseF07YnJlYWt9fWVsc2UgaWYobSYmKHg9ZD0obD0oYz0oZj0ocD10KVtiXXx8KHBbYl09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVtlXXx8W10pWzBdPT09VCYmbFsxXSksITE9PT14KXdoaWxlKHA9KytkJiZwJiZwW2ddfHwoeD1kPTApfHxoLnBvcCgpKWlmKChzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXY6MT09PXAubm9kZVR5cGUpJiYrK3gmJihtJiYoKGM9KGY9cFtiXXx8KHBbYl09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVtlXT1bVCx4XSkscD09PXQpKWJyZWFrO3JldHVybih4LT1pKT09PXJ8fHglcj09MCYmeC9yPj0wfX19LFBTRVVETzpmdW5jdGlvbihlLHQpe3ZhciBuLGk9ci5wc2V1ZG9zW2VdfHxyLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8b2UuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIitlKTtyZXR1cm4gaVtiXT9pKHQpOmkubGVuZ3RoPjE/KG49W2UsZSwiIix0XSxyLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT9zZShmdW5jdGlvbihlLG4pe3ZhciByLG89aShlLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKWVbcj1PKGUsb1thXSldPSEobltyXT1vW2FdKX0pOmZ1bmN0aW9uKGUpe3JldHVybiBpKGUsMCxuKX0pOml9fSxwc2V1ZG9zOntub3Q6c2UoZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1bXSxyPXMoZS5yZXBsYWNlKEIsIiQxIikpO3JldHVybiByW2JdP3NlKGZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLGE9cihlLG51bGwsaSxbXSkscz1lLmxlbmd0aDt3aGlsZShzLS0pKG89YVtzXSkmJihlW3NdPSEodFtzXT1vKSl9KTpmdW5jdGlvbihlLGksbyl7cmV0dXJuIHRbMF09ZSxyKHQsbnVsbCxvLG4pLHRbMF09bnVsbCwhbi5wb3AoKX19KSxoYXM6c2UoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBvZShlLHQpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOnNlKGZ1bmN0aW9uKGUpe3JldHVybiBlPWUucmVwbGFjZShaLGVlKSxmdW5jdGlvbih0KXtyZXR1cm4odC50ZXh0Q29udGVudHx8dC5pbm5lclRleHR8fGkodCkpLmluZGV4T2YoZSk+LTF9fSksbGFuZzpzZShmdW5jdGlvbihlKXtyZXR1cm4gVS50ZXN0KGV8fCIiKXx8b2UuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrZSksZT1lLnJlcGxhY2UoWixlZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXt2YXIgbjtkb3tpZihuPWc/dC5sYW5nOnQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHx0LmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybihuPW4udG9Mb3dlckNhc2UoKSk9PT1lfHwwPT09bi5pbmRleE9mKGUrIi0iKX13aGlsZSgodD10LnBhcmVudE5vZGUpJiYxPT09dC5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKHQpe3ZhciBuPWUubG9jYXRpb24mJmUubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PXQuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1ofSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWQuYWN0aXZlRWxlbWVudCYmKCFkLmhhc0ZvY3VzfHxkLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmRlKCExKSxkaXNhYmxlZDpkZSghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIXIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBZLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBHLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PXQudG9Mb3dlckNhc2UoKSl9LGZpcnN0OmhlKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpoZShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6aGUoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjpoZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpoZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OmhlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOy0tcj49MDspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6aGUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0pLnBzZXVkb3MubnRoPXIucHNldWRvcy5lcTtmb3IodCBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlyLnBzZXVkb3NbdF09ZmUodCk7Zm9yKHQgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlyLnBzZXVkb3NbdF09cGUodCk7ZnVuY3Rpb24geWUoKXt9eWUucHJvdG90eXBlPXIuZmlsdGVycz1yLnBzZXVkb3Msci5zZXRGaWx0ZXJzPW5ldyB5ZSxhPW9lLnRva2VuaXplPWZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLGEscyx1LGwsYz1rW2UrIiAiXTtpZihjKXJldHVybiB0PzA6Yy5zbGljZSgwKTtzPWUsdT1bXSxsPXIucHJlRmlsdGVyO3doaWxlKHMpe24mJiEoaT1GLmV4ZWMocykpfHwoaSYmKHM9cy5zbGljZShpWzBdLmxlbmd0aCl8fHMpLHUucHVzaChvPVtdKSksbj0hMSwoaT1fLmV4ZWMocykpJiYobj1pLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6aVswXS5yZXBsYWNlKEIsIiAiKX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2ZvcihhIGluIHIuZmlsdGVyKSEoaT1WW2FdLmV4ZWMocykpfHxsW2FdJiYhKGk9bFthXShpKSl8fChuPWkuc2hpZnQoKSxvLnB1c2goe3ZhbHVlOm4sdHlwZTphLG1hdGNoZXM6aX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P3MubGVuZ3RoOnM/b2UuZXJyb3IoZSk6ayhlLHUpLnNsaWNlKDApfTtmdW5jdGlvbiB2ZShlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoLHI9IiI7dDxuO3QrKylyKz1lW3RdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIG1lKGUsdCxuKXt2YXIgcj10LmRpcixpPXQubmV4dCxvPWl8fHIsYT1uJiYicGFyZW50Tm9kZSI9PT1vLHM9QysrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixpKXt3aGlsZSh0PXRbcl0paWYoMT09PXQubm9kZVR5cGV8fGEpcmV0dXJuIGUodCxuLGkpO3JldHVybiExfTpmdW5jdGlvbih0LG4sdSl7dmFyIGwsYyxmLHA9W1Qsc107aWYodSl7d2hpbGUodD10W3JdKWlmKCgxPT09dC5ub2RlVHlwZXx8YSkmJmUodCxuLHUpKXJldHVybiEwfWVsc2Ugd2hpbGUodD10W3JdKWlmKDE9PT10Lm5vZGVUeXBlfHxhKWlmKGY9dFtiXXx8KHRbYl09e30pLGM9Zlt0LnVuaXF1ZUlEXXx8KGZbdC51bmlxdWVJRF09e30pLGkmJmk9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpdD10W3JdfHx0O2Vsc2V7aWYoKGw9Y1tvXSkmJmxbMF09PT1UJiZsWzFdPT09cylyZXR1cm4gcFsyXT1sWzJdO2lmKGNbb109cCxwWzJdPWUodCxuLHUpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB4ZShlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5jdGlvbih0LG4scil7dmFyIGk9ZS5sZW5ndGg7d2hpbGUoaS0tKWlmKCFlW2ldKHQsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06ZVswXX1mdW5jdGlvbiBiZShlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKW9lKGUsdFtyXSxuKTtyZXR1cm4gbn1mdW5jdGlvbiB3ZShlLHQsbixyLGkpe2Zvcih2YXIgbyxhPVtdLHM9MCx1PWUubGVuZ3RoLGw9bnVsbCE9dDtzPHU7cysrKShvPWVbc10pJiYobiYmIW4obyxyLGkpfHwoYS5wdXNoKG8pLGwmJnQucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIFRlKGUsdCxuLHIsaSxvKXtyZXR1cm4gciYmIXJbYl0mJihyPVRlKHIpKSxpJiYhaVtiXSYmKGk9VGUoaSxvKSksc2UoZnVuY3Rpb24obyxhLHMsdSl7dmFyIGwsYyxmLHA9W10sZD1bXSxoPWEubGVuZ3RoLGc9b3x8YmUodHx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLHk9IWV8fCFvJiZ0P2c6d2UoZyxwLGUscyx1KSx2PW4/aXx8KG8/ZTpofHxyKT9bXTphOnk7aWYobiYmbih5LHYscyx1KSxyKXtsPXdlKHYsZCkscihsLFtdLHMsdSksYz1sLmxlbmd0aDt3aGlsZShjLS0pKGY9bFtjXSkmJih2W2RbY11dPSEoeVtkW2NdXT1mKSl9aWYobyl7aWYoaXx8ZSl7aWYoaSl7bD1bXSxjPXYubGVuZ3RoO3doaWxlKGMtLSkoZj12W2NdKSYmbC5wdXNoKHlbY109Zik7aShudWxsLHY9W10sbCx1KX1jPXYubGVuZ3RoO3doaWxlKGMtLSkoZj12W2NdKSYmKGw9aT9PKG8sZik6cFtjXSk+LTEmJihvW2xdPSEoYVtsXT1mKSl9fWVsc2Ugdj13ZSh2PT09YT92LnNwbGljZShoLHYubGVuZ3RoKTp2KSxpP2kobnVsbCxhLHYsdSk6TC5hcHBseShhLHYpfSl9ZnVuY3Rpb24gQ2UoZSl7Zm9yKHZhciB0LG4saSxvPWUubGVuZ3RoLGE9ci5yZWxhdGl2ZVtlWzBdLnR5cGVdLHM9YXx8ci5yZWxhdGl2ZVsiICJdLHU9YT8xOjAsYz1tZShmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9LHMsITApLGY9bWUoZnVuY3Rpb24oZSl7cmV0dXJuIE8odCxlKT4tMX0scywhMCkscD1bZnVuY3Rpb24oZSxuLHIpe3ZhciBpPSFhJiYocnx8biE9PWwpfHwoKHQ9bikubm9kZVR5cGU/YyhlLG4scik6ZihlLG4scikpO3JldHVybiB0PW51bGwsaX1dO3U8bzt1KyspaWYobj1yLnJlbGF0aXZlW2VbdV0udHlwZV0pcD1bbWUoeGUocCksbildO2Vsc2V7aWYoKG49ci5maWx0ZXJbZVt1XS50eXBlXS5hcHBseShudWxsLGVbdV0ubWF0Y2hlcykpW2JdKXtmb3IoaT0rK3U7aTxvO2krKylpZihyLnJlbGF0aXZlW2VbaV0udHlwZV0pYnJlYWs7cmV0dXJuIFRlKHU+MSYmeGUocCksdT4xJiZ2ZShlLnNsaWNlKDAsdS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbdS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKEIsIiQxIiksbix1PGkmJkNlKGUuc2xpY2UodSxpKSksaTxvJiZDZShlPWUuc2xpY2UoaSkpLGk8byYmdmUoZSkpfXAucHVzaChuKX1yZXR1cm4geGUocCl9ZnVuY3Rpb24gRWUoZSx0KXt2YXIgbj10Lmxlbmd0aD4wLGk9ZS5sZW5ndGg+MCxvPWZ1bmN0aW9uKG8sYSxzLHUsYyl7dmFyIGYsaCx5LHY9MCxtPSIwIix4PW8mJltdLGI9W10sdz1sLEM9b3x8aSYmci5maW5kLlRBRygiKiIsYyksRT1UKz1udWxsPT13PzE6TWF0aC5yYW5kb20oKXx8LjEsaz1DLmxlbmd0aDtmb3IoYyYmKGw9YT09PWR8fGF8fGMpO20hPT1rJiZudWxsIT0oZj1DW21dKTttKyspe2lmKGkmJmYpe2g9MCxhfHxmLm93bmVyRG9jdW1lbnQ9PT1kfHwocChmKSxzPSFnKTt3aGlsZSh5PWVbaCsrXSlpZih5KGYsYXx8ZCxzKSl7dS5wdXNoKGYpO2JyZWFrfWMmJihUPUUpfW4mJigoZj0heSYmZikmJnYtLSxvJiZ4LnB1c2goZikpfWlmKHYrPW0sbiYmbSE9PXYpe2g9MDt3aGlsZSh5PXRbaCsrXSl5KHgsYixhLHMpO2lmKG8pe2lmKHY+MCl3aGlsZShtLS0peFttXXx8YlttXXx8KGJbbV09ai5jYWxsKHUpKTtiPXdlKGIpfUwuYXBwbHkodSxiKSxjJiYhbyYmYi5sZW5ndGg+MCYmdit0Lmxlbmd0aD4xJiZvZS51bmlxdWVTb3J0KHUpfXJldHVybiBjJiYoVD1FLGw9dykseH07cmV0dXJuIG4/c2Uobyk6b31yZXR1cm4gcz1vZS5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPVtdLG89U1tlKyIgIl07aWYoIW8pe3R8fCh0PWEoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKShvPUNlKHRbbl0pKVtiXT9yLnB1c2gobyk6aS5wdXNoKG8pOyhvPVMoZSxFZShpLHIpKSkuc2VsZWN0b3I9ZX1yZXR1cm4gb30sdT1vZS5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4saSl7dmFyIG8sdSxsLGMsZixwPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLGQ9IWkmJmEoZT1wLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1kLmxlbmd0aCl7aWYoKHU9ZFswXT1kWzBdLnNsaWNlKDApKS5sZW5ndGg+MiYmIklEIj09PShsPXVbMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZnJiZyLnJlbGF0aXZlW3VbMV0udHlwZV0pe2lmKCEodD0oci5maW5kLklEKGwubWF0Y2hlc1swXS5yZXBsYWNlKFosZWUpLHQpfHxbXSlbMF0pKXJldHVybiBuO3AmJih0PXQucGFyZW50Tm9kZSksZT1lLnNsaWNlKHUuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfW89Vi5uZWVkc0NvbnRleHQudGVzdChlKT8wOnUubGVuZ3RoO3doaWxlKG8tLSl7aWYobD11W29dLHIucmVsYXRpdmVbYz1sLnR5cGVdKWJyZWFrO2lmKChmPXIuZmluZFtjXSkmJihpPWYobC5tYXRjaGVzWzBdLnJlcGxhY2UoWixlZSksSy50ZXN0KHVbMF0udHlwZSkmJmdlKHQucGFyZW50Tm9kZSl8fHQpKSl7aWYodS5zcGxpY2UobywxKSwhKGU9aS5sZW5ndGgmJnZlKHUpKSlyZXR1cm4gTC5hcHBseShuLGkpLG47YnJlYWt9fX1yZXR1cm4ocHx8cyhlLGQpKShpLHQsIWcsbiwhdHx8Sy50ZXN0KGUpJiZnZSh0LnBhcmVudE5vZGUpfHx0KSxufSxuLnNvcnRTdGFibGU9Yi5zcGxpdCgiIikuc29ydChEKS5qb2luKCIiKT09PWIsbi5kZXRlY3REdXBsaWNhdGVzPSEhZixwKCksbi5zb3J0RGV0YWNoZWQ9dWUoZnVuY3Rpb24oZSl7cmV0dXJuIDEmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksdWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8bGUoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGUsdCxuKXtpZighbilyZXR1cm4gZS5nZXRBdHRyaWJ1dGUodCwidHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/MToyKX0pLG4uYXR0cmlidXRlcyYmdWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8aW5wdXQvPiIsZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8bGUoInZhbHVlIixmdW5jdGlvbihlLHQsbil7aWYoIW4mJiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGUuZGVmYXVsdFZhbHVlfSksdWUoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGxlKFAsZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKCFuKXJldHVybiEwPT09ZVt0XT90LnRvTG93ZXJDYXNlKCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSksb2V9KGUpO3cuZmluZD1FLHcuZXhwcj1FLnNlbGVjdG9ycyx3LmV4cHJbIjoiXT13LmV4cHIucHNldWRvcyx3LnVuaXF1ZVNvcnQ9dy51bmlxdWU9RS51bmlxdWVTb3J0LHcudGV4dD1FLmdldFRleHQsdy5pc1hNTERvYz1FLmlzWE1MLHcuY29udGFpbnM9RS5jb250YWlucyx3LmVzY2FwZVNlbGVjdG9yPUUuZXNjYXBlO3ZhciBrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxpPXZvaWQgMCE9PW47d2hpbGUoKGU9ZVt0XSkmJjkhPT1lLm5vZGVUeXBlKWlmKDE9PT1lLm5vZGVUeXBlKXtpZihpJiZ3KGUpLmlzKG4pKWJyZWFrO3IucHVzaChlKX1yZXR1cm4gcn0sUz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXTtlO2U9ZS5uZXh0U2libGluZykxPT09ZS5ub2RlVHlwZSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn0sRD13LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O2Z1bmN0aW9uIE4oZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfXZhciBBPS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIGooZSx0LG4pe3JldHVybiBnKHQpP3cuZ3JlcChlLGZ1bmN0aW9uKGUscil7cmV0dXJuISF0LmNhbGwoZSxyLGUpIT09bn0pOnQubm9kZVR5cGU/dy5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10IT09bn0pOiJzdHJpbmciIT10eXBlb2YgdD93LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gdS5jYWxsKHQsZSk+LTEhPT1ufSk6dy5maWx0ZXIodCxlLG4pfXcuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP3cuZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106dy5maW5kLm1hdGNoZXMoZSx3LmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LHcuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayh3KGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7dDxyO3QrKylpZih3LmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKXcuZmluZChlLGlbdF0sbik7cmV0dXJuIHI+MT93LnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITApKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFqKHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZELnRlc3QoZSk/dyhlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBxLEw9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsody5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxvO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8cSwic3RyaW5nIj09dHlwZW9mIGUpe2lmKCEoaT0iPCI9PT1lWzBdJiYiPiI9PT1lW2UubGVuZ3RoLTFdJiZlLmxlbmd0aD49Mz9bbnVsbCxlLG51bGxdOkwuZXhlYyhlKSl8fCFpWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoaVsxXSl7aWYodD10IGluc3RhbmNlb2Ygdz90WzBdOnQsdy5tZXJnZSh0aGlzLHcucGFyc2VIVE1MKGlbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6ciwhMCkpLEEudGVzdChpWzFdKSYmdy5pc1BsYWluT2JqZWN0KHQpKWZvcihpIGluIHQpZyh0aGlzW2ldKT90aGlzW2ldKHRbaV0pOnRoaXMuYXR0cihpLHRbaV0pO3JldHVybiB0aGlzfXJldHVybihvPXIuZ2V0RWxlbWVudEJ5SWQoaVsyXSkpJiYodGhpc1swXT1vLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOmcoZSk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KGUpOmUodyk6dy5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT13LmZuLHE9dyhyKTt2YXIgSD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxPPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O3cuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9dyhlLHRoaXMpLG49dC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxuO2UrKylpZih3LmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT0ic3RyaW5nIiE9dHlwZW9mIGUmJncoZSk7aWYoIUQudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZ3LmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKG8ubGVuZ3RoPjE/dy51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/dS5jYWxsKHcoZSksdGhpc1swXSk6dS5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayh3LnVuaXF1ZVNvcnQody5tZXJnZSh0aGlzLmdldCgpLHcoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSk7ZnVuY3Rpb24gUChlLHQpe3doaWxlKChlPWVbdF0pJiYxIT09ZS5ub2RlVHlwZSk7cmV0dXJuIGV9dy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gayhlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gUChlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBQKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGsoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGsoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBrKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBTKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gUyhlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gTihlLCJpZnJhbWUiKT9lLmNvbnRlbnREb2N1bWVudDooTihlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLHcubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24obixyKXt2YXIgaT13Lm1hcCh0aGlzLHQsbik7cmV0dXJuIlVudGlsIiE9PWUuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihpPXcuZmlsdGVyKHIsaSkpLHRoaXMubGVuZ3RoPjEmJihPW2VdfHx3LnVuaXF1ZVNvcnQoaSksSC50ZXN0KGUpJiZpLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2soaSl9fSk7dmFyIE09L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBSKGUpe3ZhciB0PXt9O3JldHVybiB3LmVhY2goZS5tYXRjaChNKXx8W10sZnVuY3Rpb24oZSxuKXt0W25dPSEwfSksdH13LkNhbGxiYWNrcz1mdW5jdGlvbihlKXtlPSJzdHJpbmciPT10eXBlb2YgZT9SKGUpOncuZXh0ZW5kKHt9LGUpO3ZhciB0LG4scixpLG89W10sYT1bXSxzPS0xLHU9ZnVuY3Rpb24oKXtmb3IoaT1pfHxlLm9uY2Uscj10PSEwO2EubGVuZ3RoO3M9LTEpe249YS5zaGlmdCgpO3doaWxlKCsrczxvLmxlbmd0aCkhMT09PW9bc10uYXBwbHkoblswXSxuWzFdKSYmZS5zdG9wT25GYWxzZSYmKHM9by5sZW5ndGgsbj0hMSl9ZS5tZW1vcnl8fChuPSExKSx0PSExLGkmJihvPW4/W106IiIpfSxsPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG4mJiF0JiYocz1vLmxlbmd0aC0xLGEucHVzaChuKSksZnVuY3Rpb24gdChuKXt3LmVhY2gobixmdW5jdGlvbihuLHIpe2cocik/ZS51bmlxdWUmJmwuaGFzKHIpfHxvLnB1c2gocik6ciYmci5sZW5ndGgmJiJzdHJpbmciIT09eChyKSYmdChyKX0pfShhcmd1bWVudHMpLG4mJiF0JiZ1KCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB3LmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGUsdCl7dmFyIG47d2hpbGUoKG49dy5pbkFycmF5KHQsbyxuKSk+LTEpby5zcGxpY2UobiwxKSxuPD1zJiZzLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/dy5pbkFycmF5KGUsbyk+LTE6by5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG89W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gaT1hPVtdLG89bj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFvfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9YT1bXSxufHx0fHwobz1uPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWl9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsbil7cmV0dXJuIGl8fChuPVtlLChuPW58fFtdKS5zbGljZT9uLnNsaWNlKCk6bl0sYS5wdXNoKG4pLHR8fHUoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBsLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBsfTtmdW5jdGlvbiBJKGUpe3JldHVybiBlfWZ1bmN0aW9uIFcoZSl7dGhyb3cgZX1mdW5jdGlvbiAkKGUsdCxuLHIpe3ZhciBpO3RyeXtlJiZnKGk9ZS5wcm9taXNlKT9pLmNhbGwoZSkuZG9uZSh0KS5mYWlsKG4pOmUmJmcoaT1lLnRoZW4pP2kuY2FsbChlLHQsbik6dC5hcHBseSh2b2lkIDAsW2VdLnNsaWNlKHIpKX1jYXRjaChlKXtuLmFwcGx5KHZvaWQgMCxbZV0pfX13LmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24odCl7dmFyIG49W1sibm90aWZ5IiwicHJvZ3Jlc3MiLHcuQ2FsbGJhY2tzKCJtZW1vcnkiKSx3LkNhbGxiYWNrcygibWVtb3J5IiksMl0sWyJyZXNvbHZlIiwiZG9uZSIsdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMCwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLHI9InBlbmRpbmciLGk9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBvLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sImNhdGNoIjpmdW5jdGlvbihlKXtyZXR1cm4gaS50aGVuKG51bGwsZSl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7cmV0dXJuIHcuRGVmZXJyZWQoZnVuY3Rpb24odCl7dy5lYWNoKG4sZnVuY3Rpb24obixyKXt2YXIgaT1nKGVbcls0XV0pJiZlW3JbNF1dO29bclsxXV0oZnVuY3Rpb24oKXt2YXIgZT1pJiZpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlJiZnKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkucHJvZ3Jlc3ModC5ub3RpZnkpLmRvbmUodC5yZXNvbHZlKS5mYWlsKHQucmVqZWN0KTp0W3JbMF0rIldpdGgiXSh0aGlzLGk/W2VdOmFyZ3VtZW50cyl9KX0pLGU9bnVsbH0pLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbih0LHIsaSl7dmFyIG89MDtmdW5jdGlvbiBhKHQsbixyLGkpe3JldHVybiBmdW5jdGlvbigpe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMsbD1mdW5jdGlvbigpe3ZhciBlLGw7aWYoISh0PG8pKXtpZigoZT1yLmFwcGx5KHMsdSkpPT09bi5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7bD1lJiYoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJmUudGhlbixnKGwpP2k/bC5jYWxsKGUsYShvLG4sSSxpKSxhKG8sbixXLGkpKToobysrLGwuY2FsbChlLGEobyxuLEksaSksYShvLG4sVyxpKSxhKG8sbixJLG4ubm90aWZ5V2l0aCkpKToociE9PUkmJihzPXZvaWQgMCx1PVtlXSksKGl8fG4ucmVzb2x2ZVdpdGgpKHMsdSkpfX0sYz1pP2w6ZnVuY3Rpb24oKXt0cnl7bCgpfWNhdGNoKGUpe3cuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYmdy5EZWZlcnJlZC5leGNlcHRpb25Ib29rKGUsYy5zdGFja1RyYWNlKSx0KzE+PW8mJihyIT09VyYmKHM9dm9pZCAwLHU9W2VdKSxuLnJlamVjdFdpdGgocyx1KSl9fTt0P2MoKToody5EZWZlcnJlZC5nZXRTdGFja0hvb2smJihjLnN0YWNrVHJhY2U9dy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksZS5zZXRUaW1lb3V0KGMpKX19cmV0dXJuIHcuRGVmZXJyZWQoZnVuY3Rpb24oZSl7blswXVszXS5hZGQoYSgwLGUsZyhpKT9pOkksZS5ub3RpZnlXaXRoKSksblsxXVszXS5hZGQoYSgwLGUsZyh0KT90OkkpKSxuWzJdWzNdLmFkZChhKDAsZSxnKHIpP3I6VykpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lP3cuZXh0ZW5kKGUsaSk6aX19LG89e307cmV0dXJuIHcuZWFjaChuLGZ1bmN0aW9uKGUsdCl7dmFyIGE9dFsyXSxzPXRbNV07aVt0WzFdXT1hLmFkZCxzJiZhLmFkZChmdW5jdGlvbigpe3I9c30sblszLWVdWzJdLmRpc2FibGUsblszLWVdWzNdLmRpc2FibGUsblswXVsyXS5sb2NrLG5bMF1bM10ubG9jayksYS5hZGQodFszXS5maXJlKSxvW3RbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIG9bdFswXSsiV2l0aCJdKHRoaXM9PT1vP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sb1t0WzBdKyJXaXRoIl09YS5maXJlV2l0aH0pLGkucHJvbWlzZShvKSx0JiZ0LmNhbGwobyxvKSxvfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj10LHI9QXJyYXkobiksaT1vLmNhbGwoYXJndW1lbnRzKSxhPXcuRGVmZXJyZWQoKSxzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuKXtyW2VdPXRoaXMsaVtlXT1hcmd1bWVudHMubGVuZ3RoPjE/by5jYWxsKGFyZ3VtZW50cyk6biwtLXR8fGEucmVzb2x2ZVdpdGgocixpKX19O2lmKHQ8PTEmJigkKGUsYS5kb25lKHMobikpLnJlc29sdmUsYS5yZWplY3QsIXQpLCJwZW5kaW5nIj09PWEuc3RhdGUoKXx8ZyhpW25dJiZpW25dLnRoZW4pKSlyZXR1cm4gYS50aGVuKCk7d2hpbGUobi0tKSQoaVtuXSxzKG4pLGEucmVqZWN0KTtyZXR1cm4gYS5wcm9taXNlKCl9fSk7dmFyIEI9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87dy5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKHQsbil7ZS5jb25zb2xlJiZlLmNvbnNvbGUud2FybiYmdCYmQi50ZXN0KHQubmFtZSkmJmUuY29uc29sZS53YXJuKCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiAiK3QubWVzc2FnZSx0LnN0YWNrLG4pfSx3LnJlYWR5RXhjZXB0aW9uPWZ1bmN0aW9uKHQpe2Uuc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IHR9KX07dmFyIEY9dy5EZWZlcnJlZCgpO3cuZm4ucmVhZHk9ZnVuY3Rpb24oZSl7cmV0dXJuIEYudGhlbihlKVsiY2F0Y2giXShmdW5jdGlvbihlKXt3LnJlYWR5RXhjZXB0aW9uKGUpfSksdGhpc30sdy5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oZSl7KCEwPT09ZT8tLXcucmVhZHlXYWl0OncuaXNSZWFkeSl8fCh3LmlzUmVhZHk9ITAsITAhPT1lJiYtLXcucmVhZHlXYWl0PjB8fEYucmVzb2x2ZVdpdGgocixbd10pKX19KSx3LnJlYWR5LnRoZW49Ri50aGVuO2Z1bmN0aW9uIF8oKXtyLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLF8pLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsXyksdy5yZWFkeSgpfSJjb21wbGV0ZSI9PT1yLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PXIucmVhZHlTdGF0ZSYmIXIuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2Uuc2V0VGltZW91dCh3LnJlYWR5KTooci5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixfKSxlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLF8pKTt2YXIgej1mdW5jdGlvbihlLHQsbixyLGksbyxhKXt2YXIgcz0wLHU9ZS5sZW5ndGgsbD1udWxsPT1uO2lmKCJvYmplY3QiPT09eChuKSl7aT0hMDtmb3IocyBpbiBuKXooZSx0LHMsbltzXSwhMCxvLGEpfWVsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsZyhyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbCh3KGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LFg9L14tbXMtLyxVPS8tKFthLXpdKS9nO2Z1bmN0aW9uIFYoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIEcoZSl7cmV0dXJuIGUucmVwbGFjZShYLCJtcy0iKS5yZXBsYWNlKFUsVil9dmFyIFk9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBRKCl7dGhpcy5leHBhbmRvPXcuZXhwYW5kbytRLnVpZCsrfVEudWlkPTEsUS5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9e30sWShlKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdGhpcy5leHBhbmRvLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pKSksdH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMuY2FjaGUoZSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KWlbRyh0KV09bjtlbHNlIGZvcihyIGluIHQpaVtHKHIpXT10W3JdO3JldHVybiBpfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW0codCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJnZvaWQgMD09PW4/dGhpcy5nZXQoZSx0KToodGhpcy5zZXQoZSx0LG4pLHZvaWQgMCE9PW4/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09dCl7bj0odD1BcnJheS5pc0FycmF5KHQpP3QubWFwKEcpOih0PUcodCkpaW4gcj9bdF06dC5tYXRjaChNKXx8W10pLmxlbmd0aDt3aGlsZShuLS0pZGVsZXRlIHJbdFtuXV19KHZvaWQgMD09PXR8fHcuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIXcuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBKPW5ldyBRLEs9bmV3IFEsWj0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLGVlPS9bQS1aXS9nO2Z1bmN0aW9uIHRlKGUpe3JldHVybiJ0cnVlIj09PWV8fCJmYWxzZSIhPT1lJiYoIm51bGwiPT09ZT9udWxsOmU9PT0rZSsiIj8rZTpaLnRlc3QoZSk/SlNPTi5wYXJzZShlKTplKX1mdW5jdGlvbiBuZShlLHQsbil7dmFyIHI7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShlZSwiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49ZS5nZXRBdHRyaWJ1dGUocikpKXt0cnl7bj10ZShuKX1jYXRjaChlKXt9Sy5zZXQoZSx0LG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59dy5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIEsuaGFzRGF0YShlKXx8Si5oYXNEYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gSy5hY2Nlc3MoZSx0LG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7Sy5yZW1vdmUoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBKLmFjY2VzcyhlLHQsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7Si5yZW1vdmUoZSx0KX19KSx3LmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvPXRoaXNbMF0sYT1vJiZvLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09ZSl7aWYodGhpcy5sZW5ndGgmJihpPUsuZ2V0KG8pLDE9PT1vLm5vZGVUeXBlJiYhSi5nZXQobywiaGFzRGF0YUF0dHJzIikpKXtuPWEubGVuZ3RoO3doaWxlKG4tLSlhW25dJiYwPT09KHI9YVtuXS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpJiYocj1HKHIuc2xpY2UoNSkpLG5lKG8scixpW3JdKSk7Si5zZXQobywiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGl9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP3RoaXMuZWFjaChmdW5jdGlvbigpe0suc2V0KHRoaXMsZSl9KTp6KHRoaXMsZnVuY3Rpb24odCl7dmFyIG47aWYobyYmdm9pZCAwPT09dCl7aWYodm9pZCAwIT09KG49Sy5nZXQobyxlKSkpcmV0dXJuIG47aWYodm9pZCAwIT09KG49bmUobyxlKSkpcmV0dXJuIG59ZWxzZSB0aGlzLmVhY2goZnVuY3Rpb24oKXtLLnNldCh0aGlzLGUsdCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Sy5yZW1vdmUodGhpcyxlKX0pfX0pLHcuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoZSlyZXR1cm4gdD0odHx8ImZ4IikrInF1ZXVlIixyPUouZ2V0KGUsdCksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9Si5hY2Nlc3MoZSx0LHcubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKGUsdCl7dD10fHwiZngiO3ZhciBuPXcucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89dy5fcXVldWVIb29rcyhlLHQpLGE9ZnVuY3Rpb24oKXt3LmRlcXVldWUoZSx0KX07ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGEsbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gSi5nZXQoZSxuKXx8Si5hY2Nlc3MoZSxuLHtlbXB0eTp3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtKLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSx3LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPSJmeCIsbi0tKSxhcmd1bWVudHMubGVuZ3RoPG4/dy5xdWV1ZSh0aGlzWzBdLGUpOnZvaWQgMD09PXQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj13LnF1ZXVlKHRoaXMsZSx0KTt3Ll9xdWV1ZUhvb2tzKHRoaXMsZSksImZ4Ij09PWUmJiJpbnByb2dyZXNzIiE9PW5bMF0mJncuZGVxdWV1ZSh0aGlzLGUpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3cuZGVxdWV1ZSh0aGlzLGUpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTEsaT13LkRlZmVycmVkKCksbz10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8aS5yZXNvbHZlV2l0aChvLFtvXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHwiZngiO3doaWxlKGEtLSkobj1KLmdldChvW2FdLGUrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksaS5wcm9taXNlKHQpfX0pO3ZhciByZT0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxpZT1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrcmUrIikoW2EteiVdKikkIiwiaSIpLG9lPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sYWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmdy5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSkmJiJub25lIj09PXcuY3NzKGUsImRpc3BsYXkiKX0sc2U9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhPXt9O2ZvcihvIGluIHQpYVtvXT1lLnN0eWxlW29dLGUuc3R5bGVbb109dFtvXTtpPW4uYXBwbHkoZSxyfHxbXSk7Zm9yKG8gaW4gdCllLnN0eWxlW29dPWFbb107cmV0dXJuIGl9O2Z1bmN0aW9uIHVlKGUsdCxuLHIpe3ZhciBpLG8sYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gdy5jc3MoZSx0LCIiKX0sdT1zKCksbD1uJiZuWzNdfHwody5jc3NOdW1iZXJbdF0/IiI6InB4IiksYz0ody5jc3NOdW1iZXJbdF18fCJweCIhPT1sJiYrdSkmJmllLmV4ZWMody5jc3MoZSx0KSk7aWYoYyYmY1szXSE9PWwpe3UvPTIsbD1sfHxjWzNdLGM9K3V8fDE7d2hpbGUoYS0tKXcuc3R5bGUoZSx0LGMrbCksKDEtbykqKDEtKG89cygpL3V8fC41KSk8PTAmJihhPTApLGMvPW87Yyo9Mix3LnN0eWxlKGUsdCxjK2wpLG49bnx8W119cmV0dXJuIG4mJihjPStjfHwrdXx8MCxpPW5bMV0/YysoblsxXSsxKSpuWzJdOituWzJdLHImJihyLnVuaXQ9bCxyLnN0YXJ0PWMsci5lbmQ9aSkpLGl9dmFyIGxlPXt9O2Z1bmN0aW9uIGNlKGUpe3ZhciB0LG49ZS5vd25lckRvY3VtZW50LHI9ZS5ub2RlTmFtZSxpPWxlW3JdO3JldHVybiBpfHwodD1uLmJvZHkuYXBwZW5kQ2hpbGQobi5jcmVhdGVFbGVtZW50KHIpKSxpPXcuY3NzKHQsImRpc3BsYXkiKSx0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksIm5vbmUiPT09aSYmKGk9ImJsb2NrIiksbGVbcl09aSxpKX1mdW5jdGlvbiBmZShlLHQpe2Zvcih2YXIgbixyLGk9W10sbz0wLGE9ZS5sZW5ndGg7bzxhO28rKykocj1lW29dKS5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LHQ/KCJub25lIj09PW4mJihpW29dPUouZ2V0KHIsImRpc3BsYXkiKXx8bnVsbCxpW29dfHwoci5zdHlsZS5kaXNwbGF5PSIiKSksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJmFlKHIpJiYoaVtvXT1jZShyKSkpOiJub25lIiE9PW4mJihpW29dPSJub25lIixKLnNldChyLCJkaXNwbGF5IixuKSkpO2ZvcihvPTA7bzxhO28rKyludWxsIT1pW29dJiYoZVtvXS5zdHlsZS5kaXNwbGF5PWlbb10pO3JldHVybiBlfXcuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIGZlKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIGZlKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2FlKHRoaXMpP3codGhpcykuc2hvdygpOncodGhpcykuaGlkZSgpfSl9fSk7dmFyIHBlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLGRlPS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pLGhlPS9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxnZT17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2dlLm9wdGdyb3VwPWdlLm9wdGlvbixnZS50Ym9keT1nZS50Zm9vdD1nZS5jb2xncm91cD1nZS5jYXB0aW9uPWdlLnRoZWFkLGdlLnRoPWdlLnRkO2Z1bmN0aW9uIHllKGUsdCl7dmFyIG47cmV0dXJuIG49InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHx8IioiKToidW5kZWZpbmVkIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbD9lLnF1ZXJ5U2VsZWN0b3JBbGwodHx8IioiKTpbXSx2b2lkIDA9PT10fHx0JiZOKGUsdCk/dy5tZXJnZShbZV0sbik6bn1mdW5jdGlvbiB2ZShlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylKLnNldChlW25dLCJnbG9iYWxFdmFsIiwhdHx8Si5nZXQodFtuXSwiZ2xvYmFsRXZhbCIpKX12YXIgbWU9Lzx8JiM/XHcrOy87ZnVuY3Rpb24geGUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZigib2JqZWN0Ij09PXgobykpdy5tZXJnZShwLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYobWUudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KGRlLmV4ZWMobyl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1nZVtzXXx8Z2UuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXSt3Lmh0bWxQcmVmaWx0ZXIobykrdVsyXSxjPXVbMF07d2hpbGUoYy0tKWE9YS5sYXN0Q2hpbGQ7dy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtmLnRleHRDb250ZW50PSIiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiZ3LmluQXJyYXkobyxyKT4tMSlpJiZpLnB1c2gobyk7ZWxzZSBpZihsPXcuY29udGFpbnMoby5vd25lckRvY3VtZW50LG8pLGE9eWUoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksbCYmdmUoYSksbil7Yz0wO3doaWxlKG89YVtjKytdKWhlLnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKX1yZXR1cm4gZn0hZnVuY3Rpb24oKXt2YXIgZT1yLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChyLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSx0PXIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksdC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksZS5hcHBlbmRDaGlsZCh0KSxoLmNoZWNrQ2xvbmU9ZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsZS5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLGgubm9DbG9uZUNoZWNrZWQ9ISFlLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZX0oKTt2YXIgYmU9ci5kb2N1bWVudEVsZW1lbnQsd2U9L15rZXkvLFRlPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxDZT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gRWUoKXtyZXR1cm4hMH1mdW5jdGlvbiBrZSgpe3JldHVybiExfWZ1bmN0aW9uIFNlKCl7dHJ5e3JldHVybiByLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX1mdW5jdGlvbiBEZShlLHQsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIHQpeyJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCk7Zm9yKHMgaW4gdClEZShlLHMsbixyLHRbc10sbyk7cmV0dXJuIGV9aWYobnVsbD09ciYmbnVsbD09aT8oaT1uLHI9bj12b2lkIDApOm51bGw9PWkmJigic3RyaW5nIj09dHlwZW9mIG4/KGk9cixyPXZvaWQgMCk6KGk9cixyPW4sbj12b2lkIDApKSwhMT09PWkpaT1rZTtlbHNlIGlmKCFpKXJldHVybiBlO3JldHVybiAxPT09byYmKGE9aSwoaT1mdW5jdGlvbihlKXtyZXR1cm4gdygpLm9mZihlKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPXcuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC5hZGQodGhpcyx0LGkscixuKX0pfXcuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHk9Si5nZXQoZSk7aWYoeSl7bi5oYW5kbGVyJiYobj0obz1uKS5oYW5kbGVyLGk9by5zZWxlY3RvciksaSYmdy5maW5kLm1hdGNoZXNTZWxlY3RvcihiZSxpKSxuLmd1aWR8fChuLmd1aWQ9dy5ndWlkKyspLCh1PXkuZXZlbnRzKXx8KHU9eS5ldmVudHM9e30pLChhPXkuaGFuZGxlKXx8KGE9eS5oYW5kbGU9ZnVuY3Rpb24odCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB3JiZ3LmV2ZW50LnRyaWdnZXJlZCE9PXQudHlwZT93LmV2ZW50LmRpc3BhdGNoLmFwcGx5KGUsYXJndW1lbnRzKTp2b2lkIDB9KSxsPSh0PSh0fHwiIikubWF0Y2goTSl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0pZD1nPShzPUNlLmV4ZWModFtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShpP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkLGY9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxjPXcuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJncuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LG8pLChwPXVbZF0pfHwoKHA9dVtkXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKGUscixoLGEpfHxlLmFkZEV2ZW50TGlzdGVuZXImJmUuYWRkRXZlbnRMaXN0ZW5lcihkLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwoZSxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpwLnB1c2goYyksdy5ldmVudC5nbG9iYWxbZF09ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx5PUouaGFzRGF0YShlKSYmSi5nZXQoZSk7aWYoeSYmKHU9eS5ldmVudHMpKXtsPSh0PSh0fHwiIikubWF0Y2goTSl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0paWYocz1DZS5leGVjKHRbbF0pfHxbXSxkPWc9c1sxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7Zj13LmV2ZW50LnNwZWNpYWxbZF18fHt9LHA9dVtkPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJigiKioiIT09cnx8IWMuc2VsZWN0b3IpfHwocC5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbChlLGMpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbChlLGgseS5oYW5kbGUpfHx3LnJlbW92ZUV2ZW50KGUsZCx5LmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSl3LmV2ZW50LnJlbW92ZShlLGQrdFtsXSxuLHIsITApO3cuaXNFbXB0eU9iamVjdCh1KSYmSi5yZW1vdmUoZSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5ldmVudC5maXgoZSksbixyLGksbyxhLHMsdT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksbD0oSi5nZXQodGhpcywiZXZlbnRzIil8fHt9KVt0LnR5cGVdfHxbXSxjPXcuZXZlbnQuc3BlY2lhbFt0LnR5cGVdfHx7fTtmb3IodVswXT10LG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXVbbl09YXJndW1lbnRzW25dO2lmKHQuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8ITEhPT1jLnByZURpc3BhdGNoLmNhbGwodGhpcyx0KSl7cz13LmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyx0LGwpLG49MDt3aGlsZSgobz1zW24rK10pJiYhdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXt0LmN1cnJlbnRUYXJnZXQ9by5lbGVtLHI9MDt3aGlsZSgoYT1vLmhhbmRsZXJzW3IrK10pJiYhdC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKXQucm5hbWVzcGFjZSYmIXQucm5hbWVzcGFjZS50ZXN0KGEubmFtZXNwYWNlKXx8KHQuaGFuZGxlT2JqPWEsdC5kYXRhPWEuZGF0YSx2b2lkIDAhPT0oaT0oKHcuZXZlbnQuc3BlY2lhbFthLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8YS5oYW5kbGVyKS5hcHBseShvLmVsZW0sdSkpJiYhMT09PSh0LnJlc3VsdD1pKSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsdCksdC5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoImNsaWNrIj09PWUudHlwZSYmZS5idXR0b24+PTEpKWZvcig7bCE9PXRoaXM7bD1sLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWwubm9kZVR5cGUmJigiY2xpY2siIT09ZS50eXBlfHwhMCE9PWwuZGlzYWJsZWQpKXtmb3Iobz1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbaT0ocj10W25dKS5zZWxlY3RvcisiICJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD93KGksdGhpcykuaW5kZXgobCk+LTE6dy5maW5kKGksdGhpcyxudWxsLFtsXSkubGVuZ3RoKSxhW2ldJiZvLnB1c2gocik7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOm99KX1yZXR1cm4gbD10aGlzLHU8dC5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOnQuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHcuRXZlbnQucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpnKHQpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0KHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbZV19LHNldDpmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVt3LmV4cGFuZG9dP2U6bmV3IHcuRXZlbnQoZSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXMhPT1TZSgpJiZ0aGlzLmZvY3VzKXJldHVybiB0aGlzLmZvY3VzKCksITF9LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzPT09U2UoKSYmdGhpcy5ibHVyKXJldHVybiB0aGlzLmJsdXIoKSwhMX0sZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGNsaWNrOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYoImNoZWNrYm94Ij09PXRoaXMudHlwZSYmdGhpcy5jbGljayYmTih0aGlzLCJpbnB1dCIpKXJldHVybiB0aGlzLmNsaWNrKCksITF9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3JldHVybiBOKGUudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnJlc3VsdCYmZS5vcmlnaW5hbEV2ZW50JiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fX0sdy5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0sdy5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHcuRXZlbnQpKXJldHVybiBuZXcgdy5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlP0VlOmtlLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJncuZXh0ZW5kKHRoaXMsdCksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1t3LmV4cGFuZG9dPSEwfSx3LkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6dy5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6a2UsaXNQcm9wYWdhdGlvblN0b3BwZWQ6a2UsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6a2UsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUVlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSx3LmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsImNoYXIiOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYnV0dG9uO3JldHVybiBudWxsPT1lLndoaWNoJiZ3ZS50ZXN0KGUudHlwZSk/bnVsbCE9ZS5jaGFyQ29kZT9lLmNoYXJDb2RlOmUua2V5Q29kZTohZS53aGljaCYmdm9pZCAwIT09dCYmVGUudGVzdChlLnR5cGUpPzEmdD8xOjImdD8zOjQmdD8yOjA6ZS53aGljaH19LHcuZXZlbnQuYWRkUHJvcCksdy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLHQpe3cuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LG89ZS5oYW5kbGVPYmo7cmV0dXJuIGkmJihpPT09cnx8dy5jb250YWlucyhyLGkpKXx8KGUudHlwZT1vLm9yaWdUeXBlLG49by5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnR5cGU9dCksbn19fSksdy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBEZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIERlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLHcoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PXQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0fHwobj10LHQ9dm9pZCAwKSwhMT09PW4mJihuPWtlKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt3LmV2ZW50LnJlbW92ZSh0aGlzLGUsbix0KX0pfX0pO3ZhciBOZT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksQWU9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksamU9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2kscWU9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nO2Z1bmN0aW9uIExlKGUsdCl7cmV0dXJuIE4oZSwidGFibGUiKSYmTigxMSE9PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIik/dyhlKS5jaGlsZHJlbigidGJvZHkiKVswXXx8ZTplfWZ1bmN0aW9uIEhlKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gT2UoZSl7cmV0dXJuInRydWUvIj09PShlLnR5cGV8fCIiKS5zbGljZSgwLDUpP2UudHlwZT1lLnR5cGUuc2xpY2UoNSk6ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIFBlKGUsdCl7dmFyIG4scixpLG8sYSxzLHUsbDtpZigxPT09dC5ub2RlVHlwZSl7aWYoSi5oYXNEYXRhKGUpJiYobz1KLmFjY2VzcyhlKSxhPUouc2V0KHQsbyksbD1vLmV2ZW50cykpe2RlbGV0ZSBhLmhhbmRsZSxhLmV2ZW50cz17fTtmb3IoaSBpbiBsKWZvcihuPTAscj1sW2ldLmxlbmd0aDtuPHI7bisrKXcuZXZlbnQuYWRkKHQsaSxsW2ldW25dKX1LLmhhc0RhdGEoZSkmJihzPUsuYWNjZXNzKGUpLHU9dy5leHRlbmQoe30scyksSy5zZXQodCx1KSl9fWZ1bmN0aW9uIE1lKGUsdCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyJpbnB1dCI9PT1uJiZwZS50ZXN0KGUudHlwZSk/dC5jaGVja2VkPWUuY2hlY2tlZDoiaW5wdXQiIT09biYmInRleHRhcmVhIiE9PW58fCh0LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gUmUoZSx0LG4scil7dD1hLmFwcGx5KFtdLHQpO3ZhciBpLG8scyx1LGwsYyxmPTAscD1lLmxlbmd0aCxkPXAtMSx5PXRbMF0sdj1nKHkpO2lmKHZ8fHA+MSYmInN0cmluZyI9PXR5cGVvZiB5JiYhaC5jaGVja0Nsb25lJiZqZS50ZXN0KHkpKXJldHVybiBlLmVhY2goZnVuY3Rpb24oaSl7dmFyIG89ZS5lcShpKTt2JiYodFswXT15LmNhbGwodGhpcyxpLG8uaHRtbCgpKSksUmUobyx0LG4scil9KTtpZihwJiYoaT14ZSh0LGVbMF0ub3duZXJEb2N1bWVudCwhMSxlLHIpLG89aS5maXJzdENoaWxkLDE9PT1pLmNoaWxkTm9kZXMubGVuZ3RoJiYoaT1vKSxvfHxyKSl7Zm9yKHU9KHM9dy5tYXAoeWUoaSwic2NyaXB0IiksSGUpKS5sZW5ndGg7ZjxwO2YrKylsPWksZiE9PWQmJihsPXcuY2xvbmUobCwhMCwhMCksdSYmdy5tZXJnZShzLHllKGwsInNjcmlwdCIpKSksbi5jYWxsKGVbZl0sbCxmKTtpZih1KWZvcihjPXNbcy5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCx3Lm1hcChzLE9lKSxmPTA7Zjx1O2YrKylsPXNbZl0saGUudGVzdChsLnR5cGV8fCIiKSYmIUouYWNjZXNzKGwsImdsb2JhbEV2YWwiKSYmdy5jb250YWlucyhjLGwpJiYobC5zcmMmJiJtb2R1bGUiIT09KGwudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/dy5fZXZhbFVybCYmdy5fZXZhbFVybChsLnNyYyk6bShsLnRleHRDb250ZW50LnJlcGxhY2UocWUsIiIpLGMsbCkpfXJldHVybiBlfWZ1bmN0aW9uIEllKGUsdCxuKXtmb3IodmFyIHIsaT10P3cuZmlsdGVyKHQsZSk6ZSxvPTA7bnVsbCE9KHI9aVtvXSk7bysrKW58fDEhPT1yLm5vZGVUeXBlfHx3LmNsZWFuRGF0YSh5ZShyKSksci5wYXJlbnROb2RlJiYobiYmdy5jb250YWlucyhyLm93bmVyRG9jdW1lbnQscikmJnZlKHllKHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiBlfXcuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoTmUsIjwkMT48LyQyPiIpfSxjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNsb25lTm9kZSghMCksdT13LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKTtpZighKGgubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fHcuaXNYTUxEb2MoZSkpKWZvcihhPXllKHMpLHI9MCxpPShvPXllKGUpKS5sZW5ndGg7cjxpO3IrKylNZShvW3JdLGFbcl0pO2lmKHQpaWYobilmb3Iobz1vfHx5ZShlKSxhPWF8fHllKHMpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspUGUob1tyXSxhW3JdKTtlbHNlIFBlKGUscyk7cmV0dXJuKGE9eWUocywic2NyaXB0IikpLmxlbmd0aD4wJiZ2ZShhLCF1JiZ5ZShlLCJzY3JpcHQiKSksc30sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHIsaT13LmV2ZW50LnNwZWNpYWwsbz0wO3ZvaWQgMCE9PShuPWVbb10pO28rKylpZihZKG4pKXtpZih0PW5bSi5leHBhbmRvXSl7aWYodC5ldmVudHMpZm9yKHIgaW4gdC5ldmVudHMpaVtyXT93LmV2ZW50LnJlbW92ZShuLHIpOncucmVtb3ZlRXZlbnQobixyLHQuaGFuZGxlKTtuW0ouZXhwYW5kb109dm9pZCAwfW5bSy5leHBhbmRvXSYmKG5bSy5leHBhbmRvXT12b2lkIDApfX19KSx3LmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiBJZSh0aGlzLGUsITApfSxyZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIEllKHRoaXMsZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHoodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT93LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUmUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fExlKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9TGUodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYody5jbGVhbkRhdGEoeWUoZSwhMSkpLGUudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB3LmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIUFlLnRlc3QoZSkmJiFnZVsoZGUuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9dy5odG1sUHJlZmlsdGVyKGUpO3RyeXtmb3IoO248cjtuKyspMT09PSh0PXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKHcuY2xlYW5EYXRhKHllKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIFJlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTt3LmluQXJyYXkodGhpcyxlKTwwJiYody5jbGVhbkRhdGEoeWUodGhpcykpLG4mJm4ucmVwbGFjZUNoaWxkKHQsdGhpcykpfSxlKX19KSx3LmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLHI9W10saT13KGUpLG89aS5sZW5ndGgtMSxhPTA7YTw9bzthKyspbj1hPT09bz90aGlzOnRoaXMuY2xvbmUoITApLHcoaVthXSlbdF0obikscy5hcHBseShyLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhyKX19KTt2YXIgV2U9bmV3IFJlZ0V4cCgiXigiK3JlKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksJGU9ZnVuY3Rpb24odCl7dmFyIG49dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiBuJiZuLm9wZW5lcnx8KG49ZSksbi5nZXRDb21wdXRlZFN0eWxlKHQpfSxCZT1uZXcgUmVnRXhwKG9lLmpvaW4oInwiKSwiaSIpOyFmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtpZihjKXtsLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGMuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIsYmUuYXBwZW5kQ2hpbGQobCkuYXBwZW5kQ2hpbGQoYyk7dmFyIHQ9ZS5nZXRDb21wdXRlZFN0eWxlKGMpO2k9IjElIiE9PXQudG9wLHU9MTI9PT1uKHQubWFyZ2luTGVmdCksYy5zdHlsZS5yaWdodD0iNjAlIixzPTM2PT09bih0LnJpZ2h0KSxvPTM2PT09bih0LndpZHRoKSxjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYT0zNj09PWMub2Zmc2V0V2lkdGh8fCJhYnNvbHV0ZSIsYmUucmVtb3ZlQ2hpbGQobCksYz1udWxsfX1mdW5jdGlvbiBuKGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBpLG8sYSxzLHUsbD1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ci5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLnN0eWxlJiYoYy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixoLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09Yy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCx3LmV4dGVuZChoLHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiB0KCksb30scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHN9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLGl9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiB0KCksdX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0KCksYX19KSl9KCk7ZnVuY3Rpb24gRmUoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5zdHlsZTtyZXR1cm4obj1ufHwkZShlKSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSl8fHcuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHwoYT13LnN0eWxlKGUsdCkpLCFoLnBpeGVsQm94U3R5bGVzKCkmJldlLnRlc3QoYSkmJkJlLnRlc3QodCkmJihyPXMud2lkdGgsaT1zLm1pbldpZHRoLG89cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1pLHMubWF4V2lkdGg9bykpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uIF9lKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX12YXIgemU9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFhlPS9eLS0vLFVlPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxWZT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn0sR2U9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFllPXIuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7ZnVuY3Rpb24gUWUoZSl7aWYoZSBpbiBZZSlyZXR1cm4gZTt2YXIgdD1lWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPUdlLmxlbmd0aDt3aGlsZShuLS0paWYoKGU9R2Vbbl0rdClpbiBZZSlyZXR1cm4gZX1mdW5jdGlvbiBKZShlKXt2YXIgdD13LmNzc1Byb3BzW2VdO3JldHVybiB0fHwodD13LmNzc1Byb3BzW2VdPVFlKGUpfHxlKSx0fWZ1bmN0aW9uIEtlKGUsdCxuKXt2YXIgcj1pZS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTp0fWZ1bmN0aW9uIFplKGUsdCxuLHIsaSxvKXt2YXIgYT0id2lkdGgiPT09dD8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPXcuY3NzKGUsbitvZVthXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHUtPXcuY3NzKGUsInBhZGRpbmciK29lW2FdLCEwLGkpKSwibWFyZ2luIiE9PW4mJih1LT13LmNzcyhlLCJib3JkZXIiK29lW2FdKyJXaWR0aCIsITAsaSkpKToodSs9dy5jc3MoZSwicGFkZGluZyIrb2VbYV0sITAsaSksInBhZGRpbmciIT09bj91Kz13LmNzcyhlLCJib3JkZXIiK29lW2FdKyJXaWR0aCIsITAsaSk6cys9dy5jc3MoZSwiYm9yZGVyIitvZVthXSsiV2lkdGgiLCEwLGkpKTtyZXR1cm4hciYmbz49MCYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSkpLHV9ZnVuY3Rpb24gZXQoZSx0LG4pe3ZhciByPSRlKGUpLGk9RmUoZSx0LHIpLG89ImJvcmRlci1ib3giPT09dy5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSxhPW87aWYoV2UudGVzdChpKSl7aWYoIW4pcmV0dXJuIGk7aT0iYXV0byJ9cmV0dXJuIGE9YSYmKGguYm94U2l6aW5nUmVsaWFibGUoKXx8aT09PWUuc3R5bGVbdF0pLCgiYXV0byI9PT1pfHwhcGFyc2VGbG9hdChpKSYmImlubGluZSI9PT13LmNzcyhlLCJkaXNwbGF5IiwhMSxyKSkmJihpPWVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLGE9ITApLChpPXBhcnNlRmxvYXQoaSl8fDApK1plKGUsdCxufHwobz8iYm9yZGVyIjoiY29udGVudCIpLGEscixpKSsicHgifXcuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49RmUoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8sYSxzPUcodCksdT1YZS50ZXN0KHQpLGw9ZS5zdHlsZTtpZih1fHwodD1KZShzKSksYT13LmNzc0hvb2tzW3RdfHx3LmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KGk9YS5nZXQoZSwhMSxyKSk/aTpsW3RdOyJzdHJpbmciPT0obz10eXBlb2YgbikmJihpPWllLmV4ZWMobikpJiZpWzFdJiYobj11ZShlLHQsaSksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09PW4mJigibnVtYmVyIj09PW8mJihuKz1pJiZpWzNdfHwody5jc3NOdW1iZXJbc10/IiI6InB4IikpLGguY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT10LmluZGV4T2YoImJhY2tncm91bmQiKXx8KGxbdF09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KGUsbixyKSl8fCh1P2wuc2V0UHJvcGVydHkodCxuKTpsW3RdPW4pKX19LGNzczpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1HKHQpO3JldHVybiBYZS50ZXN0KHQpfHwodD1KZShzKSksKGE9dy5jc3NIb29rc1t0XXx8dy5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9RmUoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gVmUmJihpPVZlW3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSwhMD09PW58fGlzRmluaXRlKG8pP298fDA6aSk6aX19KSx3LmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGUsdCl7dy5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbixyKXtpZihuKXJldHVybiF6ZS50ZXN0KHcuY3NzKGUsImRpc3BsYXkiKSl8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/ZXQoZSx0LHIpOnNlKGUsVWUsZnVuY3Rpb24oKXtyZXR1cm4gZXQoZSx0LHIpfSl9LHNldDpmdW5jdGlvbihlLG4scil7dmFyIGksbz0kZShlKSxhPSJib3JkZXItYm94Ij09PXcuY3NzKGUsImJveFNpemluZyIsITEsbykscz1yJiZaZShlLHQscixhLG8pO3JldHVybiBhJiZoLnNjcm9sbGJveFNpemUoKT09PW8ucG9zaXRpb24mJihzLT1NYXRoLmNlaWwoZVsib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tcGFyc2VGbG9hdChvW3RdKS1aZShlLHQsImJvcmRlciIsITEsbyktLjUpKSxzJiYoaT1pZS5leGVjKG4pKSYmInB4IiE9PShpWzNdfHwicHgiKSYmKGUuc3R5bGVbdF09bixuPXcuY3NzKGUsdCkpLEtlKGUsbixzKX19fSksdy5jc3NIb29rcy5tYXJnaW5MZWZ0PV9lKGgucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChGZShlLCJtYXJnaW5MZWZ0IikpfHxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtc2UoZSx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLHcuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGUsdCl7dy5jc3NIb29rc1tlK3RdPXtleHBhbmQ6ZnVuY3Rpb24obil7Zm9yKHZhciByPTAsaT17fSxvPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO3I8NDtyKyspaVtlK29lW3JdK3RdPW9bcl18fG9bci0yXXx8b1swXTtyZXR1cm4gaX19LCJtYXJnaW4iIT09ZSYmKHcuY3NzSG9va3NbZSt0XS5zZXQ9S2UpfSksdy5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fSxhPTA7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHI9JGUoZSksaT10Lmxlbmd0aDthPGk7YSsrKW9bdFthXV09dy5jc3MoZSx0W2FdLCExLHIpO3JldHVybiBvfXJldHVybiB2b2lkIDAhPT1uP3cuc3R5bGUoZSx0LG4pOncuY3NzKGUsdCl9LGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfX0pO2Z1bmN0aW9uIHR0KGUsdCxuLHIsaSl7cmV0dXJuIG5ldyB0dC5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfXcuVHdlZW49dHQsdHQucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0dCxpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHx3LmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9b3x8KHcuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgZT10dC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6dHQucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49dHQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz10PXcuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTp0dC5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSx0dC5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9dHQucHJvdG90eXBlLHR0LnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gMSE9PWUuZWxlbS5ub2RlVHlwZXx8bnVsbCE9ZS5lbGVtW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtlLnByb3BdP2UuZWxlbVtlLnByb3BdOih0PXcuY3NzKGUuZWxlbSxlLnByb3AsIiIpKSYmImF1dG8iIT09dD90OjB9LHNldDpmdW5jdGlvbihlKXt3LmZ4LnN0ZXBbZS5wcm9wXT93LmZ4LnN0ZXBbZS5wcm9wXShlKToxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsPT1lLmVsZW0uc3R5bGVbdy5jc3NQcm9wc1tlLnByb3BdXSYmIXcuY3NzSG9va3NbZS5wcm9wXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzp3LnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSx0dC5wcm9wSG9va3Muc2Nyb2xsVG9wPXR0LnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LHcuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sdy5meD10dC5wcm90b3R5cGUuaW5pdCx3LmZ4LnN0ZXA9e307dmFyIG50LHJ0LGl0PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxvdD0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIGF0KCl7cnQmJighMT09PXIuaGlkZGVuJiZlLnJlcXVlc3RBbmltYXRpb25GcmFtZT9lLnJlcXVlc3RBbmltYXRpb25GcmFtZShhdCk6ZS5zZXRUaW1lb3V0KGF0LHcuZnguaW50ZXJ2YWwpLHcuZngudGljaygpKX1mdW5jdGlvbiBzdCgpe3JldHVybiBlLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtudD12b2lkIDB9KSxudD1EYXRlLm5vdygpfWZ1bmN0aW9uIHV0KGUsdCl7dmFyIG4scj0wLGk9e2hlaWdodDplfTtmb3IodD10PzE6MDtyPDQ7cis9Mi10KWlbIm1hcmdpbiIrKG49b2Vbcl0pXT1pWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoaS5vcGFjaXR5PWkud2lkdGg9ZSksaX1mdW5jdGlvbiBsdChlLHQsbil7Zm9yKHZhciByLGk9KHB0LnR3ZWVuZXJzW3RdfHxbXSkuY29uY2F0KHB0LnR3ZWVuZXJzWyIqIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGN0KGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLGY9IndpZHRoImluIHR8fCJoZWlnaHQiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZhZShlKSx5PUouZ2V0KGUsImZ4c2hvdyIpO24ucXVldWV8fChudWxsPT0oYT13Ll9xdWV1ZUhvb2tzKGUsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLHcucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSk7Zm9yKHIgaW4gdClpZihpPXRbcl0saXQudGVzdChpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1pfHwheXx8dm9pZCAwPT09eVtyXSljb250aW51ZTtnPSEwfWRbcl09eSYmeVtyXXx8dy5zdHlsZShlLHIpfWlmKCh1PSF3LmlzRW1wdHlPYmplY3QodCkpfHwhdy5pc0VtcHR5T2JqZWN0KGQpKXtmJiYxPT09ZS5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2gub3ZlcmZsb3csaC5vdmVyZmxvd1gsaC5vdmVyZmxvd1ldLG51bGw9PShsPXkmJnkuZGlzcGxheSkmJihsPUouZ2V0KGUsImRpc3BsYXkiKSksIm5vbmUiPT09KGM9dy5jc3MoZSwiZGlzcGxheSIpKSYmKGw/Yz1sOihmZShbZV0sITApLGw9ZS5zdHlsZS5kaXNwbGF5fHxsLGM9dy5jc3MoZSwiZGlzcGxheSIpLGZlKFtlXSkpKSwoImlubGluZSI9PT1jfHwiaW5saW5lLWJsb2NrIj09PWMmJm51bGwhPWwpJiYibm9uZSI9PT13LmNzcyhlLCJmbG9hdCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2guZGlzcGxheT1sfSksbnVsbD09bCYmKGM9aC5kaXNwbGF5LGw9Im5vbmUiPT09Yz8iIjpjKSksaC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKGgub3ZlcmZsb3c9ImhpZGRlbiIscC5hbHdheXMoZnVuY3Rpb24oKXtoLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0saC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxoLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITE7Zm9yKHIgaW4gZCl1fHwoeT8iaGlkZGVuImluIHkmJihnPXkuaGlkZGVuKTp5PUouYWNjZXNzKGUsImZ4c2hvdyIse2Rpc3BsYXk6bH0pLG8mJih5LmhpZGRlbj0hZyksZyYmZmUoW2VdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtnfHxmZShbZV0pLEoucmVtb3ZlKGUsImZ4c2hvdyIpO2ZvcihyIGluIGQpdy5zdHlsZShlLHIsZFtyXSl9KSksdT1sdChnP3lbcl06MCxyLHApLHIgaW4geXx8KHlbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX19ZnVuY3Rpb24gZnQoZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYocj1HKG4pLGk9dFtyXSxvPWVbbl0sQXJyYXkuaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLChhPXcuY3NzSG9va3Nbcl0pJiYiZXhwYW5kImluIGEpe289YS5leHBhbmQobyksZGVsZXRlIGVbcl07Zm9yKG4gaW4gbyluIGluIGV8fChlW25dPW9bbl0sdFtuXT1pKX1lbHNlIHRbcl09aX1mdW5jdGlvbiBwdChlLHQsbil7dmFyIHIsaSxvPTAsYT1wdC5wcmVmaWx0ZXJzLmxlbmd0aCxzPXcuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKGkpcmV0dXJuITE7Zm9yKHZhciB0PW50fHxzdCgpLG49TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLXQpLHI9MS0obi9sLmR1cmF0aW9ufHwwKSxvPTAsYT1sLnR3ZWVucy5sZW5ndGg7bzxhO28rKylsLnR3ZWVuc1tvXS5ydW4ocik7cmV0dXJuIHMubm90aWZ5V2l0aChlLFtsLHIsbl0pLHI8MSYmYT9uOihhfHxzLm5vdGlmeVdpdGgoZSxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKGUsW2xdKSwhMSl9LGw9cy5wcm9taXNlKHtlbGVtOmUscHJvcHM6dy5leHRlbmQoe30sdCksb3B0czp3LmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6dy5lYXNpbmcuX2RlZmF1bHR9LG4pLG9yaWdpbmFsUHJvcGVydGllczp0LG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTpudHx8c3QoKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciByPXcuVHdlZW4oZSxsLm9wdHMsdCxuLGwub3B0cy5zcGVjaWFsRWFzaW5nW3RdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPTAscj10P2wudHdlZW5zLmxlbmd0aDowO2lmKGkpcmV0dXJuIHRoaXM7Zm9yKGk9ITA7bjxyO24rKylsLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIHQ/KHMubm90aWZ5V2l0aChlLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgoZSxbbCx0XSkpOnMucmVqZWN0V2l0aChlLFtsLHRdKSx0aGlzfX0pLGM9bC5wcm9wcztmb3IoZnQoYyxsLm9wdHMuc3BlY2lhbEVhc2luZyk7bzxhO28rKylpZihyPXB0LnByZWZpbHRlcnNbb10uY2FsbChsLGUsYyxsLm9wdHMpKXJldHVybiBnKHIuc3RvcCkmJih3Ll9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0b3A9ci5zdG9wLmJpbmQocikpLHI7cmV0dXJuIHcubWFwKGMsbHQsbCksZyhsLm9wdHMuc3RhcnQpJiZsLm9wdHMuc3RhcnQuY2FsbChlLGwpLGwucHJvZ3Jlc3MobC5vcHRzLnByb2dyZXNzKS5kb25lKGwub3B0cy5kb25lLGwub3B0cy5jb21wbGV0ZSkuZmFpbChsLm9wdHMuZmFpbCkuYWx3YXlzKGwub3B0cy5hbHdheXMpLHcuZngudGltZXIody5leHRlbmQodSx7ZWxlbTplLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbH13LkFuaW1hdGlvbj13LmV4dGVuZChwdCx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKGUsdCk7cmV0dXJuIHVlKG4uZWxlbSxlLGllLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7ZyhlKT8odD1lLGU9WyIqIl0pOmU9ZS5tYXRjaChNKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluPWVbcl0scHQudHdlZW5lcnNbbl09cHQudHdlZW5lcnNbbl18fFtdLHB0LnR3ZWVuZXJzW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W2N0XSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P3B0LnByZWZpbHRlcnMudW5zaGlmdChlKTpwdC5wcmVmaWx0ZXJzLnB1c2goZSl9fSksdy5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP3cuZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8ZyhlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYhZyh0KSYmdH07cmV0dXJuIHcuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIHcuZnguc3BlZWRzP3IuZHVyYXRpb249dy5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj13LmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXtnKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZ3LmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sdy5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoYWUpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXcuaXNFbXB0eU9iamVjdChlKSxvPXcuc3BlZWQodCxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgdD1wdCh0aGlzLHcuZXh0ZW5kKHt9LGUpLG8pOyhpfHxKLmdldCh0aGlzLCJmaW5pc2giKSkmJnQuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fCExPT09by5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG4pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihuPXQsdD1lLGU9dm9pZCAwKSx0JiYhMSE9PWUmJnRoaXMucXVldWUoZXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ITAsaT1udWxsIT1lJiZlKyJxdWV1ZUhvb2tzIixvPXcudGltZXJzLGE9Si5nZXQodGhpcyk7aWYoaSlhW2ldJiZhW2ldLnN0b3AmJnIoYVtpXSk7ZWxzZSBmb3IoaSBpbiBhKWFbaV0mJmFbaV0uc3RvcCYmb3QudGVzdChpKSYmcihhW2ldKTtmb3IoaT1vLmxlbmd0aDtpLS07KW9baV0uZWxlbSE9PXRoaXN8fG51bGwhPWUmJm9baV0ucXVldWUhPT1lfHwob1tpXS5hbmltLnN0b3AobiksdD0hMSxvLnNwbGljZShpLDEpKTshdCYmbnx8dy5kZXF1ZXVlKHRoaXMsZSl9KX0sZmluaXNoOmZ1bmN0aW9uKGUpe3JldHVybiExIT09ZSYmKGU9ZXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQsbj1KLmdldCh0aGlzKSxyPW5bZSsicXVldWUiXSxpPW5bZSsicXVldWVIb29rcyJdLG89dy50aW1lcnMsYT1yP3IubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLHcucXVldWUodGhpcyxlLFtdKSxpJiZpLnN0b3AmJmkuc3RvcC5jYWxsKHRoaXMsITApLHQ9by5sZW5ndGg7dC0tOylvW3RdLmVsZW09PT10aGlzJiZvW3RdLnF1ZXVlPT09ZSYmKG9bdF0uYW5pbS5zdG9wKCEwKSxvLnNwbGljZSh0LDEpKTtmb3IodD0wO3Q8YTt0Kyspclt0XSYmclt0XS5maW5pc2gmJnJbdF0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIG4uZmluaXNofSl9fSksdy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHQpe3ZhciBuPXcuZm5bdF07dy5mblt0XT1mdW5jdGlvbihlLHIsaSl7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09dHlwZW9mIGU/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKHV0KHQsITApLGUscixpKX19KSx3LmVhY2goe3NsaWRlRG93bjp1dCgic2hvdyIpLHNsaWRlVXA6dXQoImhpZGUiKSxzbGlkZVRvZ2dsZTp1dCgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSksdy50aW1lcnM9W10sdy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49dy50aW1lcnM7Zm9yKG50PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8dy5meC5zdG9wKCksbnQ9dm9pZCAwfSx3LmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe3cudGltZXJzLnB1c2goZSksdy5meC5zdGFydCgpfSx3LmZ4LmludGVydmFsPTEzLHcuZnguc3RhcnQ9ZnVuY3Rpb24oKXtydHx8KHJ0PSEwLGF0KCkpfSx3LmZ4LnN0b3A9ZnVuY3Rpb24oKXtydD1udWxsfSx3LmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSx3LmZuLmRlbGF5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9dy5meD93LmZ4LnNwZWVkc1t0XXx8dDp0LG49bnx8ImZ4Iix0aGlzLnF1ZXVlKG4sZnVuY3Rpb24obixyKXt2YXIgaT1lLnNldFRpbWVvdXQobix0KTtyLnN0b3A9ZnVuY3Rpb24oKXtlLmNsZWFyVGltZW91dChpKX19KX0sZnVuY3Rpb24oKXt2YXIgZT1yLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdD1yLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKHIuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO2UudHlwZT0iY2hlY2tib3giLGguY2hlY2tPbj0iIiE9PWUudmFsdWUsaC5vcHRTZWxlY3RlZD10LnNlbGVjdGVkLChlPXIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWU9InQiLGUudHlwZT0icmFkaW8iLGgucmFkaW9WYWx1ZT0idCI9PT1lLnZhbHVlfSgpO3ZhciBkdCxodD13LmV4cHIuYXR0ckhhbmRsZTt3LmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsdy5hdHRyLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt3LnJlbW92ZUF0dHIodGhpcyxlKX0pfX0pLHcuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgZS5nZXRBdHRyaWJ1dGU/dy5wcm9wKGUsdCxuKTooMT09PW8mJncuaXNYTUxEb2MoZSl8fChpPXcuYXR0ckhvb2tzW3QudG9Mb3dlckNhc2UoKV18fCh3LmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP2R0OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCB3LnJlbW92ZUF0dHIoZSx0KTppJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuKyIiKSxuKTppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOm51bGw9PShyPXcuZmluZC5hdHRyKGUsdCkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZighaC5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmTihlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXQmJnQubWF0Y2goTSk7aWYoaSYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1pW3IrK10pZS5yZW1vdmVBdHRyaWJ1dGUobil9fSksZHQ9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuITE9PT10P3cucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LHcuZWFjaCh3LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciBuPWh0W3RdfHx3LmZpbmQuYXR0cjtodFt0XT1mdW5jdGlvbihlLHQscil7dmFyIGksbyxhPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcnx8KG89aHRbYV0saHRbYV09aSxpPW51bGwhPW4oZSx0LHIpP2E6bnVsbCxodFthXT1vKSxpfX0pO3ZhciBndD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLHl0PS9eKD86YXxhcmVhKSQvaTt3LmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsdy5wcm9wLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t3LnByb3BGaXhbZV18fGVdfSl9fSksdy5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1lLm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuIDE9PT1vJiZ3LmlzWE1MRG9jKGUpfHwodD13LnByb3BGaXhbdF18fHQsaT13LnByb3BIb29rc1t0XSksdm9pZCAwIT09bj9pJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjplW3RdPW46aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjplW3RdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5maW5kLmF0dHIoZSwidGFiaW5kZXgiKTtyZXR1cm4gdD9wYXJzZUludCh0LDEwKTpndC50ZXN0KGUubm9kZU5hbWUpfHx5dC50ZXN0KGUubm9kZU5hbWUpJiZlLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSxoLm9wdFNlbGVjdGVkfHwody5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTt0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLHcuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7dy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pO2Z1bmN0aW9uIHZ0KGUpe3JldHVybihlLm1hdGNoKE0pfHxbXSkuam9pbigiICIpfWZ1bmN0aW9uIG10KGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIHh0KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6InN0cmluZyI9PXR5cGVvZiBlP2UubWF0Y2goTSl8fFtdOltdfXcuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyx1PTA7aWYoZyhlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3codGhpcykuYWRkQ2xhc3MoZS5jYWxsKHRoaXMsdCxtdCh0aGlzKSkpfSk7aWYoKHQ9eHQoZSkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPW10KG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit2dChpKSsiICIpe2E9MDt3aGlsZShvPXRbYSsrXSlyLmluZGV4T2YoIiAiK28rIiAiKTwwJiYocis9bysiICIpO2khPT0ocz12dChyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzLHU9MDtpZihnKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7dyh0aGlzKS5yZW1vdmVDbGFzcyhlLmNhbGwodGhpcyx0LG10KHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKCh0PXh0KGUpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT1tdChuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIrdnQoaSkrIiAiKXthPTA7d2hpbGUobz10W2ErK10pd2hpbGUoci5pbmRleE9mKCIgIitvKyIgIik+LTEpcj1yLnJlcGxhY2UoIiAiK28rIiAiLCIgIik7aSE9PShzPXZ0KHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZSxyPSJzdHJpbmciPT09bnx8QXJyYXkuaXNBcnJheShlKTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0JiZyP3Q/dGhpcy5hZGRDbGFzcyhlKTp0aGlzLnJlbW92ZUNsYXNzKGUpOmcoZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3codGhpcykudG9nZ2xlQ2xhc3MoZS5jYWxsKHRoaXMsbixtdCh0aGlzKSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LGksbyxhO2lmKHIpe2k9MCxvPXcodGhpcyksYT14dChlKTt3aGlsZSh0PWFbaSsrXSlvLmhhc0NsYXNzKHQpP28ucmVtb3ZlQ2xhc3ModCk6by5hZGRDbGFzcyh0KX1lbHNlIHZvaWQgMCE9PWUmJiJib29sZWFuIiE9PW58fCgodD1tdCh0aGlzKSkmJkouc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLHQpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHR8fCExPT09ZT8iIjpKLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPTA7dD0iICIrZSsiICI7d2hpbGUobj10aGlzW3IrK10paWYoMT09PW4ubm9kZVR5cGUmJigiICIrdnQobXQobikpKyIgIikuaW5kZXhPZih0KT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgYnQ9L1xyL2c7dy5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiByPWcoZSksdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciBpOzE9PT10aGlzLm5vZGVUeXBlJiYobnVsbD09KGk9cj9lLmNhbGwodGhpcyxuLHcodGhpcykudmFsKCkpOmUpP2k9IiI6Im51bWJlciI9PXR5cGVvZiBpP2krPSIiOkFycmF5LmlzQXJyYXkoaSkmJihpPXcubWFwKGksZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZSsiIn0pKSwodD13LnZhbEhvb2tzW3RoaXMudHlwZV18fHcudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJzZXQiaW4gdCYmdm9pZCAwIT09dC5zZXQodGhpcyxpLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1pKSl9KTtpZihpKXJldHVybih0PXcudmFsSG9va3NbaS50eXBlXXx8dy52YWxIb29rc1tpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiB0JiZ2b2lkIDAhPT0obj10LmdldChpLCJ2YWx1ZSIpKT9uOiJzdHJpbmciPT10eXBlb2Yobj1pLnZhbHVlKT9uLnJlcGxhY2UoYnQsIiIpOm51bGw9PW4/IiI6bn19fSksdy5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD13LmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6dnQody50ZXh0KGUpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPWUub3B0aW9ucyxvPWUuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PWUudHlwZSxzPWE/bnVsbDpbXSx1PWE/bysxOmkubGVuZ3RoO2ZvcihyPW88MD91OmE/bzowO3I8dTtyKyspaWYoKChuPWlbcl0pLnNlbGVjdGVkfHxyPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IU4obi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD13KG4pLnZhbCgpLGEpcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89dy5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pKChyPWlbYV0pLnNlbGVjdGVkPXcuaW5BcnJheSh3LnZhbEhvb2tzLm9wdGlvbi5nZXQociksbyk+LTEpJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX19KSx3LmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXt3LnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9dy5pbkFycmF5KHcoZSkudmFsKCksdCk+LTF9fSxoLmNoZWNrT258fCh3LnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSksaC5mb2N1c2luPSJvbmZvY3VzaW4iaW4gZTt2YXIgd3Q9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFR0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O3cuZXh0ZW5kKHcuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24odCxuLGksbyl7dmFyIGEscyx1LGwsYyxwLGQsaCx2PVtpfHxyXSxtPWYuY2FsbCh0LCJ0eXBlIik/dC50eXBlOnQseD1mLmNhbGwodCwibmFtZXNwYWNlIik/dC5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihzPWg9dT1pPWl8fHIsMyE9PWkubm9kZVR5cGUmJjghPT1pLm5vZGVUeXBlJiYhd3QudGVzdChtK3cuZXZlbnQudHJpZ2dlcmVkKSYmKG0uaW5kZXhPZigiLiIpPi0xJiYobT0oeD1tLnNwbGl0KCIuIikpLnNoaWZ0KCkseC5zb3J0KCkpLGM9bS5pbmRleE9mKCI6Iik8MCYmIm9uIittLHQ9dFt3LmV4cGFuZG9dP3Q6bmV3IHcuRXZlbnQobSwib2JqZWN0Ij09dHlwZW9mIHQmJnQpLHQuaXNUcmlnZ2VyPW8/MjozLHQubmFtZXNwYWNlPXguam9pbigiLiIpLHQucm5hbWVzcGFjZT10Lm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIit4LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsdC5yZXN1bHQ9dm9pZCAwLHQudGFyZ2V0fHwodC50YXJnZXQ9aSksbj1udWxsPT1uP1t0XTp3Lm1ha2VBcnJheShuLFt0XSksZD13LmV2ZW50LnNwZWNpYWxbbV18fHt9LG98fCFkLnRyaWdnZXJ8fCExIT09ZC50cmlnZ2VyLmFwcGx5KGksbikpKXtpZighbyYmIWQubm9CdWJibGUmJiF5KGkpKXtmb3IobD1kLmRlbGVnYXRlVHlwZXx8bSx3dC50ZXN0KGwrbSl8fChzPXMucGFyZW50Tm9kZSk7cztzPXMucGFyZW50Tm9kZSl2LnB1c2gocyksdT1zO3U9PT0oaS5vd25lckRvY3VtZW50fHxyKSYmdi5wdXNoKHUuZGVmYXVsdFZpZXd8fHUucGFyZW50V2luZG93fHxlKX1hPTA7d2hpbGUoKHM9dlthKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSloPXMsdC50eXBlPWE+MT9sOmQuYmluZFR5cGV8fG0sKHA9KEouZ2V0KHMsImV2ZW50cyIpfHx7fSlbdC50eXBlXSYmSi5nZXQocywiaGFuZGxlIikpJiZwLmFwcGx5KHMsbiksKHA9YyYmc1tjXSkmJnAuYXBwbHkmJlkocykmJih0LnJlc3VsdD1wLmFwcGx5KHMsbiksITE9PT10LnJlc3VsdCYmdC5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gdC50eXBlPW0sb3x8dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8ZC5fZGVmYXVsdCYmITEhPT1kLl9kZWZhdWx0LmFwcGx5KHYucG9wKCksbil8fCFZKGkpfHxjJiZnKGlbbV0pJiYheShpKSYmKCh1PWlbY10pJiYoaVtjXT1udWxsKSx3LmV2ZW50LnRyaWdnZXJlZD1tLHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5hZGRFdmVudExpc3RlbmVyKG0sVHQpLGlbbV0oKSx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmgucmVtb3ZlRXZlbnRMaXN0ZW5lcihtLFR0KSx3LmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsdSYmKGlbY109dSkpLHQucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXcuZXh0ZW5kKG5ldyB3LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMH0pO3cuZXZlbnQudHJpZ2dlcihyLG51bGwsdCl9fSksdy5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gdy5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKX19KSxoLmZvY3VzaW58fHcuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbihlKXt3LmV2ZW50LnNpbXVsYXRlKHQsZS50YXJnZXQsdy5ldmVudC5maXgoZSkpfTt3LmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGk9Si5hY2Nlc3Mocix0KTtpfHxyLmFkZEV2ZW50TGlzdGVuZXIoZSxuLCEwKSxKLmFjY2VzcyhyLHQsKGl8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxpPUouYWNjZXNzKHIsdCktMTtpP0ouYWNjZXNzKHIsdCxpKTooci5yZW1vdmVFdmVudExpc3RlbmVyKGUsbiwhMCksSi5yZW1vdmUocix0KSl9fX0pO3ZhciBDdD1lLmxvY2F0aW9uLEV0PURhdGUubm93KCksa3Q9L1w/Lzt3LnBhcnNlWE1MPWZ1bmN0aW9uKHQpe3ZhciBuO2lmKCF0fHwic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dHJ5e249KG5ldyBlLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsInRleHQveG1sIil9Y2F0Y2goZSl7bj12b2lkIDB9cmV0dXJuIG4mJiFuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8dy5lcnJvcigiSW52YWxpZCBYTUw6ICIrdCksbn07dmFyIFN0PS9cW1xdJC8sRHQ9L1xyP1xuL2csTnQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLEF0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBqdChlLHQsbixyKXt2YXIgaTtpZihBcnJheS5pc0FycmF5KHQpKXcuZWFjaCh0LGZ1bmN0aW9uKHQsaSl7bnx8U3QudGVzdChlKT9yKGUsaSk6anQoZSsiWyIrKCJvYmplY3QiPT10eXBlb2YgaSYmbnVsbCE9aT90OiIiKSsiXSIsaSxuLHIpfSk7ZWxzZSBpZihufHwib2JqZWN0IiE9PXgodCkpcihlLHQpO2Vsc2UgZm9yKGkgaW4gdClqdChlKyJbIitpKyJdIix0W2ldLG4scil9dy5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3ZhciBuPWcodCk/dCgpOnQ7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYoQXJyYXkuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF3LmlzUGxhaW5PYmplY3QoZSkpdy5lYWNoKGUsZnVuY3Rpb24oKXtpKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKG4gaW4gZSlqdChuLGVbbl0sdCxpKTtyZXR1cm4gci5qb2luKCImIil9LHcuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXcucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBlP3cubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXcodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZBdC50ZXN0KHRoaXMubm9kZU5hbWUpJiYhTnQudGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IXBlLnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49dyh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOkFycmF5LmlzQXJyYXkobik/dy5tYXAobixmdW5jdGlvbihlKXtyZXR1cm57bmFtZTp0Lm5hbWUsdmFsdWU6ZS5yZXBsYWNlKER0LCJcclxuIil9fSk6e25hbWU6dC5uYW1lLHZhbHVlOm4ucmVwbGFjZShEdCwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBxdD0vJTIwL2csTHQ9LyMuKiQvLEh0PS8oWz8mXSlfPVteJl0qLyxPdD0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLFB0PS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLE10PS9eKD86R0VUfEhFQUQpJC8sUnQ9L15cL1wvLyxJdD17fSxXdD17fSwkdD0iKi8iLmNvbmNhdCgiKiIpLEJ0PXIuY3JlYXRlRWxlbWVudCgiYSIpO0J0LmhyZWY9Q3QuaHJlZjtmdW5jdGlvbiBGdChlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXsic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iKiIpO3ZhciByLGk9MCxvPXQudG9Mb3dlckNhc2UoKS5tYXRjaChNKXx8W107aWYoZyhuKSl3aGlsZShyPW9baSsrXSkiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwoZVtyXT1lW3JdfHxbXSkudW5zaGlmdChuKSk6KGVbcl09ZVtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uIF90KGUsdCxuLHIpe3ZhciBpPXt9LG89ZT09PVd0O2Z1bmN0aW9uIGEocyl7dmFyIHU7cmV0dXJuIGlbc109ITAsdy5lYWNoKGVbc118fFtdLGZ1bmN0aW9uKGUscyl7dmFyIGw9cyh0LG4scik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBsfHxvfHxpW2xdP28/ISh1PWwpOnZvaWQgMDoodC5kYXRhVHlwZXMudW5zaGlmdChsKSxhKGwpLCExKX0pLHV9cmV0dXJuIGEodC5kYXRhVHlwZXNbMF0pfHwhaVsiKiJdJiZhKCIqIil9ZnVuY3Rpb24genQoZSx0KXt2YXIgbixyLGk9dy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIHQpdm9pZCAwIT09dFtuXSYmKChpW25dP2U6cnx8KHI9e30pKVtuXT10W25dKTtyZXR1cm4gciYmdy5leHRlbmQoITAsZSxyKSxlfWZ1bmN0aW9uIFh0KGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IoaSBpbiBzKWlmKHNbaV0mJnNbaV0udGVzdChyKSl7dS51bnNoaWZ0KGkpO2JyZWFrfWlmKHVbMF1pbiBuKW89dVswXTtlbHNle2ZvcihpIGluIG4pe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbaSsiICIrdVswXV0pe289aTticmVha31hfHwoYT1pKX1vPW98fGF9aWYobylyZXR1cm4gbyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dfWZ1bmN0aW9uIFV0KGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD17fSxjPWUuZGF0YVR5cGVzLnNsaWNlKCk7aWYoY1sxXSlmb3IoYSBpbiBlLmNvbnZlcnRlcnMpbFthLnRvTG93ZXJDYXNlKCldPWUuY29udmVydGVyc1thXTtvPWMuc2hpZnQoKTt3aGlsZShvKWlmKGUucmVzcG9uc2VGaWVsZHNbb10mJihuW2UucmVzcG9uc2VGaWVsZHNbb11dPXQpLCF1JiZyJiZlLmRhdGFGaWx0ZXImJih0PWUuZGF0YUZpbHRlcih0LGUuZGF0YVR5cGUpKSx1PW8sbz1jLnNoaWZ0KCkpaWYoIioiPT09bylvPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09byl7aWYoIShhPWxbdSsiICIrb118fGxbIiogIitvXSkpZm9yKGkgaW4gbClpZigocz1pLnNwbGl0KCIgIikpWzFdPT09byYmKGE9bFt1KyIgIitzWzBdXXx8bFsiKiAiK3NbMF1dKSl7ITA9PT1hP2E9bFtpXTohMCE9PWxbaV0mJihvPXNbMF0sYy51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmZVsidGhyb3dzIl0pdD1hKHQpO2Vsc2UgdHJ5e3Q9YSh0KX1jYXRjaChlKXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjphP2U6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK299fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6dH19dy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOkN0LmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOlB0LnRlc3QoQ3QucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6JHQsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOncucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P3p0KHp0KGUsdy5hamF4U2V0dGluZ3MpLHQpOnp0KHcuYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkZ0KEl0KSxhamF4VHJhbnNwb3J0OkZ0KFd0KSxhamF4OmZ1bmN0aW9uKHQsbil7Im9iamVjdCI9PXR5cGVvZiB0JiYobj10LHQ9dm9pZCAwKSxuPW58fHt9O3ZhciBpLG8sYSxzLHUsbCxjLGYscCxkLGg9dy5hamF4U2V0dXAoe30sbiksZz1oLmNvbnRleHR8fGgseT1oLmNvbnRleHQmJihnLm5vZGVUeXBlfHxnLmpxdWVyeSk/dyhnKTp3LmV2ZW50LHY9dy5EZWZlcnJlZCgpLG09dy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikseD1oLnN0YXR1c0NvZGV8fHt9LGI9e30sVD17fSxDPSJjYW5jZWxlZCIsRT17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGMpe2lmKCFzKXtzPXt9O3doaWxlKHQ9T3QuZXhlYyhhKSlzW3RbMV0udG9Mb3dlckNhc2UoKV09dFsyXX10PXNbZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09dD9udWxsOnR9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBjP2E6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1jJiYoZT1UW2UudG9Mb3dlckNhc2UoKV09VFtlLnRvTG93ZXJDYXNlKCldfHxlLGJbZV09dCksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09YyYmKGgubWltZVR5cGU9ZSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihlKXt2YXIgdDtpZihlKWlmKGMpRS5hbHdheXMoZVtFLnN0YXR1c10pO2Vsc2UgZm9yKHQgaW4gZSl4W3RdPVt4W3RdLGVbdF1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHxDO3JldHVybiBpJiZpLmFib3J0KHQpLGsoMCx0KSx0aGlzfX07aWYodi5wcm9taXNlKEUpLGgudXJsPSgodHx8aC51cmx8fEN0LmhyZWYpKyIiKS5yZXBsYWNlKFJ0LEN0LnByb3RvY29sKyIvLyIpLGgudHlwZT1uLm1ldGhvZHx8bi50eXBlfHxoLm1ldGhvZHx8aC50eXBlLGguZGF0YVR5cGVzPShoLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goTSl8fFsiIl0sbnVsbD09aC5jcm9zc0RvbWFpbil7bD1yLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7bC5ocmVmPWgudXJsLGwuaHJlZj1sLmhyZWYsaC5jcm9zc0RvbWFpbj1CdC5wcm90b2NvbCsiLy8iK0J0Lmhvc3QhPWwucHJvdG9jb2wrIi8vIitsLmhvc3R9Y2F0Y2goZSl7aC5jcm9zc0RvbWFpbj0hMH19aWYoaC5kYXRhJiZoLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGguZGF0YSYmKGguZGF0YT13LnBhcmFtKGguZGF0YSxoLnRyYWRpdGlvbmFsKSksX3QoSXQsaCxuLEUpLGMpcmV0dXJuIEU7KGY9dy5ldmVudCYmaC5nbG9iYWwpJiYwPT13LmFjdGl2ZSsrJiZ3LmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGgudHlwZT1oLnR5cGUudG9VcHBlckNhc2UoKSxoLmhhc0NvbnRlbnQ9IU10LnRlc3QoaC50eXBlKSxvPWgudXJsLnJlcGxhY2UoTHQsIiIpLGguaGFzQ29udGVudD9oLmRhdGEmJmgucHJvY2Vzc0RhdGEmJjA9PT0oaC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoaC5kYXRhPWguZGF0YS5yZXBsYWNlKHF0LCIrIikpOihkPWgudXJsLnNsaWNlKG8ubGVuZ3RoKSxoLmRhdGEmJihoLnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIGguZGF0YSkmJihvKz0oa3QudGVzdChvKT8iJiI6Ij8iKStoLmRhdGEsZGVsZXRlIGguZGF0YSksITE9PT1oLmNhY2hlJiYobz1vLnJlcGxhY2UoSHQsIiQxIiksZD0oa3QudGVzdChvKT8iJiI6Ij8iKSsiXz0iK0V0KysrZCksaC51cmw9bytkKSxoLmlmTW9kaWZpZWQmJih3Lmxhc3RNb2RpZmllZFtvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsdy5sYXN0TW9kaWZpZWRbb10pLHcuZXRhZ1tvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIix3LmV0YWdbb10pKSwoaC5kYXRhJiZoLmhhc0NvbnRlbnQmJiExIT09aC5jb250ZW50VHlwZXx8bi5jb250ZW50VHlwZSkmJkUuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixoLmNvbnRlbnRUeXBlKSxFLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsaC5kYXRhVHlwZXNbMF0mJmguYWNjZXB0c1toLmRhdGFUeXBlc1swXV0/aC5hY2NlcHRzW2guZGF0YVR5cGVzWzBdXSsoIioiIT09aC5kYXRhVHlwZXNbMF0/IiwgIiskdCsiOyBxPTAuMDEiOiIiKTpoLmFjY2VwdHNbIioiXSk7Zm9yKHAgaW4gaC5oZWFkZXJzKUUuc2V0UmVxdWVzdEhlYWRlcihwLGguaGVhZGVyc1twXSk7aWYoaC5iZWZvcmVTZW5kJiYoITE9PT1oLmJlZm9yZVNlbmQuY2FsbChnLEUsaCl8fGMpKXJldHVybiBFLmFib3J0KCk7aWYoQz0iYWJvcnQiLG0uYWRkKGguY29tcGxldGUpLEUuZG9uZShoLnN1Y2Nlc3MpLEUuZmFpbChoLmVycm9yKSxpPV90KFd0LGgsbixFKSl7aWYoRS5yZWFkeVN0YXRlPTEsZiYmeS50cmlnZ2VyKCJhamF4U2VuZCIsW0UsaF0pLGMpcmV0dXJuIEU7aC5hc3luYyYmaC50aW1lb3V0PjAmJih1PWUuc2V0VGltZW91dChmdW5jdGlvbigpe0UuYWJvcnQoInRpbWVvdXQiKX0saC50aW1lb3V0KSk7dHJ5e2M9ITEsaS5zZW5kKGIsayl9Y2F0Y2goZSl7aWYoYyl0aHJvdyBlO2soLTEsZSl9fWVsc2UgaygtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gayh0LG4scixzKXt2YXIgbCxwLGQsYixULEM9bjtjfHwoYz0hMCx1JiZlLmNsZWFyVGltZW91dCh1KSxpPXZvaWQgMCxhPXN8fCIiLEUucmVhZHlTdGF0ZT10PjA/NDowLGw9dD49MjAwJiZ0PDMwMHx8MzA0PT09dCxyJiYoYj1YdChoLEUscikpLGI9VXQoaCxiLEUsbCksbD8oaC5pZk1vZGlmaWVkJiYoKFQ9RS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKSYmKHcubGFzdE1vZGlmaWVkW29dPVQpLChUPUUuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJih3LmV0YWdbb109VCkpLDIwND09PXR8fCJIRUFEIj09PWgudHlwZT9DPSJub2NvbnRlbnQiOjMwND09PXQ/Qz0ibm90bW9kaWZpZWQiOihDPWIuc3RhdGUscD1iLmRhdGEsbD0hKGQ9Yi5lcnJvcikpKTooZD1DLCF0JiZDfHwoQz0iZXJyb3IiLHQ8MCYmKHQ9MCkpKSxFLnN0YXR1cz10LEUuc3RhdHVzVGV4dD0obnx8QykrIiIsbD92LnJlc29sdmVXaXRoKGcsW3AsQyxFXSk6di5yZWplY3RXaXRoKGcsW0UsQyxkXSksRS5zdGF0dXNDb2RlKHgpLHg9dm9pZCAwLGYmJnkudHJpZ2dlcihsPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW0UsaCxsP3A6ZF0pLG0uZmlyZVdpdGgoZyxbRSxDXSksZiYmKHkudHJpZ2dlcigiYWpheENvbXBsZXRlIixbRSxoXSksLS13LmFjdGl2ZXx8dy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIEV9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB3LmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdy5nZXQoZSx2b2lkIDAsdCwic2NyaXB0Iil9fSksdy5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsdCl7d1t0XT1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4gZyhuKSYmKGk9aXx8cixyPW4sbj12b2lkIDApLHcuYWpheCh3LmV4dGVuZCh7dXJsOmUsdHlwZTp0LGRhdGFUeXBlOmksZGF0YTpuLHN1Y2Nlc3M6cn0sdy5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSksdy5fZXZhbFVybD1mdW5jdGlvbihlKXtyZXR1cm4gdy5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSx3LmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpc1swXSYmKGcoZSkmJihlPWUuY2FsbCh0aGlzWzBdKSksdD13KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihlKXtyZXR1cm4gZyhlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7dyh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dyh0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD1nKGUpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7dyh0aGlzKS53cmFwQWxsKHQ/ZS5jYWxsKHRoaXMsbik6ZSl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7dyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSx3LmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIXcuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LHcuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSx3LmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBWdD17MDoyMDAsMTIyMzoyMDR9LEd0PXcuYWpheFNldHRpbmdzLnhocigpO2guY29ycz0hIUd0JiYid2l0aENyZWRlbnRpYWxzImluIEd0LGguYWpheD1HdD0hIUd0LHcuYWpheFRyYW5zcG9ydChmdW5jdGlvbih0KXt2YXIgbixyO2lmKGguY29yc3x8R3QmJiF0LmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGksbyl7dmFyIGEscz10LnhocigpO2lmKHMub3Blbih0LnR5cGUsdC51cmwsdC5hc3luYyx0LnVzZXJuYW1lLHQucGFzc3dvcmQpLHQueGhyRmllbGRzKWZvcihhIGluIHQueGhyRmllbGRzKXNbYV09dC54aHJGaWVsZHNbYV07dC5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUodC5taW1lVHlwZSksdC5jcm9zc0RvbWFpbnx8aVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoaVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihhIGluIGkpcy5zZXRSZXF1ZXN0SGVhZGVyKGEsaVthXSk7bj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtuJiYobj1yPXMub25sb2FkPXMub25lcnJvcj1zLm9uYWJvcnQ9cy5vbnRpbWVvdXQ9cy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09ZT9zLmFib3J0KCk6ImVycm9yIj09PWU/Im51bWJlciIhPXR5cGVvZiBzLnN0YXR1cz9vKDAsImVycm9yIik6byhzLnN0YXR1cyxzLnN0YXR1c1RleHQpOm8oVnRbcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInRleHQiIT09KHMucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHMucmVzcG9uc2VUZXh0P3tiaW5hcnk6cy5yZXNwb25zZX06e3RleHQ6cy5yZXNwb25zZVRleHR9LHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPW4oKSxyPXMub25lcnJvcj1zLm9udGltZW91dD1uKCJlcnJvciIpLHZvaWQgMCE9PXMub25hYm9ydD9zLm9uYWJvcnQ9cjpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1zLnJlYWR5U3RhdGUmJmUuc2V0VGltZW91dChmdW5jdGlvbigpe24mJnIoKX0pfSxuPW4oImFib3J0Iik7dHJ5e3Muc2VuZCh0Lmhhc0NvbnRlbnQmJnQuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYobil0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX0pLHcuYWpheFByZWZpbHRlcihmdW5jdGlvbihlKXtlLmNyb3NzRG9tYWluJiYoZS5jb250ZW50cy5zY3JpcHQ9ITEpfSksdy5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZ2xvYmFsRXZhbChlKSxlfX19KSx3LmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS5jYWNoZSYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9IkdFVCIpfSksdy5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2lmKGUuY3Jvc3NEb21haW4pe3ZhciB0LG47cmV0dXJue3NlbmQ6ZnVuY3Rpb24oaSxvKXt0PXcoIjxzY3JpcHQ+IikucHJvcCh7Y2hhcnNldDplLnNjcmlwdENoYXJzZXQsc3JjOmUudXJsfSkub24oImxvYWQgZXJyb3IiLG49ZnVuY3Rpb24oZSl7dC5yZW1vdmUoKSxuPW51bGwsZSYmbygiZXJyb3IiPT09ZS50eXBlPzQwNDoyMDAsZS50eXBlKX0pLHIuaGVhZC5hcHBlbmRDaGlsZCh0WzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX19KTt2YXIgWXQ9W10sUXQ9Lyg9KVw/KD89JnwkKXxcP1w/Lzt3LmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9WXQucG9wKCl8fHcuZXhwYW5kbysiXyIrRXQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLHcuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24odCxuLHIpe3ZhciBpLG8sYSxzPSExIT09dC5qc29ucCYmKFF0LnRlc3QodC51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgdC5kYXRhJiYwPT09KHQuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmUXQudGVzdCh0LmRhdGEpJiYiZGF0YSIpO2lmKHN8fCJqc29ucCI9PT10LmRhdGFUeXBlc1swXSlyZXR1cm4gaT10Lmpzb25wQ2FsbGJhY2s9Zyh0Lmpzb25wQ2FsbGJhY2spP3QuanNvbnBDYWxsYmFjaygpOnQuanNvbnBDYWxsYmFjayxzP3Rbc109dFtzXS5yZXBsYWNlKFF0LCIkMSIraSk6ITEhPT10Lmpzb25wJiYodC51cmwrPShrdC50ZXN0KHQudXJsKT8iJiI6Ij8iKSt0Lmpzb25wKyI9IitpKSx0LmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gYXx8dy5lcnJvcihpKyIgd2FzIG5vdCBjYWxsZWQiKSxhWzBdfSx0LmRhdGFUeXBlc1swXT0ianNvbiIsbz1lW2ldLGVbaV09ZnVuY3Rpb24oKXthPWFyZ3VtZW50c30sci5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1vP3coZSkucmVtb3ZlUHJvcChpKTplW2ldPW8sdFtpXSYmKHQuanNvbnBDYWxsYmFjaz1uLmpzb25wQ2FsbGJhY2ssWXQucHVzaChpKSksYSYmZyhvKSYmbyhhWzBdKSxhPW89dm9pZCAwfSksInNjcmlwdCJ9KSxoLmNyZWF0ZUhUTUxEb2N1bWVudD1mdW5jdGlvbigpe3ZhciBlPXIuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5O3JldHVybiBlLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1lLmNoaWxkTm9kZXMubGVuZ3RofSgpLHcucGFyc2VIVE1MPWZ1bmN0aW9uKGUsdCxuKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuW107ImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKTt2YXIgaSxvLGE7cmV0dXJuIHR8fChoLmNyZWF0ZUhUTUxEb2N1bWVudD8oKGk9KHQ9ci5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpKS5jcmVhdGVFbGVtZW50KCJiYXNlIikpLmhyZWY9ci5sb2NhdGlvbi5ocmVmLHQuaGVhZC5hcHBlbmRDaGlsZChpKSk6dD1yKSxvPUEuZXhlYyhlKSxhPSFuJiZbXSxvP1t0LmNyZWF0ZUVsZW1lbnQob1sxXSldOihvPXhlKFtlXSx0LGEpLGEmJmEubGVuZ3RoJiZ3KGEpLnJlbW92ZSgpLHcubWVyZ2UoW10sby5jaGlsZE5vZGVzKSl9LHcuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybiBzPi0xJiYocj12dChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksZyh0KT8obj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksYS5sZW5ndGg+MCYmdy5hamF4KHt1cmw6ZSx0eXBlOml8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP3coIjxkaXY+IikuYXBwZW5kKHcucGFyc2VIVE1MKGUpKS5maW5kKHIpOmUpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pfSksdGhpc30sdy5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oZSx0KXt3LmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksdy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZ3JlcCh3LnRpbWVycyxmdW5jdGlvbih0KXtyZXR1cm4gZT09PXQuZWxlbX0pLmxlbmd0aH0sdy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYz13LmNzcyhlLCJwb3NpdGlvbiIpLGY9dyhlKSxwPXt9OyJzdGF0aWMiPT09YyYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1mLm9mZnNldCgpLG89dy5jc3MoZSwidG9wIiksdT13LmNzcyhlLCJsZWZ0IiksKGw9KCJhYnNvbHV0ZSI9PT1jfHwiZml4ZWQiPT09YykmJihvK3UpLmluZGV4T2YoImF1dG8iKT4tMSk/KGE9KHI9Zi5wb3NpdGlvbigpKS50b3AsaT1yLmxlZnQpOihhPXBhcnNlRmxvYXQobyl8fDAsaT1wYXJzZUZsb2F0KHUpfHwwKSxnKHQpJiYodD10LmNhbGwoZSxuLHcuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihwLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihwLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxwKTpmLmNzcyhwKX19LHcuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oZSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt3Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIHQsbixyPXRoaXNbMF07aWYocilyZXR1cm4gci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8odD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6dC50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OnQubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH19LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxpPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT13LmNzcyhyLCJwb3NpdGlvbiIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT13LmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5wYXJlbnROb2RlO2UmJmUhPT1yJiYxPT09ZS5ub2RlVHlwZSYmKChpPXcoZSkub2Zmc2V0KCkpLnRvcCs9dy5jc3MoZSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxpLmxlZnQrPXcuY3NzKGUsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOnQudG9wLWkudG9wLXcuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LWkubGVmdC13LmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmInN0YXRpYyI9PT13LmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV8fGJlfSl9fSksdy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIG49InBhZ2VZT2Zmc2V0Ij09PXQ7dy5mbltlXT1mdW5jdGlvbihyKXtyZXR1cm4geih0aGlzLGZ1bmN0aW9uKGUscixpKXt2YXIgbztpZih5KGUpP289ZTo5PT09ZS5ub2RlVHlwZSYmKG89ZS5kZWZhdWx0Vmlldyksdm9pZCAwPT09aSlyZXR1cm4gbz9vW3RdOmVbcl07bz9vLnNjcm9sbFRvKG4/by5wYWdlWE9mZnNldDppLG4/aTpvLnBhZ2VZT2Zmc2V0KTplW3JdPWl9LGUscixhcmd1bWVudHMubGVuZ3RoKX19KSx3LmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSx0KXt3LmNzc0hvb2tzW3RdPV9lKGgucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLG4pe2lmKG4pcmV0dXJuIG49RmUoZSx0KSxXZS50ZXN0KG4pP3coZSkucG9zaXRpb24oKVt0XSsicHgiOm59KX0pLHcuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsdCl7dy5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50OnQsIiI6Im91dGVyIitlfSxmdW5jdGlvbihuLHIpe3cuZm5bcl09ZnVuY3Rpb24oaSxvKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2YgaSkscz1ufHwoITA9PT1pfHwhMD09PW8/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB6KHRoaXMsZnVuY3Rpb24odCxuLGkpe3ZhciBvO3JldHVybiB5KHQpPzA9PT1yLmluZGV4T2YoIm91dGVyIik/dFsiaW5uZXIiK2VdOnQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2VdOjk9PT10Lm5vZGVUeXBlPyhvPXQuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KHQuYm9keVsic2Nyb2xsIitlXSxvWyJzY3JvbGwiK2VdLHQuYm9keVsib2Zmc2V0IitlXSxvWyJvZmZzZXQiK2VdLG9bImNsaWVudCIrZV0pKTp2b2lkIDA9PT1pP3cuY3NzKHQsbixzKTp3LnN0eWxlKHQsbixpLHMpfSx0LGE/aTp2b2lkIDAsYSl9fSl9KSx3LmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXt3LmZuW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKHQsbnVsbCxlLG4pOnRoaXMudHJpZ2dlcih0KX19KSx3LmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9fSksdy5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9uKGUsbnVsbCx0LG4pfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vZmYoZSxudWxsLHQpfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwiKioiLG4pfX0pLHcucHJveHk9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYobj1lW3RdLHQ9ZSxlPW4pLGcoZSkpcmV0dXJuIHI9by5jYWxsKGFyZ3VtZW50cywyKSxpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChvLmNhbGwoYXJndW1lbnRzKSkpfSxpLmd1aWQ9ZS5ndWlkPWUuZ3VpZHx8dy5ndWlkKyssaX0sdy5ob2xkUmVhZHk9ZnVuY3Rpb24oZSl7ZT93LnJlYWR5V2FpdCsrOncucmVhZHkoITApfSx3LmlzQXJyYXk9QXJyYXkuaXNBcnJheSx3LnBhcnNlSlNPTj1KU09OLnBhcnNlLHcubm9kZU5hbWU9Tix3LmlzRnVuY3Rpb249Zyx3LmlzV2luZG93PXksdy5jYW1lbENhc2U9Ryx3LnR5cGU9eCx3Lm5vdz1EYXRlLm5vdyx3LmlzTnVtZXJpYz1mdW5jdGlvbihlKXt2YXIgdD13LnR5cGUoZSk7cmV0dXJuKCJudW1iZXIiPT09dHx8InN0cmluZyI9PT10KSYmIWlzTmFOKGUtcGFyc2VGbG9hdChlKSl9LCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB3fSk7dmFyIEp0PWUualF1ZXJ5LEt0PWUuJDtyZXR1cm4gdy5ub0NvbmZsaWN0PWZ1bmN0aW9uKHQpe3JldHVybiBlLiQ9PT13JiYoZS4kPUt0KSx0JiZlLmpRdWVyeT09PXcmJihlLmpRdWVyeT1KdCksd30sdHx8KGUualF1ZXJ5PWUuJD13KSx3fSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAqIGpRdWVyeSBUZW1wbGF0ZXMgUGx1Z2luIDEuMC4wcHJlCiAqIGh0dHA6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdG1wbAogKiBSZXF1aXJlcyBqUXVlcnkgMS40LjIKICoKICogQ29weXJpZ2h0IFNvZnR3YXJlIEZyZWVkb20gQ29uc2VydmFuY3ksIEluYy4KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICovCihmdW5jdGlvbihhKXt2YXIgcj1hLmZuLmRvbU1hbmlwLGQ9Il90bXBsaXRlbSIscT0vXltePF0qKDxbXHdcV10rPilbXj5dKiR8XHtce1whIC8sYj17fSxmPXt9LGUscD17a2V5OjAsZGF0YTp7fX0saT0wLGM9MCxsPVtdO2Z1bmN0aW9uIGcoZyxkLGgsZSl7dmFyIGM9e2RhdGE6ZXx8KGU9PT0wfHxlPT09ZmFsc2UpP2U6ZD9kLmRhdGE6e30sX3dyYXA6ZD9kLl93cmFwOm51bGwsdG1wbDpudWxsLHBhcmVudDpkfHxudWxsLG5vZGVzOltdLGNhbGxzOnUsbmVzdDp3LHdyYXA6eCxodG1sOnYsdXBkYXRlOnR9O2cmJmEuZXh0ZW5kKGMsZyx7bm9kZXM6W10scGFyZW50OmR9KTtpZihoKXtjLnRtcGw9aDtjLl9jdG50PWMuX2N0bnR8fGMudG1wbChhLGMpO2Mua2V5PSsraTsobC5sZW5ndGg/ZjpiKVtpXT1jfXJldHVybiBjfWEuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGYsZCl7YS5mbltmXT1mdW5jdGlvbihuKXt2YXIgZz1bXSxpPWEobiksayxoLG0sbCxqPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2U9Ynx8e307aWYoaiYmai5ub2RlVHlwZT09PTExJiZqLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmaS5sZW5ndGg9PT0xKXtpW2RdKHRoaXNbMF0pO2c9dGhpc31lbHNle2ZvcihoPTAsbT1pLmxlbmd0aDtoPG07aCsrKXtjPWg7az0oaD4wP3RoaXMuY2xvbmUodHJ1ZSk6dGhpcykuZ2V0KCk7YShpW2hdKVtkXShrKTtnPWcuY29uY2F0KGspfWM9MDtnPXRoaXMucHVzaFN0YWNrKGcsZixpLnNlbGVjdG9yKX1sPWU7ZT1udWxsO2EudG1wbC5jb21wbGV0ZShsKTtyZXR1cm4gZ319KTthLmZuLmV4dGVuZCh7dG1wbDpmdW5jdGlvbihkLGMsYil7cmV0dXJuIGEudG1wbCh0aGlzWzBdLGQsYyxiKX0sdG1wbEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gYS50bXBsSXRlbSh0aGlzWzBdKX0sdGVtcGxhdGU6ZnVuY3Rpb24oYil7cmV0dXJuIGEudGVtcGxhdGUoYix0aGlzWzBdKX0sZG9tTWFuaXA6ZnVuY3Rpb24oZCxtLGspe2lmKGRbMF0mJmEuaXNBcnJheShkWzBdKSl7dmFyIGc9YS5tYWtlQXJyYXkoYXJndW1lbnRzKSxoPWRbMF0saj1oLmxlbmd0aCxpPTAsZjt3aGlsZShpPGomJiEoZj1hLmRhdGEoaFtpKytdLCJ0bXBsSXRlbSIpKSk7aWYoZiYmYylnWzJdPWZ1bmN0aW9uKGIpe2EudG1wbC5hZnRlck1hbmlwKHRoaXMsYixrKX07ci5hcHBseSh0aGlzLGcpfWVsc2Ugci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Yz0wOyFlJiZhLnRtcGwuY29tcGxldGUoYik7cmV0dXJuIHRoaXN9fSk7YS5leHRlbmQoe3RtcGw6ZnVuY3Rpb24oZCxoLGUsYyl7dmFyIGksaz0hYztpZihrKXtjPXA7ZD1hLnRlbXBsYXRlW2RdfHxhLnRlbXBsYXRlKG51bGwsZCk7Zj17fX1lbHNlIGlmKCFkKXtkPWMudG1wbDtiW2Mua2V5XT1jO2Mubm9kZXM9W107Yy53cmFwcGVkJiZuKGMsYy53cmFwcGVkKTtyZXR1cm4gYShqKGMsbnVsbCxjLnRtcGwoYSxjKSkpfWlmKCFkKXJldHVybltdO2lmKHR5cGVvZiBoPT09ImZ1bmN0aW9uIiloPWguY2FsbChjfHx7fSk7ZSYmZS53cmFwcGVkJiZuKGUsZS53cmFwcGVkKTtpPWEuaXNBcnJheShoKT9hLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhP2coZSxjLGQsYSk6bnVsbH0pOltnKGUsYyxkLGgpXTtyZXR1cm4gaz9hKGooYyxudWxsLGkpKTppfSx0bXBsSXRlbTpmdW5jdGlvbihiKXt2YXIgYztpZihiIGluc3RhbmNlb2YgYSliPWJbMF07d2hpbGUoYiYmYi5ub2RlVHlwZT09PTEmJiEoYz1hLmRhdGEoYiwidG1wbEl0ZW0iKSkmJihiPWIucGFyZW50Tm9kZSkpO3JldHVybiBjfHxwfSx0ZW1wbGF0ZTpmdW5jdGlvbihjLGIpe2lmKGIpe2lmKHR5cGVvZiBiPT09InN0cmluZyIpYj1vKGIpO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIGEpYj1iWzBdfHx7fTtpZihiLm5vZGVUeXBlKWI9YS5kYXRhKGIsInRtcGwiKXx8YS5kYXRhKGIsInRtcGwiLG8oYi5pbm5lckhUTUwpKTtyZXR1cm4gdHlwZW9mIGM9PT0ic3RyaW5nIj8oYS50ZW1wbGF0ZVtjXT1iKTpifXJldHVybiBjP3R5cGVvZiBjIT09InN0cmluZyI/YS50ZW1wbGF0ZShudWxsLGMpOmEudGVtcGxhdGVbY118fGEudGVtcGxhdGUobnVsbCxxLnRlc3QoYyk/YzphKGMpKTpudWxsfSxlbmNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuKCIiK2EpLnNwbGl0KCImIikuam9pbigiJmFtcDsiKS5zcGxpdCgiPCIpLmpvaW4oIiZsdDsiKS5zcGxpdCgiPiIpLmpvaW4oIiZndDsiKS5zcGxpdCgnIicpLmpvaW4oIiYjMzQ7Iikuc3BsaXQoIiciKS5qb2luKCImIzM5OyIpfX0pO2EuZXh0ZW5kKGEudG1wbCx7dGFnOnt0bXBsOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiJpZigkbm90bnVsbF8xKXtfXz1fXy5jb25jYXQoJGl0ZW0ubmVzdCgkMSwkMikpO30ifSx3cmFwOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiIkaXRlbS5jYWxscyhfXywkMSwkMik7X189W107IixjbG9zZToiY2FsbD0kaXRlbS5jYWxscygpO19fPWNhbGwuXy5jb25jYXQoJGl0ZW0ud3JhcChjYWxsLF9fKSk7In0sZWFjaDp7X2RlZmF1bHQ6eyQyOiIkaW5kZXgsICR2YWx1ZSJ9LG9wZW46ImlmKCRub3RudWxsXzEpeyQuZWFjaCgkMWEsZnVuY3Rpb24oJDIpe3dpdGgodGhpcyl7IixjbG9zZToifX0pO30ifSwiaWYiOntvcGVuOiJpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsiLGNsb3NlOiJ9In0sImVsc2UiOntfZGVmYXVsdDp7JDE6InRydWUifSxvcGVuOiJ9ZWxzZSBpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsifSxodG1sOntvcGVuOiJpZigkbm90bnVsbF8xKXtfXy5wdXNoKCQxYSk7fSJ9LCI9Ijp7X2RlZmF1bHQ6eyQxOiIkZGF0YSJ9LG9wZW46ImlmKCRub3RudWxsXzEpe19fLnB1c2goJC5lbmNvZGUoJDFhKSk7fSJ9LCIhIjp7b3BlbjoiIn19LGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yj17fX0sYWZ0ZXJNYW5pcDpmdW5jdGlvbihmLGIsZCl7dmFyIGU9Yi5ub2RlVHlwZT09PTExP2EubWFrZUFycmF5KGIuY2hpbGROb2Rlcyk6Yi5ub2RlVHlwZT09PTE/W2JdOltdO2QuY2FsbChmLGIpO20oZSk7YysrfX0pO2Z1bmN0aW9uIGooZSxnLGYpe3ZhciBiLGM9Zj9hLm1hcChmLGZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2Uua2V5P2EucmVwbGFjZSgvKDxcdyspKD89W1xzPl0pKD8hW14+XSpfdG1wbGl0ZW0pKFtePl0qKS9nLCIkMSAiK2QrJz0iJytlLmtleSsnIiAkMicpOmE6aihhLGUsYS5fY3RudCl9KTplO2lmKGcpcmV0dXJuIGM7Yz1jLmpvaW4oIiIpO2MucmVwbGFjZSgvXlxzKihbXjxcc11bXjxdKik/KDxbXHdcV10rPikoW14+XSpbXj5cc10pP1xzKiQvLGZ1bmN0aW9uKGYsYyxlLGQpe2I9YShlKS5nZXQoKTttKGIpO2lmKGMpYj1rKGMpLmNvbmNhdChiKTtpZihkKWI9Yi5jb25jYXQoayhkKSl9KTtyZXR1cm4gYj9iOmsoYyl9ZnVuY3Rpb24gayhjKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlubmVySFRNTD1jO3JldHVybiBhLm1ha2VBcnJheShiLmNoaWxkTm9kZXMpfWZ1bmN0aW9uIG8oYil7cmV0dXJuIG5ldyBGdW5jdGlvbigialF1ZXJ5IiwiJGl0ZW0iLCJ2YXIgJD1qUXVlcnksY2FsbCxfXz1bXSwkZGF0YT0kaXRlbS5kYXRhO3dpdGgoJGRhdGEpe19fLnB1c2goJyIrYS50cmltKGIpLnJlcGxhY2UoLyhbXFwnXSkvZywiXFwkMSIpLnJlcGxhY2UoL1tcclx0XG5dL2csIiAiKS5yZXBsYWNlKC9cJFx7KFteXH1dKilcfS9nLCJ7ez0gJDF9fSIpLnJlcGxhY2UoL1x7XHsoXC8/KShcdyt8LikoPzpcKCgoPzpbXlx9XXxcfSg/IVx9KSkqPyk/XCkpPyg/OlxzKyguKj8pPyk/KFwoKCg/OlteXH1dfFx9KD8hXH0pKSo/KVwpKT9ccypcfVx9L2csZnVuY3Rpb24obSxsLGssZyxiLGMsZCl7dmFyIGo9YS50bXBsLnRhZ1trXSxpLGUsZjtpZighail0aHJvdyJVbmtub3duIHRlbXBsYXRlIHRhZzogIitrO2k9ai5fZGVmYXVsdHx8W107aWYoYyYmIS9cdyQvLnRlc3QoYikpe2IrPWM7Yz0iIn1pZihiKXtiPWgoYik7ZD1kPyIsIitoKGQpKyIpIjpjPyIpIjoiIjtlPWM/Yi5pbmRleE9mKCIuIik+LTE/YitoKGMpOiIoIitiKyIpLmNhbGwoJGl0ZW0iK2Q6YjtmPWM/ZToiKHR5cGVvZigiK2IrIik9PT0nZnVuY3Rpb24nPygiK2IrIikuY2FsbCgkaXRlbSk6KCIrYisiKSkifWVsc2UgZj1lPWkuJDF8fCJudWxsIjtnPWgoZyk7cmV0dXJuIicpOyIraltsPyJjbG9zZSI6Im9wZW4iXS5zcGxpdCgiJG5vdG51bGxfMSIpLmpvaW4oYj8idHlwZW9mKCIrYisiKSE9PSd1bmRlZmluZWQnICYmICgiK2IrIikhPW51bGwiOiJ0cnVlIikuc3BsaXQoIiQxYSIpLmpvaW4oZikuc3BsaXQoIiQxIikuam9pbihlKS5zcGxpdCgiJDIiKS5qb2luKGd8fGkuJDJ8fCIiKSsiX18ucHVzaCgnIn0pKyInKTt9cmV0dXJuIF9fOyIpfWZ1bmN0aW9uIG4oYyxiKXtjLl93cmFwPWooYyx0cnVlLGEuaXNBcnJheShiKT9iOltxLnRlc3QoYik/YjphKGIpLmh0bWwoKV0pLmpvaW4oIiIpfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGE/YS5yZXBsYWNlKC9cXCcvZywiJyIpLnJlcGxhY2UoL1xcXFwvZywiXFwiKTpudWxsfWZ1bmN0aW9uIHMoYil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5hcHBlbmRDaGlsZChiLmNsb25lTm9kZSh0cnVlKSk7cmV0dXJuIGEuaW5uZXJIVE1MfWZ1bmN0aW9uIG0obyl7dmFyIG49Il8iK2MsayxqLGw9e30sZSxwLGg7Zm9yKGU9MCxwPW8ubGVuZ3RoO2U8cDtlKyspe2lmKChrPW9bZV0pLm5vZGVUeXBlIT09MSljb250aW51ZTtqPWsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTtmb3IoaD1qLmxlbmd0aC0xO2g+PTA7aC0tKW0oaltoXSk7bShrKX1mdW5jdGlvbiBtKGope3ZhciBwLGg9aixrLGUsbTtpZihtPWouZ2V0QXR0cmlidXRlKGQpKXt3aGlsZShoLnBhcmVudE5vZGUmJihoPWgucGFyZW50Tm9kZSkubm9kZVR5cGU9PT0xJiYhKHA9aC5nZXRBdHRyaWJ1dGUoZCkpKTtpZihwIT09bSl7aD1oLnBhcmVudE5vZGU/aC5ub2RlVHlwZT09PTExPzA6aC5nZXRBdHRyaWJ1dGUoZCl8fDA6MDtpZighKGU9YlttXSkpe2U9ZlttXTtlPWcoZSxiW2hdfHxmW2hdKTtlLmtleT0rK2k7YltpXT1lfWMmJm8obSl9ai5yZW1vdmVBdHRyaWJ1dGUoZCl9ZWxzZSBpZihjJiYoZT1hLmRhdGEoaiwidG1wbEl0ZW0iKSkpe28oZS5rZXkpO2JbZS5rZXldPWU7aD1hLmRhdGEoai5wYXJlbnROb2RlLCJ0bXBsSXRlbSIpO2g9aD9oLmtleTowfWlmKGUpe2s9ZTt3aGlsZShrJiZrLmtleSE9aCl7ay5ub2Rlcy5wdXNoKGopO2s9ay5wYXJlbnR9ZGVsZXRlIGUuX2N0bnQ7ZGVsZXRlIGUuX3dyYXA7YS5kYXRhKGosInRtcGxJdGVtIixlKX1mdW5jdGlvbiBvKGEpe2E9YStuO2U9bFthXT1sW2FdfHxnKGUsYltlLnBhcmVudC5rZXkrbl18fGUucGFyZW50KX19fWZ1bmN0aW9uIHUoYSxkLGMsYil7aWYoIWEpcmV0dXJuIGwucG9wKCk7bC5wdXNoKHtfOmEsdG1wbDpkLGl0ZW06dGhpcyxkYXRhOmMsb3B0aW9uczpifSl9ZnVuY3Rpb24gdyhkLGMsYil7cmV0dXJuIGEudG1wbChhLnRlbXBsYXRlKGQpLGMsYix0aGlzKX1mdW5jdGlvbiB4KGIsZCl7dmFyIGM9Yi5vcHRpb25zfHx7fTtjLndyYXBwZWQ9ZDtyZXR1cm4gYS50bXBsKGEudGVtcGxhdGUoYi50bXBsKSxiLmRhdGEsYyxiLml0ZW0pfWZ1bmN0aW9uIHYoZCxjKXt2YXIgYj10aGlzLl93cmFwO3JldHVybiBhLm1hcChhKGEuaXNBcnJheShiKT9iLmpvaW4oIiIpOmIpLmZpbHRlcihkfHwiKiIpLGZ1bmN0aW9uKGEpe3JldHVybiBjP2EuaW5uZXJUZXh0fHxhLnRleHRDb250ZW50OmEub3V0ZXJIVE1MfHxzKGEpfSl9ZnVuY3Rpb24gdCgpe3ZhciBiPXRoaXMubm9kZXM7YS50bXBsKG51bGwsbnVsbCxudWxsLHRoaXMpLmluc2VydEJlZm9yZShiWzBdKTthKGIpLnJlbW92ZSgpfX0pKGpRdWVyeSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiFmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImpxdWVyeSJdLGUpOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUocmVxdWlyZSgianF1ZXJ5IikpOmUoalF1ZXJ5KX0oZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1lLnRhYmxlc29ydGVyPXt2ZXJzaW9uOiIyLjMwLjUiLHBhcnNlcnM6W10sd2lkZ2V0czpbXSxkZWZhdWx0czp7dGhlbWU6ImRlZmF1bHQiLHdpZHRoRml4ZWQ6ITEsc2hvd1Byb2Nlc3Npbmc6ITEsaGVhZGVyVGVtcGxhdGU6Intjb250ZW50fSIsb25SZW5kZXJUZW1wbGF0ZTpudWxsLG9uUmVuZGVySGVhZGVyOm51bGwsY2FuY2VsU2VsZWN0aW9uOiEwLHRhYkluZGV4OiEwLGRhdGVGb3JtYXQ6Im1tZGR5eXl5Iixzb3J0TXVsdGlTb3J0S2V5OiJzaGlmdEtleSIsc29ydFJlc2V0S2V5OiJjdHJsS2V5Iix1c051bWJlckZvcm1hdDohMCxkZWxheUluaXQ6ITEsc2VydmVyU2lkZVNvcnRpbmc6ITEscmVzb3J0OiEwLGhlYWRlcnM6e30saWdub3JlQ2FzZTohMCxzb3J0Rm9yY2U6bnVsbCxzb3J0TGlzdDpbXSxzb3J0QXBwZW5kOm51bGwsc29ydFN0YWJsZTohMSxzb3J0SW5pdGlhbE9yZGVyOiJhc2MiLHNvcnRMb2NhbGVDb21wYXJlOiExLHNvcnRSZXNldDohMSxzb3J0UmVzdGFydDohMSxlbXB0eVRvOiJib3R0b20iLHN0cmluZ1RvOiJtYXgiLGR1cGxpY2F0ZVNwYW46ITAsdGV4dEV4dHJhY3Rpb246ImJhc2ljIix0ZXh0QXR0cmlidXRlOiJkYXRhLXRleHQiLHRleHRTb3J0ZXI6bnVsbCxudW1iZXJTb3J0ZXI6bnVsbCxpbml0V2lkZ2V0czohMCx3aWRnZXRDbGFzczoid2lkZ2V0LXtuYW1lfSIsd2lkZ2V0czpbXSx3aWRnZXRPcHRpb25zOnt6ZWJyYTpbImV2ZW4iLCJvZGQiXX0saW5pdGlhbGl6ZWQ6bnVsbCx0YWJsZUNsYXNzOiIiLGNzc0FzYzoiIixjc3NEZXNjOiIiLGNzc05vbmU6IiIsY3NzSGVhZGVyOiIiLGNzc0hlYWRlclJvdzoiIixjc3NQcm9jZXNzaW5nOiIiLGNzc0NoaWxkUm93OiJ0YWJsZXNvcnRlci1jaGlsZFJvdyIsY3NzSW5mb0Jsb2NrOiJ0YWJsZXNvcnRlci1pbmZvT25seSIsY3NzTm9Tb3J0OiJ0YWJsZXNvcnRlci1ub1NvcnQiLGNzc0lnbm9yZVJvdzoidGFibGVzb3J0ZXItaWdub3JlUm93Iixjc3NJY29uOiJ0YWJsZXNvcnRlci1pY29uIixjc3NJY29uTm9uZToiIixjc3NJY29uQXNjOiIiLGNzc0ljb25EZXNjOiIiLGNzc0ljb25EaXNhYmxlZDoiIixwb2ludGVyQ2xpY2s6ImNsaWNrIixwb2ludGVyRG93bjoibW91c2Vkb3duIixwb2ludGVyVXA6Im1vdXNldXAiLHNlbGVjdG9ySGVhZGVyczoiPiB0aGVhZCB0aCwgPiB0aGVhZCB0ZCIsc2VsZWN0b3JTb3J0OiJ0aCwgdGQiLHNlbGVjdG9yUmVtb3ZlOiIucmVtb3ZlLW1lIixkZWJ1ZzohMSxoZWFkZXJMaXN0OltdLGVtcHRpZXM6e30sc3RyaW5nczp7fSxwYXJzZXJzOltdLGdsb2JhbGl6ZTowLGltZ0F0dHI6MH0sY3NzOnt0YWJsZToidGFibGVzb3J0ZXIiLGNzc0hhc0NoaWxkOiJ0YWJsZXNvcnRlci1oYXNDaGlsZFJvdyIsY2hpbGRSb3c6InRhYmxlc29ydGVyLWNoaWxkUm93Iixjb2xncm91cDoidGFibGVzb3J0ZXItY29sZ3JvdXAiLGhlYWRlcjoidGFibGVzb3J0ZXItaGVhZGVyIixoZWFkZXJSb3c6InRhYmxlc29ydGVyLWhlYWRlclJvdyIsaGVhZGVySW46InRhYmxlc29ydGVyLWhlYWRlci1pbm5lciIsaWNvbjoidGFibGVzb3J0ZXItaWNvbiIscHJvY2Vzc2luZzoidGFibGVzb3J0ZXItcHJvY2Vzc2luZyIsc29ydEFzYzoidGFibGVzb3J0ZXItaGVhZGVyQXNjIixzb3J0RGVzYzoidGFibGVzb3J0ZXItaGVhZGVyRGVzYyIsc29ydE5vbmU6InRhYmxlc29ydGVyLWhlYWRlclVuU29ydGVkIn0sbGFuZ3VhZ2U6e3NvcnRBc2M6IkFzY2VuZGluZyBzb3J0IGFwcGxpZWQsICIsc29ydERlc2M6IkRlc2NlbmRpbmcgc29ydCBhcHBsaWVkLCAiLHNvcnROb25lOiJObyBzb3J0IGFwcGxpZWQsICIsc29ydERpc2FibGVkOiJzb3J0aW5nIGlzIGRpc2FibGVkIixuZXh0QXNjOiJhY3RpdmF0ZSB0byBhcHBseSBhbiBhc2NlbmRpbmcgc29ydCIsbmV4dERlc2M6ImFjdGl2YXRlIHRvIGFwcGx5IGEgZGVzY2VuZGluZyBzb3J0IixuZXh0Tm9uZToiYWN0aXZhdGUgdG8gcmVtb3ZlIHRoZSBzb3J0In0scmVnZXg6e3RlbXBsYXRlQ29udGVudDovXHtjb250ZW50XH0vZyx0ZW1wbGF0ZUljb246L1x7aWNvblx9L2csdGVtcGxhdGVOYW1lOi9ce25hbWVcfS9pLHNwYWNlczovXHMrL2csbm9uV29yZDovXFcvZyxmb3JtRWxlbWVudHM6LyhpbnB1dHxzZWxlY3R8YnV0dG9ufHRleHRhcmVhKS9pLGNodW5rOi8oXihbK1wtXT8oPzpcZCopKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPyk/JHxeMHhbMC05YS1mXSskfFxkKykvZ2ksY2h1bmtzOi8oXlxcMHxcXDAkKS8saGV4Oi9eMHhbMC05YS1mXSskL2ksY29tbWE6LywvZyxkaWdpdE5vblVTOi9bXHN8XC5dL2csZGlnaXROZWdhdGl2ZVRlc3Q6L15ccypcKFsuXGRdK1wpLyxkaWdpdE5lZ2F0aXZlUmVwbGFjZTovXlxzKlwoKFsuXGRdKylcKS8sZGlnaXRUZXN0Oi9eW1wtKyhdP1xkK1spXT8kLyxkaWdpdFJlcGxhY2U6L1ssLiciXHNdL2d9LHN0cmluZzp7bWF4OjEsbWluOi0xLGVtcHR5bWluOjEsZW1wdHltYXg6LTEsemVybzowLG5vbmU6MCwibnVsbCI6MCx0b3A6ITAsYm90dG9tOiExfSxrZXlDb2Rlczp7ZW50ZXI6MTN9LGRhdGVzOnt9LGluc3RhbmNlTWV0aG9kczp7fSxzZXR1cDpmdW5jdGlvbihyLG8pe2lmKHImJnIudEhlYWQmJjAhPT1yLnRCb2RpZXMubGVuZ3RoJiYhMCE9PXIuaGFzSW5pdGlhbGl6ZWQpe3ZhciBzPSIiLGE9ZShyKSxuPWUubWV0YWRhdGE7ci5oYXNJbml0aWFsaXplZD0hMSxyLmlzUHJvY2Vzc2luZz0hMCxyLmNvbmZpZz1vLGUuZGF0YShyLCJ0YWJsZXNvcnRlciIsbyksdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkluaXRpYWxpemluZyB0YWJsZXNvcnRlciB2Iit0LnZlcnNpb24pLGUuZGF0YShyLCJzdGFydG92ZXJhbGx0aW1lciIsbmV3IERhdGUpKSxvLnN1cHBvcnRzRGF0YU9iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZVswXT1wYXJzZUludChlWzBdLDEwKSxlWzBdPjF8fDE9PT1lWzBdJiZwYXJzZUludChlWzFdLDEwKT49NH0oZS5mbi5qcXVlcnkuc3BsaXQoIi4iKSksby5lbXB0eVRvPW8uZW1wdHlUby50b0xvd2VyQ2FzZSgpLG8uc3RyaW5nVG89by5zdHJpbmdUby50b0xvd2VyQ2FzZSgpLG8ubGFzdD17c29ydExpc3Q6W10sY2xpY2tlZEluZGV4Oi0xfSwvdGFibGVzb3J0ZXJcLS8udGVzdChhLmF0dHIoImNsYXNzIikpfHwocz0iIiE9PW8udGhlbWU/IiB0YWJsZXNvcnRlci0iK28udGhlbWU6IiIpLG8ubmFtZXNwYWNlP28ubmFtZXNwYWNlPSIuIitvLm5hbWVzcGFjZS5yZXBsYWNlKHQucmVnZXgubm9uV29yZCwiIik6by5uYW1lc3BhY2U9Ii50YWJsZXNvcnRlciIrTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiksby50YWJsZT1yLG8uJHRhYmxlPWEuYWRkQ2xhc3ModC5jc3MudGFibGUrIiAiK28udGFibGVDbGFzcytzKyIgIitvLm5hbWVzcGFjZS5zbGljZSgxKSkuYXR0cigicm9sZSIsImdyaWQiKSxvLiRoZWFkZXJzPWEuZmluZChvLnNlbGVjdG9ySGVhZGVycyksby4kdGFibGUuY2hpbGRyZW4oKS5jaGlsZHJlbigidHIiKS5hdHRyKCJyb2xlIiwicm93Iiksby4kdGJvZGllcz1hLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrby5jc3NJbmZvQmxvY2srIikiKS5hdHRyKHsiYXJpYS1saXZlIjoicG9saXRlIiwiYXJpYS1yZWxldmFudCI6ImFsbCJ9KSxvLiR0YWJsZS5jaGlsZHJlbigiY2FwdGlvbiIpLmxlbmd0aCYmKChzPW8uJHRhYmxlLmNoaWxkcmVuKCJjYXB0aW9uIilbMF0pLmlkfHwocy5pZD1vLm5hbWVzcGFjZS5zbGljZSgxKSsiY2FwdGlvbiIpLG8uJHRhYmxlLmF0dHIoImFyaWEtbGFiZWxsZWRieSIscy5pZCkpLG8ud2lkZ2V0SW5pdD17fSxvLnRleHRFeHRyYWN0aW9uPW8uJHRhYmxlLmF0dHIoImRhdGEtdGV4dC1leHRyYWN0aW9uIil8fG8udGV4dEV4dHJhY3Rpb258fCJiYXNpYyIsdC5idWlsZEhlYWRlcnMobyksdC5maXhDb2x1bW5XaWR0aChyKSx0LmFkZFdpZGdldEZyb21DbGFzcyhyKSx0LmFwcGx5V2lkZ2V0T3B0aW9ucyhyKSx0LnNldHVwUGFyc2VycyhvKSxvLnRvdGFsUm93cz0wLG8uZGVidWcmJnQudmFsaWRhdGVPcHRpb25zKG8pLG8uZGVsYXlJbml0fHx0LmJ1aWxkQ2FjaGUobyksdC5iaW5kRXZlbnRzKHIsby4kaGVhZGVycywhMCksdC5iaW5kTWV0aG9kcyhvKSxvLnN1cHBvcnRzRGF0YU9iamVjdCYmdm9pZCAwIT09YS5kYXRhKCkuc29ydGxpc3Q/by5zb3J0TGlzdD1hLmRhdGEoKS5zb3J0bGlzdDpuJiZhLm1ldGFkYXRhKCkmJmEubWV0YWRhdGEoKS5zb3J0bGlzdCYmKG8uc29ydExpc3Q9YS5tZXRhZGF0YSgpLnNvcnRsaXN0KSx0LmFwcGx5V2lkZ2V0KHIsITApLG8uc29ydExpc3QubGVuZ3RoPjA/dC5zb3J0T24obyxvLnNvcnRMaXN0LHt9LCFvLmluaXRXaWRnZXRzKToodC5zZXRIZWFkZXJzQ3NzKG8pLG8uaW5pdFdpZGdldHMmJnQuYXBwbHlXaWRnZXQociwhMSkpLG8uc2hvd1Byb2Nlc3NpbmcmJmEudW5iaW5kKCJzb3J0QmVnaW4iK28ubmFtZXNwYWNlKyIgc29ydEVuZCIrby5uYW1lc3BhY2UpLmJpbmQoInNvcnRCZWdpbiIrby5uYW1lc3BhY2UrIiBzb3J0RW5kIitvLm5hbWVzcGFjZSxmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoby50aW1lclByb2Nlc3NpbmcpLHQuaXNQcm9jZXNzaW5nKHIpLCJzb3J0QmVnaW4iPT09ZS50eXBlJiYoby50aW1lclByb2Nlc3Npbmc9c2V0VGltZW91dChmdW5jdGlvbigpe3QuaXNQcm9jZXNzaW5nKHIsITApfSw1MDApKX0pLHIuaGFzSW5pdGlhbGl6ZWQ9ITAsci5pc1Byb2Nlc3Npbmc9ITEsdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlLmxvZygiT3ZlcmFsbCBpbml0aWFsaXphdGlvbiB0aW1lOiIrdC5iZW5jaG1hcmsoZS5kYXRhKHIsInN0YXJ0b3ZlcmFsbHRpbWVyIikpKSx0LmRlYnVnKG8sImNvcmUiKSYmY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSxhLnRyaWdnZXJIYW5kbGVyKCJ0YWJsZXNvcnRlci1pbml0aWFsaXplZCIsciksImZ1bmN0aW9uIj09dHlwZW9mIG8uaW5pdGlhbGl6ZWQmJm8uaW5pdGlhbGl6ZWQocil9ZWxzZSB0LmRlYnVnKG8sImNvcmUiKSYmKHIuaGFzSW5pdGlhbGl6ZWQ/Y29uc29sZS53YXJuKCJTdG9wcGluZyBpbml0aWFsaXphdGlvbi4gVGFibGVzb3J0ZXIgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCIpOmNvbnNvbGUuZXJyb3IoIlN0b3BwaW5nIGluaXRpYWxpemF0aW9uISBObyB0YWJsZSwgdGhlYWQgb3IgdGJvZHkiLHIpKX0sYmluZE1ldGhvZHM6ZnVuY3Rpb24ocil7dmFyIG89ci4kdGFibGUscz1yLm5hbWVzcGFjZSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgYWRkUm93cyB1cGRhdGVDZWxsIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyBkZXN0cm95IG1vdXNldXAgbW91c2VsZWF2ZSAiLnNwbGl0KCIgIikuam9pbihzKyIgIik7by51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLmJpbmQoInNvcnRSZXNldCIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5zb3J0UmVzZXQodGhpcy5jb25maWcsZnVuY3Rpb24oZSl7ZS5pc0FwcGx5aW5nV2lkZ2V0cz9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5hcHBseVdpZGdldChlLCIiLHIpfSwxMDApOnQuYXBwbHlXaWRnZXQoZSwiIixyKX0pfSkuYmluZCgidXBkYXRlQWxsIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQWxsKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGUiK3MrIiB1cGRhdGVSb3dzIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGVIZWFkZXJzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUhlYWRlcnModGhpcy5jb25maWcscil9KS5iaW5kKCJ1cGRhdGVDZWxsIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC51cGRhdGVDZWxsKHRoaXMuY29uZmlnLHIsbyxzKX0pLmJpbmQoImFkZFJvd3MiK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFkZFJvd3ModGhpcy5jb25maWcscixvLHMpfSkuYmluZCgidXBkYXRlQ29tcGxldGUiK3MsZnVuY3Rpb24oKXt0aGlzLmlzVXBkYXRpbmc9ITF9KS5iaW5kKCJzb3J0b24iK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnNvcnRPbih0aGlzLmNvbmZpZyxyLG8scyl9KS5iaW5kKCJhcHBlbmRDYWNoZSIrcyxmdW5jdGlvbihyLG8scyl7ci5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGVuZENhY2hlKHRoaXMuY29uZmlnLHMpLGUuaXNGdW5jdGlvbihvKSYmbyh0aGlzKX0pLmJpbmQoInVwZGF0ZUNhY2hlIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQ2FjaGUodGhpcy5jb25maWcscixvKX0pLmJpbmQoImFwcGx5V2lkZ2V0SWQiK3MsZnVuY3Rpb24oZSxyKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuYXBwbHlXaWRnZXRJZCh0aGlzLHIpfSkuYmluZCgiYXBwbHlXaWRnZXRzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGx5V2lkZ2V0KHRoaXMsITEscil9KS5iaW5kKCJyZWZyZXNoV2lkZ2V0cyIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlZnJlc2hXaWRnZXRzKHRoaXMscixvKX0pLmJpbmQoInJlbW92ZVdpZGdldCIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlbW92ZVdpZGdldCh0aGlzLHIsbyl9KS5iaW5kKCJkZXN0cm95IitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuZGVzdHJveSh0aGlzLHIsbyl9KS5iaW5kKCJyZXNldFRvTG9hZFN0YXRlIitzLGZ1bmN0aW9uKG8pe28uc3RvcFByb3BhZ2F0aW9uKCksdC5yZW1vdmVXaWRnZXQodGhpcywhMCwhMSk7dmFyIHM9ZS5leHRlbmQoITAse30sci5vcmlnaW5hbFNldHRpbmdzKTsocj1lLmV4dGVuZCghMCx7fSx0LmRlZmF1bHRzLHMpKS5vcmlnaW5hbFNldHRpbmdzPXMsdGhpcy5oYXNJbml0aWFsaXplZD0hMSx0LnNldHVwKHRoaXMscil9KX0sYmluZEV2ZW50czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbj0ocj1lKHIpWzBdKS5jb25maWcsaT1uLm5hbWVzcGFjZSxsPW51bGw7ITAhPT1zJiYoby5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfaGVhZGVycyIpLChhPXQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpKS5sZW5ndGgmJiJUQUJMRSI9PT1hWzBdLm5vZGVOYW1lJiZhWzBdIT09ciYmZShhWzBdKS5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfdGFibGUiKSksYT0obi5wb2ludGVyRG93bisiICIrbi5wb2ludGVyVXArIiAiK24ucG9pbnRlckNsaWNrKyIgc29ydCBrZXl1cCAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikuc3BsaXQoIiAiKS5qb2luKGkrIiAiKSxvLmZpbmQobi5zZWxlY3RvclNvcnQpLmFkZChvLmZpbHRlcihuLnNlbGVjdG9yU29ydCkpLnVuYmluZChhKS5iaW5kKGEsZnVuY3Rpb24ocixvKXt2YXIgcyxhLGksZD1lKHIudGFyZ2V0KSxjPSIgIityLnR5cGUrIiAiO2lmKCEoMSE9PShyLndoaWNofHxyLmJ1dHRvbikmJiFjLm1hdGNoKCIgIituLnBvaW50ZXJDbGljaysiIHwgc29ydCB8IGtleXVwICIpfHwiIGtleXVwICI9PT1jJiZyLndoaWNoIT09dC5rZXlDb2Rlcy5lbnRlcnx8Yy5tYXRjaCgiICIrbi5wb2ludGVyQ2xpY2srIiAiKSYmdm9pZCAwIT09ci53aGljaHx8Yy5tYXRjaCgiICIrbi5wb2ludGVyVXArIiAiKSYmbCE9PXIudGFyZ2V0JiYhMCE9PW8pKXtpZihjLm1hdGNoKCIgIituLnBvaW50ZXJEb3duKyIgIikpcmV0dXJuIGw9ci50YXJnZXQsdm9pZCgiMSI9PT0oaT1kLmpxdWVyeS5zcGxpdCgiLiIpKVswXSYmaVsxXTw0JiZyLnByZXZlbnREZWZhdWx0KCkpO2lmKGw9bnVsbCxzPXQuZ2V0Q2xvc2VzdChlKHRoaXMpLCIuIit0LmNzcy5oZWFkZXIpLHQucmVnZXguZm9ybUVsZW1lbnRzLnRlc3Qoci50YXJnZXQubm9kZU5hbWUpfHxkLmhhc0NsYXNzKG4uY3NzTm9Tb3J0KXx8ZC5wYXJlbnRzKCIuIituLmNzc05vU29ydCkubGVuZ3RoPjB8fHMuaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHxkLnBhcmVudHMoImJ1dHRvbiIpLmxlbmd0aD4wKXJldHVybiFuLmNhbmNlbFNlbGVjdGlvbjtuLmRlbGF5SW5pdCYmdC5pc0VtcHR5T2JqZWN0KG4uY2FjaGUpJiZ0LmJ1aWxkQ2FjaGUobiksbi5sYXN0LmNsaWNrZWRJbmRleD1zLmF0dHIoImRhdGEtY29sdW1uIil8fHMuaW5kZXgoKSwoYT1uLiRoZWFkZXJJbmRleGVkW24ubGFzdC5jbGlja2VkSW5kZXhdWzBdKSYmIWEuc29ydERpc2FibGVkJiZ0LmluaXRTb3J0KG4sYSxyKX19KSxuLmNhbmNlbFNlbGVjdGlvbiYmby5hdHRyKCJ1bnNlbGVjdGFibGUiLCJvbiIpLmJpbmQoInNlbGVjdHN0YXJ0IiwhMSkuY3NzKHsidXNlci1zZWxlY3QiOiJub25lIixNb3pVc2VyU2VsZWN0OiJub25lIn0pfSxidWlsZEhlYWRlcnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG47Zm9yKHIuaGVhZGVyTGlzdD1bXSxyLmhlYWRlckNvbnRlbnQ9W10sci5zb3J0VmFycz1bXSx0LmRlYnVnKHIsImNvcmUiKSYmKGE9bmV3IERhdGUpLHIuY29sdW1ucz10LmNvbXB1dGVDb2x1bW5JbmRleChyLiR0YWJsZS5jaGlsZHJlbigidGhlYWQsIHRmb290IikuY2hpbGRyZW4oInRyIikpLHM9ci5jc3NJY29uPyc8aSBjbGFzcz0iJysoci5jc3NJY29uPT09dC5jc3MuaWNvbj90LmNzcy5pY29uOnIuY3NzSWNvbisiICIrdC5jc3MuaWNvbikrJyI+PC9pPic6IiIsci4kaGVhZGVycz1lKGUubWFwKHIuJHRhYmxlLmZpbmQoci5zZWxlY3RvckhlYWRlcnMpLGZ1bmN0aW9uKG8sYSl7dmFyIG4saSxsLGQsYyxnPWUobyk7aWYoIXQuZ2V0Q2xvc2VzdChnLCJ0ciIpLmhhc0NsYXNzKHIuY3NzSWdub3JlUm93KSlyZXR1cm4vKHRofHRkKS9pLnRlc3Qoby5ub2RlTmFtZSl8fChjPXQuZ2V0Q2xvc2VzdChnLCJ0aCwgdGQiKSxnLmF0dHIoImRhdGEtY29sdW1uIixjLmF0dHIoImRhdGEtY29sdW1uIikpKSxuPXQuZ2V0Q29sdW1uRGF0YShyLnRhYmxlLHIuaGVhZGVycyxhLCEwKSxyLmhlYWRlckNvbnRlbnRbYV09Zy5odG1sKCksIiI9PT1yLmhlYWRlclRlbXBsYXRlfHxnLmZpbmQoIi4iK3QuY3NzLmhlYWRlckluKS5sZW5ndGh8fChkPXIuaGVhZGVyVGVtcGxhdGUucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlQ29udGVudCxnLmh0bWwoKSkucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlSWNvbixnLmZpbmQoIi4iK3QuY3NzLmljb24pLmxlbmd0aD8iIjpzKSxyLm9uUmVuZGVyVGVtcGxhdGUmJihpPXIub25SZW5kZXJUZW1wbGF0ZS5hcHBseShnLFthLGRdKSkmJiJzdHJpbmciPT10eXBlb2YgaSYmKGQ9aSksZy5odG1sKCc8ZGl2IGNsYXNzPSInK3QuY3NzLmhlYWRlckluKyciPicrZCsiPC9kaXY+IikpLHIub25SZW5kZXJIZWFkZXImJnIub25SZW5kZXJIZWFkZXIuYXBwbHkoZyxbYSxyLHIuJHRhYmxlXSksbD1wYXJzZUludChnLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG8uY29sdW1uPWwsYz10LmdldE9yZGVyKHQuZ2V0RGF0YShnLG4sInNvcnRJbml0aWFsT3JkZXIiKXx8ci5zb3J0SW5pdGlhbE9yZGVyKSxyLnNvcnRWYXJzW2xdPXtjb3VudDotMSxvcmRlcjpjP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxsb2NrZWRPcmRlcjohMX0sdm9pZCAwIT09KGM9dC5nZXREYXRhKGcsbiwibG9ja2VkT3JkZXIiKXx8ITEpJiYhMSE9PWMmJihyLnNvcnRWYXJzW2xdLmxvY2tlZE9yZGVyPSEwLHIuc29ydFZhcnNbbF0ub3JkZXI9dC5nZXRPcmRlcihjKT9bMSwxXTpbMCwwXSksci5oZWFkZXJMaXN0W2FdPW8sZy5hZGRDbGFzcyh0LmNzcy5oZWFkZXIrIiAiK3IuY3NzSGVhZGVyKSx0LmdldENsb3Nlc3QoZywidHIiKS5hZGRDbGFzcyh0LmNzcy5oZWFkZXJSb3crIiAiK3IuY3NzSGVhZGVyUm93KS5hdHRyKCJyb2xlIiwicm93Iiksci50YWJJbmRleCYmZy5hdHRyKCJ0YWJpbmRleCIsMCksb30pKSxyLiRoZWFkZXJJbmRleGVkPVtdLG49MDtuPHIuY29sdW1ucztuKyspdC5pc0VtcHR5T2JqZWN0KHIuc29ydFZhcnNbbl0pJiYoci5zb3J0VmFyc1tuXT17fSksbz1yLiRoZWFkZXJzLmZpbHRlcignW2RhdGEtY29sdW1uPSInK24rJyJdJyksci4kaGVhZGVySW5kZXhlZFtuXT1vLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcigiOmxhc3QiKTpvLmZpbHRlcigiOmxhc3QiKTplKCk7ci4kdGFibGUuZmluZChyLnNlbGVjdG9ySGVhZGVycykuYXR0cih7c2NvcGU6ImNvbCIscm9sZToiY29sdW1uaGVhZGVyIn0pLHQudXBkYXRlSGVhZGVyKHIpLHQuZGVidWcociwiY29yZSIpJiYoY29uc29sZS5sb2coIkJ1aWx0IGhlYWRlcnM6Iit0LmJlbmNobWFyayhhKSksY29uc29sZS5sb2coci4kaGVhZGVycykpfSxhZGRJbnN0YW5jZU1ldGhvZHM6ZnVuY3Rpb24ocil7ZS5leHRlbmQodC5pbnN0YW5jZU1ldGhvZHMscil9LHNldHVwUGFyc2VyczpmdW5jdGlvbihlLHIpe3ZhciBvLHMsYSxuLGksbCxkLGMsZyxwLHUsZixoLG0sYj1lLnRhYmxlLHk9MCx3PXQuZGVidWcoZSwiY29yZSIpLHg9e307aWYoZS4kdGJvZGllcz1lLiR0YWJsZS5jaGlsZHJlbigidGJvZHk6bm90KC4iK2UuY3NzSW5mb0Jsb2NrKyIpIiksaD12b2lkIDA9PT1yP2UuJHRib2RpZXM6ciwwPT09KG09aC5sZW5ndGgpKXJldHVybiB3P2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgcGFyc2VyIGNhY2hlIik6IiI7Zm9yKHcmJihmPW5ldyBEYXRlLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiRGV0ZWN0aW5nIHBhcnNlcnMgZm9yIGVhY2ggY29sdW1uIikpLHM9e2V4dHJhY3RvcnM6W10scGFyc2VyczpbXX07eTxtOyl7aWYoKG89aFt5XS5yb3dzKS5sZW5ndGgpZm9yKGk9MCxuPWUuY29sdW1ucyxsPTA7bDxuO2wrKyl7aWYoKGQ9ZS4kaGVhZGVySW5kZXhlZFtpXSkmJmQubGVuZ3RoJiYoYz10LmdldENvbHVtbkRhdGEoYixlLmhlYWRlcnMsaSksdT10LmdldFBhcnNlckJ5SWQodC5nZXREYXRhKGQsYywiZXh0cmFjdG9yIikpLHA9dC5nZXRQYXJzZXJCeUlkKHQuZ2V0RGF0YShkLGMsInNvcnRlciIpKSxnPSJmYWxzZSI9PT10LmdldERhdGEoZCxjLCJwYXJzZXIiKSxlLmVtcHRpZXNbaV09KHQuZ2V0RGF0YShkLGMsImVtcHR5Iil8fGUuZW1wdHlUb3x8KGUuZW1wdHlUb0JvdHRvbT8iYm90dG9tIjoidG9wIikpLnRvTG93ZXJDYXNlKCksZS5zdHJpbmdzW2ldPSh0LmdldERhdGEoZCxjLCJzdHJpbmciKXx8ZS5zdHJpbmdUb3x8Im1heCIpLnRvTG93ZXJDYXNlKCksZyYmKHA9dC5nZXRQYXJzZXJCeUlkKCJuby1wYXJzZXIiKSksdXx8KHU9ITEpLHB8fChwPXQuZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKGUsbywtMSxpKSksdyYmKHhbIigiK2krIikgIitkLnRleHQoKV09e3BhcnNlcjpwLmlkLGV4dHJhY3Rvcjp1P3UuaWQ6Im5vbmUiLHN0cmluZzplLnN0cmluZ3NbaV0sZW1wdHk6ZS5lbXB0aWVzW2ldfSkscy5wYXJzZXJzW2ldPXAscy5leHRyYWN0b3JzW2ldPXUsKGE9ZFswXS5jb2xTcGFuLTEpPjApKWZvcihpKz1hLG4rPWE7YSsxPjA7KXMucGFyc2Vyc1tpLWFdPXAscy5leHRyYWN0b3JzW2ktYV09dSxhLS07aSsrfXkrPXMucGFyc2Vycy5sZW5ndGg/bToxfXcmJih0LmlzRW1wdHlPYmplY3QoeCk/Y29uc29sZS53YXJuKCIgIE5vIHBhcnNlcnMgZGV0ZWN0ZWQhIik6Y29uc29sZVtjb25zb2xlLnRhYmxlPyJ0YWJsZSI6ImxvZyJdKHgpLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgZGV0ZWN0aW5nIHBhcnNlcnMiK3QuYmVuY2htYXJrKGYpKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpLGUucGFyc2Vycz1zLnBhcnNlcnMsZS5leHRyYWN0b3JzPXMuZXh0cmFjdG9yc30sYWRkUGFyc2VyOmZ1bmN0aW9uKGUpe3ZhciByLG89dC5wYXJzZXJzLmxlbmd0aCxzPSEwO2ZvcihyPTA7cjxvO3IrKyl0LnBhcnNlcnNbcl0uaWQudG9Mb3dlckNhc2UoKT09PWUuaWQudG9Mb3dlckNhc2UoKSYmKHM9ITEpO3MmJih0LnBhcnNlcnNbdC5wYXJzZXJzLmxlbmd0aF09ZSl9LGdldFBhcnNlckJ5SWQ6ZnVuY3Rpb24oZSl7aWYoImZhbHNlIj09ZSlyZXR1cm4hMTt2YXIgcixvPXQucGFyc2Vycy5sZW5ndGg7Zm9yKHI9MDtyPG87cisrKWlmKHQucGFyc2Vyc1tyXS5pZC50b0xvd2VyQ2FzZSgpPT09ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHQucGFyc2Vyc1tyXTtyZXR1cm4hMX0sZGV0ZWN0UGFyc2VyRm9yQ29sdW1uOmZ1bmN0aW9uKHIsbyxzLGEpe2Zvcih2YXIgbixpLGwsZD10LnBhcnNlcnMubGVuZ3RoLGM9ITEsZz0iIixwPXQuZGVidWcociwiY29yZSIpLHU9ITA7IiI9PT1nJiZ1OykobD1vWysrc10pJiZzPDUwP2wuY2xhc3NOYW1lLmluZGV4T2YodC5jc3NJZ25vcmVSb3cpPDAmJihjPW9bc10uY2VsbHNbYV0sZz10LmdldEVsZW1lbnRUZXh0KHIsYyxhKSxpPWUoYykscCYmY29uc29sZS5sb2coIkNoZWNraW5nIGlmIHZhbHVlIHdhcyBlbXB0eSBvbiByb3cgIitzKyIsIGNvbHVtbjogIithKyc6ICInK2crJyInKSk6dT0hMTtmb3IoOy0tZD49MDspaWYoKG49dC5wYXJzZXJzW2RdKSYmInRleHQiIT09bi5pZCYmbi5pcyYmbi5pcyhnLHIudGFibGUsYyxpKSlyZXR1cm4gbjtyZXR1cm4gdC5nZXRQYXJzZXJCeUlkKCJ0ZXh0Iil9LGdldEVsZW1lbnRUZXh0OmZ1bmN0aW9uKHIsbyxzKXtpZighbylyZXR1cm4iIjt2YXIgYSxuPXIudGV4dEV4dHJhY3Rpb258fCIiLGk9by5qcXVlcnk/bzplKG8pO3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8iYmFzaWMiPT09biYmdm9pZCAwIT09KGE9aS5hdHRyKHIudGV4dEF0dHJpYnV0ZSkpP2UudHJpbShhKTplLnRyaW0oby50ZXh0Q29udGVudHx8aS50ZXh0KCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP2UudHJpbShuKGlbMF0sci50YWJsZSxzKSk6ImZ1bmN0aW9uIj09dHlwZW9mKGE9dC5nZXRDb2x1bW5EYXRhKHIudGFibGUsbixzKSk/ZS50cmltKGEoaVswXSxyLnRhYmxlLHMpKTplLnRyaW0oaVswXS50ZXh0Q29udGVudHx8aS50ZXh0KCkpfSxnZXRQYXJzZWRUZXh0OmZ1bmN0aW9uKGUscixvLHMpe3ZvaWQgMD09PXMmJihzPXQuZ2V0RWxlbWVudFRleHQoZSxyLG8pKTt2YXIgYT0iIitzLG49ZS5wYXJzZXJzW29dLGk9ZS5leHRyYWN0b3JzW29dO3JldHVybiBuJiYoaSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuZm9ybWF0JiYocz1pLmZvcm1hdChzLGUudGFibGUscixvKSksYT0ibm8tcGFyc2VyIj09PW4uaWQ/IiI6bi5mb3JtYXQoIiIrcyxlLnRhYmxlLHIsbyksZS5pZ25vcmVDYXNlJiYic3RyaW5nIj09dHlwZW9mIGEmJihhPWEudG9Mb3dlckNhc2UoKSkpLGF9LGJ1aWxkQ2FjaGU6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYyxnLHAsdSxmLGgsbSxiLHksdyx4LHYsQywkLEksRCxSLFQ9ci50YWJsZSxMPXIucGFyc2VycyxBPXQuZGVidWcociwiY29yZSIpO2lmKHIuJHRib2RpZXM9ci4kdGFibGUuY2hpbGRyZW4oInRib2R5Om5vdCguIityLmNzc0luZm9CbG9jaysiKSIpLGc9dm9pZCAwPT09cz9yLiR0Ym9kaWVzOnMsci5jYWNoZT17fSxyLnRvdGFsUm93cz0wLCFMKXJldHVybiBBP2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgY2FjaGUiKToiIjtmb3IoQSYmKG09bmV3IERhdGUpLHIuc2hvd1Byb2Nlc3NpbmcmJnQuaXNQcm9jZXNzaW5nKFQsITApLGM9MDtjPGcubGVuZ3RoO2MrKyl7Zm9yKHg9W10sYT1yLmNhY2hlW2NdPXtub3JtYWxpemVkOltdfSxiPWdbY10mJmdbY10ucm93cy5sZW5ndGh8fDAsbD0wO2w8YjsrK2wpaWYoeT17Y2hpbGQ6W10scmF3OltdfSxwPWUoZ1tjXS5yb3dzW2xdKSx1PVtdLCFwLmhhc0NsYXNzKHIuc2VsZWN0b3JSZW1vdmUuc2xpY2UoMSkpKWlmKHAuaGFzQ2xhc3Moci5jc3NDaGlsZFJvdykmJjAhPT1sKWZvcihEPWEubm9ybWFsaXplZC5sZW5ndGgtMSwodz1hLm5vcm1hbGl6ZWRbRF1bci5jb2x1bW5zXSkuJHJvdz13LiRyb3cuYWRkKHApLHAucHJldigpLmhhc0NsYXNzKHIuY3NzQ2hpbGRSb3cpfHxwLnByZXYoKS5hZGRDbGFzcyh0LmNzcy5jc3NIYXNDaGlsZCksZj1wLmNoaWxkcmVuKCJ0aCwgdGQiKSxEPXcuY2hpbGQubGVuZ3RoLHcuY2hpbGRbRF09W10sQz0wLEk9ci5jb2x1bW5zLGQ9MDtkPEk7ZCsrKShoPWZbZF0pJiYody5jaGlsZFtEXVtkXT10LmdldFBhcnNlZFRleHQocixoLGQpLCh2PWZbZF0uY29sU3Bhbi0xKT4wJiYoQys9dixJKz12KSksQysrO2Vsc2V7Zm9yKHkuJHJvdz1wLHkub3JkZXI9bCxDPTAsST1yLmNvbHVtbnMsZD0wO2Q8STsrK2Qpe2lmKChoPXBbMF0uY2VsbHNbZF0pJiZDPHIuY29sdW1ucyYmKCEoJD12b2lkIDAhPT1MW0NdKSYmQSYmY29uc29sZS53YXJuKCJObyBwYXJzZXIgZm91bmQgZm9yIHJvdzogIitsKyIsIGNvbHVtbjogIitkKyc7IGNlbGwgY29udGFpbmluZzogIicrZShoKS50ZXh0KCkrJyI7IGRvZXMgaXQgaGF2ZSBhIGhlYWRlcj8nKSxuPXQuZ2V0RWxlbWVudFRleHQocixoLEMpLHkucmF3W0NdPW4saT10LmdldFBhcnNlZFRleHQocixoLEMsbiksdVtDXT1pLCQmJiJudW1lcmljIj09PShMW0NdLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpJiYoeFtDXT1NYXRoLm1heChNYXRoLmFicyhpKXx8MCx4W0NdfHwwKSksKHY9aC5jb2xTcGFuLTEpPjApKXtmb3IoUj0wO1I8PXY7KWk9ci5kdXBsaWNhdGVTcGFufHwwPT09Uj9uOiJzdHJpbmciIT10eXBlb2Ygci50ZXh0RXh0cmFjdGlvbj90LmdldEVsZW1lbnRUZXh0KHIsaCxDK1IpfHwiIjoiIix5LnJhd1tDK1JdPWksdVtDK1JdPWksUisrO0MrPXYsSSs9dn1DKyt9dVtyLmNvbHVtbnNdPXksYS5ub3JtYWxpemVkW2Eubm9ybWFsaXplZC5sZW5ndGhdPXV9YS5jb2xNYXg9eCxyLnRvdGFsUm93cys9YS5ub3JtYWxpemVkLmxlbmd0aH1pZihyLnNob3dQcm9jZXNzaW5nJiZ0LmlzUHJvY2Vzc2luZyhUKSxBKXtmb3IoRD1NYXRoLm1pbig1LHIuY2FjaGVbMF0ubm9ybWFsaXplZC5sZW5ndGgpLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiQnVpbGRpbmcgY2FjaGUgZm9yICIrci50b3RhbFJvd3MrIiByb3dzIChzaG93aW5nICIrRCsiIHJvd3MgaW4gbG9nKSBhbmQgIityLmNvbHVtbnMrIiBjb2x1bW5zIit0LmJlbmNobWFyayhtKSksbj17fSxkPTA7ZDxyLmNvbHVtbnM7ZCsrKWZvcihDPTA7QzxEO0MrKyluWyJyb3c6ICIrQ118fChuWyJyb3c6ICIrQ109e30pLG5bInJvdzogIitDXVtyLiRoZWFkZXJJbmRleGVkW2RdLnRleHQoKV09ci5jYWNoZVswXS5ub3JtYWxpemVkW0NdW2RdO2NvbnNvbGVbY29uc29sZS50YWJsZT8idGFibGUiOiJsb2ciXShuKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9ZS5pc0Z1bmN0aW9uKG8pJiZvKFQpfSxnZXRDb2x1bW5UZXh0OmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG09ImZ1bmN0aW9uIj09dHlwZW9mIHMsYj0iYWxsIj09PW8seT17cmF3OltdLHBhcnNlZDpbXSwkY2VsbDpbXX0sdz0ocj1lKHIpWzBdKS5jb25maWc7aWYoIXQuaXNFbXB0eU9iamVjdCh3KSl7Zm9yKGM9dy4kdGJvZGllcy5sZW5ndGgsbj0wO248YztuKyspZm9yKGc9KGw9dy5jYWNoZVtuXS5ub3JtYWxpemVkKS5sZW5ndGgsaT0wO2k8ZztpKyspZD1sW2ldLGEmJiFkW3cuY29sdW1uc10uJHJvdy5pcyhhKXx8KGg9ITAsdT1iP2Quc2xpY2UoMCx3LmNvbHVtbnMpOmRbb10sZD1kW3cuY29sdW1uc10scD1iP2QucmF3OmQucmF3W29dLGY9Yj9kLiRyb3cuY2hpbGRyZW4oKTpkLiRyb3cuY2hpbGRyZW4oKS5lcShvKSxtJiYoaD1zKHt0Ym9keUluZGV4Om4scm93SW5kZXg6aSxwYXJzZWQ6dSxyYXc6cCwkcm93OmQuJHJvdywkY2VsbDpmfSkpLCExIT09aCYmKHkucGFyc2VkW3kucGFyc2VkLmxlbmd0aF09dSx5LnJhd1t5LnJhdy5sZW5ndGhdPXAseS4kY2VsbFt5LiRjZWxsLmxlbmd0aF09ZikpO3JldHVybiB5fXQuZGVidWcodywiY29yZSIpJiZjb25zb2xlLndhcm4oIk5vIGNhY2hlIGZvdW5kIC0gYWJvcnRpbmcgZ2V0Q29sdW1uVGV4dCBmdW5jdGlvbiEiKX0sc2V0SGVhZGVyc0NzczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ci5zb3J0TGlzdCxuPWEubGVuZ3RoLGk9dC5jc3Muc29ydE5vbmUrIiAiK3IuY3NzTm9uZSxsPVt0LmNzcy5zb3J0QXNjKyIgIityLmNzc0FzYyx0LmNzcy5zb3J0RGVzYysiICIrci5jc3NEZXNjXSxkPVtyLmNzc0ljb25Bc2Msci5jc3NJY29uRGVzYyxyLmNzc0ljb25Ob25lXSxjPVsiYXNjZW5kaW5nIiwiZGVzY2VuZGluZyJdLGc9ZnVuY3Rpb24oZSxyKXtlLnJlbW92ZUNsYXNzKGkpLmFkZENsYXNzKGxbcl0pLmF0dHIoImFyaWEtc29ydCIsY1tyXSkuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZFsyXSkuYWRkQ2xhc3MoZFtyXSl9LHA9ci4kdGFibGUuZmluZCgidGZvb3QgdHIiKS5jaGlsZHJlbigidGQsIHRoIikuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKSx1PXIuJGhlYWRlcnMuYWRkKGUoInRoZWFkICIrci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKS5hZGRDbGFzcyhpKS5hdHRyKCJhcmlhLXNvcnQiLCJub25lIikuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZC5qb2luKCIgIikpLmVuZCgpO2Zvcih1Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKGRbMl0pLHIuY3NzSWNvbkRpc2FibGVkJiZ1LmZpbHRlcigiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKHIuY3NzSWNvbkRpc2FibGVkKSxvPTA7bzxuO28rKylpZigyIT09YVtvXVsxXSl7aWYodT1yLiRoZWFkZXJzLmZpbHRlcihmdW5jdGlvbihlKXtmb3IodmFyIG89ITAscz1yLiRoZWFkZXJzLmVxKGUpLGE9cGFyc2VJbnQocy5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxuPWErdC5nZXRDbG9zZXN0KHMsInRoLCB0ZCIpWzBdLmNvbFNwYW47YTxuO2ErKylvPSEhbyYmKG98fHQuaXNWYWx1ZUluQXJyYXkoYSxyLnNvcnRMaXN0KT4tMSk7cmV0dXJuIG99KSwodT11Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcignW2RhdGEtY29sdW1uPSInK2Fbb11bMF0rJyJdJysoMT09PW4/IjpsYXN0IjoiIikpKS5sZW5ndGgpZm9yKHM9MDtzPHUubGVuZ3RoO3MrKyl1W3NdLnNvcnREaXNhYmxlZHx8Zyh1LmVxKHMpLGFbb11bMV0pO3AubGVuZ3RoJiZnKHAuZmlsdGVyKCdbZGF0YS1jb2x1bW49IicrYVtvXVswXSsnIl0nKSxhW29dWzFdKX1mb3Iobj1yLiRoZWFkZXJzLmxlbmd0aCxvPTA7bzxuO28rKyl0LnNldENvbHVtbkFyaWFMYWJlbChyLHIuJGhlYWRlcnMuZXEobykpfSxnZXRDbG9zZXN0OmZ1bmN0aW9uKHQscil7cmV0dXJuIGUuZm4uY2xvc2VzdD90LmNsb3Nlc3Qocik6dC5pcyhyKT90OnQucGFyZW50cyhyKS5maWx0ZXIoIjpmaXJzdCIpfSxzZXRDb2x1bW5BcmlhTGFiZWw6ZnVuY3Rpb24ocixvLHMpe2lmKG8ubGVuZ3RoKXt2YXIgYT1wYXJzZUludChvLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG49ci5zb3J0VmFyc1thXSxpPW8uaGFzQ2xhc3ModC5jc3Muc29ydEFzYyk/InNvcnRBc2MiOm8uaGFzQ2xhc3ModC5jc3Muc29ydERlc2MpPyJzb3J0RGVzYyI6InNvcnROb25lIixsPWUudHJpbShvLnRleHQoKSkrIjogIit0Lmxhbmd1YWdlW2ldO28uaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHwhMT09PXM/bCs9dC5sYW5ndWFnZS5zb3J0RGlzYWJsZWQ6KGk9KG4uY291bnQrMSklbi5vcmRlci5sZW5ndGgscz1uLm9yZGVyW2ldLGwrPXQubGFuZ3VhZ2VbMD09PXM/Im5leHRBc2MiOjE9PT1zPyJuZXh0RGVzYyI6Im5leHROb25lIl0pLG8uYXR0cigiYXJpYS1sYWJlbCIsbCl9fSx1cGRhdGVIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9ZS4kaGVhZGVycy5sZW5ndGg7Zm9yKHI9MDtyPGk7cisrKXM9ZS4kaGVhZGVycy5lcShyKSxhPXQuZ2V0Q29sdW1uRGF0YShuLGUuaGVhZGVycyxyLCEwKSxvPSJmYWxzZSI9PT10LmdldERhdGEocyxhLCJzb3J0ZXIiKXx8ImZhbHNlIj09PXQuZ2V0RGF0YShzLGEsInBhcnNlciIpLHQuc2V0Q29sdW1uU29ydChlLHMsbyl9LHNldENvbHVtblNvcnQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBvPWUudGFibGUuaWQ7dFswXS5zb3J0RGlzYWJsZWQ9cix0W3I/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgic29ydGVyLWZhbHNlIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsIiIrciksZS50YWJJbmRleCYmKHI/dC5yZW1vdmVBdHRyKCJ0YWJpbmRleCIpOnQuYXR0cigidGFiaW5kZXgiLCIwIikpLG8mJihyP3QucmVtb3ZlQXR0cigiYXJpYS1jb250cm9scyIpOnQuYXR0cigiYXJpYS1jb250cm9scyIsbykpfSx1cGRhdGVIZWFkZXJTb3J0Q291bnQ6ZnVuY3Rpb24ocixvKXt2YXIgcyxhLG4saSxsLGQsYyxnLHA9b3x8ci5zb3J0TGlzdCx1PXAubGVuZ3RoO2ZvcihyLnNvcnRMaXN0PVtdLGk9MDtpPHU7aSsrKWlmKGM9cFtpXSwocz1wYXJzZUludChjWzBdLDEwKSk8ci5jb2x1bW5zKXtzd2l0Y2goci5zb3J0VmFyc1tzXS5vcmRlcnx8KGc9dC5nZXRPcmRlcihyLnNvcnRJbml0aWFsT3JkZXIpP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxyLnNvcnRWYXJzW3NdLm9yZGVyPWcsci5zb3J0VmFyc1tzXS5jb3VudD0wKSxnPXIuc29ydFZhcnNbc10ub3JkZXIsYT0oIiIrY1sxXSkubWF0Y2goL14oMXxkfHN8b3xuKS8pLGE9YT9hWzBdOiIiKXtjYXNlIjEiOmNhc2UiZCI6YT0xO2JyZWFrO2Nhc2UicyI6YT1sfHwwO2JyZWFrO2Nhc2UibyI6YT0wPT09KGQ9Z1sobHx8MCklZy5sZW5ndGhdKT8xOjE9PT1kPzA6MjticmVhaztjYXNlIm4iOmE9Z1srK3Iuc29ydFZhcnNbc10uY291bnQlZy5sZW5ndGhdO2JyZWFrO2RlZmF1bHQ6YT0wfWw9MD09PWk/YTpsLG49W3MscGFyc2VJbnQoYSwxMCl8fDBdLHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPW4sYT1lLmluQXJyYXkoblsxXSxnKSxyLnNvcnRWYXJzW3NdLmNvdW50PWE+PTA/YTpuWzFdJWcubGVuZ3RofX0sdXBkYXRlQWxsOmZ1bmN0aW9uKGUscixvKXt2YXIgcz1lLnRhYmxlO3MuaXNVcGRhdGluZz0hMCx0LnJlZnJlc2hXaWRnZXRzKHMsITAsITApLHQuYnVpbGRIZWFkZXJzKGUpLHQuYmluZEV2ZW50cyhzLGUuJGhlYWRlcnMsITApLHQuYmluZE1ldGhvZHMoZSksdC5jb21tb25VcGRhdGUoZSxyLG8pfSx1cGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UudGFibGUuaXNVcGRhdGluZz0hMCx0LnVwZGF0ZUhlYWRlcihlKSx0LmNvbW1vblVwZGF0ZShlLHIsbyl9LHVwZGF0ZUhlYWRlcnM6ZnVuY3Rpb24oZSxyKXtlLnRhYmxlLmlzVXBkYXRpbmc9ITAsdC5idWlsZEhlYWRlcnMoZSksdC5iaW5kRXZlbnRzKGUudGFibGUsZS4kaGVhZGVycywhMCksdC5yZXNvcnRDb21wbGV0ZShlLHIpfSx1cGRhdGVDZWxsOmZ1bmN0aW9uKHIsbyxzLGEpe2lmKGUobykuY2xvc2VzdCgidHIiKS5oYXNDbGFzcyhyLmNzc0NoaWxkUm93KSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ1cGRhdGVDZWxsIiBmb3IgY2hpbGQgcm93IGNvbnRlbnQgaGFzIGJlZW4gZGlzYWJsZWQsIHVzZSAidXBkYXRlIiBpbnN0ZWFkJyk7ZWxzZXtpZih0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkpcmV0dXJuIHQudXBkYXRlSGVhZGVyKHIpLHZvaWQgdC5jb21tb25VcGRhdGUocixzLGEpO3IudGFibGUuaXNVcGRhdGluZz0hMCxyLiR0YWJsZS5maW5kKHIuc2VsZWN0b3JSZW1vdmUpLnJlbW92ZSgpO3ZhciBuLGksbCxkLGMsZyxwPXIuJHRib2RpZXMsdT1lKG8pLGY9cC5pbmRleCh0LmdldENsb3Nlc3QodSwidGJvZHkiKSksaD1yLmNhY2hlW2ZdLG09dC5nZXRDbG9zZXN0KHUsInRyIik7aWYobz11WzBdLHAubGVuZ3RoJiZmPj0wKXtpZihsPXAuZXEoZikuZmluZCgidHIiKS5ub3QoIi4iK3IuY3NzQ2hpbGRSb3cpLmluZGV4KG0pLGM9aC5ub3JtYWxpemVkW2xdLChnPW1bMF0uY2VsbHMubGVuZ3RoKSE9PXIuY29sdW1ucylmb3IoZD0wLG49ITEsaT0wO2k8ZztpKyspbnx8bVswXS5jZWxsc1tpXT09PW8/bj0hMDpkKz1tWzBdLmNlbGxzW2ldLmNvbFNwYW47ZWxzZSBkPXUuaW5kZXgoKTtuPXQuZ2V0RWxlbWVudFRleHQocixvLGQpLGNbci5jb2x1bW5zXS5yYXdbZF09bixuPXQuZ2V0UGFyc2VkVGV4dChyLG8sZCxuKSxjW2RdPW4sIm51bWVyaWMiPT09KHIucGFyc2Vyc1tkXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKGguY29sTWF4W2RdPU1hdGgubWF4KE1hdGguYWJzKG4pfHwwLGguY29sTWF4W2RdfHwwKSksITEhPT0obj0idW5kZWZpbmVkIiE9PXM/czpyLnJlc29ydCk/dC5jaGVja1Jlc29ydChyLG4sYSk6dC5yZXNvcnRDb21wbGV0ZShyLGEpfWVsc2UgdC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUuZXJyb3IoInVwZGF0ZUNlbGwgYWJvcnRlZCwgdGJvZHkgbWlzc2luZyBvciBub3Qgd2l0aGluIHRoZSBpbmRpY2F0ZWQgdGFibGUiKSxyLnRhYmxlLmlzVXBkYXRpbmc9ITF9fSxhZGRSb3dzOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG0sYix5LHc9InN0cmluZyI9PXR5cGVvZiBvJiYxPT09ci4kdGJvZGllcy5sZW5ndGgmJi88dHIvLnRlc3Qob3x8IiIpLHg9ci50YWJsZTtpZih3KW89ZShvKSxyLiR0Ym9kaWVzLmFwcGVuZChvKTtlbHNlIGlmKCEobyYmbyBpbnN0YW5jZW9mIGUmJnQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpWzBdPT09ci50YWJsZSkpcmV0dXJuIHQuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmVycm9yKCJhZGRSb3dzIG1ldGhvZCByZXF1aXJlcyAoMSkgYSBqUXVlcnkgc2VsZWN0b3IgcmVmZXJlbmNlIHRvIHJvd3MgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgdGFibGUsIG9yICgyKSByb3cgSFRNTCBzdHJpbmcgdG8gYmUgYWRkZWQgdG8gYSB0YWJsZSB3aXRoIG9ubHkgb25lIHRib2R5IiksITE7aWYoeC5pc1VwZGF0aW5nPSEwLHQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSl0LnVwZGF0ZUhlYWRlcihyKSx0LmNvbW1vblVwZGF0ZShyLHMsYSk7ZWxzZXtmb3IoYz1vLmZpbHRlcigidHIiKS5hdHRyKCJyb2xlIiwicm93IikubGVuZ3RoLGw9ci4kdGJvZGllcy5pbmRleChvLnBhcmVudHMoInRib2R5IikuZmlsdGVyKCI6Zmlyc3QiKSksci5wYXJzZXJzJiZyLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhyKSxkPTA7ZDxjO2QrKyl7Zm9yKGY9MCxwPW9bZF0uY2VsbHMubGVuZ3RoLHU9ci5jYWNoZVtsXS5ub3JtYWxpemVkLmxlbmd0aCxtPVtdLGg9e2NoaWxkOltdLHJhdzpbXSwkcm93Om8uZXEoZCksb3JkZXI6dX0sZz0wO2c8cDtnKyspYj1vW2RdLmNlbGxzW2ddLG49dC5nZXRFbGVtZW50VGV4dChyLGIsZiksaC5yYXdbZl09bixpPXQuZ2V0UGFyc2VkVGV4dChyLGIsZixuKSxtW2ZdPWksIm51bWVyaWMiPT09KHIucGFyc2Vyc1tmXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKHIuY2FjaGVbbF0uY29sTWF4W2ZdPU1hdGgubWF4KE1hdGguYWJzKGkpfHwwLHIuY2FjaGVbbF0uY29sTWF4W2ZdfHwwKSksKHk9Yi5jb2xTcGFuLTEpPjAmJihmKz15KSxmKys7bVtyLmNvbHVtbnNdPWgsci5jYWNoZVtsXS5ub3JtYWxpemVkW3VdPW19dC5jaGVja1Jlc29ydChyLHMsYSl9fSx1cGRhdGVDYWNoZTpmdW5jdGlvbihlLHIsbyl7ZS5wYXJzZXJzJiZlLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhlLG8pLHQuYnVpbGRDYWNoZShlLHIsbyl9LGFwcGVuZENhY2hlOmZ1bmN0aW9uKGUscil7dmFyIG8scyxhLG4saSxsLGQsYz1lLnRhYmxlLGc9ZS4kdGJvZGllcyxwPVtdLHU9ZS5jYWNoZTtpZih0LmlzRW1wdHlPYmplY3QodSkpcmV0dXJuIGUuYXBwZW5kZXI/ZS5hcHBlbmRlcihjLHApOmMuaXNVcGRhdGluZz9lLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpOiIiO2Zvcih0LmRlYnVnKGUsImNvcmUiKSYmKGQ9bmV3IERhdGUpLGw9MDtsPGcubGVuZ3RoO2wrKylpZigoYT1nLmVxKGwpKS5sZW5ndGgpe2ZvcihuPXQucHJvY2Vzc1Rib2R5KGMsYSwhMCkscz0obz11W2xdLm5vcm1hbGl6ZWQpLmxlbmd0aCxpPTA7aTxzO2krKylwW3AubGVuZ3RoXT1vW2ldW2UuY29sdW1uc10uJHJvdyxlLmFwcGVuZGVyJiYoIWUucGFnZXJ8fGUucGFnZXIucmVtb3ZlUm93c3x8ZS5wYWdlci5hamF4KXx8bi5hcHBlbmQob1tpXVtlLmNvbHVtbnNdLiRyb3cpO3QucHJvY2Vzc1Rib2R5KGMsbiwhMSl9ZS5hcHBlbmRlciYmZS5hcHBlbmRlcihjLHApLHQuZGVidWcoZSwiY29yZSIpJiZjb25zb2xlLmxvZygiUmVidWlsdCB0YWJsZSIrdC5iZW5jaG1hcmsoZCkpLHJ8fGUuYXBwZW5kZXJ8fHQuYXBwbHlXaWRnZXQoYyksYy5pc1VwZGF0aW5nJiZlLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpfSxjb21tb25VcGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UuJHRhYmxlLmZpbmQoZS5zZWxlY3RvclJlbW92ZSkucmVtb3ZlKCksdC5zZXR1cFBhcnNlcnMoZSksdC5idWlsZENhY2hlKGUpLHQuY2hlY2tSZXNvcnQoZSxyLG8pfSxpbml0U29ydDpmdW5jdGlvbihyLG8scyl7aWYoci50YWJsZS5pc1VwZGF0aW5nKXJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0U29ydChyLG8scyl9LDUwKTt2YXIgYSxuLGksbCxkLGMsZyxwPSFzW3Iuc29ydE11bHRpU29ydEtleV0sdT1yLnRhYmxlLGY9ci4kaGVhZGVycy5sZW5ndGgsaD10LmdldENsb3Nlc3QoZShvKSwidGgsIHRkIiksbT1wYXJzZUludChoLmF0dHIoImRhdGEtY29sdW1uIiksMTApLGI9ci5zb3J0VmFyc1ttXS5vcmRlcjtpZihoPWhbMF0sci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsdSksYz0oci5zb3J0VmFyc1ttXS5jb3VudCsxKSViLmxlbmd0aCxyLnNvcnRWYXJzW21dLmNvdW50PXNbci5zb3J0UmVzZXRLZXldPzI6YyxyLnNvcnRSZXN0YXJ0KWZvcihpPTA7aTxmO2krKylnPXIuJGhlYWRlcnMuZXEoaSksbSE9PShjPXBhcnNlSW50KGcuYXR0cigiZGF0YS1jb2x1bW4iKSwxMCkpJiYocHx8Zy5oYXNDbGFzcyh0LmNzcy5zb3J0Tm9uZSkpJiYoci5zb3J0VmFyc1tjXS5jb3VudD0tMSk7aWYocCl7aWYoci5zb3J0TGlzdD1bXSxyLmxhc3Quc29ydExpc3Q9W10sbnVsbCE9PXIuc29ydEZvcmNlKWZvcihhPXIuc29ydEZvcmNlLG49MDtuPGEubGVuZ3RoO24rKylhW25dWzBdIT09bSYmKHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPWFbbl0pO2lmKChsPWJbci5zb3J0VmFyc1ttXS5jb3VudF0pPDImJihyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1bbSxsXSxoLmNvbFNwYW4+MSkpZm9yKG49MTtuPGguY29sU3BhbjtuKyspci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20rbixsXSxyLnNvcnRWYXJzW20rbl0uY291bnQ9ZS5pbkFycmF5KGwsYil9ZWxzZSBpZihyLnNvcnRMaXN0PWUuZXh0ZW5kKFtdLHIubGFzdC5zb3J0TGlzdCksdC5pc1ZhbHVlSW5BcnJheShtLHIuc29ydExpc3QpPj0wKWZvcihuPTA7bjxyLnNvcnRMaXN0Lmxlbmd0aDtuKyspKGM9ci5zb3J0TGlzdFtuXSlbMF09PT1tJiYoY1sxXT1iW3Iuc29ydFZhcnNbbV0uY291bnRdLDI9PT1jWzFdJiYoci5zb3J0TGlzdC5zcGxpY2UobiwxKSxyLnNvcnRWYXJzW21dLmNvdW50PS0xKSk7ZWxzZSBpZigobD1iW3Iuc29ydFZhcnNbbV0uY291bnRdKTwyJiYoci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20sbF0saC5jb2xTcGFuPjEpKWZvcihuPTE7bjxoLmNvbFNwYW47bisrKXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttK24sbF0sci5zb3J0VmFyc1ttK25dLmNvdW50PWUuaW5BcnJheShsLGIpO2lmKHIubGFzdC5zb3J0TGlzdD1lLmV4dGVuZChbXSxyLnNvcnRMaXN0KSxyLnNvcnRMaXN0Lmxlbmd0aCYmci5zb3J0QXBwZW5kJiYoYT1lLmlzQXJyYXkoci5zb3J0QXBwZW5kKT9yLnNvcnRBcHBlbmQ6ci5zb3J0QXBwZW5kW3Iuc29ydExpc3RbMF1bMF1dLCF0LmlzRW1wdHlPYmplY3QoYSkpKWZvcihuPTA7bjxhLmxlbmd0aDtuKyspaWYoYVtuXVswXSE9PW0mJnQuaXNWYWx1ZUluQXJyYXkoYVtuXVswXSxyLnNvcnRMaXN0KTwwKXtpZihsPWFbbl1bMV0sZD0oIiIrbCkubWF0Y2goL14oYXxkfHN8b3xuKS8pKXN3aXRjaChjPXIuc29ydExpc3RbMF1bMV0sZFswXSl7Y2FzZSJkIjpsPTE7YnJlYWs7Y2FzZSJzIjpsPWM7YnJlYWs7Y2FzZSJvIjpsPTA9PT1jPzE6MDticmVhaztjYXNlIm4iOmw9KGMrMSklYi5sZW5ndGg7YnJlYWs7ZGVmYXVsdDpsPTB9ci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W2Fbbl1bMF0sbF19ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRCZWdpbiIsdSksc2V0VGltZW91dChmdW5jdGlvbigpe3Quc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVmb3JlRW5kIix1KSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEVuZCIsdSl9LDEpfSxtdWx0aXNvcnQ6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9W10sbD0wLGQ9ZS50ZXh0U29ydGVyfHwiIixjPWUuc29ydExpc3QsZz1jLmxlbmd0aCxwPWUuJHRib2RpZXMubGVuZ3RoO2lmKCFlLnNlcnZlclNpZGVTb3J0aW5nJiYhdC5pc0VtcHR5T2JqZWN0KGUuY2FjaGUpKXtpZih0LmRlYnVnKGUsImNvcmUiKSYmKG89bmV3IERhdGUpLCJvYmplY3QiPT10eXBlb2YgZClmb3Iocz1lLmNvbHVtbnM7cy0tOykiZnVuY3Rpb24iPT10eXBlb2YoYT10LmdldENvbHVtbkRhdGEobixkLHMpKSYmKGlbc109YSk7Zm9yKHI9MDtyPHA7cisrKXM9ZS5jYWNoZVtyXS5jb2xNYXgsZS5jYWNoZVtyXS5ub3JtYWxpemVkLnNvcnQoZnVuY3Rpb24ocixvKXt2YXIgYSxwLHUsZixoLG0sYjtmb3IoYT0wO2E8ZzthKyspe2lmKHU9Y1thXVswXSxmPWNbYV1bMV0sbD0wPT09ZixlLnNvcnRTdGFibGUmJnJbdV09PT1vW3VdJiYxPT09ZylyZXR1cm4gcltlLmNvbHVtbnNdLm9yZGVyLW9bZS5jb2x1bW5zXS5vcmRlcjtpZihwPS9uL2kudGVzdCh0LmdldFNvcnRUeXBlKGUucGFyc2Vycyx1KSkscCYmZS5zdHJpbmdzW3VdPyhwPSJib29sZWFuIj09dHlwZW9mIHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/KGw/MTotMSkqKHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/LTE6MSk6ZS5zdHJpbmdzW3VdP3Quc3RyaW5nW2Uuc3RyaW5nc1t1XV18fDA6MCxoPWUubnVtYmVyU29ydGVyP2UubnVtYmVyU29ydGVyKHJbdV0sb1t1XSxsLHNbdV0sbik6dFsic29ydE51bWVyaWMiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSxwLHNbdV0sdSxlKSk6KG09bD9yOm8sYj1sP286cixoPSJmdW5jdGlvbiI9PXR5cGVvZiBkP2QobVt1XSxiW3VdLGwsdSxuKToiZnVuY3Rpb24iPT10eXBlb2YgaVt1XT9pW3VdKG1bdV0sYlt1XSxsLHUsbik6dFsic29ydE5hdHVyYWwiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSx1LGUpKSxoKXJldHVybiBofXJldHVybiByW2UuY29sdW1uc10ub3JkZXItb1tlLmNvbHVtbnNdLm9yZGVyfSk7dC5kZWJ1ZyhlLCJjb3JlIikmJmNvbnNvbGUubG9nKCJBcHBseWluZyBzb3J0ICIrYy50b1N0cmluZygpK3QuYmVuY2htYXJrKG8pKX19LHJlc29ydENvbXBsZXRlOmZ1bmN0aW9uKHQscil7dC50YWJsZS5pc1VwZGF0aW5nJiZ0LiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLHQudGFibGUpLGUuaXNGdW5jdGlvbihyKSYmcih0LnRhYmxlKX0sY2hlY2tSZXNvcnQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhPWUuaXNBcnJheShvKT9vOnIuc29ydExpc3Q7ITE9PT0odm9pZCAwPT09bz9yLnJlc29ydDpvKXx8ci5zZXJ2ZXJTaWRlU29ydGluZ3x8ci50YWJsZS5pc1Byb2Nlc3Npbmc/KHQucmVzb3J0Q29tcGxldGUocixzKSx0LmFwcGx5V2lkZ2V0KHIudGFibGUsITEpKTphLmxlbmd0aD90LnNvcnRPbihyLGEsZnVuY3Rpb24oKXt0LnJlc29ydENvbXBsZXRlKHIscyl9LCEwKTp0LnNvcnRSZXNldChyLGZ1bmN0aW9uKCl7dC5yZXNvcnRDb21wbGV0ZShyLHMpLHQuYXBwbHlXaWRnZXQoci50YWJsZSwhMSl9KX0sc29ydE9uOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuPXIudGFibGU7ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsbiksdC51cGRhdGVIZWFkZXJTb3J0Q291bnQocixvKSx0LnNldEhlYWRlcnNDc3Mociksci5kZWxheUluaXQmJnQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSYmdC5idWlsZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVnaW4iLG4pLHQubXVsdGlzb3J0KHIpLHQuYXBwZW5kQ2FjaGUocixhKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZm9yZUVuZCIsbiksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRFbmQiLG4pLHQuYXBwbHlXaWRnZXQobiksZS5pc0Z1bmN0aW9uKHMpJiZzKG4pfSxzb3J0UmVzZXQ6ZnVuY3Rpb24ocixvKXtyLnNvcnRMaXN0PVtdLHQuc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpO3ZhciBzO2ZvcihzPTA7czxyLmNvbHVtbnM7cysrKXIuc29ydFZhcnNbc10uY291bnQ9LTE7ZS5pc0Z1bmN0aW9uKG8pJiZvKHIudGFibGUpfSxnZXRTb3J0VHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiBlJiZlW3RdP2VbdF0udHlwZXx8IiI6IiJ9LGdldE9yZGVyOmZ1bmN0aW9uKGUpe3JldHVybi9eZC9pLnRlc3QoZSl8fDE9PT1lfSxzb3J0TmF0dXJhbDpmdW5jdGlvbihlLHIpe2lmKGU9PT1yKXJldHVybiAwO2U9ZS50b1N0cmluZygpLHI9ci50b1N0cmluZygpO3ZhciBvLHMsYSxuLGksbCxkPXQucmVnZXg7aWYoZC5oZXgudGVzdChyKSl7aWYobz1wYXJzZUludCgoZXx8IiIpLm1hdGNoKGQuaGV4KSwxNikscz1wYXJzZUludCgocnx8IiIpLm1hdGNoKGQuaGV4KSwxNiksbzxzKXJldHVybi0xO2lmKG8+cylyZXR1cm4gMX1mb3Iobz0oZXx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIikscz0ocnx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIiksbD1NYXRoLm1heChvLmxlbmd0aCxzLmxlbmd0aCksaT0wO2k8bDtpKyspe2lmKGE9aXNOYU4ob1tpXSk/b1tpXXx8MDpwYXJzZUZsb2F0KG9baV0pfHwwLG49aXNOYU4oc1tpXSk/c1tpXXx8MDpwYXJzZUZsb2F0KHNbaV0pfHwwLGlzTmFOKGEpIT09aXNOYU4obikpcmV0dXJuIGlzTmFOKGEpPzE6LTE7aWYodHlwZW9mIGEhPXR5cGVvZiBuJiYoYSs9IiIsbis9IiIpLGE8bilyZXR1cm4tMTtpZihhPm4pcmV0dXJuIDF9cmV0dXJuIDB9LHNvcnROYXR1cmFsQXNjOmZ1bmN0aW9uKGUscixvLHMpe2lmKGU9PT1yKXJldHVybiAwO3ZhciBhPXQuc3RyaW5nW3MuZW1wdGllc1tvXXx8cy5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8tMToxOi1hfHwtMToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOmF8fDE6dC5zb3J0TmF0dXJhbChlLHIpfSxzb3J0TmF0dXJhbERlc2M6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGE9dC5zdHJpbmdbcy5lbXB0aWVzW29dfHxzLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWE/ImJvb2xlYW4iPT10eXBlb2YgYT9hPy0xOjE6YXx8MToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOi1hfHwtMTp0LnNvcnROYXR1cmFsKHIsZSl9LHNvcnRUZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+dD8xOmU8dD8tMTowfSxnZXRUZXh0VmFsdWU6ZnVuY3Rpb24oZSx0LHIpe2lmKHIpe3ZhciBvLHM9ZT9lLmxlbmd0aDowLGE9cit0O2ZvcihvPTA7bzxzO28rKylhKz1lLmNoYXJDb2RlQXQobyk7cmV0dXJuIHQqYX1yZXR1cm4gMH0sc29ydE51bWVyaWNBc2M6ZnVuY3Rpb24oZSxyLG8scyxhLG4pe2lmKGU9PT1yKXJldHVybiAwO3ZhciBpPXQuc3RyaW5nW24uZW1wdGllc1thXXx8bi5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8tMToxOi1pfHwtMToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOml8fDE6KGlzTmFOKGUpJiYoZT10LmdldFRleHRWYWx1ZShlLG8scykpLGlzTmFOKHIpJiYocj10LmdldFRleHRWYWx1ZShyLG8scykpLGUtcil9LHNvcnROdW1lcmljRGVzYzpmdW5jdGlvbihlLHIsbyxzLGEsbil7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGk9dC5zdHJpbmdbbi5lbXB0aWVzW2FdfHxuLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWk/ImJvb2xlYW4iPT10eXBlb2YgaT9pPy0xOjE6aXx8MToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOi1pfHwtMTooaXNOYU4oZSkmJihlPXQuZ2V0VGV4dFZhbHVlKGUsbyxzKSksaXNOYU4ocikmJihyPXQuZ2V0VGV4dFZhbHVlKHIsbyxzKSksci1lKX0sc29ydE51bWVyaWM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSxhZGRXaWRnZXQ6ZnVuY3Rpb24oZSl7ZS5pZCYmIXQuaXNFbXB0eU9iamVjdCh0LmdldFdpZGdldEJ5SWQoZS5pZCkpJiZjb25zb2xlLndhcm4oJyInK2UuaWQrJyIgd2lkZ2V0IHdhcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UhJyksdC53aWRnZXRzW3Qud2lkZ2V0cy5sZW5ndGhdPWV9LGhhc1dpZGdldDpmdW5jdGlvbih0LHIpe3JldHVybih0PWUodCkpLmxlbmd0aCYmdFswXS5jb25maWcmJnRbMF0uY29uZmlnLndpZGdldEluaXRbcl18fCExfSxnZXRXaWRnZXRCeUlkOmZ1bmN0aW9uKGUpe3ZhciByLG8scz10LndpZGdldHMubGVuZ3RoO2ZvcihyPTA7cjxzO3IrKylpZigobz10LndpZGdldHNbcl0pJiZvLmlkJiZvLmlkLnRvTG93ZXJDYXNlKCk9PT1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIG99LGFwcGx5V2lkZ2V0T3B0aW9uczpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbj1yLmNvbmZpZyxpPW4ud2lkZ2V0cy5sZW5ndGg7aWYoaSlmb3Iobz0wO288aTtvKyspKHM9dC5nZXRXaWRnZXRCeUlkKG4ud2lkZ2V0c1tvXSkpJiZzLm9wdGlvbnMmJihhPWUuZXh0ZW5kKCEwLHt9LHMub3B0aW9ucyksbi53aWRnZXRPcHRpb25zPWUuZXh0ZW5kKCEwLGEsbi53aWRnZXRPcHRpb25zKSxlLmV4dGVuZCghMCx0LmRlZmF1bHRzLndpZGdldE9wdGlvbnMscy5vcHRpb25zKSl9LGFkZFdpZGdldEZyb21DbGFzczpmdW5jdGlvbihlKXt2YXIgcixvLHM9ZS5jb25maWcsYT0iXiIrcy53aWRnZXRDbGFzcy5yZXBsYWNlKHQucmVnZXgudGVtcGxhdGVOYW1lLCIoXFxTKykrIikrIiQiLG49bmV3IFJlZ0V4cChhLCJnIiksaT0oZS5jbGFzc05hbWV8fCIiKS5zcGxpdCh0LnJlZ2V4LnNwYWNlcyk7aWYoaS5sZW5ndGgpZm9yKHI9aS5sZW5ndGgsbz0wO288cjtvKyspaVtvXS5tYXRjaChuKSYmKHMud2lkZ2V0c1tzLndpZGdldHMubGVuZ3RoXT1pW29dLnJlcGxhY2UobiwiJDEiKSl9LGFwcGx5V2lkZ2V0SWQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsPShyPWUocilbMF0pLmNvbmZpZyxkPWwud2lkZ2V0T3B0aW9ucyxjPXQuZGVidWcobCwiY29yZSIpLGc9dC5nZXRXaWRnZXRCeUlkKG8pO2cmJihpPWcuaWQsYT0hMSxlLmluQXJyYXkoaSxsLndpZGdldHMpPDAmJihsLndpZGdldHNbbC53aWRnZXRzLmxlbmd0aF09aSksYyYmKG49bmV3IERhdGUpLCFzJiZsLndpZGdldEluaXRbaV18fChsLndpZGdldEluaXRbaV09ITAsci5oYXNJbml0aWFsaXplZCYmdC5hcHBseVdpZGdldE9wdGlvbnMociksImZ1bmN0aW9uIj09dHlwZW9mIGcuaW5pdCYmKGE9ITAsYyYmY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJJbml0aWFsaXppbmcgIitpKyIgd2lkZ2V0IiksZy5pbml0KHIsZyxsLGQpKSksc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGcuZm9ybWF0fHwoYT0hMCxjJiZjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIlVwZGF0aW5nICIraSsiIHdpZGdldCIpLGcuZm9ybWF0KHIsbCxkLCExKSksYyYmYSYmKGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisocz8iaW5pdGlhbGl6aW5nICI6ImFwcGx5aW5nICIpK2krIiB3aWRnZXQiK3QuYmVuY2htYXJrKG4pKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpKX0sYXBwbHlXaWRnZXQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYz0ocj1lKHIpWzBdKS5jb25maWcsZz10LmRlYnVnKGMsImNvcmUiKSxwPVtdO2lmKCExPT09b3x8IXIuaGFzSW5pdGlhbGl6ZWR8fCFyLmlzQXBwbHlpbmdXaWRnZXRzJiYhci5pc1VwZGF0aW5nKXtpZihnJiYoZD1uZXcgRGF0ZSksdC5hZGRXaWRnZXRGcm9tQ2xhc3MociksY2xlYXJUaW1lb3V0KGMudGltZXJSZWFkeSksYy53aWRnZXRzLmxlbmd0aCl7Zm9yKHIuaXNBcHBseWluZ1dpZGdldHM9ITAsYy53aWRnZXRzPWUuZ3JlcChjLndpZGdldHMsZnVuY3Rpb24odCxyKXtyZXR1cm4gZS5pbkFycmF5KHQsYy53aWRnZXRzKT09PXJ9KSxuPShpPWMud2lkZ2V0c3x8W10pLmxlbmd0aCxhPTA7YTxuO2ErKykobD10LmdldFdpZGdldEJ5SWQoaVthXSkpJiZsLmlkPyhsLnByaW9yaXR5fHwobC5wcmlvcml0eT0xMCkscFthXT1sKTpnJiZjb25zb2xlLndhcm4oJyInK2lbYV0rJyIgd2FzIGVuYWJsZWQsIGJ1dCB0aGUgd2lkZ2V0IGNvZGUgaGFzIG5vdCBiZWVuIGxvYWRlZCEnKTtmb3IocC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucHJpb3JpdHk8dC5wcmlvcml0eT8tMTplLnByaW9yaXR5PT09dC5wcmlvcml0eT8wOjF9KSxuPXAubGVuZ3RoLGcmJmNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiU3RhcnQgIisobz8iaW5pdGlhbGl6aW5nIjoiYXBwbHlpbmciKSsiIHdpZGdldHMiKSxhPTA7YTxuO2ErKykobD1wW2FdKSYmbC5pZCYmdC5hcHBseVdpZGdldElkKHIsbC5pZCxvKTtnJiZjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9Yy50aW1lclJlYWR5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmlzQXBwbHlpbmdXaWRnZXRzPSExLGUuZGF0YShyLCJsYXN0V2lkZ2V0QXBwbGljYXRpb24iLG5ldyBEYXRlKSxjLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidGFibGVzb3J0ZXItcmVhZHkiKSxvfHwiZnVuY3Rpb24iIT10eXBlb2Ygc3x8cyhyKSxnJiYobD1jLndpZGdldHMubGVuZ3RoLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisoITA9PT1vPyJpbml0aWFsaXppbmcgIjoiYXBwbHlpbmcgIikrbCsiIHdpZGdldCIrKDEhPT1sPyJzIjoiIikrdC5iZW5jaG1hcmsoZCkpKX0sMTApfX0scmVtb3ZlV2lkZ2V0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkPShyPWUocilbMF0pLmNvbmZpZztpZighMD09PW8pZm9yKG89W10sbD10LndpZGdldHMubGVuZ3RoLGk9MDtpPGw7aSsrKShuPXQud2lkZ2V0c1tpXSkmJm4uaWQmJihvW28ubGVuZ3RoXT1uLmlkKTtlbHNlIG89KGUuaXNBcnJheShvKT9vLmpvaW4oIiwiKTpvfHwiIikudG9Mb3dlckNhc2UoKS5zcGxpdCgvW1xzLF0rLyk7Zm9yKGw9by5sZW5ndGgsYT0wO2E8bDthKyspbj10LmdldFdpZGdldEJ5SWQob1thXSksKGk9ZS5pbkFycmF5KG9bYV0sZC53aWRnZXRzKSk+PTAmJiEwIT09cyYmZC53aWRnZXRzLnNwbGljZShpLDEpLG4mJm4ucmVtb3ZlJiYodC5kZWJ1ZyhkLCJjb3JlIikmJmNvbnNvbGUubG9nKChzPyJSZWZyZXNoaW5nIjoiUmVtb3ZpbmciKSsnICInK29bYV0rJyIgd2lkZ2V0Jyksbi5yZW1vdmUocixkLGQud2lkZ2V0T3B0aW9ucyxzKSxkLndpZGdldEluaXRbb1thXV09ITEpO2QuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJ3aWRnZXRSZW1vdmVFbmQiLHIpfSxyZWZyZXNoV2lkZ2V0czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbixpPShyPWUocilbMF0pLmNvbmZpZy53aWRnZXRzLGw9dC53aWRnZXRzLGQ9bC5sZW5ndGgsYz1bXSxnPWZ1bmN0aW9uKHQpe2UodCkudHJpZ2dlckhhbmRsZXIoInJlZnJlc2hDb21wbGV0ZSIpfTtmb3IoYT0wO2E8ZDthKyspKG49bFthXSkmJm4uaWQmJihvfHxlLmluQXJyYXkobi5pZCxpKTwwKSYmKGNbYy5sZW5ndGhdPW4uaWQpO3QucmVtb3ZlV2lkZ2V0KHIsYy5qb2luKCIsIiksITApLCEwIT09cz8odC5hcHBseVdpZGdldChyLG98fCExLGcpLG8mJnQuYXBwbHlXaWRnZXQociwhMSxnKSk6ZyhyKX0sYmVuY2htYXJrOmZ1bmN0aW9uKGUpe3JldHVybiIgKCIrKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWUuZ2V0VGltZSgpKSsiIG1zKSJ9LGxvZzpmdW5jdGlvbigpe2NvbnNvbGUubG9nKGFyZ3VtZW50cyl9LGRlYnVnOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJighMD09PWUuZGVidWd8fCJzdHJpbmciPT10eXBlb2YgZS5kZWJ1ZyYmZS5kZWJ1Zy5pbmRleE9mKHQpPi0xKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0saXNWYWx1ZUluQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgcixvPXQmJnQubGVuZ3RofHwwO2ZvcihyPTA7cjxvO3IrKylpZih0W3JdWzBdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX0sZm9ybWF0RmxvYXQ6ZnVuY3Rpb24ocixvKXtpZigic3RyaW5nIiE9dHlwZW9mIHJ8fCIiPT09cilyZXR1cm4gcjt2YXIgcztyZXR1cm4gcj0obyYmby5jb25maWc/ITEhPT1vLmNvbmZpZy51c051bWJlckZvcm1hdDp2b2lkIDA9PT1vfHxvKT9yLnJlcGxhY2UodC5yZWdleC5jb21tYSwiIik6ci5yZXBsYWNlKHQucmVnZXguZGlnaXROb25VUywiIikucmVwbGFjZSh0LnJlZ2V4LmNvbW1hLCIuIiksdC5yZWdleC5kaWdpdE5lZ2F0aXZlVGVzdC50ZXN0KHIpJiYocj1yLnJlcGxhY2UodC5yZWdleC5kaWdpdE5lZ2F0aXZlUmVwbGFjZSwiLSQxIikpLHM9cGFyc2VGbG9hdChyKSxpc05hTihzKT9lLnRyaW0ocik6c30saXNEaWdpdDpmdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZSk/dC5yZWdleC5kaWdpdFRlc3QudGVzdChlLnRvU3RyaW5nKCkucmVwbGFjZSh0LnJlZ2V4LmRpZ2l0UmVwbGFjZSwiIikpOiIiIT09ZX0sY29tcHV0ZUNvbHVtbkluZGV4OmZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZyxwLHUsZj1vJiZvLmNvbHVtbnN8fDAsaD1bXSxtPW5ldyBBcnJheShmKTtmb3Iocz0wO3M8ci5sZW5ndGg7cysrKWZvcihkPXJbc10uY2VsbHMsYT0wO2E8ZC5sZW5ndGg7YSsrKXtmb3IoYz1zLGc9KGw9ZFthXSkucm93U3Bhbnx8MSxwPWwuY29sU3Bhbnx8MSx2b2lkIDA9PT1oW2NdJiYoaFtjXT1bXSksbj0wO248aFtjXS5sZW5ndGgrMTtuKyspaWYodm9pZCAwPT09aFtjXVtuXSl7dT1uO2JyZWFrfWZvcihmJiZsLmNlbGxJbmRleD09PXV8fChsLnNldEF0dHJpYnV0ZT9sLnNldEF0dHJpYnV0ZSgiZGF0YS1jb2x1bW4iLHUpOmUobCkuYXR0cigiZGF0YS1jb2x1bW4iLHUpKSxuPWM7bjxjK2c7bisrKWZvcih2b2lkIDA9PT1oW25dJiYoaFtuXT1bXSksbT1oW25dLGk9dTtpPHUrcDtpKyspbVtpXT0ieCJ9cmV0dXJuIHQuY2hlY2tDb2x1bW5Db3VudChyLGgsbS5sZW5ndGgpLG0ubGVuZ3RofSxjaGVja0NvbHVtbkNvdW50OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbyxzLGE9ITAsbj1bXTtmb3Iobz0wO288dC5sZW5ndGg7bysrKWlmKHRbb10mJihzPXRbb10ubGVuZ3RoLHRbb10ubGVuZ3RoIT09cikpe2E9ITE7YnJlYWt9YXx8KGUuZWFjaChmdW5jdGlvbihlLHQpe3ZhciByPXQucGFyZW50RWxlbWVudC5ub2RlTmFtZTtuLmluZGV4T2Yocik8MCYmbi5wdXNoKHIpfSksY29uc29sZS5lcnJvcigiSW52YWxpZCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlICIrbi5qb2luKCIgb3IgIikrIjsgZXhwZWN0ZWQgIityKyIsIGJ1dCBmb3VuZCAiK3MrIiBjb2x1bW5zIikpfSxmaXhDb2x1bW5XaWR0aDpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbixpLGw9KHI9ZShyKVswXSkuY29uZmlnLGQ9bC4kdGFibGUuY2hpbGRyZW4oImNvbGdyb3VwIik7aWYoZC5sZW5ndGgmJmQuaGFzQ2xhc3ModC5jc3MuY29sZ3JvdXApJiZkLnJlbW92ZSgpLGwud2lkdGhGaXhlZCYmMD09PWwuJHRhYmxlLmNoaWxkcmVuKCJjb2xncm91cCIpLmxlbmd0aCl7Zm9yKGQ9ZSgnPGNvbGdyb3VwIGNsYXNzPSInK3QuY3NzLmNvbGdyb3VwKyciPicpLG89bC4kdGFibGUud2lkdGgoKSxuPShhPWwuJHRib2RpZXMuZmluZCgidHI6Zmlyc3QiKS5jaGlsZHJlbigiOnZpc2libGUiKSkubGVuZ3RoLGk9MDtpPG47aSsrKXM9cGFyc2VJbnQoYS5lcShpKS53aWR0aCgpL28qMWUzLDEwKS8xMCsiJSIsZC5hcHBlbmQoZSgiPGNvbD4iKS5jc3MoIndpZHRoIixzKSk7bC4kdGFibGUucHJlcGVuZChkKX19LGdldERhdGE6ZnVuY3Rpb24odCxyLG8pe3ZhciBzLGEsbj0iIixpPWUodCk7cmV0dXJuIGkubGVuZ3RoPyhzPSEhZS5tZXRhZGF0YSYmaS5tZXRhZGF0YSgpLGE9IiAiKyhpLmF0dHIoImNsYXNzIil8fCIiKSx2b2lkIDAhPT1pLmRhdGEobyl8fHZvaWQgMCE9PWkuZGF0YShvLnRvTG93ZXJDYXNlKCkpP24rPWkuZGF0YShvKXx8aS5kYXRhKG8udG9Mb3dlckNhc2UoKSk6cyYmdm9pZCAwIT09c1tvXT9uKz1zW29dOnImJnZvaWQgMCE9PXJbb10/bis9cltvXToiICIhPT1hJiZhLm1hdGNoKCIgIitvKyItIikmJihuPWEubWF0Y2gobmV3IFJlZ0V4cCgiXFxzIitvKyItKFtcXHctXSspIikpWzFdfHwiIiksZS50cmltKG4pKToiIn0sZ2V0Q29sdW1uRGF0YTpmdW5jdGlvbih0LHIsbyxzLGEpe2lmKCJvYmplY3QiIT10eXBlb2Ygcnx8bnVsbD09PXIpcmV0dXJuIHI7dmFyIG4saT0odD1lKHQpWzBdKS5jb25maWcsbD1hfHxpLiRoZWFkZXJzLGQ9aS4kaGVhZGVySW5kZXhlZCYmaS4kaGVhZGVySW5kZXhlZFtvXXx8bC5maW5kKCdbZGF0YS1jb2x1bW49IicrbysnIl06bGFzdCcpO2lmKHZvaWQgMCE9PXJbb10pcmV0dXJuIHM/cltvXTpyW2wuaW5kZXgoZCldO2ZvcihuIGluIHIpaWYoInN0cmluZyI9PXR5cGVvZiBuJiZkLmZpbHRlcihuKS5hZGQoZC5maW5kKG4pKS5sZW5ndGgpcmV0dXJuIHJbbl19LGlzUHJvY2Vzc2luZzpmdW5jdGlvbihyLG8scyl7dmFyIGE9KHI9ZShyKSlbMF0uY29uZmlnLG49c3x8ci5maW5kKCIuIit0LmNzcy5oZWFkZXIpO28/KHZvaWQgMCE9PXMmJmEuc29ydExpc3QubGVuZ3RoPjAmJihuPW4uZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuc29ydERpc2FibGVkJiZ0LmlzVmFsdWVJbkFycmF5KHBhcnNlRmxvYXQoZSh0aGlzKS5hdHRyKCJkYXRhLWNvbHVtbiIpKSxhLnNvcnRMaXN0KT49MH0pKSxyLmFkZChuKS5hZGRDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpKTpyLmFkZChuKS5yZW1vdmVDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpfSxwcm9jZXNzVGJvZHk6ZnVuY3Rpb24odCxyLG8pe2lmKHQ9ZSh0KVswXSxvKXJldHVybiB0LmlzUHJvY2Vzc2luZz0hMCxyLmJlZm9yZSgnPGNvbGdyb3VwIGNsYXNzPSJ0YWJsZXNvcnRlci1zYXZlbXlwbGFjZSIvPicpLGUuZm4uZGV0YWNoP3IuZGV0YWNoKCk6ci5yZW1vdmUoKTt2YXIgcz1lKHQpLmZpbmQoImNvbGdyb3VwLnRhYmxlc29ydGVyLXNhdmVteXBsYWNlIik7ci5pbnNlcnRBZnRlcihzKSxzLnJlbW92ZSgpLHQuaXNQcm9jZXNzaW5nPSExfSxjbGVhclRhYmxlQm9keTpmdW5jdGlvbih0KXtlKHQpWzBdLmNvbmZpZy4kdGJvZGllcy5jaGlsZHJlbigpLmRldGFjaCgpfSxjaGFyYWN0ZXJFcXVpdmFsZW50czp7YToiw6HDoMOiw6PDpMSFw6UiLEE6IsOBw4DDgsODw4TEhMOFIixjOiLDp8SHxI0iLEM6IsOHxIbEjCIsZToiw6nDqMOqw6vEm8SZIixFOiLDicOIw4rDi8SaxJgiLGk6IsOtw6zEsMOuw6/EsSIsSToiw43DjMSww47DjyIsbzoiw7PDssO0w7XDtsWNIixPOiLDk8OSw5TDlcOWxYwiLHNzOiLDnyIsU1M6IuG6niIsdToiw7rDucO7w7zFryIsVToiw5rDmcObw5zFriJ9LHJlcGxhY2VBY2NlbnRzOmZ1bmN0aW9uKGUpe3ZhciByLG89IlsiLHM9dC5jaGFyYWN0ZXJFcXVpdmFsZW50cztpZighdC5jaGFyYWN0ZXJSZWdleCl7dC5jaGFyYWN0ZXJSZWdleEFycmF5PXt9O2ZvcihyIGluIHMpInN0cmluZyI9PXR5cGVvZiByJiYobys9c1tyXSx0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl09bmV3IFJlZ0V4cCgiWyIrc1tyXSsiXSIsImciKSk7dC5jaGFyYWN0ZXJSZWdleD1uZXcgUmVnRXhwKG8rIl0iKX1pZih0LmNoYXJhY3RlclJlZ2V4LnRlc3QoZSkpZm9yKHIgaW4gcykic3RyaW5nIj09dHlwZW9mIHImJihlPWUucmVwbGFjZSh0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl0scikpO3JldHVybiBlfSx2YWxpZGF0ZU9wdGlvbnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG4saT0iaGVhZGVycyBzb3J0Rm9yY2Ugc29ydExpc3Qgc29ydEFwcGVuZCB3aWRnZXRzIi5zcGxpdCgiICIpLGw9ci5vcmlnaW5hbFNldHRpbmdzO2lmKGwpe3QuZGVidWcociwiY29yZSIpJiYobj1uZXcgRGF0ZSk7Zm9yKG8gaW4gbClpZigidW5kZWZpbmVkIj09PShhPXR5cGVvZiB0LmRlZmF1bHRzW29dKSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ0YWJsZS5jb25maWcuJytvKyciIG9wdGlvbiBub3QgcmVjb2duaXplZCcpO2Vsc2UgaWYoIm9iamVjdCI9PT1hKWZvcihzIGluIGxbb10pYT10LmRlZmF1bHRzW29dJiZ0eXBlb2YgdC5kZWZhdWx0c1tvXVtzXSxlLmluQXJyYXkobyxpKTwwJiYidW5kZWZpbmVkIj09PWEmJmNvbnNvbGUud2FybignVGFibGVzb3J0ZXIgV2FybmluZyEgInRhYmxlLmNvbmZpZy4nK28rIi4iK3MrJyIgb3B0aW9uIG5vdCByZWNvZ25pemVkJyk7dC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ2YWxpZGF0ZSBvcHRpb25zIHRpbWU6Iit0LmJlbmNobWFyayhuKSl9fSxyZXN0b3JlSGVhZGVyczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ZShyKVswXS5jb25maWcsbj1hLiR0YWJsZS5maW5kKGEuc2VsZWN0b3JIZWFkZXJzKSxpPW4ubGVuZ3RoO2ZvcihvPTA7bzxpO28rKykocz1uLmVxKG8pKS5maW5kKCIuIit0LmNzcy5oZWFkZXJJbikubGVuZ3RoJiZzLmh0bWwoYS5oZWFkZXJDb250ZW50W29dKX0sZGVzdHJveTpmdW5jdGlvbihyLG8scyl7aWYoKHI9ZShyKVswXSkuaGFzSW5pdGlhbGl6ZWQpe3QucmVtb3ZlV2lkZ2V0KHIsITAsITEpO3ZhciBhLG49ZShyKSxpPXIuY29uZmlnLGw9bi5maW5kKCJ0aGVhZDpmaXJzdCIpLGQ9bC5maW5kKCJ0ci4iK3QuY3NzLmhlYWRlclJvdykucmVtb3ZlQ2xhc3ModC5jc3MuaGVhZGVyUm93KyIgIitpLmNzc0hlYWRlclJvdyksYz1uLmZpbmQoInRmb290OmZpcnN0ID4gdHIiKS5jaGlsZHJlbigidGgsIHRkIik7ITE9PT1vJiZlLmluQXJyYXkoInVpdGhlbWUiLGkud2lkZ2V0cyk+PTAmJihuLnRyaWdnZXJIYW5kbGVyKCJhcHBseVdpZGdldElkIixbInVpdGhlbWUiXSksbi50cmlnZ2VySGFuZGxlcigiYXBwbHlXaWRnZXRJZCIsWyJ6ZWJyYSJdKSksbC5maW5kKCJ0ciIpLm5vdChkKS5yZW1vdmUoKSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgdXBkYXRlQ2VsbCBhZGRSb3dzIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyByZW1vdmVXaWRnZXQgZGVzdHJveSBtb3VzZXVwIG1vdXNlbGVhdmUgIisia2V5cHJlc3Mgc29ydEJlZ2luIHNvcnRFbmQgcmVzZXRUb0xvYWRTdGF0ZSAiLnNwbGl0KCIgIikuam9pbihpLm5hbWVzcGFjZSsiICIpLG4ucmVtb3ZlRGF0YSgidGFibGVzb3J0ZXIiKS51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLGkuJGhlYWRlcnMuYWRkKGMpLnJlbW92ZUNsYXNzKFt0LmNzcy5oZWFkZXIsaS5jc3NIZWFkZXIsaS5jc3NBc2MsaS5jc3NEZXNjLHQuY3NzLnNvcnRBc2MsdC5jc3Muc29ydERlc2MsdC5jc3Muc29ydE5vbmVdLmpvaW4oIiAiKSkucmVtb3ZlQXR0cigiZGF0YS1jb2x1bW4iKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSxkLmZpbmQoaS5zZWxlY3RvclNvcnQpLnVuYmluZCgibW91c2Vkb3duIG1vdXNldXAga2V5cHJlc3MgIi5zcGxpdCgiICIpLmpvaW4oaS5uYW1lc3BhY2UrIiAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLHQucmVzdG9yZUhlYWRlcnMociksbi50b2dnbGVDbGFzcyh0LmNzcy50YWJsZSsiICIraS50YWJsZUNsYXNzKyIgdGFibGVzb3J0ZXItIitpLnRoZW1lLCExPT09byksbi5yZW1vdmVDbGFzcyhpLm5hbWVzcGFjZS5zbGljZSgxKSksci5oYXNJbml0aWFsaXplZD0hMSxkZWxldGUgci5jb25maWcuY2FjaGUsImZ1bmN0aW9uIj09dHlwZW9mIHMmJnMociksdC5kZWJ1ZyhpLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ0YWJsZXNvcnRlciBoYXMgYmVlbiByZW1vdmVkIil9fX07ZS5mbi50YWJsZXNvcnRlcj1mdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxzPWUuZXh0ZW5kKCEwLHt9LHQuZGVmYXVsdHMscix0Lmluc3RhbmNlTWV0aG9kcyk7cy5vcmlnaW5hbFNldHRpbmdzPXIsIW8uaGFzSW5pdGlhbGl6ZWQmJnQuYnVpbGRUYWJsZSYmIlRBQkxFIiE9PXRoaXMubm9kZU5hbWU/dC5idWlsZFRhYmxlKG8scyk6dC5zZXR1cChvLHMpfSl9LHdpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2d8fCh0LmxvZ3M9W10sY29uc29sZT17fSxjb25zb2xlLmxvZz1jb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj1jb25zb2xlLnRhYmxlPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50czphcmd1bWVudHNbMF07dC5sb2dzW3QubG9ncy5sZW5ndGhdPXtkYXRlOkRhdGUubm93KCksbG9nOmV9fSksdC5hZGRQYXJzZXIoe2lkOiJuby1wYXJzZXIiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbigpe3JldHVybiIifSx0eXBlOiJ0ZXh0In0pLHQuYWRkUGFyc2VyKHtpZDoidGV4dCIsaXM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9by5jb25maWc7cmV0dXJuIHImJihyPWUudHJpbShzLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpLHI9cy5zb3J0TG9jYWxlQ29tcGFyZT90LnJlcGxhY2VBY2NlbnRzKHIpOnIpLHJ9LHR5cGU6InRleHQifSksdC5yZWdleC5ub25kaWdpdD0vW15cdywuIFwtKCldL2csdC5hZGRQYXJzZXIoe2lkOiJkaWdpdCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNEaWdpdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC5jdXJyZW5jeVJlcGxhY2U9L1srXC0sLiBdL2csdC5yZWdleC5jdXJyZW5jeVRlc3Q9L15cKD9cZCtbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXXxbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXVxkK1wpPyQvLHQuYWRkUGFyc2VyKHtpZDoiY3VycmVuY3kiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiBlPShlfHwiIikucmVwbGFjZSh0LnJlZ2V4LmN1cnJlbmN5UmVwbGFjZSwiIiksdC5yZWdleC5jdXJyZW5jeVRlc3QudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC51cmxQcm90b2NvbFRlc3Q9L14oaHR0cHM/fGZ0cHxmaWxlKTpcL1wvLyx0LnJlZ2V4LnVybFByb3RvY29sUmVwbGFjZT0vKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLyh3d3dcLik/Lyx0LmFkZFBhcnNlcih7aWQ6InVybCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgudXJsUHJvdG9jb2xUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihyKXtyZXR1cm4gcj9lLnRyaW0oci5yZXBsYWNlKHQucmVnZXgudXJsUHJvdG9jb2xSZXBsYWNlLCIiKSk6cn0sdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhc2g9Ly0vZyx0LnJlZ2V4Lmlzb0RhdGU9L15cZHs0fVtcL1wtXVxkezEsMn1bXC9cLV1cZHsxLDJ9Lyx0LmFkZFBhcnNlcih7aWQ6Imlzb0RhdGUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4Lmlzb0RhdGUudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGFzaCwiLyIpKTplO3JldHVybiByIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocik/ci5nZXRUaW1lKCk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnBlcmNlbnQ9LyUvZyx0LnJlZ2V4LnBlcmNlbnRUZXN0PS8oXGRccyo/JXwlXHMqP1xkKS8sdC5hZGRQYXJzZXIoe2lkOiJwZXJjZW50IixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC5wZXJjZW50VGVzdC50ZXN0KGUpJiZlLmxlbmd0aDwxNX0sZm9ybWF0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGU/dC5mb3JtYXRGbG9hdChlLnJlcGxhY2UodC5yZWdleC5wZXJjZW50LCIiKSxyKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoiaW1hZ2UiLGlzOmZ1bmN0aW9uKGUsdCxyLG8pe3JldHVybiBvLmZpbmQoImltZyIpLmxlbmd0aD4wfSxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3JldHVybiBlKG8pLmZpbmQoImltZyIpLmF0dHIoci5jb25maWcuaW1nQXR0cnx8ImFsdCIpfHx0fSxwYXJzZWQ6ITAsdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhdGVSZXBsYWNlPS8oXFMpKFtBUF1NKSQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0MT0vXltBLVpdezMsMTB9XC4/XHMrXGR7MSwyfSw/XHMrKFxkezR9KShccytcZHsxLDJ9OlxkezJ9KDpcZHsyfSk/KFxzK1tBUF1NKT8pPyQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0Mj0vXlxkezEsMn1ccytbQS1aXXszLDEwfVxzK1xkezR9L2ksdC5hZGRQYXJzZXIoe2lkOiJ1c0xvbmdEYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC51c0xvbmdEYXRlVGVzdDEudGVzdChlKXx8dC5yZWdleC51c0xvbmdEYXRlVGVzdDIudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGF0ZVJlcGxhY2UsIiQxICQyIikpOmU7cmV0dXJuIHIgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShyKT9yLmdldFRpbWUoKTplfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXguc2hvcnREYXRlVGVzdD0vKF5cZHsxLDJ9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezR9KXwoXlxkezR9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezEsMn0pLyx0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2U9L1tcLS4sXS9nLHQucmVnZXguc2hvcnREYXRlWFhZPS8oXGR7MSwyfSlbXC9cc10oXGR7MSwyfSlbXC9cc10oXGR7NH0pLyx0LnJlZ2V4LnNob3J0RGF0ZVlNRD0vKFxkezR9KVtcL1xzXShcZHsxLDJ9KVtcL1xzXShcZHsxLDJ9KS8sdC5jb252ZXJ0Rm9ybWF0PWZ1bmN0aW9uKGUscil7ZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLCJtbWRkeXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMS8kMiIpOiJkZG1teXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMi8kMSIpOiJ5eXl5bW1kZCI9PT1yJiYoZT1lLnJlcGxhY2UodC5yZWdleC5zaG9ydERhdGVZTUQsIiQxLyQyLyQzIikpO3ZhciBvPW5ldyBEYXRlKGUpO3JldHVybiBvIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUobyk/by5nZXRUaW1lKCk6IiJ9LHQuYWRkUGFyc2VyKHtpZDoic2hvcnREYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLHQucmVnZXguc2hvcnREYXRlVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZSl7dmFyIGE9ci5jb25maWcsbj1hLiRoZWFkZXJJbmRleGVkW3NdLGk9bi5sZW5ndGgmJm4uZGF0YSgiZGF0ZUZvcm1hdCIpfHx0LmdldERhdGEobix0LmdldENvbHVtbkRhdGEocixhLmhlYWRlcnMscyksImRhdGVGb3JtYXQiKXx8YS5kYXRlRm9ybWF0O3JldHVybiBuLmxlbmd0aCYmbi5kYXRhKCJkYXRlRm9ybWF0IixpKSx0LmNvbnZlcnRGb3JtYXQoZSxpKXx8ZX1yZXR1cm4gZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnRpbWVUZXN0PS9eKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSkkfF4oKD86WzAxXVxkfFsyXVswLTRdKTpbMC01XVxkKSQvaSx0LnJlZ2V4LnRpbWVNYXRjaD0vKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSl8KCg/OlswMV1cZHxbMl1bMC00XSk6WzAtNV1cZCkvaSx0LmFkZFBhcnNlcih7aWQ6InRpbWUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4LnRpbWVUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcixvPShlfHwiIikubWF0Y2godC5yZWdleC50aW1lTWF0Y2gpLHM9bmV3IERhdGUoZSksYT1lJiYobnVsbCE9PW8/b1swXToiMDA6MDAgQU0iKSxuPWE/bmV3IERhdGUoIjIwMDAvMDEvMDEgIithLnJlcGxhY2UodC5yZWdleC5kYXRlUmVwbGFjZSwiJDEgJDIiKSk6YTtyZXR1cm4gbiBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKG4pPyhyPXMgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShzKT9zLmdldFRpbWUoKTowLHI/cGFyc2VGbG9hdChuLmdldFRpbWUoKSsiLiIrcy5nZXRUaW1lKCkpOm4uZ2V0VGltZSgpKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoibWV0YWRhdGEiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHM9ci5jb25maWcsYT1zLnBhcnNlck1ldGFkYXRhTmFtZT9zLnBhcnNlck1ldGFkYXRhTmFtZToic29ydFZhbHVlIjtyZXR1cm4gZShvKS5tZXRhZGF0YSgpW2FdfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkV2lkZ2V0KHtpZDoiemVicmEiLHByaW9yaXR5OjkwLGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZz1uZXcgUmVnRXhwKHIuY3NzQ2hpbGRSb3csImkiKSxwPXIuJHRib2RpZXMuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV90YWJsZSIpLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrci5jc3NJbmZvQmxvY2srIikiKSk7Zm9yKGw9MDtsPHAubGVuZ3RoO2wrKylmb3Iobj0wLGM9KHM9cC5lcShsKS5jaGlsZHJlbigidHI6dmlzaWJsZSIpLm5vdChyLnNlbGVjdG9yUmVtb3ZlKSkubGVuZ3RoLGQ9MDtkPGM7ZCsrKWE9cy5lcShkKSxnLnRlc3QoYVswXS5jbGFzc05hbWUpfHxuKyssaT1uJTI9PTAsYS5yZW1vdmVDbGFzcyhvLnplYnJhW2k/MTowXSkuYWRkQ2xhc3Moby56ZWJyYVtpPzA6MV0pfSxyZW1vdmU6ZnVuY3Rpb24oZSxyLG8scyl7aWYoIXMpe3ZhciBhLG4saT1yLiR0Ym9kaWVzLGw9KG8uemVicmF8fFsiZXZlbiIsIm9kZCJdKS5qb2luKCIgIik7Zm9yKGE9MDthPGkubGVuZ3RoO2ErKykobj10LnByb2Nlc3NUYm9keShlLGkuZXEoYSksITApKS5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKGwpLHQucHJvY2Vzc1Rib2R5KGUsbiwhMSl9fX0pfShlKSxlLnRhYmxlc29ydGVyfSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAgICBDb3B5cmlnaHQgMjAwOC0yMDEzCiAgICAgICAgTWF0dGhpYXMgRWhtYW5uLAogICAgICAgIE1pY2hhZWwgR2VyaGFldXNlciwKICAgICAgICBDYXJzdGVuIE1pbGxlciwKICAgICAgICBCaWFuY2EgVmFsZW50aW4sCiAgICAgICAgQWxmcmVkIFdhc3Nlcm1hbm4sCiAgICAgICAgUGV0ZXIgV2lsZmFocnQKICAgIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBvciBMR1BMIFZlcnNpb24gMyBsaWNlbnNlcy4KICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLgogICAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8+LgoqLwooZnVuY3Rpb24oKXt2YXIgZSxyLG47KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG8oZSxyKXtyZXR1cm4gQy5jYWxsKGUscil9ZnVuY3Rpb24gaShlLHIpe3ZhciBuLHQsbyxpLGEsdSxjLGYscyxsLHA9ciYmci5zcGxpdCgiLyIpLGg9ay5tYXAsZD1oJiZoWyIqIl18fHt9O2lmKGUmJiIuIj09PWUuY2hhckF0KDApKWlmKHIpe2ZvcihwPXAuc2xpY2UoMCxwLmxlbmd0aC0xKSxlPXAuY29uY2F0KGUuc3BsaXQoIi8iKSksZj0wO2UubGVuZ3RoPmY7Zis9MSlpZihsPWVbZl0sIi4iPT09bCllLnNwbGljZShmLDEpLGYtPTE7ZWxzZSBpZigiLi4iPT09bCl7aWYoMT09PWYmJigiLi4iPT09ZVsyXXx8Ii4uIj09PWVbMF0pKWJyZWFrO2Y+MCYmKGUuc3BsaWNlKGYtMSwyKSxmLT0yKX1lPWUuam9pbigiLyIpfWVsc2UgMD09PWUuaW5kZXhPZigiLi8iKSYmKGU9ZS5zdWJzdHJpbmcoMikpO2lmKChwfHxkKSYmaCl7Zm9yKG49ZS5zcGxpdCgiLyIpLGY9bi5sZW5ndGg7Zj4wO2YtPTEpe2lmKHQ9bi5zbGljZSgwLGYpLmpvaW4oIi8iKSxwKWZvcihzPXAubGVuZ3RoO3M+MDtzLT0xKWlmKG89aFtwLnNsaWNlKDAscykuam9pbigiLyIpXSxvJiYobz1vW3RdKSl7aT1vLGE9ZjticmVha31pZihpKWJyZWFrOyF1JiZkJiZkW3RdJiYodT1kW3RdLGM9Zil9IWkmJnUmJihpPXUsYT1jKSxpJiYobi5zcGxpY2UoMCxhLGkpLGU9bi5qb2luKCIvIikpfXJldHVybiBlfWZ1bmN0aW9uIGEoZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaC5hcHBseSh0LHYuY2FsbChhcmd1bWVudHMsMCkuY29uY2F0KFtlLHJdKSl9fWZ1bmN0aW9uIHUoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBpKHIsZSl9fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe2JbZV09cn19ZnVuY3Rpb24gZihlKXtpZihvKG0sZSkpe3ZhciByPW1bZV07ZGVsZXRlIG1bZV0seVtlXT0hMCxwLmFwcGx5KHQscil9aWYoIW8oYixlKSYmIW8oeSxlKSl0aHJvdyBFcnJvcigiTm8gIitlKTtyZXR1cm4gYltlXX1mdW5jdGlvbiBzKGUpe3ZhciByLG49ZT9lLmluZGV4T2YoIiEiKTotMTtyZXR1cm4gbj4tMSYmKHI9ZS5zdWJzdHJpbmcoMCxuKSxlPWUuc3Vic3RyaW5nKG4rMSxlLmxlbmd0aCkpLFtyLGVdfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGsmJmsuY29uZmlnJiZrLmNvbmZpZ1tlXXx8e319fXZhciBwLGgsZCxnLGI9e30sbT17fSxrPXt9LHk9e30sQz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHY9W10uc2xpY2U7ZD1mdW5jdGlvbihlLHIpe3ZhciBuLHQ9cyhlKSxvPXRbMF07cmV0dXJuIGU9dFsxXSxvJiYobz1pKG8sciksbj1mKG8pKSxvP2U9biYmbi5ub3JtYWxpemU/bi5ub3JtYWxpemUoZSx1KHIpKTppKGUscik6KGU9aShlLHIpLHQ9cyhlKSxvPXRbMF0sZT10WzFdLG8mJihuPWYobykpKSx7ZjpvP28rIiEiK2U6ZSxuOmUscHI6byxwOm59fSxnPXtyZXF1aXJlOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUpfSxleHBvcnRzOmZ1bmN0aW9uKGUpe3ZhciByPWJbZV07cmV0dXJuIHIhPT12b2lkIDA/cjpiW2VdPXt9fSxtb2R1bGU6ZnVuY3Rpb24oZSl7cmV0dXJue2lkOmUsdXJpOiIiLGV4cG9ydHM6YltlXSxjb25maWc6bChlKX19fSxwPWZ1bmN0aW9uKGUscixuLGkpe3ZhciB1LHMsbCxwLGgsayxDPVtdO2lmKGk9aXx8ZSwiZnVuY3Rpb24iPT10eXBlb2Ygbil7Zm9yKHI9IXIubGVuZ3RoJiZuLmxlbmd0aD9bInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl06cixoPTA7ci5sZW5ndGg+aDtoKz0xKWlmKHA9ZChyW2hdLGkpLHM9cC5mLCJyZXF1aXJlIj09PXMpQ1toXT1nLnJlcXVpcmUoZSk7ZWxzZSBpZigiZXhwb3J0cyI9PT1zKUNbaF09Zy5leHBvcnRzKGUpLGs9ITA7ZWxzZSBpZigibW9kdWxlIj09PXMpdT1DW2hdPWcubW9kdWxlKGUpO2Vsc2UgaWYobyhiLHMpfHxvKG0scyl8fG8oeSxzKSlDW2hdPWYocyk7ZWxzZXtpZighcC5wKXRocm93IEVycm9yKGUrIiBtaXNzaW5nICIrcyk7cC5wLmxvYWQocC5uLGEoaSwhMCksYyhzKSx7fSksQ1toXT1iW3NdfWw9bi5hcHBseShiW2VdLEMpLGUmJih1JiZ1LmV4cG9ydHMhPT10JiZ1LmV4cG9ydHMhPT1iW2VdP2JbZV09dS5leHBvcnRzOmw9PT10JiZrfHwoYltlXT1sKSl9ZWxzZSBlJiYoYltlXT1uKX0sZT1yPWg9ZnVuY3Rpb24oZSxyLG4sbyxpKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/Z1tlXT9nW2VdKHIpOmYoZChlLHIpLmYpOihlLnNwbGljZXx8KGs9ZSxyLnNwbGljZT8oZT1yLHI9bixuPW51bGwpOmU9dCkscj1yfHxmdW5jdGlvbigpe30sImZ1bmN0aW9uIj09dHlwZW9mIG4mJihuPW8sbz1pKSxvP3AodCxlLHIsbik6c2V0VGltZW91dChmdW5jdGlvbigpe3AodCxlLHIsbil9LDQpLGgpfSxoLmNvbmZpZz1mdW5jdGlvbihlKXtyZXR1cm4gaz1lLGsuZGVwcyYmaChrLmRlcHMsay5jYWxsYmFjayksaH0sbj1mdW5jdGlvbihlLHIsbil7ci5zcGxpY2V8fChuPXIscj1bXSksbyhiLGUpfHxvKG0sZSl8fChtW2VdPVtlLHIsbl0pfSxuLmFtZD17alF1ZXJ5OiEwfX0pKCksbigiLi4vbm9kZV9tb2R1bGVzL2FsbW9uZC9hbG1vbmQiLGZ1bmN0aW9uKCl7fSksbigianhnIixbXSxmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiJvYmplY3QiIT10eXBlb2YgSlhHfHxKWEcuZXh0ZW5kfHwoZT1KWEcpLGUuZXh0ZW5kPWZ1bmN0aW9uKGUscixuLHQpe3ZhciBvLGk7bj1ufHwhMSx0PXR8fCExO2ZvcihvIGluIHIpKCFufHxuJiZyLmhhc093blByb3BlcnR5KG8pKSYmKGk9dD9vLnRvTG93ZXJDYXNlKCk6byxlW2ldPXJbb10pfSxlLmV4dGVuZChlLHtib2FyZHM6e30scmVhZGVyczp7fSxlbGVtZW50czp7fSxyZWdpc3RlckVsZW1lbnQ6ZnVuY3Rpb24oZSxyKXtlPWUudG9Mb3dlckNhc2UoKSx0aGlzLmVsZW1lbnRzW2VdPXJ9LHJlZ2lzdGVyUmVhZGVyOmZ1bmN0aW9uKGUscil7dmFyIG4sdDtmb3Iobj0wO3IubGVuZ3RoPm47bisrKXQ9cltuXS50b0xvd2VyQ2FzZSgpLCJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLnJlYWRlcnNbdF0mJih0aGlzLnJlYWRlcnNbdF09ZSl9LHNob3J0Y3V0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbcl0uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sZ2V0UmVmOmZ1bmN0aW9uKGUscil7cmV0dXJuIGUuc2VsZWN0KHIpfSxnZXRSZWZlcmVuY2U6ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZS5zZWxlY3Qocil9LGRlYnVnSW50OmZ1bmN0aW9uKCl7dmFyIGUscjtmb3IoZT0wO2FyZ3VtZW50cy5sZW5ndGg+ZTtlKyspcj1hcmd1bWVudHNbZV0sIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZz9jb25zb2xlLmxvZyhyKToib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVidWciKSYmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZWJ1ZyIpLmlubmVySFRNTCs9cisiPGJyLz4iKX0sZGVidWdXU1Q6ZnVuY3Rpb24oKXt2YXIgcj1FcnJvcigpO2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJnIuc3RhY2smJihlLmRlYnVnSW50KCJzdGFja3RyYWNlIiksZS5kZWJ1Z0ludChyLnN0YWNrLnNwbGl0KCJcbiIpLnNsaWNlKDEpLmpvaW4oIlxuIikpKX0sZGVidWdMaW5lOmZ1bmN0aW9uKCl7dmFyIHI9RXJyb3IoKTtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZyLnN0YWNrJiZlLmRlYnVnSW50KCJDYWxsZWQgZnJvbSIsci5zdGFjay5zcGxpdCgiXG4iKS5zbGljZSgyLDMpLmpvaW4oIlxuIikpfSxkZWJ1ZzpmdW5jdGlvbigpe2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pLGV9KSxuKCJ1dGlscy96aXAiLFsianhnIl0sZnVuY3Rpb24oZSl7dmFyIHI9WzAsMTI4LDY0LDE5MiwzMiwxNjAsOTYsMjI0LDE2LDE0NCw4MCwyMDgsNDgsMTc2LDExMiwyNDAsOCwxMzYsNzIsMjAwLDQwLDE2OCwxMDQsMjMyLDI0LDE1Miw4OCwyMTYsNTYsMTg0LDEyMCwyNDgsNCwxMzIsNjgsMTk2LDM2LDE2NCwxMDAsMjI4LDIwLDE0OCw4NCwyMTIsNTIsMTgwLDExNiwyNDQsMTIsMTQwLDc2LDIwNCw0NCwxNzIsMTA4LDIzNiwyOCwxNTYsOTIsMjIwLDYwLDE4OCwxMjQsMjUyLDIsMTMwLDY2LDE5NCwzNCwxNjIsOTgsMjI2LDE4LDE0Niw4MiwyMTAsNTAsMTc4LDExNCwyNDIsMTAsMTM4LDc0LDIwMiw0MiwxNzAsMTA2LDIzNCwyNiwxNTQsOTAsMjE4LDU4LDE4NiwxMjIsMjUwLDYsMTM0LDcwLDE5OCwzOCwxNjYsMTAyLDIzMCwyMiwxNTAsODYsMjE0LDU0LDE4MiwxMTgsMjQ2LDE0LDE0Miw3OCwyMDYsNDYsMTc0LDExMCwyMzgsMzAsMTU4LDk0LDIyMiw2MiwxOTAsMTI2LDI1NCwxLDEyOSw2NSwxOTMsMzMsMTYxLDk3LDIyNSwxNywxNDUsODEsMjA5LDQ5LDE3NywxMTMsMjQxLDksMTM3LDczLDIwMSw0MSwxNjksMTA1LDIzMywyNSwxNTMsODksMjE3LDU3LDE4NSwxMjEsMjQ5LDUsMTMzLDY5LDE5NywzNywxNjUsMTAxLDIyOSwyMSwxNDksODUsMjEzLDUzLDE4MSwxMTcsMjQ1LDEzLDE0MSw3NywyMDUsNDUsMTczLDEwOSwyMzcsMjksMTU3LDkzLDIyMSw2MSwxODksMTI1LDI1MywzLDEzMSw2NywxOTUsMzUsMTYzLDk5LDIyNywxOSwxNDcsODMsMjExLDUxLDE3OSwxMTUsMjQzLDExLDEzOSw3NSwyMDMsNDMsMTcxLDEwNywyMzUsMjcsMTU1LDkxLDIxOSw1OSwxODcsMTIzLDI1MSw3LDEzNSw3MSwxOTksMzksMTY3LDEwMywyMzEsMjMsMTUxLDg3LDIxNSw1NSwxODMsMTE5LDI0NywxNSwxNDMsNzksMjA3LDQ3LDE3NSwxMTEsMjM5LDMxLDE1OSw5NSwyMjMsNjMsMTkxLDEyNywyNTVdLG49WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSx0PVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsOTksOTldLG89WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3N10saT1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sYT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sdT0yNTY7cmV0dXJuIGUuVXRpbD1lLlV0aWx8fHt9LGUuVXRpbC5VbnppcD1mdW5jdGlvbihjKXtmdW5jdGlvbiBmKCl7cmV0dXJuIFIrPTgsTz5YP2NbWCsrXTotMX1mdW5jdGlvbiBzKCl7Qj0xfWZ1bmN0aW9uIGwoKXt2YXIgZTt0cnl7cmV0dXJuIFIrKyxlPTEmQixCPj49MSwwPT09QiYmKEI9ZigpLGU9MSZCLEI9MTI4fEI+PjEpLGV9Y2F0Y2gocil7dGhyb3cgcn19ZnVuY3Rpb24gcChlKXt2YXIgbj0wLHQ9ZTt0cnl7Zm9yKDt0LS07KW49bjw8MXxsKCk7ZSYmKG49cltuXT4+OC1lKX1jYXRjaChvKXt0aHJvdyBvfXJldHVybiBufWZ1bmN0aW9uIGgoKXtKPTB9ZnVuY3Rpb24gZChlKXtqKyssR1tKKytdPWUsei5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpLDMyNzY4PT09SiYmKEo9MCl9ZnVuY3Rpb24gZygpe3RoaXMuYjA9MCx0aGlzLmIxPTAsdGhpcy5qdW1wPW51bGwsdGhpcy5qdW1wcG9zPS0xfWZ1bmN0aW9uIGIoKXtmb3IoOzspe2lmKE1bSF0+PXgpcmV0dXJuLTE7aWYoVVtNW0hdXT09PUgpcmV0dXJuIE1bSF0rKztNW0hdKyt9fWZ1bmN0aW9uIG0oKXt2YXIgZSxyPVBbRl07aWYoMTc9PT1IKXJldHVybi0xO2lmKEYrKyxIKyssZT1iKCksZT49MClyLmIwPWU7ZWxzZSBpZihyLmIwPTMyNzY4LG0oKSlyZXR1cm4tMTtpZihlPWIoKSxlPj0wKXIuYjE9ZSxyLmp1bXA9bnVsbDtlbHNlIGlmKHIuYjE9MzI3Njgsci5qdW1wPVBbRl0sci5qdW1wcG9zPUYsbSgpKXJldHVybi0xO3JldHVybiBILS0sMH1mdW5jdGlvbiBrKGUscixuKXt2YXIgdDtmb3IoUD1lLEY9MCxVPW4seD1yLHQ9MDsxNz50O3QrKylNW3RdPTA7cmV0dXJuIEg9MCxtKCk/LTE6MH1mdW5jdGlvbiB5KGUpe2Zvcih2YXIgcixuLHQsbz0wLGk9ZVtvXTs7KWlmKHQ9bCgpKXtpZighKDMyNzY4JmkuYjEpKXJldHVybiBpLmIxO2ZvcihpPWkuanVtcCxyPWUubGVuZ3RoLG49MDtyPm47bisrKWlmKGVbbl09PT1pKXtvPW47YnJlYWt9fWVsc2V7aWYoISgzMjc2OCZpLmIwKSlyZXR1cm4gaS5iMDtvKyssaT1lW29dfX1mdW5jdGlvbiBDKCl7dmFyIHUsYyxiLG0sQyx2LEEsaix3LFUseCxTLHosSSxFLEwsTztkbyBpZih1PWwoKSxiPXAoMiksMD09PWIpZm9yKHMoKSxVPWYoKSxVfD1mKCk8PDgsUz1mKCksU3w9ZigpPDw4LDY1NTM1JihVXn5TKSYmZS5kZWJ1ZygiQmxvY2tMZW4gY2hlY2tzdW0gbWlzbWF0Y2hcbiIpO1UtLTspYz1mKCksZChjKTtlbHNlIGlmKDE9PT1iKWZvcig7OylpZihDPXJbcCg3KV0+PjEsQz4yMz8oQz1DPDwxfGwoKSxDPjE5OT8oQy09MTI4LEM9Qzw8MXxsKCkpOihDLT00OCxDPjE0MyYmKEMrPTEzNikpKTpDKz0yNTYsMjU2PkMpZChDKTtlbHNle2lmKDI1Nj09PUMpYnJlYWs7Zm9yKEMtPTI1Nyx3PXAodFtDXSkrbltDXSxDPXJbcCg1KV0+PjMsaVtDXT44Pyh4PXAoOCkseHw9cChpW0NdLTgpPDw4KTp4PXAoaVtDXSkseCs9b1tDXSxDPTA7dz5DO0MrKyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgaWYoMj09PWIpe2ZvcihBPUFycmF5KDMyMCksST0yNTcrcCg1KSxFPTErcCg1KSxMPTQrcCg0KSxDPTA7MTk+QztDKyspQVtDXT0wO2ZvcihDPTA7TD5DO0MrKylBW2FbQ11dPXAoMyk7Zm9yKHc9cS5sZW5ndGgsbT0wO3c+bTttKyspcVttXT1uZXcgZztpZihrKHEsMTksQSwwKSlyZXR1cm4gaCgpLDE7Zm9yKHo9SStFLG09MCxPPS0xO3o+bTspaWYoTysrLEM9eShxKSwxNj5DKUFbbSsrXT1DO2Vsc2UgaWYoMTY9PT1DKXtpZihDPTMrcCgyKSxtK0M+eilyZXR1cm4gaCgpLDE7Zm9yKHY9bT9BW20tMV06MDtDLS07KUFbbSsrXT12fWVsc2V7aWYoQz0xNz09PUM/MytwKDMpOjExK3AoNyksbStDPnopcmV0dXJuIGgoKSwxO2Zvcig7Qy0tOylBW20rK109MH1mb3Iodz1ULmxlbmd0aCxtPTA7dz5tO20rKylUW21dPW5ldyBnO2lmKGsoVCxJLEEsMCkpcmV0dXJuIGgoKSwxO2Zvcih3PVQubGVuZ3RoLG09MDt3Pm07bSsrKXFbbV09bmV3IGc7Zm9yKGo9W10sbT1JO0EubGVuZ3RoPm07bSsrKWpbbS1JXT1BW21dO2lmKGsocSxFLGosMCkpcmV0dXJuIGgoKSwxO2Zvcig7OylpZihDPXkoVCksQz49MjU2KXtpZihDLT0yNTYsMD09PUMpYnJlYWs7Zm9yKEMtPTEsdz1wKHRbQ10pK25bQ10sQz15KHEpLGlbQ10+OD8oeD1wKDgpLHh8PXAoaVtDXS04KTw8OCk6eD1wKGlbQ10pLHgrPW9bQ107dy0tOyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgZChDKX13aGlsZSghdSk7cmV0dXJuIGgoKSxzKCksMH1mdW5jdGlvbiB2KCl7dmFyIGUscixuLHQsbyxpLGEsYyxzPVtdO3RyeXtpZih6PVtdLEw9ITEsc1swXT1mKCksc1sxXT1mKCksMTIwPT09c1swXSYmMjE4PT09c1sxXSYmKEMoKSxFW0ldPVt6LmpvaW4oIiIpLCJnZW9uZXh0Lmd4dCJdLEkrKyksMzE9PT1zWzBdJiYxMzk9PT1zWzFdJiYoUygpLEVbSV09W3ouam9pbigiIiksImZpbGUiXSxJKyspLDgwPT09c1swXSYmNzU9PT1zWzFdJiYoTD0hMCxzWzJdPWYoKSxzWzNdPWYoKSwzPT09c1syXSYmND09PXNbM10pKXtmb3Ioc1swXT1mKCksc1sxXT1mKCksQT1mKCksQXw9ZigpPDw4LGM9ZigpLGN8PWYoKTw8OCxmKCksZigpLGYoKSxmKCksYT1mKCksYXw9ZigpPDw4LGF8PWYoKTw8MTYsYXw9ZigpPDwyNCxpPWYoKSxpfD1mKCk8PDgsaXw9ZigpPDwxNixpfD1mKCk8PDI0LG89ZigpLG98PWYoKTw8OCxvfD1mKCk8PDE2LG98PWYoKTw8MjQsdD1mKCksdHw9ZigpPDw4LG49ZigpLG58PWYoKTw8OCxlPTAsTj1bXTt0LS07KXI9ZigpLCIvIj09PXJ8IjoiPT09cj9lPTA6dS0xPmUmJihOW2UrK109U3RyaW5nLmZyb21DaGFyQ29kZShyKSk7Zm9yKHd8fCh3PU4pLGU9MDtuPmU7KXI9ZigpLGUrKztqPTAsOD09PWMmJihDKCksRVtJXT1BcnJheSgyKSxFW0ldWzBdPXouam9pbigiIiksRVtJXVsxXT1OLmpvaW4oIiIpLEkrKyksUygpfX1jYXRjaChsKXt0aHJvdyBsfX12YXIgQSxqLHcsVSx4LFMsej1bXSxJPTAsRT1bXSxHPUFycmF5KDMyNzY4KSxKPTAsTD0hMSxPPWMubGVuZ3RoLFg9MCxCPTEsUj0wLFQ9QXJyYXkoMjg4KSxxPUFycmF5KDMyKSxGPTAsUD1udWxsLEg9KEFycmF5KDY0KSxBcnJheSg2NCksMCksTT1BcnJheSgxNyksTj1bXTtNWzBdPTAsUz1mdW5jdGlvbigpe3ZhciBlLHIsbix0LG8saSxhPVtdO2lmKDgmQSYmKGFbMF09ZigpLGFbMV09ZigpLGFbMl09ZigpLGFbM109ZigpLDgwPT09YVswXSYmNzU9PT1hWzFdJiY3PT09YVsyXSYmOD09PWFbM10/KGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQpOmU9YVswXXxhWzFdPDw4fGFbMl08PDE2fGFbM108PDI0LHI9ZigpLHJ8PWYoKTw8OCxyfD1mKCk8PDE2LHJ8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCksTCYmdigpLGFbMF09ZigpLDg9PT1hWzBdKXtpZihBPWYoKSxmKCksZigpLGYoKSxmKCksZigpLHQ9ZigpLDQmQSlmb3IoYVswXT1mKCksYVsyXT1mKCksSD1hWzBdKzI1NiphWzFdLG89MDtIPm87bysrKWYoKTtpZig4JkEpZm9yKG89MCxOPVtdLGk9ZigpO2k7KSgiNyI9PT1pfHwiOiI9PT1pKSYmKG89MCksdS0xPm8mJihOW28rK109aSksaT1mKCk7aWYoMTYmQSlmb3IoaT1mKCk7aTspaT1mKCk7MiZBJiYoZigpLGYoKSksQygpLGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCxMJiZ2KCl9fSxlLlV0aWwuVW56aXAucHJvdG90eXBlLnVuemlwRmlsZT1mdW5jdGlvbihlKXt2YXIgcjtmb3IodGhpcy51bnppcCgpLHI9MDtFLmxlbmd0aD5yO3IrKylpZihFW3JdWzFdPT09ZSlyZXR1cm4gRVtyXVswXTtyZXR1cm4iIn0sZS5VdGlsLlVuemlwLnByb3RvdHlwZS51bnppcD1mdW5jdGlvbigpe3JldHVybiB2KCksRX19LGUuVXRpbH0pLG4oInV0aWxzL2VuY29kaW5nIixbImp4ZyJdLGZ1bmN0aW9uKGUpe3ZhciByPTAsbj1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsOCw4LDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEwLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDQsMywzLDExLDYsNiw2LDUsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDAsMTIsMjQsMzYsNjAsOTYsODQsMTIsMTIsMTIsNDgsNzIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMCwxMiwxMiwxMiwxMiwxMiwwLDEyLDAsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTJdO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuVVRGOD17ZW5jb2RlOmZ1bmN0aW9uKGUpe3ZhciByLG4sdD0iIixvPWUubGVuZ3RoO2lmKGU9ZS5yZXBsYWNlKC9cclxuL2csIlxuIiksImZ1bmN0aW9uIj09dHlwZW9mIHVuZXNjYXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZW5jb2RlVVJJQ29tcG9uZW50KXJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpO2ZvcihyPTA7bz5yO3IrKyluPWUuY2hhckNvZGVBdChyKSwxMjg+bj90Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKG4pOm4+MTI3JiYyMDQ4Pm4/KHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTkyfG4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKToodCs9U3RyaW5nLmZyb21DaGFyQ29kZSgyMjR8bj4+MTIpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKTtyZXR1cm4gdH0sZGVjb2RlOmZ1bmN0aW9uKGUpe3ZhciB0LG8saSxhPTAsdT0wLGM9cixmPVtdLHM9ZS5sZW5ndGgsbD1bXTtmb3IodD0wO3M+dDt0Kyspbz1lLmNoYXJDb2RlQXQodCksaT1uW29dLHU9YyE9PXI/NjMmb3x1PDw2OjI1NT4+aSZvLGM9blsyNTYrYytpXSxjPT09ciYmKHU+NjU1MzU/Zi5wdXNoKDU1MjMyKyh1Pj4xMCksNTYzMjArKDEwMjMmdSkpOmYucHVzaCh1KSxhKyssMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSksZj1bXSkpO3JldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGYpKSxsLmpvaW4oIiIpfSxhc2NpaUNoYXJDb2RlQXQ6ZnVuY3Rpb24oZSxyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7aWYobj4yNTUpc3dpdGNoKG4pe2Nhc2UgODM2NDpuPTEyODticmVhaztjYXNlIDgyMTg6bj0xMzA7YnJlYWs7Y2FzZSA0MDI6bj0xMzE7YnJlYWs7Y2FzZSA4MjIyOm49MTMyO2JyZWFrO2Nhc2UgODIzMDpuPTEzMzticmVhaztjYXNlIDgyMjQ6bj0xMzQ7YnJlYWs7Y2FzZSA4MjI1Om49MTM1O2JyZWFrO2Nhc2UgNzEwOm49MTM2O2JyZWFrO2Nhc2UgODI0MDpuPTEzNzticmVhaztjYXNlIDM1MjpuPTEzODticmVhaztjYXNlIDgyNDk6bj0xMzk7YnJlYWs7Y2FzZSAzMzg6bj0xNDA7YnJlYWs7Y2FzZSAzODE6bj0xNDI7YnJlYWs7Y2FzZSA4MjE2Om49MTQ1O2JyZWFrO2Nhc2UgODIxNzpuPTE0NjticmVhaztjYXNlIDgyMjA6bj0xNDc7YnJlYWs7Y2FzZSA4MjIxOm49MTQ4O2JyZWFrO2Nhc2UgODIyNjpuPTE0OTticmVhaztjYXNlIDgyMTE6bj0xNTA7YnJlYWs7Y2FzZSA4MjEyOm49MTUxO2JyZWFrO2Nhc2UgNzMyOm49MTUyO2JyZWFrO2Nhc2UgODQ4MjpuPTE1MzticmVhaztjYXNlIDM1MzpuPTE1NDticmVhaztjYXNlIDgyNTA6bj0xNTU7YnJlYWs7Y2FzZSAzMzk6bj0xNTY7YnJlYWs7Y2FzZSAzODI6bj0xNTg7YnJlYWs7Y2FzZSAzNzY6bj0xNTk7YnJlYWs7ZGVmYXVsdDp9cmV0dXJuIG59fSxlLlV0aWwuVVRGOH0pLG4oInV0aWxzL2Jhc2U2NCIsWyJqeGciLCJ1dGlscy9lbmNvZGluZyJdLGZ1bmN0aW9uKGUscil7ZnVuY3Rpb24gbihlLHIpe3JldHVybiAyNTUmZS5jaGFyQ29kZUF0KHIpfWZ1bmN0aW9uIHQoZSxyKXt2YXIgbj1vLmluZGV4T2YoZS5jaGFyQXQocikpO2lmKC0xPT09bil0aHJvdyBFcnJvcigiSlNYR3JhcGgvdXRpbHMvYmFzZTY0OiBDYW4ndCBkZWNvZGUgc3RyaW5nIChpbnZhbGlkIGNoYXJhY3RlcikuIik7cmV0dXJuIG59dmFyIG89IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGk9Ij0iO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuQmFzZTY0PXtlbmNvZGU6ZnVuY3Rpb24oZSl7dmFyIHQsYSx1LGMsZixzPVtdO2ZvcihmPXIuZW5jb2RlKGUpLHU9Zi5sZW5ndGgsYz11JTMsdD0wO3UtYz50O3QrPTMpYT1uKGYsdCk8PDE2fG4oZix0KzEpPDw4fG4oZix0KzIpLHMucHVzaChvLmNoYXJBdChhPj4xOCksby5jaGFyQXQoNjMmYT4+MTIpLG8uY2hhckF0KDYzJmE+PjYpLG8uY2hhckF0KDYzJmEpKTtzd2l0Y2goYyl7Y2FzZSAxOmE9bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjIpLG8uY2hhckF0KDYzJmE8PDQpLGksaSk7YnJlYWs7Y2FzZSAyOmE9bihmLHUtMik8PDh8bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjEwKSxvLmNoYXJBdCg2MyZhPj40KSxvLmNoYXJBdCg2MyZhPDwyKSxpKX1yZXR1cm4gcy5qb2luKCIiKX0sZGVjb2RlOmZ1bmN0aW9uKGUsbil7dmFyIG8sYSx1LGMsZixzLGw9W10scD1bXTtpZihvPWUucmVwbGFjZSgvW15BLVphLXowLTlcK1wvPV0vZywiIiksdT1vLmxlbmd0aCwwIT09dSU0KXRocm93IEVycm9yKCJKU1hHcmFwaC91dGlscy9iYXNlNjQ6IENhbid0IGRlY29kZSBzdHJpbmcgKGludmFsaWQgaW5wdXQgbGVuZ3RoKS4iKTtmb3Ioby5jaGFyQXQodS0xKT09PWkmJihjPTEsby5jaGFyQXQodS0yKT09PWkmJihjPTIpLHUtPTQpLGE9MDt1PmE7YSs9NClmPXQobyxhKTw8MTh8dChvLGErMSk8PDEyfHQobyxhKzIpPDw2fHQobyxhKzMpLHAucHVzaChmPj4xNiwyNTUmZj4+OCwyNTUmZiksMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxwKSkscD1bXSk7c3dpdGNoKGMpe2Nhc2UgMTpmPXQobyx1KTw8MTJ8dChvLHUrMSk8PDZ8dChvLHUrMikscC5wdXNoKGY+PjEwLDI1NSZmPj4yKTticmVhaztjYXNlIDI6Zj10KG8sYSk8PDZ8dChvLGErMSkscC5wdXNoKGY+PjQpfXJldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHApKSxzPWwuam9pbigiIiksbiYmKHM9ci5kZWNvZGUocykpLHN9LGRlY29kZUFzQXJyYXk6ZnVuY3Rpb24oZSl7dmFyIHIsbj10aGlzLmRlY29kZShlKSx0PVtdLG89bi5sZW5ndGg7Zm9yKHI9MDtvPnI7cisrKXRbcl09bi5jaGFyQ29kZUF0KHIpO3JldHVybiB0fX0sZS5VdGlsLkJhc2U2NH0pLG4oIi4uL2J1aWxkL2NvbXByZXNzb3IuZGVwcy5qcyIsWyJqeGciLCJ1dGlscy96aXAiLCJ1dGlscy9iYXNlNjQiXSxmdW5jdGlvbihlLHIsbil7cmV0dXJuIGUuZGVjb21wcmVzcz1mdW5jdGlvbihlKXtyZXR1cm4gdW5lc2NhcGUobmV3IHIuVW56aXAobi5kZWNvZGVBc0FycmF5KGUpKS51bnppcCgpWzBdWzBdKX0sZX0pLHdpbmRvdy5KWEc9cigiLi4vYnVpbGQvY29tcHJlc3Nvci5kZXBzLmpzIil9KSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuZmlsZUxvYWRpbmcgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIGZpbGVMb2FkaW5nQ2FsbGJhY2tzID0ge307CiAgICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICBmdW5jdGlvbiBsb2FkS2V5d29yZHNGaWxlKGZpbGVuYW1lLCBjYWxsYmFjaykgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSA9IGNhbGxiYWNrOwogICAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOwogICAgICAgIC8vIHRpbWVzdGFtcCBhcyBhbiBhcmd1bWVudCB0byBwcmV2ZW50IGJyb3dzZXJzIGZyb20gY2FjaGluZyBzY3JpcHRzCiAgICAgICAgLy8gc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg2NjYxOS9ob3ctdG8tZm9yY2UtaWUtdG8tcmVsb2FkLWphdmFzY3JpcHQKICAgICAgICBzY3JpcHQuc3JjID0gZmlsZW5hbWUrJz90aW1lPScrdGltZXN0YW1wOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHBhcmVudCkgewogICAgICAgIHZhciBjYWxsYWJsZUxpc3QgPSBbXTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxhYmxlKSB7CiAgICAgICAgICAgIGlmICghcGFyZW50LmlzQ2hpbGRyZW5Mb2FkZWQpIHsKICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdC5wdXNoKGNhbGxhYmxlKTsKICAgICAgICAgICAgICAgIGlmIChjYWxsYWJsZUxpc3QubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBsb2FkS2V5d29yZHNGaWxlKHBhcmVudC5jaGlsZEZpbGVOYW1lLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYWJsZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdFtpXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbm90aWZ5RmlsZUxvYWRlZChmaWxlbmFtZSkgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSgpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXRDYWxsYmFja0hhbmRsZXJGb3JLZXl3b3JkczogZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHMsCiAgICAgICAgbm90aWZ5OiBub3RpZnlGaWxlTG9hZGVkCiAgICB9Cn0oKSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5tb2RlbCA9IChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBTdWl0ZShkYXRhKSB7CiAgICAgICAgdmFyIHN1aXRlID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAgc3VpdGUuc291cmNlID0gZGF0YS5zb3VyY2U7CiAgICAgICAgc3VpdGUucmVsYXRpdmVTb3VyY2UgPSBkYXRhLnJlbGF0aXZlU291cmNlOwogICAgICAgIHN1aXRlLmZ1bGxOYW1lID0gZGF0YS5wYXJlbnQgPyBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIGRhdGEubmFtZSA6IGRhdGEubmFtZTsKICAgICAgICBzZXRTdGF0cyhzdWl0ZSwgZGF0YS5zdGF0aXN0aWNzKTsKICAgICAgICBzdWl0ZS5tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGE7CiAgICAgICAgc3VpdGUucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdUZXN0Jyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVTdWl0ZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignU3VpdGUnKTsKICAgICAgICBzdWl0ZS5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXTsKICAgICAgICBzdWl0ZS5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSBmdW5jdGlvbiAoY2FsbGFibGUpIHsgY2FsbGFibGUoKTsgfTsKICAgICAgICBzdWl0ZS5tZXNzYWdlID0gZGF0YS5tZXNzYWdlOwogICAgICAgIHN1aXRlLmNoaWxkcmVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc3VpdGUua2V5d29yZHMoKS5jb25jYXQoc3VpdGUudGVzdHMoKSkuY29uY2F0KHN1aXRlLnN1aXRlcygpKTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLnNlYXJjaFRlc3RzID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkgewogICAgICAgICAgICB2YXIgdGVzdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHN1aXRlcyA9IHRoaXMuc3VpdGVzKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc3VpdGVzKQogICAgICAgICAgICAgICAgdGVzdHMgPSB0ZXN0cy5jb25jYXQoc3VpdGVzW2ldLnNlYXJjaFRlc3RzKHByZWRpY2F0ZSkpOwogICAgICAgICAgICByZXR1cm4gdGVzdHMuY29uY2F0KHV0aWwuZmlsdGVyKHRoaXMudGVzdHMoKSwgcHJlZGljYXRlKSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5zZWFyY2hUZXN0c0luU3VpdGUgPSBmdW5jdGlvbiAocGF0dGVybiwgbWF0Y2hlcikgewogICAgICAgICAgICBpZiAoIW1hdGNoZXIpCiAgICAgICAgICAgICAgICBtYXRjaGVyID0gdXRpbC5NYXRjaGVyKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzQW55KFtzdWl0ZS5mdWxsTmFtZSwgc3VpdGUubmFtZV0pKQogICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlLmFsbFRlc3RzKCk7CiAgICAgICAgICAgIHZhciB0ZXN0cyA9IFtdOwogICAgICAgICAgICB2YXIgc3VpdGVzID0gdGhpcy5zdWl0ZXMoKTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzdWl0ZXMpCiAgICAgICAgICAgICAgICB0ZXN0cyA9IHRlc3RzLmNvbmNhdChzdWl0ZXNbaV0uc2VhcmNoVGVzdHNJblN1aXRlKHBhdHRlcm4sIG1hdGNoZXIpKTsKICAgICAgICAgICAgcmV0dXJuIHRlc3RzOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuc2VhcmNoVGVzdHNCeVRhZyA9IGZ1bmN0aW9uICh0YWcpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICBpZiAodGFnLmluZm8gPT0gImNyaXRpY2FsIiB8fCB0YWcuaW5mbyA9PSAibm9uLWNyaXRpY2FsIikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3QudGFncywgdGFnLmxhYmVsKTsKICAgICAgICAgICAgICAgIGlmICh0YWcuY29tYmluZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnUGF0dGVybih0ZXN0LnRhZ3MsIHRhZy5jb21iaW5lZCk7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWcodGVzdC50YWdzLCB0YWcubGFiZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLmZpbmRTdWl0ZUJ5TmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuYWxsVGVzdHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBzdWl0ZS5zZWFyY2hUZXN0cyhmdW5jdGlvbiAodGVzdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuY3JpdGljYWxUZXN0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5pc0NyaXRpY2FsOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRhaW5zVGFnKHRlc3RUYWdzLCB0YWduYW1lKSB7CiAgICAgICAgdGVzdFRhZ3MgPSB1dGlsLm1hcCh0ZXN0VGFncywgdXRpbC5ub3JtYWxpemUpOwogICAgICAgIHJldHVybiB1dGlsLmNvbnRhaW5zKHRlc3RUYWdzLCB1dGlsLm5vcm1hbGl6ZSh0YWduYW1lKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHBhdHRlcm4pIHsKICAgICAgICB2YXIgcGF0dGVybnM7CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignTk9UJykgIT0gLTEpIHsKICAgICAgICAgICAgcGF0dGVybnMgPSBwYXR0ZXJuLnNwbGl0KCdOT1QnKTsKICAgICAgICAgICAgaWYgKCF1dGlsLm5vcm1hbGl6ZShwYXR0ZXJuc1swXSkpCiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5hbGwodXRpbC5tYXAocGF0dGVybnMuc2xpY2UoMSksIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwYXR0ZXJuc1swXSkgJiYKICAgICAgICAgICAgICAgIHV0aWwuYWxsKHV0aWwubWFwKHBhdHRlcm5zLnNsaWNlKDEpLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignT1InKSAhPSAtMSkgewogICAgICAgICAgICBwYXR0ZXJucyA9IHBhdHRlcm4uc3BsaXQoJ09SJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFueSh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ0FORCcpICE9IC0xKSB7CiAgICAgICAgICAgIHBhdHRlcm5zID0gcGF0dGVybi5zcGxpdCgnQU5EJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFsbCh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1dGlsLk1hdGNoZXIocGF0dGVybikubWF0Y2hlc0FueSh0ZXN0VGFncyk7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpIHsKICAgICAgICBpZiAoc3VpdGUuZnVsbE5hbWUgPT0gbmFtZSkKICAgICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgICAgIHZhciBzdWJTdWl0ZXMgPSBzdWl0ZS5zdWl0ZXMoKTsKICAgICAgICBmb3IgKHZhciBpIGluIHN1YlN1aXRlcykgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmaW5kU3VpdGVCeU5hbWUoc3ViU3VpdGVzW2ldLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG1hdGNoKQogICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0YXRzKHN1aXRlLCBzdGF0cykgewogICAgICAgIGZvciAodmFyIG5hbWUgaW4gc3RhdHMpIHsKICAgICAgICAgICAgc3VpdGVbbmFtZV0gPSBzdGF0c1tuYW1lXTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNb2RlbE9iamVjdChkYXRhKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lLAogICAgICAgICAgICBkb2M6IGRhdGEuZG9jLAogICAgICAgICAgICBzdGF0dXM6IGRhdGEuc3RhdHVzLAogICAgICAgICAgICB0aW1lczogZGF0YS50aW1lcywKICAgICAgICAgICAgaWQ6IGRhdGEucGFyZW50ID8gZGF0YS5wYXJlbnQuaWQgKyAnLScgKyBkYXRhLmlkIDogZGF0YS5pZAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUZXN0KGRhdGEpIHsKICAgICAgICB2YXIgdGVzdCA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIHRlc3QuZnVsbE5hbWUgPSBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIHRlc3QubmFtZTsKICAgICAgICB0ZXN0LmZvcm1hdFBhcmVudE5hbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB1dGlsLmZvcm1hdFBhcmVudE5hbWUodGVzdCk7IH07CiAgICAgICAgdGVzdC50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIHRlc3QucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgdGVzdC5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJ107CiAgICAgICAgdGVzdC5pc0NoaWxkcmVuTG9hZGVkID0gZGF0YS5pc0NoaWxkcmVuTG9hZGVkOwogICAgICAgIHRlc3QuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHRlc3QpOwogICAgICAgIHRlc3QuY2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0ZXN0LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5rZXl3b3JkcygpOwogICAgICAgIH07CiAgICAgICAgdGVzdC5pc0NyaXRpY2FsID0gZGF0YS5pc0NyaXRpY2FsOwogICAgICAgIHRlc3QudGFncyA9IGRhdGEudGFnczsKICAgICAgICB0ZXN0Lm1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7CiAgICAgICAgdGVzdC5tYXRjaGVzVGFnUGF0dGVybiA9IGZ1bmN0aW9uIChwYXR0ZXJuKSB7CiAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdC50YWdzLCBwYXR0ZXJuKTsKICAgICAgICB9OwogICAgICAgIHRlc3QubWF0Y2hlc05hbWVQYXR0ZXJuID0gZnVuY3Rpb24gKHBhdHRlcm4pIHsKICAgICAgICAgICAgcmV0dXJuIHV0aWwuTWF0Y2hlcihwYXR0ZXJuKS5tYXRjaGVzQW55KFt0ZXN0Lm5hbWUsIHRlc3QuZnVsbE5hbWVdKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiB0ZXN0OwogICAgfQogICAgZnVuY3Rpb24gS2V5d29yZChkYXRhKSB7CiAgICAgICAgdmFyIGt3ID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAga3cubGlibmFtZSA9IGRhdGEubGlibmFtZTsKICAgICAgICBrdy50eXBlID0gZGF0YS50eXBlOwogICAgICAgIGt3LmFyZ3VtZW50cyA9IGRhdGEuYXJnczsKICAgICAgICBrdy5hc3NpZ24gPSBkYXRhLmFzc2lnbiArIChkYXRhLmFzc2lnbiA/ICcgPScgOiAnJyk7CiAgICAgICAga3cudGFncyA9IGRhdGEudGFnczsKICAgICAgICBrdy50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIGt3LnBvcHVsYXRlTWVzc2FnZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignTWVzc2FnZScpOwogICAgICAgIGt3LnBvcHVsYXRlS2V5d29yZHMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignS2V5d29yZCcpOwogICAgICAgIGt3LmNoaWxkcmVuTmFtZXMgPSBbJ2tleXdvcmQnLCAnbWVzc2FnZSddOwogICAgICAgIGt3LmlzQ2hpbGRyZW5Mb2FkZWQgPSBkYXRhLmlzQ2hpbGRyZW5Mb2FkZWQ7CiAgICAgICAga3cuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKGt3KTsKICAgICAgICBrdy5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGt3LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4ga3cua2V5d29yZHMoKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBrdzsKICAgIH0KICAgIGZ1bmN0aW9uIE1lc3NhZ2UobGV2ZWwsIGRhdGUsIHRleHQsIGxpbmspIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsZXZlbDogbGV2ZWwsCiAgICAgICAgICAgIHRpbWU6IHV0aWwudGltZUZyb21EYXRlKGRhdGUpLAogICAgICAgICAgICBkYXRlOiB1dGlsLmRhdGVGcm9tRGF0ZShkYXRlKSwKICAgICAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICAgICAgbGluazogbGluawogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUaW1lcyh0aW1lZGF0YSkgewogICAgICAgIHZhciBzdGFydCA9IHRpbWVkYXRhWzBdOwogICAgICAgIHZhciBlbmQgPSB0aW1lZGF0YVsxXTsKICAgICAgICB2YXIgZWxhcHNlZCA9IHRpbWVkYXRhWzJdOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGVsYXBzZWRNaWxsaXM6IGVsYXBzZWQsCiAgICAgICAgICAgIGVsYXBzZWRUaW1lOiB1dGlsLmZvcm1hdEVsYXBzZWQoZWxhcHNlZCksCiAgICAgICAgICAgIHN0YXJ0VGltZTogdXRpbC5kYXRlVGltZUZyb21EYXRlKHN0YXJ0KSwKICAgICAgICAgICAgZW5kVGltZTogIHV0aWwuZGF0ZVRpbWVGcm9tRGF0ZShlbmQpCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKG5hbWUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHBvcHVsYXRvcikgewogICAgICAgICAgICBwb3B1bGF0ZUl0ZXJhYmxlKHRoaXMsIG5hbWUsIHBvcHVsYXRvcik7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvcHVsYXRlSXRlcmFibGUob2JqLCBuYW1lLCBwb3B1bGF0b3IpIHsKICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpICsgJ3MnOwogICAgICAgIG9ialtuYW1lXSA9IGNyZWF0ZUdldEFsbEZ1bmN0aW9uKHBvcHVsYXRvci5udW1iZXJPZkl0ZW1zLCBwb3B1bGF0b3IuY3JlYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZXRBbGxGdW5jdGlvbihudW1iZXJPZkVsZW1lbnRzLCBjcmVhdG9yKSB7CiAgICAgICAgdmFyIGNhY2hlZCA9IG51bGw7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGNhY2hlZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FjaGVkID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bWJlck9mRWxlbWVudHMoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVkLnB1c2goY3JlYXRvcihpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBTdWl0ZTogU3VpdGUsCiAgICAgICAgVGVzdDogVGVzdCwKICAgICAgICBLZXl3b3JkOiBLZXl3b3JkLAogICAgICAgIE1lc3NhZ2U6IE1lc3NhZ2UsCiAgICAgICAgVGltZXM6IFRpbWVzLAogICAgICAgIGNvbnRhaW5zVGFnOiBjb250YWluc1RhZywgIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICAgICAgY29udGFpbnNUYWdQYXR0ZXJuOiBjb250YWluc1RhZ1BhdHRlcm4gIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICB9Owp9KCkpOwp3aW5kb3cuc3RhdHMgPSAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gU3RhdGlzdGljcyh0b3RhbEVsZW1zLCB0YWdFbGVtcywgc3VpdGVFbGVtcykgewogICAgICAgIHJldHVybiB7dG90YWw6IHV0aWwubWFwKHRvdGFsRWxlbXMsIHRvdGFsU3RhdEVsZW0pLAogICAgICAgICAgICAgICAgdGFnOiAgIHV0aWwubWFwKHRhZ0VsZW1zLCB0YWdTdGF0RWxlbSksCiAgICAgICAgICAgICAgICBzdWl0ZTogdXRpbC5tYXAoc3VpdGVFbGVtcywgc3VpdGVTdGF0RWxlbSl9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdEVsZW0oc3RhdCkgewogICAgICAgIHN0YXQudG90YWwgPSBzdGF0LnBhc3MgKyBzdGF0LmZhaWw7CiAgICAgICAgdmFyIHBlcmNlbnRzID0gY2FsY3VsYXRlUGVyY2VudHMoc3RhdC50b3RhbCwgc3RhdC5wYXNzLCBzdGF0LmZhaWwpOwogICAgICAgIHN0YXQucGFzc1BlcmNlbnQgPSBwZXJjZW50c1swXTsKICAgICAgICBzdGF0LmZhaWxQZXJjZW50ID0gcGVyY2VudHNbMV07CiAgICAgICAgdmFyIHdpZHRocyA9IGNhbGN1bGF0ZVdpZHRocyhzdGF0LnBhc3NQZXJjZW50LCBzdGF0LmZhaWxQZXJjZW50KTsKICAgICAgICBzdGF0LnBhc3NXaWR0aCA9IHdpZHRoc1swXTsKICAgICAgICBzdGF0LmZhaWxXaWR0aCA9IHdpZHRoc1sxXTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHRvdGFsU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC50eXBlID0gc3RhdC5sYWJlbCA9PSAnQ3JpdGljYWwgVGVzdHMnID8gJ2NyaXRpY2FsJyA6ICdhbGwnOwogICAgICAgIHJldHVybiBzdGF0OwogICAgfQogICAgZnVuY3Rpb24gdGFnU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC5saW5rcyA9IHBhcnNlTGlua3Moc3RhdC5saW5rcyk7CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRFbGVtKGRhdGEpIHsKICAgICAgICB2YXIgc3RhdCA9IHN0YXRFbGVtKGRhdGEpOwogICAgICAgIHN0YXQuZnVsbE5hbWUgPSBzdGF0LmxhYmVsOwogICAgICAgIHN0YXQuZm9ybWF0UGFyZW50TmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWwuZm9ybWF0UGFyZW50TmFtZShzdGF0KTsgfTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTGlua3MobGlua3NEYXRhKSB7CiAgICAgICAgaWYgKCFsaW5rc0RhdGEpCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICByZXR1cm4gdXRpbC5tYXAobGlua3NEYXRhLnNwbGl0KCc6OjonKSwgZnVuY3Rpb24gKGxpbmspIHsKICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGxpbmsuaW5kZXhPZignOicpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt0aXRsZTogbGluay5zbGljZSgwLCBpbmRleCksIHVybDogbGluay5zbGljZShpbmRleCsxKX07CiAgICAgICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gY2FsY3VsYXRlUGVyY2VudHModG90YWwsIHBhc3NlZCwgZmFpbGVkKSB7CiAgICAgICAgaWYgKHRvdGFsID09IDApCiAgICAgICAgICAgIHJldHVybiBbMC4wLCAwLjBdOwogICAgICAgIHZhciBwYXNzID0gMTAwLjAgKiBwYXNzZWQgLyB0b3RhbDsKICAgICAgICB2YXIgZmFpbCA9IDEwMC4wICogZmFpbGVkIC8gdG90YWw7CiAgICAgICAgaWYgKHBhc3MgPiAwICYmIHBhc3MgPCAwLjEpCiAgICAgICAgICAgIHJldHVybiBbMC4xLCA5OS45XTsKICAgICAgICBpZiAoZmFpbCA+IDAgJiYgZmFpbCA8IDAuMSkKICAgICAgICAgICAgcmV0dXJuIFs5OS45LCAwLjFdOwogICAgICAgIHJldHVybiBbTWF0aC5yb3VuZChwYXNzKjEwKS8xMCwgTWF0aC5yb3VuZChmYWlsKjEwKS8xMF07CiAgICB9CiAgICBmdW5jdGlvbiBjYWxjdWxhdGVXaWR0aHMobnVtMSwgbnVtMikgewogICAgICAgIGlmIChudW0xICsgbnVtMiA9PSAwKQogICAgICAgICAgICByZXR1cm4gWzAuMCwgMC4wXTsKICAgICAgICAvLyBNYWtlIHNtYWxsIHBlcmNlbnRhZ2VzIGJldHRlciB2aXNpYmxlCiAgICAgICAgaWYgKG51bTEgPiAwICYmIG51bTEgPCAxKQogICAgICAgICAgICByZXR1cm4gWzEuMCwgOTkuMF07CiAgICAgICAgaWYgKG51bTIgPiAwICYmIG51bTIgPCAxKQogICAgICAgICAgICByZXR1cm4gWzk5LjAsIDEuMF07CiAgICAgICAgLy8gSGFuZGxlIHNpdHVhdGlvbiB3aGVyZSBib3RoIGFyZSByb3VuZGVkIHVwCiAgICAgICAgd2hpbGUgKG51bTEgKyBudW0yID4gMTAwKSB7CiAgICAgICAgICAgIGlmIChudW0xID4gbnVtMikKICAgICAgICAgICAgICAgIG51bTEgLT0gMC4xOwogICAgICAgICAgICBpZiAobnVtMiA+IG51bTEpCiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtudW0xLCBudW0yXTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgU3RhdGlzdGljczogU3RhdGlzdGljcwogICAgfTsKfSgpKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LnV0aWwgPSBmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBtYXAoZWxlbXMsIGZ1bmMpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIHJldFtpXSA9IGZ1bmMoZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gZmlsdGVyKGVsZW1zLCBwcmVkaWNhdGUpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbXNbaV0pKQogICAgICAgICAgICAgICAgcmV0LnB1c2goZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gYWxsKGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmICghZWxlbXNbaV0pCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYW55KGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChlbGVtc1tpXSkKICAgICAgICAgICAgICAgIHJldHVybiBlbGVtc1tpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gY29udGFpbnMoZWxlbXMsIGUpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgaWYgKGVsZW1zW2ldID09IGUpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gbGFzdChpdGVtcykgewogICAgICAgIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGgtMV07CiAgICB9CiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyZsdDsvZywgJzwnKS5yZXBsYWNlKC8mZ3Q7L2csICc+JykucmVwbGFjZSgvJmFtcDsvZywgJyYnKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTsKICAgIH0KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnJykucmVwbGFjZSgvXy9nLCAnJyk7CiAgICB9CiAgICBmdW5jdGlvbiByZWdleHBFc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLVtcXXt9KCkrPyouLFxcXiR8I10vZywgIlxcJCYiKTsKICAgIH0KICAgIGZ1bmN0aW9uIE1hdGNoZXIocGF0dGVybikgewogICAgICAgIHBhdHRlcm4gPSByZWdleHBFc2NhcGUobm9ybWFsaXplKHBhdHRlcm4pKTsKICAgICAgICB2YXIgcmVQYXR0ZXJuID0gJ14nICsgcGF0dGVybi5yZXBsYWNlKC9cXFw/L2csICcuJykucmVwbGFjZSgvXFxcKi9nLCAnW1xcc1xcU10qJykgKyAnJCc7CiAgICAgICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAocmVQYXR0ZXJuKTsKICAgICAgICBmdW5jdGlvbiBtYXRjaGVzKHN0cmluZykgewogICAgICAgICAgICByZXR1cm4gcmVnZXhwLnRlc3Qobm9ybWFsaXplKHN0cmluZykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBtYXRjaGVzOiBtYXRjaGVzLAogICAgICAgICAgICBtYXRjaGVzQW55OiBmdW5jdGlvbiAoc3RyaW5ncykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspCiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMoc3RyaW5nc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdFBhcmVudE5hbWUoaXRlbSkgewogICAgICAgIHZhciBwYXJlbnROYW1lID0gaXRlbS5mdWxsTmFtZS5zbGljZSgwLCBpdGVtLmZ1bGxOYW1lLmxlbmd0aCAtIGl0ZW0ubmFtZS5sZW5ndGgpOwogICAgICAgIHJldHVybiBwYXJlbnROYW1lLnJlcGxhY2UoL1wuL2csICcgLiAnKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRpbWVGcm9tRGF0ZShkYXRlKSB7CiAgICAgICAgaWYgKCFkYXRlKQogICAgICAgICAgICByZXR1cm4gJ04vQSc7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlLmdldFNlY29uZHMoKSwgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlRnJvbURhdGUoZGF0ZSkgewogICAgICAgIGlmICghZGF0ZSkKICAgICAgICAgICAgcmV0dXJuICdOL0EnOwogICAgICAgIHJldHVybiBwYWRUbyhkYXRlLmdldEZ1bGxZZWFyKCksIDQpICsKICAgICAgICAgICAgICAgcGFkVG8oZGF0ZS5nZXRNb250aCgpICsgMSwgMikgKwogICAgICAgICAgICAgICBwYWRUbyhkYXRlLmdldERhdGUoKSwgMik7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlVGltZUZyb21EYXRlKGRhdGUpIHsKICAgICAgICBpZiAoIWRhdGUpCiAgICAgICAgICAgIHJldHVybiAnTi9BJzsKICAgICAgICByZXR1cm4gZGF0ZUZyb21EYXRlKGRhdGUpICsgJyAnICsgdGltZUZyb21EYXRlKGRhdGUpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0VGltZShob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzKSB7CiAgICAgICAgcmV0dXJuIHBhZFRvKGhvdXJzLCAyKSArICc6JyArCiAgICAgICAgICAgICAgIHBhZFRvKG1pbnV0ZXMsIDIpICsgJzonICsKICAgICAgICAgICAgICAgcGFkVG8oc2Vjb25kcywgMikgKyAnLicgKwogICAgICAgICAgICAgICBwYWRUbyhtaWxsaXNlY29uZHMsIDMpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0RWxhcHNlZChlbGFwc2VkKSB7CiAgICAgICAgdmFyIG1pbGxpcyA9IGVsYXBzZWQ7CiAgICAgICAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAoNjAgKiA2MCAqIDEwMDApKTsKICAgICAgICBtaWxsaXMgLT0gaG91cnMgKiA2MCAqIDYwICogMTAwMDsKICAgICAgICB2YXIgbWludXRlcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gKDYwICogMTAwMCkpOwogICAgICAgIG1pbGxpcyAtPSBtaW51dGVzICogNjAgKiAxMDAwOwogICAgICAgIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAxMDAwKTsKICAgICAgICBtaWxsaXMgLT0gc2Vjb25kcyAqIDEwMDA7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpcyk7CiAgICB9CiAgICBmdW5jdGlvbiBwYWRUbyhudW1iZXIsIGxlbikgewogICAgICAgIHZhciBudW1TdHJpbmcgPSBudW1iZXIgKyAiIjsKICAgICAgICB3aGlsZSAobnVtU3RyaW5nLmxlbmd0aCA8IGxlbikgbnVtU3RyaW5nID0gIjAiICsgbnVtU3RyaW5nOwogICAgICAgIHJldHVybiBudW1TdHJpbmc7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lc3RhbXAobWlsbGlzKSB7CiAgICAgICAgLy8gdXNlZCBhbHNvIGJ5IHRvb2xzIHRoYXQgZG8gbm90IHNldCB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMKICAgICAgICB2YXIgYmFzZSA9IHdpbmRvdy5vdXRwdXQgPyB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMgOiAwOwogICAgICAgIHJldHVybiBuZXcgRGF0ZShiYXNlICsgbWlsbGlzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZFN0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7CiAgICAgICAgdmFyIGR0ID0gZGF0ZVRpbWVGcm9tRGF0ZShkYXRlKS5zbGljZSgwLCAxNyk7ICAvLyBkcm9wIG1pbGxpcwogICAgICAgIHZhciBvZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgICAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnOwogICAgICAgIHZhciBoaCA9IE1hdGguZmxvb3IoTWF0aC5hYnMob2Zmc2V0KSAvIDYwKTsKICAgICAgICB2YXIgbW0gPSBNYXRoLmFicyhvZmZzZXQpICUgNjA7CiAgICAgICAgcmV0dXJuIGR0ICsgJyBVVEMnICsgc2lnbiArIHBhZFRvKGhoLCAyKSArICc6JyArIHBhZFRvKG1tLCAyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICBmdW5jdGlvbiB0aW1lU3RyaW5nKHRpbWUsIHNob3J0VW5pdCkgewogICAgICAgICAgICB2YXIgdW5pdCA9IHt5OiAneWVhcicsIGQ6ICdkYXknLCBoOiAnaG91cicsIG06ICdtaW51dGUnLAogICAgICAgICAgICAgICAgICAgICAgICBzOiAnc2Vjb25kJ31bc2hvcnRVbml0XTsKICAgICAgICAgICAgdmFyIGVuZCA9IHRpbWUgPT0gMSA/ICcgJyA6ICdzICc7CiAgICAgICAgICAgIHJldHVybiB0aW1lICsgJyAnICsgdW5pdCArIGVuZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY29tcGVuc2F0ZUxlYXBZZWFycyhkYXlzLCB5ZWFycykgewogICAgICAgICAgICAvLyBOb3QgYSBwZXJmZWN0IGFsZ29yaXRobSBidXQgb3VnaHQgdG8gYmUgZW5vdWdoCiAgICAgICAgICAgIHJldHVybiBkYXlzIC0gTWF0aC5mbG9vcih5ZWFycyAvIDQpOwogICAgICAgIH0KICAgICAgICB2YXIgZ2VuZXJhdGVkID0gTWF0aC5yb3VuZCh0aW1lc3RhbXAgLyAxMDAwKTsKICAgICAgICB2YXIgY3VycmVudCA9IE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTsKICAgICAgICB2YXIgZWxhcHNlZCA9IGN1cnJlbnQgLSBnZW5lcmF0ZWQ7CiAgICAgICAgdmFyIHByZWZpeCA9ICcnOwogICAgICAgIGlmIChlbGFwc2VkIDwgMCkgewogICAgICAgICAgICBwcmVmaXggPSAnLSAnOwogICAgICAgICAgICBlbGFwc2VkID0gTWF0aC5hYnMoZWxhcHNlZCk7CiAgICAgICAgfQogICAgICAgIHZhciBzZWNzICA9IGVsYXBzZWQgJSA2MDsKICAgICAgICB2YXIgbWlucyAgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyA2MCkgJSA2MDsKICAgICAgICB2YXIgaG91cnMgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjApKSAlIDI0OwogICAgICAgIHZhciBkYXlzICA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCkpICUgMzY1OwogICAgICAgIHZhciB5ZWFycyA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCozNjUpKTsKICAgICAgICBpZiAoeWVhcnMpIHsKICAgICAgICAgICAgZGF5cyA9IGNvbXBlbnNhdGVMZWFwWWVhcnMoZGF5cywgeWVhcnMpOwogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyh5ZWFycywgJ3knKSArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKTsKICAgICAgICB9IGVsc2UgaWYgKGRheXMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKSArIHRpbWVTdHJpbmcoaG91cnMsICdoJyk7CiAgICAgICAgfSBlbHNlIGlmIChob3VycykgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhob3VycywgJ2gnKSArIHRpbWVTdHJpbmcobWlucywgJ20nKTsKICAgICAgICB9IGVsc2UgaWYgKG1pbnMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcobWlucywgJ20nKSArIHRpbWVTdHJpbmcoc2VjcywgJ3MnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhzZWNzLCAncycpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmcocXVlcnkpIHsKICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgaWYgKCFxdWVyeSkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB2YXIgcGFyYW1zID0gcXVlcnkuc3BsaXQoJyYnKTsKICAgICAgICB2YXIgcGFydHM7CiAgICAgICAgZnVuY3Rpb24gZGVjb2RlKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpdGVtLnJlcGxhY2UoJysnLCAnICcpKTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcmFtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBwYXJ0cyA9IHBhcmFtc1tpXS5zcGxpdCgnPScpOwogICAgICAgICAgICByZXN1bHRbZGVjb2RlKHBhcnRzLnNoaWZ0KCkpXSA9IGRlY29kZShwYXJ0cy5qb2luKCc9JykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBtYXA6IG1hcCwKICAgICAgICBmaWx0ZXI6IGZpbHRlciwKICAgICAgICBhbGw6IGFsbCwKICAgICAgICBhbnk6IGFueSwKICAgICAgICBjb250YWluczogY29udGFpbnMsCiAgICAgICAgbGFzdDogbGFzdCwKICAgICAgICBlc2NhcGU6IGVzY2FwZSwKICAgICAgICB1bmVzY2FwZTogdW5lc2NhcGUsCiAgICAgICAgbm9ybWFsaXplOiBub3JtYWxpemUsCiAgICAgICAgcmVnZXhwRXNjYXBlOiByZWdleHBFc2NhcGUsCiAgICAgICAgTWF0Y2hlcjogTWF0Y2hlciwKICAgICAgICBmb3JtYXRQYXJlbnROYW1lOiBmb3JtYXRQYXJlbnROYW1lLAogICAgICAgIHRpbWVGcm9tRGF0ZTogdGltZUZyb21EYXRlLAogICAgICAgIGRhdGVGcm9tRGF0ZTogZGF0ZUZyb21EYXRlLAogICAgICAgIGRhdGVUaW1lRnJvbURhdGU6IGRhdGVUaW1lRnJvbURhdGUsCiAgICAgICAgZm9ybWF0RWxhcHNlZDogZm9ybWF0RWxhcHNlZCwKICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRTdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZFN0cmluZywKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZywKICAgICAgICBwYXJzZVF1ZXJ5U3RyaW5nOiBwYXJzZVF1ZXJ5U3RyaW5nCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy50ZXN0ZGF0YSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBlbGVtZW50c0J5SWQgPSB7fTsKICAgIHZhciBpZENvdW50ZXIgPSAwOwogICAgdmFyIF9zdGF0aXN0aWNzID0gbnVsbDsKICAgIHZhciBMRVZFTFMgPSBbJ1RSQUNFJywgJ0RFQlVHJywgJ0lORk8nLCAnV0FSTicsICdFUlJPUicsICdGQUlMJ107CiAgICB2YXIgU1RBVFVTRVMgPSBbJ0ZBSUwnLCAnUEFTUycsICdOT1RfUlVOJ107CiAgICB2YXIgS0VZV09SRFMgPSBbJ0tFWVdPUkQnLCAnU0VUVVAnLCAnVEVBUkRPV04nLCAnRk9SJywgJ1ZBUiddOwogICAgZnVuY3Rpb24gYWRkRWxlbWVudChlbGVtKSB7CiAgICAgICAgaWYgKCFlbGVtLmlkKQogICAgICAgICAgICBlbGVtLmlkID0gdW5pcXVlSWQoKTsKICAgICAgICBlbGVtZW50c0J5SWRbZWxlbS5pZF0gPSBlbGVtOwogICAgICAgIHJldHVybiBlbGVtOwogICAgfQogICAgZnVuY3Rpb24gdW5pcXVlSWQoKSB7CiAgICAgICAgaWRDb3VudGVyKys7CiAgICAgICAgcmV0dXJuICdlbGVtZW50LWlkLScgKyBpZENvdW50ZXI7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lcyhzdGF0cykgewogICAgICAgIHZhciBzdGFydE1pbGxpcyA9IHN0YXRzWzFdOwogICAgICAgIHZhciBlbGFwc2VkID0gc3RhdHNbMl07CiAgICAgICAgaWYgKHN0YXJ0TWlsbGlzID09PSBudWxsKQogICAgICAgICAgICByZXR1cm4gW251bGwsIG51bGwsIGVsYXBzZWRdOwogICAgICAgIHJldHVybiBbdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMpLAogICAgICAgICAgICAgICAgdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMgKyBlbGFwc2VkKSwKICAgICAgICAgICAgICAgIGVsYXBzZWRdOwogICAgfQogICAgZnVuY3Rpb24gbWVzc2FnZShlbGVtZW50LCBzdHJpbmdzKSB7CiAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQobW9kZWwuTWVzc2FnZShMRVZFTFNbZWxlbWVudFsxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnRpbWVzdGFtcChlbGVtZW50WzBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncy5nZXQoZWxlbWVudFszXSkpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlU3RhdHVzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIFNUQVRVU0VTW3N0YXRzWzBdXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoaWxkQ3JlYXRvcihwYXJlbnQsIGNoaWxkVHlwZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoZWxlbSwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQoY2hpbGRUeXBlKHBhcmVudCwgZWxlbSwgc3RyaW5ncywgaW5kZXgpKTsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlS2V5d29yZChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIGt3ID0gbW9kZWwuS2V5d29yZCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICB0eXBlOiBLRVlXT1JEU1tlbGVtZW50WzBdXSwKICAgICAgICAgICAgaWQ6ICdrJyArIChpbmRleCArIDEpLAogICAgICAgICAgICBuYW1lOiBzdHJpbmdzLmdldChlbGVtZW50WzFdKSwKICAgICAgICAgICAgbGlibmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFsyXSksCiAgICAgICAgICAgIHRpbWVvdXQ6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pLAogICAgICAgICAgICBhcmdzOiBzdHJpbmdzLmdldChlbGVtZW50WzVdKSwKICAgICAgICAgICAgYXNzaWduOiBzdHJpbmdzLmdldChlbGVtZW50WzZdKSwKICAgICAgICAgICAgdGFnczogc3RyaW5ncy5nZXQoZWxlbWVudFs3XSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbNF0pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzdGF0dXM6IHBhcnNlU3RhdHVzKGVsZW1lbnRbOF0sIHN0cmluZ3MpLAogICAgICAgICAgICB0aW1lczogbW9kZWwuVGltZXModGltZXMoZWxlbWVudFs4XSkpLAogICAgICAgICAgICBpc0NoaWxkcmVuTG9hZGVkOiB0eXBlb2YoZWxlbWVudFs5XSkgIT09ICdudW1iZXInCiAgICAgICAgfSk7CiAgICAgICAgbGF6eVBvcHVsYXRlS2V5d29yZHNGcm9tRmlsZShrdywgZWxlbWVudFs5XSwgc3RyaW5ncyk7CiAgICAgICAga3cucG9wdWxhdGVNZXNzYWdlcyhQb3B1bGF0b3IoZWxlbWVudFsxMF0sIHN0cmluZ3MsIG1lc3NhZ2UpKTsKICAgICAgICByZXR1cm4ga3c7CiAgICB9CiAgICBmdW5jdGlvbiBsYXp5UG9wdWxhdGVLZXl3b3Jkc0Zyb21GaWxlKHBhcmVudCwgbW9kZWxPckluZGV4LCBzdHJpbmdzKSB7CiAgICAgICAgdmFyIG1vZGVsLCBpbmRleCwgcG9wdWxhdG9yOwogICAgICAgIHZhciBjcmVhdG9yID0gY2hpbGRDcmVhdG9yKHBhcmVudCwgY3JlYXRlS2V5d29yZCk7CiAgICAgICAgaWYgKHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkKSB7CiAgICAgICAgICAgIG1vZGVsID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwb3B1bGF0b3IgPSBQb3B1bGF0b3IobW9kZWwsIHN0cmluZ3MsIGNyZWF0b3IpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluZGV4ID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwYXJlbnQuY2hpbGRGaWxlTmFtZSA9IHdpbmRvdy5zZXR0aW5nc1snc3BsaXRMb2dCYXNlJ10gKyAnLScgKyBpbmRleCArICcuanMnOwogICAgICAgICAgICBwb3B1bGF0b3IgPSBTcGxpdExvZ1BvcHVsYXRvcihpbmRleCwgY3JlYXRvcik7CiAgICAgICAgfQogICAgICAgIHBhcmVudC5wb3B1bGF0ZUtleXdvcmRzKHBvcHVsYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiB0YWdzKHRhZ2xpc3QsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gdXRpbC5tYXAodGFnbGlzdCwgc3RyaW5ncy5nZXQpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlVGVzdChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1c0VsZW1lbnQgPSBlbGVtZW50WzVdOwogICAgICAgIHZhciB0ZXN0ID0gbW9kZWwuVGVzdCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICBpZDogJ3QnICsgKGluZGV4ICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzNdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZW91dDogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIGlzQ3JpdGljYWw6IGVsZW1lbnRbMl0sCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoc3RhdHVzRWxlbWVudCksCiAgICAgICAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBtc2cgPSBjcmVhdGVNZXNzYWdlKHN0YXR1c0VsZW1lbnQsIHN0cmluZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbXNnOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKHN0YXR1c0VsZW1lbnQpKSwKICAgICAgICAgICAgdGFnczogdGFncyhlbGVtZW50WzRdLCBzdHJpbmdzKSwKICAgICAgICAgICAgaXNDaGlsZHJlbkxvYWRlZDogdHlwZW9mKGVsZW1lbnRbNl0pICE9PSAnbnVtYmVyJwogICAgICAgIH0pOwogICAgICAgIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUodGVzdCwgZWxlbWVudFs2XSwgc3RyaW5ncyk7CiAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNZXNzYWdlKHN0YXR1c0VsZW1lbnQsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gc3RhdHVzRWxlbWVudC5sZW5ndGggPT0gNCA/IHN0cmluZ3MuZ2V0KHN0YXR1c0VsZW1lbnRbM10pIDogJyc7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVTdWl0ZShwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1c0VsZW1lbnQgPSBlbGVtZW50WzVdOwogICAgICAgIHZhciBzdWl0ZSA9IG1vZGVsLlN1aXRlKHsKICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgICAgIGlkOiAncycgKyAoKGluZGV4IHx8IDApICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBzb3VyY2U6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMV0pLAogICAgICAgICAgICByZWxhdGl2ZVNvdXJjZTogc3RyaW5ncy5nZXQoZWxlbWVudFsyXSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzdGF0dXM6IHBhcnNlU3RhdHVzKHN0YXR1c0VsZW1lbnQpLAogICAgICAgICAgICBtZXNzYWdlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbXNnID0gY3JlYXRlTWVzc2FnZShzdGF0dXNFbGVtZW50LCBzdHJpbmdzKTsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1zZzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhzdGF0dXNFbGVtZW50KSksCiAgICAgICAgICAgIHN0YXRpc3RpY3M6IHN1aXRlU3RhdHModXRpbC5sYXN0KGVsZW1lbnQpKSwKICAgICAgICAgICAgbWV0YWRhdGE6IHBhcnNlTWV0YWRhdGEoZWxlbWVudFs0XSwgc3RyaW5ncykKICAgICAgICB9KTsKICAgICAgICBzdWl0ZS5wb3B1bGF0ZUtleXdvcmRzKFBvcHVsYXRvcihlbGVtZW50WzhdLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZUtleXdvcmQpKSk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyhQb3B1bGF0b3IoZWxlbWVudFs3XSwgc3RyaW5ncywgY2hpbGRDcmVhdG9yKHN1aXRlLCBjcmVhdGVUZXN0KSkpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlU3VpdGVzKFBvcHVsYXRvcihlbGVtZW50WzZdLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZVN1aXRlKSkpOwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTWV0YWRhdGEoZGF0YSwgc3RyaW5ncykgewogICAgICAgIHZhciBtZXRhZGF0YSA9IFtdOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxkYXRhLmxlbmd0aDsgaSs9MikgewogICAgICAgICAgICBtZXRhZGF0YS5wdXNoKFtzdHJpbmdzLmdldChkYXRhW2ldKSwgc3RyaW5ncy5nZXQoZGF0YVtpKzFdKV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWV0YWRhdGE7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG90YWw6IHN0YXRzWzBdLAogICAgICAgICAgICB0b3RhbFBhc3NlZDogc3RhdHNbMV0sCiAgICAgICAgICAgIHRvdGFsRmFpbGVkOiBzdGF0c1swXSAtIHN0YXRzWzFdLAogICAgICAgICAgICBjcml0aWNhbDogc3RhdHNbMl0sCiAgICAgICAgICAgIGNyaXRpY2FsUGFzc2VkOiBzdGF0c1szXSwKICAgICAgICAgICAgY3JpdGljYWxGYWlsZWQ6IHN0YXRzWzJdIC0gc3RhdHNbM10KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gUG9wdWxhdG9yKGl0ZW1zLCBzdHJpbmdzLCBjcmVhdG9yKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbnVtYmVyT2ZJdGVtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY3JlYXRvcjogZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRvcihpdGVtc1tpbmRleF0sIHN0cmluZ3MsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBTcGxpdExvZ1BvcHVsYXRvcihzdHJ1Y3R1cmVJbmRleCwgY3JlYXRvcikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG51bWJlck9mSXRlbXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3dbJ2tleXdvcmRzJytzdHJ1Y3R1cmVJbmRleF0ubGVuZ3RoOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjcmVhdG9yOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdG9yKHdpbmRvd1sna2V5d29yZHMnK3N0cnVjdHVyZUluZGV4XVtpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3dbJ3N0cmluZ3MnK3N0cnVjdHVyZUluZGV4XSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3VpdGUoKSB7CiAgICAgICAgdmFyIGVsZW0gPSB3aW5kb3cub3V0cHV0LnN1aXRlOwogICAgICAgIGlmIChlbGVtZW50c0J5SWRbZWxlbS5pZF0pCiAgICAgICAgICAgIHJldHVybiBlbGVtOwogICAgICAgIHZhciByb290ID0gYWRkRWxlbWVudChjcmVhdGVTdWl0ZShudWxsLCBlbGVtLCBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKSk7CiAgICAgICAgd2luZG93Lm91dHB1dC5zdWl0ZSA9IHJvb3Q7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kTG9hZGVkKGlkKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnRzQnlJZFtpZF07CiAgICB9CiAgICBmdW5jdGlvbiBlbnN1cmVMb2FkZWQoaWQsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGlkcyA9IGlkLnNwbGl0KCctJyk7CiAgICAgICAgdmFyIHJvb3QgPSBzdWl0ZSgpOwogICAgICAgIGlkcy5zaGlmdCgpOwogICAgICAgIGxvYWRJdGVtcyhpZHMsIHJvb3QsIFtyb290LmlkXSwgY2FsbGJhY2spOwogICAgfQogICAgZnVuY3Rpb24gbG9hZEl0ZW1zKGlkcywgY3VycmVudCwgcmVzdWx0LCBjYWxsYmFjaykgewogICAgICAgIGlmICghaWRzLmxlbmd0aCkgewogICAgICAgICAgICBjYWxsYmFjayhyZXN1bHQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQuY2FsbFdoZW5DaGlsZHJlblJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGlkID0gaWRzLnNoaWZ0KCk7CiAgICAgICAgICAgIHZhciB0eXBlID0gaWRbMF07CiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGlkLnN1YnN0cmluZygxKSkgLSAxOwogICAgICAgICAgICB2YXIgaXRlbSA9IHNlbGVjdEZyb20oY3VycmVudCwgdHlwZSwgaW5kZXgpOwogICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0uaWQpOwogICAgICAgICAgICBlbHNlICAgIC8vIEludmFsaWQgaWQuIFNob3VsZCB0aGlzIGJlIHJlcG9ydGVkIHNvbWV3aGVyZT8KICAgICAgICAgICAgICAgIGlkcyA9IFtdOwogICAgICAgICAgICBsb2FkSXRlbXMoaWRzLCBpdGVtLCByZXN1bHQsIGNhbGxiYWNrKTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlbGVjdEZyb20oZWxlbWVudCwgdHlwZSwgaW5kZXgpIHsKICAgICAgICBpZiAodHlwZSA9PT0gJ2snKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmtleXdvcmRzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3QnKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRlc3RzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnN1aXRlcygpW2luZGV4XTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBlcnJvckl0ZXJhdG9yKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlKHdpbmRvdy5vdXRwdXQuZXJyb3JzLnNoaWZ0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaGFzTmV4dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5vdXRwdXQuZXJyb3JzLmxlbmd0aCA+IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdGlzdGljcygpIHsKICAgICAgICBpZiAoIV9zdGF0aXN0aWNzKSB7CiAgICAgICAgICAgIHZhciBzdGF0RGF0YSA9IHdpbmRvdy5vdXRwdXQuc3RhdHM7CiAgICAgICAgICAgIF9zdGF0aXN0aWNzID0gc3RhdHMuU3RhdGlzdGljcyhzdGF0RGF0YVswXSwgc3RhdERhdGFbMV0sIHN0YXREYXRhWzJdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9zdGF0aXN0aWNzOwogICAgfQogICAgZnVuY3Rpb24gU3RyaW5nU3RvcmUoc3RyaW5ncykgewogICAgICAgIGZ1bmN0aW9uIGdldFRleHQoaWQpIHsKICAgICAgICAgICAgdmFyIHRleHQgPSBzdHJpbmdzW2lkXTsKICAgICAgICAgICAgaWYgKCF0ZXh0KQogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICBpZiAodGV4dFswXSA9PSAnKicpCiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgIHZhciBleHRyYWN0ZWQgPSBleHRyYWN0KHRleHQpOwogICAgICAgICAgICBzdHJpbmdzW2lkXSA9ICcqJyArIGV4dHJhY3RlZDsKICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RlZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZXh0cmFjdCh0ZXh0KSB7CiAgICAgICAgICAgIHZhciBkZWNvZGVkID0gSlhHLlV0aWwuQmFzZTY0LmRlY29kZUFzQXJyYXkodGV4dCk7CiAgICAgICAgICAgIHZhciBleHRyYWN0ZWQgPSAobmV3IEpYRy5VdGlsLlVuemlwKGRlY29kZWQpKS51bnppcCgpWzBdWzBdOwogICAgICAgICAgICByZXR1cm4gSlhHLlV0aWwuVVRGOC5kZWNvZGUoZXh0cmFjdGVkKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZ2V0KGlkKSB7CiAgICAgICAgICAgIGlmIChpZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIHJldHVybiBnZXRUZXh0KGlkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHtnZXQ6IGdldH07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIHN1aXRlOiBzdWl0ZSwKICAgICAgICBlcnJvckl0ZXJhdG9yOiBlcnJvckl0ZXJhdG9yLAogICAgICAgIGZpbmRMb2FkZWQ6IGZpbmRMb2FkZWQsCiAgICAgICAgZW5zdXJlTG9hZGVkOiBlbnN1cmVMb2FkZWQsCiAgICAgICAgc3RhdGlzdGljczogc3RhdGlzdGljcywKICAgICAgICBTdHJpbmdTdG9yZTogU3RyaW5nU3RvcmUsICAvLyBleHBvc2VkIGZvciB0ZXN0cwogICAgICAgIExFVkVMUzogTEVWRUxTCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmZ1bmN0aW9uIHJlbW92ZUphdmFTY3JpcHREaXNhYmxlZFdhcm5pbmcoKSB7CiAgICAvLyBOb3QgdXNpbmcgalF1ZXJ5IGhlcmUgZm9yIG1heGltdW0gc3BlZWQKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqYXZhc2NyaXB0LWRpc2FibGVkJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKfQpmdW5jdGlvbiBhZGRKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKGVycm9yKSB7CiAgICBpZiAod2luZG93LmNvbnNvbGUpCiAgICAgICAgY29uc29sZS5lcnJvcignT3BlbmluZyBmYWlsZWQ6ICcgKyBlcnJvci5uYW1lICsgJzogJyArIGVycm9yLm1lc3NhZ2UpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2phdmFzY3JpcHQtZGlzYWJsZWQnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKfQpmdW5jdGlvbiBpbml0TGF5b3V0KHN1aXRlTmFtZSwgdHlwZSkgewogICAgcGFyc2VUZW1wbGF0ZXMoKTsKICAgIHNldFRpdGxlKHN1aXRlTmFtZSwgdHlwZSk7CiAgICBhZGRIZWFkZXIoKTsKICAgIGFkZFJlcG9ydE9yTG9nTGluayh0eXBlKTsKfQpmdW5jdGlvbiBwYXJzZVRlbXBsYXRlcygpIHsKICAgICQoJ3NjcmlwdFt0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiXScpLm1hcChmdW5jdGlvbiAoaWR4LCBlbGVtKSB7CiAgICAgICAgJC50ZW1wbGF0ZShlbGVtLmlkLCBlbGVtLnRleHQpOwogICAgfSk7Cn0KZnVuY3Rpb24gdGVzdE9yVGFzayh0ZXh0KSB7CiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC97KC4qKX0vLCBmdW5jdGlvbiAobWF0Y2gsIGdyb3VwLCBvZmZzZXQsIHN0cmluZykgewogICAgICAgIGlmICghd2luZG93LnNldHRpbmdzLnJwYSkKICAgICAgICAgICAgcmV0dXJuIGdyb3VwOwogICAgICAgIHJldHVybiB7J1RFU1QnOiAnVEFTSycsICdUZXN0JzogJ1Rhc2snLCAndGVzdCc6ICd0YXNrJ31bZ3JvdXBdOwogICAgfSk7Cn0KZnVuY3Rpb24gc2V0VGl0bGUoc3VpdGVOYW1lLCB0eXBlKSB7CiAgICB2YXIgZ2l2ZW5UaXRsZSA9IHdpbmRvdy5zZXR0aW5ncy50aXRsZTsKICAgIHZhciB0aXRsZSA9IGdpdmVuVGl0bGUgPyBnaXZlblRpdGxlIDogc3VpdGVOYW1lICsgIiAiICsgdHlwZTsKICAgIGRvY3VtZW50LnRpdGxlID0gdXRpbC51bmVzY2FwZSh0aXRsZSk7Cn0KZnVuY3Rpb24gYWRkSGVhZGVyKCkgewogICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwudGltZXN0YW1wKHdpbmRvdy5vdXRwdXQuZ2VuZXJhdGVkKTsKICAgICQudG1wbCgnPGgxPiR7dGl0bGV9PC9oMT4nICsKICAgICAgICAgICAnPGRpdiBpZD0iZ2VuZXJhdGVkIj4nICsKICAgICAgICAgICAgICc8c3Bhbj5HZW5lcmF0ZWQ8YnI+JHtnZW5lcmF0ZWR9PC9zcGFuPjxicj4nICsKICAgICAgICAgICAgICc8c3BhbiBpZD0iZ2VuZXJhdGVkLWFnbyI+JHthZ299IGFnbzwvc3Bhbj4nICsKICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgJzxkaXYgaWQ9InRvcC1yaWdodC1oZWFkZXIiPicgKwogICAgICAgICAgICAgJzxkaXYgaWQ9InJlcG9ydC1vci1sb2ctbGluayI+PGEgaHJlZj0iIyI+PC9hPjwvZGl2PicgKwogICAgICAgICAgICc8L2Rpdj4nLCB7CiAgICAgICAgZ2VuZXJhdGVkOiB1dGlsLmNyZWF0ZUdlbmVyYXRlZFN0cmluZyhnZW5lcmF0ZWQpLAogICAgICAgIGFnbzogdXRpbC5jcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmcoZ2VuZXJhdGVkKSwKICAgICAgICB0aXRsZTogZG9jdW1lbnQudGl0bGUKICAgIH0pLmFwcGVuZFRvKCQoJyNoZWFkZXInKSk7Cn0KZnVuY3Rpb24gYWRkUmVwb3J0T3JMb2dMaW5rKG15VHlwZSkgewogICAgdmFyIHVybDsKICAgIHZhciB0ZXh0OwogICAgdmFyIGNvbnRhaW5lciA9ICQoJyNyZXBvcnQtb3ItbG9nLWxpbmsnKTsKICAgIGlmIChteVR5cGUgPT0gJ1JlcG9ydCcpIHsKICAgICAgICB1cmwgPSB3aW5kb3cuc2V0dGluZ3MubG9nVVJMOwogICAgICAgIHRleHQgPSAnTE9HJzsKICAgIH0gZWxzZSB7CiAgICAgICAgdXJsID0gd2luZG93LnNldHRpbmdzLnJlcG9ydFVSTDsKICAgICAgICB0ZXh0ID0gJ1JFUE9SVCc7CiAgICB9CiAgICBpZiAodXJsKSB7CiAgICAgICAgY29udGFpbmVyLmZpbmQoJ2EnKS5hdHRyKCdocmVmJywgdXJsKTsKICAgICAgICBjb250YWluZXIuZmluZCgnYScpLnRleHQodGV4dCk7CiAgICB9IGVsc2UgewogICAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTsKICAgIH0KfQpmdW5jdGlvbiBhZGRTdGF0aXN0aWNzKCkgewogICAgdmFyIHN0YXRIZWFkZXJzID0KICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+VG90YWw8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5QYXNzPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+RmFpbDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPkVsYXBzZWQ8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+UGFzcyAvIEZhaWw8L3RoPic7CiAgICB2YXIgc3RhdFRhYmxlID0KICAgICAgICAnPGgyPntUZXN0fSBTdGF0aXN0aWNzPC9oMj4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0idG90YWwtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlRvdGFsIFN0YXRpc3RpY3M8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPicgKwogICAgICAgICc8dGFibGUgY2xhc3M9InN0YXRpc3RpY3MiIGlkPSJ0YWctc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgVGFnPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0ic3VpdGUtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgU3VpdGU8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPic7CiAgICAkKHRlc3RPclRhc2soc3RhdFRhYmxlKSkuYXBwZW5kVG8oJyNzdGF0aXN0aWNzLWNvbnRhaW5lcicpOwogICAgdXRpbC5tYXAoWyd0b3RhbCcsICd0YWcnLCAnc3VpdGUnXSwgYWRkU3RhdFRhYmxlKTsKICAgIGFkZFRvb2x0aXBzVG9FbGFwc2VkVGltZXMoKTsKICAgIGVuYWJsZVN0YXRpc3RpY3NTb3J0ZXIoKTsKfQpmdW5jdGlvbiBhZGRUb29sdGlwc1RvRWxhcHNlZFRpbWVzKCkgewogICAgJCgnLnN0YXRzLWNvbC1lbGFwc2VkJykuYXR0cigndGl0bGUnLAogICAgICAgIHRlc3RPclRhc2soJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZXNlIHt0ZXN0fXMuICcpICsKICAgICAgICAnRXhjbHVkZXMgc3VpdGUgc2V0dXBzIGFuZCB0ZWFyZG93bnMuJyk7CiAgICAkKCcjc3VpdGUtc3RhdHMnKS5maW5kKCcuc3RhdHMtY29sLWVsYXBzZWQnKS5hdHRyKCd0aXRsZScsCiAgICAgICAgJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoaXMgc3VpdGUuJyk7Cn0KZnVuY3Rpb24gZW5hYmxlU3RhdGlzdGljc1NvcnRlcigpIHsKICAgICQudGFibGVzb3J0ZXIuYWRkUGFyc2VyKHsKICAgICAgICBpZDogJ3N0YXROYW1lJywKICAgICAgICB0eXBlOiAnbnVtZXJpYycsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZywgdGFibGUsIGNlbGwsIGNlbGxJbmRleCkgewogICAgICAgICAgICAvLyBSb3dzIGhhdmUgY2xhc3MgaW4gZm9ybWF0ICdyb3ctPGluZGV4PicuCiAgICAgICAgICAgIHZhciBpbmRleCA9ICQoY2VsbCkucGFyZW50KCkuYXR0cignY2xhc3MnKS5zdWJzdHJpbmcoNCk7CiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbmRleCk7CiAgICAgICAgfQogICAgfSk7CiAgICAkKCIuc3RhdGlzdGljcyIpLnRhYmxlc29ydGVyKHsKICAgICAgICBzb3J0SW5pdGlhbE9yZGVyOiAnZGVzYycsCiAgICAgICAgaGVhZGVyczogezA6IHtzb3J0ZXI6J3N0YXROYW1lJywgc29ydEluaXRpYWxPcmRlcjogJ2FzYyd9LAogICAgICAgICAgICAgICAgICA1OiB7c29ydGVyOiBmYWxzZX19CiAgICB9KTsKfQpmdW5jdGlvbiBhZGRTdGF0VGFibGUodGFibGVOYW1lKSB7CiAgICB2YXIgc3RhdHMgPSB3aW5kb3cudGVzdGRhdGEuc3RhdGlzdGljcygpW3RhYmxlTmFtZV07CiAgICBpZiAodGFibGVOYW1lID09ICd0YWcnICYmIHN0YXRzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgcmVuZGVyTm9UYWdTdGF0VGFibGUoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmVuZGVyU3RhdFRhYmxlKHRhYmxlTmFtZSwgc3RhdHMpOwogICAgfQp9CmZ1bmN0aW9uIHJlbmRlck5vVGFnU3RhdFRhYmxlKCkgewogICAgJCgnPHRib2R5Pjx0ciBjbGFzcz0icm93LTAiPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5ObyBUYWdzPC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZWxhcHNlZCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZ3JhcGgiPicgKwogICAgICAgICAgJzxkaXYgY2xhc3M9ImVtcHR5LWdyYXBoIj48L2Rpdj4nICsKICAgICAgICAnPC90ZD4nICsKICAgICAgJzwvdHI+PC90Ym9keT4nKS5hcHBlbmRUbygnI3RhZy1zdGF0cycpOwp9CmZ1bmN0aW9uIHJlbmRlclN0YXRUYWJsZSh0YWJsZU5hbWUsIHN0YXRzKSB7CiAgICB2YXIgdGVtcGxhdGUgPSB0YWJsZU5hbWUgKyAnU3RhdGlzdGljc1Jvd1RlbXBsYXRlJzsKICAgIHZhciB0Ym9keSA9ICQoJzx0Ym9keT48L3Rib2R5PicpOwogICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0YXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgJC50bXBsKHRlbXBsYXRlLCBzdGF0c1tpXSwge2luZGV4OiBpfSkuYXBwZW5kVG8odGJvZHkpOwogICAgfQogICAgdGJvZHkuYXBwZW5kVG8oJyMnICsgdGFibGVOYW1lICsgJy1zdGF0cycpOwp9CiQudGVtcGxhdGUoJ3N0YXRDb2x1bW5zVGVtcGxhdGUnLAogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7dG90YWx9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke3Bhc3N9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke2ZhaWx9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1lbGFwc2VkIj4ke2VsYXBzZWR9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+JyArCiAgICAgICd7e2lmIHRvdGFsfX0nICsKICAgICAgJzxkaXYgY2xhc3M9ImdyYXBoIj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0icGFzcy1iYXIiIHN0eWxlPSJ3aWR0aDogJHtwYXNzV2lkdGh9JSIgdGl0bGU9IiR7cGFzc1BlcmNlbnR9JSI+PC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9ImZhaWwtYmFyIiBzdHlsZT0id2lkdGg6ICR7ZmFpbFdpZHRofSUiIHRpdGxlPSIke2ZhaWxQZXJjZW50fSUiPjwvZGl2PicgKwogICAgICAnPC9kaXY+JyArCiAgICAgICd7e2Vsc2V9fScgKwogICAgICAnPGRpdiBjbGFzcz0iZW1wdHktZ3JhcGgiPjwvZGl2PicgKwogICAgICAne3svaWZ9fScgKwogICAgJzwvdGQ+JwopOwokLnRlbXBsYXRlKCdzdWl0ZVN0YXR1c01lc3NhZ2VUZW1wbGF0ZScsCiAgICAnJHtjcml0aWNhbH0gY3JpdGljYWwge3s9IHRlc3RPclRhc2soInt0ZXN0fSIpfX0sICcgKwogICAgJyR7Y3JpdGljYWxQYXNzZWR9IHBhc3NlZCwgJyArCiAgICAnPHNwYW4gY2xhc3M9Int7aWYgY3JpdGljYWxGYWlsZWR9fWZhaWx7e2Vsc2V9fXBhc3N7ey9pZn19Ij4ke2NyaXRpY2FsRmFpbGVkfSBmYWlsZWQ8L3NwYW4+PGJyPicgKwogICAgJyR7dG90YWx9IHt7PSB0ZXN0T3JUYXNrKCJ7dGVzdH0iKX19IHRvdGFsLCAnICsKICAgICcke3RvdGFsUGFzc2VkfSBwYXNzZWQsICcgKwogICAgJzxzcGFuIGNsYXNzPSJ7e2lmIHRvdGFsRmFpbGVkfX1mYWlse3tlbHNlfX1wYXNze3svaWZ9fSI+JHt0b3RhbEZhaWxlZH0gZmFpbGVkPC9zcGFuPicKKTsKLy8gRm9yIGNvbXBsZXRlIGNyb3NzLWJyb3dzZXIgZXhwZXJpZW5jZS4uCi8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX29yZGVyLmh0bWwKZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGV2ZW50KSB7CiAgICB2YXIgZXZlbnQgPSBldmVudCB8fCB3aW5kb3cuZXZlbnQ7CiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKfQo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpzdG9yYWdlID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHByZWZpeCA9ICdyb2JvdC1mcmFtZXdvcmstJzsKICAgIHZhciBzdG9yYWdlOwogICAgZnVuY3Rpb24gaW5pdCh1c2VyKSB7CiAgICAgICAgcHJlZml4ICs9IHVzZXIgKyAnLSc7CiAgICAgICAgc3RvcmFnZSA9IGdldFN0b3JhZ2UoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFN0b3JhZ2UoKSB7CiAgICAgICAgLy8gVXNlIGxvY2FsU3RvcmFnZSBpZiBpdCdzIGFjY2Vzc2libGUsIG5vcm1hbCBvYmplY3Qgb3RoZXJ3aXNlLgogICAgICAgIC8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExMjE0NDA0CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocHJlZml4LCBwcmVmaXgpOwogICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShwcmVmaXgpOwogICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlOwogICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0KG5hbWUsIGRlZmF1bHRWYWx1ZSkgewogICAgICAgIHZhciB2YWx1ZSA9IHN0b3JhZ2VbcHJlZml4ICsgbmFtZV07CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgZnVuY3Rpb24gc2V0KG5hbWUsIHZhbHVlKSB7CiAgICAgICAgc3RvcmFnZVtwcmVmaXggKyBuYW1lXSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIHtpbml0OiBpbml0LCBnZXQ6IGdldCwgc2V0OiBzZXR9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXQgPSB7fTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3VpdGUiXSA9IFsxLDIsMywwLFtdLFsxLDAsNjIwOV0sW10sW1s0LDAsMSwwLFtdLFsxLDEwOCw1NjAyXSxbXV1dLFtdLFsxLDEsMSwxXV07Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN0cmluZ3MiXSA9IFtdOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJzdHJpbmdzIl0gPSB3aW5kb3cub3V0cHV0WyJzdHJpbmdzIl0uY29uY2F0KFsiKiIsIipKdXB5dGVyIiwiKi9ob21lL2RhdGFrdXJyZS9Xb3JrL3JvYm90a2VybmVsL2V4YW1wbGVzIiwiKi4uLy4uLy4uLy4uL2hvbWUvZGF0YWt1cnJlL1dvcmsvcm9ib3RrZXJuZWwvZXhhbXBsZXMiLCIqU2hvdyBQbG9uZSBsb2dvIl0pOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJzdGF0cyJdID0gW1t7ImVsYXBzZWQiOiIwMDowMDowNiIsImZhaWwiOjAsImxhYmVsIjoiQ3JpdGljYWwgVGVzdHMiLCJwYXNzIjoxfSx7ImVsYXBzZWQiOiIwMDowMDowNiIsImZhaWwiOjAsImxhYmVsIjoiQWxsIFRlc3RzIiwicGFzcyI6MX1dLFtdLFt7ImVsYXBzZWQiOiIwMDowMDowNiIsImZhaWwiOjAsImlkIjoiczEiLCJsYWJlbCI6Ikp1cHl0ZXIiLCJuYW1lIjoiSnVweXRlciIsInBhc3MiOjF9XV07Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbImJhc2VNaWxsaXMiXSA9IDE1NDY2Njg3NzkwMzI7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbImdlbmVyYXRlZCJdID0gNjIyMDsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LnNldHRpbmdzID0geyJiYWNrZ3JvdW5kIjp7ImZhaWwiOiIjZjY2Iiwibm9uQ3JpdGljYWxGYWlsIjoiIzllOSIsInBhc3MiOiIjOWU5In0sImxvZ1VSTCI6bnVsbCwicnBhIjpmYWxzZSwidGl0bGUiOiIifTsKPC9zY3JpcHQ+Cjx0aXRsZT48L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8ZGl2IGlkPSJqYXZhc2NyaXB0LWRpc2FibGVkIj4KICA8aDE+T3BlbmluZyBSb2JvdCBGcmFtZXdvcmsgcmVwb3J0IGZhaWxlZDwvaDE+CiAgPHVsPgogICAgPGxpPlZlcmlmeSB0aGF0IHlvdSBoYXZlIDxiPkphdmFTY3JpcHQgZW5hYmxlZDwvYj4gaW4geW91ciBicm93c2VyLjwvbGk+CiAgICA8bGk+TWFrZSBzdXJlIHlvdSBhcmUgdXNpbmcgYSA8Yj5tb2Rlcm4gZW5vdWdoIGJyb3dzZXI8L2I+LiBJZiB1c2luZyBJbnRlcm5ldCBFeHBsb3JlciwgdmVyc2lvbiA4IG9yIG5ld2VyIGlzIHJlcXVpcmVkLjwvbGk+CiAgICA8bGk+Q2hlY2sgYXJlIHRoZXJlIG1lc3NhZ2VzIGluIHlvdXIgYnJvd3NlcidzIDxiPkphdmFTY3JpcHQgZXJyb3IgbG9nPC9iPi4gUGxlYXNlIHJlcG9ydCB0aGUgcHJvYmxlbSBpZiB5b3Ugc3VzcGVjdCB5b3UgaGF2ZSBlbmNvdW50ZXJlZCBhIGJ1Zy48L2xpPgogIDwvdWw+CjwvZGl2Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+cmVtb3ZlSmF2YVNjcmlwdERpc2FibGVkV2FybmluZygpOzwvc2NyaXB0PgoKPGRpdiBpZD0iaGVhZGVyIj48L2Rpdj4KPGRpdiBpZD0ic3RhdGlzdGljcy1jb250YWluZXIiPjwvZGl2Pgo8ZGl2IGlkPSJ0ZXN0LWRldGFpbHMtY29udGFpbmVyIj48L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgewogICAgdHJ5IHsKICAgICAgICB2YXIgdG9wc3VpdGUgPSB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgYWRkSmF2YVNjcmlwdERpc2FibGVkV2FybmluZyhlcnJvcik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgd2luZG93LnByZXZMb2NhdGlvbkhhc2ggPSAnJzsKICAgIHNldEJhY2tncm91bmQodG9wc3VpdGUpOwogICAgaW5pdExheW91dCh0b3BzdWl0ZS5uYW1lLCAnUmVwb3J0Jyk7CiAgICBzdG9yYWdlLmluaXQoJ3JlcG9ydCcpOwogICAgYWRkU3VtbWFyeSh0b3BzdWl0ZSk7CiAgICBhZGRTdGF0aXN0aWNzKCk7CiAgICBhZGREZXRhaWxzKCk7CiAgICB3aW5kb3cub25oYXNoY2hhbmdlID0gc2hvd0RldGFpbHNCeUhhc2g7Cn0pOwoKZnVuY3Rpb24gc2V0QmFja2dyb3VuZCh0b3BzdWl0ZSkgewogICAgdmFyIGNvbG9yOwogICAgaWYgKHRvcHN1aXRlLmNyaXRpY2FsRmFpbGVkKQogICAgICAgIGNvbG9yID0gd2luZG93LnNldHRpbmdzLmJhY2tncm91bmQuZmFpbDsKICAgIGVsc2UgaWYgKHRvcHN1aXRlLnRvdGFsRmFpbGVkKQogICAgICAgIGNvbG9yID0gd2luZG93LnNldHRpbmdzLmJhY2tncm91bmQubm9uQ3JpdGljYWxGYWlsOwogICAgZWxzZQogICAgICAgIGNvbG9yID0gd2luZG93LnNldHRpbmdzLmJhY2tncm91bmQucGFzczsKICAgICQoJ2JvZHknKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCBjb2xvcik7Cn0KCmZ1bmN0aW9uIGFkZFN1bW1hcnkodG9wc3VpdGUpIHsKICAgIHZhciBvcHRzID0ge2xvZ1VSTDogd2luZG93LnNldHRpbmdzLmxvZ1VSTH07CiAgICAkLnRtcGwoJ3N1bW1hcnlUYWJsZVRlbXBsYXRlJywgdG9wc3VpdGUsIG9wdHMpLmluc2VydEFmdGVyKCQoJyNoZWFkZXInKSk7Cn0KCmZ1bmN0aW9uIGFkZERldGFpbHMoKSB7CiAgICBhZGRDdXN0b21Tb3J0ZXJzRm9yRGV0YWlscygpOwogICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoKQogICAgICAgIHNob3dEZXRhaWxzQnlIYXNoKCk7CiAgICBlbHNlCiAgICAgICAgcmVuZGVyVG90YWxTZWxlY3RvcigpOwp9CgpmdW5jdGlvbiBhZGRDdXN0b21Tb3J0ZXJzRm9yRGV0YWlscygpIHsKICAgICQudGFibGVzb3J0ZXIuYWRkUGFyc2VyKHsKICAgICAgICBpZDogJ2NyaXRpY2FsaXR5JywKICAgICAgICB0eXBlOiAnbnVtZXJpYycsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMgPT09ICd5ZXMnID8gMCA6IDE7CiAgICAgICAgfQogICAgfSk7CiAgICAkLnRhYmxlc29ydGVyLmFkZFBhcnNlcih7CiAgICAgICAgaWQ6ICd0aW1lcycsCiAgICAgICAgdHlwZTogJ3RleHQnLAogICAgICAgIGlzOiBmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIGRvIG5vdCBhdXRvLWRldGVjdAogICAgICAgIH0sCiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIHJldHVybiBzLnN1YnN0cmluZygwLCAyMSk7ICAvLyByZXR1cm4gb25seSBzdGFydCB0aW1lCiAgICAgICAgfQogICAgfSk7Cn0KCmZ1bmN0aW9uIHNob3dEZXRhaWxzQnlIYXNoKCkgewogICAgLy8gQ2Fubm90IHVzZSB3aW5kb3cubG9jYXRpb24uaGFzaCBiZWNhdXNlIEZpcmVmb3ggaW5jb3JyZWN0bHkgZGVjb2RlcyBpdDoKICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTcwMzU1Mi9lbmNvZGluZy1vZi13aW5kb3ctbG9jYXRpb24taGFzaAogICAgdmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnIycpLnNsaWNlKDEpLmpvaW4oJyMnKTsKICAgIGlmICghaGFzaCB8fCBoYXNoID09IHdpbmRvdy5wcmV2TG9jYXRpb25IYXNoKQogICAgICAgIHJldHVybjsKICAgIHZhciBwYXJ0cyA9IGhhc2guc3BsaXQoJz8nKTsKICAgIHZhciBuYW1lID0gcGFydHMuc2hpZnQoKTsKICAgIHZhciBxdWVyeSA9IHBhcnRzLmpvaW4oJz8nKTsKICAgIGlmIChuYW1lID09ICdzZWFyY2gnKSB7CiAgICAgICAgdmFyIHBhcmFtcyA9IHV0aWwucGFyc2VRdWVyeVN0cmluZyhxdWVyeSk7CiAgICAgICAgc2VhcmNoRXhlY3V0ZWQocGFyYW1zLnN1aXRlIHx8ICcnLCBwYXJhbXMudGVzdCB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuaW5jbHVkZSB8fCAnJywgcGFyYW1zLmV4Y2x1ZGUgfHwgJycpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHF1ZXJ5ID0gZGVjb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KTsKICAgIHZhciBhY3Rpb24gPSB7J3RvdGFscyc6IHRvdGFsRGV0YWlsU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICd0YWdzJzogICB0YWdEZXRhaWxTZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgJ3N1aXRlcyc6IHN1aXRlRGV0YWlsU2VsZWN0ZWR9W25hbWVdOwogICAgaWYgKGFjdGlvbikKICAgICAgICBhY3Rpb24ocXVlcnkpOwp9CgpmdW5jdGlvbiB0b3RhbERldGFpbFNlbGVjdGVkKG5hbWUpIHsKICAgIHJlbmRlclRvdGFsU2VsZWN0b3IobmFtZSk7CiAgICBpZiAobmFtZSkgewogICAgICAgIHJlbmRlclRvdGFsRGV0YWlscyhuYW1lKTsKICAgICAgICB2YXIgdGl0bGUgPSBuYW1lID09ICdjcml0aWNhbCcgPyAnQ3JpdGljYWwge1Rlc3R9cycgOiAnQWxsIHtUZXN0fXMnCiAgICAgICAgdXBkYXRlUHJpbnRTZWxlY3Rvcih0ZXN0T3JUYXNrKHRpdGxlKSk7CiAgICB9CiAgICBzY3JvbGxUb1NlbGVjdG9yKCd0b3RhbHMnLCBuYW1lKTsKfQoKZnVuY3Rpb24gcmVuZGVyVG90YWxTZWxlY3RvcihuYW1lKSB7CiAgICB2YXIgYXJncyA9IHtsaW5rVGFyZ2V0OiAobmFtZSkgPyAndG90YWxzPycrbmFtZSA6ICd0b3RhbHMnLAogICAgICAgICAgICAgICAgdG90YWxUYWJTdGF0dXM6ICdkZXRhaWwtdGFiLXNlbGVjdGVkJ307CiAgICByZW5kZXJTZWxlY3RvcihhcmdzLCAndG90YWxEZXRhaWxzU2VsZWN0b3JUZW1wbGF0ZScsIHtzZWxlY3RlZDogbmFtZX0pOwp9CgpmdW5jdGlvbiByZW5kZXJUb3RhbERldGFpbHMobmFtZSkgewogICAgdmFyIGluZGV4ID0gKG5hbWUgPT0gJ2NyaXRpY2FsJykgPyAwIDogMTsKICAgIHZhciBzdGF0ID0gd2luZG93LnRlc3RkYXRhLnN0YXRpc3RpY3MoKS50b3RhbFtpbmRleF07CiAgICB2YXIgdGVzdHMgPSBnZXRUb3RhbFRlc3RzKG5hbWUpOwogICAgc3RhdC50b3RhbFRpbWUgPSBjYWxjdWxhdGVUb3RhbFRpbWUodGVzdHMpOwogICAgJC50bXBsKCd0YWdPclRvdGFsRGV0YWlsc1RlbXBsYXRlJywgc3RhdCkuYXBwZW5kVG8oJyNkZXRhaWxzLWhlYWRlcicpOwogICAgZHJhd1Rlc3REZXRhaWxzVGFibGUodGVzdHMsIHRydWUpOwp9CgpmdW5jdGlvbiB1cGRhdGVQcmludFNlbGVjdG9yKG5hbWUsIGluZm8pIHsKICAgIGlmIChpbmZvKQogICAgICAgIG5hbWUgKz0gJyAoJyArIGluZm8gKyAnKSc7CiAgICAkKCcjcHJpbnQtc2VsZWN0b3InKS5odG1sKG5hbWUpOwp9CgpmdW5jdGlvbiB0YWdEZXRhaWxTZWxlY3RlZChuYW1lKSB7CiAgICByZW5kZXJUYWdTZWxlY3RvcihuYW1lKTsKICAgIGlmIChuYW1lKSB7CiAgICAgICAgdmFyIHRhZyA9IGZpbmRUYWcobmFtZSk7CiAgICAgICAgaWYgKHRhZykgewogICAgICAgICAgICByZW5kZXJUYWdEZXRhaWxzKHRhZyk7CiAgICAgICAgICAgIHVwZGF0ZVByaW50U2VsZWN0b3IobmFtZSwgdGFnLmluZm8pOwogICAgICAgIH0KICAgIH0KICAgIHNjcm9sbFRvU2VsZWN0b3IoJ3RhZ3MnLCBuYW1lKTsKfQoKZnVuY3Rpb24gZmluZFRhZyhuYW1lKSB7CiAgICB2YXIgdGFncyA9IHdpbmRvdy50ZXN0ZGF0YS5zdGF0aXN0aWNzKCkudGFnOwogICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRhZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBpZiAodGFnc1tpXS5sYWJlbCA9PSBuYW1lKQogICAgICAgICAgICByZXR1cm4gdGFnc1tpXTsKICAgIH0KICAgIHJldHVybiBudWxsOwp9CgpmdW5jdGlvbiByZW5kZXJUYWdTZWxlY3RvcihuYW1lKSB7CiAgICB2YXIgYXJncyA9IHtsaW5rVGFyZ2V0OiAobmFtZSkgPyAndGFncz8nK25hbWUgOiAndGFncycsCiAgICAgICAgICAgICAgICB0YWdUYWJTdGF0dXM6ICdkZXRhaWwtdGFiLXNlbGVjdGVkJ307CiAgICB2YXIgc3RhdHMgPSB7dGFnczogd2luZG93LnRlc3RkYXRhLnN0YXRpc3RpY3MoKS50YWcsIHNlbGVjdGVkOiBuYW1lfTsKICAgIHJlbmRlclNlbGVjdG9yKGFyZ3MsICd0YWdEZXRhaWxzU2VsZWN0b3JUZW1wbGF0ZScsIHN0YXRzKTsKfQoKZnVuY3Rpb24gcmVuZGVyVGFnRGV0YWlscyh0YWcpIHsKICAgIHZhciB0ZXN0cyA9IGdldFRlc3RzSGF2aW5nVGFnKHRhZyk7CiAgICB0YWcudG90YWxUaW1lID0gY2FsY3VsYXRlVG90YWxUaW1lKHRlc3RzKTsKICAgICQudG1wbCgndGFnT3JUb3RhbERldGFpbHNUZW1wbGF0ZScsIHRhZykuYXBwZW5kVG8oJyNkZXRhaWxzLWhlYWRlcicpOwogICAgZHJhd1Rlc3REZXRhaWxzVGFibGUodGVzdHMsIHRydWUpOwp9CgpmdW5jdGlvbiBzdWl0ZURldGFpbFNlbGVjdGVkKGlkKSB7CiAgICByZW5kZXJTdWl0ZVNlbGVjdG9yKGlkKTsKICAgIGlmIChpZCkKICAgICAgICByZW5kZXJTdWl0ZURldGFpbHMoaWQpOwogICAgc2Nyb2xsVG9TZWxlY3Rvcignc3VpdGVzJywgaWQpOwp9CgpmdW5jdGlvbiByZW5kZXJTdWl0ZVNlbGVjdG9yKGlkKSB7CiAgICB2YXIgYXJncyA9IHtsaW5rVGFyZ2V0OiAoaWQpID8gJ3N1aXRlcz8nK2lkIDogJ3N1aXRlcycsCiAgICAgICAgICAgICAgICBzdWl0ZVRhYlN0YXR1czogJ2RldGFpbC10YWItc2VsZWN0ZWQnfTsKICAgIHZhciBzdGF0cyA9IHtzdWl0ZXM6IHdpbmRvdy50ZXN0ZGF0YS5zdGF0aXN0aWNzKCkuc3VpdGUsCiAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGlkfTsKICAgIHJlbmRlclNlbGVjdG9yKGFyZ3MsICdzdWl0ZURldGFpbHNTZWxlY3RvclRlbXBsYXRlJywgc3RhdHMpOwp9CgpmdW5jdGlvbiByZW5kZXJTdWl0ZURldGFpbHMoaWQpIHsKICAgIHdpbmRvdy50ZXN0ZGF0YS5lbnN1cmVMb2FkZWQoaWQsIGZ1bmN0aW9uIChpZHMpIHsKICAgICAgICB2YXIgc3VpdGUgPSB3aW5kb3cudGVzdGRhdGEuZmluZExvYWRlZChpZCk7CiAgICAgICAgdmFyIG9wdHMgPSB7bG9nVVJMOiB3aW5kb3cuc2V0dGluZ3MubG9nVVJMfTsKICAgICAgICAkLnRtcGwoJ3N1aXRlRGV0YWlsc1RlbXBsYXRlJywgc3VpdGUsIG9wdHMpLmFwcGVuZFRvKCcjZGV0YWlscy1oZWFkZXInKTsKICAgICAgICBkcmF3VGVzdERldGFpbHNUYWJsZShzdWl0ZS5hbGxUZXN0cygpLCBmYWxzZSk7CiAgICAgICAgdXBkYXRlUHJpbnRTZWxlY3RvcihzdWl0ZS5mdWxsTmFtZSk7CiAgICB9KTsKfQoKZnVuY3Rpb24gc2VhcmNoRXhlY3V0ZWQoc3VpdGUsIHRlc3QsIGluY2x1ZGUsIGV4Y2x1ZGUpIHsKICAgIHJlbmRlclNlYXJjaFNlbGVjdG9yKHN1aXRlLCB0ZXN0LCBpbmNsdWRlLCBleGNsdWRlKTsKICAgIGlmIChzdWl0ZSB8fCB0ZXN0IHx8IGluY2x1ZGUgfHwgZXhjbHVkZSkgewogICAgICAgIHJlbmRlclNlYXJjaERldGFpbHMoc3VpdGUsIHRlc3QsIGluY2x1ZGUsIGV4Y2x1ZGUpOwogICAgICAgIHNjcm9sbFRvU2VsZWN0b3IoJ3NlYXJjaCcgKwogICAgICAgICAgICAgICAgICAgICAgICAgJz9zdWl0ZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHN1aXRlKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAnJnRlc3Q9JyArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXN0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAnJmluY2x1ZGU9JyArIGVuY29kZVVSSUNvbXBvbmVudChpbmNsdWRlKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAnJmV4Y2x1ZGU9JyArIGVuY29kZVVSSUNvbXBvbmVudChleGNsdWRlKSk7CiAgICB9IGVsc2UgewogICAgICAgIHNjcm9sbFRvU2VsZWN0b3IoJ3NlYXJjaCcpOwogICAgfQp9CgpmdW5jdGlvbiByZW5kZXJTZWFyY2hTZWxlY3RvcihzdWl0ZSwgdGVzdCwgaW5jbHVkZSwgZXhjbHVkZSkgewogICAgdmFyIGFyZ3MgPSB7bGlua1RhcmdldDogKHN1aXRlIHx8IHRlc3QgfHwgaW5jbHVkZSB8fCBleGNsdWRlKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3NlYXJjaD9zdWl0ZT0nICsgc3VpdGUgKyAnJnRlc3Q9JyArIHRlc3QgKyAnJmluY2x1ZGU9JyArIGluY2x1ZGUgKyAnJmV4Y2x1ZGU9JyArIGV4Y2x1ZGUpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWFyY2gnLAogICAgICAgICAgICAgICAgc2VhcmNoVGFiU3RhdHVzOiAnZGV0YWlsLXRhYi1zZWxlY3RlZCd9OwogICAgdmFyIHNlYXJjaCA9IHtzdWl0ZTogc3VpdGUsIHRlc3Q6IHRlc3QsIGluY2x1ZGU6IGluY2x1ZGUsIGV4Y2x1ZGU6IGV4Y2x1ZGV9OwogICAgcmVuZGVyU2VsZWN0b3IoYXJncywgJ3NlYXJjaFNlbGVjdG9yVGVtcGxhdGUnLCBzZWFyY2gpOwp9CgpmdW5jdGlvbiByZW5kZXJTZWFyY2hEZXRhaWxzKHN1aXRlLCB0ZXN0LCBpbmNsdWRlLCBleGNsdWRlKSB7CiAgICB2YXIgdGVzdHMgPSBzZWFyY2hUZXN0cyh1dGlsLmVzY2FwZShzdWl0ZSksIHV0aWwuZXNjYXBlKHRlc3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5lc2NhcGUoaW5jbHVkZSksIHV0aWwuZXNjYXBlKGV4Y2x1ZGUpKTsKICAgIHZhciBwYXNzZWQgPSBjYWxjdWxhdGVQYXNzZWQodGVzdHMpOwogICAgdmFyIHN0YXRzID0ge3RvdGFsOiB0ZXN0cy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgcGFzczogcGFzc2VkLAogICAgICAgICAgICAgICAgIGZhaWw6IHRlc3RzLmxlbmd0aCAtIHBhc3NlZCwKICAgICAgICAgICAgICAgICB0b3RhbFRpbWU6IGNhbGN1bGF0ZVRvdGFsVGltZSh0ZXN0cyl9OwogICAgJC50bXBsKCd0YWdPclRvdGFsRGV0YWlsc1RlbXBsYXRlJywgc3RhdHMpLmFwcGVuZFRvKCcjZGV0YWlscy1oZWFkZXInKTsKICAgIGRyYXdUZXN0RGV0YWlsc1RhYmxlKHRlc3RzLCB0cnVlKTsKfQoKZnVuY3Rpb24gc2VhcmNoVGVzdHMoc3VpdGVQYXR0ZXJuLCB0ZXN0UGF0dGVybiwgaW5jbHVkZVBhdHRlcm4sIGV4Y2x1ZGVQYXR0ZXJuKSB7CiAgICB2YXIgdGVzdHM7CiAgICBpZiAoc3VpdGVQYXR0ZXJuKQogICAgICAgIHRlc3RzID0gd2luZG93LnRlc3RkYXRhLnN1aXRlKCkuc2VhcmNoVGVzdHNJblN1aXRlKHN1aXRlUGF0dGVybik7CiAgICBlbHNlCiAgICAgICAgdGVzdHMgPSB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKS5hbGxUZXN0cygpOwogICAgcmV0dXJuIHV0aWwuZmlsdGVyKHRlc3RzLCBmdW5jdGlvbiAodGVzdCkgewogICAgICAgIGlmICh0ZXN0UGF0dGVybiAmJiAhdGVzdC5tYXRjaGVzTmFtZVBhdHRlcm4odGVzdFBhdHRlcm4pKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKGluY2x1ZGVQYXR0ZXJuICYmICF0ZXN0Lm1hdGNoZXNUYWdQYXR0ZXJuKGluY2x1ZGVQYXR0ZXJuKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiAhKGV4Y2x1ZGVQYXR0ZXJuICYmIHRlc3QubWF0Y2hlc1RhZ1BhdHRlcm4oZXhjbHVkZVBhdHRlcm4pKTsKICAgIH0pOwp9CgpmdW5jdGlvbiBzY3JvbGxUb1NlbGVjdG9yKGJhc2UsIHF1ZXJ5KSB7CiAgICAkKCcjdGVzdC1kZXRhaWxzLWNvbnRhaW5lcicpLmNzcygnbWluLWhlaWdodCcsICQod2luZG93KS5oZWlnaHQoKSk7CiAgICB2YXIgYW5jaG9yID0gcXVlcnkgPyBiYXNlICsgJz8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KSA6IGJhc2U7CiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9ICcnOwogICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSB3aW5kb3cucHJldkxvY2F0aW9uSGFzaCA9IGFuY2hvcjsKfQoKZnVuY3Rpb24gcmVuZGVyU2VsZWN0b3IoYXJncywgdGVtcGxhdGUsIHN0YXRzKSB7CiAgICB3aW5kb3cuZWxlbWVudHNUb1JlbmRlciA9IFtdOwogICAgdmFyIGNvbnRhaW5lciA9ICQoJyN0ZXN0LWRldGFpbHMtY29udGFpbmVyJyk7CiAgICBjb250YWluZXIuZW1wdHkoKTsKICAgICQudG1wbCgnZGV0YWlsc0hlYWRlclRlbXBsYXRlJywgYXJncykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICQudG1wbCh0ZW1wbGF0ZSwgc3RhdHMpLmFwcGVuZFRvKGNvbnRhaW5lcik7Cn0KCmZ1bmN0aW9uIGRyYXdUZXN0RGV0YWlsc1RhYmxlKHRlc3RzLCBzb3J0QnlTdGF0dXMpIHsKICAgIGlmICghdGVzdHMubGVuZ3RoKQogICAgICAgIHJldHVybjsKICAgIHJlbmRlclRlc3REZXRhaWxzSGVhZGVyKCk7CiAgICB3aW5kb3cuZWxlbWVudHNUb1JlbmRlciA9IHRlc3RzOwogICAgdmFyIHRhcmdldCA9ICQoJyN0ZXN0LWRldGFpbHMnKS5maW5kKCd0Ym9keScpOwogICAgcmVuZGVyVGVzdERldGFpbHMoc29ydEJ5U3RhdHVzLCB0YXJnZXQpOwp9CgpmdW5jdGlvbiByZW5kZXJUZXN0RGV0YWlsc0hlYWRlcigpIHsKICAgIHZhciBoZWFkZXIgPSAkLnRtcGwoJ3Rlc3REZXRhaWxzVGFibGVUZW1wbGF0ZScpOwogICAgaGlkZUhpZGRlbkRldGFpbHNDb2x1bW5zKGhlYWRlcik7CiAgICBoZWFkZXIuYXBwZW5kVG8oJyN0ZXN0LWRldGFpbHMtY29udGFpbmVyJyk7Cn0KCmZ1bmN0aW9uIHNvcnRCeVN0YXR1cyh0MSwgdDIpIHsKICAgIGlmICh0MS5zdGF0dXMgIT0gdDIuc3RhdHVzKQogICAgICAgIHJldHVybiB0MS5zdGF0dXMgPT0gJ0ZBSUwnID8gLTEgOiAxOwogICAgaWYgKHQxLmlzQ3JpdGljYWwgIT0gdDIuaXNDcml0aWNhbCkKICAgICAgICByZXR1cm4gdDEuaXNDcml0aWNhbCA/IC0xIDogMTsKICAgIHJldHVybiB0MS5mdWxsTmFtZSA8IHQyLmZ1bGxOYW1lID8gLTEgOiAxOwp9CgpmdW5jdGlvbiBnZXRUZXN0c0hhdmluZ1RhZyh0YWcpIHsKICAgIHJldHVybiB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKS5zZWFyY2hUZXN0c0J5VGFnKHRhZykuc29ydChzb3J0QnlTdGF0dXMpOwp9CgpmdW5jdGlvbiBnZXRUb3RhbFRlc3RzKG5hbWUpIHsKICAgIGlmIChuYW1lID09ICdjcml0aWNhbCcpCiAgICAgICAgcmV0dXJuIHdpbmRvdy50ZXN0ZGF0YS5zdWl0ZSgpLmNyaXRpY2FsVGVzdHMoKS5zb3J0KHNvcnRCeVN0YXR1cyk7CiAgICByZXR1cm4gd2luZG93LnRlc3RkYXRhLnN1aXRlKCkuYWxsVGVzdHMoKS5zb3J0KHNvcnRCeVN0YXR1cyk7Cn0KCmZ1bmN0aW9uIGNhbGN1bGF0ZVRvdGFsVGltZSh0ZXN0cykgewogICAgdmFyIHRvdGFsID0gMDsKICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0ZXN0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKICAgICAgICB0b3RhbCArPSB0ZXN0c1tpXS50aW1lcy5lbGFwc2VkTWlsbGlzOwogICAgcmV0dXJuIHV0aWwuZm9ybWF0RWxhcHNlZCh0b3RhbCk7Cn0KCmZ1bmN0aW9uIGNhbGN1bGF0ZVBhc3NlZCh0ZXN0cykgewogICAgdmFyIHBhc3NlZCA9IHV0aWwuZmlsdGVyKHRlc3RzLCBmdW5jdGlvbiAodGVzdCkgewogICAgICAgIHJldHVybiB0ZXN0LnN0YXR1cyA9PSAnUEFTUyc7CiAgICB9KTsKICAgIHJldHVybiBwYXNzZWQubGVuZ3RoOwp9CgpmdW5jdGlvbiByZW5kZXJUZXN0RGV0YWlscyhzb3J0QnlTdGF0dXMsIHRhcmdldCkgewogICAgaWYgKCF3aW5kb3cuZWxlbWVudHNUb1JlbmRlci5sZW5ndGgpCiAgICAgICAgcmV0dXJuOwogICAgdmFyIHRlc3RzID0gcG9wVXBUbyh3aW5kb3cuZWxlbWVudHNUb1JlbmRlciwgNTApOwogICAgcmVuZGVyVGVzdERldGFpbHNSb3dzKHRlc3RzLCB0YXJnZXQpOwogICAgaWYgKHdpbmRvdy5lbGVtZW50c1RvUmVuZGVyLmxlbmd0aCkKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtyZW5kZXJUZXN0RGV0YWlscyhzb3J0QnlTdGF0dXMsIHRhcmdldCk7fSwgMCk7CiAgICBlbHNlCiAgICAgICAgY29uZmlndXJlVGFibGVTb3J0ZXIoc29ydEJ5U3RhdHVzKTsKfQoKZnVuY3Rpb24gcmVuZGVyVGVzdERldGFpbHNSb3dzKHRlc3RzLCB0YXJnZXQpIHsKICAgIHZhciByb3dzID0gJC50bXBsKCd0ZXN0RGV0YWlsc1RhYmxlUm93VGVtcGxhdGUnLCB0ZXN0cywKICAgICAgICAgICAgICAgICAgICAgIHtsb2dVUkw6IHdpbmRvdy5zZXR0aW5ncy5sb2dVUkx9KTsKICAgIHJvd3MuZmluZCgnYScpLmNsaWNrKHN0b3BQcm9wYWdhdGlvbik7CiAgICBoaWRlSGlkZGVuRGV0YWlsc0NvbHVtbnMocm93cyk7CiAgICByb3dzLmFwcGVuZFRvKHRhcmdldCk7Cn0KCmZ1bmN0aW9uIGNvbmZpZ3VyZVRhYmxlU29ydGVyKHNvcnRCeVN0YXR1cykgewogICAgdmFyIGNvbmZpZyA9IHtoZWFkZXJzOiB7Mzoge3NvcnRlcjogJ2NyaXRpY2FsaXR5J30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OiB7c29ydEluaXRpYWxPcmRlcjogJ2Rlc2MnfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6IHtzb3J0ZXI6ICd0aW1lcyd9fSwKICAgICAgICAgICAgICAgICAgc2VsZWN0b3JTb3J0OiAnLmRldGFpbHMtY29sLWhlYWRlcid9OwogICAgaWYgKHNvcnRCeVN0YXR1cykKICAgICAgICBjb25maWdbJ3NvcnRMaXN0J10gPSBbWzQsIDBdLCBbMywgMF1dOwogICAgJCgnI3Rlc3QtZGV0YWlscycpLnRhYmxlc29ydGVyKGNvbmZpZyk7Cn0KCmZ1bmN0aW9uIHBvcFVwVG8obGlzdCwgdXBUbykgewogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgd2hpbGUgKGxpc3QubGVuZ3RoID4gMCAmJiByZXN1bHQubGVuZ3RoIDwgdXBUbykKICAgICAgICByZXN1bHQucHVzaChsaXN0LnNoaWZ0KCkpOwogICAgcmV0dXJuIHJlc3VsdDsKfQoKZnVuY3Rpb24gdG9nZ2xlRGV0YWlsc0NvbHVtbihuYW1lKSB7CiAgICB2YXIgY29sdW1uID0gJCgnLmRldGFpbHMtY29sLScgKyBuYW1lKTsKICAgIGNvbHVtbi50b2dnbGVDbGFzcygnaGlkZGVuJyk7CiAgICB2YXIgaGlkZGVuID0gY29sdW1uLmhhc0NsYXNzKCdoaWRkZW4nKTsKICAgIHN0b3JhZ2Uuc2V0KG5hbWUsIGhpZGRlbiA/ICdoaWRkZW4nIDogJ3Zpc2libGUnKTsKICAgIGNvbHVtbi5maW5kKCcuZGV0YWlscy1jb2wtdG9nZ2xlJykuaHRtbChoaWRkZW4gPyAnJmhlbGxpcDsnIDogJyZ0aW1lczsnKTsKfQoKZnVuY3Rpb24gaGlkZUhpZGRlbkRldGFpbHNDb2x1bW5zKGVsZW0pIHsKICAgIHZhciBuYW1lcyA9IFsnZG9jJywgJ3RhZ3MnLCAnbXNnJywgJ2VsYXBzZWQnLCAndGltZXMnXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgbmFtZSA9IG5hbWVzW2ldOwogICAgICAgIGlmIChzdG9yYWdlLmdldChuYW1lLCAndmlzaWJsZScpID09ICdoaWRkZW4nKSB7CiAgICAgICAgICAgIHZhciBjb2x1bW4gPSBlbGVtLmZpbmQoJy5kZXRhaWxzLWNvbC0nICsgbmFtZSk7CiAgICAgICAgICAgIGNvbHVtbi5hZGRDbGFzcygnaGlkZGVuJyk7CiAgICAgICAgICAgIGNvbHVtbi5maW5kKCcuZGV0YWlscy1jb2wtdG9nZ2xlJykuaHRtbCgnJmhlbGxpcDsnKTsKICAgICAgICB9CiAgICB9Cn0KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1bW1hcnlUYWJsZVRlbXBsYXRlIj4KICA8aDI+U3VtbWFyeSBJbmZvcm1hdGlvbjwvaDI+CiAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIj4KICAgIDx0cj4KICAgICAgPHRoPlN0YXR1czo8L3RoPgogICAgICB7e2lmIGNyaXRpY2FsRmFpbGVkfX0KICAgICAgPHRkPjxhIGhyZWY9IiN0b3RhbHM/Y3JpdGljYWwiIG9uY2xpY2s9InRvdGFsRGV0YWlsU2VsZWN0ZWQoJ2NyaXRpY2FsJykiCiAgICAgICAgICAgICBjbGFzcz0iZmFpbCI+JHtjcml0aWNhbEZhaWxlZH0gY3JpdGljYWwge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX17e2lmIGNyaXRpY2FsRmFpbGVkICE9IDF9fXN7ey9pZn19IGZhaWxlZDwvYT48L3RkPgogICAgICB7e2Vsc2UgdG90YWxGYWlsZWR9fQogICAgICA8dGQ+PGEgaHJlZj0iI3RvdGFscz9jcml0aWNhbCIgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgnY3JpdGljYWwnKSIKICAgICAgICAgICAgIGNsYXNzPSJwYXNzIj5BbGwgY3JpdGljYWwge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX1zIHBhc3NlZDwvYT48L3RkPgogICAgICB7e2Vsc2V9fQogICAgICA8dGQ+PGEgaHJlZj0iI3RvdGFscz9hbGwiIG9uY2xpY2s9InRvdGFsRGV0YWlsU2VsZWN0ZWQoJ2FsbCcpIgogICAgICAgICAgICAgY2xhc3M9InBhc3MiPkFsbCB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXMgcGFzc2VkPC9hPjwvdGQ+CiAgICAgIHt7L2lmfX0KICAgIDwvdHI+CiAgICB7e2lmIGRvYygpfX0KICAgIDx0cj4KICAgICAgPHRoPkRvY3VtZW50YXRpb246PC90aD4KICAgICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCBkb2MoKX19PC90ZD4KICAgIDwvdHI+CiAgICB7ey9pZn19CiAgICB7e2VhY2ggbWV0YWRhdGF9fQogICAgPHRyPgogICAgICA8dGg+e3todG1sICR2YWx1ZVswXX19OjwvdGg+CiAgICAgIDx0ZCBjbGFzcz0iZG9jIj57e2h0bWwgJHZhbHVlWzFdfX08L3RkPgogICAgPC90cj4KICAgIHt7L2VhY2h9fQogICAge3tpZiB0aW1lcy5zdGFydFRpbWUgIT0gJ04vQSd9fQogICAgPHRyPgogICAgICA8dGg+U3RhcnQgVGltZTo8L3RoPgogICAgICA8dGQ+JHt0aW1lcy5zdGFydFRpbWV9PC90ZD4KICAgIDwvdHI+CiAgICB7ey9pZn19CiAgICB7e2lmIHRpbWVzLmVuZFRpbWUgIT0gJ04vQSd9fQogICAgPHRyPgogICAgICA8dGg+RW5kIFRpbWU6PC90aD4KICAgICAgPHRkPiR7dGltZXMuZW5kVGltZX08L3RkPgogICAgPC90cj4KICAgIHt7L2lmfX0KICAgIDx0cj4KICAgICAgPHRoPkVsYXBzZWQgVGltZTo8L3RoPgogICAgICA8dGQ+JHt0aW1lcy5lbGFwc2VkVGltZX08L3RkPgogICAgPC90cj4KICAgIHt7aWYgJGl0ZW0ubG9nVVJMfX0KICAgIDx0cj4KICAgICAgPHRoPkxvZyBGaWxlOjwvdGg+CiAgICAgIDx0ZD48YSBocmVmPSIkeyRpdGVtLmxvZ1VSTH0iPiR7JGl0ZW0ubG9nVVJMfTwvYT48L3RkPgogICAgPC90cj4KICAgIHt7L2lmfX0KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idG90YWxTdGF0aXN0aWNzUm93VGVtcGxhdGUiPgogIDx0ciBvbmNsaWNrPSJ0b3RhbERldGFpbFNlbGVjdGVkKCcke3R5cGV9JykiIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPGEgaHJlZj0iI3RvdGFscz8ke3R5cGV9Ij57e2h0bWwgbGFiZWx9fTwvYT4KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0YWdTdGF0aXN0aWNzUm93VGVtcGxhdGUiPgogIDx0ciBvbmNsaWNrPSJ0YWdEZXRhaWxTZWxlY3RlZCgnJHtsYWJlbH0nKSIgY2xhc3M9InJvdy0keyRpdGVtLmluZGV4fSI+CiAgICA8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIiB0aXRsZT0ie3todG1sIGRvY319Ij4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8YSBocmVmPSIjdGFncz8ke2xhYmVsfSI+e3todG1sIGxhYmVsfX08L2E+CiAgICAgICAge3tpZiBpbmZvfX0oJHtpbmZvfSl7ey9pZn19CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJ0YWctbGlua3MiPgogICAgICAgIHt7ZWFjaCBsaW5rc319CiAgICAgICAgPHNwYW4+WzxhIGhyZWY9Int7aHRtbCAkdmFsdWUudXJsfX0iIG9uY2xpY2s9InN0b3BQcm9wYWdhdGlvbihldmVudCkiCiAgICAgICAgICAgICAgICAgIHRpdGxlPSJ7e2h0bWwgJHZhbHVlLnVybH19Ij57e2h0bWwgJHZhbHVlLnRpdGxlfX08L2E+XTwvc3Bhbj4KICAgICAgICB7ey9lYWNofX0KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJzdWl0ZVN0YXRpc3RpY3NSb3dUZW1wbGF0ZSI+CiAgPHRyIG9uY2xpY2s9InN1aXRlRGV0YWlsU2VsZWN0ZWQoJyR7aWR9JykiIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSIgdGl0bGU9Int7aHRtbCBsYWJlbH19Ij4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8YSBocmVmPSIjc3VpdGVzPyR7aWR9Ij48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBmb3JtYXRQYXJlbnROYW1lfX08L3NwYW4+e3todG1sIG5hbWV9fTwvYT4KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJkZXRhaWxzSGVhZGVyVGVtcGxhdGUiPgogIDxoMiBpZD0iJHtsaW5rVGFyZ2V0fSI+e3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX0gRGV0YWlsczwvaDI+CiAgPHVsIGlkPSJkZXRhaWwtdGFicyI+CiAgICA8bGkgY2xhc3M9IiR7dG90YWxUYWJTdGF0dXN9IGRldGFpbC10YWIiPgogICAgICA8YSBocmVmPSIjdG90YWxzIiBvbmNsaWNrPSJyZW5kZXJUb3RhbFNlbGVjdG9yKCkiPlRvdGFsczwvYT4KICAgIDwvbGk+CiAgICA8bGkgY2xhc3M9IiR7dGFnVGFiU3RhdHVzfSBkZXRhaWwtdGFiIj4KICAgICAgPGEgaHJlZj0iI3RhZ3MiIG9uY2xpY2s9InJlbmRlclRhZ1NlbGVjdG9yKCkiPlRhZ3M8L2E+CiAgICA8L2xpPgogICAgPGxpIGNsYXNzPSIke3N1aXRlVGFiU3RhdHVzfSBkZXRhaWwtdGFiIj4KICAgICAgPGEgaHJlZj0iI3N1aXRlcyIgb25jbGljaz0icmVuZGVyU3VpdGVTZWxlY3RvcigpIj5TdWl0ZXM8L2E+CiAgICA8L2xpPgogICAgPGxpIGNsYXNzPSIke3NlYXJjaFRhYlN0YXR1c30gZGV0YWlsLXRhYiI+CiAgICAgIDxhIGhyZWY9IiNzZWFyY2giIG9uY2xpY2s9InJlbmRlclNlYXJjaFNlbGVjdG9yKCkiPlNlYXJjaDwvYT4KICAgIDwvbGk+CiAgPC91bD4KPC9zY3JpcHQ+Cgo8c2NyaXB0ICB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0b3RhbERldGFpbHNTZWxlY3RvclRlbXBsYXRlIj4KICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGlkPSJkZXRhaWxzLWhlYWRlciI+CiAgICA8dHIgY2xhc3M9InNlbGVjdG9yIj4KICAgICAgPHRoPlR5cGU6PC90aD4KICAgICAgPHRkIGlkPSJub3JtYWwtc2VsZWN0b3IiPgogICAgICAgIDxpbnB1dCBpZD0icmFkaW8tY3JpdGljYWwiIHR5cGU9InJhZGlvIiBuYW1lPSJ0b3RhbHMtcmFkaW8iCiAgICAgICAgICAgICAgIG9uY2xpY2s9InRvdGFsRGV0YWlsU2VsZWN0ZWQoJ2NyaXRpY2FsJykiCiAgICAgICAgICAgICAgIHt7aWYgc2VsZWN0ZWQgPT0gJ2NyaXRpY2FsJ319Y2hlY2tlZD0iY2hlY2tlZCJ7ey9pZn19PgogICAgICAgIDxsYWJlbCBmb3I9InJhZGlvLWNyaXRpY2FsIj5Dcml0aWNhbCB7ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fXM8L2xhYmVsPjxicj4KICAgICAgICA8aW5wdXQgaWQ9InJhZGlvLWFsbCIgdHlwZT0icmFkaW8iIG5hbWU9InRvdGFscy1yYWRpbyIKICAgICAgICAgICAgICAgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgnYWxsJykiCiAgICAgICAgICAgICAgIHt7aWYgc2VsZWN0ZWQgPT0gJ2FsbCd9fWNoZWNrZWQ9ImNoZWNrZWQie3svaWZ9fT4KICAgICAgICA8bGFiZWwgZm9yPSJyYWRpby1hbGwiPkFsbCB7ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fXM8L2xhYmVsPgogICAgICA8L3RkPgogICAgICA8dGQgaWQ9InByaW50LXNlbGVjdG9yIj48L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgIHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRhZ0RldGFpbHNTZWxlY3RvclRlbXBsYXRlIj4KICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGlkPSJkZXRhaWxzLWhlYWRlciI+CiAgICA8dHIgY2xhc3M9InNlbGVjdG9yIj4KICAgICAgPHRoPk5hbWU6PC90aD4KICAgICAgPHRkIGlkPSJub3JtYWwtc2VsZWN0b3IiPgogICAgICAgIDxzZWxlY3QgaWQ9InRhZy1kZXRhaWwtc2VsZWN0b3IiCiAgICAgICAgICAgICAgICBvbmNoYW5nZT0idGFnRGV0YWlsU2VsZWN0ZWQodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpIj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+U2VsZWN0IHRhZy4uLjwvb3B0aW9uPgogICAgICAgICAge3tlYWNoIHRhZ3N9fQogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iJHskdmFsdWUubGFiZWx9IgogICAgICAgICAgICAgICAgICB7e2lmICR2YWx1ZS5sYWJlbCA9PSBzZWxlY3RlZH19c2VsZWN0ZWQ9InNlbGVjdGVkInt7L2lmfX0+CiAgICAgICAgICAgIHt7aHRtbCAkdmFsdWUubGFiZWx9fSB7e2lmICR2YWx1ZS5pbmZvfX0oJHskdmFsdWUuaW5mb30pe3svaWZ9fQogICAgICAgICAgPC9vcHRpb24+CiAgICAgICAgICB7ey9lYWNofX0KICAgICAgICA8L3NlbGVjdD4KICAgICAgPC90ZD4KICAgICAgPHRkIGlkPSJwcmludC1zZWxlY3RvciI+PC90ZD4KICAgIDwvdHI+CiAgPC90YWJsZT4KPC9zY3JpcHQ+Cgo8c2NyaXB0ICB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJzdWl0ZURldGFpbHNTZWxlY3RvclRlbXBsYXRlIj4KICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGlkPSJkZXRhaWxzLWhlYWRlciI+CiAgICA8dHIgY2xhc3M9InNlbGVjdG9yIj4KICAgICAgPHRoPk5hbWU6PC90aD4KICAgICAgPHRkIGlkPSJub3JtYWwtc2VsZWN0b3IiPgogICAgICAgIDxzZWxlY3QgaWQ9InN1aXRlLWRldGFpbC1zZWxlY3RvciIKICAgICAgICAgICAgICAgIG9uY2hhbmdlPSJzdWl0ZURldGFpbFNlbGVjdGVkKHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlKSI+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPlNlbGVjdCBzdWl0ZS4uLjwvb3B0aW9uPgogICAgICAgICAge3tlYWNoIHN1aXRlc319CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIkeyR2YWx1ZS5pZH0iCiAgICAgICAgICAgICAgICAgIHt7aWYgJHZhbHVlLmlkID09IHNlbGVjdGVkfX1zZWxlY3RlZD0ic2VsZWN0ZWQie3svaWZ9fT4KICAgICAgICAgICAge3todG1sICR2YWx1ZS5sYWJlbH19CiAgICAgICAgICA8L29wdGlvbj4KICAgICAgICAgIHt7L2VhY2h9fQogICAgICAgIDwvc2VsZWN0PgogICAgICA8L3RkPgogICAgICA8dGQgaWQ9InByaW50LXNlbGVjdG9yIj48L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgIHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InNlYXJjaFNlbGVjdG9yVGVtcGxhdGUiPgogIDxmb3JtIGFjdGlvbj0iamF2YXNjcmlwdDp2b2lkKDApIj4KICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgaWQ9ImRldGFpbHMtaGVhZGVyIj4KICAgICAgPHRyIGNsYXNzPSJzZWxlY3RvciBmaXJzdC1zZWxlY3RvciI+CiAgICAgICAgPHRoPjxsYWJlbCBmb3I9InNlYXJjaC1zdWl0ZSI+U3VpdGU6PC9sYWJlbD48L3RoPgogICAgICAgIDx0ZD48aW5wdXQgaWQ9InNlYXJjaC1zdWl0ZSIgdHlwZT0idGV4dCIgdmFsdWU9IiR7c3VpdGV9Ij48L3RkPgogICAgICA8L3RyPgogICAgICA8dHIgY2xhc3M9InNlbGVjdG9yIG1pZGRsZS1zZWxlY3RvciI+CiAgICAgICAgPHRoPjxsYWJlbCBmb3I9InNlYXJjaC10ZXN0Ij57ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fTo8L2xhYmVsPjwvdGg+CiAgICAgICAgPHRkPjxpbnB1dCBpZD0ic2VhcmNoLXRlc3QiIHR5cGU9InRleHQiIHZhbHVlPSIke3Rlc3R9Ij48L3RkPgogICAgICA8L3RyPgogICAgICA8dHIgY2xhc3M9InNlbGVjdG9yIG1pZGRsZS1zZWxlY3RvciI+CiAgICAgICAgPHRoPjxsYWJlbCBmb3I9InNlYXJjaC1pbmNsdWRlIj5JbmNsdWRlOjwvbGFiZWw+PC90aD4KICAgICAgICA8dGQ+PGlucHV0IGlkPSJzZWFyY2gtaW5jbHVkZSIgdHlwZT0idGV4dCIgdmFsdWU9IiR7aW5jbHVkZX0iPjwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0ic2VsZWN0b3IgbWlkZGxlLXNlbGVjdG9yIj4KICAgICAgICA8dGg+PGxhYmVsIGZvcj0ic2VhcmNoLWV4Y2x1ZGUiPkV4Y2x1ZGU6PC9sYWJlbD48L3RoPgogICAgICAgIDx0ZD48aW5wdXQgaWQ9InNlYXJjaC1leGNsdWRlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iJHtleGNsdWRlfSI+PC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyIGNsYXNzPSJzZWxlY3RvciBsYXN0LXNlbGVjdG9yIiBpZD0ic2VhcmNoLWJ1dHRvbnMiPgogICAgICAgIDx0aD48L3RoPgogICAgICAgIDx0ZD4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giCiAgICAgICAgICAgICAgICAgb25jbGljaz0ic2VhcmNoRXhlY3V0ZWQoJCgnI3NlYXJjaC1zdWl0ZScpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtdGVzdCcpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtaW5jbHVkZScpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtZXhjbHVkZScpLnZhbCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ij4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJDbGVhciIKICAgICAgICAgICAgICAgICBvbmNsaWNrPSIkKCcjc2VhcmNoLXN1aXRlJykudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjc2VhcmNoLXRlc3QnKS52YWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtaW5jbHVkZScpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3NlYXJjaC1leGNsdWRlJykudmFsKCcnKTsiPgogICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSIkKCcjc2VhcmNoLWhlbHAnKS50b2dnbGUoKSIKICAgICAgICAgICAgIHRpdGxlPSJUb2dnbGUgc2VhcmNoIGhlbHAuIj5IZWxwPC9hPgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBpZD0ic2VhcmNoLWhlbHAiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KICAgICAgICA8dGg+PC90aD4KICAgICAgICA8dGQ+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8aDM+U2VhcmNoIGZpZWxkczwvaDM+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIHt7PSB0ZXN0T3JUYXNrKCd7VGVzdH0nKX19cyBjYW4gYmUgc2VhcmNoZWQgYmFzZWQgb24gc3VpdGUgYW5kCiAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX0gbmFtZXMgYXMgd2VsbCBhcyBiYXNlZCBvbiB0YWdzLiBJZgogICAgICAgICAgICAgIG11bHRpcGxlIHNlYXJjaCBjcml0ZXJpYSBhcmUgdXNlZCwgb25seQogICAgICAgICAgICAgIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19cyBtYXRjaGluZyBhbGwgb2YgdGhlbSBhcmUgaW5jbHVkZWQuCiAgICAgICAgICAgICAgU2VhcmNoIGZpZWxkcyBoYXZlIHNhbWUgc2VtYW50aWNzIGFzCiAgICAgICAgICAgICAgPGVtPiYjODIwOTsmIzgyMDk7c3VpdGU8L2VtPiwKICAgICAgICAgICAgICA8ZW0+JiM4MjA5OyYjODIwOTt7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fTwvZW0+LAogICAgICAgICAgICAgIDxlbT4mIzgyMDk7JiM4MjA5O2luY2x1ZGU8L2VtPiBhbmQKICAgICAgICAgICAgICA8ZW0+JiM4MjA5OyYjODIwOTtleGNsdWRlPC9lbT4gY29tbWFuZCBsaW5lIG9wdGlvbnMsIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9InNlYXJjaC1oZWxwLWV4YW1wbGVzIj4KICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJoZWxwLWl0ZW0iPgogICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImhlbHAtZXhwbGFuYXRpb24iPgogICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImhlbHAtZXhhbXBsZXM+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPkZpZWxkPC90aD4KICAgICAgICAgICAgICAgIDx0aD5FeHBsYW5hdGlvbjwvdGg+CiAgICAgICAgICAgICAgICA8dGg+RXhhbXBsZXM8L3RoPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPlN1aXRlPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX1zIGluIG1hdGNoaW5nIHN1aXRlcyBhcmUgaW5jbHVkZWQuCiAgICAgICAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGNhbiBtYXRjaCBlaXRoZXIgc3VpdGUncyBuYW1lIG9yIGl0cyBmdWxsIG5hbWUKICAgICAgICAgICAgICAgICAgdGhhdCBjb250YWlucyBhbHNvIHBhcmVudCBzdWl0ZSBuYW1lcy4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+TXkgU3VpdGU8YnI+Um9vdC5QYXJlbnQuU3VpKjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+e3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX08L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICBNYXRjaGluZyB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXMgYXJlIGluY2x1ZGVkLiBUaGUKICAgICAgICAgICAgICAgICAgcGF0dGVybiBjYW4gbWF0Y2ggZWl0aGVyIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19J3MgbmFtZQogICAgICAgICAgICAgICAgICBvciBpdHMgZnVsbCBuYW1lIHRoYXQgY29udGFpbnMgYWxzbyBwYXJlbnQgc3VpdGUgbmFtZXMuCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPkV4YW1wbGUgTmFtZTxicj5Sb290LlBhKi5UPz8/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD5JbmNsdWRlPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX1zIHRoYXQgY29udGFpbiBtYXRjaGluZyB0YWdzIGFyZQogICAgICAgICAgICAgICAgICBpbmNsdWRlZC4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+c21va2U8YnI+YnVnLSo8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPkV4Y2x1ZGU8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICB7ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fXMgdGhhdCBjb250YWluIG1hdGNoaW5nIHRhZ3MgYXJlCiAgICAgICAgICAgICAgICAgIG5vdCBpbmNsdWRlZC4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+c2xvdzxicj5mZWF0dXJlLTQ/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8aDM+UGF0dGVybnM8L2gzPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBBbGwgc2VhcmNoZXMgc3VwcG9ydCA8ZW0+KjwvZW0+IGFuZCA8ZW0+PzwvZW0+IHdpbGRjYXJkcyBhbmQgYXJlCiAgICAgICAgICAgICAgY2FzZSwgc3BhY2UgYW5kIHVuZGVyc2NvcmUgaW5zZW5zaXRpdmUuIFRhZyByZWxhdGVkIHNlYXJjaGVzIGFsc28KICAgICAgICAgICAgICBzdXBwb3J0IDxlbT5BTkQ8L2VtPiwgPGVtPk9SPC9lbT4gYW5kIDxlbT5OT1Q8L2VtPiAoY2FzZS1zZW5zaXRpdmUpCiAgICAgICAgICAgICAgY29tYmluaW5nIG9wZXJhdG9ycy4gSWYgb3BlcmF0b3JzIGFyZSB1c2VkIHRvZ2V0aGVyLCB0aGVpcgogICAgICAgICAgICAgIHByZWNlZGVuY2UsIGZyb20gaGlnaGVzdCB0byBsb3dlc3QsIGlzIDxlbT5BTkQ8L2VtPiwgPGVtPk9SPC9lbT4sCiAgICAgICAgICAgICAgPGVtPk5PVDwvZW0+LiBTZWUgPGVtPlNpbXBsZSBwYXR0ZXJuczwvZW0+IGFuZAogICAgICAgICAgICAgIDxlbT5UYWcgcGF0dGVybnM8L2VtPiBzZWN0aW9ucyBpbgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9yb2JvdGZyYW1ld29yay5vcmcvcm9ib3RmcmFtZXdvcmsvI3VzZXItZ3VpZGUiPlJvYm90CiAgICAgICAgICAgICAgRnJhbWV3b3JrIFVzZXIgR3VpZGU8L2E+IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJzZWFyY2gtaGVscC1leGFtcGxlcyI+CiAgICAgICAgICAgICAgPGNvbCBjbGFzcz0iaGVscC1pdGVtIj4KICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJoZWxwLWV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJoZWxwLWV4YW1wbGVzPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0aD5QYXR0ZXJuPC90aD4KICAgICAgICAgICAgICAgIDx0aD5FeHBsYW5hdGlvbjwvdGg+CiAgICAgICAgICAgICAgICA8dGg+RXhhbXBsZXM8L3RoPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPio8L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgYW55dGhpbmcsIGV2ZW4gYW4gZW1wdHkgc3RyaW5nLjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+Zio8YnI+c3ByaW50LSo8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPj88L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIuPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5mPz88YnI+c3ByaW50LTE/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD5BTkQ8L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgaWYgYWxsIHBhdHRlcm5zIG1hdGNoLjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+Zm9vIEFORCBiYXI8YnI+eCBBTkQgeSogQU5EIHo/PzwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+T1I8L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgaWYgYW55IHBhdHRlcm4gbWF0Y2hlcy48L3RkPgogICAgICAgICAgICAgICAgPHRkPmZvbyBPUiBiYXI8YnI+eCBPUiB5KiBPUiB6MSBBTkQgejI8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPk5PVDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgTWF0Y2hlcyBpZiAob3B0aW9uYWwpIHBhdHRlcm4gYmVmb3JlIG1hdGNoZXMgYW5kIHBhdHRlcm4KICAgICAgICAgICAgICAgICAgICBhZnRlciBkb2VzIG5vdC4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+Zm9vIE5PVCBiYXI8YnI+KiBOT1QgaWQtKiBBTkQgc21va2U8YnI+Tk9UIGJhcjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICA8L3RhYmxlPgogIDwvZm9ybT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRhZ09yVG90YWxEZXRhaWxzVGVtcGxhdGUiPgogIDx0cj4KICAgIDx0aD5TdGF0dXM6PC90aD4KICAgIDx0ZD4ke3RvdGFsfSB0b3RhbCwgJHtwYXNzfSBwYXNzZWQsIHt7aWYgZmFpbH19PHNwYW4gY2xhc3M9ImZhaWwiPiR7ZmFpbH0gZmFpbGVkPC9zcGFuPnt7ZWxzZX19PHNwYW4gY2xhc3M9InBhc3MiPjAgZmFpbGVkPC9zcGFuPnt7L2lmfX08L3RkPgogIDwvdHI+CiAge3tpZiBkb2N9fQogIDx0cj4KICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICA8dGQ+e3todG1sIGRvY319PC90ZD4KICA8L3RyPgogIHt7L2lmfX0KICB7e2lmIGNvbWJpbmVkfX0KICA8dHI+CiAgICA8dGg+UGF0dGVybjo8L3RoPgogICAgPHRkPnt7aHRtbCBjb21iaW5lZH19PC90ZD4KICA8L3RyPgogIHt7L2lmfX0KICB7e2lmIGxpbmtzfX17e2lmIGxpbmtzLmxlbmd0aH19CiAgPHRyPgogICAgPHRoPkxpbmtzOjwvdGg+CiAgICA8dGQ+e3tlYWNoIGxpbmtzfX08YSBocmVmPSJ7e2h0bWwgJHZhbHVlLnVybH19IgogICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Int7aHRtbCAkdmFsdWUudXJsfX0iPnt7aHRtbCAkdmFsdWUudGl0bGV9fTwvYT4gJm5ic3A7IHt7L2VhY2h9fTwvdGQ+CiAgPC90cj4KICB7ey9pZn19e3svaWZ9fQogIDx0cj4KICAgIDx0aD5Ub3RhbCBUaW1lOjwvdGg+CiAgICA8dGQ+JHt0b3RhbFRpbWV9PC90ZD4KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ic3VpdGVEZXRhaWxzVGVtcGxhdGUiPgogIDx0cj4KICAgIDx0aD5TdGF0dXM6PC90aD4KICAgIDx0ZD57e3RtcGwoJGRhdGEpICdzdWl0ZVN0YXR1c01lc3NhZ2VUZW1wbGF0ZSd9fTwvdGQ+CiAgPC90cj4KICB7e2lmIGRvYygpfX0KICA8dHI+CiAgICA8dGg+RG9jdW1lbnRhdGlvbjo8L3RoPgogICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCBkb2MoKX19PC90ZD4KICA8L3RyPgogIHt7L2lmfX0KICB7e2VhY2ggbWV0YWRhdGF9fQogIDx0cj4KICAgIDx0aD57e2h0bWwgJHZhbHVlWzBdfX06PC90aD4KICAgIDx0ZCBjbGFzcz0iZG9jIj57e2h0bWwgJHZhbHVlWzFdfX08L3RkPgogIDwvdHI+CiAge3svZWFjaH19CiAge3tpZiBtZXNzYWdlKCl9fQogIDx0cj4KICAgIDx0aD5NZXNzYWdlOjwvdGg+CiAgICA8dGQgY2xhc3M9Im1lc3NhZ2UiPnt7aHRtbCBtZXNzYWdlKCl9fTwvdGQ+CiAgPC90cj4KICB7ey9pZn19CiAgPHRyPgogICAgPHRoPlN0YXJ0IC8gRW5kIFRpbWU6PC90aD4KICAgIDx0ZD4ke3RpbWVzLnN0YXJ0VGltZX0gLyAke3RpbWVzLmVuZFRpbWV9PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0aD5FbGFwc2VkIFRpbWU6PC90aD4KICAgIDx0ZD4ke3RpbWVzLmVsYXBzZWRUaW1lfTwvdGQ+CiAgPC90cj4KICB7e2lmICRpdGVtLmxvZ1VSTH19CiAgPHRyPgogICAgPHRoPkxvZyBGaWxlOjwvdGg+CiAgICA8dGQ+PGEgaHJlZj0iJHskaXRlbS5sb2dVUkx9IyR7aWR9IgogICAgICAgICAgIHRpdGxlPSJ7e2h0bWwgZnVsbE5hbWV9fSI+JHskaXRlbS5sb2dVUkx9IyR7aWR9PC9hPjwvdGQ+CiAgPC90cj4KICB7ey9pZn19Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0ZXN0RGV0YWlsc1RhYmxlVGVtcGxhdGUiPgogIDx0YWJsZSBpZD0idGVzdC1kZXRhaWxzIj4KICAgIDx0aGVhZD4KICAgICAgPHRyPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtbmFtZSIgdGl0bGU9Ik5hbWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5OYW1lPC9kaXY+CiAgICAgICAgPC90aD4KICAgICAgICA8dGggY2xhc3M9ImRldGFpbHMtY29sLWRvYyIgdGl0bGU9IkRvY3VtZW50YXRpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtdG9nZ2xlJyBvbmNsaWNrPSJ0b2dnbGVEZXRhaWxzQ29sdW1uKCdkb2MnKSI+JnRpbWVzOzwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5Eb2N1bWVudGF0aW9uPC9kaXY+CiAgICAgICAgPC90aD4KICAgICAgICA8dGggY2xhc3M9ImRldGFpbHMtY29sLXRhZ3MiIHRpdGxlPSJUYWdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLXRvZ2dsZScgb25jbGljaz0idG9nZ2xlRGV0YWlsc0NvbHVtbigndGFncycpIj4mdGltZXM7PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC1oZWFkZXInPlRhZ3M8L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtY3JpdCIgdGl0bGU9IkNyaXRpY2FsIj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLWhlYWRlcic+Q3JpdC48L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtc3RhdHVzIiB0aXRsZT0iU3RhdHVzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLWhlYWRlcic+U3RhdHVzPC9kaXY+CiAgICAgICAgPC90aD4KICAgICAgICA8dGggY2xhc3M9ImRldGFpbHMtY29sLW1zZyIgdGl0bGU9Ik1lc3NhZ2UiPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtdG9nZ2xlJyBvbmNsaWNrPSJ0b2dnbGVEZXRhaWxzQ29sdW1uKCdtc2cnKSI+JnRpbWVzOzwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5NZXNzYWdlPC9kaXY+CiAgICAgICAgPC90aD4KICAgICAgICA8dGggY2xhc3M9ImRldGFpbHMtY29sLWVsYXBzZWQiIHRpdGxlPSJFbGFwc2VkIFRpbWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtdG9nZ2xlJyBvbmNsaWNrPSJ0b2dnbGVEZXRhaWxzQ29sdW1uKCdlbGFwc2VkJykiPiZ0aW1lczs8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLWhlYWRlcic+RWxhcHNlZDwvZGl2PgogICAgICAgIDwvdGg+CiAgICAgICAgPHRoIGNsYXNzPSJkZXRhaWxzLWNvbC10aW1lcyIgdGl0bGU9IlN0YXJ0IFRpbWUgLyBFbmQgVGltZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC10b2dnbGUnIG9uY2xpY2s9InRvZ2dsZURldGFpbHNDb2x1bW4oJ3RpbWVzJykiPiZ0aW1lczs8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLWhlYWRlcic+U3RhcnQgLyBFbmQ8L2Rpdj4KICAgICAgICA8L3RoPgogICAgICA8L3RyPgogICAgPC90aGVhZD4KICAgIDx0Ym9keT48L3Rib2R5PgogIDwvdGFibGU+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0ZXN0RGV0YWlsc1RhYmxlUm93VGVtcGxhdGUiPgogIHt7aWYgJGl0ZW0ubG9nVVJMfX0KICA8dHIgb25jbGljaz0ibG9jYXRpb24gPSAnJHskaXRlbS5sb2dVUkx9IyR7aWR9JyIgdGl0bGU9Int7aHRtbCBmdWxsTmFtZX19Ij4KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtbmFtZSI+CiAgICAgIDxkaXY+PGEgaHJlZj0iJHskaXRlbS5sb2dVUkx9IyR7aWR9Ij48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBmb3JtYXRQYXJlbnROYW1lfX08L3NwYW4+e3todG1sIG5hbWV9fTwvYT48L2Rpdj4KICAgIDwvdGQ+CiAge3tlbHNlfX0KICA8dHIgdGl0bGU9Int7aHRtbCBmdWxsTmFtZX19Ij4KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtbmFtZSI+CiAgICAgIDxkaXY+PHNwYW4gY2xhc3M9InBhcmVudC1uYW1lIj57e2h0bWwgZm9ybWF0UGFyZW50TmFtZX19PC9zcGFuPnt7aHRtbCBuYW1lfX08L2Rpdj4KICAgIDwvdGQ+CiAge3svaWZ9fQogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1kb2MiPjxkaXYgY2xhc3M9ImRvYyBkZXRhaWxzLWxpbWl0ZWQiPnt7aHRtbCBkb2MoKX19PC9kaXY+PC90ZD4KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtdGFncyI+PGRpdj57e2h0bWwgdGFncy5qb2luKCcsICcpfX08L2Rpdj48L3RkPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1jcml0Ij48ZGl2Pnt7aWYgaXNDcml0aWNhbH19eWVze3tlbHNlfX1ub3t7L2lmfX08L2Rpdj48L3RkPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1zdGF0dXMiPjxkaXY+PHNwYW4gY2xhc3M9ImxhYmVsICR7c3RhdHVzLnRvTG93ZXJDYXNlKCl9Ij4ke3N0YXR1c308L3NwYW4+PC9kaXY+PC90ZD4KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtbXNnIj48ZGl2IGNsYXNzPSJtZXNzYWdlIGRldGFpbHMtbGltaXRlZCI+e3todG1sIG1lc3NhZ2UoKX19PC9kaXY+PC90ZD4KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtZWxhcHNlZCI+PGRpdj4ke3RpbWVzLmVsYXBzZWRUaW1lfTwvZGl2PjwvdGQ+CiAgICA8dGQgY2xhc3M9ImRldGFpbHMtY29sLXRpbWVzIj48ZGl2PiR7dGltZXMuc3RhcnRUaW1lfTxicj4ke3RpbWVzLmVuZFRpbWV9PC9kaXY+PC90ZD4KICA8L3RyPgo8L3NjcmlwdD4KCjwvYm9keT4KPC9odG1sPgo=';w.document.open();w.document.write(window.atob(d));w.document.close();var a=w.document.createElement('a');a.appendChild(w.document.createTextNode('Download'));a.href='data:text/html;base64,' + d;a.download='report.html';a.style='position:fixed;top:0;right:0;color:white;background:black;text-decoration:none;font-weight:bold;padding:7px 14px;border-radius:0 0 0 5px;';w.document.body.append(a);})(this);\">Report</a></p>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMsAAABoCAYAAABfcwRzAAAMo0lEQVR4nO2dz08bZxrHv1mZXbtd3InRxlOBlLEUJLva0HEiFZAiZbiFU8aXVXPCHHOq+QcK+QtwTznanOgN51JysyNtBanUMCRSsJRIHiRQTauYgezGlvCqe3DsMD/9Go9nSHg+EhL2jF+/Hs/3fZ9f7+tLVyNTf4IgiK78xe8OEMTHAomFIBghsRAEIyQWgmCExEIQjJBYCIIREgtBMHIJAOVZCIKBAL7/ye8+EMRHAZlhBMEIiYUgGCGxEAQjJBaCYITEQhCMkFgIghESC0EwQmIhCEZILATBCImFIBghsRAEIyQWgmCExEIQjJBYCIIREgtBMEJiIQhGSCwEwQiJhSAYIbEQBCMkFoJghMRCEIwE/O6AEwIXwt14FAIXgvhlGCI/DC441DmuanWoWh2lSg1a4wQryj60xomPPSY+ZS7h+5/O1b5hXHAId+NXIMejkBPRnl9f2DlAXtnHo/LBAHpHXGTOlVjmxFFkZxO62eOsqFod84UXKFXeuNAzgjgnYhH5MJZnE5CEiOttF3YOsPB4B6pWd71t4mLhu1jSyTEs34nbziZHjSYK5QMo1WMo1bcAAPXwHYTLnwEAJOEyRD4MSRjBF0FrF0xrnGAm9wuU6vFgPgRxIfBVLOnkGHLydctjT9QaspsqCjvsvoeciCIzJeC2xQylNU6w8LiM/NbemftrROSH8cXfejMZd4/qzLOcsf1eXku4j29iyUwLWL6TMD2/XT1G5nG5L18jnRzDknQNV7mQ6dh84YVrginNT1oKsxuqVkd+aw8/bKrQGk3m9h+UXmOp+OpMfSX6x5c8ixQbsRTKirIP8eHPOqGI/DBy8nUU05Mopifx3ZQAzsbcapPf2oP48GfLiNjynThEPtz/h+gDgQthaWYclYUZyPHeI36EP3guFoELYe3bpOn5+cILpNee656T41Fs3b+FdHIMUiwCKRZBdjaBrfu3ugpGa5xAXn2GHzZV3fNccAhr9264EnHrFy4YwNq9G0iLo353hWDA86RkLjVhulEXHu+YTCOBCyGXmrBsQ+BCyMkTSP34rOv7ZdZ3wAWHMHfqhhS4ELKzCZM4+2VXqyOv7Fse44IBiHzY0mzLpSZ0AQzifOKpWKTYiCk8vKLsI7uhms8VIo6zRy8Jy/TacwhcSHejzomjyG6orkbIVK3e1afgggFkZ7/SiRcAlu98hZn8U9f6cpGQ41H888rfUTms478n/0NhQAlpT82w5Ttx3eNdrW47urdDw070kpeRV5/hyOBML8+a/aZBozWaSK89N/lTUiwCwSIgQTjTHlCvjXyOf3z+14G+l2diSSfHTI71Uum17fnq4buubZbUGvP7a40TZDcruuckIeKbs59Z3zE9N4ik7KcOFxzq1ANyodb/3fzZs+KZWOT4Fd3jJ2rNMYRbUmummeA0Z6n9Wiq+xq4hT5FO+uNcq1rd1BeW2fSsSEIEt6+2/gbVbr83KRcMdNpi7aeq1SHyYTx+9QfKf/wHAhdyDMf3g2c+i9GxtXOE26haHZn1l5ZOvpP51o3spqoLW9+NRy1HeS9QtbplLsgt5HgUc+KopX+nVI+R3VCx0uV7+PPBrO7xTO4pVK2OReka5ARvEkipUsOD0queZv20OIrvpgXLWb6wc4AVZd/RD8luqhD5YQAYaJDEE7HIiagpAsaSmc8r+1Cqx1iaGYfIh1vl+GoN2Y3KmUePUkX/JQpcCAIX8iUzPigTkAsGsPbtTUgx+9FZ5MPIpyaQmRaQWn3G/PnlRBRz4pjtLNIK8U8iu6Fi4bHzIMQFAyjOTzpeBznRqj4vVWpI/fir7ffuRSTRE7G0Vd/miVpjXneiVN9CXnUOEWemBMwlRyHyYWiNJkqVN7bFk0r1GLuGEV1ORC0jcoNEEiKmWjYWP42F0vwUvjZccztEPoyt+7cQWy4yDUDfTQlM7WamBexqdWQNea42LEI5jRSLoDg/ieTDn5nOHwSeiEXg9LZ4SXWvbD47m9B9gVwwADkRhRQbQfLhv20Fc1osg3II7eCCActInBshz+xswiSUdjGqqtVb1yceNX3+tW9v9hS63tXqKJQPoDWalm0CwOLMOPLKnqUI86kJk1BWlP2OH8sFh5CZ1tf5iXwYSzPjvpX8eCSWwdjlIj9sO9K18hkJy1lJqR7j7qkyEy+z+ZIQwfJswvJG6dcx5YIB0/V4otYgr+rNl6XiKyzNjOvOlWIRSEKEyddYUfaRWX9patOYP+KCAaTFMdPsIvLDuut/1GhCym2aTKlC+QBpcVTnty5K15Df2vPFbPZlWXFJPXSlHTnBOx6/y1h35Zbv8DUfRjE9af8+X4YtZ7GjRtOV0TItjuke72p1k1CAVq4ns75jqihIJ8e6imW7+tYyuNJq8yXkeFRnXopfmq9tZjqme5zdVG19jryyj3RyTNdPOR61Ne8GiUc+i3+Fi1bO+6BCi1ww4OhUW3HUaEJe/dWVkdL43m0zyY781p7uJmTxc5xMRa3RRF7Z081YVlaFMZ+U3aiYztEfV/ViSfgjFk/yLMaSErfMsm4O8VGjaXkTeu2j2LGr1SHlNnsKszph9A27RRyN78syqHVbOtFtIBK4kM632a6+7foao0DPsizCDXy5awQu6Eo7hfIBso2m7QpJ+0iM3kfxekeYR+WDzsYabsIaAWtjN5D0M/OWKm+wKF2zPW4cKL8IBhzPP094IhZVq+P2qcduOdTaexOmcO+mSTCPyge2foBxBHWrmHK7+haZ9Ze2x5Xq8cBMQLcQ+bBrMx0L7bU9vSLyw55XaXsiFqV6jDl8iJKcJWsuCZHOPmGnKak1CMtFZKZjEPnhzj5iTra1cQR266JrjRNPb7SLjB/rkTwRi1XWXOTDTCP60sy4bppWtTrm157rbkqth2iSVTWBsX8XGa9NUqc1QE58sqFjpXqMI4NvkU6OIrPuLJbCvRum8K/AhVCcn8RM7umZRnHjMt7t6vEns4ul8RqfBa9Nm8PGyUezr4BnVcd5RV9hPCeOOk6lxsSVEbtVlE4IXMi06MptJ9tPeo06+rEk4CwRuPOCZ2Ix1l61yhmu2p7fLeEocKGeQ8BGR/Ko0UR+69MVS7fVpMbjTzzyt7YNs9fHsgeBZ2JRtbqpHHxRGu9rZOnFyZNiIxazyt65NsGMfes2OBjzKnfjUdvZozXL6jP+vezR1g/G4Mvy7FddP1taHPVdVJ4uK7ayTe12WlF+c/Zn7BKOVoh82LSjTKvExH6l5nnA6D/MiWOmCu7TlNSaaUHZ2r2bpkEiLY5a7pBjNJUHRXajolvYxwUD2Lp/y1LYrc1JriOXmkAuNeGrYDxNSqpaHQ9Kr7AofTCHWg77N5jJ/aIbSQvlA2xX39om2lidQi44hFzqukmQS6VX53pWAVrlKKcjge2bqo3Vpnvptecozk/qXpNPTSCfmuhUCFuxsL7jWQ6oHb08XXndDtxojWZnoBQuh0x+V9tX9cPX9HzfsKXia2wbbGuRD6M4/43phpZXf7W0ox+UXjPVBrXbNZp6j8oHnq9fOQuqVjfte9aNklrDvM0qUjuhrCj7ntdaZTetV2m26+vsNvBYUfZ9C8r4Uu4irz6Dcv+WvjqVD6OycBupH7c69UeqVoeUewpJiECKjUA9fIeSWmMyv+REFDnZPKNsV4+RXnvh7gcaIO3kLeuiK6A16mqNJrKzCcdly+1qZz+KEoHWLFiqvMHSzHjX5dW777eZ8jN66dtexyIfRml+0jIv0M/PREixESxK1yzt3+3qMSSDudcPaXFUt8mEevhuYF+mwIUgx6PgQh/EX6q86Zprav8o1OlRulXl8KZrVTJgjiB2W0sicCGkkx8CB6zXRI5HIcXMu+2oWh2FnYOB7QXWC77uou8kGACdi/So/LvjDd7eQM/p18LcFgpx8fD991m44BAK9250Lbtuj6DKb61iRIELQrj8WWdbVCdaK/t2SChEX/guljaZaQFL0njf5RqnOWo0kS489yx/QHzanBuxAB+y+pmpWF+iOWo0kd2sILuxS7MJ4RrnSixtuOBQa7+o+BXmdfTA+0VV5d9d/XUvgmhzLsViRIqNQOSHO3kCgfsMqtZaUqxqjU50hyAGyUchFoI4D/jyM3kE8TFCYiEIRkgsBMEIiYUgGCGxEAQjJBaCYITEQhCMkFgIghESC0EwQmIhCEZILATBCImFIBghsRAEIyQWgmCExEIQjJBYCIIREgtBMEJiIQhGSCwEwQiJhSAYIbEQBCMkFoJg5NLl5L9oKySCYIBmFoJghMRCEIyQWAiCERILQTBCYiEIRkgsBMEIiYUgGCGxEAQj/wdLh0zkXcovzgAAAABJRU5ErkJggg=="
     },
     "metadata": {
      "image/png": {
       "height": 104,
       "width": 203
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "*** Test Cases ***\n",
    "\n",
    "Show Plone logo\n",
    "    Open url  https://plone.org\n",
    "    Page should contain element  css=.navbar-brand\n",
    "    Capture and crop page screenshot  plone.png\n",
    "    ...  css=.navbar-brand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    },
    "tags": [
     "raises-exception"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<p><a href=\"javascript:(function(el){var w=window.open();var d='PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJQcmFnbWEiIGNvbnRlbnQ9Im5vLWNhY2hlIj4KPG1ldGEgaHR0cC1lcXVpdj0iRXhwaXJlcyIgY29udGVudD0iLTEiPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgo8bWV0YSBjb250ZW50PSJSb2JvdCBGcmFtZXdvcmsgMy4xIChQeXRob24gMy42Ljggb24gbGludXgpIiBuYW1lPSJHZW5lcmF0b3IiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBRUFJQUJvQkFBQUZnQUFBQ2dBQUFBUUFBQUFJQUFBQUFFQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLY0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQXFBQUFBQUFBQUFBQUFBQUFBQUFBQUxJQUFBRC9BQUFBNEFBQUFOd0FBQURjQUFBQTNBQUFBTndBQUFEY0FBQUEzQUFBQU53QUFBRGNBQUFBNEFBQUFQOEFBQUN4QUFBQUFBQUFBS1lBQUFEL0FBQUF1d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQy9BQUFBL3dBQUFLa0FBQUQ2QUFBQXpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU44QUFBRC9BQUFBK2dBQUFNTUFBQUFBQUFBQUFnQUFBR3NBQUFCckFBQUFhd0FBQUdzQUFBQnJBQUFBYXdBQUFHc0FBQUJyQUFBQURBQUFBQUFBQUFEYUFBQUEvd0FBQVBvQUFBRERBQUFBQUFBQUFJc0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFORUFBQUFBQUFBQTJnQUFBUDhBQUFENkFBQUF3d0FBQUFBQUFBQUFBQUFBTWdBQUFESUFBQUF5QUFBQU1nQUFBRElBQUFBeUFBQUFNZ0FBQURJQUFBQUZBQUFBQUFBQUFOb0FBQUQvQUFBQStnQUFBTU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGFBQUFBL3dBQUFQb0FBQUREQUFBQUFBQUFBRHdBQUFCOEFBQUFBQUFBQUdBQUFBQmNBQUFBQUFBQUFIOEFBQUJLQUFBQUFBQUFBQUFBQUFBQUFBQUEyZ0FBQVA4QUFBRDZBQUFBd3dBQUFBQUFBQURDQUFBQS93QUFBQ2tBQUFEcUFBQUE0UUFBQUFBQUFBRDdBQUFBL3dBQUFMQUFBQUFHQUFBQUFBQUFBTm9BQUFEL0FBQUErZ0FBQU1NQUFBQUFBQUFBSXdBQUFQNEFBQUQvQUFBQS93QUFBR0FBQUFBQUFBQUFBQUFBQU1rQUFBRC9BQUFBaWdBQUFBQUFBQURhQUFBQS93QUFBUG9BQUFEREFBQUFBQUFBQUFBQUFBQUlBQUFBY0FBQUFCa0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFZ0FBQUFBQUFBQUFBQUFBMmdBQUFQOEFBQUQ3QUFBQXl3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU40QUFBRC9BQUFBcXdBQUFQOEFBQUN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTElBQUFEL0FBQUFzZ0FBQUFBQUFBQzVBQUFBL3dBQUFNb0FBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNa0FBQUQvQUFBQXZBQUFBQUFBQUFBQUFBQUFBQUFBQUt3QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBclFBQUFBQUFBQUFBd0FNQUFJQUJBQUFmK0FBQVAvd0FBRC84QUFBZ0JBQUFQL3dBQUQvOEFBQS8vQUFBSkl3QUFESEVBQUEvL0FBQVAvd0FBQi80QUFDQUFRQUF3QU1BQUE9PSI+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+Ci8qIEdlbmVyaWMgYW5kIG1pc2Mgc3R5bGVzICovCmJvZHkgewogICAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICBjb2xvcjogYmxhY2s7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQp0YWJsZSB7CiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDFlbTsKfQp0aCwgdGQgewogICAgdmVydGljYWwtYWxpZ246IHRvcDsKfQpiciB7CiAgICBtc28tZGF0YS1wbGFjZW1lbnQ6IHNhbWUtY2VsbDsgLyogbWFpbnRhaW4gbGluZSBicmVha3MgaW4gRXhjZWwgKi8KfQpociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KYSwgYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6ICMxNWM7Cn0KYSA+IGltZyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTVjICFpbXBvcnRhbnQ7Cn0KYTpob3ZlciwgYTphY3RpdmUgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICBjb2xvcjogIzYxYzsKfQoucGFyZW50LW5hbWUgewogICAgZm9udC1zaXplOiAwLjdlbTsKICAgIGxldHRlci1zcGFjaW5nOiAtMC4wN2VtOwp9Ci5tZXNzYWdlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQovKiBIZWFkZXJzICovCiNoZWFkZXIgewogICAgd2lkdGg6IDY1ZW07CiAgICBoZWlnaHQ6IDNlbTsKICAgIG1hcmdpbjogNnB4IDA7Cn0KaDEgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBtYXJnaW46IDAgMCAwLjVlbSAwOwogICAgd2lkdGg6IDc1JTsKfQpoMiB7CiAgICBjbGVhcjogbGVmdDsKfQojZ2VuZXJhdGVkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLyogRG9jdW1lbnRhdGlvbiBoZWFkZXJzICovCi5kb2MgPiBoMiB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9Ci5kb2MgPiBoMyB7CiAgICBmb250LXNpemU6IDEuMWVtOwp9Ci5kb2MgPiBoNCB7CiAgICBmb250LXNpemU6IDEuMGVtOwp9Ci8qIFN0YXR1cyB0ZXh0IGNvbG9ycyAtLSAhaW1wb3J0YW50IGFsbG93cyB1c2luZyB0aGVtIGluIGxpbmtzICovCi5mYWlsIHsKICAgIGNvbG9yOiAjZjMzICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoucGFzcyB7CiAgICBjb2xvcjogIzM5MyAhaW1wb3J0YW50Owp9Ci5sYWJlbCB7CiAgICBwYWRkaW5nOiAycHggNXB4OwogICAgZm9udC1zaXplOiAwLjc1ZW07CiAgICBsZXR0ZXItc3BhY2luZzogMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KLmxhYmVsLmRlYnVnLCAubGFiZWwudHJhY2UsIC5sYWJlbC5lcnJvciwgLmxhYmVsLmtleXdvcmQgewogICAgbGV0dGVyLXNwYWNpbmc6IDA7Cn0KLmxhYmVsLmVycm9yLCAubGFiZWwuZmFpbCwgLmxhYmVsLnBhc3MsIC5sYWJlbC53YXJuIHsKICAgIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoubGFiZWwuZXJyb3IsIC5sYWJlbC5mYWlsIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOTUzNGY7Cn0KLmxhYmVsLnBhc3MgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzVjYjg1YzsKfQoubGFiZWwud2FybiB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWM5NzFmOwp9Ci8qIFRvcCByaWdodCBoZWFkZXIgKi8KI3RvcC1yaWdodC1oZWFkZXIgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgcmlnaHQ6IDA7CiAgICB6LWluZGV4OiAxMDAwOwogICAgd2lkdGg6IDEyZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KI3JlcG9ydC1vci1sb2ctbGluayBhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogYmxhY2s7CiAgICBjb2xvcjogd2hpdGU7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKICAgIHBhZGRpbmc6IDAuM2VtIDA7CiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7Cn0KI3JlcG9ydC1vci1sb2ctbGluayBhOmhvdmVyIHsKICAgIGNvbG9yOiAjZGRkOwp9CiNsb2ctbGV2ZWwtc2VsZWN0b3IgewogICAgcGFkZGluZzogMC4zZW0gMDsKICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiAjZGRkOwp9Ci8qIFN0YXRpc3RpY3MgdGFibGUgKi8KLnN0YXRpc3RpY3MgewogICAgd2lkdGg6IDY1ZW07CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBtYXJnaW4tYm90dG9tOiAxZW07Cn0KLnN0YXRpc3RpY3MgdHI6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Y0ZjRmNDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQouc3RhdGlzdGljcyB0aCwgLnN0YXRpc3RpY3MgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwp9Ci5zdGF0aXN0aWNzIHRoIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICBwYWRkaW5nOiAwLjJlbSAwLjNlbTsKfQouc3RhdGlzdGljcyB0ZCB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9Ci5zdGF0cy1jb2wtc3RhdCB7CiAgICB3aWR0aDogNC41ZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLnN0YXRzLWNvbC1lbGFwc2VkIHsKICAgIHdpZHRoOiA1LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc3RhdHMtY29sLWdyYXBoIHsKICAgIHdpZHRoOiA5ZW07Cn0KdGguc3RhdHMtY29sLWdyYXBoOmhvdmVyIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQouc3RhdC1uYW1lIHsKICAgIGZsb2F0OiBsZWZ0Owp9Ci5zdGF0LW5hbWUgYSwgLnN0YXQtbmFtZSBzcGFuIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci50YWctbGlua3MgewogICAgZm9udC1zaXplOiAwLjllbTsKICAgIGZsb2F0OiByaWdodDsKICAgIG1hcmdpbi10b3A6IDAuMDVlbTsKfQoudGFnLWxpbmtzIHNwYW4gewogICAgbWFyZ2luLWxlZnQ6IDAuMmVtOwp9Ci8qIFN0YXRpc3RpY3MgZ3JhcGggKi8KLmdyYXBoLCAuZW1wdHktZ3JhcGggewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHdpZHRoOiBhdXRvOwogICAgaGVpZ2h0OiA3cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYmFja2dyb3VuZDogI2YzMzsKfQouZW1wdHktZ3JhcGggewogICAgYmFja2dyb3VuZDogI2VlZTsKfQoucGFzcy1iYXIsIC5mYWlsLWJhciB7CiAgICBmbG9hdDogbGVmdDsKICAgIGhlaWdodDogMTAwJTsKfQoucGFzcy1iYXIgewogICAgYmFja2dyb3VuZDogIzFkNDsKfQovKiBUYWJsZXNvcnRlciAtIGFkYXB0ZWQgZnJvbSBwcm92aWRlZCBCbHVlIFNraW4gKi8KLnRhYmxlc29ydGVyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQ3dBSkFJQUFBSDkvZndBQUFDSDVCQUVBQUFFQUxBQUFBQUFMQUFrQUFBSVJqQU9uQnIzY25JcjBXVWpUckM5ZTlCUUFPdz09KTsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgcmlnaHQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLnRhYmxlc29ydGVyLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Ci50YWJsZXNvcnRlci1oZWFkZXJBc2MgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBS0VBQUFBQUFIOS9md0FBQUFBQUFDSDVCQUVBQUFJQUxBQUFBQUFMQUFrQUFBSVVsQlduRnIzY25JcjBXUU95Qm12enAxM0NweFFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjICFpbXBvcnRhbnQ7Cn0KLnRhYmxlc29ydGVyLWhlYWRlckRlc2MgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBS0VBQUFBQUFIOS9md0FBQUFBQUFDSDVCQUVBQUFJQUxBQUFBQUFMQUFrQUFBSVVsQVduQnIzY25JcjBXUk95RG12enAxM0NweFFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjICFpbXBvcnRhbnQ7Cn0KLnNvcnRlci1mYWxzZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5zb3J0ZXItZmFsc2U6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgovKiBJY29ucyBhcmUgZnJvbSBPcGVuIEljb25pYyA8aHR0cHM6Ly91c2VpY29uaWMuY29tL29wZW4vPi4KICAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiAqLwovKiBDb250YWluZXJzICovCi5zdWl0ZSwgLnRlc3QsICNlcnJvcnMgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHBhZGRpbmc6IDAuM2VtIDAuMmVtOwogICAgbWFyZ2luOiAwLjJlbSAwOwp9Ci50ZXN0IHsKICAgIGJvcmRlci1zdHlsZTogZGFzaGVkOwp9CiNlcnJvcnMsIC5tZXNzYWdlcywgLm1ldGFkYXRhIHsKICAgIHdpZHRoOiAxMDAlOwogICAgYm9yZGVyLXNwYWNpbmc6IDA7Cn0KLmNoaWxkcmVuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBtYXJnaW4tbGVmdDogMS40ZW07Cn0KLnN1aXRlLCAudGVzdCwgLmtleXdvcmQgewogICAgbWFyZ2luLWxlZnQ6IC0wLjJlbTsKfQojczEsIC5zdWl0ZSA+IC5jaGlsZHJlbiA+IC5rZXl3b3JkIHsKICAgIG1hcmdpbi1sZWZ0OiAwOwp9Ci8qIFN1aXRlLCB0ZXN0IGFuZCBrdyBoZWFkZXJzICovCi5lbGVtZW50LWhlYWRlciB7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQouZWxlbWVudC1oZWFkZXI6aG92ZXIgewogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKICAgIGJvcmRlci1jb2xvcjogI2NjYzsKfQouZWxlbWVudC1oZWFkZXItdG9nZ2xlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDNweDsKICAgIHRvcDogNXB4OwogICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFZQUFBQUdDQVFBQUFCS3hTZkRBQUFBQW1KTFIwUUEvNGVQekw4QUFBQUpjRWhaY3dBQUN4TUFBQXNUQVFDYW5CZ0FBQUFIZEVsTlJRZmVDUjBKQ2hTa1p6MjBBQUFBR2tsRVFWUUkxMk5nUUFLTURLekluUDhJRGhPcU1rNEc3QUFBTlF3QkU0MjdQWVVBQUFBQVNVVk9SSzVDWUlJPSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0k0SWlCb1pXbG5hSFE5SWpnaUlIWnBaWGRDYjNnOUlqQWdNQ0E0SURnaVBnb2dJRHh3WVhSb0lHUTlJazB3SURCMk1tZzRkaTB5YUMwNGVpSWdkSEpoYm5ObWIzSnRQU0owY21GdWMyeGhkR1VvTUNBektTSWdMejRLUEM5emRtYyspLCBub25lOwogICAgaGVpZ2h0OiAxMHB4OwogICAgd2lkdGg6IDEwcHg7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDZweCA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9Ci5jbG9zZWQgPiAuZWxlbWVudC1oZWFkZXItdG9nZ2xlIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFZQUFBQUdDQVFBQUFCS3hTZkRBQUFBQW1KTFIwUUEvNGVQekw4QUFBQUpjRWhaY3dBQUN4TUFBQXNUQVFDYW5CZ0FBQUFIZEVsTlJRZmVDUjBKQ0RIZFZZdHhBQUFBTTBsRVFWUUkxMDNNTVFxQU1CUUZ3Vkh5SVRhQjNQK1cxc0t6U0JDM21XNmhSRncwcFVCNUR2RjFidTlGTjBSTTNYL3dBazk4Q1VudkZUYWtBQUFBQUVsRlRrU3VRbUNDKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMHpJREIyTTJndE0zWXlhRE4yTTJneWRpMHphRE4yTFRKb0xUTjJMVE5vTFRKNklpQXZQZ284TDNOMlp6ND0pLCBub25lOwp9Ci5lbGVtZW50LWhlYWRlcjpob3ZlciA+IC5lbGVtZW50LWhlYWRlci10b2dnbGUgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQouZWxlbWVudC1oZWFkZXItcmlnaHQ6aG92ZXIgfiAuZWxlbWVudC1oZWFkZXItdG9nZ2xlIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50Owp9Ci5lbGVtZW50LWhlYWRlci1sZWZ0IHsKICAgIHBhZGRpbmc6IDNweCA4MHB4IDNweCAyMHB4Owp9Ci5lbGVtZW50LWhlYWRlci1yaWdodCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICByaWdodDogMDsKICAgIHRvcDogMDsKICAgIHBhZGRpbmc6IDNweDsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoubmFtZSB7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQouZWxhcHNlZCB7CiAgICBmbG9hdDogcmlnaHQ7CiAgICBjb2xvcjogIzk5OTsKICAgIHBhZGRpbmctbGVmdDogMWVtOwp9Ci5saW5rIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFnQUFBQUlDQVlBQUFERUQ3NkxBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUxFd0FBQ3hNQkFKcWNHQUFBQUhsSlJFRlVHSlZ0enJFSndtQVFCdENuNkFTdUlLVElCaFkyZ21naEJpSllCMXVkd2sxMEI4RkpiS01CY1FGYnRia2ZKSHJWd2Z1KzQvaWRKUjY0WTlIN0UzaGlnajVPM1M4WTQ0QXBMbmpoblhDTkdoVjJ5TkdnZ0RKd2lDMDJnYXZVYnBERnZzY1JvNFFkWE9NS0RIQnVmejNITFlLek5uNEFiU2tWM2ZuY0dRWUFBQUFBU1VWT1JLNUNZSUk9KTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMDFMamc0TGpBell5MHVNVGd1TURFdExqTTJMakF6TFM0MU15NHdPUzB1TWpjdU1TMHVOVE11TWpVdExqYzFMalEzWVM0MUxqVWdNQ0F4SURBZ0xqWTVMalk1WXk0eE1TMHVNVEV1TWpRdExqRTNMak00TFM0eU1pNHpOUzB1TVRJdU56Z3RMakEzSURFdU1EWXVNakl1TXprdU16a3VNemtnTVM0d05DQXdJREV1TkRSc0xURXVOU0F4TGpWakxTNDBOQzQwTkMwdU9DNDBPQzB4TGpBMkxqUTNMUzR5TmkwdU1ERXRMalF4TFM0eE15MHVOREV0TGpFellTNDFMalVnTUNBeElEQXRMalV1T0RoekxqTTBMakl5TGpnMExqSTFZeTQxTGpBeklERXVNaTB1TVRZZ01TNDRNUzB1Tnpoc01TNDFMVEV1TldNdU56Z3RMamM0TGpjNExUSXVNRFFnTUMweUxqZ3hMUzR5T0MwdU1qZ3RMall4TFM0ME5TMHVPVGN0TGpVekxTNHhPQzB1TURRdExqTTRMUzR3TkMwdU5UWXRMakF6ZW0wdE1pQXlMak14WXkwdU5TMHVNREl0TVM0eE9TNHhOUzB4TGpjNExqYzFiQzB4TGpVZ01TNDFZeTB1TnpndU56Z3RMamM0SURJdU1EUWdNQ0F5TGpneExqVTJMalUySURFdU16WXVOeklnTWk0d05pNDBOeTR5TnkwdU1TNDFNeTB1TWpVdU56VXRMalEzWVM0MUxqVWdNQ0F4SURBdExqWTVMUzQyT1dNdExqRXhMakV4TFM0eU5DNHhOeTB1TXpndU1qSXRMak0xTGpFeUxTNDNPQzR3TnkweExqQTJMUzR5TWkwdU16a3RMak01TFM0ek9TMHhMakEwSURBdE1TNDBOR3d4TGpVdE1TNDFZeTQwTFM0MExqYzFMUzQwTlNBeExqQXpMUzQwTkM0eU9DNHdNUzQwTnk0d09TNDBOeTR3T1dFdU5TNDFJREFnTVNBd0lDNDBOQzB1T0RoekxTNHpOQzB1TWkwdU9EUXRMakl5ZWlJS0lDQXZQZ284TDNOMlp6ND0pLCBub25lOwp9Ci5leHBhbmQgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQWdBQUFBSUNBWUFBQURFRDc2TEFBQUFCSE5DU1ZRSUNBZ0lmQWhraUFBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBRHRKUkVGVUdKVmpZQ0FDS0RBd01CeUEwbGpGRGpBd01QeG5ZR0I0QUJWUWdMTC9RK1ZRQkI2Z3NlR21JaXZDa0VSWGhGVVNXUkZPU2F3QUFFbDdFM3V2MWlNY0FBQUFBRWxGVGtTdVFtQ0MpOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJNElpQm9aV2xuYUhROUlqZ2lJSFpwWlhkQ2IzZzlJakFnTUNBNElEZ2lQZ29nSUR4d1lYUm9JR1E5SWsweExqVWdNR3d0TVM0MUlERXVOU0EwSURRZ05DMDBMVEV1TlMweExqVXRNaTQxSURJdU5TMHlMalV0TWk0MWVpSWdkSEpoYm5ObWIzSnRQU0owY21GdWMyeGhkR1VvTUNBeEtTSWdMejRLUEM5emRtYyspLCBub25lOwp9Ci5jb2xsYXBzZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBZ0FBQUFJQ0FZQUFBREVENzZMQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFMRXdBQUN4TUJBSnFjR0FBQUFDNUpSRUZVR0pWallDQVJORUF4VHNuL1VJeWhDRmtTUXhHNlRoUStDNUlwaldoRzF5TmI0WURGVGRqRU1BRUFDaThRKys5WTlUQUFBQUFBU1VWT1JLNUNZSUk9KTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMDBJREJzTFRRZ05DQXhMalVnTVM0MUlESXVOUzB5TGpVZ01pNDFJREl1TlNBeExqVXRNUzQxTFRRdE5Ib2lJSFJ5WVc1elptOXliVDBpZEhKaGJuTnNZWFJsS0RBZ01Ta2lJQzgrQ2p3dmMzWm5QZz09KSwgbm9uZTsKfQouZXhwYW5kLCAuY29sbGFwc2UsIC5saW5rIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgZGlzcGxheTogYmxvY2s7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICBtYXJnaW46IDAgNHB4OwogICAgaGVpZ2h0OiAxNHB4OwogICAgd2lkdGg6IDE0cHg7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDhweCA4cHg7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQoubGluayB7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDEwcHggMTBweDsKfQouZWxlbWVudC1oZWFkZXI6aG92ZXIgYSB7CiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwp9Ci5leHBhbmQ6aG92ZXIsIC5jb2xsYXBzZTpob3ZlciwgLmxpbms6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQovKiBNZXNzYWdlcyBhbmQgZXJyb3JzICovCi5tZXNzYWdlcyAudGltZSwgLm1lc3NhZ2VzIC5tZXNzYWdlIHsKICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICBmb250LXNpemU6IDEuMWVtOwp9CiNlcnJvcnMgLm1lc3NhZ2UgewogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMS4yZW07Cn0KLm1lc3NhZ2Utcm93IHsKICAgIGhlaWdodDogMjBweDsKfQoudGltZSB7CiAgICB3aWR0aDogNy41ZW07Cn0KLmVycm9yLXRpbWUgewogICAgd2lkdGg6IDExZW07CiAgICBmb250LXNpemU6IDAuOWVtOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoubGV2ZWwgewogICAgd2lkdGg6IDVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc2VsZWN0LW1lc3NhZ2UgewogICAgd2lkdGg6IDI0cHg7Cn0KLnNlbGVjdC1tZXNzYWdlID4gZGl2IHsKICAgIGZsb2F0OiByaWdodDsKICAgIG1hcmdpbi1yaWdodDogMnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgd2lkdGg6IDE2cHg7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDEycHggMTJweDsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7Cn0KLm1lc3NhZ2Utcm93OmhvdmVyIC5zZWxlY3QtbWVzc2FnZSBkaXYgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQXdBQUFBTUNBUUFBQUQ4ZkpSc0FBQUFBbUpMUjBRQS80ZVB6TDhBQUFBSmNFaFpjd0FBQ3hNQUFBc1RBUUNhbkJnQUFBQUhkRWxOUlFmZUNSME1PemhXS1pRT0FBQUFTVWxFUVZRWTAzMlBzUkhBSUF3RFg5QmtpY0QrVzhVTUVxZWdBUUpXS1ovKzNzTFpKaEZHUUVaek5hSWE0aWJoNjZFbjg2N1ZOYUllb1A1V3BwTnVJR29BbE9tM2c1VkMxQWRZZVF2MUJaUFJTZ0FBQUFCSlJVNUVya0pnZ2c9PSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0k0SWlCb1pXbG5hSFE5SWpnaUlIWnBaWGRDYjNnOUlqQWdNQ0E0SURnaVBnb2dJRHh3WVhSb0lHUTlJazB3SURCMk1XZzRkaTB4YUMwNGVtMHdJREoyTVdnMmRpMHhhQzAyZW0wd0lESjJNV2c0ZGkweGFDMDRlbTB3SURKMk1XZzJkaTB4YUMwMmVpSWdMejRLUEM5emRtYyspLCBub25lOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQouc2VsZWN0LW1lc3NhZ2U6aG92ZXIgZGl2IHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2M7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLyogTWVzc2FnZSB0YWJsZXMgLSB0aGVzZSBNVVNUIE5PVCBiZSBjb21iaW5lZCB0b2dldGhlciBiZWNhdXNlIG90aGVyd2lzZQogICBkeW5hbWljYWxseSBhbHRlcmluZyB0aGVtIGJhc2VkIG9uIHZpc2libGUgbG9nIGxldmVsIGlzIG5vdCBwb3NzaWJsZS4gKi8KLnRyYWNlLW1lc3NhZ2UgewogICAgZGlzcGxheTogdGFibGU7Cn0KLmRlYnVnLW1lc3NhZ2UgewogICAgZGlzcGxheTogdGFibGU7Cn0KLyogTWV0YWRhdGEgKi8KLm1ldGFkYXRhIHRoIHsKICAgIHdpZHRoOiAxMi41ZW07CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIHBhZGRpbmc6IDA7Cn0KLm1ldGFkYXRhIHRkIHsKICAgIHBhZGRpbmc6IDAuMmVtOwp9Ci5rZXl3b3JkLW1ldGFkYXRhIHsKICAgIGZvbnQtc2l6ZTogMC45ZW07Cn0KLyogQ3VzdG9tIHN0eWxlcyBmb3Igc3RhdGlzdGljcyAqLwojdG90YWwtc3RhdHMgdHI6aG92ZXIsICN0YWctc3RhdHMgdHI6aG92ZXIgewogICAgY3Vyc29yOiBkZWZhdWx0Owp9Cjwvc3R5bGU+CjxzdHlsZSBtZWRpYT0icHJpbnQiIHR5cGU9InRleHQvY3NzIj4KYm9keSB7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogOHB0Owp9CmE6bGluaywgYTp2aXNpdGVkIHsKICAgIGNvbG9yOiBibGFjazsKfQojaGVhZGVyIHsKICAgIHdpZHRoOiBhdXRvOwp9Ci5kZXRhaWxzLCAuc3RhdGlzdGljcyB7CiAgICB3aWR0aDogMTAwJTsKfQojZ2VuZXJhdGVkLWFnbywgI3RvcC1yaWdodC1oZWFkZXIsICNub3JtYWwtc2VsZWN0b3IsICNzZWFyY2gtYnV0dG9ucywKLmZvbGRpbmctYnV0dG9uLCAuZXhwYW5kLCAuaGlkZGVuLCAuZGV0YWlscy1jb2wtdG9nZ2xlIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLmVsZW1lbnQtaGVhZGVyLXRleHQsIC5jaGlsZHJlbiB7CiAgICBtYXJnaW46IDA7Cn0KI3Rlc3QtZGV0YWlscyB7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgdGFibGUtbGF5b3V0OiBhdXRvOwp9CiN0ZXN0LWRldGFpbHMgdGgsICN0ZXN0LWRldGFpbHMgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Cn0KLmRldGFpbHMtY29sLWhlYWRlciB7CiAgICBwYWRkaW5nOiAwOwp9CiNwcmludC1zZWxlY3RvciB7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwp9Ci50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGJhY2tncm91bmQ6ICNkZGQgIWltcG9ydGFudDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgojamF2YXNjcmlwdC1kaXNhYmxlZCB7CiAgICB3aWR0aDogNjAwcHg7CiAgICBtYXJnaW46IDEwMHB4IGF1dG8gMCBhdXRvOwogICAgcGFkZGluZzogMjBweDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9CiNqYXZhc2NyaXB0LWRpc2FibGVkIGgxIHsKICAgIHdpZHRoOiAxMDAlOwogICAgZmxvYXQ6IG5vbmU7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgdWwgewogICAgZm9udC1zaXplOiAxLjJlbTsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCBsaSB7CiAgICBtYXJnaW46IDAuNWVtIDA7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgYiB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLmRvYyA+ICogewogICAgbWFyZ2luOiAwLjdlbSAxZW0gMC4xZW0gMWVtOwogICAgcGFkZGluZzogMDsKfQouZG9jID4gcCwgLmRvYyA+IGgxLCAuZG9jID4gaDIsIC5kb2MgPiBoMywgLmRvYyA+IGg0IHsKICAgIG1hcmdpbjogMC43ZW0gMCAwLjFlbSAwOwp9Ci5kb2MgPiAqOmZpcnN0LWNoaWxkIHsKICAgIG1hcmdpbi10b3A6IDAuMWVtOwp9Ci5kb2MgdGFibGUgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGVtcHR5LWNlbGxzOiBzaG93OwogICAgZm9udC1zaXplOiAwLjllbTsKfQouZG9jIHRhYmxlIHRoLCAuZG9jIHRhYmxlIHRkIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwogICAgaGVpZ2h0OiAxLjJlbTsKfQouZG9jIHRhYmxlIHRoIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKfQouZG9jIHByZSB7CiAgICBmb250LXNpemU6IDEuMWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgIGJhY2tncm91bmQ6ICNmNGY0ZjQ7Cn0KLmRvYyBjb2RlIHsKICAgIHBhZGRpbmc6IDAgMC4yZW07CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgYmFja2dyb3VuZDogI2VlZTsKfQouZG9jIGxpIHsKICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsKICAgIGxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwp9Ci5kb2MgaW1nIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmRvYyBociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KPC9zdHlsZT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp2YXIgTEVWRUxTID0ge1RSQUNFOiAwLCBERUJVRzogMSwgSU5GTzogMiwgV0FSTjogMywgRkFJTDogNCwgTk9ORTogNX07CmZ1bmN0aW9uIHRvZ2dsZVN1aXRlKHN1aXRlSWQpIHsKICAgIHRvZ2dsZUVsZW1lbnQoc3VpdGVJZCwgWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXSk7Cn0KZnVuY3Rpb24gdG9nZ2xlVGVzdCh0ZXN0SWQpIHsKICAgIHRvZ2dsZUVsZW1lbnQodGVzdElkLCBbJ2tleXdvcmQnXSk7Cn0KZnVuY3Rpb24gdG9nZ2xlS2V5d29yZChrd0lkKSB7CiAgICB0b2dnbGVFbGVtZW50KGt3SWQsIFsna2V5d29yZCcsICdtZXNzYWdlJ10pOwp9CmZ1bmN0aW9uIHRvZ2dsZUVsZW1lbnQoZWxlbWVudElkLCBjaGlsZHJlbk5hbWVzKSB7CiAgICB2YXIgZWxlbWVudCA9ICQoJyMnICsgZWxlbWVudElkKTsKICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oJy5jaGlsZHJlbicpOwogICAgY2hpbGRyZW4udG9nZ2xlKDEwMCwgJycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBlbGVtZW50LmNoaWxkcmVuKCcuZWxlbWVudC1oZWFkZXInKS50b2dnbGVDbGFzcygnY2xvc2VkJyk7CiAgICB9KTsKICAgIHBvcHVsYXRlQ2hpbGRyZW4oZWxlbWVudElkLCBjaGlsZHJlbiwgY2hpbGRyZW5OYW1lcyk7Cn0KZnVuY3Rpb24gcG9wdWxhdGVDaGlsZHJlbihlbGVtZW50SWQsIGNoaWxkRWxlbWVudCwgY2hpbGRyZW5OYW1lcykgewogICAgaWYgKCFjaGlsZEVsZW1lbnQuaGFzQ2xhc3MoJ3BvcHVsYXRlZCcpKSB7CiAgICAgICAgdmFyIGVsZW1lbnQgPSB3aW5kb3cudGVzdGRhdGEuZmluZExvYWRlZChlbGVtZW50SWQpOwogICAgICAgIHZhciBjYWxsYmFjayA9IGRyYXdDYWxsYmFjayhlbGVtZW50LCBjaGlsZEVsZW1lbnQsIGNoaWxkcmVuTmFtZXMpOwogICAgICAgIGVsZW1lbnQuY2FsbFdoZW5DaGlsZHJlblJlYWR5KGNhbGxiYWNrKTsKICAgICAgICBjaGlsZEVsZW1lbnQuYWRkQ2xhc3MoJ3BvcHVsYXRlZCcpOwogICAgfQp9CmZ1bmN0aW9uIGRyYXdDYWxsYmFjayhlbGVtZW50LCBjaGlsZEVsZW1lbnQsIGNoaWxkcmVuTmFtZXMpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdXRpbC5tYXAoY2hpbGRyZW5OYW1lcywgZnVuY3Rpb24gKGNoaWxkTmFtZSkgewogICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBlbGVtZW50W2NoaWxkTmFtZSArICdzJ10oKTsKICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gY2hpbGROYW1lICsgJ1RlbXBsYXRlJzsKICAgICAgICAgICAgdXRpbC5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkgewogICAgICAgICAgICAgICAgJC50bXBsKHRlbXBsYXRlLCBjaGlsZCkuYXBwZW5kVG8oY2hpbGRFbGVtZW50KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9Cn0KZnVuY3Rpb24gZXhwYW5kU3VpdGUoc3VpdGUpIHsKICAgIGlmIChzdWl0ZS5zdGF0dXMgPT0gIlBBU1MiKQogICAgICAgIGV4cGFuZEVsZW1lbnQoc3VpdGUpOwogICAgZWxzZQogICAgICAgIGV4cGFuZENyaXRpY2FsRmFpbGVkKHN1aXRlKTsKfQpmdW5jdGlvbiBleHBhbmRFbGVtZW50KGl0ZW0pIHsKICAgIHZhciBlbGVtZW50ID0gJCgnIycgKyBpdGVtLmlkKTsKICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oJy5jaGlsZHJlbicpOwogICAgLy8gLmNzcyBpcyBmYXN0ZXIgdGhhbiAuc2hvdyBhbmQgLnNob3cgdy8gY2FsbGJhY2sgaXMgdGVycmlibHkgc2xvdwogICAgY2hpbGRyZW4uY3NzKHsnZGlzcGxheSc6ICdibG9jayd9KTsKICAgIHBvcHVsYXRlQ2hpbGRyZW4oaXRlbS5pZCwgY2hpbGRyZW4sIGl0ZW0uY2hpbGRyZW5OYW1lcyk7CiAgICBlbGVtZW50LmNoaWxkcmVuKCcuZWxlbWVudC1oZWFkZXInKS5yZW1vdmVDbGFzcygnY2xvc2VkJyk7Cn0KZnVuY3Rpb24gZXhwYW5kRWxlbWVudFdpdGhJZChlbGVtZW50aWQpIHsKICAgIGV4cGFuZEVsZW1lbnQod2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQoZWxlbWVudGlkKSk7Cn0KZnVuY3Rpb24gZXhwYW5kQ3JpdGljYWxGYWlsZWQoZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQuc3RhdHVzID09ICJGQUlMIikgewogICAgICAgIHdpbmRvdy5lbGVtZW50c1RvRXhwYW5kID0gW2VsZW1lbnRdOwogICAgICAgIHdpbmRvdy5leHBhbmREZWNpZGVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmV0dXJuIGUuc3RhdHVzID09ICJGQUlMIiAmJiAoZS5pc0NyaXRpY2FsID09PSB1bmRlZmluZWQgfHwgZS5pc0NyaXRpY2FsKTsKICAgICAgICB9OwogICAgICAgIGV4cGFuZFJlY3Vyc2l2ZWx5KCk7CiAgICB9Cn0KZnVuY3Rpb24gZXhwYW5kQWxsKGVsZW1lbnRJZCkgewogICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQgPSBbd2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQoZWxlbWVudElkKV07CiAgICB3aW5kb3cuZXhwYW5kRGVjaWRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07CiAgICBleHBhbmRSZWN1cnNpdmVseSgpOwp9CmZ1bmN0aW9uIGV4cGFuZFJlY3Vyc2l2ZWx5KCkgewogICAgaWYgKCF3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5sZW5ndGgpCiAgICAgICAgcmV0dXJuOwogICAgdmFyIGVsZW1lbnQgPSB3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5wb3AoKTsKICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50SGlkZGVuQnlVc2VyKGVsZW1lbnQuaWQpKSB7CiAgICAgICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQgPSBbXTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBleHBhbmRFbGVtZW50KGVsZW1lbnQpOwogICAgZWxlbWVudC5jYWxsV2hlbkNoaWxkcmVuUmVhZHkoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oKTsKICAgICAgICBmb3IgKHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cuZXhwYW5kRGVjaWRlcihjaGlsZHJlbltpXSkpCiAgICAgICAgICAgICAgICB3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5wdXNoKGNoaWxkcmVuW2ldKTsKICAgICAgICB9CiAgICAgICAgaWYgKHdpbmRvdy5lbGVtZW50c1RvRXhwYW5kLmxlbmd0aCkKICAgICAgICAgICAgc2V0VGltZW91dChleHBhbmRSZWN1cnNpdmVseSwgMCk7CiAgICB9KTsKfQpmdW5jdGlvbiBlbGVtZW50SGlkZGVuQnlVc2VyKGlkKSB7CiAgICB2YXIgZWxlbWVudCA9ICQoJyMnICsgaWQpOwogICAgcmV0dXJuICFlbGVtZW50LmlzKCI6dmlzaWJsZSIpOwp9CmZ1bmN0aW9uIGNvbGxhcHNlQWxsKGlkKSB7CiAgICB2YXIgZWxlbWVudCA9ICQoJyMnICsgaWQpOwogICAgZWxlbWVudC5maW5kKCcuY2hpbGRyZW4nKS5jc3MoeydkaXNwbGF5JzogJ25vbmUnfSk7CiAgICBlbGVtZW50LmZpbmQoJy5lbGVtZW50LWhlYWRlcicpLmFkZENsYXNzKCdjbG9zZWQnKTsKfQpmdW5jdGlvbiBsb2dMZXZlbFNlbGVjdGVkKGxldmVsKSB7CiAgICB2YXIgYW5jaG9ycyA9IGdldFZpZXdBbmNob3JFbGVtZW50cygpOwogICAgc2V0TWVzc2FnZVZpc2liaWxpdHkobGV2ZWwpOwogICAgc2Nyb2xsVG9TaG9ydGVzdFZpc2libGVBbmNob3JFbGVtZW50KGFuY2hvcnMpOwp9CmZ1bmN0aW9uIGdldFZpZXdBbmNob3JFbGVtZW50cygpIHsKICAgIHZhciBlbGVtMSA9ICQoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCgxMDAsIDApKTsKICAgIHZhciBlbGVtMiA9ICQoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCgxMDAsIDIwKSk7CiAgICByZXR1cm4gW2VsZW0xLCBlbGVtMl07Cn0KZnVuY3Rpb24gc2Nyb2xsVG9TaG9ydGVzdFZpc2libGVBbmNob3JFbGVtZW50KGFuY2hvcnMpIHsKICAgIGFuY2hvcnMgPSB1dGlsLm1hcChhbmNob3JzLCBjbG9zZXN0VmlzaWJsZVBhcmVudCk7CiAgICB2YXIgc2hvcnRlc3QgPSBhbmNob3JzWzBdOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhbmNob3JzLmxlbmd0aDsgaSsrKQogICAgICAgIGlmIChzaG9ydGVzdC5oZWlnaHQoKSA+IGFuY2hvcnNbaV0uaGVpZ2h0KCkpCiAgICAgICAgICAgIHNob3J0ZXN0ID0gYW5jaG9yc1tpXTsKICAgIHNob3J0ZXN0LmdldCgpWzBdLnNjcm9sbEludG9WaWV3KHRydWUpOwp9CmZ1bmN0aW9uIHNldE1lc3NhZ2VWaXNpYmlsaXR5KGxldmVsKSB7CiAgICBsZXZlbCA9IHBhcnNlSW50KGxldmVsKTsKICAgIGNoYW5nZUNsYXNzRGlzcGxheSgiLnRyYWNlLW1lc3NhZ2UiLCBsZXZlbCA8PSBMRVZFTFMuVFJBQ0UpOwogICAgY2hhbmdlQ2xhc3NEaXNwbGF5KCIuZGVidWctbWVzc2FnZSIsIGxldmVsIDw9IExFVkVMUy5ERUJVRyk7CiAgICBjaGFuZ2VDbGFzc0Rpc3BsYXkoIi5pbmZvLW1lc3NhZ2UiLCBsZXZlbCA8PSBMRVZFTFMuSU5GTyk7Cn0KZnVuY3Rpb24gY2xvc2VzdFZpc2libGVQYXJlbnQoZWxlbSkgewogICAgd2hpbGUgKCFlbGVtLmlzKCI6dmlzaWJsZSIpKQogICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudCgpOwogICAgcmV0dXJuIGVsZW07Cn0KZnVuY3Rpb24gY2hhbmdlQ2xhc3NEaXNwbGF5KGNsYXp6LCB2aXNpYmxlKSB7CiAgICB2YXIgc3R5bGVzID0gZG9jdW1lbnQuc3R5bGVTaGVldHM7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBydWxlcyA9IGdldFJ1bGVzKHN0eWxlc1tpXSk7CiAgICAgICAgaWYgKHJ1bGVzID09PSBudWxsKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJ1bGVzLmxlbmd0aDsgaisrKQogICAgICAgICAgICBpZiAocnVsZXNbal0uc2VsZWN0b3JUZXh0ID09PSBjbGF6eikKICAgICAgICAgICAgICAgIHJ1bGVzW2pdLnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID8gInRhYmxlIiA6ICJub25lIjsKICAgIH0KfQpmdW5jdGlvbiBnZXRSdWxlcyhzdHlsZSkgewogICAgLy8gV2l0aCBDaHJvbWUgZXh0ZXJuYWwgQ1NTIGZpbGVzIHNlZW0gdG8gaGF2ZSBvbmx5IG51bGwgcm9sZXMgYW5kIHdpdGgKICAgIC8vIEZpcmVmb3ggYWNjZXNzaW5nIHJ1bGVzIGNhbiByZXN1bHQgdG8gc2VjdXJpdHkgZXJyb3IuCiAgICAvLyBOZWl0aGVyIG9mIHRoZXNlIGFyZSBhIHByb2JsZW0gb24gd2l0aCBnZW5lcmF0ZWQgbG9ncy4KICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIHN0eWxlLmNzc1J1bGVzIHx8IHN0eWxlLnJ1bGVzOwogICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9CmZ1bmN0aW9uIHNlbGVjdE1lc3NhZ2UocGFyZW50SWQpIHsKICAgIHZhciBlbGVtZW50ID0gJCgnIycgKyBwYXJlbnRJZCkuZmluZCgnLm1lc3NhZ2UnKS5nZXQoMCk7CiAgICBzZWxlY3RUZXh0KGVsZW1lbnQpOwp9CmZ1bmN0aW9uIHNlbGVjdFRleHQoZWxlbWVudCkgewogICAgLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy85ODUyNzIKICAgIHZhciByYW5nZSwgc2VsZWN0aW9uOwogICAgaWYgKGRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKSB7ICAvLyBJRSA4CiAgICAgICAgcmFuZ2UgPSBkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpOwogICAgICAgIHJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KGVsZW1lbnQpOwogICAgICAgIHJhbmdlLnNlbGVjdCgpOwogICAgfSBlbHNlIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7ICAvLyBPdGhlcnMKICAgICAgICBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTsKICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTsKICAgIH0KfQpmdW5jdGlvbiBMb2dMZXZlbENvbnRyb2xsZXIobWluTGV2ZWwsIGRlZmF1bHRMZXZlbCkgewogICAgbWluTGV2ZWwgPSBMRVZFTFNbbWluTGV2ZWxdOwogICAgZGVmYXVsdExldmVsID0gTEVWRUxTW2RlZmF1bHRMZXZlbF07CiAgICBmdW5jdGlvbiBzaG93TG9nTGV2ZWxTZWxlY3RvcigpIHsKICAgICAgICByZXR1cm4gbWluTGV2ZWwgPCBMRVZFTFMuSU5GTzsKICAgIH0KICAgIGZ1bmN0aW9uIGRlZmF1bHRMb2dMZXZlbCgpIHsKICAgICAgICBpZiAobWluTGV2ZWwgPiBkZWZhdWx0TGV2ZWwpCiAgICAgICAgICAgIHJldHVybiBtaW5MZXZlbDsKICAgICAgICByZXR1cm4gZGVmYXVsdExldmVsOwogICAgfQogICAgZnVuY3Rpb24gc2hvd1RyYWNlKCkgewogICAgICAgIHJldHVybiBtaW5MZXZlbCA9PSBMRVZFTFMuVFJBQ0U7CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIHNob3dMb2dMZXZlbFNlbGVjdG9yOiBzaG93TG9nTGV2ZWxTZWxlY3RvciwKICAgICAgICBkZWZhdWx0TG9nTGV2ZWw6IGRlZmF1bHRMb2dMZXZlbCwKICAgICAgICBzaG93VHJhY2U6IHNob3dUcmFjZQogICAgfTsKfQo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKiEgalF1ZXJ5IHYzLjMuMSB8IChjKSBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiOyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUuZG9jdW1lbnQ/dChlLCEwKTpmdW5jdGlvbihlKXtpZighZS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gdChlKX06dChlKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7dmFyIG49W10scj1lLmRvY3VtZW50LGk9T2JqZWN0LmdldFByb3RvdHlwZU9mLG89bi5zbGljZSxhPW4uY29uY2F0LHM9bi5wdXNoLHU9bi5pbmRleE9mLGw9e30sYz1sLnRvU3RyaW5nLGY9bC5oYXNPd25Qcm9wZXJ0eSxwPWYudG9TdHJpbmcsZD1wLmNhbGwoT2JqZWN0KSxoPXt9LGc9ZnVuY3Rpb24gZSh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmIm51bWJlciIhPXR5cGVvZiB0Lm5vZGVUeXBlfSx5PWZ1bmN0aW9uIGUodCl7cmV0dXJuIG51bGwhPXQmJnQ9PT10LndpbmRvd30sdj17dHlwZTohMCxzcmM6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIG0oZSx0LG4pe3ZhciBpLG89KHQ9dHx8cikuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoby50ZXh0PWUsbilmb3IoaSBpbiB2KW5baV0mJihvW2ldPW5baV0pO3QuaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2xbYy5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9dmFyIGI9IjMuMy4xIix3PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyB3LmZuLmluaXQoZSx0KX0sVD0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7dy5mbj13LnByb3RvdHlwZT17anF1ZXJ5OiIzLjMuMSIsY29uc3RydWN0b3I6dyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIG8uY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP28uY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHR9LGVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcubWFwKHRoaXMsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHQsbix0KX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soby5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKyhlPDA/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobj49MCYmbjx0P1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpzLHNvcnQ6bi5zb3J0LHNwbGljZTpuLnNwbGljZX0sdy5leHRlbmQ9dy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8sYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGw9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fGcoYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKW49YVt0XSxhIT09KHI9ZVt0XSkmJihsJiZyJiYody5pc1BsYWluT2JqZWN0KHIpfHwoaT1BcnJheS5pc0FycmF5KHIpKSk/KGk/KGk9ITEsbz1uJiZBcnJheS5pc0FycmF5KG4pP246W10pOm89biYmdy5pc1BsYWluT2JqZWN0KG4pP246e30sYVt0XT13LmV4dGVuZChsLG8scikpOnZvaWQgMCE9PXImJihhW3RdPXIpKTtyZXR1cm4gYX0sdy5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKCIzLjMuMSIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4hKCFlfHwiW29iamVjdCBPYmplY3RdIiE9PWMuY2FsbChlKSkmJighKHQ9aShlKSl8fCJmdW5jdGlvbiI9PXR5cGVvZihuPWYuY2FsbCh0LCJjb25zdHJ1Y3RvciIpJiZ0LmNvbnN0cnVjdG9yKSYmcC5jYWxsKG4pPT09ZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbihlKXttKGUpfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2lmKEMoZSkpe2ZvcihuPWUubGVuZ3RoO3I8bjtyKyspaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrfWVsc2UgZm9yKHIgaW4gZSlpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWs7cmV0dXJuIGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6KGUrIiIpLnJlcGxhY2UoVCwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoQyhPYmplY3QoZSkpP3cubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOnMuY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTp1LmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0rdC5sZW5ndGgscj0wLGk9ZS5sZW5ndGg7cjxuO3IrKyllW2krK109dFtyXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIsaT1bXSxvPTAsYT1lLmxlbmd0aCxzPSFuO288YTtvKyspKHI9IXQoZVtvXSxvKSkhPT1zJiZpLnB1c2goZVtvXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPTAscz1bXTtpZihDKGUpKWZvcihyPWUubGVuZ3RoO288cjtvKyspbnVsbCE9KGk9dChlW29dLG8sbikpJiZzLnB1c2goaSk7ZWxzZSBmb3IobyBpbiBlKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmcy5wdXNoKGkpO3JldHVybiBhLmFwcGx5KFtdLHMpfSxndWlkOjEsc3VwcG9ydDpofSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKHcuZm5bU3ltYm9sLml0ZXJhdG9yXT1uW1N5bWJvbC5pdGVyYXRvcl0pLHcuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtsWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIEMoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49eChlKTtyZXR1cm4hZyhlKSYmIXkoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmdD4wJiZ0LTEgaW4gZSl9dmFyIEU9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHMsdSxsLGMsZixwLGQsaCxnLHksdixtLHgsYj0ic2l6emxlIisxKm5ldyBEYXRlLHc9ZS5kb2N1bWVudCxUPTAsQz0wLEU9YWUoKSxrPWFlKCksUz1hZSgpLEQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihmPSEwKSwwfSxOPXt9Lmhhc093blByb3BlcnR5LEE9W10saj1BLnBvcCxxPUEucHVzaCxMPUEucHVzaCxIPUEuc2xpY2UsTz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX0sUD0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLFI9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixJPSJcXFsiK00rIiooIitSKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrUisiKSl8KSIrTSsiKlxcXSIsVz0iOigiK1IrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK0krIikqKXwuKilcXCl8KSIsJD1uZXcgUmVnRXhwKE0rIisiLCJnIiksQj1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLEY9bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSxfPW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksej1uZXcgUmVnRXhwKCI9IitNKyIqKFteXFxdJ1wiXSo/KSIrTSsiKlxcXSIsImciKSxYPW5ldyBSZWdFeHAoVyksVT1uZXcgUmVnRXhwKCJeIitSKyIkIiksVj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitSKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK1IrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK1IrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitJKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrVyksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitNKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitNKyIqKD86KFsrLV18KSIrTSsiKihcXGQrKXwpKSIrTSsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrUCsiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK00rIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrTSsiKigoPzotXFxkKT9cXGQqKSIrTSsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sRz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFk9L15oXGQkL2ksUT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sSj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLEs9L1srfl0vLFo9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitNKyI/fCgiK00rIil8LikiLCJpZyIpLGVlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iMHgiK3QtNjU1MzY7cmV0dXJuIHIhPT1yfHxuP3Q6cjwwP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShyPj4xMHw1NTI5NiwxMDIzJnJ8NTYzMjApfSx0ZT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxuZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PyJcMCI9PT1lPyJcdWZmZmQiOmUuc2xpY2UoMCwtMSkrIlxcIitlLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2V9LHJlPWZ1bmN0aW9uKCl7cCgpfSxpZT1tZShmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJigiZm9ybSJpbiBlfHwibGFiZWwiaW4gZSl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7TC5hcHBseShBPUguY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksQVt3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtMPXthcHBseTpBLmxlbmd0aD9mdW5jdGlvbihlLHQpe3EuYXBwbHkoZSxILmNhbGwodCkpfTpmdW5jdGlvbihlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDt3aGlsZShlW24rK109dFtyKytdKTtlLmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBvZShlLHQscixpKXt2YXIgbyxzLGwsYyxmLGgsdixtPXQmJnQub3duZXJEb2N1bWVudCxUPXQ/dC5ub2RlVHlwZTo5O2lmKHI9cnx8W10sInN0cmluZyIhPXR5cGVvZiBlfHwhZXx8MSE9PVQmJjkhPT1UJiYxMSE9PVQpcmV0dXJuIHI7aWYoIWkmJigodD90Lm93bmVyRG9jdW1lbnR8fHQ6dykhPT1kJiZwKHQpLHQ9dHx8ZCxnKSl7aWYoMTEhPT1UJiYoZj1KLmV4ZWMoZSkpKWlmKG89ZlsxXSl7aWYoOT09PVQpe2lmKCEobD10LmdldEVsZW1lbnRCeUlkKG8pKSlyZXR1cm4gcjtpZihsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZSBpZihtJiYobD1tLmdldEVsZW1lbnRCeUlkKG8pKSYmeCh0LGwpJiZsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZXtpZihmWzJdKXJldHVybiBMLmFwcGx5KHIsdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkscjtpZigobz1mWzNdKSYmbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZ0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEwuYXBwbHkocix0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobykpLHJ9aWYobi5xc2EmJiFTW2UrIiAiXSYmKCF5fHwheS50ZXN0KGUpKSl7aWYoMSE9PVQpbT10LHY9ZTtlbHNlIGlmKCJvYmplY3QiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXsoYz10LmdldEF0dHJpYnV0ZSgiaWQiKSk/Yz1jLnJlcGxhY2UodGUsbmUpOnQuc2V0QXR0cmlidXRlKCJpZCIsYz1iKSxzPShoPWEoZSkpLmxlbmd0aDt3aGlsZShzLS0paFtzXT0iIyIrYysiICIrdmUoaFtzXSk7dj1oLmpvaW4oIiwiKSxtPUsudGVzdChlKSYmZ2UodC5wYXJlbnROb2RlKXx8dH1pZih2KXRyeXtyZXR1cm4gTC5hcHBseShyLG0ucXVlcnlTZWxlY3RvckFsbCh2KSkscn1jYXRjaChlKXt9ZmluYWxseXtjPT09YiYmdC5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gdShlLnJlcGxhY2UoQiwiJDEiKSx0LHIsaSl9ZnVuY3Rpb24gYWUoKXt2YXIgZT1bXTtmdW5jdGlvbiB0KG4saSl7cmV0dXJuIGUucHVzaChuKyIgIik+ci5jYWNoZUxlbmd0aCYmZGVsZXRlIHRbZS5zaGlmdCgpXSx0W24rIiAiXT1pfXJldHVybiB0fWZ1bmN0aW9uIHNlKGUpe3JldHVybiBlW2JdPSEwLGV9ZnVuY3Rpb24gdWUoZSl7dmFyIHQ9ZC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGxlKGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLGk9bi5sZW5ndGg7d2hpbGUoaS0tKXIuYXR0ckhhbmRsZVtuW2ldXT10fWZ1bmN0aW9uIGNlKGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBmZShlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gcGUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PW58fCJidXR0b24iPT09bikmJnQudHlwZT09PWV9fWZ1bmN0aW9uIGRlKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4iZm9ybSJpbiB0P3QucGFyZW50Tm9kZSYmITE9PT10LmRpc2FibGVkPyJsYWJlbCJpbiB0PyJsYWJlbCJpbiB0LnBhcmVudE5vZGU/dC5wYXJlbnROb2RlLmRpc2FibGVkPT09ZTp0LmRpc2FibGVkPT09ZTp0LmlzRGlzYWJsZWQ9PT1lfHx0LmlzRGlzYWJsZWQhPT0hZSYmaWUodCk9PT1lOnQuZGlzYWJsZWQ9PT1lOiJsYWJlbCJpbiB0JiZ0LmRpc2FibGVkPT09ZX19ZnVuY3Rpb24gaGUoZSl7cmV0dXJuIHNlKGZ1bmN0aW9uKHQpe3JldHVybiB0PSt0LHNlKGZ1bmN0aW9uKG4scil7dmFyIGksbz1lKFtdLG4ubGVuZ3RoLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKW5baT1vW2FdXSYmKG5baV09IShyW2ldPW5baV0pKX0pfSl9ZnVuY3Rpb24gZ2UoZSl7cmV0dXJuIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1uPW9lLnN1cHBvcnQ9e30sbz1vZS5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuISF0JiYiSFRNTCIhPT10Lm5vZGVOYW1lfSxwPW9lLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0LGksYT1lP2Uub3duZXJEb2N1bWVudHx8ZTp3O3JldHVybiBhIT09ZCYmOT09PWEubm9kZVR5cGUmJmEuZG9jdW1lbnRFbGVtZW50PyhkPWEsaD1kLmRvY3VtZW50RWxlbWVudCxnPSFvKGQpLHchPT1kJiYoaT1kLmRlZmF1bHRWaWV3KSYmaS50b3AhPT1pJiYoaS5hZGRFdmVudExpc3RlbmVyP2kuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixyZSwhMSk6aS5hdHRhY2hFdmVudCYmaS5hdHRhY2hFdmVudCgib251bmxvYWQiLHJlKSksbi5hdHRyaWJ1dGVzPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsYXNzTmFtZT0iaSIsIWUuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLG4uZ2V0RWxlbWVudHNCeVRhZ05hbWU9dWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXBwZW5kQ2hpbGQoZC5jcmVhdGVDb21tZW50KCIiKSksIWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxuLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9US50ZXN0KGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksbi5nZXRCeUlkPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBoLmFwcGVuZENoaWxkKGUpLmlkPWIsIWQuZ2V0RWxlbWVudHNCeU5hbWV8fCFkLmdldEVsZW1lbnRzQnlOYW1lKGIpLmxlbmd0aH0pLG4uZ2V0QnlJZD8oci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0sci5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09dH19LHIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG4scixpLG89dC5nZXRFbGVtZW50QnlJZChlKTtpZihvKXtpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb119cmV0dXJuW119fSksci5maW5kLlRBRz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6bi5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sci5maW5kLkNMQVNTPW4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZylyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfSx2PVtdLHk9W10sKG4ucXNhPVEudGVzdChkLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKHVlKGZ1bmN0aW9uKGUpe2guYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitiKyInPjwvYT48c2VsZWN0IGlkPSciK2IrIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmeS5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8eS5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK1ArIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitiKyItXSIpLmxlbmd0aHx8eS5wdXNoKCJ+PSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHkucHVzaCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitiKyIrKiIpLmxlbmd0aHx8eS5wdXNoKCIuIy4rWyt+XSIpfSksdWUoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIHQ9ZC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3Quc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmeS5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ5LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksaC5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnkucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx5LnB1c2goIiwuKjoiKX0pKSwobi5tYXRjaGVzU2VsZWN0b3I9US50ZXN0KG09aC5tYXRjaGVzfHxoLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8aC5tb3pNYXRjaGVzU2VsZWN0b3J8fGgub01hdGNoZXNTZWxlY3Rvcnx8aC5tc01hdGNoZXNTZWxlY3RvcikpJiZ1ZShmdW5jdGlvbihlKXtuLmRpc2Nvbm5lY3RlZE1hdGNoPW0uY2FsbChlLCIqIiksbS5jYWxsKGUsIltzIT0nJ106eCIpLHYucHVzaCgiIT0iLFcpfSkseT15Lmxlbmd0aCYmbmV3IFJlZ0V4cCh5LmpvaW4oInwiKSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSksdD1RLnRlc3QoaC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikseD10fHxRLnRlc3QoaC5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxEPXQ/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gZj0hMCwwO3ZhciByPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiByfHwoMSYocj0oZS5vd25lckRvY3VtZW50fHxlKT09PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSl8fCFuLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PXI/ZT09PWR8fGUub3duZXJEb2N1bWVudD09PXcmJngodyxlKT8tMTp0PT09ZHx8dC5vd25lckRvY3VtZW50PT09dyYmeCh3LHQpPzE6Yz9PKGMsZSktTyhjLHQpOjA6NCZyPy0xOjEpfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBmPSEwLDA7dmFyIG4scj0wLGk9ZS5wYXJlbnROb2RlLG89dC5wYXJlbnROb2RlLGE9W2VdLHM9W3RdO2lmKCFpfHwhbylyZXR1cm4gZT09PWQ/LTE6dD09PWQ/MTppPy0xOm8/MTpjP08oYyxlKS1PKGMsdCk6MDtpZihpPT09bylyZXR1cm4gY2UoZSx0KTtuPWU7d2hpbGUobj1uLnBhcmVudE5vZGUpYS51bnNoaWZ0KG4pO249dDt3aGlsZShuPW4ucGFyZW50Tm9kZSlzLnVuc2hpZnQobik7d2hpbGUoYVtyXT09PXNbcl0pcisrO3JldHVybiByP2NlKGFbcl0sc1tyXSk6YVtyXT09PXc/LTE6c1tyXT09PXc/MTowfSxkKTpkfSxvZS5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG9lKGUsbnVsbCxudWxsLHQpfSxvZS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSx0KXtpZigoZS5vd25lckRvY3VtZW50fHxlKSE9PWQmJnAoZSksdD10LnJlcGxhY2UoeiwiPSckMSddIiksbi5tYXRjaGVzU2VsZWN0b3ImJmcmJiFTW3QrIiAiXSYmKCF2fHwhdi50ZXN0KHQpKSYmKCF5fHwheS50ZXN0KHQpKSl0cnl7dmFyIHI9bS5jYWxsKGUsdCk7aWYocnx8bi5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiByfWNhdGNoKGUpe31yZXR1cm4gb2UodCxkLG51bGwsW2VdKS5sZW5ndGg+MH0sb2UuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS5vd25lckRvY3VtZW50fHxlKSE9PWQmJnAoZSkseChlLHQpfSxvZS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPT1kJiZwKGUpO3ZhciBpPXIuYXR0ckhhbmRsZVt0LnRvTG93ZXJDYXNlKCldLG89aSYmTi5jYWxsKHIuYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP2koZSx0LCFnKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PW8/bzpuLmF0dHJpYnV0ZXN8fCFnP2UuZ2V0QXR0cmlidXRlKHQpOihvPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJm8uc3BlY2lmaWVkP28udmFsdWU6bnVsbH0sb2UuZXNjYXBlPWZ1bmN0aW9uKGUpe3JldHVybihlKyIiKS5yZXBsYWNlKHRlLG5lKX0sb2UuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSxvZS51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LHI9W10saT0wLG89MDtpZihmPSFuLmRldGVjdER1cGxpY2F0ZXMsYz0hbi5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydChEKSxmKXt3aGlsZSh0PWVbbysrXSl0PT09ZVtvXSYmKGk9ci5wdXNoKG8pKTt3aGlsZShpLS0pZS5zcGxpY2UocltpXSwxKX1yZXR1cm4gYz1udWxsLGV9LGk9b2UuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9MCxvPWUubm9kZVR5cGU7aWYobyl7aWYoMT09PW98fDk9PT1vfHwxMT09PW8pe2lmKCJzdHJpbmciPT10eXBlb2YgZS50ZXh0Q29udGVudClyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9aShlKX1lbHNlIGlmKDM9PT1vfHw0PT09bylyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSB3aGlsZSh0PWVbcisrXSluKz1pKHQpO3JldHVybiBufSwocj1vZS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpzZSxtYXRjaDpWLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnJlcGxhY2UoWixlZSksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UoWixlZSksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fG9lLmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJm9lLmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzZdJiZlWzJdO3JldHVybiBWLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXT9lWzJdPWVbNF18fGVbNV18fCIiOm4mJlgudGVzdChuKSYmKHQ9YShuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoWixlZSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9RVtlKyIgIl07cmV0dXJuIHR8fCh0PW5ldyBSZWdFeHAoIihefCIrTSsiKSIrZSsiKCIrTSsifCQpIikpJiZFKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdCgic3RyaW5nIj09dHlwZW9mIGUuY2xhc3NOYW1lJiZlLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIGk9b2UuYXR0cihyLGUpO3JldHVybiBudWxsPT1pPyIhPSI9PT10OiF0fHwoaSs9IiIsIj0iPT09dD9pPT09bjoiIT0iPT09dD9pIT09bjoiXj0iPT09dD9uJiYwPT09aS5pbmRleE9mKG4pOiIqPSI9PT10P24mJmkuaW5kZXhPZihuKT4tMToiJD0iPT09dD9uJiZpLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT10PygiICIraS5yZXBsYWNlKCQsIiAiKSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PXQmJihpPT09bnx8aS5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSIpKX19LENISUxEOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89Im50aCIhPT1lLnNsaWNlKDAsMyksYT0ibGFzdCIhPT1lLnNsaWNlKC00KSxzPSJvZi10eXBlIj09PXQ7cmV0dXJuIDE9PT1yJiYwPT09aT9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24odCxuLHUpe3ZhciBsLGMsZixwLGQsaCxnPW8hPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIseT10LnBhcmVudE5vZGUsdj1zJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbT0hdSYmIXMseD0hMTtpZih5KXtpZihvKXt3aGlsZShnKXtwPXQ7d2hpbGUocD1wW2ddKWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09djoxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtoPWc9Im9ubHkiPT09ZSYmIWgmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoaD1bYT95LmZpcnN0Q2hpbGQ6eS5sYXN0Q2hpbGRdLGEmJm0pe3g9KGQ9KGw9KGM9KGY9KHA9eSlbYl18fChwW2JdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbZV18fFtdKVswXT09PVQmJmxbMV0pJiZsWzJdLHA9ZCYmeS5jaGlsZE5vZGVzW2RdO3doaWxlKHA9KytkJiZwJiZwW2ddfHwoeD1kPTApfHxoLnBvcCgpKWlmKDE9PT1wLm5vZGVUeXBlJiYrK3gmJnA9PT10KXtjW2VdPVtULGQseF07YnJlYWt9fWVsc2UgaWYobSYmKHg9ZD0obD0oYz0oZj0ocD10KVtiXXx8KHBbYl09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVtlXXx8W10pWzBdPT09VCYmbFsxXSksITE9PT14KXdoaWxlKHA9KytkJiZwJiZwW2ddfHwoeD1kPTApfHxoLnBvcCgpKWlmKChzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXY6MT09PXAubm9kZVR5cGUpJiYrK3gmJihtJiYoKGM9KGY9cFtiXXx8KHBbYl09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVtlXT1bVCx4XSkscD09PXQpKWJyZWFrO3JldHVybih4LT1pKT09PXJ8fHglcj09MCYmeC9yPj0wfX19LFBTRVVETzpmdW5jdGlvbihlLHQpe3ZhciBuLGk9ci5wc2V1ZG9zW2VdfHxyLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8b2UuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIitlKTtyZXR1cm4gaVtiXT9pKHQpOmkubGVuZ3RoPjE/KG49W2UsZSwiIix0XSxyLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT9zZShmdW5jdGlvbihlLG4pe3ZhciByLG89aShlLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKWVbcj1PKGUsb1thXSldPSEobltyXT1vW2FdKX0pOmZ1bmN0aW9uKGUpe3JldHVybiBpKGUsMCxuKX0pOml9fSxwc2V1ZG9zOntub3Q6c2UoZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1bXSxyPXMoZS5yZXBsYWNlKEIsIiQxIikpO3JldHVybiByW2JdP3NlKGZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLGE9cihlLG51bGwsaSxbXSkscz1lLmxlbmd0aDt3aGlsZShzLS0pKG89YVtzXSkmJihlW3NdPSEodFtzXT1vKSl9KTpmdW5jdGlvbihlLGksbyl7cmV0dXJuIHRbMF09ZSxyKHQsbnVsbCxvLG4pLHRbMF09bnVsbCwhbi5wb3AoKX19KSxoYXM6c2UoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBvZShlLHQpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOnNlKGZ1bmN0aW9uKGUpe3JldHVybiBlPWUucmVwbGFjZShaLGVlKSxmdW5jdGlvbih0KXtyZXR1cm4odC50ZXh0Q29udGVudHx8dC5pbm5lclRleHR8fGkodCkpLmluZGV4T2YoZSk+LTF9fSksbGFuZzpzZShmdW5jdGlvbihlKXtyZXR1cm4gVS50ZXN0KGV8fCIiKXx8b2UuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrZSksZT1lLnJlcGxhY2UoWixlZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXt2YXIgbjtkb3tpZihuPWc/dC5sYW5nOnQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHx0LmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybihuPW4udG9Mb3dlckNhc2UoKSk9PT1lfHwwPT09bi5pbmRleE9mKGUrIi0iKX13aGlsZSgodD10LnBhcmVudE5vZGUpJiYxPT09dC5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKHQpe3ZhciBuPWUubG9jYXRpb24mJmUubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PXQuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1ofSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWQuYWN0aXZlRWxlbWVudCYmKCFkLmhhc0ZvY3VzfHxkLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmRlKCExKSxkaXNhYmxlZDpkZSghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIXIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBZLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBHLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PXQudG9Mb3dlckNhc2UoKSl9LGZpcnN0OmhlKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpoZShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6aGUoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjpoZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpoZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OmhlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOy0tcj49MDspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6aGUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0pLnBzZXVkb3MubnRoPXIucHNldWRvcy5lcTtmb3IodCBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlyLnBzZXVkb3NbdF09ZmUodCk7Zm9yKHQgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlyLnBzZXVkb3NbdF09cGUodCk7ZnVuY3Rpb24geWUoKXt9eWUucHJvdG90eXBlPXIuZmlsdGVycz1yLnBzZXVkb3Msci5zZXRGaWx0ZXJzPW5ldyB5ZSxhPW9lLnRva2VuaXplPWZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLGEscyx1LGwsYz1rW2UrIiAiXTtpZihjKXJldHVybiB0PzA6Yy5zbGljZSgwKTtzPWUsdT1bXSxsPXIucHJlRmlsdGVyO3doaWxlKHMpe24mJiEoaT1GLmV4ZWMocykpfHwoaSYmKHM9cy5zbGljZShpWzBdLmxlbmd0aCl8fHMpLHUucHVzaChvPVtdKSksbj0hMSwoaT1fLmV4ZWMocykpJiYobj1pLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6aVswXS5yZXBsYWNlKEIsIiAiKX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2ZvcihhIGluIHIuZmlsdGVyKSEoaT1WW2FdLmV4ZWMocykpfHxsW2FdJiYhKGk9bFthXShpKSl8fChuPWkuc2hpZnQoKSxvLnB1c2goe3ZhbHVlOm4sdHlwZTphLG1hdGNoZXM6aX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P3MubGVuZ3RoOnM/b2UuZXJyb3IoZSk6ayhlLHUpLnNsaWNlKDApfTtmdW5jdGlvbiB2ZShlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoLHI9IiI7dDxuO3QrKylyKz1lW3RdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIG1lKGUsdCxuKXt2YXIgcj10LmRpcixpPXQubmV4dCxvPWl8fHIsYT1uJiYicGFyZW50Tm9kZSI9PT1vLHM9QysrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixpKXt3aGlsZSh0PXRbcl0paWYoMT09PXQubm9kZVR5cGV8fGEpcmV0dXJuIGUodCxuLGkpO3JldHVybiExfTpmdW5jdGlvbih0LG4sdSl7dmFyIGwsYyxmLHA9W1Qsc107aWYodSl7d2hpbGUodD10W3JdKWlmKCgxPT09dC5ub2RlVHlwZXx8YSkmJmUodCxuLHUpKXJldHVybiEwfWVsc2Ugd2hpbGUodD10W3JdKWlmKDE9PT10Lm5vZGVUeXBlfHxhKWlmKGY9dFtiXXx8KHRbYl09e30pLGM9Zlt0LnVuaXF1ZUlEXXx8KGZbdC51bmlxdWVJRF09e30pLGkmJmk9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpdD10W3JdfHx0O2Vsc2V7aWYoKGw9Y1tvXSkmJmxbMF09PT1UJiZsWzFdPT09cylyZXR1cm4gcFsyXT1sWzJdO2lmKGNbb109cCxwWzJdPWUodCxuLHUpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB4ZShlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5jdGlvbih0LG4scil7dmFyIGk9ZS5sZW5ndGg7d2hpbGUoaS0tKWlmKCFlW2ldKHQsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06ZVswXX1mdW5jdGlvbiBiZShlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKW9lKGUsdFtyXSxuKTtyZXR1cm4gbn1mdW5jdGlvbiB3ZShlLHQsbixyLGkpe2Zvcih2YXIgbyxhPVtdLHM9MCx1PWUubGVuZ3RoLGw9bnVsbCE9dDtzPHU7cysrKShvPWVbc10pJiYobiYmIW4obyxyLGkpfHwoYS5wdXNoKG8pLGwmJnQucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIFRlKGUsdCxuLHIsaSxvKXtyZXR1cm4gciYmIXJbYl0mJihyPVRlKHIpKSxpJiYhaVtiXSYmKGk9VGUoaSxvKSksc2UoZnVuY3Rpb24obyxhLHMsdSl7dmFyIGwsYyxmLHA9W10sZD1bXSxoPWEubGVuZ3RoLGc9b3x8YmUodHx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLHk9IWV8fCFvJiZ0P2c6d2UoZyxwLGUscyx1KSx2PW4/aXx8KG8/ZTpofHxyKT9bXTphOnk7aWYobiYmbih5LHYscyx1KSxyKXtsPXdlKHYsZCkscihsLFtdLHMsdSksYz1sLmxlbmd0aDt3aGlsZShjLS0pKGY9bFtjXSkmJih2W2RbY11dPSEoeVtkW2NdXT1mKSl9aWYobyl7aWYoaXx8ZSl7aWYoaSl7bD1bXSxjPXYubGVuZ3RoO3doaWxlKGMtLSkoZj12W2NdKSYmbC5wdXNoKHlbY109Zik7aShudWxsLHY9W10sbCx1KX1jPXYubGVuZ3RoO3doaWxlKGMtLSkoZj12W2NdKSYmKGw9aT9PKG8sZik6cFtjXSk+LTEmJihvW2xdPSEoYVtsXT1mKSl9fWVsc2Ugdj13ZSh2PT09YT92LnNwbGljZShoLHYubGVuZ3RoKTp2KSxpP2kobnVsbCxhLHYsdSk6TC5hcHBseShhLHYpfSl9ZnVuY3Rpb24gQ2UoZSl7Zm9yKHZhciB0LG4saSxvPWUubGVuZ3RoLGE9ci5yZWxhdGl2ZVtlWzBdLnR5cGVdLHM9YXx8ci5yZWxhdGl2ZVsiICJdLHU9YT8xOjAsYz1tZShmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9LHMsITApLGY9bWUoZnVuY3Rpb24oZSl7cmV0dXJuIE8odCxlKT4tMX0scywhMCkscD1bZnVuY3Rpb24oZSxuLHIpe3ZhciBpPSFhJiYocnx8biE9PWwpfHwoKHQ9bikubm9kZVR5cGU/YyhlLG4scik6ZihlLG4scikpO3JldHVybiB0PW51bGwsaX1dO3U8bzt1KyspaWYobj1yLnJlbGF0aXZlW2VbdV0udHlwZV0pcD1bbWUoeGUocCksbildO2Vsc2V7aWYoKG49ci5maWx0ZXJbZVt1XS50eXBlXS5hcHBseShudWxsLGVbdV0ubWF0Y2hlcykpW2JdKXtmb3IoaT0rK3U7aTxvO2krKylpZihyLnJlbGF0aXZlW2VbaV0udHlwZV0pYnJlYWs7cmV0dXJuIFRlKHU+MSYmeGUocCksdT4xJiZ2ZShlLnNsaWNlKDAsdS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbdS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKEIsIiQxIiksbix1PGkmJkNlKGUuc2xpY2UodSxpKSksaTxvJiZDZShlPWUuc2xpY2UoaSkpLGk8byYmdmUoZSkpfXAucHVzaChuKX1yZXR1cm4geGUocCl9ZnVuY3Rpb24gRWUoZSx0KXt2YXIgbj10Lmxlbmd0aD4wLGk9ZS5sZW5ndGg+MCxvPWZ1bmN0aW9uKG8sYSxzLHUsYyl7dmFyIGYsaCx5LHY9MCxtPSIwIix4PW8mJltdLGI9W10sdz1sLEM9b3x8aSYmci5maW5kLlRBRygiKiIsYyksRT1UKz1udWxsPT13PzE6TWF0aC5yYW5kb20oKXx8LjEsaz1DLmxlbmd0aDtmb3IoYyYmKGw9YT09PWR8fGF8fGMpO20hPT1rJiZudWxsIT0oZj1DW21dKTttKyspe2lmKGkmJmYpe2g9MCxhfHxmLm93bmVyRG9jdW1lbnQ9PT1kfHwocChmKSxzPSFnKTt3aGlsZSh5PWVbaCsrXSlpZih5KGYsYXx8ZCxzKSl7dS5wdXNoKGYpO2JyZWFrfWMmJihUPUUpfW4mJigoZj0heSYmZikmJnYtLSxvJiZ4LnB1c2goZikpfWlmKHYrPW0sbiYmbSE9PXYpe2g9MDt3aGlsZSh5PXRbaCsrXSl5KHgsYixhLHMpO2lmKG8pe2lmKHY+MCl3aGlsZShtLS0peFttXXx8YlttXXx8KGJbbV09ai5jYWxsKHUpKTtiPXdlKGIpfUwuYXBwbHkodSxiKSxjJiYhbyYmYi5sZW5ndGg+MCYmdit0Lmxlbmd0aD4xJiZvZS51bmlxdWVTb3J0KHUpfXJldHVybiBjJiYoVD1FLGw9dykseH07cmV0dXJuIG4/c2Uobyk6b31yZXR1cm4gcz1vZS5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPVtdLG89U1tlKyIgIl07aWYoIW8pe3R8fCh0PWEoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKShvPUNlKHRbbl0pKVtiXT9yLnB1c2gobyk6aS5wdXNoKG8pOyhvPVMoZSxFZShpLHIpKSkuc2VsZWN0b3I9ZX1yZXR1cm4gb30sdT1vZS5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4saSl7dmFyIG8sdSxsLGMsZixwPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLGQ9IWkmJmEoZT1wLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1kLmxlbmd0aCl7aWYoKHU9ZFswXT1kWzBdLnNsaWNlKDApKS5sZW5ndGg+MiYmIklEIj09PShsPXVbMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZnJiZyLnJlbGF0aXZlW3VbMV0udHlwZV0pe2lmKCEodD0oci5maW5kLklEKGwubWF0Y2hlc1swXS5yZXBsYWNlKFosZWUpLHQpfHxbXSlbMF0pKXJldHVybiBuO3AmJih0PXQucGFyZW50Tm9kZSksZT1lLnNsaWNlKHUuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfW89Vi5uZWVkc0NvbnRleHQudGVzdChlKT8wOnUubGVuZ3RoO3doaWxlKG8tLSl7aWYobD11W29dLHIucmVsYXRpdmVbYz1sLnR5cGVdKWJyZWFrO2lmKChmPXIuZmluZFtjXSkmJihpPWYobC5tYXRjaGVzWzBdLnJlcGxhY2UoWixlZSksSy50ZXN0KHVbMF0udHlwZSkmJmdlKHQucGFyZW50Tm9kZSl8fHQpKSl7aWYodS5zcGxpY2UobywxKSwhKGU9aS5sZW5ndGgmJnZlKHUpKSlyZXR1cm4gTC5hcHBseShuLGkpLG47YnJlYWt9fX1yZXR1cm4ocHx8cyhlLGQpKShpLHQsIWcsbiwhdHx8Sy50ZXN0KGUpJiZnZSh0LnBhcmVudE5vZGUpfHx0KSxufSxuLnNvcnRTdGFibGU9Yi5zcGxpdCgiIikuc29ydChEKS5qb2luKCIiKT09PWIsbi5kZXRlY3REdXBsaWNhdGVzPSEhZixwKCksbi5zb3J0RGV0YWNoZWQ9dWUoZnVuY3Rpb24oZSl7cmV0dXJuIDEmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksdWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8bGUoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGUsdCxuKXtpZighbilyZXR1cm4gZS5nZXRBdHRyaWJ1dGUodCwidHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/MToyKX0pLG4uYXR0cmlidXRlcyYmdWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8aW5wdXQvPiIsZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8bGUoInZhbHVlIixmdW5jdGlvbihlLHQsbil7aWYoIW4mJiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGUuZGVmYXVsdFZhbHVlfSksdWUoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGxlKFAsZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKCFuKXJldHVybiEwPT09ZVt0XT90LnRvTG93ZXJDYXNlKCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSksb2V9KGUpO3cuZmluZD1FLHcuZXhwcj1FLnNlbGVjdG9ycyx3LmV4cHJbIjoiXT13LmV4cHIucHNldWRvcyx3LnVuaXF1ZVNvcnQ9dy51bmlxdWU9RS51bmlxdWVTb3J0LHcudGV4dD1FLmdldFRleHQsdy5pc1hNTERvYz1FLmlzWE1MLHcuY29udGFpbnM9RS5jb250YWlucyx3LmVzY2FwZVNlbGVjdG9yPUUuZXNjYXBlO3ZhciBrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxpPXZvaWQgMCE9PW47d2hpbGUoKGU9ZVt0XSkmJjkhPT1lLm5vZGVUeXBlKWlmKDE9PT1lLm5vZGVUeXBlKXtpZihpJiZ3KGUpLmlzKG4pKWJyZWFrO3IucHVzaChlKX1yZXR1cm4gcn0sUz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXTtlO2U9ZS5uZXh0U2libGluZykxPT09ZS5ub2RlVHlwZSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn0sRD13LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O2Z1bmN0aW9uIE4oZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfXZhciBBPS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIGooZSx0LG4pe3JldHVybiBnKHQpP3cuZ3JlcChlLGZ1bmN0aW9uKGUscil7cmV0dXJuISF0LmNhbGwoZSxyLGUpIT09bn0pOnQubm9kZVR5cGU/dy5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10IT09bn0pOiJzdHJpbmciIT10eXBlb2YgdD93LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gdS5jYWxsKHQsZSk+LTEhPT1ufSk6dy5maWx0ZXIodCxlLG4pfXcuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP3cuZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106dy5maW5kLm1hdGNoZXMoZSx3LmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LHcuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayh3KGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7dDxyO3QrKylpZih3LmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKXcuZmluZChlLGlbdF0sbik7cmV0dXJuIHI+MT93LnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITApKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFqKHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZELnRlc3QoZSk/dyhlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBxLEw9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsody5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxvO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8cSwic3RyaW5nIj09dHlwZW9mIGUpe2lmKCEoaT0iPCI9PT1lWzBdJiYiPiI9PT1lW2UubGVuZ3RoLTFdJiZlLmxlbmd0aD49Mz9bbnVsbCxlLG51bGxdOkwuZXhlYyhlKSl8fCFpWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoaVsxXSl7aWYodD10IGluc3RhbmNlb2Ygdz90WzBdOnQsdy5tZXJnZSh0aGlzLHcucGFyc2VIVE1MKGlbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6ciwhMCkpLEEudGVzdChpWzFdKSYmdy5pc1BsYWluT2JqZWN0KHQpKWZvcihpIGluIHQpZyh0aGlzW2ldKT90aGlzW2ldKHRbaV0pOnRoaXMuYXR0cihpLHRbaV0pO3JldHVybiB0aGlzfXJldHVybihvPXIuZ2V0RWxlbWVudEJ5SWQoaVsyXSkpJiYodGhpc1swXT1vLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOmcoZSk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KGUpOmUodyk6dy5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT13LmZuLHE9dyhyKTt2YXIgSD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxPPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O3cuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9dyhlLHRoaXMpLG49dC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxuO2UrKylpZih3LmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT0ic3RyaW5nIiE9dHlwZW9mIGUmJncoZSk7aWYoIUQudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZ3LmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKG8ubGVuZ3RoPjE/dy51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/dS5jYWxsKHcoZSksdGhpc1swXSk6dS5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayh3LnVuaXF1ZVNvcnQody5tZXJnZSh0aGlzLmdldCgpLHcoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSk7ZnVuY3Rpb24gUChlLHQpe3doaWxlKChlPWVbdF0pJiYxIT09ZS5ub2RlVHlwZSk7cmV0dXJuIGV9dy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gayhlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gUChlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBQKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGsoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGsoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBrKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBTKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gUyhlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gTihlLCJpZnJhbWUiKT9lLmNvbnRlbnREb2N1bWVudDooTihlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLHcubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24obixyKXt2YXIgaT13Lm1hcCh0aGlzLHQsbik7cmV0dXJuIlVudGlsIiE9PWUuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihpPXcuZmlsdGVyKHIsaSkpLHRoaXMubGVuZ3RoPjEmJihPW2VdfHx3LnVuaXF1ZVNvcnQoaSksSC50ZXN0KGUpJiZpLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2soaSl9fSk7dmFyIE09L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBSKGUpe3ZhciB0PXt9O3JldHVybiB3LmVhY2goZS5tYXRjaChNKXx8W10sZnVuY3Rpb24oZSxuKXt0W25dPSEwfSksdH13LkNhbGxiYWNrcz1mdW5jdGlvbihlKXtlPSJzdHJpbmciPT10eXBlb2YgZT9SKGUpOncuZXh0ZW5kKHt9LGUpO3ZhciB0LG4scixpLG89W10sYT1bXSxzPS0xLHU9ZnVuY3Rpb24oKXtmb3IoaT1pfHxlLm9uY2Uscj10PSEwO2EubGVuZ3RoO3M9LTEpe249YS5zaGlmdCgpO3doaWxlKCsrczxvLmxlbmd0aCkhMT09PW9bc10uYXBwbHkoblswXSxuWzFdKSYmZS5zdG9wT25GYWxzZSYmKHM9by5sZW5ndGgsbj0hMSl9ZS5tZW1vcnl8fChuPSExKSx0PSExLGkmJihvPW4/W106IiIpfSxsPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG4mJiF0JiYocz1vLmxlbmd0aC0xLGEucHVzaChuKSksZnVuY3Rpb24gdChuKXt3LmVhY2gobixmdW5jdGlvbihuLHIpe2cocik/ZS51bmlxdWUmJmwuaGFzKHIpfHxvLnB1c2gocik6ciYmci5sZW5ndGgmJiJzdHJpbmciIT09eChyKSYmdChyKX0pfShhcmd1bWVudHMpLG4mJiF0JiZ1KCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB3LmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGUsdCl7dmFyIG47d2hpbGUoKG49dy5pbkFycmF5KHQsbyxuKSk+LTEpby5zcGxpY2UobiwxKSxuPD1zJiZzLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/dy5pbkFycmF5KGUsbyk+LTE6by5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG89W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gaT1hPVtdLG89bj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFvfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9YT1bXSxufHx0fHwobz1uPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWl9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsbil7cmV0dXJuIGl8fChuPVtlLChuPW58fFtdKS5zbGljZT9uLnNsaWNlKCk6bl0sYS5wdXNoKG4pLHR8fHUoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBsLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBsfTtmdW5jdGlvbiBJKGUpe3JldHVybiBlfWZ1bmN0aW9uIFcoZSl7dGhyb3cgZX1mdW5jdGlvbiAkKGUsdCxuLHIpe3ZhciBpO3RyeXtlJiZnKGk9ZS5wcm9taXNlKT9pLmNhbGwoZSkuZG9uZSh0KS5mYWlsKG4pOmUmJmcoaT1lLnRoZW4pP2kuY2FsbChlLHQsbik6dC5hcHBseSh2b2lkIDAsW2VdLnNsaWNlKHIpKX1jYXRjaChlKXtuLmFwcGx5KHZvaWQgMCxbZV0pfX13LmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24odCl7dmFyIG49W1sibm90aWZ5IiwicHJvZ3Jlc3MiLHcuQ2FsbGJhY2tzKCJtZW1vcnkiKSx3LkNhbGxiYWNrcygibWVtb3J5IiksMl0sWyJyZXNvbHZlIiwiZG9uZSIsdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMCwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLHI9InBlbmRpbmciLGk9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBvLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sImNhdGNoIjpmdW5jdGlvbihlKXtyZXR1cm4gaS50aGVuKG51bGwsZSl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7cmV0dXJuIHcuRGVmZXJyZWQoZnVuY3Rpb24odCl7dy5lYWNoKG4sZnVuY3Rpb24obixyKXt2YXIgaT1nKGVbcls0XV0pJiZlW3JbNF1dO29bclsxXV0oZnVuY3Rpb24oKXt2YXIgZT1pJiZpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlJiZnKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkucHJvZ3Jlc3ModC5ub3RpZnkpLmRvbmUodC5yZXNvbHZlKS5mYWlsKHQucmVqZWN0KTp0W3JbMF0rIldpdGgiXSh0aGlzLGk/W2VdOmFyZ3VtZW50cyl9KX0pLGU9bnVsbH0pLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbih0LHIsaSl7dmFyIG89MDtmdW5jdGlvbiBhKHQsbixyLGkpe3JldHVybiBmdW5jdGlvbigpe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMsbD1mdW5jdGlvbigpe3ZhciBlLGw7aWYoISh0PG8pKXtpZigoZT1yLmFwcGx5KHMsdSkpPT09bi5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7bD1lJiYoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJmUudGhlbixnKGwpP2k/bC5jYWxsKGUsYShvLG4sSSxpKSxhKG8sbixXLGkpKToobysrLGwuY2FsbChlLGEobyxuLEksaSksYShvLG4sVyxpKSxhKG8sbixJLG4ubm90aWZ5V2l0aCkpKToociE9PUkmJihzPXZvaWQgMCx1PVtlXSksKGl8fG4ucmVzb2x2ZVdpdGgpKHMsdSkpfX0sYz1pP2w6ZnVuY3Rpb24oKXt0cnl7bCgpfWNhdGNoKGUpe3cuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYmdy5EZWZlcnJlZC5leGNlcHRpb25Ib29rKGUsYy5zdGFja1RyYWNlKSx0KzE+PW8mJihyIT09VyYmKHM9dm9pZCAwLHU9W2VdKSxuLnJlamVjdFdpdGgocyx1KSl9fTt0P2MoKToody5EZWZlcnJlZC5nZXRTdGFja0hvb2smJihjLnN0YWNrVHJhY2U9dy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksZS5zZXRUaW1lb3V0KGMpKX19cmV0dXJuIHcuRGVmZXJyZWQoZnVuY3Rpb24oZSl7blswXVszXS5hZGQoYSgwLGUsZyhpKT9pOkksZS5ub3RpZnlXaXRoKSksblsxXVszXS5hZGQoYSgwLGUsZyh0KT90OkkpKSxuWzJdWzNdLmFkZChhKDAsZSxnKHIpP3I6VykpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lP3cuZXh0ZW5kKGUsaSk6aX19LG89e307cmV0dXJuIHcuZWFjaChuLGZ1bmN0aW9uKGUsdCl7dmFyIGE9dFsyXSxzPXRbNV07aVt0WzFdXT1hLmFkZCxzJiZhLmFkZChmdW5jdGlvbigpe3I9c30sblszLWVdWzJdLmRpc2FibGUsblszLWVdWzNdLmRpc2FibGUsblswXVsyXS5sb2NrLG5bMF1bM10ubG9jayksYS5hZGQodFszXS5maXJlKSxvW3RbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIG9bdFswXSsiV2l0aCJdKHRoaXM9PT1vP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sb1t0WzBdKyJXaXRoIl09YS5maXJlV2l0aH0pLGkucHJvbWlzZShvKSx0JiZ0LmNhbGwobyxvKSxvfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj10LHI9QXJyYXkobiksaT1vLmNhbGwoYXJndW1lbnRzKSxhPXcuRGVmZXJyZWQoKSxzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuKXtyW2VdPXRoaXMsaVtlXT1hcmd1bWVudHMubGVuZ3RoPjE/by5jYWxsKGFyZ3VtZW50cyk6biwtLXR8fGEucmVzb2x2ZVdpdGgocixpKX19O2lmKHQ8PTEmJigkKGUsYS5kb25lKHMobikpLnJlc29sdmUsYS5yZWplY3QsIXQpLCJwZW5kaW5nIj09PWEuc3RhdGUoKXx8ZyhpW25dJiZpW25dLnRoZW4pKSlyZXR1cm4gYS50aGVuKCk7d2hpbGUobi0tKSQoaVtuXSxzKG4pLGEucmVqZWN0KTtyZXR1cm4gYS5wcm9taXNlKCl9fSk7dmFyIEI9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87dy5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKHQsbil7ZS5jb25zb2xlJiZlLmNvbnNvbGUud2FybiYmdCYmQi50ZXN0KHQubmFtZSkmJmUuY29uc29sZS53YXJuKCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiAiK3QubWVzc2FnZSx0LnN0YWNrLG4pfSx3LnJlYWR5RXhjZXB0aW9uPWZ1bmN0aW9uKHQpe2Uuc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IHR9KX07dmFyIEY9dy5EZWZlcnJlZCgpO3cuZm4ucmVhZHk9ZnVuY3Rpb24oZSl7cmV0dXJuIEYudGhlbihlKVsiY2F0Y2giXShmdW5jdGlvbihlKXt3LnJlYWR5RXhjZXB0aW9uKGUpfSksdGhpc30sdy5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oZSl7KCEwPT09ZT8tLXcucmVhZHlXYWl0OncuaXNSZWFkeSl8fCh3LmlzUmVhZHk9ITAsITAhPT1lJiYtLXcucmVhZHlXYWl0PjB8fEYucmVzb2x2ZVdpdGgocixbd10pKX19KSx3LnJlYWR5LnRoZW49Ri50aGVuO2Z1bmN0aW9uIF8oKXtyLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLF8pLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsXyksdy5yZWFkeSgpfSJjb21wbGV0ZSI9PT1yLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PXIucmVhZHlTdGF0ZSYmIXIuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2Uuc2V0VGltZW91dCh3LnJlYWR5KTooci5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixfKSxlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLF8pKTt2YXIgej1mdW5jdGlvbihlLHQsbixyLGksbyxhKXt2YXIgcz0wLHU9ZS5sZW5ndGgsbD1udWxsPT1uO2lmKCJvYmplY3QiPT09eChuKSl7aT0hMDtmb3IocyBpbiBuKXooZSx0LHMsbltzXSwhMCxvLGEpfWVsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsZyhyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbCh3KGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LFg9L14tbXMtLyxVPS8tKFthLXpdKS9nO2Z1bmN0aW9uIFYoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIEcoZSl7cmV0dXJuIGUucmVwbGFjZShYLCJtcy0iKS5yZXBsYWNlKFUsVil9dmFyIFk9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBRKCl7dGhpcy5leHBhbmRvPXcuZXhwYW5kbytRLnVpZCsrfVEudWlkPTEsUS5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9e30sWShlKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdGhpcy5leHBhbmRvLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pKSksdH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMuY2FjaGUoZSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KWlbRyh0KV09bjtlbHNlIGZvcihyIGluIHQpaVtHKHIpXT10W3JdO3JldHVybiBpfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW0codCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJnZvaWQgMD09PW4/dGhpcy5nZXQoZSx0KToodGhpcy5zZXQoZSx0LG4pLHZvaWQgMCE9PW4/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09dCl7bj0odD1BcnJheS5pc0FycmF5KHQpP3QubWFwKEcpOih0PUcodCkpaW4gcj9bdF06dC5tYXRjaChNKXx8W10pLmxlbmd0aDt3aGlsZShuLS0pZGVsZXRlIHJbdFtuXV19KHZvaWQgMD09PXR8fHcuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIXcuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBKPW5ldyBRLEs9bmV3IFEsWj0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLGVlPS9bQS1aXS9nO2Z1bmN0aW9uIHRlKGUpe3JldHVybiJ0cnVlIj09PWV8fCJmYWxzZSIhPT1lJiYoIm51bGwiPT09ZT9udWxsOmU9PT0rZSsiIj8rZTpaLnRlc3QoZSk/SlNPTi5wYXJzZShlKTplKX1mdW5jdGlvbiBuZShlLHQsbil7dmFyIHI7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShlZSwiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49ZS5nZXRBdHRyaWJ1dGUocikpKXt0cnl7bj10ZShuKX1jYXRjaChlKXt9Sy5zZXQoZSx0LG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59dy5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIEsuaGFzRGF0YShlKXx8Si5oYXNEYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gSy5hY2Nlc3MoZSx0LG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7Sy5yZW1vdmUoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBKLmFjY2VzcyhlLHQsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7Si5yZW1vdmUoZSx0KX19KSx3LmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvPXRoaXNbMF0sYT1vJiZvLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09ZSl7aWYodGhpcy5sZW5ndGgmJihpPUsuZ2V0KG8pLDE9PT1vLm5vZGVUeXBlJiYhSi5nZXQobywiaGFzRGF0YUF0dHJzIikpKXtuPWEubGVuZ3RoO3doaWxlKG4tLSlhW25dJiYwPT09KHI9YVtuXS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpJiYocj1HKHIuc2xpY2UoNSkpLG5lKG8scixpW3JdKSk7Si5zZXQobywiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGl9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP3RoaXMuZWFjaChmdW5jdGlvbigpe0suc2V0KHRoaXMsZSl9KTp6KHRoaXMsZnVuY3Rpb24odCl7dmFyIG47aWYobyYmdm9pZCAwPT09dCl7aWYodm9pZCAwIT09KG49Sy5nZXQobyxlKSkpcmV0dXJuIG47aWYodm9pZCAwIT09KG49bmUobyxlKSkpcmV0dXJuIG59ZWxzZSB0aGlzLmVhY2goZnVuY3Rpb24oKXtLLnNldCh0aGlzLGUsdCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Sy5yZW1vdmUodGhpcyxlKX0pfX0pLHcuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoZSlyZXR1cm4gdD0odHx8ImZ4IikrInF1ZXVlIixyPUouZ2V0KGUsdCksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9Si5hY2Nlc3MoZSx0LHcubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKGUsdCl7dD10fHwiZngiO3ZhciBuPXcucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89dy5fcXVldWVIb29rcyhlLHQpLGE9ZnVuY3Rpb24oKXt3LmRlcXVldWUoZSx0KX07ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGEsbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gSi5nZXQoZSxuKXx8Si5hY2Nlc3MoZSxuLHtlbXB0eTp3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtKLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSx3LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPSJmeCIsbi0tKSxhcmd1bWVudHMubGVuZ3RoPG4/dy5xdWV1ZSh0aGlzWzBdLGUpOnZvaWQgMD09PXQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj13LnF1ZXVlKHRoaXMsZSx0KTt3Ll9xdWV1ZUhvb2tzKHRoaXMsZSksImZ4Ij09PWUmJiJpbnByb2dyZXNzIiE9PW5bMF0mJncuZGVxdWV1ZSh0aGlzLGUpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3cuZGVxdWV1ZSh0aGlzLGUpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTEsaT13LkRlZmVycmVkKCksbz10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8aS5yZXNvbHZlV2l0aChvLFtvXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHwiZngiO3doaWxlKGEtLSkobj1KLmdldChvW2FdLGUrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksaS5wcm9taXNlKHQpfX0pO3ZhciByZT0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxpZT1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrcmUrIikoW2EteiVdKikkIiwiaSIpLG9lPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sYWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmdy5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSkmJiJub25lIj09PXcuY3NzKGUsImRpc3BsYXkiKX0sc2U9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhPXt9O2ZvcihvIGluIHQpYVtvXT1lLnN0eWxlW29dLGUuc3R5bGVbb109dFtvXTtpPW4uYXBwbHkoZSxyfHxbXSk7Zm9yKG8gaW4gdCllLnN0eWxlW29dPWFbb107cmV0dXJuIGl9O2Z1bmN0aW9uIHVlKGUsdCxuLHIpe3ZhciBpLG8sYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gdy5jc3MoZSx0LCIiKX0sdT1zKCksbD1uJiZuWzNdfHwody5jc3NOdW1iZXJbdF0/IiI6InB4IiksYz0ody5jc3NOdW1iZXJbdF18fCJweCIhPT1sJiYrdSkmJmllLmV4ZWMody5jc3MoZSx0KSk7aWYoYyYmY1szXSE9PWwpe3UvPTIsbD1sfHxjWzNdLGM9K3V8fDE7d2hpbGUoYS0tKXcuc3R5bGUoZSx0LGMrbCksKDEtbykqKDEtKG89cygpL3V8fC41KSk8PTAmJihhPTApLGMvPW87Yyo9Mix3LnN0eWxlKGUsdCxjK2wpLG49bnx8W119cmV0dXJuIG4mJihjPStjfHwrdXx8MCxpPW5bMV0/YysoblsxXSsxKSpuWzJdOituWzJdLHImJihyLnVuaXQ9bCxyLnN0YXJ0PWMsci5lbmQ9aSkpLGl9dmFyIGxlPXt9O2Z1bmN0aW9uIGNlKGUpe3ZhciB0LG49ZS5vd25lckRvY3VtZW50LHI9ZS5ub2RlTmFtZSxpPWxlW3JdO3JldHVybiBpfHwodD1uLmJvZHkuYXBwZW5kQ2hpbGQobi5jcmVhdGVFbGVtZW50KHIpKSxpPXcuY3NzKHQsImRpc3BsYXkiKSx0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksIm5vbmUiPT09aSYmKGk9ImJsb2NrIiksbGVbcl09aSxpKX1mdW5jdGlvbiBmZShlLHQpe2Zvcih2YXIgbixyLGk9W10sbz0wLGE9ZS5sZW5ndGg7bzxhO28rKykocj1lW29dKS5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LHQ/KCJub25lIj09PW4mJihpW29dPUouZ2V0KHIsImRpc3BsYXkiKXx8bnVsbCxpW29dfHwoci5zdHlsZS5kaXNwbGF5PSIiKSksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJmFlKHIpJiYoaVtvXT1jZShyKSkpOiJub25lIiE9PW4mJihpW29dPSJub25lIixKLnNldChyLCJkaXNwbGF5IixuKSkpO2ZvcihvPTA7bzxhO28rKyludWxsIT1pW29dJiYoZVtvXS5zdHlsZS5kaXNwbGF5PWlbb10pO3JldHVybiBlfXcuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIGZlKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIGZlKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2FlKHRoaXMpP3codGhpcykuc2hvdygpOncodGhpcykuaGlkZSgpfSl9fSk7dmFyIHBlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLGRlPS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pLGhlPS9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxnZT17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2dlLm9wdGdyb3VwPWdlLm9wdGlvbixnZS50Ym9keT1nZS50Zm9vdD1nZS5jb2xncm91cD1nZS5jYXB0aW9uPWdlLnRoZWFkLGdlLnRoPWdlLnRkO2Z1bmN0aW9uIHllKGUsdCl7dmFyIG47cmV0dXJuIG49InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHx8IioiKToidW5kZWZpbmVkIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbD9lLnF1ZXJ5U2VsZWN0b3JBbGwodHx8IioiKTpbXSx2b2lkIDA9PT10fHx0JiZOKGUsdCk/dy5tZXJnZShbZV0sbik6bn1mdW5jdGlvbiB2ZShlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylKLnNldChlW25dLCJnbG9iYWxFdmFsIiwhdHx8Si5nZXQodFtuXSwiZ2xvYmFsRXZhbCIpKX12YXIgbWU9Lzx8JiM/XHcrOy87ZnVuY3Rpb24geGUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZigib2JqZWN0Ij09PXgobykpdy5tZXJnZShwLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYobWUudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KGRlLmV4ZWMobyl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1nZVtzXXx8Z2UuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXSt3Lmh0bWxQcmVmaWx0ZXIobykrdVsyXSxjPXVbMF07d2hpbGUoYy0tKWE9YS5sYXN0Q2hpbGQ7dy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtmLnRleHRDb250ZW50PSIiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiZ3LmluQXJyYXkobyxyKT4tMSlpJiZpLnB1c2gobyk7ZWxzZSBpZihsPXcuY29udGFpbnMoby5vd25lckRvY3VtZW50LG8pLGE9eWUoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksbCYmdmUoYSksbil7Yz0wO3doaWxlKG89YVtjKytdKWhlLnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKX1yZXR1cm4gZn0hZnVuY3Rpb24oKXt2YXIgZT1yLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChyLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSx0PXIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksdC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksZS5hcHBlbmRDaGlsZCh0KSxoLmNoZWNrQ2xvbmU9ZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsZS5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLGgubm9DbG9uZUNoZWNrZWQ9ISFlLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZX0oKTt2YXIgYmU9ci5kb2N1bWVudEVsZW1lbnQsd2U9L15rZXkvLFRlPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxDZT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gRWUoKXtyZXR1cm4hMH1mdW5jdGlvbiBrZSgpe3JldHVybiExfWZ1bmN0aW9uIFNlKCl7dHJ5e3JldHVybiByLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX1mdW5jdGlvbiBEZShlLHQsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIHQpeyJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCk7Zm9yKHMgaW4gdClEZShlLHMsbixyLHRbc10sbyk7cmV0dXJuIGV9aWYobnVsbD09ciYmbnVsbD09aT8oaT1uLHI9bj12b2lkIDApOm51bGw9PWkmJigic3RyaW5nIj09dHlwZW9mIG4/KGk9cixyPXZvaWQgMCk6KGk9cixyPW4sbj12b2lkIDApKSwhMT09PWkpaT1rZTtlbHNlIGlmKCFpKXJldHVybiBlO3JldHVybiAxPT09byYmKGE9aSwoaT1mdW5jdGlvbihlKXtyZXR1cm4gdygpLm9mZihlKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPXcuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC5hZGQodGhpcyx0LGkscixuKX0pfXcuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHk9Si5nZXQoZSk7aWYoeSl7bi5oYW5kbGVyJiYobj0obz1uKS5oYW5kbGVyLGk9by5zZWxlY3RvciksaSYmdy5maW5kLm1hdGNoZXNTZWxlY3RvcihiZSxpKSxuLmd1aWR8fChuLmd1aWQ9dy5ndWlkKyspLCh1PXkuZXZlbnRzKXx8KHU9eS5ldmVudHM9e30pLChhPXkuaGFuZGxlKXx8KGE9eS5oYW5kbGU9ZnVuY3Rpb24odCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB3JiZ3LmV2ZW50LnRyaWdnZXJlZCE9PXQudHlwZT93LmV2ZW50LmRpc3BhdGNoLmFwcGx5KGUsYXJndW1lbnRzKTp2b2lkIDB9KSxsPSh0PSh0fHwiIikubWF0Y2goTSl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0pZD1nPShzPUNlLmV4ZWModFtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShpP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkLGY9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxjPXcuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJncuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LG8pLChwPXVbZF0pfHwoKHA9dVtkXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKGUscixoLGEpfHxlLmFkZEV2ZW50TGlzdGVuZXImJmUuYWRkRXZlbnRMaXN0ZW5lcihkLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwoZSxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpwLnB1c2goYyksdy5ldmVudC5nbG9iYWxbZF09ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx5PUouaGFzRGF0YShlKSYmSi5nZXQoZSk7aWYoeSYmKHU9eS5ldmVudHMpKXtsPSh0PSh0fHwiIikubWF0Y2goTSl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0paWYocz1DZS5leGVjKHRbbF0pfHxbXSxkPWc9c1sxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7Zj13LmV2ZW50LnNwZWNpYWxbZF18fHt9LHA9dVtkPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJigiKioiIT09cnx8IWMuc2VsZWN0b3IpfHwocC5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbChlLGMpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbChlLGgseS5oYW5kbGUpfHx3LnJlbW92ZUV2ZW50KGUsZCx5LmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSl3LmV2ZW50LnJlbW92ZShlLGQrdFtsXSxuLHIsITApO3cuaXNFbXB0eU9iamVjdCh1KSYmSi5yZW1vdmUoZSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5ldmVudC5maXgoZSksbixyLGksbyxhLHMsdT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksbD0oSi5nZXQodGhpcywiZXZlbnRzIil8fHt9KVt0LnR5cGVdfHxbXSxjPXcuZXZlbnQuc3BlY2lhbFt0LnR5cGVdfHx7fTtmb3IodVswXT10LG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXVbbl09YXJndW1lbnRzW25dO2lmKHQuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8ITEhPT1jLnByZURpc3BhdGNoLmNhbGwodGhpcyx0KSl7cz13LmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyx0LGwpLG49MDt3aGlsZSgobz1zW24rK10pJiYhdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXt0LmN1cnJlbnRUYXJnZXQ9by5lbGVtLHI9MDt3aGlsZSgoYT1vLmhhbmRsZXJzW3IrK10pJiYhdC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKXQucm5hbWVzcGFjZSYmIXQucm5hbWVzcGFjZS50ZXN0KGEubmFtZXNwYWNlKXx8KHQuaGFuZGxlT2JqPWEsdC5kYXRhPWEuZGF0YSx2b2lkIDAhPT0oaT0oKHcuZXZlbnQuc3BlY2lhbFthLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8YS5oYW5kbGVyKS5hcHBseShvLmVsZW0sdSkpJiYhMT09PSh0LnJlc3VsdD1pKSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsdCksdC5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoImNsaWNrIj09PWUudHlwZSYmZS5idXR0b24+PTEpKWZvcig7bCE9PXRoaXM7bD1sLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWwubm9kZVR5cGUmJigiY2xpY2siIT09ZS50eXBlfHwhMCE9PWwuZGlzYWJsZWQpKXtmb3Iobz1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbaT0ocj10W25dKS5zZWxlY3RvcisiICJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD93KGksdGhpcykuaW5kZXgobCk+LTE6dy5maW5kKGksdGhpcyxudWxsLFtsXSkubGVuZ3RoKSxhW2ldJiZvLnB1c2gocik7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOm99KX1yZXR1cm4gbD10aGlzLHU8dC5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOnQuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHcuRXZlbnQucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpnKHQpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0KHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbZV19LHNldDpmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVt3LmV4cGFuZG9dP2U6bmV3IHcuRXZlbnQoZSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXMhPT1TZSgpJiZ0aGlzLmZvY3VzKXJldHVybiB0aGlzLmZvY3VzKCksITF9LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzPT09U2UoKSYmdGhpcy5ibHVyKXJldHVybiB0aGlzLmJsdXIoKSwhMX0sZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGNsaWNrOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYoImNoZWNrYm94Ij09PXRoaXMudHlwZSYmdGhpcy5jbGljayYmTih0aGlzLCJpbnB1dCIpKXJldHVybiB0aGlzLmNsaWNrKCksITF9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3JldHVybiBOKGUudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnJlc3VsdCYmZS5vcmlnaW5hbEV2ZW50JiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fX0sdy5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0sdy5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHcuRXZlbnQpKXJldHVybiBuZXcgdy5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlP0VlOmtlLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJncuZXh0ZW5kKHRoaXMsdCksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1t3LmV4cGFuZG9dPSEwfSx3LkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6dy5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6a2UsaXNQcm9wYWdhdGlvblN0b3BwZWQ6a2UsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6a2UsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUVlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSx3LmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsImNoYXIiOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYnV0dG9uO3JldHVybiBudWxsPT1lLndoaWNoJiZ3ZS50ZXN0KGUudHlwZSk/bnVsbCE9ZS5jaGFyQ29kZT9lLmNoYXJDb2RlOmUua2V5Q29kZTohZS53aGljaCYmdm9pZCAwIT09dCYmVGUudGVzdChlLnR5cGUpPzEmdD8xOjImdD8zOjQmdD8yOjA6ZS53aGljaH19LHcuZXZlbnQuYWRkUHJvcCksdy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLHQpe3cuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LG89ZS5oYW5kbGVPYmo7cmV0dXJuIGkmJihpPT09cnx8dy5jb250YWlucyhyLGkpKXx8KGUudHlwZT1vLm9yaWdUeXBlLG49by5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnR5cGU9dCksbn19fSksdy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBEZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIERlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLHcoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PXQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0fHwobj10LHQ9dm9pZCAwKSwhMT09PW4mJihuPWtlKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt3LmV2ZW50LnJlbW92ZSh0aGlzLGUsbix0KX0pfX0pO3ZhciBOZT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksQWU9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksamU9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2kscWU9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nO2Z1bmN0aW9uIExlKGUsdCl7cmV0dXJuIE4oZSwidGFibGUiKSYmTigxMSE9PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIik/dyhlKS5jaGlsZHJlbigidGJvZHkiKVswXXx8ZTplfWZ1bmN0aW9uIEhlKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gT2UoZSl7cmV0dXJuInRydWUvIj09PShlLnR5cGV8fCIiKS5zbGljZSgwLDUpP2UudHlwZT1lLnR5cGUuc2xpY2UoNSk6ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIFBlKGUsdCl7dmFyIG4scixpLG8sYSxzLHUsbDtpZigxPT09dC5ub2RlVHlwZSl7aWYoSi5oYXNEYXRhKGUpJiYobz1KLmFjY2VzcyhlKSxhPUouc2V0KHQsbyksbD1vLmV2ZW50cykpe2RlbGV0ZSBhLmhhbmRsZSxhLmV2ZW50cz17fTtmb3IoaSBpbiBsKWZvcihuPTAscj1sW2ldLmxlbmd0aDtuPHI7bisrKXcuZXZlbnQuYWRkKHQsaSxsW2ldW25dKX1LLmhhc0RhdGEoZSkmJihzPUsuYWNjZXNzKGUpLHU9dy5leHRlbmQoe30scyksSy5zZXQodCx1KSl9fWZ1bmN0aW9uIE1lKGUsdCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyJpbnB1dCI9PT1uJiZwZS50ZXN0KGUudHlwZSk/dC5jaGVja2VkPWUuY2hlY2tlZDoiaW5wdXQiIT09biYmInRleHRhcmVhIiE9PW58fCh0LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gUmUoZSx0LG4scil7dD1hLmFwcGx5KFtdLHQpO3ZhciBpLG8scyx1LGwsYyxmPTAscD1lLmxlbmd0aCxkPXAtMSx5PXRbMF0sdj1nKHkpO2lmKHZ8fHA+MSYmInN0cmluZyI9PXR5cGVvZiB5JiYhaC5jaGVja0Nsb25lJiZqZS50ZXN0KHkpKXJldHVybiBlLmVhY2goZnVuY3Rpb24oaSl7dmFyIG89ZS5lcShpKTt2JiYodFswXT15LmNhbGwodGhpcyxpLG8uaHRtbCgpKSksUmUobyx0LG4scil9KTtpZihwJiYoaT14ZSh0LGVbMF0ub3duZXJEb2N1bWVudCwhMSxlLHIpLG89aS5maXJzdENoaWxkLDE9PT1pLmNoaWxkTm9kZXMubGVuZ3RoJiYoaT1vKSxvfHxyKSl7Zm9yKHU9KHM9dy5tYXAoeWUoaSwic2NyaXB0IiksSGUpKS5sZW5ndGg7ZjxwO2YrKylsPWksZiE9PWQmJihsPXcuY2xvbmUobCwhMCwhMCksdSYmdy5tZXJnZShzLHllKGwsInNjcmlwdCIpKSksbi5jYWxsKGVbZl0sbCxmKTtpZih1KWZvcihjPXNbcy5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCx3Lm1hcChzLE9lKSxmPTA7Zjx1O2YrKylsPXNbZl0saGUudGVzdChsLnR5cGV8fCIiKSYmIUouYWNjZXNzKGwsImdsb2JhbEV2YWwiKSYmdy5jb250YWlucyhjLGwpJiYobC5zcmMmJiJtb2R1bGUiIT09KGwudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/dy5fZXZhbFVybCYmdy5fZXZhbFVybChsLnNyYyk6bShsLnRleHRDb250ZW50LnJlcGxhY2UocWUsIiIpLGMsbCkpfXJldHVybiBlfWZ1bmN0aW9uIEllKGUsdCxuKXtmb3IodmFyIHIsaT10P3cuZmlsdGVyKHQsZSk6ZSxvPTA7bnVsbCE9KHI9aVtvXSk7bysrKW58fDEhPT1yLm5vZGVUeXBlfHx3LmNsZWFuRGF0YSh5ZShyKSksci5wYXJlbnROb2RlJiYobiYmdy5jb250YWlucyhyLm93bmVyRG9jdW1lbnQscikmJnZlKHllKHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiBlfXcuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoTmUsIjwkMT48LyQyPiIpfSxjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNsb25lTm9kZSghMCksdT13LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKTtpZighKGgubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fHcuaXNYTUxEb2MoZSkpKWZvcihhPXllKHMpLHI9MCxpPShvPXllKGUpKS5sZW5ndGg7cjxpO3IrKylNZShvW3JdLGFbcl0pO2lmKHQpaWYobilmb3Iobz1vfHx5ZShlKSxhPWF8fHllKHMpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspUGUob1tyXSxhW3JdKTtlbHNlIFBlKGUscyk7cmV0dXJuKGE9eWUocywic2NyaXB0IikpLmxlbmd0aD4wJiZ2ZShhLCF1JiZ5ZShlLCJzY3JpcHQiKSksc30sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHIsaT13LmV2ZW50LnNwZWNpYWwsbz0wO3ZvaWQgMCE9PShuPWVbb10pO28rKylpZihZKG4pKXtpZih0PW5bSi5leHBhbmRvXSl7aWYodC5ldmVudHMpZm9yKHIgaW4gdC5ldmVudHMpaVtyXT93LmV2ZW50LnJlbW92ZShuLHIpOncucmVtb3ZlRXZlbnQobixyLHQuaGFuZGxlKTtuW0ouZXhwYW5kb109dm9pZCAwfW5bSy5leHBhbmRvXSYmKG5bSy5leHBhbmRvXT12b2lkIDApfX19KSx3LmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiBJZSh0aGlzLGUsITApfSxyZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIEllKHRoaXMsZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHoodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT93LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUmUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fExlKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9TGUodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYody5jbGVhbkRhdGEoeWUoZSwhMSkpLGUudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB3LmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIUFlLnRlc3QoZSkmJiFnZVsoZGUuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9dy5odG1sUHJlZmlsdGVyKGUpO3RyeXtmb3IoO248cjtuKyspMT09PSh0PXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKHcuY2xlYW5EYXRhKHllKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIFJlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTt3LmluQXJyYXkodGhpcyxlKTwwJiYody5jbGVhbkRhdGEoeWUodGhpcykpLG4mJm4ucmVwbGFjZUNoaWxkKHQsdGhpcykpfSxlKX19KSx3LmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLHI9W10saT13KGUpLG89aS5sZW5ndGgtMSxhPTA7YTw9bzthKyspbj1hPT09bz90aGlzOnRoaXMuY2xvbmUoITApLHcoaVthXSlbdF0obikscy5hcHBseShyLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhyKX19KTt2YXIgV2U9bmV3IFJlZ0V4cCgiXigiK3JlKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksJGU9ZnVuY3Rpb24odCl7dmFyIG49dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiBuJiZuLm9wZW5lcnx8KG49ZSksbi5nZXRDb21wdXRlZFN0eWxlKHQpfSxCZT1uZXcgUmVnRXhwKG9lLmpvaW4oInwiKSwiaSIpOyFmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtpZihjKXtsLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGMuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIsYmUuYXBwZW5kQ2hpbGQobCkuYXBwZW5kQ2hpbGQoYyk7dmFyIHQ9ZS5nZXRDb21wdXRlZFN0eWxlKGMpO2k9IjElIiE9PXQudG9wLHU9MTI9PT1uKHQubWFyZ2luTGVmdCksYy5zdHlsZS5yaWdodD0iNjAlIixzPTM2PT09bih0LnJpZ2h0KSxvPTM2PT09bih0LndpZHRoKSxjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYT0zNj09PWMub2Zmc2V0V2lkdGh8fCJhYnNvbHV0ZSIsYmUucmVtb3ZlQ2hpbGQobCksYz1udWxsfX1mdW5jdGlvbiBuKGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBpLG8sYSxzLHUsbD1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ci5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLnN0eWxlJiYoYy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixoLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09Yy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCx3LmV4dGVuZChoLHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiB0KCksb30scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHN9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLGl9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiB0KCksdX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0KCksYX19KSl9KCk7ZnVuY3Rpb24gRmUoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5zdHlsZTtyZXR1cm4obj1ufHwkZShlKSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSl8fHcuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHwoYT13LnN0eWxlKGUsdCkpLCFoLnBpeGVsQm94U3R5bGVzKCkmJldlLnRlc3QoYSkmJkJlLnRlc3QodCkmJihyPXMud2lkdGgsaT1zLm1pbldpZHRoLG89cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1pLHMubWF4V2lkdGg9bykpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uIF9lKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX12YXIgemU9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFhlPS9eLS0vLFVlPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxWZT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn0sR2U9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFllPXIuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7ZnVuY3Rpb24gUWUoZSl7aWYoZSBpbiBZZSlyZXR1cm4gZTt2YXIgdD1lWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPUdlLmxlbmd0aDt3aGlsZShuLS0paWYoKGU9R2Vbbl0rdClpbiBZZSlyZXR1cm4gZX1mdW5jdGlvbiBKZShlKXt2YXIgdD13LmNzc1Byb3BzW2VdO3JldHVybiB0fHwodD13LmNzc1Byb3BzW2VdPVFlKGUpfHxlKSx0fWZ1bmN0aW9uIEtlKGUsdCxuKXt2YXIgcj1pZS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTp0fWZ1bmN0aW9uIFplKGUsdCxuLHIsaSxvKXt2YXIgYT0id2lkdGgiPT09dD8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPXcuY3NzKGUsbitvZVthXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHUtPXcuY3NzKGUsInBhZGRpbmciK29lW2FdLCEwLGkpKSwibWFyZ2luIiE9PW4mJih1LT13LmNzcyhlLCJib3JkZXIiK29lW2FdKyJXaWR0aCIsITAsaSkpKToodSs9dy5jc3MoZSwicGFkZGluZyIrb2VbYV0sITAsaSksInBhZGRpbmciIT09bj91Kz13LmNzcyhlLCJib3JkZXIiK29lW2FdKyJXaWR0aCIsITAsaSk6cys9dy5jc3MoZSwiYm9yZGVyIitvZVthXSsiV2lkdGgiLCEwLGkpKTtyZXR1cm4hciYmbz49MCYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSkpLHV9ZnVuY3Rpb24gZXQoZSx0LG4pe3ZhciByPSRlKGUpLGk9RmUoZSx0LHIpLG89ImJvcmRlci1ib3giPT09dy5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSxhPW87aWYoV2UudGVzdChpKSl7aWYoIW4pcmV0dXJuIGk7aT0iYXV0byJ9cmV0dXJuIGE9YSYmKGguYm94U2l6aW5nUmVsaWFibGUoKXx8aT09PWUuc3R5bGVbdF0pLCgiYXV0byI9PT1pfHwhcGFyc2VGbG9hdChpKSYmImlubGluZSI9PT13LmNzcyhlLCJkaXNwbGF5IiwhMSxyKSkmJihpPWVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLGE9ITApLChpPXBhcnNlRmxvYXQoaSl8fDApK1plKGUsdCxufHwobz8iYm9yZGVyIjoiY29udGVudCIpLGEscixpKSsicHgifXcuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49RmUoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8sYSxzPUcodCksdT1YZS50ZXN0KHQpLGw9ZS5zdHlsZTtpZih1fHwodD1KZShzKSksYT13LmNzc0hvb2tzW3RdfHx3LmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KGk9YS5nZXQoZSwhMSxyKSk/aTpsW3RdOyJzdHJpbmciPT0obz10eXBlb2YgbikmJihpPWllLmV4ZWMobikpJiZpWzFdJiYobj11ZShlLHQsaSksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09PW4mJigibnVtYmVyIj09PW8mJihuKz1pJiZpWzNdfHwody5jc3NOdW1iZXJbc10/IiI6InB4IikpLGguY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT10LmluZGV4T2YoImJhY2tncm91bmQiKXx8KGxbdF09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KGUsbixyKSl8fCh1P2wuc2V0UHJvcGVydHkodCxuKTpsW3RdPW4pKX19LGNzczpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1HKHQpO3JldHVybiBYZS50ZXN0KHQpfHwodD1KZShzKSksKGE9dy5jc3NIb29rc1t0XXx8dy5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9RmUoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gVmUmJihpPVZlW3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSwhMD09PW58fGlzRmluaXRlKG8pP298fDA6aSk6aX19KSx3LmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGUsdCl7dy5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbixyKXtpZihuKXJldHVybiF6ZS50ZXN0KHcuY3NzKGUsImRpc3BsYXkiKSl8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/ZXQoZSx0LHIpOnNlKGUsVWUsZnVuY3Rpb24oKXtyZXR1cm4gZXQoZSx0LHIpfSl9LHNldDpmdW5jdGlvbihlLG4scil7dmFyIGksbz0kZShlKSxhPSJib3JkZXItYm94Ij09PXcuY3NzKGUsImJveFNpemluZyIsITEsbykscz1yJiZaZShlLHQscixhLG8pO3JldHVybiBhJiZoLnNjcm9sbGJveFNpemUoKT09PW8ucG9zaXRpb24mJihzLT1NYXRoLmNlaWwoZVsib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tcGFyc2VGbG9hdChvW3RdKS1aZShlLHQsImJvcmRlciIsITEsbyktLjUpKSxzJiYoaT1pZS5leGVjKG4pKSYmInB4IiE9PShpWzNdfHwicHgiKSYmKGUuc3R5bGVbdF09bixuPXcuY3NzKGUsdCkpLEtlKGUsbixzKX19fSksdy5jc3NIb29rcy5tYXJnaW5MZWZ0PV9lKGgucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChGZShlLCJtYXJnaW5MZWZ0IikpfHxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtc2UoZSx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLHcuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGUsdCl7dy5jc3NIb29rc1tlK3RdPXtleHBhbmQ6ZnVuY3Rpb24obil7Zm9yKHZhciByPTAsaT17fSxvPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO3I8NDtyKyspaVtlK29lW3JdK3RdPW9bcl18fG9bci0yXXx8b1swXTtyZXR1cm4gaX19LCJtYXJnaW4iIT09ZSYmKHcuY3NzSG9va3NbZSt0XS5zZXQ9S2UpfSksdy5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fSxhPTA7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHI9JGUoZSksaT10Lmxlbmd0aDthPGk7YSsrKW9bdFthXV09dy5jc3MoZSx0W2FdLCExLHIpO3JldHVybiBvfXJldHVybiB2b2lkIDAhPT1uP3cuc3R5bGUoZSx0LG4pOncuY3NzKGUsdCl9LGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfX0pO2Z1bmN0aW9uIHR0KGUsdCxuLHIsaSl7cmV0dXJuIG5ldyB0dC5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfXcuVHdlZW49dHQsdHQucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0dCxpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHx3LmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9b3x8KHcuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgZT10dC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6dHQucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49dHQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz10PXcuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTp0dC5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSx0dC5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9dHQucHJvdG90eXBlLHR0LnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gMSE9PWUuZWxlbS5ub2RlVHlwZXx8bnVsbCE9ZS5lbGVtW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtlLnByb3BdP2UuZWxlbVtlLnByb3BdOih0PXcuY3NzKGUuZWxlbSxlLnByb3AsIiIpKSYmImF1dG8iIT09dD90OjB9LHNldDpmdW5jdGlvbihlKXt3LmZ4LnN0ZXBbZS5wcm9wXT93LmZ4LnN0ZXBbZS5wcm9wXShlKToxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsPT1lLmVsZW0uc3R5bGVbdy5jc3NQcm9wc1tlLnByb3BdXSYmIXcuY3NzSG9va3NbZS5wcm9wXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzp3LnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSx0dC5wcm9wSG9va3Muc2Nyb2xsVG9wPXR0LnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LHcuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sdy5meD10dC5wcm90b3R5cGUuaW5pdCx3LmZ4LnN0ZXA9e307dmFyIG50LHJ0LGl0PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxvdD0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIGF0KCl7cnQmJighMT09PXIuaGlkZGVuJiZlLnJlcXVlc3RBbmltYXRpb25GcmFtZT9lLnJlcXVlc3RBbmltYXRpb25GcmFtZShhdCk6ZS5zZXRUaW1lb3V0KGF0LHcuZnguaW50ZXJ2YWwpLHcuZngudGljaygpKX1mdW5jdGlvbiBzdCgpe3JldHVybiBlLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtudD12b2lkIDB9KSxudD1EYXRlLm5vdygpfWZ1bmN0aW9uIHV0KGUsdCl7dmFyIG4scj0wLGk9e2hlaWdodDplfTtmb3IodD10PzE6MDtyPDQ7cis9Mi10KWlbIm1hcmdpbiIrKG49b2Vbcl0pXT1pWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoaS5vcGFjaXR5PWkud2lkdGg9ZSksaX1mdW5jdGlvbiBsdChlLHQsbil7Zm9yKHZhciByLGk9KHB0LnR3ZWVuZXJzW3RdfHxbXSkuY29uY2F0KHB0LnR3ZWVuZXJzWyIqIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGN0KGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLGY9IndpZHRoImluIHR8fCJoZWlnaHQiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZhZShlKSx5PUouZ2V0KGUsImZ4c2hvdyIpO24ucXVldWV8fChudWxsPT0oYT13Ll9xdWV1ZUhvb2tzKGUsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLHcucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSk7Zm9yKHIgaW4gdClpZihpPXRbcl0saXQudGVzdChpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1pfHwheXx8dm9pZCAwPT09eVtyXSljb250aW51ZTtnPSEwfWRbcl09eSYmeVtyXXx8dy5zdHlsZShlLHIpfWlmKCh1PSF3LmlzRW1wdHlPYmplY3QodCkpfHwhdy5pc0VtcHR5T2JqZWN0KGQpKXtmJiYxPT09ZS5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2gub3ZlcmZsb3csaC5vdmVyZmxvd1gsaC5vdmVyZmxvd1ldLG51bGw9PShsPXkmJnkuZGlzcGxheSkmJihsPUouZ2V0KGUsImRpc3BsYXkiKSksIm5vbmUiPT09KGM9dy5jc3MoZSwiZGlzcGxheSIpKSYmKGw/Yz1sOihmZShbZV0sITApLGw9ZS5zdHlsZS5kaXNwbGF5fHxsLGM9dy5jc3MoZSwiZGlzcGxheSIpLGZlKFtlXSkpKSwoImlubGluZSI9PT1jfHwiaW5saW5lLWJsb2NrIj09PWMmJm51bGwhPWwpJiYibm9uZSI9PT13LmNzcyhlLCJmbG9hdCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2guZGlzcGxheT1sfSksbnVsbD09bCYmKGM9aC5kaXNwbGF5LGw9Im5vbmUiPT09Yz8iIjpjKSksaC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKGgub3ZlcmZsb3c9ImhpZGRlbiIscC5hbHdheXMoZnVuY3Rpb24oKXtoLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0saC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxoLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITE7Zm9yKHIgaW4gZCl1fHwoeT8iaGlkZGVuImluIHkmJihnPXkuaGlkZGVuKTp5PUouYWNjZXNzKGUsImZ4c2hvdyIse2Rpc3BsYXk6bH0pLG8mJih5LmhpZGRlbj0hZyksZyYmZmUoW2VdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtnfHxmZShbZV0pLEoucmVtb3ZlKGUsImZ4c2hvdyIpO2ZvcihyIGluIGQpdy5zdHlsZShlLHIsZFtyXSl9KSksdT1sdChnP3lbcl06MCxyLHApLHIgaW4geXx8KHlbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX19ZnVuY3Rpb24gZnQoZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYocj1HKG4pLGk9dFtyXSxvPWVbbl0sQXJyYXkuaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLChhPXcuY3NzSG9va3Nbcl0pJiYiZXhwYW5kImluIGEpe289YS5leHBhbmQobyksZGVsZXRlIGVbcl07Zm9yKG4gaW4gbyluIGluIGV8fChlW25dPW9bbl0sdFtuXT1pKX1lbHNlIHRbcl09aX1mdW5jdGlvbiBwdChlLHQsbil7dmFyIHIsaSxvPTAsYT1wdC5wcmVmaWx0ZXJzLmxlbmd0aCxzPXcuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKGkpcmV0dXJuITE7Zm9yKHZhciB0PW50fHxzdCgpLG49TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLXQpLHI9MS0obi9sLmR1cmF0aW9ufHwwKSxvPTAsYT1sLnR3ZWVucy5sZW5ndGg7bzxhO28rKylsLnR3ZWVuc1tvXS5ydW4ocik7cmV0dXJuIHMubm90aWZ5V2l0aChlLFtsLHIsbl0pLHI8MSYmYT9uOihhfHxzLm5vdGlmeVdpdGgoZSxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKGUsW2xdKSwhMSl9LGw9cy5wcm9taXNlKHtlbGVtOmUscHJvcHM6dy5leHRlbmQoe30sdCksb3B0czp3LmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6dy5lYXNpbmcuX2RlZmF1bHR9LG4pLG9yaWdpbmFsUHJvcGVydGllczp0LG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTpudHx8c3QoKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciByPXcuVHdlZW4oZSxsLm9wdHMsdCxuLGwub3B0cy5zcGVjaWFsRWFzaW5nW3RdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPTAscj10P2wudHdlZW5zLmxlbmd0aDowO2lmKGkpcmV0dXJuIHRoaXM7Zm9yKGk9ITA7bjxyO24rKylsLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIHQ/KHMubm90aWZ5V2l0aChlLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgoZSxbbCx0XSkpOnMucmVqZWN0V2l0aChlLFtsLHRdKSx0aGlzfX0pLGM9bC5wcm9wcztmb3IoZnQoYyxsLm9wdHMuc3BlY2lhbEVhc2luZyk7bzxhO28rKylpZihyPXB0LnByZWZpbHRlcnNbb10uY2FsbChsLGUsYyxsLm9wdHMpKXJldHVybiBnKHIuc3RvcCkmJih3Ll9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0b3A9ci5zdG9wLmJpbmQocikpLHI7cmV0dXJuIHcubWFwKGMsbHQsbCksZyhsLm9wdHMuc3RhcnQpJiZsLm9wdHMuc3RhcnQuY2FsbChlLGwpLGwucHJvZ3Jlc3MobC5vcHRzLnByb2dyZXNzKS5kb25lKGwub3B0cy5kb25lLGwub3B0cy5jb21wbGV0ZSkuZmFpbChsLm9wdHMuZmFpbCkuYWx3YXlzKGwub3B0cy5hbHdheXMpLHcuZngudGltZXIody5leHRlbmQodSx7ZWxlbTplLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbH13LkFuaW1hdGlvbj13LmV4dGVuZChwdCx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKGUsdCk7cmV0dXJuIHVlKG4uZWxlbSxlLGllLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7ZyhlKT8odD1lLGU9WyIqIl0pOmU9ZS5tYXRjaChNKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluPWVbcl0scHQudHdlZW5lcnNbbl09cHQudHdlZW5lcnNbbl18fFtdLHB0LnR3ZWVuZXJzW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W2N0XSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P3B0LnByZWZpbHRlcnMudW5zaGlmdChlKTpwdC5wcmVmaWx0ZXJzLnB1c2goZSl9fSksdy5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP3cuZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8ZyhlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYhZyh0KSYmdH07cmV0dXJuIHcuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIHcuZnguc3BlZWRzP3IuZHVyYXRpb249dy5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj13LmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXtnKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZ3LmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sdy5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoYWUpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXcuaXNFbXB0eU9iamVjdChlKSxvPXcuc3BlZWQodCxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgdD1wdCh0aGlzLHcuZXh0ZW5kKHt9LGUpLG8pOyhpfHxKLmdldCh0aGlzLCJmaW5pc2giKSkmJnQuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fCExPT09by5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG4pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihuPXQsdD1lLGU9dm9pZCAwKSx0JiYhMSE9PWUmJnRoaXMucXVldWUoZXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ITAsaT1udWxsIT1lJiZlKyJxdWV1ZUhvb2tzIixvPXcudGltZXJzLGE9Si5nZXQodGhpcyk7aWYoaSlhW2ldJiZhW2ldLnN0b3AmJnIoYVtpXSk7ZWxzZSBmb3IoaSBpbiBhKWFbaV0mJmFbaV0uc3RvcCYmb3QudGVzdChpKSYmcihhW2ldKTtmb3IoaT1vLmxlbmd0aDtpLS07KW9baV0uZWxlbSE9PXRoaXN8fG51bGwhPWUmJm9baV0ucXVldWUhPT1lfHwob1tpXS5hbmltLnN0b3AobiksdD0hMSxvLnNwbGljZShpLDEpKTshdCYmbnx8dy5kZXF1ZXVlKHRoaXMsZSl9KX0sZmluaXNoOmZ1bmN0aW9uKGUpe3JldHVybiExIT09ZSYmKGU9ZXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQsbj1KLmdldCh0aGlzKSxyPW5bZSsicXVldWUiXSxpPW5bZSsicXVldWVIb29rcyJdLG89dy50aW1lcnMsYT1yP3IubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLHcucXVldWUodGhpcyxlLFtdKSxpJiZpLnN0b3AmJmkuc3RvcC5jYWxsKHRoaXMsITApLHQ9by5sZW5ndGg7dC0tOylvW3RdLmVsZW09PT10aGlzJiZvW3RdLnF1ZXVlPT09ZSYmKG9bdF0uYW5pbS5zdG9wKCEwKSxvLnNwbGljZSh0LDEpKTtmb3IodD0wO3Q8YTt0Kyspclt0XSYmclt0XS5maW5pc2gmJnJbdF0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIG4uZmluaXNofSl9fSksdy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHQpe3ZhciBuPXcuZm5bdF07dy5mblt0XT1mdW5jdGlvbihlLHIsaSl7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09dHlwZW9mIGU/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKHV0KHQsITApLGUscixpKX19KSx3LmVhY2goe3NsaWRlRG93bjp1dCgic2hvdyIpLHNsaWRlVXA6dXQoImhpZGUiKSxzbGlkZVRvZ2dsZTp1dCgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSksdy50aW1lcnM9W10sdy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49dy50aW1lcnM7Zm9yKG50PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8dy5meC5zdG9wKCksbnQ9dm9pZCAwfSx3LmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe3cudGltZXJzLnB1c2goZSksdy5meC5zdGFydCgpfSx3LmZ4LmludGVydmFsPTEzLHcuZnguc3RhcnQ9ZnVuY3Rpb24oKXtydHx8KHJ0PSEwLGF0KCkpfSx3LmZ4LnN0b3A9ZnVuY3Rpb24oKXtydD1udWxsfSx3LmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSx3LmZuLmRlbGF5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9dy5meD93LmZ4LnNwZWVkc1t0XXx8dDp0LG49bnx8ImZ4Iix0aGlzLnF1ZXVlKG4sZnVuY3Rpb24obixyKXt2YXIgaT1lLnNldFRpbWVvdXQobix0KTtyLnN0b3A9ZnVuY3Rpb24oKXtlLmNsZWFyVGltZW91dChpKX19KX0sZnVuY3Rpb24oKXt2YXIgZT1yLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdD1yLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKHIuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO2UudHlwZT0iY2hlY2tib3giLGguY2hlY2tPbj0iIiE9PWUudmFsdWUsaC5vcHRTZWxlY3RlZD10LnNlbGVjdGVkLChlPXIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWU9InQiLGUudHlwZT0icmFkaW8iLGgucmFkaW9WYWx1ZT0idCI9PT1lLnZhbHVlfSgpO3ZhciBkdCxodD13LmV4cHIuYXR0ckhhbmRsZTt3LmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsdy5hdHRyLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt3LnJlbW92ZUF0dHIodGhpcyxlKX0pfX0pLHcuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgZS5nZXRBdHRyaWJ1dGU/dy5wcm9wKGUsdCxuKTooMT09PW8mJncuaXNYTUxEb2MoZSl8fChpPXcuYXR0ckhvb2tzW3QudG9Mb3dlckNhc2UoKV18fCh3LmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP2R0OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCB3LnJlbW92ZUF0dHIoZSx0KTppJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuKyIiKSxuKTppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOm51bGw9PShyPXcuZmluZC5hdHRyKGUsdCkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZighaC5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmTihlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXQmJnQubWF0Y2goTSk7aWYoaSYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1pW3IrK10pZS5yZW1vdmVBdHRyaWJ1dGUobil9fSksZHQ9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuITE9PT10P3cucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LHcuZWFjaCh3LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciBuPWh0W3RdfHx3LmZpbmQuYXR0cjtodFt0XT1mdW5jdGlvbihlLHQscil7dmFyIGksbyxhPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcnx8KG89aHRbYV0saHRbYV09aSxpPW51bGwhPW4oZSx0LHIpP2E6bnVsbCxodFthXT1vKSxpfX0pO3ZhciBndD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLHl0PS9eKD86YXxhcmVhKSQvaTt3LmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsdy5wcm9wLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t3LnByb3BGaXhbZV18fGVdfSl9fSksdy5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1lLm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuIDE9PT1vJiZ3LmlzWE1MRG9jKGUpfHwodD13LnByb3BGaXhbdF18fHQsaT13LnByb3BIb29rc1t0XSksdm9pZCAwIT09bj9pJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjplW3RdPW46aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjplW3RdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5maW5kLmF0dHIoZSwidGFiaW5kZXgiKTtyZXR1cm4gdD9wYXJzZUludCh0LDEwKTpndC50ZXN0KGUubm9kZU5hbWUpfHx5dC50ZXN0KGUubm9kZU5hbWUpJiZlLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSxoLm9wdFNlbGVjdGVkfHwody5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTt0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLHcuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7dy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pO2Z1bmN0aW9uIHZ0KGUpe3JldHVybihlLm1hdGNoKE0pfHxbXSkuam9pbigiICIpfWZ1bmN0aW9uIG10KGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIHh0KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6InN0cmluZyI9PXR5cGVvZiBlP2UubWF0Y2goTSl8fFtdOltdfXcuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyx1PTA7aWYoZyhlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3codGhpcykuYWRkQ2xhc3MoZS5jYWxsKHRoaXMsdCxtdCh0aGlzKSkpfSk7aWYoKHQ9eHQoZSkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPW10KG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit2dChpKSsiICIpe2E9MDt3aGlsZShvPXRbYSsrXSlyLmluZGV4T2YoIiAiK28rIiAiKTwwJiYocis9bysiICIpO2khPT0ocz12dChyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzLHU9MDtpZihnKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7dyh0aGlzKS5yZW1vdmVDbGFzcyhlLmNhbGwodGhpcyx0LG10KHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKCh0PXh0KGUpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT1tdChuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIrdnQoaSkrIiAiKXthPTA7d2hpbGUobz10W2ErK10pd2hpbGUoci5pbmRleE9mKCIgIitvKyIgIik+LTEpcj1yLnJlcGxhY2UoIiAiK28rIiAiLCIgIik7aSE9PShzPXZ0KHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZSxyPSJzdHJpbmciPT09bnx8QXJyYXkuaXNBcnJheShlKTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0JiZyP3Q/dGhpcy5hZGRDbGFzcyhlKTp0aGlzLnJlbW92ZUNsYXNzKGUpOmcoZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3codGhpcykudG9nZ2xlQ2xhc3MoZS5jYWxsKHRoaXMsbixtdCh0aGlzKSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LGksbyxhO2lmKHIpe2k9MCxvPXcodGhpcyksYT14dChlKTt3aGlsZSh0PWFbaSsrXSlvLmhhc0NsYXNzKHQpP28ucmVtb3ZlQ2xhc3ModCk6by5hZGRDbGFzcyh0KX1lbHNlIHZvaWQgMCE9PWUmJiJib29sZWFuIiE9PW58fCgodD1tdCh0aGlzKSkmJkouc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLHQpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHR8fCExPT09ZT8iIjpKLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPTA7dD0iICIrZSsiICI7d2hpbGUobj10aGlzW3IrK10paWYoMT09PW4ubm9kZVR5cGUmJigiICIrdnQobXQobikpKyIgIikuaW5kZXhPZih0KT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgYnQ9L1xyL2c7dy5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiByPWcoZSksdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciBpOzE9PT10aGlzLm5vZGVUeXBlJiYobnVsbD09KGk9cj9lLmNhbGwodGhpcyxuLHcodGhpcykudmFsKCkpOmUpP2k9IiI6Im51bWJlciI9PXR5cGVvZiBpP2krPSIiOkFycmF5LmlzQXJyYXkoaSkmJihpPXcubWFwKGksZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZSsiIn0pKSwodD13LnZhbEhvb2tzW3RoaXMudHlwZV18fHcudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJzZXQiaW4gdCYmdm9pZCAwIT09dC5zZXQodGhpcyxpLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1pKSl9KTtpZihpKXJldHVybih0PXcudmFsSG9va3NbaS50eXBlXXx8dy52YWxIb29rc1tpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiB0JiZ2b2lkIDAhPT0obj10LmdldChpLCJ2YWx1ZSIpKT9uOiJzdHJpbmciPT10eXBlb2Yobj1pLnZhbHVlKT9uLnJlcGxhY2UoYnQsIiIpOm51bGw9PW4/IiI6bn19fSksdy5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD13LmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6dnQody50ZXh0KGUpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPWUub3B0aW9ucyxvPWUuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PWUudHlwZSxzPWE/bnVsbDpbXSx1PWE/bysxOmkubGVuZ3RoO2ZvcihyPW88MD91OmE/bzowO3I8dTtyKyspaWYoKChuPWlbcl0pLnNlbGVjdGVkfHxyPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IU4obi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD13KG4pLnZhbCgpLGEpcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89dy5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pKChyPWlbYV0pLnNlbGVjdGVkPXcuaW5BcnJheSh3LnZhbEhvb2tzLm9wdGlvbi5nZXQociksbyk+LTEpJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX19KSx3LmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXt3LnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9dy5pbkFycmF5KHcoZSkudmFsKCksdCk+LTF9fSxoLmNoZWNrT258fCh3LnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSksaC5mb2N1c2luPSJvbmZvY3VzaW4iaW4gZTt2YXIgd3Q9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFR0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O3cuZXh0ZW5kKHcuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24odCxuLGksbyl7dmFyIGEscyx1LGwsYyxwLGQsaCx2PVtpfHxyXSxtPWYuY2FsbCh0LCJ0eXBlIik/dC50eXBlOnQseD1mLmNhbGwodCwibmFtZXNwYWNlIik/dC5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihzPWg9dT1pPWl8fHIsMyE9PWkubm9kZVR5cGUmJjghPT1pLm5vZGVUeXBlJiYhd3QudGVzdChtK3cuZXZlbnQudHJpZ2dlcmVkKSYmKG0uaW5kZXhPZigiLiIpPi0xJiYobT0oeD1tLnNwbGl0KCIuIikpLnNoaWZ0KCkseC5zb3J0KCkpLGM9bS5pbmRleE9mKCI6Iik8MCYmIm9uIittLHQ9dFt3LmV4cGFuZG9dP3Q6bmV3IHcuRXZlbnQobSwib2JqZWN0Ij09dHlwZW9mIHQmJnQpLHQuaXNUcmlnZ2VyPW8/MjozLHQubmFtZXNwYWNlPXguam9pbigiLiIpLHQucm5hbWVzcGFjZT10Lm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIit4LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsdC5yZXN1bHQ9dm9pZCAwLHQudGFyZ2V0fHwodC50YXJnZXQ9aSksbj1udWxsPT1uP1t0XTp3Lm1ha2VBcnJheShuLFt0XSksZD13LmV2ZW50LnNwZWNpYWxbbV18fHt9LG98fCFkLnRyaWdnZXJ8fCExIT09ZC50cmlnZ2VyLmFwcGx5KGksbikpKXtpZighbyYmIWQubm9CdWJibGUmJiF5KGkpKXtmb3IobD1kLmRlbGVnYXRlVHlwZXx8bSx3dC50ZXN0KGwrbSl8fChzPXMucGFyZW50Tm9kZSk7cztzPXMucGFyZW50Tm9kZSl2LnB1c2gocyksdT1zO3U9PT0oaS5vd25lckRvY3VtZW50fHxyKSYmdi5wdXNoKHUuZGVmYXVsdFZpZXd8fHUucGFyZW50V2luZG93fHxlKX1hPTA7d2hpbGUoKHM9dlthKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSloPXMsdC50eXBlPWE+MT9sOmQuYmluZFR5cGV8fG0sKHA9KEouZ2V0KHMsImV2ZW50cyIpfHx7fSlbdC50eXBlXSYmSi5nZXQocywiaGFuZGxlIikpJiZwLmFwcGx5KHMsbiksKHA9YyYmc1tjXSkmJnAuYXBwbHkmJlkocykmJih0LnJlc3VsdD1wLmFwcGx5KHMsbiksITE9PT10LnJlc3VsdCYmdC5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gdC50eXBlPW0sb3x8dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8ZC5fZGVmYXVsdCYmITEhPT1kLl9kZWZhdWx0LmFwcGx5KHYucG9wKCksbil8fCFZKGkpfHxjJiZnKGlbbV0pJiYheShpKSYmKCh1PWlbY10pJiYoaVtjXT1udWxsKSx3LmV2ZW50LnRyaWdnZXJlZD1tLHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5hZGRFdmVudExpc3RlbmVyKG0sVHQpLGlbbV0oKSx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmgucmVtb3ZlRXZlbnRMaXN0ZW5lcihtLFR0KSx3LmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsdSYmKGlbY109dSkpLHQucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXcuZXh0ZW5kKG5ldyB3LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMH0pO3cuZXZlbnQudHJpZ2dlcihyLG51bGwsdCl9fSksdy5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gdy5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKX19KSxoLmZvY3VzaW58fHcuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbihlKXt3LmV2ZW50LnNpbXVsYXRlKHQsZS50YXJnZXQsdy5ldmVudC5maXgoZSkpfTt3LmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGk9Si5hY2Nlc3Mocix0KTtpfHxyLmFkZEV2ZW50TGlzdGVuZXIoZSxuLCEwKSxKLmFjY2VzcyhyLHQsKGl8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxpPUouYWNjZXNzKHIsdCktMTtpP0ouYWNjZXNzKHIsdCxpKTooci5yZW1vdmVFdmVudExpc3RlbmVyKGUsbiwhMCksSi5yZW1vdmUocix0KSl9fX0pO3ZhciBDdD1lLmxvY2F0aW9uLEV0PURhdGUubm93KCksa3Q9L1w/Lzt3LnBhcnNlWE1MPWZ1bmN0aW9uKHQpe3ZhciBuO2lmKCF0fHwic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dHJ5e249KG5ldyBlLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsInRleHQveG1sIil9Y2F0Y2goZSl7bj12b2lkIDB9cmV0dXJuIG4mJiFuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8dy5lcnJvcigiSW52YWxpZCBYTUw6ICIrdCksbn07dmFyIFN0PS9cW1xdJC8sRHQ9L1xyP1xuL2csTnQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLEF0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBqdChlLHQsbixyKXt2YXIgaTtpZihBcnJheS5pc0FycmF5KHQpKXcuZWFjaCh0LGZ1bmN0aW9uKHQsaSl7bnx8U3QudGVzdChlKT9yKGUsaSk6anQoZSsiWyIrKCJvYmplY3QiPT10eXBlb2YgaSYmbnVsbCE9aT90OiIiKSsiXSIsaSxuLHIpfSk7ZWxzZSBpZihufHwib2JqZWN0IiE9PXgodCkpcihlLHQpO2Vsc2UgZm9yKGkgaW4gdClqdChlKyJbIitpKyJdIix0W2ldLG4scil9dy5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3ZhciBuPWcodCk/dCgpOnQ7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYoQXJyYXkuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF3LmlzUGxhaW5PYmplY3QoZSkpdy5lYWNoKGUsZnVuY3Rpb24oKXtpKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKG4gaW4gZSlqdChuLGVbbl0sdCxpKTtyZXR1cm4gci5qb2luKCImIil9LHcuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXcucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBlP3cubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXcodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZBdC50ZXN0KHRoaXMubm9kZU5hbWUpJiYhTnQudGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IXBlLnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49dyh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOkFycmF5LmlzQXJyYXkobik/dy5tYXAobixmdW5jdGlvbihlKXtyZXR1cm57bmFtZTp0Lm5hbWUsdmFsdWU6ZS5yZXBsYWNlKER0LCJcclxuIil9fSk6e25hbWU6dC5uYW1lLHZhbHVlOm4ucmVwbGFjZShEdCwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBxdD0vJTIwL2csTHQ9LyMuKiQvLEh0PS8oWz8mXSlfPVteJl0qLyxPdD0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLFB0PS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLE10PS9eKD86R0VUfEhFQUQpJC8sUnQ9L15cL1wvLyxJdD17fSxXdD17fSwkdD0iKi8iLmNvbmNhdCgiKiIpLEJ0PXIuY3JlYXRlRWxlbWVudCgiYSIpO0J0LmhyZWY9Q3QuaHJlZjtmdW5jdGlvbiBGdChlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXsic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iKiIpO3ZhciByLGk9MCxvPXQudG9Mb3dlckNhc2UoKS5tYXRjaChNKXx8W107aWYoZyhuKSl3aGlsZShyPW9baSsrXSkiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwoZVtyXT1lW3JdfHxbXSkudW5zaGlmdChuKSk6KGVbcl09ZVtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uIF90KGUsdCxuLHIpe3ZhciBpPXt9LG89ZT09PVd0O2Z1bmN0aW9uIGEocyl7dmFyIHU7cmV0dXJuIGlbc109ITAsdy5lYWNoKGVbc118fFtdLGZ1bmN0aW9uKGUscyl7dmFyIGw9cyh0LG4scik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBsfHxvfHxpW2xdP28/ISh1PWwpOnZvaWQgMDoodC5kYXRhVHlwZXMudW5zaGlmdChsKSxhKGwpLCExKX0pLHV9cmV0dXJuIGEodC5kYXRhVHlwZXNbMF0pfHwhaVsiKiJdJiZhKCIqIil9ZnVuY3Rpb24genQoZSx0KXt2YXIgbixyLGk9dy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIHQpdm9pZCAwIT09dFtuXSYmKChpW25dP2U6cnx8KHI9e30pKVtuXT10W25dKTtyZXR1cm4gciYmdy5leHRlbmQoITAsZSxyKSxlfWZ1bmN0aW9uIFh0KGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IoaSBpbiBzKWlmKHNbaV0mJnNbaV0udGVzdChyKSl7dS51bnNoaWZ0KGkpO2JyZWFrfWlmKHVbMF1pbiBuKW89dVswXTtlbHNle2ZvcihpIGluIG4pe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbaSsiICIrdVswXV0pe289aTticmVha31hfHwoYT1pKX1vPW98fGF9aWYobylyZXR1cm4gbyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dfWZ1bmN0aW9uIFV0KGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD17fSxjPWUuZGF0YVR5cGVzLnNsaWNlKCk7aWYoY1sxXSlmb3IoYSBpbiBlLmNvbnZlcnRlcnMpbFthLnRvTG93ZXJDYXNlKCldPWUuY29udmVydGVyc1thXTtvPWMuc2hpZnQoKTt3aGlsZShvKWlmKGUucmVzcG9uc2VGaWVsZHNbb10mJihuW2UucmVzcG9uc2VGaWVsZHNbb11dPXQpLCF1JiZyJiZlLmRhdGFGaWx0ZXImJih0PWUuZGF0YUZpbHRlcih0LGUuZGF0YVR5cGUpKSx1PW8sbz1jLnNoaWZ0KCkpaWYoIioiPT09bylvPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09byl7aWYoIShhPWxbdSsiICIrb118fGxbIiogIitvXSkpZm9yKGkgaW4gbClpZigocz1pLnNwbGl0KCIgIikpWzFdPT09byYmKGE9bFt1KyIgIitzWzBdXXx8bFsiKiAiK3NbMF1dKSl7ITA9PT1hP2E9bFtpXTohMCE9PWxbaV0mJihvPXNbMF0sYy51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmZVsidGhyb3dzIl0pdD1hKHQpO2Vsc2UgdHJ5e3Q9YSh0KX1jYXRjaChlKXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjphP2U6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK299fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6dH19dy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOkN0LmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOlB0LnRlc3QoQ3QucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6JHQsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOncucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P3p0KHp0KGUsdy5hamF4U2V0dGluZ3MpLHQpOnp0KHcuYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkZ0KEl0KSxhamF4VHJhbnNwb3J0OkZ0KFd0KSxhamF4OmZ1bmN0aW9uKHQsbil7Im9iamVjdCI9PXR5cGVvZiB0JiYobj10LHQ9dm9pZCAwKSxuPW58fHt9O3ZhciBpLG8sYSxzLHUsbCxjLGYscCxkLGg9dy5hamF4U2V0dXAoe30sbiksZz1oLmNvbnRleHR8fGgseT1oLmNvbnRleHQmJihnLm5vZGVUeXBlfHxnLmpxdWVyeSk/dyhnKTp3LmV2ZW50LHY9dy5EZWZlcnJlZCgpLG09dy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikseD1oLnN0YXR1c0NvZGV8fHt9LGI9e30sVD17fSxDPSJjYW5jZWxlZCIsRT17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGMpe2lmKCFzKXtzPXt9O3doaWxlKHQ9T3QuZXhlYyhhKSlzW3RbMV0udG9Mb3dlckNhc2UoKV09dFsyXX10PXNbZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09dD9udWxsOnR9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBjP2E6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1jJiYoZT1UW2UudG9Mb3dlckNhc2UoKV09VFtlLnRvTG93ZXJDYXNlKCldfHxlLGJbZV09dCksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09YyYmKGgubWltZVR5cGU9ZSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihlKXt2YXIgdDtpZihlKWlmKGMpRS5hbHdheXMoZVtFLnN0YXR1c10pO2Vsc2UgZm9yKHQgaW4gZSl4W3RdPVt4W3RdLGVbdF1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHxDO3JldHVybiBpJiZpLmFib3J0KHQpLGsoMCx0KSx0aGlzfX07aWYodi5wcm9taXNlKEUpLGgudXJsPSgodHx8aC51cmx8fEN0LmhyZWYpKyIiKS5yZXBsYWNlKFJ0LEN0LnByb3RvY29sKyIvLyIpLGgudHlwZT1uLm1ldGhvZHx8bi50eXBlfHxoLm1ldGhvZHx8aC50eXBlLGguZGF0YVR5cGVzPShoLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goTSl8fFsiIl0sbnVsbD09aC5jcm9zc0RvbWFpbil7bD1yLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7bC5ocmVmPWgudXJsLGwuaHJlZj1sLmhyZWYsaC5jcm9zc0RvbWFpbj1CdC5wcm90b2NvbCsiLy8iK0J0Lmhvc3QhPWwucHJvdG9jb2wrIi8vIitsLmhvc3R9Y2F0Y2goZSl7aC5jcm9zc0RvbWFpbj0hMH19aWYoaC5kYXRhJiZoLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGguZGF0YSYmKGguZGF0YT13LnBhcmFtKGguZGF0YSxoLnRyYWRpdGlvbmFsKSksX3QoSXQsaCxuLEUpLGMpcmV0dXJuIEU7KGY9dy5ldmVudCYmaC5nbG9iYWwpJiYwPT13LmFjdGl2ZSsrJiZ3LmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGgudHlwZT1oLnR5cGUudG9VcHBlckNhc2UoKSxoLmhhc0NvbnRlbnQ9IU10LnRlc3QoaC50eXBlKSxvPWgudXJsLnJlcGxhY2UoTHQsIiIpLGguaGFzQ29udGVudD9oLmRhdGEmJmgucHJvY2Vzc0RhdGEmJjA9PT0oaC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoaC5kYXRhPWguZGF0YS5yZXBsYWNlKHF0LCIrIikpOihkPWgudXJsLnNsaWNlKG8ubGVuZ3RoKSxoLmRhdGEmJihoLnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIGguZGF0YSkmJihvKz0oa3QudGVzdChvKT8iJiI6Ij8iKStoLmRhdGEsZGVsZXRlIGguZGF0YSksITE9PT1oLmNhY2hlJiYobz1vLnJlcGxhY2UoSHQsIiQxIiksZD0oa3QudGVzdChvKT8iJiI6Ij8iKSsiXz0iK0V0KysrZCksaC51cmw9bytkKSxoLmlmTW9kaWZpZWQmJih3Lmxhc3RNb2RpZmllZFtvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsdy5sYXN0TW9kaWZpZWRbb10pLHcuZXRhZ1tvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIix3LmV0YWdbb10pKSwoaC5kYXRhJiZoLmhhc0NvbnRlbnQmJiExIT09aC5jb250ZW50VHlwZXx8bi5jb250ZW50VHlwZSkmJkUuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixoLmNvbnRlbnRUeXBlKSxFLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsaC5kYXRhVHlwZXNbMF0mJmguYWNjZXB0c1toLmRhdGFUeXBlc1swXV0/aC5hY2NlcHRzW2guZGF0YVR5cGVzWzBdXSsoIioiIT09aC5kYXRhVHlwZXNbMF0/IiwgIiskdCsiOyBxPTAuMDEiOiIiKTpoLmFjY2VwdHNbIioiXSk7Zm9yKHAgaW4gaC5oZWFkZXJzKUUuc2V0UmVxdWVzdEhlYWRlcihwLGguaGVhZGVyc1twXSk7aWYoaC5iZWZvcmVTZW5kJiYoITE9PT1oLmJlZm9yZVNlbmQuY2FsbChnLEUsaCl8fGMpKXJldHVybiBFLmFib3J0KCk7aWYoQz0iYWJvcnQiLG0uYWRkKGguY29tcGxldGUpLEUuZG9uZShoLnN1Y2Nlc3MpLEUuZmFpbChoLmVycm9yKSxpPV90KFd0LGgsbixFKSl7aWYoRS5yZWFkeVN0YXRlPTEsZiYmeS50cmlnZ2VyKCJhamF4U2VuZCIsW0UsaF0pLGMpcmV0dXJuIEU7aC5hc3luYyYmaC50aW1lb3V0PjAmJih1PWUuc2V0VGltZW91dChmdW5jdGlvbigpe0UuYWJvcnQoInRpbWVvdXQiKX0saC50aW1lb3V0KSk7dHJ5e2M9ITEsaS5zZW5kKGIsayl9Y2F0Y2goZSl7aWYoYyl0aHJvdyBlO2soLTEsZSl9fWVsc2UgaygtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gayh0LG4scixzKXt2YXIgbCxwLGQsYixULEM9bjtjfHwoYz0hMCx1JiZlLmNsZWFyVGltZW91dCh1KSxpPXZvaWQgMCxhPXN8fCIiLEUucmVhZHlTdGF0ZT10PjA/NDowLGw9dD49MjAwJiZ0PDMwMHx8MzA0PT09dCxyJiYoYj1YdChoLEUscikpLGI9VXQoaCxiLEUsbCksbD8oaC5pZk1vZGlmaWVkJiYoKFQ9RS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKSYmKHcubGFzdE1vZGlmaWVkW29dPVQpLChUPUUuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJih3LmV0YWdbb109VCkpLDIwND09PXR8fCJIRUFEIj09PWgudHlwZT9DPSJub2NvbnRlbnQiOjMwND09PXQ/Qz0ibm90bW9kaWZpZWQiOihDPWIuc3RhdGUscD1iLmRhdGEsbD0hKGQ9Yi5lcnJvcikpKTooZD1DLCF0JiZDfHwoQz0iZXJyb3IiLHQ8MCYmKHQ9MCkpKSxFLnN0YXR1cz10LEUuc3RhdHVzVGV4dD0obnx8QykrIiIsbD92LnJlc29sdmVXaXRoKGcsW3AsQyxFXSk6di5yZWplY3RXaXRoKGcsW0UsQyxkXSksRS5zdGF0dXNDb2RlKHgpLHg9dm9pZCAwLGYmJnkudHJpZ2dlcihsPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW0UsaCxsP3A6ZF0pLG0uZmlyZVdpdGgoZyxbRSxDXSksZiYmKHkudHJpZ2dlcigiYWpheENvbXBsZXRlIixbRSxoXSksLS13LmFjdGl2ZXx8dy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIEV9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB3LmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdy5nZXQoZSx2b2lkIDAsdCwic2NyaXB0Iil9fSksdy5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsdCl7d1t0XT1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4gZyhuKSYmKGk9aXx8cixyPW4sbj12b2lkIDApLHcuYWpheCh3LmV4dGVuZCh7dXJsOmUsdHlwZTp0LGRhdGFUeXBlOmksZGF0YTpuLHN1Y2Nlc3M6cn0sdy5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSksdy5fZXZhbFVybD1mdW5jdGlvbihlKXtyZXR1cm4gdy5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSx3LmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpc1swXSYmKGcoZSkmJihlPWUuY2FsbCh0aGlzWzBdKSksdD13KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihlKXtyZXR1cm4gZyhlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7dyh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dyh0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD1nKGUpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7dyh0aGlzKS53cmFwQWxsKHQ/ZS5jYWxsKHRoaXMsbik6ZSl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7dyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSx3LmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIXcuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LHcuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSx3LmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBWdD17MDoyMDAsMTIyMzoyMDR9LEd0PXcuYWpheFNldHRpbmdzLnhocigpO2guY29ycz0hIUd0JiYid2l0aENyZWRlbnRpYWxzImluIEd0LGguYWpheD1HdD0hIUd0LHcuYWpheFRyYW5zcG9ydChmdW5jdGlvbih0KXt2YXIgbixyO2lmKGguY29yc3x8R3QmJiF0LmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGksbyl7dmFyIGEscz10LnhocigpO2lmKHMub3Blbih0LnR5cGUsdC51cmwsdC5hc3luYyx0LnVzZXJuYW1lLHQucGFzc3dvcmQpLHQueGhyRmllbGRzKWZvcihhIGluIHQueGhyRmllbGRzKXNbYV09dC54aHJGaWVsZHNbYV07dC5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUodC5taW1lVHlwZSksdC5jcm9zc0RvbWFpbnx8aVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoaVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihhIGluIGkpcy5zZXRSZXF1ZXN0SGVhZGVyKGEsaVthXSk7bj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtuJiYobj1yPXMub25sb2FkPXMub25lcnJvcj1zLm9uYWJvcnQ9cy5vbnRpbWVvdXQ9cy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09ZT9zLmFib3J0KCk6ImVycm9yIj09PWU/Im51bWJlciIhPXR5cGVvZiBzLnN0YXR1cz9vKDAsImVycm9yIik6byhzLnN0YXR1cyxzLnN0YXR1c1RleHQpOm8oVnRbcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInRleHQiIT09KHMucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHMucmVzcG9uc2VUZXh0P3tiaW5hcnk6cy5yZXNwb25zZX06e3RleHQ6cy5yZXNwb25zZVRleHR9LHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPW4oKSxyPXMub25lcnJvcj1zLm9udGltZW91dD1uKCJlcnJvciIpLHZvaWQgMCE9PXMub25hYm9ydD9zLm9uYWJvcnQ9cjpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1zLnJlYWR5U3RhdGUmJmUuc2V0VGltZW91dChmdW5jdGlvbigpe24mJnIoKX0pfSxuPW4oImFib3J0Iik7dHJ5e3Muc2VuZCh0Lmhhc0NvbnRlbnQmJnQuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYobil0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX0pLHcuYWpheFByZWZpbHRlcihmdW5jdGlvbihlKXtlLmNyb3NzRG9tYWluJiYoZS5jb250ZW50cy5zY3JpcHQ9ITEpfSksdy5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZ2xvYmFsRXZhbChlKSxlfX19KSx3LmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS5jYWNoZSYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9IkdFVCIpfSksdy5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2lmKGUuY3Jvc3NEb21haW4pe3ZhciB0LG47cmV0dXJue3NlbmQ6ZnVuY3Rpb24oaSxvKXt0PXcoIjxzY3JpcHQ+IikucHJvcCh7Y2hhcnNldDplLnNjcmlwdENoYXJzZXQsc3JjOmUudXJsfSkub24oImxvYWQgZXJyb3IiLG49ZnVuY3Rpb24oZSl7dC5yZW1vdmUoKSxuPW51bGwsZSYmbygiZXJyb3IiPT09ZS50eXBlPzQwNDoyMDAsZS50eXBlKX0pLHIuaGVhZC5hcHBlbmRDaGlsZCh0WzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX19KTt2YXIgWXQ9W10sUXQ9Lyg9KVw/KD89JnwkKXxcP1w/Lzt3LmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9WXQucG9wKCl8fHcuZXhwYW5kbysiXyIrRXQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLHcuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24odCxuLHIpe3ZhciBpLG8sYSxzPSExIT09dC5qc29ucCYmKFF0LnRlc3QodC51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgdC5kYXRhJiYwPT09KHQuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmUXQudGVzdCh0LmRhdGEpJiYiZGF0YSIpO2lmKHN8fCJqc29ucCI9PT10LmRhdGFUeXBlc1swXSlyZXR1cm4gaT10Lmpzb25wQ2FsbGJhY2s9Zyh0Lmpzb25wQ2FsbGJhY2spP3QuanNvbnBDYWxsYmFjaygpOnQuanNvbnBDYWxsYmFjayxzP3Rbc109dFtzXS5yZXBsYWNlKFF0LCIkMSIraSk6ITEhPT10Lmpzb25wJiYodC51cmwrPShrdC50ZXN0KHQudXJsKT8iJiI6Ij8iKSt0Lmpzb25wKyI9IitpKSx0LmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gYXx8dy5lcnJvcihpKyIgd2FzIG5vdCBjYWxsZWQiKSxhWzBdfSx0LmRhdGFUeXBlc1swXT0ianNvbiIsbz1lW2ldLGVbaV09ZnVuY3Rpb24oKXthPWFyZ3VtZW50c30sci5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1vP3coZSkucmVtb3ZlUHJvcChpKTplW2ldPW8sdFtpXSYmKHQuanNvbnBDYWxsYmFjaz1uLmpzb25wQ2FsbGJhY2ssWXQucHVzaChpKSksYSYmZyhvKSYmbyhhWzBdKSxhPW89dm9pZCAwfSksInNjcmlwdCJ9KSxoLmNyZWF0ZUhUTUxEb2N1bWVudD1mdW5jdGlvbigpe3ZhciBlPXIuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5O3JldHVybiBlLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1lLmNoaWxkTm9kZXMubGVuZ3RofSgpLHcucGFyc2VIVE1MPWZ1bmN0aW9uKGUsdCxuKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuW107ImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKTt2YXIgaSxvLGE7cmV0dXJuIHR8fChoLmNyZWF0ZUhUTUxEb2N1bWVudD8oKGk9KHQ9ci5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpKS5jcmVhdGVFbGVtZW50KCJiYXNlIikpLmhyZWY9ci5sb2NhdGlvbi5ocmVmLHQuaGVhZC5hcHBlbmRDaGlsZChpKSk6dD1yKSxvPUEuZXhlYyhlKSxhPSFuJiZbXSxvP1t0LmNyZWF0ZUVsZW1lbnQob1sxXSldOihvPXhlKFtlXSx0LGEpLGEmJmEubGVuZ3RoJiZ3KGEpLnJlbW92ZSgpLHcubWVyZ2UoW10sby5jaGlsZE5vZGVzKSl9LHcuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybiBzPi0xJiYocj12dChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksZyh0KT8obj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksYS5sZW5ndGg+MCYmdy5hamF4KHt1cmw6ZSx0eXBlOml8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP3coIjxkaXY+IikuYXBwZW5kKHcucGFyc2VIVE1MKGUpKS5maW5kKHIpOmUpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pfSksdGhpc30sdy5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oZSx0KXt3LmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksdy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZ3JlcCh3LnRpbWVycyxmdW5jdGlvbih0KXtyZXR1cm4gZT09PXQuZWxlbX0pLmxlbmd0aH0sdy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYz13LmNzcyhlLCJwb3NpdGlvbiIpLGY9dyhlKSxwPXt9OyJzdGF0aWMiPT09YyYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1mLm9mZnNldCgpLG89dy5jc3MoZSwidG9wIiksdT13LmNzcyhlLCJsZWZ0IiksKGw9KCJhYnNvbHV0ZSI9PT1jfHwiZml4ZWQiPT09YykmJihvK3UpLmluZGV4T2YoImF1dG8iKT4tMSk/KGE9KHI9Zi5wb3NpdGlvbigpKS50b3AsaT1yLmxlZnQpOihhPXBhcnNlRmxvYXQobyl8fDAsaT1wYXJzZUZsb2F0KHUpfHwwKSxnKHQpJiYodD10LmNhbGwoZSxuLHcuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihwLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihwLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxwKTpmLmNzcyhwKX19LHcuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oZSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt3Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIHQsbixyPXRoaXNbMF07aWYocilyZXR1cm4gci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8odD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6dC50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OnQubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH19LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxpPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT13LmNzcyhyLCJwb3NpdGlvbiIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT13LmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5wYXJlbnROb2RlO2UmJmUhPT1yJiYxPT09ZS5ub2RlVHlwZSYmKChpPXcoZSkub2Zmc2V0KCkpLnRvcCs9dy5jc3MoZSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxpLmxlZnQrPXcuY3NzKGUsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOnQudG9wLWkudG9wLXcuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LWkubGVmdC13LmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmInN0YXRpYyI9PT13LmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV8fGJlfSl9fSksdy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIG49InBhZ2VZT2Zmc2V0Ij09PXQ7dy5mbltlXT1mdW5jdGlvbihyKXtyZXR1cm4geih0aGlzLGZ1bmN0aW9uKGUscixpKXt2YXIgbztpZih5KGUpP289ZTo5PT09ZS5ub2RlVHlwZSYmKG89ZS5kZWZhdWx0Vmlldyksdm9pZCAwPT09aSlyZXR1cm4gbz9vW3RdOmVbcl07bz9vLnNjcm9sbFRvKG4/by5wYWdlWE9mZnNldDppLG4/aTpvLnBhZ2VZT2Zmc2V0KTplW3JdPWl9LGUscixhcmd1bWVudHMubGVuZ3RoKX19KSx3LmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSx0KXt3LmNzc0hvb2tzW3RdPV9lKGgucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLG4pe2lmKG4pcmV0dXJuIG49RmUoZSx0KSxXZS50ZXN0KG4pP3coZSkucG9zaXRpb24oKVt0XSsicHgiOm59KX0pLHcuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsdCl7dy5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50OnQsIiI6Im91dGVyIitlfSxmdW5jdGlvbihuLHIpe3cuZm5bcl09ZnVuY3Rpb24oaSxvKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2YgaSkscz1ufHwoITA9PT1pfHwhMD09PW8/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB6KHRoaXMsZnVuY3Rpb24odCxuLGkpe3ZhciBvO3JldHVybiB5KHQpPzA9PT1yLmluZGV4T2YoIm91dGVyIik/dFsiaW5uZXIiK2VdOnQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2VdOjk9PT10Lm5vZGVUeXBlPyhvPXQuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KHQuYm9keVsic2Nyb2xsIitlXSxvWyJzY3JvbGwiK2VdLHQuYm9keVsib2Zmc2V0IitlXSxvWyJvZmZzZXQiK2VdLG9bImNsaWVudCIrZV0pKTp2b2lkIDA9PT1pP3cuY3NzKHQsbixzKTp3LnN0eWxlKHQsbixpLHMpfSx0LGE/aTp2b2lkIDAsYSl9fSl9KSx3LmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXt3LmZuW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKHQsbnVsbCxlLG4pOnRoaXMudHJpZ2dlcih0KX19KSx3LmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9fSksdy5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9uKGUsbnVsbCx0LG4pfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vZmYoZSxudWxsLHQpfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwiKioiLG4pfX0pLHcucHJveHk9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYobj1lW3RdLHQ9ZSxlPW4pLGcoZSkpcmV0dXJuIHI9by5jYWxsKGFyZ3VtZW50cywyKSxpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChvLmNhbGwoYXJndW1lbnRzKSkpfSxpLmd1aWQ9ZS5ndWlkPWUuZ3VpZHx8dy5ndWlkKyssaX0sdy5ob2xkUmVhZHk9ZnVuY3Rpb24oZSl7ZT93LnJlYWR5V2FpdCsrOncucmVhZHkoITApfSx3LmlzQXJyYXk9QXJyYXkuaXNBcnJheSx3LnBhcnNlSlNPTj1KU09OLnBhcnNlLHcubm9kZU5hbWU9Tix3LmlzRnVuY3Rpb249Zyx3LmlzV2luZG93PXksdy5jYW1lbENhc2U9Ryx3LnR5cGU9eCx3Lm5vdz1EYXRlLm5vdyx3LmlzTnVtZXJpYz1mdW5jdGlvbihlKXt2YXIgdD13LnR5cGUoZSk7cmV0dXJuKCJudW1iZXIiPT09dHx8InN0cmluZyI9PT10KSYmIWlzTmFOKGUtcGFyc2VGbG9hdChlKSl9LCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB3fSk7dmFyIEp0PWUualF1ZXJ5LEt0PWUuJDtyZXR1cm4gdy5ub0NvbmZsaWN0PWZ1bmN0aW9uKHQpe3JldHVybiBlLiQ9PT13JiYoZS4kPUt0KSx0JiZlLmpRdWVyeT09PXcmJihlLmpRdWVyeT1KdCksd30sdHx8KGUualF1ZXJ5PWUuJD13KSx3fSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAqIGpRdWVyeSBUZW1wbGF0ZXMgUGx1Z2luIDEuMC4wcHJlCiAqIGh0dHA6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdG1wbAogKiBSZXF1aXJlcyBqUXVlcnkgMS40LjIKICoKICogQ29weXJpZ2h0IFNvZnR3YXJlIEZyZWVkb20gQ29uc2VydmFuY3ksIEluYy4KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICovCihmdW5jdGlvbihhKXt2YXIgcj1hLmZuLmRvbU1hbmlwLGQ9Il90bXBsaXRlbSIscT0vXltePF0qKDxbXHdcV10rPilbXj5dKiR8XHtce1whIC8sYj17fSxmPXt9LGUscD17a2V5OjAsZGF0YTp7fX0saT0wLGM9MCxsPVtdO2Z1bmN0aW9uIGcoZyxkLGgsZSl7dmFyIGM9e2RhdGE6ZXx8KGU9PT0wfHxlPT09ZmFsc2UpP2U6ZD9kLmRhdGE6e30sX3dyYXA6ZD9kLl93cmFwOm51bGwsdG1wbDpudWxsLHBhcmVudDpkfHxudWxsLG5vZGVzOltdLGNhbGxzOnUsbmVzdDp3LHdyYXA6eCxodG1sOnYsdXBkYXRlOnR9O2cmJmEuZXh0ZW5kKGMsZyx7bm9kZXM6W10scGFyZW50OmR9KTtpZihoKXtjLnRtcGw9aDtjLl9jdG50PWMuX2N0bnR8fGMudG1wbChhLGMpO2Mua2V5PSsraTsobC5sZW5ndGg/ZjpiKVtpXT1jfXJldHVybiBjfWEuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGYsZCl7YS5mbltmXT1mdW5jdGlvbihuKXt2YXIgZz1bXSxpPWEobiksayxoLG0sbCxqPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2U9Ynx8e307aWYoaiYmai5ub2RlVHlwZT09PTExJiZqLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmaS5sZW5ndGg9PT0xKXtpW2RdKHRoaXNbMF0pO2c9dGhpc31lbHNle2ZvcihoPTAsbT1pLmxlbmd0aDtoPG07aCsrKXtjPWg7az0oaD4wP3RoaXMuY2xvbmUodHJ1ZSk6dGhpcykuZ2V0KCk7YShpW2hdKVtkXShrKTtnPWcuY29uY2F0KGspfWM9MDtnPXRoaXMucHVzaFN0YWNrKGcsZixpLnNlbGVjdG9yKX1sPWU7ZT1udWxsO2EudG1wbC5jb21wbGV0ZShsKTtyZXR1cm4gZ319KTthLmZuLmV4dGVuZCh7dG1wbDpmdW5jdGlvbihkLGMsYil7cmV0dXJuIGEudG1wbCh0aGlzWzBdLGQsYyxiKX0sdG1wbEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gYS50bXBsSXRlbSh0aGlzWzBdKX0sdGVtcGxhdGU6ZnVuY3Rpb24oYil7cmV0dXJuIGEudGVtcGxhdGUoYix0aGlzWzBdKX0sZG9tTWFuaXA6ZnVuY3Rpb24oZCxtLGspe2lmKGRbMF0mJmEuaXNBcnJheShkWzBdKSl7dmFyIGc9YS5tYWtlQXJyYXkoYXJndW1lbnRzKSxoPWRbMF0saj1oLmxlbmd0aCxpPTAsZjt3aGlsZShpPGomJiEoZj1hLmRhdGEoaFtpKytdLCJ0bXBsSXRlbSIpKSk7aWYoZiYmYylnWzJdPWZ1bmN0aW9uKGIpe2EudG1wbC5hZnRlck1hbmlwKHRoaXMsYixrKX07ci5hcHBseSh0aGlzLGcpfWVsc2Ugci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Yz0wOyFlJiZhLnRtcGwuY29tcGxldGUoYik7cmV0dXJuIHRoaXN9fSk7YS5leHRlbmQoe3RtcGw6ZnVuY3Rpb24oZCxoLGUsYyl7dmFyIGksaz0hYztpZihrKXtjPXA7ZD1hLnRlbXBsYXRlW2RdfHxhLnRlbXBsYXRlKG51bGwsZCk7Zj17fX1lbHNlIGlmKCFkKXtkPWMudG1wbDtiW2Mua2V5XT1jO2Mubm9kZXM9W107Yy53cmFwcGVkJiZuKGMsYy53cmFwcGVkKTtyZXR1cm4gYShqKGMsbnVsbCxjLnRtcGwoYSxjKSkpfWlmKCFkKXJldHVybltdO2lmKHR5cGVvZiBoPT09ImZ1bmN0aW9uIiloPWguY2FsbChjfHx7fSk7ZSYmZS53cmFwcGVkJiZuKGUsZS53cmFwcGVkKTtpPWEuaXNBcnJheShoKT9hLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhP2coZSxjLGQsYSk6bnVsbH0pOltnKGUsYyxkLGgpXTtyZXR1cm4gaz9hKGooYyxudWxsLGkpKTppfSx0bXBsSXRlbTpmdW5jdGlvbihiKXt2YXIgYztpZihiIGluc3RhbmNlb2YgYSliPWJbMF07d2hpbGUoYiYmYi5ub2RlVHlwZT09PTEmJiEoYz1hLmRhdGEoYiwidG1wbEl0ZW0iKSkmJihiPWIucGFyZW50Tm9kZSkpO3JldHVybiBjfHxwfSx0ZW1wbGF0ZTpmdW5jdGlvbihjLGIpe2lmKGIpe2lmKHR5cGVvZiBiPT09InN0cmluZyIpYj1vKGIpO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIGEpYj1iWzBdfHx7fTtpZihiLm5vZGVUeXBlKWI9YS5kYXRhKGIsInRtcGwiKXx8YS5kYXRhKGIsInRtcGwiLG8oYi5pbm5lckhUTUwpKTtyZXR1cm4gdHlwZW9mIGM9PT0ic3RyaW5nIj8oYS50ZW1wbGF0ZVtjXT1iKTpifXJldHVybiBjP3R5cGVvZiBjIT09InN0cmluZyI/YS50ZW1wbGF0ZShudWxsLGMpOmEudGVtcGxhdGVbY118fGEudGVtcGxhdGUobnVsbCxxLnRlc3QoYyk/YzphKGMpKTpudWxsfSxlbmNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuKCIiK2EpLnNwbGl0KCImIikuam9pbigiJmFtcDsiKS5zcGxpdCgiPCIpLmpvaW4oIiZsdDsiKS5zcGxpdCgiPiIpLmpvaW4oIiZndDsiKS5zcGxpdCgnIicpLmpvaW4oIiYjMzQ7Iikuc3BsaXQoIiciKS5qb2luKCImIzM5OyIpfX0pO2EuZXh0ZW5kKGEudG1wbCx7dGFnOnt0bXBsOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiJpZigkbm90bnVsbF8xKXtfXz1fXy5jb25jYXQoJGl0ZW0ubmVzdCgkMSwkMikpO30ifSx3cmFwOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiIkaXRlbS5jYWxscyhfXywkMSwkMik7X189W107IixjbG9zZToiY2FsbD0kaXRlbS5jYWxscygpO19fPWNhbGwuXy5jb25jYXQoJGl0ZW0ud3JhcChjYWxsLF9fKSk7In0sZWFjaDp7X2RlZmF1bHQ6eyQyOiIkaW5kZXgsICR2YWx1ZSJ9LG9wZW46ImlmKCRub3RudWxsXzEpeyQuZWFjaCgkMWEsZnVuY3Rpb24oJDIpe3dpdGgodGhpcyl7IixjbG9zZToifX0pO30ifSwiaWYiOntvcGVuOiJpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsiLGNsb3NlOiJ9In0sImVsc2UiOntfZGVmYXVsdDp7JDE6InRydWUifSxvcGVuOiJ9ZWxzZSBpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsifSxodG1sOntvcGVuOiJpZigkbm90bnVsbF8xKXtfXy5wdXNoKCQxYSk7fSJ9LCI9Ijp7X2RlZmF1bHQ6eyQxOiIkZGF0YSJ9LG9wZW46ImlmKCRub3RudWxsXzEpe19fLnB1c2goJC5lbmNvZGUoJDFhKSk7fSJ9LCIhIjp7b3BlbjoiIn19LGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yj17fX0sYWZ0ZXJNYW5pcDpmdW5jdGlvbihmLGIsZCl7dmFyIGU9Yi5ub2RlVHlwZT09PTExP2EubWFrZUFycmF5KGIuY2hpbGROb2Rlcyk6Yi5ub2RlVHlwZT09PTE/W2JdOltdO2QuY2FsbChmLGIpO20oZSk7YysrfX0pO2Z1bmN0aW9uIGooZSxnLGYpe3ZhciBiLGM9Zj9hLm1hcChmLGZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2Uua2V5P2EucmVwbGFjZSgvKDxcdyspKD89W1xzPl0pKD8hW14+XSpfdG1wbGl0ZW0pKFtePl0qKS9nLCIkMSAiK2QrJz0iJytlLmtleSsnIiAkMicpOmE6aihhLGUsYS5fY3RudCl9KTplO2lmKGcpcmV0dXJuIGM7Yz1jLmpvaW4oIiIpO2MucmVwbGFjZSgvXlxzKihbXjxcc11bXjxdKik/KDxbXHdcV10rPikoW14+XSpbXj5cc10pP1xzKiQvLGZ1bmN0aW9uKGYsYyxlLGQpe2I9YShlKS5nZXQoKTttKGIpO2lmKGMpYj1rKGMpLmNvbmNhdChiKTtpZihkKWI9Yi5jb25jYXQoayhkKSl9KTtyZXR1cm4gYj9iOmsoYyl9ZnVuY3Rpb24gayhjKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlubmVySFRNTD1jO3JldHVybiBhLm1ha2VBcnJheShiLmNoaWxkTm9kZXMpfWZ1bmN0aW9uIG8oYil7cmV0dXJuIG5ldyBGdW5jdGlvbigialF1ZXJ5IiwiJGl0ZW0iLCJ2YXIgJD1qUXVlcnksY2FsbCxfXz1bXSwkZGF0YT0kaXRlbS5kYXRhO3dpdGgoJGRhdGEpe19fLnB1c2goJyIrYS50cmltKGIpLnJlcGxhY2UoLyhbXFwnXSkvZywiXFwkMSIpLnJlcGxhY2UoL1tcclx0XG5dL2csIiAiKS5yZXBsYWNlKC9cJFx7KFteXH1dKilcfS9nLCJ7ez0gJDF9fSIpLnJlcGxhY2UoL1x7XHsoXC8/KShcdyt8LikoPzpcKCgoPzpbXlx9XXxcfSg/IVx9KSkqPyk/XCkpPyg/OlxzKyguKj8pPyk/KFwoKCg/OlteXH1dfFx9KD8hXH0pKSo/KVwpKT9ccypcfVx9L2csZnVuY3Rpb24obSxsLGssZyxiLGMsZCl7dmFyIGo9YS50bXBsLnRhZ1trXSxpLGUsZjtpZighail0aHJvdyJVbmtub3duIHRlbXBsYXRlIHRhZzogIitrO2k9ai5fZGVmYXVsdHx8W107aWYoYyYmIS9cdyQvLnRlc3QoYikpe2IrPWM7Yz0iIn1pZihiKXtiPWgoYik7ZD1kPyIsIitoKGQpKyIpIjpjPyIpIjoiIjtlPWM/Yi5pbmRleE9mKCIuIik+LTE/YitoKGMpOiIoIitiKyIpLmNhbGwoJGl0ZW0iK2Q6YjtmPWM/ZToiKHR5cGVvZigiK2IrIik9PT0nZnVuY3Rpb24nPygiK2IrIikuY2FsbCgkaXRlbSk6KCIrYisiKSkifWVsc2UgZj1lPWkuJDF8fCJudWxsIjtnPWgoZyk7cmV0dXJuIicpOyIraltsPyJjbG9zZSI6Im9wZW4iXS5zcGxpdCgiJG5vdG51bGxfMSIpLmpvaW4oYj8idHlwZW9mKCIrYisiKSE9PSd1bmRlZmluZWQnICYmICgiK2IrIikhPW51bGwiOiJ0cnVlIikuc3BsaXQoIiQxYSIpLmpvaW4oZikuc3BsaXQoIiQxIikuam9pbihlKS5zcGxpdCgiJDIiKS5qb2luKGd8fGkuJDJ8fCIiKSsiX18ucHVzaCgnIn0pKyInKTt9cmV0dXJuIF9fOyIpfWZ1bmN0aW9uIG4oYyxiKXtjLl93cmFwPWooYyx0cnVlLGEuaXNBcnJheShiKT9iOltxLnRlc3QoYik/YjphKGIpLmh0bWwoKV0pLmpvaW4oIiIpfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGE/YS5yZXBsYWNlKC9cXCcvZywiJyIpLnJlcGxhY2UoL1xcXFwvZywiXFwiKTpudWxsfWZ1bmN0aW9uIHMoYil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5hcHBlbmRDaGlsZChiLmNsb25lTm9kZSh0cnVlKSk7cmV0dXJuIGEuaW5uZXJIVE1MfWZ1bmN0aW9uIG0obyl7dmFyIG49Il8iK2MsayxqLGw9e30sZSxwLGg7Zm9yKGU9MCxwPW8ubGVuZ3RoO2U8cDtlKyspe2lmKChrPW9bZV0pLm5vZGVUeXBlIT09MSljb250aW51ZTtqPWsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTtmb3IoaD1qLmxlbmd0aC0xO2g+PTA7aC0tKW0oaltoXSk7bShrKX1mdW5jdGlvbiBtKGope3ZhciBwLGg9aixrLGUsbTtpZihtPWouZ2V0QXR0cmlidXRlKGQpKXt3aGlsZShoLnBhcmVudE5vZGUmJihoPWgucGFyZW50Tm9kZSkubm9kZVR5cGU9PT0xJiYhKHA9aC5nZXRBdHRyaWJ1dGUoZCkpKTtpZihwIT09bSl7aD1oLnBhcmVudE5vZGU/aC5ub2RlVHlwZT09PTExPzA6aC5nZXRBdHRyaWJ1dGUoZCl8fDA6MDtpZighKGU9YlttXSkpe2U9ZlttXTtlPWcoZSxiW2hdfHxmW2hdKTtlLmtleT0rK2k7YltpXT1lfWMmJm8obSl9ai5yZW1vdmVBdHRyaWJ1dGUoZCl9ZWxzZSBpZihjJiYoZT1hLmRhdGEoaiwidG1wbEl0ZW0iKSkpe28oZS5rZXkpO2JbZS5rZXldPWU7aD1hLmRhdGEoai5wYXJlbnROb2RlLCJ0bXBsSXRlbSIpO2g9aD9oLmtleTowfWlmKGUpe2s9ZTt3aGlsZShrJiZrLmtleSE9aCl7ay5ub2Rlcy5wdXNoKGopO2s9ay5wYXJlbnR9ZGVsZXRlIGUuX2N0bnQ7ZGVsZXRlIGUuX3dyYXA7YS5kYXRhKGosInRtcGxJdGVtIixlKX1mdW5jdGlvbiBvKGEpe2E9YStuO2U9bFthXT1sW2FdfHxnKGUsYltlLnBhcmVudC5rZXkrbl18fGUucGFyZW50KX19fWZ1bmN0aW9uIHUoYSxkLGMsYil7aWYoIWEpcmV0dXJuIGwucG9wKCk7bC5wdXNoKHtfOmEsdG1wbDpkLGl0ZW06dGhpcyxkYXRhOmMsb3B0aW9uczpifSl9ZnVuY3Rpb24gdyhkLGMsYil7cmV0dXJuIGEudG1wbChhLnRlbXBsYXRlKGQpLGMsYix0aGlzKX1mdW5jdGlvbiB4KGIsZCl7dmFyIGM9Yi5vcHRpb25zfHx7fTtjLndyYXBwZWQ9ZDtyZXR1cm4gYS50bXBsKGEudGVtcGxhdGUoYi50bXBsKSxiLmRhdGEsYyxiLml0ZW0pfWZ1bmN0aW9uIHYoZCxjKXt2YXIgYj10aGlzLl93cmFwO3JldHVybiBhLm1hcChhKGEuaXNBcnJheShiKT9iLmpvaW4oIiIpOmIpLmZpbHRlcihkfHwiKiIpLGZ1bmN0aW9uKGEpe3JldHVybiBjP2EuaW5uZXJUZXh0fHxhLnRleHRDb250ZW50OmEub3V0ZXJIVE1MfHxzKGEpfSl9ZnVuY3Rpb24gdCgpe3ZhciBiPXRoaXMubm9kZXM7YS50bXBsKG51bGwsbnVsbCxudWxsLHRoaXMpLmluc2VydEJlZm9yZShiWzBdKTthKGIpLnJlbW92ZSgpfX0pKGpRdWVyeSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiFmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImpxdWVyeSJdLGUpOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUocmVxdWlyZSgianF1ZXJ5IikpOmUoalF1ZXJ5KX0oZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1lLnRhYmxlc29ydGVyPXt2ZXJzaW9uOiIyLjMwLjUiLHBhcnNlcnM6W10sd2lkZ2V0czpbXSxkZWZhdWx0czp7dGhlbWU6ImRlZmF1bHQiLHdpZHRoRml4ZWQ6ITEsc2hvd1Byb2Nlc3Npbmc6ITEsaGVhZGVyVGVtcGxhdGU6Intjb250ZW50fSIsb25SZW5kZXJUZW1wbGF0ZTpudWxsLG9uUmVuZGVySGVhZGVyOm51bGwsY2FuY2VsU2VsZWN0aW9uOiEwLHRhYkluZGV4OiEwLGRhdGVGb3JtYXQ6Im1tZGR5eXl5Iixzb3J0TXVsdGlTb3J0S2V5OiJzaGlmdEtleSIsc29ydFJlc2V0S2V5OiJjdHJsS2V5Iix1c051bWJlckZvcm1hdDohMCxkZWxheUluaXQ6ITEsc2VydmVyU2lkZVNvcnRpbmc6ITEscmVzb3J0OiEwLGhlYWRlcnM6e30saWdub3JlQ2FzZTohMCxzb3J0Rm9yY2U6bnVsbCxzb3J0TGlzdDpbXSxzb3J0QXBwZW5kOm51bGwsc29ydFN0YWJsZTohMSxzb3J0SW5pdGlhbE9yZGVyOiJhc2MiLHNvcnRMb2NhbGVDb21wYXJlOiExLHNvcnRSZXNldDohMSxzb3J0UmVzdGFydDohMSxlbXB0eVRvOiJib3R0b20iLHN0cmluZ1RvOiJtYXgiLGR1cGxpY2F0ZVNwYW46ITAsdGV4dEV4dHJhY3Rpb246ImJhc2ljIix0ZXh0QXR0cmlidXRlOiJkYXRhLXRleHQiLHRleHRTb3J0ZXI6bnVsbCxudW1iZXJTb3J0ZXI6bnVsbCxpbml0V2lkZ2V0czohMCx3aWRnZXRDbGFzczoid2lkZ2V0LXtuYW1lfSIsd2lkZ2V0czpbXSx3aWRnZXRPcHRpb25zOnt6ZWJyYTpbImV2ZW4iLCJvZGQiXX0saW5pdGlhbGl6ZWQ6bnVsbCx0YWJsZUNsYXNzOiIiLGNzc0FzYzoiIixjc3NEZXNjOiIiLGNzc05vbmU6IiIsY3NzSGVhZGVyOiIiLGNzc0hlYWRlclJvdzoiIixjc3NQcm9jZXNzaW5nOiIiLGNzc0NoaWxkUm93OiJ0YWJsZXNvcnRlci1jaGlsZFJvdyIsY3NzSW5mb0Jsb2NrOiJ0YWJsZXNvcnRlci1pbmZvT25seSIsY3NzTm9Tb3J0OiJ0YWJsZXNvcnRlci1ub1NvcnQiLGNzc0lnbm9yZVJvdzoidGFibGVzb3J0ZXItaWdub3JlUm93Iixjc3NJY29uOiJ0YWJsZXNvcnRlci1pY29uIixjc3NJY29uTm9uZToiIixjc3NJY29uQXNjOiIiLGNzc0ljb25EZXNjOiIiLGNzc0ljb25EaXNhYmxlZDoiIixwb2ludGVyQ2xpY2s6ImNsaWNrIixwb2ludGVyRG93bjoibW91c2Vkb3duIixwb2ludGVyVXA6Im1vdXNldXAiLHNlbGVjdG9ySGVhZGVyczoiPiB0aGVhZCB0aCwgPiB0aGVhZCB0ZCIsc2VsZWN0b3JTb3J0OiJ0aCwgdGQiLHNlbGVjdG9yUmVtb3ZlOiIucmVtb3ZlLW1lIixkZWJ1ZzohMSxoZWFkZXJMaXN0OltdLGVtcHRpZXM6e30sc3RyaW5nczp7fSxwYXJzZXJzOltdLGdsb2JhbGl6ZTowLGltZ0F0dHI6MH0sY3NzOnt0YWJsZToidGFibGVzb3J0ZXIiLGNzc0hhc0NoaWxkOiJ0YWJsZXNvcnRlci1oYXNDaGlsZFJvdyIsY2hpbGRSb3c6InRhYmxlc29ydGVyLWNoaWxkUm93Iixjb2xncm91cDoidGFibGVzb3J0ZXItY29sZ3JvdXAiLGhlYWRlcjoidGFibGVzb3J0ZXItaGVhZGVyIixoZWFkZXJSb3c6InRhYmxlc29ydGVyLWhlYWRlclJvdyIsaGVhZGVySW46InRhYmxlc29ydGVyLWhlYWRlci1pbm5lciIsaWNvbjoidGFibGVzb3J0ZXItaWNvbiIscHJvY2Vzc2luZzoidGFibGVzb3J0ZXItcHJvY2Vzc2luZyIsc29ydEFzYzoidGFibGVzb3J0ZXItaGVhZGVyQXNjIixzb3J0RGVzYzoidGFibGVzb3J0ZXItaGVhZGVyRGVzYyIsc29ydE5vbmU6InRhYmxlc29ydGVyLWhlYWRlclVuU29ydGVkIn0sbGFuZ3VhZ2U6e3NvcnRBc2M6IkFzY2VuZGluZyBzb3J0IGFwcGxpZWQsICIsc29ydERlc2M6IkRlc2NlbmRpbmcgc29ydCBhcHBsaWVkLCAiLHNvcnROb25lOiJObyBzb3J0IGFwcGxpZWQsICIsc29ydERpc2FibGVkOiJzb3J0aW5nIGlzIGRpc2FibGVkIixuZXh0QXNjOiJhY3RpdmF0ZSB0byBhcHBseSBhbiBhc2NlbmRpbmcgc29ydCIsbmV4dERlc2M6ImFjdGl2YXRlIHRvIGFwcGx5IGEgZGVzY2VuZGluZyBzb3J0IixuZXh0Tm9uZToiYWN0aXZhdGUgdG8gcmVtb3ZlIHRoZSBzb3J0In0scmVnZXg6e3RlbXBsYXRlQ29udGVudDovXHtjb250ZW50XH0vZyx0ZW1wbGF0ZUljb246L1x7aWNvblx9L2csdGVtcGxhdGVOYW1lOi9ce25hbWVcfS9pLHNwYWNlczovXHMrL2csbm9uV29yZDovXFcvZyxmb3JtRWxlbWVudHM6LyhpbnB1dHxzZWxlY3R8YnV0dG9ufHRleHRhcmVhKS9pLGNodW5rOi8oXihbK1wtXT8oPzpcZCopKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPyk/JHxeMHhbMC05YS1mXSskfFxkKykvZ2ksY2h1bmtzOi8oXlxcMHxcXDAkKS8saGV4Oi9eMHhbMC05YS1mXSskL2ksY29tbWE6LywvZyxkaWdpdE5vblVTOi9bXHN8XC5dL2csZGlnaXROZWdhdGl2ZVRlc3Q6L15ccypcKFsuXGRdK1wpLyxkaWdpdE5lZ2F0aXZlUmVwbGFjZTovXlxzKlwoKFsuXGRdKylcKS8sZGlnaXRUZXN0Oi9eW1wtKyhdP1xkK1spXT8kLyxkaWdpdFJlcGxhY2U6L1ssLiciXHNdL2d9LHN0cmluZzp7bWF4OjEsbWluOi0xLGVtcHR5bWluOjEsZW1wdHltYXg6LTEsemVybzowLG5vbmU6MCwibnVsbCI6MCx0b3A6ITAsYm90dG9tOiExfSxrZXlDb2Rlczp7ZW50ZXI6MTN9LGRhdGVzOnt9LGluc3RhbmNlTWV0aG9kczp7fSxzZXR1cDpmdW5jdGlvbihyLG8pe2lmKHImJnIudEhlYWQmJjAhPT1yLnRCb2RpZXMubGVuZ3RoJiYhMCE9PXIuaGFzSW5pdGlhbGl6ZWQpe3ZhciBzPSIiLGE9ZShyKSxuPWUubWV0YWRhdGE7ci5oYXNJbml0aWFsaXplZD0hMSxyLmlzUHJvY2Vzc2luZz0hMCxyLmNvbmZpZz1vLGUuZGF0YShyLCJ0YWJsZXNvcnRlciIsbyksdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkluaXRpYWxpemluZyB0YWJsZXNvcnRlciB2Iit0LnZlcnNpb24pLGUuZGF0YShyLCJzdGFydG92ZXJhbGx0aW1lciIsbmV3IERhdGUpKSxvLnN1cHBvcnRzRGF0YU9iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZVswXT1wYXJzZUludChlWzBdLDEwKSxlWzBdPjF8fDE9PT1lWzBdJiZwYXJzZUludChlWzFdLDEwKT49NH0oZS5mbi5qcXVlcnkuc3BsaXQoIi4iKSksby5lbXB0eVRvPW8uZW1wdHlUby50b0xvd2VyQ2FzZSgpLG8uc3RyaW5nVG89by5zdHJpbmdUby50b0xvd2VyQ2FzZSgpLG8ubGFzdD17c29ydExpc3Q6W10sY2xpY2tlZEluZGV4Oi0xfSwvdGFibGVzb3J0ZXJcLS8udGVzdChhLmF0dHIoImNsYXNzIikpfHwocz0iIiE9PW8udGhlbWU/IiB0YWJsZXNvcnRlci0iK28udGhlbWU6IiIpLG8ubmFtZXNwYWNlP28ubmFtZXNwYWNlPSIuIitvLm5hbWVzcGFjZS5yZXBsYWNlKHQucmVnZXgubm9uV29yZCwiIik6by5uYW1lc3BhY2U9Ii50YWJsZXNvcnRlciIrTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiksby50YWJsZT1yLG8uJHRhYmxlPWEuYWRkQ2xhc3ModC5jc3MudGFibGUrIiAiK28udGFibGVDbGFzcytzKyIgIitvLm5hbWVzcGFjZS5zbGljZSgxKSkuYXR0cigicm9sZSIsImdyaWQiKSxvLiRoZWFkZXJzPWEuZmluZChvLnNlbGVjdG9ySGVhZGVycyksby4kdGFibGUuY2hpbGRyZW4oKS5jaGlsZHJlbigidHIiKS5hdHRyKCJyb2xlIiwicm93Iiksby4kdGJvZGllcz1hLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrby5jc3NJbmZvQmxvY2srIikiKS5hdHRyKHsiYXJpYS1saXZlIjoicG9saXRlIiwiYXJpYS1yZWxldmFudCI6ImFsbCJ9KSxvLiR0YWJsZS5jaGlsZHJlbigiY2FwdGlvbiIpLmxlbmd0aCYmKChzPW8uJHRhYmxlLmNoaWxkcmVuKCJjYXB0aW9uIilbMF0pLmlkfHwocy5pZD1vLm5hbWVzcGFjZS5zbGljZSgxKSsiY2FwdGlvbiIpLG8uJHRhYmxlLmF0dHIoImFyaWEtbGFiZWxsZWRieSIscy5pZCkpLG8ud2lkZ2V0SW5pdD17fSxvLnRleHRFeHRyYWN0aW9uPW8uJHRhYmxlLmF0dHIoImRhdGEtdGV4dC1leHRyYWN0aW9uIil8fG8udGV4dEV4dHJhY3Rpb258fCJiYXNpYyIsdC5idWlsZEhlYWRlcnMobyksdC5maXhDb2x1bW5XaWR0aChyKSx0LmFkZFdpZGdldEZyb21DbGFzcyhyKSx0LmFwcGx5V2lkZ2V0T3B0aW9ucyhyKSx0LnNldHVwUGFyc2VycyhvKSxvLnRvdGFsUm93cz0wLG8uZGVidWcmJnQudmFsaWRhdGVPcHRpb25zKG8pLG8uZGVsYXlJbml0fHx0LmJ1aWxkQ2FjaGUobyksdC5iaW5kRXZlbnRzKHIsby4kaGVhZGVycywhMCksdC5iaW5kTWV0aG9kcyhvKSxvLnN1cHBvcnRzRGF0YU9iamVjdCYmdm9pZCAwIT09YS5kYXRhKCkuc29ydGxpc3Q/by5zb3J0TGlzdD1hLmRhdGEoKS5zb3J0bGlzdDpuJiZhLm1ldGFkYXRhKCkmJmEubWV0YWRhdGEoKS5zb3J0bGlzdCYmKG8uc29ydExpc3Q9YS5tZXRhZGF0YSgpLnNvcnRsaXN0KSx0LmFwcGx5V2lkZ2V0KHIsITApLG8uc29ydExpc3QubGVuZ3RoPjA/dC5zb3J0T24obyxvLnNvcnRMaXN0LHt9LCFvLmluaXRXaWRnZXRzKToodC5zZXRIZWFkZXJzQ3NzKG8pLG8uaW5pdFdpZGdldHMmJnQuYXBwbHlXaWRnZXQociwhMSkpLG8uc2hvd1Byb2Nlc3NpbmcmJmEudW5iaW5kKCJzb3J0QmVnaW4iK28ubmFtZXNwYWNlKyIgc29ydEVuZCIrby5uYW1lc3BhY2UpLmJpbmQoInNvcnRCZWdpbiIrby5uYW1lc3BhY2UrIiBzb3J0RW5kIitvLm5hbWVzcGFjZSxmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoby50aW1lclByb2Nlc3NpbmcpLHQuaXNQcm9jZXNzaW5nKHIpLCJzb3J0QmVnaW4iPT09ZS50eXBlJiYoby50aW1lclByb2Nlc3Npbmc9c2V0VGltZW91dChmdW5jdGlvbigpe3QuaXNQcm9jZXNzaW5nKHIsITApfSw1MDApKX0pLHIuaGFzSW5pdGlhbGl6ZWQ9ITAsci5pc1Byb2Nlc3Npbmc9ITEsdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlLmxvZygiT3ZlcmFsbCBpbml0aWFsaXphdGlvbiB0aW1lOiIrdC5iZW5jaG1hcmsoZS5kYXRhKHIsInN0YXJ0b3ZlcmFsbHRpbWVyIikpKSx0LmRlYnVnKG8sImNvcmUiKSYmY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSxhLnRyaWdnZXJIYW5kbGVyKCJ0YWJsZXNvcnRlci1pbml0aWFsaXplZCIsciksImZ1bmN0aW9uIj09dHlwZW9mIG8uaW5pdGlhbGl6ZWQmJm8uaW5pdGlhbGl6ZWQocil9ZWxzZSB0LmRlYnVnKG8sImNvcmUiKSYmKHIuaGFzSW5pdGlhbGl6ZWQ/Y29uc29sZS53YXJuKCJTdG9wcGluZyBpbml0aWFsaXphdGlvbi4gVGFibGVzb3J0ZXIgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCIpOmNvbnNvbGUuZXJyb3IoIlN0b3BwaW5nIGluaXRpYWxpemF0aW9uISBObyB0YWJsZSwgdGhlYWQgb3IgdGJvZHkiLHIpKX0sYmluZE1ldGhvZHM6ZnVuY3Rpb24ocil7dmFyIG89ci4kdGFibGUscz1yLm5hbWVzcGFjZSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgYWRkUm93cyB1cGRhdGVDZWxsIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyBkZXN0cm95IG1vdXNldXAgbW91c2VsZWF2ZSAiLnNwbGl0KCIgIikuam9pbihzKyIgIik7by51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLmJpbmQoInNvcnRSZXNldCIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5zb3J0UmVzZXQodGhpcy5jb25maWcsZnVuY3Rpb24oZSl7ZS5pc0FwcGx5aW5nV2lkZ2V0cz9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5hcHBseVdpZGdldChlLCIiLHIpfSwxMDApOnQuYXBwbHlXaWRnZXQoZSwiIixyKX0pfSkuYmluZCgidXBkYXRlQWxsIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQWxsKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGUiK3MrIiB1cGRhdGVSb3dzIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGVIZWFkZXJzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUhlYWRlcnModGhpcy5jb25maWcscil9KS5iaW5kKCJ1cGRhdGVDZWxsIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC51cGRhdGVDZWxsKHRoaXMuY29uZmlnLHIsbyxzKX0pLmJpbmQoImFkZFJvd3MiK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFkZFJvd3ModGhpcy5jb25maWcscixvLHMpfSkuYmluZCgidXBkYXRlQ29tcGxldGUiK3MsZnVuY3Rpb24oKXt0aGlzLmlzVXBkYXRpbmc9ITF9KS5iaW5kKCJzb3J0b24iK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnNvcnRPbih0aGlzLmNvbmZpZyxyLG8scyl9KS5iaW5kKCJhcHBlbmRDYWNoZSIrcyxmdW5jdGlvbihyLG8scyl7ci5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGVuZENhY2hlKHRoaXMuY29uZmlnLHMpLGUuaXNGdW5jdGlvbihvKSYmbyh0aGlzKX0pLmJpbmQoInVwZGF0ZUNhY2hlIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQ2FjaGUodGhpcy5jb25maWcscixvKX0pLmJpbmQoImFwcGx5V2lkZ2V0SWQiK3MsZnVuY3Rpb24oZSxyKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuYXBwbHlXaWRnZXRJZCh0aGlzLHIpfSkuYmluZCgiYXBwbHlXaWRnZXRzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGx5V2lkZ2V0KHRoaXMsITEscil9KS5iaW5kKCJyZWZyZXNoV2lkZ2V0cyIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlZnJlc2hXaWRnZXRzKHRoaXMscixvKX0pLmJpbmQoInJlbW92ZVdpZGdldCIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlbW92ZVdpZGdldCh0aGlzLHIsbyl9KS5iaW5kKCJkZXN0cm95IitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuZGVzdHJveSh0aGlzLHIsbyl9KS5iaW5kKCJyZXNldFRvTG9hZFN0YXRlIitzLGZ1bmN0aW9uKG8pe28uc3RvcFByb3BhZ2F0aW9uKCksdC5yZW1vdmVXaWRnZXQodGhpcywhMCwhMSk7dmFyIHM9ZS5leHRlbmQoITAse30sci5vcmlnaW5hbFNldHRpbmdzKTsocj1lLmV4dGVuZCghMCx7fSx0LmRlZmF1bHRzLHMpKS5vcmlnaW5hbFNldHRpbmdzPXMsdGhpcy5oYXNJbml0aWFsaXplZD0hMSx0LnNldHVwKHRoaXMscil9KX0sYmluZEV2ZW50czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbj0ocj1lKHIpWzBdKS5jb25maWcsaT1uLm5hbWVzcGFjZSxsPW51bGw7ITAhPT1zJiYoby5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfaGVhZGVycyIpLChhPXQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpKS5sZW5ndGgmJiJUQUJMRSI9PT1hWzBdLm5vZGVOYW1lJiZhWzBdIT09ciYmZShhWzBdKS5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfdGFibGUiKSksYT0obi5wb2ludGVyRG93bisiICIrbi5wb2ludGVyVXArIiAiK24ucG9pbnRlckNsaWNrKyIgc29ydCBrZXl1cCAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikuc3BsaXQoIiAiKS5qb2luKGkrIiAiKSxvLmZpbmQobi5zZWxlY3RvclNvcnQpLmFkZChvLmZpbHRlcihuLnNlbGVjdG9yU29ydCkpLnVuYmluZChhKS5iaW5kKGEsZnVuY3Rpb24ocixvKXt2YXIgcyxhLGksZD1lKHIudGFyZ2V0KSxjPSIgIityLnR5cGUrIiAiO2lmKCEoMSE9PShyLndoaWNofHxyLmJ1dHRvbikmJiFjLm1hdGNoKCIgIituLnBvaW50ZXJDbGljaysiIHwgc29ydCB8IGtleXVwICIpfHwiIGtleXVwICI9PT1jJiZyLndoaWNoIT09dC5rZXlDb2Rlcy5lbnRlcnx8Yy5tYXRjaCgiICIrbi5wb2ludGVyQ2xpY2srIiAiKSYmdm9pZCAwIT09ci53aGljaHx8Yy5tYXRjaCgiICIrbi5wb2ludGVyVXArIiAiKSYmbCE9PXIudGFyZ2V0JiYhMCE9PW8pKXtpZihjLm1hdGNoKCIgIituLnBvaW50ZXJEb3duKyIgIikpcmV0dXJuIGw9ci50YXJnZXQsdm9pZCgiMSI9PT0oaT1kLmpxdWVyeS5zcGxpdCgiLiIpKVswXSYmaVsxXTw0JiZyLnByZXZlbnREZWZhdWx0KCkpO2lmKGw9bnVsbCxzPXQuZ2V0Q2xvc2VzdChlKHRoaXMpLCIuIit0LmNzcy5oZWFkZXIpLHQucmVnZXguZm9ybUVsZW1lbnRzLnRlc3Qoci50YXJnZXQubm9kZU5hbWUpfHxkLmhhc0NsYXNzKG4uY3NzTm9Tb3J0KXx8ZC5wYXJlbnRzKCIuIituLmNzc05vU29ydCkubGVuZ3RoPjB8fHMuaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHxkLnBhcmVudHMoImJ1dHRvbiIpLmxlbmd0aD4wKXJldHVybiFuLmNhbmNlbFNlbGVjdGlvbjtuLmRlbGF5SW5pdCYmdC5pc0VtcHR5T2JqZWN0KG4uY2FjaGUpJiZ0LmJ1aWxkQ2FjaGUobiksbi5sYXN0LmNsaWNrZWRJbmRleD1zLmF0dHIoImRhdGEtY29sdW1uIil8fHMuaW5kZXgoKSwoYT1uLiRoZWFkZXJJbmRleGVkW24ubGFzdC5jbGlja2VkSW5kZXhdWzBdKSYmIWEuc29ydERpc2FibGVkJiZ0LmluaXRTb3J0KG4sYSxyKX19KSxuLmNhbmNlbFNlbGVjdGlvbiYmby5hdHRyKCJ1bnNlbGVjdGFibGUiLCJvbiIpLmJpbmQoInNlbGVjdHN0YXJ0IiwhMSkuY3NzKHsidXNlci1zZWxlY3QiOiJub25lIixNb3pVc2VyU2VsZWN0OiJub25lIn0pfSxidWlsZEhlYWRlcnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG47Zm9yKHIuaGVhZGVyTGlzdD1bXSxyLmhlYWRlckNvbnRlbnQ9W10sci5zb3J0VmFycz1bXSx0LmRlYnVnKHIsImNvcmUiKSYmKGE9bmV3IERhdGUpLHIuY29sdW1ucz10LmNvbXB1dGVDb2x1bW5JbmRleChyLiR0YWJsZS5jaGlsZHJlbigidGhlYWQsIHRmb290IikuY2hpbGRyZW4oInRyIikpLHM9ci5jc3NJY29uPyc8aSBjbGFzcz0iJysoci5jc3NJY29uPT09dC5jc3MuaWNvbj90LmNzcy5pY29uOnIuY3NzSWNvbisiICIrdC5jc3MuaWNvbikrJyI+PC9pPic6IiIsci4kaGVhZGVycz1lKGUubWFwKHIuJHRhYmxlLmZpbmQoci5zZWxlY3RvckhlYWRlcnMpLGZ1bmN0aW9uKG8sYSl7dmFyIG4saSxsLGQsYyxnPWUobyk7aWYoIXQuZ2V0Q2xvc2VzdChnLCJ0ciIpLmhhc0NsYXNzKHIuY3NzSWdub3JlUm93KSlyZXR1cm4vKHRofHRkKS9pLnRlc3Qoby5ub2RlTmFtZSl8fChjPXQuZ2V0Q2xvc2VzdChnLCJ0aCwgdGQiKSxnLmF0dHIoImRhdGEtY29sdW1uIixjLmF0dHIoImRhdGEtY29sdW1uIikpKSxuPXQuZ2V0Q29sdW1uRGF0YShyLnRhYmxlLHIuaGVhZGVycyxhLCEwKSxyLmhlYWRlckNvbnRlbnRbYV09Zy5odG1sKCksIiI9PT1yLmhlYWRlclRlbXBsYXRlfHxnLmZpbmQoIi4iK3QuY3NzLmhlYWRlckluKS5sZW5ndGh8fChkPXIuaGVhZGVyVGVtcGxhdGUucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlQ29udGVudCxnLmh0bWwoKSkucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlSWNvbixnLmZpbmQoIi4iK3QuY3NzLmljb24pLmxlbmd0aD8iIjpzKSxyLm9uUmVuZGVyVGVtcGxhdGUmJihpPXIub25SZW5kZXJUZW1wbGF0ZS5hcHBseShnLFthLGRdKSkmJiJzdHJpbmciPT10eXBlb2YgaSYmKGQ9aSksZy5odG1sKCc8ZGl2IGNsYXNzPSInK3QuY3NzLmhlYWRlckluKyciPicrZCsiPC9kaXY+IikpLHIub25SZW5kZXJIZWFkZXImJnIub25SZW5kZXJIZWFkZXIuYXBwbHkoZyxbYSxyLHIuJHRhYmxlXSksbD1wYXJzZUludChnLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG8uY29sdW1uPWwsYz10LmdldE9yZGVyKHQuZ2V0RGF0YShnLG4sInNvcnRJbml0aWFsT3JkZXIiKXx8ci5zb3J0SW5pdGlhbE9yZGVyKSxyLnNvcnRWYXJzW2xdPXtjb3VudDotMSxvcmRlcjpjP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxsb2NrZWRPcmRlcjohMX0sdm9pZCAwIT09KGM9dC5nZXREYXRhKGcsbiwibG9ja2VkT3JkZXIiKXx8ITEpJiYhMSE9PWMmJihyLnNvcnRWYXJzW2xdLmxvY2tlZE9yZGVyPSEwLHIuc29ydFZhcnNbbF0ub3JkZXI9dC5nZXRPcmRlcihjKT9bMSwxXTpbMCwwXSksci5oZWFkZXJMaXN0W2FdPW8sZy5hZGRDbGFzcyh0LmNzcy5oZWFkZXIrIiAiK3IuY3NzSGVhZGVyKSx0LmdldENsb3Nlc3QoZywidHIiKS5hZGRDbGFzcyh0LmNzcy5oZWFkZXJSb3crIiAiK3IuY3NzSGVhZGVyUm93KS5hdHRyKCJyb2xlIiwicm93Iiksci50YWJJbmRleCYmZy5hdHRyKCJ0YWJpbmRleCIsMCksb30pKSxyLiRoZWFkZXJJbmRleGVkPVtdLG49MDtuPHIuY29sdW1ucztuKyspdC5pc0VtcHR5T2JqZWN0KHIuc29ydFZhcnNbbl0pJiYoci5zb3J0VmFyc1tuXT17fSksbz1yLiRoZWFkZXJzLmZpbHRlcignW2RhdGEtY29sdW1uPSInK24rJyJdJyksci4kaGVhZGVySW5kZXhlZFtuXT1vLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcigiOmxhc3QiKTpvLmZpbHRlcigiOmxhc3QiKTplKCk7ci4kdGFibGUuZmluZChyLnNlbGVjdG9ySGVhZGVycykuYXR0cih7c2NvcGU6ImNvbCIscm9sZToiY29sdW1uaGVhZGVyIn0pLHQudXBkYXRlSGVhZGVyKHIpLHQuZGVidWcociwiY29yZSIpJiYoY29uc29sZS5sb2coIkJ1aWx0IGhlYWRlcnM6Iit0LmJlbmNobWFyayhhKSksY29uc29sZS5sb2coci4kaGVhZGVycykpfSxhZGRJbnN0YW5jZU1ldGhvZHM6ZnVuY3Rpb24ocil7ZS5leHRlbmQodC5pbnN0YW5jZU1ldGhvZHMscil9LHNldHVwUGFyc2VyczpmdW5jdGlvbihlLHIpe3ZhciBvLHMsYSxuLGksbCxkLGMsZyxwLHUsZixoLG0sYj1lLnRhYmxlLHk9MCx3PXQuZGVidWcoZSwiY29yZSIpLHg9e307aWYoZS4kdGJvZGllcz1lLiR0YWJsZS5jaGlsZHJlbigidGJvZHk6bm90KC4iK2UuY3NzSW5mb0Jsb2NrKyIpIiksaD12b2lkIDA9PT1yP2UuJHRib2RpZXM6ciwwPT09KG09aC5sZW5ndGgpKXJldHVybiB3P2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgcGFyc2VyIGNhY2hlIik6IiI7Zm9yKHcmJihmPW5ldyBEYXRlLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiRGV0ZWN0aW5nIHBhcnNlcnMgZm9yIGVhY2ggY29sdW1uIikpLHM9e2V4dHJhY3RvcnM6W10scGFyc2VyczpbXX07eTxtOyl7aWYoKG89aFt5XS5yb3dzKS5sZW5ndGgpZm9yKGk9MCxuPWUuY29sdW1ucyxsPTA7bDxuO2wrKyl7aWYoKGQ9ZS4kaGVhZGVySW5kZXhlZFtpXSkmJmQubGVuZ3RoJiYoYz10LmdldENvbHVtbkRhdGEoYixlLmhlYWRlcnMsaSksdT10LmdldFBhcnNlckJ5SWQodC5nZXREYXRhKGQsYywiZXh0cmFjdG9yIikpLHA9dC5nZXRQYXJzZXJCeUlkKHQuZ2V0RGF0YShkLGMsInNvcnRlciIpKSxnPSJmYWxzZSI9PT10LmdldERhdGEoZCxjLCJwYXJzZXIiKSxlLmVtcHRpZXNbaV09KHQuZ2V0RGF0YShkLGMsImVtcHR5Iil8fGUuZW1wdHlUb3x8KGUuZW1wdHlUb0JvdHRvbT8iYm90dG9tIjoidG9wIikpLnRvTG93ZXJDYXNlKCksZS5zdHJpbmdzW2ldPSh0LmdldERhdGEoZCxjLCJzdHJpbmciKXx8ZS5zdHJpbmdUb3x8Im1heCIpLnRvTG93ZXJDYXNlKCksZyYmKHA9dC5nZXRQYXJzZXJCeUlkKCJuby1wYXJzZXIiKSksdXx8KHU9ITEpLHB8fChwPXQuZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKGUsbywtMSxpKSksdyYmKHhbIigiK2krIikgIitkLnRleHQoKV09e3BhcnNlcjpwLmlkLGV4dHJhY3Rvcjp1P3UuaWQ6Im5vbmUiLHN0cmluZzplLnN0cmluZ3NbaV0sZW1wdHk6ZS5lbXB0aWVzW2ldfSkscy5wYXJzZXJzW2ldPXAscy5leHRyYWN0b3JzW2ldPXUsKGE9ZFswXS5jb2xTcGFuLTEpPjApKWZvcihpKz1hLG4rPWE7YSsxPjA7KXMucGFyc2Vyc1tpLWFdPXAscy5leHRyYWN0b3JzW2ktYV09dSxhLS07aSsrfXkrPXMucGFyc2Vycy5sZW5ndGg/bToxfXcmJih0LmlzRW1wdHlPYmplY3QoeCk/Y29uc29sZS53YXJuKCIgIE5vIHBhcnNlcnMgZGV0ZWN0ZWQhIik6Y29uc29sZVtjb25zb2xlLnRhYmxlPyJ0YWJsZSI6ImxvZyJdKHgpLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgZGV0ZWN0aW5nIHBhcnNlcnMiK3QuYmVuY2htYXJrKGYpKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpLGUucGFyc2Vycz1zLnBhcnNlcnMsZS5leHRyYWN0b3JzPXMuZXh0cmFjdG9yc30sYWRkUGFyc2VyOmZ1bmN0aW9uKGUpe3ZhciByLG89dC5wYXJzZXJzLmxlbmd0aCxzPSEwO2ZvcihyPTA7cjxvO3IrKyl0LnBhcnNlcnNbcl0uaWQudG9Mb3dlckNhc2UoKT09PWUuaWQudG9Mb3dlckNhc2UoKSYmKHM9ITEpO3MmJih0LnBhcnNlcnNbdC5wYXJzZXJzLmxlbmd0aF09ZSl9LGdldFBhcnNlckJ5SWQ6ZnVuY3Rpb24oZSl7aWYoImZhbHNlIj09ZSlyZXR1cm4hMTt2YXIgcixvPXQucGFyc2Vycy5sZW5ndGg7Zm9yKHI9MDtyPG87cisrKWlmKHQucGFyc2Vyc1tyXS5pZC50b0xvd2VyQ2FzZSgpPT09ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHQucGFyc2Vyc1tyXTtyZXR1cm4hMX0sZGV0ZWN0UGFyc2VyRm9yQ29sdW1uOmZ1bmN0aW9uKHIsbyxzLGEpe2Zvcih2YXIgbixpLGwsZD10LnBhcnNlcnMubGVuZ3RoLGM9ITEsZz0iIixwPXQuZGVidWcociwiY29yZSIpLHU9ITA7IiI9PT1nJiZ1OykobD1vWysrc10pJiZzPDUwP2wuY2xhc3NOYW1lLmluZGV4T2YodC5jc3NJZ25vcmVSb3cpPDAmJihjPW9bc10uY2VsbHNbYV0sZz10LmdldEVsZW1lbnRUZXh0KHIsYyxhKSxpPWUoYykscCYmY29uc29sZS5sb2coIkNoZWNraW5nIGlmIHZhbHVlIHdhcyBlbXB0eSBvbiByb3cgIitzKyIsIGNvbHVtbjogIithKyc6ICInK2crJyInKSk6dT0hMTtmb3IoOy0tZD49MDspaWYoKG49dC5wYXJzZXJzW2RdKSYmInRleHQiIT09bi5pZCYmbi5pcyYmbi5pcyhnLHIudGFibGUsYyxpKSlyZXR1cm4gbjtyZXR1cm4gdC5nZXRQYXJzZXJCeUlkKCJ0ZXh0Iil9LGdldEVsZW1lbnRUZXh0OmZ1bmN0aW9uKHIsbyxzKXtpZighbylyZXR1cm4iIjt2YXIgYSxuPXIudGV4dEV4dHJhY3Rpb258fCIiLGk9by5qcXVlcnk/bzplKG8pO3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8iYmFzaWMiPT09biYmdm9pZCAwIT09KGE9aS5hdHRyKHIudGV4dEF0dHJpYnV0ZSkpP2UudHJpbShhKTplLnRyaW0oby50ZXh0Q29udGVudHx8aS50ZXh0KCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP2UudHJpbShuKGlbMF0sci50YWJsZSxzKSk6ImZ1bmN0aW9uIj09dHlwZW9mKGE9dC5nZXRDb2x1bW5EYXRhKHIudGFibGUsbixzKSk/ZS50cmltKGEoaVswXSxyLnRhYmxlLHMpKTplLnRyaW0oaVswXS50ZXh0Q29udGVudHx8aS50ZXh0KCkpfSxnZXRQYXJzZWRUZXh0OmZ1bmN0aW9uKGUscixvLHMpe3ZvaWQgMD09PXMmJihzPXQuZ2V0RWxlbWVudFRleHQoZSxyLG8pKTt2YXIgYT0iIitzLG49ZS5wYXJzZXJzW29dLGk9ZS5leHRyYWN0b3JzW29dO3JldHVybiBuJiYoaSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuZm9ybWF0JiYocz1pLmZvcm1hdChzLGUudGFibGUscixvKSksYT0ibm8tcGFyc2VyIj09PW4uaWQ/IiI6bi5mb3JtYXQoIiIrcyxlLnRhYmxlLHIsbyksZS5pZ25vcmVDYXNlJiYic3RyaW5nIj09dHlwZW9mIGEmJihhPWEudG9Mb3dlckNhc2UoKSkpLGF9LGJ1aWxkQ2FjaGU6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYyxnLHAsdSxmLGgsbSxiLHksdyx4LHYsQywkLEksRCxSLFQ9ci50YWJsZSxMPXIucGFyc2VycyxBPXQuZGVidWcociwiY29yZSIpO2lmKHIuJHRib2RpZXM9ci4kdGFibGUuY2hpbGRyZW4oInRib2R5Om5vdCguIityLmNzc0luZm9CbG9jaysiKSIpLGc9dm9pZCAwPT09cz9yLiR0Ym9kaWVzOnMsci5jYWNoZT17fSxyLnRvdGFsUm93cz0wLCFMKXJldHVybiBBP2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgY2FjaGUiKToiIjtmb3IoQSYmKG09bmV3IERhdGUpLHIuc2hvd1Byb2Nlc3NpbmcmJnQuaXNQcm9jZXNzaW5nKFQsITApLGM9MDtjPGcubGVuZ3RoO2MrKyl7Zm9yKHg9W10sYT1yLmNhY2hlW2NdPXtub3JtYWxpemVkOltdfSxiPWdbY10mJmdbY10ucm93cy5sZW5ndGh8fDAsbD0wO2w8YjsrK2wpaWYoeT17Y2hpbGQ6W10scmF3OltdfSxwPWUoZ1tjXS5yb3dzW2xdKSx1PVtdLCFwLmhhc0NsYXNzKHIuc2VsZWN0b3JSZW1vdmUuc2xpY2UoMSkpKWlmKHAuaGFzQ2xhc3Moci5jc3NDaGlsZFJvdykmJjAhPT1sKWZvcihEPWEubm9ybWFsaXplZC5sZW5ndGgtMSwodz1hLm5vcm1hbGl6ZWRbRF1bci5jb2x1bW5zXSkuJHJvdz13LiRyb3cuYWRkKHApLHAucHJldigpLmhhc0NsYXNzKHIuY3NzQ2hpbGRSb3cpfHxwLnByZXYoKS5hZGRDbGFzcyh0LmNzcy5jc3NIYXNDaGlsZCksZj1wLmNoaWxkcmVuKCJ0aCwgdGQiKSxEPXcuY2hpbGQubGVuZ3RoLHcuY2hpbGRbRF09W10sQz0wLEk9ci5jb2x1bW5zLGQ9MDtkPEk7ZCsrKShoPWZbZF0pJiYody5jaGlsZFtEXVtkXT10LmdldFBhcnNlZFRleHQocixoLGQpLCh2PWZbZF0uY29sU3Bhbi0xKT4wJiYoQys9dixJKz12KSksQysrO2Vsc2V7Zm9yKHkuJHJvdz1wLHkub3JkZXI9bCxDPTAsST1yLmNvbHVtbnMsZD0wO2Q8STsrK2Qpe2lmKChoPXBbMF0uY2VsbHNbZF0pJiZDPHIuY29sdW1ucyYmKCEoJD12b2lkIDAhPT1MW0NdKSYmQSYmY29uc29sZS53YXJuKCJObyBwYXJzZXIgZm91bmQgZm9yIHJvdzogIitsKyIsIGNvbHVtbjogIitkKyc7IGNlbGwgY29udGFpbmluZzogIicrZShoKS50ZXh0KCkrJyI7IGRvZXMgaXQgaGF2ZSBhIGhlYWRlcj8nKSxuPXQuZ2V0RWxlbWVudFRleHQocixoLEMpLHkucmF3W0NdPW4saT10LmdldFBhcnNlZFRleHQocixoLEMsbiksdVtDXT1pLCQmJiJudW1lcmljIj09PShMW0NdLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpJiYoeFtDXT1NYXRoLm1heChNYXRoLmFicyhpKXx8MCx4W0NdfHwwKSksKHY9aC5jb2xTcGFuLTEpPjApKXtmb3IoUj0wO1I8PXY7KWk9ci5kdXBsaWNhdGVTcGFufHwwPT09Uj9uOiJzdHJpbmciIT10eXBlb2Ygci50ZXh0RXh0cmFjdGlvbj90LmdldEVsZW1lbnRUZXh0KHIsaCxDK1IpfHwiIjoiIix5LnJhd1tDK1JdPWksdVtDK1JdPWksUisrO0MrPXYsSSs9dn1DKyt9dVtyLmNvbHVtbnNdPXksYS5ub3JtYWxpemVkW2Eubm9ybWFsaXplZC5sZW5ndGhdPXV9YS5jb2xNYXg9eCxyLnRvdGFsUm93cys9YS5ub3JtYWxpemVkLmxlbmd0aH1pZihyLnNob3dQcm9jZXNzaW5nJiZ0LmlzUHJvY2Vzc2luZyhUKSxBKXtmb3IoRD1NYXRoLm1pbig1LHIuY2FjaGVbMF0ubm9ybWFsaXplZC5sZW5ndGgpLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiQnVpbGRpbmcgY2FjaGUgZm9yICIrci50b3RhbFJvd3MrIiByb3dzIChzaG93aW5nICIrRCsiIHJvd3MgaW4gbG9nKSBhbmQgIityLmNvbHVtbnMrIiBjb2x1bW5zIit0LmJlbmNobWFyayhtKSksbj17fSxkPTA7ZDxyLmNvbHVtbnM7ZCsrKWZvcihDPTA7QzxEO0MrKyluWyJyb3c6ICIrQ118fChuWyJyb3c6ICIrQ109e30pLG5bInJvdzogIitDXVtyLiRoZWFkZXJJbmRleGVkW2RdLnRleHQoKV09ci5jYWNoZVswXS5ub3JtYWxpemVkW0NdW2RdO2NvbnNvbGVbY29uc29sZS50YWJsZT8idGFibGUiOiJsb2ciXShuKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9ZS5pc0Z1bmN0aW9uKG8pJiZvKFQpfSxnZXRDb2x1bW5UZXh0OmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG09ImZ1bmN0aW9uIj09dHlwZW9mIHMsYj0iYWxsIj09PW8seT17cmF3OltdLHBhcnNlZDpbXSwkY2VsbDpbXX0sdz0ocj1lKHIpWzBdKS5jb25maWc7aWYoIXQuaXNFbXB0eU9iamVjdCh3KSl7Zm9yKGM9dy4kdGJvZGllcy5sZW5ndGgsbj0wO248YztuKyspZm9yKGc9KGw9dy5jYWNoZVtuXS5ub3JtYWxpemVkKS5sZW5ndGgsaT0wO2k8ZztpKyspZD1sW2ldLGEmJiFkW3cuY29sdW1uc10uJHJvdy5pcyhhKXx8KGg9ITAsdT1iP2Quc2xpY2UoMCx3LmNvbHVtbnMpOmRbb10sZD1kW3cuY29sdW1uc10scD1iP2QucmF3OmQucmF3W29dLGY9Yj9kLiRyb3cuY2hpbGRyZW4oKTpkLiRyb3cuY2hpbGRyZW4oKS5lcShvKSxtJiYoaD1zKHt0Ym9keUluZGV4Om4scm93SW5kZXg6aSxwYXJzZWQ6dSxyYXc6cCwkcm93OmQuJHJvdywkY2VsbDpmfSkpLCExIT09aCYmKHkucGFyc2VkW3kucGFyc2VkLmxlbmd0aF09dSx5LnJhd1t5LnJhdy5sZW5ndGhdPXAseS4kY2VsbFt5LiRjZWxsLmxlbmd0aF09ZikpO3JldHVybiB5fXQuZGVidWcodywiY29yZSIpJiZjb25zb2xlLndhcm4oIk5vIGNhY2hlIGZvdW5kIC0gYWJvcnRpbmcgZ2V0Q29sdW1uVGV4dCBmdW5jdGlvbiEiKX0sc2V0SGVhZGVyc0NzczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ci5zb3J0TGlzdCxuPWEubGVuZ3RoLGk9dC5jc3Muc29ydE5vbmUrIiAiK3IuY3NzTm9uZSxsPVt0LmNzcy5zb3J0QXNjKyIgIityLmNzc0FzYyx0LmNzcy5zb3J0RGVzYysiICIrci5jc3NEZXNjXSxkPVtyLmNzc0ljb25Bc2Msci5jc3NJY29uRGVzYyxyLmNzc0ljb25Ob25lXSxjPVsiYXNjZW5kaW5nIiwiZGVzY2VuZGluZyJdLGc9ZnVuY3Rpb24oZSxyKXtlLnJlbW92ZUNsYXNzKGkpLmFkZENsYXNzKGxbcl0pLmF0dHIoImFyaWEtc29ydCIsY1tyXSkuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZFsyXSkuYWRkQ2xhc3MoZFtyXSl9LHA9ci4kdGFibGUuZmluZCgidGZvb3QgdHIiKS5jaGlsZHJlbigidGQsIHRoIikuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKSx1PXIuJGhlYWRlcnMuYWRkKGUoInRoZWFkICIrci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKS5hZGRDbGFzcyhpKS5hdHRyKCJhcmlhLXNvcnQiLCJub25lIikuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZC5qb2luKCIgIikpLmVuZCgpO2Zvcih1Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKGRbMl0pLHIuY3NzSWNvbkRpc2FibGVkJiZ1LmZpbHRlcigiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKHIuY3NzSWNvbkRpc2FibGVkKSxvPTA7bzxuO28rKylpZigyIT09YVtvXVsxXSl7aWYodT1yLiRoZWFkZXJzLmZpbHRlcihmdW5jdGlvbihlKXtmb3IodmFyIG89ITAscz1yLiRoZWFkZXJzLmVxKGUpLGE9cGFyc2VJbnQocy5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxuPWErdC5nZXRDbG9zZXN0KHMsInRoLCB0ZCIpWzBdLmNvbFNwYW47YTxuO2ErKylvPSEhbyYmKG98fHQuaXNWYWx1ZUluQXJyYXkoYSxyLnNvcnRMaXN0KT4tMSk7cmV0dXJuIG99KSwodT11Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcignW2RhdGEtY29sdW1uPSInK2Fbb11bMF0rJyJdJysoMT09PW4/IjpsYXN0IjoiIikpKS5sZW5ndGgpZm9yKHM9MDtzPHUubGVuZ3RoO3MrKyl1W3NdLnNvcnREaXNhYmxlZHx8Zyh1LmVxKHMpLGFbb11bMV0pO3AubGVuZ3RoJiZnKHAuZmlsdGVyKCdbZGF0YS1jb2x1bW49IicrYVtvXVswXSsnIl0nKSxhW29dWzFdKX1mb3Iobj1yLiRoZWFkZXJzLmxlbmd0aCxvPTA7bzxuO28rKyl0LnNldENvbHVtbkFyaWFMYWJlbChyLHIuJGhlYWRlcnMuZXEobykpfSxnZXRDbG9zZXN0OmZ1bmN0aW9uKHQscil7cmV0dXJuIGUuZm4uY2xvc2VzdD90LmNsb3Nlc3Qocik6dC5pcyhyKT90OnQucGFyZW50cyhyKS5maWx0ZXIoIjpmaXJzdCIpfSxzZXRDb2x1bW5BcmlhTGFiZWw6ZnVuY3Rpb24ocixvLHMpe2lmKG8ubGVuZ3RoKXt2YXIgYT1wYXJzZUludChvLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG49ci5zb3J0VmFyc1thXSxpPW8uaGFzQ2xhc3ModC5jc3Muc29ydEFzYyk/InNvcnRBc2MiOm8uaGFzQ2xhc3ModC5jc3Muc29ydERlc2MpPyJzb3J0RGVzYyI6InNvcnROb25lIixsPWUudHJpbShvLnRleHQoKSkrIjogIit0Lmxhbmd1YWdlW2ldO28uaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHwhMT09PXM/bCs9dC5sYW5ndWFnZS5zb3J0RGlzYWJsZWQ6KGk9KG4uY291bnQrMSklbi5vcmRlci5sZW5ndGgscz1uLm9yZGVyW2ldLGwrPXQubGFuZ3VhZ2VbMD09PXM/Im5leHRBc2MiOjE9PT1zPyJuZXh0RGVzYyI6Im5leHROb25lIl0pLG8uYXR0cigiYXJpYS1sYWJlbCIsbCl9fSx1cGRhdGVIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9ZS4kaGVhZGVycy5sZW5ndGg7Zm9yKHI9MDtyPGk7cisrKXM9ZS4kaGVhZGVycy5lcShyKSxhPXQuZ2V0Q29sdW1uRGF0YShuLGUuaGVhZGVycyxyLCEwKSxvPSJmYWxzZSI9PT10LmdldERhdGEocyxhLCJzb3J0ZXIiKXx8ImZhbHNlIj09PXQuZ2V0RGF0YShzLGEsInBhcnNlciIpLHQuc2V0Q29sdW1uU29ydChlLHMsbyl9LHNldENvbHVtblNvcnQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBvPWUudGFibGUuaWQ7dFswXS5zb3J0RGlzYWJsZWQ9cix0W3I/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgic29ydGVyLWZhbHNlIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsIiIrciksZS50YWJJbmRleCYmKHI/dC5yZW1vdmVBdHRyKCJ0YWJpbmRleCIpOnQuYXR0cigidGFiaW5kZXgiLCIwIikpLG8mJihyP3QucmVtb3ZlQXR0cigiYXJpYS1jb250cm9scyIpOnQuYXR0cigiYXJpYS1jb250cm9scyIsbykpfSx1cGRhdGVIZWFkZXJTb3J0Q291bnQ6ZnVuY3Rpb24ocixvKXt2YXIgcyxhLG4saSxsLGQsYyxnLHA9b3x8ci5zb3J0TGlzdCx1PXAubGVuZ3RoO2ZvcihyLnNvcnRMaXN0PVtdLGk9MDtpPHU7aSsrKWlmKGM9cFtpXSwocz1wYXJzZUludChjWzBdLDEwKSk8ci5jb2x1bW5zKXtzd2l0Y2goci5zb3J0VmFyc1tzXS5vcmRlcnx8KGc9dC5nZXRPcmRlcihyLnNvcnRJbml0aWFsT3JkZXIpP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxyLnNvcnRWYXJzW3NdLm9yZGVyPWcsci5zb3J0VmFyc1tzXS5jb3VudD0wKSxnPXIuc29ydFZhcnNbc10ub3JkZXIsYT0oIiIrY1sxXSkubWF0Y2goL14oMXxkfHN8b3xuKS8pLGE9YT9hWzBdOiIiKXtjYXNlIjEiOmNhc2UiZCI6YT0xO2JyZWFrO2Nhc2UicyI6YT1sfHwwO2JyZWFrO2Nhc2UibyI6YT0wPT09KGQ9Z1sobHx8MCklZy5sZW5ndGhdKT8xOjE9PT1kPzA6MjticmVhaztjYXNlIm4iOmE9Z1srK3Iuc29ydFZhcnNbc10uY291bnQlZy5sZW5ndGhdO2JyZWFrO2RlZmF1bHQ6YT0wfWw9MD09PWk/YTpsLG49W3MscGFyc2VJbnQoYSwxMCl8fDBdLHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPW4sYT1lLmluQXJyYXkoblsxXSxnKSxyLnNvcnRWYXJzW3NdLmNvdW50PWE+PTA/YTpuWzFdJWcubGVuZ3RofX0sdXBkYXRlQWxsOmZ1bmN0aW9uKGUscixvKXt2YXIgcz1lLnRhYmxlO3MuaXNVcGRhdGluZz0hMCx0LnJlZnJlc2hXaWRnZXRzKHMsITAsITApLHQuYnVpbGRIZWFkZXJzKGUpLHQuYmluZEV2ZW50cyhzLGUuJGhlYWRlcnMsITApLHQuYmluZE1ldGhvZHMoZSksdC5jb21tb25VcGRhdGUoZSxyLG8pfSx1cGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UudGFibGUuaXNVcGRhdGluZz0hMCx0LnVwZGF0ZUhlYWRlcihlKSx0LmNvbW1vblVwZGF0ZShlLHIsbyl9LHVwZGF0ZUhlYWRlcnM6ZnVuY3Rpb24oZSxyKXtlLnRhYmxlLmlzVXBkYXRpbmc9ITAsdC5idWlsZEhlYWRlcnMoZSksdC5iaW5kRXZlbnRzKGUudGFibGUsZS4kaGVhZGVycywhMCksdC5yZXNvcnRDb21wbGV0ZShlLHIpfSx1cGRhdGVDZWxsOmZ1bmN0aW9uKHIsbyxzLGEpe2lmKGUobykuY2xvc2VzdCgidHIiKS5oYXNDbGFzcyhyLmNzc0NoaWxkUm93KSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ1cGRhdGVDZWxsIiBmb3IgY2hpbGQgcm93IGNvbnRlbnQgaGFzIGJlZW4gZGlzYWJsZWQsIHVzZSAidXBkYXRlIiBpbnN0ZWFkJyk7ZWxzZXtpZih0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkpcmV0dXJuIHQudXBkYXRlSGVhZGVyKHIpLHZvaWQgdC5jb21tb25VcGRhdGUocixzLGEpO3IudGFibGUuaXNVcGRhdGluZz0hMCxyLiR0YWJsZS5maW5kKHIuc2VsZWN0b3JSZW1vdmUpLnJlbW92ZSgpO3ZhciBuLGksbCxkLGMsZyxwPXIuJHRib2RpZXMsdT1lKG8pLGY9cC5pbmRleCh0LmdldENsb3Nlc3QodSwidGJvZHkiKSksaD1yLmNhY2hlW2ZdLG09dC5nZXRDbG9zZXN0KHUsInRyIik7aWYobz11WzBdLHAubGVuZ3RoJiZmPj0wKXtpZihsPXAuZXEoZikuZmluZCgidHIiKS5ub3QoIi4iK3IuY3NzQ2hpbGRSb3cpLmluZGV4KG0pLGM9aC5ub3JtYWxpemVkW2xdLChnPW1bMF0uY2VsbHMubGVuZ3RoKSE9PXIuY29sdW1ucylmb3IoZD0wLG49ITEsaT0wO2k8ZztpKyspbnx8bVswXS5jZWxsc1tpXT09PW8/bj0hMDpkKz1tWzBdLmNlbGxzW2ldLmNvbFNwYW47ZWxzZSBkPXUuaW5kZXgoKTtuPXQuZ2V0RWxlbWVudFRleHQocixvLGQpLGNbci5jb2x1bW5zXS5yYXdbZF09bixuPXQuZ2V0UGFyc2VkVGV4dChyLG8sZCxuKSxjW2RdPW4sIm51bWVyaWMiPT09KHIucGFyc2Vyc1tkXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKGguY29sTWF4W2RdPU1hdGgubWF4KE1hdGguYWJzKG4pfHwwLGguY29sTWF4W2RdfHwwKSksITEhPT0obj0idW5kZWZpbmVkIiE9PXM/czpyLnJlc29ydCk/dC5jaGVja1Jlc29ydChyLG4sYSk6dC5yZXNvcnRDb21wbGV0ZShyLGEpfWVsc2UgdC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUuZXJyb3IoInVwZGF0ZUNlbGwgYWJvcnRlZCwgdGJvZHkgbWlzc2luZyBvciBub3Qgd2l0aGluIHRoZSBpbmRpY2F0ZWQgdGFibGUiKSxyLnRhYmxlLmlzVXBkYXRpbmc9ITF9fSxhZGRSb3dzOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG0sYix5LHc9InN0cmluZyI9PXR5cGVvZiBvJiYxPT09ci4kdGJvZGllcy5sZW5ndGgmJi88dHIvLnRlc3Qob3x8IiIpLHg9ci50YWJsZTtpZih3KW89ZShvKSxyLiR0Ym9kaWVzLmFwcGVuZChvKTtlbHNlIGlmKCEobyYmbyBpbnN0YW5jZW9mIGUmJnQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpWzBdPT09ci50YWJsZSkpcmV0dXJuIHQuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmVycm9yKCJhZGRSb3dzIG1ldGhvZCByZXF1aXJlcyAoMSkgYSBqUXVlcnkgc2VsZWN0b3IgcmVmZXJlbmNlIHRvIHJvd3MgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgdGFibGUsIG9yICgyKSByb3cgSFRNTCBzdHJpbmcgdG8gYmUgYWRkZWQgdG8gYSB0YWJsZSB3aXRoIG9ubHkgb25lIHRib2R5IiksITE7aWYoeC5pc1VwZGF0aW5nPSEwLHQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSl0LnVwZGF0ZUhlYWRlcihyKSx0LmNvbW1vblVwZGF0ZShyLHMsYSk7ZWxzZXtmb3IoYz1vLmZpbHRlcigidHIiKS5hdHRyKCJyb2xlIiwicm93IikubGVuZ3RoLGw9ci4kdGJvZGllcy5pbmRleChvLnBhcmVudHMoInRib2R5IikuZmlsdGVyKCI6Zmlyc3QiKSksci5wYXJzZXJzJiZyLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhyKSxkPTA7ZDxjO2QrKyl7Zm9yKGY9MCxwPW9bZF0uY2VsbHMubGVuZ3RoLHU9ci5jYWNoZVtsXS5ub3JtYWxpemVkLmxlbmd0aCxtPVtdLGg9e2NoaWxkOltdLHJhdzpbXSwkcm93Om8uZXEoZCksb3JkZXI6dX0sZz0wO2c8cDtnKyspYj1vW2RdLmNlbGxzW2ddLG49dC5nZXRFbGVtZW50VGV4dChyLGIsZiksaC5yYXdbZl09bixpPXQuZ2V0UGFyc2VkVGV4dChyLGIsZixuKSxtW2ZdPWksIm51bWVyaWMiPT09KHIucGFyc2Vyc1tmXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKHIuY2FjaGVbbF0uY29sTWF4W2ZdPU1hdGgubWF4KE1hdGguYWJzKGkpfHwwLHIuY2FjaGVbbF0uY29sTWF4W2ZdfHwwKSksKHk9Yi5jb2xTcGFuLTEpPjAmJihmKz15KSxmKys7bVtyLmNvbHVtbnNdPWgsci5jYWNoZVtsXS5ub3JtYWxpemVkW3VdPW19dC5jaGVja1Jlc29ydChyLHMsYSl9fSx1cGRhdGVDYWNoZTpmdW5jdGlvbihlLHIsbyl7ZS5wYXJzZXJzJiZlLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhlLG8pLHQuYnVpbGRDYWNoZShlLHIsbyl9LGFwcGVuZENhY2hlOmZ1bmN0aW9uKGUscil7dmFyIG8scyxhLG4saSxsLGQsYz1lLnRhYmxlLGc9ZS4kdGJvZGllcyxwPVtdLHU9ZS5jYWNoZTtpZih0LmlzRW1wdHlPYmplY3QodSkpcmV0dXJuIGUuYXBwZW5kZXI/ZS5hcHBlbmRlcihjLHApOmMuaXNVcGRhdGluZz9lLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpOiIiO2Zvcih0LmRlYnVnKGUsImNvcmUiKSYmKGQ9bmV3IERhdGUpLGw9MDtsPGcubGVuZ3RoO2wrKylpZigoYT1nLmVxKGwpKS5sZW5ndGgpe2ZvcihuPXQucHJvY2Vzc1Rib2R5KGMsYSwhMCkscz0obz11W2xdLm5vcm1hbGl6ZWQpLmxlbmd0aCxpPTA7aTxzO2krKylwW3AubGVuZ3RoXT1vW2ldW2UuY29sdW1uc10uJHJvdyxlLmFwcGVuZGVyJiYoIWUucGFnZXJ8fGUucGFnZXIucmVtb3ZlUm93c3x8ZS5wYWdlci5hamF4KXx8bi5hcHBlbmQob1tpXVtlLmNvbHVtbnNdLiRyb3cpO3QucHJvY2Vzc1Rib2R5KGMsbiwhMSl9ZS5hcHBlbmRlciYmZS5hcHBlbmRlcihjLHApLHQuZGVidWcoZSwiY29yZSIpJiZjb25zb2xlLmxvZygiUmVidWlsdCB0YWJsZSIrdC5iZW5jaG1hcmsoZCkpLHJ8fGUuYXBwZW5kZXJ8fHQuYXBwbHlXaWRnZXQoYyksYy5pc1VwZGF0aW5nJiZlLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpfSxjb21tb25VcGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UuJHRhYmxlLmZpbmQoZS5zZWxlY3RvclJlbW92ZSkucmVtb3ZlKCksdC5zZXR1cFBhcnNlcnMoZSksdC5idWlsZENhY2hlKGUpLHQuY2hlY2tSZXNvcnQoZSxyLG8pfSxpbml0U29ydDpmdW5jdGlvbihyLG8scyl7aWYoci50YWJsZS5pc1VwZGF0aW5nKXJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0U29ydChyLG8scyl9LDUwKTt2YXIgYSxuLGksbCxkLGMsZyxwPSFzW3Iuc29ydE11bHRpU29ydEtleV0sdT1yLnRhYmxlLGY9ci4kaGVhZGVycy5sZW5ndGgsaD10LmdldENsb3Nlc3QoZShvKSwidGgsIHRkIiksbT1wYXJzZUludChoLmF0dHIoImRhdGEtY29sdW1uIiksMTApLGI9ci5zb3J0VmFyc1ttXS5vcmRlcjtpZihoPWhbMF0sci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsdSksYz0oci5zb3J0VmFyc1ttXS5jb3VudCsxKSViLmxlbmd0aCxyLnNvcnRWYXJzW21dLmNvdW50PXNbci5zb3J0UmVzZXRLZXldPzI6YyxyLnNvcnRSZXN0YXJ0KWZvcihpPTA7aTxmO2krKylnPXIuJGhlYWRlcnMuZXEoaSksbSE9PShjPXBhcnNlSW50KGcuYXR0cigiZGF0YS1jb2x1bW4iKSwxMCkpJiYocHx8Zy5oYXNDbGFzcyh0LmNzcy5zb3J0Tm9uZSkpJiYoci5zb3J0VmFyc1tjXS5jb3VudD0tMSk7aWYocCl7aWYoci5zb3J0TGlzdD1bXSxyLmxhc3Quc29ydExpc3Q9W10sbnVsbCE9PXIuc29ydEZvcmNlKWZvcihhPXIuc29ydEZvcmNlLG49MDtuPGEubGVuZ3RoO24rKylhW25dWzBdIT09bSYmKHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPWFbbl0pO2lmKChsPWJbci5zb3J0VmFyc1ttXS5jb3VudF0pPDImJihyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1bbSxsXSxoLmNvbFNwYW4+MSkpZm9yKG49MTtuPGguY29sU3BhbjtuKyspci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20rbixsXSxyLnNvcnRWYXJzW20rbl0uY291bnQ9ZS5pbkFycmF5KGwsYil9ZWxzZSBpZihyLnNvcnRMaXN0PWUuZXh0ZW5kKFtdLHIubGFzdC5zb3J0TGlzdCksdC5pc1ZhbHVlSW5BcnJheShtLHIuc29ydExpc3QpPj0wKWZvcihuPTA7bjxyLnNvcnRMaXN0Lmxlbmd0aDtuKyspKGM9ci5zb3J0TGlzdFtuXSlbMF09PT1tJiYoY1sxXT1iW3Iuc29ydFZhcnNbbV0uY291bnRdLDI9PT1jWzFdJiYoci5zb3J0TGlzdC5zcGxpY2UobiwxKSxyLnNvcnRWYXJzW21dLmNvdW50PS0xKSk7ZWxzZSBpZigobD1iW3Iuc29ydFZhcnNbbV0uY291bnRdKTwyJiYoci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20sbF0saC5jb2xTcGFuPjEpKWZvcihuPTE7bjxoLmNvbFNwYW47bisrKXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttK24sbF0sci5zb3J0VmFyc1ttK25dLmNvdW50PWUuaW5BcnJheShsLGIpO2lmKHIubGFzdC5zb3J0TGlzdD1lLmV4dGVuZChbXSxyLnNvcnRMaXN0KSxyLnNvcnRMaXN0Lmxlbmd0aCYmci5zb3J0QXBwZW5kJiYoYT1lLmlzQXJyYXkoci5zb3J0QXBwZW5kKT9yLnNvcnRBcHBlbmQ6ci5zb3J0QXBwZW5kW3Iuc29ydExpc3RbMF1bMF1dLCF0LmlzRW1wdHlPYmplY3QoYSkpKWZvcihuPTA7bjxhLmxlbmd0aDtuKyspaWYoYVtuXVswXSE9PW0mJnQuaXNWYWx1ZUluQXJyYXkoYVtuXVswXSxyLnNvcnRMaXN0KTwwKXtpZihsPWFbbl1bMV0sZD0oIiIrbCkubWF0Y2goL14oYXxkfHN8b3xuKS8pKXN3aXRjaChjPXIuc29ydExpc3RbMF1bMV0sZFswXSl7Y2FzZSJkIjpsPTE7YnJlYWs7Y2FzZSJzIjpsPWM7YnJlYWs7Y2FzZSJvIjpsPTA9PT1jPzE6MDticmVhaztjYXNlIm4iOmw9KGMrMSklYi5sZW5ndGg7YnJlYWs7ZGVmYXVsdDpsPTB9ci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W2Fbbl1bMF0sbF19ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRCZWdpbiIsdSksc2V0VGltZW91dChmdW5jdGlvbigpe3Quc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVmb3JlRW5kIix1KSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEVuZCIsdSl9LDEpfSxtdWx0aXNvcnQ6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9W10sbD0wLGQ9ZS50ZXh0U29ydGVyfHwiIixjPWUuc29ydExpc3QsZz1jLmxlbmd0aCxwPWUuJHRib2RpZXMubGVuZ3RoO2lmKCFlLnNlcnZlclNpZGVTb3J0aW5nJiYhdC5pc0VtcHR5T2JqZWN0KGUuY2FjaGUpKXtpZih0LmRlYnVnKGUsImNvcmUiKSYmKG89bmV3IERhdGUpLCJvYmplY3QiPT10eXBlb2YgZClmb3Iocz1lLmNvbHVtbnM7cy0tOykiZnVuY3Rpb24iPT10eXBlb2YoYT10LmdldENvbHVtbkRhdGEobixkLHMpKSYmKGlbc109YSk7Zm9yKHI9MDtyPHA7cisrKXM9ZS5jYWNoZVtyXS5jb2xNYXgsZS5jYWNoZVtyXS5ub3JtYWxpemVkLnNvcnQoZnVuY3Rpb24ocixvKXt2YXIgYSxwLHUsZixoLG0sYjtmb3IoYT0wO2E8ZzthKyspe2lmKHU9Y1thXVswXSxmPWNbYV1bMV0sbD0wPT09ZixlLnNvcnRTdGFibGUmJnJbdV09PT1vW3VdJiYxPT09ZylyZXR1cm4gcltlLmNvbHVtbnNdLm9yZGVyLW9bZS5jb2x1bW5zXS5vcmRlcjtpZihwPS9uL2kudGVzdCh0LmdldFNvcnRUeXBlKGUucGFyc2Vycyx1KSkscCYmZS5zdHJpbmdzW3VdPyhwPSJib29sZWFuIj09dHlwZW9mIHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/KGw/MTotMSkqKHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/LTE6MSk6ZS5zdHJpbmdzW3VdP3Quc3RyaW5nW2Uuc3RyaW5nc1t1XV18fDA6MCxoPWUubnVtYmVyU29ydGVyP2UubnVtYmVyU29ydGVyKHJbdV0sb1t1XSxsLHNbdV0sbik6dFsic29ydE51bWVyaWMiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSxwLHNbdV0sdSxlKSk6KG09bD9yOm8sYj1sP286cixoPSJmdW5jdGlvbiI9PXR5cGVvZiBkP2QobVt1XSxiW3VdLGwsdSxuKToiZnVuY3Rpb24iPT10eXBlb2YgaVt1XT9pW3VdKG1bdV0sYlt1XSxsLHUsbik6dFsic29ydE5hdHVyYWwiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSx1LGUpKSxoKXJldHVybiBofXJldHVybiByW2UuY29sdW1uc10ub3JkZXItb1tlLmNvbHVtbnNdLm9yZGVyfSk7dC5kZWJ1ZyhlLCJjb3JlIikmJmNvbnNvbGUubG9nKCJBcHBseWluZyBzb3J0ICIrYy50b1N0cmluZygpK3QuYmVuY2htYXJrKG8pKX19LHJlc29ydENvbXBsZXRlOmZ1bmN0aW9uKHQscil7dC50YWJsZS5pc1VwZGF0aW5nJiZ0LiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLHQudGFibGUpLGUuaXNGdW5jdGlvbihyKSYmcih0LnRhYmxlKX0sY2hlY2tSZXNvcnQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhPWUuaXNBcnJheShvKT9vOnIuc29ydExpc3Q7ITE9PT0odm9pZCAwPT09bz9yLnJlc29ydDpvKXx8ci5zZXJ2ZXJTaWRlU29ydGluZ3x8ci50YWJsZS5pc1Byb2Nlc3Npbmc/KHQucmVzb3J0Q29tcGxldGUocixzKSx0LmFwcGx5V2lkZ2V0KHIudGFibGUsITEpKTphLmxlbmd0aD90LnNvcnRPbihyLGEsZnVuY3Rpb24oKXt0LnJlc29ydENvbXBsZXRlKHIscyl9LCEwKTp0LnNvcnRSZXNldChyLGZ1bmN0aW9uKCl7dC5yZXNvcnRDb21wbGV0ZShyLHMpLHQuYXBwbHlXaWRnZXQoci50YWJsZSwhMSl9KX0sc29ydE9uOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuPXIudGFibGU7ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsbiksdC51cGRhdGVIZWFkZXJTb3J0Q291bnQocixvKSx0LnNldEhlYWRlcnNDc3Mociksci5kZWxheUluaXQmJnQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSYmdC5idWlsZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVnaW4iLG4pLHQubXVsdGlzb3J0KHIpLHQuYXBwZW5kQ2FjaGUocixhKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZm9yZUVuZCIsbiksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRFbmQiLG4pLHQuYXBwbHlXaWRnZXQobiksZS5pc0Z1bmN0aW9uKHMpJiZzKG4pfSxzb3J0UmVzZXQ6ZnVuY3Rpb24ocixvKXtyLnNvcnRMaXN0PVtdLHQuc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpO3ZhciBzO2ZvcihzPTA7czxyLmNvbHVtbnM7cysrKXIuc29ydFZhcnNbc10uY291bnQ9LTE7ZS5pc0Z1bmN0aW9uKG8pJiZvKHIudGFibGUpfSxnZXRTb3J0VHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiBlJiZlW3RdP2VbdF0udHlwZXx8IiI6IiJ9LGdldE9yZGVyOmZ1bmN0aW9uKGUpe3JldHVybi9eZC9pLnRlc3QoZSl8fDE9PT1lfSxzb3J0TmF0dXJhbDpmdW5jdGlvbihlLHIpe2lmKGU9PT1yKXJldHVybiAwO2U9ZS50b1N0cmluZygpLHI9ci50b1N0cmluZygpO3ZhciBvLHMsYSxuLGksbCxkPXQucmVnZXg7aWYoZC5oZXgudGVzdChyKSl7aWYobz1wYXJzZUludCgoZXx8IiIpLm1hdGNoKGQuaGV4KSwxNikscz1wYXJzZUludCgocnx8IiIpLm1hdGNoKGQuaGV4KSwxNiksbzxzKXJldHVybi0xO2lmKG8+cylyZXR1cm4gMX1mb3Iobz0oZXx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIikscz0ocnx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIiksbD1NYXRoLm1heChvLmxlbmd0aCxzLmxlbmd0aCksaT0wO2k8bDtpKyspe2lmKGE9aXNOYU4ob1tpXSk/b1tpXXx8MDpwYXJzZUZsb2F0KG9baV0pfHwwLG49aXNOYU4oc1tpXSk/c1tpXXx8MDpwYXJzZUZsb2F0KHNbaV0pfHwwLGlzTmFOKGEpIT09aXNOYU4obikpcmV0dXJuIGlzTmFOKGEpPzE6LTE7aWYodHlwZW9mIGEhPXR5cGVvZiBuJiYoYSs9IiIsbis9IiIpLGE8bilyZXR1cm4tMTtpZihhPm4pcmV0dXJuIDF9cmV0dXJuIDB9LHNvcnROYXR1cmFsQXNjOmZ1bmN0aW9uKGUscixvLHMpe2lmKGU9PT1yKXJldHVybiAwO3ZhciBhPXQuc3RyaW5nW3MuZW1wdGllc1tvXXx8cy5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8tMToxOi1hfHwtMToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOmF8fDE6dC5zb3J0TmF0dXJhbChlLHIpfSxzb3J0TmF0dXJhbERlc2M6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGE9dC5zdHJpbmdbcy5lbXB0aWVzW29dfHxzLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWE/ImJvb2xlYW4iPT10eXBlb2YgYT9hPy0xOjE6YXx8MToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOi1hfHwtMTp0LnNvcnROYXR1cmFsKHIsZSl9LHNvcnRUZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+dD8xOmU8dD8tMTowfSxnZXRUZXh0VmFsdWU6ZnVuY3Rpb24oZSx0LHIpe2lmKHIpe3ZhciBvLHM9ZT9lLmxlbmd0aDowLGE9cit0O2ZvcihvPTA7bzxzO28rKylhKz1lLmNoYXJDb2RlQXQobyk7cmV0dXJuIHQqYX1yZXR1cm4gMH0sc29ydE51bWVyaWNBc2M6ZnVuY3Rpb24oZSxyLG8scyxhLG4pe2lmKGU9PT1yKXJldHVybiAwO3ZhciBpPXQuc3RyaW5nW24uZW1wdGllc1thXXx8bi5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8tMToxOi1pfHwtMToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOml8fDE6KGlzTmFOKGUpJiYoZT10LmdldFRleHRWYWx1ZShlLG8scykpLGlzTmFOKHIpJiYocj10LmdldFRleHRWYWx1ZShyLG8scykpLGUtcil9LHNvcnROdW1lcmljRGVzYzpmdW5jdGlvbihlLHIsbyxzLGEsbil7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGk9dC5zdHJpbmdbbi5lbXB0aWVzW2FdfHxuLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWk/ImJvb2xlYW4iPT10eXBlb2YgaT9pPy0xOjE6aXx8MToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOi1pfHwtMTooaXNOYU4oZSkmJihlPXQuZ2V0VGV4dFZhbHVlKGUsbyxzKSksaXNOYU4ocikmJihyPXQuZ2V0VGV4dFZhbHVlKHIsbyxzKSksci1lKX0sc29ydE51bWVyaWM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSxhZGRXaWRnZXQ6ZnVuY3Rpb24oZSl7ZS5pZCYmIXQuaXNFbXB0eU9iamVjdCh0LmdldFdpZGdldEJ5SWQoZS5pZCkpJiZjb25zb2xlLndhcm4oJyInK2UuaWQrJyIgd2lkZ2V0IHdhcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UhJyksdC53aWRnZXRzW3Qud2lkZ2V0cy5sZW5ndGhdPWV9LGhhc1dpZGdldDpmdW5jdGlvbih0LHIpe3JldHVybih0PWUodCkpLmxlbmd0aCYmdFswXS5jb25maWcmJnRbMF0uY29uZmlnLndpZGdldEluaXRbcl18fCExfSxnZXRXaWRnZXRCeUlkOmZ1bmN0aW9uKGUpe3ZhciByLG8scz10LndpZGdldHMubGVuZ3RoO2ZvcihyPTA7cjxzO3IrKylpZigobz10LndpZGdldHNbcl0pJiZvLmlkJiZvLmlkLnRvTG93ZXJDYXNlKCk9PT1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIG99LGFwcGx5V2lkZ2V0T3B0aW9uczpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbj1yLmNvbmZpZyxpPW4ud2lkZ2V0cy5sZW5ndGg7aWYoaSlmb3Iobz0wO288aTtvKyspKHM9dC5nZXRXaWRnZXRCeUlkKG4ud2lkZ2V0c1tvXSkpJiZzLm9wdGlvbnMmJihhPWUuZXh0ZW5kKCEwLHt9LHMub3B0aW9ucyksbi53aWRnZXRPcHRpb25zPWUuZXh0ZW5kKCEwLGEsbi53aWRnZXRPcHRpb25zKSxlLmV4dGVuZCghMCx0LmRlZmF1bHRzLndpZGdldE9wdGlvbnMscy5vcHRpb25zKSl9LGFkZFdpZGdldEZyb21DbGFzczpmdW5jdGlvbihlKXt2YXIgcixvLHM9ZS5jb25maWcsYT0iXiIrcy53aWRnZXRDbGFzcy5yZXBsYWNlKHQucmVnZXgudGVtcGxhdGVOYW1lLCIoXFxTKykrIikrIiQiLG49bmV3IFJlZ0V4cChhLCJnIiksaT0oZS5jbGFzc05hbWV8fCIiKS5zcGxpdCh0LnJlZ2V4LnNwYWNlcyk7aWYoaS5sZW5ndGgpZm9yKHI9aS5sZW5ndGgsbz0wO288cjtvKyspaVtvXS5tYXRjaChuKSYmKHMud2lkZ2V0c1tzLndpZGdldHMubGVuZ3RoXT1pW29dLnJlcGxhY2UobiwiJDEiKSl9LGFwcGx5V2lkZ2V0SWQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsPShyPWUocilbMF0pLmNvbmZpZyxkPWwud2lkZ2V0T3B0aW9ucyxjPXQuZGVidWcobCwiY29yZSIpLGc9dC5nZXRXaWRnZXRCeUlkKG8pO2cmJihpPWcuaWQsYT0hMSxlLmluQXJyYXkoaSxsLndpZGdldHMpPDAmJihsLndpZGdldHNbbC53aWRnZXRzLmxlbmd0aF09aSksYyYmKG49bmV3IERhdGUpLCFzJiZsLndpZGdldEluaXRbaV18fChsLndpZGdldEluaXRbaV09ITAsci5oYXNJbml0aWFsaXplZCYmdC5hcHBseVdpZGdldE9wdGlvbnMociksImZ1bmN0aW9uIj09dHlwZW9mIGcuaW5pdCYmKGE9ITAsYyYmY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJJbml0aWFsaXppbmcgIitpKyIgd2lkZ2V0IiksZy5pbml0KHIsZyxsLGQpKSksc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGcuZm9ybWF0fHwoYT0hMCxjJiZjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIlVwZGF0aW5nICIraSsiIHdpZGdldCIpLGcuZm9ybWF0KHIsbCxkLCExKSksYyYmYSYmKGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisocz8iaW5pdGlhbGl6aW5nICI6ImFwcGx5aW5nICIpK2krIiB3aWRnZXQiK3QuYmVuY2htYXJrKG4pKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpKX0sYXBwbHlXaWRnZXQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYz0ocj1lKHIpWzBdKS5jb25maWcsZz10LmRlYnVnKGMsImNvcmUiKSxwPVtdO2lmKCExPT09b3x8IXIuaGFzSW5pdGlhbGl6ZWR8fCFyLmlzQXBwbHlpbmdXaWRnZXRzJiYhci5pc1VwZGF0aW5nKXtpZihnJiYoZD1uZXcgRGF0ZSksdC5hZGRXaWRnZXRGcm9tQ2xhc3MociksY2xlYXJUaW1lb3V0KGMudGltZXJSZWFkeSksYy53aWRnZXRzLmxlbmd0aCl7Zm9yKHIuaXNBcHBseWluZ1dpZGdldHM9ITAsYy53aWRnZXRzPWUuZ3JlcChjLndpZGdldHMsZnVuY3Rpb24odCxyKXtyZXR1cm4gZS5pbkFycmF5KHQsYy53aWRnZXRzKT09PXJ9KSxuPShpPWMud2lkZ2V0c3x8W10pLmxlbmd0aCxhPTA7YTxuO2ErKykobD10LmdldFdpZGdldEJ5SWQoaVthXSkpJiZsLmlkPyhsLnByaW9yaXR5fHwobC5wcmlvcml0eT0xMCkscFthXT1sKTpnJiZjb25zb2xlLndhcm4oJyInK2lbYV0rJyIgd2FzIGVuYWJsZWQsIGJ1dCB0aGUgd2lkZ2V0IGNvZGUgaGFzIG5vdCBiZWVuIGxvYWRlZCEnKTtmb3IocC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucHJpb3JpdHk8dC5wcmlvcml0eT8tMTplLnByaW9yaXR5PT09dC5wcmlvcml0eT8wOjF9KSxuPXAubGVuZ3RoLGcmJmNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiU3RhcnQgIisobz8iaW5pdGlhbGl6aW5nIjoiYXBwbHlpbmciKSsiIHdpZGdldHMiKSxhPTA7YTxuO2ErKykobD1wW2FdKSYmbC5pZCYmdC5hcHBseVdpZGdldElkKHIsbC5pZCxvKTtnJiZjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9Yy50aW1lclJlYWR5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmlzQXBwbHlpbmdXaWRnZXRzPSExLGUuZGF0YShyLCJsYXN0V2lkZ2V0QXBwbGljYXRpb24iLG5ldyBEYXRlKSxjLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidGFibGVzb3J0ZXItcmVhZHkiKSxvfHwiZnVuY3Rpb24iIT10eXBlb2Ygc3x8cyhyKSxnJiYobD1jLndpZGdldHMubGVuZ3RoLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisoITA9PT1vPyJpbml0aWFsaXppbmcgIjoiYXBwbHlpbmcgIikrbCsiIHdpZGdldCIrKDEhPT1sPyJzIjoiIikrdC5iZW5jaG1hcmsoZCkpKX0sMTApfX0scmVtb3ZlV2lkZ2V0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkPShyPWUocilbMF0pLmNvbmZpZztpZighMD09PW8pZm9yKG89W10sbD10LndpZGdldHMubGVuZ3RoLGk9MDtpPGw7aSsrKShuPXQud2lkZ2V0c1tpXSkmJm4uaWQmJihvW28ubGVuZ3RoXT1uLmlkKTtlbHNlIG89KGUuaXNBcnJheShvKT9vLmpvaW4oIiwiKTpvfHwiIikudG9Mb3dlckNhc2UoKS5zcGxpdCgvW1xzLF0rLyk7Zm9yKGw9by5sZW5ndGgsYT0wO2E8bDthKyspbj10LmdldFdpZGdldEJ5SWQob1thXSksKGk9ZS5pbkFycmF5KG9bYV0sZC53aWRnZXRzKSk+PTAmJiEwIT09cyYmZC53aWRnZXRzLnNwbGljZShpLDEpLG4mJm4ucmVtb3ZlJiYodC5kZWJ1ZyhkLCJjb3JlIikmJmNvbnNvbGUubG9nKChzPyJSZWZyZXNoaW5nIjoiUmVtb3ZpbmciKSsnICInK29bYV0rJyIgd2lkZ2V0Jyksbi5yZW1vdmUocixkLGQud2lkZ2V0T3B0aW9ucyxzKSxkLndpZGdldEluaXRbb1thXV09ITEpO2QuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJ3aWRnZXRSZW1vdmVFbmQiLHIpfSxyZWZyZXNoV2lkZ2V0czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbixpPShyPWUocilbMF0pLmNvbmZpZy53aWRnZXRzLGw9dC53aWRnZXRzLGQ9bC5sZW5ndGgsYz1bXSxnPWZ1bmN0aW9uKHQpe2UodCkudHJpZ2dlckhhbmRsZXIoInJlZnJlc2hDb21wbGV0ZSIpfTtmb3IoYT0wO2E8ZDthKyspKG49bFthXSkmJm4uaWQmJihvfHxlLmluQXJyYXkobi5pZCxpKTwwKSYmKGNbYy5sZW5ndGhdPW4uaWQpO3QucmVtb3ZlV2lkZ2V0KHIsYy5qb2luKCIsIiksITApLCEwIT09cz8odC5hcHBseVdpZGdldChyLG98fCExLGcpLG8mJnQuYXBwbHlXaWRnZXQociwhMSxnKSk6ZyhyKX0sYmVuY2htYXJrOmZ1bmN0aW9uKGUpe3JldHVybiIgKCIrKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWUuZ2V0VGltZSgpKSsiIG1zKSJ9LGxvZzpmdW5jdGlvbigpe2NvbnNvbGUubG9nKGFyZ3VtZW50cyl9LGRlYnVnOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJighMD09PWUuZGVidWd8fCJzdHJpbmciPT10eXBlb2YgZS5kZWJ1ZyYmZS5kZWJ1Zy5pbmRleE9mKHQpPi0xKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0saXNWYWx1ZUluQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgcixvPXQmJnQubGVuZ3RofHwwO2ZvcihyPTA7cjxvO3IrKylpZih0W3JdWzBdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX0sZm9ybWF0RmxvYXQ6ZnVuY3Rpb24ocixvKXtpZigic3RyaW5nIiE9dHlwZW9mIHJ8fCIiPT09cilyZXR1cm4gcjt2YXIgcztyZXR1cm4gcj0obyYmby5jb25maWc/ITEhPT1vLmNvbmZpZy51c051bWJlckZvcm1hdDp2b2lkIDA9PT1vfHxvKT9yLnJlcGxhY2UodC5yZWdleC5jb21tYSwiIik6ci5yZXBsYWNlKHQucmVnZXguZGlnaXROb25VUywiIikucmVwbGFjZSh0LnJlZ2V4LmNvbW1hLCIuIiksdC5yZWdleC5kaWdpdE5lZ2F0aXZlVGVzdC50ZXN0KHIpJiYocj1yLnJlcGxhY2UodC5yZWdleC5kaWdpdE5lZ2F0aXZlUmVwbGFjZSwiLSQxIikpLHM9cGFyc2VGbG9hdChyKSxpc05hTihzKT9lLnRyaW0ocik6c30saXNEaWdpdDpmdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZSk/dC5yZWdleC5kaWdpdFRlc3QudGVzdChlLnRvU3RyaW5nKCkucmVwbGFjZSh0LnJlZ2V4LmRpZ2l0UmVwbGFjZSwiIikpOiIiIT09ZX0sY29tcHV0ZUNvbHVtbkluZGV4OmZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZyxwLHUsZj1vJiZvLmNvbHVtbnN8fDAsaD1bXSxtPW5ldyBBcnJheShmKTtmb3Iocz0wO3M8ci5sZW5ndGg7cysrKWZvcihkPXJbc10uY2VsbHMsYT0wO2E8ZC5sZW5ndGg7YSsrKXtmb3IoYz1zLGc9KGw9ZFthXSkucm93U3Bhbnx8MSxwPWwuY29sU3Bhbnx8MSx2b2lkIDA9PT1oW2NdJiYoaFtjXT1bXSksbj0wO248aFtjXS5sZW5ndGgrMTtuKyspaWYodm9pZCAwPT09aFtjXVtuXSl7dT1uO2JyZWFrfWZvcihmJiZsLmNlbGxJbmRleD09PXV8fChsLnNldEF0dHJpYnV0ZT9sLnNldEF0dHJpYnV0ZSgiZGF0YS1jb2x1bW4iLHUpOmUobCkuYXR0cigiZGF0YS1jb2x1bW4iLHUpKSxuPWM7bjxjK2c7bisrKWZvcih2b2lkIDA9PT1oW25dJiYoaFtuXT1bXSksbT1oW25dLGk9dTtpPHUrcDtpKyspbVtpXT0ieCJ9cmV0dXJuIHQuY2hlY2tDb2x1bW5Db3VudChyLGgsbS5sZW5ndGgpLG0ubGVuZ3RofSxjaGVja0NvbHVtbkNvdW50OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbyxzLGE9ITAsbj1bXTtmb3Iobz0wO288dC5sZW5ndGg7bysrKWlmKHRbb10mJihzPXRbb10ubGVuZ3RoLHRbb10ubGVuZ3RoIT09cikpe2E9ITE7YnJlYWt9YXx8KGUuZWFjaChmdW5jdGlvbihlLHQpe3ZhciByPXQucGFyZW50RWxlbWVudC5ub2RlTmFtZTtuLmluZGV4T2Yocik8MCYmbi5wdXNoKHIpfSksY29uc29sZS5lcnJvcigiSW52YWxpZCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlICIrbi5qb2luKCIgb3IgIikrIjsgZXhwZWN0ZWQgIityKyIsIGJ1dCBmb3VuZCAiK3MrIiBjb2x1bW5zIikpfSxmaXhDb2x1bW5XaWR0aDpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbixpLGw9KHI9ZShyKVswXSkuY29uZmlnLGQ9bC4kdGFibGUuY2hpbGRyZW4oImNvbGdyb3VwIik7aWYoZC5sZW5ndGgmJmQuaGFzQ2xhc3ModC5jc3MuY29sZ3JvdXApJiZkLnJlbW92ZSgpLGwud2lkdGhGaXhlZCYmMD09PWwuJHRhYmxlLmNoaWxkcmVuKCJjb2xncm91cCIpLmxlbmd0aCl7Zm9yKGQ9ZSgnPGNvbGdyb3VwIGNsYXNzPSInK3QuY3NzLmNvbGdyb3VwKyciPicpLG89bC4kdGFibGUud2lkdGgoKSxuPShhPWwuJHRib2RpZXMuZmluZCgidHI6Zmlyc3QiKS5jaGlsZHJlbigiOnZpc2libGUiKSkubGVuZ3RoLGk9MDtpPG47aSsrKXM9cGFyc2VJbnQoYS5lcShpKS53aWR0aCgpL28qMWUzLDEwKS8xMCsiJSIsZC5hcHBlbmQoZSgiPGNvbD4iKS5jc3MoIndpZHRoIixzKSk7bC4kdGFibGUucHJlcGVuZChkKX19LGdldERhdGE6ZnVuY3Rpb24odCxyLG8pe3ZhciBzLGEsbj0iIixpPWUodCk7cmV0dXJuIGkubGVuZ3RoPyhzPSEhZS5tZXRhZGF0YSYmaS5tZXRhZGF0YSgpLGE9IiAiKyhpLmF0dHIoImNsYXNzIil8fCIiKSx2b2lkIDAhPT1pLmRhdGEobyl8fHZvaWQgMCE9PWkuZGF0YShvLnRvTG93ZXJDYXNlKCkpP24rPWkuZGF0YShvKXx8aS5kYXRhKG8udG9Mb3dlckNhc2UoKSk6cyYmdm9pZCAwIT09c1tvXT9uKz1zW29dOnImJnZvaWQgMCE9PXJbb10/bis9cltvXToiICIhPT1hJiZhLm1hdGNoKCIgIitvKyItIikmJihuPWEubWF0Y2gobmV3IFJlZ0V4cCgiXFxzIitvKyItKFtcXHctXSspIikpWzFdfHwiIiksZS50cmltKG4pKToiIn0sZ2V0Q29sdW1uRGF0YTpmdW5jdGlvbih0LHIsbyxzLGEpe2lmKCJvYmplY3QiIT10eXBlb2Ygcnx8bnVsbD09PXIpcmV0dXJuIHI7dmFyIG4saT0odD1lKHQpWzBdKS5jb25maWcsbD1hfHxpLiRoZWFkZXJzLGQ9aS4kaGVhZGVySW5kZXhlZCYmaS4kaGVhZGVySW5kZXhlZFtvXXx8bC5maW5kKCdbZGF0YS1jb2x1bW49IicrbysnIl06bGFzdCcpO2lmKHZvaWQgMCE9PXJbb10pcmV0dXJuIHM/cltvXTpyW2wuaW5kZXgoZCldO2ZvcihuIGluIHIpaWYoInN0cmluZyI9PXR5cGVvZiBuJiZkLmZpbHRlcihuKS5hZGQoZC5maW5kKG4pKS5sZW5ndGgpcmV0dXJuIHJbbl19LGlzUHJvY2Vzc2luZzpmdW5jdGlvbihyLG8scyl7dmFyIGE9KHI9ZShyKSlbMF0uY29uZmlnLG49c3x8ci5maW5kKCIuIit0LmNzcy5oZWFkZXIpO28/KHZvaWQgMCE9PXMmJmEuc29ydExpc3QubGVuZ3RoPjAmJihuPW4uZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuc29ydERpc2FibGVkJiZ0LmlzVmFsdWVJbkFycmF5KHBhcnNlRmxvYXQoZSh0aGlzKS5hdHRyKCJkYXRhLWNvbHVtbiIpKSxhLnNvcnRMaXN0KT49MH0pKSxyLmFkZChuKS5hZGRDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpKTpyLmFkZChuKS5yZW1vdmVDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpfSxwcm9jZXNzVGJvZHk6ZnVuY3Rpb24odCxyLG8pe2lmKHQ9ZSh0KVswXSxvKXJldHVybiB0LmlzUHJvY2Vzc2luZz0hMCxyLmJlZm9yZSgnPGNvbGdyb3VwIGNsYXNzPSJ0YWJsZXNvcnRlci1zYXZlbXlwbGFjZSIvPicpLGUuZm4uZGV0YWNoP3IuZGV0YWNoKCk6ci5yZW1vdmUoKTt2YXIgcz1lKHQpLmZpbmQoImNvbGdyb3VwLnRhYmxlc29ydGVyLXNhdmVteXBsYWNlIik7ci5pbnNlcnRBZnRlcihzKSxzLnJlbW92ZSgpLHQuaXNQcm9jZXNzaW5nPSExfSxjbGVhclRhYmxlQm9keTpmdW5jdGlvbih0KXtlKHQpWzBdLmNvbmZpZy4kdGJvZGllcy5jaGlsZHJlbigpLmRldGFjaCgpfSxjaGFyYWN0ZXJFcXVpdmFsZW50czp7YToiw6HDoMOiw6PDpMSFw6UiLEE6IsOBw4DDgsODw4TEhMOFIixjOiLDp8SHxI0iLEM6IsOHxIbEjCIsZToiw6nDqMOqw6vEm8SZIixFOiLDicOIw4rDi8SaxJgiLGk6IsOtw6zEsMOuw6/EsSIsSToiw43DjMSww47DjyIsbzoiw7PDssO0w7XDtsWNIixPOiLDk8OSw5TDlcOWxYwiLHNzOiLDnyIsU1M6IuG6niIsdToiw7rDucO7w7zFryIsVToiw5rDmcObw5zFriJ9LHJlcGxhY2VBY2NlbnRzOmZ1bmN0aW9uKGUpe3ZhciByLG89IlsiLHM9dC5jaGFyYWN0ZXJFcXVpdmFsZW50cztpZighdC5jaGFyYWN0ZXJSZWdleCl7dC5jaGFyYWN0ZXJSZWdleEFycmF5PXt9O2ZvcihyIGluIHMpInN0cmluZyI9PXR5cGVvZiByJiYobys9c1tyXSx0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl09bmV3IFJlZ0V4cCgiWyIrc1tyXSsiXSIsImciKSk7dC5jaGFyYWN0ZXJSZWdleD1uZXcgUmVnRXhwKG8rIl0iKX1pZih0LmNoYXJhY3RlclJlZ2V4LnRlc3QoZSkpZm9yKHIgaW4gcykic3RyaW5nIj09dHlwZW9mIHImJihlPWUucmVwbGFjZSh0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl0scikpO3JldHVybiBlfSx2YWxpZGF0ZU9wdGlvbnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG4saT0iaGVhZGVycyBzb3J0Rm9yY2Ugc29ydExpc3Qgc29ydEFwcGVuZCB3aWRnZXRzIi5zcGxpdCgiICIpLGw9ci5vcmlnaW5hbFNldHRpbmdzO2lmKGwpe3QuZGVidWcociwiY29yZSIpJiYobj1uZXcgRGF0ZSk7Zm9yKG8gaW4gbClpZigidW5kZWZpbmVkIj09PShhPXR5cGVvZiB0LmRlZmF1bHRzW29dKSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ0YWJsZS5jb25maWcuJytvKyciIG9wdGlvbiBub3QgcmVjb2duaXplZCcpO2Vsc2UgaWYoIm9iamVjdCI9PT1hKWZvcihzIGluIGxbb10pYT10LmRlZmF1bHRzW29dJiZ0eXBlb2YgdC5kZWZhdWx0c1tvXVtzXSxlLmluQXJyYXkobyxpKTwwJiYidW5kZWZpbmVkIj09PWEmJmNvbnNvbGUud2FybignVGFibGVzb3J0ZXIgV2FybmluZyEgInRhYmxlLmNvbmZpZy4nK28rIi4iK3MrJyIgb3B0aW9uIG5vdCByZWNvZ25pemVkJyk7dC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ2YWxpZGF0ZSBvcHRpb25zIHRpbWU6Iit0LmJlbmNobWFyayhuKSl9fSxyZXN0b3JlSGVhZGVyczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ZShyKVswXS5jb25maWcsbj1hLiR0YWJsZS5maW5kKGEuc2VsZWN0b3JIZWFkZXJzKSxpPW4ubGVuZ3RoO2ZvcihvPTA7bzxpO28rKykocz1uLmVxKG8pKS5maW5kKCIuIit0LmNzcy5oZWFkZXJJbikubGVuZ3RoJiZzLmh0bWwoYS5oZWFkZXJDb250ZW50W29dKX0sZGVzdHJveTpmdW5jdGlvbihyLG8scyl7aWYoKHI9ZShyKVswXSkuaGFzSW5pdGlhbGl6ZWQpe3QucmVtb3ZlV2lkZ2V0KHIsITAsITEpO3ZhciBhLG49ZShyKSxpPXIuY29uZmlnLGw9bi5maW5kKCJ0aGVhZDpmaXJzdCIpLGQ9bC5maW5kKCJ0ci4iK3QuY3NzLmhlYWRlclJvdykucmVtb3ZlQ2xhc3ModC5jc3MuaGVhZGVyUm93KyIgIitpLmNzc0hlYWRlclJvdyksYz1uLmZpbmQoInRmb290OmZpcnN0ID4gdHIiKS5jaGlsZHJlbigidGgsIHRkIik7ITE9PT1vJiZlLmluQXJyYXkoInVpdGhlbWUiLGkud2lkZ2V0cyk+PTAmJihuLnRyaWdnZXJIYW5kbGVyKCJhcHBseVdpZGdldElkIixbInVpdGhlbWUiXSksbi50cmlnZ2VySGFuZGxlcigiYXBwbHlXaWRnZXRJZCIsWyJ6ZWJyYSJdKSksbC5maW5kKCJ0ciIpLm5vdChkKS5yZW1vdmUoKSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgdXBkYXRlQ2VsbCBhZGRSb3dzIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyByZW1vdmVXaWRnZXQgZGVzdHJveSBtb3VzZXVwIG1vdXNlbGVhdmUgIisia2V5cHJlc3Mgc29ydEJlZ2luIHNvcnRFbmQgcmVzZXRUb0xvYWRTdGF0ZSAiLnNwbGl0KCIgIikuam9pbihpLm5hbWVzcGFjZSsiICIpLG4ucmVtb3ZlRGF0YSgidGFibGVzb3J0ZXIiKS51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLGkuJGhlYWRlcnMuYWRkKGMpLnJlbW92ZUNsYXNzKFt0LmNzcy5oZWFkZXIsaS5jc3NIZWFkZXIsaS5jc3NBc2MsaS5jc3NEZXNjLHQuY3NzLnNvcnRBc2MsdC5jc3Muc29ydERlc2MsdC5jc3Muc29ydE5vbmVdLmpvaW4oIiAiKSkucmVtb3ZlQXR0cigiZGF0YS1jb2x1bW4iKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSxkLmZpbmQoaS5zZWxlY3RvclNvcnQpLnVuYmluZCgibW91c2Vkb3duIG1vdXNldXAga2V5cHJlc3MgIi5zcGxpdCgiICIpLmpvaW4oaS5uYW1lc3BhY2UrIiAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLHQucmVzdG9yZUhlYWRlcnMociksbi50b2dnbGVDbGFzcyh0LmNzcy50YWJsZSsiICIraS50YWJsZUNsYXNzKyIgdGFibGVzb3J0ZXItIitpLnRoZW1lLCExPT09byksbi5yZW1vdmVDbGFzcyhpLm5hbWVzcGFjZS5zbGljZSgxKSksci5oYXNJbml0aWFsaXplZD0hMSxkZWxldGUgci5jb25maWcuY2FjaGUsImZ1bmN0aW9uIj09dHlwZW9mIHMmJnMociksdC5kZWJ1ZyhpLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ0YWJsZXNvcnRlciBoYXMgYmVlbiByZW1vdmVkIil9fX07ZS5mbi50YWJsZXNvcnRlcj1mdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxzPWUuZXh0ZW5kKCEwLHt9LHQuZGVmYXVsdHMscix0Lmluc3RhbmNlTWV0aG9kcyk7cy5vcmlnaW5hbFNldHRpbmdzPXIsIW8uaGFzSW5pdGlhbGl6ZWQmJnQuYnVpbGRUYWJsZSYmIlRBQkxFIiE9PXRoaXMubm9kZU5hbWU/dC5idWlsZFRhYmxlKG8scyk6dC5zZXR1cChvLHMpfSl9LHdpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2d8fCh0LmxvZ3M9W10sY29uc29sZT17fSxjb25zb2xlLmxvZz1jb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj1jb25zb2xlLnRhYmxlPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50czphcmd1bWVudHNbMF07dC5sb2dzW3QubG9ncy5sZW5ndGhdPXtkYXRlOkRhdGUubm93KCksbG9nOmV9fSksdC5hZGRQYXJzZXIoe2lkOiJuby1wYXJzZXIiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbigpe3JldHVybiIifSx0eXBlOiJ0ZXh0In0pLHQuYWRkUGFyc2VyKHtpZDoidGV4dCIsaXM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9by5jb25maWc7cmV0dXJuIHImJihyPWUudHJpbShzLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpLHI9cy5zb3J0TG9jYWxlQ29tcGFyZT90LnJlcGxhY2VBY2NlbnRzKHIpOnIpLHJ9LHR5cGU6InRleHQifSksdC5yZWdleC5ub25kaWdpdD0vW15cdywuIFwtKCldL2csdC5hZGRQYXJzZXIoe2lkOiJkaWdpdCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNEaWdpdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC5jdXJyZW5jeVJlcGxhY2U9L1srXC0sLiBdL2csdC5yZWdleC5jdXJyZW5jeVRlc3Q9L15cKD9cZCtbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXXxbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXVxkK1wpPyQvLHQuYWRkUGFyc2VyKHtpZDoiY3VycmVuY3kiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiBlPShlfHwiIikucmVwbGFjZSh0LnJlZ2V4LmN1cnJlbmN5UmVwbGFjZSwiIiksdC5yZWdleC5jdXJyZW5jeVRlc3QudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC51cmxQcm90b2NvbFRlc3Q9L14oaHR0cHM/fGZ0cHxmaWxlKTpcL1wvLyx0LnJlZ2V4LnVybFByb3RvY29sUmVwbGFjZT0vKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLyh3d3dcLik/Lyx0LmFkZFBhcnNlcih7aWQ6InVybCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgudXJsUHJvdG9jb2xUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihyKXtyZXR1cm4gcj9lLnRyaW0oci5yZXBsYWNlKHQucmVnZXgudXJsUHJvdG9jb2xSZXBsYWNlLCIiKSk6cn0sdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhc2g9Ly0vZyx0LnJlZ2V4Lmlzb0RhdGU9L15cZHs0fVtcL1wtXVxkezEsMn1bXC9cLV1cZHsxLDJ9Lyx0LmFkZFBhcnNlcih7aWQ6Imlzb0RhdGUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4Lmlzb0RhdGUudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGFzaCwiLyIpKTplO3JldHVybiByIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocik/ci5nZXRUaW1lKCk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnBlcmNlbnQ9LyUvZyx0LnJlZ2V4LnBlcmNlbnRUZXN0PS8oXGRccyo/JXwlXHMqP1xkKS8sdC5hZGRQYXJzZXIoe2lkOiJwZXJjZW50IixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC5wZXJjZW50VGVzdC50ZXN0KGUpJiZlLmxlbmd0aDwxNX0sZm9ybWF0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGU/dC5mb3JtYXRGbG9hdChlLnJlcGxhY2UodC5yZWdleC5wZXJjZW50LCIiKSxyKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoiaW1hZ2UiLGlzOmZ1bmN0aW9uKGUsdCxyLG8pe3JldHVybiBvLmZpbmQoImltZyIpLmxlbmd0aD4wfSxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3JldHVybiBlKG8pLmZpbmQoImltZyIpLmF0dHIoci5jb25maWcuaW1nQXR0cnx8ImFsdCIpfHx0fSxwYXJzZWQ6ITAsdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhdGVSZXBsYWNlPS8oXFMpKFtBUF1NKSQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0MT0vXltBLVpdezMsMTB9XC4/XHMrXGR7MSwyfSw/XHMrKFxkezR9KShccytcZHsxLDJ9OlxkezJ9KDpcZHsyfSk/KFxzK1tBUF1NKT8pPyQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0Mj0vXlxkezEsMn1ccytbQS1aXXszLDEwfVxzK1xkezR9L2ksdC5hZGRQYXJzZXIoe2lkOiJ1c0xvbmdEYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC51c0xvbmdEYXRlVGVzdDEudGVzdChlKXx8dC5yZWdleC51c0xvbmdEYXRlVGVzdDIudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGF0ZVJlcGxhY2UsIiQxICQyIikpOmU7cmV0dXJuIHIgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShyKT9yLmdldFRpbWUoKTplfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXguc2hvcnREYXRlVGVzdD0vKF5cZHsxLDJ9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezR9KXwoXlxkezR9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezEsMn0pLyx0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2U9L1tcLS4sXS9nLHQucmVnZXguc2hvcnREYXRlWFhZPS8oXGR7MSwyfSlbXC9cc10oXGR7MSwyfSlbXC9cc10oXGR7NH0pLyx0LnJlZ2V4LnNob3J0RGF0ZVlNRD0vKFxkezR9KVtcL1xzXShcZHsxLDJ9KVtcL1xzXShcZHsxLDJ9KS8sdC5jb252ZXJ0Rm9ybWF0PWZ1bmN0aW9uKGUscil7ZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLCJtbWRkeXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMS8kMiIpOiJkZG1teXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMi8kMSIpOiJ5eXl5bW1kZCI9PT1yJiYoZT1lLnJlcGxhY2UodC5yZWdleC5zaG9ydERhdGVZTUQsIiQxLyQyLyQzIikpO3ZhciBvPW5ldyBEYXRlKGUpO3JldHVybiBvIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUobyk/by5nZXRUaW1lKCk6IiJ9LHQuYWRkUGFyc2VyKHtpZDoic2hvcnREYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLHQucmVnZXguc2hvcnREYXRlVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZSl7dmFyIGE9ci5jb25maWcsbj1hLiRoZWFkZXJJbmRleGVkW3NdLGk9bi5sZW5ndGgmJm4uZGF0YSgiZGF0ZUZvcm1hdCIpfHx0LmdldERhdGEobix0LmdldENvbHVtbkRhdGEocixhLmhlYWRlcnMscyksImRhdGVGb3JtYXQiKXx8YS5kYXRlRm9ybWF0O3JldHVybiBuLmxlbmd0aCYmbi5kYXRhKCJkYXRlRm9ybWF0IixpKSx0LmNvbnZlcnRGb3JtYXQoZSxpKXx8ZX1yZXR1cm4gZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnRpbWVUZXN0PS9eKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSkkfF4oKD86WzAxXVxkfFsyXVswLTRdKTpbMC01XVxkKSQvaSx0LnJlZ2V4LnRpbWVNYXRjaD0vKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSl8KCg/OlswMV1cZHxbMl1bMC00XSk6WzAtNV1cZCkvaSx0LmFkZFBhcnNlcih7aWQ6InRpbWUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4LnRpbWVUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcixvPShlfHwiIikubWF0Y2godC5yZWdleC50aW1lTWF0Y2gpLHM9bmV3IERhdGUoZSksYT1lJiYobnVsbCE9PW8/b1swXToiMDA6MDAgQU0iKSxuPWE/bmV3IERhdGUoIjIwMDAvMDEvMDEgIithLnJlcGxhY2UodC5yZWdleC5kYXRlUmVwbGFjZSwiJDEgJDIiKSk6YTtyZXR1cm4gbiBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKG4pPyhyPXMgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShzKT9zLmdldFRpbWUoKTowLHI/cGFyc2VGbG9hdChuLmdldFRpbWUoKSsiLiIrcy5nZXRUaW1lKCkpOm4uZ2V0VGltZSgpKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoibWV0YWRhdGEiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHM9ci5jb25maWcsYT1zLnBhcnNlck1ldGFkYXRhTmFtZT9zLnBhcnNlck1ldGFkYXRhTmFtZToic29ydFZhbHVlIjtyZXR1cm4gZShvKS5tZXRhZGF0YSgpW2FdfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkV2lkZ2V0KHtpZDoiemVicmEiLHByaW9yaXR5OjkwLGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZz1uZXcgUmVnRXhwKHIuY3NzQ2hpbGRSb3csImkiKSxwPXIuJHRib2RpZXMuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV90YWJsZSIpLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrci5jc3NJbmZvQmxvY2srIikiKSk7Zm9yKGw9MDtsPHAubGVuZ3RoO2wrKylmb3Iobj0wLGM9KHM9cC5lcShsKS5jaGlsZHJlbigidHI6dmlzaWJsZSIpLm5vdChyLnNlbGVjdG9yUmVtb3ZlKSkubGVuZ3RoLGQ9MDtkPGM7ZCsrKWE9cy5lcShkKSxnLnRlc3QoYVswXS5jbGFzc05hbWUpfHxuKyssaT1uJTI9PTAsYS5yZW1vdmVDbGFzcyhvLnplYnJhW2k/MTowXSkuYWRkQ2xhc3Moby56ZWJyYVtpPzA6MV0pfSxyZW1vdmU6ZnVuY3Rpb24oZSxyLG8scyl7aWYoIXMpe3ZhciBhLG4saT1yLiR0Ym9kaWVzLGw9KG8uemVicmF8fFsiZXZlbiIsIm9kZCJdKS5qb2luKCIgIik7Zm9yKGE9MDthPGkubGVuZ3RoO2ErKykobj10LnByb2Nlc3NUYm9keShlLGkuZXEoYSksITApKS5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKGwpLHQucHJvY2Vzc1Rib2R5KGUsbiwhMSl9fX0pfShlKSxlLnRhYmxlc29ydGVyfSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAgICBDb3B5cmlnaHQgMjAwOC0yMDEzCiAgICAgICAgTWF0dGhpYXMgRWhtYW5uLAogICAgICAgIE1pY2hhZWwgR2VyaGFldXNlciwKICAgICAgICBDYXJzdGVuIE1pbGxlciwKICAgICAgICBCaWFuY2EgVmFsZW50aW4sCiAgICAgICAgQWxmcmVkIFdhc3Nlcm1hbm4sCiAgICAgICAgUGV0ZXIgV2lsZmFocnQKICAgIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBvciBMR1BMIFZlcnNpb24gMyBsaWNlbnNlcy4KICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLgogICAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8+LgoqLwooZnVuY3Rpb24oKXt2YXIgZSxyLG47KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG8oZSxyKXtyZXR1cm4gQy5jYWxsKGUscil9ZnVuY3Rpb24gaShlLHIpe3ZhciBuLHQsbyxpLGEsdSxjLGYscyxsLHA9ciYmci5zcGxpdCgiLyIpLGg9ay5tYXAsZD1oJiZoWyIqIl18fHt9O2lmKGUmJiIuIj09PWUuY2hhckF0KDApKWlmKHIpe2ZvcihwPXAuc2xpY2UoMCxwLmxlbmd0aC0xKSxlPXAuY29uY2F0KGUuc3BsaXQoIi8iKSksZj0wO2UubGVuZ3RoPmY7Zis9MSlpZihsPWVbZl0sIi4iPT09bCllLnNwbGljZShmLDEpLGYtPTE7ZWxzZSBpZigiLi4iPT09bCl7aWYoMT09PWYmJigiLi4iPT09ZVsyXXx8Ii4uIj09PWVbMF0pKWJyZWFrO2Y+MCYmKGUuc3BsaWNlKGYtMSwyKSxmLT0yKX1lPWUuam9pbigiLyIpfWVsc2UgMD09PWUuaW5kZXhPZigiLi8iKSYmKGU9ZS5zdWJzdHJpbmcoMikpO2lmKChwfHxkKSYmaCl7Zm9yKG49ZS5zcGxpdCgiLyIpLGY9bi5sZW5ndGg7Zj4wO2YtPTEpe2lmKHQ9bi5zbGljZSgwLGYpLmpvaW4oIi8iKSxwKWZvcihzPXAubGVuZ3RoO3M+MDtzLT0xKWlmKG89aFtwLnNsaWNlKDAscykuam9pbigiLyIpXSxvJiYobz1vW3RdKSl7aT1vLGE9ZjticmVha31pZihpKWJyZWFrOyF1JiZkJiZkW3RdJiYodT1kW3RdLGM9Zil9IWkmJnUmJihpPXUsYT1jKSxpJiYobi5zcGxpY2UoMCxhLGkpLGU9bi5qb2luKCIvIikpfXJldHVybiBlfWZ1bmN0aW9uIGEoZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaC5hcHBseSh0LHYuY2FsbChhcmd1bWVudHMsMCkuY29uY2F0KFtlLHJdKSl9fWZ1bmN0aW9uIHUoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBpKHIsZSl9fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe2JbZV09cn19ZnVuY3Rpb24gZihlKXtpZihvKG0sZSkpe3ZhciByPW1bZV07ZGVsZXRlIG1bZV0seVtlXT0hMCxwLmFwcGx5KHQscil9aWYoIW8oYixlKSYmIW8oeSxlKSl0aHJvdyBFcnJvcigiTm8gIitlKTtyZXR1cm4gYltlXX1mdW5jdGlvbiBzKGUpe3ZhciByLG49ZT9lLmluZGV4T2YoIiEiKTotMTtyZXR1cm4gbj4tMSYmKHI9ZS5zdWJzdHJpbmcoMCxuKSxlPWUuc3Vic3RyaW5nKG4rMSxlLmxlbmd0aCkpLFtyLGVdfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGsmJmsuY29uZmlnJiZrLmNvbmZpZ1tlXXx8e319fXZhciBwLGgsZCxnLGI9e30sbT17fSxrPXt9LHk9e30sQz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHY9W10uc2xpY2U7ZD1mdW5jdGlvbihlLHIpe3ZhciBuLHQ9cyhlKSxvPXRbMF07cmV0dXJuIGU9dFsxXSxvJiYobz1pKG8sciksbj1mKG8pKSxvP2U9biYmbi5ub3JtYWxpemU/bi5ub3JtYWxpemUoZSx1KHIpKTppKGUscik6KGU9aShlLHIpLHQ9cyhlKSxvPXRbMF0sZT10WzFdLG8mJihuPWYobykpKSx7ZjpvP28rIiEiK2U6ZSxuOmUscHI6byxwOm59fSxnPXtyZXF1aXJlOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUpfSxleHBvcnRzOmZ1bmN0aW9uKGUpe3ZhciByPWJbZV07cmV0dXJuIHIhPT12b2lkIDA/cjpiW2VdPXt9fSxtb2R1bGU6ZnVuY3Rpb24oZSl7cmV0dXJue2lkOmUsdXJpOiIiLGV4cG9ydHM6YltlXSxjb25maWc6bChlKX19fSxwPWZ1bmN0aW9uKGUscixuLGkpe3ZhciB1LHMsbCxwLGgsayxDPVtdO2lmKGk9aXx8ZSwiZnVuY3Rpb24iPT10eXBlb2Ygbil7Zm9yKHI9IXIubGVuZ3RoJiZuLmxlbmd0aD9bInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl06cixoPTA7ci5sZW5ndGg+aDtoKz0xKWlmKHA9ZChyW2hdLGkpLHM9cC5mLCJyZXF1aXJlIj09PXMpQ1toXT1nLnJlcXVpcmUoZSk7ZWxzZSBpZigiZXhwb3J0cyI9PT1zKUNbaF09Zy5leHBvcnRzKGUpLGs9ITA7ZWxzZSBpZigibW9kdWxlIj09PXMpdT1DW2hdPWcubW9kdWxlKGUpO2Vsc2UgaWYobyhiLHMpfHxvKG0scyl8fG8oeSxzKSlDW2hdPWYocyk7ZWxzZXtpZighcC5wKXRocm93IEVycm9yKGUrIiBtaXNzaW5nICIrcyk7cC5wLmxvYWQocC5uLGEoaSwhMCksYyhzKSx7fSksQ1toXT1iW3NdfWw9bi5hcHBseShiW2VdLEMpLGUmJih1JiZ1LmV4cG9ydHMhPT10JiZ1LmV4cG9ydHMhPT1iW2VdP2JbZV09dS5leHBvcnRzOmw9PT10JiZrfHwoYltlXT1sKSl9ZWxzZSBlJiYoYltlXT1uKX0sZT1yPWg9ZnVuY3Rpb24oZSxyLG4sbyxpKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/Z1tlXT9nW2VdKHIpOmYoZChlLHIpLmYpOihlLnNwbGljZXx8KGs9ZSxyLnNwbGljZT8oZT1yLHI9bixuPW51bGwpOmU9dCkscj1yfHxmdW5jdGlvbigpe30sImZ1bmN0aW9uIj09dHlwZW9mIG4mJihuPW8sbz1pKSxvP3AodCxlLHIsbik6c2V0VGltZW91dChmdW5jdGlvbigpe3AodCxlLHIsbil9LDQpLGgpfSxoLmNvbmZpZz1mdW5jdGlvbihlKXtyZXR1cm4gaz1lLGsuZGVwcyYmaChrLmRlcHMsay5jYWxsYmFjayksaH0sbj1mdW5jdGlvbihlLHIsbil7ci5zcGxpY2V8fChuPXIscj1bXSksbyhiLGUpfHxvKG0sZSl8fChtW2VdPVtlLHIsbl0pfSxuLmFtZD17alF1ZXJ5OiEwfX0pKCksbigiLi4vbm9kZV9tb2R1bGVzL2FsbW9uZC9hbG1vbmQiLGZ1bmN0aW9uKCl7fSksbigianhnIixbXSxmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiJvYmplY3QiIT10eXBlb2YgSlhHfHxKWEcuZXh0ZW5kfHwoZT1KWEcpLGUuZXh0ZW5kPWZ1bmN0aW9uKGUscixuLHQpe3ZhciBvLGk7bj1ufHwhMSx0PXR8fCExO2ZvcihvIGluIHIpKCFufHxuJiZyLmhhc093blByb3BlcnR5KG8pKSYmKGk9dD9vLnRvTG93ZXJDYXNlKCk6byxlW2ldPXJbb10pfSxlLmV4dGVuZChlLHtib2FyZHM6e30scmVhZGVyczp7fSxlbGVtZW50czp7fSxyZWdpc3RlckVsZW1lbnQ6ZnVuY3Rpb24oZSxyKXtlPWUudG9Mb3dlckNhc2UoKSx0aGlzLmVsZW1lbnRzW2VdPXJ9LHJlZ2lzdGVyUmVhZGVyOmZ1bmN0aW9uKGUscil7dmFyIG4sdDtmb3Iobj0wO3IubGVuZ3RoPm47bisrKXQ9cltuXS50b0xvd2VyQ2FzZSgpLCJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLnJlYWRlcnNbdF0mJih0aGlzLnJlYWRlcnNbdF09ZSl9LHNob3J0Y3V0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbcl0uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sZ2V0UmVmOmZ1bmN0aW9uKGUscil7cmV0dXJuIGUuc2VsZWN0KHIpfSxnZXRSZWZlcmVuY2U6ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZS5zZWxlY3Qocil9LGRlYnVnSW50OmZ1bmN0aW9uKCl7dmFyIGUscjtmb3IoZT0wO2FyZ3VtZW50cy5sZW5ndGg+ZTtlKyspcj1hcmd1bWVudHNbZV0sIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZz9jb25zb2xlLmxvZyhyKToib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVidWciKSYmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZWJ1ZyIpLmlubmVySFRNTCs9cisiPGJyLz4iKX0sZGVidWdXU1Q6ZnVuY3Rpb24oKXt2YXIgcj1FcnJvcigpO2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJnIuc3RhY2smJihlLmRlYnVnSW50KCJzdGFja3RyYWNlIiksZS5kZWJ1Z0ludChyLnN0YWNrLnNwbGl0KCJcbiIpLnNsaWNlKDEpLmpvaW4oIlxuIikpKX0sZGVidWdMaW5lOmZ1bmN0aW9uKCl7dmFyIHI9RXJyb3IoKTtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZyLnN0YWNrJiZlLmRlYnVnSW50KCJDYWxsZWQgZnJvbSIsci5zdGFjay5zcGxpdCgiXG4iKS5zbGljZSgyLDMpLmpvaW4oIlxuIikpfSxkZWJ1ZzpmdW5jdGlvbigpe2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pLGV9KSxuKCJ1dGlscy96aXAiLFsianhnIl0sZnVuY3Rpb24oZSl7dmFyIHI9WzAsMTI4LDY0LDE5MiwzMiwxNjAsOTYsMjI0LDE2LDE0NCw4MCwyMDgsNDgsMTc2LDExMiwyNDAsOCwxMzYsNzIsMjAwLDQwLDE2OCwxMDQsMjMyLDI0LDE1Miw4OCwyMTYsNTYsMTg0LDEyMCwyNDgsNCwxMzIsNjgsMTk2LDM2LDE2NCwxMDAsMjI4LDIwLDE0OCw4NCwyMTIsNTIsMTgwLDExNiwyNDQsMTIsMTQwLDc2LDIwNCw0NCwxNzIsMTA4LDIzNiwyOCwxNTYsOTIsMjIwLDYwLDE4OCwxMjQsMjUyLDIsMTMwLDY2LDE5NCwzNCwxNjIsOTgsMjI2LDE4LDE0Niw4MiwyMTAsNTAsMTc4LDExNCwyNDIsMTAsMTM4LDc0LDIwMiw0MiwxNzAsMTA2LDIzNCwyNiwxNTQsOTAsMjE4LDU4LDE4NiwxMjIsMjUwLDYsMTM0LDcwLDE5OCwzOCwxNjYsMTAyLDIzMCwyMiwxNTAsODYsMjE0LDU0LDE4MiwxMTgsMjQ2LDE0LDE0Miw3OCwyMDYsNDYsMTc0LDExMCwyMzgsMzAsMTU4LDk0LDIyMiw2MiwxOTAsMTI2LDI1NCwxLDEyOSw2NSwxOTMsMzMsMTYxLDk3LDIyNSwxNywxNDUsODEsMjA5LDQ5LDE3NywxMTMsMjQxLDksMTM3LDczLDIwMSw0MSwxNjksMTA1LDIzMywyNSwxNTMsODksMjE3LDU3LDE4NSwxMjEsMjQ5LDUsMTMzLDY5LDE5NywzNywxNjUsMTAxLDIyOSwyMSwxNDksODUsMjEzLDUzLDE4MSwxMTcsMjQ1LDEzLDE0MSw3NywyMDUsNDUsMTczLDEwOSwyMzcsMjksMTU3LDkzLDIyMSw2MSwxODksMTI1LDI1MywzLDEzMSw2NywxOTUsMzUsMTYzLDk5LDIyNywxOSwxNDcsODMsMjExLDUxLDE3OSwxMTUsMjQzLDExLDEzOSw3NSwyMDMsNDMsMTcxLDEwNywyMzUsMjcsMTU1LDkxLDIxOSw1OSwxODcsMTIzLDI1MSw3LDEzNSw3MSwxOTksMzksMTY3LDEwMywyMzEsMjMsMTUxLDg3LDIxNSw1NSwxODMsMTE5LDI0NywxNSwxNDMsNzksMjA3LDQ3LDE3NSwxMTEsMjM5LDMxLDE1OSw5NSwyMjMsNjMsMTkxLDEyNywyNTVdLG49WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSx0PVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsOTksOTldLG89WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3N10saT1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sYT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sdT0yNTY7cmV0dXJuIGUuVXRpbD1lLlV0aWx8fHt9LGUuVXRpbC5VbnppcD1mdW5jdGlvbihjKXtmdW5jdGlvbiBmKCl7cmV0dXJuIFIrPTgsTz5YP2NbWCsrXTotMX1mdW5jdGlvbiBzKCl7Qj0xfWZ1bmN0aW9uIGwoKXt2YXIgZTt0cnl7cmV0dXJuIFIrKyxlPTEmQixCPj49MSwwPT09QiYmKEI9ZigpLGU9MSZCLEI9MTI4fEI+PjEpLGV9Y2F0Y2gocil7dGhyb3cgcn19ZnVuY3Rpb24gcChlKXt2YXIgbj0wLHQ9ZTt0cnl7Zm9yKDt0LS07KW49bjw8MXxsKCk7ZSYmKG49cltuXT4+OC1lKX1jYXRjaChvKXt0aHJvdyBvfXJldHVybiBufWZ1bmN0aW9uIGgoKXtKPTB9ZnVuY3Rpb24gZChlKXtqKyssR1tKKytdPWUsei5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpLDMyNzY4PT09SiYmKEo9MCl9ZnVuY3Rpb24gZygpe3RoaXMuYjA9MCx0aGlzLmIxPTAsdGhpcy5qdW1wPW51bGwsdGhpcy5qdW1wcG9zPS0xfWZ1bmN0aW9uIGIoKXtmb3IoOzspe2lmKE1bSF0+PXgpcmV0dXJuLTE7aWYoVVtNW0hdXT09PUgpcmV0dXJuIE1bSF0rKztNW0hdKyt9fWZ1bmN0aW9uIG0oKXt2YXIgZSxyPVBbRl07aWYoMTc9PT1IKXJldHVybi0xO2lmKEYrKyxIKyssZT1iKCksZT49MClyLmIwPWU7ZWxzZSBpZihyLmIwPTMyNzY4LG0oKSlyZXR1cm4tMTtpZihlPWIoKSxlPj0wKXIuYjE9ZSxyLmp1bXA9bnVsbDtlbHNlIGlmKHIuYjE9MzI3Njgsci5qdW1wPVBbRl0sci5qdW1wcG9zPUYsbSgpKXJldHVybi0xO3JldHVybiBILS0sMH1mdW5jdGlvbiBrKGUscixuKXt2YXIgdDtmb3IoUD1lLEY9MCxVPW4seD1yLHQ9MDsxNz50O3QrKylNW3RdPTA7cmV0dXJuIEg9MCxtKCk/LTE6MH1mdW5jdGlvbiB5KGUpe2Zvcih2YXIgcixuLHQsbz0wLGk9ZVtvXTs7KWlmKHQ9bCgpKXtpZighKDMyNzY4JmkuYjEpKXJldHVybiBpLmIxO2ZvcihpPWkuanVtcCxyPWUubGVuZ3RoLG49MDtyPm47bisrKWlmKGVbbl09PT1pKXtvPW47YnJlYWt9fWVsc2V7aWYoISgzMjc2OCZpLmIwKSlyZXR1cm4gaS5iMDtvKyssaT1lW29dfX1mdW5jdGlvbiBDKCl7dmFyIHUsYyxiLG0sQyx2LEEsaix3LFUseCxTLHosSSxFLEwsTztkbyBpZih1PWwoKSxiPXAoMiksMD09PWIpZm9yKHMoKSxVPWYoKSxVfD1mKCk8PDgsUz1mKCksU3w9ZigpPDw4LDY1NTM1JihVXn5TKSYmZS5kZWJ1ZygiQmxvY2tMZW4gY2hlY2tzdW0gbWlzbWF0Y2hcbiIpO1UtLTspYz1mKCksZChjKTtlbHNlIGlmKDE9PT1iKWZvcig7OylpZihDPXJbcCg3KV0+PjEsQz4yMz8oQz1DPDwxfGwoKSxDPjE5OT8oQy09MTI4LEM9Qzw8MXxsKCkpOihDLT00OCxDPjE0MyYmKEMrPTEzNikpKTpDKz0yNTYsMjU2PkMpZChDKTtlbHNle2lmKDI1Nj09PUMpYnJlYWs7Zm9yKEMtPTI1Nyx3PXAodFtDXSkrbltDXSxDPXJbcCg1KV0+PjMsaVtDXT44Pyh4PXAoOCkseHw9cChpW0NdLTgpPDw4KTp4PXAoaVtDXSkseCs9b1tDXSxDPTA7dz5DO0MrKyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgaWYoMj09PWIpe2ZvcihBPUFycmF5KDMyMCksST0yNTcrcCg1KSxFPTErcCg1KSxMPTQrcCg0KSxDPTA7MTk+QztDKyspQVtDXT0wO2ZvcihDPTA7TD5DO0MrKylBW2FbQ11dPXAoMyk7Zm9yKHc9cS5sZW5ndGgsbT0wO3c+bTttKyspcVttXT1uZXcgZztpZihrKHEsMTksQSwwKSlyZXR1cm4gaCgpLDE7Zm9yKHo9SStFLG09MCxPPS0xO3o+bTspaWYoTysrLEM9eShxKSwxNj5DKUFbbSsrXT1DO2Vsc2UgaWYoMTY9PT1DKXtpZihDPTMrcCgyKSxtK0M+eilyZXR1cm4gaCgpLDE7Zm9yKHY9bT9BW20tMV06MDtDLS07KUFbbSsrXT12fWVsc2V7aWYoQz0xNz09PUM/MytwKDMpOjExK3AoNyksbStDPnopcmV0dXJuIGgoKSwxO2Zvcig7Qy0tOylBW20rK109MH1mb3Iodz1ULmxlbmd0aCxtPTA7dz5tO20rKylUW21dPW5ldyBnO2lmKGsoVCxJLEEsMCkpcmV0dXJuIGgoKSwxO2Zvcih3PVQubGVuZ3RoLG09MDt3Pm07bSsrKXFbbV09bmV3IGc7Zm9yKGo9W10sbT1JO0EubGVuZ3RoPm07bSsrKWpbbS1JXT1BW21dO2lmKGsocSxFLGosMCkpcmV0dXJuIGgoKSwxO2Zvcig7OylpZihDPXkoVCksQz49MjU2KXtpZihDLT0yNTYsMD09PUMpYnJlYWs7Zm9yKEMtPTEsdz1wKHRbQ10pK25bQ10sQz15KHEpLGlbQ10+OD8oeD1wKDgpLHh8PXAoaVtDXS04KTw8OCk6eD1wKGlbQ10pLHgrPW9bQ107dy0tOyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgZChDKX13aGlsZSghdSk7cmV0dXJuIGgoKSxzKCksMH1mdW5jdGlvbiB2KCl7dmFyIGUscixuLHQsbyxpLGEsYyxzPVtdO3RyeXtpZih6PVtdLEw9ITEsc1swXT1mKCksc1sxXT1mKCksMTIwPT09c1swXSYmMjE4PT09c1sxXSYmKEMoKSxFW0ldPVt6LmpvaW4oIiIpLCJnZW9uZXh0Lmd4dCJdLEkrKyksMzE9PT1zWzBdJiYxMzk9PT1zWzFdJiYoUygpLEVbSV09W3ouam9pbigiIiksImZpbGUiXSxJKyspLDgwPT09c1swXSYmNzU9PT1zWzFdJiYoTD0hMCxzWzJdPWYoKSxzWzNdPWYoKSwzPT09c1syXSYmND09PXNbM10pKXtmb3Ioc1swXT1mKCksc1sxXT1mKCksQT1mKCksQXw9ZigpPDw4LGM9ZigpLGN8PWYoKTw8OCxmKCksZigpLGYoKSxmKCksYT1mKCksYXw9ZigpPDw4LGF8PWYoKTw8MTYsYXw9ZigpPDwyNCxpPWYoKSxpfD1mKCk8PDgsaXw9ZigpPDwxNixpfD1mKCk8PDI0LG89ZigpLG98PWYoKTw8OCxvfD1mKCk8PDE2LG98PWYoKTw8MjQsdD1mKCksdHw9ZigpPDw4LG49ZigpLG58PWYoKTw8OCxlPTAsTj1bXTt0LS07KXI9ZigpLCIvIj09PXJ8IjoiPT09cj9lPTA6dS0xPmUmJihOW2UrK109U3RyaW5nLmZyb21DaGFyQ29kZShyKSk7Zm9yKHd8fCh3PU4pLGU9MDtuPmU7KXI9ZigpLGUrKztqPTAsOD09PWMmJihDKCksRVtJXT1BcnJheSgyKSxFW0ldWzBdPXouam9pbigiIiksRVtJXVsxXT1OLmpvaW4oIiIpLEkrKyksUygpfX1jYXRjaChsKXt0aHJvdyBsfX12YXIgQSxqLHcsVSx4LFMsej1bXSxJPTAsRT1bXSxHPUFycmF5KDMyNzY4KSxKPTAsTD0hMSxPPWMubGVuZ3RoLFg9MCxCPTEsUj0wLFQ9QXJyYXkoMjg4KSxxPUFycmF5KDMyKSxGPTAsUD1udWxsLEg9KEFycmF5KDY0KSxBcnJheSg2NCksMCksTT1BcnJheSgxNyksTj1bXTtNWzBdPTAsUz1mdW5jdGlvbigpe3ZhciBlLHIsbix0LG8saSxhPVtdO2lmKDgmQSYmKGFbMF09ZigpLGFbMV09ZigpLGFbMl09ZigpLGFbM109ZigpLDgwPT09YVswXSYmNzU9PT1hWzFdJiY3PT09YVsyXSYmOD09PWFbM10/KGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQpOmU9YVswXXxhWzFdPDw4fGFbMl08PDE2fGFbM108PDI0LHI9ZigpLHJ8PWYoKTw8OCxyfD1mKCk8PDE2LHJ8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCksTCYmdigpLGFbMF09ZigpLDg9PT1hWzBdKXtpZihBPWYoKSxmKCksZigpLGYoKSxmKCksZigpLHQ9ZigpLDQmQSlmb3IoYVswXT1mKCksYVsyXT1mKCksSD1hWzBdKzI1NiphWzFdLG89MDtIPm87bysrKWYoKTtpZig4JkEpZm9yKG89MCxOPVtdLGk9ZigpO2k7KSgiNyI9PT1pfHwiOiI9PT1pKSYmKG89MCksdS0xPm8mJihOW28rK109aSksaT1mKCk7aWYoMTYmQSlmb3IoaT1mKCk7aTspaT1mKCk7MiZBJiYoZigpLGYoKSksQygpLGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCxMJiZ2KCl9fSxlLlV0aWwuVW56aXAucHJvdG90eXBlLnVuemlwRmlsZT1mdW5jdGlvbihlKXt2YXIgcjtmb3IodGhpcy51bnppcCgpLHI9MDtFLmxlbmd0aD5yO3IrKylpZihFW3JdWzFdPT09ZSlyZXR1cm4gRVtyXVswXTtyZXR1cm4iIn0sZS5VdGlsLlVuemlwLnByb3RvdHlwZS51bnppcD1mdW5jdGlvbigpe3JldHVybiB2KCksRX19LGUuVXRpbH0pLG4oInV0aWxzL2VuY29kaW5nIixbImp4ZyJdLGZ1bmN0aW9uKGUpe3ZhciByPTAsbj1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsOCw4LDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEwLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDQsMywzLDExLDYsNiw2LDUsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDAsMTIsMjQsMzYsNjAsOTYsODQsMTIsMTIsMTIsNDgsNzIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMCwxMiwxMiwxMiwxMiwxMiwwLDEyLDAsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTJdO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuVVRGOD17ZW5jb2RlOmZ1bmN0aW9uKGUpe3ZhciByLG4sdD0iIixvPWUubGVuZ3RoO2lmKGU9ZS5yZXBsYWNlKC9cclxuL2csIlxuIiksImZ1bmN0aW9uIj09dHlwZW9mIHVuZXNjYXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZW5jb2RlVVJJQ29tcG9uZW50KXJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpO2ZvcihyPTA7bz5yO3IrKyluPWUuY2hhckNvZGVBdChyKSwxMjg+bj90Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKG4pOm4+MTI3JiYyMDQ4Pm4/KHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTkyfG4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKToodCs9U3RyaW5nLmZyb21DaGFyQ29kZSgyMjR8bj4+MTIpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKTtyZXR1cm4gdH0sZGVjb2RlOmZ1bmN0aW9uKGUpe3ZhciB0LG8saSxhPTAsdT0wLGM9cixmPVtdLHM9ZS5sZW5ndGgsbD1bXTtmb3IodD0wO3M+dDt0Kyspbz1lLmNoYXJDb2RlQXQodCksaT1uW29dLHU9YyE9PXI/NjMmb3x1PDw2OjI1NT4+aSZvLGM9blsyNTYrYytpXSxjPT09ciYmKHU+NjU1MzU/Zi5wdXNoKDU1MjMyKyh1Pj4xMCksNTYzMjArKDEwMjMmdSkpOmYucHVzaCh1KSxhKyssMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSksZj1bXSkpO3JldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGYpKSxsLmpvaW4oIiIpfSxhc2NpaUNoYXJDb2RlQXQ6ZnVuY3Rpb24oZSxyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7aWYobj4yNTUpc3dpdGNoKG4pe2Nhc2UgODM2NDpuPTEyODticmVhaztjYXNlIDgyMTg6bj0xMzA7YnJlYWs7Y2FzZSA0MDI6bj0xMzE7YnJlYWs7Y2FzZSA4MjIyOm49MTMyO2JyZWFrO2Nhc2UgODIzMDpuPTEzMzticmVhaztjYXNlIDgyMjQ6bj0xMzQ7YnJlYWs7Y2FzZSA4MjI1Om49MTM1O2JyZWFrO2Nhc2UgNzEwOm49MTM2O2JyZWFrO2Nhc2UgODI0MDpuPTEzNzticmVhaztjYXNlIDM1MjpuPTEzODticmVhaztjYXNlIDgyNDk6bj0xMzk7YnJlYWs7Y2FzZSAzMzg6bj0xNDA7YnJlYWs7Y2FzZSAzODE6bj0xNDI7YnJlYWs7Y2FzZSA4MjE2Om49MTQ1O2JyZWFrO2Nhc2UgODIxNzpuPTE0NjticmVhaztjYXNlIDgyMjA6bj0xNDc7YnJlYWs7Y2FzZSA4MjIxOm49MTQ4O2JyZWFrO2Nhc2UgODIyNjpuPTE0OTticmVhaztjYXNlIDgyMTE6bj0xNTA7YnJlYWs7Y2FzZSA4MjEyOm49MTUxO2JyZWFrO2Nhc2UgNzMyOm49MTUyO2JyZWFrO2Nhc2UgODQ4MjpuPTE1MzticmVhaztjYXNlIDM1MzpuPTE1NDticmVhaztjYXNlIDgyNTA6bj0xNTU7YnJlYWs7Y2FzZSAzMzk6bj0xNTY7YnJlYWs7Y2FzZSAzODI6bj0xNTg7YnJlYWs7Y2FzZSAzNzY6bj0xNTk7YnJlYWs7ZGVmYXVsdDp9cmV0dXJuIG59fSxlLlV0aWwuVVRGOH0pLG4oInV0aWxzL2Jhc2U2NCIsWyJqeGciLCJ1dGlscy9lbmNvZGluZyJdLGZ1bmN0aW9uKGUscil7ZnVuY3Rpb24gbihlLHIpe3JldHVybiAyNTUmZS5jaGFyQ29kZUF0KHIpfWZ1bmN0aW9uIHQoZSxyKXt2YXIgbj1vLmluZGV4T2YoZS5jaGFyQXQocikpO2lmKC0xPT09bil0aHJvdyBFcnJvcigiSlNYR3JhcGgvdXRpbHMvYmFzZTY0OiBDYW4ndCBkZWNvZGUgc3RyaW5nIChpbnZhbGlkIGNoYXJhY3RlcikuIik7cmV0dXJuIG59dmFyIG89IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGk9Ij0iO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuQmFzZTY0PXtlbmNvZGU6ZnVuY3Rpb24oZSl7dmFyIHQsYSx1LGMsZixzPVtdO2ZvcihmPXIuZW5jb2RlKGUpLHU9Zi5sZW5ndGgsYz11JTMsdD0wO3UtYz50O3QrPTMpYT1uKGYsdCk8PDE2fG4oZix0KzEpPDw4fG4oZix0KzIpLHMucHVzaChvLmNoYXJBdChhPj4xOCksby5jaGFyQXQoNjMmYT4+MTIpLG8uY2hhckF0KDYzJmE+PjYpLG8uY2hhckF0KDYzJmEpKTtzd2l0Y2goYyl7Y2FzZSAxOmE9bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjIpLG8uY2hhckF0KDYzJmE8PDQpLGksaSk7YnJlYWs7Y2FzZSAyOmE9bihmLHUtMik8PDh8bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjEwKSxvLmNoYXJBdCg2MyZhPj40KSxvLmNoYXJBdCg2MyZhPDwyKSxpKX1yZXR1cm4gcy5qb2luKCIiKX0sZGVjb2RlOmZ1bmN0aW9uKGUsbil7dmFyIG8sYSx1LGMsZixzLGw9W10scD1bXTtpZihvPWUucmVwbGFjZSgvW15BLVphLXowLTlcK1wvPV0vZywiIiksdT1vLmxlbmd0aCwwIT09dSU0KXRocm93IEVycm9yKCJKU1hHcmFwaC91dGlscy9iYXNlNjQ6IENhbid0IGRlY29kZSBzdHJpbmcgKGludmFsaWQgaW5wdXQgbGVuZ3RoKS4iKTtmb3Ioby5jaGFyQXQodS0xKT09PWkmJihjPTEsby5jaGFyQXQodS0yKT09PWkmJihjPTIpLHUtPTQpLGE9MDt1PmE7YSs9NClmPXQobyxhKTw8MTh8dChvLGErMSk8PDEyfHQobyxhKzIpPDw2fHQobyxhKzMpLHAucHVzaChmPj4xNiwyNTUmZj4+OCwyNTUmZiksMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxwKSkscD1bXSk7c3dpdGNoKGMpe2Nhc2UgMTpmPXQobyx1KTw8MTJ8dChvLHUrMSk8PDZ8dChvLHUrMikscC5wdXNoKGY+PjEwLDI1NSZmPj4yKTticmVhaztjYXNlIDI6Zj10KG8sYSk8PDZ8dChvLGErMSkscC5wdXNoKGY+PjQpfXJldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHApKSxzPWwuam9pbigiIiksbiYmKHM9ci5kZWNvZGUocykpLHN9LGRlY29kZUFzQXJyYXk6ZnVuY3Rpb24oZSl7dmFyIHIsbj10aGlzLmRlY29kZShlKSx0PVtdLG89bi5sZW5ndGg7Zm9yKHI9MDtvPnI7cisrKXRbcl09bi5jaGFyQ29kZUF0KHIpO3JldHVybiB0fX0sZS5VdGlsLkJhc2U2NH0pLG4oIi4uL2J1aWxkL2NvbXByZXNzb3IuZGVwcy5qcyIsWyJqeGciLCJ1dGlscy96aXAiLCJ1dGlscy9iYXNlNjQiXSxmdW5jdGlvbihlLHIsbil7cmV0dXJuIGUuZGVjb21wcmVzcz1mdW5jdGlvbihlKXtyZXR1cm4gdW5lc2NhcGUobmV3IHIuVW56aXAobi5kZWNvZGVBc0FycmF5KGUpKS51bnppcCgpWzBdWzBdKX0sZX0pLHdpbmRvdy5KWEc9cigiLi4vYnVpbGQvY29tcHJlc3Nvci5kZXBzLmpzIil9KSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuZmlsZUxvYWRpbmcgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIGZpbGVMb2FkaW5nQ2FsbGJhY2tzID0ge307CiAgICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICBmdW5jdGlvbiBsb2FkS2V5d29yZHNGaWxlKGZpbGVuYW1lLCBjYWxsYmFjaykgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSA9IGNhbGxiYWNrOwogICAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOwogICAgICAgIC8vIHRpbWVzdGFtcCBhcyBhbiBhcmd1bWVudCB0byBwcmV2ZW50IGJyb3dzZXJzIGZyb20gY2FjaGluZyBzY3JpcHRzCiAgICAgICAgLy8gc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg2NjYxOS9ob3ctdG8tZm9yY2UtaWUtdG8tcmVsb2FkLWphdmFzY3JpcHQKICAgICAgICBzY3JpcHQuc3JjID0gZmlsZW5hbWUrJz90aW1lPScrdGltZXN0YW1wOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHBhcmVudCkgewogICAgICAgIHZhciBjYWxsYWJsZUxpc3QgPSBbXTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxhYmxlKSB7CiAgICAgICAgICAgIGlmICghcGFyZW50LmlzQ2hpbGRyZW5Mb2FkZWQpIHsKICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdC5wdXNoKGNhbGxhYmxlKTsKICAgICAgICAgICAgICAgIGlmIChjYWxsYWJsZUxpc3QubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBsb2FkS2V5d29yZHNGaWxlKHBhcmVudC5jaGlsZEZpbGVOYW1lLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYWJsZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdFtpXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbm90aWZ5RmlsZUxvYWRlZChmaWxlbmFtZSkgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSgpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXRDYWxsYmFja0hhbmRsZXJGb3JLZXl3b3JkczogZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHMsCiAgICAgICAgbm90aWZ5OiBub3RpZnlGaWxlTG9hZGVkCiAgICB9Cn0oKSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5tb2RlbCA9IChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBTdWl0ZShkYXRhKSB7CiAgICAgICAgdmFyIHN1aXRlID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAgc3VpdGUuc291cmNlID0gZGF0YS5zb3VyY2U7CiAgICAgICAgc3VpdGUucmVsYXRpdmVTb3VyY2UgPSBkYXRhLnJlbGF0aXZlU291cmNlOwogICAgICAgIHN1aXRlLmZ1bGxOYW1lID0gZGF0YS5wYXJlbnQgPyBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIGRhdGEubmFtZSA6IGRhdGEubmFtZTsKICAgICAgICBzZXRTdGF0cyhzdWl0ZSwgZGF0YS5zdGF0aXN0aWNzKTsKICAgICAgICBzdWl0ZS5tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGE7CiAgICAgICAgc3VpdGUucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdUZXN0Jyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVTdWl0ZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignU3VpdGUnKTsKICAgICAgICBzdWl0ZS5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXTsKICAgICAgICBzdWl0ZS5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSBmdW5jdGlvbiAoY2FsbGFibGUpIHsgY2FsbGFibGUoKTsgfTsKICAgICAgICBzdWl0ZS5tZXNzYWdlID0gZGF0YS5tZXNzYWdlOwogICAgICAgIHN1aXRlLmNoaWxkcmVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc3VpdGUua2V5d29yZHMoKS5jb25jYXQoc3VpdGUudGVzdHMoKSkuY29uY2F0KHN1aXRlLnN1aXRlcygpKTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLnNlYXJjaFRlc3RzID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkgewogICAgICAgICAgICB2YXIgdGVzdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHN1aXRlcyA9IHRoaXMuc3VpdGVzKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc3VpdGVzKQogICAgICAgICAgICAgICAgdGVzdHMgPSB0ZXN0cy5jb25jYXQoc3VpdGVzW2ldLnNlYXJjaFRlc3RzKHByZWRpY2F0ZSkpOwogICAgICAgICAgICByZXR1cm4gdGVzdHMuY29uY2F0KHV0aWwuZmlsdGVyKHRoaXMudGVzdHMoKSwgcHJlZGljYXRlKSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5zZWFyY2hUZXN0c0luU3VpdGUgPSBmdW5jdGlvbiAocGF0dGVybiwgbWF0Y2hlcikgewogICAgICAgICAgICBpZiAoIW1hdGNoZXIpCiAgICAgICAgICAgICAgICBtYXRjaGVyID0gdXRpbC5NYXRjaGVyKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzQW55KFtzdWl0ZS5mdWxsTmFtZSwgc3VpdGUubmFtZV0pKQogICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlLmFsbFRlc3RzKCk7CiAgICAgICAgICAgIHZhciB0ZXN0cyA9IFtdOwogICAgICAgICAgICB2YXIgc3VpdGVzID0gdGhpcy5zdWl0ZXMoKTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzdWl0ZXMpCiAgICAgICAgICAgICAgICB0ZXN0cyA9IHRlc3RzLmNvbmNhdChzdWl0ZXNbaV0uc2VhcmNoVGVzdHNJblN1aXRlKHBhdHRlcm4sIG1hdGNoZXIpKTsKICAgICAgICAgICAgcmV0dXJuIHRlc3RzOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuc2VhcmNoVGVzdHNCeVRhZyA9IGZ1bmN0aW9uICh0YWcpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICBpZiAodGFnLmluZm8gPT0gImNyaXRpY2FsIiB8fCB0YWcuaW5mbyA9PSAibm9uLWNyaXRpY2FsIikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3QudGFncywgdGFnLmxhYmVsKTsKICAgICAgICAgICAgICAgIGlmICh0YWcuY29tYmluZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnUGF0dGVybih0ZXN0LnRhZ3MsIHRhZy5jb21iaW5lZCk7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWcodGVzdC50YWdzLCB0YWcubGFiZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLmZpbmRTdWl0ZUJ5TmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuYWxsVGVzdHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBzdWl0ZS5zZWFyY2hUZXN0cyhmdW5jdGlvbiAodGVzdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuY3JpdGljYWxUZXN0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5pc0NyaXRpY2FsOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRhaW5zVGFnKHRlc3RUYWdzLCB0YWduYW1lKSB7CiAgICAgICAgdGVzdFRhZ3MgPSB1dGlsLm1hcCh0ZXN0VGFncywgdXRpbC5ub3JtYWxpemUpOwogICAgICAgIHJldHVybiB1dGlsLmNvbnRhaW5zKHRlc3RUYWdzLCB1dGlsLm5vcm1hbGl6ZSh0YWduYW1lKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHBhdHRlcm4pIHsKICAgICAgICB2YXIgcGF0dGVybnM7CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignTk9UJykgIT0gLTEpIHsKICAgICAgICAgICAgcGF0dGVybnMgPSBwYXR0ZXJuLnNwbGl0KCdOT1QnKTsKICAgICAgICAgICAgaWYgKCF1dGlsLm5vcm1hbGl6ZShwYXR0ZXJuc1swXSkpCiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5hbGwodXRpbC5tYXAocGF0dGVybnMuc2xpY2UoMSksIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwYXR0ZXJuc1swXSkgJiYKICAgICAgICAgICAgICAgIHV0aWwuYWxsKHV0aWwubWFwKHBhdHRlcm5zLnNsaWNlKDEpLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignT1InKSAhPSAtMSkgewogICAgICAgICAgICBwYXR0ZXJucyA9IHBhdHRlcm4uc3BsaXQoJ09SJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFueSh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ0FORCcpICE9IC0xKSB7CiAgICAgICAgICAgIHBhdHRlcm5zID0gcGF0dGVybi5zcGxpdCgnQU5EJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFsbCh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1dGlsLk1hdGNoZXIocGF0dGVybikubWF0Y2hlc0FueSh0ZXN0VGFncyk7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpIHsKICAgICAgICBpZiAoc3VpdGUuZnVsbE5hbWUgPT0gbmFtZSkKICAgICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgICAgIHZhciBzdWJTdWl0ZXMgPSBzdWl0ZS5zdWl0ZXMoKTsKICAgICAgICBmb3IgKHZhciBpIGluIHN1YlN1aXRlcykgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmaW5kU3VpdGVCeU5hbWUoc3ViU3VpdGVzW2ldLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG1hdGNoKQogICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0YXRzKHN1aXRlLCBzdGF0cykgewogICAgICAgIGZvciAodmFyIG5hbWUgaW4gc3RhdHMpIHsKICAgICAgICAgICAgc3VpdGVbbmFtZV0gPSBzdGF0c1tuYW1lXTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNb2RlbE9iamVjdChkYXRhKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lLAogICAgICAgICAgICBkb2M6IGRhdGEuZG9jLAogICAgICAgICAgICBzdGF0dXM6IGRhdGEuc3RhdHVzLAogICAgICAgICAgICB0aW1lczogZGF0YS50aW1lcywKICAgICAgICAgICAgaWQ6IGRhdGEucGFyZW50ID8gZGF0YS5wYXJlbnQuaWQgKyAnLScgKyBkYXRhLmlkIDogZGF0YS5pZAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUZXN0KGRhdGEpIHsKICAgICAgICB2YXIgdGVzdCA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIHRlc3QuZnVsbE5hbWUgPSBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIHRlc3QubmFtZTsKICAgICAgICB0ZXN0LmZvcm1hdFBhcmVudE5hbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB1dGlsLmZvcm1hdFBhcmVudE5hbWUodGVzdCk7IH07CiAgICAgICAgdGVzdC50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIHRlc3QucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgdGVzdC5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJ107CiAgICAgICAgdGVzdC5pc0NoaWxkcmVuTG9hZGVkID0gZGF0YS5pc0NoaWxkcmVuTG9hZGVkOwogICAgICAgIHRlc3QuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHRlc3QpOwogICAgICAgIHRlc3QuY2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0ZXN0LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5rZXl3b3JkcygpOwogICAgICAgIH07CiAgICAgICAgdGVzdC5pc0NyaXRpY2FsID0gZGF0YS5pc0NyaXRpY2FsOwogICAgICAgIHRlc3QudGFncyA9IGRhdGEudGFnczsKICAgICAgICB0ZXN0Lm1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7CiAgICAgICAgdGVzdC5tYXRjaGVzVGFnUGF0dGVybiA9IGZ1bmN0aW9uIChwYXR0ZXJuKSB7CiAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdC50YWdzLCBwYXR0ZXJuKTsKICAgICAgICB9OwogICAgICAgIHRlc3QubWF0Y2hlc05hbWVQYXR0ZXJuID0gZnVuY3Rpb24gKHBhdHRlcm4pIHsKICAgICAgICAgICAgcmV0dXJuIHV0aWwuTWF0Y2hlcihwYXR0ZXJuKS5tYXRjaGVzQW55KFt0ZXN0Lm5hbWUsIHRlc3QuZnVsbE5hbWVdKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiB0ZXN0OwogICAgfQogICAgZnVuY3Rpb24gS2V5d29yZChkYXRhKSB7CiAgICAgICAgdmFyIGt3ID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAga3cubGlibmFtZSA9IGRhdGEubGlibmFtZTsKICAgICAgICBrdy50eXBlID0gZGF0YS50eXBlOwogICAgICAgIGt3LmFyZ3VtZW50cyA9IGRhdGEuYXJnczsKICAgICAgICBrdy5hc3NpZ24gPSBkYXRhLmFzc2lnbiArIChkYXRhLmFzc2lnbiA/ICcgPScgOiAnJyk7CiAgICAgICAga3cudGFncyA9IGRhdGEudGFnczsKICAgICAgICBrdy50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIGt3LnBvcHVsYXRlTWVzc2FnZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignTWVzc2FnZScpOwogICAgICAgIGt3LnBvcHVsYXRlS2V5d29yZHMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignS2V5d29yZCcpOwogICAgICAgIGt3LmNoaWxkcmVuTmFtZXMgPSBbJ2tleXdvcmQnLCAnbWVzc2FnZSddOwogICAgICAgIGt3LmlzQ2hpbGRyZW5Mb2FkZWQgPSBkYXRhLmlzQ2hpbGRyZW5Mb2FkZWQ7CiAgICAgICAga3cuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKGt3KTsKICAgICAgICBrdy5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGt3LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4ga3cua2V5d29yZHMoKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBrdzsKICAgIH0KICAgIGZ1bmN0aW9uIE1lc3NhZ2UobGV2ZWwsIGRhdGUsIHRleHQsIGxpbmspIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsZXZlbDogbGV2ZWwsCiAgICAgICAgICAgIHRpbWU6IHV0aWwudGltZUZyb21EYXRlKGRhdGUpLAogICAgICAgICAgICBkYXRlOiB1dGlsLmRhdGVGcm9tRGF0ZShkYXRlKSwKICAgICAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICAgICAgbGluazogbGluawogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUaW1lcyh0aW1lZGF0YSkgewogICAgICAgIHZhciBzdGFydCA9IHRpbWVkYXRhWzBdOwogICAgICAgIHZhciBlbmQgPSB0aW1lZGF0YVsxXTsKICAgICAgICB2YXIgZWxhcHNlZCA9IHRpbWVkYXRhWzJdOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGVsYXBzZWRNaWxsaXM6IGVsYXBzZWQsCiAgICAgICAgICAgIGVsYXBzZWRUaW1lOiB1dGlsLmZvcm1hdEVsYXBzZWQoZWxhcHNlZCksCiAgICAgICAgICAgIHN0YXJ0VGltZTogdXRpbC5kYXRlVGltZUZyb21EYXRlKHN0YXJ0KSwKICAgICAgICAgICAgZW5kVGltZTogIHV0aWwuZGF0ZVRpbWVGcm9tRGF0ZShlbmQpCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKG5hbWUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHBvcHVsYXRvcikgewogICAgICAgICAgICBwb3B1bGF0ZUl0ZXJhYmxlKHRoaXMsIG5hbWUsIHBvcHVsYXRvcik7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvcHVsYXRlSXRlcmFibGUob2JqLCBuYW1lLCBwb3B1bGF0b3IpIHsKICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpICsgJ3MnOwogICAgICAgIG9ialtuYW1lXSA9IGNyZWF0ZUdldEFsbEZ1bmN0aW9uKHBvcHVsYXRvci5udW1iZXJPZkl0ZW1zLCBwb3B1bGF0b3IuY3JlYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZXRBbGxGdW5jdGlvbihudW1iZXJPZkVsZW1lbnRzLCBjcmVhdG9yKSB7CiAgICAgICAgdmFyIGNhY2hlZCA9IG51bGw7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGNhY2hlZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FjaGVkID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bWJlck9mRWxlbWVudHMoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVkLnB1c2goY3JlYXRvcihpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBTdWl0ZTogU3VpdGUsCiAgICAgICAgVGVzdDogVGVzdCwKICAgICAgICBLZXl3b3JkOiBLZXl3b3JkLAogICAgICAgIE1lc3NhZ2U6IE1lc3NhZ2UsCiAgICAgICAgVGltZXM6IFRpbWVzLAogICAgICAgIGNvbnRhaW5zVGFnOiBjb250YWluc1RhZywgIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICAgICAgY29udGFpbnNUYWdQYXR0ZXJuOiBjb250YWluc1RhZ1BhdHRlcm4gIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICB9Owp9KCkpOwp3aW5kb3cuc3RhdHMgPSAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gU3RhdGlzdGljcyh0b3RhbEVsZW1zLCB0YWdFbGVtcywgc3VpdGVFbGVtcykgewogICAgICAgIHJldHVybiB7dG90YWw6IHV0aWwubWFwKHRvdGFsRWxlbXMsIHRvdGFsU3RhdEVsZW0pLAogICAgICAgICAgICAgICAgdGFnOiAgIHV0aWwubWFwKHRhZ0VsZW1zLCB0YWdTdGF0RWxlbSksCiAgICAgICAgICAgICAgICBzdWl0ZTogdXRpbC5tYXAoc3VpdGVFbGVtcywgc3VpdGVTdGF0RWxlbSl9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdEVsZW0oc3RhdCkgewogICAgICAgIHN0YXQudG90YWwgPSBzdGF0LnBhc3MgKyBzdGF0LmZhaWw7CiAgICAgICAgdmFyIHBlcmNlbnRzID0gY2FsY3VsYXRlUGVyY2VudHMoc3RhdC50b3RhbCwgc3RhdC5wYXNzLCBzdGF0LmZhaWwpOwogICAgICAgIHN0YXQucGFzc1BlcmNlbnQgPSBwZXJjZW50c1swXTsKICAgICAgICBzdGF0LmZhaWxQZXJjZW50ID0gcGVyY2VudHNbMV07CiAgICAgICAgdmFyIHdpZHRocyA9IGNhbGN1bGF0ZVdpZHRocyhzdGF0LnBhc3NQZXJjZW50LCBzdGF0LmZhaWxQZXJjZW50KTsKICAgICAgICBzdGF0LnBhc3NXaWR0aCA9IHdpZHRoc1swXTsKICAgICAgICBzdGF0LmZhaWxXaWR0aCA9IHdpZHRoc1sxXTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHRvdGFsU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC50eXBlID0gc3RhdC5sYWJlbCA9PSAnQ3JpdGljYWwgVGVzdHMnID8gJ2NyaXRpY2FsJyA6ICdhbGwnOwogICAgICAgIHJldHVybiBzdGF0OwogICAgfQogICAgZnVuY3Rpb24gdGFnU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC5saW5rcyA9IHBhcnNlTGlua3Moc3RhdC5saW5rcyk7CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRFbGVtKGRhdGEpIHsKICAgICAgICB2YXIgc3RhdCA9IHN0YXRFbGVtKGRhdGEpOwogICAgICAgIHN0YXQuZnVsbE5hbWUgPSBzdGF0LmxhYmVsOwogICAgICAgIHN0YXQuZm9ybWF0UGFyZW50TmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWwuZm9ybWF0UGFyZW50TmFtZShzdGF0KTsgfTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTGlua3MobGlua3NEYXRhKSB7CiAgICAgICAgaWYgKCFsaW5rc0RhdGEpCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICByZXR1cm4gdXRpbC5tYXAobGlua3NEYXRhLnNwbGl0KCc6OjonKSwgZnVuY3Rpb24gKGxpbmspIHsKICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGxpbmsuaW5kZXhPZignOicpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt0aXRsZTogbGluay5zbGljZSgwLCBpbmRleCksIHVybDogbGluay5zbGljZShpbmRleCsxKX07CiAgICAgICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gY2FsY3VsYXRlUGVyY2VudHModG90YWwsIHBhc3NlZCwgZmFpbGVkKSB7CiAgICAgICAgaWYgKHRvdGFsID09IDApCiAgICAgICAgICAgIHJldHVybiBbMC4wLCAwLjBdOwogICAgICAgIHZhciBwYXNzID0gMTAwLjAgKiBwYXNzZWQgLyB0b3RhbDsKICAgICAgICB2YXIgZmFpbCA9IDEwMC4wICogZmFpbGVkIC8gdG90YWw7CiAgICAgICAgaWYgKHBhc3MgPiAwICYmIHBhc3MgPCAwLjEpCiAgICAgICAgICAgIHJldHVybiBbMC4xLCA5OS45XTsKICAgICAgICBpZiAoZmFpbCA+IDAgJiYgZmFpbCA8IDAuMSkKICAgICAgICAgICAgcmV0dXJuIFs5OS45LCAwLjFdOwogICAgICAgIHJldHVybiBbTWF0aC5yb3VuZChwYXNzKjEwKS8xMCwgTWF0aC5yb3VuZChmYWlsKjEwKS8xMF07CiAgICB9CiAgICBmdW5jdGlvbiBjYWxjdWxhdGVXaWR0aHMobnVtMSwgbnVtMikgewogICAgICAgIGlmIChudW0xICsgbnVtMiA9PSAwKQogICAgICAgICAgICByZXR1cm4gWzAuMCwgMC4wXTsKICAgICAgICAvLyBNYWtlIHNtYWxsIHBlcmNlbnRhZ2VzIGJldHRlciB2aXNpYmxlCiAgICAgICAgaWYgKG51bTEgPiAwICYmIG51bTEgPCAxKQogICAgICAgICAgICByZXR1cm4gWzEuMCwgOTkuMF07CiAgICAgICAgaWYgKG51bTIgPiAwICYmIG51bTIgPCAxKQogICAgICAgICAgICByZXR1cm4gWzk5LjAsIDEuMF07CiAgICAgICAgLy8gSGFuZGxlIHNpdHVhdGlvbiB3aGVyZSBib3RoIGFyZSByb3VuZGVkIHVwCiAgICAgICAgd2hpbGUgKG51bTEgKyBudW0yID4gMTAwKSB7CiAgICAgICAgICAgIGlmIChudW0xID4gbnVtMikKICAgICAgICAgICAgICAgIG51bTEgLT0gMC4xOwogICAgICAgICAgICBpZiAobnVtMiA+IG51bTEpCiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtudW0xLCBudW0yXTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgU3RhdGlzdGljczogU3RhdGlzdGljcwogICAgfTsKfSgpKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LnV0aWwgPSBmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBtYXAoZWxlbXMsIGZ1bmMpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIHJldFtpXSA9IGZ1bmMoZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gZmlsdGVyKGVsZW1zLCBwcmVkaWNhdGUpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbXNbaV0pKQogICAgICAgICAgICAgICAgcmV0LnB1c2goZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gYWxsKGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmICghZWxlbXNbaV0pCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYW55KGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChlbGVtc1tpXSkKICAgICAgICAgICAgICAgIHJldHVybiBlbGVtc1tpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gY29udGFpbnMoZWxlbXMsIGUpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgaWYgKGVsZW1zW2ldID09IGUpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gbGFzdChpdGVtcykgewogICAgICAgIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGgtMV07CiAgICB9CiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyZsdDsvZywgJzwnKS5yZXBsYWNlKC8mZ3Q7L2csICc+JykucmVwbGFjZSgvJmFtcDsvZywgJyYnKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTsKICAgIH0KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnJykucmVwbGFjZSgvXy9nLCAnJyk7CiAgICB9CiAgICBmdW5jdGlvbiByZWdleHBFc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLVtcXXt9KCkrPyouLFxcXiR8I10vZywgIlxcJCYiKTsKICAgIH0KICAgIGZ1bmN0aW9uIE1hdGNoZXIocGF0dGVybikgewogICAgICAgIHBhdHRlcm4gPSByZWdleHBFc2NhcGUobm9ybWFsaXplKHBhdHRlcm4pKTsKICAgICAgICB2YXIgcmVQYXR0ZXJuID0gJ14nICsgcGF0dGVybi5yZXBsYWNlKC9cXFw/L2csICcuJykucmVwbGFjZSgvXFxcKi9nLCAnW1xcc1xcU10qJykgKyAnJCc7CiAgICAgICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAocmVQYXR0ZXJuKTsKICAgICAgICBmdW5jdGlvbiBtYXRjaGVzKHN0cmluZykgewogICAgICAgICAgICByZXR1cm4gcmVnZXhwLnRlc3Qobm9ybWFsaXplKHN0cmluZykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBtYXRjaGVzOiBtYXRjaGVzLAogICAgICAgICAgICBtYXRjaGVzQW55OiBmdW5jdGlvbiAoc3RyaW5ncykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspCiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMoc3RyaW5nc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdFBhcmVudE5hbWUoaXRlbSkgewogICAgICAgIHZhciBwYXJlbnROYW1lID0gaXRlbS5mdWxsTmFtZS5zbGljZSgwLCBpdGVtLmZ1bGxOYW1lLmxlbmd0aCAtIGl0ZW0ubmFtZS5sZW5ndGgpOwogICAgICAgIHJldHVybiBwYXJlbnROYW1lLnJlcGxhY2UoL1wuL2csICcgLiAnKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRpbWVGcm9tRGF0ZShkYXRlKSB7CiAgICAgICAgaWYgKCFkYXRlKQogICAgICAgICAgICByZXR1cm4gJ04vQSc7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlLmdldFNlY29uZHMoKSwgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlRnJvbURhdGUoZGF0ZSkgewogICAgICAgIGlmICghZGF0ZSkKICAgICAgICAgICAgcmV0dXJuICdOL0EnOwogICAgICAgIHJldHVybiBwYWRUbyhkYXRlLmdldEZ1bGxZZWFyKCksIDQpICsKICAgICAgICAgICAgICAgcGFkVG8oZGF0ZS5nZXRNb250aCgpICsgMSwgMikgKwogICAgICAgICAgICAgICBwYWRUbyhkYXRlLmdldERhdGUoKSwgMik7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlVGltZUZyb21EYXRlKGRhdGUpIHsKICAgICAgICBpZiAoIWRhdGUpCiAgICAgICAgICAgIHJldHVybiAnTi9BJzsKICAgICAgICByZXR1cm4gZGF0ZUZyb21EYXRlKGRhdGUpICsgJyAnICsgdGltZUZyb21EYXRlKGRhdGUpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0VGltZShob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzKSB7CiAgICAgICAgcmV0dXJuIHBhZFRvKGhvdXJzLCAyKSArICc6JyArCiAgICAgICAgICAgICAgIHBhZFRvKG1pbnV0ZXMsIDIpICsgJzonICsKICAgICAgICAgICAgICAgcGFkVG8oc2Vjb25kcywgMikgKyAnLicgKwogICAgICAgICAgICAgICBwYWRUbyhtaWxsaXNlY29uZHMsIDMpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0RWxhcHNlZChlbGFwc2VkKSB7CiAgICAgICAgdmFyIG1pbGxpcyA9IGVsYXBzZWQ7CiAgICAgICAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAoNjAgKiA2MCAqIDEwMDApKTsKICAgICAgICBtaWxsaXMgLT0gaG91cnMgKiA2MCAqIDYwICogMTAwMDsKICAgICAgICB2YXIgbWludXRlcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gKDYwICogMTAwMCkpOwogICAgICAgIG1pbGxpcyAtPSBtaW51dGVzICogNjAgKiAxMDAwOwogICAgICAgIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAxMDAwKTsKICAgICAgICBtaWxsaXMgLT0gc2Vjb25kcyAqIDEwMDA7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpcyk7CiAgICB9CiAgICBmdW5jdGlvbiBwYWRUbyhudW1iZXIsIGxlbikgewogICAgICAgIHZhciBudW1TdHJpbmcgPSBudW1iZXIgKyAiIjsKICAgICAgICB3aGlsZSAobnVtU3RyaW5nLmxlbmd0aCA8IGxlbikgbnVtU3RyaW5nID0gIjAiICsgbnVtU3RyaW5nOwogICAgICAgIHJldHVybiBudW1TdHJpbmc7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lc3RhbXAobWlsbGlzKSB7CiAgICAgICAgLy8gdXNlZCBhbHNvIGJ5IHRvb2xzIHRoYXQgZG8gbm90IHNldCB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMKICAgICAgICB2YXIgYmFzZSA9IHdpbmRvdy5vdXRwdXQgPyB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMgOiAwOwogICAgICAgIHJldHVybiBuZXcgRGF0ZShiYXNlICsgbWlsbGlzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZFN0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7CiAgICAgICAgdmFyIGR0ID0gZGF0ZVRpbWVGcm9tRGF0ZShkYXRlKS5zbGljZSgwLCAxNyk7ICAvLyBkcm9wIG1pbGxpcwogICAgICAgIHZhciBvZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgICAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnOwogICAgICAgIHZhciBoaCA9IE1hdGguZmxvb3IoTWF0aC5hYnMob2Zmc2V0KSAvIDYwKTsKICAgICAgICB2YXIgbW0gPSBNYXRoLmFicyhvZmZzZXQpICUgNjA7CiAgICAgICAgcmV0dXJuIGR0ICsgJyBVVEMnICsgc2lnbiArIHBhZFRvKGhoLCAyKSArICc6JyArIHBhZFRvKG1tLCAyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICBmdW5jdGlvbiB0aW1lU3RyaW5nKHRpbWUsIHNob3J0VW5pdCkgewogICAgICAgICAgICB2YXIgdW5pdCA9IHt5OiAneWVhcicsIGQ6ICdkYXknLCBoOiAnaG91cicsIG06ICdtaW51dGUnLAogICAgICAgICAgICAgICAgICAgICAgICBzOiAnc2Vjb25kJ31bc2hvcnRVbml0XTsKICAgICAgICAgICAgdmFyIGVuZCA9IHRpbWUgPT0gMSA/ICcgJyA6ICdzICc7CiAgICAgICAgICAgIHJldHVybiB0aW1lICsgJyAnICsgdW5pdCArIGVuZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY29tcGVuc2F0ZUxlYXBZZWFycyhkYXlzLCB5ZWFycykgewogICAgICAgICAgICAvLyBOb3QgYSBwZXJmZWN0IGFsZ29yaXRobSBidXQgb3VnaHQgdG8gYmUgZW5vdWdoCiAgICAgICAgICAgIHJldHVybiBkYXlzIC0gTWF0aC5mbG9vcih5ZWFycyAvIDQpOwogICAgICAgIH0KICAgICAgICB2YXIgZ2VuZXJhdGVkID0gTWF0aC5yb3VuZCh0aW1lc3RhbXAgLyAxMDAwKTsKICAgICAgICB2YXIgY3VycmVudCA9IE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTsKICAgICAgICB2YXIgZWxhcHNlZCA9IGN1cnJlbnQgLSBnZW5lcmF0ZWQ7CiAgICAgICAgdmFyIHByZWZpeCA9ICcnOwogICAgICAgIGlmIChlbGFwc2VkIDwgMCkgewogICAgICAgICAgICBwcmVmaXggPSAnLSAnOwogICAgICAgICAgICBlbGFwc2VkID0gTWF0aC5hYnMoZWxhcHNlZCk7CiAgICAgICAgfQogICAgICAgIHZhciBzZWNzICA9IGVsYXBzZWQgJSA2MDsKICAgICAgICB2YXIgbWlucyAgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyA2MCkgJSA2MDsKICAgICAgICB2YXIgaG91cnMgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjApKSAlIDI0OwogICAgICAgIHZhciBkYXlzICA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCkpICUgMzY1OwogICAgICAgIHZhciB5ZWFycyA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCozNjUpKTsKICAgICAgICBpZiAoeWVhcnMpIHsKICAgICAgICAgICAgZGF5cyA9IGNvbXBlbnNhdGVMZWFwWWVhcnMoZGF5cywgeWVhcnMpOwogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyh5ZWFycywgJ3knKSArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKTsKICAgICAgICB9IGVsc2UgaWYgKGRheXMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKSArIHRpbWVTdHJpbmcoaG91cnMsICdoJyk7CiAgICAgICAgfSBlbHNlIGlmIChob3VycykgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhob3VycywgJ2gnKSArIHRpbWVTdHJpbmcobWlucywgJ20nKTsKICAgICAgICB9IGVsc2UgaWYgKG1pbnMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcobWlucywgJ20nKSArIHRpbWVTdHJpbmcoc2VjcywgJ3MnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhzZWNzLCAncycpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmcocXVlcnkpIHsKICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgaWYgKCFxdWVyeSkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB2YXIgcGFyYW1zID0gcXVlcnkuc3BsaXQoJyYnKTsKICAgICAgICB2YXIgcGFydHM7CiAgICAgICAgZnVuY3Rpb24gZGVjb2RlKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpdGVtLnJlcGxhY2UoJysnLCAnICcpKTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcmFtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBwYXJ0cyA9IHBhcmFtc1tpXS5zcGxpdCgnPScpOwogICAgICAgICAgICByZXN1bHRbZGVjb2RlKHBhcnRzLnNoaWZ0KCkpXSA9IGRlY29kZShwYXJ0cy5qb2luKCc9JykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBtYXA6IG1hcCwKICAgICAgICBmaWx0ZXI6IGZpbHRlciwKICAgICAgICBhbGw6IGFsbCwKICAgICAgICBhbnk6IGFueSwKICAgICAgICBjb250YWluczogY29udGFpbnMsCiAgICAgICAgbGFzdDogbGFzdCwKICAgICAgICBlc2NhcGU6IGVzY2FwZSwKICAgICAgICB1bmVzY2FwZTogdW5lc2NhcGUsCiAgICAgICAgbm9ybWFsaXplOiBub3JtYWxpemUsCiAgICAgICAgcmVnZXhwRXNjYXBlOiByZWdleHBFc2NhcGUsCiAgICAgICAgTWF0Y2hlcjogTWF0Y2hlciwKICAgICAgICBmb3JtYXRQYXJlbnROYW1lOiBmb3JtYXRQYXJlbnROYW1lLAogICAgICAgIHRpbWVGcm9tRGF0ZTogdGltZUZyb21EYXRlLAogICAgICAgIGRhdGVGcm9tRGF0ZTogZGF0ZUZyb21EYXRlLAogICAgICAgIGRhdGVUaW1lRnJvbURhdGU6IGRhdGVUaW1lRnJvbURhdGUsCiAgICAgICAgZm9ybWF0RWxhcHNlZDogZm9ybWF0RWxhcHNlZCwKICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRTdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZFN0cmluZywKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZywKICAgICAgICBwYXJzZVF1ZXJ5U3RyaW5nOiBwYXJzZVF1ZXJ5U3RyaW5nCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy50ZXN0ZGF0YSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBlbGVtZW50c0J5SWQgPSB7fTsKICAgIHZhciBpZENvdW50ZXIgPSAwOwogICAgdmFyIF9zdGF0aXN0aWNzID0gbnVsbDsKICAgIHZhciBMRVZFTFMgPSBbJ1RSQUNFJywgJ0RFQlVHJywgJ0lORk8nLCAnV0FSTicsICdFUlJPUicsICdGQUlMJ107CiAgICB2YXIgU1RBVFVTRVMgPSBbJ0ZBSUwnLCAnUEFTUycsICdOT1RfUlVOJ107CiAgICB2YXIgS0VZV09SRFMgPSBbJ0tFWVdPUkQnLCAnU0VUVVAnLCAnVEVBUkRPV04nLCAnRk9SJywgJ1ZBUiddOwogICAgZnVuY3Rpb24gYWRkRWxlbWVudChlbGVtKSB7CiAgICAgICAgaWYgKCFlbGVtLmlkKQogICAgICAgICAgICBlbGVtLmlkID0gdW5pcXVlSWQoKTsKICAgICAgICBlbGVtZW50c0J5SWRbZWxlbS5pZF0gPSBlbGVtOwogICAgICAgIHJldHVybiBlbGVtOwogICAgfQogICAgZnVuY3Rpb24gdW5pcXVlSWQoKSB7CiAgICAgICAgaWRDb3VudGVyKys7CiAgICAgICAgcmV0dXJuICdlbGVtZW50LWlkLScgKyBpZENvdW50ZXI7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lcyhzdGF0cykgewogICAgICAgIHZhciBzdGFydE1pbGxpcyA9IHN0YXRzWzFdOwogICAgICAgIHZhciBlbGFwc2VkID0gc3RhdHNbMl07CiAgICAgICAgaWYgKHN0YXJ0TWlsbGlzID09PSBudWxsKQogICAgICAgICAgICByZXR1cm4gW251bGwsIG51bGwsIGVsYXBzZWRdOwogICAgICAgIHJldHVybiBbdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMpLAogICAgICAgICAgICAgICAgdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMgKyBlbGFwc2VkKSwKICAgICAgICAgICAgICAgIGVsYXBzZWRdOwogICAgfQogICAgZnVuY3Rpb24gbWVzc2FnZShlbGVtZW50LCBzdHJpbmdzKSB7CiAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQobW9kZWwuTWVzc2FnZShMRVZFTFNbZWxlbWVudFsxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnRpbWVzdGFtcChlbGVtZW50WzBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncy5nZXQoZWxlbWVudFszXSkpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlU3RhdHVzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIFNUQVRVU0VTW3N0YXRzWzBdXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoaWxkQ3JlYXRvcihwYXJlbnQsIGNoaWxkVHlwZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoZWxlbSwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQoY2hpbGRUeXBlKHBhcmVudCwgZWxlbSwgc3RyaW5ncywgaW5kZXgpKTsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlS2V5d29yZChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIGt3ID0gbW9kZWwuS2V5d29yZCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICB0eXBlOiBLRVlXT1JEU1tlbGVtZW50WzBdXSwKICAgICAgICAgICAgaWQ6ICdrJyArIChpbmRleCArIDEpLAogICAgICAgICAgICBuYW1lOiBzdHJpbmdzLmdldChlbGVtZW50WzFdKSwKICAgICAgICAgICAgbGlibmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFsyXSksCiAgICAgICAgICAgIHRpbWVvdXQ6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pLAogICAgICAgICAgICBhcmdzOiBzdHJpbmdzLmdldChlbGVtZW50WzVdKSwKICAgICAgICAgICAgYXNzaWduOiBzdHJpbmdzLmdldChlbGVtZW50WzZdKSwKICAgICAgICAgICAgdGFnczogc3RyaW5ncy5nZXQoZWxlbWVudFs3XSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbNF0pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzdGF0dXM6IHBhcnNlU3RhdHVzKGVsZW1lbnRbOF0sIHN0cmluZ3MpLAogICAgICAgICAgICB0aW1lczogbW9kZWwuVGltZXModGltZXMoZWxlbWVudFs4XSkpLAogICAgICAgICAgICBpc0NoaWxkcmVuTG9hZGVkOiB0eXBlb2YoZWxlbWVudFs5XSkgIT09ICdudW1iZXInCiAgICAgICAgfSk7CiAgICAgICAgbGF6eVBvcHVsYXRlS2V5d29yZHNGcm9tRmlsZShrdywgZWxlbWVudFs5XSwgc3RyaW5ncyk7CiAgICAgICAga3cucG9wdWxhdGVNZXNzYWdlcyhQb3B1bGF0b3IoZWxlbWVudFsxMF0sIHN0cmluZ3MsIG1lc3NhZ2UpKTsKICAgICAgICByZXR1cm4ga3c7CiAgICB9CiAgICBmdW5jdGlvbiBsYXp5UG9wdWxhdGVLZXl3b3Jkc0Zyb21GaWxlKHBhcmVudCwgbW9kZWxPckluZGV4LCBzdHJpbmdzKSB7CiAgICAgICAgdmFyIG1vZGVsLCBpbmRleCwgcG9wdWxhdG9yOwogICAgICAgIHZhciBjcmVhdG9yID0gY2hpbGRDcmVhdG9yKHBhcmVudCwgY3JlYXRlS2V5d29yZCk7CiAgICAgICAgaWYgKHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkKSB7CiAgICAgICAgICAgIG1vZGVsID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwb3B1bGF0b3IgPSBQb3B1bGF0b3IobW9kZWwsIHN0cmluZ3MsIGNyZWF0b3IpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluZGV4ID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwYXJlbnQuY2hpbGRGaWxlTmFtZSA9IHdpbmRvdy5zZXR0aW5nc1snc3BsaXRMb2dCYXNlJ10gKyAnLScgKyBpbmRleCArICcuanMnOwogICAgICAgICAgICBwb3B1bGF0b3IgPSBTcGxpdExvZ1BvcHVsYXRvcihpbmRleCwgY3JlYXRvcik7CiAgICAgICAgfQogICAgICAgIHBhcmVudC5wb3B1bGF0ZUtleXdvcmRzKHBvcHVsYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiB0YWdzKHRhZ2xpc3QsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gdXRpbC5tYXAodGFnbGlzdCwgc3RyaW5ncy5nZXQpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlVGVzdChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1c0VsZW1lbnQgPSBlbGVtZW50WzVdOwogICAgICAgIHZhciB0ZXN0ID0gbW9kZWwuVGVzdCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICBpZDogJ3QnICsgKGluZGV4ICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzNdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZW91dDogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIGlzQ3JpdGljYWw6IGVsZW1lbnRbMl0sCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoc3RhdHVzRWxlbWVudCksCiAgICAgICAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBtc2cgPSBjcmVhdGVNZXNzYWdlKHN0YXR1c0VsZW1lbnQsIHN0cmluZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbXNnOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKHN0YXR1c0VsZW1lbnQpKSwKICAgICAgICAgICAgdGFnczogdGFncyhlbGVtZW50WzRdLCBzdHJpbmdzKSwKICAgICAgICAgICAgaXNDaGlsZHJlbkxvYWRlZDogdHlwZW9mKGVsZW1lbnRbNl0pICE9PSAnbnVtYmVyJwogICAgICAgIH0pOwogICAgICAgIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUodGVzdCwgZWxlbWVudFs2XSwgc3RyaW5ncyk7CiAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNZXNzYWdlKHN0YXR1c0VsZW1lbnQsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gc3RhdHVzRWxlbWVudC5sZW5ndGggPT0gNCA/IHN0cmluZ3MuZ2V0KHN0YXR1c0VsZW1lbnRbM10pIDogJyc7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVTdWl0ZShwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1c0VsZW1lbnQgPSBlbGVtZW50WzVdOwogICAgICAgIHZhciBzdWl0ZSA9IG1vZGVsLlN1aXRlKHsKICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgICAgIGlkOiAncycgKyAoKGluZGV4IHx8IDApICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBzb3VyY2U6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMV0pLAogICAgICAgICAgICByZWxhdGl2ZVNvdXJjZTogc3RyaW5ncy5nZXQoZWxlbWVudFsyXSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzdGF0dXM6IHBhcnNlU3RhdHVzKHN0YXR1c0VsZW1lbnQpLAogICAgICAgICAgICBtZXNzYWdlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbXNnID0gY3JlYXRlTWVzc2FnZShzdGF0dXNFbGVtZW50LCBzdHJpbmdzKTsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1zZzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhzdGF0dXNFbGVtZW50KSksCiAgICAgICAgICAgIHN0YXRpc3RpY3M6IHN1aXRlU3RhdHModXRpbC5sYXN0KGVsZW1lbnQpKSwKICAgICAgICAgICAgbWV0YWRhdGE6IHBhcnNlTWV0YWRhdGEoZWxlbWVudFs0XSwgc3RyaW5ncykKICAgICAgICB9KTsKICAgICAgICBzdWl0ZS5wb3B1bGF0ZUtleXdvcmRzKFBvcHVsYXRvcihlbGVtZW50WzhdLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZUtleXdvcmQpKSk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyhQb3B1bGF0b3IoZWxlbWVudFs3XSwgc3RyaW5ncywgY2hpbGRDcmVhdG9yKHN1aXRlLCBjcmVhdGVUZXN0KSkpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlU3VpdGVzKFBvcHVsYXRvcihlbGVtZW50WzZdLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZVN1aXRlKSkpOwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTWV0YWRhdGEoZGF0YSwgc3RyaW5ncykgewogICAgICAgIHZhciBtZXRhZGF0YSA9IFtdOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxkYXRhLmxlbmd0aDsgaSs9MikgewogICAgICAgICAgICBtZXRhZGF0YS5wdXNoKFtzdHJpbmdzLmdldChkYXRhW2ldKSwgc3RyaW5ncy5nZXQoZGF0YVtpKzFdKV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWV0YWRhdGE7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG90YWw6IHN0YXRzWzBdLAogICAgICAgICAgICB0b3RhbFBhc3NlZDogc3RhdHNbMV0sCiAgICAgICAgICAgIHRvdGFsRmFpbGVkOiBzdGF0c1swXSAtIHN0YXRzWzFdLAogICAgICAgICAgICBjcml0aWNhbDogc3RhdHNbMl0sCiAgICAgICAgICAgIGNyaXRpY2FsUGFzc2VkOiBzdGF0c1szXSwKICAgICAgICAgICAgY3JpdGljYWxGYWlsZWQ6IHN0YXRzWzJdIC0gc3RhdHNbM10KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gUG9wdWxhdG9yKGl0ZW1zLCBzdHJpbmdzLCBjcmVhdG9yKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbnVtYmVyT2ZJdGVtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY3JlYXRvcjogZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRvcihpdGVtc1tpbmRleF0sIHN0cmluZ3MsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBTcGxpdExvZ1BvcHVsYXRvcihzdHJ1Y3R1cmVJbmRleCwgY3JlYXRvcikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG51bWJlck9mSXRlbXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3dbJ2tleXdvcmRzJytzdHJ1Y3R1cmVJbmRleF0ubGVuZ3RoOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjcmVhdG9yOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdG9yKHdpbmRvd1sna2V5d29yZHMnK3N0cnVjdHVyZUluZGV4XVtpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3dbJ3N0cmluZ3MnK3N0cnVjdHVyZUluZGV4XSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3VpdGUoKSB7CiAgICAgICAgdmFyIGVsZW0gPSB3aW5kb3cub3V0cHV0LnN1aXRlOwogICAgICAgIGlmIChlbGVtZW50c0J5SWRbZWxlbS5pZF0pCiAgICAgICAgICAgIHJldHVybiBlbGVtOwogICAgICAgIHZhciByb290ID0gYWRkRWxlbWVudChjcmVhdGVTdWl0ZShudWxsLCBlbGVtLCBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKSk7CiAgICAgICAgd2luZG93Lm91dHB1dC5zdWl0ZSA9IHJvb3Q7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kTG9hZGVkKGlkKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnRzQnlJZFtpZF07CiAgICB9CiAgICBmdW5jdGlvbiBlbnN1cmVMb2FkZWQoaWQsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGlkcyA9IGlkLnNwbGl0KCctJyk7CiAgICAgICAgdmFyIHJvb3QgPSBzdWl0ZSgpOwogICAgICAgIGlkcy5zaGlmdCgpOwogICAgICAgIGxvYWRJdGVtcyhpZHMsIHJvb3QsIFtyb290LmlkXSwgY2FsbGJhY2spOwogICAgfQogICAgZnVuY3Rpb24gbG9hZEl0ZW1zKGlkcywgY3VycmVudCwgcmVzdWx0LCBjYWxsYmFjaykgewogICAgICAgIGlmICghaWRzLmxlbmd0aCkgewogICAgICAgICAgICBjYWxsYmFjayhyZXN1bHQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQuY2FsbFdoZW5DaGlsZHJlblJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGlkID0gaWRzLnNoaWZ0KCk7CiAgICAgICAgICAgIHZhciB0eXBlID0gaWRbMF07CiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGlkLnN1YnN0cmluZygxKSkgLSAxOwogICAgICAgICAgICB2YXIgaXRlbSA9IHNlbGVjdEZyb20oY3VycmVudCwgdHlwZSwgaW5kZXgpOwogICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0uaWQpOwogICAgICAgICAgICBlbHNlICAgIC8vIEludmFsaWQgaWQuIFNob3VsZCB0aGlzIGJlIHJlcG9ydGVkIHNvbWV3aGVyZT8KICAgICAgICAgICAgICAgIGlkcyA9IFtdOwogICAgICAgICAgICBsb2FkSXRlbXMoaWRzLCBpdGVtLCByZXN1bHQsIGNhbGxiYWNrKTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlbGVjdEZyb20oZWxlbWVudCwgdHlwZSwgaW5kZXgpIHsKICAgICAgICBpZiAodHlwZSA9PT0gJ2snKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmtleXdvcmRzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3QnKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRlc3RzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnN1aXRlcygpW2luZGV4XTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBlcnJvckl0ZXJhdG9yKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlKHdpbmRvdy5vdXRwdXQuZXJyb3JzLnNoaWZ0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaGFzTmV4dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5vdXRwdXQuZXJyb3JzLmxlbmd0aCA+IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdGlzdGljcygpIHsKICAgICAgICBpZiAoIV9zdGF0aXN0aWNzKSB7CiAgICAgICAgICAgIHZhciBzdGF0RGF0YSA9IHdpbmRvdy5vdXRwdXQuc3RhdHM7CiAgICAgICAgICAgIF9zdGF0aXN0aWNzID0gc3RhdHMuU3RhdGlzdGljcyhzdGF0RGF0YVswXSwgc3RhdERhdGFbMV0sIHN0YXREYXRhWzJdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9zdGF0aXN0aWNzOwogICAgfQogICAgZnVuY3Rpb24gU3RyaW5nU3RvcmUoc3RyaW5ncykgewogICAgICAgIGZ1bmN0aW9uIGdldFRleHQoaWQpIHsKICAgICAgICAgICAgdmFyIHRleHQgPSBzdHJpbmdzW2lkXTsKICAgICAgICAgICAgaWYgKCF0ZXh0KQogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICBpZiAodGV4dFswXSA9PSAnKicpCiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgIHZhciBleHRyYWN0ZWQgPSBleHRyYWN0KHRleHQpOwogICAgICAgICAgICBzdHJpbmdzW2lkXSA9ICcqJyArIGV4dHJhY3RlZDsKICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RlZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZXh0cmFjdCh0ZXh0KSB7CiAgICAgICAgICAgIHZhciBkZWNvZGVkID0gSlhHLlV0aWwuQmFzZTY0LmRlY29kZUFzQXJyYXkodGV4dCk7CiAgICAgICAgICAgIHZhciBleHRyYWN0ZWQgPSAobmV3IEpYRy5VdGlsLlVuemlwKGRlY29kZWQpKS51bnppcCgpWzBdWzBdOwogICAgICAgICAgICByZXR1cm4gSlhHLlV0aWwuVVRGOC5kZWNvZGUoZXh0cmFjdGVkKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZ2V0KGlkKSB7CiAgICAgICAgICAgIGlmIChpZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIHJldHVybiBnZXRUZXh0KGlkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHtnZXQ6IGdldH07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIHN1aXRlOiBzdWl0ZSwKICAgICAgICBlcnJvckl0ZXJhdG9yOiBlcnJvckl0ZXJhdG9yLAogICAgICAgIGZpbmRMb2FkZWQ6IGZpbmRMb2FkZWQsCiAgICAgICAgZW5zdXJlTG9hZGVkOiBlbnN1cmVMb2FkZWQsCiAgICAgICAgc3RhdGlzdGljczogc3RhdGlzdGljcywKICAgICAgICBTdHJpbmdTdG9yZTogU3RyaW5nU3RvcmUsICAvLyBleHBvc2VkIGZvciB0ZXN0cwogICAgICAgIExFVkVMUzogTEVWRUxTCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmZ1bmN0aW9uIHJlbW92ZUphdmFTY3JpcHREaXNhYmxlZFdhcm5pbmcoKSB7CiAgICAvLyBOb3QgdXNpbmcgalF1ZXJ5IGhlcmUgZm9yIG1heGltdW0gc3BlZWQKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqYXZhc2NyaXB0LWRpc2FibGVkJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKfQpmdW5jdGlvbiBhZGRKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKGVycm9yKSB7CiAgICBpZiAod2luZG93LmNvbnNvbGUpCiAgICAgICAgY29uc29sZS5lcnJvcignT3BlbmluZyBmYWlsZWQ6ICcgKyBlcnJvci5uYW1lICsgJzogJyArIGVycm9yLm1lc3NhZ2UpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2phdmFzY3JpcHQtZGlzYWJsZWQnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKfQpmdW5jdGlvbiBpbml0TGF5b3V0KHN1aXRlTmFtZSwgdHlwZSkgewogICAgcGFyc2VUZW1wbGF0ZXMoKTsKICAgIHNldFRpdGxlKHN1aXRlTmFtZSwgdHlwZSk7CiAgICBhZGRIZWFkZXIoKTsKICAgIGFkZFJlcG9ydE9yTG9nTGluayh0eXBlKTsKfQpmdW5jdGlvbiBwYXJzZVRlbXBsYXRlcygpIHsKICAgICQoJ3NjcmlwdFt0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiXScpLm1hcChmdW5jdGlvbiAoaWR4LCBlbGVtKSB7CiAgICAgICAgJC50ZW1wbGF0ZShlbGVtLmlkLCBlbGVtLnRleHQpOwogICAgfSk7Cn0KZnVuY3Rpb24gdGVzdE9yVGFzayh0ZXh0KSB7CiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC97KC4qKX0vLCBmdW5jdGlvbiAobWF0Y2gsIGdyb3VwLCBvZmZzZXQsIHN0cmluZykgewogICAgICAgIGlmICghd2luZG93LnNldHRpbmdzLnJwYSkKICAgICAgICAgICAgcmV0dXJuIGdyb3VwOwogICAgICAgIHJldHVybiB7J1RFU1QnOiAnVEFTSycsICdUZXN0JzogJ1Rhc2snLCAndGVzdCc6ICd0YXNrJ31bZ3JvdXBdOwogICAgfSk7Cn0KZnVuY3Rpb24gc2V0VGl0bGUoc3VpdGVOYW1lLCB0eXBlKSB7CiAgICB2YXIgZ2l2ZW5UaXRsZSA9IHdpbmRvdy5zZXR0aW5ncy50aXRsZTsKICAgIHZhciB0aXRsZSA9IGdpdmVuVGl0bGUgPyBnaXZlblRpdGxlIDogc3VpdGVOYW1lICsgIiAiICsgdHlwZTsKICAgIGRvY3VtZW50LnRpdGxlID0gdXRpbC51bmVzY2FwZSh0aXRsZSk7Cn0KZnVuY3Rpb24gYWRkSGVhZGVyKCkgewogICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwudGltZXN0YW1wKHdpbmRvdy5vdXRwdXQuZ2VuZXJhdGVkKTsKICAgICQudG1wbCgnPGgxPiR7dGl0bGV9PC9oMT4nICsKICAgICAgICAgICAnPGRpdiBpZD0iZ2VuZXJhdGVkIj4nICsKICAgICAgICAgICAgICc8c3Bhbj5HZW5lcmF0ZWQ8YnI+JHtnZW5lcmF0ZWR9PC9zcGFuPjxicj4nICsKICAgICAgICAgICAgICc8c3BhbiBpZD0iZ2VuZXJhdGVkLWFnbyI+JHthZ299IGFnbzwvc3Bhbj4nICsKICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgJzxkaXYgaWQ9InRvcC1yaWdodC1oZWFkZXIiPicgKwogICAgICAgICAgICAgJzxkaXYgaWQ9InJlcG9ydC1vci1sb2ctbGluayI+PGEgaHJlZj0iIyI+PC9hPjwvZGl2PicgKwogICAgICAgICAgICc8L2Rpdj4nLCB7CiAgICAgICAgZ2VuZXJhdGVkOiB1dGlsLmNyZWF0ZUdlbmVyYXRlZFN0cmluZyhnZW5lcmF0ZWQpLAogICAgICAgIGFnbzogdXRpbC5jcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmcoZ2VuZXJhdGVkKSwKICAgICAgICB0aXRsZTogZG9jdW1lbnQudGl0bGUKICAgIH0pLmFwcGVuZFRvKCQoJyNoZWFkZXInKSk7Cn0KZnVuY3Rpb24gYWRkUmVwb3J0T3JMb2dMaW5rKG15VHlwZSkgewogICAgdmFyIHVybDsKICAgIHZhciB0ZXh0OwogICAgdmFyIGNvbnRhaW5lciA9ICQoJyNyZXBvcnQtb3ItbG9nLWxpbmsnKTsKICAgIGlmIChteVR5cGUgPT0gJ1JlcG9ydCcpIHsKICAgICAgICB1cmwgPSB3aW5kb3cuc2V0dGluZ3MubG9nVVJMOwogICAgICAgIHRleHQgPSAnTE9HJzsKICAgIH0gZWxzZSB7CiAgICAgICAgdXJsID0gd2luZG93LnNldHRpbmdzLnJlcG9ydFVSTDsKICAgICAgICB0ZXh0ID0gJ1JFUE9SVCc7CiAgICB9CiAgICBpZiAodXJsKSB7CiAgICAgICAgY29udGFpbmVyLmZpbmQoJ2EnKS5hdHRyKCdocmVmJywgdXJsKTsKICAgICAgICBjb250YWluZXIuZmluZCgnYScpLnRleHQodGV4dCk7CiAgICB9IGVsc2UgewogICAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTsKICAgIH0KfQpmdW5jdGlvbiBhZGRTdGF0aXN0aWNzKCkgewogICAgdmFyIHN0YXRIZWFkZXJzID0KICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+VG90YWw8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5QYXNzPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+RmFpbDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPkVsYXBzZWQ8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+UGFzcyAvIEZhaWw8L3RoPic7CiAgICB2YXIgc3RhdFRhYmxlID0KICAgICAgICAnPGgyPntUZXN0fSBTdGF0aXN0aWNzPC9oMj4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0idG90YWwtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlRvdGFsIFN0YXRpc3RpY3M8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPicgKwogICAgICAgICc8dGFibGUgY2xhc3M9InN0YXRpc3RpY3MiIGlkPSJ0YWctc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgVGFnPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0ic3VpdGUtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgU3VpdGU8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPic7CiAgICAkKHRlc3RPclRhc2soc3RhdFRhYmxlKSkuYXBwZW5kVG8oJyNzdGF0aXN0aWNzLWNvbnRhaW5lcicpOwogICAgdXRpbC5tYXAoWyd0b3RhbCcsICd0YWcnLCAnc3VpdGUnXSwgYWRkU3RhdFRhYmxlKTsKICAgIGFkZFRvb2x0aXBzVG9FbGFwc2VkVGltZXMoKTsKICAgIGVuYWJsZVN0YXRpc3RpY3NTb3J0ZXIoKTsKfQpmdW5jdGlvbiBhZGRUb29sdGlwc1RvRWxhcHNlZFRpbWVzKCkgewogICAgJCgnLnN0YXRzLWNvbC1lbGFwc2VkJykuYXR0cigndGl0bGUnLAogICAgICAgIHRlc3RPclRhc2soJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZXNlIHt0ZXN0fXMuICcpICsKICAgICAgICAnRXhjbHVkZXMgc3VpdGUgc2V0dXBzIGFuZCB0ZWFyZG93bnMuJyk7CiAgICAkKCcjc3VpdGUtc3RhdHMnKS5maW5kKCcuc3RhdHMtY29sLWVsYXBzZWQnKS5hdHRyKCd0aXRsZScsCiAgICAgICAgJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoaXMgc3VpdGUuJyk7Cn0KZnVuY3Rpb24gZW5hYmxlU3RhdGlzdGljc1NvcnRlcigpIHsKICAgICQudGFibGVzb3J0ZXIuYWRkUGFyc2VyKHsKICAgICAgICBpZDogJ3N0YXROYW1lJywKICAgICAgICB0eXBlOiAnbnVtZXJpYycsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZywgdGFibGUsIGNlbGwsIGNlbGxJbmRleCkgewogICAgICAgICAgICAvLyBSb3dzIGhhdmUgY2xhc3MgaW4gZm9ybWF0ICdyb3ctPGluZGV4PicuCiAgICAgICAgICAgIHZhciBpbmRleCA9ICQoY2VsbCkucGFyZW50KCkuYXR0cignY2xhc3MnKS5zdWJzdHJpbmcoNCk7CiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbmRleCk7CiAgICAgICAgfQogICAgfSk7CiAgICAkKCIuc3RhdGlzdGljcyIpLnRhYmxlc29ydGVyKHsKICAgICAgICBzb3J0SW5pdGlhbE9yZGVyOiAnZGVzYycsCiAgICAgICAgaGVhZGVyczogezA6IHtzb3J0ZXI6J3N0YXROYW1lJywgc29ydEluaXRpYWxPcmRlcjogJ2FzYyd9LAogICAgICAgICAgICAgICAgICA1OiB7c29ydGVyOiBmYWxzZX19CiAgICB9KTsKfQpmdW5jdGlvbiBhZGRTdGF0VGFibGUodGFibGVOYW1lKSB7CiAgICB2YXIgc3RhdHMgPSB3aW5kb3cudGVzdGRhdGEuc3RhdGlzdGljcygpW3RhYmxlTmFtZV07CiAgICBpZiAodGFibGVOYW1lID09ICd0YWcnICYmIHN0YXRzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgcmVuZGVyTm9UYWdTdGF0VGFibGUoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmVuZGVyU3RhdFRhYmxlKHRhYmxlTmFtZSwgc3RhdHMpOwogICAgfQp9CmZ1bmN0aW9uIHJlbmRlck5vVGFnU3RhdFRhYmxlKCkgewogICAgJCgnPHRib2R5Pjx0ciBjbGFzcz0icm93LTAiPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5ObyBUYWdzPC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZWxhcHNlZCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZ3JhcGgiPicgKwogICAgICAgICAgJzxkaXYgY2xhc3M9ImVtcHR5LWdyYXBoIj48L2Rpdj4nICsKICAgICAgICAnPC90ZD4nICsKICAgICAgJzwvdHI+PC90Ym9keT4nKS5hcHBlbmRUbygnI3RhZy1zdGF0cycpOwp9CmZ1bmN0aW9uIHJlbmRlclN0YXRUYWJsZSh0YWJsZU5hbWUsIHN0YXRzKSB7CiAgICB2YXIgdGVtcGxhdGUgPSB0YWJsZU5hbWUgKyAnU3RhdGlzdGljc1Jvd1RlbXBsYXRlJzsKICAgIHZhciB0Ym9keSA9ICQoJzx0Ym9keT48L3Rib2R5PicpOwogICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0YXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgJC50bXBsKHRlbXBsYXRlLCBzdGF0c1tpXSwge2luZGV4OiBpfSkuYXBwZW5kVG8odGJvZHkpOwogICAgfQogICAgdGJvZHkuYXBwZW5kVG8oJyMnICsgdGFibGVOYW1lICsgJy1zdGF0cycpOwp9CiQudGVtcGxhdGUoJ3N0YXRDb2x1bW5zVGVtcGxhdGUnLAogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7dG90YWx9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke3Bhc3N9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke2ZhaWx9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1lbGFwc2VkIj4ke2VsYXBzZWR9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+JyArCiAgICAgICd7e2lmIHRvdGFsfX0nICsKICAgICAgJzxkaXYgY2xhc3M9ImdyYXBoIj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0icGFzcy1iYXIiIHN0eWxlPSJ3aWR0aDogJHtwYXNzV2lkdGh9JSIgdGl0bGU9IiR7cGFzc1BlcmNlbnR9JSI+PC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9ImZhaWwtYmFyIiBzdHlsZT0id2lkdGg6ICR7ZmFpbFdpZHRofSUiIHRpdGxlPSIke2ZhaWxQZXJjZW50fSUiPjwvZGl2PicgKwogICAgICAnPC9kaXY+JyArCiAgICAgICd7e2Vsc2V9fScgKwogICAgICAnPGRpdiBjbGFzcz0iZW1wdHktZ3JhcGgiPjwvZGl2PicgKwogICAgICAne3svaWZ9fScgKwogICAgJzwvdGQ+JwopOwokLnRlbXBsYXRlKCdzdWl0ZVN0YXR1c01lc3NhZ2VUZW1wbGF0ZScsCiAgICAnJHtjcml0aWNhbH0gY3JpdGljYWwge3s9IHRlc3RPclRhc2soInt0ZXN0fSIpfX0sICcgKwogICAgJyR7Y3JpdGljYWxQYXNzZWR9IHBhc3NlZCwgJyArCiAgICAnPHNwYW4gY2xhc3M9Int7aWYgY3JpdGljYWxGYWlsZWR9fWZhaWx7e2Vsc2V9fXBhc3N7ey9pZn19Ij4ke2NyaXRpY2FsRmFpbGVkfSBmYWlsZWQ8L3NwYW4+PGJyPicgKwogICAgJyR7dG90YWx9IHt7PSB0ZXN0T3JUYXNrKCJ7dGVzdH0iKX19IHRvdGFsLCAnICsKICAgICcke3RvdGFsUGFzc2VkfSBwYXNzZWQsICcgKwogICAgJzxzcGFuIGNsYXNzPSJ7e2lmIHRvdGFsRmFpbGVkfX1mYWlse3tlbHNlfX1wYXNze3svaWZ9fSI+JHt0b3RhbEZhaWxlZH0gZmFpbGVkPC9zcGFuPicKKTsKLy8gRm9yIGNvbXBsZXRlIGNyb3NzLWJyb3dzZXIgZXhwZXJpZW5jZS4uCi8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX29yZGVyLmh0bWwKZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGV2ZW50KSB7CiAgICB2YXIgZXZlbnQgPSBldmVudCB8fCB3aW5kb3cuZXZlbnQ7CiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKfQo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0ID0ge307Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN1aXRlIl0gPSBbMSwyLDMsMCxbXSxbMCwwLDU2NjBdLFtdLFtbNCwwLDEsMCxbXSxbMCwxMTEsNTA1MSw1XSxbWzAsNiwwLDAsMCw3LDAsMCxbMSwxMTIsNDg4NF0sW1swLDgsOSwwLDEwLDExLDAsMCxbMSwxMTMsNDgxOV0sW10sW1sxMTQsMiwxMl1dXSxbMCwxMyw5LDAsMTQsMTUsMCwwLFsxLDQ5MzMsNjNdLFtdLFtdXV0sW11dLFswLDE2LDksMCwxNywxOCwwLDAsWzAsNDk5NywxNjVdLFtbMCwxOSw5LDAsMjAsMCwwLDAsWzEsNTA4Myw3N10sW10sW1s1MTYwLDIsMjFdXV1dLFtbNTE2MSw1LDVdXV1dXV0sW1syLDIyLDksMCwyMywwLDAsMCxbMSw1MTY1LDQ5NF0sW10sW11dXSxbMSwwLDEsMF1dOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJzdHJpbmdzIl0gPSBbXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3RyaW5ncyJdID0gd2luZG93Lm91dHB1dFsic3RyaW5ncyJdLmNvbmNhdChbIioiLCIqSnVweXRlciIsIiovaG9tZS9kYXRha3VycmUvV29yay9yb2JvdGtlcm5lbC9leGFtcGxlcyIsIiouLi8uLi8uLi8uLi9ob21lL2RhdGFrdXJyZS9Xb3JrL3JvYm90a2VybmVsL2V4YW1wbGVzIiwiKkRlbW9uc3RyYXRlIGZhaWxpbmcgdGVzdCIsIipQYWdlIHNob3VsZCBoYXZlIGNvbnRhaW5lZCB0ZXh0ICdIZWxsbyBXb3JsZCEnIGJ1dCBkaWQgbm90LiIsIipPcGVuIHVybCIsIio8YSBocmVmPVwiaHR0cHM6Ly9wbG9uZS5vcmdcIj5odHRwczovL3Bsb25lLm9yZ1x4M2MvYT4iLCIqT3BlbiBCcm93c2VyIiwiKlNlbGVuaXVtTGlicmFyeSIsIio8cD5PcGVucyBhIG5ldyBicm93c2VyIGluc3RhbmNlIHRvIHRoZSBnaXZlbiA8Y29kZT51cmxceDNjL2NvZGU+Llx4M2MvcD4iLCIqJHt1cmx9LCBicm93c2VyPWhlYWRsZXNzZmlyZWZveCIsIipPcGVuaW5nIGJyb3dzZXIgJ2hlYWRsZXNzZmlyZWZveCcgdG8gYmFzZSB1cmwgJzxhIGhyZWY9XCJodHRwczovL3Bsb25lLm9yZ1wiPmh0dHBzOi8vcGxvbmUub3JnXHgzYy9hPicuIiwiKlNldCBXaW5kb3cgU2l6ZSIsIio8cD5TZXRzIGN1cnJlbnQgd2luZG93cyBzaXplIHRvIGdpdmVuIDxjb2RlPndpZHRoXHgzYy9jb2RlPiBhbmQgPGNvZGU+aGVpZ2h0XHgzYy9jb2RlPi5ceDNjL3A+IiwiKjgwMCwgNjAwIiwiKlBhZ2UgU2hvdWxkIENvbnRhaW4iLCIqPHA+VmVyaWZpZXMgdGhhdCBjdXJyZW50IHBhZ2UgY29udGFpbnMgPGNvZGU+dGV4dFx4M2MvY29kZT4uXHgzYy9wPiIsIipIZWxsbyBXb3JsZCEiLCIqQ2FwdHVyZSBQYWdlIFNjcmVlbnNob3QiLCIqPHA+VGFrZXMgc2NyZWVuc2hvdCBvZiB0aGUgY3VycmVudCBwYWdlIGFuZCBlbWJlZHMgaXQgaW50byBsb2cgZmlsZS5ceDNjL3A+IiwiKlx4M2MvdGQ+XHgzYy90cj48dHI+PHRkIGNvbHNwYW49XCIzXCI+PGE+PGltZyBzcmM9XCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQXhZQUFBSU9DQVlBQUFBbFRKdmxBQUFnQUVsRVFWUjRuT3pkYjNBVTE1M28vYnp6UzkvTm0yanZQaFhkTnc2M0tnbTV6dU9DVGVVcVRybGduVkIyeFJSYlZwNW9nd21HY2lLbmJGUU9TMHh1c1lvRERndFZGdGhCU1ZTMkZEdklqcTNDTWdRdzZGRWtPd0xiR2Z5Z1NBRXNXRXFLQXJKQnhCSElpaVd3cTM1UG41bnVtWjZlN3A3dU9UM1RQZEwzVi9YWmpkRk16K25ULzg2dis1elRuNmo5NUQ4TEFBQUFBT2o0Uk53RkFBQUFBRkQ5U0N3QUFBQUFhQ094QUFBQUFLQ054QUlBQUFDQU5oSUxBQUFBQU5wSUxBQUFBQUJvSTdFQUFBQUFvSTNFQWdBQUFJQTJFZ3NBMWVQdUYyVmtZa0ltVEtORHgrU0ZIOXd2dDJiL05pYS9XbFg0dlZ1KytJZzg4ZUlmWkdSMExQT2R4NzZiK1k1dG1jTjd2aXVmTmY5dHhmWkJZL2xINVh1MWhiK1o5czVldWNmNUcxLzZvYlFkSGpSK1E1WHJEN0xQOWh0QmZuL2luUmZsM3ByYzhqNzdyWmRsVlAzN1VIdkJiNVZLdDR5aDZ1aDNQNUdsWG5YbnNSMC82N0tObmQveExJUGYrZ1hjaGxyNzQrZ3BlZVBGWDhyOVg2d0x0dC81bFBlejN6cG9MUE9VL095cjFtY2ZraGVNejR3WTZ4NTRmeW1wSHUrV2pZY2QzekVOdDl5ZithMnYvbExlTnI5L3l5ZUxmUDVMbWMvKzlqdGYwOS9IdExaVmtYTDY3WStXdlBVMi84Mitmc1hLSCthelpsMzk3SlUvWlBhTmR3Ymx0eTJQU0YyTmJqMjRuMGV6eDJ2UWM1VkxQVVd5ejBicGkvOHAvY2F5K3grNk8vZzUyTzI2OHNrNldmYWR2ZkxiMURtanJHTXljdXlnUExIcTdtakxPcytRV0FDb0htYnljSFQ3SS9KdnF4NlJoL2NjUzUvc2N4ZHJsOFNpNW43NVdjcTRZS1FPeXZidi9GQWUzbjQwL2JrM0h2dW1iWm5xZ3ZJSGVlS3JtVVpoWWFQWitzMkhNdTcrWm42am8vWWgrZFdRY1VFNjlxTDg2RHVQcEg5ajJQaE8vME9yUXZ6K09hUHNWcVAwRHJuL3hiSE1oUzZxaTI0a1pReFJSLzl5dDl6aVZYZDUvLzVEK2RHTGc1bjF2N3ZPdTc2TGxjRnYvWUpzUTgzOThmN3YvS2Y4NnBpeHpZWmVsSCs3SmNCKzUxUGVRSTIwWXZ0TFNmVllKMHYvSmZQWjcrMzVRN29NTHp5VStlOTd2M1NIcUViV1BTMm56Q1RGV00rYUlwKzNONloxOXpHdGJWV2tuSDc3by9uOS9QVTJsK3VTTEhpV1A4eG5hNzRyYlVPWnVsTDd4dmNlTzJqc0d4TzV1b3IwUEdvN1hnTnRJL2Q2aW1TZmpaSTlzUWk3WHI4ZXpLM0xWOXZUZGYvMnIzOGk5eHQvMi82aTJnK095WSsrR0hGNTV4RVNDd0RWdzVrOEdCZmdYNzFqTk01Ky9WQzJFZXRNTERKM3hleU5oSy9KOTlRRmJXaXYzRlB6ejNsM3EwWVAvMFRxUHVuZWFIN2hXM2NZRjk2NkRFZTVQdnVkZzhadkdCZWlmN0YrNDI3NTN0Tkg1YmN0RDhuL0R2VDdwK1R0MUppTUdPdVJidXplOGtQWk4zck8rTGR6a1YxMDljdFl2STRLa2pxdnVuTiszbWdFdktFYUFUOVlWZVE3M21Yd1c3OWJBMnpEU1BiSEx6MlZYWTlpKzUzLzlpaldTQXV3djVSWWo5YTYzZnJBMFhURGQvdVhiT3VyR3J6dnFFYld5MGFqTGJOczM4L2JHdFBheDJGRTV4RFhjdnJ0ajM3cjdab3NlSlEveEdkdk1ldnFoVlYzWk92cTN1MHZ5d3ZiSDhwNzRoWFpmaHZxWE9sZVQ4VVRpL0tmNC9MWUVvdHc2MlVrb1E4ZE5UNC9hQ1I5eHJaWWxmbnVQdk9wVyswdDk4djNIdGdpOTM0dTR2TE9JeVFXQUtxSHJiSDAyZG83Wk9uZDdla0wyOXZidisxNXNWejJtTHBEMlM4YmJSZUNaZW1MZUw4OC9MbmNNdmR0YnpjdS9Pb0NjbmZSYmo1VzF3Ni8zd2ozKzRQU1pqUWNSdDU1V2U0M2Z2UFc3eGdYdHFFWDVZbW5UMFYyMGRVdlk3RTZ5bTJYejlZV05tTHo2aTd2ODErVEZUL296MXo0VjlVVi9ZNVhHZnpXTDhnMjFOa2ZjL3Vja2VpcXJpdFBQMVMwVHYzS1c3eVJGbUIvS2JFZXJUSzROY0EvdTBwOTEvaTNyNjZTamI4ejF2UEZIMllidXNVU0MrMTlMS0p6aUY5aTRiby8rcTEzUWJMZ1UvNFFuNjM3d2JIeTNoWDNPRjZEYmlPM2VvcGtuNDJTTGJFSXRsNk9MbkpQbTBsY3pUZmxSNjhZeVkreDNtOGZmbEcyZitmYjBTUjM4eGlKQllEcTRYSUJHUG5kTCtYZVcvNVpPN0g0MWFxdnliM3BpOXpMeHNXdXNOSDgyeC9jTHl1Kyt1MjB1bHZjZitQaGtodnRwNlJ0MVVQeXEzZlVSZnViOHZBcll6TGM4bDM1dDZlanU1dW5YOFppZGVUZGlDMm91NExQajBsL3kwTjVZMlhjditOZEJyLzFDN0lOUzk4ZjlSSUx0L0lHdWZ0YmRIOHBzUjZ0TWhRMndPK1ErMzg5SmhNcFkvbEdZM1RaWTBiamQvU29QSHlMMStmL3VhVEVvbGk1ZEhrbkZoNzdvOTk2dXlRTG51VVA4ZG04eE1KOENwWXVWK3FYc3FKTTU5SGcyOGk5bmlMWlo2TVVPckV3RXIwSHZpbDFYL3ltM1B0WWYvcHBZdHZkdVc1YnkxYjlSSDZteG1pa3J6bFB5WXFveHJ2TVF5UVdBS3FIbzdHMDdJdGZ5M1ZwQ2Z4NC80N01ZL0IzOW1ZR0V0cS9weDdQdjJOZE5JdDA4N0gvUnJaYmkvVnZkOHYzOWh5VWZkdmR1aG01L2I3Nit4MUdJK09jalA2dVg5NFlIVFNXZFlmOG0yclFSTjRWcXRReUZxOGp0VjN1K1JmRjJZajEzbzczUFBCaWVtekJVWE9RWmJIdmVKWEJiLzF1RGJBTmRmYkhZRjJoOHV2VXI3eEx6TysyV1grck5kWTNiNkJ4Z1AybHhIcTBQbGZRQUU5M1hTa2MvR3h0dC9CZG9VTHVZeEZ0TTc4bkZxNzdvOTk2dXlZTEh1VVA4Vm1yKzAyNksxVE4xNlR1Uy9mTGp3NUhuVmdVSHE5QnQ1RmJQZDBTeFQ2cnBTN2QrTjlvUFZFd2o4V2pybDJoZlBZOTlmZlAvU1NUbEJqSGNkMjNucEtmYmYraExMUDJuL1J4TzJZYkt3SW5FZ3NBMWNPdmdXZ053SHZzb2V5QXhIdS82ajVvTkQwUWN2dTNYZnY3TDMyb1B6TlRpWE5nc24yNWFoRHNMZCtWSCsxUnN3QVpuN0VHNHY1dXIyejgxaVB5UFdzZzdnL2NCMFo3L2Y0dGQrOU4veTNUZ0tqTDNDbU5ldkMyWmhuOTZzaXJFVnRRZDNtZnZ6dDk5ekk5Nk5tdnZvdVZ3Vy85dkpZWjBmNllYdTYzck1IYkw4djlIb08zOCtyVXI3eWYyeUsvVlhkN0Q3Zkx3OGJmTmo3OUI3UEx5UjNCOTVkUzY5RmNOMmNEWFAyMzZuZmU5aDJyTWZxSS9PeVltazNvUDlOakJJb2xGdHI3V0VUbmtPSmpMUEwzUjkvMTlrb1czTW9mNXJOV1hRMnB1c3JzV3kra29rOHNna3gwNGIyTkhNZHRGUHVzbGpxNWQ4OHBtUmo5ZzdROW9IN2ZISUN0eGpBRlhLL01zWklydTByc2JqV1NrcEgwazVrdG1iL1pCM1pIdEUvT055UVdBS3BIMGNUQ2NXZnhsUjltR28rZmU2aGdxc0dsWHN1cythWnMvNTJ6MGV4WXJwcTI4MHRQU2Y4N2c5bkg1YmQ4YVl1MEhUNlZiaUJZVTRkbWZ5UG83NnNMNEpBYU0vSk5xWTA2c1lpcWpKNTE1SlZZdU5TZDQvTzNmUFdYNmJ1TDZWbGFBbjZub0F4KzYrZTF6RWoyUjNONUx0UE4rdFpwa2UxeDY5MVB5YjVqNTh5L0haTmZQZlJ0MjNTOEFmWVhqWHBNLzM1ZUE5eWNyalhWbnRld3JmdkJIN0tmS1pwWTZPNWpFUjBEUVFadjUvYkg3L212OS8vam5Td1VsTjhuc1hEZGw4M3BVWWRIelgzckZTTUIvWmNJeGdVVk80K0cyRVo1eDIwVSs2eXVXNzRyMjlObGQveCtvUFhLSFNlajd4akg0dmJ2WnJ2Q3JYakFtbTdXWmJrb1FHSUJBQUFBUUJ1SkJRQUFBQUJ0SkJZQUFBQUF0SkZZQUFBQUFOQkdZZ0VBQUFCQUc0a0ZBQUFBQUcyZk1FSUFBQUFBUU0rV3d3SUFBQUFBV21JdkFBQUFBSURxRjNzQkFBQUFBRlMvMkFzQUFBQUFvUHJGWGdBQUFBQUExUy8yQWdBQUFBQ29mckVYQUFBQUFFRDFpNzBBQUFBQUFLcGY3QVVBQUFBQVVQMWlMd0FBQUFDQTZoZDdBUUFBQUFCVXY5Z0xBQUFBQUtENnhWNEFBQUFBQU5VdjlnSUFBQUFBcUg2eEZ3QUFBQUJBOVl1OUFBQUFBQUNxWCt3RkFBQUFBRkQ5WWk4QUFBQUFnT29YZXdFQUFBQUFWTC9ZQ3dBQUFBQ2crc1ZlQUFBQUFBRFZML1lDQUFBQUFLaCtzUmNnQXYvamlYNTUrUEFaYVhsalRQckgzcGVwMlJ0aWo3R3BEOVAvL2g5OS81WCszSDk3L1ArTnZjd0FBQURBdkJKN0FVcWtrb1A3WGg2UzdqT1hwSlJRMy92RzgvOWY3T3NCQUFBQXpBdXhGNkFFS3FGd1BwVW9OZFRUaks5Mi9DSDJkUUlBQUFDcVd1d0ZDT0YvdFI1TGQya3FSNmduR0twTFZkenJDQUFBQUZTbDJBc1EwSnJ1WWQrbkZGZG5QNUpmRFY2VURhK2VTVCtCVUZTaVlQM3Y1djV6OHNvN2w5S2Y4d3ExZkpXOHhMMnVBQUFBUU5XSnZRQUJxS1RDSzE0YmUxL3VlU0hjV0FuMStkYzhubnlvNUVMOVhwVGwvMSt0QTNMN00yK0ZFdWJwaVhQNVBIa0JBQUJBeGNWZWdDTFVFd2kzK09ONzE3VEhScWdFNHM5VEg3b3VQOHJrd2l1SktSWnEvTWQvOUoyVC8vWjRUNmpsTi9mL1YremJEUUFBQUF0TTdBWHdvUklIdDFCZG5weWZWWGZ0TzA1ZWtQN1I5OU15MDhyNk44Z1ZOYnVVNmlMbGpDaTdSWldhV09USzhwSGM0ek9ERllrRkFBQUFZaGQ3QVR5bzdqeHVZeXJjbmlTb1JyZGJxRHYrUVpJTFpkZWJZeDdmMTMvbmhXNWlrVjMzbDRjQ0xaL0VBZ0FBQUJVWGV3RTh1TTMrcExwRk9UK1hTVUM4QjJTcjJaNkMvcVo2RXVJTXQ2Y2pZVGtiL3FyN2xXcjh1MUVKamw4aW9wN01GRnMraVFVQUFBQXFMdllDdUhEckF1WFZ3RmQzOFl0Rm1OOTJhOVRyZG9seUxsUDlkN0h2cUNjdGJvbU82dVpWYlBra0Z1N1VrNjMvMDN0V0dycis2TnUxREFBQUFDV0l2UUF1QnQrN2x0ZFFWbmY0dlQ2ckd0SEY0cXZ0YndYK2JkWDF5VGtsYlgrQVJNQlBLWW1GeFczOGgzUFdKeEtMSU51MUo1MU1wS2NrUG55R3hBSUFBQ0Jxc1JmQXdXMXFXYjhabXFKK1lxR29kMTQ0UStlcGhVNWlvWktJZ3Zwd2pMVWdzUWhXanlyQlZJbUZxaC8xdjRPT3Z3RUFBRUFBc1JmQXdYbUh2bGdqWERVWS9WNTZwNVpYU2ptYzA5Q3FzUStscnBOT1l1RldGbWZpRUdWaW9ScmMxdnN3b3R5dTl1WHFOdWpWOSszdjdRajZQZldrNHBzdkRhWjVEWVFIQUFCQWlXSXZnSU56SnFnZzc1UHdlbXJ4NXhDelFqazUzNTh4NXRNZHF4amR4S0pZNHFDYldLaHVRV3FRdTF1b2JtbjNCV2lFTzBNbEVpcnBVMU1BdXcydVYyTkZ3blJSczdhenM1dWNGYXI4UWJvM3FjSHZiZ1BnQVFBQW9DbjJBdGlvTjJJN0kraDByNnF4cUo1T3FHUkNOYlJWNDFybnpyanErdVNNVXQ5b3JadFlPSi9JUkpWWXFQcFJEZndnb1JyMGZ1dnZEUFdFeDIrMkxpdGEzaWorSkVpVjB5dWhjSVphSDdvNEFRQUF4Q0QyQXRnNHh6YUViWUFYbzdyQ1dBMVUxZWhWZDduOUdzdk9Ma2h1MDkwR29aTllxTHY2em9ocWpNVWYzNXNPMUZpM1F0V1pWNk5kSjlSMjhTcGptS1RDQ3ZYNXVQZGxBQUNBQlNmMkF0ZzRwMWRWaVVaVXkzWjdBWjRLMVZqMlNpNmM0ejFLTFUrcGlZVlhvOXJadUM4bHNYQ3JEL1ZreEJyY3JQN3VUS3hVdUUxM3EzaUZXb1phbHQ4eS9SSVd0MW14VkJsVndxV283azl1VXdRemdCMEFBS0RDWWkrQVRXRURPWnJFUW5XVDhndXZBZDdPSnlpbER1QXVKYkZRaldhM3BNTHRmUjVoRXd2VmlIZUdXb2F6Y2EvKzJ5MEJjUnNiNFJhcXJHN0xkSHMvaDl0VEMrZDJVNG1QMS9nSXQzRTJwWFpkUXppZmFoK1JGLzd5ZDVtNklUTDc0ZC9semVFUnVYMkgvVE52eXdzM0NqWlBPZ1lQdnk3MVp6NTIvMk02L2k0dHJTNi8rL2lBM0pmNnE3d3piWHozeHNmeTNydVQwdkxTNjNMVGxpT2hsbmZUY3hma1BlTmYzenY1bHZGZC96TFBUbCtUN3QrL0xiV1BxYjhIL1IyL2RlOHYrTHVxdjhFelkxTGZHazkzdmsrMW41YU92RzE1V3BZK252K1ptOXYrSkQ4Zi9VRGVNK3A5ZHZvRDZVLzl5ZkVaYTUwK2x2NER2WVcvMDNwZTNySHFxSzJFeno4NUlvTnFtNlh5ejBPMUI2YU1mNzBoTHp4blcrYUhsNlErYjE5OFhUYTlhL3o3OUxnc1RmLzNjV241bS9IZmsrZmxDNEcyYWEvY2QwNTk1Z1A1YWQ1KzJXTjg5NFpaeGlNVjJsNHUrMmpCTmpNL016b2tOL3NzSy9BMkxWcWZ4ZmIzSU9lRmo2WDcrUkJsaTNSL0NIYzhGcDQvZ3A0WDdQdGRPYmJEd25iVEUyL0p3NmxKR1p5K0liUEcvalJsbkx0ZlRaMlcyNStvMUxIcDdlYTIwOUw5N2x5NlhPKzllMGtlYnB1SFhiZGpMNENOczRHc1hwUVh4WEtEdk92Qy9YdlJkTTF5cnBlNlE2L3UvSHZ4R3B0dzFlUHBTdGpFUWpYaTdWRnNrTHR6K1c3SmpUTlVOeXV2NWFuZmNvNGJjVnRtNFJNcy8vVnlsdE92aXhXaWNmTno0ekptMVBYczMvNHFIYjhma1o4YWpmMHgxU2lkSEpPbGoxbWZNeStHZjV1VW4vYU15Q2FiKzR5VDZxTG5jLy85d3J2cW92eDNlZlVONjkvKzVFaFNsSDU1WUZRdDhJYlJpQm96UGpObWZDL3ozNisrM0I5aWVVZmt6cE5tSzJMNmd0ejVtUDAzY21WdStmMTUrZW52eDR3RzkxejZvMk9wVENNaTJPLzRyN3Z6N3o5OVkwTGVWRDBVYjN3Z0xlMlZ2ZURjM0c3YmxtK2NsNWFUNXJaODEyajhtSFZ6VTl0NUdVdzNiSXdrS3pVdVB6OXpUVlR6VFgybVlIdXJmeC85azN6SzhUdGYrUDBINWhIcVRDd0NmajVNUTlLMnZUS2Y4MHNzZ20zVG05ckcwdlUwTmZ4MnJySCs1T2wwbVZUNWF5dTJ6Wno3cUxITmhxM3RNV0kyV0lzbkZtRzNxWDk5RnR2ZjNjdWYvOW5UOG8wblE1UXQwdjBoelBIb2Z2NElkbDRvVEN5aTNRNlZvTlloazBUTi9rMmQ3NHY4ZDRYSzlhbm54akwxNkJZM3JrbkxjeTQzTHlybGlUOUp2N1BUeG9kL2xRZWVpS2s4NVJKN0FXeWNqYzFLSmhadURYYm56RkJSSlJhbGhLb2JyMW1Vd2lZV3p1NUZ4WjdFT0o4R3VJMWhjRWF4TWppZmhMalZyYlBiVkxGQjJhcGJWTEZsSWtybXhlekRTYm5QMXZpdlBmRFg5TjJZVjEreXRsZXd1NmJLN2VrTHRYR2lMVWdtYko0NExXK0thdGlsY2hmV3gxTFNvUm9Ba3lPeUtPanlqTys4WU94aVUzLzd1M0VCdnlFZHo5bnZacm1WZVVCK09xbldkOEtSaFBqOVRyRjFkL243RHVQZjB1dVNmemV6TXRzeS8wNW83ZUdwOUxic1RtL0xmbm40TCtvSlVmNkZzUFp3Wm51L21iMGpiYTdURGRXb21ISmNORE4xT0hzajArREtTeXlDZmo1a1ExSTFKalk5NlZoUGo4UWkyRFpWaWEycWh5bDVPRjNXSTNKN1NpV2RjOUxSWHNrN29tNzcxaEZaK3NiZjAvV1EyWitMN1g4aHQyblIrZ3grckVkV3RrajNoeERIbysvNW85Zys1Tnp2b3Q0T2xkbi91ck5sdVNUZmVLeklmMWVpVE5tRys4Y3lkdWEwM1Bsa1Qvb3A5czFQcHVUaE14OFlkU214TnVReisyUmh2SGxnbnZXdWlMMEFOczRHY3BDcFpvTW85aEk5MVdoMysxNjVubGlFRGRYQTlwc2lOV3hpNFJ5MFhXemFWN2VYOURrLzQ0eGl5M1FtZTg2NmRmNm0zeE1RdjNMRXZVL1BhOWtHL3R2NTNZaU1DM0hMdVVucGVQbDE4OS9LazFqTUdzdkwzZDArSXA5cWZVdHViM3M5N3pmOGxuZlRjeE5HZzhCb0RENC9tR2tnMkJNVmp6TGZPZnl4Ni9JaVRTeTJXSGZwcllaM0JiZmx5WlJqV3c3S3o4OWN5bXpMSFg4cVRPZ1Vvd0doNmsvK1lqMXR5S3pUMU9oa3VzSDNwcjBMVEt1NjIzOURYajAzSmM3RUl2RG53elFrLy9hQnZLT1dmYzdhVjZKSUxJeDlwejNUQldZc2RWeHUyakVrcjZvbk8zODVYY0duRlQ3N2xyRmZxd2JVbStsdVpVWDJ2NURidEhoOVJwaFlCQzFicFB0RDhPUFIvL3hSYkI5eTdIZVJiNGRLU05vVEN5UEJQNWw1cXZ5ZWNVMXlQdm44eEpaZStjYXcrZmVDcnErVjRaMVl4UGdVcFJ4aUw0Qk51Y1pZdUhXOXlmOGQ5NGE0ODY1NnFTL2JLeld4VUw4WDVFVnVZUk1MWndSNW40UXpuRThQd2k3VE9kdVZNN0Z3L2wyOVIrUS8rczRWNVl5NDkrbDVyVzA4M2JoNnArZjFJcDgxTDRaL0daRXZHQWxqcmVsVE84TGM0Yk5UL2R3enQ4S20zcDJRVFMrOVpZNTdLT1M5dkNQR1JlYUcrZlFoOTcrLzRleHlrTmZBNkpVSFJpVjk5NjArN0JNTHozVjNiOGpjOVB5bGRPUHcxWmNyMUIzS2JDZ1g5b08zZjJiYzR6TzVSczN0dG5XYUd2NlRQS3p1N05zYTNGOVFkOU9OZW43ZzhGK2xJTEVJK3Zrd0RjblJQOG1kYjZoR29kRUFmSzVIb2tvc3NuZVlQNXlVbGxSbStTODhWK20rMHU3N3pzMHZUOXFlR0JacHZJZmNwc1hyTS9peGJ2L3NVdHRuYTYzUEJpMWJwUHREME9PeDJQbWoyRDdrMk84aTN3NExrVm1uWW4rUzQyRHVLL0szbU9xSnJsQ1Y1K3hUci9PMmF5ZlZVSFZMTHZ5U2hhZ1NIZWR5MU4xM2ExWWpOMkhmd3hCSFl1SDhUdGhsaGswc1NnMWVobGRHejExSTl3SE9YUXlQeU0yUDl4cU5DS1ZIYm5icEY1d1g3K1ozVzFLQ0pSYUd4MTZYK3RSZjViM3NvL2EvUzNmUFd3VjNxVHlYWjk0SnRKNjIzR3cwSEZSM2hoZWVkelQ0czQyZUFibjk4S1gweFgvcXpHRHczeW02N3Q1M25WWGRWdXhPVnZiM2ZCSUw4ek9GQTZ4Vkk5djR3NGNYNUU3Yk9zMmVlZHZzRm1kMUdjcGMrRldkTHpwUStNUWk4T2RETlNTSDVGT1BXOTNrMUZpUnFCSUx0YzlNcFBjSHIzMjUvQW9iNW92YS95UXZxUFc1WVpXN1NHSVJjcHNXcjgvZ3g3cm5aNjF4TmtITEZ1bitFUEI0TEhyK0tMWVBPZmE3eUxmRFFtUjFxU3k4OFpQMTJHQ21lOWFOaWNwMHpiSzU2Y21VM0hkZ1NMN3gwa2plNE8xTkw3MHQ5eDAyRXNVbjR4OVlIcG5ZQzJBVHhkdXVyVGMrdS8xTk5kaFZvMXNsRXlwcEtmYW1adWRid05VTC9FcFpMOTBYNUlWZFBvbEZ1SFZEaWN5N2JPLzgzbnhpWVhhbnNXSjJPR1YrMWp6aHZ6c3U5YysvTGQ4dzNkbmVINkxyZ0lmSFg1YzdENHpKcTVQcWtmdkhNdGd6RUdoNW1ZYkF4OUovZUNCemw3VDF0UFNydStabnJBRzU3bzJlcWIrY2w5c2ZMeXhIMGNUQ2M5MlQ4OFFpUDBuMDN0NUI3NnJPbmh1VW0zY01wZXRWZlNjejZEblRGNzMyc0pyeHpwRllCUDE4eUlha3F0ZFB2VHhwYnU5VVpJbEZkcjJOMyt4K0tZNlpYVHdhNWg5K0lCM1BPL3JrUi9iRW9saDlCai9XczUrZHZDRDMyVDc3alRienMyVjVZaEd3L0VXT3grTG5qMkw3a080VGkyTHJzUkNGZVdKUnVjSGthYTBqdVFIbHh2SDU2c256c3Vud2lQejA1S1M4WXozQnVERWxtOXhtUUt4R3NSZkF4dTF0MStyZmduelgyV2RmSlNVNmpVcWR0NEE3emNmRXd2a2tJT3d5d3lZV2FweUpXcSt3bUhLMmpNeCt3Yk5uQmpNWDA4ZjZaV2w3U3U1OGFUd3pRNDR6c1lob2pJVzY4MVAvMHR2eUJYc0QvekhiM2J1aXk3T21CbldKRHkvSk54NjNsZGxxOUJ5ZVNNOEU1TlUzTi9JeEZ1a0J1QlVjWTJFMXprNDZqdHNkUm9QbDVBWDVxV3FvdWcyYVQ5ZTlSei93OURyMVpLWm5mWGRFN2t2OVBUdDd6cUllZTUvMWtKODN5K0VzcXhwb25oNjAzTzVXcjZxQjluSDZvajZvOXBOSUVndnJNOVlUbGtvcmJKamYyVDRnbjNLYjNjeHIveXRwbS9yVlo0UmpMSUtXTGRMOUljanhHT1Q4VVd3ZmN1eDNrVytIaFNqTUdJdkM4VERsTEZlNnExeUFLQml2V0sxaUw0Q0RzN3RTa081UWJpOVJzNkxVNU1MWkxldVBHbTl6VGxwaVVURDdWZ21KUmJHL1I1MVk4RGJ0SkxKbU1qRWFWdlk3UkViQzBTL2xTeXh1Zm1uU01WT0tZczdZNUxnVDVicTh4ek9QdzJmL2NqN3ZybXI5Ry9ZWmtKeGw3czAwSm02NDN3MkxkbFlvbzN6cEpHbXNnck5DbWZVM1BaSFhNRkozZlhQOTlhMXhCWTZaYTh5N3BnVXoxNWpyWkcwdjlXNE1Lekh6VGl3Q2ZONmNqU2UvZTQzVjJMTWErWVgxZXBNNW5XNDY1bE5pNFh0Y0JaeDVLZVEyOWE3UE1zd0tWYXhza2U0UEFZN0hRT2VQWXZ1UXg2eFFrVzJIQmNvMks5UTd6bG1oaHMxWm9TcDV3OGErcllORXBaK2tsRXZzQlhCd0RwaFczWkg4bmhRVWUvbGRLZDJwM0daQlV0MjBTbDJucENVV0JiTnZGUmtnN3RZdHlma1paK2dtRm03TGpIdmZSQ0g3M09zdnFMbmFmejhtTC94bExuMENmK2YzMWxNdGF5YVRTd1h6MVR2bnRnL1VGVXJOTnFLNlB0MzR1L1NyUjhyR3NuNSs3dS9wM3h4NzQzamVIUiszNVZrTjE0SnVSbVkzbk13VEdKY0d4cE9aeDlrbGpiSHdYUGY4djhmNkhvdm5MbVRlWXpFNUtULy92ZTA5RnBPNWVmUlY5eVExRzQxTVR4bmJXNzAzWVNyZGhjUDF2U1ZXM1prTk1UWFE5T2ZtZEt4K2lVWHh6eDlKejlLanR2ZDdveGVNZWpQS2NlYURkRmV1OTRZZFhka2NnKyt6ZDVvWFdtTGgzUDhPLzBsdWYwSmptM3JXWi9CalBkZzdOb0tVTGNyOW9manhHT3o4VVd3ZmNudVBSWlRiWWVIeWZZK0ZHYk9UNDNKbjBPNjJVUjJuUVNLR3NSOWxFWHNCSE53YTlYNkRwb084b3lMc1lHam4wd3AxaDcvVWJsQkswaEtMc0xOZEJYbm5oRE9pU0N5YzArSUdtU0VMbFhkejY1RFJzUDlBM3Z0UU5mWnZ5Tmk3UnNQMHdIRmI0OXY3eEpwTFBqSUNqN0Y0L0xnOGtKcE12M2s3ZlhmN2IrcXQyS21DNlQ0TGw5Y2o5ZWMrdGcxdXRldVZCOVJBeVJ1VFV2KzQrenNDYmorWjZSTHg4L2FnZ3pTTHJYdiszNjAzL2Q0WDA1dTNhNTlUTC9YS2YvTzI4d1dGNnUzQUhkYmJnVC84d0VqdVBONE9uSzI3SHZtR2F2allabUx4VFN5S2ZqNnpyVzQvYkRUNi9uWWozYUJVYjBWLzlZMjNiYk9EZVRSYVZaZVRkT050Z1NVV0JURm5kaEVxZFp0NjFXZndZejNvMDQzaVpZdHlmeWgyUEFZOWZ4VGJoN3pmdkIzTmRsalk4dDY4YmRUbGUzOVRiOTQya3VuV3QrWG5rK1lVdUJWTEx0NlNuK2MzWmJ3ak81YW15c1ZlQUJmT2hyMEtyN0VXcGI3OHpvdDZLWjh6ZEdlbktuZGlFZmFGZDI1UElMd1NBVlYzemplQnU3M1JPdWp5dk1yZ1ZpZk9iVHVWVHZEOEcxd3ErU0FCQVFBQUJSNVA1WktMQ3MzbVZ2dlNCUm44OEdPZlZxcEtZcTlKeDB2elpFeG83QVZ3NGZiVVFuVnBjbnRxNEh6YnNqTzhYbjduUmlVdnpwbWdkSjlXS09WT0xOd2E0TVdtV1hXKzFWcDk1ejVIZzF3MTBKMUpoUXEzeHIwem9rZ3MzTjQvNGpVb1grMHpIU2N2WkQ5SGNnRUFBQW9ZeVVYTHV6ZGthdlIwRE5ORUx3Q3hGOENEODYzWEt0UUFYcmRHdnJQTGpEM2M3cTY3VWN0Vnl5LzR2c2JZQ2t1NUV3dTNSTXdlYmwyai9LWnpkVXNtaXRXbk02SklMQlQxZTE1bDdCOTlQMjFzeXZuR21VeVFYQUFBQUZSUTdBWHc4VWVYaHI1YmNxRWExbTV2dHk0MjFzQ2lubFM0SlJXbHZtbmJxZHlKaGVJY0J4R2tIbFRETzB5b0xtcGV2KytNcUJJTHhhMXJuRTVaQVFBQVVBYXhGOENIU2hqYzNwYXR1aXVwc1JET3o2dkdxbXBFcXdaejBIRVY2bjBWenU1UEt2N284WFNrRkpWSUxCU3Y1TUl2d1ZKZHlaemRvcHlodGtHeEp6L09pREt4VU5RMkxWWk9GZW96UEtrQUFBQ0lRZXdGS0VJOVRYQkxMbFIwbjdsVThndlFWR0xTNy9LVVEwV1VTWVdpR3JyMmw3YVZzK0dyNmtNbEFmYmZDL0tlQ3BWZ3FMdjhxb0Z2VWYrdHlocGtWcTJ3TDZaVGZ5K2xUbFE1VlFKbEw2ZFYxbUp2VWdjQUFFQVp4VjZBQVB5U0N5dkJ1Qy9kQVBaUEJsUmpWbjFPZmQ0cm9rNHFBQUFBZ0FVaDlnSUVwQnI3YnVNb25LR2VRaWd0YjR6SmYvVDlWM3FtSVBYZmJtTW9uS0h1ZXBOVUFBQUFBQ1dJdlFBaHFWbWEvSjVlbEJKcWVXcXNSZHpyQmdBQUFGU3QyQXRRQXZWVVFVMUhxNXRncU8rcjVmQ1VBZ0FBQU5BVWV3RTBxSVJnVGZkd3dadW5pNFg2dlBwZTNPVUhBQUFBNW8zWUN4QWhOZE9UNmlxbG5rSW9hc3lFOWI5Vkl1RTJSUzBBQUFDQUNNUmVBQUFBQUFEVkwvWUNBQUFBQUtoK3NSY0FBQUFBUVBXTHZRQUFBQUFBcWwvc0JRQUFBQUJRL1dJdkFBQUFBSURxRjNzQkFBQUFBRlMvMkFzQUFBQUFvUHJGWGdBQUFBQUExUy8yQWdBQUFBQ29mckVYQUFBQUFFRDFpNzBBQUFBQUFLcGY3QVVBQUFBQVVQMWlMd0FBQUFDQTZoZDdBZktqZWtvQUFDQUFTVVJCVkFBQUFBQlV2OWdMQUFBQUFLRDZ4VjRBQUFBQUFOVXY5Z0lBQUFBQXFINnhGd0FBQUFCQTlZdTlBQUFBQUFDcVgrd0ZBQUFBQUZEOVlpOEFBQUFBZ09vWGV3RUFBQUFBVkw5L3VQVmVBUUFBQUFBZEpCWUFBQUFBdEpGWUFBQUFBTkJHWWdFQUFBQkFHNGtGQUFBQUFHMGtGZ0FBQUFDMGtWZ0FBQUFBMEVaaUFRQUFBRUFiaVFVQUFBQUFiU1FXQUFBQUFMU1JXQUFBQUFEUVJtSUJBQUFBUUJ1SkJRQUFBQUJ0SkJZQUFBQUF0SkZZQUFBQUFOQkdZZ0VBQUFCQUc0a0ZBQUFBQUcwa0ZnQUFBQUMwa1ZnQUFBQUEwRVppQVFBQUFFQWJpUVVBQUFBQWJTUVdBQUFBQUxTUldBQUFBQURRUm1JQkFBQUFRQnVKQlFBQUFBQnRKQllBQUFBQXRKRllBQUFBQU5CR1lnRUFBQUJBRzRrRkFBQUFBRzBrRmdBQUFBQzBrVmdBQUFBQTBFWmlBUUFBQUVBYmlRVUFBQUFBYlNRV0FBQUFBTFNSV0FBQUFBRFFSbUlCQUFBQVFCdUpCUUFBQUFCdEpCWUFBQUFBdEpGWUFBQUFBTkJHWWdFQUFBQkFHNGtGQUFBQUFHMGtGZ0FBQUFDMGtWZ0FBQUFBMEVaaUFRQUFBRUFiaVFVQUFBQUFiU1FXQUFBQUFMU1JXQUFBQUFEUVJtSUJBQUFBUUJ1SkJRQUFBQUJ0SkJZQUFBQUF0SkZZQUFBQUFOQkdZZ0VBQUFCQUc0a0ZBQUFBQUcwa0ZnQUFBQUMwa1ZnQUFBQUEwRVppQVFBQUFFQWJpUVVBQUFBQWJTUVdBQUFBQUxTUldBQUFBQURRUm1JQkFBQUFRQnVKQlFBQUFBQnRKQllBQUFBQXRKRllBQUFBQU5CR1lnRUFBQUJBRzRrRkFBQUFBRzBrRmdBQUFBQzBrVmdBQUFBQTBFWmlBUUFBQUVBYmlRVUFBQUFBYlNRV0FBQUFBTFNSV0FBQUFBRFFSbUlCQUFBQVFCdUpCUUFBQUFCdEpCWUFBQUFBdEpGWUFBQUFBTkJHWWdFQUFBQkFHNGtGa0hUTDJpUWxLcTdMd2FZR3o4OHQzam1XL3BTTWRrdWQxN0xxOWtqdlhHWlpBMXZXbEtlOHF3L0plTG9nNStUUkZSV3FvNldicFdWa1JtYW54NlIxblcyOWx1NlNnM05XM1lWYjV2SzlselAxT2RJaGkrUGVCMG8wSDliQmM5c21VY1hLdWxGYVJzVTc1bWJrMHNTWTlPN3ZsTFgxTHVYUU9DNEF3QStKQlpCNEc2VjFJdE5lR04rNzJlTXo2NlhweEhXelZlSFRvRi9YTDVmU254bVQ1cFZsS204Y2ljWEtiamtyTG5WRVlsSDE2K0M1YlRYVTFPK1M1dlp1YWQ2OUk5cDZLVU5aM1JWSkxQSmlTZ1oyTjB1dC9mc2tGZ0RLaE1RQ1NMd0dXWFZrSnROR0dQSm9JTlpaRFlWTVk2SFg0Mm5Fa3Qxam1ZOWM2Wkc3eWxYZU9CSUxJN0ZhMVg1TURoN3BsZ2I3YjVKWVZQMDZlRzViRGJWYkJzMDcrOGRrVmNMTDZpNlhXRnpxYXBhYXBRMzU2dGJMa25WN3BQWEVsSGxPbUpHQnJRL212azlpQWFCTVNDeUFLbEM3NVpUTXBodENLV2xZV3ZqM21zWit1V3E3UjNuMXlBNnBLVmpPR21rOG5ubXFNZHUzSy84T1pwUmlTU3c4a0ZoVS9UcVVRL2tTaTBySlR5eThQN2RCSGoxaDNwUzRZcXlyZGU0Z3NRQlFKaVFXUURWWTJTbkQ2ZGJCWldsZFhmajM1VjJaTzVQangxT1p6N2sra1dpV3ppdVpOa1pxNTRQbEt5dUpSV0xNaDNVb2g0V1RXTndyTmV0NnpPNlBNOUs1enZ4M0Vnc0FaVUppQVZTRlptbjNUQXFzUnNhTTdHdmFKdTNwOFJnWHBhWGVzWXdpeVlucWNyVjRYWnUwSHgrVDhTdlhaWGJ1dWx5YU9DY0g5KzZSdXJvUVpjMUxMTlpJM2FadU9UaDBXYTRheTFPRFNzZEhVdEs2WmFQN0U1UHNHSkJUMHJUTWJma2JwSGtrVXcrQnhsSVVhMEF0M1NBTjdjY2tOVEdUZmlJME8zMVpVbjJIMGdOZVMyNlUxMjJVdGJ2N3BYZkVYR2ZqdDYrcWdiUmRIWEtYMnpwWjlUV1hrclZMNzVWRjVqYTROSzNxeTlnR282ZGszKzV0c3Nqcjk2SmNoOVZtSXpUOVpDeTM3UzZaNjZISzBybXpPVnVXMnZwZDB0cDNUc2FuTTMrZnZYSlJCbzUweXFvVjNwTU1oSzRmcjIwWXV0NDJaOGNxdWNWNCs4WUVsYldZNEltRjZpYlphNjdqd05iMXdZNExkUzVvN0pCT2RTNHd0KzNWOUxidGRoOE1Ic2s2Um5UK0FSQXJFZ3VnS3F5UnRYMVdOeVpITjZjVkhabFpvOVFGdmE1QlZ1M1BkSDBZZGlRZ3Rac0dNOTJwcG8rNWRLZGFMdzM3TDJiK0xwa0d4MngyeklZUkV5bHBEUHIwSVp0WVhKYUJFNWR0eTdUSGRSbmZ2Nk93a1ZISnhLTE9TTUpHcjd1V1R1WXV5L0NvMllVa1JHSlJVOThoQTFkeWk1bWRucEdyMDdiZm1EYVNyZm9Hai9vNkorMTdUK1YxYWJQSHBTTXU5UlgxT2xpSmhaR1k5aDYvN0ZFU28rNjd0aGxKeHpFWm4vUDR3UFNnNi81U1V2MFVhNndIcnJlTjhxalJhRDA3ZWxIT1hyRiswMGgwMVgrUGpzbkJyUnNTVk5aaVFpUVdScGw2emUwVUxMRjRVTllldVpoMzNNN08yZmV4S1JuWXViR3dxNlhXT2taNC9nRVFLeElMb0VvczNubk92TWdla3VXMmYxOWtqcitZUGJFbmZjR3UzWlRLKzIvcmMzZVozYVhrUkp2and0NGdkYnZIekl2NlpUbW83a2liaVVkdC9SN1paelpjWjBjNlpVbVFzbVliR0NwbUpMVjNseXhma2JuTFdidWlXWnF5alpZWjZkMnlQdis3RlVzczFzdmE0MmFqZTA2dDh6WlpVcGVwaThXcmQwbnIwRXl1VVJPMFViNjBXVHJOTytKWGh3NUp3OHJjblYxMVo3L1RxeDRkOVRXOHYwM3VNdXBMTmR4cVZIMzFXUTE4NTFPb01xeEROckZReTd3b25WdWJaYkc1ek5xVk82VEZ2a3kxbmlNOTByaDZmYWFSdVhTOUxOL1NMMmZOQnVHbC9kdnlHNStsMWsvUnhuclllZ3ZRRlNwQlpYVVhJckhJL3ZhTTdHdHNLSEpjTk1qeXZSZk5za3hKNys1dHN0ZzhGOVFzMnl5TiszUEg3c0ZONnoxK0ordzZSbnorQVJBckVndWdXcmlPWFdpUUJ2TkpScmFMMUxJMkdWQ05ocnlCM3JrRytWbG5sNDhWNXVlTlJrWnE1NGJDMzEzWklhbTVURU9qczlHbmkwdEJPYS9MY0x2TG5jMWJIOHhOamV0ODUwYWxFb3Y2WEJuelpzdkpmczlvdUkyWVpRemFLRjkzU0lZbnB1U1N4OTNWbXV5Nk9jYWUyQnBrWjd1YUM3dUkxZTJRZzlPU3Y0M0x0UTZyYy8zeGU1ME54L1MrdGNmY1Y0eVlUc25hZ20xa05FeTd6QWFrSXdFdXVYNENOTlpEMWR1dEFSS0xCSlhWWGRERXdrZysrOHdiQ3Vrbm1rWEt1Y0k2MWozT0JiZXVrWVlqNXZLdTlPY0dnK3VzWTlUbkh3Q3hJckVBcXNYU0hiSnYybW9NV0hjZXQwbG4rdDh1MnQ1TDhhQThPbUplaU5lWm42dXp1a05NNVFad21ySlBRcHdOaGF6Y2JGS1h1Z0xNelI5ZzhMYWF4Y3IxZlJvVlNpenEyaTltMS9rdTEzVXV3OEJucTh1YWM0eEx0cjdHUE9yTDJwNzU2MXlXZGNnbUZsN2Jia08yUVh2MXlEYVhwTkhZdGxhWE80OFp6RUxYVDlIR2VyaDZVN1FIYjFld3JPNktKQlpMMThqaTFUdWt1Yy9xaW5nOWZVT2hwa2c1bDlqMktmZHp3YjIyNUVPTjZXclFYc2ZJeno4QVlrVmlBVlFOOVJJOHg0WFp1cGc3N2c1YmpjN3h2ZWJUQ1d0bW1MbkIzRjNMdEliYzJJM2ozbFBRWmh1b2p1NVZyb0xNQ21WN0EzaGU0NlFpaWNVYVdYczh4RHFYa0Znc3F0OG1qVHU3cFgxL3YrenJTOGxCNWZoRnM5LzVsTFM3SmhaZTlXVnM5eUZuSTdKTTYxQTBzUWpRQUc1S21ZbkZZSG9RcjNiOUJCaTNFTHplTXNJa0ZuR1gxVjJZRitRWlNjV1JYZm5iMytPNGFEVFBMd1hqdUR5UHdZMmE2MWlHOHcrQVdKRllBRlVrZTVmYWZGR2VkWWZ4MHY3bS9JYUFsVWlZL1pLekw4WXJhR0FhRGNXaG9BMlUzUEo4eXhsb3VsbnJTWXZrdjh5dklvbEZicDM5R25FbEpSWXJ0dGxlU3VZVlVTUVdaVnFIY2ljV3BkUlBYSWxGUXNycXJraGlNWmVadldyZ3lDRnBXdmRnWVpMZ1drNlBZNnVBZW9LUStkenNrVzJSN2NlQmduRVdRT0tSV0FCVkpQc2lQTlhOcE02NktEdTZKQ2hMdDJXNlRjMmRrc1psdWJ2YjR3VmRDUjdNTmlZeU03SDR1Mm9rTkZFbEZ2dXNtV3JtUzJLeHRGbmF6Y2JlN0doS21qYzF5NUpsYTNLTnVtejNtUVdhV0pSYVAzRWtGZ2txcTdzUWc3ZGQxNjlZWXVFeTlXNVd0SWxGNU9jZkFMRWlzUUNxU2JZTDBVVnBiVFQvZDBIM0pzVktKb3lHdzZadDV2ejl0ckVaV2V1ejNSOUthcUM0Q2RnVmFzQnNUTVRhRmNxbnkwZllSdm1pTGRaMHZtNkRtdStOT0xFb3p6cVVNN0VvdVg1aVNDeVNWRlozNVVnc2NsMmh2TWJQT0g4N2J4OG9hUjNMY1A0QkVDc1NDNkNxV0EzcjY5SzdQNVYrZWpGYk1IMXN4cUt0cHpJWC95UDk1cXdyN28zMWJPTnpOS0p1Qm9FR2J4OHorNmc3Qm04SEdEd2M3ZUR0bnNnR1BudFA1MnVLTkxFb3p6cVVNN0VvdVg1aVNDeVNWRlozNVVnc2d1MVR1WFdmeWI5UlVlSTZSbjcrQVJBckVndWd5aXczR3ozV1M2dWNMOExMc3Q2MFBaZDVJM1BCMUs2VyttNDVhellVZXJkNExLdHVzNnpkNVBHMmJDZWQ2V2J6R2kwdWIvZzEvbTVOZDZvMzNXeVJkVjY2T2ZSVXJka0drbXVqVEwwRjI1cXJQNXJFb2h6clVNN0VvdVQ2S1hOaTRUWnpWWkxLNnE0OGlVWDJuS0dtTVBhWWJuYlZmcXR1dkthYmpYZy9Wc0tjZndERWlzUUNxREkxVnNNdEhYNHYxTnBzZG9IS3hGWG5DOHV5YkkwRnVTeTl1M2VZTDFyTC9HMUpZNmNjbk1oMHE4cSt1ZGVQOHdWNVhma3Z5SHMwT3dXbXkwdTIxQk1KYTFEcVJFcWE2bk12WDZ0cjZwWmUyL3BvdnlDdnozcTUzRVhabDMwUjNKcVNYeTZYZTdlQlViYStEbG0xY3IzVTFxMlhKY2J5V3Zyc2J4V2V5Wi95dCtSR1ovVHJVTTdFb3VUNktVZGpmVjEvZGxhbmZadlU0T1lHcVYzYWtNeXl1aXBUWW1IVXcxMWQxZ3Z5THVlOUlPOGZsbTJVdFYxalpyMjVKQUVscjJQRTV4OEFzU0t4QUtyTnNqYnpycjRVdm9Rc2o5RkkyRy9OYW5NOWYvWWxwNlVicERIYjRNOUVlc0NrN2IvSCsvYklraUR2SmJETlozOHcrN1pkWjF5WHMxM2JYTHVaMURiMjJ4SVRSMHhmbExOWHpQSm9KUmFHdW1acHRlN29GOFJsR1JnS095dlUrblFEYWRaMWVkZGwvUGlnZVRkWThodElPbzNPcU5laHJMTkNsVmcvNVdpc3E4SFpFL2tsY0NadGlTbXJxM0lsRnBsdHZQYkl4WUp6UVM1bUpMVjdjK0hUQTYzdEVlSDVCMENzU0N5QXFyTXgreVRpa3VkVGlJeWFKbyt4REs0YVpFbFRwM1FlSDVQeGFYTmc4UFNVREovb2wrYW1EYjYvazhkcVlFd2ZrMVZMMTBqZGxrTnkwR2pnWGswUE5KK1I4WkdVdEJicDFyQm9kWWQwbnJnb2wrWXlkeXF2WGhtVGdmMGRzbXJGK3R3TVY3cUpSZnJ2RzZTaC9aaWtKakxkeFdhbkwwdXE3NUEwMXE5SkQrQk5SNmozV0pqck8ySmIzNkdVdEtUWDkwRnBQSEpLVWtPbnBOZG9tTlU0NjZ2VVJtZVU2MUQyOTFpVVVEOWxhcXpYMU8rUlRuTy9uTDFpSkdHN25UTWhKYWVzYnVlQThpVVdtWFBCNHNhTy9IUEJsWXVaL1dxMXgxTUQ3WFdNNlB3RElGWWtGZ0FBQUFDMGtWZ0FBQUFBMEVaaUFRQUFBRUFiaVFVQUFBQUFiU1FXQUFBQUFMU1JXQUFBQUFEUVJtSUJBQUFBUUJ1SkJRQUFBQUJ0SkJZQUFBQUF0SkZZQUFBQUFOQkdZZ0VBQUFCQUc0a0ZBQUFBQUcwa0ZnQUFBQUMwa1ZnQUFBQUEwRVppQVFBQUFFQWJpUVVBQUFBQWJTUVdBQUFBQUxTUldBQUFBQURRUm1JQkFBQUFRQnVKQlFBQUFBQnRKQllBQUFBQXRKRllBQUFBQU5CR1lnRUFBQUJBRzRrRkFBQUFBRzBrRmdBQUFBQzBrVmdBQUFBQTBFWmlBUUFBQUVBYmlRVUFBQUFBYlNRV0MweE5VMHBtSlJPcG5RL0dYcDRGWmVrdU9UaG5WdjVJaHl5T3V6d0FBQUFSSXJGWVlFZ3NZa1JpQVFBQTVqRVNpNHA3VUI0ZGtvckVzRXZpc0tBVGkvcERNbTZ1Kyt5UkhkRXNjMW1iREZnVlB0SXBTL3crVzZuRW9xNVpXazVNeWV6Y2pKdzlzc2UvVEZnQUdtUnQzL1hJenkrcHJRdnMvQUYzbkcrMExLcmZKazN0L1hMd3hKaU1YNWt4NnRHOFJobjFPVDQ2SmdOOVBkS3lkWWZVTFdzb1lmbk9ZMzlHRG01YVUrWjEyaWd0by9ZenhXVnByUzlsT1EyeWFQV09iTjJjblppU3E5YjEwNmlicXhNWEpYVWlKZTI3OThpcStuS3ZFOElnc2FnNEVvdllWRjFpc1VhV2IrbVVsdlp1YWRtOUkvQUZlOUhXYzdhOVlFWTZHMHU1SUMxMHBkVjlNczNYeEdJK2JhUHF4Zm1tRkVhamVWMkhkSTdNaERqaVptVDRTS2VzV2hHbWZndVAvZG1odHJJK0xhOVoxeStYOG40eGJHTFJJRXVhdXVYZ2FKaTZ1UzZYaHZybDBYWHJwU2IyYlFzU2k0cGJJM1diT3FWNWQwQjdCM01INlpWQmFRMzZQVVBqNnNJc25zVENQTGxXUldKaEpLRWo1dWZuVXJKMmFiQXlMZG95bU4zR0lsUFN2aTRCZFY5MVNxdjdaTEkzTG1Za3RUL0UrY2ZIMnZxNEc1RHphUnRWTDg0M0lTM2RJR3YzWDdUVm1ka3dIamtsQi9mM1NLdVJLRGZ2TnBMbHZUMnk3L2c1T1R2dHVDa3dkMUU2TnowWXNBSHRkbFBob3JTVTlBUWhpRFhHN3prVGdoQ0pSZDFtZWZUNDVjSzZHVFhxNW9oVk4rcG13aUZwMzUrU2daR3BncytlM2I5TGxuQXVpQldKUmRLdDZKQ1VkY3dNNlhlZkliSEl4SHhPTE5JWHJxNUJTUTJka24yN202VTI3bnF2U3ZPcDBXcHZYSlRhTFNHSjV0TTJxbUtjYjBMVTFXWnBIckkzdktka29HdVBMUGQ5Q3RFZ2k5ZnRrZllUVTNuZjY5MFM1UHJ0L3JUeTB2N204dHpaVisyVk9lZXZCVHpuMURWTDY0aXRyRVlDZGJCOVY5RXVZRFhMTnN2YTlrRVp0LzN1cGVOdEpCY3hJckZJT2hLTDZDeVV4QUlSbUU5MVQySUJ4TzlCYVR4dVN3NnVETXFqb2NZR3JKRzZuYlllREViRHUzVjFzYWVHdG1OLzdyS01YekcvTzIwY0wzWFJyMlBkM292bUQxeVhzeU9YUTV4ejFodmx6TlhON0dpL3JBM1Y1Y3RvMjZ6Y0kvc21jdFU3M2tXU0d4Y1NpNlFqc1lnT2lRVUNtMDkxVDJJQnhHM3gxbE81Ymp0WFV0SzRvcFRsTkVqZDduTzU1WXgyUzUzdmZtOVBMRkxTdk5zYUQzTTkrdXYvMG0zU2FTVXVWL3FscVgwczhEbW5ablh1MnB4T2VwYVZXSVlWZTZSM1duSy9XelR4UWptUVdDUWRpVVYwU0N3UTJIeXFleElMSUZaMXhybmYxdUJ0WDZjemk5RUdlWFRJT3A2dlM2L3ZMRS81aVVYRGlsMjVocmRLU2lKY1IvdFltK0hkRzQwRUtIaGljVmRYN21tRmJydEVsZU9xdWF5cmZidDRhaEVERW91a0k3R0lEb2tGQXB0UGRVOWlBY1JwU2JhUkxYTHB5RGJ0eG01TlkyN21wZGtUYmJMSTg3UDVpY1hhcFExeTEzNnJFVDhWNFF4ZTltUHhsRFF1dTFmcTJxMXVVY1hPT2ZhWk1zZWtlYVZtV2RTVEV5dDVtaXRQbHkvNEk3Rkl1a29tRm5VYlpOWFdRN0pQemFjOWZUM3p1YmtadVRReEpnTkhEa2xUNHdhOUUrTFM5VkxYMUNIdGZhZGtlTUthci91NlhMMXlVWWFQSDVOV05WZDNPVThDQ1U4c0Z1KzBUOXNZSkl3TGc5c01MQ0VTbUNYMnUwcXJIZnZLU2pXLytqSHBIYmtzbDh5WlNUSnpxNStUZzEyZHNuYjEraUoxczFFYWR2Wms1bWZQN2svWE0vT1A5L1ZJODZiTlBoZkVJQnBrU2VNZWFlbFNzNE5reXBqOURXT2ZTcWw5YXFlYS83MzRzaUtyK3lUdTl4Vk1MSExubCt0eXNNblJhTkU4djFUVE5yS2Zad2UyMm82VHBRK2FkWEF4WFFkV09LZnVyZGxrM2YxMXpySzB4dGpuMjZUMXlLQU1qK2JtOVorZG5wS3pRMnBPLzEyeVBPVDdEblRMcXZOK252VEEyOTA5dVhjNFNHNTl4dE96SkhWTFk3VmZkMjdkTEszWnZ2OFJOSnpUNjlTYzYzWTBOeWlObnVXM0p4YURtVVoyZmJlY3RlcjVlRVIzOUcxZG1hNGExMWExek9DSmhmMjlGNmQ4MWlXb05iTDJ1TzE4dDFwM2VRaUx4Q0xwS3BKWXJKSGxXNC9KMmV5ald1KzRPblJJVm9YdS85Z2dpNXNPeWNCRWdMbjAxVXdRT3plWDUvRWxpVVdCWEdKaGE4RFViWlNtL1dQWng4bmVjVjNHKzlvSysvZ2FEWklHeHl3ZFhqRTdrWkttMEM4M012YW54bTdwRGJJL3FaaWJrb0gyYmI3MVVKNUdhMEwyKzdnU2kwMVdBM2VOMUVWd2ZxbW1iZVRXV0s5ZDNTbTlWOXdYbmRlZ3Y5V2VXS2ozUW1UK3JiYStUZmFOQmlublpla05NVHVUYmxsTFNpelNNMG1kYzd6dndEdG1SMVBwZHhTRVBrOGs0Zml6angrSTRCcHVyVnVEYlFwcGF4L3hQL2F0Qk9SQmFUcGgvZHM1ZWJTa3NSNTJhNlRoaURYVFZhNGhYN2MzNk9EdC9DY1crdVZSWGFzdUcwbjM5WFNDNmwwM0tCY1NpNlFyZTJMeG9LdzlrcHMzZXZiS21QUWU2WkdXM1ozeXFKb3Z1dXVZOURwZVZETTdla2p1Q254WFliMDBkSTNselRWOWRmU1U3T3ZxbHVhZGJkSzBzek45eHprMWtmOGI0MzFsZUlOcndoT0xtaFdiWlZYVERtbklhclBOY25GT1d2UCtabWpjSmt2Y3RrTkppY1ZNcGhHMllvZDBqdWI2NzZxNTFmZDFIWktXOXN6YzRaMTlwd3JtVmI5Nm9pTTN0Wjk2QzY5dE9zWFo2WXN5ME5jdjdYc3pjN08zcXYxcHlERlArZlE1YVE3OFRnUWphZW5LbndNK3ZjL3VOOHE0czBPYXR1eVJwcTBkNmYxMndMSGZxbko2RFhTTXJPNlR1Ti9Ia2xpSTJmYzd1dk5MTlcyanZQT3MwUkN2WGQwdHcvWkVlMDdka1Q4bkF5ZE9TV3BvVERxYjhwUHJYR0p4WGZZMU5jaWlwdjVjb201ODkreUpZK1l4MVNuTjZlUHlYRUVpUDI2YzQ0SThFZFF0YStqRVl0azJhYmRQSzVwK3VWbEtPbzMxZVZUVnUzSDhOcmYzcEorVTVOL2NtSkxlclJzQ1RwT2FuT1BQbmhDZjNiMGh1dVZ1SFpUeGljdUdpN0p2azFmU1pULzJjMDhEYW8xdGJ0WHQrTjdOZW1WWnRrY0diTnZmcXIvbGdST0xlMjNkczY0WEpxNm9PaVFXU1ZmV3hHS3pOT3czRC83cE1XbmZzdEh6anMyaWRaMHlZTHVETmQ2MU9jQUpmbjF1K2FJYURNZDgzb3lwM3JaNUtQODM5dXYzUmMyVDhNU2lVS252c1NndHNkaTNxVmxhemFUaTB0QWhXZXY1SkdHOUxOK2FzalZrMUF3anhnVno2VVpwdGdZVkdzbEMreGJ2TzRBMUszY1pqUXRiQW1MVVhmR0JoR3RrbFcxL2tpdW5wSFdUZnpjSjlYYmJnN1k3bHNIM0taMysrd25iNzJOS0xBYTJiTWh0cjdLY1g1SzdqZkxPcysxdDBqbGgvVTVLbXB1ODZ5SDcvVTI1Z2JBRFhUMXlObjJzVGNuQTNsM2UzWGFXYnBDR3ZlZHNqZkhyTXR5K3NXZzk2cFkxM0hsTjNTM1BIZmRYaDNwazdVcnZKNVkxeTVxbDZZajlSc0psNld3czlvUXpTY2RmZ3pRY0NmSmtvVnp5RTRzbTYybmcwbVpwdDVMeUsvMnlTbU44VXU0YWNsMTZ0K1NTZ3VYWkFka0Jab1ZhMTVON3FuUGxtRFF3THFLcWtWZ2tYUmtUaS9HUlRIZVgyWWxqc2piQTQ4ZWFldHVkckFDRG9wWnNQWldiblVIZExRNXlzbGl4eTNZWGNrcjJPZStPNlNDeEtOeEd0a0dGNHhOVGtubHphYkE3bllzMnBXeHZoVDhtTGViRlhNMUIzaERrY1hhZDdlS21FcHNpQXdscmJRTVdaY0w0amFCZDhwWVo5WkZ0T0Z3TTJNZTU5RVpyNHZiN21CS0xzMFBueW5wK1NmSTJzdGZEMWVsTVEvcVN1aHNlc0l6MnhDS3pmaGVsdlRIWW5kekZXMnpINWR5WU5CZHIxR21XTmN6NXByYnBXTGJlWjRjNmkweVZtdHQvQzZaWWpYSGJoaE45TjU5dzdNZit1VnhpY2F0M1FoREswczJlQ2NwZElSSUxsUXcySHJmZmFPb3BvY3Mxa29MRUl1bkttRmlrWTNwUW1nS2Y3T3g5S1YwR1o5b3RzODBuUGRvVG91dFVaazVyYTNDWnVvaEU5bWlheEtLQVBiSElYT3c3UXRUM2c5STA1T2kvYk94UFllWm5yOTFrbXhyd3lEYWZ1NnZyYmYyQ3c4OVB2bWhMYmc3NThmYU5nZGF0cExwUDRuNGZVMkpSMXZOTHdyZVJzeDVtUjRxOWI4RHgvYnpFWWliZ1c1WnoyMXYxTWJlaTJKU2J1bVVOZnI1cGtGWFo3YXZHZElVNWhoKzBUYkZxZk5kclFHN2lqcitOdG9IYmd6SE1VSlNmV09RbE5vNHVUS1cwTGV5SjRsbkhlVFhYdlNub203ZTNTYnQ5RE5IMFJkbTNjNXNzWnJhM3FrTmlrWFJsVFN4bVF0K3BxTEdkU0x6N1pqYmszYTBJZHdGUjhnZURlVjVFd2lLeEtKQ2ZXQlMvdSttMGFPc3AyL2RWLzlpUVV4alg3WkplcTZ4K2R5S1hicE45MXVjbURvV2ZmNzNPZGhIMW5aNVJwKzRUdXQvSGxsaVU2L3lTL0cyVVh3L2hFMkY3WWpGYnlubmYvdDZFdVZONWQ2cWpMbXZ3ODgxNmFjcmV2ZmVieWNpZC9WeFRNRE5WQmJkdE9NM1NucDI5S1NVTkZXOGsyNDk5NXhNVGU2Slh5dXhKdHBzOWM0V0R3RmZ0dHkwNzZEbW5ybG1hVDlqZVRxN0NTREI2dXpxa29kNnJPeHVTaHNRaTZjcVpXSXlXMEVDemxXZTJiNWY3Z1Y2M0kzZFJLN0hNcXMrbDlUaC9mRytRTzh3QmtGZ1VzQ2NXSlUwOXVOcldON2FrT2NNMzVLWWE5TDN3cnBmbDFxRGNkUStXY0lHeFhlQUR2UmlxaExwUDZuNmYxN2pRRGYvcE1pdHlmcW1DYlpSWER5WDhqajJ4U0pVMG1OWGV5RFlTZnA4RVQ3ZXN3YzgzYTZUeGhQVkQ1M3lUSFZjcmQwaHplN2UwR0pyY1pvaEs1UEZuVHl5T1NZUDI4c0x2Qi9iRW91RFl6WnNtMXUrSnNkdjJ5RTFiNi9aVUxDOXBDWFV6WTQzVWJlbVJnU3VGNTZ6TVJCM0c5bS9hekpPTUJDT3hTTG95SmhabjIwdVlvV0twN1E2eng1M2ZHdHVNRSs1M2xvTDh6bzdjeFNyUUhlWUFTQ3dLNVBXejlYMkRxNGVWblRLc3RYK3F1MTdXQWpJdlZvcGt1eFN3elNVL2NVaVdsNkh1RTd2Zng1UllsT3Y4VWczYnlGNFB3eVhNQkpRM2VMdkVXWEpxMXVYR0pQazFHblhMR3VaOGs1c3BxSVNubXduWnR1RWtQTEd3andGUjc4TUlmUDYxSjY3dTNkcHlnOVpMZlVxNlh1bzJkVXJuQ2Njc2d0bVlrYk1uK3FWbFMzT1IyZDlRYVNRV1NaZTROMi9iVHJ3ZTVjbk5CbkZSV2tydWRtRjdhVTZnaG1BQUpCWUY3SW5Gd1NhOS9iUDRIV1kzYTZUeHVGV0IvbDAyOUpRL3NVanNmcC9YdUppUmdhNE9lWFJucVhiSmNwK0xlQ1hPTDlXd2pYVHJJWXJFUW5YL3l5WnB4cm5KcXk2MXQxbVk4NXJ0NVd4cVlIbHJ3QUhwUVNUeitFdFNZdUZlTDdXMmZTMXdZbW52YXVjeEhxVWh3dTZYTmVwbHErYkxHcTJYUXViRjNHVko3ZStRVlN1aWVwTTRkSkJZSkYzVkpSYnJiWSs3MWVBck5TOTVLVHJsb05VUW5ENG1xNktvU3hLTEF2TXBzYWlwV3krTFZteVFKU3MzU2wyOXcrbzlzcys2d0pjbHNVandmaC9UR0l2a0pSYVYyMGFKU0N4dXRjL1kweU4zbFd1YmhUcXZPV1o0VWkvWlBGNzhyZXZGSmZYNFMzNWlvY2F2ZGRyUGpRR3VNNHUzV3R2UTY3MFREWkVtRnZubFhTOTFqWHVrWmY4cGw1ZHVxaW1aZDlCTkttWWtGa2xYZFltRjdZNVBWS0g2M2tkUmx5UVdCYW81c2FoWjBTeHJkL2ZJd1JOamNtazZSRmVmc2lRV0NkN3ZTU3dxdm8yU2tWaHNrR1piL1hpTlg2cHNZcEhaSDlOdlluZmVlWjYrTEttK2Ztblp1a3Z1Q2oxUU42bkhYNUlHYjNzZiszWHRGODNQekFTWWF0ZFcxOU5lNzV5bzFEbG5qZFExZFVqbjBGVCt5eEJIRGpGZGJZeElMSkt1NmhJTFc1ZVRSSjNnN3lXeGNGR05pVVhOaW0zUzNPZDhLMitJS0V0aWtlRDluc1NpNHRzb0dZbEZmdjk1cjRrVktwOVltSlp0bHNiMmxBeTdETkpWTVR0OVVRYjJkMHRqb01rYWtucjgyY3FsdGtGQ0U0dC9XTkVtS1hNYnpwN1k0enUycE1iMlBpRTFjNXZYaXdjcmRjNnhmays5Wk5QK01sUTFiWEtRcHkrSUhvbEYwbFZ6WW5HbEo2SSs0aEVoc1NoUWJZbkZvc1pETW14Ly9HMDJQcG8yTmN2eWxRL0tvanF2UHJibEhtT1I0UDJleEtMaTI0akVJdHordWFoK216VHU3cEY5Sjhaa3ZLQjdTK1l0NEMxTmZnbEdVbzgvK3d2eUNxZGtMYitneC80YWFlaXpabkh5bTZCaGphdzk3amNZUE96dlJxeHVzN1NNNUpLTHM1NkpEOHFKeENMcHFpNnhzTDBRYUxvL29qN2lFYkVuRm4wa0ZrbzFKUmJwRjFobHUwOU15VUI3bUw2MDVVNHNFcnpmazFoVWZCc2xJN0hZSU0wQnBuS09QN0VvM0Y4emlVYS9ERXpZbjJaY2w3UDdkM2dzUDZuSGpsdHQwd0FBSUFCSlJFRlVuMzJzd1l4MHJxdjg3d2M5OXZPbTJ1M3lhSkRiei9mSC9aNXN4SlJZcE12WWxudG4wWFFwVTZCREY0bEYwbFZkWW1HL1F4UCtKVWhsWlp1UnBMUkdjSkh0VSt5aVNtTGhJbWhpWWU5RGZWbjJOWVZ0YkpVN3NVandmazlpVWZGdGxJekV3dGEvLzBwL1FnWnZoNVY1cDRIOUtlWFpybWFYZ2Q3SlBmNFc3eHpMbHIyazZYeTlscnZsbUF5UFhwU3pvMlBTNlRrdUlzeXhieHVUNHpGMklqZGQ4SlIwTnZyTndCUmpZcUdTdWV3N05OU1lFV2FLcWpRU2k2U3J1c1RDL2piUHFRamZIaHlCWlczQms0Q2diQzhZa3VONy9HYzJJYkZ3RVN5eFVQMTZyVEVWbDQ1c0syRUdtWEluRmduZTcwa3NLcjZORXBGWUxOc1Q2R2xxc2hNTHM0d3JPMlFnbTF5NGRjRko4UEZudTBiTVJ2aHVtdHg3SXZ5ZWhJUTc5aGR0T2VVOTI1Tjk5cWlpTDc4TStydnF2SHhkWnVjTVY2SjcwclJvNnpsclp6R1N1V2pmbDRMaVNDeVNydW9TQzNWUW44cit4dG4ycU40ZUhJVm02YlF1VGhITjBLSFcxUW8xa00zMzh5UVdMb0lsRm5YWk8yVXpSZTZVZVNuL2V5eVN1OStUV0ZSNkd5VWhzYkFuNDBGZmtKZlV4RUxKbmF2Yzcvd245L2l6VGZzYjJUZ0wrMnhUZms5b1FoNzdkVHRrbjNXTmRDU2ppN1lNWnBPTzR2dEowTisxUFNVcDVXM3NIbXFOc2xxUnJIMWhZU0N4U0xvcVRDenNNMHlrSDhFblptWUcrOEN6SU5QcUZhUGVHbTFiWHJFR0w0bUY2ellKa2xpc3l0NmR1eWd0SzBzb3AzT3U5bkxVZldMM2V4S0xTbStqK0JNTCs1dVJyMHZ2RnU5elhhVVNpOFZObmRMUzNtM29LRzBxVU51ZC82djd0OFcyYlV1Um04NVZqVjlvMXU2R2EzK3J1djlUa1BESHZyMjdVKzZOMnZadVVrSEdMUVQ5M1FaWnRkOTYwbVRzcDV0MHI4a1pTMnoxWGRwNUNEcElMSkt1R2hNTDFZRHZ5NTBzVWhIMks5VlZ1eW1WdllzM2E1VGZkN0Ixc2JwVWc0bXRiUlBrUWxaS1ltR2YxV1VoSnhiN2JkMGNTaGdBdWRoMk56TndZaEc2N3BPNjM4L2p4Q0toMnlqS3hLS2tocWo5enZQY0tXbjBteFNoUW9sRjdxbWpjYTRwcFFGcEd5T25uc0RFdFcxTFluOVR0Ym81c2xxbjMvK0RlVGUwL091eWhHUGZPS2NQVy9YY3R5UFQ3ZFNXMUYwS3REK0dHRFJ1bTc1V1BTWHg3MklWaFAwcFNHblhDK2doc1VpNnFrd3NEUFdkTW14OWJtNnNoQlBwZWxuVjNpT1BybzdtRGtiV1V2dDg1K3JpczdHMHUwZDF6ZEkrYWx2T3pnQVhzZENKeFJyYjIyUkRQQ2FlaDRuRjRwMjVQclBlYzZlN3ExbmRuZHNYVmZpOGhWaTc3aE81MzgvWHhDSzUyeWpLeENKOEdSdnk3cEJmUGJMRGQweFNwUktMbXFaanVaczZ2ak1LdWN1OTdkbG5FSFFpajcrTUpUdHRieHlmNkplR0VydjlMTjR5bUh1SHoyaDNSR01kOHVzZysyVGZTRXFiVnF5eERZYjJlSHUzMXUrcVJNRDY3SFVaM3VzMk9ML0UrcG5vNFYwV01TQ3hTTHBxVFN5TUU4dnk5ckhjaVhUNm5EUUhQbGtiSi9jdTg3dHpRVTlrd2RXdTY4a051SllwNmQyNU9keUpiTmsyYVIyYXlTNWhkcWpJTkxPV0V2b2kzN1cvaE5rdDVtRmk4UThyTzdOMzBkSU5odnBnZGFIZWU1Rnl6b3NmY0RyS2t1bytrZnY5ZkUwc2tydU5JazBzVkZ4SlNlUEtvUHQ4Zis3OE5uZE9IbDFaNW0wVzlIeXoxRDdXd0RqdmJ0a1EvSHl4WW84Y3RMb3kralp1azNqOFdSNDB6blcyNjhab3Y2eGRFUzVoWEx6cG1JeG5FNmVMMGxvMGNTcnQyTGMvUlRpN3Z6ODdmV3Z3d2VmaGZyZW0zbjd6eDBndXVuYkprdEFKUVlNczJXS3JuL1RUbkZKblZJTU9Fb3VrcTlyRVFqRk9wSDFXUDE5MUlyd3N2YnUzK2I1N29MWitqN1NQNUU2K2w0ekdhalN6YU5nMVNOM09VM2x2YnI1MDRwQTBybDd2ZjZGYitxQ3MydG1mLzRLMmlXUEI3enlWa0ZqVTJob1lzK294Y1pDVDdYeE1MSXpQcmRwdjI1ZW14NlI5MDBiUGhMQjI1UTVwUHBKN08vZWx2a095THp1bnYvZkx3clRyUHBINy9meE5MSks2amFKTUxDNk5Yc3o4YjJPZjc5eTYyV2UvV0MvTGQ2YnlHbFpCbnFSV2N2QzJ1cW1UN1Q2cXl0ZTFSK3A4ajBXanNkalVMUVBacE1Lb2ovM0Zab1ZMMnZGblU3ZFptbTAzcFZSeXNNOG8yNUlpNTZQYWV1TjgxbmZSbG14T3ljRXRRYlpWcWNlK2ZYcnYzUFlLUGk0eC9POHVhdXEzdmFmSU9KNG5Ua243MXVKMWszN3Z5ZW85MG5yOHNxMStybnRNUzR4S0lMRkl1cXBPTE81Tk44Ylg3citZZi9mTk9OR24rbnFrWlhlSE5HM1pJNDFiTzZSNWI3LzBqa3psblJqR2ord3Eyd3dqMXQwTis0a3NmVEs3TWlZRFIvcWx0YjFUbW5kMnlLTzdPNldscTE4T25yZ29seHlmdlRwMEtOd2d4RkptVDZtekRUbzJUN2I3OW5aTHN5clgzaDVwMytJeTQ4VzhUQ3p1VGQveHRMOVYxZHBldlVkNmpPM1ZiZFRISVdrL01paXBDZHVGVzExZzFINjBWQTIwdC80dDROM0lVdW8ra2Z1OS9TSS9Jd05keG42OVU1OUt4SjIvVmZIelMwSzNVYlNEdHpmS1hlM25jamRDMU52bWpYMitaV2ViTkpwbGJPbEtTZXFLNDJWeVhkc0NOWTRyUFN2VVlrY0RVdTJUWjA4Y2szYmpuTnUwZFU5Nm5acDJka3JyZm1PZEp2S1A5MHNuT2dMZVhFblM4ZWNzMjBacE91SXMyNVJSQnlucFRPKzc2dmhTQTkxN3BMTnZVSVlkZFpDK3FkSVVkRHVWZmxQQjN2VXNIYUc2RlpYMnU3V3JPK1NnYzMyTi9XTjhaRkFPN3UvSnZ5N3ZWZlZ6U3M1ZWNYNSt5a2drUS9aQ1FLUklMSkt1MmhPTHRNeGRwOTZDRTRaSFhEbVhiaEJVNHNSUXMySmIrazdRMWVLbHlzYnNsVk5HK1VvNGNaVTRMYU82a3pQdVZaYStIWVdOK2ZtYVdLVFhiYU0wT2kvS1huVmpOREpiTitXNlcrUm15UWsrMDA3b3VrL2tmbSsveUVjWGJ0TXJ4M0YrU2VJMmluNVdxQWFqUVg1SUJnb2FVUzR4ZDFFT2JnMitIOFV4M1d6TnlsM1NlbUlxMEhHY1hhZmR6U0dmSWlUbCtQTXUyOEhSRU1lbGtYeWs5cmZKOGxCak16U2VWdVlOT0EvN2NqK04zMTI2WHU3YTJ1TjQ2M3FRTUJMVTQ0ZGs3Y3JveDhjZ0hCS0xwSnNYaVlWbGpTeHBiSk9XL1lPU0dwMlNxM09aRThmczNJeGNHbFZQQ2c3Sm81czJ5NklZQmx2VkxOc3NEVHU3MDNkQWhpZHlaUlBqLzErZHZpeG5od1psWDFlbk5LN2JVUHFGUjJPK2QvV292clh2bkl4ZnlRMXl1M3Jsb2d6c2RobklQSjhUaTJ4OTdKQkh1MUl5TUhyWjJGYldoVmZ0Uitla2QzKzNORFVXYnFjYW93NWIyZzlKNjk1dWFka1UvQ0lacXU0VHVkL1A3OFFpaWR1b2JOUE5HbzJ1NVpzNnBUMTduc3A4Wm5aNnlqaEhwYVI5OXk2cEN6a29PTTczV05UV2I1T21kdlZFZU16WWRqTzJBZXRHdlU4WTlkN1hJODFibWdOMGgwbnk4ZWZIU0JqWDdaTG1ybVBTTzNSUkxrM242a0J0MDNGMVBqdWk2aUJJbHlEMzVaZmVEZEkyWmJGNlYwYWxFaHJiTWhZWiswZmo3aDdaZC94Yy9uWFpWajlxSDJuWnVzTkl1SGpEZGxLUVdBQUFrQ0NSdkhrYkFHSkFZZ0VBUUlLUVdBQ29WaVFXQUFBa0NJa0ZnR3BGWWdFQVFJS1FXQUNvVmlRV0FBQWtDSWtGZ0dwRllnRUFRSUtRV0FDb1ZpUVdBQUFrQ0lrRmdHcEZZZ0VBUUlLUVdBQ29WaVFXQUFBa0NJa0ZnR3BGWWdFQVFJS1FXQUNvVmlRV0FBQUFBTFNSV0FBQUFBRFFSbUlCQUFBQVFCdUpCUUFBQUFCdEpCWUFBQUFBdEpGWUFBQUFBTkJHWWdFQUFBQkFHNGtGQUFBQUFHMGtGZ0FBQUFDMGtWZ0FBQUFBMEVaaUFRQUFBRUFiaVFVQUFBQUFiU1FXQUFBQUFMU1JXQUFBQUFEUVJtSUJBQUFBUUJ1SkJRQUFBQUJ0SkJZQUFBQUF0SkZZQUFBQUFOQkdZZ0VBQUFCQUc0a0ZBQUFBQUcwa0ZnQUFBQUMwa1ZnQUFBQUEwRVppQVFBQUFFQWJpUVVBQUFBQWJTUVdBQUFBQUxTUldBQUFBQURRUm1LQkJlK2ZmclJOYWx0MlMrMnVKeGN1WS8zLzZZYy84YStuVFk5UlQwbWh0dGUvUDhiMkFwSWt3SEVKekhja0ZsalFNa25Gay9McHVDOUlNVXV2djFFUC8vU29lM0x4ZjZsNlNrQTVZYmViN1FVa2p2ZHhDU3dFSkJaWTBOUWRwb1dlVkZneXljVnUxM3I2OUJQVVV4S3A3Y0wyQXBMRjY3Z0VGZ0lTQ3l4b2NWK0Frb2g2cWk1c0x5QjU0cjYyQVhFaHNjQ0NGdmZGSjRtb3ArckM5Z0tTSis1ckd4QVhFZ3NzYUhGZmZKS0llcW91YkM4Z2VlSyt0Z0Z4SWJIQWdoYjN4U2VKcUtmcXd2WUNraWZ1YXhzUUZ4SUxMR2h4WDN5U2lIcXFMbXd2SUhuaXZyWUJjU0d4d0lJVzk4VW5pYWluNnNMMkFwSW43bXNiRUJjU0N5eG9jVjk4a2lpSjlYVGIwUXNpSDUyWDd6OFZmLzBrcmV4bDMxN1BucER6TWlON3UrS3Z5MnJlVGxoWTRyNjJBWEVoc2NDQ0Z1cGk4Y3pyY2xLY01TZGQzYVZlZko2VzFhOGRsODFkVDhkK0VTeDJRWXlzbnA0MS9qYjN2anp6bTNCbFNueWp6MmU5RXA5WU9MZlhSM055NGQwenNubnZIblBkS3BSWVJINThsV3NmY3h5M0plN1R2bVhwT2k1SEoyZU10VGRxWUdaU2pxWmVrZHNxVUFmbDlwbG5lK1JBZXIwK2tnc1hUa2g5cTkrKzhKRWNQYkRIOXUrL2x1MlRSbjJNdkJMN2VnUVI5N1VOaUF1SkJSYTBVQmNMcytGejh1UkJXZDM5aW1tZjNPRjFjU3pxUmRrN0kzSSs5WHpzRjhGaUY4VEk2cWwxbi94NDZMaXNiZ3RYcHNRbkZqN3JWUzJKaGJXOTFoOStYYm9tUHhLWk9TdXIxVGFyY0dJUjNmRlZybjNNY2R5V3VFOTdhdXVUTjQzcW54dzdJWThjZUVXKy85cFpPZi9SUjNMNjJLOHJVZy9sOHd2NS92bVBaRzV5V0w3ZmJTUVkxejR5NnRCam5VZ3NnS3BGWW9FRkxkVEZ3dlZpbC9QNTN4eVhvKy9QeVp5NjQzdmhoTm5RMkNOM0hCNldrOFpGTlAzdlk5WmR1bGVrYTg1MlgxWmRMTHZQeWpWNVQzNzhUR1o1WDM1TlhVWFB5R3ExL0s0ek1tbjg5YzB4NC85KzlHZDVwTlhyOTM0aDljZitMT2ZuakpiSlJ6TnllcVJQdmg2eVFWdldlckkzVXRQck95bGRKOCtueXpzMzg1N3M3YmFlM2hqMWR2U3MrZStUY25Uc2ZZOUduMWY5T3FUcjczMTU4L3lrVEJxTnRMbHJGNlMxNnhlMnYrWFhyYnBqL0ZxNmJqK1N5WGZQeUNQUDdrblg3U05qeG5jdjlKbDNqek1Obld1blg1SFA1RFcrL2N2dXV0MWN5aERuOXZwTTl4bWpOTmN5ZCtFZGlZVjczUlRibmw3N2EvRGp5LzkzUFk2Ymt2ZXhFTWR0UlBXVHY2OWVrNzNaSnlCN3BENzFaM250NUN2eWViLzl1T1RmOWo1bmVDNnZZSDhOY3Q1NVdoNjU4SkZjTStyc00wK3BZK2NqT2ZsYVI0aHpTR0ZpRWZSWThsd1B6LzJ5UE9kUllDRWdzY0NDVmtvRDdMWER2ekF1akh0TTV0L2FYcFdqUm9Qand2blhaWDEzbnh4NDM3aUFuajhvbjMvMnVOSG9tSk0zVTYvSVBkM0g1VTNqTTVORCs5S05oYzgvODZvY21ERytNL1NLZkxsMVQ0REV3dmp1aFVIWmZIU2ZmTm5yOTM0em5MNm9Iamo2b256ZC9MMndUMFRLV2s4RmlZVzFEajJ5VjkwbG56d3VkNlEvZDF4T0cvOTVZY1Q0MjRHK3pCMTB0OFRDczM3ZEdtc2ZwZStHZjMzdks3TDlndkhCYThOUy81UmIzZmJJYTBhRHdpclhNKytxenc3S1BVOWw3bXJQcVhLb1JtWmJuNXcwR2lNSHV2ZmtyNWRmMmIyMm03TU1jVzZ2MWwvTCt0T3FrZjJlYkg3R3NjMTg2c1ozZTNxdGQrRGpxOWp2K2lVV0pleGpZWTdiS09ySHJ0VklYb3psWDVzOEk1dTdmNTFmUjM3N2NhbS83WFhPOEZ1ZWMzOE5lTjY1N2NCWkl5RzZKdWVOaHZ6azJPdmVqWFhYZmVGNWFYM2ZsbGdFUFpiODFxUEM1MUZnSVNDeHdJSVd2Z0htaUhkZlR6Y0MwdzFPdVNDYnpidXd0LzN1Z25FRlBDdXJmOWtoOS96bTErWWQ3bC9JOThkVVM2YkhiQ3c0dWxRVVRTemVsKzNQbXN2MytyMlgxQVZ4Um83KzdrWDVzbkV4L254YmgzRmhkYjhEWE42R3Fuczl1VDJ4c05icGptTzU5ZjN5YSs4Wmpidy9aeHJ3MXZxNUpSYXRmdlhyYkpEbGZpdlRtSHBmV3ZlNjFPM3Y4bis3ZHErOTRhaTZxV1NTaWM4Zi9yUE16WjJYOVUvbHI1ZGYyVDIzMjh2NVpZaDlleG1OdjlkZWUxNCs0OWhtdm5YanN6MDkxL3VwSXVXd2pxK2l2K3YveENMMFB1YTdYem1PMndqcXg3bE5QdlBNUVdrOS8zNDZHWkM1U1RudzJyNU1XWHoyNDVKLyt6ZnU1d3pmNVRtT0dhOWw1SytYZWtKMDN0Z0xKSjIwL2xoOXQvVjVXWC8wRmJuRGVWeTdqcmV4UFNYeTI2ZGVEbjQ4Vi9vOENpd0VKQlpZMEVwcGdKMDh0czlvZEx5WThXeW1POEVkcWZkZExvSHFNWHlIckU3OVdVN1BxRWZ0NWorWG5GallHZ2Fldi9jTHVlZTFzOGJ2cVIrYmsvTmp4NlUrWk4vdmN0YVRYMkpoWDkrdnEvV2JHWlo3ekdWNjkzLzNxMThiWjROTTNhMVdBNE83Q3YvbS9PMTBNcUc2WlJ4V0RZdW5aZk83SDhuazBDdXlmbVJPcnAxL05mTmJ0dlh5Szd2bmRudkZVYjQ0dDlkZW8wRnRyMmVmZGN1ckc1L3Q2YjIvQnR0dml2OXVzTVFpK0Q0VzRyaU5vSDQ4dDAzcnIyWDFhK2ZOTVJiUCsrN0hwZisyK3puRGQzbk9jbmdzSXk5WitzMmcwWVNma1FPSFg1SHQ3NnF4Rmllay9vQ3huSS9NNUx6WU9lUTNyMHJYdFZ4aUVmUlk4bHVQU3A5SGdZV0F4QUlMV3ZnR21Ic2Y4TXpkemd2eVk2TlJkc2V6cG1lZWx2Lzc4SG1qWVRJcHJiOVIvYUQzcEFjdmVpY1daN3d2L280THVkZnZmZTZaRjZYK054M3lHZU8zYnR2YkowZG5QTG9HbGIyaEdueU1oZHY2cHU4eXpwM05Oamk4RW92UCs5YXZqYVArUG1QMnc4NDlzWERXN1huM083VzdNbmU2NTY2OUp5ZG5NbDAxbk92bFYzYXY3ZmFaZ29aYVFyWlh3YnI1MUkzdjl2Ulk3MURIbDlmditodzNKZTVqL3Z1VjN4T0wwdXJIdnE1My9PNjhuRll6Sm1YM2RmWEVSREpQYjN6MjQxSi8rek1lNXd6ZjVUbkxFZUM4ODJYN1V4TFZCY240akJyek1QZHVYMkhYdndCakxJSWVTMzdyVWVuektMQVFrRmhnUVl1c0FmWk1qN3hwOWVQdDJpZnJYenNyYjU0K0tIZW1IN1cvTDExSFg1SFZSd2ZUZlhVbE8vZzMwMmY0Mm9YanNuN3YwK2JkeDQvazlOQ3JzdnBBcHIrdlYyTGgvWHQvVGplSTloNTRVYjcrR3pYelNuVW1GdWtwUEkxR3g4blVLL0wxWi9kbCtwSzdKQmEzK2RhdmpkazMvZnpwUGxsdDlUSFBHMk5ocTlzMnMyNVYzL3Z1Vi9QN1pKdnJkMXJkMkxRUHNzNGJZK0ZUZG8vdGRsdVZKQmErZGVPM1BiM1dPMmc1L0g3WDc3Z3BjUi96MzYrY3gyMEU5V09qN3V5ZlYvdXFzWXp2cTFtNmpnN0xhVFhHUTAwUzRMY2ZsL2pidDNtZE0veVc1Mnk4QnpqdlpNcWU2VjUweDdNdnl1YnpNK25uQTY1akY0SU0zZzU2TFBtdFI0WFBvOEJDUUdLQkJTM0tCdGpudTh6WlJZelBUTDUvWHJhcjJWcWVldDY0Z0w0djE5S3prWnlWTHRWNGVmK0VmTjM4emgyLyszTjZkaGMxczFCNkpwS1Q3NGxxSzZoWld3NmNmOTg3c2ZENlBUWEhmc3FhelVROXdqOFJVMWNvemNUQ1BtUFAzUHR5ZEd3eU0yamEyV1dpU1AzbUp4WXo4dVo1czM2dlhURHJ5NzF1YitzNjRUbUxUTGFCYzZFbjF6RDJtaFhLcGV5dTI2MWFFZ3UvdWluU2NIYmZYNE9YdzN1YitCdzNwZTVqWVk3YmlPckg3c3ZkSitUbzVEWGo5MVZQbkd0eWNxUlA3bWt0c2grWC9OdmU1d3pQNVJYc3IwSE9PNnA3MFhtemU1R3h2TWsveTk2Ujk0eDFWTzhBY1d6em9MTkNCVHlXL0k3blNwNUhnWVdBeEFJTFd0aEczRUl3TCt0Sm8rR2VkUE55ZThIZFBONlA1NXU0cjIxQVhFZ3NzS0RGZmZGSm9ubFpUL080UVRZdnR4ZmN6ZVA5ZUw2Sis5b0d4SVhFQWd0YTNCZWZKSnFYOVRTUEcyVHpjbnZCM1R6ZWorZWJ1Szl0UUZ4SUxMQ2d4WDN4U1NMcXFicXd2WURraWZ2YUJzU0Z4QUlMV3R3WG55U2lucW9MMnd0SW5yaXZiVUJjU0N5d29NVjk4VWtpNnFtNnNMMkE1SW43MmdiRWhjUUNDMXJjRjU4a29wNnFDOXNMU0o2NHIyMUFYRWdzc0tERmZmRkpJdXFwdXJDOWdPU0orOW9HeElYRUFndGFiY3Z1MkM5QVNmRnA5ZitmMkUwOVZRbTF2VDdkd3ZZQ2tzVHZ1QVFXQWhJTExHai85T2hQc2hlRHVDOUljVjhNMWY5WDllRlpUOGJGY3FIWFUxSjhlcmY2Lzd1TjdiS1Y3UVVrUkxIakVsZ0lTQ3l3NFAzVHBzZlNkK3JqdmlqRnlsai8vLzd2UC9hdnAzOS9MSDBuTHZheVFqNnR0dGNQbXRsZVFJSUVPUzZCK1k3RUFnQUFBSUEyRWdzQUFBQUEya2dzQUFBQUFHZ2pzUUFBQUFDZ2pjUUNBQUFBZ0RZU0N3QUFBQURhU0N3QUFBQUFhQ094QUFBQUFLQ054QUlBQUFDQU5oSUxBQUFBQU5wSUxBQUFBQUJvSTdFQUFBQUFvSTNFQWdBQUFJQTJFZ3NBQUFBQTJrZ3NBQUFBQUdnanNRQUFBQUNnamNRQ0FBQUFnRFlTQ3dBQUFBRGFTQ3dBQUFBQWFDT3hBQUFBQUtDTnhBSUFBQUNBTmhJTEFBQUFBTnBJTEFBQUFBQm9JN0VBQUFBQW9JM0VBZ0FBQUlBMkVnc0FBQUFBMmtnc0FBQUFBR2dqc1FBQUFBQ2dqY1FDQUFBQWdEWVNDd0FBQUFEYVNDd0FBQUFBYUNPeEFBQUFBS0NOeEFJQUFBQ0FOaElMQUFBQUFOcElMQUFBQUFCb0k3RUFBQUFBb0kzRUFnQUFBSUEyRWdzQUFBQUEya2dzQUFBQUFHZ2pzUUFBQUFDZ2pjUUNBQUFBZ0RZU0N3QUFBQURhU0N3QUFBQUFhQ094QUFBQUFLQ054QUlBQUFDQU5oSUxBQUFBQU5wSUxBQUFBQUJvSTdFQUFBQUFvSTNFQWdBQUFJQTJFZ3NBQUFBQTJrZ3NBQUFBQUdnanNRQUFBQUNnamNRQ0FBQUFnRFlTQ3dBQUFBRGFTQ3dBQUFBQWFDT3hBQUFBQUtDTnhBSUFBQUNBTmhJTEFBQUFBTnBJTEFBQUFBQm9JN0VBQUFBQW9JM0VBZ0FBQUlBMkVnc0FBQUFBMmtnc0FBQUFBR2o3aEJBRVFSQUVRUkFFUVdnR2lRVkJFQVJCRUFSQkVOcEJZa0VRQkVFUUJFRVFoSGFRV0JBRVFSQUVRUkFFb1Iwa0ZnUkJFQVJCRUFSQmFBZUpCVUVRQkVFUUJFRVEya0ZpUVJBRVFSQUVRUkNFZHBCWUVBUkJFQVJCRUFTaEhTUVdCRUVRQkVFUUJFRm9CNGtGUVJBRVFSQUVRUkRhUVdKQkVBUkJFQVJCRUlSMmtGZ1FCRUVRQkVFUUJLRWRKQllFUVJBRVFSQUVRV2dIaVFWQkVBUkJFQVJCRU5wQllrRVFCRUVRQkVFUWhIYVFXQkFFUVJBRVFSQUVvUjBrRmdSQkVBUkJFQVJCYUFlSkJVRVFCRUVRQkVFUTJrRmlRUkFFUVJBRVFSQ0VkcEJZRUFSQkVBUkJFQVNoSFNRV0JFRVFCRUVRQkVGb0I0a0ZRUkFFUVJBRVFSRGFRV0pCRUFSQkVBUkJFSVIya0ZnUUJFRVFCRUVRQktFZEpCWUVRUkFFUVJBRVFXZ0hpUVZCRUFSQkVBUkJFTnBCWWtFUUJFRVFCRUVRaEhhUVdCQUVRUkFFUVJBRW9SMGtGZ1JCRUFSQkVBUkJhQWVKQlVFUUJFRVFCRUVRMmtGaVFSQUVRUkFFUVJDRWRwQllFQVJCRUFSQkVBU2hIU1FXQkVFUUJFRVFCRUZvQjRrRlFSQUVRUkFFUVJEYVFXSkJFQVJCRUFSQkVJUjJrRmdRQkVFUUJFRVFCS0VkSkJZRVFSQUVRUkFFUVdnSGlRVkJFQVJCRUFSQkVOcEJZa0VRQkVFUUJFRVFoSGFRV0JBRVFSQUVRUkFFb1Iwa0ZnUkJFQVJCRUFSQmFBZUpCVUVRQkVFUUJFRVEya0ZpUVJCSmlBOHV5dTAvNlpOUG1HN2E5OWU0UzBRUUZZeS95WDA3Y3Z2L0o5citJbU94TG9jZ0NJSW9KVWdzSW9scE9YM3dXZG44Yi9mTEhmOXptWHptSC85WmF2OXhtWHorQzkrVyt2dGJaRy92dXpJWGFEbHpjcjczaGR4eVBta3M1NU5meVM2bmErQ3ZGVjVPd0ppZGx1NjNSdVFiejZXa2RzZHJjcE82b0QvK210ejg1RnR5KzRzajh0TlRWK1c5S0grdkt1TmplZWVQcDJTUlVUK2YyUEdHM1BuV3RNemEvMHhpVVIweCsxYzVlZEE0dHY2MVhtNWIvb0pjQ1B6RnpEbmlrWC85dG56NWYzNGxjMHorNHdyNThsY2VsczAvZjFQT3p4WmZndHN5ei9lK0xOc2IvMTNxdjNLUDNQWS8xSEtYeWZkN1MxbVdmNHk5OVhhdXNmNlQxK1QydHorTStCZElMQklkczMrU0h5OVYxeEhMVitUN0I0dDlxWnpYb1J2UzBXbmJ6ajk1U3paZEtYbGhCRUZFR0NRV3VuSHBUZm54OG1XMkU2NjcyLzcxV1RsNTFXYzVzMmZsbVg5ZFVXUTVYNUU3R252OEd6TlJMZWYvYisvc1lxSTY5elcrNzd3MDZZM3hTcStLTjRhYjVuQmhnem1tamJWSmd5ZHB3OFgyNC9RWVkydWFUV0pQTk8zdWpXMkN4S1NTbUYzWXNTbHVpSlo2UE9paEcrTm1IejltNHhRbU9zVTVnQUtXRkpUS3NKSEFNRkJtQXV6OW5MVm1CbGp2dXo1bXJaazFzOGJGODB1ZUM1M2huZlg1dnYvbi9maS90bGhDVDZnUDIycTFGYnl4TnAzdlEvMzRVdDYvV0RSZWpLRmNjL3hiYnN6a1Y5N3lGS3EwMTZtMkZ4Zm5OWitYb3JGdyt4cTh0Q1F4ZnE5RENlQS94SzZ0bXZlbzBxYXhtUHdSZGRucWlQSWFmTk5uTjh4U2pxZmpLeHdxcnpRb3F4REdJbzVURGRJN2ZXRU1nNjcrQm8xRjZaSkU3K2xxWFJ0aWFTd0szZzdSV0JCU3F0Qlk1RU9xRjhlb2NUZld6bmRhTVdKWTBEUytQNURkbkt4cTE0a2ZNVmZRY3V5d2lOYTI3cXlHUWxCdENJZEhYQjByS1J4Rk1CYU5OQllselZ4ZkR5NTljaEw3ZHBpODQzYU1oWk02WW5zTkxqM05WdUEwQWljT1pucC9qVlFBWXpIK0JOdDA3N01TeUxrNkRFbGpVYW9rKzc3Q3ZxM3ljMlpsTElyUkR0RllFRktxMEZqa3dYampFYkdCTDY5Qnc2MVJUQ1dTU01ZbTBQdHRIZlp0Rnh2OW94MXhYVGx6dHo3RGE5cHlkaWpsZEF3TDVld1h5cWxHWFovK2VOd3FKenNyZUhqN2ZuckswNXE2VU40Mmdvc2pNVHg4c1lEQmFBdzNJMk00M05RbEJpUm5JN2c0bTh0dkZoblhnK3IxcVZDYnpvWlE5VEpNaGRyQXhtTHEydzh0Z25lN3hpS0ozay9FbnQ1WEt6L0hwWHVqbUl2Rk1UWGNnMjhPN0JkKzU5VjNybG1VR1VlUFVwNTRYRzlnejd0MWFQZzJnSjRId3hoNU9vMjVuS1pWbWJHQ20rMUJ3NDRDOVhsdzc2ZG9MRXFTeEREcUtvMk1zYm14S0U0N1JHTkJTS2xDWTVFejA3ajBqbHc1Nm52ajV6cE9ZcWQyMU9KSWp6U3ZOSTZyNzJvcjdvUEc1VWlWOVd2SGZ5eFFPVFo0OFF3VlF1OTdDTWRNUnlLU3VDNk5iR3hwZHpNZ0tSREZEcXBwTEVxS3FhWVBSVU93NHlBT0hmOE0rNTFNaFlvRmNGUWJRTzM0REoyNjZaQVR5bnVyN2QzZGowOGZHTDlMYzdjK0Y5N2RWeXMrdzZVK2ZVZUZxeVNtVUswSjFEZlZCalNkQkFPNHVleldEOUZZbEI1SlBLbzNHeDB6TXhiRmFvZG9MQWdwVldnc2NtWVlwOHUxb3hYMTZEWDZXa0lKTHJUQnlKdlhNR1h4dWRwak9XVlVUcmJmYzZ1Y3JLemc3ZzF0RDJZQTVjRXN3VTFpRWxYYXh0NHlJRmxCZEh3Q3A5cDZVWDYrU3dsa1ZPUFNoUzBOWWV4dEgwTnIxR0tkaGhRSTd3NnJUZFVTSGc2TW9Mb2xoQzNxd21ubGVEZWZDMkYzMnhpdXYxaVJDb2loNW56MktWM2JibWZPVnpJRDVjRUY1VnhqYUd6dlJkbTVnR1FRcEhucTU1K2dSL3ZUQnNZaXNieUltNkhIMkh1aEc1dHIxYUJPdlE2OU9CeWN3cURaOVhzeGdqTHRzZW9qMlRTemlqblVmRzl6KzZwcGNIZ04zTHAzanE2bDVqUmVUS0grUmdRVkRjSFVOVnE5dnhXWEgrUE1RRHpucEFHcXNYaDF1MkltVGpUaiszdXJ5UmQreEtjNzdCdUxaTWRuUXFmQ3ZzWUo0eS8yZllVOTJpRHJ4SThHWHhwR25YYnhiUG5uNkp6TThlUWNFSTFFTkNPVElkU0VockJGTTBwWk5lQmczZFQ4REJvNysxQnhQbjJ2TnAwTm9xeGxBR2VHRnBSbjNZRWhjS3NjMjNoWkora3AxRE92bzY5Wk13VnFQNDRlT0pqZFdCU3RIWExaV0t3bUlHbGF2U2ZwNTJyYmhZaFMzMDdpb1ZsUFdBSHVyM29zcmJjSHNEdHpmOVY2UDMwYzZYcC9NSGhmMDVZK3hsM2hlUEt0LzEyOE5tNmRrM3pvMFVtY2FzKzhpMStzdjR0Vk4zN0J6ZGtTZW44Mk1EUVdPVE9LaGtwN3h1SWpiVVd6VUZrWUFBQVprRWxFUVZUN2JvYzRuMVFLS3ZhY0hqYjV2U1FDUjdROW14L2kwbVFCeXNtRzJuQ2YwNDVXUk5DYXRXSlpRdXRsVFUvbkY5Mm9NWXJJbHVOb3ZOSXRUYkdTMVlYeUcxUEd3WUpVeVZmY25zU1psaTd6c21ydm8yWk1HeFRrWnl5MnRUMUJ0ZlQzbTNNMUZpMlBjZmhDd1B3NHp2WGhvbEVqNVpXeHlQZmVPYnFXS2tuY3ZCM1dCTG5HMm54aENOZHptWG9YaXh2MG9Eb3pGaVAxMmtCc1AwNC9NUHVtRkdSVk51dldZaVdGMFlxM2xhQ3V3Q01WS1JiUjJLUjVCaHZHbENCQWZENDJ0VXpZYW9obng1NmcvS3paZlFwZzJ4VWw2TEJoQ053cXh6YWUxMGxhQ3Z6TUM2anQyL3JJZzdvT1lrUVl4VE14RnNWcWgxd3pGaXNZSFhoczhVeGxkRGFNR3FOUmVWZnZyeEl1Uko5aDl6bno0OWpVTUlCamx6VWRld1UxRm5sZUc3Zk9hWlhsUmJTMjM4ZG1xMk9wN1VaVlpNRmtSa1F4MzUrTkRZMUZ6aVRSYzBLYjlhSWFwMjBNK2U2ckh4Vy9vSHl1SFdxdS90WThZSGdrWk9hUTVxVzZWVTQyb21MRjladVdYMndGRm1xUFgyUG9HZXBWaGRXZUJla0x5d3VvdDZxUUpXMjVQS0Z2eUtWSzNwYlVBSCt0OTM5QkNTTENLTDl3SCtVTlFUR1lPQnRLLy8rRk1LckNDK212UzhHd1lTV1ZvN0d3ZCt5UGNWT3VRZk51V0J4ZUE3ZnVuYU5yYWJURzUwNHF2WEhaK2FBK0NEdy9oTHV1ekwxelppeDZQOWt2VEFscE1JdXgxT2tqMm1tVjJ6OUhRUGhjcVd1T2ErcWE4anIweGlZUWFLekRvY3I5MkxrMUhlanQzRkdONnVQTjZIenFVb0lFNlgxS2pTSXBQT3pVVG0wTW96NWJJeXhQbmJRakkwUGdWamwyS1lrNmFaWGlQdk1qMnZXRDVjcnpHSk9uQjVvWWkySzFReTRaaStqUWdEN1FWSHZBendYMUFXeXQ4cXpMditIYS9WV1luY0RlYkVHOHJBSWFpN3l2alZ2bmxFSXhGVmVNMTNycEZVVDFrRndIZXRWbWJFeG9MUExoNlRWVWErZFFaeFp2cHhaUEpxYnhxSzFlWEtTV3FhQzF6TFhWYUNyaVNoeHRNdzhLeEI3UXQvSHBQZmZMeVVaaXFFOTRDYmZjc01xaGF4LzFwZGUrMkdwNjJqTkRjVVFUSzBna0Z0RXo4RVRxOVFpZ0lpVGwwamVxNU0vMW9pWXlnNGV6U1VSbkYzQTNNaVQxd0hUaDhKaFJ6NytOOVFVbXdmQ204MkhzdlRLQTZyWStWSWRXRzlZY2pNWDVDRTROekdCUVBmWjU5ZGpsYTJEUWNMalpZMlZ6allVcjk4N0p0VXhNWXE4MndGUis3NkoyT3NyOGpLN1hzRHkwZ1B4eFppekV3R2svVHBzR1RrbDhmMEF6TDMzclNYd3ZOR3JpTktoWEswL2lJNnRNVTF1cjhYR0h5YlFyQnp5OEhkSmNRNDJCa0RvWHltNWJYZHRGTkxhSUkyOXFEMlg5U0J5ajgwbU12cGhCNisySVBtVzF6aEM0Vlk2VDh5K2hPcW1Zei94d3EyWXQwZHY0K0ZiNnZiTmpMSXJWRHJsaUxKWm5jRXdZZlEvaGNDU09OWis4dklqck44UmdWTzNjRUY1TjE5cWNwQkk0ZDBuUG0xci94ekE0cjVZVHg4M3dFQ3JrSUwxUXhzS05hK1BXT1NtTWhudUYzMHEvK3d1WVhWYmVSYlZ0REErZ1RQdCtuSHNzVHJmMnJNM1ltTkJZNU1uY3ZhK2tEQmNtMm5FU2w0WU5SalMrclJFcTY2TWQ1aFh4ZUtOWUVYOTh6LzF5c2hHTjlBb3ZYMW5RaFpkUFhvTnhyZyt0OHdaZmszc3M1Y3BEcnVSTk1sQkZwVXFxM09nY2NqSVdYZGdkaXNHNEE5ZWhzVEE1OW9SeVhOYlhvTWpHd3ExNzUrUmFqZzBKUFducGVjMFNTbm5hOC90Tnk0VEpmWEdDTTJPaHZwUGEzdHY5Wm1zc1VndGV0Y2FnUmpRV2liK0s2N1RzU0RFWHAwMFdnZHRDRGl5YXRBSDZBczVjc0hpV3RValA0Mi9PRGVoSDJXRFFPeW9iQXJmS3NVdXAxVWxGZStaSDhjMmI2NmIxdFNPQnRhbTd0b3hGa2RvaFY0eEZWRXlqYkp6bFRKb2FlbTVJQ3VSZHVyOVNmV3lhUFZGKzNncGxMTnk0Tm02ZGt6ejkydVJkSEkxb3IzRUFlN1hydnp4ck16WW1OQll1TUhldkhudXNHdjd0SHhxYWl0VGZ2bXpHSXF6ZGdWZDE5Zm52d0RzckxCQTFDZlF6OUFqVE1McFFQYUxwK1pFRFliTUZhWFlDNWh5TWhmVjhjK2VMdDQxWndjMDJiYytLdEY2bHlNYkN0WHZuNUZwS2pVU1o0VUx5SlF5T3orRHVXRWJScEF1WnlKd1pDd3czWTUrMkhpai9IRDBHdDJQdVhwMHdMMTAzWXZHMFZTd25ZeHcrYWd6ZzBXUWN5VVFjNHc4NjhIR2x1SGZBcTQ1MkJoZEpqQXhvcGpzRWRBMnhzTmp5aXlBT2p4Z3ZtaHdOaWIzK3VoNzlOYXdYWGJ0VlR1cmMxRjVPSTJtK1UzSjFVcEdlK2ZFbVRacGxLWXVaNzR4Rml0WDdiLzY1c0Q1UVhWTm9ZUnh6dmIrcThkQSszK1lkZG91bzE1cjZBcSt4eU9mYXVIVk9ZbDFrOFM0dWl4bnNoQkVVejlxTWpRbU5SVjRrOGFqcHBMZ2JyNm01T0loUGIrbUR4WmZOV0l3V3dGamNiZGNHeWxrYWlIR0xDc0p1ZWxSZHBXb1F4T2RpTEN4VHhMcGxMUFJCejk2SXBtZW15TWJDdFh2bjVGb3VUNk5hbUlJU1JFWDdNN1NPTHhhNGg4bWhzVWlscEJhbkxPMThzdzdmUDVoV2FvNGs1cDRPbzdQK3BMNVRZdXRuNGhvTGFVSHN0cTFIMEdDMFMzZXNCeDlyRjRIbnZFL05ramlGUWQ0bFhrVitmdHFtREs3OUNxNjNhYWN2M2NjWjArZkR5aEM0VlU1TUhJWFJhZjM1TGJrNnFSalB2RHExVnpNRjZxajBEdnJUV0doWndleHNIRDFqMDdnK05JbldBVlVUT0tZTmVyK0k0S0kyMm5UcC9vclBXemRxVEh0Vmlta3M4cnMyYnAyVHVLYkxKUEdMVVRrWHhqQzQrcEZuYmNiR2hNWWlENmJhVGdvTHMzZW1OcithV0Y5ajBkR01ROXFHZnV0QjFFblRFMTQyWTJHL0Y4SXVTZ1BSb25uaGEvdkVIaUVacXdCMGd4Z0x1ZmRGNk1FcHFyRnc4ZDQ1M01kRG5mS2kzdzFhUFlZZ3lwcjZjQ3c0Z2JzdkhLUkN0WVZUWXdGcHZycE55Um5tK3VxeFMvTzVtbzdXN08xV04rM1VsbFhkbE1OK0tQTVQySzJabXJEcHN0R1VBQ2xqVkcxRWJ6NlVvMnkwL1h4WUdRSzN5ckZyTEVxelRpcnNNeitobU9EMUVhK2RCLzZxU3hQclcyTXhIMFBqalFqS2JDMHlMb1N4a0xNbVNyOGhVR1Jqa2ZPMWNldWNWbkQ5aWtWMlJDdEpiYXczYmNiR2hNWWlWeEpTa0dFeXpVRmU0QzFQVDhocnNkc0Q5OHZKZXRxdUw5NVdLcFVtYmFVeWdKdVdCekNCdmRwRy9NcmsrbkRsUmpFVzQrTDhWN0dIdEpqR3dzVjdsOE1HZ2JQanY2RDZnbFhXbmdDMlhSN1JaeURMbVJ5TUJiS3R3NnJFbnVQTitMUlM4My92V0tlazN2V0phWG9wblFuWjlVbS80N01jRFlXRmExZ1JqR0YwZGxHbkhtRnhzL0s5c0R4NjZlVDVzRElFYnBWajExaVVhSjJFd2ozejZoU290VDFYdHRmZ3FrSHExNEl2M25iUURybGxMR2JIeC9TTGgyMEh6M0ROV01oRzlycXBrUzJlc2NqdjJyaDFUdko5ZGlCNXpRZThhRE0ySmpRV3VYS3Z6anFON0JwSkJJNXI1ejRmd1RkUE5SL3Iwdk9aQjFUTzBzM21XRTQyZE9sbTdTMXdtbzFPNC9wQVpnaDFhQW85YTcyYlNRY1ZFSFFMckRoaTRlV0loWXYzTHVlZHgxY1FqVTZoOGZaajdHM3F6bXg0SkRjd2ZjYUxCaDJUbTdGSUVSdkc5L1dmNDlDYjFkaTE0MjI4Vmw2Ti9RZnFjZW5lTkpLSkhueWtNUjY2M1AvU1dnM2pEZlF5UEczRmZydmZOV1JCZkU2ZFNEdjFJSVdUNE1MS0VMaFZqbDFLdEU1YXcrVm5mdkt2T0dRbkFZbXBORzFhc2RvaE40eEZZbHBjRlB4RkVMczdKMUp6NjJmWDd2Y0tXcTlZOUx5N2NuK2wzNURYY1FnVXlWamtmVzNjT2lkcEhjY1hYZGpXRkVhRkRlMis4Z3dQRFgrdm1HM0d4b1RHSWtma0lkOUR1YWJWczkwYm1VVG5FZTE4N1JwY2pSV2duR3lvY3hXRlhiU1ZSdGZPQm5sQ0JSVEVNVTFFZGxPWWkyazFmeHJXaTdBMmlMR1ExMWpzdGxwallUYWk1TklhQzlmdVhjN0dRbUk1aVljanozQzRTZXlWMHFkQ3pJVThqSVVGU1dHdkc0T045T1NzVVBLSWhoYmJHNVNaSUkyR09aTVMzRW56cU1WRUExWjdYbGdiQXJmS3NVdEoxa2xtNVB2TUs4WjFqODRzNUdnc2l0VU91V0FzeEhyVUlGVndpbUlZQytEdWphRE5jM0ZvTEhLcy85MjRObTZkMDkxMnFSeTN0OFl1YUp1eE1hR3h5SkZrMjBtaFoyYWZhU3BKU0J2cFNZR0R1ak8zdHJmSU5KTkx2N2c3YjhWWGVJUUNsSk1WT1N1UldhV2pQVFlwZGVOWnNRY3dLcVdKc3lyUFVRYVdsOXBZVEpsVWF0bXlRb25IYlJxZ3VHUXNYTHQzdHEvbEVub2lZemgxZXlTbE14R1RsTFJxdXRUejR2VTI3cjF5UWdHTVJhSWZkWm9kam8xMjNWYm52My96cHVaMzFYUzBKdkhDVkpOMmpZWGE0ZUZraCs0VnFSRjNMamt0cFpqc0lhQ1lZTE1PbUN4Wm9Wd3F4eTZsVlNjVitKbVhScm55TWhaRmE0ZnlOeFk5UXVCclpoNkxZeXgwV2NoTW43ZHN4c0tkK3QrTmErUFdPVG5KMEdhTWwyM0d4b1RHSWxma1RDMFY5ZWcxaWdSalNrVzd3eW9vaUl1Ylk3MWluSDkrcmtQY3dmdTFFL0xjYWJmS3NZRThIYXIyUGs2Tm15MTZTdUo2dTdiaFZTcGZ1U2RnZmtMY3ZPYmNBSzRiNUtuR3JCSjhDcm5sclhQRzUyVXNkRmx2REw1VFFHTmhPK2QzdG8yQUdvd3F4eFVNaHNMaTVrWkd4c0xXTlhEcDNqa3dGaGZsRkllR0RzekJYZ3UyY2RsWXhQclI4STYyMCtGdGZOUmhiQVNFTktCcVQvQ0pIL1dqRmpIbCtJUmtFUjhhenBVM0pURWxqVVpLOThqa2I4Uk9nd0hyZlJ4TWRyVE52bytGUytYWXBhVHFKQytmK1hWczdieGR0SFlvZjJNaDlxaWJwRXllbjBTVk1DV29NTVpDZlk3RWV0MWszNVRvbVBXZUR5N1YvNjVjRzdmT1NYNFh6L2FpL29WeGVtc2tZamh6T1lJelFqeFNHdS9QUm9MR0ltZEcwVkFwcDVLc3g5VUhxMW1oNGhpNWQwMlhXMzduZ1lBdUlFaEs2elcyN2ZnUWRSM0RtRExid2Z1VmcyZ3dHR0YycTV6c3JDZ1ZqM1pYM25UbHMvdkdNN1NPeGZEd3hRSUdvek80SGhuVEw1U3E3VVdqTG1CZVFVK25XTjdxenBwUnRaRldoeXFIeHJCWDI1dVE2a1dVZWk3Y05CWnlCWDB1Z3ZxeEJZek9MdURoYktiU0txU3h5UHhtZXBmU0pjek9xenY5am1DdnRQaTBURGVIVnVyOVVhNVRXZnNFZW1hVG1FMGtNUnFkUnVPTnNKQVgzTlJZMkxrR2J0MDdCOWN5R29rSXg3KzVSVjFzcDIxb2x2QXczQ2NFbUp1dlRCWjlnenlSSk9ZbXB6RStQSXplV3gxb09GR2pTek83NjNpUCtSU25oR1FhWG5rRCs0NTNvT2RwWmgrTGV4MzRWS3ByWGxQS2M3SkZudHd6cU9ia3p6NFZRQjVCNjBLVmRtTXFkYjNDWldtS3dZWEhhRlNlbzJoaUNkRVhNWnM3WnJ0VmpsMUtxMDd5N3BsZng1NnhLRlk3cERjV05XTkpST2V6YTNXTlFGUjYzdFhkbU92SEZsTzdPYytxdXpsSDVKM1ZDMmdzbFBPNTNpYnZVcDNlNlgxVXFmL3Q3MUx0VHYzdnlyVng3WnhXOFBDMkZHK2N2WS9ENFdtbGJWeEpmYTRlMDAzdE1kV0djR3drS1p5UDErL1BSb0xHSWcrU2ZWOWhuNU5Va2p0cWNQV3BVVW5UNkR6eXRzMXlLckhuazM2VGdNR3RjbXl3dklER3l3Nm5UZFIyNC9DUXlTOHV4M0dteVg1YXVjMlhKL1FCZzZ2em1hWE1NRWJmTDdTeHlLYnpqNDEzSDVZcVVWdlgwekRkb0kxcm9PTEd2WE4wTFpWbnIwWE83QkhBNXZNaGxEVjBZNHNjWE5iZXg1bW9TUStYSS9Jd0ZoM2kxRW41WGR4MXBDTnJXY2tIRHVxYmlqb0VITTFaVjFPNmF1OWh0N0FPeW9yRTJHT2hRZFp0YnZoQzZ0VzNJeU5ENEZZNWRpbXBPc21yWjM0ZHU4YWlPTzFRcnRtQ0FxZ2F5aFFoVDMyeHBUQWF0YjN1cm82U3l5TUFOcVFMd2wycS85MjROaTZla3hwdjFPdWVmNnN5d3RMejcvMzdzNUdnc2NpVHVRZXRPRlJlbWJVQ1ZmZTQrTjVrOSswVWlWRmNQYkRmSXZqSVZNTEhBOVlCaUZ2bDJHSVJOenQ3eGFrSEpsSjdLdXBOcDB1dEhuc005WmU3eFo0U2c0YWhyRzBDZzBaVE5OeE83VGp5MkhBaGF6R01SY1dOTVZTZnR3aHExS3dWWnNQQnluMXBiYk82anVvMUhCQ0duODN5bUdlOUJxdmtlKytjTHQ1V2dyN0dLOWwrVDcxT1lkU001R3lmSlFwZ0xMWWZ4TWROdytZakZSSnpENXBSdlNOTFhmTm1QUUpPcGtDcDZLWWFPWmxmSEpPQ0VQM2k2dG54RWN2VWxWdGFudUN3MXNTYUdBSzN5ckZOS2RWSm5qeno2OWczRmloQ08rU0NzVkFQTS9xTGJoUllEbENyV3JRZGFKTGhkcm5OU1VTZldSN1A1cVlCY1pUTUtBaDNxZjdQKzlxNGVrNUltWXVMYmFHc3o3OGFhelJHRFdJTmo5K2ZqUVNOaFJza0p0RHo3VmY0K04wajJMUGpqWFJsdXJVU08zZW9LU1hyME5CbU4zQklZdnpXTlp3K29Dbm5sWFE1MVVmcWNWVk5UVm5VY3V5Um1KM0J4VlRxdGhDMm5NMEV3N1ZkMkhMK1BuYTNEYUYrS081Z1NIRUZvMk8vb0thdEYyWG51aktWZ05xemNCOTcyMGZRT201eDVBWEl3QklkZTRiRExhRk1qMGJtT0VLWmVmQUZNeFpxNDdlU3FraXZCeDlqZDBNd25SSlB2YVlOdmFpK1BZbEJHNW00SGc2TW9GcHpUemFkN1ViNVplVitqQ3dpb1M1eVBhZTlCdVk3cjFwZUE0RTg3bDJPV2FHaTR4TTQxUjVCK2ZrZ05tV09MM1dlTFgyb0NVM1p1RTVPeU45WXZMcjFEZXlxT0lKRHludjRUVnQvZW5xSVU1U2dyYk94RGtmZnJNWnIyeXN6Ny9aKzdIdjNjelIwMkRjcFd1U3BCa0ptSXp0LzM5bWQvZS9WemJZNisxQ1J1VmVienFvYlV3M2dWQ1JkUDl6VTdxNXRaUWpjS3NjMkpWWW5GZldaWDhlUnNVaFJ5SGJJSFdPUkloRkg2KzBCcVo0TksvWHNSQ290ZW1Ka1FCZ0JFTk43RnlEcmwzUThtNVRqMlhZaGdtUGhHVVNYcFhVQUJuczFyRjRmVityL2ZLNk42K2VVSmhxZHhCbmwrYTlZUGFhMWMzdXMxQUd4OUZSRnE3LzM2UDNaU05CWUVFSUlJWVNVT25LNmQxZU1zOGY0OFp3Mk9EUVdoQkJDQ0NFZU16cndCRFVENXFtTlI4Tzl3Z2lCNlFaNEpZUWZ6NGxZUTJOQkNDR0VFT0locytOUFVKNmFtdE9Gc3JZeHRJNHZybVd3U3N5bXM1NEo2eGxyczJ6Y1dBTDQ4WnhJZG1nc0NDR0VFRUk4STUzZU9PdkM0alYxb1NJVUwvR2RvZjE0VHNRT05CYUVFRUlJSVo2U3hOMmd3VjRzc21xN1VSVnlraERGUy94NFRpUWJOQmFFRUVJSUlhWEFmQXl0b1NGVU5ZV3diVFdqVTIwd2xVWHA4TzBKM0oxL0NmZFg4T001RVZOb0xBZ2hoQkJDQ0NGNVEyTkJDQ0dFRUVJSXlSc2FDMElJSVlRUVFramUwRmdRUWdnaGhCQkM4b2JHZ2hCQ0NDR0VFSkkzTkJhRUVFSUlJWVNRdktHeElJUVFRZ2doaE9RTmpRVWhoQkJDQ0NFa2IyZ3NDQ0dFRUVJSUlYbERZMEVJSVlRUVFnakpHeG9MUWdnaGhCQkNTTjdRV0JCQ0NDR0VFRUx5aHNhQ0VFSUlJWVFRa2pjMEZvUVFRZ2doaEpDOG9iRWdoQkJDQ0NHRTVBMk5CU0dFRUVJSUlTUnZhQ3dJSVlRUVFueEk4aDhyK0sveEFmemJEOS9pWDI3OWthSnNTWDFlL2x0NWJ0VG54eWswRm9RUVFnZ2hQdVB2eVFXODEvMmQ1MEVxOWZLcXV1ZEs2amx5QW8wRklZUVFRb2pQK1BmN2JaNEhwdFRMcjZNUC9zZlJjMGRqUVFnaGhCRGlJNjcvOHRqemdKVHlqem9taG0wL2V6UVdoQkJDQ0NFKzRqL3VYL004R0tYOEkvVjVzZ3VOQlNHRUVFS0lqL2pYdTAyZUI2T1VmNlErVDNhaHNTQ0VFRUlJOFJGZUI2S1UvMlFYR2d0Q0NDR0VFQi9oZFJCSytVOTJvYkVnaEJCQ0NQRVJYZ2VobFA5a0Z4b0xRZ2doaEJBZjRYVVFTdmxQZHFHeElJUVFRZ2p4RVY0SG9aVC9aQmNhQzBJSUlZUVFIK0YxRUVyNVQzYWhzU0NFRUVJSThSRmVCNkdVLzJRWEdndENDQ0dFRUIvaGRSQksrVTkyb2JFZ2hCQkNDUEVSWGdlaGxQOWtGeG9MUWdnaGhCQWY0WFVRU3ZsUGRxR3hJSVFRUWdqeEVWNEhvY2I2R3UvMS94KzY0NzhpdVFJa2wyWVFmdjQzdkIvUWZ1YzcvQ0d1T1pHVlh6RThGY0lIWFNhZlowaE8veS8yeUdVcy9ZemZkNjJYL1hya1p5VGpQNkRLeG5GV1JYb1JpTVVSWDBrZncrak1FTDRNTjJ2S1gwWjMvOWZDMzZYS1grakZiM1hsTmVQTXpMSnlQRC9oZDNjeS8zZm5mOUc5WW5iMzlHV1hndXhDWTBFSUlZUVE0aU84RGtLTlZQWG9HZUpMei9HbjN1K3dSd213WHcrMjQ4c3BKWGlQSzhINGFzQzlGclEzcFlQMVlBZGFsWC9Ib3gxNFhmdjVveWE4ZnVmck5ZbS9sVFlXOGFVa1JwOWV5L3lkZldPUlBzNUp0UFZmUTFWQUtUL1FqTjlHUXVnY1h6VXZEbzFGOEFmMHJ5UlR4eE9JTkFrR0puMzhIZmh6OGxmOHVYZjEzOTdmS3hvTFFnZ2hoQkNTd3VzZ1ZDY2xlTzVNS29GMWY1UDAvOWZRdHJpTThDUHowWUNxNFVuRkVJVHdua1ZRcnpjV3l3ajgxSXZocFdjNDNlWEFXS3dkWjNQVzh1MGFpL2QrZW9GazdBZjgvcWxpb29TUmxWVzFvMDAxRnVFU3VFODBGb1FRUWdnaFJJdlhRYWhPOXgvaCtjclArTDFCYi96NzQ3OGlPZlVYY1VSaU5XaS84eDIrbkVraWJ2YTVsYkdJTk9OM3ozL0Y4L0gwcUlVdFk2RWM1N1RKY2VabUxLN2lUd3VLY1JwVWpFcW9GNk1yejNHbVN5NlB4b0lRUWdnaGhKUW9YZ2VoT3ZYK2hPVFNFRDR3K0N6Vm96L3pON3kxRnJTcjZ5L1NVNGVTSzh1WWpqM0Nmd2ExUWIxeWdwbXBSYXZxLyttcWdiSDRZM29hMHBJU3pBZHRHZ3VMNHhUTDF4OURhajJHYkN4U2h1cDVadFFrYlRMNmh5L1JXQkJDQ0NHRWtKY0RyNE5RblN4R0FneEhMQVl2NGExQVUyb3RoajZvVjBjQXZzTmJYYzFyRXIrbk1SYTN2c1lINDNFOGY5NkJ0L3JkSGJHUWo2RnE4SmswWXFIODluUGwzS2J2ckUxL1NwbW90V2xkTkJhRUVFSUlJYVRFOFRvSTFTbmJHb3RCNjR4TGNsQnZieXBVNXQvQnZ5RzhOSWsvL1BUTXdScUxwcXpsWjUwS2RlY3Y2RnlDTkxLeHJQekhEUDRVb3JFZ2hCQkNDQ0V2QVY0SG9VYXFHbnkrbmhWS0RjU0QxM0Fta3hYcWZWMVdxQ3pHSW10V0tJMnh1UFUxM2grUHB3SjcyTWtLTlpqT0N0WGFmeFZ2NVpFVmFrLy96MG81UCtIM3dXYk55TVpWZkRtempPZFByOUZZRUVJSUlZU1Ewc2ZySU5SWW1YMHNGbjZGRXVJanVSUTMyY2NpbTdFd09HRmhlcEZzTEJSMTNVbnZHK0ZrSDR0NGVoOEw5VGlIcHgvaDlIMG4rMWcwNC9TMGJDQXloa1A1WGp6NUNCK3NtU2thQzBJSUlZUVFVcUo0SFlSUy9wTmRhQ3dJSVlRUVFueUUxMEVvNVQvWmhjYUNFRUlJSWNSSGVCMkVVdjZUWFdnc0NDR0VFRUo4aE5kQktPVS8yWVhHZ2hCQ0NDSEVSM2dkaEZMK2sxMW9MQWdoaEJCQ2ZJVFhRU2psUDltbElNYmlILy84SjJibkYvSDMyWGxNenNRcGlxSW9pcUtvSXNucklKVHluend6Rm9xbndCUU5CVVZSRkVWUmxDZnlPZ2lsL0NmUGpFVnNJZUg1QzBWUkZFVlJGTFZSNVhVUVN2bFBuaGtMamxaUUZFVlJGRVY1SjYrRFVNcC84c3hZZVAweVVSUkZVUlJGYldSNUhZUlMvaE9OQlVWUkZFVlIxQWFVMTBFbzVUL1JXRkFVUlZFVVJXMUFlUjJFVXY0VGpRVkZVUlJGVWRRR2xOZEJLT1UvMFZoUUZFVlJGRVZ0UUhrZGhGTCtFNDBGUlZFVVJWSFVCcFRYUVNqbFA5bmwvd0VodVF1YXpSWHJSZ0FBQUFCSlJVNUVya0pnZ2c9PVwiIHN0eWxlPVwibWF4LXdpZHRoOjgwMHB4O1wiPlx4M2MvYT4iLCIqQ2xvc2UgQWxsIEJyb3dzZXJzIiwiKjxwPkNsb3NlcyBhbGwgb3BlbiBicm93c2VycyBhbmQgcmVzZXRzIHRoZSBicm93c2VyIGNhY2hlLlx4M2MvcD4iXSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN0YXRzIl0gPSBbW3siZWxhcHNlZCI6IjAwOjAwOjA1IiwiZmFpbCI6MSwibGFiZWwiOiJDcml0aWNhbCBUZXN0cyIsInBhc3MiOjB9LHsiZWxhcHNlZCI6IjAwOjAwOjA1IiwiZmFpbCI6MSwibGFiZWwiOiJBbGwgVGVzdHMiLCJwYXNzIjowfV0sW10sW3siZWxhcHNlZCI6IjAwOjAwOjA2IiwiZmFpbCI6MSwiaWQiOiJzMSIsImxhYmVsIjoiSnVweXRlciIsIm5hbWUiOiJKdXB5dGVyIiwicGFzcyI6MH1dXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiZXJyb3JzIl0gPSBbXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiYmFzZU1pbGxpcyJdID0gMTU0NjY2ODc4NTM4MjsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiZ2VuZXJhdGVkIl0gPSA1NjgyOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuc2V0dGluZ3MgPSB7ImRlZmF1bHRMZXZlbCI6IlRSQUNFIiwibWluTGV2ZWwiOiJJTkZPIiwicmVwb3J0VVJMIjpudWxsLCJycGEiOmZhbHNlLCJzcGxpdExvZ0Jhc2UiOiJsb2ciLCJ0aXRsZSI6IiJ9Owo8L3NjcmlwdD4KPHRpdGxlPjwvdGl0bGU+CjwvaGVhZD4KPGJvZHk+CjxkaXYgaWQ9ImphdmFzY3JpcHQtZGlzYWJsZWQiPgogIDxoMT5PcGVuaW5nIFJvYm90IEZyYW1ld29yayBsb2cgZmFpbGVkPC9oMT4KICA8dWw+CiAgICA8bGk+VmVyaWZ5IHRoYXQgeW91IGhhdmUgPGI+SmF2YVNjcmlwdCBlbmFibGVkPC9iPiBpbiB5b3VyIGJyb3dzZXIuPC9saT4KICAgIDxsaT5NYWtlIHN1cmUgeW91IGFyZSB1c2luZyBhIDxiPm1vZGVybiBlbm91Z2ggYnJvd3NlcjwvYj4uIElmIHVzaW5nIEludGVybmV0IEV4cGxvcmVyLCB2ZXJzaW9uIDggb3IgbmV3ZXIgaXMgcmVxdWlyZWQuPC9saT4KICAgIDxsaT5DaGVjayBhcmUgdGhlcmUgbWVzc2FnZXMgaW4geW91ciBicm93c2VyJ3MgPGI+SmF2YVNjcmlwdCBlcnJvciBsb2c8L2I+LiBQbGVhc2UgcmVwb3J0IHRoZSBwcm9ibGVtIGlmIHlvdSBzdXNwZWN0IHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnLjwvbGk+CiAgPC91bD4KPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5yZW1vdmVKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKCk7PC9zY3JpcHQ+Cgo8ZGl2IGlkPSJoZWFkZXIiPjwvZGl2Pgo8ZGl2IGlkPSJzdGF0aXN0aWNzLWNvbnRhaW5lciI+PC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgICB2YXIgdG9wc3VpdGUgPSB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgYWRkSmF2YVNjcmlwdERpc2FibGVkV2FybmluZyhlcnJvcik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW5pdExheW91dCh0b3BzdWl0ZS5uYW1lLCAnTG9nJyk7CiAgICBhZGRTdGF0aXN0aWNzKCk7CiAgICBhZGRFcnJvcnMoKTsKICAgIGFkZEV4ZWN1dGlvbkxvZyh0b3BzdWl0ZSk7CiAgICBhZGRMb2dMZXZlbFNlbGVjdG9yKHdpbmRvdy5zZXR0aW5nc1snbWluTGV2ZWwnXSwgd2luZG93LnNldHRpbmdzWydkZWZhdWx0TGV2ZWwnXSk7CiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpIHsKICAgICAgICBtYWtlRWxlbWVudFZpc2libGUod2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZXhwYW5kU3VpdGUodG9wc3VpdGUpOwogICAgfQp9KTsKCmZ1bmN0aW9uIGFkZExvZ0xldmVsU2VsZWN0b3IobWluTGV2ZWwsIGRlZmF1bHRMZXZlbCkgewogICAgdmFyIGNvbnRyb2xsZXIgPSBMb2dMZXZlbENvbnRyb2xsZXIobWluTGV2ZWwsIGRlZmF1bHRMZXZlbCk7CiAgICBpZiAoY29udHJvbGxlci5zaG93TG9nTGV2ZWxTZWxlY3RvcigpKSB7CiAgICAgICAgdmFyIHNlbGVjdG9yID0gJC50bXBsKCdsb2dMZXZlbFNlbGVjdG9yVGVtcGxhdGUnLCBjb250cm9sbGVyKTsKICAgICAgICBzZWxlY3Rvci5maW5kKCdzZWxlY3QnKS52YWwoY29udHJvbGxlci5kZWZhdWx0TG9nTGV2ZWwoKSk7CiAgICAgICAgc2VsZWN0b3IuYXBwZW5kVG8oJCgnI3RvcC1yaWdodC1oZWFkZXInKSk7CiAgICAgICAgJCgnI3JlcG9ydC1vci1sb2ctbGluaycpLmZpbmQoJ2EnKS5jc3Moeydib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzJzogJzAnfSk7CiAgICAgICAgc2V0TWVzc2FnZVZpc2liaWxpdHkoY29udHJvbGxlci5kZWZhdWx0TG9nTGV2ZWwoKSk7CiAgICB9Cn0KCmZ1bmN0aW9uIGFkZEVycm9ycygpIHsKICAgIHZhciBlcnJvcnMgPSB3aW5kb3cudGVzdGRhdGEuZXJyb3JJdGVyYXRvcigpOwogICAgaWYgKGVycm9ycy5oYXNOZXh0KCkpIHsKICAgICAgICAkLnRtcGwoJ2Vycm9ySGVhZGVyVGVtcGxhdGUnKS5hcHBlbmRUbygkKCdib2R5JykpOwogICAgICAgIGRyYXdFcnJvcnNSZWN1cnNpdmVseShlcnJvcnMsICQoJyNlcnJvcnMnKSk7CiAgICB9Cn0KCmZ1bmN0aW9uIGRyYXdFcnJvcnNSZWN1cnNpdmVseShlcnJvcnMsIHRhcmdldCkgewogICAgdmFyIGVsZW1lbnRzID0gcG9wRnJvbUl0ZXJhdG9yKGVycm9ycywgMTApOwogICAgJC50bXBsKCdlcnJvclRlbXBsYXRlJywgZWxlbWVudHMpLmFwcGVuZFRvKHRhcmdldCk7CiAgICBpZiAoZXJyb3JzLmhhc05leHQoKSkKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgZHJhd0Vycm9yc1JlY3Vyc2l2ZWx5KGVycm9ycywgdGFyZ2V0KTsgfSwgMCk7CiAgICBlbHNlIHsKICAgICAgICAvLyBFcnJvcnMgbWF5IGhhdmUgbW92ZWQgc2Nyb2xsIHBvc2l0aW9uLiBSZXNldHRpbmcgbG9jYXRpb24gcmUtc2Nyb2xscy4KICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpCiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHdpbmRvdy5sb2NhdGlvbi5oYXNoKTsKICAgICAgICBoaWdobGlnaHRMaW5rVGFyZ2V0KCk7CiAgICB9Cn0KCmZ1bmN0aW9uIGhpZ2hsaWdodExpbmtUYXJnZXQoKSB7CiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpIHsKICAgICAgICB2YXIgdGFyZ2V0ID0gJCh3aW5kb3cubG9jYXRpb24uaGFzaCk7CiAgICAgICAgaGlnaGxpZ2h0KHRhcmdldCk7CiAgICB9Cn0KCmZ1bmN0aW9uIGhpZ2hsaWdodChlbGVtZW50LCBjb2xvcikgewogICAgaWYgKGNvbG9yID09PSB1bmRlZmluZWQpCiAgICAgICAgY29sb3IgPSAyNDI7CiAgICBpZiAoY29sb3IgPCAyNTUpIHsKICAgICAgICBlbGVtZW50LmNzcyh7J2JhY2tncm91bmQtY29sb3InOiAncmdiKCcrY29sb3IrJywnK2NvbG9yKycsJytjb2xvcisnKSd9KTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgaGlnaGxpZ2h0KGVsZW1lbnQsIGNvbG9yKzEpOyB9LCAzMDApOwogICAgfSBlbHNlIHsKICAgICAgICBlbGVtZW50LmNzcyh7J2JhY2tncm91bmQtY29sb3InOiAnJ30pOwogICAgfQp9CgpmdW5jdGlvbiBwb3BGcm9tSXRlcmF0b3IoaXRlcmF0b3IsIHVwVG8pIHsKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkgPiAwICYmIHJlc3VsdC5sZW5ndGggPCB1cFRvKQogICAgICAgIHJlc3VsdC5wdXNoKGl0ZXJhdG9yLm5leHQoKSk7CiAgICByZXR1cm4gcmVzdWx0Owp9CgpmdW5jdGlvbiBtYWtlRWxlbWVudFZpc2libGUoaWQpIHsKICAgIHdpbmRvdy50ZXN0ZGF0YS5lbnN1cmVMb2FkZWQoaWQsIGZ1bmN0aW9uIChpZHMpIHsKICAgICAgICB1dGlsLm1hcChpZHMsIGV4cGFuZEVsZW1lbnRXaXRoSWQpOwogICAgICAgIGlmIChpZHMubGVuZ3RoKSB7CiAgICAgICAgICAgIGV4cGFuZENyaXRpY2FsRmFpbGVkKHdpbmRvdy50ZXN0ZGF0YS5maW5kTG9hZGVkKHV0aWwubGFzdChpZHMpKSk7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyc7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gaWQ7CiAgICAgICAgICAgIGhpZ2hsaWdodExpbmtUYXJnZXQoKTsKICAgICAgICB9CiAgICB9KTsKfQoKZnVuY3Rpb24gYWRkRXhlY3V0aW9uTG9nKG1haW4pIHsKICAgICQoJ2JvZHknKS5hcHBlbmQoJCh0ZXN0T3JUYXNrKCc8aDI+e1Rlc3R9IEV4ZWN1dGlvbiBMb2c8L2gyPicpKSwKICAgICAgICAgICAgICAgICAgICAgJC50bXBsKCdzdWl0ZVRlbXBsYXRlJywgbWFpbikpOwp9Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0b3RhbFN0YXRpc3RpY3NSb3dUZW1wbGF0ZSI+CiAgPHRyIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPHNwYW4+e3todG1sIGxhYmVsfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC90ZD4KICAgIHt7dG1wbCgkZGF0YSkgJ3N0YXRDb2x1bW5zVGVtcGxhdGUnfX0KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idGFnU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgY2xhc3M9InJvdy0keyRpdGVtLmluZGV4fSI+CiAgICA8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIiB0aXRsZT0ie3todG1sIGRvY319Ij4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8c3Bhbj57e2h0bWwgbGFiZWx9fTwvc3Bhbj4KICAgICAgICB7e2lmIGluZm99fSgke2luZm99KXt7L2lmfX0KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InRhZy1saW5rcyI+CiAgICAgICAge3tlYWNoIGxpbmtzfX0KICAgICAgICA8c3Bhbj5bPGEgaHJlZj0ie3todG1sICR2YWx1ZS51cmx9fSIgdGl0bGU9Int7aHRtbCAkdmFsdWUudXJsfX0iPnt7aHRtbCAkdmFsdWUudGl0bGV9fTwvYT5dPC9zcGFuPgogICAgICAgIHt7L2VhY2h9fQogICAgICA8L2Rpdj4KICAgIDwvdGQ+CiAgICB7e3RtcGwoJGRhdGEpICdzdGF0Q29sdW1uc1RlbXBsYXRlJ319CiAgPC90cj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1aXRlU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgb25jbGljaz0ibWFrZUVsZW1lbnRWaXNpYmxlKCcke2lkfScpIiBjbGFzcz0icm93LSR7JGl0ZW0uaW5kZXh9Ij4KICAgIDx0ZCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiIHRpdGxlPSJ7e2h0bWwgbGFiZWx9fSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPGEgaHJlZj0iIyR7aWR9Ij48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBmb3JtYXRQYXJlbnROYW1lfX08L3NwYW4+e3todG1sIG5hbWV9fTwvYT4KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJlcnJvckhlYWRlclRlbXBsYXRlIj4KICA8aDI+e3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX0gRXhlY3V0aW9uIEVycm9yczwvaDI+CiAgPHRhYmxlIGlkPSJlcnJvcnMiPjwvdGFibGU+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJlcnJvclRlbXBsYXRlIj4KICA8dHIgaWQ9IiR7aWR9IiBjbGFzcz0ibWVzc2FnZS1yb3ciPgogICAgPHRkIGNsYXNzPSJlcnJvci10aW1lIj4KICAgICAge3tpZiBsaW5rfX0KICAgICAgPGEgb25jbGljaz0ibWFrZUVsZW1lbnRWaXNpYmxlKCcke2xpbmt9JykiIGhyZWY9IiMke2xpbmt9IiB0aXRsZT0iTGluayB0byBkZXRhaWxzIj4ke2RhdGV9ICR7dGltZX08L2E+CiAgICAgIHt7ZWxzZX19CiAgICAgICR7ZGF0ZX0gJHt0aW1lfQogICAgICB7ey9pZn19CiAgICA8L3RkPgogICAgPHRkIGNsYXNzPSIke2xldmVsLnRvTG93ZXJDYXNlKCl9IGxldmVsIj48c3BhbiBjbGFzcz0ibGFiZWwgJHtsZXZlbC50b0xvd2VyQ2FzZSgpfSI+JHtsZXZlbH08L3NwYW4+PC90ZD4KICAgIDx0ZCBjbGFzcz0ibWVzc2FnZSI+e3todG1sIHRleHR9fTwvdGQ+CiAgICA8dGQgY2xhc3M9InNlbGVjdC1tZXNzYWdlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OnNlbGVjdE1lc3NhZ2UoJyR7aWR9JykiIHRpdGxlPSJTZWxlY3QgbWVzc2FnZSB0ZXh0Ij4KICAgICAgPGRpdj48L2Rpdj4KICAgIDwvdGQ+CiAgPC90cj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1aXRlVGVtcGxhdGUiPgogIDxkaXYgaWQ9IiR7aWR9IiBjbGFzcz0ic3VpdGUiPgogICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXIgY2xvc2VkIiBvbmNsaWNrPSJ0b2dnbGVTdWl0ZSgnJHtpZH0nKSI+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLWxlZnQiIHRpdGxlPSJ7e2h0bWwgZnVsbE5hbWV9fSI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImVsYXBzZWQiIHRpdGxlPSJFbGFwc2VkIHRpbWUiPiR7dGltZXMuZWxhcHNlZFRpbWV9PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJsYWJlbCAke3N0YXR1cy50b0xvd2VyQ2FzZSgpfSI+U1VJVEU8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPnt7aHRtbCBuYW1lfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1yaWdodCIgb25jbGljaz0ic3RvcFByb3BhZ2F0aW9uKGV2ZW50KSIgdGl0bGU9IiI+CiAgICAgICAgPGEgY2xhc3M9ImV4cGFuZCIgdGl0bGU9IkV4cGFuZCBhbGwiIGhyZWY9ImphdmFzY3JpcHQ6ZXhwYW5kQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImNvbGxhcHNlIiB0aXRsZT0iQ29sbGFwc2UgYWxsIiBocmVmPSJqYXZhc2NyaXB0OmNvbGxhcHNlQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImxpbmsiIHRpdGxlPSJMaW5rIHRvIHRoaXMgc3VpdGUiIGhyZWY9IiMke2lkfSIgb25jbGljaz0ibWFrZUVsZW1lbnRWaXNpYmxlKCcke2lkfScpIj48L2E+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci10b2dnbGUiIHRpdGxlPSJUb2dnbGUgdmlzaWJpbGl0eSI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNoaWxkcmVuIj4KICAgICAgPHRhYmxlIGNsYXNzPSJtZXRhZGF0YSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPkZ1bGwgTmFtZTo8L3RoPgogICAgICAgICAgPHRkPnt7aHRtbCBmdWxsTmFtZX19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7aWYgZG9jKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sIGRvYygpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIHt7ZWFjaCBtZXRhZGF0YX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPnt7aHRtbCAkdmFsdWVbMF19fTo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCAkdmFsdWVbMV19fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9lYWNofX0KICAgICAgICB7e2lmIHNvdXJjZX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlNvdXJjZTo8L3RoPgogICAgICAgICAge3tpZiByZWxhdGl2ZVNvdXJjZX19CiAgICAgICAgICA8dGQ+PGEgaHJlZj0iJHtyZWxhdGl2ZVNvdXJjZX0iPnt7aHRtbCBzb3VyY2V9fTwvYT48L3RkPgogICAgICAgICAge3tlbHNlfX0KICAgICAgICAgIDx0ZD57e2h0bWwgc291cmNlfX08L3RkPgogICAgICAgICAge3svaWZ9fQogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5TdGFydCAvIEVuZCAvIEVsYXBzZWQ6PC90aD4KICAgICAgICAgIDx0ZD4ke3RpbWVzLnN0YXJ0VGltZX0gLyAke3RpbWVzLmVuZFRpbWV9IC8gJHt0aW1lcy5lbGFwc2VkVGltZX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlN0YXR1czo8L3RoPgogICAgICAgICAgPHRkPnt7dG1wbCgkZGF0YSkgJ3N1aXRlU3RhdHVzTWVzc2FnZVRlbXBsYXRlJ319PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7aWYgbWVzc2FnZSgpfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+TWVzc2FnZTo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJtZXNzYWdlIj57e2h0bWwgbWVzc2FnZSgpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0ZXN0VGVtcGxhdGUiPgogIDxkaXYgaWQ9IiR7aWR9IiBjbGFzcz0idGVzdCI+CiAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlciBjbG9zZWQiIG9uY2xpY2s9InRvZ2dsZVRlc3QoJyR7aWR9JykiPgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1sZWZ0IiB0aXRsZT0ie3todG1sIGZ1bGxOYW1lfX0iPgogICAgICAgIDxzcGFuIGNsYXNzPSJlbGFwc2VkIiB0aXRsZT0iRWxhcHNlZCB0aW1lIj4ke3RpbWVzLmVsYXBzZWRUaW1lfTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0ibGFiZWwgJHtzdGF0dXMudG9Mb3dlckNhc2UoKX0iPnt7PSB0ZXN0T3JUYXNrKCd7VEVTVH0nKX19PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIj57e2h0bWwgbmFtZX19PC9zcGFuPgogICAgICAgIHt7aWYgIWlzQ3JpdGljYWx9fShub24tY3JpdGljYWwpe3svaWZ9fQogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXItcmlnaHQiIG9uY2xpY2s9InN0b3BQcm9wYWdhdGlvbihldmVudCkiIHRpdGxlPSIiPgogICAgICAgIDxhIGNsYXNzPSJleHBhbmQiIHRpdGxlPSJFeHBhbmQgYWxsIiBocmVmPSJqYXZhc2NyaXB0OmV4cGFuZEFsbCgnJHtpZH0nKSI+PC9hPgogICAgICAgIDxhIGNsYXNzPSJjb2xsYXBzZSIgdGl0bGU9IkNvbGxhcHNlIGFsbCIgaHJlZj0iamF2YXNjcmlwdDpjb2xsYXBzZUFsbCgnJHtpZH0nKSI+PC9hPgogICAgICAgIDxhIGNsYXNzPSJsaW5rIiB0aXRsZT0iTGluayB0byB0aGlzIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19IiBocmVmPSIjJHtpZH0iIG9uY2xpY2s9Im1ha2VFbGVtZW50VmlzaWJsZSgnJHtpZH0nKSI+PC9hPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXItdG9nZ2xlIiB0aXRsZT0iVG9nZ2xlIHZpc2liaWxpdHkiPjwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJjaGlsZHJlbiI+CiAgICAgIDx0YWJsZSBjbGFzcz0ibWV0YWRhdGEiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5GdWxsIE5hbWU6PC90aD4KICAgICAgICAgIDx0ZD57e2h0bWwgZnVsbE5hbWV9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7e2lmIGRvYygpfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+RG9jdW1lbnRhdGlvbjo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCBkb2MoKX19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgICB7e2lmIHRhZ3MubGVuZ3RofX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+VGFnczo8L3RoPgogICAgICAgICAgPHRkPnt7aHRtbCB0YWdzLmpvaW4oJywgJyl9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgICAge3tpZiB0aW1lb3V0fX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+VGltZW91dDo8L3RoPgogICAgICAgICAgPHRkPnt7aHRtbCB0aW1lb3V0fX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5TdGFydCAvIEVuZCAvIEVsYXBzZWQ6PC90aD4KICAgICAgICAgIDx0ZD4ke3RpbWVzLnN0YXJ0VGltZX0gLyAke3RpbWVzLmVuZFRpbWV9IC8gJHt0aW1lcy5lbGFwc2VkVGltZX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlN0YXR1czo8L3RoPgogICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPSJsYWJlbCAke3N0YXR1cy50b0xvd2VyQ2FzZSgpfSI+JHtzdGF0dXN9PC9zcGFuPiAoe3tpZiBpc0NyaXRpY2FsfX1jcml0aWNhbHt7ZWxzZX19bm9uLWNyaXRpY2Fse3svaWZ9fSk8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3tpZiBtZXNzYWdlKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5NZXNzYWdlOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9Im1lc3NhZ2UiPnt7aHRtbCBtZXNzYWdlKCl9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgIDwvdGFibGU+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9ImtleXdvcmRUZW1wbGF0ZSI+CiAgPGRpdiBpZD0iJHtpZH0iIGNsYXNzPSJrZXl3b3JkIj4KICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyIGNsb3NlZCIgb25jbGljaz0idG9nZ2xlS2V5d29yZCgnJHtpZH0nKSI+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLWxlZnQiIHRpdGxlPSJ7e2h0bWwgbmFtZX19Ij4KICAgICAgICA8c3BhbiBjbGFzcz0iZWxhcHNlZCIgdGl0bGU9IkVsYXBzZWQgdGltZSI+JHt0aW1lcy5lbGFwc2VkVGltZX08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImxhYmVsIGtleXdvcmQgJHtzdGF0dXMudG9Mb3dlckNhc2UoKX0iPiR7dHlwZX08L3NwYW4+CiAgICAgICAgPHNwYW4+e3todG1sIGFzc2lnbn19PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIj48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBsaWJuYW1lfX17e2lmIGxpYm5hbWV9fSAuIHt7L2lmfX08L3NwYW4+e3todG1sIG5hbWV9fTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iYXJnIj57e2h0bWwgYXJndW1lbnRzfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1yaWdodCIgb25jbGljaz0ic3RvcFByb3BhZ2F0aW9uKGV2ZW50KSI+CiAgICAgICAgPGEgY2xhc3M9ImV4cGFuZCIgdGl0bGU9IkV4cGFuZCBhbGwiIGhyZWY9ImphdmFzY3JpcHQ6ZXhwYW5kQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImNvbGxhcHNlIiB0aXRsZT0iQ29sbGFwc2UgYWxsIiBocmVmPSJqYXZhc2NyaXB0OmNvbGxhcHNlQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImxpbmsiIHRpdGxlPSJMaW5rIHRvIHRoaXMga2V5d29yZCIgaHJlZj0iIyR7aWR9IiBvbmNsaWNrPSJtYWtlRWxlbWVudFZpc2libGUoJyR7aWR9JykiPjwvYT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLXRvZ2dsZSIgdGl0bGU9IlRvZ2dsZSB2aXNpYmlsaXR5Ij48L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iY2hpbGRyZW4iPgogICAgICA8dGFibGUgY2xhc3M9Im1ldGFkYXRhIGtleXdvcmQtbWV0YWRhdGEiPgogICAgICAgIHt7aWYgZG9jKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sIGRvYygpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIHt7aWYgdGFnc319CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlRhZ3M6PC90aD4KICAgICAgICAgIDx0ZD57e2h0bWwgdGFnc319PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgICB7e2lmIHRpbWVvdXR9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5UaW1lb3V0OjwvdGg+CiAgICAgICAgICA8dGQ+e3todG1sIHRpbWVvdXR9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlN0YXJ0IC8gRW5kIC8gRWxhcHNlZDo8L3RoPgogICAgICAgICAgPHRkPiR7dGltZXMuc3RhcnRUaW1lfSAvICR7dGltZXMuZW5kVGltZX0gLyAke3RpbWVzLmVsYXBzZWRUaW1lfTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ibWVzc2FnZVRlbXBsYXRlIj4KICA8dGFibGUgaWQ9IiR7aWR9IiBjbGFzcz0ibWVzc2FnZXMgJHtsZXZlbC50b0xvd2VyQ2FzZSgpfS1tZXNzYWdlIj4KICAgIDx0ciBjbGFzcz0ibWVzc2FnZS1yb3ciPgogICAgICA8dGQgY2xhc3M9InRpbWUiPiR7dGltZX08L3RkPgogICAgICA8dGQgY2xhc3M9IiR7bGV2ZWwudG9Mb3dlckNhc2UoKX0gbGV2ZWwiPjxzcGFuIGNsYXNzPSJsYWJlbCAke2xldmVsLnRvTG93ZXJDYXNlKCl9Ij4ke2xldmVsfTwvc3Bhbj48L3RkPgogICAgICA8dGQgY2xhc3M9Im1lc3NhZ2UiPnt7aHRtbCB0ZXh0fX08L3RkPgogICAgICA8dGQgY2xhc3M9InNlbGVjdC1tZXNzYWdlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OnNlbGVjdE1lc3NhZ2UoJyR7aWR9JykiIHRpdGxlPSJTZWxlY3QgbWVzc2FnZSB0ZXh0Ij4KICAgICAgICA8ZGl2PjwvZGl2PgogICAgICA8L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ibG9nTGV2ZWxTZWxlY3RvclRlbXBsYXRlIj4KICA8ZGl2IGlkPSJsb2ctbGV2ZWwtc2VsZWN0b3IiPgogIExvZyBsZXZlbDoKICAgIDxzZWxlY3Qgb25jaGFuZ2U9ImxvZ0xldmVsU2VsZWN0ZWQodGhpcy5vcHRpb25zW3NlbGVjdGVkSW5kZXhdLnZhbHVlKSI+CiAgICAgIDxvcHRpb24gdmFsdWU9IjIiPklORk88L29wdGlvbj4KICAgICAgPG9wdGlvbiB2YWx1ZT0iMSI+REVCVUc8L29wdGlvbj4KICAgICAge3tpZiBzaG93VHJhY2UoKX19PG9wdGlvbiB2YWx1ZT0iMCI+VFJBQ0U8L29wdGlvbj57ey9pZn19CiAgICA8L3NlbGVjdD4KICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8L2JvZHk+CjwvaHRtbD4K';w.document.open();w.document.write(window.atob(d));w.document.close();var a=w.document.createElement('a');a.appendChild(w.document.createTextNode('Download'));a.href='data:text/html;base64,' + d;a.download='log.html';a.style='position:fixed;top:0;right:0;color:white;background:black;text-decoration:none;font-weight:bold;padding:7px 14px;border-radius:0 0 0 5px;';w.document.body.append(a);})(this);\">Log</a> | <a href=\"javascript:(function(el){var w=window.open();var d='PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJQcmFnbWEiIGNvbnRlbnQ9Im5vLWNhY2hlIj4KPG1ldGEgaHR0cC1lcXVpdj0iRXhwaXJlcyIgY29udGVudD0iLTEiPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgo8bWV0YSBjb250ZW50PSJSb2JvdCBGcmFtZXdvcmsgMy4xIChQeXRob24gMy42Ljggb24gbGludXgpIiBuYW1lPSJHZW5lcmF0b3IiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBRUFJQUJvQkFBQUZnQUFBQ2dBQUFBUUFBQUFJQUFBQUFFQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLY0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQXFBQUFBQUFBQUFBQUFBQUFBQUFBQUxJQUFBRC9BQUFBNEFBQUFOd0FBQURjQUFBQTNBQUFBTndBQUFEY0FBQUEzQUFBQU53QUFBRGNBQUFBNEFBQUFQOEFBQUN4QUFBQUFBQUFBS1lBQUFEL0FBQUF1d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQy9BQUFBL3dBQUFLa0FBQUQ2QUFBQXpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU44QUFBRC9BQUFBK2dBQUFNTUFBQUFBQUFBQUFnQUFBR3NBQUFCckFBQUFhd0FBQUdzQUFBQnJBQUFBYXdBQUFHc0FBQUJyQUFBQURBQUFBQUFBQUFEYUFBQUEvd0FBQVBvQUFBRERBQUFBQUFBQUFJc0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFORUFBQUFBQUFBQTJnQUFBUDhBQUFENkFBQUF3d0FBQUFBQUFBQUFBQUFBTWdBQUFESUFBQUF5QUFBQU1nQUFBRElBQUFBeUFBQUFNZ0FBQURJQUFBQUZBQUFBQUFBQUFOb0FBQUQvQUFBQStnQUFBTU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGFBQUFBL3dBQUFQb0FBQUREQUFBQUFBQUFBRHdBQUFCOEFBQUFBQUFBQUdBQUFBQmNBQUFBQUFBQUFIOEFBQUJLQUFBQUFBQUFBQUFBQUFBQUFBQUEyZ0FBQVA4QUFBRDZBQUFBd3dBQUFBQUFBQURDQUFBQS93QUFBQ2tBQUFEcUFBQUE0UUFBQUFBQUFBRDdBQUFBL3dBQUFMQUFBQUFHQUFBQUFBQUFBTm9BQUFEL0FBQUErZ0FBQU1NQUFBQUFBQUFBSXdBQUFQNEFBQUQvQUFBQS93QUFBR0FBQUFBQUFBQUFBQUFBQU1rQUFBRC9BQUFBaWdBQUFBQUFBQURhQUFBQS93QUFBUG9BQUFEREFBQUFBQUFBQUFBQUFBQUlBQUFBY0FBQUFCa0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFZ0FBQUFBQUFBQUFBQUFBMmdBQUFQOEFBQUQ3QUFBQXl3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU40QUFBRC9BQUFBcXdBQUFQOEFBQUN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTElBQUFEL0FBQUFzZ0FBQUFBQUFBQzVBQUFBL3dBQUFNb0FBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNa0FBQUQvQUFBQXZBQUFBQUFBQUFBQUFBQUFBQUFBQUt3QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBclFBQUFBQUFBQUFBd0FNQUFJQUJBQUFmK0FBQVAvd0FBRC84QUFBZ0JBQUFQL3dBQUQvOEFBQS8vQUFBSkl3QUFESEVBQUEvL0FBQVAvd0FBQi80QUFDQUFRQUF3QU1BQUE9PSI+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+Ci8qIEdlbmVyaWMgYW5kIG1pc2Mgc3R5bGVzICovCmJvZHkgewogICAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICBjb2xvcjogYmxhY2s7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQp0YWJsZSB7CiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDFlbTsKfQp0aCwgdGQgewogICAgdmVydGljYWwtYWxpZ246IHRvcDsKfQpiciB7CiAgICBtc28tZGF0YS1wbGFjZW1lbnQ6IHNhbWUtY2VsbDsgLyogbWFpbnRhaW4gbGluZSBicmVha3MgaW4gRXhjZWwgKi8KfQpociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KYSwgYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6ICMxNWM7Cn0KYSA+IGltZyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTVjICFpbXBvcnRhbnQ7Cn0KYTpob3ZlciwgYTphY3RpdmUgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICBjb2xvcjogIzYxYzsKfQoucGFyZW50LW5hbWUgewogICAgZm9udC1zaXplOiAwLjdlbTsKICAgIGxldHRlci1zcGFjaW5nOiAtMC4wN2VtOwp9Ci5tZXNzYWdlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQovKiBIZWFkZXJzICovCiNoZWFkZXIgewogICAgd2lkdGg6IDY1ZW07CiAgICBoZWlnaHQ6IDNlbTsKICAgIG1hcmdpbjogNnB4IDA7Cn0KaDEgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBtYXJnaW46IDAgMCAwLjVlbSAwOwogICAgd2lkdGg6IDc1JTsKfQpoMiB7CiAgICBjbGVhcjogbGVmdDsKfQojZ2VuZXJhdGVkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLyogRG9jdW1lbnRhdGlvbiBoZWFkZXJzICovCi5kb2MgPiBoMiB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9Ci5kb2MgPiBoMyB7CiAgICBmb250LXNpemU6IDEuMWVtOwp9Ci5kb2MgPiBoNCB7CiAgICBmb250LXNpemU6IDEuMGVtOwp9Ci8qIFN0YXR1cyB0ZXh0IGNvbG9ycyAtLSAhaW1wb3J0YW50IGFsbG93cyB1c2luZyB0aGVtIGluIGxpbmtzICovCi5mYWlsIHsKICAgIGNvbG9yOiAjZjMzICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoucGFzcyB7CiAgICBjb2xvcjogIzM5MyAhaW1wb3J0YW50Owp9Ci5sYWJlbCB7CiAgICBwYWRkaW5nOiAycHggNXB4OwogICAgZm9udC1zaXplOiAwLjc1ZW07CiAgICBsZXR0ZXItc3BhY2luZzogMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KLmxhYmVsLmRlYnVnLCAubGFiZWwudHJhY2UsIC5sYWJlbC5lcnJvciwgLmxhYmVsLmtleXdvcmQgewogICAgbGV0dGVyLXNwYWNpbmc6IDA7Cn0KLmxhYmVsLmVycm9yLCAubGFiZWwuZmFpbCwgLmxhYmVsLnBhc3MsIC5sYWJlbC53YXJuIHsKICAgIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoubGFiZWwuZXJyb3IsIC5sYWJlbC5mYWlsIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkOTUzNGY7Cn0KLmxhYmVsLnBhc3MgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzVjYjg1YzsKfQoubGFiZWwud2FybiB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWM5NzFmOwp9Ci8qIFRvcCByaWdodCBoZWFkZXIgKi8KI3RvcC1yaWdodC1oZWFkZXIgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgcmlnaHQ6IDA7CiAgICB6LWluZGV4OiAxMDAwOwogICAgd2lkdGg6IDEyZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KI3JlcG9ydC1vci1sb2ctbGluayBhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogYmxhY2s7CiAgICBjb2xvcjogd2hpdGU7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKICAgIHBhZGRpbmc6IDAuM2VtIDA7CiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7Cn0KI3JlcG9ydC1vci1sb2ctbGluayBhOmhvdmVyIHsKICAgIGNvbG9yOiAjZGRkOwp9CiNsb2ctbGV2ZWwtc2VsZWN0b3IgewogICAgcGFkZGluZzogMC4zZW0gMDsKICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiAjZGRkOwp9Ci8qIFN0YXRpc3RpY3MgdGFibGUgKi8KLnN0YXRpc3RpY3MgewogICAgd2lkdGg6IDY1ZW07CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBtYXJnaW4tYm90dG9tOiAxZW07Cn0KLnN0YXRpc3RpY3MgdHI6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Y0ZjRmNDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQouc3RhdGlzdGljcyB0aCwgLnN0YXRpc3RpY3MgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwp9Ci5zdGF0aXN0aWNzIHRoIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CiAgICBwYWRkaW5nOiAwLjJlbSAwLjNlbTsKfQouc3RhdGlzdGljcyB0ZCB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9Ci5zdGF0cy1jb2wtc3RhdCB7CiAgICB3aWR0aDogNC41ZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLnN0YXRzLWNvbC1lbGFwc2VkIHsKICAgIHdpZHRoOiA1LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc3RhdHMtY29sLWdyYXBoIHsKICAgIHdpZHRoOiA5ZW07Cn0KdGguc3RhdHMtY29sLWdyYXBoOmhvdmVyIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQouc3RhdC1uYW1lIHsKICAgIGZsb2F0OiBsZWZ0Owp9Ci5zdGF0LW5hbWUgYSwgLnN0YXQtbmFtZSBzcGFuIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci50YWctbGlua3MgewogICAgZm9udC1zaXplOiAwLjllbTsKICAgIGZsb2F0OiByaWdodDsKICAgIG1hcmdpbi10b3A6IDAuMDVlbTsKfQoudGFnLWxpbmtzIHNwYW4gewogICAgbWFyZ2luLWxlZnQ6IDAuMmVtOwp9Ci8qIFN0YXRpc3RpY3MgZ3JhcGggKi8KLmdyYXBoLCAuZW1wdHktZ3JhcGggewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHdpZHRoOiBhdXRvOwogICAgaGVpZ2h0OiA3cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYmFja2dyb3VuZDogI2YzMzsKfQouZW1wdHktZ3JhcGggewogICAgYmFja2dyb3VuZDogI2VlZTsKfQoucGFzcy1iYXIsIC5mYWlsLWJhciB7CiAgICBmbG9hdDogbGVmdDsKICAgIGhlaWdodDogMTAwJTsKfQoucGFzcy1iYXIgewogICAgYmFja2dyb3VuZDogIzFkNDsKfQovKiBUYWJsZXNvcnRlciAtIGFkYXB0ZWQgZnJvbSBwcm92aWRlZCBCbHVlIFNraW4gKi8KLnRhYmxlc29ydGVyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQ3dBSkFJQUFBSDkvZndBQUFDSDVCQUVBQUFFQUxBQUFBQUFMQUFrQUFBSVJqQU9uQnIzY25JcjBXVWpUckM5ZTlCUUFPdz09KTsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgcmlnaHQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLnRhYmxlc29ydGVyLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Ci50YWJsZXNvcnRlci1oZWFkZXJBc2MgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBS0VBQUFBQUFIOS9md0FBQUFBQUFDSDVCQUVBQUFJQUxBQUFBQUFMQUFrQUFBSVVsQlduRnIzY25JcjBXUU95Qm12enAxM0NweFFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjICFpbXBvcnRhbnQ7Cn0KLnRhYmxlc29ydGVyLWhlYWRlckRlc2MgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBS0VBQUFBQUFIOS9md0FBQUFBQUFDSDVCQUVBQUFJQUxBQUFBQUFMQUFrQUFBSVVsQVduQnIzY25JcjBXUk95RG12enAxM0NweFFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjICFpbXBvcnRhbnQ7Cn0KLnNvcnRlci1mYWxzZSB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5zb3J0ZXItZmFsc2U6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgovKiBHZW5lcmljIHRhYmxlIHN0eWxlcyAqLwp0YWJsZSB7CiAgICBtYXJnaW46IDAgMXB4OwogICAgYmFja2dyb3VuZDogd2hpdGU7Cn0KdHIgewogICAgYmFja2dyb3VuZDogd2hpdGU7Cn0KdGggewogICAgYmFja2dyb3VuZDogI2RkZDsKICAgIGNvbG9yOiBibGFjazsKfQovKiBTdW1tYXJ5IGFuZCB0b3RhbC90YWcvc3VpdGUgZGV0YWlscyAqLwouZGV0YWlscyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGNsZWFyOiBib3RoOwogICAgd2lkdGg6IDY1ZW07CiAgICBtYXJnaW4tYm90dG9tOiAxZW07Cn0KLmRldGFpbHMgdGggewogICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICB3aWR0aDogMTBlbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgIHBhZGRpbmc6IDAuMmVtIDAuNGVtOwp9Ci5kZXRhaWxzIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICBwYWRkaW5nOiAwLjJlbSAwLjRlbTsKfQouc2VsZWN0b3IgdGgsIC5zZWxlY3RvciB0ZCB7CiAgICBwYWRkaW5nLXRvcDogMC41ZW07CiAgICBwYWRkaW5nLWJvdHRvbTogMC41ZW07CiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwp9Ci5maXJzdC1zZWxlY3RvciB0aCwgLmZpcnN0LXNlbGVjdG9yIHRkewogICAgcGFkZGluZy1ib3R0b206IDAuMmVtOwp9Ci5taWRkbGUtc2VsZWN0b3IgdGgsIC5taWRkbGUtc2VsZWN0b3IgdGQgewogICAgcGFkZGluZy10b3A6IDAuMmVtOwogICAgcGFkZGluZy1ib3R0b206IDAuMmVtOwp9Ci5sYXN0LXNlbGVjdG9yIHRoLCAubGFzdC1zZWxlY3RvciB0ZHsKICAgIHBhZGRpbmctdG9wOiAwLjJlbTsKfQojcHJpbnQtc2VsZWN0b3IgewogICAgZGlzcGxheTogbm9uZTsKfQovKiBTZWFyY2ggKi8KI3NlYXJjaC1zdWl0ZSwgI3NlYXJjaC10ZXN0LCAjc2VhcmNoLWluY2x1ZGUsICNzZWFyY2gtZXhjbHVkZSB7CiAgICB3aWR0aDogMjVlbTsKfQojc2VhcmNoIGE6aG92ZXIgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CiNzZWFyY2gtaGVscCBkaXYgewogICAgbWFyZ2luOiAwLjVlbSAwLjVlbSAwLjdlbSAwOwogICAgcGFkZGluZzogMC43ZW07CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQojc2VhcmNoLWhlbHAgaDMsICNzZWFyY2gtaGVscCBwIHsKICAgIG1hcmdpbjogMCAwIDAuN2VtIDA7Cn0KLnNlYXJjaC1oZWxwLWV4YW1wbGVzIHsKICAgIHRhYmxlLWxheW91dDogYXV0bzsKICAgIHdpZHRoOiAxMDAlOwp9Ci5zZWFyY2gtaGVscC1leGFtcGxlcywgLnNlYXJjaC1oZWxwLWV4YW1wbGVzIHRyLAouc2VhcmNoLWhlbHAtZXhhbXBsZXMgdGgsIC5zZWFyY2gtaGVscC1leGFtcGxlcyB0ZCB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIG1hcmdpbjogMDsKfQouc2VhcmNoLWhlbHAtZXhhbXBsZXMgdGgsIC5zZWFyY2gtaGVscC1leGFtcGxlcyB0ZCB7CiAgICBwYWRkaW5nOiAwLjJlbSAwLjdlbSAwLjJlbSAwOwp9Ci5oZWxwLWl0ZW0gewogICAgd2lkdGg6IDEwJTsKfQouaGVscC1leHBsYW5hdGlvbiB7CiAgICB3aWR0aDogNjUlOwp9Ci5oZWxwLWV4YW1wbGVzIHsKICAgIHdpZHRoOiAyNSU7Cn0KLyogVGFicyAtIGFkYXB0ZWQgZnJvbSBodHRwOi8vd3d3Lmh0bWxkb2cuY29tL2FydGljbGVzL3RhYnMgKi8KI2RldGFpbC10YWJzIHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luOiAwIDFlbTsKfQouZGV0YWlsLXRhYiB7CiAgICBmbG9hdDogbGVmdDsKICAgIGJhY2tncm91bmQ6ICNkZGQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDsKICAgIG1hcmdpbjogMCAwLjVlbSAwIDA7CiAgICBwYWRkaW5nLXRvcDogMC4xZW07CiAgICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDsKfQouZGV0YWlsLXRhYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwp9Ci5kZXRhaWwtdGFiIGEgewogICAgY29sb3I6IGJsYWNrOwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBwYWRkaW5nOiAwIDFlbTsKfQouZGV0YWlsLXRhYi1zZWxlY3RlZCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0b3A6IDFweDsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9Ci5kZXRhaWwtdGFiLXNlbGVjdGVkOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9Ci8qIFRlc3QgZGV0YWlscyB0YWJsZSAqLwojdGVzdC1kZXRhaWxzIHsKICAgIHdpZHRoOiAxMDAlOwogICAgYm9yZGVyLXNwYWNpbmc6IDFweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2M7Cn0KI3Rlc3QtZGV0YWlscyA+IHRib2R5ID4gdHI6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Y0ZjRmNDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQojdGVzdC1kZXRhaWxzIHRoLCAjdGVzdC1kZXRhaWxzIHRkIHsKICAgIHBhZGRpbmc6IDAuMmVtOwp9Ci5kZXRhaWxzLWxpbWl0ZWQgewogICAgbWF4LWhlaWdodDogMjBlbTsKICAgIG92ZXJmbG93OiBhdXRvOwp9Ci5kZXRhaWxzLWNvbC1oZWFkZXIgewogICAgcGFkZGluZy1yaWdodDogMWVtOwp9Ci5kZXRhaWxzLWNvbC10b2dnbGUgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBjb2xvcjogIzZjNmM2YzsgLyogc2FtZSBhcyBpbiBzb3J0IGljb24gKi8KICAgIGN1cnNvcjogcG9pbnRlcjsKfQouZGV0YWlscy1jb2wtdG9nZ2xlOmhvdmVyIHsKICAgIGNvbG9yOiBibGFjazsKfQouZGV0YWlscy1jb2wtbmFtZSB7CiAgICBtaW4td2lkdGg6IDIwZW07CiAgICBmb250LXdlaWdodDogYm9sZDsKfQouZGV0YWlscy1jb2wtZG9jIHsKICAgIG1pbi13aWR0aDogMTBlbTsKfQouZGV0YWlscy1jb2wtdGFncyB7CiAgICBtaW4td2lkdGg6IDEwZW07Cn0KLmRldGFpbHMtY29sLWNyaXQgewogICAgd2lkdGg6IDMuNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5kZXRhaWxzLWNvbC1zdGF0dXMgewogICAgd2lkdGg6IDQuNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5kZXRhaWxzLWNvbC1tc2cgewogICAgbWluLXdpZHRoOiAyMGVtOwp9Ci5kZXRhaWxzLWNvbC1lbGFwc2VkIHsKICAgIHdpZHRoOiA3ZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLmRldGFpbHMtY29sLXRpbWVzIHsKICAgIHdpZHRoOiAxMWVtOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouaGlkZGVuIC5kZXRhaWxzLWNvbC1oZWFkZXIsIHRkLmhpZGRlbiA+IGRpdiB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5oaWRkZW4gewogICAgd2lkdGg6IDEzcHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwp9CnRoLmhpZGRlbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Cjwvc3R5bGU+CjxzdHlsZSBtZWRpYT0icHJpbnQiIHR5cGU9InRleHQvY3NzIj4KYm9keSB7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogOHB0Owp9CmE6bGluaywgYTp2aXNpdGVkIHsKICAgIGNvbG9yOiBibGFjazsKfQojaGVhZGVyIHsKICAgIHdpZHRoOiBhdXRvOwp9Ci5kZXRhaWxzLCAuc3RhdGlzdGljcyB7CiAgICB3aWR0aDogMTAwJTsKfQojZ2VuZXJhdGVkLWFnbywgI3RvcC1yaWdodC1oZWFkZXIsICNub3JtYWwtc2VsZWN0b3IsICNzZWFyY2gtYnV0dG9ucywKLmZvbGRpbmctYnV0dG9uLCAuZXhwYW5kLCAuaGlkZGVuLCAuZGV0YWlscy1jb2wtdG9nZ2xlIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLmVsZW1lbnQtaGVhZGVyLXRleHQsIC5jaGlsZHJlbiB7CiAgICBtYXJnaW46IDA7Cn0KI3Rlc3QtZGV0YWlscyB7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgdGFibGUtbGF5b3V0OiBhdXRvOwp9CiN0ZXN0LWRldGFpbHMgdGgsICN0ZXN0LWRldGFpbHMgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Cn0KLmRldGFpbHMtY29sLWhlYWRlciB7CiAgICBwYWRkaW5nOiAwOwp9CiNwcmludC1zZWxlY3RvciB7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwp9Ci50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGJhY2tncm91bmQ6ICNkZGQgIWltcG9ydGFudDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgojamF2YXNjcmlwdC1kaXNhYmxlZCB7CiAgICB3aWR0aDogNjAwcHg7CiAgICBtYXJnaW46IDEwMHB4IGF1dG8gMCBhdXRvOwogICAgcGFkZGluZzogMjBweDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9CiNqYXZhc2NyaXB0LWRpc2FibGVkIGgxIHsKICAgIHdpZHRoOiAxMDAlOwogICAgZmxvYXQ6IG5vbmU7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgdWwgewogICAgZm9udC1zaXplOiAxLjJlbTsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCBsaSB7CiAgICBtYXJnaW46IDAuNWVtIDA7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgYiB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLmRvYyA+ICogewogICAgbWFyZ2luOiAwLjdlbSAxZW0gMC4xZW0gMWVtOwogICAgcGFkZGluZzogMDsKfQouZG9jID4gcCwgLmRvYyA+IGgxLCAuZG9jID4gaDIsIC5kb2MgPiBoMywgLmRvYyA+IGg0IHsKICAgIG1hcmdpbjogMC43ZW0gMCAwLjFlbSAwOwp9Ci5kb2MgPiAqOmZpcnN0LWNoaWxkIHsKICAgIG1hcmdpbi10b3A6IDAuMWVtOwp9Ci5kb2MgdGFibGUgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGVtcHR5LWNlbGxzOiBzaG93OwogICAgZm9udC1zaXplOiAwLjllbTsKfQouZG9jIHRhYmxlIHRoLCAuZG9jIHRhYmxlIHRkIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwogICAgaGVpZ2h0OiAxLjJlbTsKfQouZG9jIHRhYmxlIHRoIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKfQouZG9jIHByZSB7CiAgICBmb250LXNpemU6IDEuMWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgIGJhY2tncm91bmQ6ICNmNGY0ZjQ7Cn0KLmRvYyBjb2RlIHsKICAgIHBhZGRpbmc6IDAgMC4yZW07CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgYmFja2dyb3VuZDogI2VlZTsKfQouZG9jIGxpIHsKICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsKICAgIGxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwp9Ci5kb2MgaW1nIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmRvYyBociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KPC9zdHlsZT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKiEgalF1ZXJ5IHYzLjMuMSB8IChjKSBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiOyJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUuZG9jdW1lbnQ/dChlLCEwKTpmdW5jdGlvbihlKXtpZighZS5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gdChlKX06dChlKX0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7dmFyIG49W10scj1lLmRvY3VtZW50LGk9T2JqZWN0LmdldFByb3RvdHlwZU9mLG89bi5zbGljZSxhPW4uY29uY2F0LHM9bi5wdXNoLHU9bi5pbmRleE9mLGw9e30sYz1sLnRvU3RyaW5nLGY9bC5oYXNPd25Qcm9wZXJ0eSxwPWYudG9TdHJpbmcsZD1wLmNhbGwoT2JqZWN0KSxoPXt9LGc9ZnVuY3Rpb24gZSh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmIm51bWJlciIhPXR5cGVvZiB0Lm5vZGVUeXBlfSx5PWZ1bmN0aW9uIGUodCl7cmV0dXJuIG51bGwhPXQmJnQ9PT10LndpbmRvd30sdj17dHlwZTohMCxzcmM6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIG0oZSx0LG4pe3ZhciBpLG89KHQ9dHx8cikuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoby50ZXh0PWUsbilmb3IoaSBpbiB2KW5baV0mJihvW2ldPW5baV0pO3QuaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2xbYy5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9dmFyIGI9IjMuMy4xIix3PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyB3LmZuLmluaXQoZSx0KX0sVD0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7dy5mbj13LnByb3RvdHlwZT17anF1ZXJ5OiIzLjMuMSIsY29uc3RydWN0b3I6dyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIG8uY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP28uY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHR9LGVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcubWFwKHRoaXMsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHQsbix0KX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soby5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKyhlPDA/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobj49MCYmbjx0P1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDpzLHNvcnQ6bi5zb3J0LHNwbGljZTpuLnNwbGljZX0sdy5leHRlbmQ9dy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8sYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGw9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fGcoYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKW49YVt0XSxhIT09KHI9ZVt0XSkmJihsJiZyJiYody5pc1BsYWluT2JqZWN0KHIpfHwoaT1BcnJheS5pc0FycmF5KHIpKSk/KGk/KGk9ITEsbz1uJiZBcnJheS5pc0FycmF5KG4pP246W10pOm89biYmdy5pc1BsYWluT2JqZWN0KG4pP246e30sYVt0XT13LmV4dGVuZChsLG8scikpOnZvaWQgMCE9PXImJihhW3RdPXIpKTtyZXR1cm4gYX0sdy5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKCIzLjMuMSIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4hKCFlfHwiW29iamVjdCBPYmplY3RdIiE9PWMuY2FsbChlKSkmJighKHQ9aShlKSl8fCJmdW5jdGlvbiI9PXR5cGVvZihuPWYuY2FsbCh0LCJjb25zdHJ1Y3RvciIpJiZ0LmNvbnN0cnVjdG9yKSYmcC5jYWxsKG4pPT09ZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbihlKXttKGUpfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2lmKEMoZSkpe2ZvcihuPWUubGVuZ3RoO3I8bjtyKyspaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrfWVsc2UgZm9yKHIgaW4gZSlpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWs7cmV0dXJuIGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6KGUrIiIpLnJlcGxhY2UoVCwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoQyhPYmplY3QoZSkpP3cubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOnMuY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTp1LmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0rdC5sZW5ndGgscj0wLGk9ZS5sZW5ndGg7cjxuO3IrKyllW2krK109dFtyXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIsaT1bXSxvPTAsYT1lLmxlbmd0aCxzPSFuO288YTtvKyspKHI9IXQoZVtvXSxvKSkhPT1zJiZpLnB1c2goZVtvXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPTAscz1bXTtpZihDKGUpKWZvcihyPWUubGVuZ3RoO288cjtvKyspbnVsbCE9KGk9dChlW29dLG8sbikpJiZzLnB1c2goaSk7ZWxzZSBmb3IobyBpbiBlKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmcy5wdXNoKGkpO3JldHVybiBhLmFwcGx5KFtdLHMpfSxndWlkOjEsc3VwcG9ydDpofSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKHcuZm5bU3ltYm9sLml0ZXJhdG9yXT1uW1N5bWJvbC5pdGVyYXRvcl0pLHcuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtsWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIEMoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49eChlKTtyZXR1cm4hZyhlKSYmIXkoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmdD4wJiZ0LTEgaW4gZSl9dmFyIEU9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHMsdSxsLGMsZixwLGQsaCxnLHksdixtLHgsYj0ic2l6emxlIisxKm5ldyBEYXRlLHc9ZS5kb2N1bWVudCxUPTAsQz0wLEU9YWUoKSxrPWFlKCksUz1hZSgpLEQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihmPSEwKSwwfSxOPXt9Lmhhc093blByb3BlcnR5LEE9W10saj1BLnBvcCxxPUEucHVzaCxMPUEucHVzaCxIPUEuc2xpY2UsTz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX0sUD0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLFI9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixJPSJcXFsiK00rIiooIitSKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrUisiKSl8KSIrTSsiKlxcXSIsVz0iOigiK1IrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK0krIikqKXwuKilcXCl8KSIsJD1uZXcgUmVnRXhwKE0rIisiLCJnIiksQj1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLEY9bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSxfPW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksej1uZXcgUmVnRXhwKCI9IitNKyIqKFteXFxdJ1wiXSo/KSIrTSsiKlxcXSIsImciKSxYPW5ldyBSZWdFeHAoVyksVT1uZXcgUmVnRXhwKCJeIitSKyIkIiksVj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitSKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK1IrIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK1IrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitJKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrVyksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitNKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitNKyIqKD86KFsrLV18KSIrTSsiKihcXGQrKXwpKSIrTSsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrUCsiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK00rIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrTSsiKigoPzotXFxkKT9cXGQqKSIrTSsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sRz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFk9L15oXGQkL2ksUT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sSj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLEs9L1srfl0vLFo9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitNKyI/fCgiK00rIil8LikiLCJpZyIpLGVlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iMHgiK3QtNjU1MzY7cmV0dXJuIHIhPT1yfHxuP3Q6cjwwP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShyPj4xMHw1NTI5NiwxMDIzJnJ8NTYzMjApfSx0ZT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxuZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PyJcMCI9PT1lPyJcdWZmZmQiOmUuc2xpY2UoMCwtMSkrIlxcIitlLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2V9LHJlPWZ1bmN0aW9uKCl7cCgpfSxpZT1tZShmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJigiZm9ybSJpbiBlfHwibGFiZWwiaW4gZSl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7TC5hcHBseShBPUguY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksQVt3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtMPXthcHBseTpBLmxlbmd0aD9mdW5jdGlvbihlLHQpe3EuYXBwbHkoZSxILmNhbGwodCkpfTpmdW5jdGlvbihlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDt3aGlsZShlW24rK109dFtyKytdKTtlLmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBvZShlLHQscixpKXt2YXIgbyxzLGwsYyxmLGgsdixtPXQmJnQub3duZXJEb2N1bWVudCxUPXQ/dC5ub2RlVHlwZTo5O2lmKHI9cnx8W10sInN0cmluZyIhPXR5cGVvZiBlfHwhZXx8MSE9PVQmJjkhPT1UJiYxMSE9PVQpcmV0dXJuIHI7aWYoIWkmJigodD90Lm93bmVyRG9jdW1lbnR8fHQ6dykhPT1kJiZwKHQpLHQ9dHx8ZCxnKSl7aWYoMTEhPT1UJiYoZj1KLmV4ZWMoZSkpKWlmKG89ZlsxXSl7aWYoOT09PVQpe2lmKCEobD10LmdldEVsZW1lbnRCeUlkKG8pKSlyZXR1cm4gcjtpZihsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZSBpZihtJiYobD1tLmdldEVsZW1lbnRCeUlkKG8pKSYmeCh0LGwpJiZsLmlkPT09bylyZXR1cm4gci5wdXNoKGwpLHJ9ZWxzZXtpZihmWzJdKXJldHVybiBMLmFwcGx5KHIsdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSkscjtpZigobz1mWzNdKSYmbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZ0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEwuYXBwbHkocix0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobykpLHJ9aWYobi5xc2EmJiFTW2UrIiAiXSYmKCF5fHwheS50ZXN0KGUpKSl7aWYoMSE9PVQpbT10LHY9ZTtlbHNlIGlmKCJvYmplY3QiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXsoYz10LmdldEF0dHJpYnV0ZSgiaWQiKSk/Yz1jLnJlcGxhY2UodGUsbmUpOnQuc2V0QXR0cmlidXRlKCJpZCIsYz1iKSxzPShoPWEoZSkpLmxlbmd0aDt3aGlsZShzLS0paFtzXT0iIyIrYysiICIrdmUoaFtzXSk7dj1oLmpvaW4oIiwiKSxtPUsudGVzdChlKSYmZ2UodC5wYXJlbnROb2RlKXx8dH1pZih2KXRyeXtyZXR1cm4gTC5hcHBseShyLG0ucXVlcnlTZWxlY3RvckFsbCh2KSkscn1jYXRjaChlKXt9ZmluYWxseXtjPT09YiYmdC5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gdShlLnJlcGxhY2UoQiwiJDEiKSx0LHIsaSl9ZnVuY3Rpb24gYWUoKXt2YXIgZT1bXTtmdW5jdGlvbiB0KG4saSl7cmV0dXJuIGUucHVzaChuKyIgIik+ci5jYWNoZUxlbmd0aCYmZGVsZXRlIHRbZS5zaGlmdCgpXSx0W24rIiAiXT1pfXJldHVybiB0fWZ1bmN0aW9uIHNlKGUpe3JldHVybiBlW2JdPSEwLGV9ZnVuY3Rpb24gdWUoZSl7dmFyIHQ9ZC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGxlKGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLGk9bi5sZW5ndGg7d2hpbGUoaS0tKXIuYXR0ckhhbmRsZVtuW2ldXT10fWZ1bmN0aW9uIGNlKGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBmZShlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gcGUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PW58fCJidXR0b24iPT09bikmJnQudHlwZT09PWV9fWZ1bmN0aW9uIGRlKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4iZm9ybSJpbiB0P3QucGFyZW50Tm9kZSYmITE9PT10LmRpc2FibGVkPyJsYWJlbCJpbiB0PyJsYWJlbCJpbiB0LnBhcmVudE5vZGU/dC5wYXJlbnROb2RlLmRpc2FibGVkPT09ZTp0LmRpc2FibGVkPT09ZTp0LmlzRGlzYWJsZWQ9PT1lfHx0LmlzRGlzYWJsZWQhPT0hZSYmaWUodCk9PT1lOnQuZGlzYWJsZWQ9PT1lOiJsYWJlbCJpbiB0JiZ0LmRpc2FibGVkPT09ZX19ZnVuY3Rpb24gaGUoZSl7cmV0dXJuIHNlKGZ1bmN0aW9uKHQpe3JldHVybiB0PSt0LHNlKGZ1bmN0aW9uKG4scil7dmFyIGksbz1lKFtdLG4ubGVuZ3RoLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKW5baT1vW2FdXSYmKG5baV09IShyW2ldPW5baV0pKX0pfSl9ZnVuY3Rpb24gZ2UoZSl7cmV0dXJuIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1uPW9lLnN1cHBvcnQ9e30sbz1vZS5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuISF0JiYiSFRNTCIhPT10Lm5vZGVOYW1lfSxwPW9lLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0LGksYT1lP2Uub3duZXJEb2N1bWVudHx8ZTp3O3JldHVybiBhIT09ZCYmOT09PWEubm9kZVR5cGUmJmEuZG9jdW1lbnRFbGVtZW50PyhkPWEsaD1kLmRvY3VtZW50RWxlbWVudCxnPSFvKGQpLHchPT1kJiYoaT1kLmRlZmF1bHRWaWV3KSYmaS50b3AhPT1pJiYoaS5hZGRFdmVudExpc3RlbmVyP2kuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixyZSwhMSk6aS5hdHRhY2hFdmVudCYmaS5hdHRhY2hFdmVudCgib251bmxvYWQiLHJlKSksbi5hdHRyaWJ1dGVzPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsYXNzTmFtZT0iaSIsIWUuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLG4uZ2V0RWxlbWVudHNCeVRhZ05hbWU9dWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXBwZW5kQ2hpbGQoZC5jcmVhdGVDb21tZW50KCIiKSksIWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxuLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9US50ZXN0KGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksbi5nZXRCeUlkPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBoLmFwcGVuZENoaWxkKGUpLmlkPWIsIWQuZ2V0RWxlbWVudHNCeU5hbWV8fCFkLmdldEVsZW1lbnRzQnlOYW1lKGIpLmxlbmd0aH0pLG4uZ2V0QnlJZD8oci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0sci5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09dH19LHIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG4scixpLG89dC5nZXRFbGVtZW50QnlJZChlKTtpZihvKXtpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb119cmV0dXJuW119fSksci5maW5kLlRBRz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6bi5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sci5maW5kLkNMQVNTPW4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZylyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfSx2PVtdLHk9W10sKG4ucXNhPVEudGVzdChkLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKHVlKGZ1bmN0aW9uKGUpe2guYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitiKyInPjwvYT48c2VsZWN0IGlkPSciK2IrIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmeS5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8eS5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK1ArIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitiKyItXSIpLmxlbmd0aHx8eS5wdXNoKCJ+PSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHkucHVzaCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitiKyIrKiIpLmxlbmd0aHx8eS5wdXNoKCIuIy4rWyt+XSIpfSksdWUoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIHQ9ZC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3Quc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmeS5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ5LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksaC5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnkucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx5LnB1c2goIiwuKjoiKX0pKSwobi5tYXRjaGVzU2VsZWN0b3I9US50ZXN0KG09aC5tYXRjaGVzfHxoLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8aC5tb3pNYXRjaGVzU2VsZWN0b3J8fGgub01hdGNoZXNTZWxlY3Rvcnx8aC5tc01hdGNoZXNTZWxlY3RvcikpJiZ1ZShmdW5jdGlvbihlKXtuLmRpc2Nvbm5lY3RlZE1hdGNoPW0uY2FsbChlLCIqIiksbS5jYWxsKGUsIltzIT0nJ106eCIpLHYucHVzaCgiIT0iLFcpfSkseT15Lmxlbmd0aCYmbmV3IFJlZ0V4cCh5LmpvaW4oInwiKSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSksdD1RLnRlc3QoaC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikseD10fHxRLnRlc3QoaC5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxEPXQ/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gZj0hMCwwO3ZhciByPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiByfHwoMSYocj0oZS5vd25lckRvY3VtZW50fHxlKT09PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSl8fCFuLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PXI/ZT09PWR8fGUub3duZXJEb2N1bWVudD09PXcmJngodyxlKT8tMTp0PT09ZHx8dC5vd25lckRvY3VtZW50PT09dyYmeCh3LHQpPzE6Yz9PKGMsZSktTyhjLHQpOjA6NCZyPy0xOjEpfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBmPSEwLDA7dmFyIG4scj0wLGk9ZS5wYXJlbnROb2RlLG89dC5wYXJlbnROb2RlLGE9W2VdLHM9W3RdO2lmKCFpfHwhbylyZXR1cm4gZT09PWQ/LTE6dD09PWQ/MTppPy0xOm8/MTpjP08oYyxlKS1PKGMsdCk6MDtpZihpPT09bylyZXR1cm4gY2UoZSx0KTtuPWU7d2hpbGUobj1uLnBhcmVudE5vZGUpYS51bnNoaWZ0KG4pO249dDt3aGlsZShuPW4ucGFyZW50Tm9kZSlzLnVuc2hpZnQobik7d2hpbGUoYVtyXT09PXNbcl0pcisrO3JldHVybiByP2NlKGFbcl0sc1tyXSk6YVtyXT09PXc/LTE6c1tyXT09PXc/MTowfSxkKTpkfSxvZS5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG9lKGUsbnVsbCxudWxsLHQpfSxvZS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSx0KXtpZigoZS5vd25lckRvY3VtZW50fHxlKSE9PWQmJnAoZSksdD10LnJlcGxhY2UoeiwiPSckMSddIiksbi5tYXRjaGVzU2VsZWN0b3ImJmcmJiFTW3QrIiAiXSYmKCF2fHwhdi50ZXN0KHQpKSYmKCF5fHwheS50ZXN0KHQpKSl0cnl7dmFyIHI9bS5jYWxsKGUsdCk7aWYocnx8bi5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiByfWNhdGNoKGUpe31yZXR1cm4gb2UodCxkLG51bGwsW2VdKS5sZW5ndGg+MH0sb2UuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS5vd25lckRvY3VtZW50fHxlKSE9PWQmJnAoZSkseChlLHQpfSxvZS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPT1kJiZwKGUpO3ZhciBpPXIuYXR0ckhhbmRsZVt0LnRvTG93ZXJDYXNlKCldLG89aSYmTi5jYWxsKHIuYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP2koZSx0LCFnKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PW8/bzpuLmF0dHJpYnV0ZXN8fCFnP2UuZ2V0QXR0cmlidXRlKHQpOihvPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJm8uc3BlY2lmaWVkP28udmFsdWU6bnVsbH0sb2UuZXNjYXBlPWZ1bmN0aW9uKGUpe3JldHVybihlKyIiKS5yZXBsYWNlKHRlLG5lKX0sb2UuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSxvZS51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LHI9W10saT0wLG89MDtpZihmPSFuLmRldGVjdER1cGxpY2F0ZXMsYz0hbi5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydChEKSxmKXt3aGlsZSh0PWVbbysrXSl0PT09ZVtvXSYmKGk9ci5wdXNoKG8pKTt3aGlsZShpLS0pZS5zcGxpY2UocltpXSwxKX1yZXR1cm4gYz1udWxsLGV9LGk9b2UuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9MCxvPWUubm9kZVR5cGU7aWYobyl7aWYoMT09PW98fDk9PT1vfHwxMT09PW8pe2lmKCJzdHJpbmciPT10eXBlb2YgZS50ZXh0Q29udGVudClyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9aShlKX1lbHNlIGlmKDM9PT1vfHw0PT09bylyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSB3aGlsZSh0PWVbcisrXSluKz1pKHQpO3JldHVybiBufSwocj1vZS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpzZSxtYXRjaDpWLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnJlcGxhY2UoWixlZSksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UoWixlZSksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fG9lLmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJm9lLmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzZdJiZlWzJdO3JldHVybiBWLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXT9lWzJdPWVbNF18fGVbNV18fCIiOm4mJlgudGVzdChuKSYmKHQ9YShuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoWixlZSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9RVtlKyIgIl07cmV0dXJuIHR8fCh0PW5ldyBSZWdFeHAoIihefCIrTSsiKSIrZSsiKCIrTSsifCQpIikpJiZFKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdCgic3RyaW5nIj09dHlwZW9mIGUuY2xhc3NOYW1lJiZlLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIGk9b2UuYXR0cihyLGUpO3JldHVybiBudWxsPT1pPyIhPSI9PT10OiF0fHwoaSs9IiIsIj0iPT09dD9pPT09bjoiIT0iPT09dD9pIT09bjoiXj0iPT09dD9uJiYwPT09aS5pbmRleE9mKG4pOiIqPSI9PT10P24mJmkuaW5kZXhPZihuKT4tMToiJD0iPT09dD9uJiZpLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT10PygiICIraS5yZXBsYWNlKCQsIiAiKSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PXQmJihpPT09bnx8aS5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSIpKX19LENISUxEOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89Im50aCIhPT1lLnNsaWNlKDAsMyksYT0ibGFzdCIhPT1lLnNsaWNlKC00KSxzPSJvZi10eXBlIj09PXQ7cmV0dXJuIDE9PT1yJiYwPT09aT9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24odCxuLHUpe3ZhciBsLGMsZixwLGQsaCxnPW8hPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIseT10LnBhcmVudE5vZGUsdj1zJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbT0hdSYmIXMseD0hMTtpZih5KXtpZihvKXt3aGlsZShnKXtwPXQ7d2hpbGUocD1wW2ddKWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09djoxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtoPWc9Im9ubHkiPT09ZSYmIWgmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoaD1bYT95LmZpcnN0Q2hpbGQ6eS5sYXN0Q2hpbGRdLGEmJm0pe3g9KGQ9KGw9KGM9KGY9KHA9eSlbYl18fChwW2JdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbZV18fFtdKVswXT09PVQmJmxbMV0pJiZsWzJdLHA9ZCYmeS5jaGlsZE5vZGVzW2RdO3doaWxlKHA9KytkJiZwJiZwW2ddfHwoeD1kPTApfHxoLnBvcCgpKWlmKDE9PT1wLm5vZGVUeXBlJiYrK3gmJnA9PT10KXtjW2VdPVtULGQseF07YnJlYWt9fWVsc2UgaWYobSYmKHg9ZD0obD0oYz0oZj0ocD10KVtiXXx8KHBbYl09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVtlXXx8W10pWzBdPT09VCYmbFsxXSksITE9PT14KXdoaWxlKHA9KytkJiZwJiZwW2ddfHwoeD1kPTApfHxoLnBvcCgpKWlmKChzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXY6MT09PXAubm9kZVR5cGUpJiYrK3gmJihtJiYoKGM9KGY9cFtiXXx8KHBbYl09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVtlXT1bVCx4XSkscD09PXQpKWJyZWFrO3JldHVybih4LT1pKT09PXJ8fHglcj09MCYmeC9yPj0wfX19LFBTRVVETzpmdW5jdGlvbihlLHQpe3ZhciBuLGk9ci5wc2V1ZG9zW2VdfHxyLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8b2UuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIitlKTtyZXR1cm4gaVtiXT9pKHQpOmkubGVuZ3RoPjE/KG49W2UsZSwiIix0XSxyLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT9zZShmdW5jdGlvbihlLG4pe3ZhciByLG89aShlLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKWVbcj1PKGUsb1thXSldPSEobltyXT1vW2FdKX0pOmZ1bmN0aW9uKGUpe3JldHVybiBpKGUsMCxuKX0pOml9fSxwc2V1ZG9zOntub3Q6c2UoZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1bXSxyPXMoZS5yZXBsYWNlKEIsIiQxIikpO3JldHVybiByW2JdP3NlKGZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLGE9cihlLG51bGwsaSxbXSkscz1lLmxlbmd0aDt3aGlsZShzLS0pKG89YVtzXSkmJihlW3NdPSEodFtzXT1vKSl9KTpmdW5jdGlvbihlLGksbyl7cmV0dXJuIHRbMF09ZSxyKHQsbnVsbCxvLG4pLHRbMF09bnVsbCwhbi5wb3AoKX19KSxoYXM6c2UoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBvZShlLHQpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOnNlKGZ1bmN0aW9uKGUpe3JldHVybiBlPWUucmVwbGFjZShaLGVlKSxmdW5jdGlvbih0KXtyZXR1cm4odC50ZXh0Q29udGVudHx8dC5pbm5lclRleHR8fGkodCkpLmluZGV4T2YoZSk+LTF9fSksbGFuZzpzZShmdW5jdGlvbihlKXtyZXR1cm4gVS50ZXN0KGV8fCIiKXx8b2UuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrZSksZT1lLnJlcGxhY2UoWixlZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXt2YXIgbjtkb3tpZihuPWc/dC5sYW5nOnQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHx0LmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybihuPW4udG9Mb3dlckNhc2UoKSk9PT1lfHwwPT09bi5pbmRleE9mKGUrIi0iKX13aGlsZSgodD10LnBhcmVudE5vZGUpJiYxPT09dC5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKHQpe3ZhciBuPWUubG9jYXRpb24mJmUubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PXQuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1ofSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWQuYWN0aXZlRWxlbWVudCYmKCFkLmhhc0ZvY3VzfHxkLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmRlKCExKSxkaXNhYmxlZDpkZSghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIXIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBZLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBHLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PXQudG9Mb3dlckNhc2UoKSl9LGZpcnN0OmhlKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpoZShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6aGUoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjpoZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpoZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OmhlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOy0tcj49MDspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6aGUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0pLnBzZXVkb3MubnRoPXIucHNldWRvcy5lcTtmb3IodCBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlyLnBzZXVkb3NbdF09ZmUodCk7Zm9yKHQgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlyLnBzZXVkb3NbdF09cGUodCk7ZnVuY3Rpb24geWUoKXt9eWUucHJvdG90eXBlPXIuZmlsdGVycz1yLnBzZXVkb3Msci5zZXRGaWx0ZXJzPW5ldyB5ZSxhPW9lLnRva2VuaXplPWZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLGEscyx1LGwsYz1rW2UrIiAiXTtpZihjKXJldHVybiB0PzA6Yy5zbGljZSgwKTtzPWUsdT1bXSxsPXIucHJlRmlsdGVyO3doaWxlKHMpe24mJiEoaT1GLmV4ZWMocykpfHwoaSYmKHM9cy5zbGljZShpWzBdLmxlbmd0aCl8fHMpLHUucHVzaChvPVtdKSksbj0hMSwoaT1fLmV4ZWMocykpJiYobj1pLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6aVswXS5yZXBsYWNlKEIsIiAiKX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2ZvcihhIGluIHIuZmlsdGVyKSEoaT1WW2FdLmV4ZWMocykpfHxsW2FdJiYhKGk9bFthXShpKSl8fChuPWkuc2hpZnQoKSxvLnB1c2goe3ZhbHVlOm4sdHlwZTphLG1hdGNoZXM6aX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P3MubGVuZ3RoOnM/b2UuZXJyb3IoZSk6ayhlLHUpLnNsaWNlKDApfTtmdW5jdGlvbiB2ZShlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoLHI9IiI7dDxuO3QrKylyKz1lW3RdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIG1lKGUsdCxuKXt2YXIgcj10LmRpcixpPXQubmV4dCxvPWl8fHIsYT1uJiYicGFyZW50Tm9kZSI9PT1vLHM9QysrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixpKXt3aGlsZSh0PXRbcl0paWYoMT09PXQubm9kZVR5cGV8fGEpcmV0dXJuIGUodCxuLGkpO3JldHVybiExfTpmdW5jdGlvbih0LG4sdSl7dmFyIGwsYyxmLHA9W1Qsc107aWYodSl7d2hpbGUodD10W3JdKWlmKCgxPT09dC5ub2RlVHlwZXx8YSkmJmUodCxuLHUpKXJldHVybiEwfWVsc2Ugd2hpbGUodD10W3JdKWlmKDE9PT10Lm5vZGVUeXBlfHxhKWlmKGY9dFtiXXx8KHRbYl09e30pLGM9Zlt0LnVuaXF1ZUlEXXx8KGZbdC51bmlxdWVJRF09e30pLGkmJmk9PT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpdD10W3JdfHx0O2Vsc2V7aWYoKGw9Y1tvXSkmJmxbMF09PT1UJiZsWzFdPT09cylyZXR1cm4gcFsyXT1sWzJdO2lmKGNbb109cCxwWzJdPWUodCxuLHUpKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB4ZShlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5jdGlvbih0LG4scil7dmFyIGk9ZS5sZW5ndGg7d2hpbGUoaS0tKWlmKCFlW2ldKHQsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06ZVswXX1mdW5jdGlvbiBiZShlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKW9lKGUsdFtyXSxuKTtyZXR1cm4gbn1mdW5jdGlvbiB3ZShlLHQsbixyLGkpe2Zvcih2YXIgbyxhPVtdLHM9MCx1PWUubGVuZ3RoLGw9bnVsbCE9dDtzPHU7cysrKShvPWVbc10pJiYobiYmIW4obyxyLGkpfHwoYS5wdXNoKG8pLGwmJnQucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIFRlKGUsdCxuLHIsaSxvKXtyZXR1cm4gciYmIXJbYl0mJihyPVRlKHIpKSxpJiYhaVtiXSYmKGk9VGUoaSxvKSksc2UoZnVuY3Rpb24obyxhLHMsdSl7dmFyIGwsYyxmLHA9W10sZD1bXSxoPWEubGVuZ3RoLGc9b3x8YmUodHx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLHk9IWV8fCFvJiZ0P2c6d2UoZyxwLGUscyx1KSx2PW4/aXx8KG8/ZTpofHxyKT9bXTphOnk7aWYobiYmbih5LHYscyx1KSxyKXtsPXdlKHYsZCkscihsLFtdLHMsdSksYz1sLmxlbmd0aDt3aGlsZShjLS0pKGY9bFtjXSkmJih2W2RbY11dPSEoeVtkW2NdXT1mKSl9aWYobyl7aWYoaXx8ZSl7aWYoaSl7bD1bXSxjPXYubGVuZ3RoO3doaWxlKGMtLSkoZj12W2NdKSYmbC5wdXNoKHlbY109Zik7aShudWxsLHY9W10sbCx1KX1jPXYubGVuZ3RoO3doaWxlKGMtLSkoZj12W2NdKSYmKGw9aT9PKG8sZik6cFtjXSk+LTEmJihvW2xdPSEoYVtsXT1mKSl9fWVsc2Ugdj13ZSh2PT09YT92LnNwbGljZShoLHYubGVuZ3RoKTp2KSxpP2kobnVsbCxhLHYsdSk6TC5hcHBseShhLHYpfSl9ZnVuY3Rpb24gQ2UoZSl7Zm9yKHZhciB0LG4saSxvPWUubGVuZ3RoLGE9ci5yZWxhdGl2ZVtlWzBdLnR5cGVdLHM9YXx8ci5yZWxhdGl2ZVsiICJdLHU9YT8xOjAsYz1tZShmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9LHMsITApLGY9bWUoZnVuY3Rpb24oZSl7cmV0dXJuIE8odCxlKT4tMX0scywhMCkscD1bZnVuY3Rpb24oZSxuLHIpe3ZhciBpPSFhJiYocnx8biE9PWwpfHwoKHQ9bikubm9kZVR5cGU/YyhlLG4scik6ZihlLG4scikpO3JldHVybiB0PW51bGwsaX1dO3U8bzt1KyspaWYobj1yLnJlbGF0aXZlW2VbdV0udHlwZV0pcD1bbWUoeGUocCksbildO2Vsc2V7aWYoKG49ci5maWx0ZXJbZVt1XS50eXBlXS5hcHBseShudWxsLGVbdV0ubWF0Y2hlcykpW2JdKXtmb3IoaT0rK3U7aTxvO2krKylpZihyLnJlbGF0aXZlW2VbaV0udHlwZV0pYnJlYWs7cmV0dXJuIFRlKHU+MSYmeGUocCksdT4xJiZ2ZShlLnNsaWNlKDAsdS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbdS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKEIsIiQxIiksbix1PGkmJkNlKGUuc2xpY2UodSxpKSksaTxvJiZDZShlPWUuc2xpY2UoaSkpLGk8byYmdmUoZSkpfXAucHVzaChuKX1yZXR1cm4geGUocCl9ZnVuY3Rpb24gRWUoZSx0KXt2YXIgbj10Lmxlbmd0aD4wLGk9ZS5sZW5ndGg+MCxvPWZ1bmN0aW9uKG8sYSxzLHUsYyl7dmFyIGYsaCx5LHY9MCxtPSIwIix4PW8mJltdLGI9W10sdz1sLEM9b3x8aSYmci5maW5kLlRBRygiKiIsYyksRT1UKz1udWxsPT13PzE6TWF0aC5yYW5kb20oKXx8LjEsaz1DLmxlbmd0aDtmb3IoYyYmKGw9YT09PWR8fGF8fGMpO20hPT1rJiZudWxsIT0oZj1DW21dKTttKyspe2lmKGkmJmYpe2g9MCxhfHxmLm93bmVyRG9jdW1lbnQ9PT1kfHwocChmKSxzPSFnKTt3aGlsZSh5PWVbaCsrXSlpZih5KGYsYXx8ZCxzKSl7dS5wdXNoKGYpO2JyZWFrfWMmJihUPUUpfW4mJigoZj0heSYmZikmJnYtLSxvJiZ4LnB1c2goZikpfWlmKHYrPW0sbiYmbSE9PXYpe2g9MDt3aGlsZSh5PXRbaCsrXSl5KHgsYixhLHMpO2lmKG8pe2lmKHY+MCl3aGlsZShtLS0peFttXXx8YlttXXx8KGJbbV09ai5jYWxsKHUpKTtiPXdlKGIpfUwuYXBwbHkodSxiKSxjJiYhbyYmYi5sZW5ndGg+MCYmdit0Lmxlbmd0aD4xJiZvZS51bmlxdWVTb3J0KHUpfXJldHVybiBjJiYoVD1FLGw9dykseH07cmV0dXJuIG4/c2Uobyk6b31yZXR1cm4gcz1vZS5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPVtdLG89U1tlKyIgIl07aWYoIW8pe3R8fCh0PWEoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKShvPUNlKHRbbl0pKVtiXT9yLnB1c2gobyk6aS5wdXNoKG8pOyhvPVMoZSxFZShpLHIpKSkuc2VsZWN0b3I9ZX1yZXR1cm4gb30sdT1vZS5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4saSl7dmFyIG8sdSxsLGMsZixwPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLGQ9IWkmJmEoZT1wLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1kLmxlbmd0aCl7aWYoKHU9ZFswXT1kWzBdLnNsaWNlKDApKS5sZW5ndGg+MiYmIklEIj09PShsPXVbMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZnJiZyLnJlbGF0aXZlW3VbMV0udHlwZV0pe2lmKCEodD0oci5maW5kLklEKGwubWF0Y2hlc1swXS5yZXBsYWNlKFosZWUpLHQpfHxbXSlbMF0pKXJldHVybiBuO3AmJih0PXQucGFyZW50Tm9kZSksZT1lLnNsaWNlKHUuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfW89Vi5uZWVkc0NvbnRleHQudGVzdChlKT8wOnUubGVuZ3RoO3doaWxlKG8tLSl7aWYobD11W29dLHIucmVsYXRpdmVbYz1sLnR5cGVdKWJyZWFrO2lmKChmPXIuZmluZFtjXSkmJihpPWYobC5tYXRjaGVzWzBdLnJlcGxhY2UoWixlZSksSy50ZXN0KHVbMF0udHlwZSkmJmdlKHQucGFyZW50Tm9kZSl8fHQpKSl7aWYodS5zcGxpY2UobywxKSwhKGU9aS5sZW5ndGgmJnZlKHUpKSlyZXR1cm4gTC5hcHBseShuLGkpLG47YnJlYWt9fX1yZXR1cm4ocHx8cyhlLGQpKShpLHQsIWcsbiwhdHx8Sy50ZXN0KGUpJiZnZSh0LnBhcmVudE5vZGUpfHx0KSxufSxuLnNvcnRTdGFibGU9Yi5zcGxpdCgiIikuc29ydChEKS5qb2luKCIiKT09PWIsbi5kZXRlY3REdXBsaWNhdGVzPSEhZixwKCksbi5zb3J0RGV0YWNoZWQ9dWUoZnVuY3Rpb24oZSl7cmV0dXJuIDEmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0IikpfSksdWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8bGUoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGUsdCxuKXtpZighbilyZXR1cm4gZS5nZXRBdHRyaWJ1dGUodCwidHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/MToyKX0pLG4uYXR0cmlidXRlcyYmdWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8aW5wdXQvPiIsZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8bGUoInZhbHVlIixmdW5jdGlvbihlLHQsbil7aWYoIW4mJiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIGUuZGVmYXVsdFZhbHVlfSksdWUoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGxlKFAsZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKCFuKXJldHVybiEwPT09ZVt0XT90LnRvTG93ZXJDYXNlKCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSksb2V9KGUpO3cuZmluZD1FLHcuZXhwcj1FLnNlbGVjdG9ycyx3LmV4cHJbIjoiXT13LmV4cHIucHNldWRvcyx3LnVuaXF1ZVNvcnQ9dy51bmlxdWU9RS51bmlxdWVTb3J0LHcudGV4dD1FLmdldFRleHQsdy5pc1hNTERvYz1FLmlzWE1MLHcuY29udGFpbnM9RS5jb250YWlucyx3LmVzY2FwZVNlbGVjdG9yPUUuZXNjYXBlO3ZhciBrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxpPXZvaWQgMCE9PW47d2hpbGUoKGU9ZVt0XSkmJjkhPT1lLm5vZGVUeXBlKWlmKDE9PT1lLm5vZGVUeXBlKXtpZihpJiZ3KGUpLmlzKG4pKWJyZWFrO3IucHVzaChlKX1yZXR1cm4gcn0sUz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXTtlO2U9ZS5uZXh0U2libGluZykxPT09ZS5ub2RlVHlwZSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn0sRD13LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O2Z1bmN0aW9uIE4oZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfXZhciBBPS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIGooZSx0LG4pe3JldHVybiBnKHQpP3cuZ3JlcChlLGZ1bmN0aW9uKGUscil7cmV0dXJuISF0LmNhbGwoZSxyLGUpIT09bn0pOnQubm9kZVR5cGU/dy5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10IT09bn0pOiJzdHJpbmciIT10eXBlb2YgdD93LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gdS5jYWxsKHQsZSk+LTEhPT1ufSk6dy5maWx0ZXIodCxlLG4pfXcuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP3cuZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106dy5maW5kLm1hdGNoZXMoZSx3LmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LHcuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayh3KGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7dDxyO3QrKylpZih3LmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKXcuZmluZChlLGlbdF0sbik7cmV0dXJuIHI+MT93LnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhqKHRoaXMsZXx8W10sITApKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFqKHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZELnRlc3QoZSk/dyhlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBxLEw9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsody5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxvO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8cSwic3RyaW5nIj09dHlwZW9mIGUpe2lmKCEoaT0iPCI9PT1lWzBdJiYiPiI9PT1lW2UubGVuZ3RoLTFdJiZlLmxlbmd0aD49Mz9bbnVsbCxlLG51bGxdOkwuZXhlYyhlKSl8fCFpWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoaVsxXSl7aWYodD10IGluc3RhbmNlb2Ygdz90WzBdOnQsdy5tZXJnZSh0aGlzLHcucGFyc2VIVE1MKGlbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6ciwhMCkpLEEudGVzdChpWzFdKSYmdy5pc1BsYWluT2JqZWN0KHQpKWZvcihpIGluIHQpZyh0aGlzW2ldKT90aGlzW2ldKHRbaV0pOnRoaXMuYXR0cihpLHRbaV0pO3JldHVybiB0aGlzfXJldHVybihvPXIuZ2V0RWxlbWVudEJ5SWQoaVsyXSkpJiYodGhpc1swXT1vLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOmcoZSk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KGUpOmUodyk6dy5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT13LmZuLHE9dyhyKTt2YXIgSD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxPPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O3cuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9dyhlLHRoaXMpLG49dC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxuO2UrKylpZih3LmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT0ic3RyaW5nIiE9dHlwZW9mIGUmJncoZSk7aWYoIUQudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZ3LmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKG8ubGVuZ3RoPjE/dy51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/dS5jYWxsKHcoZSksdGhpc1swXSk6dS5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayh3LnVuaXF1ZVNvcnQody5tZXJnZSh0aGlzLmdldCgpLHcoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSk7ZnVuY3Rpb24gUChlLHQpe3doaWxlKChlPWVbdF0pJiYxIT09ZS5ub2RlVHlwZSk7cmV0dXJuIGV9dy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gayhlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gUChlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBQKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGsoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGsoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBrKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBTKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gUyhlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gTihlLCJpZnJhbWUiKT9lLmNvbnRlbnREb2N1bWVudDooTihlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLHcubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24obixyKXt2YXIgaT13Lm1hcCh0aGlzLHQsbik7cmV0dXJuIlVudGlsIiE9PWUuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihpPXcuZmlsdGVyKHIsaSkpLHRoaXMubGVuZ3RoPjEmJihPW2VdfHx3LnVuaXF1ZVNvcnQoaSksSC50ZXN0KGUpJiZpLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2soaSl9fSk7dmFyIE09L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBSKGUpe3ZhciB0PXt9O3JldHVybiB3LmVhY2goZS5tYXRjaChNKXx8W10sZnVuY3Rpb24oZSxuKXt0W25dPSEwfSksdH13LkNhbGxiYWNrcz1mdW5jdGlvbihlKXtlPSJzdHJpbmciPT10eXBlb2YgZT9SKGUpOncuZXh0ZW5kKHt9LGUpO3ZhciB0LG4scixpLG89W10sYT1bXSxzPS0xLHU9ZnVuY3Rpb24oKXtmb3IoaT1pfHxlLm9uY2Uscj10PSEwO2EubGVuZ3RoO3M9LTEpe249YS5zaGlmdCgpO3doaWxlKCsrczxvLmxlbmd0aCkhMT09PW9bc10uYXBwbHkoblswXSxuWzFdKSYmZS5zdG9wT25GYWxzZSYmKHM9by5sZW5ndGgsbj0hMSl9ZS5tZW1vcnl8fChuPSExKSx0PSExLGkmJihvPW4/W106IiIpfSxsPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG4mJiF0JiYocz1vLmxlbmd0aC0xLGEucHVzaChuKSksZnVuY3Rpb24gdChuKXt3LmVhY2gobixmdW5jdGlvbihuLHIpe2cocik/ZS51bmlxdWUmJmwuaGFzKHIpfHxvLnB1c2gocik6ciYmci5sZW5ndGgmJiJzdHJpbmciIT09eChyKSYmdChyKX0pfShhcmd1bWVudHMpLG4mJiF0JiZ1KCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB3LmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGUsdCl7dmFyIG47d2hpbGUoKG49dy5pbkFycmF5KHQsbyxuKSk+LTEpby5zcGxpY2UobiwxKSxuPD1zJiZzLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/dy5pbkFycmF5KGUsbyk+LTE6by5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG89W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gaT1hPVtdLG89bj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFvfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9YT1bXSxufHx0fHwobz1uPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWl9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsbil7cmV0dXJuIGl8fChuPVtlLChuPW58fFtdKS5zbGljZT9uLnNsaWNlKCk6bl0sYS5wdXNoKG4pLHR8fHUoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBsLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBsfTtmdW5jdGlvbiBJKGUpe3JldHVybiBlfWZ1bmN0aW9uIFcoZSl7dGhyb3cgZX1mdW5jdGlvbiAkKGUsdCxuLHIpe3ZhciBpO3RyeXtlJiZnKGk9ZS5wcm9taXNlKT9pLmNhbGwoZSkuZG9uZSh0KS5mYWlsKG4pOmUmJmcoaT1lLnRoZW4pP2kuY2FsbChlLHQsbik6dC5hcHBseSh2b2lkIDAsW2VdLnNsaWNlKHIpKX1jYXRjaChlKXtuLmFwcGx5KHZvaWQgMCxbZV0pfX13LmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24odCl7dmFyIG49W1sibm90aWZ5IiwicHJvZ3Jlc3MiLHcuQ2FsbGJhY2tzKCJtZW1vcnkiKSx3LkNhbGxiYWNrcygibWVtb3J5IiksMl0sWyJyZXNvbHZlIiwiZG9uZSIsdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksdy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMCwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHcuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDEsInJlamVjdGVkIl1dLHI9InBlbmRpbmciLGk9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBvLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sImNhdGNoIjpmdW5jdGlvbihlKXtyZXR1cm4gaS50aGVuKG51bGwsZSl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7cmV0dXJuIHcuRGVmZXJyZWQoZnVuY3Rpb24odCl7dy5lYWNoKG4sZnVuY3Rpb24obixyKXt2YXIgaT1nKGVbcls0XV0pJiZlW3JbNF1dO29bclsxXV0oZnVuY3Rpb24oKXt2YXIgZT1pJiZpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlJiZnKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkucHJvZ3Jlc3ModC5ub3RpZnkpLmRvbmUodC5yZXNvbHZlKS5mYWlsKHQucmVqZWN0KTp0W3JbMF0rIldpdGgiXSh0aGlzLGk/W2VdOmFyZ3VtZW50cyl9KX0pLGU9bnVsbH0pLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbih0LHIsaSl7dmFyIG89MDtmdW5jdGlvbiBhKHQsbixyLGkpe3JldHVybiBmdW5jdGlvbigpe3ZhciBzPXRoaXMsdT1hcmd1bWVudHMsbD1mdW5jdGlvbigpe3ZhciBlLGw7aWYoISh0PG8pKXtpZigoZT1yLmFwcGx5KHMsdSkpPT09bi5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7bD1lJiYoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJmUudGhlbixnKGwpP2k/bC5jYWxsKGUsYShvLG4sSSxpKSxhKG8sbixXLGkpKToobysrLGwuY2FsbChlLGEobyxuLEksaSksYShvLG4sVyxpKSxhKG8sbixJLG4ubm90aWZ5V2l0aCkpKToociE9PUkmJihzPXZvaWQgMCx1PVtlXSksKGl8fG4ucmVzb2x2ZVdpdGgpKHMsdSkpfX0sYz1pP2w6ZnVuY3Rpb24oKXt0cnl7bCgpfWNhdGNoKGUpe3cuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYmdy5EZWZlcnJlZC5leGNlcHRpb25Ib29rKGUsYy5zdGFja1RyYWNlKSx0KzE+PW8mJihyIT09VyYmKHM9dm9pZCAwLHU9W2VdKSxuLnJlamVjdFdpdGgocyx1KSl9fTt0P2MoKToody5EZWZlcnJlZC5nZXRTdGFja0hvb2smJihjLnN0YWNrVHJhY2U9dy5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksZS5zZXRUaW1lb3V0KGMpKX19cmV0dXJuIHcuRGVmZXJyZWQoZnVuY3Rpb24oZSl7blswXVszXS5hZGQoYSgwLGUsZyhpKT9pOkksZS5ub3RpZnlXaXRoKSksblsxXVszXS5hZGQoYSgwLGUsZyh0KT90OkkpKSxuWzJdWzNdLmFkZChhKDAsZSxnKHIpP3I6VykpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lP3cuZXh0ZW5kKGUsaSk6aX19LG89e307cmV0dXJuIHcuZWFjaChuLGZ1bmN0aW9uKGUsdCl7dmFyIGE9dFsyXSxzPXRbNV07aVt0WzFdXT1hLmFkZCxzJiZhLmFkZChmdW5jdGlvbigpe3I9c30sblszLWVdWzJdLmRpc2FibGUsblszLWVdWzNdLmRpc2FibGUsblswXVsyXS5sb2NrLG5bMF1bM10ubG9jayksYS5hZGQodFszXS5maXJlKSxvW3RbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIG9bdFswXSsiV2l0aCJdKHRoaXM9PT1vP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sb1t0WzBdKyJXaXRoIl09YS5maXJlV2l0aH0pLGkucHJvbWlzZShvKSx0JiZ0LmNhbGwobyxvKSxvfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj10LHI9QXJyYXkobiksaT1vLmNhbGwoYXJndW1lbnRzKSxhPXcuRGVmZXJyZWQoKSxzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuKXtyW2VdPXRoaXMsaVtlXT1hcmd1bWVudHMubGVuZ3RoPjE/by5jYWxsKGFyZ3VtZW50cyk6biwtLXR8fGEucmVzb2x2ZVdpdGgocixpKX19O2lmKHQ8PTEmJigkKGUsYS5kb25lKHMobikpLnJlc29sdmUsYS5yZWplY3QsIXQpLCJwZW5kaW5nIj09PWEuc3RhdGUoKXx8ZyhpW25dJiZpW25dLnRoZW4pKSlyZXR1cm4gYS50aGVuKCk7d2hpbGUobi0tKSQoaVtuXSxzKG4pLGEucmVqZWN0KTtyZXR1cm4gYS5wcm9taXNlKCl9fSk7dmFyIEI9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87dy5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKHQsbil7ZS5jb25zb2xlJiZlLmNvbnNvbGUud2FybiYmdCYmQi50ZXN0KHQubmFtZSkmJmUuY29uc29sZS53YXJuKCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiAiK3QubWVzc2FnZSx0LnN0YWNrLG4pfSx3LnJlYWR5RXhjZXB0aW9uPWZ1bmN0aW9uKHQpe2Uuc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IHR9KX07dmFyIEY9dy5EZWZlcnJlZCgpO3cuZm4ucmVhZHk9ZnVuY3Rpb24oZSl7cmV0dXJuIEYudGhlbihlKVsiY2F0Y2giXShmdW5jdGlvbihlKXt3LnJlYWR5RXhjZXB0aW9uKGUpfSksdGhpc30sdy5leHRlbmQoe2lzUmVhZHk6ITEscmVhZHlXYWl0OjEscmVhZHk6ZnVuY3Rpb24oZSl7KCEwPT09ZT8tLXcucmVhZHlXYWl0OncuaXNSZWFkeSl8fCh3LmlzUmVhZHk9ITAsITAhPT1lJiYtLXcucmVhZHlXYWl0PjB8fEYucmVzb2x2ZVdpdGgocixbd10pKX19KSx3LnJlYWR5LnRoZW49Ri50aGVuO2Z1bmN0aW9uIF8oKXtyLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLF8pLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsXyksdy5yZWFkeSgpfSJjb21wbGV0ZSI9PT1yLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PXIucmVhZHlTdGF0ZSYmIXIuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2Uuc2V0VGltZW91dCh3LnJlYWR5KTooci5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixfKSxlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLF8pKTt2YXIgej1mdW5jdGlvbihlLHQsbixyLGksbyxhKXt2YXIgcz0wLHU9ZS5sZW5ndGgsbD1udWxsPT1uO2lmKCJvYmplY3QiPT09eChuKSl7aT0hMDtmb3IocyBpbiBuKXooZSx0LHMsbltzXSwhMCxvLGEpfWVsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsZyhyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbCh3KGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LFg9L14tbXMtLyxVPS8tKFthLXpdKS9nO2Z1bmN0aW9uIFYoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIEcoZSl7cmV0dXJuIGUucmVwbGFjZShYLCJtcy0iKS5yZXBsYWNlKFUsVil9dmFyIFk9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBRKCl7dGhpcy5leHBhbmRvPXcuZXhwYW5kbytRLnVpZCsrfVEudWlkPTEsUS5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9e30sWShlKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdGhpcy5leHBhbmRvLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pKSksdH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMuY2FjaGUoZSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KWlbRyh0KV09bjtlbHNlIGZvcihyIGluIHQpaVtHKHIpXT10W3JdO3JldHVybiBpfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW0codCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJnZvaWQgMD09PW4/dGhpcy5nZXQoZSx0KToodGhpcy5zZXQoZSx0LG4pLHZvaWQgMCE9PW4/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09dCl7bj0odD1BcnJheS5pc0FycmF5KHQpP3QubWFwKEcpOih0PUcodCkpaW4gcj9bdF06dC5tYXRjaChNKXx8W10pLmxlbmd0aDt3aGlsZShuLS0pZGVsZXRlIHJbdFtuXV19KHZvaWQgMD09PXR8fHcuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIXcuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBKPW5ldyBRLEs9bmV3IFEsWj0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLGVlPS9bQS1aXS9nO2Z1bmN0aW9uIHRlKGUpe3JldHVybiJ0cnVlIj09PWV8fCJmYWxzZSIhPT1lJiYoIm51bGwiPT09ZT9udWxsOmU9PT0rZSsiIj8rZTpaLnRlc3QoZSk/SlNPTi5wYXJzZShlKTplKX1mdW5jdGlvbiBuZShlLHQsbil7dmFyIHI7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShlZSwiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49ZS5nZXRBdHRyaWJ1dGUocikpKXt0cnl7bj10ZShuKX1jYXRjaChlKXt9Sy5zZXQoZSx0LG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59dy5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIEsuaGFzRGF0YShlKXx8Si5oYXNEYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gSy5hY2Nlc3MoZSx0LG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7Sy5yZW1vdmUoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBKLmFjY2VzcyhlLHQsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7Si5yZW1vdmUoZSx0KX19KSx3LmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvPXRoaXNbMF0sYT1vJiZvLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09ZSl7aWYodGhpcy5sZW5ndGgmJihpPUsuZ2V0KG8pLDE9PT1vLm5vZGVUeXBlJiYhSi5nZXQobywiaGFzRGF0YUF0dHJzIikpKXtuPWEubGVuZ3RoO3doaWxlKG4tLSlhW25dJiYwPT09KHI9YVtuXS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpJiYocj1HKHIuc2xpY2UoNSkpLG5lKG8scixpW3JdKSk7Si5zZXQobywiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGl9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP3RoaXMuZWFjaChmdW5jdGlvbigpe0suc2V0KHRoaXMsZSl9KTp6KHRoaXMsZnVuY3Rpb24odCl7dmFyIG47aWYobyYmdm9pZCAwPT09dCl7aWYodm9pZCAwIT09KG49Sy5nZXQobyxlKSkpcmV0dXJuIG47aWYodm9pZCAwIT09KG49bmUobyxlKSkpcmV0dXJuIG59ZWxzZSB0aGlzLmVhY2goZnVuY3Rpb24oKXtLLnNldCh0aGlzLGUsdCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Sy5yZW1vdmUodGhpcyxlKX0pfX0pLHcuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoZSlyZXR1cm4gdD0odHx8ImZ4IikrInF1ZXVlIixyPUouZ2V0KGUsdCksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9Si5hY2Nlc3MoZSx0LHcubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKGUsdCl7dD10fHwiZngiO3ZhciBuPXcucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89dy5fcXVldWVIb29rcyhlLHQpLGE9ZnVuY3Rpb24oKXt3LmRlcXVldWUoZSx0KX07ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGEsbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gSi5nZXQoZSxuKXx8Si5hY2Nlc3MoZSxuLHtlbXB0eTp3LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtKLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSx3LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPSJmeCIsbi0tKSxhcmd1bWVudHMubGVuZ3RoPG4/dy5xdWV1ZSh0aGlzWzBdLGUpOnZvaWQgMD09PXQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj13LnF1ZXVlKHRoaXMsZSx0KTt3Ll9xdWV1ZUhvb2tzKHRoaXMsZSksImZ4Ij09PWUmJiJpbnByb2dyZXNzIiE9PW5bMF0mJncuZGVxdWV1ZSh0aGlzLGUpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3cuZGVxdWV1ZSh0aGlzLGUpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTEsaT13LkRlZmVycmVkKCksbz10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8aS5yZXNvbHZlV2l0aChvLFtvXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHwiZngiO3doaWxlKGEtLSkobj1KLmdldChvW2FdLGUrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksaS5wcm9taXNlKHQpfX0pO3ZhciByZT0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxpZT1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrcmUrIikoW2EteiVdKikkIiwiaSIpLG9lPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sYWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmdy5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSkmJiJub25lIj09PXcuY3NzKGUsImRpc3BsYXkiKX0sc2U9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhPXt9O2ZvcihvIGluIHQpYVtvXT1lLnN0eWxlW29dLGUuc3R5bGVbb109dFtvXTtpPW4uYXBwbHkoZSxyfHxbXSk7Zm9yKG8gaW4gdCllLnN0eWxlW29dPWFbb107cmV0dXJuIGl9O2Z1bmN0aW9uIHVlKGUsdCxuLHIpe3ZhciBpLG8sYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gdy5jc3MoZSx0LCIiKX0sdT1zKCksbD1uJiZuWzNdfHwody5jc3NOdW1iZXJbdF0/IiI6InB4IiksYz0ody5jc3NOdW1iZXJbdF18fCJweCIhPT1sJiYrdSkmJmllLmV4ZWMody5jc3MoZSx0KSk7aWYoYyYmY1szXSE9PWwpe3UvPTIsbD1sfHxjWzNdLGM9K3V8fDE7d2hpbGUoYS0tKXcuc3R5bGUoZSx0LGMrbCksKDEtbykqKDEtKG89cygpL3V8fC41KSk8PTAmJihhPTApLGMvPW87Yyo9Mix3LnN0eWxlKGUsdCxjK2wpLG49bnx8W119cmV0dXJuIG4mJihjPStjfHwrdXx8MCxpPW5bMV0/YysoblsxXSsxKSpuWzJdOituWzJdLHImJihyLnVuaXQ9bCxyLnN0YXJ0PWMsci5lbmQ9aSkpLGl9dmFyIGxlPXt9O2Z1bmN0aW9uIGNlKGUpe3ZhciB0LG49ZS5vd25lckRvY3VtZW50LHI9ZS5ub2RlTmFtZSxpPWxlW3JdO3JldHVybiBpfHwodD1uLmJvZHkuYXBwZW5kQ2hpbGQobi5jcmVhdGVFbGVtZW50KHIpKSxpPXcuY3NzKHQsImRpc3BsYXkiKSx0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksIm5vbmUiPT09aSYmKGk9ImJsb2NrIiksbGVbcl09aSxpKX1mdW5jdGlvbiBmZShlLHQpe2Zvcih2YXIgbixyLGk9W10sbz0wLGE9ZS5sZW5ndGg7bzxhO28rKykocj1lW29dKS5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LHQ/KCJub25lIj09PW4mJihpW29dPUouZ2V0KHIsImRpc3BsYXkiKXx8bnVsbCxpW29dfHwoci5zdHlsZS5kaXNwbGF5PSIiKSksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJmFlKHIpJiYoaVtvXT1jZShyKSkpOiJub25lIiE9PW4mJihpW29dPSJub25lIixKLnNldChyLCJkaXNwbGF5IixuKSkpO2ZvcihvPTA7bzxhO28rKyludWxsIT1pW29dJiYoZVtvXS5zdHlsZS5kaXNwbGF5PWlbb10pO3JldHVybiBlfXcuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIGZlKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIGZlKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2FlKHRoaXMpP3codGhpcykuc2hvdygpOncodGhpcykuaGlkZSgpfSl9fSk7dmFyIHBlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLGRlPS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pLGhlPS9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxnZT17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2dlLm9wdGdyb3VwPWdlLm9wdGlvbixnZS50Ym9keT1nZS50Zm9vdD1nZS5jb2xncm91cD1nZS5jYXB0aW9uPWdlLnRoZWFkLGdlLnRoPWdlLnRkO2Z1bmN0aW9uIHllKGUsdCl7dmFyIG47cmV0dXJuIG49InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHx8IioiKToidW5kZWZpbmVkIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbD9lLnF1ZXJ5U2VsZWN0b3JBbGwodHx8IioiKTpbXSx2b2lkIDA9PT10fHx0JiZOKGUsdCk/dy5tZXJnZShbZV0sbik6bn1mdW5jdGlvbiB2ZShlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylKLnNldChlW25dLCJnbG9iYWxFdmFsIiwhdHx8Si5nZXQodFtuXSwiZ2xvYmFsRXZhbCIpKX12YXIgbWU9Lzx8JiM/XHcrOy87ZnVuY3Rpb24geGUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZigib2JqZWN0Ij09PXgobykpdy5tZXJnZShwLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYobWUudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KGRlLmV4ZWMobyl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1nZVtzXXx8Z2UuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXSt3Lmh0bWxQcmVmaWx0ZXIobykrdVsyXSxjPXVbMF07d2hpbGUoYy0tKWE9YS5sYXN0Q2hpbGQ7dy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtmLnRleHRDb250ZW50PSIiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiZ3LmluQXJyYXkobyxyKT4tMSlpJiZpLnB1c2gobyk7ZWxzZSBpZihsPXcuY29udGFpbnMoby5vd25lckRvY3VtZW50LG8pLGE9eWUoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksbCYmdmUoYSksbil7Yz0wO3doaWxlKG89YVtjKytdKWhlLnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKX1yZXR1cm4gZn0hZnVuY3Rpb24oKXt2YXIgZT1yLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChyLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSx0PXIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksdC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksZS5hcHBlbmRDaGlsZCh0KSxoLmNoZWNrQ2xvbmU9ZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsZS5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLGgubm9DbG9uZUNoZWNrZWQ9ISFlLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZX0oKTt2YXIgYmU9ci5kb2N1bWVudEVsZW1lbnQsd2U9L15rZXkvLFRlPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxDZT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gRWUoKXtyZXR1cm4hMH1mdW5jdGlvbiBrZSgpe3JldHVybiExfWZ1bmN0aW9uIFNlKCl7dHJ5e3JldHVybiByLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX1mdW5jdGlvbiBEZShlLHQsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIHQpeyJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCk7Zm9yKHMgaW4gdClEZShlLHMsbixyLHRbc10sbyk7cmV0dXJuIGV9aWYobnVsbD09ciYmbnVsbD09aT8oaT1uLHI9bj12b2lkIDApOm51bGw9PWkmJigic3RyaW5nIj09dHlwZW9mIG4/KGk9cixyPXZvaWQgMCk6KGk9cixyPW4sbj12b2lkIDApKSwhMT09PWkpaT1rZTtlbHNlIGlmKCFpKXJldHVybiBlO3JldHVybiAxPT09byYmKGE9aSwoaT1mdW5jdGlvbihlKXtyZXR1cm4gdygpLm9mZihlKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPXcuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC5hZGQodGhpcyx0LGkscixuKX0pfXcuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHk9Si5nZXQoZSk7aWYoeSl7bi5oYW5kbGVyJiYobj0obz1uKS5oYW5kbGVyLGk9by5zZWxlY3RvciksaSYmdy5maW5kLm1hdGNoZXNTZWxlY3RvcihiZSxpKSxuLmd1aWR8fChuLmd1aWQ9dy5ndWlkKyspLCh1PXkuZXZlbnRzKXx8KHU9eS5ldmVudHM9e30pLChhPXkuaGFuZGxlKXx8KGE9eS5oYW5kbGU9ZnVuY3Rpb24odCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB3JiZ3LmV2ZW50LnRyaWdnZXJlZCE9PXQudHlwZT93LmV2ZW50LmRpc3BhdGNoLmFwcGx5KGUsYXJndW1lbnRzKTp2b2lkIDB9KSxsPSh0PSh0fHwiIikubWF0Y2goTSl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0pZD1nPShzPUNlLmV4ZWModFtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShpP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkLGY9dy5ldmVudC5zcGVjaWFsW2RdfHx7fSxjPXcuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJncuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LG8pLChwPXVbZF0pfHwoKHA9dVtkXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKGUscixoLGEpfHxlLmFkZEV2ZW50TGlzdGVuZXImJmUuYWRkRXZlbnRMaXN0ZW5lcihkLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwoZSxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpwLnB1c2goYyksdy5ldmVudC5nbG9iYWxbZF09ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx5PUouaGFzRGF0YShlKSYmSi5nZXQoZSk7aWYoeSYmKHU9eS5ldmVudHMpKXtsPSh0PSh0fHwiIikubWF0Y2goTSl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0paWYocz1DZS5leGVjKHRbbF0pfHxbXSxkPWc9c1sxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7Zj13LmV2ZW50LnNwZWNpYWxbZF18fHt9LHA9dVtkPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJigiKioiIT09cnx8IWMuc2VsZWN0b3IpfHwocC5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbChlLGMpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbChlLGgseS5oYW5kbGUpfHx3LnJlbW92ZUV2ZW50KGUsZCx5LmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSl3LmV2ZW50LnJlbW92ZShlLGQrdFtsXSxuLHIsITApO3cuaXNFbXB0eU9iamVjdCh1KSYmSi5yZW1vdmUoZSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5ldmVudC5maXgoZSksbixyLGksbyxhLHMsdT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksbD0oSi5nZXQodGhpcywiZXZlbnRzIil8fHt9KVt0LnR5cGVdfHxbXSxjPXcuZXZlbnQuc3BlY2lhbFt0LnR5cGVdfHx7fTtmb3IodVswXT10LG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXVbbl09YXJndW1lbnRzW25dO2lmKHQuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8ITEhPT1jLnByZURpc3BhdGNoLmNhbGwodGhpcyx0KSl7cz13LmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyx0LGwpLG49MDt3aGlsZSgobz1zW24rK10pJiYhdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXt0LmN1cnJlbnRUYXJnZXQ9by5lbGVtLHI9MDt3aGlsZSgoYT1vLmhhbmRsZXJzW3IrK10pJiYhdC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKXQucm5hbWVzcGFjZSYmIXQucm5hbWVzcGFjZS50ZXN0KGEubmFtZXNwYWNlKXx8KHQuaGFuZGxlT2JqPWEsdC5kYXRhPWEuZGF0YSx2b2lkIDAhPT0oaT0oKHcuZXZlbnQuc3BlY2lhbFthLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8YS5oYW5kbGVyKS5hcHBseShvLmVsZW0sdSkpJiYhMT09PSh0LnJlc3VsdD1pKSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsdCksdC5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoImNsaWNrIj09PWUudHlwZSYmZS5idXR0b24+PTEpKWZvcig7bCE9PXRoaXM7bD1sLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWwubm9kZVR5cGUmJigiY2xpY2siIT09ZS50eXBlfHwhMCE9PWwuZGlzYWJsZWQpKXtmb3Iobz1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbaT0ocj10W25dKS5zZWxlY3RvcisiICJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD93KGksdGhpcykuaW5kZXgobCk+LTE6dy5maW5kKGksdGhpcyxudWxsLFtsXSkubGVuZ3RoKSxhW2ldJiZvLnB1c2gocik7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOm99KX1yZXR1cm4gbD10aGlzLHU8dC5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOnQuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHcuRXZlbnQucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpnKHQpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0KHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbZV19LHNldDpmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVt3LmV4cGFuZG9dP2U6bmV3IHcuRXZlbnQoZSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXMhPT1TZSgpJiZ0aGlzLmZvY3VzKXJldHVybiB0aGlzLmZvY3VzKCksITF9LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzPT09U2UoKSYmdGhpcy5ibHVyKXJldHVybiB0aGlzLmJsdXIoKSwhMX0sZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGNsaWNrOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYoImNoZWNrYm94Ij09PXRoaXMudHlwZSYmdGhpcy5jbGljayYmTih0aGlzLCJpbnB1dCIpKXJldHVybiB0aGlzLmNsaWNrKCksITF9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3JldHVybiBOKGUudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnJlc3VsdCYmZS5vcmlnaW5hbEV2ZW50JiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fX0sdy5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0sdy5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHcuRXZlbnQpKXJldHVybiBuZXcgdy5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlP0VlOmtlLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJncuZXh0ZW5kKHRoaXMsdCksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1t3LmV4cGFuZG9dPSEwfSx3LkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6dy5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6a2UsaXNQcm9wYWdhdGlvblN0b3BwZWQ6a2UsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6a2UsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUVlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSx3LmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsImNoYXIiOiEwLGNoYXJDb2RlOiEwLGtleTohMCxrZXlDb2RlOiEwLGJ1dHRvbjohMCxidXR0b25zOiEwLGNsaWVudFg6ITAsY2xpZW50WTohMCxvZmZzZXRYOiEwLG9mZnNldFk6ITAscG9pbnRlcklkOiEwLHBvaW50ZXJUeXBlOiEwLHNjcmVlblg6ITAsc2NyZWVuWTohMCx0YXJnZXRUb3VjaGVzOiEwLHRvRWxlbWVudDohMCx0b3VjaGVzOiEwLHdoaWNoOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYnV0dG9uO3JldHVybiBudWxsPT1lLndoaWNoJiZ3ZS50ZXN0KGUudHlwZSk/bnVsbCE9ZS5jaGFyQ29kZT9lLmNoYXJDb2RlOmUua2V5Q29kZTohZS53aGljaCYmdm9pZCAwIT09dCYmVGUudGVzdChlLnR5cGUpPzEmdD8xOjImdD8zOjQmdD8yOjA6ZS53aGljaH19LHcuZXZlbnQuYWRkUHJvcCksdy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLHQpe3cuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LG89ZS5oYW5kbGVPYmo7cmV0dXJuIGkmJihpPT09cnx8dy5jb250YWlucyhyLGkpKXx8KGUudHlwZT1vLm9yaWdUeXBlLG49by5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnR5cGU9dCksbn19fSksdy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBEZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIERlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLHcoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PXQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0fHwobj10LHQ9dm9pZCAwKSwhMT09PW4mJihuPWtlKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt3LmV2ZW50LnJlbW92ZSh0aGlzLGUsbix0KX0pfX0pO3ZhciBOZT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksQWU9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksamU9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2kscWU9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nO2Z1bmN0aW9uIExlKGUsdCl7cmV0dXJuIE4oZSwidGFibGUiKSYmTigxMSE9PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIik/dyhlKS5jaGlsZHJlbigidGJvZHkiKVswXXx8ZTplfWZ1bmN0aW9uIEhlKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gT2UoZSl7cmV0dXJuInRydWUvIj09PShlLnR5cGV8fCIiKS5zbGljZSgwLDUpP2UudHlwZT1lLnR5cGUuc2xpY2UoNSk6ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIFBlKGUsdCl7dmFyIG4scixpLG8sYSxzLHUsbDtpZigxPT09dC5ub2RlVHlwZSl7aWYoSi5oYXNEYXRhKGUpJiYobz1KLmFjY2VzcyhlKSxhPUouc2V0KHQsbyksbD1vLmV2ZW50cykpe2RlbGV0ZSBhLmhhbmRsZSxhLmV2ZW50cz17fTtmb3IoaSBpbiBsKWZvcihuPTAscj1sW2ldLmxlbmd0aDtuPHI7bisrKXcuZXZlbnQuYWRkKHQsaSxsW2ldW25dKX1LLmhhc0RhdGEoZSkmJihzPUsuYWNjZXNzKGUpLHU9dy5leHRlbmQoe30scyksSy5zZXQodCx1KSl9fWZ1bmN0aW9uIE1lKGUsdCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyJpbnB1dCI9PT1uJiZwZS50ZXN0KGUudHlwZSk/dC5jaGVja2VkPWUuY2hlY2tlZDoiaW5wdXQiIT09biYmInRleHRhcmVhIiE9PW58fCh0LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gUmUoZSx0LG4scil7dD1hLmFwcGx5KFtdLHQpO3ZhciBpLG8scyx1LGwsYyxmPTAscD1lLmxlbmd0aCxkPXAtMSx5PXRbMF0sdj1nKHkpO2lmKHZ8fHA+MSYmInN0cmluZyI9PXR5cGVvZiB5JiYhaC5jaGVja0Nsb25lJiZqZS50ZXN0KHkpKXJldHVybiBlLmVhY2goZnVuY3Rpb24oaSl7dmFyIG89ZS5lcShpKTt2JiYodFswXT15LmNhbGwodGhpcyxpLG8uaHRtbCgpKSksUmUobyx0LG4scil9KTtpZihwJiYoaT14ZSh0LGVbMF0ub3duZXJEb2N1bWVudCwhMSxlLHIpLG89aS5maXJzdENoaWxkLDE9PT1pLmNoaWxkTm9kZXMubGVuZ3RoJiYoaT1vKSxvfHxyKSl7Zm9yKHU9KHM9dy5tYXAoeWUoaSwic2NyaXB0IiksSGUpKS5sZW5ndGg7ZjxwO2YrKylsPWksZiE9PWQmJihsPXcuY2xvbmUobCwhMCwhMCksdSYmdy5tZXJnZShzLHllKGwsInNjcmlwdCIpKSksbi5jYWxsKGVbZl0sbCxmKTtpZih1KWZvcihjPXNbcy5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCx3Lm1hcChzLE9lKSxmPTA7Zjx1O2YrKylsPXNbZl0saGUudGVzdChsLnR5cGV8fCIiKSYmIUouYWNjZXNzKGwsImdsb2JhbEV2YWwiKSYmdy5jb250YWlucyhjLGwpJiYobC5zcmMmJiJtb2R1bGUiIT09KGwudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/dy5fZXZhbFVybCYmdy5fZXZhbFVybChsLnNyYyk6bShsLnRleHRDb250ZW50LnJlcGxhY2UocWUsIiIpLGMsbCkpfXJldHVybiBlfWZ1bmN0aW9uIEllKGUsdCxuKXtmb3IodmFyIHIsaT10P3cuZmlsdGVyKHQsZSk6ZSxvPTA7bnVsbCE9KHI9aVtvXSk7bysrKW58fDEhPT1yLm5vZGVUeXBlfHx3LmNsZWFuRGF0YSh5ZShyKSksci5wYXJlbnROb2RlJiYobiYmdy5jb250YWlucyhyLm93bmVyRG9jdW1lbnQscikmJnZlKHllKHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiBlfXcuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoTmUsIjwkMT48LyQyPiIpfSxjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNsb25lTm9kZSghMCksdT13LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKTtpZighKGgubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fHcuaXNYTUxEb2MoZSkpKWZvcihhPXllKHMpLHI9MCxpPShvPXllKGUpKS5sZW5ndGg7cjxpO3IrKylNZShvW3JdLGFbcl0pO2lmKHQpaWYobilmb3Iobz1vfHx5ZShlKSxhPWF8fHllKHMpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspUGUob1tyXSxhW3JdKTtlbHNlIFBlKGUscyk7cmV0dXJuKGE9eWUocywic2NyaXB0IikpLmxlbmd0aD4wJiZ2ZShhLCF1JiZ5ZShlLCJzY3JpcHQiKSksc30sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHIsaT13LmV2ZW50LnNwZWNpYWwsbz0wO3ZvaWQgMCE9PShuPWVbb10pO28rKylpZihZKG4pKXtpZih0PW5bSi5leHBhbmRvXSl7aWYodC5ldmVudHMpZm9yKHIgaW4gdC5ldmVudHMpaVtyXT93LmV2ZW50LnJlbW92ZShuLHIpOncucmVtb3ZlRXZlbnQobixyLHQuaGFuZGxlKTtuW0ouZXhwYW5kb109dm9pZCAwfW5bSy5leHBhbmRvXSYmKG5bSy5leHBhbmRvXT12b2lkIDApfX19KSx3LmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiBJZSh0aGlzLGUsITApfSxyZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIEllKHRoaXMsZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHoodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT93LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUmUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fExlKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9TGUodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYody5jbGVhbkRhdGEoeWUoZSwhMSkpLGUudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB3LmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIUFlLnRlc3QoZSkmJiFnZVsoZGUuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9dy5odG1sUHJlZmlsdGVyKGUpO3RyeXtmb3IoO248cjtuKyspMT09PSh0PXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKHcuY2xlYW5EYXRhKHllKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIFJlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTt3LmluQXJyYXkodGhpcyxlKTwwJiYody5jbGVhbkRhdGEoeWUodGhpcykpLG4mJm4ucmVwbGFjZUNoaWxkKHQsdGhpcykpfSxlKX19KSx3LmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLHI9W10saT13KGUpLG89aS5sZW5ndGgtMSxhPTA7YTw9bzthKyspbj1hPT09bz90aGlzOnRoaXMuY2xvbmUoITApLHcoaVthXSlbdF0obikscy5hcHBseShyLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhyKX19KTt2YXIgV2U9bmV3IFJlZ0V4cCgiXigiK3JlKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksJGU9ZnVuY3Rpb24odCl7dmFyIG49dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiBuJiZuLm9wZW5lcnx8KG49ZSksbi5nZXRDb21wdXRlZFN0eWxlKHQpfSxCZT1uZXcgUmVnRXhwKG9lLmpvaW4oInwiKSwiaSIpOyFmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtpZihjKXtsLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGMuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIsYmUuYXBwZW5kQ2hpbGQobCkuYXBwZW5kQ2hpbGQoYyk7dmFyIHQ9ZS5nZXRDb21wdXRlZFN0eWxlKGMpO2k9IjElIiE9PXQudG9wLHU9MTI9PT1uKHQubWFyZ2luTGVmdCksYy5zdHlsZS5yaWdodD0iNjAlIixzPTM2PT09bih0LnJpZ2h0KSxvPTM2PT09bih0LndpZHRoKSxjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYT0zNj09PWMub2Zmc2V0V2lkdGh8fCJhYnNvbHV0ZSIsYmUucmVtb3ZlQ2hpbGQobCksYz1udWxsfX1mdW5jdGlvbiBuKGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBpLG8sYSxzLHUsbD1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ci5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLnN0eWxlJiYoYy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixoLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09Yy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCx3LmV4dGVuZChoLHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiB0KCksb30scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHN9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLGl9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiB0KCksdX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiB0KCksYX19KSl9KCk7ZnVuY3Rpb24gRmUoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5zdHlsZTtyZXR1cm4obj1ufHwkZShlKSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSl8fHcuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHwoYT13LnN0eWxlKGUsdCkpLCFoLnBpeGVsQm94U3R5bGVzKCkmJldlLnRlc3QoYSkmJkJlLnRlc3QodCkmJihyPXMud2lkdGgsaT1zLm1pbldpZHRoLG89cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1pLHMubWF4V2lkdGg9bykpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uIF9lKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX12YXIgemU9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFhlPS9eLS0vLFVlPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxWZT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn0sR2U9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFllPXIuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7ZnVuY3Rpb24gUWUoZSl7aWYoZSBpbiBZZSlyZXR1cm4gZTt2YXIgdD1lWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPUdlLmxlbmd0aDt3aGlsZShuLS0paWYoKGU9R2Vbbl0rdClpbiBZZSlyZXR1cm4gZX1mdW5jdGlvbiBKZShlKXt2YXIgdD13LmNzc1Byb3BzW2VdO3JldHVybiB0fHwodD13LmNzc1Byb3BzW2VdPVFlKGUpfHxlKSx0fWZ1bmN0aW9uIEtlKGUsdCxuKXt2YXIgcj1pZS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTp0fWZ1bmN0aW9uIFplKGUsdCxuLHIsaSxvKXt2YXIgYT0id2lkdGgiPT09dD8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPXcuY3NzKGUsbitvZVthXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHUtPXcuY3NzKGUsInBhZGRpbmciK29lW2FdLCEwLGkpKSwibWFyZ2luIiE9PW4mJih1LT13LmNzcyhlLCJib3JkZXIiK29lW2FdKyJXaWR0aCIsITAsaSkpKToodSs9dy5jc3MoZSwicGFkZGluZyIrb2VbYV0sITAsaSksInBhZGRpbmciIT09bj91Kz13LmNzcyhlLCJib3JkZXIiK29lW2FdKyJXaWR0aCIsITAsaSk6cys9dy5jc3MoZSwiYm9yZGVyIitvZVthXSsiV2lkdGgiLCEwLGkpKTtyZXR1cm4hciYmbz49MCYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSkpLHV9ZnVuY3Rpb24gZXQoZSx0LG4pe3ZhciByPSRlKGUpLGk9RmUoZSx0LHIpLG89ImJvcmRlci1ib3giPT09dy5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSxhPW87aWYoV2UudGVzdChpKSl7aWYoIW4pcmV0dXJuIGk7aT0iYXV0byJ9cmV0dXJuIGE9YSYmKGguYm94U2l6aW5nUmVsaWFibGUoKXx8aT09PWUuc3R5bGVbdF0pLCgiYXV0byI9PT1pfHwhcGFyc2VGbG9hdChpKSYmImlubGluZSI9PT13LmNzcyhlLCJkaXNwbGF5IiwhMSxyKSkmJihpPWVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLGE9ITApLChpPXBhcnNlRmxvYXQoaSl8fDApK1plKGUsdCxufHwobz8iYm9yZGVyIjoiY29udGVudCIpLGEscixpKSsicHgifXcuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49RmUoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8sYSxzPUcodCksdT1YZS50ZXN0KHQpLGw9ZS5zdHlsZTtpZih1fHwodD1KZShzKSksYT13LmNzc0hvb2tzW3RdfHx3LmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KGk9YS5nZXQoZSwhMSxyKSk/aTpsW3RdOyJzdHJpbmciPT0obz10eXBlb2YgbikmJihpPWllLmV4ZWMobikpJiZpWzFdJiYobj11ZShlLHQsaSksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09PW4mJigibnVtYmVyIj09PW8mJihuKz1pJiZpWzNdfHwody5jc3NOdW1iZXJbc10/IiI6InB4IikpLGguY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT10LmluZGV4T2YoImJhY2tncm91bmQiKXx8KGxbdF09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KGUsbixyKSl8fCh1P2wuc2V0UHJvcGVydHkodCxuKTpsW3RdPW4pKX19LGNzczpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1HKHQpO3JldHVybiBYZS50ZXN0KHQpfHwodD1KZShzKSksKGE9dy5jc3NIb29rc1t0XXx8dy5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9RmUoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gVmUmJihpPVZlW3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSwhMD09PW58fGlzRmluaXRlKG8pP298fDA6aSk6aX19KSx3LmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGUsdCl7dy5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbixyKXtpZihuKXJldHVybiF6ZS50ZXN0KHcuY3NzKGUsImRpc3BsYXkiKSl8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/ZXQoZSx0LHIpOnNlKGUsVWUsZnVuY3Rpb24oKXtyZXR1cm4gZXQoZSx0LHIpfSl9LHNldDpmdW5jdGlvbihlLG4scil7dmFyIGksbz0kZShlKSxhPSJib3JkZXItYm94Ij09PXcuY3NzKGUsImJveFNpemluZyIsITEsbykscz1yJiZaZShlLHQscixhLG8pO3JldHVybiBhJiZoLnNjcm9sbGJveFNpemUoKT09PW8ucG9zaXRpb24mJihzLT1NYXRoLmNlaWwoZVsib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tcGFyc2VGbG9hdChvW3RdKS1aZShlLHQsImJvcmRlciIsITEsbyktLjUpKSxzJiYoaT1pZS5leGVjKG4pKSYmInB4IiE9PShpWzNdfHwicHgiKSYmKGUuc3R5bGVbdF09bixuPXcuY3NzKGUsdCkpLEtlKGUsbixzKX19fSksdy5jc3NIb29rcy5tYXJnaW5MZWZ0PV9lKGgucmVsaWFibGVNYXJnaW5MZWZ0LGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4ocGFyc2VGbG9hdChGZShlLCJtYXJnaW5MZWZ0IikpfHxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtc2UoZSx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrInB4In0pLHcuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGUsdCl7dy5jc3NIb29rc1tlK3RdPXtleHBhbmQ6ZnVuY3Rpb24obil7Zm9yKHZhciByPTAsaT17fSxvPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO3I8NDtyKyspaVtlK29lW3JdK3RdPW9bcl18fG9bci0yXXx8b1swXTtyZXR1cm4gaX19LCJtYXJnaW4iIT09ZSYmKHcuY3NzSG9va3NbZSt0XS5zZXQ9S2UpfSksdy5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fSxhPTA7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHI9JGUoZSksaT10Lmxlbmd0aDthPGk7YSsrKW9bdFthXV09dy5jc3MoZSx0W2FdLCExLHIpO3JldHVybiBvfXJldHVybiB2b2lkIDAhPT1uP3cuc3R5bGUoZSx0LG4pOncuY3NzKGUsdCl9LGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfX0pO2Z1bmN0aW9uIHR0KGUsdCxuLHIsaSl7cmV0dXJuIG5ldyB0dC5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfXcuVHdlZW49dHQsdHQucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0dCxpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHx3LmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9b3x8KHcuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgZT10dC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6dHQucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49dHQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz10PXcuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTp0dC5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSx0dC5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9dHQucHJvdG90eXBlLHR0LnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gMSE9PWUuZWxlbS5ub2RlVHlwZXx8bnVsbCE9ZS5lbGVtW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtlLnByb3BdP2UuZWxlbVtlLnByb3BdOih0PXcuY3NzKGUuZWxlbSxlLnByb3AsIiIpKSYmImF1dG8iIT09dD90OjB9LHNldDpmdW5jdGlvbihlKXt3LmZ4LnN0ZXBbZS5wcm9wXT93LmZ4LnN0ZXBbZS5wcm9wXShlKToxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsPT1lLmVsZW0uc3R5bGVbdy5jc3NQcm9wc1tlLnByb3BdXSYmIXcuY3NzSG9va3NbZS5wcm9wXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzp3LnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSx0dC5wcm9wSG9va3Muc2Nyb2xsVG9wPXR0LnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LHcuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sdy5meD10dC5wcm90b3R5cGUuaW5pdCx3LmZ4LnN0ZXA9e307dmFyIG50LHJ0LGl0PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxvdD0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIGF0KCl7cnQmJighMT09PXIuaGlkZGVuJiZlLnJlcXVlc3RBbmltYXRpb25GcmFtZT9lLnJlcXVlc3RBbmltYXRpb25GcmFtZShhdCk6ZS5zZXRUaW1lb3V0KGF0LHcuZnguaW50ZXJ2YWwpLHcuZngudGljaygpKX1mdW5jdGlvbiBzdCgpe3JldHVybiBlLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtudD12b2lkIDB9KSxudD1EYXRlLm5vdygpfWZ1bmN0aW9uIHV0KGUsdCl7dmFyIG4scj0wLGk9e2hlaWdodDplfTtmb3IodD10PzE6MDtyPDQ7cis9Mi10KWlbIm1hcmdpbiIrKG49b2Vbcl0pXT1pWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoaS5vcGFjaXR5PWkud2lkdGg9ZSksaX1mdW5jdGlvbiBsdChlLHQsbil7Zm9yKHZhciByLGk9KHB0LnR3ZWVuZXJzW3RdfHxbXSkuY29uY2F0KHB0LnR3ZWVuZXJzWyIqIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGN0KGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLGY9IndpZHRoImluIHR8fCJoZWlnaHQiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZhZShlKSx5PUouZ2V0KGUsImZ4c2hvdyIpO24ucXVldWV8fChudWxsPT0oYT13Ll9xdWV1ZUhvb2tzKGUsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLHcucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSk7Zm9yKHIgaW4gdClpZihpPXRbcl0saXQudGVzdChpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1pfHwheXx8dm9pZCAwPT09eVtyXSljb250aW51ZTtnPSEwfWRbcl09eSYmeVtyXXx8dy5zdHlsZShlLHIpfWlmKCh1PSF3LmlzRW1wdHlPYmplY3QodCkpfHwhdy5pc0VtcHR5T2JqZWN0KGQpKXtmJiYxPT09ZS5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2gub3ZlcmZsb3csaC5vdmVyZmxvd1gsaC5vdmVyZmxvd1ldLG51bGw9PShsPXkmJnkuZGlzcGxheSkmJihsPUouZ2V0KGUsImRpc3BsYXkiKSksIm5vbmUiPT09KGM9dy5jc3MoZSwiZGlzcGxheSIpKSYmKGw/Yz1sOihmZShbZV0sITApLGw9ZS5zdHlsZS5kaXNwbGF5fHxsLGM9dy5jc3MoZSwiZGlzcGxheSIpLGZlKFtlXSkpKSwoImlubGluZSI9PT1jfHwiaW5saW5lLWJsb2NrIj09PWMmJm51bGwhPWwpJiYibm9uZSI9PT13LmNzcyhlLCJmbG9hdCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2guZGlzcGxheT1sfSksbnVsbD09bCYmKGM9aC5kaXNwbGF5LGw9Im5vbmUiPT09Yz8iIjpjKSksaC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKGgub3ZlcmZsb3c9ImhpZGRlbiIscC5hbHdheXMoZnVuY3Rpb24oKXtoLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0saC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxoLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITE7Zm9yKHIgaW4gZCl1fHwoeT8iaGlkZGVuImluIHkmJihnPXkuaGlkZGVuKTp5PUouYWNjZXNzKGUsImZ4c2hvdyIse2Rpc3BsYXk6bH0pLG8mJih5LmhpZGRlbj0hZyksZyYmZmUoW2VdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtnfHxmZShbZV0pLEoucmVtb3ZlKGUsImZ4c2hvdyIpO2ZvcihyIGluIGQpdy5zdHlsZShlLHIsZFtyXSl9KSksdT1sdChnP3lbcl06MCxyLHApLHIgaW4geXx8KHlbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX19ZnVuY3Rpb24gZnQoZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYocj1HKG4pLGk9dFtyXSxvPWVbbl0sQXJyYXkuaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLChhPXcuY3NzSG9va3Nbcl0pJiYiZXhwYW5kImluIGEpe289YS5leHBhbmQobyksZGVsZXRlIGVbcl07Zm9yKG4gaW4gbyluIGluIGV8fChlW25dPW9bbl0sdFtuXT1pKX1lbHNlIHRbcl09aX1mdW5jdGlvbiBwdChlLHQsbil7dmFyIHIsaSxvPTAsYT1wdC5wcmVmaWx0ZXJzLmxlbmd0aCxzPXcuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKGkpcmV0dXJuITE7Zm9yKHZhciB0PW50fHxzdCgpLG49TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLXQpLHI9MS0obi9sLmR1cmF0aW9ufHwwKSxvPTAsYT1sLnR3ZWVucy5sZW5ndGg7bzxhO28rKylsLnR3ZWVuc1tvXS5ydW4ocik7cmV0dXJuIHMubm90aWZ5V2l0aChlLFtsLHIsbl0pLHI8MSYmYT9uOihhfHxzLm5vdGlmeVdpdGgoZSxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKGUsW2xdKSwhMSl9LGw9cy5wcm9taXNlKHtlbGVtOmUscHJvcHM6dy5leHRlbmQoe30sdCksb3B0czp3LmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6dy5lYXNpbmcuX2RlZmF1bHR9LG4pLG9yaWdpbmFsUHJvcGVydGllczp0LG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTpudHx8c3QoKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciByPXcuVHdlZW4oZSxsLm9wdHMsdCxuLGwub3B0cy5zcGVjaWFsRWFzaW5nW3RdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPTAscj10P2wudHdlZW5zLmxlbmd0aDowO2lmKGkpcmV0dXJuIHRoaXM7Zm9yKGk9ITA7bjxyO24rKylsLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIHQ/KHMubm90aWZ5V2l0aChlLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgoZSxbbCx0XSkpOnMucmVqZWN0V2l0aChlLFtsLHRdKSx0aGlzfX0pLGM9bC5wcm9wcztmb3IoZnQoYyxsLm9wdHMuc3BlY2lhbEVhc2luZyk7bzxhO28rKylpZihyPXB0LnByZWZpbHRlcnNbb10uY2FsbChsLGUsYyxsLm9wdHMpKXJldHVybiBnKHIuc3RvcCkmJih3Ll9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0b3A9ci5zdG9wLmJpbmQocikpLHI7cmV0dXJuIHcubWFwKGMsbHQsbCksZyhsLm9wdHMuc3RhcnQpJiZsLm9wdHMuc3RhcnQuY2FsbChlLGwpLGwucHJvZ3Jlc3MobC5vcHRzLnByb2dyZXNzKS5kb25lKGwub3B0cy5kb25lLGwub3B0cy5jb21wbGV0ZSkuZmFpbChsLm9wdHMuZmFpbCkuYWx3YXlzKGwub3B0cy5hbHdheXMpLHcuZngudGltZXIody5leHRlbmQodSx7ZWxlbTplLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbH13LkFuaW1hdGlvbj13LmV4dGVuZChwdCx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKGUsdCk7cmV0dXJuIHVlKG4uZWxlbSxlLGllLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7ZyhlKT8odD1lLGU9WyIqIl0pOmU9ZS5tYXRjaChNKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluPWVbcl0scHQudHdlZW5lcnNbbl09cHQudHdlZW5lcnNbbl18fFtdLHB0LnR3ZWVuZXJzW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W2N0XSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P3B0LnByZWZpbHRlcnMudW5zaGlmdChlKTpwdC5wcmVmaWx0ZXJzLnB1c2goZSl9fSksdy5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP3cuZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8ZyhlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYhZyh0KSYmdH07cmV0dXJuIHcuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIHcuZnguc3BlZWRzP3IuZHVyYXRpb249dy5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj13LmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXtnKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZ3LmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sdy5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoYWUpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXcuaXNFbXB0eU9iamVjdChlKSxvPXcuc3BlZWQodCxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgdD1wdCh0aGlzLHcuZXh0ZW5kKHt9LGUpLG8pOyhpfHxKLmdldCh0aGlzLCJmaW5pc2giKSkmJnQuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fCExPT09by5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KG4pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihuPXQsdD1lLGU9dm9pZCAwKSx0JiYhMSE9PWUmJnRoaXMucXVldWUoZXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ITAsaT1udWxsIT1lJiZlKyJxdWV1ZUhvb2tzIixvPXcudGltZXJzLGE9Si5nZXQodGhpcyk7aWYoaSlhW2ldJiZhW2ldLnN0b3AmJnIoYVtpXSk7ZWxzZSBmb3IoaSBpbiBhKWFbaV0mJmFbaV0uc3RvcCYmb3QudGVzdChpKSYmcihhW2ldKTtmb3IoaT1vLmxlbmd0aDtpLS07KW9baV0uZWxlbSE9PXRoaXN8fG51bGwhPWUmJm9baV0ucXVldWUhPT1lfHwob1tpXS5hbmltLnN0b3AobiksdD0hMSxvLnNwbGljZShpLDEpKTshdCYmbnx8dy5kZXF1ZXVlKHRoaXMsZSl9KX0sZmluaXNoOmZ1bmN0aW9uKGUpe3JldHVybiExIT09ZSYmKGU9ZXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQsbj1KLmdldCh0aGlzKSxyPW5bZSsicXVldWUiXSxpPW5bZSsicXVldWVIb29rcyJdLG89dy50aW1lcnMsYT1yP3IubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLHcucXVldWUodGhpcyxlLFtdKSxpJiZpLnN0b3AmJmkuc3RvcC5jYWxsKHRoaXMsITApLHQ9by5sZW5ndGg7dC0tOylvW3RdLmVsZW09PT10aGlzJiZvW3RdLnF1ZXVlPT09ZSYmKG9bdF0uYW5pbS5zdG9wKCEwKSxvLnNwbGljZSh0LDEpKTtmb3IodD0wO3Q8YTt0Kyspclt0XSYmclt0XS5maW5pc2gmJnJbdF0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIG4uZmluaXNofSl9fSksdy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHQpe3ZhciBuPXcuZm5bdF07dy5mblt0XT1mdW5jdGlvbihlLHIsaSl7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09dHlwZW9mIGU/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKHV0KHQsITApLGUscixpKX19KSx3LmVhY2goe3NsaWRlRG93bjp1dCgic2hvdyIpLHNsaWRlVXA6dXQoImhpZGUiKSxzbGlkZVRvZ2dsZTp1dCgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSksdy50aW1lcnM9W10sdy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49dy50aW1lcnM7Zm9yKG50PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8dy5meC5zdG9wKCksbnQ9dm9pZCAwfSx3LmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe3cudGltZXJzLnB1c2goZSksdy5meC5zdGFydCgpfSx3LmZ4LmludGVydmFsPTEzLHcuZnguc3RhcnQ9ZnVuY3Rpb24oKXtydHx8KHJ0PSEwLGF0KCkpfSx3LmZ4LnN0b3A9ZnVuY3Rpb24oKXtydD1udWxsfSx3LmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSx3LmZuLmRlbGF5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9dy5meD93LmZ4LnNwZWVkc1t0XXx8dDp0LG49bnx8ImZ4Iix0aGlzLnF1ZXVlKG4sZnVuY3Rpb24obixyKXt2YXIgaT1lLnNldFRpbWVvdXQobix0KTtyLnN0b3A9ZnVuY3Rpb24oKXtlLmNsZWFyVGltZW91dChpKX19KX0sZnVuY3Rpb24oKXt2YXIgZT1yLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdD1yLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKHIuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO2UudHlwZT0iY2hlY2tib3giLGguY2hlY2tPbj0iIiE9PWUudmFsdWUsaC5vcHRTZWxlY3RlZD10LnNlbGVjdGVkLChlPXIuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWU9InQiLGUudHlwZT0icmFkaW8iLGgucmFkaW9WYWx1ZT0idCI9PT1lLnZhbHVlfSgpO3ZhciBkdCxodD13LmV4cHIuYXR0ckhhbmRsZTt3LmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsdy5hdHRyLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt3LnJlbW92ZUF0dHIodGhpcyxlKX0pfX0pLHcuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgZS5nZXRBdHRyaWJ1dGU/dy5wcm9wKGUsdCxuKTooMT09PW8mJncuaXNYTUxEb2MoZSl8fChpPXcuYXR0ckhvb2tzW3QudG9Mb3dlckNhc2UoKV18fCh3LmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP2R0OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCB3LnJlbW92ZUF0dHIoZSx0KTppJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuKyIiKSxuKTppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOm51bGw9PShyPXcuZmluZC5hdHRyKGUsdCkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZighaC5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmTihlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXQmJnQubWF0Y2goTSk7aWYoaSYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1pW3IrK10pZS5yZW1vdmVBdHRyaWJ1dGUobil9fSksZHQ9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuITE9PT10P3cucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LHcuZWFjaCh3LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciBuPWh0W3RdfHx3LmZpbmQuYXR0cjtodFt0XT1mdW5jdGlvbihlLHQscil7dmFyIGksbyxhPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcnx8KG89aHRbYV0saHRbYV09aSxpPW51bGwhPW4oZSx0LHIpP2E6bnVsbCxodFthXT1vKSxpfX0pO3ZhciBndD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLHl0PS9eKD86YXxhcmVhKSQvaTt3LmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQpe3JldHVybiB6KHRoaXMsdy5wcm9wLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t3LnByb3BGaXhbZV18fGVdfSl9fSksdy5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1lLm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuIDE9PT1vJiZ3LmlzWE1MRG9jKGUpfHwodD13LnByb3BGaXhbdF18fHQsaT13LnByb3BIb29rc1t0XSksdm9pZCAwIT09bj9pJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjplW3RdPW46aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjplW3RdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5maW5kLmF0dHIoZSwidGFiaW5kZXgiKTtyZXR1cm4gdD9wYXJzZUludCh0LDEwKTpndC50ZXN0KGUubm9kZU5hbWUpfHx5dC50ZXN0KGUubm9kZU5hbWUpJiZlLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSxoLm9wdFNlbGVjdGVkfHwody5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTt0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLHcuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7dy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pO2Z1bmN0aW9uIHZ0KGUpe3JldHVybihlLm1hdGNoKE0pfHxbXSkuam9pbigiICIpfWZ1bmN0aW9uIG10KGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIHh0KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6InN0cmluZyI9PXR5cGVvZiBlP2UubWF0Y2goTSl8fFtdOltdfXcuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyx1PTA7aWYoZyhlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3codGhpcykuYWRkQ2xhc3MoZS5jYWxsKHRoaXMsdCxtdCh0aGlzKSkpfSk7aWYoKHQ9eHQoZSkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPW10KG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit2dChpKSsiICIpe2E9MDt3aGlsZShvPXRbYSsrXSlyLmluZGV4T2YoIiAiK28rIiAiKTwwJiYocis9bysiICIpO2khPT0ocz12dChyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzLHU9MDtpZihnKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7dyh0aGlzKS5yZW1vdmVDbGFzcyhlLmNhbGwodGhpcyx0LG10KHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKCh0PXh0KGUpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT1tdChuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIrdnQoaSkrIiAiKXthPTA7d2hpbGUobz10W2ErK10pd2hpbGUoci5pbmRleE9mKCIgIitvKyIgIik+LTEpcj1yLnJlcGxhY2UoIiAiK28rIiAiLCIgIik7aSE9PShzPXZ0KHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZSxyPSJzdHJpbmciPT09bnx8QXJyYXkuaXNBcnJheShlKTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0JiZyP3Q/dGhpcy5hZGRDbGFzcyhlKTp0aGlzLnJlbW92ZUNsYXNzKGUpOmcoZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3codGhpcykudG9nZ2xlQ2xhc3MoZS5jYWxsKHRoaXMsbixtdCh0aGlzKSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LGksbyxhO2lmKHIpe2k9MCxvPXcodGhpcyksYT14dChlKTt3aGlsZSh0PWFbaSsrXSlvLmhhc0NsYXNzKHQpP28ucmVtb3ZlQ2xhc3ModCk6by5hZGRDbGFzcyh0KX1lbHNlIHZvaWQgMCE9PWUmJiJib29sZWFuIiE9PW58fCgodD1tdCh0aGlzKSkmJkouc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLHQpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHR8fCExPT09ZT8iIjpKLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPTA7dD0iICIrZSsiICI7d2hpbGUobj10aGlzW3IrK10paWYoMT09PW4ubm9kZVR5cGUmJigiICIrdnQobXQobikpKyIgIikuaW5kZXhPZih0KT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgYnQ9L1xyL2c7dy5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiByPWcoZSksdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciBpOzE9PT10aGlzLm5vZGVUeXBlJiYobnVsbD09KGk9cj9lLmNhbGwodGhpcyxuLHcodGhpcykudmFsKCkpOmUpP2k9IiI6Im51bWJlciI9PXR5cGVvZiBpP2krPSIiOkFycmF5LmlzQXJyYXkoaSkmJihpPXcubWFwKGksZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZSsiIn0pKSwodD13LnZhbEhvb2tzW3RoaXMudHlwZV18fHcudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJzZXQiaW4gdCYmdm9pZCAwIT09dC5zZXQodGhpcyxpLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1pKSl9KTtpZihpKXJldHVybih0PXcudmFsSG9va3NbaS50eXBlXXx8dy52YWxIb29rc1tpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiB0JiZ2b2lkIDAhPT0obj10LmdldChpLCJ2YWx1ZSIpKT9uOiJzdHJpbmciPT10eXBlb2Yobj1pLnZhbHVlKT9uLnJlcGxhY2UoYnQsIiIpOm51bGw9PW4/IiI6bn19fSksdy5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD13LmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6dnQody50ZXh0KGUpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPWUub3B0aW9ucyxvPWUuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PWUudHlwZSxzPWE/bnVsbDpbXSx1PWE/bysxOmkubGVuZ3RoO2ZvcihyPW88MD91OmE/bzowO3I8dTtyKyspaWYoKChuPWlbcl0pLnNlbGVjdGVkfHxyPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IU4obi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD13KG4pLnZhbCgpLGEpcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89dy5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pKChyPWlbYV0pLnNlbGVjdGVkPXcuaW5BcnJheSh3LnZhbEhvb2tzLm9wdGlvbi5nZXQociksbyk+LTEpJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX19KSx3LmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXt3LnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9dy5pbkFycmF5KHcoZSkudmFsKCksdCk+LTF9fSxoLmNoZWNrT258fCh3LnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSksaC5mb2N1c2luPSJvbmZvY3VzaW4iaW4gZTt2YXIgd3Q9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFR0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O3cuZXh0ZW5kKHcuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24odCxuLGksbyl7dmFyIGEscyx1LGwsYyxwLGQsaCx2PVtpfHxyXSxtPWYuY2FsbCh0LCJ0eXBlIik/dC50eXBlOnQseD1mLmNhbGwodCwibmFtZXNwYWNlIik/dC5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihzPWg9dT1pPWl8fHIsMyE9PWkubm9kZVR5cGUmJjghPT1pLm5vZGVUeXBlJiYhd3QudGVzdChtK3cuZXZlbnQudHJpZ2dlcmVkKSYmKG0uaW5kZXhPZigiLiIpPi0xJiYobT0oeD1tLnNwbGl0KCIuIikpLnNoaWZ0KCkseC5zb3J0KCkpLGM9bS5pbmRleE9mKCI6Iik8MCYmIm9uIittLHQ9dFt3LmV4cGFuZG9dP3Q6bmV3IHcuRXZlbnQobSwib2JqZWN0Ij09dHlwZW9mIHQmJnQpLHQuaXNUcmlnZ2VyPW8/MjozLHQubmFtZXNwYWNlPXguam9pbigiLiIpLHQucm5hbWVzcGFjZT10Lm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIit4LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsdC5yZXN1bHQ9dm9pZCAwLHQudGFyZ2V0fHwodC50YXJnZXQ9aSksbj1udWxsPT1uP1t0XTp3Lm1ha2VBcnJheShuLFt0XSksZD13LmV2ZW50LnNwZWNpYWxbbV18fHt9LG98fCFkLnRyaWdnZXJ8fCExIT09ZC50cmlnZ2VyLmFwcGx5KGksbikpKXtpZighbyYmIWQubm9CdWJibGUmJiF5KGkpKXtmb3IobD1kLmRlbGVnYXRlVHlwZXx8bSx3dC50ZXN0KGwrbSl8fChzPXMucGFyZW50Tm9kZSk7cztzPXMucGFyZW50Tm9kZSl2LnB1c2gocyksdT1zO3U9PT0oaS5vd25lckRvY3VtZW50fHxyKSYmdi5wdXNoKHUuZGVmYXVsdFZpZXd8fHUucGFyZW50V2luZG93fHxlKX1hPTA7d2hpbGUoKHM9dlthKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSloPXMsdC50eXBlPWE+MT9sOmQuYmluZFR5cGV8fG0sKHA9KEouZ2V0KHMsImV2ZW50cyIpfHx7fSlbdC50eXBlXSYmSi5nZXQocywiaGFuZGxlIikpJiZwLmFwcGx5KHMsbiksKHA9YyYmc1tjXSkmJnAuYXBwbHkmJlkocykmJih0LnJlc3VsdD1wLmFwcGx5KHMsbiksITE9PT10LnJlc3VsdCYmdC5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gdC50eXBlPW0sb3x8dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8ZC5fZGVmYXVsdCYmITEhPT1kLl9kZWZhdWx0LmFwcGx5KHYucG9wKCksbil8fCFZKGkpfHxjJiZnKGlbbV0pJiYheShpKSYmKCh1PWlbY10pJiYoaVtjXT1udWxsKSx3LmV2ZW50LnRyaWdnZXJlZD1tLHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5hZGRFdmVudExpc3RlbmVyKG0sVHQpLGlbbV0oKSx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmgucmVtb3ZlRXZlbnRMaXN0ZW5lcihtLFR0KSx3LmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsdSYmKGlbY109dSkpLHQucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXcuZXh0ZW5kKG5ldyB3LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMH0pO3cuZXZlbnQudHJpZ2dlcihyLG51bGwsdCl9fSksdy5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gdy5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKX19KSxoLmZvY3VzaW58fHcuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbihlKXt3LmV2ZW50LnNpbXVsYXRlKHQsZS50YXJnZXQsdy5ldmVudC5maXgoZSkpfTt3LmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGk9Si5hY2Nlc3Mocix0KTtpfHxyLmFkZEV2ZW50TGlzdGVuZXIoZSxuLCEwKSxKLmFjY2VzcyhyLHQsKGl8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxpPUouYWNjZXNzKHIsdCktMTtpP0ouYWNjZXNzKHIsdCxpKTooci5yZW1vdmVFdmVudExpc3RlbmVyKGUsbiwhMCksSi5yZW1vdmUocix0KSl9fX0pO3ZhciBDdD1lLmxvY2F0aW9uLEV0PURhdGUubm93KCksa3Q9L1w/Lzt3LnBhcnNlWE1MPWZ1bmN0aW9uKHQpe3ZhciBuO2lmKCF0fHwic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dHJ5e249KG5ldyBlLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsInRleHQveG1sIil9Y2F0Y2goZSl7bj12b2lkIDB9cmV0dXJuIG4mJiFuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8dy5lcnJvcigiSW52YWxpZCBYTUw6ICIrdCksbn07dmFyIFN0PS9cW1xdJC8sRHQ9L1xyP1xuL2csTnQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLEF0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBqdChlLHQsbixyKXt2YXIgaTtpZihBcnJheS5pc0FycmF5KHQpKXcuZWFjaCh0LGZ1bmN0aW9uKHQsaSl7bnx8U3QudGVzdChlKT9yKGUsaSk6anQoZSsiWyIrKCJvYmplY3QiPT10eXBlb2YgaSYmbnVsbCE9aT90OiIiKSsiXSIsaSxuLHIpfSk7ZWxzZSBpZihufHwib2JqZWN0IiE9PXgodCkpcihlLHQpO2Vsc2UgZm9yKGkgaW4gdClqdChlKyJbIitpKyJdIix0W2ldLG4scil9dy5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3ZhciBuPWcodCk/dCgpOnQ7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYoQXJyYXkuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF3LmlzUGxhaW5PYmplY3QoZSkpdy5lYWNoKGUsZnVuY3Rpb24oKXtpKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKG4gaW4gZSlqdChuLGVbbl0sdCxpKTtyZXR1cm4gci5qb2luKCImIil9LHcuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXcucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBlP3cubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXcodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZBdC50ZXN0KHRoaXMubm9kZU5hbWUpJiYhTnQudGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IXBlLnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49dyh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOkFycmF5LmlzQXJyYXkobik/dy5tYXAobixmdW5jdGlvbihlKXtyZXR1cm57bmFtZTp0Lm5hbWUsdmFsdWU6ZS5yZXBsYWNlKER0LCJcclxuIil9fSk6e25hbWU6dC5uYW1lLHZhbHVlOm4ucmVwbGFjZShEdCwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBxdD0vJTIwL2csTHQ9LyMuKiQvLEh0PS8oWz8mXSlfPVteJl0qLyxPdD0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLFB0PS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLE10PS9eKD86R0VUfEhFQUQpJC8sUnQ9L15cL1wvLyxJdD17fSxXdD17fSwkdD0iKi8iLmNvbmNhdCgiKiIpLEJ0PXIuY3JlYXRlRWxlbWVudCgiYSIpO0J0LmhyZWY9Q3QuaHJlZjtmdW5jdGlvbiBGdChlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXsic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iKiIpO3ZhciByLGk9MCxvPXQudG9Mb3dlckNhc2UoKS5tYXRjaChNKXx8W107aWYoZyhuKSl3aGlsZShyPW9baSsrXSkiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwoZVtyXT1lW3JdfHxbXSkudW5zaGlmdChuKSk6KGVbcl09ZVtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uIF90KGUsdCxuLHIpe3ZhciBpPXt9LG89ZT09PVd0O2Z1bmN0aW9uIGEocyl7dmFyIHU7cmV0dXJuIGlbc109ITAsdy5lYWNoKGVbc118fFtdLGZ1bmN0aW9uKGUscyl7dmFyIGw9cyh0LG4scik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBsfHxvfHxpW2xdP28/ISh1PWwpOnZvaWQgMDoodC5kYXRhVHlwZXMudW5zaGlmdChsKSxhKGwpLCExKX0pLHV9cmV0dXJuIGEodC5kYXRhVHlwZXNbMF0pfHwhaVsiKiJdJiZhKCIqIil9ZnVuY3Rpb24genQoZSx0KXt2YXIgbixyLGk9dy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIHQpdm9pZCAwIT09dFtuXSYmKChpW25dP2U6cnx8KHI9e30pKVtuXT10W25dKTtyZXR1cm4gciYmdy5leHRlbmQoITAsZSxyKSxlfWZ1bmN0aW9uIFh0KGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IoaSBpbiBzKWlmKHNbaV0mJnNbaV0udGVzdChyKSl7dS51bnNoaWZ0KGkpO2JyZWFrfWlmKHVbMF1pbiBuKW89dVswXTtlbHNle2ZvcihpIGluIG4pe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbaSsiICIrdVswXV0pe289aTticmVha31hfHwoYT1pKX1vPW98fGF9aWYobylyZXR1cm4gbyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dfWZ1bmN0aW9uIFV0KGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD17fSxjPWUuZGF0YVR5cGVzLnNsaWNlKCk7aWYoY1sxXSlmb3IoYSBpbiBlLmNvbnZlcnRlcnMpbFthLnRvTG93ZXJDYXNlKCldPWUuY29udmVydGVyc1thXTtvPWMuc2hpZnQoKTt3aGlsZShvKWlmKGUucmVzcG9uc2VGaWVsZHNbb10mJihuW2UucmVzcG9uc2VGaWVsZHNbb11dPXQpLCF1JiZyJiZlLmRhdGFGaWx0ZXImJih0PWUuZGF0YUZpbHRlcih0LGUuZGF0YVR5cGUpKSx1PW8sbz1jLnNoaWZ0KCkpaWYoIioiPT09bylvPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09byl7aWYoIShhPWxbdSsiICIrb118fGxbIiogIitvXSkpZm9yKGkgaW4gbClpZigocz1pLnNwbGl0KCIgIikpWzFdPT09byYmKGE9bFt1KyIgIitzWzBdXXx8bFsiKiAiK3NbMF1dKSl7ITA9PT1hP2E9bFtpXTohMCE9PWxbaV0mJihvPXNbMF0sYy51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmZVsidGhyb3dzIl0pdD1hKHQpO2Vsc2UgdHJ5e3Q9YSh0KX1jYXRjaChlKXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjphP2U6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK299fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6dH19dy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOkN0LmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOlB0LnRlc3QoQ3QucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6JHQsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOncucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P3p0KHp0KGUsdy5hamF4U2V0dGluZ3MpLHQpOnp0KHcuYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkZ0KEl0KSxhamF4VHJhbnNwb3J0OkZ0KFd0KSxhamF4OmZ1bmN0aW9uKHQsbil7Im9iamVjdCI9PXR5cGVvZiB0JiYobj10LHQ9dm9pZCAwKSxuPW58fHt9O3ZhciBpLG8sYSxzLHUsbCxjLGYscCxkLGg9dy5hamF4U2V0dXAoe30sbiksZz1oLmNvbnRleHR8fGgseT1oLmNvbnRleHQmJihnLm5vZGVUeXBlfHxnLmpxdWVyeSk/dyhnKTp3LmV2ZW50LHY9dy5EZWZlcnJlZCgpLG09dy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikseD1oLnN0YXR1c0NvZGV8fHt9LGI9e30sVD17fSxDPSJjYW5jZWxlZCIsRT17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGMpe2lmKCFzKXtzPXt9O3doaWxlKHQ9T3QuZXhlYyhhKSlzW3RbMV0udG9Mb3dlckNhc2UoKV09dFsyXX10PXNbZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09dD9udWxsOnR9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBjP2E6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1jJiYoZT1UW2UudG9Mb3dlckNhc2UoKV09VFtlLnRvTG93ZXJDYXNlKCldfHxlLGJbZV09dCksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09YyYmKGgubWltZVR5cGU9ZSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihlKXt2YXIgdDtpZihlKWlmKGMpRS5hbHdheXMoZVtFLnN0YXR1c10pO2Vsc2UgZm9yKHQgaW4gZSl4W3RdPVt4W3RdLGVbdF1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHxDO3JldHVybiBpJiZpLmFib3J0KHQpLGsoMCx0KSx0aGlzfX07aWYodi5wcm9taXNlKEUpLGgudXJsPSgodHx8aC51cmx8fEN0LmhyZWYpKyIiKS5yZXBsYWNlKFJ0LEN0LnByb3RvY29sKyIvLyIpLGgudHlwZT1uLm1ldGhvZHx8bi50eXBlfHxoLm1ldGhvZHx8aC50eXBlLGguZGF0YVR5cGVzPShoLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goTSl8fFsiIl0sbnVsbD09aC5jcm9zc0RvbWFpbil7bD1yLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7bC5ocmVmPWgudXJsLGwuaHJlZj1sLmhyZWYsaC5jcm9zc0RvbWFpbj1CdC5wcm90b2NvbCsiLy8iK0J0Lmhvc3QhPWwucHJvdG9jb2wrIi8vIitsLmhvc3R9Y2F0Y2goZSl7aC5jcm9zc0RvbWFpbj0hMH19aWYoaC5kYXRhJiZoLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGguZGF0YSYmKGguZGF0YT13LnBhcmFtKGguZGF0YSxoLnRyYWRpdGlvbmFsKSksX3QoSXQsaCxuLEUpLGMpcmV0dXJuIEU7KGY9dy5ldmVudCYmaC5nbG9iYWwpJiYwPT13LmFjdGl2ZSsrJiZ3LmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGgudHlwZT1oLnR5cGUudG9VcHBlckNhc2UoKSxoLmhhc0NvbnRlbnQ9IU10LnRlc3QoaC50eXBlKSxvPWgudXJsLnJlcGxhY2UoTHQsIiIpLGguaGFzQ29udGVudD9oLmRhdGEmJmgucHJvY2Vzc0RhdGEmJjA9PT0oaC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoaC5kYXRhPWguZGF0YS5yZXBsYWNlKHF0LCIrIikpOihkPWgudXJsLnNsaWNlKG8ubGVuZ3RoKSxoLmRhdGEmJihoLnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIGguZGF0YSkmJihvKz0oa3QudGVzdChvKT8iJiI6Ij8iKStoLmRhdGEsZGVsZXRlIGguZGF0YSksITE9PT1oLmNhY2hlJiYobz1vLnJlcGxhY2UoSHQsIiQxIiksZD0oa3QudGVzdChvKT8iJiI6Ij8iKSsiXz0iK0V0KysrZCksaC51cmw9bytkKSxoLmlmTW9kaWZpZWQmJih3Lmxhc3RNb2RpZmllZFtvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsdy5sYXN0TW9kaWZpZWRbb10pLHcuZXRhZ1tvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIix3LmV0YWdbb10pKSwoaC5kYXRhJiZoLmhhc0NvbnRlbnQmJiExIT09aC5jb250ZW50VHlwZXx8bi5jb250ZW50VHlwZSkmJkUuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixoLmNvbnRlbnRUeXBlKSxFLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsaC5kYXRhVHlwZXNbMF0mJmguYWNjZXB0c1toLmRhdGFUeXBlc1swXV0/aC5hY2NlcHRzW2guZGF0YVR5cGVzWzBdXSsoIioiIT09aC5kYXRhVHlwZXNbMF0/IiwgIiskdCsiOyBxPTAuMDEiOiIiKTpoLmFjY2VwdHNbIioiXSk7Zm9yKHAgaW4gaC5oZWFkZXJzKUUuc2V0UmVxdWVzdEhlYWRlcihwLGguaGVhZGVyc1twXSk7aWYoaC5iZWZvcmVTZW5kJiYoITE9PT1oLmJlZm9yZVNlbmQuY2FsbChnLEUsaCl8fGMpKXJldHVybiBFLmFib3J0KCk7aWYoQz0iYWJvcnQiLG0uYWRkKGguY29tcGxldGUpLEUuZG9uZShoLnN1Y2Nlc3MpLEUuZmFpbChoLmVycm9yKSxpPV90KFd0LGgsbixFKSl7aWYoRS5yZWFkeVN0YXRlPTEsZiYmeS50cmlnZ2VyKCJhamF4U2VuZCIsW0UsaF0pLGMpcmV0dXJuIEU7aC5hc3luYyYmaC50aW1lb3V0PjAmJih1PWUuc2V0VGltZW91dChmdW5jdGlvbigpe0UuYWJvcnQoInRpbWVvdXQiKX0saC50aW1lb3V0KSk7dHJ5e2M9ITEsaS5zZW5kKGIsayl9Y2F0Y2goZSl7aWYoYyl0aHJvdyBlO2soLTEsZSl9fWVsc2UgaygtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gayh0LG4scixzKXt2YXIgbCxwLGQsYixULEM9bjtjfHwoYz0hMCx1JiZlLmNsZWFyVGltZW91dCh1KSxpPXZvaWQgMCxhPXN8fCIiLEUucmVhZHlTdGF0ZT10PjA/NDowLGw9dD49MjAwJiZ0PDMwMHx8MzA0PT09dCxyJiYoYj1YdChoLEUscikpLGI9VXQoaCxiLEUsbCksbD8oaC5pZk1vZGlmaWVkJiYoKFQ9RS5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKSYmKHcubGFzdE1vZGlmaWVkW29dPVQpLChUPUUuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJih3LmV0YWdbb109VCkpLDIwND09PXR8fCJIRUFEIj09PWgudHlwZT9DPSJub2NvbnRlbnQiOjMwND09PXQ/Qz0ibm90bW9kaWZpZWQiOihDPWIuc3RhdGUscD1iLmRhdGEsbD0hKGQ9Yi5lcnJvcikpKTooZD1DLCF0JiZDfHwoQz0iZXJyb3IiLHQ8MCYmKHQ9MCkpKSxFLnN0YXR1cz10LEUuc3RhdHVzVGV4dD0obnx8QykrIiIsbD92LnJlc29sdmVXaXRoKGcsW3AsQyxFXSk6di5yZWplY3RXaXRoKGcsW0UsQyxkXSksRS5zdGF0dXNDb2RlKHgpLHg9dm9pZCAwLGYmJnkudHJpZ2dlcihsPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW0UsaCxsP3A6ZF0pLG0uZmlyZVdpdGgoZyxbRSxDXSksZiYmKHkudHJpZ2dlcigiYWpheENvbXBsZXRlIixbRSxoXSksLS13LmFjdGl2ZXx8dy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIEV9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB3LmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdy5nZXQoZSx2b2lkIDAsdCwic2NyaXB0Iil9fSksdy5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsdCl7d1t0XT1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4gZyhuKSYmKGk9aXx8cixyPW4sbj12b2lkIDApLHcuYWpheCh3LmV4dGVuZCh7dXJsOmUsdHlwZTp0LGRhdGFUeXBlOmksZGF0YTpuLHN1Y2Nlc3M6cn0sdy5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSksdy5fZXZhbFVybD1mdW5jdGlvbihlKXtyZXR1cm4gdy5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSx3LmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpc1swXSYmKGcoZSkmJihlPWUuY2FsbCh0aGlzWzBdKSksdD13KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihlKXtyZXR1cm4gZyhlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7dyh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dyh0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD1nKGUpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7dyh0aGlzKS53cmFwQWxsKHQ/ZS5jYWxsKHRoaXMsbik6ZSl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7dyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSx3LmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIXcuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LHcuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSx3LmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBWdD17MDoyMDAsMTIyMzoyMDR9LEd0PXcuYWpheFNldHRpbmdzLnhocigpO2guY29ycz0hIUd0JiYid2l0aENyZWRlbnRpYWxzImluIEd0LGguYWpheD1HdD0hIUd0LHcuYWpheFRyYW5zcG9ydChmdW5jdGlvbih0KXt2YXIgbixyO2lmKGguY29yc3x8R3QmJiF0LmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGksbyl7dmFyIGEscz10LnhocigpO2lmKHMub3Blbih0LnR5cGUsdC51cmwsdC5hc3luYyx0LnVzZXJuYW1lLHQucGFzc3dvcmQpLHQueGhyRmllbGRzKWZvcihhIGluIHQueGhyRmllbGRzKXNbYV09dC54aHJGaWVsZHNbYV07dC5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUodC5taW1lVHlwZSksdC5jcm9zc0RvbWFpbnx8aVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoaVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihhIGluIGkpcy5zZXRSZXF1ZXN0SGVhZGVyKGEsaVthXSk7bj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtuJiYobj1yPXMub25sb2FkPXMub25lcnJvcj1zLm9uYWJvcnQ9cy5vbnRpbWVvdXQ9cy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09ZT9zLmFib3J0KCk6ImVycm9yIj09PWU/Im51bWJlciIhPXR5cGVvZiBzLnN0YXR1cz9vKDAsImVycm9yIik6byhzLnN0YXR1cyxzLnN0YXR1c1RleHQpOm8oVnRbcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInRleHQiIT09KHMucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHMucmVzcG9uc2VUZXh0P3tiaW5hcnk6cy5yZXNwb25zZX06e3RleHQ6cy5yZXNwb25zZVRleHR9LHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPW4oKSxyPXMub25lcnJvcj1zLm9udGltZW91dD1uKCJlcnJvciIpLHZvaWQgMCE9PXMub25hYm9ydD9zLm9uYWJvcnQ9cjpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1zLnJlYWR5U3RhdGUmJmUuc2V0VGltZW91dChmdW5jdGlvbigpe24mJnIoKX0pfSxuPW4oImFib3J0Iik7dHJ5e3Muc2VuZCh0Lmhhc0NvbnRlbnQmJnQuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYobil0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX0pLHcuYWpheFByZWZpbHRlcihmdW5jdGlvbihlKXtlLmNyb3NzRG9tYWluJiYoZS5jb250ZW50cy5zY3JpcHQ9ITEpfSksdy5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZ2xvYmFsRXZhbChlKSxlfX19KSx3LmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS5jYWNoZSYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9IkdFVCIpfSksdy5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2lmKGUuY3Jvc3NEb21haW4pe3ZhciB0LG47cmV0dXJue3NlbmQ6ZnVuY3Rpb24oaSxvKXt0PXcoIjxzY3JpcHQ+IikucHJvcCh7Y2hhcnNldDplLnNjcmlwdENoYXJzZXQsc3JjOmUudXJsfSkub24oImxvYWQgZXJyb3IiLG49ZnVuY3Rpb24oZSl7dC5yZW1vdmUoKSxuPW51bGwsZSYmbygiZXJyb3IiPT09ZS50eXBlPzQwNDoyMDAsZS50eXBlKX0pLHIuaGVhZC5hcHBlbmRDaGlsZCh0WzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX19KTt2YXIgWXQ9W10sUXQ9Lyg9KVw/KD89JnwkKXxcP1w/Lzt3LmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9WXQucG9wKCl8fHcuZXhwYW5kbysiXyIrRXQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLHcuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24odCxuLHIpe3ZhciBpLG8sYSxzPSExIT09dC5qc29ucCYmKFF0LnRlc3QodC51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgdC5kYXRhJiYwPT09KHQuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmUXQudGVzdCh0LmRhdGEpJiYiZGF0YSIpO2lmKHN8fCJqc29ucCI9PT10LmRhdGFUeXBlc1swXSlyZXR1cm4gaT10Lmpzb25wQ2FsbGJhY2s9Zyh0Lmpzb25wQ2FsbGJhY2spP3QuanNvbnBDYWxsYmFjaygpOnQuanNvbnBDYWxsYmFjayxzP3Rbc109dFtzXS5yZXBsYWNlKFF0LCIkMSIraSk6ITEhPT10Lmpzb25wJiYodC51cmwrPShrdC50ZXN0KHQudXJsKT8iJiI6Ij8iKSt0Lmpzb25wKyI9IitpKSx0LmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gYXx8dy5lcnJvcihpKyIgd2FzIG5vdCBjYWxsZWQiKSxhWzBdfSx0LmRhdGFUeXBlc1swXT0ianNvbiIsbz1lW2ldLGVbaV09ZnVuY3Rpb24oKXthPWFyZ3VtZW50c30sci5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1vP3coZSkucmVtb3ZlUHJvcChpKTplW2ldPW8sdFtpXSYmKHQuanNvbnBDYWxsYmFjaz1uLmpzb25wQ2FsbGJhY2ssWXQucHVzaChpKSksYSYmZyhvKSYmbyhhWzBdKSxhPW89dm9pZCAwfSksInNjcmlwdCJ9KSxoLmNyZWF0ZUhUTUxEb2N1bWVudD1mdW5jdGlvbigpe3ZhciBlPXIuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5O3JldHVybiBlLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1lLmNoaWxkTm9kZXMubGVuZ3RofSgpLHcucGFyc2VIVE1MPWZ1bmN0aW9uKGUsdCxuKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuW107ImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKTt2YXIgaSxvLGE7cmV0dXJuIHR8fChoLmNyZWF0ZUhUTUxEb2N1bWVudD8oKGk9KHQ9ci5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpKS5jcmVhdGVFbGVtZW50KCJiYXNlIikpLmhyZWY9ci5sb2NhdGlvbi5ocmVmLHQuaGVhZC5hcHBlbmRDaGlsZChpKSk6dD1yKSxvPUEuZXhlYyhlKSxhPSFuJiZbXSxvP1t0LmNyZWF0ZUVsZW1lbnQob1sxXSldOihvPXhlKFtlXSx0LGEpLGEmJmEubGVuZ3RoJiZ3KGEpLnJlbW92ZSgpLHcubWVyZ2UoW10sby5jaGlsZE5vZGVzKSl9LHcuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybiBzPi0xJiYocj12dChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksZyh0KT8obj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksYS5sZW5ndGg+MCYmdy5hamF4KHt1cmw6ZSx0eXBlOml8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP3coIjxkaXY+IikuYXBwZW5kKHcucGFyc2VIVE1MKGUpKS5maW5kKHIpOmUpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pfSksdGhpc30sdy5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oZSx0KXt3LmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksdy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZ3JlcCh3LnRpbWVycyxmdW5jdGlvbih0KXtyZXR1cm4gZT09PXQuZWxlbX0pLmxlbmd0aH0sdy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYz13LmNzcyhlLCJwb3NpdGlvbiIpLGY9dyhlKSxwPXt9OyJzdGF0aWMiPT09YyYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1mLm9mZnNldCgpLG89dy5jc3MoZSwidG9wIiksdT13LmNzcyhlLCJsZWZ0IiksKGw9KCJhYnNvbHV0ZSI9PT1jfHwiZml4ZWQiPT09YykmJihvK3UpLmluZGV4T2YoImF1dG8iKT4tMSk/KGE9KHI9Zi5wb3NpdGlvbigpKS50b3AsaT1yLmxlZnQpOihhPXBhcnNlRmxvYXQobyl8fDAsaT1wYXJzZUZsb2F0KHUpfHwwKSxnKHQpJiYodD10LmNhbGwoZSxuLHcuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihwLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihwLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxwKTpmLmNzcyhwKX19LHcuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oZSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt3Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIHQsbixyPXRoaXNbMF07aWYocilyZXR1cm4gci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8odD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6dC50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OnQubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH19LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxpPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT13LmNzcyhyLCJwb3NpdGlvbiIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT13LmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5wYXJlbnROb2RlO2UmJmUhPT1yJiYxPT09ZS5ub2RlVHlwZSYmKChpPXcoZSkub2Zmc2V0KCkpLnRvcCs9dy5jc3MoZSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxpLmxlZnQrPXcuY3NzKGUsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOnQudG9wLWkudG9wLXcuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LWkubGVmdC13LmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmInN0YXRpYyI9PT13LmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV8fGJlfSl9fSksdy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIG49InBhZ2VZT2Zmc2V0Ij09PXQ7dy5mbltlXT1mdW5jdGlvbihyKXtyZXR1cm4geih0aGlzLGZ1bmN0aW9uKGUscixpKXt2YXIgbztpZih5KGUpP289ZTo5PT09ZS5ub2RlVHlwZSYmKG89ZS5kZWZhdWx0Vmlldyksdm9pZCAwPT09aSlyZXR1cm4gbz9vW3RdOmVbcl07bz9vLnNjcm9sbFRvKG4/by5wYWdlWE9mZnNldDppLG4/aTpvLnBhZ2VZT2Zmc2V0KTplW3JdPWl9LGUscixhcmd1bWVudHMubGVuZ3RoKX19KSx3LmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSx0KXt3LmNzc0hvb2tzW3RdPV9lKGgucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLG4pe2lmKG4pcmV0dXJuIG49RmUoZSx0KSxXZS50ZXN0KG4pP3coZSkucG9zaXRpb24oKVt0XSsicHgiOm59KX0pLHcuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsdCl7dy5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50OnQsIiI6Im91dGVyIitlfSxmdW5jdGlvbihuLHIpe3cuZm5bcl09ZnVuY3Rpb24oaSxvKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2YgaSkscz1ufHwoITA9PT1pfHwhMD09PW8/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB6KHRoaXMsZnVuY3Rpb24odCxuLGkpe3ZhciBvO3JldHVybiB5KHQpPzA9PT1yLmluZGV4T2YoIm91dGVyIik/dFsiaW5uZXIiK2VdOnQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2VdOjk9PT10Lm5vZGVUeXBlPyhvPXQuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KHQuYm9keVsic2Nyb2xsIitlXSxvWyJzY3JvbGwiK2VdLHQuYm9keVsib2Zmc2V0IitlXSxvWyJvZmZzZXQiK2VdLG9bImNsaWVudCIrZV0pKTp2b2lkIDA9PT1pP3cuY3NzKHQsbixzKTp3LnN0eWxlKHQsbixpLHMpfSx0LGE/aTp2b2lkIDAsYSl9fSl9KSx3LmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXt3LmZuW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKHQsbnVsbCxlLG4pOnRoaXMudHJpZ2dlcih0KX19KSx3LmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9fSksdy5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9uKGUsbnVsbCx0LG4pfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vZmYoZSxudWxsLHQpfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwiKioiLG4pfX0pLHcucHJveHk9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYobj1lW3RdLHQ9ZSxlPW4pLGcoZSkpcmV0dXJuIHI9by5jYWxsKGFyZ3VtZW50cywyKSxpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChvLmNhbGwoYXJndW1lbnRzKSkpfSxpLmd1aWQ9ZS5ndWlkPWUuZ3VpZHx8dy5ndWlkKyssaX0sdy5ob2xkUmVhZHk9ZnVuY3Rpb24oZSl7ZT93LnJlYWR5V2FpdCsrOncucmVhZHkoITApfSx3LmlzQXJyYXk9QXJyYXkuaXNBcnJheSx3LnBhcnNlSlNPTj1KU09OLnBhcnNlLHcubm9kZU5hbWU9Tix3LmlzRnVuY3Rpb249Zyx3LmlzV2luZG93PXksdy5jYW1lbENhc2U9Ryx3LnR5cGU9eCx3Lm5vdz1EYXRlLm5vdyx3LmlzTnVtZXJpYz1mdW5jdGlvbihlKXt2YXIgdD13LnR5cGUoZSk7cmV0dXJuKCJudW1iZXIiPT09dHx8InN0cmluZyI9PT10KSYmIWlzTmFOKGUtcGFyc2VGbG9hdChlKSl9LCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB3fSk7dmFyIEp0PWUualF1ZXJ5LEt0PWUuJDtyZXR1cm4gdy5ub0NvbmZsaWN0PWZ1bmN0aW9uKHQpe3JldHVybiBlLiQ9PT13JiYoZS4kPUt0KSx0JiZlLmpRdWVyeT09PXcmJihlLmpRdWVyeT1KdCksd30sdHx8KGUualF1ZXJ5PWUuJD13KSx3fSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAqIGpRdWVyeSBUZW1wbGF0ZXMgUGx1Z2luIDEuMC4wcHJlCiAqIGh0dHA6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdG1wbAogKiBSZXF1aXJlcyBqUXVlcnkgMS40LjIKICoKICogQ29weXJpZ2h0IFNvZnR3YXJlIEZyZWVkb20gQ29uc2VydmFuY3ksIEluYy4KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICovCihmdW5jdGlvbihhKXt2YXIgcj1hLmZuLmRvbU1hbmlwLGQ9Il90bXBsaXRlbSIscT0vXltePF0qKDxbXHdcV10rPilbXj5dKiR8XHtce1whIC8sYj17fSxmPXt9LGUscD17a2V5OjAsZGF0YTp7fX0saT0wLGM9MCxsPVtdO2Z1bmN0aW9uIGcoZyxkLGgsZSl7dmFyIGM9e2RhdGE6ZXx8KGU9PT0wfHxlPT09ZmFsc2UpP2U6ZD9kLmRhdGE6e30sX3dyYXA6ZD9kLl93cmFwOm51bGwsdG1wbDpudWxsLHBhcmVudDpkfHxudWxsLG5vZGVzOltdLGNhbGxzOnUsbmVzdDp3LHdyYXA6eCxodG1sOnYsdXBkYXRlOnR9O2cmJmEuZXh0ZW5kKGMsZyx7bm9kZXM6W10scGFyZW50OmR9KTtpZihoKXtjLnRtcGw9aDtjLl9jdG50PWMuX2N0bnR8fGMudG1wbChhLGMpO2Mua2V5PSsraTsobC5sZW5ndGg/ZjpiKVtpXT1jfXJldHVybiBjfWEuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGYsZCl7YS5mbltmXT1mdW5jdGlvbihuKXt2YXIgZz1bXSxpPWEobiksayxoLG0sbCxqPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2U9Ynx8e307aWYoaiYmai5ub2RlVHlwZT09PTExJiZqLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmaS5sZW5ndGg9PT0xKXtpW2RdKHRoaXNbMF0pO2c9dGhpc31lbHNle2ZvcihoPTAsbT1pLmxlbmd0aDtoPG07aCsrKXtjPWg7az0oaD4wP3RoaXMuY2xvbmUodHJ1ZSk6dGhpcykuZ2V0KCk7YShpW2hdKVtkXShrKTtnPWcuY29uY2F0KGspfWM9MDtnPXRoaXMucHVzaFN0YWNrKGcsZixpLnNlbGVjdG9yKX1sPWU7ZT1udWxsO2EudG1wbC5jb21wbGV0ZShsKTtyZXR1cm4gZ319KTthLmZuLmV4dGVuZCh7dG1wbDpmdW5jdGlvbihkLGMsYil7cmV0dXJuIGEudG1wbCh0aGlzWzBdLGQsYyxiKX0sdG1wbEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gYS50bXBsSXRlbSh0aGlzWzBdKX0sdGVtcGxhdGU6ZnVuY3Rpb24oYil7cmV0dXJuIGEudGVtcGxhdGUoYix0aGlzWzBdKX0sZG9tTWFuaXA6ZnVuY3Rpb24oZCxtLGspe2lmKGRbMF0mJmEuaXNBcnJheShkWzBdKSl7dmFyIGc9YS5tYWtlQXJyYXkoYXJndW1lbnRzKSxoPWRbMF0saj1oLmxlbmd0aCxpPTAsZjt3aGlsZShpPGomJiEoZj1hLmRhdGEoaFtpKytdLCJ0bXBsSXRlbSIpKSk7aWYoZiYmYylnWzJdPWZ1bmN0aW9uKGIpe2EudG1wbC5hZnRlck1hbmlwKHRoaXMsYixrKX07ci5hcHBseSh0aGlzLGcpfWVsc2Ugci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Yz0wOyFlJiZhLnRtcGwuY29tcGxldGUoYik7cmV0dXJuIHRoaXN9fSk7YS5leHRlbmQoe3RtcGw6ZnVuY3Rpb24oZCxoLGUsYyl7dmFyIGksaz0hYztpZihrKXtjPXA7ZD1hLnRlbXBsYXRlW2RdfHxhLnRlbXBsYXRlKG51bGwsZCk7Zj17fX1lbHNlIGlmKCFkKXtkPWMudG1wbDtiW2Mua2V5XT1jO2Mubm9kZXM9W107Yy53cmFwcGVkJiZuKGMsYy53cmFwcGVkKTtyZXR1cm4gYShqKGMsbnVsbCxjLnRtcGwoYSxjKSkpfWlmKCFkKXJldHVybltdO2lmKHR5cGVvZiBoPT09ImZ1bmN0aW9uIiloPWguY2FsbChjfHx7fSk7ZSYmZS53cmFwcGVkJiZuKGUsZS53cmFwcGVkKTtpPWEuaXNBcnJheShoKT9hLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhP2coZSxjLGQsYSk6bnVsbH0pOltnKGUsYyxkLGgpXTtyZXR1cm4gaz9hKGooYyxudWxsLGkpKTppfSx0bXBsSXRlbTpmdW5jdGlvbihiKXt2YXIgYztpZihiIGluc3RhbmNlb2YgYSliPWJbMF07d2hpbGUoYiYmYi5ub2RlVHlwZT09PTEmJiEoYz1hLmRhdGEoYiwidG1wbEl0ZW0iKSkmJihiPWIucGFyZW50Tm9kZSkpO3JldHVybiBjfHxwfSx0ZW1wbGF0ZTpmdW5jdGlvbihjLGIpe2lmKGIpe2lmKHR5cGVvZiBiPT09InN0cmluZyIpYj1vKGIpO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIGEpYj1iWzBdfHx7fTtpZihiLm5vZGVUeXBlKWI9YS5kYXRhKGIsInRtcGwiKXx8YS5kYXRhKGIsInRtcGwiLG8oYi5pbm5lckhUTUwpKTtyZXR1cm4gdHlwZW9mIGM9PT0ic3RyaW5nIj8oYS50ZW1wbGF0ZVtjXT1iKTpifXJldHVybiBjP3R5cGVvZiBjIT09InN0cmluZyI/YS50ZW1wbGF0ZShudWxsLGMpOmEudGVtcGxhdGVbY118fGEudGVtcGxhdGUobnVsbCxxLnRlc3QoYyk/YzphKGMpKTpudWxsfSxlbmNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuKCIiK2EpLnNwbGl0KCImIikuam9pbigiJmFtcDsiKS5zcGxpdCgiPCIpLmpvaW4oIiZsdDsiKS5zcGxpdCgiPiIpLmpvaW4oIiZndDsiKS5zcGxpdCgnIicpLmpvaW4oIiYjMzQ7Iikuc3BsaXQoIiciKS5qb2luKCImIzM5OyIpfX0pO2EuZXh0ZW5kKGEudG1wbCx7dGFnOnt0bXBsOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiJpZigkbm90bnVsbF8xKXtfXz1fXy5jb25jYXQoJGl0ZW0ubmVzdCgkMSwkMikpO30ifSx3cmFwOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiIkaXRlbS5jYWxscyhfXywkMSwkMik7X189W107IixjbG9zZToiY2FsbD0kaXRlbS5jYWxscygpO19fPWNhbGwuXy5jb25jYXQoJGl0ZW0ud3JhcChjYWxsLF9fKSk7In0sZWFjaDp7X2RlZmF1bHQ6eyQyOiIkaW5kZXgsICR2YWx1ZSJ9LG9wZW46ImlmKCRub3RudWxsXzEpeyQuZWFjaCgkMWEsZnVuY3Rpb24oJDIpe3dpdGgodGhpcyl7IixjbG9zZToifX0pO30ifSwiaWYiOntvcGVuOiJpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsiLGNsb3NlOiJ9In0sImVsc2UiOntfZGVmYXVsdDp7JDE6InRydWUifSxvcGVuOiJ9ZWxzZSBpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsifSxodG1sOntvcGVuOiJpZigkbm90bnVsbF8xKXtfXy5wdXNoKCQxYSk7fSJ9LCI9Ijp7X2RlZmF1bHQ6eyQxOiIkZGF0YSJ9LG9wZW46ImlmKCRub3RudWxsXzEpe19fLnB1c2goJC5lbmNvZGUoJDFhKSk7fSJ9LCIhIjp7b3BlbjoiIn19LGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yj17fX0sYWZ0ZXJNYW5pcDpmdW5jdGlvbihmLGIsZCl7dmFyIGU9Yi5ub2RlVHlwZT09PTExP2EubWFrZUFycmF5KGIuY2hpbGROb2Rlcyk6Yi5ub2RlVHlwZT09PTE/W2JdOltdO2QuY2FsbChmLGIpO20oZSk7YysrfX0pO2Z1bmN0aW9uIGooZSxnLGYpe3ZhciBiLGM9Zj9hLm1hcChmLGZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2Uua2V5P2EucmVwbGFjZSgvKDxcdyspKD89W1xzPl0pKD8hW14+XSpfdG1wbGl0ZW0pKFtePl0qKS9nLCIkMSAiK2QrJz0iJytlLmtleSsnIiAkMicpOmE6aihhLGUsYS5fY3RudCl9KTplO2lmKGcpcmV0dXJuIGM7Yz1jLmpvaW4oIiIpO2MucmVwbGFjZSgvXlxzKihbXjxcc11bXjxdKik/KDxbXHdcV10rPikoW14+XSpbXj5cc10pP1xzKiQvLGZ1bmN0aW9uKGYsYyxlLGQpe2I9YShlKS5nZXQoKTttKGIpO2lmKGMpYj1rKGMpLmNvbmNhdChiKTtpZihkKWI9Yi5jb25jYXQoayhkKSl9KTtyZXR1cm4gYj9iOmsoYyl9ZnVuY3Rpb24gayhjKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlubmVySFRNTD1jO3JldHVybiBhLm1ha2VBcnJheShiLmNoaWxkTm9kZXMpfWZ1bmN0aW9uIG8oYil7cmV0dXJuIG5ldyBGdW5jdGlvbigialF1ZXJ5IiwiJGl0ZW0iLCJ2YXIgJD1qUXVlcnksY2FsbCxfXz1bXSwkZGF0YT0kaXRlbS5kYXRhO3dpdGgoJGRhdGEpe19fLnB1c2goJyIrYS50cmltKGIpLnJlcGxhY2UoLyhbXFwnXSkvZywiXFwkMSIpLnJlcGxhY2UoL1tcclx0XG5dL2csIiAiKS5yZXBsYWNlKC9cJFx7KFteXH1dKilcfS9nLCJ7ez0gJDF9fSIpLnJlcGxhY2UoL1x7XHsoXC8/KShcdyt8LikoPzpcKCgoPzpbXlx9XXxcfSg/IVx9KSkqPyk/XCkpPyg/OlxzKyguKj8pPyk/KFwoKCg/OlteXH1dfFx9KD8hXH0pKSo/KVwpKT9ccypcfVx9L2csZnVuY3Rpb24obSxsLGssZyxiLGMsZCl7dmFyIGo9YS50bXBsLnRhZ1trXSxpLGUsZjtpZighail0aHJvdyJVbmtub3duIHRlbXBsYXRlIHRhZzogIitrO2k9ai5fZGVmYXVsdHx8W107aWYoYyYmIS9cdyQvLnRlc3QoYikpe2IrPWM7Yz0iIn1pZihiKXtiPWgoYik7ZD1kPyIsIitoKGQpKyIpIjpjPyIpIjoiIjtlPWM/Yi5pbmRleE9mKCIuIik+LTE/YitoKGMpOiIoIitiKyIpLmNhbGwoJGl0ZW0iK2Q6YjtmPWM/ZToiKHR5cGVvZigiK2IrIik9PT0nZnVuY3Rpb24nPygiK2IrIikuY2FsbCgkaXRlbSk6KCIrYisiKSkifWVsc2UgZj1lPWkuJDF8fCJudWxsIjtnPWgoZyk7cmV0dXJuIicpOyIraltsPyJjbG9zZSI6Im9wZW4iXS5zcGxpdCgiJG5vdG51bGxfMSIpLmpvaW4oYj8idHlwZW9mKCIrYisiKSE9PSd1bmRlZmluZWQnICYmICgiK2IrIikhPW51bGwiOiJ0cnVlIikuc3BsaXQoIiQxYSIpLmpvaW4oZikuc3BsaXQoIiQxIikuam9pbihlKS5zcGxpdCgiJDIiKS5qb2luKGd8fGkuJDJ8fCIiKSsiX18ucHVzaCgnIn0pKyInKTt9cmV0dXJuIF9fOyIpfWZ1bmN0aW9uIG4oYyxiKXtjLl93cmFwPWooYyx0cnVlLGEuaXNBcnJheShiKT9iOltxLnRlc3QoYik/YjphKGIpLmh0bWwoKV0pLmpvaW4oIiIpfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGE/YS5yZXBsYWNlKC9cXCcvZywiJyIpLnJlcGxhY2UoL1xcXFwvZywiXFwiKTpudWxsfWZ1bmN0aW9uIHMoYil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5hcHBlbmRDaGlsZChiLmNsb25lTm9kZSh0cnVlKSk7cmV0dXJuIGEuaW5uZXJIVE1MfWZ1bmN0aW9uIG0obyl7dmFyIG49Il8iK2MsayxqLGw9e30sZSxwLGg7Zm9yKGU9MCxwPW8ubGVuZ3RoO2U8cDtlKyspe2lmKChrPW9bZV0pLm5vZGVUeXBlIT09MSljb250aW51ZTtqPWsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTtmb3IoaD1qLmxlbmd0aC0xO2g+PTA7aC0tKW0oaltoXSk7bShrKX1mdW5jdGlvbiBtKGope3ZhciBwLGg9aixrLGUsbTtpZihtPWouZ2V0QXR0cmlidXRlKGQpKXt3aGlsZShoLnBhcmVudE5vZGUmJihoPWgucGFyZW50Tm9kZSkubm9kZVR5cGU9PT0xJiYhKHA9aC5nZXRBdHRyaWJ1dGUoZCkpKTtpZihwIT09bSl7aD1oLnBhcmVudE5vZGU/aC5ub2RlVHlwZT09PTExPzA6aC5nZXRBdHRyaWJ1dGUoZCl8fDA6MDtpZighKGU9YlttXSkpe2U9ZlttXTtlPWcoZSxiW2hdfHxmW2hdKTtlLmtleT0rK2k7YltpXT1lfWMmJm8obSl9ai5yZW1vdmVBdHRyaWJ1dGUoZCl9ZWxzZSBpZihjJiYoZT1hLmRhdGEoaiwidG1wbEl0ZW0iKSkpe28oZS5rZXkpO2JbZS5rZXldPWU7aD1hLmRhdGEoai5wYXJlbnROb2RlLCJ0bXBsSXRlbSIpO2g9aD9oLmtleTowfWlmKGUpe2s9ZTt3aGlsZShrJiZrLmtleSE9aCl7ay5ub2Rlcy5wdXNoKGopO2s9ay5wYXJlbnR9ZGVsZXRlIGUuX2N0bnQ7ZGVsZXRlIGUuX3dyYXA7YS5kYXRhKGosInRtcGxJdGVtIixlKX1mdW5jdGlvbiBvKGEpe2E9YStuO2U9bFthXT1sW2FdfHxnKGUsYltlLnBhcmVudC5rZXkrbl18fGUucGFyZW50KX19fWZ1bmN0aW9uIHUoYSxkLGMsYil7aWYoIWEpcmV0dXJuIGwucG9wKCk7bC5wdXNoKHtfOmEsdG1wbDpkLGl0ZW06dGhpcyxkYXRhOmMsb3B0aW9uczpifSl9ZnVuY3Rpb24gdyhkLGMsYil7cmV0dXJuIGEudG1wbChhLnRlbXBsYXRlKGQpLGMsYix0aGlzKX1mdW5jdGlvbiB4KGIsZCl7dmFyIGM9Yi5vcHRpb25zfHx7fTtjLndyYXBwZWQ9ZDtyZXR1cm4gYS50bXBsKGEudGVtcGxhdGUoYi50bXBsKSxiLmRhdGEsYyxiLml0ZW0pfWZ1bmN0aW9uIHYoZCxjKXt2YXIgYj10aGlzLl93cmFwO3JldHVybiBhLm1hcChhKGEuaXNBcnJheShiKT9iLmpvaW4oIiIpOmIpLmZpbHRlcihkfHwiKiIpLGZ1bmN0aW9uKGEpe3JldHVybiBjP2EuaW5uZXJUZXh0fHxhLnRleHRDb250ZW50OmEub3V0ZXJIVE1MfHxzKGEpfSl9ZnVuY3Rpb24gdCgpe3ZhciBiPXRoaXMubm9kZXM7YS50bXBsKG51bGwsbnVsbCxudWxsLHRoaXMpLmluc2VydEJlZm9yZShiWzBdKTthKGIpLnJlbW92ZSgpfX0pKGpRdWVyeSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiFmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImpxdWVyeSJdLGUpOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUocmVxdWlyZSgianF1ZXJ5IikpOmUoalF1ZXJ5KX0oZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1lLnRhYmxlc29ydGVyPXt2ZXJzaW9uOiIyLjMwLjUiLHBhcnNlcnM6W10sd2lkZ2V0czpbXSxkZWZhdWx0czp7dGhlbWU6ImRlZmF1bHQiLHdpZHRoRml4ZWQ6ITEsc2hvd1Byb2Nlc3Npbmc6ITEsaGVhZGVyVGVtcGxhdGU6Intjb250ZW50fSIsb25SZW5kZXJUZW1wbGF0ZTpudWxsLG9uUmVuZGVySGVhZGVyOm51bGwsY2FuY2VsU2VsZWN0aW9uOiEwLHRhYkluZGV4OiEwLGRhdGVGb3JtYXQ6Im1tZGR5eXl5Iixzb3J0TXVsdGlTb3J0S2V5OiJzaGlmdEtleSIsc29ydFJlc2V0S2V5OiJjdHJsS2V5Iix1c051bWJlckZvcm1hdDohMCxkZWxheUluaXQ6ITEsc2VydmVyU2lkZVNvcnRpbmc6ITEscmVzb3J0OiEwLGhlYWRlcnM6e30saWdub3JlQ2FzZTohMCxzb3J0Rm9yY2U6bnVsbCxzb3J0TGlzdDpbXSxzb3J0QXBwZW5kOm51bGwsc29ydFN0YWJsZTohMSxzb3J0SW5pdGlhbE9yZGVyOiJhc2MiLHNvcnRMb2NhbGVDb21wYXJlOiExLHNvcnRSZXNldDohMSxzb3J0UmVzdGFydDohMSxlbXB0eVRvOiJib3R0b20iLHN0cmluZ1RvOiJtYXgiLGR1cGxpY2F0ZVNwYW46ITAsdGV4dEV4dHJhY3Rpb246ImJhc2ljIix0ZXh0QXR0cmlidXRlOiJkYXRhLXRleHQiLHRleHRTb3J0ZXI6bnVsbCxudW1iZXJTb3J0ZXI6bnVsbCxpbml0V2lkZ2V0czohMCx3aWRnZXRDbGFzczoid2lkZ2V0LXtuYW1lfSIsd2lkZ2V0czpbXSx3aWRnZXRPcHRpb25zOnt6ZWJyYTpbImV2ZW4iLCJvZGQiXX0saW5pdGlhbGl6ZWQ6bnVsbCx0YWJsZUNsYXNzOiIiLGNzc0FzYzoiIixjc3NEZXNjOiIiLGNzc05vbmU6IiIsY3NzSGVhZGVyOiIiLGNzc0hlYWRlclJvdzoiIixjc3NQcm9jZXNzaW5nOiIiLGNzc0NoaWxkUm93OiJ0YWJsZXNvcnRlci1jaGlsZFJvdyIsY3NzSW5mb0Jsb2NrOiJ0YWJsZXNvcnRlci1pbmZvT25seSIsY3NzTm9Tb3J0OiJ0YWJsZXNvcnRlci1ub1NvcnQiLGNzc0lnbm9yZVJvdzoidGFibGVzb3J0ZXItaWdub3JlUm93Iixjc3NJY29uOiJ0YWJsZXNvcnRlci1pY29uIixjc3NJY29uTm9uZToiIixjc3NJY29uQXNjOiIiLGNzc0ljb25EZXNjOiIiLGNzc0ljb25EaXNhYmxlZDoiIixwb2ludGVyQ2xpY2s6ImNsaWNrIixwb2ludGVyRG93bjoibW91c2Vkb3duIixwb2ludGVyVXA6Im1vdXNldXAiLHNlbGVjdG9ySGVhZGVyczoiPiB0aGVhZCB0aCwgPiB0aGVhZCB0ZCIsc2VsZWN0b3JTb3J0OiJ0aCwgdGQiLHNlbGVjdG9yUmVtb3ZlOiIucmVtb3ZlLW1lIixkZWJ1ZzohMSxoZWFkZXJMaXN0OltdLGVtcHRpZXM6e30sc3RyaW5nczp7fSxwYXJzZXJzOltdLGdsb2JhbGl6ZTowLGltZ0F0dHI6MH0sY3NzOnt0YWJsZToidGFibGVzb3J0ZXIiLGNzc0hhc0NoaWxkOiJ0YWJsZXNvcnRlci1oYXNDaGlsZFJvdyIsY2hpbGRSb3c6InRhYmxlc29ydGVyLWNoaWxkUm93Iixjb2xncm91cDoidGFibGVzb3J0ZXItY29sZ3JvdXAiLGhlYWRlcjoidGFibGVzb3J0ZXItaGVhZGVyIixoZWFkZXJSb3c6InRhYmxlc29ydGVyLWhlYWRlclJvdyIsaGVhZGVySW46InRhYmxlc29ydGVyLWhlYWRlci1pbm5lciIsaWNvbjoidGFibGVzb3J0ZXItaWNvbiIscHJvY2Vzc2luZzoidGFibGVzb3J0ZXItcHJvY2Vzc2luZyIsc29ydEFzYzoidGFibGVzb3J0ZXItaGVhZGVyQXNjIixzb3J0RGVzYzoidGFibGVzb3J0ZXItaGVhZGVyRGVzYyIsc29ydE5vbmU6InRhYmxlc29ydGVyLWhlYWRlclVuU29ydGVkIn0sbGFuZ3VhZ2U6e3NvcnRBc2M6IkFzY2VuZGluZyBzb3J0IGFwcGxpZWQsICIsc29ydERlc2M6IkRlc2NlbmRpbmcgc29ydCBhcHBsaWVkLCAiLHNvcnROb25lOiJObyBzb3J0IGFwcGxpZWQsICIsc29ydERpc2FibGVkOiJzb3J0aW5nIGlzIGRpc2FibGVkIixuZXh0QXNjOiJhY3RpdmF0ZSB0byBhcHBseSBhbiBhc2NlbmRpbmcgc29ydCIsbmV4dERlc2M6ImFjdGl2YXRlIHRvIGFwcGx5IGEgZGVzY2VuZGluZyBzb3J0IixuZXh0Tm9uZToiYWN0aXZhdGUgdG8gcmVtb3ZlIHRoZSBzb3J0In0scmVnZXg6e3RlbXBsYXRlQ29udGVudDovXHtjb250ZW50XH0vZyx0ZW1wbGF0ZUljb246L1x7aWNvblx9L2csdGVtcGxhdGVOYW1lOi9ce25hbWVcfS9pLHNwYWNlczovXHMrL2csbm9uV29yZDovXFcvZyxmb3JtRWxlbWVudHM6LyhpbnB1dHxzZWxlY3R8YnV0dG9ufHRleHRhcmVhKS9pLGNodW5rOi8oXihbK1wtXT8oPzpcZCopKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPyk/JHxeMHhbMC05YS1mXSskfFxkKykvZ2ksY2h1bmtzOi8oXlxcMHxcXDAkKS8saGV4Oi9eMHhbMC05YS1mXSskL2ksY29tbWE6LywvZyxkaWdpdE5vblVTOi9bXHN8XC5dL2csZGlnaXROZWdhdGl2ZVRlc3Q6L15ccypcKFsuXGRdK1wpLyxkaWdpdE5lZ2F0aXZlUmVwbGFjZTovXlxzKlwoKFsuXGRdKylcKS8sZGlnaXRUZXN0Oi9eW1wtKyhdP1xkK1spXT8kLyxkaWdpdFJlcGxhY2U6L1ssLiciXHNdL2d9LHN0cmluZzp7bWF4OjEsbWluOi0xLGVtcHR5bWluOjEsZW1wdHltYXg6LTEsemVybzowLG5vbmU6MCwibnVsbCI6MCx0b3A6ITAsYm90dG9tOiExfSxrZXlDb2Rlczp7ZW50ZXI6MTN9LGRhdGVzOnt9LGluc3RhbmNlTWV0aG9kczp7fSxzZXR1cDpmdW5jdGlvbihyLG8pe2lmKHImJnIudEhlYWQmJjAhPT1yLnRCb2RpZXMubGVuZ3RoJiYhMCE9PXIuaGFzSW5pdGlhbGl6ZWQpe3ZhciBzPSIiLGE9ZShyKSxuPWUubWV0YWRhdGE7ci5oYXNJbml0aWFsaXplZD0hMSxyLmlzUHJvY2Vzc2luZz0hMCxyLmNvbmZpZz1vLGUuZGF0YShyLCJ0YWJsZXNvcnRlciIsbyksdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkluaXRpYWxpemluZyB0YWJsZXNvcnRlciB2Iit0LnZlcnNpb24pLGUuZGF0YShyLCJzdGFydG92ZXJhbGx0aW1lciIsbmV3IERhdGUpKSxvLnN1cHBvcnRzRGF0YU9iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZVswXT1wYXJzZUludChlWzBdLDEwKSxlWzBdPjF8fDE9PT1lWzBdJiZwYXJzZUludChlWzFdLDEwKT49NH0oZS5mbi5qcXVlcnkuc3BsaXQoIi4iKSksby5lbXB0eVRvPW8uZW1wdHlUby50b0xvd2VyQ2FzZSgpLG8uc3RyaW5nVG89by5zdHJpbmdUby50b0xvd2VyQ2FzZSgpLG8ubGFzdD17c29ydExpc3Q6W10sY2xpY2tlZEluZGV4Oi0xfSwvdGFibGVzb3J0ZXJcLS8udGVzdChhLmF0dHIoImNsYXNzIikpfHwocz0iIiE9PW8udGhlbWU/IiB0YWJsZXNvcnRlci0iK28udGhlbWU6IiIpLG8ubmFtZXNwYWNlP28ubmFtZXNwYWNlPSIuIitvLm5hbWVzcGFjZS5yZXBsYWNlKHQucmVnZXgubm9uV29yZCwiIik6by5uYW1lc3BhY2U9Ii50YWJsZXNvcnRlciIrTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiksby50YWJsZT1yLG8uJHRhYmxlPWEuYWRkQ2xhc3ModC5jc3MudGFibGUrIiAiK28udGFibGVDbGFzcytzKyIgIitvLm5hbWVzcGFjZS5zbGljZSgxKSkuYXR0cigicm9sZSIsImdyaWQiKSxvLiRoZWFkZXJzPWEuZmluZChvLnNlbGVjdG9ySGVhZGVycyksby4kdGFibGUuY2hpbGRyZW4oKS5jaGlsZHJlbigidHIiKS5hdHRyKCJyb2xlIiwicm93Iiksby4kdGJvZGllcz1hLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrby5jc3NJbmZvQmxvY2srIikiKS5hdHRyKHsiYXJpYS1saXZlIjoicG9saXRlIiwiYXJpYS1yZWxldmFudCI6ImFsbCJ9KSxvLiR0YWJsZS5jaGlsZHJlbigiY2FwdGlvbiIpLmxlbmd0aCYmKChzPW8uJHRhYmxlLmNoaWxkcmVuKCJjYXB0aW9uIilbMF0pLmlkfHwocy5pZD1vLm5hbWVzcGFjZS5zbGljZSgxKSsiY2FwdGlvbiIpLG8uJHRhYmxlLmF0dHIoImFyaWEtbGFiZWxsZWRieSIscy5pZCkpLG8ud2lkZ2V0SW5pdD17fSxvLnRleHRFeHRyYWN0aW9uPW8uJHRhYmxlLmF0dHIoImRhdGEtdGV4dC1leHRyYWN0aW9uIil8fG8udGV4dEV4dHJhY3Rpb258fCJiYXNpYyIsdC5idWlsZEhlYWRlcnMobyksdC5maXhDb2x1bW5XaWR0aChyKSx0LmFkZFdpZGdldEZyb21DbGFzcyhyKSx0LmFwcGx5V2lkZ2V0T3B0aW9ucyhyKSx0LnNldHVwUGFyc2VycyhvKSxvLnRvdGFsUm93cz0wLG8uZGVidWcmJnQudmFsaWRhdGVPcHRpb25zKG8pLG8uZGVsYXlJbml0fHx0LmJ1aWxkQ2FjaGUobyksdC5iaW5kRXZlbnRzKHIsby4kaGVhZGVycywhMCksdC5iaW5kTWV0aG9kcyhvKSxvLnN1cHBvcnRzRGF0YU9iamVjdCYmdm9pZCAwIT09YS5kYXRhKCkuc29ydGxpc3Q/by5zb3J0TGlzdD1hLmRhdGEoKS5zb3J0bGlzdDpuJiZhLm1ldGFkYXRhKCkmJmEubWV0YWRhdGEoKS5zb3J0bGlzdCYmKG8uc29ydExpc3Q9YS5tZXRhZGF0YSgpLnNvcnRsaXN0KSx0LmFwcGx5V2lkZ2V0KHIsITApLG8uc29ydExpc3QubGVuZ3RoPjA/dC5zb3J0T24obyxvLnNvcnRMaXN0LHt9LCFvLmluaXRXaWRnZXRzKToodC5zZXRIZWFkZXJzQ3NzKG8pLG8uaW5pdFdpZGdldHMmJnQuYXBwbHlXaWRnZXQociwhMSkpLG8uc2hvd1Byb2Nlc3NpbmcmJmEudW5iaW5kKCJzb3J0QmVnaW4iK28ubmFtZXNwYWNlKyIgc29ydEVuZCIrby5uYW1lc3BhY2UpLmJpbmQoInNvcnRCZWdpbiIrby5uYW1lc3BhY2UrIiBzb3J0RW5kIitvLm5hbWVzcGFjZSxmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoby50aW1lclByb2Nlc3NpbmcpLHQuaXNQcm9jZXNzaW5nKHIpLCJzb3J0QmVnaW4iPT09ZS50eXBlJiYoby50aW1lclByb2Nlc3Npbmc9c2V0VGltZW91dChmdW5jdGlvbigpe3QuaXNQcm9jZXNzaW5nKHIsITApfSw1MDApKX0pLHIuaGFzSW5pdGlhbGl6ZWQ9ITAsci5pc1Byb2Nlc3Npbmc9ITEsdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlLmxvZygiT3ZlcmFsbCBpbml0aWFsaXphdGlvbiB0aW1lOiIrdC5iZW5jaG1hcmsoZS5kYXRhKHIsInN0YXJ0b3ZlcmFsbHRpbWVyIikpKSx0LmRlYnVnKG8sImNvcmUiKSYmY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSxhLnRyaWdnZXJIYW5kbGVyKCJ0YWJsZXNvcnRlci1pbml0aWFsaXplZCIsciksImZ1bmN0aW9uIj09dHlwZW9mIG8uaW5pdGlhbGl6ZWQmJm8uaW5pdGlhbGl6ZWQocil9ZWxzZSB0LmRlYnVnKG8sImNvcmUiKSYmKHIuaGFzSW5pdGlhbGl6ZWQ/Y29uc29sZS53YXJuKCJTdG9wcGluZyBpbml0aWFsaXphdGlvbi4gVGFibGVzb3J0ZXIgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCIpOmNvbnNvbGUuZXJyb3IoIlN0b3BwaW5nIGluaXRpYWxpemF0aW9uISBObyB0YWJsZSwgdGhlYWQgb3IgdGJvZHkiLHIpKX0sYmluZE1ldGhvZHM6ZnVuY3Rpb24ocil7dmFyIG89ci4kdGFibGUscz1yLm5hbWVzcGFjZSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgYWRkUm93cyB1cGRhdGVDZWxsIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyBkZXN0cm95IG1vdXNldXAgbW91c2VsZWF2ZSAiLnNwbGl0KCIgIikuam9pbihzKyIgIik7by51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLmJpbmQoInNvcnRSZXNldCIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5zb3J0UmVzZXQodGhpcy5jb25maWcsZnVuY3Rpb24oZSl7ZS5pc0FwcGx5aW5nV2lkZ2V0cz9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5hcHBseVdpZGdldChlLCIiLHIpfSwxMDApOnQuYXBwbHlXaWRnZXQoZSwiIixyKX0pfSkuYmluZCgidXBkYXRlQWxsIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQWxsKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGUiK3MrIiB1cGRhdGVSb3dzIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGVIZWFkZXJzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUhlYWRlcnModGhpcy5jb25maWcscil9KS5iaW5kKCJ1cGRhdGVDZWxsIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC51cGRhdGVDZWxsKHRoaXMuY29uZmlnLHIsbyxzKX0pLmJpbmQoImFkZFJvd3MiK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFkZFJvd3ModGhpcy5jb25maWcscixvLHMpfSkuYmluZCgidXBkYXRlQ29tcGxldGUiK3MsZnVuY3Rpb24oKXt0aGlzLmlzVXBkYXRpbmc9ITF9KS5iaW5kKCJzb3J0b24iK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnNvcnRPbih0aGlzLmNvbmZpZyxyLG8scyl9KS5iaW5kKCJhcHBlbmRDYWNoZSIrcyxmdW5jdGlvbihyLG8scyl7ci5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGVuZENhY2hlKHRoaXMuY29uZmlnLHMpLGUuaXNGdW5jdGlvbihvKSYmbyh0aGlzKX0pLmJpbmQoInVwZGF0ZUNhY2hlIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQ2FjaGUodGhpcy5jb25maWcscixvKX0pLmJpbmQoImFwcGx5V2lkZ2V0SWQiK3MsZnVuY3Rpb24oZSxyKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuYXBwbHlXaWRnZXRJZCh0aGlzLHIpfSkuYmluZCgiYXBwbHlXaWRnZXRzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGx5V2lkZ2V0KHRoaXMsITEscil9KS5iaW5kKCJyZWZyZXNoV2lkZ2V0cyIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlZnJlc2hXaWRnZXRzKHRoaXMscixvKX0pLmJpbmQoInJlbW92ZVdpZGdldCIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlbW92ZVdpZGdldCh0aGlzLHIsbyl9KS5iaW5kKCJkZXN0cm95IitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuZGVzdHJveSh0aGlzLHIsbyl9KS5iaW5kKCJyZXNldFRvTG9hZFN0YXRlIitzLGZ1bmN0aW9uKG8pe28uc3RvcFByb3BhZ2F0aW9uKCksdC5yZW1vdmVXaWRnZXQodGhpcywhMCwhMSk7dmFyIHM9ZS5leHRlbmQoITAse30sci5vcmlnaW5hbFNldHRpbmdzKTsocj1lLmV4dGVuZCghMCx7fSx0LmRlZmF1bHRzLHMpKS5vcmlnaW5hbFNldHRpbmdzPXMsdGhpcy5oYXNJbml0aWFsaXplZD0hMSx0LnNldHVwKHRoaXMscil9KX0sYmluZEV2ZW50czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbj0ocj1lKHIpWzBdKS5jb25maWcsaT1uLm5hbWVzcGFjZSxsPW51bGw7ITAhPT1zJiYoby5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfaGVhZGVycyIpLChhPXQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpKS5sZW5ndGgmJiJUQUJMRSI9PT1hWzBdLm5vZGVOYW1lJiZhWzBdIT09ciYmZShhWzBdKS5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfdGFibGUiKSksYT0obi5wb2ludGVyRG93bisiICIrbi5wb2ludGVyVXArIiAiK24ucG9pbnRlckNsaWNrKyIgc29ydCBrZXl1cCAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikuc3BsaXQoIiAiKS5qb2luKGkrIiAiKSxvLmZpbmQobi5zZWxlY3RvclNvcnQpLmFkZChvLmZpbHRlcihuLnNlbGVjdG9yU29ydCkpLnVuYmluZChhKS5iaW5kKGEsZnVuY3Rpb24ocixvKXt2YXIgcyxhLGksZD1lKHIudGFyZ2V0KSxjPSIgIityLnR5cGUrIiAiO2lmKCEoMSE9PShyLndoaWNofHxyLmJ1dHRvbikmJiFjLm1hdGNoKCIgIituLnBvaW50ZXJDbGljaysiIHwgc29ydCB8IGtleXVwICIpfHwiIGtleXVwICI9PT1jJiZyLndoaWNoIT09dC5rZXlDb2Rlcy5lbnRlcnx8Yy5tYXRjaCgiICIrbi5wb2ludGVyQ2xpY2srIiAiKSYmdm9pZCAwIT09ci53aGljaHx8Yy5tYXRjaCgiICIrbi5wb2ludGVyVXArIiAiKSYmbCE9PXIudGFyZ2V0JiYhMCE9PW8pKXtpZihjLm1hdGNoKCIgIituLnBvaW50ZXJEb3duKyIgIikpcmV0dXJuIGw9ci50YXJnZXQsdm9pZCgiMSI9PT0oaT1kLmpxdWVyeS5zcGxpdCgiLiIpKVswXSYmaVsxXTw0JiZyLnByZXZlbnREZWZhdWx0KCkpO2lmKGw9bnVsbCxzPXQuZ2V0Q2xvc2VzdChlKHRoaXMpLCIuIit0LmNzcy5oZWFkZXIpLHQucmVnZXguZm9ybUVsZW1lbnRzLnRlc3Qoci50YXJnZXQubm9kZU5hbWUpfHxkLmhhc0NsYXNzKG4uY3NzTm9Tb3J0KXx8ZC5wYXJlbnRzKCIuIituLmNzc05vU29ydCkubGVuZ3RoPjB8fHMuaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHxkLnBhcmVudHMoImJ1dHRvbiIpLmxlbmd0aD4wKXJldHVybiFuLmNhbmNlbFNlbGVjdGlvbjtuLmRlbGF5SW5pdCYmdC5pc0VtcHR5T2JqZWN0KG4uY2FjaGUpJiZ0LmJ1aWxkQ2FjaGUobiksbi5sYXN0LmNsaWNrZWRJbmRleD1zLmF0dHIoImRhdGEtY29sdW1uIil8fHMuaW5kZXgoKSwoYT1uLiRoZWFkZXJJbmRleGVkW24ubGFzdC5jbGlja2VkSW5kZXhdWzBdKSYmIWEuc29ydERpc2FibGVkJiZ0LmluaXRTb3J0KG4sYSxyKX19KSxuLmNhbmNlbFNlbGVjdGlvbiYmby5hdHRyKCJ1bnNlbGVjdGFibGUiLCJvbiIpLmJpbmQoInNlbGVjdHN0YXJ0IiwhMSkuY3NzKHsidXNlci1zZWxlY3QiOiJub25lIixNb3pVc2VyU2VsZWN0OiJub25lIn0pfSxidWlsZEhlYWRlcnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG47Zm9yKHIuaGVhZGVyTGlzdD1bXSxyLmhlYWRlckNvbnRlbnQ9W10sci5zb3J0VmFycz1bXSx0LmRlYnVnKHIsImNvcmUiKSYmKGE9bmV3IERhdGUpLHIuY29sdW1ucz10LmNvbXB1dGVDb2x1bW5JbmRleChyLiR0YWJsZS5jaGlsZHJlbigidGhlYWQsIHRmb290IikuY2hpbGRyZW4oInRyIikpLHM9ci5jc3NJY29uPyc8aSBjbGFzcz0iJysoci5jc3NJY29uPT09dC5jc3MuaWNvbj90LmNzcy5pY29uOnIuY3NzSWNvbisiICIrdC5jc3MuaWNvbikrJyI+PC9pPic6IiIsci4kaGVhZGVycz1lKGUubWFwKHIuJHRhYmxlLmZpbmQoci5zZWxlY3RvckhlYWRlcnMpLGZ1bmN0aW9uKG8sYSl7dmFyIG4saSxsLGQsYyxnPWUobyk7aWYoIXQuZ2V0Q2xvc2VzdChnLCJ0ciIpLmhhc0NsYXNzKHIuY3NzSWdub3JlUm93KSlyZXR1cm4vKHRofHRkKS9pLnRlc3Qoby5ub2RlTmFtZSl8fChjPXQuZ2V0Q2xvc2VzdChnLCJ0aCwgdGQiKSxnLmF0dHIoImRhdGEtY29sdW1uIixjLmF0dHIoImRhdGEtY29sdW1uIikpKSxuPXQuZ2V0Q29sdW1uRGF0YShyLnRhYmxlLHIuaGVhZGVycyxhLCEwKSxyLmhlYWRlckNvbnRlbnRbYV09Zy5odG1sKCksIiI9PT1yLmhlYWRlclRlbXBsYXRlfHxnLmZpbmQoIi4iK3QuY3NzLmhlYWRlckluKS5sZW5ndGh8fChkPXIuaGVhZGVyVGVtcGxhdGUucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlQ29udGVudCxnLmh0bWwoKSkucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlSWNvbixnLmZpbmQoIi4iK3QuY3NzLmljb24pLmxlbmd0aD8iIjpzKSxyLm9uUmVuZGVyVGVtcGxhdGUmJihpPXIub25SZW5kZXJUZW1wbGF0ZS5hcHBseShnLFthLGRdKSkmJiJzdHJpbmciPT10eXBlb2YgaSYmKGQ9aSksZy5odG1sKCc8ZGl2IGNsYXNzPSInK3QuY3NzLmhlYWRlckluKyciPicrZCsiPC9kaXY+IikpLHIub25SZW5kZXJIZWFkZXImJnIub25SZW5kZXJIZWFkZXIuYXBwbHkoZyxbYSxyLHIuJHRhYmxlXSksbD1wYXJzZUludChnLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG8uY29sdW1uPWwsYz10LmdldE9yZGVyKHQuZ2V0RGF0YShnLG4sInNvcnRJbml0aWFsT3JkZXIiKXx8ci5zb3J0SW5pdGlhbE9yZGVyKSxyLnNvcnRWYXJzW2xdPXtjb3VudDotMSxvcmRlcjpjP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxsb2NrZWRPcmRlcjohMX0sdm9pZCAwIT09KGM9dC5nZXREYXRhKGcsbiwibG9ja2VkT3JkZXIiKXx8ITEpJiYhMSE9PWMmJihyLnNvcnRWYXJzW2xdLmxvY2tlZE9yZGVyPSEwLHIuc29ydFZhcnNbbF0ub3JkZXI9dC5nZXRPcmRlcihjKT9bMSwxXTpbMCwwXSksci5oZWFkZXJMaXN0W2FdPW8sZy5hZGRDbGFzcyh0LmNzcy5oZWFkZXIrIiAiK3IuY3NzSGVhZGVyKSx0LmdldENsb3Nlc3QoZywidHIiKS5hZGRDbGFzcyh0LmNzcy5oZWFkZXJSb3crIiAiK3IuY3NzSGVhZGVyUm93KS5hdHRyKCJyb2xlIiwicm93Iiksci50YWJJbmRleCYmZy5hdHRyKCJ0YWJpbmRleCIsMCksb30pKSxyLiRoZWFkZXJJbmRleGVkPVtdLG49MDtuPHIuY29sdW1ucztuKyspdC5pc0VtcHR5T2JqZWN0KHIuc29ydFZhcnNbbl0pJiYoci5zb3J0VmFyc1tuXT17fSksbz1yLiRoZWFkZXJzLmZpbHRlcignW2RhdGEtY29sdW1uPSInK24rJyJdJyksci4kaGVhZGVySW5kZXhlZFtuXT1vLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcigiOmxhc3QiKTpvLmZpbHRlcigiOmxhc3QiKTplKCk7ci4kdGFibGUuZmluZChyLnNlbGVjdG9ySGVhZGVycykuYXR0cih7c2NvcGU6ImNvbCIscm9sZToiY29sdW1uaGVhZGVyIn0pLHQudXBkYXRlSGVhZGVyKHIpLHQuZGVidWcociwiY29yZSIpJiYoY29uc29sZS5sb2coIkJ1aWx0IGhlYWRlcnM6Iit0LmJlbmNobWFyayhhKSksY29uc29sZS5sb2coci4kaGVhZGVycykpfSxhZGRJbnN0YW5jZU1ldGhvZHM6ZnVuY3Rpb24ocil7ZS5leHRlbmQodC5pbnN0YW5jZU1ldGhvZHMscil9LHNldHVwUGFyc2VyczpmdW5jdGlvbihlLHIpe3ZhciBvLHMsYSxuLGksbCxkLGMsZyxwLHUsZixoLG0sYj1lLnRhYmxlLHk9MCx3PXQuZGVidWcoZSwiY29yZSIpLHg9e307aWYoZS4kdGJvZGllcz1lLiR0YWJsZS5jaGlsZHJlbigidGJvZHk6bm90KC4iK2UuY3NzSW5mb0Jsb2NrKyIpIiksaD12b2lkIDA9PT1yP2UuJHRib2RpZXM6ciwwPT09KG09aC5sZW5ndGgpKXJldHVybiB3P2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgcGFyc2VyIGNhY2hlIik6IiI7Zm9yKHcmJihmPW5ldyBEYXRlLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiRGV0ZWN0aW5nIHBhcnNlcnMgZm9yIGVhY2ggY29sdW1uIikpLHM9e2V4dHJhY3RvcnM6W10scGFyc2VyczpbXX07eTxtOyl7aWYoKG89aFt5XS5yb3dzKS5sZW5ndGgpZm9yKGk9MCxuPWUuY29sdW1ucyxsPTA7bDxuO2wrKyl7aWYoKGQ9ZS4kaGVhZGVySW5kZXhlZFtpXSkmJmQubGVuZ3RoJiYoYz10LmdldENvbHVtbkRhdGEoYixlLmhlYWRlcnMsaSksdT10LmdldFBhcnNlckJ5SWQodC5nZXREYXRhKGQsYywiZXh0cmFjdG9yIikpLHA9dC5nZXRQYXJzZXJCeUlkKHQuZ2V0RGF0YShkLGMsInNvcnRlciIpKSxnPSJmYWxzZSI9PT10LmdldERhdGEoZCxjLCJwYXJzZXIiKSxlLmVtcHRpZXNbaV09KHQuZ2V0RGF0YShkLGMsImVtcHR5Iil8fGUuZW1wdHlUb3x8KGUuZW1wdHlUb0JvdHRvbT8iYm90dG9tIjoidG9wIikpLnRvTG93ZXJDYXNlKCksZS5zdHJpbmdzW2ldPSh0LmdldERhdGEoZCxjLCJzdHJpbmciKXx8ZS5zdHJpbmdUb3x8Im1heCIpLnRvTG93ZXJDYXNlKCksZyYmKHA9dC5nZXRQYXJzZXJCeUlkKCJuby1wYXJzZXIiKSksdXx8KHU9ITEpLHB8fChwPXQuZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKGUsbywtMSxpKSksdyYmKHhbIigiK2krIikgIitkLnRleHQoKV09e3BhcnNlcjpwLmlkLGV4dHJhY3Rvcjp1P3UuaWQ6Im5vbmUiLHN0cmluZzplLnN0cmluZ3NbaV0sZW1wdHk6ZS5lbXB0aWVzW2ldfSkscy5wYXJzZXJzW2ldPXAscy5leHRyYWN0b3JzW2ldPXUsKGE9ZFswXS5jb2xTcGFuLTEpPjApKWZvcihpKz1hLG4rPWE7YSsxPjA7KXMucGFyc2Vyc1tpLWFdPXAscy5leHRyYWN0b3JzW2ktYV09dSxhLS07aSsrfXkrPXMucGFyc2Vycy5sZW5ndGg/bToxfXcmJih0LmlzRW1wdHlPYmplY3QoeCk/Y29uc29sZS53YXJuKCIgIE5vIHBhcnNlcnMgZGV0ZWN0ZWQhIik6Y29uc29sZVtjb25zb2xlLnRhYmxlPyJ0YWJsZSI6ImxvZyJdKHgpLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgZGV0ZWN0aW5nIHBhcnNlcnMiK3QuYmVuY2htYXJrKGYpKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpLGUucGFyc2Vycz1zLnBhcnNlcnMsZS5leHRyYWN0b3JzPXMuZXh0cmFjdG9yc30sYWRkUGFyc2VyOmZ1bmN0aW9uKGUpe3ZhciByLG89dC5wYXJzZXJzLmxlbmd0aCxzPSEwO2ZvcihyPTA7cjxvO3IrKyl0LnBhcnNlcnNbcl0uaWQudG9Mb3dlckNhc2UoKT09PWUuaWQudG9Mb3dlckNhc2UoKSYmKHM9ITEpO3MmJih0LnBhcnNlcnNbdC5wYXJzZXJzLmxlbmd0aF09ZSl9LGdldFBhcnNlckJ5SWQ6ZnVuY3Rpb24oZSl7aWYoImZhbHNlIj09ZSlyZXR1cm4hMTt2YXIgcixvPXQucGFyc2Vycy5sZW5ndGg7Zm9yKHI9MDtyPG87cisrKWlmKHQucGFyc2Vyc1tyXS5pZC50b0xvd2VyQ2FzZSgpPT09ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHQucGFyc2Vyc1tyXTtyZXR1cm4hMX0sZGV0ZWN0UGFyc2VyRm9yQ29sdW1uOmZ1bmN0aW9uKHIsbyxzLGEpe2Zvcih2YXIgbixpLGwsZD10LnBhcnNlcnMubGVuZ3RoLGM9ITEsZz0iIixwPXQuZGVidWcociwiY29yZSIpLHU9ITA7IiI9PT1nJiZ1OykobD1vWysrc10pJiZzPDUwP2wuY2xhc3NOYW1lLmluZGV4T2YodC5jc3NJZ25vcmVSb3cpPDAmJihjPW9bc10uY2VsbHNbYV0sZz10LmdldEVsZW1lbnRUZXh0KHIsYyxhKSxpPWUoYykscCYmY29uc29sZS5sb2coIkNoZWNraW5nIGlmIHZhbHVlIHdhcyBlbXB0eSBvbiByb3cgIitzKyIsIGNvbHVtbjogIithKyc6ICInK2crJyInKSk6dT0hMTtmb3IoOy0tZD49MDspaWYoKG49dC5wYXJzZXJzW2RdKSYmInRleHQiIT09bi5pZCYmbi5pcyYmbi5pcyhnLHIudGFibGUsYyxpKSlyZXR1cm4gbjtyZXR1cm4gdC5nZXRQYXJzZXJCeUlkKCJ0ZXh0Iil9LGdldEVsZW1lbnRUZXh0OmZ1bmN0aW9uKHIsbyxzKXtpZighbylyZXR1cm4iIjt2YXIgYSxuPXIudGV4dEV4dHJhY3Rpb258fCIiLGk9by5qcXVlcnk/bzplKG8pO3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8iYmFzaWMiPT09biYmdm9pZCAwIT09KGE9aS5hdHRyKHIudGV4dEF0dHJpYnV0ZSkpP2UudHJpbShhKTplLnRyaW0oby50ZXh0Q29udGVudHx8aS50ZXh0KCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP2UudHJpbShuKGlbMF0sci50YWJsZSxzKSk6ImZ1bmN0aW9uIj09dHlwZW9mKGE9dC5nZXRDb2x1bW5EYXRhKHIudGFibGUsbixzKSk/ZS50cmltKGEoaVswXSxyLnRhYmxlLHMpKTplLnRyaW0oaVswXS50ZXh0Q29udGVudHx8aS50ZXh0KCkpfSxnZXRQYXJzZWRUZXh0OmZ1bmN0aW9uKGUscixvLHMpe3ZvaWQgMD09PXMmJihzPXQuZ2V0RWxlbWVudFRleHQoZSxyLG8pKTt2YXIgYT0iIitzLG49ZS5wYXJzZXJzW29dLGk9ZS5leHRyYWN0b3JzW29dO3JldHVybiBuJiYoaSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuZm9ybWF0JiYocz1pLmZvcm1hdChzLGUudGFibGUscixvKSksYT0ibm8tcGFyc2VyIj09PW4uaWQ/IiI6bi5mb3JtYXQoIiIrcyxlLnRhYmxlLHIsbyksZS5pZ25vcmVDYXNlJiYic3RyaW5nIj09dHlwZW9mIGEmJihhPWEudG9Mb3dlckNhc2UoKSkpLGF9LGJ1aWxkQ2FjaGU6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYyxnLHAsdSxmLGgsbSxiLHksdyx4LHYsQywkLEksRCxSLFQ9ci50YWJsZSxMPXIucGFyc2VycyxBPXQuZGVidWcociwiY29yZSIpO2lmKHIuJHRib2RpZXM9ci4kdGFibGUuY2hpbGRyZW4oInRib2R5Om5vdCguIityLmNzc0luZm9CbG9jaysiKSIpLGc9dm9pZCAwPT09cz9yLiR0Ym9kaWVzOnMsci5jYWNoZT17fSxyLnRvdGFsUm93cz0wLCFMKXJldHVybiBBP2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgY2FjaGUiKToiIjtmb3IoQSYmKG09bmV3IERhdGUpLHIuc2hvd1Byb2Nlc3NpbmcmJnQuaXNQcm9jZXNzaW5nKFQsITApLGM9MDtjPGcubGVuZ3RoO2MrKyl7Zm9yKHg9W10sYT1yLmNhY2hlW2NdPXtub3JtYWxpemVkOltdfSxiPWdbY10mJmdbY10ucm93cy5sZW5ndGh8fDAsbD0wO2w8YjsrK2wpaWYoeT17Y2hpbGQ6W10scmF3OltdfSxwPWUoZ1tjXS5yb3dzW2xdKSx1PVtdLCFwLmhhc0NsYXNzKHIuc2VsZWN0b3JSZW1vdmUuc2xpY2UoMSkpKWlmKHAuaGFzQ2xhc3Moci5jc3NDaGlsZFJvdykmJjAhPT1sKWZvcihEPWEubm9ybWFsaXplZC5sZW5ndGgtMSwodz1hLm5vcm1hbGl6ZWRbRF1bci5jb2x1bW5zXSkuJHJvdz13LiRyb3cuYWRkKHApLHAucHJldigpLmhhc0NsYXNzKHIuY3NzQ2hpbGRSb3cpfHxwLnByZXYoKS5hZGRDbGFzcyh0LmNzcy5jc3NIYXNDaGlsZCksZj1wLmNoaWxkcmVuKCJ0aCwgdGQiKSxEPXcuY2hpbGQubGVuZ3RoLHcuY2hpbGRbRF09W10sQz0wLEk9ci5jb2x1bW5zLGQ9MDtkPEk7ZCsrKShoPWZbZF0pJiYody5jaGlsZFtEXVtkXT10LmdldFBhcnNlZFRleHQocixoLGQpLCh2PWZbZF0uY29sU3Bhbi0xKT4wJiYoQys9dixJKz12KSksQysrO2Vsc2V7Zm9yKHkuJHJvdz1wLHkub3JkZXI9bCxDPTAsST1yLmNvbHVtbnMsZD0wO2Q8STsrK2Qpe2lmKChoPXBbMF0uY2VsbHNbZF0pJiZDPHIuY29sdW1ucyYmKCEoJD12b2lkIDAhPT1MW0NdKSYmQSYmY29uc29sZS53YXJuKCJObyBwYXJzZXIgZm91bmQgZm9yIHJvdzogIitsKyIsIGNvbHVtbjogIitkKyc7IGNlbGwgY29udGFpbmluZzogIicrZShoKS50ZXh0KCkrJyI7IGRvZXMgaXQgaGF2ZSBhIGhlYWRlcj8nKSxuPXQuZ2V0RWxlbWVudFRleHQocixoLEMpLHkucmF3W0NdPW4saT10LmdldFBhcnNlZFRleHQocixoLEMsbiksdVtDXT1pLCQmJiJudW1lcmljIj09PShMW0NdLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpJiYoeFtDXT1NYXRoLm1heChNYXRoLmFicyhpKXx8MCx4W0NdfHwwKSksKHY9aC5jb2xTcGFuLTEpPjApKXtmb3IoUj0wO1I8PXY7KWk9ci5kdXBsaWNhdGVTcGFufHwwPT09Uj9uOiJzdHJpbmciIT10eXBlb2Ygci50ZXh0RXh0cmFjdGlvbj90LmdldEVsZW1lbnRUZXh0KHIsaCxDK1IpfHwiIjoiIix5LnJhd1tDK1JdPWksdVtDK1JdPWksUisrO0MrPXYsSSs9dn1DKyt9dVtyLmNvbHVtbnNdPXksYS5ub3JtYWxpemVkW2Eubm9ybWFsaXplZC5sZW5ndGhdPXV9YS5jb2xNYXg9eCxyLnRvdGFsUm93cys9YS5ub3JtYWxpemVkLmxlbmd0aH1pZihyLnNob3dQcm9jZXNzaW5nJiZ0LmlzUHJvY2Vzc2luZyhUKSxBKXtmb3IoRD1NYXRoLm1pbig1LHIuY2FjaGVbMF0ubm9ybWFsaXplZC5sZW5ndGgpLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiQnVpbGRpbmcgY2FjaGUgZm9yICIrci50b3RhbFJvd3MrIiByb3dzIChzaG93aW5nICIrRCsiIHJvd3MgaW4gbG9nKSBhbmQgIityLmNvbHVtbnMrIiBjb2x1bW5zIit0LmJlbmNobWFyayhtKSksbj17fSxkPTA7ZDxyLmNvbHVtbnM7ZCsrKWZvcihDPTA7QzxEO0MrKyluWyJyb3c6ICIrQ118fChuWyJyb3c6ICIrQ109e30pLG5bInJvdzogIitDXVtyLiRoZWFkZXJJbmRleGVkW2RdLnRleHQoKV09ci5jYWNoZVswXS5ub3JtYWxpemVkW0NdW2RdO2NvbnNvbGVbY29uc29sZS50YWJsZT8idGFibGUiOiJsb2ciXShuKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9ZS5pc0Z1bmN0aW9uKG8pJiZvKFQpfSxnZXRDb2x1bW5UZXh0OmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG09ImZ1bmN0aW9uIj09dHlwZW9mIHMsYj0iYWxsIj09PW8seT17cmF3OltdLHBhcnNlZDpbXSwkY2VsbDpbXX0sdz0ocj1lKHIpWzBdKS5jb25maWc7aWYoIXQuaXNFbXB0eU9iamVjdCh3KSl7Zm9yKGM9dy4kdGJvZGllcy5sZW5ndGgsbj0wO248YztuKyspZm9yKGc9KGw9dy5jYWNoZVtuXS5ub3JtYWxpemVkKS5sZW5ndGgsaT0wO2k8ZztpKyspZD1sW2ldLGEmJiFkW3cuY29sdW1uc10uJHJvdy5pcyhhKXx8KGg9ITAsdT1iP2Quc2xpY2UoMCx3LmNvbHVtbnMpOmRbb10sZD1kW3cuY29sdW1uc10scD1iP2QucmF3OmQucmF3W29dLGY9Yj9kLiRyb3cuY2hpbGRyZW4oKTpkLiRyb3cuY2hpbGRyZW4oKS5lcShvKSxtJiYoaD1zKHt0Ym9keUluZGV4Om4scm93SW5kZXg6aSxwYXJzZWQ6dSxyYXc6cCwkcm93OmQuJHJvdywkY2VsbDpmfSkpLCExIT09aCYmKHkucGFyc2VkW3kucGFyc2VkLmxlbmd0aF09dSx5LnJhd1t5LnJhdy5sZW5ndGhdPXAseS4kY2VsbFt5LiRjZWxsLmxlbmd0aF09ZikpO3JldHVybiB5fXQuZGVidWcodywiY29yZSIpJiZjb25zb2xlLndhcm4oIk5vIGNhY2hlIGZvdW5kIC0gYWJvcnRpbmcgZ2V0Q29sdW1uVGV4dCBmdW5jdGlvbiEiKX0sc2V0SGVhZGVyc0NzczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ci5zb3J0TGlzdCxuPWEubGVuZ3RoLGk9dC5jc3Muc29ydE5vbmUrIiAiK3IuY3NzTm9uZSxsPVt0LmNzcy5zb3J0QXNjKyIgIityLmNzc0FzYyx0LmNzcy5zb3J0RGVzYysiICIrci5jc3NEZXNjXSxkPVtyLmNzc0ljb25Bc2Msci5jc3NJY29uRGVzYyxyLmNzc0ljb25Ob25lXSxjPVsiYXNjZW5kaW5nIiwiZGVzY2VuZGluZyJdLGc9ZnVuY3Rpb24oZSxyKXtlLnJlbW92ZUNsYXNzKGkpLmFkZENsYXNzKGxbcl0pLmF0dHIoImFyaWEtc29ydCIsY1tyXSkuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZFsyXSkuYWRkQ2xhc3MoZFtyXSl9LHA9ci4kdGFibGUuZmluZCgidGZvb3QgdHIiKS5jaGlsZHJlbigidGQsIHRoIikuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKSx1PXIuJGhlYWRlcnMuYWRkKGUoInRoZWFkICIrci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKS5hZGRDbGFzcyhpKS5hdHRyKCJhcmlhLXNvcnQiLCJub25lIikuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZC5qb2luKCIgIikpLmVuZCgpO2Zvcih1Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKGRbMl0pLHIuY3NzSWNvbkRpc2FibGVkJiZ1LmZpbHRlcigiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKHIuY3NzSWNvbkRpc2FibGVkKSxvPTA7bzxuO28rKylpZigyIT09YVtvXVsxXSl7aWYodT1yLiRoZWFkZXJzLmZpbHRlcihmdW5jdGlvbihlKXtmb3IodmFyIG89ITAscz1yLiRoZWFkZXJzLmVxKGUpLGE9cGFyc2VJbnQocy5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxuPWErdC5nZXRDbG9zZXN0KHMsInRoLCB0ZCIpWzBdLmNvbFNwYW47YTxuO2ErKylvPSEhbyYmKG98fHQuaXNWYWx1ZUluQXJyYXkoYSxyLnNvcnRMaXN0KT4tMSk7cmV0dXJuIG99KSwodT11Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcignW2RhdGEtY29sdW1uPSInK2Fbb11bMF0rJyJdJysoMT09PW4/IjpsYXN0IjoiIikpKS5sZW5ndGgpZm9yKHM9MDtzPHUubGVuZ3RoO3MrKyl1W3NdLnNvcnREaXNhYmxlZHx8Zyh1LmVxKHMpLGFbb11bMV0pO3AubGVuZ3RoJiZnKHAuZmlsdGVyKCdbZGF0YS1jb2x1bW49IicrYVtvXVswXSsnIl0nKSxhW29dWzFdKX1mb3Iobj1yLiRoZWFkZXJzLmxlbmd0aCxvPTA7bzxuO28rKyl0LnNldENvbHVtbkFyaWFMYWJlbChyLHIuJGhlYWRlcnMuZXEobykpfSxnZXRDbG9zZXN0OmZ1bmN0aW9uKHQscil7cmV0dXJuIGUuZm4uY2xvc2VzdD90LmNsb3Nlc3Qocik6dC5pcyhyKT90OnQucGFyZW50cyhyKS5maWx0ZXIoIjpmaXJzdCIpfSxzZXRDb2x1bW5BcmlhTGFiZWw6ZnVuY3Rpb24ocixvLHMpe2lmKG8ubGVuZ3RoKXt2YXIgYT1wYXJzZUludChvLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG49ci5zb3J0VmFyc1thXSxpPW8uaGFzQ2xhc3ModC5jc3Muc29ydEFzYyk/InNvcnRBc2MiOm8uaGFzQ2xhc3ModC5jc3Muc29ydERlc2MpPyJzb3J0RGVzYyI6InNvcnROb25lIixsPWUudHJpbShvLnRleHQoKSkrIjogIit0Lmxhbmd1YWdlW2ldO28uaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHwhMT09PXM/bCs9dC5sYW5ndWFnZS5zb3J0RGlzYWJsZWQ6KGk9KG4uY291bnQrMSklbi5vcmRlci5sZW5ndGgscz1uLm9yZGVyW2ldLGwrPXQubGFuZ3VhZ2VbMD09PXM/Im5leHRBc2MiOjE9PT1zPyJuZXh0RGVzYyI6Im5leHROb25lIl0pLG8uYXR0cigiYXJpYS1sYWJlbCIsbCl9fSx1cGRhdGVIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9ZS4kaGVhZGVycy5sZW5ndGg7Zm9yKHI9MDtyPGk7cisrKXM9ZS4kaGVhZGVycy5lcShyKSxhPXQuZ2V0Q29sdW1uRGF0YShuLGUuaGVhZGVycyxyLCEwKSxvPSJmYWxzZSI9PT10LmdldERhdGEocyxhLCJzb3J0ZXIiKXx8ImZhbHNlIj09PXQuZ2V0RGF0YShzLGEsInBhcnNlciIpLHQuc2V0Q29sdW1uU29ydChlLHMsbyl9LHNldENvbHVtblNvcnQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBvPWUudGFibGUuaWQ7dFswXS5zb3J0RGlzYWJsZWQ9cix0W3I/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgic29ydGVyLWZhbHNlIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsIiIrciksZS50YWJJbmRleCYmKHI/dC5yZW1vdmVBdHRyKCJ0YWJpbmRleCIpOnQuYXR0cigidGFiaW5kZXgiLCIwIikpLG8mJihyP3QucmVtb3ZlQXR0cigiYXJpYS1jb250cm9scyIpOnQuYXR0cigiYXJpYS1jb250cm9scyIsbykpfSx1cGRhdGVIZWFkZXJTb3J0Q291bnQ6ZnVuY3Rpb24ocixvKXt2YXIgcyxhLG4saSxsLGQsYyxnLHA9b3x8ci5zb3J0TGlzdCx1PXAubGVuZ3RoO2ZvcihyLnNvcnRMaXN0PVtdLGk9MDtpPHU7aSsrKWlmKGM9cFtpXSwocz1wYXJzZUludChjWzBdLDEwKSk8ci5jb2x1bW5zKXtzd2l0Y2goci5zb3J0VmFyc1tzXS5vcmRlcnx8KGc9dC5nZXRPcmRlcihyLnNvcnRJbml0aWFsT3JkZXIpP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxyLnNvcnRWYXJzW3NdLm9yZGVyPWcsci5zb3J0VmFyc1tzXS5jb3VudD0wKSxnPXIuc29ydFZhcnNbc10ub3JkZXIsYT0oIiIrY1sxXSkubWF0Y2goL14oMXxkfHN8b3xuKS8pLGE9YT9hWzBdOiIiKXtjYXNlIjEiOmNhc2UiZCI6YT0xO2JyZWFrO2Nhc2UicyI6YT1sfHwwO2JyZWFrO2Nhc2UibyI6YT0wPT09KGQ9Z1sobHx8MCklZy5sZW5ndGhdKT8xOjE9PT1kPzA6MjticmVhaztjYXNlIm4iOmE9Z1srK3Iuc29ydFZhcnNbc10uY291bnQlZy5sZW5ndGhdO2JyZWFrO2RlZmF1bHQ6YT0wfWw9MD09PWk/YTpsLG49W3MscGFyc2VJbnQoYSwxMCl8fDBdLHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPW4sYT1lLmluQXJyYXkoblsxXSxnKSxyLnNvcnRWYXJzW3NdLmNvdW50PWE+PTA/YTpuWzFdJWcubGVuZ3RofX0sdXBkYXRlQWxsOmZ1bmN0aW9uKGUscixvKXt2YXIgcz1lLnRhYmxlO3MuaXNVcGRhdGluZz0hMCx0LnJlZnJlc2hXaWRnZXRzKHMsITAsITApLHQuYnVpbGRIZWFkZXJzKGUpLHQuYmluZEV2ZW50cyhzLGUuJGhlYWRlcnMsITApLHQuYmluZE1ldGhvZHMoZSksdC5jb21tb25VcGRhdGUoZSxyLG8pfSx1cGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UudGFibGUuaXNVcGRhdGluZz0hMCx0LnVwZGF0ZUhlYWRlcihlKSx0LmNvbW1vblVwZGF0ZShlLHIsbyl9LHVwZGF0ZUhlYWRlcnM6ZnVuY3Rpb24oZSxyKXtlLnRhYmxlLmlzVXBkYXRpbmc9ITAsdC5idWlsZEhlYWRlcnMoZSksdC5iaW5kRXZlbnRzKGUudGFibGUsZS4kaGVhZGVycywhMCksdC5yZXNvcnRDb21wbGV0ZShlLHIpfSx1cGRhdGVDZWxsOmZ1bmN0aW9uKHIsbyxzLGEpe2lmKGUobykuY2xvc2VzdCgidHIiKS5oYXNDbGFzcyhyLmNzc0NoaWxkUm93KSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ1cGRhdGVDZWxsIiBmb3IgY2hpbGQgcm93IGNvbnRlbnQgaGFzIGJlZW4gZGlzYWJsZWQsIHVzZSAidXBkYXRlIiBpbnN0ZWFkJyk7ZWxzZXtpZih0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkpcmV0dXJuIHQudXBkYXRlSGVhZGVyKHIpLHZvaWQgdC5jb21tb25VcGRhdGUocixzLGEpO3IudGFibGUuaXNVcGRhdGluZz0hMCxyLiR0YWJsZS5maW5kKHIuc2VsZWN0b3JSZW1vdmUpLnJlbW92ZSgpO3ZhciBuLGksbCxkLGMsZyxwPXIuJHRib2RpZXMsdT1lKG8pLGY9cC5pbmRleCh0LmdldENsb3Nlc3QodSwidGJvZHkiKSksaD1yLmNhY2hlW2ZdLG09dC5nZXRDbG9zZXN0KHUsInRyIik7aWYobz11WzBdLHAubGVuZ3RoJiZmPj0wKXtpZihsPXAuZXEoZikuZmluZCgidHIiKS5ub3QoIi4iK3IuY3NzQ2hpbGRSb3cpLmluZGV4KG0pLGM9aC5ub3JtYWxpemVkW2xdLChnPW1bMF0uY2VsbHMubGVuZ3RoKSE9PXIuY29sdW1ucylmb3IoZD0wLG49ITEsaT0wO2k8ZztpKyspbnx8bVswXS5jZWxsc1tpXT09PW8/bj0hMDpkKz1tWzBdLmNlbGxzW2ldLmNvbFNwYW47ZWxzZSBkPXUuaW5kZXgoKTtuPXQuZ2V0RWxlbWVudFRleHQocixvLGQpLGNbci5jb2x1bW5zXS5yYXdbZF09bixuPXQuZ2V0UGFyc2VkVGV4dChyLG8sZCxuKSxjW2RdPW4sIm51bWVyaWMiPT09KHIucGFyc2Vyc1tkXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKGguY29sTWF4W2RdPU1hdGgubWF4KE1hdGguYWJzKG4pfHwwLGguY29sTWF4W2RdfHwwKSksITEhPT0obj0idW5kZWZpbmVkIiE9PXM/czpyLnJlc29ydCk/dC5jaGVja1Jlc29ydChyLG4sYSk6dC5yZXNvcnRDb21wbGV0ZShyLGEpfWVsc2UgdC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUuZXJyb3IoInVwZGF0ZUNlbGwgYWJvcnRlZCwgdGJvZHkgbWlzc2luZyBvciBub3Qgd2l0aGluIHRoZSBpbmRpY2F0ZWQgdGFibGUiKSxyLnRhYmxlLmlzVXBkYXRpbmc9ITF9fSxhZGRSb3dzOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG0sYix5LHc9InN0cmluZyI9PXR5cGVvZiBvJiYxPT09ci4kdGJvZGllcy5sZW5ndGgmJi88dHIvLnRlc3Qob3x8IiIpLHg9ci50YWJsZTtpZih3KW89ZShvKSxyLiR0Ym9kaWVzLmFwcGVuZChvKTtlbHNlIGlmKCEobyYmbyBpbnN0YW5jZW9mIGUmJnQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpWzBdPT09ci50YWJsZSkpcmV0dXJuIHQuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmVycm9yKCJhZGRSb3dzIG1ldGhvZCByZXF1aXJlcyAoMSkgYSBqUXVlcnkgc2VsZWN0b3IgcmVmZXJlbmNlIHRvIHJvd3MgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgdGFibGUsIG9yICgyKSByb3cgSFRNTCBzdHJpbmcgdG8gYmUgYWRkZWQgdG8gYSB0YWJsZSB3aXRoIG9ubHkgb25lIHRib2R5IiksITE7aWYoeC5pc1VwZGF0aW5nPSEwLHQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSl0LnVwZGF0ZUhlYWRlcihyKSx0LmNvbW1vblVwZGF0ZShyLHMsYSk7ZWxzZXtmb3IoYz1vLmZpbHRlcigidHIiKS5hdHRyKCJyb2xlIiwicm93IikubGVuZ3RoLGw9ci4kdGJvZGllcy5pbmRleChvLnBhcmVudHMoInRib2R5IikuZmlsdGVyKCI6Zmlyc3QiKSksci5wYXJzZXJzJiZyLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhyKSxkPTA7ZDxjO2QrKyl7Zm9yKGY9MCxwPW9bZF0uY2VsbHMubGVuZ3RoLHU9ci5jYWNoZVtsXS5ub3JtYWxpemVkLmxlbmd0aCxtPVtdLGg9e2NoaWxkOltdLHJhdzpbXSwkcm93Om8uZXEoZCksb3JkZXI6dX0sZz0wO2c8cDtnKyspYj1vW2RdLmNlbGxzW2ddLG49dC5nZXRFbGVtZW50VGV4dChyLGIsZiksaC5yYXdbZl09bixpPXQuZ2V0UGFyc2VkVGV4dChyLGIsZixuKSxtW2ZdPWksIm51bWVyaWMiPT09KHIucGFyc2Vyc1tmXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKHIuY2FjaGVbbF0uY29sTWF4W2ZdPU1hdGgubWF4KE1hdGguYWJzKGkpfHwwLHIuY2FjaGVbbF0uY29sTWF4W2ZdfHwwKSksKHk9Yi5jb2xTcGFuLTEpPjAmJihmKz15KSxmKys7bVtyLmNvbHVtbnNdPWgsci5jYWNoZVtsXS5ub3JtYWxpemVkW3VdPW19dC5jaGVja1Jlc29ydChyLHMsYSl9fSx1cGRhdGVDYWNoZTpmdW5jdGlvbihlLHIsbyl7ZS5wYXJzZXJzJiZlLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhlLG8pLHQuYnVpbGRDYWNoZShlLHIsbyl9LGFwcGVuZENhY2hlOmZ1bmN0aW9uKGUscil7dmFyIG8scyxhLG4saSxsLGQsYz1lLnRhYmxlLGc9ZS4kdGJvZGllcyxwPVtdLHU9ZS5jYWNoZTtpZih0LmlzRW1wdHlPYmplY3QodSkpcmV0dXJuIGUuYXBwZW5kZXI/ZS5hcHBlbmRlcihjLHApOmMuaXNVcGRhdGluZz9lLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpOiIiO2Zvcih0LmRlYnVnKGUsImNvcmUiKSYmKGQ9bmV3IERhdGUpLGw9MDtsPGcubGVuZ3RoO2wrKylpZigoYT1nLmVxKGwpKS5sZW5ndGgpe2ZvcihuPXQucHJvY2Vzc1Rib2R5KGMsYSwhMCkscz0obz11W2xdLm5vcm1hbGl6ZWQpLmxlbmd0aCxpPTA7aTxzO2krKylwW3AubGVuZ3RoXT1vW2ldW2UuY29sdW1uc10uJHJvdyxlLmFwcGVuZGVyJiYoIWUucGFnZXJ8fGUucGFnZXIucmVtb3ZlUm93c3x8ZS5wYWdlci5hamF4KXx8bi5hcHBlbmQob1tpXVtlLmNvbHVtbnNdLiRyb3cpO3QucHJvY2Vzc1Rib2R5KGMsbiwhMSl9ZS5hcHBlbmRlciYmZS5hcHBlbmRlcihjLHApLHQuZGVidWcoZSwiY29yZSIpJiZjb25zb2xlLmxvZygiUmVidWlsdCB0YWJsZSIrdC5iZW5jaG1hcmsoZCkpLHJ8fGUuYXBwZW5kZXJ8fHQuYXBwbHlXaWRnZXQoYyksYy5pc1VwZGF0aW5nJiZlLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpfSxjb21tb25VcGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UuJHRhYmxlLmZpbmQoZS5zZWxlY3RvclJlbW92ZSkucmVtb3ZlKCksdC5zZXR1cFBhcnNlcnMoZSksdC5idWlsZENhY2hlKGUpLHQuY2hlY2tSZXNvcnQoZSxyLG8pfSxpbml0U29ydDpmdW5jdGlvbihyLG8scyl7aWYoci50YWJsZS5pc1VwZGF0aW5nKXJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0U29ydChyLG8scyl9LDUwKTt2YXIgYSxuLGksbCxkLGMsZyxwPSFzW3Iuc29ydE11bHRpU29ydEtleV0sdT1yLnRhYmxlLGY9ci4kaGVhZGVycy5sZW5ndGgsaD10LmdldENsb3Nlc3QoZShvKSwidGgsIHRkIiksbT1wYXJzZUludChoLmF0dHIoImRhdGEtY29sdW1uIiksMTApLGI9ci5zb3J0VmFyc1ttXS5vcmRlcjtpZihoPWhbMF0sci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsdSksYz0oci5zb3J0VmFyc1ttXS5jb3VudCsxKSViLmxlbmd0aCxyLnNvcnRWYXJzW21dLmNvdW50PXNbci5zb3J0UmVzZXRLZXldPzI6YyxyLnNvcnRSZXN0YXJ0KWZvcihpPTA7aTxmO2krKylnPXIuJGhlYWRlcnMuZXEoaSksbSE9PShjPXBhcnNlSW50KGcuYXR0cigiZGF0YS1jb2x1bW4iKSwxMCkpJiYocHx8Zy5oYXNDbGFzcyh0LmNzcy5zb3J0Tm9uZSkpJiYoci5zb3J0VmFyc1tjXS5jb3VudD0tMSk7aWYocCl7aWYoci5zb3J0TGlzdD1bXSxyLmxhc3Quc29ydExpc3Q9W10sbnVsbCE9PXIuc29ydEZvcmNlKWZvcihhPXIuc29ydEZvcmNlLG49MDtuPGEubGVuZ3RoO24rKylhW25dWzBdIT09bSYmKHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPWFbbl0pO2lmKChsPWJbci5zb3J0VmFyc1ttXS5jb3VudF0pPDImJihyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1bbSxsXSxoLmNvbFNwYW4+MSkpZm9yKG49MTtuPGguY29sU3BhbjtuKyspci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20rbixsXSxyLnNvcnRWYXJzW20rbl0uY291bnQ9ZS5pbkFycmF5KGwsYil9ZWxzZSBpZihyLnNvcnRMaXN0PWUuZXh0ZW5kKFtdLHIubGFzdC5zb3J0TGlzdCksdC5pc1ZhbHVlSW5BcnJheShtLHIuc29ydExpc3QpPj0wKWZvcihuPTA7bjxyLnNvcnRMaXN0Lmxlbmd0aDtuKyspKGM9ci5zb3J0TGlzdFtuXSlbMF09PT1tJiYoY1sxXT1iW3Iuc29ydFZhcnNbbV0uY291bnRdLDI9PT1jWzFdJiYoci5zb3J0TGlzdC5zcGxpY2UobiwxKSxyLnNvcnRWYXJzW21dLmNvdW50PS0xKSk7ZWxzZSBpZigobD1iW3Iuc29ydFZhcnNbbV0uY291bnRdKTwyJiYoci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20sbF0saC5jb2xTcGFuPjEpKWZvcihuPTE7bjxoLmNvbFNwYW47bisrKXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttK24sbF0sci5zb3J0VmFyc1ttK25dLmNvdW50PWUuaW5BcnJheShsLGIpO2lmKHIubGFzdC5zb3J0TGlzdD1lLmV4dGVuZChbXSxyLnNvcnRMaXN0KSxyLnNvcnRMaXN0Lmxlbmd0aCYmci5zb3J0QXBwZW5kJiYoYT1lLmlzQXJyYXkoci5zb3J0QXBwZW5kKT9yLnNvcnRBcHBlbmQ6ci5zb3J0QXBwZW5kW3Iuc29ydExpc3RbMF1bMF1dLCF0LmlzRW1wdHlPYmplY3QoYSkpKWZvcihuPTA7bjxhLmxlbmd0aDtuKyspaWYoYVtuXVswXSE9PW0mJnQuaXNWYWx1ZUluQXJyYXkoYVtuXVswXSxyLnNvcnRMaXN0KTwwKXtpZihsPWFbbl1bMV0sZD0oIiIrbCkubWF0Y2goL14oYXxkfHN8b3xuKS8pKXN3aXRjaChjPXIuc29ydExpc3RbMF1bMV0sZFswXSl7Y2FzZSJkIjpsPTE7YnJlYWs7Y2FzZSJzIjpsPWM7YnJlYWs7Y2FzZSJvIjpsPTA9PT1jPzE6MDticmVhaztjYXNlIm4iOmw9KGMrMSklYi5sZW5ndGg7YnJlYWs7ZGVmYXVsdDpsPTB9ci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W2Fbbl1bMF0sbF19ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRCZWdpbiIsdSksc2V0VGltZW91dChmdW5jdGlvbigpe3Quc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVmb3JlRW5kIix1KSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEVuZCIsdSl9LDEpfSxtdWx0aXNvcnQ6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9W10sbD0wLGQ9ZS50ZXh0U29ydGVyfHwiIixjPWUuc29ydExpc3QsZz1jLmxlbmd0aCxwPWUuJHRib2RpZXMubGVuZ3RoO2lmKCFlLnNlcnZlclNpZGVTb3J0aW5nJiYhdC5pc0VtcHR5T2JqZWN0KGUuY2FjaGUpKXtpZih0LmRlYnVnKGUsImNvcmUiKSYmKG89bmV3IERhdGUpLCJvYmplY3QiPT10eXBlb2YgZClmb3Iocz1lLmNvbHVtbnM7cy0tOykiZnVuY3Rpb24iPT10eXBlb2YoYT10LmdldENvbHVtbkRhdGEobixkLHMpKSYmKGlbc109YSk7Zm9yKHI9MDtyPHA7cisrKXM9ZS5jYWNoZVtyXS5jb2xNYXgsZS5jYWNoZVtyXS5ub3JtYWxpemVkLnNvcnQoZnVuY3Rpb24ocixvKXt2YXIgYSxwLHUsZixoLG0sYjtmb3IoYT0wO2E8ZzthKyspe2lmKHU9Y1thXVswXSxmPWNbYV1bMV0sbD0wPT09ZixlLnNvcnRTdGFibGUmJnJbdV09PT1vW3VdJiYxPT09ZylyZXR1cm4gcltlLmNvbHVtbnNdLm9yZGVyLW9bZS5jb2x1bW5zXS5vcmRlcjtpZihwPS9uL2kudGVzdCh0LmdldFNvcnRUeXBlKGUucGFyc2Vycyx1KSkscCYmZS5zdHJpbmdzW3VdPyhwPSJib29sZWFuIj09dHlwZW9mIHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/KGw/MTotMSkqKHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/LTE6MSk6ZS5zdHJpbmdzW3VdP3Quc3RyaW5nW2Uuc3RyaW5nc1t1XV18fDA6MCxoPWUubnVtYmVyU29ydGVyP2UubnVtYmVyU29ydGVyKHJbdV0sb1t1XSxsLHNbdV0sbik6dFsic29ydE51bWVyaWMiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSxwLHNbdV0sdSxlKSk6KG09bD9yOm8sYj1sP286cixoPSJmdW5jdGlvbiI9PXR5cGVvZiBkP2QobVt1XSxiW3VdLGwsdSxuKToiZnVuY3Rpb24iPT10eXBlb2YgaVt1XT9pW3VdKG1bdV0sYlt1XSxsLHUsbik6dFsic29ydE5hdHVyYWwiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSx1LGUpKSxoKXJldHVybiBofXJldHVybiByW2UuY29sdW1uc10ub3JkZXItb1tlLmNvbHVtbnNdLm9yZGVyfSk7dC5kZWJ1ZyhlLCJjb3JlIikmJmNvbnNvbGUubG9nKCJBcHBseWluZyBzb3J0ICIrYy50b1N0cmluZygpK3QuYmVuY2htYXJrKG8pKX19LHJlc29ydENvbXBsZXRlOmZ1bmN0aW9uKHQscil7dC50YWJsZS5pc1VwZGF0aW5nJiZ0LiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLHQudGFibGUpLGUuaXNGdW5jdGlvbihyKSYmcih0LnRhYmxlKX0sY2hlY2tSZXNvcnQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhPWUuaXNBcnJheShvKT9vOnIuc29ydExpc3Q7ITE9PT0odm9pZCAwPT09bz9yLnJlc29ydDpvKXx8ci5zZXJ2ZXJTaWRlU29ydGluZ3x8ci50YWJsZS5pc1Byb2Nlc3Npbmc/KHQucmVzb3J0Q29tcGxldGUocixzKSx0LmFwcGx5V2lkZ2V0KHIudGFibGUsITEpKTphLmxlbmd0aD90LnNvcnRPbihyLGEsZnVuY3Rpb24oKXt0LnJlc29ydENvbXBsZXRlKHIscyl9LCEwKTp0LnNvcnRSZXNldChyLGZ1bmN0aW9uKCl7dC5yZXNvcnRDb21wbGV0ZShyLHMpLHQuYXBwbHlXaWRnZXQoci50YWJsZSwhMSl9KX0sc29ydE9uOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuPXIudGFibGU7ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsbiksdC51cGRhdGVIZWFkZXJTb3J0Q291bnQocixvKSx0LnNldEhlYWRlcnNDc3Mociksci5kZWxheUluaXQmJnQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSYmdC5idWlsZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVnaW4iLG4pLHQubXVsdGlzb3J0KHIpLHQuYXBwZW5kQ2FjaGUocixhKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZm9yZUVuZCIsbiksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRFbmQiLG4pLHQuYXBwbHlXaWRnZXQobiksZS5pc0Z1bmN0aW9uKHMpJiZzKG4pfSxzb3J0UmVzZXQ6ZnVuY3Rpb24ocixvKXtyLnNvcnRMaXN0PVtdLHQuc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpO3ZhciBzO2ZvcihzPTA7czxyLmNvbHVtbnM7cysrKXIuc29ydFZhcnNbc10uY291bnQ9LTE7ZS5pc0Z1bmN0aW9uKG8pJiZvKHIudGFibGUpfSxnZXRTb3J0VHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiBlJiZlW3RdP2VbdF0udHlwZXx8IiI6IiJ9LGdldE9yZGVyOmZ1bmN0aW9uKGUpe3JldHVybi9eZC9pLnRlc3QoZSl8fDE9PT1lfSxzb3J0TmF0dXJhbDpmdW5jdGlvbihlLHIpe2lmKGU9PT1yKXJldHVybiAwO2U9ZS50b1N0cmluZygpLHI9ci50b1N0cmluZygpO3ZhciBvLHMsYSxuLGksbCxkPXQucmVnZXg7aWYoZC5oZXgudGVzdChyKSl7aWYobz1wYXJzZUludCgoZXx8IiIpLm1hdGNoKGQuaGV4KSwxNikscz1wYXJzZUludCgocnx8IiIpLm1hdGNoKGQuaGV4KSwxNiksbzxzKXJldHVybi0xO2lmKG8+cylyZXR1cm4gMX1mb3Iobz0oZXx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIikscz0ocnx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIiksbD1NYXRoLm1heChvLmxlbmd0aCxzLmxlbmd0aCksaT0wO2k8bDtpKyspe2lmKGE9aXNOYU4ob1tpXSk/b1tpXXx8MDpwYXJzZUZsb2F0KG9baV0pfHwwLG49aXNOYU4oc1tpXSk/c1tpXXx8MDpwYXJzZUZsb2F0KHNbaV0pfHwwLGlzTmFOKGEpIT09aXNOYU4obikpcmV0dXJuIGlzTmFOKGEpPzE6LTE7aWYodHlwZW9mIGEhPXR5cGVvZiBuJiYoYSs9IiIsbis9IiIpLGE8bilyZXR1cm4tMTtpZihhPm4pcmV0dXJuIDF9cmV0dXJuIDB9LHNvcnROYXR1cmFsQXNjOmZ1bmN0aW9uKGUscixvLHMpe2lmKGU9PT1yKXJldHVybiAwO3ZhciBhPXQuc3RyaW5nW3MuZW1wdGllc1tvXXx8cy5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8tMToxOi1hfHwtMToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOmF8fDE6dC5zb3J0TmF0dXJhbChlLHIpfSxzb3J0TmF0dXJhbERlc2M6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGE9dC5zdHJpbmdbcy5lbXB0aWVzW29dfHxzLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWE/ImJvb2xlYW4iPT10eXBlb2YgYT9hPy0xOjE6YXx8MToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOi1hfHwtMTp0LnNvcnROYXR1cmFsKHIsZSl9LHNvcnRUZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+dD8xOmU8dD8tMTowfSxnZXRUZXh0VmFsdWU6ZnVuY3Rpb24oZSx0LHIpe2lmKHIpe3ZhciBvLHM9ZT9lLmxlbmd0aDowLGE9cit0O2ZvcihvPTA7bzxzO28rKylhKz1lLmNoYXJDb2RlQXQobyk7cmV0dXJuIHQqYX1yZXR1cm4gMH0sc29ydE51bWVyaWNBc2M6ZnVuY3Rpb24oZSxyLG8scyxhLG4pe2lmKGU9PT1yKXJldHVybiAwO3ZhciBpPXQuc3RyaW5nW24uZW1wdGllc1thXXx8bi5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8tMToxOi1pfHwtMToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOml8fDE6KGlzTmFOKGUpJiYoZT10LmdldFRleHRWYWx1ZShlLG8scykpLGlzTmFOKHIpJiYocj10LmdldFRleHRWYWx1ZShyLG8scykpLGUtcil9LHNvcnROdW1lcmljRGVzYzpmdW5jdGlvbihlLHIsbyxzLGEsbil7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGk9dC5zdHJpbmdbbi5lbXB0aWVzW2FdfHxuLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWk/ImJvb2xlYW4iPT10eXBlb2YgaT9pPy0xOjE6aXx8MToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOi1pfHwtMTooaXNOYU4oZSkmJihlPXQuZ2V0VGV4dFZhbHVlKGUsbyxzKSksaXNOYU4ocikmJihyPXQuZ2V0VGV4dFZhbHVlKHIsbyxzKSksci1lKX0sc29ydE51bWVyaWM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSxhZGRXaWRnZXQ6ZnVuY3Rpb24oZSl7ZS5pZCYmIXQuaXNFbXB0eU9iamVjdCh0LmdldFdpZGdldEJ5SWQoZS5pZCkpJiZjb25zb2xlLndhcm4oJyInK2UuaWQrJyIgd2lkZ2V0IHdhcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UhJyksdC53aWRnZXRzW3Qud2lkZ2V0cy5sZW5ndGhdPWV9LGhhc1dpZGdldDpmdW5jdGlvbih0LHIpe3JldHVybih0PWUodCkpLmxlbmd0aCYmdFswXS5jb25maWcmJnRbMF0uY29uZmlnLndpZGdldEluaXRbcl18fCExfSxnZXRXaWRnZXRCeUlkOmZ1bmN0aW9uKGUpe3ZhciByLG8scz10LndpZGdldHMubGVuZ3RoO2ZvcihyPTA7cjxzO3IrKylpZigobz10LndpZGdldHNbcl0pJiZvLmlkJiZvLmlkLnRvTG93ZXJDYXNlKCk9PT1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIG99LGFwcGx5V2lkZ2V0T3B0aW9uczpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbj1yLmNvbmZpZyxpPW4ud2lkZ2V0cy5sZW5ndGg7aWYoaSlmb3Iobz0wO288aTtvKyspKHM9dC5nZXRXaWRnZXRCeUlkKG4ud2lkZ2V0c1tvXSkpJiZzLm9wdGlvbnMmJihhPWUuZXh0ZW5kKCEwLHt9LHMub3B0aW9ucyksbi53aWRnZXRPcHRpb25zPWUuZXh0ZW5kKCEwLGEsbi53aWRnZXRPcHRpb25zKSxlLmV4dGVuZCghMCx0LmRlZmF1bHRzLndpZGdldE9wdGlvbnMscy5vcHRpb25zKSl9LGFkZFdpZGdldEZyb21DbGFzczpmdW5jdGlvbihlKXt2YXIgcixvLHM9ZS5jb25maWcsYT0iXiIrcy53aWRnZXRDbGFzcy5yZXBsYWNlKHQucmVnZXgudGVtcGxhdGVOYW1lLCIoXFxTKykrIikrIiQiLG49bmV3IFJlZ0V4cChhLCJnIiksaT0oZS5jbGFzc05hbWV8fCIiKS5zcGxpdCh0LnJlZ2V4LnNwYWNlcyk7aWYoaS5sZW5ndGgpZm9yKHI9aS5sZW5ndGgsbz0wO288cjtvKyspaVtvXS5tYXRjaChuKSYmKHMud2lkZ2V0c1tzLndpZGdldHMubGVuZ3RoXT1pW29dLnJlcGxhY2UobiwiJDEiKSl9LGFwcGx5V2lkZ2V0SWQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsPShyPWUocilbMF0pLmNvbmZpZyxkPWwud2lkZ2V0T3B0aW9ucyxjPXQuZGVidWcobCwiY29yZSIpLGc9dC5nZXRXaWRnZXRCeUlkKG8pO2cmJihpPWcuaWQsYT0hMSxlLmluQXJyYXkoaSxsLndpZGdldHMpPDAmJihsLndpZGdldHNbbC53aWRnZXRzLmxlbmd0aF09aSksYyYmKG49bmV3IERhdGUpLCFzJiZsLndpZGdldEluaXRbaV18fChsLndpZGdldEluaXRbaV09ITAsci5oYXNJbml0aWFsaXplZCYmdC5hcHBseVdpZGdldE9wdGlvbnMociksImZ1bmN0aW9uIj09dHlwZW9mIGcuaW5pdCYmKGE9ITAsYyYmY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJJbml0aWFsaXppbmcgIitpKyIgd2lkZ2V0IiksZy5pbml0KHIsZyxsLGQpKSksc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGcuZm9ybWF0fHwoYT0hMCxjJiZjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIlVwZGF0aW5nICIraSsiIHdpZGdldCIpLGcuZm9ybWF0KHIsbCxkLCExKSksYyYmYSYmKGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisocz8iaW5pdGlhbGl6aW5nICI6ImFwcGx5aW5nICIpK2krIiB3aWRnZXQiK3QuYmVuY2htYXJrKG4pKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpKX0sYXBwbHlXaWRnZXQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYz0ocj1lKHIpWzBdKS5jb25maWcsZz10LmRlYnVnKGMsImNvcmUiKSxwPVtdO2lmKCExPT09b3x8IXIuaGFzSW5pdGlhbGl6ZWR8fCFyLmlzQXBwbHlpbmdXaWRnZXRzJiYhci5pc1VwZGF0aW5nKXtpZihnJiYoZD1uZXcgRGF0ZSksdC5hZGRXaWRnZXRGcm9tQ2xhc3MociksY2xlYXJUaW1lb3V0KGMudGltZXJSZWFkeSksYy53aWRnZXRzLmxlbmd0aCl7Zm9yKHIuaXNBcHBseWluZ1dpZGdldHM9ITAsYy53aWRnZXRzPWUuZ3JlcChjLndpZGdldHMsZnVuY3Rpb24odCxyKXtyZXR1cm4gZS5pbkFycmF5KHQsYy53aWRnZXRzKT09PXJ9KSxuPShpPWMud2lkZ2V0c3x8W10pLmxlbmd0aCxhPTA7YTxuO2ErKykobD10LmdldFdpZGdldEJ5SWQoaVthXSkpJiZsLmlkPyhsLnByaW9yaXR5fHwobC5wcmlvcml0eT0xMCkscFthXT1sKTpnJiZjb25zb2xlLndhcm4oJyInK2lbYV0rJyIgd2FzIGVuYWJsZWQsIGJ1dCB0aGUgd2lkZ2V0IGNvZGUgaGFzIG5vdCBiZWVuIGxvYWRlZCEnKTtmb3IocC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucHJpb3JpdHk8dC5wcmlvcml0eT8tMTplLnByaW9yaXR5PT09dC5wcmlvcml0eT8wOjF9KSxuPXAubGVuZ3RoLGcmJmNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiU3RhcnQgIisobz8iaW5pdGlhbGl6aW5nIjoiYXBwbHlpbmciKSsiIHdpZGdldHMiKSxhPTA7YTxuO2ErKykobD1wW2FdKSYmbC5pZCYmdC5hcHBseVdpZGdldElkKHIsbC5pZCxvKTtnJiZjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9Yy50aW1lclJlYWR5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmlzQXBwbHlpbmdXaWRnZXRzPSExLGUuZGF0YShyLCJsYXN0V2lkZ2V0QXBwbGljYXRpb24iLG5ldyBEYXRlKSxjLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidGFibGVzb3J0ZXItcmVhZHkiKSxvfHwiZnVuY3Rpb24iIT10eXBlb2Ygc3x8cyhyKSxnJiYobD1jLndpZGdldHMubGVuZ3RoLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisoITA9PT1vPyJpbml0aWFsaXppbmcgIjoiYXBwbHlpbmcgIikrbCsiIHdpZGdldCIrKDEhPT1sPyJzIjoiIikrdC5iZW5jaG1hcmsoZCkpKX0sMTApfX0scmVtb3ZlV2lkZ2V0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkPShyPWUocilbMF0pLmNvbmZpZztpZighMD09PW8pZm9yKG89W10sbD10LndpZGdldHMubGVuZ3RoLGk9MDtpPGw7aSsrKShuPXQud2lkZ2V0c1tpXSkmJm4uaWQmJihvW28ubGVuZ3RoXT1uLmlkKTtlbHNlIG89KGUuaXNBcnJheShvKT9vLmpvaW4oIiwiKTpvfHwiIikudG9Mb3dlckNhc2UoKS5zcGxpdCgvW1xzLF0rLyk7Zm9yKGw9by5sZW5ndGgsYT0wO2E8bDthKyspbj10LmdldFdpZGdldEJ5SWQob1thXSksKGk9ZS5pbkFycmF5KG9bYV0sZC53aWRnZXRzKSk+PTAmJiEwIT09cyYmZC53aWRnZXRzLnNwbGljZShpLDEpLG4mJm4ucmVtb3ZlJiYodC5kZWJ1ZyhkLCJjb3JlIikmJmNvbnNvbGUubG9nKChzPyJSZWZyZXNoaW5nIjoiUmVtb3ZpbmciKSsnICInK29bYV0rJyIgd2lkZ2V0Jyksbi5yZW1vdmUocixkLGQud2lkZ2V0T3B0aW9ucyxzKSxkLndpZGdldEluaXRbb1thXV09ITEpO2QuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJ3aWRnZXRSZW1vdmVFbmQiLHIpfSxyZWZyZXNoV2lkZ2V0czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbixpPShyPWUocilbMF0pLmNvbmZpZy53aWRnZXRzLGw9dC53aWRnZXRzLGQ9bC5sZW5ndGgsYz1bXSxnPWZ1bmN0aW9uKHQpe2UodCkudHJpZ2dlckhhbmRsZXIoInJlZnJlc2hDb21wbGV0ZSIpfTtmb3IoYT0wO2E8ZDthKyspKG49bFthXSkmJm4uaWQmJihvfHxlLmluQXJyYXkobi5pZCxpKTwwKSYmKGNbYy5sZW5ndGhdPW4uaWQpO3QucmVtb3ZlV2lkZ2V0KHIsYy5qb2luKCIsIiksITApLCEwIT09cz8odC5hcHBseVdpZGdldChyLG98fCExLGcpLG8mJnQuYXBwbHlXaWRnZXQociwhMSxnKSk6ZyhyKX0sYmVuY2htYXJrOmZ1bmN0aW9uKGUpe3JldHVybiIgKCIrKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWUuZ2V0VGltZSgpKSsiIG1zKSJ9LGxvZzpmdW5jdGlvbigpe2NvbnNvbGUubG9nKGFyZ3VtZW50cyl9LGRlYnVnOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJighMD09PWUuZGVidWd8fCJzdHJpbmciPT10eXBlb2YgZS5kZWJ1ZyYmZS5kZWJ1Zy5pbmRleE9mKHQpPi0xKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0saXNWYWx1ZUluQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgcixvPXQmJnQubGVuZ3RofHwwO2ZvcihyPTA7cjxvO3IrKylpZih0W3JdWzBdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX0sZm9ybWF0RmxvYXQ6ZnVuY3Rpb24ocixvKXtpZigic3RyaW5nIiE9dHlwZW9mIHJ8fCIiPT09cilyZXR1cm4gcjt2YXIgcztyZXR1cm4gcj0obyYmby5jb25maWc/ITEhPT1vLmNvbmZpZy51c051bWJlckZvcm1hdDp2b2lkIDA9PT1vfHxvKT9yLnJlcGxhY2UodC5yZWdleC5jb21tYSwiIik6ci5yZXBsYWNlKHQucmVnZXguZGlnaXROb25VUywiIikucmVwbGFjZSh0LnJlZ2V4LmNvbW1hLCIuIiksdC5yZWdleC5kaWdpdE5lZ2F0aXZlVGVzdC50ZXN0KHIpJiYocj1yLnJlcGxhY2UodC5yZWdleC5kaWdpdE5lZ2F0aXZlUmVwbGFjZSwiLSQxIikpLHM9cGFyc2VGbG9hdChyKSxpc05hTihzKT9lLnRyaW0ocik6c30saXNEaWdpdDpmdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZSk/dC5yZWdleC5kaWdpdFRlc3QudGVzdChlLnRvU3RyaW5nKCkucmVwbGFjZSh0LnJlZ2V4LmRpZ2l0UmVwbGFjZSwiIikpOiIiIT09ZX0sY29tcHV0ZUNvbHVtbkluZGV4OmZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZyxwLHUsZj1vJiZvLmNvbHVtbnN8fDAsaD1bXSxtPW5ldyBBcnJheShmKTtmb3Iocz0wO3M8ci5sZW5ndGg7cysrKWZvcihkPXJbc10uY2VsbHMsYT0wO2E8ZC5sZW5ndGg7YSsrKXtmb3IoYz1zLGc9KGw9ZFthXSkucm93U3Bhbnx8MSxwPWwuY29sU3Bhbnx8MSx2b2lkIDA9PT1oW2NdJiYoaFtjXT1bXSksbj0wO248aFtjXS5sZW5ndGgrMTtuKyspaWYodm9pZCAwPT09aFtjXVtuXSl7dT1uO2JyZWFrfWZvcihmJiZsLmNlbGxJbmRleD09PXV8fChsLnNldEF0dHJpYnV0ZT9sLnNldEF0dHJpYnV0ZSgiZGF0YS1jb2x1bW4iLHUpOmUobCkuYXR0cigiZGF0YS1jb2x1bW4iLHUpKSxuPWM7bjxjK2c7bisrKWZvcih2b2lkIDA9PT1oW25dJiYoaFtuXT1bXSksbT1oW25dLGk9dTtpPHUrcDtpKyspbVtpXT0ieCJ9cmV0dXJuIHQuY2hlY2tDb2x1bW5Db3VudChyLGgsbS5sZW5ndGgpLG0ubGVuZ3RofSxjaGVja0NvbHVtbkNvdW50OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbyxzLGE9ITAsbj1bXTtmb3Iobz0wO288dC5sZW5ndGg7bysrKWlmKHRbb10mJihzPXRbb10ubGVuZ3RoLHRbb10ubGVuZ3RoIT09cikpe2E9ITE7YnJlYWt9YXx8KGUuZWFjaChmdW5jdGlvbihlLHQpe3ZhciByPXQucGFyZW50RWxlbWVudC5ub2RlTmFtZTtuLmluZGV4T2Yocik8MCYmbi5wdXNoKHIpfSksY29uc29sZS5lcnJvcigiSW52YWxpZCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlICIrbi5qb2luKCIgb3IgIikrIjsgZXhwZWN0ZWQgIityKyIsIGJ1dCBmb3VuZCAiK3MrIiBjb2x1bW5zIikpfSxmaXhDb2x1bW5XaWR0aDpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbixpLGw9KHI9ZShyKVswXSkuY29uZmlnLGQ9bC4kdGFibGUuY2hpbGRyZW4oImNvbGdyb3VwIik7aWYoZC5sZW5ndGgmJmQuaGFzQ2xhc3ModC5jc3MuY29sZ3JvdXApJiZkLnJlbW92ZSgpLGwud2lkdGhGaXhlZCYmMD09PWwuJHRhYmxlLmNoaWxkcmVuKCJjb2xncm91cCIpLmxlbmd0aCl7Zm9yKGQ9ZSgnPGNvbGdyb3VwIGNsYXNzPSInK3QuY3NzLmNvbGdyb3VwKyciPicpLG89bC4kdGFibGUud2lkdGgoKSxuPShhPWwuJHRib2RpZXMuZmluZCgidHI6Zmlyc3QiKS5jaGlsZHJlbigiOnZpc2libGUiKSkubGVuZ3RoLGk9MDtpPG47aSsrKXM9cGFyc2VJbnQoYS5lcShpKS53aWR0aCgpL28qMWUzLDEwKS8xMCsiJSIsZC5hcHBlbmQoZSgiPGNvbD4iKS5jc3MoIndpZHRoIixzKSk7bC4kdGFibGUucHJlcGVuZChkKX19LGdldERhdGE6ZnVuY3Rpb24odCxyLG8pe3ZhciBzLGEsbj0iIixpPWUodCk7cmV0dXJuIGkubGVuZ3RoPyhzPSEhZS5tZXRhZGF0YSYmaS5tZXRhZGF0YSgpLGE9IiAiKyhpLmF0dHIoImNsYXNzIil8fCIiKSx2b2lkIDAhPT1pLmRhdGEobyl8fHZvaWQgMCE9PWkuZGF0YShvLnRvTG93ZXJDYXNlKCkpP24rPWkuZGF0YShvKXx8aS5kYXRhKG8udG9Mb3dlckNhc2UoKSk6cyYmdm9pZCAwIT09c1tvXT9uKz1zW29dOnImJnZvaWQgMCE9PXJbb10/bis9cltvXToiICIhPT1hJiZhLm1hdGNoKCIgIitvKyItIikmJihuPWEubWF0Y2gobmV3IFJlZ0V4cCgiXFxzIitvKyItKFtcXHctXSspIikpWzFdfHwiIiksZS50cmltKG4pKToiIn0sZ2V0Q29sdW1uRGF0YTpmdW5jdGlvbih0LHIsbyxzLGEpe2lmKCJvYmplY3QiIT10eXBlb2Ygcnx8bnVsbD09PXIpcmV0dXJuIHI7dmFyIG4saT0odD1lKHQpWzBdKS5jb25maWcsbD1hfHxpLiRoZWFkZXJzLGQ9aS4kaGVhZGVySW5kZXhlZCYmaS4kaGVhZGVySW5kZXhlZFtvXXx8bC5maW5kKCdbZGF0YS1jb2x1bW49IicrbysnIl06bGFzdCcpO2lmKHZvaWQgMCE9PXJbb10pcmV0dXJuIHM/cltvXTpyW2wuaW5kZXgoZCldO2ZvcihuIGluIHIpaWYoInN0cmluZyI9PXR5cGVvZiBuJiZkLmZpbHRlcihuKS5hZGQoZC5maW5kKG4pKS5sZW5ndGgpcmV0dXJuIHJbbl19LGlzUHJvY2Vzc2luZzpmdW5jdGlvbihyLG8scyl7dmFyIGE9KHI9ZShyKSlbMF0uY29uZmlnLG49c3x8ci5maW5kKCIuIit0LmNzcy5oZWFkZXIpO28/KHZvaWQgMCE9PXMmJmEuc29ydExpc3QubGVuZ3RoPjAmJihuPW4uZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuc29ydERpc2FibGVkJiZ0LmlzVmFsdWVJbkFycmF5KHBhcnNlRmxvYXQoZSh0aGlzKS5hdHRyKCJkYXRhLWNvbHVtbiIpKSxhLnNvcnRMaXN0KT49MH0pKSxyLmFkZChuKS5hZGRDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpKTpyLmFkZChuKS5yZW1vdmVDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpfSxwcm9jZXNzVGJvZHk6ZnVuY3Rpb24odCxyLG8pe2lmKHQ9ZSh0KVswXSxvKXJldHVybiB0LmlzUHJvY2Vzc2luZz0hMCxyLmJlZm9yZSgnPGNvbGdyb3VwIGNsYXNzPSJ0YWJsZXNvcnRlci1zYXZlbXlwbGFjZSIvPicpLGUuZm4uZGV0YWNoP3IuZGV0YWNoKCk6ci5yZW1vdmUoKTt2YXIgcz1lKHQpLmZpbmQoImNvbGdyb3VwLnRhYmxlc29ydGVyLXNhdmVteXBsYWNlIik7ci5pbnNlcnRBZnRlcihzKSxzLnJlbW92ZSgpLHQuaXNQcm9jZXNzaW5nPSExfSxjbGVhclRhYmxlQm9keTpmdW5jdGlvbih0KXtlKHQpWzBdLmNvbmZpZy4kdGJvZGllcy5jaGlsZHJlbigpLmRldGFjaCgpfSxjaGFyYWN0ZXJFcXVpdmFsZW50czp7YToiw6HDoMOiw6PDpMSFw6UiLEE6IsOBw4DDgsODw4TEhMOFIixjOiLDp8SHxI0iLEM6IsOHxIbEjCIsZToiw6nDqMOqw6vEm8SZIixFOiLDicOIw4rDi8SaxJgiLGk6IsOtw6zEsMOuw6/EsSIsSToiw43DjMSww47DjyIsbzoiw7PDssO0w7XDtsWNIixPOiLDk8OSw5TDlcOWxYwiLHNzOiLDnyIsU1M6IuG6niIsdToiw7rDucO7w7zFryIsVToiw5rDmcObw5zFriJ9LHJlcGxhY2VBY2NlbnRzOmZ1bmN0aW9uKGUpe3ZhciByLG89IlsiLHM9dC5jaGFyYWN0ZXJFcXVpdmFsZW50cztpZighdC5jaGFyYWN0ZXJSZWdleCl7dC5jaGFyYWN0ZXJSZWdleEFycmF5PXt9O2ZvcihyIGluIHMpInN0cmluZyI9PXR5cGVvZiByJiYobys9c1tyXSx0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl09bmV3IFJlZ0V4cCgiWyIrc1tyXSsiXSIsImciKSk7dC5jaGFyYWN0ZXJSZWdleD1uZXcgUmVnRXhwKG8rIl0iKX1pZih0LmNoYXJhY3RlclJlZ2V4LnRlc3QoZSkpZm9yKHIgaW4gcykic3RyaW5nIj09dHlwZW9mIHImJihlPWUucmVwbGFjZSh0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl0scikpO3JldHVybiBlfSx2YWxpZGF0ZU9wdGlvbnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG4saT0iaGVhZGVycyBzb3J0Rm9yY2Ugc29ydExpc3Qgc29ydEFwcGVuZCB3aWRnZXRzIi5zcGxpdCgiICIpLGw9ci5vcmlnaW5hbFNldHRpbmdzO2lmKGwpe3QuZGVidWcociwiY29yZSIpJiYobj1uZXcgRGF0ZSk7Zm9yKG8gaW4gbClpZigidW5kZWZpbmVkIj09PShhPXR5cGVvZiB0LmRlZmF1bHRzW29dKSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ0YWJsZS5jb25maWcuJytvKyciIG9wdGlvbiBub3QgcmVjb2duaXplZCcpO2Vsc2UgaWYoIm9iamVjdCI9PT1hKWZvcihzIGluIGxbb10pYT10LmRlZmF1bHRzW29dJiZ0eXBlb2YgdC5kZWZhdWx0c1tvXVtzXSxlLmluQXJyYXkobyxpKTwwJiYidW5kZWZpbmVkIj09PWEmJmNvbnNvbGUud2FybignVGFibGVzb3J0ZXIgV2FybmluZyEgInRhYmxlLmNvbmZpZy4nK28rIi4iK3MrJyIgb3B0aW9uIG5vdCByZWNvZ25pemVkJyk7dC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ2YWxpZGF0ZSBvcHRpb25zIHRpbWU6Iit0LmJlbmNobWFyayhuKSl9fSxyZXN0b3JlSGVhZGVyczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ZShyKVswXS5jb25maWcsbj1hLiR0YWJsZS5maW5kKGEuc2VsZWN0b3JIZWFkZXJzKSxpPW4ubGVuZ3RoO2ZvcihvPTA7bzxpO28rKykocz1uLmVxKG8pKS5maW5kKCIuIit0LmNzcy5oZWFkZXJJbikubGVuZ3RoJiZzLmh0bWwoYS5oZWFkZXJDb250ZW50W29dKX0sZGVzdHJveTpmdW5jdGlvbihyLG8scyl7aWYoKHI9ZShyKVswXSkuaGFzSW5pdGlhbGl6ZWQpe3QucmVtb3ZlV2lkZ2V0KHIsITAsITEpO3ZhciBhLG49ZShyKSxpPXIuY29uZmlnLGw9bi5maW5kKCJ0aGVhZDpmaXJzdCIpLGQ9bC5maW5kKCJ0ci4iK3QuY3NzLmhlYWRlclJvdykucmVtb3ZlQ2xhc3ModC5jc3MuaGVhZGVyUm93KyIgIitpLmNzc0hlYWRlclJvdyksYz1uLmZpbmQoInRmb290OmZpcnN0ID4gdHIiKS5jaGlsZHJlbigidGgsIHRkIik7ITE9PT1vJiZlLmluQXJyYXkoInVpdGhlbWUiLGkud2lkZ2V0cyk+PTAmJihuLnRyaWdnZXJIYW5kbGVyKCJhcHBseVdpZGdldElkIixbInVpdGhlbWUiXSksbi50cmlnZ2VySGFuZGxlcigiYXBwbHlXaWRnZXRJZCIsWyJ6ZWJyYSJdKSksbC5maW5kKCJ0ciIpLm5vdChkKS5yZW1vdmUoKSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgdXBkYXRlQ2VsbCBhZGRSb3dzIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyByZW1vdmVXaWRnZXQgZGVzdHJveSBtb3VzZXVwIG1vdXNlbGVhdmUgIisia2V5cHJlc3Mgc29ydEJlZ2luIHNvcnRFbmQgcmVzZXRUb0xvYWRTdGF0ZSAiLnNwbGl0KCIgIikuam9pbihpLm5hbWVzcGFjZSsiICIpLG4ucmVtb3ZlRGF0YSgidGFibGVzb3J0ZXIiKS51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLGkuJGhlYWRlcnMuYWRkKGMpLnJlbW92ZUNsYXNzKFt0LmNzcy5oZWFkZXIsaS5jc3NIZWFkZXIsaS5jc3NBc2MsaS5jc3NEZXNjLHQuY3NzLnNvcnRBc2MsdC5jc3Muc29ydERlc2MsdC5jc3Muc29ydE5vbmVdLmpvaW4oIiAiKSkucmVtb3ZlQXR0cigiZGF0YS1jb2x1bW4iKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSxkLmZpbmQoaS5zZWxlY3RvclNvcnQpLnVuYmluZCgibW91c2Vkb3duIG1vdXNldXAga2V5cHJlc3MgIi5zcGxpdCgiICIpLmpvaW4oaS5uYW1lc3BhY2UrIiAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLHQucmVzdG9yZUhlYWRlcnMociksbi50b2dnbGVDbGFzcyh0LmNzcy50YWJsZSsiICIraS50YWJsZUNsYXNzKyIgdGFibGVzb3J0ZXItIitpLnRoZW1lLCExPT09byksbi5yZW1vdmVDbGFzcyhpLm5hbWVzcGFjZS5zbGljZSgxKSksci5oYXNJbml0aWFsaXplZD0hMSxkZWxldGUgci5jb25maWcuY2FjaGUsImZ1bmN0aW9uIj09dHlwZW9mIHMmJnMociksdC5kZWJ1ZyhpLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ0YWJsZXNvcnRlciBoYXMgYmVlbiByZW1vdmVkIil9fX07ZS5mbi50YWJsZXNvcnRlcj1mdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxzPWUuZXh0ZW5kKCEwLHt9LHQuZGVmYXVsdHMscix0Lmluc3RhbmNlTWV0aG9kcyk7cy5vcmlnaW5hbFNldHRpbmdzPXIsIW8uaGFzSW5pdGlhbGl6ZWQmJnQuYnVpbGRUYWJsZSYmIlRBQkxFIiE9PXRoaXMubm9kZU5hbWU/dC5idWlsZFRhYmxlKG8scyk6dC5zZXR1cChvLHMpfSl9LHdpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2d8fCh0LmxvZ3M9W10sY29uc29sZT17fSxjb25zb2xlLmxvZz1jb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj1jb25zb2xlLnRhYmxlPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50czphcmd1bWVudHNbMF07dC5sb2dzW3QubG9ncy5sZW5ndGhdPXtkYXRlOkRhdGUubm93KCksbG9nOmV9fSksdC5hZGRQYXJzZXIoe2lkOiJuby1wYXJzZXIiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbigpe3JldHVybiIifSx0eXBlOiJ0ZXh0In0pLHQuYWRkUGFyc2VyKHtpZDoidGV4dCIsaXM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9by5jb25maWc7cmV0dXJuIHImJihyPWUudHJpbShzLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpLHI9cy5zb3J0TG9jYWxlQ29tcGFyZT90LnJlcGxhY2VBY2NlbnRzKHIpOnIpLHJ9LHR5cGU6InRleHQifSksdC5yZWdleC5ub25kaWdpdD0vW15cdywuIFwtKCldL2csdC5hZGRQYXJzZXIoe2lkOiJkaWdpdCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNEaWdpdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC5jdXJyZW5jeVJlcGxhY2U9L1srXC0sLiBdL2csdC5yZWdleC5jdXJyZW5jeVRlc3Q9L15cKD9cZCtbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXXxbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXVxkK1wpPyQvLHQuYWRkUGFyc2VyKHtpZDoiY3VycmVuY3kiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiBlPShlfHwiIikucmVwbGFjZSh0LnJlZ2V4LmN1cnJlbmN5UmVwbGFjZSwiIiksdC5yZWdleC5jdXJyZW5jeVRlc3QudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC51cmxQcm90b2NvbFRlc3Q9L14oaHR0cHM/fGZ0cHxmaWxlKTpcL1wvLyx0LnJlZ2V4LnVybFByb3RvY29sUmVwbGFjZT0vKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLyh3d3dcLik/Lyx0LmFkZFBhcnNlcih7aWQ6InVybCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgudXJsUHJvdG9jb2xUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihyKXtyZXR1cm4gcj9lLnRyaW0oci5yZXBsYWNlKHQucmVnZXgudXJsUHJvdG9jb2xSZXBsYWNlLCIiKSk6cn0sdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhc2g9Ly0vZyx0LnJlZ2V4Lmlzb0RhdGU9L15cZHs0fVtcL1wtXVxkezEsMn1bXC9cLV1cZHsxLDJ9Lyx0LmFkZFBhcnNlcih7aWQ6Imlzb0RhdGUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4Lmlzb0RhdGUudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGFzaCwiLyIpKTplO3JldHVybiByIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocik/ci5nZXRUaW1lKCk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnBlcmNlbnQ9LyUvZyx0LnJlZ2V4LnBlcmNlbnRUZXN0PS8oXGRccyo/JXwlXHMqP1xkKS8sdC5hZGRQYXJzZXIoe2lkOiJwZXJjZW50IixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC5wZXJjZW50VGVzdC50ZXN0KGUpJiZlLmxlbmd0aDwxNX0sZm9ybWF0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGU/dC5mb3JtYXRGbG9hdChlLnJlcGxhY2UodC5yZWdleC5wZXJjZW50LCIiKSxyKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoiaW1hZ2UiLGlzOmZ1bmN0aW9uKGUsdCxyLG8pe3JldHVybiBvLmZpbmQoImltZyIpLmxlbmd0aD4wfSxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3JldHVybiBlKG8pLmZpbmQoImltZyIpLmF0dHIoci5jb25maWcuaW1nQXR0cnx8ImFsdCIpfHx0fSxwYXJzZWQ6ITAsdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhdGVSZXBsYWNlPS8oXFMpKFtBUF1NKSQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0MT0vXltBLVpdezMsMTB9XC4/XHMrXGR7MSwyfSw/XHMrKFxkezR9KShccytcZHsxLDJ9OlxkezJ9KDpcZHsyfSk/KFxzK1tBUF1NKT8pPyQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0Mj0vXlxkezEsMn1ccytbQS1aXXszLDEwfVxzK1xkezR9L2ksdC5hZGRQYXJzZXIoe2lkOiJ1c0xvbmdEYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC51c0xvbmdEYXRlVGVzdDEudGVzdChlKXx8dC5yZWdleC51c0xvbmdEYXRlVGVzdDIudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGF0ZVJlcGxhY2UsIiQxICQyIikpOmU7cmV0dXJuIHIgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShyKT9yLmdldFRpbWUoKTplfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXguc2hvcnREYXRlVGVzdD0vKF5cZHsxLDJ9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezR9KXwoXlxkezR9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezEsMn0pLyx0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2U9L1tcLS4sXS9nLHQucmVnZXguc2hvcnREYXRlWFhZPS8oXGR7MSwyfSlbXC9cc10oXGR7MSwyfSlbXC9cc10oXGR7NH0pLyx0LnJlZ2V4LnNob3J0RGF0ZVlNRD0vKFxkezR9KVtcL1xzXShcZHsxLDJ9KVtcL1xzXShcZHsxLDJ9KS8sdC5jb252ZXJ0Rm9ybWF0PWZ1bmN0aW9uKGUscil7ZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLCJtbWRkeXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMS8kMiIpOiJkZG1teXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMi8kMSIpOiJ5eXl5bW1kZCI9PT1yJiYoZT1lLnJlcGxhY2UodC5yZWdleC5zaG9ydERhdGVZTUQsIiQxLyQyLyQzIikpO3ZhciBvPW5ldyBEYXRlKGUpO3JldHVybiBvIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUobyk/by5nZXRUaW1lKCk6IiJ9LHQuYWRkUGFyc2VyKHtpZDoic2hvcnREYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLHQucmVnZXguc2hvcnREYXRlVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZSl7dmFyIGE9ci5jb25maWcsbj1hLiRoZWFkZXJJbmRleGVkW3NdLGk9bi5sZW5ndGgmJm4uZGF0YSgiZGF0ZUZvcm1hdCIpfHx0LmdldERhdGEobix0LmdldENvbHVtbkRhdGEocixhLmhlYWRlcnMscyksImRhdGVGb3JtYXQiKXx8YS5kYXRlRm9ybWF0O3JldHVybiBuLmxlbmd0aCYmbi5kYXRhKCJkYXRlRm9ybWF0IixpKSx0LmNvbnZlcnRGb3JtYXQoZSxpKXx8ZX1yZXR1cm4gZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnRpbWVUZXN0PS9eKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSkkfF4oKD86WzAxXVxkfFsyXVswLTRdKTpbMC01XVxkKSQvaSx0LnJlZ2V4LnRpbWVNYXRjaD0vKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSl8KCg/OlswMV1cZHxbMl1bMC00XSk6WzAtNV1cZCkvaSx0LmFkZFBhcnNlcih7aWQ6InRpbWUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4LnRpbWVUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcixvPShlfHwiIikubWF0Y2godC5yZWdleC50aW1lTWF0Y2gpLHM9bmV3IERhdGUoZSksYT1lJiYobnVsbCE9PW8/b1swXToiMDA6MDAgQU0iKSxuPWE/bmV3IERhdGUoIjIwMDAvMDEvMDEgIithLnJlcGxhY2UodC5yZWdleC5kYXRlUmVwbGFjZSwiJDEgJDIiKSk6YTtyZXR1cm4gbiBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKG4pPyhyPXMgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShzKT9zLmdldFRpbWUoKTowLHI/cGFyc2VGbG9hdChuLmdldFRpbWUoKSsiLiIrcy5nZXRUaW1lKCkpOm4uZ2V0VGltZSgpKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoibWV0YWRhdGEiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHM9ci5jb25maWcsYT1zLnBhcnNlck1ldGFkYXRhTmFtZT9zLnBhcnNlck1ldGFkYXRhTmFtZToic29ydFZhbHVlIjtyZXR1cm4gZShvKS5tZXRhZGF0YSgpW2FdfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkV2lkZ2V0KHtpZDoiemVicmEiLHByaW9yaXR5OjkwLGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZz1uZXcgUmVnRXhwKHIuY3NzQ2hpbGRSb3csImkiKSxwPXIuJHRib2RpZXMuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV90YWJsZSIpLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrci5jc3NJbmZvQmxvY2srIikiKSk7Zm9yKGw9MDtsPHAubGVuZ3RoO2wrKylmb3Iobj0wLGM9KHM9cC5lcShsKS5jaGlsZHJlbigidHI6dmlzaWJsZSIpLm5vdChyLnNlbGVjdG9yUmVtb3ZlKSkubGVuZ3RoLGQ9MDtkPGM7ZCsrKWE9cy5lcShkKSxnLnRlc3QoYVswXS5jbGFzc05hbWUpfHxuKyssaT1uJTI9PTAsYS5yZW1vdmVDbGFzcyhvLnplYnJhW2k/MTowXSkuYWRkQ2xhc3Moby56ZWJyYVtpPzA6MV0pfSxyZW1vdmU6ZnVuY3Rpb24oZSxyLG8scyl7aWYoIXMpe3ZhciBhLG4saT1yLiR0Ym9kaWVzLGw9KG8uemVicmF8fFsiZXZlbiIsIm9kZCJdKS5qb2luKCIgIik7Zm9yKGE9MDthPGkubGVuZ3RoO2ErKykobj10LnByb2Nlc3NUYm9keShlLGkuZXEoYSksITApKS5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKGwpLHQucHJvY2Vzc1Rib2R5KGUsbiwhMSl9fX0pfShlKSxlLnRhYmxlc29ydGVyfSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAgICBDb3B5cmlnaHQgMjAwOC0yMDEzCiAgICAgICAgTWF0dGhpYXMgRWhtYW5uLAogICAgICAgIE1pY2hhZWwgR2VyaGFldXNlciwKICAgICAgICBDYXJzdGVuIE1pbGxlciwKICAgICAgICBCaWFuY2EgVmFsZW50aW4sCiAgICAgICAgQWxmcmVkIFdhc3Nlcm1hbm4sCiAgICAgICAgUGV0ZXIgV2lsZmFocnQKICAgIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBvciBMR1BMIFZlcnNpb24gMyBsaWNlbnNlcy4KICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLgogICAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8+LgoqLwooZnVuY3Rpb24oKXt2YXIgZSxyLG47KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG8oZSxyKXtyZXR1cm4gQy5jYWxsKGUscil9ZnVuY3Rpb24gaShlLHIpe3ZhciBuLHQsbyxpLGEsdSxjLGYscyxsLHA9ciYmci5zcGxpdCgiLyIpLGg9ay5tYXAsZD1oJiZoWyIqIl18fHt9O2lmKGUmJiIuIj09PWUuY2hhckF0KDApKWlmKHIpe2ZvcihwPXAuc2xpY2UoMCxwLmxlbmd0aC0xKSxlPXAuY29uY2F0KGUuc3BsaXQoIi8iKSksZj0wO2UubGVuZ3RoPmY7Zis9MSlpZihsPWVbZl0sIi4iPT09bCllLnNwbGljZShmLDEpLGYtPTE7ZWxzZSBpZigiLi4iPT09bCl7aWYoMT09PWYmJigiLi4iPT09ZVsyXXx8Ii4uIj09PWVbMF0pKWJyZWFrO2Y+MCYmKGUuc3BsaWNlKGYtMSwyKSxmLT0yKX1lPWUuam9pbigiLyIpfWVsc2UgMD09PWUuaW5kZXhPZigiLi8iKSYmKGU9ZS5zdWJzdHJpbmcoMikpO2lmKChwfHxkKSYmaCl7Zm9yKG49ZS5zcGxpdCgiLyIpLGY9bi5sZW5ndGg7Zj4wO2YtPTEpe2lmKHQ9bi5zbGljZSgwLGYpLmpvaW4oIi8iKSxwKWZvcihzPXAubGVuZ3RoO3M+MDtzLT0xKWlmKG89aFtwLnNsaWNlKDAscykuam9pbigiLyIpXSxvJiYobz1vW3RdKSl7aT1vLGE9ZjticmVha31pZihpKWJyZWFrOyF1JiZkJiZkW3RdJiYodT1kW3RdLGM9Zil9IWkmJnUmJihpPXUsYT1jKSxpJiYobi5zcGxpY2UoMCxhLGkpLGU9bi5qb2luKCIvIikpfXJldHVybiBlfWZ1bmN0aW9uIGEoZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaC5hcHBseSh0LHYuY2FsbChhcmd1bWVudHMsMCkuY29uY2F0KFtlLHJdKSl9fWZ1bmN0aW9uIHUoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBpKHIsZSl9fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe2JbZV09cn19ZnVuY3Rpb24gZihlKXtpZihvKG0sZSkpe3ZhciByPW1bZV07ZGVsZXRlIG1bZV0seVtlXT0hMCxwLmFwcGx5KHQscil9aWYoIW8oYixlKSYmIW8oeSxlKSl0aHJvdyBFcnJvcigiTm8gIitlKTtyZXR1cm4gYltlXX1mdW5jdGlvbiBzKGUpe3ZhciByLG49ZT9lLmluZGV4T2YoIiEiKTotMTtyZXR1cm4gbj4tMSYmKHI9ZS5zdWJzdHJpbmcoMCxuKSxlPWUuc3Vic3RyaW5nKG4rMSxlLmxlbmd0aCkpLFtyLGVdfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGsmJmsuY29uZmlnJiZrLmNvbmZpZ1tlXXx8e319fXZhciBwLGgsZCxnLGI9e30sbT17fSxrPXt9LHk9e30sQz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHY9W10uc2xpY2U7ZD1mdW5jdGlvbihlLHIpe3ZhciBuLHQ9cyhlKSxvPXRbMF07cmV0dXJuIGU9dFsxXSxvJiYobz1pKG8sciksbj1mKG8pKSxvP2U9biYmbi5ub3JtYWxpemU/bi5ub3JtYWxpemUoZSx1KHIpKTppKGUscik6KGU9aShlLHIpLHQ9cyhlKSxvPXRbMF0sZT10WzFdLG8mJihuPWYobykpKSx7ZjpvP28rIiEiK2U6ZSxuOmUscHI6byxwOm59fSxnPXtyZXF1aXJlOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUpfSxleHBvcnRzOmZ1bmN0aW9uKGUpe3ZhciByPWJbZV07cmV0dXJuIHIhPT12b2lkIDA/cjpiW2VdPXt9fSxtb2R1bGU6ZnVuY3Rpb24oZSl7cmV0dXJue2lkOmUsdXJpOiIiLGV4cG9ydHM6YltlXSxjb25maWc6bChlKX19fSxwPWZ1bmN0aW9uKGUscixuLGkpe3ZhciB1LHMsbCxwLGgsayxDPVtdO2lmKGk9aXx8ZSwiZnVuY3Rpb24iPT10eXBlb2Ygbil7Zm9yKHI9IXIubGVuZ3RoJiZuLmxlbmd0aD9bInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl06cixoPTA7ci5sZW5ndGg+aDtoKz0xKWlmKHA9ZChyW2hdLGkpLHM9cC5mLCJyZXF1aXJlIj09PXMpQ1toXT1nLnJlcXVpcmUoZSk7ZWxzZSBpZigiZXhwb3J0cyI9PT1zKUNbaF09Zy5leHBvcnRzKGUpLGs9ITA7ZWxzZSBpZigibW9kdWxlIj09PXMpdT1DW2hdPWcubW9kdWxlKGUpO2Vsc2UgaWYobyhiLHMpfHxvKG0scyl8fG8oeSxzKSlDW2hdPWYocyk7ZWxzZXtpZighcC5wKXRocm93IEVycm9yKGUrIiBtaXNzaW5nICIrcyk7cC5wLmxvYWQocC5uLGEoaSwhMCksYyhzKSx7fSksQ1toXT1iW3NdfWw9bi5hcHBseShiW2VdLEMpLGUmJih1JiZ1LmV4cG9ydHMhPT10JiZ1LmV4cG9ydHMhPT1iW2VdP2JbZV09dS5leHBvcnRzOmw9PT10JiZrfHwoYltlXT1sKSl9ZWxzZSBlJiYoYltlXT1uKX0sZT1yPWg9ZnVuY3Rpb24oZSxyLG4sbyxpKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/Z1tlXT9nW2VdKHIpOmYoZChlLHIpLmYpOihlLnNwbGljZXx8KGs9ZSxyLnNwbGljZT8oZT1yLHI9bixuPW51bGwpOmU9dCkscj1yfHxmdW5jdGlvbigpe30sImZ1bmN0aW9uIj09dHlwZW9mIG4mJihuPW8sbz1pKSxvP3AodCxlLHIsbik6c2V0VGltZW91dChmdW5jdGlvbigpe3AodCxlLHIsbil9LDQpLGgpfSxoLmNvbmZpZz1mdW5jdGlvbihlKXtyZXR1cm4gaz1lLGsuZGVwcyYmaChrLmRlcHMsay5jYWxsYmFjayksaH0sbj1mdW5jdGlvbihlLHIsbil7ci5zcGxpY2V8fChuPXIscj1bXSksbyhiLGUpfHxvKG0sZSl8fChtW2VdPVtlLHIsbl0pfSxuLmFtZD17alF1ZXJ5OiEwfX0pKCksbigiLi4vbm9kZV9tb2R1bGVzL2FsbW9uZC9hbG1vbmQiLGZ1bmN0aW9uKCl7fSksbigianhnIixbXSxmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiJvYmplY3QiIT10eXBlb2YgSlhHfHxKWEcuZXh0ZW5kfHwoZT1KWEcpLGUuZXh0ZW5kPWZ1bmN0aW9uKGUscixuLHQpe3ZhciBvLGk7bj1ufHwhMSx0PXR8fCExO2ZvcihvIGluIHIpKCFufHxuJiZyLmhhc093blByb3BlcnR5KG8pKSYmKGk9dD9vLnRvTG93ZXJDYXNlKCk6byxlW2ldPXJbb10pfSxlLmV4dGVuZChlLHtib2FyZHM6e30scmVhZGVyczp7fSxlbGVtZW50czp7fSxyZWdpc3RlckVsZW1lbnQ6ZnVuY3Rpb24oZSxyKXtlPWUudG9Mb3dlckNhc2UoKSx0aGlzLmVsZW1lbnRzW2VdPXJ9LHJlZ2lzdGVyUmVhZGVyOmZ1bmN0aW9uKGUscil7dmFyIG4sdDtmb3Iobj0wO3IubGVuZ3RoPm47bisrKXQ9cltuXS50b0xvd2VyQ2FzZSgpLCJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLnJlYWRlcnNbdF0mJih0aGlzLnJlYWRlcnNbdF09ZSl9LHNob3J0Y3V0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbcl0uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sZ2V0UmVmOmZ1bmN0aW9uKGUscil7cmV0dXJuIGUuc2VsZWN0KHIpfSxnZXRSZWZlcmVuY2U6ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZS5zZWxlY3Qocil9LGRlYnVnSW50OmZ1bmN0aW9uKCl7dmFyIGUscjtmb3IoZT0wO2FyZ3VtZW50cy5sZW5ndGg+ZTtlKyspcj1hcmd1bWVudHNbZV0sIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZz9jb25zb2xlLmxvZyhyKToib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVidWciKSYmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZWJ1ZyIpLmlubmVySFRNTCs9cisiPGJyLz4iKX0sZGVidWdXU1Q6ZnVuY3Rpb24oKXt2YXIgcj1FcnJvcigpO2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJnIuc3RhY2smJihlLmRlYnVnSW50KCJzdGFja3RyYWNlIiksZS5kZWJ1Z0ludChyLnN0YWNrLnNwbGl0KCJcbiIpLnNsaWNlKDEpLmpvaW4oIlxuIikpKX0sZGVidWdMaW5lOmZ1bmN0aW9uKCl7dmFyIHI9RXJyb3IoKTtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZyLnN0YWNrJiZlLmRlYnVnSW50KCJDYWxsZWQgZnJvbSIsci5zdGFjay5zcGxpdCgiXG4iKS5zbGljZSgyLDMpLmpvaW4oIlxuIikpfSxkZWJ1ZzpmdW5jdGlvbigpe2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pLGV9KSxuKCJ1dGlscy96aXAiLFsianhnIl0sZnVuY3Rpb24oZSl7dmFyIHI9WzAsMTI4LDY0LDE5MiwzMiwxNjAsOTYsMjI0LDE2LDE0NCw4MCwyMDgsNDgsMTc2LDExMiwyNDAsOCwxMzYsNzIsMjAwLDQwLDE2OCwxMDQsMjMyLDI0LDE1Miw4OCwyMTYsNTYsMTg0LDEyMCwyNDgsNCwxMzIsNjgsMTk2LDM2LDE2NCwxMDAsMjI4LDIwLDE0OCw4NCwyMTIsNTIsMTgwLDExNiwyNDQsMTIsMTQwLDc2LDIwNCw0NCwxNzIsMTA4LDIzNiwyOCwxNTYsOTIsMjIwLDYwLDE4OCwxMjQsMjUyLDIsMTMwLDY2LDE5NCwzNCwxNjIsOTgsMjI2LDE4LDE0Niw4MiwyMTAsNTAsMTc4LDExNCwyNDIsMTAsMTM4LDc0LDIwMiw0MiwxNzAsMTA2LDIzNCwyNiwxNTQsOTAsMjE4LDU4LDE4NiwxMjIsMjUwLDYsMTM0LDcwLDE5OCwzOCwxNjYsMTAyLDIzMCwyMiwxNTAsODYsMjE0LDU0LDE4MiwxMTgsMjQ2LDE0LDE0Miw3OCwyMDYsNDYsMTc0LDExMCwyMzgsMzAsMTU4LDk0LDIyMiw2MiwxOTAsMTI2LDI1NCwxLDEyOSw2NSwxOTMsMzMsMTYxLDk3LDIyNSwxNywxNDUsODEsMjA5LDQ5LDE3NywxMTMsMjQxLDksMTM3LDczLDIwMSw0MSwxNjksMTA1LDIzMywyNSwxNTMsODksMjE3LDU3LDE4NSwxMjEsMjQ5LDUsMTMzLDY5LDE5NywzNywxNjUsMTAxLDIyOSwyMSwxNDksODUsMjEzLDUzLDE4MSwxMTcsMjQ1LDEzLDE0MSw3NywyMDUsNDUsMTczLDEwOSwyMzcsMjksMTU3LDkzLDIyMSw2MSwxODksMTI1LDI1MywzLDEzMSw2NywxOTUsMzUsMTYzLDk5LDIyNywxOSwxNDcsODMsMjExLDUxLDE3OSwxMTUsMjQzLDExLDEzOSw3NSwyMDMsNDMsMTcxLDEwNywyMzUsMjcsMTU1LDkxLDIxOSw1OSwxODcsMTIzLDI1MSw3LDEzNSw3MSwxOTksMzksMTY3LDEwMywyMzEsMjMsMTUxLDg3LDIxNSw1NSwxODMsMTE5LDI0NywxNSwxNDMsNzksMjA3LDQ3LDE3NSwxMTEsMjM5LDMxLDE1OSw5NSwyMjMsNjMsMTkxLDEyNywyNTVdLG49WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSx0PVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsOTksOTldLG89WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3N10saT1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sYT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sdT0yNTY7cmV0dXJuIGUuVXRpbD1lLlV0aWx8fHt9LGUuVXRpbC5VbnppcD1mdW5jdGlvbihjKXtmdW5jdGlvbiBmKCl7cmV0dXJuIFIrPTgsTz5YP2NbWCsrXTotMX1mdW5jdGlvbiBzKCl7Qj0xfWZ1bmN0aW9uIGwoKXt2YXIgZTt0cnl7cmV0dXJuIFIrKyxlPTEmQixCPj49MSwwPT09QiYmKEI9ZigpLGU9MSZCLEI9MTI4fEI+PjEpLGV9Y2F0Y2gocil7dGhyb3cgcn19ZnVuY3Rpb24gcChlKXt2YXIgbj0wLHQ9ZTt0cnl7Zm9yKDt0LS07KW49bjw8MXxsKCk7ZSYmKG49cltuXT4+OC1lKX1jYXRjaChvKXt0aHJvdyBvfXJldHVybiBufWZ1bmN0aW9uIGgoKXtKPTB9ZnVuY3Rpb24gZChlKXtqKyssR1tKKytdPWUsei5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpLDMyNzY4PT09SiYmKEo9MCl9ZnVuY3Rpb24gZygpe3RoaXMuYjA9MCx0aGlzLmIxPTAsdGhpcy5qdW1wPW51bGwsdGhpcy5qdW1wcG9zPS0xfWZ1bmN0aW9uIGIoKXtmb3IoOzspe2lmKE1bSF0+PXgpcmV0dXJuLTE7aWYoVVtNW0hdXT09PUgpcmV0dXJuIE1bSF0rKztNW0hdKyt9fWZ1bmN0aW9uIG0oKXt2YXIgZSxyPVBbRl07aWYoMTc9PT1IKXJldHVybi0xO2lmKEYrKyxIKyssZT1iKCksZT49MClyLmIwPWU7ZWxzZSBpZihyLmIwPTMyNzY4LG0oKSlyZXR1cm4tMTtpZihlPWIoKSxlPj0wKXIuYjE9ZSxyLmp1bXA9bnVsbDtlbHNlIGlmKHIuYjE9MzI3Njgsci5qdW1wPVBbRl0sci5qdW1wcG9zPUYsbSgpKXJldHVybi0xO3JldHVybiBILS0sMH1mdW5jdGlvbiBrKGUscixuKXt2YXIgdDtmb3IoUD1lLEY9MCxVPW4seD1yLHQ9MDsxNz50O3QrKylNW3RdPTA7cmV0dXJuIEg9MCxtKCk/LTE6MH1mdW5jdGlvbiB5KGUpe2Zvcih2YXIgcixuLHQsbz0wLGk9ZVtvXTs7KWlmKHQ9bCgpKXtpZighKDMyNzY4JmkuYjEpKXJldHVybiBpLmIxO2ZvcihpPWkuanVtcCxyPWUubGVuZ3RoLG49MDtyPm47bisrKWlmKGVbbl09PT1pKXtvPW47YnJlYWt9fWVsc2V7aWYoISgzMjc2OCZpLmIwKSlyZXR1cm4gaS5iMDtvKyssaT1lW29dfX1mdW5jdGlvbiBDKCl7dmFyIHUsYyxiLG0sQyx2LEEsaix3LFUseCxTLHosSSxFLEwsTztkbyBpZih1PWwoKSxiPXAoMiksMD09PWIpZm9yKHMoKSxVPWYoKSxVfD1mKCk8PDgsUz1mKCksU3w9ZigpPDw4LDY1NTM1JihVXn5TKSYmZS5kZWJ1ZygiQmxvY2tMZW4gY2hlY2tzdW0gbWlzbWF0Y2hcbiIpO1UtLTspYz1mKCksZChjKTtlbHNlIGlmKDE9PT1iKWZvcig7OylpZihDPXJbcCg3KV0+PjEsQz4yMz8oQz1DPDwxfGwoKSxDPjE5OT8oQy09MTI4LEM9Qzw8MXxsKCkpOihDLT00OCxDPjE0MyYmKEMrPTEzNikpKTpDKz0yNTYsMjU2PkMpZChDKTtlbHNle2lmKDI1Nj09PUMpYnJlYWs7Zm9yKEMtPTI1Nyx3PXAodFtDXSkrbltDXSxDPXJbcCg1KV0+PjMsaVtDXT44Pyh4PXAoOCkseHw9cChpW0NdLTgpPDw4KTp4PXAoaVtDXSkseCs9b1tDXSxDPTA7dz5DO0MrKyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgaWYoMj09PWIpe2ZvcihBPUFycmF5KDMyMCksST0yNTcrcCg1KSxFPTErcCg1KSxMPTQrcCg0KSxDPTA7MTk+QztDKyspQVtDXT0wO2ZvcihDPTA7TD5DO0MrKylBW2FbQ11dPXAoMyk7Zm9yKHc9cS5sZW5ndGgsbT0wO3c+bTttKyspcVttXT1uZXcgZztpZihrKHEsMTksQSwwKSlyZXR1cm4gaCgpLDE7Zm9yKHo9SStFLG09MCxPPS0xO3o+bTspaWYoTysrLEM9eShxKSwxNj5DKUFbbSsrXT1DO2Vsc2UgaWYoMTY9PT1DKXtpZihDPTMrcCgyKSxtK0M+eilyZXR1cm4gaCgpLDE7Zm9yKHY9bT9BW20tMV06MDtDLS07KUFbbSsrXT12fWVsc2V7aWYoQz0xNz09PUM/MytwKDMpOjExK3AoNyksbStDPnopcmV0dXJuIGgoKSwxO2Zvcig7Qy0tOylBW20rK109MH1mb3Iodz1ULmxlbmd0aCxtPTA7dz5tO20rKylUW21dPW5ldyBnO2lmKGsoVCxJLEEsMCkpcmV0dXJuIGgoKSwxO2Zvcih3PVQubGVuZ3RoLG09MDt3Pm07bSsrKXFbbV09bmV3IGc7Zm9yKGo9W10sbT1JO0EubGVuZ3RoPm07bSsrKWpbbS1JXT1BW21dO2lmKGsocSxFLGosMCkpcmV0dXJuIGgoKSwxO2Zvcig7OylpZihDPXkoVCksQz49MjU2KXtpZihDLT0yNTYsMD09PUMpYnJlYWs7Zm9yKEMtPTEsdz1wKHRbQ10pK25bQ10sQz15KHEpLGlbQ10+OD8oeD1wKDgpLHh8PXAoaVtDXS04KTw8OCk6eD1wKGlbQ10pLHgrPW9bQ107dy0tOyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgZChDKX13aGlsZSghdSk7cmV0dXJuIGgoKSxzKCksMH1mdW5jdGlvbiB2KCl7dmFyIGUscixuLHQsbyxpLGEsYyxzPVtdO3RyeXtpZih6PVtdLEw9ITEsc1swXT1mKCksc1sxXT1mKCksMTIwPT09c1swXSYmMjE4PT09c1sxXSYmKEMoKSxFW0ldPVt6LmpvaW4oIiIpLCJnZW9uZXh0Lmd4dCJdLEkrKyksMzE9PT1zWzBdJiYxMzk9PT1zWzFdJiYoUygpLEVbSV09W3ouam9pbigiIiksImZpbGUiXSxJKyspLDgwPT09c1swXSYmNzU9PT1zWzFdJiYoTD0hMCxzWzJdPWYoKSxzWzNdPWYoKSwzPT09c1syXSYmND09PXNbM10pKXtmb3Ioc1swXT1mKCksc1sxXT1mKCksQT1mKCksQXw9ZigpPDw4LGM9ZigpLGN8PWYoKTw8OCxmKCksZigpLGYoKSxmKCksYT1mKCksYXw9ZigpPDw4LGF8PWYoKTw8MTYsYXw9ZigpPDwyNCxpPWYoKSxpfD1mKCk8PDgsaXw9ZigpPDwxNixpfD1mKCk8PDI0LG89ZigpLG98PWYoKTw8OCxvfD1mKCk8PDE2LG98PWYoKTw8MjQsdD1mKCksdHw9ZigpPDw4LG49ZigpLG58PWYoKTw8OCxlPTAsTj1bXTt0LS07KXI9ZigpLCIvIj09PXJ8IjoiPT09cj9lPTA6dS0xPmUmJihOW2UrK109U3RyaW5nLmZyb21DaGFyQ29kZShyKSk7Zm9yKHd8fCh3PU4pLGU9MDtuPmU7KXI9ZigpLGUrKztqPTAsOD09PWMmJihDKCksRVtJXT1BcnJheSgyKSxFW0ldWzBdPXouam9pbigiIiksRVtJXVsxXT1OLmpvaW4oIiIpLEkrKyksUygpfX1jYXRjaChsKXt0aHJvdyBsfX12YXIgQSxqLHcsVSx4LFMsej1bXSxJPTAsRT1bXSxHPUFycmF5KDMyNzY4KSxKPTAsTD0hMSxPPWMubGVuZ3RoLFg9MCxCPTEsUj0wLFQ9QXJyYXkoMjg4KSxxPUFycmF5KDMyKSxGPTAsUD1udWxsLEg9KEFycmF5KDY0KSxBcnJheSg2NCksMCksTT1BcnJheSgxNyksTj1bXTtNWzBdPTAsUz1mdW5jdGlvbigpe3ZhciBlLHIsbix0LG8saSxhPVtdO2lmKDgmQSYmKGFbMF09ZigpLGFbMV09ZigpLGFbMl09ZigpLGFbM109ZigpLDgwPT09YVswXSYmNzU9PT1hWzFdJiY3PT09YVsyXSYmOD09PWFbM10/KGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQpOmU9YVswXXxhWzFdPDw4fGFbMl08PDE2fGFbM108PDI0LHI9ZigpLHJ8PWYoKTw8OCxyfD1mKCk8PDE2LHJ8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCksTCYmdigpLGFbMF09ZigpLDg9PT1hWzBdKXtpZihBPWYoKSxmKCksZigpLGYoKSxmKCksZigpLHQ9ZigpLDQmQSlmb3IoYVswXT1mKCksYVsyXT1mKCksSD1hWzBdKzI1NiphWzFdLG89MDtIPm87bysrKWYoKTtpZig4JkEpZm9yKG89MCxOPVtdLGk9ZigpO2k7KSgiNyI9PT1pfHwiOiI9PT1pKSYmKG89MCksdS0xPm8mJihOW28rK109aSksaT1mKCk7aWYoMTYmQSlmb3IoaT1mKCk7aTspaT1mKCk7MiZBJiYoZigpLGYoKSksQygpLGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCxMJiZ2KCl9fSxlLlV0aWwuVW56aXAucHJvdG90eXBlLnVuemlwRmlsZT1mdW5jdGlvbihlKXt2YXIgcjtmb3IodGhpcy51bnppcCgpLHI9MDtFLmxlbmd0aD5yO3IrKylpZihFW3JdWzFdPT09ZSlyZXR1cm4gRVtyXVswXTtyZXR1cm4iIn0sZS5VdGlsLlVuemlwLnByb3RvdHlwZS51bnppcD1mdW5jdGlvbigpe3JldHVybiB2KCksRX19LGUuVXRpbH0pLG4oInV0aWxzL2VuY29kaW5nIixbImp4ZyJdLGZ1bmN0aW9uKGUpe3ZhciByPTAsbj1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsOCw4LDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEwLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDQsMywzLDExLDYsNiw2LDUsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDAsMTIsMjQsMzYsNjAsOTYsODQsMTIsMTIsMTIsNDgsNzIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMCwxMiwxMiwxMiwxMiwxMiwwLDEyLDAsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTJdO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuVVRGOD17ZW5jb2RlOmZ1bmN0aW9uKGUpe3ZhciByLG4sdD0iIixvPWUubGVuZ3RoO2lmKGU9ZS5yZXBsYWNlKC9cclxuL2csIlxuIiksImZ1bmN0aW9uIj09dHlwZW9mIHVuZXNjYXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZW5jb2RlVVJJQ29tcG9uZW50KXJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpO2ZvcihyPTA7bz5yO3IrKyluPWUuY2hhckNvZGVBdChyKSwxMjg+bj90Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKG4pOm4+MTI3JiYyMDQ4Pm4/KHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTkyfG4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKToodCs9U3RyaW5nLmZyb21DaGFyQ29kZSgyMjR8bj4+MTIpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKTtyZXR1cm4gdH0sZGVjb2RlOmZ1bmN0aW9uKGUpe3ZhciB0LG8saSxhPTAsdT0wLGM9cixmPVtdLHM9ZS5sZW5ndGgsbD1bXTtmb3IodD0wO3M+dDt0Kyspbz1lLmNoYXJDb2RlQXQodCksaT1uW29dLHU9YyE9PXI/NjMmb3x1PDw2OjI1NT4+aSZvLGM9blsyNTYrYytpXSxjPT09ciYmKHU+NjU1MzU/Zi5wdXNoKDU1MjMyKyh1Pj4xMCksNTYzMjArKDEwMjMmdSkpOmYucHVzaCh1KSxhKyssMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSksZj1bXSkpO3JldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGYpKSxsLmpvaW4oIiIpfSxhc2NpaUNoYXJDb2RlQXQ6ZnVuY3Rpb24oZSxyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7aWYobj4yNTUpc3dpdGNoKG4pe2Nhc2UgODM2NDpuPTEyODticmVhaztjYXNlIDgyMTg6bj0xMzA7YnJlYWs7Y2FzZSA0MDI6bj0xMzE7YnJlYWs7Y2FzZSA4MjIyOm49MTMyO2JyZWFrO2Nhc2UgODIzMDpuPTEzMzticmVhaztjYXNlIDgyMjQ6bj0xMzQ7YnJlYWs7Y2FzZSA4MjI1Om49MTM1O2JyZWFrO2Nhc2UgNzEwOm49MTM2O2JyZWFrO2Nhc2UgODI0MDpuPTEzNzticmVhaztjYXNlIDM1MjpuPTEzODticmVhaztjYXNlIDgyNDk6bj0xMzk7YnJlYWs7Y2FzZSAzMzg6bj0xNDA7YnJlYWs7Y2FzZSAzODE6bj0xNDI7YnJlYWs7Y2FzZSA4MjE2Om49MTQ1O2JyZWFrO2Nhc2UgODIxNzpuPTE0NjticmVhaztjYXNlIDgyMjA6bj0xNDc7YnJlYWs7Y2FzZSA4MjIxOm49MTQ4O2JyZWFrO2Nhc2UgODIyNjpuPTE0OTticmVhaztjYXNlIDgyMTE6bj0xNTA7YnJlYWs7Y2FzZSA4MjEyOm49MTUxO2JyZWFrO2Nhc2UgNzMyOm49MTUyO2JyZWFrO2Nhc2UgODQ4MjpuPTE1MzticmVhaztjYXNlIDM1MzpuPTE1NDticmVhaztjYXNlIDgyNTA6bj0xNTU7YnJlYWs7Y2FzZSAzMzk6bj0xNTY7YnJlYWs7Y2FzZSAzODI6bj0xNTg7YnJlYWs7Y2FzZSAzNzY6bj0xNTk7YnJlYWs7ZGVmYXVsdDp9cmV0dXJuIG59fSxlLlV0aWwuVVRGOH0pLG4oInV0aWxzL2Jhc2U2NCIsWyJqeGciLCJ1dGlscy9lbmNvZGluZyJdLGZ1bmN0aW9uKGUscil7ZnVuY3Rpb24gbihlLHIpe3JldHVybiAyNTUmZS5jaGFyQ29kZUF0KHIpfWZ1bmN0aW9uIHQoZSxyKXt2YXIgbj1vLmluZGV4T2YoZS5jaGFyQXQocikpO2lmKC0xPT09bil0aHJvdyBFcnJvcigiSlNYR3JhcGgvdXRpbHMvYmFzZTY0OiBDYW4ndCBkZWNvZGUgc3RyaW5nIChpbnZhbGlkIGNoYXJhY3RlcikuIik7cmV0dXJuIG59dmFyIG89IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGk9Ij0iO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuQmFzZTY0PXtlbmNvZGU6ZnVuY3Rpb24oZSl7dmFyIHQsYSx1LGMsZixzPVtdO2ZvcihmPXIuZW5jb2RlKGUpLHU9Zi5sZW5ndGgsYz11JTMsdD0wO3UtYz50O3QrPTMpYT1uKGYsdCk8PDE2fG4oZix0KzEpPDw4fG4oZix0KzIpLHMucHVzaChvLmNoYXJBdChhPj4xOCksby5jaGFyQXQoNjMmYT4+MTIpLG8uY2hhckF0KDYzJmE+PjYpLG8uY2hhckF0KDYzJmEpKTtzd2l0Y2goYyl7Y2FzZSAxOmE9bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjIpLG8uY2hhckF0KDYzJmE8PDQpLGksaSk7YnJlYWs7Y2FzZSAyOmE9bihmLHUtMik8PDh8bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjEwKSxvLmNoYXJBdCg2MyZhPj40KSxvLmNoYXJBdCg2MyZhPDwyKSxpKX1yZXR1cm4gcy5qb2luKCIiKX0sZGVjb2RlOmZ1bmN0aW9uKGUsbil7dmFyIG8sYSx1LGMsZixzLGw9W10scD1bXTtpZihvPWUucmVwbGFjZSgvW15BLVphLXowLTlcK1wvPV0vZywiIiksdT1vLmxlbmd0aCwwIT09dSU0KXRocm93IEVycm9yKCJKU1hHcmFwaC91dGlscy9iYXNlNjQ6IENhbid0IGRlY29kZSBzdHJpbmcgKGludmFsaWQgaW5wdXQgbGVuZ3RoKS4iKTtmb3Ioby5jaGFyQXQodS0xKT09PWkmJihjPTEsby5jaGFyQXQodS0yKT09PWkmJihjPTIpLHUtPTQpLGE9MDt1PmE7YSs9NClmPXQobyxhKTw8MTh8dChvLGErMSk8PDEyfHQobyxhKzIpPDw2fHQobyxhKzMpLHAucHVzaChmPj4xNiwyNTUmZj4+OCwyNTUmZiksMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxwKSkscD1bXSk7c3dpdGNoKGMpe2Nhc2UgMTpmPXQobyx1KTw8MTJ8dChvLHUrMSk8PDZ8dChvLHUrMikscC5wdXNoKGY+PjEwLDI1NSZmPj4yKTticmVhaztjYXNlIDI6Zj10KG8sYSk8PDZ8dChvLGErMSkscC5wdXNoKGY+PjQpfXJldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHApKSxzPWwuam9pbigiIiksbiYmKHM9ci5kZWNvZGUocykpLHN9LGRlY29kZUFzQXJyYXk6ZnVuY3Rpb24oZSl7dmFyIHIsbj10aGlzLmRlY29kZShlKSx0PVtdLG89bi5sZW5ndGg7Zm9yKHI9MDtvPnI7cisrKXRbcl09bi5jaGFyQ29kZUF0KHIpO3JldHVybiB0fX0sZS5VdGlsLkJhc2U2NH0pLG4oIi4uL2J1aWxkL2NvbXByZXNzb3IuZGVwcy5qcyIsWyJqeGciLCJ1dGlscy96aXAiLCJ1dGlscy9iYXNlNjQiXSxmdW5jdGlvbihlLHIsbil7cmV0dXJuIGUuZGVjb21wcmVzcz1mdW5jdGlvbihlKXtyZXR1cm4gdW5lc2NhcGUobmV3IHIuVW56aXAobi5kZWNvZGVBc0FycmF5KGUpKS51bnppcCgpWzBdWzBdKX0sZX0pLHdpbmRvdy5KWEc9cigiLi4vYnVpbGQvY29tcHJlc3Nvci5kZXBzLmpzIil9KSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuZmlsZUxvYWRpbmcgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIGZpbGVMb2FkaW5nQ2FsbGJhY2tzID0ge307CiAgICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICBmdW5jdGlvbiBsb2FkS2V5d29yZHNGaWxlKGZpbGVuYW1lLCBjYWxsYmFjaykgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSA9IGNhbGxiYWNrOwogICAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOwogICAgICAgIC8vIHRpbWVzdGFtcCBhcyBhbiBhcmd1bWVudCB0byBwcmV2ZW50IGJyb3dzZXJzIGZyb20gY2FjaGluZyBzY3JpcHRzCiAgICAgICAgLy8gc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg2NjYxOS9ob3ctdG8tZm9yY2UtaWUtdG8tcmVsb2FkLWphdmFzY3JpcHQKICAgICAgICBzY3JpcHQuc3JjID0gZmlsZW5hbWUrJz90aW1lPScrdGltZXN0YW1wOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHBhcmVudCkgewogICAgICAgIHZhciBjYWxsYWJsZUxpc3QgPSBbXTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxhYmxlKSB7CiAgICAgICAgICAgIGlmICghcGFyZW50LmlzQ2hpbGRyZW5Mb2FkZWQpIHsKICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdC5wdXNoKGNhbGxhYmxlKTsKICAgICAgICAgICAgICAgIGlmIChjYWxsYWJsZUxpc3QubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBsb2FkS2V5d29yZHNGaWxlKHBhcmVudC5jaGlsZEZpbGVOYW1lLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYWJsZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdFtpXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbm90aWZ5RmlsZUxvYWRlZChmaWxlbmFtZSkgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSgpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXRDYWxsYmFja0hhbmRsZXJGb3JLZXl3b3JkczogZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHMsCiAgICAgICAgbm90aWZ5OiBub3RpZnlGaWxlTG9hZGVkCiAgICB9Cn0oKSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5tb2RlbCA9IChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBTdWl0ZShkYXRhKSB7CiAgICAgICAgdmFyIHN1aXRlID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAgc3VpdGUuc291cmNlID0gZGF0YS5zb3VyY2U7CiAgICAgICAgc3VpdGUucmVsYXRpdmVTb3VyY2UgPSBkYXRhLnJlbGF0aXZlU291cmNlOwogICAgICAgIHN1aXRlLmZ1bGxOYW1lID0gZGF0YS5wYXJlbnQgPyBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIGRhdGEubmFtZSA6IGRhdGEubmFtZTsKICAgICAgICBzZXRTdGF0cyhzdWl0ZSwgZGF0YS5zdGF0aXN0aWNzKTsKICAgICAgICBzdWl0ZS5tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGE7CiAgICAgICAgc3VpdGUucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdUZXN0Jyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVTdWl0ZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignU3VpdGUnKTsKICAgICAgICBzdWl0ZS5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXTsKICAgICAgICBzdWl0ZS5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSBmdW5jdGlvbiAoY2FsbGFibGUpIHsgY2FsbGFibGUoKTsgfTsKICAgICAgICBzdWl0ZS5tZXNzYWdlID0gZGF0YS5tZXNzYWdlOwogICAgICAgIHN1aXRlLmNoaWxkcmVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc3VpdGUua2V5d29yZHMoKS5jb25jYXQoc3VpdGUudGVzdHMoKSkuY29uY2F0KHN1aXRlLnN1aXRlcygpKTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLnNlYXJjaFRlc3RzID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkgewogICAgICAgICAgICB2YXIgdGVzdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHN1aXRlcyA9IHRoaXMuc3VpdGVzKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc3VpdGVzKQogICAgICAgICAgICAgICAgdGVzdHMgPSB0ZXN0cy5jb25jYXQoc3VpdGVzW2ldLnNlYXJjaFRlc3RzKHByZWRpY2F0ZSkpOwogICAgICAgICAgICByZXR1cm4gdGVzdHMuY29uY2F0KHV0aWwuZmlsdGVyKHRoaXMudGVzdHMoKSwgcHJlZGljYXRlKSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5zZWFyY2hUZXN0c0luU3VpdGUgPSBmdW5jdGlvbiAocGF0dGVybiwgbWF0Y2hlcikgewogICAgICAgICAgICBpZiAoIW1hdGNoZXIpCiAgICAgICAgICAgICAgICBtYXRjaGVyID0gdXRpbC5NYXRjaGVyKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzQW55KFtzdWl0ZS5mdWxsTmFtZSwgc3VpdGUubmFtZV0pKQogICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlLmFsbFRlc3RzKCk7CiAgICAgICAgICAgIHZhciB0ZXN0cyA9IFtdOwogICAgICAgICAgICB2YXIgc3VpdGVzID0gdGhpcy5zdWl0ZXMoKTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzdWl0ZXMpCiAgICAgICAgICAgICAgICB0ZXN0cyA9IHRlc3RzLmNvbmNhdChzdWl0ZXNbaV0uc2VhcmNoVGVzdHNJblN1aXRlKHBhdHRlcm4sIG1hdGNoZXIpKTsKICAgICAgICAgICAgcmV0dXJuIHRlc3RzOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuc2VhcmNoVGVzdHNCeVRhZyA9IGZ1bmN0aW9uICh0YWcpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICBpZiAodGFnLmluZm8gPT0gImNyaXRpY2FsIiB8fCB0YWcuaW5mbyA9PSAibm9uLWNyaXRpY2FsIikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3QudGFncywgdGFnLmxhYmVsKTsKICAgICAgICAgICAgICAgIGlmICh0YWcuY29tYmluZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnUGF0dGVybih0ZXN0LnRhZ3MsIHRhZy5jb21iaW5lZCk7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWcodGVzdC50YWdzLCB0YWcubGFiZWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLmZpbmRTdWl0ZUJ5TmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuYWxsVGVzdHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBzdWl0ZS5zZWFyY2hUZXN0cyhmdW5jdGlvbiAodGVzdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuY3JpdGljYWxUZXN0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5pc0NyaXRpY2FsOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRhaW5zVGFnKHRlc3RUYWdzLCB0YWduYW1lKSB7CiAgICAgICAgdGVzdFRhZ3MgPSB1dGlsLm1hcCh0ZXN0VGFncywgdXRpbC5ub3JtYWxpemUpOwogICAgICAgIHJldHVybiB1dGlsLmNvbnRhaW5zKHRlc3RUYWdzLCB1dGlsLm5vcm1hbGl6ZSh0YWduYW1lKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHBhdHRlcm4pIHsKICAgICAgICB2YXIgcGF0dGVybnM7CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignTk9UJykgIT0gLTEpIHsKICAgICAgICAgICAgcGF0dGVybnMgPSBwYXR0ZXJuLnNwbGl0KCdOT1QnKTsKICAgICAgICAgICAgaWYgKCF1dGlsLm5vcm1hbGl6ZShwYXR0ZXJuc1swXSkpCiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5hbGwodXRpbC5tYXAocGF0dGVybnMuc2xpY2UoMSksIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwYXR0ZXJuc1swXSkgJiYKICAgICAgICAgICAgICAgIHV0aWwuYWxsKHV0aWwubWFwKHBhdHRlcm5zLnNsaWNlKDEpLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignT1InKSAhPSAtMSkgewogICAgICAgICAgICBwYXR0ZXJucyA9IHBhdHRlcm4uc3BsaXQoJ09SJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFueSh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ0FORCcpICE9IC0xKSB7CiAgICAgICAgICAgIHBhdHRlcm5zID0gcGF0dGVybi5zcGxpdCgnQU5EJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFsbCh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1dGlsLk1hdGNoZXIocGF0dGVybikubWF0Y2hlc0FueSh0ZXN0VGFncyk7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpIHsKICAgICAgICBpZiAoc3VpdGUuZnVsbE5hbWUgPT0gbmFtZSkKICAgICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgICAgIHZhciBzdWJTdWl0ZXMgPSBzdWl0ZS5zdWl0ZXMoKTsKICAgICAgICBmb3IgKHZhciBpIGluIHN1YlN1aXRlcykgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmaW5kU3VpdGVCeU5hbWUoc3ViU3VpdGVzW2ldLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG1hdGNoKQogICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0YXRzKHN1aXRlLCBzdGF0cykgewogICAgICAgIGZvciAodmFyIG5hbWUgaW4gc3RhdHMpIHsKICAgICAgICAgICAgc3VpdGVbbmFtZV0gPSBzdGF0c1tuYW1lXTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNb2RlbE9iamVjdChkYXRhKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lLAogICAgICAgICAgICBkb2M6IGRhdGEuZG9jLAogICAgICAgICAgICBzdGF0dXM6IGRhdGEuc3RhdHVzLAogICAgICAgICAgICB0aW1lczogZGF0YS50aW1lcywKICAgICAgICAgICAgaWQ6IGRhdGEucGFyZW50ID8gZGF0YS5wYXJlbnQuaWQgKyAnLScgKyBkYXRhLmlkIDogZGF0YS5pZAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUZXN0KGRhdGEpIHsKICAgICAgICB2YXIgdGVzdCA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIHRlc3QuZnVsbE5hbWUgPSBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIHRlc3QubmFtZTsKICAgICAgICB0ZXN0LmZvcm1hdFBhcmVudE5hbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB1dGlsLmZvcm1hdFBhcmVudE5hbWUodGVzdCk7IH07CiAgICAgICAgdGVzdC50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIHRlc3QucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgdGVzdC5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJ107CiAgICAgICAgdGVzdC5pc0NoaWxkcmVuTG9hZGVkID0gZGF0YS5pc0NoaWxkcmVuTG9hZGVkOwogICAgICAgIHRlc3QuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHRlc3QpOwogICAgICAgIHRlc3QuY2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0ZXN0LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5rZXl3b3JkcygpOwogICAgICAgIH07CiAgICAgICAgdGVzdC5pc0NyaXRpY2FsID0gZGF0YS5pc0NyaXRpY2FsOwogICAgICAgIHRlc3QudGFncyA9IGRhdGEudGFnczsKICAgICAgICB0ZXN0Lm1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7CiAgICAgICAgdGVzdC5tYXRjaGVzVGFnUGF0dGVybiA9IGZ1bmN0aW9uIChwYXR0ZXJuKSB7CiAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdC50YWdzLCBwYXR0ZXJuKTsKICAgICAgICB9OwogICAgICAgIHRlc3QubWF0Y2hlc05hbWVQYXR0ZXJuID0gZnVuY3Rpb24gKHBhdHRlcm4pIHsKICAgICAgICAgICAgcmV0dXJuIHV0aWwuTWF0Y2hlcihwYXR0ZXJuKS5tYXRjaGVzQW55KFt0ZXN0Lm5hbWUsIHRlc3QuZnVsbE5hbWVdKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiB0ZXN0OwogICAgfQogICAgZnVuY3Rpb24gS2V5d29yZChkYXRhKSB7CiAgICAgICAgdmFyIGt3ID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAga3cubGlibmFtZSA9IGRhdGEubGlibmFtZTsKICAgICAgICBrdy50eXBlID0gZGF0YS50eXBlOwogICAgICAgIGt3LmFyZ3VtZW50cyA9IGRhdGEuYXJnczsKICAgICAgICBrdy5hc3NpZ24gPSBkYXRhLmFzc2lnbiArIChkYXRhLmFzc2lnbiA/ICcgPScgOiAnJyk7CiAgICAgICAga3cudGFncyA9IGRhdGEudGFnczsKICAgICAgICBrdy50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIGt3LnBvcHVsYXRlTWVzc2FnZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignTWVzc2FnZScpOwogICAgICAgIGt3LnBvcHVsYXRlS2V5d29yZHMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignS2V5d29yZCcpOwogICAgICAgIGt3LmNoaWxkcmVuTmFtZXMgPSBbJ2tleXdvcmQnLCAnbWVzc2FnZSddOwogICAgICAgIGt3LmlzQ2hpbGRyZW5Mb2FkZWQgPSBkYXRhLmlzQ2hpbGRyZW5Mb2FkZWQ7CiAgICAgICAga3cuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKGt3KTsKICAgICAgICBrdy5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGt3LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4ga3cua2V5d29yZHMoKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBrdzsKICAgIH0KICAgIGZ1bmN0aW9uIE1lc3NhZ2UobGV2ZWwsIGRhdGUsIHRleHQsIGxpbmspIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsZXZlbDogbGV2ZWwsCiAgICAgICAgICAgIHRpbWU6IHV0aWwudGltZUZyb21EYXRlKGRhdGUpLAogICAgICAgICAgICBkYXRlOiB1dGlsLmRhdGVGcm9tRGF0ZShkYXRlKSwKICAgICAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICAgICAgbGluazogbGluawogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUaW1lcyh0aW1lZGF0YSkgewogICAgICAgIHZhciBzdGFydCA9IHRpbWVkYXRhWzBdOwogICAgICAgIHZhciBlbmQgPSB0aW1lZGF0YVsxXTsKICAgICAgICB2YXIgZWxhcHNlZCA9IHRpbWVkYXRhWzJdOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGVsYXBzZWRNaWxsaXM6IGVsYXBzZWQsCiAgICAgICAgICAgIGVsYXBzZWRUaW1lOiB1dGlsLmZvcm1hdEVsYXBzZWQoZWxhcHNlZCksCiAgICAgICAgICAgIHN0YXJ0VGltZTogdXRpbC5kYXRlVGltZUZyb21EYXRlKHN0YXJ0KSwKICAgICAgICAgICAgZW5kVGltZTogIHV0aWwuZGF0ZVRpbWVGcm9tRGF0ZShlbmQpCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKG5hbWUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHBvcHVsYXRvcikgewogICAgICAgICAgICBwb3B1bGF0ZUl0ZXJhYmxlKHRoaXMsIG5hbWUsIHBvcHVsYXRvcik7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvcHVsYXRlSXRlcmFibGUob2JqLCBuYW1lLCBwb3B1bGF0b3IpIHsKICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpICsgJ3MnOwogICAgICAgIG9ialtuYW1lXSA9IGNyZWF0ZUdldEFsbEZ1bmN0aW9uKHBvcHVsYXRvci5udW1iZXJPZkl0ZW1zLCBwb3B1bGF0b3IuY3JlYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZXRBbGxGdW5jdGlvbihudW1iZXJPZkVsZW1lbnRzLCBjcmVhdG9yKSB7CiAgICAgICAgdmFyIGNhY2hlZCA9IG51bGw7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGNhY2hlZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FjaGVkID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bWJlck9mRWxlbWVudHMoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVkLnB1c2goY3JlYXRvcihpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBTdWl0ZTogU3VpdGUsCiAgICAgICAgVGVzdDogVGVzdCwKICAgICAgICBLZXl3b3JkOiBLZXl3b3JkLAogICAgICAgIE1lc3NhZ2U6IE1lc3NhZ2UsCiAgICAgICAgVGltZXM6IFRpbWVzLAogICAgICAgIGNvbnRhaW5zVGFnOiBjb250YWluc1RhZywgIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICAgICAgY29udGFpbnNUYWdQYXR0ZXJuOiBjb250YWluc1RhZ1BhdHRlcm4gIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICB9Owp9KCkpOwp3aW5kb3cuc3RhdHMgPSAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gU3RhdGlzdGljcyh0b3RhbEVsZW1zLCB0YWdFbGVtcywgc3VpdGVFbGVtcykgewogICAgICAgIHJldHVybiB7dG90YWw6IHV0aWwubWFwKHRvdGFsRWxlbXMsIHRvdGFsU3RhdEVsZW0pLAogICAgICAgICAgICAgICAgdGFnOiAgIHV0aWwubWFwKHRhZ0VsZW1zLCB0YWdTdGF0RWxlbSksCiAgICAgICAgICAgICAgICBzdWl0ZTogdXRpbC5tYXAoc3VpdGVFbGVtcywgc3VpdGVTdGF0RWxlbSl9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdEVsZW0oc3RhdCkgewogICAgICAgIHN0YXQudG90YWwgPSBzdGF0LnBhc3MgKyBzdGF0LmZhaWw7CiAgICAgICAgdmFyIHBlcmNlbnRzID0gY2FsY3VsYXRlUGVyY2VudHMoc3RhdC50b3RhbCwgc3RhdC5wYXNzLCBzdGF0LmZhaWwpOwogICAgICAgIHN0YXQucGFzc1BlcmNlbnQgPSBwZXJjZW50c1swXTsKICAgICAgICBzdGF0LmZhaWxQZXJjZW50ID0gcGVyY2VudHNbMV07CiAgICAgICAgdmFyIHdpZHRocyA9IGNhbGN1bGF0ZVdpZHRocyhzdGF0LnBhc3NQZXJjZW50LCBzdGF0LmZhaWxQZXJjZW50KTsKICAgICAgICBzdGF0LnBhc3NXaWR0aCA9IHdpZHRoc1swXTsKICAgICAgICBzdGF0LmZhaWxXaWR0aCA9IHdpZHRoc1sxXTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHRvdGFsU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC50eXBlID0gc3RhdC5sYWJlbCA9PSAnQ3JpdGljYWwgVGVzdHMnID8gJ2NyaXRpY2FsJyA6ICdhbGwnOwogICAgICAgIHJldHVybiBzdGF0OwogICAgfQogICAgZnVuY3Rpb24gdGFnU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC5saW5rcyA9IHBhcnNlTGlua3Moc3RhdC5saW5rcyk7CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRFbGVtKGRhdGEpIHsKICAgICAgICB2YXIgc3RhdCA9IHN0YXRFbGVtKGRhdGEpOwogICAgICAgIHN0YXQuZnVsbE5hbWUgPSBzdGF0LmxhYmVsOwogICAgICAgIHN0YXQuZm9ybWF0UGFyZW50TmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWwuZm9ybWF0UGFyZW50TmFtZShzdGF0KTsgfTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTGlua3MobGlua3NEYXRhKSB7CiAgICAgICAgaWYgKCFsaW5rc0RhdGEpCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICByZXR1cm4gdXRpbC5tYXAobGlua3NEYXRhLnNwbGl0KCc6OjonKSwgZnVuY3Rpb24gKGxpbmspIHsKICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGxpbmsuaW5kZXhPZignOicpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt0aXRsZTogbGluay5zbGljZSgwLCBpbmRleCksIHVybDogbGluay5zbGljZShpbmRleCsxKX07CiAgICAgICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gY2FsY3VsYXRlUGVyY2VudHModG90YWwsIHBhc3NlZCwgZmFpbGVkKSB7CiAgICAgICAgaWYgKHRvdGFsID09IDApCiAgICAgICAgICAgIHJldHVybiBbMC4wLCAwLjBdOwogICAgICAgIHZhciBwYXNzID0gMTAwLjAgKiBwYXNzZWQgLyB0b3RhbDsKICAgICAgICB2YXIgZmFpbCA9IDEwMC4wICogZmFpbGVkIC8gdG90YWw7CiAgICAgICAgaWYgKHBhc3MgPiAwICYmIHBhc3MgPCAwLjEpCiAgICAgICAgICAgIHJldHVybiBbMC4xLCA5OS45XTsKICAgICAgICBpZiAoZmFpbCA+IDAgJiYgZmFpbCA8IDAuMSkKICAgICAgICAgICAgcmV0dXJuIFs5OS45LCAwLjFdOwogICAgICAgIHJldHVybiBbTWF0aC5yb3VuZChwYXNzKjEwKS8xMCwgTWF0aC5yb3VuZChmYWlsKjEwKS8xMF07CiAgICB9CiAgICBmdW5jdGlvbiBjYWxjdWxhdGVXaWR0aHMobnVtMSwgbnVtMikgewogICAgICAgIGlmIChudW0xICsgbnVtMiA9PSAwKQogICAgICAgICAgICByZXR1cm4gWzAuMCwgMC4wXTsKICAgICAgICAvLyBNYWtlIHNtYWxsIHBlcmNlbnRhZ2VzIGJldHRlciB2aXNpYmxlCiAgICAgICAgaWYgKG51bTEgPiAwICYmIG51bTEgPCAxKQogICAgICAgICAgICByZXR1cm4gWzEuMCwgOTkuMF07CiAgICAgICAgaWYgKG51bTIgPiAwICYmIG51bTIgPCAxKQogICAgICAgICAgICByZXR1cm4gWzk5LjAsIDEuMF07CiAgICAgICAgLy8gSGFuZGxlIHNpdHVhdGlvbiB3aGVyZSBib3RoIGFyZSByb3VuZGVkIHVwCiAgICAgICAgd2hpbGUgKG51bTEgKyBudW0yID4gMTAwKSB7CiAgICAgICAgICAgIGlmIChudW0xID4gbnVtMikKICAgICAgICAgICAgICAgIG51bTEgLT0gMC4xOwogICAgICAgICAgICBpZiAobnVtMiA+IG51bTEpCiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtudW0xLCBudW0yXTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgU3RhdGlzdGljczogU3RhdGlzdGljcwogICAgfTsKfSgpKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LnV0aWwgPSBmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBtYXAoZWxlbXMsIGZ1bmMpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIHJldFtpXSA9IGZ1bmMoZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gZmlsdGVyKGVsZW1zLCBwcmVkaWNhdGUpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbXNbaV0pKQogICAgICAgICAgICAgICAgcmV0LnB1c2goZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gYWxsKGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmICghZWxlbXNbaV0pCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYW55KGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChlbGVtc1tpXSkKICAgICAgICAgICAgICAgIHJldHVybiBlbGVtc1tpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gY29udGFpbnMoZWxlbXMsIGUpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgaWYgKGVsZW1zW2ldID09IGUpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gbGFzdChpdGVtcykgewogICAgICAgIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGgtMV07CiAgICB9CiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyZsdDsvZywgJzwnKS5yZXBsYWNlKC8mZ3Q7L2csICc+JykucmVwbGFjZSgvJmFtcDsvZywgJyYnKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTsKICAgIH0KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnJykucmVwbGFjZSgvXy9nLCAnJyk7CiAgICB9CiAgICBmdW5jdGlvbiByZWdleHBFc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLVtcXXt9KCkrPyouLFxcXiR8I10vZywgIlxcJCYiKTsKICAgIH0KICAgIGZ1bmN0aW9uIE1hdGNoZXIocGF0dGVybikgewogICAgICAgIHBhdHRlcm4gPSByZWdleHBFc2NhcGUobm9ybWFsaXplKHBhdHRlcm4pKTsKICAgICAgICB2YXIgcmVQYXR0ZXJuID0gJ14nICsgcGF0dGVybi5yZXBsYWNlKC9cXFw/L2csICcuJykucmVwbGFjZSgvXFxcKi9nLCAnW1xcc1xcU10qJykgKyAnJCc7CiAgICAgICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAocmVQYXR0ZXJuKTsKICAgICAgICBmdW5jdGlvbiBtYXRjaGVzKHN0cmluZykgewogICAgICAgICAgICByZXR1cm4gcmVnZXhwLnRlc3Qobm9ybWFsaXplKHN0cmluZykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBtYXRjaGVzOiBtYXRjaGVzLAogICAgICAgICAgICBtYXRjaGVzQW55OiBmdW5jdGlvbiAoc3RyaW5ncykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspCiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMoc3RyaW5nc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdFBhcmVudE5hbWUoaXRlbSkgewogICAgICAgIHZhciBwYXJlbnROYW1lID0gaXRlbS5mdWxsTmFtZS5zbGljZSgwLCBpdGVtLmZ1bGxOYW1lLmxlbmd0aCAtIGl0ZW0ubmFtZS5sZW5ndGgpOwogICAgICAgIHJldHVybiBwYXJlbnROYW1lLnJlcGxhY2UoL1wuL2csICcgLiAnKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRpbWVGcm9tRGF0ZShkYXRlKSB7CiAgICAgICAgaWYgKCFkYXRlKQogICAgICAgICAgICByZXR1cm4gJ04vQSc7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlLmdldFNlY29uZHMoKSwgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlRnJvbURhdGUoZGF0ZSkgewogICAgICAgIGlmICghZGF0ZSkKICAgICAgICAgICAgcmV0dXJuICdOL0EnOwogICAgICAgIHJldHVybiBwYWRUbyhkYXRlLmdldEZ1bGxZZWFyKCksIDQpICsKICAgICAgICAgICAgICAgcGFkVG8oZGF0ZS5nZXRNb250aCgpICsgMSwgMikgKwogICAgICAgICAgICAgICBwYWRUbyhkYXRlLmdldERhdGUoKSwgMik7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlVGltZUZyb21EYXRlKGRhdGUpIHsKICAgICAgICBpZiAoIWRhdGUpCiAgICAgICAgICAgIHJldHVybiAnTi9BJzsKICAgICAgICByZXR1cm4gZGF0ZUZyb21EYXRlKGRhdGUpICsgJyAnICsgdGltZUZyb21EYXRlKGRhdGUpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0VGltZShob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzKSB7CiAgICAgICAgcmV0dXJuIHBhZFRvKGhvdXJzLCAyKSArICc6JyArCiAgICAgICAgICAgICAgIHBhZFRvKG1pbnV0ZXMsIDIpICsgJzonICsKICAgICAgICAgICAgICAgcGFkVG8oc2Vjb25kcywgMikgKyAnLicgKwogICAgICAgICAgICAgICBwYWRUbyhtaWxsaXNlY29uZHMsIDMpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0RWxhcHNlZChlbGFwc2VkKSB7CiAgICAgICAgdmFyIG1pbGxpcyA9IGVsYXBzZWQ7CiAgICAgICAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAoNjAgKiA2MCAqIDEwMDApKTsKICAgICAgICBtaWxsaXMgLT0gaG91cnMgKiA2MCAqIDYwICogMTAwMDsKICAgICAgICB2YXIgbWludXRlcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gKDYwICogMTAwMCkpOwogICAgICAgIG1pbGxpcyAtPSBtaW51dGVzICogNjAgKiAxMDAwOwogICAgICAgIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAxMDAwKTsKICAgICAgICBtaWxsaXMgLT0gc2Vjb25kcyAqIDEwMDA7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpcyk7CiAgICB9CiAgICBmdW5jdGlvbiBwYWRUbyhudW1iZXIsIGxlbikgewogICAgICAgIHZhciBudW1TdHJpbmcgPSBudW1iZXIgKyAiIjsKICAgICAgICB3aGlsZSAobnVtU3RyaW5nLmxlbmd0aCA8IGxlbikgbnVtU3RyaW5nID0gIjAiICsgbnVtU3RyaW5nOwogICAgICAgIHJldHVybiBudW1TdHJpbmc7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lc3RhbXAobWlsbGlzKSB7CiAgICAgICAgLy8gdXNlZCBhbHNvIGJ5IHRvb2xzIHRoYXQgZG8gbm90IHNldCB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMKICAgICAgICB2YXIgYmFzZSA9IHdpbmRvdy5vdXRwdXQgPyB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMgOiAwOwogICAgICAgIHJldHVybiBuZXcgRGF0ZShiYXNlICsgbWlsbGlzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZFN0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7CiAgICAgICAgdmFyIGR0ID0gZGF0ZVRpbWVGcm9tRGF0ZShkYXRlKS5zbGljZSgwLCAxNyk7ICAvLyBkcm9wIG1pbGxpcwogICAgICAgIHZhciBvZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgICAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnOwogICAgICAgIHZhciBoaCA9IE1hdGguZmxvb3IoTWF0aC5hYnMob2Zmc2V0KSAvIDYwKTsKICAgICAgICB2YXIgbW0gPSBNYXRoLmFicyhvZmZzZXQpICUgNjA7CiAgICAgICAgcmV0dXJuIGR0ICsgJyBVVEMnICsgc2lnbiArIHBhZFRvKGhoLCAyKSArICc6JyArIHBhZFRvKG1tLCAyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICBmdW5jdGlvbiB0aW1lU3RyaW5nKHRpbWUsIHNob3J0VW5pdCkgewogICAgICAgICAgICB2YXIgdW5pdCA9IHt5OiAneWVhcicsIGQ6ICdkYXknLCBoOiAnaG91cicsIG06ICdtaW51dGUnLAogICAgICAgICAgICAgICAgICAgICAgICBzOiAnc2Vjb25kJ31bc2hvcnRVbml0XTsKICAgICAgICAgICAgdmFyIGVuZCA9IHRpbWUgPT0gMSA/ICcgJyA6ICdzICc7CiAgICAgICAgICAgIHJldHVybiB0aW1lICsgJyAnICsgdW5pdCArIGVuZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY29tcGVuc2F0ZUxlYXBZZWFycyhkYXlzLCB5ZWFycykgewogICAgICAgICAgICAvLyBOb3QgYSBwZXJmZWN0IGFsZ29yaXRobSBidXQgb3VnaHQgdG8gYmUgZW5vdWdoCiAgICAgICAgICAgIHJldHVybiBkYXlzIC0gTWF0aC5mbG9vcih5ZWFycyAvIDQpOwogICAgICAgIH0KICAgICAgICB2YXIgZ2VuZXJhdGVkID0gTWF0aC5yb3VuZCh0aW1lc3RhbXAgLyAxMDAwKTsKICAgICAgICB2YXIgY3VycmVudCA9IE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTsKICAgICAgICB2YXIgZWxhcHNlZCA9IGN1cnJlbnQgLSBnZW5lcmF0ZWQ7CiAgICAgICAgdmFyIHByZWZpeCA9ICcnOwogICAgICAgIGlmIChlbGFwc2VkIDwgMCkgewogICAgICAgICAgICBwcmVmaXggPSAnLSAnOwogICAgICAgICAgICBlbGFwc2VkID0gTWF0aC5hYnMoZWxhcHNlZCk7CiAgICAgICAgfQogICAgICAgIHZhciBzZWNzICA9IGVsYXBzZWQgJSA2MDsKICAgICAgICB2YXIgbWlucyAgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyA2MCkgJSA2MDsKICAgICAgICB2YXIgaG91cnMgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjApKSAlIDI0OwogICAgICAgIHZhciBkYXlzICA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCkpICUgMzY1OwogICAgICAgIHZhciB5ZWFycyA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCozNjUpKTsKICAgICAgICBpZiAoeWVhcnMpIHsKICAgICAgICAgICAgZGF5cyA9IGNvbXBlbnNhdGVMZWFwWWVhcnMoZGF5cywgeWVhcnMpOwogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyh5ZWFycywgJ3knKSArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKTsKICAgICAgICB9IGVsc2UgaWYgKGRheXMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKSArIHRpbWVTdHJpbmcoaG91cnMsICdoJyk7CiAgICAgICAgfSBlbHNlIGlmIChob3VycykgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhob3VycywgJ2gnKSArIHRpbWVTdHJpbmcobWlucywgJ20nKTsKICAgICAgICB9IGVsc2UgaWYgKG1pbnMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcobWlucywgJ20nKSArIHRpbWVTdHJpbmcoc2VjcywgJ3MnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhzZWNzLCAncycpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmcocXVlcnkpIHsKICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgaWYgKCFxdWVyeSkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB2YXIgcGFyYW1zID0gcXVlcnkuc3BsaXQoJyYnKTsKICAgICAgICB2YXIgcGFydHM7CiAgICAgICAgZnVuY3Rpb24gZGVjb2RlKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpdGVtLnJlcGxhY2UoJysnLCAnICcpKTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcmFtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBwYXJ0cyA9IHBhcmFtc1tpXS5zcGxpdCgnPScpOwogICAgICAgICAgICByZXN1bHRbZGVjb2RlKHBhcnRzLnNoaWZ0KCkpXSA9IGRlY29kZShwYXJ0cy5qb2luKCc9JykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBtYXA6IG1hcCwKICAgICAgICBmaWx0ZXI6IGZpbHRlciwKICAgICAgICBhbGw6IGFsbCwKICAgICAgICBhbnk6IGFueSwKICAgICAgICBjb250YWluczogY29udGFpbnMsCiAgICAgICAgbGFzdDogbGFzdCwKICAgICAgICBlc2NhcGU6IGVzY2FwZSwKICAgICAgICB1bmVzY2FwZTogdW5lc2NhcGUsCiAgICAgICAgbm9ybWFsaXplOiBub3JtYWxpemUsCiAgICAgICAgcmVnZXhwRXNjYXBlOiByZWdleHBFc2NhcGUsCiAgICAgICAgTWF0Y2hlcjogTWF0Y2hlciwKICAgICAgICBmb3JtYXRQYXJlbnROYW1lOiBmb3JtYXRQYXJlbnROYW1lLAogICAgICAgIHRpbWVGcm9tRGF0ZTogdGltZUZyb21EYXRlLAogICAgICAgIGRhdGVGcm9tRGF0ZTogZGF0ZUZyb21EYXRlLAogICAgICAgIGRhdGVUaW1lRnJvbURhdGU6IGRhdGVUaW1lRnJvbURhdGUsCiAgICAgICAgZm9ybWF0RWxhcHNlZDogZm9ybWF0RWxhcHNlZCwKICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRTdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZFN0cmluZywKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZywKICAgICAgICBwYXJzZVF1ZXJ5U3RyaW5nOiBwYXJzZVF1ZXJ5U3RyaW5nCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy50ZXN0ZGF0YSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBlbGVtZW50c0J5SWQgPSB7fTsKICAgIHZhciBpZENvdW50ZXIgPSAwOwogICAgdmFyIF9zdGF0aXN0aWNzID0gbnVsbDsKICAgIHZhciBMRVZFTFMgPSBbJ1RSQUNFJywgJ0RFQlVHJywgJ0lORk8nLCAnV0FSTicsICdFUlJPUicsICdGQUlMJ107CiAgICB2YXIgU1RBVFVTRVMgPSBbJ0ZBSUwnLCAnUEFTUycsICdOT1RfUlVOJ107CiAgICB2YXIgS0VZV09SRFMgPSBbJ0tFWVdPUkQnLCAnU0VUVVAnLCAnVEVBUkRPV04nLCAnRk9SJywgJ1ZBUiddOwogICAgZnVuY3Rpb24gYWRkRWxlbWVudChlbGVtKSB7CiAgICAgICAgaWYgKCFlbGVtLmlkKQogICAgICAgICAgICBlbGVtLmlkID0gdW5pcXVlSWQoKTsKICAgICAgICBlbGVtZW50c0J5SWRbZWxlbS5pZF0gPSBlbGVtOwogICAgICAgIHJldHVybiBlbGVtOwogICAgfQogICAgZnVuY3Rpb24gdW5pcXVlSWQoKSB7CiAgICAgICAgaWRDb3VudGVyKys7CiAgICAgICAgcmV0dXJuICdlbGVtZW50LWlkLScgKyBpZENvdW50ZXI7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lcyhzdGF0cykgewogICAgICAgIHZhciBzdGFydE1pbGxpcyA9IHN0YXRzWzFdOwogICAgICAgIHZhciBlbGFwc2VkID0gc3RhdHNbMl07CiAgICAgICAgaWYgKHN0YXJ0TWlsbGlzID09PSBudWxsKQogICAgICAgICAgICByZXR1cm4gW251bGwsIG51bGwsIGVsYXBzZWRdOwogICAgICAgIHJldHVybiBbdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMpLAogICAgICAgICAgICAgICAgdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMgKyBlbGFwc2VkKSwKICAgICAgICAgICAgICAgIGVsYXBzZWRdOwogICAgfQogICAgZnVuY3Rpb24gbWVzc2FnZShlbGVtZW50LCBzdHJpbmdzKSB7CiAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQobW9kZWwuTWVzc2FnZShMRVZFTFNbZWxlbWVudFsxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnRpbWVzdGFtcChlbGVtZW50WzBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncy5nZXQoZWxlbWVudFszXSkpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlU3RhdHVzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIFNUQVRVU0VTW3N0YXRzWzBdXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoaWxkQ3JlYXRvcihwYXJlbnQsIGNoaWxkVHlwZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoZWxlbSwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQoY2hpbGRUeXBlKHBhcmVudCwgZWxlbSwgc3RyaW5ncywgaW5kZXgpKTsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlS2V5d29yZChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIGt3ID0gbW9kZWwuS2V5d29yZCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICB0eXBlOiBLRVlXT1JEU1tlbGVtZW50WzBdXSwKICAgICAgICAgICAgaWQ6ICdrJyArIChpbmRleCArIDEpLAogICAgICAgICAgICBuYW1lOiBzdHJpbmdzLmdldChlbGVtZW50WzFdKSwKICAgICAgICAgICAgbGlibmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFsyXSksCiAgICAgICAgICAgIHRpbWVvdXQ6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pLAogICAgICAgICAgICBhcmdzOiBzdHJpbmdzLmdldChlbGVtZW50WzVdKSwKICAgICAgICAgICAgYXNzaWduOiBzdHJpbmdzLmdldChlbGVtZW50WzZdKSwKICAgICAgICAgICAgdGFnczogc3RyaW5ncy5nZXQoZWxlbWVudFs3XSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbNF0pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzdGF0dXM6IHBhcnNlU3RhdHVzKGVsZW1lbnRbOF0sIHN0cmluZ3MpLAogICAgICAgICAgICB0aW1lczogbW9kZWwuVGltZXModGltZXMoZWxlbWVudFs4XSkpLAogICAgICAgICAgICBpc0NoaWxkcmVuTG9hZGVkOiB0eXBlb2YoZWxlbWVudFs5XSkgIT09ICdudW1iZXInCiAgICAgICAgfSk7CiAgICAgICAgbGF6eVBvcHVsYXRlS2V5d29yZHNGcm9tRmlsZShrdywgZWxlbWVudFs5XSwgc3RyaW5ncyk7CiAgICAgICAga3cucG9wdWxhdGVNZXNzYWdlcyhQb3B1bGF0b3IoZWxlbWVudFsxMF0sIHN0cmluZ3MsIG1lc3NhZ2UpKTsKICAgICAgICByZXR1cm4ga3c7CiAgICB9CiAgICBmdW5jdGlvbiBsYXp5UG9wdWxhdGVLZXl3b3Jkc0Zyb21GaWxlKHBhcmVudCwgbW9kZWxPckluZGV4LCBzdHJpbmdzKSB7CiAgICAgICAgdmFyIG1vZGVsLCBpbmRleCwgcG9wdWxhdG9yOwogICAgICAgIHZhciBjcmVhdG9yID0gY2hpbGRDcmVhdG9yKHBhcmVudCwgY3JlYXRlS2V5d29yZCk7CiAgICAgICAgaWYgKHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkKSB7CiAgICAgICAgICAgIG1vZGVsID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwb3B1bGF0b3IgPSBQb3B1bGF0b3IobW9kZWwsIHN0cmluZ3MsIGNyZWF0b3IpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluZGV4ID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwYXJlbnQuY2hpbGRGaWxlTmFtZSA9IHdpbmRvdy5zZXR0aW5nc1snc3BsaXRMb2dCYXNlJ10gKyAnLScgKyBpbmRleCArICcuanMnOwogICAgICAgICAgICBwb3B1bGF0b3IgPSBTcGxpdExvZ1BvcHVsYXRvcihpbmRleCwgY3JlYXRvcik7CiAgICAgICAgfQogICAgICAgIHBhcmVudC5wb3B1bGF0ZUtleXdvcmRzKHBvcHVsYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiB0YWdzKHRhZ2xpc3QsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gdXRpbC5tYXAodGFnbGlzdCwgc3RyaW5ncy5nZXQpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlVGVzdChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1c0VsZW1lbnQgPSBlbGVtZW50WzVdOwogICAgICAgIHZhciB0ZXN0ID0gbW9kZWwuVGVzdCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICBpZDogJ3QnICsgKGluZGV4ICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzNdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZW91dDogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIGlzQ3JpdGljYWw6IGVsZW1lbnRbMl0sCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoc3RhdHVzRWxlbWVudCksCiAgICAgICAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBtc2cgPSBjcmVhdGVNZXNzYWdlKHN0YXR1c0VsZW1lbnQsIHN0cmluZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbXNnOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKHN0YXR1c0VsZW1lbnQpKSwKICAgICAgICAgICAgdGFnczogdGFncyhlbGVtZW50WzRdLCBzdHJpbmdzKSwKICAgICAgICAgICAgaXNDaGlsZHJlbkxvYWRlZDogdHlwZW9mKGVsZW1lbnRbNl0pICE9PSAnbnVtYmVyJwogICAgICAgIH0pOwogICAgICAgIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUodGVzdCwgZWxlbWVudFs2XSwgc3RyaW5ncyk7CiAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNZXNzYWdlKHN0YXR1c0VsZW1lbnQsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gc3RhdHVzRWxlbWVudC5sZW5ndGggPT0gNCA/IHN0cmluZ3MuZ2V0KHN0YXR1c0VsZW1lbnRbM10pIDogJyc7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVTdWl0ZShwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1c0VsZW1lbnQgPSBlbGVtZW50WzVdOwogICAgICAgIHZhciBzdWl0ZSA9IG1vZGVsLlN1aXRlKHsKICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgICAgIGlkOiAncycgKyAoKGluZGV4IHx8IDApICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBzb3VyY2U6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMV0pLAogICAgICAgICAgICByZWxhdGl2ZVNvdXJjZTogc3RyaW5ncy5nZXQoZWxlbWVudFsyXSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzdGF0dXM6IHBhcnNlU3RhdHVzKHN0YXR1c0VsZW1lbnQpLAogICAgICAgICAgICBtZXNzYWdlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbXNnID0gY3JlYXRlTWVzc2FnZShzdGF0dXNFbGVtZW50LCBzdHJpbmdzKTsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1zZzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhzdGF0dXNFbGVtZW50KSksCiAgICAgICAgICAgIHN0YXRpc3RpY3M6IHN1aXRlU3RhdHModXRpbC5sYXN0KGVsZW1lbnQpKSwKICAgICAgICAgICAgbWV0YWRhdGE6IHBhcnNlTWV0YWRhdGEoZWxlbWVudFs0XSwgc3RyaW5ncykKICAgICAgICB9KTsKICAgICAgICBzdWl0ZS5wb3B1bGF0ZUtleXdvcmRzKFBvcHVsYXRvcihlbGVtZW50WzhdLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZUtleXdvcmQpKSk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyhQb3B1bGF0b3IoZWxlbWVudFs3XSwgc3RyaW5ncywgY2hpbGRDcmVhdG9yKHN1aXRlLCBjcmVhdGVUZXN0KSkpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlU3VpdGVzKFBvcHVsYXRvcihlbGVtZW50WzZdLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZVN1aXRlKSkpOwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTWV0YWRhdGEoZGF0YSwgc3RyaW5ncykgewogICAgICAgIHZhciBtZXRhZGF0YSA9IFtdOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxkYXRhLmxlbmd0aDsgaSs9MikgewogICAgICAgICAgICBtZXRhZGF0YS5wdXNoKFtzdHJpbmdzLmdldChkYXRhW2ldKSwgc3RyaW5ncy5nZXQoZGF0YVtpKzFdKV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWV0YWRhdGE7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG90YWw6IHN0YXRzWzBdLAogICAgICAgICAgICB0b3RhbFBhc3NlZDogc3RhdHNbMV0sCiAgICAgICAgICAgIHRvdGFsRmFpbGVkOiBzdGF0c1swXSAtIHN0YXRzWzFdLAogICAgICAgICAgICBjcml0aWNhbDogc3RhdHNbMl0sCiAgICAgICAgICAgIGNyaXRpY2FsUGFzc2VkOiBzdGF0c1szXSwKICAgICAgICAgICAgY3JpdGljYWxGYWlsZWQ6IHN0YXRzWzJdIC0gc3RhdHNbM10KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gUG9wdWxhdG9yKGl0ZW1zLCBzdHJpbmdzLCBjcmVhdG9yKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbnVtYmVyT2ZJdGVtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY3JlYXRvcjogZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRvcihpdGVtc1tpbmRleF0sIHN0cmluZ3MsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBTcGxpdExvZ1BvcHVsYXRvcihzdHJ1Y3R1cmVJbmRleCwgY3JlYXRvcikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG51bWJlck9mSXRlbXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3dbJ2tleXdvcmRzJytzdHJ1Y3R1cmVJbmRleF0ubGVuZ3RoOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjcmVhdG9yOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdG9yKHdpbmRvd1sna2V5d29yZHMnK3N0cnVjdHVyZUluZGV4XVtpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3dbJ3N0cmluZ3MnK3N0cnVjdHVyZUluZGV4XSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3VpdGUoKSB7CiAgICAgICAgdmFyIGVsZW0gPSB3aW5kb3cub3V0cHV0LnN1aXRlOwogICAgICAgIGlmIChlbGVtZW50c0J5SWRbZWxlbS5pZF0pCiAgICAgICAgICAgIHJldHVybiBlbGVtOwogICAgICAgIHZhciByb290ID0gYWRkRWxlbWVudChjcmVhdGVTdWl0ZShudWxsLCBlbGVtLCBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKSk7CiAgICAgICAgd2luZG93Lm91dHB1dC5zdWl0ZSA9IHJvb3Q7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kTG9hZGVkKGlkKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnRzQnlJZFtpZF07CiAgICB9CiAgICBmdW5jdGlvbiBlbnN1cmVMb2FkZWQoaWQsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGlkcyA9IGlkLnNwbGl0KCctJyk7CiAgICAgICAgdmFyIHJvb3QgPSBzdWl0ZSgpOwogICAgICAgIGlkcy5zaGlmdCgpOwogICAgICAgIGxvYWRJdGVtcyhpZHMsIHJvb3QsIFtyb290LmlkXSwgY2FsbGJhY2spOwogICAgfQogICAgZnVuY3Rpb24gbG9hZEl0ZW1zKGlkcywgY3VycmVudCwgcmVzdWx0LCBjYWxsYmFjaykgewogICAgICAgIGlmICghaWRzLmxlbmd0aCkgewogICAgICAgICAgICBjYWxsYmFjayhyZXN1bHQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQuY2FsbFdoZW5DaGlsZHJlblJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGlkID0gaWRzLnNoaWZ0KCk7CiAgICAgICAgICAgIHZhciB0eXBlID0gaWRbMF07CiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGlkLnN1YnN0cmluZygxKSkgLSAxOwogICAgICAgICAgICB2YXIgaXRlbSA9IHNlbGVjdEZyb20oY3VycmVudCwgdHlwZSwgaW5kZXgpOwogICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0uaWQpOwogICAgICAgICAgICBlbHNlICAgIC8vIEludmFsaWQgaWQuIFNob3VsZCB0aGlzIGJlIHJlcG9ydGVkIHNvbWV3aGVyZT8KICAgICAgICAgICAgICAgIGlkcyA9IFtdOwogICAgICAgICAgICBsb2FkSXRlbXMoaWRzLCBpdGVtLCByZXN1bHQsIGNhbGxiYWNrKTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlbGVjdEZyb20oZWxlbWVudCwgdHlwZSwgaW5kZXgpIHsKICAgICAgICBpZiAodHlwZSA9PT0gJ2snKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmtleXdvcmRzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3QnKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRlc3RzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnN1aXRlcygpW2luZGV4XTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBlcnJvckl0ZXJhdG9yKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlKHdpbmRvdy5vdXRwdXQuZXJyb3JzLnNoaWZ0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaGFzTmV4dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5vdXRwdXQuZXJyb3JzLmxlbmd0aCA+IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdGlzdGljcygpIHsKICAgICAgICBpZiAoIV9zdGF0aXN0aWNzKSB7CiAgICAgICAgICAgIHZhciBzdGF0RGF0YSA9IHdpbmRvdy5vdXRwdXQuc3RhdHM7CiAgICAgICAgICAgIF9zdGF0aXN0aWNzID0gc3RhdHMuU3RhdGlzdGljcyhzdGF0RGF0YVswXSwgc3RhdERhdGFbMV0sIHN0YXREYXRhWzJdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9zdGF0aXN0aWNzOwogICAgfQogICAgZnVuY3Rpb24gU3RyaW5nU3RvcmUoc3RyaW5ncykgewogICAgICAgIGZ1bmN0aW9uIGdldFRleHQoaWQpIHsKICAgICAgICAgICAgdmFyIHRleHQgPSBzdHJpbmdzW2lkXTsKICAgICAgICAgICAgaWYgKCF0ZXh0KQogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICBpZiAodGV4dFswXSA9PSAnKicpCiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgIHZhciBleHRyYWN0ZWQgPSBleHRyYWN0KHRleHQpOwogICAgICAgICAgICBzdHJpbmdzW2lkXSA9ICcqJyArIGV4dHJhY3RlZDsKICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RlZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZXh0cmFjdCh0ZXh0KSB7CiAgICAgICAgICAgIHZhciBkZWNvZGVkID0gSlhHLlV0aWwuQmFzZTY0LmRlY29kZUFzQXJyYXkodGV4dCk7CiAgICAgICAgICAgIHZhciBleHRyYWN0ZWQgPSAobmV3IEpYRy5VdGlsLlVuemlwKGRlY29kZWQpKS51bnppcCgpWzBdWzBdOwogICAgICAgICAgICByZXR1cm4gSlhHLlV0aWwuVVRGOC5kZWNvZGUoZXh0cmFjdGVkKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZ2V0KGlkKSB7CiAgICAgICAgICAgIGlmIChpZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIHJldHVybiBnZXRUZXh0KGlkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHtnZXQ6IGdldH07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIHN1aXRlOiBzdWl0ZSwKICAgICAgICBlcnJvckl0ZXJhdG9yOiBlcnJvckl0ZXJhdG9yLAogICAgICAgIGZpbmRMb2FkZWQ6IGZpbmRMb2FkZWQsCiAgICAgICAgZW5zdXJlTG9hZGVkOiBlbnN1cmVMb2FkZWQsCiAgICAgICAgc3RhdGlzdGljczogc3RhdGlzdGljcywKICAgICAgICBTdHJpbmdTdG9yZTogU3RyaW5nU3RvcmUsICAvLyBleHBvc2VkIGZvciB0ZXN0cwogICAgICAgIExFVkVMUzogTEVWRUxTCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmZ1bmN0aW9uIHJlbW92ZUphdmFTY3JpcHREaXNhYmxlZFdhcm5pbmcoKSB7CiAgICAvLyBOb3QgdXNpbmcgalF1ZXJ5IGhlcmUgZm9yIG1heGltdW0gc3BlZWQKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqYXZhc2NyaXB0LWRpc2FibGVkJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKfQpmdW5jdGlvbiBhZGRKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKGVycm9yKSB7CiAgICBpZiAod2luZG93LmNvbnNvbGUpCiAgICAgICAgY29uc29sZS5lcnJvcignT3BlbmluZyBmYWlsZWQ6ICcgKyBlcnJvci5uYW1lICsgJzogJyArIGVycm9yLm1lc3NhZ2UpOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2phdmFzY3JpcHQtZGlzYWJsZWQnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKfQpmdW5jdGlvbiBpbml0TGF5b3V0KHN1aXRlTmFtZSwgdHlwZSkgewogICAgcGFyc2VUZW1wbGF0ZXMoKTsKICAgIHNldFRpdGxlKHN1aXRlTmFtZSwgdHlwZSk7CiAgICBhZGRIZWFkZXIoKTsKICAgIGFkZFJlcG9ydE9yTG9nTGluayh0eXBlKTsKfQpmdW5jdGlvbiBwYXJzZVRlbXBsYXRlcygpIHsKICAgICQoJ3NjcmlwdFt0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiXScpLm1hcChmdW5jdGlvbiAoaWR4LCBlbGVtKSB7CiAgICAgICAgJC50ZW1wbGF0ZShlbGVtLmlkLCBlbGVtLnRleHQpOwogICAgfSk7Cn0KZnVuY3Rpb24gdGVzdE9yVGFzayh0ZXh0KSB7CiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC97KC4qKX0vLCBmdW5jdGlvbiAobWF0Y2gsIGdyb3VwLCBvZmZzZXQsIHN0cmluZykgewogICAgICAgIGlmICghd2luZG93LnNldHRpbmdzLnJwYSkKICAgICAgICAgICAgcmV0dXJuIGdyb3VwOwogICAgICAgIHJldHVybiB7J1RFU1QnOiAnVEFTSycsICdUZXN0JzogJ1Rhc2snLCAndGVzdCc6ICd0YXNrJ31bZ3JvdXBdOwogICAgfSk7Cn0KZnVuY3Rpb24gc2V0VGl0bGUoc3VpdGVOYW1lLCB0eXBlKSB7CiAgICB2YXIgZ2l2ZW5UaXRsZSA9IHdpbmRvdy5zZXR0aW5ncy50aXRsZTsKICAgIHZhciB0aXRsZSA9IGdpdmVuVGl0bGUgPyBnaXZlblRpdGxlIDogc3VpdGVOYW1lICsgIiAiICsgdHlwZTsKICAgIGRvY3VtZW50LnRpdGxlID0gdXRpbC51bmVzY2FwZSh0aXRsZSk7Cn0KZnVuY3Rpb24gYWRkSGVhZGVyKCkgewogICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwudGltZXN0YW1wKHdpbmRvdy5vdXRwdXQuZ2VuZXJhdGVkKTsKICAgICQudG1wbCgnPGgxPiR7dGl0bGV9PC9oMT4nICsKICAgICAgICAgICAnPGRpdiBpZD0iZ2VuZXJhdGVkIj4nICsKICAgICAgICAgICAgICc8c3Bhbj5HZW5lcmF0ZWQ8YnI+JHtnZW5lcmF0ZWR9PC9zcGFuPjxicj4nICsKICAgICAgICAgICAgICc8c3BhbiBpZD0iZ2VuZXJhdGVkLWFnbyI+JHthZ299IGFnbzwvc3Bhbj4nICsKICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgJzxkaXYgaWQ9InRvcC1yaWdodC1oZWFkZXIiPicgKwogICAgICAgICAgICAgJzxkaXYgaWQ9InJlcG9ydC1vci1sb2ctbGluayI+PGEgaHJlZj0iIyI+PC9hPjwvZGl2PicgKwogICAgICAgICAgICc8L2Rpdj4nLCB7CiAgICAgICAgZ2VuZXJhdGVkOiB1dGlsLmNyZWF0ZUdlbmVyYXRlZFN0cmluZyhnZW5lcmF0ZWQpLAogICAgICAgIGFnbzogdXRpbC5jcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmcoZ2VuZXJhdGVkKSwKICAgICAgICB0aXRsZTogZG9jdW1lbnQudGl0bGUKICAgIH0pLmFwcGVuZFRvKCQoJyNoZWFkZXInKSk7Cn0KZnVuY3Rpb24gYWRkUmVwb3J0T3JMb2dMaW5rKG15VHlwZSkgewogICAgdmFyIHVybDsKICAgIHZhciB0ZXh0OwogICAgdmFyIGNvbnRhaW5lciA9ICQoJyNyZXBvcnQtb3ItbG9nLWxpbmsnKTsKICAgIGlmIChteVR5cGUgPT0gJ1JlcG9ydCcpIHsKICAgICAgICB1cmwgPSB3aW5kb3cuc2V0dGluZ3MubG9nVVJMOwogICAgICAgIHRleHQgPSAnTE9HJzsKICAgIH0gZWxzZSB7CiAgICAgICAgdXJsID0gd2luZG93LnNldHRpbmdzLnJlcG9ydFVSTDsKICAgICAgICB0ZXh0ID0gJ1JFUE9SVCc7CiAgICB9CiAgICBpZiAodXJsKSB7CiAgICAgICAgY29udGFpbmVyLmZpbmQoJ2EnKS5hdHRyKCdocmVmJywgdXJsKTsKICAgICAgICBjb250YWluZXIuZmluZCgnYScpLnRleHQodGV4dCk7CiAgICB9IGVsc2UgewogICAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTsKICAgIH0KfQpmdW5jdGlvbiBhZGRTdGF0aXN0aWNzKCkgewogICAgdmFyIHN0YXRIZWFkZXJzID0KICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+VG90YWw8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5QYXNzPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+RmFpbDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPkVsYXBzZWQ8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+UGFzcyAvIEZhaWw8L3RoPic7CiAgICB2YXIgc3RhdFRhYmxlID0KICAgICAgICAnPGgyPntUZXN0fSBTdGF0aXN0aWNzPC9oMj4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0idG90YWwtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlRvdGFsIFN0YXRpc3RpY3M8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPicgKwogICAgICAgICc8dGFibGUgY2xhc3M9InN0YXRpc3RpY3MiIGlkPSJ0YWctc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgVGFnPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0ic3VpdGUtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgU3VpdGU8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPic7CiAgICAkKHRlc3RPclRhc2soc3RhdFRhYmxlKSkuYXBwZW5kVG8oJyNzdGF0aXN0aWNzLWNvbnRhaW5lcicpOwogICAgdXRpbC5tYXAoWyd0b3RhbCcsICd0YWcnLCAnc3VpdGUnXSwgYWRkU3RhdFRhYmxlKTsKICAgIGFkZFRvb2x0aXBzVG9FbGFwc2VkVGltZXMoKTsKICAgIGVuYWJsZVN0YXRpc3RpY3NTb3J0ZXIoKTsKfQpmdW5jdGlvbiBhZGRUb29sdGlwc1RvRWxhcHNlZFRpbWVzKCkgewogICAgJCgnLnN0YXRzLWNvbC1lbGFwc2VkJykuYXR0cigndGl0bGUnLAogICAgICAgIHRlc3RPclRhc2soJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZXNlIHt0ZXN0fXMuICcpICsKICAgICAgICAnRXhjbHVkZXMgc3VpdGUgc2V0dXBzIGFuZCB0ZWFyZG93bnMuJyk7CiAgICAkKCcjc3VpdGUtc3RhdHMnKS5maW5kKCcuc3RhdHMtY29sLWVsYXBzZWQnKS5hdHRyKCd0aXRsZScsCiAgICAgICAgJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoaXMgc3VpdGUuJyk7Cn0KZnVuY3Rpb24gZW5hYmxlU3RhdGlzdGljc1NvcnRlcigpIHsKICAgICQudGFibGVzb3J0ZXIuYWRkUGFyc2VyKHsKICAgICAgICBpZDogJ3N0YXROYW1lJywKICAgICAgICB0eXBlOiAnbnVtZXJpYycsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZywgdGFibGUsIGNlbGwsIGNlbGxJbmRleCkgewogICAgICAgICAgICAvLyBSb3dzIGhhdmUgY2xhc3MgaW4gZm9ybWF0ICdyb3ctPGluZGV4PicuCiAgICAgICAgICAgIHZhciBpbmRleCA9ICQoY2VsbCkucGFyZW50KCkuYXR0cignY2xhc3MnKS5zdWJzdHJpbmcoNCk7CiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbmRleCk7CiAgICAgICAgfQogICAgfSk7CiAgICAkKCIuc3RhdGlzdGljcyIpLnRhYmxlc29ydGVyKHsKICAgICAgICBzb3J0SW5pdGlhbE9yZGVyOiAnZGVzYycsCiAgICAgICAgaGVhZGVyczogezA6IHtzb3J0ZXI6J3N0YXROYW1lJywgc29ydEluaXRpYWxPcmRlcjogJ2FzYyd9LAogICAgICAgICAgICAgICAgICA1OiB7c29ydGVyOiBmYWxzZX19CiAgICB9KTsKfQpmdW5jdGlvbiBhZGRTdGF0VGFibGUodGFibGVOYW1lKSB7CiAgICB2YXIgc3RhdHMgPSB3aW5kb3cudGVzdGRhdGEuc3RhdGlzdGljcygpW3RhYmxlTmFtZV07CiAgICBpZiAodGFibGVOYW1lID09ICd0YWcnICYmIHN0YXRzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgcmVuZGVyTm9UYWdTdGF0VGFibGUoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmVuZGVyU3RhdFRhYmxlKHRhYmxlTmFtZSwgc3RhdHMpOwogICAgfQp9CmZ1bmN0aW9uIHJlbmRlck5vVGFnU3RhdFRhYmxlKCkgewogICAgJCgnPHRib2R5Pjx0ciBjbGFzcz0icm93LTAiPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5ObyBUYWdzPC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZWxhcHNlZCI+PC90ZD4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZ3JhcGgiPicgKwogICAgICAgICAgJzxkaXYgY2xhc3M9ImVtcHR5LWdyYXBoIj48L2Rpdj4nICsKICAgICAgICAnPC90ZD4nICsKICAgICAgJzwvdHI+PC90Ym9keT4nKS5hcHBlbmRUbygnI3RhZy1zdGF0cycpOwp9CmZ1bmN0aW9uIHJlbmRlclN0YXRUYWJsZSh0YWJsZU5hbWUsIHN0YXRzKSB7CiAgICB2YXIgdGVtcGxhdGUgPSB0YWJsZU5hbWUgKyAnU3RhdGlzdGljc1Jvd1RlbXBsYXRlJzsKICAgIHZhciB0Ym9keSA9ICQoJzx0Ym9keT48L3Rib2R5PicpOwogICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0YXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgJC50bXBsKHRlbXBsYXRlLCBzdGF0c1tpXSwge2luZGV4OiBpfSkuYXBwZW5kVG8odGJvZHkpOwogICAgfQogICAgdGJvZHkuYXBwZW5kVG8oJyMnICsgdGFibGVOYW1lICsgJy1zdGF0cycpOwp9CiQudGVtcGxhdGUoJ3N0YXRDb2x1bW5zVGVtcGxhdGUnLAogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7dG90YWx9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke3Bhc3N9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke2ZhaWx9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1lbGFwc2VkIj4ke2VsYXBzZWR9PC90ZD4nICsKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+JyArCiAgICAgICd7e2lmIHRvdGFsfX0nICsKICAgICAgJzxkaXYgY2xhc3M9ImdyYXBoIj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0icGFzcy1iYXIiIHN0eWxlPSJ3aWR0aDogJHtwYXNzV2lkdGh9JSIgdGl0bGU9IiR7cGFzc1BlcmNlbnR9JSI+PC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9ImZhaWwtYmFyIiBzdHlsZT0id2lkdGg6ICR7ZmFpbFdpZHRofSUiIHRpdGxlPSIke2ZhaWxQZXJjZW50fSUiPjwvZGl2PicgKwogICAgICAnPC9kaXY+JyArCiAgICAgICd7e2Vsc2V9fScgKwogICAgICAnPGRpdiBjbGFzcz0iZW1wdHktZ3JhcGgiPjwvZGl2PicgKwogICAgICAne3svaWZ9fScgKwogICAgJzwvdGQ+JwopOwokLnRlbXBsYXRlKCdzdWl0ZVN0YXR1c01lc3NhZ2VUZW1wbGF0ZScsCiAgICAnJHtjcml0aWNhbH0gY3JpdGljYWwge3s9IHRlc3RPclRhc2soInt0ZXN0fSIpfX0sICcgKwogICAgJyR7Y3JpdGljYWxQYXNzZWR9IHBhc3NlZCwgJyArCiAgICAnPHNwYW4gY2xhc3M9Int7aWYgY3JpdGljYWxGYWlsZWR9fWZhaWx7e2Vsc2V9fXBhc3N7ey9pZn19Ij4ke2NyaXRpY2FsRmFpbGVkfSBmYWlsZWQ8L3NwYW4+PGJyPicgKwogICAgJyR7dG90YWx9IHt7PSB0ZXN0T3JUYXNrKCJ7dGVzdH0iKX19IHRvdGFsLCAnICsKICAgICcke3RvdGFsUGFzc2VkfSBwYXNzZWQsICcgKwogICAgJzxzcGFuIGNsYXNzPSJ7e2lmIHRvdGFsRmFpbGVkfX1mYWlse3tlbHNlfX1wYXNze3svaWZ9fSI+JHt0b3RhbEZhaWxlZH0gZmFpbGVkPC9zcGFuPicKKTsKLy8gRm9yIGNvbXBsZXRlIGNyb3NzLWJyb3dzZXIgZXhwZXJpZW5jZS4uCi8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX29yZGVyLmh0bWwKZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGV2ZW50KSB7CiAgICB2YXIgZXZlbnQgPSBldmVudCB8fCB3aW5kb3cuZXZlbnQ7CiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKfQo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpzdG9yYWdlID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHByZWZpeCA9ICdyb2JvdC1mcmFtZXdvcmstJzsKICAgIHZhciBzdG9yYWdlOwogICAgZnVuY3Rpb24gaW5pdCh1c2VyKSB7CiAgICAgICAgcHJlZml4ICs9IHVzZXIgKyAnLSc7CiAgICAgICAgc3RvcmFnZSA9IGdldFN0b3JhZ2UoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFN0b3JhZ2UoKSB7CiAgICAgICAgLy8gVXNlIGxvY2FsU3RvcmFnZSBpZiBpdCdzIGFjY2Vzc2libGUsIG5vcm1hbCBvYmplY3Qgb3RoZXJ3aXNlLgogICAgICAgIC8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExMjE0NDA0CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocHJlZml4LCBwcmVmaXgpOwogICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShwcmVmaXgpOwogICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlOwogICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0KG5hbWUsIGRlZmF1bHRWYWx1ZSkgewogICAgICAgIHZhciB2YWx1ZSA9IHN0b3JhZ2VbcHJlZml4ICsgbmFtZV07CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgZnVuY3Rpb24gc2V0KG5hbWUsIHZhbHVlKSB7CiAgICAgICAgc3RvcmFnZVtwcmVmaXggKyBuYW1lXSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIHtpbml0OiBpbml0LCBnZXQ6IGdldCwgc2V0OiBzZXR9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXQgPSB7fTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3VpdGUiXSA9IFsxLDIsMywwLFtdLFswLDAsNTY2MF0sW10sW1s0LDAsMSwwLFtdLFswLDExMSw1MDUxLDVdLFtdXV0sW10sWzEsMCwxLDBdXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3RyaW5ncyJdID0gW107Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN0cmluZ3MiXSA9IHdpbmRvdy5vdXRwdXRbInN0cmluZ3MiXS5jb25jYXQoWyIqIiwiKkp1cHl0ZXIiLCIqL2hvbWUvZGF0YWt1cnJlL1dvcmsvcm9ib3RrZXJuZWwvZXhhbXBsZXMiLCIqLi4vLi4vLi4vLi4vaG9tZS9kYXRha3VycmUvV29yay9yb2JvdGtlcm5lbC9leGFtcGxlcyIsIipEZW1vbnN0cmF0ZSBmYWlsaW5nIHRlc3QiLCIqUGFnZSBzaG91bGQgaGF2ZSBjb250YWluZWQgdGV4dCAnSGVsbG8gV29ybGQhJyBidXQgZGlkIG5vdC4iXSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN0YXRzIl0gPSBbW3siZWxhcHNlZCI6IjAwOjAwOjA1IiwiZmFpbCI6MSwibGFiZWwiOiJDcml0aWNhbCBUZXN0cyIsInBhc3MiOjB9LHsiZWxhcHNlZCI6IjAwOjAwOjA1IiwiZmFpbCI6MSwibGFiZWwiOiJBbGwgVGVzdHMiLCJwYXNzIjowfV0sW10sW3siZWxhcHNlZCI6IjAwOjAwOjA2IiwiZmFpbCI6MSwiaWQiOiJzMSIsImxhYmVsIjoiSnVweXRlciIsIm5hbWUiOiJKdXB5dGVyIiwicGFzcyI6MH1dXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiYmFzZU1pbGxpcyJdID0gMTU0NjY2ODc4NTM4MjsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiZ2VuZXJhdGVkIl0gPSA1NjgyOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuc2V0dGluZ3MgPSB7ImJhY2tncm91bmQiOnsiZmFpbCI6IiNmNjYiLCJub25Dcml0aWNhbEZhaWwiOiIjOWU5IiwicGFzcyI6IiM5ZTkifSwibG9nVVJMIjpudWxsLCJycGEiOmZhbHNlLCJ0aXRsZSI6IiJ9Owo8L3NjcmlwdD4KPHRpdGxlPjwvdGl0bGU+CjwvaGVhZD4KPGJvZHk+CjxkaXYgaWQ9ImphdmFzY3JpcHQtZGlzYWJsZWQiPgogIDxoMT5PcGVuaW5nIFJvYm90IEZyYW1ld29yayByZXBvcnQgZmFpbGVkPC9oMT4KICA8dWw+CiAgICA8bGk+VmVyaWZ5IHRoYXQgeW91IGhhdmUgPGI+SmF2YVNjcmlwdCBlbmFibGVkPC9iPiBpbiB5b3VyIGJyb3dzZXIuPC9saT4KICAgIDxsaT5NYWtlIHN1cmUgeW91IGFyZSB1c2luZyBhIDxiPm1vZGVybiBlbm91Z2ggYnJvd3NlcjwvYj4uIElmIHVzaW5nIEludGVybmV0IEV4cGxvcmVyLCB2ZXJzaW9uIDggb3IgbmV3ZXIgaXMgcmVxdWlyZWQuPC9saT4KICAgIDxsaT5DaGVjayBhcmUgdGhlcmUgbWVzc2FnZXMgaW4geW91ciBicm93c2VyJ3MgPGI+SmF2YVNjcmlwdCBlcnJvciBsb2c8L2I+LiBQbGVhc2UgcmVwb3J0IHRoZSBwcm9ibGVtIGlmIHlvdSBzdXNwZWN0IHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnLjwvbGk+CiAgPC91bD4KPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5yZW1vdmVKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKCk7PC9zY3JpcHQ+Cgo8ZGl2IGlkPSJoZWFkZXIiPjwvZGl2Pgo8ZGl2IGlkPSJzdGF0aXN0aWNzLWNvbnRhaW5lciI+PC9kaXY+CjxkaXYgaWQ9InRlc3QtZGV0YWlscy1jb250YWluZXIiPjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7CiAgICB0cnkgewogICAgICAgIHZhciB0b3BzdWl0ZSA9IHdpbmRvdy50ZXN0ZGF0YS5zdWl0ZSgpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBhZGRKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKGVycm9yKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB3aW5kb3cucHJldkxvY2F0aW9uSGFzaCA9ICcnOwogICAgc2V0QmFja2dyb3VuZCh0b3BzdWl0ZSk7CiAgICBpbml0TGF5b3V0KHRvcHN1aXRlLm5hbWUsICdSZXBvcnQnKTsKICAgIHN0b3JhZ2UuaW5pdCgncmVwb3J0Jyk7CiAgICBhZGRTdW1tYXJ5KHRvcHN1aXRlKTsKICAgIGFkZFN0YXRpc3RpY3MoKTsKICAgIGFkZERldGFpbHMoKTsKICAgIHdpbmRvdy5vbmhhc2hjaGFuZ2UgPSBzaG93RGV0YWlsc0J5SGFzaDsKfSk7CgpmdW5jdGlvbiBzZXRCYWNrZ3JvdW5kKHRvcHN1aXRlKSB7CiAgICB2YXIgY29sb3I7CiAgICBpZiAodG9wc3VpdGUuY3JpdGljYWxGYWlsZWQpCiAgICAgICAgY29sb3IgPSB3aW5kb3cuc2V0dGluZ3MuYmFja2dyb3VuZC5mYWlsOwogICAgZWxzZSBpZiAodG9wc3VpdGUudG90YWxGYWlsZWQpCiAgICAgICAgY29sb3IgPSB3aW5kb3cuc2V0dGluZ3MuYmFja2dyb3VuZC5ub25Dcml0aWNhbEZhaWw7CiAgICBlbHNlCiAgICAgICAgY29sb3IgPSB3aW5kb3cuc2V0dGluZ3MuYmFja2dyb3VuZC5wYXNzOwogICAgJCgnYm9keScpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsIGNvbG9yKTsKfQoKZnVuY3Rpb24gYWRkU3VtbWFyeSh0b3BzdWl0ZSkgewogICAgdmFyIG9wdHMgPSB7bG9nVVJMOiB3aW5kb3cuc2V0dGluZ3MubG9nVVJMfTsKICAgICQudG1wbCgnc3VtbWFyeVRhYmxlVGVtcGxhdGUnLCB0b3BzdWl0ZSwgb3B0cykuaW5zZXJ0QWZ0ZXIoJCgnI2hlYWRlcicpKTsKfQoKZnVuY3Rpb24gYWRkRGV0YWlscygpIHsKICAgIGFkZEN1c3RvbVNvcnRlcnNGb3JEZXRhaWxzKCk7CiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpCiAgICAgICAgc2hvd0RldGFpbHNCeUhhc2goKTsKICAgIGVsc2UKICAgICAgICByZW5kZXJUb3RhbFNlbGVjdG9yKCk7Cn0KCmZ1bmN0aW9uIGFkZEN1c3RvbVNvcnRlcnNGb3JEZXRhaWxzKCkgewogICAgJC50YWJsZXNvcnRlci5hZGRQYXJzZXIoewogICAgICAgIGlkOiAnY3JpdGljYWxpdHknLAogICAgICAgIHR5cGU6ICdudW1lcmljJywKICAgICAgICBpczogZnVuY3Rpb24ocykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBkbyBub3QgYXV0by1kZXRlY3QKICAgICAgICB9LAogICAgICAgIGZvcm1hdDogZnVuY3Rpb24ocykgewogICAgICAgICAgICByZXR1cm4gcyA9PT0gJ3llcycgPyAwIDogMTsKICAgICAgICB9CiAgICB9KTsKICAgICQudGFibGVzb3J0ZXIuYWRkUGFyc2VyKHsKICAgICAgICBpZDogJ3RpbWVzJywKICAgICAgICB0eXBlOiAndGV4dCcsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMuc3Vic3RyaW5nKDAsIDIxKTsgIC8vIHJldHVybiBvbmx5IHN0YXJ0IHRpbWUKICAgICAgICB9CiAgICB9KTsKfQoKZnVuY3Rpb24gc2hvd0RldGFpbHNCeUhhc2goKSB7CiAgICAvLyBDYW5ub3QgdXNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoIGJlY2F1c2UgRmlyZWZveCBpbmNvcnJlY3RseSBkZWNvZGVzIGl0OgogICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNzAzNTUyL2VuY29kaW5nLW9mLXdpbmRvdy1sb2NhdGlvbi1oYXNoCiAgICB2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCcjJykuc2xpY2UoMSkuam9pbignIycpOwogICAgaWYgKCFoYXNoIHx8IGhhc2ggPT0gd2luZG93LnByZXZMb2NhdGlvbkhhc2gpCiAgICAgICAgcmV0dXJuOwogICAgdmFyIHBhcnRzID0gaGFzaC5zcGxpdCgnPycpOwogICAgdmFyIG5hbWUgPSBwYXJ0cy5zaGlmdCgpOwogICAgdmFyIHF1ZXJ5ID0gcGFydHMuam9pbignPycpOwogICAgaWYgKG5hbWUgPT0gJ3NlYXJjaCcpIHsKICAgICAgICB2YXIgcGFyYW1zID0gdXRpbC5wYXJzZVF1ZXJ5U3RyaW5nKHF1ZXJ5KTsKICAgICAgICBzZWFyY2hFeGVjdXRlZChwYXJhbXMuc3VpdGUgfHwgJycsIHBhcmFtcy50ZXN0IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5pbmNsdWRlIHx8ICcnLCBwYXJhbXMuZXhjbHVkZSB8fCAnJyk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcXVlcnkgPSBkZWNvZGVVUklDb21wb25lbnQocXVlcnkpOwogICAgdmFyIGFjdGlvbiA9IHsndG90YWxzJzogdG90YWxEZXRhaWxTZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgJ3RhZ3MnOiAgIHRhZ0RldGFpbFNlbGVjdGVkLAogICAgICAgICAgICAgICAgICAnc3VpdGVzJzogc3VpdGVEZXRhaWxTZWxlY3RlZH1bbmFtZV07CiAgICBpZiAoYWN0aW9uKQogICAgICAgIGFjdGlvbihxdWVyeSk7Cn0KCmZ1bmN0aW9uIHRvdGFsRGV0YWlsU2VsZWN0ZWQobmFtZSkgewogICAgcmVuZGVyVG90YWxTZWxlY3RvcihuYW1lKTsKICAgIGlmIChuYW1lKSB7CiAgICAgICAgcmVuZGVyVG90YWxEZXRhaWxzKG5hbWUpOwogICAgICAgIHZhciB0aXRsZSA9IG5hbWUgPT0gJ2NyaXRpY2FsJyA/ICdDcml0aWNhbCB7VGVzdH1zJyA6ICdBbGwge1Rlc3R9cycKICAgICAgICB1cGRhdGVQcmludFNlbGVjdG9yKHRlc3RPclRhc2sodGl0bGUpKTsKICAgIH0KICAgIHNjcm9sbFRvU2VsZWN0b3IoJ3RvdGFscycsIG5hbWUpOwp9CgpmdW5jdGlvbiByZW5kZXJUb3RhbFNlbGVjdG9yKG5hbWUpIHsKICAgIHZhciBhcmdzID0ge2xpbmtUYXJnZXQ6IChuYW1lKSA/ICd0b3RhbHM/JytuYW1lIDogJ3RvdGFscycsCiAgICAgICAgICAgICAgICB0b3RhbFRhYlN0YXR1czogJ2RldGFpbC10YWItc2VsZWN0ZWQnfTsKICAgIHJlbmRlclNlbGVjdG9yKGFyZ3MsICd0b3RhbERldGFpbHNTZWxlY3RvclRlbXBsYXRlJywge3NlbGVjdGVkOiBuYW1lfSk7Cn0KCmZ1bmN0aW9uIHJlbmRlclRvdGFsRGV0YWlscyhuYW1lKSB7CiAgICB2YXIgaW5kZXggPSAobmFtZSA9PSAnY3JpdGljYWwnKSA/IDAgOiAxOwogICAgdmFyIHN0YXQgPSB3aW5kb3cudGVzdGRhdGEuc3RhdGlzdGljcygpLnRvdGFsW2luZGV4XTsKICAgIHZhciB0ZXN0cyA9IGdldFRvdGFsVGVzdHMobmFtZSk7CiAgICBzdGF0LnRvdGFsVGltZSA9IGNhbGN1bGF0ZVRvdGFsVGltZSh0ZXN0cyk7CiAgICAkLnRtcGwoJ3RhZ09yVG90YWxEZXRhaWxzVGVtcGxhdGUnLCBzdGF0KS5hcHBlbmRUbygnI2RldGFpbHMtaGVhZGVyJyk7CiAgICBkcmF3VGVzdERldGFpbHNUYWJsZSh0ZXN0cywgdHJ1ZSk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZVByaW50U2VsZWN0b3IobmFtZSwgaW5mbykgewogICAgaWYgKGluZm8pCiAgICAgICAgbmFtZSArPSAnICgnICsgaW5mbyArICcpJzsKICAgICQoJyNwcmludC1zZWxlY3RvcicpLmh0bWwobmFtZSk7Cn0KCmZ1bmN0aW9uIHRhZ0RldGFpbFNlbGVjdGVkKG5hbWUpIHsKICAgIHJlbmRlclRhZ1NlbGVjdG9yKG5hbWUpOwogICAgaWYgKG5hbWUpIHsKICAgICAgICB2YXIgdGFnID0gZmluZFRhZyhuYW1lKTsKICAgICAgICBpZiAodGFnKSB7CiAgICAgICAgICAgIHJlbmRlclRhZ0RldGFpbHModGFnKTsKICAgICAgICAgICAgdXBkYXRlUHJpbnRTZWxlY3RvcihuYW1lLCB0YWcuaW5mbyk7CiAgICAgICAgfQogICAgfQogICAgc2Nyb2xsVG9TZWxlY3RvcigndGFncycsIG5hbWUpOwp9CgpmdW5jdGlvbiBmaW5kVGFnKG5hbWUpIHsKICAgIHZhciB0YWdzID0gd2luZG93LnRlc3RkYXRhLnN0YXRpc3RpY3MoKS50YWc7CiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGFncy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgIGlmICh0YWdzW2ldLmxhYmVsID09IG5hbWUpCiAgICAgICAgICAgIHJldHVybiB0YWdzW2ldOwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIHJlbmRlclRhZ1NlbGVjdG9yKG5hbWUpIHsKICAgIHZhciBhcmdzID0ge2xpbmtUYXJnZXQ6IChuYW1lKSA/ICd0YWdzPycrbmFtZSA6ICd0YWdzJywKICAgICAgICAgICAgICAgIHRhZ1RhYlN0YXR1czogJ2RldGFpbC10YWItc2VsZWN0ZWQnfTsKICAgIHZhciBzdGF0cyA9IHt0YWdzOiB3aW5kb3cudGVzdGRhdGEuc3RhdGlzdGljcygpLnRhZywgc2VsZWN0ZWQ6IG5hbWV9OwogICAgcmVuZGVyU2VsZWN0b3IoYXJncywgJ3RhZ0RldGFpbHNTZWxlY3RvclRlbXBsYXRlJywgc3RhdHMpOwp9CgpmdW5jdGlvbiByZW5kZXJUYWdEZXRhaWxzKHRhZykgewogICAgdmFyIHRlc3RzID0gZ2V0VGVzdHNIYXZpbmdUYWcodGFnKTsKICAgIHRhZy50b3RhbFRpbWUgPSBjYWxjdWxhdGVUb3RhbFRpbWUodGVzdHMpOwogICAgJC50bXBsKCd0YWdPclRvdGFsRGV0YWlsc1RlbXBsYXRlJywgdGFnKS5hcHBlbmRUbygnI2RldGFpbHMtaGVhZGVyJyk7CiAgICBkcmF3VGVzdERldGFpbHNUYWJsZSh0ZXN0cywgdHJ1ZSk7Cn0KCmZ1bmN0aW9uIHN1aXRlRGV0YWlsU2VsZWN0ZWQoaWQpIHsKICAgIHJlbmRlclN1aXRlU2VsZWN0b3IoaWQpOwogICAgaWYgKGlkKQogICAgICAgIHJlbmRlclN1aXRlRGV0YWlscyhpZCk7CiAgICBzY3JvbGxUb1NlbGVjdG9yKCdzdWl0ZXMnLCBpZCk7Cn0KCmZ1bmN0aW9uIHJlbmRlclN1aXRlU2VsZWN0b3IoaWQpIHsKICAgIHZhciBhcmdzID0ge2xpbmtUYXJnZXQ6IChpZCkgPyAnc3VpdGVzPycraWQgOiAnc3VpdGVzJywKICAgICAgICAgICAgICAgIHN1aXRlVGFiU3RhdHVzOiAnZGV0YWlsLXRhYi1zZWxlY3RlZCd9OwogICAgdmFyIHN0YXRzID0ge3N1aXRlczogd2luZG93LnRlc3RkYXRhLnN0YXRpc3RpY3MoKS5zdWl0ZSwKICAgICAgICAgICAgICAgICBzZWxlY3RlZDogaWR9OwogICAgcmVuZGVyU2VsZWN0b3IoYXJncywgJ3N1aXRlRGV0YWlsc1NlbGVjdG9yVGVtcGxhdGUnLCBzdGF0cyk7Cn0KCmZ1bmN0aW9uIHJlbmRlclN1aXRlRGV0YWlscyhpZCkgewogICAgd2luZG93LnRlc3RkYXRhLmVuc3VyZUxvYWRlZChpZCwgZnVuY3Rpb24gKGlkcykgewogICAgICAgIHZhciBzdWl0ZSA9IHdpbmRvdy50ZXN0ZGF0YS5maW5kTG9hZGVkKGlkKTsKICAgICAgICB2YXIgb3B0cyA9IHtsb2dVUkw6IHdpbmRvdy5zZXR0aW5ncy5sb2dVUkx9OwogICAgICAgICQudG1wbCgnc3VpdGVEZXRhaWxzVGVtcGxhdGUnLCBzdWl0ZSwgb3B0cykuYXBwZW5kVG8oJyNkZXRhaWxzLWhlYWRlcicpOwogICAgICAgIGRyYXdUZXN0RGV0YWlsc1RhYmxlKHN1aXRlLmFsbFRlc3RzKCksIGZhbHNlKTsKICAgICAgICB1cGRhdGVQcmludFNlbGVjdG9yKHN1aXRlLmZ1bGxOYW1lKTsKICAgIH0pOwp9CgpmdW5jdGlvbiBzZWFyY2hFeGVjdXRlZChzdWl0ZSwgdGVzdCwgaW5jbHVkZSwgZXhjbHVkZSkgewogICAgcmVuZGVyU2VhcmNoU2VsZWN0b3Ioc3VpdGUsIHRlc3QsIGluY2x1ZGUsIGV4Y2x1ZGUpOwogICAgaWYgKHN1aXRlIHx8IHRlc3QgfHwgaW5jbHVkZSB8fCBleGNsdWRlKSB7CiAgICAgICAgcmVuZGVyU2VhcmNoRGV0YWlscyhzdWl0ZSwgdGVzdCwgaW5jbHVkZSwgZXhjbHVkZSk7CiAgICAgICAgc2Nyb2xsVG9TZWxlY3Rvcignc2VhcmNoJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAnP3N1aXRlPScgKyBlbmNvZGVVUklDb21wb25lbnQoc3VpdGUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICcmdGVzdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHRlc3QpICsKICAgICAgICAgICAgICAgICAgICAgICAgICcmaW5jbHVkZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGluY2x1ZGUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICcmZXhjbHVkZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGV4Y2x1ZGUpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgc2Nyb2xsVG9TZWxlY3Rvcignc2VhcmNoJyk7CiAgICB9Cn0KCmZ1bmN0aW9uIHJlbmRlclNlYXJjaFNlbGVjdG9yKHN1aXRlLCB0ZXN0LCBpbmNsdWRlLCBleGNsdWRlKSB7CiAgICB2YXIgYXJncyA9IHtsaW5rVGFyZ2V0OiAoc3VpdGUgfHwgdGVzdCB8fCBpbmNsdWRlIHx8IGV4Y2x1ZGUpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnc2VhcmNoP3N1aXRlPScgKyBzdWl0ZSArICcmdGVzdD0nICsgdGVzdCArICcmaW5jbHVkZT0nICsgaW5jbHVkZSArICcmZXhjbHVkZT0nICsgZXhjbHVkZSkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlYXJjaCcsCiAgICAgICAgICAgICAgICBzZWFyY2hUYWJTdGF0dXM6ICdkZXRhaWwtdGFiLXNlbGVjdGVkJ307CiAgICB2YXIgc2VhcmNoID0ge3N1aXRlOiBzdWl0ZSwgdGVzdDogdGVzdCwgaW5jbHVkZTogaW5jbHVkZSwgZXhjbHVkZTogZXhjbHVkZX07CiAgICByZW5kZXJTZWxlY3RvcihhcmdzLCAnc2VhcmNoU2VsZWN0b3JUZW1wbGF0ZScsIHNlYXJjaCk7Cn0KCmZ1bmN0aW9uIHJlbmRlclNlYXJjaERldGFpbHMoc3VpdGUsIHRlc3QsIGluY2x1ZGUsIGV4Y2x1ZGUpIHsKICAgIHZhciB0ZXN0cyA9IHNlYXJjaFRlc3RzKHV0aWwuZXNjYXBlKHN1aXRlKSwgdXRpbC5lc2NhcGUodGVzdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmVzY2FwZShpbmNsdWRlKSwgdXRpbC5lc2NhcGUoZXhjbHVkZSkpOwogICAgdmFyIHBhc3NlZCA9IGNhbGN1bGF0ZVBhc3NlZCh0ZXN0cyk7CiAgICB2YXIgc3RhdHMgPSB7dG90YWw6IHRlc3RzLmxlbmd0aCwKICAgICAgICAgICAgICAgICBwYXNzOiBwYXNzZWQsCiAgICAgICAgICAgICAgICAgZmFpbDogdGVzdHMubGVuZ3RoIC0gcGFzc2VkLAogICAgICAgICAgICAgICAgIHRvdGFsVGltZTogY2FsY3VsYXRlVG90YWxUaW1lKHRlc3RzKX07CiAgICAkLnRtcGwoJ3RhZ09yVG90YWxEZXRhaWxzVGVtcGxhdGUnLCBzdGF0cykuYXBwZW5kVG8oJyNkZXRhaWxzLWhlYWRlcicpOwogICAgZHJhd1Rlc3REZXRhaWxzVGFibGUodGVzdHMsIHRydWUpOwp9CgpmdW5jdGlvbiBzZWFyY2hUZXN0cyhzdWl0ZVBhdHRlcm4sIHRlc3RQYXR0ZXJuLCBpbmNsdWRlUGF0dGVybiwgZXhjbHVkZVBhdHRlcm4pIHsKICAgIHZhciB0ZXN0czsKICAgIGlmIChzdWl0ZVBhdHRlcm4pCiAgICAgICAgdGVzdHMgPSB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKS5zZWFyY2hUZXN0c0luU3VpdGUoc3VpdGVQYXR0ZXJuKTsKICAgIGVsc2UKICAgICAgICB0ZXN0cyA9IHdpbmRvdy50ZXN0ZGF0YS5zdWl0ZSgpLmFsbFRlc3RzKCk7CiAgICByZXR1cm4gdXRpbC5maWx0ZXIodGVzdHMsIGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgaWYgKHRlc3RQYXR0ZXJuICYmICF0ZXN0Lm1hdGNoZXNOYW1lUGF0dGVybih0ZXN0UGF0dGVybikpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoaW5jbHVkZVBhdHRlcm4gJiYgIXRlc3QubWF0Y2hlc1RhZ1BhdHRlcm4oaW5jbHVkZVBhdHRlcm4pKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuICEoZXhjbHVkZVBhdHRlcm4gJiYgdGVzdC5tYXRjaGVzVGFnUGF0dGVybihleGNsdWRlUGF0dGVybikpOwogICAgfSk7Cn0KCmZ1bmN0aW9uIHNjcm9sbFRvU2VsZWN0b3IoYmFzZSwgcXVlcnkpIHsKICAgICQoJyN0ZXN0LWRldGFpbHMtY29udGFpbmVyJykuY3NzKCdtaW4taGVpZ2h0JywgJCh3aW5kb3cpLmhlaWdodCgpKTsKICAgIHZhciBhbmNob3IgPSBxdWVyeSA/IGJhc2UgKyAnPycgKyBlbmNvZGVVUklDb21wb25lbnQocXVlcnkpIDogYmFzZTsKICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyc7CiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IHdpbmRvdy5wcmV2TG9jYXRpb25IYXNoID0gYW5jaG9yOwp9CgpmdW5jdGlvbiByZW5kZXJTZWxlY3RvcihhcmdzLCB0ZW1wbGF0ZSwgc3RhdHMpIHsKICAgIHdpbmRvdy5lbGVtZW50c1RvUmVuZGVyID0gW107CiAgICB2YXIgY29udGFpbmVyID0gJCgnI3Rlc3QtZGV0YWlscy1jb250YWluZXInKTsKICAgIGNvbnRhaW5lci5lbXB0eSgpOwogICAgJC50bXBsKCdkZXRhaWxzSGVhZGVyVGVtcGxhdGUnLCBhcmdzKS5hcHBlbmRUbyhjb250YWluZXIpOwogICAgJC50bXBsKHRlbXBsYXRlLCBzdGF0cykuYXBwZW5kVG8oY29udGFpbmVyKTsKfQoKZnVuY3Rpb24gZHJhd1Rlc3REZXRhaWxzVGFibGUodGVzdHMsIHNvcnRCeVN0YXR1cykgewogICAgaWYgKCF0ZXN0cy5sZW5ndGgpCiAgICAgICAgcmV0dXJuOwogICAgcmVuZGVyVGVzdERldGFpbHNIZWFkZXIoKTsKICAgIHdpbmRvdy5lbGVtZW50c1RvUmVuZGVyID0gdGVzdHM7CiAgICB2YXIgdGFyZ2V0ID0gJCgnI3Rlc3QtZGV0YWlscycpLmZpbmQoJ3Rib2R5Jyk7CiAgICByZW5kZXJUZXN0RGV0YWlscyhzb3J0QnlTdGF0dXMsIHRhcmdldCk7Cn0KCmZ1bmN0aW9uIHJlbmRlclRlc3REZXRhaWxzSGVhZGVyKCkgewogICAgdmFyIGhlYWRlciA9ICQudG1wbCgndGVzdERldGFpbHNUYWJsZVRlbXBsYXRlJyk7CiAgICBoaWRlSGlkZGVuRGV0YWlsc0NvbHVtbnMoaGVhZGVyKTsKICAgIGhlYWRlci5hcHBlbmRUbygnI3Rlc3QtZGV0YWlscy1jb250YWluZXInKTsKfQoKZnVuY3Rpb24gc29ydEJ5U3RhdHVzKHQxLCB0MikgewogICAgaWYgKHQxLnN0YXR1cyAhPSB0Mi5zdGF0dXMpCiAgICAgICAgcmV0dXJuIHQxLnN0YXR1cyA9PSAnRkFJTCcgPyAtMSA6IDE7CiAgICBpZiAodDEuaXNDcml0aWNhbCAhPSB0Mi5pc0NyaXRpY2FsKQogICAgICAgIHJldHVybiB0MS5pc0NyaXRpY2FsID8gLTEgOiAxOwogICAgcmV0dXJuIHQxLmZ1bGxOYW1lIDwgdDIuZnVsbE5hbWUgPyAtMSA6IDE7Cn0KCmZ1bmN0aW9uIGdldFRlc3RzSGF2aW5nVGFnKHRhZykgewogICAgcmV0dXJuIHdpbmRvdy50ZXN0ZGF0YS5zdWl0ZSgpLnNlYXJjaFRlc3RzQnlUYWcodGFnKS5zb3J0KHNvcnRCeVN0YXR1cyk7Cn0KCmZ1bmN0aW9uIGdldFRvdGFsVGVzdHMobmFtZSkgewogICAgaWYgKG5hbWUgPT0gJ2NyaXRpY2FsJykKICAgICAgICByZXR1cm4gd2luZG93LnRlc3RkYXRhLnN1aXRlKCkuY3JpdGljYWxUZXN0cygpLnNvcnQoc29ydEJ5U3RhdHVzKTsKICAgIHJldHVybiB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKS5hbGxUZXN0cygpLnNvcnQoc29ydEJ5U3RhdHVzKTsKfQoKZnVuY3Rpb24gY2FsY3VsYXRlVG90YWxUaW1lKHRlc3RzKSB7CiAgICB2YXIgdG90YWwgPSAwOwogICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRlc3RzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQogICAgICAgIHRvdGFsICs9IHRlc3RzW2ldLnRpbWVzLmVsYXBzZWRNaWxsaXM7CiAgICByZXR1cm4gdXRpbC5mb3JtYXRFbGFwc2VkKHRvdGFsKTsKfQoKZnVuY3Rpb24gY2FsY3VsYXRlUGFzc2VkKHRlc3RzKSB7CiAgICB2YXIgcGFzc2VkID0gdXRpbC5maWx0ZXIodGVzdHMsIGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgcmV0dXJuIHRlc3Quc3RhdHVzID09ICdQQVNTJzsKICAgIH0pOwogICAgcmV0dXJuIHBhc3NlZC5sZW5ndGg7Cn0KCmZ1bmN0aW9uIHJlbmRlclRlc3REZXRhaWxzKHNvcnRCeVN0YXR1cywgdGFyZ2V0KSB7CiAgICBpZiAoIXdpbmRvdy5lbGVtZW50c1RvUmVuZGVyLmxlbmd0aCkKICAgICAgICByZXR1cm47CiAgICB2YXIgdGVzdHMgPSBwb3BVcFRvKHdpbmRvdy5lbGVtZW50c1RvUmVuZGVyLCA1MCk7CiAgICByZW5kZXJUZXN0RGV0YWlsc1Jvd3ModGVzdHMsIHRhcmdldCk7CiAgICBpZiAod2luZG93LmVsZW1lbnRzVG9SZW5kZXIubGVuZ3RoKQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge3JlbmRlclRlc3REZXRhaWxzKHNvcnRCeVN0YXR1cywgdGFyZ2V0KTt9LCAwKTsKICAgIGVsc2UKICAgICAgICBjb25maWd1cmVUYWJsZVNvcnRlcihzb3J0QnlTdGF0dXMpOwp9CgpmdW5jdGlvbiByZW5kZXJUZXN0RGV0YWlsc1Jvd3ModGVzdHMsIHRhcmdldCkgewogICAgdmFyIHJvd3MgPSAkLnRtcGwoJ3Rlc3REZXRhaWxzVGFibGVSb3dUZW1wbGF0ZScsIHRlc3RzLAogICAgICAgICAgICAgICAgICAgICAge2xvZ1VSTDogd2luZG93LnNldHRpbmdzLmxvZ1VSTH0pOwogICAgcm93cy5maW5kKCdhJykuY2xpY2soc3RvcFByb3BhZ2F0aW9uKTsKICAgIGhpZGVIaWRkZW5EZXRhaWxzQ29sdW1ucyhyb3dzKTsKICAgIHJvd3MuYXBwZW5kVG8odGFyZ2V0KTsKfQoKZnVuY3Rpb24gY29uZmlndXJlVGFibGVTb3J0ZXIoc29ydEJ5U3RhdHVzKSB7CiAgICB2YXIgY29uZmlnID0ge2hlYWRlcnM6IHszOiB7c29ydGVyOiAnY3JpdGljYWxpdHknfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY6IHtzb3J0SW5pdGlhbE9yZGVyOiAnZGVzYyd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNzoge3NvcnRlcjogJ3RpbWVzJ319LAogICAgICAgICAgICAgICAgICBzZWxlY3RvclNvcnQ6ICcuZGV0YWlscy1jb2wtaGVhZGVyJ307CiAgICBpZiAoc29ydEJ5U3RhdHVzKQogICAgICAgIGNvbmZpZ1snc29ydExpc3QnXSA9IFtbNCwgMF0sIFszLCAwXV07CiAgICAkKCcjdGVzdC1kZXRhaWxzJykudGFibGVzb3J0ZXIoY29uZmlnKTsKfQoKZnVuY3Rpb24gcG9wVXBUbyhsaXN0LCB1cFRvKSB7CiAgICB2YXIgcmVzdWx0ID0gW107CiAgICB3aGlsZSAobGlzdC5sZW5ndGggPiAwICYmIHJlc3VsdC5sZW5ndGggPCB1cFRvKQogICAgICAgIHJlc3VsdC5wdXNoKGxpc3Quc2hpZnQoKSk7CiAgICByZXR1cm4gcmVzdWx0Owp9CgpmdW5jdGlvbiB0b2dnbGVEZXRhaWxzQ29sdW1uKG5hbWUpIHsKICAgIHZhciBjb2x1bW4gPSAkKCcuZGV0YWlscy1jb2wtJyArIG5hbWUpOwogICAgY29sdW1uLnRvZ2dsZUNsYXNzKCdoaWRkZW4nKTsKICAgIHZhciBoaWRkZW4gPSBjb2x1bW4uaGFzQ2xhc3MoJ2hpZGRlbicpOwogICAgc3RvcmFnZS5zZXQobmFtZSwgaGlkZGVuID8gJ2hpZGRlbicgOiAndmlzaWJsZScpOwogICAgY29sdW1uLmZpbmQoJy5kZXRhaWxzLWNvbC10b2dnbGUnKS5odG1sKGhpZGRlbiA/ICcmaGVsbGlwOycgOiAnJnRpbWVzOycpOwp9CgpmdW5jdGlvbiBoaWRlSGlkZGVuRGV0YWlsc0NvbHVtbnMoZWxlbSkgewogICAgdmFyIG5hbWVzID0gWydkb2MnLCAndGFncycsICdtc2cnLCAnZWxhcHNlZCcsICd0aW1lcyddOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBuYW1lID0gbmFtZXNbaV07CiAgICAgICAgaWYgKHN0b3JhZ2UuZ2V0KG5hbWUsICd2aXNpYmxlJykgPT0gJ2hpZGRlbicpIHsKICAgICAgICAgICAgdmFyIGNvbHVtbiA9IGVsZW0uZmluZCgnLmRldGFpbHMtY29sLScgKyBuYW1lKTsKICAgICAgICAgICAgY29sdW1uLmFkZENsYXNzKCdoaWRkZW4nKTsKICAgICAgICAgICAgY29sdW1uLmZpbmQoJy5kZXRhaWxzLWNvbC10b2dnbGUnKS5odG1sKCcmaGVsbGlwOycpOwogICAgICAgIH0KICAgIH0KfQo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ic3VtbWFyeVRhYmxlVGVtcGxhdGUiPgogIDxoMj5TdW1tYXJ5IEluZm9ybWF0aW9uPC9oMj4KICA8dGFibGUgY2xhc3M9ImRldGFpbHMiPgogICAgPHRyPgogICAgICA8dGg+U3RhdHVzOjwvdGg+CiAgICAgIHt7aWYgY3JpdGljYWxGYWlsZWR9fQogICAgICA8dGQ+PGEgaHJlZj0iI3RvdGFscz9jcml0aWNhbCIgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgnY3JpdGljYWwnKSIKICAgICAgICAgICAgIGNsYXNzPSJmYWlsIj4ke2NyaXRpY2FsRmFpbGVkfSBjcml0aWNhbCB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXt7aWYgY3JpdGljYWxGYWlsZWQgIT0gMX19c3t7L2lmfX0gZmFpbGVkPC9hPjwvdGQ+CiAgICAgIHt7ZWxzZSB0b3RhbEZhaWxlZH19CiAgICAgIDx0ZD48YSBocmVmPSIjdG90YWxzP2NyaXRpY2FsIiBvbmNsaWNrPSJ0b3RhbERldGFpbFNlbGVjdGVkKCdjcml0aWNhbCcpIgogICAgICAgICAgICAgY2xhc3M9InBhc3MiPkFsbCBjcml0aWNhbCB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXMgcGFzc2VkPC9hPjwvdGQ+CiAgICAgIHt7ZWxzZX19CiAgICAgIDx0ZD48YSBocmVmPSIjdG90YWxzP2FsbCIgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgnYWxsJykiCiAgICAgICAgICAgICBjbGFzcz0icGFzcyI+QWxsIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19cyBwYXNzZWQ8L2E+PC90ZD4KICAgICAge3svaWZ9fQogICAgPC90cj4KICAgIHt7aWYgZG9jKCl9fQogICAgPHRyPgogICAgICA8dGg+RG9jdW1lbnRhdGlvbjo8L3RoPgogICAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sIGRvYygpfX08L3RkPgogICAgPC90cj4KICAgIHt7L2lmfX0KICAgIHt7ZWFjaCBtZXRhZGF0YX19CiAgICA8dHI+CiAgICAgIDx0aD57e2h0bWwgJHZhbHVlWzBdfX06PC90aD4KICAgICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCAkdmFsdWVbMV19fTwvdGQ+CiAgICA8L3RyPgogICAge3svZWFjaH19CiAgICB7e2lmIHRpbWVzLnN0YXJ0VGltZSAhPSAnTi9BJ319CiAgICA8dHI+CiAgICAgIDx0aD5TdGFydCBUaW1lOjwvdGg+CiAgICAgIDx0ZD4ke3RpbWVzLnN0YXJ0VGltZX08L3RkPgogICAgPC90cj4KICAgIHt7L2lmfX0KICAgIHt7aWYgdGltZXMuZW5kVGltZSAhPSAnTi9BJ319CiAgICA8dHI+CiAgICAgIDx0aD5FbmQgVGltZTo8L3RoPgogICAgICA8dGQ+JHt0aW1lcy5lbmRUaW1lfTwvdGQ+CiAgICA8L3RyPgogICAge3svaWZ9fQogICAgPHRyPgogICAgICA8dGg+RWxhcHNlZCBUaW1lOjwvdGg+CiAgICAgIDx0ZD4ke3RpbWVzLmVsYXBzZWRUaW1lfTwvdGQ+CiAgICA8L3RyPgogICAge3tpZiAkaXRlbS5sb2dVUkx9fQogICAgPHRyPgogICAgICA8dGg+TG9nIEZpbGU6PC90aD4KICAgICAgPHRkPjxhIGhyZWY9IiR7JGl0ZW0ubG9nVVJMfSI+JHskaXRlbS5sb2dVUkx9PC9hPjwvdGQ+CiAgICA8L3RyPgogICAge3svaWZ9fQogIDwvdGFibGU+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0b3RhbFN0YXRpc3RpY3NSb3dUZW1wbGF0ZSI+CiAgPHRyIG9uY2xpY2s9InRvdGFsRGV0YWlsU2VsZWN0ZWQoJyR7dHlwZX0nKSIgY2xhc3M9InJvdy0keyRpdGVtLmluZGV4fSI+CiAgICA8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIj4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8YSBocmVmPSIjdG90YWxzPyR7dHlwZX0iPnt7aHRtbCBsYWJlbH19PC9hPgogICAgICA8L2Rpdj4KICAgIDwvdGQ+CiAgICB7e3RtcGwoJGRhdGEpICdzdGF0Q29sdW1uc1RlbXBsYXRlJ319CiAgPC90cj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRhZ1N0YXRpc3RpY3NSb3dUZW1wbGF0ZSI+CiAgPHRyIG9uY2xpY2s9InRhZ0RldGFpbFNlbGVjdGVkKCcke2xhYmVsfScpIiBjbGFzcz0icm93LSR7JGl0ZW0uaW5kZXh9Ij4KICAgIDx0ZCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiIHRpdGxlPSJ7e2h0bWwgZG9jfX0iPgogICAgICA8ZGl2IGNsYXNzPSJzdGF0LW5hbWUiPgogICAgICAgIDxhIGhyZWY9IiN0YWdzPyR7bGFiZWx9Ij57e2h0bWwgbGFiZWx9fTwvYT4KICAgICAgICB7e2lmIGluZm99fSgke2luZm99KXt7L2lmfX0KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InRhZy1saW5rcyI+CiAgICAgICAge3tlYWNoIGxpbmtzfX0KICAgICAgICA8c3Bhbj5bPGEgaHJlZj0ie3todG1sICR2YWx1ZS51cmx9fSIgb25jbGljaz0ic3RvcFByb3BhZ2F0aW9uKGV2ZW50KSIKICAgICAgICAgICAgICAgICAgdGl0bGU9Int7aHRtbCAkdmFsdWUudXJsfX0iPnt7aHRtbCAkdmFsdWUudGl0bGV9fTwvYT5dPC9zcGFuPgogICAgICAgIHt7L2VhY2h9fQogICAgICA8L2Rpdj4KICAgIDwvdGQ+CiAgICB7e3RtcGwoJGRhdGEpICdzdGF0Q29sdW1uc1RlbXBsYXRlJ319CiAgPC90cj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1aXRlU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgb25jbGljaz0ic3VpdGVEZXRhaWxTZWxlY3RlZCgnJHtpZH0nKSIgY2xhc3M9InJvdy0keyRpdGVtLmluZGV4fSI+CiAgICA8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIiB0aXRsZT0ie3todG1sIGxhYmVsfX0iPgogICAgICA8ZGl2IGNsYXNzPSJzdGF0LW5hbWUiPgogICAgICAgIDxhIGhyZWY9IiNzdWl0ZXM/JHtpZH0iPjxzcGFuIGNsYXNzPSJwYXJlbnQtbmFtZSI+e3todG1sIGZvcm1hdFBhcmVudE5hbWV9fTwvc3Bhbj57e2h0bWwgbmFtZX19PC9hPgogICAgICA8L2Rpdj4KICAgIDwvdGQ+CiAgICB7e3RtcGwoJGRhdGEpICdzdGF0Q29sdW1uc1RlbXBsYXRlJ319CiAgPC90cj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9ImRldGFpbHNIZWFkZXJUZW1wbGF0ZSI+CiAgPGgyIGlkPSIke2xpbmtUYXJnZXR9Ij57ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fSBEZXRhaWxzPC9oMj4KICA8dWwgaWQ9ImRldGFpbC10YWJzIj4KICAgIDxsaSBjbGFzcz0iJHt0b3RhbFRhYlN0YXR1c30gZGV0YWlsLXRhYiI+CiAgICAgIDxhIGhyZWY9IiN0b3RhbHMiIG9uY2xpY2s9InJlbmRlclRvdGFsU2VsZWN0b3IoKSI+VG90YWxzPC9hPgogICAgPC9saT4KICAgIDxsaSBjbGFzcz0iJHt0YWdUYWJTdGF0dXN9IGRldGFpbC10YWIiPgogICAgICA8YSBocmVmPSIjdGFncyIgb25jbGljaz0icmVuZGVyVGFnU2VsZWN0b3IoKSI+VGFnczwvYT4KICAgIDwvbGk+CiAgICA8bGkgY2xhc3M9IiR7c3VpdGVUYWJTdGF0dXN9IGRldGFpbC10YWIiPgogICAgICA8YSBocmVmPSIjc3VpdGVzIiBvbmNsaWNrPSJyZW5kZXJTdWl0ZVNlbGVjdG9yKCkiPlN1aXRlczwvYT4KICAgIDwvbGk+CiAgICA8bGkgY2xhc3M9IiR7c2VhcmNoVGFiU3RhdHVzfSBkZXRhaWwtdGFiIj4KICAgICAgPGEgaHJlZj0iI3NlYXJjaCIgb25jbGljaz0icmVuZGVyU2VhcmNoU2VsZWN0b3IoKSI+U2VhcmNoPC9hPgogICAgPC9saT4KICA8L3VsPgo8L3NjcmlwdD4KCjxzY3JpcHQgIHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRvdGFsRGV0YWlsc1NlbGVjdG9yVGVtcGxhdGUiPgogIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgaWQ9ImRldGFpbHMtaGVhZGVyIj4KICAgIDx0ciBjbGFzcz0ic2VsZWN0b3IiPgogICAgICA8dGg+VHlwZTo8L3RoPgogICAgICA8dGQgaWQ9Im5vcm1hbC1zZWxlY3RvciI+CiAgICAgICAgPGlucHV0IGlkPSJyYWRpby1jcml0aWNhbCIgdHlwZT0icmFkaW8iIG5hbWU9InRvdGFscy1yYWRpbyIKICAgICAgICAgICAgICAgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgnY3JpdGljYWwnKSIKICAgICAgICAgICAgICAge3tpZiBzZWxlY3RlZCA9PSAnY3JpdGljYWwnfX1jaGVja2VkPSJjaGVja2VkInt7L2lmfX0+CiAgICAgICAgPGxhYmVsIGZvcj0icmFkaW8tY3JpdGljYWwiPkNyaXRpY2FsIHt7PSB0ZXN0T3JUYXNrKCd7VGVzdH0nKX19czwvbGFiZWw+PGJyPgogICAgICAgIDxpbnB1dCBpZD0icmFkaW8tYWxsIiB0eXBlPSJyYWRpbyIgbmFtZT0idG90YWxzLXJhZGlvIgogICAgICAgICAgICAgICBvbmNsaWNrPSJ0b3RhbERldGFpbFNlbGVjdGVkKCdhbGwnKSIKICAgICAgICAgICAgICAge3tpZiBzZWxlY3RlZCA9PSAnYWxsJ319Y2hlY2tlZD0iY2hlY2tlZCJ7ey9pZn19PgogICAgICAgIDxsYWJlbCBmb3I9InJhZGlvLWFsbCI+QWxsIHt7PSB0ZXN0T3JUYXNrKCd7VGVzdH0nKX19czwvbGFiZWw+CiAgICAgIDwvdGQ+CiAgICAgIDx0ZCBpZD0icHJpbnQtc2VsZWN0b3IiPjwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+Cjwvc2NyaXB0PgoKPHNjcmlwdCAgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idGFnRGV0YWlsc1NlbGVjdG9yVGVtcGxhdGUiPgogIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgaWQ9ImRldGFpbHMtaGVhZGVyIj4KICAgIDx0ciBjbGFzcz0ic2VsZWN0b3IiPgogICAgICA8dGg+TmFtZTo8L3RoPgogICAgICA8dGQgaWQ9Im5vcm1hbC1zZWxlY3RvciI+CiAgICAgICAgPHNlbGVjdCBpZD0idGFnLWRldGFpbC1zZWxlY3RvciIKICAgICAgICAgICAgICAgIG9uY2hhbmdlPSJ0YWdEZXRhaWxTZWxlY3RlZCh0aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZSkiPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5TZWxlY3QgdGFnLi4uPC9vcHRpb24+CiAgICAgICAgICB7e2VhY2ggdGFnc319CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIkeyR2YWx1ZS5sYWJlbH0iCiAgICAgICAgICAgICAgICAgIHt7aWYgJHZhbHVlLmxhYmVsID09IHNlbGVjdGVkfX1zZWxlY3RlZD0ic2VsZWN0ZWQie3svaWZ9fT4KICAgICAgICAgICAge3todG1sICR2YWx1ZS5sYWJlbH19IHt7aWYgJHZhbHVlLmluZm99fSgkeyR2YWx1ZS5pbmZvfSl7ey9pZn19CiAgICAgICAgICA8L29wdGlvbj4KICAgICAgICAgIHt7L2VhY2h9fQogICAgICAgIDwvc2VsZWN0PgogICAgICA8L3RkPgogICAgICA8dGQgaWQ9InByaW50LXNlbGVjdG9yIj48L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgIHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1aXRlRGV0YWlsc1NlbGVjdG9yVGVtcGxhdGUiPgogIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgaWQ9ImRldGFpbHMtaGVhZGVyIj4KICAgIDx0ciBjbGFzcz0ic2VsZWN0b3IiPgogICAgICA8dGg+TmFtZTo8L3RoPgogICAgICA8dGQgaWQ9Im5vcm1hbC1zZWxlY3RvciI+CiAgICAgICAgPHNlbGVjdCBpZD0ic3VpdGUtZGV0YWlsLXNlbGVjdG9yIgogICAgICAgICAgICAgICAgb25jaGFuZ2U9InN1aXRlRGV0YWlsU2VsZWN0ZWQodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpIj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+U2VsZWN0IHN1aXRlLi4uPC9vcHRpb24+CiAgICAgICAgICB7e2VhY2ggc3VpdGVzfX0KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiR7JHZhbHVlLmlkfSIKICAgICAgICAgICAgICAgICAge3tpZiAkdmFsdWUuaWQgPT0gc2VsZWN0ZWR9fXNlbGVjdGVkPSJzZWxlY3RlZCJ7ey9pZn19PgogICAgICAgICAgICB7e2h0bWwgJHZhbHVlLmxhYmVsfX0KICAgICAgICAgIDwvb3B0aW9uPgogICAgICAgICAge3svZWFjaH19CiAgICAgICAgPC9zZWxlY3Q+CiAgICAgIDwvdGQ+CiAgICAgIDx0ZCBpZD0icHJpbnQtc2VsZWN0b3IiPjwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+Cjwvc2NyaXB0PgoKPHNjcmlwdCAgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ic2VhcmNoU2VsZWN0b3JUZW1wbGF0ZSI+CiAgPGZvcm0gYWN0aW9uPSJqYXZhc2NyaXB0OnZvaWQoMCkiPgogICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBpZD0iZGV0YWlscy1oZWFkZXIiPgogICAgICA8dHIgY2xhc3M9InNlbGVjdG9yIGZpcnN0LXNlbGVjdG9yIj4KICAgICAgICA8dGg+PGxhYmVsIGZvcj0ic2VhcmNoLXN1aXRlIj5TdWl0ZTo8L2xhYmVsPjwvdGg+CiAgICAgICAgPHRkPjxpbnB1dCBpZD0ic2VhcmNoLXN1aXRlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iJHtzdWl0ZX0iPjwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0ic2VsZWN0b3IgbWlkZGxlLXNlbGVjdG9yIj4KICAgICAgICA8dGg+PGxhYmVsIGZvcj0ic2VhcmNoLXRlc3QiPnt7PSB0ZXN0T3JUYXNrKCd7VGVzdH0nKX19OjwvbGFiZWw+PC90aD4KICAgICAgICA8dGQ+PGlucHV0IGlkPSJzZWFyY2gtdGVzdCIgdHlwZT0idGV4dCIgdmFsdWU9IiR7dGVzdH0iPjwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0ic2VsZWN0b3IgbWlkZGxlLXNlbGVjdG9yIj4KICAgICAgICA8dGg+PGxhYmVsIGZvcj0ic2VhcmNoLWluY2x1ZGUiPkluY2x1ZGU6PC9sYWJlbD48L3RoPgogICAgICAgIDx0ZD48aW5wdXQgaWQ9InNlYXJjaC1pbmNsdWRlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iJHtpbmNsdWRlfSI+PC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyIGNsYXNzPSJzZWxlY3RvciBtaWRkbGUtc2VsZWN0b3IiPgogICAgICAgIDx0aD48bGFiZWwgZm9yPSJzZWFyY2gtZXhjbHVkZSI+RXhjbHVkZTo8L2xhYmVsPjwvdGg+CiAgICAgICAgPHRkPjxpbnB1dCBpZD0ic2VhcmNoLWV4Y2x1ZGUiIHR5cGU9InRleHQiIHZhbHVlPSIke2V4Y2x1ZGV9Ij48L3RkPgogICAgICA8L3RyPgogICAgICA8dHIgY2xhc3M9InNlbGVjdG9yIGxhc3Qtc2VsZWN0b3IiIGlkPSJzZWFyY2gtYnV0dG9ucyI+CiAgICAgICAgPHRoPjwvdGg+CiAgICAgICAgPHRkPgogICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNlYXJjaCIKICAgICAgICAgICAgICAgICBvbmNsaWNrPSJzZWFyY2hFeGVjdXRlZCgkKCcjc2VhcmNoLXN1aXRlJykudmFsKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3NlYXJjaC10ZXN0JykudmFsKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3NlYXJjaC1pbmNsdWRlJykudmFsKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3NlYXJjaC1leGNsdWRlJykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsiPgogICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkNsZWFyIgogICAgICAgICAgICAgICAgIG9uY2xpY2s9IiQoJyNzZWFyY2gtc3VpdGUnKS52YWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtdGVzdCcpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3NlYXJjaC1pbmNsdWRlJykudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjc2VhcmNoLWV4Y2x1ZGUnKS52YWwoJycpOyI+CiAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIG9uY2xpY2s9IiQoJyNzZWFyY2gtaGVscCcpLnRvZ2dsZSgpIgogICAgICAgICAgICAgdGl0bGU9IlRvZ2dsZSBzZWFyY2ggaGVscC4iPkhlbHA8L2E+CiAgICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyIGlkPSJzZWFyY2gtaGVscCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgogICAgICAgIDx0aD48L3RoPgogICAgICAgIDx0ZD4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxoMz5TZWFyY2ggZmllbGRzPC9oMz4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX1zIGNhbiBiZSBzZWFyY2hlZCBiYXNlZCBvbiBzdWl0ZSBhbmQKICAgICAgICAgICAgICB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fSBuYW1lcyBhcyB3ZWxsIGFzIGJhc2VkIG9uIHRhZ3MuIElmCiAgICAgICAgICAgICAgbXVsdGlwbGUgc2VhcmNoIGNyaXRlcmlhIGFyZSB1c2VkLCBvbmx5CiAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX1zIG1hdGNoaW5nIGFsbCBvZiB0aGVtIGFyZSBpbmNsdWRlZC4KICAgICAgICAgICAgICBTZWFyY2ggZmllbGRzIGhhdmUgc2FtZSBzZW1hbnRpY3MgYXMKICAgICAgICAgICAgICA8ZW0+JiM4MjA5OyYjODIwOTtzdWl0ZTwvZW0+LAogICAgICAgICAgICAgIDxlbT4mIzgyMDk7JiM4MjA5O3t7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19PC9lbT4sCiAgICAgICAgICAgICAgPGVtPiYjODIwOTsmIzgyMDk7aW5jbHVkZTwvZW0+IGFuZAogICAgICAgICAgICAgIDxlbT4mIzgyMDk7JiM4MjA5O2V4Y2x1ZGU8L2VtPiBjb21tYW5kIGxpbmUgb3B0aW9ucywgcmVzcGVjdGl2ZWx5LgogICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0ic2VhcmNoLWhlbHAtZXhhbXBsZXMiPgogICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImhlbHAtaXRlbSI+CiAgICAgICAgICAgICAgPGNvbCBjbGFzcz0iaGVscC1leHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgPGNvbCBjbGFzcz0iaGVscC1leGFtcGxlcz4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGg+RmllbGQ8L3RoPgogICAgICAgICAgICAgICAgPHRoPkV4cGxhbmF0aW9uPC90aD4KICAgICAgICAgICAgICAgIDx0aD5FeGFtcGxlczwvdGg+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+U3VpdGU8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICB7ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fXMgaW4gbWF0Y2hpbmcgc3VpdGVzIGFyZSBpbmNsdWRlZC4KICAgICAgICAgICAgICAgICAgVGhlIHBhdHRlcm4gY2FuIG1hdGNoIGVpdGhlciBzdWl0ZSdzIG5hbWUgb3IgaXRzIGZ1bGwgbmFtZQogICAgICAgICAgICAgICAgICB0aGF0IGNvbnRhaW5zIGFsc28gcGFyZW50IHN1aXRlIG5hbWVzLgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5NeSBTdWl0ZTxicj5Sb290LlBhcmVudC5TdWkqPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD57ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIE1hdGNoaW5nIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19cyBhcmUgaW5jbHVkZWQuIFRoZQogICAgICAgICAgICAgICAgICBwYXR0ZXJuIGNhbiBtYXRjaCBlaXRoZXIge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX0ncyBuYW1lCiAgICAgICAgICAgICAgICAgIG9yIGl0cyBmdWxsIG5hbWUgdGhhdCBjb250YWlucyBhbHNvIHBhcmVudCBzdWl0ZSBuYW1lcy4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+RXhhbXBsZSBOYW1lPGJyPlJvb3QuUGEqLlQ/Pz88L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPkluY2x1ZGU8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICB7ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fXMgdGhhdCBjb250YWluIG1hdGNoaW5nIHRhZ3MgYXJlCiAgICAgICAgICAgICAgICAgIGluY2x1ZGVkLgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5zbW9rZTxicj5idWctKjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+RXhjbHVkZTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIHt7PSB0ZXN0T3JUYXNrKCd7VGVzdH0nKX19cyB0aGF0IGNvbnRhaW4gbWF0Y2hpbmcgdGFncyBhcmUKICAgICAgICAgICAgICAgICAgbm90IGluY2x1ZGVkLgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5zbG93PGJyPmZlYXR1cmUtND88L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDxoMz5QYXR0ZXJuczwvaDM+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIEFsbCBzZWFyY2hlcyBzdXBwb3J0IDxlbT4qPC9lbT4gYW5kIDxlbT4/PC9lbT4gd2lsZGNhcmRzIGFuZCBhcmUKICAgICAgICAgICAgICBjYXNlLCBzcGFjZSBhbmQgdW5kZXJzY29yZSBpbnNlbnNpdGl2ZS4gVGFnIHJlbGF0ZWQgc2VhcmNoZXMgYWxzbwogICAgICAgICAgICAgIHN1cHBvcnQgPGVtPkFORDwvZW0+LCA8ZW0+T1I8L2VtPiBhbmQgPGVtPk5PVDwvZW0+IChjYXNlLXNlbnNpdGl2ZSkKICAgICAgICAgICAgICBjb21iaW5pbmcgb3BlcmF0b3JzLiBJZiBvcGVyYXRvcnMgYXJlIHVzZWQgdG9nZXRoZXIsIHRoZWlyCiAgICAgICAgICAgICAgcHJlY2VkZW5jZSwgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCwgaXMgPGVtPkFORDwvZW0+LCA8ZW0+T1I8L2VtPiwKICAgICAgICAgICAgICA8ZW0+Tk9UPC9lbT4uIFNlZSA8ZW0+U2ltcGxlIHBhdHRlcm5zPC9lbT4gYW5kCiAgICAgICAgICAgICAgPGVtPlRhZyBwYXR0ZXJuczwvZW0+IHNlY3Rpb25zIGluCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3JvYm90ZnJhbWV3b3JrLm9yZy9yb2JvdGZyYW1ld29yay8jdXNlci1ndWlkZSI+Um9ib3QKICAgICAgICAgICAgICBGcmFtZXdvcmsgVXNlciBHdWlkZTwvYT4gZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9InNlYXJjaC1oZWxwLWV4YW1wbGVzIj4KICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJoZWxwLWl0ZW0iPgogICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImhlbHAtZXhwbGFuYXRpb24iPgogICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImhlbHAtZXhhbXBsZXM+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPlBhdHRlcm48L3RoPgogICAgICAgICAgICAgICAgPHRoPkV4cGxhbmF0aW9uPC90aD4KICAgICAgICAgICAgICAgIDx0aD5FeGFtcGxlczwvdGg+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+KjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+TWF0Y2hlcyBhbnl0aGluZywgZXZlbiBhbiBlbXB0eSBzdHJpbmcuPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5mKjxicj5zcHJpbnQtKjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+PzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+TWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3Rlci48L3RkPgogICAgICAgICAgICAgICAgPHRkPmY/Pzxicj5zcHJpbnQtMT88L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPkFORDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+TWF0Y2hlcyBpZiBhbGwgcGF0dGVybnMgbWF0Y2guPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5mb28gQU5EIGJhcjxicj54IEFORCB5KiBBTkQgej8/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD5PUjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+TWF0Y2hlcyBpZiBhbnkgcGF0dGVybiBtYXRjaGVzLjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+Zm9vIE9SIGJhcjxicj54IE9SIHkqIE9SIHoxIEFORCB6MjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+Tk9UPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICBNYXRjaGVzIGlmIChvcHRpb25hbCkgcGF0dGVybiBiZWZvcmUgbWF0Y2hlcyBhbmQgcGF0dGVybgogICAgICAgICAgICAgICAgICAgIGFmdGVyIGRvZXMgbm90LgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5mb28gTk9UIGJhcjxicj4qIE5PVCBpZC0qIEFORCBzbW9rZTxicj5OT1QgYmFyPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgIDwvdGFibGU+CiAgPC9mb3JtPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idGFnT3JUb3RhbERldGFpbHNUZW1wbGF0ZSI+CiAgPHRyPgogICAgPHRoPlN0YXR1czo8L3RoPgogICAgPHRkPiR7dG90YWx9IHRvdGFsLCAke3Bhc3N9IHBhc3NlZCwge3tpZiBmYWlsfX08c3BhbiBjbGFzcz0iZmFpbCI+JHtmYWlsfSBmYWlsZWQ8L3NwYW4+e3tlbHNlfX08c3BhbiBjbGFzcz0icGFzcyI+MCBmYWlsZWQ8L3NwYW4+e3svaWZ9fTwvdGQ+CiAgPC90cj4KICB7e2lmIGRvY319CiAgPHRyPgogICAgPHRoPkRvY3VtZW50YXRpb246PC90aD4KICAgIDx0ZD57e2h0bWwgZG9jfX08L3RkPgogIDwvdHI+CiAge3svaWZ9fQogIHt7aWYgY29tYmluZWR9fQogIDx0cj4KICAgIDx0aD5QYXR0ZXJuOjwvdGg+CiAgICA8dGQ+e3todG1sIGNvbWJpbmVkfX08L3RkPgogIDwvdHI+CiAge3svaWZ9fQogIHt7aWYgbGlua3N9fXt7aWYgbGlua3MubGVuZ3RofX0KICA8dHI+CiAgICA8dGg+TGlua3M6PC90aD4KICAgIDx0ZD57e2VhY2ggbGlua3N9fTxhIGhyZWY9Int7aHRtbCAkdmFsdWUudXJsfX0iCiAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0ie3todG1sICR2YWx1ZS51cmx9fSI+e3todG1sICR2YWx1ZS50aXRsZX19PC9hPiAmbmJzcDsge3svZWFjaH19PC90ZD4KICA8L3RyPgogIHt7L2lmfX17ey9pZn19CiAgPHRyPgogICAgPHRoPlRvdGFsIFRpbWU6PC90aD4KICAgIDx0ZD4ke3RvdGFsVGltZX08L3RkPgogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJzdWl0ZURldGFpbHNUZW1wbGF0ZSI+CiAgPHRyPgogICAgPHRoPlN0YXR1czo8L3RoPgogICAgPHRkPnt7dG1wbCgkZGF0YSkgJ3N1aXRlU3RhdHVzTWVzc2FnZVRlbXBsYXRlJ319PC90ZD4KICA8L3RyPgogIHt7aWYgZG9jKCl9fQogIDx0cj4KICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sIGRvYygpfX08L3RkPgogIDwvdHI+CiAge3svaWZ9fQogIHt7ZWFjaCBtZXRhZGF0YX19CiAgPHRyPgogICAgPHRoPnt7aHRtbCAkdmFsdWVbMF19fTo8L3RoPgogICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCAkdmFsdWVbMV19fTwvdGQ+CiAgPC90cj4KICB7ey9lYWNofX0KICB7e2lmIG1lc3NhZ2UoKX19CiAgPHRyPgogICAgPHRoPk1lc3NhZ2U6PC90aD4KICAgIDx0ZCBjbGFzcz0ibWVzc2FnZSI+e3todG1sIG1lc3NhZ2UoKX19PC90ZD4KICA8L3RyPgogIHt7L2lmfX0KICA8dHI+CiAgICA8dGg+U3RhcnQgLyBFbmQgVGltZTo8L3RoPgogICAgPHRkPiR7dGltZXMuc3RhcnRUaW1lfSAvICR7dGltZXMuZW5kVGltZX08L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRoPkVsYXBzZWQgVGltZTo8L3RoPgogICAgPHRkPiR7dGltZXMuZWxhcHNlZFRpbWV9PC90ZD4KICA8L3RyPgogIHt7aWYgJGl0ZW0ubG9nVVJMfX0KICA8dHI+CiAgICA8dGg+TG9nIEZpbGU6PC90aD4KICAgIDx0ZD48YSBocmVmPSIkeyRpdGVtLmxvZ1VSTH0jJHtpZH0iCiAgICAgICAgICAgdGl0bGU9Int7aHRtbCBmdWxsTmFtZX19Ij4keyRpdGVtLmxvZ1VSTH0jJHtpZH08L2E+PC90ZD4KICA8L3RyPgogIHt7L2lmfX0KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRlc3REZXRhaWxzVGFibGVUZW1wbGF0ZSI+CiAgPHRhYmxlIGlkPSJ0ZXN0LWRldGFpbHMiPgogICAgPHRoZWFkPgogICAgICA8dHI+CiAgICAgICAgPHRoIGNsYXNzPSJkZXRhaWxzLWNvbC1uYW1lIiB0aXRsZT0iTmFtZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC1oZWFkZXInPk5hbWU8L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtZG9jIiB0aXRsZT0iRG9jdW1lbnRhdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC10b2dnbGUnIG9uY2xpY2s9InRvZ2dsZURldGFpbHNDb2x1bW4oJ2RvYycpIj4mdGltZXM7PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC1oZWFkZXInPkRvY3VtZW50YXRpb248L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtdGFncyIgdGl0bGU9IlRhZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtdG9nZ2xlJyBvbmNsaWNrPSJ0b2dnbGVEZXRhaWxzQ29sdW1uKCd0YWdzJykiPiZ0aW1lczs8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLWhlYWRlcic+VGFnczwvZGl2PgogICAgICAgIDwvdGg+CiAgICAgICAgPHRoIGNsYXNzPSJkZXRhaWxzLWNvbC1jcml0IiB0aXRsZT0iQ3JpdGljYWwiPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5Dcml0LjwvZGl2PgogICAgICAgIDwvdGg+CiAgICAgICAgPHRoIGNsYXNzPSJkZXRhaWxzLWNvbC1zdGF0dXMiIHRpdGxlPSJTdGF0dXMiPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5TdGF0dXM8L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtbXNnIiB0aXRsZT0iTWVzc2FnZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC10b2dnbGUnIG9uY2xpY2s9InRvZ2dsZURldGFpbHNDb2x1bW4oJ21zZycpIj4mdGltZXM7PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC1oZWFkZXInPk1lc3NhZ2U8L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtZWxhcHNlZCIgdGl0bGU9IkVsYXBzZWQgVGltZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC10b2dnbGUnIG9uY2xpY2s9InRvZ2dsZURldGFpbHNDb2x1bW4oJ2VsYXBzZWQnKSI+JnRpbWVzOzwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5FbGFwc2VkPC9kaXY+CiAgICAgICAgPC90aD4KICAgICAgICA8dGggY2xhc3M9ImRldGFpbHMtY29sLXRpbWVzIiB0aXRsZT0iU3RhcnQgVGltZSAvIEVuZCBUaW1lIj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLXRvZ2dsZScgb25jbGljaz0idG9nZ2xlRGV0YWlsc0NvbHVtbigndGltZXMnKSI+JnRpbWVzOzwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5TdGFydCAvIEVuZDwvZGl2PgogICAgICAgIDwvdGg+CiAgICAgIDwvdHI+CiAgICA8L3RoZWFkPgogICAgPHRib2R5PjwvdGJvZHk+CiAgPC90YWJsZT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRlc3REZXRhaWxzVGFibGVSb3dUZW1wbGF0ZSI+CiAge3tpZiAkaXRlbS5sb2dVUkx9fQogIDx0ciBvbmNsaWNrPSJsb2NhdGlvbiA9ICckeyRpdGVtLmxvZ1VSTH0jJHtpZH0nIiB0aXRsZT0ie3todG1sIGZ1bGxOYW1lfX0iPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1uYW1lIj4KICAgICAgPGRpdj48YSBocmVmPSIkeyRpdGVtLmxvZ1VSTH0jJHtpZH0iPjxzcGFuIGNsYXNzPSJwYXJlbnQtbmFtZSI+e3todG1sIGZvcm1hdFBhcmVudE5hbWV9fTwvc3Bhbj57e2h0bWwgbmFtZX19PC9hPjwvZGl2PgogICAgPC90ZD4KICB7e2Vsc2V9fQogIDx0ciB0aXRsZT0ie3todG1sIGZ1bGxOYW1lfX0iPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1uYW1lIj4KICAgICAgPGRpdj48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBmb3JtYXRQYXJlbnROYW1lfX08L3NwYW4+e3todG1sIG5hbWV9fTwvZGl2PgogICAgPC90ZD4KICB7ey9pZn19CiAgICA8dGQgY2xhc3M9ImRldGFpbHMtY29sLWRvYyI+PGRpdiBjbGFzcz0iZG9jIGRldGFpbHMtbGltaXRlZCI+e3todG1sIGRvYygpfX08L2Rpdj48L3RkPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC10YWdzIj48ZGl2Pnt7aHRtbCB0YWdzLmpvaW4oJywgJyl9fTwvZGl2PjwvdGQ+CiAgICA8dGQgY2xhc3M9ImRldGFpbHMtY29sLWNyaXQiPjxkaXY+e3tpZiBpc0NyaXRpY2FsfX15ZXN7e2Vsc2V9fW5ve3svaWZ9fTwvZGl2PjwvdGQ+CiAgICA8dGQgY2xhc3M9ImRldGFpbHMtY29sLXN0YXR1cyI+PGRpdj48c3BhbiBjbGFzcz0ibGFiZWwgJHtzdGF0dXMudG9Mb3dlckNhc2UoKX0iPiR7c3RhdHVzfTwvc3Bhbj48L2Rpdj48L3RkPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1tc2ciPjxkaXYgY2xhc3M9Im1lc3NhZ2UgZGV0YWlscy1saW1pdGVkIj57e2h0bWwgbWVzc2FnZSgpfX08L2Rpdj48L3RkPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1lbGFwc2VkIj48ZGl2PiR7dGltZXMuZWxhcHNlZFRpbWV9PC9kaXY+PC90ZD4KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtdGltZXMiPjxkaXY+JHt0aW1lcy5zdGFydFRpbWV9PGJyPiR7dGltZXMuZW5kVGltZX08L2Rpdj48L3RkPgogIDwvdHI+Cjwvc2NyaXB0PgoKPC9ib2R5Pgo8L2h0bWw+Cg==';w.document.open();w.document.write(window.atob(d));w.document.close();var a=w.document.createElement('a');a.appendChild(w.document.createTextNode('Download'));a.href='data:text/html;base64,' + d;a.download='report.html';a.style='position:fixed;top:0;right:0;color:white;background:black;text-decoration:none;font-weight:bold;padding:7px 14px;border-radius:0 0 0 5px;';w.document.body.append(a);})(this);\">Report</a></p>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "ename": "",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "==============================================================================",
      "Jupyter                                                                       ",
      "==============================================================================",
      "Demonstrate failing test                                              | FAIL |",
      "Page should have contained text 'Hello World!' but did not.",
      "------------------------------------------------------------------------------",
      "Jupyter                                                               | FAIL |",
      "1 critical test, 0 passed, 1 failed",
      "1 test total, 0 passed, 1 failed",
      "==============================================================================",
      "Output:  /run/user/1000/tmp6lyytu9s/output.xml"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAIOCAYAAAAlTJvlAAAgAElEQVR4nOzdb3AU153o/bzzS9/Nm2jvPhXdNw63Kgm5zuOCTeUqTrlgnVB2xRRbVp5ogwmGciKnbFQOS0xusYoDDgtVFthBSVS2FDvIjq3CMgQw6FEkOwLbGfygSAEsWEqKArJBxBHIiiWwq35Pn5numZ6e7p7uOT3TPdL3V/XZjdFMz+nT/86v+5zTn6j95D8LAAAAAOj4RNwFAAAAAFD9SCwAAAAAaCOxAAAAAKCNxAIAAACANhILAAAAANpILAAAAABoI7EAAAAAoI3EAgAAAIA2EgsA1ePuF2VkYkImTKNDx+SFH9wvt2b/Nia/WlX4vVu++Ig88eIfZGR0LPOdx76b+Y5tmcN7viufNf9txfZBY/lH5Xu1hb+Z9s5eucf5G1/6obQdHjR+Q5XrD7LP9htBfn/inRfl3prc8j77rZdlVP37UHvBb5VKt4yh6uh3P5GlXnXnsR0/67KNnd/xLIPf+gXchlr74+gpeePFX8r9X6wLtt/5lPez3zpoLPOU/Oyr1mcfkheMz4wY6x54fympHu+WjYcd3zENt9yf+a2v/lLeNr9/yyeLfP5Lmc/+9jtf09/HtLZVkXL67Y+WvPU2/82+fsXKH+azZl397JU/ZPaNdwblty2PSF2Nbj24n0ezx2vQc5VLPUWyz0bpi/8p/cay+x+6O/g52O268sk6WfadvfLb1DmjrGMycuygPLHq7mjLOs+QWACoHmbycHT7I/Jvqx6Rh/ccS5/scxdrl8Si5n75Wcq4YKQOyvbv/FAe3n40/bk3HvumbZnqgvIHeeKrmUZhYaPZ+s2HMu7+Zn6jo/Yh+dWQcUE69qL86DuPpH9j2PhO/0OrQvz+OaPsVqP0Drn/xbHMhS6qi24kZQxRR/9yt9ziVXd5//5D+dGLg5n1v7vOu76LlcFv/YJsQ8398f7v/Kf86pixzYZelH+7JcB+51PeQI20YvtLSfVYJ0v/JfPZ7+35Q7oMLzyU+e97v3SHqEbWPS2nzCTFWM+aIp+3N6Z19zGtbVWknH77o/n9/PU2l+uSLHiWP8xna74rbUOZulL7xvceO2jsGxO5uor0PGo7XgNtI/d6imSfjZI9sQi7Xr8ezK3LV9vTdf/2r38i9xt/2/6i2g+OyY++GHF55xESCwDVw5k8GBfgX71jNM5+/VC2EetMLDJ3xeyNhK/J99QFbWiv3FPzz3l3q0YP/0TqPuneaH7hW3cYF966DEe5Pvudg8ZvGBeif7F+42753tNH5bctD8n/DvT7p+Tt1JiMGOuRbuze8kPZN3rO+LdzkV109ctYvI4KkjqvunN+3mgEvKEaAT9YVeQ73mXwW79bA2zDSPbHLz2VXY9i+53/9ijWSAuwv5RYj9a63frA0XTDd/uXbOurGrzvqEbWy0ajLbNs38/bGtPax2FE5xDXcvrtj37r7ZoseJQ/xGdvMevqhVV3ZOvq3u0vywvbH8p74hXZfhvqXOleT8UTi/Kf4/LYEotw62UkoQ8dNT4/aCR9xrZYlfnuPvOpW+0t98v3Htgi934u4vLOIyQWAKqHrbH02do7ZOnd7ekL29vbv+15sVz2mLpD2S8bbReCZemLeL88/LncMvdtbzcu/OoCcnfRbj5W1w6/3wj3+4PSZjQcRt55We43fvPW7xgXtqEX5YmnT0V20dUvY7E6ym2Xz9YWNmLz6i7v81+TFT/oz1z4V9UV/Y5XGfzWL8g21Nkfc/uckeiqritPP1S0Tv3KW7yRFmB/KbEerTK4NcA/u0p91/i3r66Sjb8z1vPFH2YbusUSC+19LKJziF9i4bo/+q13QbLgU/4Qn637wbHy3hX3OF6DbiO3eopkn42SLbEItl6OLnJPm0lczTflR68YyY+x3m8fflG2f+fb0SR38xiJBYDq4XIBGPndL+XeW/5ZO7H41aqvyb3pi9zLxsWusNH82x/cLyu++u20ulvcf+Phkhvtp6Rt1UPyq3fURfub8vArYzLc8l35t6eju5unX8ZideTdiC2ou4LPj0l/y0N5Y2Xcv+NdBr/1C7INS98f9RILt/IGuftbdH8psR6tMhQ2wO+Q+389JhMpY/lGY3TZY0bjd/SoPHyL1+f/uaTEoli5dHknFh77o996uyQLnuUP8dm8xMJ8CpYuV+qXsqJM59Hg28i9niLZZ6MUOrEwEr0Hvil1X/ym3PtYf/ppYtvduW5by1b9RH6mxmikrzlPyYqoxrvMQyQWAKqHo7G07Itfy3VpCfx4/47MY/B39mYGEtq/px7Pv2NdNIt087H/RrZbi/Vvd8v39hyUfdvduhm5/b76+x1GI+OcjP6uX94YHTSWdYf8m2rQRN4VqtQyFq8jtV3u+RfF2Yj13o73PPBiemzBUXOQZbHveJXBb/1uDbANdfbHYF2h8uvUr7xLzO+2WX+rNdY3b6BxgP2lxHq0PlfQAE93XSkc/Gxtt/BdoULuYxFtM78nFq77o996uyYLHuUP8Vmr+026K1TN16TuS/fLjw5HnVgUHq9Bt5FbPd0SxT6rpS7d+N9oPVEwj8Wjrl2hfPY99ffP/SSTlBjHcd23npKfbf+hLLP2n/RxO2YbKwInEgsA1cOvgWgNwHvsoeyAxHu/6j5oND0Qcvu3Xfv7L32oPzNTiXNgsn25ahDsLd+VH+1RswAZn7EG4v5ur2z81iPyPWsg7g/cB0Z7/f4td+9N/y3TgKjL3CmNevC2Zhn96sirEVtQd3mfvzt99zI96NmvvouVwW/9vJYZ0f6YXu63rMHbL8v9HoO38+rUr7yf2yK/VXd7D7fLw8bfNj79B7PLyR3B95dS69FcN2cDXP236nfe9h2rMfqI/OyYmk3oP9NjBIolFtr7WETnkOJjLPL3R9/19koW3Mof5rNWXQ2pusrsWy+kok8sgkx04b2NHMdtFPusljq5d88pmRj9g7Q9oH7fHICtxjAFXK/MsZIru0rsbjWSkpH0k5ktmb/ZB3ZHtE/ONyQWAKpH0cTCcWfxlR9mGo+fe6hgqsGlXsus+aZs/52z0exYrpq280tPSf87g9nH5bd8aYu0HT6VbiBYU4dmfyPo76sL4JAaM/JNqY06sYiqjJ515JVYuNSd4/O3fPWX6buL6VlaAn6noAx+6+e1zEj2R3N5LtPN+tZpke1x691Pyb5j58y/HZNfPfRt23S8AfYXjXpM/35eA9ycrjXVntewrfvBH7KfKZpY6O5jER0DQQZv5/bH7/mv9//jnSwUlN8nsXDdl83pUYdHzX3rFSMB/ZcIxgUVO4+G2EZ5x20U+6yuW74r29Nld/x+oPXKHSej7xjH4vbvZrvCrXjAmm7WZbkoQGIBAAAAQBuJBQAAAABtJBYAAAAAtJFYAAAAANBGYgEAAABAG4kFAAAAAG2fMEIAAAAAQM+WwwIAAAAAWmIvAAAAAIDqF3sBAAAAAFS/2AsAAAAAoPrFXgAAAAAA1S/2AgAAAACofrEXAAAAAED1i70AAAAAAKpf7AUAAAAAUP1iLwAAAACA6hd7AQAAAABUv9gLAAAAAKD6xV4AAAAAANUv9gIAAAAAqH6xFwAAAABA9Yu9AAAAAACqX+wFAAAAAFD9Yi8AAAAAgOoXewEAAAAAVL/YCwAAAACg+sVeAAAAAADVL/YCAAAAAKh+sRcgAv/jiX55+PAZaXljTPrH3pep2Rtij7GpD9P//h99/5X+3H97/P+NvcwAAADAvBJ7AUqkkoP7Xh6S7jOXpJRQ3/vG8/9f7OsBAAAAzAuxF6AEKqFwPpUoNdTTjK92/CH2dQIAAACqWuwFCOF/tR5Ld2kqR6gnGKpLVdzrCAAAAFSl2AsQ0JruYd+nFFdnP5JfDV6UDa+eST+BUFSiYP3v5v5z8so7l9Kf8wq1fJW8xL2uAAAAQNWJvQABqKTCK14be1/ueSHcWAn1+dc8nnyo5EL9XpTl/1+tA3L7M2+FEubpiXP5PHkBAABAxcVegCLUEwi3+ON717THRqgE4s9TH7ouP8rkwiuJKRZq/Md/9J2T//Z4T6jlN/f/V+zbDQAAAAtM7AXwoRIHt1BdnpyfVXftO05ekP7R99My08r6N8gVNbuU6iLljCi7RZWaWOTK8pHc4zODFYkFAAAAYhd7ATyo7jxuYyrcniSoRrdbqDv+QZILZdebYx7f13/nhW5ikV33l4cCLZ/EAgAAABUXewE8uM3+pLpFOT+XSUC8B2Sr2Z6C/qZ6EuIMt6cjYTkb/qr7lWr8u1EJjl8iop7MFFs+iQUAAAAqLvYCuHDrAuXVwFd38YtFmN92a9TrdolyLlP9d7HvqCctbomO6uZVbPkkFu7Uk63/03tWGrr+6Nu1DAAAACWIvQAuBt+7ltdQVnf4vT6rGtHF4qvtbwX+bdX1yTklbX+ARMBPKYmFxW38h3PWJxKLINu1J51MpKckPnyGxAIAACBqsRfAwW1qWb8ZmqJ+YqGod144Q+ephU5ioZKIgvpwjLUgsQhWjyrBVImFqh/1v4OOvwEAAEAAsRfAwXmHvlgjXDUY/V56p5ZXSjmc09CqsQ+lrpNOYuFWFmfiEGVioRrc1vswotyu9uXqNujV9+3v7Qj6PfWk4psvDaZ5DYQHAABAiWIvgINzJqgg75Pwemrx5xCzQjk5358x5tMdqxjdxKJY4qCbWKhuQWqQu1uobmn3BWiEO0MlEirpU1MAuw2uV2NFwnRRs7azs5ucFar8Qbo3qcHvbgPgAQAAoCn2AtioN2I7I+h0r6qxqJ5OqGRCNbRV41rnzrjq+uSMUt9orZtYOJ/IRJVYqPpRDfwgoRr0fuvvDPWEx2+2Lita3ij+JEiV0yuhcIZaH7o4AQAAxCD2Atg4xzaEbYAXo7rCWA1U1ehVd7n9GsvOLkhu090GoZNYqLv6zohqjMUf35sO1Fi3QtWZV6NdJ9R28SpjmKTCCvX5uPdlAACABSf2Atg4p1dViUZUy3Z7AZ4K1Vj2Si6c4z1KLU+piYVXo9rZuC8lsXCrD/VkxBrcrP7uTKxUuE13q3iFWoZalt8y/RIWt1mxVBlVwqWo7k9uUwQzgB0AAKDCYi+ATWEDOZrEQnWT8guvAd7OJyilDuAuJbFQjWa3pMLtfR5hEwvViHeGWoazca/+2y0BcRsb4RaqrG7LdHs/h9tTC+d2U4mP1/gIt3E2pXZdQzifah+RF/7yd5m6ITL74d/lzeERuX2H/TNvyws3CjZPOgYPvy71Zz52/2M6/i4trS6/+/iA3Jf6q7wzbXz3xsfy3ruT0vLS63LTliOhlnfTcxfkPeNf3zv5lvFd/zLPTl+T7t+/LbWPqb8H/R2/de8v+Luqv8EzY1LfGk93vk+1n5aOvG15WpY+nv+Zm9v+JD8f/UDeM+p9dvoD6U/9yfEZa50+lv4DvYW/03pe3rHqqK2Ezz85IoNqm6Xyz0O1B6aMf70hLzxnW+aHl6Q+b198XTa9a/z79LgsTf/3cWn5m/Hfk+flC4G2aa/cd0595gP5ad5+2WN894ZZxiMV2l4u+2jBNjM/MzokN/ssK/A2LVqfxfb3IOeFj6X7+RBli3R/CHc8Fp4/gp4X7PtdObbDwnbTE2/Jw6lJGZy+IbPG/jRlnLtfTZ2W25+o1LHp7ea209L97ly6XO+9e0kebpuHXbdjL4CNs4GsXpQXxXKDvOvC/XvRdM1yrpe6Q6/u/HvxGptw1ePpStjEQjXi7VFskLtz+W7JjTNUNyuv5anfco4bcVtm4RMs//VyltOvixWicfNz4zJm1PXs3/4qHb8fkZ8ajf0x1SidHJOlj1mfMy+Gf5uUn/aMyCab+4yT6qLnc//9wrvqovx3efUN69/+5EhSlH55YFQt8IbRiBozPjNmfC/z36++3B9ieUfkzpNmK2L6gtz5mP03cmVu+f15+envx4wG91z6o2OpTCMi2O/4r7vz7z99Y0LeVD0Ub3wgLe2VveDc3G7blm+cl5aT5rZ812j8mHVzU9t5GUw3bIwkKzUuPz9zTVTzTX2mYHurfx/9k3zK8Ttf+P0H5hHqTCwCfj5MQ9K2vTKf80ssgm3Tm9rG0vU0Nfx2rrH+5Ol0mVT5ayu2zZz7qLHNhq3tMWI2WIsnFmG3qX99Ftvf3cuf/9nT8o0nQ5Qt0v0hzPHofv4Idl4oTCyi3Q6VoNYhk0TN/k2d74v8d4XK9annxjL16BY3rknLcy43LyrliT9Jv7PTxod/lQeeiKk85RJ7AWycjc1KJhZuDXbnzFBRJRalhKobr1mUwiYWzu5FxZ7EOJ8GuI1hcEaxMjifhLjVrbPbVLFB2apbVLFlIkrmxezDSbnP1vivPfDX9N2YV1+ytlewu6bK7ekLtXGiLUgmbJ44LW+KatilchfWx1LSoRoAkyOyKOjyjO+8YOxiU3/7u3EBvyEdz9nvZrmVeUB+OqnWd8KRhPj9TrF1d/n7DuPf0uuSfzezMtsy/05o7eGp9LbsTm/Lfnn4L+oJUf6FsPZwZnu/mb0jba7TDdWomHJcNDN1OHsj0+DKSyyCfj5kQ1I1JjY96VhPj8Qi2DZVia2qhyl5OF3WI3J7SiWdc9LRXsk7om771hFZ+sbf0/WQ2Z+L7X8ht2nR+gx+rEdWtkj3hxDHo+/5o9g+5Nzvot4Oldn/urNluSTfeKzIf1eiTNmG+8cydua03PlkT/op9s1PpuThMx8YdSmxNuQz+2RhvHlgnvWuiL0ANs4GcpCpZoMo9hI91Wh3+165nliEDdXA9psiNWxi4Ry0XWzaV7eX9Dk/44xiy3Qme866df6m3xMQv3LEvU/Pa9kG/tv53YiMC3HLuUnpePl189/Kk1jMGsvL3d0+Ip9qfUtub3s97zf8lnfTcxNGg8BoDD4/mGkg2BMVjzLfOfyx6/IiTSy2WHfprYZ3BbflyZRjWw7Kz89cymzLHX8qTOgUowGh6k/+Yj1tyKzT1OhkusH3pr0LTKu6239DXj03Jc7EIvDnwzQk//aBvKOWfc7aV6JILIx9pz3TBWYsdVxu2jEkr6onO385XcGnFT77lrFfqwbUm+luZUX2v5DbtHh9RphYBC1bpPtD8OPR//xRbB9y7HeRb4dKSNoTCyPBP5l5qvyecU1yPvn8xJZe+caw+feCrq+V4Z1YxPgUpRxiL4BNucZYuHW9yf8d94a48656qS/bKzWxUL8X5EVuYRMLZwR5n4QznE8Pwi7TOduVM7Fw/l29R+Q/+s4V5Yy49+l5rW083bh6p+f1Ip81L4Z/GZEvGAljrelTO8Lc4bNT/dwzt8Km3p2QTS+9ZY57KOS9vCPGReaG+fQh97+/4exykNfA6JUHRiV9960+7BMLz3V3b8jc9PyldOPw1Zcr1B3KbCgX9oO3f2bc4zO5Rs3ttnWaGv6TPKzu7Nsa3F9Qd9ONen7g8F+lILEI+vkwDcnRP8mdb6hGodEAfK5HokossneYP5yUllRm+S88V+m+0u77zs0vT9qeGBZpvIfcpsXrM/ixbv/sUttna63PBi1bpPtD0OOx2Pmj2D7k2O8i3w4LkVmnYn+S42DuK/K3mOqJrlCV5+xTr/O2ayfVUHVLLvyShagSHedy1N13a1YjN2HfwxBHYuH8Tthlhk0sSg1ehldGz11I9wHOXQyPyM2P9xqNCKVHbnbpF5wX7+Z3W1KCJRaGx16X+tRf5b3so/a/S3fPWwV3qTyXZ94JtJ623Gw0HFR3hheedzT4s42eAbn98KX0xX/qzGDw3ym67t53nVXdVuxOVvb3fBIL8zOFA6xVI9v4w4cX5E7bOs2eedvsFmd1Gcpc+FWdLzpQ+MQi8OdDNSSH5FOPW93k1FiRqBILtc9MpPcHr325/Aob5ova/yQvqPW5YZW7SGIRcpsWr8/gx7rnZ61xNkHLFun+EPB4LHr+KLYPOfa7yLfDQmR1qSy88ZP12GCme9aNicp0zbK56cmU3HdgSL7x0kje4O1NL70t9x02EsUn4x9YHpnYC2ATxduurTc+u/1NNdhVo1slEyppKfamZudbwNUL/EpZL90X5IVdPolFuHVDicy7bO/83nxiYXansWJ2OGV+1jzhvzsu9c+/Ld8w3dneH6LrgIfHX5c7D4zJq5PqkfvHMtgzEGh5mYbAx9J/eCBzl7T1tPSru+ZnrAG57o2eqb+cl9sfLyxH0cTCc92T88QiP0n03t5B76rOnhuUm3cMpetVfScz6DnTF732sJrxzpFYBP18yIakqtdPvTxpbu9UZIlFdr2N3+x+KY6ZXTwa5h9+IB3PO/rkR/bEolh9Bj/Ws5+dvCD32T77jTbzs2V5YhGw/EWOx+Lnj2L7kO4Ti2LrsRCFeWJRucHkaa0juQHlxvH56snzsunwiPz05KS8Yz3BuDElm9xmQKxGsRfAxu1t1+rfgnzX2WdfJSU6jUqdt4A7zcfEwvkkIOwywyYWapyJWq+wmHK2jMx+wbNnBjMX08f6ZWl7Su58aTwzQ44zsYhojIW681P/0tvyBXsD/zHb3buiy7OmBnWJDy/JNx63ldlq9ByeSM8E5NU3N/IxFukBuBUcY2E1zk46jtsdRoPl5AX5qWqoug2aT9e9Rz/w9Dr1ZKZnfXdE7kv9PTt7zqIee5/1kJ83y+Esqxponh603O5Wr6qB9nH6oj6o9pNIEgvrM9YTlkorbJjf2T4gn3Kb3cxr/ytpm/rVZ4RjLIKWLdL9IcjxGOT8UWwfcux3kW+HhSjMGIvC8TDlLFe6q1yAKBivWK1iL4CDs7tSkO5Qbi9Rs6LU5MLZLeuPGm9zTlpiUTD7VgmJRbG/R51Y8DbtJLJmMjEaVvY7REbC0S/lSyxufmnSMVOKYs7Y5LgT5bq8xzOPw2f/cj7vrmr9G/YZkJxl7s00Jm643w2LdlYoo3zpJGmsgrNCmfU3PZHXMFJ3fXP99a1xBY6Za8y7pgUz15jrZG0v9W4MKzHzTiwCfN6cjSe/e43V2LMa+YX1epM5nW465lNi4XtcBZx5KeQ29a7PMswKVaxske4PAY7HQOePYvuQx6xQkW2HBco2K9Q7zlmhhs1ZoSp5w8a+rYNEpZ+klEvsBXBwDphW3ZH8nhQUe/ldKd2p3GZBUt20Sl2npCUWBbNvFRkg7tYtyfkZZ+gmFm7LjHvfRCH73OsvqLnafz8mL/xlLn0Cf+f31lMtayaTSwXz1Tvntg/UFUrNNqK6Pt34u/SrR8rGsn5+7u/p3xx743jeHR+35VkN14JuRmY3nMwTGJcGxpOZx9kljbHwXPf8v8f6HovnLmTeYzE5KT//ve09FpO5efRV9yQ1G41MTxnbW703YSrdhcP1vSVW3ZkNMTXQ9OfmdKx+iUXxzx9Jz9Kjtvd7oxeMejPKceaDdFeu94YdXdkcg++zd5oXWmLh3P8O/0luf0Jjm3rWZ/BjPdg7NoKULcr9ofjxGOz8UWwfcnuPRZTbYeHyfY+FGbOT43Jn0O62UR2nQSKGsR9lEXsBHNwa9X6DpoO8oyLsYGjn0wp1h7/UblBK0hKLsLNdBXnnhDOiSCyc0+IGmSELlXdz65DRsP9A3vtQNfZvyNi7RsP0wHFb49v7xJpLPjICj7F4/Lg8kJpMv3k7fXf7b+qt2KmC6T4Ll9cj9ec+tg1uteuVB9RAyRuTUv+4+zsCbj+Z6RLx8/aggzSLrXv+3603/d4X05u3a59TL/XKf/O28wWF6u3AHdbbgT/8wEjuPN4OnK27HvmGavjYZmLxTSyKfj6zrW4/bDT6/nYj3aBUb0V/9Y23bbODeTRaVZeTdONtgSUWBTFndhEqdZt61WfwYz3o043iZYtyfyh2PAY9fxTbh7zfvB3NdljY8t68bdTle39Tb942kunWt+Xnk+YUuBVLLt6Sn+c3ZbwjO5amysVeABfOhr0Kr7EWpb78zot6KZ8zdGenKndiEfaFd25PILwSAVV3zjeBu73ROujyvMrgVifObTuVTvD8G1wq+SABAQAABR5P5ZKLCs3mVvvSBRn88GOfVqpKYq9Jx0vzZExo7AVw4fbUQnVpcntq4HzbsjO8Xn7nRiUvzpmgdJ9WKOVOLNwa4MWmWXW+1Vp95z5Hg1w10J1JhQq3xr0zokgs3N4/4jUoX+0zHScvZD9HcgEAAAoYyUXLuzdkavR0DNNELwCxF8CD863XKtQAXrdGvrPLjD3c7q67UctVyy/4vsbYCku5Ewu3RMwebl2j/KZzdUsmitWnM6JILBT1e15l7B99P21syvnGmUyQXAAAAFRQ7AXw8UeXhr5bcqEa1m5vty421sCinlS4JRWlvmnbqdyJheIcBxGkHlTDO0yoLmpev++MqBILxa1rnE5ZAQAAUAaxF8CHShjc3patuiupsRDOz6vGqmpEqwZz0HEV6n0Vzu5PKv7o8XSkFJVILBSv5MIvwVJdyZzdopyhtkGxJz/OiDKxUNQ2LVZOFeozPKkAAACIQewFKEI9TXBLLlR0n7lU8gvQVGLS7/KUQ0WUSYWiGrr2l7aVs+Gr6kMlAfbfC/KeCpVgqLv8qoFvUf+tyhpkVq2wL6ZTfy+lTlQ5VQJlL6dV1mJvUgcAAEAZxV6AAPySCyvBuC/dAPZPBlRjVn1Ofd4rok4qAAAAgAUh9gIEpBr7buMonKGeQigtb4zJf/T9V3qmIPXfbmMonKHuepNUAAAAACWIvQAhqVma/J5elBJqeWqsRdzrBgAAAFSt2AtQAvVUQU1Hq5tgqO+r5fCUAgAAANAUewE0qIRgTfdwwZuni4X6vPpe3OUHAAAA5o3YCxAhNdOT6iqlnkIoasyE9b9VIuE2RS0AAACACMReAAAAAADVL/YCAAAAAKh+sRcAAAAAQPWLvQAAAAAAql/sBQAAAABQ/WIvAAAAAIDqF3sBAAAAAFS/2AsAAAAAoPrFXgAAAAAA1S/2AgAAAACofrEXAAAAAED1i70AAAAAAKpf7AUAAAAAUP1iLwAAAACA6hd7AfKjekoAACAASURBVAAAAABUv9gLAAAAAKD6xV4AAAAAANUv9gIAAAAAqH6xFwAAAABA9Yu9AAAAAACqX+wFAAAAAFD9Yi8AAAAAgOoXewEAAAAAVL9/uPVeAQAAAAAdJBYAAAAAtJFYAAAAANBGYgEAAABAG4kFAAAAAG0kFgAAAAC0kVgAAAAA0EZiAQAAAEAbiQUAAAAAbSQWAAAAALSRWAAAAADQRmIBAAAAQBuJBQAAAABtJBYAAAAAtJFYAAAAANBGYgEAAABAG4kFAAAAAG0kFgAAAAC0kVgAAAAA0EZiAQAAAEAbiQUAAAAAbSQWAAAAALSRWAAAAADQRmIBAAAAQBuJBQAAAABtJBYAAAAAtJFYAAAAANBGYgEAAABAG4kFAAAAAG0kFgAAAAC0kVgAAAAA0EZiAQAAAEAbiQUAAAAAbSQWAAAAALSRWAAAAADQRmIBAAAAQBuJBQAAAABtJBYAAAAAtJFYAAAAANBGYgEAAABAG4kFAAAAAG0kFgAAAAC0kVgAAAAA0EZiAQAAAEAbiQUAAAAAbSQWAAAAALSRWAAAAADQRmIBAAAAQBuJBQAAAABtJBYAAAAAtJFYAAAAANBGYgEAAABAG4kFAAAAAG0kFgAAAAC0kVgAAAAA0EZiAQAAAEAbiQUAAAAAbSQWAAAAALSRWAAAAADQRmIBAAAAQBuJBQAAAABtJBYAAAAAtJFYAAAAANBGYgEAAABAG4kFAAAAAG0kFgAAAAC0kVgAAAAA0EZiAQAAAEAbiQUAAAAAbSQWAAAAALSRWAAAAADQRmIBAAAAQBuJBQAAAABtJBYAAAAAtJFYAAAAANBGYgEAAABAG4kFkHTL2iQlKq7LwaYGz88t3jmW/pSMdkud17Lq9kjvXGZZA1vWlKe8qw/JeLog5+TRFRWqo6WbpWVkRmanx6R1nW29lu6Sg3NW3YVb5vK9lzP1OdIhi+PeB0o0H9bBc9smUcXKulFaRsU75mbk0sSY9O7vlLX1LuXQOC4AwA+JBZB4G6V1ItNeGN+72eMz66XpxHWzVeHToF/XL5fSnxmT5pVlKm8cicXKbjkrLnVEYlH16+C5bTXU1O+S5vZuad69I9p6KUNZ3RVJLPJiSgZ2N0ut/fskFgDKhMQCSLwGWXVkJtNGGPJoINZZDYVMY6HX42nEkt1jmY9c6ZG7ylXeOBILI7Fa1X5MDh7plgb7b5JYVP06eG5bDbVbBs07+8dkVcLL6i6XWFzqapaapQ356tbLknV7pPXElHlOmJGBrQ/mvk9iAaBMSCyAKlC75ZTMphtCKWlYWvj3msZ+uWq7R3n1yA6pKVjOGmk8nnmqMdu3K/8OZpRiSSw8kFhU/TqUQ/kSi0rJTyy8P7dBHj1h3pS4Yqyrde4gsQBQJiQWQDVY2SnD6dbBZWldXfj35V2ZO5Pjx1OZz7k+kWiWziuZNkZq54PlKyuJRWLMh3Uoh4WTWNwrNet6zO6PM9K5zvx3EgsAZUJiAVSFZmn3TAqsRsaM7GvaJu3p8RgXpaXesYwiyYnqcrV4XZu0Hx+T8SvXZXbuulyaOCcH9+6RuroQZc1LLNZI3aZuOTh0Wa4ay1ODSsdHUtK6ZaP7E5PsGJBT0rTMbfkbpHkkUw+BxlIUa0At3SAN7cckNTGTfiI0O31ZUn2H0gNeS26U122Utbv7pXfEXGfjt6+qgbRdHXKX2zpZ9TWXkrVL75VF5ja4NK3qy9gGo6dk3+5tssjr96Jch9VmIzT9ZCy37S6Z66HK0rmzOVuW2vpd0tp3TsanM3+fvXJRBo50yqoV3pMMhK4fr20Yut42Z8cqucV4+8YElbWY4ImF6ibZa67jwNb1wY4LdS5o7JBOdS4wt+3V9Lbtdh8MHsk6RnT+ARArEgugKqyRtX1WNyZHN6cVHZlZo9QFva5BVu3PdH0YdiQgtZsGM92ppo+5dKdaLw37L2b+LpkGx2x2zIYREylpDPr0IZtYXJaBE5dty7THdRnfv6OwkVHJxKLOSMJGr7uWTuYuy/Co2YUkRGJRU98hA1dyi5mdnpGr07bfmDaSrfoGj/o6J+17T+V1abPHpSMu9RX1OliJhZGY9h6/7FESo+67thlJxzEZn/P4wPSg6/5SUv0Ua6wHrreN8qjRaD07elHOXrF+00h01X+PjsnBrRsSVNZiQiQWRpl6ze0ULLF4UNYeuZh33M7O2fexKRnYubGwq6XWOkZ4/gEQKxILoEos3nnOvMgekuW2f19kjr+YPbEnfcGu3ZTK+2/rc3eZ3aXkRJvjwt4gdbvHzIv6ZTmo7kibiUdt/R7ZZzZcZ0c6ZUmQsmYbGCpmJLV3lyxfkbnLWbuiWZqyjZYZ6d2yPv+7FUss1sva42aje06t8zZZUpepi8Wrd0nr0EyuURO0Ub60WTrNO+JXhw5Jw8rcnV11Z7/Tqx4d9TW8v03uMupLNdxqVH31WQ1851OoMqxDNrFQy7wonVubZbG5zNqVO6TFvky1niM90rh6faaRuXS9LN/SL2fNBuGl/dvyG5+l1k/RxnrYegvQFSpBZXUXIrHI/vaM7GtsKHJcNMjyvRfNskxJ7+5tstg8F9Qs2yyN+3PH7sFN6z1+J+w6Rnz+ARArEgugWriOXWiQBvNJRraL1LI2GVCNhryB3rkG+Vlnl48V5ueNRkZq54bC313ZIam5TEOjs9Gni0tBOa/LcLvLnc1bH8xNjet850alEov6XBnzZsvJfs9ouI2YZQzaKF93SIYnpuSSx93Vmuy6Ocae2BpkZ7uaC7uI1e2Qg9OSv43LtQ6rc/3xe50Nx/S+tcfcV4yYTsnagm1kNEy7zAakIwEuuX4CNNZD1dutARKLBJXVXdDEwkg++8wbCuknmkXKucI61j3OBbeukYYj5vKu9OcGg+usY9TnHwCxIrEAqsXSHbJv2moMWHcet0ln+t8u2t5L8aA8OmJeiNeZn6uzukNM5QZwmrJPQpwNhazcbFKXugLMzR9g8Laaxcr1fRoVSizq2i9m1/ku13Uuw8Bnq8uac4xLtr7GPOrL2p7561yWdcgmFl7bbkO2QXv1yDaXpNHYtlaXO48ZzELXT9HGerh6U7QHb1ewrO6KJBZL18ji1Tukuc/qing9fUOhpkg5l9j2Kfdzwb225EON6WrQXsfIzz8AYkViAVQN9RI8x4XZupg77g5bjc7xvebTCWtmmLnB3F3LtIbc2I3j3lPQZhuoju5VroLMCmV7A3he46QiicUaWXs8xDqXkFgsqt8mjTu7pX1/v+zrS8lB5fhFs9/5lLS7JhZe9WVs9yFnI7JM61A0sQjQAG5KmYnFYHoQr3b9BBi3ELzeMsIkFnGX1V2YF+QZScWRXfnb3+O4aDTPLwXjuDyPwY2a61iG8w+AWJFYAFUke5fafFGedYfx0v7m/IaAlUiY/ZKzL8YraGAaDcWhoA2U3PJ8yxloulnrSYvkv8yvIolFbp39GnElJRYrttleSuYVUSQWZVqHcicWpdRPXIlFQsrqrkhiMZeZvWrgyCFpWvdgYZLgWk6PY6uAeoKQ+dzskW2R7ceBgnEWQOKRWABVJPsiPNXNpM66KDu6JChLt2W6Tc2dksZlubvb4wVdCR7MNiYyM7H4u2okNFElFvusmWrmS2KxtFnazcbe7GhKmjc1y5Jla3KNumz3mQWaWJRaP3EkFgkqq7sQg7dd169YYuEy9W5WtIlF5OcfALEisQCqSbYL0UVpbTT/d0H3JsVKJoyGw6Zt5vz9trEZWeuz3R9KaqC4CdgVasBsTMTaFcqny0fYRvmiLdZ0vm6Dmu+NOLEozzqUM7EouX5iSCySVFZ35Ugscl2hvMbPOH87bx8oaR3LcP4BECsSC6CqWA3r69K7P5V+ejFbMH1sxqKtpzIX/yP95qwr7o31bONzNKJuBoEGbx8z+6g7Bm8HGDwc7eDtnsgGPntP52uKNLEozzqUM7EouX5iSCySVFZ35Ugsgu1TuXWfyb9RUeI6Rn7+ARArEgugyiw3Gz3WS6ucL8LLst60PZd5I3PB1K6W+m45azYUerd4LKtus6zd5PG2bCed6WbzGi0ub/g1/m5Nd6o33WyRdV66OfRUrdkGkmujTL0F25qrP5rEohzrUM7EouT6KXNi4TZzVZLK6q48iUX2nKGmMPaYbnbVfqtuvKabjXg/VsKcfwDEisQCqDI1VsMtHX4v1NpsdoHKxFXnC8uybI0FuSy9u3eYL1rL/G1JY6ccnMh0q8q+udeP8wV5XfkvyHs0OwWmy0u21BMJa1DqREqa6nMvX6tr6pZe2/povyCvz3q53EXZl30R3JqSXy6Xe7eBUba+Dlm1cr3U1q2XJcbyWvrsbxWeyZ/yt+RGZ/TrUM7EouT6KUdjfV1/dlanfZvU4OYGqV3akMyyuipTYmHUw11d1gvyLue9IO8flm2UtV1jZr25JAElr2PE5x8AsSKxAKrNsjbzrr4UvoQsj9FI2G/NanM9f/Ylp6UbpDHb4M9EesCk7b/H+/bIkiDvJbDNZ38w+7ZdZ1yXs13bXLuZ1Db22xITR0xflLNXzPJoJRaGumZpte7oF8RlGRgKOyvU+nQDadZ1eddl/PigeTdY8htIOo3OqNehrLNClVg/5Wisq8HZE/klcCZtiSmrq3IlFpltvPbIxYJzQS5mJLV7c+HTA63tEeH5B0CsSCyAqrMx+yTikudTiIyaJo+xDK4aZElTp3QeH5PxaXNg8PSUDJ/ol+amDb6/k8dqYEwfk1VL10jdlkNy0GjgXk0PNJ+R8ZGUtBbp1rBodYd0nrgol+YydyqvXhmTgf0dsmrF+twMV7qJRfrvG6Sh/ZikJjLdxWanL0uq75A01q9JD+BNR6j3WJjrO2Jb36GUtKTX90FpPHJKUkOnpNdomNU466vURmeU61D291iUUD9laqzX1O+RTnO/nL1iJGG7nTMhJaesbueA8iUWmXPB4saO/HPBlYuZ/Wq1x1MD7XWM6PwDIFYkFgAAAAC0kVgAAAAA0EZiAQAAAEAbiQUAAAAAbSQWAAAAALSRWAAAAADQRmIBAAAAQBuJBQAAAABtJBYAAAAAtJFYAAAAANBGYgEAAABAG4kFAAAAAG0kFgAAAAC0kVgAAAAA0EZiAQAAAEAbiQUAAAAAbSQWAAAAALSRWAAAAADQRmIBAAAAQBuJBQAAAABtJBYAAAAAtJFYAAAAANBGYgEAAABAG4kFAAAAAG0kFgAAAAC0kVgAAAAA0EZiAQAAAEAbiQUAAAAAbSQWC0xNU0pmJROpnQ/GXp4FZekuOThnVv5IhyyOuzwAAAARIrFYYEgsYkRiAQAA5jESi4p7UB4dkorEsEvisKATi/pDMm6u++yRHdEsc1mbDFgVPtIpS/w+W6nEoq5ZWk5MyezcjJw9sse/TFgAGmRt3/XIzy+prQvs/AF3nG+0LKrfJk3t/XLwxJiMX5kx6tG8Rhn1OT46JgN9PdKydYfULWsoYfnOY39GDm5aU+Z12igto/YzxWVprS9lOQ2yaPWObN2cnZiSq9b106ibqxMXJXUiJe2798iq+nKvE8Igsag4EovYVF1isUaWb+mUlvZuadm9I/AFe9HWc7a9YEY6G0u5IC10pdV9Ms3XxGI+baPqxfmmFEajeV2HdI7MhDjiZmT4SKesWhGmfguP/dmhtrI+La9Z1y+X8n4xbGLRIEuauuXgaJi6uS6Xhvrl0XXrpSb2bQsSi4pbI3WbOqV5d0B7B3MH6ZVBaQ36PUPj6sIsnsTCPLlWRWJhJKEj5ufnUrJ2abAyLdoymN3GIlPSvi4BdV91Sqv7ZLI3LmYktT/E+cfH2vq4G5DzaRtVL843IS3dIGv3X7TVmdkwHjklB/f3SKuRKDfvNpLlvT2y7/g5OTvtuCkwd1E6Nz0YsAHtdlPhorSU9AQhiDXG7zkTghCJRd1mefT45cK6GTXq5ohVN+pmwiFp35+SgZGpgs+e3b9LlnAuiBWJRdKt6JCUdcwM6XefIbHIxHxOLNIXrq5BSQ2dkn27m6U27nqvSvOp0WpvXJTaLSGJ5tM2qmKcb0LU1WZpHrI3vKdkoGuPLPd9CtEgi9ftkfYTU3nf690S5Prt/rTy0v7m8tzZV+2VOeevBTzn1DVL64itrEYCdbB9V9EuYDXLNsva9kEZt/3upeNtJBcxIrFIOhKL6CyUxAIRmE91T2IBxO9BaTxuSw6uDMqjocYGrJG6nbYeDEbDu3V1saeGtmN/7rKMXzG/O20cL3XRr2Pd3ovmD1yXsyOXQ5xz1hvlzNXN7Gi/rA3V5cto26zcI/smctU73kWSGxcSi6QjsYgOiQUCm091T2IBxG3x1lO5bjtXUtK4opTlNEjd7nO55Yx2S53vfm9PLFLSvNsaD3M9+uv/0m3SaSUuV/qlqX0s8DmnZnXu2pxOepaVWIYVe6R3WnK/WzTxQjmQWCQdiUV0SCwQ2HyqexILIFZ1xrnf1uBtX6czi9EGeXTIOp6vS6/vLE/5iUXDil25hrdKSiJcR/tYm+HdG40EKHhicVdX7mmFbrtEleOquayrfbt4ahEDEoukI7GIDokFAptPdU9iAcRpSbaRLXLpyDbtxm5NY27mpdkTbbLI87P5icXapQ1y136rET8V4Qxe9mPxlDQuu1fq2q1uUcXOOfaZMsekeaVmWdSTEyt5mitPly/4I7FIukomFnUbZNXWQ7JPzac9fT3zubkZuTQxJgNHDklT4wa9E+LS9VLX1CHtfadkeMKar/u6XL1yUYaPH5NWNVd3OU8CCU8sFu+0T9sYJIwLg9sMLCESmCX2u0qrHfvKSjW/+jHpHbksl8yZSTJzq5+Tg12dsnb1+iJ1s1EadvZk5mfP7k/XM/OP9/VI86bNPhfEIBpkSeMeaelSs4Nkypj9DWOfSql9aqea/734siKr+yTu9xVMLHLnl+tysMnRaNE8v1TTNrKfZwe22o6TpQ+adXAxXQdWOKfurdlk3f11zrK0xtjn26T1yKAMj+bm9Z+dnpKzQ2pO/12yPOT7DnTLqvN+nvTA2909uXc4SG59xtOzJHVLY7Vfd27dLK3Zvv8RNJzT69Sc63Y0NyiNnuW3JxaDmUZ2fbecter5eER39G1dma4a11a1zOCJhf29F6d81iWoNbL2uO18t1p3eQiLxCLpKpJYrJHlW4/J2eyjWu+4OnRIVoXu/9ggi5sOycBEgLn01UwQOzeX5/EliUWBXGJha8DUbZSm/WPZx8necV3G+9oK+/gaDZIGxywdXjE7kZKm0C83Mvanxm7pDbI/qZibkoH2bb71UJ5Ga0L2+7gSi01WA3eN1EVwfqmmbeTWWK9d3Sm9V9wXndegv9WeWKj3QmT+rba+TfaNBinnZekNMTuTbllLSizSM0mdc7zvwDtmR1PpdxSEPk8k4fizjx+I4BpurVuDbQppax/xP/atBORBaTph/ds5ebSksR52a6ThiDXTVa4hX7c36ODt/CcW+uVRXasuG0n39XSC6l03KBcSi6Qre2LxoKw9kps3evbKmPQe6ZGW3Z3yqJovuuuY9DpeVDM7ekjuCnxXYb00dI3lzTV9dfSU7OvqluadbdK0szN9xzk1kf8b431leINrwhOLmhWbZVXTDmnIarPNcnFOWvP+ZmjcJkvctkNJicVMphG2Yod0jub676q51fd1HZKW9szc4Z19pwrmVb96oiM3tZ96C69tOsXZ6Ysy0Ncv7Xszc7O3qv1pyDFP+fQ5aQ78TgQjaenKnwM+vc/uN8q4s0OatuyRpq0d6f12wLHfqnJ6DXSMrO6TuN/HkliI2fc7uvNLNW2jvPOs0RCvXd0tw/ZEe07dkT8nAydOSWpoTDqb8pPrXGJxXfY1Nciipv5com589+yJY+Yx1SnN6ePyXEEiP26c44I8EdQta+jEYtk2abdPK5p+uVlKOo31eVTVu3H8Nrf3pJ+U5N/cmJLerRsCTpOanOPPnhCf3b0huuVuHZTxicuGi7Jvk1fSZT/2c08Dao1tbtXt+N7NemVZtkcGbNvfqr/lgROLe23ds64XJq6oOiQWSVfWxGKzNOw3D/7pMWnfstHzjs2idZ0yYLuDNd61OcAJfn1u+aIaDMd83oyp3rZ5KP839uv3Rc2T8MSiUKnvsSgtsdi3qVlazaTi0tAhWev5JGG9LN+asjVk1AwjxgVz6UZptgYVGslC+xbvO4A1K3cZjQtbAmLUXfGBhGtklW1/kiunpHWTfzcJ9Xbbg7Y7lsH3KZ3++wnb72NKLAa2bMhtr7KcX5K7jfLOs+1t0jlh/U5Kmpu86yH7/U25gbADXT1yNn2sTcnA3l3e3XaWbpCGvedsjfHrMty+sWg96pY13HlN3S3PHfdXh3pk7UrvJ5Y1y5ql6Yj9RsJl6Wws9oQzScdfgzQcCfJkoVzyE4sm62ng0mZpt5LyK/2ySmN8Uu4acl16t+SSguXZAdkBZoVa15N7qnPlmDQwLqKqkVgkXRkTi/GRTHeX2YljsjbA48eaetudrACDopZsPZWbnUHdLQ5yslixy3YXckr2Oe+O6SCxKNxGtkGF4xNTknlzabA7nYs2pWxvhT8mLebFXM1B3hDkcXad7eKmEpsiAwlrbQMWZcL4jaBd8pYZ9ZFtOFwM2Me59EZr4vb7mBKLs0Pnynp+SfI2stfD1elMQ/qSuhsesIz2xCKzfhelvTHYndzFW2zH5dyYNBdr1GmWNcz5prbpWLbeZ4c6i0yVmtt/C6ZYjXHbhhN9N59w7Mf+uVxicat3QhDK0s2eCcpdIRILlQw2HrffaOopocs1koLEIunKmFikY3pQmgKf7Ox9KV0GZ9ots80nPdoToutUZk5ra3CZuohE9miaxKKAPbHIXOw7QtT3g9I05Oi/bOxPYeZnr91kmxrwyDafu6vrbf2Cw89PvmhLbg758faNgdatpLpP4n4fU2JR1vNLwreRsx5mR4q9b8Dx/bzEYibgW5Zz21v1Mbei2JSbumUNfr5pkFXZ7avGdIU5hh+0TbFqfNdrQG7ijr+NtoHbgzHMUJSfWOQlNo4uTKW0LeyJ4lnHeTXXvSnom7e3Sbt9DNH0Rdm3c5ssZra3qkNikXRlTSxmQt+pqLGdSLz7Zjbk3a0IdwFR8geDeV5EwiKxKJCfWBS/u+m0aOsp2/dV/9iQUxjX7ZJeq6x+dyKXbpN91ucmDoWff73OdhH1nZ5Rp+4Tut/HlliU6/yS/G2UXw/hE2F7YjFbynnf/t6EuVN5d6qjLmvw8816acrevfebycid/VxTMDNVBbdtOM3Snp29KSUNFW8k24995xMTe6JXyuxJtps9c4WDwFftty076DmnrlmaT9jeTq7CSDB6uzqkod6rOxuShsQi6cqZWIyW0ECzlWe2b5f7gV63I3dRK7HMqs+l9Th/fG+QO8wBkFgUsCcWJU09uNrWN7akOcM35KYa9L3wrpfl1qDcdQ+WcIGxXeADvRiqhLpP6n6f17jQDf/pMityfqmCbZRXDyX8jj2xSJU0mNXeyDYSfp8ET7eswc83a6TxhPVD53yTHVcrd0hze7e0GJrcZohK5PFnTyyOSYP28sLvB/bEouDYzZsm1u+Jsdv2yE1b6/ZULC9pCXUzY43UbemRgSuF56zMRB3G9m/azJOMBCOxSLoyJhZn20uYoWKp7Q6zx53fGtuME+53loL8zo7cxSrQHeYASCwK5PWz9X2Dq4eVnTKstX+qu17WAjIvVopkuxSwzSU/cUiWl6HuE7vfx5RYlOv8Ug3byF4PwyXMBJQ3eLvEWXJq1uXGJPk1GnXLGuZ8k5spqISnmwnZtuEkPLGwjwFR78MIfP61J67u3dpyg9ZLfUq6Xuo2dUrnCccsgtmYkbMn+qVlS3OR2d9QaSQWSZe4N2/bTrwe5cnNBnFRWkrudmF7aU6ghmAAJBYF7InFwSa9/bP4HWY3a6TxuFWB/l029JQ/sUjsfp/XuJiRga4OeXRnqXbJcp+LeCXOL9WwjXTrIYrEQnX/yyZpxrnJqy61t1mY85rt5WxqYHlrwAHpQSTz+EtSYuFeL7W2fS1wYmnvaucxHqUhwu6XNeplq+bLGq2XQubF3GVJ7e+QVSuiepM4dJBYJF3VJRbrbY+71eArNS95KTrloNUQnD4mq6KoSxKLAvMpsaipWy+LVmyQJSs3Sl29w+o9ss+6wJclsUjwfh/TGIvkJRaV20aJSCxutc/Y0yN3lWubhTqvOWZ4Ui/ZPF78revFJfX4S35iocavddrPjQGuM4u3WtvQ670TDZEmFvnlXS91jXukZf8pl5duqimZd9BNKmYkFklXdYmF7Y5PVKH63kdRlyQWBao5sahZ0Sxrd/fIwRNjcmk6RFefsiQWCd7vSSwqvo2SkVhskGZb/XiNX6psYpHZH9NvYnfeeZ6+LKm+fmnZukvuCj1QN6nHX5IGb3sf+3XtF83PzASYatdW19Ne75yo1DlnjdQ1dUjn0FT+yxBHDjFdbYxILJKu6hILW5eTRJ3g7yWxcFGNiUXNim3S3Od8K2+IKEtikeD9nsSi4tsoGYlFfv95r4kVKp9YmJZtlsb2lAy7DNJVMTt9UQb2d0tjoMkaknr82cqltkFCE4t/WNEmKXMbzp7Y4zu2pMb2PiE1c5vXiwcrdc6xfk+9ZNP+MlQ1bXKQpy+IHolF0lVzYnGlJ6I+4hEhsShQbYnFosZDMmx//G02Ppo2NcvylQ/KojqvPrblHmOR4P2exKLi24jEItz+uah+mzTu7pF9J8ZkvKB7S+Yt4C1NfglGUo8/+wvyCqdkLb+gx/4aaeizZnHym6Bhjaw97jcYPOzvRqxus7SM5JKLs56JD8qJxCLpqi6xsL0QaLo/oj7iEbEnFn0kFko1JRbpF1hlu09MyUB7mL605U4sErzfk1hUfBslI7HYIM0BpnKOP7Eo3F8ziUa/DEzYn2Zcl7P7d3gsP6nHjltt0wAAIABJREFUn32swYx0rqv87wc99vOm2u3yaJDbz/fH/Z5sxJRYpMvYlntn0XQpU6BDF4lF0lVdYmG/QxP+JUhlZZuRpLRGcJHtU+yiSmLhImhiYe9DfVn2NYVtbJU7sUjwfk9iUfFtlIzEwta//0p/QgZvh5V5p4H9KeXZrmaXgd7JPf4W7xzLlr2k6Xy9lrvlmAyPXpSzo2PS6TkuIsyxbxuT4zF2Ijdd8JR0NvrNwBRjYqGSuew7NNSYEWaKqjQSi6SrusTC/jbPqQjfHhyBZW3Bk4CgbC8YkuN7/Gc2IbFwESyxUP16rTEVl45sK2EGmXInFgne70ksKr6NEpFYLNsT6GlqshMLs4wrO2Qgm1y4dcFJ8PFnu0bMRvhumtx7IvyehIQ79hdtOeU925N99qiiL78M+rvqvHxdZucMV6J70rRo6zlrZzGSuWjfl4LiSCySruoSC3VQn8r+xtn2qN4eHIVm6bQuThHN0KHW1Qo1kM338yQWLoIlFnXZO2UzRe6UeSn/eyySu9+TWFR6GyUhsbAn40FfkJfUxELJnavc7/wn9/izTfsb2TgL+2xTfk9oQh77dTtkn3WNdCSji7YMZpOO4vtJ0N+1PSUp5W3sHmqNslqRrH1hYSCxSLoqTCzsM0ykH8EnZmYG+8CzINPqFaPeGm1bXrEGL4mF6zYJklisyt6duygtK0sop3Ou9nLUfWL3exKLSm+j+BML+5uRr0vvFu9zXaUSi8VNndLS3m3oKG0qUNud/6v7t8W2bUuRm85VjV9o1u6Ga3+ruv9TkPDHvr27U+6N2vZuUkHGLQT93QZZtd960mTsp5t0r8kZS2z1Xdp5CDpILJKuGhML1YDvy50sUhH2K9VVuymVvYs3a5Tfd7B1sbpUg4mtbRPkQlZKYmGf1WUhJxb7bd0cShgAudh2NzNwYhG67pO638/jxCKh2yjKxKKkhqj9zvPcKWn0mxShQolF7qmjca4ppQFpGyOnnsDEtW1LYn9Ttbo5slqn3/+DeTe0/OuyhGPfOKcPW/XctyPT7dSW1F0KtD+GGDRum75WPSXx72IVhP0pSGnXC+ghsUi6qkwsDPWdMmx9bm6shBPpelnV3iOPro7mDkbWUvt85+ris7G0u0d1zdI+alvOzgAXsdCJxRrb22RDPCaeh4nF4p25PrPec6e7q1ndndsXVfi8hVi77hO538/XxCK52yjKxCJ8GRvy7pBfPbLDd0xSpRKLmqZjuZs6vjMKucu97dlnEHQij7+MJTttbxyf6JeGErv9LN4ymHuHz2h3RGMd8usg+2TfSEqbVqyxDYb2eHu31u+qRMD67HUZ3us2OL/E+pno4V0WMSCxSLpqTSyME8vy9rHciXT6nDQHPlkbJ/cu87tzQU9kwdWu68kNuJYp6d25OdyJbNk2aR2ayS5hdqjINLOWEvoi37W/hNkt5mFi8Q8rO7N30dINhvpgdaHee5FyzosfcDrKkuo+kfv9fE0skruNIk0sVFxJSePKoPt8f+78NndOHl1Z5m0W9Hyz1D7WwDjvbtkQ/HyxYo8ctLoy+jZuk3j8WR40znW268Zov6xdES5hXLzpmIxnE6eL0lo0cSrt2Lc/RTi7vz87fWvwwefhfrem3n7zx0guunbJktAJQYMs2WKrn/TTnFJnVIMOEoukq9rEQjFOpH1WP191Irwsvbu3+b57oLZ+j7SP5E6+l4zGajSzaNg1SN3OU3lvbr504pA0rl7vf6Fb+qCs2tmf/4K2iWPB7zyVkFjU2hoYs+oxcZCT7XxMLIzPrdpv25emx6R900bPhLB25Q5pPpJ7O/elvkOyLzunv/fLwrTrPpH7/fxNLJK6jaJMLC6NXsz8b2Of79y62We/WC/Ld6byGlZBnqRWcvC2uqmT7T6qyte1R+p8j0WjsdjULQPZpMKoj/3FZoVL2vFnU7dZmm03pVRysM8o25Ii56PaeuN81nfRlmxOycEtQbZVqce+fXrv3PYKPi4x/O8uauq3vafIOJ4nTkn71uJ1k37vyeo90nr8sq1+rntMS4xKILFIuqpOLO5NN8bX7r+Yf/fNONGn+nqkZXeHNG3ZI41bO6R5b7/0jkzlnRjGj+wq2wwj1t0N+4ksfTK7MiYDR/qltb1Tmnd2yKO7O6Wlq18OnrgolxyfvTp0KNwgxFJmT6mzDTo2T7b79nZLsyrX3h5p3+Iy48W8TCzuTd/xtL9V1dpevUd6jO3VbdTHIWk/MiipCduFW11g1H60VA20t/4t4N3IUuo+kfu9/SI/IwNdxn69U59KxJ2/VfHzS0K3UbSDtzfKXe3ncjdC1NvmjX2+ZWebNJplbOlKSeqK42VyXdsCNY4rPSvUYkcDUu2TZ08ck3bjnNu0dU96nZp2dkrrfmOdJvKP90snOgLeXEnS8ecs20ZpOuIs25RRBynpTO+76vhSA917pLNvUIYddZC+qdIUdDuVflPB3vUsHaG6FZX2u7WrO+Sgc32N/WN8ZFAO7u/Jvy7vVfVzSs5ecX5+ykgkQ/ZCQKRILJKu2hOLtMxdp96CE4ZHXDmXbhBU4sRQs2Jb+k7Q1eKlysbslVNG+Uo4cZU4LaO6kzPuVZa+HYWN+fmaWKTXbaM0Oi/KXnVjNDJbN+W6W+RmyQk+007ouk/kfm+/yEcXbtMrx3F+SeI2in5WqAajQX5IBgoaUS4xd1EObg2+H8Ux3WzNyl3SemIq0HGcXafdzSGfIiTl+PMu28HREMelkXyk9rfJ8lBjMzSeVuYNOA/7cj+N3126Xu7a2uN463qQMBLU44dk7crox8cgHBKLpJsXiYVljSxpbJOW/YOSGp2Sq3OZE8fs3IxcGlVPCg7Jo5s2y6IYBlvVLNssDTu703dAhidyZRPj/1+dvixnhwZlX1enNK7bUPqFR2O+d/WovrXvnIxfyQ1yu3rlogzsdhnIPJ8Ti2x97JBHu1IyMHrZ2FbWhVftR+ekd3+3NDUWbqcaow5b2g9J695uadkU/CIZqu4Tud/P78QiiduobNPNGo2u5Zs6pT17nsp8ZnZ6yjhHpaR99y6pCzkoOM73WNTWb5OmdvVEeMzYdjO2AetGvU8Y9d7XI81bmgN0h0ny8efHSBjX7ZLmrmPSO3RRLk3n6kBt03F1Pjui6iBIlyD35ZfeDdI2ZbF6V0alEhrbMhYZ+0fj7h7Zd/xc/nXZVj9qH2nZusNIuHjDdlKQWAAAkCCRvHkbAGJAYgEAQIKQWACoViQWAAAkCIkFgGpFYgEAQIKQWACoViQWAAAkCIkFgGpFYgEAQIKQWACoViQWAAAkCIkFgGpFYgEAQIKQWACoViQWAAAkCIkFgGpFYgEAQIKQWACoViQWAAAAALSRWAAAAADQRmIBAAAAQBuJBQAAAABtJBYAAAAAtJFYAAAAANBGYgEAAABAG4kFAAAAAG0kFgAAAAC0kVgAAAAA0EZiAQAAAEAbiQUAAAAAbSQWAAAAALSRWAAAAADQRmIBAAAAQBuJBQAAAABtJBYAAAAAtJFYAAAAANBGYgEAAABAG4kFAAAAAG0kFgAAAAC0kVgAAAAA0EZiAQAAAEAbiQUAAAAAbSQWAAAAALSRWAAAAADQRmKBBe+ffrRNalt2S+2uJxcuY/3/6Yc/8a+nTY9RT0mhtte/P8b2ApIkwHEJzHckFljQMknFk/LpuC9IMUuvv1EP//Soe3Lxf6l6SkA5Ybeb7QUkjvdxCSwEJBZY0NQdpoWeVFgyycVu13r69BPUUxKp7cL2ApLF67gEFgISCyxocV+Akoh6qi5sLyB54r62AXEhscCCFvfFJ4mop+rC9gKSJ+5rGxAXEgssaHFffJKIeqoubC8geeK+tgFxIbHAghb3xSeJqKfqwvYCkifuaxsQFxILLGhxX3ySiHqqLmwvIHnivrYBcSGxwIIW98Uniain6sL2ApIn7msbEBcSCyxocV98kiiJ9XTb0QsiH52X7z8Vf/0krexl317PnpDzMiN7u+Kvy2reTlhY4r62AXEhscCCFupi8czrclKcMSdd3aVefJ6W1a8dl81dT8d+ESx2QYysnp41/jb3vjzzm3BlSnyjz2e9Ep9YOLfXR3Ny4d0zsnnvHnPdKpRYRH58lWsfcxy3Je7TvmXpOi5HJ2eMtTdqYGZSjqZekdsqUAfl9plne+RAer0+kgsXTkh9q9++8JEcPbDH9u+/lu2TRn2MvBL7egQR97UNiAuJBRa0UBcLs+Fz8uRBWd39immf3OF1cSzqRdk7I3I+9XzsF8FiF8TI6ql1n/x46LisbgtXpsQnFj7rVS2JhbW91h9+XbomPxKZOSur1TarcGIR3fFVrn3McdyWuE97auuTN43qnxw7IY8ceEW+/9pZOf/RR3L62K8rUg/l8wv5/vmPZG5yWL7fbSQY1z4y6tBjnUgsgKpFYoEFLdTFwvVil/P53xyXo+/PyZy643vhhNnQ2CN3HB6Wk8ZFNP3vY9Zduleka852X1ZdLLvPyjV5T378TGZ5X35NXUXPyGq1/K4zMmn89c0x4/9+9Gd5pNXr934h9cf+LOfnjJbJRzNyeqRPvh6yQVvWerI3UtPrOyldJ8+nyzs3857s7bae3hj1dvSs+e+TcnTsfY9Gn1f9OqTr73158/ykTBqNtLlrF6S16xe2v+XXrbpj/Fq6bj+SyXfPyCPP7knX7SNjxncv9Jl3jzMNnWunX5HP5DW+/cvuut1cyhDn9vpM9xmjNNcyd+EdiYV73RTbnl77a/Djy/93PY6bkvexEMdtRPWTv69ek73ZJyB7pD71Z3nt5Cvyeb/9uOTf9j5neC6vYH8Nct55Wh658JFcM+rsM0+pY+cjOflaR4hzSGFiEfRY8lwPz/2yPOdRYCEgscCCVkoD7LXDvzAujHtM5t/aXpWjRoPjwvnXZX13nxx437iAnj8on3/2uNHomJM3U6/IPd3H5U3jM5ND+9KNhc8/86ocmDG+M/SKfLl1T4DEwvjuhUHZfHSffNnr934znL6oHjj6onzd/L2wT0TKWk8FiYW1Dj2yV90lnzwud6Q/d1xOG/95YcT424G+zB10t8TCs37dGmsfpe+Gf33vK7L9gvHBa8NS/5Rb3fbIa0aDwirXM++qzw7KPU9l7mrPqXKoRmZbn5w0GiMHuvfkr5df2b22m7MMcW6v1l/L+tOqkf2ebH7Gsc186sZ3e3qtd+Djq9jv+iUWJexjYY7bKOrHrtVIXozlX5s8I5u7f51fR377cam/7XXO8Fuec38NeN657cBZIyG6JueNhvzk2OvejXXXfeF5aX3fllgEPZb81qPC51FgISCxwIIWvgHmiHdfTzcC0w1OuSCbzbuwt/3ugnEFPCurf9kh9/zm1+Yd7l/I98dUS6bHbCw4ulQUTSzel+3Pmsv3+r2X1AVxRo7+7kX5snEx/nxbh3Fhdb8DXN6Gqns9uT2xsNbpjmO59f3ya+8Zjbw/Zxrw1vq5JRatfvXrbJDlfivTmHpfWve61O3v8n+7dq+94ai6qWSSic8f/rPMzZ2X9U/lr5df2T2328v5ZYh9exmNv9dee14+49hmvnXjsz091/upIuWwjq+iv+v/xCL0Pua7XzmO2wjqx7lNPvPMQWk9/346GZC5STnw2r5MWXz245J/+zfu5wzf5TmOGa9l5K+XekJ03tgLJJ20/lh9t/V5WX/0FbnDeVy7jrexPSXy26deDn48V/o8CiwEJBZY0EppgJ08ts9odLyY8WymO8EdqfddLoHqMXyHrE79WU7PqEft5j+XnFjYGgaev/cLuee1s8bvqR+bk/Njx6U+ZN/vctaTX2JhX9+vq/WbGZZ7zGV693/3q18bZ4NM3a1WA4O7Cv/m/O10MqG6ZRxWDYunZfO7H8nk0CuyfmROrp1/NfNbtvXyK7vndnvFUb44t9deo0Ftr2efdcurG5/t6b2/Bttviv9usMQi+D4W4riNoH48t03rr2X1a+fNMRbP++7Hpf+2+znDd3nOcngsIy9Z+s2g0YSfkQOHX5Ht76qxFiek/oCxnI/M5LzYOeQ3r0rXtVxiEfRY8luPSp9HgYWAxAILWvgGmHsf8MzdzgvyY6NRdsezpmeelv/78HmjYTIprb9R/aD3pAcveicWZ7wv/o4Ludfvfe6ZF6X+Nx3yGeO3btvbJ0dnPLoGlb2hGnyMhdv6pu8yzp3NNji8EovP+9avjaP+PmP2w849sXDW7Xn3O7W7Mne65669JydnMl01nOvlV3av7faZgoZaQrZXwbr51I3v9vRY71DHl9fv+hw3Je5j/vuV3xOL0urHvq53/O68nFYzJmX3dfXERDJPb3z241J/+zMe5wzf5TnLEeC882X7UxLVBcn4jBrzMPduX2HXvwBjLIIeS37rUenzKLAQkFhgQYusAfZMj7xp9ePt2ifrXzsrb54+KHemH7W/L11HX5HVRwfTfXUlO/g302f42oXjsn7v0+bdx4/k9NCrsvpApr+vV2Lh/Xt/TjeI9h54Ub7+GzXzSnUmFukpPI1Gx8nUK/L1Z/dl+pK7JBa3+davjdk3/fzpPllt9THPG2Nhq9s2s25V3/vuV/P7ZJvrd1rd2LQPss4bY+FTdo/tdluVJBa+deO3Pb3WO2g5/H7X77gpcR/z36+cx20E9WOj7uyfV/uqsYzvq1m6jg7LaTXGQ00S4Lcfl/jbt3mdM/yW52y8BzjvZMqe6V50x7MvyubzM+nnA65jF4IM3g56LPmtR4XPo8BCQGKBBS3KBtjnu8zZRYzPTL5/Xrar2Vqeet64gL4v19KzkZyVLtV4ef+EfN38zh2/+3N6dhc1s1B6JpKT74lqK6hZWw6cf987sfD6PTXHfsqazUQ9wj8RU1cozcTCPmPP3PtydGwyM2ja2WWiSP3mJxYz8uZ5s36vXTDry71ub+s64TmLTLaBc6En1zD2mhXKpeyu261aEgu/uinScHbfX4OXw3ub+Bw3pe5jYY7biOrH7svdJ+To5DXj91VPnGtycqRP7mktsh+X/Nve5wzP5RXsr0HOO6p70Xmze5GxvMk/y96R94x1VO8AcWzzoLNCBTyW/I7nSp5HgYWAxAILWthG3EIwL+tJo+GedPNye8HdPN6P55u4r21AXEgssKDFffFJonlZT/O4QTYvtxfczeP9eL6J+9oGxIXEAgta3BefJJqX9TSPG2TzcnvB3Tzej+ebuK9tQFxILLCgxX3xSSLqqbqwvYDkifvaBsSFxAILWtwXnySinqoL2wtInrivbUBcSCywoMV98Uki6qm6sL2A5In72gbEhcQCC1rcF58kop6qC9sLSJ64r21AXEgssKDFffFJIuqpurC9gOSJ+9oGxIXEAgtabcvu2C9ASfFp9f+f2E09VQm1vT7dwvYCksTvuAQWAhILLGj/9OhPsheDuC9IcV8M1f9X9eFZT8bFcqHXU1J8erf6/7uN7bKV7QUkRLHjElgISCyw4P3TpsfSd+rjvijFylj///7vP/avp39/LH0nLvayQj6tttcPmtleQIIEOS6B+Y7EAgAAAIA2EgsAAAAA2kgsAAAAAGgjsQAAAACgjcQCAAAAgDYSCwAAAADaSCwAAAAAaCOxAAAAAKCNxAIAAACANhILAAAAANpILAAAAABoI7EAAAAAoI3EAgAAAIA2EgsAAAAA2kgsAAAAAGgjsQAAAACgjcQCAAAAgDYSCwAAAADaSCwAAAAAaCOxAAAAAKCNxAIAAACANhILAAAAANpILAAAAABoI7EAAAAAoI3EAgAAAIA2EgsAAAAA2kgsAAAAAGgjsQAAAACgjcQCAAAAgDYSCwAAAADaSCwAAAAAaCOxAAAAAKCNxAIAAACANhILAAAAANpILAAAAABoI7EAAAAAoI3EAgAAAIA2EgsAAAAA2kgsAAAAAGgjsQAAAACgjcQCAAAAgDYSCwAAAADaSCwAAAAAaCOxAAAAAKCNxAIAAACANhILAAAAANpILAAAAABoI7EAAAAAoI3EAgAAAIA2EgsAAAAA2kgsAAAAAGgjsQAAAACgjcQCAAAAgDYSCwAAAADaSCwAAAAAaCOxAAAAAKCNxAIAAACANhILAAAAANpILAAAAABoI7EAAAAAoI3EAgAAAIA2EgsAAAAA2kgsAAAAAGj7hBAEQRAEQRAEQWgGiQVBEARBEARBENpBYkEQBEEQBEEQhHaQWBAEQRAEQRAEoR0kFgRBEARBEARBaAeJBUEQBEEQBEEQ2kFiQRAEQRAEQRCEdpBYEARBEARBEAShHSQWBEEQBEEQBEFoB4kFQRAEQRAEQRDaQWJBEARBEARBEIR2kFgQBEEQBEEQBKEdJBYEQRAEQRAEQWgHiQVBEARBEARBENpBYkEQBEEQBEEQhHaQWBAEQRAEQRAEoR0kFgRBEARBEARBaAeJBUEQBEEQBEEQ2kFiQRAEQRAEQRCEdpBYEARBEARBEAShHSQWBEEQBEEQBEFoB4kFQRAEQRAEQRDaQWJBEARBEARBEIR2kFgQBEEQBEEQBKEdJBYEQRAEQRAEQWgHiQVBEARBEARBENpBYkEQBEEQBEEQhHaQWBAEQRAEQRAEoR0kFgRBEARBEARBaAeJBUEQBEEQBEEQ2kFiQRAEQRAEQRCEdpBYEARBEARBEAShHSQWBEEQBEEQBEFoB4kFQRAEQRAEQRDaQWJBEARBEARBEIR2kFgQBEEQBEEQBKEdJBYEQRAEQRAEQWgHiQVBEARBEARBENpBYkEQBEEQBEEQhHaQWBAEQRAEQRAEoR0kFgRBEARBEARBaAeJBUEQBEEQBEEQ2kFiQRBJiA8uyu0/6ZNPmG7a99e4S0QQFYy/yX07cvv/J9r+ImOxLocgCIIoJUgsIolpOX3wWdn8b/fLHf9zmXzmH/9Zav9xmXz+C9+W+vtbZG/vuzIXaDlzcr73hdxyPmks55NfyS6na+CvFV5OwJidlu63RuQbz6WkdsdrcpO6oD/+mtz85Fty+4sj8tNTV+W9KH+vKuNjeeePp2SRUT+f2PGG3PnWtMza/0xiUR0x+1c5edA4tv61Xm5b/oJcCPzFzDnikX/9tnz5f34lc0z+4wr58lcels0/f1POzxZfgtsyz/e+LNsb/13qv3KP3PY/1HKXyfd7S1mWf4y99Xausf6T1+T2tz+M+BdILBIds3+SHy9V1xHLV+T7B4t9qZzXoRvS0Wnbzj95SzZdKXlhBEFEGCQWunHpTfnx8mW2E6672/71WTl51Wc5s2flmX9dUWQ5X5E7Gnv8GzNRLef/b+/sYqI69zW+77w06Y3xSq+KN4ab5nBhgzmmjbVJgydpw8X24/QYY2uaTWJPNO3ujW2CxKSSmF3YsSluiJZ6POihG+NmHz9m4xQmOsU5gAKWFJTKsJHAMFBmAuz9nLVmBljvuz5mrZk1s8bF80ueC53hnfX5vv/n/fi/tlhCT6gP22q1FbyxNp3vQ/34Ut6/WDRejKFcc/xbbszkV97yFKq016m2FxfnNZ+XorFw+xq8tCQxfq9DCeA/xK6tmveo0qaxmPwRddnqiPIafNNnN8xSjqfjKxwqrzQoqxDGIo5TDdI7fWEMg67+Bo1F6ZJE7+lqXRtiaSwK3g7RWBBSqtBY5EOqF8eocTfWzndaMWJY0DS+P5DdnKxq14kfMVfQcuywiNa27qyGQlBtCIdHXB0rKRxFMBaNNBYlzVxfDy59chL7dpi843aMhZM6YnsNLj3NVuA0AicOZnp/jVQAYzH+BNt077MSyLk6DEljUaok+77Cvq3yc2ZlLIrRDtFYEFKq0FjkwXjjEbGBL69Bw61RTCWSSMYm0PttHfZtFxv9ox1xXTlztz7Da9pydijldAwL5ewXyqlGXZ/+eNwqJzsreHj7fnrK05q6UN42gosjMTx8sYDBaAw3I2M43NQlBiRnI7g4m8tvFhnXg+r1qVCbzoZQ9TJMhdrAxmLq2w8tgne7xiKJ3k/Ent5XKz/HpXujmIvFMTXcg28O7Bd+59V3rlmUGUePUp54XG9gz7t1aPg2gJ4Hwxh5Oo25nKZVmbGCm+1Bw44C9Xlw76doLEqSxDDqKo2MsbmxKE47RGNBSKlCY5Ez07j0jlw56nvj5zpOYqd21OJIjzSvNI6r72or7oPG5UiV9WvHfyxQOTZ48QwVQu97CMdMRyKSuC6NbGxpdzMgKRDFDqppLEqKqaYPRUOw4yAOHf8M+51MhYoFcFQbQO34DJ266ZATynur7d3dj08fGL9Lc7c+F97dVys+w6U+fUeFqySmUK0J1DfVBjSdBAO4uezWD9FYlB5JPKo3Gx0zMxbFaodoLAgpVWgscmYYp8u1oxX16DX6WkIJLrTByJvXMGXxudpjOWVUTrbfc6ucrKzg7g1tD2YA5cEswU1iElXaxt4yIFlBdHwCp9p6UX6+SwlkVOPShS0NYextH0Nr1GKdhhQI7w6rTdUSHg6MoLolhC3qwmnleDefC2F32xiuv1iRCoih5nz2KV3bbmfOVzID5cEF5VxjaGzvRdm5gGQQpHnq55+gR/vTBsYisbyIm6HH2HuhG5tr1aBOvQ69OBycwqDZ9XsxgjLtseoj2TSzijnUfG9z+6ppcHgN3Lp3jq6l5jReTKH+RgQVDcHUNVq9vxWXH+PMQDznpAGqsXh1u2ImTjTj+3uryRd+xKc77BuLZMdnQqfCvsYJ4y/2fYU92iDrxI8GXxpGnXbxbPnn6JzM8eQcEI1ENCOTIdSEhrBFM0pZNeBg3dT8DBo7+1BxPn2vNp0NoqxlAGeGFpRn3YEhcKsc23hZJ+kp1DOvo69ZMwVqP44eOJjdWBStHXLZWKwmIGlavSfp52rbhYhS307ioVlPWAHur3osrbcHsDtzf9V6P30c6Xp/MHhf05Y+xl3hePKt/128Nm6dk3zo0Umcas+8i1+sv4tVN37BzdkSen82MDQWOTOKhkp7xuIjbUWzUFkYAAAZkElEQVT7boc4n1QKKvacHjb5vSQCR7Q9mx/i0mQBysmG2nCf045WRNCatWJZQutlTU/nF92oMYrIluNovNItTbGS1YXyG1PGwYJUyVfcnsSZli7zsmrvo2ZMGxTkZyy2tT1BtfT3m3M1Fi2PcfhCwPw4zvXholEj5ZWxyPfeObqWKkncvB3WBLnG2nxhCNdzmXoXixv0oDozFiP12kBsP04/MPumFGRVNuvWYiWF0Yq3laCuwCMVKRbR2KR5BhvGlCBAfD42tUzYaohnx56g/KzZfQpg2xUl6LBhCNwqxzae10laCvzMC6jt2/rIg7oOYkQYxTMxFsVqh1wzFisYHXhs8UxldDaMGqNReVfvrxIuRJ9h9znz49jUMIBjlzUdewU1FnleG7fOaZXlRbS238dmq2Op7UZVZMFkRkQx35+NDY1FziTRc0Kb9aIap20M+e6rHxW/oHyuHWqu/tY8YHgkZOaQ5qW6VU42omLF9ZuWX2wFFmqPX2PoGepVhdWeBekLywuot6qQJW25PKFvyKVK3pbUAH+t939BCSLCKL9wH+UNQTGYOBtK//+FMKrCC+mvS8GwYSWVo7Gwd+yPcVOuQfNuWBxeA7funaNrabTG504qvXHZ+aA+CDw/hLuuzL1zZix6P9kvTAlpMIux1Okj2mmV2z9HQPhcqWuOa+qa8jr0xiYQaKzDocr92Lk1Hejt3FGN6uPN6HzqUoIE6X1KjSIpPOzUTm0Moz5bIyxPnbQjI0PgVjl2KYk6aZXiPvMj2vWD5crzGJOnB5oYi2K1Qy4Zi+jQgD7QVHvAzwX1AWyt8qzLv+Ha/VWYncDebEG8rAIai7yvjVvnlEIxFVeM13rpFUT1kFwHetVmbExoLPLh6TVUa+dQZxZvpxZPJqbxqK1eXKSWqaC1zLXVaCriShxtMw8KxB7Qt/HpPffLyUZiqE94CbfcsMqhax/1pde+2Gp62jNDcUQTK0gkFtEz8ETq9QigIiTl0jeq5M/1oiYyg4ezSURnF3A3MiT1wHTh8JhRz7+N9QUmwfCm82HsvTKA6rY+VIdWG9YcjMX5CE4NzGBQPfZ59djla2DQcLjZY2VzjYUr987JtUxMYq82wFR+76J2Osr8jK7XsDy0gPxxZizEwGk/TpsGTkl8f0AzL33rSXwvNGriNKhXK0/iI6tMU1ur8XGHybQrBzy8HdJcQ42BkDoXym5bXdtFNLaII29qD2X9SByj80mMvphB6+2IPmW1zhC4VY6T8y+hOqmYz/xwq2Yt0dv4+Fb6vbNjLIrVDrliLJZncEwYfQ/hcCSONZ+8vIjrN8RgVO3cEF5N19qcpBI4d0nPm1r/xzA4r5YTx83wECrkIL1QxsKNa+PWOSmMhnuF30q/+wuYXVbeRbVtDA+gTPt+nHssTrf2rM3YmNBY5Mncva+kDBcm2nESl4YNRjS+rREq66Md5hXxeKNYEX98z/1yshGN9AovX1nQhZdPXoNxrg+t8wZfk3ss5cpDruRNMlBFpUqq3OgccjIWXdgdisG4A9ehsTA59oRyXNbXoMjGwq175+Rajg0JPWnpec0SSnna8/tNy4TJfXGCM2OhvpPa3tv9ZmssUgtetcagRjQWib+K67TsSDEXp00WgdtCDiyatAH6As5csHiWtUjP42/ODehH2WDQOyobArfKsUup1UlFe+ZH8c2b66b1tSOBtam7toxFkdohV4xFVEyjbJzlTJoaem5ICuRdur9SfWyaPVF+3gplLNy4Nm6dkzz92uRdHI1or3EAe7XrvzxrMzYmNBYuMHevHnusGv7tHxqaitTfvmzGIqzdgVd19fnvwDsrLBA1CfQz9AjTMLpQPaLp+ZEDYbMFaXYC5hyMhfV8c+eLt41Zwc02bc+KtF6lyMbCtXvn5FpKjUSZ4ULyJQyOz+DuWEbRpAuZyJwZCww3Y5+2Hij/HD0Gt2PuXp0wL103YvG0VSwnYxw+agzg0WQcyUQc4w868HGluHfAq452BhdJjAxopjsEdA2xsNjyiyAOjxgvmhwNib3+uh79NawXXbtVTurc1F5OI2m+U3J1UpGe+fEmTZplKYuZ74xFitX7b/65sD5QXVNoYRxzvb+q8dA+3+Yddouo15r6Aq+xyOfauHVOYl1k8S4uixnshBEUz9qMjQmNRV4k8ajppLgbr6m5OIhPb+mDxZfNWIwWwFjcbdcGylkaiHGLCsJuelRdpWoQxOdiLCxTxLplLPRBz96IpmemyMbCtXvn5FouT6NamIISREX7M7SOLxa4h8mhsUilpBanLO18sw7fP5hWao4k5p4Oo7P+pL5TYutn4hoLaUHstq1H0GC0S3esBx9rF4HnvE/NkjiFQd4lXkV+ftqmDK79Cq63aacv3ccZ0+fDyhC4VU5MHIXRaf35Lbk6qRjPvDq1VzMF6qj0DvrTWGhZwexsHD1j07g+NInWAVUTOKYNer+I4KI22nTp/orPWzdqTHtVimks8rs2bp2TuKbLJPGLUTkXxjC4+pFnbcbGhMYiD6baTgoLs3emNr+aWF9j0dGMQ9qGfutB1EnTE142Y2G/F8IuSgPRonnha/vEHiEZqwB0gxgLufdF6MEpqrFw8d453MdDnfKi3w1aPYYgypr6cCw4gbsvHKRCtYVTYwFpvrpNyRnm+uqxS/O5mo7W7O1WN+3UllXdlMN+KPMT2K2ZmrDpstGUACljVG1Ebz6Uo2y0/XxYGQK3yrFrLEqzTirsMz+hmOD1Ea+dB/6qSxPrW2MxH0PjjQjKbC0yLoSxkLMmSr8hUGRjkfO1ceucVnD9ikV2RCtJbaw3bcbGhMYiVxJSkGEyzUFe4C1PT8hrsdsD98vJetquL95WKpUmbaUygJuWBzCBvdpG/Mrk+nDlRjEW4+L8V7GHtJjGwsV7l8MGgbPjv6D6glXWngC2XR7RZyDLmRyMBbKtw6rEnuPN+LRS83/vWKek3vWJaXopnQnZ9Um/47McDYWFa1gRjGF0dlGnHmFxs/K9sDx66eT5sDIEbpVj11iUaJ2Ewj3z6hSotT1XttfgqkHq14Iv3nbQDrllLGbHx/SLh20Hz3DNWMhG9rqpkS2escjv2rh1TvJ9diB5zQe8aDM2JjQWuXKvzjqN7BpJBI5r5z4fwTdPNR/r0vOZB1TO0s3mWE42dOlm7S1wmo1O4/pAZgh1aAo9a72bSQcVEHQLrDhi4eWIhYv3Luedx1cQjU6h8fZj7G3qzmx4JDcwfcaLBh2Tm7FIERvG9/Wf49Cb1di14228Vl6N/QfqceneNJKJHnykMR663P/SWg3jDfQyPG3FfrvfNWRBfE6dSDv1IIWT4MLKELhVjl1KtE5aw+VnfvKvOGQnAYmpNG1asdohN4xFYlpcFPxFELs7J1Jz62fX7vcKWq9Y9Ly7cn+l35DXcQgUyVjkfW3cOidpHccXXdjWFEaFDe2+8gwPDX+vmG3GxoTGIkfkId9DuabVs90bmUTnEe187RpcjRWgnGyocxWFXbSVRtfOBnlCBRTEMU1EdlOYi2k1fxrWi7A2iLGQ11jstlpjYTai5NIaC9fuXc7GQmI5iYcjz3C4SeyV0qdCzIU8jIUFSWGvG4ON9OSsUPKIhhbbG5SZII2GOZMS3EnzqMVEA1Z7XlgbArfKsUtJ1klm5PvMK8Z1j84s5GgsitUOuWAsxHrUIFVwimIYC+DujaDNc3FoLHKs/924Nm6d0912qRy3t8YuaJuxMaGxyJFk20mhZ2afaSpJSBvpSYGDujO3trfINJNLv7g7b8VXeIQClJMVOSuRWaWjPTYpdeNZsQcwKqWJsyrPUQaWl9pYTJlUatmyQonHbRqguGQsXLt3tq/lEnoiYzh1eySlMxGTlLRqutTz4vU27r1yQgGMRaIfdZodjo123Vbnv3/zpuZ31XS0JvHCVJN2jYXa4eFkh+4VqRF3LjktpZjsIaCYYLMOmCxZoVwqxy6lVScV+JmXRrnyMhZFa4fyNxY9QuBrZh6LYyx0WchMn7dsxsKd+t+Na+PWOTnJ0GaMl23GxoTGIlfkTC0V9eg1igRjSkW7wyooiIubY71inH9+rkPcwfu1E/LcabfKsYE8Har2Pk6Nmy16SuJ6u7bhVSpfuSdgfkLcvObcAK4b5KnGrBJ8CrnlrXPG52UsdFlvDL5TQGNhO+d3to2AGowqxxUMhsLi5kZGxsLWNXDp3jkwFhflFIeGDszBXgu2cdlYxPrR8I620+FtfNRhbASENKBqT/CJH/WjFjHl+IRkER8azpU3JTEljUZK98jkb8ROgwHrfRxMdrTNvo+FS+XYpaTqJC+f+XVs7bxdtHYof2Mh9qibpEyen0SVMCWoMMZCfY7Eet1k35TomPWeDy7V/65cG7fOSX4Xz/ai/oVxemskYjhzOYIzQjxSGu/PRoLGImdG0VApp5Ksx9UHq1mh4hi5d02XW37ngYAuIEhK6zW27fgQdR3DmDLbwfuVg2gwGGF2q5zsrCgVj3ZX3nTls/vGM7SOxfDwxQIGozO4HhnTL5Sq7UWjLmBeQU+nWN7qzppRtZFWhyqHxrBX25uQ6kWUei7cNBZyBX0ugvqxBYzOLuDhbKbSKqSxyPxmepfSJczOqzv9jmCvtPi0TDeHVur9Ua5TWfsEemaTmE0kMRqdRuONsJAX3NRY2LkGbt07B9cyGokIx7+5RV1sp21olvAw3CcEmJuvTBZ9gzyRJOYmpzE+PIzeWx1oOFGjSzO763iP+RSnhGQaXnkD+453oOdpZh+Lex34VKprXlPKc7JFntwzqObkzz4VQB5B60KVdmMqdb3CZWmKwYXHaFSeo2hiCdEXMZs7ZrtVjl1Kq07y7plfx56xKFY7pDcWNWNJROeza3WNQFR63tXdmOvHFlO7Oc+quzlH5J3VC2gslPO53ibvUp3e6X1Uqf/t71LtTv3vyrVx7ZxW8PC2FG+cvY/D4WmlbVxJfa4e003tMdWGcGwkKZyP1+/PRoLGIg+SfV9hn5NUkjtqcPWpUUnT6Dzyts1yKrHnk36TgMGtcmywvIDGyw6nTdR24/CQyS8ux3GmyX5auc2XJ/QBg6vzmaXMMEbfL7SxyKbzj413H5YqUVvX0zDdoI1roOLGvXN0LZVnr0XO7BHA5vMhlDV0Y4scXNbex5moSQ+XI/IwFh3i1En5Xdx1pCNrWckHDuqbijoEHM1ZV1O6au9ht7AOyorE2GOhQdZtbvhC6tW3IyND4FY5dimpOsmrZ34du8aiOO1QrtmCAqgayhQhT32xpTAatb3uro6SyyMANqQLwl2q/924Ni6ekxpv1Ouef6sywtLz7/37s5GgsciTuQetOFRembUCVfe4+N5k9+0UiVFcPbDfIvjIVMLHA9YBiFvl2GIRNzt7xakHJlJ7KupNp0utHnsM9Ze7xZ4Sg4ahrG0Cg0ZTNNxO7Tjy2HAhazGMRcWNMVSftwhq1KwVZsPByn1pbbO6juo1HBCGn83ymGe9Bqvke++cLt5Wgr7GK9l+T71OYdSM5GyfJQpgLLYfxMdNw+YjFRJzD5pRvSNLXfNmPQJOpkCp6KYaOZlfHJOCEP3i6tnxEcvUlVtanuCw1sSaGAK3yrFNKdVJnjzz69g3FihCO+SCsVAPM/qLbhRYDlCrWrQdaJLhdrnNSUSfWR7P5qYBcZTMKAh3qf7P+9q4ek5ImYuLbaGsz78aazRGDWINj9+fjQSNhRskJtDz7Vf4+N0j2LPjjXRlurUSO3eoKSXr0NBmN3BIYvzWNZw+oCnnlXQ51UfqcVVNTVnUcuyRmJ3BxVTqthC2nM0Ew7Vd2HL+Pna3DaF+KO5gSHEFo2O/oKatF2XnujKVgNqzcB9720fQOm5x5AXIwBIde4bDLaFMj0bmOEKZefAFMxZq47eSqkivBx9jd0MwnRJPvaYNvai+PYlBG5m4Hg6MoFpzTzad7Ub5ZeV+jCwioS5yPae9BuY7r1peA4E87l2OWaGi4xM41R5B+fkgNmWOL3WeLX2oCU3ZuE5OyN9YvLr1DeyqOIJDynv4TVt/enqIU5SgrbOxDkffrMZr2ysz7/Z+7Hv3czR02DcpWuSpBkJmIzt/39md/e/VzbY6+1CRuVebzqobUw3gVCRdP9zU7q5tZQjcKsc2JVYnFfWZX8eRsUhRyHbIHWORIhFH6+0BqZ4NK/XsRCotemJkQBgBENN7FyDrl3Q8m5Tj2XYhgmPhGUSXpXUABns1rF4fV+r/fK6N6+eUJhqdxBnl+a9YPaa1c3us1AGx9FRFq7/36P3ZSNBYEEIIIYSUOnK6d1eMs8f48Zw2ODQWhBBCCCEeMzrwBDUD5qmNR8O9wgiB6QZ4JYQfz4lYQ2NBCCGEEOIhs+NPUJ6amtOFsrYxtI4vrmWwSsyms54J6xlrs2zcWAL48ZxIdmgsCCGEEEI8I53eOOvC4jV1oSIUL/Gdof14TsQONBaEEEIIIZ6SxN2gwV4ssmq7URVykhDFS/x4TiQbNBaEEEIIIaXAfAytoSFUNYWwbTWjU20wlUXp8O0J3J1/CfdX8OM5EVNoLAghhBBCCCF5Q2NBCCGEEEIIyRsaC0IIIYQQQkje0FgQQgghhBBC8obGghBCCCGEEJI3NBaEEEIIIYSQvKGxIIQQQgghhOQNjQUhhBBCCCEkb2gsCCGEEEIIIXlDY0EIIYQQQgjJGxoLQgghhBBCSN7QWBBCCCGEEELyhsaCEEIIIYQQkjc0FoQQQgghhJC8obEghBBCCCGE5A2NBSGEEEIIISRvaCwIIYQQQnxI8h8r+K/xAfzbD9/iX279kaJsSX1e/lt5btTnxyk0FoQQQgghPuPvyQW81/2d50Eq9fKquudK6jlyAo0FIYQQQojP+Pf7bZ4HptTLr6MP/sfRc0djQQghhBDiI67/8tjzgJTyjzomhm0/ezQWhBBCCCE+4j/uX/M8GKX8I/V5sguNBSGEEEKIj/jXu02eB6OUf6Q+T3ahsSCEEEII8RFeB6KU/2QXGgtCCCGEEB/hdRBK+U92obEghBBCCPERXgehlP9kFxoLQgghhBAf4XUQSvlPdqGxIIQQQgjxEV4HoZT/ZBcaC0IIIYQQH+F1EEr5T3ahsSCEEEII8RFeB6GU/2QXGgtCCCGEEB/hdRBK+U92obEghBBCCPERXgehlP9kFxoLQgghhBAf4XUQSvlPdqGxIIQQQgjxEV4Hocb6Gu/1/x+6478iuQIkl2YQfv43vB/Qfuc7/CGuOZGVXzE8FcIHXSafZ0hO/y/2yGUs/Yzfd62X/XrkZyTjP6DKxnFWRXoRiMURX0kfw+jMEL4MN2vKX0Z3/9fC36XKX+jFb3XlNePMzLJyPD/hd3cy/3fnf9G9Ynb39GWXguxCY0EIIYQQ4iO8DkKNVPXoGeJLz/Gn3u+wRwmwXw+248spJXiPK8H4asC9FrQ3pYP1YAdalX/Hox14Xfv5oya8fufrNYm/lTYW8aUkRp9ey/ydfWORPs5JtPVfQ1VAKT/QjN9GQugcXzUvDo1F8Af0ryRTxxOINAkGJn38Hfhz8lf8uXf1397fKxoLQgghhBCSwusgVCcleO5MKoF1f5P0/9fQtriM8CPz0YCq4UnFEITwnkVQrzcWywj81IvhpWc43eXAWKwdZ3PW8u0ai/d+eoFk7Af8/qliooSRlVW1o001FuESuE80FoQQQgghRIvXQahO9x/h+crP+L1Bb/z7478iOfUXcURiNWi/8x2+nEkibva5lbGINON3z3/F8/H0qIUtY6Ec57TJceZmLK7iTwuKcRpUjEqoF6Mrz3GmSy6PxoIQQgghhJQoXgehOvX+hOTSED4w+CzVoz/zN7y1FrSr6y/SU4eSK8uYjj3Cfwa1Qb1ygpmpRavq/+mqgbH4Y3oa0pISzAdtGguL4xTL1x9Daj2GbCxShup5ZtQkbTL6hy/RWBBCCCGEkJcDr4NQnSxGAgxHLAYv4a1AU2othj6oV0cAvsNbXc1rEr+nMRa3vsYH43E8f96Bt/rdHbGQj6Fq8Jk0YqH89nPl3KbvrE1/SpmotWldNBaEEEIIIaTE8ToI1SnbGotB64xLclBvbypU5t/BvyG8NIk//PTMwRqLpqzlZ50Kdecv6FyCNLKxrPzHDP4UorEghBBCCCEvAV4HoUaqGny+nhVKDcSD13AmkxXqfV1WqCzGImtWKI2xuPU13h+PpwJ72MkKNZjOCtXafxVv5ZEVak//z0o5P+H3wWbNyMZVfDmzjOdPr9FYEEIIIYSQ0sfrINRYmX0sFn6FEuIjuRQ32ccim7EwOGFhepFsLBR13UnvG+FkH4t4eh8L9TiHpx/h9H0n+1g04/S0bCAyhkP5Xjz5CB+smSkaC0IIIYQQUqJ4HYRS/pNdaCwIIYQQQnyE10Eo5T/ZhcaCEEIIIcRHeB2EUv6TXWgsCCGEEEJ8hNdBKOU/2YXGghBCCCHER3gdhFL+k11oLAghhBBCfITXQSjlP9mlIMbiH//8J2bnF/H32XlMzsQpiqIoiqKoIsnrIJTynzwzFoqnwBQNBUVRFEVRlCfyOgil/CfPjEVsIeH5C0VRFEVRFLVR5XUQSvlPnhkLjlZQFEVRFEV5J6+DUMp/8sxYeP0yURRFURRFbWR5HYRS/hONBUVRFEVR1AaU10Eo5T/RWFAURVEURW1AeR2EUv4TjQVFURRFUdQGlNdBKOU/0VhQFEVRFEVtQHkdhFL+E40FRVEURVHUBpTXQSjlP9nl/wEhuQuazRXrRgAAAABJRU5ErkJggg=="
     },
     "metadata": {
      "image/png": {
       "height": 526,
       "width": 790
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "*** Test Cases ***\n",
    "\n",
    "Demonstrate failing test\n",
    "    Open url  https://plone.org\n",
    "    Page should contain  Hello World!"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Robot Framework",
   "language": "robotframework",
   "name": "robotkernel"
  },
  "language_info": {
   "codemirror_mode": "robotframework",
   "file_extension": ".robot",
   "mimetype": "text/plain",
   "name": "robotframework",
   "pygments_lexer": "robotframework"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}