In this blog, we will be looking at the crime data in the city of San Francisco. The data we will be using contains all crimes in San Francisco from the year 2018 to 2020. You can download the data here. Since this dataset is very large (more than 330,000 crimes), we will be considering only a small part of the data for this post.

Note: To view the interactive maps, open the notebook in Google Colab.

import numpy as np
import pandas as pd
import folium
df = pd.read_csv('SF_Crime_data.csv')
df.head()
Incident Datetime Incident Date Incident Time Incident Year Incident Day of Week Report Datetime Row ID Incident ID Incident Number CAD Number ... Current Supervisor Districts Analysis Neighborhoods HSOC Zones as of 2018-06-05 OWED Public Spaces Central Market/Tenderloin Boundary Polygon - Updated Parks Alliance CPSI (27+TL sites) ESNCAG - Boundary File Areas of Vulnerability, 2016 Unnamed: 36 Unnamed: 37
0 2/3/2020 14:45 2/3/2020 14:45 2020 Monday 2/3/2020 17:50 89881675000 898816 200085557 200342870.0 ... 8.0 16.0 NaN NaN NaN NaN NaN 2.0 NaN NaN
1 2/3/2020 3:45 2/3/2020 3:45 2020 Monday 2/3/2020 3:45 89860711012 898607 200083749 200340316.0 ... 2.0 20.0 3.0 NaN NaN NaN NaN 2.0 NaN NaN
2 2/3/2020 10:00 2/3/2020 10:00 2020 Monday 2/3/2020 10:06 89867264015 898672 200084060 200340808.0 ... 3.0 8.0 NaN 35.0 NaN NaN NaN 2.0 NaN NaN
3 1/19/2020 17:12 1/19/2020 17:12 2020 Sunday 2/1/2020 13:01 89863571000 898635 206024187 NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 1/5/2020 0:00 1/5/2020 0:00 2020 Sunday 2/3/2020 16:09 89877368020 898773 200085193 200342341.0 ... 6.0 30.0 NaN NaN NaN NaN NaN 1.0 NaN NaN

5 rows × 38 columns

df.shape
(330054, 38)

There have been more than 330,000 crimes in San Francisco in the past two years.

df.columns
Index(['Incident Datetime', 'Incident Date', 'Incident Time', 'Incident Year',
       'Incident Day of Week', 'Report Datetime', 'Row ID', 'Incident ID',
       'Incident Number', 'CAD Number', 'Report Type Code',
       'Report Type Description', 'Filed Online', 'Incident Code',
       'Incident Category', 'Incident Subcategory', 'Incident Description',
       'Resolution', 'Intersection', 'CNN', 'Police District',
       'Analysis Neighborhood', 'Supervisor District', 'Latitude', 'Longitude',
       'point', 'SF Find Neighborhoods', 'Current Police Districts',
       'Current Supervisor Districts', 'Analysis Neighborhoods',
       'HSOC Zones as of 2018-06-05', 'OWED Public Spaces',
       'Central Market/Tenderloin Boundary Polygon - Updated',
       'Parks Alliance CPSI (27+TL sites)', 'ESNCAG - Boundary File',
       'Areas of Vulnerability, 2016', 'Unnamed: 36', 'Unnamed: 37'],
      dtype='object')

We do not need all these columns for our analysis. So we will consider only the necessary columns.

df = df[['Incident Datetime', 'Incident Day of Week', 'Incident Number', 'Incident Category', 'Incident Description', 
         'Police District', 'Analysis Neighborhood', 'Resolution', 'Latitude', 'Longitude', 'point']]
df.head()
Incident Datetime Incident Day of Week Incident Number Incident Category Incident Description Police District Analysis Neighborhood Resolution Latitude Longitude point
0 2/3/2020 14:45 Monday 200085557 Missing Person Found Person Taraval Lakeshore Open or Active 37.726950 -122.476039 (37.72694991292525, -122.47603947349434)
1 2/3/2020 3:45 Monday 200083749 Stolen Property Stolen Property, Possession with Knowledge, Re... Mission Mission Cite or Arrest Adult 37.752440 -122.415172 (37.752439644389675, -122.41517229045435)
2 2/3/2020 10:00 Monday 200084060 Non-Criminal Aided Case, Injured or Sick Person Tenderloin Financial District/South Beach Open or Active 37.784560 -122.407337 (37.784560141211806, -122.40733704162238)
3 1/19/2020 17:12 Sunday 206024187 Lost Property Lost Property Taraval NaN Open or Active NaN NaN NaN
4 1/5/2020 0:00 Sunday 200085193 Miscellaneous Investigation Miscellaneous Investigation Richmond Pacific Heights Open or Active 37.787112 -122.440250 (37.78711245591735, -122.44024995765258)

Now, each row consists of the following 11 features:

  • Incident Datetime: The date and time when the incident occurred
  • Incident Day of Week: The day of week on which the incident occurred
  • Incident Number: The incident or crime number
  • Incident Category: The category of the incident or crime
  • Incident Desccription: The description of the incident or crime
  • Police: The police department district
  • Resolution: The resolution of the crime in terms of whether the perpertrator was arrested or not
  • Analysis Neighborhoods: The neighborhood where the incident took place
  • Latitude: The latitude value of the crime location
  • Longitude: The longitude value of the crime location
  • point: A tuple of the latitude and logitude values

Let's drop the missing values from the Latitude and Longitude columns as they will result in an error when creating a map.

df.dropna(subset=['Latitude', 'Longitude'], inplace=True)

Rename the Incident Category column for the sake of simplicity.

df.rename(columns={'Incident Category':'Category'}, inplace=True)
df.head()
Incident Datetime Incident Day of Week Incident Number Category Incident Description Police District Analysis Neighborhood Resolution Latitude Longitude point
0 2/3/2020 14:45 Monday 200085557 Missing Person Found Person Taraval Lakeshore Open or Active 37.726950 -122.476039 (37.72694991292525, -122.47603947349434)
1 2/3/2020 3:45 Monday 200083749 Stolen Property Stolen Property, Possession with Knowledge, Re... Mission Mission Cite or Arrest Adult 37.752440 -122.415172 (37.752439644389675, -122.41517229045435)
2 2/3/2020 10:00 Monday 200084060 Non-Criminal Aided Case, Injured or Sick Person Tenderloin Financial District/South Beach Open or Active 37.784560 -122.407337 (37.784560141211806, -122.40733704162238)
4 1/5/2020 0:00 Sunday 200085193 Miscellaneous Investigation Miscellaneous Investigation Richmond Pacific Heights Open or Active 37.787112 -122.440250 (37.78711245591735, -122.44024995765258)
5 2/3/2020 8:36 Monday 200083909 Miscellaneous Investigation Miscellaneous Investigation Central Financial District/South Beach Open or Active 37.796926 -122.399507 (37.796926429317054, -122.39950750040278)
limit = 100
df = df.iloc[0:limit, :]
df.shape
(100, 11)

Visualization

Let's visualize where these crimes took place in the city of San Francisco.

latitude = 37.7749
longitude = -122.4194
sanfran_map = folium.Map(location=[latitude, longitude], zoom_start=12)
sanfran_map
<iframe src="about:blank" style="position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfOWU3MzJmNDJmY2I4NDEzOGJlNTk5NGUyM2M3MjAwOGUgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzllNzMyZjQyZmNiODQxMzhiZTU5OTRlMjNjNzIwMDhlIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF85ZTczMmY0MmZjYjg0MTM4YmU1OTk0ZTIzYzcyMDA4ZSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF85ZTczMmY0MmZjYjg0MTM4YmU1OTk0ZTIzYzcyMDA4ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzcuNzc0OSwtMTIyLjQxOTRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2U0YzU3MzhhOTI5MzRjM2RiODZkMDkzODBmNDBmNzdjID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzllNzMyZjQyZmNiODQxMzhiZTU5OTRlMjNjNzIwMDhlKTsKICAgICAgICAKPC9zY3JpcHQ+ onload="this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>

Let's create clusters of neighborhoods. The number of crimes per clusters is denoted on the cluster circle. In a Jupyter notebook, you can interact with the map - click on a cluster to zoom in, in on a marker to check the category of the crime.

from folium import plugins

# let's start again with a clean copy of the map of San Francisco
sanfran_map = folium.Map(location = [latitude, longitude], zoom_start = 12)

# instantiate a mark cluster object for the incidents in the dataframe
incidents = plugins.MarkerCluster().add_to(sanfran_map)

# loop through the dataframe and add each data point to the mark cluster
for lat, lng, label, in zip(df.Latitude, df.Longitude, df.Category):
    folium.Marker(
        location=[lat, lng],
        icon=None,
        popup=label,
    ).add_to(incidents)

# display map
sanfran_map
<iframe src="about:blank" style="position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfOGVlMTFmNmFiNTBhNDEyY2FhNmFjOGIyMWE5YjIxMTkgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4xLjAvTWFya2VyQ2x1c3Rlci5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzEuMS4wL01hcmtlckNsdXN0ZXIuRGVmYXVsdC5jc3MiLz4KPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF84ZWUxMWY2YWI1MGE0MTJjYWE2YWM4YjIxYTliMjExOSIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXBfOGVlMTFmNmFiNTBhNDEyY2FhNmFjOGIyMWE5YjIxMTkgPSBMLm1hcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXBfOGVlMTFmNmFiNTBhNDEyY2FhNmFjOGIyMWE5YjIxMTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NlbnRlcjogWzM3Ljc3NDksLTEyMi40MTk0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9hNzEwYWFlZTFjNmQ0Mzc5YTRlNGNhNzQxNzIzZmI0YSA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF84ZWUxMWY2YWI1MGE0MTJjYWE2YWM4YjIxYTliMjExOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwID0gTC5tYXJrZXJDbHVzdGVyR3JvdXAoewogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBtYXBfOGVlMTFmNmFiNTBhNDEyY2FhNmFjOGIyMWE5YjIxMTkuYWRkTGF5ZXIobWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jOTk1ZmVmY2FkNzI0YmZhYTRjZjhhOWJiNjUwMWU5YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyNjk0OTkxLC0xMjIuNDc2MDM5NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzExZTZkNTI5ODMxNGUzMWFiMTBkYmIzODY0MTlkNGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWNiMzg4MTQ2YzQ3NGVmMzlhMGNjYzZjOGE1N2M5MjcgPSAkKCc8ZGl2IGlkPSJodG1sXzljYjM4ODE0NmM0NzRlZjM5YTBjY2M2YzhhNTdjOTI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaXNzaW5nIFBlcnNvbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzExZTZkNTI5ODMxNGUzMWFiMTBkYmIzODY0MTlkNGMuc2V0Q29udGVudChodG1sXzljYjM4ODE0NmM0NzRlZjM5YTBjY2M2YzhhNTdjOTI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzk5NWZlZmNhZDcyNGJmYWE0Y2Y4YTliYjY1MDFlOWEuYmluZFBvcHVwKHBvcHVwX2MxMWU2ZDUyOTgzMTRlMzFhYjEwZGJiMzg2NDE5ZDRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzEwODcxMjk4ZGRkZTRkMzM4NzliNmJiNDMzN2I2NDNhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUyNDM5NjQsLTEyMi40MTUxNzIzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NGM4ZmZjMjM3NzA0NTQzYTg1ZGNlYzljZjVjYzI5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kOGJhMGI2Y2Y2NTg0Y2Y5OThkNWIwNTVhNWYzOGRlYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDhiYTBiNmNmNjU4NGNmOTk4ZDViMDU1YTVmMzhkZWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0b2xlbiBQcm9wZXJ0eTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjRjOGZmYzIzNzcwNDU0M2E4NWRjZWM5Y2Y1Y2MyOTcuc2V0Q29udGVudChodG1sX2Q4YmEwYjZjZjY1ODRjZjk5OGQ1YjA1NWE1ZjM4ZGVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTA4NzEyOThkZGRlNGQzMzg3OWI2YmI0MzM3YjY0M2EuYmluZFBvcHVwKHBvcHVwXzY0YzhmZmMyMzc3MDQ1NDNhODVkY2VjOWNmNWNjMjk3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzRkMjIzOTIwNDc1MzRiZmE4NGFkYjEyODRlZjQyNzhhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg0NTYwMTQsLTEyMi40MDczMzcwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTY5ZTRkMWU0YzMzNDVhOWJkMTAxZDZlZGY2NzYwNmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWRhMWVhNzgwOWQwNDE0MGEyMDIzMTRlNjAzZTMxY2MgPSAkKCc8ZGl2IGlkPSJodG1sXzVkYTFlYTc4MDlkMDQxNDBhMjAyMzE0ZTYwM2UzMWNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob24tQ3JpbWluYWw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE2OWU0ZDFlNGMzMzQ1YTliZDEwMWQ2ZWRmNjc2MDZjLnNldENvbnRlbnQoaHRtbF81ZGExZWE3ODA5ZDA0MTQwYTIwMjMxNGU2MDNlMzFjYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRkMjIzOTIwNDc1MzRiZmE4NGFkYjEyODRlZjQyNzhhLmJpbmRQb3B1cChwb3B1cF8xNjllNGQxZTRjMzM0NWE5YmQxMDFkNmVkZjY3NjA2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85NjI1ZDgyNzI1MTk0ZmI2YjUwYWRiOTE2NTFjNmM0MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzExMjQ2LC0xMjIuNDQwMjVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkxMDA5YmI1NGIzMzRmNjQ5MmYwZWZmYzU0YmRhNzM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QwZTkzMTBlZmM4MjQyYzU5MWJlNDE5ZWRiNjc3MmRhID0gJCgnPGRpdiBpZD0iaHRtbF9kMGU5MzEwZWZjODI0MmM1OTFiZTQxOWVkYjY3NzJkYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlzY2VsbGFuZW91cyBJbnZlc3RpZ2F0aW9uPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MTAwOWJiNTRiMzM0ZjY0OTJmMGVmZmM1NGJkYTczNi5zZXRDb250ZW50KGh0bWxfZDBlOTMxMGVmYzgyNDJjNTkxYmU0MTllZGI2NzcyZGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85NjI1ZDgyNzI1MTk0ZmI2YjUwYWRiOTE2NTFjNmM0MC5iaW5kUG9wdXAocG9wdXBfOTEwMDliYjU0YjMzNGY2NDkyZjBlZmZjNTRiZGE3MzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGM0OTRhNjQxOGUwNGRkNWIyYWFhNDg4NmI5NDU1YzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTY5MjY0MywtMTIyLjM5OTUwNzVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QxNjE5MTU1OTA2NTQyZjE5YWNkODQ2ZmU5MGU2ZjgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA5ZDM0MTViODJmNDRjYjNhMjY5ZTI2ZDExYmY3NjBkID0gJCgnPGRpdiBpZD0iaHRtbF8wOWQzNDE1YjgyZjQ0Y2IzYTI2OWUyNmQxMWJmNzYwZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlzY2VsbGFuZW91cyBJbnZlc3RpZ2F0aW9uPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMTYxOTE1NTkwNjU0MmYxOWFjZDg0NmZlOTBlNmY4Mi5zZXRDb250ZW50KGh0bWxfMDlkMzQxNWI4MmY0NGNiM2EyNjllMjZkMTFiZjc2MGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kYzQ5NGE2NDE4ZTA0ZGQ1YjJhYWE0ODg2Yjk0NTVjNy5iaW5kUG9wdXAocG9wdXBfZDE2MTkxNTU5MDY1NDJmMTlhY2Q4NDZmZTkwZTZmODIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDg4ZGFiNDYzNzc4NGFjY2I2MTQ5YWNjODk3M2VmNzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjExNTU0OCwtMTIyLjQzMDU3MzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBmN2I3NWQwNDMxMzRkY2M5NDk0NTQ1YzEyYWQ3NDlmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMzY2I0MWE2MzgyNzQxNjQ4ZGI1Njc0N2I0ZDgwZmQyID0gJCgnPGRpdiBpZD0iaHRtbF8zM2NiNDFhNjM4Mjc0MTY0OGRiNTY3NDdiNGQ4MGZkMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T2ZmZW5jZXMgQWdhaW5zdCBUaGUgRmFtaWx5IEFuZCBDaGlsZHJlbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGY3Yjc1ZDA0MzEzNGRjYzk0OTQ1NDVjMTJhZDc0OWYuc2V0Q29udGVudChodG1sXzMzY2I0MWE2MzgyNzQxNjQ4ZGI1Njc0N2I0ZDgwZmQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDg4ZGFiNDYzNzc4NGFjY2I2MTQ5YWNjODk3M2VmNzkuYmluZFBvcHVwKHBvcHVwXzBmN2I3NWQwNDMxMzRkY2M5NDk0NTQ1YzEyYWQ3NDlmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2NjZThjNWQ0ZjIzYTQ0OGNiNjcyNzQwYTgyM2RjMjYzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYyMTM3NjIsLTEyMi40MzYyNDE4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMWI2ZGYyMTM2MmE0NmEwOTBlYWVhM2NiNWZhNmRlZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YzZiNjQ3NGExYWU0OWI2YTIzNmE1MjU4MjY2MWViNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmM2YjY0NzRhMWFlNDliNmEyMzZhNTI1ODI2NjFlYjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk90aGVyIE1pc2NlbGxhbmVvdXM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIxYjZkZjIxMzYyYTQ2YTA5MGVhZWEzY2I1ZmE2ZGVlLnNldENvbnRlbnQoaHRtbF82YzZiNjQ3NGExYWU0OWI2YTIzNmE1MjU4MjY2MWViNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NjZThjNWQ0ZjIzYTQ0OGNiNjcyNzQwYTgyM2RjMjYzLmJpbmRQb3B1cChwb3B1cF8yMWI2ZGYyMTM2MmE0NmEwOTBlYWVhM2NiNWZhNmRlZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84ZDk2MTM4NjQzYjU0MzBjODRjY2VhZWUyZWFhN2QyNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3MjMwMzIsLTEyMi40MTk2NzE3OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmE1MTEwZTVlNTE3NDk2ZGEzMTBlYTNlMGMwOTZmM2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDY3YzE1MDUxNTc5NGExN2FkZDZlY2FjNWMzZjNhYWYgPSAkKCc8ZGl2IGlkPSJodG1sXzQ2N2MxNTA1MTU3OTRhMTdhZGQ2ZWNhYzVjM2YzYWFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob24tQ3JpbWluYWw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhNTExMGU1ZTUxNzQ5NmRhMzEwZWEzZTBjMDk2ZjNlLnNldENvbnRlbnQoaHRtbF80NjdjMTUwNTE1Nzk0YTE3YWRkNmVjYWM1YzNmM2FhZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzhkOTYxMzg2NDNiNTQzMGM4NGNjZWFlZTJlYWE3ZDI2LmJpbmRQb3B1cChwb3B1cF9iYTUxMTBlNWU1MTc0OTZkYTMxMGVhM2UwYzA5NmYzZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kNTBhOTIzZjNjYmU0NTNkYmIyMzUxMmJhOGExZTRhOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTMwNDA3LC0xMjIuNDEzNzcwNl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2QzMGE3ZTkxZWNhNDUxMGI0ZGNmOWQyOTY0MGYzNzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjUyNDgxYzA3MWM5NGJiMzk5NmY2MzVmZGZhZDI0NDAgPSAkKCc8ZGl2IGlkPSJodG1sX2I1MjQ4MWMwNzFjOTRiYjM5OTZmNjM1ZmRmYWQyNDQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob24tQ3JpbWluYWw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNkMzBhN2U5MWVjYTQ1MTBiNGRjZjlkMjk2NDBmMzc1LnNldENvbnRlbnQoaHRtbF9iNTI0ODFjMDcxYzk0YmIzOTk2ZjYzNWZkZmFkMjQ0MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Q1MGE5MjNmM2NiZTQ1M2RiYjIzNTEyYmE4YTFlNGE5LmJpbmRQb3B1cChwb3B1cF8zZDMwYTdlOTFlY2E0NTEwYjRkY2Y5ZDI5NjQwZjM3NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80ZDQ1ODQyMDZlZTI0ZDljOGI4NjNlYzQ0MjlhYzBmZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1MTY2OTQxLC0xMjIuNDQ2MjQ0Nzk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdhOWJkNDUyZDRlYzQ3YmZiYzM2OGM1MjVhM2ExNWUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzliNTUzNzJjYWI2NzRkN2RhZjllNGVjMTkwZjBkM2FiID0gJCgnPGRpdiBpZD0iaHRtbF85YjU1MzcyY2FiNjc0ZDdkYWY5ZTRlYzE5MGYwZDNhYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG9zdCBQcm9wZXJ0eTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2E5YmQ0NTJkNGVjNDdiZmJjMzY4YzUyNWEzYTE1ZTIuc2V0Q29udGVudChodG1sXzliNTUzNzJjYWI2NzRkN2RhZjllNGVjMTkwZjBkM2FiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGQ0NTg0MjA2ZWUyNGQ5YzhiODYzZWM0NDI5YWMwZmYuYmluZFBvcHVwKHBvcHVwXzdhOWJkNDUyZDRlYzQ3YmZiYzM2OGM1MjVhM2ExNWUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQ1NTU5YjA0YzgyYjQ2YjU5NGJiNzQxN2NkMGRhNWFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3OTU1MzksLTEyMi4zODk1ODc0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmQ1NGI5MWFlZjQxNGI1MzkwMTY5NzVkMmRiOTU4ODggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWRjZTUxMjhhZTdmNDI3MTk0NTAwMmQzNzMwNjFmNWMgPSAkKCc8ZGl2IGlkPSJodG1sX2FkY2U1MTI4YWU3ZjQyNzE5NDUwMDJkMzczMDYxZjVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXJjZW55IFRoZWZ0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZDU0YjkxYWVmNDE0YjUzOTAxNjk3NWQyZGI5NTg4OC5zZXRDb250ZW50KGh0bWxfYWRjZTUxMjhhZTdmNDI3MTk0NTAwMmQzNzMwNjFmNWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80NTU1OWIwNGM4MmI0NmI1OTRiYjc0MTdjZDBkYTVhYy5iaW5kUG9wdXAocG9wdXBfZmQ1NGI5MWFlZjQxNGI1MzkwMTY5NzVkMmRiOTU4ODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjdmYzBiZmM1YTc3NGU1MDlkMDQ3YTYyMzUzMjhlYzMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTMzNDcyOCwtMTIyLjQzNDczMzcwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YTNmM2Q4ODc3Yjg0OWRlYTQ5YmUyZjBkYjk3NTdlMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NTQwNDE3NGJlNjA0NzYwYWY2ZWRmMzc5MzBhOTZjMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjU0MDQxNzRiZTYwNDc2MGFmNmVkZjM3OTMwYTk2YzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pc2NlbGxhbmVvdXMgSW52ZXN0aWdhdGlvbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmEzZjNkODg3N2I4NDlkZWE0OWJlMmYwZGI5NzU3ZTMuc2V0Q29udGVudChodG1sXzY1NDA0MTc0YmU2MDQ3NjBhZjZlZGYzNzkzMGE5NmMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjdmYzBiZmM1YTc3NGU1MDlkMDQ3YTYyMzUzMjhlYzMuYmluZFBvcHVwKHBvcHVwXzZhM2YzZDg4NzdiODQ5ZGVhNDliZTJmMGRiOTc1N2UzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2EwZmRjM2U4YjQwYzRhOTU5NWRkZjNiMjdmNjVkNmU1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzkzNTU3NTUsLTEyMi40MzMwODg0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMTk2MWMyMDU1ZTM0MmJmYjg4ODA0YmE4ZTFjMjkwOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMTg0OTg1Y2I4NzQ0YjY4YTRhZTBhMDU2ZjczNjQ1NSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjE4NDk4NWNiODc0NGI2OGE0YWUwYTA1NmY3MzY0NTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhcmNlbnkgVGhlZnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzExOTYxYzIwNTVlMzQyYmZiODg4MDRiYThlMWMyOTA4LnNldENvbnRlbnQoaHRtbF9mMTg0OTg1Y2I4NzQ0YjY4YTRhZTBhMDU2ZjczNjQ1NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2EwZmRjM2U4YjQwYzRhOTU5NWRkZjNiMjdmNjVkNmU1LmJpbmRQb3B1cChwb3B1cF8xMTk2MWMyMDU1ZTM0MmJmYjg4ODA0YmE4ZTFjMjkwOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kNzdlNWE2ODllYmU0MGQ4YWYyYjEyOWE5NDY3NjQyNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NTUwMzc2LC0xMjIuNTA0ODg1OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjAwYTRjMWEwNzgxNGJiMGE3YTljNjAzN2YwNzVkNzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWZhNTI4NDQ4YzJjNGM2MGFiOGEyNTlmNTdkZGY5ZWUgPSAkKCc8ZGl2IGlkPSJodG1sX2FmYTUyODQ0OGMyYzRjNjBhYjhhMjU5ZjU3ZGRmOWVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXJjZW55IFRoZWZ0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMDBhNGMxYTA3ODE0YmIwYTdhOWM2MDM3ZjA3NWQ3OS5zZXRDb250ZW50KGh0bWxfYWZhNTI4NDQ4YzJjNGM2MGFiOGEyNTlmNTdkZGY5ZWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kNzdlNWE2ODllYmU0MGQ4YWYyYjEyOWE5NDY3NjQyNy5iaW5kUG9wdXAocG9wdXBfMjAwYTRjMWEwNzgxNGJiMGE3YTljNjAzN2YwNzVkNzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTNiNzk3Njk3MjU2NDQwMGJhMmRiYTM3ZDNjZWIzOTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIwNTY5NCwtMTIyLjQyNzM5NjQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZDk5ZGI4NGEzN2M0YTlhYTk5MDZkODMwNmU0NDRjNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mODg1Y2MwZjI1NWM0MzI0ODkxMWZhNzViYWE3OGNhZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjg4NWNjMGYyNTVjNDMyNDg5MTFmYTc1YmFhNzhjYWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhcmNlbnkgVGhlZnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VkOTlkYjg0YTM3YzRhOWFhOTkwNmQ4MzA2ZTQ0NGM2LnNldENvbnRlbnQoaHRtbF9mODg1Y2MwZjI1NWM0MzI0ODkxMWZhNzViYWE3OGNhZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzEzYjc5NzY5NzI1NjQ0MDBiYTJkYmEzN2QzY2ViMzkxLmJpbmRQb3B1cChwb3B1cF9lZDk5ZGI4NGEzN2M0YTlhYTk5MDZkODMwNmU0NDRjNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85MzkzYmIyYWY5Y2U0YTkyOWNlOTdiZDY0MTZkNWNlMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MzI4Nzg1LC0xMjIuNDA4OTUyMjAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE0YzI1MjExNGRhNjQyMWE4YjE5MjIyMjIyZGUyOTA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIyNTRjNTk5MWNiYTRkNGJiNmZmNzdhMjU2MWRhMjY5ID0gJCgnPGRpdiBpZD0iaHRtbF8yMjU0YzU5OTFjYmE0ZDRiYjZmZjc3YTI1NjFkYTI2OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2FycmFudDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTRjMjUyMTE0ZGE2NDIxYThiMTkyMjIyMjJkZTI5MDguc2V0Q29udGVudChodG1sXzIyNTRjNTk5MWNiYTRkNGJiNmZmNzdhMjU2MWRhMjY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTM5M2JiMmFmOWNlNGE5MjljZTk3YmQ2NDE2ZDVjZTIuYmluZFBvcHVwKHBvcHVwXzE0YzI1MjExNGRhNjQyMWE4YjE5MjIyMjIyZGUyOTA4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2NmM2I1MjliNmJmYzQ5NjJiMzdmOWJlNDdmNzZlOWE1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4MjEyNzcsLTEyMi40MzUwNTI0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMDg3Y2FhYzM0Yjg0MjRmYWVhZmJiODk4MzkzZmQ0OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NzVlZGExYTQwNzU0ODc3YTQ5Y2I4Zjc4MmYyYjUzZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTc1ZWRhMWE0MDc1NDg3N2E0OWNiOGY3ODJmMmI1M2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFzc2F1bHQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IwODdjYWFjMzRiODQyNGZhZWFmYmI4OTgzOTNmZDQ4LnNldENvbnRlbnQoaHRtbF81NzVlZGExYTQwNzU0ODc3YTQ5Y2I4Zjc4MmYyYjUzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NmM2I1MjliNmJmYzQ5NjJiMzdmOWJlNDdmNzZlOWE1LmJpbmRQb3B1cChwb3B1cF9iMDg3Y2FhYzM0Yjg0MjRmYWVhZmJiODk4MzkzZmQ0OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84OGQxNWVjZTFjODc0NzUwOGJlY2Q5Y2M0NWI2OTVmZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MjYxNjc3LC0xMjIuNDk4NTU1M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmU0ZDQ2ZjRjNDJiNDhhOGIwMDIxNDhmMzA3ZDY5OWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWExMGZlMTcxZjVhNDRhMzk4NDY0YTVhZTEwZDI3M2QgPSAkKCc8ZGl2IGlkPSJodG1sX2FhMTBmZTE3MWY1YTQ0YTM5ODQ2NGE1YWUxMGQyNzNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PdGhlciBNaXNjZWxsYW5lb3VzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZTRkNDZmNGM0MmI0OGE4YjAwMjE0OGYzMDdkNjk5ZS5zZXRDb250ZW50KGh0bWxfYWExMGZlMTcxZjVhNDRhMzk4NDY0YTVhZTEwZDI3M2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84OGQxNWVjZTFjODc0NzUwOGJlY2Q5Y2M0NWI2OTVmZi5iaW5kUG9wdXAocG9wdXBfNmU0ZDQ2ZjRjNDJiNDhhOGIwMDIxNDhmMzA3ZDY5OWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTM5Yjk1ZGI2OWU3NDYwNDljOWZiZjMyNzNhODU1NDMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzA5OTI0LC0xMjIuNDU2ODM4OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzY0YjI4OTk2NmMwNGZmNGJmZDhkNTViMjE3NmZjZjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWIzNjQ1OTgzMGY4NDg2YzhmNmJjNzY3OTI5ZmVjMTIgPSAkKCc8ZGl2IGlkPSJodG1sXzViMzY0NTk4MzBmODQ4NmM4ZjZiYzc2NzkyOWZlYzEyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXJjZW55IFRoZWZ0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNjRiMjg5OTY2YzA0ZmY0YmZkOGQ1NWIyMTc2ZmNmOS5zZXRDb250ZW50KGh0bWxfNWIzNjQ1OTgzMGY4NDg2YzhmNmJjNzY3OTI5ZmVjMTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hMzliOTVkYjY5ZTc0NjA0OWM5ZmJmMzI3M2E4NTU0My5iaW5kUG9wdXAocG9wdXBfYzY0YjI4OTk2NmMwNGZmNGJmZDhkNTViMjE3NmZjZjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTYwZTcwZmY2NzVjNDI0OGE0ZjRkMjRiY2EyNTY4ODYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzI4MzA5OSwtMTIyLjM5MTM3MzUwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zOWZhYWVhMTgxMGU0MjE2OTJkYTZkMGJmMTExMmZiYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYmVjODNiYjgwZWI0ODk0YjM1MWFjYWM2Y2E2YjZhOCA9ICQoJzxkaXYgaWQ9Imh0bWxfZmJlYzgzYmI4MGViNDg5NGIzNTFhY2FjNmNhNmI2YTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZyYXVkPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOWZhYWVhMTgxMGU0MjE2OTJkYTZkMGJmMTExMmZiYy5zZXRDb250ZW50KGh0bWxfZmJlYzgzYmI4MGViNDg5NGIzNTFhY2FjNmNhNmI2YTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81NjBlNzBmZjY3NWM0MjQ4YTRmNGQyNGJjYTI1Njg4Ni5iaW5kUG9wdXAocG9wdXBfMzlmYWFlYTE4MTBlNDIxNjkyZGE2ZDBiZjExMTJmYmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDNhYTUyODNiOWQ1NDNjMGIzZDQ0ZjZkMzAyZGIzMDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy44MDc0ODI1MSwtMTIyLjQxMzk3NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODMyNzI1YTlhMjgxNGMzYTgwOTQyMzg2NjQ1YTE2NGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWZiZTRhNjhjNmI3NDE2NmE3ODA0YjI4MDgyMTlhMWUgPSAkKCc8ZGl2IGlkPSJodG1sX2FmYmU0YTY4YzZiNzQxNjZhNzgwNGIyODA4MjE5YTFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Mb3N0IFByb3BlcnR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MzI3MjVhOWEyODE0YzNhODA5NDIzODY2NDVhMTY0Zi5zZXRDb250ZW50KGh0bWxfYWZiZTRhNjhjNmI3NDE2NmE3ODA0YjI4MDgyMTlhMWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wM2FhNTI4M2I5ZDU0M2MwYjNkNDRmNmQzMDJkYjMwNS5iaW5kUG9wdXAocG9wdXBfODMyNzI1YTlhMjgxNGMzYTgwOTQyMzg2NjQ1YTE2NGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDI3NzAzYjU2Mjg1NDAyOTgxNzk3YjNmMTU5MWRjYjEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTk2NzU0MywtMTIyLjQwMjA3OThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhhMWZlZDQzZTQwYjQ1YTc5MmI4ZjVmNGJkYzQ5YmVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E0MWJlZDBiNDFhNDRhYzg4OTVlYmZiNjE5OTEzM2Q3ID0gJCgnPGRpdiBpZD0iaHRtbF9hNDFiZWQwYjQxYTQ0YWM4ODk1ZWJmYjYxOTkxMzNkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnVyZ2xhcnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhhMWZlZDQzZTQwYjQ1YTc5MmI4ZjVmNGJkYzQ5YmVmLnNldENvbnRlbnQoaHRtbF9hNDFiZWQwYjQxYTQ0YWM4ODk1ZWJmYjYxOTkxMzNkNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzAyNzcwM2I1NjI4NTQwMjk4MTc5N2IzZjE1OTFkY2IxLmJpbmRQb3B1cChwb3B1cF84YTFmZWQ0M2U0MGI0NWE3OTJiOGY1ZjRiZGM0OWJlZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kMTE5NjRhMTNjNzc0ZmJhOWZkYzNjODcxMTRjMWRmZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MDQzMzI2LC0xMjIuNDE1OTI4N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODA2ZTdjZTRhODJmNDkwZjk4OWY4NWQyYWQ0NzNjM2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzNmNzBhZjk1NDdlNDg3ZWE5YTlmZTNjZWQ3ODBhM2QgPSAkKCc8ZGl2IGlkPSJodG1sXzczZjcwYWY5NTQ3ZTQ4N2VhOWE5ZmUzY2VkNzgwYTNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UcmFmZmljIFZpb2xhdGlvbiBBcnJlc3Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgwNmU3Y2U0YTgyZjQ5MGY5ODlmODVkMmFkNDczYzNkLnNldENvbnRlbnQoaHRtbF83M2Y3MGFmOTU0N2U0ODdlYTlhOWZlM2NlZDc4MGEzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2QxMTk2NGExM2M3NzRmYmE5ZmRjM2M4NzExNGMxZGZlLmJpbmRQb3B1cChwb3B1cF84MDZlN2NlNGE4MmY0OTBmOTg5Zjg1ZDJhZDQ3M2MzZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lM2ExYmI5N2VhNWM0NTY3OTJiNmJmMTQwZDQ3NjFhYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjgwMzc2MTMsLTEyMi40MTMyMjI3OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjM2OTc3Mzk2NzcyNDg4YWE3Njg3YzlmMDY2MmMxMmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmFmNTk2ZjQzZjZhNDE3ZGI1MzllOTE2NDk1ZTRmN2UgPSAkKCc8ZGl2IGlkPSJodG1sX2JhZjU5NmY0M2Y2YTQxN2RiNTM5ZTkxNjQ5NWU0ZjdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXJnbGFyeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjM2OTc3Mzk2NzcyNDg4YWE3Njg3YzlmMDY2MmMxMmEuc2V0Q29udGVudChodG1sX2JhZjU5NmY0M2Y2YTQxN2RiNTM5ZTkxNjQ5NWU0ZjdlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTNhMWJiOTdlYTVjNDU2NzkyYjZiZjE0MGQ0NzYxYWIuYmluZFBvcHVwKHBvcHVwX2YzNjk3NzM5Njc3MjQ4OGFhNzY4N2M5ZjA2NjJjMTJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2MwYmM4ZTNhMWUzMTQxMWNiZTdlYWY4NWRiYWIzMWMzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0MzI0MDEsLTEyMi40MzE3MDAzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wOTRjYzkzZmIxMzg0ZDYxODFmYzc4ZTAwMWY4OGM4ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZGE4NGU2NjllMWI0ZWJmYmQ4OTg0ZTJmYmI3YjlmMyA9ICQoJzxkaXYgaWQ9Imh0bWxfOWRhODRlNjY5ZTFiNGViZmJkODk4NGUyZmJiN2I5ZjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk90aGVyIE1pc2NlbGxhbmVvdXM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA5NGNjOTNmYjEzODRkNjE4MWZjNzhlMDAxZjg4YzhkLnNldENvbnRlbnQoaHRtbF85ZGE4NGU2NjllMWI0ZWJmYmQ4OTg0ZTJmYmI3YjlmMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2MwYmM4ZTNhMWUzMTQxMWNiZTdlYWY4NWRiYWIzMWMzLmJpbmRQb3B1cChwb3B1cF8wOTRjYzkzZmIxMzg0ZDYxODFmYzc4ZTAwMWY4OGM4ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kMDYwOGQzNTYwMzU0MGRhODdlYjgxNDIyZDMwOGI0NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NjY3ODM0LC0xMjIuMzk1MjY2Mjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFhNWZkY2ZiMmJlZjRmMzM4MjgxZmMwZTJiMjJiYTBmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E4NWE1OGIwNzlkOTQ2ZDlhMzQ2MWVhMzg4MWU5ZTBkID0gJCgnPGRpdiBpZD0iaHRtbF9hODVhNThiMDc5ZDk0NmQ5YTM0NjFlYTM4ODFlOWUwZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnVyZ2xhcnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFhNWZkY2ZiMmJlZjRmMzM4MjgxZmMwZTJiMjJiYTBmLnNldENvbnRlbnQoaHRtbF9hODVhNThiMDc5ZDk0NmQ5YTM0NjFlYTM4ODFlOWUwZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2QwNjA4ZDM1NjAzNTQwZGE4N2ViODE0MjJkMzA4YjQ3LmJpbmRQb3B1cChwb3B1cF8xYTVmZGNmYjJiZWY0ZjMzODI4MWZjMGUyYjIyYmEwZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83OWJiODYxODFjNzc0MjllOGNjYzMwNjVmOTUwMTZjOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NDU0NjYxLC0xMjIuNDIyODM4MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWMyYWJiY2MzYTg4NDUzNGExZDMwMGEzNWQ3MzRjMTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGNiYjQ4YmQ4NGE4NGE3OThmNTdjZmI1ZTg1YzlmNTAgPSAkKCc8ZGl2IGlkPSJodG1sXzBjYmI0OGJkODRhODRhNzk4ZjU3Y2ZiNWU4NWM5ZjUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXJjZW55IFRoZWZ0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YzJhYmJjYzNhODg0NTM0YTFkMzAwYTM1ZDczNGMxNS5zZXRDb250ZW50KGh0bWxfMGNiYjQ4YmQ4NGE4NGE3OThmNTdjZmI1ZTg1YzlmNTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83OWJiODYxODFjNzc0MjllOGNjYzMwNjVmOTUwMTZjOC5iaW5kUG9wdXAocG9wdXBfNWMyYWJiY2MzYTg4NDUzNGExZDMwMGEzNWQ3MzRjMTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGMzMzg3NWY0Y2UxNGYzNzgyNmFiOWVmMDUzMmE1MDAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTQzNTM3OCwtMTIyLjQxOTc1MjddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjNDc2NTBhOGQ4MDQyYzg4M2YyNDM4YjZiZGM3NTgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgwM2MzYzcwMGNmZDQ3ODJiMWQ3M2JkNzRjZTBhMTY2ID0gJCgnPGRpdiBpZD0iaHRtbF84MDNjM2M3MDBjZmQ0NzgyYjFkNzNiZDc0Y2UwYTE2NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlzc2luZyBQZXJzb248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RjNDc2NTBhOGQ4MDQyYzg4M2YyNDM4YjZiZGM3NTgyLnNldENvbnRlbnQoaHRtbF84MDNjM2M3MDBjZmQ0NzgyYjFkNzNiZDc0Y2UwYTE2Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RjMzM4NzVmNGNlMTRmMzc4MjZhYjllZjA1MzJhNTAwLmJpbmRQb3B1cChwb3B1cF9kYzQ3NjUwYThkODA0MmM4ODNmMjQzOGI2YmRjNzU4Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84YmQyYjg1ZmQ1MTE0NmJhYTQ3ZmUyYTMyNTdlOGFjYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxNzE3ODk1LC0xMjIuMzg2MjY1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMGZlYTFmOWYyOWY0ZTEwYTllOTY3NTNkODNiZWRkYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMzhjYTU0ZTNmZjU0ZGZjOTFmOTNlNmMwN2M5NTVmMyA9ICQoJzxkaXYgaWQ9Imh0bWxfYzM4Y2E1NGUzZmY1NGRmYzkxZjkzZTZjMDdjOTU1ZjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldlYXBvbnMgQ2FycnlpbmcgRXRjPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMGZlYTFmOWYyOWY0ZTEwYTllOTY3NTNkODNiZWRkYi5zZXRDb250ZW50KGh0bWxfYzM4Y2E1NGUzZmY1NGRmYzkxZjkzZTZjMDdjOTU1ZjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84YmQyYjg1ZmQ1MTE0NmJhYTQ3ZmUyYTMyNTdlOGFjYi5iaW5kUG9wdXAocG9wdXBfZjBmZWExZjlmMjlmNGUxMGE5ZTk2NzUzZDgzYmVkZGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2U2OGIxMmUzOTNhNDRkMjkyNDU4Zjk0ZTc3MzExMDcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODg0NDIxNiwtMTIyLjQwMDM0MzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFhNjdlYjNlNzQ0ZDQxZTFhMzI0YjI0MzgyZGZiZjVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzZjJiZGFlMGJmYjQ3NmY5MmUxNTA2M2ZkM2IxNDQyID0gJCgnPGRpdiBpZD0iaHRtbF8wM2YyYmRhZTBiZmI0NzZmOTJlMTUwNjNmZDNiMTQ0MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFsaWNpb3VzIE1pc2NoaWVmPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYTY3ZWIzZTc0NGQ0MWUxYTMyNGIyNDM4MmRmYmY1ZS5zZXRDb250ZW50KGh0bWxfMDNmMmJkYWUwYmZiNDc2ZjkyZTE1MDYzZmQzYjE0NDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZTY4YjEyZTM5M2E0NGQyOTI0NThmOTRlNzczMTEwNy5iaW5kUG9wdXAocG9wdXBfMWE2N2ViM2U3NDRkNDFlMWEzMjRiMjQzODJkZmJmNWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGNiZDRlYWIyMjkzNDU3MDg0OGFiYmRmOTIyNmIyZTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzYwMTUyNywtMTIyLjM4NDc0NTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUyNGQyNDljODI5NDQzNzA4OGNiMDM2ZDdmYzM0MGU2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVmMThiOTUzM2VhMjQ4N2ZiNDFmNTA2ODIzZjE4NzViID0gJCgnPGRpdiBpZD0iaHRtbF81ZjE4Yjk1MzNlYTI0ODdmYjQxZjUwNjgyM2YxODc1YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXNzYXVsdDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTI0ZDI0OWM4Mjk0NDM3MDg4Y2IwMzZkN2ZjMzQwZTYuc2V0Q29udGVudChodG1sXzVmMThiOTUzM2VhMjQ4N2ZiNDFmNTA2ODIzZjE4NzViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGNiZDRlYWIyMjkzNDU3MDg0OGFiYmRmOTIyNmIyZTEuYmluZFBvcHVwKHBvcHVwXzUyNGQyNDljODI5NDQzNzA4OGNiMDM2ZDdmYzM0MGU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2FjMGUzNDhkNjQ3YjQwNGJhZTVkMDU4YWRlNzhkNTJhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU5NTU5MTMsLTEyMi40MDQwMTA1OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2RkM2U2ZjUxNmYzNDgyOGJlYmVmMzVjZjE4NmVjYjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTIyYzY0MDQ5OTJkNDdhNGJmNTZjNTUxMWM5ZDQ4NjYgPSAkKCc8ZGl2IGlkPSJodG1sXzkyMmM2NDA0OTkyZDQ3YTRiZjU2YzU1MTFjOWQ0ODY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3RvciBWZWhpY2xlIFRoZWZ0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZGQzZTZmNTE2ZjM0ODI4YmViZWYzNWNmMTg2ZWNiOC5zZXRDb250ZW50KGh0bWxfOTIyYzY0MDQ5OTJkNDdhNGJmNTZjNTUxMWM5ZDQ4NjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hYzBlMzQ4ZDY0N2I0MDRiYWU1ZDA1OGFkZTc4ZDUyYS5iaW5kUG9wdXAocG9wdXBfM2RkM2U2ZjUxNmYzNDgyOGJlYmVmMzVjZjE4NmVjYjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGRhNjc3YzYzN2MyNDJlY2EwNzc5NDYyOTU1YWJjMTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Mjc4NjA1MywtMTIyLjQzODA4NDddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ3MDNhMDQxZjJkYzQzNzQ5OTJkMGEzOTlkMTRiYjBhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBkMjcwMGYwZTdhMDRmMDFhM2ZkNWE3MTQxNmYyZGJkID0gJCgnPGRpdiBpZD0iaHRtbF8wZDI3MDBmMGU3YTA0ZjAxYTNmZDVhNzE0MTZmMmRiZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnVyZ2xhcnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ3MDNhMDQxZjJkYzQzNzQ5OTJkMGEzOTlkMTRiYjBhLnNldENvbnRlbnQoaHRtbF8wZDI3MDBmMGU3YTA0ZjAxYTNmZDVhNzE0MTZmMmRiZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RkYTY3N2M2MzdjMjQyZWNhMDc3OTQ2Mjk1NWFiYzEyLmJpbmRQb3B1cChwb3B1cF80NzAzYTA0MWYyZGM0Mzc0OTkyZDBhMzk5ZDE0YmIwYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jZDQ3MzBhOGYyZmQ0MjhmYWJkZmYxMWM3YTRiMjIyYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTkwOTg4LC0xMjIuMzk3MTc2OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWIzZjFlNjI4ODZkNGMxOGI5ZjE1YzFkNWNlYmE0MTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2U3ZTY4NTU0MzhkNDc0NWIwYjJkZTZiMmU4ZTk3OWUgPSAkKCc8ZGl2IGlkPSJodG1sXzNlN2U2ODU1NDM4ZDQ3NDViMGIyZGU2YjJlOGU5NzllIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaXNzaW5nIFBlcnNvbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWIzZjFlNjI4ODZkNGMxOGI5ZjE1YzFkNWNlYmE0MTMuc2V0Q29udGVudChodG1sXzNlN2U2ODU1NDM4ZDQ3NDViMGIyZGU2YjJlOGU5NzllKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2Q0NzMwYThmMmZkNDI4ZmFiZGZmMTFjN2E0YjIyMmIuYmluZFBvcHVwKHBvcHVwXzViM2YxZTYyODg2ZDRjMThiOWYxNWMxZDVjZWJhNDEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzA5ZDdlYTc4YTZkNDQ4Zjk4MTgyYjRhMWU4MmQ0M2I2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY1NjA1ODQsLTEyMi40MTA0ODY3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNTViZmRlYTIzNTM0ODdmOTY0MWVlMGQ4NWZmNDlkYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NDczMmVjZWE0YTU0ZGI3OTkwYzBiMjliY2IwNzI4NCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzQ3MzJlY2VhNGE1NGRiNzk5MGMwYjI5YmNiMDcyODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRydWcgT2ZmZW5zZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzU1YmZkZWEyMzUzNDg3Zjk2NDFlZTBkODVmZjQ5ZGIuc2V0Q29udGVudChodG1sXzc0NzMyZWNlYTRhNTRkYjc5OTBjMGIyOWJjYjA3Mjg0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDlkN2VhNzhhNmQ0NDhmOTgxODJiNGExZTgyZDQzYjYuYmluZFBvcHVwKHBvcHVwX2M1NWJmZGVhMjM1MzQ4N2Y5NjQxZWUwZDg1ZmY0OWRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzc2NDMwZDFlNTM2NTQ5MDRhM2NlZmFjNTYyMTM0ZjVmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzkzMjMwNDksLTEyMi4zOTMxODEzMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzA2ZGQ4ZWEwYWNlNDhjZWJkZTdlYmYyMGE5OTk5ZGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzRhNzE3ZTJhZGNhNGEwNDhhM2UyM2JmNTFjYmMwMzggPSAkKCc8ZGl2IGlkPSJodG1sXzc0YTcxN2UyYWRjYTRhMDQ4YTNlMjNiZjUxY2JjMDM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3RvciBWZWhpY2xlIFRoZWZ0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMDZkZDhlYTBhY2U0OGNlYmRlN2ViZjIwYTk5OTlkZS5zZXRDb250ZW50KGh0bWxfNzRhNzE3ZTJhZGNhNGEwNDhhM2UyM2JmNTFjYmMwMzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83NjQzMGQxZTUzNjU0OTA0YTNjZWZhYzU2MjEzNGY1Zi5iaW5kUG9wdXAocG9wdXBfYzA2ZGQ4ZWEwYWNlNDhjZWJkZTdlYmYyMGE5OTk5ZGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2QzMzFiYTU0MzgyNDRlMWI1NjlkMDhkN2ZiNDg1NzAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzAyMTAxNywtMTIyLjQ0NTM0NDk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YzgxMjU3MmYzZjY0NTExYTkzN2Q2YTYwNTY4NmFlYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYjI5OGMzZjI2Mzc0YmY0YTFlYzUwOTc4MmQ0N2Y2NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZGIyOThjM2YyNjM3NGJmNGExZWM1MDk3ODJkNDdmNjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhcmNlbnkgVGhlZnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZjODEyNTcyZjNmNjQ1MTFhOTM3ZDZhNjA1Njg2YWViLnNldENvbnRlbnQoaHRtbF9kYjI5OGMzZjI2Mzc0YmY0YTFlYzUwOTc4MmQ0N2Y2Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NkMzMxYmE1NDM4MjQ0ZTFiNTY5ZDA4ZDdmYjQ4NTcwLmJpbmRQb3B1cChwb3B1cF82YzgxMjU3MmYzZjY0NTExYTkzN2Q2YTYwNTY4NmFlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84ODNiNTU2ZTQ5NDI0OWNiYTEwZmExNWMwNDQzZGU2ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5MzY4Mzc4LC0xMjIuNDE3OTM1OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTVkYjhlNDUxYzMzNDMwYTkwNDIzMGQ4MDcwMjgyZjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjRmMGM2MjU1MjQ2NGMyZjgyNjVmYzlkZWZiNGUzZGMgPSAkKCc8ZGl2IGlkPSJodG1sXzI0ZjBjNjI1NTI0NjRjMmY4MjY1ZmM5ZGVmYjRlM2RjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Bc3NhdWx0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNWRiOGU0NTFjMzM0MzBhOTA0MjMwZDgwNzAyODJmMy5zZXRDb250ZW50KGh0bWxfMjRmMGM2MjU1MjQ2NGMyZjgyNjVmYzlkZWZiNGUzZGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84ODNiNTU2ZTQ5NDI0OWNiYTEwZmExNWMwNDQzZGU2Zi5iaW5kUG9wdXAocG9wdXBfMTVkYjhlNDUxYzMzNDMwYTkwNDIzMGQ4MDcwMjgyZjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWQ5MjgzZjNiYzYzNDcwZWIzZjdjNjMyNjE2ZjhmOTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODQ2NTcxNCwtMTIyLjQxNDQzMDIwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNTc3MjU5YzYyOWQ0YzFmODYyOTljMDZlYmUxYzc3YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYWJjNmRiNDQ1YTA0Y2QxYWJiNWU3NmJiYzgwOTE2OCA9ICQoJzxkaXYgaWQ9Imh0bWxfY2FiYzZkYjQ0NWEwNGNkMWFiYjVlNzZiYmM4MDkxNjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbGljaW91cyBNaXNjaGllZjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzU3NzI1OWM2MjlkNGMxZjg2Mjk5YzA2ZWJlMWM3N2Iuc2V0Q29udGVudChodG1sX2NhYmM2ZGI0NDVhMDRjZDFhYmI1ZTc2YmJjODA5MTY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWQ5MjgzZjNiYzYzNDcwZWIzZjdjNjMyNjE2ZjhmOTAuYmluZFBvcHVwKHBvcHVwX2M1NzcyNTljNjI5ZDRjMWY4NjI5OWMwNmViZTFjNzdiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2RkOTgzYjljYTk2OTRiZDE4OTQxM2UwNGFlOGZmZDU3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc5NjczNTksLTEyMi40MjM1NDEzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wM2E5ZTUzM2IwZmE0YzI4YWNmYmY2MDBiMDVmNjYyMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZDU3NDEzYzdhMjA0YTZhYjJlY2MxYTIyMTNlMzc5ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNGQ1NzQxM2M3YTIwNGE2YWIyZWNjMWEyMjEzZTM3OWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhcmNlbnkgVGhlZnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAzYTllNTMzYjBmYTRjMjhhY2ZiZjYwMGIwNWY2NjIyLnNldENvbnRlbnQoaHRtbF80ZDU3NDEzYzdhMjA0YTZhYjJlY2MxYTIyMTNlMzc5ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RkOTgzYjljYTk2OTRiZDE4OTQxM2UwNGFlOGZmZDU3LmJpbmRQb3B1cChwb3B1cF8wM2E5ZTUzM2IwZmE0YzI4YWNmYmY2MDBiMDVmNjYyMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80ZTI5MWY4OWI0N2U0NjcxYWRiMTQ1ZTliZjFiY2ViNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTcyMDc1LC0xMjIuNDIxOTY0M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDE0MmZiNWMyNGY4NDNiMzg4OTkyYzI5MDEzY2M0MDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWE4NTA3ZGRmNWEyNGJiYWIxODM1ZjQ4NTMwZGNiN2UgPSAkKCc8ZGl2IGlkPSJodG1sXzlhODUwN2RkZjVhMjRiYmFiMTgzNWY0ODUzMGRjYjdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXJjZW55IFRoZWZ0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMTQyZmI1YzI0Zjg0M2IzODg5OTJjMjkwMTNjYzQwMy5zZXRDb250ZW50KGh0bWxfOWE4NTA3ZGRmNWEyNGJiYWIxODM1ZjQ4NTMwZGNiN2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80ZTI5MWY4OWI0N2U0NjcxYWRiMTQ1ZTliZjFiY2ViNi5iaW5kUG9wdXAocG9wdXBfMDE0MmZiNWMyNGY4NDNiMzg4OTkyYzI5MDEzY2M0MDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2UzNDlhMmIwYTI4NGZjMmJhNjlkM2NiODgzOTYzMzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTA1NjUyNCwtMTIyLjQwNTU3MzY5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MGNmYjZlZmVjMzI0ZDg2OTdjNGRiMTc4OGU2N2I1MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hODBjOGIwOGVmOTc0NTIyYWMyNTA3NzE3NDdlY2IwNyA9ICQoJzxkaXYgaWQ9Imh0bWxfYTgwYzhiMDhlZjk3NDUyMmFjMjUwNzcxNzQ3ZWNiMDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhcmNlbnkgVGhlZnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUwY2ZiNmVmZWMzMjRkODY5N2M0ZGIxNzg4ZTY3YjUzLnNldENvbnRlbnQoaHRtbF9hODBjOGIwOGVmOTc0NTIyYWMyNTA3NzE3NDdlY2IwNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NlMzQ5YTJiMGEyODRmYzJiYTY5ZDNjYjg4Mzk2MzM5LmJpbmRQb3B1cChwb3B1cF81MGNmYjZlZmVjMzI0ZDg2OTdjNGRiMTc4OGU2N2I1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jNjY4YmRjZjNmMDE0NjMxYmIxMWUyZWM1NzBhZDZmMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3MzI0Nzc5OTk5OTk5LC0xMjIuNDI4OTkwMDk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZjYjVjZjE5NjY1ZjRhOWE5NGYxNTM5NjEzMTcxNTE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVmMTc1MjBkZmYzMzRiODk4MmI0NmI4NDZkZTE2YTA2ID0gJCgnPGRpdiBpZD0iaHRtbF81ZjE3NTIwZGZmMzM0Yjg5ODJiNDZiODQ2ZGUxNmEwNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGFyY2VueSBUaGVmdDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmNiNWNmMTk2NjVmNGE5YTk0ZjE1Mzk2MTMxNzE1MTYuc2V0Q29udGVudChodG1sXzVmMTc1MjBkZmYzMzRiODk4MmI0NmI4NDZkZTE2YTA2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzY2OGJkY2YzZjAxNDYzMWJiMTFlMmVjNTcwYWQ2ZjEuYmluZFBvcHVwKHBvcHVwXzZjYjVjZjE5NjY1ZjRhOWE5NGYxNTM5NjEzMTcxNTE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzYzYTM3YzM0MDE3MDQ0ZDQ4MGZlMWRiMmUxZjUyMzA2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg0OTQ0MDEsLTEyMi40MzQ3M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjUzYzk2ZDY4YzViNDVkNjk3YjBmZmEzMjE0YjgwZDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjA4YmU3ZDM2Njc3NDBlMWE1YjQ5YzFjOGFiZDYzZDcgPSAkKCc8ZGl2IGlkPSJodG1sX2YwOGJlN2QzNjY3NzQwZTFhNWI0OWMxYzhhYmQ2M2Q3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXJjZW55IFRoZWZ0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNTNjOTZkNjhjNWI0NWQ2OTdiMGZmYTMyMTRiODBkMS5zZXRDb250ZW50KGh0bWxfZjA4YmU3ZDM2Njc3NDBlMWE1YjQ5YzFjOGFiZDYzZDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82M2EzN2MzNDAxNzA0NGQ0ODBmZTFkYjJlMWY1MjMwNi5iaW5kUG9wdXAocG9wdXBfYjUzYzk2ZDY4YzViNDVkNjk3YjBmZmEzMjE0YjgwZDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWQ3ZDc0N2I1YmViNDI4NGIzZDQ3ZTFmNGM1NTY4OTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Nzc0OTM4NCwtMTIyLjQxNjI5MTcwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYzZkNGFkN2M4MjM0MTYwYTA1MTE5MTIwNDU2ZjM3OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMmVjMDJmNGY5N2I0NDliODQwNDVkZDEzMmI3ZGI3MSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzJlYzAyZjRmOTdiNDQ5Yjg0MDQ1ZGQxMzJiN2RiNzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJ1cmdsYXJ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYzZkNGFkN2M4MjM0MTYwYTA1MTE5MTIwNDU2ZjM3OS5zZXRDb250ZW50KGh0bWxfMzJlYzAyZjRmOTdiNDQ5Yjg0MDQ1ZGQxMzJiN2RiNzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xZDdkNzQ3YjViZWI0Mjg0YjNkNDdlMWY0YzU1Njg5NC5iaW5kUG9wdXAocG9wdXBfMmM2ZDRhZDdjODIzNDE2MGEwNTExOTEyMDQ1NmYzNzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODcxNTQwMzc4OTFiNGZkYjgzMjk2OTg4MzdjYWYxMzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgzODc5MywtMTIyLjQxNTE4NTI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wOWQzNTM3ZjRlMTg0OTczYWY0N2QzODg5OGY3ZDNlNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZTA5OTM3ZTg1OTg0NzdhYjU0NTVmNWNlODQ0MTQ2YiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGUwOTkzN2U4NTk4NDc3YWI1NDU1ZjVjZTg0NDE0NmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vbi1DcmltaW5hbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDlkMzUzN2Y0ZTE4NDk3M2FmNDdkMzg4OThmN2QzZTQuc2V0Q29udGVudChodG1sXzhlMDk5MzdlODU5ODQ3N2FiNTQ1NWY1Y2U4NDQxNDZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODcxNTQwMzc4OTFiNGZkYjgzMjk2OTg4MzdjYWYxMzkuYmluZFBvcHVwKHBvcHVwXzA5ZDM1MzdmNGUxODQ5NzNhZjQ3ZDM4ODk4ZjdkM2U0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzM2ZjA4ZTVhZTdhNjRhOTA5Njg5ZGEwZTI4MjIxMTk4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzk1NTMxODMsLTEyMi40MDMzMTY5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMWQ4ZjUxYjFhM2Q0MTg4YWNkOTcxNzIyOWVhOWI3YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NTI2N2NkOThlNjI0MmQ5YmExYzQxM2NiMzY2MzQ1MSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjUyNjdjZDk4ZTYyNDJkOWJhMWM0MTNjYjM2NjM0NTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhcmNlbnkgVGhlZnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExZDhmNTFiMWEzZDQxODhhY2Q5NzE3MjI5ZWE5YjdjLnNldENvbnRlbnQoaHRtbF82NTI2N2NkOThlNjI0MmQ5YmExYzQxM2NiMzY2MzQ1MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzM2ZjA4ZTVhZTdhNjRhOTA5Njg5ZGEwZTI4MjIxMTk4LmJpbmRQb3B1cChwb3B1cF9hMWQ4ZjUxYjFhM2Q0MTg4YWNkOTcxNzIyOWVhOWI3Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xODg2N2FkYTA1Mjc0NWI2YjhhNjNmOTc5ZWZhMjBlMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NTA0NzY5LC0xMjIuNDMzOTA1MDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc3NjYzMDc0NWY2MTQyMDZiNTczYzY1MTNmYjNkM2U3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzZTNhNDI4MTc1MDRkNzI4NzI2MjUzYTYyMDRhOTNiID0gJCgnPGRpdiBpZD0iaHRtbF9hM2UzYTQyODE3NTA0ZDcyODcyNjI1M2E2MjA0YTkzYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGFyY2VueSBUaGVmdDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzc2NjMwNzQ1ZjYxNDIwNmI1NzNjNjUxM2ZiM2QzZTcuc2V0Q29udGVudChodG1sX2EzZTNhNDI4MTc1MDRkNzI4NzI2MjUzYTYyMDRhOTNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTg4NjdhZGEwNTI3NDViNmI4YTYzZjk3OWVmYTIwZTAuYmluZFBvcHVwKHBvcHVwXzc3NjYzMDc0NWY2MTQyMDZiNTczYzY1MTNmYjNkM2U3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzMyMmI4NWYxYjdiNTQ4NzRiNzExNmY2NTk1NjBkZjQ0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzkzODQzNjgsLTEyMi4zOTg4ODA0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZDJhYmM2Njc0NDA0Y2ViODZkNzg3MmQ4YTY4MjA5YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNDRlYWI5MWU4N2E0YTI1YjQzY2E4ZDQ0NWI1ZWIzYyA9ICQoJzxkaXYgaWQ9Imh0bWxfYzQ0ZWFiOTFlODdhNGEyNWI0M2NhOGQ0NDViNWViM2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJ1cmdsYXJ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZDJhYmM2Njc0NDA0Y2ViODZkNzg3MmQ4YTY4MjA5Yy5zZXRDb250ZW50KGh0bWxfYzQ0ZWFiOTFlODdhNGEyNWI0M2NhOGQ0NDViNWViM2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zMjJiODVmMWI3YjU0ODc0YjcxMTZmNjU5NTYwZGY0NC5iaW5kUG9wdXAocG9wdXBfNmQyYWJjNjY3NDQwNGNlYjg2ZDc4NzJkOGE2ODIwOWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjAyY2E4Mjk1NTNhNDFmNTk5MGU1YTkxYzNhMDU4ZWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc5OTYzMSwtMTIyLjM5MzU5NzJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I5Y2U4NThhYzg4YzQ5YWFiNWE5ZmM2ZjczMDI3YjEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3NDY3MDI3OGM0YjQzM2M5MjhhY2NjN2EyMzAwOWY2ID0gJCgnPGRpdiBpZD0iaHRtbF83NzQ2NzAyNzhjNGI0MzNjOTI4YWNjYzdhMjMwMDlmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXNzYXVsdDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjljZTg1OGFjODhjNDlhYWI1YTlmYzZmNzMwMjdiMTMuc2V0Q29udGVudChodG1sXzc3NDY3MDI3OGM0YjQzM2M5MjhhY2NjN2EyMzAwOWY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjAyY2E4Mjk1NTNhNDFmNTk5MGU1YTkxYzNhMDU4ZWIuYmluZFBvcHVwKHBvcHVwX2I5Y2U4NThhYzg4YzQ5YWFiNWE5ZmM2ZjczMDI3YjEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzcyYjNhYzBjNzVjMzQ5NThhOGM0Y2EyYTU4MzM5MDc3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1MTYwODEsLTEyMi40MDM2MzU1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80OTg3YWQ2MmI5Yzk0Y2JhOTllZGYzMDliMWIyNjE2ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MmUxZjQ2NWI1Yzg0ZTNiODA1Y2E3NzUzZWUzZGI5OCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjJlMWY0NjViNWM4NGUzYjgwNWNhNzc1M2VlM2RiOTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldhcnJhbnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ5ODdhZDYyYjljOTRjYmE5OWVkZjMwOWIxYjI2MTZmLnNldENvbnRlbnQoaHRtbF82MmUxZjQ2NWI1Yzg0ZTNiODA1Y2E3NzUzZWUzZGI5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzcyYjNhYzBjNzVjMzQ5NThhOGM0Y2EyYTU4MzM5MDc3LmJpbmRQb3B1cChwb3B1cF80OTg3YWQ2MmI5Yzk0Y2JhOTllZGYzMDliMWIyNjE2Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iMWMxMWY4ODhkZjM0NDA3ODkwMmE0MmE5MTY0NTFkYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzU3MTYsLTEyMi40MTczMzI0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YjljMzMyM2E2MGM0NDY4OTQxOWMxYjAyYjZiZTE3NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMGM3ZjE2ZTE5YzM0MTYzYmYxZmE5Y2FjNjQxMDExNyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDBjN2YxNmUxOWMzNDE2M2JmMWZhOWNhYzY0MTAxMTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk90aGVyIE1pc2NlbGxhbmVvdXM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzliOWMzMzIzYTYwYzQ0Njg5NDE5YzFiMDJiNmJlMTc3LnNldENvbnRlbnQoaHRtbF9kMGM3ZjE2ZTE5YzM0MTYzYmYxZmE5Y2FjNjQxMDExNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2IxYzExZjg4OGRmMzQ0MDc4OTAyYTQyYTkxNjQ1MWRiLmJpbmRQb3B1cChwb3B1cF85YjljMzMyM2E2MGM0NDY4OTQxOWMxYjAyYjZiZTE3Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85ZmYwOTNlYjYyYmY0YWE5OTdlNWI5MTUwNThkMGUyNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDY4MTE4LC0xMjIuNDgxMTgxMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjUyMTRiMDkwOTdkNDA0OTgxMTAyNDhjNTRhZjUyY2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmQ5YTY2NDk3Y2JjNGUyYjgxNDE0YWU2Yjk5MzY5YTIgPSAkKCc8ZGl2IGlkPSJodG1sXzJkOWE2NjQ5N2NiYzRlMmI4MTQxNGFlNmI5OTM2OWEyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PdGhlciBNaXNjZWxsYW5lb3VzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NTIxNGIwOTA5N2Q0MDQ5ODExMDI0OGM1NGFmNTJjZi5zZXRDb250ZW50KGh0bWxfMmQ5YTY2NDk3Y2JjNGUyYjgxNDE0YWU2Yjk5MzY5YTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85ZmYwOTNlYjYyYmY0YWE5OTdlNWI5MTUwNThkMGUyNy5iaW5kUG9wdXAocG9wdXBfNjUyMTRiMDkwOTdkNDA0OTgxMTAyNDhjNTRhZjUyY2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTIwMGM2Y2NjZWMyNDQ2NTgyNWI1MWQxNTc4YmQ1YjQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODY4Mjc1MywtMTIyLjQxOTkyNzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU0YTIxMDE2NzZiMDRhOGE4YjVkNTg0MTRmMjlhYTZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdlYmVkOGFkMTU2NzRlNzVhYjExN2ZlMWZhYjZkYTY0ID0gJCgnPGRpdiBpZD0iaHRtbF83ZWJlZDhhZDE1Njc0ZTc1YWIxMTdmZTFmYWI2ZGE2NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3RoZXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU0YTIxMDE2NzZiMDRhOGE4YjVkNTg0MTRmMjlhYTZiLnNldENvbnRlbnQoaHRtbF83ZWJlZDhhZDE1Njc0ZTc1YWIxMTdmZTFmYWI2ZGE2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUyMDBjNmNjY2VjMjQ0NjU4MjViNTFkMTU3OGJkNWI0LmJpbmRQb3B1cChwb3B1cF81NGEyMTAxNjc2YjA0YThhOGI1ZDU4NDE0ZjI5YWE2Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iOTY3YzYxNTY1NmQ0NzQyYWIyZWRiMTBiNTAzMWQ4MiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3Nzc3MzA3LC0xMjIuNDE2MDA5NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2IxNzU0OTcxNmQzNDIwMzk3NTM1OTc5Yzc3YThmMTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTBiYTFlMGUyNjE1NDFmZDljYzljOGZhNWFmZWNhN2QgPSAkKCc8ZGl2IGlkPSJodG1sXzkwYmExZTBlMjYxNTQxZmQ5Y2M5YzhmYTVhZmVjYTdkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GcmF1ZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2IxNzU0OTcxNmQzNDIwMzk3NTM1OTc5Yzc3YThmMTYuc2V0Q29udGVudChodG1sXzkwYmExZTBlMjYxNTQxZmQ5Y2M5YzhmYTVhZmVjYTdkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjk2N2M2MTU2NTZkNDc0MmFiMmVkYjEwYjUwMzFkODIuYmluZFBvcHVwKHBvcHVwXzdiMTc1NDk3MTZkMzQyMDM5NzUzNTk3OWM3N2E4ZjE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzZiNzljZmRjN2NhOTQ4MTY4NzA1NTdmOWIyMjA2ZmM3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzk1MTYzMzgsLTEyMi4zOTkxNDk0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MWMyMGI3OGRiZGI0NGFiODA2OGU0MWVjNzdlZWI1MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81N2JiYzlhMTBkODU0OTlhOTEyODgxZDk5NTFlOWI2YSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTdiYmM5YTEwZDg1NDk5YTkxMjg4MWQ5OTUxZTliNmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk90aGVyIE1pc2NlbGxhbmVvdXM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUxYzIwYjc4ZGJkYjQ0YWI4MDY4ZTQxZWM3N2VlYjUwLnNldENvbnRlbnQoaHRtbF81N2JiYzlhMTBkODU0OTlhOTEyODgxZDk5NTFlOWI2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZiNzljZmRjN2NhOTQ4MTY4NzA1NTdmOWIyMjA2ZmM3LmJpbmRQb3B1cChwb3B1cF81MWMyMGI3OGRiZGI0NGFiODA2OGU0MWVjNzdlZWI1MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mM2E3ZmE0ZmNiNzM0ZjQzYTY0NTQ5MWUzZmVmNDYxYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjQ1NzEsLTEyMi4zOTI4NDE2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMmUxM2U3ZDU4ODM0YTMxODdiNjdkZDBjZmMzNzRmMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MzYyYTgzZDQwZWY0MjAyYjliNTU0MmEwZDEzNTExZiA9ICQoJzxkaXYgaWQ9Imh0bWxfODM2MmE4M2Q0MGVmNDIwMmI5YjU1NDJhMGQxMzUxMWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1vdG9yIFZlaGljbGUgVGhlZnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEyZTEzZTdkNTg4MzRhMzE4N2I2N2RkMGNmYzM3NGYxLnNldENvbnRlbnQoaHRtbF84MzYyYTgzZDQwZWY0MjAyYjliNTU0MmEwZDEzNTExZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2YzYTdmYTRmY2I3MzRmNDNhNjQ1NDkxZTNmZWY0NjFiLmJpbmRQb3B1cChwb3B1cF8xMmUxM2U3ZDU4ODM0YTMxODdiNjdkZDBjZmMzNzRmMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80NTcxZjU4MjZkNWQ0YTE5YjZlZDNjMjRiNGE3ZTNhZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0ODAzMDYyLC0xMjIuNDkwMDA4OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTU1ZWJjNDY3Zjk3NDNlNGI2NDdmYmEwMjI0ZTQxYzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTkwMzQzYTgzMDJiNDVhYWEwYmU3Zjc3ZWI2NzhmOWQgPSAkKCc8ZGl2IGlkPSJodG1sXzk5MDM0M2E4MzAyYjQ1YWFhMGJlN2Y3N2ViNjc4ZjlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYWxpY2lvdXMgTWlzY2hpZWY8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU1NWViYzQ2N2Y5NzQzZTRiNjQ3ZmJhMDIyNGU0MWM2LnNldENvbnRlbnQoaHRtbF85OTAzNDNhODMwMmI0NWFhYTBiZTdmNzdlYjY3OGY5ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ1NzFmNTgyNmQ1ZDRhMTliNmVkM2MyNGI0YTdlM2FlLmJpbmRQb3B1cChwb3B1cF81NTVlYmM0NjdmOTc0M2U0YjY0N2ZiYTAyMjRlNDFjNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hMmIwYmJhYTkwNTI0MTI0YTkwOWExMzhlYWFlNmE3MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NjIyMTM2LC0xMjIuNDExNjA2MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDNmYjZhNDM3MDZhNGNkNDkzN2ZkMzUxYTIwNDdiNDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmJlODE3YzJlMmY5NGEyYmI5NDJmNDU4ZTc0YjE1MGMgPSAkKCc8ZGl2IGlkPSJodG1sX2JiZTgxN2MyZTJmOTRhMmJiOTQyZjQ1OGU3NGIxNTBjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Bc3NhdWx0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wM2ZiNmE0MzcwNmE0Y2Q0OTM3ZmQzNTFhMjA0N2I0OS5zZXRDb250ZW50KGh0bWxfYmJlODE3YzJlMmY5NGEyYmI5NDJmNDU4ZTc0YjE1MGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hMmIwYmJhYTkwNTI0MTI0YTkwOWExMzhlYWFlNmE3My5iaW5kUG9wdXAocG9wdXBfMDNmYjZhNDM3MDZhNGNkNDkzN2ZkMzUxYTIwNDdiNDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNWY2NjVjNTFjNDliNDk2YWE5MzgxMmU3MGEyM2EwZmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Nzk5OTE3NCwtMTIyLjQxMzQ4NzQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kOWNjOTU2ZjM0OTk0NzExYjgyMzgwMjQ0MDk3YTgzMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNzRjMmFmZWVkYjc0M2ExODk5MWFkN2M0ZWVhNWE4OCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTc0YzJhZmVlZGI3NDNhMTg5OTFhZDdjNGVlYTVhODgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk90aGVyIE9mZmVuc2VzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOWNjOTU2ZjM0OTk0NzExYjgyMzgwMjQ0MDk3YTgzMy5zZXRDb250ZW50KGh0bWxfYTc0YzJhZmVlZGI3NDNhMTg5OTFhZDdjNGVlYTVhODgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81ZjY2NWM1MWM0OWI0OTZhYTkzODEyZTcwYTIzYTBmZS5iaW5kUG9wdXAocG9wdXBfZDljYzk1NmYzNDk5NDcxMWI4MjM4MDI0NDA5N2E4MzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjdjMDI2N2I1Yjc1NDg4MjkwODQ2YzIzYTBlNmQxODcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTk1NTkxMywtMTIyLjQwNDAxMDU5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZTlkNjgzZjQ2NmQ0ZDU1OTlkODI1NmRmM2YwNzkzNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iOTY1Mjk3YzdlZDE0Y2QzODk2YTliYTg4YzY2YzEwZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjk2NTI5N2M3ZWQxNGNkMzg5NmE5YmE4OGM2NmMxMGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlY292ZXJlZCBWZWhpY2xlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZTlkNjgzZjQ2NmQ0ZDU1OTlkODI1NmRmM2YwNzkzNi5zZXRDb250ZW50KGh0bWxfYjk2NTI5N2M3ZWQxNGNkMzg5NmE5YmE4OGM2NmMxMGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mN2MwMjY3YjViNzU0ODgyOTA4NDZjMjNhMGU2ZDE4Ny5iaW5kUG9wdXAocG9wdXBfM2U5ZDY4M2Y0NjZkNGQ1NTk5ZDgyNTZkZjNmMDc5MzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTNjNjM5NTg1YjlkNGNlNThiYTM0YjgxODU2YjNmZjkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM0NTcwMSwtMTIyLjQ1NDExNTgwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNTRlOTI3YzZjODM0YjQ2YjFkNTA5ZjIyNzRiY2E3NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81M2VhMDE1YjBhZTY0OGRmOGQ3NjNjN2NhYThmM2I1MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTNlYTAxNWIwYWU2NDhkZjhkNzYzYzdjYWE4ZjNiNTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhcmNlbnkgVGhlZnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U1NGU5MjdjNmM4MzRiNDZiMWQ1MDlmMjI3NGJjYTc1LnNldENvbnRlbnQoaHRtbF81M2VhMDE1YjBhZTY0OGRmOGQ3NjNjN2NhYThmM2I1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkzYzYzOTU4NWI5ZDRjZTU4YmEzNGI4MTg1NmIzZmY5LmJpbmRQb3B1cChwb3B1cF9lNTRlOTI3YzZjODM0YjQ2YjFkNTA5ZjIyNzRiY2E3NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82NjEwZDNjYjg3NTU0M2IyODQzYmVmYzBlODg0M2JiMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3OTk5MTc0LC0xMjIuNDEzNDg3NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljZDliNWYyZWRjMTQ5NzJiNGQyOGQzMjM1M2Y1ODJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E2ZjU5ZWQ0ZTllMzQxMTM4MjExY2QwMGM5MDc1N2Y1ID0gJCgnPGRpdiBpZD0iaHRtbF9hNmY1OWVkNGU5ZTM0MTEzODIxMWNkMDBjOTA3NTdmNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9iYmVyeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWNkOWI1ZjJlZGMxNDk3MmI0ZDI4ZDMyMzUzZjU4MmUuc2V0Q29udGVudChodG1sX2E2ZjU5ZWQ0ZTllMzQxMTM4MjExY2QwMGM5MDc1N2Y1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjYxMGQzY2I4NzU1NDNiMjg0M2JlZmMwZTg4NDNiYjEuYmluZFBvcHVwKHBvcHVwXzljZDliNWYyZWRjMTQ5NzJiNGQyOGQzMjM1M2Y1ODJlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2JiMzAxYTgyODAwODQwYjQ5NTE2OTIyMmIzMjUzOTNiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUyMjA0NDQsLTEyMi40MTkwMTc1MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGRhYTg5M2M2OTU2NGZmYjkyMjU4ZjVmYTM1NDI0YWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDIyY2Y2MzQwMGY5NGQ0MTg5YmM1OTA3M2Q2NTlhM2UgPSAkKCc8ZGl2IGlkPSJodG1sX2QyMmNmNjM0MDBmOTRkNDE4OWJjNTkwNzNkNjU5YTNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Mb3N0IFByb3BlcnR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZGFhODkzYzY5NTY0ZmZiOTIyNThmNWZhMzU0MjRhZi5zZXRDb250ZW50KGh0bWxfZDIyY2Y2MzQwMGY5NGQ0MTg5YmM1OTA3M2Q2NTlhM2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iYjMwMWE4MjgwMDg0MGI0OTUxNjkyMjJiMzI1MzkzYi5iaW5kUG9wdXAocG9wdXBfNGRhYTg5M2M2OTU2NGZmYjkyMjU4ZjVmYTM1NDI0YWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTMwYzdiZjNmYjllNDM5MjlmNzdkNDUyOTgyYjA2MGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODE1OTg4MiwtMTIyLjQ1NDE3Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWJmMjZiZDE5NDIwNDZjYTk1ZWE1NDQ0ZTUzN2ViMzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWQwMjBlNGQzMTZhNDQwM2EwZWI0YWExNDNmZTc4MzAgPSAkKCc8ZGl2IGlkPSJodG1sX2FkMDIwZTRkMzE2YTQ0MDNhMGViNGFhMTQzZmU3ODMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXJjZW55IFRoZWZ0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YmYyNmJkMTk0MjA0NmNhOTVlYTU0NDRlNTM3ZWIzMC5zZXRDb250ZW50KGh0bWxfYWQwMjBlNGQzMTZhNDQwM2EwZWI0YWExNDNmZTc4MzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81MzBjN2JmM2ZiOWU0MzkyOWY3N2Q0NTI5ODJiMDYwYi5iaW5kUG9wdXAocG9wdXBfNWJmMjZiZDE5NDIwNDZjYTk1ZWE1NDQ0ZTUzN2ViMzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTA5M2FkOTdjMGY1NGRmOGFiMWM2YTc2MjQxM2I5ZGMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDU0MDk1NCwtMTIyLjUwNzAzMDVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY3ZjE4MzNiYjA2ZDQwYmY5ZjBhOGEzNTg4YThiMjVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZmNmI3MjQzNGFiYjQ4Yjg4OGJkNTg5MzIxMGVjYzk2ID0gJCgnPGRpdiBpZD0iaHRtbF82ZjZiNzI0MzRhYmI0OGI4ODhiZDU4OTMyMTBlY2M5NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW90b3IgVmVoaWNsZSBUaGVmdDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjdmMTgzM2JiMDZkNDBiZjlmMGE4YTM1ODhhOGIyNWQuc2V0Q29udGVudChodG1sXzZmNmI3MjQzNGFiYjQ4Yjg4OGJkNTg5MzIxMGVjYzk2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTA5M2FkOTdjMGY1NGRmOGFiMWM2YTc2MjQxM2I5ZGMuYmluZFBvcHVwKHBvcHVwXzY3ZjE4MzNiYjA2ZDQwYmY5ZjBhOGEzNTg4YThiMjVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Q2M2Q2MTQ5YWFhMTRmNjM5MmY2OTI3NjcwN2IxMmVlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0MDIxMzQsLTEyMi4zOTM3Mjk3OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGZjZmUyNTVjMDQ3NDAyOTg2ZDdhYWJkYjA4ZmQ5ZTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWYwMDYxOTQ4ZGM3NDQzZGI5NjExMzAxNjcxNTFlZTMgPSAkKCc8ZGl2IGlkPSJodG1sX2FmMDA2MTk0OGRjNzQ0M2RiOTYxMTMwMTY3MTUxZWUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXJyYW50PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZmNmZTI1NWMwNDc0MDI5ODZkN2FhYmRiMDhmZDllNi5zZXRDb250ZW50KGh0bWxfYWYwMDYxOTQ4ZGM3NDQzZGI5NjExMzAxNjcxNTFlZTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kNjNkNjE0OWFhYTE0ZjYzOTJmNjkyNzY3MDdiMTJlZS5iaW5kUG9wdXAocG9wdXBfNGZjZmUyNTVjMDQ3NDAyOTg2ZDdhYWJkYjA4ZmQ5ZTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTM2MGViOTBiNWY5NDczMTg5ZGI1ODNkZDMzZGMyMjkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODAzMzQ2OSwtMTIyLjQ3OTM4MzAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NTgwYTZmZTIxMjc0MjY2OGM3NzQ3MjI3NTNjMmQ5YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iM2MzN2VkMDYxYWM0OTYxOTU3YmFlMDRkYzQ4MjlkYiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjNjMzdlZDA2MWFjNDk2MTk1N2JhZTA0ZGM0ODI5ZGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vbi1DcmltaW5hbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODU4MGE2ZmUyMTI3NDI2NjhjNzc0NzIyNzUzYzJkOWEuc2V0Q29udGVudChodG1sX2IzYzM3ZWQwNjFhYzQ5NjE5NTdiYWUwNGRjNDgyOWRiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTM2MGViOTBiNWY5NDczMTg5ZGI1ODNkZDMzZGMyMjkuYmluZFBvcHVwKHBvcHVwXzg1ODBhNmZlMjEyNzQyNjY4Yzc3NDcyMjc1M2MyZDlhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2UzYTFlMTdiZDlkMTRkOGVhNTBjYmI5ZDliOGQ5ZDFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuODA1Mjg2OTgsLTEyMi40MjM2NTUxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNTUzNDEzMDEwY2I0ZTFhYWM0NTIyZDZmZTQxY2JjYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80M2Q1OGRhYTVmZWY0YTdmYjI4ZjAyNTU1ZTA3OTc1ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDNkNThkYWE1ZmVmNGE3ZmIyOGYwMjU1NWUwNzk3NWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhcmNlbnkgVGhlZnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E1NTM0MTMwMTBjYjRlMWFhYzQ1MjJkNmZlNDFjYmNiLnNldENvbnRlbnQoaHRtbF80M2Q1OGRhYTVmZWY0YTdmYjI4ZjAyNTU1ZTA3OTc1Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2UzYTFlMTdiZDlkMTRkOGVhNTBjYmI5ZDliOGQ5ZDFjLmJpbmRQb3B1cChwb3B1cF9hNTUzNDEzMDEwY2I0ZTFhYWM0NTIyZDZmZTQxY2JjYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lZmU5NTk1OGEyYjA0ZWNkOWM2MjJjMDdjYjc3ZGUyMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDI0NTE0LC0xMjIuNDMxMTc5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTMxYjQwMGQxYjBlNGIzZjg2MWRiY2FhYjNhZDY5ZjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTc3ZjM3M2QyODQ4NGZmMWFjYzk3YTBlZWQyY2E4ZDUgPSAkKCc8ZGl2IGlkPSJodG1sXzE3N2YzNzNkMjg0ODRmZjFhY2M5N2EwZWVkMmNhOGQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdXNwaWNpb3VzIE9jYzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTMxYjQwMGQxYjBlNGIzZjg2MWRiY2FhYjNhZDY5Zjkuc2V0Q29udGVudChodG1sXzE3N2YzNzNkMjg0ODRmZjFhY2M5N2EwZWVkMmNhOGQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWZlOTU5NThhMmIwNGVjZDljNjIyYzA3Y2I3N2RlMjIuYmluZFBvcHVwKHBvcHVwXzUzMWI0MDBkMWIwZTRiM2Y4NjFkYmNhYWIzYWQ2OWY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzk5MTFjMzkxN2EwODQxMWJiZTYxZTQ2NGNiMzQ0MTY0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzMTI5OTYsLTEyMi40MzU5NzY5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTUyMzI2MmZmYjE4NDk0YjhmM2EyOWU4MThjMDE5ODkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2ZiOWVjMjc1YjI5NDY3MmE0NTE3ZGQ5MzYxNTM0MTEgPSAkKCc8ZGl2IGlkPSJodG1sXzNmYjllYzI3NWIyOTQ2NzJhNDUxN2RkOTM2MTUzNDExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EcnVnIE9mZmVuc2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE1MjMyNjJmZmIxODQ5NGI4ZjNhMjllODE4YzAxOTg5LnNldENvbnRlbnQoaHRtbF8zZmI5ZWMyNzViMjk0NjcyYTQ1MTdkZDkzNjE1MzQxMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzk5MTFjMzkxN2EwODQxMWJiZTYxZTQ2NGNiMzQ0MTY0LmJpbmRQb3B1cChwb3B1cF8xNTIzMjYyZmZiMTg0OTRiOGYzYTI5ZTgxOGMwMTk4OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wOTQ4MmQ4ZjhlYWY0MDNmOThmNjQ3YjZkMWQyZDJkNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQxNjg2LC0xMjIuNDM0NDgzMjk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4NmY0Mjk2NmRjODQ1YmI4MjRiYTliYTlkYjEyMWE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y5ZjEwZmYyODdiYzRhZDI5MTNjYjE4NzljZWRhNjJlID0gJCgnPGRpdiBpZD0iaHRtbF9mOWYxMGZmMjg3YmM0YWQyOTEzY2IxODc5Y2VkYTYyZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3RoZXIgTWlzY2VsbGFuZW91czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTg2ZjQyOTY2ZGM4NDViYjgyNGJhOWJhOWRiMTIxYTYuc2V0Q29udGVudChodG1sX2Y5ZjEwZmYyODdiYzRhZDI5MTNjYjE4NzljZWRhNjJlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDk0ODJkOGY4ZWFmNDAzZjk4ZjY0N2I2ZDFkMmQyZDUuYmluZFBvcHVwKHBvcHVwXzE4NmY0Mjk2NmRjODQ1YmI4MjRiYTliYTlkYjEyMWE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzFmZjE4ZmM0NDMzZDRhNzBhZWRlOTU5ZTllNTBmZTllID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI0NDYwNjksLTEyMi40MDU1NzE2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZmYzNWU5NDg5YmY0ZTFkOTcyNjY2ODE0YjVhMDAzMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zOWYwNGNkNGUxNDE0Y2MzYTIzNzMwMGQ5NGE4MDc4ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzlmMDRjZDRlMTQxNGNjM2EyMzczMDBkOTRhODA3OGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlY292ZXJlZCBWZWhpY2xlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZmYzNWU5NDg5YmY0ZTFkOTcyNjY2ODE0YjVhMDAzMC5zZXRDb250ZW50KGh0bWxfMzlmMDRjZDRlMTQxNGNjM2EyMzczMDBkOTRhODA3OGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xZmYxOGZjNDQzM2Q0YTcwYWVkZTk1OWU5ZTUwZmU5ZS5iaW5kUG9wdXAocG9wdXBfY2ZmMzVlOTQ4OWJmNGUxZDk3MjY2NjgxNGI1YTAwMzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDE5NzYxN2ZhMjMwNDNlYzg2ZjM0ZWEwY2VmMjdmMDEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzIzNTIxNSwtMTIyLjM4NDQ5NTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRhODdkMDE2ZjQ0NjQ5MjM4NTg5MjNhODNkZDdkZjM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FhYTBjNGYyYjVjMjQxNmViMWNlZjdmOTU0OWRlNTNhID0gJCgnPGRpdiBpZD0iaHRtbF9hYWEwYzRmMmI1YzI0MTZlYjFjZWY3Zjk1NDlkZTUzYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3RoZXIgTWlzY2VsbGFuZW91czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGE4N2QwMTZmNDQ2NDkyMzg1ODkyM2E4M2RkN2RmMzcuc2V0Q29udGVudChodG1sX2FhYTBjNGYyYjVjMjQxNmViMWNlZjdmOTU0OWRlNTNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDE5NzYxN2ZhMjMwNDNlYzg2ZjM0ZWEwY2VmMjdmMDEuYmluZFBvcHVwKHBvcHVwXzRhODdkMDE2ZjQ0NjQ5MjM4NTg5MjNhODNkZDdkZjM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQ2NzI4YTNhYjYzYTRhMGFiZDY2MDU3MmZkZjNjNDc5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzk2OTI2NDMsLTEyMi4zOTk1MDc1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82OGJmZGFiOTY0MGQ0OTc3OWNlODA3MDM4NzU2NzM0OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZjQwYzlhYWNlZTc0ODU5YmUxMzYwM2VhNmE3MWFiNyA9ICQoJzxkaXYgaWQ9Imh0bWxfNGY0MGM5YWFjZWU3NDg1OWJlMTM2MDNlYTZhNzFhYjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1c3BpY2lvdXMgT2NjPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OGJmZGFiOTY0MGQ0OTc3OWNlODA3MDM4NzU2NzM0OS5zZXRDb250ZW50KGh0bWxfNGY0MGM5YWFjZWU3NDg1OWJlMTM2MDNlYTZhNzFhYjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80NjcyOGEzYWI2M2E0YTBhYmQ2NjA1NzJmZGYzYzQ3OS5iaW5kUG9wdXAocG9wdXBfNjhiZmRhYjk2NDBkNDk3NzljZTgwNzAzODc1NjczNDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDdhZTBlNGM0M2E5NGRjNzgwZjVhYTJjNTkyMzA5OWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzM0NTU0NiwtMTIyLjQyNzM1NzRdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwYTY3MzM0NDU1ZTQxZjI5NzBiNzIyMDYxOTU1MjczID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgwNjNlOWYwMzA2MDQ1YTlhNzM3Y2JiMTViOTZiNzQxID0gJCgnPGRpdiBpZD0iaHRtbF84MDYzZTlmMDMwNjA0NWE5YTczN2NiYjE1Yjk2Yjc0MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnVyZ2xhcnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAwYTY3MzM0NDU1ZTQxZjI5NzBiNzIyMDYxOTU1MjczLnNldENvbnRlbnQoaHRtbF84MDYzZTlmMDMwNjA0NWE5YTczN2NiYjE1Yjk2Yjc0MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ3YWUwZTRjNDNhOTRkYzc4MGY1YWEyYzU5MjMwOTljLmJpbmRQb3B1cChwb3B1cF8wMGE2NzMzNDQ1NWU0MWYyOTcwYjcyMjA2MTk1NTI3Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83ZjgyNjRmZDQ4ZmQ0ZWQ2YTQxNTFlMDg3ZTkwM2QwZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NDUzMDkyLC0xMjIuNDM4MDE5N10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTEyZWQ5YWUwOGU3NGVmZjg3NDNmNjZhNjVmMjI5NDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTRiZjAwNDk0YjRjNGJmOGE2OTUzMmE5YTIzZGZiMDAgPSAkKCc8ZGl2IGlkPSJodG1sX2E0YmYwMDQ5NGI0YzRiZjhhNjk1MzJhOWEyM2RmYjAwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXJjZW55IFRoZWZ0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMTJlZDlhZTA4ZTc0ZWZmODc0M2Y2NmE2NWYyMjk0MS5zZXRDb250ZW50KGh0bWxfYTRiZjAwNDk0YjRjNGJmOGE2OTUzMmE5YTIzZGZiMDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83ZjgyNjRmZDQ4ZmQ0ZWQ2YTQxNTFlMDg3ZTkwM2QwZi5iaW5kUG9wdXAocG9wdXBfMTEyZWQ5YWUwOGU3NGVmZjg3NDNmNjZhNjVmMjI5NDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzA3NzI0MWFmODU5NDcwYThlMzZhZDhlNjcxODZiZjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTQ5NjIyNywtMTIyLjQyNjYzNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjU4MjhiMjVjZTJmNDJiMmExMmQ3YWEwZjg3OTVkNWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2VlZjVkYzMyNWYwNDUzYmE1OGY5MTNmZGM4ZjI3ZTMgPSAkKCc8ZGl2IGlkPSJodG1sXzdlZWY1ZGMzMjVmMDQ1M2JhNThmOTEzZmRjOGYyN2UzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXJnbGFyeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjU4MjhiMjVjZTJmNDJiMmExMmQ3YWEwZjg3OTVkNWQuc2V0Q29udGVudChodG1sXzdlZWY1ZGMzMjVmMDQ1M2JhNThmOTEzZmRjOGYyN2UzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzA3NzI0MWFmODU5NDcwYThlMzZhZDhlNjcxODZiZjYuYmluZFBvcHVwKHBvcHVwX2Y1ODI4YjI1Y2UyZjQyYjJhMTJkN2FhMGY4Nzk1ZDVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2QzNmU4Y2Y3ZWUwNTQxOWY5ZjRiN2RhM2M3MzJiMjcxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI5OTMwNTksLTEyMi40MzAxMTA5MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGJjMDg1MmM0ODAzNDIyZGI2ZDQ5ZmMzY2M2ZjYyY2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODBkNzk0NWM4NGYzNGMzMWI0Njg0NTc3YjQzYjU2MGQgPSAkKCc8ZGl2IGlkPSJodG1sXzgwZDc5NDVjODRmMzRjMzFiNDY4NDU3N2I0M2I1NjBkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXJnbGFyeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGJjMDg1MmM0ODAzNDIyZGI2ZDQ5ZmMzY2M2ZjYyY2Uuc2V0Q29udGVudChodG1sXzgwZDc5NDVjODRmMzRjMzFiNDY4NDU3N2I0M2I1NjBkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDM2ZThjZjdlZTA1NDE5ZjlmNGI3ZGEzYzczMmIyNzEuYmluZFBvcHVwKHBvcHVwXzBiYzA4NTJjNDgwMzQyMmRiNmQ0OWZjM2NjNmY2MmNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI4NzhjNzFlNjdkMzQzZjk4MDg5ZDc3NDU1ZDk5ZGRjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg0NTcyNzgsLTEyMi40Njk5MDc5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTI1NjdkNmRlMWY0NDcyNjk5MTNhZWI4NWMxYTcyYTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTAwZWViMDY3NWE2NGQ4ZGIxNmM5ZGFjMmY3YjRlZDggPSAkKCc8ZGl2IGlkPSJodG1sXzUwMGVlYjA2NzVhNjRkOGRiMTZjOWRhYzJmN2I0ZWQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GcmF1ZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTI1NjdkNmRlMWY0NDcyNjk5MTNhZWI4NWMxYTcyYTUuc2V0Q29udGVudChodG1sXzUwMGVlYjA2NzVhNjRkOGRiMTZjOWRhYzJmN2I0ZWQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjg3OGM3MWU2N2QzNDNmOTgwODlkNzc0NTVkOTlkZGMuYmluZFBvcHVwKHBvcHVwXzUyNTY3ZDZkZTFmNDQ3MjY5OTEzYWViODVjMWE3MmE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2U4YmNiNmUyMDk1MjRlODc5MGVjNTNiNmE4MTg0ZTUyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg0NTQ2NjEsLTEyMi40MjI4MzgxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNDNmNWE5OGNjMmY0YjM0YjI1M2M4YWRhM2M3OTllMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNzMyMjczNTk3MWY0MDI2YTExNWM2YTI5YTM3NmUyYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjczMjI3MzU5NzFmNDAyNmExMTVjNmEyOWEzNzZlMmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhcmNlbnkgVGhlZnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA0M2Y1YTk4Y2MyZjRiMzRiMjUzYzhhZGEzYzc5OWUzLnNldENvbnRlbnQoaHRtbF9mNzMyMjczNTk3MWY0MDI2YTExNWM2YTI5YTM3NmUyYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U4YmNiNmUyMDk1MjRlODc5MGVjNTNiNmE4MTg0ZTUyLmJpbmRQb3B1cChwb3B1cF8wNDNmNWE5OGNjMmY0YjM0YjI1M2M4YWRhM2M3OTllMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84MTZlNjkzYWFjMWE0NTJmYWYwODJjNDM3OTIzZDJmOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MzI4Nzg1LC0xMjIuNDA4OTUyMjAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzViMWZhMzE3NzNlZjRhODJhNzBjOTJlZmYxZjA4MmMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RjMzU1MDllYjdlYzQyYTE4ZWY3YTliYTE4YjdkN2Q5ID0gJCgnPGRpdiBpZD0iaHRtbF9kYzM1NTA5ZWI3ZWM0MmExOGVmN2E5YmExOGI3ZDdkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3RoZXIgTWlzY2VsbGFuZW91czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWIxZmEzMTc3M2VmNGE4MmE3MGM5MmVmZjFmMDgyYzMuc2V0Q29udGVudChodG1sX2RjMzU1MDllYjdlYzQyYTE4ZWY3YTliYTE4YjdkN2Q5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODE2ZTY5M2FhYzFhNDUyZmFmMDgyYzQzNzkyM2QyZjkuYmluZFBvcHVwKHBvcHVwXzViMWZhMzE3NzNlZjRhODJhNzBjOTJlZmYxZjA4MmMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2ZlZDU3MTE2MTk0MjQwYWI5YmQ0YzIwM2I5NGRlNWNmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzNDU3MDEsLTEyMi40NTQxMTU4MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDUxZDViNWYyNmFlNGNiN2E1NGQ2ZmE1YjcyM2RlN2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2ZkNDg1OGFiOTU0NDBhOWIzY2Q4YTU0YWQ1YmEzNDAgPSAkKCc8ZGl2IGlkPSJodG1sXzNmZDQ4NThhYjk1NDQwYTliM2NkOGE1NGFkNWJhMzQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Bc3NhdWx0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNTFkNWI1ZjI2YWU0Y2I3YTU0ZDZmYTViNzIzZGU3Yy5zZXRDb250ZW50KGh0bWxfM2ZkNDg1OGFiOTU0NDBhOWIzY2Q4YTU0YWQ1YmEzNDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mZWQ1NzExNjE5NDI0MGFiOWJkNGMyMDNiOTRkZTVjZi5iaW5kUG9wdXAocG9wdXBfMDUxZDViNWYyNmFlNGNiN2E1NGQ2ZmE1YjcyM2RlN2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWFkNjQ2OGVhYjlkNGU2ZmIyMjYxNjkzMTZiMDM3NmEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgyMjI3LC0xMjIuNDIwMjEwNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDhjM2I5N2RmNzk3NDEzNDkwNGIzY2QwY2EzNzA1ODcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDc2M2U4MDlkZjM2NDJjNjkxZjM4YzRhOGEwZWZlOWYgPSAkKCc8ZGl2IGlkPSJodG1sXzA3NjNlODA5ZGYzNjQyYzY5MWYzOGM0YThhMGVmZTlmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Mb3N0IFByb3BlcnR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wOGMzYjk3ZGY3OTc0MTM0OTA0YjNjZDBjYTM3MDU4Ny5zZXRDb250ZW50KGh0bWxfMDc2M2U4MDlkZjM2NDJjNjkxZjM4YzRhOGEwZWZlOWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hYWQ2NDY4ZWFiOWQ0ZTZmYjIyNjE2OTMxNmIwMzc2YS5iaW5kUG9wdXAocG9wdXBfMDhjM2I5N2RmNzk3NDEzNDkwNGIzY2QwY2EzNzA1ODcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzViYWI1NzZhMTkzNDJkMGEwNTM0MjdlYjdkOGI1YzEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTAzMjE4OSwtMTIyLjQwNzUwMDQ5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mOTIyZTRjZGU5MjA0NTQyYWJlMzcxZTQ2NTE5OWJlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYTgzMzkwZTk1NDQ0ZDZiOGY3NmIyZjJhNTFlMzI4MSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWE4MzM5MGU5NTQ0NGQ2YjhmNzZiMmYyYTUxZTMyODEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRyYWZmaWMgVmlvbGF0aW9uIEFycmVzdDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjkyMmU0Y2RlOTIwNDU0MmFiZTM3MWU0NjUxOTliZWQuc2V0Q29udGVudChodG1sX2VhODMzOTBlOTU0NDRkNmI4Zjc2YjJmMmE1MWUzMjgxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzViYWI1NzZhMTkzNDJkMGEwNTM0MjdlYjdkOGI1YzEuYmluZFBvcHVwKHBvcHVwX2Y5MjJlNGNkZTkyMDQ1NDJhYmUzNzFlNDY1MTk5YmVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI2MjJjYjYyMDVjZDQ3YTBhNjY2NDg2MzU5YzAxYzlhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY1MTgzMTMsLTEyMi40MTc0ODY1OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWY5OWY1NWYzMTFmNGQyMWEwMzcwMWM3ZmZkOGY3NTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzI5OTFlYmU3M2U2NDFmYjlkMTIyNTQ1ZjNlYzViMDggPSAkKCc8ZGl2IGlkPSJodG1sX2MyOTkxZWJlNzNlNjQxZmI5ZDEyMjU0NWYzZWM1YjA4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GcmF1ZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWY5OWY1NWYzMTFmNGQyMWEwMzcwMWM3ZmZkOGY3NTcuc2V0Q29udGVudChodG1sX2MyOTkxZWJlNzNlNjQxZmI5ZDEyMjU0NWYzZWM1YjA4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjYyMmNiNjIwNWNkNDdhMGE2NjY0ODYzNTljMDFjOWEuYmluZFBvcHVwKHBvcHVwX2VmOTlmNTVmMzExZjRkMjFhMDM3MDFjN2ZmZDhmNzU3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhkOGRjNTU2ZjM2ZTRjMTdiYjNhYTI0YjUxZjdmMDY2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0MDMyNzMsLTEyMi41MDk0MDIyMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTliNzVkMDc4ZTVkNDg0M2EzMTg3ZTNkYWQyNzY2ODAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2JkMGI0MjJlMmM0NGVhYjk0NTdiY2JkMWYwZDk0MGMgPSAkKCc8ZGl2IGlkPSJodG1sX2NiZDBiNDIyZTJjNDRlYWI5NDU3YmNiZDFmMGQ5NDBjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWNvdmVyZWQgVmVoaWNsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTliNzVkMDc4ZTVkNDg0M2EzMTg3ZTNkYWQyNzY2ODAuc2V0Q29udGVudChodG1sX2NiZDBiNDIyZTJjNDRlYWI5NDU3YmNiZDFmMGQ5NDBjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGQ4ZGM1NTZmMzZlNGMxN2JiM2FhMjRiNTFmN2YwNjYuYmluZFBvcHVwKHBvcHVwXzE5Yjc1ZDA3OGU1ZDQ4NDNhMzE4N2UzZGFkMjc2NjgwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzFjN2ZkZWVhNTM2MDQxNzE5OWFlMTY2NDhmMzk1N2UzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI1MTc1NDgsLTEyMi40MzQ0MjU2OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjNjNDFiMzdlMGQ0NDc2NzkzYTViNDEyZTYxZjFkNGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODRmMjVkNDRjMmY1NGY5YWEyYzFiZDJiZTc5MjY1ZDIgPSAkKCc8ZGl2IGlkPSJodG1sXzg0ZjI1ZDQ0YzJmNTRmOWFhMmMxYmQyYmU3OTI2NWQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PdGhlciBNaXNjZWxsYW5lb3VzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mM2M0MWIzN2UwZDQ0NzY3OTNhNWI0MTJlNjFmMWQ0ZC5zZXRDb250ZW50KGh0bWxfODRmMjVkNDRjMmY1NGY5YWEyYzFiZDJiZTc5MjY1ZDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xYzdmZGVlYTUzNjA0MTcxOTlhZTE2NjQ4ZjM5NTdlMy5iaW5kUG9wdXAocG9wdXBfZjNjNDFiMzdlMGQ0NDc2NzkzYTViNDEyZTYxZjFkNGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmUzNmUzOWU1ODJlNDk5NGJkNjg5MzRjYWRmODEwYjAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA3MDA1NiwtMTIyLjM5NTA2NDk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85OWU2NzI3YmJhZmU0ZDNlOThhMjc3ZWJmNDFlNDBkYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zOGEwNWYxYWUzMjE0NmM1YTYzMmQ1M2M4YjFkYjI1NiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzhhMDVmMWFlMzIxNDZjNWE2MzJkNTNjOGIxZGIyNTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvYmJlcnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5ZTY3MjdiYmFmZTRkM2U5OGEyNzdlYmY0MWU0MGRjLnNldENvbnRlbnQoaHRtbF8zOGEwNWYxYWUzMjE0NmM1YTYzMmQ1M2M4YjFkYjI1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZlMzZlMzllNTgyZTQ5OTRiZDY4OTM0Y2FkZjgxMGIwLmJpbmRQb3B1cChwb3B1cF85OWU2NzI3YmJhZmU0ZDNlOThhMjc3ZWJmNDFlNDBkYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80MmE1ZGU0OTNmNTc0ZDA4ODU4MjhlOWYzYmRhMjcxMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MzI5MjU5LC0xMjIuNDMyNzA2Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDg5Y2ExOTdlM2M0NDdkODgyMDU1YzBlMDBhOTYwZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDA5YWE2ODMyOTlkNGViNTk2MTE4NGIxZTE0NTNhYWYgPSAkKCc8ZGl2IGlkPSJodG1sXzAwOWFhNjgzMjk5ZDRlYjU5NjExODRiMWUxNDUzYWFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXJjZW55IFRoZWZ0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kODljYTE5N2UzYzQ0N2Q4ODIwNTVjMGUwMGE5NjBkYi5zZXRDb250ZW50KGh0bWxfMDA5YWE2ODMyOTlkNGViNTk2MTE4NGIxZTE0NTNhYWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80MmE1ZGU0OTNmNTc0ZDA4ODU4MjhlOWYzYmRhMjcxMS5iaW5kUG9wdXAocG9wdXBfZDg5Y2ExOTdlM2M0NDdkODgyMDU1YzBlMDBhOTYwZGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODVlY2JlZWQ0MGVkNDYyMjljMDZjZWNlYzQ5Y2VkODkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTI0Mzk2NCwtMTIyLjQxNTE3MjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVmNDhmNzI4MmE1ZTRkM2JiMmFjM2E5ZTkxYmUyNTQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBjZjBmZDZiZDI3YTQ0MWFhOWVhMTlmZDkzZWEzM2JiID0gJCgnPGRpdiBpZD0iaHRtbF8wY2YwZmQ2YmQyN2E0NDFhYTllYTE5ZmQ5M2VhMzNiYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3RoZXIgTWlzY2VsbGFuZW91czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWY0OGY3MjgyYTVlNGQzYmIyYWMzYTllOTFiZTI1NDAuc2V0Q29udGVudChodG1sXzBjZjBmZDZiZDI3YTQ0MWFhOWVhMTlmZDkzZWEzM2JiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODVlY2JlZWQ0MGVkNDYyMjljMDZjZWNlYzQ5Y2VkODkuYmluZFBvcHVwKHBvcHVwXzVmNDhmNzI4MmE1ZTRkM2JiMmFjM2E5ZTkxYmUyNTQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2U5Mjc5MTE0NzVmMjQwMjQ5YzdlM2RhYjY4MWU3ZWExID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NzgzNDUsLTEyMi40MjQxMDI3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNjYxYjhmNDdlMGI0NGQ5YWJlZjdkYTY1MTg4YjBkYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNzA1ODg3N2NjZDI0Y2NhOTFkZGRjOTU0NDE4NDIyOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjcwNTg4NzdjY2QyNGNjYTkxZGRkYzk1NDQxODQyMjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbGljaW91cyBNaXNjaGllZjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDY2MWI4ZjQ3ZTBiNDRkOWFiZWY3ZGE2NTE4OGIwZGEuc2V0Q29udGVudChodG1sX2I3MDU4ODc3Y2NkMjRjY2E5MWRkZGM5NTQ0MTg0MjI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTkyNzkxMTQ3NWYyNDAyNDljN2UzZGFiNjgxZTdlYTEuYmluZFBvcHVwKHBvcHVwX2Q2NjFiOGY0N2UwYjQ0ZDlhYmVmN2RhNjUxODhiMGRhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzUzODMxYWQzMzJhMTQxNjZiYzlmODVlNjYxNTJlNzMzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY4NzcwNSwtMTIyLjQyNzQ2MjFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZhNmQ3NWVmMjA1YTQ5Y2FiNmE0YjE0MjcyNzE0YzY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1OTZlNzczYTEzYTQzMWRhMmRiNzQwZWVhMTQyZWU1ID0gJCgnPGRpdiBpZD0iaHRtbF9lNTk2ZTc3M2ExM2E0MzFkYTJkYjc0MGVlYTE0MmVlNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGFyY2VueSBUaGVmdDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmE2ZDc1ZWYyMDVhNDljYWI2YTRiMTQyNzI3MTRjNjkuc2V0Q29udGVudChodG1sX2U1OTZlNzczYTEzYTQzMWRhMmRiNzQwZWVhMTQyZWU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTM4MzFhZDMzMmExNDE2NmJjOWY4NWU2NjE1MmU3MzMuYmluZFBvcHVwKHBvcHVwX2ZhNmQ3NWVmMjA1YTQ5Y2FiNmE0YjE0MjcyNzE0YzY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2VhZWNmYTlkNmJlMDQ5MTZiOWJhNWI3MzNiYmQ5YjY0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzE0MjA5NDgsLTEyMi40MzYxNzY0OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTUxY2UzMGY3Y2VkNGI0OGI1NTJhYWJlODk4Nzk1NTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2I2YzRmZTk2ODYyNGE2OGE2ZGE1ZDllNzIxMDE3ZTUgPSAkKCc8ZGl2IGlkPSJodG1sX2NiNmM0ZmU5Njg2MjRhNjhhNmRhNWQ5ZTcyMTAxN2U1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaXNjZWxsYW5lb3VzIEludmVzdGlnYXRpb248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE1MWNlMzBmN2NlZDRiNDhiNTUyYWFiZTg5ODc5NTUxLnNldENvbnRlbnQoaHRtbF9jYjZjNGZlOTY4NjI0YTY4YTZkYTVkOWU3MjEwMTdlNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2VhZWNmYTlkNmJlMDQ5MTZiOWJhNWI3MzNiYmQ5YjY0LmJpbmRQb3B1cChwb3B1cF8xNTFjZTMwZjdjZWQ0YjQ4YjU1MmFhYmU4OTg3OTU1MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82YjVlMjI1ODAzZmE0YzU3ODI0MDQzYWY4NTc1MjdiMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1MjIzNDYxLC0xMjIuNDc5NTU3NTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc5YjFiODE5YzNjNDQzNDA5Yzg1YTk0NmUzN2I4OWEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU2YmE1M2JmZGIyYzQ1NGFhM2Q3ODY2YWM2NzBkMGM0ID0gJCgnPGRpdiBpZD0iaHRtbF81NmJhNTNiZmRiMmM0NTRhYTNkNzg2NmFjNjcwZDBjNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGlzb3JkZXJseSBDb25kdWN0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83OWIxYjgxOWMzYzQ0MzQwOWM4NWE5NDZlMzdiODlhMy5zZXRDb250ZW50KGh0bWxfNTZiYTUzYmZkYjJjNDU0YWEzZDc4NjZhYzY3MGQwYzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82YjVlMjI1ODAzZmE0YzU3ODI0MDQzYWY4NTc1MjdiMy5iaW5kUG9wdXAocG9wdXBfNzliMWI4MTljM2M0NDM0MDljODVhOTQ2ZTM3Yjg5YTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDgyMTNhMjdiYmRkNDZhMjk1NmJmYzRiNmQwMTRhN2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjU2MDU4NCwtMTIyLjQxMDQ4NjddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVmMGI0ODllNGI4ZjQ5Yzk4MGMxZDdiMzA5OGMyZGZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdkNWUzMjgyYWY2NzQ1NDk4Njc1ZGY5MmU0ZDkyZGU0ID0gJCgnPGRpdiBpZD0iaHRtbF83ZDVlMzI4MmFmNjc0NTQ5ODY3NWRmOTJlNGQ5MmRlNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXNzYXVsdDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWYwYjQ4OWU0YjhmNDljOTgwYzFkN2IzMDk4YzJkZmYuc2V0Q29udGVudChodG1sXzdkNWUzMjgyYWY2NzQ1NDk4Njc1ZGY5MmU0ZDkyZGU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDgyMTNhMjdiYmRkNDZhMjk1NmJmYzRiNmQwMTRhN2UuYmluZFBvcHVwKHBvcHVwXzVmMGI0ODllNGI4ZjQ5Yzk4MGMxZDdiMzA5OGMyZGZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2FlNmU4Zjg0NDVkNjQ1OThiMTA4ZDk0YWIzZjQ5NTc1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQyMzkxNzYsLTEyMi40MDU4MzgyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83OWRlMDIzNWMzMTA0YWNkODEwMWJjMjMzMzZiNzg5YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMjdlZWZmNzY5ZWE0MjllOWJjMzQyYzU0ZDQxZTliOCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjI3ZWVmZjc2OWVhNDI5ZTliYzM0MmM1NGQ0MWU5YjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldlYXBvbnMgT2ZmZW5zZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzlkZTAyMzVjMzEwNGFjZDgxMDFiYzIzMzM2Yjc4OWIuc2V0Q29udGVudChodG1sX2YyN2VlZmY3NjllYTQyOWU5YmMzNDJjNTRkNDFlOWI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYWU2ZThmODQ0NWQ2NDU5OGIxMDhkOTRhYjNmNDk1NzUuYmluZFBvcHVwKHBvcHVwXzc5ZGUwMjM1YzMxMDRhY2Q4MTAxYmMyMzMzNmI3ODliKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2YxNWU3ZjgyYTZiNTRhOGNhNjg0ODRjOTM2MDcxMDcyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYzNDI5MjcsLTEyMi40MTk1MTI3MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfZWIyZjM2NGU1NTNkNDY4NTg2MDNkZjM3Y2M2ODZiNTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2UxOTExZTYzMTExNGY4NzgyMzgzMjYzNDk5ZWM2ZWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTQ2NGYzODk3NjIxNGU2MjlhOTBjNTY2OWU0Mjc4YTYgPSAkKCc8ZGl2IGlkPSJodG1sXzE0NjRmMzg5NzYyMTRlNjI5YTkwYzU2NjllNDI3OGE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdXNwaWNpb3VzIE9jYzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2UxOTExZTYzMTExNGY4NzgyMzgzMjYzNDk5ZWM2ZWMuc2V0Q29udGVudChodG1sXzE0NjRmMzg5NzYyMTRlNjI5YTkwYzU2NjllNDI3OGE2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjE1ZTdmODJhNmI1NGE4Y2E2ODQ4NGM5MzYwNzEwNzIuYmluZFBvcHVwKHBvcHVwXzdlMTkxMWU2MzExMTRmODc4MjM4MzI2MzQ5OWVjNmVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2E4MzU3NWVlOTBmNTQxNzBiMjcwOTZhNWY4MWQ3ZGYxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzk3NTA0OTQsLTEyMi40MDIwNDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyX2ViMmYzNjRlNTUzZDQ2ODU4NjAzZGYzN2NjNjg2YjUwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRjYTliNDM4ZjMyZDQ3YTY5YjExMDEyMmEzMDhjZDQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI3YmJhNjkyNThlZjRiNDQ4MzllZjRlMzE3NjE3YzQyID0gJCgnPGRpdiBpZD0iaHRtbF8yN2JiYTY5MjU4ZWY0YjQ0ODM5ZWY0ZTMxNzYxN2M0MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW90b3IgVmVoaWNsZSBUaGVmdDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGNhOWI0MzhmMzJkNDdhNjliMTEwMTIyYTMwOGNkNDIuc2V0Q29udGVudChodG1sXzI3YmJhNjkyNThlZjRiNDQ4MzllZjRlMzE3NjE3YzQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTgzNTc1ZWU5MGY1NDE3MGIyNzA5NmE1ZjgxZDdkZjEuYmluZFBvcHVwKHBvcHVwXzRjYTliNDM4ZjMyZDQ3YTY5YjExMDEyMmEzMDhjZDQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzg2YTUwOGI4ZjRkYzRmMzA5ZjQwOTA4N2I3N2YxN2IxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY1NjA1ODQsLTEyMi40MTA0ODY3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl9lYjJmMzY0ZTU1M2Q0Njg1ODYwM2RmMzdjYzY4NmI1MCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82M2I4MTNlNjY3OWE0Yjc0ODdkMGJhMTcxZmU5YTk5ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YTE4YmIyMzQ0Zjc0NmVmOGM0YWUyM2Q4ODY2OTE2ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2ExOGJiMjM0NGY3NDZlZjhjNGFlMjNkODg2NjkxNmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldhcnJhbnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYzYjgxM2U2Njc5YTRiNzQ4N2QwYmExNzFmZTlhOTlkLnNldENvbnRlbnQoaHRtbF83YTE4YmIyMzQ0Zjc0NmVmOGM0YWUyM2Q4ODY2OTE2Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzg2YTUwOGI4ZjRkYzRmMzA5ZjQwOTA4N2I3N2YxN2IxLmJpbmRQb3B1cChwb3B1cF82M2I4MTNlNjY3OWE0Yjc0ODdkMGJhMTcxZmU5YTk5ZCk7CgogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+ onload="this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>