kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
351 lines (342 loc) • 47.1 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.WGS84ToPseudoMercator = WGS84ToPseudoMercator;
exports["default"] = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _webMercator = require("@math.gl/web-mercator");
var _core = require("@deck.gl/core");
var _layers = require("@deck.gl/layers");
var _wms = require("@loaders.gl/wms");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function _superPropGet(t, e, r, o) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & o ? t.prototype : t), e, r); return 2 & o ? function (t) { return p.apply(r, t); } : p; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
// TODO: This is a modified copy of WMSLayer from deck.gl. Remove this once we upgrade deck.gl and loaders.gl.
/** All props supported by the TileLayer */
/** Props added by the TileLayer */
var defaultProps = {
id: 'imagery-layer',
data: '',
serviceType: 'auto',
srs: 'auto',
layers: {
type: 'array',
compare: true,
value: []
},
// eslint-disable-next-line @typescript-eslint/no-empty-function
onMetadataLoad: {
type: 'function',
value: function value() {}
},
// eslint-disable-next-line
onMetadataLoadError: {
type: 'function',
value: console.error
},
// eslint-disable-next-line @typescript-eslint/no-empty-function
onImageLoadStart: {
type: 'function',
value: function value() {}
},
// eslint-disable-next-line @typescript-eslint/no-empty-function
onImageLoad: {
type: 'function',
value: function value() {}
},
onImageLoadError: {
type: 'function',
compare: false,
// eslint-disable-next-line
value: function value(requestId, error) {
return console.error(error, requestId);
}
}
};
var WMSLayer = exports["default"] = /*#__PURE__*/function (_CompositeLayer) {
function WMSLayer() {
(0, _classCallCheck2["default"])(this, WMSLayer);
return _callSuper(this, WMSLayer, arguments);
}
(0, _inherits2["default"])(WMSLayer, _CompositeLayer);
return (0, _createClass2["default"])(WMSLayer, [{
key: "isLoaded",
get: /** Returns true if all async resources are loaded */
function get() {
// Track the explicit loading done by this layer
return Boolean(this.state) && this.state.loadCounter === 0 && _superPropGet(WMSLayer, "isLoaded", this, 1);
}
/** Lets deck.gl know that we want viewport change events */
}, {
key: "shouldUpdateState",
value: function shouldUpdateState() {
return true;
}
}, {
key: "initializeState",
value: function initializeState() {
// intentionally empty, initialization is done in updateState
this.state._nextRequestId = 0;
this.state.lastRequestId = -1;
this.state.loadCounter = 0;
}
}, {
key: "updateState",
value: function updateState(_ref) {
var _this = this;
var changeFlags = _ref.changeFlags,
props = _ref.props,
oldProps = _ref.oldProps;
var viewport = this.context.viewport;
// Check if data source has changed
if (changeFlags.dataChanged || props.serviceType !== oldProps.serviceType) {
this.state.imageSource = this._createImageSource(props);
this._loadMetadata();
this.debounce(function () {
return _this.loadImage(viewport, 'image source changed');
}, 0);
} else if (!(0, _core._deepEqual)(props.layers, oldProps.layers, 1)) {
this.debounce(function () {
return _this.loadImage(viewport, 'layers changed');
}, 0);
} else if (changeFlags.viewportChanged) {
this.debounce(function () {
return _this.loadImage(viewport, 'viewport changed');
});
}
}
}, {
key: "renderLayers",
value: function renderLayers() {
var _this$state = this.state,
bounds = _this$state.bounds,
image = _this$state.image,
lastRequestParameters = _this$state.lastRequestParameters;
return image && new _layers.BitmapLayer(_objectSpread(_objectSpread({}, this.getSubLayerProps({
id: 'bitmap'
})), {}, {
_imageCoordinateSystem: lastRequestParameters.srs === 'EPSG:4326' ? _core.COORDINATE_SYSTEM.LNGLAT : _core.COORDINATE_SYSTEM.CARTESIAN,
bounds: bounds,
image: image,
pickable: this.props.pickable
}));
}
}, {
key: "getFeatureInfoText",
value: function () {
var _getFeatureInfoText = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(x, y) {
var lastRequestParameters, _this$state$imageSour, _this$state$imageSour2, featureInfo;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
lastRequestParameters = this.state.lastRequestParameters;
if (!lastRequestParameters) {
_context.next = 6;
break;
}
_context.next = 4;
return (_this$state$imageSour = (_this$state$imageSour2 = this.state.imageSource).getFeatureInfoText) === null || _this$state$imageSour === void 0 ? void 0 : _this$state$imageSour.call(_this$state$imageSour2, _objectSpread(_objectSpread({}, lastRequestParameters), {}, {
query_layers: lastRequestParameters.layers,
x: x,
y: y,
info_format: 'application/vnd.ogc.gml'
}));
case 4:
featureInfo = _context.sent;
return _context.abrupt("return", featureInfo);
case 6:
return _context.abrupt("return", '');
case 7:
case "end":
return _context.stop();
}
}, _callee, this);
}));
function getFeatureInfoText(_x, _x2) {
return _getFeatureInfoText.apply(this, arguments);
}
return getFeatureInfoText;
}()
}, {
key: "_createImageSource",
value: function _createImageSource(props) {
if (props.data instanceof _wms.ImageSource) {
return props.data;
}
if (typeof props.data === 'string') {
return (0, _wms.createImageSource)({
url: props.data,
loadOptions: props.loadOptions,
type: props.serviceType
});
}
throw new Error('invalid image source in props.data');
}
/** Run a getMetadata on the image service */
}, {
key: "_loadMetadata",
value: (function () {
var _loadMetadata2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
var imageSource, metadata, _this$getCurrentLayer, _this$getCurrentLayer2;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
imageSource = this.state.imageSource;
_context2.prev = 1;
this.state.loadCounter++;
_context2.next = 5;
return imageSource.getMetadata();
case 5:
metadata = _context2.sent;
// If a request takes a long time, it may no longer be expected
if (this.state.imageSource === imageSource) {
(_this$getCurrentLayer = this.getCurrentLayer()) === null || _this$getCurrentLayer === void 0 || _this$getCurrentLayer.props.onMetadataLoad(metadata);
}
_context2.next = 12;
break;
case 9:
_context2.prev = 9;
_context2.t0 = _context2["catch"](1);
(_this$getCurrentLayer2 = this.getCurrentLayer()) === null || _this$getCurrentLayer2 === void 0 || _this$getCurrentLayer2.props.onMetadataLoadError(_context2.t0);
case 12:
_context2.prev = 12;
this.state.loadCounter--;
return _context2.finish(12);
case 15:
case "end":
return _context2.stop();
}
}, _callee2, this, [[1, 9, 12, 15]]);
}));
function _loadMetadata() {
return _loadMetadata2.apply(this, arguments);
}
return _loadMetadata;
}() /** Load an image */)
}, {
key: "loadImage",
value: (function () {
var _loadImage = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(viewport, _reason) {
var _this$props, layers, serviceType, transparent, bounds, width, height, requestId, srs, requestParams, _WGS84ToPseudoMercato, _WGS84ToPseudoMercato2, minX, minY, _WGS84ToPseudoMercato3, _WGS84ToPseudoMercato4, maxX, maxY, image, _this$getCurrentLayer3, _this$context$onError, _this$context, _this$getCurrentLayer4;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
_this$props = this.props, layers = _this$props.layers, serviceType = _this$props.serviceType, transparent = _this$props.transparent; // TODO - move to ImageSource?
if (!(serviceType === 'wms' && layers.length === 0)) {
_context3.next = 3;
break;
}
return _context3.abrupt("return");
case 3:
bounds = viewport.getBounds();
width = viewport.width, height = viewport.height;
requestId = this.getRequestId();
srs = this.props.srs;
if (srs === 'auto') {
// BitmapLayer only supports LNGLAT or CARTESIAN (Web-Mercator)
srs = viewport.resolution ? 'EPSG:4326' : 'EPSG:3857';
}
requestParams = {
width: width,
height: height,
// TODO: remove bbox once deck.gl is upgraded to ^8.10 with loaders.gl ^4
bbox: bounds,
boundingBox: [[bounds[0], bounds[1]], [bounds[2], bounds[3]]],
layers: layers,
srs: srs,
transparent: transparent
};
if (srs === 'EPSG:3857') {
_WGS84ToPseudoMercato = WGS84ToPseudoMercator([bounds[0], bounds[1]]), _WGS84ToPseudoMercato2 = (0, _slicedToArray2["default"])(_WGS84ToPseudoMercato, 2), minX = _WGS84ToPseudoMercato2[0], minY = _WGS84ToPseudoMercato2[1];
_WGS84ToPseudoMercato3 = WGS84ToPseudoMercator([bounds[2], bounds[3]]), _WGS84ToPseudoMercato4 = (0, _slicedToArray2["default"])(_WGS84ToPseudoMercato3, 2), maxX = _WGS84ToPseudoMercato4[0], maxY = _WGS84ToPseudoMercato4[1];
requestParams.boundingBox = [[minX, minY], [maxX, maxY]];
// TODO: remove bbox once deck.gl is upgraded to ^8.10 with loaders.gl ^4
requestParams.bbox = [minX, minY, maxX, maxY];
}
_context3.prev = 10;
this.state.loadCounter++;
this.props.onImageLoadStart(requestId);
_context3.next = 15;
return this.state.imageSource.getImage(requestParams);
case 15:
image = _context3.sent;
// If a request takes a long time, later requests may have already loaded.
if (this.state.lastRequestId < requestId) {
(_this$getCurrentLayer3 = this.getCurrentLayer()) === null || _this$getCurrentLayer3 === void 0 || _this$getCurrentLayer3.props.onImageLoad(requestId);
// Not type safe...
this.setState({
image: image,
bounds: bounds,
lastRequestParameters: requestParams,
lastRequestId: requestId
});
}
_context3.next = 23;
break;
case 19:
_context3.prev = 19;
_context3.t0 = _context3["catch"](10);
(_this$context$onError = (_this$context = this.context).onError) === null || _this$context$onError === void 0 || _this$context$onError.call(_this$context, _context3.t0, this);
(_this$getCurrentLayer4 = this.getCurrentLayer()) === null || _this$getCurrentLayer4 === void 0 || _this$getCurrentLayer4.props.onImageLoadError(requestId, _context3.t0);
case 23:
_context3.prev = 23;
this.state.loadCounter--;
return _context3.finish(23);
case 26:
case "end":
return _context3.stop();
}
}, _callee3, this, [[10, 19, 23, 26]]);
}));
function loadImage(_x3, _x4) {
return _loadImage.apply(this, arguments);
}
return loadImage;
}() // HELPERS
/** Global counter for issuing unique request ids */
)
}, {
key: "getRequestId",
value: function getRequestId() {
return this.state._nextRequestId++;
}
/** Runs an action in the future, cancels it if the new action is issued before it executes */
}, {
key: "debounce",
value: function debounce(fn) {
var ms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;
clearTimeout(this.state._timeoutId);
this.state._timeoutId = setTimeout(function () {
return fn();
}, ms);
}
}]);
}(_core.CompositeLayer); // https://epsg.io/3857
// +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs
(0, _defineProperty2["default"])(WMSLayer, "layerName", 'WMSLayer');
(0, _defineProperty2["default"])(WMSLayer, "defaultProps", defaultProps);
var HALF_EARTH_CIRCUMFERENCE = 6378137 * Math.PI;
/** Projects EPSG:4326 to EPSG:3857
* This is a lightweight replacement of proj4. Use tests to ensure conformance.
*/
function WGS84ToPseudoMercator(coord) {
var mercator = (0, _webMercator.lngLatToWorld)(coord);
mercator[0] = (mercator[0] / 256 - 1) * HALF_EARTH_CIRCUMFERENCE;
mercator[1] = (mercator[1] / 256 - 1) * HALF_EARTH_CIRCUMFERENCE;
return mercator;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2ViTWVyY2F0b3IiLCJyZXF1aXJlIiwiX2NvcmUiLCJfbGF5ZXJzIiwiX3dtcyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJjYWxsIiwiX3N1cGVyUHJvcEdldCIsInAiLCJfZ2V0MiIsImRlZmF1bHRQcm9wcyIsImlkIiwiZGF0YSIsInNlcnZpY2VUeXBlIiwic3JzIiwibGF5ZXJzIiwidHlwZSIsImNvbXBhcmUiLCJ2YWx1ZSIsIm9uTWV0YWRhdGFMb2FkIiwib25NZXRhZGF0YUxvYWRFcnJvciIsImNvbnNvbGUiLCJlcnJvciIsIm9uSW1hZ2VMb2FkU3RhcnQiLCJvbkltYWdlTG9hZCIsIm9uSW1hZ2VMb2FkRXJyb3IiLCJyZXF1ZXN0SWQiLCJXTVNMYXllciIsImV4cG9ydHMiLCJfQ29tcG9zaXRlTGF5ZXIiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJnZXQiLCJzdGF0ZSIsImxvYWRDb3VudGVyIiwic2hvdWxkVXBkYXRlU3RhdGUiLCJpbml0aWFsaXplU3RhdGUiLCJfbmV4dFJlcXVlc3RJZCIsImxhc3RSZXF1ZXN0SWQiLCJ1cGRhdGVTdGF0ZSIsIl9yZWYiLCJfdGhpcyIsImNoYW5nZUZsYWdzIiwicHJvcHMiLCJvbGRQcm9wcyIsInZpZXdwb3J0IiwiY29udGV4dCIsImRhdGFDaGFuZ2VkIiwiaW1hZ2VTb3VyY2UiLCJfY3JlYXRlSW1hZ2VTb3VyY2UiLCJfbG9hZE1ldGFkYXRhIiwiZGVib3VuY2UiLCJsb2FkSW1hZ2UiLCJkZWVwRXF1YWwiLCJ2aWV3cG9ydENoYW5nZWQiLCJyZW5kZXJMYXllcnMiLCJfdGhpcyRzdGF0ZSIsImJvdW5kcyIsImltYWdlIiwibGFzdFJlcXVlc3RQYXJhbWV0ZXJzIiwiQml0bWFwTGF5ZXIiLCJnZXRTdWJMYXllclByb3BzIiwiX2ltYWdlQ29vcmRpbmF0ZVN5c3RlbSIsIkNPT1JESU5BVEVfU1lTVEVNIiwiTE5HTEFUIiwiQ0FSVEVTSUFOIiwicGlja2FibGUiLCJfZ2V0RmVhdHVyZUluZm9UZXh0IiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJ4IiwieSIsIl90aGlzJHN0YXRlJGltYWdlU291ciIsIl90aGlzJHN0YXRlJGltYWdlU291cjIiLCJmZWF0dXJlSW5mbyIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJnZXRGZWF0dXJlSW5mb1RleHQiLCJxdWVyeV9sYXllcnMiLCJpbmZvX2Zvcm1hdCIsInNlbnQiLCJhYnJ1cHQiLCJzdG9wIiwiX3giLCJfeDIiLCJJbWFnZVNvdXJjZSIsImNyZWF0ZUltYWdlU291cmNlIiwidXJsIiwibG9hZE9wdGlvbnMiLCJFcnJvciIsIl9sb2FkTWV0YWRhdGEyIiwiX2NhbGxlZTIiLCJtZXRhZGF0YSIsIl90aGlzJGdldEN1cnJlbnRMYXllciIsIl90aGlzJGdldEN1cnJlbnRMYXllcjIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJnZXRNZXRhZGF0YSIsImdldEN1cnJlbnRMYXllciIsInQwIiwiZmluaXNoIiwiX2xvYWRJbWFnZSIsIl9jYWxsZWUzIiwiX3JlYXNvbiIsIl90aGlzJHByb3BzIiwidHJhbnNwYXJlbnQiLCJ3aWR0aCIsImhlaWdodCIsInJlcXVlc3RQYXJhbXMiLCJfV0dTODRUb1BzZXVkb01lcmNhdG8iLCJfV0dTODRUb1BzZXVkb01lcmNhdG8yIiwibWluWCIsIm1pblkiLCJfV0dTODRUb1BzZXVkb01lcmNhdG8zIiwiX1dHUzg0VG9Qc2V1ZG9NZXJjYXRvNCIsIm1heFgiLCJtYXhZIiwiX3RoaXMkZ2V0Q3VycmVudExheWVyMyIsIl90aGlzJGNvbnRleHQkb25FcnJvciIsIl90aGlzJGNvbnRleHQiLCJfdGhpcyRnZXRDdXJyZW50TGF5ZXI0IiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiZ2V0Qm91bmRzIiwiZ2V0UmVxdWVzdElkIiwicmVzb2x1dGlvbiIsImJib3giLCJib3VuZGluZ0JveCIsIldHUzg0VG9Qc2V1ZG9NZXJjYXRvciIsIl9zbGljZWRUb0FycmF5MiIsImdldEltYWdlIiwic2V0U3RhdGUiLCJvbkVycm9yIiwiX3gzIiwiX3g0IiwiZm4iLCJtcyIsInVuZGVmaW5lZCIsImNsZWFyVGltZW91dCIsIl90aW1lb3V0SWQiLCJzZXRUaW1lb3V0IiwiQ29tcG9zaXRlTGF5ZXIiLCJIQUxGX0VBUlRIX0NJUkNVTUZFUkVOQ0UiLCJNYXRoIiwiUEkiLCJjb29yZCIsIm1lcmNhdG9yIiwibG5nTGF0VG9Xb3JsZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93bXMvd21zLWxheWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7bG5nTGF0VG9Xb3JsZH0gZnJvbSAnQG1hdGguZ2wvd2ViLW1lcmNhdG9yJztcblxuaW1wb3J0IHtcbiAgTGF5ZXIsXG4gIENvbXBvc2l0ZUxheWVyLFxuICBDb21wb3NpdGVMYXllclByb3BzLFxuICBVcGRhdGVQYXJhbWV0ZXJzLFxuICBEZWZhdWx0UHJvcHMsXG4gIFZpZXdwb3J0LFxuICBDT09SRElOQVRFX1NZU1RFTSxcbiAgX2RlZXBFcXVhbCBhcyBkZWVwRXF1YWxcbn0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge0JpdG1hcExheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0IHtJbWFnZVNvdXJjZSwgY3JlYXRlSW1hZ2VTb3VyY2V9IGZyb20gJ0Bsb2FkZXJzLmdsL3dtcyc7XG5cbmltcG9ydCB0eXBlIHtJbWFnZVNvdXJjZU1ldGFkYXRhfSBmcm9tICdAbG9hZGVycy5nbC9sb2FkZXItdXRpbHMnO1xuaW1wb3J0IHR5cGUge0ltYWdlVHlwZSwgSW1hZ2VTZXJ2aWNlVHlwZX0gZnJvbSAnQGxvYWRlcnMuZ2wvd21zJztcblxuLy8gVE9ETzogVGhpcyBpcyBhIG1vZGlmaWVkIGNvcHkgb2YgV01TTGF5ZXIgZnJvbSBkZWNrLmdsLiBSZW1vdmUgdGhpcyBvbmNlIHdlIHVwZ3JhZGUgZGVjay5nbCBhbmQgbG9hZGVycy5nbC5cblxuLyoqIEFsbCBwcm9wcyBzdXBwb3J0ZWQgYnkgdGhlIFRpbGVMYXllciAqL1xuZXhwb3J0IHR5cGUgV01TTGF5ZXJQcm9wcyA9IENvbXBvc2l0ZUxheWVyUHJvcHMgJiBfV01TTGF5ZXJQcm9wcztcblxuLyoqIFByb3BzIGFkZGVkIGJ5IHRoZSBUaWxlTGF5ZXIgKi9cbnR5cGUgX1dNU0xheWVyUHJvcHMgPSB7XG4gIGRhdGE6IHN0cmluZyB8IEltYWdlU291cmNlO1xuICBzZXJ2aWNlVHlwZT86IEltYWdlU2VydmljZVR5cGUgfCAnYXV0byc7XG4gIGxheWVycz86IHN0cmluZ1tdO1xuICBzcnM/OiAnRVBTRzo0MzI2JyB8ICdFUFNHOjM4NTcnIHwgJ2F1dG8nO1xuICB0cmFuc3BhcmVudD86IGJvb2xlYW47XG4gIG9uTWV0YWRhdGFMb2FkPzogKG1ldGFkYXRhOiBJbWFnZVNvdXJjZU1ldGFkYXRhKSA9PiB2b2lkO1xuICBvbk1ldGFkYXRhTG9hZEVycm9yPzogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgb25JbWFnZUxvYWRTdGFydD86IChyZXF1ZXN0SWQ6IHVua25vd24pID0+IHZvaWQ7XG4gIG9uSW1hZ2VMb2FkPzogKHJlcXVlc3RJZDogdW5rbm93bikgPT4gdm9pZDtcbiAgb25JbWFnZUxvYWRFcnJvcj86IChyZXF1ZXN0SWQ6IHVua25vd24sIGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbn07XG5cbmNvbnN0IGRlZmF1bHRQcm9wczogRGVmYXVsdFByb3BzPFdNU0xheWVyUHJvcHM+ID0ge1xuICBpZDogJ2ltYWdlcnktbGF5ZXInLFxuICBkYXRhOiAnJyxcbiAgc2VydmljZVR5cGU6ICdhdXRvJyxcbiAgc3JzOiAnYXV0bycsXG4gIGxheWVyczoge3R5cGU6ICdhcnJheScsIGNvbXBhcmU6IHRydWUsIHZhbHVlOiBbXX0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgb25NZXRhZGF0YUxvYWQ6IHt0eXBlOiAnZnVuY3Rpb24nLCB2YWx1ZTogKCkgPT4ge319LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgb25NZXRhZGF0YUxvYWRFcnJvcjoge3R5cGU6ICdmdW5jdGlvbicsIHZhbHVlOiBjb25zb2xlLmVycm9yfSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBvbkltYWdlTG9hZFN0YXJ0OiB7dHlwZTogJ2Z1bmN0aW9uJywgdmFsdWU6ICgpID0+IHt9fSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBvbkltYWdlTG9hZDoge3R5cGU6ICdmdW5jdGlvbicsIHZhbHVlOiAoKSA9PiB7fX0sXG4gIG9uSW1hZ2VMb2FkRXJyb3I6IHtcbiAgICB0eXBlOiAnZnVuY3Rpb24nLFxuICAgIGNvbXBhcmU6IGZhbHNlLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHZhbHVlOiAocmVxdWVzdElkOiB1bmtub3duLCBlcnJvcjogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoZXJyb3IsIHJlcXVlc3RJZClcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV01TTGF5ZXIgZXh0ZW5kcyBDb21wb3NpdGVMYXllcjxSZXF1aXJlZDxfV01TTGF5ZXJQcm9wcz4+IHtcbiAgc3RhdGljIGxheWVyTmFtZSA9ICdXTVNMYXllcic7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHM6IERlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuICBkZWNsYXJlIHN0YXRlOiB7XG4gICAgaW1hZ2VTb3VyY2U6IEltYWdlU291cmNlO1xuICAgIGltYWdlOiBJbWFnZVR5cGU7XG4gICAgYm91bmRzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICBsYXN0UmVxdWVzdFBhcmFtZXRlcnM6IHtcbiAgICAgIC8vIFRPRE86IHJlbW92ZSBiYm94IG9uY2UgZGVjay5nbCBpcyB1cGdyYWRlZCB0byBeOC4xMCB3aXRoIGxvYWRlcnMuZ2wgXjRcbiAgICAgIGJib3g6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgICAgYm91bmRpbmdCb3g6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTtcbiAgICAgIGxheWVyczogc3RyaW5nW107XG4gICAgICBzcnM6ICdFUFNHOjQzMjYnIHwgJ0VQU0c6Mzg1Nyc7XG4gICAgICB3aWR0aDogbnVtYmVyO1xuICAgICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgfTtcbiAgICBsYXN0UmVxdWVzdElkOiBudW1iZXI7XG4gICAgX25leHRSZXF1ZXN0SWQ6IG51bWJlcjtcbiAgICAvKiogVE9ETzogQ2hhbmdlIGFueSA9PiBzZXRUaW1lb3V0IHJldHVybiB0eXBlLiBEaWZmZXJlbnQgYmV0d2VlbiBOb2RlIGFuZCBicm93c2VyLi4uICovXG4gICAgX3RpbWVvdXRJZDogYW55O1xuICAgIGxvYWRDb3VudGVyOiBudW1iZXI7XG4gIH07XG5cbiAgLyoqIFJldHVybnMgdHJ1ZSBpZiBhbGwgYXN5bmMgcmVzb3VyY2VzIGFyZSBsb2FkZWQgKi9cbiAgZ2V0IGlzTG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIC8vIFRyYWNrIHRoZSBleHBsaWNpdCBsb2FkaW5nIGRvbmUgYnkgdGhpcyBsYXllclxuICAgIHJldHVybiBCb29sZWFuKHRoaXMuc3RhdGUpICYmIHRoaXMuc3RhdGUubG9hZENvdW50ZXIgPT09IDAgJiYgc3VwZXIuaXNMb2FkZWQ7XG4gIH1cblxuICAvKiogTGV0cyBkZWNrLmdsIGtub3cgdGhhdCB3ZSB3YW50IHZpZXdwb3J0IGNoYW5nZSBldmVudHMgKi9cbiAgb3ZlcnJpZGUgc2hvdWxkVXBkYXRlU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvdmVycmlkZSBpbml0aWFsaXplU3RhdGUoKTogdm9pZCB7XG4gICAgLy8gaW50ZW50aW9uYWxseSBlbXB0eSwgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiB1cGRhdGVTdGF0ZVxuICAgIHRoaXMuc3RhdGUuX25leHRSZXF1ZXN0SWQgPSAwO1xuICAgIHRoaXMuc3RhdGUubGFzdFJlcXVlc3RJZCA9IC0xO1xuICAgIHRoaXMuc3RhdGUubG9hZENvdW50ZXIgPSAwO1xuICB9XG5cbiAgb3ZlcnJpZGUgdXBkYXRlU3RhdGUoe2NoYW5nZUZsYWdzLCBwcm9wcywgb2xkUHJvcHN9OiBVcGRhdGVQYXJhbWV0ZXJzPHRoaXM+KTogdm9pZCB7XG4gICAgY29uc3Qge3ZpZXdwb3J0fSA9IHRoaXMuY29udGV4dDtcblxuICAgIC8vIENoZWNrIGlmIGRhdGEgc291cmNlIGhhcyBjaGFuZ2VkXG4gICAgaWYgKGNoYW5nZUZsYWdzLmRhdGFDaGFuZ2VkIHx8IHByb3BzLnNlcnZpY2VUeXBlICE9PSBvbGRQcm9wcy5zZXJ2aWNlVHlwZSkge1xuICAgICAgdGhpcy5zdGF0ZS5pbWFnZVNvdXJjZSA9IHRoaXMuX2NyZWF0ZUltYWdlU291cmNlKHByb3BzKTtcblxuICAgICAgdGhpcy5fbG9hZE1ldGFkYXRhKCk7XG4gICAgICB0aGlzLmRlYm91bmNlKCgpID0+IHRoaXMubG9hZEltYWdlKHZpZXdwb3J0LCAnaW1hZ2Ugc291cmNlIGNoYW5nZWQnKSwgMCk7XG4gICAgfSBlbHNlIGlmICghZGVlcEVxdWFsKHByb3BzLmxheWVycywgb2xkUHJvcHMubGF5ZXJzLCAxKSkge1xuICAgICAgdGhpcy5kZWJvdW5jZSgoKSA9PiB0aGlzLmxvYWRJbWFnZSh2aWV3cG9ydCwgJ2xheWVycyBjaGFuZ2VkJyksIDApO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlRmxhZ3Mudmlld3BvcnRDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmRlYm91bmNlKCgpID0+IHRoaXMubG9hZEltYWdlKHZpZXdwb3J0LCAndmlld3BvcnQgY2hhbmdlZCcpKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXJMYXllcnMoKTogTGF5ZXI8YW55PiB7XG4gICAgY29uc3Qge2JvdW5kcywgaW1hZ2UsIGxhc3RSZXF1ZXN0UGFyYW1ldGVyc30gPSB0aGlzLnN0YXRlO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGltYWdlICYmXG4gICAgICBuZXcgQml0bWFwTGF5ZXIoe1xuICAgICAgICAuLi50aGlzLmdldFN1YkxheWVyUHJvcHMoe2lkOiAnYml0bWFwJ30pLFxuICAgICAgICBfaW1hZ2VDb29yZGluYXRlU3lzdGVtOlxuICAgICAgICAgIGxhc3RSZXF1ZXN0UGFyYW1ldGVycy5zcnMgPT09ICdFUFNHOjQzMjYnXG4gICAgICAgICAgICA/IENPT1JESU5BVEVfU1lTVEVNLkxOR0xBVFxuICAgICAgICAgICAgOiBDT09SRElOQVRFX1NZU1RFTS5DQVJURVNJQU4sXG4gICAgICAgIGJvdW5kcyxcbiAgICAgICAgaW1hZ2UsXG4gICAgICAgIHBpY2thYmxlOiB0aGlzLnByb3BzLnBpY2thYmxlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRGZWF0dXJlSW5mb1RleHQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCB7bGFzdFJlcXVlc3RQYXJhbWV0ZXJzfSA9IHRoaXMuc3RhdGU7XG4gICAgaWYgKGxhc3RSZXF1ZXN0UGFyYW1ldGVycykge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBVbmRvY3VtZW50ZWQgbWV0aG9kXG4gICAgICBjb25zdCBmZWF0dXJlSW5mbyA9IGF3YWl0IHRoaXMuc3RhdGUuaW1hZ2VTb3VyY2UuZ2V0RmVhdHVyZUluZm9UZXh0Py4oe1xuICAgICAgICAuLi5sYXN0UmVxdWVzdFBhcmFtZXRlcnMsXG4gICAgICAgIHF1ZXJ5X2xheWVyczogbGFzdFJlcXVlc3RQYXJhbWV0ZXJzLmxheWVycyxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgaW5mb19mb3JtYXQ6ICdhcHBsaWNhdGlvbi92bmQub2djLmdtbCdcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZlYXR1cmVJbmZvO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBfY3JlYXRlSW1hZ2VTb3VyY2UocHJvcHM6IFdNU0xheWVyUHJvcHMpOiBJbWFnZVNvdXJjZSB7XG4gICAgaWYgKHByb3BzLmRhdGEgaW5zdGFuY2VvZiBJbWFnZVNvdXJjZSkge1xuICAgICAgcmV0dXJuIHByb3BzLmRhdGE7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGNyZWF0ZUltYWdlU291cmNlKHtcbiAgICAgICAgdXJsOiBwcm9wcy5kYXRhLFxuICAgICAgICBsb2FkT3B0aW9uczogcHJvcHMubG9hZE9wdGlvbnMsXG4gICAgICAgIHR5cGU6IHByb3BzLnNlcnZpY2VUeXBlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW1hZ2Ugc291cmNlIGluIHByb3BzLmRhdGEnKTtcbiAgfVxuXG4gIC8qKiBSdW4gYSBnZXRNZXRhZGF0YSBvbiB0aGUgaW1hZ2Ugc2VydmljZSAqL1xuICBhc3luYyBfbG9hZE1ldGFkYXRhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtpbWFnZVNvdXJjZX0gPSB0aGlzLnN0YXRlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnN0YXRlLmxvYWRDb3VudGVyKys7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGltYWdlU291cmNlLmdldE1ldGFkYXRhKCk7XG5cbiAgICAgIC8vIElmIGEgcmVxdWVzdCB0YWtlcyBhIGxvbmcgdGltZSwgaXQgbWF5IG5vIGxvbmdlciBiZSBleHBlY3RlZFxuICAgICAgaWYgKHRoaXMuc3RhdGUuaW1hZ2VTb3VyY2UgPT09IGltYWdlU291cmNlKSB7XG4gICAgICAgIHRoaXMuZ2V0Q3VycmVudExheWVyKCk/LnByb3BzLm9uTWV0YWRhdGFMb2FkKG1ldGFkYXRhKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5nZXRDdXJyZW50TGF5ZXIoKT8ucHJvcHMub25NZXRhZGF0YUxvYWRFcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhdGUubG9hZENvdW50ZXItLTtcbiAgICB9XG4gIH1cblxuICAvKiogTG9hZCBhbiBpbWFnZSAqL1xuICBhc3luYyBsb2FkSW1hZ2Uodmlld3BvcnQ6IFZpZXdwb3J0LCBfcmVhc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7bGF5ZXJzLCBzZXJ2aWNlVHlwZSwgdHJhbnNwYXJlbnR9ID0gdGhpcy5wcm9wcztcblxuICAgIC8vIFRPRE8gLSBtb3ZlIHRvIEltYWdlU291cmNlP1xuICAgIGlmIChzZXJ2aWNlVHlwZSA9PT0gJ3dtcycgJiYgbGF5ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJvdW5kcyA9IHZpZXdwb3J0LmdldEJvdW5kcygpO1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHZpZXdwb3J0O1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuZ2V0UmVxdWVzdElkKCk7XG4gICAgbGV0IHtzcnN9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoc3JzID09PSAnYXV0bycpIHtcbiAgICAgIC8vIEJpdG1hcExheWVyIG9ubHkgc3VwcG9ydHMgTE5HTEFUIG9yIENBUlRFU0lBTiAoV2ViLU1lcmNhdG9yKVxuICAgICAgc3JzID0gdmlld3BvcnQucmVzb2x1dGlvbiA/ICdFUFNHOjQzMjYnIDogJ0VQU0c6Mzg1Nyc7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIC8vIFRPRE86IHJlbW92ZSBiYm94IG9uY2UgZGVjay5nbCBpcyB1cGdyYWRlZCB0byBeOC4xMCB3aXRoIGxvYWRlcnMuZ2wgXjRcbiAgICAgIGJib3g6IGJvdW5kcyxcbiAgICAgIGJvdW5kaW5nQm94OiBbXG4gICAgICAgIFtib3VuZHNbMF0sIGJvdW5kc1sxXV0sXG4gICAgICAgIFtib3VuZHNbMl0sIGJvdW5kc1szXV1cbiAgICAgIF0gYXMgW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dLFxuICAgICAgbGF5ZXJzLFxuICAgICAgc3JzLFxuICAgICAgdHJhbnNwYXJlbnRcbiAgICB9O1xuICAgIGlmIChzcnMgPT09ICdFUFNHOjM4NTcnKSB7XG4gICAgICBjb25zdCBbbWluWCwgbWluWV0gPSBXR1M4NFRvUHNldWRvTWVyY2F0b3IoW2JvdW5kc1swXSwgYm91bmRzWzFdXSk7XG4gICAgICBjb25zdCBbbWF4WCwgbWF4WV0gPSBXR1M4NFRvUHNldWRvTWVyY2F0b3IoW2JvdW5kc1syXSwgYm91bmRzWzNdXSk7XG4gICAgICByZXF1ZXN0UGFyYW1zLmJvdW5kaW5nQm94ID0gW1xuICAgICAgICBbbWluWCwgbWluWV0sXG4gICAgICAgIFttYXhYLCBtYXhZXVxuICAgICAgXTtcbiAgICAgIC8vIFRPRE86IHJlbW92ZSBiYm94IG9uY2UgZGVjay5nbCBpcyB1cGdyYWRlZCB0byBeOC4xMCB3aXRoIGxvYWRlcnMuZ2wgXjRcbiAgICAgIHJlcXVlc3RQYXJhbXMuYmJveCA9IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5zdGF0ZS5sb2FkQ291bnRlcisrO1xuICAgICAgdGhpcy5wcm9wcy5vbkltYWdlTG9hZFN0YXJ0KHJlcXVlc3RJZCk7XG5cbiAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgdGhpcy5zdGF0ZS5pbWFnZVNvdXJjZS5nZXRJbWFnZShyZXF1ZXN0UGFyYW1zKTtcblxuICAgICAgLy8gSWYgYSByZXF1ZXN0IHRha2VzIGEgbG9uZyB0aW1lLCBsYXRlciByZXF1ZXN0cyBtYXkgaGF2ZSBhbHJlYWR5IGxvYWRlZC5cbiAgICAgIGlmICh0aGlzLnN0YXRlLmxhc3RSZXF1ZXN0SWQgPCByZXF1ZXN0SWQpIHtcbiAgICAgICAgdGhpcy5nZXRDdXJyZW50TGF5ZXIoKT8ucHJvcHMub25JbWFnZUxvYWQocmVxdWVzdElkKTtcbiAgICAgICAgLy8gTm90IHR5cGUgc2FmZS4uLlxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBpbWFnZSxcbiAgICAgICAgICBib3VuZHMsXG4gICAgICAgICAgbGFzdFJlcXVlc3RQYXJhbWV0ZXJzOiByZXF1ZXN0UGFyYW1zLFxuICAgICAgICAgIGxhc3RSZXF1ZXN0SWQ6IHJlcXVlc3RJZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5jb250ZXh0Lm9uRXJyb3I/LihlcnJvciBhcyBFcnJvciwgdGhpcyk7XG4gICAgICB0aGlzLmdldEN1cnJlbnRMYXllcigpPy5wcm9wcy5vbkltYWdlTG9hZEVycm9yKHJlcXVlc3RJZCwgZXJyb3IgYXMgRXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YXRlLmxvYWRDb3VudGVyLS07XG4gICAgfVxuICB9XG5cbiAgLy8gSEVMUEVSU1xuXG4gIC8qKiBHbG9iYWwgY291bnRlciBmb3IgaXNzdWluZyB1bmlxdWUgcmVxdWVzdCBpZHMgKi9cbiAgcHJpdmF0ZSBnZXRSZXF1ZXN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5fbmV4dFJlcXVlc3RJZCsrO1xuICB9XG5cbiAgLyoqIFJ1bnMgYW4gYWN0aW9uIGluIHRoZSBmdXR1cmUsIGNhbmNlbHMgaXQgaWYgdGhlIG5ldyBhY3Rpb24gaXMgaXNzdWVkIGJlZm9yZSBpdCBleGVjdXRlcyAqL1xuICBwcml2YXRlIGRlYm91bmNlKGZuOiAoKSA9PiB2b2lkLCBtcyA9IDUwMCk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnN0YXRlLl90aW1lb3V0SWQpO1xuICAgIHRoaXMuc3RhdGUuX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gZm4oKSwgbXMpO1xuICB9XG59XG5cbi8vIGh0dHBzOi8vZXBzZy5pby8zODU3XG4vLyArcHJvaj1tZXJjICthPTYzNzgxMzcgK2I9NjM3ODEzNyArbGF0X3RzPTAgK2xvbl8wPTAgK3hfMD0wICt5XzA9MCAraz0xICt1bml0cz1tICtuYWRncmlkcz1AbnVsbCArd2t0ZXh0ICtub19kZWZzICt0eXBlPWNyc1xuY29uc3QgSEFMRl9FQVJUSF9DSVJDVU1GRVJFTkNFID0gNjM3ODEzNyAqIE1hdGguUEk7XG5cbi8qKiBQcm9qZWN0cyBFUFNHOjQzMjYgdG8gRVBTRzozODU3XG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgcmVwbGFjZW1lbnQgb2YgcHJvajQuIFVzZSB0ZXN0cyB0byBlbnN1cmUgY29uZm9ybWFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXR1M4NFRvUHNldWRvTWVyY2F0b3IoY29vcmQ6IFtudW1iZXIsIG51bWJlcl0pOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgbWVyY2F0b3IgPSBsbmdMYXRUb1dvcmxkKGNvb3JkKTtcbiAgbWVyY2F0b3JbMF0gPSAobWVyY2F0b3JbMF0gLyAyNTYgLSAxKSAqIEhBTEZfRUFSVEhfQ0lSQ1VNRkVSRU5DRTtcbiAgbWVyY2F0b3JbMV0gPSAobWVyY2F0b3JbMV0gLyAyNTYgLSAxKSAqIEhBTEZfRUFSVEhfQ0lSQ1VNRkVSRU5DRTtcbiAgcmV0dXJuIG1lcmNhdG9yO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxZQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxLQUFBLEdBQUFELE9BQUE7QUFVQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxJQUFBLEdBQUFILE9BQUE7QUFBK0QsU0FBQUksUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQs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