UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

476 lines (429 loc) 36.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.layerConfigChange = layerConfigChange; exports.updateLayerData = updateLayerData; exports.axiosAPICAll = axiosAPICAll; exports.layerTypeChange = layerTypeChange; exports.layerVisualChannelConfigChange = layerVisualChannelConfigChange; exports.layerVisConfigChange = layerVisConfigChange; exports.widgetConfigChange = widgetConfigChange; exports.widgetTypeChange = widgetTypeChange; exports.widgetVisualChannelConfigChange = widgetVisualChannelConfigChange; exports.widgetVisConfigChange = widgetVisConfigChange; exports.updateLayerBlending = updateLayerBlending; exports.interactionConfigChange = interactionConfigChange; exports.setFilter = setFilter; exports.addFilter = addFilter; exports.addLayer = addLayer; exports.addWidget = addWidget; exports.reorderWidget = reorderWidget; exports.reorderLayer = reorderLayer; exports.removeFilter = removeFilter; exports.removeLayer = removeLayer; exports.removeWidget = removeWidget; exports.removeDataset = removeDataset; exports.showDatasetTable = showDatasetTable; exports.updateVisData = updateVisData; exports.toggleAnimation = toggleAnimation; exports.updateAnimationSpeed = updateAnimationSpeed; exports.enlargeFilter = enlargeFilter; exports.onLayerHover = onLayerHover; exports.onLayerClick = onLayerClick; exports.onWidgetHover = onWidgetHover; exports.onWidgetClick = onWidgetClick; exports.onMapClick = onMapClick; exports.toggleLayerForMap = toggleLayerForMap; exports.toggleWidgetForMap = toggleWidgetForMap; exports.setVisibleLayersForMap = setVisibleLayersForMap; exports.setVisibleWidgetsForMap = setVisibleWidgetsForMap; exports.setFilterPlot = setFilterPlot; exports.loadFiles = loadFiles; exports.loadFilesErr = loadFilesErr; var _actionTypes = _interopRequireDefault(require("../constants/action-types")); // Copyright (c) 2019 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // vis-state-reducer function layerConfigChange(oldLayer, newConfig) { // console.log( // 'layerConfigChange', // 'oldLayer', // oldLayer, // 'newConfig', // newConfig // ); return { type: _actionTypes["default"].LAYER_CONFIG_CHANGE, oldLayer: oldLayer, newConfig: newConfig }; } function updateLayerData(layer, collected) { return { type: _actionTypes["default"].UPDATE_STATE_LAYER_DATA, layer: layer, collected: collected }; } function axiosAPICAll(layer) { return { type: _actionTypes["default"].ASYNC_API_CALL, layer: layer }; } function layerTypeChange(oldLayer, newType) { // console.log('layerTypeChange', 'oldLayer', oldLayer, 'newType', newType); return { type: _actionTypes["default"].LAYER_TYPE_CHANGE, oldLayer: oldLayer, newType: newType }; } function layerVisualChannelConfigChange(oldLayer, newConfig, channel) { // console.log( // 'layerVisualChannelConfigChange', // 'oldLayer', // oldLayer, // 'newConfig', // newConfig, // channel // ); return { type: _actionTypes["default"].LAYER_VISUAL_CHANNEL_CHANGE, oldLayer: oldLayer, newConfig: newConfig, channel: channel }; } function layerVisConfigChange(oldLayer, newVisConfig) { // console.log( // 'layerVisConfigChange', // 'oldLayer', // oldLayer, // 'newVisConfig', // newVisConfig // ); return { type: _actionTypes["default"].LAYER_VIS_CONFIG_CHANGE, oldLayer: oldLayer, newVisConfig: newVisConfig }; } function widgetConfigChange(oldWidget, newConfig) { return { type: _actionTypes["default"].WIDGET_CONFIG_CHANGE, oldWidget: oldWidget, newConfig: newConfig }; } function widgetTypeChange(oldWidget, newType) { // console.log('widgetTypeChange', 'oldWidget', oldWidget, 'newType', newType); return { type: _actionTypes["default"].WIDGET_TYPE_CHANGE, oldWidget: oldWidget, newType: newType }; } function widgetVisualChannelConfigChange(oldWidget, newConfig, channel) { // console.log( // 'widgetVisualChannelConfigChange', // 'oldWidget', // oldWidget, // 'newConfig', // newConfig, // 'channel', // channel // ); return { type: _actionTypes["default"].WIDGET_VISUAL_CHANNEL_CHANGE, oldWidget: oldWidget, newConfig: newConfig, channel: channel }; } function widgetVisConfigChange(oldWidget, newVisConfig) { // console.log( // 'widgetVisConfigChange', // 'oldWidget', // oldWidget, // 'newVisConfig', // newVisConfig // ); return { type: _actionTypes["default"].WIDGET_VIS_CONFIG_CHANGE, oldWidget: oldWidget, newVisConfig: newVisConfig }; } function updateLayerBlending(mode) { // console.log('updateLayerBlending', 'mode', mode); return { type: _actionTypes["default"].UPDATE_LAYER_BLENDING, mode: mode }; } function interactionConfigChange(config) { // console.log('interactionConfigChange', 'config', config); return { type: _actionTypes["default"].INTERACTION_CONFIG_CHANGE, config: config }; } function setFilter(idx, prop, value) { // console.log('setFilter', 'idx', idx, 'prop', prop, 'value', value); return { type: _actionTypes["default"].SET_FILTER, idx: idx, prop: prop, value: value }; } function addFilter(dataId) { // console.log('addFilter', 'dataID', dataId); return { type: _actionTypes["default"].ADD_FILTER, dataId: dataId }; } function addLayer(props) { // console.log('addLayer', 'props', props); return { type: _actionTypes["default"].ADD_LAYER, props: props }; } function addWidget(props) { // console.log('addWidget', 'props', props); return { type: _actionTypes["default"].ADD_WIDGET, props: props }; } function reorderWidget(order) { // console.log('reorderWidget', 'order', order); return { type: _actionTypes["default"].REORDER_WIDGET, order: order }; } function reorderLayer(order) { // console.log('reorderLayer', 'order', order); return { type: _actionTypes["default"].REORDER_LAYER, order: order }; } function removeFilter(idx) { // console.log('removeFilter', 'idx', idx); return { type: _actionTypes["default"].REMOVE_FILTER, idx: idx }; } function removeLayer(idx) { // console.log('removeLayer', 'idx', idx); return { type: _actionTypes["default"].REMOVE_LAYER, idx: idx }; } function removeWidget(idx) { // console.log('removeWidget', 'idx', idx); return { type: _actionTypes["default"].REMOVE_WIDGET, idx: idx }; } function removeDataset(key) { // console.log('removeDataset', 'key', key); return { type: _actionTypes["default"].REMOVE_DATASET, key: key }; } function showDatasetTable(dataId) { // console.log('showDatasetTable', 'dataId', dataId); return { type: _actionTypes["default"].SHOW_DATASET_TABLE, dataId: dataId }; } /** * * @param datasets - Array of datasets : * {info: {id: '', color: hex, label: '']}, data: {fields: [], rows: []}} * @param options {centerMap, readOnly} * @param config {visState, mapState, mapStyle} * @returns {{type: null, datasets: *, options: *}} */ function updateVisData(datasets, options, config) { // console.log( // 'updateVisData', // 'datasets', // datasets, // 'options', // options, // 'config', // config // ); return { type: _actionTypes["default"].UPDATE_VIS_DATA, datasets: datasets, options: options, config: config }; } function toggleAnimation(idx) { // console.log('toggleAnimation', 'idx', idx); return { type: _actionTypes["default"].TOGGLE_FILTER_ANIMATION, idx: idx }; } function updateAnimationSpeed(idx, speed) { // console.log('updateAnimation', 'idx', idx, 'speed', speed); return { type: _actionTypes["default"].UPDATE_FILTER_ANIMATION_SPEED, idx: idx, speed: speed }; } function enlargeFilter(idx) { // console.log('enlargeFilter', 'idx', idx); return { type: _actionTypes["default"].ENLARGE_FILTER, idx: idx }; } function onLayerHover(info) { // console.log('onLayerHover', info); return { type: _actionTypes["default"].LAYER_HOVER, info: info }; } function onLayerClick(info) { // console.log('onLayerClick', info); return { type: _actionTypes["default"].LAYER_CLICK, info: info }; } function onWidgetHover(info) { // console.log('onWidgetHover', info); return { type: _actionTypes["default"].WIDGET_HOVER, info: info }; } function onWidgetClick(info) { // console.log('onWidgetClick', info); return { type: _actionTypes["default"].WIDGET_CLICK, info: info }; } function onMapClick() { // console.log('onMapClick'); return { type: _actionTypes["default"].MAP_CLICK }; } /** * Toggle a single layer for a give map * @param mapIndex * @param layerId * @returns {{type: *, mapIndex: *, layerId: *}} */ function toggleLayerForMap(mapIndex, layerId) { // console.log('toggleLAyerForMap', 'mapIndex', mapIndex, 'layerId', layerId); return { type: _actionTypes["default"].TOGGLE_LAYER_FOR_MAP, mapIndex: mapIndex, layerId: layerId }; } /** * Toggle a single widget for a give map * @param mapIndex * @param widgetId * @returns {{type: *, mapIndex: *, widgetId: *}} */ function toggleWidgetForMap(mapIndex, widgetId) { // console.log('toggleWidgetForMap', mapIndex, widgetId); return { type: _actionTypes["default"].TOGGLE_WIDGET_FOR_MAP, mapIndex: mapIndex, widgetId: widgetId }; } /** * Toggle layer visibility on split views * @param layerIndex the layer we want to toggle visibility on * @param mapIndex the map index * @returns {{type: null, layerIndex: *, mapIndex: *}} */ function setVisibleLayersForMap(mapIndex, layerIds) { // console.log('setVisibleLayersForMap', mapIndex, layerIds); return { type: _actionTypes["default"].SET_VISIBLE_LAYERS_FOR_MAP, mapIndex: mapIndex, layerIds: layerIds }; } /** * Toggle widget visibility on split views * @param widgetIndex the widget we want to toggle visibility on * @param mapIndex the map index * @returns {{type: null, widgetIndex: *, mapIndex: *}} */ function setVisibleWidgetsForMap(mapIndex, widgetIds) { // console.log('setVisibleWidgetsForMap', mapIndex, widgetIds); return { type: _actionTypes["default"].SET_VISIBLE_WIDGETS_FOR_MAP, mapIndex: mapIndex, widgetIds: widgetIds }; } function setFilterPlot(idx, newProp) { // console.log('setFilterPlot', idx, newProp); return { type: _actionTypes["default"].SET_FILTER_PLOT, idx: idx, newProp: newProp }; } function loadFiles(files) { // console.log('loadFiles', files); return { type: _actionTypes["default"].LOAD_FILES, files: files }; } function loadFilesErr(error) { // console.log('loadFilesErr', error); return { type: _actionTypes["default"].LOAD_FILES_ERR, error: error }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb25zL3Zpcy1zdGF0ZS1hY3Rpb25zLmpzIl0sIm5hbWVzIjpbImxheWVyQ29uZmlnQ2hhbmdlIiwib2xkTGF5ZXIiLCJuZXdDb25maWciLCJ0eXBlIiwiQWN0aW9uVHlwZXMiLCJMQVlFUl9DT05GSUdfQ0hBTkdFIiwidXBkYXRlTGF5ZXJEYXRhIiwibGF5ZXIiLCJjb2xsZWN0ZWQiLCJVUERBVEVfU1RBVEVfTEFZRVJfREFUQSIsImF4aW9zQVBJQ0FsbCIsIkFTWU5DX0FQSV9DQUxMIiwibGF5ZXJUeXBlQ2hhbmdlIiwibmV3VHlwZSIsIkxBWUVSX1RZUEVfQ0hBTkdFIiwibGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlIiwiY2hhbm5lbCIsIkxBWUVSX1ZJU1VBTF9DSEFOTkVMX0NIQU5HRSIsImxheWVyVmlzQ29uZmlnQ2hhbmdlIiwibmV3VmlzQ29uZmlnIiwiTEFZRVJfVklTX0NPTkZJR19DSEFOR0UiLCJ3aWRnZXRDb25maWdDaGFuZ2UiLCJvbGRXaWRnZXQiLCJXSURHRVRfQ09ORklHX0NIQU5HRSIsIndpZGdldFR5cGVDaGFuZ2UiLCJXSURHRVRfVFlQRV9DSEFOR0UiLCJ3aWRnZXRWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlIiwiV0lER0VUX1ZJU1VBTF9DSEFOTkVMX0NIQU5HRSIsIndpZGdldFZpc0NvbmZpZ0NoYW5nZSIsIldJREdFVF9WSVNfQ09ORklHX0NIQU5HRSIsInVwZGF0ZUxheWVyQmxlbmRpbmciLCJtb2RlIiwiVVBEQVRFX0xBWUVSX0JMRU5ESU5HIiwiaW50ZXJhY3Rpb25Db25maWdDaGFuZ2UiLCJjb25maWciLCJJTlRFUkFDVElPTl9DT05GSUdfQ0hBTkdFIiwic2V0RmlsdGVyIiwiaWR4IiwicHJvcCIsInZhbHVlIiwiU0VUX0ZJTFRFUiIsImFkZEZpbHRlciIsImRhdGFJZCIsIkFERF9GSUxURVIiLCJhZGRMYXllciIsInByb3BzIiwiQUREX0xBWUVSIiwiYWRkV2lkZ2V0IiwiQUREX1dJREdFVCIsInJlb3JkZXJXaWRnZXQiLCJvcmRlciIsIlJFT1JERVJfV0lER0VUIiwicmVvcmRlckxheWVyIiwiUkVPUkRFUl9MQVlFUiIsInJlbW92ZUZpbHRlciIsIlJFTU9WRV9GSUxURVIiLCJyZW1vdmVMYXllciIsIlJFTU9WRV9MQVlFUiIsInJlbW92ZVdpZGdldCIsIlJFTU9WRV9XSURHRVQiLCJyZW1vdmVEYXRhc2V0Iiwia2V5IiwiUkVNT1ZFX0RBVEFTRVQiLCJzaG93RGF0YXNldFRhYmxlIiwiU0hPV19EQVRBU0VUX1RBQkxFIiwidXBkYXRlVmlzRGF0YSIsImRhdGFzZXRzIiwib3B0aW9ucyIsIlVQREFURV9WSVNfREFUQSIsInRvZ2dsZUFuaW1hdGlvbiIsIlRPR0dMRV9GSUxURVJfQU5JTUFUSU9OIiwidXBkYXRlQW5pbWF0aW9uU3BlZWQiLCJzcGVlZCIsIlVQREFURV9GSUxURVJfQU5JTUFUSU9OX1NQRUVEIiwiZW5sYXJnZUZpbHRlciIsIkVOTEFSR0VfRklMVEVSIiwib25MYXllckhvdmVyIiwiaW5mbyIsIkxBWUVSX0hPVkVSIiwib25MYXllckNsaWNrIiwiTEFZRVJfQ0xJQ0siLCJvbldpZGdldEhvdmVyIiwiV0lER0VUX0hPVkVSIiwib25XaWRnZXRDbGljayIsIldJREdFVF9DTElDSyIsIm9uTWFwQ2xpY2siLCJNQVBfQ0xJQ0siLCJ0b2dnbGVMYXllckZvck1hcCIsIm1hcEluZGV4IiwibGF5ZXJJZCIsIlRPR0dMRV9MQVlFUl9GT1JfTUFQIiwidG9nZ2xlV2lkZ2V0Rm9yTWFwIiwid2lkZ2V0SWQiLCJUT0dHTEVfV0lER0VUX0ZPUl9NQVAiLCJzZXRWaXNpYmxlTGF5ZXJzRm9yTWFwIiwibGF5ZXJJZHMiLCJTRVRfVklTSUJMRV9MQVlFUlNfRk9SX01BUCIsInNldFZpc2libGVXaWRnZXRzRm9yTWFwIiwid2lkZ2V0SWRzIiwiU0VUX1ZJU0lCTEVfV0lER0VUU19GT1JfTUFQIiwic2V0RmlsdGVyUGxvdCIsIm5ld1Byb3AiLCJTRVRfRklMVEVSX1BMT1QiLCJsb2FkRmlsZXMiLCJmaWxlcyIsIkxPQURfRklMRVMiLCJsb2FkRmlsZXNFcnIiLCJlcnJvciIsIkxPQURfRklMRVNfRVJSIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCQTs7QUFyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdPLFNBQVNBLGlCQUFULENBQTJCQyxRQUEzQixFQUFxQ0MsU0FBckMsRUFBZ0Q7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFPO0FBQ0xDLElBQUFBLElBQUksRUFBRUMsd0JBQVlDLG1CQURiO0FBRUxKLElBQUFBLFFBQVEsRUFBUkEsUUFGSztBQUdMQyxJQUFBQSxTQUFTLEVBQVRBO0FBSEssR0FBUDtBQUtEOztBQUVNLFNBQVNJLGVBQVQsQ0FBeUJDLEtBQXpCLEVBQWdDQyxTQUFoQyxFQUEyQztBQUNoRCxTQUFPO0FBQ0xMLElBQUFBLElBQUksRUFBRUMsd0JBQVlLLHVCQURiO0FBRUxGLElBQUFBLEtBQUssRUFBTEEsS0FGSztBQUdMQyxJQUFBQSxTQUFTLEVBQVRBO0FBSEssR0FBUDtBQUtEOztBQUVNLFNBQVNFLFlBQVQsQ0FBc0JILEtBQXRCLEVBQTZCO0FBQ2xDLFNBQU87QUFDTEosSUFBQUEsSUFBSSxFQUFFQyx3QkFBWU8sY0FEYjtBQUVMSixJQUFBQSxLQUFLLEVBQUxBO0FBRkssR0FBUDtBQUlEOztBQUVNLFNBQVNLLGVBQVQsQ0FBeUJYLFFBQXpCLEVBQW1DWSxPQUFuQyxFQUE0QztBQUNqRDtBQUNBLFNBQU87QUFDTFYsSUFBQUEsSUFBSSxFQUFFQyx3QkFBWVUsaUJBRGI7QUFFTGIsSUFBQUEsUUFBUSxFQUFSQSxRQUZLO0FBR0xZLElBQUFBLE9BQU8sRUFBUEE7QUFISyxHQUFQO0FBS0Q7O0FBRU0sU0FBU0UsOEJBQVQsQ0FB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LEdBQVA7QUFJRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxOSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbi8vIHZpcy1zdGF0ZS1yZWR1Y2VyXG5pbXBvcnQgQWN0aW9uVHlwZXMgZnJvbSAnY29uc3RhbnRzL2FjdGlvbi10eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsYXllckNvbmZpZ0NoYW5nZShvbGRMYXllciwgbmV3Q29uZmlnKSB7XG4gIC8vIGNvbnNvbGUubG9nKFxuICAvLyAgICdsYXllckNvbmZpZ0NoYW5nZScsXG4gIC8vICAgJ29sZExheWVyJyxcbiAgLy8gICBvbGRMYXllcixcbiAgLy8gICAnbmV3Q29uZmlnJyxcbiAgLy8gICBuZXdDb25maWdcbiAgLy8gKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5MQVlFUl9DT05GSUdfQ0hBTkdFLFxuICAgIG9sZExheWVyLFxuICAgIG5ld0NvbmZpZ1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGF5ZXJEYXRhKGxheWVyLCBjb2xsZWN0ZWQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5VUERBVEVfU1RBVEVfTEFZRVJfREFUQSxcbiAgICBsYXllcixcbiAgICBjb2xsZWN0ZWRcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF4aW9zQVBJQ0FsbChsYXllcikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkFTWU5DX0FQSV9DQUxMLFxuICAgIGxheWVyXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYXllclR5cGVDaGFuZ2Uob2xkTGF5ZXIsIG5ld1R5cGUpIHtcbiAgLy8gY29uc29sZS5sb2coJ2xheWVyVHlwZUNoYW5nZScsICdvbGRMYXllcicsIG9sZExheWVyLCAnbmV3VHlwZScsIG5ld1R5cGUpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxBWUVSX1RZUEVfQ0hBTkdFLFxuICAgIG9sZExheWVyLFxuICAgIG5ld1R5cGVcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZShvbGRMYXllciwgbmV3Q29uZmlnLCBjaGFubmVsKSB7XG4gIC8vIGNvbnNvbGUubG9nKFxuICAvLyAgICdsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UnLFxuICAvLyAgICdvbGRMYXllcicsXG4gIC8vICAgb2xkTGF5ZXIsXG4gIC8vICAgJ25ld0NvbmZpZycsXG4gIC8vICAgbmV3Q29uZmlnLFxuICAvLyAgIGNoYW5uZWxcbiAgLy8gKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5MQVlFUl9WSVNVQUxfQ0hBTk5FTF9DSEFOR0UsXG4gICAgb2xkTGF5ZXIsXG4gICAgbmV3Q29uZmlnLFxuICAgIGNoYW5uZWxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVmlzQ29uZmlnQ2hhbmdlKG9sZExheWVyLCBuZXdWaXNDb25maWcpIHtcbiAgLy8gY29uc29sZS5sb2coXG4gIC8vICAgJ2xheWVyVmlzQ29uZmlnQ2hhbmdlJyxcbiAgLy8gICAnb2xkTGF5ZXInLFxuICAvLyAgIG9sZExheWVyLFxuICAvLyAgICduZXdWaXNDb25maWcnLFxuICAvLyAgIG5ld1Zpc0NvbmZpZ1xuICAvLyApO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxBWUVSX1ZJU19DT05GSUdfQ0hBTkdFLFxuICAgIG9sZExheWVyLFxuICAgIG5ld1Zpc0NvbmZpZ1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2lkZ2V0Q29uZmlnQ2hhbmdlKG9sZFdpZGdldCwgbmV3Q29uZmlnKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuV0lER0VUX0NPTkZJR19DSEFOR0UsXG4gICAgb2xkV2lkZ2V0LFxuICAgIG5ld0NvbmZpZ1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2lkZ2V0VHlwZUNoYW5nZShvbGRXaWRnZXQsIG5ld1R5cGUpIHtcbiAgLy8gY29uc29sZS5sb2coJ3dpZGdldFR5cGVDaGFuZ2UnLCAnb2xkV2lkZ2V0Jywgb2xkV2lkZ2V0LCAnbmV3VHlwZScsIG5ld1R5cGUpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLldJREdFVF9UWVBFX0NIQU5HRSxcbiAgICBvbGRXaWRnZXQsXG4gICAgbmV3VHlwZVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2lkZ2V0VmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZShvbGRXaWRnZXQsIG5ld0NvbmZpZywgY2hhbm5lbCkge1xuICAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICAnd2lkZ2V0VmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZScsXG4gIC8vICAgJ29sZFdpZGdldCcsXG4gIC8vICAgb2xkV2lkZ2V0LFxuICAvLyAgICduZXdDb25maWcnLFxuICAvLyAgIG5ld0NvbmZpZyxcbiAgLy8gICAnY2hhbm5lbCcsXG4gIC8vICAgY2hhbm5lbFxuICAvLyApO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLldJREdFVF9WSVNVQUxfQ0hBTk5FTF9DSEFOR0UsXG4gICAgb2xkV2lkZ2V0LFxuICAgIG5ld0NvbmZpZyxcbiAgICBjaGFubmVsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aWRnZXRWaXNDb25maWdDaGFuZ2Uob2xkV2lkZ2V0LCBuZXdWaXNDb25maWcpIHtcbiAgLy8gY29uc29sZS5sb2coXG4gIC8vICAgJ3dpZGdldFZpc0NvbmZpZ0NoYW5nZScsXG4gIC8vICAgJ29sZFdpZGdldCcsXG4gIC8vICAgb2xkV2lkZ2V0LFxuICAvLyAgICduZXdWaXNDb25maWcnLFxuICAvLyAgIG5ld1Zpc0NvbmZpZ1xuICAvLyApO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLldJREdFVF9WSVNfQ09ORklHX0NIQU5HRSxcbiAgICBvbGRXaWRnZXQsXG4gICAgbmV3VmlzQ29uZmlnXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMYXllckJsZW5kaW5nKG1vZGUpIHtcbiAgLy8gY29uc29sZS5sb2coJ3VwZGF0ZUxheWVyQmxlbmRpbmcnLCAnbW9kZScsIG1vZGUpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlVQREFURV9MQVlFUl9CTEVORElORyxcbiAgICBtb2RlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZShjb25maWcpIHtcbiAgLy8gY29uc29sZS5sb2coJ2ludGVyYWN0aW9uQ29uZmlnQ2hhbmdlJywgJ2NvbmZpZycsIGNvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuSU5URVJBQ1RJT05fQ09ORklHX0NIQU5HRSxcbiAgICBjb25maWdcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlcihpZHgsIHByb3AsIHZhbHVlKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdzZXRGaWx0ZXInLCAnaWR4JywgaWR4LCAncHJvcCcsIHByb3AsICd2YWx1ZScsIHZhbHVlKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5TRVRfRklMVEVSLFxuICAgIGlkeCxcbiAgICBwcm9wLFxuICAgIHZhbHVlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRGaWx0ZXIoZGF0YUlkKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdhZGRGaWx0ZXInLCAnZGF0YUlEJywgZGF0YUlkKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5BRERfRklMVEVSLFxuICAgIGRhdGFJZFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkTGF5ZXIocHJvcHMpIHtcbiAgLy8gY29uc29sZS5sb2coJ2FkZExheWVyJywgJ3Byb3BzJywgcHJvcHMpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkFERF9MQVlFUixcbiAgICBwcm9wc1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkV2lkZ2V0KHByb3BzKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdhZGRXaWRnZXQnLCAncHJvcHMnLCBwcm9wcyk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuQUREX1dJREdFVCxcbiAgICBwcm9wc1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVvcmRlcldpZGdldChvcmRlcikge1xuICAvLyBjb25zb2xlLmxvZygncmVvcmRlcldpZGdldCcsICdvcmRlcicsIG9yZGVyKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRU9SREVSX1dJREdFVCxcbiAgICBvcmRlclxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVvcmRlckxheWVyKG9yZGVyKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdyZW9yZGVyTGF5ZXInLCAnb3JkZXInLCBvcmRlcik7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuUkVPUkRFUl9MQVlFUixcbiAgICBvcmRlclxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRmlsdGVyKGlkeCkge1xuICAvLyBjb25zb2xlLmxvZygncmVtb3ZlRmlsdGVyJywgJ2lkeCcsIGlkeCk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuUkVNT1ZFX0ZJTFRFUixcbiAgICBpZHhcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUxheWVyKGlkeCkge1xuICAvLyBjb25zb2xlLmxvZygncmVtb3ZlTGF5ZXInLCAnaWR4JywgaWR4KTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRU1PVkVfTEFZRVIsXG4gICAgaWR4XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVXaWRnZXQoaWR4KSB7XG4gIC8vIGNvbnNvbGUubG9nKCdyZW1vdmVXaWRnZXQnLCAnaWR4JywgaWR4KTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRU1PVkVfV0lER0VULFxuICAgIGlkeFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRGF0YXNldChrZXkpIHtcbiAgLy8gY29uc29sZS5sb2coJ3JlbW92ZURhdGFzZXQnLCAna2V5Jywga2V5KTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRU1PVkVfREFUQVNFVCxcbiAgICBrZXlcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3dEYXRhc2V0VGFibGUoZGF0YUlkKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdzaG93RGF0YXNldFRhYmxlJywgJ2RhdGFJZCcsIGRhdGFJZCk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU0hPV19EQVRBU0VUX1RBQkxFLFxuICAgIGRhdGFJZFxuICB9O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gZGF0YXNldHMgLSBBcnJheSBvZiBkYXRhc2V0cyA6XG4gKiB7aW5mbzoge2lkOiAnJywgY29sb3I6IGhleCwgbGFiZWw6ICcnXX0sIGRhdGE6IHtmaWVsZHM6IFtdLCByb3dzOiBbXX19XG4gKiBAcGFyYW0gb3B0aW9ucyB7Y2VudGVyTWFwLCByZWFkT25seX1cbiAqIEBwYXJhbSBjb25maWcge3Zpc1N0YXRlLCBtYXBTdGF0ZSwgbWFwU3R5bGV9XG4gKiBAcmV0dXJucyB7e3R5cGU6IG51bGwsIGRhdGFzZXRzOiAqLCBvcHRpb25zOiAqfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZpc0RhdGEoZGF0YXNldHMsIG9wdGlvbnMsIGNvbmZpZykge1xuICAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICAndXBkYXRlVmlzRGF0YScsXG4gIC8vICAgJ2RhdGFzZXRzJyxcbiAgLy8gICBkYXRhc2V0cyxcbiAgLy8gICAnb3B0aW9ucycsXG4gIC8vICAgb3B0aW9ucyxcbiAgLy8gICAnY29uZmlnJyxcbiAgLy8gICBjb25maWdcbiAgLy8gKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5VUERBVEVfVklTX0RBVEEsXG4gICAgZGF0YXNldHMsXG4gICAgb3B0aW9ucyxcbiAgICBjb25maWdcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZUFuaW1hdGlvbihpZHgpIHtcbiAgLy8gY29uc29sZS5sb2coJ3RvZ2dsZUFuaW1hdGlvbicsICdpZHgnLCBpZHgpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlRPR0dMRV9GSUxURVJfQU5JTUFUSU9OLFxuICAgIGlkeFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQW5pbWF0aW9uU3BlZWQoaWR4LCBzcGVlZCkge1xuICAvLyBjb25zb2xlLmxvZygndXBkYXRlQW5pbWF0aW9uJywgJ2lkeCcsIGlkeCwgJ3NwZWVkJywgc3BlZWQpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlVQREFURV9GSUxURVJfQU5JTUFUSU9OX1NQRUVELFxuICAgIGlkeCxcbiAgICBzcGVlZFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5sYXJnZUZpbHRlcihpZHgpIHtcbiAgLy8gY29uc29sZS5sb2coJ2VubGFyZ2VGaWx0ZXInLCAnaWR4JywgaWR4KTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5FTkxBUkdFX0ZJTFRFUixcbiAgICBpZHhcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uTGF5ZXJIb3ZlcihpbmZvKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdvbkxheWVySG92ZXInLCBpbmZvKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5MQVlFUl9IT1ZFUixcbiAgICBpbmZvXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvbkxheWVyQ2xpY2soaW5mbykge1xuICAvLyBjb25zb2xlLmxvZygnb25MYXllckNsaWNrJywgaW5mbyk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuTEFZRVJfQ0xJQ0ssXG4gICAgaW5mb1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25XaWRnZXRIb3ZlcihpbmZvKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdvbldpZGdldEhvdmVyJywgaW5mbyk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuV0lER0VUX0hPVkVSLFxuICAgIGluZm9cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uV2lkZ2V0Q2xpY2soaW5mbykge1xuICAvLyBjb25zb2xlLmxvZygnb25XaWRnZXRDbGljaycsIGluZm8pO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLldJREdFVF9DTElDSyxcbiAgICBpbmZvXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvbk1hcENsaWNrKCkge1xuICAvLyBjb25zb2xlLmxvZygnb25NYXBDbGljaycpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLk1BUF9DTElDS1xuICB9O1xufVxuXG4vKipcbiAqIFRvZ2dsZSBhIHNpbmdsZSBsYXllciBmb3IgYSBnaXZlIG1hcFxuICogQHBhcmFtIG1hcEluZGV4XG4gKiBAcGFyYW0gbGF5ZXJJZFxuICogQHJldHVybnMge3t0eXBlOiAqLCBtYXBJbmRleDogKiwgbGF5ZXJJZDogKn19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2dnbGVMYXllckZvck1hcChtYXBJbmRleCwgbGF5ZXJJZCkge1xuICAvLyBjb25zb2xlLmxvZygndG9nZ2xlTEF5ZXJGb3JNYXAnLCAnbWFwSW5kZXgnLCBtYXBJbmRleCwgJ2xheWVySWQnLCBsYXllcklkKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5UT0dHTEVfTEFZRVJfRk9SX01BUCxcbiAgICBtYXBJbmRleCxcbiAgICBsYXllcklkXG4gIH07XG59XG5cbi8qKlxuICogVG9nZ2xlIGEgc2luZ2xlIHdpZGdldCBmb3IgYSBnaXZlIG1hcFxuICogQHBhcmFtIG1hcEluZGV4XG4gKiBAcGFyYW0gd2lkZ2V0SWRcbiAqIEByZXR1cm5zIHt7dHlwZTogKiwgbWFwSW5kZXg6ICosIHdpZGdldElkOiAqfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZVdpZGdldEZvck1hcChtYXBJbmRleCwgd2lkZ2V0SWQpIHtcbiAgLy8gY29uc29sZS5sb2coJ3RvZ2dsZVdpZGdldEZvck1hcCcsIG1hcEluZGV4LCB3aWRnZXRJZCk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuVE9HR0xFX1dJREdFVF9GT1JfTUFQLFxuICAgIG1hcEluZGV4LFxuICAgIHdpZGdldElkXG4gIH07XG59XG5cbi8qKlxuICogVG9nZ2xlIGxheWVyIHZpc2liaWxpdHkgb24gc3BsaXQgdmlld3NcbiAqIEBwYXJhbSBsYXllckluZGV4IHRoZSBsYXllciB3ZSB3YW50IHRvIHRvZ2dsZSB2aXNpYmlsaXR5IG9uXG4gKiBAcGFyYW0gbWFwSW5kZXggdGhlIG1hcCBpbmRleFxuICogQHJldHVybnMge3t0eXBlOiBudWxsLCBsYXllckluZGV4OiAqLCBtYXBJbmRleDogKn19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWaXNpYmxlTGF5ZXJzRm9yTWFwKG1hcEluZGV4LCBsYXllcklkcykge1xuICAvLyBjb25zb2xlLmxvZygnc2V0VmlzaWJsZUxheWVyc0Zvck1hcCcsIG1hcEluZGV4LCBsYXllcklkcyk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuU0VUX1ZJU0lCTEVfTEFZRVJTX0ZPUl9NQVAsXG4gICAgbWFwSW5kZXgsXG4gICAgbGF5ZXJJZHNcbiAgfTtcbn1cblxuLyoqXG4gKiBUb2dnbGUgd2lkZ2V0IHZpc2liaWxpdHkgb24gc3BsaXQgdmlld3NcbiAqIEBwYXJhbSB3aWRnZXRJbmRleCB0aGUgd2lkZ2V0IHdlIHdhbnQgdG8gdG9nZ2xlIHZpc2liaWxpdHkgb25cbiAqIEBwYXJhbSBtYXBJbmRleCB0aGUgbWFwIGluZGV4XG4gKiBAcmV0dXJucyB7e3R5cGU6IG51bGwsIHdpZGdldEluZGV4OiAqLCBtYXBJbmRleDogKn19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWaXNpYmxlV2lkZ2V0c0Zvck1hcChtYXBJbmRleCwgd2lkZ2V0SWRzKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdzZXRWaXNpYmxlV2lkZ2V0c0Zvck1hcCcsIG1hcEluZGV4LCB3aWRnZXRJZHMpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLlNFVF9WSVNJQkxFX1dJREdFVFNfRk9SX01BUCxcbiAgICBtYXBJbmRleCxcbiAgICB3aWRnZXRJZHNcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlclBsb3QoaWR4LCBuZXdQcm9wKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdzZXRGaWx0ZXJQbG90JywgaWR4LCBuZXdQcm9wKTtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5TRVRfRklMVEVSX1BMT1QsXG4gICAgaWR4LFxuICAgIG5ld1Byb3BcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGaWxlcyhmaWxlcykge1xuICAvLyBjb25zb2xlLmxvZygnbG9hZEZpbGVzJywgZmlsZXMpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQURfRklMRVMsXG4gICAgZmlsZXNcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGaWxlc0VycihlcnJvcikge1xuICAvLyBjb25zb2xlLmxvZygnbG9hZEZpbGVzRXJyJywgZXJyb3IpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQURfRklMRVNfRVJSLFxuICAgIGVycm9yXG4gIH07XG59XG4iXX0=