Skip to content

Instantly share code, notes, and snippets.

@jhconning
Created March 7, 2017 18:52
Show Gist options
  • Save jhconning/faca7387a24a5011b5f4761003935b29 to your computer and use it in GitHub Desktop.
Save jhconning/faca7387a24a5011b5f4761003935b29 to your computer and use it in GitHub Desktop.
Folium map markers and zipfile
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Mapping largest cities\n",
"## Experiments with folium, zipfile and pandas"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import zipfile, requests, codecs\n",
"from io import BytesIO\n",
"import pandas as pd\n",
"import folium\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Get online data from Census gazeteer\n",
"\n",
"https://www.census.gov/geo/maps-data/data/gazetteer2010.html"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"url = 'http://www2.census.gov/geo/docs/maps-data/data/gazetteer/Gaz_places_national.zip'\n",
"r = requests.get(url)\n",
"z = zipfile.ZipFile(BytesIO(r.content))\n",
"z.extractall()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There is just one file in this zipfile"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'Gaz_places_national.txt'"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"filename = z.namelist()[0]\n",
"filename"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I was getting an encoding error trying to read this file into a pandas dataframe. The following makes sure the file is encoded in utf-8."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"file = codecs.open(filename, \"r\",encoding='utf-8', errors='ignore')\n",
"df = pd.read_table(file, sep = '\\t')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Some column names might have whitespace in them, so strip those out."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"df = df.rename(columns=lambda x: x.strip())"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Index(['USPS', 'GEOID', 'ANSICODE', 'NAME', 'LSAD', 'FUNCSTAT', 'POP10',\n",
" 'HU10', 'ALAND', 'AWATER', 'ALAND_SQMI', 'AWATER_SQMI', 'INTPTLAT',\n",
" 'INTPTLONG'],\n",
" dtype='object')"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.columns"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"There are 29514 cities and towns in this database.\n"
]
}
],
"source": [
"print('There are',len(df),'cities and towns in this database.')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's get just the cities with > 250K population. Then we'll display a map of the USA with a marker for each of those cities using Folium."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"big250 = df[['NAME', 'POP10', 'INTPTLAT', 'INTPTLONG']][df.POP10>250000].sort_values('POP10', ascending=False)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3VucGtnLmNvbS9sZWFmbGV0QDEuMC4xL2Rpc3QvbGVhZmxldC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS4xMS4xL2pxdWVyeS5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2pzL2Jvb3RzdHJhcC5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4wLjAvbGVhZmxldC5tYXJrZXJjbHVzdGVyLXNyYy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzEuMC4wL2xlYWZsZXQubWFya2VyY2x1c3Rlci5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vdW5wa2cuY29tL2xlYWZsZXRAMS4wLjEvZGlzdC9sZWFmbGV0LmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4wLjAvTWFya2VyQ2x1c3Rlci5EZWZhdWx0LmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzEuMC4wL01hcmtlckNsdXN0ZXIuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2dpdC5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIiAvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTAgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIHNvdXRoV2VzdCA9IEwubGF0TG5nKC05MCwgLTE4MCk7CiAgICAgICAgICAgICAgICB2YXIgbm9ydGhFYXN0ID0gTC5sYXRMbmcoOTAsIDE4MCk7CiAgICAgICAgICAgICAgICB2YXIgYm91bmRzID0gTC5sYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTAgPSBMLm1hcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NlbnRlcjogWzMwLC05N10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9hZjk2NjZjMTljNWE0MTE1YjRmZDY3MmFhYzAwMzIwZCA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RlcnJhaW4ve3p9L3t4fS97eX0uanBnJywKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtYXhab29tOiAxOCwKICAgICAgICAgICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNXb3JsZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgbm9XcmFwOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbjogJ01hcCB0aWxlcyBieSA8YSBocmVmPSJodHRwOi8vc3RhbWVuLmNvbSI+U3RhbWVuIERlc2lnbjwvYT4sIHVuZGVyIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMCI+Q0MgQlkgMy4wPC9hPi4gRGF0YSBieSA8YSBocmVmPSJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmciPk9wZW5TdHJlZXRNYXA8L2E+LCB1bmRlciA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8zLjAiPkNDIEJZIFNBPC9hPi4nLAogICAgICAgICAgICAgICAgICAgIGRldGVjdFJldGluYTogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CgogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzA2MTNhYzMzMDI0NjQ1ODdiMjY0ZDZkNWEzN2VkNzBiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjY0Mjc0LC03My45Mzg1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzAwNWU5MGQ1MDliNGYzYTk3OTZjZjcxOGE4NmU4ZGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWUxMDA2NDE1ZWE3NDJjMzhjOGMwZDAzNGZjZDQzMDcgPSAkKCc8ZGl2IGlkPSJodG1sXzFlMTAwNjQxNWVhNzQyYzM4YzhjMGQwMzRmY2Q0MzA3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgWW9yayBjaXR5IHBvcDo4MTc1MTMzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMDA1ZTkwZDUwOWI0ZjNhOTc5NmNmNzE4YTg2ZThkZS5zZXRDb250ZW50KGh0bWxfMWUxMDA2NDE1ZWE3NDJjMzhjOGMwZDAzNGZjZDQzMDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wNjEzYWMzMzAyNDY0NTg3YjI2NGQ2ZDVhMzdlZDcwYi5iaW5kUG9wdXAocG9wdXBfYzAwNWU5MGQ1MDliNGYzYTk3OTZjZjcxOGE4NmU4ZGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTdhNTk0MTYwMjc2NGEwM2FhYjdlYjRhNzU1YjczY2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNC4wMTkzOTQsLTExOC40MTA4MjVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83YTcxYWFmODM2N2M0OGU1OTAyYmYzMTJmMTcxNjJjZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MTI1ODBiZDNiM2Y0ODI4ODk0OGFhNDQ4NjM0ODM3YiA9ICQoJzxkaXYgaWQ9Imh0bWxfOTEyNTgwYmQzYjNmNDgyODg5NDhhYTQ0ODYzNDgzN2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxvcyBBbmdlbGVzIGNpdHkgcG9wOjM3OTI2MjE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdhNzFhYWY4MzY3YzQ4ZTU5MDJiZjMxMmYxNzE2MmNmLnNldENvbnRlbnQoaHRtbF85MTI1ODBiZDNiM2Y0ODI4ODk0OGFhNDQ4NjM0ODM3Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE3YTU5NDE2MDI3NjRhMDNhYWI3ZWI0YTc1NWI3M2NiLmJpbmRQb3B1cChwb3B1cF83YTcxYWFmODM2N2M0OGU1OTAyYmYzMTJmMTcxNjJjZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wYTY0MDFkZWRhM2Q0OWFkYmVkZTJmZWUxZGVmYmZjMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjgzNzU1MSwtODcuNjgxODQ0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmNlM2MwZDMzZmIxNDViMjg4NzVlZjgzMWUyMGIzMzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmIyNGEzMTFkNjIzNDk0MTllOTg1ODE4ZTNhMGNlYWQgPSAkKCc8ZGl2IGlkPSJodG1sXzJiMjRhMzExZDYyMzQ5NDE5ZTk4NTgxOGUzYTBjZWFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGljYWdvIGNpdHkgcG9wOjI2OTU1OTg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJjZTNjMGQzM2ZiMTQ1YjI4ODc1ZWY4MzFlMjBiMzMxLnNldENvbnRlbnQoaHRtbF8yYjI0YTMxMWQ2MjM0OTQxOWU5ODU4MThlM2EwY2VhZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBhNjQwMWRlZGEzZDQ5YWRiZWRlMmZlZTFkZWZiZmMwLmJpbmRQb3B1cChwb3B1cF8yY2UzYzBkMzNmYjE0NWIyODg3NWVmODMxZTIwYjMzMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83YjNkOTllZjEzNmY0ZmIxYTViZTk1YmZlOWNiODcyMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzI5Ljc4MDQ3MTk5OTk5OTk5NiwtOTUuMzg2MzQyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjY2NjI2ZjQ3ZTE1NDRmNGI1MGJiMjI4YTUxNzRjZmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2ZlYmRmZDlkYTA4NDNlYTk0MGUxZTkzNTBhMzI0OWUgPSAkKCc8ZGl2IGlkPSJodG1sXzdmZWJkZmQ5ZGEwODQzZWE5NDBlMWU5MzUwYTMyNDllIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib3VzdG9uIGNpdHkgcG9wOjIwOTk0NTE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2NjYyNmY0N2UxNTQ0ZjRiNTBiYjIyOGE1MTc0Y2ZhLnNldENvbnRlbnQoaHRtbF83ZmViZGZkOWRhMDg0M2VhOTQwZTFlOTM1MGEzMjQ5ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdiM2Q5OWVmMTM2ZjRmYjFhNWJlOTViZmU5Y2I4NzIzLmJpbmRQb3B1cChwb3B1cF82NjY2MjZmNDdlMTU0NGY0YjUwYmIyMjhhNTE3NGNmYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lYWRkNzdhZGM5MTg0OThkOTQxNzQ3YjMyY2FhYzRkMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjAwOTM3NiwtNzUuMTMzMzQ2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTQxNDQyYzNjODI2NDg2Zjg4OTNmMTdiOGRhYmUxY2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDZhZTU2ZmUyNDEwNDgzN2JhNDFjMDkyNTM4NDA3NTMgPSAkKCc8ZGl2IGlkPSJodG1sXzQ2YWU1NmZlMjQxMDQ4MzdiYTQxYzA5MjUzODQwNzUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaGlsYWRlbHBoaWEgY2l0eSBwb3A6MTUyNjAwNjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTQxNDQyYzNjODI2NDg2Zjg4OTNmMTdiOGRhYmUxY2Yuc2V0Q29udGVudChodG1sXzQ2YWU1NmZlMjQxMDQ4MzdiYTQxYzA5MjUzODQwNzUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWFkZDc3YWRjOTE4NDk4ZDk0MTc0N2IzMmNhYWM0ZDEuYmluZFBvcHVwKHBvcHVwX2U0MTQ0MmMzYzgyNjQ4NmY4ODkzZjE3YjhkYWJlMWNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzUzZGUyOTU4NzkyMDQzYzM4MDEzMWJmY2IyNzFiNDQ2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNTcyMTYyLC0xMTIuMDg3OTY2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzliZjE5ZjBlNjJhNGM0ODgyZTczNjcwMTQ5NGI1ODIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjcxNTM5MWRjMzllNDJmMzgyYzFlZGZiNWZkZTBlOWUgPSAkKCc8ZGl2IGlkPSJodG1sXzI3MTUzOTFkYzM5ZTQyZjM4MmMxZWRmYjVmZGUwZTllIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaG9lbml4IGNpdHkgcG9wOjE0NDU2MzI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc5YmYxOWYwZTYyYTRjNDg4MmU3MzY3MDE0OTRiNTgyLnNldENvbnRlbnQoaHRtbF8yNzE1MzkxZGMzOWU0MmYzODJjMWVkZmI1ZmRlMGU5ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUzZGUyOTU4NzkyMDQzYzM4MDEzMWJmY2IyNzFiNDQ2LmJpbmRQb3B1cChwb3B1cF83OWJmMTlmMGU2MmE0YzQ4ODJlNzM2NzAxNDk0YjU4Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hMGI4YzY0ZmYwYzc0MWNmOTYzZDFlMDhlMGZjMmI1YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzI5LjQ3MjQwMzAwMDAwMDAwMywtOTguNTI1MTQyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2U1ODZmYTMxZGM2NGI4Y2FjZDMwMmNjZjdkNGJjMjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmVmMjY1OWFhZjVlNGNlZThhN2Y3ODU1NWNiODFlNzAgPSAkKCc8ZGl2IGlkPSJodG1sXzJlZjI2NTlhYWY1ZTRjZWU4YTdmNzg1NTVjYjgxZTcwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TYW4gQW50b25pbyBjaXR5IHBvcDoxMzI3NDA3PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZTU4NmZhMzFkYzY0YjhjYWNkMzAyY2NmN2Q0YmMyMC5zZXRDb250ZW50KGh0bWxfMmVmMjY1OWFhZjVlNGNlZThhN2Y3ODU1NWNiODFlNzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hMGI4YzY0ZmYwYzc0MWNmOTYzZDFlMDhlMGZjMmI1YS5iaW5kUG9wdXAocG9wdXBfM2U1ODZmYTMxZGM2NGI4Y2FjZDMwMmNjZjdkNGJjMjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDgwN2ExZDY5ZmNlNDczOGIyYjkwNDE2YzZhN2M1MjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszMi44MTUzLC0xMTcuMTM0OTkzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWMyZTFlNmY2NDViNDRmMWFiYTQ0NDI1NjljYWQ3MzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDQ2OGI4N2FhOTQ3NDEzY2I0ZGQwNTFkNTVmZGM5ODEgPSAkKCc8ZGl2IGlkPSJodG1sXzA0NjhiODdhYTk0NzQxM2NiNGRkMDUxZDU1ZmRjOTgxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TYW4gRGllZ28gY2l0eSBwb3A6MTMwNzQwMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWMyZTFlNmY2NDViNDRmMWFiYTQ0NDI1NjljYWQ3Mzcuc2V0Q29udGVudChodG1sXzA0NjhiODdhYTk0NzQxM2NiNGRkMDUxZDU1ZmRjOTgxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDgwN2ExZDY5ZmNlNDczOGIyYjkwNDE2YzZhN2M1MjYuYmluZFBvcHVwKHBvcHVwXzljMmUxZTZmNjQ1YjQ0ZjFhYmE0NDQyNTY5Y2FkNzM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2I4MWQ1MDE4MmNiMDQ2ODdiNWViNGUwMmJhODU4YTYwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzIuNzk0MTc2LC05Ni43NjU1MDMwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MwYzMyN2MwZjA2NDQ4ZWQ5N2JiNWFlZDA1NGM0NTFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQzMzEyOTg0OWVkYTRkZTZhYjQ2YmMyMDc4YWQ1Yzk2ID0gJCgnPGRpdiBpZD0iaHRtbF80MzMxMjk4NDllZGE0ZGU2YWI0NmJjMjA3OGFkNWM5NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGFsbGFzIGNpdHkgcG9wOjExOTc4MTY8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MwYzMyN2MwZjA2NDQ4ZWQ5N2JiNWFlZDA1NGM0NTFlLnNldENvbnRlbnQoaHRtbF80MzMxMjk4NDllZGE0ZGU2YWI0NmJjMjA3OGFkNWM5Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I4MWQ1MDE4MmNiMDQ2ODdiNWViNGUwMmJhODU4YTYwLmJpbmRQb3B1cChwb3B1cF9jMGMzMjdjMGYwNjQ0OGVkOTdiYjVhZWQwNTRjNDUxZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81NjhlYjNhMzg5ODc0NjRiODJmMzY4ODM0ZGNiZTg4NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjI5Njg2NywtMTIxLjgxOTMwNjAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjFiZGU2YTMzYjM1NDVhYThjZGQ4ZWEzMzIyYWQ1YTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDFhNGJlOTQ4ODU5NGU4YmI4NmE1MDBhZDQxOGZmY2IgPSAkKCc8ZGl2IGlkPSJodG1sXzAxYTRiZTk0ODg1OTRlOGJiODZhNTAwYWQ0MThmZmNiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TYW4gSm9zZSBjaXR5IHBvcDo5NDU5NDI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYxYmRlNmEzM2IzNTQ1YWE4Y2RkOGVhMzMyMmFkNWEzLnNldENvbnRlbnQoaHRtbF8wMWE0YmU5NDg4NTk0ZThiYjg2YTUwMGFkNDE4ZmZjYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU2OGViM2EzODk4NzQ2NGI4MmYzNjg4MzRkY2JlODg3LmJpbmRQb3B1cChwb3B1cF82MWJkZTZhMzNiMzU0NWFhOGNkZDhlYTMzMjJhZDVhMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83NDM0NDE1NjgyYjk0MmU4YTEwM2Y2YjE3YjJiMzE0NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzMwLjMzNzAxOSwtODEuNjYxMzAyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzEzNDhiOTQ0ZDM0NDQ3MDg5Njc5ZjBiZTFiNTBiZWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2JkYTFlOGI4N2MyNDZkZDgzNmZhMzBhNWI0M2M3ZjIgPSAkKCc8ZGl2IGlkPSJodG1sXzdiZGExZThiODdjMjQ2ZGQ4MzZmYTMwYTViNDNjN2YyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYWNrc29udmlsbGUgY2l0eSBwb3A6ODIxNzg0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMTM0OGI5NDRkMzQ0NDcwODk2NzlmMGJlMWI1MGJlZC5zZXRDb250ZW50KGh0bWxfN2JkYTFlOGI4N2MyNDZkZDgzNmZhMzBhNWI0M2M3ZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83NDM0NDE1NjgyYjk0MmU4YTEwM2Y2YjE3YjJiMzE0NC5iaW5kUG9wdXAocG9wdXBfMzEzNDhiOTQ0ZDM0NDQ3MDg5Njc5ZjBiZTFiNTBiZWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTNhMGEyN2UwNDVhNDgyNjk1NWI3ZTY3NTU0NTljOGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS43NzY2NjQwMDAwMDAwMDQsLTg2LjE0NTkzNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZkOTFjNWY4NjQxYTRhYzM5ZDlmMjA5NmU3ODEwMjMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM3NTgyNTIxNDMyOTRiOTNhZWZiMDFjNWYzNDlmZThhID0gJCgnPGRpdiBpZD0iaHRtbF8zNzU4MjUyMTQzMjk0YjkzYWVmYjAxYzVmMzQ5ZmU4YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SW5kaWFuYXBvbGlzIGNpdHkgKGJhbGFuY2UpIHBvcDo4MjA0NDU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZkOTFjNWY4NjQxYTRhYzM5ZDlmMjA5NmU3ODEwMjMyLnNldENvbnRlbnQoaHRtbF8zNzU4MjUyMTQzMjk0YjkzYWVmYjAxYzVmMzQ5ZmU4YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkzYTBhMjdlMDQ1YTQ4MjY5NTViN2U2NzU1NDU5YzhiLmJpbmRQb3B1cChwb3B1cF82ZDkxYzVmODY0MWE0YWMzOWQ5ZjIwOTZlNzgxMDIzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMTdjMjY3N2I5NDg0YzNlYWJiNzI1NTBhYTJhYzlhYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyNzIzOTAwMDAwMDAwNCwtMTIzLjAzMjIyOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzliMTkxZDUxYmRhMTRjMjE4NWQ5YTQ2M2FjY2Y0NjZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFkYjQxOWEyMDZmYzRhZmU4OGI2N2E0MGNiNmVlZmY5ID0gJCgnPGRpdiBpZD0iaHRtbF8xZGI0MTlhMjA2ZmM0YWZlODhiNjdhNDBjYjZlZWZmOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2FuIEZyYW5jaXNjbyBjaXR5IHBvcDo4MDUyMzU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzliMTkxZDUxYmRhMTRjMjE4NWQ5YTQ2M2FjY2Y0NjZmLnNldENvbnRlbnQoaHRtbF8xZGI0MTlhMjA2ZmM0YWZlODhiNjdhNDBjYjZlZWZmOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2UxN2MyNjc3Yjk0ODRjM2VhYmI3MjU1MGFhMmFjOWFhLmJpbmRQb3B1cChwb3B1cF85YjE5MWQ1MWJkYTE0YzIxODVkOWE0NjNhY2NmNDY2Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81YWIwZDUwZGJhNzE0OWQzYjNlYTA4OGY3ZWJlZGY3ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzMwLjMwNzE4MiwtOTcuNzU1OTk2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzE3YzgyODFkYmNiNDRmMjk2ZTBjYmUyNjQ3ZDExNWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzM0N2IyZWYwY2Y3NDZmNjlkZTRmMjNhYzc4ZGY1NjQgPSAkKCc8ZGl2IGlkPSJodG1sXzMzNDdiMmVmMGNmNzQ2ZjY5ZGU0ZjIzYWM3OGRmNTY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BdXN0aW4gY2l0eSBwb3A6NzkwMzkwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMTdjODI4MWRiY2I0NGYyOTZlMGNiZTI2NDdkMTE1Yy5zZXRDb250ZW50KGh0bWxfMzM0N2IyZWYwY2Y3NDZmNjlkZTRmMjNhYzc4ZGY1NjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81YWIwZDUwZGJhNzE0OWQzYjNlYTA4OGY3ZWJlZGY3Zi5iaW5kUG9wdXAocG9wdXBfYzE3YzgyODFkYmNiNDRmMjk2ZTBjYmUyNjQ3ZDExNWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDdhZTU1YjQ5MTEyNDBlMTkxY2JjNTM4YjZhZmUxMDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOS45ODQ3OTksLTgyLjk4NTA0Mzk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDhlNDU3NmJhOGFhNDBhYmIyNzEwZGNjYjRlMWMzZWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjE4MTQ4NTdlMzdjNDJjOWIwNmMwYWM2NTllNzBlYmQgPSAkKCc8ZGl2IGlkPSJodG1sXzIxODE0ODU3ZTM3YzQyYzliMDZjMGFjNjU5ZTcwZWJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db2x1bWJ1cyBjaXR5IHBvcDo3ODcwMzM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA4ZTQ1NzZiYThhYTQwYWJiMjcxMGRjY2I0ZTFjM2VlLnNldENvbnRlbnQoaHRtbF8yMTgxNDg1N2UzN2M0MmM5YjA2YzBhYzY1OWU3MGViZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Q3YWU1NWI0OTExMjQwZTE5MWNiYzUzOGI2YWZlMTA1LmJpbmRQb3B1cChwb3B1cF8wOGU0NTc2YmE4YWE0MGFiYjI3MTBkY2NiNGUxYzNlZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xMThmZDZlZDNlZDM0M2YyYmI4OWUwNDVjYmM0ZDE1YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzMyLjc3OTU0MiwtOTcuMzQ2MzM1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjY5YmMwNGQwNjFkNDM0YmJmYmViMDA2YzY5MjdiZTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTk4YTA0YjJlZTg2NGFjMGE4N2U5ZmVlZWE3MTliOTQgPSAkKCc8ZGl2IGlkPSJodG1sXzE5OGEwNGIyZWU4NjRhYzBhODdlOWZlZWVhNzE5Yjk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3J0IFdvcnRoIGNpdHkgcG9wOjc0MTIwNjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjY5YmMwNGQwNjFkNDM0YmJmYmViMDA2YzY5MjdiZTMuc2V0Q29udGVudChodG1sXzE5OGEwNGIyZWU4NjRhYzBhODdlOWZlZWVhNzE5Yjk0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTE4ZmQ2ZWQzZWQzNDNmMmJiODllMDQ1Y2JjNGQxNWIuYmluZFBvcHVwKHBvcHVwX2I2OWJjMDRkMDYxZDQzNGJiZmJlYjAwNmM2OTI3YmUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2ZmYTQ0NTI0ZmM4ZTQ4YzdhODYxODZjNzI3YTc2MmY2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjA4NzA3MDAwMDAwMDA0LC04MC44MzA3MzkwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NlNTA2MmE0ODFhNDRiYzI5MjNkNTczMDhjMDMwZTE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdmNmI2NmFiOWRkYTQ3MDBiMmQ0Yjg2MTBhZDY2OTFiID0gJCgnPGRpdiBpZD0iaHRtbF83ZjZiNjZhYjlkZGE0NzAwYjJkNGI4NjEwYWQ2NjkxYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hhcmxvdHRlIGNpdHkgcG9wOjczMTQyNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2U1MDYyYTQ4MWE0NGJjMjkyM2Q1NzMwOGMwMzBlMTQuc2V0Q29udGVudChodG1sXzdmNmI2NmFiOWRkYTQ3MDBiMmQ0Yjg2MTBhZDY2OTFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZmZhNDQ1MjRmYzhlNDhjN2E4NjE4NmM3MjdhNzYyZjYuYmluZFBvcHVwKHBvcHVwX2NlNTA2MmE0ODFhNDRiYzI5MjNkNTczMDhjMDMwZTE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzBkMTBiYzQwMTZhMjRjODhhMjhiMDZhMjYyY2RjNWQ1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMzgzMDM3LC04My4xMDIyMzddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZTc3NTU4MTVmZDQ0NGYwYTZiMzNlNTYyNjQ2ZGEwMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MmMwYzM5MWFhYWQ0YTZkYjhmMWE4NTllNjk2OTY1OSA9ICQoJzxkaXYgaWQ9Imh0bWxfODJjMGMzOTFhYWFkNGE2ZGI4ZjFhODU5ZTY5Njk2NTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRldHJvaXQgY2l0eSBwb3A6NzEzNzc3PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZTc3NTU4MTVmZDQ0NGYwYTZiMzNlNTYyNjQ2ZGEwMS5zZXRDb250ZW50KGh0bWxfODJjMGMzOTFhYWFkNGE2ZGI4ZjFhODU5ZTY5Njk2NTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wZDEwYmM0MDE2YTI0Yzg4YTI4YjA2YTI2MmNkYzVkNS5iaW5kUG9wdXAocG9wdXBfYmU3NzU1ODE1ZmQ0NDRmMGE2YjMzZTU2MjY0NmRhMDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOThlNGQzMDlhNDM0NGRjYWI2ZDRiZjg0M2RkZWMzMWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszMS44NDgzNTk5OTk5OTk5OTYsLTEwNi40MjY5NzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNDNkMjY1YTU3NDU0ZTkxYWQxZTlmZjNlZjE0NjM4NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kODE0NmE5NzQ1MmE0ZWQ3ODA1Mjk1NjIwOTM1MjA2OCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDgxNDZhOTc0NTJhNGVkNzgwNTI5NTYyMDkzNTIwNjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVsIFBhc28gY2l0eSBwb3A6NjQ5MTIxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNDNkMjY1YTU3NDU0ZTkxYWQxZTlmZjNlZjE0NjM4Ny5zZXRDb250ZW50KGh0bWxfZDgxNDZhOTc0NTJhNGVkNzgwNTI5NTYyMDkzNTIwNjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85OGU0ZDMwOWE0MzQ0ZGNhYjZkNGJmODQzZGRlYzMxZC5iaW5kUG9wdXAocG9wdXBfMDQzZDI2NWE1NzQ1NGU5MWFkMWU5ZmYzZWYxNDYzODcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmE4Zjc5MzVjM2YwNDc1Mjk1ZDBiNGI1YWY2MjVkOGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4xMDM1NDMsLTg5Ljk3ODQ5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzExMzFiNjRhZWQxYzQ4Mjc4ODcwN2NiNGZkZGIxZmQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgwZTAzMDRlZTAxMTQxOTZiMDdlMjVjNjlkYzhjMDE2ID0gJCgnPGRpdiBpZD0iaHRtbF84MGUwMzA0ZWUwMTE0MTk2YjA3ZTI1YzY5ZGM4YzAxNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWVtcGhpcyBjaXR5IHBvcDo2NDY4ODk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzExMzFiNjRhZWQxYzQ4Mjc4ODcwN2NiNGZkZGIxZmQ2LnNldENvbnRlbnQoaHRtbF84MGUwMzA0ZWUwMTE0MTk2YjA3ZTI1YzY5ZGM4YzAxNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzJhOGY3OTM1YzNmMDQ3NTI5NWQwYjRiNWFmNjI1ZDhhLmJpbmRQb3B1cChwb3B1cF8xMTMxYjY0YWVkMWM0ODI3ODg3MDdjYjRmZGRiMWZkNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80YzlkZTM3YzA3OTI0ZjhjODc5NjA5OWJlMGY3MWIwMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjMwMDIxMywtNzYuNjEwNTE2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGI5ZjRlMzllZjczNDg0ZGExNGNhMGI4M2U4OWQ5MWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzVmMjViMTYzN2JkNDliMWFmODc5NWRiMmVhNDllMGIgPSAkKCc8ZGl2IGlkPSJodG1sXzM1ZjI1YjE2MzdiZDQ5YjFhZjg3OTVkYjJlYTQ5ZTBiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYWx0aW1vcmUgY2l0eSBwb3A6NjIwOTYxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYjlmNGUzOWVmNzM0ODRkYTE0Y2EwYjgzZTg5ZDkxZi5zZXRDb250ZW50KGh0bWxfMzVmMjViMTYzN2JkNDliMWFmODc5NWRiMmVhNDllMGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80YzlkZTM3YzA3OTI0ZjhjODc5NjA5OWJlMGY3MWIwMC5iaW5kUG9wdXAocG9wdXBfZGI5ZjRlMzllZjczNDg0ZGExNGNhMGI4M2U4OWQ5MWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjNiOGMyZmVkZDllNGZjNjliMzgwOThiNWM0YTczMWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi4zMzE5NTk5OTk5OTk5OTUsLTcxLjAyMDE3M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVlZDU4NzBlMWVmOTQ5OThiMDhkYWE0YTczOWNmZTE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RhZjdhMTdlMDI1NDRiYTA4YTZmMmIyODE0NTNjMzRjID0gJCgnPGRpdiBpZD0iaHRtbF9kYWY3YTE3ZTAyNTQ0YmEwOGE2ZjJiMjgxNDUzYzM0YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9zdG9uIGNpdHkgcG9wOjYxNzU5NDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWVkNTg3MGUxZWY5NDk5OGIwOGRhYTRhNzM5Y2ZlMTguc2V0Q29udGVudChodG1sX2RhZjdhMTdlMDI1NDRiYTA4YTZmMmIyODE0NTNjMzRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjNiOGMyZmVkZDllNGZjNjliMzgwOThiNWM0YTczMWIuYmluZFBvcHVwKHBvcHVwXzVlZDU4NzBlMWVmOTQ5OThiMDhkYWE0YTczOWNmZTE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2RiZjNlMDFlN2M1NTRmZDliZmU2NjM0YzQwZWZjN2RlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNjIwNDk5LC0xMjIuMzUwODc2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGU2NmYyY2RlZjRjNDkxNTlkYTc2MGE0ZGNhYTI0M2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWZkMjNlYjEyYTc0NGM4YmI5NGM4OTYzNmRjYWFjZGUgPSAkKCc8ZGl2IGlkPSJodG1sX2VmZDIzZWIxMmE3NDRjOGJiOTRjODk2MzZkY2FhY2RlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TZWF0dGxlIGNpdHkgcG9wOjYwODY2MDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGU2NmYyY2RlZjRjNDkxNTlkYTc2MGE0ZGNhYTI0M2Muc2V0Q29udGVudChodG1sX2VmZDIzZWIxMmE3NDRjOGJiOTRjODk2MzZkY2FhY2RlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGJmM2UwMWU3YzU1NGZkOWJmZTY2MzRjNDBlZmM3ZGUuYmluZFBvcHVwKHBvcHVwXzRlNjZmMmNkZWY0YzQ5MTU5ZGE3NjBhNGRjYWEyNDNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2NhNmZjNmI3NjdiZDRlZDliNDMxNWM1MDNkZWQ0YjE3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguOTA0MTQ5LC03Ny4wMTcwOTRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ODQ0OTk3MDdlZTg0MDdmOTA0MDE0MGY1YzUzY2JhMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYzMxMDYyYjJkOGQ0NTQ1OWYwMTRlZTYxNzYzOTcxOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmMzMTA2MmIyZDhkNDU0NTlmMDE0ZWU2MTc2Mzk3MTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldhc2hpbmd0b24gY2l0eSBwb3A6NjAxNzIzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ODQ0OTk3MDdlZTg0MDdmOTA0MDE0MGY1YzUzY2JhMi5zZXRDb250ZW50KGh0bWxfYmMzMTA2MmIyZDhkNDU0NTlmMDE0ZWU2MTc2Mzk3MTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jYTZmYzZiNzY3YmQ0ZWQ5YjQzMTVjNTAzZGVkNGIxNy5iaW5kUG9wdXAocG9wdXBfNDg0NDk5NzA3ZWU4NDA3ZjkwNDAxNDBmNWM1M2NiYTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzE5MDcwMjE4MmVlNGYwMGE2MjRlZGE2NmRhZTUyZGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNi4xNzE4LC04Ni43ODUwMDJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYTcyYjE0YmQ2YmM0YWNlOTliNGY3NjRlZjNhNTZjNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZmVjMTkwZTg5Yjg0OWMyYjRjMjRmMGI2M2EwZjE5ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfY2ZlYzE5MGU4OWI4NDljMmI0YzI0ZjBiNjNhMGYxOWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5hc2h2aWxsZS1EYXZpZHNvbiBtZXRyb3BvbGl0YW4gZ292ZXJubWVudCAoYmFsYW5jZSkgcG9wOjYwMTIyMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGE3MmIxNGJkNmJjNGFjZTk5YjRmNzY0ZWYzYTU2Yzcuc2V0Q29udGVudChodG1sX2NmZWMxOTBlODliODQ5YzJiNGMyNGYwYjYzYTBmMTlmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzE5MDcwMjE4MmVlNGYwMGE2MjRlZGE2NmRhZTUyZGIuYmluZFBvcHVwKHBvcHVwX2RhNzJiMTRiZDZiYzRhY2U5OWI0Zjc2NGVmM2E1NmM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzYxYWRlYTQ4ZWJlOTQzMGY4MjJmNDJjYjYwMDM3ZmE2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNzYxODQ5LC0xMDQuODgwNjI1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzdmYzViMjllYWE2NDU1M2E1ZTNhZDg2NGIzOTBiOTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGUwMWU2OTNhYWZhNDBiZmEwZWYzYWMyNmU2YjM2Y2QgPSAkKCc8ZGl2IGlkPSJodG1sXzhlMDFlNjkzYWFmYTQwYmZhMGVmM2FjMjZlNmIzNmNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZW52ZXIgY2l0eSBwb3A6NjAwMTU4PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jN2ZjNWIyOWVhYTY0NTUzYTVlM2FkODY0YjM5MGI5Ni5zZXRDb250ZW50KGh0bWxfOGUwMWU2OTNhYWZhNDBiZmEwZWYzYWMyNmU2YjM2Y2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82MWFkZWE0OGViZTk0MzBmODIyZjQyY2I2MDAzN2ZhNi5iaW5kUG9wdXAocG9wdXBfYzdmYzViMjllYWE2NDU1M2E1ZTNhZDg2NGIzOTBiOTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDE4ODgxZGFlNzg1NDA5MTk4N2MxMjBmMDk0NTFjYWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC4xNzgwNzcsLTg1LjY2NjcwOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QxYmVkZmM3NjM5MzRkODVhMTAyY2EzN2ZhZDBjNjc4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRjN2U1ZmVmNWI2YjRlMTFiMDlmOTNlMzZhNGVjZWFjID0gJCgnPGRpdiBpZD0iaHRtbF80YzdlNWZlZjViNmI0ZTExYjA5ZjkzZTM2YTRlY2VhYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG91aXN2aWxsZS9KZWZmZXJzb24gQ291bnR5IG1ldHJvIGdvdmVybm1lbnQgKGJhbGFuY2UpIHBvcDo1OTczMzc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QxYmVkZmM3NjM5MzRkODVhMTAyY2EzN2ZhZDBjNjc4LnNldENvbnRlbnQoaHRtbF80YzdlNWZlZjViNmI0ZTExYjA5ZjkzZTM2YTRlY2VhYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQxODg4MWRhZTc4NTQwOTE5ODdjMTIwZjA5NDUxY2FiLmJpbmRQb3B1cChwb3B1cF9kMWJlZGZjNzYzOTM0ZDg1YTEwMmNhMzdmYWQwYzY3OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hZDY5ZWI1Nzk1NmM0OGRmOTYyYzVlMDZiZTM5ZDQxMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjA2MzM0OCwtODcuOTY2Njk1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmQ3MDkwNmIxZDZjNDFhMDkwNDliN2RlOTMyOTliMmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzUxZDVkNDU1YTIxNDEwOTljNzA1N2JiNWZlNWY5NDcgPSAkKCc8ZGl2IGlkPSJodG1sXzc1MWQ1ZDQ1NWEyMTQxMDk5YzcwNTdiYjVmZTVmOTQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWx3YXVrZWUgY2l0eSBwb3A6NTk0ODMzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZDcwOTA2YjFkNmM0MWEwOTA0OWI3ZGU5MzI5OWIyYy5zZXRDb250ZW50KGh0bWxfNzUxZDVkNDU1YTIxNDEwOTljNzA1N2JiNWZlNWY5NDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hZDY5ZWI1Nzk1NmM0OGRmOTYyYzVlMDZiZTM5ZDQxMS5iaW5kUG9wdXAocG9wdXBfMmQ3MDkwNmIxZDZjNDFhMDkwNDliN2RlOTMyOTliMmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDljZjE1MzNhMzg2NDdlMmE5Yjk2ZWMxNGRhYWI0YjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0NS41MzY5NTEsLTEyMi42NDk5NzFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMTE5ZDExNDYxN2Y0MzY3YjhmNDI3OTlhYTk4OGY0YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOWJiZGUxZDlhYTg0MzllYWUwM2M2MTExODhhYTUzMSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTliYmRlMWQ5YWE4NDM5ZWFlMDNjNjExMTg4YWE1MzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvcnRsYW5kIGNpdHkgcG9wOjU4Mzc3NjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjExOWQxMTQ2MTdmNDM2N2I4ZjQyNzk5YWE5ODhmNGIuc2V0Q29udGVudChodG1sX2E5YmJkZTFkOWFhODQzOWVhZTAzYzYxMTE4OGFhNTMxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDljZjE1MzNhMzg2NDdlMmE5Yjk2ZWMxNGRhYWI0YjguYmluZFBvcHVwKHBvcHVwX2YxMTlkMTE0NjE3ZjQzNjdiOGY0Mjc5OWFhOTg4ZjRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQyNWY4MmE0MzNhMDQ2MmM4ZmM1YTFlMTkyM2RlMGNmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzYuMjI3NzEyLC0xMTUuMjY0MDQ1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmYzYzI4NDRjZTY1NDU3ZGE3Mzc1MGNlYjE5NzYyMzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTNhMjdlNTA5Zjg4NDlkY2I2MmI1NjE2MjUxZWE1NGQgPSAkKCc8ZGl2IGlkPSJodG1sXzUzYTI3ZTUwOWY4ODQ5ZGNiNjJiNTYxNjI1MWVhNTRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXMgVmVnYXMgY2l0eSBwb3A6NTgzNzU2PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZjNjMjg0NGNlNjU0NTdkYTczNzUwY2ViMTk3NjIzNC5zZXRDb250ZW50KGh0bWxfNTNhMjdlNTA5Zjg4NDlkY2I2MmI1NjE2MjUxZWE1NGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80MjVmODJhNDMzYTA0NjJjOGZjNWExZTE5MjNkZTBjZi5iaW5kUG9wdXAocG9wdXBfYmYzYzI4NDRjZTY1NDU3ZGE3Mzc1MGNlYjE5NzYyMzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTVhOTI0NzhmNGY1NDBhMTg4NzFmNmZjMWRkMWY4YjEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS40NjcwNzksLTk3LjUxMzY1N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViMTc5NGQ5NzEwZDQ1MTlhMDZkZDliYTdhOWVlOWU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2ZmExYzE5MzM5MDQ3MzU4MGU2MTNjY2U4ZGU4M2FkID0gJCgnPGRpdiBpZD0iaHRtbF9iNmZhMWMxOTMzOTA0NzM1ODBlNjEzY2NlOGRlODNhZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T2tsYWhvbWEgQ2l0eSBjaXR5IHBvcDo1Nzk5OTk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ViMTc5NGQ5NzEwZDQ1MTlhMDZkZDliYTdhOWVlOWU0LnNldENvbnRlbnQoaHRtbF9iNmZhMWMxOTMzOTA0NzM1ODBlNjEzY2NlOGRlODNhZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE1YTkyNDc4ZjRmNTQwYTE4ODcxZjZmYzFkZDFmOGIxLmJpbmRQb3B1cChwb3B1cF9lYjE3OTRkOTcxMGQ0NTE5YTA2ZGQ5YmE3YTllZTllNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mNDcyMWRiMDc1NDI0ZTIwODU2OTgzY2FhZjIyMGM0MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjEwNTU1MiwtMTA2LjY0NzM4Nzk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGY2YTdlOTMyOGUyNDk1MmEwYzdjYTYzYmVkZGZkMzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDMxZjdhMWMwZTkxNDRiOWFmYzdkMGE4MDFlNzQ3MDkgPSAkKCc8ZGl2IGlkPSJodG1sXzAzMWY3YTFjMGU5MTQ0YjlhZmM3ZDBhODAxZTc0NzA5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbGJ1cXVlcnF1ZSBjaXR5IHBvcDo1NDU4NTI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RmNmE3ZTkzMjhlMjQ5NTJhMGM3Y2E2M2JlZGRmZDM5LnNldENvbnRlbnQoaHRtbF8wMzFmN2ExYzBlOTE0NGI5YWZjN2QwYTgwMWU3NDcwOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y0NzIxZGIwNzU0MjRlMjA4NTY5ODNjYWFmMjIwYzQwLmJpbmRQb3B1cChwb3B1cF9kZjZhN2U5MzI4ZTI0OTUyYTBjN2NhNjNiZWRkZmQzOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85MjQxNDNkZmFkYzI0MDE5ODJiOWIxYzY1OGFlOGMzNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzMyLjE1NDI4OSwtMTEwLjg3MTA2MjAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmFhZGQ4ZGNiMmM3NGY4ODkzNGJmZmUyZDQwYTE0YzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzY4N2QzMGJhMDJlNDllOGE0NDQzNjIyZmEzZGFjYTUgPSAkKCc8ZGl2IGlkPSJodG1sXzc2ODdkMzBiYTAyZTQ5ZThhNDQ0MzYyMmZhM2RhY2E1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWNzb24gY2l0eSBwb3A6NTIwMTE2PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YWFkZDhkY2IyYzc0Zjg4OTM0YmZmZTJkNDBhMTRjOS5zZXRDb250ZW50KGh0bWxfNzY4N2QzMGJhMDJlNDllOGE0NDQzNjIyZmEzZGFjYTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85MjQxNDNkZmFkYzI0MDE5ODJiOWIxYzY1OGFlOGMzNy5iaW5kUG9wdXAocG9wdXBfNmFhZGQ4ZGNiMmM3NGY4ODkzNGJmZmUyZDQwYTE0YzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDM1ZDVlMWJjNzY1NGQyZjg3NTU4YmYwZTA4ZWNhNzQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNi43ODI2NzQsLTExOS43OTQ0OTE5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk5ZGVjNzFjOTI3ZjRjOTBiYmMzZWRjN2JlZTY3NWMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA2YmRiZDBkZGVkMzRmOWY5MjdlZjNiODZlNDBkMmU1ID0gJCgnPGRpdiBpZD0iaHRtbF8wNmJkYmQwZGRlZDM0ZjlmOTI3ZWYzYjg2ZTQwZDJlNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnJlc25vIGNpdHkgcG9wOjQ5NDY2NTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTlkZWM3MWM5MjdmNGM5MGJiYzNlZGM3YmVlNjc1YzMuc2V0Q29udGVudChodG1sXzA2YmRiZDBkZGVkMzRmOWY5MjdlZjNiODZlNDBkMmU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDM1ZDVlMWJjNzY1NGQyZjg3NTU4YmYwZTA4ZWNhNzQuYmluZFBvcHVwKHBvcHVwXzk5ZGVjNzFjOTI3ZjRjOTBiYmMzZWRjN2JlZTY3NWMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2FhNmNiNWViYjIyYTQzYzY4YWEzMTM3YzllMmMyYjQxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguNTY2NTkyLC0xMjEuNDY4NjMyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGNiZDA4ZTI5ZjQ0NDM5MmJiMmQ0M2ZhMzZmNGUxZTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDM0N2E4YWRmMjFhNDQ4NjgxY2RlMDU3NGZmYTNjN2QgPSAkKCc8ZGl2IGlkPSJodG1sX2QzNDdhOGFkZjIxYTQ0ODY4MWNkZTA1NzRmZmEzYzdkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TYWNyYW1lbnRvIGNpdHkgcG9wOjQ2NjQ4ODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGNiZDA4ZTI5ZjQ0NDM5MmJiMmQ0M2ZhMzZmNGUxZTQuc2V0Q29udGVudChodG1sX2QzNDdhOGFkZjIxYTQ0ODY4MWNkZTA1NzRmZmEzYzdkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYWE2Y2I1ZWJiMjJhNDNjNjhhYTMxMzdjOWUyYzJiNDEuYmluZFBvcHVwKHBvcHVwX2RjYmQwOGUyOWY0NDQzOTJiYjJkNDNmYTM2ZjRlMWU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzgzM2RjODJkYjhhNzRjOTU4ODc4ODQ5NGUzZmJkYzNiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuODA5MTAyLC0xMTguMTU1MzI3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2YxZTQxYThkMmFhNGI5ZDkxNmNiMWNlY2QyODM2NzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTUyY2YyNzMwMDhhNDFjNTgwOTBkNGU5NDBkMDExYjEgPSAkKCc8ZGl2IGlkPSJodG1sXzU1MmNmMjczMDA4YTQxYzU4MDkwZDRlOTQwZDAxMWIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Mb25nIEJlYWNoIGNpdHkgcG9wOjQ2MjI1NzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2YxZTQxYThkMmFhNGI5ZDkxNmNiMWNlY2QyODM2NzIuc2V0Q29udGVudChodG1sXzU1MmNmMjczMDA4YTQxYzU4MDkwZDRlOTQwZDAxMWIxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODMzZGM4MmRiOGE3NGM5NTg4Nzg4NDk0ZTNmYmRjM2IuYmluZFBvcHVwKHBvcHVwXzdmMWU0MWE4ZDJhYTRiOWQ5MTZjYjFjZWNkMjgzNjcyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Y2ZTA0ZjMxM2I0ZDQ1ZmQ5NmEwMmFhYzA4MzkxMWQ5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuMTI1MjEyLC05NC41NTExMzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iN2MxZmY2NTc1NjM0OGQ5YmY4YTAyNzkxZTMzMTMyNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YTI0NGUxMzU4YTI0MGI0Yjc4YTYzMzQ5N2JjNjdhMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNWEyNDRlMTM1OGEyNDBiNGI3OGE2MzM0OTdiYzY3YTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkthbnNhcyBDaXR5IGNpdHkgcG9wOjQ1OTc4NzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjdjMWZmNjU3NTYzNDhkOWJmOGEwMjc5MWUzMzEzMjQuc2V0Q29udGVudChodG1sXzVhMjQ0ZTEzNThhMjQwYjRiNzhhNjMzNDk3YmM2N2EwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjZlMDRmMzEzYjRkNDVmZDk2YTAyYWFjMDgzOTExZDkuYmluZFBvcHVwKHBvcHVwX2I3YzFmZjY1NzU2MzQ4ZDliZjhhMDI3OTFlMzMxMzI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzIzNmQzMGEyMTI0MjQxOGI4MTYwNDJjNDlhOGFkNWZlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNDAxOTI2LC0xMTEuNzE3Mzc5MDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNjI0ZTMwMDFjMTc0M2NkYTFiOWM3NWM3YmJhZjIyNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NTQyMzMxNjIzZDY0MjdjODdiOTNhM2ViNmQ0MmM5NyA9ICQoJzxkaXYgaWQ9Imh0bWxfNTU0MjMzMTYyM2Q2NDI3Yzg3YjkzYTNlYjZkNDJjOTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1lc2EgY2l0eSBwb3A6NDM5MDQxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNjI0ZTMwMDFjMTc0M2NkYTFiOWM3NWM3YmJhZjIyNy5zZXRDb250ZW50KGh0bWxfNTU0MjMzMTYyM2Q2NDI3Yzg3YjkzYTNlYjZkNDJjOTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yMzZkMzBhMjEyNDI0MThiODE2MDQyYzQ5YThhZDVmZS5iaW5kUG9wdXAocG9wdXBfMzYyNGUzMDAxYzE3NDNjZGExYjljNzVjN2JiYWYyMjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDFmMTJlZWY3ZWI2NGY4MzlkMjQyMjc1MDUyOGZmZmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNi43NzkzMjIsLTc2LjAyNDAyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjZhNDcwNTQ1YzI4NDViMjgwNTk2ZTliZWJjMzRjMzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTkwOTA3YzU4MjAxNGM0NTlhZTlhNjZlZGY4YjNkMDYgPSAkKCc8ZGl2IGlkPSJodG1sX2U5MDkwN2M1ODIwMTRjNDU5YWU5YTY2ZWRmOGIzZDA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WaXJnaW5pYSBCZWFjaCBjaXR5IHBvcDo0Mzc5OTQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y2YTQ3MDU0NWMyODQ1YjI4MDU5NmU5YmViYzM0YzM2LnNldENvbnRlbnQoaHRtbF9lOTA5MDdjNTgyMDE0YzQ1OWFlOWE2NmVkZjhiM2QwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzAxZjEyZWVmN2ViNjRmODM5ZDI0MjI3NTA1MjhmZmZmLmJpbmRQb3B1cChwb3B1cF9mNmE0NzA1NDVjMjg0NWIyODA1OTZlOWJlYmMzNGMzNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zM2Y4ZDZlNGE4MjE0YTU1OTk5ZTc4NDk2ZTVkNWFmMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjc2MjkwOSwtODQuNDIyNjc1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTdkY2Y3NGIzZTNjNDY2NmEyZjUxMDNhN2NmNWVkODUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODExMzBhMjk4MmIwNDE3NmE1NzJkMmMwZmNjZmQ4NTAgPSAkKCc8ZGl2IGlkPSJodG1sXzgxMTMwYTI5ODJiMDQxNzZhNTcyZDJjMGZjY2ZkODUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BdGxhbnRhIGNpdHkgcG9wOjQyMDAwMzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTdkY2Y3NGIzZTNjNDY2NmEyZjUxMDNhN2NmNWVkODUuc2V0Q29udGVudChodG1sXzgxMTMwYTI5ODJiMDQxNzZhNTcyZDJjMGZjY2ZkODUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzNmOGQ2ZTRhODIxNGE1NTk5OWU3ODQ5NmU1ZDVhZjAuYmluZFBvcHVwKHBvcHVwXzE3ZGNmNzRiM2UzYzQ2NjZhMmY1MTAzYTdjZjVlZDg1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzFiYWFmZDk2OWIyNjRkOGNiM2U0ZWUxYTdkYzhhYzIxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguODY3MjU1LC0xMDQuNzYwNzQ5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDUxOTQ5NTFjYWViNDk2ZWEyOGZlNTQ2YzY5ODZiMGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjNiMjlhYmU4NjVkNDgxMDhhOTRkNTU3MWI4OTg4NGMgPSAkKCc8ZGl2IGlkPSJodG1sX2IzYjI5YWJlODY1ZDQ4MTA4YTk0ZDU1NzFiODk4ODRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db2xvcmFkbyBTcHJpbmdzIGNpdHkgcG9wOjQxNjQyNzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDUxOTQ5NTFjYWViNDk2ZWEyOGZlNTQ2YzY5ODZiMGIuc2V0Q29udGVudChodG1sX2IzYjI5YWJlODY1ZDQ4MTA4YTk0ZDU1NzFiODk4ODRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWJhYWZkOTY5YjI2NGQ4Y2IzZTRlZTFhN2RjOGFjMjEuYmluZFBvcHVwKHBvcHVwXzQ1MTk0OTUxY2FlYjQ5NmVhMjhmZTU0NmM2OTg2YjBiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2E2MDljYjc3ZTE1NjRmZWNhMDJlYjlmODdiMjJjM2E2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuMjY0Njc1LC05Ni4wNDE5MjddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZDUwZDhlM2FmNDQ0MDNkYTk1ZjE0ZTFmMGY0N2FhOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYzliNDk4ZjJjMTE0NWJmODUwZGQ5OTIyNGMxMzEzNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWM5YjQ5OGYyYzExNDViZjg1MGRkOTkyMjRjMTMxMzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9tYWhhIGNpdHkgcG9wOjQwODk1ODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWQ1MGQ4ZTNhZjQ0NDAzZGE5NWYxNGUxZjBmNDdhYTkuc2V0Q29udGVudChodG1sX2FjOWI0OThmMmMxMTQ1YmY4NTBkZDk5MjI0YzEzMTM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTYwOWNiNzdlMTU2NGZlY2EwMmViOWY4N2IyMmMzYTYuYmluZFBvcHVwKHBvcHVwXzVkNTBkOGUzYWY0NDQwM2RhOTVmMTRlMWYwZjQ3YWE5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzM0N2RlOTdkM2NjNjQ4NGY4N2JlZGYxNzM3MGQ2MTFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuODMwMjAzOTk5OTk5OTk1LC03OC42NDE0MzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNDczZjQ4YTg1NzI0Y2IxYWRkNGY4MGE2MDBlODlkOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MmNhMzJkYzA5NDU0ODg3OGEyNzQ0NjhkZmZmYWUxYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzJjYTMyZGMwOTQ1NDg4NzhhMjc0NDY4ZGZmZmFlMWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJhbGVpZ2ggY2l0eSBwb3A6NDAzODkyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNDczZjQ4YTg1NzI0Y2IxYWRkNGY4MGE2MDBlODlkOS5zZXRDb250ZW50KGh0bWxfNzJjYTMyZGMwOTQ1NDg4NzhhMjc0NDY4ZGZmZmFlMWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zNDdkZTk3ZDNjYzY0ODRmODdiZWRmMTczNzBkNjExYy5iaW5kUG9wdXAocG9wdXBfYzQ3M2Y0OGE4NTcyNGNiMWFkZDRmODBhNjAwZTg5ZDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2IyMjBhZjc3ZDEwNGZhY2ExMDgwODRkZjYxOTRiYjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsyNS43NzUxNjMsLTgwLjIwODYxNTAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGEwODU5MjUwOTdlNDJhNjkzYWQyMGE1N2Y1MmJmYTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOThhMzdiNTNjZWRjNGZhZmJhMjUzZTUzZjM2Yzk0NzcgPSAkKCc8ZGl2IGlkPSJodG1sXzk4YTM3YjUzY2VkYzRmYWZiYTI1M2U1M2YzNmM5NDc3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWFtaSBjaXR5IHBvcDozOTk0NTc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RhMDg1OTI1MDk3ZTQyYTY5M2FkMjBhNTdmNTJiZmE4LnNldENvbnRlbnQoaHRtbF85OGEzN2I1M2NlZGM0ZmFmYmEyNTNlNTNmMzZjOTQ3Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NiMjIwYWY3N2QxMDRmYWNhMTA4MDg0ZGY2MTk0YmI4LmJpbmRQb3B1cChwb3B1cF9kYTA4NTkyNTA5N2U0MmE2OTNhZDIwYTU3ZjUyYmZhOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84OTAwZGU1Yzg0MGM0Yzg0ODUyM2VjMmFlMTAzZTBjYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjQ3ODEzOCwtODEuNjc5NDg2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTU3MGE5OTBiNTkwNGY5ZjljYjZlZGVkMTE4NzNkYTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzkzM2E2OTQyN2RlNDQxM2I3YjFjM2RiZWRkMzhkMDMgPSAkKCc8ZGl2IGlkPSJodG1sX2M5MzNhNjk0MjdkZTQ0MTNiN2IxYzNkYmVkZDM4ZDAzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGV2ZWxhbmQgY2l0eSBwb3A6Mzk2ODE1PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NTcwYTk5MGI1OTA0ZjlmOWNiNmVkZWQxMTg3M2RhMy5zZXRDb250ZW50KGh0bWxfYzkzM2E2OTQyN2RlNDQxM2I3YjFjM2RiZWRkMzhkMDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84OTAwZGU1Yzg0MGM0Yzg0ODUyM2VjMmFlMTAzZTBjYS5iaW5kUG9wdXAocG9wdXBfNTU3MGE5OTBiNTkwNGY5ZjljYjZlZGVkMTE4NzNkYTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2ZkM2ZiMGE0MGY5NGU2NjkzMjhiZmFhM2QxNTZlNGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNi4xMjc5NDksLTk1LjkwMjMxNl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBmNWVmNWQwZjE0NTQ1NjQ4OTYxYWNkMDYxMWUzZDUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ5ZGVlOTk4YTZkMzRjYmJhYmFjODE4YjAwNjIyNTVmID0gJCgnPGRpdiBpZD0iaHRtbF80OWRlZTk5OGE2ZDM0Y2JiYWJhYzgxOGIwMDYyMjU1ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHVsc2EgY2l0eSBwb3A6MzkxOTA2PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZjVlZjVkMGYxNDU0NTY0ODk2MWFjZDA2MTFlM2Q1Mi5zZXRDb250ZW50KGh0bWxfNDlkZWU5OThhNmQzNGNiYmFiYWM4MThiMDA2MjI1NWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZmQzZmIwYTQwZjk0ZTY2OTMyOGJmYWEzZDE1NmU0YS5iaW5kUG9wdXAocG9wdXBfMGY1ZWY1ZDBmMTQ1NDU2NDg5NjFhY2QwNjExZTNkNTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDA3NTFhN2RlMWRmNGQ0YmIyOWNkYmM2NWQ2NTlhOGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njk4NTcsLTEyMi4yMjU2Mzk5OTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UwNzRmZjNkZjk5MDRhYzFiZDNhZjU0NzY3YjcwZTljID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I0NGEyYmI4MWZjMzRlMDRhOWM5YWM4MTM4MTZjYWY0ID0gJCgnPGRpdiBpZD0iaHRtbF9iNDRhMmJiODFmYzM0ZTA0YTljOWFjODEzODE2Y2FmNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T2FrbGFuZCBjaXR5IHBvcDozOTA3MjQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UwNzRmZjNkZjk5MDRhYzFiZDNhZjU0NzY3YjcwZTljLnNldENvbnRlbnQoaHRtbF9iNDRhMmJiODFmYzM0ZTA0YTljOWFjODEzODE2Y2FmNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQwNzUxYTdkZTFkZjRkNGJiMjljZGJjNjVkNjU5YThiLmJpbmRQb3B1cChwb3B1cF9lMDc0ZmYzZGY5OTA0YWMxYmQzYWY1NDc2N2I3MGU5Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lNTQ5NTJlYTk0YzI0NzY3YmI0ZTA1ZTdlYzkwZmMzMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQ0Ljk2MzMyMjk5OTk5OTk5NSwtOTMuMjY4Mjg0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzg2ZTQzMmMwZWQxNDBkY2JlMmZkNDdlNWUzMGMyMjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmQ5YjhlNzg3OTE1NGMxN2E0MGNiYWEzMWY0ZTNiOTYgPSAkKCc8ZGl2IGlkPSJodG1sXzJkOWI4ZTc4NzkxNTRjMTdhNDBjYmFhMzFmNGUzYjk2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaW5uZWFwb2xpcyBjaXR5IHBvcDozODI1Nzg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4NmU0MzJjMGVkMTQwZGNiZTJmZDQ3ZTVlMzBjMjI0LnNldENvbnRlbnQoaHRtbF8yZDliOGU3ODc5MTU0YzE3YTQwY2JhYTMxZjRlM2I5Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U1NDk1MmVhOTRjMjQ3NjdiYjRlMDVlN2VjOTBmYzMwLmJpbmRQb3B1cChwb3B1cF9jODZlNDMyYzBlZDE0MGRjYmUyZmQ0N2U1ZTMwYzIyNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81NjYxNzVjNjlmZDY0ODIwODRmM2NhMjE2MjA2NTc1ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjY5MDY5NCwtOTcuMzQyNjc4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTFmMjY0NGFmMDQ2NDE0Y2FjZWU3ZjJjNTU2NDA3NTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjQ0ZGM4MzQ3ZThmNDUyNmI4ZDQzY2U3N2U1MWY0MzUgPSAkKCc8ZGl2IGlkPSJodG1sXzI0NGRjODM0N2U4ZjQ1MjZiOGQ0M2NlNzdlNTFmNDM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWNoaXRhIGNpdHkgcG9wOjM4MjM2ODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTFmMjY0NGFmMDQ2NDE0Y2FjZWU3ZjJjNTU2NDA3NTQuc2V0Q29udGVudChodG1sXzI0NGRjODM0N2U4ZjQ1MjZiOGQ0M2NlNzdlNTFmNDM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTY2MTc1YzY5ZmQ2NDgyMDg0ZjNjYTIxNjIwNjU3NWYuYmluZFBvcHVwKHBvcHVwXzUxZjI2NDRhZjA0NjQxNGNhY2VlN2YyYzU1NjQwNzU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2FhZmI2MDM5ZmFjNDRjNzk5YzMxOTkwODZhYjY2MGNkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMTguNDA2NDA5LC02Ni4wNjQwMDRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MGY4NDlmNjlmMjI0YTUwODYyZDgzYmQ1Y2QyN2Y0NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMTA0ZTIwOWZjNjQ0NTgzYjAxMGE5MGJlYmQzMjM2OSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjEwNGUyMDlmYzY0NDU4M2IwMTBhOTBiZWJkMzIzNjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbiBKdWFuIHpvbmEgdXJiYW5hIHBvcDozODE5MzE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcwZjg0OWY2OWYyMjRhNTA4NjJkODNiZDVjZDI3ZjQ1LnNldENvbnRlbnQoaHRtbF9mMTA0ZTIwOWZjNjQ0NTgzYjAxMGE5MGJlYmQzMjM2OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2FhZmI2MDM5ZmFjNDRjNzk5YzMxOTkwODZhYjY2MGNkLmJpbmRQb3B1cChwb3B1cF83MGY4NDlmNjlmMjI0YTUwODYyZDgzYmQ1Y2QyN2Y0NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iZDMzMzA0YzlmMmU0ZDg1YmQ0M2FkOGQ2NTdkMjcxMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzMyLjcwMDcwOCwtOTcuMTI0NjkxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDkzN2MxZGVjNTRlNDNmZGE0MGE3OGE1MDE4MDk4Y2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWZmNmFkZWE1NzY0NDljNzgxY2E5YjM5ZGI3N2RhM2YgPSAkKCc8ZGl2IGlkPSJodG1sXzFmZjZhZGVhNTc2NDQ5Yzc4MWNhOWIzOWRiNzdkYTNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Bcmxpbmd0b24gY2l0eSBwb3A6MzY1NDM4PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOTM3YzFkZWM1NGU0M2ZkYTQwYTc4YTUwMTgwOThjZC5zZXRDb250ZW50KGh0bWxfMWZmNmFkZWE1NzY0NDljNzgxY2E5YjM5ZGI3N2RhM2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iZDMzMzA0YzlmMmU0ZDg1YmQ0M2FkOGQ2NTdkMjcxMy5iaW5kUG9wdXAocG9wdXBfZDkzN2MxZGVjNTRlNDNmZGE0MGE3OGE1MDE4MDk4Y2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTBiNDBjNWNmNjNmNGQzN2FmYWQ1OTc0ZDVlY2NhMDEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4zMjEyMTMsLTExOS4wMTgyOTA5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAzYzI3OWQyNWY2NzQ5OGU4NTRiMjQzNDYxYzlhNDUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdkN2ExZmRmZjQwMjQzMDI4ZGYzYzc2MzkxZTllZmUxID0gJCgnPGRpdiBpZD0iaHRtbF83ZDdhMWZkZmY0MDI0MzAyOGRmM2M3NjM5MWU5ZWZlMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmFrZXJzZmllbGQgY2l0eSBwb3A6MzQ3NDgzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wM2MyNzlkMjVmNjc0OThlODU0YjI0MzQ2MWM5YTQ1Mi5zZXRDb250ZW50KGh0bWxfN2Q3YTFmZGZmNDAyNDMwMjhkZjNjNzYzOTFlOWVmZTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xMGI0MGM1Y2Y2M2Y0ZDM3YWZhZDU5NzRkNWVjY2EwMS5iaW5kUG9wdXAocG9wdXBfMDNjMjc5ZDI1ZjY3NDk4ZTg1NGIyNDM0NjFjOWE0NTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODUyODNkMzYzODFkNGFkODg4MDY0ZmRmMmZiZjgxOTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszMC4wNjg2MzU5OTk5OTk5OTgsLTg5LjkzOTAwNjk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGIwN2Q0ODlmYzM4NDhjYmFiZmFlMTIzZjhhMjU0ZDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTc5MTViMmRlZTY4NGQwNjg2MzA3MjBiOWQ5MWI4NzkgPSAkKCc8ZGl2IGlkPSJodG1sXzE3OTE1YjJkZWU2ODRkMDY4NjMwNzIwYjlkOTFiODc5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgT3JsZWFucyBjaXR5IHBvcDozNDM4Mjk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRiMDdkNDg5ZmMzODQ4Y2JhYmZhZTEyM2Y4YTI1NGQ1LnNldENvbnRlbnQoaHRtbF8xNzkxNWIyZGVlNjg0ZDA2ODYzMDcyMGI5ZDkxYjg3OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzg1MjgzZDM2MzgxZDRhZDg4ODA2NGZkZjJmYmY4MTkyLmJpbmRQb3B1cChwb3B1cF80YjA3ZDQ4OWZjMzg0OGNiYWJmYWUxMjNmOGEyNTRkNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kNzgyNGUxNzVlMjY0NjYzYmFkNjJhNTVkOWVjZWM0NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzIxLjMyNTg1MTk5OTk5OTk5OCwtMTU3Ljg0NTMxNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmYzQ2ZjBjMTI5MzQ2MDk4ZmQ0NWIxMDNkOTYzN2M0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZmNmM5OTU1MTFhNjRhNDg5Yjg2NDU2YjEwZTI5NmU1ID0gJCgnPGRpdiBpZD0iaHRtbF9mZjZjOTk1NTExYTY0YTQ4OWI4NjQ1NmIxMGUyOTZlNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXJiYW4gSG9ub2x1bHUgQ0RQIHBvcDozMzcyNTY8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmYzQ2ZjBjMTI5MzQ2MDk4ZmQ0NWIxMDNkOTYzN2M0LnNldENvbnRlbnQoaHRtbF9mZjZjOTk1NTExYTY0YTQ4OWI4NjQ1NmIxMGUyOTZlNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Q3ODI0ZTE3NWUyNjQ2NjNiYWQ2MmE1NWQ5ZWNlYzQ3LmJpbmRQb3B1cChwb3B1cF9hZmM0NmYwYzEyOTM0NjA5OGZkNDViMTAzZDk2MzdjNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wYjYyNjI3MDljZTE0YmIzODQ4YWEzYzk4MzcxYTg5NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjg1NTQ5NywtMTE3Ljc2MDA3MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q2OWE1ODlkYzE3YjRiZjZhYWZkMmU2ZDY3NDY4Y2UyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI0Nzk5NjIwYWVjMjQ3YjdhMGMwNmRjNGRlNDgwNWIxID0gJCgnPGRpdiBpZD0iaHRtbF8yNDc5OTYyMGFlYzI0N2I3YTBjMDZkYzRkZTQ4MDViMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QW5haGVpbSBjaXR5IHBvcDozMzYyNjU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q2OWE1ODlkYzE3YjRiZjZhYWZkMmU2ZDY3NDY4Y2UyLnNldENvbnRlbnQoaHRtbF8yNDc5OTYyMGFlYzI0N2I3YTBjMDZkYzRkZTQ4MDViMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBiNjI2MjcwOWNlMTRiYjM4NDhhYTNjOTgzNzFhODk3LmJpbmRQb3B1cChwb3B1cF9kNjlhNTg5ZGMxN2I0YmY2YWFmZDJlNmQ2NzQ2OGNlMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xZjljOGNjZTIwZDc0Mjk5YjUwZmM0Zjk5NWFhOTM2YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzI3Ljk3MDA4NiwtODIuNDc5NjcyOTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NTlmNTM0ZjgwMjY0YzA2YjA2NTQ4ODE1M2M3ZTRkYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMmQ5MGFjOGYyMDg0ZTkxOWQ3MzYxMWMyZjQ0ZWFjNyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDJkOTBhYzhmMjA4NGU5MTlkNzM2MTFjMmY0NGVhYzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRhbXBhIGNpdHkgcG9wOjMzNTcwOTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODU5ZjUzNGY4MDI2NGMwNmIwNjU0ODgxNTNjN2U0ZGIuc2V0Q29udGVudChodG1sX2QyZDkwYWM4ZjIwODRlOTE5ZDczNjExYzJmNDRlYWM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWY5YzhjY2UyMGQ3NDI5OWI1MGZjNGY5OTVhYTkzNmEuYmluZFBvcHVwKHBvcHVwXzg1OWY1MzRmODAyNjRjMDZiMDY1NDg4MTUzYzdlNGRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzExM2FhYjIzNzNhMzQ5ZmJhZWNiMDM2NzgxNjRiOTZkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNjg4MDAyMDAwMDAwMDA0LC0xMDQuNjg5NzRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hM2Q0N2M4MTg0YTM0M2UyYWI3NTUwZDkxNGI1YzFkMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NTJhYWY5NGM4MzQ0ZTU0YjA2MTU0YjcxNTFmNTYzYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDUyYWFmOTRjODM0NGU1NGIwNjE1NGI3MTUxZjU2M2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkF1cm9yYSBjaXR5IHBvcDozMjUwNzg8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EzZDQ3YzgxODRhMzQzZTJhYjc1NTBkOTE0YjVjMWQxLnNldENvbnRlbnQoaHRtbF80NTJhYWY5NGM4MzQ0ZTU0YjA2MTU0YjcxNTFmNTYzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzExM2FhYjIzNzNhMzQ5ZmJhZWNiMDM2NzgxNjRiOTZkLmJpbmRQb3B1cChwb3B1cF9hM2Q0N2M4MTg0YTM0M2UyYWI3NTUwZDkxNGI1YzFkMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81OGIzMzg1MjY4OTE0OGYzYTk2ODA3ODY3YmQ2N2I5NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjczNjQ3ODAwMDAwMDAwNSwtMTE3Ljg4MjU5M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwOGY4Y2Q2ZjBmZjRkMzA5ZmE2YTljZDYwNmU5NzJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlYmFkY2FmZWU4MDQ1ODNiNzExOWQwZmMzMDUxN2Y0ID0gJCgnPGRpdiBpZD0iaHRtbF9jZWJhZGNhZmVlODA0NTgzYjcxMTlkMGZjMzA1MTdmNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2FudGEgQW5hIGNpdHkgcG9wOjMyNDUyODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDA4ZjhjZDZmMGZmNGQzMDlmYTZhOWNkNjA2ZTk3MmMuc2V0Q29udGVudChodG1sX2NlYmFkY2FmZWU4MDQ1ODNiNzExOWQwZmMzMDUxN2Y0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNThiMzM4NTI2ODkxNDhmM2E5NjgwNzg2N2JkNjdiOTUuYmluZFBvcHVwKHBvcHVwXzAwOGY4Y2Q2ZjBmZjRkMzA5ZmE2YTljZDYwNmU5NzJjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzZmZTg4MzJhYTJmZTQ0N2NhNTEwZmQ0ZTAxYTliZTdmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguNjM1Njk5LC05MC4yNDQ1ODJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MzI1YTE0NTQ1NzQ0NjAwOWFjYjNiYzUwNTUyMTg1ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zOGQ5NThhMTQ1ZTY0MzhkYWQxNTcyZTVjMTY1OTU2MCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzhkOTU4YTE0NWU2NDM4ZGFkMTU3MmU1YzE2NTk1NjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0LiBMb3VpcyBjaXR5IHBvcDozMTkyOTQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgzMjVhMTQ1NDU3NDQ2MDA5YWNiM2JjNTA1NTIxODVkLnNldENvbnRlbnQoaHRtbF8zOGQ5NThhMTQ1ZTY0MzhkYWQxNTcyZTVjMTY1OTU2MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZmZTg4MzJhYTJmZTQ0N2NhNTEwZmQ0ZTAxYTliZTdmLmJpbmRQb3B1cChwb3B1cF84MzI1YTE0NTQ1NzQ0NjAwOWFjYjNiYzUwNTUyMTg1ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82OGIwZjkzY2IwMmE0NmVmOTYyYTU4MTA1MTMyNjYwNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjQzOTc1MywtNzkuOTc2NTkyMDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYjI5ODM5YjczMTc0ZWE4ODgwMzViMTIwYTdiMWViNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NDdhODhkZTQ1MDU0NjJlYjliMTFiYzA4ZjhkNzEyNyA9ICQoJzxkaXYgaWQ9Imh0bWxfNjQ3YTg4ZGU0NTA1NDYyZWI5YjExYmMwOGY4ZDcxMjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpdHRzYnVyZ2ggY2l0eSBwb3A6MzA1NzA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYjI5ODM5YjczMTc0ZWE4ODgwMzViMTIwYTdiMWViNi5zZXRDb250ZW50KGh0bWxfNjQ3YTg4ZGU0NTA1NDYyZWI5YjExYmMwOGY4ZDcxMjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82OGIwZjkzY2IwMmE0NmVmOTYyYTU4MTA1MTMyNjYwNy5iaW5kUG9wdXAocG9wdXBfYmIyOTgzOWI3MzE3NGVhODg4MDM1YjEyMGE3YjFlYjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2M4NDU3YmRiOTQ1NDg5NGFlODhiMGQ2YjU4NTQwNjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFsyNy43NTQyNTIsLTk3LjE3MzM4NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBkMmMwZGNkMzViYTQwN2U5M2Q2MGRhNzRjYjI4OWE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUxM2YwY2IxMjQwODQwMDk4YjQ0MWFkOTNkMzYyMTZjID0gJCgnPGRpdiBpZD0iaHRtbF81MTNmMGNiMTI0MDg0MDA5OGI0NDFhZDkzZDM2MjE2YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29ycHVzIENocmlzdGkgY2l0eSBwb3A6MzA1MjE1PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZDJjMGRjZDM1YmE0MDdlOTNkNjBkYTc0Y2IyODlhNC5zZXRDb250ZW50KGh0bWxfNTEzZjBjYjEyNDA4NDAwOThiNDQxYWQ5M2QzNjIxNmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83Yzg0NTdiZGI5NDU0ODk0YWU4OGIwZDZiNTg1NDA2OC5iaW5kUG9wdXAocG9wdXBfMGQyYzBkY2QzNWJhNDA3ZTkzZDYwZGE3NGNiMjg5YTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWMwYzI2MjgyMTE2NDZlYmJlMTdmZjZmY2NmNjAxNDMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszMy45MzgxNDMsLTExNy4zOTMxNjc5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZlOTk1YzJlMzcyZTRlYWJhOWIzY2I4OTQ2MzA4NGQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E5MDkzMmIzOTFiNTQwYWFhYjVkYWY0ODFiNGRlYzhjID0gJCgnPGRpdiBpZD0iaHRtbF9hOTA5MzJiMzkxYjU0MGFhYWI1ZGFmNDgxYjRkZWM4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Uml2ZXJzaWRlIGNpdHkgcG9wOjMwMzg3MTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmU5OTVjMmUzNzJlNGVhYmE5YjNjYjg5NDYzMDg0ZDMuc2V0Q29udGVudChodG1sX2E5MDkzMmIzOTFiNTQwYWFhYjVkYWY0ODFiNGRlYzhjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOWMwYzI2MjgyMTE2NDZlYmJlMTdmZjZmY2NmNjAxNDMuYmluZFBvcHVwKHBvcHVwX2ZlOTk1YzJlMzcyZTRlYWJhOWIzY2I4OTQ2MzA4NGQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzYwMjRmMGQ4OWM3NTQ1ZTk4ZDU3MWY5NmJkNzU2YWM5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuMTM5OTAyLC04NC41MDY0NDZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF84MGUwZmIwOTA1NGU0ZDkwOTgxYWMxYjAzNDYwYTExMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNDc4ZDhlMDgxNzU0ZDE5YjY4MWZjYTI0NjdmMjJiZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zM2RmZmZhYjVhOTE0YjU0ODgxM2U2OTg0YTE3MmQwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzNkZmZmYWI1YTkxNGI1NDg4MTNlNjk4NGExNzJkMDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNpbmNpbm5hdGkgY2l0eSBwb3A6Mjk2OTQzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNDc4ZDhlMDgxNzU0ZDE5YjY4MWZjYTI0NjdmMjJiZi5zZXRDb250ZW50KGh0bWxfMzNkZmZmYWI1YTkxNGI1NDg4MTNlNjk4NGExNzJkMDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82MDI0ZjBkODljNzU0NWU5OGQ1NzFmOTZiZDc1NmFjOS5iaW5kUG9wdXAocG9wdXBfMTQ3OGQ4ZTA4MTc1NGQxOWI2ODFmY2EyNDY3ZjIyYmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGRiOTg2YTkzZTk2NGI1MGFmOTE0ZjFlZTYxNjkxN2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszOC4wNDAxNTcsLTg0LjQ1ODQ0M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1ZDdjZWYzZjhkODRkOWJhNzBmMTYyYjhmYWY1OTI1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y4MTAyZjZlZTlhNTRhYjRiZDA2MDg3MDg2NDRjY2JhID0gJCgnPGRpdiBpZD0iaHRtbF9mODEwMmY2ZWU5YTU0YWI0YmQwNjA4NzA4NjQ0Y2NiYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGV4aW5ndG9uLUZheWV0dGUgdXJiYW4gY291bnR5IHBvcDoyOTU4MDM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M1ZDdjZWYzZjhkODRkOWJhNzBmMTYyYjhmYWY1OTI1LnNldENvbnRlbnQoaHRtbF9mODEwMmY2ZWU5YTU0YWI0YmQwNjA4NzA4NjQ0Y2NiYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RkYjk4NmE5M2U5NjRiNTBhZjkxNGYxZWU2MTY5MTdlLmJpbmRQb3B1cChwb3B1cF9jNWQ3Y2VmM2Y4ZDg0ZDliYTcwZjE2MmI4ZmFmNTkyNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80MGYyMmRlMGYxZDU0YTg4OGI5NWRmMjQ4MjJjODJmZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzYxLjE3NzU0OSwtMTQ5LjI3NDM1NDAwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTBhOTdjNzEwZjY5NDY5Mjg3MDJjNzBhOWE2YWQyNDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmYxZGY5MjU1ZGU2NDgzYzg0M2I4NjljZGZkYjA1MTIgPSAkKCc8ZGl2IGlkPSJodG1sXzJmMWRmOTI1NWRlNjQ4M2M4NDNiODY5Y2RmZGIwNTEyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbmNob3JhZ2UgbXVuaWNpcGFsaXR5IHBvcDoyOTE4MjY8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwYTk3YzcxMGY2OTQ2OTI4NzAyYzcwYTlhNmFkMjQ3LnNldENvbnRlbnQoaHRtbF8yZjFkZjkyNTVkZTY0ODNjODQzYjg2OWNkZmRiMDUxMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQwZjIyZGUwZjFkNTRhODg4Yjk1ZGYyNDgyMmM4MmZmLmJpbmRQb3B1cChwb3B1cF9hMGE5N2M3MTBmNjk0NjkyODcwMmM3MGE5YTZhZDI0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82ODBhYWM3ZTcxZTk0ZTFkODRhNmUxNDdkMDc2MWM2NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljk3NjM0MTk5OTk5OTk5NSwtMTIxLjMxMzMwNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE5OTEwMWY0ODZhNzRkODk4NmE2NDU1N2JmMzRhMmY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RjZTExNjk1YTA4NTRlNDA5M2Y0Y2RiYTM3N2IwNzVlID0gJCgnPGRpdiBpZD0iaHRtbF9kY2UxMTY5NWEwODU0ZTQwOTNmNGNkYmEzNzdiMDc1ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RvY2t0b24gY2l0eSBwb3A6MjkxNzA3PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOTkxMDFmNDg2YTc0ZDg5ODZhNjQ1NTdiZjM0YTJmOS5zZXRDb250ZW50KGh0bWxfZGNlMTE2OTVhMDg1NGU0MDkzZjRjZGJhMzc3YjA3NWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82ODBhYWM3ZTcxZTk0ZTFkODRhNmUxNDdkMDc2MWM2Ni5iaW5kUG9wdXAocG9wdXBfMTk5MTAxZjQ4NmE3NGQ4OTg2YTY0NTU3YmYzNGEyZjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGUyOTQ3NGQzMTA5NDU1YzhkMzgwNjhhZmY4N2I2NGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS42NjQwNzEsLTgzLjU4MTg2MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ0Njc3MWI3YmVkYTRlMmY4N2JhOWY1ZmI0N2U4MTU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY0ZmIyZjI5NDMxMjQ5Y2E4MDFkYjJhZDhlOGJmNDhmID0gJCgnPGRpdiBpZD0iaHRtbF82NGZiMmYyOTQzMTI0OWNhODAxZGIyYWQ4ZThiZjQ4ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG9sZWRvIGNpdHkgcG9wOjI4NzIwODwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDQ2NzcxYjdiZWRhNGUyZjg3YmE5ZjVmYjQ3ZTgxNTguc2V0Q29udGVudChodG1sXzY0ZmIyZjI5NDMxMjQ5Y2E4MDFkYjJhZDhlOGJmNDhmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGUyOTQ3NGQzMTA5NDU1YzhkMzgwNjhhZmY4N2I2NGIuYmluZFBvcHVwKHBvcHVwXzQ0Njc3MWI3YmVkYTRlMmY4N2JhOWY1ZmI0N2U4MTU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2YyZjFjN2Q5MTljMzQ0YzhiNDY0NTA5MjA1MDFmMzEzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbNDQuOTQ4ODY5LC05My4xMDM4NTUwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAzMmY3M2VlMGJiYzRiOGRhMWU0ZjI5NDc3MGM1Y2ZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q2Nzc3NjBhMGI1NDRlNjFiZDc3ZjhlNDY1NTRiZTFmID0gJCgnPGRpdiBpZD0iaHRtbF9kNjc3NzYwYTBiNTQ0ZTYxYmQ3N2Y4ZTQ2NTU0YmUxZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIFBhdWwgY2l0eSBwb3A6Mjg1MDY4PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMzJmNzNlZTBiYmM0YjhkYTFlNGYyOTQ3NzBjNWNmYS5zZXRDb250ZW50KGh0bWxfZDY3Nzc2MGEwYjU0NGU2MWJkNzdmOGU0NjU1NGJlMWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mMmYxYzdkOTE5YzM0NGM4YjQ2NDUwOTIwNTAxZjMxMy5iaW5kUG9wdXAocG9wdXBfMDMyZjczZWUwYmJjNGI4ZGExZTRmMjk0NzcwYzVjZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzQzNmMyYTY4MDIyNGYyNDliZjNhZjUwNGZiZTUxZmEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjQyMiwtNzQuMTcyNTc0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODNhMTU0ZmU1NzQ4NGZlNmE2NDZiMDUxMTJjNGRmYTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2MyNWY5ZWM1N2RkNGIwNzhhYzAzMDkyMzU5Y2Q1YjcgPSAkKCc8ZGl2IGlkPSJodG1sXzNjMjVmOWVjNTdkZDRiMDc4YWMwMzA5MjM1OWNkNWI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXdhcmsgY2l0eSBwb3A6Mjc3MTQwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84M2ExNTRmZTU3NDg0ZmU2YTY0NmIwNTExMmM0ZGZhNy5zZXRDb250ZW50KGh0bWxfM2MyNWY5ZWM1N2RkNGIwNzhhYzAzMDkyMzU5Y2Q1YjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zNDM2YzJhNjgwMjI0ZjI0OWJmM2FmNTA0ZmJlNTFmYS5iaW5kUG9wdXAocG9wdXBfODNhMTU0ZmU1NzQ4NGZlNmE2NDZiMDUxMTJjNGRmYTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTY0MzAxOTllNDVhNDExN2IwNTc3NmFhZmQyYzNmZWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNi4wOTY0ODMsLTc5LjgyNzEwOF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RmMGY2NWNlZjNjZjRjOWU5YjhkM2Q2ZWI1NjI0MmVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q2NzM1NjQwYWJhMDRlMWI4ZWI5MzcyMWY4NGQ3Njk3ID0gJCgnPGRpdiBpZD0iaHRtbF9kNjczNTY0MGFiYTA0ZTFiOGViOTM3MjFmODRkNzY5NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW5zYm9ybyBjaXR5IHBvcDoyNjk2NjY8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RmMGY2NWNlZjNjZjRjOWU5YjhkM2Q2ZWI1NjI0MmVlLnNldENvbnRlbnQoaHRtbF9kNjczNTY0MGFiYTA0ZTFiOGViOTM3MjFmODRkNzY5Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE2NDMwMTk5ZTQ1YTQxMTdiMDU3NzZhYWZkMmMzZmViLmJpbmRQb3B1cChwb3B1cF9kZjBmNjVjZWYzY2Y0YzllOWI4ZDNkNmViNTYyNDJlZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81OWE0YjBhYzNiOTc0MWVkOTcyZDViMTUwNGFiNGVjMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjg5MjQ5MiwtNzguODU5Njg2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2YwMjRjMDI1ODEyNDc4ZDg4N2YyMWFiOGY0MjFmYjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDA1MTU5NjkxNjYyNDc2OGE1NzA3M2JhYWVmMGUxZWIgPSAkKCc8ZGl2IGlkPSJodG1sX2QwNTE1OTY5MTY2MjQ3NjhhNTcwNzNiYWFlZjBlMWViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdWZmYWxvIGNpdHkgcG9wOjI2MTMxMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2YwMjRjMDI1ODEyNDc4ZDg4N2YyMWFiOGY0MjFmYjEuc2V0Q29udGVudChodG1sX2QwNTE1OTY5MTY2MjQ3NjhhNTcwNzNiYWFlZjBlMWViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTlhNGIwYWMzYjk3NDFlZDk3MmQ1YjE1MDRhYjRlYzAuYmluZFBvcHVwKHBvcHVwXzNmMDI0YzAyNTgxMjQ3OGQ4ODdmMjFhYjhmNDIxZmIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2E5Y2ZmNzFhZTQ4MjQ1Y2M5MDQyOGY5YTU3ODE4YTQ4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuMDUwNzY5LC05Ni43NDc5NDM5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzgwZTBmYjA5MDU0ZTRkOTA5ODFhYzFiMDM0NjBhMTEwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M5NWNlOTlhNTRhZTQyOWI5ZTUyMjU2NjUxMzA3YzJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FjMTYwYjJkYWQyMzQ4Y2E5MTQ5ZDdlODY5YTM3MjYxID0gJCgnPGRpdiBpZD0iaHRtbF9hYzE2MGIyZGFkMjM0OGNhOTE0OWQ3ZTg2OWEzNzI2MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGxhbm8gY2l0eSBwb3A6MjU5ODQxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jOTVjZTk5YTU0YWU0MjliOWU1MjI1NjY1MTMwN2MyZC5zZXRDb250ZW50KGh0bWxfYWMxNjBiMmRhZDIzNDhjYTkxNDlkN2U4NjlhMzcyNjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hOWNmZjcxYWU0ODI0NWNjOTA0MjhmOWE1NzgxOGE0OC5iaW5kUG9wdXAocG9wdXBfYzk1Y2U5OWE1NGFlNDI5YjllNTIyNTY2NTEzMDdjMmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODlmZWUyNzUxYjYxNDQxNzhhZGQ5Y2Q4M2M4NGU0ZjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDg5NTcsLTk2LjY4MDM1NDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTJmOGFmY2MzYjhiNGQwMmFiZjlkNWJiNGMxZWEyYTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTcxM2Q4YjY1OWMxNDIzMzk3Y2Q0MjkwNjE3ZWI4MWIgPSAkKCc8ZGl2IGlkPSJodG1sXzk3MTNkOGI2NTljMTQyMzM5N2NkNDI5MDYxN2ViODFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaW5jb2xuIGNpdHkgcG9wOjI1ODM3OTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTJmOGFmY2MzYjhiNGQwMmFiZjlkNWJiNGMxZWEyYTYuc2V0Q29udGVudChodG1sXzk3MTNkOGI2NTljMTQyMzM5N2NkNDI5MDYxN2ViODFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODlmZWUyNzUxYjYxNDQxNzhhZGQ5Y2Q4M2M4NGU0ZjcuYmluZFBvcHVwKHBvcHVwX2EyZjhhZmNjM2I4YjRkMDJhYmY5ZDViYjRjMWVhMmE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2JkM2U5MTZkNDk0NzRhM2Y5ZGMxZGEyMGM3MWU0OWFiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzYuMDEyMjMzLC0xMTUuMDM3NDYyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDRkYjhiYTQwYzY0NGExOThhOGRhYWNlNjEzNzdmZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGRlNzY2ZGIwYmU0NGE5ZmEzNmI0NWY2MTIwZGMyZTIgPSAkKCc8ZGl2IGlkPSJodG1sX2RkZTc2NmRiMGJlNDRhOWZhMzZiNDVmNjEyMGRjMmUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IZW5kZXJzb24gY2l0eSBwb3A6MjU3NzI5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NGRiOGJhNDBjNjQ0YTE5OGE4ZGFhY2U2MTM3N2ZkYS5zZXRDb250ZW50KGh0bWxfZGRlNzY2ZGIwYmU0NGE5ZmEzNmI0NWY2MTIwZGMyZTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iZDNlOTE2ZDQ5NDc0YTNmOWRjMWRhMjBjNzFlNDlhYi5iaW5kUG9wdXAocG9wdXBfNDRkYjhiYTQwYzY0NGExOThhOGRhYWNlNjEzNzdmZGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGViOTNhYzg3N2ZjNGZiMTg4M2ZmZjJiYmUwNzliN2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS4wODgxNzMsLTg1LjE0Mzg4MDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfODBlMGZiMDkwNTRlNGQ5MDk4MWFjMWIwMzQ2MGExMTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzhiNDEzMjc1OGY4NDIyNGE1MWY4YjEzMGUxMmQzMTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjI1NWEzNmNiOWE1NDQ0NTljMWFkOTQ1ODRhY2Q3MWIgPSAkKCc8ZGl2IGlkPSJodG1sXzIyNTVhMzZjYjlhNTQ0NDU5YzFhZDk0NTg0YWNkNzFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3J0IFdheW5lIGNpdHkgcG9wOjI1MzY5MTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzhiNDEzMjc1OGY4NDIyNGE1MWY4YjEzMGUxMmQzMTAuc2V0Q29udGVudChodG1sXzIyNTVhMzZjYjlhNTQ0NDU5YzFhZDk0NTg0YWNkNzFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGViOTNhYzg3N2ZjNGZiMTg4M2ZmZjJiYmUwNzliN2IuYmluZFBvcHVwKHBvcHVwX2M4YjQxMzI3NThmODQyMjRhNTFmOGIxMzBlMTJkMzEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x1472eb4e1d0>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"map = folium.Map(location=[30,-97], zoom_start=4,tiles='Stamen Terrain')\n",
"for city in big250.iterrows():\n",
" folium.Marker(\n",
" location = [city[1]['INTPTLAT'],city[1]['INTPTLONG']], \n",
" popup = city[1]['NAME']+ ' pop:'+str(city[1]['POP10'])).add_to(map)\n",
" \n",
"map"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [conda root]",
"language": "python",
"name": "conda-root-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment