@flowmap.gl/layers 8.0.0-alpha.24 → 8.0.0-alpha.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { CompositeLayer } from '@deck.gl/core';
2
- import { FlowLinesLayerAttributes, FlowmapData, FlowmapDataAccessors, FlowmapDataProvider, LayersData, FlowmapAggregateAccessors, FilterState } from '@flowmap.gl/data';
2
+ import { FilterState, FlowLinesLayerAttributes, FlowmapAggregateAccessors, FlowmapData, FlowmapDataAccessors, FlowmapDataProvider, LayersData } from '@flowmap.gl/data';
3
3
  import { FlowmapLayerPickingInfo, LayerProps } from './types';
4
4
  export declare type FlowmapLayerProps<L, F> = {
5
5
  data?: FlowmapData<L, F>;
@@ -42,6 +42,8 @@ declare type State<L, F> = {
42
42
  layersData: LayersData | undefined;
43
43
  highlightedObject: HighlightedObject | undefined;
44
44
  pickingInfo: FlowmapLayerPickingInfo<L, F> | undefined;
45
+ lastHoverTime: number | undefined;
46
+ lastClickTime: number | undefined;
45
47
  };
46
48
  export declare type SourceEvent = {
47
49
  srcEvent: MouseEvent;
@@ -1 +1 @@
1
- {"version":3,"file":"FlowmapLayer.d.ts","sourceRoot":"","sources":["../src/FlowmapLayer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FlowmapLayer.d.ts","sourceRoot":"","sources":["../src/FlowmapLayer.ts"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
25
25
  */
26
26
  import { CompositeLayer } from '@deck.gl/core';
27
27
  import { ScatterplotLayer, TextLayer } from '@deck.gl/layers';
28
- import { colorAsRgba, getFlowLineAttributesByIndex, getFlowmapColors, getOuterCircleRadiusByIndex, getLocationCoordsByIndex, isFlowmapData, isFlowmapDataProvider, LocalFlowmapDataProvider, FlowmapAggregateAccessors, } from '@flowmap.gl/data';
28
+ import { colorAsRgba, FlowmapAggregateAccessors, getFlowLineAttributesByIndex, getFlowmapColors, getLocationCoordsByIndex, getOuterCircleRadiusByIndex, isFlowmapData, isFlowmapDataProvider, LocalFlowmapDataProvider, } from '@flowmap.gl/data';
29
29
  import AnimatedFlowLinesLayer from './AnimatedFlowLinesLayer';
30
30
  import FlowCirclesLayer from './FlowCirclesLayer';
31
31
  import FlowLinesLayer from './FlowLinesLayer';
@@ -55,25 +55,41 @@ var HighlightType;
55
55
  export default class FlowmapLayer extends CompositeLayer {
56
56
  constructor(props) {
57
57
  super(Object.assign(Object.assign({}, props), { onHover: (info, event) => {
58
- // TODO: if (lastHoverEventStartTimeRef > startTime) {
59
- // // Skipping, because this is not the latest hover event
60
- // return;
61
- // }
62
- this.setState({ highlightedObject: this._getHighlightedObject(info) });
58
+ const startTime = Date.now();
59
+ this.setState({
60
+ highlightedObject: this._getHighlightedObject(info),
61
+ lastHoverTime: startTime,
62
+ });
63
63
  const { onHover } = props;
64
64
  if (onHover) {
65
65
  this._getFlowmapLayerPickingInfo(info).then((info) => {
66
- this.setState({ pickingInfo: info });
67
- onHover(info, event);
66
+ var _a, _b;
67
+ if (((_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.lastHoverTime) !== null && _b !== void 0 ? _b : 0) <= startTime) {
68
+ this.setState({ pickingInfo: info });
69
+ onHover(info, event);
70
+ }
71
+ else {
72
+ // Skipping, because this is not the latest hover event
73
+ }
68
74
  });
69
75
  }
70
76
  }, onClick: (info, event) => {
71
77
  const { onClick } = props;
78
+ const startTime = Date.now();
79
+ this.setState({
80
+ lastClickTime: startTime,
81
+ });
72
82
  if (onClick) {
73
83
  this._getFlowmapLayerPickingInfo(info).then((info) => {
74
- this.setState({ pickingInfo: info });
75
- if (info) {
76
- onClick(info, event);
84
+ var _a, _b;
85
+ if (((_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.lastClickTime) !== null && _b !== void 0 ? _b : 0) <= startTime) {
86
+ this.setState({ pickingInfo: info });
87
+ if (info) {
88
+ onClick(info, event);
89
+ }
90
+ }
91
+ else {
92
+ // Skipping, because this is not the latest hover event
77
93
  }
78
94
  });
79
95
  }
@@ -86,6 +102,8 @@ export default class FlowmapLayer extends CompositeLayer {
86
102
  layersData: undefined,
87
103
  highlightedObject: undefined,
88
104
  pickingInfo: undefined,
105
+ lastHoverTime: undefined,
106
+ lastClickTime: undefined,
89
107
  };
90
108
  }
91
109
  getPickingInfo({ info }) {
@@ -382,4 +400,4 @@ function pickViewportProps(viewport) {
382
400
  bearing,
383
401
  };
384
402
  }
385
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd21hcExheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Zsb3dtYXBMYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsV0FBVyxFQUtYLDRCQUE0QixFQUM1QixnQkFBZ0IsRUFDaEIsMkJBQTJCLEVBQzNCLHdCQUF3QixFQUN4QixhQUFhLEVBQ2IscUJBQXFCLEVBRXJCLHdCQUF3QixFQUV4Qix5QkFBeUIsR0FFMUIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLHNCQUFzQixNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sZ0JBQWdCLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxjQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUlMLFdBQVcsR0FDWixNQUFNLFNBQVMsQ0FBQztBQTRCakIsTUFBTSxnQ0FBZ0MsR0FBYTtJQUNqRCxRQUFRO0lBQ1IsdUJBQXVCO0lBQ3ZCLHVCQUF1QjtJQUN2Qix1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixpQkFBaUI7SUFDakIsYUFBYTtJQUNiLG9CQUFvQjtJQUNwQixnQkFBZ0I7SUFDaEIsVUFBVTtJQUNWLFlBQVk7SUFDWixhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLHVCQUF1QjtDQUN4QixDQUFDO0FBRUYsSUFBSyxhQUdKO0FBSEQsV0FBSyxhQUFhO0lBQ2hCLHNDQUFxQixDQUFBO0lBQ3JCLDhCQUFhLENBQUE7QUFDZixDQUFDLEVBSEksYUFBYSxLQUFiLGFBQWEsUUFHakI7QUF5QkQsTUFBTSxDQUFDLE9BQU8sT0FBTyxZQUFtQixTQUFRLGNBQWM7SUFtQjVELFlBQW1C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QUFRO1FBQ1IsSUFBSTtRQUNKLEtBQUs7UUFDTCxPQUFPO0tBQ1IsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjIgRmxvd21hcEJsdWVcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKi9cbmltcG9ydCB7Q29tcG9zaXRlTGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2NvcmUnO1xuaW1wb3J0IHtTY2F0dGVycGxvdExheWVyLCBUZXh0TGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2xheWVycyc7XG5pbXBvcnQge1xuICBjb2xvckFzUmdiYSxcbiAgRmxvd0xpbmVzTGF5ZXJBdHRyaWJ1dGVzLFxuICBGbG93bWFwRGF0YSxcbiAgRmxvd21hcERhdGFBY2Nlc3NvcnMsXG4gIEZsb3dtYXBEYXRhUHJvdmlkZXIsXG4gIGdldEZsb3dMaW5lQXR0cmlidXRlc0J5SW5kZXgsXG4gIGdldEZsb3dtYXBDb2xvcnMsXG4gIGdldE91dGVyQ2lyY2xlUmFkaXVzQnlJbmRleCxcbiAgZ2V0TG9jYXRpb25Db29yZHNCeUluZGV4LFxuICBpc0Zsb3dtYXBEYXRhLFxuICBpc0Zsb3dtYXBEYXRhUHJvdmlkZXIsXG4gIExheWVyc0RhdGEsXG4gIExvY2FsRmxvd21hcERhdGFQcm92aWRlcixcbiAgVmlld3BvcnRQcm9wcyxcbiAgRmxvd21hcEFnZ3JlZ2F0ZUFjY2Vzc29ycyxcbiAgRmlsdGVyU3RhdGUsXG59IGZyb20gJ0BmbG93bWFwLmdsL2RhdGEnO1xuaW1wb3J0IEFuaW1hdGVkRmxvd0xpbmVzTGF5ZXIgZnJvbSAnLi9BbmltYXRlZEZsb3dMaW5lc0xheWVyJztcbmltcG9ydCBGbG93Q2lyY2xlc0xheWVyIGZyb20gJy4vRmxvd0NpcmNsZXNMYXllcic7XG5pbXBvcnQgRmxvd0xpbmVzTGF5ZXIgZnJvbSAnLi9GbG93TGluZXNMYXllcic7XG5pbXBvcnQge1xuICBGbG93bWFwTGF5ZXJQaWNraW5nSW5mbyxcbiAgTGF5ZXJQcm9wcyxcbiAgUGlja2luZ0luZm8sXG4gIFBpY2tpbmdUeXBlLFxufSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgRmxvd21hcExheWVyUHJvcHM8TCwgRj4gPSB7XG4gIGRhdGE/OiBGbG93bWFwRGF0YTxMLCBGPjtcbiAgZGF0YVByb3ZpZGVyPzogRmxvd21hcERhdGFQcm92aWRlcjxMLCBGPjtcbiAgZmlsdGVyPzogRmlsdGVyU3RhdGU7XG4gIGxvY2F0aW9uVG90YWxzRW5hYmxlZD86IGJvb2xlYW47XG4gIGxvY2F0aW9uTGFiZWxzRW5hYmxlZD86IGJvb2xlYW47XG4gIGFkYXB0aXZlU2NhbGVzRW5hYmxlZD86IGJvb2xlYW47XG4gIGFuaW1hdGlvbkVuYWJsZWQ/OiBib29sZWFuO1xuICBjbHVzdGVyaW5nRW5hYmxlZD86IGJvb2xlYW47XG4gIGNsdXN0ZXJpbmdMZXZlbD86IG51bWJlcjtcbiAgZmFkZUVuYWJsZWQ/OiBib29sZWFuO1xuICBmYWRlT3BhY2l0eUVuYWJsZWQ/OiBib29sZWFuO1xuICBjbHVzdGVyaW5nQXV0bz86IGJvb2xlYW47XG4gIGRhcmtNb2RlPzogYm9vbGVhbjtcbiAgZmFkZUFtb3VudD86IG51bWJlcjtcbiAgY29sb3JTY2hlbWU/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgaGlnaGxpZ2h0Q29sb3I/OiBzdHJpbmcgfCBudW1iZXJbXTtcbiAgbWF4VG9wRmxvd3NEaXNwbGF5TnVtPzogbnVtYmVyO1xuICBvbkhvdmVyPzogKFxuICAgIGluZm86IEZsb3dtYXBMYXllclBpY2tpbmdJbmZvPEwsIEY+IHwgdW5kZWZpbmVkLFxuICAgIGV2ZW50OiBTb3VyY2VFdmVudCxcbiAgKSA9PiB2b2lkO1xuICBvbkNsaWNrPzogKGluZm86IEZsb3dtYXBMYXllclBpY2tpbmdJbmZvPEwsIEY+LCBldmVudDogU291cmNlRXZlbnQpID0+IHZvaWQ7XG59ICYgUGFydGlhbDxGbG93bWFwRGF0YUFjY2Vzc29yczxMLCBGPj4gJlxuICBMYXllclByb3BzO1xuXG5jb25zdCBQUk9QU19UT19DQVVTRV9MQVlFUl9EQVRBX1VQREFURTogc3RyaW5nW10gPSBbXG4gICdmaWx0ZXInLFxuICAnbG9jYXRpb25Ub3RhbHNFbmFibGVkJyxcbiAgJ2xvY2F0aW9uTGFiZWxzRW5hYmxlZCcsXG4gICdhZGFwdGl2ZVNjYWxlc0VuYWJsZWQnLFxuICAnYW5pbWF0aW9uRW5hYmxlZCcsXG4gICdjbHVzdGVyaW5nRW5hYmxlZCcsXG4gICdjbHVzdGVyaW5nTGV2ZWwnLFxuICAnZmFkZUVuYWJsZWQnLFxuICAnZmFkZU9wYWNpdHlFbmFibGVkJyxcbiAgJ2NsdXN0ZXJpbmdBdXRvJyxcbiAgJ2RhcmtNb2RlJyxcbiAgJ2ZhZGVBbW91bnQnLFxuICAnY29sb3JTY2hlbWUnLFxuICAnaGlnaGxpZ2h0Q29sb3InLFxuICAnbWF4VG9wRmxvd3NEaXNwbGF5TnVtJyxcbl07XG5cbmVudW0gSGlnaGxpZ2h0VHlwZSB7XG4gIExPQ0FUSU9OID0gJ2xvY2F0aW9uJyxcbiAgRkxPVyA9ICdmbG93Jyxcbn1cblxudHlwZSBIaWdobGlnaHRlZExvY2F0aW9uT2JqZWN0ID0ge1xuICB0eXBlOiBIaWdobGlnaHRUeXBlLkxPQ0FUSU9OO1xuICBjb29yZHM6IFtudW1iZXIsIG51bWJlcl07XG4gIHJhZGl1czogbnVtYmVyO1xufTtcblxudHlwZSBIaWdobGlnaHRlZEZsb3dPYmplY3QgPSB7XG4gIHR5cGU6IEhpZ2hsaWdodFR5cGUuRkxPVztcbiAgbGluZUF0dHJpYnV0ZXM6IEZsb3dMaW5lc0xheWVyQXR0cmlidXRlcztcbn07XG5cbnR5cGUgSGlnaGxpZ2h0ZWRPYmplY3QgPSBIaWdobGlnaHRlZExvY2F0aW9uT2JqZWN0IHwgSGlnaGxpZ2h0ZWRGbG93T2JqZWN0O1xuXG50eXBlIFN0YXRlPEwsIEY+ID0ge1xuICBhY2Nlc3NvcnM6IEZsb3dtYXBBZ2dyZWdhdGVBY2Nlc3NvcnM8TCwgRj47XG4gIGRhdGFQcm92aWRlcjogRmxvd21hcERhdGFQcm92aWRlcjxMLCBGPjtcbiAgbGF5ZXJzRGF0YTogTGF5ZXJzRGF0YSB8IHVuZGVmaW5lZDtcbiAgaGlnaGxpZ2h0ZWRPYmplY3Q6IEhpZ2hsaWdodGVkT2JqZWN0IHwgdW5kZWZpbmVkO1xuICBwaWNraW5nSW5mbzogRmxvd21hcExheWVyUGlja2luZ0luZm88TCwgRj4gfCB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgdHlwZSBTb3VyY2VFdmVudCA9IHtzcmNFdmVudDogTW91c2VFdmVudH07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZsb3dtYXBMYXllcjxMLCBGPiBleHRlbmRzIENvbXBvc2l0ZUxheWVyIHtcbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBkYXJrTW9kZTogdHJ1ZSxcbiAgICBmYWRlQW1vdW50OiA1MCxcbiAgICBsb2NhdGlvblRvdGFsc0VuYWJsZWQ6IHRydWUsXG4gICAgbG9jYXRpb25MYWJlbHNFbmFibGVkOiBmYWxzZSxcbiAgICBhbmltYXRpb25FbmFibGVkOiBmYWxzZSxcbiAgICBjbHVzdGVyaW5nRW5hYmxlZDogdHJ1ZSxcbiAgICBmYWRlRW5hYmxlZDogdHJ1ZSxcbiAgICBmYWRlT3BhY2l0eUVuYWJsZWQ6IGZhbHNlLFxuICAgIGNsdXN0ZXJpbmdBdXRvOiB0cnVlLFxuICAgIGNsdXN0ZXJpbmdMZXZlbDogdW5kZWZpbmVkLFxuICAgIGFkYXB0aXZlU2NhbGVzRW5hYmxlZDogdHJ1ZSxcbiAgICBjb2xvclNjaGVtZTogJ1RlYWwnLFxuICAgIGhpZ2hsaWdodENvbG9yOiAnb3JhbmdlJyxcbiAgICBtYXhUb3BGbG93c0Rpc3BsYXlOdW06IDUwMDAsXG4gIH07XG4gIHN0YXRlOiBTdGF0ZTxMLCBGPiB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IEZsb3dtYXBMYXllclByb3BzPEwsIEY+KSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBvbkhvdmVyOiAoaW5mbzogUGlja2luZ0luZm88YW55PiwgZXZlbnQ6IFNvdXJjZUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIFRPRE86IGlmIChsYXN0SG92ZXJFdmVudFN0YXJ0VGltZVJlZiA+IHN0YXJ0VGltZSkge1xuICAgICAgICAvLyAgIC8vIFNraXBwaW5nLCBiZWNhdXNlIHRoaXMgaXMgbm90IHRoZSBsYXRlc3QgaG92ZXIgZXZlbnRcbiAgICAgICAgLy8gICByZXR1cm47XG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aGlnaGxpZ2h0ZWRPYmplY3Q6IHRoaXMuX2dldEhpZ2hsaWdodGVkT2JqZWN0KGluZm8pfSk7XG4gICAgICAgIGNvbnN0IHtvbkhvdmVyfSA9IHByb3BzO1xuICAgICAgICBpZiAob25Ib3Zlcikge1xuICAgICAgICAgIHRoaXMuX2dldEZsb3dtYXBMYXllclBpY2tpbmdJbmZvKGluZm8pLnRoZW4oKGluZm8pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe3BpY2tpbmdJbmZvOiBpbmZvfSk7XG4gICAgICAgICAgICBvbkhvdmVyKGluZm8sIGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uQ2xpY2s6IChpbmZvOiBQaWNraW5nSW5mbzxhbnk+LCBldmVudDogU291cmNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qge29uQ2xpY2t9ID0gcHJvcHM7XG4gICAgICAgIGlmIChvbkNsaWNrKSB7XG4gICAgICAgICAgdGhpcy5fZ2V0Rmxvd21hcExheWVyUGlja2luZ0luZm8oaW5mbykudGhlbigoaW5mbykgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7cGlja2luZ0luZm86IGluZm99KTtcbiAgICAgICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICAgIG9uQ2xpY2soaW5mbywgZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgaW5pdGlhbGl6ZVN0YXRlKCkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBhY2Nlc3NvcnM6IG5ldyBGbG93bWFwQWdncmVnYXRlQWNjZXNzb3JzPEwsIEY+KHRoaXMucHJvcHMpLFxuICAgICAgZGF0YVByb3ZpZGVyOiB0aGlzLl9nZXRPck1ha2VEYXRhUHJvdmlkZXIoKSxcbiAgICAgIGxheWVyc0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgIGhpZ2hsaWdodGVkT2JqZWN0OiB1bmRlZmluZWQsXG4gICAgICBwaWNraW5nSW5mbzogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBnZXRQaWNraW5nSW5mbyh7aW5mb306IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAvLyBUaGlzIGlzIGZvciBvbkhvdmVyIGV2ZW50IGhhbmRsZXJzIHNldCBvbiB0aGUgPERlY2tHTD4gY29tcG9uZW50XG4gICAgaWYgKCFpbmZvLm9iamVjdCkge1xuICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5zdGF0ZT8ucGlja2luZ0luZm8/Lm9iamVjdDtcbiAgICAgIGlmIChvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5pbmZvLFxuICAgICAgICAgIG9iamVjdCxcbiAgICAgICAgICBwaWNrZWQ6IHRydWUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBfdXBkYXRlQWNjZXNzb3JzKCkge1xuICAvLyAgIHRoaXMuc3RhdGU/LmRhdGFQcm92aWRlcj8uc2V0QWNjZXNzb3JzKHRoaXMucHJvcHMpO1xuICAvLyAgIHRoaXMuc2V0U3RhdGUoe2FjY2Vzc29yczogbmV3IEZsb3dtYXBBZ2dyZWdhdGVBY2Nlc3NvcnModGhpcy5wcm9wcyl9KTtcbiAgLy8gfVxuXG4gIHByaXZhdGUgX2dldE9yTWFrZURhdGFQcm92aWRlcigpIHtcbiAgICBjb25zdCB7ZGF0YSwgZGF0YVByb3ZpZGVyfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKGlzRmxvd21hcERhdGFQcm92aWRlcjxMLCBGPihkYXRhUHJvdmlkZXIpKSB7XG4gICAgICByZXR1cm4gZGF0YVByb3ZpZGVyO1xuICAgIH0gZWxzZSBpZiAoaXNGbG93bWFwRGF0YTxMLCBGPihkYXRhKSkge1xuICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gbmV3IExvY2FsRmxvd21hcERhdGFQcm92aWRlcjxMLCBGPih0aGlzLnByb3BzKTtcbiAgICAgIGRhdGFQcm92aWRlci5zZXRGbG93bWFwRGF0YShkYXRhKTtcbiAgICAgIHJldHVybiBkYXRhUHJvdmlkZXI7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdGbG93bWFwTGF5ZXI6IGRhdGEgbXVzdCBiZSBhIEZsb3dtYXBEYXRhUHJvdmlkZXIgb3IgRmxvd21hcERhdGEnLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVEYXRhUHJvdmlkZXIoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7ZGF0YVByb3ZpZGVyOiB0aGlzLl9nZXRPck1ha2VEYXRhUHJvdmlkZXIoKX0pO1xuICB9XG5cbiAgc2hvdWxkVXBkYXRlU3RhdGUocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYm9vbGVhbiB7XG4gICAgY29uc3Qge2NoYW5nZUZsYWdzfSA9IHBhcmFtcztcbiAgICAvLyBpZiAodGhpcy5fdmlld3BvcnRDaGFuZ2VkKCkpIHtcbiAgICAvLyAgIHJldHVybiB0cnVlO1xuICAgIC8vIH1cbiAgICBpZiAoY2hhbmdlRmxhZ3Mudmlld3BvcnRDaGFuZ2VkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnNob3VsZFVwZGF0ZVN0YXRlKHBhcmFtcyk7XG4gICAgLy8gVE9ETzogYmUgc21hcnRlciBvbiB3aGVuIHRvIHVwZGF0ZVxuICAgIC8vIChlLmcuIGlnbm9yZSB2aWV3cG9ydCBjaGFuZ2VzIHdoZW4gYWRhcHRpdmVTY2FsZXNFbmFibGVkIGFuZCBjbHVzdGVyaW5nIGFyZSBmYWxzZSlcbiAgfVxuXG4gIHVwZGF0ZVN0YXRlKHtvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzfTogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VGbGFncy5wcm9wc0NoYW5nZWQpIHtcbiAgICAgIC8vIHRoaXMuX3VwZGF0ZUFjY2Vzc29ycygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlRmxhZ3MuZGF0YUNoYW5nZWQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZURhdGFQcm92aWRlcigpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlRmxhZ3Mudmlld3BvcnRDaGFuZ2VkIHx8IGNoYW5nZUZsYWdzLmRhdGFDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtoaWdobGlnaHRlZE9iamVjdDogdW5kZWZpbmVkfSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY2hhbmdlRmxhZ3Mudmlld3BvcnRDaGFuZ2VkIHx8XG4gICAgICBjaGFuZ2VGbGFncy5kYXRhQ2hhbmdlZCB8fFxuICAgICAgKGNoYW5nZUZsYWdzLnByb3BzQ2hhbmdlZCAmJlxuICAgICAgICBQUk9QU19UT19DQVVTRV9MQVlFUl9EQVRBX1VQREFURS5zb21lKFxuICAgICAgICAgIChwcm9wKSA9PiBvbGRQcm9wc1twcm9wXSAhPT0gcHJvcHNbcHJvcF0sXG4gICAgICAgICkpXG4gICAgKSB7XG4gICAgICBjb25zdCB7ZGF0YVByb3ZpZGVyfSA9IHRoaXMuc3RhdGUgfHwge307XG4gICAgICBpZiAoZGF0YVByb3ZpZGVyKSB7XG4gICAgICAgIGRhdGFQcm92aWRlci5zZXRGbG93bWFwU3RhdGUodGhpcy5fZ2V0Rmxvd21hcFN0YXRlKCkpO1xuICAgICAgICBkYXRhUHJvdmlkZXIudXBkYXRlTGF5ZXJzRGF0YSgobGF5ZXJzRGF0YTogTGF5ZXJzRGF0YSB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2xheWVyc0RhdGEsIGhpZ2hsaWdodGVkT2JqZWN0OiB1bmRlZmluZWR9KTtcbiAgICAgICAgfSwgY2hhbmdlRmxhZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldFNldHRpbmdzU3RhdGUoKSB7XG4gICAgY29uc3Qge1xuICAgICAgbG9jYXRpb25Ub3RhbHNFbmFibGVkLFxuICAgICAgbG9jYXRpb25MYWJlbHNFbmFibGVkLFxuICAgICAgYWRhcHRpdmVTY2FsZXNFbmFibGVkLFxuICAgICAgYW5pbWF0aW9uRW5hYmxlZCxcbiAgICAgIGNsdXN0ZXJpbmdFbmFibGVkLFxuICAgICAgY2x1c3RlcmluZ0xldmVsLFxuICAgICAgZmFkZUVuYWJsZWQsXG4gICAgICBmYWRlT3BhY2l0eUVuYWJsZWQsXG4gICAgICBjbHVzdGVyaW5nQXV0byxcbiAgICAgIGRhcmtNb2RlLFxuICAgICAgZmFkZUFtb3VudCxcbiAgICAgIGNvbG9yU2NoZW1lLFxuICAgICAgaGlnaGxpZ2h0Q29sb3IsXG4gICAgICBtYXhUb3BGbG93c0Rpc3BsYXlOdW0sXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2F0aW9uVG90YWxzRW5hYmxlZCxcbiAgICAgIGxvY2F0aW9uTGFiZWxzRW5hYmxlZCxcbiAgICAgIGFkYXB0aXZlU2NhbGVzRW5hYmxlZCxcbiAgICAgIGFuaW1hdGlvbkVuYWJsZWQsXG4gICAgICBjbHVzdGVyaW5nRW5hYmxlZCxcbiAgICAgIGNsdXN0ZXJpbmdMZXZlbCxcbiAgICAgIGZhZGVFbmFibGVkLFxuICAgICAgZmFkZU9wYWNpdHlFbmFibGVkLFxuICAgICAgY2x1c3RlcmluZ0F1dG8sXG4gICAgICBkYXJrTW9kZSxcbiAgICAgIGZhZGVBbW91bnQsXG4gICAgICBjb2xvclNjaGVtZSxcbiAgICAgIGhpZ2hsaWdodENvbG9yLFxuICAgICAgbWF4VG9wRmxvd3NEaXNwbGF5TnVtLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9nZXRGbG93bWFwU3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZpZXdwb3J0OiBwaWNrVmlld3BvcnRQcm9wcyh0aGlzLmNvbnRleHQudmlld3BvcnQpLFxuICAgICAgZmlsdGVyOiB0aGlzLnByb3BzLmZpbHRlcixcbiAgICAgIHNldHRpbmdzOiB0aGlzLl9nZXRTZXR0aW5nc1N0YXRlKCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2dldEZsb3dtYXBMYXllclBpY2tpbmdJbmZvKFxuICAgIGluZm86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICk6IFByb21pc2U8Rmxvd21hcExheWVyUGlja2luZ0luZm88TCwgRj4gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCB7aW5kZXgsIHNvdXJjZUxheWVyfSA9IGluZm87XG4gICAgY29uc3Qge2RhdGFQcm92aWRlciwgYWNjZXNzb3JzfSA9IHRoaXMuc3RhdGUgfHwge307XG4gICAgaWYgKCFkYXRhUHJvdmlkZXIgfHwgIWFjY2Vzc29ycykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY29tbW9uSW5mbyA9IHtcbiAgICAgIC4uLmluZm8sXG4gICAgICBwaWNrZWQ6IGluZm8ucGlja2VkLFxuICAgICAgbGF5ZXI6IGluZm8ubGF5ZXIsXG4gICAgICBpbmRleDogaW5mby5pbmRleCxcbiAgICAgIHg6IGluZm8ueCxcbiAgICAgIHk6IGluZm8ueSxcbiAgICAgIGNvb3JkaW5hdGU6IGluZm8uY29vcmRpbmF0ZSxcbiAgICAgIGV2ZW50OiBpbmZvLmV2ZW50LFxuICAgIH07XG4gICAgaWYgKFxuICAgICAgc291cmNlTGF5ZXIgaW5zdGFuY2VvZiBGbG93TGluZXNMYXllciB8fFxuICAgICAgc291cmNlTGF5ZXIgaW5zdGFuY2VvZiBBbmltYXRlZEZsb3dMaW5lc0xheWVyXG4gICAgKSB7XG4gICAgICBjb25zdCBmbG93ID1cbiAgICAgICAgaW5kZXggPT09IC0xID8gdW5kZWZpbmVkIDogYXdhaXQgZGF0YVByb3ZpZGVyLmdldEZsb3dCeUluZGV4KGluZGV4KTtcbiAgICAgIGlmIChmbG93KSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IGF3YWl0IGRhdGFQcm92aWRlci5nZXRMb2NhdGlvbkJ5SWQoXG4gICAgICAgICAgYWNjZXNzb3JzLmdldEZsb3dPcmlnaW5JZChmbG93KSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGVzdCA9IGF3YWl0IGRhdGFQcm92aWRlci5nZXRMb2NhdGlvbkJ5SWQoXG4gICAgICAgICAgYWNjZXNzb3JzLmdldEZsb3dEZXN0SWQoZmxvdyksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcmlnaW4gJiYgZGVzdCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jb21tb25JbmZvLFxuICAgICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICAgIHR5cGU6IFBpY2tpbmdUeXBlLkZMT1csXG4gICAgICAgICAgICAgIGZsb3csXG4gICAgICAgICAgICAgIG9yaWdpbjogb3JpZ2luLFxuICAgICAgICAgICAgICBkZXN0OiBkZXN0LFxuICAgICAgICAgICAgICBjb3VudDogYWNjZXNzb3JzLmdldEZsb3dNYWduaXR1ZGUoZmxvdyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNvdXJjZUxheWVyIGluc3RhbmNlb2YgRmxvd0NpcmNsZXNMYXllcikge1xuICAgICAgY29uc3QgbG9jYXRpb24gPVxuICAgICAgICBpbmRleCA9PT0gLTEgPyB1bmRlZmluZWQgOiBhd2FpdCBkYXRhUHJvdmlkZXIuZ2V0TG9jYXRpb25CeUluZGV4KGluZGV4KTtcblxuICAgICAgaWYgKGxvY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGlkID0gYWNjZXNzb3JzLmdldExvY2F0aW9uSWQobG9jYXRpb24pO1xuICAgICAgICBjb25zdCBuYW1lID0gYWNjZXNzb3JzLmdldExvY2F0aW9uTmFtZShsb2NhdGlvbik7XG4gICAgICAgIGNvbnN0IHRvdGFscyA9IGF3YWl0IGRhdGFQcm92aWRlci5nZXRUb3RhbHNGb3JMb2NhdGlvbihpZCk7XG4gICAgICAgIGNvbnN0IHtjaXJjbGVBdHRyaWJ1dGVzfSA9IHRoaXMuc3RhdGU/LmxheWVyc0RhdGEgfHwge307XG4gICAgICAgIGlmICh0b3RhbHMgJiYgY2lyY2xlQXR0cmlidXRlcykge1xuICAgICAgICAgIGNvbnN0IGNpcmNsZVJhZGl1cyA9IGdldE91dGVyQ2lyY2xlUmFkaXVzQnlJbmRleChcbiAgICAgICAgICAgIGNpcmNsZUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBpbmZvLmluZGV4LFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNvbW1vbkluZm8sXG4gICAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgICAgdHlwZTogUGlja2luZ1R5cGUuTE9DQVRJT04sXG4gICAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgdG90YWxzLFxuICAgICAgICAgICAgICBjaXJjbGVSYWRpdXM6IGNpcmNsZVJhZGl1cyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF9nZXRIaWdobGlnaHRlZE9iamVjdChcbiAgICBpbmZvOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICApOiBIaWdobGlnaHRlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qge2luZGV4LCBzb3VyY2VMYXllcn0gPSBpbmZvO1xuICAgIGlmIChpbmRleCA8IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgc291cmNlTGF5ZXIgaW5zdGFuY2VvZiBGbG93TGluZXNMYXllciB8fFxuICAgICAgc291cmNlTGF5ZXIgaW5zdGFuY2VvZiBBbmltYXRlZEZsb3dMaW5lc0xheWVyXG4gICAgKSB7XG4gICAgICBjb25zdCB7bGluZUF0dHJpYnV0ZXN9ID0gdGhpcy5zdGF0ZT8ubGF5ZXJzRGF0YSB8fCB7fTtcbiAgICAgIGlmIChsaW5lQXR0cmlidXRlcykge1xuICAgICAgICBsZXQgYXR0cnMgPSBnZXRGbG93TGluZUF0dHJpYnV0ZXNCeUluZGV4KGxpbmVBdHRyaWJ1dGVzLCBpbmRleCk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmZhZGVPcGFjaXR5RW5hYmxlZCkge1xuICAgICAgICAgIGF0dHJzID0ge1xuICAgICAgICAgICAgLi4uYXR0cnMsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgIC4uLmF0dHJzLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIGdldENvbG9yOiB7XG4gICAgICAgICAgICAgICAgLi4uYXR0cnMuYXR0cmlidXRlcy5nZXRDb2xvcixcbiAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgICAgICAgLi4uYXR0cnMuYXR0cmlidXRlcy5nZXRDb2xvci52YWx1ZS5zbGljZSgwLCAzKSxcbiAgICAgICAgICAgICAgICAgIDI1NSwgLy8gdGhlIGhpZ2hsaWdodCBjb2xvciBzaG91bGQgYmUgYWx3YXlzIG9wYXF1ZVxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogSGlnaGxpZ2h0VHlwZS5GTE9XLFxuICAgICAgICAgIGxpbmVBdHRyaWJ1dGVzOiBhdHRycyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNvdXJjZUxheWVyIGluc3RhbmNlb2YgRmxvd0NpcmNsZXNMYXllcikge1xuICAgICAgY29uc3Qge2NpcmNsZUF0dHJpYnV0ZXN9ID0gdGhpcy5zdGF0ZT8ubGF5ZXJzRGF0YSB8fCB7fTtcbiAgICAgIGlmIChjaXJjbGVBdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogSGlnaGxpZ2h0VHlwZS5MT0NBVElPTixcbiAgICAgICAgICBjb29yZHM6IGdldExvY2F0aW9uQ29vcmRzQnlJbmRleChjaXJjbGVBdHRyaWJ1dGVzLCBpbmRleCksXG4gICAgICAgICAgcmFkaXVzOiBnZXRPdXRlckNpcmNsZVJhZGl1c0J5SW5kZXgoY2lyY2xlQXR0cmlidXRlcywgaW5kZXgpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmVuZGVyTGF5ZXJzKCk6IEFycmF5PGFueT4ge1xuICAgIGNvbnN0IGxheWVycyA9IFtdO1xuICAgIGlmICh0aGlzLnN0YXRlPy5sYXllcnNEYXRhKSB7XG4gICAgICBjb25zdCB7bGF5ZXJzRGF0YSwgaGlnaGxpZ2h0ZWRPYmplY3R9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IHtjaXJjbGVBdHRyaWJ1dGVzLCBsaW5lQXR0cmlidXRlcywgbG9jYXRpb25MYWJlbHN9ID1cbiAgICAgICAgbGF5ZXJzRGF0YSB8fCB7fTtcbiAgICAgIGlmIChjaXJjbGVBdHRyaWJ1dGVzICYmIGxpbmVBdHRyaWJ1dGVzKSB7XG4gICAgICAgIGNvbnN0IGZsb3dtYXBDb2xvcnMgPSBnZXRGbG93bWFwQ29sb3JzKHRoaXMuX2dldFNldHRpbmdzU3RhdGUoKSk7XG4gICAgICAgIGNvbnN0IG91dGxpbmVDb2xvciA9IGNvbG9yQXNSZ2JhKFxuICAgICAgICAgIGZsb3dtYXBDb2xvcnMub3V0bGluZUNvbG9yIHx8ICh0aGlzLnByb3BzLmRhcmtNb2RlID8gJyMwMDAnIDogJyNmZmYnKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29tbW9uTGluZUxheWVyUHJvcHMgPSB7XG4gICAgICAgICAgZGF0YTogbGluZUF0dHJpYnV0ZXMsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgLi4udGhpcy5wcm9wcy5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgLy8gcHJldmVudCB6LWZpZ2h0aW5nIGF0IG5vbi16ZXJvIGJlYXJpbmcvcGl0Y2hcbiAgICAgICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuYW5pbWF0aW9uRW5hYmxlZCkge1xuICAgICAgICAgIGxheWVycy5wdXNoKFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3IEFuaW1hdGVkRmxvd0xpbmVzTGF5ZXIoe1xuICAgICAgICAgICAgICAuLi50aGlzLmdldFN1YkxheWVyUHJvcHMoe1xuICAgICAgICAgICAgICAgIC4uLmNvbW1vbkxpbmVMYXllclByb3BzLFxuICAgICAgICAgICAgICAgIGlkOiAnYW5pbWF0ZWQtZmxvdy1saW5lcycsXG4gICAgICAgICAgICAgICAgZHJhd091dGxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRoaWNrbmVzc1VuaXQ6IDIwLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGF5ZXJzLnB1c2goXG4gICAgICAgICAgICBuZXcgRmxvd0xpbmVzTGF5ZXIoe1xuICAgICAgICAgICAgICAuLi50aGlzLmdldFN1YkxheWVyUHJvcHMoe1xuICAgICAgICAgICAgICAgIC4uLmNvbW1vbkxpbmVMYXllclByb3BzLFxuICAgICAgICAgICAgICAgIGlkOiAnZmxvdy1saW5lcycsXG4gICAgICAgICAgICAgICAgZHJhd091dGxpbmU6IHRydWUsXG4gICAgICAgICAgICAgICAgb3V0bGluZUNvbG9yOiBvdXRsaW5lQ29sb3IsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsYXllcnMucHVzaChcbiAgICAgICAgICBuZXcgRmxvd0NpcmNsZXNMYXllcihcbiAgICAgICAgICAgIHRoaXMuZ2V0U3ViTGF5ZXJQcm9wcyh7XG4gICAgICAgICAgICAgIGlkOiAnY2lyY2xlcycsXG4gICAgICAgICAgICAgIGRhdGE6IGNpcmNsZUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIGVtcHR5Q29sb3I6IHRoaXMucHJvcHMuZGFya01vZGVcbiAgICAgICAgICAgICAgICA/IFswLCAwLCAwLCAyNTVdXG4gICAgICAgICAgICAgICAgOiBbMjU1LCAyNTUsIDI1NSwgMjU1XSxcbiAgICAgICAgICAgICAgb3V0bGluZUVtcHR5TWl4OiAwLjQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBpZiAoaGlnaGxpZ2h0ZWRPYmplY3QpIHtcbiAgICAgICAgICBzd2l0Y2ggKGhpZ2hsaWdodGVkT2JqZWN0LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgSGlnaGxpZ2h0VHlwZS5MT0NBVElPTjpcbiAgICAgICAgICAgICAgbGF5ZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IFNjYXR0ZXJwbG90TGF5ZXIoe1xuICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRTdWJMYXllclByb3BzKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdsb2NhdGlvbi1oaWdobGlnaHQnLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBbaGlnaGxpZ2h0ZWRPYmplY3RdLFxuICAgICAgICAgICAgICAgICAgICBwaWNrYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGFudGlhbGlhc2luZzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsbGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbGluZVdpZHRoVW5pdHM6ICdwaXhlbHMnLFxuICAgICAgICAgICAgICAgICAgICBnZXRMaW5lV2lkdGg6IDIsXG4gICAgICAgICAgICAgICAgICAgIHJhZGl1c1VuaXRzOiAncGl4ZWxzJyxcbiAgICAgICAgICAgICAgICAgICAgZ2V0UmFkaXVzOiAoZDogSGlnaGxpZ2h0ZWRMb2NhdGlvbk9iamVjdCkgPT4gZC5yYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgIGdldExpbmVDb2xvcjogY29sb3JBc1JnYmEodGhpcy5wcm9wcy5oaWdobGlnaHRDb2xvciksXG4gICAgICAgICAgICAgICAgICAgIGdldFBvc2l0aW9uOiAoZDogSGlnaGxpZ2h0ZWRMb2NhdGlvbk9iamVjdCkgPT4gZC5jb29yZHMsXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEhpZ2hsaWdodFR5cGUuRkxPVzpcbiAgICAgICAgICAgICAgbGF5ZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IEZsb3dMaW5lc0xheWVyKHtcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0U3ViTGF5ZXJQcm9wcyh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnZmxvdy1oaWdobGlnaHQnLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBoaWdobGlnaHRlZE9iamVjdC5saW5lQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgZHJhd091dGxpbmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHBpY2thYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZUNvbG9yOiBjb2xvckFzUmdiYSh0aGlzLnByb3BzLmhpZ2hsaWdodENvbG9yKSxcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZVRoaWNrbmVzczogMSxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG9jYXRpb25MYWJlbHMpIHtcbiAgICAgICAgbGF5ZXJzLnB1c2goXG4gICAgICAgICAgbmV3IFRleHRMYXllcihcbiAgICAgICAgICAgIHRoaXMuZ2V0U3ViTGF5ZXJQcm9wcyh7XG4gICAgICAgICAgICAgIGlkOiAnbG9jYXRpb24tbGFiZWxzJyxcbiAgICAgICAgICAgICAgZGF0YTogbG9jYXRpb25MYWJlbHMsXG4gICAgICAgICAgICAgIG1heFdpZHRoOiAxMDAwLFxuICAgICAgICAgICAgICBwaWNrYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIGZvbnRGYW1pbHk6ICdIZWx2ZXRpY2EnLFxuICAgICAgICAgICAgICBnZXRQaXhlbE9mZnNldDogKGQ6IHN0cmluZywge2luZGV4fToge2luZGV4OiBudW1iZXJ9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IGdldE91dGVyQ2lyY2xlUmFkaXVzQnlJbmRleChjaXJjbGVBdHRyaWJ1dGVzLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFswLCByICsgNV07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGdldFBvc2l0aW9uOiAoZDogc3RyaW5nLCB7aW5kZXh9OiB7aW5kZXg6IG51bWJlcn0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3MgPSBnZXRMb2NhdGlvbkNvb3Jkc0J5SW5kZXgoY2lyY2xlQXR0cmlidXRlcywgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGdldFRleHQ6IChkOiBzdHJpbmcpID0+IGQsXG4gICAgICAgICAgICAgIGdldFNpemU6IDEwLFxuICAgICAgICAgICAgICBnZXRDb2xvcjogWzI1NSwgMjU1LCAyNTUsIDI1NV0sXG4gICAgICAgICAgICAgIGdldEFuZ2xlOiAwLFxuICAgICAgICAgICAgICBnZXRUZXh0QW5jaG9yOiAnbWlkZGxlJyxcbiAgICAgICAgICAgICAgZ2V0QWxpZ25tZW50QmFzZWxpbmU6ICd0b3AnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGF5ZXJzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBpY2tWaWV3cG9ydFByb3BzKHZpZXdwb3J0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogVmlld3BvcnRQcm9wcyB7XG4gIGNvbnN0IHt3aWR0aCwgaGVpZ2h0LCBsb25naXR1ZGUsIGxhdGl0dWRlLCB6b29tLCBwaXRjaCwgYmVhcmluZ30gPSB2aWV3cG9ydDtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgbG9uZ2l0dWRlLFxuICAgIGxhdGl0dWRlLFxuICAgIHpvb20sXG4gICAgcGl0Y2gsXG4gICAgYmVhcmluZyxcbiAgfTtcbn1cbiJdfQ==
403
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd21hcExheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Zsb3dtYXBMYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsV0FBVyxFQUdYLHlCQUF5QixFQUl6Qiw0QkFBNEIsRUFDNUIsZ0JBQWdCLEVBQ2hCLHdCQUF3QixFQUN4QiwyQkFBMkIsRUFDM0IsYUFBYSxFQUNiLHFCQUFxQixFQUVyQix3QkFBd0IsR0FFekIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLHNCQUFzQixNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sZ0JBQWdCLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxjQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUlMLFdBQVcsR0FDWixNQUFNLFNBQVMsQ0FBQztBQTRCakIsTUFBTSxnQ0FBZ0MsR0FBYTtJQUNqRCxRQUFRO0lBQ1IsdUJBQXVCO0lBQ3ZCLHVCQUF1QjtJQUN2Qix1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixpQkFBaUI7SUFDakIsYUFBYTtJQUNiLG9CQUFvQjtJQUNwQixnQkFBZ0I7SUFDaEIsVUFBVTtJQUNWLFlBQVk7SUFDWixhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLHVCQUF1QjtDQUN4QixDQUFDO0FBRUYsSUFBSyxhQUdKO0FBSEQsV0FBSyxhQUFhO0lBQ2hCLHNDQUFxQixDQUFBO0lBQ3JCLDhCQUFhLENBQUE7QUFDZixDQUFDLEVBSEksYUFBYSxLQUFiLGFBQWEsUUFHakI7QUEyQkQsTUFBTSxDQUFDLE9BQU8sT0FBTyxZQUFtQixTQUFRLGNBQWM7SUFtQjVELFlBQW1C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SUFDNUIsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixpQkFBaUIsRUFBRSxJQUFJO0lBQ3ZCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGtCQUFrQixFQUFFLEtBQUs7SUFDekIsY0FBYyxFQUFFLElBQUk7SUFDcEIsZUFBZSxFQUFFLFNBQVM7SUFDMUIscUJBQXFCLEVBQUUsSUFBSTtJQUMzQixXQUFXLEVBQUUsTUFBTTtJQUNuQixjQUFjLEVBQUUsUUFBUTtJQUN4QixxQkFBcUIsRUFBRSxJQUFJO0NBQzVCLENBQUM7QUFpYkosU0FBUyxpQkFBaUIsQ0FBQyxRQUE2QjtJQUN0RCxNQUFNLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEdBQUcsUUFBUSxDQUFDO0lBQzVFLE9BQU87UUFDTCxLQUFLO1FBQ0wsTUFBTTtRQUNOLFNBQVM7UUFDVCxRQUFRO1FBQ1IsSUFBSTtRQUNKLEtBQUs7UUFDTCxPQUFPO0tBQ1IsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjIgRmxvd21hcEJsdWVcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKi9cbmltcG9ydCB7Q29tcG9zaXRlTGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2NvcmUnO1xuaW1wb3J0IHtTY2F0dGVycGxvdExheWVyLCBUZXh0TGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2xheWVycyc7XG5pbXBvcnQge1xuICBjb2xvckFzUmdiYSxcbiAgRmlsdGVyU3RhdGUsXG4gIEZsb3dMaW5lc0xheWVyQXR0cmlidXRlcyxcbiAgRmxvd21hcEFnZ3JlZ2F0ZUFjY2Vzc29ycyxcbiAgRmxvd21hcERhdGEsXG4gIEZsb3dtYXBEYXRhQWNjZXNzb3JzLFxuICBGbG93bWFwRGF0YVByb3ZpZGVyLFxuICBnZXRGbG93TGluZUF0dHJpYnV0ZXNCeUluZGV4LFxuICBnZXRGbG93bWFwQ29sb3JzLFxuICBnZXRMb2NhdGlvbkNvb3Jkc0J5SW5kZXgsXG4gIGdldE91dGVyQ2lyY2xlUmFkaXVzQnlJbmRleCxcbiAgaXNGbG93bWFwRGF0YSxcbiAgaXNGbG93bWFwRGF0YVByb3ZpZGVyLFxuICBMYXllcnNEYXRhLFxuICBMb2NhbEZsb3dtYXBEYXRhUHJvdmlkZXIsXG4gIFZpZXdwb3J0UHJvcHMsXG59IGZyb20gJ0BmbG93bWFwLmdsL2RhdGEnO1xuaW1wb3J0IEFuaW1hdGVkRmxvd0xpbmVzTGF5ZXIgZnJvbSAnLi9BbmltYXRlZEZsb3dMaW5lc0xheWVyJztcbmltcG9ydCBGbG93Q2lyY2xlc0xheWVyIGZyb20gJy4vRmxvd0NpcmNsZXNMYXllcic7XG5pbXBvcnQgRmxvd0xpbmVzTGF5ZXIgZnJvbSAnLi9GbG93TGluZXNMYXllcic7XG5pbXBvcnQge1xuICBGbG93bWFwTGF5ZXJQaWNraW5nSW5mbyxcbiAgTGF5ZXJQcm9wcyxcbiAgUGlja2luZ0luZm8sXG4gIFBpY2tpbmdUeXBlLFxufSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgRmxvd21hcExheWVyUHJvcHM8TCwgRj4gPSB7XG4gIGRhdGE/OiBGbG93bWFwRGF0YTxMLCBGPjtcbiAgZGF0YVByb3ZpZGVyPzogRmxvd21hcERhdGFQcm92aWRlcjxMLCBGPjtcbiAgZmlsdGVyPzogRmlsdGVyU3RhdGU7XG4gIGxvY2F0aW9uVG90YWxzRW5hYmxlZD86IGJvb2xlYW47XG4gIGxvY2F0aW9uTGFiZWxzRW5hYmxlZD86IGJvb2xlYW47XG4gIGFkYXB0aXZlU2NhbGVzRW5hYmxlZD86IGJvb2xlYW47XG4gIGFuaW1hdGlvbkVuYWJsZWQ/OiBib29sZWFuO1xuICBjbHVzdGVyaW5nRW5hYmxlZD86IGJvb2xlYW47XG4gIGNsdXN0ZXJpbmdMZXZlbD86IG51bWJlcjtcbiAgZmFkZUVuYWJsZWQ/OiBib29sZWFuO1xuICBmYWRlT3BhY2l0eUVuYWJsZWQ/OiBib29sZWFuO1xuICBjbHVzdGVyaW5nQXV0bz86IGJvb2xlYW47XG4gIGRhcmtNb2RlPzogYm9vbGVhbjtcbiAgZmFkZUFtb3VudD86IG51bWJlcjtcbiAgY29sb3JTY2hlbWU/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgaGlnaGxpZ2h0Q29sb3I/OiBzdHJpbmcgfCBudW1iZXJbXTtcbiAgbWF4VG9wRmxvd3NEaXNwbGF5TnVtPzogbnVtYmVyO1xuICBvbkhvdmVyPzogKFxuICAgIGluZm86IEZsb3dtYXBMYXllclBpY2tpbmdJbmZvPEwsIEY+IHwgdW5kZWZpbmVkLFxuICAgIGV2ZW50OiBTb3VyY2VFdmVudCxcbiAgKSA9PiB2b2lkO1xuICBvbkNsaWNrPzogKGluZm86IEZsb3dtYXBMYXllclBpY2tpbmdJbmZvPEwsIEY+LCBldmVudDogU291cmNlRXZlbnQpID0+IHZvaWQ7XG59ICYgUGFydGlhbDxGbG93bWFwRGF0YUFjY2Vzc29yczxMLCBGPj4gJlxuICBMYXllclByb3BzO1xuXG5jb25zdCBQUk9QU19UT19DQVVTRV9MQVlFUl9EQVRBX1VQREFURTogc3RyaW5nW10gPSBbXG4gICdmaWx0ZXInLFxuICAnbG9jYXRpb25Ub3RhbHNFbmFibGVkJyxcbiAgJ2xvY2F0aW9uTGFiZWxzRW5hYmxlZCcsXG4gICdhZGFwdGl2ZVNjYWxlc0VuYWJsZWQnLFxuICAnYW5pbWF0aW9uRW5hYmxlZCcsXG4gICdjbHVzdGVyaW5nRW5hYmxlZCcsXG4gICdjbHVzdGVyaW5nTGV2ZWwnLFxuICAnZmFkZUVuYWJsZWQnLFxuICAnZmFkZU9wYWNpdHlFbmFibGVkJyxcbiAgJ2NsdXN0ZXJpbmdBdXRvJyxcbiAgJ2RhcmtNb2RlJyxcbiAgJ2ZhZGVBbW91bnQnLFxuICAnY29sb3JTY2hlbWUnLFxuICAnaGlnaGxpZ2h0Q29sb3InLFxuICAnbWF4VG9wRmxvd3NEaXNwbGF5TnVtJyxcbl07XG5cbmVudW0gSGlnaGxpZ2h0VHlwZSB7XG4gIExPQ0FUSU9OID0gJ2xvY2F0aW9uJyxcbiAgRkxPVyA9ICdmbG93Jyxcbn1cblxudHlwZSBIaWdobGlnaHRlZExvY2F0aW9uT2JqZWN0ID0ge1xuICB0eXBlOiBIaWdobGlnaHRUeXBlLkxPQ0FUSU9OO1xuICBjb29yZHM6IFtudW1iZXIsIG51bWJlcl07XG4gIHJhZGl1czogbnVtYmVyO1xufTtcblxudHlwZSBIaWdobGlnaHRlZEZsb3dPYmplY3QgPSB7XG4gIHR5cGU6IEhpZ2hsaWdodFR5cGUuRkxPVztcbiAgbGluZUF0dHJpYnV0ZXM6IEZsb3dMaW5lc0xheWVyQXR0cmlidXRlcztcbn07XG5cbnR5cGUgSGlnaGxpZ2h0ZWRPYmplY3QgPSBIaWdobGlnaHRlZExvY2F0aW9uT2JqZWN0IHwgSGlnaGxpZ2h0ZWRGbG93T2JqZWN0O1xuXG50eXBlIFN0YXRlPEwsIEY+ID0ge1xuICBhY2Nlc3NvcnM6IEZsb3dtYXBBZ2dyZWdhdGVBY2Nlc3NvcnM8TCwgRj47XG4gIGRhdGFQcm92aWRlcjogRmxvd21hcERhdGFQcm92aWRlcjxMLCBGPjtcbiAgbGF5ZXJzRGF0YTogTGF5ZXJzRGF0YSB8IHVuZGVmaW5lZDtcbiAgaGlnaGxpZ2h0ZWRPYmplY3Q6IEhpZ2hsaWdodGVkT2JqZWN0IHwgdW5kZWZpbmVkO1xuICBwaWNraW5nSW5mbzogRmxvd21hcExheWVyUGlja2luZ0luZm88TCwgRj4gfCB1bmRlZmluZWQ7XG4gIGxhc3RIb3ZlclRpbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGFzdENsaWNrVGltZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgU291cmNlRXZlbnQgPSB7c3JjRXZlbnQ6IE1vdXNlRXZlbnR9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGbG93bWFwTGF5ZXI8TCwgRj4gZXh0ZW5kcyBDb21wb3NpdGVMYXllciB7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgZGFya01vZGU6IHRydWUsXG4gICAgZmFkZUFtb3VudDogNTAsXG4gICAgbG9jYXRpb25Ub3RhbHNFbmFibGVkOiB0cnVlLFxuICAgIGxvY2F0aW9uTGFiZWxzRW5hYmxlZDogZmFsc2UsXG4gICAgYW5pbWF0aW9uRW5hYmxlZDogZmFsc2UsXG4gICAgY2x1c3RlcmluZ0VuYWJsZWQ6IHRydWUsXG4gICAgZmFkZUVuYWJsZWQ6IHRydWUsXG4gICAgZmFkZU9wYWNpdHlFbmFibGVkOiBmYWxzZSxcbiAgICBjbHVzdGVyaW5nQXV0bzogdHJ1ZSxcbiAgICBjbHVzdGVyaW5nTGV2ZWw6IHVuZGVmaW5lZCxcbiAgICBhZGFwdGl2ZVNjYWxlc0VuYWJsZWQ6IHRydWUsXG4gICAgY29sb3JTY2hlbWU6ICdUZWFsJyxcbiAgICBoaWdobGlnaHRDb2xvcjogJ29yYW5nZScsXG4gICAgbWF4VG9wRmxvd3NEaXNwbGF5TnVtOiA1MDAwLFxuICB9O1xuICBzdGF0ZTogU3RhdGU8TCwgRj4gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBGbG93bWFwTGF5ZXJQcm9wczxMLCBGPikge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgb25Ib3ZlcjogKGluZm86IFBpY2tpbmdJbmZvPGFueT4sIGV2ZW50OiBTb3VyY2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBoaWdobGlnaHRlZE9iamVjdDogdGhpcy5fZ2V0SGlnaGxpZ2h0ZWRPYmplY3QoaW5mbyksXG4gICAgICAgICAgbGFzdEhvdmVyVGltZTogc3RhcnRUaW1lLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB7b25Ib3Zlcn0gPSBwcm9wcztcbiAgICAgICAgaWYgKG9uSG92ZXIpIHtcbiAgICAgICAgICB0aGlzLl9nZXRGbG93bWFwTGF5ZXJQaWNraW5nSW5mbyhpbmZvKS50aGVuKChpbmZvKSA9PiB7XG4gICAgICAgICAgICBpZiAoKHRoaXMuc3RhdGU/Lmxhc3RIb3ZlclRpbWUgPz8gMCkgPD0gc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe3BpY2tpbmdJbmZvOiBpbmZvfSk7XG4gICAgICAgICAgICAgIG9uSG92ZXIoaW5mbywgZXZlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gU2tpcHBpbmcsIGJlY2F1c2UgdGhpcyBpcyBub3QgdGhlIGxhdGVzdCBob3ZlciBldmVudFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25DbGljazogKGluZm86IFBpY2tpbmdJbmZvPGFueT4sIGV2ZW50OiBTb3VyY2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCB7b25DbGlja30gPSBwcm9wcztcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgbGFzdENsaWNrVGltZTogc3RhcnRUaW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgICAgICB0aGlzLl9nZXRGbG93bWFwTGF5ZXJQaWNraW5nSW5mbyhpbmZvKS50aGVuKChpbmZvKSA9PiB7XG4gICAgICAgICAgICBpZiAoKHRoaXMuc3RhdGU/Lmxhc3RDbGlja1RpbWUgPz8gMCkgPD0gc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe3BpY2tpbmdJbmZvOiBpbmZvfSk7XG4gICAgICAgICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICAgICAgb25DbGljayhpbmZvLCBldmVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFNraXBwaW5nLCBiZWNhdXNlIHRoaXMgaXMgbm90IHRoZSBsYXRlc3QgaG92ZXIgZXZlbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGluaXRpYWxpemVTdGF0ZSgpIHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgYWNjZXNzb3JzOiBuZXcgRmxvd21hcEFnZ3JlZ2F0ZUFjY2Vzc29yczxMLCBGPih0aGlzLnByb3BzKSxcbiAgICAgIGRhdGFQcm92aWRlcjogdGhpcy5fZ2V0T3JNYWtlRGF0YVByb3ZpZGVyKCksXG4gICAgICBsYXllcnNEYXRhOiB1bmRlZmluZWQsXG4gICAgICBoaWdobGlnaHRlZE9iamVjdDogdW5kZWZpbmVkLFxuICAgICAgcGlja2luZ0luZm86IHVuZGVmaW5lZCxcbiAgICAgIGxhc3RIb3ZlclRpbWU6IHVuZGVmaW5lZCxcbiAgICAgIGxhc3RDbGlja1RpbWU6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0UGlja2luZ0luZm8oe2luZm99OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgLy8gVGhpcyBpcyBmb3Igb25Ib3ZlciBldmVudCBoYW5kbGVycyBzZXQgb24gdGhlIDxEZWNrR0w+IGNvbXBvbmVudFxuICAgIGlmICghaW5mby5vYmplY3QpIHtcbiAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMuc3RhdGU/LnBpY2tpbmdJbmZvPy5vYmplY3Q7XG4gICAgICBpZiAob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaW5mbyxcbiAgICAgICAgICBvYmplY3QsXG4gICAgICAgICAgcGlja2VkOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfVxuXG4gIC8vIHByaXZhdGUgX3VwZGF0ZUFjY2Vzc29ycygpIHtcbiAgLy8gICB0aGlzLnN0YXRlPy5kYXRhUHJvdmlkZXI/LnNldEFjY2Vzc29ycyh0aGlzLnByb3BzKTtcbiAgLy8gICB0aGlzLnNldFN0YXRlKHthY2Nlc3NvcnM6IG5ldyBGbG93bWFwQWdncmVnYXRlQWNjZXNzb3JzKHRoaXMucHJvcHMpfSk7XG4gIC8vIH1cblxuICBwcml2YXRlIF9nZXRPck1ha2VEYXRhUHJvdmlkZXIoKSB7XG4gICAgY29uc3Qge2RhdGEsIGRhdGFQcm92aWRlcn0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChpc0Zsb3dtYXBEYXRhUHJvdmlkZXI8TCwgRj4oZGF0YVByb3ZpZGVyKSkge1xuICAgICAgcmV0dXJuIGRhdGFQcm92aWRlcjtcbiAgICB9IGVsc2UgaWYgKGlzRmxvd21hcERhdGE8TCwgRj4oZGF0YSkpIHtcbiAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBMb2NhbEZsb3dtYXBEYXRhUHJvdmlkZXI8TCwgRj4odGhpcy5wcm9wcyk7XG4gICAgICBkYXRhUHJvdmlkZXIuc2V0Rmxvd21hcERhdGEoZGF0YSk7XG4gICAgICByZXR1cm4gZGF0YVByb3ZpZGVyO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnRmxvd21hcExheWVyOiBkYXRhIG11c3QgYmUgYSBGbG93bWFwRGF0YVByb3ZpZGVyIG9yIEZsb3dtYXBEYXRhJyxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlRGF0YVByb3ZpZGVyKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe2RhdGFQcm92aWRlcjogdGhpcy5fZ2V0T3JNYWtlRGF0YVByb3ZpZGVyKCl9KTtcbiAgfVxuXG4gIHNob3VsZFVwZGF0ZVN0YXRlKHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55Pik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHtjaGFuZ2VGbGFnc30gPSBwYXJhbXM7XG4gICAgLy8gaWYgKHRoaXMuX3ZpZXdwb3J0Q2hhbmdlZCgpKSB7XG4gICAgLy8gICByZXR1cm4gdHJ1ZTtcbiAgICAvLyB9XG4gICAgaWYgKGNoYW5nZUZsYWdzLnZpZXdwb3J0Q2hhbmdlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5zaG91bGRVcGRhdGVTdGF0ZShwYXJhbXMpO1xuICAgIC8vIFRPRE86IGJlIHNtYXJ0ZXIgb24gd2hlbiB0byB1cGRhdGVcbiAgICAvLyAoZS5nLiBpZ25vcmUgdmlld3BvcnQgY2hhbmdlcyB3aGVuIGFkYXB0aXZlU2NhbGVzRW5hYmxlZCBhbmQgY2x1c3RlcmluZyBhcmUgZmFsc2UpXG4gIH1cblxuICB1cGRhdGVTdGF0ZSh7b2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFnc306IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlRmxhZ3MucHJvcHNDaGFuZ2VkKSB7XG4gICAgICAvLyB0aGlzLl91cGRhdGVBY2Nlc3NvcnMoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZUZsYWdzLmRhdGFDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl91cGRhdGVEYXRhUHJvdmlkZXIoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZUZsYWdzLnZpZXdwb3J0Q2hhbmdlZCB8fCBjaGFuZ2VGbGFncy5kYXRhQ2hhbmdlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7aGlnaGxpZ2h0ZWRPYmplY3Q6IHVuZGVmaW5lZH0pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNoYW5nZUZsYWdzLnZpZXdwb3J0Q2hhbmdlZCB8fFxuICAgICAgY2hhbmdlRmxhZ3MuZGF0YUNoYW5nZWQgfHxcbiAgICAgIChjaGFuZ2VGbGFncy5wcm9wc0NoYW5nZWQgJiZcbiAgICAgICAgUFJPUFNfVE9fQ0FVU0VfTEFZRVJfREFUQV9VUERBVEUuc29tZShcbiAgICAgICAgICAocHJvcCkgPT4gb2xkUHJvcHNbcHJvcF0gIT09IHByb3BzW3Byb3BdLFxuICAgICAgICApKVxuICAgICkge1xuICAgICAgY29uc3Qge2RhdGFQcm92aWRlcn0gPSB0aGlzLnN0YXRlIHx8IHt9O1xuICAgICAgaWYgKGRhdGFQcm92aWRlcikge1xuICAgICAgICBkYXRhUHJvdmlkZXIuc2V0Rmxvd21hcFN0YXRlKHRoaXMuX2dldEZsb3dtYXBTdGF0ZSgpKTtcbiAgICAgICAgZGF0YVByb3ZpZGVyLnVwZGF0ZUxheWVyc0RhdGEoKGxheWVyc0RhdGE6IExheWVyc0RhdGEgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtsYXllcnNEYXRhLCBoaWdobGlnaHRlZE9iamVjdDogdW5kZWZpbmVkfSk7XG4gICAgICAgIH0sIGNoYW5nZUZsYWdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZXR0aW5nc1N0YXRlKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxvY2F0aW9uVG90YWxzRW5hYmxlZCxcbiAgICAgIGxvY2F0aW9uTGFiZWxzRW5hYmxlZCxcbiAgICAgIGFkYXB0aXZlU2NhbGVzRW5hYmxlZCxcbiAgICAgIGFuaW1hdGlvbkVuYWJsZWQsXG4gICAgICBjbHVzdGVyaW5nRW5hYmxlZCxcbiAgICAgIGNsdXN0ZXJpbmdMZXZlbCxcbiAgICAgIGZhZGVFbmFibGVkLFxuICAgICAgZmFkZU9wYWNpdHlFbmFibGVkLFxuICAgICAgY2x1c3RlcmluZ0F1dG8sXG4gICAgICBkYXJrTW9kZSxcbiAgICAgIGZhZGVBbW91bnQsXG4gICAgICBjb2xvclNjaGVtZSxcbiAgICAgIGhpZ2hsaWdodENvbG9yLFxuICAgICAgbWF4VG9wRmxvd3NEaXNwbGF5TnVtLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiB7XG4gICAgICBsb2NhdGlvblRvdGFsc0VuYWJsZWQsXG4gICAgICBsb2NhdGlvbkxhYmVsc0VuYWJsZWQsXG4gICAgICBhZGFwdGl2ZVNjYWxlc0VuYWJsZWQsXG4gICAgICBhbmltYXRpb25FbmFibGVkLFxuICAgICAgY2x1c3RlcmluZ0VuYWJsZWQsXG4gICAgICBjbHVzdGVyaW5nTGV2ZWwsXG4gICAgICBmYWRlRW5hYmxlZCxcbiAgICAgIGZhZGVPcGFjaXR5RW5hYmxlZCxcbiAgICAgIGNsdXN0ZXJpbmdBdXRvLFxuICAgICAgZGFya01vZGUsXG4gICAgICBmYWRlQW1vdW50LFxuICAgICAgY29sb3JTY2hlbWUsXG4gICAgICBoaWdobGlnaHRDb2xvcixcbiAgICAgIG1heFRvcEZsb3dzRGlzcGxheU51bSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Rmxvd21hcFN0YXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICB2aWV3cG9ydDogcGlja1ZpZXdwb3J0UHJvcHModGhpcy5jb250ZXh0LnZpZXdwb3J0KSxcbiAgICAgIGZpbHRlcjogdGhpcy5wcm9wcy5maWx0ZXIsXG4gICAgICBzZXR0aW5nczogdGhpcy5fZ2V0U2V0dGluZ3NTdGF0ZSgpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9nZXRGbG93bWFwTGF5ZXJQaWNraW5nSW5mbyhcbiAgICBpbmZvOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICApOiBQcm9taXNlPEZsb3dtYXBMYXllclBpY2tpbmdJbmZvPEwsIEY+IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qge2luZGV4LCBzb3VyY2VMYXllcn0gPSBpbmZvO1xuICAgIGNvbnN0IHtkYXRhUHJvdmlkZXIsIGFjY2Vzc29yc30gPSB0aGlzLnN0YXRlIHx8IHt9O1xuICAgIGlmICghZGF0YVByb3ZpZGVyIHx8ICFhY2Nlc3NvcnMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbW1vbkluZm8gPSB7XG4gICAgICAuLi5pbmZvLFxuICAgICAgcGlja2VkOiBpbmZvLnBpY2tlZCxcbiAgICAgIGxheWVyOiBpbmZvLmxheWVyLFxuICAgICAgaW5kZXg6IGluZm8uaW5kZXgsXG4gICAgICB4OiBpbmZvLngsXG4gICAgICB5OiBpbmZvLnksXG4gICAgICBjb29yZGluYXRlOiBpbmZvLmNvb3JkaW5hdGUsXG4gICAgICBldmVudDogaW5mby5ldmVudCxcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIHNvdXJjZUxheWVyIGluc3RhbmNlb2YgRmxvd0xpbmVzTGF5ZXIgfHxcbiAgICAgIHNvdXJjZUxheWVyIGluc3RhbmNlb2YgQW5pbWF0ZWRGbG93TGluZXNMYXllclxuICAgICkge1xuICAgICAgY29uc3QgZmxvdyA9XG4gICAgICAgIGluZGV4ID09PSAtMSA/IHVuZGVmaW5lZCA6IGF3YWl0IGRhdGFQcm92aWRlci5nZXRGbG93QnlJbmRleChpbmRleCk7XG4gICAgICBpZiAoZmxvdykge1xuICAgICAgICBjb25zdCBvcmlnaW4gPSBhd2FpdCBkYXRhUHJvdmlkZXIuZ2V0TG9jYXRpb25CeUlkKFxuICAgICAgICAgIGFjY2Vzc29ycy5nZXRGbG93T3JpZ2luSWQoZmxvdyksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRlc3QgPSBhd2FpdCBkYXRhUHJvdmlkZXIuZ2V0TG9jYXRpb25CeUlkKFxuICAgICAgICAgIGFjY2Vzc29ycy5nZXRGbG93RGVzdElkKGZsb3cpLFxuICAgICAgICApO1xuICAgICAgICBpZiAob3JpZ2luICYmIGRlc3QpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY29tbW9uSW5mbyxcbiAgICAgICAgICAgIG9iamVjdDoge1xuICAgICAgICAgICAgICB0eXBlOiBQaWNraW5nVHlwZS5GTE9XLFxuICAgICAgICAgICAgICBmbG93LFxuICAgICAgICAgICAgICBvcmlnaW46IG9yaWdpbixcbiAgICAgICAgICAgICAgZGVzdDogZGVzdCxcbiAgICAgICAgICAgICAgY291bnQ6IGFjY2Vzc29ycy5nZXRGbG93TWFnbml0dWRlKGZsb3cpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzb3VyY2VMYXllciBpbnN0YW5jZW9mIEZsb3dDaXJjbGVzTGF5ZXIpIHtcbiAgICAgIGNvbnN0IGxvY2F0aW9uID1cbiAgICAgICAgaW5kZXggPT09IC0xID8gdW5kZWZpbmVkIDogYXdhaXQgZGF0YVByb3ZpZGVyLmdldExvY2F0aW9uQnlJbmRleChpbmRleCk7XG5cbiAgICAgIGlmIChsb2NhdGlvbikge1xuICAgICAgICBjb25zdCBpZCA9IGFjY2Vzc29ycy5nZXRMb2NhdGlvbklkKGxvY2F0aW9uKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IGFjY2Vzc29ycy5nZXRMb2NhdGlvbk5hbWUobG9jYXRpb24pO1xuICAgICAgICBjb25zdCB0b3RhbHMgPSBhd2FpdCBkYXRhUHJvdmlkZXIuZ2V0VG90YWxzRm9yTG9jYXRpb24oaWQpO1xuICAgICAgICBjb25zdCB7Y2lyY2xlQXR0cmlidXRlc30gPSB0aGlzLnN0YXRlPy5sYXllcnNEYXRhIHx8IHt9O1xuICAgICAgICBpZiAodG90YWxzICYmIGNpcmNsZUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBjb25zdCBjaXJjbGVSYWRpdXMgPSBnZXRPdXRlckNpcmNsZVJhZGl1c0J5SW5kZXgoXG4gICAgICAgICAgICBjaXJjbGVBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgaW5mby5pbmRleCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jb21tb25JbmZvLFxuICAgICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICAgIHR5cGU6IFBpY2tpbmdUeXBlLkxPQ0FUSU9OLFxuICAgICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHRvdGFscyxcbiAgICAgICAgICAgICAgY2lyY2xlUmFkaXVzOiBjaXJjbGVSYWRpdXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0SGlnaGxpZ2h0ZWRPYmplY3QoXG4gICAgaW5mbzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgKTogSGlnaGxpZ2h0ZWRPYmplY3QgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHtpbmRleCwgc291cmNlTGF5ZXJ9ID0gaW5mbztcbiAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIHNvdXJjZUxheWVyIGluc3RhbmNlb2YgRmxvd0xpbmVzTGF5ZXIgfHxcbiAgICAgIHNvdXJjZUxheWVyIGluc3RhbmNlb2YgQW5pbWF0ZWRGbG93TGluZXNMYXllclxuICAgICkge1xuICAgICAgY29uc3Qge2xpbmVBdHRyaWJ1dGVzfSA9IHRoaXMuc3RhdGU/LmxheWVyc0RhdGEgfHwge307XG4gICAgICBpZiAobGluZUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgbGV0IGF0dHJzID0gZ2V0Rmxvd0xpbmVBdHRyaWJ1dGVzQnlJbmRleChsaW5lQXR0cmlidXRlcywgaW5kZXgpO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5mYWRlT3BhY2l0eUVuYWJsZWQpIHtcbiAgICAgICAgICBhdHRycyA9IHtcbiAgICAgICAgICAgIC4uLmF0dHJzLFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAuLi5hdHRycy5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICBnZXRDb2xvcjoge1xuICAgICAgICAgICAgICAgIC4uLmF0dHJzLmF0dHJpYnV0ZXMuZ2V0Q29sb3IsXG4gICAgICAgICAgICAgICAgdmFsdWU6IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgICAgICAgIC4uLmF0dHJzLmF0dHJpYnV0ZXMuZ2V0Q29sb3IudmFsdWUuc2xpY2UoMCwgMyksXG4gICAgICAgICAgICAgICAgICAyNTUsIC8vIHRoZSBoaWdobGlnaHQgY29sb3Igc2hvdWxkIGJlIGFsd2F5cyBvcGFxdWVcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IEhpZ2hsaWdodFR5cGUuRkxPVyxcbiAgICAgICAgICBsaW5lQXR0cmlidXRlczogYXR0cnMsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzb3VyY2VMYXllciBpbnN0YW5jZW9mIEZsb3dDaXJjbGVzTGF5ZXIpIHtcbiAgICAgIGNvbnN0IHtjaXJjbGVBdHRyaWJ1dGVzfSA9IHRoaXMuc3RhdGU/LmxheWVyc0RhdGEgfHwge307XG4gICAgICBpZiAoY2lyY2xlQXR0cmlidXRlcykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IEhpZ2hsaWdodFR5cGUuTE9DQVRJT04sXG4gICAgICAgICAgY29vcmRzOiBnZXRMb2NhdGlvbkNvb3Jkc0J5SW5kZXgoY2lyY2xlQXR0cmlidXRlcywgaW5kZXgpLFxuICAgICAgICAgIHJhZGl1czogZ2V0T3V0ZXJDaXJjbGVSYWRpdXNCeUluZGV4KGNpcmNsZUF0dHJpYnV0ZXMsIGluZGV4KSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJlbmRlckxheWVycygpOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCBsYXllcnMgPSBbXTtcbiAgICBpZiAodGhpcy5zdGF0ZT8ubGF5ZXJzRGF0YSkge1xuICAgICAgY29uc3Qge2xheWVyc0RhdGEsIGhpZ2hsaWdodGVkT2JqZWN0fSA9IHRoaXMuc3RhdGU7XG4gICAgICBjb25zdCB7Y2lyY2xlQXR0cmlidXRlcywgbGluZUF0dHJpYnV0ZXMsIGxvY2F0aW9uTGFiZWxzfSA9XG4gICAgICAgIGxheWVyc0RhdGEgfHwge307XG4gICAgICBpZiAoY2lyY2xlQXR0cmlidXRlcyAmJiBsaW5lQXR0cmlidXRlcykge1xuICAgICAgICBjb25zdCBmbG93bWFwQ29sb3JzID0gZ2V0Rmxvd21hcENvbG9ycyh0aGlzLl9nZXRTZXR0aW5nc1N0YXRlKCkpO1xuICAgICAgICBjb25zdCBvdXRsaW5lQ29sb3IgPSBjb2xvckFzUmdiYShcbiAgICAgICAgICBmbG93bWFwQ29sb3JzLm91dGxpbmVDb2xvciB8fCAodGhpcy5wcm9wcy5kYXJrTW9kZSA/ICcjMDAwJyA6ICcjZmZmJyksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbW1vbkxpbmVMYXllclByb3BzID0ge1xuICAgICAgICAgIGRhdGE6IGxpbmVBdHRyaWJ1dGVzLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIC4uLnRoaXMucHJvcHMucGFyYW1ldGVycyxcbiAgICAgICAgICAgIC8vIHByZXZlbnQgei1maWdodGluZyBhdCBub24temVybyBiZWFyaW5nL3BpdGNoXG4gICAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmFuaW1hdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICBsYXllcnMucHVzaChcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ldyBBbmltYXRlZEZsb3dMaW5lc0xheWVyKHtcbiAgICAgICAgICAgICAgLi4udGhpcy5nZXRTdWJMYXllclByb3BzKHtcbiAgICAgICAgICAgICAgICAuLi5jb21tb25MaW5lTGF5ZXJQcm9wcyxcbiAgICAgICAgICAgICAgICBpZDogJ2FuaW1hdGVkLWZsb3ctbGluZXMnLFxuICAgICAgICAgICAgICAgIGRyYXdPdXRsaW5lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0aGlja25lc3NVbml0OiAyMCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxheWVycy5wdXNoKFxuICAgICAgICAgICAgbmV3IEZsb3dMaW5lc0xheWVyKHtcbiAgICAgICAgICAgICAgLi4udGhpcy5nZXRTdWJMYXllclByb3BzKHtcbiAgICAgICAgICAgICAgICAuLi5jb21tb25MaW5lTGF5ZXJQcm9wcyxcbiAgICAgICAgICAgICAgICBpZDogJ2Zsb3ctbGluZXMnLFxuICAgICAgICAgICAgICAgIGRyYXdPdXRsaW5lOiB0cnVlLFxuICAgICAgICAgICAgICAgIG91dGxpbmVDb2xvcjogb3V0bGluZUNvbG9yLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGF5ZXJzLnB1c2goXG4gICAgICAgICAgbmV3IEZsb3dDaXJjbGVzTGF5ZXIoXG4gICAgICAgICAgICB0aGlzLmdldFN1YkxheWVyUHJvcHMoe1xuICAgICAgICAgICAgICBpZDogJ2NpcmNsZXMnLFxuICAgICAgICAgICAgICBkYXRhOiBjaXJjbGVBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICBlbXB0eUNvbG9yOiB0aGlzLnByb3BzLmRhcmtNb2RlXG4gICAgICAgICAgICAgICAgPyBbMCwgMCwgMCwgMjU1XVxuICAgICAgICAgICAgICAgIDogWzI1NSwgMjU1LCAyNTUsIDI1NV0sXG4gICAgICAgICAgICAgIG91dGxpbmVFbXB0eU1peDogMC40LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGhpZ2hsaWdodGVkT2JqZWN0KSB7XG4gICAgICAgICAgc3dpdGNoIChoaWdobGlnaHRlZE9iamVjdC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEhpZ2hsaWdodFR5cGUuTE9DQVRJT046XG4gICAgICAgICAgICAgIGxheWVycy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBTY2F0dGVycGxvdExheWVyKHtcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0U3ViTGF5ZXJQcm9wcyh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnbG9jYXRpb24taGlnaGxpZ2h0JyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogW2hpZ2hsaWdodGVkT2JqZWN0XSxcbiAgICAgICAgICAgICAgICAgICAgcGlja2FibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBhbnRpYWxpYXNpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGZpbGxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVXaWR0aFVuaXRzOiAncGl4ZWxzJyxcbiAgICAgICAgICAgICAgICAgICAgZ2V0TGluZVdpZHRoOiAyLFxuICAgICAgICAgICAgICAgICAgICByYWRpdXNVbml0czogJ3BpeGVscycsXG4gICAgICAgICAgICAgICAgICAgIGdldFJhZGl1czogKGQ6IEhpZ2hsaWdodGVkTG9jYXRpb25PYmplY3QpID0+IGQucmFkaXVzLFxuICAgICAgICAgICAgICAgICAgICBnZXRMaW5lQ29sb3I6IGNvbG9yQXNSZ2JhKHRoaXMucHJvcHMuaGlnaGxpZ2h0Q29sb3IpLFxuICAgICAgICAgICAgICAgICAgICBnZXRQb3NpdGlvbjogKGQ6IEhpZ2hsaWdodGVkTG9jYXRpb25PYmplY3QpID0+IGQuY29vcmRzLFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBIaWdobGlnaHRUeXBlLkZMT1c6XG4gICAgICAgICAgICAgIGxheWVycy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBGbG93TGluZXNMYXllcih7XG4gICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFN1YkxheWVyUHJvcHMoe1xuICAgICAgICAgICAgICAgICAgICBpZDogJ2Zsb3ctaGlnaGxpZ2h0JyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogaGlnaGxpZ2h0ZWRPYmplY3QubGluZUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIGRyYXdPdXRsaW5lOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBwaWNrYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG91dGxpbmVDb2xvcjogY29sb3JBc1JnYmEodGhpcy5wcm9wcy5oaWdobGlnaHRDb2xvciksXG4gICAgICAgICAgICAgICAgICAgIG91dGxpbmVUaGlja25lc3M6IDEsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvY2F0aW9uTGFiZWxzKSB7XG4gICAgICAgIGxheWVycy5wdXNoKFxuICAgICAgICAgIG5ldyBUZXh0TGF5ZXIoXG4gICAgICAgICAgICB0aGlzLmdldFN1YkxheWVyUHJvcHMoe1xuICAgICAgICAgICAgICBpZDogJ2xvY2F0aW9uLWxhYmVscycsXG4gICAgICAgICAgICAgIGRhdGE6IGxvY2F0aW9uTGFiZWxzLFxuICAgICAgICAgICAgICBtYXhXaWR0aDogMTAwMCxcbiAgICAgICAgICAgICAgcGlja2FibGU6IGZhbHNlLFxuICAgICAgICAgICAgICBmb250RmFtaWx5OiAnSGVsdmV0aWNhJyxcbiAgICAgICAgICAgICAgZ2V0UGl4ZWxPZmZzZXQ6IChkOiBzdHJpbmcsIHtpbmRleH06IHtpbmRleDogbnVtYmVyfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBnZXRPdXRlckNpcmNsZVJhZGl1c0J5SW5kZXgoY2lyY2xlQXR0cmlidXRlcywgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMCwgciArIDVdO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBnZXRQb3NpdGlvbjogKGQ6IHN0cmluZywge2luZGV4fToge2luZGV4OiBudW1iZXJ9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9zID0gZ2V0TG9jYXRpb25Db29yZHNCeUluZGV4KGNpcmNsZUF0dHJpYnV0ZXMsIGluZGV4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBnZXRUZXh0OiAoZDogc3RyaW5nKSA9PiBkLFxuICAgICAgICAgICAgICBnZXRTaXplOiAxMCxcbiAgICAgICAgICAgICAgZ2V0Q29sb3I6IFsyNTUsIDI1NSwgMjU1LCAyNTVdLFxuICAgICAgICAgICAgICBnZXRBbmdsZTogMCxcbiAgICAgICAgICAgICAgZ2V0VGV4dEFuY2hvcjogJ21pZGRsZScsXG4gICAgICAgICAgICAgIGdldEFsaWdubWVudEJhc2VsaW5lOiAndG9wJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxheWVycztcbiAgfVxufVxuXG5mdW5jdGlvbiBwaWNrVmlld3BvcnRQcm9wcyh2aWV3cG9ydDogUmVjb3JkPHN0cmluZywgYW55Pik6IFZpZXdwb3J0UHJvcHMge1xuICBjb25zdCB7d2lkdGgsIGhlaWdodCwgbG9uZ2l0dWRlLCBsYXRpdHVkZSwgem9vbSwgcGl0Y2gsIGJlYXJpbmd9ID0gdmlld3BvcnQ7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGxvbmdpdHVkZSxcbiAgICBsYXRpdHVkZSxcbiAgICB6b29tLFxuICAgIHBpdGNoLFxuICAgIGJlYXJpbmcsXG4gIH07XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowmap.gl/layers",
3
- "version": "8.0.0-alpha.24",
3
+ "version": "8.0.0-alpha.25",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -18,7 +18,7 @@
18
18
  "@luma.gl/constants": "^8.5.10",
19
19
  "@luma.gl/core": "^8.5.10"
20
20
  },
21
- "gitHead": "0a87fc82e22fb9181ccab4dacf8aa1a1a9f74bce",
21
+ "gitHead": "5fe3f218b1613e20b3f5574bb9e7df5c566e0742",
22
22
  "publishConfig": {
23
23
  "access": "public"
24
24
  }
@@ -18,21 +18,21 @@ import {CompositeLayer} from '@deck.gl/core';
18
18
  import {ScatterplotLayer, TextLayer} from '@deck.gl/layers';
19
19
  import {
20
20
  colorAsRgba,
21
+ FilterState,
21
22
  FlowLinesLayerAttributes,
23
+ FlowmapAggregateAccessors,
22
24
  FlowmapData,
23
25
  FlowmapDataAccessors,
24
26
  FlowmapDataProvider,
25
27
  getFlowLineAttributesByIndex,
26
28
  getFlowmapColors,
27
- getOuterCircleRadiusByIndex,
28
29
  getLocationCoordsByIndex,
30
+ getOuterCircleRadiusByIndex,
29
31
  isFlowmapData,
30
32
  isFlowmapDataProvider,
31
33
  LayersData,
32
34
  LocalFlowmapDataProvider,
33
35
  ViewportProps,
34
- FlowmapAggregateAccessors,
35
- FilterState,
36
36
  } from '@flowmap.gl/data';
37
37
  import AnimatedFlowLinesLayer from './AnimatedFlowLinesLayer';
38
38
  import FlowCirclesLayer from './FlowCirclesLayer';
@@ -112,6 +112,8 @@ type State<L, F> = {
112
112
  layersData: LayersData | undefined;
113
113
  highlightedObject: HighlightedObject | undefined;
114
114
  pickingInfo: FlowmapLayerPickingInfo<L, F> | undefined;
115
+ lastHoverTime: number | undefined;
116
+ lastClickTime: number | undefined;
115
117
  };
116
118
 
117
119
  export type SourceEvent = {srcEvent: MouseEvent};
@@ -139,26 +141,39 @@ export default class FlowmapLayer<L, F> extends CompositeLayer {
139
141
  super({
140
142
  ...props,
141
143
  onHover: (info: PickingInfo<any>, event: SourceEvent) => {
142
- // TODO: if (lastHoverEventStartTimeRef > startTime) {
143
- // // Skipping, because this is not the latest hover event
144
- // return;
145
- // }
146
- this.setState({highlightedObject: this._getHighlightedObject(info)});
144
+ const startTime = Date.now();
145
+ this.setState({
146
+ highlightedObject: this._getHighlightedObject(info),
147
+ lastHoverTime: startTime,
148
+ });
149
+
147
150
  const {onHover} = props;
148
151
  if (onHover) {
149
152
  this._getFlowmapLayerPickingInfo(info).then((info) => {
150
- this.setState({pickingInfo: info});
151
- onHover(info, event);
153
+ if ((this.state?.lastHoverTime ?? 0) <= startTime) {
154
+ this.setState({pickingInfo: info});
155
+ onHover(info, event);
156
+ } else {
157
+ // Skipping, because this is not the latest hover event
158
+ }
152
159
  });
153
160
  }
154
161
  },
155
162
  onClick: (info: PickingInfo<any>, event: SourceEvent) => {
156
163
  const {onClick} = props;
164
+ const startTime = Date.now();
165
+ this.setState({
166
+ lastClickTime: startTime,
167
+ });
157
168
  if (onClick) {
158
169
  this._getFlowmapLayerPickingInfo(info).then((info) => {
159
- this.setState({pickingInfo: info});
160
- if (info) {
161
- onClick(info, event);
170
+ if ((this.state?.lastClickTime ?? 0) <= startTime) {
171
+ this.setState({pickingInfo: info});
172
+ if (info) {
173
+ onClick(info, event);
174
+ }
175
+ } else {
176
+ // Skipping, because this is not the latest hover event
162
177
  }
163
178
  });
164
179
  }
@@ -173,6 +188,8 @@ export default class FlowmapLayer<L, F> extends CompositeLayer {
173
188
  layersData: undefined,
174
189
  highlightedObject: undefined,
175
190
  pickingInfo: undefined,
191
+ lastHoverTime: undefined,
192
+ lastClickTime: undefined,
176
193
  };
177
194
  }
178
195