");
// update markers
markers.eachLayer(function (layer) {
if (layer.feature.properties.uri == res.point.value) {
if (has_label == true) {
layer.feature.properties[filter_title + "#label"] = res.filterLabel.value;
} else {
layer.feature.properties[filter_title + "#label"] = res.filter.value;
}
layer.feature.properties[filter_title + "#value"] = res.filter.value;
}
});
});
// get markers from geoJSON, bind popupContent
var data_layers = L.geoJSON(dataMap, {
onEachFeature: onEachFeature
});
// add checkboxes
var filter_names = Object.keys(labels_values_count);
setCheckbox([]);
filter_names.forEach(function (filter_name, i) {
setCheckbox(function (prevCheckboxes) {
return [].concat(_toConsumableArray(prevCheckboxes), [{
key_check: filter_name,
value_check: labels_values_count[filter_name]
}]);
});
});
setCollapse('collapsed');
$("#filter_" + extra_id).collapse();
})["catch"](function (error) {
console.error('Error:', error);
alert("Sidebar filters: there is an error in the query");
})["finally"](function () {
setLoad('loaded');
});
} else {
fetch(datastory_data.sparql_endpoint + '?query=' + encoded_query, {
method: method,
headers: {
'Accept': 'application/sparql-results+json'
}
}).then(function (res) {
return res.json();
}).then(function (data) {
var labels_values_count = {},
headings = data.head.vars,
has_label = false;
data.results.bindings.forEach(function (res, i) {
// check if the filter is a string or a uri+string
if (headings.includes('filterLabel')) {
has_label = true;
}
dataMap.forEach(function (elem, i) {
if (elem.properties.uri == res.point.value) {
if (has_label == true) {
elem.properties[filter_title + "#label"] = res.filterLabel.value;
elem.properties[filter_title + "#value"] = res.filter.value;
if (labels_values_count[res.filter.value] == undefined) {
labels_values_count[res.filter.value] = [res.filterLabel.value, 1];
} else {
labels_values_count[res.filter.value] = [res.filterLabel.value, labels_values_count[res.filter.value][1] + 1];
}
} else {
elem.properties[filter_title + "#label"] = res.filter.value;
elem.properties[filter_title + "#value"] = res.filter.value;
if (labels_values_count[res.filter.value] == undefined) {
labels_values_count[res.filter.value] = [res.filter.value, 1];
} else {
labels_values_count[res.filter.value] = [res.filter.value, labels_values_count[res.filter.value][1] + 1];
}
}
}
});
// update geoJSON in DOM
$('#dataMap_' + index_parent).remove();
var $body = $(document.body);
$body.append("");
// update markers
markers.eachLayer(function (layer) {
if (layer.feature.properties.uri == res.point.value) {
if (has_label == true) {
layer.feature.properties[filter_title + "#label"] = res.filterLabel.value;
} else {
layer.feature.properties[filter_title + "#label"] = res.filter.value;
}
layer.feature.properties[filter_title + "#value"] = res.filter.value;
}
});
});
// get markers from geoJSON, bind popupContent
var data_layers = L.geoJSON(dataMap, {
onEachFeature: onEachFeature
});
// add checkboxes
var filter_names = Object.keys(labels_values_count);
setCheckbox([]);
filter_names.forEach(function (filter_name, i) {
setCheckbox(function (prevCheckboxes) {
return [].concat(_toConsumableArray(prevCheckboxes), [{
key_check: filter_name,
value_check: labels_values_count[filter_name]
}]);
});
});
setCollapse('collapsed');
$("#filter_" + extra_id).collapse();
})["catch"](function (error) {
console.error('Error:', error);
alert("Sidebar filters: there is an error in the query");
})["finally"](function () {
setLoad('loaded');
});
}
}
};
if (checkboxData.length) {
for (var i = 0; i < checkboxData.length; i++) {
checkboxBox.push( /*#__PURE__*/React.createElement(FilterCheckbox, {
key: generateKey(checkboxData[i].key_check),
key_check: checkboxData[i].key_check,
value_check: checkboxData[i].value_check,
indexPanel: indexPanel,
filter_title: filter_title,
markers: markers,
allMarkers: allMarkers,
map: map
}));
}
}
React.useEffect(function () {
//update_panel();
if (firstLoad == 'loaded') {
getCheckboxes();
}
}, []);
return /*#__PURE__*/React.createElement("div", {
className: "map_sidebar_panel"
}, /*#__PURE__*/React.createElement("a", {
role: "button",
className: "map_sidebar_panel_title",
"data-toggle": "collapse",
onClick: getCheckboxes,
href: "#filter_" + extra_id,
"aria-expanded": "false",
"aria-controls": "filter_" + extra_id
}, filter_title), /*#__PURE__*/React.createElement("div", {
className: "collapse",
id: "filter_" + extra_id
}, /*#__PURE__*/React.createElement("div", null, checkboxBox)));
};
var MapSidebar = function MapSidebar(_ref3) {
var index = _ref3.index,
filters = _ref3.filters,
onEachFeature = _ref3.onEachFeature,
allMarkers = _ref3.allMarkers,
markers = _ref3.markers,
map = _ref3.map,
setIsShown = _ref3.setIsShown,
isShown = _ref3.isShown;
var sidebarPanelsBox = [];
React.useEffect(function () {}, []);
filters.forEach(function (filter, i) {
sidebarPanelsBox.push( /*#__PURE__*/React.createElement(SidebarPanel, {
indexPanel: i,
key: generateKey(filter) + i,
index_parent: index,
onEachFeature: onEachFeature,
filters: filters,
filter_title: filters[i].map_filter_title,
markers: markers,
allMarkers: allMarkers,
map: map
}));
});
if (filters.length) {
return /*#__PURE__*/React.createElement("div", {
style: {
background: 'linear-gradient(-45deg,' + datastory_data.color_code[0] + ',' + datastory_data.color_code[1] + ')'
},
className: "map_sidebar"
}, /*#__PURE__*/React.createElement("h3", {
className: "map_sidebar_title"
}, "FILTERS"), sidebarPanelsBox);
}
};
var FilterMap = function FilterMap(_ref4) {
var indexFilter = _ref4.indexFilter,
index_parent = _ref4.index_parent,
setFilterChange = _ref4.setFilterChange,
filters = _ref4.filters,
removeFilterBox = _ref4.removeFilterBox;
var defaultFilterQuery = filters[indexFilter].map_filter_query,
defaultFilterTitle = filters[indexFilter].map_filter_title;
var _React$useState9 = React.useState(defaultFilterQuery),
_React$useState10 = _slicedToArray(_React$useState9, 2),
filterQuery = _React$useState10[0],
setFilterQuery = _React$useState10[1];
var filterQueryChange = function filterQueryChange(event) {
var newArrQ = _toConsumableArray(filters);
newArrQ[indexFilter].map_filter_query = event.target.value;
};
var _React$useState11 = React.useState(defaultFilterTitle),
_React$useState12 = _slicedToArray(_React$useState11, 2),
filterTitle = _React$useState12[0],
setFilterTitle = _React$useState12[1];
var filterTitleChange = function filterTitleChange(event) {
var newArrQ = _toConsumableArray(filters);
newArrQ[indexFilter].map_filter_title = event.target.value;
};
var filter_id = new Date().getTime();
return /*#__PURE__*/React.createElement("div", {
className: "query-div",
id: "el_" + indexFilter + "__form_group"
}, /*#__PURE__*/React.createElement("hr", null), /*#__PURE__*/React.createElement("h4", {
className: "block_title"
}, "Add a filter"), /*#__PURE__*/React.createElement("a", {
onClick: function onClick() {
return removeFilterBox(indexFilter);
},
className: "trash trash_subcomponent"
}, /*#__PURE__*/React.createElement("i", {
className: "far fa-trash-alt"
})), /*#__PURE__*/React.createElement("br", null), /*#__PURE__*/React.createElement("div", {
className: "form-group",
id: indexFilter + "__form_group_filter"
}, /*#__PURE__*/React.createElement("label", {
htmlFor: "largeInput"
}, "SPARQL query"), /*#__PURE__*/React.createElement("textarea", {
onChange: filterQueryChange,
id: index_parent + "__map_filter_query_" + filter_id + "_" + indexFilter,
name: index_parent + "__map_filter_query_" + filter_id + "_" + indexFilter,
defaultValue: filterQuery,
placeholder: "A SPARQL query that returns two variables",
required: true
}), /*#__PURE__*/React.createElement("label", {
htmlFor: "largeInput"
}, "Filter title"), /*#__PURE__*/React.createElement("input", {
onChange: filterTitleChange,
type: "text",
id: index_parent + "__map_filter_title_" + filter_id + "_" + indexFilter,
name: index_parent + "__map_filter_title_" + filter_id + "_" + indexFilter,
defaultValue: filterTitle,
placeholder: "The label of the filter"
}), /*#__PURE__*/React.createElement("p", null, /*#__PURE__*/React.createElement("em", null, "Rerun the main query to update"))));
};
var MarkerSidebar = function MarkerSidebar(_ref5) {
var markerSidebar = _ref5.markerSidebar,
setMarkerSidebar = _ref5.setMarkerSidebar,
setMarkerSidebarContent = _ref5.setMarkerSidebarContent,
markerSidebarContent = _ref5.markerSidebarContent;
function make_uri(el) {
if (el.startsWith('http')) {
return /*#__PURE__*/React.createElement("a", {
href: el
}, "URI ", /*#__PURE__*/React.createElement("i", {
className: "far fa-external-link"
}));
} else {
return el;
}
}
var closeMarkerSidebar = function closeMarkerSidebar(e) {
setMarkerSidebar('close');
};
if (markerSidebar == 'open') {
console.log(markerSidebarContent);
return /*#__PURE__*/React.createElement("div", {
className: "map_sidebar map_sidebar_right"
}, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("a", {
onClick: function onClick() {
return closeMarkerSidebar();
},
className: "closeBox"
}, /*#__PURE__*/React.createElement("i", {
className: "fas fa-times"
})), /*#__PURE__*/React.createElement("br", null), /*#__PURE__*/React.createElement("br", null), Object.keys(markerSidebarContent).map(function (detail, id) {
return /*#__PURE__*/React.createElement("p", {
key: id
}, /*#__PURE__*/React.createElement("strong", null, detail, " "), make_uri(markerSidebarContent[detail]));
})));
}
};
var MapViz = function MapViz(_ref6) {
var unique_key = _ref6.unique_key,
index = _ref6.index,
removeComponent = _ref6.removeComponent,
componentList = _ref6.componentList,
setComponent = _ref6.setComponent,
sortComponentUp = _ref6.sortComponentUp,
sortComponentDown = _ref6.sortComponentDown;
var map = null,
map_title = '',
map_points_query = '',
waitfilters,
markers,
allMarkers,
map_filters = [],
mapid = index + "__map_preview_container",
checked_filters = [];
// WYSIWYG: get content if any
if (datastory_data.dynamic_elements && datastory_data.dynamic_elements.length) {
datastory_data.dynamic_elements.forEach(function (element) {
if (element.type == 'map' && element.position == index) {
map_points_query = element.map_points_query;
map_title = element.map_title;
// filters
if (element.map_filters && element.map_filters.length) {
element.map_filters.forEach(function (element) {
map_filters.push(element);
});
}
}
});
}
var _React$useState13 = React.useState(markers),
_React$useState14 = _slicedToArray(_React$useState13, 2),
markersMap = _React$useState14[0],
setMarkers = _React$useState14[1];
var _React$useState15 = React.useState(allMarkers),
_React$useState16 = _slicedToArray(_React$useState15, 2),
allMarkersMap = _React$useState16[0],
setAllMarkers = _React$useState16[1];
var _React$useState17 = React.useState(map_points_query),
_React$useState18 = _slicedToArray(_React$useState17, 2),
query = _React$useState18[0],
setQuery = _React$useState18[1];
var queryChange = function queryChange(event) {
setQuery(event.target.value);
};
var _React$useState19 = React.useState(map_title),
_React$useState20 = _slicedToArray(_React$useState19, 2),
title = _React$useState20[0],
setTitle = _React$useState20[1];
var titleChange = function titleChange(event) {
setTitle(event.target.value);
};
var _React$useState21 = React.useState('not initialised'),
_React$useState22 = _slicedToArray(_React$useState21, 2),
mapInstance = _React$useState22[0],
setMap = _React$useState22[1];
var _React$useState23 = React.useState(''),
_React$useState24 = _slicedToArray(_React$useState23, 2),
mapRendered = _React$useState24[0],
setMapRender = _React$useState24[1];
var _React$useState25 = React.useState(1),
_React$useState26 = _slicedToArray(_React$useState25, 2),
mapReload = _React$useState26[0],
setMapReload = _React$useState26[1];
var _React$useState27 = React.useState(false),
_React$useState28 = _slicedToArray(_React$useState27, 2),
isShown = _React$useState28[0],
setIsShown = _React$useState28[1];
var _React$useState29 = React.useState(map_filters),
_React$useState30 = _slicedToArray(_React$useState29, 2),
filters = _React$useState30[0],
setFilter = _React$useState30[1];
var _React$useState31 = React.useState(false),
_React$useState32 = _slicedToArray(_React$useState31, 2),
spinner = _React$useState32[0],
setSpinner = _React$useState32[1];
var initMap = function initMap(event) {
// craziness of map already initialised
if (mapInstance != 'initialised' && (map == undefined || map == null)) {
if (mapRendered.length) {
map = mapRendered;
} else {
try {
map = L.map(mapid).setView([51.505, -0.09], 3);
L.tileLayer('https://tiles.stadiamaps.com/tiles/alidade_smooth_dark/{z}/{x}/{y}{r}.png?api_key=5303ddca-5934-45fc-bdf1-40fac7966fa7', {
maxZoom: 19,
attribution: '© OpenStreetMap'
}).addTo(map);
} catch (e) {
console.log(e);
var container = L.DomUtil.get(mapid);
if (container != null) {
container._leaflet_id = null;
}
map = L.map(mapid).setView([51.505, -0.09], 3);
L.tileLayer('https://tiles.stadiamaps.com/tiles/alidade_smooth_dark/{z}/{x}/{y}{r}.png?api_key=5303ddca-5934-45fc-bdf1-40fac7966fa7', {
maxZoom: 19,
attribution: '© OpenStreetMap'
}).addTo(map);
}
}
} else if (mapInstance == 'initialised') map = mapRendered;
if (query.length > 1) {
setSpinner(true);
//if (map && map.remove) { map.off(); map.remove(); }
var method = 'GET';
if (query.length > 2000) {
method = 'POST';
fetch(datastory_data.sparql_endpoint + '?query=', {
method: method,
headers: {
'Accept': 'application/sparql-results+json'
},
body: encodeURIComponent(query)
}).then(function (res) {
return res.json();
}).then(function (data) {
// add markers
var geoJSONdata = creategeoJSON(data);
markers = setViewMarkers(map, mapid, geoJSONdata, waitfilters, datastory_data.color_code[0]);
allMarkers = setViewMarkers(map, mapid, geoJSONdata, waitfilters, datastory_data.color_code[0]);
})["catch"](function (error) {
setSpinner(false);
console.error('Error:', error);
alert("Map: there is an error in the query");
})["finally"](function () {
setSpinner(false);
setMap('initialised');
setMapRender(map);
setMarkers(markers);
setAllMarkers(allMarkers);
});
} else {
fetch(datastory_data.sparql_endpoint + '?query=' + encodeURIComponent(query), {
method: method,
headers: {
'Accept': 'application/sparql-results+json'
}
}).then(function (res) {
return res.json();
}).then(function (data) {
// add markers
var geoJSONdata = creategeoJSON(data);
markers = setViewMarkers(map, mapid, geoJSONdata, waitfilters, datastory_data.color_code[0]);
allMarkers = setViewMarkers(map, mapid, geoJSONdata, waitfilters, datastory_data.color_code[0]);
})["catch"](function (error) {
setSpinner(false);
console.error('Error:', error);
alert("Map: there is an error in the query");
})["finally"](function () {
setSpinner(false);
setMap('initialised');
setMapRender(map);
setMarkers(markers);
setAllMarkers(allMarkers);
});
}
}
return map;
};
function setViewMarkers(map, mapid, geoJSONdata, waitfilters, color_code) {
// remove markers if any from a map already initialised
map.eachLayer(function (layer) {
if (layer instanceof L.MarkerClusterGroup) {
map.removeLayer(layer);
}
});
// remove geoJSON
$('#dataMap_' + index).remove();
// style clusters
var innerClusterStyle = "display: inline-block; background:" + color_code + ";\
width: 40px; height: 40px !important; border-radius: 50% !important; padding-top: 10px; opacity: 0.8;";
var markers = L.markerClusterGroup({
iconCreateFunction: function iconCreateFunction(cluster) {
var markers = cluster.getAllChildMarkers();
var n = 0;
markers.forEach(function (item, i) {
n += 1;
});
return L.divIcon({
html: "" + n + "",
className: 'mycluster pointer-color',
iconSize: L.point(40, 40)
});
},
singleMarkerMode: true
});
// get markers from geoJSON, bind popupContent
var data_layers = L.geoJSON(geoJSONdata, {
onEachFeature: onEachFeature
});
// add markers to clusters
markers.addLayer(data_layers);
// show clusters
map.addLayer(markers);
// add geoJSONdata to DOM
var $body = $(document.body);
$body.append("");
return markers;
}
;
var _React$useState33 = React.useState('close'),
_React$useState34 = _slicedToArray(_React$useState33, 2),
markerSidebar = _React$useState34[0],
setMarkerSidebar = _React$useState34[1];
var _React$useState35 = React.useState(''),
_React$useState36 = _slicedToArray(_React$useState35, 2),
markerSidebarContent = _React$useState36[0],
setMarkerSidebarContent = _React$useState36[1];
function openMarkerSidebar(selection, feature) {
// sidebar.toggle();
if (markerSidebar == 'close') {
setMarkerSidebar('open');
setMarkerSidebarContent(feature.properties.popupContent);
} else {
setMarkerSidebar('close');
setMarkerSidebarContent('');
}
// sidebar.html('
this is ' + selection.feature.popupContent + '
');
}
function onEachFeature(feature, layer) {
if (feature.properties && feature.properties.popupContent) {
//layer.bindPopup(feature.properties.popupContent);
layer.on({
//mouseover: highlightFeature,
//mouseout: resetHighlight,
click: function click(e) {
openMarkerSidebar(e, feature);
}
});
}
}
;
function creategeoJSON(returnedJson) {
var geoJSONdata = [];
// clean headings
var headings = returnedJson.head.vars;
var there_is_point = headings.indexOf('point');
headings.forEach(function (item, i) {
if (item == 'lat' || item == 'long' || item == 'point') {
headings.splice(i, 1);
i--;
}
});
// create geoJSON object
returnedJson.results.bindings.forEach(function (item, i) {
var pointObj = {};
pointObj.type = "Feature";
pointObj.properties = {};
pointObj.properties.popupContent = {};
headings.forEach(function (head, i) {
pointObj.properties.popupContent[head] = item[head].value;
});
if (there_is_point != -1) {
pointObj.properties.uri = item['point'].value;
pointObj.properties.popupContent.point = item.point.value;
}
;
pointObj.geometry = {};
pointObj.geometry.type = "Point";
// check first
pointObj.geometry.coordinates = [item["long"].value, item.lat.value];
geoJSONdata.push(pointObj);
});
return geoJSONdata;
}
;
var filterQueriesBox = [];
var filterChange = function filterChange(event) {
setFilter(function (prevExtras) {
return [].concat(_toConsumableArray(prevExtras), [{
map_filter_query: '',
map_filter_title: ''
}]);
});
};
var removeFilterBox = function removeFilterBox(indexFilter) {
var form = document.getElementById('modifystory_form');
var formData = new FormData(form);
var url = window.location.toString();
url = url.replace(/modify\//, 'modify_bkg\/');
fetch(url, {
method: 'POST',
body: formData
}).then(function (response) {
return response.text();
}).then(function (data) {
if (data) {
datastory_data = JSON.parse(data);
setFilter(function (old_filters) {
var new_filters = [];
datastory_data.dynamic_elements.forEach(function (element) {
if (element.type == 'map' && element.position == index) {
if (element.map_filters && element.map_filters.length) {
element.map_filters.forEach(function (elem, i) {
if (elem.position != indexFilter) {
new_filters.push(elem);
}
});
}
}
});
return new_filters;
});
}
})["catch"](function (error) {
console.log(error);
});
};
if (filters) {
for (var i = 0; i < filters.length; i++) {
filterQueriesBox.push( /*#__PURE__*/React.createElement(FilterMap, {
indexFilter: i,
key: generateKey(filters[i].map_filter_title) + i,
index_parent: index,
setFilterChange: setFilter,
filters: filters,
removeFilterBox: removeFilterBox
}));
}
}
// preview
React.useEffect(function () {
if (mapInstance != 'initialised') {
map = initMap();
} else if (mapInstance == 'initialised') {
map = mapRendered;
}
$("textarea").each(function () {
this.setAttribute("style", "height:" + this.scrollHeight + "px;overflow-y:hidden;");
}).on("input", function () {
this.style.height = 0;
this.style.height = this.scrollHeight + "px";
});
}, []);
// WYSIWYG: render component and preview
if (window.location.href.indexOf("/modify/") > -1) {
try {
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
id: index + "__block_field",
className: "block_field"
}, spinner && /*#__PURE__*/React.createElement("span", {
id: "loader",
className: "lds-dual-ring overlay"
}), /*#__PURE__*/React.createElement("div", {
className: "ribbon"
}), /*#__PURE__*/React.createElement("h4", {
className: "block_title"
}, "Add a map"), /*#__PURE__*/React.createElement(SortComponent, {
index: index,
sortComponentUp: sortComponentUp,
sortComponentDown: sortComponentDown,
key: unique_key
}), /*#__PURE__*/React.createElement(RemoveComponent, {
index: index,
removeComponent: removeComponent,
key: unique_key
}), /*#__PURE__*/React.createElement("div", {
className: "form-group",
id: index + "__form_group"
}, /*#__PURE__*/React.createElement("label", {
htmlFor: "map_title"
}, "Map title"), /*#__PURE__*/React.createElement("input", {
className: "map_title",
id: index + "__map_title",
type: "text",
defaultValue: title,
onChange: titleChange,
name: index + "__map_title",
placeholder: "The title of the map"
}), /*#__PURE__*/React.createElement("label", {
htmlFor: "addplaceholder_points"
}, "SPARQL query"), /*#__PURE__*/React.createElement("textarea", {
className: "addplaceholder_points",
name: index + "__map_points_query",
type: "text",
id: index + "__map_points_query",
onChange: queryChange,
defaultValue: query,
required: true
}), /*#__PURE__*/React.createElement("a", {
style: {
cursor: 'pointer'
},
onClick: initMap
}, "Run the query"), " | ", /*#__PURE__*/React.createElement("a", {
href: "#",
role: "button",
"data-toggle": "modal",
"data-target": "#mapsModalLong"
}, "Learn more about SPARQL queries for maps")), /*#__PURE__*/React.createElement("h3", null, title), /*#__PURE__*/React.createElement("div", {
className: "map_preview_container",
id: index + '__map_preview_container'
}, /*#__PURE__*/React.createElement(MapSidebar, {
index: index,
filters: filters,
key: "sidebar_" + unique_key + index,
onMouseEnter: function onMouseEnter() {
return setIsShown(true);
},
onMouseLeave: function onMouseLeave() {
return setIsShown(false);
},
onEachFeature: onEachFeature,
allMarkers: allMarkersMap,
markers: markersMap,
map: mapRendered
}), /*#__PURE__*/React.createElement(MarkerSidebar, {
key: "marker_sidebar_" + unique_key + index,
markerSidebar: markerSidebar,
setMarkerSidebar: setMarkerSidebar,
setMarkerSidebarContent: setMarkerSidebarContent,
markerSidebarContent: markerSidebarContent
})), /*#__PURE__*/React.createElement("a", {
id: index + "__addmapfilter",
className: "btn btn-primary btn-border",
onClick: filterChange,
extra: "True",
name: index + "map_filter"
}, "Add a filter"), filterQueriesBox), /*#__PURE__*/React.createElement("div", {
className: "modal fade",
id: "mapsModalLong",
tabIndex: "-1",
role: "dialog",
"aria-labelledby": "mapsModalLongTitle",
"aria-hidden": "true"
}, /*#__PURE__*/React.createElement("div", {
className: "modal-dialog modal-lg",
role: "document"
}, /*#__PURE__*/React.createElement("div", {
className: "modal-content card"
}, /*#__PURE__*/React.createElement("div", {
className: "modal-header"
}, /*#__PURE__*/React.createElement("h4", {
id: "mapsModalLongTitle",
className: "card-title"
}, "Populate a map with SPARQL")), /*#__PURE__*/React.createElement("div", {
className: "modal-body"
}, /*#__PURE__*/React.createElement("div", {
className: "container"
}, /*#__PURE__*/React.createElement("div", {
className: "row"
}, /*#__PURE__*/React.createElement("p", null, "A SPARQL query to create a map requires you to include the following variables (names are mandatory)."), /*#__PURE__*/React.createElement("ul", null, /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement("strong", null, "point"), ": (URI) the resource to be plotted."), /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement("strong", null, "lat"), ": (string) the latitude of the point"), /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement("strong", null, "long"), ": (string) the longitude of the point")), /*#__PURE__*/React.createElement("p", null, "You can add as many other variables as you like. Values will be shown on the right sidebar when clicking on a point in the map. To get pretty labels associated to values (when the latter are URIs) use the notation ", /*#__PURE__*/React.createElement("code", null, "?var"), " and ", /*#__PURE__*/React.createElement("code", null, "?varLabel"), " when declaring variables in the SELECT clause."), /*#__PURE__*/React.createElement("p", null, "For instance, a query to Wikidata to return museums in Brittany would look like follows:"), /*#__PURE__*/React.createElement("code", {
className: "query-eg"
}, "SELECT DISTINCT ?point ?pointLabel ?villeIdLabel ?lat ?long", /*#__PURE__*/React.createElement("br", null), "WHERE {", /*#__PURE__*/React.createElement("br", null), "?point wdt:P539 ?museofile; wdt:P131* wd:Q12130; ", /*#__PURE__*/React.createElement("br", null), "wdt:P131 ?villeId; p:P625 ?statement.", /*#__PURE__*/React.createElement("br", null), "?statement psv:P625 ?node. ", "?node wikibase:geoLatitude ?lat ; wikibase:geoLongitude ?long.", /*#__PURE__*/React.createElement("br", null), "SERVICE wikibase:label { bd:serviceParam wikibase:language 'en'. } } ", /*#__PURE__*/React.createElement("br", null)), /*#__PURE__*/React.createElement("p", null, "The map plots points as clusters, showing the number of resources per area. When moving the mouse over a cluster, the edges of the area is shown."), /*#__PURE__*/React.createElement("p", null, "Please note that to see the preview on the map you must click on ", /*#__PURE__*/React.createElement("code", null, "Run the query"), ", to avoid expensive unnecessary queries."), /*#__PURE__*/React.createElement("h4", {
className: "block_title"
}, "Filters"), /*#__PURE__*/React.createElement("p", null, "You can add filters to the map, which will appear in the left sidebar. To add a filter to the map you need a SPARQL query where to specify three variables (names are mandatory):"), /*#__PURE__*/React.createElement("ul", null, /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement("strong", null, "point"), ": a variable identifying the data points returned by the previous query. We will replace this variable with the list of data points returned by the previous query, so you do not need to repeat the patterns to identify what a point is."), /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement("strong", null, "filter"), ": the variable to be used as a filter. Can be a URI or a Literal."), /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement("strong", null, "filterLabel"), ": the label of the filter in case the filter is a URI.")), /*#__PURE__*/React.createElement("p", null, "For instance, a query on Wikidata to return museums' types as filters would look like follows:"), /*#__PURE__*/React.createElement("code", {
className: "query-eg"
}, "SELECT DISTINCT ?point ?filter ?filterLabel", /*#__PURE__*/React.createElement("br", null), "WHERE {", /*#__PURE__*/React.createElement("br", null), "?point wdt:P539 ?museofile; wdt:P131* wd:Q12130. ", /*#__PURE__*/React.createElement("br", null), "?point wdt:P131 ?filter. ?filter rdfs:label ?filterLabel .", /*#__PURE__*/React.createElement("br", null), "FILTER(LANG(?filterLabel) = '' || LANGMATCHES(LANG(?filterLabel), 'en')). }", /*#__PURE__*/React.createElement("br", null))))), /*#__PURE__*/React.createElement("div", {
className: "modal-footer"
}, /*#__PURE__*/React.createElement("button", {
type: "button",
className: "btn btn-danger",
"data-dismiss": "modal"
}, "Close"))))));
} catch (error) {
return /*#__PURE__*/React.createElement(ErrorHandler, {
error: error
});
}
} else {
// Final story: render preview
try {
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("h3", {
className: "block_title float_none"
}, title), /*#__PURE__*/React.createElement("div", {
className: "map_preview_container",
id: index + '__map_preview_container'
}, /*#__PURE__*/React.createElement(MapSidebar, {
index: index,
filters: filters,
key: "sidebar_" + unique_key + index,
onMouseEnter: function onMouseEnter() {
return setIsShown(true);
},
onMouseLeave: function onMouseLeave() {
return setIsShown(false);
},
onEachFeature: onEachFeature,
allMarkers: allMarkersMap,
markers: markersMap,
map: mapRendered
}), /*#__PURE__*/React.createElement(MarkerSidebar, {
key: "marker_sidebar_" + unique_key + index,
markerSidebar: markerSidebar,
setMarkerSidebar: setMarkerSidebar,
setMarkerSidebarContent: setMarkerSidebarContent,
markerSidebarContent: markerSidebarContent
})));
} catch (error) {
return /*#__PURE__*/React.createElement(ErrorHandler, {
error: error
});
}
}
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZW5lcmF0ZUtleSIsInByZSIsImNvbmNhdCIsIkRhdGUiLCJnZXRUaW1lIiwiRmlsdGVyQ2hlY2tib3giLCJfcmVmIiwia2V5X2NoZWNrIiwidmFsdWVfY2hlY2siLCJpbmRleFBhbmVsIiwiZmlsdGVyX3RpdGxlIiwibWFya2VycyIsImFsbE1hcmtlcnMiLCJtYXAiLCJjaGVja2VkX2ZpbHRlcnMiLCJfUmVhY3QkdXNlU3RhdGUiLCJSZWFjdCIsInVzZVN0YXRlIiwiX1JlYWN0JHVzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwiY2hlY2tlZCIsInNldENoZWNrIiwiYWRkUmVtb3ZlTWFya2VycyIsIkFycmF5IiwiZnJvbSIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvckFsbCIsInVuZGVmaW5lZCIsImNsZWFyTGF5ZXJzIiwiZWFjaExheWVyIiwibGF5ZXIiLCJhZGRMYXllciIsImZpbHRlcm5hbWVzIiwibGVuZ3RoIiwiX2l0ZXJhdG9yIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJ2YWx1ZXMiLCJfc3RlcCIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwicHVzaCIsImRhdGFzZXQiLCJmaWx0ZXIiLCJlcnIiLCJlIiwiZiIsIl90b0NvbnN1bWFibGVBcnJheSIsIlNldCIsImZpbHRlcm5hbWVzX3ZhbHVlcyIsImZvckVhY2giLCJlbCIsImluZGV4IiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsIk9iamVjdCIsImtleXMiLCJmX25hbWVzIiwibmFtZSIsImkiLCJwcm9wX2tleSIsInByb3BfdmFsdWUiLCJmZWF0dXJlIiwicHJvcGVydGllcyIsImluY2x1ZGVzIiwicmVtb3ZlTGF5ZXIiLCJMIiwiTWFya2VyQ2x1c3Rlckdyb3VwIiwiY2hhbmdlQ2hlY2siLCJldmVudCIsImNyZWF0ZUVsZW1lbnQiLCJ0eXBlIiwibGFiZWwiLCJkZWZhdWx0VmFsdWUiLCJvbkNsaWNrIiwiY2xhc3NOYW1lIiwiaHRtbEZvciIsInN0eWxlIiwiY29sb3IiLCJTaWRlYmFyUGFuZWwiLCJfcmVmMiIsImluZGV4X3BhcmVudCIsIm9uRWFjaEZlYXR1cmUiLCJmaWx0ZXJzIiwiX1JlYWN0JHVzZVN0YXRlMyIsIl9SZWFjdCR1c2VTdGF0ZTQiLCJjb2xsYXBzZWRCb3giLCJzZXRDb2xsYXBzZSIsIl9SZWFjdCR1c2VTdGF0ZTUiLCJfUmVhY3QkdXNlU3RhdGU2IiwiZmlyc3RMb2FkIiwic2V0TG9hZCIsIl9SZWFjdCR1c2VTdGF0ZTciLCJfUmVhY3QkdXNlU3RhdGU4IiwiY2hlY2tib3hEYXRhIiwic2V0Q2hlY2tib3giLCJjaGVja2JveEJveCIsImZfcXVlcnkiLCJtYXBfZmlsdGVyX3F1ZXJ5IiwiZXh0cmFfaWQiLCJ1cGRhdGVfcGFuZWwiLCJkYXRhc3RvcnlfZGF0YSIsImR5bmFtaWNfZWxlbWVudHMiLCJlbGVtZW50IiwicG9zaXRpb24iLCJtYXBfZmlsdGVycyIsIml0ZW0iLCJtYXBfZmlsdGVyX3RpdGxlIiwiZ2V0Q2hlY2tib3hlcyIsImRhdGFNYXAiLCJKU09OIiwicGFyc2UiLCJnZXRFbGVtZW50QnlJZCIsImlubmVySFRNTCIsInVyaSIsImRlY29kZWRfcXVlcnkiLCJkZWNvZGVVUklDb21wb25lbnQiLCJkZWNvZGVkX3F1ZXJ5X3BhcnRzIiwic3BsaXQiLCJlbmNvZGVkX3F1ZXJ5IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicmVwbGFjZSIsIm1ldGhvZCIsImZldGNoIiwic3BhcnFsX2VuZHBvaW50IiwiaGVhZGVycyIsImJvZHkiLCJ0aGVuIiwicmVzIiwianNvbiIsImRhdGEiLCJsYWJlbHNfdmFsdWVzX2NvdW50IiwiaGVhZGluZ3MiLCJoZWFkIiwidmFycyIsImhhc19sYWJlbCIsInJlc3VsdHMiLCJiaW5kaW5ncyIsImVsZW0iLCJwb2ludCIsImZpbHRlckxhYmVsIiwiJCIsInJlbW92ZSIsIiRib2R5IiwiYXBwZW5kIiwic3RyaW5naWZ5IiwiZGF0YV9sYXllcnMiLCJnZW9KU09OIiwiZmlsdGVyX25hbWVzIiwiZmlsdGVyX25hbWUiLCJwcmV2Q2hlY2tib3hlcyIsImNvbGxhcHNlIiwiZXJyb3IiLCJjb25zb2xlIiwiYWxlcnQiLCJrZXkiLCJ1c2VFZmZlY3QiLCJyb2xlIiwiaHJlZiIsImlkIiwiTWFwU2lkZWJhciIsIl9yZWYzIiwic2V0SXNTaG93biIsImlzU2hvd24iLCJzaWRlYmFyUGFuZWxzQm94IiwiYmFja2dyb3VuZCIsImNvbG9yX2NvZGUiLCJGaWx0ZXJNYXAiLCJfcmVmNCIsImluZGV4RmlsdGVyIiwic2V0RmlsdGVyQ2hhbmdlIiwicmVtb3ZlRmlsdGVyQm94IiwiZGVmYXVsdEZpbHRlclF1ZXJ5IiwiZGVmYXVsdEZpbHRlclRpdGxlIiwiX1JlYWN0JHVzZVN0YXRlOSIsIl9SZWFjdCR1c2VTdGF0ZTEwIiwiZmlsdGVyUXVlcnkiLCJzZXRGaWx0ZXJRdWVyeSIsImZpbHRlclF1ZXJ5Q2hhbmdlIiwibmV3QXJyUSIsInRhcmdldCIsIl9SZWFjdCR1c2VTdGF0ZTExIiwiX1JlYWN0JHVzZVN0YXRlMTIiLCJmaWx0ZXJUaXRsZSIsInNldEZpbHRlclRpdGxlIiwiZmlsdGVyVGl0bGVDaGFuZ2UiLCJmaWx0ZXJfaWQiLCJvbkNoYW5nZSIsInBsYWNlaG9sZGVyIiwicmVxdWlyZWQiLCJNYXJrZXJTaWRlYmFyIiwiX3JlZjUiLCJtYXJrZXJTaWRlYmFyIiwic2V0TWFya2VyU2lkZWJhciIsInNldE1hcmtlclNpZGViYXJDb250ZW50IiwibWFya2VyU2lkZWJhckNvbnRlbnQiLCJtYWtlX3VyaSIsInN0YXJ0c1dpdGgiLCJjbG9zZU1hcmtlclNpZGViYXIiLCJsb2ciLCJkZXRhaWwiLCJNYXBWaXoiLCJfcmVmNiIsInVuaXF1ZV9rZXkiLCJyZW1vdmVDb21wb25lbnQiLCJjb21wb25lbnRMaXN0Iiwic2V0Q29tcG9uZW50Iiwic29ydENvbXBvbmVudFVwIiwic29ydENvbXBvbmVudERvd24iLCJtYXBfdGl0bGUiLCJtYXBfcG9pbnRzX3F1ZXJ5Iiwid2FpdGZpbHRlcnMiLCJtYXBpZCIsIl9SZWFjdCR1c2VTdGF0ZTEzIiwiX1JlYWN0JHVzZVN0YXRlMTQiLCJtYXJrZXJzTWFwIiwic2V0TWFya2VycyIsIl9SZWFjdCR1c2VTdGF0ZTE1IiwiX1JlYWN0JHVzZVN0YXRlMTYiLCJhbGxNYXJrZXJzTWFwIiwic2V0QWxsTWFya2VycyIsIl9SZWFjdCR1c2VTdGF0ZTE3IiwiX1JlYWN0JHVzZVN0YXRlMTgiLCJxdWVyeSIsInNldFF1ZXJ5IiwicXVlcnlDaGFuZ2UiLCJfUmVhY3QkdXNlU3RhdGUxOSIsIl9SZWFjdCR1c2VTdGF0ZTIwIiwidGl0bGUiLCJzZXRUaXRsZSIsInRpdGxlQ2hhbmdlIiwiX1JlYWN0JHVzZVN0YXRlMjEiLCJfUmVhY3QkdXNlU3RhdGUyMiIsIm1hcEluc3RhbmNlIiwic2V0TWFwIiwiX1JlYWN0JHVzZVN0YXRlMjMiLCJfUmVhY3QkdXNlU3RhdGUyNCIsIm1hcFJlbmRlcmVkIiwic2V0TWFwUmVuZGVyIiwiX1JlYWN0JHVzZVN0YXRlMjUiLCJfUmVhY3QkdXNlU3RhdGUyNiIsIm1hcFJlbG9hZCIsInNldE1hcFJlbG9hZCIsIl9SZWFjdCR1c2VTdGF0ZTI3IiwiX1JlYWN0JHVzZVN0YXRlMjgiLCJfUmVhY3QkdXNlU3RhdGUyOSIsIl9SZWFjdCR1c2VTdGF0ZTMwIiwic2V0RmlsdGVyIiwiX1JlYWN0JHVzZVN0YXRlMzEiLCJfUmVhY3QkdXNlU3RhdGUzMiIsInNwaW5uZXIiLCJzZXRTcGlubmVyIiwiaW5pdE1hcCIsInNldFZpZXciLCJ0aWxlTGF5ZXIiLCJtYXhab29tIiwiYXR0cmlidXRpb24iLCJhZGRUbyIsImNvbnRhaW5lciIsIkRvbVV0aWwiLCJnZXQiLCJfbGVhZmxldF9pZCIsImdlb0pTT05kYXRhIiwiY3JlYXRlZ2VvSlNPTiIsInNldFZpZXdNYXJrZXJzIiwiaW5uZXJDbHVzdGVyU3R5bGUiLCJtYXJrZXJDbHVzdGVyR3JvdXAiLCJpY29uQ3JlYXRlRnVuY3Rpb24iLCJjbHVzdGVyIiwiZ2V0QWxsQ2hpbGRNYXJrZXJzIiwiZGl2SWNvbiIsImh0bWwiLCJpY29uU2l6ZSIsInNpbmdsZU1hcmtlck1vZGUiLCJfUmVhY3QkdXNlU3RhdGUzMyIsIl9SZWFjdCR1c2VTdGF0ZTM0IiwiX1JlYWN0JHVzZVN0YXRlMzUiLCJfUmVhY3QkdXNlU3RhdGUzNiIsIm9wZW5NYXJrZXJTaWRlYmFyIiwic2VsZWN0aW9uIiwicG9wdXBDb250ZW50Iiwib24iLCJjbGljayIsInJldHVybmVkSnNvbiIsInRoZXJlX2lzX3BvaW50IiwiaW5kZXhPZiIsInNwbGljZSIsInBvaW50T2JqIiwiZ2VvbWV0cnkiLCJjb29yZGluYXRlcyIsImxhdCIsImZpbHRlclF1ZXJpZXNCb3giLCJmaWx0ZXJDaGFuZ2UiLCJwcmV2RXh0cmFzIiwiZm9ybSIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJ1cmwiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsInRvU3RyaW5nIiwicmVzcG9uc2UiLCJ0ZXh0Iiwib2xkX2ZpbHRlcnMiLCJuZXdfZmlsdGVycyIsImVhY2giLCJzZXRBdHRyaWJ1dGUiLCJzY3JvbGxIZWlnaHQiLCJoZWlnaHQiLCJGcmFnbWVudCIsIlNvcnRDb21wb25lbnQiLCJSZW1vdmVDb21wb25lbnQiLCJjdXJzb3IiLCJvbk1vdXNlRW50ZXIiLCJvbk1vdXNlTGVhdmUiLCJleHRyYSIsInRhYkluZGV4IiwiRXJyb3JIYW5kbGVyIl0sInNvdXJjZXMiOlsiaHR0cHM6Ly9wcm9qZWN0cy5kaGFyYy51bmliby5pdC9tZWxvZHkvc3RhdGljL2pzL3JlYWN0L01hcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBnZW5lcmF0ZUtleSA9IChwcmUpID0+IHtcbiAgICByZXR1cm4gYCR7IHByZSB9XyR7IG5ldyBEYXRlKCkuZ2V0VGltZSgpIH1gO1xufVxuXG5jb25zdCBGaWx0ZXJDaGVja2JveCA9ICh7IGtleV9jaGVjaywgdmFsdWVfY2hlY2sgLCBpbmRleFBhbmVsICxcbiAgICAgIGZpbHRlcl90aXRsZSAsIG1hcmtlcnMsIGFsbE1hcmtlcnMsIG1hcH0pID0+IHtcblxuICBsZXQgY2hlY2tlZF9maWx0ZXJzO1xuICBjb25zdCBbY2hlY2tlZCwgc2V0Q2hlY2tdID0gUmVhY3QudXNlU3RhdGUoJ25vdCBjaGVja2VkJyk7XG5cbiAgZnVuY3Rpb24gYWRkUmVtb3ZlTWFya2VycygpIHtcbiAgICBjaGVja2VkX2ZpbHRlcnMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W2NsYXNzPVwibWFwX2NoZWNrYm94XCJdOmNoZWNrZWQnKSk7XG4gICAgaWYgKG1hcmtlcnMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1hcmtlcnMuY2xlYXJMYXllcnMoKTtcbiAgICAgICAgYWxsTWFya2Vycy5lYWNoTGF5ZXIobGF5ZXIgPT4geyBtYXJrZXJzLmFkZExheWVyKGxheWVyKTsgfSk7XG5cbiAgICAgICAgLy8gZ2V0IHRoZSBmaWx0ZXIgbmFtZXNcbiAgICAgICAgbGV0IGZpbHRlcm5hbWVzID0gW107XG4gICAgICAgIGlmIChjaGVja2VkX2ZpbHRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNoZWNrZWRfZmlsdGVycy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgICAgIGZpbHRlcm5hbWVzLnB1c2godmFsdWUuZGF0YXNldC5maWx0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFsgZmlsdGVyMSwgZmlsdGVyMiAuLi5dXG4gICAgICAgIGZpbHRlcm5hbWVzID0gWy4uLm5ldyBTZXQoZmlsdGVybmFtZXMpXTtcblxuICAgICAgICAvLyBhZGQgdmFsdWVzIGNoZWNrZWRcbiAgICAgICAgdmFyIGZpbHRlcm5hbWVzX3ZhbHVlcyA9IHt9O1xuICAgICAgICBmaWx0ZXJuYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChlbCwgaW5kZXgpIHsgZmlsdGVybmFtZXNfdmFsdWVzW2VsXSA9IFtdOyB9KTtcblxuICAgICAgICAvLyB7IGZpbHRlcjE6IFsgY2hlY2tib3gxdmFsdWUsIGNoZWNrYm94MnZhbHVlXSwgZmlsdGVyMiA6IFsgLi4uIF0gLi4uXVxuICAgICAgICBpZiAoY2hlY2tlZF9maWx0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjaGVja2VkX2ZpbHRlcnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJuYW1lc192YWx1ZXNbdmFsdWUuZGF0YXNldC5maWx0ZXJdLnB1c2godmFsdWUudmFsdWUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZmlsdGVybmFtZXNfdmFsdWVzKS5sZW5ndGgpIHtcbiAgICAgICAgICBsZXQgZl9uYW1lcyA9IE9iamVjdC5rZXlzKGZpbHRlcm5hbWVzX3ZhbHVlcyk7XG4gICAgICAgICAgZl9uYW1lcy5mb3JFYWNoKChuYW1lLCBpKSA9PiB7XG4gICAgICAgICAgICBtYXJrZXJzLmVhY2hMYXllcihsYXllciA9PiB7XG4gICAgICAgICAgICAgIC8vIGlmIHByb3BlcnR5IHZhbHVlIG5vdCBpbiB0aGUgbGlzdCBvZiBjaGVja2VkLWNoZWNrYm94ZXMgdmFsdWVzIHJlbW92ZSBtYXJrZXJcbiAgICAgICAgICAgICAgdmFyIHByb3Bfa2V5ID0gbmFtZSArICcjdmFsdWUnO1xuICAgICAgICAgICAgICB2YXIgcHJvcF92YWx1ZSA9IGxheWVyLmZlYXR1cmUucHJvcGVydGllc1twcm9wX2tleV07XG4gICAgICAgICAgICAgIGlmICghZmlsdGVybmFtZXNfdmFsdWVzW25hbWVdLmluY2x1ZGVzKHByb3BfdmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICBtYXJrZXJzLnJlbW92ZUxheWVyKGxheWVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBjbGVhciBtYXBcbiAgICAgICAgICBtYXAuZWFjaExheWVyKGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICAgICAgICBpZiAobGF5ZXIgaW5zdGFuY2VvZiBMLk1hcmtlckNsdXN0ZXJHcm91cCkge1xuICAgICAgICAgICAgICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVyKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbWFwLmFkZExheWVyKG1hcmtlcnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVsc2UgcHV0IHRoZW0gYWxsIGJhY2shXG4gICAgICAgIGVsc2Uge1xuXG4gICAgICAgICAgICBtYXAuZWFjaExheWVyKGZ1bmN0aW9uIChsYXllcikge1xuICAgICAgICAgICAgICAgIGlmIChsYXllciBpbnN0YW5jZW9mIEwuTWFya2VyQ2x1c3Rlckdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5yZW1vdmVMYXllcihsYXllcilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1hcmtlcnMuY2xlYXJMYXllcnMoKTtcbiAgICAgICAgICAgIGFsbE1hcmtlcnMuZWFjaExheWVyKGxheWVyID0+IHtcbiAgICAgICAgICAgICAgICBtYXJrZXJzLmFkZExheWVyKGxheWVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbWFwLmFkZExheWVyKG1hcmtlcnMpO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2hhbmdlQ2hlY2sgPSBldmVudCA9PiB7XG4gICAgaWYgKGNoZWNrZWQgPT0gJ25vdCBjaGVja2VkJykge1xuICAgICAgc2V0Q2hlY2soJ2NoZWNrZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0Q2hlY2soJ25vdCBjaGVja2VkJyk7XG4gICAgfVxuICAgIGFkZFJlbW92ZU1hcmtlcnMoKTtcblxuICB9XG4gIHJldHVybiAoXG4gICAgPHA+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT0nY2hlY2tib3gnXG4gICAgICAgIGxhYmVsPXt2YWx1ZV9jaGVja1swXSArIFwiIChcIiArIHZhbHVlX2NoZWNrWzFdICsgXCIpXCJ9XG4gICAgICAgIGRlZmF1bHRWYWx1ZT17a2V5X2NoZWNrfVxuICAgICAgICBuYW1lPXtrZXlfY2hlY2t9XG4gICAgICAgIG9uQ2xpY2s9e2NoYW5nZUNoZWNrfVxuICAgICAgICBjbGFzc05hbWU9XCJtYXBfY2hlY2tib3hcIlxuICAgICAgICBkYXRhLWZpbHRlcj17ZmlsdGVyX3RpdGxlfT5cbiAgICAgIDwvaW5wdXQ+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJrZXlfY2hlY2tcIiBodG1sRm9yPVwia2V5X2NoZWNrXCIgc3R5bGU9e3tjb2xvcjonYmxhY2snfX0+XG4gICAgICAgIHt2YWx1ZV9jaGVja1swXSArIFwiIChcIiArIHZhbHVlX2NoZWNrWzFdICsgXCIpXCJ9XG4gICAgICA8L3NwYW4+XG4gICAgPC9wPlxuICApXG59XG5cbmNvbnN0IFNpZGViYXJQYW5lbCA9ICh7aW5kZXhQYW5lbCAsXG4gICAgaW5kZXhfcGFyZW50ICwgb25FYWNoRmVhdHVyZSAsIGZpbHRlcnMsIGZpbHRlcl90aXRsZSwgbWFya2VycywgYWxsTWFya2VycywgbWFwfSkgPT4ge1xuXG4gIGNvbnN0IFtjb2xsYXBzZWRCb3gsIHNldENvbGxhcHNlXSA9IFJlYWN0LnVzZVN0YXRlKCdub3QgY29sbGFwc2VkJyk7XG4gIGNvbnN0IFtmaXJzdExvYWQsIHNldExvYWRdID0gUmVhY3QudXNlU3RhdGUoJ25vdCBsb2FkZWQnKTtcblxuICBjb25zdCBbY2hlY2tib3hEYXRhLHNldENoZWNrYm94XSA9IFJlYWN0LnVzZVN0YXRlKFtdKTtcbiAgY29uc3QgY2hlY2tib3hCb3ggPSBbXVxuXG4gIGxldCBmX3F1ZXJ5ID0gZmlsdGVyc1tpbmRleFBhbmVsXS5tYXBfZmlsdGVyX3F1ZXJ5LFxuICAgICAgZXh0cmFfaWQgPSBmaWx0ZXJzW2luZGV4UGFuZWxdLmV4dHJhX2lkO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZV9wYW5lbCgpIHtcbiAgICBpZiAoZGF0YXN0b3J5X2RhdGEuZHluYW1pY19lbGVtZW50cyAmJiBkYXRhc3RvcnlfZGF0YS5keW5hbWljX2VsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgZGF0YXN0b3J5X2RhdGEuZHluYW1pY19lbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09ICdtYXAnICYmIGVsZW1lbnQucG9zaXRpb24gPT0gaW5kZXhfcGFyZW50KSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQubWFwX2ZpbHRlcnMubGVuZ3RoID4gaW5kZXhQYW5lbCkge1xuICAgICAgICAgICAgZWxlbWVudC5tYXBfZmlsdGVycy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChpdGVtLnBvc2l0aW9uID09IGluZGV4UGFuZWwpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJfdGl0bGUgPSBpdGVtLm1hcF9maWx0ZXJfdGl0bGUgO1xuICAgICAgICAgICAgICAgIGZfcXVlcnkgPSBpdGVtLm1hcF9maWx0ZXJfcXVlcnk7XG4gICAgICAgICAgICAgICAgZXh0cmFfaWQgPSBpdGVtLmV4dHJhX2lkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuXG4gIGNvbnN0IGdldENoZWNrYm94ZXMgPSBldmVudCA9PiB7XG4gICAgaWYgKGZfcXVlcnkubGVuZ3RoID4gMSkge1xuICAgICAgdmFyIGRhdGFNYXAgPSBKU09OLnBhcnNlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXRhTWFwXycraW5kZXhfcGFyZW50KS5pbm5lckhUTUwpO1xuICAgICAgdmFyIHZhbHVlcyA9IFwiVkFMVUVTID9wb2ludCB7XCI7XG4gICAgICBkYXRhTWFwLmZvckVhY2goKGl0ZW0sIGkpID0+IHsgdmFsdWVzICs9ICc8JyArIGl0ZW0ucHJvcGVydGllcy51cmkgKyAnPiAnOyB9KTtcbiAgICAgIHZhbHVlcyArPSAnfSc7XG5cbiAgICAgIC8vIHJlc3RydWN0dXJlIHF1ZXJ5IHdpdGggVkFMVUVTXG4gICAgICB2YXIgZGVjb2RlZF9xdWVyeSA9IGRlY29kZVVSSUNvbXBvbmVudChmX3F1ZXJ5KTtcbiAgICAgIHZhciBkZWNvZGVkX3F1ZXJ5X3BhcnRzID0gZGVjb2RlZF9xdWVyeS5zcGxpdCgvXFx7KC4qKS9zKTtcbiAgICAgIGRlY29kZWRfcXVlcnkgPSBkZWNvZGVkX3F1ZXJ5X3BhcnRzWzBdICsgJ3snICsgdmFsdWVzICsgZGVjb2RlZF9xdWVyeV9wYXJ0c1sxXTtcbiAgICAgIHZhciBlbmNvZGVkX3F1ZXJ5ID0gZW5jb2RlVVJJQ29tcG9uZW50KGRlY29kZWRfcXVlcnkucmVwbGFjZSgnXFxuJywgJyAnKSk7XG5cbiAgICAgIHZhciBtZXRob2QgPSAnR0VUJztcbiAgICAgIGlmIChlbmNvZGVkX3F1ZXJ5Lmxlbmd0aCA+IDIwMDApIHtcbiAgICAgICAgbWV0aG9kID0gJ1BPU1QnXG4gICAgICAgIGZldGNoKGRhdGFzdG9yeV9kYXRhLnNwYXJxbF9lbmRwb2ludCsnP3F1ZXJ5PScsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9zcGFycWwtcmVzdWx0cytqc29uJyB9LFxuICAgICAgICAgICAgYm9keTogZW5jb2RlZF9xdWVyeVxuICAgICAgICAgICAgfVxuICAgICAgICApLnRoZW4oKHJlcykgPT4gcmVzLmpzb24oKSlcbiAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgbGV0IGxhYmVsc192YWx1ZXNfY291bnQgPSB7fSwgaGVhZGluZ3MgPSBkYXRhLmhlYWQudmFycyxcbiAgICAgICAgICAgICAgICBoYXNfbGFiZWwgPSBmYWxzZTtcblxuICAgICAgICAgICBkYXRhLnJlc3VsdHMuYmluZGluZ3MuZm9yRWFjaCgocmVzLCBpKSA9PiB7XG4gICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGZpbHRlciBpcyBhIHN0cmluZyBvciBhIHVyaStzdHJpbmdcbiAgICAgICAgICAgICBpZiAoaGVhZGluZ3MuaW5jbHVkZXMoJ2ZpbHRlckxhYmVsJykpIHsgaGFzX2xhYmVsID0gdHJ1ZTsgfVxuXG4gICAgICAgICAgICAgZGF0YU1hcC5mb3JFYWNoKChlbGVtLCBpKSA9PiB7XG4gICAgICAgICAgICAgICBpZiAoZWxlbS5wcm9wZXJ0aWVzLnVyaSA9PSByZXMucG9pbnQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgaWYgKGhhc19sYWJlbCA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgZWxlbS5wcm9wZXJ0aWVzW2ZpbHRlcl90aXRsZSArIFwiI2xhYmVsXCJdID0gcmVzLmZpbHRlckxhYmVsLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgIGVsZW0ucHJvcGVydGllc1tmaWx0ZXJfdGl0bGUgKyBcIiN2YWx1ZVwiXSA9IHJlcy5maWx0ZXIudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsc192YWx1ZXNfY291bnRbcmVzLmZpbHRlci52YWx1ZV0gPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsc192YWx1ZXNfY291bnRbcmVzLmZpbHRlci52YWx1ZV0gPSBbcmVzLmZpbHRlckxhYmVsLnZhbHVlLCAxXVxuICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsc192YWx1ZXNfY291bnRbcmVzLmZpbHRlci52YWx1ZV0gPSBbcmVzLmZpbHRlckxhYmVsLnZhbHVlLCBsYWJlbHNfdmFsdWVzX2NvdW50W3Jlcy5maWx0ZXIudmFsdWVdWzFdICsgMV1cbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgZWxlbS5wcm9wZXJ0aWVzW2ZpbHRlcl90aXRsZSArIFwiI2xhYmVsXCJdID0gcmVzLmZpbHRlci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICBlbGVtLnByb3BlcnRpZXNbZmlsdGVyX3RpdGxlICsgXCIjdmFsdWVcIl0gPSByZXMuZmlsdGVyLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbHNfdmFsdWVzX2NvdW50W3Jlcy5maWx0ZXIudmFsdWVdID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHNfdmFsdWVzX2NvdW50W3Jlcy5maWx0ZXIudmFsdWVdID0gW3Jlcy5maWx0ZXIudmFsdWUsIDFdXG4gICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzX3ZhbHVlc19jb3VudFtyZXMuZmlsdGVyLnZhbHVlXSA9IFtyZXMuZmlsdGVyLnZhbHVlLCBsYWJlbHNfdmFsdWVzX2NvdW50W3Jlcy5maWx0ZXIudmFsdWVdWzFdICsgMV1cbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgIC8vIHVwZGF0ZSBnZW9KU09OIGluIERPTVxuICAgICAgICAgICAgICQoJyNkYXRhTWFwXycraW5kZXhfcGFyZW50KS5yZW1vdmUoKTtcbiAgICAgICAgICAgICB2YXIgJGJvZHkgPSAkKGRvY3VtZW50LmJvZHkpO1xuICAgICAgICAgICAgICRib2R5LmFwcGVuZChcIjxzY3JpcHQgaWQ9J2RhdGFNYXBfXCIraW5kZXhfcGFyZW50K1wiJyB0eXBlPSdhcHBsaWNhdGlvbi9qc29uJz5cIiArIEpTT04uc3RyaW5naWZ5KGRhdGFNYXApICsgXCI8L3NjcmlwdD5cIik7XG5cbiAgICAgICAgICAgICAvLyB1cGRhdGUgbWFya2Vyc1xuICAgICAgICAgICAgIG1hcmtlcnMuZWFjaExheWVyKGxheWVyID0+IHtcbiAgICAgICAgICAgICAgICAgaWYgKGxheWVyLmZlYXR1cmUucHJvcGVydGllcy51cmkgPT0gcmVzLnBvaW50LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICBpZiAoaGFzX2xhYmVsID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbZmlsdGVyX3RpdGxlICsgXCIjbGFiZWxcIl0gPSByZXMuZmlsdGVyTGFiZWwudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tmaWx0ZXJfdGl0bGUgKyBcIiNsYWJlbFwiXSA9IHJlcy5maWx0ZXIudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICBsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbZmlsdGVyX3RpdGxlICsgXCIjdmFsdWVcIl0gPSByZXMuZmlsdGVyLnZhbHVlO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgLy8gZ2V0IG1hcmtlcnMgZnJvbSBnZW9KU09OLCBiaW5kIHBvcHVwQ29udGVudFxuICAgICAgICAgICB2YXIgZGF0YV9sYXllcnMgPSBMLmdlb0pTT04oZGF0YU1hcCwgeyBvbkVhY2hGZWF0dXJlOiBvbkVhY2hGZWF0dXJlICB9KTtcblxuICAgICAgICAgICAvLyBhZGQgY2hlY2tib3hlc1xuICAgICAgICAgICBsZXQgZmlsdGVyX25hbWVzID0gT2JqZWN0LmtleXMobGFiZWxzX3ZhbHVlc19jb3VudClcbiAgICAgICAgICAgc2V0Q2hlY2tib3goW10pXG4gICAgICAgICAgIGZpbHRlcl9uYW1lcy5mb3JFYWNoKChmaWx0ZXJfbmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgIHNldENoZWNrYm94KHByZXZDaGVja2JveGVzID0+IFtcbiAgICAgICAgICAgICAgIC4uLnByZXZDaGVja2JveGVzLCB7IGtleV9jaGVjazogZmlsdGVyX25hbWUsIHZhbHVlX2NoZWNrOiBsYWJlbHNfdmFsdWVzX2NvdW50W2ZpbHRlcl9uYW1lXX1cbiAgICAgICAgICAgICBdKVxuICAgICAgICAgICB9KTtcblxuICAgICAgICAgICBzZXRDb2xsYXBzZSgnY29sbGFwc2VkJyk7XG4gICAgICAgICAgICQoXCIjZmlsdGVyX1wiK2V4dHJhX2lkKS5jb2xsYXBzZSgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7IGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTsgYWxlcnQoXCJTaWRlYmFyIGZpbHRlcnM6IHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBxdWVyeVwiKTsgfSlcbiAgICAgICAgLmZpbmFsbHkoICgpID0+IHsgc2V0TG9hZCgnbG9hZGVkJyk7IH0pO1xuXG4gICAgICB9IGVsc2VcbiAgICAgIHtmZXRjaChkYXRhc3RvcnlfZGF0YS5zcGFycWxfZW5kcG9pbnQrJz9xdWVyeT0nK2VuY29kZWRfcXVlcnksXG4gICAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9zcGFycWwtcmVzdWx0cytqc29uJyB9XG4gICAgICAgICAgfVxuICAgICAgKS50aGVuKChyZXMpID0+IHJlcy5qc29uKCkpXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgbGV0IGxhYmVsc192YWx1ZXNfY291bnQgPSB7fSwgaGVhZGluZ3MgPSBkYXRhLmhlYWQudmFycyxcbiAgICAgICAgICAgICAgaGFzX2xhYmVsID0gZmFsc2U7XG5cbiAgICAgICAgIGRhdGEucmVzdWx0cy5iaW5kaW5ncy5mb3JFYWNoKChyZXMsIGkpID0+IHtcbiAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGZpbHRlciBpcyBhIHN0cmluZyBvciBhIHVyaStzdHJpbmdcbiAgICAgICAgICAgaWYgKGhlYWRpbmdzLmluY2x1ZGVzKCdmaWx0ZXJMYWJlbCcpKSB7IGhhc19sYWJlbCA9IHRydWU7IH1cblxuICAgICAgICAgICBkYXRhTWFwLmZvckVhY2goKGVsZW0sIGkpID0+IHtcbiAgICAgICAgICAgICBpZiAoZWxlbS5wcm9wZXJ0aWVzLnVyaSA9PSByZXMucG9pbnQudmFsdWUpIHtcbiAgICAgICAgICAgICAgIGlmIChoYXNfbGFiZWwgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICBlbGVtLnByb3BlcnRpZXNbZmlsdGVyX3RpdGxlICsgXCIjbGFiZWxcIl0gPSByZXMuZmlsdGVyTGFiZWwudmFsdWU7XG4gICAgICAgICAgICAgICAgIGVsZW0ucHJvcGVydGllc1tmaWx0ZXJfdGl0bGUgKyBcIiN2YWx1ZVwiXSA9IHJlcy5maWx0ZXIudmFsdWU7XG4gICAgICAgICAgICAgICAgIGlmIChsYWJlbHNfdmFsdWVzX2NvdW50W3Jlcy5maWx0ZXIudmFsdWVdID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgbGFiZWxzX3ZhbHVlc19jb3VudFtyZXMuZmlsdGVyLnZhbHVlXSA9IFtyZXMuZmlsdGVyTGFiZWwudmFsdWUsIDFdXG4gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICBsYWJlbHNfdmFsdWVzX2NvdW50W3Jlcy5maWx0ZXIudmFsdWVdID0gW3Jlcy5maWx0ZXJMYWJlbC52YWx1ZSwgbGFiZWxzX3ZhbHVlc19jb3VudFtyZXMuZmlsdGVyLnZhbHVlXVsxXSArIDFdXG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICBlbGVtLnByb3BlcnRpZXNbZmlsdGVyX3RpdGxlICsgXCIjbGFiZWxcIl0gPSByZXMuZmlsdGVyLnZhbHVlO1xuICAgICAgICAgICAgICAgICBlbGVtLnByb3BlcnRpZXNbZmlsdGVyX3RpdGxlICsgXCIjdmFsdWVcIl0gPSByZXMuZmlsdGVyLnZhbHVlO1xuICAgICAgICAgICAgICAgICBpZiAobGFiZWxzX3ZhbHVlc19jb3VudFtyZXMuZmlsdGVyLnZhbHVlXSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgIGxhYmVsc192YWx1ZXNfY291bnRbcmVzLmZpbHRlci52YWx1ZV0gPSBbcmVzLmZpbHRlci52YWx1ZSwgMV1cbiAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgIGxhYmVsc192YWx1ZXNfY291bnRbcmVzLmZpbHRlci52YWx1ZV0gPSBbcmVzLmZpbHRlci52YWx1ZSwgbGFiZWxzX3ZhbHVlc19jb3VudFtyZXMuZmlsdGVyLnZhbHVlXVsxXSArIDFdXG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB9XG4gICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgIC8vIHVwZGF0ZSBnZW9KU09OIGluIERPTVxuICAgICAgICAgICAkKCcjZGF0YU1hcF8nK2luZGV4X3BhcmVudCkucmVtb3ZlKCk7XG4gICAgICAgICAgIHZhciAkYm9keSA9ICQoZG9jdW1lbnQuYm9keSk7XG4gICAgICAgICAgICRib2R5LmFwcGVuZChcIjxzY3JpcHQgaWQ9J2RhdGFNYXBfXCIraW5kZXhfcGFyZW50K1wiJyB0eXBlPSdhcHBsaWNhdGlvbi9qc29uJz5cIiArIEpTT04uc3RyaW5naWZ5KGRhdGFNYXApICsgXCI8L3NjcmlwdD5cIik7XG5cbiAgICAgICAgICAgLy8gdXBkYXRlIG1hcmtlcnNcbiAgICAgICAgICAgbWFya2Vycy5lYWNoTGF5ZXIobGF5ZXIgPT4ge1xuICAgICAgICAgICAgICAgaWYgKGxheWVyLmZlYXR1cmUucHJvcGVydGllcy51cmkgPT0gcmVzLnBvaW50LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgaWYgKGhhc19sYWJlbCA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgIGxheWVyLmZlYXR1cmUucHJvcGVydGllc1tmaWx0ZXJfdGl0bGUgKyBcIiNsYWJlbFwiXSA9IHJlcy5maWx0ZXJMYWJlbC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICBsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbZmlsdGVyX3RpdGxlICsgXCIjbGFiZWxcIl0gPSByZXMuZmlsdGVyLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICBsYXllci5mZWF0dXJlLnByb3BlcnRpZXNbZmlsdGVyX3RpdGxlICsgXCIjdmFsdWVcIl0gPSByZXMuZmlsdGVyLnZhbHVlO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICB9KTtcblxuICAgICAgICAgfSk7XG5cbiAgICAgICAgIC8vIGdldCBtYXJrZXJzIGZyb20gZ2VvSlNPTiwgYmluZCBwb3B1cENvbnRlbnRcbiAgICAgICAgIHZhciBkYXRhX2xheWVycyA9IEwuZ2VvSlNPTihkYXRhTWFwLCB7IG9uRWFjaEZlYXR1cmU6IG9uRWFjaEZlYXR1cmUgIH0pO1xuXG4gICAgICAgICAvLyBhZGQgY2hlY2tib3hlc1xuICAgICAgICAgbGV0IGZpbHRlcl9uYW1lcyA9IE9iamVjdC5rZXlzKGxhYmVsc192YWx1ZXNfY291bnQpXG4gICAgICAgICBzZXRDaGVja2JveChbXSlcbiAgICAgICAgIGZpbHRlcl9uYW1lcy5mb3JFYWNoKChmaWx0ZXJfbmFtZSwgaSkgPT4ge1xuICAgICAgICAgICBzZXRDaGVja2JveChwcmV2Q2hlY2tib3hlcyA9PiBbXG4gICAgICAgICAgICAgLi4ucHJldkNoZWNrYm94ZXMsIHsga2V5X2NoZWNrOiBmaWx0ZXJfbmFtZSwgdmFsdWVfY2hlY2s6IGxhYmVsc192YWx1ZXNfY291bnRbZmlsdGVyX25hbWVdfVxuICAgICAgICAgICBdKVxuICAgICAgICAgfSk7XG5cbiAgICAgICAgIHNldENvbGxhcHNlKCdjb2xsYXBzZWQnKTtcbiAgICAgICAgICQoXCIjZmlsdGVyX1wiK2V4dHJhX2lkKS5jb2xsYXBzZSgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHsgY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpOyBhbGVydChcIlNpZGViYXIgZmlsdGVyczogdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHF1ZXJ5XCIpOyB9KVxuICAgICAgLmZpbmFsbHkoICgpID0+IHsgc2V0TG9hZCgnbG9hZGVkJyk7IH0pO31cbiAgICB9XG5cbiAgfVxuXG4gIGlmIChjaGVja2JveERhdGEubGVuZ3RoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGVja2JveERhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoZWNrYm94Qm94LnB1c2goPEZpbHRlckNoZWNrYm94XG4gICAgICAgIGtleT17Z2VuZXJhdGVLZXkoY2hlY2tib3hEYXRhW2ldLmtleV9jaGVjayl9XG4gICAgICAgIGtleV9jaGVjaz17Y2hlY2tib3hEYXRhW2ldLmtleV9jaGVja30gdmFsdWVfY2hlY2s9e2NoZWNrYm94RGF0YVtpXS52YWx1ZV9jaGVja31cbiAgICAgICAgaW5kZXhQYW5lbD17aW5kZXhQYW5lbH0gZmlsdGVyX3RpdGxlPXtmaWx0ZXJfdGl0bGV9IG1hcmtlcnM9e21hcmtlcnN9XG4gICAgICAgIGFsbE1hcmtlcnM9e2FsbE1hcmtlcnN9IG1hcD17bWFwfVxuICAgICAgICAvPik7XG4gICAgfVxuICB9XG5cblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vdXBkYXRlX3BhbmVsKCk7XG4gICAgaWYgKGZpcnN0TG9hZCA9PSAnbG9hZGVkJykgeyBnZXRDaGVja2JveGVzKCk7IH1cbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtYXBfc2lkZWJhcl9wYW5lbFwiPlxuICAgICAgPGEgcm9sZT1cImJ1dHRvblwiXG4gICAgICBjbGFzc05hbWU9XCJtYXBfc2lkZWJhcl9wYW5lbF90aXRsZVwiXG4gICAgICBkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCJcbiAgICAgIG9uQ2xpY2s9e2dldENoZWNrYm94ZXN9XG4gICAgICBocmVmPXtcIiNmaWx0ZXJfXCIrZXh0cmFfaWR9XG4gICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBhcmlhLWNvbnRyb2xzPXtcImZpbHRlcl9cIitleHRyYV9pZH0+XG4gICAgICB7ZmlsdGVyX3RpdGxlfVxuICAgIDwvYT5cbiAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbGxhcHNlXCIgaWQ9e1wiZmlsdGVyX1wiK2V4dHJhX2lkfT5cbiAgICAgIDxkaXY+XG4gICAgICAgIHtjaGVja2JveEJveH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG5cbmNvbnN0IE1hcFNpZGViYXIgPSAoe2luZGV4LCBmaWx0ZXJzICwgb25FYWNoRmVhdHVyZSwgYWxsTWFya2VycyAsIG1hcmtlcnMsIG1hcCwgc2V0SXNTaG93biwgaXNTaG93bn0pID0+IHtcbiAgY29uc3Qgc2lkZWJhclBhbmVsc0JveCA9IFtdXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgfSwgW10pO1xuXG4gIGZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyLCBpKSA9PiB7XG4gICAgc2lkZWJhclBhbmVsc0JveC5wdXNoKFxuICAgICAgPFNpZGViYXJQYW5lbFxuICAgICAgICAgIGluZGV4UGFuZWw9e2l9IGtleT17Z2VuZXJhdGVLZXkoZmlsdGVyKStpfVxuICAgICAgICAgIGluZGV4X3BhcmVudD17aW5kZXh9IG9uRWFjaEZlYXR1cmU9e29uRWFjaEZlYXR1cmV9XG4gICAgICAgICAgZmlsdGVycz17ZmlsdGVyc30gZmlsdGVyX3RpdGxlPXtmaWx0ZXJzW2ldLm1hcF9maWx0ZXJfdGl0bGV9XG4gICAgICAgICAgbWFya2Vycz17bWFya2Vyc30gYWxsTWFya2Vycz17YWxsTWFya2Vyc30gbWFwPXttYXB9Lz5cbiAgICApXG4gIH0pO1xuXG4gIGlmIChmaWx0ZXJzLmxlbmd0aCkge1xuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e2JhY2tncm91bmQ6J2xpbmVhci1ncmFkaWVudCgtNDVkZWcsJyArIGRhdGFzdG9yeV9kYXRhLmNvbG9yX2NvZGVbMF0gKyAnLCcgKyBkYXRhc3RvcnlfZGF0YS5jb2xvcl9jb2RlWzFdICsgJyknfX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJtYXBfc2lkZWJhclwiPlxuICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJtYXBfc2lkZWJhcl90aXRsZVwiPkZJTFRFUlM8L2gzPlxuICAgICAgICAgIHtzaWRlYmFyUGFuZWxzQm94fVxuICAgICAgICA8L2Rpdj5cblxuICAgIClcbiAgfVxuXG5cblxufVxuXG5jb25zdCBGaWx0ZXJNYXAgPSAoeyBpbmRleEZpbHRlciwgaW5kZXhfcGFyZW50ICxcbiAgICAgICAgICAgICAgICAgICAgICBzZXRGaWx0ZXJDaGFuZ2UsIGZpbHRlcnMsIHJlbW92ZUZpbHRlckJveCB9KSA9PiB7XG5cbiAgbGV0IGRlZmF1bHRGaWx0ZXJRdWVyeSA9IGZpbHRlcnNbaW5kZXhGaWx0ZXJdLm1hcF9maWx0ZXJfcXVlcnksXG4gICAgICBkZWZhdWx0RmlsdGVyVGl0bGUgPSBmaWx0ZXJzW2luZGV4RmlsdGVyXS5tYXBfZmlsdGVyX3RpdGxlO1xuXG4gIGNvbnN0IFtmaWx0ZXJRdWVyeSwgc2V0RmlsdGVyUXVlcnldID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdEZpbHRlclF1ZXJ5KTtcbiAgY29uc3QgZmlsdGVyUXVlcnlDaGFuZ2UgPSBldmVudCA9PiB7XG4gICAgbGV0IG5ld0FyclEgPSBbLi4uZmlsdGVyc107XG4gICAgbmV3QXJyUVtpbmRleEZpbHRlcl0ubWFwX2ZpbHRlcl9xdWVyeSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfTtcblxuICBjb25zdCBbZmlsdGVyVGl0bGUsIHNldEZpbHRlclRpdGxlXSA9IFJlYWN0LnVzZVN0YXRlKGRlZmF1bHRGaWx0ZXJUaXRsZSk7XG4gIGNvbnN0IGZpbHRlclRpdGxlQ2hhbmdlID0gZXZlbnQgPT4ge1xuICAgIGxldCBuZXdBcnJRID0gWy4uLmZpbHRlcnNdO1xuICAgIG5ld0FyclFbaW5kZXhGaWx0ZXJdLm1hcF9maWx0ZXJfdGl0bGUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gIH07XG5cbiAgbGV0IGZpbHRlcl9pZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicXVlcnktZGl2XCIgaWQ9e1wiZWxfXCIraW5kZXhGaWx0ZXIrXCJfX2Zvcm1fZ3JvdXBcIn0+XG4gICAgICA8aHIvPlxuICAgICAgPGg0IGNsYXNzTmFtZT0nYmxvY2tfdGl0bGUnPkFkZCBhIGZpbHRlcjwvaDQ+XG4gICAgICA8YVxuICAgICAgICBvbkNsaWNrPXsoKSA9PiByZW1vdmVGaWx0ZXJCb3goaW5kZXhGaWx0ZXIpfVxuICAgICAgICBjbGFzc05hbWU9XCJ0cmFzaCB0cmFzaF9zdWJjb21wb25lbnRcIj5cbiAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmFyIGZhLXRyYXNoLWFsdFwiPjwvaT5cbiAgICAgIDwvYT48YnIvPlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0nZm9ybS1ncm91cCcgaWQ9e2luZGV4RmlsdGVyK1wiX19mb3JtX2dyb3VwX2ZpbHRlclwifT5cbiAgICAgICAgPGxhYmVsIGh0bWxGb3I9J2xhcmdlSW5wdXQnPlNQQVJRTCBxdWVyeTwvbGFiZWw+XG4gICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgb25DaGFuZ2U9e2ZpbHRlclF1ZXJ5Q2hhbmdlfVxuICAgICAgICAgICAgaWQ9e2luZGV4X3BhcmVudCtcIl9fbWFwX2ZpbHRlcl9xdWVyeV9cIitmaWx0ZXJfaWQrXCJfXCIraW5kZXhGaWx0ZXJ9XG4gICAgICAgICAgICBuYW1lPXtpbmRleF9wYXJlbnQrXCJfX21hcF9maWx0ZXJfcXVlcnlfXCIrZmlsdGVyX2lkK1wiX1wiK2luZGV4RmlsdGVyfVxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlPXtmaWx0ZXJRdWVyeX1cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPSdBIFNQQVJRTCBxdWVyeSB0aGF0IHJldHVybnMgdHdvIHZhcmlhYmxlcycgcmVxdWlyZWQ+XG4gICAgICAgIDwvdGV4dGFyZWE+XG4gICAgICAgIDxsYWJlbCBodG1sRm9yPSdsYXJnZUlucHV0Jz5GaWx0ZXIgdGl0bGU8L2xhYmVsPlxuXG4gICAgXHRcdDxpbnB1dFxuICAgICAgICAgICAgb25DaGFuZ2U9e2ZpbHRlclRpdGxlQ2hhbmdlfVxuICAgICAgICAgICAgdHlwZT0ndGV4dCdcbiAgICAgICAgICAgIGlkPXtpbmRleF9wYXJlbnQrXCJfX21hcF9maWx0ZXJfdGl0bGVfXCIrZmlsdGVyX2lkK1wiX1wiK2luZGV4RmlsdGVyfVxuICAgICAgICAgICAgbmFtZT17aW5kZXhfcGFyZW50K1wiX19tYXBfZmlsdGVyX3RpdGxlX1wiK2ZpbHRlcl9pZCtcIl9cIitpbmRleEZpbHRlcn1cbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZT17ZmlsdGVyVGl0bGV9XG4gICAgICAgICAgICBwbGFjZWhvbGRlcj0nVGhlIGxhYmVsIG9mIHRoZSBmaWx0ZXInPlxuICAgICAgICA8L2lucHV0PlxuICAgICAgICA8cD48ZW0+UmVydW4gdGhlIG1haW4gcXVlcnkgdG8gdXBkYXRlPC9lbT48L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxuXG59XG5cbmNvbnN0IE1hcmtlclNpZGViYXIgPSAoe21hcmtlclNpZGViYXIsIHNldE1hcmtlclNpZGViYXIgLFxuICBzZXRNYXJrZXJTaWRlYmFyQ29udGVudCwgbWFya2VyU2lkZWJhckNvbnRlbnR9KSA9PiB7XG5cbiAgZnVuY3Rpb24gbWFrZV91cmkoZWwpIHtcbiAgICBpZiAoZWwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7IHJldHVybiA8YSBocmVmPXtlbH0+VVJJIDxpIGNsYXNzTmFtZT1cImZhciBmYS1leHRlcm5hbC1saW5rXCI+PC9pPjwvYT5cbiAgICB9IGVsc2Uge3JldHVybiBlbH1cbiAgfVxuXG4gIGNvbnN0IGNsb3NlTWFya2VyU2lkZWJhciA9IChlKSA9PiB7XG4gICAgc2V0TWFya2VyU2lkZWJhcignY2xvc2UnKTtcbiAgfVxuXG5cbiAgaWYgKG1hcmtlclNpZGViYXIgPT0gJ29wZW4nKSB7XG5cbiAgICBjb25zb2xlLmxvZyhtYXJrZXJTaWRlYmFyQ29udGVudCk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWFwX3NpZGViYXIgbWFwX3NpZGViYXJfcmlnaHRcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gY2xvc2VNYXJrZXJTaWRlYmFyKCl9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJjbG9zZUJveFwiPlxuICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmFzIGZhLXRpbWVzXCI+PC9pPlxuICAgICAgICAgIDwvYT48YnIvPjxici8+XG5cbiAgICAgICAgICAgIHtPYmplY3Qua2V5cyhtYXJrZXJTaWRlYmFyQ29udGVudClcbiAgICAgICAgICAgIC5tYXAoKGRldGFpbCwgaWQpID0+XG4gICAgICAgICAgICAgIDxwIGtleT17aWR9PlxuICAgICAgICAgICAgICAgIDxzdHJvbmc+e2RldGFpbH0gPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAge21ha2VfdXJpKG1hcmtlclNpZGViYXJDb250ZW50W2RldGFpbF0pfVxuICAgICAgICAgICAgICA8L3A+KX1cblxuXG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG59XG5cbmNvbnN0IE1hcFZpeiA9ICh7IHVuaXF1ZV9rZXksIGluZGV4ICxcbiAgICAgICAgICAgICAgICByZW1vdmVDb21wb25lbnQgLCBjb21wb25lbnRMaXN0LCBzZXRDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgc29ydENvbXBvbmVudFVwICwgc29ydENvbXBvbmVudERvd259KSA9PiB7XG5cblxuICBsZXQgbWFwID0gbnVsbCwgbWFwX3RpdGxlID0gJycsIG1hcF9wb2ludHNfcXVlcnkgPSAnJyxcbiAgICAgIHdhaXRmaWx0ZXJzICxcbiAgICAgIG1hcmtlcnMsIGFsbE1hcmtlcnMgLCBtYXBfZmlsdGVycyA9IFtdLFxuICAgICAgbWFwaWQgPSBpbmRleCArIFwiX19tYXBfcHJldmlld19jb250YWluZXJcIixcbiAgICAgIGNoZWNrZWRfZmlsdGVycyA9IFtdO1xuXG4gIC8vIFdZU0lXWUc6IGdldCBjb250ZW50IGlmIGFueVxuICBpZiAoZGF0YXN0b3J5X2RhdGEuZHluYW1pY19lbGVtZW50cyAmJiBkYXRhc3RvcnlfZGF0YS5keW5hbWljX2VsZW1lbnRzLmxlbmd0aCkge1xuICAgIGRhdGFzdG9yeV9kYXRhLmR5bmFtaWNfZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT0gJ21hcCcgJiYgZWxlbWVudC5wb3NpdGlvbiA9PSBpbmRleCkge1xuICAgICAgICBtYXBfcG9pbnRzX3F1ZXJ5ID0gZWxlbWVudC5tYXBfcG9pbnRzX3F1ZXJ5O1xuICAgICAgICBtYXBfdGl0bGUgPSBlbGVtZW50Lm1hcF90aXRsZTtcbiAgICAgICAgLy8gZmlsdGVyc1xuICAgICAgICBpZiAoZWxlbWVudC5tYXBfZmlsdGVycyAmJiBlbGVtZW50Lm1hcF9maWx0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgIGVsZW1lbnQubWFwX2ZpbHRlcnMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIG1hcF9maWx0ZXJzLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgfSkgO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IFttYXJrZXJzTWFwLCBzZXRNYXJrZXJzXSA9IFJlYWN0LnVzZVN0YXRlKG1hcmtlcnMpO1xuICBjb25zdCBbYWxsTWFya2Vyc01hcCwgc2V0QWxsTWFya2Vyc10gPSBSZWFjdC51c2VTdGF0ZShhbGxNYXJrZXJzKTtcblxuICBjb25zdCBbcXVlcnksIHNldFF1ZXJ5XSA9IFJlYWN0LnVzZVN0YXRlKG1hcF9wb2ludHNfcXVlcnkpO1xuICBjb25zdCBxdWVyeUNoYW5nZSA9IGV2ZW50ID0+IHsgc2V0UXVlcnkoZXZlbnQudGFyZ2V0LnZhbHVlKTsgfTtcblxuICBjb25zdCBbdGl0bGUsIHNldFRpdGxlXSA9IFJlYWN0LnVzZVN0YXRlKG1hcF90aXRsZSk7XG4gIGNvbnN0IHRpdGxlQ2hhbmdlID0gZXZlbnQgPT4geyBzZXRUaXRsZShldmVudC50YXJnZXQudmFsdWUpOyB9O1xuXG4gIGNvbnN0IFttYXBJbnN0YW5jZSwgc2V0TWFwXSA9IFJlYWN0LnVzZVN0YXRlKCdub3QgaW5pdGlhbGlzZWQnKTtcbiAgY29uc3QgW21hcFJlbmRlcmVkLCBzZXRNYXBSZW5kZXJdID0gUmVhY3QudXNlU3RhdGUoJycpO1xuICBjb25zdCBbbWFwUmVsb2FkLCBzZXRNYXBSZWxvYWRdID0gUmVhY3QudXNlU3RhdGUoMSk7XG4gIGNvbnN0IFtpc1Nob3duLCBzZXRJc1Nob3duXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2ZpbHRlcnMsIHNldEZpbHRlcl0gPSBSZWFjdC51c2VTdGF0ZShtYXBfZmlsdGVycyk7XG4gIGNvbnN0IFtzcGlubmVyLCBzZXRTcGlubmVyXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCBpbml0TWFwID0gZXZlbnQgPT4ge1xuICAgIC8vIGNyYXppbmVzcyBvZiBtYXAgYWxyZWFkeSBpbml0aWFsaXNlZFxuXG4gICAgaWYgKG1hcEluc3RhbmNlICE9ICdpbml0aWFsaXNlZCcgJiYgKG1hcCA9PSB1bmRlZmluZWQgfHwgbWFwID09IG51bGwgKSkge1xuICAgICAgaWYgKG1hcFJlbmRlcmVkLmxlbmd0aCkge21hcCA9IG1hcFJlbmRlcmVkfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtYXAgPSBMLm1hcChtYXBpZCkuc2V0VmlldyhbNTEuNTA1LCAtMC4wOV0sIDMpO1xuICAgICAgICAgIEwudGlsZUxheWVyKCdodHRwczovL3RpbGVzLnN0YWRpYW1hcHMuY29tL3RpbGVzL2FsaWRhZGVfc21vb3RoX2Rhcmsve3p9L3t4fS97eX17cn0ucG5nP2FwaV9rZXk9NTMwM2RkY2EtNTkzNC00NWZjLWJkZjEtNDBmYWM3OTY2ZmE3Jywge1xuICAgICAgICAgIG1heFpvb206IDE5LCBhdHRyaWJ1dGlvbjogJ8KpIE9wZW5TdHJlZXRNYXAnXG4gICAgICAgICAgfSkuYWRkVG8obWFwKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgIHZhciBjb250YWluZXIgPSBMLkRvbVV0aWwuZ2V0KG1hcGlkKTtcbiAgICAgICAgICBpZihjb250YWluZXIgIT0gbnVsbCl7IGNvbnRhaW5lci5fbGVhZmxldF9pZCA9IG51bGw7IH1cbiAgICAgICAgICBtYXAgPSBMLm1hcChtYXBpZCkuc2V0VmlldyhbNTEuNTA1LCAtMC4wOV0sIDMpO1xuICAgICAgICAgIEwudGlsZUxheWVyKCdodHRwczovL3RpbGVzLnN0YWRpYW1hcHMuY29tL3RpbGVzL2FsaWRhZGVfc21vb3RoX2Rhcmsve3p9L3t4fS97eX17cn0ucG5nP2FwaV9rZXk9NTMwM2RkY2EtNTkzNC00NWZjLWJkZjEtNDBmYWM3OTY2ZmE3Jywge1xuICAgICAgICAgIG1heFpvb206IDE5LCBhdHRyaWJ1dGlvbjogJ8KpIE9wZW5TdHJlZXRNYXAnXG4gICAgICAgICAgfSkuYWRkVG8obWFwKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChtYXBJbnN0YW5jZSA9PSAnaW5pdGlhbGlzZWQnKShtYXAgPSBtYXBSZW5kZXJlZClcblxuICAgIGlmIChxdWVyeS5sZW5ndGggPiAxKSB7XG4gICAgICBzZXRTcGlubmVyKHRydWUpXG4gICAgICAgIC8vaWYgKG1hcCAmJiBtYXAucmVtb3ZlKSB7IG1hcC5vZmYoKTsgbWFwLnJlbW92ZSgpOyB9XG4gICAgICAgIHZhciBtZXRob2QgPSAnR0VUJztcbiAgICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+IDIwMDApIHtcbiAgICAgICAgICBtZXRob2QgPSAnUE9TVCdcbiAgICAgICAgICBmZXRjaChkYXRhc3RvcnlfZGF0YS5zcGFycWxfZW5kcG9pbnQrJz9xdWVyeT0nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdBY2NlcHQnOiAnYXBwbGljYXRpb24vc3BhcnFsLXJlc3VsdHMranNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IGVuY29kZVVSSUNvbXBvbmVudChxdWVyeSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApLnRoZW4oKHJlcykgPT4geyByZXR1cm4gcmVzLmpzb24oKX0pXG4gICAgICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgIC8vIGFkZCBtYXJrZXJzXG4gICAgICAgICAgICB2YXIgZ2VvSlNPTmRhdGEgPSBjcmVhdGVnZW9KU09OKGRhdGEpO1xuICAgICAgICAgICAgbWFya2VycyA9IHNldFZpZXdNYXJrZXJzKG1hcCwgbWFwaWQsIGdlb0pTT05kYXRhLCB3YWl0ZmlsdGVycywgZGF0YXN0b3J5X2RhdGEuY29sb3JfY29kZVswXSk7XG4gICAgICAgICAgICBhbGxNYXJrZXJzID0gc2V0Vmlld01hcmtlcnMobWFwLCBtYXBpZCwgZ2VvSlNPTmRhdGEsIHdhaXRmaWx0ZXJzLCBkYXRhc3RvcnlfZGF0YS5jb2xvcl9jb2RlWzBdKTtcbiAgICAgICAgIH0pXG4gICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7IHNldFNwaW5uZXIoZmFsc2UpOyBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvcik7IGFsZXJ0KFwiTWFwOiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgcXVlcnlcIik7IH0pXG4gICAgICAgICAuZmluYWxseSggKCkgPT4ge1xuICAgICAgICAgICBzZXRTcGlubmVyKGZhbHNlKVxuICAgICAgICAgICBzZXRNYXAoJ2luaXRpYWxpc2VkJyk7XG4gICAgICAgICAgIHNldE1hcFJlbmRlcihtYXApO1xuICAgICAgICAgICBzZXRNYXJrZXJzKG1hcmtlcnMpO1xuICAgICAgICAgICBzZXRBbGxNYXJrZXJzKGFsbE1hcmtlcnMpO1xuICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtmZXRjaChkYXRhc3RvcnlfZGF0YS5zcGFycWxfZW5kcG9pbnQrJz9xdWVyeT0nK2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSksXG4gICAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9zcGFycWwtcmVzdWx0cytqc29uJyB9XG4gICAgICAgICAgfVxuICAgICAgICApLnRoZW4oKHJlcykgPT4geyByZXR1cm4gcmVzLmpzb24oKX0pXG4gICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgLy8gYWRkIG1hcmtlcnNcbiAgICAgICAgICB2YXIgZ2VvSlNPTmRhdGEgPSBjcmVhdGVnZW9KU09OKGRhdGEpO1xuICAgICAgICAgIG1hcmtlcnMgPSBzZXRWaWV3TWFya2VycyhtYXAsIG1hcGlkLCBnZW9KU09OZGF0YSwgd2FpdGZpbHRlcnMsIGRhdGFzdG9yeV9kYXRhLmNvbG9yX2NvZGVbMF0pO1xuICAgICAgICAgIGFsbE1hcmtlcnMgPSBzZXRWaWV3TWFya2VycyhtYXAsIG1hcGlkLCBnZW9KU09OZGF0YSwgd2FpdGZpbHRlcnMsIGRhdGFzdG9yeV9kYXRhLmNvbG9yX2NvZGVbMF0pO1xuICAgICAgIH0pXG4gICAgICAgLmNhdGNoKChlcnJvcikgPT4geyBzZXRTcGlubmVyKGZhbHNlKTsgY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpOyBhbGVydChcIk1hcDogdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHF1ZXJ5XCIpOyB9KVxuICAgICAgIC5maW5hbGx5KCAoKSA9PiB7XG4gICAgICAgICBzZXRTcGlubmVyKGZhbHNlKVxuICAgICAgICAgc2V0TWFwKCdpbml0aWFsaXNlZCcpO1xuICAgICAgICAgc2V0TWFwUmVuZGVyKG1hcCk7XG4gICAgICAgICBzZXRNYXJrZXJzKG1hcmtlcnMpO1xuICAgICAgICAgc2V0QWxsTWFya2VycyhhbGxNYXJrZXJzKTtcbiAgICAgICB9KTt9XG4gICAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcblxuICBmdW5jdGlvbiBzZXRWaWV3TWFya2VycyhtYXAsIG1hcGlkLCBnZW9KU09OZGF0YSwgd2FpdGZpbHRlcnMsIGNvbG9yX2NvZGUpIHtcbiAgICAgIC8vIHJlbW92ZSBtYXJrZXJzIGlmIGFueSBmcm9tIGEgbWFwIGFscmVhZHkgaW5pdGlhbGlzZWRcbiAgICAgIG1hcC5lYWNoTGF5ZXIoZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICAgICAgaWYgKGxheWVyIGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyR3JvdXApIHtcbiAgICAgICAgICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVyKVxuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gcmVtb3ZlIGdlb0pTT05cbiAgICAgICQoJyNkYXRhTWFwXycraW5kZXgpLnJlbW92ZSgpO1xuXG4gICAgICAvLyBzdHlsZSBjbHVzdGVyc1xuICAgICAgdmFyIGlubmVyQ2x1c3RlclN0eWxlID0gXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGJhY2tncm91bmQ6XCIgKyBjb2xvcl9jb2RlICsgXCI7XFxcbiAgXHRcdHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHggIWltcG9ydGFudDsgYm9yZGVyLXJhZGl1czogNTAlICFpbXBvcnRhbnQ7IHBhZGRpbmctdG9wOiAxMHB4OyBvcGFjaXR5OiAwLjg7XCJcblxuICAgICAgdmFyIG1hcmtlcnMgPSBMLm1hcmtlckNsdXN0ZXJHcm91cCh7XG4gICAgICAgICAgaWNvbkNyZWF0ZUZ1bmN0aW9uOiBmdW5jdGlvbiAoY2x1c3Rlcikge1xuICAgICAgICAgICAgICB2YXIgbWFya2VycyA9IGNsdXN0ZXIuZ2V0QWxsQ2hpbGRNYXJrZXJzKCk7XG4gICAgICAgICAgICAgIHZhciBuID0gMDtcbiAgICAgICAgICAgICAgbWFya2Vycy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7IG4gKz0gMX0pO1xuICAgICAgICAgICAgICByZXR1cm4gTC5kaXZJY29uKHsgaHRtbDogXCI8c3BhbiBzdHlsZT0nXCIgKyBpbm5lckNsdXN0ZXJTdHlsZSArIFwiJz5cIiArIG4gKyBcIjwvc3Bhbj5cIiwgY2xhc3NOYW1lOiAnbXljbHVzdGVyIHBvaW50ZXItY29sb3InLCBpY29uU2l6ZTogTC5wb2ludCg0MCwgNDApIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2luZ2xlTWFya2VyTW9kZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGdldCBtYXJrZXJzIGZyb20gZ2VvSlNPTiwgYmluZCBwb3B1cENvbnRlbnRcbiAgICAgIHZhciBkYXRhX2xheWVycyA9IEwuZ2VvSlNPTihnZW9KU09OZGF0YSwge1xuICAgICAgICAgIG9uRWFjaEZlYXR1cmU6IG9uRWFjaEZlYXR1cmVcbiAgICAgIH0pO1xuXG4gICAgICAvLyBhZGQgbWFya2VycyB0byBjbHVzdGVyc1xuICAgICAgbWFya2Vycy5hZGRMYXllcihkYXRhX2xheWVycyk7XG5cbiAgICAgIC8vIHNob3cgY2x1c3RlcnNcbiAgICAgIG1hcC5hZGRMYXllcihtYXJrZXJzKTtcblxuICAgICAgLy8gYWRkIGdlb0pTT05kYXRhIHRvIERPTVxuICAgICAgdmFyICRib2R5ID0gJChkb2N1bWVudC5ib2R5KTtcbiAgICAgICRib2R5LmFwcGVuZChcIjxzY3JpcHQgaWQ9J2RhdGFNYXBfXCIraW5kZXgrXCInIHR5cGU9J2FwcGxpY2F0aW9uL2pzb24nPlwiICsgSlNPTi5zdHJpbmdpZnkoZ2VvSlNPTmRhdGEpICsgXCI8L3NjcmlwdD5cIik7XG5cbiAgICAgIHJldHVybiBtYXJrZXJzO1xuICB9O1xuXG4gIGNvbnN0IFttYXJrZXJTaWRlYmFyLCBzZXRNYXJrZXJTaWRlYmFyXSA9IFJlYWN0LnVzZVN0YXRlKCdjbG9zZScpXG4gIGNvbnN0IFttYXJrZXJTaWRlYmFyQ29udGVudCwgc2V0TWFya2VyU2lkZWJhckNvbnRlbnRdID0gUmVhY3QudXNlU3RhdGUoJycpXG4gIGZ1bmN0aW9uIG9wZW5NYXJrZXJTaWRlYmFyKHNlbGVjdGlvbiwgZmVhdHVyZSkge1xuICAgIC8vIHNpZGViYXIudG9nZ2xlKCk7XG4gICAgaWYgKG1hcmtlclNpZGViYXIgPT0gJ2Nsb3NlJykge1xuICAgICAgc2V0TWFya2VyU2lkZWJhcignb3BlbicpO1xuICAgICAgc2V0TWFya2VyU2lkZWJhckNvbnRlbnQoZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwQ29udGVudCk7XG4gICAgfSBlbHNlIHsgc2V0TWFya2VyU2lkZWJhcignY2xvc2UnKTsgc2V0TWFya2VyU2lkZWJhckNvbnRlbnQoJycpfVxuICAgIC8vIHNpZGViYXIuaHRtbCgnPGgxPiB0aGlzIGlzICcgKyBzZWxlY3Rpb24uZmVhdHVyZS5wb3B1cENvbnRlbnQgKyAnPC9oMT4nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRWFjaEZlYXR1cmUoZmVhdHVyZSwgbGF5ZXIpIHtcbiAgICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwQ29udGVudCkge1xuICAgICAgICAgIC8vbGF5ZXIuYmluZFBvcHVwKGZlYXR1cmUucHJvcGVydGllcy5wb3B1cENvbnRlbnQpO1xuICAgICAgICAgIGxheWVyLm9uKHtcbiAgICAgICAgICAgICAgLy9tb3VzZW92ZXI6IGhpZ2hsaWdodEZlYXR1cmUsXG4gICAgICAgICAgICAgIC8vbW91c2VvdXQ6IHJlc2V0SGlnaGxpZ2h0LFxuICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSl7b3Blbk1hcmtlclNpZGViYXIoZSwgZmVhdHVyZSkgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZWdlb0pTT04ocmV0dXJuZWRKc29uKSB7XG4gICAgICB2YXIgZ2VvSlNPTmRhdGEgPSBbXTtcbiAgICAgIC8vIGNsZWFuIGhlYWRpbmdzXG4gICAgICB2YXIgaGVhZGluZ3MgPSByZXR1cm5lZEpzb24uaGVhZC52YXJzO1xuICAgICAgdmFyIHRoZXJlX2lzX3BvaW50ID0gaGVhZGluZ3MuaW5kZXhPZigncG9pbnQnKTtcbiAgICAgIGhlYWRpbmdzLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0gPT0gKCdsYXQnKSB8fCBpdGVtID09ICgnbG9uZycpIHx8IGl0ZW0gPT0gKCdwb2ludCcpKSB7XG4gICAgICAgICAgICBoZWFkaW5ncy5zcGxpY2UoaSwgMSk7IGktLTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cblxuICAgICAgLy8gY3JlYXRlIGdlb0pTT04gb2JqZWN0XG4gICAgICByZXR1cm5lZEpzb24ucmVzdWx0cy5iaW5kaW5ncy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIGxldCBwb2ludE9iaiA9IHt9O1xuICAgICAgICBwb2ludE9iai50eXBlID0gXCJGZWF0dXJlXCI7XG4gICAgICAgIHBvaW50T2JqLnByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgcG9pbnRPYmoucHJvcGVydGllcy5wb3B1cENvbnRlbnQgPSB7fTtcblxuICAgICAgICBoZWFkaW5ncy5mb3JFYWNoKChoZWFkLCBpKSA9PiB7XG4gICAgICAgICAgcG9pbnRPYmoucHJvcGVydGllcy5wb3B1cENvbnRlbnRbaGVhZF0gPSBpdGVtW2hlYWRdLnZhbHVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGVyZV9pc19wb2ludCAhPSAtMSkge1xuICAgICAgICAgICAgcG9pbnRPYmoucHJvcGVydGllcy51cmkgPSBpdGVtWydwb2ludCddLnZhbHVlO1xuICAgICAgICAgICAgcG9pbnRPYmoucHJvcGVydGllcy5wb3B1cENvbnRlbnQucG9pbnQgPSBpdGVtLnBvaW50LnZhbHVlXG5cbiAgICAgICAgfTtcbiAgICAgICAgcG9pbnRPYmouZ2VvbWV0cnkgPSB7fTtcbiAgICAgICAgcG9pbnRPYmouZ2VvbWV0cnkudHlwZSA9IFwiUG9pbnRcIjtcbiAgICAgICAgLy8gY2hlY2sgZmlyc3RcbiAgICAgICAgcG9pbnRPYmouZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBbaXRlbS5sb25nLnZhbHVlLCBpdGVtLmxhdC52YWx1ZV07XG4gICAgICAgIGdlb0pTT05kYXRhLnB1c2gocG9pbnRPYmopO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBnZW9KU09OZGF0YVxuICB9O1xuXG4gIGNvbnN0IGZpbHRlclF1ZXJpZXNCb3ggPSBbXVxuICBjb25zdCBmaWx0ZXJDaGFuZ2UgPSBldmVudCA9PiB7XG4gICAgc2V0RmlsdGVyKHByZXZFeHRyYXMgPT4gW1xuICAgICAgLi4ucHJldkV4dHJhcywge21hcF9maWx0ZXJfcXVlcnk6JycsbWFwX2ZpbHRlcl90aXRsZTonJ31cbiAgICBdKTtcbiAgfTtcblxuICBjb25zdCByZW1vdmVGaWx0ZXJCb3ggPSAoaW5kZXhGaWx0ZXIpID0+IHtcbiAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RpZnlzdG9yeV9mb3JtJyk7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSk7XG4gICAgdmFyIHVybCA9IHdpbmRvdy5sb2NhdGlvbi50b1N0cmluZygpXG4gICAgdXJsID0gdXJsLnJlcGxhY2UoL21vZGlmeVxcLy8sICdtb2RpZnlfYmtnXFwvJyk7XG4gICAgZmV0Y2godXJsLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5OiBmb3JtRGF0YX0pXG4gICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UudGV4dCgpKVxuICAgIC50aGVuKChkYXRhKSA9PiB7IGlmIChkYXRhKSB7XG4gICAgICAgIGRhdGFzdG9yeV9kYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcblxuICAgICAgICBzZXRGaWx0ZXIob2xkX2ZpbHRlcnMgPT4ge1xuICAgICAgICAgIGxldCBuZXdfZmlsdGVycyA9IFtdXG4gICAgICAgICAgZGF0YXN0b3J5X2RhdGEuZHluYW1pY19lbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PSAnbWFwJyAmJiBlbGVtZW50LnBvc2l0aW9uID09IGluZGV4KSB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50Lm1hcF9maWx0ZXJzICYmIGVsZW1lbnQubWFwX2ZpbHRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5tYXBfZmlsdGVycy5mb3JFYWNoKChlbGVtLGkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtLnBvc2l0aW9uICE9IGluZGV4RmlsdGVyKSB7bmV3X2ZpbHRlcnMucHVzaChlbGVtKTt9XG4gICAgICAgICAgICAgICAgfSkgfSB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm4gbmV3X2ZpbHRlcnN9IClcbiAgICAgICAgfSB9KVxuICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtjb25zb2xlLmxvZyhlcnJvcik7fSk7XG4gIH07XG5cbiAgaWYgKGZpbHRlcnMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZpbHRlclF1ZXJpZXNCb3gucHVzaCg8RmlsdGVyTWFwXG4gICAgICAgICAgaW5kZXhGaWx0ZXI9e2l9IGtleT17Z2VuZXJhdGVLZXkoZmlsdGVyc1tpXS5tYXBfZmlsdGVyX3RpdGxlKStpfVxuICAgICAgICAgIGluZGV4X3BhcmVudD17aW5kZXh9IHNldEZpbHRlckNoYW5nZT17c2V0RmlsdGVyfSBmaWx0ZXJzPXtmaWx0ZXJzfVxuICAgICAgICAgIHJlbW92ZUZpbHRlckJveD17cmVtb3ZlRmlsdGVyQm94fS8+KVxuICAgIH1cbiAgfVxuXG4gIC8vIHByZXZpZXdcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobWFwSW5zdGFuY2UgIT0gJ2luaXRpYWxpc2VkJykgeyBtYXAgPSBpbml0TWFwKCk7IH1cbiAgICBlbHNlIGlmIChtYXBJbnN0YW5jZSA9PSAnaW5pdGlhbGlzZWQnKSB7bWFwID0gbWFwUmVuZGVyZWQgO31cblxuICAgICQoXCJ0ZXh0YXJlYVwiKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJoZWlnaHQ6XCIgKyAodGhpcy5zY3JvbGxIZWlnaHQpICsgXCJweDtvdmVyZmxvdy15OmhpZGRlbjtcIik7XG4gICAgfSkub24oXCJpbnB1dFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnN0eWxlLmhlaWdodCA9IDA7XG4gICAgICB0aGlzLnN0eWxlLmhlaWdodCA9ICh0aGlzLnNjcm9sbEhlaWdodCkgKyBcInB4XCI7XG4gICAgfSk7XG5cbiAgfSwgW10pO1xuXG4gIC8vIFdZU0lXWUc6IHJlbmRlciBjb21wb25lbnQgYW5kIHByZXZpZXdcbiAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoXCIvbW9kaWZ5L1wiKSA+IC0xKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgPGRpdiBpZD17aW5kZXgrXCJfX2Jsb2NrX2ZpZWxkXCJ9IGNsYXNzTmFtZT1cImJsb2NrX2ZpZWxkXCI+XG4gICAgICB7c3Bpbm5lciAmJiAoPHNwYW4gaWQ9J2xvYWRlcicgY2xhc3NOYW1lPSdsZHMtZHVhbC1yaW5nIG92ZXJsYXknPjwvc3Bhbj4pfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJpYmJvblwiPjwvZGl2PlxuICAgICAgICA8aDQgY2xhc3NOYW1lPVwiYmxvY2tfdGl0bGVcIj5BZGQgYSBtYXA8L2g0PlxuICAgICAgICA8U29ydENvbXBvbmVudFxuICAgICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgICBzb3J0Q29tcG9uZW50VXA9e3NvcnRDb21wb25lbnRVcH1cbiAgICAgICAgICBzb3J0Q29tcG9uZW50RG93bj17c29ydENvbXBvbmVudERvd259XG4gICAgICAgICAga2V5PXt1bmlxdWVfa2V5fSAvPlxuICAgICAgICA8UmVtb3ZlQ29tcG9uZW50XG4gICAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgICAgICAgIHJlbW92ZUNvbXBvbmVudD17cmVtb3ZlQ29tcG9uZW50fVxuICAgICAgICAgIGtleT17dW5pcXVlX2tleX0gLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Zvcm0tZ3JvdXAnIGlkPXtpbmRleCtcIl9fZm9ybV9ncm91cFwifT5cbiAgICAgICAgICA8bGFiZWwgaHRtbEZvcj0nbWFwX3RpdGxlJz5NYXAgdGl0bGU8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3NOYW1lPSdtYXBfdGl0bGUnXG4gICAgICAgICAgICBpZD17aW5kZXgrXCJfX21hcF90aXRsZVwifVxuICAgICAgICAgICAgdHlwZT0ndGV4dCdcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZT17dGl0bGV9XG4gICAgICAgICAgICBvbkNoYW5nZT17dGl0bGVDaGFuZ2V9XG4gICAgICAgICAgICBuYW1lPXtpbmRleCtcIl9fbWFwX3RpdGxlXCJ9XG4gICAgICAgICAgICBwbGFjZWhvbGRlcj0nVGhlIHRpdGxlIG9mIHRoZSBtYXAnPlxuICAgICAgICAgIDwvaW5wdXQ+XG4gICAgICAgICAgPGxhYmVsIGh0bWxGb3I9J2FkZHBsYWNlaG9sZGVyX3BvaW50cyc+U1BBUlFMIHF1ZXJ5PC9sYWJlbD5cbiAgICBcdFx0XHQ8dGV4dGFyZWFcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPSdhZGRwbGFjZWhvbGRlcl9wb2ludHMnXG4gICAgXHRcdFx0XHRcdG5hbWU9e2luZGV4K1wiX19tYXBfcG9pbnRzX3F1ZXJ5XCJ9XG4gICAgICAgICAgICAgIHR5cGU9J3RleHQnXG4gICAgXHRcdFx0XHRcdGlkPXtpbmRleCtcIl9fbWFwX3BvaW50c19xdWVyeVwifVxuICAgICAgICAgICAgICBvbkNoYW5nZT17cXVlcnlDaGFuZ2V9XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZT17cXVlcnl9XG4gICAgXHRcdFx0XHRcdHJlcXVpcmVkPlxuICAgICAgICAgIDwvdGV4dGFyZWE+XG4gICAgICAgICAgPGEgc3R5bGU9e3tjdXJzb3I6J3BvaW50ZXInfX1cbiAgICAgICAgICAgIG9uQ2xpY2s9e2luaXRNYXB9PlJ1biB0aGUgcXVlcnk8L2E+IHwgPGEgaHJlZj0nIydcbiAgICAgICAgICAgICAgICAgIHJvbGU9J2J1dHRvbicgZGF0YS10b2dnbGU9J21vZGFsJyBkYXRhLXRhcmdldD0nI21hcHNNb2RhbExvbmcnPkxlYXJuIG1vcmUgYWJvdXQgU1BBUlFMIHF1ZXJpZXMgZm9yIG1hcHM8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aDM+e3RpdGxlfTwvaDM+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9J21hcF9wcmV2aWV3X2NvbnRhaW5lcidcbiAgICAgICAgICBpZD17aW5kZXgrJ19fbWFwX3ByZXZpZXdfY29udGFpbmVyJ30+XG4gICAgICAgICAgPE1hcFNpZGViYXJcbiAgICAgICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgICAgIGZpbHRlcnM9e2ZpbHRlcnN9XG4gICAgICAgICAgICBrZXk9e1wic2lkZWJhcl9cIit1bmlxdWVfa2V5K2luZGV4fVxuICAgICAgICAgICAgb25Nb3VzZUVudGVyPXsoKSA9PiBzZXRJc1Nob3duKHRydWUpfVxuICAgICAgICAgICAgb25Nb3VzZUxlYXZlPXsoKSA9PiBzZXRJc1Nob3duKGZhbHNlKX1cbiAgICAgICAgICAgIG9uRWFjaEZlYXR1cmU9e29uRWFjaEZlYXR1cmV9XG4gICAgICAgICAgICBhbGxNYXJrZXJzPXthbGxNYXJrZXJzTWFwfVxuICAgICAgICAgICAgbWFya2Vycz17bWFya2Vyc01hcH1cbiAgICAgICAgICAgIG1hcD17bWFwUmVuZGVyZWR9IC8+XG4gICAgICAgICAgPE1hcmtlclNpZGViYXJcbiAgICAgICAgICAgIGtleT17XCJtYXJrZXJfc2lkZWJhcl9cIit1bmlxdWVfa2V5K2luZGV4fVxuICAgICAgICAgICAgbWFya2VyU2lkZWJhcj17bWFya2VyU2lkZWJhcn1cbiAgICAgICAgICAgIHNldE1hcmtlclNpZGViYXI9e3NldE1hcmtlclNpZGViYXJ9XG4gICAgICAgICAgICBzZXRNYXJrZXJTaWRlYmFyQ29udGVudD17c2V0TWFya2VyU2lkZWJhckNvbnRlbnR9XG4gICAgICAgICAgICBtYXJrZXJTaWRlYmFyQ29udGVudD17bWFya2VyU2lkZWJhckNvbnRlbnR9XG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGEgaWQ9e2luZGV4K1wiX19hZGRtYXBmaWx0ZXJcIn1cbiAgICAgICAgICBjbGFzc05hbWU9J2J0biBidG4tcHJpbWFyeSBidG4tYm9yZGVyJ1xuICAgICAgICAgIG9uQ2xpY2s9e2ZpbHRlckNoYW5nZX1cbiAgICAgICAgICBleHRyYT0nVHJ1ZSdcbiAgICAgICAgICBuYW1lPXtpbmRleCtcIm1hcF9maWx0ZXJcIn0+QWRkIGEgZmlsdGVyPC9hPlxuICAgICAgICB7ZmlsdGVyUXVlcmllc0JveH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbCBmYWRlXCJcbiAgICAgICAgICBpZD1cIm1hcHNNb2RhbExvbmdcIlxuICAgICAgICAgIHRhYkluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCJcbiAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJtYXBzTW9kYWxMb25nVGl0bGVcIlxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCIgcm9sZT1cImRvY3VtZW50XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtY29udGVudCBjYXJkXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxoNCBpZD1cIm1hcHNNb2RhbExvbmdUaXRsZVwiIGNsYXNzTmFtZT1cImNhcmQtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICBQb3B1bGF0ZSBhIG1hcCB3aXRoIFNQQVJRTDwvaDQ+XG5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkEgU1BBUlFMIHF1ZXJ5IHRvIGNyZWF0ZSBhIG1hcCByZXF1aXJlcyB5b3UgdG8gaW5jbHVkZSB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyAobmFtZXMgYXJlIG1hbmRhdG9yeSkuPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPnBvaW50PC9zdHJvbmc+OiAoVVJJKSB0aGUgcmVzb3VyY2UgdG8gYmUgcGxvdHRlZC48L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPmxhdDwvc3Ryb25nPjogKHN0cmluZykgdGhlIGxhdGl0dWRlIG9mIHRoZSBwb2ludDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+bG9uZzwvc3Ryb25nPjogKHN0cmluZykgdGhlIGxvbmdpdHVkZSBvZiB0aGUgcG9pbnQ8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPllvdSBjYW4gYWRkIGFzIG1hbnkgb3RoZXIgdmFyaWFibGVzIGFzIHlvdSBsaWtlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIHdpbGwgYmUgc2hvd24gb24gdGhlIHJpZ2h0IHNpZGViYXIgd2hlbiBjbGlja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gYSBwb2ludCBpbiB0aGUgbWFwLiBUbyBnZXQgcHJldHR5IGxhYmVscyBhc3NvY2lhdGVkIHRvIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZW4gdGhlIGxhdHRlciBhcmUgVVJJcykgdXNlIHRoZSBub3RhdGlvbiA8Y29kZT4/dmFyPC9jb2RlPiBhbmQgPGNvZGU+P3ZhckxhYmVsPC9jb2RlPiB3aGVuIGRlY2xhcmluZyB2YXJpYWJsZXMgaW4gdGhlIFNFTEVDVCBjbGF1c2UuPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Rm9yIGluc3RhbmNlLCBhIHF1ZXJ5IHRvIFdpa2lkYXRhIHRvIHJldHVybiBtdXNldW1zIGluIEJyaXR0YW55IHdvdWxkIGxvb2sgbGlrZSBmb2xsb3dzOjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzTmFtZT1cInF1ZXJ5LWVnXCI+e1wiU0VMRUNUIERJU1RJTkNUID9wb2ludCA/cG9pbnRMYWJlbCA/dmlsbGVJZExhYmVsID9sYXQgP2xvbmdcIn08YnIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1wiV0hFUkUge1wifTxici8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XCI/cG9pbnQgd2R0OlA1MzkgP211c2VvZmlsZTsgd2R0OlAxMzEqIHdkOlExMjEzMDsgXCJ9PGJyLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcIndkdDpQMTMxID92aWxsZUlkOyBwOlA2MjUgP3N0YXRlbWVudC5cIn08YnIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1wiP3N0YXRlbWVudCBwc3Y6UDYyNSA/bm9kZS4gXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XCI/bm9kZSB3aWtpYmFzZTpnZW9MYXRpdHVkZSA/bGF0IDsgd2lraWJhc2U6Z2VvTG9uZ2l0dWRlID9sb25nLlwifTxici8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XCJTRVJWSUNFIHdpa2liYXNlOmxhYmVsIHsgYmQ6c2VydmljZVBhcmFtIHdpa2liYXNlOmxhbmd1YWdlICdlbicuIH0gfSBcIn08YnIvPjwvY29kZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBtYXAgcGxvdHMgcG9pbnRzIGFzIGNsdXN0ZXJzLCBzaG93aW5nIHRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIHBlciBhcmVhLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBtb3ZpbmcgdGhlIG1vdXNlIG92ZXIgYSBjbHVzdGVyLCB0aGUgZWRnZXMgb2YgdGhlIGFyZWEgaXMgc2hvd24uPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+UGxlYXNlIG5vdGUgdGhhdCB0byBzZWUgdGhlIHByZXZpZXcgb24gdGhlIG1hcCB5b3UgbXVzdCBjbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gPGNvZGU+UnVuIHRoZSBxdWVyeTwvY29kZT4sIHRvIGF2b2lkIGV4cGVuc2l2ZSB1bm5lY2Vzc2FyeSBxdWVyaWVzLjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9XCJibG9ja190aXRsZVwiPkZpbHRlcnM8L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WW91IGNhbiBhZGQgZmlsdGVycyB0byB0aGUgbWFwLCB3aGljaCB3aWxsIGFwcGVhciBpbiB0aGUgbGVmdCBzaWRlYmFyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG8gYWRkIGEgZmlsdGVyIHRvIHRoZSBtYXAgeW91IG5lZWQgYSBTUEFSUUwgcXVlcnkgd2hlcmUgdG8gc3BlY2lmeSB0aHJlZSB2YXJpYWJsZXMgKG5hbWVzIGFyZSBtYW5kYXRvcnkpOjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxzdHJvbmc+cG9pbnQ8L3N0cm9uZz46IGEgdmFyaWFibGUgaWRlbnRpZnlpbmcgdGhlIGRhdGEgcG9pbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGJ5IHRoZSBwcmV2aW91cyBxdWVyeS4gV2Ugd2lsbCByZXBsYWNlIHRoaXMgdmFyaWFibGUgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlzdCBvZiBkYXRhIHBvaW50cyByZXR1cm5lZCBieSB0aGUgcHJldmlvdXMgcXVlcnksIHNvIHlvdSBkb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgbmVlZCB0byByZXBlYXQgdGhlIHBhdHRlcm5zIHRvIGlkZW50aWZ5IHdoYXQgYSBwb2ludCBpcy48L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5maWx0ZXI8L3N0cm9uZz46ICB0aGUgdmFyaWFibGUgdG8gYmUgdXNlZCBhcyBhIGZpbHRlci4gQ2FuIGJlIGEgVVJJIG9yIGEgTGl0ZXJhbC48L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5maWx0ZXJMYWJlbDwvc3Ryb25nPjogdGhlIGxhYmVsIG9mIHRoZSBmaWx0ZXIgaW4gY2FzZSB0aGUgZmlsdGVyIGlzIGEgVVJJLjwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Rm9yIGluc3RhbmNlLCBhIHF1ZXJ5IG9uIFdpa2lkYXRhIHRvIHJldHVybiBtdXNldW1zJyB0eXBlcyBhcyBmaWx0ZXJzIHdvdWxkIGxvb2sgbGlrZSBmb2xsb3dzOjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzTmFtZT1cInF1ZXJ5LWVnXCI+e1wiU0VMRUNUIERJU1RJTkNUID9wb2ludCA/ZmlsdGVyID9maWx0ZXJMYWJlbFwifTxici8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XCJXSEVSRSB7XCJ9PGJyLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcIj9wb2ludCB3ZHQ6UDUzOSA/bXVzZW9maWxlOyB3ZHQ6UDEzMSogd2Q6UTEyMTMwLiBcIn08YnIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1wiP3BvaW50IHdkdDpQMTMxID9maWx0ZXIuID9maWx0ZXIgcmRmczpsYWJlbCA/ZmlsdGVyTGFiZWwgLlwifTxici8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XCJGSUxURVIoTEFORyg/ZmlsdGVyTGFiZWwpID0gJycgfHwgTEFOR01BVENIRVMoTEFORyg/ZmlsdGVyTGFiZWwpLCAnZW4nKSkuIH1cIn08YnIvPjwvY29kZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiYnRuIGJ0bi1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPC8+XG5cbiAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7IHJldHVybiA8RXJyb3JIYW5kbGVyIGVycm9yPXtlcnJvcn0gLz4gfVxuICB9IGVsc2Uge1xuICAgIC8vIEZpbmFsIHN0b3J5OiByZW5kZXIgcHJldmlld1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPGgzIGNsYXNzTmFtZT1cImJsb2NrX3RpdGxlIGZsb2F0X25vbmVcIj57dGl0bGV9PC9oMz5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT0nbWFwX3ByZXZpZXdfY29udGFpbmVyJ1xuICAgICAgICAgIGlkPXtpbmRleCsnX19tYXBfcHJldmlld19jb250YWluZXInfT5cbiAgICAgICAgICA8TWFwU2lkZWJhclxuICAgICAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgZmlsdGVycz17ZmlsdGVyc31cbiAgICAgICAgICAgIGtleT17XCJzaWRlYmFyX1wiK3VuaXF1ZV9rZXkraW5kZXh9XG4gICAgICAgICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHNldElzU2hvd24odHJ1ZSl9XG4gICAgICAgICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldElzU2hvd24oZmFsc2UpfVxuICAgICAgICAgICAgb25FYWNoRmVhdHVyZT17b25FYWNoRmVhdHVyZX1cbiAgICAgICAgICAgIGFsbE1hcmtlcnM9e2FsbE1hcmtlcnNNYXB9XG4gICAgICAgICAgICBtYXJrZXJzPXttYXJrZXJzTWFwfVxuICAgICAgICAgICAgbWFwPXttYXBSZW5kZXJlZH0gLz5cbiAgICAgICAgICA8TWFya2VyU2lkZWJhclxuICAgICAgICAgICAga2V5PXtcIm1hcmtlcl9zaWRlYmFyX1wiK3VuaXF1ZV9rZXkraW5kZXh9XG4gICAgICAgICAgICBtYXJrZXJTaWRlYmFyPXttYXJrZXJTaWRlYmFyfVxuICAgICAgICAgICAgc2V0TWFya2VyU2lkZWJhcj17c2V0TWFya2VyU2lkZWJhcn1cbiAgICAgICAgICAgIHNldE1hcmtlclNpZGViYXJDb250ZW50PXtzZXRNYXJrZXJTaWRlYmFyQ29udGVudH1cbiAgICAgICAgICAgIG1hcmtlclNpZGViYXJDb250ZW50PXttYXJrZXJTaWRlYmFyQ29udGVudH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC8+XG4gICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikgeyByZXR1cm4gPEVycm9ySGFuZGxlciBlcnJvcj17ZXJyb3J9IC8+IH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsSUFBTUEsV0FBVyxHQUFHLFNBQWRBLFdBQVdBLENBQUlDLEdBQUcsRUFBSztFQUN6QixVQUFBQyxNQUFBLENBQVdELEdBQUcsT0FBQUMsTUFBQSxDQUFNLElBQUlDLElBQUksQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxJQUFNQyxjQUFjLEdBQUcsU0FBakJBLGNBQWNBLENBQUFDLElBQUEsRUFDK0I7RUFBQSxJQUR6QkMsU0FBUyxHQUFBRCxJQUFBLENBQVRDLFNBQVM7SUFBRUMsV0FBVyxHQUFBRixJQUFBLENBQVhFLFdBQVc7SUFBR0MsVUFBVSxHQUFBSCxJQUFBLENBQVZHLFVBQVU7SUFDdkRDLFlBQVksR0FBQUosSUFBQSxDQUFaSSxZQUFZO0lBQUdDLE9BQU8sR0FBQUwsSUFBQSxDQUFQSyxPQUFPO0lBQUVDLFVBQVUsR0FBQU4sSUFBQSxDQUFWTSxVQUFVO0lBQUVDLEdBQUcsR0FBQVAsSUFBQSxDQUFITyxHQUFHO0VBRTNDLElBQUlDLGVBQWU7RUFDbkIsSUFBQUMsZUFBQSxHQUE0QkMsS0FBSyxDQUFDQyxRQUFRLENBQUMsYUFBYSxDQUFDO0lBQUFDLGdCQUFBLEdBQUFDLGNBQUEsQ0FBQUosZUFBQTtJQUFsREssT0FBTyxHQUFBRixnQkFBQTtJQUFFRyxRQUFRLEdBQUFILGdCQUFBO0VBRXhCLFNBQVNJLGdCQUFnQkEsQ0FBQSxFQUFHO0lBQzFCUixlQUFlLEdBQUdTLEtBQUssQ0FBQ0MsSUFBSSxDQUFDQyxRQUFRLENBQUNDLGdCQUFnQixDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDOUYsSUFBSWYsT0FBTyxJQUFJZ0IsU0FBUyxFQUFFO01BQ3RCaEIsT0FB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