This is a map of Tourist attraction in Paris, France.
Interpretation:
Central Paris: The map shows a dense
concentration of key interest points and top restaurants, especially in
central districts like the 1st, 3rd, and 4th arrondissements. This area
is known for its cultural landmarks, making it a popular spot for both
dining and sightseeing.
Airbnb Lodging Distribution: The distribution of
Airbnb lodgings is more spread out, with concentrations in areas that
are less central but still popular with tourists, like Montmartre or Le
Marais. The size of the markers corresponds to the price per night,
while the color coding helps differentiate between different types of
properties, ranging from traditional apartments to more unique
accommodations like treehouses and yurts.
Combined Insights: By combining these datasets,
I’ve created a map that provides a comprehensive view of Paris’s most
significant POIs, top dining spots, and available Airbnb lodgings. It’s
a valuable tool for planning a trip to the city, allowing me (or others)
to quickly see where to stay based on proximity to attractions, property
type, and price range.
This map can be used as a resource for visualizing key areas of
interest, accommodations, and dining options in Paris, offering an
overview (albeit limited) for visitors or anyone studying the city’s
layout.
import requests
import pandas as pd
import geopandas as gpd
from shapely.geometry import Point
# Load the CSV file
file_path = 'top_restaurants_paris.csv'
data = pd.read_csv(file_path)
# Define function to geocode an address using the Google Maps API
def geocode_address(address, api_key):
base_url = "https://maps.googleapis.com/maps/api/geocode/json"
params = {"address": address, "key": api_key}
response = requests.get(base_url, params=params)
if response.status_code == 200:
results = response.json()['results']
if results:
location = results[0]['geometry']['location']
return location['lat'], location['lng']
return None, None
# My Google Maps API Key
api_key = "ABCDEFGHIJKLMNOPQRTSTVWXYZ"
# Geocode all addresses in the dataset
data['latitude'], data['longitude'] = zip(*data['address'].apply(lambda x: geocode_address(x, api_key)))
# Drop rows where geocoding failed
data.dropna(subset=['latitude', 'longitude'], inplace=True)
# Create a GeoDataFrame with a specified CRS (Coordinate Reference System)
geometry = [Point(xy) for xy in zip(data['longitude'], data['latitude'])]
geo_df = gpd.GeoDataFrame(data, geometry=geometry, crs="EPSG:4326") # Use EPSG:4326 for geographic coordinates
# Rename columns to avoid truncation when saving to Shapefile
geo_df.rename(columns={
'rankingPosition': 'rankPos',
'description': 'desc',
'numberOfReviews': 'numReviews'
}, inplace=True)
# Save the GeoDataFrame as a Shapefile (or GeoJSON)
output_shapefile = 'paris.shp' # will not use since not zipping
geo_df.to_file(output_shapefile)
output_geojson = 'paris.geojson'
geo_df.to_file(output_geojson, driver='GeoJSON')
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.379853400000002, 48.8648482]
},
"properties": {
"title": "Le Wagon Paris",
"address": "16 Villa Gaudelet",
"marker-size": "large",
"marker-symbol": "building"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.377524, 48.865542]
},
"properties": {
"name": "L'Alicheur",
"address": "96 Rue Saint-Maur",
"description": "Cuisine asiatique sans friture - Plat du jour 8€",
"marker-symbol": "restaurant"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.378423200000043, 48.8659858]
},
"properties": {
"title": "L'Esprit Tchaï",
"address": "115 Rue Oberkampf",
"description": "Produits bio, plats végétariens, gluten-free, plat + entrée ou dessert < 11€",
"marker-symbol": "restaurant"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.3862538999999288, 48.8685945]
},
"properties" : {
"name": "Dilia",
"address": "1 rue d'Eupatoria, 75020 Paris",
"descriptions": "Cuisine gastronomique, trattoria - Menu à 16-19,5€ le midi (44-60€ le soir)",
"marker-symbol": "restaurant"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.382024900000033, 48.8654569]
},
"properties" : {
"name": "Le Perchoir",
"address": "14 Rue Crespin du Gast, 75011 Paris",
"descriptions": "Rooftop sympa en été, mais un peu cher, cocktails et snacks",
"marker-symbol": "bar"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.3769905000000335, 48.8653928]
},
"properties" : {
"name": "Mamma Roma",
"address": "90 rue Oberkampf, 75011 Paris",
"descriptions": "Pizza 'Al Taglio', petits antipastis et focaccia - Menu autour de 10€)",
"marker-symbol": "restaurant"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.37537420000001, 48.86466360000001]
},
"properties": {
"title": "B&M",
"address": "82 avenue Parmentier",
"description": "Un de meilleurs burgers de Paris selon Konbini, autour de 14€ avec frites et boisson.",
"marker-symbol": "restaurant"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.3801158999999643, 48.8626856]
},
"properties" : {
"name": "L'Altra",
"address": "52 rue Saint Maur, 75011 Paris",
"descriptions": "Pizzéria, antipastis - Formule à 13€)",
"marker-symbol": "restaurant"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.3663344999999936, 48.8645789]
},
"properties" : {
"name": "Paperboy",
"address": "137 rue Amelot, 75011 Paris",
"descriptions": "US healthy, sandwichs, salades, jus - Autour de 13€)",
"marker-symbol": "restaurant"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.376451299999985, 48.8667905]
},
"properties" : {
"name": "Thank You My Dear",
"address": "112 rue Saint Maur, 75011 Paris",
"descriptions": "Gluten Free, sandwichs, salades - Formule à 10€)",
"marker-symbol": "restaurant"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.376059400000031, 48.8647467]
},
"properties" : {
"name": "Bloodies",
"address": "58 avenue de la République, 75011 Paris",
"descriptions": "Spécialité de viande - Formule à 16€ le midi)",
"marker-symbol": "restaurant"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.37186829999996, 48.8645978]
},
"properties" : {
"name": "Aux Deux Amis",
"address": "45 rue Oberkampf, 75011 Paris",
"descriptions": "Bonne franquette, tapas(3-12€) et vin le soir - Menu à 18-22€ le midi)",
"marker-symbol": "restaurant"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.371793700000012, 48.8643284]
},
"properties" : {
"name": "Epicerie du Verre Volé",
"address": "54, rue de la Folie Méricourt, 75011 Paris",
"descriptions": "Epicerie fine, sandwichs à composer ou pas - Sandwich : 5 à 7€)",
"marker-symbol": "restaurant"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [2.3792540, 48.8662720]
},
"properties" : {
"name": "L'impasse",
"address": "4, cité Griset, 75011 Paris",
"descriptions": "Pour boire un verre dans une ambiance cosy)",
"marker-symbol": "bar"
}
}
]
}
Paris Map
Jessica’s
Paris Map Link
LS0tDQp0aXRsZTogIlBhcmlzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KVGhpcyBpcyBhIG1hcCBvZiBUb3VyaXN0IGF0dHJhY3Rpb24gaW4gUGFyaXMsIEZyYW5jZS4NCg0KIyMjIE1hcCBMYXllcnM6DQoNCjEuICAqKkFkYW0gU21pdGgncyBQYXJpcyBLZXkgSW50ZXJlc3QgUG9pbnRzKio6DQogICAgLSAgIFRoZXNlIGFyZSBwb2ludHMgb2YgaW50ZXJlc3QgKFBPSXMpIHRocm91Z2hvdXQgUGFyaXMgdGhhdCBJJ3ZlIGluY2x1ZGVkIGZyb20gQWRhbSBTbWl0aCdzIGRhdGFzZXQuIFRoZXkgbGlrZWx5IGNvdmVyIGxhbmRtYXJrcywgbXVzZXVtcywgaGlzdG9yaWNhbCBzaXRlcywgYW5kIG90aGVyIHNpZ25pZmljYW50IGxvY2F0aW9ucy4gSSd2ZSBwbG90dGVkIHRoZXNlIFBPSXMgYWNyb3NzIHRoZSBtYXAgdG8gaGlnaGxpZ2h0IGFyZWFzIG9mIGN1bHR1cmFsIG9yIGhpc3RvcmljYWwgaW1wb3J0YW5jZSBpbiB0aGUgY2l0eS4NCjIuICAqKkFpcmJuYiBQYXJpcyBXRkwxIExvZGdpbmcgRGF0YSoqOg0KICAgIC0gICBUaGlzIGxheWVyIHJlcHJlc2VudHMgQWlyYm5iIGxvZGdpbmdzIGluIFBhcmlzLCBiYXNlZCBvbiB0aGUgIldGTDEiIGRhdGFzZXQuIFRoZSBhY2NvbW1vZGF0aW9ucyB2YXJ5IGluIHNpemUgb24gdGhlIG1hcCBhY2NvcmRpbmcgdG8gdGhlIHByaWNlIHBlciBuaWdodC4gSSd2ZSBhbHNvIGNvbG9yLWNvZGVkIHRoZXNlIGFjY29tbW9kYXRpb25zIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHByb3BlcnR5LCB3aGljaCBpbmNsdWRlcyBjYXRlZ29yaWVzIHN1Y2ggYXMgTWFpc29uLCBMb2Z0LCBBcHBhcnRlbWVudCBlbiByZXNpZGVuY2UsIEJlZCAmIEJyZWFrZmFzdCwgYW5kIG1vcmUgdW5pcXVlIG9wdGlvbnMgbGlrZSBDYWJhbmUgZGFucyBsZXMgYXJicmVzICh0cmVlaG91c2UpLCBIYWJpdGF0aW9uIHRyb2dsb2R5dGUgKGNhdmUgZHdlbGxpbmcpLCBhbmQgWW91cnRlICh5dXJ0KS4NCjMuICAqKlBhcmlzIFRvcCBSZXN0YXVyYW50cyAyMDI0Kio6DQogICAgLSAgIEkndmUgdXNlZCB0aGUgUGFyaXMgVG9wIFJlc3RhdXJhbnRzIDIwMjQgZGF0YXNldCBmcm9tIEthZ2dsZSBhbmQgY29udmVydGVkIHRoZSBDU1YgaW50byBHZW9KU09OIHVzaW5nIFB5dGhvbi4gVGhlc2UgbG9jYXRpb25zIGFyZSBtYXJrZWQgb24gdGhlIG1hcCB3aXRoIGZvcmsgYW5kIGtuaWZlIGljb25zLCBtYWtpbmcgaXQgZWFzeSB0byBpZGVudGlmeSB0b3AgZGluaW5nIHNwb3RzIGFjcm9zcyB0aGUgY2l0eS4NCg0KIyMjIEludGVycHJldGF0aW9uOg0KDQotICAgKipDZW50cmFsIFBhcmlzKio6IFRoZSBtYXAgc2hvd3MgYSBkZW5zZSBjb25jZW50cmF0aW9uIG9mIGtleSBpbnRlcmVzdCBwb2ludHMgYW5kIHRvcCByZXN0YXVyYW50cywgZXNwZWNpYWxseSBpbiBjZW50cmFsIGRpc3RyaWN0cyBsaWtlIHRoZSAxc3QsIDNyZCwgYW5kIDR0aCBhcnJvbmRpc3NlbWVudHMuIFRoaXMgYXJlYSBpcyBrbm93biBmb3IgaXRzIGN1bHR1cmFsIGxhbmRtYXJrcywgbWFraW5nIGl0IGEgcG9wdWxhciBzcG90IGZvciBib3RoIGRpbmluZyBhbmQgc2lnaHRzZWVpbmcuDQoNCi0gICAqKkFpcmJuYiBMb2RnaW5nIERpc3RyaWJ1dGlvbioqOiBUaGUgZGlzdHJpYnV0aW9uIG9mIEFpcmJuYiBsb2RnaW5ncyBpcyBtb3JlIHNwcmVhZCBvdXQsIHdpdGggY29uY2VudHJhdGlvbnMgaW4gYXJlYXMgdGhhdCBhcmUgbGVzcyBjZW50cmFsIGJ1dCBzdGlsbCBwb3B1bGFyIHdpdGggdG91cmlzdHMsIGxpa2UgTW9udG1hcnRyZSBvciBMZSBNYXJhaXMuIFRoZSBzaXplIG9mIHRoZSBtYXJrZXJzIGNvcnJlc3BvbmRzIHRvIHRoZSBwcmljZSBwZXIgbmlnaHQsIHdoaWxlIHRoZSBjb2xvciBjb2RpbmcgaGVscHMgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9wZXJ0aWVzLCByYW5naW5nIGZyb20gdHJhZGl0aW9uYWwgYXBhcnRtZW50cyB0byBtb3JlIHVuaXF1ZSBhY2NvbW1vZGF0aW9ucyBsaWtlIHRyZWVob3VzZXMgYW5kIHl1cnRzLg0KDQotICAgKipDb21iaW5lZCBJbnNpZ2h0cyoqOiBCeSBjb21iaW5pbmcgdGhlc2UgZGF0YXNldHMsIEkndmUgY3JlYXRlZCBhIG1hcCB0aGF0IHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSB2aWV3IG9mIFBhcmlzJ3MgbW9zdCBzaWduaWZpY2FudCBQT0lzLCB0b3AgZGluaW5nIHNwb3RzLCBhbmQgYXZhaWxhYmxlIEFpcmJuYiBsb2RnaW5ncy4gSXQncyBhIHZhbHVhYmxlIHRvb2wgZm9yIHBsYW5uaW5nIGEgdHJpcCB0byB0aGUgY2l0eSwgYWxsb3dpbmcgbWUgKG9yIG90aGVycykgdG8gcXVpY2tseSBzZWUgd2hlcmUgdG8gc3RheSBiYXNlZCBvbiBwcm94aW1pdHkgdG8gYXR0cmFjdGlvbnMsIHByb3BlcnR5IHR5cGUsIGFuZCBwcmljZSByYW5nZS4NCg0KVGhpcyBtYXAgY2FuIGJlIHVzZWQgYXMgYSByZXNvdXJjZSBmb3IgdmlzdWFsaXppbmcga2V5IGFyZWFzIG9mIGludGVyZXN0LCBhY2NvbW1vZGF0aW9ucywgYW5kIGRpbmluZyBvcHRpb25zIGluIFBhcmlzLCBvZmZlcmluZyBhbiBvdmVydmlldyAoYWxiZWl0IGxpbWl0ZWQpIGZvciB2aXNpdG9ycyBvciBhbnlvbmUgc3R1ZHlpbmcgdGhlIGNpdHkncyBsYXlvdXQuDQoNCmBgYHtweXRob259DQppbXBvcnQgcmVxdWVzdHMNCmltcG9ydCBwYW5kYXMgYXMgcGQNCmltcG9ydCBnZW9wYW5kYXMgYXMgZ3BkDQpmcm9tIHNoYXBlbHkuZ2VvbWV0cnkgaW1wb3J0IFBvaW50DQoNCiMgTG9hZCB0aGUgQ1NWIGZpbGUNCmZpbGVfcGF0aCA9ICd0b3BfcmVzdGF1cmFudHNfcGFyaXMuY3N2JyAgDQpkYXRhID0gcGQucmVhZF9jc3YoZmlsZV9wYXRoKQ0KDQojIERlZmluZSAgZnVuY3Rpb24gdG8gZ2VvY29kZSBhbiBhZGRyZXNzIHVzaW5nIHRoZSBHb29nbGUgTWFwcyBBUEkNCmRlZiBnZW9jb2RlX2FkZHJlc3MoYWRkcmVzcywgYXBpX2tleSk6DQogICAgYmFzZV91cmwgPSAiaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2dlb2NvZGUvanNvbiINCiAgICBwYXJhbXMgPSB7ImFkZHJlc3MiOiBhZGRyZXNzLCAia2V5IjogYXBpX2tleX0NCiAgICByZXNwb25zZSA9IHJlcXVlc3RzLmdldChiYXNlX3VybCwgcGFyYW1zPXBhcmFtcykNCiAgICBpZiByZXNwb25zZS5zdGF0dXNfY29kZSA9PSAyMDA6DQogICAgICAgIHJlc3VsdHMgPSByZXNwb25zZS5qc29uKClbJ3Jlc3VsdHMnXQ0KICAgICAgICBpZiByZXN1bHRzOg0KICAgICAgICAgICAgbG9jYXRpb24gPSByZXN1bHRzWzBdWydnZW9tZXRyeSddWydsb2NhdGlvbiddDQogICAgICAgICAgICByZXR1cm4gbG9jYXRpb25bJ2xhdCddLCBsb2NhdGlvblsnbG5nJ10NCiAgICByZXR1cm4gTm9uZSwgTm9uZQ0KDQojIE15IEdvb2dsZSBNYXBzIEFQSSBLZXkNCmFwaV9rZXkgPSAiQUJDREVGR0hJSktMTU5PUFFSVFNUVldYWVoiDQoNCiMgR2VvY29kZSBhbGwgYWRkcmVzc2VzIGluIHRoZSBkYXRhc2V0DQpkYXRhWydsYXRpdHVkZSddLCBkYXRhWydsb25naXR1ZGUnXSA9IHppcCgqZGF0YVsnYWRkcmVzcyddLmFwcGx5KGxhbWJkYSB4OiBnZW9jb2RlX2FkZHJlc3MoeCwgYXBpX2tleSkpKQ0KDQojIERyb3Agcm93cyB3aGVyZSBnZW9jb2RpbmcgZmFpbGVkDQpkYXRhLmRyb3BuYShzdWJzZXQ9WydsYXRpdHVkZScsICdsb25naXR1ZGUnXSwgaW5wbGFjZT1UcnVlKQ0KDQojIENyZWF0ZSBhIEdlb0RhdGFGcmFtZSB3aXRoIGEgc3BlY2lmaWVkIENSUyAoQ29vcmRpbmF0ZSBSZWZlcmVuY2UgU3lzdGVtKQ0KZ2VvbWV0cnkgPSBbUG9pbnQoeHkpIGZvciB4eSBpbiB6aXAoZGF0YVsnbG9uZ2l0dWRlJ10sIGRhdGFbJ2xhdGl0dWRlJ10pXQ0KZ2VvX2RmID0gZ3BkLkdlb0RhdGFGcmFtZShkYXRhLCBnZW9tZXRyeT1nZW9tZXRyeSwgY3JzPSJFUFNHOjQzMjYiKSAgIyBVc2UgRVBTRzo0MzI2IGZvciBnZW9ncmFwaGljIGNvb3JkaW5hdGVzDQoNCiMgUmVuYW1lIGNvbHVtbnMgdG8gYXZvaWQgdHJ1bmNhdGlvbiB3aGVuIHNhdmluZyB0byBTaGFwZWZpbGUNCmdlb19kZi5yZW5hbWUoY29sdW1ucz17DQogICAgJ3JhbmtpbmdQb3NpdGlvbic6ICdyYW5rUG9zJywNCiAgICAnZGVzY3JpcHRpb24nOiAnZGVzYycsDQogICAgJ251bWJlck9mUmV2aWV3cyc6ICdudW1SZXZpZXdzJw0KfSwgaW5wbGFjZT1UcnVlKQ0KDQojIFNhdmUgdGhlIEdlb0RhdGFGcmFtZSBhcyBhIFNoYXBlZmlsZSAob3IgR2VvSlNPTikNCm91dHB1dF9zaGFwZWZpbGUgPSAncGFyaXMuc2hwJyAjIHdpbGwgbm90IHVzZSBzaW5jZSBub3QgemlwcGluZw0KZ2VvX2RmLnRvX2ZpbGUob3V0cHV0X3NoYXBlZmlsZSkNCg0Kb3V0cHV0X2dlb2pzb24gPSAncGFyaXMuZ2VvanNvbicNCmdlb19kZi50b19maWxlKG91dHB1dF9nZW9qc29uLCBkcml2ZXI9J0dlb0pTT04nKQ0KDQoNCmBgYA0KDQpgYGB7Z2VvanNvbn0NCnsNCiAgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24iLA0KICAiZmVhdHVyZXMiOiBbDQogICAgew0KICAgICAgInR5cGUiOiAiRmVhdHVyZSIsDQogICAgICAiZ2VvbWV0cnkiOiB7DQogICAgICAgICJ0eXBlIjogIlBvaW50IiwNCiAgICAgICAgImNvb3JkaW5hdGVzIjogWzIuMzc5ODUzNDAwMDAwMDAyLCA0OC44NjQ4NDgyXQ0KICAgICAgfSwNCiAgICAgICJwcm9wZXJ0aWVzIjogew0KICAgICAgICAidGl0bGUiOiAiTGUgV2Fnb24gUGFyaXMiLA0KICAgICAgICAiYWRkcmVzcyI6ICIxNiBWaWxsYSBHYXVkZWxldCIsDQogICAgICAgICJtYXJrZXItc2l6ZSI6ICJsYXJnZSIsDQogICAgICAgICJtYXJrZXItc3ltYm9sIjogImJ1aWxkaW5nIg0KICAgICAgfQ0KICAgIH0sDQogICAgew0KICAgICAgInR5cGUiOiAiRmVhdHVyZSIsDQogICAgICAiZ2VvbWV0cnkiOiB7DQogICAgICAgICJ0eXBlIjogIlBvaW50IiwNCiAgICAgICAgImNvb3JkaW5hdGVzIjogWzIuMzc3NTI0LCA0OC44NjU1NDJdDQogICAgICB9LA0KICAgICAgInByb3BlcnRpZXMiOiB7DQogICAgICAgICJuYW1lIjogIkwnQWxpY2hldXIiLA0KICAgICAgICAiYWRkcmVzcyI6ICI5NiBSdWUgU2FpbnQtTWF1ciIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJDdWlzaW5lIGFzaWF0aXF1ZSBzYW5zIGZyaXR1cmUgLSBQbGF0IGR1IGpvdXIgOOKCrCIsDQogICAgICAgICJtYXJrZXItc3ltYm9sIjogInJlc3RhdXJhbnQiDQogICAgICB9DQogICAgfSwNCiAgICB7DQogICAgICAidHlwZSI6ICJGZWF0dXJlIiwNCiAgICAgICJnZW9tZXRyeSI6IHsNCiAgICAgICAgInR5cGUiOiAiUG9pbnQiLA0KICAgICAgICAiY29vcmRpbmF0ZXMiOiBbMi4zNzg0MjMyMDAwMDAwNDMsIDQ4Ljg2NTk4NThdDQogICAgICB9LA0KICAgICAgInByb3BlcnRpZXMiOiB7DQogICAgICAgICJ0aXRsZSI6ICJMJ0VzcHJpdCBUY2hhw68iLA0KICAgICAgICAiYWRkcmVzcyI6ICIxMTUgUnVlIE9iZXJrYW1wZiIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9kdWl0cyBiaW8sIHBsYXRzIHbDqWfDqXRhcmllbnMsIGdsdXRlbi1mcmVlLCBwbGF0ICsgZW50csOpZSBvdSBkZXNzZXJ0IDwgMTHigqwiLA0KICAgICAgICAibWFya2VyLXN5bWJvbCI6ICJyZXN0YXVyYW50Ig0KICAgICAgfQ0KICAgIH0sDQogICAgew0KICAgICAgInR5cGUiOiAiRmVhdHVyZSIsDQogICAgICAiZ2VvbWV0cnkiOiB7DQogICAgICAgICJ0eXBlIjogIlBvaW50IiwNCiAgICAgICAgImNvb3JkaW5hdGVzIjogWzIuMzg2MjUzODk5OTk5OTI4OCwgNDguODY4NTk0NV0NCiAgICAgIH0sDQogICAgICAicHJvcGVydGllcyIgOiB7DQogICAgICAgICJuYW1lIjogIkRpbGlhIiwNCiAgICAgICAgImFkZHJlc3MiOiAiMSBydWUgZCdFdXBhdG9yaWEsIDc1MDIwIFBhcmlzIiwNCiAgICAgICAgImRlc2NyaXB0aW9ucyI6ICJDdWlzaW5lIGdhc3Ryb25vbWlxdWUsIHRyYXR0b3JpYSAtICBNZW51IMOgIDE2LTE5LDXigqwgbGUgbWlkaSAoNDQtNjDigqwgbGUgc29pcikiLA0KICAgICAgICAibWFya2VyLXN5bWJvbCI6ICJyZXN0YXVyYW50Ig0KICAgICAgfQ0KICAgIH0sDQogICAgew0KICAgICAgInR5cGUiOiAiRmVhdHVyZSIsDQogICAgICAiZ2VvbWV0cnkiOiB7DQogICAgICAgICJ0eXBlIjogIlBvaW50IiwNCiAgICAgICAgImNvb3JkaW5hdGVzIjogWzIuMzgyMDI0OTAwMDAwMDMzLCA0OC44NjU0NTY5XQ0KICAgICAgfSwNCiAgICAgICJwcm9wZXJ0aWVzIiA6IHsNCiAgICAgICAgIm5hbWUiOiAiTGUgUGVyY2hvaXIiLA0KICAgICAgICAiYWRkcmVzcyI6ICIxNCBSdWUgQ3Jlc3BpbiBkdSBHYXN0LCA3NTAxMSBQYXJpcyIsDQogICAgICAgICJkZXNjcmlwdGlvbnMiOiAiUm9vZnRvcCBzeW1wYSBlbiDDqXTDqSwgbWFpcyB1biBwZXUgY2hlciwgY29ja3RhaWxzIGV0IHNuYWNrcyIsDQogICAgICAgICJtYXJrZXItc3ltYm9sIjogImJhciINCiAgICAgIH0NCiAgICB9LA0KICAgIHsNCiAgICAgICJ0eXBlIjogIkZlYXR1cmUiLA0KICAgICAgImdlb21ldHJ5Ijogew0KICAgICAgICAidHlwZSI6ICJQb2ludCIsDQogICAgICAgICJjb29yZGluYXRlcyI6IFsyLjM3Njk5MDUwMDAwMDAzMzUsIDQ4Ljg2NTM5MjhdDQogICAgICB9LA0KICAgICAgInByb3BlcnRpZXMiIDogew0KICAgICAgICAibmFtZSI6ICJNYW1tYSBSb21hIiwNCiAgICAgICAgImFkZHJlc3MiOiAiOTAgcnVlIE9iZXJrYW1wZiwgNzUwMTEgUGFyaXMiLA0KICAgICAgICAiZGVzY3JpcHRpb25zIjogIlBpenphICdBbCBUYWdsaW8nLCBwZXRpdHMgYW50aXBhc3RpcyBldCBmb2NhY2NpYSAtIE1lbnUgYXV0b3VyIGRlIDEw4oKsKSIsDQogICAgICAgICJtYXJrZXItc3ltYm9sIjogInJlc3RhdXJhbnQiDQogICAgICB9DQogICAgfSwNCiAgICB7DQogICAgICAidHlwZSI6ICJGZWF0dXJlIiwNCiAgICAgICJnZW9tZXRyeSI6IHsNCiAgICAgICAgInR5cGUiOiAiUG9pbnQiLA0KICAgICAgICAiY29vcmRpbmF0ZXMiOiBbMi4zNzUzNzQyMDAwMDAwMSwgNDguODY0NjYzNjAwMDAwMDFdDQogICAgICB9LA0KICAgICAgInByb3BlcnRpZXMiOiB7DQogICAgICAgICJ0aXRsZSI6ICJCJk0iLA0KICAgICAgICAiYWRkcmVzcyI6ICI4MiBhdmVudWUgUGFybWVudGllciIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbiBkZSBtZWlsbGV1cnMgYnVyZ2VycyBkZSBQYXJpcyBzZWxvbiBLb25iaW5pLCBhdXRvdXIgZGUgMTTigqwgYXZlYyBmcml0ZXMgZXQgYm9pc3Nvbi4iLA0KICAgICAgICAibWFya2VyLXN5bWJvbCI6ICJyZXN0YXVyYW50Ig0KICAgICAgfQ0KICAgIH0sDQogICAgew0KICAgICAgInR5cGUiOiAiRmVhdHVyZSIsDQogICAgICAiZ2VvbWV0cnkiOiB7DQogICAgICAgICJ0eXBlIjogIlBvaW50IiwNCiAgICAgICAgImNvb3JkaW5hdGVzIjogWzIuMzgwMTE1ODk5OTk5OTY0MywgNDguODYyNjg1Nl0NCiAgICAgIH0sDQogICAgICAicHJvcGVydGllcyIgOiB7DQogICAgICAgICJuYW1lIjogIkwnQWx0cmEiLA0KICAgICAgICAiYWRkcmVzcyI6ICI1MiBydWUgU2FpbnQgTWF1ciwgNzUwMTEgUGFyaXMiLA0KICAgICAgICAiZGVzY3JpcHRpb25zIjogIlBpenrDqXJpYSwgYW50aXBhc3RpcyAtIEZvcm11bGUgw6AgMTPigqwpIiwNCiAgICAgICAgIm1hcmtlci1zeW1ib2wiOiAicmVzdGF1cmFudCINCiAgICAgIH0NCiAgICB9LA0KICAgIHsNCiAgICAgICJ0eXBlIjogIkZlYXR1cmUiLA0KICAgICAgImdlb21ldHJ5Ijogew0KICAgICAgICAidHlwZSI6ICJQb2ludCIsDQogICAgICAgICJjb29yZGluYXRlcyI6IFsyLjM2NjMzNDQ5OTk5OTk5MzYsIDQ4Ljg2NDU3ODldDQogICAgICB9LA0KICAgICAgInByb3BlcnRpZXMiIDogew0KICAgICAgICAibmFtZSI6ICJQYXBlcmJveSIsDQogICAgICAgICJhZGRyZXNzIjogIjEzNyBydWUgQW1lbG90LCA3NTAxMSBQYXJpcyIsDQogICAgICAgICJkZXNjcmlwdGlvbnMiOiAiVVMgaGVhbHRoeSwgc2FuZHdpY2hzLCBzYWxhZGVzLCBqdXMgLSBBdXRvdXIgZGUgMTPigqwpIiwNCiAgICAgICAgIm1hcmtlci1zeW1ib2wiOiAicmVzdGF1cmFudCINCiAgICAgIH0NCiAgICB9LA0KICAgIHsNCiAgICAgICJ0eXBlIjogIkZlYXR1cmUiLA0KICAgICAgImdlb21ldHJ5Ijogew0KICAgICAgICAidHlwZSI6ICJQb2ludCIsDQogICAgICAgICJjb29yZGluYXRlcyI6IFsyLjM3NjQ1MTI5OTk5OTk4NSwgNDguODY2NzkwNV0NCiAgICAgIH0sDQogICAgICAicHJvcGVydGllcyIgOiB7DQogICAgICAgICJuYW1lIjogIlRoYW5rIFlvdSBNeSBEZWFyIiwNCiAgICAgICAgImFkZHJlc3MiOiAiMTEyIHJ1ZSBTYWludCBNYXVyLCA3NTAxMSBQYXJpcyIsDQogICAgICAgICJkZXNjcmlwdGlvbnMiOiAiR2x1dGVuIEZyZWUsIHNhbmR3aWNocywgc2FsYWRlcyAtIEZvcm11bGUgw6AgMTDigqwpIiwNCiAgICAgICAgIm1hcmtlci1zeW1ib2wiOiAicmVzdGF1cmFudCINCiAgICAgIH0NCiAgICB9LA0KICAgIHsNCiAgICAgICJ0eXBlIjogIkZlYXR1cmUiLA0KICAgICAgImdlb21ldHJ5Ijogew0KICAgICAgICAidHlwZSI6ICJQb2ludCIsDQogICAgICAgICJjb29yZGluYXRlcyI6IFsyLjM3NjA1OTQwMDAwMDAzMSwgNDguODY0NzQ2N10NCiAgICAgIH0sDQogICAgICAicHJvcGVydGllcyIgOiB7DQogICAgICAgICJuYW1lIjogIkJsb29kaWVzIiwNCiAgICAgICAgImFkZHJlc3MiOiAiNTggYXZlbnVlIGRlIGxhIFLDqXB1YmxpcXVlLCA3NTAxMSBQYXJpcyIsDQogICAgICAgICJkZXNjcmlwdGlvbnMiOiAiU3DDqWNpYWxpdMOpIGRlIHZpYW5kZSAtIEZvcm11bGUgw6AgMTbigqwgbGUgbWlkaSkiLA0KICAgICAgICAibWFya2VyLXN5bWJvbCI6ICJyZXN0YXVyYW50Ig0KICAgICAgfQ0KICAgIH0sDQogICAgew0KICAgICAgInR5cGUiOiAiRmVhdHVyZSIsDQogICAgICAiZ2VvbWV0cnkiOiB7DQogICAgICAgICJ0eXBlIjogIlBvaW50IiwNCiAgICAgICAgImNvb3JkaW5hdGVzIjogWzIuMzcxODY4Mjk5OTk5OTYsIDQ4Ljg2NDU5NzhdDQogICAgICB9LA0KICAgICAgInByb3BlcnRpZXMiIDogew0KICAgICAgICAibmFtZSI6ICJBdXggRGV1eCBBbWlzIiwNCiAgICAgICAgImFkZHJlc3MiOiAiNDUgcnVlIE9iZXJrYW1wZiwgNzUwMTEgUGFyaXMiLA0KICAgICAgICAiZGVzY3JpcHRpb25zIjogIkJvbm5lIGZyYW5xdWV0dGUsIHRhcGFzKDMtMTLigqwpIGV0IHZpbiBsZSBzb2lyIC0gTWVudSDDoCAxOC0yMuKCrCBsZSBtaWRpKSIsDQogICAgICAgICJtYXJrZXItc3ltYm9sIjogInJlc3RhdXJhbnQiDQogICAgICB9DQogICAgfSwNCiAgICB7DQogICAgICAidHlwZSI6ICJGZWF0dXJlIiwNCiAgICAgICJnZW9tZXRyeSI6IHsNCiAgICAgICAgInR5cGUiOiAiUG9pbnQiLA0KICAgICAgICAiY29vcmRpbmF0ZXMiOiBbMi4zNzE3OTM3MDAwMDAwMTIsIDQ4Ljg2NDMyODRdDQogICAgICB9LA0KICAgICAgInByb3BlcnRpZXMiIDogew0KICAgICAgICAibmFtZSI6ICJFcGljZXJpZSBkdSBWZXJyZSBWb2zDqSIsDQogICAgICAgICJhZGRyZXNzIjogIjU0LCBydWUgZGUgbGEgRm9saWUgTcOpcmljb3VydCwgNzUwMTEgUGFyaXMiLA0KICAgICAgICAiZGVzY3JpcHRpb25zIjogIkVwaWNlcmllIGZpbmUsIHNhbmR3aWNocyDDoCBjb21wb3NlciBvdSBwYXMgLSBTYW5kd2ljaCA6IDUgw6AgN+KCrCkiLA0KICAgICAgICAibWFya2VyLXN5bWJvbCI6ICJyZXN0YXVyYW50Ig0KICAgICAgfQ0KICAgIH0sDQogICAgew0KICAgICAgInR5cGUiOiAiRmVhdHVyZSIsDQogICAgICAiZ2VvbWV0cnkiOiB7DQogICAgICAgICJ0eXBlIjogIlBvaW50IiwNCiAgICAgICAgImNvb3JkaW5hdGVzIjogWzIuMzc5MjU0MCwgNDguODY2MjcyMF0NCiAgICAgIH0sDQogICAgICAicHJvcGVydGllcyIgOiB7DQogICAgICAgICJuYW1lIjogIkwnaW1wYXNzZSIsDQogICAgICAgICJhZGRyZXNzIjogIjQsIGNpdMOpIEdyaXNldCwgNzUwMTEgUGFyaXMiLA0KICAgICAgICAiZGVzY3JpcHRpb25zIjogIlBvdXIgYm9pcmUgdW4gdmVycmUgZGFucyB1bmUgYW1iaWFuY2UgY29zeSkiLA0KICAgICAgICAibWFya2VyLXN5bWJvbCI6ICJiYXIiDQogICAgICB9DQogICAgfQ0KICBdDQp9DQpgYGANCg0KIVtQYXJpcyBNYXBdKGltYWdlcy9QYXJpcy5wbmcpDQoNCltKZXNzaWNhJ3MgUGFyaXMgTWFwIExpbmtdKGh0dHBzOi8vc211ZGFsbGFzLm1hcHMuYXJjZ2lzLmNvbS9hcHBzL2luc3RhbnQvY2hhcnRzL2luZGV4Lmh0bWw/YXBwaWQ9ZGU0MzY1MGU4NjFmNGJkMWJiYzU5ODFkODFmNGU1ZDApDQo=