Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save bertrandobi/5d324a0fcc22b109651a9c3c6535f1e5 to your computer and use it in GitHub Desktop.
Save bertrandobi/5d324a0fcc22b109651a9c3c6535f1e5 to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"https://cognitiveclass.ai\"><img src = \"https://ibm.box.com/shared/static/9gegpsmnsoo25ikkbl4qzlvlyjbgxs5x.png\" width = 400> </a>\n",
"\n",
"<h1 align=center><font size = 5>Segmenting and Clustering Neighborhoods in New York City</font></h1>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction\n",
"\n",
"In this lab, you will learn how to convert addresses into their equivalent latitude and longitude values. Also, you will use the Foursquare API to explore neighborhoods in New York City. You will use the **explore** function to get the most common venue categories in each neighborhood, and then use this feature to group the neighborhoods into clusters. You will use the *k*-means clustering algorithm to complete this task. Finally, you will use the Folium library to visualize the neighborhoods in New York City and their emerging clusters."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Table of Contents\n",
"\n",
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
"\n",
"<font size = 3>\n",
"\n",
"1. <a href=\"#item1\">Download and Explore Dataset</a>\n",
"\n",
"2. <a href=\"#item2\">Explore Neighborhoods in New York City</a>\n",
"\n",
"3. <a href=\"#item3\">Analyze Each Neighborhood</a>\n",
"\n",
"4. <a href=\"#item4\">Cluster Neighborhoods</a>\n",
"\n",
"5. <a href=\"#item5\">Examine Clusters</a> \n",
"</font>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Before we get the data and start exploring it, let's download all the dependencies that we will need."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Libraries imported.\n"
]
}
],
"source": [
"import numpy as np # library to handle data in a vectorized manner\n",
"\n",
"import pandas as pd # library for data analsysis\n",
"pd.set_option('display.max_columns', None)\n",
"pd.set_option('display.max_rows', None)\n",
"\n",
"import json # library to handle JSON files\n",
"\n",
"#!conda install -c conda-forge geopy --yes # uncomment this line if you haven't completed the Foursquare API lab\n",
"from geopy.geocoders import Nominatim # convert an address into latitude and longitude values\n",
"\n",
"import requests # library to handle requests\n",
"from pandas.io.json import json_normalize # tranform JSON file into a pandas dataframe\n",
"\n",
"# Matplotlib and associated plotting modules\n",
"import matplotlib.cm as cm\n",
"import matplotlib.colors as colors\n",
"\n",
"# import k-means from clustering stage\n",
"from sklearn.cluster import KMeans\n",
"\n",
"#!conda install -c conda-forge folium=0.5.0 --yes # uncomment this line if you haven't completed the Foursquare API lab\n",
"import folium # map rendering library\n",
"\n",
"print('Libraries imported.')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item1'></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Download and Explore Dataset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Neighborhood has a total of 5 boroughs and 306 neighborhoods. In order to segement the neighborhoods and explore them, we will essentially need a dataset that contains the 5 boroughs and the neighborhoods that exist in each borough as well as the the latitude and logitude coordinates of each neighborhood. \n",
"\n",
"Luckily, this dataset exists for free on the web. Feel free to try to find this dataset on your own, but here is the link to the dataset: https://geo.nyu.edu/catalog/nyu_2451_34572"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For your convenience, I downloaded the files and placed it on the server, so you can simply run a `wget` command and access the data. So let's go ahead and do that."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Data downloaded!\n"
]
}
],
"source": [
"!wget -q -O 'newyork_data.json' https://cocl.us/new_york_dataset\n",
"print('Data downloaded!')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Load and explore the data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, let's load the data."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"with open('newyork_data.json') as json_data:\n",
" newyork_data = json.load(json_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a quick look at the data."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"{'type': 'FeatureCollection',\n",
" 'totalFeatures': 306,\n",
" 'features': [{'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.1',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84720052054902, 40.89470517661]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Wakefield',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Wakefield',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84720052054902,\n",
" 40.89470517661,\n",
" -73.84720052054902,\n",
" 40.89470517661]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.2',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82993910812398, 40.87429419303012]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Co-op City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Co-op',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82993910812398,\n",
" 40.87429419303012,\n",
" -73.82993910812398,\n",
" 40.87429419303012]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.3',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82780644716412, 40.887555677350775]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Eastchester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Eastchester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82780644716412,\n",
" 40.887555677350775,\n",
" -73.82780644716412,\n",
" 40.887555677350775]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.4',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90564259591682, 40.89543742690383]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fieldston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Fieldston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90564259591682,\n",
" 40.89543742690383,\n",
" -73.90564259591682,\n",
" 40.89543742690383]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.5',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9125854610857, 40.890834493891305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Riverdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Riverdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9125854610857,\n",
" 40.890834493891305,\n",
" -73.9125854610857,\n",
" 40.890834493891305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.6',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90281798724604, 40.88168737120521]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kingsbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Kingsbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90281798724604,\n",
" 40.88168737120521,\n",
" -73.90281798724604,\n",
" 40.88168737120521]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.7',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91065965862981, 40.87655077879964]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Marble Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Marble',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.91065965862981,\n",
" 40.87655077879964,\n",
" -73.91065965862981,\n",
" 40.87655077879964]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.8',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86731496814176, 40.89827261213805]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodlawn',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodlawn',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86731496814176,\n",
" 40.89827261213805,\n",
" -73.86731496814176,\n",
" 40.89827261213805]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.9',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8793907395681, 40.87722415599446]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Norwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Norwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8793907395681,\n",
" 40.87722415599446,\n",
" -73.8793907395681,\n",
" 40.87722415599446]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.10',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85744642974207, 40.88103887819211]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Williamsbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Williamsbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85744642974207,\n",
" 40.88103887819211,\n",
" -73.85744642974207,\n",
" 40.88103887819211]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.11',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83579759808117, 40.866858107252696]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Baychester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Baychester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.83579759808117,\n",
" 40.866858107252696,\n",
" -73.83579759808117,\n",
" 40.866858107252696]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.12',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85475564017999, 40.85741349808865]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Parkway',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Pelham Parkway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85475564017999,\n",
" 40.85741349808865,\n",
" -73.85475564017999,\n",
" 40.85741349808865]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.13',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.78648845267413, 40.84724670491813]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'City Island',\n",
" 'stacked': 2,\n",
" 'annoline1': 'City',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.78648845267413,\n",
" 40.84724670491813,\n",
" -73.78648845267413,\n",
" 40.84724670491813]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.14',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8855121841913, 40.870185164975325]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bedford Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bedford',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8855121841913,\n",
" 40.870185164975325,\n",
" -73.8855121841913,\n",
" 40.870185164975325]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.15',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9104159619131, 40.85572707719664]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'University Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'University',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9104159619131,\n",
" 40.85572707719664,\n",
" -73.9104159619131,\n",
" 40.85572707719664]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.16',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91967159119565, 40.84789792606271]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morris Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Morris',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91967159119565,\n",
" 40.84789792606271,\n",
" -73.91967159119565,\n",
" 40.84789792606271]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.17',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89642655981623, 40.86099679638654]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fordham',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Fordham',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.89642655981623,\n",
" 40.86099679638654,\n",
" -73.89642655981623,\n",
" 40.86099679638654]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.18',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88735617532338, 40.84269615786053]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Tremont',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Tremont',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88735617532338,\n",
" 40.84269615786053,\n",
" -73.88735617532338,\n",
" 40.84269615786053]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.19',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87774474910545, 40.83947505672653]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Farms',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Farms',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.87774474910545,\n",
" 40.83947505672653,\n",
" -73.87774474910545,\n",
" 40.83947505672653]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.20',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9261020935813, 40.836623010706056]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'High Bridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Highbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9261020935813,\n",
" 40.836623010706056,\n",
" -73.9261020935813,\n",
" 40.836623010706056]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.21',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90942160757436, 40.819754370594936]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Melrose',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Melrose',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90942160757436,\n",
" 40.819754370594936,\n",
" -73.90942160757436,\n",
" 40.819754370594936]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.22',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91609987487575, 40.80623874935177]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mott Haven',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Mott Haven',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91609987487575,\n",
" 40.80623874935177,\n",
" -73.91609987487575,\n",
" 40.80623874935177]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.23',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91322139386135, 40.801663627756206]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Morris',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Morris',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91322139386135,\n",
" 40.801663627756206,\n",
" -73.91322139386135,\n",
" 40.801663627756206]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.24',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8957882009446, 40.81509904545822]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Longwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Longwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8957882009446,\n",
" 40.81509904545822,\n",
" -73.8957882009446,\n",
" 40.81509904545822]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.25',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88331505955291, 40.80972987938709]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hunts Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hunts',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88331505955291,\n",
" 40.80972987938709,\n",
" -73.88331505955291,\n",
" 40.80972987938709]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.26',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90150648943059, 40.82359198585534]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morrisania',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Morrisania',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90150648943059,\n",
" 40.82359198585534,\n",
" -73.90150648943059,\n",
" 40.82359198585534]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.27',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86574609554924, 40.821012197914015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Soundview',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Soundview',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86574609554924,\n",
" 40.821012197914015,\n",
" -73.86574609554924,\n",
" 40.821012197914015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.28',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85414416189266, 40.80655112003589]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clason Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Clason',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85414416189266,\n",
" 40.80655112003589,\n",
" -73.85414416189266,\n",
" 40.80655112003589]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.29',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81635002158441, 40.81510925804005]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Throgs Neck',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Throgs Neck',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.81635002158441,\n",
" 40.81510925804005,\n",
" -73.81635002158441,\n",
" 40.81510925804005]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.30',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8240992675385, 40.844245936947374]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Country Club',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Country',\n",
" 'annoline2': 'Club',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8240992675385,\n",
" 40.844245936947374,\n",
" -73.8240992675385,\n",
" 40.844245936947374]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.31',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85600310535783, 40.837937822267286]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Parkchester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Parkchester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85600310535783,\n",
" 40.837937822267286,\n",
" -73.85600310535783,\n",
" 40.837937822267286]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.32',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84219407604444, 40.8406194964327]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Westchester Square',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Westchester',\n",
" 'annoline2': 'Square',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84219407604444,\n",
" 40.8406194964327,\n",
" -73.84219407604444,\n",
" 40.8406194964327]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.33',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8662991807561, 40.84360847124718]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Van Nest',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Van',\n",
" 'annoline2': 'Nest',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8662991807561,\n",
" 40.84360847124718,\n",
" -73.8662991807561,\n",
" 40.84360847124718]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.34',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85040178030421, 40.847549063536334]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morris Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Morris Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85040178030421,\n",
" 40.847549063536334,\n",
" -73.85040178030421,\n",
" 40.847549063536334]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.35',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88845196134804, 40.85727710073895]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Belmont',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Belmont',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88845196134804,\n",
" 40.85727710073895,\n",
" -73.88845196134804,\n",
" 40.85727710073895]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.36',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91719048210393, 40.88139497727086]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Spuyten Duyvil',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Spuyten',\n",
" 'annoline2': 'Duyvil',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91719048210393,\n",
" 40.88139497727086,\n",
" -73.91719048210393,\n",
" 40.88139497727086]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.37',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90453054908927, 40.90854282950666]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Riverdale',\n",
" 'stacked': 2,\n",
" 'annoline1': 'North',\n",
" 'annoline2': 'Riverdale',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90453054908927,\n",
" 40.90854282950666,\n",
" -73.90453054908927,\n",
" 40.90854282950666]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.38',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8320737824047, 40.85064140940335]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pelham',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8320737824047,\n",
" 40.85064140940335,\n",
" -73.8320737824047,\n",
" 40.85064140940335]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.39',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82620275994073, 40.82657951686922]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Schuylerville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Schuylerville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82620275994073,\n",
" 40.82657951686922,\n",
" -73.82620275994073,\n",
" 40.82657951686922]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.40',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81388514428619, 40.821986118163494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edgewater Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Edgewater',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.81388514428619,\n",
" 40.821986118163494,\n",
" -73.81388514428619,\n",
" 40.821986118163494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.41',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84802729582735, 40.819014376988314]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Castle Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Castle',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84802729582735,\n",
" 40.819014376988314,\n",
" -73.84802729582735,\n",
" 40.819014376988314]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.42',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86332361652777, 40.87137078192371]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Olinville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Olinville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86332361652777,\n",
" 40.87137078192371,\n",
" -73.86332361652777,\n",
" 40.87137078192371]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.43',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84161194831223, 40.86296562477998]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pelham',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84161194831223,\n",
" 40.86296562477998,\n",
" -73.84161194831223,\n",
" 40.86296562477998]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.44',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91558941773444, 40.83428380733851]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concourse',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Concourse',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91558941773444,\n",
" 40.83428380733851,\n",
" -73.91558941773444,\n",
" 40.83428380733851]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.45',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85053524451935, 40.82977429787161]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Unionport',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Unionport',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85053524451935,\n",
" 40.82977429787161,\n",
" -73.85053524451935,\n",
" 40.82977429787161]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.46',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84808271877168, 40.88456130303732]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edenwald',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Edenwald',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84808271877168,\n",
" 40.88456130303732,\n",
" -73.84808271877168,\n",
" 40.88456130303732]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.47',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.03062069353813, 40.625801065010656]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Ridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bay Ridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.03062069353813,\n",
" 40.625801065010656,\n",
" -74.03062069353813,\n",
" 40.625801065010656]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.48',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99517998380729, 40.61100890202044]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bensonhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bensonhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99517998380729,\n",
" 40.61100890202044,\n",
" -73.99517998380729,\n",
" 40.61100890202044]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.49',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01031618527784, 40.64510294925429]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunset Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sunset',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.01031618527784,\n",
" 40.64510294925429,\n",
" -74.01031618527784,\n",
" 40.64510294925429]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.50',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95424093127393, 40.7302009848647]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenpoint',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Greenpoint',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95424093127393,\n",
" 40.7302009848647,\n",
" -73.95424093127393,\n",
" 40.7302009848647]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.51',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97347087708445, 40.59526001306593]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gravesend',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gravesend',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97347087708445,\n",
" 40.59526001306593,\n",
" -73.97347087708445,\n",
" 40.59526001306593]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.52',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96509448785336, 40.57682506566604]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brighton Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Brighton',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96509448785336,\n",
" 40.57682506566604,\n",
" -73.96509448785336,\n",
" 40.57682506566604]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.53',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94318640482979, 40.58689012678384]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sheepshead Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sheepshead',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94318640482979,\n",
" 40.58689012678384,\n",
" -73.94318640482979,\n",
" 40.58689012678384]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.54',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95743840559939, 40.61443251335098]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95743840559939,\n",
" 40.61443251335098,\n",
" -73.95743840559939,\n",
" 40.61443251335098]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.55',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95840106533903, 40.63632589026677]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatbush',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatbush',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95840106533903,\n",
" 40.63632589026677,\n",
" -73.95840106533903,\n",
" 40.63632589026677]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.56',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94329119073582, 40.67082917695294]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Crown Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Crown',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94329119073582,\n",
" 40.67082917695294,\n",
" -73.94329119073582,\n",
" 40.67082917695294]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.57',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93610256185836, 40.64171776668961]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Flatbush',\n",
" 'stacked': 1,\n",
" 'annoline1': 'East Flatbush',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93610256185836,\n",
" 40.64171776668961,\n",
" -73.93610256185836,\n",
" 40.64171776668961]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.58',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98042110559474, 40.642381958003526]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kensington',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Kensington',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98042110559474,\n",
" 40.642381958003526,\n",
" -73.98042110559474,\n",
" 40.642381958003526]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.59',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98007340430172, 40.65694583575104]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Windsor Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Windsor',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98007340430172,\n",
" 40.65694583575104,\n",
" -73.98007340430172,\n",
" 40.65694583575104]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.60',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9648592426269, 40.676822262254724]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.9648592426269,\n",
" 40.676822262254724,\n",
" -73.9648592426269,\n",
" 40.676822262254724]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.61',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91023536176607, 40.66394994339755]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brownsville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Brownsville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91023536176607,\n",
" 40.66394994339755,\n",
" -73.91023536176607,\n",
" 40.66394994339755]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.62',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95811529220927, 40.70714439344251]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Williamsburg',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Williamsburg',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95811529220927,\n",
" 40.70714439344251,\n",
" -73.95811529220927,\n",
" 40.70714439344251]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.63',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92525797487045, 40.69811611017901]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bushwick',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bushwick',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92525797487045,\n",
" 40.69811611017901,\n",
" -73.92525797487045,\n",
" 40.69811611017901]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.64',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94178488690297, 40.687231607720456]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bedford Stuyvesant',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bedford Stuyvesant',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94178488690297,\n",
" 40.687231607720456,\n",
" -73.94178488690297,\n",
" 40.687231607720456]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.65',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99378225496424, 40.695863722724084]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brooklyn Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Brooklyn',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99378225496424,\n",
" 40.695863722724084,\n",
" -73.99378225496424,\n",
" 40.695863722724084]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.66',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99856139218463, 40.687919722485574]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cobble Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cobble',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99856139218463,\n",
" 40.687919722485574,\n",
" -73.99856139218463,\n",
" 40.687919722485574]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.67',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99465372828006, 40.680540231076485]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Carroll Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Carroll',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99465372828006,\n",
" 40.680540231076485,\n",
" -73.99465372828006,\n",
" 40.680540231076485]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.68',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0127589747356, 40.676253230250886]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Red Hook',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Red',\n",
" 'annoline2': 'Hook',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.0127589747356,\n",
" 40.676253230250886,\n",
" -74.0127589747356,\n",
" 40.676253230250886]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.69',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99444087145339, 40.673931143187154]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gowanus',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gowanus',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99444087145339,\n",
" 40.673931143187154,\n",
" -73.99444087145339,\n",
" 40.673931143187154]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.70',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97290574369092, 40.68852726018977]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fort Greene',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fort',\n",
" 'annoline2': 'Greene',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97290574369092,\n",
" 40.68852726018977,\n",
" -73.97290574369092,\n",
" 40.68852726018977]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.71',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97705030183924, 40.67232052268197]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Park Slope',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Park',\n",
" 'annoline2': 'Slope',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97705030183924,\n",
" 40.67232052268197,\n",
" -73.97705030183924,\n",
" 40.67232052268197]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.72',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87661596457296, 40.68239101144211]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cypress Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cypress',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.87661596457296,\n",
" 40.68239101144211,\n",
" -73.87661596457296,\n",
" 40.68239101144211]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.73',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88069863917366, 40.669925700847045]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East New York',\n",
" 'stacked': 1,\n",
" 'annoline1': 'East New York',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.88069863917366,\n",
" 40.669925700847045,\n",
" -73.88069863917366,\n",
" 40.669925700847045]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.74',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87936970045875, 40.64758905230874]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Starrett City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Starrett',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.87936970045875,\n",
" 40.64758905230874,\n",
" -73.87936970045875,\n",
" 40.64758905230874]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.75',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90209269778966, 40.63556432797428]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Canarsie',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Canarsie',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90209269778966,\n",
" 40.63556432797428,\n",
" -73.90209269778966,\n",
" 40.63556432797428]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.76',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92911302644674, 40.630446043757466]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatlands',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatlands',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92911302644674,\n",
" 40.630446043757466,\n",
" -73.92911302644674,\n",
" 40.630446043757466]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.77',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90818571777423, 40.606336421685626]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mill Island',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mill',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90818571777423,\n",
" 40.606336421685626,\n",
" -73.90818571777423,\n",
" 40.606336421685626]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.78',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94353722891886, 40.57791350308657]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94353722891886,\n",
" 40.57791350308657,\n",
" -73.94353722891886,\n",
" 40.57791350308657]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.79',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98868295821637, 40.57429256471601]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Coney Island',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Coney Island',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98868295821637,\n",
" 40.57429256471601,\n",
" -73.98868295821637,\n",
" 40.57429256471601]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.80',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99875221443519, 40.59951870282238]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bath Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bath',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99875221443519,\n",
" 40.59951870282238,\n",
" -73.99875221443519,\n",
" 40.59951870282238]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.81',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99049823044811, 40.633130512758015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Borough Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Borough',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99049823044811,\n",
" 40.633130512758015,\n",
" -73.99049823044811,\n",
" 40.633130512758015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.82',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01931375636022, 40.619219457722636]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dyker Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Dyker',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.01931375636022,\n",
" 40.619219457722636,\n",
" -74.01931375636022,\n",
" 40.619219457722636]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.83',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93010170691196, 40.590848433902046]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gerritsen Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Gerritsen',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93010170691196,\n",
" 40.590848433902046,\n",
" -73.93010170691196,\n",
" 40.590848433902046]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.84',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93134404108497, 40.609747779894604]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Marine Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Marine Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93134404108497,\n",
" 40.609747779894604,\n",
" -73.93134404108497,\n",
" 40.609747779894604]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.85',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96784306216367, 40.693229421881504]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clinton Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Clinton',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96784306216367,\n",
" 40.693229421881504,\n",
" -73.96784306216367,\n",
" 40.693229421881504]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.86',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0078731120024, 40.57637537890224]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sea Gate',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sea',\n",
" 'annoline2': 'Gate',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.0078731120024,\n",
" 40.57637537890224,\n",
" -74.0078731120024,\n",
" 40.57637537890224]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.87',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98346337431099, 40.69084402109802]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Downtown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Downtown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98346337431099,\n",
" 40.69084402109802,\n",
" -73.98346337431099,\n",
" 40.69084402109802]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.88',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98374824115798, 40.685682912091444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Boerum Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Boerum',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98374824115798,\n",
" 40.685682912091444,\n",
" -73.98374824115798,\n",
" 40.685682912091444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.89',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95489867077713, 40.658420017469815]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Lefferts Gardens',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Lefferts',\n",
" 'annoline3': 'Gardens',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95489867077713,\n",
" 40.658420017469815,\n",
" -73.95489867077713,\n",
" 40.658420017469815]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.90',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91306831787395, 40.678402554795355]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ocean Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ocean',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91306831787395,\n",
" 40.678402554795355,\n",
" -73.91306831787395,\n",
" 40.678402554795355]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.91',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86797598081334, 40.67856995727479]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'City Line',\n",
" 'stacked': 2,\n",
" 'annoline1': 'City',\n",
" 'annoline2': 'Line',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.86797598081334,\n",
" 40.67856995727479,\n",
" -73.86797598081334,\n",
" 40.67856995727479]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.92',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89855633630317, 40.61514955045308]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bergen Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bergen',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.89855633630317,\n",
" 40.61514955045308,\n",
" -73.89855633630317,\n",
" 40.61514955045308]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.93',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95759523489838, 40.62559589869843]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Midwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95759523489838,\n",
" 40.62559589869843,\n",
" -73.95759523489838,\n",
" 40.62559589869843]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.94',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96261316716048, 40.647008603185185]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Park South',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Park South',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96261316716048,\n",
" 40.647008603185185,\n",
" -73.96261316716048,\n",
" 40.647008603185185]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.95',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91607483951324, 40.62384524478419]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Georgetown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Georgetown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91607483951324,\n",
" 40.62384524478419,\n",
" -73.91607483951324,\n",
" 40.62384524478419]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.96',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93885815269195, 40.70849241041548]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Williamsburg',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Williamsburg',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93885815269195,\n",
" 40.70849241041548,\n",
" -73.93885815269195,\n",
" 40.70849241041548]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.97',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95880857587582, 40.714822906532014]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Side',\n",
" 'stacked': 1,\n",
" 'annoline1': 'North Side',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95880857587582,\n",
" 40.714822906532014,\n",
" -73.95880857587582,\n",
" 40.714822906532014]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.98',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95800095153331, 40.71086147265064]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Side',\n",
" 'stacked': 1,\n",
" 'annoline1': 'South Side',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95800095153331,\n",
" 40.71086147265064,\n",
" -73.95800095153331,\n",
" 40.71086147265064]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.99',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96836678035541, 40.61305976667942]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ocean Parkway',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ocean',\n",
" 'annoline2': 'Parkway',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96836678035541,\n",
" 40.61305976667942,\n",
" -73.96836678035541,\n",
" 40.61305976667942]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.100',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.03197914537984, 40.61476812694226]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fort Hamilton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fort',\n",
" 'annoline2': 'Hamilton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.03197914537984,\n",
" 40.61476812694226,\n",
" -74.03197914537984,\n",
" 40.61476812694226]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.101',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99427936255978, 40.71561842231432]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chinatown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chinatown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99427936255978,\n",
" 40.71561842231432,\n",
" -73.99427936255978,\n",
" 40.71561842231432]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.102',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93690027985234, 40.85190252555305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Washington Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Washington',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.93690027985234,\n",
" 40.85190252555305,\n",
" -73.93690027985234,\n",
" 40.85190252555305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.103',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92121042203897, 40.86768396449915]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Inwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Inwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.92121042203897,\n",
" 40.86768396449915,\n",
" -73.92121042203897,\n",
" 40.86768396449915]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.104',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94968791883366, 40.823604284811935]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hamilton Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hamilton',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94968791883366,\n",
" 40.823604284811935,\n",
" -73.94968791883366,\n",
" 40.823604284811935]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.105',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9573853935188, 40.8169344294978]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattanville',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattanville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9573853935188,\n",
" 40.8169344294978,\n",
" -73.9573853935188,\n",
" 40.8169344294978]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.106',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94321112603905, 40.81597606742414]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Central Harlem',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Central',\n",
" 'annoline2': 'Harlem',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94321112603905,\n",
" 40.81597606742414,\n",
" -73.94321112603905,\n",
" 40.81597606742414]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.107',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94418223148524, 40.79224946663033]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Harlem',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Harlem',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94418223148524,\n",
" 40.79224946663033,\n",
" -73.94418223148524,\n",
" 40.79224946663033]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.108',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96050763135, 40.775638573301805]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Upper East Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Upper',\n",
" 'annoline2': 'East',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96050763135,\n",
" 40.775638573301805,\n",
" -73.96050763135,\n",
" 40.775638573301805]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.109',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94711784471826, 40.775929849884875]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Yorkville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Yorkville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94711784471826,\n",
" 40.775929849884875,\n",
" -73.94711784471826,\n",
" 40.775929849884875]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.110',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9588596881376, 40.76811265828733]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lenox Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lenox',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9588596881376,\n",
" 40.76811265828733,\n",
" -73.9588596881376,\n",
" 40.76811265828733]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.111',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94916769227953, 40.76215960576283]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Roosevelt Island',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Roosevelt Island',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 56,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94916769227953,\n",
" 40.76215960576283,\n",
" -73.94916769227953,\n",
" 40.76215960576283]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.112',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97705923630603, 40.787657998534854]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Upper West Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Upper',\n",
" 'annoline2': 'West',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97705923630603,\n",
" 40.787657998534854,\n",
" -73.97705923630603,\n",
" 40.787657998534854]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.113',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98533777001262, 40.77352888942166]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lincoln Square',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lincoln',\n",
" 'annoline2': 'Square',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98533777001262,\n",
" 40.77352888942166,\n",
" -73.98533777001262,\n",
" 40.77352888942166]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.114',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99611936309479, 40.75910089146212]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clinton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Clinton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99611936309479,\n",
" 40.75910089146212,\n",
" -73.99611936309479,\n",
" 40.75910089146212]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.115',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98166882730304, 40.75469110270623]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midtown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Midtown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98166882730304,\n",
" 40.75469110270623,\n",
" -73.98166882730304,\n",
" 40.75469110270623]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.116',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97833207924127, 40.748303077252174]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Murray Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Murray',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97833207924127,\n",
" 40.748303077252174,\n",
" -73.97833207924127,\n",
" 40.748303077252174]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.117',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00311633472813, 40.744034706747975]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chelsea',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chelsea',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00311633472813,\n",
" 40.744034706747975,\n",
" -74.00311633472813,\n",
" 40.744034706747975]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.118',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99991402945902, 40.72693288536128]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenwich Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Greenwich',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99991402945902,\n",
" 40.72693288536128,\n",
" -73.99991402945902,\n",
" 40.72693288536128]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.119',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98222616506416, 40.727846777270244]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98222616506416,\n",
" 40.727846777270244,\n",
" -73.98222616506416,\n",
" 40.727846777270244]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.120',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98089031999291, 40.71780674892765]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lower East Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Lower',\n",
" 'annoline2': 'East',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98089031999291,\n",
" 40.71780674892765,\n",
" -73.98089031999291,\n",
" 40.71780674892765]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.121',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01068328559087, 40.721521967443216]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tribeca',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tribeca',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.01068328559087,\n",
" 40.721521967443216,\n",
" -74.01068328559087,\n",
" 40.721521967443216]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.122',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99730467208073, 40.71932379395907]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Little Italy',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Little',\n",
" 'annoline2': 'Italy',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99730467208073,\n",
" 40.71932379395907,\n",
" -73.99730467208073,\n",
" 40.71932379395907]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.123',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00065666959759, 40.72218384131794]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Soho',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Soho',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00065666959759,\n",
" 40.72218384131794,\n",
" -74.00065666959759,\n",
" 40.72218384131794]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.124',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00617998126812, 40.73443393572434]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00617998126812,\n",
" 40.73443393572434,\n",
" -74.00617998126812,\n",
" 40.73443393572434]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.125',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96428617740655, 40.797307041702865]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Valley',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Valley',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96428617740655,\n",
" 40.797307041702865,\n",
" -73.96428617740655,\n",
" 40.797307041702865]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.126',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96389627905332, 40.807999738165826]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morningside Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Morningside',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96389627905332,\n",
" 40.807999738165826,\n",
" -73.96389627905332,\n",
" 40.807999738165826]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.127',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98137594833541, 40.737209832715]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gramercy',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gramercy',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98137594833541,\n",
" 40.737209832715,\n",
" -73.98137594833541,\n",
" 40.737209832715]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.128',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01686930508617, 40.71193198394565]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Battery Park City',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Battery',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': 'City',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.01686930508617,\n",
" 40.71193198394565,\n",
" -74.01686930508617,\n",
" 40.71193198394565]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.129',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0106654452127, 40.70710710727048]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Financial District',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Financial',\n",
" 'annoline2': 'District',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.0106654452127,\n",
" 40.70710710727048,\n",
" -74.0106654452127,\n",
" 40.70710710727048]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.130',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91565374304234, 40.76850859335492]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Astoria',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Astoria',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.91565374304234,\n",
" 40.76850859335492,\n",
" -73.91565374304234,\n",
" 40.76850859335492]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.131',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90184166838284, 40.74634908860222]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90184166838284,\n",
" 40.74634908860222,\n",
" -73.90184166838284,\n",
" 40.74634908860222]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.132',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88282109164365, 40.75198138007367]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jackson Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jackson',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88282109164365,\n",
" 40.75198138007367,\n",
" -73.88282109164365,\n",
" 40.75198138007367]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.133',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88165622288388, 40.744048505122024]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Elmhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Elmhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88165622288388,\n",
" 40.744048505122024,\n",
" -73.88165622288388,\n",
" 40.744048505122024]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.134',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8381376460028, 40.65422527738487]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Howard Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Howard',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8381376460028,\n",
" 40.65422527738487,\n",
" -73.8381376460028,\n",
" 40.65422527738487]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.135',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85682497345258, 40.74238175015667]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Corona',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Corona',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85682497345258,\n",
" 40.74238175015667,\n",
" -73.85682497345258,\n",
" 40.74238175015667]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.136',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84447500788983, 40.72526378216503]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Forest Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Forest',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84447500788983,\n",
" 40.72526378216503,\n",
" -73.84447500788983,\n",
" 40.72526378216503]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.137',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82981905825703, 40.7051790354148]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kew Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Kew',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82981905825703,\n",
" 40.7051790354148,\n",
" -73.82981905825703,\n",
" 40.7051790354148]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.138',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83183321446887, 40.69794731471763]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.83183321446887,\n",
" 40.69794731471763,\n",
" -73.83183321446887,\n",
" 40.69794731471763]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.139',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83177300329582, 40.76445419697846]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flushing',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flushing',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.83177300329582,\n",
" 40.76445419697846,\n",
" -73.83177300329582,\n",
" 40.76445419697846]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.140',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93920223915505, 40.75021734610528]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Long Island City',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Long',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': 'City',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93920223915505,\n",
" 40.75021734610528,\n",
" -73.93920223915505,\n",
" 40.75021734610528]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.141',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92691617561577, 40.74017628351924]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.92691617561577,\n",
" 40.74017628351924,\n",
" -73.92691617561577,\n",
" 40.74017628351924]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.142',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86704147658772, 40.76407323883091]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Elmhurst',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Elmhurst',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.86704147658772,\n",
" 40.76407323883091,\n",
" -73.86704147658772,\n",
" 40.76407323883091]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.143',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89621713626859, 40.725427374093606]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Maspeth',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Maspeth',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89621713626859,\n",
" 40.725427374093606,\n",
" -73.89621713626859,\n",
" 40.725427374093606]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.144',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90143517559589, 40.70832315613858]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ridgewood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ridgewood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90143517559589,\n",
" 40.70832315613858,\n",
" -73.90143517559589,\n",
" 40.70832315613858]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.145',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87074167435605, 40.70276242967838]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Glendale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Glendale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.87074167435605,\n",
" 40.70276242967838,\n",
" -73.87074167435605,\n",
" 40.70276242967838]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.146',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8578268690537, 40.72897409480735]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rego Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rego Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8578268690537,\n",
" 40.72897409480735,\n",
" -73.8578268690537,\n",
" 40.72897409480735]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.147',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8581104655432, 40.68988687915789]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodhaven',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodhaven',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8581104655432,\n",
" 40.68988687915789,\n",
" -73.8581104655432,\n",
" 40.68988687915789]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.148',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84320266173447, 40.680708468265415]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ozone Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ozone Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84320266173447,\n",
" 40.680708468265415,\n",
" -73.84320266173447,\n",
" 40.680708468265415]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.149',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80986478649041, 40.66854957767195]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Ozone Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'South',\n",
" 'annoline2': 'Ozone Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80986478649041,\n",
" 40.66854957767195,\n",
" -73.80986478649041,\n",
" 40.66854957767195]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.150',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84304528896125, 40.784902749260205]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'College Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'College',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84304528896125,\n",
" 40.784902749260205,\n",
" -73.84304528896125,\n",
" 40.784902749260205]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.151',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81420216610863, 40.78129076602694]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Whitestone',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Whitestone',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81420216610863,\n",
" 40.78129076602694,\n",
" -73.81420216610863,\n",
" 40.78129076602694]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.152',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7742736306867, 40.76604063281064]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bayside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bayside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7742736306867,\n",
" 40.76604063281064,\n",
" -73.7742736306867,\n",
" 40.76604063281064]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.153',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79176243728061, 40.76172954903262]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Auburndale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Auburndale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79176243728061,\n",
" 40.76172954903262,\n",
" -73.79176243728061,\n",
" 40.76172954903262]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.154',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7388977558074, 40.7708261928267]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Little Neck',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Little',\n",
" 'annoline2': 'Neck',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7388977558074,\n",
" 40.7708261928267,\n",
" -73.7388977558074,\n",
" 40.7708261928267]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.155',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7424982072733, 40.76684609790763]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Douglaston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Douglaston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7424982072733,\n",
" 40.76684609790763,\n",
" -73.7424982072733,\n",
" 40.76684609790763]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.156',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.71548118999145, 40.74944079974332]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Glen Oaks',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Glen',\n",
" 'annoline2': 'Oaks',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.71548118999145,\n",
" 40.74944079974332,\n",
" -73.71548118999145,\n",
" 40.74944079974332]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.157',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.72012814826903, 40.72857318176675]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bellerose',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bellerose',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.72012814826903,\n",
" 40.72857318176675,\n",
" -73.72012814826903,\n",
" 40.72857318176675]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.158',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82087764933566, 40.722578244228046]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kew Gardens Hills',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Kew',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': 'Hills',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82087764933566,\n",
" 40.722578244228046,\n",
" -73.82087764933566,\n",
" 40.722578244228046]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.159',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.78271337003264, 40.7343944653313]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fresh Meadows',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fresh',\n",
" 'annoline2': 'Meadows',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.78271337003264,\n",
" 40.7343944653313,\n",
" -73.78271337003264,\n",
" 40.7343944653313]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.160',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81174822458634, 40.71093547252271]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Briarwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Briarwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81174822458634,\n",
" 40.71093547252271,\n",
" -73.81174822458634,\n",
" 40.71093547252271]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.161',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79690165888289, 40.70465736068717]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Center',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Center',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79690165888289,\n",
" 40.70465736068717,\n",
" -73.79690165888289,\n",
" 40.70465736068717]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.162',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75494976234332, 40.74561857141855]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Oakland Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Oakland',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75494976234332,\n",
" 40.74561857141855,\n",
" -73.75494976234332,\n",
" 40.74561857141855]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.163',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73871484578424, 40.718893092167356]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queens Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Queens',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73871484578424,\n",
" 40.718893092167356,\n",
" -73.73871484578424,\n",
" 40.718893092167356]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.164',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75925009335594, 40.71124344191904]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hollis',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hollis',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75925009335594,\n",
" 40.71124344191904,\n",
" -73.75925009335594,\n",
" 40.71124344191904]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.165',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7904261313554, 40.696911253789885]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Jamaica',\n",
" 'stacked': 1,\n",
" 'annoline1': 'South Jamaica',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7904261313554,\n",
" 40.696911253789885,\n",
" -73.7904261313554,\n",
" 40.696911253789885]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.166',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75867603727717, 40.69444538522359]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'St. Albans',\n",
" 'stacked': 1,\n",
" 'annoline1': 'St. Albans',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75867603727717,\n",
" 40.69444538522359,\n",
" -73.75867603727717,\n",
" 40.69444538522359]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.167',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.77258787620906, 40.67521139591733]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rochdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rochdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.77258787620906,\n",
" 40.67521139591733,\n",
" -73.77258787620906,\n",
" 40.67521139591733]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.168',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76042092682287, 40.666230490368584]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Springfield Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Springfield',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76042092682287,\n",
" 40.666230490368584,\n",
" -73.76042092682287,\n",
" 40.666230490368584]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.169',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73526873708026, 40.692774639160845]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cambria Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cambria',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73526873708026,\n",
" 40.692774639160845,\n",
" -73.73526873708026,\n",
" 40.692774639160845]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.170',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73526079428278, 40.659816433428084]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rosedale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rosedale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73526079428278,\n",
" 40.659816433428084,\n",
" -73.73526079428278,\n",
" 40.659816433428084]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.171',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75497968043872, 40.603134432500894]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Far Rockaway',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Far Rockaway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75497968043872,\n",
" 40.603134432500894,\n",
" -73.75497968043872,\n",
" 40.603134432500894]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.172',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8200548911032, 40.60302658351238]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Broad Channel',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Broad',\n",
" 'annoline2': 'Channel',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8200548911032,\n",
" 40.60302658351238,\n",
" -73.8200548911032,\n",
" 40.60302658351238]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.173',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92551196994168, 40.55740128845452]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Breezy Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Breezy',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.92551196994168,\n",
" 40.55740128845452,\n",
" -73.92551196994168,\n",
" 40.55740128845452]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.174',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90228960391673, 40.775923015642896]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Steinway',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Steinway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90228960391673,\n",
" 40.775923015642896,\n",
" -73.90228960391673,\n",
" 40.775923015642896]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.175',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80436451720988, 40.79278140360048]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Beechhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Beechhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80436451720988,\n",
" 40.79278140360048,\n",
" -73.80436451720988,\n",
" 40.79278140360048]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.176',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7768022262158, 40.782842806245554]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bay',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7768022262158,\n",
" 40.782842806245554,\n",
" -73.7768022262158,\n",
" 40.782842806245554]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.177',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.77613282391705, 40.595641807368494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edgemere',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Edgemere',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.77613282391705,\n",
" 40.595641807368494,\n",
" -73.77613282391705,\n",
" 40.595641807368494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.178',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79199233136943, 40.58914394372971]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arverne',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arverne',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79199233136943,\n",
" 40.58914394372971,\n",
" -73.79199233136943,\n",
" 40.58914394372971]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.179',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82236121088751, 40.582801696845586]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rockaway Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Rockaway',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82236121088751,\n",
" 40.582801696845586,\n",
" -73.82236121088751,\n",
" 40.582801696845586]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.180',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85754672410827, 40.572036730217015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Neponsit',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Neponsit',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85754672410827,\n",
" 40.572036730217015,\n",
" -73.85754672410827,\n",
" 40.572036730217015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.181',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81276269135866, 40.764126122614066]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Murray Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Murray',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81276269135866,\n",
" 40.764126122614066,\n",
" -73.81276269135866,\n",
" 40.764126122614066]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.182',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.70884705889246, 40.741378421945434]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Floral Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Floral Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.70884705889246,\n",
" 40.741378421945434,\n",
" -73.70884705889246,\n",
" 40.741378421945434]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.183',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76714166714729, 40.7209572076444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Holliswood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Holliswood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76714166714729,\n",
" 40.7209572076444,\n",
" -73.76714166714729,\n",
" 40.7209572076444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.184',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7872269693666, 40.71680483014613]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Estates',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Estates',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7872269693666,\n",
" 40.71680483014613,\n",
" -73.7872269693666,\n",
" 40.71680483014613]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.185',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82580915110559, 40.7445723092867]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queensboro Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Queensboro',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82580915110559,\n",
" 40.7445723092867,\n",
" -73.82580915110559,\n",
" 40.7445723092867]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.186',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79760300912672, 40.723824901829204]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hillcrest',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hillcrest',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79760300912672,\n",
" 40.723824901829204,\n",
" -73.79760300912672,\n",
" 40.723824901829204]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.187',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93157506072878, 40.761704526054146]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ravenswood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ravenswood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93157506072878,\n",
" 40.761704526054146,\n",
" -73.93157506072878,\n",
" 40.761704526054146]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.188',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84963782402441, 40.66391841925139]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lindenwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Lindenwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84963782402441,\n",
" 40.66391841925139,\n",
" -73.84963782402441,\n",
" 40.66391841925139]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.189',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.74025607989822, 40.66788389660247]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Laurelton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Laurelton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.74025607989822,\n",
" 40.66788389660247,\n",
" -73.74025607989822,\n",
" 40.66788389660247]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.190',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8625247141374, 40.736074570830795]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lefrak City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lefrak',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8625247141374,\n",
" 40.736074570830795,\n",
" -73.8625247141374,\n",
" 40.736074570830795]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.191',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8540175039252, 40.57615556543109]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Belle Harbor',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Belle Harbor',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8540175039252,\n",
" 40.57615556543109,\n",
" -73.8540175039252,\n",
" 40.57615556543109]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.192',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84153370226186, 40.58034295646131]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rockaway Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rockaway Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84153370226186,\n",
" 40.58034295646131,\n",
" -73.84153370226186,\n",
" 40.58034295646131]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.193',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79664750844047, 40.59771061565768]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Somerville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Somerville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79664750844047,\n",
" 40.59771061565768,\n",
" -73.79664750844047,\n",
" 40.59771061565768]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.194',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75175310731153, 40.66000322733613]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brookville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Brookville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75175310731153,\n",
" 40.66000322733613,\n",
" -73.75175310731153,\n",
" 40.66000322733613]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.195',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73889198912481, 40.73301404027834]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bellaire',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bellaire',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73889198912481,\n",
" 40.73301404027834,\n",
" -73.73889198912481,\n",
" 40.73301404027834]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.196',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85751790676447, 40.7540709990489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Corona',\n",
" 'stacked': 2,\n",
" 'annoline1': 'North',\n",
" 'annoline2': 'Corona',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85751790676447,\n",
" 40.7540709990489,\n",
" -73.85751790676447,\n",
" 40.7540709990489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.197',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8410221123401, 40.7146110815117]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Forest Hills Gardens',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Forest',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': 'Gardens',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8410221123401,\n",
" 40.7146110815117,\n",
" -73.8410221123401,\n",
" 40.7146110815117]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.198',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.07935312512797, 40.6449815710044]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'St. George',\n",
" 'stacked': 2,\n",
" 'annoline1': 'St.',\n",
" 'annoline2': 'George',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.07935312512797,\n",
" 40.6449815710044,\n",
" -74.07935312512797,\n",
" 40.6449815710044]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.199',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08701650516625, 40.64061455913511]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Brighton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Brighton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08701650516625,\n",
" 40.64061455913511,\n",
" -74.08701650516625,\n",
" 40.64061455913511]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.200',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.07790192660066, 40.62692762538176]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Stapleton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Stapleton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.07790192660066,\n",
" 40.62692762538176,\n",
" -74.07790192660066,\n",
" 40.62692762538176]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.201',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06980526716141, 40.61530494652761]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rosebank',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rosebank',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06980526716141,\n",
" 40.61530494652761,\n",
" -74.06980526716141,\n",
" 40.61530494652761]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.202',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1071817826561, 40.63187892654607]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Brighton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Brighton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1071817826561,\n",
" 40.63187892654607,\n",
" -74.1071817826561,\n",
" 40.63187892654607]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.203',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08724819983729, 40.624184791313006]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grymes Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Grymes',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08724819983729,\n",
" 40.624184791313006,\n",
" -74.08724819983729,\n",
" 40.624184791313006]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.204',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1113288180088, 40.59706851814673]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Todt Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Todt',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1113288180088,\n",
" 40.59706851814673,\n",
" -74.1113288180088,\n",
" 40.59706851814673]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.205',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0795529253982, 40.58024741350956]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'South',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0795529253982,\n",
" 40.58024741350956,\n",
" -74.0795529253982,\n",
" 40.58024741350956]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.206',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12943426797008, 40.63366930554365]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Richmond',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Richmond',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12943426797008,\n",
" 40.63366930554365,\n",
" -74.12943426797008,\n",
" 40.63366930554365]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.207',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15008537046981, 40.632546390481124]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': \"Mariner's Harbor\",\n",
" 'stacked': 2,\n",
" 'annoline1': \"Mariner's\",\n",
" 'annoline2': 'Harbor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15008537046981,\n",
" 40.632546390481124,\n",
" -74.15008537046981,\n",
" 40.632546390481124]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.208',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17464532993542, 40.63968297845542]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Ivory',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Ivory',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17464532993542,\n",
" 40.63968297845542,\n",
" -74.17464532993542,\n",
" 40.63968297845542]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.209',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.11918058534842, 40.61333593766742]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Castleton Corners',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Castleton',\n",
" 'annoline2': 'Corners',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.11918058534842,\n",
" 40.61333593766742,\n",
" -74.11918058534842,\n",
" 40.61333593766742]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.210',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.16496031329827, 40.594252379161695]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Springville',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Springville',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.16496031329827,\n",
" 40.594252379161695,\n",
" -74.16496031329827,\n",
" 40.594252379161695]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.211',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.19073717538116, 40.58631375103281]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Travis',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Travis',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.19073717538116,\n",
" 40.58631375103281,\n",
" -74.19073717538116,\n",
" 40.58631375103281]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.212',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1164794360638, 40.57257231820632]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Dorp',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Dorp',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1164794360638,\n",
" 40.57257231820632,\n",
" -74.1164794360638,\n",
" 40.57257231820632]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.213',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12156593771896, 40.5584622432888]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Oakwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Oakwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12156593771896,\n",
" 40.5584622432888,\n",
" -74.12156593771896,\n",
" 40.5584622432888]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.214',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.14932381490992, 40.549480228713605]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Great Kills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Great',\n",
" 'annoline2': 'Kills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.14932381490992,\n",
" 40.549480228713605,\n",
" -74.14932381490992,\n",
" 40.549480228713605]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.215',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1643308041936, 40.542230747450745]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Eltingville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Eltingville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1643308041936,\n",
" 40.542230747450745,\n",
" -74.1643308041936,\n",
" 40.542230747450745]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.216',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17854866165878, 40.53811417474507]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Annadale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Annadale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17854866165878,\n",
" 40.53811417474507,\n",
" -74.17854866165878,\n",
" 40.53811417474507]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.217',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.20524582480326, 40.541967622888755]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodrow',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodrow',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.20524582480326,\n",
" 40.541967622888755,\n",
" -74.20524582480326,\n",
" 40.541967622888755]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.218',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.24656934235283, 40.50533376115642]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tottenville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tottenville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.24656934235283,\n",
" 40.50533376115642,\n",
" -74.24656934235283,\n",
" 40.50533376115642]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.219',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08055351790115, 40.637316067110326]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tompkinsville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tompkinsville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08055351790115,\n",
" 40.637316067110326,\n",
" -74.08055351790115,\n",
" 40.637316067110326]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.220',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09629029235458, 40.61919310792676]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Silver Lake',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Silver',\n",
" 'annoline2': 'Lake',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09629029235458,\n",
" 40.61919310792676,\n",
" -74.09629029235458,\n",
" 40.61919310792676]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.221',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0971255217853, 40.61276015756489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0971255217853,\n",
" 40.61276015756489,\n",
" -74.0971255217853,\n",
" 40.61276015756489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.222',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96101312466779, 40.643675183340974]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ditmas Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ditmas',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96101312466779,\n",
" 40.643675183340974,\n",
" -73.96101312466779,\n",
" 40.643675183340974]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.223',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93718680559314, 40.66094656188111]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Wingate',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Wingate',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93718680559314,\n",
" 40.66094656188111,\n",
" -73.93718680559314,\n",
" 40.66094656188111]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.224',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92688212616955, 40.655572313280764]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rugby',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rugby',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92688212616955,\n",
" 40.655572313280764,\n",
" -73.92688212616955,\n",
" 40.655572313280764]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.225',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08015734936296, 40.60919044434558]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Park Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Park',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08015734936296,\n",
" 40.60919044434558,\n",
" -74.08015734936296,\n",
" 40.60919044434558]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.226',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13304143951704, 40.62109047275409]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Westerleigh',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Westerleigh',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13304143951704,\n",
" 40.62109047275409,\n",
" -74.13304143951704,\n",
" 40.62109047275409]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.227',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15315246387762, 40.620171512231884]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Graniteville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Graniteville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15315246387762,\n",
" 40.620171512231884,\n",
" -74.15315246387762,\n",
" 40.620171512231884]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.228',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.16510420241124, 40.63532509911492]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arlington',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arlington',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.16510420241124,\n",
" 40.63532509911492,\n",
" -74.16510420241124,\n",
" 40.63532509911492]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.229',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06712363225574, 40.596312571276734]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arrochar',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arrochar',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06712363225574,\n",
" 40.596312571276734,\n",
" -74.06712363225574,\n",
" 40.596312571276734]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.230',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0766743627905, 40.59826835959991]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grasmere',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Grasmere',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0766743627905,\n",
" 40.59826835959991,\n",
" -74.0766743627905,\n",
" 40.59826835959991]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.231',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08751118005578, 40.59632891379513]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Old Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Old',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08751118005578,\n",
" 40.59632891379513,\n",
" -74.08751118005578,\n",
" 40.59632891379513]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.232',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09639905312521, 40.588672948199275]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dongan Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Dongan',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09639905312521,\n",
" 40.588672948199275,\n",
" -74.09639905312521,\n",
" 40.588672948199275]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.233',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09348266303591, 40.57352690574283]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midland Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Midland',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09348266303591,\n",
" 40.57352690574283,\n",
" -74.09348266303591,\n",
" 40.57352690574283]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.234',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.10585598545434, 40.57621558711788]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grant City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Grant',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.10585598545434,\n",
" 40.57621558711788,\n",
" -74.10585598545434,\n",
" 40.57621558711788]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.235',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.10432707469124, 40.56425549307335]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Dorp Beach',\n",
" 'stacked': 3,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Dorp',\n",
" 'annoline3': 'Beach',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.10432707469124,\n",
" 40.56425549307335,\n",
" -74.10432707469124,\n",
" 40.56425549307335]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.236',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13916622175768, 40.55398800858462]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bay',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13916622175768,\n",
" 40.55398800858462,\n",
" -74.13916622175768,\n",
" 40.55398800858462]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.237',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.19174105747814, 40.531911920489605]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Huguenot',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Huguenot',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.19174105747814,\n",
" 40.531911920489605,\n",
" -74.19174105747814,\n",
" 40.531911920489605]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.238',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21983106616777, 40.524699376118136]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pleasant Plains',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pleasant',\n",
" 'annoline2': 'Plains',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21983106616777,\n",
" 40.524699376118136,\n",
" -74.21983106616777,\n",
" 40.524699376118136]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.239',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.22950350260027, 40.50608165346305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Butler Manor',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Butler',\n",
" 'annoline2': 'Manor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.22950350260027,\n",
" 40.50608165346305,\n",
" -74.22950350260027,\n",
" 40.50608165346305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.240',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.23215775896526, 40.53053148283314]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Charleston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Charleston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.23215775896526,\n",
" 40.53053148283314,\n",
" -74.23215775896526,\n",
" 40.53053148283314]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.241',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21572851113952, 40.54940400650072]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rossville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rossville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21572851113952,\n",
" 40.54940400650072,\n",
" -74.21572851113952,\n",
" 40.54940400650072]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.242',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18588674583893, 40.54928582278321]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arden Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Arden',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18588674583893,\n",
" 40.54928582278321,\n",
" -74.18588674583893,\n",
" 40.54928582278321]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.243',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17079414786092, 40.555295236173194]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Greenridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17079414786092,\n",
" 40.555295236173194,\n",
" -74.17079414786092,\n",
" 40.555295236173194]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.244',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15902208156601, 40.58913894875281]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Heartland Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Heartland',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15902208156601,\n",
" 40.58913894875281,\n",
" -74.15902208156601,\n",
" 40.58913894875281]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.245',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1895604551969, 40.59472602746295]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chelsea',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chelsea',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1895604551969,\n",
" 40.59472602746295,\n",
" -74.1895604551969,\n",
" 40.59472602746295]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.246',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18725638381567, 40.60577868452358]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bloomfield',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bloomfield',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18725638381567,\n",
" 40.60577868452358,\n",
" -74.18725638381567,\n",
" 40.60577868452358]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.247',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15940948657122, 40.6095918004203]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bulls Head',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bulls',\n",
" 'annoline2': 'Head',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15940948657122,\n",
" 40.6095918004203,\n",
" -74.15940948657122,\n",
" 40.6095918004203]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.248',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95325646837112, 40.7826825671257]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Carnegie Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Carnegie',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.95325646837112,\n",
" 40.7826825671257,\n",
" -73.95325646837112,\n",
" 40.7826825671257]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.249',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98843368023597, 40.72325901885768]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Noho',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Noho',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98843368023597,\n",
" 40.72325901885768,\n",
" -73.98843368023597,\n",
" 40.72325901885768]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.250',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00541529873355, 40.71522892046282]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Civic Center',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Civic',\n",
" 'annoline2': 'Center',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00541529873355,\n",
" 40.71522892046282,\n",
" -74.00541529873355,\n",
" 40.71522892046282]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.251',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98871313285247, 40.7485096643122]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midtown South',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Midtown',\n",
" 'annoline2': 'South',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98871313285247,\n",
" 40.7485096643122,\n",
" -73.98871313285247,\n",
" 40.7485096643122]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.252',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1340572986257, 40.56960594275505]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1340572986257,\n",
" 40.56960594275505,\n",
" -74.1340572986257,\n",
" 40.56960594275505]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.253',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06667766061771, 40.60971934079284]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Shore Acres',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Shore',\n",
" 'annoline2': 'Acres',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06667766061771,\n",
" 40.60971934079284,\n",
" -74.06667766061771,\n",
" 40.60971934079284]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.254',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.072642445484, 40.61917845202843]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clifton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Clifton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.072642445484,\n",
" 40.61917845202843,\n",
" -74.072642445484,\n",
" 40.61917845202843]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.255',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08402364740358, 40.6044731896879]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concord',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Concord',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08402364740358,\n",
" 40.6044731896879,\n",
" -74.08402364740358,\n",
" 40.6044731896879]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.256',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09776206972522, 40.606794394801]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Emerson Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Emerson',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09776206972522,\n",
" 40.606794394801,\n",
" -74.09776206972522,\n",
" 40.606794394801]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.257',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09805062373887, 40.63563000681151]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Randall Manor',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Randall',\n",
" 'annoline2': 'Manor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09805062373887,\n",
" 40.63563000681151,\n",
" -74.09805062373887,\n",
" 40.63563000681151]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.258',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18622331749823, 40.63843283794795]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Howland Hook',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Howland',\n",
" 'annoline2': 'Hook',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18622331749823,\n",
" 40.63843283794795,\n",
" -74.18622331749823,\n",
" 40.63843283794795]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.259',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1418167896889, 40.630146741193826]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Elm Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Elm',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1418167896889,\n",
" 40.630146741193826,\n",
" -74.1418167896889,\n",
" 40.630146741193826]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.260',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91665331978048, 40.652117451793494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Remsen Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Remsen',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91665331978048,\n",
" 40.652117451793494,\n",
" -73.91665331978048,\n",
" 40.652117451793494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.261',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88511776379292, 40.6627442796966]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Lots',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Lots',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.88511776379292,\n",
" 40.6627442796966,\n",
" -73.88511776379292,\n",
" 40.6627442796966]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.262',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90233474295836, 40.63131755039667]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Paerdegat Basin',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Paerdegat',\n",
" 'annoline2': 'Basin',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90233474295836,\n",
" 40.63131755039667,\n",
" -73.90233474295836,\n",
" 40.63131755039667]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.263',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91515391550404, 40.61597423962336]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mill Basin',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mill',\n",
" 'annoline2': 'Basin',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91515391550404,\n",
" 40.61597423962336,\n",
" -73.91515391550404,\n",
" 40.61597423962336]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.264',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79646462081593, 40.71145964370482]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79646462081593,\n",
" 40.71145964370482,\n",
" -73.79646462081593,\n",
" 40.71145964370482]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.265',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79671678028349, 40.73350025429757]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Utopia',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Utopia',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79671678028349,\n",
" 40.73350025429757,\n",
" -73.79671678028349,\n",
" 40.73350025429757]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.266',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80486120040537, 40.73493618075478]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pomonok',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Pomonok',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80486120040537,\n",
" 40.73493618075478,\n",
" -73.80486120040537,\n",
" 40.73493618075478]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.267',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89467996270574, 40.7703173929982]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Astoria Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Astoria',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89467996270574,\n",
" 40.7703173929982,\n",
" -73.89467996270574,\n",
" 40.7703173929982]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.268',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90119903387667, 40.83142834161548]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Claremont Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Claremont',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90119903387667,\n",
" 40.83142834161548,\n",
" -73.90119903387667,\n",
" 40.83142834161548]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.269',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91584652759009, 40.824780490842905]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concourse Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Concourse',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91584652759009,\n",
" 40.824780490842905,\n",
" -73.91584652759009,\n",
" 40.824780490842905]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.270',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91655551964419, 40.84382617671654]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mount Eden',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mount',\n",
" 'annoline2': 'Eden',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91655551964419,\n",
" 40.84382617671654,\n",
" -73.91655551964419,\n",
" 40.84382617671654]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.271',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90829930881988, 40.84884160724665]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mount Hope',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mount',\n",
" 'annoline2': 'Hope',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90829930881988,\n",
" 40.84884160724665,\n",
" -73.90829930881988,\n",
" 40.84884160724665]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.272',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96355614094303, 40.76028033131374]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sutton Place',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sutton',\n",
" 'annoline2': 'Place',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96355614094303,\n",
" 40.76028033131374,\n",
" -73.96355614094303,\n",
" 40.76028033131374]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.273',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95386782130745, 40.743414090073536]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hunters Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hunters',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.95386782130745,\n",
" 40.743414090073536,\n",
" -73.95386782130745,\n",
" 40.743414090073536]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.274',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96770824581834, 40.75204236950722]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Turtle Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Turtle',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96770824581834,\n",
" 40.75204236950722,\n",
" -73.96770824581834,\n",
" 40.75204236950722]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.275',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97121928722265, 40.746917410740195]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tudor City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Tudor',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97121928722265,\n",
" 40.746917410740195,\n",
" -73.97121928722265,\n",
" 40.746917410740195]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.276',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97405170469203, 40.73099955477061]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Stuyvesant Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Stuyvesant',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97405170469203,\n",
" 40.73099955477061,\n",
" -73.97405170469203,\n",
" 40.73099955477061]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.277',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9909471052826, 40.739673047638426]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatiron',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatiron',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9909471052826,\n",
" 40.739673047638426,\n",
" -73.9909471052826,\n",
" 40.739673047638426]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.278',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91819286431682, 40.74565180608076]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.91819286431682,\n",
" 40.74565180608076,\n",
" -73.91819286431682,\n",
" 40.74565180608076]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.279',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93244235260178, 40.73725071694497]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Blissville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Blissville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93244235260178,\n",
" 40.73725071694497,\n",
" -73.93244235260178,\n",
" 40.73725071694497]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.280',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99550751888415, 40.70328109093014]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fulton Ferry',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fulton',\n",
" 'annoline2': 'Ferry',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99550751888415,\n",
" 40.70328109093014,\n",
" -73.99550751888415,\n",
" 40.70328109093014]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.281',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98111603592393, 40.70332149882874]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Vinegar Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Vinegar',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98111603592393,\n",
" 40.70332149882874,\n",
" -73.98111603592393,\n",
" 40.70332149882874]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.282',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93053108817338, 40.67503986503237]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Weeksville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Weeksville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93053108817338,\n",
" 40.67503986503237,\n",
" -73.93053108817338,\n",
" 40.67503986503237]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.283',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90331684852599, 40.67786104769531]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Broadway Junction',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Broadway',\n",
" 'annoline2': 'Junction',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90331684852599,\n",
" 40.67786104769531,\n",
" -73.90331684852599,\n",
" 40.67786104769531]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.284',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9887528074504, 40.70317632822692]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dumbo',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Dumbo',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.9887528074504,\n",
" 40.70317632822692,\n",
" -73.9887528074504,\n",
" 40.70317632822692]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.285',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12059399718001, 40.60180957631444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manor Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manor',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12059399718001,\n",
" 40.60180957631444,\n",
" -74.12059399718001,\n",
" 40.60180957631444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.286',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13208447484298, 40.60370692627371]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Willowbrook',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Willowbrook',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13208447484298,\n",
" 40.60370692627371,\n",
" -74.13208447484298,\n",
" 40.60370692627371]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.287',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21776636068567, 40.541139922091766]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sandy Ground',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sandy',\n",
" 'annoline2': 'Ground',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21776636068567,\n",
" 40.541139922091766,\n",
" -74.21776636068567,\n",
" 40.541139922091766]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.288',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12727240604946, 40.579118742961214]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Egbertville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Egbertville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12727240604946,\n",
" 40.579118742961214,\n",
" -74.12727240604946,\n",
" 40.579118742961214]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.289',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89213760232822, 40.56737588957032]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Roxbury',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Roxbury',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89213760232822,\n",
" 40.56737588957032,\n",
" -73.89213760232822,\n",
" 40.56737588957032]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.290',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95918459428702, 40.598525095137255]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Homecrest',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Homecrest',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95918459428702,\n",
" 40.598525095137255,\n",
" -73.95918459428702,\n",
" 40.598525095137255]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.291',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88114319200604, 40.716414511158185]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Middle Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Middle',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88114319200604,\n",
" 40.716414511158185,\n",
" -73.88114319200604,\n",
" 40.716414511158185]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.292',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.20152556457658, 40.52626406734812]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': \"Prince's Bay\",\n",
" 'stacked': 2,\n",
" 'annoline1': \"Prince's\",\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.20152556457658,\n",
" 40.52626406734812,\n",
" -74.20152556457658,\n",
" 40.52626406734812]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.293',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13792663771568, 40.57650629379489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lighthouse Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lighthouse',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13792663771568,\n",
" 40.57650629379489,\n",
" -74.13792663771568,\n",
" 40.57650629379489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.294',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.22957080626941, 40.51954145748909]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Valley',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Valley',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.22957080626941,\n",
" 40.51954145748909,\n",
" -74.22957080626941,\n",
" 40.51954145748909]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.295',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82667757138641, 40.79060155670148]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Malba',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Malba',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82667757138641,\n",
" 40.79060155670148,\n",
" -73.82667757138641,\n",
" 40.79060155670148]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.296',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.890345709872, 40.6819989345173]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Highland Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Highland',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.890345709872,\n",
" 40.6819989345173,\n",
" -73.890345709872,\n",
" 40.6819989345173]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.297',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94841515328893, 40.60937770113766]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Madison',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Madison',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94841515328893,\n",
" 40.60937770113766,\n",
" -73.94841515328893,\n",
" 40.60937770113766]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.298',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86172577555115, 40.85272297633017]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bronxdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bronxdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86172577555115,\n",
" 40.85272297633017,\n",
" -73.86172577555115,\n",
" 40.85272297633017]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.299',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85931863221647, 40.86578787802982]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Allerton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Allerton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85931863221647,\n",
" 40.86578787802982,\n",
" -73.85931863221647,\n",
" 40.86578787802982]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.300',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90152264513144, 40.8703923914147]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kingsbridge Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Kingsbridge',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90152264513144,\n",
" 40.8703923914147,\n",
" -73.90152264513144,\n",
" 40.8703923914147]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.301',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94817709920184, 40.64692606658579]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Erasmus',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Erasmus',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94817709920184,\n",
" 40.64692606658579,\n",
" -73.94817709920184,\n",
" 40.64692606658579]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.302',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00011136202637, 40.75665808227519]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hudson Yards',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hudson',\n",
" 'annoline2': 'Yards',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00011136202637,\n",
" 40.75665808227519,\n",
" -74.00011136202637,\n",
" 40.75665808227519]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.303',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80553002968718, 40.58733774018741]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hammels',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hammels',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80553002968718,\n",
" 40.58733774018741,\n",
" -73.80553002968718,\n",
" 40.58733774018741]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.304',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76596781445627, 40.611321691283834]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bayswater',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bayswater',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76596781445627,\n",
" 40.611321691283834,\n",
" -73.76596781445627,\n",
" 40.611321691283834]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.305',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94563070334091, 40.756091297094706]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queensbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Queensbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.94563070334091,\n",
" 40.756091297094706,\n",
" -73.94563070334091,\n",
" 40.756091297094706]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.306',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08173992211962, 40.61731079252983]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fox Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fox',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08173992211962,\n",
" 40.61731079252983,\n",
" -74.08173992211962,\n",
" 40.61731079252983]}}],\n",
" 'crs': {'type': 'name', 'properties': {'name': 'urn:ogc:def:crs:EPSG::4326'}},\n",
" 'bbox': [-74.2492599487305,\n",
" 40.5033187866211,\n",
" -73.7061614990234,\n",
" 40.9105606079102]}"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"newyork_data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice how all the relevant data is in the *features* key, which is basically a list of the neighborhoods. So, let's define a new variable that includes this data."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"neighborhoods_data = newyork_data['features']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a look at the first item in this list."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"{'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.1',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84720052054902, 40.89470517661]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Wakefield',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Wakefield',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84720052054902,\n",
" 40.89470517661,\n",
" -73.84720052054902,\n",
" 40.89470517661]}}"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods_data[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Tranform the data into a *pandas* dataframe"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The next task is essentially transforming this data of nested Python dictionaries into a *pandas* dataframe. So let's start by creating an empty dataframe."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# define the dataframe columns\n",
"column_names = ['Borough', 'Neighborhood', 'Latitude', 'Longitude'] \n",
"\n",
"# instantiate the dataframe\n",
"neighborhoods = pd.DataFrame(columns=column_names)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Take a look at the empty dataframe to confirm that the columns are as intended."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [Borough, Neighborhood, Latitude, Longitude]\n",
"Index: []"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then let's loop through the data and fill the dataframe one row at a time."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for data in neighborhoods_data:\n",
" borough = neighborhood_name = data['properties']['borough'] \n",
" neighborhood_name = data['properties']['name']\n",
" \n",
" neighborhood_latlon = data['geometry']['coordinates']\n",
" neighborhood_lat = neighborhood_latlon[1]\n",
" neighborhood_lon = neighborhood_latlon[0]\n",
" \n",
" neighborhoods = neighborhoods.append({'Borough': borough,\n",
" 'Neighborhood': neighborhood_name,\n",
" 'Latitude': neighborhood_lat,\n",
" 'Longitude': neighborhood_lon}, ignore_index=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Quickly examine the resulting dataframe."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Bronx</td>\n",
" <td>Wakefield</td>\n",
" <td>40.894705</td>\n",
" <td>-73.847201</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Bronx</td>\n",
" <td>Co-op City</td>\n",
" <td>40.874294</td>\n",
" <td>-73.829939</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Bronx</td>\n",
" <td>Eastchester</td>\n",
" <td>40.887556</td>\n",
" <td>-73.827806</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Bronx</td>\n",
" <td>Fieldston</td>\n",
" <td>40.895437</td>\n",
" <td>-73.905643</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Bronx</td>\n",
" <td>Riverdale</td>\n",
" <td>40.890834</td>\n",
" <td>-73.912585</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Neighborhood Latitude Longitude\n",
"0 Bronx Wakefield 40.894705 -73.847201\n",
"1 Bronx Co-op City 40.874294 -73.829939\n",
"2 Bronx Eastchester 40.887556 -73.827806\n",
"3 Bronx Fieldston 40.895437 -73.905643\n",
"4 Bronx Riverdale 40.890834 -73.912585"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And make sure that the dataset has all 5 boroughs and 306 neighborhoods."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The dataframe has 5 boroughs and 306 neighborhoods.\n"
]
}
],
"source": [
"print('The dataframe has {} boroughs and {} neighborhoods.'.format(\n",
" len(neighborhoods['Borough'].unique()),\n",
" neighborhoods.shape[0]\n",
" )\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Use geopy library to get the latitude and longitude values of New York City."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to define an instance of the geocoder, we need to define a user_agent. We will name our agent <em>ny_explorer</em>, as shown below."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The geograpical coordinate of New York City are 40.7308619, -73.9871558.\n"
]
}
],
"source": [
"address = 'New York City, NY'\n",
"\n",
"geolocator = Nominatim(user_agent=\"ny_explorer\")\n",
"location = geolocator.geocode(address)\n",
"latitude = location.latitude\n",
"longitude = location.longitude\n",
"print('The geograpical coordinate of New York City are {}, {}.'.format(latitude, longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Create a map of New York with neighborhoods superimposed on top."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzMwODYxOSwtNzMuOTg3MTU1OF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfOGQ2ZjI2MzYxZDg2NDFmNmFiZDJkYTIyOTgxN2Y4Y2IgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwZTBiMTljYjFkNTQwOGRhZmEwY2QwZTI3N2QzMDUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODk0NzA1MTc2NjEsLTczLjg0NzIwMDUyMDU0OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA0YjEwMmZkNDljZTQzN2ViMjdjMWI3OTgwYjVkMjkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkzMTI5ODQ3MGU0ZjRmMTc5ZDNhZjhjMTRmODJmZDIyID0gJCgnPGRpdiBpZD0iaHRtbF85MzEyOTg0NzBlNGY0ZjE3OWQzYWY4YzE0ZjgyZmQyMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2FrZWZpZWxkLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDRiMTAyZmQ0OWNlNDM3ZWIyN2MxYjc5ODBiNWQyOTIuc2V0Q29udGVudChodG1sXzkzMTI5ODQ3MGU0ZjRmMTc5ZDNhZjhjMTRmODJmZDIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IwZTBiMTljYjFkNTQwOGRhZmEwY2QwZTI3N2QzMDUyLmJpbmRQb3B1cChwb3B1cF8wNGIxMDJmZDQ5Y2U0MzdlYjI3YzFiNzk4MGI1ZDI5Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ODI5OWFiYTk5NjU0NGUyOTg3NTYxNzA1NDRlNTkzOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NDI5NDE5MzAzMDEyLC03My44Mjk5MzkxMDgxMjM5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNzdkNDIwYWU5MTQ0NzllYmU3ZTFlMjRiZjNjMmExMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kODVhMjFmMjk1NmE0YjNmYTU4MjYwOTMwZWU5ZjA3NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDg1YTIxZjI5NTZhNGIzZmE1ODI2MDkzMGVlOWYwNzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvLW9wIENpdHksIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNzdkNDIwYWU5MTQ0NzllYmU3ZTFlMjRiZjNjMmExMi5zZXRDb250ZW50KGh0bWxfZDg1YTIxZjI5NTZhNGIzZmE1ODI2MDkzMGVlOWYwNzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTgyOTlhYmE5OTY1NDRlMjk4NzU2MTcwNTQ0ZTU5MzguYmluZFBvcHVwKHBvcHVwXzA3N2Q0MjBhZTkxNDQ3OWViZTdlMWUyNGJmM2MyYTEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VlNDYwNWFkMzhjMTRhNzg4OTk1NjBjYzY2ZmVjMDIwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODg3NTU1Njc3MzUwNzc1LC03My44Mjc4MDY0NDcxNjQxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYTUxNWQxZTE3ZDA0OGJmYjgxNThlYjEzZTMzMjIyMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYzk4Zjg1NTYwODY0OGMyYmJlZDdjZmZlMmY4N2ZjZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWM5OGY4NTU2MDg2NDhjMmJiZWQ3Y2ZmZTJmODdmY2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3RjaGVzdGVyLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWE1MTVkMWUxN2QwNDhiZmI4MTU4ZWIxM2UzMzIyMjIuc2V0Q29udGVudChodG1sX2VjOThmODU1NjA4NjQ4YzJiYmVkN2NmZmUyZjg3ZmNlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VlNDYwNWFkMzhjMTRhNzg4OTk1NjBjYzY2ZmVjMDIwLmJpbmRQb3B1cChwb3B1cF8xYTUxNWQxZTE3ZDA0OGJmYjgxNThlYjEzZTMzMjIyMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZjExMTJhMTlkN2I0NTIxODYyNmM0ODJkYzhlOTRiYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5NTQzNzQyNjkwMzgzLC03My45MDU2NDI1OTU5MTY4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NDkyYmUwYzg2OGM0Y2JjOTFiNzVmODg1ZTA2NGMwMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZDg1YzRkNWRmMzg0MWQwYmM3MzM3ZmYxNmY1NzU1NiA9ICQoJzxkaXYgaWQ9Imh0bWxfM2Q4NWM0ZDVkZjM4NDFkMGJjNzMzN2ZmMTZmNTc1NTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZpZWxkc3RvbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY0OTJiZTBjODY4YzRjYmM5MWI3NWY4ODVlMDY0YzAxLnNldENvbnRlbnQoaHRtbF8zZDg1YzRkNWRmMzg0MWQwYmM3MzM3ZmYxNmY1NzU1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZjExMTJhMTlkN2I0NTIxODYyNmM0ODJkYzhlOTRiYi5iaW5kUG9wdXAocG9wdXBfNjQ5MmJlMGM4NjhjNGNiYzkxYjc1Zjg4NWUwNjRjMDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDM3NTI5OGUyNzA3NDc0MjhkZTcwODA3M2IwOTUyYjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44OTA4MzQ0OTM4OTEzMDUsLTczLjkxMjU4NTQ2MTA4NTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGFiMGYzMDg2OTQ1NDYxMzg2MzM2ZjA2MDcyYTBjZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTkyMGY1N2JiMjk1NGZhZWJmZWIzYzk1MDVmOTExMjcgPSAkKCc8ZGl2IGlkPSJodG1sX2U5MjBmNTdiYjI5NTRmYWViZmViM2M5NTA1ZjkxMTI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYWIwZjMwODY5NDU0NjEzODYzMzZmMDYwNzJhMGNmZC5zZXRDb250ZW50KGh0bWxfZTkyMGY1N2JiMjk1NGZhZWJmZWIzYzk1MDVmOTExMjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDM3NTI5OGUyNzA3NDc0MjhkZTcwODA3M2IwOTUyYjAuYmluZFBvcHVwKHBvcHVwXzBhYjBmMzA4Njk0NTQ2MTM4NjMzNmYwNjA3MmEwY2ZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNjODcyOGI1MmY2NzQ4ZmViYmIwZmE0ZDMxYTg3Y2UyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODgxNjg3MzcxMjA1MjEsLTczLjkwMjgxNzk4NzI0NjA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYzNWZhMzM2MDkyMTQwZjFhZmM5ODY2M2E3MjE0NmQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QwMTY4MTZmNDkwMzRlODE5ZWI3MWM1YTcwYTk4YmRmID0gJCgnPGRpdiBpZD0iaHRtbF9kMDE2ODE2ZjQ5MDM0ZTgxOWViNzFjNWE3MGE5OGJkZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3NicmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MzVmYTMzNjA5MjE0MGYxYWZjOTg2NjNhNzIxNDZkNi5zZXRDb250ZW50KGh0bWxfZDAxNjgxNmY0OTAzNGU4MTllYjcxYzVhNzBhOThiZGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2M4NzI4YjUyZjY3NDhmZWJiYjBmYTRkMzFhODdjZTIuYmluZFBvcHVwKHBvcHVwXzYzNWZhMzM2MDkyMTQwZjFhZmM5ODY2M2E3MjE0NmQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJmOTI2MzRjMWYwMDRkN2Y5ZDgzM2M4Y2I1MjFlYTRlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YxZDg5Y2UxYzZiMDRmYjM4YjM3ZGExYjU2Yzk3YjgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdiZjVjZjlhZTZkODQxZjM4MjdmN2JmNDEzMmIyMzEyID0gJCgnPGRpdiBpZD0iaHRtbF83YmY1Y2Y5YWU2ZDg0MWYzODI3ZjdiZjQxMzJiMjMxMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjFkODljZTFjNmIwNGZiMzhiMzdkYTFiNTZjOTdiODIuc2V0Q29udGVudChodG1sXzdiZjVjZjlhZTZkODQxZjM4MjdmN2JmNDEzMmIyMzEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJmOTI2MzRjMWYwMDRkN2Y5ZDgzM2M4Y2I1MjFlYTRlLmJpbmRQb3B1cChwb3B1cF9mMWQ4OWNlMWM2YjA0ZmIzOGIzN2RhMWI1NmM5N2I4Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNGQ3OTA5ZDRjODg0OWZiYmQxY2EzNThmYjRlMTU3MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5ODI3MjYxMjEzODA1LC03My44NjczMTQ5NjgxNDE3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZDk3YjkxOGFhNmM0ZWRjOGNjNDRhOGMyOWNjYmVmMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMWJmNjkwYzU5OTU0OGI4YjcwMDdhNTRlZWZhMzFhNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTFiZjY5MGM1OTk1NDhiOGI3MDA3YTU0ZWVmYTMxYTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RsYXduLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGQ5N2I5MThhYTZjNGVkYzhjYzQ0YThjMjljY2JlZjMuc2V0Q29udGVudChodG1sXzExYmY2OTBjNTk5NTQ4YjhiNzAwN2E1NGVlZmEzMWE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE0ZDc5MDlkNGM4ODQ5ZmJiZDFjYTM1OGZiNGUxNTcwLmJpbmRQb3B1cChwb3B1cF8wZDk3YjkxOGFhNmM0ZWRjOGNjNDRhOGMyOWNjYmVmMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81M2EyZjIyMDE1MGM0ZmI0ODJmY2IzYzkyZjZjODY0OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NzIyNDE1NTk5NDQ2LC03My44NzkzOTA3Mzk1NjgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI1OTUyZDVlNzRmYTQwOThhZGQ3OWE2ZjFlNzI0ODFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkNzU5OTM2ZWY1ODQxY2M5ZDQ4ZWU0YThhZWFlODg5ID0gJCgnPGRpdiBpZD0iaHRtbF9lZDc1OTkzNmVmNTg0MWNjOWQ0OGVlNGE4YWVhZTg4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9yd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI1OTUyZDVlNzRmYTQwOThhZGQ3OWE2ZjFlNzI0ODFiLnNldENvbnRlbnQoaHRtbF9lZDc1OTkzNmVmNTg0MWNjOWQ0OGVlNGE4YWVhZTg4OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81M2EyZjIyMDE1MGM0ZmI0ODJmY2IzYzkyZjZjODY0OC5iaW5kUG9wdXAocG9wdXBfMjU5NTJkNWU3NGZhNDA5OGFkZDc5YTZmMWU3MjQ4MWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGY3NWY1NmNlMDZjNGY0MWExZDZmNjA3YzFmYTNhMmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEwMzg4NzgxOTIxMSwtNzMuODU3NDQ2NDI5NzQyMDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGU2MDgwNmQ4YzFjNDg5MGJmY2RkZWQ2N2E2YTIxYWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjZlNDgwZTZhMTUxNGRhMDllNTM4M2UzNmMyNGQwMzggPSAkKCc8ZGl2IGlkPSJodG1sX2Y2ZTQ4MGU2YTE1MTRkYTA5ZTUzODNlMzZjMjRkMDM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsaWFtc2JyaWRnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RlNjA4MDZkOGMxYzQ4OTBiZmNkZGVkNjdhNmEyMWFhLnNldENvbnRlbnQoaHRtbF9mNmU0ODBlNmExNTE0ZGEwOWU1MzgzZTM2YzI0ZDAzOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84Zjc1ZjU2Y2UwNmM0ZjQxYTFkNmY2MDdjMWZhM2EyYi5iaW5kUG9wdXAocG9wdXBfZGU2MDgwNmQ4YzFjNDg5MGJmY2RkZWQ2N2E2YTIxYWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTJhODExNGU1ZDY1NDc0ZWI1OGVkMmM2OTMyYTA5MzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NjY4NTgxMDcyNTI2OTYsLTczLjgzNTc5NzU5ODA4MTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJjMDgzNTViYzk0ZTQwNTQ4NmEzOTQyODU0MWY5YWUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzczNTA3ZTI1YTQ0NzRkZjc5MGJkNWMzZjEwODUxNGUxID0gJCgnPGRpdiBpZD0iaHRtbF83MzUwN2UyNWE0NDc0ZGY3OTBiZDVjM2YxMDg1MTRlMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5Y2hlc3RlciwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJjMDgzNTViYzk0ZTQwNTQ4NmEzOTQyODU0MWY5YWUyLnNldENvbnRlbnQoaHRtbF83MzUwN2UyNWE0NDc0ZGY3OTBiZDVjM2YxMDg1MTRlMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMmE4MTE0ZTVkNjU0NzRlYjU4ZWQyYzY5MzJhMDkzNC5iaW5kUG9wdXAocG9wdXBfMmMwODM1NWJjOTRlNDA1NDg2YTM5NDI4NTQxZjlhZTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjBkN2FhODE4YzkyNGQ0ZDk2ZDQ2NGM3NTAxMjE0N2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTc0MTM0OTgwODg2NSwtNzMuODU0NzU1NjQwMTc5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTM5YmZlNDQzZmRmNGZhNDlkYmU1YTQxY2E5MjE0YWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGYwZjMwODkyNzFjNGY0MWJlOTFhMzBmOTFjODEzN2IgPSAkKCc8ZGl2IGlkPSJodG1sXzRmMGYzMDg5MjcxYzRmNDFiZTkxYTMwZjkxYzgxMzdiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gUGFya3dheSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UzOWJmZTQ0M2ZkZjRmYTQ5ZGJlNWE0MWNhOTIxNGFlLnNldENvbnRlbnQoaHRtbF80ZjBmMzA4OTI3MWM0ZjQxYmU5MWEzMGY5MWM4MTM3Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMGQ3YWE4MThjOTI0ZDRkOTZkNDY0Yzc1MDEyMTQ3Yy5iaW5kUG9wdXAocG9wdXBfZTM5YmZlNDQzZmRmNGZhNDlkYmU1YTQxY2E5MjE0YWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGJjOGU5ZDU0NzVjNDUxYzgzZDA3NDA2ZDgyYWEzNzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDcyNDY3MDQ5MTgxMywtNzMuNzg2NDg4NDUyNjc0MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGEzZWQ4MDQwZTI4NDZhMGE3ZGZiZjU0MGExYjBjMTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGJkNzExOTEwZTBhNDViOGFiY2E3Njg4ZjNiNTYwZmUgPSAkKCc8ZGl2IGlkPSJodG1sXzhiZDcxMTkxMGUwYTQ1YjhhYmNhNzY4OGYzYjU2MGZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXR5IElzbGFuZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RhM2VkODA0MGUyODQ2YTBhN2RmYmY1NDBhMWIwYzE2LnNldENvbnRlbnQoaHRtbF84YmQ3MTE5MTBlMGE0NWI4YWJjYTc2ODhmM2I1NjBmZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80YmM4ZTlkNTQ3NWM0NTFjODNkMDc0MDZkODJhYTM3Mi5iaW5kUG9wdXAocG9wdXBfZGEzZWQ4MDQwZTI4NDZhMGE3ZGZiZjU0MGExYjBjMTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWUyNTA0NTFjOTRlNDA1OWI0ZWRiNWE0MTBjOWMwMWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzAxODUxNjQ5NzUzMjUsLTczLjg4NTUxMjE4NDE5MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmQyNjBhZjY0NTVkNDFjOTlkNzVmMDE0NjY2YTVmNGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzNhZTExY2VkY2M3NGQxMzk2MGZkZWVkMjlkMDc0NWYgPSAkKCc8ZGl2IGlkPSJodG1sXzMzYWUxMWNlZGNjNzRkMTM5NjBmZGVlZDI5ZDA3NDVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZWRmb3JkIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZDI2MGFmNjQ1NWQ0MWM5OWQ3NWYwMTQ2NjZhNWY0Zi5zZXRDb250ZW50KGh0bWxfMzNhZTExY2VkY2M3NGQxMzk2MGZkZWVkMjlkMDc0NWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWUyNTA0NTFjOTRlNDA1OWI0ZWRiNWE0MTBjOWMwMWEuYmluZFBvcHVwKHBvcHVwX2ZkMjYwYWY2NDU1ZDQxYzk5ZDc1ZjAxNDY2NmE1ZjRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U4Zjk4ZDhkOTJjNzQ3Yjg4YTNiOTgzMTMyYTc0YWE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU1NzI3MDc3MTk2NjQsLTczLjkxMDQxNTk2MTkxMzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWMzMjY3NmUzMDQ0NGM5N2JlY2M5OGNiY2QxMWE0YTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjFhNDQ3NmNjZjE4NDkzZmJjMzlkMjk2M2M1MTVmZjMgPSAkKCc8ZGl2IGlkPSJodG1sX2YxYTQ0NzZjY2YxODQ5M2ZiYzM5ZDI5NjNjNTE1ZmYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Vbml2ZXJzaXR5IEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYzMyNjc2ZTMwNDQ0Yzk3YmVjYzk4Y2JjZDExYTRhOS5zZXRDb250ZW50KGh0bWxfZjFhNDQ3NmNjZjE4NDkzZmJjMzlkMjk2M2M1MTVmZjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZThmOThkOGQ5MmM3NDdiODhhM2I5ODMxMzJhNzRhYTYuYmluZFBvcHVwKHBvcHVwX2VjMzI2NzZlMzA0NDRjOTdiZWNjOThjYmNkMTFhNGE5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUxN2FmNDU3Y2EwNTRlYTE4OWVlNTFiNWNlNjg3ZDdiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQ3ODk3OTI2MDYyNzEsLTczLjkxOTY3MTU5MTE5NTY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4ODA5YmMzMTM5MzRmZjFhMDk0ZTMwYzI1NTQyNDZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY0NjZmNTczNzQ1ZDRlY2JiN2ZiMmI5YTU5M2U1MDlmID0gJCgnPGRpdiBpZD0iaHRtbF82NDY2ZjU3Mzc0NWQ0ZWNiYjdmYjJiOWE1OTNlNTA5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lODgwOWJjMzEzOTM0ZmYxYTA5NGUzMGMyNTU0MjQ2Zi5zZXRDb250ZW50KGh0bWxfNjQ2NmY1NzM3NDVkNGVjYmI3ZmIyYjlhNTkzZTUwOWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTE3YWY0NTdjYTA1NGVhMTg5ZWU1MWI1Y2U2ODdkN2IuYmluZFBvcHVwKHBvcHVwX2U4ODA5YmMzMTM5MzRmZjFhMDk0ZTMwYzI1NTQyNDZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFjMzZkNTYwNzY1MDRiYjI5MjA2OWMxN2NjM2JkOWNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYwOTk2Nzk2Mzg2NTQsLTczLjg5NjQyNjU1OTgxNjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQxNTBhZDJiMmEyNjQ5NDNiMjE5MzY5N2Q1ZmFhNmIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVmNzc0MTI4MTQzYjQ1ZjU5NjAyZDdiZDAyMTExNmE2ID0gJCgnPGRpdiBpZD0iaHRtbF81Zjc3NDEyODE0M2I0NWY1OTYwMmQ3YmQwMjExMTZhNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZGhhbSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQxNTBhZDJiMmEyNjQ5NDNiMjE5MzY5N2Q1ZmFhNmIzLnNldENvbnRlbnQoaHRtbF81Zjc3NDEyODE0M2I0NWY1OTYwMmQ3YmQwMjExMTZhNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYzM2ZDU2MDc2NTA0YmIyOTIwNjljMTdjYzNiZDljZi5iaW5kUG9wdXAocG9wdXBfNDE1MGFkMmIyYTI2NDk0M2IyMTkzNjk3ZDVmYWE2YjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDBjMzBiYTRiMmZhNDU1MDk5MTNkMDI0N2NiZGE2M2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDI2OTYxNTc4NjA1MywtNzMuODg3MzU2MTc1MzIzMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDA2ZjRkNTEzMDQwNGEwOWIwN2U2NGQwNjI2YTBhYTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTcyOWViMDgxN2YzNGEwNDkyZWU1YmU0ZDkzMmRmNzggPSAkKCc8ZGl2IGlkPSJodG1sXzE3MjllYjA4MTdmMzRhMDQ5MmVlNWJlNGQ5MzJkZjc4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFRyZW1vbnQsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMDZmNGQ1MTMwNDA0YTA5YjA3ZTY0ZDA2MjZhMGFhNC5zZXRDb250ZW50KGh0bWxfMTcyOWViMDgxN2YzNGEwNDkyZWU1YmU0ZDkzMmRmNzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDBjMzBiYTRiMmZhNDU1MDk5MTNkMDI0N2NiZGE2M2MuYmluZFBvcHVwKHBvcHVwX2QwNmY0ZDUxMzA0MDRhMDliMDdlNjRkMDYyNmEwYWE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk0ZWM5YmRiNjE2YzQ1ZTg5OWZhN2UyMzU1OTRiMmQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM5NDc1MDU2NzI2NTMsLTczLjg3Nzc0NDc0OTEwNTQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYxYjlkMjMyMDgwYjQzYzRhYmM4NWQzMzRlZDM3YTgwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ5ZjM3NmYxYzNlOTQ3MGU4ZDY1ZWJiZTAyNjZiMjdhID0gJCgnPGRpdiBpZD0iaHRtbF80OWYzNzZmMWMzZTk0NzBlOGQ2NWViYmUwMjY2YjI3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBGYXJtcywgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYxYjlkMjMyMDgwYjQzYzRhYmM4NWQzMzRlZDM3YTgwLnNldENvbnRlbnQoaHRtbF80OWYzNzZmMWMzZTk0NzBlOGQ2NWViYmUwMjY2YjI3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NGVjOWJkYjYxNmM0NWU4OTlmYTdlMjM1NTk0YjJkMy5iaW5kUG9wdXAocG9wdXBfNjFiOWQyMzIwODBiNDNjNGFiYzg1ZDMzNGVkMzdhODApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODEzN2VlZTJlYzdjNDlhNjhjNWUyZDNjMzIwZjEzZmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzY2MjMwMTA3MDYwNTYsLTczLjkyNjEwMjA5MzU4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2ExMDk5ODhkMDFmNDhkMGEzMWY0ZTgxMjNkNTE1ZGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmEwYmJhMjAxYWI1NGQ2NGJiOTg2MmQ1NjY4MmI0Y2YgPSAkKCc8ZGl2IGlkPSJodG1sX2JhMGJiYTIwMWFiNTRkNjRiYjk4NjJkNTY2ODJiNGNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWdoICBCcmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYTEwOTk4OGQwMWY0OGQwYTMxZjRlODEyM2Q1MTVkZS5zZXRDb250ZW50KGh0bWxfYmEwYmJhMjAxYWI1NGQ2NGJiOTg2MmQ1NjY4MmI0Y2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODEzN2VlZTJlYzdjNDlhNjhjNWUyZDNjMzIwZjEzZmMuYmluZFBvcHVwKHBvcHVwX2NhMTA5OTg4ZDAxZjQ4ZDBhMzFmNGU4MTIzZDUxNWRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgwNTU3OTExZTM1NjRiNjQ5NzVmMmM4OWM0Mjk2N2Y3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE5NzU0MzcwNTk0OTM2LC03My45MDk0MjE2MDc1NzQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNzdlOWYyYWUyYTM0MGMwOTRkYjUyMzVhZTA1NjY3NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xOTYxMDZlMjI5ZGY0YWQ3ODhhMTY0ZTRhYWIxOGIwMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTk2MTA2ZTIyOWRmNGFkNzg4YTE2NGU0YWFiMThiMDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1lbHJvc2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNzdlOWYyYWUyYTM0MGMwOTRkYjUyMzVhZTA1NjY3Ni5zZXRDb250ZW50KGh0bWxfMTk2MTA2ZTIyOWRmNGFkNzg4YTE2NGU0YWFiMThiMDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODA1NTc5MTFlMzU2NGI2NDk3NWYyYzg5YzQyOTY3ZjcuYmluZFBvcHVwKHBvcHVwX2E3N2U5ZjJhZTJhMzQwYzA5NGRiNTIzNWFlMDU2Njc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y5Yjg5Yjk2NGFmODQ0NjY4MWMyZmVmOGE5MGU2MmMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2MjM4NzQ5MzUxNzcsLTczLjkxNjA5OTg3NDg3NTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QxMTljNTBlMDViODRlYzhhNTQ0OTk0M2EzOTBiODE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk4Y2FiODVmZjRkYzQ4MTJiZGY2MDgwMGI3OWYyZTc0ID0gJCgnPGRpdiBpZD0iaHRtbF85OGNhYjg1ZmY0ZGM0ODEyYmRmNjA4MDBiNzlmMmU3NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW90dCBIYXZlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QxMTljNTBlMDViODRlYzhhNTQ0OTk0M2EzOTBiODE4LnNldENvbnRlbnQoaHRtbF85OGNhYjg1ZmY0ZGM0ODEyYmRmNjA4MDBiNzlmMmU3NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mOWI4OWI5NjRhZjg0NDY2ODFjMmZlZjhhOTBlNjJjMC5iaW5kUG9wdXAocG9wdXBfZDExOWM1MGUwNWI4NGVjOGE1NDQ5OTQzYTM5MGI4MTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjBkNTlhMmUxZmM5NDVlNGIwZDVjNGQ1YjU3MzVmZmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDE2NjM2Mjc3NTYyMDYsLTczLjkxMzIyMTM5Mzg2MTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZkMTc2ODUxZWQ3MzQxODlhZmY4MWJlMjJiZDZkY2I3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU4ODJiYTI3OGQwMTQwNTA4ZWQ5ZmU4ZTQ3ZmM0YmI1ID0gJCgnPGRpdiBpZD0iaHRtbF81ODgyYmEyNzhkMDE0MDUwOGVkOWZlOGU0N2ZjNGJiNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBNb3JyaXMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZDE3Njg1MWVkNzM0MTg5YWZmODFiZTIyYmQ2ZGNiNy5zZXRDb250ZW50KGh0bWxfNTg4MmJhMjc4ZDAxNDA1MDhlZDlmZThlNDdmYzRiYjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjBkNTlhMmUxZmM5NDVlNGIwZDVjNGQ1YjU3MzVmZmEuYmluZFBvcHVwKHBvcHVwXzZkMTc2ODUxZWQ3MzQxODlhZmY4MWJlMjJiZDZkY2I3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MzYTgzYjc1N2NkODQzYzdiMTY1NTcyMDgzZmMxMWQ2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1MDk5MDQ1NDU4MjIsLTczLjg5NTc4ODIwMDk0NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDhiZDI5NDhhMjQwNGRiZTk4M2YzMmI4ZGViNzQyM2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWExMzZkYjU5NDc4NDQ3ZjgwMTVlY2ZlZWQ2YTI5ZGIgPSAkKCc8ZGl2IGlkPSJodG1sXzFhMTM2ZGI1OTQ3ODQ0N2Y4MDE1ZWNmZWVkNmEyOWRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Mb25nd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA4YmQyOTQ4YTI0MDRkYmU5ODNmMzJiOGRlYjc0MjNlLnNldENvbnRlbnQoaHRtbF8xYTEzNmRiNTk0Nzg0NDdmODAxNWVjZmVlZDZhMjlkYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jM2E4M2I3NTdjZDg0M2M3YjE2NTU3MjA4M2ZjMTFkNi5iaW5kUG9wdXAocG9wdXBfMDhiZDI5NDhhMjQwNGRiZTk4M2YzMmI4ZGViNzQyM2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDdjNWExOTZmYjUzNDg0YjhlZWE3MDM0YTJlMGNjODcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDk3Mjk4NzkzODcwOSwtNzMuODgzMzE1MDU5NTUyOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGRlZmI2NTBkZmI2NGE5NzllN2Q0NjAwNDdkNjJiYWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2I3NjA0M2Q4NjE5NGY0YTgzN2E1MWNmYTAyNzBiNGIgPSAkKCc8ZGl2IGlkPSJodG1sXzNiNzYwNDNkODYxOTRmNGE4MzdhNTFjZmEwMjcwYjRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW50cyBQb2ludCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBkZWZiNjUwZGZiNjRhOTc5ZTdkNDYwMDQ3ZDYyYmFmLnNldENvbnRlbnQoaHRtbF8zYjc2MDQzZDg2MTk0ZjRhODM3YTUxY2ZhMDI3MGI0Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wN2M1YTE5NmZiNTM0ODRiOGVlYTcwMzRhMmUwY2M4Ny5iaW5kUG9wdXAocG9wdXBfMGRlZmI2NTBkZmI2NGE5NzllN2Q0NjAwNDdkNjJiYWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGFjNTY2NjVkYWNiNDU2OGEzZmE2NWZkYjI1NDA5NWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM1OTE5ODU4NTUzNCwtNzMuOTAxNTA2NDg5NDMwNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzJkODg5ODY4MTQyNDljNmFjNTlhYTU2NTUwYWJjNDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjFlM2I0OGRkODBmNGM5ZDkxYTBmY2M5ZDhhN2M0ODYgPSAkKCc8ZGl2IGlkPSJodG1sXzIxZTNiNDhkZDgwZjRjOWQ5MWEwZmNjOWQ4YTdjNDg2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3JyaXNhbmlhLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzJkODg5ODY4MTQyNDljNmFjNTlhYTU2NTUwYWJjNDcuc2V0Q29udGVudChodG1sXzIxZTNiNDhkZDgwZjRjOWQ5MWEwZmNjOWQ4YTdjNDg2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhhYzU2NjY1ZGFjYjQ1NjhhM2ZhNjVmZGIyNTQwOTVjLmJpbmRQb3B1cChwb3B1cF83MmQ4ODk4NjgxNDI0OWM2YWM1OWFhNTY1NTBhYmM0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNThkMTBjMjM0ODE0MDNmYjQzNWI1ZjRiOWNiYjEwZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyMTAxMjE5NzkxNDAxNSwtNzMuODY1NzQ2MDk1NTQ5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODljM2VlZmFlYTI1NGE2ZjlkOTI1ODQ0YTY0NTEzYzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWI5OTlkZWY2ZjllNDEwMzg1NDYzZmY0MTUyN2E3MDQgPSAkKCc8ZGl2IGlkPSJodG1sXzliOTk5ZGVmNmY5ZTQxMDM4NTQ2M2ZmNDE1MjdhNzA0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb3VuZHZpZXcsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OWMzZWVmYWVhMjU0YTZmOWQ5MjU4NDRhNjQ1MTNjOS5zZXRDb250ZW50KGh0bWxfOWI5OTlkZWY2ZjllNDEwMzg1NDYzZmY0MTUyN2E3MDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTU4ZDEwYzIzNDgxNDAzZmI0MzViNWY0YjljYmIxMGQuYmluZFBvcHVwKHBvcHVwXzg5YzNlZWZhZWEyNTRhNmY5ZDkyNTg0NGE2NDUxM2M5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUwMzkwYjE2NzM0OTQwMWRhZmYyNWQyZGFmYTUzYmQxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2NTUxMTIwMDM1ODksLTczLjg1NDE0NDE2MTg5MjY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFhODIzYTA1OWUxNDRhODQ5NzQzNzViNzRlMGRiMjlmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MxNTMxYTFhOTM0MTQ5MTY4YTJjNjg2OTJlNTllMzUxID0gJCgnPGRpdiBpZD0iaHRtbF9jMTUzMWExYTkzNDE0OTE2OGEyYzY4NjkyZTU5ZTM1MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhc29uIFBvaW50LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWE4MjNhMDU5ZTE0NGE4NDk3NDM3NWI3NGUwZGIyOWYuc2V0Q29udGVudChodG1sX2MxNTMxYTFhOTM0MTQ5MTY4YTJjNjg2OTJlNTllMzUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUwMzkwYjE2NzM0OTQwMWRhZmYyNWQyZGFmYTUzYmQxLmJpbmRQb3B1cChwb3B1cF8xYTgyM2EwNTllMTQ0YTg0OTc0Mzc1Yjc0ZTBkYjI5Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MmNiYzEwOWM3NDU0M2QxOWY3YWQ3NDhiM2M2MzVkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTEwOTI1ODA0MDA1LC03My44MTYzNTAwMjE1ODQ0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNTJmZDhhZTRhYjU0Y2ZkYmYzNmI3ZGM4MWIzYzU1ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMWZiZTQ5ZWRmMDM0MGIzOTBhOGZiMTA0Njc3ZWMwMiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjFmYmU0OWVkZjAzNDBiMzkwYThmYjEwNDY3N2VjMDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRocm9ncyBOZWNrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTUyZmQ4YWU0YWI1NGNmZGJmMzZiN2RjODFiM2M1NWYuc2V0Q29udGVudChodG1sX2YxZmJlNDllZGYwMzQwYjM5MGE4ZmIxMDQ2NzdlYzAyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcyY2JjMTA5Yzc0NTQzZDE5ZjdhZDc0OGIzYzYzNWQxLmJpbmRQb3B1cChwb3B1cF9hNTJmZDhhZTRhYjU0Y2ZkYmYzNmI3ZGM4MWIzYzU1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yOGI1YTIyMjBhMDQ0NmY4YTFjZTBmZTFkYWRkZDk0MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg0NDI0NTkzNjk0NzM3NCwtNzMuODI0MDk5MjY3NTM4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YmU5N2UyNTIwOTE0ZDBhYTI0Zjc5YjI1ODRkMGEyMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYTEyMGY1OWMyNTI0ZDRiODA0YTg2MWQ3NWIyYjM2ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMmExMjBmNTljMjUyNGQ0YjgwNGE4NjFkNzViMmIzNmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvdW50cnkgQ2x1YiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzliZTk3ZTI1MjA5MTRkMGFhMjRmNzliMjU4NGQwYTIzLnNldENvbnRlbnQoaHRtbF8yYTEyMGY1OWMyNTI0ZDRiODA0YTg2MWQ3NWIyYjM2Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yOGI1YTIyMjBhMDQ0NmY4YTFjZTBmZTFkYWRkZDk0My5iaW5kUG9wdXAocG9wdXBfOWJlOTdlMjUyMDkxNGQwYWEyNGY3OWIyNTg0ZDBhMjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGU0N2Q0YWQ5M2ViNDQ4N2I3N2JmZmRiYWI0NDViNjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Mzc5Mzc4MjIyNjcyODYsLTczLjg1NjAwMzEwNTM1NzgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRhZTZiODNlNTY4MTQ4MmRiMWM1ZDI1ZWFmZWNmYWRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEwOGE4Mjc2NmUxZjQyOGM5MzE5ZTRlMTkwNjI4M2ViID0gJCgnPGRpdiBpZD0iaHRtbF8xMDhhODI3NjZlMWY0MjhjOTMxOWU0ZTE5MDYyODNlYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFya2NoZXN0ZXIsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YWU2YjgzZTU2ODE0ODJkYjFjNWQyNWVhZmVjZmFkZi5zZXRDb250ZW50KGh0bWxfMTA4YTgyNzY2ZTFmNDI4YzkzMTllNGUxOTA2MjgzZWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGU0N2Q0YWQ5M2ViNDQ4N2I3N2JmZmRiYWI0NDViNjYuYmluZFBvcHVwKHBvcHVwXzRhZTZiODNlNTY4MTQ4MmRiMWM1ZDI1ZWFmZWNmYWRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM3YmRiOGI1YTM1MDRmMzU4YTZiMDg1M2YyNjU0NTA5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQwNjE5NDk2NDMyNywtNzMuODQyMTk0MDc2MDQ0NDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjc3YTNmZDY2YTI1NDUxMGJmZjM1NWNjOWVjODJlMjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzYyMjEzOGFiN2FmNDljYTgzZDljOGJkNjg4MmM0N2UgPSAkKCc8ZGl2IGlkPSJodG1sXzM2MjIxMzhhYjdhZjQ5Y2E4M2Q5YzhiZDY4ODJjNDdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0Y2hlc3RlciBTcXVhcmUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNzdhM2ZkNjZhMjU0NTEwYmZmMzU1Y2M5ZWM4MmUyMS5zZXRDb250ZW50KGh0bWxfMzYyMjEzOGFiN2FmNDljYTgzZDljOGJkNjg4MmM0N2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzdiZGI4YjVhMzUwNGYzNThhNmIwODUzZjI2NTQ1MDkuYmluZFBvcHVwKHBvcHVwX2I3N2EzZmQ2NmEyNTQ1MTBiZmYzNTVjYzllYzgyZTIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZlNDVmYzI5MjAxZDQ3YmI4MjM3YWQ5M2FmM2E4OGU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzNjA4NDcxMjQ3MTgsLTczLjg2NjI5OTE4MDc1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzcwNzk2MDA0YjEzNGNjNWJmODNjNzIwNzE0Y2E4NmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWZlMjg0ODhhOTdlNGQxZTg4NjJmNjgwMTg2ZWExYzkgPSAkKCc8ZGl2IGlkPSJodG1sXzFmZTI4NDg4YTk3ZTRkMWU4ODYyZjY4MDE4NmVhMWM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WYW4gTmVzdCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc3MDc5NjAwNGIxMzRjYzViZjgzYzcyMDcxNGNhODZiLnNldENvbnRlbnQoaHRtbF8xZmUyODQ4OGE5N2U0ZDFlODg2MmY2ODAxODZlYTFjOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZTQ1ZmMyOTIwMWQ0N2JiODIzN2FkOTNhZjNhODhlNy5iaW5kUG9wdXAocG9wdXBfNzcwNzk2MDA0YjEzNGNjNWJmODNjNzIwNzE0Y2E4NmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTc3Nzc0NGM3ZTAxNDY4NmI3MGU5ZjU3MGJmYmMwNGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDc1NDkwNjM1MzYzMzQsLTczLjg1MDQwMTc4MDMwNDIxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM4OWNlODVlYWViYTRhY2ZiNDllNDQxOWEwZDNlNWNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQxMGMxNGI5ODRiMzRiZTFhMGIxNDBlY2I1YTNmNGNlID0gJCgnPGRpdiBpZD0iaHRtbF80MTBjMTRiOTg0YjM0YmUxYTBiMTQwZWNiNWEzZjRjZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zODljZTg1ZWFlYmE0YWNmYjQ5ZTQ0MTlhMGQzZTVjZi5zZXRDb250ZW50KGh0bWxfNDEwYzE0Yjk4NGIzNGJlMWEwYjE0MGVjYjVhM2Y0Y2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTc3Nzc0NGM3ZTAxNDY4NmI3MGU5ZjU3MGJmYmMwNGQuYmluZFBvcHVwKHBvcHVwXzM4OWNlODVlYWViYTRhY2ZiNDllNDQxOWEwZDNlNWNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcxNWQ1YzNhYWJiNzQ2NmU4OGViYjQ5YWRkYzJmYWFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU3Mjc3MTAwNzM4OTUsLTczLjg4ODQ1MTk2MTM0ODA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q1NjY1NTVkYWFmOTQ5OTBiMGNiZWQxMjA1NjMxMjIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUxYjY2ZDM3ZGY5YzRiYWVhMDc4YTc3ODgxMjJhOTY0ID0gJCgnPGRpdiBpZD0iaHRtbF81MWI2NmQzN2RmOWM0YmFlYTA3OGE3Nzg4MTIyYTk2NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbW9udCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q1NjY1NTVkYWFmOTQ5OTBiMGNiZWQxMjA1NjMxMjIyLnNldENvbnRlbnQoaHRtbF81MWI2NmQzN2RmOWM0YmFlYTA3OGE3Nzg4MTIyYTk2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MTVkNWMzYWFiYjc0NjZlODhlYmI0OWFkZGMyZmFhYS5iaW5kUG9wdXAocG9wdXBfZDU2NjU1NWRhYWY5NDk5MGIwY2JlZDEyMDU2MzEyMjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmEyOWI1NTBhOTU0NDBkZDk3NDZkMmQ3ZGY3MTJkNWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEzOTQ5NzcyNzA4NiwtNzMuOTE3MTkwNDgyMTAzOTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTU5YTc3MDE5OGIyNDc3YjkxYmI2NTIwZTc4YzI2YzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmVmZDczNDBlYzg5NDljMGI1NDUxMzIyNDVmMTY4Y2QgPSAkKCc8ZGl2IGlkPSJodG1sXzJlZmQ3MzQwZWM4OTQ5YzBiNTQ1MTMyMjQ1ZjE2OGNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHV5dGVuIER1eXZpbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk1OWE3NzAxOThiMjQ3N2I5MWJiNjUyMGU3OGMyNmM3LnNldENvbnRlbnQoaHRtbF8yZWZkNzM0MGVjODk0OWMwYjU0NTEzMjI0NWYxNjhjZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYTI5YjU1MGE5NTQ0MGRkOTc0NmQyZDdkZjcxMmQ1YS5iaW5kUG9wdXAocG9wdXBfOTU5YTc3MDE5OGIyNDc3YjkxYmI2NTIwZTc4YzI2YzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzFjNGNlNDZhZGZkNDFjMGIxYzQzMjg3NjFjZWU3OGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC45MDg1NDI4Mjk1MDY2NiwtNzMuOTA0NTMwNTQ5MDg5MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDUxZmYyMDliNGU1NDgzYWE1MTA2OGVlMGQ3OTIyMjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODM4NGIyYmQ1NDExNDQwZGFhOTJjZjY0NDkzYWRlNjEgPSAkKCc8ZGl2IGlkPSJodG1sXzgzODRiMmJkNTQxMTQ0MGRhYTkyY2Y2NDQ5M2FkZTYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBSaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NTFmZjIwOWI0ZTU0ODNhYTUxMDY4ZWUwZDc5MjIyMS5zZXRDb250ZW50KGh0bWxfODM4NGIyYmQ1NDExNDQwZGFhOTJjZjY0NDkzYWRlNjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzFjNGNlNDZhZGZkNDFjMGIxYzQzMjg3NjFjZWU3OGQuYmluZFBvcHVwKHBvcHVwXzQ1MWZmMjA5YjRlNTQ4M2FhNTEwNjhlZTBkNzkyMjIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdhYzRkMzZkNTk2MzQyZjJhNDYzYjVmZGMwZWRiNzllID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODUwNjQxNDA5NDAzMzUsLTczLjgzMjA3Mzc4MjQwNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjQ4YTgzYTFjMDU4NGRkMWI4ZmQxNzkzMWY1Yjc1MDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTllNjlmNTlkMTkxNDMwNTk1NjgwNTU3NzliMzQzYjEgPSAkKCc8ZGl2IGlkPSJodG1sX2E5ZTY5ZjU5ZDE5MTQzMDU5NTY4MDU1Nzc5YjM0M2IxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gQmF5LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjQ4YTgzYTFjMDU4NGRkMWI4ZmQxNzkzMWY1Yjc1MDcuc2V0Q29udGVudChodG1sX2E5ZTY5ZjU5ZDE5MTQzMDU5NTY4MDU1Nzc5YjM0M2IxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdhYzRkMzZkNTk2MzQyZjJhNDYzYjVmZGMwZWRiNzllLmJpbmRQb3B1cChwb3B1cF9iNDhhODNhMWMwNTg0ZGQxYjhmZDE3OTMxZjViNzUwNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MTk0YWMxNmZjNzQ0MDA4ODY5ZDJkNmE0MTA5ODY5YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyNjU3OTUxNjg2OTIyLC03My44MjYyMDI3NTk5NDA3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZjllODk5ZGRjZjc0M2U3YjlkMjQ4YmE3ZWEwNTc1YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMjZkNzVhZjMzOWI0NTBkYWE1Yjk0MzBiMzc1MTZmZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTI2ZDc1YWYzMzliNDUwZGFhNWI5NDMwYjM3NTE2ZmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjaHV5bGVydmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZjllODk5ZGRjZjc0M2U3YjlkMjQ4YmE3ZWEwNTc1Yy5zZXRDb250ZW50KGh0bWxfZTI2ZDc1YWYzMzliNDUwZGFhNWI5NDMwYjM3NTE2ZmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTE5NGFjMTZmYzc0NDAwODg2OWQyZDZhNDEwOTg2OWIuYmluZFBvcHVwKHBvcHVwX2VmOWU4OTlkZGNmNzQzZTdiOWQyNDhiYTdlYTA1NzVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQyNjU0MWNhZjY2YjQ0YjA5YjQ5ZTdiZDZiZTNlYzUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIxOTg2MTE4MTYzNDk0LC03My44MTM4ODUxNDQyODYxOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NDEwYWUzNjBlNTk0YjMyOTc4NDFiMjIwYWI3NzgwZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84OTVjZjIwNjc3MDg0Y2MxODBkY2IzYzMzZmE3YzE5NyA9ICQoJzxkaXYgaWQ9Imh0bWxfODk1Y2YyMDY3NzA4NGNjMTgwZGNiM2MzM2ZhN2MxOTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVkZ2V3YXRlciBQYXJrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTQxMGFlMzYwZTU5NGIzMjk3ODQxYjIyMGFiNzc4MGYuc2V0Q29udGVudChodG1sXzg5NWNmMjA2NzcwODRjYzE4MGRjYjNjMzNmYTdjMTk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQyNjU0MWNhZjY2YjQ0YjA5YjQ5ZTdiZDZiZTNlYzUxLmJpbmRQb3B1cChwb3B1cF81NDEwYWUzNjBlNTk0YjMyOTc4NDFiMjIwYWI3NzgwZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMGQzMTA5OTNjZmU0ZDJiYmRkNGU1ZWRhMmIwYmI3MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxOTAxNDM3Njk4ODMxNCwtNzMuODQ4MDI3Mjk1ODI3MzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmQ2ZWQyMjk4MjY2NDYyOGI1YjkwMmYzNzZjYzJmZjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjY4Yjc3ODFlMjAyNGRmZWI1MTJjMTFkMTg0NmUxMWMgPSAkKCc8ZGl2IGlkPSJodG1sX2I2OGI3NzgxZTIwMjRkZmViNTEyYzExZDE4NDZlMTFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGUgSGlsbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJkNmVkMjI5ODI2NjQ2MjhiNWI5MDJmMzc2Y2MyZmYxLnNldENvbnRlbnQoaHRtbF9iNjhiNzc4MWUyMDI0ZGZlYjUxMmMxMWQxODQ2ZTExYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMGQzMTA5OTNjZmU0ZDJiYmRkNGU1ZWRhMmIwYmI3MS5iaW5kUG9wdXAocG9wdXBfMmQ2ZWQyMjk4MjY2NDYyOGI1YjkwMmYzNzZjYzJmZjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjM5NmI2MWE5NmI4NDNjY2I5NTI5ZmIyYzBkZGFhZDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzEzNzA3ODE5MjM3MSwtNzMuODYzMzIzNjE2NTI3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTQ5ZjhiY2IxMGI5NGY5Y2JkYTYxZTQ5OWM0MGM4YzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODlkZjhjMDM0ZGI2NDNkMjlmNDkzNmQ0ZjFjNTFkNTcgPSAkKCc8ZGl2IGlkPSJodG1sXzg5ZGY4YzAzNGRiNjQzZDI5ZjQ5MzZkNGYxYzUxZDU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PbGludmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NDlmOGJjYjEwYjk0ZjljYmRhNjFlNDk5YzQwYzhjOS5zZXRDb250ZW50KGh0bWxfODlkZjhjMDM0ZGI2NDNkMjlmNDkzNmQ0ZjFjNTFkNTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjM5NmI2MWE5NmI4NDNjY2I5NTI5ZmIyYzBkZGFhZDQuYmluZFBvcHVwKHBvcHVwXzk0OWY4YmNiMTBiOTRmOWNiZGE2MWU0OTljNDBjOGM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI2OTY4MzgyZGU3NDQxMzFhNzBhMTU3ZWVjZWRhMjJiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYyOTY1NjI0Nzc5OTgsLTczLjg0MTYxMTk0ODMxMjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgxZjY0YjI1YWRjNDQxMDhhODhmZWEzOTFkOGI1ZDA1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JmZDkwMjgzNTVlMTRhNGZiODI3OTYyOGFhNjY2NjNhID0gJCgnPGRpdiBpZD0iaHRtbF9iZmQ5MDI4MzU1ZTE0YTRmYjgyNzk2MjhhYTY2NjYzYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGVsaGFtIEdhcmRlbnMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MWY2NGIyNWFkYzQ0MTA4YTg4ZmVhMzkxZDhiNWQwNS5zZXRDb250ZW50KGh0bWxfYmZkOTAyODM1NWUxNGE0ZmI4Mjc5NjI4YWE2NjY2M2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjY5NjgzODJkZTc0NDEzMWE3MGExNTdlZWNlZGEyMmIuYmluZFBvcHVwKHBvcHVwXzgxZjY0YjI1YWRjNDQxMDhhODhmZWEzOTFkOGI1ZDA1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q2ZmYxNTQ2YzNjNTRmODk4NGQ2Nzg2ZmE2YWIyNzJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM0MjgzODA3MzM4NTEsLTczLjkxNTU4OTQxNzczNDQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U3ZjcwZmJkOGVjYzQ4NWQ5MzhjNzUwNzdiMzdkNmJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5NzFiYjkyNWM2YzQ1MmE4NGUyNDRjMjA4ZTNkNTRhID0gJCgnPGRpdiBpZD0iaHRtbF9jOTcxYmI5MjVjNmM0NTJhODRlMjQ0YzIwOGUzZDU0YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTdmNzBmYmQ4ZWNjNDg1ZDkzOGM3NTA3N2IzN2Q2YmMuc2V0Q29udGVudChodG1sX2M5NzFiYjkyNWM2YzQ1MmE4NGUyNDRjMjA4ZTNkNTRhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q2ZmYxNTQ2YzNjNTRmODk4NGQ2Nzg2ZmE2YWIyNzJlLmJpbmRQb3B1cChwb3B1cF9lN2Y3MGZiZDhlY2M0ODVkOTM4Yzc1MDc3YjM3ZDZiYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMzMzZmJlYjAxYWU0MzczOGUyYTgyZTljODIyOWI2OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyOTc3NDI5Nzg3MTYxLC03My44NTA1MzUyNDQ1MTkzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xOGI1YzA5OGJkN2U0ZDE2YjE5Njg3MjNhODY0ZWNkOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MDg0MWY3ZTMyZTk0ZDkwYTY4M2M2YTQ5ZDliZjA3YiA9ICQoJzxkaXYgaWQ9Imh0bWxfOTA4NDFmN2UzMmU5NGQ5MGE2ODNjNmE0OWQ5YmYwN2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVuaW9ucG9ydCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE4YjVjMDk4YmQ3ZTRkMTZiMTk2ODcyM2E4NjRlY2Q4LnNldENvbnRlbnQoaHRtbF85MDg0MWY3ZTMyZTk0ZDkwYTY4M2M2YTQ5ZDliZjA3Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMzMzZmJlYjAxYWU0MzczOGUyYTgyZTljODIyOWI2OS5iaW5kUG9wdXAocG9wdXBfMThiNWMwOThiZDdlNGQxNmIxOTY4NzIzYTg2NGVjZDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2JhZjIzZjRiOGFhNDNlZTk0ZWMzM2ZkYWUxZWRmY2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODQ1NjEzMDMwMzczMiwtNzMuODQ4MDgyNzE4NzcxNjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDc4YzliYTZlYWJkNGY5ZGJiY2Q0MzA0YjMwOTVhMzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGM2N2VhZGVhOTYxNGEwNDllN2IyMjQ1Y2M3MTZmZjYgPSAkKCc8ZGl2IGlkPSJodG1sXzhjNjdlYWRlYTk2MTRhMDQ5ZTdiMjI0NWNjNzE2ZmY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZGVud2FsZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA3OGM5YmE2ZWFiZDRmOWRiYmNkNDMwNGIzMDk1YTM4LnNldENvbnRlbnQoaHRtbF84YzY3ZWFkZWE5NjE0YTA0OWU3YjIyNDVjYzcxNmZmNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYmFmMjNmNGI4YWE0M2VlOTRlYzMzZmRhZTFlZGZjYS5iaW5kUG9wdXAocG9wdXBfMDc4YzliYTZlYWJkNGY5ZGJiY2Q0MzA0YjMwOTVhMzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGUwNmM4M2E0OTZiNDJlZWE0MzAzNmMzY2M1YTcxOGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU4MDEwNjUwMTA2NTYsLTc0LjAzMDYyMDY5MzUzODEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxZTIwNDI1ODZjNDQwNjFhZjY4YTBhNzYzOWEzYTE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRmYjE4MjYyNjE1NDQ2MDZiYTc3NTIzZGRkYmE1MWM1ID0gJCgnPGRpdiBpZD0iaHRtbF80ZmIxODI2MjYxNTQ0NjA2YmE3NzUyM2RkZGJhNTFjNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5IFJpZGdlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTFlMjA0MjU4NmM0NDA2MWFmNjhhMGE3NjM5YTNhMTQuc2V0Q29udGVudChodG1sXzRmYjE4MjYyNjE1NDQ2MDZiYTc3NTIzZGRkYmE1MWM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RlMDZjODNhNDk2YjQyZWVhNDMwMzZjM2NjNWE3MThkLmJpbmRQb3B1cChwb3B1cF81MWUyMDQyNTg2YzQ0MDYxYWY2OGEwYTc2MzlhM2ExNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xOTc3YjdmOTBkYzk0MGNiYjk1YzkyMzJmZTQ1Zjc2MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxMTAwODkwMjAyMDQ0LC03My45OTUxNzk5ODM4MDcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jN2RkYzMyNTEzM2Q0YjdhYTg2NzI4ZDBlM2RkYTM4MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYWRlZjYzZTFiMjc0NGU0YTEzYjU3ZTdjN2U5NzMxMSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2FkZWY2M2UxYjI3NDRlNGExM2I1N2U3YzdlOTczMTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbnNvbmh1cnN0LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzdkZGMzMjUxMzNkNGI3YWE4NjcyOGQwZTNkZGEzODIuc2V0Q29udGVudChodG1sX2NhZGVmNjNlMWIyNzQ0ZTRhMTNiNTdlN2M3ZTk3MzExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE5NzdiN2Y5MGRjOTQwY2JiOTVjOTIzMmZlNDVmNzYxLmJpbmRQb3B1cChwb3B1cF9jN2RkYzMyNTEzM2Q0YjdhYTg2NzI4ZDBlM2RkYTM4Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NDgwZGE5YTg2MDA0N2M2YWVhYTcxZjNlMTA2NWUxMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NTEwMjk0OTI1NDI5LC03NC4wMTAzMTYxODUyNzc4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNWUyZmIwMTU3YjI0NTg3YWQ1YjAwYzA3Y2ZhOWYwMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZmY1YjUzNDE5NzI0MjI5YmVjZjY1OWEzNWY2NDM5ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNGZmNWI1MzQxOTcyNDIyOWJlY2Y2NTlhMzVmNjQzOWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1bnNldCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTVlMmZiMDE1N2IyNDU4N2FkNWIwMGMwN2NmYTlmMDIuc2V0Q29udGVudChodG1sXzRmZjViNTM0MTk3MjQyMjliZWNmNjU5YTM1ZjY0MzlmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg0ODBkYTlhODYwMDQ3YzZhZWFhNzFmM2UxMDY1ZTEwLmJpbmRQb3B1cChwb3B1cF8xNWUyZmIwMTU3YjI0NTg3YWQ1YjAwYzA3Y2ZhOWYwMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZWRmOTg1ZjU0NTk0ZjUzYWQ0YTZhZTU2OGY2MTFjOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczMDIwMDk4NDg2NDcsLTczLjk1NDI0MDkzMTI3MzkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA2ZTgwZTFhZjAzZjQ2MzA4YzBhNzdjM2M4ZDhjNGY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ0YTU5NTY0ZTFkZDQ1N2I4MzUxYTA2ZmQxY2RhM2RlID0gJCgnPGRpdiBpZD0iaHRtbF80NGE1OTU2NGUxZGQ0NTdiODM1MWEwNmZkMWNkYTNkZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW5wb2ludCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA2ZTgwZTFhZjAzZjQ2MzA4YzBhNzdjM2M4ZDhjNGY2LnNldENvbnRlbnQoaHRtbF80NGE1OTU2NGUxZGQ0NTdiODM1MWEwNmZkMWNkYTNkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZWRmOTg1ZjU0NTk0ZjUzYWQ0YTZhZTU2OGY2MTFjOC5iaW5kUG9wdXAocG9wdXBfMDZlODBlMWFmMDNmNDYzMDhjMGE3N2MzYzhkOGM0ZjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmRjMGQzYzgzMzMzNGJmYTllMTVjMDhlMTJhNDEyNTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTUyNjAwMTMwNjU5MywtNzMuOTczNDcwODc3MDg0NDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDI2Nzc2OGRjODllNDAzZDgyZDNjNzZhZGE0ODU5ZTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODlkMzAyZDM4MWJiNDY1ZThlOTBjMTk2MDk5MTEzNDYgPSAkKCc8ZGl2IGlkPSJodG1sXzg5ZDMwMmQzODFiYjQ2NWU4ZTkwYzE5NjA5OTExMzQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmF2ZXNlbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMjY3NzY4ZGM4OWU0MDNkODJkM2M3NmFkYTQ4NTllOC5zZXRDb250ZW50KGh0bWxfODlkMzAyZDM4MWJiNDY1ZThlOTBjMTk2MDk5MTEzNDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmRjMGQzYzgzMzMzNGJmYTllMTVjMDhlMTJhNDEyNTMuYmluZFBvcHVwKHBvcHVwXzAyNjc3NjhkYzg5ZTQwM2Q4MmQzYzc2YWRhNDg1OWU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmNTFiNjlmMGRkYjRmYzM5OTMxYzk4NWI3MmNmMDYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2ODI1MDY1NjY2MDQsLTczLjk2NTA5NDQ4Nzg1MzM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4ZmU5Mjc4YjM1ZjQwZWRiNDg2OGM5M2YyMjc5YjVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRlMTdhMmVkNWMxODRkZmU5Y2Y0MGI5MTBmM2UyMGU5ID0gJCgnPGRpdiBpZD0iaHRtbF80ZTE3YTJlZDVjMTg0ZGZlOWNmNDBiOTEwZjNlMjBlOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpZ2h0b24gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOGZlOTI3OGIzNWY0MGVkYjQ4NjhjOTNmMjI3OWI1Zi5zZXRDb250ZW50KGh0bWxfNGUxN2EyZWQ1YzE4NGRmZTljZjQwYjkxMGYzZTIwZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmY1MWI2OWYwZGRiNGZjMzk5MzFjOTg1YjcyY2YwNjIuYmluZFBvcHVwKHBvcHVwXzE4ZmU5Mjc4YjM1ZjQwZWRiNDg2OGM5M2YyMjc5YjVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmMGQ0NGJmZDMxYjRlMDc5ZjdmNjg3ZWJlYWQxZTc2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg2ODkwMTI2NzgzODQsLTczLjk0MzE4NjQwNDgyOTc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JkMDE1ZGFhYmY0MTRlN2E5NjgwMjZiMjkzYjRkOGJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBlNDUzZjhmYmYyNjRjYjRiNzljOTFmMjYzZTViYjQ5ID0gJCgnPGRpdiBpZD0iaHRtbF8wZTQ1M2Y4ZmJmMjY0Y2I0Yjc5YzkxZjI2M2U1YmI0OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hlZXBzaGVhZCBCYXksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZDAxNWRhYWJmNDE0ZTdhOTY4MDI2YjI5M2I0ZDhiZS5zZXRDb250ZW50KGh0bWxfMGU0NTNmOGZiZjI2NGNiNGI3OWM5MWYyNjNlNWJiNDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmYwZDQ0YmZkMzFiNGUwNzlmN2Y2ODdlYmVhZDFlNzYuYmluZFBvcHVwKHBvcHVwX2JkMDE1ZGFhYmY0MTRlN2E5NjgwMjZiMjkzYjRkOGJlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJmMTFjYjY3YmQ3MzRmMDU5OGRjNTdlZjY1Njk4OTdkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE0NDMyNTEzMzUwOTgsLTczLjk1NzQzODQwNTU5OTM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc2OTU0Y2ZkMWM5NTRkYjRiOWI3OGE3Mjc3MjUxMTdiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FiNTAzMjUzZGFhYzQzOTk4YjMyNzAyODY0ZjM4ZjY3ID0gJCgnPGRpdiBpZD0iaHRtbF9hYjUwMzI1M2RhYWM0Mzk5OGIzMjcwMjg2NGYzOGY2NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFuaGF0dGFuIFRlcnJhY2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83Njk1NGNmZDFjOTU0ZGI0YjliNzhhNzI3NzI1MTE3Yi5zZXRDb250ZW50KGh0bWxfYWI1MDMyNTNkYWFjNDM5OThiMzI3MDI4NjRmMzhmNjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmYxMWNiNjdiZDczNGYwNTk4ZGM1N2VmNjU2OTg5N2QuYmluZFBvcHVwKHBvcHVwXzc2OTU0Y2ZkMWM5NTRkYjRiOWI3OGE3Mjc3MjUxMTdiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhjYjVmNzlhNzI4NjQ0YzNhMmY3YTAwNzJjZWI0OWRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM2MzI1ODkwMjY2NzcsLTczLjk1ODQwMTA2NTMzOTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk0YTRmNWVhNGExYzRmZjBiYzFhMzMwNjAyMDczN2MxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcwYWUxM2ZlNzExNjQ3NTk5ODcyM2E2NzQ2MzNlZmQ0ID0gJCgnPGRpdiBpZD0iaHRtbF83MGFlMTNmZTcxMTY0NzU5OTg3MjNhNjc0NjMzZWZkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGJ1c2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NGE0ZjVlYTRhMWM0ZmYwYmMxYTMzMDYwMjA3MzdjMS5zZXRDb250ZW50KGh0bWxfNzBhZTEzZmU3MTE2NDc1OTk4NzIzYTY3NDYzM2VmZDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGNiNWY3OWE3Mjg2NDRjM2EyZjdhMDA3MmNlYjQ5ZGMuYmluZFBvcHVwKHBvcHVwXzk0YTRmNWVhNGExYzRmZjBiYzFhMzMwNjAyMDczN2MxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MxZmE4ZDU4YmFlYjQxOTdhNzIyZWViNWZlYjBmODUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjcwODI5MTc2OTUyOTQsLTczLjk0MzI5MTE5MDczNTgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2NTAxN2IwYmY5NjRmMWFhM2NhYmY4ZDMxMGNjZGFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UxNTY0MGI4ZDY1MDQzZTM4YmVhYzM1YmZjZjZhYzQzID0gJCgnPGRpdiBpZD0iaHRtbF9lMTU2NDBiOGQ2NTA0M2UzOGJlYWMzNWJmY2Y2YWM0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3Jvd24gSGVpZ2h0cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE2NTAxN2IwYmY5NjRmMWFhM2NhYmY4ZDMxMGNjZGFkLnNldENvbnRlbnQoaHRtbF9lMTU2NDBiOGQ2NTA0M2UzOGJlYWMzNWJmY2Y2YWM0Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMWZhOGQ1OGJhZWI0MTk3YTcyMmVlYjVmZWIwZjg1MS5iaW5kUG9wdXAocG9wdXBfMTY1MDE3YjBiZjk2NGYxYWEzY2FiZjhkMzEwY2NkYWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmUwYzBmMWZhZWYzNDgzNGJmYzFkYTBhODdiZWE4OWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDE3MTc3NjY2ODk2MSwtNzMuOTM2MTAyNTYxODU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDg1ZTRkYTE2MzA1NGExYTgzYjg5NzJkYmE0ZGQ1MDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDQzMDQxYzUwZjk4NGFjYzkxMjk3YjkzNzIwZTUzM2YgPSAkKCc8ZGl2IGlkPSJodG1sXzA0MzA0MWM1MGY5ODRhY2M5MTI5N2I5MzcyMGU1MzNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEZsYXRidXNoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDg1ZTRkYTE2MzA1NGExYTgzYjg5NzJkYmE0ZGQ1MDEuc2V0Q29udGVudChodG1sXzA0MzA0MWM1MGY5ODRhY2M5MTI5N2I5MzcyMGU1MzNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZlMGMwZjFmYWVmMzQ4MzRiZmMxZGEwYTg3YmVhODljLmJpbmRQb3B1cChwb3B1cF8wODVlNGRhMTYzMDU0YTFhODNiODk3MmRiYTRkZDUwMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MzQyOWViZjI5YmE0ZTY4OGYwZGMwMjEzMTM3MjVlYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MjM4MTk1ODAwMzUyNiwtNzMuOTgwNDIxMTA1NTk0NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGQzNjUxN2VkZGM3NDBjMmE4NzU4MzhmYmIzZGRiMjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGM1NzNmMjQyMWNjNGI3NGFiZTgwNDIyODRlYmIyZWYgPSAkKCc8ZGl2IGlkPSJodG1sXzBjNTczZjI0MjFjYzRiNzRhYmU4MDQyMjg0ZWJiMmVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LZW5zaW5ndG9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGQzNjUxN2VkZGM3NDBjMmE4NzU4MzhmYmIzZGRiMjcuc2V0Q29udGVudChodG1sXzBjNTczZjI0MjFjYzRiNzRhYmU4MDQyMjg0ZWJiMmVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkzNDI5ZWJmMjliYTRlNjg4ZjBkYzAyMTMxMzcyNWVjLmJpbmRQb3B1cChwb3B1cF8wZDM2NTE3ZWRkYzc0MGMyYTg3NTgzOGZiYjNkZGIyNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YmI2ZTY1NTJmMGU0NjBmOTIzODliOTk4YmZmNDQ2ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY1Njk0NTgzNTc1MTA0LC03My45ODAwNzM0MDQzMDE3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZTBmODUyMGJjMzM0ZmFhYmE4MWFhMTc3NjBiMTYzMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZTZjOGZmNmI0MzQ0YmY4Yjk1ZjdlNDZiNGM3NGFjYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNGU2YzhmZjZiNDM0NGJmOGI5NWY3ZTQ2YjRjNzRhY2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbmRzb3IgVGVycmFjZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZlMGY4NTIwYmMzMzRmYWFiYTgxYWExNzc2MGIxNjMwLnNldENvbnRlbnQoaHRtbF80ZTZjOGZmNmI0MzQ0YmY4Yjk1ZjdlNDZiNGM3NGFjYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YmI2ZTY1NTJmMGU0NjBmOTIzODliOTk4YmZmNDQ2ZS5iaW5kUG9wdXAocG9wdXBfZmUwZjg1MjBiYzMzNGZhYWJhODFhYTE3NzYwYjE2MzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTU2YmU4NTUyYjdkNDk2MzlkNmViODI0MmRlNjkxOGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzY4MjIyNjIyNTQ3MjQsLTczLjk2NDg1OTI0MjYyNjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmNhYThjMGJmNDQ2NDA2YTgyZjM4ZTFmODU2NGRmMDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTQxNDZiNzNjZWY5NDQ4MDkzYTFkYjI3ZDY5NGYzZTUgPSAkKCc8ZGl2IGlkPSJodG1sXzU0MTQ2YjczY2VmOTQ0ODA5M2ExZGIyN2Q2OTRmM2U1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmNhYThjMGJmNDQ2NDA2YTgyZjM4ZTFmODU2NGRmMDIuc2V0Q29udGVudChodG1sXzU0MTQ2YjczY2VmOTQ0ODA5M2ExZGIyN2Q2OTRmM2U1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U1NmJlODU1MmI3ZDQ5NjM5ZDZlYjgyNDJkZTY5MThlLmJpbmRQb3B1cChwb3B1cF9iY2FhOGMwYmY0NDY0MDZhODJmMzhlMWY4NTY0ZGYwMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80N2E2NmQ0MDY2ODg0MjAxOTk1ZDAwYTU3NDY2NzU4NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2Mzk0OTk0MzM5NzU1LC03My45MTAyMzUzNjE3NjYwN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMmFkM2JhN2MxYmE0Yjc4YjY2YzMwMDU3ZTUwMjE0OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zY2Y5NzhlZjhiMTU0ODI5YjM3MjQwN2EwMTQzYjgyYiA9ICQoJzxkaXYgaWQ9Imh0bWxfM2NmOTc4ZWY4YjE1NDgyOWIzNzI0MDdhMDE0M2I4MmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb3duc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzJhZDNiYTdjMWJhNGI3OGI2NmMzMDA1N2U1MDIxNDguc2V0Q29udGVudChodG1sXzNjZjk3OGVmOGIxNTQ4MjliMzcyNDA3YTAxNDNiODJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ3YTY2ZDQwNjY4ODQyMDE5OTVkMDBhNTc0NjY3NTg1LmJpbmRQb3B1cChwb3B1cF9jMmFkM2JhN2MxYmE0Yjc4YjY2YzMwMDU3ZTUwMjE0OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kODlmMGQ3ZWM0MDA0MjBkYmFmOThjMTZiYzU2MGE3MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwNzE0NDM5MzQ0MjUxLC03My45NTgxMTUyOTIyMDkyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mOTY1ZjM4MzA1ZTE0Yzg0YTY2MzVkMTM5MTFmOTMyMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yODhlMTZiNjUxNjc0NTViYjQ5MmFlMDZhNGJmZmNmMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjg4ZTE2YjY1MTY3NDU1YmI0OTJhZTA2YTRiZmZjZjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxpYW1zYnVyZywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y5NjVmMzgzMDVlMTRjODRhNjYzNWQxMzkxMWY5MzIxLnNldENvbnRlbnQoaHRtbF8yODhlMTZiNjUxNjc0NTViYjQ5MmFlMDZhNGJmZmNmMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kODlmMGQ3ZWM0MDA0MjBkYmFmOThjMTZiYzU2MGE3MC5iaW5kUG9wdXAocG9wdXBfZjk2NWYzODMwNWUxNGM4NGE2NjM1ZDEzOTExZjkzMjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTAzOTE0NWY0MDJiNGQwMjllOTBhZWUzZTA0YTUwZDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTgxMTYxMTAxNzkwMSwtNzMuOTI1MjU3OTc0ODcwNDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWNlM2UxNzljMTk0NDQyMmIxNTA2OGJiZmVkMDE0ZTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmZiMmRmOTYxYWUyNDU5ZjlhYWNlZDljNzhiZTgxNGIgPSAkKCc8ZGl2IGlkPSJodG1sXzJmYjJkZjk2MWFlMjQ1OWY5YWFjZWQ5Yzc4YmU4MTRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNod2ljaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FjZTNlMTc5YzE5NDQ0MjJiMTUwNjhiYmZlZDAxNGU1LnNldENvbnRlbnQoaHRtbF8yZmIyZGY5NjFhZTI0NTlmOWFhY2VkOWM3OGJlODE0Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MDM5MTQ1ZjQwMmI0ZDAyOWU5MGFlZTNlMDRhNTBkOC5iaW5kUG9wdXAocG9wdXBfYWNlM2UxNzljMTk0NDQyMmIxNTA2OGJiZmVkMDE0ZTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzVjNDZmMjM4MWMzNDIyYmFmZTQyMTYzZTJkZDcwYmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODcyMzE2MDc3MjA0NTYsLTczLjk0MTc4NDg4NjkwMjk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM4OTQ0NDVmMzgzZTQ2Mjk5M2M1ZGY2Y2E2ODdlOWNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiNzI4MWQ5MDAzMzQ2NGRiODRiNTBjNTRmZTcwN2ZiID0gJCgnPGRpdiBpZD0iaHRtbF9jYjcyODFkOTAwMzM0NjRkYjg0YjUwYzU0ZmU3MDdmYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVkZm9yZCBTdHV5dmVzYW50LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzg5NDQ0NWYzODNlNDYyOTkzYzVkZjZjYTY4N2U5Y2Iuc2V0Q29udGVudChodG1sX2NiNzI4MWQ5MDAzMzQ2NGRiODRiNTBjNTRmZTcwN2ZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc1YzQ2ZjIzODFjMzQyMmJhZmU0MjE2M2UyZGQ3MGJjLmJpbmRQb3B1cChwb3B1cF8zODk0NDQ1ZjM4M2U0NjI5OTNjNWRmNmNhNjg3ZTljYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZWU2NWQ2YWFiYTM0ZjQ5YmYxYjQ0Nzg0MzBkMmY3NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5NTg2MzcyMjcyNDA4NCwtNzMuOTkzNzgyMjU0OTY0MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWQ1MTFlYmNjYzVhNGE1Y2ExNmViNWE1NDU5ZDhmZGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjlkZTBjZjQ0NGJlNDdiNDhkMzllODI1ZDhlZTY0NjcgPSAkKCc8ZGl2IGlkPSJodG1sXzI5ZGUwY2Y0NDRiZTQ3YjQ4ZDM5ZTgyNWQ4ZWU2NDY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9va2x5biBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWQ1MTFlYmNjYzVhNGE1Y2ExNmViNWE1NDU5ZDhmZGYuc2V0Q29udGVudChodG1sXzI5ZGUwY2Y0NDRiZTQ3YjQ4ZDM5ZTgyNWQ4ZWU2NDY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBlZTY1ZDZhYWJhMzRmNDliZjFiNDQ3ODQzMGQyZjc3LmJpbmRQb3B1cChwb3B1cF81ZDUxMWViY2NjNWE0YTVjYTE2ZWI1YTU0NTlkOGZkZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYzZjYzk0MzQ1MmE0YjkyOTg0MDdhYmQ5OTI1MDI3ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4NzkxOTcyMjQ4NTU3NCwtNzMuOTk4NTYxMzkyMTg0NjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTRkMWY2NjQyMzExNGFkNTliNzkwYzc4NGVhMTAzNmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTBlOTQ5ZWY2ZDRmNGNlMGE0MDJlZGE3YzRkMDJlM2UgPSAkKCc8ZGl2IGlkPSJodG1sXzkwZTk0OWVmNmQ0ZjRjZTBhNDAyZWRhN2M0ZDAyZTNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db2JibGUgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0ZDFmNjY0MjMxMTRhZDU5Yjc5MGM3ODRlYTEwMzZiLnNldENvbnRlbnQoaHRtbF85MGU5NDllZjZkNGY0Y2UwYTQwMmVkYTdjNGQwMmUzZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYzZjYzk0MzQ1MmE0YjkyOTg0MDdhYmQ5OTI1MDI3ZS5iaW5kUG9wdXAocG9wdXBfOTRkMWY2NjQyMzExNGFkNTliNzkwYzc4NGVhMTAzNmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTUxNjA3NTQxOGRkNGJjMGFmMjMwZjE3ZTFhNzhlOWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA1NDAyMzEwNzY0ODUsLTczLjk5NDY1MzcyODI4MDA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJlOWNhNDhhM2VlYTQ0Y2Q5NGZlMTU3NjEwODU0MmM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNhMWM0MDllOTgzOTQ3ZDhhODk1NWM0NGVkZWZiZTY4ID0gJCgnPGRpdiBpZD0iaHRtbF8zYTFjNDA5ZTk4Mzk0N2Q4YTg5NTVjNDRlZGVmYmU2OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2Fycm9sbCBHYXJkZW5zLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmU5Y2E0OGEzZWVhNDRjZDk0ZmUxNTc2MTA4NTQyYzcuc2V0Q29udGVudChodG1sXzNhMWM0MDllOTgzOTQ3ZDhhODk1NWM0NGVkZWZiZTY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk1MTYwNzU0MThkZDRiYzBhZjIzMGYxN2UxYTc4ZTllLmJpbmRQb3B1cChwb3B1cF8yZTljYTQ4YTNlZWE0NGNkOTRmZTE1NzYxMDg1NDJjNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NTg1YTQxZmZjOTc0NGViYmM1Njg4YTM4MmZlMDlkYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3NjI1MzIzMDI1MDg4NiwtNzQuMDEyNzU4OTc0NzM1Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMmZhZWE4Y2Q4YTk0NzMwOGE0MzcwMzk1OTE1NzZiYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMzU4Yzk2NzEzYWY0YzRlOGU4ODhiMmU0NGQxMGNhZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDM1OGM5NjcxM2FmNGM0ZThlODg4YjJlNDRkMTBjYWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlZCBIb29rLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjJmYWVhOGNkOGE5NDczMDhhNDM3MDM5NTkxNTc2YmIuc2V0Q29udGVudChodG1sX2QzNThjOTY3MTNhZjRjNGU4ZTg4OGIyZTQ0ZDEwY2FlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg1ODVhNDFmZmM5NzQ0ZWJiYzU2ODhhMzgyZmUwOWRiLmJpbmRQb3B1cChwb3B1cF8yMmZhZWE4Y2Q4YTk0NzMwOGE0MzcwMzk1OTE1NzZiYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNGQ2YTBkNzY5ZDE0OTIxOGU0NjdmOGU3N2U3M2YzOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MzkzMTE0MzE4NzE1NCwtNzMuOTk0NDQwODcxNDUzMzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmFmOGM2ZTJjZGIwNGViY2I4YmVmYjY2NDQ0ZDA4YjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTIyN2MzN2FmMmRkNDVmNGFmYzgyYjU0OWRlOTU2OTIgPSAkKCc8ZGl2IGlkPSJodG1sXzUyMjdjMzdhZjJkZDQ1ZjRhZmM4MmI1NDlkZTk1NjkyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Hb3dhbnVzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmFmOGM2ZTJjZGIwNGViY2I4YmVmYjY2NDQ0ZDA4YjEuc2V0Q29udGVudChodG1sXzUyMjdjMzdhZjJkZDQ1ZjRhZmM4MmI1NDlkZTk1NjkyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q0ZDZhMGQ3NjlkMTQ5MjE4ZTQ2N2Y4ZTc3ZTczZjM5LmJpbmRQb3B1cChwb3B1cF9iYWY4YzZlMmNkYjA0ZWJjYjhiZWZiNjY0NDRkMDhiMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZGMxZjUyMDczZDM0MzU2ODM3YWYwYzY2ZWVjNzJhOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4ODUyNzI2MDE4OTc3LC03My45NzI5MDU3NDM2OTA5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84M2JhNzJjMzBhMjE0ZWJhYmE0YTYzM2FkN2VmMTk0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NmE1OTgyMjJlMjE0YzIyOGRlNmRkODg3NzE4OWMwZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjZhNTk4MjIyZTIxNGMyMjhkZTZkZDg4NzcxODljMGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgR3JlZW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODNiYTcyYzMwYTIxNGViYWJhNGE2MzNhZDdlZjE5NDAuc2V0Q29udGVudChodG1sXzY2YTU5ODIyMmUyMTRjMjI4ZGU2ZGQ4ODc3MTg5YzBlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NkYzFmNTIwNzNkMzQzNTY4MzdhZjBjNjZlZWM3MmE5LmJpbmRQb3B1cChwb3B1cF84M2JhNzJjMzBhMjE0ZWJhYmE0YTYzM2FkN2VmMTk0MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYTZhYzI2ZDgyMzg0M2UxOWQxZmViMmVmYzM2OTY5YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MjMyMDUyMjY4MTk3LC03My45NzcwNTAzMDE4MzkyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iOTI5NjRhZDk5NjQ0YTE5OWZlMjczMzE0ODc5YzkxZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNjVjNWVjNmNjMjc0YmUxOTkzNGUzMzMwYzU3OWQ3NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTY1YzVlYzZjYzI3NGJlMTk5MzRlMzMzMGM1NzlkNzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmsgU2xvcGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iOTI5NjRhZDk5NjQ0YTE5OWZlMjczMzE0ODc5YzkxZC5zZXRDb250ZW50KGh0bWxfZTY1YzVlYzZjYzI3NGJlMTk5MzRlMzMzMGM1NzlkNzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWE2YWMyNmQ4MjM4NDNlMTlkMWZlYjJlZmMzNjk2OWIuYmluZFBvcHVwKHBvcHVwX2I5Mjk2NGFkOTk2NDRhMTk5ZmUyNzMzMTQ4NzljOTFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBlNWYzOGQ2M2FmZDQ4MjJiODc2YzJjMDIzODdjNzVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjgyMzkxMDExNDQyMTEsLTczLjg3NjYxNTk2NDU3Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NhYjVjYzMyYTZhNjQ3Nzg4NmJkNjhlMGFhZTVjY2FjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VmYTdkZTNjZGRkODRmN2I4NjE2ODZkZGVlMGU4ODg4ID0gJCgnPGRpdiBpZD0iaHRtbF9lZmE3ZGUzY2RkZDg0ZjdiODYxNjg2ZGRlZTBlODg4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3lwcmVzcyBIaWxscywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NhYjVjYzMyYTZhNjQ3Nzg4NmJkNjhlMGFhZTVjY2FjLnNldENvbnRlbnQoaHRtbF9lZmE3ZGUzY2RkZDg0ZjdiODYxNjg2ZGRlZTBlODg4OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZTVmMzhkNjNhZmQ0ODIyYjg3NmMyYzAyMzg3Yzc1Zi5iaW5kUG9wdXAocG9wdXBfY2FiNWNjMzJhNmE2NDc3ODg2YmQ2OGUwYWFlNWNjYWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjg4NzQxOTJlYzYzNDQzYjgwZmRlNWY3OWZjMzc0NGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njk5MjU3MDA4NDcwNDUsLTczLjg4MDY5ODYzOTE3MzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RlMDc5YWJiNWRmYTRiODM5NGVhYmQwYmQxNzlkODMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ViZjk0MTk2ODdjNjRjYWFiNWRiN2E1YzU4ZGRjNGZhID0gJCgnPGRpdiBpZD0iaHRtbF9lYmY5NDE5Njg3YzY0Y2FhYjVkYjdhNWM1OGRkYzRmYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBOZXcgWW9yaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RlMDc5YWJiNWRmYTRiODM5NGVhYmQwYmQxNzlkODMzLnNldENvbnRlbnQoaHRtbF9lYmY5NDE5Njg3YzY0Y2FhYjVkYjdhNWM1OGRkYzRmYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mODg3NDE5MmVjNjM0NDNiODBmZGU1Zjc5ZmMzNzQ0YS5iaW5kUG9wdXAocG9wdXBfZGUwNzlhYmI1ZGZhNGI4Mzk0ZWFiZDBiZDE3OWQ4MzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWQ3NmU5Njk1YTFiNDZmYjk2YTRhZTAxNTBhMGFkZmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDc1ODkwNTIzMDg3NCwtNzMuODc5MzY5NzAwNDU4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzdiMmNjNTU5Y2Q4NDY4YWIzYzQ0Y2E2MjIyYjAwMjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTI0YWY5ZDI5ZGY0NDI1MmIzOTE3ODk4MTE1M2RkNGYgPSAkKCc8ZGl2IGlkPSJodG1sX2UyNGFmOWQyOWRmNDQyNTJiMzkxNzg5ODExNTNkZDRmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdGFycmV0dCBDaXR5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzdiMmNjNTU5Y2Q4NDY4YWIzYzQ0Y2E2MjIyYjAwMjEuc2V0Q29udGVudChodG1sX2UyNGFmOWQyOWRmNDQyNTJiMzkxNzg5ODExNTNkZDRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VkNzZlOTY5NWExYjQ2ZmI5NmE0YWUwMTUwYTBhZGZkLmJpbmRQb3B1cChwb3B1cF9jN2IyY2M1NTljZDg0NjhhYjNjNDRjYTYyMjJiMDAyMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lOWZmYTAyOGEzNmI0ZGU2YTZkZTgzNzI4YTE3N2Y5YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzNTU2NDMyNzk3NDI4LC03My45MDIwOTI2OTc3ODk2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNTFjM2E4ZjI3MDk0MDgyODUzNDc1ZjViZWEwZjRjYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYzUzYjc1ODY3ODU0YTg0OGM1Y2NjNTQ4Yjg5Nzg4ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYWM1M2I3NTg2Nzg1NGE4NDhjNWNjYzU0OGI4OTc4OGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhbmFyc2llLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzUxYzNhOGYyNzA5NDA4Mjg1MzQ3NWY1YmVhMGY0Y2Muc2V0Q29udGVudChodG1sX2FjNTNiNzU4Njc4NTRhODQ4YzVjY2M1NDhiODk3ODhkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U5ZmZhMDI4YTM2YjRkZTZhNmRlODM3MjhhMTc3ZjljLmJpbmRQb3B1cChwb3B1cF9jNTFjM2E4ZjI3MDk0MDgyODUzNDc1ZjViZWEwZjRjYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZWM1OTZhOTViNGI0MTkyOGFkMzJjZWFlMWVhYTI1YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMDQ0NjA0Mzc1NzQ2NiwtNzMuOTI5MTEzMDI2NDQ2NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmY5NDhkMTJmYTU3NDAzZGJiOWI4NjU5ODgzMTg0ZWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTAwYTQwZWRkOTZkNGRiNmI3ZGRlMmUyZTc2NjBkMjQgPSAkKCc8ZGl2IGlkPSJodG1sXzkwMGE0MGVkZDk2ZDRkYjZiN2RkZTJlMmU3NjYwZDI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbGF0bGFuZHMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZjk0OGQxMmZhNTc0MDNkYmI5Yjg2NTk4ODMxODRlZi5zZXRDb250ZW50KGh0bWxfOTAwYTQwZWRkOTZkNGRiNmI3ZGRlMmUyZTc2NjBkMjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmVjNTk2YTk1YjRiNDE5MjhhZDMyY2VhZTFlYWEyNWEuYmluZFBvcHVwKHBvcHVwX2JmOTQ4ZDEyZmE1NzQwM2RiYjliODY1OTg4MzE4NGVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MyN2ExMDBkYjljYTQzZDBhYzZiYzljMDlhZTNiMDE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA2MzM2NDIxNjg1NjI2LC03My45MDgxODU3MTc3NzQyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZjFmYTQzYzg1YjE0MDAxOTkxYWRjMWQ4MDQzYTFiZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82M2QxM2ZhNzQ4OWY0OTZlOTliZDcxNGQ0MjQyOGRlZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjNkMTNmYTc0ODlmNDk2ZTk5YmQ3MTRkNDI0MjhkZWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pbGwgSXNsYW5kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWYxZmE0M2M4NWIxNDAwMTk5MWFkYzFkODA0M2ExYmQuc2V0Q29udGVudChodG1sXzYzZDEzZmE3NDg5ZjQ5NmU5OWJkNzE0ZDQyNDI4ZGVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MyN2ExMDBkYjljYTQzZDBhYzZiYzljMDlhZTNiMDE0LmJpbmRQb3B1cChwb3B1cF9hZjFmYTQzYzg1YjE0MDAxOTkxYWRjMWQ4MDQzYTFiZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNDk5MDg3MjcyM2U0YTc1OTRlZjU2NWRkZWZjMDNmNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3NzkxMzUwMzA4NjU3LC03My45NDM1MzcyMjg5MTg4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kOTgyNDkxYWQ2YzY0YzJiYmMwZDA2NjQ0NzY4Y2ZjYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNjJhNGE0MWViMDc0MWYyYTY5OWI2MGI5YzczOTg0NyA9ICQoJzxkaXYgaWQ9Imh0bWxfMzYyYTRhNDFlYjA3NDFmMmE2OTliNjBiOWM3Mzk4NDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q5ODI0OTFhZDZjNjRjMmJiYzBkMDY2NDQ3NjhjZmNiLnNldENvbnRlbnQoaHRtbF8zNjJhNGE0MWViMDc0MWYyYTY5OWI2MGI5YzczOTg0Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNDk5MDg3MjcyM2U0YTc1OTRlZjU2NWRkZWZjMDNmNS5iaW5kUG9wdXAocG9wdXBfZDk4MjQ5MWFkNmM2NGMyYmJjMGQwNjY0NDc2OGNmY2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmE3ODZmMjU5Njk0NDhjMDhjNDU1YWRlZGY2NGUzNDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzQyOTI1NjQ3MTYwMSwtNzMuOTg4NjgyOTU4MjE2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjFiMGZkZTAzYTA4NDEyY2JlMjQ2NzFkOThmYzM2NDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWViZTIzNzQ5MjFiNGE2OTliMjA2ZTAyYmQwNTExMjAgPSAkKCc8ZGl2IGlkPSJodG1sX2FlYmUyMzc0OTIxYjRhNjk5YjIwNmUwMmJkMDUxMTIwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db25leSBJc2xhbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMWIwZmRlMDNhMDg0MTJjYmUyNDY3MWQ5OGZjMzY0Ni5zZXRDb250ZW50KGh0bWxfYWViZTIzNzQ5MjFiNGE2OTliMjA2ZTAyYmQwNTExMjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmE3ODZmMjU5Njk0NDhjMDhjNDU1YWRlZGY2NGUzNDguYmluZFBvcHVwKHBvcHVwX2IxYjBmZGUwM2EwODQxMmNiZTI0NjcxZDk4ZmMzNjQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg2Y2E1MGIxZmY1ZDQ3OWM4MmFmOWE1MzIyYTBmNTIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk5NTE4NzAyODIyMzgsLTczLjk5ODc1MjIxNDQzNTE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZmNWI5ZjM2Yjc3YzQwZTdhYmY3ZDA2ZWQzNzExOTczID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FiYzc4YTZmMGEyNDRkNjI4MmQzNmUwYTFkYTUzZmY0ID0gJCgnPGRpdiBpZD0iaHRtbF9hYmM3OGE2ZjBhMjQ0ZDYyODJkMzZlMGExZGE1M2ZmNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF0aCBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZmNWI5ZjM2Yjc3YzQwZTdhYmY3ZDA2ZWQzNzExOTczLnNldENvbnRlbnQoaHRtbF9hYmM3OGE2ZjBhMjQ0ZDYyODJkMzZlMGExZGE1M2ZmNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NmNhNTBiMWZmNWQ0NzljODJhZjlhNTMyMmEwZjUyMS5iaW5kUG9wdXAocG9wdXBfNmY1YjlmMzZiNzdjNDBlN2FiZjdkMDZlZDM3MTE5NzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWM3NzlkYTE1NzRiNGMzY2FjNmRhNDA0MzliNGEwNWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzMxMzA1MTI3NTgwMTUsLTczLjk5MDQ5ODIzMDQ0ODExXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg4Yzk0MDQwN2IyOTRlYjliNzkzNTY2OTE0ZjJhMDc3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUyZTJmMWI2N2JhYzRmMzBhMzQ4NTE5YjMwZTYyOGI2ID0gJCgnPGRpdiBpZD0iaHRtbF81MmUyZjFiNjdiYWM0ZjMwYTM0ODUxOWIzMGU2MjhiNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9yb3VnaCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODhjOTQwNDA3YjI5NGViOWI3OTM1NjY5MTRmMmEwNzcuc2V0Q29udGVudChodG1sXzUyZTJmMWI2N2JhYzRmMzBhMzQ4NTE5YjMwZTYyOGI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVjNzc5ZGExNTc0YjRjM2NhYzZkYTQwNDM5YjRhMDViLmJpbmRQb3B1cChwb3B1cF84OGM5NDA0MDdiMjk0ZWI5Yjc5MzU2NjkxNGYyYTA3Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMDBlMmE3MmUxN2I0NzU3YTE1NWM5MmQ4ZGY5ZDRiMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTIxOTQ1NzcyMjYzNiwtNzQuMDE5MzEzNzU2MzYwMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzk1MzQ2YzY1ODQyNDA5MGI3MzIyZWE2ZjQ1YzY3ZjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjM0NGZiZDRmNWYxNDY0ZThmMTQzYzY1MTQ0Mzc3NDggPSAkKCc8ZGl2IGlkPSJodG1sXzYzNDRmYmQ0ZjVmMTQ2NGU4ZjE0M2M2NTE0NDM3NzQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EeWtlciBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzk1MzQ2YzY1ODQyNDA5MGI3MzIyZWE2ZjQ1YzY3Zjkuc2V0Q29udGVudChodG1sXzYzNDRmYmQ0ZjVmMTQ2NGU4ZjE0M2M2NTE0NDM3NzQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIwMGUyYTcyZTE3YjQ3NTdhMTU1YzkyZDhkZjlkNGIwLmJpbmRQb3B1cChwb3B1cF9jOTUzNDZjNjU4NDI0MDkwYjczMjJlYTZmNDVjNjdmOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82Y2JlOGZmYjlkYmM0ZjVlOTExYTg3NGQyMTg3N2ZiNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5MDg0ODQzMzkwMjA0NiwtNzMuOTMwMTAxNzA2OTExOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTQ0MWM3MGRjZDkxNDAyMmI5MTRiMjg4MmU0N2IxMTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTM5MmQxNWNjZDJiNGZkZTg4YTkxYjBjODc1YTk2OGEgPSAkKCc8ZGl2IGlkPSJodG1sXzUzOTJkMTVjY2QyYjRmZGU4OGE5MWIwYzg3NWE5NjhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HZXJyaXRzZW4gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNDQxYzcwZGNkOTE0MDIyYjkxNGIyODgyZTQ3YjExNC5zZXRDb250ZW50KGh0bWxfNTM5MmQxNWNjZDJiNGZkZTg4YTkxYjBjODc1YTk2OGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmNiZThmZmI5ZGJjNGY1ZTkxMWE4NzRkMjE4NzdmYjUuYmluZFBvcHVwKHBvcHVwX2U0NDFjNzBkY2Q5MTQwMjJiOTE0YjI4ODJlNDdiMTE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U0NDZmYWYwNjQzNDRjOWQ4NTczZDk4NjUyZTg3MzMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzQ3Nzc5ODk0NjA0LC03My45MzEzNDQwNDEwODQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hY2E0NmIwNjQ0ODg0NTgzYjkxYmIxYjFkM2Y0M2E0NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iN2NmMzJkZDgxZWQ0YzU2ODNmM2UzMzQ0M2EwMWE5ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjdjZjMyZGQ4MWVkNGM1NjgzZjNlMzM0NDNhMDFhOWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hcmluZSBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWNhNDZiMDY0NDg4NDU4M2I5MWJiMWIxZDNmNDNhNDUuc2V0Q29udGVudChodG1sX2I3Y2YzMmRkODFlZDRjNTY4M2YzZTMzNDQzYTAxYTlmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0NDZmYWYwNjQzNDRjOWQ4NTczZDk4NjUyZTg3MzMxLmJpbmRQb3B1cChwb3B1cF9hY2E0NmIwNjQ0ODg0NTgzYjkxYmIxYjFkM2Y0M2E0NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NmI5YjY3MGU5YzE0NDMyYmE2YTQ1ZDYyOTg2Yzk5MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5MzIyOTQyMTg4MTUwNCwtNzMuOTY3ODQzMDYyMTYzNjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWI3MGViYzFlNzQxNDI1ZWJhN2FhODNmZWQ1ZGQzMTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjY3MTkyNjUxOTlmNDJjOGEyMTBlNzFkZWRkM2Q0NWYgPSAkKCc8ZGl2IGlkPSJodG1sX2Y2NzE5MjY1MTk5ZjQyYzhhMjEwZTcxZGVkZDNkNDVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYjcwZWJjMWU3NDE0MjVlYmE3YWE4M2ZlZDVkZDMxNi5zZXRDb250ZW50KGh0bWxfZjY3MTkyNjUxOTlmNDJjOGEyMTBlNzFkZWRkM2Q0NWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzZiOWI2NzBlOWMxNDQzMmJhNmE0NWQ2Mjk4NmM5OTIuYmluZFBvcHVwKHBvcHVwX2ViNzBlYmMxZTc0MTQyNWViYTdhYTgzZmVkNWRkMzE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY1MWQ0ZGU0OWI4MzRjMDg5NGVhNDk4MTQzNTEyMjFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2Mzc1Mzc4OTAyMjQsLTc0LjAwNzg3MzExMjAwMjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWUyOTRmZGE1MzcyNDE2MmI3OWYwNjc0MDk0MzgyZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTc0OWU1MWI2ZDhjNDI5MGFhYjhiMTY1MzIxYWVmZTUgPSAkKCc8ZGl2IGlkPSJodG1sXzU3NDllNTFiNmQ4YzQyOTBhYWI4YjE2NTMyMWFlZmU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TZWEgR2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzllMjk0ZmRhNTM3MjQxNjJiNzlmMDY3NDA5NDM4MmQyLnNldENvbnRlbnQoaHRtbF81NzQ5ZTUxYjZkOGM0MjkwYWFiOGIxNjUzMjFhZWZlNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NTFkNGRlNDliODM0YzA4OTRlYTQ5ODE0MzUxMjIxYi5iaW5kUG9wdXAocG9wdXBfOWUyOTRmZGE1MzcyNDE2MmI3OWYwNjc0MDk0MzgyZDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDg4ZDdjMTM2ZWMyNDk2N2JiNzY5NGRkMGFiMGRlOTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTA4NDQwMjEwOTgwMiwtNzMuOTgzNDYzMzc0MzEwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGM3ZjhiODQyMjkyNGUyNDgyOTAxMDA0ODRhNWZkMGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmNjMWI1NDQ1OGI4NGE1Y2I2ZmM3MGVlYTI5OWYyZTcgPSAkKCc8ZGl2IGlkPSJodG1sXzJjYzFiNTQ0NThiODRhNWNiNmZjNzBlZWEyOTlmMmU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRjN2Y4Yjg0MjI5MjRlMjQ4MjkwMTAwNDg0YTVmZDBjLnNldENvbnRlbnQoaHRtbF8yY2MxYjU0NDU4Yjg0YTVjYjZmYzcwZWVhMjk5ZjJlNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kODhkN2MxMzZlYzI0OTY3YmI3Njk0ZGQwYWIwZGU5NC5iaW5kUG9wdXAocG9wdXBfNGM3ZjhiODQyMjkyNGUyNDgyOTAxMDA0ODRhNWZkMGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmE5Y2EzYmIzMjZhNDcxYTliMjEyZTZjZTE2MmQxMDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODU2ODI5MTIwOTE0NDQsLTczLjk4Mzc0ODI0MTE1Nzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3N2I4NWZlNWMxMTQwNTZhMTIwYTI4MzBjNWQ3ZTc3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhiYmZlY2Q0NWE0MzQ2YTM4ZjZmNzA3MTk4M2E0MDk4ID0gJCgnPGRpdiBpZD0iaHRtbF84YmJmZWNkNDVhNDM0NmEzOGY2ZjcwNzE5ODNhNDA5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9lcnVtIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNzdiODVmZTVjMTE0MDU2YTEyMGEyODMwYzVkN2U3Ny5zZXRDb250ZW50KGh0bWxfOGJiZmVjZDQ1YTQzNDZhMzhmNmY3MDcxOTgzYTQwOTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmE5Y2EzYmIzMjZhNDcxYTliMjEyZTZjZTE2MmQxMDguYmluZFBvcHVwKHBvcHVwX2M3N2I4NWZlNWMxMTQwNTZhMTIwYTI4MzBjNWQ3ZTc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE1YzhmMTcwZDJjZTQ3ZWY5Y2IxOTZiYmJkMGQzZWJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU4NDIwMDE3NDY5ODE1LC03My45NTQ4OTg2NzA3NzcxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85OGZiNGIzODY2ZGE0ZDVjYmU4YTU1MGVjNWU2NGMzNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZDYxYzEzYWVhNTE0YmFkYTg3NzA0ODgzZmZmZTU2ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWQ2MWMxM2FlYTUxNGJhZGE4NzcwNDg4M2ZmZmU1NmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlByb3NwZWN0IExlZmZlcnRzIEdhcmRlbnMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85OGZiNGIzODY2ZGE0ZDVjYmU4YTU1MGVjNWU2NGMzNi5zZXRDb250ZW50KGh0bWxfYWQ2MWMxM2FlYTUxNGJhZGE4NzcwNDg4M2ZmZmU1NmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTVjOGYxNzBkMmNlNDdlZjljYjE5NmJiYmQwZDNlYmEuYmluZFBvcHVwKHBvcHVwXzk4ZmI0YjM4NjZkYTRkNWNiZThhNTUwZWM1ZTY0YzM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRkNGNkZmM2YmM1OTQ1OWM4NGY1ODEyZGY5NzQ1ZTkxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NDAyNTU0Nzk1MzU1LC03My45MTMwNjgzMTc4NzM5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZDY5YWJmZDg3NTM0OGJiYjlkYzM4M2U2ZjNiODQzYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMzgxMWE5MWM2Yjc0MDc5YjYzNzUyMzA4ODNhNWI4MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjM4MTFhOTFjNmI3NDA3OWI2Mzc1MjMwODgzYTViODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9jZWFuIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZDY5YWJmZDg3NTM0OGJiYjlkYzM4M2U2ZjNiODQzYS5zZXRDb250ZW50KGh0bWxfZjM4MTFhOTFjNmI3NDA3OWI2Mzc1MjMwODgzYTViODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGQ0Y2RmYzZiYzU5NDU5Yzg0ZjU4MTJkZjk3NDVlOTEuYmluZFBvcHVwKHBvcHVwX2JkNjlhYmZkODc1MzQ4YmJiOWRjMzgzZTZmM2I4NDNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMwY2Q0MDUwYTljMzQ0ZGQ4ZjdlN2Q1ODgyNGQ3N2Q5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NTY5OTU3Mjc0NzksLTczLjg2Nzk3NTk4MDgxMzM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBhNjgzMTg5YTUzYjQ5ZjBhMDYzMGY5NTZjZmZjMjc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzliNmM4NTM1NTE5YjQ4NjNhY2JjNGQ2MTE1OTU3NGFlID0gJCgnPGRpdiBpZD0iaHRtbF85YjZjODUzNTUxOWI0ODYzYWNiYzRkNjExNTk1NzRhZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l0eSBMaW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGE2ODMxODlhNTNiNDlmMGEwNjMwZjk1NmNmZmMyNzkuc2V0Q29udGVudChodG1sXzliNmM4NTM1NTE5YjQ4NjNhY2JjNGQ2MTE1OTU3NGFlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMwY2Q0MDUwYTljMzQ0ZGQ4ZjdlN2Q1ODgyNGQ3N2Q5LmJpbmRQb3B1cChwb3B1cF8wYTY4MzE4OWE1M2I0OWYwYTA2MzBmOTU2Y2ZmYzI3OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MmQwMmU4MDEzY2I0NjRkYjRjNDI1NzJiZjI0MjdmZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTE0OTU1MDQ1MzA4LC03My44OTg1NTYzMzYzMDMxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iOTBkZjc4NTFjMjg0Yzc0YTFhZTMzZWFiMDZjMjJlMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZjAwNmE1NmYwZTk0NDU2YTI4YmRhYjI5YjY0ZmI0OSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2YwMDZhNTZmMGU5NDQ1NmEyOGJkYWIyOWI2NGZiNDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlcmdlbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I5MGRmNzg1MWMyODRjNzRhMWFlMzNlYWIwNmMyMmUwLnNldENvbnRlbnQoaHRtbF9jZjAwNmE1NmYwZTk0NDU2YTI4YmRhYjI5YjY0ZmI0OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MmQwMmU4MDEzY2I0NjRkYjRjNDI1NzJiZjI0MjdmZi5iaW5kUG9wdXAocG9wdXBfYjkwZGY3ODUxYzI4NGM3NGExYWUzM2VhYjA2YzIyZTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGYzZTU0MmI0ZjUzNGU3N2JhNjY1ZDE4M2IxNzZkYmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU1OTU4OTg2OTg0MywtNzMuOTU3NTk1MjM0ODk4MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzVhN2E5OWUxMmYzNDQ4NWJkMGI4MjAzOTBlN2JhOWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDIwMjMyNTQwZTYyNGUxYzg2MjFiMWUxYzRmOTYwMzUgPSAkKCc8ZGl2IGlkPSJodG1sX2QyMDIzMjU0MGU2MjRlMWM4NjIxYjFlMWM0Zjk2MDM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR3b29kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzVhN2E5OWUxMmYzNDQ4NWJkMGI4MjAzOTBlN2JhOWIuc2V0Q29udGVudChodG1sX2QyMDIzMjU0MGU2MjRlMWM4NjIxYjFlMWM0Zjk2MDM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRmM2U1NDJiNGY1MzRlNzdiYTY2NWQxODNiMTc2ZGJiLmJpbmRQb3B1cChwb3B1cF8zNWE3YTk5ZTEyZjM0NDg1YmQwYjgyMDM5MGU3YmE5Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lODNlZmI4MjIwM2I0NzljODlmOWRhNDc3ZjJlNjBkZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NzAwODYwMzE4NTE4NSwtNzMuOTYyNjEzMTY3MTYwNDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzNkYzBhOGZhMzVkNDNhYzljNDAxYzgxYWU5M2U2MGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTlhZGE0ODE3N2QxNGIyNjg5MGM2NDVkNmFlNGI5YWYgPSAkKCc8ZGl2IGlkPSJodG1sX2U5YWRhNDgxNzdkMTRiMjY4OTBjNjQ1ZDZhZTRiOWFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBQYXJrIFNvdXRoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzNkYzBhOGZhMzVkNDNhYzljNDAxYzgxYWU5M2U2MGEuc2V0Q29udGVudChodG1sX2U5YWRhNDgxNzdkMTRiMjY4OTBjNjQ1ZDZhZTRiOWFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U4M2VmYjgyMjAzYjQ3OWM4OWY5ZGE0NzdmMmU2MGRkLmJpbmRQb3B1cChwb3B1cF8zM2RjMGE4ZmEzNWQ0M2FjOWM0MDFjODFhZTkzZTYwYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NTljZjZmZDQ4Y2E0MGE0YTFhOGY2YjVkZDY2MDgwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyMzg0NTI0NDc4NDE5LC03My45MTYwNzQ4Mzk1MTMyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYWZkNjYzMzMwNGY0ZTQ4OTUxZTFlMzhmOWI3MTdkOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYzVkZTY1MTQxMTU0MGUxODFiMDY2NmE2NDg2MTNmYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZWM1ZGU2NTE0MTE1NDBlMTgxYjA2NjZhNjQ4NjEzZmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdlb3JnZXRvd24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYWZkNjYzMzMwNGY0ZTQ4OTUxZTFlMzhmOWI3MTdkOC5zZXRDb250ZW50KGh0bWxfZWM1ZGU2NTE0MTE1NDBlMTgxYjA2NjZhNjQ4NjEzZmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzU5Y2Y2ZmQ0OGNhNDBhNGExYThmNmI1ZGQ2NjA4MDEuYmluZFBvcHVwKHBvcHVwX2NhZmQ2NjMzMzA0ZjRlNDg5NTFlMWUzOGY5YjcxN2Q4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QwZmM0OGQ0NmEwNDQ3ZWU5OWM5ZmE5NGRiMGYyNzc2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4NDkyNDEwNDE1NDgsLTczLjkzODg1ODE1MjY5MTk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2YWUxZmM2YWIzNTQwZmNiMzhhZmZhNzdiN2RjODE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBiN2E5MjRmZmEwYjQzMTQ4YWYxYTUxYzY0MzJhMzdkID0gJCgnPGRpdiBpZD0iaHRtbF8wYjdhOTI0ZmZhMGI0MzE0OGFmMWE1MWM2NDMyYTM3ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBXaWxsaWFtc2J1cmcsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNmFlMWZjNmFiMzU0MGZjYjM4YWZmYTc3YjdkYzgxNi5zZXRDb250ZW50KGh0bWxfMGI3YTkyNGZmYTBiNDMxNDhhZjFhNTFjNjQzMmEzN2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDBmYzQ4ZDQ2YTA0NDdlZTk5YzlmYTk0ZGIwZjI3NzYuYmluZFBvcHVwKHBvcHVwXzE2YWUxZmM2YWIzNTQwZmNiMzhhZmZhNzdiN2RjODE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcyMDQxMTM4ZTQ3MTQ0OTFhOWIyZTYyMGM3OTg2NzdkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE0ODIyOTA2NTMyMDE0LC03My45NTg4MDg1NzU4NzU4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MDI5ZjZiMTZhYmM0MjAwYmVmYWJhMjRkNTMxNjRmZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZjU2NjMxMzI1NjM0NmZhYWE5YWE2OTI4ZDMwZTMzZSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWY1NjYzMTMyNTYzNDZmYWFhOWFhNjkyOGQzMGUzM2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFNpZGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MDI5ZjZiMTZhYmM0MjAwYmVmYWJhMjRkNTMxNjRmZi5zZXRDb250ZW50KGh0bWxfOWY1NjYzMTMyNTYzNDZmYWFhOWFhNjkyOGQzMGUzM2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzIwNDExMzhlNDcxNDQ5MWE5YjJlNjIwYzc5ODY3N2QuYmluZFBvcHVwKHBvcHVwXzcwMjlmNmIxNmFiYzQyMDBiZWZhYmEyNGQ1MzE2NGZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEwMGE5YjI0NGQ3YTRkZDk5MWFjNmIwYjVkZTc2YTFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwODYxNDcyNjUwNjQsLTczLjk1ODAwMDk1MTUzMzMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgxOTg4ODQ1OWU0YjRhZWJhNWU0MmVkMmM3YzliZjRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M4YjA2ODI0MGM0ODQzYzZhOGVjN2YyODRlZTVmYmNmID0gJCgnPGRpdiBpZD0iaHRtbF9jOGIwNjgyNDBjNDg0M2M2YThlYzdmMjg0ZWU1ZmJjZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggU2lkZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgxOTg4ODQ1OWU0YjRhZWJhNWU0MmVkMmM3YzliZjRiLnNldENvbnRlbnQoaHRtbF9jOGIwNjgyNDBjNDg0M2M2YThlYzdmMjg0ZWU1ZmJjZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMDBhOWIyNDRkN2E0ZGQ5OTFhYzZiMGI1ZGU3NmExZi5iaW5kUG9wdXAocG9wdXBfODE5ODg4NDU5ZTRiNGFlYmE1ZTQyZWQyYzdjOWJmNGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGQyODcyM2I4YjUwNDM0NDgwOWJhYTg0NmNhMDI2YjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMwNTk3NjY2Nzk0MiwtNzMuOTY4MzY2NzgwMzU1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTllMjA1MDcwMjcxNGRhOThjMGI5N2RiYWYzYjU2ODggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjM4YTc5ZTE3ZjdjNDMyNGIxNmQxNGQzODNjN2IwZjMgPSAkKCc8ZGl2IGlkPSJodG1sX2IzOGE3OWUxN2Y3YzQzMjRiMTZkMTRkMzgzYzdiMGYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PY2VhbiBQYXJrd2F5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTllMjA1MDcwMjcxNGRhOThjMGI5N2RiYWYzYjU2ODguc2V0Q29udGVudChodG1sX2IzOGE3OWUxN2Y3YzQzMjRiMTZkMTRkMzgzYzdiMGYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RkMjg3MjNiOGI1MDQzNDQ4MDliYWE4NDZjYTAyNmI5LmJpbmRQb3B1cChwb3B1cF85OWUyMDUwNzAyNzE0ZGE5OGMwYjk3ZGJhZjNiNTY4OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NTA4YTA1OGQ5NjU0NDdiYjAxM2Q1MGM0YjcxNjdlYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNDc2ODEyNjk0MjI2LC03NC4wMzE5NzkxNDUzNzk4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMDE2OTU2ZmFmZmU0MGQyYWQ5ODA2NjZjMzZkYmNlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYjY4MTA4MTI1OWM0MjJlYTJkNTRjYTJlMjYwZGYzNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMmI2ODEwODEyNTljNDIyZWEyZDU0Y2EyZTI2MGRmMzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgSGFtaWx0b24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMDE2OTU2ZmFmZmU0MGQyYWQ5ODA2NjZjMzZkYmNlZC5zZXRDb250ZW50KGh0bWxfMmI2ODEwODEyNTljNDIyZWEyZDU0Y2EyZTI2MGRmMzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTUwOGEwNThkOTY1NDQ3YmIwMTNkNTBjNGI3MTY3ZWEuYmluZFBvcHVwKHBvcHVwX2EwMTY5NTZmYWZmZTQwZDJhZDk4MDY2NmMzNmRiY2VkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RlMWIwYmVmODUyNDQxMGFhZGNhOWE3ZDIxYzg5NTc5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1NjE4NDIyMzE0MzIsLTczLjk5NDI3OTM2MjU1OTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg4OTMyYzA4ODQzMTRhODY4OTRjYWNkZWY5ODYxYjM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I5NmU3M2I0Njg5NjQ4N2M5MTBhOWNlOTg4ZmRlNzgxID0gJCgnPGRpdiBpZD0iaHRtbF9iOTZlNzNiNDY4OTY0ODdjOTEwYTljZTk4OGZkZTc4MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hpbmF0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg4OTMyYzA4ODQzMTRhODY4OTRjYWNkZWY5ODYxYjM0LnNldENvbnRlbnQoaHRtbF9iOTZlNzNiNDY4OTY0ODdjOTEwYTljZTk4OGZkZTc4MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZTFiMGJlZjg1MjQ0MTBhYWRjYTlhN2QyMWM4OTU3OS5iaW5kUG9wdXAocG9wdXBfODg5MzJjMDg4NDMxNGE4Njg5NGNhY2RlZjk4NjFiMzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTY2ZGNjNWY2ZDc1NDc3YTgxZDVlYTM0ZTQzYzFkNzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmRhYzcwZWVlZWNjNGU2Mjk2OWM2YjNkZGUxZDc5NTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGE3MDU3YzgyZDU0NGExYTkyMzc1MjA3OGRlNzA3N2MgPSAkKCc8ZGl2IGlkPSJodG1sX2RhNzA1N2M4MmQ1NDRhMWE5MjM3NTIwNzhkZTcwNzdjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmRhYzcwZWVlZWNjNGU2Mjk2OWM2YjNkZGUxZDc5NTAuc2V0Q29udGVudChodG1sX2RhNzA1N2M4MmQ1NDRhMWE5MjM3NTIwNzhkZTcwNzdjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE2NmRjYzVmNmQ3NTQ3N2E4MWQ1ZWEzNGU0M2MxZDc4LmJpbmRQb3B1cChwb3B1cF9iZGFjNzBlZWVlY2M0ZTYyOTY5YzZiM2RkZTFkNzk1MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNGZjZDhlNDU4NDA0MGY2YmRhNjg2Mjg0MmYxM2E3OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg2NzY4Mzk2NDQ5OTE1LC03My45MjEyMTA0MjIwMzg5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMzM5N2E2NTkzODk0ODY0OTE4N2Q5Y2RlODljNjdlYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYzEyMTVhMGUwMmM0ZTMyYTJhMTg1MDk0N2E3NTQ2NyA9ICQoJzxkaXYgaWQ9Imh0bWxfYmMxMjE1YTBlMDJjNGUzMmEyYTE4NTA5NDdhNzU0NjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklud29vZCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMzM5N2E2NTkzODk0ODY0OTE4N2Q5Y2RlODljNjdlYS5zZXRDb250ZW50KGh0bWxfYmMxMjE1YTBlMDJjNGUzMmEyYTE4NTA5NDdhNzU0NjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTRmY2Q4ZTQ1ODQwNDBmNmJkYTY4NjI4NDJmMTNhNzguYmluZFBvcHVwKHBvcHVwX2YzMzk3YTY1OTM4OTQ4NjQ5MTg3ZDljZGU4OWM2N2VhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQwNWYxZmQzZTQ2ZTQwZjI4MWE4ZjY0ZjdkYTA3ZDk5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIzNjA0Mjg0ODExOTM1LC03My45NDk2ODc5MTg4MzM2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NGMyMTUwNzMxZjc0Y2FkYWUzZWJhMmI3M2EwZjU2YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNjIxNzZiMmZjNTQ0YzcxYjY2YWNiODlhOGIzN2ExNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDYyMTc2YjJmYzU0NGM3MWI2NmFjYjg5YThiMzdhMTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhbWlsdG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjRjMjE1MDczMWY3NGNhZGFlM2ViYTJiNzNhMGY1NmIuc2V0Q29udGVudChodG1sX2Q2MjE3NmIyZmM1NDRjNzFiNjZhY2I4OWE4YjM3YTE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQwNWYxZmQzZTQ2ZTQwZjI4MWE4ZjY0ZjdkYTA3ZDk5LmJpbmRQb3B1cChwb3B1cF82NGMyMTUwNzMxZjc0Y2FkYWUzZWJhMmI3M2EwZjU2Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYzI3ODk5YmFkNzI0YjQxYWI4ZDY3NmJlNDc5MTliZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmRlNjkwOTdmNTM4NDYxM2E1Yzg0ODkzNDIzMTc1YjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGE5ZjNkNjk2Y2YzNDI2ZGJkMjJlNzhkNDVmZjRhODMgPSAkKCc8ZGl2IGlkPSJodG1sXzBhOWYzZDY5NmNmMzQyNmRiZDIyZTc4ZDQ1ZmY0YTgzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZGU2OTA5N2Y1Mzg0NjEzYTVjODQ4OTM0MjMxNzViNy5zZXRDb250ZW50KGh0bWxfMGE5ZjNkNjk2Y2YzNDI2ZGJkMjJlNzhkNDVmZjRhODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGMyNzg5OWJhZDcyNGI0MWFiOGQ2NzZiZTQ3OTE5YmUuYmluZFBvcHVwKHBvcHVwXzJkZTY5MDk3ZjUzODQ2MTNhNWM4NDg5MzQyMzE3NWI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJlMjBiZTlhYzk5YzQxMmRiMGE1ODE5NGZlZTJjNDdiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1OTc2MDY3NDI0MTQsLTczLjk0MzIxMTEyNjAzOTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRlZjI4YWI4MTY1MzQzY2I5NWU1Y2M2NjI1NDljMzliID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQxYTE2ZGExMWMwNDRjNDZhMGM2YTVkMGI0YzZjNzliID0gJCgnPGRpdiBpZD0iaHRtbF80MWExNmRhMTFjMDQ0YzQ2YTBjNmE1ZDBiNGM2Yzc5YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBIYXJsZW0sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGVmMjhhYjgxNjUzNDNjYjk1ZTVjYzY2MjU0OWMzOWIuc2V0Q29udGVudChodG1sXzQxYTE2ZGExMWMwNDRjNDZhMGM2YTVkMGI0YzZjNzliKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJlMjBiZTlhYzk5YzQxMmRiMGE1ODE5NGZlZTJjNDdiLmJpbmRQb3B1cChwb3B1cF80ZWYyOGFiODE2NTM0M2NiOTVlNWNjNjYyNTQ5YzM5Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MDgxOWZmNDY4MmI0Njg5YmY2NTU0YzJkMmQxN2QwNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5MjI0OTQ2NjYzMDMzLC03My45NDQxODIyMzE0ODUyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZTU4MGNkMTljMzc0NDAyYTBhZGRkN2Q4MmQxMTU4NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYTUyZjY3MTMyMGQ0YjZhYTdhOTc2MjU3MmViY2IzOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYWE1MmY2NzEzMjBkNGI2YWE3YTk3NjI1NzJlYmNiMzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgSGFybGVtLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBlNTgwY2QxOWMzNzQ0MDJhMGFkZGQ3ZDgyZDExNTg1LnNldENvbnRlbnQoaHRtbF9hYTUyZjY3MTMyMGQ0YjZhYTdhOTc2MjU3MmViY2IzOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MDgxOWZmNDY4MmI0Njg5YmY2NTU0YzJkMmQxN2QwNS5iaW5kUG9wdXAocG9wdXBfMGU1ODBjZDE5YzM3NDQwMmEwYWRkZDdkODJkMTE1ODUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmY1ZmRhZDdmYzFhNGRkNGFkZjcyYmVkMGM4YmRjZWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FhZThjOGE0YTczZjRlNmE5NTI5ZjNhN2RlMzllZGZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc1ODE1NTBiY2M5ZDQzZTRiNGY4ZmRiYjAzZWFjNDU1ID0gJCgnPGRpdiBpZD0iaHRtbF83NTgxNTUwYmNjOWQ0M2U0YjRmOGZkYmIwM2VhYzQ1NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FhZThjOGE0YTczZjRlNmE5NTI5ZjNhN2RlMzllZGZhLnNldENvbnRlbnQoaHRtbF83NTgxNTUwYmNjOWQ0M2U0YjRmOGZkYmIwM2VhYzQ1NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZjVmZGFkN2ZjMWE0ZGQ0YWRmNzJiZWQwYzhiZGNlZi5iaW5kUG9wdXAocG9wdXBfYWFlOGM4YTRhNzNmNGU2YTk1MjlmM2E3ZGUzOWVkZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTQzYzg5MmJhYmViNDEyN2FmNDE3MWUwZDVhZTljODQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5Mjk4NDk4ODQ4NzUsLTczLjk0NzExNzg0NDcxODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg1ZDRkMDY2ZGRjNTRkOTRhYzViZmFlYThmYzNhZmJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y3NThlMWZhNzA5YjQzODY4ZmQxOGYwMDA3ZjBhOWUzID0gJCgnPGRpdiBpZD0iaHRtbF9mNzU4ZTFmYTcwOWI0Mzg2OGZkMThmMDAwN2YwYTllMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9ya3ZpbGxlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg1ZDRkMDY2ZGRjNTRkOTRhYzViZmFlYThmYzNhZmJjLnNldENvbnRlbnQoaHRtbF9mNzU4ZTFmYTcwOWI0Mzg2OGZkMThmMDAwN2YwYTllMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNDNjODkyYmFiZWI0MTI3YWY0MTcxZTBkNWFlOWM4NC5iaW5kUG9wdXAocG9wdXBfODVkNGQwNjZkZGM1NGQ5NGFjNWJmYWVhOGZjM2FmYmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTM3NzcyOTRjMDY2NDI0MTlhMWYwOTEwZGJhMTNmYjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjgxMTI2NTgyODczMywtNzMuOTU4ODU5Njg4MTM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZTJhM2Y4OGU3N2I0YmQ1YWFmZjMyNTZlYjM1NGJiNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82Y2E2N2JhMDM4NWY0YzhmOWQyMzg4NDI4YjJhM2U4NiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmNhNjdiYTAzODVmNGM4ZjlkMjM4ODQyOGIyYTNlODYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlbm94IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWUyYTNmODhlNzdiNGJkNWFhZmYzMjU2ZWIzNTRiYjYuc2V0Q29udGVudChodG1sXzZjYTY3YmEwMzg1ZjRjOGY5ZDIzODg0MjhiMmEzZTg2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EzNzc3Mjk0YzA2NjQyNDE5YTFmMDkxMGRiYTEzZmI4LmJpbmRQb3B1cChwb3B1cF85ZTJhM2Y4OGU3N2I0YmQ1YWFmZjMyNTZlYjM1NGJiNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NTMwMGZmZWFmZGY0ZDljYTZhYzBjMDkzZTAxNjYxYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMjRiODQ2ZjA0YTg0YmYzYjgyNDQwMTljNTEwZDYzNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZTI0MWM0ZGE2Mjg0MGIyYjUwNGJiZDUwMmViMTdjOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMWUyNDFjNGRhNjI4NDBiMmI1MDRiYmQ1MDJlYjE3YzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjI0Yjg0NmYwNGE4NGJmM2I4MjQ0MDE5YzUxMGQ2MzUuc2V0Q29udGVudChodG1sXzFlMjQxYzRkYTYyODQwYjJiNTA0YmJkNTAyZWIxN2M5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk1MzAwZmZlYWZkZjRkOWNhNmFjMGMwOTNlMDE2NjFhLmJpbmRQb3B1cChwb3B1cF8yMjRiODQ2ZjA0YTg0YmYzYjgyNDQwMTljNTEwZDYzNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNzhhZTk3NThjZmU0ZGUzOTgxMWZkMTk4ZmFkNzBhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4NzY1Nzk5ODUzNDg1NCwtNzMuOTc3MDU5MjM2MzA2MDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODMwZWEzM2ExZTliNDE2OWFlODc4NDY4NjA1YTM1MmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjM2NzEzYWM3Nzg2NDZlZGFjMzljNzM0NTBiMGM2OTcgPSAkKCc8ZGl2IGlkPSJodG1sX2YzNjcxM2FjNzc4NjQ2ZWRhYzM5YzczNDUwYjBjNjk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VcHBlciBXZXN0IFNpZGUsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODMwZWEzM2ExZTliNDE2OWFlODc4NDY4NjA1YTM1MmUuc2V0Q29udGVudChodG1sX2YzNjcxM2FjNzc4NjQ2ZWRhYzM5YzczNDUwYjBjNjk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U3OGFlOTc1OGNmZTRkZTM5ODExZmQxOThmYWQ3MGE4LmJpbmRQb3B1cChwb3B1cF84MzBlYTMzYTFlOWI0MTY5YWU4Nzg0Njg2MDVhMzUyZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMjg0YjU5YWZhYmM0ZDJiOGM5Mjg5MjQ4N2ZmZjliMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MzUyODg4OTQyMTY2LC03My45ODUzMzc3NzAwMTI2Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMzI4ZmM1ODEzNDM0NDdjYTJkY2IzYjBhMWVkOWRjNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NDc1ZWYxNGU2YzQ0NWUyODYxNGYwZTc2N2M3YTFlMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDQ3NWVmMTRlNmM0NDVlMjg2MTRmMGU3NjdjN2ExZTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpbmNvbG4gU3F1YXJlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAzMjhmYzU4MTM0MzQ0N2NhMmRjYjNiMGExZWQ5ZGM0LnNldENvbnRlbnQoaHRtbF80NDc1ZWYxNGU2YzQ0NWUyODYxNGYwZTc2N2M3YTFlMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMjg0YjU5YWZhYmM0ZDJiOGM5Mjg5MjQ4N2ZmZjliMy5iaW5kUG9wdXAocG9wdXBfMDMyOGZjNTgxMzQzNDQ3Y2EyZGNiM2IwYTFlZDlkYzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjU3M2FkODdmMDQ1NDQwMmEyOWFkODFhYzcyZWQzMGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmRjZGUxZDE0MGY4NDMyOGIxZGZiOGYzZWM3OTU3ZGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTE2MWVmMmJjMTFlNGQwNmJiOGY3MzNlMDQxOGUxNDAgPSAkKCc8ZGl2IGlkPSJodG1sX2ExNjFlZjJiYzExZTRkMDZiYjhmNzMzZTA0MThlMTQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZkY2RlMWQxNDBmODQzMjhiMWRmYjhmM2VjNzk1N2RkLnNldENvbnRlbnQoaHRtbF9hMTYxZWYyYmMxMWU0ZDA2YmI4ZjczM2UwNDE4ZTE0MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NTczYWQ4N2YwNDU0NDAyYTI5YWQ4MWFjNzJlZDMwYi5iaW5kUG9wdXAocG9wdXBfNmRjZGUxZDE0MGY4NDMyOGIxZGZiOGYzZWM3OTU3ZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWZhNjFmNDRiNzE5NGU5YTk0ZDI1Y2RlODQyYWJjOWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ2OTExMDI3MDYyMywtNzMuOTgxNjY4ODI3MzAzMDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2ZjZTY5MGYwNzAwNDJhY2JiZGMyNWQzNmZlZjFmMTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWRmOGVkMmE5Njc3NGE2NjhiYTk1M2RiMmY3MDQwZTggPSAkKCc8ZGl2IGlkPSJodG1sXzlkZjhlZDJhOTY3NzRhNjY4YmE5NTNkYjJmNzA0MGU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmY2U2OTBmMDcwMDQyYWNiYmRjMjVkMzZmZWYxZjE4LnNldENvbnRlbnQoaHRtbF85ZGY4ZWQyYTk2Nzc0YTY2OGJhOTUzZGIyZjcwNDBlOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZmE2MWY0NGI3MTk0ZTlhOTRkMjVjZGU4NDJhYmM5ZS5iaW5kUG9wdXAocG9wdXBfM2ZjZTY5MGYwNzAwNDJhY2JiZGMyNWQzNmZlZjFmMTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWYxZWY0YTVjY2I5NGQwMWE0YTQ0YzY5ZmVhODc2N2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDgzMDMwNzcyNTIxNzQsLTczLjk3ODMzMjA3OTI0MTI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M0ZTJiMzc1MjcyYjQ0ZTNiMTk5YzU0MDE5MTJiYjY4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRlYzE2Mzg3NzFlYzRjMmY4MDEyNDY3ZTlhOTdjMjRlID0gJCgnPGRpdiBpZD0iaHRtbF80ZWMxNjM4NzcxZWM0YzJmODAxMjQ2N2U5YTk3YzI0ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzRlMmIzNzUyNzJiNDRlM2IxOTljNTQwMTkxMmJiNjguc2V0Q29udGVudChodG1sXzRlYzE2Mzg3NzFlYzRjMmY4MDEyNDY3ZTlhOTdjMjRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVmMWVmNGE1Y2NiOTRkMDFhNGE0NGM2OWZlYTg3NjdjLmJpbmRQb3B1cChwb3B1cF9jNGUyYjM3NTI3MmI0NGUzYjE5OWM1NDAxOTEyYmI2OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wY2U0NjEyYzc3YzA0NDRkYTQwNTA2ODIwYzg5YzdjZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDJlM2UwNWIwZDc2NDdhOTlmYWRkZDA4OGI5YWVhNDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjY0ZmNlMjlhMDQ1NDNjNTkyMDY2ODMwZDZiMmRlOTggPSAkKCc8ZGl2IGlkPSJodG1sXzI2NGZjZTI5YTA0NTQzYzU5MjA2NjgzMGQ2YjJkZTk4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyZTNlMDViMGQ3NjQ3YTk5ZmFkZGQwODhiOWFlYTQ5LnNldENvbnRlbnQoaHRtbF8yNjRmY2UyOWEwNDU0M2M1OTIwNjY4MzBkNmIyZGU5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wY2U0NjEyYzc3YzA0NDRkYTQwNTA2ODIwYzg5YzdjZC5iaW5kUG9wdXAocG9wdXBfNDJlM2UwNWIwZDc2NDdhOTlmYWRkZDA4OGI5YWVhNDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWQyOWMwMDBmYWQxNGI5ZmJlYjk3MDEwNTk5ZWY2MjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjY5MzI4ODUzNjEyOCwtNzMuOTk5OTE0MDI5NDU5MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWIwZDBhMzM0YzZlNDgxMmEzN2ZhZmQ5YTA3NWViZWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWU2NzBjOWU1OWMzNGU0NDg3MTBkMzgxM2ZjYjViYWQgPSAkKCc8ZGl2IGlkPSJodG1sX2VlNjcwYzllNTljMzRlNDQ4NzEwZDM4MTNmY2I1YmFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbndpY2ggVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YjBkMGEzMzRjNmU0ODEyYTM3ZmFmZDlhMDc1ZWJlZi5zZXRDb250ZW50KGh0bWxfZWU2NzBjOWU1OWMzNGU0NDg3MTBkMzgxM2ZjYjViYWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWQyOWMwMDBmYWQxNGI5ZmJlYjk3MDEwNTk5ZWY2MjMuYmluZFBvcHVwKHBvcHVwXzliMGQwYTMzNGM2ZTQ4MTJhMzdmYWZkOWEwNzVlYmVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M2NmUwMzcyZGNhZjRhYzg5OThmZjAzYzI1ZmUyZTIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI3ODQ2Nzc3MjcwMjQ0LC03My45ODIyMjYxNjUwNjQxNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMjA5Yzc1ZDUyNWY0ODJlYjIwZDAzYWY5YTgzM2E5MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZTg5ZDRhZWE4NDI0MjcwOGNjMDE2OGNjNzliYTNmNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmU4OWQ0YWVhODQyNDI3MDhjYzAxNjhjYzc5YmEzZjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMjA5Yzc1ZDUyNWY0ODJlYjIwZDAzYWY5YTgzM2E5MC5zZXRDb250ZW50KGh0bWxfYmU4OWQ0YWVhODQyNDI3MDhjYzAxNjhjYzc5YmEzZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzY2ZTAzNzJkY2FmNGFjODk5OGZmMDNjMjVmZTJlMjMuYmluZFBvcHVwKHBvcHVwX2YyMDljNzVkNTI1ZjQ4MmViMjBkMDNhZjlhODMzYTkwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YzM2RlODk3ZWY0ZTRkMjNhNmMxNWU5MjdiMGIyY2IwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFlMDk1YjViMTM1ZjRlOTQ5NGQ2N2MyYjFmMmE4ZWNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzZGYzNTE5MmI0MTQ1NWY5OTY1ZDVmMDAxNjQxNzU0ID0gJCgnPGRpdiBpZD0iaHRtbF9hM2RmMzUxOTJiNDE0NTVmOTk2NWQ1ZjAwMTY0MTc1NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFlMDk1YjViMTM1ZjRlOTQ5NGQ2N2MyYjFmMmE4ZWNhLnNldENvbnRlbnQoaHRtbF9hM2RmMzUxOTJiNDE0NTVmOTk2NWQ1ZjAwMTY0MTc1NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMzNkZTg5N2VmNGU0ZDIzYTZjMTVlOTI3YjBiMmNiMC5iaW5kUG9wdXAocG9wdXBfMWUwOTViNWIxMzVmNGU5NDk0ZDY3YzJiMWYyYThlY2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDdjNDhmMmIzN2VkNDEwN2E4MjRmZTM1ZWU1ZmI0MGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjE1MjE5Njc0NDMyMTYsLTc0LjAxMDY4MzI4NTU5MDg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA3NTllMmMwNWY4MTQyOWFiMjBiMTExZWY3NGZiY2ZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk1MmVjOTAzNGVmYjQwNTc5MTc1ZGFmMzRhMTdkNzdjID0gJCgnPGRpdiBpZD0iaHRtbF85NTJlYzkwMzRlZmI0MDU3OTE3NWRhZjM0YTE3ZDc3YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHJpYmVjYSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNzU5ZTJjMDVmODE0MjlhYjIwYjExMWVmNzRmYmNmZC5zZXRDb250ZW50KGh0bWxfOTUyZWM5MDM0ZWZiNDA1NzkxNzVkYWYzNGExN2Q3N2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDdjNDhmMmIzN2VkNDEwN2E4MjRmZTM1ZWU1ZmI0MGEuYmluZFBvcHVwKHBvcHVwXzA3NTllMmMwNWY4MTQyOWFiMjBiMTExZWY3NGZiY2ZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FkN2QxN2MyM2Q4ZTQzODNiMjg0MGI2MzhiZDI3ZDI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE5MzIzNzkzOTU5MDcsLTczLjk5NzMwNDY3MjA4MDczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3ZDA5ODhlZDhiZjRhOTk4ZGQ4OTU4MmE0NzdiZDA0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJiN2MyY2Q4NTU0NzQ1OTI5ODkwNjY5NWRhNDQ3YWI2ID0gJCgnPGRpdiBpZD0iaHRtbF8yYjdjMmNkODU1NDc0NTkyOTg5MDY2OTVkYTQ0N2FiNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGl0dGxlIEl0YWx5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M3ZDA5ODhlZDhiZjRhOTk4ZGQ4OTU4MmE0NzdiZDA0LnNldENvbnRlbnQoaHRtbF8yYjdjMmNkODU1NDc0NTkyOTg5MDY2OTVkYTQ0N2FiNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZDdkMTdjMjNkOGU0MzgzYjI4NDBiNjM4YmQyN2QyNi5iaW5kUG9wdXAocG9wdXBfYzdkMDk4OGVkOGJmNGE5OThkZDg5NTgyYTQ3N2JkMDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGQ5NTVhNmM3ZGEzNDFjZWFjNjY1MzRhYjAxNGM1YjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzQ0YjliNTVhN2VkNGRlMmE2NDE5NDMxMmI4M2Q2NjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDkwYWRmZTEzZDljNDFlM2EzY2Q2M2JiMDE5NWIwM2MgPSAkKCc8ZGl2IGlkPSJodG1sXzA5MGFkZmUxM2Q5YzQxZTNhM2NkNjNiYjAxOTViMDNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc0NGI5YjU1YTdlZDRkZTJhNjQxOTQzMTJiODNkNjYzLnNldENvbnRlbnQoaHRtbF8wOTBhZGZlMTNkOWM0MWUzYTNjZDYzYmIwMTk1YjAzYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZDk1NWE2YzdkYTM0MWNlYWM2NjUzNGFiMDE0YzViNi5iaW5kUG9wdXAocG9wdXBfNzQ0YjliNTVhN2VkNGRlMmE2NDE5NDMxMmI4M2Q2NjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmMxYzI2NGM4ZDExNDQ1MTlmY2Y0ZjQ1ODE3MzhlZmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzQ0MzM5MzU3MjQzNCwtNzQuMDA2MTc5OTgxMjY4MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODcxMmNiY2RiNjIwNDE2YmFmZDg2NGU0ZDQ3MjU2M2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzhhYmM4YmZmOWVkNDBhNjhhNzE4YjFiNjM5ZDYyZWIgPSAkKCc8ZGl2IGlkPSJodG1sXzM4YWJjOGJmZjllZDQwYTY4YTcxOGIxYjYzOWQ2MmViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IFZpbGxhZ2UsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODcxMmNiY2RiNjIwNDE2YmFmZDg2NGU0ZDQ3MjU2M2Uuc2V0Q29udGVudChodG1sXzM4YWJjOGJmZjllZDQwYTY4YTcxOGIxYjYzOWQ2MmViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JjMWMyNjRjOGQxMTQ0NTE5ZmNmNGY0NTgxNzM4ZWZlLmJpbmRQb3B1cChwb3B1cF84NzEyY2JjZGI2MjA0MTZiYWZkODY0ZTRkNDcyNTYzZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hOGExMGVlZjEwM2Q0NDM5YWE0NzExYjczNjc5OTk4MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5NzMwNzA0MTcwMjg2NSwtNzMuOTY0Mjg2MTc3NDA2NTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDc0MDE3MzhmYWM2NDExZWJjMzdkYmQ0OTBlZjE3ZjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTAyYWYzOGMyZTcyNDAwY2E1ODI3NDc4NTU0NDA4YzIgPSAkKCc8ZGl2IGlkPSJodG1sX2EwMmFmMzhjMmU3MjQwMGNhNTgyNzQ3ODU1NDQwOGMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW4gVmFsbGV5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3NDAxNzM4ZmFjNjQxMWViYzM3ZGJkNDkwZWYxN2Y2LnNldENvbnRlbnQoaHRtbF9hMDJhZjM4YzJlNzI0MDBjYTU4Mjc0Nzg1NTQ0MDhjMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hOGExMGVlZjEwM2Q0NDM5YWE0NzExYjczNjc5OTk4My5iaW5kUG9wdXAocG9wdXBfZDc0MDE3MzhmYWM2NDExZWJjMzdkYmQ0OTBlZjE3ZjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODg4NDc1ZGFlYTA4NGI0ZGE3NDgzYWNmMjk3YjMwM2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I1NWQ2NDk1ODcwNzRmM2FiYjRmODExNmE0MDhmMjA2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZkZjU3ZmE0ZDg3ZjQxYjA5MDY1MWIwNGRhNWU3MGVhID0gJCgnPGRpdiBpZD0iaHRtbF9mZGY1N2ZhNGQ4N2Y0MWIwOTA2NTFiMDRkYTVlNzBlYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0cywgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNTVkNjQ5NTg3MDc0ZjNhYmI0ZjgxMTZhNDA4ZjIwNi5zZXRDb250ZW50KGh0bWxfZmRmNTdmYTRkODdmNDFiMDkwNjUxYjA0ZGE1ZTcwZWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODg4NDc1ZGFlYTA4NGI0ZGE3NDgzYWNmMjk3YjMwM2MuYmluZFBvcHVwKHBvcHVwX2I1NWQ2NDk1ODcwNzRmM2FiYjRmODExNmE0MDhmMjA2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIzODJkMmUwMWQ2NTRjNTQ4Y2U2MzAwNDdhMTAyNjdmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjA5ODMyNzE1LC03My45ODEzNzU5NDgzMzU0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hM2QyOTMzZTkzOWE0NzdlYTExNzg2MTJkNGY0MTQ1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMzFlY2Q1YzE3OTk0ODZkODM5NmEyOTUzZjA4ZTFjNSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjMxZWNkNWMxNzk5NDg2ZDgzOTZhMjk1M2YwOGUxYzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyYW1lcmN5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EzZDI5MzNlOTM5YTQ3N2VhMTE3ODYxMmQ0ZjQxNDUyLnNldENvbnRlbnQoaHRtbF8yMzFlY2Q1YzE3OTk0ODZkODM5NmEyOTUzZjA4ZTFjNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMzgyZDJlMDFkNjU0YzU0OGNlNjMwMDQ3YTEwMjY3Zi5iaW5kUG9wdXAocG9wdXBfYTNkMjkzM2U5MzlhNDc3ZWExMTc4NjEyZDRmNDE0NTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmU2ODNhOGQyZDEwNGYxMjhhZTY2MjU1M2M1MWY1MDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE5MzE5ODM5NDU2NSwtNzQuMDE2ODY5MzA1MDg2MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTdiNzA5NDJjZTM3NDFlNzk0MWQ4ZTA2YjhhMmMwMDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOThmZWZkMTkwNmU2NDc5OThlODkwYmRmMmQxOGI4NWYgPSAkKCc8ZGl2IGlkPSJodG1sXzk4ZmVmZDE5MDZlNjQ3OTk4ZTg5MGJkZjJkMThiODVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXR0ZXJ5IFBhcmsgQ2l0eSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xN2I3MDk0MmNlMzc0MWU3OTQxZDhlMDZiOGEyYzAwNS5zZXRDb250ZW50KGh0bWxfOThmZWZkMTkwNmU2NDc5OThlODkwYmRmMmQxOGI4NWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmU2ODNhOGQyZDEwNGYxMjhhZTY2MjU1M2M1MWY1MDMuYmluZFBvcHVwKHBvcHVwXzE3YjcwOTQyY2UzNzQxZTc5NDFkOGUwNmI4YTJjMDA1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzczMmMxMzZhOTJlNjQ3OTRiNGY5ZGY1YjQ4ZTAzZmJjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWRhN2EyMGI5YWVjNDdkOWE3YTZlNzhhMzQ0OGRlZDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDhkY2I4MWYyNWU4NGZmOWI1ZWQ2NWY0YjY3MjJiMjMgPSAkKCc8ZGl2IGlkPSJodG1sXzA4ZGNiODFmMjVlODRmZjliNWVkNjVmNGI2NzIyYjIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3QsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWRhN2EyMGI5YWVjNDdkOWE3YTZlNzhhMzQ0OGRlZDMuc2V0Q29udGVudChodG1sXzA4ZGNiODFmMjVlODRmZjliNWVkNjVmNGI2NzIyYjIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzczMmMxMzZhOTJlNjQ3OTRiNGY5ZGY1YjQ4ZTAzZmJjLmJpbmRQb3B1cChwb3B1cF8xZGE3YTIwYjlhZWM0N2Q5YTdhNmU3OGEzNDQ4ZGVkMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMjgwZDZiZGE3ZGM0N2I4ODkzNGJkYjBlNTE5Yjg2OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODUwODU5MzM1NDkyLC03My45MTU2NTM3NDMwNDIzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMzRhZWNkYjY3Njg0MTE5YTYxYzc3MzkwYmVlZGQ0NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80N2VlODFhMGNhOWQ0NDM5YTlmZjJhNzM5NGJjNmRkZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDdlZTgxYTBjYTlkNDQzOWE5ZmYyYTczOTRiYzZkZGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFzdG9yaWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTM0YWVjZGI2NzY4NDExOWE2MWM3NzM5MGJlZWRkNDUuc2V0Q29udGVudChodG1sXzQ3ZWU4MWEwY2E5ZDQ0MzlhOWZmMmE3Mzk0YmM2ZGRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QyODBkNmJkYTdkYzQ3Yjg4OTM0YmRiMGU1MTliODY5LmJpbmRQb3B1cChwb3B1cF9hMzRhZWNkYjY3Njg0MTE5YTYxYzc3MzkwYmVlZGQ0NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMzkwMzIzMDA5NmY0N2NkYmQ2MzdhODY3NTliYjlhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjM0OTA4ODYwMjIyLC03My45MDE4NDE2NjgzODI4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYmEyNjkwMjIxYmQ0ZWJlYjk2MWNhMTM4M2M5YzI1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYTc5M2JhODEyYmI0ODI3OWM4ZDVjNjJiZDRkMTE2ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMGE3OTNiYTgxMmJiNDgyNzljOGQ1YzYyYmQ0ZDExNmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBiYTI2OTAyMjFiZDRlYmViOTYxY2ExMzgzYzljMjUyLnNldENvbnRlbnQoaHRtbF8wYTc5M2JhODEyYmI0ODI3OWM4ZDVjNjJiZDRkMTE2ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMzkwMzIzMDA5NmY0N2NkYmQ2MzdhODY3NTliYjlhOC5iaW5kUG9wdXAocG9wdXBfMGJhMjY5MDIyMWJkNGViZWI5NjFjYTEzODNjOWMyNTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGRmYzZmMTcyYmI0NDI2YTg1ZDE5MzZmY2VhNTcwNzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTE5ODEzODAwNzM2NywtNzMuODgyODIxMDkxNjQzNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmMzMDA3ZGI5N2IxNDgwODgyODdiY2U4ZjZlODdlYTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWE0YzkzMDE0NzdmNDJhMjk3ZWMzMGQ2NWNiZmZiYzAgPSAkKCc8ZGl2IGlkPSJodG1sX2VhNGM5MzAxNDc3ZjQyYTI5N2VjMzBkNjVjYmZmYmMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYWNrc29uIEhlaWdodHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmMzMDA3ZGI5N2IxNDgwODgyODdiY2U4ZjZlODdlYTEuc2V0Q29udGVudChodG1sX2VhNGM5MzAxNDc3ZjQyYTI5N2VjMzBkNjVjYmZmYmMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RkZmM2ZjE3MmJiNDQyNmE4NWQxOTM2ZmNlYTU3MDc3LmJpbmRQb3B1cChwb3B1cF9mYzMwMDdkYjk3YjE0ODA4ODI4N2JjZThmNmU4N2VhMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNjc2NDVjMjI4MDQ0YzJiYTliYTFkZWE0NTNkY2YyZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDA0ODUwNTEyMjAyNCwtNzMuODgxNjU2MjIyODgzODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjYwYWY1MWUwY2M5NDJhYThkMTg5MjNhM2Y2M2MwZDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzE1ZmE1MGU5NGU2NGFkYmFmYjU2MjMzNzQ1NTMzYzAgPSAkKCc8ZGl2IGlkPSJodG1sX2MxNWZhNTBlOTRlNjRhZGJhZmI1NjIzMzc0NTUzM2MwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbG1odXJzdCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNjBhZjUxZTBjYzk0MmFhOGQxODkyM2EzZjYzYzBkMy5zZXRDb250ZW50KGh0bWxfYzE1ZmE1MGU5NGU2NGFkYmFmYjU2MjMzNzQ1NTMzYzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjY3NjQ1YzIyODA0NGMyYmE5YmExZGVhNDUzZGNmMmQuYmluZFBvcHVwKHBvcHVwX2I2MGFmNTFlMGNjOTQyYWE4ZDE4OTIzYTNmNjNjMGQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q0MmMzNWY2MmI2ODQ1OTM4ZmE0MzA3NjQ0YjdhOWZhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU0MjI1Mjc3Mzg0ODcsLTczLjgzODEzNzY0NjAwMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDc4NTIxZjQyNDVhNGM5NmFlN2E5YmY1NmU1NjA1ZTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGI2MzkyOGYyZDQxNGFmMGIyOGYwMzIyZDA3MzllNzMgPSAkKCc8ZGl2IGlkPSJodG1sXzBiNjM5MjhmMmQ0MTRhZjBiMjhmMDMyMmQwNzM5ZTczIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib3dhcmQgQmVhY2gsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDc4NTIxZjQyNDVhNGM5NmFlN2E5YmY1NmU1NjA1ZTUuc2V0Q29udGVudChodG1sXzBiNjM5MjhmMmQ0MTRhZjBiMjhmMDMyMmQwNzM5ZTczKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q0MmMzNWY2MmI2ODQ1OTM4ZmE0MzA3NjQ0YjdhOWZhLmJpbmRQb3B1cChwb3B1cF9kNzg1MjFmNDI0NWE0Yzk2YWU3YTliZjU2ZTU2MDVlNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMTdlYTQ2MDVkYjM0ZWY4OTExZWQwMmJhOWEyM2MzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MjM4MTc1MDE1NjY3LC03My44NTY4MjQ5NzM0NTI1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMzU3ODZiYTFmODQ0YzhiYmZkYjY2Yzk4NGVmNjZkOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81OGNhZjJmZjVkMTM0YzIzOTBjYmVmZWRkZTBkYjdiOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNThjYWYyZmY1ZDEzNGMyMzkwY2JlZmVkZGUwZGI3YjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvcm9uYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMzU3ODZiYTFmODQ0YzhiYmZkYjY2Yzk4NGVmNjZkOS5zZXRDb250ZW50KGh0bWxfNThjYWYyZmY1ZDEzNGMyMzkwY2JlZmVkZGUwZGI3YjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTE3ZWE0NjA1ZGIzNGVmODkxMWVkMDJiYTlhMjNjMzQuYmluZFBvcHVwKHBvcHVwX2EzNTc4NmJhMWY4NDRjOGJiZmRiNjZjOTg0ZWY2NmQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkzOWY5OGJmMzAwNzRlYzU5Y2RlODY5ZGYxNzU0Y2Q3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI1MjYzNzgyMTY1MDMsLTczLjg0NDQ3NTAwNzg4OTgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4MWE3OWY3ZDU3ZTRkNWM5ODhkM2ZhYjMwOWJjZWE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjN2JhYTE4NjRmNjQ4MThiNDQyNGUyYzY1MDQ4NzU1ID0gJCgnPGRpdiBpZD0iaHRtbF9mYzdiYWExODY0ZjY0ODE4YjQ0MjRlMmM2NTA0ODc1NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE4MWE3OWY3ZDU3ZTRkNWM5ODhkM2ZhYjMwOWJjZWE1LnNldENvbnRlbnQoaHRtbF9mYzdiYWExODY0ZjY0ODE4YjQ0MjRlMmM2NTA0ODc1NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MzlmOThiZjMwMDc0ZWM1OWNkZTg2OWRmMTc1NGNkNy5iaW5kUG9wdXAocG9wdXBfMTgxYTc5ZjdkNTdlNGQ1Yzk4OGQzZmFiMzA5YmNlYTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWNkOTYxZTBkNDJlNDdmNWE3MGMzYzNlOTI1ZjI0Y2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDUxNzkwMzU0MTQ4LC03My44Mjk4MTkwNTgyNTcwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNWJmYWFkOTU1MWU0ZTBlODJkY2JmZTgyMGU5MTYxYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hN2NkOWVjNWM0ZTk0MTQwYmMyZmYyY2MyOWJlYjdmZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTdjZDllYzVjNGU5NDE0MGJjMmZmMmNjMjliZWI3ZmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktldyBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1YmZhYWQ5NTUxZTRlMGU4MmRjYmZlODIwZTkxNjFiLnNldENvbnRlbnQoaHRtbF9hN2NkOWVjNWM0ZTk0MTQwYmMyZmYyY2MyOWJlYjdmZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hY2Q5NjFlMGQ0MmU0N2Y1YTcwYzNjM2U5MjVmMjRjYy5iaW5kUG9wdXAocG9wdXBfMDViZmFhZDk1NTFlNGUwZTgyZGNiZmU4MjBlOTE2MWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWY3OWZlZDhlZDNiNDk5NGFiNWI2NDczNmU0YjhiMjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTc5NDczMTQ3MTc2MywtNzMuODMxODMzMjE0NDY4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjVlNmE0Yjc3NjYwNDY1Y2IxYzVmYmRiMzZlOTk0YmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTRhYTM3NmY3YjJhNGIzNTk4YmJkZmYyMDFiMTk2YmEgPSAkKCc8ZGl2IGlkPSJodG1sX2U0YWEzNzZmN2IyYTRiMzU5OGJiZGZmMjAxYjE5NmJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBIaWxsLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY1ZTZhNGI3NzY2MDQ2NWNiMWM1ZmJkYjM2ZTk5NGJlLnNldENvbnRlbnQoaHRtbF9lNGFhMzc2ZjdiMmE0YjM1OThiYmRmZjIwMWIxOTZiYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZjc5ZmVkOGVkM2I0OTk0YWI1YjY0NzM2ZTRiOGIyMS5iaW5kUG9wdXAocG9wdXBfNjVlNmE0Yjc3NjYwNDY1Y2IxYzVmYmRiMzZlOTk0YmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDQwMjAwOWI2YmJiNDFlNGJjZmJmZjE3MTc5MjhjMzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQ0NTQxOTY5Nzg0NiwtNzMuODMxNzczMDAzMjk1ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGFhYzg4M2RhZTRkNGNhZGFlYmEwNDYyOTQxMmU5MTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGU0ZTFmMjI0MDAyNDBhMzg1NTlhYTVjMTMwZjA0MjUgPSAkKCc8ZGl2IGlkPSJodG1sXzRlNGUxZjIyNDAwMjQwYTM4NTU5YWE1YzEzMGYwNDI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbHVzaGluZywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYWFjODgzZGFlNGQ0Y2FkYWViYTA0NjI5NDEyZTkxMy5zZXRDb250ZW50KGh0bWxfNGU0ZTFmMjI0MDAyNDBhMzg1NTlhYTVjMTMwZjA0MjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDQwMjAwOWI2YmJiNDFlNGJjZmJmZjE3MTc5MjhjMzQuYmluZFBvcHVwKHBvcHVwXzBhYWM4ODNkYWU0ZDRjYWRhZWJhMDQ2Mjk0MTJlOTEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJiMGIzZGM2Y2ViNzQxYzA5ZWE1NmU3YTRmZTI1ZWM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUwMjE3MzQ2MTA1MjgsLTczLjkzOTIwMjIzOTE1NTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhkMjBiMTAzNzI5NDQxMjg5MjAzYTJhYzRhMTBmZjg0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VjZjYyNjVmM2ViYTQ3NTg4MzIzODJhODQ5YjcwZmZkID0gJCgnPGRpdiBpZD0iaHRtbF9lY2Y2MjY1ZjNlYmE0NzU4ODMyMzgyYTg0OWI3MGZmZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG9uZyBJc2xhbmQgQ2l0eSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZDIwYjEwMzcyOTQ0MTI4OTIwM2EyYWM0YTEwZmY4NC5zZXRDb250ZW50KGh0bWxfZWNmNjI2NWYzZWJhNDc1ODgzMjM4MmE4NDliNzBmZmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmIwYjNkYzZjZWI3NDFjMDllYTU2ZTdhNGZlMjVlYzYuYmluZFBvcHVwKHBvcHVwXzhkMjBiMTAzNzI5NDQxMjg5MjAzYTJhYzRhMTBmZjg0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE4MTU0OGI2ZDBhNzQxNTFhYWVkMGI4NjNmNWY5NDU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQwMTc2MjgzNTE5MjQsLTczLjkyNjkxNjE3NTYxNTc3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBhMTU2OTE0NTA0MjQ4ZjBhMGJlYjc5ODY3Y2UzYWQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRhYjI4ZTU4OWE3YjQzMTZiMjcxOTE5MjI1NTI5YWE1ID0gJCgnPGRpdiBpZD0iaHRtbF80YWIyOGU1ODlhN2I0MzE2YjI3MTkxOTIyNTUyOWFhNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3VubnlzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBhMTU2OTE0NTA0MjQ4ZjBhMGJlYjc5ODY3Y2UzYWQwLnNldENvbnRlbnQoaHRtbF80YWIyOGU1ODlhN2I0MzE2YjI3MTkxOTIyNTUyOWFhNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xODE1NDhiNmQwYTc0MTUxYWFlZDBiODYzZjVmOTQ1OC5iaW5kUG9wdXAocG9wdXBfMGExNTY5MTQ1MDQyNDhmMGEwYmViNzk4NjdjZTNhZDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjFhYjUwYzc2NTQyNDNkN2EzYWJlZTMxNWZiMTY3MGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQwNzMyMzg4MzA5MSwtNzMuODY3MDQxNDc2NTg3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTFlNjRhOTcyOGRhNGQ0NThmN2UyNTI5YjYyZDRhYTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjEyMWU5ZTBiYzk4NDBlNGE1OTYwMzQxNjM3ZWZkMTUgPSAkKCc8ZGl2IGlkPSJodG1sXzIxMjFlOWUwYmM5ODQwZTRhNTk2MDM0MTYzN2VmZDE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEVsbWh1cnN0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxZTY0YTk3MjhkYTRkNDU4ZjdlMjUyOWI2MmQ0YWE3LnNldENvbnRlbnQoaHRtbF8yMTIxZTllMGJjOTg0MGU0YTU5NjAzNDE2MzdlZmQxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMWFiNTBjNzY1NDI0M2Q3YTNhYmVlMzE1ZmIxNjcwYy5iaW5kUG9wdXAocG9wdXBfZTFlNjRhOTcyOGRhNGQ0NThmN2UyNTI5YjYyZDRhYTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjMwMWI0MjgxMTlmNGFmZjkyMzI1Y2JiZGU5MDdhZDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjU0MjczNzQwOTM2MDYsLTczLjg5NjIxNzEzNjI2ODU5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFlMTNmMmU3MDU3MTRjZjU4Mzk4MjI4OWFhYzk4YzdiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI0YTEzODJkODBjNDQyNjVhNjU4ZDEyZTkyMmE3ZTViID0gJCgnPGRpdiBpZD0iaHRtbF8yNGExMzgyZDgwYzQ0MjY1YTY1OGQxMmU5MjJhN2U1YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFzcGV0aCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZTEzZjJlNzA1NzE0Y2Y1ODM5ODIyODlhYWM5OGM3Yi5zZXRDb250ZW50KGh0bWxfMjRhMTM4MmQ4MGM0NDI2NWE2NThkMTJlOTIyYTdlNWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjMwMWI0MjgxMTlmNGFmZjkyMzI1Y2JiZGU5MDdhZDEuYmluZFBvcHVwKHBvcHVwXzFlMTNmMmU3MDU3MTRjZjU4Mzk4MjI4OWFhYzk4YzdiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVhNzRiNDVjMDkzODQxYjA5MTZmYzRmMWQ4MzUxNGNhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4MzIzMTU2MTM4NTgsLTczLjkwMTQzNTE3NTU5NTg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA1NzU1Zjg0YTZlMjQ1ODFiNjEzZGMwZTllMDA1NjA3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JlNjdmNDhlYTRkOTQyMWZhYzY3NTcxMWJjYjU3ZWZhID0gJCgnPGRpdiBpZD0iaHRtbF9iZTY3ZjQ4ZWE0ZDk0MjFmYWM2NzU3MTFiY2I1N2VmYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmlkZ2V3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1NzU1Zjg0YTZlMjQ1ODFiNjEzZGMwZTllMDA1NjA3LnNldENvbnRlbnQoaHRtbF9iZTY3ZjQ4ZWE0ZDk0MjFmYWM2NzU3MTFiY2I1N2VmYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YTc0YjQ1YzA5Mzg0MWIwOTE2ZmM0ZjFkODM1MTRjYS5iaW5kUG9wdXAocG9wdXBfMDU3NTVmODRhNmUyNDU4MWI2MTNkYzBlOWUwMDU2MDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjdmYjcwMDI3YWQyNDhhZjgyNWIzMDNhOWNlMjQzOWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDI3NjI0Mjk2NzgzOCwtNzMuODcwNzQxNjc0MzU2MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTZjZjVjMDY0ZjUyNDg4YmI0MDI1NTkwYWY4ZTRlMDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzg2NjA3NWYzNTQ3NDRlYjk0ODQ3NGI4YTUyZDE4YTggPSAkKCc8ZGl2IGlkPSJodG1sX2M4NjYwNzVmMzU0NzQ0ZWI5NDg0NzRiOGE1MmQxOGE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HbGVuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNmNmNWMwNjRmNTI0ODhiYjQwMjU1OTBhZjhlNGUwNi5zZXRDb250ZW50KGh0bWxfYzg2NjA3NWYzNTQ3NDRlYjk0ODQ3NGI4YTUyZDE4YTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjdmYjcwMDI3YWQyNDhhZjgyNWIzMDNhOWNlMjQzOWIuYmluZFBvcHVwKHBvcHVwX2E2Y2Y1YzA2NGY1MjQ4OGJiNDAyNTU5MGFmOGU0ZTA2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y5NmVlMDEwZjIzMDQyZWVhNzQ5N2Q1ZDU3NGMxZWM5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4OTc0MDk0ODA3MzUsLTczLjg1NzgyNjg2OTA1MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGRmMTFmOGVhNjRlNDlkY2ExMmUwMjFmMzViZDQzZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTExMTJkZDJiNjY4NDRiNDhiZGJlZDllMWUyMWNmN2EgPSAkKCc8ZGl2IGlkPSJodG1sX2UxMTEyZGQyYjY2ODQ0YjQ4YmRiZWQ5ZTFlMjFjZjdhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWdvIFBhcmssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGRmMTFmOGVhNjRlNDlkY2ExMmUwMjFmMzViZDQzZWEuc2V0Q29udGVudChodG1sX2UxMTEyZGQyYjY2ODQ0YjQ4YmRiZWQ5ZTFlMjFjZjdhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y5NmVlMDEwZjIzMDQyZWVhNzQ5N2Q1ZDU3NGMxZWM5LmJpbmRQb3B1cChwb3B1cF8wZGYxMWY4ZWE2NGU0OWRjYTEyZTAyMWYzNWJkNDNlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ODg5NjFiZjFhODQ0YzIxYTc5YzExNDdlOWVjMWUxNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4OTg4Njg3OTE1Nzg5LC03My44NTgxMTA0NjU1NDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcwNTExOTg2YmU3NzRjMTM4MDI0ZDAyMmIxNjYzOGI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RmMTBiNTRhZTA1NzQ5NWRhY2E3YzZmNTJkNzkwMzNhID0gJCgnPGRpdiBpZD0iaHRtbF9kZjEwYjU0YWUwNTc0OTVkYWNhN2M2ZjUyZDc5MDMzYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29vZGhhdmVuLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcwNTExOTg2YmU3NzRjMTM4MDI0ZDAyMmIxNjYzOGI5LnNldENvbnRlbnQoaHRtbF9kZjEwYjU0YWUwNTc0OTVkYWNhN2M2ZjUyZDc5MDMzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ODg5NjFiZjFhODQ0YzIxYTc5YzExNDdlOWVjMWUxNC5iaW5kUG9wdXAocG9wdXBfNzA1MTE5ODZiZTc3NGMxMzgwMjRkMDIyYjE2NjM4YjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzI0ZGUyNWViMzA1NGZhYWI2ZjYxYTIwZDg0M2RiN2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA3MDg0NjgyNjU0MTUsLTczLjg0MzIwMjY2MTczNDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk4NGVjZDVmOGM2ZDQ2ZGZhNzI0YjUzYzJlNjBjZGZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBlMzJlMjM5ZGZiMzQ1ZDFiZDI0MjYxZTBiYjUzMzY1ID0gJCgnPGRpdiBpZD0iaHRtbF8wZTMyZTIzOWRmYjM0NWQxYmQyNDI2MWUwYmI1MzM2NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ODRlY2Q1ZjhjNmQ0NmRmYTcyNGI1M2MyZTYwY2RmYS5zZXRDb250ZW50KGh0bWxfMGUzMmUyMzlkZmIzNDVkMWJkMjQyNjFlMGJiNTMzNjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzI0ZGUyNWViMzA1NGZhYWI2ZjYxYTIwZDg0M2RiN2QuYmluZFBvcHVwKHBvcHVwXzk4NGVjZDVmOGM2ZDQ2ZGZhNzI0YjUzYzJlNjBjZGZhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgxZmIwZDgxZjcyNTQzNTNiOTdkNGFiYTdlNTJiY2Q1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjY4NTQ5NTc3NjcxOTUsLTczLjgwOTg2NDc4NjQ5MDQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY5NDQwYTE2NWU4ODQ2OGQ5YTYyM2M3NTdjMDgwNDE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzYTg3MzI5N2E4MTQ3MTY5YWQ2ZDczOWQxNDk1NTA4ID0gJCgnPGRpdiBpZD0iaHRtbF8yM2E4NzMyOTdhODE0NzE2OWFkNmQ3MzlkMTQ5NTUwOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggT3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OTQ0MGExNjVlODg0NjhkOWE2MjNjNzU3YzA4MDQxNS5zZXRDb250ZW50KGh0bWxfMjNhODczMjk3YTgxNDcxNjlhZDZkNzM5ZDE0OTU1MDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODFmYjBkODFmNzI1NDM1M2I5N2Q0YWJhN2U1MmJjZDUuYmluZFBvcHVwKHBvcHVwXzY5NDQwYTE2NWU4ODQ2OGQ5YTYyM2M3NTdjMDgwNDE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0ZDQ3ZDRjMDU1NjQ2YThhYzA1ZmQxMTRjNGVkODcxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzg0OTAyNzQ5MjYwMjA1LC03My44NDMwNDUyODg5NjEyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MDRhMGFmM2E4NjI0OTA2ODNkYzFlYmI5MGM3YjQ5NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMDRlZTAyZGRlZDM0MjFkYTkxN2Q5OTQ4MGFkYzczMiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjA0ZWUwMmRkZWQzNDIxZGE5MTdkOTk0ODBhZGM3MzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvbGxlZ2UgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjA0YTBhZjNhODYyNDkwNjgzZGMxZWJiOTBjN2I0OTYuc2V0Q29udGVudChodG1sX2YwNGVlMDJkZGVkMzQyMWRhOTE3ZDk5NDgwYWRjNzMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y0ZDQ3ZDRjMDU1NjQ2YThhYzA1ZmQxMTRjNGVkODcxLmJpbmRQb3B1cChwb3B1cF82MDRhMGFmM2E4NjI0OTA2ODNkYzFlYmI5MGM3YjQ5Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMTdhODg2OWRlMGQ0NjBlYmZjYmExZjg0N2E1MjUwYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4MTI5MDc2NjAyNjk0LC03My44MTQyMDIxNjYxMDg2M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZGVmYTMzNWRlZDQ0MmJmODc3YzViNTg3YWZlMDRkMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NGJiODg3N2VjMDA0YmQ2OWFmMDcxMWRmZjg3ZGVhYSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTRiYjg4NzdlYzAwNGJkNjlhZjA3MTFkZmY4N2RlYWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldoaXRlc3RvbmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2RlZmEzMzVkZWQ0NDJiZjg3N2M1YjU4N2FmZTA0ZDMuc2V0Q29udGVudChodG1sXzk0YmI4ODc3ZWMwMDRiZDY5YWYwNzExZGZmODdkZWFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMxN2E4ODY5ZGUwZDQ2MGViZmNiYTFmODQ3YTUyNTBiLmJpbmRQb3B1cChwb3B1cF83ZGVmYTMzNWRlZDQ0MmJmODc3YzViNTg3YWZlMDRkMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMjJhMjY0YWNkYTA0ZGVjYjkzYWVkNTA5ZjI5MDk3ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2NjA0MDYzMjgxMDY0LC03My43NzQyNzM2MzA2ODY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkMjExMTU2OTIyZDQyMTZiM2JmZTQ3OTE1MzZkMDdjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU4MmM0NTIyZWQ2ZDQ5ZWRiZjVjYjE0M2E3ZGM2ZDFhID0gJCgnPGRpdiBpZD0iaHRtbF81ODJjNDUyMmVkNmQ0OWVkYmY1Y2IxNDNhN2RjNmQxYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c2lkZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZDIxMTE1NjkyMmQ0MjE2YjNiZmU0NzkxNTM2ZDA3Yy5zZXRDb250ZW50KGh0bWxfNTgyYzQ1MjJlZDZkNDllZGJmNWNiMTQzYTdkYzZkMWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDIyYTI2NGFjZGEwNGRlY2I5M2FlZDUwOWYyOTA5N2UuYmluZFBvcHVwKHBvcHVwX2NkMjExMTU2OTIyZDQyMTZiM2JmZTQ3OTE1MzZkMDdjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI4NzQ2NGQzODRmODQ2ODI4Y2QzMzdkYmM4YmRiZDMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYxNzI5NTQ5MDMyNjIsLTczLjc5MTc2MjQzNzI4MDYxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhODZmNzE4MjRlYzQxNjRhMThjZDBlODg5NjUwYzk2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwNDk5NDFlMGYzYjQwYTBhZGVhZTgzYmRiMTQ3ZmMyID0gJCgnPGRpdiBpZD0iaHRtbF9jMDQ5OTQxZTBmM2I0MGEwYWRlYWU4M2JkYjE0N2ZjMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXVidXJuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYTg2ZjcxODI0ZWM0MTY0YTE4Y2QwZTg4OTY1MGM5Ni5zZXRDb250ZW50KGh0bWxfYzA0OTk0MWUwZjNiNDBhMGFkZWFlODNiZGIxNDdmYzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjg3NDY0ZDM4NGY4NDY4MjhjZDMzN2RiYzhiZGJkMzIuYmluZFBvcHVwKHBvcHVwX2RhODZmNzE4MjRlYzQxNjRhMThjZDBlODg5NjUwYzk2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ4MGU5MDFmY2NhMjQ3ZWJiNjVkNzIzYzkzMDY2OTYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzcwODI2MTkyODI2NywtNzMuNzM4ODk3NzU1ODA3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNDAwMzRkMzJjN2Q0YjI1OGI2OTY4Yzc1ZTA0MDcyZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYTMwY2NmMjVjOGY0MjM0OGM4NDk1ZmYyYTNkMzJiOCA9ICQoJzxkaXYgaWQ9Imh0bWxfY2EzMGNjZjI1YzhmNDIzNDhjODQ5NWZmMmEzZDMyYjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpdHRsZSBOZWNrLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E0MDAzNGQzMmM3ZDRiMjU4YjY5NjhjNzVlMDQwNzJkLnNldENvbnRlbnQoaHRtbF9jYTMwY2NmMjVjOGY0MjM0OGM4NDk1ZmYyYTNkMzJiOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ODBlOTAxZmNjYTI0N2ViYjY1ZDcyM2M5MzA2Njk2MC5iaW5kUG9wdXAocG9wdXBfYTQwMDM0ZDMyYzdkNGIyNThiNjk2OGM3NWUwNDA3MmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTZkNTVkNDcwYzcwNDM1NWEzZjA5NDhkZTM4OGRjYzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjY4NDYwOTc5MDc2MywtNzMuNzQyNDk4MjA3MjczM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMWU2NWEwNjE0Y2Q0NjMxYmZlYjNlN2ExZTY4OGYwMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NmM4YzhjOWUyZmY0M2M1ODU5YmFkNzFiZWIwNGEzYSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTZjOGM4YzllMmZmNDNjNTg1OWJhZDcxYmViMDRhM2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvdWdsYXN0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTFlNjVhMDYxNGNkNDYzMWJmZWIzZTdhMWU2ODhmMDEuc2V0Q29udGVudChodG1sXzk2YzhjOGM5ZTJmZjQzYzU4NTliYWQ3MWJlYjA0YTNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE2ZDU1ZDQ3MGM3MDQzNTVhM2YwOTQ4ZGUzODhkY2M0LmJpbmRQb3B1cChwb3B1cF8xMWU2NWEwNjE0Y2Q0NjMxYmZlYjNlN2ExZTY4OGYwMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MzU3OTViZDAyODU0N2Y0YTAzYzJmNjBkNTcxZGUzYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0OTQ0MDc5OTc0MzMyLC03My43MTU0ODExODk5OTE0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZTNlNGVkZjc2ZDQ0MzRhOTY0NDc0YTlkYmI2ZWQzZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OGExODZjNjY1YzM0M2RjODUwMmI3MzU5ODFiNWJhOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDhhMTg2YzY2NWMzNDNkYzg1MDJiNzM1OTgxYjViYTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdsZW4gT2FrcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZTNlNGVkZjc2ZDQ0MzRhOTY0NDc0YTlkYmI2ZWQzZS5zZXRDb250ZW50KGh0bWxfNDhhMTg2YzY2NWMzNDNkYzg1MDJiNzM1OTgxYjViYTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTM1Nzk1YmQwMjg1NDdmNGEwM2MyZjYwZDU3MWRlM2IuYmluZFBvcHVwKHBvcHVwXzJlM2U0ZWRmNzZkNDQzNGE5NjQ0NzRhOWRiYjZlZDNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q0ODdkZDI4NzJjZjRmZGNiODc5MGQzMDYyMmI1OTY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4NTczMTgxNzY2NzUsLTczLjcyMDEyODE0ODI2OTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2ODAyYTU5M2I5OTQ5MWZiOWQ4OTMxMDZhOGQzNGI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3ZTJkZGQyNjVlNjQyOTg4YzgzOGRkODdmY2Q0NDQ2ID0gJCgnPGRpdiBpZD0iaHRtbF83N2UyZGRkMjY1ZTY0Mjk4OGM4MzhkZDg3ZmNkNDQ0NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGVyb3NlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E2ODAyYTU5M2I5OTQ5MWZiOWQ4OTMxMDZhOGQzNGI3LnNldENvbnRlbnQoaHRtbF83N2UyZGRkMjY1ZTY0Mjk4OGM4MzhkZDg3ZmNkNDQ0Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNDg3ZGQyODcyY2Y0ZmRjYjg3OTBkMzA2MjJiNTk2NC5iaW5kUG9wdXAocG9wdXBfYTY4MDJhNTkzYjk5NDkxZmI5ZDg5MzEwNmE4ZDM0YjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTBiZjFkMDUyMWE4NDU3Zjk1MWFkNTI5NTIzODdlZTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjI1NzgyNDQyMjgwNDYsLTczLjgyMDg3NzY0OTMzNTY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBjOGQ5YTNiYzIyZjRkZDRhODVlNWQ3NTJjMDcxYjEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUwNjdkZDZmYmI0NDQzMjY5YzRhNmI0NTkwZGFjYzZiID0gJCgnPGRpdiBpZD0iaHRtbF81MDY3ZGQ2ZmJiNDQ0MzI2OWM0YTZiNDU5MGRhY2M2YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2V3IEdhcmRlbnMgSGlsbHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGM4ZDlhM2JjMjJmNGRkNGE4NWU1ZDc1MmMwNzFiMTAuc2V0Q29udGVudChodG1sXzUwNjdkZDZmYmI0NDQzMjY5YzRhNmI0NTkwZGFjYzZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EwYmYxZDA1MjFhODQ1N2Y5NTFhZDUyOTUyMzg3ZWU2LmJpbmRQb3B1cChwb3B1cF8wYzhkOWEzYmMyMmY0ZGQ0YTg1ZTVkNzUyYzA3MWIxMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MTc1MGY0ZjM1MDU0OTIwYjRhNjY3YTFjNTc1YmQ2OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDM5NDQ2NTMzMTMsLTczLjc4MjcxMzM3MDAzMjY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmZDBiYjhhMjhlMTRiZjdiMzVhY2VkNGEyZGM5ODI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZkODUyNmQyNDUwZDRkYTFhZThkODI5ZTFkMDE3MmFmID0gJCgnPGRpdiBpZD0iaHRtbF82ZDg1MjZkMjQ1MGQ0ZGExYWU4ZDgyOWUxZDAxNzJhZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnJlc2ggTWVhZG93cywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZmQwYmI4YTI4ZTE0YmY3YjM1YWNlZDRhMmRjOTgyNi5zZXRDb250ZW50KGh0bWxfNmQ4NTI2ZDI0NTBkNGRhMWFlOGQ4MjllMWQwMTcyYWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzE3NTBmNGYzNTA1NDkyMGI0YTY2N2ExYzU3NWJkNjguYmluZFBvcHVwKHBvcHVwXzhmZDBiYjhhMjhlMTRiZjdiMzVhY2VkNGEyZGM5ODI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg4OTZhODhjYmQxZjQ3Y2FiZDE1ZDM3NWUwODJjNmUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwOTM1NDcyNTIyNzEsLTczLjgxMTc0ODIyNDU4NjM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhkMWZmMzA2Njc3MzQ3ODZiMzdlOGNiMmFiNTA0YjE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEzYjhhN2E4MGQ2ODQwYjE5MzQ1MTU4YzFmN2U4NDg3ID0gJCgnPGRpdiBpZD0iaHRtbF8xM2I4YTdhODBkNjg0MGIxOTM0NTE1OGMxZjdlODQ4NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpYXJ3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhkMWZmMzA2Njc3MzQ3ODZiMzdlOGNiMmFiNTA0YjE3LnNldENvbnRlbnQoaHRtbF8xM2I4YTdhODBkNjg0MGIxOTM0NTE1OGMxZjdlODQ4Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ODk2YTg4Y2JkMWY0N2NhYmQxNWQzNzVlMDgyYzZlMy5iaW5kUG9wdXAocG9wdXBfOGQxZmYzMDY2NzczNDc4NmIzN2U4Y2IyYWI1MDRiMTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWRkMWUxODM2ODRkNGU1ZGE2MjA2ZmI2MzNmYzFjNDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDQ2NTczNjA2ODcxNywtNzMuNzk2OTAxNjU4ODgyODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDVlZTI3OGJhODhiNDAxMDkxNTY2ODVmY2M2NjEyYTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTgzYmFlNjNiY2M0NDIwOWI5MDBhOGJmY2ZiZmE4MjAgPSAkKCc8ZGl2IGlkPSJodG1sXzU4M2JhZTYzYmNjNDQyMDliOTAwYThiZmNmYmZhODIwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIENlbnRlciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNWVlMjc4YmE4OGI0MDEwOTE1NjY4NWZjYzY2MTJhNC5zZXRDb250ZW50KGh0bWxfNTgzYmFlNjNiY2M0NDIwOWI5MDBhOGJmY2ZiZmE4MjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWRkMWUxODM2ODRkNGU1ZGE2MjA2ZmI2MzNmYzFjNDEuYmluZFBvcHVwKHBvcHVwX2Q1ZWUyNzhiYTg4YjQwMTA5MTU2Njg1ZmNjNjYxMmE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVmMzdiMjg4NGRhYzRjMTQ5Nzk4MjJhNDlhZjE0ZjM1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ1NjE4NTcxNDE4NTUsLTczLjc1NDk0OTc2MjM0MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEwZTc2YjhkYmQzYjQxNGNhZTQ0MDAxOWM3YzZkMWM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhkZDE4NDRjZjRjZTQ0ZjhiMmM1ZWM0MTY3ZDU0NjVjID0gJCgnPGRpdiBpZD0iaHRtbF84ZGQxODQ0Y2Y0Y2U0NGY4YjJjNWVjNDE2N2Q1NDY1YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T2FrbGFuZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwZTc2YjhkYmQzYjQxNGNhZTQ0MDAxOWM3YzZkMWM2LnNldENvbnRlbnQoaHRtbF84ZGQxODQ0Y2Y0Y2U0NGY4YjJjNWVjNDE2N2Q1NDY1Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZjM3YjI4ODRkYWM0YzE0OTc5ODIyYTQ5YWYxNGYzNS5iaW5kUG9wdXAocG9wdXBfMTBlNzZiOGRiZDNiNDE0Y2FlNDQwMDE5YzdjNmQxYzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODljNGM2MzEyYzVmNDRiMWJlOGU3YWVjOTNiZWZjM2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTg4OTMwOTIxNjczNTYsLTczLjczODcxNDg0NTc4NDI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc5Zjg0YmM5ZDdiMjQxYTlhNWU5YzkxZDlkNWFiYmI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQxNWY5YTg1YjZlZjQxOTQ5MDNmNDgyYmNhOGRlMjY2ID0gJCgnPGRpdiBpZD0iaHRtbF80MTVmOWE4NWI2ZWY0MTk0OTAzZjQ4MmJjYThkZTI2NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zIFZpbGxhZ2UsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzlmODRiYzlkN2IyNDFhOWE1ZTljOTFkOWQ1YWJiYjQuc2V0Q29udGVudChodG1sXzQxNWY5YTg1YjZlZjQxOTQ5MDNmNDgyYmNhOGRlMjY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg5YzRjNjMxMmM1ZjQ0YjFiZThlN2FlYzkzYmVmYzNmLmJpbmRQb3B1cChwb3B1cF83OWY4NGJjOWQ3YjI0MWE5YTVlOWM5MWQ5ZDVhYmJiNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNmFhNzhlMmZiN2Y0OWJjYmM2YWYzY2M4ODNmZjE5MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTI0MzQ0MTkxOTA0LC03My43NTkyNTAwOTMzNTU5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZTEzNTI4N2RlMDU0YmVjODk3ZjFjNGM2ZGE1NTdiZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZGY1ZWE4OTMxNWQ0MWIyOGI3M2QwZmIzNzY3ODg4YiA9ICQoJzxkaXYgaWQ9Imh0bWxfOWRmNWVhODkzMTVkNDFiMjhiNzNkMGZiMzc2Nzg4OGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhvbGxpcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZTEzNTI4N2RlMDU0YmVjODk3ZjFjNGM2ZGE1NTdiZi5zZXRDb250ZW50KGh0bWxfOWRmNWVhODkzMTVkNDFiMjhiNzNkMGZiMzc2Nzg4OGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzZhYTc4ZTJmYjdmNDliY2JjNmFmM2NjODgzZmYxOTMuYmluZFBvcHVwKHBvcHVwX2FlMTM1Mjg3ZGUwNTRiZWM4OTdmMWM0YzZkYTU1N2JmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM2MTk5MGYwZWIzMzRmNmFhMGNlYmM3MmMwNTEwNDczID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk2OTExMjUzNzg5ODg1LC03My43OTA0MjYxMzEzNTU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgzMDYxYzQ4MTM0MjQ4NDlhMmU4NGM0Y2IxM2M0ZTc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkyNjkzZGM2MzE4NjRkMjY4ZDRhOGUyZTUwMjdhZWM1ID0gJCgnPGRpdiBpZD0iaHRtbF85MjY5M2RjNjMxODY0ZDI2OGQ0YThlMmU1MDI3YWVjNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggSmFtYWljYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MzA2MWM0ODEzNDI0ODQ5YTJlODRjNGNiMTNjNGU3NC5zZXRDb250ZW50KGh0bWxfOTI2OTNkYzYzMTg2NGQyNjhkNGE4ZTJlNTAyN2FlYzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzYxOTkwZjBlYjMzNGY2YWEwY2ViYzcyYzA1MTA0NzMuYmluZFBvcHVwKHBvcHVwXzgzMDYxYzQ4MTM0MjQ4NDlhMmU4NGM0Y2IxM2M0ZTc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RhZDk1ZDEyNTZhYjRiYTdiMDE1Njk1YzdjNDFmZGQ2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk0NDQ1Mzg1MjIzNTksLTczLjc1ODY3NjAzNzI3NzE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiMjQyNWQ2Zjc2NTRiZTZiYzMxY2JmZjE4MDE4ZDQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZjMjZmZDY2YWM1NDRiMTJhYzVkNzYyMWViZDYzZTJlID0gJCgnPGRpdiBpZD0iaHRtbF82YzI2ZmQ2NmFjNTQ0YjEyYWM1ZDc2MjFlYmQ2M2UyZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEFsYmFucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYjI0MjVkNmY3NjU0YmU2YmMzMWNiZmYxODAxOGQ0Ny5zZXRDb250ZW50KGh0bWxfNmMyNmZkNjZhYzU0NGIxMmFjNWQ3NjIxZWJkNjNlMmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGFkOTVkMTI1NmFiNGJhN2IwMTU2OTVjN2M0MWZkZDYuYmluZFBvcHVwKHBvcHVwX2NiMjQyNWQ2Zjc2NTRiZTZiYzMxY2JmZjE4MDE4ZDQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEzZGIzNTQ3NDI5YzRhMzFiMDQ4OThlMDNkNDk4MjU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc1MjExMzk1OTE3MzMsLTczLjc3MjU4Nzg3NjIwOTA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JlZDA1MTNjYzA2ZjQ5ZmViZDM1ODVjOWExODU5ZDE5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NkNzk2MGM0OTcwZjQyOTBiYjg1M2FlOTZjMWJhYmEyID0gJCgnPGRpdiBpZD0iaHRtbF9jZDc5NjBjNDk3MGY0MjkwYmI4NTNhZTk2YzFiYWJhMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9jaGRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmVkMDUxM2NjMDZmNDlmZWJkMzU4NWM5YTE4NTlkMTkuc2V0Q29udGVudChodG1sX2NkNzk2MGM0OTcwZjQyOTBiYjg1M2FlOTZjMWJhYmEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEzZGIzNTQ3NDI5YzRhMzFiMDQ4OThlMDNkNDk4MjU1LmJpbmRQb3B1cChwb3B1cF9iZWQwNTEzY2MwNmY0OWZlYmQzNTg1YzlhMTg1OWQxOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNjg0MzcxYzQzODY0MjVlOWZlN2VkNTBjOTZiMDdlOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2NjIzMDQ5MDM2ODU4NCwtNzMuNzYwNDIwOTI2ODIyODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTNhZTI5ZmM4ZWVhNDk1NTkzOTFhMDdlYThkNGNiMjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDU3MTQ4NTE5NDRjNDhlZmE1OGU0ZjdiODc1NzNmYmYgPSAkKCc8ZGl2IGlkPSJodG1sXzQ1NzE0ODUxOTQ0YzQ4ZWZhNThlNGY3Yjg3NTczZmJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHJpbmdmaWVsZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UzYWUyOWZjOGVlYTQ5NTU5MzkxYTA3ZWE4ZDRjYjI3LnNldENvbnRlbnQoaHRtbF80NTcxNDg1MTk0NGM0OGVmYTU4ZTRmN2I4NzU3M2ZiZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNjg0MzcxYzQzODY0MjVlOWZlN2VkNTBjOTZiMDdlOC5iaW5kUG9wdXAocG9wdXBfZTNhZTI5ZmM4ZWVhNDk1NTkzOTFhMDdlYThkNGNiMjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWQ0MjVmODQ3YjRjNDM4N2FlNDZlNDQ0M2RjYTk5NTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTI3NzQ2MzkxNjA4NDUsLTczLjczNTI2ODczNzA4MDI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1OTUyMjAzY2QwNzRiMTdiNTk5ZjI3NWQ3MjM3ZThkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYxOGUxYzE1ZmIwZjRiMzk5NDcxNWVlM2EwNDlkMzEzID0gJCgnPGRpdiBpZD0iaHRtbF82MThlMWMxNWZiMGY0YjM5OTQ3MTVlZTNhMDQ5ZDMxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FtYnJpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M1OTUyMjAzY2QwNzRiMTdiNTk5ZjI3NWQ3MjM3ZThkLnNldENvbnRlbnQoaHRtbF82MThlMWMxNWZiMGY0YjM5OTQ3MTVlZTNhMDQ5ZDMxMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZDQyNWY4NDdiNGM0Mzg3YWU0NmU0NDQzZGNhOTk1MC5iaW5kUG9wdXAocG9wdXBfYzU5NTIyMDNjZDA3NGIxN2I1OTlmMjc1ZDcyMzdlOGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmExZDZlNTE5ODhmNGI5ZDlhNDllNDI2NDUyOTM1NTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTk4MTY0MzM0MjgwODQsLTczLjczNTI2MDc5NDI4Mjc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxN2M4ODBiODIyODQzMzZiNDhkYzgwNDliZWYwZTVhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFhNTAyY2U2OGY5NjRiMzdhMWZiNGQ3ZDc2YjdlNTRlID0gJCgnPGRpdiBpZD0iaHRtbF8xYTUwMmNlNjhmOTY0YjM3YTFmYjRkN2Q3NmI3ZTU0ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zZWRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTE3Yzg4MGI4MjI4NDMzNmI0OGRjODA0OWJlZjBlNWEuc2V0Q29udGVudChodG1sXzFhNTAyY2U2OGY5NjRiMzdhMWZiNGQ3ZDc2YjdlNTRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZhMWQ2ZTUxOTg4ZjRiOWQ5YTQ5ZTQyNjQ1MjkzNTUzLmJpbmRQb3B1cChwb3B1cF81MTdjODgwYjgyMjg0MzM2YjQ4ZGM4MDQ5YmVmMGU1YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMTYxYzQ5YTJiODY0OTQ1OTgzYmU0M2JmODkyZjFjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzEzNDQzMjUwMDg5NCwtNzMuNzU0OTc5NjgwNDM4NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTZmYjdiM2VlZDMwNDhmMjlmMWUyNzVkMThhMGRjYTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGQwNDBhZGRmMTEyNGY2MGE4MGQ0MGM2MDgxOTUyMzYgPSAkKCc8ZGl2IGlkPSJodG1sXzRkMDQwYWRkZjExMjRmNjBhODBkNDBjNjA4MTk1MjM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GYXIgUm9ja2F3YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTZmYjdiM2VlZDMwNDhmMjlmMWUyNzVkMThhMGRjYTQuc2V0Q29udGVudChodG1sXzRkMDQwYWRkZjExMjRmNjBhODBkNDBjNjA4MTk1MjM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QxNjFjNDlhMmI4NjQ5NDU5ODNiZTQzYmY4OTJmMWNlLmJpbmRQb3B1cChwb3B1cF8xNmZiN2IzZWVkMzA0OGYyOWYxZTI3NWQxOGEwZGNhNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ODI3MDRkZGZlZTg0OTE0YTc2Yjk4NTdlYjZkZGQ5MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzAyNjU4MzUxMjM4LC03My44MjAwNTQ4OTExMDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgwNjdhMzZjYmMxNDRjMDY4MDMyNGNiODBhYTBlZWFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZiZmViNTJiNzZhMDRmZDk5NzU2M2Q4YWExMWNjNTU3ID0gJCgnPGRpdiBpZD0iaHRtbF82YmZlYjUyYjc2YTA0ZmQ5OTc1NjNkOGFhMTFjYzU1NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvYWQgQ2hhbm5lbCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MDY3YTM2Y2JjMTQ0YzA2ODAzMjRjYjgwYWEwZWVhYy5zZXRDb250ZW50KGh0bWxfNmJmZWI1MmI3NmEwNGZkOTk3NTYzZDhhYTExY2M1NTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDgyNzA0ZGRmZWU4NDkxNGE3NmI5ODU3ZWI2ZGRkOTAuYmluZFBvcHVwKHBvcHVwXzgwNjdhMzZjYmMxNDRjMDY4MDMyNGNiODBhYTBlZWFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZjYWJkM2IyZGQ1MDRmN2FhM2Y0ZDVlMTQ3NTdhNjhmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU3NDAxMjg4NDU0NTIsLTczLjkyNTUxMTk2OTk0MTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UxNDFmOTNhY2I0NTRmMDNhOWZjNjY3ZTBhYzU1OTg3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0MDllZTdlZTNmNzRlNDZiYjA1ZGU1MzQyN2M5MWQyID0gJCgnPGRpdiBpZD0iaHRtbF8zNDA5ZWU3ZWUzZjc0ZTQ2YmIwNWRlNTM0MjdjOTFkMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJlZXp5IFBvaW50LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxNDFmOTNhY2I0NTRmMDNhOWZjNjY3ZTBhYzU1OTg3LnNldENvbnRlbnQoaHRtbF8zNDA5ZWU3ZWUzZjc0ZTQ2YmIwNWRlNTM0MjdjOTFkMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mY2FiZDNiMmRkNTA0ZjdhYTNmNGQ1ZTE0NzU3YTY4Zi5iaW5kUG9wdXAocG9wdXBfZTE0MWY5M2FjYjQ1NGYwM2E5ZmM2NjdlMGFjNTU5ODcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzVjY2Q5NzgwODM2NGFhMTllZDE1YTYzZGU3NjhiNDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5MjMwMTU2NDI4OTYsLTczLjkwMjI4OTYwMzkxNjczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM5ZWRhMjMyNGQ1NzQ3NDU5NzJjNDA0Nzc3ZmFlNTJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q1ZGNjNjBjOGM0ODQyZTZhNjc5YzUyZDEwOWY3OGI5ID0gJCgnPGRpdiBpZD0iaHRtbF9kNWRjYzYwYzhjNDg0MmU2YTY3OWM1MmQxMDlmNzhiOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RlaW53YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzllZGEyMzI0ZDU3NDc0NTk3MmM0MDQ3NzdmYWU1MmIuc2V0Q29udGVudChodG1sX2Q1ZGNjNjBjOGM0ODQyZTZhNjc5YzUyZDEwOWY3OGI5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1Y2NkOTc4MDgzNjRhYTE5ZWQxNWE2M2RlNzY4YjQwLmJpbmRQb3B1cChwb3B1cF8zOWVkYTIzMjRkNTc0NzQ1OTcyYzQwNDc3N2ZhZTUyYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMWM3YTdmN2RlYzA0YzQyYTZlM2NkZTkzZjRkYmZhZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5Mjc4MTQwMzYwMDQ4LC03My44MDQzNjQ1MTcyMDk4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MDgwNDYzMTg0ZmE0ZDlhOGJkY2U0MTBiZTQ1YzA0NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kOGNmMGRmMTM5ZWI0NGY1ODk0MDhiMmFiYTUxNTRiYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDhjZjBkZjEzOWViNDRmNTg5NDA4YjJhYmE1MTU0YmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlZWNoaHVyc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTA4MDQ2MzE4NGZhNGQ5YThiZGNlNDEwYmU0NWMwNDYuc2V0Q29udGVudChodG1sX2Q4Y2YwZGYxMzllYjQ0ZjU4OTQwOGIyYWJhNTE1NGJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzExYzdhN2Y3ZGVjMDRjNDJhNmUzY2RlOTNmNGRiZmFmLmJpbmRQb3B1cChwb3B1cF85MDgwNDYzMTg0ZmE0ZDlhOGJkY2U0MTBiZTQ1YzA0Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OTU4Y2UxZTBlOWE0ZDE3OTE0ZTgyOWQ5Njc3MTRjNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4Mjg0MjgwNjI0NTU1NCwtNzMuNzc2ODAyMjI2MjE1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYmE0YjgwMDBhYTM0MTQ5OWFmN2YyZmNhOGJjMTViNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YzcwNDMyZGViOWY0MDY2OTllYmU4NDlhNGRhODRlZiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2M3MDQzMmRlYjlmNDA2Njk5ZWJlODQ5YTRkYTg0ZWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheSBUZXJyYWNlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JiYTRiODAwMGFhMzQxNDk5YWY3ZjJmY2E4YmMxNWI0LnNldENvbnRlbnQoaHRtbF83YzcwNDMyZGViOWY0MDY2OTllYmU4NDlhNGRhODRlZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OTU4Y2UxZTBlOWE0ZDE3OTE0ZTgyOWQ5Njc3MTRjNi5iaW5kUG9wdXAocG9wdXBfYmJhNGI4MDAwYWEzNDE0OTlhZjdmMmZjYThiYzE1YjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDc2N2UzNGU2ZjkxNGJkNWI3YjRmZmIxNzAwOThkM2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTU2NDE4MDczNjg0OTQsLTczLjc3NjEzMjgyMzkxNzA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhkZjlmN2VmZjUwNjRiN2I5ZjY3ODQzMzE1ODRiOGZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkxZDk1ZmJkNjhmYjRkMGNiNDNhMjhiNDhmY2NjOWRjID0gJCgnPGRpdiBpZD0iaHRtbF85MWQ5NWZiZDY4ZmI0ZDBjYjQzYTI4YjQ4ZmNjYzlkYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWRnZW1lcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGRmOWY3ZWZmNTA2NGI3YjlmNjc4NDMzMTU4NGI4ZmIuc2V0Q29udGVudChodG1sXzkxZDk1ZmJkNjhmYjRkMGNiNDNhMjhiNDhmY2NjOWRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ3NjdlMzRlNmY5MTRiZDViN2I0ZmZiMTcwMDk4ZDNkLmJpbmRQb3B1cChwb3B1cF84ZGY5ZjdlZmY1MDY0YjdiOWY2Nzg0MzMxNTg0YjhmYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZTAyMGY5MWMyMmI0YTA2OGI4NDkxZDkyZGMzMzM1ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4OTE0Mzk0MzcyOTcxLC03My43OTE5OTIzMzEzNjk0M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNmRkZmVlYWYyNGU0NGZlODBlMDkxYTliNzQ5OGM0MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ODUxNTllNmZhYWY0MTJiOTA5NWM4NDAzODkzNTA5NiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDg1MTU5ZTZmYWFmNDEyYjkwOTVjODQwMzg5MzUwOTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFydmVybmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzZkZGZlZWFmMjRlNDRmZTgwZTA5MWE5Yjc0OThjNDMuc2V0Q29udGVudChodG1sXzQ4NTE1OWU2ZmFhZjQxMmI5MDk1Yzg0MDM4OTM1MDk2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhlMDIwZjkxYzIyYjRhMDY4Yjg0OTFkOTJkYzMzMzVmLmJpbmRQb3B1cChwb3B1cF8zNmRkZmVlYWYyNGU0NGZlODBlMDkxYTliNzQ5OGM0Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NjA3MGJkMzRhOTc0ZmM1OGU3MjI0NDk0YTY0NjU3ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4MjgwMTY5Njg0NTU4NiwtNzMuODIyMzYxMjEwODg3NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzE1YTJiYTY3ZjNkNDRjMWI2NDVjMjY4MzU4YzkwMDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTIxOTM4ODZkY2UzNDA0ZmFkMDZiMTBlYWExN2EyNmQgPSAkKCc8ZGl2IGlkPSJodG1sXzUyMTkzODg2ZGNlMzQwNGZhZDA2YjEwZWFhMTdhMjZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb2NrYXdheSBCZWFjaCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MTVhMmJhNjdmM2Q0NGMxYjY0NWMyNjgzNThjOTAwNS5zZXRDb250ZW50KGh0bWxfNTIxOTM4ODZkY2UzNDA0ZmFkMDZiMTBlYWExN2EyNmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODYwNzBiZDM0YTk3NGZjNThlNzIyNDQ5NGE2NDY1N2YuYmluZFBvcHVwKHBvcHVwXzcxNWEyYmE2N2YzZDQ0YzFiNjQ1YzI2ODM1OGM5MDA1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y1ZWIzMmEyODEzNTQ5MGI5N2E3OTA5MzkwMWI4N2NlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTcyMDM2NzMwMjE3MDE1LC03My44NTc1NDY3MjQxMDgyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMTg1OTcxZTMwZGU0MzNkYWNlOTZlNTY4ODBjY2NlNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iM2VmZjUxN2VjYjc0M2FiOWRlMjE4MDMwYTUyOTVjZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjNlZmY1MTdlY2I3NDNhYjlkZTIxODAzMGE1Mjk1Y2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5lcG9uc2l0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzExODU5NzFlMzBkZTQzM2RhY2U5NmU1Njg4MGNjY2U1LnNldENvbnRlbnQoaHRtbF9iM2VmZjUxN2VjYjc0M2FiOWRlMjE4MDMwYTUyOTVjZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNWViMzJhMjgxMzU0OTBiOTdhNzkwOTM5MDFiODdjZS5iaW5kUG9wdXAocG9wdXBfMTE4NTk3MWUzMGRlNDMzZGFjZTk2ZTU2ODgwY2NjZTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWQ2ZjhkZjExMmU5NDg3ZTk0MWVkNDUwMjkzM2RjZDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQxMjYxMjI2MTQwNjYsLTczLjgxMjc2MjY5MTM1ODY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkxY2I3MjhiYTgwNTQ3NDJhMGZjM2I0YzRiNTk3NTU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU2ZGI4YjY3MWM1NjRmMTM4OTJiZWUxNDY3YWU3ZGFmID0gJCgnPGRpdiBpZD0iaHRtbF81NmRiOGI2NzFjNTY0ZjEzODkyYmVlMTQ2N2FlN2RhZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTFjYjcyOGJhODA1NDc0MmEwZmMzYjRjNGI1OTc1NTcuc2V0Q29udGVudChodG1sXzU2ZGI4YjY3MWM1NjRmMTM4OTJiZWUxNDY3YWU3ZGFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VkNmY4ZGYxMTJlOTQ4N2U5NDFlZDQ1MDI5MzNkY2QwLmJpbmRQb3B1cChwb3B1cF85MWNiNzI4YmE4MDU0NzQyYTBmYzNiNGM0YjU5NzU1Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMmVkNmFjZWM5ZmM0NzkyYWI1MDFmZjJlZTVhZDBiZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MTM3ODQyMTk0NTQzNCwtNzMuNzA4ODQ3MDU4ODkyNDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDQ5YjliZDk4MmE0NGYwYThlMjM1MGVkM2M0OGY0NWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWQ5ZjlkNTE5NmI2NDU3Y2IwZmI4ZDZlN2I5YWYxMDkgPSAkKCc8ZGl2IGlkPSJodG1sX2VkOWY5ZDUxOTZiNjQ1N2NiMGZiOGQ2ZTdiOWFmMTA5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbG9yYWwgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNDliOWJkOTgyYTQ0ZjBhOGUyMzUwZWQzYzQ4ZjQ1ZS5zZXRDb250ZW50KGh0bWxfZWQ5ZjlkNTE5NmI2NDU3Y2IwZmI4ZDZlN2I5YWYxMDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjJlZDZhY2VjOWZjNDc5MmFiNTAxZmYyZWU1YWQwYmQuYmluZFBvcHVwKHBvcHVwXzA0OWI5YmQ5ODJhNDRmMGE4ZTIzNTBlZDNjNDhmNDVlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVkM2U1NmYwMGYzOTQzNjM4MGE4YjQyYTE4ZTk5ODgyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIwOTU3MjA3NjQ0NCwtNzMuNzY3MTQxNjY3MTQ3MjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWYzYjM2N2JlZjFmNDExOTk5OTg3YjU3NWNkOTg0NWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjRkZTk0MTIxNmZkNGRiN2FhMGQwMzViMTdlNDQzMTQgPSAkKCc8ZGl2IGlkPSJodG1sX2Y0ZGU5NDEyMTZmZDRkYjdhYTBkMDM1YjE3ZTQ0MzE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib2xsaXN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFmM2IzNjdiZWYxZjQxMTk5OTk4N2I1NzVjZDk4NDVmLnNldENvbnRlbnQoaHRtbF9mNGRlOTQxMjE2ZmQ0ZGI3YWEwZDAzNWIxN2U0NDMxNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZDNlNTZmMDBmMzk0MzYzODBhOGI0MmExOGU5OTg4Mi5iaW5kUG9wdXAocG9wdXBfMWYzYjM2N2JlZjFmNDExOTk5OTg3YjU3NWNkOTg0NWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGMyMjMyMjU4NTRkNDU2MGJhNTE2MzQ5YWUzN2I5MGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTY4MDQ4MzAxNDYxMywtNzMuNzg3MjI2OTY5MzY2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMTc1ZWM1NzQ0NWI0M2EyYmViYWM4YWJmNWM1ZmFjZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wN2RhMzEzMjUyMGY0ZTZkYjVmM2M5MTk3YWIyMTZhNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDdkYTMxMzI1MjBmNGU2ZGI1ZjNjOTE5N2FiMjE2YTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkphbWFpY2EgRXN0YXRlcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMTc1ZWM1NzQ0NWI0M2EyYmViYWM4YWJmNWM1ZmFjZi5zZXRDb250ZW50KGh0bWxfMDdkYTMxMzI1MjBmNGU2ZGI1ZjNjOTE5N2FiMjE2YTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGMyMjMyMjU4NTRkNDU2MGJhNTE2MzQ5YWUzN2I5MGMuYmluZFBvcHVwKHBvcHVwX2QxNzVlYzU3NDQ1YjQzYTJiZWJhYzhhYmY1YzVmYWNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNlYTAzN2EwMTFjZTRlNTI4YjBhMDY0NTYxMGZiMDJkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ0NTcyMzA5Mjg2NywtNzMuODI1ODA5MTUxMTA1NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTJkYjU2NjE5YzMxNGY1Nzg3NWYwZTc2MDYzM2JjODQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzhiMDA1MTIwYmIwNDE4ZmE1ZDQ3YjJlMDM5MjJhN2YgPSAkKCc8ZGl2IGlkPSJodG1sXzc4YjAwNTEyMGJiMDQxOGZhNWQ0N2IyZTAzOTIyYTdmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5RdWVlbnNib3JvIEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTJkYjU2NjE5YzMxNGY1Nzg3NWYwZTc2MDYzM2JjODQuc2V0Q29udGVudChodG1sXzc4YjAwNTEyMGJiMDQxOGZhNWQ0N2IyZTAzOTIyYTdmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNlYTAzN2EwMTFjZTRlNTI4YjBhMDY0NTYxMGZiMDJkLmJpbmRQb3B1cChwb3B1cF85MmRiNTY2MTljMzE0ZjU3ODc1ZjBlNzYwNjMzYmM4NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNTQxNTRiMmM2ODg0ZjcyOTgxYWU5ODc1ZDczMWY0NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcyMzgyNDkwMTgyOTIwNCwtNzMuNzk3NjAzMDA5MTI2NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmFkMDhkODQ4YzU4NDQ1Zjk4NTljZDIyZDlmYzY3NzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWM3YzQxYzJhMDIzNDFlYzg4Y2VmYTQxYjQxYWEzM2EgPSAkKCc8ZGl2IGlkPSJodG1sX2VjN2M0MWMyYTAyMzQxZWM4OGNlZmE0MWI0MWFhMzNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWxsY3Jlc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmFkMDhkODQ4YzU4NDQ1Zjk4NTljZDIyZDlmYzY3Nzguc2V0Q29udGVudChodG1sX2VjN2M0MWMyYTAyMzQxZWM4OGNlZmE0MWI0MWFhMzNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I1NDE1NGIyYzY4ODRmNzI5ODFhZTk4NzVkNzMxZjQ0LmJpbmRQb3B1cChwb3B1cF9mYWQwOGQ4NDhjNTg0NDVmOTg1OWNkMjJkOWZjNjc3OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xYTcyZTFlMzgwMWU0Y2I0OWYxMTYzZDBkMTJmYjQ3OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MTcwNDUyNjA1NDE0NiwtNzMuOTMxNTc1MDYwNzI4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2QwYjRjNWI2OTllNDU5YzgyODQxMTllNmM0NmVhMzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODhjODNjYjgxOTlhNDc3NGE2YjlmMDlmYzllNGZhMWMgPSAkKCc8ZGl2IGlkPSJodG1sXzg4YzgzY2I4MTk5YTQ3NzRhNmI5ZjA5ZmM5ZTRmYTFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYXZlbnN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NkMGI0YzViNjk5ZTQ1OWM4Mjg0MTE5ZTZjNDZlYTMwLnNldENvbnRlbnQoaHRtbF84OGM4M2NiODE5OWE0Nzc0YTZiOWYwOWZjOWU0ZmExYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYTcyZTFlMzgwMWU0Y2I0OWYxMTYzZDBkMTJmYjQ3OS5iaW5kUG9wdXAocG9wdXBfY2QwYjRjNWI2OTllNDU5YzgyODQxMTllNmM0NmVhMzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODU3MWJiZTEwNzk4NGYxY2JkN2IzMDRiZjZhYTFhY2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NjM5MTg0MTkyNTEzOSwtNzMuODQ5NjM3ODI0MDI0NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2U5MjYzMTg3YzNjNDI0OTgxZTZkYmU5YWExZmMxNzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTAwZTEzMjY5YjY1NDU0MGJlN2ViMTUyYzU4NGYxYWEgPSAkKCc8ZGl2IGlkPSJodG1sXzkwMGUxMzI2OWI2NTQ1NDBiZTdlYjE1MmM1ODRmMWFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaW5kZW53b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNlOTI2MzE4N2MzYzQyNDk4MWU2ZGJlOWFhMWZjMTc2LnNldENvbnRlbnQoaHRtbF85MDBlMTMyNjliNjU0NTQwYmU3ZWIxNTJjNTg0ZjFhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NTcxYmJlMTA3OTg0ZjFjYmQ3YjMwNGJmNmFhMWFjYS5iaW5kUG9wdXAocG9wdXBfM2U5MjYzMTg3YzNjNDI0OTgxZTZkYmU5YWExZmMxNzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmI2M2YwZjE4NDM2NGU3ODliNTVmM2IyZWRlNjhhNWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njc4ODM4OTY2MDI0NywtNzMuNzQwMjU2MDc5ODk4MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzYzZjkxNDcwNWMwNDdiMDhiYzAzN2VjNTYyYjRmNzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmU0NjQwOTA1YjJiNDg4OThiNTg4MzA4YjZjZGVmNDggPSAkKCc8ZGl2IGlkPSJodG1sXzJlNDY0MDkwNWIyYjQ4ODk4YjU4ODMwOGI2Y2RlZjQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXVyZWx0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzYzZjkxNDcwNWMwNDdiMDhiYzAzN2VjNTYyYjRmNzQuc2V0Q29udGVudChodG1sXzJlNDY0MDkwNWIyYjQ4ODk4YjU4ODMwOGI2Y2RlZjQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJiNjNmMGYxODQzNjRlNzg5YjU1ZjNiMmVkZTY4YTVmLmJpbmRQb3B1cChwb3B1cF83NjNmOTE0NzA1YzA0N2IwOGJjMDM3ZWM1NjJiNGY3NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNjdjN2VhNjI3MWU0N2Q2YmZhY2QwZjE3OGIyNmFjMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNjA3NDU3MDgzMDc5NSwtNzMuODYyNTI0NzE0MTM3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMmQwMTBmMGRjMGU0Y2Q0YTNjYjhiZjE2M2YzYzQ0NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMzUzMDMyMzQwYmQ0Y2NkYjZkYzEyOWQ4NjI0ZTNmNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjM1MzAzMjM0MGJkNGNjZGI2ZGMxMjlkODYyNGUzZjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlZnJhayBDaXR5LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IyZDAxMGYwZGMwZTRjZDRhM2NiOGJmMTYzZjNjNDQ2LnNldENvbnRlbnQoaHRtbF9mMzUzMDMyMzQwYmQ0Y2NkYjZkYzEyOWQ4NjI0ZTNmNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNjdjN2VhNjI3MWU0N2Q2YmZhY2QwZjE3OGIyNmFjMi5iaW5kUG9wdXAocG9wdXBfYjJkMDEwZjBkYzBlNGNkNGEzY2I4YmYxNjNmM2M0NDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTQyNzA4MjYxOWM5NGQ3OWI2MjNmMDNhODg1MmRjOGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYxNTU1NjU0MzEwOSwtNzMuODU0MDE3NTAzOTI1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMTJkNTc3MWEzYTA0NTZmYWViNzBiZTEwZWY2ZTc2YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMmEzYWUxMTdhZWY0MjIwYjhjN2U1MTBkZjIyMDA4MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMjJhM2FlMTE3YWVmNDIyMGI4YzdlNTEwZGYyMjAwODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbGxlIEhhcmJvciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMTJkNTc3MWEzYTA0NTZmYWViNzBiZTEwZWY2ZTc2Yi5zZXRDb250ZW50KGh0bWxfMjJhM2FlMTE3YWVmNDIyMGI4YzdlNTEwZGYyMjAwODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTQyNzA4MjYxOWM5NGQ3OWI2MjNmMDNhODg1MmRjOGYuYmluZFBvcHVwKHBvcHVwXzMxMmQ1NzcxYTNhMDQ1NmZhZWI3MGJlMTBlZjZlNzZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkNjk5N2QxYmI3MDRmNWJhYTIwMmQ1ZmMzYWIzYWQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTgwMzQyOTU2NDYxMzEsLTczLjg0MTUzMzcwMjI2MTg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y4NDQ5MDBlNWNlNzRlM2VhOTRlZjY4Y2IyMDBiNjRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA1YzdhNWVhOWNiZjRlODliYmQ4MTcyZWY0M2UxMGViID0gJCgnPGRpdiBpZD0iaHRtbF8wNWM3YTVlYTljYmY0ZTg5YmJkODE3MmVmNDNlMTBlYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9ja2F3YXkgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mODQ0OTAwZTVjZTc0ZTNlYTk0ZWY2OGNiMjAwYjY0Zi5zZXRDb250ZW50KGh0bWxfMDVjN2E1ZWE5Y2JmNGU4OWJiZDgxNzJlZjQzZTEwZWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2Q2OTk3ZDFiYjcwNGY1YmFhMjAyZDVmYzNhYjNhZDQuYmluZFBvcHVwKHBvcHVwX2Y4NDQ5MDBlNWNlNzRlM2VhOTRlZjY4Y2IyMDBiNjRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ3NzQ3NWU0MzVhZTQ0OTRiY2VmMzIyZGQxNzYyMmRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3NzEwNjE1NjU3NjgsLTczLjc5NjY0NzUwODQ0MDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3NjY1ZTlmODlmNzQ0ZmQ5N2ZiZWM2YmY3NmYxYTFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmYWI0ZWQ3NWM3YzQzNTk5MDQyNjhlNzc3YmQ1ZjdkID0gJCgnPGRpdiBpZD0iaHRtbF85ZmFiNGVkNzVjN2M0MzU5OTA0MjY4ZTc3N2JkNWY3ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29tZXJ2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNzY2NWU5Zjg5Zjc0NGZkOTdmYmVjNmJmNzZmMWExYS5zZXRDb250ZW50KGh0bWxfOWZhYjRlZDc1YzdjNDM1OTkwNDI2OGU3NzdiZDVmN2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDc3NDc1ZTQzNWFlNDQ5NGJjZWYzMjJkZDE3NjIyZGEuYmluZFBvcHVwKHBvcHVwX2Q3NjY1ZTlmODlmNzQ0ZmQ5N2ZiZWM2YmY3NmYxYTFhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcyYjg3YzUzYjNmNTQ5MWNhMDM5OTZjMDA5ZDM0YzIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwMDAzMjI3MzM2MTMsLTczLjc1MTc1MzEwNzMxMTUzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RmZGRhYjExNjZjNDQ3YjBhZDdmNDU5YTdkZjE2OGZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdjYWQ1NmZiMjc3MDQzYTA4YjMwNjBkMzhhYWY5YWE4ID0gJCgnPGRpdiBpZD0iaHRtbF83Y2FkNTZmYjI3NzA0M2EwOGIzMDYwZDM4YWFmOWFhOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvb2t2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZmRkYWIxMTY2YzQ0N2IwYWQ3ZjQ1OWE3ZGYxNjhmZS5zZXRDb250ZW50KGh0bWxfN2NhZDU2ZmIyNzcwNDNhMDhiMzA2MGQzOGFhZjlhYTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzJiODdjNTNiM2Y1NDkxY2EwMzk5NmMwMDlkMzRjMjEuYmluZFBvcHVwKHBvcHVwX2RmZGRhYjExNjZjNDQ3YjBhZDdmNDU5YTdkZjE2OGZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZmMWNlOTgxNWFhZjRjNWZhNjJmNGEwZDMwMTA1MDY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMzMDE0MDQwMjc4MzQsLTczLjczODg5MTk4OTEyNDgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IzYTQ2Zjc4YThlZjRiYzA5ZWM4YzcwZTlhMjI1M2U5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUwN2IzYTRiZjcxOTQ1M2RhMTZjZDcyZTM3ZWVjNDQ4ID0gJCgnPGRpdiBpZD0iaHRtbF81MDdiM2E0YmY3MTk0NTNkYTE2Y2Q3MmUzN2VlYzQ0OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGFpcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjNhNDZmNzhhOGVmNGJjMDllYzhjNzBlOWEyMjUzZTkuc2V0Q29udGVudChodG1sXzUwN2IzYTRiZjcxOTQ1M2RhMTZjZDcyZTM3ZWVjNDQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZmMWNlOTgxNWFhZjRjNWZhNjJmNGEwZDMwMTA1MDY0LmJpbmRQb3B1cChwb3B1cF9iM2E0NmY3OGE4ZWY0YmMwOWVjOGM3MGU5YTIyNTNlOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYzI5NzYxMWJhNzU0YTdhOTA1ZmMwYzRlNjYwYTZkZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDA3MDk5OTA0ODksLTczLjg1NzUxNzkwNjc2NDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5ZTc4NmM2ZmQ0MDQ5OTlhMzc4NDIzMzVmY2Q5NWFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMxOWFmMzgyOTBhYjRlYWQ4MjRiMDMwY2IxYTkwNmVhID0gJCgnPGRpdiBpZD0iaHRtbF8zMTlhZjM4MjkwYWI0ZWFkODI0YjAzMGNiMWE5MDZlYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggQ29yb25hLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5ZTc4NmM2ZmQ0MDQ5OTlhMzc4NDIzMzVmY2Q5NWFiLnNldENvbnRlbnQoaHRtbF8zMTlhZjM4MjkwYWI0ZWFkODI0YjAzMGNiMWE5MDZlYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYzI5NzYxMWJhNzU0YTdhOTA1ZmMwYzRlNjYwYTZkZi5iaW5kUG9wdXAocG9wdXBfYTllNzg2YzZmZDQwNDk5OWEzNzg0MjMzNWZjZDk1YWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGIzZTM5NTRkYTU0NGE2MDg3MzJhYmU1ZjQ3MzczODcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTQ2MTEwODE1MTE3LC03My44NDEwMjIxMTIzNDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y3YmQzNGY5NjQzZTQ0ODg5MjUzOTljODlhMmE3NDEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RmMmYyNDQzYjdkOTQ1YzM5NzE4MzU1M2VkN2YxMWViID0gJCgnPGRpdiBpZD0iaHRtbF9kZjJmMjQ0M2I3ZDk0NWMzOTcxODM1NTNlZDdmMTFlYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzIEdhcmRlbnMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjdiZDM0Zjk2NDNlNDQ4ODkyNTM5OWM4OWEyYTc0MTAuc2V0Q29udGVudChodG1sX2RmMmYyNDQzYjdkOTQ1YzM5NzE4MzU1M2VkN2YxMWViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRiM2UzOTU0ZGE1NDRhNjA4NzMyYWJlNWY0NzM3Mzg3LmJpbmRQb3B1cChwb3B1cF9mN2JkMzRmOTY0M2U0NDg4OTI1Mzk5Yzg5YTJhNzQxMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MGZiZWI2NWVkYzY0MWY5OTRjMmZiMjgyNmJiOTcwZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NDk4MTU3MTAwNDQsLTc0LjA3OTM1MzEyNTEyNzk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M2NGNkN2NhMjc4ZTRlZTk4ZWY1NzI0YjQ0OTQ0NzcyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJhY2NkN2Y4N2U1ZTRlYzdiOGFmMDRhODZiMDhhMWYxID0gJCgnPGRpdiBpZD0iaHRtbF8yYWNjZDdmODdlNWU0ZWM3YjhhZjA0YTg2YjA4YTFmMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEdlb3JnZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzY0Y2Q3Y2EyNzhlNGVlOThlZjU3MjRiNDQ5NDQ3NzIuc2V0Q29udGVudChodG1sXzJhY2NkN2Y4N2U1ZTRlYzdiOGFmMDRhODZiMDhhMWYxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQwZmJlYjY1ZWRjNjQxZjk5NGMyZmIyODI2YmI5NzBkLmJpbmRQb3B1cChwb3B1cF9jNjRjZDdjYTI3OGU0ZWU5OGVmNTcyNGI0NDk0NDc3Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MmQ2NzIyZTcwNWE0MmIxOGZiYTk0ZWQ2ZDIyZDFkZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MDYxNDU1OTEzNTExLC03NC4wODcwMTY1MDUxNjYyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YjAyYjAxNTJkMjI0NDZjYmQ2NTgxMjAwNmFkYTJiYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zOGVmMTM4NTk5ZDU0MGM1OWNiMTIxZDA2YzU5ZGMzMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzhlZjEzODU5OWQ1NDBjNTljYjEyMWQwNmM1OWRjMzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBCcmlnaHRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWIwMmIwMTUyZDIyNDQ2Y2JkNjU4MTIwMDZhZGEyYmIuc2V0Q29udGVudChodG1sXzM4ZWYxMzg1OTlkNTQwYzU5Y2IxMjFkMDZjNTlkYzMxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQyZDY3MjJlNzA1YTQyYjE4ZmJhOTRlZDZkMjJkMWRlLmJpbmRQb3B1cChwb3B1cF81YjAyYjAxNTJkMjI0NDZjYmQ2NTgxMjAwNmFkYTJiYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNTZhNjEwMGJlZDU0N2FkYjU3N2ZmYjNhMDNkZDIzOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyNjkyNzYyNTM4MTc2LC03NC4wNzc5MDE5MjY2MDA2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xY2UzZTk4MTBiZTI0YWI0OWIyZWRhNjg4NTFmZDEzYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNGYyYzNmZDI1YTA0NmVhOTlkMTQ4YmFjNTZkZmU3YyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTRmMmMzZmQyNWEwNDZlYTk5ZDE0OGJhYzU2ZGZlN2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0YXBsZXRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWNlM2U5ODEwYmUyNGFiNDliMmVkYTY4ODUxZmQxM2Iuc2V0Q29udGVudChodG1sX2U0ZjJjM2ZkMjVhMDQ2ZWE5OWQxNDhiYWM1NmRmZTdjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U1NmE2MTAwYmVkNTQ3YWRiNTc3ZmZiM2EwM2RkMjM4LmJpbmRQb3B1cChwb3B1cF8xY2UzZTk4MTBiZTI0YWI0OWIyZWRhNjg4NTFmZDEzYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MGNkMGYzZmNjYWM0MmY3YjNiMDEyOGUxZGJmZjYxMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTMwNDk0NjUyNzYxLC03NC4wNjk4MDUyNjcxNjE0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZTIwOTIxMTk1ZWQ0NDRlYjM5ZTgwYzU0MDNlNGZlMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84OWViYTgxM2ExZTM0NjQ4ODQ3MDU4NzVkYWVmNDc3NyA9ICQoJzxkaXYgaWQ9Imh0bWxfODllYmE4MTNhMWUzNDY0ODg0NzA1ODc1ZGFlZjQ3NzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2ViYW5rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZTIwOTIxMTk1ZWQ0NDRlYjM5ZTgwYzU0MDNlNGZlMS5zZXRDb250ZW50KGh0bWxfODllYmE4MTNhMWUzNDY0ODg0NzA1ODc1ZGFlZjQ3NzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODBjZDBmM2ZjY2FjNDJmN2IzYjAxMjhlMWRiZmY2MTMuYmluZFBvcHVwKHBvcHVwXzVlMjA5MjExOTVlZDQ0NGViMzllODBjNTQwM2U0ZmUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyNmJjNjVkMmFlOTQ2MGU4ZGExMTRkYzlhNWZjM2RkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMxODc4OTI2NTQ2MDcsLTc0LjEwNzE4MTc4MjY1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmQ3ZTY4ZWNlNjAwNGQ5YmE5OTY5NDIwNWYyYzBjZTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTA1MDBmNTY5YTIyNDFmN2FkZGM5MDRhZWQ2M2MwM2MgPSAkKCc8ZGl2IGlkPSJodG1sXzUwNTAwZjU2OWEyMjQxZjdhZGRjOTA0YWVkNjNjMDNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IEJyaWdodG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZDdlNjhlY2U2MDA0ZDliYTk5Njk0MjA1ZjJjMGNlOC5zZXRDb250ZW50KGh0bWxfNTA1MDBmNTY5YTIyNDFmN2FkZGM5MDRhZWQ2M2MwM2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTI2YmM2NWQyYWU5NDYwZThkYTExNGRjOWE1ZmMzZGQuYmluZFBvcHVwKHBvcHVwXzZkN2U2OGVjZTYwMDRkOWJhOTk2OTQyMDVmMmMwY2U4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E1NmI3MzkwYjA3OTQ1MmM5ZTM5ZDdkOWM5MTQ0Y2IxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjI0MTg0NzkxMzEzMDA2LC03NC4wODcyNDgxOTk4MzcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MmZkZDRmMjJkYmM0ZDlmYjZkMzU2NGY1NzNiOTQ1YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YzQzNWQ0YzcwOTM0M2Q3YjYwZWU1Y2VmODViYzZiYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGM0MzVkNGM3MDkzNDNkN2I2MGVlNWNlZjg1YmM2YmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyeW1lcyBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MmZkZDRmMjJkYmM0ZDlmYjZkMzU2NGY1NzNiOTQ1YS5zZXRDb250ZW50KGh0bWxfNGM0MzVkNGM3MDkzNDNkN2I2MGVlNWNlZjg1YmM2YmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTU2YjczOTBiMDc5NDUyYzllMzlkN2Q5YzkxNDRjYjEuYmluZFBvcHVwKHBvcHVwXzQyZmRkNGYyMmRiYzRkOWZiNmQzNTY0ZjU3M2I5NDVhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVmMWYyYjA5MWJkZTQxZDhhMDk3NjAxYmVjN2Y5M2I3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3MDY4NTE4MTQ2NzMsLTc0LjExMTMyODgxODAwODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGE2ZGNjYTYwNTAwNDNkMTkxODM2NjFlNmRmMmFmMTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmQzMWIxZDFkZWUzNGYwOGFkOTcwYTkwYmU3ZjYxMTMgPSAkKCc8ZGl2IGlkPSJodG1sXzJkMzFiMWQxZGVlMzRmMDhhZDk3MGE5MGJlN2Y2MTEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ub2R0IEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBhNmRjY2E2MDUwMDQzZDE5MTgzNjYxZTZkZjJhZjEwLnNldENvbnRlbnQoaHRtbF8yZDMxYjFkMWRlZTM0ZjA4YWQ5NzBhOTBiZTdmNjExMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZjFmMmIwOTFiZGU0MWQ4YTA5NzYwMWJlYzdmOTNiNy5iaW5kUG9wdXAocG9wdXBfMGE2ZGNjYTYwNTAwNDNkMTkxODM2NjFlNmRmMmFmMTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGE2NjgxYTkzYjA4NGRlMmFlOWJiZTNiOTMyMmU3ZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODAyNDc0MTM1MDk1NiwtNzQuMDc5NTUyOTI1Mzk4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MjMzNjI0Nzc2OTc0NjNkYjZhNjE4OTIxZGJlZjI1ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMjQ5MDg4NmZmYTA0MjY2ODg3MTkyNWJmNDU0YjBjYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDI0OTA4ODZmZmEwNDI2Njg4NzE5MjViZjQ1NGIwY2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvdXRoIEJlYWNoLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MjMzNjI0Nzc2OTc0NjNkYjZhNjE4OTIxZGJlZjI1ZC5zZXRDb250ZW50KGh0bWxfMDI0OTA4ODZmZmEwNDI2Njg4NzE5MjViZjQ1NGIwY2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGE2NjgxYTkzYjA4NGRlMmFlOWJiZTNiOTMyMmU3ZmYuYmluZFBvcHVwKHBvcHVwXzUyMzM2MjQ3NzY5NzQ2M2RiNmE2MTg5MjFkYmVmMjVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg0MjU2NzkxYjkyOTQ3NzE4ZDA2NjhlMzM5NGIyNzI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMzNjY5MzA1NTQzNjUsLTc0LjEyOTQzNDI2Nzk3MDA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ0NzFjNjRiYjIwYjQyMTVhZTVlYTcwYjAwM2MyODYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJiZDMyNzIyNDFiNzQzOGVhMTkwMzI3YThkMGE1Y2U0ID0gJCgnPGRpdiBpZD0iaHRtbF8yYmQzMjcyMjQxYjc0MzhlYTE5MDMyN2E4ZDBhNWNlNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBSaWNobW9uZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDQ3MWM2NGJiMjBiNDIxNWFlNWVhNzBiMDAzYzI4NjIuc2V0Q29udGVudChodG1sXzJiZDMyNzIyNDFiNzQzOGVhMTkwMzI3YThkMGE1Y2U0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg0MjU2NzkxYjkyOTQ3NzE4ZDA2NjhlMzM5NGIyNzI5LmJpbmRQb3B1cChwb3B1cF80NDcxYzY0YmIyMGI0MjE1YWU1ZWE3MGIwMDNjMjg2Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOTE1NzIwMWQ1YzI0YmNkYWQ4ZTIxMDFlMjU5YTViMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMjU0NjM5MDQ4MTEyNCwtNzQuMTUwMDg1MzcwNDY5ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODU1ZDFjNzkwODU4NDI4YThkZjg3ZjlmODJjODdhZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWIxMTgxNTA2ZjAyNGRmNTg4ZDJkZDEzN2RiZDIxMTIgPSAkKCc8ZGl2IGlkPSJodG1sXzFiMTE4MTUwNmYwMjRkZjU4OGQyZGQxMzdkYmQyMTEyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJpbmVyJiMzOTtzIEhhcmJvciwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODU1ZDFjNzkwODU4NDI4YThkZjg3ZjlmODJjODdhZWEuc2V0Q29udGVudChodG1sXzFiMTE4MTUwNmYwMjRkZjU4OGQyZGQxMzdkYmQyMTEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y5MTU3MjAxZDVjMjRiY2RhZDhlMjEwMWUyNTlhNWIwLmJpbmRQb3B1cChwb3B1cF84NTVkMWM3OTA4NTg0MjhhOGRmODdmOWY4MmM4N2FlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OTVlYzBmZDBhZDU0NDg5YmFiYzE0MWQxZTlmNTZlNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzOTY4Mjk3ODQ1NTQyLC03NC4xNzQ2NDUzMjk5MzU0Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MTcyMmViNWIzNjI0MzdlYTZjZWU3MmNhZDE5NGE3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMTY0NGE0OWRmOTY0NTAyOGZjMWE3NjM0NTQ2NmYyZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzE2NDRhNDlkZjk2NDUwMjhmYzFhNzYzNDU0NjZmMmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvcnQgSXZvcnksIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkxNzIyZWI1YjM2MjQzN2VhNmNlZTcyY2FkMTk0YTdlLnNldENvbnRlbnQoaHRtbF8zMTY0NGE0OWRmOTY0NTAyOGZjMWE3NjM0NTQ2NmYyZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OTVlYzBmZDBhZDU0NDg5YmFiYzE0MWQxZTlmNTZlNS5iaW5kUG9wdXAocG9wdXBfOTE3MjJlYjViMzYyNDM3ZWE2Y2VlNzJjYWQxOTRhN2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjhjY2EyNmU2ZGU5NGU2NGI3ZjU1N2I2ZTYwYzdmYmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMzMzU5Mzc2Njc0MiwtNzQuMTE5MTgwNTg1MzQ4NDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjI4NjBhMTJlMzBlNDljMDgwN2Y0OTUyMTU5MTAzMmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjQ0ZWFiZWU5ZTdiNGI4OGJiZTczODUwMzA1MjVjMDAgPSAkKCc8ZGl2IGlkPSJodG1sX2Y0NGVhYmVlOWU3YjRiODhiYmU3Mzg1MDMwNTI1YzAwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGV0b24gQ29ybmVycywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjI4NjBhMTJlMzBlNDljMDgwN2Y0OTUyMTU5MTAzMmYuc2V0Q29udGVudChodG1sX2Y0NGVhYmVlOWU3YjRiODhiYmU3Mzg1MDMwNTI1YzAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI4Y2NhMjZlNmRlOTRlNjRiN2Y1NTdiNmU2MGM3ZmJjLmJpbmRQb3B1cChwb3B1cF9iMjg2MGExMmUzMGU0OWMwODA3ZjQ5NTIxNTkxMDMyZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNWIyZDEwZWZmZjQ0Y2VlYWZmY2ZhZjU2MjY4ZmNlMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NDI1MjM3OTE2MTY5NSwtNzQuMTY0OTYwMzEzMjk4MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjYyZjcxMDBhY2MxNDc3ZGEwOGFhZGYxYTU4MjJiOTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTMzYTA3MDE0MzA1NDMxMWE4NGI4OTE3MzFmMjE1ZDggPSAkKCc8ZGl2IGlkPSJodG1sX2EzM2EwNzAxNDMwNTQzMTFhODRiODkxNzMxZjIxNWQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgU3ByaW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2MmY3MTAwYWNjMTQ3N2RhMDhhYWRmMWE1ODIyYjkxLnNldENvbnRlbnQoaHRtbF9hMzNhMDcwMTQzMDU0MzExYTg0Yjg5MTczMWYyMTVkOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNWIyZDEwZWZmZjQ0Y2VlYWZmY2ZhZjU2MjY4ZmNlMi5iaW5kUG9wdXAocG9wdXBfNjYyZjcxMDBhY2MxNDc3ZGEwOGFhZGYxYTU4MjJiOTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTExYTJlMzlkM2JkNDZhY2E5MDUxYjRmMTc2NTVlMTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODYzMTM3NTEwMzI4MSwtNzQuMTkwNzM3MTc1MzgxMTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGU3NmQ4NDA1Y2U0NDIyNGFmYjU5YzMxOWYzMWNhNTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODI3Yjk2NTA5MmRhNDRiY2FjMmE1M2UxNWMwYjQzMmIgPSAkKCc8ZGl2IGlkPSJodG1sXzgyN2I5NjUwOTJkYTQ0YmNhYzJhNTNlMTVjMGI0MzJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UcmF2aXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RlNzZkODQwNWNlNDQyMjRhZmI1OWMzMTlmMzFjYTU5LnNldENvbnRlbnQoaHRtbF84MjdiOTY1MDkyZGE0NGJjYWMyYTUzZTE1YzBiNDMyYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MTFhMmUzOWQzYmQ0NmFjYTkwNTFiNGYxNzY1NWUxOS5iaW5kUG9wdXAocG9wdXBfZGU3NmQ4NDA1Y2U0NDIyNGFmYjU5YzMxOWYzMWNhNTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2Q1ZWEyODc0NDRkNGQyMGIyM2JiY2IwMmI5Mzc3ZTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzI1NzIzMTgyMDYzMiwtNzQuMTE2NDc5NDM2MDYzOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YjRiOWNjZTk3MzM0OWE3ODUxNDgwODUyN2ZkNjUzNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMmNhZDI2MTU5YjQ0ZjA0YjU0YTcyMDdiNDBhY2NjMCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTJjYWQyNjE1OWI0NGYwNGI1NGE3MjA3YjQwYWNjYzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBEb3JwLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YjRiOWNjZTk3MzM0OWE3ODUxNDgwODUyN2ZkNjUzNS5zZXRDb250ZW50KGh0bWxfYTJjYWQyNjE1OWI0NGYwNGI1NGE3MjA3YjQwYWNjYzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2Q1ZWEyODc0NDRkNGQyMGIyM2JiY2IwMmI5Mzc3ZTQuYmluZFBvcHVwKHBvcHVwXzhiNGI5Y2NlOTczMzQ5YTc4NTE0ODA4NTI3ZmQ2NTM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk2MWM2ZWVkYzc5ODQ2MDdhODliYmNhZDQ0MGVmMzhkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU4NDYyMjQzMjg4OCwtNzQuMTIxNTY1OTM3NzE4OTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTVlODBhM2E1Y2Y3NDU4YmI3MmViMmYyMTk3MmEwMDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Y3NDAwNzE1NDE1NGQ3OTlhOTFlNWYyZTAxNTc0MzUgPSAkKCc8ZGl2IGlkPSJodG1sX2NmNzQwMDcxNTQxNTRkNzk5YTkxZTVmMmUwMTU3NDM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PYWt3b29kLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NWU4MGEzYTVjZjc0NThiYjcyZWIyZjIxOTcyYTAwMC5zZXRDb250ZW50KGh0bWxfY2Y3NDAwNzE1NDE1NGQ3OTlhOTFlNWYyZTAxNTc0MzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTYxYzZlZWRjNzk4NDYwN2E4OWJiY2FkNDQwZWYzOGQuYmluZFBvcHVwKHBvcHVwXzU1ZTgwYTNhNWNmNzQ1OGJiNzJlYjJmMjE5NzJhMDAwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc2NzhkMGYyYzM0NzQ3YWVhOWMyNTZmNTQzYWFjYmE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDgwMjI4NzEzNjA1LC03NC4xNDkzMjM4MTQ5MDk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lOWRkMWVkN2RhNjY0NmRmODRiMDU4OTMyYTg3YTg0ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMGEyNGJlNDRiMGE0MTQ1YjRlMzNlYzYyY2UxYmM2MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjBhMjRiZTQ0YjBhNDE0NWI0ZTMzZWM2MmNlMWJjNjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyZWF0IEtpbGxzLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lOWRkMWVkN2RhNjY0NmRmODRiMDU4OTMyYTg3YTg0ZS5zZXRDb250ZW50KGh0bWxfZjBhMjRiZTQ0YjBhNDE0NWI0ZTMzZWM2MmNlMWJjNjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzY3OGQwZjJjMzQ3NDdhZWE5YzI1NmY1NDNhYWNiYTQuYmluZFBvcHVwKHBvcHVwX2U5ZGQxZWQ3ZGE2NjQ2ZGY4NGIwNTg5MzJhODdhODRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU5ZGQzNTQ4NGYyYTQzZTk5ZGVhZDhjMDFlMjUzNWMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQyMjMwNzQ3NDUwNzQ1LC03NC4xNjQzMzA4MDQxOTM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZmODg3YzZjYWQ4NDRmMzU4ZmEwZWFhNTYxYjYzMDc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc1ZTA3ZmYwOWY0YjRmOWM4NTRiZDJjMDgyNDQyZDgwID0gJCgnPGRpdiBpZD0iaHRtbF83NWUwN2ZmMDlmNGI0ZjljODU0YmQyYzA4MjQ0MmQ4MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWx0aW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZmODg3YzZjYWQ4NDRmMzU4ZmEwZWFhNTYxYjYzMDc5LnNldENvbnRlbnQoaHRtbF83NWUwN2ZmMDlmNGI0ZjljODU0YmQyYzA4MjQ0MmQ4MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81OWRkMzU0ODRmMmE0M2U5OWRlYWQ4YzAxZTI1MzVjMy5iaW5kUG9wdXAocG9wdXBfZmY4ODdjNmNhZDg0NGYzNThmYTBlYWE1NjFiNjMwNzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGRiZDFlMmE5ODIxNDU1N2FiYWM2OTI4YzY1MDc4YzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzgxMTQxNzQ3NDUwNywtNzQuMTc4NTQ4NjYxNjU4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzYwODFlYmNlNDY1NDk3ZWEzMmNlZDkwMjJlMzgxODYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmIxMDNlNjEwNGNlNDFlZmE2MTk1MjJmM2UzMDZmMjQgPSAkKCc8ZGl2IGlkPSJodG1sX2JiMTAzZTYxMDRjZTQxZWZhNjE5NTIyZjNlMzA2ZjI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Bbm5hZGFsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzYwODFlYmNlNDY1NDk3ZWEzMmNlZDkwMjJlMzgxODYuc2V0Q29udGVudChodG1sX2JiMTAzZTYxMDRjZTQxZWZhNjE5NTIyZjNlMzA2ZjI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBkYmQxZTJhOTgyMTQ1NTdhYmFjNjkyOGM2NTA3OGMwLmJpbmRQb3B1cChwb3B1cF83NjA4MWViY2U0NjU0OTdlYTMyY2VkOTAyMmUzODE4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZmE4MmQ1N2JkM2Y0OWM5ODkyNmMyZmI1ODVlZDY3ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU0MTk2NzYyMjg4ODc1NSwtNzQuMjA1MjQ1ODI0ODAzMjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDc4YmQ5MGI3ZDI1NDVkZGEzMjI3NDdhOTQ4YzBhN2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGMzODE1YWM1ZDBmNGQ3ZTkyYTdlOWUzNjA4ZjQ3YjYgPSAkKCc8ZGl2IGlkPSJodG1sX2RjMzgxNWFjNWQwZjRkN2U5MmE3ZTllMzYwOGY0N2I2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kcm93LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNzhiZDkwYjdkMjU0NWRkYTMyMjc0N2E5NDhjMGE3Zi5zZXRDb250ZW50KGh0bWxfZGMzODE1YWM1ZDBmNGQ3ZTkyYTdlOWUzNjA4ZjQ3YjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWZhODJkNTdiZDNmNDljOTg5MjZjMmZiNTg1ZWQ2N2QuYmluZFBvcHVwKHBvcHVwX2Q3OGJkOTBiN2QyNTQ1ZGRhMzIyNzQ3YTk0OGMwYTdmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlkZTYyMmFjYmIxMTQ4MzA5YjJjMjQzZTM0ZWI4MWY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTA1MzMzNzYxMTU2NDIsLTc0LjI0NjU2OTM0MjM1MjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZiYTk5YTMyMmI3NDRhNjE4ZTJjZjBhNjE1YTc1MTlkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E0NDYwMjExOTAxODQ0MTZhNTc2NDY4MWMzNGI5ZDczID0gJCgnPGRpdiBpZD0iaHRtbF9hNDQ2MDIxMTkwMTg0NDE2YTU3NjQ2ODFjMzRiOWQ3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG90dGVudmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZiYTk5YTMyMmI3NDRhNjE4ZTJjZjBhNjE1YTc1MTlkLnNldENvbnRlbnQoaHRtbF9hNDQ2MDIxMTkwMTg0NDE2YTU3NjQ2ODFjMzRiOWQ3Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZGU2MjJhY2JiMTE0ODMwOWIyYzI0M2UzNGViODFmNy5iaW5kUG9wdXAocG9wdXBfNmJhOTlhMzIyYjc0NGE2MThlMmNmMGE2MTVhNzUxOWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzYyYTY4MTY2M2EzNDkwOWFkMmJhZGRjNDc3NmIyNjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzczMTYwNjcxMTAzMjYsLTc0LjA4MDU1MzUxNzkwMTE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNmMDFiYTc2NGMzNTQyMTBiOWU2OTI3YWJjNzRjOGEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAwOWQ3YzEzZTc3NzQxOWU5ZTY5ZTkwNzJlNGI0NGM2ID0gJCgnPGRpdiBpZD0iaHRtbF8wMDlkN2MxM2U3Nzc0MTllOWU2OWU5MDcyZTRiNDRjNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG9tcGtpbnN2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2YwMWJhNzY0YzM1NDIxMGI5ZTY5MjdhYmM3NGM4YTMuc2V0Q29udGVudChodG1sXzAwOWQ3YzEzZTc3NzQxOWU5ZTY5ZTkwNzJlNGI0NGM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M2MmE2ODE2NjNhMzQ5MDlhZDJiYWRkYzQ3NzZiMjYxLmJpbmRQb3B1cChwb3B1cF8zZjAxYmE3NjRjMzU0MjEwYjllNjkyN2FiYzc0YzhhMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zN2YxYWE4MWQzMTQ0OTdiODZmNGIyNTA2ZGVmODRhMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTE5MzEwNzkyNjc2LC03NC4wOTYyOTAyOTIzNTQ1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NzcwMmE2MjJkMjI0Njk4YjkxOTVjMjAyY2M3OGU0ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOGU2MDlmZDAyNTg0OTg0ODMzNDg1MDY1ZDMzYmRlOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYThlNjA5ZmQwMjU4NDk4NDgzMzQ4NTA2NWQzM2JkZTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbHZlciBMYWtlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NzcwMmE2MjJkMjI0Njk4YjkxOTVjMjAyY2M3OGU0Zi5zZXRDb250ZW50KGh0bWxfYThlNjA5ZmQwMjU4NDk4NDgzMzQ4NTA2NWQzM2JkZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzdmMWFhODFkMzE0NDk3Yjg2ZjRiMjUwNmRlZjg0YTIuYmluZFBvcHVwKHBvcHVwXzU3NzAyYTYyMmQyMjQ2OThiOTE5NWMyMDJjYzc4ZTRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5ZDA0ZTBkMDY5MzQzNDE5MjY3MzI2YTI2N2ZiMDhlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjEyNzYwMTU3NTY0ODksLTc0LjA5NzEyNTUyMTc4NTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDlmOTg5ZWMxY2MwNDgyNmEwYmM0NWYyMjE3YjFkZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmEwZDhjN2EzNjE1NGRjYmEzMjk4ZWQ5Y2JjZmYyN2QgPSAkKCc8ZGl2IGlkPSJodG1sXzZhMGQ4YzdhMzYxNTRkY2JhMzI5OGVkOWNiY2ZmMjdkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ5Zjk4OWVjMWNjMDQ4MjZhMGJjNDVmMjIxN2IxZGRiLnNldENvbnRlbnQoaHRtbF82YTBkOGM3YTM2MTU0ZGNiYTMyOThlZDljYmNmZjI3ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84OWQwNGUwZDA2OTM0MzQxOTI2NzMyNmEyNjdmYjA4ZS5iaW5kUG9wdXAocG9wdXBfNDlmOTg5ZWMxY2MwNDgyNmEwYmM0NWYyMjE3YjFkZGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmIyMDUzNWFlMjA5NDY5OThkZWUxNzgzNDRjNjY2ZjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDM2NzUxODMzNDA5NzQsLTczLjk2MTAxMzEyNDY2Nzc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkMGM1MGM1MzFlYjQ5MjlhZTdhYzQyYzY2MWZiMThlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M0YjZhYWY4YWM3ODQzZjNiN2MzYjQwZDA2NWFiNGU4ID0gJCgnPGRpdiBpZD0iaHRtbF9jNGI2YWFmOGFjNzg0M2YzYjdjM2I0MGQwNjVhYjRlOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGl0bWFzIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZDBjNTBjNTMxZWI0OTI5YWU3YWM0MmM2NjFmYjE4ZS5zZXRDb250ZW50KGh0bWxfYzRiNmFhZjhhYzc4NDNmM2I3YzNiNDBkMDY1YWI0ZTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmIyMDUzNWFlMjA5NDY5OThkZWUxNzgzNDRjNjY2ZjcuYmluZFBvcHVwKHBvcHVwXzdkMGM1MGM1MzFlYjQ5MjlhZTdhYzQyYzY2MWZiMThlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU0OTA3NDU4NDYxYjQzY2M5MDJkNDRlMjAxMjg2ZWJjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwOTQ2NTYxODgxMTEsLTczLjkzNzE4NjgwNTU5MzE0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVlODk0MGM2M2ZmNzQzMTRhOTU3YjAwYzIyY2Q1MDUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkMjI5OTU0NmE4MTQ3NTNhMTQ4ZTgyNzgwMzc5MDE1ID0gJCgnPGRpdiBpZD0iaHRtbF8yZDIyOTk1NDZhODE0NzUzYTE0OGU4Mjc4MDM3OTAxNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2luZ2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVlODk0MGM2M2ZmNzQzMTRhOTU3YjAwYzIyY2Q1MDUwLnNldENvbnRlbnQoaHRtbF8yZDIyOTk1NDZhODE0NzUzYTE0OGU4Mjc4MDM3OTAxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NDkwNzQ1ODQ2MWI0M2NjOTAyZDQ0ZTIwMTI4NmViYy5iaW5kUG9wdXAocG9wdXBfNWU4OTQwYzYzZmY3NDMxNGE5NTdiMDBjMjJjZDUwNTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWQ2NjcwYzMwMmRkNDFhYzk2ZjIwNjg0MzZjYjU1YzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTU1NzIzMTMyODA3NjQsLTczLjkyNjg4MjEyNjE2OTU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3NzMyNWJjMmMwMzRlNjhiMjQxYjE1YTQxZTUyM2U1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5ODNiMjQwNTNkZDQwMjU4YjI3NTM3MDZiYWZjOTI5ID0gJCgnPGRpdiBpZD0iaHRtbF82OTgzYjI0MDUzZGQ0MDI1OGIyNzUzNzA2YmFmYzkyOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVnYnksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNzczMjViYzJjMDM0ZTY4YjI0MWIxNWE0MWU1MjNlNS5zZXRDb250ZW50KGh0bWxfNjk4M2IyNDA1M2RkNDAyNThiMjc1MzcwNmJhZmM5MjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWQ2NjcwYzMwMmRkNDFhYzk2ZjIwNjg0MzZjYjU1YzYuYmluZFBvcHVwKHBvcHVwX2M3NzMyNWJjMmMwMzRlNjhiMjQxYjE1YTQxZTUyM2U1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIzNDY0NmI0MmY3NjQ3NmE4ZGVjYjg4NjkzOWJmNTBkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5MTkwNDQ0MzQ1NTgsLTc0LjA4MDE1NzM0OTM2Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q5YjZmYmVmNzYwNzQ2ZTJiYzcyMWY5MWUyYjEyMjg5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA0Nzc5NzVhYTM0YTRhN2NiM2NlY2EzZGIzNWU1NDUzID0gJCgnPGRpdiBpZD0iaHRtbF8wNDc3OTc1YWEzNGE0YTdjYjNjZWNhM2RiMzVlNTQ1MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFyayBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOWI2ZmJlZjc2MDc0NmUyYmM3MjFmOTFlMmIxMjI4OS5zZXRDb250ZW50KGh0bWxfMDQ3Nzk3NWFhMzRhNGE3Y2IzY2VjYTNkYjM1ZTU0NTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjM0NjQ2YjQyZjc2NDc2YThkZWNiODg2OTM5YmY1MGQuYmluZFBvcHVwKHBvcHVwX2Q5YjZmYmVmNzYwNzQ2ZTJiYzcyMWY5MWUyYjEyMjg5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYyMDE1ZjEzZDM4OTQzMTA5MDhkYmU1MGQwMjQzM2ExID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjIxMDkwNDcyNzU0MDksLTc0LjEzMzA0MTQzOTUxNzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I4OGQ0M2UzM2ZiMTRiMDI5MWNkOGJhZGJkZjkxZDZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E4YTQ4ZDA3NDVlODRmMDE5OTU3OTk3NmQ1NmMwYjgxID0gJCgnPGRpdiBpZD0iaHRtbF9hOGE0OGQwNzQ1ZTg0ZjAxOTk1Nzk5NzZkNTZjMGI4MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdGVybGVpZ2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I4OGQ0M2UzM2ZiMTRiMDI5MWNkOGJhZGJkZjkxZDZhLnNldENvbnRlbnQoaHRtbF9hOGE0OGQwNzQ1ZTg0ZjAxOTk1Nzk5NzZkNTZjMGI4MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MjAxNWYxM2QzODk0MzEwOTA4ZGJlNTBkMDI0MzNhMS5iaW5kUG9wdXAocG9wdXBfYjg4ZDQzZTMzZmIxNGIwMjkxY2Q4YmFkYmRmOTFkNmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmFjODAzMDliYjA1NDkyMmE0MWRjZGMxODA2MzM3MWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjAxNzE1MTIyMzE4ODQsLTc0LjE1MzE1MjQ2Mzg3NzYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YwNDFjMzk5NGExNjRiY2FiZTllZTRlYzc1MGIxZWRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ2MjRlNjE0YzE3OTRlYjhhOWIwNjcwZjI0MmNiZDU0ID0gJCgnPGRpdiBpZD0iaHRtbF80NjI0ZTYxNGMxNzk0ZWI4YTliMDY3MGYyNDJjYmQ1NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3Jhbml0ZXZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMDQxYzM5OTRhMTY0YmNhYmU5ZWU0ZWM3NTBiMWVkZi5zZXRDb250ZW50KGh0bWxfNDYyNGU2MTRjMTc5NGViOGE5YjA2NzBmMjQyY2JkNTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmFjODAzMDliYjA1NDkyMmE0MWRjZGMxODA2MzM3MWEuYmluZFBvcHVwKHBvcHVwX2YwNDFjMzk5NGExNjRiY2FiZTllZTRlYzc1MGIxZWRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRiNTViODNkZjIzMDRkNjI4NDYzMTYyMzJlMzAxMjQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM1MzI1MDk5MTE0OTIsLTc0LjE2NTEwNDIwMjQxMTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZkZmE5YjM5M2IyYTQxM2M5MzhkMDFiZTViN2M3Zjk2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzNjgxNGJiZWI2MjQ5YmVhZWE1NzE3ZTkzMjBlMjljID0gJCgnPGRpdiBpZD0iaHRtbF9hMzY4MTRiYmViNjI0OWJlYWVhNTcxN2U5MzIwZTI5YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJsaW5ndG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZGZhOWIzOTNiMmE0MTNjOTM4ZDAxYmU1YjdjN2Y5Ni5zZXRDb250ZW50KGh0bWxfYTM2ODE0YmJlYjYyNDliZWFlYTU3MTdlOTMyMGUyOWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGI1NWI4M2RmMjMwNGQ2Mjg0NjMxNjIzMmUzMDEyNDAuYmluZFBvcHVwKHBvcHVwXzZkZmE5YjM5M2IyYTQxM2M5MzhkMDFiZTViN2M3Zjk2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U0MDlmY2MzYzNjYTRlNGE5YmI3ZjU2NDdmNTYyNDY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk2MzEyNTcxMjc2NzM0LC03NC4wNjcxMjM2MzIyNTU3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YjNlMGNlMmM0Y2U0N2FkODJlZmQ1ZTUxN2ZjYjBkNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NTMyMDM3MGMzNWI0MmVkOTgzNWRiMmYyZWU4YjA3MSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTUzMjAzNzBjMzViNDJlZDk4MzVkYjJmMmVlOGIwNzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFycm9jaGFyLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YjNlMGNlMmM0Y2U0N2FkODJlZmQ1ZTUxN2ZjYjBkNC5zZXRDb250ZW50KGh0bWxfNTUzMjAzNzBjMzViNDJlZDk4MzVkYjJmMmVlOGIwNzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTQwOWZjYzNjM2NhNGU0YTliYjdmNTY0N2Y1NjI0NjYuYmluZFBvcHVwKHBvcHVwXzRiM2UwY2UyYzRjZTQ3YWQ4MmVmZDVlNTE3ZmNiMGQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VmY2JhYWM5MGFkNjRmMWE5YTVkZGJmMTU4MDU4NmNhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk4MjY4MzU5NTk5OTEsLTc0LjA3NjY3NDM2Mjc5MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzU0NjcwM2ExNjZjNGUzNmE0MWZkMzhkYmIwYzk3MjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTkzYjJjNmE5MDc3NDA3ZTg3NTI0ZWUyZjQ2ZGMyNjIgPSAkKCc8ZGl2IGlkPSJodG1sXzE5M2IyYzZhOTA3NzQwN2U4NzUyNGVlMmY0NmRjMjYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFzbWVyZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzU0NjcwM2ExNjZjNGUzNmE0MWZkMzhkYmIwYzk3Mjkuc2V0Q29udGVudChodG1sXzE5M2IyYzZhOTA3NzQwN2U4NzUyNGVlMmY0NmRjMjYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VmY2JhYWM5MGFkNjRmMWE5YTVkZGJmMTU4MDU4NmNhLmJpbmRQb3B1cChwb3B1cF9jNTQ2NzAzYTE2NmM0ZTM2YTQxZmQzOGRiYjBjOTcyOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZDY3NGE4NzFkN2E0NWI1YjFjNDgzMmYwZGJmZjM1MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NjMyODkxMzc5NTEzLC03NC4wODc1MTExODAwNTU3OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MzgwYWQ0OTIyNGI0OTNlODExOGIwOTRmZGFiYjc2NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hODNkZmVkODUwNjQ0NDE0OGZkY2JjNDU0NDY0MzViNyA9ICQoJzxkaXYgaWQ9Imh0bWxfYTgzZGZlZDg1MDY0NDQxNDhmZGNiYzQ1NDQ2NDM1YjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9sZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MzgwYWQ0OTIyNGI0OTNlODExOGIwOTRmZGFiYjc2Ny5zZXRDb250ZW50KGh0bWxfYTgzZGZlZDg1MDY0NDQxNDhmZGNiYzQ1NDQ2NDM1YjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWQ2NzRhODcxZDdhNDViNWIxYzQ4MzJmMGRiZmYzNTIuYmluZFBvcHVwKHBvcHVwXzYzODBhZDQ5MjI0YjQ5M2U4MTE4YjA5NGZkYWJiNzY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYxYWViYjkyMWFiMTRmMjBiYmE2YWU1NmFjMjk3MDI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg4NjcyOTQ4MTk5Mjc1LC03NC4wOTYzOTkwNTMxMjUyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNDZmODljZWM3OTc0ZmU3YTZkNzc5ODViNjNlM2RjNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xODViYjU5ODgxN2Y0YTE2OGMwZDhjNWE5YmQ5MzQ3NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTg1YmI1OTg4MTdmNGExNjhjMGQ4YzVhOWJkOTM0NzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvbmdhbiBIaWxscywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTQ2Zjg5Y2VjNzk3NGZlN2E2ZDc3OTg1YjYzZTNkYzcuc2V0Q29udGVudChodG1sXzE4NWJiNTk4ODE3ZjRhMTY4YzBkOGM1YTliZDkzNDc0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYxYWViYjkyMWFiMTRmMjBiYmE2YWU1NmFjMjk3MDI5LmJpbmRQb3B1cChwb3B1cF9hNDZmODljZWM3OTc0ZmU3YTZkNzc5ODViNjNlM2RjNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZTc4NzQ0Y2I2YzY0Y2ZiODkzMDI5M2M1ODJmYWMyNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3MzUyNjkwNTc0MjgzLC03NC4wOTM0ODI2NjMwMzU5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YjVjZWQ4YTVlMzA0Njg2YWFlYjAyOThjOTE3YjlkNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MDZkZGFkNDhmMWM0NjEyYjdmMjRlMjQ3MGY2OGMwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDA2ZGRhZDQ4ZjFjNDYxMmI3ZjI0ZTI0NzBmNjhjMDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGxhbmQgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzliNWNlZDhhNWUzMDQ2ODZhYWViMDI5OGM5MTdiOWQ3LnNldENvbnRlbnQoaHRtbF80MDZkZGFkNDhmMWM0NjEyYjdmMjRlMjQ3MGY2OGMwOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZTc4NzQ0Y2I2YzY0Y2ZiODkzMDI5M2M1ODJmYWMyNS5iaW5kUG9wdXAocG9wdXBfOWI1Y2VkOGE1ZTMwNDY4NmFhZWIwMjk4YzkxN2I5ZDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmQ1MmE2YWE4ZDdlNDZmNjg4N2RhNjNjNTI4ZmRkMTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYyMTU1ODcxMTc4OCwtNzQuMTA1ODU1OTg1NDU0MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzUxMzA5YzFmOWE4NGI2ZGEwMTc2NTllYmU5OGZiN2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzA3ZTlmN2NhZDQ0NDJlY2FkYzNiMzE5OGZmZGFmNjYgPSAkKCc8ZGl2IGlkPSJodG1sX2MwN2U5ZjdjYWQ0NDQyZWNhZGMzYjMxOThmZmRhZjY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFudCBDaXR5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNTEzMDljMWY5YTg0YjZkYTAxNzY1OWViZTk4ZmI3Yy5zZXRDb250ZW50KGh0bWxfYzA3ZTlmN2NhZDQ0NDJlY2FkYzNiMzE5OGZmZGFmNjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmQ1MmE2YWE4ZDdlNDZmNjg4N2RhNjNjNTI4ZmRkMTEuYmluZFBvcHVwKHBvcHVwX2M1MTMwOWMxZjlhODRiNmRhMDE3NjU5ZWJlOThmYjdjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEzNjllYjg3ODQwZjRmYzliZGZlODNjZjQ1OTA1ZDBlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY0MjU1NDkzMDczMzUsLTc0LjEwNDMyNzA3NDY5MTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkyYzI2MDZlYWFjNzQ4ZDk4NjdlNmIzYjljNzNmZGUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E2NTc4MTg3N2NmYjRmNzhiNjgwN2ZiYzY4OTcxMzFmID0gJCgnPGRpdiBpZD0iaHRtbF9hNjU3ODE4NzdjZmI0Zjc4YjY4MDdmYmM2ODk3MTMxZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TmV3IERvcnAgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkyYzI2MDZlYWFjNzQ4ZDk4NjdlNmIzYjljNzNmZGUzLnNldENvbnRlbnQoaHRtbF9hNjU3ODE4NzdjZmI0Zjc4YjY4MDdmYmM2ODk3MTMxZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMzY5ZWI4Nzg0MGY0ZmM5YmRmZTgzY2Y0NTkwNWQwZS5iaW5kUG9wdXAocG9wdXBfOTJjMjYwNmVhYWM3NDhkOTg2N2U2YjNiOWM3M2ZkZTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjA3ZDc1ZDBjNDMwNDlkMGJkNWNiY2U5OTVjNDllZGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NTM5ODgwMDg1ODQ2MiwtNzQuMTM5MTY2MjIxNzU3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDg1MmNmOTkwYjM4NGJmYzk2NjgyY2VjODdhZjdhNGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzc3YWRhZTZmNjA2NDY2MjllYWY3MzdkNjI2ZmZhNGEgPSAkKCc8ZGl2IGlkPSJodG1sXzc3N2FkYWU2ZjYwNjQ2NjI5ZWFmNzM3ZDYyNmZmYTRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXkgVGVycmFjZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDg1MmNmOTkwYjM4NGJmYzk2NjgyY2VjODdhZjdhNGUuc2V0Q29udGVudChodG1sXzc3N2FkYWU2ZjYwNjQ2NjI5ZWFmNzM3ZDYyNmZmYTRhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YwN2Q3NWQwYzQzMDQ5ZDBiZDVjYmNlOTk1YzQ5ZWRiLmJpbmRQb3B1cChwb3B1cF8wODUyY2Y5OTBiMzg0YmZjOTY2ODJjZWM4N2FmN2E0ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mODc4ZGEyNzg3NWU0YTA2YTgyNDkzMjI0NTczNTJlMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUzMTkxMTkyMDQ4OTYwNSwtNzQuMTkxNzQxMDU3NDc4MTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2E4ZGQ2YzY0Y2FiNDk0YTk2ZGY5YmY0ZjQ3MTVhNWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzQ0YmM0ZDM0ODZjNGFlMzljNzMwODQ4NDE4MzIyNGUgPSAkKCc8ZGl2IGlkPSJodG1sX2M0NGJjNGQzNDg2YzRhZTM5YzczMDg0ODQxODMyMjRlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWd1ZW5vdCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2E4ZGQ2YzY0Y2FiNDk0YTk2ZGY5YmY0ZjQ3MTVhNWEuc2V0Q29udGVudChodG1sX2M0NGJjNGQzNDg2YzRhZTM5YzczMDg0ODQxODMyMjRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y4NzhkYTI3ODc1ZTRhMDZhODI0OTMyMjQ1NzM1MmUzLmJpbmRQb3B1cChwb3B1cF8zYThkZDZjNjRjYWI0OTRhOTZkZjliZjRmNDcxNWE1YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NDQ4NzI3NmFmMWM0YTQ5OTFiMGQ5YjVmNDlkYWZjYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUyNDY5OTM3NjExODEzNiwtNzQuMjE5ODMxMDY2MTY3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjFlZTk0OThmMzM5NDE4MzliZDBkMTkzMGM4ZGEzMzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmJmMmYyMDQ0OTRjNDcxZDhmYTg2MDQyNjMwYjIyZDIgPSAkKCc8ZGl2IGlkPSJodG1sXzJiZjJmMjA0NDk0YzQ3MWQ4ZmE4NjA0MjYzMGIyMmQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QbGVhc2FudCBQbGFpbnMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IxZWU5NDk4ZjMzOTQxODM5YmQwZDE5MzBjOGRhMzM1LnNldENvbnRlbnQoaHRtbF8yYmYyZjIwNDQ5NGM0NzFkOGZhODYwNDI2MzBiMjJkMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NDQ4NzI3NmFmMWM0YTQ5OTFiMGQ5YjVmNDlkYWZjYi5iaW5kUG9wdXAocG9wdXBfYjFlZTk0OThmMzM5NDE4MzliZDBkMTkzMGM4ZGEzMzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjZkNzJlNzRjNjU4NGY5NThiZGNhNzc4NDZjY2RkOTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MDYwODE2NTM0NjMwNSwtNzQuMjI5NTAzNTAyNjAwMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmNjMWY2YmMxZDdmNDg4NWFhMmU4ZGJkN2RlYzZmZTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWJkMjBmMWFkYWFkNDliNDk3OWE5ZjZhOTQ3YWVjMzggPSAkKCc8ZGl2IGlkPSJodG1sX2ViZDIwZjFhZGFhZDQ5YjQ5NzlhOWY2YTk0N2FlYzM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXRsZXIgTWFub3IsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjYzFmNmJjMWQ3ZjQ4ODVhYTJlOGRiZDdkZWM2ZmUwLnNldENvbnRlbnQoaHRtbF9lYmQyMGYxYWRhYWQ0OWI0OTc5YTlmNmE5NDdhZWMzOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNmQ3MmU3NGM2NTg0Zjk1OGJkY2E3Nzg0NmNjZGQ5NS5iaW5kUG9wdXAocG9wdXBfZmNjMWY2YmMxZDdmNDg4NWFhMmU4ZGJkN2RlYzZmZTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2IyNmViZjY4MTk2NDYxNjhhYmI5NzM2NmQ0ODM4NDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzA1MzE0ODI4MzMxNCwtNzQuMjMyMTU3NzU4OTY1MjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzE1YzIwMDMyM2I4NDExMDhiZmM2ZDc5ZThkMTkzOTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2MzYTFiZjc3M2RjNDM3OWE5MjQzMDc4NjdmMzIxZTkgPSAkKCc8ZGl2IGlkPSJodG1sX2NjM2ExYmY3NzNkYzQzNzlhOTI0MzA3ODY3ZjMyMWU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGFybGVzdG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMTVjMjAwMzIzYjg0MTEwOGJmYzZkNzllOGQxOTM5OS5zZXRDb250ZW50KGh0bWxfY2MzYTFiZjc3M2RjNDM3OWE5MjQzMDc4NjdmMzIxZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2IyNmViZjY4MTk2NDYxNjhhYmI5NzM2NmQ0ODM4NDguYmluZFBvcHVwKHBvcHVwXzMxNWMyMDAzMjNiODQxMTA4YmZjNmQ3OWU4ZDE5Mzk5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EzOGI2NTNlY2ZjMzQ1YmJiYThkZjFlMGJkZjBiN2NlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDA0MDA2NTAwNzIsLTc0LjIxNTcyODUxMTEzOTUyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdmNGYzMWMzZjVkYzQ0MjNhNDMzYjViMjU2MGIzMDI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ1OGI1YTIzNThlYjRkOTVhNzllNzE5Yjg4YjA2Y2Y4ID0gJCgnPGRpdiBpZD0iaHRtbF80NThiNWEyMzU4ZWI0ZDk1YTc5ZTcxOWI4OGIwNmNmOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zc3ZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZjRmMzFjM2Y1ZGM0NDIzYTQzM2I1YjI1NjBiMzAyOC5zZXRDb250ZW50KGh0bWxfNDU4YjVhMjM1OGViNGQ5NWE3OWU3MTliODhiMDZjZjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTM4YjY1M2VjZmMzNDViYmJhOGRmMWUwYmRmMGI3Y2UuYmluZFBvcHVwKHBvcHVwXzdmNGYzMWMzZjVkYzQ0MjNhNDMzYjViMjU2MGIzMDI4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ2ZjIxZDQxMmZmNTRkNDRiMTM2YTg4Yjc1YzI3YmYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5Mjg1ODIyNzgzMjEsLTc0LjE4NTg4Njc0NTgzODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI3ZjY0MDc3YjhhNDQyNmU4ZGI3OTUwMjcxMmM4OWMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVhNzA2MTMyOWQyNjQxMGY4OGI1ODczNTIwYTgyMjJjID0gJCgnPGRpdiBpZD0iaHRtbF81YTcwNjEzMjlkMjY0MTBmODhiNTg3MzUyMGE4MjIyYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJkZW4gSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjdmNjQwNzdiOGE0NDI2ZThkYjc5NTAyNzEyYzg5YzMuc2V0Q29udGVudChodG1sXzVhNzA2MTMyOWQyNjQxMGY4OGI1ODczNTIwYTgyMjJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ2ZjIxZDQxMmZmNTRkNDRiMTM2YTg4Yjc1YzI3YmYwLmJpbmRQb3B1cChwb3B1cF8yN2Y2NDA3N2I4YTQ0MjZlOGRiNzk1MDI3MTJjODljMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMTBlMGQwNDg0OTM0N2ZlOTY2YWM5MWUzZTg2ZmUxNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU1NTI5NTIzNjE3MzE5NCwtNzQuMTcwNzk0MTQ3ODYwOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDljM2MwMTAxN2QwNDZmZmJiOTkxNDdjMzRlMTg3MmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWJhNzcwYzAxOThkNDI3NWJiMDkwY2QzNDJlNzJmNTggPSAkKCc8ZGl2IGlkPSJodG1sX2ViYTc3MGMwMTk4ZDQyNzViYjA5MGNkMzQyZTcyZjU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbnJpZGdlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wOWMzYzAxMDE3ZDA0NmZmYmI5OTE0N2MzNGUxODcyZS5zZXRDb250ZW50KGh0bWxfZWJhNzcwYzAxOThkNDI3NWJiMDkwY2QzNDJlNzJmNTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTEwZTBkMDQ4NDkzNDdmZTk2NmFjOTFlM2U4NmZlMTUuYmluZFBvcHVwKHBvcHVwXzA5YzNjMDEwMTdkMDQ2ZmZiYjk5MTQ3YzM0ZTE4NzJlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RmY2UzODVhN2M2ZTQ5Yjk4MGU3OWRjMTc0NWI3MDU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg5MTM4OTQ4NzUyODEsLTc0LjE1OTAyMjA4MTU2NjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ5NWJmY2E3NTU4NDQxYWE4Zjk3YjZkZGEwMzY2YzgwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2ZWEzMGUzNTk2ZjQ2M2M4NGY0Mzc4MGQ4MWEyMDA2ID0gJCgnPGRpdiBpZD0iaHRtbF8yNmVhMzBlMzU5NmY0NjNjODRmNDM3ODBkODFhMjAwNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGVhcnRsYW5kIFZpbGxhZ2UsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ5NWJmY2E3NTU4NDQxYWE4Zjk3YjZkZGEwMzY2YzgwLnNldENvbnRlbnQoaHRtbF8yNmVhMzBlMzU5NmY0NjNjODRmNDM3ODBkODFhMjAwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZmNlMzg1YTdjNmU0OWI5ODBlNzlkYzE3NDViNzA1Ny5iaW5kUG9wdXAocG9wdXBfNDk1YmZjYTc1NTg0NDFhYThmOTdiNmRkYTAzNjZjODApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWM5NTNiOTZmNTNkNDQyYzkxMTc2YjliMWJlYmY5MzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTQ3MjYwMjc0NjI5NSwtNzQuMTg5NTYwNDU1MTk2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNDA2MDIwMmYyNzY0Y2RmODc5MzIwMzAwZDZlMWI2MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NjNhMmNiN2RmNDQ0YjU0OGVhMjRkODI1NzQzYzgyOSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTYzYTJjYjdkZjQ0NGI1NDhlYTI0ZDgyNTc0M2M4MjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoZWxzZWEsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA0MDYwMjAyZjI3NjRjZGY4NzkzMjAzMDBkNmUxYjYwLnNldENvbnRlbnQoaHRtbF85NjNhMmNiN2RmNDQ0YjU0OGVhMjRkODI1NzQzYzgyOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85Yzk1M2I5NmY1M2Q0NDJjOTExNzZiOWIxYmViZjkzNi5iaW5kUG9wdXAocG9wdXBfMDQwNjAyMDJmMjc2NGNkZjg3OTMyMDMwMGQ2ZTFiNjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2VhNzBmNDdhZDc2NGEzNjg2YWJkMjQ0ZTJmYjUxYTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MDU3Nzg2ODQ1MjM1OCwtNzQuMTg3MjU2MzgzODE1NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTc5YjZlZWZiYmVlNDkxNWIwYTkxZjM1MDU5YmEyM2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWE3ZDEzY2U1OTc3NGU1ZDljY2IzMzEzNzhjOTgwYWMgPSAkKCc8ZGl2IGlkPSJodG1sX2VhN2QxM2NlNTk3NzRlNWQ5Y2NiMzMxMzc4Yzk4MGFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CbG9vbWZpZWxkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNzliNmVlZmJiZWU0OTE1YjBhOTFmMzUwNTliYTIzYi5zZXRDb250ZW50KGh0bWxfZWE3ZDEzY2U1OTc3NGU1ZDljY2IzMzEzNzhjOTgwYWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2VhNzBmNDdhZDc2NGEzNjg2YWJkMjQ0ZTJmYjUxYTAuYmluZFBvcHVwKHBvcHVwXzE3OWI2ZWVmYmJlZTQ5MTViMGE5MWYzNTA1OWJhMjNiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q1OWEyYWVmZmE3YTQxZGViZWMwMzdiOTQwOGQ3YmFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NTkxODAwNDIwMywtNzQuMTU5NDA5NDg2NTcxMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTBhY2E0NzVhNGUwNGUzYmIxYTliMzljM2VmOTE2NTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjU1NDAwZTVlMGY3NDEwMWFmYmE0ZDJlM2U2ZjRiZWIgPSAkKCc8ZGl2IGlkPSJodG1sX2I1NTQwMGU1ZTBmNzQxMDFhZmJhNGQyZTNlNmY0YmViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdWxscyBIZWFkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MGFjYTQ3NWE0ZTA0ZTNiYjFhOWIzOWMzZWY5MTY1NS5zZXRDb250ZW50KGh0bWxfYjU1NDAwZTVlMGY3NDEwMWFmYmE0ZDJlM2U2ZjRiZWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDU5YTJhZWZmYTdhNDFkZWJlYzAzN2I5NDA4ZDdiYWYuYmluZFBvcHVwKHBvcHVwXzUwYWNhNDc1YTRlMDRlM2JiMWE5YjM5YzNlZjkxNjU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FjODRmMzExYzc1ODRmMjZhNGM1ZGRiMjNkNmJiMmQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzgyNjgyNTY3MTI1NywtNzMuOTUzMjU2NDY4MzcxMTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGFiODZlNTJlYTgyNDJjY2I0NGJhYjRmNThjY2I3MjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWRkYjQxNmJhMDdmNGMwMGE0YzUwNTE0ZTg1MTE5Y2MgPSAkKCc8ZGl2IGlkPSJodG1sX2FkZGI0MTZiYTA3ZjRjMDBhNGM1MDUxNGU4NTExOWNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXJuZWdpZSBIaWxsLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBhYjg2ZTUyZWE4MjQyY2NiNDRiYWI0ZjU4Y2NiNzI0LnNldENvbnRlbnQoaHRtbF9hZGRiNDE2YmEwN2Y0YzAwYTRjNTA1MTRlODUxMTljYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYzg0ZjMxMWM3NTg0ZjI2YTRjNWRkYjIzZDZiYjJkMi5iaW5kUG9wdXAocG9wdXBfMGFiODZlNTJlYTgyNDJjY2I0NGJhYjRmNThjY2I3MjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmUwM2E5ZDhhYjMyNGJhN2I4OGZjYjQxMmZmMGM5NGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWNjZjc2YWNjZTYzNDViZWFlYTM1M2NjM2EyNjdjYTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTdmZmQ2N2I4MDFiNDU4NTkyYWU2N2Y1MzA4MDJmYjQgPSAkKCc8ZGl2IGlkPSJodG1sXzE3ZmZkNjdiODAxYjQ1ODU5MmFlNjdmNTMwODAyZmI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FjY2Y3NmFjY2U2MzQ1YmVhZWEzNTNjYzNhMjY3Y2EwLnNldENvbnRlbnQoaHRtbF8xN2ZmZDY3YjgwMWI0NTg1OTJhZTY3ZjUzMDgwMmZiNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZTAzYTlkOGFiMzI0YmE3Yjg4ZmNiNDEyZmYwYzk0Zi5iaW5kUG9wdXAocG9wdXBfYWNjZjc2YWNjZTYzNDViZWFlYTM1M2NjM2EyNjdjYTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzdmNDljMTBkYjYyNDVjNGE5MWFkYTI1ZmFkMjQxMzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTUyMjg5MjA0NjI4MiwtNzQuMDA1NDE1Mjk4NzMzNTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGRlYjc1NTQ4OTY0NDEyMmIzOGZkOWU3ZmI1NjYxMGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjRkZDg4ZDNkNDU5NDA0NGI2OThkMDMzN2MyZTJjNDIgPSAkKCc8ZGl2IGlkPSJodG1sX2I0ZGQ4OGQzZDQ1OTQwNDRiNjk4ZDAzMzdjMmUyYzQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXZpYyBDZW50ZXIsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGRlYjc1NTQ4OTY0NDEyMmIzOGZkOWU3ZmI1NjYxMGQuc2V0Q29udGVudChodG1sX2I0ZGQ4OGQzZDQ1OTQwNDRiNjk4ZDAzMzdjMmUyYzQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM3ZjQ5YzEwZGI2MjQ1YzRhOTFhZGEyNWZhZDI0MTMyLmJpbmRQb3B1cChwb3B1cF80ZGViNzU1NDg5NjQ0MTIyYjM4ZmQ5ZTdmYjU2NjEwZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YTMwYjk2MDE0ZmE0NjBhYTc0OGI3Mjc2Y2U3MDBiNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODUwOTY2NDMxMjIsLTczLjk4ODcxMzEzMjg1MjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgzZTVhYmZkZGY3ODRmZjM5MDMzZGZjMmNkMzkxYWQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJlNmY1MzI2YmNlZDQyYmZiZTk1ZGNmNjk4OGEyZDllID0gJCgnPGRpdiBpZD0iaHRtbF8yZTZmNTMyNmJjZWQ0MmJmYmU5NWRjZjY5ODhhMmQ5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93biBTb3V0aCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84M2U1YWJmZGRmNzg0ZmYzOTAzM2RmYzJjZDM5MWFkNC5zZXRDb250ZW50KGh0bWxfMmU2ZjUzMjZiY2VkNDJiZmJlOTVkY2Y2OTg4YTJkOWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWEzMGI5NjAxNGZhNDYwYWE3NDhiNzI3NmNlNzAwYjYuYmluZFBvcHVwKHBvcHVwXzgzZTVhYmZkZGY3ODRmZjM5MDMzZGZjMmNkMzkxYWQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ5MzczNDIxNGM5YTQ0YzE5OWRjZjU5OTQ2OGMzMzhiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY5NjA1OTQyNzU1MDUsLTc0LjEzNDA1NzI5ODYyNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWE3NmRhMzQ1ZDE2NGQxN2JjYTAzZjExMzQ4ZDkzYjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODFjYTUyODRkZjEyNDc3YmFiMDIwMzg3NTEwMTdlMjggPSAkKCc8ZGl2IGlkPSJodG1sXzgxY2E1Mjg0ZGYxMjQ3N2JhYjAyMDM4NzUxMDE3ZTI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYTc2ZGEzNDVkMTY0ZDE3YmNhMDNmMTEzNDhkOTNiMi5zZXRDb250ZW50KGh0bWxfODFjYTUyODRkZjEyNDc3YmFiMDIwMzg3NTEwMTdlMjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDkzNzM0MjE0YzlhNDRjMTk5ZGNmNTk5NDY4YzMzOGIuYmluZFBvcHVwKHBvcHVwXzFhNzZkYTM0NWQxNjRkMTdiY2EwM2YxMTM0OGQ5M2IyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VjN2M4ZDNlMjFmOTRjMTQ4MjEyYzMzMmIxMTkwZWRiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzE5MzQwNzkyODQsLTc0LjA2NjY3NzY2MDYxNzcxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkzODhjNmM4OTVlMjQwM2FhZjEwMTkzOWVmM2NlODZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U5MzMwYThmY2Q3NzQwYmE4MTUyYWNiOTA1Y2Y1ZmZhID0gJCgnPGRpdiBpZD0iaHRtbF9lOTMzMGE4ZmNkNzc0MGJhODE1MmFjYjkwNWNmNWZmYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hvcmUgQWNyZXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkzODhjNmM4OTVlMjQwM2FhZjEwMTkzOWVmM2NlODZlLnNldENvbnRlbnQoaHRtbF9lOTMzMGE4ZmNkNzc0MGJhODE1MmFjYjkwNWNmNWZmYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYzdjOGQzZTIxZjk0YzE0ODIxMmMzMzJiMTE5MGVkYi5iaW5kUG9wdXAocG9wdXBfOTM4OGM2Yzg5NWUyNDAzYWFmMTAxOTM5ZWYzY2U4NmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDdkZGJkYmVmZmRhNDdlZTkzZDI3NDRiNzAwMTQzZTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTkxNzg0NTIwMjg0MywtNzQuMDcyNjQyNDQ1NDg0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NlNTY2YjI5OWM2NjQ5NDdhZjFkN2U1OWQyOTU4ZWU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYyOGRiOWRhZmYxMjQ4ZWFiMTQ2MGE4OGYxNmZiMGI4ID0gJCgnPGRpdiBpZD0iaHRtbF82MjhkYjlkYWZmMTI0OGVhYjE0NjBhODhmMTZmYjBiOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xpZnRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2U1NjZiMjk5YzY2NDk0N2FmMWQ3ZTU5ZDI5NThlZTguc2V0Q29udGVudChodG1sXzYyOGRiOWRhZmYxMjQ4ZWFiMTQ2MGE4OGYxNmZiMGI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q3ZGRiZGJlZmZkYTQ3ZWU5M2QyNzQ0YjcwMDE0M2UyLmJpbmRQb3B1cChwb3B1cF9jZTU2NmIyOTljNjY0OTQ3YWYxZDdlNTlkMjk1OGVlOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84N2E2MTc3MGY2YTk0ZDE4OTkzYmE2ZDcwMjIzOGYxOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNDQ3MzE4OTY4NzksLTc0LjA4NDAyMzY0NzQwMzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiZGZiY2Y5Y2E4OTQ5MzJhYWU1YTMwOTlkMzE5ZDUxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNlMjI5MTFjNDdjMjRjOWVhYTAyMTRlZWJjYmQ0NTg0ID0gJCgnPGRpdiBpZD0iaHRtbF8zZTIyOTExYzQ3YzI0YzllYWEwMjE0ZWViY2JkNDU4NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY29yZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2JkZmJjZjljYTg5NDkzMmFhZTVhMzA5OWQzMTlkNTEuc2V0Q29udGVudChodG1sXzNlMjI5MTFjNDdjMjRjOWVhYTAyMTRlZWJjYmQ0NTg0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg3YTYxNzcwZjZhOTRkMTg5OTNiYTZkNzAyMjM4ZjE4LmJpbmRQb3B1cChwb3B1cF9jYmRmYmNmOWNhODk0OTMyYWFlNWEzMDk5ZDMxOWQ1MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kY2ZhYzE4MWUxMDQ0YzI4YjUyYzhkMjJjNzE3MmE2MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNjc5NDM5NDgwMSwtNzQuMDk3NzYyMDY5NzI1MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzhjNDllZDdjOGEyNDYyMDgzMWVjODgwNDU5NzA4ODYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmFlYzhhZDEyM2Y5NDkzNWFmYzc4ZDE0ZWQ1ZDc3YzEgPSAkKCc8ZGl2IGlkPSJodG1sX2ZhZWM4YWQxMjNmOTQ5MzVhZmM3OGQxNGVkNWQ3N2MxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbWVyc29uIEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc4YzQ5ZWQ3YzhhMjQ2MjA4MzFlYzg4MDQ1OTcwODg2LnNldENvbnRlbnQoaHRtbF9mYWVjOGFkMTIzZjk0OTM1YWZjNzhkMTRlZDVkNzdjMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kY2ZhYzE4MWUxMDQ0YzI4YjUyYzhkMjJjNzE3MmE2My5iaW5kUG9wdXAocG9wdXBfNzhjNDllZDdjOGEyNDYyMDgzMWVjODgwNDU5NzA4ODYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWIwMzJhNGRiODY5NDM5NThiODE4OGEyMDliZDA1MWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzU2MzAwMDY4MTE1MSwtNzQuMDk4MDUwNjIzNzM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzczODJkOGJkZmJjNGMzNTkwNTJkYTU2ZDU5MDhkNWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzkyZDVkOTc2OWUwNDQ5M2E3OTBhYTUxZjIyMjYzMmEgPSAkKCc8ZGl2IGlkPSJodG1sXzM5MmQ1ZDk3NjllMDQ0OTNhNzkwYWE1MWYyMjI2MzJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYW5kYWxsIE1hbm9yLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NzM4MmQ4YmRmYmM0YzM1OTA1MmRhNTZkNTkwOGQ1Yi5zZXRDb250ZW50KGh0bWxfMzkyZDVkOTc2OWUwNDQ5M2E3OTBhYTUxZjIyMjYzMmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWIwMzJhNGRiODY5NDM5NThiODE4OGEyMDliZDA1MWQuYmluZFBvcHVwKHBvcHVwXzc3MzgyZDhiZGZiYzRjMzU5MDUyZGE1NmQ1OTA4ZDViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMzY2VkYzE1ZGYzNTQ0MWI5MzhhNmNlNjc3MzY3ZTBmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM4NDMyODM3OTQ3OTUsLTc0LjE4NjIyMzMxNzQ5ODIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA0YWNlMGYzZDAyMTQzZTJiYTg3MGQ2YTk1MTA0ZDEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkzYWE2MDk2N2VmNDQ0OTM4MjFiMTIyNDgwZTJhYTNlID0gJCgnPGRpdiBpZD0iaHRtbF85M2FhNjA5NjdlZjQ0NDkzODIxYjEyMjQ4MGUyYWEzZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SG93bGFuZCBIb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNGFjZTBmM2QwMjE0M2UyYmE4NzBkNmE5NTEwNGQxMy5zZXRDb250ZW50KGh0bWxfOTNhYTYwOTY3ZWY0NDQ5MzgyMWIxMjI0ODBlMmFhM2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzNjZWRjMTVkZjM1NDQxYjkzOGE2Y2U2NzczNjdlMGYuYmluZFBvcHVwKHBvcHVwXzA0YWNlMGYzZDAyMTQzZTJiYTg3MGQ2YTk1MTA0ZDEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBlOTRkMDZlMTYzYTQ3MGFiYjMyNTc1ZWZmMDk2OWQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMwMTQ2NzQxMTkzODI2LC03NC4xNDE4MTY3ODk2ODg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4MzFiMmE1ZGI5NzQyMjVhZDY2ZDMzZjFiOWRmNzAwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA5YjE4MTc1M2U1ODRmMGI4ZDM3MDEyZWYxMGQwOWQ3ID0gJCgnPGRpdiBpZD0iaHRtbF8wOWIxODE3NTNlNTg0ZjBiOGQzNzAxMmVmMTBkMDlkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWxtIFBhcmssIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE4MzFiMmE1ZGI5NzQyMjVhZDY2ZDMzZjFiOWRmNzAwLnNldENvbnRlbnQoaHRtbF8wOWIxODE3NTNlNTg0ZjBiOGQzNzAxMmVmMTBkMDlkNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZTk0ZDA2ZTE2M2E0NzBhYmIzMjU3NWVmZjA5NjlkOC5iaW5kUG9wdXAocG9wdXBfMTgzMWIyYTVkYjk3NDIyNWFkNjZkMzNmMWI5ZGY3MDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWJhZjhhYzQ3MDhmNDUzZTg3MGMyNjBjY2E1M2JhY2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTIxMTc0NTE3OTM0OTQsLTczLjkxNjY1MzMxOTc4MDQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRiZjVhZTdiZmViMzQ4MzFhZmNiNzQ4MmY3OTZkMGQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc2ZTc3NzU0NDc0MTQ0YTc5MjQwNThiOTFiZjczZTA1ID0gJCgnPGRpdiBpZD0iaHRtbF83NmU3Nzc1NDQ3NDE0NGE3OTI0MDU4YjkxYmY3M2UwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmVtc2VuIFZpbGxhZ2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YmY1YWU3YmZlYjM0ODMxYWZjYjc0ODJmNzk2ZDBkNy5zZXRDb250ZW50KGh0bWxfNzZlNzc3NTQ0NzQxNDRhNzkyNDA1OGI5MWJmNzNlMDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWJhZjhhYzQ3MDhmNDUzZTg3MGMyNjBjY2E1M2JhY2YuYmluZFBvcHVwKHBvcHVwXzRiZjVhZTdiZmViMzQ4MzFhZmNiNzQ4MmY3OTZkMGQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRmNTMyZDgyNTEyNzQyMTRiYWYxMDNkNGYxYzEyMjE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYyNzQ0Mjc5Njk2NiwtNzMuODg1MTE3NzYzNzkyOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTQ3ZDI2NTY5ZDM5NDU5MDkwYzQ4MDZhZWY1YzhjMmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWIxNzJjMTkwNmIwNDk4NTkyMWRhOGRlZTRlNWUzNDkgPSAkKCc8ZGl2IGlkPSJodG1sXzFiMTcyYzE5MDZiMDQ5ODU5MjFkYThkZWU0ZTVlMzQ5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgTG90cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE0N2QyNjU2OWQzOTQ1OTA5MGM0ODA2YWVmNWM4YzJmLnNldENvbnRlbnQoaHRtbF8xYjE3MmMxOTA2YjA0OTg1OTIxZGE4ZGVlNGU1ZTM0OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZjUzMmQ4MjUxMjc0MjE0YmFmMTAzZDRmMWMxMjIxOS5iaW5kUG9wdXAocG9wdXBfMTQ3ZDI2NTY5ZDM5NDU5MDkwYzQ4MDZhZWY1YzhjMmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTVhMGE0YWZhZGFhNDZhOGJjZGJjZDI4NTM1YzhmNzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzEzMTc1NTAzOTY2NywtNzMuOTAyMzM0NzQyOTU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjFhYmU4YjYyZDA5NDQyY2E0OTNhZmRmMjY1MTE2YjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTc3M2RhOTQwOTZhNDM1YmFjZjExMjY1ZDIxNTMxMmUgPSAkKCc8ZGl2IGlkPSJodG1sX2E3NzNkYTk0MDk2YTQzNWJhY2YxMTI2NWQyMTUzMTJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYWVyZGVnYXQgQmFzaW4sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMWFiZThiNjJkMDk0NDJjYTQ5M2FmZGYyNjUxMTZiNi5zZXRDb250ZW50KGh0bWxfYTc3M2RhOTQwOTZhNDM1YmFjZjExMjY1ZDIxNTMxMmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTVhMGE0YWZhZGFhNDZhOGJjZGJjZDI4NTM1YzhmNzIuYmluZFBvcHVwKHBvcHVwX2YxYWJlOGI2MmQwOTQ0MmNhNDkzYWZkZjI2NTExNmI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZlMThkMDcxMmE0YzRlZWVhMWUxMTBlYWZlNTdiNWI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE1OTc0MjM5NjIzMzYsLTczLjkxNTE1MzkxNTUwNDA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk4ZWMzYzdlN2FjODQ3ODFiYzdmOThjNWVlZDdjMjNjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRiMDU3YmJiY2RhYzRiOTNhZTIxOWJiMDNhZmY0MWM1ID0gJCgnPGRpdiBpZD0iaHRtbF80YjA1N2JiYmNkYWM0YjkzYWUyMTliYjAzYWZmNDFjNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlsbCBCYXNpbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk4ZWMzYzdlN2FjODQ3ODFiYzdmOThjNWVlZDdjMjNjLnNldENvbnRlbnQoaHRtbF80YjA1N2JiYmNkYWM0YjkzYWUyMTliYjAzYWZmNDFjNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZTE4ZDA3MTJhNGM0ZWVlYTFlMTEwZWFmZTU3YjViNS5iaW5kUG9wdXAocG9wdXBfOThlYzNjN2U3YWM4NDc4MWJjN2Y5OGM1ZWVkN2MyM2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDY3YTAxNTVhNGI0NDIwN2E2OTA1NDZjNzlmYmZiZjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE0NTk2NDM3MDQ4MiwtNzMuNzk2NDY0NjIwODE1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWI5ZjNmMjczYjc3NGUzOTlmNmY5NTVlY2I3NzgxYzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTQwM2IxMThkNDZkNGZkZWE4MGU2MzRiZTBiMmI4MWMgPSAkKCc8ZGl2IGlkPSJodG1sXzE0MDNiMTE4ZDQ2ZDRmZGVhODBlNjM0YmUwYjJiODFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FiOWYzZjI3M2I3NzRlMzk5ZjZmOTU1ZWNiNzc4MWM5LnNldENvbnRlbnQoaHRtbF8xNDAzYjExOGQ0NmQ0ZmRlYTgwZTYzNGJlMGIyYjgxYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNjdhMDE1NWE0YjQ0MjA3YTY5MDU0NmM3OWZiZmJmOC5iaW5kUG9wdXAocG9wdXBfYWI5ZjNmMjczYjc3NGUzOTlmNmY5NTVlY2I3NzgxYzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODc3MjY3NDgyY2I2NGU3N2I4ODI4MGM4MGNlMTFhMWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzM1MDAyNTQyOTc1NywtNzMuNzk2NzE2NzgwMjgzNDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzNiZGQwNDRmOTcxNDM2OGJmNmVmYTVjZTNiMWJlYjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTExNTEwNzdlZjI4NGJhODhmZjI3MWE2NjFmN2JmNmIgPSAkKCc8ZGl2IGlkPSJodG1sX2ExMTUxMDc3ZWYyODRiYTg4ZmYyNzFhNjYxZjdiZjZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VdG9waWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzNiZGQwNDRmOTcxNDM2OGJmNmVmYTVjZTNiMWJlYjguc2V0Q29udGVudChodG1sX2ExMTUxMDc3ZWYyODRiYTg4ZmYyNzFhNjYxZjdiZjZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg3NzI2NzQ4MmNiNjRlNzdiODgyODBjODBjZTExYTFkLmJpbmRQb3B1cChwb3B1cF8zM2JkZDA0NGY5NzE0MzY4YmY2ZWZhNWNlM2IxYmViOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OWUyZGI2YmUyMGE0NGM4OTcwMTVkZWIwMTBkOWRiNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDkzNjE4MDc1NDc4LC03My44MDQ4NjEyMDA0MDUzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NjdhNGZiMjgxZmU0ZmJhYjVkZDUzYTcyZWI5YjczYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZWU5Zjk2Yzg3ODQ0NmY0YjViZGNjMGIwZWFkYmE1NyA9ICQoJzxkaXYgaWQ9Imh0bWxfY2VlOWY5NmM4Nzg0NDZmNGI1YmRjYzBiMGVhZGJhNTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvbW9ub2ssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODY3YTRmYjI4MWZlNGZiYWI1ZGQ1M2E3MmViOWI3M2Euc2V0Q29udGVudChodG1sX2NlZTlmOTZjODc4NDQ2ZjRiNWJkY2MwYjBlYWRiYTU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ5ZTJkYjZiZTIwYTQ0Yzg5NzAxNWRlYjAxMGQ5ZGI1LmJpbmRQb3B1cChwb3B1cF84NjdhNGZiMjgxZmU0ZmJhYjVkZDUzYTcyZWI5YjczYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYzk1NzI5MTkzN2Q0MGUzOWUzZTExMGQ3ZDBhMTExZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MDMxNzM5Mjk5ODIsLTczLjg5NDY3OTk2MjcwNTc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I4MzdmNWQ5YjI3MDQ5YzZhMzAwZGFhY2JkZDEzYWQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q2MjhkNzMzYTFhNzQ1YjBhNjliNDY3OGE1M2JkOTY3ID0gJCgnPGRpdiBpZD0iaHRtbF9kNjI4ZDczM2ExYTc0NWIwYTY5YjQ2NzhhNTNiZDk2NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXN0b3JpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I4MzdmNWQ5YjI3MDQ5YzZhMzAwZGFhY2JkZDEzYWQ3LnNldENvbnRlbnQoaHRtbF9kNjI4ZDczM2ExYTc0NWIwYTY5YjQ2NzhhNTNiZDk2Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYzk1NzI5MTkzN2Q0MGUzOWUzZTExMGQ3ZDBhMTExZS5iaW5kUG9wdXAocG9wdXBfYjgzN2Y1ZDliMjcwNDljNmEzMDBkYWFjYmRkMTNhZDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTY2NzMzYjgwY2VmNDcxMTk2ODUzZmQ4OGVlYWUwM2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzE0MjgzNDE2MTU0OCwtNzMuOTAxMTk5MDMzODc2NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDc1ODQwY2E0NmFjNGMyYWE4ZjRmNzIyYjRiNjI2MDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzYyMDljYTg1ZjBiNDY4ZDhiYjVjMGI4NWU2ZjVlOTIgPSAkKCc8ZGl2IGlkPSJodG1sXzc2MjA5Y2E4NWYwYjQ2OGQ4YmI1YzBiODVlNmY1ZTkyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFyZW1vbnQgVmlsbGFnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3NTg0MGNhNDZhYzRjMmFhOGY0ZjcyMmI0YjYyNjA2LnNldENvbnRlbnQoaHRtbF83NjIwOWNhODVmMGI0NjhkOGJiNWMwYjg1ZTZmNWU5Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NjY3MzNiODBjZWY0NzExOTY4NTNmZDg4ZWVhZTAzYi5iaW5kUG9wdXAocG9wdXBfZDc1ODQwY2E0NmFjNGMyYWE4ZjRmNzIyYjRiNjI2MDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjYwMTU5NzQ2ODQ4NGExMGFjMWEwZTExYzdjZTFjYTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjQ3ODA0OTA4NDI5MDUsLTczLjkxNTg0NjUyNzU5MDA5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk0M2U0ZjBlOWVjNDRiNDFiMmY5NTI1MDI2ZDhhMTQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZmZTg5ODUwNDU0MDQ4NjZiNjMyYmQyZWY3MmNmZDkwID0gJCgnPGRpdiBpZD0iaHRtbF9mZmU4OTg1MDQ1NDA0ODY2YjYzMmJkMmVmNzJjZmQ5MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlIFZpbGxhZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NDNlNGYwZTllYzQ0YjQxYjJmOTUyNTAyNmQ4YTE0MS5zZXRDb250ZW50KGh0bWxfZmZlODk4NTA0NTQwNDg2NmI2MzJiZDJlZjcyY2ZkOTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjYwMTU5NzQ2ODQ4NGExMGFjMWEwZTExYzdjZTFjYTkuYmluZFBvcHVwKHBvcHVwXzk0M2U0ZjBlOWVjNDRiNDFiMmY5NTI1MDI2ZDhhMTQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFlNGUwYTMwZmVlNTQ4Yjg4Y2Q3OTMzODM4ODVlNTM1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzODI2MTc2NzE2NTQsLTczLjkxNjU1NTUxOTY0NDE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5Mzc5ODEzMDkxZDRjZTI4MzIxNzY4NGIwOWUwYTQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU0NWNlNGIxZjFkZDQ3YzE4NmRlYWU0ZDdiZDFjMWNmID0gJCgnPGRpdiBpZD0iaHRtbF81NDVjZTRiMWYxZGQ0N2MxODZkZWFlNGQ3YmQxYzFjZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW91bnQgRWRlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5Mzc5ODEzMDkxZDRjZTI4MzIxNzY4NGIwOWUwYTQxLnNldENvbnRlbnQoaHRtbF81NDVjZTRiMWYxZGQ0N2MxODZkZWFlNGQ3YmQxYzFjZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZTRlMGEzMGZlZTU0OGI4OGNkNzkzMzgzODg1ZTUzNS5iaW5kUG9wdXAocG9wdXBfYTkzNzk4MTMwOTFkNGNlMjgzMjE3Njg0YjA5ZTBhNDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzUyMTVmMjNmNjMzNGEwZGJhNjdiY2IwOWNmOTgwNzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDg4NDE2MDcyNDY2NSwtNzMuOTA4Mjk5MzA4ODE5ODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzZlZjgwMWM4MTUyNGVkNGE3YjI0ZmQ2ZjNiZjM5MDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGRiYTQ4YzZjMzgyNGI3NjhiZGVlMTBiOGJlMjVkOGYgPSAkKCc8ZGl2IGlkPSJodG1sXzBkYmE0OGM2YzM4MjRiNzY4YmRlZTEwYjhiZTI1ZDhmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3VudCBIb3BlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzZlZjgwMWM4MTUyNGVkNGE3YjI0ZmQ2ZjNiZjM5MDAuc2V0Q29udGVudChodG1sXzBkYmE0OGM2YzM4MjRiNzY4YmRlZTEwYjhiZTI1ZDhmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1MjE1ZjIzZjYzMzRhMGRiYTY3YmNiMDljZjk4MDcwLmJpbmRQb3B1cChwb3B1cF8zNmVmODAxYzgxNTI0ZWQ0YTdiMjRmZDZmM2JmMzkwMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZjVhMGNmNjk2YTM0NjIzOTk5MGUyOGYyMzFhY2QwMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MDI4MDMzMTMxMzc0LC03My45NjM1NTYxNDA5NDMwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iN2IzM2ExNTRjNTM0OTYwYjMzMzVlOWNlYTYzODJjNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMTc3ZDE1ZWM0OTE0OWViOGRhNzcwN2FkMTdhYTRmZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzE3N2QxNWVjNDkxNDllYjhkYTc3MDdhZDE3YWE0ZmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1dHRvbiBQbGFjZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iN2IzM2ExNTRjNTM0OTYwYjMzMzVlOWNlYTYzODJjNi5zZXRDb250ZW50KGh0bWxfYzE3N2QxNWVjNDkxNDllYjhkYTc3MDdhZDE3YWE0ZmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWY1YTBjZjY5NmEzNDYyMzk5OTBlMjhmMjMxYWNkMDIuYmluZFBvcHVwKHBvcHVwX2I3YjMzYTE1NGM1MzQ5NjBiMzMzNWU5Y2VhNjM4MmM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA2OTAxZjk2YzM2MTQwNDg4ZTVhODFiMjMwMzA0M2M5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQzNDE0MDkwMDczNTM2LC03My45NTM4Njc4MjEzMDc0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMTA3NzQyMzk1ZWE0MDJjYmM1YzgxNDNmNmVkZmE2YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MGNkYzM4ZDA4NDQ0YTg1YjZhZGE5MDlkMzgyNjc3ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDBjZGMzOGQwODQ0NGE4NWI2YWRhOTA5ZDM4MjY3N2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bnRlcnMgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTEwNzc0MjM5NWVhNDAyY2JjNWM4MTQzZjZlZGZhNmMuc2V0Q29udGVudChodG1sXzQwY2RjMzhkMDg0NDRhODViNmFkYTkwOWQzODI2NzdkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA2OTAxZjk2YzM2MTQwNDg4ZTVhODFiMjMwMzA0M2M5LmJpbmRQb3B1cChwb3B1cF8xMTA3NzQyMzk1ZWE0MDJjYmM1YzgxNDNmNmVkZmE2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZmIwOGZhYjMwNTU0NzY1YjIxZTNiOTk0ZWE4MDhhYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1MjA0MjM2OTUwNzIyLC03My45Njc3MDgyNDU4MTgzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYmEyMDUxZDBiOWE0NWMwYTM4ZjYyNzFjNjU3NzE0ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMjMzMDVjNDI4ZTY0NzdmYTIwZjU1MzVlMGYyY2ZjNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjIzMzA1YzQyOGU2NDc3ZmEyMGY1NTM1ZTBmMmNmYzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlR1cnRsZSBCYXksIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWJhMjA1MWQwYjlhNDVjMGEzOGY2MjcxYzY1NzcxNGYuc2V0Q29udGVudChodG1sXzIyMzMwNWM0MjhlNjQ3N2ZhMjBmNTUzNWUwZjJjZmM0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FmYjA4ZmFiMzA1NTQ3NjViMjFlM2I5OTRlYTgwOGFiLmJpbmRQb3B1cChwb3B1cF8xYmEyMDUxZDBiOWE0NWMwYTM4ZjYyNzFjNjU3NzE0Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OGM3ZTBhZGM3MTQ0Yzc1OTU1NWU1M2I0NjgxN2QzNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTdlOWNhMTM4MjIwNDU0MGFkOTZjYzY5YWI2MjQzNjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmFiNzEwNjRmOTUxNDAzZjk5OWM3MDIwMGI3ZTQ1NmMgPSAkKCc8ZGl2IGlkPSJodG1sXzZhYjcxMDY0Zjk1MTQwM2Y5OTljNzAyMDBiN2U0NTZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E3ZTljYTEzODIyMDQ1NDBhZDk2Y2M2OWFiNjI0MzYwLnNldENvbnRlbnQoaHRtbF82YWI3MTA2NGY5NTE0MDNmOTk5YzcwMjAwYjdlNDU2Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80OGM3ZTBhZGM3MTQ0Yzc1OTU1NWU1M2I0NjgxN2QzNS5iaW5kUG9wdXAocG9wdXBfYTdlOWNhMTM4MjIwNDU0MGFkOTZjYzY5YWI2MjQzNjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzYxMzYxMWU1NDRjNDBhNTg1MDlmYTJhMTk5MDUxZmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzA5OTk1NTQ3NzA2MSwtNzMuOTc0MDUxNzA0NjkyMDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODg5ODgwOTVmN2Q5NGNlNzg5NTEyZDBhODI4ODZlZmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDcyYWI2NmYxOTNmNDY3Njk5ZDUzMzdjMDZjNjg2MGIgPSAkKCc8ZGl2IGlkPSJodG1sXzQ3MmFiNjZmMTkzZjQ2NzY5OWQ1MzM3YzA2YzY4NjBiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHV5dmVzYW50IFRvd24sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODg5ODgwOTVmN2Q5NGNlNzg5NTEyZDBhODI4ODZlZmIuc2V0Q29udGVudChodG1sXzQ3MmFiNjZmMTkzZjQ2NzY5OWQ1MzM3YzA2YzY4NjBiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM2MTM2MTFlNTQ0YzQwYTU4NTA5ZmEyYTE5OTA1MWZjLmJpbmRQb3B1cChwb3B1cF84ODk4ODA5NWY3ZDk0Y2U3ODk1MTJkMGE4Mjg4NmVmYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZmI3YjU3MWRhOGE0MDJmYTJjZjIxNmRhYWNkZjY3NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczOTY3MzA0NzYzODQyNiwtNzMuOTkwOTQ3MTA1MjgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNTNhNjg3ODhiZDc0NzEyYjM4Yjc2NTgxNDY3NGM0NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNjEwMmVmN2YzOTE0YTM5YWJhNjZmZDg5YjVhNmE0MiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTYxMDJlZjdmMzkxNGEzOWFiYTY2ZmQ4OWI1YTZhNDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZsYXRpcm9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E1M2E2ODc4OGJkNzQ3MTJiMzhiNzY1ODE0Njc0YzQ3LnNldENvbnRlbnQoaHRtbF8xNjEwMmVmN2YzOTE0YTM5YWJhNjZmZDg5YjVhNmE0Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZmI3YjU3MWRhOGE0MDJmYTJjZjIxNmRhYWNkZjY3NC5iaW5kUG9wdXAocG9wdXBfYTUzYTY4Nzg4YmQ3NDcxMmIzOGI3NjU4MTQ2NzRjNDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzE4ZDhlNDU3ZDk2NDViMGJiOGRjYTllYmFlYmQzZTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDU2NTE4MDYwODA3NiwtNzMuOTE4MTkyODY0MzE2ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODBjZjY1YjY0NWIzNDM2ODk3ZWYzODQ0MGFiMjYxYmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWE2OTVjNzhhZjUyNDA2YzhkNDY0OTRlNTRiMTg5NzAgPSAkKCc8ZGl2IGlkPSJodG1sX2VhNjk1Yzc4YWY1MjQwNmM4ZDQ2NDk0ZTU0YjE4OTcwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUgR2FyZGVucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MGNmNjViNjQ1YjM0MzY4OTdlZjM4NDQwYWIyNjFiZi5zZXRDb250ZW50KGh0bWxfZWE2OTVjNzhhZjUyNDA2YzhkNDY0OTRlNTRiMTg5NzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzE4ZDhlNDU3ZDk2NDViMGJiOGRjYTllYmFlYmQzZTcuYmluZFBvcHVwKHBvcHVwXzgwY2Y2NWI2NDViMzQzNjg5N2VmMzg0NDBhYjI2MWJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZjNzJkMjQ1YTk5OTQ0YzA5NzNjZGU5MWYxNWM2NzEzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjUwNzE2OTQ0OTcsLTczLjkzMjQ0MjM1MjYwMTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3YWFmM2ZmOWZmNTRmYWQ4MWRiMTYxYjBkOWUyNTZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYyMDViMWJiNTI0NjRmMTY4YjBlOTk4MmRlY2U1N2I5ID0gJCgnPGRpdiBpZD0iaHRtbF82MjA1YjFiYjUyNDY0ZjE2OGIwZTk5ODJkZWNlNTdiOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qmxpc3N2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84N2FhZjNmZjlmZjU0ZmFkODFkYjE2MWIwZDllMjU2Yy5zZXRDb250ZW50KGh0bWxfNjIwNWIxYmI1MjQ2NGYxNjhiMGU5OTgyZGVjZTU3YjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmM3MmQyNDVhOTk5NDRjMDk3M2NkZTkxZjE1YzY3MTMuYmluZFBvcHVwKHBvcHVwXzg3YWFmM2ZmOWZmNTRmYWQ4MWRiMTYxYjBkOWUyNTZjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E3Y2FmN2RiYzdjMDQ2ZWI5MDU0MmE1ODQ3ZjJlZjU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzAzMjgxMDkwOTMwMTQsLTczLjk5NTUwNzUxODg4NDE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc3NTcwNTg0MWY3NjQ3NGRhODY1MzRlNjlhOWFhOWY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIwMzdlYjhhNDg5OTRiNDY5ZWU2Mzk1OTEzNmVkZmE1ID0gJCgnPGRpdiBpZD0iaHRtbF8yMDM3ZWI4YTQ4OTk0YjQ2OWVlNjM5NTkxMzZlZGZhNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnVsdG9uIEZlcnJ5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzc1NzA1ODQxZjc2NDc0ZGE4NjUzNGU2OWE5YWE5ZjUuc2V0Q29udGVudChodG1sXzIwMzdlYjhhNDg5OTRiNDY5ZWU2Mzk1OTEzNmVkZmE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E3Y2FmN2RiYzdjMDQ2ZWI5MDU0MmE1ODQ3ZjJlZjU4LmJpbmRQb3B1cChwb3B1cF83NzU3MDU4NDFmNzY0NzRkYTg2NTM0ZTY5YTlhYTlmNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iN2Y5ZjJkYzIyMjg0NzJlODc0MTMxMzYyNGUyYmVjNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzMyMTQ5ODgyODc0LC03My45ODExMTYwMzU5MjM5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMmFmMzM1OGI4Zjc0NjRmOGM0NGZjNTAzOWE5OTBiNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOGEwZjE5ZDZmY2Q0ZjU3YjhmYjlkNmQzODQ0YmYzNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDhhMGYxOWQ2ZmNkNGY1N2I4ZmI5ZDZkMzg0NGJmMzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZpbmVnYXIgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MyYWYzMzU4YjhmNzQ2NGY4YzQ0ZmM1MDM5YTk5MGI3LnNldENvbnRlbnQoaHRtbF8wOGEwZjE5ZDZmY2Q0ZjU3YjhmYjlkNmQzODQ0YmYzNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iN2Y5ZjJkYzIyMjg0NzJlODc0MTMxMzYyNGUyYmVjNC5iaW5kUG9wdXAocG9wdXBfYzJhZjMzNThiOGY3NDY0ZjhjNDRmYzUwMzlhOTkwYjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzk4MzU4OGEyMGViNDIwNGFjYjcxMjdlYjE0Y2I4MTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzUwMzk4NjUwMzIzNywtNzMuOTMwNTMxMDg4MTczMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGYyZDc1NGVmZTg5NGRiYTgzNjFlZTZhMzdiZTg4NDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDcwYTM4ZmM3NzM0NGNjYmEzMzljNmZiYjBmYmZjZTMgPSAkKCc8ZGl2IGlkPSJodG1sXzQ3MGEzOGZjNzczNDRjY2JhMzM5YzZmYmIwZmJmY2UzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZWVrc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGYyZDc1NGVmZTg5NGRiYTgzNjFlZTZhMzdiZTg4NDguc2V0Q29udGVudChodG1sXzQ3MGEzOGZjNzczNDRjY2JhMzM5YzZmYmIwZmJmY2UzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M5ODM1ODhhMjBlYjQyMDRhY2I3MTI3ZWIxNGNiODExLmJpbmRQb3B1cChwb3B1cF8wZjJkNzU0ZWZlODk0ZGJhODM2MWVlNmEzN2JlODg0OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MjdhOTI0ODVjNjY0NzEzYjkzNGI5MzZhZDU5YjZkNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3Nzg2MTA0NzY5NTMxLC03My45MDMzMTY4NDg1MjU5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZjlkYjM4NDNhMDI0ZTM0YmZjM2NiOWNmNjg2ZDkyNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMjU0M2YzYzZiYjk0YTE0OWJjM2ZkYzYzMjRjZmRlNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjI1NDNmM2M2YmI5NGExNDliYzNmZGM2MzI0Y2ZkZTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb2Fkd2F5IEp1bmN0aW9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmY5ZGIzODQzYTAyNGUzNGJmYzNjYjljZjY4NmQ5Mjcuc2V0Q29udGVudChodG1sX2IyNTQzZjNjNmJiOTRhMTQ5YmMzZmRjNjMyNGNmZGU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQyN2E5MjQ4NWM2NjQ3MTNiOTM0YjkzNmFkNTliNmQ3LmJpbmRQb3B1cChwb3B1cF8yZjlkYjM4NDNhMDI0ZTM0YmZjM2NiOWNmNjg2ZDkyNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YjNjZTg0MDczYjg0NTI1YTJkMWViZTM0Y2NiODZiYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzE3NjMyODIyNjkyLC03My45ODg3NTI4MDc0NTA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RmY2UxYzljNDA5ZTRjNzJhODE4MWUxNTE4NGIyNzFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNlMzYxMWIzYmVjYTRkNDliYjFmMmM2OGVhZjYwNjFiID0gJCgnPGRpdiBpZD0iaHRtbF8zZTM2MTFiM2JlY2E0ZDQ5YmIxZjJjNjhlYWY2MDYxYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RHVtYm8sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZmNlMWM5YzQwOWU0YzcyYTgxODFlMTUxODRiMjcxZi5zZXRDb250ZW50KGh0bWxfM2UzNjExYjNiZWNhNGQ0OWJiMWYyYzY4ZWFmNjA2MWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGIzY2U4NDA3M2I4NDUyNWEyZDFlYmUzNGNjYjg2YmMuYmluZFBvcHVwKHBvcHVwX2RmY2UxYzljNDA5ZTRjNzJhODE4MWUxNTE4NGIyNzFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZhMzEwMjZkZjA1ODQxMjQ5ZWQzZjk5NmQzOWZkMmFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjAxODA5NTc2MzE0NDQsLTc0LjEyMDU5Mzk5NzE4MDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAzNDNiODg3ZjhhYzQ5MTk4ZjNjYWZmODY0YThlMjQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVmYjVlZWFkNGJmMjQ0YWVhNTc4ZTE0OTdkODhkOGJhID0gJCgnPGRpdiBpZD0iaHRtbF81ZmI1ZWVhZDRiZjI0NGFlYTU3OGUxNDk3ZDg4ZDhiYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFub3IgSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDM0M2I4ODdmOGFjNDkxOThmM2NhZmY4NjRhOGUyNDEuc2V0Q29udGVudChodG1sXzVmYjVlZWFkNGJmMjQ0YWVhNTc4ZTE0OTdkODhkOGJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZhMzEwMjZkZjA1ODQxMjQ5ZWQzZjk5NmQzOWZkMmFhLmJpbmRQb3B1cChwb3B1cF8wMzQzYjg4N2Y4YWM0OTE5OGYzY2FmZjg2NGE4ZTI0MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NWY4MDc1Yzg3M2Y0NWJmYWFkOGNkOTFlNzZhYTc0NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzcwNjkyNjI3MzcxLC03NC4xMzIwODQ0NzQ4NDI5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MTc4MWZjNzA0ZDA0NTM4YTQ2YmQxZmYzMmYzNDAxYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMzM0MzlkN2RhYzE0MWNiOWM5NjkzYWM4MmYxNDg5NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDMzNDM5ZDdkYWMxNDFjYjljOTY5M2FjODJmMTQ4OTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxvd2Jyb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MTc4MWZjNzA0ZDA0NTM4YTQ2YmQxZmYzMmYzNDAxYy5zZXRDb250ZW50KGh0bWxfZDMzNDM5ZDdkYWMxNDFjYjljOTY5M2FjODJmMTQ4OTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDVmODA3NWM4NzNmNDViZmFhZDhjZDkxZTc2YWE3NDUuYmluZFBvcHVwKHBvcHVwXzYxNzgxZmM3MDRkMDQ1MzhhNDZiZDFmZjMyZjM0MDFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA3ZWIwNDYwMDIzNDQyZjBiY2JjOGQzNzMxNThlY2Y2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQxMTM5OTIyMDkxNzY2LC03NC4yMTc3NjYzNjA2ODU2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ODdmYzU1YWY2NDk0M2ZkYWNkOGY2YTE2YWE4MmNkNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMTg0YTRiNTYxMjI0NGYwOTNmNjk5ZmQxMzcyYmFiZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjE4NGE0YjU2MTIyNDRmMDkzZjY5OWZkMTM3MmJhYmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbmR5IEdyb3VuZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzg3ZmM1NWFmNjQ5NDNmZGFjZDhmNmExNmFhODJjZDQuc2V0Q29udGVudChodG1sX2YxODRhNGI1NjEyMjQ0ZjA5M2Y2OTlmZDEzNzJiYWJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA3ZWIwNDYwMDIzNDQyZjBiY2JjOGQzNzMxNThlY2Y2LmJpbmRQb3B1cChwb3B1cF83ODdmYzU1YWY2NDk0M2ZkYWNkOGY2YTE2YWE4MmNkNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MjJiMDNkOWViMzg0ODA0ODA2OWVkZDhhMjU4ZjYwNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3OTExODc0Mjk2MTIxNCwtNzQuMTI3MjcyNDA2MDQ5NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTE0OTY3MjQ3NmI4NDY4ZWEwMjViNmJjMWQ4OTBmNDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDRkYWIyYWFiNDkzNDU1ZDlkYzg5NWYyNTk2NjY4MzUgPSAkKCc8ZGl2IGlkPSJodG1sXzQ0ZGFiMmFhYjQ5MzQ1NWQ5ZGM4OTVmMjU5NjY2ODM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZ2JlcnR2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTE0OTY3MjQ3NmI4NDY4ZWEwMjViNmJjMWQ4OTBmNDkuc2V0Q29udGVudChodG1sXzQ0ZGFiMmFhYjQ5MzQ1NWQ5ZGM4OTVmMjU5NjY2ODM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYyMmIwM2Q5ZWIzODQ4MDQ4MDY5ZWRkOGEyNThmNjA3LmJpbmRQb3B1cChwb3B1cF8xMTQ5NjcyNDc2Yjg0NjhlYTAyNWI2YmMxZDg5MGY0OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMDA0ODdlYTRlODY0ZjY1YTdlYmI1MGQ4ZjFkYWNmMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU2NzM3NTg4OTU3MDMyLC03My44OTIxMzc2MDIzMjgyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NTA5OWRjYzIxMzk0NDgzYmNlZjNiNDNjODhhNGFlZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNWFmOTY5YjExMTU0ZDNjOGUxMTRhZWY3MGQ2NDc3MyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjVhZjk2OWIxMTE1NGQzYzhlMTE0YWVmNzBkNjQ3NzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJveGJ1cnksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODUwOTlkY2MyMTM5NDQ4M2JjZWYzYjQzYzg4YTRhZWYuc2V0Q29udGVudChodG1sX2I1YWY5NjliMTExNTRkM2M4ZTExNGFlZjcwZDY0NzczKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEwMDQ4N2VhNGU4NjRmNjVhN2ViYjUwZDhmMWRhY2YwLmJpbmRQb3B1cChwb3B1cF84NTA5OWRjYzIxMzk0NDgzYmNlZjNiNDNjODhhNGFlZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NDg5YjhmOWEzMGQ0NzM4ODc2YjIyNTQ0ZjBkMmMzOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5ODUyNTA5NTEzNzI1NSwtNzMuOTU5MTg0NTk0Mjg3MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDcwNzhlZjk2Y2IyNGU4YTgxOTE0YzU0OTNkZDU5ZjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDQyZDIxNDIxNjA4NDJhOGFmNDBhMGQzZjNjODNiYTEgPSAkKCc8ZGl2IGlkPSJodG1sXzA0MmQyMTQyMTYwODQyYThhZjQwYTBkM2YzYzgzYmExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib21lY3Jlc3QsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNzA3OGVmOTZjYjI0ZThhODE5MTRjNTQ5M2RkNTlmNS5zZXRDb250ZW50KGh0bWxfMDQyZDIxNDIxNjA4NDJhOGFmNDBhMGQzZjNjODNiYTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTQ4OWI4ZjlhMzBkNDczODg3NmIyMjU0NGYwZDJjMzguYmluZFBvcHVwKHBvcHVwX2Q3MDc4ZWY5NmNiMjRlOGE4MTkxNGM1NDkzZGQ1OWY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBkMmQzMTgxNDA3YTQxZGViYzA1NGIwNmMxZjBlMmM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE2NDE0NTExMTU4MTg1LC03My44ODExNDMxOTIwMDYwNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NTZjOWYwNzEzOTA0MzVhOTVmMmExZmQ3ZjI0MjM5OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYmRkZDVkNDAxNGI0Zjg0YjNjNDIxYTUwYjI1ODcyMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMWJkZGQ1ZDQwMTRiNGY4NGIzYzQyMWE1MGIyNTg3MjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGRsZSBWaWxsYWdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc1NmM5ZjA3MTM5MDQzNWE5NWYyYTFmZDdmMjQyMzk4LnNldENvbnRlbnQoaHRtbF8xYmRkZDVkNDAxNGI0Zjg0YjNjNDIxYTUwYjI1ODcyMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZDJkMzE4MTQwN2E0MWRlYmMwNTRiMDZjMWYwZTJjNy5iaW5kUG9wdXAocG9wdXBfNzU2YzlmMDcxMzkwNDM1YTk1ZjJhMWZkN2YyNDIzOTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmQ4NDZhMDBiZDY4NDBmMTk5YmZhYTVjNzRmYWQ0NDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MjYyNjQwNjczNDgxMiwtNzQuMjAxNTI1NTY0NTc2NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWE5OTg3OTc5ZjVmNDJmODllODRmNTliOTIxMGZlYTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzY3ZTdlMWZiMmEyNGYwMDlhM2ViZDgwNGU4MWQyNmUgPSAkKCc8ZGl2IGlkPSJodG1sXzc2N2U3ZTFmYjJhMjRmMDA5YTNlYmQ4MDRlODFkMjZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QcmluY2UmIzM5O3MgQmF5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTk5ODc5NzlmNWY0MmY4OWU4NGY1OWI5MjEwZmVhNC5zZXRDb250ZW50KGh0bWxfNzY3ZTdlMWZiMmEyNGYwMDlhM2ViZDgwNGU4MWQyNmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmQ4NDZhMDBiZDY4NDBmMTk5YmZhYTVjNzRmYWQ0NDEuYmluZFBvcHVwKHBvcHVwX2FhOTk4Nzk3OWY1ZjQyZjg5ZTg0ZjU5YjkyMTBmZWE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNiODNmODlmMDQ4MTQ1ZDRiYTc0NzVhMjQ4M2UwYzE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2NTA2MjkzNzk0ODksLTc0LjEzNzkyNjYzNzcxNTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJlOThiNzkwMjQwMTQ2N2I5YWEzNzg5ODA4ZjRmMzcwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZkNTRiOTI0OWZhMDRjOGFiMWIyYTdhNzg3MDhiYjdjID0gJCgnPGRpdiBpZD0iaHRtbF9mZDU0YjkyNDlmYTA0YzhhYjFiMmE3YTc4NzA4YmI3YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGlnaHRob3VzZSBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZTk4Yjc5MDI0MDE0NjdiOWFhMzc4OTgwOGY0ZjM3MC5zZXRDb250ZW50KGh0bWxfZmQ1NGI5MjQ5ZmEwNGM4YWIxYjJhN2E3ODcwOGJiN2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2I4M2Y4OWYwNDgxNDVkNGJhNzQ3NWEyNDgzZTBjMTcuYmluZFBvcHVwKHBvcHVwXzJlOThiNzkwMjQwMTQ2N2I5YWEzNzg5ODA4ZjRmMzcwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VhM2FhMDQ4MTY3MzQ1OGRhYzU1NDM5MTJjZGRkNjMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTE5NTQxNDU3NDg5MDksLTc0LjIyOTU3MDgwNjI2OTQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk2MzhlMWI5ZjI0ZjQ0NDliM2RhZjM0NzE3MTRjYTk5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg3MjgzZmRhNzY5ZDQ2NTdhY2NlODMzY2U5ZTg0ZDBiID0gJCgnPGRpdiBpZD0iaHRtbF84NzI4M2ZkYTc2OWQ0NjU3YWNjZTgzM2NlOWU4NGQwYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmljaG1vbmQgVmFsbGV5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NjM4ZTFiOWYyNGY0NDQ5YjNkYWYzNDcxNzE0Y2E5OS5zZXRDb250ZW50KGh0bWxfODcyODNmZGE3NjlkNDY1N2FjY2U4MzNjZTllODRkMGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWEzYWEwNDgxNjczNDU4ZGFjNTU0MzkxMmNkZGQ2MzIuYmluZFBvcHVwKHBvcHVwXzk2MzhlMWI5ZjI0ZjQ0NDliM2RhZjM0NzE3MTRjYTk5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0MTIyOTg0YTEyZjQzODRhNjUwNzk1YzQ2MTZkZmVjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkwNjAxNTU2NzAxNDgsLTczLjgyNjY3NzU3MTM4NjQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk4OTk4NjI1MTZjYTRlMTA4NjQyNWI0NWE1N2ExYzRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQxMjU2YzI3YmZkOTRkMzA4NTU2ZTA0NTI3NThiMTU3ID0gJCgnPGRpdiBpZD0iaHRtbF80MTI1NmMyN2JmZDk0ZDMwODU1NmUwNDUyNzU4YjE1NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFsYmEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTg5OTg2MjUxNmNhNGUxMDg2NDI1YjQ1YTU3YTFjNGUuc2V0Q29udGVudChodG1sXzQxMjU2YzI3YmZkOTRkMzA4NTU2ZTA0NTI3NThiMTU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y0MTIyOTg0YTEyZjQzODRhNjUwNzk1YzQ2MTZkZmVjLmJpbmRQb3B1cChwb3B1cF85ODk5ODYyNTE2Y2E0ZTEwODY0MjViNDVhNTdhMWM0ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NGVlMWQ4ZmY1ZjA0NDkyODk3NDQ0YTgwYTExNzgzMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4MTk5ODkzNDUxNzMsLTczLjg5MDM0NTcwOTg3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMjAyMGRlYjg3NmI0NmMxOWViY2I4ZDQyNzFmMDViZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yOGM4M2Q2NzVkYWQ0M2MyODJiNDExODFiMGI0NjBiNSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjhjODNkNjc1ZGFkNDNjMjgyYjQxMTgxYjBiNDYwYjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2hsYW5kIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMjAyMGRlYjg3NmI0NmMxOWViY2I4ZDQyNzFmMDViZC5zZXRDb250ZW50KGh0bWxfMjhjODNkNjc1ZGFkNDNjMjgyYjQxMTgxYjBiNDYwYjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODRlZTFkOGZmNWYwNDQ5Mjg5NzQ0NGE4MGExMTc4MzAuYmluZFBvcHVwKHBvcHVwX2EyMDIwZGViODc2YjQ2YzE5ZWJjYjhkNDI3MWYwNWJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JmNGY5N2EwMTVmZDQ3MjlhZThlNTFlYjM2MjY3MGY5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5Mzc3NzAxMTM3NjYsLTczLjk0ODQxNTE1MzI4ODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RlMWFkMTNmYmVhMzQxNjRiMTdhZmFjOTRiODdlNjEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAyY2VjNDFjODY1MDRjNWQ4NTQzOTU4YjIzMzM3NDdkID0gJCgnPGRpdiBpZD0iaHRtbF8wMmNlYzQxYzg2NTA0YzVkODU0Mzk1OGIyMzMzNzQ3ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFkaXNvbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RlMWFkMTNmYmVhMzQxNjRiMTdhZmFjOTRiODdlNjEwLnNldENvbnRlbnQoaHRtbF8wMmNlYzQxYzg2NTA0YzVkODU0Mzk1OGIyMzMzNzQ3ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZjRmOTdhMDE1ZmQ0NzI5YWU4ZTUxZWIzNjI2NzBmOS5iaW5kUG9wdXAocG9wdXBfZGUxYWQxM2ZiZWEzNDE2NGIxN2FmYWM5NGI4N2U2MTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTczOTYwMGQ1ZTZiNDVmMjhmYjI3NGRhOGJhYzE1NTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTI3MjI5NzYzMzAxNywtNzMuODYxNzI1Nzc1NTUxMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzcyZGU2Zjg1YjY5NDMxNGJmYzc5MWJmODM5M2Y5NjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTAxNzVlMjhmNTQ3NDllZDhiOWZhYmY2ZTlkZTVkNDUgPSAkKCc8ZGl2IGlkPSJodG1sXzEwMTc1ZTI4ZjU0NzQ5ZWQ4YjlmYWJmNmU5ZGU1ZDQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9ueGRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNzJkZTZmODViNjk0MzE0YmZjNzkxYmY4MzkzZjk2NS5zZXRDb250ZW50KGh0bWxfMTAxNzVlMjhmNTQ3NDllZDhiOWZhYmY2ZTlkZTVkNDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTczOTYwMGQ1ZTZiNDVmMjhmYjI3NGRhOGJhYzE1NTkuYmluZFBvcHVwKHBvcHVwX2M3MmRlNmY4NWI2OTQzMTRiZmM3OTFiZjgzOTNmOTY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U4ZGJiZWU1ZjJkYzQ4ZmY5YTgwOGNjMmMwYTdhNzlhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODY1Nzg3ODc4MDI5ODIsLTczLjg1OTMxODYzMjIxNjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU0Y2YxYjE4NDBlNDQzMzM5ODJmMGIxZjdhM2E2NzY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M3M2Y0ZDk0ZGI3ZTRhOWY4NGU3OGI0ZDQ0NTk5ZjZhID0gJCgnPGRpdiBpZD0iaHRtbF9jNzNmNGQ5NGRiN2U0YTlmODRlNzhiNGQ0NDU5OWY2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxsZXJ0b24sIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NGNmMWIxODQwZTQ0MzMzOTgyZjBiMWY3YTNhNjc2Ni5zZXRDb250ZW50KGh0bWxfYzczZjRkOTRkYjdlNGE5Zjg0ZTc4YjRkNDQ1OTlmNmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZThkYmJlZTVmMmRjNDhmZjlhODA4Y2MyYzBhN2E3OWEuYmluZFBvcHVwKHBvcHVwXzU0Y2YxYjE4NDBlNDQzMzM5ODJmMGIxZjdhM2E2NzY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE3YzU0NDg0OGRkODQ3MDI4YzMzMzJlMWJiMzJhNmNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODcwMzkyMzkxNDE0NywtNzMuOTAxNTIyNjQ1MTMxNDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjdlYmI5N2ZkYjNkNGQ3YmIyYjYzYzIxMjY3MTgzMzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWM5OGM2MGQxMmU0NDJiZGE3OTEyN2FlNTMzN2RiMTQgPSAkKCc8ZGl2IGlkPSJodG1sX2VjOThjNjBkMTJlNDQyYmRhNzkxMjdhZTUzMzdkYjE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LaW5nc2JyaWRnZSBIZWlnaHRzLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjdlYmI5N2ZkYjNkNGQ3YmIyYjYzYzIxMjY3MTgzMzguc2V0Q29udGVudChodG1sX2VjOThjNjBkMTJlNDQyYmRhNzkxMjdhZTUzMzdkYjE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE3YzU0NDg0OGRkODQ3MDI4YzMzMzJlMWJiMzJhNmNiLmJpbmRQb3B1cChwb3B1cF8yN2ViYjk3ZmRiM2Q0ZDdiYjJiNjNjMjEyNjcxODMzOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kY2ViNjg5M2QwYTQ0MDU1OTYyMWNlYjBkOWViNjQwNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NjkyNjA2NjU4NTc5LC03My45NDgxNzcwOTkyMDE4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NDU4OTVjN2VkZWI0MTZlYWEyNDg1MzhlY2ZiM2JlOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNTM2NGM5ODZlZWE0MDM4YTQ2MjBhZjI3OWM1ZjY1OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMDNjNDUyZjRjNDg0ZTQ2YmZjOGQ5NDkyY2UzZGMzMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjAzYzQ1MmY0YzQ4NGU0NmJmYzhkOTQ5MmNlM2RjMzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVyYXNtdXMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNTM2NGM5ODZlZWE0MDM4YTQ2MjBhZjI3OWM1ZjY1OS5zZXRDb250ZW50KGh0bWxfMjAzYzQ1MmY0YzQ4NGU0NmJmYzhkOTQ5MmNlM2RjMzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGNlYjY4OTNkMGE0NDA1NTk2MjFjZWIwZDllYjY0MDQuYmluZFBvcHVwKHBvcHVwX2M1MzY0Yzk4NmVlYTQwMzhhNDYyMGFmMjc5YzVmNjU5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZjMjExMTZlMDJjMTRmN2NhZDgyMGJjOTVmNzQ5YzVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU2NjU4MDgyMjc1MTksLTc0LjAwMDExMTM2MjAyNjM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY5OGVhMjVkZWMwMDRmNGE4MzhhY2FiMGIyYzY3NjJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc1OWI3YzVjNWIyOTQxNjM5ZjdjZGFjZDMwODQyMDZhID0gJCgnPGRpdiBpZD0iaHRtbF83NTliN2M1YzViMjk0MTYzOWY3Y2RhY2QzMDg0MjA2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVkc29uIFlhcmRzLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY5OGVhMjVkZWMwMDRmNGE4MzhhY2FiMGIyYzY3NjJkLnNldENvbnRlbnQoaHRtbF83NTliN2M1YzViMjk0MTYzOWY3Y2RhY2QzMDg0MjA2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYzIxMTE2ZTAyYzE0ZjdjYWQ4MjBiYzk1Zjc0OWM1YS5iaW5kUG9wdXAocG9wdXBfNjk4ZWEyNWRlYzAwNGY0YTgzOGFjYWIwYjJjNjc2MmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjc5YWYyMjA2ODVhNDMwMjgyNGY5MDZmNjdhYmM1N2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODczMzc3NDAxODc0MSwtNzMuODA1NTMwMDI5Njg3MThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWFiMzc0Yzk2N2EzNGU1ZGEyMDMyNDNlZjg2OWVmOGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjJhMzdmYTIyNjMwNDFkNzljMTQ4NDY3NTNmNmNjNjcgPSAkKCc8ZGl2IGlkPSJodG1sX2YyYTM3ZmEyMjYzMDQxZDc5YzE0ODQ2NzUzZjZjYzY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYW1tZWxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVhYjM3NGM5NjdhMzRlNWRhMjAzMjQzZWY4NjllZjhhLnNldENvbnRlbnQoaHRtbF9mMmEzN2ZhMjI2MzA0MWQ3OWMxNDg0Njc1M2Y2Y2M2Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NzlhZjIyMDY4NWE0MzAyODI0ZjkwNmY2N2FiYzU3ZS5iaW5kUG9wdXAocG9wdXBfNWFiMzc0Yzk2N2EzNGU1ZGEyMDMyNDNlZjg2OWVmOGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzBhMDI0OWM5Yjg4NGE0ZDg0MGM1MWQ0ZWZjZDk4OGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTEzMjE2OTEyODM4MzQsLTczLjc2NTk2NzgxNDQ1NjI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IwY2Y1YTE3OTg2NDQwOTRiNTI0MGM0N2VlZjhjZDRhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkNjFlMDNkMGY1ZjQ3NTBiOWU5MGI4ZmIxMmY1NGU2ID0gJCgnPGRpdiBpZD0iaHRtbF8yZDYxZTAzZDBmNWY0NzUwYjllOTBiOGZiMTJmNTRlNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c3dhdGVyLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IwY2Y1YTE3OTg2NDQwOTRiNTI0MGM0N2VlZjhjZDRhLnNldENvbnRlbnQoaHRtbF8yZDYxZTAzZDBmNWY0NzUwYjllOTBiOGZiMTJmNTRlNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MGEwMjQ5YzliODg0YTRkODQwYzUxZDRlZmNkOTg4YS5iaW5kUG9wdXAocG9wdXBfYjBjZjVhMTc5ODY0NDA5NGI1MjQwYzQ3ZWVmOGNkNGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzM4ZWFhZGQ4NjNmNDFkNGI4NDdmNWZkNTA2MWUwMmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTYwOTEyOTcwOTQ3MDYsLTczLjk0NTYzMDcwMzM0MDkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0NTg5NWM3ZWRlYjQxNmVhYTI0ODUzOGVjZmIzYmU5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY3MmM5ZTY0N2IzZjQ5Y2I5NTJmYTQ5MTQyMmVjMDIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJmYmU5YmIyZDczNTQxMTM5YmUyYzE5ZWJjZjZlZjExID0gJCgnPGRpdiBpZD0iaHRtbF8yZmJlOWJiMmQ3MzU0MTEzOWJlMmMxOWViY2Y2ZWYxMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zYnJpZGdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY3MmM5ZTY0N2IzZjQ5Y2I5NTJmYTQ5MTQyMmVjMDIyLnNldENvbnRlbnQoaHRtbF8yZmJlOWJiMmQ3MzU0MTEzOWJlMmMxOWViY2Y2ZWYxMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MzhlYWFkZDg2M2Y0MWQ0Yjg0N2Y1ZmQ1MDYxZTAyZC5iaW5kUG9wdXAocG9wdXBfNjcyYzllNjQ3YjNmNDljYjk1MmZhNDkxNDIyZWMwMjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzY5ZTExYjNlZTFmNDVhMmJkN2MwMWQyYTM3MGFmZDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTczMTA3OTI1Mjk4MywtNzQuMDgxNzM5OTIyMTE5NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDQ1ODk1YzdlZGViNDE2ZWFhMjQ4NTM4ZWNmYjNiZTkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjNjMTE2NDA0MjM0NDIxMDk2MmFiNDhhODc1ZDYzNzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGY0NDRjZmExYWVmNDBjOWIyN2UzMTgyZDhkODVjNGIgPSAkKCc8ZGl2IGlkPSJodG1sXzBmNDQ0Y2ZhMWFlZjQwYzliMjdlMzE4MmQ4ZDg1YzRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3ggSGlsbHMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IzYzExNjQwNDIzNDQyMTA5NjJhYjQ4YTg3NWQ2Mzc2LnNldENvbnRlbnQoaHRtbF8wZjQ0NGNmYTFhZWY0MGM5YjI3ZTMxODJkOGQ4NWM0Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNjllMTFiM2VlMWY0NWEyYmQ3YzAxZDJhMzcwYWZkNS5iaW5kUG9wdXAocG9wdXBfYjNjMTE2NDA0MjM0NDIxMDk2MmFiNDhhODc1ZDYzNzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f946d345cc0>"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map of New York using latitude and longitude values\n",
"map_newyork = folium.Map(location=[latitude, longitude], zoom_start=10)\n",
"\n",
"# add markers to map\n",
"for lat, lng, borough, neighborhood in zip(neighborhoods['Latitude'], neighborhoods['Longitude'], neighborhoods['Borough'], neighborhoods['Neighborhood']):\n",
" label = '{}, {}'.format(neighborhood, borough)\n",
" label = folium.Popup(label, parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lng],\n",
" radius=5,\n",
" popup=label,\n",
" color='blue',\n",
" fill=True,\n",
" fill_color='#3186cc',\n",
" fill_opacity=0.7,\n",
" parse_html=False).add_to(map_newyork) \n",
" \n",
"map_newyork"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Folium** is a great visualization library. Feel free to zoom into the above map, and click on each circle mark to reveal the name of the neighborhood and its respective borough."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"However, for illustration purposes, let's simplify the above map and segment and cluster only the neighborhoods in Manhattan. So let's slice the original dataframe and create a new dataframe of the Manhattan data."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Manhattan</td>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.910660</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Manhattan</td>\n",
" <td>Chinatown</td>\n",
" <td>40.715618</td>\n",
" <td>-73.994279</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Manhattan</td>\n",
" <td>Washington Heights</td>\n",
" <td>40.851903</td>\n",
" <td>-73.936900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Manhattan</td>\n",
" <td>Inwood</td>\n",
" <td>40.867684</td>\n",
" <td>-73.921210</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Manhattan</td>\n",
" <td>Hamilton Heights</td>\n",
" <td>40.823604</td>\n",
" <td>-73.949688</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Neighborhood Latitude Longitude\n",
"0 Manhattan Marble Hill 40.876551 -73.910660\n",
"1 Manhattan Chinatown 40.715618 -73.994279\n",
"2 Manhattan Washington Heights 40.851903 -73.936900\n",
"3 Manhattan Inwood 40.867684 -73.921210\n",
"4 Manhattan Hamilton Heights 40.823604 -73.949688"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_data = neighborhoods[neighborhoods['Borough'] == 'Manhattan'].reset_index(drop=True)\n",
"manhattan_data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's get the geographical coordinates of Manhattan."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The geograpical coordinate of Manhattan are 40.7900869, -73.9598295.\n"
]
}
],
"source": [
"address = 'Manhattan, NY'\n",
"\n",
"geolocator = Nominatim(user_agent=\"ny_explorer\")\n",
"location = geolocator.geocode(address)\n",
"latitude = location.latitude\n",
"longitude = location.longitude\n",
"print('The geograpical coordinate of Manhattan are {}, {}.'.format(latitude, longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we did with all of New York City, let's visualizat Manhattan the neighborhoods in it."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF80NzM3MjcxMGI4ZDk0NjE4YWQwNWZjYTA1MmExYWMyNSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF80NzM3MjcxMGI4ZDk0NjE4YWQwNWZjYTA1MmExYWMyNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzkwMDg2OSwtNzMuOTU5ODI5NV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfYzM2MDEwNjQ3ZGE4NDNmZWIwNjJlYzljYTE5MTVlMDUgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQyODliNTljYTgzMTRkNGI4N2VkYzBkY2ZiNDc4NTIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M0NDY5OWM0MzhlNzQ0MjY5NjlhM2ViNTFjMjY4M2VkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI3MDU2MzJlZTRmMDRmM2FhN2IyZGM3NmNmMjBiNmJkID0gJCgnPGRpdiBpZD0iaHRtbF8yNzA1NjMyZWU0ZjA0ZjNhYTdiMmRjNzZjZjIwYjZiZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M0NDY5OWM0MzhlNzQ0MjY5NjlhM2ViNTFjMjY4M2VkLnNldENvbnRlbnQoaHRtbF8yNzA1NjMyZWU0ZjA0ZjNhYTdiMmRjNzZjZjIwYjZiZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80Mjg5YjU5Y2E4MzE0ZDRiODdlZGMwZGNmYjQ3ODUyMy5iaW5kUG9wdXAocG9wdXBfYzQ0Njk5YzQzOGU3NDQyNjk2OWEzZWI1MWMyNjgzZWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmNiOWU0YTc3MzRjNDZjMTkzZGU2YWQ4NzJjYmJiYTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTU2MTg0MjIzMTQzMiwtNzMuOTk0Mjc5MzYyNTU5NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWYzNmRlNTBhOTk2NGY3ZmFkNjYwMTcyZDk4YzQ5YTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTA4OGM2MjYwNzQ1NGFlNTkyZTRkMTcxYTA5ZDRlM2UgPSAkKCc8ZGl2IGlkPSJodG1sX2EwODhjNjI2MDc0NTRhZTU5MmU0ZDE3MWEwOWQ0ZTNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGluYXRvd248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmMzZkZTUwYTk5NjRmN2ZhZDY2MDE3MmQ5OGM0OWE4LnNldENvbnRlbnQoaHRtbF9hMDg4YzYyNjA3NDU0YWU1OTJlNGQxNzFhMDlkNGUzZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yY2I5ZTRhNzczNGM0NmMxOTNkZTZhZDg3MmNiYmJhMi5iaW5kUG9wdXAocG9wdXBfYWYzNmRlNTBhOTk2NGY3ZmFkNjYwMTcyZDk4YzQ5YTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2FhMzI0MTYxYjEzNGIzNjgzYzJiODBkOTI0M2Y1OWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDA5NWMyM2M2YTYxNGExYWE5NjNjZDA2MjE1Y2VkNjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmJiY2VjNmU0N2YzNDhiMGJjZTkzODkyOWVmMzcwNmIgPSAkKCc8ZGl2IGlkPSJodG1sXzJiYmNlYzZlNDdmMzQ4YjBiY2U5Mzg5MjllZjM3MDZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QwOTVjMjNjNmE2MTRhMWFhOTYzY2QwNjIxNWNlZDY3LnNldENvbnRlbnQoaHRtbF8yYmJjZWM2ZTQ3ZjM0OGIwYmNlOTM4OTI5ZWYzNzA2Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83YWEzMjQxNjFiMTM0YjM2ODNjMmI4MGQ5MjQzZjU5Yy5iaW5kUG9wdXAocG9wdXBfZDA5NWMyM2M2YTYxNGExYWE5NjNjZDA2MjE1Y2VkNjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzI3ZjEyZTdhNzgyNGNlNWE0YTBjMWU1OGIzZGMzMTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Njc2ODM5NjQ0OTkxNSwtNzMuOTIxMjEwNDIyMDM4OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjY3NzIyN2E3OTBmNDI0ZmJiNjIwNGI4YjBmMGJkMTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2E0ZThiYjBmODQ4NDZmZTk2ZjQzNjkxYjk3M2UwMDIgPSAkKCc8ZGl2IGlkPSJodG1sX2NhNGU4YmIwZjg0ODQ2ZmU5NmY0MzY5MWI5NzNlMDAyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jbndvb2Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y2NzcyMjdhNzkwZjQyNGZiYjYyMDRiOGIwZjBiZDE0LnNldENvbnRlbnQoaHRtbF9jYTRlOGJiMGY4NDg0NmZlOTZmNDM2OTFiOTczZTAwMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMjdmMTJlN2E3ODI0Y2U1YTRhMGMxZTU4YjNkYzMxMy5iaW5kUG9wdXAocG9wdXBfZjY3NzIyN2E3OTBmNDI0ZmJiNjIwNGI4YjBmMGJkMTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmUxYWIyOGViODFkNGJlNjg3ZDZjMWYxNmMyZmIxNmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM2MDQyODQ4MTE5MzUsLTczLjk0OTY4NzkxODgzMzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YwMDkwMDczNzAwYjQ5Y2ZiNDNiM2M3MmZlOTFkZWMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZmYWUyNGU4NzJlYjQ5ZThhNzMyNDE1NTAxOWFmY2I0ID0gJCgnPGRpdiBpZD0iaHRtbF82ZmFlMjRlODcyZWI0OWU4YTczMjQxNTUwMTlhZmNiNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFtaWx0b24gSGVpZ2h0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjAwOTAwNzM3MDBiNDljZmI0M2IzYzcyZmU5MWRlYzIuc2V0Q29udGVudChodG1sXzZmYWUyNGU4NzJlYjQ5ZThhNzMyNDE1NTAxOWFmY2I0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJlMWFiMjhlYjgxZDRiZTY4N2Q2YzFmMTZjMmZiMTZiLmJpbmRQb3B1cChwb3B1cF9mMDA5MDA3MzcwMGI0OWNmYjQzYjNjNzJmZTkxZGVjMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNGI4MzI1OTc0MmU0MjY5ODUzOThlZjRmNzk2ZGRhYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2NmMWQxNzY2ODk5NGNmNjg4N2ZlOTM3OGUwZTFjMzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGRiMTljNmExZDBhNGEyOWI2MDI4MDZmYzJhZTAwOGUgPSAkKCc8ZGl2IGlkPSJodG1sXzBkYjE5YzZhMWQwYTRhMjliNjAyODA2ZmMyYWUwMDhlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2NmMWQxNzY2ODk5NGNmNjg4N2ZlOTM3OGUwZTFjMzMuc2V0Q29udGVudChodG1sXzBkYjE5YzZhMWQwYTRhMjliNjAyODA2ZmMyYWUwMDhlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI0YjgzMjU5NzQyZTQyNjk4NTM5OGVmNGY3OTZkZGFiLmJpbmRQb3B1cChwb3B1cF83Y2YxZDE3NjY4OTk0Y2Y2ODg3ZmU5Mzc4ZTBlMWMzMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYjI0Y2ZlMTFkZjg0NGNhYWI2NWI4NzAwZGEyODhiOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTk3NjA2NzQyNDE0LC03My45NDMyMTExMjYwMzkwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NzM3MjcxMGI4ZDk0NjE4YWQwNWZjYTA1MmExYWMyNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZTc1OGY5ODRmYzk0MDMwYmFhODQ4MDZkN2E1OWRjNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZjNlYjljNDc3Yzk0MDMwOGEyMTg3YWE1MzkzY2FiMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMmYzZWI5YzQ3N2M5NDAzMDhhMjE4N2FhNTM5M2NhYjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyYWwgSGFybGVtPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZTc1OGY5ODRmYzk0MDMwYmFhODQ4MDZkN2E1OWRjNS5zZXRDb250ZW50KGh0bWxfMmYzZWI5YzQ3N2M5NDAzMDhhMjE4N2FhNTM5M2NhYjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmIyNGNmZTExZGY4NDRjYWFiNjViODcwMGRhMjg4YjkuYmluZFBvcHVwKHBvcHVwXzFlNzU4Zjk4NGZjOTQwMzBiYWE4NDgwNmQ3YTU5ZGM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M1ZTJmYmI3YTJiMjQyZWJiMTE0OTEwZjcxZWFkODA5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkyMjQ5NDY2NjMwMzMsLTczLjk0NDE4MjIzMTQ4NTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM3NzcwNjEyMDY4ODRjYjM4ZmZkMGQ2NThmODM0NTQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlMTZjOTk5YWUyZTRlNjE4OTA4ZDcwYTVhZjM3ODE4ID0gJCgnPGRpdiBpZD0iaHRtbF9jZTE2Yzk5OWFlMmU0ZTYxODkwOGQ3MGE1YWYzNzgxOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBIYXJsZW08L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM3NzcwNjEyMDY4ODRjYjM4ZmZkMGQ2NThmODM0NTQ5LnNldENvbnRlbnQoaHRtbF9jZTE2Yzk5OWFlMmU0ZTYxODkwOGQ3MGE1YWYzNzgxOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNWUyZmJiN2EyYjI0MmViYjExNDkxMGY3MWVhZDgwOS5iaW5kUG9wdXAocG9wdXBfMzc3NzA2MTIwNjg4NGNiMzhmZmQwZDY1OGY4MzQ1NDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODlkYTFlNDBmZjdlNGIzODhiMzhjNTU4OGM1YjQyYjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAzNzc4ODc3YTU2NzRmNmE4Y2UwMDVhY2JlYmFmNGQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ2NjMwYzNhZDVhZjRkMzA5M2M2MWY3ZjJkMmUxNTJhID0gJCgnPGRpdiBpZD0iaHRtbF80NjYzMGMzYWQ1YWY0ZDMwOTNjNjFmN2YyZDJlMTUyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMzc3ODg3N2E1Njc0ZjZhOGNlMDA1YWNiZWJhZjRkMC5zZXRDb250ZW50KGh0bWxfNDY2MzBjM2FkNWFmNGQzMDkzYzYxZjdmMmQyZTE1MmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODlkYTFlNDBmZjdlNGIzODhiMzhjNTU4OGM1YjQyYjEuYmluZFBvcHVwKHBvcHVwXzAzNzc4ODc3YTU2NzRmNmE4Y2UwMDVhY2JlYmFmNGQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YyYTc1ZjUxYmI5ZTRiMjZhMDEwMWIxZmZkZGZlY2M0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzc1OTI5ODQ5ODg0ODc1LC03My45NDcxMTc4NDQ3MTgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NzM3MjcxMGI4ZDk0NjE4YWQwNWZjYTA1MmExYWMyNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mY2YzN2NlZjMyYjU0MzAzOTA0NjFiYzI2NjgxMjRmNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNWRiOTMyNWY4Nzk0YjNhYWEzYjEzOWZmYTI5NzVlNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDVkYjkzMjVmODc5NGIzYWFhM2IxMzlmZmEyOTc1ZTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvcmt2aWxsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmNmMzdjZWYzMmI1NDMwMzkwNDYxYmMyNjY4MTI0ZjQuc2V0Q29udGVudChodG1sXzA1ZGI5MzI1Zjg3OTRiM2FhYTNiMTM5ZmZhMjk3NWU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YyYTc1ZjUxYmI5ZTRiMjZhMDEwMWIxZmZkZGZlY2M0LmJpbmRQb3B1cChwb3B1cF9mY2YzN2NlZjMyYjU0MzAzOTA0NjFiYzI2NjgxMjRmNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MmQzOTU2YjY0OTU0Y2Y0YWY0YjU3MTNlNjc0YTVkYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODExMjY1ODI4NzMzLC03My45NTg4NTk2ODgxMzc2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JmMDQxNmJjZTBiYTQzYmRhYzg4ZjY1NDI1YjViMDNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMxNmMwOWIxOGQyNDRmNjU5MTQ1NmU4NGE1NTQ3MGQ4ID0gJCgnPGRpdiBpZD0iaHRtbF8zMTZjMDliMThkMjQ0ZjY1OTE0NTZlODRhNTU0NzBkOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVub3ggSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmYwNDE2YmNlMGJhNDNiZGFjODhmNjU0MjViNWIwM2Yuc2V0Q29udGVudChodG1sXzMxNmMwOWIxOGQyNDRmNjU5MTQ1NmU4NGE1NTQ3MGQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcyZDM5NTZiNjQ5NTRjZjRhZjRiNTcxM2U2NzRhNWRjLmJpbmRQb3B1cChwb3B1cF9iZjA0MTZiY2UwYmE0M2JkYWM4OGY2NTQyNWI1YjAzZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMjcwY2YyYThkYWM0Y2YxYmRkNDYxODMyODM4YzdhMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NzM3MjcxMGI4ZDk0NjE4YWQwNWZjYTA1MmExYWMyNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hODkwODI5ZWY2OTk0MzIyYjYzOWMzZTYyYzk3OGMzNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84N2JhNjliZTBlM2E0NWJjYjQ4MjUzYTJiYzY4ZWI5MiA9ICQoJzxkaXYgaWQ9Imh0bWxfODdiYTY5YmUwZTNhNDViY2I0ODI1M2EyYmM2OGViOTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E4OTA4MjllZjY5OTQzMjJiNjM5YzNlNjJjOTc4YzM0LnNldENvbnRlbnQoaHRtbF84N2JhNjliZTBlM2E0NWJjYjQ4MjUzYTJiYzY4ZWI5Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMjcwY2YyYThkYWM0Y2YxYmRkNDYxODMyODM4YzdhMC5iaW5kUG9wdXAocG9wdXBfYTg5MDgyOWVmNjk5NDMyMmI2MzljM2U2MmM5NzhjMzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjAwMmY1MGM0MDk5NDVhNjg3YzM3NjRmNWY1ZjVkZDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43ODc2NTc5OTg1MzQ4NTQsLTczLjk3NzA1OTIzNjMwNjAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkxMDEyNTA1YjA4ZjQ1YThiYzVjMjJkMGZhMzYyMzljID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5MWM4NjZkNTFlNDQ2MzM5NjIxNTlkODRiNWRkOTllID0gJCgnPGRpdiBpZD0iaHRtbF83OTFjODY2ZDUxZTQ0NjMzOTYyMTU5ZDg0YjVkZDk5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgV2VzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MTAxMjUwNWIwOGY0NWE4YmM1YzIyZDBmYTM2MjM5Yy5zZXRDb250ZW50KGh0bWxfNzkxYzg2NmQ1MWU0NDYzMzk2MjE1OWQ4NGI1ZGQ5OWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjAwMmY1MGM0MDk5NDVhNjg3YzM3NjRmNWY1ZjVkZDkuYmluZFBvcHVwKHBvcHVwXzkxMDEyNTA1YjA4ZjQ1YThiYzVjMjJkMGZhMzYyMzljKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JjNThjMGVjYTY2MjRkODg4ZjIxMDJlMDQzMDBhNmU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzczNTI4ODg5NDIxNjYsLTczLjk4NTMzNzc3MDAxMjYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0YTQ3MjIyODBiMzRhODI4MjVjZDE1NTc2YmYwMThlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc0MjA1YzYwM2NjOTQ0MGQ4OGQyY2NhZmMxMzMwZTk5ID0gJCgnPGRpdiBpZD0iaHRtbF83NDIwNWM2MDNjYzk0NDBkODhkMmNjYWZjMTMzMGU5OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGluY29sbiBTcXVhcmU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E0YTQ3MjIyODBiMzRhODI4MjVjZDE1NTc2YmYwMThlLnNldENvbnRlbnQoaHRtbF83NDIwNWM2MDNjYzk0NDBkODhkMmNjYWZjMTMzMGU5OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYzU4YzBlY2E2NjI0ZDg4OGYyMTAyZTA0MzAwYTZlOC5iaW5kUG9wdXAocG9wdXBfYTRhNDcyMjI4MGIzNGE4MjgyNWNkMTU1NzZiZjAxOGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWQ5MjFjYTFkYjA4NDBiOGEwZjQxNGUzZjA0MzI5Y2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjBjYTk1ZmRlNGQyNGVkODllZDcyMmRiMGM2MzM0MGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGJhZmM0NmI3M2VkNDNlMWI0OGI3ZDQwNzBjNGIzZWIgPSAkKCc8ZGl2IGlkPSJodG1sX2RiYWZjNDZiNzNlZDQzZTFiNDhiN2Q0MDcwYzRiM2ViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMGNhOTVmZGU0ZDI0ZWQ4OWVkNzIyZGIwYzYzMzQwZi5zZXRDb250ZW50KGh0bWxfZGJhZmM0NmI3M2VkNDNlMWI0OGI3ZDQwNzBjNGIzZWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWQ5MjFjYTFkYjA4NDBiOGEwZjQxNGUzZjA0MzI5Y2IuYmluZFBvcHVwKHBvcHVwXzIwY2E5NWZkZTRkMjRlZDg5ZWQ3MjJkYjBjNjMzNDBmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QzMDE1MjNkOGZjODQ4N2ZiMTgzNWE4Y2VhNjIzMGI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU0NjkxMTAyNzA2MjMsLTczLjk4MTY2ODgyNzMwMzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA1NzNiY2Y3Yzk2ZDRiNjU4ODEwNTVkOTdmMmU4ZDI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlNzg0NzAzOTlhMTQzZmU5ZTgyNTkxYWUyZTQyZGFiID0gJCgnPGRpdiBpZD0iaHRtbF9jZTc4NDcwMzk5YTE0M2ZlOWU4MjU5MWFlMmU0MmRhYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDU3M2JjZjdjOTZkNGI2NTg4MTA1NWQ5N2YyZThkMjQuc2V0Q29udGVudChodG1sX2NlNzg0NzAzOTlhMTQzZmU5ZTgyNTkxYWUyZTQyZGFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QzMDE1MjNkOGZjODQ4N2ZiMTgzNWE4Y2VhNjIzMGI0LmJpbmRQb3B1cChwb3B1cF8wNTczYmNmN2M5NmQ0YjY1ODgxMDU1ZDk3ZjJlOGQyNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOWNiZjlhMWZmMzQ0M2VjYmM5ZTcyYTFjZGNjZDJkMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODMwMzA3NzI1MjE3NCwtNzMuOTc4MzMyMDc5MjQxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDhlNWFiM2U4NWMwNDY4YzhhZWFhNDM0MWU2YmZiN2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWZhYTdhMjk1MTU1NDBlYzlkODA4NGY4OWVjMzY0ZjcgPSAkKCc8ZGl2IGlkPSJodG1sX2FmYWE3YTI5NTE1NTQwZWM5ZDgwODRmODllYzM2NGY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NdXJyYXkgSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDhlNWFiM2U4NWMwNDY4YzhhZWFhNDM0MWU2YmZiN2Muc2V0Q29udGVudChodG1sX2FmYWE3YTI5NTE1NTQwZWM5ZDgwODRmODllYzM2NGY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y5Y2JmOWExZmYzNDQzZWNiYzllNzJhMWNkY2NkMmQzLmJpbmRQb3B1cChwb3B1cF8wOGU1YWIzZTg1YzA0NjhjOGFlYWE0MzQxZTZiZmI3Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMWYwOGM4MWM1N2Y0MTViYTM0NjFmZDRlZjNkN2UxZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTIxNDQ0YWZlNGU4NGJhMzg2M2M2NWU5NWY0MjA1ODMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjc5YWRmZjIwYzA0NDQ1Y2E5YmMyY2Q3NmZiMGFiNTkgPSAkKCc8ZGl2IGlkPSJodG1sXzI3OWFkZmYyMGMwNDQ0NWNhOWJjMmNkNzZmYjBhYjU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMjE0NDRhZmU0ZTg0YmEzODYzYzY1ZTk1ZjQyMDU4My5zZXRDb250ZW50KGh0bWxfMjc5YWRmZjIwYzA0NDQ1Y2E5YmMyY2Q3NmZiMGFiNTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjFmMDhjODFjNTdmNDE1YmEzNDYxZmQ0ZWYzZDdlMWQuYmluZFBvcHVwKHBvcHVwXzEyMTQ0NGFmZTRlODRiYTM4NjNjNjVlOTVmNDIwNTgzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y4ZTk5OTRiNDBlZDQyMTE5MTZiOTA1ZWU1MGU4ODM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI2OTMyODg1MzYxMjgsLTczLjk5OTkxNDAyOTQ1OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VhMDIzNjlmODA5ZTRkYTFhOGIwZDI2YzIxMjUxZDQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5MDVjNTZmMzQzYTQ5ODU5MGNkNzhiNjExMWJiY2VhID0gJCgnPGRpdiBpZD0iaHRtbF82OTA1YzU2ZjM0M2E0OTg1OTBjZDc4YjYxMTFiYmNlYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW53aWNoIFZpbGxhZ2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VhMDIzNjlmODA5ZTRkYTFhOGIwZDI2YzIxMjUxZDQ2LnNldENvbnRlbnQoaHRtbF82OTA1YzU2ZjM0M2E0OTg1OTBjZDc4YjYxMTFiYmNlYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mOGU5OTk0YjQwZWQ0MjExOTE2YjkwNWVlNTBlODgzNi5iaW5kUG9wdXAocG9wdXBfZWEwMjM2OWY4MDllNGRhMWE4YjBkMjZjMjEyNTFkNDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmUzOGNiOTJkYzlmNDAzNThmZWZiMDc3ODk1ZTMzYjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43Mjc4NDY3NzcyNzAyNDQsLTczLjk4MjIyNjE2NTA2NDE2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhZjFkNjQxMjlkNzQwOTU4MGQ2MDI3MmU4N2ViYTVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NjY2E5NzI3ODIwMjQ2NTA5ZjcyN2IxMDYwYWFhN2EzID0gJCgnPGRpdiBpZD0iaHRtbF9jY2NhOTcyNzgyMDI0NjUwOWY3MjdiMTA2MGFhYTdhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBWaWxsYWdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYWYxZDY0MTI5ZDc0MDk1ODBkNjAyNzJlODdlYmE1ZS5zZXRDb250ZW50KGh0bWxfY2NjYTk3Mjc4MjAyNDY1MDlmNzI3YjEwNjBhYWE3YTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmUzOGNiOTJkYzlmNDAzNThmZWZiMDc3ODk1ZTMzYjEuYmluZFBvcHVwKHBvcHVwX2RhZjFkNjQxMjlkNzQwOTU4MGQ2MDI3MmU4N2ViYTVlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRkYzBkMDNhNGQ5ODQxYjY4YTU3YTljMzkwYjAwMGY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3YjJkNDJjMGM2YzQ5NDJiNjFlMjIyNjA5N2NhMjIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVlOGJjZjg1NDJhZDQ1N2NhMWMyYWExYTczNjg4NGFjID0gJCgnPGRpdiBpZD0iaHRtbF81ZThiY2Y4NTQyYWQ0NTdjYTFjMmFhMWE3MzY4ODRhYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84N2IyZDQyYzBjNmM0OTQyYjYxZTIyMjYwOTdjYTIyMS5zZXRDb250ZW50KGh0bWxfNWU4YmNmODU0MmFkNDU3Y2ExYzJhYTFhNzM2ODg0YWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGRjMGQwM2E0ZDk4NDFiNjhhNTdhOWMzOTBiMDAwZjcuYmluZFBvcHVwKHBvcHVwXzg3YjJkNDJjMGM2YzQ5NDJiNjFlMjIyNjA5N2NhMjIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JmYjJkY2QwYjk5NDQ4OWI4M2E4NTA4NjRhMTAzMDUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIxNTIxOTY3NDQzMjE2LC03NC4wMTA2ODMyODU1OTA4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NzM3MjcxMGI4ZDk0NjE4YWQwNWZjYTA1MmExYWMyNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82N2ZhYTcwZmM5NzI0NTdhOTVlYTNhM2Y4N2QwM2Q5YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zODQ2YmM5MmNiYmY0OTI3OWQ5ZmE0NDU1NzE3NzAyYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzg0NmJjOTJjYmJmNDkyNzlkOWZhNDQ1NTcxNzcwMmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRyaWJlY2E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY3ZmFhNzBmYzk3MjQ1N2E5NWVhM2EzZjg3ZDAzZDljLnNldENvbnRlbnQoaHRtbF8zODQ2YmM5MmNiYmY0OTI3OWQ5ZmE0NDU1NzE3NzAyYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZmIyZGNkMGI5OTQ0ODliODNhODUwODY0YTEwMzA1Mi5iaW5kUG9wdXAocG9wdXBfNjdmYWE3MGZjOTcyNDU3YTk1ZWEzYTNmODdkMDNkOWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWQ1OTllMTBiNmExNGYzMGE5NTQyNGJlNzYwMGMxMTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTkzMjM3OTM5NTkwNywtNzMuOTk3MzA0NjcyMDgwNzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDgxMTQ3MmU3NzViNGRkMDg3ZTMyMGQxZGJhYzVjYmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2IxZjFlODRmZDRiNDhmMGE1N2MwNTYzZmFiNzk2NzIgPSAkKCc8ZGl2IGlkPSJodG1sXzdiMWYxZTg0ZmQ0YjQ4ZjBhNTdjMDU2M2ZhYjc5NjcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaXR0bGUgSXRhbHk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA4MTE0NzJlNzc1YjRkZDA4N2UzMjBkMWRiYWM1Y2JlLnNldENvbnRlbnQoaHRtbF83YjFmMWU4NGZkNGI0OGYwYTU3YzA1NjNmYWI3OTY3Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZDU5OWUxMGI2YTE0ZjMwYTk1NDI0YmU3NjAwYzExNy5iaW5kUG9wdXAocG9wdXBfMDgxMTQ3MmU3NzViNGRkMDg3ZTMyMGQxZGJhYzVjYmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTNmYTg1MWJiMzIyNDllZWEzMmEyMzUwMTExOGRlMjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjVkZTBmNmRhNmYyNGI0NGFiZDZkY2Y3MjllMTA1ZGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDNlNzgxODQxMDJiNGJmMTkyODBmZDFjNjE5N2IzZmUgPSAkKCc8ZGl2IGlkPSJodG1sXzQzZTc4MTg0MTAyYjRiZjE5MjgwZmQxYzYxOTdiM2ZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NWRlMGY2ZGE2ZjI0YjQ0YWJkNmRjZjcyOWUxMDVkYy5zZXRDb250ZW50KGh0bWxfNDNlNzgxODQxMDJiNGJmMTkyODBmZDFjNjE5N2IzZmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTNmYTg1MWJiMzIyNDllZWEzMmEyMzUwMTExOGRlMjcuYmluZFBvcHVwKHBvcHVwXzY1ZGUwZjZkYTZmMjRiNDRhYmQ2ZGNmNzI5ZTEwNWRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EyYjNlNGJmMmU2NjRhNWFhMjNkOWQ4M2QzYjc1NTM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM0NDMzOTM1NzI0MzQsLTc0LjAwNjE3OTk4MTI2ODEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IxOTZiMTIyN2IxMDQ3ZTA5ZjQyMGVkODUxMDQxMmZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM2NDMzNjIxMGExZTRjNGE4NzM0ZWE2ZDU1OGQxZDYzID0gJCgnPGRpdiBpZD0iaHRtbF8zNjQzMzYyMTBhMWU0YzRhODczNGVhNmQ1NThkMWQ2MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBWaWxsYWdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMTk2YjEyMjdiMTA0N2UwOWY0MjBlZDg1MTA0MTJmZC5zZXRDb250ZW50KGh0bWxfMzY0MzM2MjEwYTFlNGM0YTg3MzRlYTZkNTU4ZDFkNjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTJiM2U0YmYyZTY2NGE1YWEyM2Q5ZDgzZDNiNzU1MzYuYmluZFBvcHVwKHBvcHVwX2IxOTZiMTIyN2IxMDQ3ZTA5ZjQyMGVkODUxMDQxMmZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEwZTE2NzViOWM4NDRlNTZiOTAxMDAzNjlhZmIwNTUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzk3MzA3MDQxNzAyODY1LC03My45NjQyODYxNzc0MDY1NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NzM3MjcxMGI4ZDk0NjE4YWQwNWZjYTA1MmExYWMyNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYTYzZjM2YTdkMTQ0ZDFhOGUxYjQ5MTQzMjRkODYwYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNGNlYzdlMTJkYmM0M2VkYmM0MzMxYzM0MjRkOWEyMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzRjZWM3ZTEyZGJjNDNlZGJjNDMzMWMzNDI0ZDlhMjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBWYWxsZXk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJhNjNmMzZhN2QxNDRkMWE4ZTFiNDkxNDMyNGQ4NjBhLnNldENvbnRlbnQoaHRtbF8zNGNlYzdlMTJkYmM0M2VkYmM0MzMxYzM0MjRkOWEyMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMGUxNjc1YjljODQ0ZTU2YjkwMTAwMzY5YWZiMDU1MC5iaW5kUG9wdXAocG9wdXBfMmE2M2YzNmE3ZDE0NGQxYThlMWI0OTE0MzI0ZDg2MGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTIzMTZlYzUyNjBiNDAyMDg1M2I2NmM2NWViOTQ3YWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y3OWYwNjZiY2Y0ODQxNWViZjZhZDJlZDAzMzJiMjI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IwYzhhODAxMGI1NTQxNTZiZWY4MTRiMGNiOThiYzM5ID0gJCgnPGRpdiBpZD0iaHRtbF9iMGM4YTgwMTBiNTU0MTU2YmVmODE0YjBjYjk4YmMzOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjc5ZjA2NmJjZjQ4NDE1ZWJmNmFkMmVkMDMzMmIyMjQuc2V0Q29udGVudChodG1sX2IwYzhhODAxMGI1NTQxNTZiZWY4MTRiMGNiOThiYzM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUyMzE2ZWM1MjYwYjQwMjA4NTNiNjZjNjVlYjk0N2FjLmJpbmRQb3B1cChwb3B1cF9mNzlmMDY2YmNmNDg0MTVlYmY2YWQyZWQwMzMyYjIyNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYWU5MWE2MWU3Nzg0YjI4YTk3NWVmNWRmMjY1YmIwOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNzIwOTgzMjcxNSwtNzMuOTgxMzc1OTQ4MzM1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGUyMGY5OTg4MGNhNGY2ZGExNzUzYzBkMTc1NGZlMmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzc5Njk3M2U3Zjg1NDc5NmI2ZjE5ZWNmMTdmYmMyMDUgPSAkKCc8ZGl2IGlkPSJodG1sX2M3OTY5NzNlN2Y4NTQ3OTZiNmYxOWVjZjE3ZmJjMjA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFtZXJjeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGUyMGY5OTg4MGNhNGY2ZGExNzUzYzBkMTc1NGZlMmEuc2V0Q29udGVudChodG1sX2M3OTY5NzNlN2Y4NTQ3OTZiNmYxOWVjZjE3ZmJjMjA1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VhZTkxYTYxZTc3ODRiMjhhOTc1ZWY1ZGYyNjViYjA4LmJpbmRQb3B1cChwb3B1cF80ZTIwZjk5ODgwY2E0ZjZkYTE3NTNjMGQxNzU0ZmUyYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNGQ0ZjY1MjAzNTY0YWZkYWQwZTM3ZDY5YjFhYTZiMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTkzMTk4Mzk0NTY1LC03NC4wMTY4NjkzMDUwODYxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NzM3MjcxMGI4ZDk0NjE4YWQwNWZjYTA1MmExYWMyNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lM2M4MGRlYzkwOTc0NDFlYjU1MTQxNjFiYmI0ODAyMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZjdiMGU2YzJmNjk0MjMxYmNiNjEyYzY3NTcxZTAxMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMGY3YjBlNmMyZjY5NDIzMWJjYjYxMmM2NzU3MWUwMTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJhdHRlcnkgUGFyayBDaXR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lM2M4MGRlYzkwOTc0NDFlYjU1MTQxNjFiYmI0ODAyMC5zZXRDb250ZW50KGh0bWxfMGY3YjBlNmMyZjY5NDIzMWJjYjYxMmM2NzU3MWUwMTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTRkNGY2NTIwMzU2NGFmZGFkMGUzN2Q2OWIxYWE2YjIuYmluZFBvcHVwKHBvcHVwX2UzYzgwZGVjOTA5NzQ0MWViNTUxNDE2MWJiYjQ4MDIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I4YzAwYjE4MGZhNjQ2YTRiMTlmYWM0ZGNlY2U4MjJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTdlMDBmN2U3Mjg2NDg4MzliZTYyMjM2OTk5YTdmYzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2IzZjljZTBmYmRmNDRmZGEwMTBlZjgxYTUzOTk4ZmYgPSAkKCc8ZGl2IGlkPSJodG1sX2NiM2Y5Y2UwZmJkZjQ0ZmRhMDEwZWY4MWE1Mzk5OGZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE3ZTAwZjdlNzI4NjQ4ODM5YmU2MjIzNjk5OWE3ZmMwLnNldENvbnRlbnQoaHRtbF9jYjNmOWNlMGZiZGY0NGZkYTAxMGVmODFhNTM5OThmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iOGMwMGIxODBmYTY0NmE0YjE5ZmFjNGRjZWNlODIyZS5iaW5kUG9wdXAocG9wdXBfMTdlMDBmN2U3Mjg2NDg4MzliZTYyMjM2OTk5YTdmYzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTkyNjlhOGM0Y2UzNGRiNWJjNjViZmQxNjY2YjhjODcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43ODI2ODI1NjcxMjU3LC03My45NTMyNTY0NjgzNzExMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80NzM3MjcxMGI4ZDk0NjE4YWQwNWZjYTA1MmExYWMyNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYmViNWFjNjJjMWI0OGY4ODUxYzY1MzBhN2M0ZGZhNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lN2U3YThiYzcyNzM0YmRmYTRjOTdhNWJhNmMwZDA3MiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTdlN2E4YmM3MjczNGJkZmE0Yzk3YTViYTZjMGQwNzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhcm5lZ2llIEhpbGw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFiZWI1YWM2MmMxYjQ4Zjg4NTFjNjUzMGE3YzRkZmE2LnNldENvbnRlbnQoaHRtbF9lN2U3YThiYzcyNzM0YmRmYTRjOTdhNWJhNmMwZDA3Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OTI2OWE4YzRjZTM0ZGI1YmM2NWJmZDE2NjZiOGM4Ny5iaW5kUG9wdXAocG9wdXBfMWJlYjVhYzYyYzFiNDhmODg1MWM2NTMwYTdjNGRmYTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTAxMzk5MWRhNzZjNDk4MWIzNGZlNTM5YjE1YjE5MjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjNmNGFiYzk2NjQ2NDM1ZjhlOTFkZjgwYzcyODMyYmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGY4YzY0ZGYxNDZmNDgzMWEyMDMwMzZhNDlkNTRiODEgPSAkKCc8ZGl2IGlkPSJodG1sXzhmOGM2NGRmMTQ2ZjQ4MzFhMjAzMDM2YTQ5ZDU0YjgxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iM2Y0YWJjOTY2NDY0MzVmOGU5MWRmODBjNzI4MzJiZC5zZXRDb250ZW50KGh0bWxfOGY4YzY0ZGYxNDZmNDgzMWEyMDMwMzZhNDlkNTRiODEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTAxMzk5MWRhNzZjNDk4MWIzNGZlNTM5YjE1YjE5MjAuYmluZFBvcHVwKHBvcHVwX2IzZjRhYmM5NjY0NjQzNWY4ZTkxZGY4MGM3MjgzMmJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkxYTJiNjZjOTRlZjQ2MDdiODA5ZDMyM2Y3YjAxM2M4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1MjI4OTIwNDYyODIsLTc0LjAwNTQxNTI5ODczMzU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I1MmEzNjE4YzI1MjRkYWI5OWE3M2U1ODQzOGE5ZmFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg5MWVmNDdiN2U2ZDQyZDg5ZTg2NTc3MTMyYjg1YzE0ID0gJCgnPGRpdiBpZD0iaHRtbF84OTFlZjQ3YjdlNmQ0MmQ4OWU4NjU3NzEzMmI4NWMxNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l2aWMgQ2VudGVyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNTJhMzYxOGMyNTI0ZGFiOTlhNzNlNTg0MzhhOWZhYS5zZXRDb250ZW50KGh0bWxfODkxZWY0N2I3ZTZkNDJkODllODY1NzcxMzJiODVjMTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTFhMmI2NmM5NGVmNDYwN2I4MDlkMzIzZjdiMDEzYzguYmluZFBvcHVwKHBvcHVwX2I1MmEzNjE4YzI1MjRkYWI5OWE3M2U1ODQzOGE5ZmFhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdmMjE3N2FkM2VhYjRkMjY4Y2NhNTY0MzMzZDEyZDZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ4NTA5NjY0MzEyMiwtNzMuOTg4NzEzMTMyODUyNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWFiYjI1NjgwMTk0NDhlYjkxZTNmNDA4OTg1M2IwMzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWE5NTI3YzA4MWM1NDBjOGJmODY0OGEyY2JhMzUyMDUgPSAkKCc8ZGl2IGlkPSJodG1sXzFhOTUyN2MwODFjNTQwYzhiZjg2NDhhMmNiYTM1MjA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duIFNvdXRoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYWJiMjU2ODAxOTQ0OGViOTFlM2Y0MDg5ODUzYjAzMi5zZXRDb250ZW50KGh0bWxfMWE5NTI3YzA4MWM1NDBjOGJmODY0OGEyY2JhMzUyMDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2YyMTc3YWQzZWFiNGQyNjhjY2E1NjQzMzNkMTJkNmIuYmluZFBvcHVwKHBvcHVwXzFhYmIyNTY4MDE5NDQ4ZWI5MWUzZjQwODk4NTNiMDMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YyYjcyNzkzM2ZlMTQyMTM5NjVkMzU0OTVjOWI4ZWUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYwMjgwMzMxMzEzNzQsLTczLjk2MzU1NjE0MDk0MzAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UxZTczZjRjMmFlZDQ3YzNhOTYyYzVhNDU5NzUzODM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QxZWQwZDVkYjI3NDQ3YTQ5OTA5ZTk3NjM1NzNjNjMyID0gJCgnPGRpdiBpZD0iaHRtbF9kMWVkMGQ1ZGIyNzQ0N2E0OTkwOWU5NzYzNTczYzYzMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3V0dG9uIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMWU3M2Y0YzJhZWQ0N2MzYTk2MmM1YTQ1OTc1MzgzNy5zZXRDb250ZW50KGh0bWxfZDFlZDBkNWRiMjc0NDdhNDk5MDllOTc2MzU3M2M2MzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjJiNzI3OTMzZmUxNDIxMzk2NWQzNTQ5NWM5YjhlZTMuYmluZFBvcHVwKHBvcHVwX2UxZTczZjRjMmFlZDQ3YzNhOTYyYzVhNDU5NzUzODM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlmMzQ5ZDJjMzM2MTQzZGFhYzI3ODBjMmQ4ODA3OTE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUyMDQyMzY5NTA3MjIsLTczLjk2NzcwODI0NTgxODM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzViZWM3ZWI0YTc3YjQzNzJiOWY5YzAxNDlmZDAzMGRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E1MzI3ZjZjNTZmYjQ0ZmVhNmZlN2M3ZGU1MWI5N2EyID0gJCgnPGRpdiBpZD0iaHRtbF9hNTMyN2Y2YzU2ZmI0NGZlYTZmZTdjN2RlNTFiOTdhMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHVydGxlIEJheTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWJlYzdlYjRhNzdiNDM3MmI5ZjljMDE0OWZkMDMwZGUuc2V0Q29udGVudChodG1sX2E1MzI3ZjZjNTZmYjQ0ZmVhNmZlN2M3ZGU1MWI5N2EyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlmMzQ5ZDJjMzM2MTQzZGFhYzI3ODBjMmQ4ODA3OTE1LmJpbmRQb3B1cChwb3B1cF81YmVjN2ViNGE3N2I0MzcyYjlmOWMwMTQ5ZmQwMzBkZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83OTNiNWJjZjgzMjk0YTUxOTg4NjI5MmQxODYzOTYxNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGE0ZGYwZDc0OWM1NGViZGI1ODNmYjViZTZjNGViYWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWQ2MzBkNjU3MmM1NGI5OGE4NDMyODZkOGVhY2RiOTcgPSAkKCc8ZGl2IGlkPSJodG1sX2FkNjMwZDY1NzJjNTRiOThhODQzMjg2ZDhlYWNkYjk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYTRkZjBkNzQ5YzU0ZWJkYjU4M2ZiNWJlNmM0ZWJhYi5zZXRDb250ZW50KGh0bWxfYWQ2MzBkNjU3MmM1NGI5OGE4NDMyODZkOGVhY2RiOTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzkzYjViY2Y4MzI5NGE1MTk4ODYyOTJkMTg2Mzk2MTUuYmluZFBvcHVwKHBvcHVwXzBhNGRmMGQ3NDljNTRlYmRiNTgzZmI1YmU2YzRlYmFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U3NTMwZWJjNjk3ODRlMGViNzE4ZTE2YWQwNzg4MjQxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMwOTk5NTU0NzcwNjEsLTczLjk3NDA1MTcwNDY5MjAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RiOTNkZDMzY2Q3YjQ0MzlhOTNjYWUzMGU0NGZhMTExID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlkZmVhNjJjYTRkMjRhYjVhZDgyYzY4NDcxNTdiOTZlID0gJCgnPGRpdiBpZD0iaHRtbF85ZGZlYTYyY2E0ZDI0YWI1YWQ4MmM2ODQ3MTU3Yjk2ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3R1eXZlc2FudCBUb3duPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYjkzZGQzM2NkN2I0NDM5YTkzY2FlMzBlNDRmYTExMS5zZXRDb250ZW50KGh0bWxfOWRmZWE2MmNhNGQyNGFiNWFkODJjNjg0NzE1N2I5NmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTc1MzBlYmM2OTc4NGUwZWI3MThlMTZhZDA3ODgyNDEuYmluZFBvcHVwKHBvcHVwX2RiOTNkZDMzY2Q3YjQ0MzlhOTNjYWUzMGU0NGZhMTExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc4NGQ4Yjk3YmQ5MDRiM2U4Njk0ZjQxNTBhOGNhNjI3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM5NjczMDQ3NjM4NDI2LC03My45OTA5NDcxMDUyODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ3MzcyNzEwYjhkOTQ2MThhZDA1ZmNhMDUyYTFhYzI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkxZmRmZmFlYTgwNDQ4ZGFiYmM4OWQ2MDBlNTY0YzZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I5MTcwMWEzMTJlZTQ4ZTVhNDcwMjY5NjY0NzdmOTY0ID0gJCgnPGRpdiBpZD0iaHRtbF9iOTE3MDFhMzEyZWU0OGU1YTQ3MDI2OTY2NDc3Zjk2NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGlyb248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkxZmRmZmFlYTgwNDQ4ZGFiYmM4OWQ2MDBlNTY0YzZiLnNldENvbnRlbnQoaHRtbF9iOTE3MDFhMzEyZWU0OGU1YTQ3MDI2OTY2NDc3Zjk2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ODRkOGI5N2JkOTA0YjNlODY5NGY0MTUwYThjYTYyNy5iaW5kUG9wdXAocG9wdXBfOTFmZGZmYWVhODA0NDhkYWJiYzg5ZDYwMGU1NjRjNmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZThhYzA3MjYzYzdiNDk4MjlkNGVjMjkxMGUwNmVkYTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTY2NTgwODIyNzUxOSwtNzQuMDAwMTExMzYyMDI2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDczNzI3MTBiOGQ5NDYxOGFkMDVmY2EwNTJhMWFjMjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTcxY2YyNmY2OTRhNDQ1ZjllNGYxYjRlNTU1YmFhYzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmFhMzcyNjAyYjdiNGEyY2E5Yjc1OGYxN2VkNThjNDcgPSAkKCc8ZGl2IGlkPSJodG1sX2ZhYTM3MjYwMmI3YjRhMmNhOWI3NThmMTdlZDU4YzQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWRzb24gWWFyZHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U3MWNmMjZmNjk0YTQ0NWY5ZTRmMWI0ZTU1NWJhYWMzLnNldENvbnRlbnQoaHRtbF9mYWEzNzI2MDJiN2I0YTJjYTliNzU4ZjE3ZWQ1OGM0Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lOGFjMDcyNjNjN2I0OTgyOWQ0ZWMyOTEwZTA2ZWRhMC5iaW5kUG9wdXAocG9wdXBfZTcxY2YyNmY2OTRhNDQ1ZjllNGYxYjRlNTU1YmFhYzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f946d345be0>"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map of Manhattan using latitude and longitude values\n",
"map_manhattan = folium.Map(location=[latitude, longitude], zoom_start=11)\n",
"\n",
"# add markers to map\n",
"for lat, lng, label in zip(manhattan_data['Latitude'], manhattan_data['Longitude'], manhattan_data['Neighborhood']):\n",
" label = folium.Popup(label, parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lng],\n",
" radius=5,\n",
" popup=label,\n",
" color='blue',\n",
" fill=True,\n",
" fill_color='#3186cc',\n",
" fill_opacity=0.7,\n",
" parse_html=False).add_to(map_manhattan) \n",
" \n",
"map_manhattan"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we are going to start utilizing the Foursquare API to explore the neighborhoods and segment them."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Define Foursquare Credentials and Version"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Your credentails:\n",
"CLIENT_ID: IZJNDNMGN2UG0QC4VTSCO0X3FIJCUWLEOMDME03AZXXKSFK1\n",
"CLIENT_SECRET:2VRK4XTUNZGWEC5FU3ITX45S3KRWYECKYHE10VK0EJLMJHGJ\n"
]
}
],
"source": [
"CLIENT_ID = 'IZJNDNMGN2UG0QC4VTSCO0X3FIJCUWLEOMDME03AZXXKSFK1' # your Foursquare ID\n",
"CLIENT_SECRET = '2VRK4XTUNZGWEC5FU3ITX45S3KRWYECKYHE10VK0EJLMJHGJ' # your Foursquare Secret\n",
"VERSION = '20180605' # Foursquare API version\n",
"\n",
"print('Your credentails:')\n",
"print('CLIENT_ID: ' + CLIENT_ID)\n",
"print('CLIENT_SECRET:' + CLIENT_SECRET)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's explore the first neighborhood in our dataframe."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get the neighborhood's name."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'Marble Hill'"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_data.loc[0, 'Neighborhood']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get the neighborhood's latitude and longitude values."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Latitude and longitude values of Marble Hill are 40.87655077879964, -73.91065965862981.\n"
]
}
],
"source": [
"neighborhood_latitude = manhattan_data.loc[0, 'Latitude'] # neighborhood latitude value\n",
"neighborhood_longitude = manhattan_data.loc[0, 'Longitude'] # neighborhood longitude value\n",
"\n",
"neighborhood_name = manhattan_data.loc[0, 'Neighborhood'] # neighborhood name\n",
"\n",
"print('Latitude and longitude values of {} are {}, {}.'.format(neighborhood_name, \n",
" neighborhood_latitude, \n",
" neighborhood_longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Now, let's get the top 100 venues that are in Marble Hill within a radius of 500 meters."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, let's create the GET request URL. Name your URL **url**."
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [],
"source": [
"# type your answer here\n",
"LIMIT = 100 # limit of number of venues returned by Foursquare API\n",
"radius = 500 # define radius\n",
"url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" neighborhood_latitude, \n",
" neighborhood_longitude, \n",
" radius, \n",
" LIMIT)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click __here__ for the solution.\n",
"<!-- The correct answer is:\n",
"LIMIT = 100 # limit of number of venues returned by Foursquare API\n",
"-->\n",
"\n",
"<!--\n",
"radius = 500 # define radius\n",
"-->\n",
"\n",
"<!--\n",
"\\\\ # create URL\n",
"url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" neighborhood_latitude, \n",
" neighborhood_longitude, \n",
" radius, \n",
" LIMIT)\n",
"url # display URL\n",
"--> "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Send the GET request and examine the resutls"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"{'meta': {'code': 200, 'requestId': '5c55c0c4f594df20ef959d27'},\n",
" 'response': {'suggestedFilters': {'header': 'Tap to show:',\n",
" 'filters': [{'name': 'Open now', 'key': 'openNow'}]},\n",
" 'headerLocation': 'Marble Hill',\n",
" 'headerFullLocation': 'Marble Hill, New York',\n",
" 'headerLocationGranularity': 'neighborhood',\n",
" 'totalResults': 24,\n",
" 'suggestedBounds': {'ne': {'lat': 40.88105078329964,\n",
" 'lng': -73.90471933917806},\n",
" 'sw': {'lat': 40.87205077429964, 'lng': -73.91659997808156}},\n",
" 'groups': [{'type': 'Recommended Places',\n",
" 'name': 'recommended',\n",
" 'items': [{'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b4429abf964a52037f225e3',\n",
" 'name': \"Arturo's\",\n",
" 'location': {'address': '5198 Broadway',\n",
" 'crossStreet': 'at 225th St.',\n",
" 'lat': 40.87441177110231,\n",
" 'lng': -73.91027100981574,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87441177110231,\n",
" 'lng': -73.91027100981574}],\n",
" 'distance': 240,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5198 Broadway (at 225th St.)',\n",
" 'New York, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1ca941735',\n",
" 'name': 'Pizza Place',\n",
" 'pluralName': 'Pizza Places',\n",
" 'shortName': 'Pizza',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/pizza_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'delivery': {'id': '72548',\n",
" 'url': 'https://www.seamless.com/menu/arturos-pizza-5189-broadway-ave-new-york/72548?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=72548',\n",
" 'provider': {'name': 'seamless',\n",
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n",
" 'sizes': [40, 50],\n",
" 'name': '/delivery_provider_seamless_20180129.png'}}},\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b4429abf964a52037f225e3-0'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4baf59e8f964a520a6f93be3',\n",
" 'name': 'Bikram Yoga',\n",
" 'location': {'address': '5500 Broadway',\n",
" 'crossStreet': '230th Street',\n",
" 'lat': 40.876843690797934,\n",
" 'lng': -73.90620384419528,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.876843690797934,\n",
" 'lng': -73.90620384419528}],\n",
" 'distance': 376,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5500 Broadway (230th Street)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d102941735',\n",
" 'name': 'Yoga Studio',\n",
" 'pluralName': 'Yoga Studios',\n",
" 'shortName': 'Yoga Studio',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/gym_yogastudio_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4baf59e8f964a520a6f93be3-1'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b79cc46f964a520c5122fe3',\n",
" 'name': 'Tibbett Diner',\n",
" 'location': {'address': '3033 Tibbett Ave',\n",
" 'crossStreet': 'btwn 230th & 231st',\n",
" 'lat': 40.8804044222466,\n",
" 'lng': -73.90893738006402,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8804044222466,\n",
" 'lng': -73.90893738006402}],\n",
" 'distance': 452,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['3033 Tibbett Ave (btwn 230th & 231st)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d147941735',\n",
" 'name': 'Diner',\n",
" 'pluralName': 'Diners',\n",
" 'shortName': 'Diner',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/diner_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b79cc46f964a520c5122fe3-2'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '55f81cd2498ee903149fcc64',\n",
" 'name': 'Starbucks',\n",
" 'location': {'address': '171 W 230th St',\n",
" 'crossStreet': 'Kimberly Pl',\n",
" 'lat': 40.87753134921497,\n",
" 'lng': -73.90558216359267,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87753134921497,\n",
" 'lng': -73.90558216359267}],\n",
" 'distance': 441,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 230th St (Kimberly Pl)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1e0931735',\n",
" 'name': 'Coffee Shop',\n",
" 'pluralName': 'Coffee Shops',\n",
" 'shortName': 'Coffee Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-55f81cd2498ee903149fcc64-3'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9c9c6af964a520b27236e3',\n",
" 'name': 'Land & Sea Restaurant',\n",
" 'location': {'address': '5535 Broadway',\n",
" 'crossStreet': '231st St',\n",
" 'lat': 40.87788463309788,\n",
" 'lng': -73.90587282193539,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87788463309788,\n",
" 'lng': -73.90587282193539}],\n",
" 'distance': 429,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5535 Broadway (231st St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1ce941735',\n",
" 'name': 'Seafood Restaurant',\n",
" 'pluralName': 'Seafood Restaurants',\n",
" 'shortName': 'Seafood',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/seafood_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'delivery': {'id': '277380',\n",
" 'url': 'https://www.seamless.com/menu/land--sea-restaurant-5535-broadway-ave-bronx/277380?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=277380',\n",
" 'provider': {'name': 'seamless',\n",
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n",
" 'sizes': [40, 50],\n",
" 'name': '/delivery_provider_seamless_20180129.png'}}},\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9c9c6af964a520b27236e3-4'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b5357adf964a520319827e3',\n",
" 'name': \"Dunkin' Donuts\",\n",
" 'location': {'address': '5501 Broadway',\n",
" 'crossStreet': 'W 230th St',\n",
" 'lat': 40.87699277991182,\n",
" 'lng': -73.90650658230923,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87699277991182,\n",
" 'lng': -73.90650658230923}],\n",
" 'distance': 353,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5501 Broadway (W 230th St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d148941735',\n",
" 'name': 'Donut Shop',\n",
" 'pluralName': 'Donut Shops',\n",
" 'shortName': 'Donuts',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/donuts_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b5357adf964a520319827e3-5'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '57655be738faa66160da7527',\n",
" 'name': 'Starbucks',\n",
" 'location': {'address': '50 W 225th St',\n",
" 'lat': 40.873754554218515,\n",
" 'lng': -73.90861305343668,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.873754554218515,\n",
" 'lng': -73.90861305343668}],\n",
" 'distance': 355,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['50 W 225th St',\n",
" 'New York, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1e0931735',\n",
" 'name': 'Coffee Shop',\n",
" 'pluralName': 'Coffee Shops',\n",
" 'shortName': 'Coffee Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-57655be738faa66160da7527-6'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4a725fa1f964a520f6da1fe3',\n",
" 'name': 'TCR The Club of Riverdale',\n",
" 'location': {'address': '2600 Netherland Ave',\n",
" 'lat': 40.8786283,\n",
" 'lng': -73.9145678,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8786283,\n",
" 'lng': -73.9145678}],\n",
" 'distance': 402,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['2600 Netherland Ave',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4e39a891bd410d7aed40cbc2',\n",
" 'name': 'Tennis Stadium',\n",
" 'pluralName': 'Tennis Stadiums',\n",
" 'shortName': 'Tennis',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/arts_entertainment/stadium_tennis_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []},\n",
" 'venuePage': {'id': '40358759'}},\n",
" 'referralId': 'e-0-4a725fa1f964a520f6da1fe3-7'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '55f751ca498eacc0307d1cfe',\n",
" 'name': 'Blink Fitness Riverdale',\n",
" 'location': {'address': '5520 Broadway',\n",
" 'crossStreet': 'at W 230th St',\n",
" 'lat': 40.87714687429521,\n",
" 'lng': -73.90583697267095,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87714687429521,\n",
" 'lng': -73.90583697267095}],\n",
" 'distance': 411,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'neighborhood': 'Kingsbridge',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5520 Broadway (at W 230th St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d176941735',\n",
" 'name': 'Gym',\n",
" 'pluralName': 'Gyms',\n",
" 'shortName': 'Gym',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/gym_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-55f751ca498eacc0307d1cfe-8'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '546d31ca498e561c698a0320',\n",
" 'name': 'T.J. Maxx',\n",
" 'location': {'lat': 40.87723198343352,\n",
" 'lng': -73.90504239962168,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87723198343352,\n",
" 'lng': -73.90504239962168}],\n",
" 'distance': 478,\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Bronx, NY', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1f6941735',\n",
" 'name': 'Department Store',\n",
" 'pluralName': 'Department Stores',\n",
" 'shortName': 'Department Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/departmentstore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-546d31ca498e561c698a0320-9'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9f030af964a520eb0f37e3',\n",
" 'name': 'GameStop',\n",
" 'location': {'address': '90 W 225th St Ste A-B',\n",
" 'crossStreet': 'btw Broadway & Exterior St.',\n",
" 'lat': 40.874266802124836,\n",
" 'lng': -73.90934218062803,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.874266802124836,\n",
" 'lng': -73.90934218062803}],\n",
" 'distance': 277,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['90 W 225th St Ste A-B (btw Broadway & Exterior St.)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10b951735',\n",
" 'name': 'Video Game Store',\n",
" 'pluralName': 'Video Game Stores',\n",
" 'shortName': 'Video Games',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/videogames_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9f030af964a520eb0f37e3-10'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9c9c43f964a520ac7236e3',\n",
" 'name': 'Lot Less Closeouts',\n",
" 'location': {'address': '5545 Broadway',\n",
" 'crossStreet': '231st St',\n",
" 'lat': 40.878270422202085,\n",
" 'lng': -73.9052646742604,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.878270422202085,\n",
" 'lng': -73.9052646742604}],\n",
" 'distance': 492,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5545 Broadway (231st St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '52dea92d3cf9994f4e043dbb',\n",
" 'name': 'Discount Store',\n",
" 'pluralName': 'Discount Stores',\n",
" 'shortName': 'Discount Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/discountstore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9c9c43f964a520ac7236e3-11'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b88e053f964a5208a1132e3',\n",
" 'name': 'Rite Aid',\n",
" 'location': {'address': '5237 Broadway',\n",
" 'crossStreet': '228th Street',\n",
" 'lat': 40.875466574434704,\n",
" 'lng': -73.90890629016033,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.875466574434704,\n",
" 'lng': -73.90890629016033}],\n",
" 'distance': 190,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5237 Broadway (228th Street)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10f951735',\n",
" 'name': 'Pharmacy',\n",
" 'pluralName': 'Pharmacies',\n",
" 'shortName': 'Pharmacy',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/pharmacy_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b88e053f964a5208a1132e3-12'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '5631194e498e2de074de661c',\n",
" 'name': 'Vitamin Shoppe',\n",
" 'location': {'address': '5510 Broadway',\n",
" 'lat': 40.87716,\n",
" 'lng': -73.905632,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87716,\n",
" 'lng': -73.905632}],\n",
" 'distance': 428,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5510 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '5744ccdfe4b0c0459246b4cd',\n",
" 'name': 'Supplement Shop',\n",
" 'pluralName': 'Supplement Shops',\n",
" 'shortName': 'Supplement Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/education/lab_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-5631194e498e2de074de661c-13'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '56229ff8498e2abb44b6f12b',\n",
" 'name': 'Five Below',\n",
" 'location': {'address': '171 W 230th St Fl 2',\n",
" 'lat': 40.87763977050781,\n",
" 'lng': -73.90499114990234,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87763977050781,\n",
" 'lng': -73.90499114990234}],\n",
" 'distance': 492,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 230th St Fl 2',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '52dea92d3cf9994f4e043dbb',\n",
" 'name': 'Discount Store',\n",
" 'pluralName': 'Discount Stores',\n",
" 'shortName': 'Discount Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/discountstore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-56229ff8498e2abb44b6f12b-14'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4dfe40df8877333e195b68fc',\n",
" 'name': 'Parrilla Latina',\n",
" 'location': {'address': '230th St & Broadway',\n",
" 'lat': 40.87747294351472,\n",
" 'lng': -73.90607346968568,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87747294351472,\n",
" 'lng': -73.90607346968568}],\n",
" 'distance': 399,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['230th St & Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1cc941735',\n",
" 'name': 'Steakhouse',\n",
" 'pluralName': 'Steakhouses',\n",
" 'shortName': 'Steakhouse',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/steakhouse_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'delivery': {'id': '330981',\n",
" 'url': 'https://www.seamless.com/menu/parrilla-latina-5523-broadway-bronx/330981?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=330981',\n",
" 'provider': {'name': 'seamless',\n",
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n",
" 'sizes': [40, 50],\n",
" 'name': '/delivery_provider_seamless_20180129.png'}}},\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4dfe40df8877333e195b68fc-15'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e4e4517bd4101d0d7a67568',\n",
" 'name': 'Baskin-Robbins',\n",
" 'location': {'address': '5501 Broadway',\n",
" 'lat': 40.8769755336728,\n",
" 'lng': -73.90675193198494,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8769755336728,\n",
" 'lng': -73.90675193198494}],\n",
" 'distance': 332,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5501 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c9941735',\n",
" 'name': 'Ice Cream Shop',\n",
" 'pluralName': 'Ice Cream Shops',\n",
" 'shortName': 'Ice Cream',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/icecream_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e4e4517bd4101d0d7a67568-16'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4c7e760d0b2a9eb0fb73651f',\n",
" 'name': 'Payless ShoeSource',\n",
" 'location': {'address': '60 W 225th St',\n",
" 'lat': 40.87372764344239,\n",
" 'lng': -73.90848340039689,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87372764344239,\n",
" 'lng': -73.90848340039689}],\n",
" 'distance': 363,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['60 W 225th St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d107951735',\n",
" 'name': 'Shoe Store',\n",
" 'pluralName': 'Shoe Stores',\n",
" 'shortName': 'Shoes',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/apparel_shoestore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4c7e760d0b2a9eb0fb73651f-17'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '585c205665e7c70a2f1055ea',\n",
" 'name': 'Boston Market',\n",
" 'location': {'address': '5520 Broadway',\n",
" 'lat': 40.87743,\n",
" 'lng': -73.9054121,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87743,\n",
" 'lng': -73.9054121}],\n",
" 'distance': 452,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5520 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d14e941735',\n",
" 'name': 'American Restaurant',\n",
" 'pluralName': 'American Restaurants',\n",
" 'shortName': 'American',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/default_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-585c205665e7c70a2f1055ea-18'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4ec68016cc21b428e1d2060a',\n",
" 'name': 'TD Bank',\n",
" 'location': {'address': '281 W 230th St',\n",
" 'lat': 40.8794958,\n",
" 'lng': -73.9092856,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8794958,\n",
" 'lng': -73.9092856}],\n",
" 'distance': 347,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['281 W 230th St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10a951735',\n",
" 'name': 'Bank',\n",
" 'pluralName': 'Banks',\n",
" 'shortName': 'Bank',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/financial_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4ec68016cc21b428e1d2060a-19'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e4ce4debd413c4cc66d05d0',\n",
" 'name': 'SUBWAY',\n",
" 'location': {'address': '5549 Broadway',\n",
" 'lat': 40.87849271667849,\n",
" 'lng': -73.90538547211088,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87849271667849,\n",
" 'lng': -73.90538547211088}],\n",
" 'distance': 493,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5549 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n",
" 'name': 'Sandwich Place',\n",
" 'pluralName': 'Sandwich Places',\n",
" 'shortName': 'Sandwiches',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'delivery': {'id': '774886',\n",
" 'url': 'https://www.seamless.com/menu/subway-5549-broadway-bronx/774886?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=774886',\n",
" 'provider': {'name': 'seamless',\n",
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n",
" 'sizes': [40, 50],\n",
" 'name': '/delivery_provider_seamless_20180129.png'}}},\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e4ce4debd413c4cc66d05d0-20'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4c852173dc018cfa2bc3e56c',\n",
" 'name': \"The Children's Place\",\n",
" 'location': {'address': '44 W 225th St',\n",
" 'lat': 40.873671591133125,\n",
" 'lng': -73.90815619608166,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.873671591133125,\n",
" 'lng': -73.90815619608166}],\n",
" 'distance': 383,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['44 W 225th St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d105951735',\n",
" 'name': 'Kids Store',\n",
" 'pluralName': 'Kids Stores',\n",
" 'shortName': 'Kids Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/apparel_kids_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4c852173dc018cfa2bc3e56c-21'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '53319bb511d2ef06787f02b4',\n",
" 'name': 'Broadway Plaza',\n",
" 'location': {'address': '171 W 231st St',\n",
" 'lat': 40.87753906779665,\n",
" 'lng': -73.90539578168178,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87753906779665,\n",
" 'lng': -73.90539578168178}],\n",
" 'distance': 456,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 231st St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1fd941735',\n",
" 'name': 'Shopping Mall',\n",
" 'pluralName': 'Shopping Malls',\n",
" 'shortName': 'Mall',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/mall_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-53319bb511d2ef06787f02b4-22'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4ed7956b8b81b2bf28adc714',\n",
" 'name': 'Terrace View Delicatessen',\n",
" 'location': {'address': '135 Terrace View Ave.',\n",
" 'lat': 40.87647647652852,\n",
" 'lng': -73.91274586964578,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87647647652852,\n",
" 'lng': -73.91274586964578}],\n",
" 'distance': 175,\n",
" 'postalCode': '10034',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['135 Terrace View Ave.',\n",
" 'New York, NY 10034',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d146941735',\n",
" 'name': 'Deli / Bodega',\n",
" 'pluralName': 'Delis / Bodegas',\n",
" 'shortName': 'Deli / Bodega',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4ed7956b8b81b2bf28adc714-23'}]}]}}"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results = requests.get(url).json()\n",
"results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From the Foursquare lab in the previous module, we know that all the information is in the *items* key. Before we proceed, let's borrow the **get_category_type** function from the Foursquare lab."
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# function that extracts the category of the venue\n",
"def get_category_type(row):\n",
" try:\n",
" categories_list = row['categories']\n",
" except:\n",
" categories_list = row['venue.categories']\n",
" \n",
" if len(categories_list) == 0:\n",
" return None\n",
" else:\n",
" return categories_list[0]['name']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we are ready to clean the json and structure it into a *pandas* dataframe."
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>name</th>\n",
" <th>categories</th>\n",
" <th>lat</th>\n",
" <th>lng</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Arturo's</td>\n",
" <td>Pizza Place</td>\n",
" <td>40.874412</td>\n",
" <td>-73.910271</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Bikram Yoga</td>\n",
" <td>Yoga Studio</td>\n",
" <td>40.876844</td>\n",
" <td>-73.906204</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Tibbett Diner</td>\n",
" <td>Diner</td>\n",
" <td>40.880404</td>\n",
" <td>-73.908937</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Starbucks</td>\n",
" <td>Coffee Shop</td>\n",
" <td>40.877531</td>\n",
" <td>-73.905582</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Land &amp; Sea Restaurant</td>\n",
" <td>Seafood Restaurant</td>\n",
" <td>40.877885</td>\n",
" <td>-73.905873</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" name categories lat lng\n",
"0 Arturo's Pizza Place 40.874412 -73.910271\n",
"1 Bikram Yoga Yoga Studio 40.876844 -73.906204\n",
"2 Tibbett Diner Diner 40.880404 -73.908937\n",
"3 Starbucks Coffee Shop 40.877531 -73.905582\n",
"4 Land & Sea Restaurant Seafood Restaurant 40.877885 -73.905873"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"venues = results['response']['groups'][0]['items']\n",
" \n",
"nearby_venues = json_normalize(venues) # flatten JSON\n",
"\n",
"# filter columns\n",
"filtered_columns = ['venue.name', 'venue.categories', 'venue.location.lat', 'venue.location.lng']\n",
"nearby_venues =nearby_venues.loc[:, filtered_columns]\n",
"\n",
"# filter the category for each row\n",
"nearby_venues['venue.categories'] = nearby_venues.apply(get_category_type, axis=1)\n",
"\n",
"# clean columns\n",
"nearby_venues.columns = [col.split(\".\")[-1] for col in nearby_venues.columns]\n",
"\n",
"nearby_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And how many venues were returned by Foursquare?"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"24 venues were returned by Foursquare.\n"
]
}
],
"source": [
"print('{} venues were returned by Foursquare.'.format(nearby_venues.shape[0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item2'></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. Explore Neighborhoods in Manhattan"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's create a function to repeat the same process to all the neighborhoods in Manhattan"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def getNearbyVenues(names, latitudes, longitudes, radius=500):\n",
" \n",
" venues_list=[]\n",
" for name, lat, lng in zip(names, latitudes, longitudes):\n",
" print(name)\n",
" \n",
" # create the API request URL\n",
" url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" lat, \n",
" lng, \n",
" radius, \n",
" LIMIT)\n",
" \n",
" # make the GET request\n",
" results = requests.get(url).json()[\"response\"]['groups'][0]['items']\n",
" \n",
" # return only relevant information for each nearby venue\n",
" venues_list.append([(\n",
" name, \n",
" lat, \n",
" lng, \n",
" v['venue']['name'], \n",
" v['venue']['location']['lat'], \n",
" v['venue']['location']['lng'], \n",
" v['venue']['categories'][0]['name']) for v in results])\n",
"\n",
" nearby_venues = pd.DataFrame([item for venue_list in venues_list for item in venue_list])\n",
" nearby_venues.columns = ['Neighborhood', \n",
" 'Neighborhood Latitude', \n",
" 'Neighborhood Longitude', \n",
" 'Venue', \n",
" 'Venue Latitude', \n",
" 'Venue Longitude', \n",
" 'Venue Category']\n",
" \n",
" return(nearby_venues)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Now write the code to run the above function on each neighborhood and create a new dataframe called *manhattan_venues*."
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Marble Hill\n",
"Chinatown\n",
"Washington Heights\n",
"Inwood\n",
"Hamilton Heights\n",
"Manhattanville\n",
"Central Harlem\n",
"East Harlem\n",
"Upper East Side\n",
"Yorkville\n",
"Lenox Hill\n",
"Roosevelt Island\n",
"Upper West Side\n",
"Lincoln Square\n",
"Clinton\n",
"Midtown\n",
"Murray Hill\n",
"Chelsea\n",
"Greenwich Village\n",
"East Village\n",
"Lower East Side\n",
"Tribeca\n",
"Little Italy\n",
"Soho\n",
"West Village\n",
"Manhattan Valley\n",
"Morningside Heights\n",
"Gramercy\n",
"Battery Park City\n",
"Financial District\n",
"Carnegie Hill\n",
"Noho\n",
"Civic Center\n",
"Midtown South\n",
"Sutton Place\n",
"Turtle Bay\n",
"Tudor City\n",
"Stuyvesant Town\n",
"Flatiron\n",
"Hudson Yards\n"
]
}
],
"source": [
"# type your answer here\n",
"\n",
"manhattan_venues = getNearbyVenues(names=manhattan_data['Neighborhood'],\n",
" latitudes=manhattan_data['Latitude'],\n",
" longitudes=manhattan_data['Longitude']\n",
" )\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click __here__ for the solution.\n",
"<!-- The correct answer is:\n",
"manhattan_venues = getNearbyVenues(names=manhattan_data['Neighborhood'],\n",
" latitudes=manhattan_data['Latitude'],\n",
" longitudes=manhattan_data['Longitude']\n",
" )\n",
"--> "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's check the size of the resulting dataframe"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(3308, 7)\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood</th>\n",
" <th>Neighborhood Latitude</th>\n",
" <th>Neighborhood Longitude</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Arturo's</td>\n",
" <td>40.874412</td>\n",
" <td>-73.910271</td>\n",
" <td>Pizza Place</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Bikram Yoga</td>\n",
" <td>40.876844</td>\n",
" <td>-73.906204</td>\n",
" <td>Yoga Studio</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Tibbett Diner</td>\n",
" <td>40.880404</td>\n",
" <td>-73.908937</td>\n",
" <td>Diner</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Starbucks</td>\n",
" <td>40.877531</td>\n",
" <td>-73.905582</td>\n",
" <td>Coffee Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Land &amp; Sea Restaurant</td>\n",
" <td>40.877885</td>\n",
" <td>-73.905873</td>\n",
" <td>Seafood Restaurant</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Neighborhood Latitude Neighborhood Longitude \\\n",
"0 Marble Hill 40.876551 -73.91066 \n",
"1 Marble Hill 40.876551 -73.91066 \n",
"2 Marble Hill 40.876551 -73.91066 \n",
"3 Marble Hill 40.876551 -73.91066 \n",
"4 Marble Hill 40.876551 -73.91066 \n",
"\n",
" Venue Venue Latitude Venue Longitude Venue Category \n",
"0 Arturo's 40.874412 -73.910271 Pizza Place \n",
"1 Bikram Yoga 40.876844 -73.906204 Yoga Studio \n",
"2 Tibbett Diner 40.880404 -73.908937 Diner \n",
"3 Starbucks 40.877531 -73.905582 Coffee Shop \n",
"4 Land & Sea Restaurant 40.877885 -73.905873 Seafood Restaurant "
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(manhattan_venues.shape)\n",
"manhattan_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's check how many venues were returned for each neighborhood"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood Latitude</th>\n",
" <th>Neighborhood Longitude</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Neighborhood</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Battery Park City</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Carnegie Hill</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Central Harlem</th>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Chelsea</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Chinatown</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Civic Center</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Clinton</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>East Harlem</th>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>East Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Financial District</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Flatiron</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gramercy</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Greenwich Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Hamilton Heights</th>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Hudson Yards</th>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" <td>59</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Inwood</th>\n",
" <td>56</td>\n",
" <td>56</td>\n",
" <td>56</td>\n",
" <td>56</td>\n",
" <td>56</td>\n",
" <td>56</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lenox Hill</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lincoln Square</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Little Italy</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lower East Side</th>\n",
" <td>62</td>\n",
" <td>62</td>\n",
" <td>62</td>\n",
" <td>62</td>\n",
" <td>62</td>\n",
" <td>62</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Manhattan Valley</th>\n",
" <td>64</td>\n",
" <td>64</td>\n",
" <td>64</td>\n",
" <td>64</td>\n",
" <td>64</td>\n",
" <td>64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Manhattanville</th>\n",
" <td>38</td>\n",
" <td>38</td>\n",
" <td>38</td>\n",
" <td>38</td>\n",
" <td>38</td>\n",
" <td>38</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Marble Hill</th>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" <td>24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Midtown</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Midtown South</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Morningside Heights</th>\n",
" <td>44</td>\n",
" <td>44</td>\n",
" <td>44</td>\n",
" <td>44</td>\n",
" <td>44</td>\n",
" <td>44</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Murray Hill</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Noho</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Roosevelt Island</th>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Soho</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Stuyvesant Town</th>\n",
" <td>20</td>\n",
" <td>20</td>\n",
" <td>20</td>\n",
" <td>20</td>\n",
" <td>20</td>\n",
" <td>20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Sutton Place</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Tribeca</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Tudor City</th>\n",
" <td>82</td>\n",
" <td>82</td>\n",
" <td>82</td>\n",
" <td>82</td>\n",
" <td>82</td>\n",
" <td>82</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Turtle Bay</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Upper East Side</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Upper West Side</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Washington Heights</th>\n",
" <td>87</td>\n",
" <td>87</td>\n",
" <td>87</td>\n",
" <td>87</td>\n",
" <td>87</td>\n",
" <td>87</td>\n",
" </tr>\n",
" <tr>\n",
" <th>West Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Yorkville</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Latitude Neighborhood Longitude Venue \\\n",
"Neighborhood \n",
"Battery Park City 100 100 100 \n",
"Carnegie Hill 100 100 100 \n",
"Central Harlem 46 46 46 \n",
"Chelsea 100 100 100 \n",
"Chinatown 100 100 100 \n",
"Civic Center 100 100 100 \n",
"Clinton 100 100 100 \n",
"East Harlem 43 43 43 \n",
"East Village 100 100 100 \n",
"Financial District 100 100 100 \n",
"Flatiron 100 100 100 \n",
"Gramercy 100 100 100 \n",
"Greenwich Village 100 100 100 \n",
"Hamilton Heights 58 58 58 \n",
"Hudson Yards 59 59 59 \n",
"Inwood 56 56 56 \n",
"Lenox Hill 100 100 100 \n",
"Lincoln Square 100 100 100 \n",
"Little Italy 100 100 100 \n",
"Lower East Side 62 62 62 \n",
"Manhattan Valley 64 64 64 \n",
"Manhattanville 38 38 38 \n",
"Marble Hill 24 24 24 \n",
"Midtown 100 100 100 \n",
"Midtown South 100 100 100 \n",
"Morningside Heights 44 44 44 \n",
"Murray Hill 100 100 100 \n",
"Noho 100 100 100 \n",
"Roosevelt Island 25 25 25 \n",
"Soho 100 100 100 \n",
"Stuyvesant Town 20 20 20 \n",
"Sutton Place 100 100 100 \n",
"Tribeca 100 100 100 \n",
"Tudor City 82 82 82 \n",
"Turtle Bay 100 100 100 \n",
"Upper East Side 100 100 100 \n",
"Upper West Side 100 100 100 \n",
"Washington Heights 87 87 87 \n",
"West Village 100 100 100 \n",
"Yorkville 100 100 100 \n",
"\n",
" Venue Latitude Venue Longitude Venue Category \n",
"Neighborhood \n",
"Battery Park City 100 100 100 \n",
"Carnegie Hill 100 100 100 \n",
"Central Harlem 46 46 46 \n",
"Chelsea 100 100 100 \n",
"Chinatown 100 100 100 \n",
"Civic Center 100 100 100 \n",
"Clinton 100 100 100 \n",
"East Harlem 43 43 43 \n",
"East Village 100 100 100 \n",
"Financial District 100 100 100 \n",
"Flatiron 100 100 100 \n",
"Gramercy 100 100 100 \n",
"Greenwich Village 100 100 100 \n",
"Hamilton Heights 58 58 58 \n",
"Hudson Yards 59 59 59 \n",
"Inwood 56 56 56 \n",
"Lenox Hill 100 100 100 \n",
"Lincoln Square 100 100 100 \n",
"Little Italy 100 100 100 \n",
"Lower East Side 62 62 62 \n",
"Manhattan Valley 64 64 64 \n",
"Manhattanville 38 38 38 \n",
"Marble Hill 24 24 24 \n",
"Midtown 100 100 100 \n",
"Midtown South 100 100 100 \n",
"Morningside Heights 44 44 44 \n",
"Murray Hill 100 100 100 \n",
"Noho 100 100 100 \n",
"Roosevelt Island 25 25 25 \n",
"Soho 100 100 100 \n",
"Stuyvesant Town 20 20 20 \n",
"Sutton Place 100 100 100 \n",
"Tribeca 100 100 100 \n",
"Tudor City 82 82 82 \n",
"Turtle Bay 100 100 100 \n",
"Upper East Side 100 100 100 \n",
"Upper West Side 100 100 100 \n",
"Washington Heights 87 87 87 \n",
"West Village 100 100 100 \n",
"Yorkville 100 100 100 "
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_venues.groupby('Neighborhood').count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's find out how many unique categories can be curated from all the returned venues"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"There are 330 uniques categories.\n"
]
}
],
"source": [
"print('There are {} uniques categories.'.format(len(manhattan_venues['Venue Category'].unique())))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item3'></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. Analyze Each Neighborhood"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood</th>\n",
" <th>Accessories Store</th>\n",
" <th>Adult Boutique</th>\n",
" <th>Afghan Restaurant</th>\n",
" <th>African Restaurant</th>\n",
" <th>American Restaurant</th>\n",
" <th>Animal Shelter</th>\n",
" <th>Antique Shop</th>\n",
" <th>Arcade</th>\n",
" <th>Arepa Restaurant</th>\n",
" <th>Argentinian Restaurant</th>\n",
" <th>Art Gallery</th>\n",
" <th>Art Museum</th>\n",
" <th>Arts &amp; Crafts Store</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auditorium</th>\n",
" <th>Australian Restaurant</th>\n",
" <th>Austrian Restaurant</th>\n",
" <th>Auto Workshop</th>\n",
" <th>BBQ Joint</th>\n",
" <th>Baby Store</th>\n",
" <th>Bagel Shop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Bar</th>\n",
" <th>Baseball Field</th>\n",
" <th>Basketball Court</th>\n",
" <th>Bed &amp; Breakfast</th>\n",
" <th>Beer Bar</th>\n",
" <th>Beer Garden</th>\n",
" <th>Beer Store</th>\n",
" <th>Belgian Restaurant</th>\n",
" <th>Bike Rental / Bike Share</th>\n",
" <th>Bike Shop</th>\n",
" <th>Bike Trail</th>\n",
" <th>Bistro</th>\n",
" <th>Board Shop</th>\n",
" <th>Boat or Ferry</th>\n",
" <th>Bookstore</th>\n",
" <th>Boutique</th>\n",
" <th>Boxing Gym</th>\n",
" <th>Brazilian Restaurant</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Bridal Shop</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Building</th>\n",
" <th>Burger Joint</th>\n",
" <th>Burrito Place</th>\n",
" <th>Bus Line</th>\n",
" <th>Bus Station</th>\n",
" <th>Bus Stop</th>\n",
" <th>Business Service</th>\n",
" <th>Butcher</th>\n",
" <th>Cafeteria</th>\n",
" <th>Café</th>\n",
" <th>Cambodian Restaurant</th>\n",
" <th>Camera Store</th>\n",
" <th>Candy Store</th>\n",
" <th>Caribbean Restaurant</th>\n",
" <th>Caucasian Restaurant</th>\n",
" <th>Cheese Shop</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Chocolate Shop</th>\n",
" <th>Christmas Market</th>\n",
" <th>Climbing Gym</th>\n",
" <th>Clothing Store</th>\n",
" <th>Club House</th>\n",
" <th>Cocktail Bar</th>\n",
" <th>Coffee Shop</th>\n",
" <th>College Academic Building</th>\n",
" <th>College Bookstore</th>\n",
" <th>College Cafeteria</th>\n",
" <th>College Theater</th>\n",
" <th>Comedy Club</th>\n",
" <th>Community Center</th>\n",
" <th>Concert Hall</th>\n",
" <th>Convenience Store</th>\n",
" <th>Cosmetics Shop</th>\n",
" <th>Coworking Space</th>\n",
" <th>Creperie</th>\n",
" <th>Cuban Restaurant</th>\n",
" <th>Cultural Center</th>\n",
" <th>Cupcake Shop</th>\n",
" <th>Cycle Studio</th>\n",
" <th>Czech Restaurant</th>\n",
" <th>Dance Studio</th>\n",
" <th>Daycare</th>\n",
" <th>Deli / Bodega</th>\n",
" <th>Department Store</th>\n",
" <th>Design Studio</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Diner</th>\n",
" <th>Discount Store</th>\n",
" <th>Dive Bar</th>\n",
" <th>Dog Run</th>\n",
" <th>Donut Shop</th>\n",
" <th>Drugstore</th>\n",
" <th>Dry Cleaner</th>\n",
" <th>Dumpling Restaurant</th>\n",
" <th>Duty-free Shop</th>\n",
" <th>Eastern European Restaurant</th>\n",
" <th>Electronics Store</th>\n",
" <th>English Restaurant</th>\n",
" <th>Ethiopian Restaurant</th>\n",
" <th>Event Space</th>\n",
" <th>Exhibit</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Farmers Market</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Filipino Restaurant</th>\n",
" <th>Fish Market</th>\n",
" <th>Flea Market</th>\n",
" <th>Flower Shop</th>\n",
" <th>Food &amp; Drink Shop</th>\n",
" <th>Food Court</th>\n",
" <th>Food Truck</th>\n",
" <th>Fountain</th>\n",
" <th>French Restaurant</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Frozen Yogurt Shop</th>\n",
" <th>Furniture / Home Store</th>\n",
" <th>Gaming Cafe</th>\n",
" <th>Garden</th>\n",
" <th>Garden Center</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gay Bar</th>\n",
" <th>General College &amp; University</th>\n",
" <th>General Entertainment</th>\n",
" <th>German Restaurant</th>\n",
" <th>Gift Shop</th>\n",
" <th>Gluten-free Restaurant</th>\n",
" <th>Golf Course</th>\n",
" <th>Gourmet Shop</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Gym Pool</th>\n",
" <th>Gymnastics Gym</th>\n",
" <th>Harbor / Marina</th>\n",
" <th>Hardware Store</th>\n",
" <th>Hawaiian Restaurant</th>\n",
" <th>Health &amp; Beauty Service</th>\n",
" <th>Health Food Store</th>\n",
" <th>Heliport</th>\n",
" <th>Herbs &amp; Spices Store</th>\n",
" <th>High School</th>\n",
" <th>Himalayan Restaurant</th>\n",
" <th>Historic Site</th>\n",
" <th>History Museum</th>\n",
" <th>Hobby Shop</th>\n",
" <th>Hookah Bar</th>\n",
" <th>Hostel</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Hotel Bar</th>\n",
" <th>Hotpot Restaurant</th>\n",
" <th>Ice Cream Shop</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Indie Movie Theater</th>\n",
" <th>Indie Theater</th>\n",
" <th>Irish Pub</th>\n",
" <th>Israeli Restaurant</th>\n",
" <th>Italian Restaurant</th>\n",
" <th>Japanese Curry Restaurant</th>\n",
" <th>Japanese Restaurant</th>\n",
" <th>Jazz Club</th>\n",
" <th>Jewelry Store</th>\n",
" <th>Jewish Restaurant</th>\n",
" <th>Juice Bar</th>\n",
" <th>Karaoke Bar</th>\n",
" <th>Kids Store</th>\n",
" <th>Korean Restaurant</th>\n",
" <th>Kosher Restaurant</th>\n",
" <th>Latin American Restaurant</th>\n",
" <th>Laundry Service</th>\n",
" <th>Lebanese Restaurant</th>\n",
" <th>Library</th>\n",
" <th>Lingerie Store</th>\n",
" <th>Liquor Store</th>\n",
" <th>Lounge</th>\n",
" <th>Malay Restaurant</th>\n",
" <th>Market</th>\n",
" <th>Martial Arts Dojo</th>\n",
" <th>Massage Studio</th>\n",
" <th>Medical Center</th>\n",
" <th>Mediterranean Restaurant</th>\n",
" <th>Memorial Site</th>\n",
" <th>Men's Store</th>\n",
" <th>Mexican Restaurant</th>\n",
" <th>Middle Eastern Restaurant</th>\n",
" <th>Mini Golf</th>\n",
" <th>Miscellaneous Shop</th>\n",
" <th>Mobile Phone Shop</th>\n",
" <th>Modern European Restaurant</th>\n",
" <th>Molecular Gastronomy Restaurant</th>\n",
" <th>Monument / Landmark</th>\n",
" <th>Moroccan Restaurant</th>\n",
" <th>Movie Theater</th>\n",
" <th>Museum</th>\n",
" <th>Music School</th>\n",
" <th>Music Store</th>\n",
" <th>Music Venue</th>\n",
" <th>Nail Salon</th>\n",
" <th>New American Restaurant</th>\n",
" <th>Newsstand</th>\n",
" <th>Nightclub</th>\n",
" <th>Non-Profit</th>\n",
" <th>Noodle House</th>\n",
" <th>North Indian Restaurant</th>\n",
" <th>Office</th>\n",
" <th>Opera House</th>\n",
" <th>Optical Shop</th>\n",
" <th>Organic Grocery</th>\n",
" <th>Other Nightlife</th>\n",
" <th>Outdoor Sculpture</th>\n",
" <th>Outdoors &amp; Recreation</th>\n",
" <th>Paella Restaurant</th>\n",
" <th>Pakistani Restaurant</th>\n",
" <th>Paper / Office Supplies Store</th>\n",
" <th>Park</th>\n",
" <th>Performing Arts Venue</th>\n",
" <th>Persian Restaurant</th>\n",
" <th>Peruvian Restaurant</th>\n",
" <th>Pet Café</th>\n",
" <th>Pet Service</th>\n",
" <th>Pet Store</th>\n",
" <th>Pharmacy</th>\n",
" <th>Piano Bar</th>\n",
" <th>Pie Shop</th>\n",
" <th>Pilates Studio</th>\n",
" <th>Pizza Place</th>\n",
" <th>Playground</th>\n",
" <th>Plaza</th>\n",
" <th>Poke Place</th>\n",
" <th>Pool</th>\n",
" <th>Portuguese Restaurant</th>\n",
" <th>Pub</th>\n",
" <th>Public Art</th>\n",
" <th>Ramen Restaurant</th>\n",
" <th>Record Shop</th>\n",
" <th>Recreation Center</th>\n",
" <th>Rental Car Location</th>\n",
" <th>Residential Building (Apartment / Condo)</th>\n",
" <th>Resort</th>\n",
" <th>Rest Area</th>\n",
" <th>Restaurant</th>\n",
" <th>River</th>\n",
" <th>Rock Climbing Spot</th>\n",
" <th>Rock Club</th>\n",
" <th>Roof Deck</th>\n",
" <th>Russian Restaurant</th>\n",
" <th>Sake Bar</th>\n",
" <th>Salad Place</th>\n",
" <th>Salon / Barbershop</th>\n",
" <th>Sandwich Place</th>\n",
" <th>Scandinavian Restaurant</th>\n",
" <th>Scenic Lookout</th>\n",
" <th>School</th>\n",
" <th>Sculpture Garden</th>\n",
" <th>Seafood Restaurant</th>\n",
" <th>Shanghai Restaurant</th>\n",
" <th>Shipping Store</th>\n",
" <th>Shoe Store</th>\n",
" <th>Shopping Mall</th>\n",
" <th>Skate Park</th>\n",
" <th>Skating Rink</th>\n",
" <th>Smoke Shop</th>\n",
" <th>Snack Place</th>\n",
" <th>Soba Restaurant</th>\n",
" <th>Social Club</th>\n",
" <th>Soup Place</th>\n",
" <th>Southern / Soul Food Restaurant</th>\n",
" <th>Spa</th>\n",
" <th>Spanish Restaurant</th>\n",
" <th>Speakeasy</th>\n",
" <th>Spiritual Center</th>\n",
" <th>Sporting Goods Shop</th>\n",
" <th>Sports Bar</th>\n",
" <th>Sports Club</th>\n",
" <th>Steakhouse</th>\n",
" <th>Street Art</th>\n",
" <th>Strip Club</th>\n",
" <th>Supermarket</th>\n",
" <th>Supplement Shop</th>\n",
" <th>Sushi Restaurant</th>\n",
" <th>Swiss Restaurant</th>\n",
" <th>Szechuan Restaurant</th>\n",
" <th>Taco Place</th>\n",
" <th>Tailor Shop</th>\n",
" <th>Taiwanese Restaurant</th>\n",
" <th>Tapas Restaurant</th>\n",
" <th>Tattoo Parlor</th>\n",
" <th>Tea Room</th>\n",
" <th>Tech Startup</th>\n",
" <th>Temple</th>\n",
" <th>Tennis Court</th>\n",
" <th>Tennis Stadium</th>\n",
" <th>Thai Restaurant</th>\n",
" <th>Theater</th>\n",
" <th>Theme Park Ride / Attraction</th>\n",
" <th>Thrift / Vintage Store</th>\n",
" <th>Tiki Bar</th>\n",
" <th>Tourist Information Center</th>\n",
" <th>Toy / Game Store</th>\n",
" <th>Track</th>\n",
" <th>Trail</th>\n",
" <th>Train</th>\n",
" <th>Tree</th>\n",
" <th>Turkish Restaurant</th>\n",
" <th>Udon Restaurant</th>\n",
" <th>Used Bookstore</th>\n",
" <th>Vegetarian / Vegan Restaurant</th>\n",
" <th>Venezuelan Restaurant</th>\n",
" <th>Veterinarian</th>\n",
" <th>Video Game Store</th>\n",
" <th>Video Store</th>\n",
" <th>Vietnamese Restaurant</th>\n",
" <th>Volleyball Court</th>\n",
" <th>Watch Shop</th>\n",
" <th>Waterfront</th>\n",
" <th>Weight Loss Center</th>\n",
" <th>Whisky Bar</th>\n",
" <th>Wine Bar</th>\n",
" <th>Wine Shop</th>\n",
" <th>Wings Joint</th>\n",
" <th>Women's Store</th>\n",
" <th>Yoga Studio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Accessories Store Adult Boutique Afghan Restaurant \\\n",
"0 Marble Hill 0 0 0 \n",
"1 Marble Hill 0 0 0 \n",
"2 Marble Hill 0 0 0 \n",
"3 Marble Hill 0 0 0 \n",
"4 Marble Hill 0 0 0 \n",
"\n",
" African Restaurant American Restaurant Animal Shelter Antique Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Arcade Arepa Restaurant Argentinian Restaurant Art Gallery Art Museum \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Arts & Crafts Store Asian Restaurant Athletics & Sports Auditorium \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Australian Restaurant Austrian Restaurant Auto Workshop BBQ Joint \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Baby Store Bagel Shop Bakery Bank Bar Baseball Field \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Basketball Court Bed & Breakfast Beer Bar Beer Garden Beer Store \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Belgian Restaurant Bike Rental / Bike Share Bike Shop Bike Trail \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Bistro Board Shop Boat or Ferry Bookstore Boutique Boxing Gym \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Brazilian Restaurant Breakfast Spot Bridal Shop Bubble Tea Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Building Burger Joint Burrito Place Bus Line Bus Station Bus Stop \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Business Service Butcher Cafeteria Café Cambodian Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Camera Store Candy Store Caribbean Restaurant Caucasian Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Cheese Shop Chinese Restaurant Chocolate Shop Christmas Market \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Climbing Gym Clothing Store Club House Cocktail Bar Coffee Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 1 \n",
"4 0 0 0 0 0 \n",
"\n",
" College Academic Building College Bookstore College Cafeteria \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" College Theater Comedy Club Community Center Concert Hall \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Convenience Store Cosmetics Shop Coworking Space Creperie \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Cuban Restaurant Cultural Center Cupcake Shop Cycle Studio \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Czech Restaurant Dance Studio Daycare Deli / Bodega Department Store \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Design Studio Dessert Shop Dim Sum Restaurant Diner Discount Store \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 1 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Dive Bar Dog Run Donut Shop Drugstore Dry Cleaner Dumpling Restaurant \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Duty-free Shop Eastern European Restaurant Electronics Store \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" English Restaurant Ethiopian Restaurant Event Space Exhibit \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Falafel Restaurant Farmers Market Fast Food Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Filipino Restaurant Fish Market Flea Market Flower Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Food & Drink Shop Food Court Food Truck Fountain French Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Fried Chicken Joint Frozen Yogurt Shop Furniture / Home Store \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Gaming Cafe Garden Garden Center Gas Station Gastropub Gay Bar \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" General College & University General Entertainment German Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Gift Shop Gluten-free Restaurant Golf Course Gourmet Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Greek Restaurant Grocery Store Gym Gym / Fitness Center Gym Pool \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Gymnastics Gym Harbor / Marina Hardware Store Hawaiian Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Health & Beauty Service Health Food Store Heliport Herbs & Spices Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" High School Himalayan Restaurant Historic Site History Museum \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Hobby Shop Hookah Bar Hostel Hot Dog Joint Hotel Hotel Bar \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Hotpot Restaurant Ice Cream Shop Indian Restaurant Indie Movie Theater \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Indie Theater Irish Pub Israeli Restaurant Italian Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Japanese Curry Restaurant Japanese Restaurant Jazz Club Jewelry Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Jewish Restaurant Juice Bar Karaoke Bar Kids Store Korean Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Kosher Restaurant Latin American Restaurant Laundry Service \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Lebanese Restaurant Library Lingerie Store Liquor Store Lounge \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Malay Restaurant Market Martial Arts Dojo Massage Studio \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Medical Center Mediterranean Restaurant Memorial Site Men's Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Mexican Restaurant Middle Eastern Restaurant Mini Golf \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Miscellaneous Shop Mobile Phone Shop Modern European Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Molecular Gastronomy Restaurant Monument / Landmark Moroccan Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Movie Theater Museum Music School Music Store Music Venue Nail Salon \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" New American Restaurant Newsstand Nightclub Non-Profit Noodle House \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" North Indian Restaurant Office Opera House Optical Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Organic Grocery Other Nightlife Outdoor Sculpture Outdoors & Recreation \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Paella Restaurant Pakistani Restaurant Paper / Office Supplies Store \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Park Performing Arts Venue Persian Restaurant Peruvian Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Pet Café Pet Service Pet Store Pharmacy Piano Bar Pie Shop \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Pilates Studio Pizza Place Playground Plaza Poke Place Pool \\\n",
"0 0 1 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Portuguese Restaurant Pub Public Art Ramen Restaurant Record Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Recreation Center Rental Car Location \\\n",
"0 0 0 \n",
"1 0 0 \n",
"2 0 0 \n",
"3 0 0 \n",
"4 0 0 \n",
"\n",
" Residential Building (Apartment / Condo) Resort Rest Area Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" River Rock Climbing Spot Rock Club Roof Deck Russian Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Sake Bar Salad Place Salon / Barbershop Sandwich Place \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Scandinavian Restaurant Scenic Lookout School Sculpture Garden \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Seafood Restaurant Shanghai Restaurant Shipping Store Shoe Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 1 0 0 0 \n",
"\n",
" Shopping Mall Skate Park Skating Rink Smoke Shop Snack Place \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Soba Restaurant Social Club Soup Place Southern / Soul Food Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Spa Spanish Restaurant Speakeasy Spiritual Center Sporting Goods Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Sports Bar Sports Club Steakhouse Street Art Strip Club Supermarket \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Supplement Shop Sushi Restaurant Swiss Restaurant Szechuan Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Taco Place Tailor Shop Taiwanese Restaurant Tapas Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Tattoo Parlor Tea Room Tech Startup Temple Tennis Court \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Tennis Stadium Thai Restaurant Theater Theme Park Ride / Attraction \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Thrift / Vintage Store Tiki Bar Tourist Information Center \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Toy / Game Store Track Trail Train Tree Turkish Restaurant \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Udon Restaurant Used Bookstore Vegetarian / Vegan Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Venezuelan Restaurant Veterinarian Video Game Store Video Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Vietnamese Restaurant Volleyball Court Watch Shop Waterfront \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Weight Loss Center Whisky Bar Wine Bar Wine Shop Wings Joint \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Women's Store Yoga Studio \n",
"0 0 0 \n",
"1 0 1 \n",
"2 0 0 \n",
"3 0 0 \n",
"4 0 0 "
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# one hot encoding\n",
"manhattan_onehot = pd.get_dummies(manhattan_venues[['Venue Category']], prefix=\"\", prefix_sep=\"\")\n",
"\n",
"# add neighborhood column back to dataframe\n",
"manhattan_onehot['Neighborhood'] = manhattan_venues['Neighborhood'] \n",
"\n",
"# move neighborhood column to the first column\n",
"fixed_columns = [manhattan_onehot.columns[-1]] + list(manhattan_onehot.columns[:-1])\n",
"manhattan_onehot = manhattan_onehot[fixed_columns]\n",
"\n",
"manhattan_onehot.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And let's examine the new dataframe size."
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(3308, 331)"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_onehot.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Next, let's group rows by neighborhood and by taking the mean of the frequency of occurrence of each category"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood</th>\n",
" <th>Accessories Store</th>\n",
" <th>Adult Boutique</th>\n",
" <th>Afghan Restaurant</th>\n",
" <th>African Restaurant</th>\n",
" <th>American Restaurant</th>\n",
" <th>Animal Shelter</th>\n",
" <th>Antique Shop</th>\n",
" <th>Arcade</th>\n",
" <th>Arepa Restaurant</th>\n",
" <th>Argentinian Restaurant</th>\n",
" <th>Art Gallery</th>\n",
" <th>Art Museum</th>\n",
" <th>Arts &amp; Crafts Store</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auditorium</th>\n",
" <th>Australian Restaurant</th>\n",
" <th>Austrian Restaurant</th>\n",
" <th>Auto Workshop</th>\n",
" <th>BBQ Joint</th>\n",
" <th>Baby Store</th>\n",
" <th>Bagel Shop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Bar</th>\n",
" <th>Baseball Field</th>\n",
" <th>Basketball Court</th>\n",
" <th>Bed &amp; Breakfast</th>\n",
" <th>Beer Bar</th>\n",
" <th>Beer Garden</th>\n",
" <th>Beer Store</th>\n",
" <th>Belgian Restaurant</th>\n",
" <th>Bike Rental / Bike Share</th>\n",
" <th>Bike Shop</th>\n",
" <th>Bike Trail</th>\n",
" <th>Bistro</th>\n",
" <th>Board Shop</th>\n",
" <th>Boat or Ferry</th>\n",
" <th>Bookstore</th>\n",
" <th>Boutique</th>\n",
" <th>Boxing Gym</th>\n",
" <th>Brazilian Restaurant</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Bridal Shop</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Building</th>\n",
" <th>Burger Joint</th>\n",
" <th>Burrito Place</th>\n",
" <th>Bus Line</th>\n",
" <th>Bus Station</th>\n",
" <th>Bus Stop</th>\n",
" <th>Business Service</th>\n",
" <th>Butcher</th>\n",
" <th>Cafeteria</th>\n",
" <th>Café</th>\n",
" <th>Cambodian Restaurant</th>\n",
" <th>Camera Store</th>\n",
" <th>Candy Store</th>\n",
" <th>Caribbean Restaurant</th>\n",
" <th>Caucasian Restaurant</th>\n",
" <th>Cheese Shop</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Chocolate Shop</th>\n",
" <th>Christmas Market</th>\n",
" <th>Climbing Gym</th>\n",
" <th>Clothing Store</th>\n",
" <th>Club House</th>\n",
" <th>Cocktail Bar</th>\n",
" <th>Coffee Shop</th>\n",
" <th>College Academic Building</th>\n",
" <th>College Bookstore</th>\n",
" <th>College Cafeteria</th>\n",
" <th>College Theater</th>\n",
" <th>Comedy Club</th>\n",
" <th>Community Center</th>\n",
" <th>Concert Hall</th>\n",
" <th>Convenience Store</th>\n",
" <th>Cosmetics Shop</th>\n",
" <th>Coworking Space</th>\n",
" <th>Creperie</th>\n",
" <th>Cuban Restaurant</th>\n",
" <th>Cultural Center</th>\n",
" <th>Cupcake Shop</th>\n",
" <th>Cycle Studio</th>\n",
" <th>Czech Restaurant</th>\n",
" <th>Dance Studio</th>\n",
" <th>Daycare</th>\n",
" <th>Deli / Bodega</th>\n",
" <th>Department Store</th>\n",
" <th>Design Studio</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Diner</th>\n",
" <th>Discount Store</th>\n",
" <th>Dive Bar</th>\n",
" <th>Dog Run</th>\n",
" <th>Donut Shop</th>\n",
" <th>Drugstore</th>\n",
" <th>Dry Cleaner</th>\n",
" <th>Dumpling Restaurant</th>\n",
" <th>Duty-free Shop</th>\n",
" <th>Eastern European Restaurant</th>\n",
" <th>Electronics Store</th>\n",
" <th>English Restaurant</th>\n",
" <th>Ethiopian Restaurant</th>\n",
" <th>Event Space</th>\n",
" <th>Exhibit</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Farmers Market</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Filipino Restaurant</th>\n",
" <th>Fish Market</th>\n",
" <th>Flea Market</th>\n",
" <th>Flower Shop</th>\n",
" <th>Food &amp; Drink Shop</th>\n",
" <th>Food Court</th>\n",
" <th>Food Truck</th>\n",
" <th>Fountain</th>\n",
" <th>French Restaurant</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Frozen Yogurt Shop</th>\n",
" <th>Furniture / Home Store</th>\n",
" <th>Gaming Cafe</th>\n",
" <th>Garden</th>\n",
" <th>Garden Center</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gay Bar</th>\n",
" <th>General College &amp; University</th>\n",
" <th>General Entertainment</th>\n",
" <th>German Restaurant</th>\n",
" <th>Gift Shop</th>\n",
" <th>Gluten-free Restaurant</th>\n",
" <th>Golf Course</th>\n",
" <th>Gourmet Shop</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Gym Pool</th>\n",
" <th>Gymnastics Gym</th>\n",
" <th>Harbor / Marina</th>\n",
" <th>Hardware Store</th>\n",
" <th>Hawaiian Restaurant</th>\n",
" <th>Health &amp; Beauty Service</th>\n",
" <th>Health Food Store</th>\n",
" <th>Heliport</th>\n",
" <th>Herbs &amp; Spices Store</th>\n",
" <th>High School</th>\n",
" <th>Himalayan Restaurant</th>\n",
" <th>Historic Site</th>\n",
" <th>History Museum</th>\n",
" <th>Hobby Shop</th>\n",
" <th>Hookah Bar</th>\n",
" <th>Hostel</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Hotel Bar</th>\n",
" <th>Hotpot Restaurant</th>\n",
" <th>Ice Cream Shop</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Indie Movie Theater</th>\n",
" <th>Indie Theater</th>\n",
" <th>Irish Pub</th>\n",
" <th>Israeli Restaurant</th>\n",
" <th>Italian Restaurant</th>\n",
" <th>Japanese Curry Restaurant</th>\n",
" <th>Japanese Restaurant</th>\n",
" <th>Jazz Club</th>\n",
" <th>Jewelry Store</th>\n",
" <th>Jewish Restaurant</th>\n",
" <th>Juice Bar</th>\n",
" <th>Karaoke Bar</th>\n",
" <th>Kids Store</th>\n",
" <th>Korean Restaurant</th>\n",
" <th>Kosher Restaurant</th>\n",
" <th>Latin American Restaurant</th>\n",
" <th>Laundry Service</th>\n",
" <th>Lebanese Restaurant</th>\n",
" <th>Library</th>\n",
" <th>Lingerie Store</th>\n",
" <th>Liquor Store</th>\n",
" <th>Lounge</th>\n",
" <th>Malay Restaurant</th>\n",
" <th>Market</th>\n",
" <th>Martial Arts Dojo</th>\n",
" <th>Massage Studio</th>\n",
" <th>Medical Center</th>\n",
" <th>Mediterranean Restaurant</th>\n",
" <th>Memorial Site</th>\n",
" <th>Men's Store</th>\n",
" <th>Mexican Restaurant</th>\n",
" <th>Middle Eastern Restaurant</th>\n",
" <th>Mini Golf</th>\n",
" <th>Miscellaneous Shop</th>\n",
" <th>Mobile Phone Shop</th>\n",
" <th>Modern European Restaurant</th>\n",
" <th>Molecular Gastronomy Restaurant</th>\n",
" <th>Monument / Landmark</th>\n",
" <th>Moroccan Restaurant</th>\n",
" <th>Movie Theater</th>\n",
" <th>Museum</th>\n",
" <th>Music School</th>\n",
" <th>Music Store</th>\n",
" <th>Music Venue</th>\n",
" <th>Nail Salon</th>\n",
" <th>New American Restaurant</th>\n",
" <th>Newsstand</th>\n",
" <th>Nightclub</th>\n",
" <th>Non-Profit</th>\n",
" <th>Noodle House</th>\n",
" <th>North Indian Restaurant</th>\n",
" <th>Office</th>\n",
" <th>Opera House</th>\n",
" <th>Optical Shop</th>\n",
" <th>Organic Grocery</th>\n",
" <th>Other Nightlife</th>\n",
" <th>Outdoor Sculpture</th>\n",
" <th>Outdoors &amp; Recreation</th>\n",
" <th>Paella Restaurant</th>\n",
" <th>Pakistani Restaurant</th>\n",
" <th>Paper / Office Supplies Store</th>\n",
" <th>Park</th>\n",
" <th>Performing Arts Venue</th>\n",
" <th>Persian Restaurant</th>\n",
" <th>Peruvian Restaurant</th>\n",
" <th>Pet Café</th>\n",
" <th>Pet Service</th>\n",
" <th>Pet Store</th>\n",
" <th>Pharmacy</th>\n",
" <th>Piano Bar</th>\n",
" <th>Pie Shop</th>\n",
" <th>Pilates Studio</th>\n",
" <th>Pizza Place</th>\n",
" <th>Playground</th>\n",
" <th>Plaza</th>\n",
" <th>Poke Place</th>\n",
" <th>Pool</th>\n",
" <th>Portuguese Restaurant</th>\n",
" <th>Pub</th>\n",
" <th>Public Art</th>\n",
" <th>Ramen Restaurant</th>\n",
" <th>Record Shop</th>\n",
" <th>Recreation Center</th>\n",
" <th>Rental Car Location</th>\n",
" <th>Residential Building (Apartment / Condo)</th>\n",
" <th>Resort</th>\n",
" <th>Rest Area</th>\n",
" <th>Restaurant</th>\n",
" <th>River</th>\n",
" <th>Rock Climbing Spot</th>\n",
" <th>Rock Club</th>\n",
" <th>Roof Deck</th>\n",
" <th>Russian Restaurant</th>\n",
" <th>Sake Bar</th>\n",
" <th>Salad Place</th>\n",
" <th>Salon / Barbershop</th>\n",
" <th>Sandwich Place</th>\n",
" <th>Scandinavian Restaurant</th>\n",
" <th>Scenic Lookout</th>\n",
" <th>School</th>\n",
" <th>Sculpture Garden</th>\n",
" <th>Seafood Restaurant</th>\n",
" <th>Shanghai Restaurant</th>\n",
" <th>Shipping Store</th>\n",
" <th>Shoe Store</th>\n",
" <th>Shopping Mall</th>\n",
" <th>Skate Park</th>\n",
" <th>Skating Rink</th>\n",
" <th>Smoke Shop</th>\n",
" <th>Snack Place</th>\n",
" <th>Soba Restaurant</th>\n",
" <th>Social Club</th>\n",
" <th>Soup Place</th>\n",
" <th>Southern / Soul Food Restaurant</th>\n",
" <th>Spa</th>\n"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment