Skip to content

Instantly share code, notes, and snippets.

@adityantamarapu
Created June 7, 2020 12:19
Show Gist options
  • Save adityantamarapu/582d2ab7b6928e4f9ace2fc619ed158d to your computer and use it in GitHub Desktop.
Save adityantamarapu/582d2ab7b6928e4f9ace2fc619ed158d to your computer and use it in GitHub Desktop.
Created on Skills Network Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Project Description"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"My friend Michelangelo wants to open a Pizza restaurant in Manhattan. Where would we recommend that he set it up?\n",
"To answer this question, we need to explore Pizza restaurants in Manhattan and find popular restaurants and analyze the dataset. We will use Foursquare API to explore the restaurants."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Getting the Dataset"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"CLIENT_ID = 'NM2ZJ4MDHZEN140JF3CDFT5JKTFY5XKPACFFJV1LR2ORR3W0' # your Foursquare ID\n",
"CLIENT_SECRET = 'GYL1KCRUWNUQKY51A5E4FKOLYSAEG4C4GIO2VEFUNITJYZFC' # your Foursquare Secret\n",
"VERSION = '20180605'"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true,
"jupyter": {
"outputs_hidden": true
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting package metadata (current_repodata.json): done\n",
"Solving environment: done\n",
"\n",
"## Package Plan ##\n",
"\n",
" environment location: /home/jupyterlab/conda/envs/python\n",
"\n",
" added / updated specs:\n",
" - geopy\n",
"\n",
"\n",
"The following packages will be downloaded:\n",
"\n",
" package | build\n",
" ---------------------------|-----------------\n",
" geographiclib-1.50 | py_0 34 KB conda-forge\n",
" geopy-1.22.0 | pyh9f0ad1d_0 63 KB conda-forge\n",
" ------------------------------------------------------------\n",
" Total: 97 KB\n",
"\n",
"The following NEW packages will be INSTALLED:\n",
"\n",
" geographiclib conda-forge/noarch::geographiclib-1.50-py_0\n",
" geopy conda-forge/noarch::geopy-1.22.0-pyh9f0ad1d_0\n",
"\n",
"\n",
"\n",
"Downloading and Extracting Packages\n",
"geopy-1.22.0 | 63 KB | ##################################### | 100% \n",
"geographiclib-1.50 | 34 KB | ##################################### | 100% \n",
"Preparing transaction: done\n",
"Verifying transaction: done\n",
"Executing transaction: done\n",
"40.7579801 -73.9855452\n"
]
}
],
"source": [
"address='Theater District, New York, NY 10020, USA'\n",
"# lat=40.761432\n",
"# lng=-73.982762\n",
"!conda install -c conda-forge geopy --yes \n",
"from geopy.geocoders import Nominatim\n",
"geolocator = Nominatim(user_agent=\"foursquare_agent\")\n",
"location = geolocator.geocode(address)\n",
"latitude = location.latitude\n",
"longitude = location.longitude\n",
"print(latitude, longitude)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"LIMIT=30\n",
"search_query='Pizza'\n",
"radius=500"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'https://api.foursquare.com/v2/venues/search?client_id=NM2ZJ4MDHZEN140JF3CDFT5JKTFY5XKPACFFJV1LR2ORR3W0&client_secret=GYL1KCRUWNUQKY51A5E4FKOLYSAEG4C4GIO2VEFUNITJYZFC&ll=40.7579801,-73.9855452&v=20180605&query=Pizza&radius=500&limit=30'"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"url = 'https://api.foursquare.com/v2/venues/search?client_id={}&client_secret={}&ll={},{}&v={}&query={}&radius={}&limit={}'.format(CLIENT_ID, CLIENT_SECRET, latitude, longitude, VERSION, search_query, radius, LIMIT)\n",
"url"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true,
"jupyter": {
"outputs_hidden": true
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'meta': {'code': 200, 'requestId': '5edcd86a9c6f59001bd01b26'},\n",
" 'response': {'venues': [{'id': '598de3c33b83073f81718721',\n",
" 'name': \"Joe's Pizza\",\n",
" 'location': {'address': '1435 Broadway',\n",
" 'crossStreet': 'W 40th St',\n",
" 'lat': 40.75467949999999,\n",
" 'lng': -73.9870291,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75467949999999,\n",
" 'lng': -73.9870291}],\n",
" 'distance': 388,\n",
" 'postalCode': '10018',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1435 Broadway (W 40th St)',\n",
" 'New York, NY 10018',\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': '469121',\n",
" 'url': 'https://www.seamless.com/menu/joes-pizza-1435-broadway-new-york/469121?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=469121',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4aa88507f964a5208a5120e3',\n",
" 'name': \"Famous Amadeus Pizza - Hell's Kitchen\",\n",
" 'location': {'address': '840 8th Ave',\n",
" 'lat': 40.76235730570203,\n",
" 'lng': -73.98566722869873,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.76235730570203,\n",
" 'lng': -73.98566722869873},\n",
" {'label': 'entrance', 'lat': 40.762595, 'lng': -73.985674}],\n",
" 'distance': 487,\n",
" 'postalCode': '10019',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['840 8th Ave',\n",
" 'New York, NY 10019',\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': '65046',\n",
" 'url': 'https://www.seamless.com/menu/amadeus-pizza-840-8th-ave-new-york/65046?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=65046',\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",
" 'venuePage': {'id': '47491715'},\n",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4dc9931218387d1569587cf9',\n",
" 'name': '99¢ Pizza Spot',\n",
" 'location': {'address': '43rd and 8th Ave',\n",
" 'crossStreet': 'Corner of 43rd',\n",
" 'lat': 40.758062033149805,\n",
" 'lng': -73.98948968496855,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.758062033149805,\n",
" 'lng': -73.98948968496855}],\n",
" 'distance': 332,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['43rd and 8th Ave (Corner of 43rd)',\n",
" 'New York, NY 10036',\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': '206336',\n",
" 'url': 'https://www.seamless.com/menu/99-cent-express-pizza-301-w-43rd-st-new-york/206336?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=206336',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4b91992af964a520b1c833e3',\n",
" 'name': \"Domino's Pizza\",\n",
" 'location': {'address': '227 W 40th St',\n",
" 'crossStreet': 'btw 7th & 8th',\n",
" 'lat': 40.75529519335076,\n",
" 'lng': -73.98882418870926,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75529519335076,\n",
" 'lng': -73.98882418870926},\n",
" {'label': 'entrance', 'lat': 40.755586, 'lng': -73.989638}],\n",
" 'distance': 407,\n",
" 'postalCode': '10018',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['227 W 40th St (btw 7th & 8th)',\n",
" 'New York, NY 10018',\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': '295996',\n",
" 'url': 'https://www.seamless.com/menu/dominos-pizza-227-w-40th-st-new-york/295996?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=295996',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4cd73e0367adf04dd5653791',\n",
" 'name': 'Mama’s Pizza',\n",
" 'location': {'address': '705 8th Ave',\n",
" 'lat': 40.75872357572102,\n",
" 'lng': -73.98892405251033,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75872357572102,\n",
" 'lng': -73.98892405251033}],\n",
" 'distance': 296,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['705 8th Ave',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '509c8753e4b0ca91f9ee1756',\n",
" 'name': '99¢ Fresh Pizza',\n",
" 'location': {'address': '143 W 40th St',\n",
" 'lat': 40.75457557893008,\n",
" 'lng': -73.98758014806872,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75457557893008,\n",
" 'lng': -73.98758014806872}],\n",
" 'distance': 416,\n",
" 'postalCode': '10018',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['143 W 40th St',\n",
" 'New York, NY 10018',\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': '2111937',\n",
" 'url': 'https://www.seamless.com/menu/99-cent-fresh-pizza-143-w-40th-st-new-york/2111937?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=2111937',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4b2ac163f964a520fcae24e3',\n",
" 'name': 'Pizza Hut',\n",
" 'location': {'address': '761-69 7th Ave',\n",
" 'crossStreet': '50th St.',\n",
" 'lat': 40.761113973251526,\n",
" 'lng': -73.98288577795034,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.761113973251526,\n",
" 'lng': -73.98288577795034}],\n",
" 'distance': 414,\n",
" 'postalCode': '10019',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['761-69 7th Ave (50th St.)',\n",
" 'New York, NY 10019',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4e24cec8d4c04ce22533785e',\n",
" 'name': 'Times Square Pizza',\n",
" 'location': {'address': '765 8th Ave',\n",
" 'lat': 40.76056822794468,\n",
" 'lng': -73.98740193948298,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.76056822794468,\n",
" 'lng': -73.98740193948298}],\n",
" 'distance': 327,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['765 8th Ave',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '5a5cf46d2e2680114c06eb1a',\n",
" 'name': 'Bryant Park Pizza',\n",
" 'location': {'address': '1095 Avenue Of The Americas',\n",
" 'lat': 40.7546911111111,\n",
" 'lng': -73.9842244444445,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.7546911111111,\n",
" 'lng': -73.9842244444445}],\n",
" 'distance': 382,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1095 Avenue Of The Americas',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4e4c445abd413c4cc6681705',\n",
" 'name': 'Pizza In The City',\n",
" 'location': {'address': '416 W 46th St',\n",
" 'lat': 40.759734,\n",
" 'lng': -73.991704,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.759734,\n",
" 'lng': -73.991704}],\n",
" 'distance': 554,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['416 W 46th St',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4b4c704bf964a520feb226e3',\n",
" 'name': \"Famous Original Ray's Pizza\",\n",
" 'location': {'address': '736 7th Ave',\n",
" 'crossStreet': 'btwn 48th & 49th St.',\n",
" 'lat': 40.760437746601376,\n",
" 'lng': -73.98392887296407,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.760437746601376,\n",
" 'lng': -73.98392887296407},\n",
" {'label': 'entrance', 'lat': 40.760368, 'lng': -73.984}],\n",
" 'distance': 305,\n",
" 'postalCode': '10019',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['736 7th Ave (btwn 48th & 49th St.)',\n",
" 'New York, NY 10019',\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': '292848',\n",
" 'url': 'https://www.seamless.com/menu/famous-original-rays-pizza-736-7th-ave-new-york/292848?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=292848',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4e4e4a31bd4101d0d7a6f154',\n",
" 'name': 'Pronto Pizza & Beer',\n",
" 'location': {'address': '30 W 48th St',\n",
" 'lat': 40.758220893723006,\n",
" 'lng': -73.97949801942443,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.758220893723006,\n",
" 'lng': -73.97949801942443},\n",
" {'label': 'entrance', 'lat': 40.757827, 'lng': -73.979669}],\n",
" 'distance': 510,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['30 W 48th St',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4addf59cf964a520c36621e3',\n",
" 'name': 'Le Mirage Cafe & Pizza',\n",
" 'location': {'address': '20 W 43rd St',\n",
" 'lat': 40.754712244422876,\n",
" 'lng': -73.98175938588064,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.754712244422876,\n",
" 'lng': -73.98175938588064}],\n",
" 'distance': 483,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['20 W 43rd St',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4c7d96bbd65437043defc0a2',\n",
" 'name': '2 Bros. Pizza',\n",
" 'location': {'address': '31 W 46th St',\n",
" 'crossStreet': 'btwn 5th & 6th Ave',\n",
" 'lat': 40.75672851136888,\n",
" 'lng': -73.98055343233084,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75672851136888,\n",
" 'lng': -73.98055343233084},\n",
" {'label': 'entrance', 'lat': 40.756679, 'lng': -73.980303}],\n",
" 'distance': 443,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['31 W 46th St (btwn 5th & 6th Ave)',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4bcddf98b6c49c742b169691',\n",
" 'name': 'Pizza Pasta',\n",
" 'location': {'address': 'Lexington Ave',\n",
" 'crossStreet': 'at E 93rd',\n",
" 'lat': 40.75870920855404,\n",
" 'lng': -73.98145622842769,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75870920855404,\n",
" 'lng': -73.98145622842769}],\n",
" 'distance': 354,\n",
" 'postalCode': '10022',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Lexington Ave (at E 93rd)',\n",
" 'New York, NY 10022',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d110941735',\n",
" 'name': 'Italian Restaurant',\n",
" 'pluralName': 'Italian Restaurants',\n",
" 'shortName': 'Italian',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/italian_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4c3ddfeb83a3a5937140ed33',\n",
" 'name': 'Pizza Place',\n",
" 'location': {'lat': 40.75368157338077,\n",
" 'lng': -73.9836141525577,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75368157338077,\n",
" 'lng': -73.9836141525577}],\n",
" 'distance': 505,\n",
" 'postalCode': '10018',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['New York, NY 10018', '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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4c2fce5a3896e21e75a2e490',\n",
" 'name': 'iPizzaNY',\n",
" 'location': {'address': '642 9th Ave',\n",
" 'crossStreet': 'btwn 45th & 46th St',\n",
" 'lat': 40.760492976454806,\n",
" 'lng': -73.99109772294537,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.760492976454806,\n",
" 'lng': -73.99109772294537}],\n",
" 'distance': 545,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['642 9th Ave (btwn 45th & 46th St)',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '599b0c1d31ac6c7b96420e71',\n",
" 'name': 'Pizza Parlor',\n",
" 'location': {'address': '1095 Avenue Of The Americas',\n",
" 'lat': 40.754508,\n",
" 'lng': -73.984705,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.754508,\n",
" 'lng': -73.984705}],\n",
" 'distance': 392,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1095 Avenue Of The Americas',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '593ae2d1f427de5f7fc75fe3',\n",
" 'name': 'Rock Pizza Scissors',\n",
" 'location': {'address': '1471 Broadway',\n",
" 'lat': 40.756198,\n",
" 'lng': -73.986535,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.756198,\n",
" 'lng': -73.986535}],\n",
" 'distance': 215,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1471 Broadway',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4b4cb8adf964a520c9bb26e3',\n",
" 'name': 'Pizza Place Next To Paramount Hotel',\n",
" 'location': {'address': '210-226 W 46th St',\n",
" 'lat': 40.76241466588694,\n",
" 'lng': -73.98743637356685,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.76241466588694,\n",
" 'lng': -73.98743637356685}],\n",
" 'distance': 518,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['210-226 W 46th St',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4e3c27b3d22d102e852fdb59',\n",
" 'name': \"John's resturant + pizza\",\n",
" 'location': {'address': '306 12th St',\n",
" 'lat': 40.75835312290508,\n",
" 'lng': -73.98852104404719,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.75835312290508,\n",
" 'lng': -73.98852104404719}],\n",
" 'distance': 254,\n",
" 'postalCode': '10019',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['306 12th St',\n",
" 'New York, NY 10019',\n",
" 'United States']},\n",
" 'categories': [],\n",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '5e287e0e144dc80008e5d5a0',\n",
" 'name': 'Artichoke Pizza',\n",
" 'location': {'address': '1410 Broadway',\n",
" 'crossStreet': '39th St',\n",
" 'lat': 40.753272,\n",
" 'lng': -73.986648,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.753272,\n",
" 'lng': -73.986648}],\n",
" 'distance': 532,\n",
" 'postalCode': '10018',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1410 Broadway (39th St)',\n",
" 'New York, NY 10018',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4f32447519836c91c7c6c727',\n",
" 'name': \"Ray's Real Pizza\",\n",
" 'location': {'address': '709 8th Ave',\n",
" 'lat': 40.758801,\n",
" 'lng': -73.9888,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.758801,\n",
" 'lng': -73.9888},\n",
" {'label': 'entrance', 'lat': 40.759032, 'lng': -73.988689}],\n",
" 'distance': 289,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['709 8th Ave',\n",
" 'New York, NY 10036',\n",
" 'United States']},\n",
" 'categories': [{'id': '4d4b7105d754a06374d81259',\n",
" 'name': 'Food',\n",
" 'pluralName': 'Food',\n",
" 'shortName': 'Food',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/default_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '5891509a65be5835dedb1957',\n",
" 'name': 'Acerra Brick Oven Pizza',\n",
" 'location': {'address': '142 W 49th St',\n",
" 'lat': 40.7599775,\n",
" 'lng': -73.982976,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.7599775,\n",
" 'lng': -73.982976},\n",
" {'label': 'entrance', 'lat': 40.760025, 'lng': -73.982906}],\n",
" 'distance': 310,\n",
" 'postalCode': '10019',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['142 W 49th St',\n",
" 'New York, NY 10019',\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': '264801',\n",
" 'url': 'https://www.seamless.com/menu/acerra-brick-oven-pizza-142a-w-49th-st-new-york/264801?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=264801',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4afa1ac2f964a520c81622e3',\n",
" 'name': 'Villa Pizza',\n",
" 'location': {'address': '263 West 42nd St',\n",
" 'crossStreet': 'at 8th Ave',\n",
" 'lat': 40.757291,\n",
" 'lng': -73.989259,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.757291,\n",
" 'lng': -73.989259}],\n",
" 'distance': 322,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['263 West 42nd St (at 8th Ave)',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4af5d32bf964a5205dfd21e3',\n",
" 'name': 'Z Deli & Pizza',\n",
" 'location': {'address': '803 8th Ave',\n",
" 'crossStreet': 'btwn 48th & 49th St.',\n",
" 'lat': 40.76141387737374,\n",
" 'lng': -73.98674129122485,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.76141387737374,\n",
" 'lng': -73.98674129122485},\n",
" {'label': 'entrance', 'lat': 40.76143, 'lng': -73.986935}],\n",
" 'distance': 395,\n",
" 'postalCode': '10019',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['803 8th Ave (btwn 48th & 49th St.)',\n",
" 'New York, NY 10019',\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': '65681',\n",
" 'url': 'https://www.seamless.com/menu/z-deli-pizzeria-803-8th-ave-new-york/65681?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=65681',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4b32d4def964a520ad1425e3',\n",
" 'name': \"Sal's Pizza\",\n",
" 'location': {'address': '1600 Broadway',\n",
" 'crossStreet': 'Broadway and 52nd',\n",
" 'lat': 40.76169277247975,\n",
" 'lng': -73.98441188965037,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.76169277247975,\n",
" 'lng': -73.98441188965037}],\n",
" 'distance': 424,\n",
" 'postalCode': '10019',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1600 Broadway (Broadway and 52nd)',\n",
" 'New York, NY 10019',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '5c351c9c121384002c5d27e7',\n",
" 'name': 'Upside Pizza',\n",
" 'location': {'address': '598 8th Ave',\n",
" 'crossStreet': 'at W 39th St',\n",
" 'lat': 40.755387883317105,\n",
" 'lng': -73.99109507455074,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.755387883317105,\n",
" 'lng': -73.99109507455074}],\n",
" 'distance': 549,\n",
" 'postalCode': '10018',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['598 8th Ave (at W 39th St)',\n",
" 'New York, NY 10018',\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': '1443984',\n",
" 'url': 'https://www.seamless.com/menu/upside-pizza-598-8th-ave-new-york/1443984?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=1443984',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '5d018831826444002ca1a84e',\n",
" 'name': 'Bryant Park Pizza Parlor',\n",
" 'location': {'address': '1095 Avenue of the Americas',\n",
" 'lat': 40.7546911111111,\n",
" 'lng': -73.9842244444445,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.7546911111111,\n",
" 'lng': -73.9842244444445}],\n",
" 'distance': 382,\n",
" 'postalCode': '10036',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1095 Avenue of the Americas',\n",
" 'New York, NY 10036',\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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False},\n",
" {'id': '4e31a2401495f249f76dd524',\n",
" 'name': 'Chelsea Pizza',\n",
" 'location': {'address': '301 10th ave',\n",
" 'lat': 40.757318590236494,\n",
" 'lng': -73.99132738525326,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.757318590236494,\n",
" 'lng': -73.99132738525326}],\n",
" 'distance': 493,\n",
" 'cc': 'US',\n",
" 'city': 'Chelsea',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['301 10th ave', 'Chelsea, NY', '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",
" 'referralId': 'v-1591531812',\n",
" 'hasPerk': False}]}}"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import requests\n",
"results=requests.get(url).json()\n",
"results"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/jupyterlab/conda/envs/python/lib/python3.6/site-packages/ipykernel_launcher.py:3: FutureWarning: pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead\n",
" This is separate from the ipykernel package so we can avoid doing imports until\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>id</th>\n",
" <th>name</th>\n",
" <th>categories</th>\n",
" <th>referralId</th>\n",
" <th>hasPerk</th>\n",
" <th>location.address</th>\n",
" <th>location.crossStreet</th>\n",
" <th>location.lat</th>\n",
" <th>location.lng</th>\n",
" <th>location.labeledLatLngs</th>\n",
" <th>...</th>\n",
" <th>location.state</th>\n",
" <th>location.country</th>\n",
" <th>location.formattedAddress</th>\n",
" <th>delivery.id</th>\n",
" <th>delivery.url</th>\n",
" <th>delivery.provider.name</th>\n",
" <th>delivery.provider.icon.prefix</th>\n",
" <th>delivery.provider.icon.sizes</th>\n",
" <th>delivery.provider.icon.name</th>\n",
" <th>venuePage.id</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>598de3c33b83073f81718721</td>\n",
" <td>Joe's Pizza</td>\n",
" <td>[{'id': '4bf58dd8d48988d1ca941735', 'name': 'P...</td>\n",
" <td>v-1591531812</td>\n",
" <td>False</td>\n",
" <td>1435 Broadway</td>\n",
" <td>W 40th St</td>\n",
" <td>40.754679</td>\n",
" <td>-73.987029</td>\n",
" <td>[{'label': 'display', 'lat': 40.75467949999999...</td>\n",
" <td>...</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[1435 Broadway (W 40th St), New York, NY 10018...</td>\n",
" <td>469121</td>\n",
" <td>https://www.seamless.com/menu/joes-pizza-1435-...</td>\n",
" <td>seamless</td>\n",
" <td>https://fastly.4sqi.net/img/general/cap/</td>\n",
" <td>[40, 50]</td>\n",
" <td>/delivery_provider_seamless_20180129.png</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>4aa88507f964a5208a5120e3</td>\n",
" <td>Famous Amadeus Pizza - Hell's Kitchen</td>\n",
" <td>[{'id': '4bf58dd8d48988d1ca941735', 'name': 'P...</td>\n",
" <td>v-1591531812</td>\n",
" <td>False</td>\n",
" <td>840 8th Ave</td>\n",
" <td>NaN</td>\n",
" <td>40.762357</td>\n",
" <td>-73.985667</td>\n",
" <td>[{'label': 'display', 'lat': 40.76235730570203...</td>\n",
" <td>...</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[840 8th Ave, New York, NY 10019, United States]</td>\n",
" <td>65046</td>\n",
" <td>https://www.seamless.com/menu/amadeus-pizza-84...</td>\n",
" <td>seamless</td>\n",
" <td>https://fastly.4sqi.net/img/general/cap/</td>\n",
" <td>[40, 50]</td>\n",
" <td>/delivery_provider_seamless_20180129.png</td>\n",
" <td>47491715</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>4dc9931218387d1569587cf9</td>\n",
" <td>99¢ Pizza Spot</td>\n",
" <td>[{'id': '4bf58dd8d48988d1ca941735', 'name': 'P...</td>\n",
" <td>v-1591531812</td>\n",
" <td>False</td>\n",
" <td>43rd and 8th Ave</td>\n",
" <td>Corner of 43rd</td>\n",
" <td>40.758062</td>\n",
" <td>-73.989490</td>\n",
" <td>[{'label': 'display', 'lat': 40.75806203314980...</td>\n",
" <td>...</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[43rd and 8th Ave (Corner of 43rd), New York, ...</td>\n",
" <td>206336</td>\n",
" <td>https://www.seamless.com/menu/99-cent-express-...</td>\n",
" <td>seamless</td>\n",
" <td>https://fastly.4sqi.net/img/general/cap/</td>\n",
" <td>[40, 50]</td>\n",
" <td>/delivery_provider_seamless_20180129.png</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4b91992af964a520b1c833e3</td>\n",
" <td>Domino's Pizza</td>\n",
" <td>[{'id': '4bf58dd8d48988d1ca941735', 'name': 'P...</td>\n",
" <td>v-1591531812</td>\n",
" <td>False</td>\n",
" <td>227 W 40th St</td>\n",
" <td>btw 7th &amp; 8th</td>\n",
" <td>40.755295</td>\n",
" <td>-73.988824</td>\n",
" <td>[{'label': 'display', 'lat': 40.75529519335076...</td>\n",
" <td>...</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[227 W 40th St (btw 7th &amp; 8th), New York, NY 1...</td>\n",
" <td>295996</td>\n",
" <td>https://www.seamless.com/menu/dominos-pizza-22...</td>\n",
" <td>seamless</td>\n",
" <td>https://fastly.4sqi.net/img/general/cap/</td>\n",
" <td>[40, 50]</td>\n",
" <td>/delivery_provider_seamless_20180129.png</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4cd73e0367adf04dd5653791</td>\n",
" <td>Mama’s Pizza</td>\n",
" <td>[{'id': '4bf58dd8d48988d1ca941735', 'name': 'P...</td>\n",
" <td>v-1591531812</td>\n",
" <td>False</td>\n",
" <td>705 8th Ave</td>\n",
" <td>NaN</td>\n",
" <td>40.758724</td>\n",
" <td>-73.988924</td>\n",
" <td>[{'label': 'display', 'lat': 40.75872357572102...</td>\n",
" <td>...</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[705 8th Ave, New York, NY 10036, United States]</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 24 columns</p>\n",
"</div>"
],
"text/plain": [
" id name \\\n",
"0 598de3c33b83073f81718721 Joe's Pizza \n",
"1 4aa88507f964a5208a5120e3 Famous Amadeus Pizza - Hell's Kitchen \n",
"2 4dc9931218387d1569587cf9 99¢ Pizza Spot \n",
"3 4b91992af964a520b1c833e3 Domino's Pizza \n",
"4 4cd73e0367adf04dd5653791 Mama’s Pizza \n",
"\n",
" categories referralId hasPerk \\\n",
"0 [{'id': '4bf58dd8d48988d1ca941735', 'name': 'P... v-1591531812 False \n",
"1 [{'id': '4bf58dd8d48988d1ca941735', 'name': 'P... v-1591531812 False \n",
"2 [{'id': '4bf58dd8d48988d1ca941735', 'name': 'P... v-1591531812 False \n",
"3 [{'id': '4bf58dd8d48988d1ca941735', 'name': 'P... v-1591531812 False \n",
"4 [{'id': '4bf58dd8d48988d1ca941735', 'name': 'P... v-1591531812 False \n",
"\n",
" location.address location.crossStreet location.lat location.lng \\\n",
"0 1435 Broadway W 40th St 40.754679 -73.987029 \n",
"1 840 8th Ave NaN 40.762357 -73.985667 \n",
"2 43rd and 8th Ave Corner of 43rd 40.758062 -73.989490 \n",
"3 227 W 40th St btw 7th & 8th 40.755295 -73.988824 \n",
"4 705 8th Ave NaN 40.758724 -73.988924 \n",
"\n",
" location.labeledLatLngs ... location.state \\\n",
"0 [{'label': 'display', 'lat': 40.75467949999999... ... NY \n",
"1 [{'label': 'display', 'lat': 40.76235730570203... ... NY \n",
"2 [{'label': 'display', 'lat': 40.75806203314980... ... NY \n",
"3 [{'label': 'display', 'lat': 40.75529519335076... ... NY \n",
"4 [{'label': 'display', 'lat': 40.75872357572102... ... NY \n",
"\n",
" location.country location.formattedAddress \\\n",
"0 United States [1435 Broadway (W 40th St), New York, NY 10018... \n",
"1 United States [840 8th Ave, New York, NY 10019, United States] \n",
"2 United States [43rd and 8th Ave (Corner of 43rd), New York, ... \n",
"3 United States [227 W 40th St (btw 7th & 8th), New York, NY 1... \n",
"4 United States [705 8th Ave, New York, NY 10036, United States] \n",
"\n",
" delivery.id delivery.url \\\n",
"0 469121 https://www.seamless.com/menu/joes-pizza-1435-... \n",
"1 65046 https://www.seamless.com/menu/amadeus-pizza-84... \n",
"2 206336 https://www.seamless.com/menu/99-cent-express-... \n",
"3 295996 https://www.seamless.com/menu/dominos-pizza-22... \n",
"4 NaN NaN \n",
"\n",
" delivery.provider.name delivery.provider.icon.prefix \\\n",
"0 seamless https://fastly.4sqi.net/img/general/cap/ \n",
"1 seamless https://fastly.4sqi.net/img/general/cap/ \n",
"2 seamless https://fastly.4sqi.net/img/general/cap/ \n",
"3 seamless https://fastly.4sqi.net/img/general/cap/ \n",
"4 NaN NaN \n",
"\n",
" delivery.provider.icon.sizes delivery.provider.icon.name \\\n",
"0 [40, 50] /delivery_provider_seamless_20180129.png \n",
"1 [40, 50] /delivery_provider_seamless_20180129.png \n",
"2 [40, 50] /delivery_provider_seamless_20180129.png \n",
"3 [40, 50] /delivery_provider_seamless_20180129.png \n",
"4 NaN NaN \n",
"\n",
" venuePage.id \n",
"0 NaN \n",
"1 47491715 \n",
"2 NaN \n",
"3 NaN \n",
"4 NaN \n",
"\n",
"[5 rows x 24 columns]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from pandas.io.json import json_normalize\n",
"venues=results['response']['venues']\n",
"df=json_normalize(venues)\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Filter the Dataset"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"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>address</th>\n",
" <th>crossStreet</th>\n",
" <th>lat</th>\n",
" <th>lng</th>\n",
" <th>labeledLatLngs</th>\n",
" <th>distance</th>\n",
" <th>postalCode</th>\n",
" <th>cc</th>\n",
" <th>city</th>\n",
" <th>state</th>\n",
" <th>country</th>\n",
" <th>formattedAddress</th>\n",
" <th>id</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Joe's Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>1435 Broadway</td>\n",
" <td>W 40th St</td>\n",
" <td>40.754679</td>\n",
" <td>-73.987029</td>\n",
" <td>[{'label': 'display', 'lat': 40.75467949999999...</td>\n",
" <td>388</td>\n",
" <td>10018</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[1435 Broadway (W 40th St), New York, NY 10018...</td>\n",
" <td>598de3c33b83073f81718721</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Famous Amadeus Pizza - Hell's Kitchen</td>\n",
" <td>Pizza Place</td>\n",
" <td>840 8th Ave</td>\n",
" <td>NaN</td>\n",
" <td>40.762357</td>\n",
" <td>-73.985667</td>\n",
" <td>[{'label': 'display', 'lat': 40.76235730570203...</td>\n",
" <td>487</td>\n",
" <td>10019</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[840 8th Ave, New York, NY 10019, United States]</td>\n",
" <td>4aa88507f964a5208a5120e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>99¢ Pizza Spot</td>\n",
" <td>Pizza Place</td>\n",
" <td>43rd and 8th Ave</td>\n",
" <td>Corner of 43rd</td>\n",
" <td>40.758062</td>\n",
" <td>-73.989490</td>\n",
" <td>[{'label': 'display', 'lat': 40.75806203314980...</td>\n",
" <td>332</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[43rd and 8th Ave (Corner of 43rd), New York, ...</td>\n",
" <td>4dc9931218387d1569587cf9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Domino's Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>227 W 40th St</td>\n",
" <td>btw 7th &amp; 8th</td>\n",
" <td>40.755295</td>\n",
" <td>-73.988824</td>\n",
" <td>[{'label': 'display', 'lat': 40.75529519335076...</td>\n",
" <td>407</td>\n",
" <td>10018</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[227 W 40th St (btw 7th &amp; 8th), New York, NY 1...</td>\n",
" <td>4b91992af964a520b1c833e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Mama’s Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>705 8th Ave</td>\n",
" <td>NaN</td>\n",
" <td>40.758724</td>\n",
" <td>-73.988924</td>\n",
" <td>[{'label': 'display', 'lat': 40.75872357572102...</td>\n",
" <td>296</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[705 8th Ave, New York, NY 10036, United States]</td>\n",
" <td>4cd73e0367adf04dd5653791</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>99¢ Fresh Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>143 W 40th St</td>\n",
" <td>NaN</td>\n",
" <td>40.754576</td>\n",
" <td>-73.987580</td>\n",
" <td>[{'label': 'display', 'lat': 40.75457557893008...</td>\n",
" <td>416</td>\n",
" <td>10018</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[143 W 40th St, New York, NY 10018, United Sta...</td>\n",
" <td>509c8753e4b0ca91f9ee1756</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Pizza Hut</td>\n",
" <td>Pizza Place</td>\n",
" <td>761-69 7th Ave</td>\n",
" <td>50th St.</td>\n",
" <td>40.761114</td>\n",
" <td>-73.982886</td>\n",
" <td>[{'label': 'display', 'lat': 40.76111397325152...</td>\n",
" <td>414</td>\n",
" <td>10019</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[761-69 7th Ave (50th St.), New York, NY 10019...</td>\n",
" <td>4b2ac163f964a520fcae24e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Times Square Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>765 8th Ave</td>\n",
" <td>NaN</td>\n",
" <td>40.760568</td>\n",
" <td>-73.987402</td>\n",
" <td>[{'label': 'display', 'lat': 40.76056822794468...</td>\n",
" <td>327</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[765 8th Ave, New York, NY 10036, United States]</td>\n",
" <td>4e24cec8d4c04ce22533785e</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Bryant Park Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>1095 Avenue Of The Americas</td>\n",
" <td>NaN</td>\n",
" <td>40.754691</td>\n",
" <td>-73.984224</td>\n",
" <td>[{'label': 'display', 'lat': 40.7546911111111,...</td>\n",
" <td>382</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[1095 Avenue Of The Americas, New York, NY 100...</td>\n",
" <td>5a5cf46d2e2680114c06eb1a</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Pizza In The City</td>\n",
" <td>Pizza Place</td>\n",
" <td>416 W 46th St</td>\n",
" <td>NaN</td>\n",
" <td>40.759734</td>\n",
" <td>-73.991704</td>\n",
" <td>[{'label': 'display', 'lat': 40.759734, 'lng':...</td>\n",
" <td>554</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[416 W 46th St, New York, NY 10036, United Sta...</td>\n",
" <td>4e4c445abd413c4cc6681705</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Famous Original Ray's Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>736 7th Ave</td>\n",
" <td>btwn 48th &amp; 49th St.</td>\n",
" <td>40.760438</td>\n",
" <td>-73.983929</td>\n",
" <td>[{'label': 'display', 'lat': 40.76043774660137...</td>\n",
" <td>305</td>\n",
" <td>10019</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[736 7th Ave (btwn 48th &amp; 49th St.), New York,...</td>\n",
" <td>4b4c704bf964a520feb226e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Pronto Pizza &amp; Beer</td>\n",
" <td>Pizza Place</td>\n",
" <td>30 W 48th St</td>\n",
" <td>NaN</td>\n",
" <td>40.758221</td>\n",
" <td>-73.979498</td>\n",
" <td>[{'label': 'display', 'lat': 40.75822089372300...</td>\n",
" <td>510</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[30 W 48th St, New York, NY 10036, United States]</td>\n",
" <td>4e4e4a31bd4101d0d7a6f154</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Le Mirage Cafe &amp; Pizza</td>\n",
" <td>American Restaurant</td>\n",
" <td>20 W 43rd St</td>\n",
" <td>NaN</td>\n",
" <td>40.754712</td>\n",
" <td>-73.981759</td>\n",
" <td>[{'label': 'display', 'lat': 40.75471224442287...</td>\n",
" <td>483</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[20 W 43rd St, New York, NY 10036, United States]</td>\n",
" <td>4addf59cf964a520c36621e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>2 Bros. Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>31 W 46th St</td>\n",
" <td>btwn 5th &amp; 6th Ave</td>\n",
" <td>40.756729</td>\n",
" <td>-73.980553</td>\n",
" <td>[{'label': 'display', 'lat': 40.75672851136888...</td>\n",
" <td>443</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[31 W 46th St (btwn 5th &amp; 6th Ave), New York, ...</td>\n",
" <td>4c7d96bbd65437043defc0a2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Pizza Pasta</td>\n",
" <td>Italian Restaurant</td>\n",
" <td>Lexington Ave</td>\n",
" <td>at E 93rd</td>\n",
" <td>40.758709</td>\n",
" <td>-73.981456</td>\n",
" <td>[{'label': 'display', 'lat': 40.75870920855404...</td>\n",
" <td>354</td>\n",
" <td>10022</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[Lexington Ave (at E 93rd), New York, NY 10022...</td>\n",
" <td>4bcddf98b6c49c742b169691</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Pizza Place</td>\n",
" <td>Pizza Place</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>40.753682</td>\n",
" <td>-73.983614</td>\n",
" <td>[{'label': 'display', 'lat': 40.75368157338077...</td>\n",
" <td>505</td>\n",
" <td>10018</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[New York, NY 10018, United States]</td>\n",
" <td>4c3ddfeb83a3a5937140ed33</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>iPizzaNY</td>\n",
" <td>Pizza Place</td>\n",
" <td>642 9th Ave</td>\n",
" <td>btwn 45th &amp; 46th St</td>\n",
" <td>40.760493</td>\n",
" <td>-73.991098</td>\n",
" <td>[{'label': 'display', 'lat': 40.76049297645480...</td>\n",
" <td>545</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[642 9th Ave (btwn 45th &amp; 46th St), New York, ...</td>\n",
" <td>4c2fce5a3896e21e75a2e490</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Pizza Parlor</td>\n",
" <td>Pizza Place</td>\n",
" <td>1095 Avenue Of The Americas</td>\n",
" <td>NaN</td>\n",
" <td>40.754508</td>\n",
" <td>-73.984705</td>\n",
" <td>[{'label': 'display', 'lat': 40.754508, 'lng':...</td>\n",
" <td>392</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[1095 Avenue Of The Americas, New York, NY 100...</td>\n",
" <td>599b0c1d31ac6c7b96420e71</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Rock Pizza Scissors</td>\n",
" <td>Pizza Place</td>\n",
" <td>1471 Broadway</td>\n",
" <td>NaN</td>\n",
" <td>40.756198</td>\n",
" <td>-73.986535</td>\n",
" <td>[{'label': 'display', 'lat': 40.756198, 'lng':...</td>\n",
" <td>215</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[1471 Broadway, New York, NY 10036, United Sta...</td>\n",
" <td>593ae2d1f427de5f7fc75fe3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Pizza Place Next To Paramount Hotel</td>\n",
" <td>Pizza Place</td>\n",
" <td>210-226 W 46th St</td>\n",
" <td>NaN</td>\n",
" <td>40.762415</td>\n",
" <td>-73.987436</td>\n",
" <td>[{'label': 'display', 'lat': 40.76241466588694...</td>\n",
" <td>518</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[210-226 W 46th St, New York, NY 10036, United...</td>\n",
" <td>4b4cb8adf964a520c9bb26e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>John's resturant + pizza</td>\n",
" <td>None</td>\n",
" <td>306 12th St</td>\n",
" <td>NaN</td>\n",
" <td>40.758353</td>\n",
" <td>-73.988521</td>\n",
" <td>[{'label': 'display', 'lat': 40.75835312290508...</td>\n",
" <td>254</td>\n",
" <td>10019</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[306 12th St, New York, NY 10019, United States]</td>\n",
" <td>4e3c27b3d22d102e852fdb59</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>Artichoke Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>1410 Broadway</td>\n",
" <td>39th St</td>\n",
" <td>40.753272</td>\n",
" <td>-73.986648</td>\n",
" <td>[{'label': 'display', 'lat': 40.753272, 'lng':...</td>\n",
" <td>532</td>\n",
" <td>10018</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[1410 Broadway (39th St), New York, NY 10018, ...</td>\n",
" <td>5e287e0e144dc80008e5d5a0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>Ray's Real Pizza</td>\n",
" <td>Food</td>\n",
" <td>709 8th Ave</td>\n",
" <td>NaN</td>\n",
" <td>40.758801</td>\n",
" <td>-73.988800</td>\n",
" <td>[{'label': 'display', 'lat': 40.758801, 'lng':...</td>\n",
" <td>289</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[709 8th Ave, New York, NY 10036, United States]</td>\n",
" <td>4f32447519836c91c7c6c727</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>Acerra Brick Oven Pizza</td>\n",
" <td>Sandwich Place</td>\n",
" <td>142 W 49th St</td>\n",
" <td>NaN</td>\n",
" <td>40.759977</td>\n",
" <td>-73.982976</td>\n",
" <td>[{'label': 'display', 'lat': 40.7599775, 'lng'...</td>\n",
" <td>310</td>\n",
" <td>10019</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[142 W 49th St, New York, NY 10019, United Sta...</td>\n",
" <td>5891509a65be5835dedb1957</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>Villa Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>263 West 42nd St</td>\n",
" <td>at 8th Ave</td>\n",
" <td>40.757291</td>\n",
" <td>-73.989259</td>\n",
" <td>[{'label': 'display', 'lat': 40.757291, 'lng':...</td>\n",
" <td>322</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[263 West 42nd St (at 8th Ave), New York, NY 1...</td>\n",
" <td>4afa1ac2f964a520c81622e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>Z Deli &amp; Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>803 8th Ave</td>\n",
" <td>btwn 48th &amp; 49th St.</td>\n",
" <td>40.761414</td>\n",
" <td>-73.986741</td>\n",
" <td>[{'label': 'display', 'lat': 40.76141387737374...</td>\n",
" <td>395</td>\n",
" <td>10019</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[803 8th Ave (btwn 48th &amp; 49th St.), New York,...</td>\n",
" <td>4af5d32bf964a5205dfd21e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>Sal's Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>1600 Broadway</td>\n",
" <td>Broadway and 52nd</td>\n",
" <td>40.761693</td>\n",
" <td>-73.984412</td>\n",
" <td>[{'label': 'display', 'lat': 40.76169277247975...</td>\n",
" <td>424</td>\n",
" <td>10019</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[1600 Broadway (Broadway and 52nd), New York, ...</td>\n",
" <td>4b32d4def964a520ad1425e3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>Upside Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>598 8th Ave</td>\n",
" <td>at W 39th St</td>\n",
" <td>40.755388</td>\n",
" <td>-73.991095</td>\n",
" <td>[{'label': 'display', 'lat': 40.75538788331710...</td>\n",
" <td>549</td>\n",
" <td>10018</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[598 8th Ave (at W 39th St), New York, NY 1001...</td>\n",
" <td>5c351c9c121384002c5d27e7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>Bryant Park Pizza Parlor</td>\n",
" <td>Pizza Place</td>\n",
" <td>1095 Avenue of the Americas</td>\n",
" <td>NaN</td>\n",
" <td>40.754691</td>\n",
" <td>-73.984224</td>\n",
" <td>[{'label': 'display', 'lat': 40.7546911111111,...</td>\n",
" <td>382</td>\n",
" <td>10036</td>\n",
" <td>US</td>\n",
" <td>New York</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[1095 Avenue of the Americas, New York, NY 100...</td>\n",
" <td>5d018831826444002ca1a84e</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>Chelsea Pizza</td>\n",
" <td>Pizza Place</td>\n",
" <td>301 10th ave</td>\n",
" <td>NaN</td>\n",
" <td>40.757319</td>\n",
" <td>-73.991327</td>\n",
" <td>[{'label': 'display', 'lat': 40.75731859023649...</td>\n",
" <td>493</td>\n",
" <td>NaN</td>\n",
" <td>US</td>\n",
" <td>Chelsea</td>\n",
" <td>NY</td>\n",
" <td>United States</td>\n",
" <td>[301 10th ave, Chelsea, NY, United States]</td>\n",
" <td>4e31a2401495f249f76dd524</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" name categories \\\n",
"0 Joe's Pizza Pizza Place \n",
"1 Famous Amadeus Pizza - Hell's Kitchen Pizza Place \n",
"2 99¢ Pizza Spot Pizza Place \n",
"3 Domino's Pizza Pizza Place \n",
"4 Mama’s Pizza Pizza Place \n",
"5 99¢ Fresh Pizza Pizza Place \n",
"6 Pizza Hut Pizza Place \n",
"7 Times Square Pizza Pizza Place \n",
"8 Bryant Park Pizza Pizza Place \n",
"9 Pizza In The City Pizza Place \n",
"10 Famous Original Ray's Pizza Pizza Place \n",
"11 Pronto Pizza & Beer Pizza Place \n",
"12 Le Mirage Cafe & Pizza American Restaurant \n",
"13 2 Bros. Pizza Pizza Place \n",
"14 Pizza Pasta Italian Restaurant \n",
"15 Pizza Place Pizza Place \n",
"16 iPizzaNY Pizza Place \n",
"17 Pizza Parlor Pizza Place \n",
"18 Rock Pizza Scissors Pizza Place \n",
"19 Pizza Place Next To Paramount Hotel Pizza Place \n",
"20 John's resturant + pizza None \n",
"21 Artichoke Pizza Pizza Place \n",
"22 Ray's Real Pizza Food \n",
"23 Acerra Brick Oven Pizza Sandwich Place \n",
"24 Villa Pizza Pizza Place \n",
"25 Z Deli & Pizza Pizza Place \n",
"26 Sal's Pizza Pizza Place \n",
"27 Upside Pizza Pizza Place \n",
"28 Bryant Park Pizza Parlor Pizza Place \n",
"29 Chelsea Pizza Pizza Place \n",
"\n",
" address crossStreet lat lng \\\n",
"0 1435 Broadway W 40th St 40.754679 -73.987029 \n",
"1 840 8th Ave NaN 40.762357 -73.985667 \n",
"2 43rd and 8th Ave Corner of 43rd 40.758062 -73.989490 \n",
"3 227 W 40th St btw 7th & 8th 40.755295 -73.988824 \n",
"4 705 8th Ave NaN 40.758724 -73.988924 \n",
"5 143 W 40th St NaN 40.754576 -73.987580 \n",
"6 761-69 7th Ave 50th St. 40.761114 -73.982886 \n",
"7 765 8th Ave NaN 40.760568 -73.987402 \n",
"8 1095 Avenue Of The Americas NaN 40.754691 -73.984224 \n",
"9 416 W 46th St NaN 40.759734 -73.991704 \n",
"10 736 7th Ave btwn 48th & 49th St. 40.760438 -73.983929 \n",
"11 30 W 48th St NaN 40.758221 -73.979498 \n",
"12 20 W 43rd St NaN 40.754712 -73.981759 \n",
"13 31 W 46th St btwn 5th & 6th Ave 40.756729 -73.980553 \n",
"14 Lexington Ave at E 93rd 40.758709 -73.981456 \n",
"15 NaN NaN 40.753682 -73.983614 \n",
"16 642 9th Ave btwn 45th & 46th St 40.760493 -73.991098 \n",
"17 1095 Avenue Of The Americas NaN 40.754508 -73.984705 \n",
"18 1471 Broadway NaN 40.756198 -73.986535 \n",
"19 210-226 W 46th St NaN 40.762415 -73.987436 \n",
"20 306 12th St NaN 40.758353 -73.988521 \n",
"21 1410 Broadway 39th St 40.753272 -73.986648 \n",
"22 709 8th Ave NaN 40.758801 -73.988800 \n",
"23 142 W 49th St NaN 40.759977 -73.982976 \n",
"24 263 West 42nd St at 8th Ave 40.757291 -73.989259 \n",
"25 803 8th Ave btwn 48th & 49th St. 40.761414 -73.986741 \n",
"26 1600 Broadway Broadway and 52nd 40.761693 -73.984412 \n",
"27 598 8th Ave at W 39th St 40.755388 -73.991095 \n",
"28 1095 Avenue of the Americas NaN 40.754691 -73.984224 \n",
"29 301 10th ave NaN 40.757319 -73.991327 \n",
"\n",
" labeledLatLngs distance postalCode \\\n",
"0 [{'label': 'display', 'lat': 40.75467949999999... 388 10018 \n",
"1 [{'label': 'display', 'lat': 40.76235730570203... 487 10019 \n",
"2 [{'label': 'display', 'lat': 40.75806203314980... 332 10036 \n",
"3 [{'label': 'display', 'lat': 40.75529519335076... 407 10018 \n",
"4 [{'label': 'display', 'lat': 40.75872357572102... 296 10036 \n",
"5 [{'label': 'display', 'lat': 40.75457557893008... 416 10018 \n",
"6 [{'label': 'display', 'lat': 40.76111397325152... 414 10019 \n",
"7 [{'label': 'display', 'lat': 40.76056822794468... 327 10036 \n",
"8 [{'label': 'display', 'lat': 40.7546911111111,... 382 10036 \n",
"9 [{'label': 'display', 'lat': 40.759734, 'lng':... 554 10036 \n",
"10 [{'label': 'display', 'lat': 40.76043774660137... 305 10019 \n",
"11 [{'label': 'display', 'lat': 40.75822089372300... 510 10036 \n",
"12 [{'label': 'display', 'lat': 40.75471224442287... 483 10036 \n",
"13 [{'label': 'display', 'lat': 40.75672851136888... 443 10036 \n",
"14 [{'label': 'display', 'lat': 40.75870920855404... 354 10022 \n",
"15 [{'label': 'display', 'lat': 40.75368157338077... 505 10018 \n",
"16 [{'label': 'display', 'lat': 40.76049297645480... 545 10036 \n",
"17 [{'label': 'display', 'lat': 40.754508, 'lng':... 392 10036 \n",
"18 [{'label': 'display', 'lat': 40.756198, 'lng':... 215 10036 \n",
"19 [{'label': 'display', 'lat': 40.76241466588694... 518 10036 \n",
"20 [{'label': 'display', 'lat': 40.75835312290508... 254 10019 \n",
"21 [{'label': 'display', 'lat': 40.753272, 'lng':... 532 10018 \n",
"22 [{'label': 'display', 'lat': 40.758801, 'lng':... 289 10036 \n",
"23 [{'label': 'display', 'lat': 40.7599775, 'lng'... 310 10019 \n",
"24 [{'label': 'display', 'lat': 40.757291, 'lng':... 322 10036 \n",
"25 [{'label': 'display', 'lat': 40.76141387737374... 395 10019 \n",
"26 [{'label': 'display', 'lat': 40.76169277247975... 424 10019 \n",
"27 [{'label': 'display', 'lat': 40.75538788331710... 549 10018 \n",
"28 [{'label': 'display', 'lat': 40.7546911111111,... 382 10036 \n",
"29 [{'label': 'display', 'lat': 40.75731859023649... 493 NaN \n",
"\n",
" cc city state country \\\n",
"0 US New York NY United States \n",
"1 US New York NY United States \n",
"2 US New York NY United States \n",
"3 US New York NY United States \n",
"4 US New York NY United States \n",
"5 US New York NY United States \n",
"6 US New York NY United States \n",
"7 US New York NY United States \n",
"8 US New York NY United States \n",
"9 US New York NY United States \n",
"10 US New York NY United States \n",
"11 US New York NY United States \n",
"12 US New York NY United States \n",
"13 US New York NY United States \n",
"14 US New York NY United States \n",
"15 US New York NY United States \n",
"16 US New York NY United States \n",
"17 US New York NY United States \n",
"18 US New York NY United States \n",
"19 US New York NY United States \n",
"20 US New York NY United States \n",
"21 US New York NY United States \n",
"22 US New York NY United States \n",
"23 US New York NY United States \n",
"24 US New York NY United States \n",
"25 US New York NY United States \n",
"26 US New York NY United States \n",
"27 US New York NY United States \n",
"28 US New York NY United States \n",
"29 US Chelsea NY United States \n",
"\n",
" formattedAddress \\\n",
"0 [1435 Broadway (W 40th St), New York, NY 10018... \n",
"1 [840 8th Ave, New York, NY 10019, United States] \n",
"2 [43rd and 8th Ave (Corner of 43rd), New York, ... \n",
"3 [227 W 40th St (btw 7th & 8th), New York, NY 1... \n",
"4 [705 8th Ave, New York, NY 10036, United States] \n",
"5 [143 W 40th St, New York, NY 10018, United Sta... \n",
"6 [761-69 7th Ave (50th St.), New York, NY 10019... \n",
"7 [765 8th Ave, New York, NY 10036, United States] \n",
"8 [1095 Avenue Of The Americas, New York, NY 100... \n",
"9 [416 W 46th St, New York, NY 10036, United Sta... \n",
"10 [736 7th Ave (btwn 48th & 49th St.), New York,... \n",
"11 [30 W 48th St, New York, NY 10036, United States] \n",
"12 [20 W 43rd St, New York, NY 10036, United States] \n",
"13 [31 W 46th St (btwn 5th & 6th Ave), New York, ... \n",
"14 [Lexington Ave (at E 93rd), New York, NY 10022... \n",
"15 [New York, NY 10018, United States] \n",
"16 [642 9th Ave (btwn 45th & 46th St), New York, ... \n",
"17 [1095 Avenue Of The Americas, New York, NY 100... \n",
"18 [1471 Broadway, New York, NY 10036, United Sta... \n",
"19 [210-226 W 46th St, New York, NY 10036, United... \n",
"20 [306 12th St, New York, NY 10019, United States] \n",
"21 [1410 Broadway (39th St), New York, NY 10018, ... \n",
"22 [709 8th Ave, New York, NY 10036, United States] \n",
"23 [142 W 49th St, New York, NY 10019, United Sta... \n",
"24 [263 West 42nd St (at 8th Ave), New York, NY 1... \n",
"25 [803 8th Ave (btwn 48th & 49th St.), New York,... \n",
"26 [1600 Broadway (Broadway and 52nd), New York, ... \n",
"27 [598 8th Ave (at W 39th St), New York, NY 1001... \n",
"28 [1095 Avenue of the Americas, New York, NY 100... \n",
"29 [301 10th ave, Chelsea, NY, United States] \n",
"\n",
" id \n",
"0 598de3c33b83073f81718721 \n",
"1 4aa88507f964a5208a5120e3 \n",
"2 4dc9931218387d1569587cf9 \n",
"3 4b91992af964a520b1c833e3 \n",
"4 4cd73e0367adf04dd5653791 \n",
"5 509c8753e4b0ca91f9ee1756 \n",
"6 4b2ac163f964a520fcae24e3 \n",
"7 4e24cec8d4c04ce22533785e \n",
"8 5a5cf46d2e2680114c06eb1a \n",
"9 4e4c445abd413c4cc6681705 \n",
"10 4b4c704bf964a520feb226e3 \n",
"11 4e4e4a31bd4101d0d7a6f154 \n",
"12 4addf59cf964a520c36621e3 \n",
"13 4c7d96bbd65437043defc0a2 \n",
"14 4bcddf98b6c49c742b169691 \n",
"15 4c3ddfeb83a3a5937140ed33 \n",
"16 4c2fce5a3896e21e75a2e490 \n",
"17 599b0c1d31ac6c7b96420e71 \n",
"18 593ae2d1f427de5f7fc75fe3 \n",
"19 4b4cb8adf964a520c9bb26e3 \n",
"20 4e3c27b3d22d102e852fdb59 \n",
"21 5e287e0e144dc80008e5d5a0 \n",
"22 4f32447519836c91c7c6c727 \n",
"23 5891509a65be5835dedb1957 \n",
"24 4afa1ac2f964a520c81622e3 \n",
"25 4af5d32bf964a5205dfd21e3 \n",
"26 4b32d4def964a520ad1425e3 \n",
"27 5c351c9c121384002c5d27e7 \n",
"28 5d018831826444002ca1a84e \n",
"29 4e31a2401495f249f76dd524 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"filtered_columns = ['name', 'categories'] + [col for col in df.columns if col.startswith('location.')] + ['id']\n",
"df_filtered = df.loc[:, filtered_columns]\n",
"\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']\n",
"df_filtered['categories'] = df_filtered.apply(get_category_type, axis=1)\n",
"df_filtered.columns = [column.split('.')[-1] for column in df_filtered.columns]\n",
"df_filtered"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfOTg0Y2ZlNzcxYTA0NDhjN2FiNDVhODVlOWE3MzU5YjQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzk4NGNmZTc3MWEwNDQ4YzdhYjQ1YTg1ZTlhNzM1OWI0IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzU3OTgwMSwtNzMuOTg1NTQ1Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfYmYxZThmNzIxODVmNGRlMmFmODc0ODhiYmE3MzNiN2UgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2ZlNzcxYTA0NDhjN2FiNDVhODVlOWE3MzU5YjQpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBmOTkwMGU0N2ZmOTRhZDBhZGYzMzI4OGRkMzE3NjIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU3OTgwMSwtNzMuOTg1NTQ1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEwLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNmZTc3MWEwNDQ4YzdhYjQ1YTg1ZTlhNzM1OWI0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzczMjlmYjZkZTZkMzQ4M2Y4NGU4MjEzMTg0OTFiNTkzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg0NzhkNzdkYmU2YjQ2OWJhOWYyMTFlY2Y3MGE3Zjg5ID0gJCgnPGRpdiBpZD0iaHRtbF84NDc4ZDc3ZGJlNmI0NjliYTlmMjExZWNmNzBhN2Y4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29ucmFkIEhvdGVsPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MzI5ZmI2ZGU2ZDM0ODNmODRlODIxMzE4NDkxYjU5My5zZXRDb250ZW50KGh0bWxfODQ3OGQ3N2RiZTZiNDY5YmE5ZjIxMWVjZjcwYTdmODkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGY5OTAwZTQ3ZmY5NGFkMGFkZjMzMjg4ZGQzMTc2MjEuYmluZFBvcHVwKHBvcHVwXzczMjlmYjZkZTZkMzQ4M2Y4NGU4MjEzMTg0OTFiNTkzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FjMzQxMmMyNDlkODQyNDI5NTVkMjVkZDNiYzI4YWJjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU0Njc5NDk5OTk5OTksLTczLjk4NzAyOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2ZlNzcxYTA0NDhjN2FiNDVhODVlOWE3MzU5YjQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjRlNWFiMzNiOTFkNDkxYmEwYmI3ZjFhYmFjOWY2MTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTdmMGRhMzU0YjQ2NDk3Yzk5YzJjOWU1ZmVmYmI4MDkgPSAkKCc8ZGl2IGlkPSJodG1sXzU3ZjBkYTM1NGI0NjQ5N2M5OWMyYzllNWZlZmJiODA5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjRlNWFiMzNiOTFkNDkxYmEwYmI3ZjFhYmFjOWY2MTcuc2V0Q29udGVudChodG1sXzU3ZjBkYTM1NGI0NjQ5N2M5OWMyYzllNWZlZmJiODA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FjMzQxMmMyNDlkODQyNDI5NTVkMjVkZDNiYzI4YWJjLmJpbmRQb3B1cChwb3B1cF82NGU1YWIzM2I5MWQ0OTFiYTBiYjdmMWFiYWM5ZjYxNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iODAyNjU1YmY2YWM0ZjZhOGY2YzYyMjdhZDllZjRlNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjM1NzMwNTcwMjAzLC03My45ODU2NjcyMjg2OTg3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83Y2M4N2E2M2VlODk0YjNkOGZhZWUwM2YxN2Y3MmJiOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYjU5MTVhN2VkZGQ0MmQ5YTg2ZDIyMzYwZjU0YmI2ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMWI1OTE1YTdlZGRkNDJkOWE4NmQyMjM2MGY1NGJiNmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83Y2M4N2E2M2VlODk0YjNkOGZhZWUwM2YxN2Y3MmJiOS5zZXRDb250ZW50KGh0bWxfMWI1OTE1YTdlZGRkNDJkOWE4NmQyMjM2MGY1NGJiNmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjgwMjY1NWJmNmFjNGY2YThmNmM2MjI3YWQ5ZWY0ZTYuYmluZFBvcHVwKHBvcHVwXzdjYzg3YTYzZWU4OTRiM2Q4ZmFlZTAzZjE3ZjcyYmI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFhODI3YmMwNDI1OTQ5MWY5OTQ2NDdjNzZlYjg1ZjNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU4MDYyMDMzMTQ5ODA1LC03My45ODk0ODk2ODQ5Njg1NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZjNmMWRiYTRkZjk0ODk3YjkyNmI3ZWUxMjc1NzA1MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYzAwMmE3YzFlNWE0NTRhYWZjMDYzMWYxZWUwMjMyOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYmMwMDJhN2MxZTVhNDU0YWFmYzA2MzFmMWVlMDIzMjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZjNmMWRiYTRkZjk0ODk3YjkyNmI3ZWUxMjc1NzA1My5zZXRDb250ZW50KGh0bWxfYmMwMDJhN2MxZTVhNDU0YWFmYzA2MzFmMWVlMDIzMjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWE4MjdiYzA0MjU5NDkxZjk5NDY0N2M3NmViODVmM2QuYmluZFBvcHVwKHBvcHVwXzdmM2YxZGJhNGRmOTQ4OTdiOTI2YjdlZTEyNzU3MDUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiZWEzMWFjOWFiNTQ1ODg4MzU2MzEzZjk1NDdkN2YyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU1Mjk1MTkzMzUwNzYsLTczLjk4ODgyNDE4ODcwOTI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNmZTc3MWEwNDQ4YzdhYjQ1YTg1ZTlhNzM1OWI0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM2NWU3NWQ2NzUzMDRhZTY5ZjZmZDUxMzVmZjJhNGE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y1MWUwOGU4MDVlMjQwMTg4YmNmMjRiYzdhNTlkN2IzID0gJCgnPGRpdiBpZD0iaHRtbF9mNTFlMDhlODA1ZTI0MDE4OGJjZjI0YmM3YTU5ZDdiMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM2NWU3NWQ2NzUzMDRhZTY5ZjZmZDUxMzVmZjJhNGE3LnNldENvbnRlbnQoaHRtbF9mNTFlMDhlODA1ZTI0MDE4OGJjZjI0YmM3YTU5ZDdiMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYmVhMzFhYzlhYjU0NTg4ODM1NjMxM2Y5NTQ3ZDdmMi5iaW5kUG9wdXAocG9wdXBfMzY1ZTc1ZDY3NTMwNGFlNjlmNmZkNTEzNWZmMmE0YTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGU3ZWQwYjcxZDZhNGFmYjgzYTJkMmNmNGRhOGQyM2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTg3MjM1NzU3MjEwMiwtNzMuOTg4OTI0MDUyNTEwMzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2ZlNzcxYTA0NDhjN2FiNDVhODVlOWE3MzU5YjQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTE4NjE5NGMzZjQxNDM5OWJmMWVlMzU3MWY0ZmFkYjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGFjNzhhZmQ2ZjFjNDQ1MDhhZTBlNmUzMjI2MzlmOTUgPSAkKCc8ZGl2IGlkPSJodG1sXzhhYzc4YWZkNmYxYzQ0NTA4YWUwZTZlMzIyNjM5Zjk1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTE4NjE5NGMzZjQxNDM5OWJmMWVlMzU3MWY0ZmFkYjQuc2V0Q29udGVudChodG1sXzhhYzc4YWZkNmYxYzQ0NTA4YWUwZTZlMzIyNjM5Zjk1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRlN2VkMGI3MWQ2YTRhZmI4M2EyZDJjZjRkYThkMjNiLmJpbmRQb3B1cChwb3B1cF8xMTg2MTk0YzNmNDE0Mzk5YmYxZWUzNTcxZjRmYWRiNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NmE2ODJlN2Y4N2U0NTI2OWNkMDA1YTMwYTc5ODUxNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDU3NTU3ODkzMDA4LC03My45ODc1ODAxNDgwNjg3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNjNjODMwMDIzMWQ0YzUxODUxNmIwZTNhODcxMmEwZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81M2Y5ODRlMjg2ZDA0NGU0YWQwOTgzMDc4MzYyZWUwNyA9ICQoJzxkaXYgaWQ9Imh0bWxfNTNmOTg0ZTI4NmQwNDRlNGFkMDk4MzA3ODM2MmVlMDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNjNjODMwMDIzMWQ0YzUxODUxNmIwZTNhODcxMmEwZi5zZXRDb250ZW50KGh0bWxfNTNmOTg0ZTI4NmQwNDRlNGFkMDk4MzA3ODM2MmVlMDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDZhNjgyZTdmODdlNDUyNjljZDAwNWEzMGE3OTg1MTcuYmluZFBvcHVwKHBvcHVwXzE2M2M4MzAwMjMxZDRjNTE4NTE2YjBlM2E4NzEyYTBmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RjNzU1NjkwMDQ4OTRkYWNiMzcwMjY2OTM3OWU4YzA2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYxMTEzOTczMjUxNTI2LC03My45ODI4ODU3Nzc5NTAzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80Nzc2NWM4NWRkZjE0OGM0YTdmNGM5MzE3MTg0ZWIxNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZDI3Y2ExNTNlOGE0MzE0YjgwMThmMWFlMDA2OTAyYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNWQyN2NhMTUzZThhNDMxNGI4MDE4ZjFhZTAwNjkwMmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80Nzc2NWM4NWRkZjE0OGM0YTdmNGM5MzE3MTg0ZWIxNC5zZXRDb250ZW50KGh0bWxfNWQyN2NhMTUzZThhNDMxNGI4MDE4ZjFhZTAwNjkwMmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGM3NTU2OTAwNDg5NGRhY2IzNzAyNjY5Mzc5ZThjMDYuYmluZFBvcHVwKHBvcHVwXzQ3NzY1Yzg1ZGRmMTQ4YzRhN2Y0YzkzMTcxODRlYjE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y2OThiNTMxZmY1ZDQwN2Q5ZjAyZmJjNzEzZTYxYzc0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYwNTY4MjI3OTQ0NjgsLTczLjk4NzQwMTkzOTQ4Mjk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNmZTc3MWEwNDQ4YzdhYjQ1YTg1ZTlhNzM1OWI0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ4MTM2ZjFkYzkwZjQ2YTZiNTcyOTkyMmI1NDk2YWE5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U0NGI5MzRkMWRkMDRiZmJiNmI3OWY4YTk0MzFmNDkyID0gJCgnPGRpdiBpZD0iaHRtbF9lNDRiOTM0ZDFkZDA0YmZiYjZiNzlmOGE5NDMxZjQ5MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ4MTM2ZjFkYzkwZjQ2YTZiNTcyOTkyMmI1NDk2YWE5LnNldENvbnRlbnQoaHRtbF9lNDRiOTM0ZDFkZDA0YmZiYjZiNzlmOGE5NDMxZjQ5Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNjk4YjUzMWZmNWQ0MDdkOWYwMmZiYzcxM2U2MWM3NC5iaW5kUG9wdXAocG9wdXBfNDgxMzZmMWRjOTBmNDZhNmI1NzI5OTIyYjU0OTZhYTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDMzMjJkMDg1MzNmNDdiZTkyYjk2NzVlYmE5N2EyOGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ2OTExMTExMTExLC03My45ODQyMjQ0NDQ0NDQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNmZTc3MWEwNDQ4YzdhYjQ1YTg1ZTlhNzM1OWI0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FkYmI4ZDAzNmQzZjQyNjY4ODA3NmJlMmMzOTAxYTdhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YzMmI0YmYwNzNhMjQ3OWViYTNlZGUzOGE4MjFkMWZjID0gJCgnPGRpdiBpZD0iaHRtbF9mMzJiNGJmMDczYTI0NzllYmEzZWRlMzhhODIxZDFmYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FkYmI4ZDAzNmQzZjQyNjY4ODA3NmJlMmMzOTAxYTdhLnNldENvbnRlbnQoaHRtbF9mMzJiNGJmMDczYTI0NzllYmEzZWRlMzhhODIxZDFmYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMzMyMmQwODUzM2Y0N2JlOTJiOTY3NWViYTk3YTI4ZC5iaW5kUG9wdXAocG9wdXBfYWRiYjhkMDM2ZDNmNDI2Njg4MDc2YmUyYzM5MDFhN2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2E5MmFiNmQzZDJmNGE5MWEyYzVjZTg3MjI3ODNlOTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTk3MzQsLTczLjk5MTcwNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYjYxMTI2ZjM3MmM0MGYyOThlN2YzNGIwNzM4NjViNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZmQ2MzNjMzM3NGI0NjJiYjA3ZjZiMjI0NzdhYWYzYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmZkNjMzYzMzNzRiNDYyYmIwN2Y2YjIyNDc3YWFmM2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYjYxMTI2ZjM3MmM0MGYyOThlN2YzNGIwNzM4NjViNi5zZXRDb250ZW50KGh0bWxfMmZkNjMzYzMzNzRiNDYyYmIwN2Y2YjIyNDc3YWFmM2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2E5MmFiNmQzZDJmNGE5MWEyYzVjZTg3MjI3ODNlOTIuYmluZFBvcHVwKHBvcHVwX2FiNjExMjZmMzcyYzQwZjI5OGU3ZjM0YjA3Mzg2NWI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiMzcyMWI1OWMwMDRjMGFhN2Q4N2IxMjE3NmViYTMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYwNDM3NzQ2NjAxMzc2LC03My45ODM5Mjg4NzI5NjQwN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYjE2ZjIyNGZiZTg0MDBkYjIzNTc4YTE5OThjZDVmNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YjZmYmRhODVjNzg0YjQxOThiZjQ4NThlYjU3YWMwMyA9ICQoJzxkaXYgaWQ9Imh0bWxfNmI2ZmJkYTg1Yzc4NGI0MTk4YmY0ODU4ZWI1N2FjMDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYjE2ZjIyNGZiZTg0MDBkYjIzNTc4YTE5OThjZDVmNS5zZXRDb250ZW50KGh0bWxfNmI2ZmJkYTg1Yzc4NGI0MTk4YmY0ODU4ZWI1N2FjMDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmIzNzIxYjU5YzAwNGMwYWE3ZDg3YjEyMTc2ZWJhMzAuYmluZFBvcHVwKHBvcHVwX2JiMTZmMjI0ZmJlODQwMGRiMjM1NzhhMTk5OGNkNWY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E3ZTViNThlODBlMTRjYWI4YTU0NDViNGVmNjEyMTlhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU4MjIwODkzNzIzMDA2LC03My45Nzk0OTgwMTk0MjQ0M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYjhiNzkxN2Y5NzU0ZWVjYWJhOTUyY2RmNDNjYjJjMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNmFhMWM3ODk2NWI0YjM3ODUxYTk5ZGMwMmNjMGEzMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTZhYTFjNzg5NjViNGIzNzg1MWE5OWRjMDJjYzBhMzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYjhiNzkxN2Y5NzU0ZWVjYWJhOTUyY2RmNDNjYjJjMy5zZXRDb250ZW50KGh0bWxfMTZhYTFjNzg5NjViNGIzNzg1MWE5OWRjMDJjYzBhMzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTdlNWI1OGU4MGUxNGNhYjhhNTQ0NWI0ZWY2MTIxOWEuYmluZFBvcHVwKHBvcHVwX2JiOGI3OTE3Zjk3NTRlZWNhYmE5NTJjZGY0M2NiMmMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk4N2YzNjk5MTc1ODQ2NjRhMGMyZGVlMjFjYmMwMTM1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU0NzEyMjQ0NDIyODc2LC03My45ODE3NTkzODU4ODA2NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xN2IwMzcyYWM2OTI0YTVlYjFiY2E1NTA1NzA0NGQ3MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYmQ0MWQwMzI4YmU0YWYyODYyYzcwNGNkYmI2NjczZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMWJkNDFkMDMyOGJlNGFmMjg2MmM3MDRjZGJiNjY3M2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFtZXJpY2FuIFJlc3RhdXJhbnQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE3YjAzNzJhYzY5MjRhNWViMWJjYTU1MDU3MDQ0ZDcwLnNldENvbnRlbnQoaHRtbF8xYmQ0MWQwMzI4YmU0YWYyODYyYzcwNGNkYmI2NjczZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ODdmMzY5OTE3NTg0NjY0YTBjMmRlZTIxY2JjMDEzNS5iaW5kUG9wdXAocG9wdXBfMTdiMDM3MmFjNjkyNGE1ZWIxYmNhNTUwNTcwNDRkNzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjU0ZDE5MzQyNTA2NDMxMzkwMDA1MzRiMWM0ZTZiNDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTY3Mjg1MTEzNjg4OCwtNzMuOTgwNTUzNDMyMzMwODRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2ZlNzcxYTA0NDhjN2FiNDVhODVlOWE3MzU5YjQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmJmMmQyNDM5OTU2NDc2NWI3YjNjZDE2MWFkMWQ2ZDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTExOWRmY2VmZjQwNDZiYmI5YjNmMmUwMGMzODIyMDYgPSAkKCc8ZGl2IGlkPSJodG1sX2ExMTlkZmNlZmY0MDQ2YmJiOWIzZjJlMDBjMzgyMjA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmJmMmQyNDM5OTU2NDc2NWI3YjNjZDE2MWFkMWQ2ZDguc2V0Q29udGVudChodG1sX2ExMTlkZmNlZmY0MDQ2YmJiOWIzZjJlMDBjMzgyMjA2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y1NGQxOTM0MjUwNjQzMTM5MDAwNTM0YjFjNGU2YjQ1LmJpbmRQb3B1cChwb3B1cF9mYmYyZDI0Mzk5NTY0NzY1YjdiM2NkMTYxYWQxZDZkOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNjk1NjlhZTQ5MWE0ZDBhYjVjNTljZGVjODI5ZmUxZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1ODcwOTIwODU1NDA0LC03My45ODE0NTYyMjg0Mjc2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZjkyMGQzMDcxN2E0ZTNmYWEzYjNjZjk2NjgxNjI5MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMjcwNzAwYmNmM2Y0MzcwYjY3ZGVkMWZhMmRkYTY2NSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDI3MDcwMGJjZjNmNDM3MGI2N2RlZDFmYTJkZGE2NjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkl0YWxpYW4gUmVzdGF1cmFudDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmY5MjBkMzA3MTdhNGUzZmFhM2IzY2Y5NjY4MTYyOTEuc2V0Q29udGVudChodG1sX2QyNzA3MDBiY2YzZjQzNzBiNjdkZWQxZmEyZGRhNjY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I2OTU2OWFlNDkxYTRkMGFiNWM1OWNkZWM4MjlmZTFkLmJpbmRQb3B1cChwb3B1cF8yZjkyMGQzMDcxN2E0ZTNmYWEzYjNjZjk2NjgxNjI5MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YzQyOTJiMjY2Mzg0NjkyYTcxYTk2OWY3YjExNGJmMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1MzY4MTU3MzM4MDc3LC03My45ODM2MTQxNTI1NTc3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNmZTc3MWEwNDQ4YzdhYjQ1YTg1ZTlhNzM1OWI0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY2Y2UxNWU2NGIwNjRiMWRhNDI3YWE3NGNhNjJlMGYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcwOWJiMjhmNTc4ZTQzMWU4YmNjYWYzNzNiZDljOTY4ID0gJCgnPGRpdiBpZD0iaHRtbF83MDliYjI4ZjU3OGU0MzFlOGJjY2FmMzczYmQ5Yzk2OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2Y2UxNWU2NGIwNjRiMWRhNDI3YWE3NGNhNjJlMGYwLnNldENvbnRlbnQoaHRtbF83MDliYjI4ZjU3OGU0MzFlOGJjY2FmMzczYmQ5Yzk2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YzQyOTJiMjY2Mzg0NjkyYTcxYTk2OWY3YjExNGJmMS5iaW5kUG9wdXAocG9wdXBfNjZjZTE1ZTY0YjA2NGIxZGE0MjdhYTc0Y2E2MmUwZjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDNiNDM4YjQwYTM2NGQ4Nzg3MWJjMGI2MThkNTBiM2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjA0OTI5NzY0NTQ4MDYsLTczLjk5MTA5NzcyMjk0NTM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNmZTc3MWEwNDQ4YzdhYjQ1YTg1ZTlhNzM1OWI0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg0MDUwOGRlNTg3NzRlNTc4YTgxMDM5Y2Q5NjIyMDQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk2MTlkMzZlZjg4NTRmNTJhMjI5MzQ3MWRjYThhM2Y0ID0gJCgnPGRpdiBpZD0iaHRtbF85NjE5ZDM2ZWY4ODU0ZjUyYTIyOTM0NzFkY2E4YTNmNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg0MDUwOGRlNTg3NzRlNTc4YTgxMDM5Y2Q5NjIyMDQ1LnNldENvbnRlbnQoaHRtbF85NjE5ZDM2ZWY4ODU0ZjUyYTIyOTM0NzFkY2E4YTNmNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kM2I0MzhiNDBhMzY0ZDg3ODcxYmMwYjYxOGQ1MGIzYS5iaW5kUG9wdXAocG9wdXBfODQwNTA4ZGU1ODc3NGU1NzhhODEwMzljZDk2MjIwNDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzA0ZmMzNzY3ODZkNGE5NmFmNjkwMmE5M2E5NWNhZTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ1MDgsLTczLjk4NDcwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jY2I0MGU5Mjc1NzU0MTRhODdjZGQ5YzRkYmEwMTdjYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xM2Y1ZDc2YmExZWM0ZWYxODJhZjg1YzdmNmNkZTlmMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTNmNWQ3NmJhMWVjNGVmMTgyYWY4NWM3ZjZjZGU5ZjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jY2I0MGU5Mjc1NzU0MTRhODdjZGQ5YzRkYmEwMTdjYi5zZXRDb250ZW50KGh0bWxfMTNmNWQ3NmJhMWVjNGVmMTgyYWY4NWM3ZjZjZGU5ZjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzA0ZmMzNzY3ODZkNGE5NmFmNjkwMmE5M2E5NWNhZTkuYmluZFBvcHVwKHBvcHVwX2NjYjQwZTkyNzU3NTQxNGE4N2NkZDljNGRiYTAxN2NiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RiZjBlMTBkODU2NzQwOWJiNzA1Zjk5MzYyMzY3OWVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU2MTk4LC03My45ODY1MzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2ZlNzcxYTA0NDhjN2FiNDVhODVlOWE3MzU5YjQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2UzODZiNmFhYzZjNDJjYTg5MWNjOTdmMTExYWVkZDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2JlZmE3MjgxODYwNGZmY2JlZTE4NzM4YjZkZTkwMzIgPSAkKCc8ZGl2IGlkPSJodG1sX2NiZWZhNzI4MTg2MDRmZmNiZWUxODczOGI2ZGU5MDMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2UzODZiNmFhYzZjNDJjYTg5MWNjOTdmMTExYWVkZDYuc2V0Q29udGVudChodG1sX2NiZWZhNzI4MTg2MDRmZmNiZWUxODczOGI2ZGU5MDMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RiZjBlMTBkODU2NzQwOWJiNzA1Zjk5MzYyMzY3OWVlLmJpbmRQb3B1cChwb3B1cF83ZTM4NmI2YWFjNmM0MmNhODkxY2M5N2YxMTFhZWRkNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yN2E0YmM4MjliZDE0OGFmOTMyNTJmYjdjMzBkYmRjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjQxNDY2NTg4Njk0LC03My45ODc0MzYzNzM1NjY4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYWIxNmE2MzlhNDA0YTNiYTAwYTdmNzU4NDg0NWZkNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZjQ4MTIzNTgxYjU0MTRmYmZiNzY2YzA5NDRjZmNhOCA9ICQoJzxkaXYgaWQ9Imh0bWxfZmY0ODEyMzU4MWI1NDE0ZmJmYjc2NmMwOTQ0Y2ZjYTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYWIxNmE2MzlhNDA0YTNiYTAwYTdmNzU4NDg0NWZkNS5zZXRDb250ZW50KGh0bWxfZmY0ODEyMzU4MWI1NDE0ZmJmYjc2NmMwOTQ0Y2ZjYTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjdhNGJjODI5YmQxNDhhZjkzMjUyZmI3YzMwZGJkY2UuYmluZFBvcHVwKHBvcHVwXzBhYjE2YTYzOWE0MDRhM2JhMDBhN2Y3NTg0ODQ1ZmQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc5YjBhNTI5OTg2NzQ3OTliMDg2MTdhMGI4ZmM0ZWVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU4MzUzMTIyOTA1MDgsLTczLjk4ODUyMTA0NDA0NzE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNmZTc3MWEwNDQ4YzdhYjQ1YTg1ZTlhNzM1OWI0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmFiM2Q3NWQ4M2RjNDE1Nzk2ZjYzY2U4YTYxYmRkYzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTMyNzIsLTczLjk4NjY0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82Y2MwYmFiNjY1YTg0NjA5YTcyMWZmNGYzN2ZhYjE3MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMjU4OTZhOWZlMmY0MmE5ODcyZTZlMzQ3M2MzZDZlOCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjI1ODk2YTlmZTJmNDJhOTg3MmU2ZTM0NzNjM2Q2ZTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82Y2MwYmFiNjY1YTg0NjA5YTcyMWZmNGYzN2ZhYjE3My5zZXRDb250ZW50KGh0bWxfMjI1ODk2YTlmZTJmNDJhOTg3MmU2ZTM0NzNjM2Q2ZTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmFiM2Q3NWQ4M2RjNDE1Nzk2ZjYzY2U4YTYxYmRkYzguYmluZFBvcHVwKHBvcHVwXzZjYzBiYWI2NjVhODQ2MDlhNzIxZmY0ZjM3ZmFiMTczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU2Nzk3NmRlZjJiZTQ0ODliOTYxODdhNTFhMDI3Y2E2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU4ODAxLC03My45ODg4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNmZTc3MWEwNDQ4YzdhYjQ1YTg1ZTlhNzM1OWI0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM4YTE4OTI1ZWMyMDQ1NjA5MGY5ZGZmYTgwZjYwYTFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkwMzlhMGM2ZTlhMTQyYjE5OWMwOGUzM2VhNjU2MzI5ID0gJCgnPGRpdiBpZD0iaHRtbF85MDM5YTBjNmU5YTE0MmIxOTljMDhlMzNlYTY1NjMyOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9vZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzhhMTg5MjVlYzIwNDU2MDkwZjlkZmZhODBmNjBhMWEuc2V0Q29udGVudChodG1sXzkwMzlhMGM2ZTlhMTQyYjE5OWMwOGUzM2VhNjU2MzI5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU2Nzk3NmRlZjJiZTQ0ODliOTYxODdhNTFhMDI3Y2E2LmJpbmRQb3B1cChwb3B1cF8zOGExODkyNWVjMjA0NTYwOTBmOWRmZmE4MGY2MGExYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYTFiYTIwZTU1ZWE0ZjIzYThlMWU4OWM0OWUzNDdlNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1OTk3NzUsLTczLjk4Mjk3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84Mzg4Y2RiNDk1MTI0NDAyYWM2NDhjMGZkNjhkY2JlMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNDBjNWZlOWUyOWY0NzZjYjMyYmI1YWY1ZmE2NzUyZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTQwYzVmZTllMjlmNDc2Y2IzMmJiNWFmNWZhNjc1MmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbmR3aWNoIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84Mzg4Y2RiNDk1MTI0NDAyYWM2NDhjMGZkNjhkY2JlMi5zZXRDb250ZW50KGh0bWxfZTQwYzVmZTllMjlmNDc2Y2IzMmJiNWFmNWZhNjc1MmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWExYmEyMGU1NWVhNGYyM2E4ZTFlODljNDllMzQ3ZTYuYmluZFBvcHVwKHBvcHVwXzgzODhjZGI0OTUxMjQ0MDJhYzY0OGMwZmQ2OGRjYmUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RjYWI4ODU4NTY5YTRhOWJiMTI4YTQ3MmI0ZmY0NTYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU3MjkxLC03My45ODkyNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTg0Y2ZlNzcxYTA0NDhjN2FiNDVhODVlOWE3MzU5YjQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2E1YjFiNmNmYzE4NDU1M2FmNzI5ZmM4YzlhMTAzMGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTI2YjFhM2IwODJlNGZlM2JlMGJiMjcyNjIwYWE2NmEgPSAkKCc8ZGl2IGlkPSJodG1sXzEyNmIxYTNiMDgyZTRmZTNiZTBiYjI3MjYyMGFhNjZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6YSBQbGFjZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2E1YjFiNmNmYzE4NDU1M2FmNzI5ZmM4YzlhMTAzMGMuc2V0Q29udGVudChodG1sXzEyNmIxYTNiMDgyZTRmZTNiZTBiYjI3MjYyMGFhNjZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RjYWI4ODU4NTY5YTRhOWJiMTI4YTQ3MmI0ZmY0NTYxLmJpbmRQb3B1cChwb3B1cF9jYTViMWI2Y2ZjMTg0NTUzYWY3MjlmYzhjOWExMDMwYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZjJjYjg2ODE3ODM0ODNlOWE3MmIwMmJiZDA3YmYxYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MTQxMzg3NzM3Mzc0LC03My45ODY3NDEyOTEyMjQ4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85ODRjZmU3NzFhMDQ0OGM3YWI0NWE4NWU5YTczNTliNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NWRhYjEyNDYwYWY0ODJmYTM0NTliZmQ2M2FhM2ViYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZTUwMTM0NTc2ZWU0ZWUxYTEzM2YyZTc5MzQyMTI4YiA9ICQoJzxkaXYgaWQ9Imh0bWxfYWU1MDEzNDU3NmVlNGVlMWExMzNmMmU3OTM0MjEyOGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpenphIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NWRhYjEyNDYwYWY0ODJmYTM0NTliZmQ2M2FhM2ViYi5zZXRDb250ZW50KGh0bWxfYWU1MDEzNDU3NmVlNGVlMWExMzNmMmU3OTM0MjEyOGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmYyY2I4NjgxNzgzNDgzZTlhNzJiMDJiYmQwN2JmMWIuYmluZFBvcHVwKHBvcHVwXzk1ZGFiMTI0NjBhZjQ4MmZhMzQ1OWJmZDYzYWEzZWJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiYWQ3ODNmM2U3ODQzN2Q5OWFhNzA4YTdlNDg3NzI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYxNjkyNzcyNDc5NzUsLTczLjk4NDQxMTg4OTY1MDM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNmZTc3MWEwNDQ4YzdhYjQ1YTg1ZTlhNzM1OWI0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViOWQyNGE5YmUwMTRjNzM4YTJmNDFjZTRiODZmM2RmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkxZGU1Mzk2ZWZhYzQ0ZjI4ZDljNjdjODhjN2NjYmRhID0gJCgnPGRpdiBpZD0iaHRtbF85MWRlNTM5NmVmYWM0NGYyOGQ5YzY3Yzg4YzdjY2JkYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ViOWQyNGE5YmUwMTRjNzM4YTJmNDFjZTRiODZmM2RmLnNldENvbnRlbnQoaHRtbF85MWRlNTM5NmVmYWM0NGYyOGQ5YzY3Yzg4YzdjY2JkYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYmFkNzgzZjNlNzg0MzdkOTlhYTcwOGE3ZTQ4NzcyNS5iaW5kUG9wdXAocG9wdXBfZWI5ZDI0YTliZTAxNGM3MzhhMmY0MWNlNGI4NmYzZGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjBhODJhNmFkNDUyNDhlNTg4ZDI1YTk0ZDE5MzJjZjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTUzODc4ODMzMTcxMDUsLTczLjk5MTA5NTA3NDU1MDc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNmZTc3MWEwNDQ4YzdhYjQ1YTg1ZTlhNzM1OWI0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdmYjNlZDI3MGIwMDQzODBiOGQxMmNhYmFkM2YzMGIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdjMzQ4YzYyMGQ2ODRhNjE5MjdlNjM4MjNiYjZiNmNiID0gJCgnPGRpdiBpZD0iaHRtbF83YzM0OGM2MjBkNjg0YTYxOTI3ZTYzODIzYmI2YjZjYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdmYjNlZDI3MGIwMDQzODBiOGQxMmNhYmFkM2YzMGIxLnNldENvbnRlbnQoaHRtbF83YzM0OGM2MjBkNjg0YTYxOTI3ZTYzODIzYmI2YjZjYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMGE4MmE2YWQ0NTI0OGU1ODhkMjVhOTRkMTkzMmNmMy5iaW5kUG9wdXAocG9wdXBfN2ZiM2VkMjcwYjAwNDM4MGI4ZDEyY2FiYWQzZjMwYjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTdhMTZkNTE1OWEzNDM0ZWI2MjZhOGExOGI5ZDlhNjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ2OTExMTExMTExLC03My45ODQyMjQ0NDQ0NDQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNmZTc3MWEwNDQ4YzdhYjQ1YTg1ZTlhNzM1OWI0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q4YzViNjY5N2ZlNjQxMjA5ZjM2NmEzMmNmMWRmZWMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UzYTY0NDVmZGM5NzRhZGZiYTVkNjdjOTA3YzM1MDMzID0gJCgnPGRpdiBpZD0iaHRtbF9lM2E2NDQ1ZmRjOTc0YWRmYmE1ZDY3YzkwN2MzNTAzMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q4YzViNjY5N2ZlNjQxMjA5ZjM2NmEzMmNmMWRmZWMzLnNldENvbnRlbnQoaHRtbF9lM2E2NDQ1ZmRjOTc0YWRmYmE1ZDY3YzkwN2MzNTAzMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xN2ExNmQ1MTU5YTM0MzRlYjYyNmE4YTE4YjlkOWE2NS5iaW5kUG9wdXAocG9wdXBfZDhjNWI2Njk3ZmU2NDEyMDlmMzY2YTMyY2YxZGZlYzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTAwNTg2MzgzYWFiNDc0Nzk0OWQ3MWUyMjUyOTc5MDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTczMTg1OTAyMzY0OTQsLTczLjk5MTMyNzM4NTI1MzI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk4NGNmZTc3MWEwNDQ4YzdhYjQ1YTg1ZTlhNzM1OWI0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjYTQ5OTVlZGIwMzQ4NThiOGZkYTc5NmE1ZjU4NTY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M3NWU2ZDdiOTE0NjRhMWZhY2MwZTJjMjVmMTZiOGJhID0gJCgnPGRpdiBpZD0iaHRtbF9jNzVlNmQ3YjkxNDY0YTFmYWNjMGUyYzI1ZjE2YjhiYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emEgUGxhY2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RjYTQ5OTVlZGIwMzQ4NThiOGZkYTc5NmE1ZjU4NTY2LnNldENvbnRlbnQoaHRtbF9jNzVlNmQ3YjkxNDY0YTFmYWNjMGUyYzI1ZjE2YjhiYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MDA1ODYzODNhYWI0NzQ3OTQ5ZDcxZTIyNTI5NzkwOC5iaW5kUG9wdXAocG9wdXBfZGNhNDk5NWVkYjAzNDg1OGI4ZmRhNzk2YTVmNTg1NjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f0ca110ac18>"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import folium\n",
"venues_map = folium.Map(location=[latitude, longitude], zoom_start=13) \n",
"\n",
"folium.features.CircleMarker(\n",
" [latitude, longitude],\n",
" radius=10,\n",
" color='red',\n",
" popup='Conrad Hotel',\n",
" fill = True,\n",
" fill_color = 'red',\n",
" fill_opacity = 0.6\n",
").add_to(venues_map)\n",
"\n",
"for lat, lng, label in zip(df_filtered.lat, df_filtered.lng, df_filtered.categories):\n",
" folium.features.CircleMarker(\n",
" [lat, lng],\n",
" radius=5,\n",
" color='blue',\n",
" popup=label,\n",
" fill = True,\n",
" fill_color='blue',\n",
" fill_opacity=0.6\n",
" ).add_to(venues_map)\n",
"\n",
"venues_map"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python",
"language": "python",
"name": "conda-env-python-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment