kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
422 lines (361 loc) • 51 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireWildcard(require("prop-types"));
var _reselect = require("reselect");
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _lodash = _interopRequireDefault(require("lodash.get"));
var _panelHeaderAction = _interopRequireDefault(require("../panel-header-action"));
var _fieldSelector = _interopRequireDefault(require("../../common/field-selector"));
var _icons = require("../../common/icons");
var _sourceDataSelector = _interopRequireDefault(require("../common/source-data-selector"));
var _styledComponents2 = require("../../common/styled-components");
var _filterPanelHeader = _interopRequireDefault(require("./filter-panel-header"));
var _newFilterPanel = _interopRequireDefault(require("../../filters/filter-panels/new-filter-panel"));
var _timeRangeFilterPanel = _interopRequireDefault(require("../../filters/filter-panels/time-range-filter-panel"));
var _singleSelectFilterPanel = _interopRequireDefault(require("../../filters/filter-panels/single-select-filter-panel"));
var _multiSelectFilterPanel = _interopRequireDefault(require("../../filters/filter-panels/multi-select-filter-panel"));
var _rangeFilterPanel = _interopRequireDefault(require("../../filters/filter-panels/range-filter-panel"));
var _polygonFilterPanel = _interopRequireDefault(require("../../filters/filter-panels/polygon-filter-panel"));
var _filterUtils = require("../../../utils/filter-utils");
var _defaultSettings = require("../../../constants/default-settings");
var _axios = _interopRequireDefault(require("axios"));
var _d3Array = require("d3-array");
var _templateObject, _templateObject2, _templateObject3;
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var StyledFilterPanel = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 12px;\n border-radius: 1px;\n .filter-panel__filter {\n margin-top: 24px;\n }\n"])));
var StyledFilterHeader = (0, _styledComponents["default"])(_styledComponents2.StyledPanelHeader)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n cursor: pointer;\n padding: 10px 12px;\n .field-selector {\n width: calc(100% - 58px);\n }\n"])));
var StyledFilterContent = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n padding: 12px;\n"])), function (props) {
return props.theme.panelBackground;
});
FilterPanelFactory.deps = [_newFilterPanel["default"], _timeRangeFilterPanel["default"], _singleSelectFilterPanel["default"], _multiSelectFilterPanel["default"], _rangeFilterPanel["default"], _polygonFilterPanel["default"]];
function FilterPanelFactory(NewFilterPanel, TimeRangeFilterPanel, SingleSelectFilterPanel, MultiSelectFilterPanel, RangeFilterPanel, PolygonFilterPanel) {
var _FilterPanelComponent, _class, _temp;
var FilterPanelComponents = (_FilterPanelComponent = {
"default": NewFilterPanel
}, (0, _defineProperty2["default"])(_FilterPanelComponent, _filterUtils.FILTER_TYPES.timeRange, TimeRangeFilterPanel), (0, _defineProperty2["default"])(_FilterPanelComponent, _filterUtils.FILTER_TYPES.select, SingleSelectFilterPanel), (0, _defineProperty2["default"])(_FilterPanelComponent, _filterUtils.FILTER_TYPES.multiSelect, MultiSelectFilterPanel), (0, _defineProperty2["default"])(_FilterPanelComponent, _filterUtils.FILTER_TYPES.range, RangeFilterPanel), (0, _defineProperty2["default"])(_FilterPanelComponent, _filterUtils.FILTER_TYPES.polygon, PolygonFilterPanel), _FilterPanelComponent);
return _temp = _class = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(FilterPanel, _Component);
var _super = _createSuper(FilterPanel);
function FilterPanel() {
var _this;
(0, _classCallCheck2["default"])(this, FilterPanel);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
/* selectors */
// fieldsSelector = props =>
// (props.filter.dataId && props.datasets[props.filter.dataId].fields) || [];
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "fieldsSelector", function (props) {
var datasetId = props.filter.dataId[0];
if (!datasetId) {
return [];
}
return (0, _lodash["default"])(props, ['datasets', datasetId, 'fields'], []);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "filterSelector", function (props) {
return props.filters;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "nameSelector", function (props) {
return props.filter.name;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "dataIdSelector", function (props) {
return props.filter.dataId[0];
});
// only show current field and field that's not already been used as a filter
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "availableFieldsSelector", (0, _reselect.createSelector)(_this.fieldsSelector, _this.filterSelector, _this.nameSelector, _this.dataIdSelector, function (fields, filters, name, dataId) {
return fields.filter(function (f) {
return f.type && f.type !== _defaultSettings.ALL_FIELD_TYPES.geojson && (f.name[0] === name[0] || !filters.find(function (d) {
return d.name[0] === f.name && d.dataId[0] === dataId;
}));
});
}));
return _this;
}
(0, _createClass2["default"])(FilterPanel, [{
key: "filterApi",
value: function filterApi(idx, value, dataId, datasets, auth, project, setFilterAPI) {
var fieldName = value.name;
var _datasets$dataId = datasets[dataId],
fields = _datasets$dataId.fields,
indexName = _datasets$dataId.indexName;
var fieldIdx = fields.findIndex(function (f) {
return f.name === fieldName;
});
var fieldType = fieldName && fields[fieldIdx].type === 'string' ? 'string' : fieldName && fields[fieldIdx].type === 'integer' || fields[fieldIdx].type === 'real' ? 'numeric' : 'datetime'; // const userId = 'uid';
var uid = auth.uid;
var isEdit = project.isEdit; // const {setFilterAPI} = this.props;
// if fieldType is string inside filter then send string else send numeric
var filterAPIData = {
fieldName: fieldName,
userId: uid,
permissionType: isEdit,
fieldType: fieldType,
indexName: indexName
};
var config = {
headers: {
'Content-Type': 'application/json'
}
};
_axios["default"].post("".concat(_defaultSettings.ON_PREMESIS_URL, "/geoiqutilities/filter/v1.0/fetch"), filterAPIData, config).then(function (result) {
var domain;
var histogram;
var data = result.data.data; // this is written for real and integer fields
var domainKeys = Object.keys(data);
if (fieldType !== 'string') {
histogram = domainKeys.reduce(function (accu, range) {
var count = data[range];
var bin = {
count: count,
x0: Number(range.split('&&')[0]),
x1: Number(range.split('&&')[1])
};
accu.push(bin);
return accu;
}, []);
histogram = histogram.sort(function (a, b) {
return a.x1 - b.x1;
});
domain = [histogram[0].x0, histogram[histogram.length - 1].x1];
} else {
domain = domainKeys;
} // write data conversion to domain for string type fields
setFilterAPI(idx, 'name', value.name, 0, dataId, domain, histogram);
});
}
}, {
key: "render",
value: function render() {
var _this$props = this.props,
filter = _this$props.filter,
setFilterAPI = _this$props.setFilterAPI;
var type = filter.type,
dataId = filter.dataId;
var FilterFilterComponent = type && FilterPanelComponents[type] || FilterPanelComponents["default"];
var allAvailableFields = this.availableFieldsSelector(this.props);
return (/*#__PURE__*/_react["default"].createElement(StyledFilterPanel, {
className: "filter-panel"
}, /*#__PURE__*/_react["default"].createElement(FilterFilterComponent, (0, _extends2["default"])({
allAvailableFields: allAvailableFields,
dataId: dataId,
filterApi: this.filterApi,
setFilterAPI: setFilterAPI
}, this.props)))
);
}
}]);
return FilterPanel;
}(_react.Component), (0, _defineProperty2["default"])(_class, "propTypes", {
idx: _propTypes["default"].number,
filters: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired,
filter: _propTypes["default"].object.isRequired,
layers: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired,
setFilter: _propTypes["default"].func.isRequired,
removeFilter: _propTypes["default"].func.isRequired,
enlargeFilter: _propTypes["default"].func.isRequired,
toggleAnimation: _propTypes["default"].func.isRequired,
datasets: _propTypes["default"].object,
showDatasetTable: _propTypes["default"].func,
isAnyFilterAnimating: _propTypes["default"].bool,
mapState: _propTypes["default"].object,
auth: _propTypes["default"].object.isRequired,
project: _propTypes["default"].object.isRequired
}), _temp; // render() {
// const {
// datasets,
// enlargeFilter,
// filter,
// idx,
// isAnyFilterAnimating,
// removeFilter,
// setFilter,
// toggleAnimation,
// mapState,
// auth,
// project
// } = this.props;
// const {name, enlarged, type, dataId} = filter;
// const FilterComponent = type && FilterComponents[FILTER_COMPONENTS[type]];
// const allAvailableFields = this.availableFieldsSelector(this.props);
// return (
// <StyledFilterPanel className="filter-panel">
// <StyledFilterHeader
// className="filter-panel__header"
// labelRCGColorValues={datasets[dataId].color}
// >
// <FieldSelector
// inputTheme="secondary"
// fields={allAvailableFields}
// value={Array.isArray(name) ? name[0] : name}
// erasable={false}
// onSelect={value =>
// this.filterApi(idx, value, dataId, datasets, auth, project)
// }
// />
// <PanelHeaderAction
// id={filter.id}
// tooltip="delete"
// tooltipType="error"
// onClick={removeFilter}
// hoverColor={'errorColor'}
// IconComponent={Trash}
// />
// {type === FILTER_TYPES.timeRange && (
// <PanelHeaderAction
// id={filter.id}
// onClick={enlargeFilter}
// tooltip="Time Playback"
// IconComponent={Clock}
// active={enlarged}
// />
// )}
// </StyledFilterHeader>
// <StyledFilterContent className="filter-panel__content">
// {Object.keys(datasets).length > 1 && (
// <SourceDataSelector
// inputTheme="secondary"
// datasets={datasets}
// disabled={filter.freeze}
// dataId={filter.dataId}
// onSelect={value => setFilter(idx, 'dataId', value)}
// />
// )}
// {type && !enlarged && (
// <div className="filter-panel__filter">
// <FilterComponent
// filter={filter}
// idx={idx}
// isAnyFilterAnimating={isAnyFilterAnimating}
// toggleAnimation={toggleAnimation}
// setFilter={value =>
// setFilter(idx, 'value', value, 0, mapState, auth, project)
// }
// />
// </div>
// )}
// </StyledFilterContent>
// </StyledFilterPanel>
// );
// }
// };
}
var _default = exports["default"] = FilterPanelFactory; // import React, { Component } from "react";
// import PropTypes from "prop-types";
// import { createSelector } from "reselect";
// import styled from "styled-components";
// import { FILTER_TYPES } from "utils/filter-utils";
// import { ALL_FIELD_TYPES } from "constants/default-settings";
// import FilterPanelHeaderFactory from "components/side-panel/filter-panel/filter-panel-header";
// import NewFilterPanelFactory from "components/filters/filter-panels/new-filter-panel";
// import TimeRangeFilterPanelFactory from "components/filters/filter-panels/time-range-filter-panel";
// import SingleSelectFilterPanelFactory from "components/filters/filter-panels/single-select-filter-panel";
// import MultiSelectFilterPanelFactory from "components/filters/filter-panels/multi-select-filter-panel";
// import RangeFilterPanelFactory from "components/filters/filter-panels/range-filter-panel";
// import PolygonFilterPanelFactory from "components/filters/filter-panels/polygon-filter-panel";
// const StyledFilterPanel = styled.div`
// margin-bottom: 12px;
// border-radius: 1px;
// .filter-panel__filter {
// margin-top: 24px;
// }
// `;
// FilterPanelFactory.deps = [
// FilterPanelHeaderFactory,
// NewFilterPanelFactory,
// TimeRangeFilterPanelFactory,
// SingleSelectFilterPanelFactory,
// MultiSelectFilterPanelFactory,
// RangeFilterPanelFactory,
// PolygonFilterPanelFactory
// ];
// function FilterPanelFactory(
// FilterPanelHeader,
// NewFilterPanel,
// TimeRangeFilterPanel,
// SingleSelectFilterPanel,
// MultiSelectFilterPanel,
// RangeFilterPanel,
// PolygonFilterPanel
// ) {
// const FilterPanelComponents = {
// default: NewFilterPanel,
// [FILTER_TYPES.timeRange]: TimeRangeFilterPanel,
// [FILTER_TYPES.select]: SingleSelectFilterPanel,
// [FILTER_TYPES.multiSelect]: MultiSelectFilterPanel,
// [FILTER_TYPES.range]: RangeFilterPanel,
// [FILTER_TYPES.polygon]: PolygonFilterPanel
// };
// return class FilterPanel extends Component {
// static propTypes = {
// idx: PropTypes.number,
// filters: PropTypes.arrayOf(PropTypes.any).isRequired,
// filter: PropTypes.object.isRequired,
// setFilter: PropTypes.func.isRequired,
// removeFilter: PropTypes.func.isRequired,
// enlargeFilter: PropTypes.func.isRequired,
// toggleAnimation: PropTypes.func.isRequired,
// datasets: PropTypes.object,
// showDatasetTable: PropTypes.func,
// isAnyFilterAnimating: PropTypes.bool
// };
// /* selectors */
// fieldsSelector = props =>
// (props.filter.dataId[0] &&
// props.datasets[props.filter.dataId[0]].fields) ||
// [];
// filterSelector = props => props.filters;
// nameSelector = props => props.filter.name;
// dataIdSelector = props => props.filter.dataId[0];
// // only show current field and field that's not already been used as a filter
// availableFieldsSelector = createSelector(
// this.fieldsSelector,
// this.filterSelector,
// this.nameSelector,
// this.dataIdSelector,
// (fields, filters, name, dataId) =>
// fields.filter(
// f =>
// f.type &&
// f.type !== ALL_FIELD_TYPES.geojson &&
// (f.name === name ||
// !filters.find(d => d.name === f.name && d.dataId === dataId))
// )
// );
// render() {
// const { filter } = this.props;
// const { type } = filter;
// const FilterFilterComponent =
// (type && FilterPanelComponents[type]) || FilterPanelComponents.default;
// const allAvailableFields = this.availableFieldsSelector(this.props);
// return (
// <StyledFilterPanel className="filter-panel">
// <FilterFilterComponent
// allAvailableFields={allAvailableFields}
// {...this.props}
// />
// </StyledFilterPanel>
// );
// }
// };
// }
// export default FilterPanelFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvZmlsdGVyLXBhbmVsL2ZpbHRlci1wYW5lbC5qcyJdLCJuYW1lcyI6WyJTdHlsZWRGaWx0ZXJQYW5lbCIsInN0eWxlZCIsImRpdiIsIlN0eWxlZEZpbHRlckhlYWRlciIsIlN0eWxlZFBhbmVsSGVhZGVyIiwiU3R5bGVkRmlsdGVyQ29udGVudCIsInByb3BzIiwidGhlbWUiLCJwYW5lbEJhY2tncm91bmQiLCJGaWx0ZXJQYW5lbEZhY3RvcnkiLCJkZXBzIiwiTmV3RmlsdGVyUGFuZWxGYWN0b3J5IiwiVGltZVJhbmdlRmlsdGVyUGFuZWxGYWN0b3J5IiwiU2luZ2xlU2VsZWN0RmlsdGVyUGFuZWxGYWN0b3J5IiwiTXVsdGlTZWxlY3RGaWx0ZXJQYW5lbEZhY3RvcnkiLCJSYW5nZUZpbHRlclBhbmVsRmFjdG9yeSIsIlBvbHlnb25GaWx0ZXJQYW5lbEZhY3RvcnkiLCJOZXdGaWx0ZXJQYW5lbCIsIlRpbWVSYW5nZUZpbHRlclBhbmVsIiwiU2luZ2xlU2VsZWN0RmlsdGVyUGFuZWwiLCJNdWx0aVNlbGVjdEZpbHRlclBhbmVsIiwiUmFuZ2VGaWx0ZXJQYW5lbCIsIlBvbHlnb25GaWx0ZXJQYW5lbCIsIkZpbHRlclBhbmVsQ29tcG9uZW50cyIsIkZJTFRFUl9UWVBFUyIsInRpbWVSYW5nZSIsInNlbGVjdCIsIm11bHRpU2VsZWN0IiwicmFuZ2UiLCJwb2x5Z29uIiwiZGF0YXNldElkIiwiZmlsdGVyIiwiZGF0YUlkIiwiZmlsdGVycyIsIm5hbWUiLCJmaWVsZHNTZWxlY3RvciIsImZpbHRlclNlbGVjdG9yIiwibmFtZVNlbGVjdG9yIiwiZGF0YUlkU2VsZWN0b3IiLCJmaWVsZHMiLCJmIiwidHlwZSIsIkFMTF9GSUVMRF9UWVBFUyIsImdlb2pzb24iLCJmaW5kIiwiZCIsImlkeCIsInZhbHVlIiwiZGF0YXNldHMiLCJhdXRoIiwicHJvamVjdCIsInNldEZpbHRlckFQSSIsImZpZWxkTmFtZSIsImluZGV4TmFtZSIsImZpZWxkSWR4IiwiZmluZEluZGV4IiwiZmllbGRUeXBlIiwidWlkIiwiaXNFZGl0IiwiZmlsdGVyQVBJRGF0YSIsInVzZXJJZCIsInBlcm1pc3Npb25UeXBlIiwiY29uZmlnIiwiaGVhZGVycyIsImF4aW9zIiwicG9zdCIsIk9OX1BSRU1FU0lTX1VSTCIsInRoZW4iLCJyZXN1bHQiLCJkb21haW4iLCJoaXN0b2dyYW0iLCJkYXRhIiwiZG9tYWluS2V5cyIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJhY2N1IiwiY291bnQiLCJiaW4iLCJ4MCIsIk51bWJlciIsInNwbGl0IiwieDEiLCJwdXNoIiwic29ydCIsImEiLCJiIiwibGVuZ3RoIiwiRmlsdGVyRmlsdGVyQ29tcG9uZW50IiwiYWxsQXZhaWxhYmxlRmllbGRzIiwiYXZhaWxhYmxlRmllbGRzU2VsZWN0b3IiLCJmaWx0ZXJBcGkiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJudW1iZXIiLCJhcnJheU9mIiwiYW55IiwiaXNSZXF1aXJlZCIsIm9iamVjdCIsImxheWVycyIsInNldEZpbHRlciIsImZ1bmMiLCJyZW1vdmVGaWx0ZXIiLCJlbmxhcmdlRmlsdGVyIiwidG9nZ2xlQW5pbWF0aW9uIiwic2hvd0RhdGFzZXRUYWJsZSIsImlzQW55RmlsdGVyQW5pbWF0aW5nIiwiYm9vbCIsIm1hcFN0YXRlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFFQTs7QUFDQTs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEsaUJBQWlCLEdBQUdDLDZCQUFPQyxHQUFWLDhMQUF2Qjs7QUFRQSxJQUFNQyxrQkFBa0IsR0FBRyxrQ0FBT0Msb0NBQVAsQ0FBSCw4TEFBeEI7O0FBUUEsSUFBTUMsbUJBQW1CLEdB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QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzLCB7c3RyaW5nfSBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7Y3JlYXRlU2VsZWN0b3J9IGZyb20gJ3Jlc2VsZWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2guZ2V0JztcbmltcG9ydCBQYW5lbEhlYWRlckFjdGlvbiBmcm9tICdjb21wb25lbnRzL3NpZGUtcGFuZWwvcGFuZWwtaGVhZGVyLWFjdGlvbic7XG5pbXBvcnQgRmllbGRTZWxlY3RvciBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9maWVsZC1zZWxlY3Rvcic7XG5pbXBvcnQge1RyYXNoLCBDbG9ja30gZnJvbSAnY29tcG9uZW50cy9jb21tb24vaWNvbnMnO1xuaW1wb3J0IFNvdXJjZURhdGFTZWxlY3RvckZhY3RvcnkgZnJvbSAnY29tcG9uZW50cy9zaWRlLXBhbmVsL2NvbW1vbi9zb3VyY2UtZGF0YS1zZWxlY3Rvcic7XG5pbXBvcnQge1N0eWxlZFBhbmVsSGVhZGVyfSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCBGaWx0ZXJQYW5lbEhlYWRlckZhY3RvcnkgZnJvbSAnY29tcG9uZW50cy9zaWRlLXBhbmVsL2ZpbHRlci1wYW5lbC9maWx0ZXItcGFuZWwtaGVhZGVyJztcbmltcG9ydCBOZXdGaWx0ZXJQYW5lbEZhY3RvcnkgZnJvbSAnY29tcG9uZW50cy9maWx0ZXJzL2ZpbHRlci1wYW5lbHMvbmV3LWZpbHRlci1wYW5lbCc7XG5pbXBvcnQgVGltZVJhbmdlRmlsdGVyUGFuZWxGYWN0b3J5IGZyb20gJ2NvbXBvbmVudHMvZmlsdGVycy9maWx0ZXItcGFuZWxzL3RpbWUtcmFuZ2UtZmlsdGVyLXBhbmVsJztcbmltcG9ydCBTaW5nbGVTZWxlY3RGaWx0ZXJQYW5lbEZhY3RvcnkgZnJvbSAnY29tcG9uZW50cy9maWx0ZXJzL2ZpbHRlci1wYW5lbHMvc2luZ2xlLXNlbGVjdC1maWx0ZXItcGFuZWwnO1xuaW1wb3J0IE11bHRpU2VsZWN0RmlsdGVyUGFuZWxGYWN0b3J5IGZyb20gJ2NvbXBvbmVudHMvZmlsdGVycy9maWx0ZXItcGFuZWxzL211bHRpLXNlbGVjdC1maWx0ZXItcGFuZWwnO1xuaW1wb3J0IFJhbmdlRmlsdGVyUGFuZWxGYWN0b3J5IGZyb20gJ2NvbXBvbmVudHMvZmlsdGVycy9maWx0ZXItcGFuZWxzL3JhbmdlLWZpbHRlci1wYW5lbCc7XG5pbXBvcnQgUG9seWdvbkZpbHRlclBhbmVsRmFjdG9yeSBmcm9tICdjb21wb25lbnRzL2ZpbHRlcnMvZmlsdGVyLXBhbmVscy9wb2x5Z29uLWZpbHRlci1wYW5lbCc7XG4vLyBpbXBvcnQgUG9seWdvbkZpbHRlclBhbmVsRmFjdG9yeSBmcm9tICdjb21wb25lbnRzL2ZpbHRlcnMvcG9seWdvbi1maWx0ZXInO1xuaW1wb3J0IHtGSUxURVJfVFlQRVMsIEZJTFRFUl9DT01QT05FTlRTfSBmcm9tICd1dGlscy9maWx0ZXItdXRpbHMnO1xuaW1wb3J0IHtBTExfRklFTERfVFlQRVMsIE9OX1BSRU1FU0lTX1VSTH0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHtoaXN0b2dyYW19IGZyb20gJ2QzLWFycmF5JztcblxuY29uc3QgU3R5bGVkRmlsdGVyUGFuZWwgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICBib3JkZXItcmFkaXVzOiAxcHg7XG4gIC5maWx0ZXItcGFuZWxfX2ZpbHRlciB7XG4gICAgbWFyZ2luLXRvcDogMjRweDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkRmlsdGVySGVhZGVyID0gc3R5bGVkKFN0eWxlZFBhbmVsSGVhZGVyKWBcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiAxMHB4IDEycHg7XG4gIC5maWVsZC1zZWxlY3RvciB7XG4gICAgd2lkdGg6IGNhbGMoMTAwJSAtIDU4cHgpO1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRGaWx0ZXJDb250ZW50ID0gc3R5bGVkLmRpdmBcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmR9O1xuICBwYWRkaW5nOiAxMnB4O1xuYDtcblxuRmlsdGVyUGFuZWxGYWN0b3J5LmRlcHMgPSBbXG4gIE5ld0ZpbHRlclBhbmVsRmFjdG9yeSxcbiAgVGltZVJhbmdlRmlsdGVyUGFuZWxGYWN0b3J5LFxuICBTaW5nbGVTZWxlY3RGaWx0ZXJQYW5lbEZhY3RvcnksXG4gIE11bHRpU2VsZWN0RmlsdGVyUGFuZWxGYWN0b3J5LFxuICBSYW5nZUZpbHRlclBhbmVsRmFjdG9yeSxcbiAgUG9seWdvbkZpbHRlclBhbmVsRmFjdG9yeVxuXTtcblxuZnVuY3Rpb24gRmlsdGVyUGFuZWxGYWN0b3J5KFxuICBOZXdGaWx0ZXJQYW5lbCxcbiAgVGltZVJhbmdlRmlsdGVyUGFuZWwsXG4gIFNpbmdsZVNlbGVjdEZpbHRlclBhbmVsLFxuICBNdWx0aVNlbGVjdEZpbHRlclBhbmVsLFxuICBSYW5nZUZpbHRlclBhbmVsLFxuICBQb2x5Z29uRmlsdGVyUGFuZWxcbikge1xuICBjb25zdCBGaWx0ZXJQYW5lbENvbXBvbmVudHMgPSB7XG4gICAgZGVmYXVsdDogTmV3RmlsdGVyUGFuZWwsXG4gICAgW0ZJTFRFUl9UWVBFUy50aW1lUmFuZ2VdOiBUaW1lUmFuZ2VGaWx0ZXJQYW5lbCxcbiAgICBbRklMVEVSX1RZUEVTLnNlbGVjdF06IFNpbmdsZVNlbGVjdEZpbHRlclBhbmVsLFxuICAgIFtGSUxURVJfVFlQRVMubXVsdGlTZWxlY3RdOiBNdWx0aVNlbGVjdEZpbHRlclBhbmVsLFxuICAgIFtGSUxURVJfVFlQRVMucmFuZ2VdOiBSYW5nZUZpbHRlclBhbmVsLFxuICAgIFtGSUxURVJfVFlQRVMucG9seWdvbl06IFBvbHlnb25GaWx0ZXJQYW5lbFxuICB9O1xuXG4gIHJldHVybiBjbGFzcyBGaWx0ZXJQYW5lbCBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgIGlkeDogUHJvcFR5cGVzLm51bWJlcixcbiAgICAgIGZpbHRlcnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLmlzUmVxdWlyZWQsXG4gICAgICBmaWx0ZXI6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSkuaXNSZXF1aXJlZCxcbiAgICAgIHNldEZpbHRlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHJlbW92ZUZpbHRlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGVubGFyZ2VGaWx0ZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICB0b2dnbGVBbmltYXRpb246IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBkYXRhc2V0czogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIHNob3dEYXRhc2V0VGFibGU6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgaXNBbnlGaWx0ZXJBbmltYXRpbmc6IFByb3BUeXBlcy5ib29sLFxuICAgICAgbWFwU3RhdGU6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICBhdXRoOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgICBwcm9qZWN0OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbiAgICB9O1xuXG4gICAgLyogc2VsZWN0b3JzICovXG4gICAgLy8gZmllbGRzU2VsZWN0b3IgPSBwcm9wcyA9PlxuICAgIC8vICAgKHByb3BzLmZpbHRlci5kYXRhSWQgJiYgcHJvcHMuZGF0YXNldHNbcHJvcHMuZmlsdGVyLmRhdGFJZF0uZmllbGRzKSB8fCBbXTtcbiAgICBmaWVsZHNTZWxlY3RvciA9IHByb3BzID0+IHtcbiAgICAgIGNvbnN0IGRhdGFzZXRJZCA9IHByb3BzLmZpbHRlci5kYXRhSWRbMF07XG4gICAgICBpZiAoIWRhdGFzZXRJZCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0KHByb3BzLCBbJ2RhdGFzZXRzJywgZGF0YXNldElkLCAnZmllbGRzJ10sIFtdKTtcbiAgICB9O1xuICAgIGZpbHRlclNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMuZmlsdGVycztcbiAgICBuYW1lU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5maWx0ZXIubmFtZTtcbiAgICBkYXRhSWRTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLmZpbHRlci5kYXRhSWRbMF07XG5cbiAgICAvLyBvbmx5IHNob3cgY3VycmVudCBmaWVsZCBhbmQgZmllbGQgdGhhdCdzIG5vdCBhbHJlYWR5IGJlZW4gdXNlZCBhcyBhIGZpbHRlclxuICAgIGF2YWlsYWJsZUZpZWxkc1NlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLmZpZWxkc1NlbGVjdG9yLFxuICAgICAgdGhpcy5maWx0ZXJTZWxlY3RvcixcbiAgICAgIHRoaXMubmFtZVNlbGVjdG9yLFxuICAgICAgdGhpcy5kYXRhSWRTZWxlY3RvcixcbiAgICAgIChmaWVsZHMsIGZpbHRlcnMsIG5hbWUsIGRhdGFJZCkgPT5cbiAgICAgICAgZmllbGRzLmZpbHRlcihcbiAgICAgICAgICBmID0+XG4gICAgICAgICAgICBmLnR5cGUgJiZcbiAgICAgICAgICAgIGYudHlwZSAhPT0gQUxMX0ZJRUxEX1RZUEVTLmdlb2pzb24gJiZcbiAgICAgICAgICAgIChmLm5hbWVbMF0gPT09IG5hbWVbMF0gfHxcbiAgICAgICAgICAgICAgIWZpbHRlcnMuZmluZChcbiAgICAgICAgICAgICAgICBkID0+IGQubmFtZVswXSA9PT0gZi5uYW1lICYmIGQuZGF0YUlkWzBdID09PSBkYXRhSWRcbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgKVxuICAgICk7XG5cbiAgICBmaWx0ZXJBcGkoaWR4LCB2YWx1ZSwgZGF0YUlkLCBkYXRhc2V0cywgYXV0aCwgcHJvamVjdCwgc2V0RmlsdGVyQVBJKSB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgdmFyIHtmaWVsZHMsIGluZGV4TmFtZX0gPSBkYXRhc2V0c1tkYXRhSWRdO1xuICAgICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KGYgPT4gZi5uYW1lID09PSBmaWVsZE5hbWUpO1xuICAgICAgY29uc3QgZmllbGRUeXBlID1cbiAgICAgICAgZmllbGROYW1lICYmIGZpZWxkc1tmaWVsZElkeF0udHlwZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/ICdzdHJpbmcnXG4gICAgICAgICAgOiAoZmllbGROYW1lICYmIGZpZWxkc1tmaWVsZElkeF0udHlwZSA9PT0gJ2ludGVnZXInKSB8fFxuICAgICAgICAgICAgZmllbGRzW2ZpZWxkSWR4XS50eXBlID09PSAncmVhbCdcbiAgICAgICAgICA/ICdudW1lcmljJ1xuICAgICAgICAgIDogJ2RhdGV0aW1lJztcbiAgICAgIC8vIGNvbnN0IHVzZXJJZCA9ICd1aWQnO1xuICAgICAgY29uc3Qge3VpZH0gPSBhdXRoO1xuICAgICAgY29uc3Qge2lzRWRpdH0gPSBwcm9qZWN0O1xuXG4gICAgICAvLyBjb25zdCB7c2V0RmlsdGVyQVBJfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIC8vIGlmIGZpZWxkVHlwZSBpcyBzdHJpbmcgaW5zaWRlIGZpbHRlciB0aGVuIHNlbmQgc3RyaW5nIGVsc2Ugc2VuZCBudW1lcmljXG4gICAgICBjb25zdCBmaWx0ZXJBUElEYXRhID0ge1xuICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgIHVzZXJJZDogdWlkLFxuICAgICAgICBwZXJtaXNzaW9uVHlwZTogaXNFZGl0LFxuICAgICAgICBmaWVsZFR5cGUsXG4gICAgICAgIGluZGV4TmFtZVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGF4aW9zXG4gICAgICAgIC5wb3N0KFxuICAgICAgICAgIGAke09OX1BSRU1FU0lTX1VSTH0vZ2VvaXF1dGlsaXRpZXMvZmlsdGVyL3YxLjAvZmV0Y2hgLFxuICAgICAgICAgIGZpbHRlckFQSURhdGEsXG4gICAgICAgICAgY29uZmlnXG4gICAgICAgIClcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICB2YXIgZG9tYWluO1xuICAgICAgICAgIHZhciBoaXN0b2dyYW07XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3VsdC5kYXRhLmRhdGE7XG5cbiAgICAgICAgICAvLyB0aGlzIGlzIHdyaXR0ZW4gZm9yIHJlYWwgYW5kIGludGVnZXIgZmllbGRzXG5cbiAgICAgICAgICBjb25zdCBkb21haW5LZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG5cbiAgICAgICAgICBpZiAoZmllbGRUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaGlzdG9ncmFtID0gZG9tYWluS2V5cy5yZWR1Y2UoKGFjY3UsIHJhbmdlKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gZGF0YVtyYW5nZV07XG4gICAgICAgICAgICAgIGNvbnN0IGJpbiA9IHtcbiAgICAgICAgICAgICAgICBjb3VudCxcbiAgICAgICAgICAgICAgICB4MDogTnVtYmVyKHJhbmdlLnNwbGl0KCcmJicpWzBdKSxcbiAgICAgICAgICAgICAgICB4MTogTnVtYmVyKHJhbmdlLnNwbGl0KCcmJicpWzFdKVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBhY2N1LnB1c2goYmluKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGFjY3U7XG4gICAgICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgICAgIGhpc3RvZ3JhbSA9IGhpc3RvZ3JhbS5zb3J0KChhLCBiKSA9PiBhLngxIC0gYi54MSk7XG4gICAgICAgICAgICBkb21haW4gPSBbaGlzdG9ncmFtWzBdLngwLCBoaXN0b2dyYW1baGlzdG9ncmFtLmxlbmd0aCAtIDFdLngxXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9tYWluID0gZG9tYWluS2V5cztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyB3cml0ZSBkYXRhIGNvbnZlcnNpb24gdG8gZG9tYWluIGZvciBzdHJpbmcgdHlwZSBmaWVsZHNcblxuICAgICAgICAgIHNldEZpbHRlckFQSShpZHgsICduYW1lJywgdmFsdWUubmFtZSwgMCwgZGF0YUlkLCBkb21haW4sIGhpc3RvZ3JhbSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtmaWx0ZXIsIHNldEZpbHRlckFQSX0gPSB0aGlzLnByb3BzO1xuXG4gICAgICBjb25zdCB7dHlwZSwgZGF0YUlkfSA9IGZpbHRlcjtcbiAgICAgIGNvbnN0IEZpbHRlckZpbHRlckNvbXBvbmVudCA9XG4gICAgICAgICh0eXBlICYmIEZpbHRlclBhbmVsQ29tcG9uZW50c1t0eXBlXSkgfHwgRmlsdGVyUGFuZWxDb21wb25lbnRzLmRlZmF1bHQ7XG4gICAgICBjb25zdCBhbGxBdmFpbGFibGVGaWVsZHMgPSB0aGlzLmF2YWlsYWJsZUZpZWxkc1NlbGVjdG9yKHRoaXMucHJvcHMpO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U3R5bGVkRmlsdGVyUGFuZWwgY2xhc3NOYW1lPVwiZmlsdGVyLXBhbmVsXCI+XG4gICAgICAgICAgPEZpbHRlckZpbHRlckNvbXBvbmVudFxuICAgICAgICAgICAgYWxsQXZhaWxhYmxlRmllbGRzPXthbGxBdmFpbGFibGVGaWVsZHN9XG4gICAgICAgICAgICBkYXRhSWQ9e2RhdGFJZH1cbiAgICAgICAgICAgIGZpbHRlckFwaT17dGhpcy5maWx0ZXJBcGl9XG4gICAgICAgICAgICBzZXRGaWx0ZXJBUEk9e3NldEZpbHRlckFQSX1cbiAgICAgICAgICAgIHsuLi50aGlzLnByb3BzfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvU3R5bGVkRmlsdGVyUGFuZWw+XG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgLy8gICByZW5kZXIoKSB7XG4gIC8vICAgICBjb25zdCB7XG4gIC8vICAgICAgIGRhdGFzZXRzLFxuICAvLyAgICAgICBlbmxhcmdlRmlsdGVyLFxuICAvLyAgICAgICBmaWx0ZXIsXG4gIC8vICAgICAgIGlkeCxcbiAgLy8gICAgICAgaXNBbnlGaWx0ZXJBbmltYXRpbmcsXG4gIC8vICAgICAgIHJlbW92ZUZpbHRlcixcbiAgLy8gICAgICAgc2V0RmlsdGVyLFxuICAvLyAgICAgICB0b2dnbGVBbmltYXRpb24sXG4gIC8vICAgICAgIG1hcFN0YXRlLFxuICAvLyAgICAgICBhdXRoLFxuICAvLyAgICAgICBwcm9qZWN0XG4gIC8vICAgICB9ID0gdGhpcy5wcm9wcztcbiAgLy8gICAgIGNvbnN0IHtuYW1lLCBlbmxhcmdlZCwgdHlwZSwgZGF0YUlkfSA9IGZpbHRlcjtcbiAgLy8gICAgIGNvbnN0IEZpbHRlckNvbXBvbmVudCA9IHR5cGUgJiYgRmlsdGVyQ29tcG9uZW50c1tGSUxURVJfQ09NUE9ORU5UU1t0eXBlXV07XG4gIC8vICAgICBjb25zdCBhbGxBdmFpbGFibGVGaWVsZHMgPSB0aGlzLmF2YWlsYWJsZUZpZWxkc1NlbGVjdG9yKHRoaXMucHJvcHMpO1xuXG4gIC8vICAgICByZXR1cm4gKFxuICAvLyAgICAgICA8U3R5bGVkRmlsdGVyUGFuZWwgY2xhc3NOYW1lPVwiZmlsdGVyLXBhbmVsXCI+XG4gIC8vICAgICAgICAgPFN0eWxlZEZpbHRlckhlYWRlclxuICAvLyAgICAgICAgICAgY2xhc3NOYW1lPVwiZmlsdGVyLXBhbmVsX19oZWFkZXJcIlxuICAvLyAgICAgICAgICAgbGFiZWxSQ0dDb2xvclZhbHVlcz17ZGF0YXNldHNbZGF0YUlkXS5jb2xvcn1cbiAgLy8gICAgICAgICA+XG4gIC8vICAgICAgICAgICA8RmllbGRTZWxlY3RvclxuICAvLyAgICAgICAgICAgICBpbnB1dFRoZW1lPVwic2Vjb25kYXJ5XCJcbiAgLy8gICAgICAgICAgICAgZmllbGRzPXthbGxBdmFpbGFibGVGaWVsZHN9XG4gIC8vICAgICAgICAgICAgIHZhbHVlPXtBcnJheS5pc0FycmF5KG5hbWUpID8gbmFtZVswXSA6IG5hbWV9XG4gIC8vICAgICAgICAgICAgIGVyYXNhYmxlPXtmYWxzZX1cbiAgLy8gICAgICAgICAgICAgb25TZWxlY3Q9e3ZhbHVlID0+XG4gIC8vICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJBcGkoaWR4LCB2YWx1ZSwgZGF0YUlkLCBkYXRhc2V0cywgYXV0aCwgcHJvamVjdClcbiAgLy8gICAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgLz5cbiAgLy8gICAgICAgICAgIDxQYW5lbEhlYWRlckFjdGlvblxuICAvLyAgICAgICAgICAgICBpZD17ZmlsdGVyLmlkfVxuICAvLyAgICAgICAgICAgICB0b29sdGlwPVwiZGVsZXRlXCJcbiAgLy8gICAgICAgICAgICAgdG9vbHRpcFR5cGU9XCJlcnJvclwiXG4gIC8vICAgICAgICAgICAgIG9uQ2xpY2s9e3JlbW92ZUZpbHRlcn1cbiAgLy8gICAgICAgICAgICAgaG92ZXJDb2xvcj17J2Vycm9yQ29sb3InfVxuICAvLyAgICAgICAgICAgICBJY29uQ29tcG9uZW50PXtUcmFzaH1cbiAgLy8gICAgICAgICAgIC8+XG4gIC8vICAgICAgICAgICB7dHlwZSA9PT0gRklMVEVSX1RZUEVTLnRpbWVSYW5nZSAmJiAoXG4gIC8vICAgICAgICAgICAgIDxQYW5lbEhlYWRlckFjdGlvblxuICAvLyAgICAgICAgICAgICAgIGlkPXtmaWx0ZXIuaWR9XG4gIC8vICAgICAgICAgICAgICAgb25DbGljaz17ZW5sYXJnZUZpbHRlcn1cbiAgLy8gICAgICAgICAgICAgICB0b29sdGlwPVwiVGltZSBQbGF5YmFja1wiXG4gIC8vICAgICAgICAgICAgICAgSWNvbkNvbXBvbmVudD17Q2xvY2t9XG4gIC8vICAgICAgICAgICAgICAgYWN0aXZlPXtlbmxhcmdlZH1cbiAgLy8gICAgICAgICAgICAgLz5cbiAgLy8gICAgICAgICAgICl9XG4gIC8vICAgICAgICAgPC9TdHlsZWRGaWx0ZXJIZWFkZXI+XG4gIC8vICAgICAgICAgPFN0eWxlZEZpbHRlckNvbnRlbnQgY2xhc3NOYW1lPVwiZmlsdGVyLXBhbmVsX19jb250ZW50XCI+XG4gIC8vICAgICAgICAgICB7T2JqZWN0LmtleXMoZGF0YXNldHMpLmxlbmd0aCA+IDEgJiYgKFxuICAvLyAgICAgICAgICAgICA8U291cmNlRGF0YVNlbGVjdG9yXG4gIC8vICAgICAgICAgICAgICAgaW5wdXRUaGVtZT1cInNlY29uZGFyeVwiXG4gIC8vICAgICAgICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRzfVxuICAvLyAgICAgICAgICAgICAgIGRpc2FibGVkPXtmaWx0ZXIuZnJlZXplfVxuICAvLyAgICAgICAgICAgICAgIGRhdGFJZD17ZmlsdGVyLmRhdGFJZH1cbiAgLy8gICAgICAgICAgICAgICBvblNlbGVjdD17dmFsdWUgPT4gc2V0RmlsdGVyKGlkeCwgJ2RhdGFJZCcsIHZhbHVlKX1cbiAgLy8gICAgICAgICAgICAgLz5cbiAgLy8gICAgICAgICAgICl9XG4gIC8vICAgICAgICAgICB7dHlwZSAmJiAhZW5sYXJnZWQgJiYgKFxuICAvLyAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpbHRlci1wYW5lbF9fZmlsdGVyXCI+XG4gIC8vICAgICAgICAgICAgICAgPEZpbHRlckNvbXBvbmVudFxuICAvLyAgICAgICAgICAgICAgICAgZmlsdGVyPXtmaWx0ZXJ9XG4gIC8vICAgICAgICAgICAgICAgICBpZHg9e2lkeH1cbiAgLy8gICAgICAgICAgICAgICAgIGlzQW55RmlsdGVyQW5pbWF0aW5nPXtpc0FueUZpbHRlckFuaW1hdGluZ31cbiAgLy8gICAgICAgICAgICAgICAgIHRvZ2dsZUFuaW1hdGlvbj17dG9nZ2xlQW5pbWF0aW9ufVxuICAvLyAgICAgICAgICAgICAgICAgc2V0RmlsdGVyPXt2YWx1ZSA9PlxuICAvLyAgICAgICAgICAgICAgICAgICBzZXRGaWx0ZXIoaWR4LCAndmFsdWUnLCB2YWx1ZSwgMCwgbWFwU3RhdGUsIGF1dGgsIHByb2plY3QpXG4gIC8vICAgICAgICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICAgICAgLz5cbiAgLy8gICAgICAgICAgICAgPC9kaXY+XG4gIC8vICAgICAgICAgICApfVxuICAvLyAgICAgICAgIDwvU3R5bGVkRmlsdGVyQ29udGVudD5cbiAgLy8gICAgICAgPC9TdHlsZWRGaWx0ZXJQYW5lbD5cbiAgLy8gICAgICk7XG4gIC8vICAgfVxuICAvLyB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBGaWx0ZXJQYW5lbEZhY3Rvcnk7XG4vLyBpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSBcInJlYWN0XCI7XG4vLyBpbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG4vLyBpbXBvcnQgeyBjcmVhdGVTZWxlY3RvciB9IGZyb20gXCJyZXNlbGVjdFwiO1xuLy8gaW1wb3J0IHN0eWxlZCBmcm9tIFwic3R5bGVkLWNvbXBvbmVudHNcIjtcbi8vIGltcG9ydCB7IEZJTFRFUl9UWVBFUyB9IGZyb20gXCJ1dGlscy9maWx0ZXItdXRpbHNcIjtcbi8vIGltcG9ydCB7IEFMTF9GSUVMRF9UWVBFUyB9IGZyb20gXCJjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5nc1wiO1xuXG4vLyBpbXBvcnQgRmlsdGVyUGFuZWxIZWFkZXJGYWN0b3J5IGZyb20gXCJjb21wb25lbnRzL3NpZGUtcGFuZWwvZmlsdGVyLXBhbmVsL2ZpbHRlci1wYW5lbC1oZWFkZXJcIjtcbi8vIGltcG9ydCBOZXdGaWx0ZXJQYW5lbEZhY3RvcnkgZnJvbSBcImNvbXBvbmVudHMvZmlsdGVycy9maWx0ZXItcGFuZWxzL25ldy1maWx0ZXItcGFuZWxcIjtcbi8vIGltcG9ydCBUaW1lUmFuZ2VGaWx0ZXJQYW5lbEZhY3RvcnkgZnJvbSBcImNvbXBvbmVudHMvZmlsdGVycy9maWx0ZXItcGFuZWxzL3RpbWUtcmFuZ2UtZmlsdGVyLXBhbmVsXCI7XG4vLyBpbXBvcnQgU2luZ2xlU2VsZWN0RmlsdGVyUGFuZWxGYWN0b3J5IGZyb20gXCJjb21wb25lbnRzL2ZpbHRlcnMvZmlsdGVyLXBhbmVscy9zaW5nbGUtc2VsZWN0LWZpbHRlci1wYW5lbFwiO1xuLy8gaW1wb3J0IE11bHRpU2VsZWN0RmlsdGVyUGFuZWxGYWN0b3J5IGZyb20gXCJjb21wb25lbnRzL2ZpbHRlcnMvZmlsdGVyLXBhbmVscy9tdWx0aS1zZWxlY3QtZmlsdGVyLXBhbmVsXCI7XG4vLyBpbXBvcnQgUmFuZ2VGaWx0ZXJQYW5lbEZhY3RvcnkgZnJvbSBcImNvbXBvbmVudHMvZmlsdGVycy9maWx0ZXItcGFuZWxzL3JhbmdlLWZpbHRlci1wYW5lbFwiO1xuLy8gaW1wb3J0IFBvbHlnb25GaWx0ZXJQYW5lbEZhY3RvcnkgZnJvbSBcImNvbXBvbmVudHMvZmlsdGVycy9maWx0ZXItcGFuZWxzL3BvbHlnb24tZmlsdGVyLXBhbmVsXCI7XG5cbi8vIGNvbnN0IFN0eWxlZEZpbHRlclBhbmVsID0gc3R5bGVkLmRpdmBcbi8vICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbi8vICAgYm9yZGVyLXJhZGl1czogMXB4O1xuXG4vLyAgIC5maWx0ZXItcGFuZWxfX2ZpbHRlciB7XG4vLyAgICAgbWFyZ2luLXRvcDogMjRweDtcbi8vICAgfVxuLy8gYDtcblxuLy8gRmlsdGVyUGFuZWxGYWN0b3J5LmRlcHMgPSBbXG4vLyAgIEZpbHRlclBhbmVsSGVhZGVyRmFjdG9yeSxcbi8vICAgTmV3RmlsdGVyUGFuZWxGYWN0b3J5LFxuLy8gICBUaW1lUmFuZ2VGaWx0ZXJQYW5lbEZhY3RvcnksXG4vLyAgIFNpbmdsZVNlbGVjdEZpbHRlclBhbmVsRmFjdG9yeSxcbi8vICAgTXVsdGlTZWxlY3RGaWx0ZXJQYW5lbEZhY3RvcnksXG4vLyAgIFJhbmdlRmlsdGVyUGFuZWxGYWN0b3J5LFxuLy8gICBQb2x5Z29uRmlsdGVyUGFuZWxGYWN0b3J5XG4vLyBdO1xuXG4vLyBmdW5jdGlvbiBGaWx0ZXJQYW5lbEZhY3RvcnkoXG4vLyAgIEZpbHRlclBhbmVsSGVhZGVyLFxuLy8gICBOZXdGaWx0ZXJQYW5lbCxcbi8vICAgVGltZVJhbmdlRmlsdGVyUGFuZWwsXG4vLyAgIFNpbmdsZVNlbGVjdEZpbHRlclBhbmVsLFxuLy8gICBNdWx0aVNlbGVjdEZpbHRlclBhbmVsLFxuLy8gICBSYW5nZUZpbHRlclBhbmVsLFxuLy8gICBQb2x5Z29uRmlsdGVyUGFuZWxcbi8vICkge1xuLy8gICBjb25zdCBGaWx0ZXJQYW5lbENvbXBvbmVudHMgPSB7XG4vLyAgICAgZGVmYXVsdDogTmV3RmlsdGVyUGFuZWwsXG4vLyAgICAgW0ZJTFRFUl9UWVBFUy50aW1lUmFuZ2VdOiBUaW1lUmFuZ2VGaWx0ZXJQYW5lbCxcbi8vICAgICBbRklMVEVSX1RZUEVTLnNlbGVjdF06IFNpbmdsZVNlbGVjdEZpbHRlclBhbmVsLFxuLy8gICAgIFtGSUxURVJfVFlQRVMubXVsdGlTZWxlY3RdOiBNdWx0aVNlbGVjdEZpbHRlclBhbmVsLFxuLy8gICAgIFtGSUxURVJfVFlQRVMucmFuZ2VdOiBSYW5nZUZpbHRlclBhbmVsLFxuLy8gICAgIFtGSUxURVJfVFlQRVMucG9seWdvbl06IFBvbHlnb25GaWx0ZXJQYW5lbFxuLy8gICB9O1xuXG4vLyAgIHJldHVybiBjbGFzcyBGaWx0ZXJQYW5lbCBleHRlbmRzIENvbXBvbmVudCB7XG4vLyAgICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbi8vICAgICAgIGlkeDogUHJvcFR5cGVzLm51bWJlcixcbi8vICAgICAgIGZpbHRlcnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLmlzUmVxdWlyZWQsXG4vLyAgICAgICBmaWx0ZXI6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbi8vICAgICAgIHNldEZpbHRlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbi8vICAgICAgIHJlbW92ZUZpbHRlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbi8vICAgICAgIGVubGFyZ2VGaWx0ZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4vLyAgICAgICB0b2dnbGVBbmltYXRpb246IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4vLyAgICAgICBkYXRhc2V0czogUHJvcFR5cGVzLm9iamVjdCxcbi8vICAgICAgIHNob3dEYXRhc2V0VGFibGU6IFByb3BUeXBlcy5mdW5jLFxuLy8gICAgICAgaXNBbnlGaWx0ZXJBbmltYXRpbmc6IFByb3BUeXBlcy5ib29sXG4vLyAgICAgfTtcblxuLy8gICAgIC8qIHNlbGVjdG9ycyAqL1xuLy8gICAgIGZpZWxkc1NlbGVjdG9yID0gcHJvcHMgPT5cbi8vICAgICAgIChwcm9wcy5maWx0ZXIuZGF0YUlkWzBdICYmXG4vLyAgICAgICAgIHByb3BzLmRhdGFzZXRzW3Byb3BzLmZpbHRlci5kYXRhSWRbMF1dLmZpZWxkcykgfHxcbi8vICAgICAgIFtdO1xuLy8gICAgIGZpbHRlclNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMuZmlsdGVycztcbi8vICAgICBuYW1lU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5maWx0ZXIubmFtZTtcbi8vICAgICBkYXRhSWRTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLmZpbHRlci5kYXRhSWRbMF07XG5cbi8vICAgICAvLyBvbmx5IHNob3cgY3VycmVudCBmaWVsZCBhbmQgZmllbGQgdGhhdCdzIG5vdCBhbHJlYWR5IGJlZW4gdXNlZCBhcyBhIGZpbHRlclxuLy8gICAgIGF2YWlsYWJsZUZpZWxkc1NlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4vLyAgICAgICB0aGlzLmZpZWxkc1NlbGVjdG9yLFxuLy8gICAgICAgdGhpcy5maWx0ZXJTZWxlY3Rvcixcbi8vICAgICAgIHRoaXMubmFtZVNlbGVjdG9yLFxuLy8gICAgICAgdGhpcy5kYXRhSWRTZWxlY3Rvcixcbi8vICAgICAgIChmaWVsZHMsIGZpbHRlcnMsIG5hbWUsIGRhdGFJZCkgPT5cbi8vICAgICAgICAgZmllbGRzLmZpbHRlcihcbi8vICAgICAgICAgICBmID0+XG4vLyAgICAgICAgICAgICBmLnR5cGUgJiZcbi8vICAgICAgICAgICAgIGYudHlwZSAhPT0gQUxMX0ZJRUxEX1RZUEVTLmdlb2pzb24gJiZcbi8vICAgICAgICAgICAgIChmLm5hbWUgPT09IG5hbWUgfHxcbi8vICAgICAgICAgICAgICAgIWZpbHRlcn