@pie-lib/graphing 3.1.0-next.0 → 3.1.0-next.2
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.
- package/CHANGELOG.md +33 -0
- package/package.json +8 -8
- package/lib/__tests__/graph-with-controls.test.js +0 -226
- package/lib/__tests__/graph.test.js +0 -187
- package/lib/__tests__/grid.test.js +0 -29
- package/lib/__tests__/labels.test.js +0 -61
- package/lib/__tests__/mark-label.test.js +0 -133
- package/lib/__tests__/toggle-bar.test.js +0 -150
- package/lib/__tests__/tool-menu.test.js +0 -101
- package/lib/__tests__/undo-redo.test.js +0 -31
- package/lib/__tests__/use-debounce.test.js +0 -24
- package/lib/__tests__/utils.js +0 -70
- package/lib/__tests__/utils.test.js +0 -123
- package/lib/axis/__tests__/arrow.test.js +0 -60
- package/lib/axis/__tests__/axes.test.js +0 -195
- package/lib/axis/arrow.js +0 -79
- package/lib/axis/arrow.js.map +0 -1
- package/lib/axis/axes.js +0 -327
- package/lib/axis/axes.js.map +0 -1
- package/lib/axis/index.js +0 -21
- package/lib/axis/index.js.map +0 -1
- package/lib/bg.js +0 -111
- package/lib/bg.js.map +0 -1
- package/lib/container/actions.js +0 -18
- package/lib/container/actions.js.map +0 -1
- package/lib/container/index.js +0 -118
- package/lib/container/index.js.map +0 -1
- package/lib/container/marks.js +0 -22
- package/lib/container/marks.js.map +0 -1
- package/lib/container/middleware.js +0 -19
- package/lib/container/middleware.js.map +0 -1
- package/lib/container/reducer.js +0 -18
- package/lib/container/reducer.js.map +0 -1
- package/lib/coordinates-label.js +0 -79
- package/lib/coordinates-label.js.map +0 -1
- package/lib/graph-with-controls.js +0 -295
- package/lib/graph-with-controls.js.map +0 -1
- package/lib/graph.js +0 -314
- package/lib/graph.js.map +0 -1
- package/lib/grid-setup.js +0 -406
- package/lib/grid-setup.js.map +0 -1
- package/lib/grid.js +0 -131
- package/lib/grid.js.map +0 -1
- package/lib/index.js +0 -47
- package/lib/index.js.map +0 -1
- package/lib/key-legend.js +0 -201
- package/lib/key-legend.js.map +0 -1
- package/lib/label-svg-icon.js +0 -50
- package/lib/label-svg-icon.js.map +0 -1
- package/lib/labels.js +0 -243
- package/lib/labels.js.map +0 -1
- package/lib/mark-label.js +0 -278
- package/lib/mark-label.js.map +0 -1
- package/lib/toggle-bar.js +0 -248
- package/lib/toggle-bar.js.map +0 -1
- package/lib/tool-menu.js +0 -78
- package/lib/tool-menu.js.map +0 -1
- package/lib/tools/absolute/__tests__/component.test.js +0 -67
- package/lib/tools/absolute/component.js +0 -29
- package/lib/tools/absolute/component.js.map +0 -1
- package/lib/tools/absolute/index.js +0 -50
- package/lib/tools/absolute/index.js.map +0 -1
- package/lib/tools/circle/__tests__/bg-circle.test.js +0 -33
- package/lib/tools/circle/__tests__/component.test.js +0 -68
- package/lib/tools/circle/bg-circle.js +0 -123
- package/lib/tools/circle/bg-circle.js.map +0 -1
- package/lib/tools/circle/component.js +0 -319
- package/lib/tools/circle/component.js.map +0 -1
- package/lib/tools/circle/index.js +0 -41
- package/lib/tools/circle/index.js.map +0 -1
- package/lib/tools/exponential/__tests__/component.test.js +0 -66
- package/lib/tools/exponential/component.js +0 -28
- package/lib/tools/exponential/component.js.map +0 -1
- package/lib/tools/exponential/index.js +0 -56
- package/lib/tools/exponential/index.js.map +0 -1
- package/lib/tools/index.js +0 -86
- package/lib/tools/index.js.map +0 -1
- package/lib/tools/line/__tests__/component.test.js +0 -45
- package/lib/tools/line/component.js +0 -82
- package/lib/tools/line/component.js.map +0 -1
- package/lib/tools/line/index.js +0 -11
- package/lib/tools/line/index.js.map +0 -1
- package/lib/tools/parabola/__tests__/component.test.js +0 -66
- package/lib/tools/parabola/component.js +0 -28
- package/lib/tools/parabola/component.js.map +0 -1
- package/lib/tools/parabola/index.js +0 -50
- package/lib/tools/parabola/index.js.map +0 -1
- package/lib/tools/point/__tests__/component.test.js +0 -50
- package/lib/tools/point/component.js +0 -139
- package/lib/tools/point/component.js.map +0 -1
- package/lib/tools/point/index.js +0 -24
- package/lib/tools/point/index.js.map +0 -1
- package/lib/tools/polygon/__tests__/component.test.js +0 -85
- package/lib/tools/polygon/__tests__/index.test.js +0 -92
- package/lib/tools/polygon/__tests__/line.test.js +0 -29
- package/lib/tools/polygon/__tests__/polygon.test.js +0 -59
- package/lib/tools/polygon/component.js +0 -417
- package/lib/tools/polygon/component.js.map +0 -1
- package/lib/tools/polygon/index.js +0 -89
- package/lib/tools/polygon/index.js.map +0 -1
- package/lib/tools/polygon/line.js +0 -114
- package/lib/tools/polygon/line.js.map +0 -1
- package/lib/tools/polygon/polygon.js +0 -132
- package/lib/tools/polygon/polygon.js.map +0 -1
- package/lib/tools/ray/__tests__/component.test.js +0 -35
- package/lib/tools/ray/component.js +0 -83
- package/lib/tools/ray/component.js.map +0 -1
- package/lib/tools/ray/index.js +0 -11
- package/lib/tools/ray/index.js.map +0 -1
- package/lib/tools/segment/__tests__/component.test.js +0 -35
- package/lib/tools/segment/component.js +0 -57
- package/lib/tools/segment/component.js.map +0 -1
- package/lib/tools/segment/index.js +0 -11
- package/lib/tools/segment/index.js.map +0 -1
- package/lib/tools/shared/__tests__/arrow-head.test.js +0 -45
- package/lib/tools/shared/arrow-head.js +0 -111
- package/lib/tools/shared/arrow-head.js.map +0 -1
- package/lib/tools/shared/icons/CorrectSVG.js +0 -40
- package/lib/tools/shared/icons/CorrectSVG.js.map +0 -1
- package/lib/tools/shared/icons/IncorrectSVG.js +0 -40
- package/lib/tools/shared/icons/IncorrectSVG.js.map +0 -1
- package/lib/tools/shared/icons/MissingSVG.js +0 -39
- package/lib/tools/shared/icons/MissingSVG.js.map +0 -1
- package/lib/tools/shared/line/__tests__/index.test.js +0 -124
- package/lib/tools/shared/line/__tests__/line-path.test.js +0 -62
- package/lib/tools/shared/line/__tests__/with-root-edge.test.js +0 -91
- package/lib/tools/shared/line/index.js +0 -546
- package/lib/tools/shared/line/index.js.map +0 -1
- package/lib/tools/shared/line/line-path.js +0 -120
- package/lib/tools/shared/line/line-path.js.map +0 -1
- package/lib/tools/shared/line/with-root-edge.js +0 -121
- package/lib/tools/shared/line/with-root-edge.js.map +0 -1
- package/lib/tools/shared/point/__tests__/arrow-point.test.js +0 -127
- package/lib/tools/shared/point/__tests__/base-point.test.js +0 -122
- package/lib/tools/shared/point/arrow-point.js +0 -72
- package/lib/tools/shared/point/arrow-point.js.map +0 -1
- package/lib/tools/shared/point/arrow.js +0 -67
- package/lib/tools/shared/point/arrow.js.map +0 -1
- package/lib/tools/shared/point/base-point.js +0 -157
- package/lib/tools/shared/point/base-point.js.map +0 -1
- package/lib/tools/shared/point/index.js +0 -62
- package/lib/tools/shared/point/index.js.map +0 -1
- package/lib/tools/shared/styles.js +0 -30
- package/lib/tools/shared/styles.js.map +0 -1
- package/lib/tools/shared/types.js +0 -16
- package/lib/tools/shared/types.js.map +0 -1
- package/lib/tools/sine/__tests__/component.test.js +0 -72
- package/lib/tools/sine/component.js +0 -40
- package/lib/tools/sine/component.js.map +0 -1
- package/lib/tools/sine/index.js +0 -50
- package/lib/tools/sine/index.js.map +0 -1
- package/lib/tools/vector/__tests__/component.test.js +0 -32
- package/lib/tools/vector/component.js +0 -68
- package/lib/tools/vector/component.js.map +0 -1
- package/lib/tools/vector/index.js +0 -11
- package/lib/tools/vector/index.js.map +0 -1
- package/lib/undo-redo.js +0 -83
- package/lib/undo-redo.js.map +0 -1
- package/lib/use-debounce.js +0 -25
- package/lib/use-debounce.js.map +0 -1
- package/lib/utils.js +0 -230
- package/lib/utils.js.map +0 -1
|
@@ -1,546 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.styles = exports.lineToolComponent = exports.lineTool = exports.lineBase = void 0;
|
|
8
|
-
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
10
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
11
|
-
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
12
|
-
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
13
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
14
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
15
|
-
var _react = _interopRequireDefault(require("react"));
|
|
16
|
-
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
|
|
17
|
-
var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
18
|
-
var _point = require("../point");
|
|
19
|
-
var _plot = require("@pie-lib/plot");
|
|
20
|
-
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
21
|
-
var _styles = require("../styles");
|
|
22
|
-
var _reactDom = _interopRequireDefault(require("react-dom"));
|
|
23
|
-
var _markLabel = _interopRequireDefault(require("../../../mark-label"));
|
|
24
|
-
var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
|
|
25
|
-
var _renderUi = require("@pie-lib/render-ui");
|
|
26
|
-
var _utils = require("../../../utils");
|
|
27
|
-
var _styles2 = require("@mui/material/styles");
|
|
28
|
-
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)); }
|
|
29
|
-
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
30
|
-
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; }
|
|
31
|
-
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; }
|
|
32
|
-
var StyledLineGroup = (0, _styles2.styled)('g')(function (_ref) {
|
|
33
|
-
var disabled = _ref.disabled,
|
|
34
|
-
correctness = _ref.correctness;
|
|
35
|
-
return _objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
36
|
-
'& line': {
|
|
37
|
-
fill: 'transparent',
|
|
38
|
-
stroke: _renderUi.color.defaults.BLACK,
|
|
39
|
-
strokeWidth: 3,
|
|
40
|
-
transition: 'stroke 200ms ease-in, stroke-width 200ms ease-in',
|
|
41
|
-
'&:hover': {
|
|
42
|
-
strokeWidth: 6,
|
|
43
|
-
stroke: _renderUi.color.defaults.PRIMARY_DARK
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}, disabled && {
|
|
47
|
-
'& line': _objectSpread(_objectSpread({}, (0, _styles.disabledSecondary)('stroke')), {}, {
|
|
48
|
-
strokeWidth: 2
|
|
49
|
-
})
|
|
50
|
-
}), correctness === 'correct' && {
|
|
51
|
-
'& line': _objectSpread({}, (0, _styles.correct)('stroke'))
|
|
52
|
-
}), correctness === 'incorrect' && {
|
|
53
|
-
'& line': _objectSpread({}, (0, _styles.incorrect)('stroke'))
|
|
54
|
-
}), correctness === 'missing' && {
|
|
55
|
-
'& line': _objectSpread(_objectSpread({}, (0, _styles.missing)('stroke')), {}, {
|
|
56
|
-
strokeWidth: 1,
|
|
57
|
-
strokeDasharray: '4 3'
|
|
58
|
-
})
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
var lineTool = exports.lineTool = function lineTool(type, Component) {
|
|
62
|
-
return function () {
|
|
63
|
-
return {
|
|
64
|
-
type: type,
|
|
65
|
-
Component: Component,
|
|
66
|
-
addPoint: function addPoint(point, mark) {
|
|
67
|
-
if (mark && (0, _utils.equalPoints)(mark.root, point)) {
|
|
68
|
-
return mark;
|
|
69
|
-
}
|
|
70
|
-
if (!mark) {
|
|
71
|
-
return {
|
|
72
|
-
type: type,
|
|
73
|
-
building: true,
|
|
74
|
-
from: point
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
if ((0, _utils.equalPoints)(point, mark.from)) {
|
|
78
|
-
return _objectSpread({}, mark);
|
|
79
|
-
}
|
|
80
|
-
return _objectSpread(_objectSpread({}, mark), {}, {
|
|
81
|
-
building: false,
|
|
82
|
-
to: point
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
};
|
|
87
|
-
};
|
|
88
|
-
var lineToolComponent = exports.lineToolComponent = function lineToolComponent(Component) {
|
|
89
|
-
var _LineToolComponent;
|
|
90
|
-
return _LineToolComponent = /*#__PURE__*/function (_React$Component) {
|
|
91
|
-
function LineToolComponent(props) {
|
|
92
|
-
var _this;
|
|
93
|
-
(0, _classCallCheck2["default"])(this, LineToolComponent);
|
|
94
|
-
_this = _callSuper(this, LineToolComponent, [props]);
|
|
95
|
-
(0, _defineProperty2["default"])(_this, "startDrag", function () {
|
|
96
|
-
return _this.setState({
|
|
97
|
-
mark: _objectSpread({}, _this.props.mark)
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
(0, _defineProperty2["default"])(_this, "stopDrag", function () {
|
|
101
|
-
var _this$props = _this.props,
|
|
102
|
-
onChange = _this$props.onChange,
|
|
103
|
-
mark = _this$props.mark;
|
|
104
|
-
var update = _objectSpread({}, _this.state.mark);
|
|
105
|
-
_this.setState({
|
|
106
|
-
mark: undefined
|
|
107
|
-
}, function () {
|
|
108
|
-
var type = update.type;
|
|
109
|
-
var shouldNotChange = type && (type === 'parabola' || type === 'sine' || type === 'absolute' || type === 'exponential') && (0, _utils.sameAxes)(update.from, update.to);
|
|
110
|
-
if (!shouldNotChange && type && type === 'exponential' && update.from && update.to) {
|
|
111
|
-
shouldNotChange = update.from.y === 0 || update.to.y === 0 || update.from.y * update.to.y < 0;
|
|
112
|
-
}
|
|
113
|
-
if (!(0, _isEqual["default"])(mark, update) && !shouldNotChange) {
|
|
114
|
-
onChange(mark, update);
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
(0, _defineProperty2["default"])(_this, "changeMark", function (_ref2) {
|
|
119
|
-
var from = _ref2.from,
|
|
120
|
-
to = _ref2.to,
|
|
121
|
-
middle = _ref2.middle;
|
|
122
|
-
var mark = _objectSpread(_objectSpread({}, _this.state.mark), {}, {
|
|
123
|
-
from: from,
|
|
124
|
-
to: to
|
|
125
|
-
});
|
|
126
|
-
if (middle) {
|
|
127
|
-
mark = _objectSpread(_objectSpread({}, mark), {}, {
|
|
128
|
-
middle: middle
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
_this.setState({
|
|
132
|
-
mark: mark
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
(0, _defineProperty2["default"])(_this, "changeMarkProps", function (_ref3) {
|
|
136
|
-
var from = _ref3.from,
|
|
137
|
-
to = _ref3.to,
|
|
138
|
-
middle = _ref3.middle;
|
|
139
|
-
var _this$props2 = _this.props,
|
|
140
|
-
onChange = _this$props2.onChange,
|
|
141
|
-
mark = _this$props2.mark;
|
|
142
|
-
var update = _objectSpread(_objectSpread({}, mark), _this.state.mark);
|
|
143
|
-
if (from) {
|
|
144
|
-
update = _objectSpread(_objectSpread({}, update), {}, {
|
|
145
|
-
from: from
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
if (to) {
|
|
149
|
-
update = _objectSpread(_objectSpread({}, update), {}, {
|
|
150
|
-
to: to
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
if (middle) {
|
|
154
|
-
update = _objectSpread(_objectSpread({}, update), {}, {
|
|
155
|
-
middle: middle
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
if (!(0, _isEqual["default"])(mark, update)) {
|
|
159
|
-
onChange(mark, update);
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
_this.state = {};
|
|
163
|
-
return _this;
|
|
164
|
-
}
|
|
165
|
-
(0, _inherits2["default"])(LineToolComponent, _React$Component);
|
|
166
|
-
return (0, _createClass2["default"])(LineToolComponent, [{
|
|
167
|
-
key: "render",
|
|
168
|
-
value: function render() {
|
|
169
|
-
var _this$props3 = this.props,
|
|
170
|
-
graphProps = _this$props3.graphProps,
|
|
171
|
-
onClick = _this$props3.onClick,
|
|
172
|
-
labelNode = _this$props3.labelNode,
|
|
173
|
-
labelModeEnabled = _this$props3.labelModeEnabled,
|
|
174
|
-
coordinatesOnHover = _this$props3.coordinatesOnHover,
|
|
175
|
-
limitLabeling = _this$props3.limitLabeling;
|
|
176
|
-
var mark = this.state.mark ? this.state.mark : this.props.mark;
|
|
177
|
-
var from = (0, _cloneDeep["default"])(mark.from);
|
|
178
|
-
var to = (0, _cloneDeep["default"])(mark.to);
|
|
179
|
-
var middle = (0, _cloneDeep["default"])(mark.middle);
|
|
180
|
-
|
|
181
|
-
// SET DISABLED
|
|
182
|
-
// if it's a background mark, we need to force disable it
|
|
183
|
-
if (from && mark.isBackground) {
|
|
184
|
-
from.disabled = true;
|
|
185
|
-
}
|
|
186
|
-
if (to && mark.isBackground) {
|
|
187
|
-
to.disabled = true;
|
|
188
|
-
}
|
|
189
|
-
if (middle && mark.isBackground) {
|
|
190
|
-
middle.disabled = true;
|
|
191
|
-
}
|
|
192
|
-
return /*#__PURE__*/_react["default"].createElement(Component, {
|
|
193
|
-
disabled: mark.disabled,
|
|
194
|
-
coordinatesOnHover: coordinatesOnHover,
|
|
195
|
-
correctness: mark.correctness,
|
|
196
|
-
from: from,
|
|
197
|
-
to: to,
|
|
198
|
-
middle: middle,
|
|
199
|
-
graphProps: graphProps,
|
|
200
|
-
onChange: this.changeMark,
|
|
201
|
-
changeMarkProps: this.changeMarkProps,
|
|
202
|
-
onClick: onClick,
|
|
203
|
-
onDragStart: this.startDrag,
|
|
204
|
-
onDragStop: this.stopDrag,
|
|
205
|
-
labelNode: labelNode,
|
|
206
|
-
labelModeEnabled: labelModeEnabled,
|
|
207
|
-
limitLabeling: limitLabeling
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
}]);
|
|
211
|
-
}(_react["default"].Component), (0, _defineProperty2["default"])(_LineToolComponent, "propTypes", _objectSpread(_objectSpread({}, _plot.types.ToolPropTypeFields), {}, {
|
|
212
|
-
graphProps: _plot.types.GraphPropsType.isRequired,
|
|
213
|
-
limitLabeling: _propTypes["default"].bool,
|
|
214
|
-
changeMarkProps: _propTypes["default"].func,
|
|
215
|
-
disabled: _propTypes["default"].bool,
|
|
216
|
-
from: _plot.types.PointType,
|
|
217
|
-
to: _plot.types.PointType,
|
|
218
|
-
labelModeEnabled: _propTypes["default"].bool,
|
|
219
|
-
onClick: _propTypes["default"].func
|
|
220
|
-
})), _LineToolComponent;
|
|
221
|
-
};
|
|
222
|
-
var dragOpts = function dragOpts() {
|
|
223
|
-
return {
|
|
224
|
-
bounds: function bounds(props, _ref4) {
|
|
225
|
-
var domain = _ref4.domain,
|
|
226
|
-
range = _ref4.range;
|
|
227
|
-
var area = _plot.utils.lineToArea(props.from, props.to);
|
|
228
|
-
return _plot.utils.bounds(area, domain, range);
|
|
229
|
-
},
|
|
230
|
-
anchorPoint: function anchorPoint(props) {
|
|
231
|
-
var from = props.from;
|
|
232
|
-
return from;
|
|
233
|
-
},
|
|
234
|
-
fromDelta: function fromDelta(props, delta) {
|
|
235
|
-
var from = props.from,
|
|
236
|
-
to = props.to;
|
|
237
|
-
return {
|
|
238
|
-
from: _plot.utils.point(from).add(_plot.utils.point(delta)),
|
|
239
|
-
to: _plot.utils.point(to).add(_plot.utils.point(delta))
|
|
240
|
-
};
|
|
241
|
-
}
|
|
242
|
-
};
|
|
243
|
-
};
|
|
244
|
-
var lineBase = exports.lineBase = function lineBase(Comp, opts) {
|
|
245
|
-
var DraggableComp = (0, _plot.gridDraggable)(dragOpts())(Comp);
|
|
246
|
-
var FromPoint = opts && opts.from ? opts.from : _point.BasePoint;
|
|
247
|
-
var ToPoint = opts && opts.to ? opts.to : _point.BasePoint;
|
|
248
|
-
var LineBase = /*#__PURE__*/function (_React$Component2) {
|
|
249
|
-
function LineBase() {
|
|
250
|
-
var _this2;
|
|
251
|
-
(0, _classCallCheck2["default"])(this, LineBase);
|
|
252
|
-
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
253
|
-
args[_key] = arguments[_key];
|
|
254
|
-
}
|
|
255
|
-
_this2 = _callSuper(this, LineBase, [].concat(args));
|
|
256
|
-
(0, _defineProperty2["default"])(_this2, "onChangePoint", function (point) {
|
|
257
|
-
var _this2$props = _this2.props,
|
|
258
|
-
middle = _this2$props.middle,
|
|
259
|
-
onChange = _this2$props.onChange;
|
|
260
|
-
var from = point.from,
|
|
261
|
-
to = point.to;
|
|
262
|
-
|
|
263
|
-
// because point.from.label and point.to.label can be different
|
|
264
|
-
if (!(0, _utils.equalPoints)(from, to)) {
|
|
265
|
-
if (middle) {
|
|
266
|
-
point.middle = _objectSpread(_objectSpread({}, middle), (0, _utils.getMiddleOfTwoPoints)(from, to));
|
|
267
|
-
}
|
|
268
|
-
onChange(point);
|
|
269
|
-
}
|
|
270
|
-
});
|
|
271
|
-
(0, _defineProperty2["default"])(_this2, "dragComp", function (_ref5) {
|
|
272
|
-
var draggedFrom = _ref5.from,
|
|
273
|
-
draggedTo = _ref5.to;
|
|
274
|
-
var _this2$props2 = _this2.props,
|
|
275
|
-
from = _this2$props2.from,
|
|
276
|
-
to = _this2$props2.to,
|
|
277
|
-
onChange = _this2$props2.onChange,
|
|
278
|
-
middle = _this2$props2.middle;
|
|
279
|
-
if (from.label) {
|
|
280
|
-
draggedFrom.label = from.label;
|
|
281
|
-
}
|
|
282
|
-
if (to.label) {
|
|
283
|
-
draggedTo.label = to.label;
|
|
284
|
-
}
|
|
285
|
-
var updated = {
|
|
286
|
-
from: draggedFrom,
|
|
287
|
-
to: draggedTo
|
|
288
|
-
};
|
|
289
|
-
if (middle) {
|
|
290
|
-
updated.middle = _objectSpread(_objectSpread({}, middle), (0, _utils.getMiddleOfTwoPoints)(draggedFrom, draggedTo));
|
|
291
|
-
}
|
|
292
|
-
onChange(updated);
|
|
293
|
-
});
|
|
294
|
-
(0, _defineProperty2["default"])(_this2, "dragFrom", function (draggedFrom) {
|
|
295
|
-
var _this2$props3 = _this2.props,
|
|
296
|
-
from = _this2$props3.from,
|
|
297
|
-
to = _this2$props3.to;
|
|
298
|
-
if (from.label) {
|
|
299
|
-
draggedFrom.label = from.label;
|
|
300
|
-
}
|
|
301
|
-
if (!(0, _utils.equalPoints)(draggedFrom, to)) {
|
|
302
|
-
_this2.onChangePoint({
|
|
303
|
-
from: draggedFrom,
|
|
304
|
-
to: to
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
});
|
|
308
|
-
(0, _defineProperty2["default"])(_this2, "dragTo", function (draggedTo) {
|
|
309
|
-
var _this2$props4 = _this2.props,
|
|
310
|
-
from = _this2$props4.from,
|
|
311
|
-
to = _this2$props4.to;
|
|
312
|
-
if (to.label) {
|
|
313
|
-
draggedTo.label = to.label;
|
|
314
|
-
}
|
|
315
|
-
if (!(0, _utils.equalPoints)(from, draggedTo)) {
|
|
316
|
-
_this2.onChangePoint({
|
|
317
|
-
from: from,
|
|
318
|
-
to: draggedTo
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
});
|
|
322
|
-
(0, _defineProperty2["default"])(_this2, "labelChange", function (point, type) {
|
|
323
|
-
var changeMarkProps = _this2.props.changeMarkProps;
|
|
324
|
-
var update = _objectSpread({}, point);
|
|
325
|
-
if (!point.label || (0, _isEmpty["default"])(point.label)) {
|
|
326
|
-
delete update.label;
|
|
327
|
-
}
|
|
328
|
-
changeMarkProps((0, _defineProperty2["default"])({}, type, update));
|
|
329
|
-
});
|
|
330
|
-
(0, _defineProperty2["default"])(_this2, "clickPoint", function (point, type, data) {
|
|
331
|
-
var _this2$props5 = _this2.props,
|
|
332
|
-
changeMarkProps = _this2$props5.changeMarkProps,
|
|
333
|
-
disabled = _this2$props5.disabled,
|
|
334
|
-
from = _this2$props5.from,
|
|
335
|
-
to = _this2$props5.to,
|
|
336
|
-
labelModeEnabled = _this2$props5.labelModeEnabled,
|
|
337
|
-
limitLabeling = _this2$props5.limitLabeling,
|
|
338
|
-
onClick = _this2$props5.onClick;
|
|
339
|
-
if (!labelModeEnabled) {
|
|
340
|
-
onClick(point || data);
|
|
341
|
-
return;
|
|
342
|
-
}
|
|
343
|
-
if (disabled) {
|
|
344
|
-
return;
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
// limit labeling the points of the line
|
|
348
|
-
if (limitLabeling) {
|
|
349
|
-
return;
|
|
350
|
-
}
|
|
351
|
-
if (type === 'middle' && !point && from && to) {
|
|
352
|
-
point = _objectSpread(_objectSpread({}, point), (0, _utils.getMiddleOfTwoPoints)(from, to));
|
|
353
|
-
}
|
|
354
|
-
changeMarkProps((0, _defineProperty2["default"])({
|
|
355
|
-
from: from,
|
|
356
|
-
to: to
|
|
357
|
-
}, type, _objectSpread({
|
|
358
|
-
label: ''
|
|
359
|
-
}, point)));
|
|
360
|
-
if (_this2.input[type]) {
|
|
361
|
-
_this2.input[type].focus();
|
|
362
|
-
}
|
|
363
|
-
});
|
|
364
|
-
// IMPORTANT, do not remove
|
|
365
|
-
(0, _defineProperty2["default"])(_this2, "input", {});
|
|
366
|
-
return _this2;
|
|
367
|
-
}
|
|
368
|
-
(0, _inherits2["default"])(LineBase, _React$Component2);
|
|
369
|
-
return (0, _createClass2["default"])(LineBase, [{
|
|
370
|
-
key: "render",
|
|
371
|
-
value: function render() {
|
|
372
|
-
var _this3 = this;
|
|
373
|
-
var _this$props4 = this.props,
|
|
374
|
-
coordinatesOnHover = _this$props4.coordinatesOnHover,
|
|
375
|
-
graphProps = _this$props4.graphProps,
|
|
376
|
-
onDragStart = _this$props4.onDragStart,
|
|
377
|
-
onDragStop = _this$props4.onDragStop,
|
|
378
|
-
from = _this$props4.from,
|
|
379
|
-
to = _this$props4.to,
|
|
380
|
-
middle = _this$props4.middle,
|
|
381
|
-
disabled = _this$props4.disabled,
|
|
382
|
-
correctness = _this$props4.correctness,
|
|
383
|
-
onClick = _this$props4.onClick,
|
|
384
|
-
labelNode = _this$props4.labelNode,
|
|
385
|
-
labelModeEnabled = _this$props4.labelModeEnabled;
|
|
386
|
-
var common = {
|
|
387
|
-
graphProps: graphProps,
|
|
388
|
-
onDragStart: onDragStart,
|
|
389
|
-
onDragStop: onDragStop,
|
|
390
|
-
disabled: disabled,
|
|
391
|
-
correctness: correctness,
|
|
392
|
-
onClick: onClick
|
|
393
|
-
};
|
|
394
|
-
var angle = to ? _plot.trig.toDegrees(_plot.trig.angle(from, to)) : 0;
|
|
395
|
-
var fromLabelNode = null;
|
|
396
|
-
var toLabelNode = null;
|
|
397
|
-
var lineLabelNode = null;
|
|
398
|
-
if (labelNode) {
|
|
399
|
-
if (from && Object.prototype.hasOwnProperty.call(from, 'label')) {
|
|
400
|
-
fromLabelNode = /*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement(_markLabel["default"], {
|
|
401
|
-
inputRef: function inputRef(r) {
|
|
402
|
-
return _this3.input.from = r;
|
|
403
|
-
},
|
|
404
|
-
disabled: !labelModeEnabled,
|
|
405
|
-
mark: from,
|
|
406
|
-
graphProps: graphProps,
|
|
407
|
-
onChange: function onChange(label) {
|
|
408
|
-
return _this3.labelChange(_objectSpread(_objectSpread({}, from), {}, {
|
|
409
|
-
label: label
|
|
410
|
-
}), 'from');
|
|
411
|
-
}
|
|
412
|
-
}), labelNode);
|
|
413
|
-
}
|
|
414
|
-
if (to && Object.prototype.hasOwnProperty.call(to, 'label')) {
|
|
415
|
-
toLabelNode = /*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement(_markLabel["default"], {
|
|
416
|
-
inputRef: function inputRef(r) {
|
|
417
|
-
return _this3.input.to = r;
|
|
418
|
-
},
|
|
419
|
-
disabled: !labelModeEnabled,
|
|
420
|
-
mark: to,
|
|
421
|
-
graphProps: graphProps,
|
|
422
|
-
onChange: function onChange(label) {
|
|
423
|
-
return _this3.labelChange(_objectSpread(_objectSpread({}, to), {}, {
|
|
424
|
-
label: label
|
|
425
|
-
}), 'to');
|
|
426
|
-
}
|
|
427
|
-
}), labelNode);
|
|
428
|
-
}
|
|
429
|
-
if (middle && Object.prototype.hasOwnProperty.call(middle, 'label')) {
|
|
430
|
-
lineLabelNode = /*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement(_markLabel["default"], {
|
|
431
|
-
inputRef: function inputRef(r) {
|
|
432
|
-
return _this3.input.middle = r;
|
|
433
|
-
},
|
|
434
|
-
disabled: !labelModeEnabled,
|
|
435
|
-
mark: middle,
|
|
436
|
-
graphProps: graphProps,
|
|
437
|
-
onChange: function onChange(label) {
|
|
438
|
-
return _this3.labelChange(_objectSpread(_objectSpread({}, middle), {}, {
|
|
439
|
-
label: label
|
|
440
|
-
}), 'middle');
|
|
441
|
-
}
|
|
442
|
-
}), labelNode);
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
return /*#__PURE__*/_react["default"].createElement(StyledLineGroup, {
|
|
446
|
-
disabled: disabled,
|
|
447
|
-
correctness: correctness
|
|
448
|
-
}, to && /*#__PURE__*/_react["default"].createElement(DraggableComp, (0, _extends2["default"])({
|
|
449
|
-
from: from,
|
|
450
|
-
to: to,
|
|
451
|
-
middle: middle,
|
|
452
|
-
onDrag: this.dragComp
|
|
453
|
-
}, common, {
|
|
454
|
-
onClick: function onClick(data) {
|
|
455
|
-
return _this3.clickPoint(middle, 'middle', data);
|
|
456
|
-
}
|
|
457
|
-
})), lineLabelNode, /*#__PURE__*/_react["default"].createElement(FromPoint, (0, _extends2["default"])({
|
|
458
|
-
x: from.x,
|
|
459
|
-
y: from.y,
|
|
460
|
-
labelNode: labelNode,
|
|
461
|
-
coordinatesOnHover: coordinatesOnHover,
|
|
462
|
-
onDrag: this.dragFrom
|
|
463
|
-
}, common, {
|
|
464
|
-
onClick: function onClick(data) {
|
|
465
|
-
return _this3.clickPoint(from, 'from', data);
|
|
466
|
-
}
|
|
467
|
-
})), fromLabelNode, to && /*#__PURE__*/_react["default"].createElement(ToPoint, (0, _extends2["default"])({
|
|
468
|
-
x: to.x,
|
|
469
|
-
y: to.y,
|
|
470
|
-
angle: angle //angle + 45}
|
|
471
|
-
,
|
|
472
|
-
labelNode: labelNode,
|
|
473
|
-
coordinatesOnHover: coordinatesOnHover,
|
|
474
|
-
onDrag: this.dragTo
|
|
475
|
-
}, common, {
|
|
476
|
-
onClick: function onClick(data) {
|
|
477
|
-
return _this3.clickPoint(to, 'to', data);
|
|
478
|
-
}
|
|
479
|
-
})), toLabelNode);
|
|
480
|
-
}
|
|
481
|
-
}]);
|
|
482
|
-
}(_react["default"].Component);
|
|
483
|
-
(0, _defineProperty2["default"])(LineBase, "propTypes", {
|
|
484
|
-
coordinatesOnHover: _propTypes["default"].bool,
|
|
485
|
-
graphProps: _plot.types.GraphPropsType,
|
|
486
|
-
from: _plot.types.PointType,
|
|
487
|
-
to: _plot.types.PointType,
|
|
488
|
-
middle: _plot.types.PointType,
|
|
489
|
-
onChange: _propTypes["default"].func,
|
|
490
|
-
onDragStart: _propTypes["default"].func,
|
|
491
|
-
onDragStop: _propTypes["default"].func,
|
|
492
|
-
onClick: _propTypes["default"].func,
|
|
493
|
-
correctness: _propTypes["default"].string,
|
|
494
|
-
disabled: _propTypes["default"].bool,
|
|
495
|
-
limitLabeling: _propTypes["default"].bool,
|
|
496
|
-
changeMarkProps: _propTypes["default"].func,
|
|
497
|
-
labelModeEnabled: _propTypes["default"].bool,
|
|
498
|
-
labelNode: _propTypes["default"].object
|
|
499
|
-
});
|
|
500
|
-
return LineBase;
|
|
501
|
-
};
|
|
502
|
-
var styles = exports.styles = {
|
|
503
|
-
line: function line() {
|
|
504
|
-
return {
|
|
505
|
-
fill: 'transparent',
|
|
506
|
-
stroke: _renderUi.color.defaults.BLACK,
|
|
507
|
-
strokeWidth: 3,
|
|
508
|
-
transition: 'stroke 200ms ease-in, stroke-width 200ms ease-in',
|
|
509
|
-
'&:hover': {
|
|
510
|
-
strokeWidth: 6,
|
|
511
|
-
stroke: _renderUi.color.defaults.PRIMARY_DARK
|
|
512
|
-
}
|
|
513
|
-
};
|
|
514
|
-
},
|
|
515
|
-
arrow: function arrow() {
|
|
516
|
-
return {
|
|
517
|
-
fill: _renderUi.color.defaults.BLACK
|
|
518
|
-
};
|
|
519
|
-
},
|
|
520
|
-
disabledArrow: function disabledArrow() {
|
|
521
|
-
return _objectSpread({}, (0, _styles.disabledSecondary)());
|
|
522
|
-
},
|
|
523
|
-
disabledSecondary: function disabledSecondary() {
|
|
524
|
-
return _objectSpread(_objectSpread({}, (0, _styles.disabledSecondary)('stroke')), {}, {
|
|
525
|
-
strokeWidth: 2
|
|
526
|
-
});
|
|
527
|
-
},
|
|
528
|
-
disabled: function disabled() {
|
|
529
|
-
return _objectSpread(_objectSpread({}, (0, _styles.disabled)('stroke')), {}, {
|
|
530
|
-
strokeWidth: 2
|
|
531
|
-
});
|
|
532
|
-
},
|
|
533
|
-
correct: function correct(theme, key) {
|
|
534
|
-
return _objectSpread({}, (0, _styles.correct)(key));
|
|
535
|
-
},
|
|
536
|
-
incorrect: function incorrect(theme, key) {
|
|
537
|
-
return _objectSpread({}, (0, _styles.incorrect)(key));
|
|
538
|
-
},
|
|
539
|
-
missing: function missing(theme, key) {
|
|
540
|
-
return _objectSpread(_objectSpread({}, (0, _styles.missing)(key)), {}, {
|
|
541
|
-
strokeWidth: 1,
|
|
542
|
-
strokeDasharray: '4 3'
|
|
543
|
-
});
|
|
544
|
-
}
|
|
545
|
-
};
|
|
546
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9pc0VxdWFsIiwiX2Nsb25lRGVlcCIsIl9wb2ludCIsIl9wbG90IiwiX3Byb3BUeXBlcyIsIl9zdHlsZXMiLCJfcmVhY3REb20iLCJfbWFya0xhYmVsIiwiX2lzRW1wdHkiLCJfcmVuZGVyVWkiLCJfdXRpbHMiLCJfc3R5bGVzMiIsIl9jYWxsU3VwZXIiLCJ0IiwibyIsImUiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJjYWxsIiwib3duS2V5cyIsInIiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiU3R5bGVkTGluZUdyb3VwIiwic3R5bGVkIiwiX3JlZiIsImRpc2FibGVkIiwiY29ycmVjdG5lc3MiLCJmaWxsIiwic3Ryb2tlIiwiY29sb3IiLCJkZWZhdWx0cyIsIkJMQUNLIiwic3Ryb2tlV2lkdGgiLCJ0cmFuc2l0aW9uIiwiUFJJTUFSWV9EQVJLIiwiZGlzYWJsZWRTZWNvbmRhcnkiLCJjb3JyZWN0IiwiaW5jb3JyZWN0IiwibWlzc2luZyIsInN0cm9rZURhc2hhcnJheSIsImxpbmVUb29sIiwiZXhwb3J0cyIsInR5cGUiLCJDb21wb25lbnQiLCJhZGRQb2ludCIsInBvaW50IiwibWFyayIsImVxdWFsUG9pbnRzIiwicm9vdCIsImJ1aWxkaW5nIiwiZnJvbSIsInRvIiwibGluZVRvb2xDb21wb25lbnQiLCJfTGluZVRvb2xDb21wb25lbnQiLCJfUmVhY3QkQ29tcG9uZW50IiwiTGluZVRvb2xDb21wb25lbnQiLCJwcm9wcyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsInNldFN0YXRlIiwiX3RoaXMkcHJvcHMiLCJvbkNoYW5nZSIsInVwZGF0ZSIsInN0YXRlIiwidW5kZWZpbmVkIiwic2hvdWxkTm90Q2hhbmdlIiwic2FtZUF4ZXMiLCJ5IiwiaXNFcXVhbCIsIl9yZWYyIiwibWlkZGxlIiwiX3JlZjMiLCJfdGhpcyRwcm9wczIiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwicmVuZGVyIiwiX3RoaXMkcHJvcHMzIiwiZ3JhcGhQcm9wcyIsIm9uQ2xpY2siLCJsYWJlbE5vZGUiLCJsYWJlbE1vZGVFbmFibGVkIiwiY29vcmRpbmF0ZXNPbkhvdmVyIiwibGltaXRMYWJlbGluZyIsImNsb25lRGVlcCIsImlzQmFja2dyb3VuZCIsImNyZWF0ZUVsZW1lbnQiLCJjaGFuZ2VNYXJrIiwiY2hhbmdlTWFya1Byb3BzIiwib25EcmFnU3RhcnQiLCJzdGFydERyYWciLCJvbkRyYWdTdG9wIiwic3RvcERyYWciLCJSZWFjdCIsInR5cGVzIiwiVG9vbFByb3BUeXBlRmllbGRzIiwiR3JhcGhQcm9wc1R5cGUiLCJpc1JlcXVpcmVkIiwiUHJvcFR5cGVzIiwiYm9vbCIsImZ1bmMiLCJQb2ludFR5cGUiLCJkcmFnT3B0cyIsImJvdW5kcyIsIl9yZWY0IiwiZG9tYWluIiwicmFuZ2UiLCJhcmVhIiwidXRpbHMiLCJsaW5lVG9BcmVhIiwiYW5jaG9yUG9pbnQiLCJmcm9tRGVsdGEiLCJkZWx0YSIsImFkZCIsImxpbmVCYXNlIiwiQ29tcCIsIm9wdHMiLCJEcmFnZ2FibGVDb21wIiwiZ3JpZERyYWdnYWJsZSIsIkZyb21Qb2ludCIsIkJhc2VQb2ludCIsIlRvUG9pbnQiLCJMaW5lQmFzZSIsIl9SZWFjdCRDb21wb25lbnQyIiwiX3RoaXMyIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJjb25jYXQiLCJfdGhpczIkcHJvcHMiLCJnZXRNaWRkbGVPZlR3b1BvaW50cyIsIl9yZWY1IiwiZHJhZ2dlZEZyb20iLCJkcmFnZ2VkVG8iLCJfdGhpczIkcHJvcHMyIiwibGFiZWwiLCJ1cGRhdGVkIiwiX3RoaXMyJHByb3BzMyIsIm9uQ2hhbmdlUG9pbnQiLCJfdGhpczIkcHJvcHM0IiwiaXNFbXB0eSIsImRhdGEiLCJfdGhpczIkcHJvcHM1IiwiaW5wdXQiLCJmb2N1cyIsIl90aGlzMyIsIl90aGlzJHByb3BzNCIsImNvbW1vbiIsImFuZ2xlIiwidHJpZyIsInRvRGVncmVlcyIsImZyb21MYWJlbE5vZGUiLCJ0b0xhYmVsTm9kZSIsImxpbmVMYWJlbE5vZGUiLCJoYXNPd25Qcm9wZXJ0eSIsIlJlYWN0RE9NIiwiY3JlYXRlUG9ydGFsIiwiaW5wdXRSZWYiLCJsYWJlbENoYW5nZSIsIl9leHRlbmRzMiIsIm9uRHJhZyIsImRyYWdDb21wIiwiY2xpY2tQb2ludCIsIngiLCJkcmFnRnJvbSIsImRyYWdUbyIsInN0cmluZyIsIm9iamVjdCIsInN0eWxlcyIsImxpbmUiLCJhcnJvdyIsImRpc2FibGVkQXJyb3ciLCJ0aGVtZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90b29scy9zaGFyZWQvbGluZS9pbmRleC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC9pc0VxdWFsJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoL2Nsb25lRGVlcCc7XG5pbXBvcnQgeyBCYXNlUG9pbnQgfSBmcm9tICcuLi9wb2ludCc7XG5pbXBvcnQgeyB0eXBlcywgdXRpbHMsIGdyaWREcmFnZ2FibGUsIHRyaWcgfSBmcm9tICdAcGllLWxpYi9wbG90JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBkaXNhYmxlZCwgZGlzYWJsZWRTZWNvbmRhcnksIGNvcnJlY3QsIGluY29ycmVjdCwgbWlzc2luZyB9IGZyb20gJy4uL3N0eWxlcyc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBNYXJrTGFiZWwgZnJvbSAnLi4vLi4vLi4vbWFyay1sYWJlbCc7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvaXNFbXB0eSc7XG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ0BwaWUtbGliL3JlbmRlci11aSc7XG5pbXBvcnQgeyBnZXRNaWRkbGVPZlR3b1BvaW50cywgZXF1YWxQb2ludHMsIHNhbWVBeGVzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuXG5jb25zdCBTdHlsZWRMaW5lR3JvdXAgPSBzdHlsZWQoJ2cnKSgoeyBkaXNhYmxlZCwgY29ycmVjdG5lc3MgfSkgPT4gKHtcbiAgJyYgbGluZSc6IHtcbiAgICBmaWxsOiAndHJhbnNwYXJlbnQnLFxuICAgIHN0cm9rZTogY29sb3IuZGVmYXVsdHMuQkxBQ0ssXG4gICAgc3Ryb2tlV2lkdGg6IDMsXG4gICAgdHJhbnNpdGlvbjogJ3N0cm9rZSAyMDBtcyBlYXNlLWluLCBzdHJva2Utd2lkdGggMjAwbXMgZWFzZS1pbicsXG4gICAgJyY6aG92ZXInOiB7XG4gICAgICBzdHJva2VXaWR0aDogNixcbiAgICAgIHN0cm9rZTogY29sb3IuZGVmYXVsdHMuUFJJTUFSWV9EQVJLLFxuICAgIH0sXG4gIH0sXG4gIC4uLihkaXNhYmxlZCAmJiB7XG4gICAgJyYgbGluZSc6IHtcbiAgICAgIC4uLmRpc2FibGVkU2Vjb25kYXJ5KCdzdHJva2UnKSxcbiAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgIH0sXG4gIH0pLFxuICAuLi4oY29ycmVjdG5lc3MgPT09ICdjb3JyZWN0JyAmJiB7XG4gICAgJyYgbGluZSc6IHtcbiAgICAgIC4uLmNvcnJlY3QoJ3N0cm9rZScpLFxuICAgIH0sXG4gIH0pLFxuICAuLi4oY29ycmVjdG5lc3MgPT09ICdpbmNvcnJlY3QnICYmIHtcbiAgICAnJiBsaW5lJzoge1xuICAgICAgLi4uaW5jb3JyZWN0KCdzdHJva2UnKSxcbiAgICB9LFxuICB9KSxcbiAgLi4uKGNvcnJlY3RuZXNzID09PSAnbWlzc2luZycgJiYge1xuICAgICcmIGxpbmUnOiB7XG4gICAgICAuLi5taXNzaW5nKCdzdHJva2UnKSxcbiAgICAgIHN0cm9rZVdpZHRoOiAxLFxuICAgICAgc3Ryb2tlRGFzaGFycmF5OiAnNCAzJyxcbiAgICB9LFxuICB9KSxcbn0pKTtcblxuZXhwb3J0IGNvbnN0IGxpbmVUb29sID0gKHR5cGUsIENvbXBvbmVudCkgPT4gKCkgPT4gKHtcbiAgdHlwZSxcbiAgQ29tcG9uZW50LFxuICBhZGRQb2ludDogKHBvaW50LCBtYXJrKSA9PiB7XG4gICAgaWYgKG1hcmsgJiYgZXF1YWxQb2ludHMobWFyay5yb290LCBwb2ludCkpIHtcbiAgICAgIHJldHVybiBtYXJrO1xuICAgIH1cblxuICAgIGlmICghbWFyaykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYnVpbGRpbmc6IHRydWUsXG4gICAgICAgIGZyb206IHBvaW50LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZXF1YWxQb2ludHMocG9pbnQsIG1hcmsuZnJvbSkpIHtcbiAgICAgIHJldHVybiB7IC4uLm1hcmsgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyAuLi5tYXJrLCBidWlsZGluZzogZmFsc2UsIHRvOiBwb2ludCB9O1xuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBsaW5lVG9vbENvbXBvbmVudCA9IChDb21wb25lbnQpID0+IHtcbiAgcmV0dXJuIGNsYXNzIExpbmVUb29sQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgLi4udHlwZXMuVG9vbFByb3BUeXBlRmllbGRzLFxuICAgICAgZ3JhcGhQcm9wczogdHlwZXMuR3JhcGhQcm9wc1R5cGUuaXNSZXF1aXJlZCxcbiAgICAgIGxpbWl0TGFiZWxpbmc6IFByb3BUeXBlcy5ib29sLFxuICAgICAgY2hhbmdlTWFya1Byb3BzOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGZyb206IHR5cGVzLlBvaW50VHlwZSxcbiAgICAgIHRvOiB0eXBlcy5Qb2ludFR5cGUsXG4gICAgICBsYWJlbE1vZGVFbmFibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgdGhpcy5zdGF0ZSA9IHt9O1xuICAgIH1cblxuICAgIHN0YXJ0RHJhZyA9ICgpID0+IHRoaXMuc2V0U3RhdGUoeyBtYXJrOiB7IC4uLnRoaXMucHJvcHMubWFyayB9IH0pO1xuXG4gICAgc3RvcERyYWcgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IG9uQ2hhbmdlLCBtYXJrIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgdXBkYXRlID0geyAuLi50aGlzLnN0YXRlLm1hcmsgfTtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7IG1hcms6IHVuZGVmaW5lZCB9LCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSB9ID0gdXBkYXRlO1xuICAgICAgICBsZXQgc2hvdWxkTm90Q2hhbmdlID1cbiAgICAgICAgICB0eXBlICYmXG4gICAgICAgICAgKHR5cGUgPT09ICdwYXJhYm9sYScgfHwgdHlwZSA9PT0gJ3NpbmUnIHx8IHR5cGUgPT09ICdhYnNvbHV0ZScgfHwgdHlwZSA9PT0gJ2V4cG9uZW50aWFsJykgJiZcbiAgICAgICAgICBzYW1lQXhlcyh1cGRhdGUuZnJvbSwgdXBkYXRlLnRvKTtcbiAgICAgICAgaWYgKCFzaG91bGROb3RDaGFuZ2UgJiYgdHlwZSAmJiB0eXBlID09PSAnZXhwb25lbnRpYWwnICYmIHVwZGF0ZS5mcm9tICYmIHVwZGF0ZS50bykge1xuICAgICAgICAgIHNob3VsZE5vdENoYW5nZSA9IHVwZGF0ZS5mcm9tLnkgPT09IDAgfHwgdXBkYXRlLnRvLnkgPT09IDAgfHwgdXBkYXRlLmZyb20ueSAqIHVwZGF0ZS50by55IDwgMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwobWFyaywgdXBkYXRlKSAmJiAhc2hvdWxkTm90Q2hhbmdlKSB7XG4gICAgICAgICAgb25DaGFuZ2UobWFyaywgdXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNoYW5nZU1hcmsgPSAoeyBmcm9tLCB0bywgbWlkZGxlIH0pID0+IHtcbiAgICAgIGxldCBtYXJrID0geyAuLi50aGlzLnN0YXRlLm1hcmssIGZyb20sIHRvIH07XG5cbiAgICAgIGlmIChtaWRkbGUpIHtcbiAgICAgICAgbWFyayA9IHsgLi4ubWFyaywgbWlkZGxlIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBtYXJrIH0pO1xuICAgIH07XG5cbiAgICBjaGFuZ2VNYXJrUHJvcHMgPSAoeyBmcm9tLCB0bywgbWlkZGxlIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgb25DaGFuZ2UsIG1hcmsgfSA9IHRoaXMucHJvcHM7XG4gICAgICBsZXQgdXBkYXRlID0geyAuLi5tYXJrLCAuLi50aGlzLnN0YXRlLm1hcmsgfTtcblxuICAgICAgaWYgKGZyb20pIHtcbiAgICAgICAgdXBkYXRlID0geyAuLi51cGRhdGUsIGZyb20gfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRvKSB7XG4gICAgICAgIHVwZGF0ZSA9IHsgLi4udXBkYXRlLCB0byB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobWlkZGxlKSB7XG4gICAgICAgIHVwZGF0ZSA9IHsgLi4udXBkYXRlLCBtaWRkbGUgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0VxdWFsKG1hcmssIHVwZGF0ZSkpIHtcbiAgICAgICAgb25DaGFuZ2UobWFyaywgdXBkYXRlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3QgeyBncmFwaFByb3BzLCBvbkNsaWNrLCBsYWJlbE5vZGUsIGxhYmVsTW9kZUVuYWJsZWQsIGNvb3JkaW5hdGVzT25Ib3ZlciwgbGltaXRMYWJlbGluZyB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IG1hcmsgPSB0aGlzLnN0YXRlLm1hcmsgPyB0aGlzLnN0YXRlLm1hcmsgOiB0aGlzLnByb3BzLm1hcms7XG5cbiAgICAgIGNvbnN0IGZyb20gPSBjbG9uZURlZXAobWFyay5mcm9tKTtcbiAgICAgIGNvbnN0IHRvID0gY2xvbmVEZWVwKG1hcmsudG8pO1xuICAgICAgY29uc3QgbWlkZGxlID0gY2xvbmVEZWVwKG1hcmsubWlkZGxlKTtcblxuICAgICAgLy8gU0VUIERJU0FCTEVEXG4gICAgICAvLyBpZiBpdCdzIGEgYmFja2dyb3VuZCBtYXJrLCB3ZSBuZWVkIHRvIGZvcmNlIGRpc2FibGUgaXRcbiAgICAgIGlmIChmcm9tICYmIG1hcmsuaXNCYWNrZ3JvdW5kKSB7XG4gICAgICAgIGZyb20uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodG8gJiYgbWFyay5pc0JhY2tncm91bmQpIHtcbiAgICAgICAgdG8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobWlkZGxlICYmIG1hcmsuaXNCYWNrZ3JvdW5kKSB7XG4gICAgICAgIG1pZGRsZS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxDb21wb25lbnRcbiAgICAgICAgICBkaXNhYmxlZD17bWFyay5kaXNhYmxlZH1cbiAgICAgICAgICBjb29yZGluYXRlc09uSG92ZXI9e2Nvb3JkaW5hdGVzT25Ib3Zlcn1cbiAgICAgICAgICBjb3JyZWN0bmVzcz17bWFyay5jb3JyZWN0bmVzc31cbiAgICAgICAgICBmcm9tPXtmcm9tfVxuICAgICAgICAgIHRvPXt0b31cbiAgICAgICAgICBtaWRkbGU9e21pZGRsZX1cbiAgICAgICAgICBncmFwaFByb3BzPXtncmFwaFByb3BzfVxuICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmNoYW5nZU1hcmt9XG4gICAgICAgICAgY2hhbmdlTWFya1Byb3BzPXt0aGlzLmNoYW5nZU1hcmtQcm9wc31cbiAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgICAgIG9uRHJhZ1N0YXJ0PXt0aGlzLnN0YXJ0RHJhZ31cbiAgICAgICAgICBvbkRyYWdTdG9wPXt0aGlzLnN0b3BEcmFnfVxuICAgICAgICAgIGxhYmVsTm9kZT17bGFiZWxOb2RlfVxuICAgICAgICAgIGxhYmVsTW9kZUVuYWJsZWQ9e2xhYmVsTW9kZUVuYWJsZWR9XG4gICAgICAgICAgbGltaXRMYWJlbGluZz17bGltaXRMYWJlbGluZ31cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgZHJhZ09wdHMgPSAoKSA9PiAoe1xuICBib3VuZHM6IChwcm9wcywgeyBkb21haW4sIHJhbmdlIH0pID0+IHtcbiAgICBjb25zdCBhcmVhID0gdXRpbHMubGluZVRvQXJlYShwcm9wcy5mcm9tLCBwcm9wcy50byk7XG4gICAgcmV0dXJuIHV0aWxzLmJvdW5kcyhhcmVhLCBkb21haW4sIHJhbmdlKTtcbiAgfSxcbiAgYW5jaG9yUG9pbnQ6IChwcm9wcykgPT4ge1xuICAgIGNvbnN0IHsgZnJvbSB9ID0gcHJvcHM7XG4gICAgcmV0dXJuIGZyb207XG4gIH0sXG4gIGZyb21EZWx0YTogKHByb3BzLCBkZWx0YSkgPT4ge1xuICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9IHByb3BzO1xuICAgIHJldHVybiB7XG4gICAgICBmcm9tOiB1dGlscy5wb2ludChmcm9tKS5hZGQodXRpbHMucG9pbnQoZGVsdGEpKSxcbiAgICAgIHRvOiB1dGlscy5wb2ludCh0bykuYWRkKHV0aWxzLnBvaW50KGRlbHRhKSksXG4gICAgfTtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgbGluZUJhc2UgPSAoQ29tcCwgb3B0cykgPT4ge1xuICBjb25zdCBEcmFnZ2FibGVDb21wID0gZ3JpZERyYWdnYWJsZShkcmFnT3B0cygpKShDb21wKTtcblxuICBjb25zdCBGcm9tUG9pbnQgPSBvcHRzICYmIG9wdHMuZnJvbSA/IG9wdHMuZnJvbSA6IEJhc2VQb2ludDtcbiAgY29uc3QgVG9Qb2ludCA9IG9wdHMgJiYgb3B0cy50byA/IG9wdHMudG8gOiBCYXNlUG9pbnQ7XG5cbiAgY2xhc3MgTGluZUJhc2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICBjb29yZGluYXRlc09uSG92ZXI6IFByb3BUeXBlcy5ib29sLFxuICAgICAgZ3JhcGhQcm9wczogdHlwZXMuR3JhcGhQcm9wc1R5cGUsXG4gICAgICBmcm9tOiB0eXBlcy5Qb2ludFR5cGUsXG4gICAgICB0bzogdHlwZXMuUG9pbnRUeXBlLFxuICAgICAgbWlkZGxlOiB0eXBlcy5Qb2ludFR5cGUsXG4gICAgICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBvbkRyYWdTdGFydDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBvbkRyYWdTdG9wOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgY29ycmVjdG5lc3M6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgICBsaW1pdExhYmVsaW5nOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGNoYW5nZU1hcmtQcm9wczogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBsYWJlbE1vZGVFbmFibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGxhYmVsTm9kZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICB9O1xuXG4gICAgb25DaGFuZ2VQb2ludCA9IChwb2ludCkgPT4ge1xuICAgICAgY29uc3QgeyBtaWRkbGUsIG9uQ2hhbmdlIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgeyBmcm9tLCB0byB9ID0gcG9pbnQ7XG5cbiAgICAgIC8vIGJlY2F1c2UgcG9pbnQuZnJvbS5sYWJlbCBhbmQgcG9pbnQudG8ubGFiZWwgY2FuIGJlIGRpZmZlcmVudFxuICAgICAgaWYgKCFlcXVhbFBvaW50cyhmcm9tLCB0bykpIHtcbiAgICAgICAgaWYgKG1pZGRsZSkge1xuICAgICAgICAgIHBvaW50Lm1pZGRsZSA9IHsgLi4ubWlkZGxlLCAuLi5nZXRNaWRkbGVPZlR3b1BvaW50cyhmcm9tLCB0bykgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9uQ2hhbmdlKHBvaW50KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZHJhZ0NvbXAgPSAoeyBmcm9tOiBkcmFnZ2VkRnJvbSwgdG86IGRyYWdnZWRUbyB9KSA9PiB7XG4gICAgICBjb25zdCB7IGZyb20sIHRvLCBvbkNoYW5nZSwgbWlkZGxlIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICBpZiAoZnJvbS5sYWJlbCkge1xuICAgICAgICBkcmFnZ2VkRnJvbS5sYWJlbCA9IGZyb20ubGFiZWw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0by5sYWJlbCkge1xuICAgICAgICBkcmFnZ2VkVG8ubGFiZWwgPSB0by5sYWJlbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgZnJvbTogZHJhZ2dlZEZyb20sIHRvOiBkcmFnZ2VkVG8gfTtcblxuICAgICAgaWYgKG1pZGRsZSkge1xuICAgICAgICB1cGRhdGVkLm1pZGRsZSA9IHsgLi4ubWlkZGxlLCAuLi5nZXRNaWRkbGVPZlR3b1BvaW50cyhkcmFnZ2VkRnJvbSwgZHJhZ2dlZFRvKSB9O1xuICAgICAgfVxuXG4gICAgICBvbkNoYW5nZSh1cGRhdGVkKTtcbiAgICB9O1xuXG4gICAgZHJhZ0Zyb20gPSAoZHJhZ2dlZEZyb20pID0+IHtcbiAgICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIGlmIChmcm9tLmxhYmVsKSB7XG4gICAgICAgIGRyYWdnZWRGcm9tLmxhYmVsID0gZnJvbS5sYWJlbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcXVhbFBvaW50cyhkcmFnZ2VkRnJvbSwgdG8pKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VQb2ludCh7IGZyb206IGRyYWdnZWRGcm9tLCB0bzogdG8gfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRyYWdUbyA9IChkcmFnZ2VkVG8pID0+IHtcbiAgICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIGlmICh0by5sYWJlbCkge1xuICAgICAgICBkcmFnZ2VkVG8ubGFiZWwgPSB0by5sYWJlbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcXVhbFBvaW50cyhmcm9tLCBkcmFnZ2VkVG8pKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VQb2ludCh7IGZyb206IGZyb20sIHRvOiBkcmFnZ2VkVG8gfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxhYmVsQ2hhbmdlID0gKHBvaW50LCB0eXBlKSA9PiB7XG4gICAgICBjb25zdCB7IGNoYW5nZU1hcmtQcm9wcyB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHsgLi4ucG9pbnQgfTtcblxuICAgICAgaWYgKCFwb2ludC5sYWJlbCB8fCBpc0VtcHR5KHBvaW50LmxhYmVsKSkge1xuICAgICAgICBkZWxldGUgdXBkYXRlLmxhYmVsO1xuICAgICAgfVxuXG4gICAgICBjaGFuZ2VNYXJrUHJvcHMoeyBbdHlwZV06IHVwZGF0ZSB9KTtcbiAgICB9O1xuXG4gICAgY2xpY2tQb2ludCA9IChwb2ludCwgdHlwZSwgZGF0YSkgPT4ge1xuICAgICAgY29uc3QgeyBjaGFuZ2VNYXJrUHJvcHMsIGRpc2FibGVkLCBmcm9tLCB0bywgbGFiZWxNb2RlRW5hYmxlZCwgbGltaXRMYWJlbGluZywgb25DbGljayB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgaWYgKCFsYWJlbE1vZGVFbmFibGVkKSB7XG4gICAgICAgIG9uQ2xpY2socG9pbnQgfHwgZGF0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gbGltaXQgbGFiZWxpbmcgdGhlIHBvaW50cyBvZiB0aGUgbGluZVxuICAgICAgaWYgKGxpbWl0TGFiZWxpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ21pZGRsZScgJiYgIXBvaW50ICYmIGZyb20gJiYgdG8pIHtcbiAgICAgICAgcG9pbnQgPSB7IC4uLnBvaW50LCAuLi5nZXRNaWRkbGVPZlR3b1BvaW50cyhmcm9tLCB0bykgfTtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlTWFya1Byb3BzKHsgZnJvbSwgdG8sIFt0eXBlXTogeyBsYWJlbDogJycsIC4uLnBvaW50IH0gfSk7XG5cbiAgICAgIGlmICh0aGlzLmlucHV0W3R5cGVdKSB7XG4gICAgICAgIHRoaXMuaW5wdXRbdHlwZV0uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSU1QT1JUQU5ULCBkbyBub3QgcmVtb3ZlXG4gICAgaW5wdXQgPSB7fTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY29vcmRpbmF0ZXNPbkhvdmVyLFxuICAgICAgICBncmFwaFByb3BzLFxuICAgICAgICBvbkRyYWdTdGFydCxcbiAgICAgICAgb25EcmFnU3RvcCxcbiAgICAgICAgZnJvbSxcbiAgICAgICAgdG8sXG4gICAgICAgIG1pZGRsZSxcbiAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgIGNvcnJlY3RuZXNzLFxuICAgICAgICBvbkNsaWNrLFxuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIGxhYmVsTW9kZUVuYWJsZWQsXG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IGNvbW1vbiA9IHsgZ3JhcGhQcm9wcywgb25EcmFnU3RhcnQsIG9uRHJhZ1N0b3AsIGRpc2FibGVkLCBjb3JyZWN0bmVzcywgb25DbGljayB9O1xuICAgICAgY29uc3QgYW5nbGUgPSB0byA/IHRyaWcudG9EZWdyZWVzKHRyaWcuYW5nbGUoZnJvbSwgdG8pKSA6IDA7XG5cbiAgICAgIGxldCBmcm9tTGFiZWxOb2RlID0gbnVsbDtcbiAgICAgIGxldCB0b0xhYmVsTm9kZSA9IG51bGw7XG4gICAgICBsZXQgbGluZUxhYmVsTm9kZSA9IG51bGw7XG5cbiAgICAgIGlmIChsYWJlbE5vZGUpIHtcbiAgICAgICAgaWYgKGZyb20gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sICdsYWJlbCcpKSB7XG4gICAgICAgICAgZnJvbUxhYmVsTm9kZSA9IFJlYWN0RE9NLmNyZWF0ZVBvcnRhbChcbiAgICAgICAgICAgIDxNYXJrTGFiZWxcbiAgICAgICAgICAgICAgaW5wdXRSZWY9eyhyKSA9PiAodGhpcy5pbnB1dC5mcm9tID0gcil9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXshbGFiZWxNb2RlRW5hYmxlZH1cbiAgICAgICAgICAgICAgbWFyaz17ZnJvbX1cbiAgICAgICAgICAgICAgZ3JhcGhQcm9wcz17Z3JhcGhQcm9wc31cbiAgICAgICAgICAgICAgb25DaGFuZ2U9eyhsYWJlbCkgPT4gdGhpcy5sYWJlbENoYW5nZSh7IC4uLmZyb20sIGxhYmVsIH0sICdmcm9tJyl9XG4gICAgICAgICAgICAvPixcbiAgICAgICAgICAgIGxhYmVsTm9kZSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRvICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0bywgJ2xhYmVsJykpIHtcbiAgICAgICAgICB0b0xhYmVsTm9kZSA9IFJlYWN0RE9NLmNyZWF0ZVBvcnRhbChcbiAgICAgICAgICAgIDxNYXJrTGFiZWxcbiAgICAgICAgICAgICAgaW5wdXRSZWY9eyhyKSA9PiAodGhpcy5pbnB1dC50byA9IHIpfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17IWxhYmVsTW9kZUVuYWJsZWR9XG4gICAgICAgICAgICAgIG1hcms9e3RvfVxuICAgICAgICAgICAgICBncmFwaFByb3BzPXtncmFwaFByb3BzfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17KGxhYmVsKSA9PiB0aGlzLmxhYmVsQ2hhbmdlKHsgLi4udG8sIGxhYmVsIH0sICd0bycpfVxuICAgICAgICAgICAgLz4sXG4gICAgICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtaWRkbGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1pZGRsZSwgJ2xhYmVsJykpIHtcbiAgICAgICAgICBsaW5lTGFiZWxOb2RlID0gUmVhY3RET00uY3JlYXRlUG9ydGFsKFxuICAgICAgICAgICAgPE1hcmtMYWJlbFxuICAgICAgICAgICAgICBpbnB1dFJlZj17KHIpID0+ICh0aGlzLmlucHV0Lm1pZGRsZSA9IHIpfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17IWxhYmVsTW9kZUVuYWJsZWR9XG4gICAgICAgICAgICAgIG1hcms9e21pZGRsZX1cbiAgICAgICAgICAgICAgZ3JhcGhQcm9wcz17Z3JhcGhQcm9wc31cbiAgICAgICAgICAgICAgb25DaGFuZ2U9eyhsYWJlbCkgPT4gdGhpcy5sYWJlbENoYW5nZSh7IC4uLm1pZGRsZSwgbGFiZWwgfSwgJ21pZGRsZScpfVxuICAgICAgICAgICAgLz4sXG4gICAgICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U3R5bGVkTGluZUdyb3VwIGRpc2FibGVkPXtkaXNhYmxlZH0gY29ycmVjdG5lc3M9e2NvcnJlY3RuZXNzfT5cbiAgICAgICAgICB7dG8gJiYgKFxuICAgICAgICAgICAgPERyYWdnYWJsZUNvbXBcbiAgICAgICAgICAgICAgZnJvbT17ZnJvbX1cbiAgICAgICAgICAgICAgdG89e3RvfVxuICAgICAgICAgICAgICBtaWRkbGU9e21pZGRsZX1cbiAgICAgICAgICAgICAgb25EcmFnPXt0aGlzLmRyYWdDb21wfVxuICAgICAgICAgICAgICB7Li4uY29tbW9ufVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZGF0YSkgPT4gdGhpcy5jbGlja1BvaW50KG1pZGRsZSwgJ21pZGRsZScsIGRhdGEpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtsaW5lTGFiZWxOb2RlfVxuXG4gICAgICAgICAgPEZyb21Qb2ludFxuICAgICAgICAgICAgeD17ZnJvbS54fVxuICAgICAgICAgICAgeT17ZnJvbS55fVxuICAgICAgICAgICAgbGFiZWxOb2RlPXtsYWJlbE5vZGV9XG4gICAgICAgICAgICBjb29yZGluYXRlc09uSG92ZXI9e2Nvb3JkaW5hdGVzT25Ib3Zlcn1cbiAgICAgICAgICAgIG9uRHJhZz17dGhpcy5kcmFnRnJvbX1cbiAgICAgICAgICAgIHsuLi5jb21tb259XG4gICAgICAgICAgICBvbkNsaWNrPXsoZGF0YSkgPT4gdGhpcy5jbGlja1BvaW50KGZyb20sICdmcm9tJywgZGF0YSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7ZnJvbUxhYmVsTm9kZX1cblxuICAgICAgICAgIHt0byAmJiAoXG4gICAgICAgICAgICA8VG9Qb2ludFxuICAgICAgICAgICAgICB4PXt0by54fVxuICAgICAgICAgICAgICB5PXt0by55fVxuICAgICAgICAgICAgICBhbmdsZT17YW5nbGV9IC8vYW5nbGUgKyA0NX1cbiAgICAgICAgICAgICAgbGFiZWxOb2RlPXtsYWJlbE5vZGV9XG4gICAgICAgICAgICAgIGNvb3JkaW5hdGVzT25Ib3Zlcj17Y29vcmRpbmF0ZXNPbkhvdmVyfVxuICAgICAgICAgICAgICBvbkRyYWc9e3RoaXMuZHJhZ1RvfVxuICAgICAgICAgICAgICB7Li4uY29tbW9ufVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZGF0YSkgPT4gdGhpcy5jbGlja1BvaW50KHRvLCAndG8nLCBkYXRhKX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7dG9MYWJlbE5vZGV9XG4gICAgICAgIDwvU3R5bGVkTGluZUdyb3VwPlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gTGluZUJhc2U7XG59O1xuXG5leHBvcnQgY29uc3Qgc3R5bGVzID0ge1xuICBsaW5lOiAoKSA9PiAoe1xuICAgIGZpbGw6ICd0cmFuc3BhcmVudCcsXG4gICAgc3Ryb2tlOiBjb2xvci5kZWZhdWx0cy5CTEFDSyxcbiAgICBzdHJva2VXaWR0aDogMyxcbiAgICB0cmFuc2l0aW9uOiAnc3Ryb2tlIDIwMG1zIGVhc2UtaW4sIHN0cm9rZS13aWR0aCAyMDBtcyBlYXNlLWluJyxcbiAgICAnJjpob3Zlcic6IHtcbiAgICAgIHN0cm9rZVdpZHRoOiA2LFxuICAgICAgc3Ryb2tlOiBjb2xvci5kZWZhdWx0cy5QUklNQVJZX0RBUkssXG4gICAgfSxcbiAgfSksXG4gIGFycm93OiAoKSA9PiAoe1xuICAgIGZpbGw6IGNvbG9yLmRlZmF1bHRzLkJMQUNLLFxuICB9KSxcbiAgZGlzYWJsZWRBcnJvdzogKCkgPT4gKHtcbiAgICAuLi5kaXNhYmxlZFNlY29uZGFyeSgpLFxuICB9KSxcbiAgZGlzYWJsZWRTZWNvbmRhcnk6ICgpID0+ICh7XG4gICAgLi4uZGlzYWJsZWRTZWNvbmRhcnkoJ3N0cm9rZScpLFxuICAgIHN0cm9rZVdpZHRoOiAyLFxuICB9KSxcbiAgZGlzYWJsZWQ6ICgpID0+ICh7XG4gICAgLi4uZGlzYWJsZWQoJ3N0cm9rZScpLFxuICAgIHN0cm9rZVdpZHRoOiAyLFxuICB9KSxcbiAgY29ycmVjdDogKHRoZW1lLCBrZXkpID0+ICh7XG4gICAgLi4uY29ycmVjdChrZXkpLFxuICB9KSxcbiAgaW5jb3JyZWN0OiAodGhlbWUsIGtleSkgPT4gKHtcbiAgICAuLi5pbmNvcnJlY3Qoa2V5KSxcbiAgfSksXG4gIG1pc3Npbmc6ICh0aGVtZSwga2V5KSA9PiAoe1xuICAgIC4uLm1pc3Npbmcoa2V5KSxcbiAgICBzdHJva2VXaWR0aDogMSxcbiAgICBzdHJva2VEYXNoYXJyYXk6ICc0IDMnLFxuICB9KSxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsVUFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksS0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sT0FBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sU0FBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsVUFBQSxHQUFBVCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVMsUUFBQSxHQUFBVixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVUsU0FBQSxHQUFBVixPQUFBO0FBQ0EsSUFBQVcsTUFBQSxHQUFBWCxPQUFBO0FBQ0EsSUFBQVksUUFBQSxHQUFBWixPQUFBO0FBQThDLFNBQUFhLFdBQUFDLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFdBQUFELENBQUEsT0FBQUUsZ0JBQUEsYUFBQUYsQ0FBQSxPQUFBRywyQkFBQSxhQUFBSixDQUFBLEVBQUFLLHlCQUFBLEtBQUFDLE9BQUEsQ0FBQUMsU0FBQSxDQUFBTixDQUFBLEVBQUFDLENBQUEsWUFBQUMsZ0JBQUEsYUFBQUgsQ0FBQSxFQUFBUSxXQUFBLElBQUFQLENBQUEsQ0FBQVEsS0FBQSxDQUFBVCxDQUFBLEVBQUFFLENBQUE7QUFBQSxTQUFBRyww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
|