@pie-lib/rubric 1.0.0-beta.5 → 1.1.0-next.0

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/lib/authoring.js CHANGED
@@ -8,38 +8,37 @@ exports["default"] = exports.RubricType = exports.RawAuthoring = exports.PointCo
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
10
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
12
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
13
11
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
14
12
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
13
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15
14
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
15
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
17
16
  var _react = _interopRequireDefault(require("react"));
18
17
  var _propTypes = _interopRequireDefault(require("prop-types"));
19
- var _styles = require("@material-ui/core/styles");
20
- var _classnames = _interopRequireDefault(require("classnames"));
21
- var _OutlinedInput = _interopRequireDefault(require("@material-ui/core/OutlinedInput"));
22
- var _InputLabel = _interopRequireDefault(require("@material-ui/core/InputLabel"));
23
- var _Select = _interopRequireDefault(require("@material-ui/core/Select"));
24
- var _FormControl = _interopRequireDefault(require("@material-ui/core/FormControl"));
25
- var _MenuItem = _interopRequireDefault(require("@material-ui/core/MenuItem"));
18
+ var _styles = require("@mui/material/styles");
19
+ var _InputLabel = _interopRequireDefault(require("@mui/material/InputLabel"));
20
+ var _OutlinedInput = _interopRequireDefault(require("@mui/material/OutlinedInput"));
21
+ var _Select = _interopRequireDefault(require("@mui/material/Select"));
22
+ var _FormControl = _interopRequireDefault(require("@mui/material/FormControl"));
23
+ var _MenuItem = _interopRequireDefault(require("@mui/material/MenuItem"));
26
24
  var _times = _interopRequireDefault(require("lodash/times"));
27
- var _Checkbox = _interopRequireDefault(require("@material-ui/core/Checkbox"));
28
- var _FormGroup = _interopRequireDefault(require("@material-ui/core/FormGroup"));
29
- var _FormControlLabel = _interopRequireDefault(require("@material-ui/core/FormControlLabel"));
30
- var _grey = _interopRequireDefault(require("@material-ui/core/colors/grey"));
31
- var _Typography = _interopRequireDefault(require("@material-ui/core/Typography"));
32
- var _DragIndicator = _interopRequireDefault(require("@material-ui/icons/DragIndicator"));
33
- var _editableHtml = _interopRequireDefault(require("@pie-lib/editable-html"));
34
- var _reactBeautifulDnd = require("react-beautiful-dnd");
25
+ var _Checkbox = _interopRequireDefault(require("@mui/material/Checkbox"));
26
+ var _FormGroup = _interopRequireDefault(require("@mui/material/FormGroup"));
27
+ var _FormControlLabel = _interopRequireDefault(require("@mui/material/FormControlLabel"));
28
+ var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
29
+ var _DragIndicator = _interopRequireDefault(require("@mui/icons-material/DragIndicator"));
30
+ var _dnd = require("@hello-pangea/dnd");
35
31
  var _debug = _interopRequireDefault(require("debug"));
36
32
  var _takeRight = _interopRequireDefault(require("lodash/takeRight"));
37
33
  var _pointMenu = _interopRequireDefault(require("./point-menu"));
38
34
  var _range = _interopRequireDefault(require("lodash/range"));
39
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
40
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
41
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
42
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
35
+ var _editableHtmlTipTap = _interopRequireDefault(require("@pie-lib/editable-html-tip-tap"));
36
+ var _configUi = require("@pie-lib/config-ui");
37
+ var _colors = require("@mui/material/colors");
38
+ 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; }
39
+ 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; }
40
+ 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)); }
41
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
43
42
  var log = (0, _debug["default"])('pie-lib:rubric:authoring');
44
43
  var reorder = function reorder(list, startIndex, endIndex) {
45
44
  var result = Array.from(list);
@@ -49,134 +48,187 @@ var reorder = function reorder(list, startIndex, endIndex) {
49
48
  result.splice(endIndex, 0, removed);
50
49
  return result;
51
50
  };
52
- var RubricType = _propTypes["default"].shape({
51
+ var RubricType = exports.RubricType = _propTypes["default"].shape({
53
52
  excludeZero: _propTypes["default"].bool,
54
53
  points: _propTypes["default"].arrayOf(_propTypes["default"].string),
55
54
  sampleAnswers: _propTypes["default"].arrayOf(_propTypes["default"].string),
56
- maxPoints: _propTypes["default"].number
55
+ maxPoints: _propTypes["default"].number,
56
+ rubriclessInstruction: _propTypes["default"].string
57
57
  });
58
- exports.RubricType = RubricType;
59
- var MaxPoints = (0, _styles.withStyles)(function (theme) {
60
- return {
61
- formControl: {
62
- minWidth: '120px',
63
- margin: theme.spacing.unit
64
- }
65
- };
66
- })(function (props) {
58
+ var MaxPoints = function MaxPoints(props) {
67
59
  var value = props.value,
68
60
  _onChange = props.onChange,
69
- max = props.max,
70
- classes = props.classes;
61
+ max = props.max;
62
+ var labelId = 'max-points-label';
71
63
  return /*#__PURE__*/_react["default"].createElement(_FormControl["default"], {
72
- className: classes.formControl,
64
+ sx: {
65
+ minWidth: 120,
66
+ m: 1
67
+ },
73
68
  variant: "outlined"
74
69
  }, /*#__PURE__*/_react["default"].createElement(_InputLabel["default"], {
75
- width: 100,
76
- htmlFor: "..."
70
+ id: labelId
77
71
  }, "Max Points"), /*#__PURE__*/_react["default"].createElement(_Select["default"], {
72
+ labelId: labelId,
73
+ label: "Max Points",
78
74
  value: value,
79
75
  onChange: function onChange(e) {
80
76
  return _onChange(e.target.value);
81
77
  },
82
78
  input: /*#__PURE__*/_react["default"].createElement(_OutlinedInput["default"], {
83
- labelWidth: 80
84
- })
85
- }, (0, _range["default"])(1, max).map(function (v) {
79
+ label: "Max Points"
80
+ }),
81
+ MenuProps: {
82
+ transitionDuration: {
83
+ enter: 225,
84
+ exit: 195
85
+ }
86
+ }
87
+ }, (0, _range["default"])(1, max + 1).map(function (v) {
86
88
  return /*#__PURE__*/_react["default"].createElement(_MenuItem["default"], {
87
89
  key: "".concat(v),
88
90
  value: v
89
91
  }, v);
90
92
  })));
91
- });
93
+ };
92
94
 
93
95
  // if the value is null or 'null', the Sample Answer input field for that point will not be dispalyed
94
96
  // if the value is '', the Sample Answer input field will be empty
95
97
  var checkSampleAnswer = function checkSampleAnswer(sampleAnswer) {
96
98
  return sampleAnswer === null || sampleAnswer === 'null';
97
99
  };
98
- var PointConfig = (0, _styles.withStyles)(function (theme) {
100
+ var Row = (0, _styles.styled)('div')(function () {
99
101
  return {
100
- pointConfig: {},
101
- row: {
102
- display: 'flex',
103
- width: '100%',
104
- position: 'relative'
105
- },
106
- editor: {
107
- width: '100%',
108
- backgroundColor: "".concat(theme.palette.common.white, " !important")
109
- },
110
- dragIndicator: {
111
- paddingTop: theme.spacing.unit,
112
- color: _grey["default"][500]
113
- },
114
- pointsLabel: {
115
- color: _grey["default"][500],
116
- paddingBottom: theme.spacing.unit,
117
- textTransform: 'uppercase'
118
- },
119
- sampleAnswersEditor: {
120
- paddingLeft: theme.spacing.unit * 3
121
- },
122
- pointMenu: {
123
- position: 'absolute',
124
- right: 0
125
- }
102
+ display: 'flex',
103
+ width: '100%',
104
+ position: 'relative'
105
+ };
106
+ });
107
+ var EditorDiv = (0, _styles.styled)('div')(function (_ref) {
108
+ var theme = _ref.theme;
109
+ return {
110
+ width: '100%',
111
+ backgroundColor: "".concat(theme.palette.common.white)
112
+ };
113
+ });
114
+ var DragIndicatorStyled = (0, _styles.styled)(_DragIndicator["default"])(function (_ref2) {
115
+ var theme = _ref2.theme;
116
+ return {
117
+ paddingTop: theme.spacing(1),
118
+ color: _colors.grey[500]
119
+ };
120
+ });
121
+ var PointsLabel = (0, _styles.styled)(_Typography["default"])(function (_ref3) {
122
+ var theme = _ref3.theme;
123
+ return {
124
+ color: _colors.grey[500],
125
+ paddingBottom: theme.spacing(1),
126
+ textTransform: 'uppercase'
127
+ };
128
+ });
129
+ var SampleAnswersEditor = (0, _styles.styled)('div')(function (_ref4) {
130
+ var theme = _ref4.theme;
131
+ return {
132
+ paddingLeft: theme.spacing(3)
133
+ };
134
+ });
135
+ var ErrorText = (0, _styles.styled)('div')(function (_ref5) {
136
+ var theme = _ref5.theme;
137
+ return {
138
+ fontSize: theme.typography.fontSize - 2,
139
+ color: theme.palette.error.main,
140
+ paddingLeft: theme.spacing(3),
141
+ paddingTop: theme.spacing(1)
126
142
  };
127
- })(function (props) {
143
+ });
144
+ var PointMenuWrapper = (0, _styles.styled)('div')(function () {
145
+ return {
146
+ position: 'absolute',
147
+ right: 0
148
+ };
149
+ });
150
+ var PointConfig = exports.PointConfig = function PointConfig(props) {
128
151
  var points = props.points,
129
152
  content = props.content,
130
- classes = props.classes,
131
153
  sampleAnswer = props.sampleAnswer,
132
154
  _props$mathMlOptions = props.mathMlOptions,
133
- mathMlOptions = _props$mathMlOptions === void 0 ? {} : _props$mathMlOptions;
155
+ mathMlOptions = _props$mathMlOptions === void 0 ? {} : _props$mathMlOptions,
156
+ error = props.error,
157
+ _props$pluginOpts = props.pluginOpts,
158
+ pluginOpts = _props$pluginOpts === void 0 ? {} : _props$pluginOpts;
134
159
  var pointsLabel = "".concat(points, " ").concat(points <= 1 ? 'pt' : 'pts');
135
160
  var showSampleAnswer = checkSampleAnswer(sampleAnswer);
136
- return /*#__PURE__*/_react["default"].createElement("div", {
137
- className: classes.pointConfig
138
- }, /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
139
- variant: "overline",
140
- className: classes.pointsLabel
141
- }, pointsLabel), /*#__PURE__*/_react["default"].createElement("div", {
142
- className: classes.row
143
- }, /*#__PURE__*/_react["default"].createElement(_DragIndicator["default"], {
144
- className: classes.dragIndicator
145
- }), /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
146
- className: classes.editor,
161
+ return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(PointsLabel, {
162
+ variant: "overline"
163
+ }, pointsLabel), /*#__PURE__*/_react["default"].createElement(Row, null, /*#__PURE__*/_react["default"].createElement(DragIndicatorStyled, null), /*#__PURE__*/_react["default"].createElement(EditorDiv, null, /*#__PURE__*/_react["default"].createElement(_editableHtmlTipTap["default"], {
164
+ error: error,
165
+ pluginProps: pluginOpts,
147
166
  markup: content,
148
167
  onChange: props.onChange,
149
168
  mathMlOptions: mathMlOptions
150
- }), /*#__PURE__*/_react["default"].createElement(_pointMenu["default"], {
151
- classes: {
152
- icon: classes.pointMenu
153
- },
169
+ })), /*#__PURE__*/_react["default"].createElement(PointMenuWrapper, null, /*#__PURE__*/_react["default"].createElement(_pointMenu["default"], {
154
170
  showSampleAnswer: showSampleAnswer,
155
171
  onChange: props.onMenuChange
156
- })), !showSampleAnswer && /*#__PURE__*/_react["default"].createElement("div", {
157
- className: classes.sampleAnswersEditor
158
- }, /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
159
- variant: "overline",
160
- className: classes.dragIndicator
161
- }, "Sample Response"), /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
162
- className: classes.editor,
172
+ }))), error && /*#__PURE__*/_react["default"].createElement(ErrorText, null, error), !showSampleAnswer && /*#__PURE__*/_react["default"].createElement(SampleAnswersEditor, null, /*#__PURE__*/_react["default"].createElement(DragIndicatorStyled, {
173
+ as: _Typography["default"],
174
+ variant: "overline"
175
+ }, "Sample Response"), /*#__PURE__*/_react["default"].createElement(EditorDiv, null, /*#__PURE__*/_react["default"].createElement(_editableHtmlTipTap["default"], {
163
176
  markup: sampleAnswer,
177
+ pluginProps: pluginOpts,
164
178
  onChange: props.onSampleChange,
165
179
  mathMlOptions: mathMlOptions
166
- })));
180
+ }))));
181
+ };
182
+ var Container = (0, _styles.styled)('div')(function (_ref6) {
183
+ var theme = _ref6.theme;
184
+ return {
185
+ backgroundColor: _colors.grey[200],
186
+ borderWidth: 1,
187
+ borderStyle: 'solid',
188
+ borderColor: _colors.grey[300],
189
+ padding: theme.spacing(2),
190
+ margin: theme.spacing(1)
191
+ };
167
192
  });
168
- exports.PointConfig = PointConfig;
169
- var RawAuthoring = /*#__PURE__*/function (_React$Component) {
170
- (0, _inherits2["default"])(RawAuthoring, _React$Component);
171
- var _super = _createSuper(RawAuthoring);
193
+ var InputContainerWrapper = (0, _styles.styled)('div')(function (_ref7) {
194
+ var theme = _ref7.theme;
195
+ return {
196
+ width: '100%',
197
+ paddingTop: theme.spacing(2),
198
+ marginBottom: theme.spacing(2),
199
+ '& MuiFormControl-root': {
200
+ width: '100%'
201
+ }
202
+ };
203
+ });
204
+ var Rubricless = (0, _styles.styled)('div')(function () {
205
+ return {
206
+ display: 'none'
207
+ };
208
+ });
209
+ var ConfigHolder = (0, _styles.styled)('div')(function (_ref8) {
210
+ var theme = _ref8.theme;
211
+ return {
212
+ paddingTop: theme.spacing(1),
213
+ paddingBottom: theme.spacing(1)
214
+ };
215
+ });
216
+ var RubricTitle = (0, _styles.styled)(_Typography["default"])(function (_ref9) {
217
+ var theme = _ref9.theme;
218
+ return {
219
+ paddingLeft: theme.spacing(1),
220
+ margin: theme.spacing(1)
221
+ };
222
+ });
223
+ var RawAuthoring = exports.RawAuthoring = /*#__PURE__*/function (_React$Component) {
172
224
  function RawAuthoring() {
173
225
  var _this;
174
226
  (0, _classCallCheck2["default"])(this, RawAuthoring);
175
227
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
176
228
  args[_key] = arguments[_key];
177
229
  }
178
- _this = _super.call.apply(_super, [this].concat(args));
179
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "dragEnd", function (result) {
230
+ _this = _callSuper(this, RawAuthoring, [].concat(args));
231
+ (0, _defineProperty2["default"])(_this, "dragEnd", function (result) {
180
232
  if (!result.destination) {
181
233
  return;
182
234
  }
@@ -190,10 +242,19 @@ var RawAuthoring = /*#__PURE__*/function (_React$Component) {
190
242
  sampleAnswers: sampleAnswers
191
243
  }));
192
244
  });
193
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeMaxPoints", function (maxPoints) {
245
+ (0, _defineProperty2["default"])(_this, "changeRubriclessInstruction", function (input) {
194
246
  var _this$props2 = _this.props,
195
247
  value = _this$props2.value,
196
248
  onChange = _this$props2.onChange;
249
+ onChange(_objectSpread(_objectSpread({}, value), {}, {
250
+ rubriclessInstruction: input
251
+ }));
252
+ });
253
+ (0, _defineProperty2["default"])(_this, "changeMaxPoints", function (maxPoints) {
254
+ var _this$props3 = _this.props,
255
+ value = _this$props3.value,
256
+ onChange = _this$props3.onChange,
257
+ rubricless = _this$props3.rubricless;
197
258
  var currentMax = value.points.length - 1;
198
259
  log('current', currentMax, 'new: ', maxPoints);
199
260
  var points, sampleAnswers;
@@ -210,36 +271,41 @@ var RawAuthoring = /*#__PURE__*/function (_React$Component) {
210
271
  points = (0, _takeRight["default"])(value.points, maxPoints + 1);
211
272
  sampleAnswers = (0, _takeRight["default"])(value.sampleAnswers, maxPoints + 1);
212
273
  }
213
- if (points) {
274
+ if (points && !rubricless) {
214
275
  onChange(_objectSpread(_objectSpread({}, value), {}, {
215
276
  points: points,
216
- sampleAnswers: sampleAnswers
277
+ sampleAnswers: sampleAnswers,
278
+ maxPoints: maxPoints
279
+ }));
280
+ } else {
281
+ onChange(_objectSpread(_objectSpread({}, value), {}, {
282
+ maxPoints: maxPoints
217
283
  }));
218
284
  }
219
285
  });
220
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "changeContent", function (index, content, type) {
286
+ (0, _defineProperty2["default"])(_this, "changeContent", function (index, content, type) {
221
287
  // type could be 'points' or 'sampleAnswers'
222
288
  log("changeModel[".concat(type, "]:"), index, content);
223
289
  if (type !== 'points' && type !== 'sampleAnswers') {
224
290
  return;
225
291
  }
226
- var _this$props3 = _this.props,
227
- value = _this$props3.value,
228
- onChange = _this$props3.onChange;
292
+ var _this$props4 = _this.props,
293
+ value = _this$props4.value,
294
+ onChange = _this$props4.onChange;
229
295
  var items = value[type] && Array.from(value[type]);
230
296
  items.splice(index, 1, content);
231
297
  log("changeModel[".concat(type, "]:"), items);
232
298
  onChange(_objectSpread(_objectSpread({}, value), {}, (0, _defineProperty2["default"])({}, type, items)));
233
299
  });
234
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "excludeZeros", function () {
235
- var _this$props4 = _this.props,
236
- value = _this$props4.value,
237
- onChange = _this$props4.onChange;
300
+ (0, _defineProperty2["default"])(_this, "excludeZeros", function () {
301
+ var _this$props5 = _this.props,
302
+ value = _this$props5.value,
303
+ onChange = _this$props5.onChange;
238
304
  onChange(_objectSpread(_objectSpread({}, value), {}, {
239
305
  excludeZero: !value.excludeZero
240
306
  }));
241
307
  });
242
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "shouldRenderPoint", function (index, value) {
308
+ (0, _defineProperty2["default"])(_this, "shouldRenderPoint", function (index, value) {
243
309
  if (!value.excludeZero) {
244
310
  return true;
245
311
  } else {
@@ -251,7 +317,7 @@ var RawAuthoring = /*#__PURE__*/function (_React$Component) {
251
317
  return true;
252
318
  }
253
319
  });
254
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onPointMenuChange", function (index, clickedItem) {
320
+ (0, _defineProperty2["default"])(_this, "onPointMenuChange", function (index, clickedItem) {
255
321
  if (clickedItem === 'sample') {
256
322
  var value = _this.props.value;
257
323
  var sampleAnswers = Array.from(value.sampleAnswers || []);
@@ -266,63 +332,95 @@ var RawAuthoring = /*#__PURE__*/function (_React$Component) {
266
332
  });
267
333
  return _this;
268
334
  }
269
- (0, _createClass2["default"])(RawAuthoring, [{
335
+ (0, _inherits2["default"])(RawAuthoring, _React$Component);
336
+ return (0, _createClass2["default"])(RawAuthoring, [{
270
337
  key: "render",
271
338
  value: function render() {
272
339
  var _this2 = this;
273
- var _this$props5 = this.props,
274
- classes = _this$props5.classes,
275
- className = _this$props5.className,
276
- value = _this$props5.value,
277
- _this$props5$mathMlOp = _this$props5.mathMlOptions,
278
- mathMlOptions = _this$props5$mathMlOp === void 0 ? {} : _this$props5$mathMlOp;
279
- var _ref = value || {},
280
- _ref$excludeZeroEnabl = _ref.excludeZeroEnabled,
281
- excludeZeroEnabled = _ref$excludeZeroEnabl === void 0 ? true : _ref$excludeZeroEnabl,
282
- _ref$maxPointsEnabled = _ref.maxPointsEnabled,
283
- maxPointsEnabled = _ref$maxPointsEnabled === void 0 ? true : _ref$maxPointsEnabled;
340
+ var _this$props6 = this.props,
341
+ value = _this$props6.value,
342
+ _this$props6$mathMlOp = _this$props6.mathMlOptions,
343
+ mathMlOptions = _this$props6$mathMlOp === void 0 ? {} : _this$props6$mathMlOp,
344
+ _this$props6$config = _this$props6.config,
345
+ config = _this$props6$config === void 0 ? {} : _this$props6$config,
346
+ _this$props6$rubricle = _this$props6.rubricless,
347
+ rubricless = _this$props6$rubricle === void 0 ? false : _this$props6$rubricle,
348
+ _this$props6$pluginOp = _this$props6.pluginOpts,
349
+ pluginOpts = _this$props6$pluginOp === void 0 ? {} : _this$props6$pluginOp;
350
+ var _ref0 = value || {},
351
+ _ref0$excludeZeroEnab = _ref0.excludeZeroEnabled,
352
+ excludeZeroEnabled = _ref0$excludeZeroEnab === void 0 ? true : _ref0$excludeZeroEnab,
353
+ _ref0$maxPointsEnable = _ref0.maxPointsEnabled,
354
+ maxPointsEnabled = _ref0$maxPointsEnable === void 0 ? true : _ref0$maxPointsEnable,
355
+ _ref0$errors = _ref0.errors,
356
+ errors = _ref0$errors === void 0 ? {} : _ref0$errors,
357
+ _ref0$rubriclessInstr = _ref0.rubriclessInstructionEnabled,
358
+ rubriclessInstructionEnabled = _ref0$rubriclessInstr === void 0 ? false : _ref0$rubriclessInstr,
359
+ _ref0$maxPoints = _ref0.maxPoints,
360
+ maxPoints = _ref0$maxPoints === void 0 ? 10 : _ref0$maxPoints;
361
+ // rubric will contain a max value for maxPoints
362
+ var _ref1 = config || {},
363
+ _ref1$rubriclessInstr = _ref1.rubriclessInstruction,
364
+ rubriclessInstruction = _ref1$rubriclessInstr === void 0 ? {} : _ref1$rubriclessInstr,
365
+ _ref1$maxMaxPoints = _ref1.maxMaxPoints,
366
+ maxMaxPoints = _ref1$maxMaxPoints === void 0 ? 10 : _ref1$maxMaxPoints;
367
+ var _ref10 = errors || {},
368
+ pointsDescriptorsErrors = _ref10.pointsDescriptorsErrors;
284
369
  if (value && Number.isFinite(value.maxPoints)) {
285
370
  // eslint-disable-next-line no-console
286
371
  console.warn('maxPoints is deprecated - remove from model');
287
372
  }
288
- return /*#__PURE__*/_react["default"].createElement("div", {
289
- className: (0, _classnames["default"])(classes["class"], className)
290
- }, /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
291
- variant: "h5",
292
- className: classes.rubricTitle
373
+
374
+ // for rubric value is computed based on points
375
+ var maxPointsValue = !rubricless ? value.points.length - 1 : maxPoints;
376
+ return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(RubricTitle, {
377
+ variant: "h5"
293
378
  }, "Rubric"), /*#__PURE__*/_react["default"].createElement(_FormGroup["default"], {
294
379
  row: true
295
380
  }, maxPointsEnabled && /*#__PURE__*/_react["default"].createElement(MaxPoints, {
296
- max: 10,
297
- value: value.points.length - 1,
298
- onChange: this.changeMaxPoints
381
+ max: maxMaxPoints < 100 ? maxMaxPoints : 100,
382
+ value: maxPointsValue,
383
+ onChange: this.changeMaxPoints,
384
+ pluginOpts: pluginOpts
299
385
  }), excludeZeroEnabled && /*#__PURE__*/_react["default"].createElement(_FormControlLabel["default"], {
300
386
  label: "Exclude zeros",
301
387
  control: /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
302
388
  checked: value.excludeZero,
303
389
  onChange: this.excludeZeros
304
390
  })
305
- })), /*#__PURE__*/_react["default"].createElement("div", {
306
- className: classes.container
307
- }, /*#__PURE__*/_react["default"].createElement(_reactBeautifulDnd.DragDropContext, {
391
+ })), rubriclessInstructionEnabled && rubricless && /*#__PURE__*/_react["default"].createElement(InputContainerWrapper, null, /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
392
+ label: rubriclessInstruction.label
393
+ }, /*#__PURE__*/_react["default"].createElement(_editableHtmlTipTap["default"], {
394
+ markup: value.rubriclessInstruction || '',
395
+ onChange: this.changeRubriclessInstruction,
396
+ pluginProps: pluginOpts,
397
+ nonEmpty: false,
398
+ disableUnderline: true,
399
+ languageCharactersProps: [{
400
+ language: 'spanish'
401
+ }, {
402
+ language: 'special'
403
+ }],
404
+ mathMlOptions: mathMlOptions
405
+ }))), /*#__PURE__*/_react["default"].createElement("div", null, rubricless ? /*#__PURE__*/_react["default"].createElement(Rubricless, null) : /*#__PURE__*/_react["default"].createElement(Container, null, /*#__PURE__*/_react["default"].createElement(_dnd.DragDropContext, {
308
406
  onDragEnd: this.dragEnd
309
- }, /*#__PURE__*/_react["default"].createElement(_reactBeautifulDnd.Droppable, {
407
+ }, /*#__PURE__*/_react["default"].createElement(_dnd.Droppable, {
310
408
  droppableId: "droppable"
311
409
  }, function (provided) {
312
410
  return /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({}, provided.droppableProps, {
313
411
  ref: provided.innerRef
314
412
  }), value.points.map(function (p, index) {
315
- return _this2.shouldRenderPoint(index, value) && /*#__PURE__*/_react["default"].createElement(_reactBeautifulDnd.Draggable, {
413
+ return _this2.shouldRenderPoint(index, value) && /*#__PURE__*/_react["default"].createElement(_dnd.Draggable, {
316
414
  key: "".concat(p.points, "-").concat(index),
317
415
  index: index,
318
416
  draggableId: index.toString()
319
417
  }, function (provided) {
320
- return /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
321
- className: classes.configHolder,
418
+ return /*#__PURE__*/_react["default"].createElement(ConfigHolder, (0, _extends2["default"])({
322
419
  ref: provided.innerRef
323
420
  }, provided.draggableProps, provided.dragHandleProps), /*#__PURE__*/_react["default"].createElement(PointConfig, {
324
421
  points: value.points.length - 1 - index,
325
422
  content: p,
423
+ error: pointsDescriptorsErrors && pointsDescriptorsErrors[value.points.length - 1 - index],
326
424
  sampleAnswer: value.sampleAnswers && value.sampleAnswers[index],
327
425
  onChange: function onChange(content) {
328
426
  return _this2.changeContent(index, content, 'points');
@@ -333,45 +431,31 @@ var RawAuthoring = /*#__PURE__*/function (_React$Component) {
333
431
  onMenuChange: function onMenuChange(clickedItem) {
334
432
  return _this2.onPointMenuChange(index, clickedItem);
335
433
  },
336
- mathMlOptions: mathMlOptions
434
+ mathMlOptions: mathMlOptions,
435
+ pluginOpts: pluginOpts
337
436
  }));
338
437
  });
339
438
  }), provided.placeholder);
340
- }))));
439
+ })))));
341
440
  }
342
441
  }]);
343
- return RawAuthoring;
344
- }(_react["default"].Component);
345
- exports.RawAuthoring = RawAuthoring;
442
+ }(_react["default"].Component); // styles migrated to styled-components above
346
443
  (0, _defineProperty2["default"])(RawAuthoring, "propTypes", {
347
- classes: _propTypes["default"].object.isRequired,
348
- className: _propTypes["default"].string,
349
444
  value: RubricType,
445
+ config: _propTypes["default"].object,
446
+ pluginOpts: _propTypes["default"].object,
447
+ rubricless: _propTypes["default"].bool,
350
448
  onChange: _propTypes["default"].func
351
449
  });
352
450
  (0, _defineProperty2["default"])(RawAuthoring, "defaultProps", {});
353
- var styles = function styles(theme) {
354
- return {
355
- container: {
356
- backgroundColor: _grey["default"][200],
357
- borderWidth: 1,
358
- borderStyle: 'solid',
359
- borderColor: _grey["default"][300],
360
- padding: theme.spacing.unit * 2,
361
- margin: theme.spacing.unit
362
- },
363
- configHolder: {
364
- paddingTop: theme.spacing.unit,
365
- paddingBottom: theme.spacing.unit
366
- },
367
- rubricTitle: {
368
- paddingLeft: theme.spacing.unit,
369
- margin: theme.spacing.unit
370
- }
371
- };
372
- };
373
- var StyledRawAuthoring = (0, _styles.withStyles)(styles)(RawAuthoring);
374
451
  var Reverse = function Reverse(props) {
452
+ var _ref11 = props || {},
453
+ _ref11$rubricless = _ref11.rubricless,
454
+ rubricless = _ref11$rubricless === void 0 ? false : _ref11$rubricless,
455
+ _ref11$config = _ref11.config,
456
+ config = _ref11$config === void 0 ? {} : _ref11$config,
457
+ _ref11$pluginOpts = _ref11.pluginOpts,
458
+ pluginOpts = _ref11$pluginOpts === void 0 ? {} : _ref11$pluginOpts;
375
459
  var points = Array.from(props.value.points || []).reverse();
376
460
  var sampleAnswers = Array.from(props.value.sampleAnswers || []).reverse();
377
461
  if (points.length > sampleAnswers.length) {
@@ -389,16 +473,21 @@ var Reverse = function Reverse(props) {
389
473
  sampleAnswers: Array.from(value.sampleAnswers || []).reverse()
390
474
  }));
391
475
  };
392
- return /*#__PURE__*/_react["default"].createElement(StyledRawAuthoring, {
476
+ return /*#__PURE__*/_react["default"].createElement(RawAuthoring, {
393
477
  value: value,
394
- onChange: onChange
478
+ config: config,
479
+ onChange: onChange,
480
+ rubricless: rubricless,
481
+ pluginOpts: pluginOpts
395
482
  });
396
483
  };
397
484
  Reverse.propTypes = {
398
485
  value: RubricType,
486
+ config: _propTypes["default"].object,
487
+ pluginOpts: _propTypes["default"].object,
488
+ rubricless: _propTypes["default"].bool,
399
489
  getIndex: _propTypes["default"].func,
400
490
  onChange: _propTypes["default"].func
401
491
  };
402
- var _default = Reverse;
403
- exports["default"] = _default;
404
- //# sourceMappingURL=authoring.js.map
492
+ var _default = exports["default"] = Reverse;
493
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wcm9wVHlwZXMiLCJfc3R5bGVzIiwiX0lucHV0TGFiZWwiLCJfT3V0bGluZWRJbnB1dCIsIl9TZWxlY3QiLCJfRm9ybUNvbnRyb2wiLCJfTWVudUl0ZW0iLCJfdGltZXMiLCJfQ2hlY2tib3giLCJfRm9ybUdyb3VwIiwiX0Zvcm1Db250cm9sTGFiZWwiLCJfVHlwb2dyYXBoeSIsIl9EcmFnSW5kaWNhdG9yIiwiX2RuZCIsIl9kZWJ1ZyIsIl90YWtlUmlnaHQiLCJfcG9pbnRNZW51IiwiX3JhbmdlIiwiX2VkaXRhYmxlSHRtbFRpcFRhcCIsIl9jb25maWdVaSIsIl9jb2xvcnMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiY2FsbCIsImxvZyIsImRlYnVnIiwicmVvcmRlciIsImxpc3QiLCJzdGFydEluZGV4IiwiZW5kSW5kZXgiLCJyZXN1bHQiLCJBcnJheSIsImZyb20iLCJfcmVzdWx0JHNwbGljZSIsInNwbGljZSIsIl9yZXN1bHQkc3BsaWNlMiIsIl9zbGljZWRUb0FycmF5MiIsInJlbW92ZWQiLCJSdWJyaWNUeXBlIiwiZXhwb3J0cyIsIlByb3BUeXBlcyIsInNoYXBlIiwiZXhjbHVkZVplcm8iLCJib29sIiwicG9pbnRzIiwiYXJyYXlPZiIsInN0cmluZyIsInNhbXBsZUFuc3dlcnMiLCJtYXhQb2ludHMiLCJudW1iZXIiLCJydWJyaWNsZXNzSW5zdHJ1Y3Rpb24iLCJNYXhQb2ludHMiLCJwcm9wcyIsInZhbHVlIiwib25DaGFuZ2UiLCJtYXgiLCJsYWJlbElkIiwiY3JlYXRlRWxlbWVudCIsInN4IiwibWluV2lkdGgiLCJtIiwidmFyaWFudCIsImlkIiwibGFiZWwiLCJ0YXJnZXQiLCJpbnB1dCIsIk1lbnVQcm9wcyIsInRyYW5zaXRpb25EdXJhdGlvbiIsImVudGVyIiwiZXhpdCIsInJhbmdlIiwibWFwIiwidiIsImtleSIsImNvbmNhdCIsImNoZWNrU2FtcGxlQW5zd2VyIiwic2FtcGxlQW5zd2VyIiwiUm93Iiwic3R5bGVkIiwiZGlzcGxheSIsIndpZHRoIiwicG9zaXRpb24iLCJFZGl0b3JEaXYiLCJfcmVmIiwidGhlbWUiLCJiYWNrZ3JvdW5kQ29sb3IiLCJwYWxldHRlIiwiY29tbW9uIiwid2hpdGUiLCJEcmFnSW5kaWNhdG9yU3R5bGVkIiwiRHJhZ0luZGljYXRvciIsIl9yZWYyIiwicGFkZGluZ1RvcCIsInNwYWNpbmciLCJjb2xvciIsImdyZXkiLCJQb2ludHNMYWJlbCIsIlR5cG9ncmFwaHkiLCJfcmVmMyIsInBhZGRpbmdCb3R0b20iLCJ0ZXh0VHJhbnNmb3JtIiwiU2FtcGxlQW5zd2Vyc0VkaXRvciIsIl9yZWY0IiwicGFkZGluZ0xlZnQiLCJFcnJvclRleHQiLCJfcmVmNSIsImZvbnRTaXplIiwidHlwb2dyYXBoeSIsImVycm9yIiwibWFpbiIsIlBvaW50TWVudVdyYXBwZXIiLCJyaWdodCIsIlBvaW50Q29uZmlnIiwiY29udGVudCIsIl9wcm9wcyRtYXRoTWxPcHRpb25zIiwibWF0aE1sT3B0aW9ucyIsIl9wcm9wcyRwbHVnaW5PcHRzIiwicGx1Z2luT3B0cyIsInBvaW50c0xhYmVsIiwic2hvd1NhbXBsZUFuc3dlciIsInBsdWdpblByb3BzIiwibWFya3VwIiwib25NZW51Q2hhbmdlIiwiYXMiLCJvblNhbXBsZUNoYW5nZSIsIkNvbnRhaW5lciIsIl9yZWY2IiwiYm9yZGVyV2lkdGgiLCJib3JkZXJTdHlsZSIsImJvcmRlckNvbG9yIiwicGFkZGluZyIsIm1hcmdpbiIsIklucHV0Q29udGFpbmVyV3JhcHBlciIsIl9yZWY3IiwibWFyZ2luQm90dG9tIiwiUnVicmljbGVzcyIsIkNvbmZpZ0hvbGRlciIsIl9yZWY4IiwiUnVicmljVGl0bGUiLCJfcmVmOSIsIlJhd0F1dGhvcmluZyIsIl9SZWFjdCRDb21wb25lbnQiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJfbGVuIiwiYXJncyIsIl9rZXkiLCJkZXN0aW5hdGlvbiIsIl90aGlzJHByb3BzIiwic291cmNlIiwiaW5kZXgiLCJfdGhpcyRwcm9wczIiLCJfdGhpcyRwcm9wczMiLCJydWJyaWNsZXNzIiwiY3VycmVudE1heCIsInRpbWVzIiwidGFrZVJpZ2h0IiwidHlwZSIsIl90aGlzJHByb3BzNCIsIml0ZW1zIiwiX3RoaXMkcHJvcHM1IiwiY2xpY2tlZEl0ZW0iLCJjaGFuZ2VDb250ZW50IiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJyZW5kZXIiLCJfdGhpczIiLCJfdGhpcyRwcm9wczYiLCJfdGhpcyRwcm9wczYkbWF0aE1sT3AiLCJfdGhpcyRwcm9wczYkY29uZmlnIiwiY29uZmlnIiwiX3RoaXMkcHJvcHM2JHJ1YnJpY2xlIiwiX3RoaXMkcHJvcHM2JHBsdWdpbk9wIiwiX3JlZjAiLCJfcmVmMCRleGNsdWRlWmVyb0VuYWIiLCJleGNsdWRlWmVyb0VuYWJsZWQiLCJfcmVmMCRtYXhQb2ludHNFbmFibGUiLCJtYXhQb2ludHNFbmFibGVkIiwiX3JlZjAkZXJyb3JzIiwiZXJyb3JzIiwiX3JlZjAkcnVicmljbGVzc0luc3RyIiwicnVicmljbGVzc0luc3RydWN0aW9uRW5hYmxlZCIsIl9yZWYwJG1heFBvaW50cyIsIl9yZWYxIiwiX3JlZjEkcnVicmljbGVzc0luc3RyIiwiX3JlZjEkbWF4TWF4UG9pbnRzIiwibWF4TWF4UG9pbnRzIiwiX3JlZjEwIiwicG9pbnRzRGVzY3JpcHRvcnNFcnJvcnMiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsImNvbnNvbGUiLCJ3YXJuIiwibWF4UG9pbnRzVmFsdWUiLCJyb3ciLCJjaGFuZ2VNYXhQb2ludHMiLCJjb250cm9sIiwiY2hlY2tlZCIsImV4Y2x1ZGVaZXJvcyIsIklucHV0Q29udGFpbmVyIiwiY2hhbmdlUnVicmljbGVzc0luc3RydWN0aW9uIiwibm9uRW1wdHkiLCJkaXNhYmxlVW5kZXJsaW5lIiwibGFuZ3VhZ2VDaGFyYWN0ZXJzUHJvcHMiLCJsYW5ndWFnZSIsIkRyYWdEcm9wQ29udGV4dCIsIm9uRHJhZ0VuZCIsImRyYWdFbmQiLCJEcm9wcGFibGUiLCJkcm9wcGFibGVJZCIsInByb3ZpZGVkIiwiX2V4dGVuZHMyIiwiZHJvcHBhYmxlUHJvcHMiLCJyZWYiLCJpbm5lclJlZiIsInAiLCJzaG91bGRSZW5kZXJQb2ludCIsIkRyYWdnYWJsZSIsImRyYWdnYWJsZUlkIiwidG9TdHJpbmciLCJkcmFnZ2FibGVQcm9wcyIsImRyYWdIYW5kbGVQcm9wcyIsIm9uUG9pbnRNZW51Q2hhbmdlIiwicGxhY2Vob2xkZXIiLCJSZWFjdCIsIkNvbXBvbmVudCIsIm9iamVjdCIsImZ1bmMiLCJSZXZlcnNlIiwiX3JlZjExIiwiX3JlZjExJHJ1YnJpY2xlc3MiLCJfcmVmMTEkY29uZmlnIiwiX3JlZjExJHBsdWdpbk9wdHMiLCJyZXZlcnNlIiwicHJvcFR5cGVzIiwiZ2V0SW5kZXgiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9hdXRob3JpbmcuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgc3R5bGVkIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuXG5pbXBvcnQgSW5wdXRMYWJlbCBmcm9tICdAbXVpL21hdGVyaWFsL0lucHV0TGFiZWwnO1xuaW1wb3J0IE91dGxpbmVkSW5wdXQgZnJvbSAnQG11aS9tYXRlcmlhbC9PdXRsaW5lZElucHV0JztcbmltcG9ydCBTZWxlY3QgZnJvbSAnQG11aS9tYXRlcmlhbC9TZWxlY3QnO1xuaW1wb3J0IEZvcm1Db250cm9sIGZyb20gJ0BtdWkvbWF0ZXJpYWwvRm9ybUNvbnRyb2wnO1xuaW1wb3J0IE1lbnVJdGVtIGZyb20gJ0BtdWkvbWF0ZXJpYWwvTWVudUl0ZW0nO1xuaW1wb3J0IHRpbWVzIGZyb20gJ2xvZGFzaC90aW1lcyc7XG5pbXBvcnQgQ2hlY2tib3ggZnJvbSAnQG11aS9tYXRlcmlhbC9DaGVja2JveCc7XG5pbXBvcnQgRm9ybUdyb3VwIGZyb20gJ0BtdWkvbWF0ZXJpYWwvRm9ybUdyb3VwJztcbmltcG9ydCBGb3JtQ29udHJvbExhYmVsIGZyb20gJ0BtdWkvbWF0ZXJpYWwvRm9ybUNvbnRyb2xMYWJlbCc7XG5pbXBvcnQgVHlwb2dyYXBoeSBmcm9tICdAbXVpL21hdGVyaWFsL1R5cG9ncmFwaHknO1xuaW1wb3J0IERyYWdJbmRpY2F0b3IgZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9EcmFnSW5kaWNhdG9yJztcbmltcG9ydCB7IERyYWdEcm9wQ29udGV4dCwgRHJvcHBhYmxlLCBEcmFnZ2FibGUgfSBmcm9tICdAaGVsbG8tcGFuZ2VhL2RuZCc7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHRha2VSaWdodCBmcm9tICdsb2Rhc2gvdGFrZVJpZ2h0JztcbmltcG9ydCBQb2ludE1lbnUgZnJvbSAnLi9wb2ludC1tZW51JztcbmltcG9ydCByYW5nZSBmcm9tICdsb2Rhc2gvcmFuZ2UnO1xuaW1wb3J0IEVkaXRhYmxlSHRtbCBmcm9tICdAcGllLWxpYi9lZGl0YWJsZS1odG1sLXRpcC10YXAnO1xuaW1wb3J0IHsgSW5wdXRDb250YWluZXIgfSBmcm9tICdAcGllLWxpYi9jb25maWctdWknO1xuaW1wb3J0IHsgZ3JleSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvY29sb3JzJztcblxuY29uc3QgbG9nID0gZGVidWcoJ3BpZS1saWI6cnVicmljOmF1dGhvcmluZycpO1xuXG5jb25zdCByZW9yZGVyID0gKGxpc3QsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IEFycmF5LmZyb20obGlzdCk7XG4gIGNvbnN0IFtyZW1vdmVkXSA9IHJlc3VsdC5zcGxpY2Uoc3RhcnRJbmRleCwgMSk7XG5cbiAgcmVzdWx0LnNwbGljZShlbmRJbmRleCwgMCwgcmVtb3ZlZCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBSdWJyaWNUeXBlID0gUHJvcFR5cGVzLnNoYXBlKHtcbiAgZXhjbHVkZVplcm86IFByb3BUeXBlcy5ib29sLFxuICBwb2ludHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpLFxuICBzYW1wbGVBbnN3ZXJzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSxcbiAgbWF4UG9pbnRzOiBQcm9wVHlwZXMubnVtYmVyLFxuICBydWJyaWNsZXNzSW5zdHJ1Y3Rpb246IFByb3BUeXBlcy5zdHJpbmcsXG59KTtcblxuY29uc3QgTWF4UG9pbnRzID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlLCBtYXggfSA9IHByb3BzO1xuICBjb25zdCBsYWJlbElkID0gJ21heC1wb2ludHMtbGFiZWwnO1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIHN4PXt7IG1pbldpZHRoOiAxMjAsIG06IDEgfX0gdmFyaWFudD1cIm91dGxpbmVkXCI+XG4gICAgICA8SW5wdXRMYWJlbCBpZD17bGFiZWxJZH0+TWF4IFBvaW50czwvSW5wdXRMYWJlbD5cbiAgICAgIDxTZWxlY3RcbiAgICAgICAgbGFiZWxJZD17bGFiZWxJZH1cbiAgICAgICAgbGFiZWw9XCJNYXggUG9pbnRzXCJcbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICBvbkNoYW5nZT17KGUpID0+IG9uQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgaW5wdXQ9ezxPdXRsaW5lZElucHV0IGxhYmVsPVwiTWF4IFBvaW50c1wiIC8+fVxuICAgICAgICBNZW51UHJvcHM9e3sgdHJhbnNpdGlvbkR1cmF0aW9uOiB7IGVudGVyOiAyMjUsIGV4aXQ6IDE5NSB9IH19XG4gICAgICA+XG4gICAgICAgIHtyYW5nZSgxLCBtYXggKyAxKS5tYXAoKHYpID0+IChcbiAgICAgICAgICA8TWVudUl0ZW0ga2V5PXtgJHt2fWB9IHZhbHVlPXt2fT5cbiAgICAgICAgICAgIHt2fVxuICAgICAgICAgIDwvTWVudUl0ZW0+XG4gICAgICAgICkpfVxuICAgICAgPC9TZWxlY3Q+XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbi8vIGlmIHRoZSB2YWx1ZSBpcyBudWxsIG9yICdudWxsJywgdGhlIFNhbXBsZSBBbnN3ZXIgaW5wdXQgZmllbGQgZm9yIHRoYXQgcG9pbnQgd2lsbCBub3QgYmUgZGlzcGFseWVkXG4vLyBpZiB0aGUgdmFsdWUgaXMgJycsIHRoZSBTYW1wbGUgQW5zd2VyIGlucHV0IGZpZWxkIHdpbGwgYmUgZW1wdHlcbmNvbnN0IGNoZWNrU2FtcGxlQW5zd2VyID0gKHNhbXBsZUFuc3dlcikgPT4gc2FtcGxlQW5zd2VyID09PSBudWxsIHx8IHNhbXBsZUFuc3dlciA9PT0gJ251bGwnO1xuXG5jb25zdCBSb3cgPSBzdHlsZWQoJ2RpdicpKCgpID0+ICh7IGRpc3BsYXk6ICdmbGV4Jywgd2lkdGg6ICcxMDAlJywgcG9zaXRpb246ICdyZWxhdGl2ZScgfSkpO1xuXG5jb25zdCBFZGl0b3JEaXYgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+ICh7IHdpZHRoOiAnMTAwJScsIGJhY2tncm91bmRDb2xvcjogYCR7dGhlbWUucGFsZXR0ZS5jb21tb24ud2hpdGV9YCB9KSk7XG5cbmNvbnN0IERyYWdJbmRpY2F0b3JTdHlsZWQgPSBzdHlsZWQoRHJhZ0luZGljYXRvcikoKHsgdGhlbWUgfSkgPT4gKHsgcGFkZGluZ1RvcDogdGhlbWUuc3BhY2luZygxKSwgY29sb3I6IGdyZXlbNTAwXSB9KSk7XG5cbmNvbnN0IFBvaW50c0xhYmVsID0gc3R5bGVkKFR5cG9ncmFwaHkpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGNvbG9yOiBncmV5WzUwMF0sXG4gIHBhZGRpbmdCb3R0b206IHRoZW1lLnNwYWNpbmcoMSksXG4gIHRleHRUcmFuc2Zvcm06ICd1cHBlcmNhc2UnLFxufSkpO1xuXG5jb25zdCBTYW1wbGVBbnN3ZXJzRWRpdG9yID0gc3R5bGVkKCdkaXYnKSgoeyB0aGVtZSB9KSA9PiAoeyBwYWRkaW5nTGVmdDogdGhlbWUuc3BhY2luZygzKSB9KSk7XG5cbmNvbnN0IEVycm9yVGV4dCA9IHN0eWxlZCgnZGl2JykoKHsgdGhlbWUgfSkgPT4gKHtcbiAgZm9udFNpemU6IHRoZW1lLnR5cG9ncmFwaHkuZm9udFNpemUgLSAyLFxuICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICBwYWRkaW5nTGVmdDogdGhlbWUuc3BhY2luZygzKSxcbiAgcGFkZGluZ1RvcDogdGhlbWUuc3BhY2luZygxKSxcbn0pKTtcblxuY29uc3QgUG9pbnRNZW51V3JhcHBlciA9IHN0eWxlZCgnZGl2JykoKCkgPT4gKHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIHJpZ2h0OiAwIH0pKTtcblxuZXhwb3J0IGNvbnN0IFBvaW50Q29uZmlnID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcG9pbnRzLCBjb250ZW50LCBzYW1wbGVBbnN3ZXIsIG1hdGhNbE9wdGlvbnMgPSB7fSwgZXJyb3IsIHBsdWdpbk9wdHMgPSB7fSB9ID0gcHJvcHM7XG4gIGNvbnN0IHBvaW50c0xhYmVsID0gYCR7cG9pbnRzfSAke3BvaW50cyA8PSAxID8gJ3B0JyA6ICdwdHMnfWA7XG4gIGNvbnN0IHNob3dTYW1wbGVBbnN3ZXIgPSBjaGVja1NhbXBsZUFuc3dlcihzYW1wbGVBbnN3ZXIpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdj5cbiAgICAgIDxQb2ludHNMYWJlbCB2YXJpYW50PVwib3ZlcmxpbmVcIj57cG9pbnRzTGFiZWx9PC9Qb2ludHNMYWJlbD5cbiAgICAgIDxSb3c+XG4gICAgICAgIDxEcmFnSW5kaWNhdG9yU3R5bGVkIC8+XG4gICAgICAgIDxFZGl0b3JEaXY+XG4gICAgICAgICAgPEVkaXRhYmxlSHRtbFxuICAgICAgICAgICAgZXJyb3I9e2Vycm9yfVxuICAgICAgICAgICAgcGx1Z2luUHJvcHM9e3BsdWdpbk9wdHN9XG4gICAgICAgICAgICBtYXJrdXA9e2NvbnRlbnR9XG4gICAgICAgICAgICBvbkNoYW5nZT17cHJvcHMub25DaGFuZ2V9XG4gICAgICAgICAgICBtYXRoTWxPcHRpb25zPXttYXRoTWxPcHRpb25zfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvRWRpdG9yRGl2PlxuICAgICAgICA8UG9pbnRNZW51V3JhcHBlcj5cbiAgICAgICAgICA8UG9pbnRNZW51IHNob3dTYW1wbGVBbnN3ZXI9e3Nob3dTYW1wbGVBbnN3ZXJ9IG9uQ2hhbmdlPXtwcm9wcy5vbk1lbnVDaGFuZ2V9IC8+XG4gICAgICAgIDwvUG9pbnRNZW51V3JhcHBlcj5cbiAgICAgIDwvUm93PlxuICAgICAge2Vycm9yICYmIDxFcnJvclRleHQ+e2Vycm9yfTwvRXJyb3JUZXh0Pn1cbiAgICAgIHshc2hvd1NhbXBsZUFuc3dlciAmJiAoXG4gICAgICAgIDxTYW1wbGVBbnN3ZXJzRWRpdG9yPlxuICAgICAgICAgIDxEcmFnSW5kaWNhdG9yU3R5bGVkIGFzPXtUeXBvZ3JhcGh5fSB2YXJpYW50PVwib3ZlcmxpbmVcIj5cbiAgICAgICAgICAgIFNhbXBsZSBSZXNwb25zZVxuICAgICAgICAgIDwvRHJhZ0luZGljYXRvclN0eWxlZD5cbiAgICAgICAgICA8RWRpdG9yRGl2PlxuICAgICAgICAgICAgPEVkaXRhYmxlSHRtbFxuICAgICAgICAgICAgICBtYXJrdXA9e3NhbXBsZUFuc3dlcn1cbiAgICAgICAgICAgICAgcGx1Z2luUHJvcHM9e3BsdWdpbk9wdHN9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXtwcm9wcy5vblNhbXBsZUNoYW5nZX1cbiAgICAgICAgICAgICAgbWF0aE1sT3B0aW9ucz17bWF0aE1sT3B0aW9uc31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9FZGl0b3JEaXY+XG4gICAgICAgIDwvU2FtcGxlQW5zd2Vyc0VkaXRvcj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5jb25zdCBDb250YWluZXIgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGJhY2tncm91bmRDb2xvcjogZ3JleVsyMDBdLFxuICBib3JkZXJXaWR0aDogMSxcbiAgYm9yZGVyU3R5bGU6ICdzb2xpZCcsXG4gIGJvcmRlckNvbG9yOiBncmV5WzMwMF0sXG4gIHBhZGRpbmc6IHRoZW1lLnNwYWNpbmcoMiksXG4gIG1hcmdpbjogdGhlbWUuc3BhY2luZygxKSxcbn0pKTtcbmNvbnN0IElucHV0Q29udGFpbmVyV3JhcHBlciA9IHN0eWxlZCgnZGl2JykoKHsgdGhlbWUgfSkgPT4gKHtcbiAgd2lkdGg6ICcxMDAlJyxcbiAgcGFkZGluZ1RvcDogdGhlbWUuc3BhY2luZygyKSxcbiAgbWFyZ2luQm90dG9tOiB0aGVtZS5zcGFjaW5nKDIpLFxuICAnJiBNdWlGb3JtQ29udHJvbC1yb290JzogeyB3aWR0aDogJzEwMCUnIH0sXG59KSk7XG5jb25zdCBSdWJyaWNsZXNzID0gc3R5bGVkKCdkaXYnKSgoKSA9PiAoeyBkaXNwbGF5OiAnbm9uZScgfSkpO1xuY29uc3QgQ29uZmlnSG9sZGVyID0gc3R5bGVkKCdkaXYnKSgoeyB0aGVtZSB9KSA9PiAoeyBwYWRkaW5nVG9wOiB0aGVtZS5zcGFjaW5nKDEpLCBwYWRkaW5nQm90dG9tOiB0aGVtZS5zcGFjaW5nKDEpIH0pKTtcbmNvbnN0IFJ1YnJpY1RpdGxlID0gc3R5bGVkKFR5cG9ncmFwaHkpKCh7IHRoZW1lIH0pID0+ICh7IHBhZGRpbmdMZWZ0OiB0aGVtZS5zcGFjaW5nKDEpLCBtYXJnaW46IHRoZW1lLnNwYWNpbmcoMSkgfSkpO1xuXG5leHBvcnQgY2xhc3MgUmF3QXV0aG9yaW5nIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICB2YWx1ZTogUnVicmljVHlwZSxcbiAgICBjb25maWc6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgcGx1Z2luT3B0czogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBydWJyaWNsZXNzOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIH07XG5cbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHt9O1xuXG4gIGRyYWdFbmQgPSAocmVzdWx0KSA9PiB7XG4gICAgaWYgKCFyZXN1bHQuZGVzdGluYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IHBvaW50cyA9IHJlb3JkZXIodmFsdWUucG9pbnRzLCByZXN1bHQuc291cmNlLmluZGV4LCByZXN1bHQuZGVzdGluYXRpb24uaW5kZXgpO1xuICAgIGNvbnN0IHNhbXBsZUFuc3dlcnMgPSByZW9yZGVyKHZhbHVlLnNhbXBsZUFuc3dlcnMsIHJlc3VsdC5zb3VyY2UuaW5kZXgsIHJlc3VsdC5kZXN0aW5hdGlvbi5pbmRleCk7XG5cbiAgICBvbkNoYW5nZSh7IC4uLnZhbHVlLCBwb2ludHMsIHNhbXBsZUFuc3dlcnMgfSk7XG4gIH07XG5cbiAgY2hhbmdlUnVicmljbGVzc0luc3RydWN0aW9uID0gKGlucHV0KSA9PiB7XG4gICAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHRoaXMucHJvcHM7XG4gICAgb25DaGFuZ2UoeyAuLi52YWx1ZSwgcnVicmljbGVzc0luc3RydWN0aW9uOiBpbnB1dCB9KTtcbiAgfTtcblxuICBjaGFuZ2VNYXhQb2ludHMgPSAobWF4UG9pbnRzKSA9PiB7XG4gICAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UsIHJ1YnJpY2xlc3MgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgY3VycmVudE1heCA9IHZhbHVlLnBvaW50cy5sZW5ndGggLSAxO1xuXG4gICAgbG9nKCdjdXJyZW50JywgY3VycmVudE1heCwgJ25ldzogJywgbWF4UG9pbnRzKTtcblxuICAgIGxldCBwb2ludHMsIHNhbXBsZUFuc3dlcnM7XG4gICAgaWYgKG1heFBvaW50cyA+IGN1cnJlbnRNYXgpIHtcbiAgICAgIHBvaW50cyA9IHRpbWVzKG1heFBvaW50cyAtIGN1cnJlbnRNYXgpXG4gICAgICAgIC5tYXAoKCkgPT4gJycpXG4gICAgICAgIC5jb25jYXQodmFsdWUucG9pbnRzKTtcbiAgICAgIHNhbXBsZUFuc3dlcnMgPSB0aW1lcyhtYXhQb2ludHMgLSBjdXJyZW50TWF4KVxuICAgICAgICAubWFwKCgpID0+IG51bGwpXG4gICAgICAgIC5jb25jYXQodmFsdWUuc2FtcGxlQW5zd2Vycyk7XG4gICAgfVxuXG4gICAgaWYgKG1heFBvaW50cyA8IGN1cnJlbnRNYXgpIHtcbiAgICAgIGxvZygnbGVzcyB0aGFuJyk7XG4gICAgICBwb2ludHMgPSB0YWtlUmlnaHQodmFsdWUucG9pbnRzLCBtYXhQb2ludHMgKyAxKTtcbiAgICAgIHNhbXBsZUFuc3dlcnMgPSB0YWtlUmlnaHQodmFsdWUuc2FtcGxlQW5zd2VycywgbWF4UG9pbnRzICsgMSk7XG4gICAgfVxuXG4gICAgaWYgKHBvaW50cyAmJiAhcnVicmljbGVzcykge1xuICAgICAgb25DaGFuZ2UoeyAuLi52YWx1ZSwgcG9pbnRzLCBzYW1wbGVBbnN3ZXJzLCBtYXhQb2ludHMgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uQ2hhbmdlKHsgLi4udmFsdWUsIG1heFBvaW50cyB9KTtcbiAgICB9XG4gIH07XG5cbiAgY2hhbmdlQ29udGVudCA9IChpbmRleCwgY29udGVudCwgdHlwZSkgPT4ge1xuICAgIC8vIHR5cGUgY291bGQgYmUgJ3BvaW50cycgb3IgJ3NhbXBsZUFuc3dlcnMnXG4gICAgbG9nKGBjaGFuZ2VNb2RlbFske3R5cGV9XTpgLCBpbmRleCwgY29udGVudCk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3BvaW50cycgJiYgdHlwZSAhPT0gJ3NhbXBsZUFuc3dlcnMnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgaXRlbXMgPSB2YWx1ZVt0eXBlXSAmJiBBcnJheS5mcm9tKHZhbHVlW3R5cGVdKTtcblxuICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSwgY29udGVudCk7XG4gICAgbG9nKGBjaGFuZ2VNb2RlbFske3R5cGV9XTpgLCBpdGVtcyk7XG5cbiAgICBvbkNoYW5nZSh7IC4uLnZhbHVlLCBbdHlwZV06IGl0ZW1zIH0pO1xuICB9O1xuXG4gIGV4Y2x1ZGVaZXJvcyA9ICgpID0+IHtcbiAgICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdGhpcy5wcm9wcztcblxuICAgIG9uQ2hhbmdlKHsgLi4udmFsdWUsIGV4Y2x1ZGVaZXJvOiAhdmFsdWUuZXhjbHVkZVplcm8gfSk7XG4gIH07XG5cbiAgc2hvdWxkUmVuZGVyUG9pbnQgPSAoaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgaWYgKCF2YWx1ZS5leGNsdWRlWmVybykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbmRleCA8IHZhbHVlLnBvaW50cy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChpbmRleCA9PT0gdmFsdWUucG9pbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgb25Qb2ludE1lbnVDaGFuZ2UgPSAoaW5kZXgsIGNsaWNrZWRJdGVtKSA9PiB7XG4gICAgaWYgKGNsaWNrZWRJdGVtID09PSAnc2FtcGxlJykge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHNhbXBsZUFuc3dlcnMgPSBBcnJheS5mcm9tKHZhbHVlLnNhbXBsZUFuc3dlcnMgfHwgW10pO1xuXG4gICAgICBpZiAoY2hlY2tTYW1wbGVBbnN3ZXIoc2FtcGxlQW5zd2Vyc1tpbmRleF0pKSB7XG4gICAgICAgIC8vIGFuIGVtcHR5IHN0cmluZyB3aWxsIGRpc3BsYXkgYW4gZW1wdHkgU2FtcGxlIEFuc3dlciBpbnB1dCBmaWVsZFxuICAgICAgICB0aGlzLmNoYW5nZUNvbnRlbnQoaW5kZXgsICcnLCAnc2FtcGxlQW5zd2VycycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gd2hlbiB0aGUgY29udGVudCBpcyBudWxsIG9yICdudWxsJywgdGhlIFNhbXBsZSBBbnN3ZXIgaW5wdXQgZmllbGQgd2lsbCBub3QgYmUgZGlzcGxheWVkXG4gICAgICAgIHRoaXMuY2hhbmdlQ29udGVudChpbmRleCwgbnVsbCwgJ3NhbXBsZUFuc3dlcnMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgdmFsdWUsIG1hdGhNbE9wdGlvbnMgPSB7fSwgY29uZmlnID0ge30sIHJ1YnJpY2xlc3MgPSBmYWxzZSwgcGx1Z2luT3B0cyA9IHt9IH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCB7XG4gICAgICBleGNsdWRlWmVyb0VuYWJsZWQgPSB0cnVlLFxuICAgICAgbWF4UG9pbnRzRW5hYmxlZCA9IHRydWUsXG4gICAgICBlcnJvcnMgPSB7fSxcbiAgICAgIHJ1YnJpY2xlc3NJbnN0cnVjdGlvbkVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIG1heFBvaW50cyA9IDEwLFxuICAgIH0gPSB2YWx1ZSB8fCB7fTtcbiAgICAvLyBydWJyaWMgd2lsbCBjb250YWluIGEgbWF4IHZhbHVlIGZvciBtYXhQb2ludHNcbiAgICBjb25zdCB7IHJ1YnJpY2xlc3NJbnN0cnVjdGlvbiA9IHt9LCBtYXhNYXhQb2ludHMgPSAxMCB9ID0gY29uZmlnIHx8IHt9O1xuICAgIGNvbnN0IHsgcG9pbnRzRGVzY3JpcHRvcnNFcnJvcnMgfSA9IGVycm9ycyB8fCB7fTtcbiAgICBpZiAodmFsdWUgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlLm1heFBvaW50cykpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oJ21heFBvaW50cyBpcyBkZXByZWNhdGVkIC0gcmVtb3ZlIGZyb20gbW9kZWwnKTtcbiAgICB9XG5cbiAgICAvLyBmb3IgcnVicmljIHZhbHVlIGlzIGNvbXB1dGVkIGJhc2VkIG9uIHBvaW50c1xuICAgIGNvbnN0IG1heFBvaW50c1ZhbHVlID0gIXJ1YnJpY2xlc3MgPyB2YWx1ZS5wb2ludHMubGVuZ3RoIC0gMSA6IG1heFBvaW50cztcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICA8UnVicmljVGl0bGUgdmFyaWFudD1cImg1XCI+UnVicmljPC9SdWJyaWNUaXRsZT5cbiAgICAgICAgPEZvcm1Hcm91cCByb3c+XG4gICAgICAgICAge21heFBvaW50c0VuYWJsZWQgJiYgKFxuICAgICAgICAgICAgPE1heFBvaW50c1xuICAgICAgICAgICAgICBtYXg9e21heE1heFBvaW50cyA8IDEwMCA/IG1heE1heFBvaW50cyA6IDEwMH1cbiAgICAgICAgICAgICAgdmFsdWU9e21heFBvaW50c1ZhbHVlfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5jaGFuZ2VNYXhQb2ludHN9XG4gICAgICAgICAgICAgIHBsdWdpbk9wdHM9e3BsdWdpbk9wdHN9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgICAge2V4Y2x1ZGVaZXJvRW5hYmxlZCAmJiAoXG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAgICBsYWJlbD1cIkV4Y2x1ZGUgemVyb3NcIlxuICAgICAgICAgICAgICBjb250cm9sPXs8Q2hlY2tib3ggY2hlY2tlZD17dmFsdWUuZXhjbHVkZVplcm99IG9uQ2hhbmdlPXt0aGlzLmV4Y2x1ZGVaZXJvc30gLz59XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvRm9ybUdyb3VwPlxuXG4gICAgICAgIHtydWJyaWNsZXNzSW5zdHJ1Y3Rpb25FbmFibGVkICYmIHJ1YnJpY2xlc3MgJiYgKFxuICAgICAgICAgIDxJbnB1dENvbnRhaW5lcldyYXBwZXI+XG4gICAgICAgICAgICA8SW5wdXRDb250YWluZXIgbGFiZWw9e3J1YnJpY2xlc3NJbnN0cnVjdGlvbi5sYWJlbH0+XG4gICAgICAgICAgICAgIDxFZGl0YWJsZUh0bWxcbiAgICAgICAgICAgICAgICBtYXJrdXA9e3ZhbHVlLnJ1YnJpY2xlc3NJbnN0cnVjdGlvbiB8fCAnJ31cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5jaGFuZ2VSdWJyaWNsZXNzSW5zdHJ1Y3Rpb259XG4gICAgICAgICAgICAgICAgcGx1Z2luUHJvcHM9e3BsdWdpbk9wdHN9XG4gICAgICAgICAgICAgICAgbm9uRW1wdHk9e2ZhbHNlfVxuICAgICAgICAgICAgICAgIGRpc2FibGVVbmRlcmxpbmVcbiAgICAgICAgICAgICAgICBsYW5ndWFnZUNoYXJhY3RlcnNQcm9wcz17W3sgbGFuZ3VhZ2U6ICdzcGFuaXNoJyB9LCB7IGxhbmd1YWdlOiAnc3BlY2lhbCcgfV19XG4gICAgICAgICAgICAgICAgbWF0aE1sT3B0aW9ucz17bWF0aE1sT3B0aW9uc31cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvSW5wdXRDb250YWluZXI+XG4gICAgICAgICAgPC9JbnB1dENvbnRhaW5lcldyYXBwZXI+XG4gICAgICAgICl9XG5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICB7cnVicmljbGVzcyA/IChcbiAgICAgICAgICAgIDxSdWJyaWNsZXNzIC8+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxDb250YWluZXI+XG4gICAgICAgICAgICAgIDxEcmFnRHJvcENvbnRleHQgb25EcmFnRW5kPXt0aGlzLmRyYWdFbmR9PlxuICAgICAgICAgICAgICAgIDxEcm9wcGFibGUgZHJvcHBhYmxlSWQ9XCJkcm9wcGFibGVcIj5cbiAgICAgICAgICAgICAgICAgIHsocHJvdmlkZWQpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiB7Li4ucHJvdmlkZWQuZHJvcHBhYmxlUHJvcHN9IHJlZj17cHJvdmlkZWQuaW5uZXJSZWZ9PlxuICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZS5wb2ludHMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHAsIGluZGV4KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3VsZFJlbmRlclBvaW50KGluZGV4LCB2YWx1ZSkgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxEcmFnZ2FibGUga2V5PXtgJHtwLnBvaW50c30tJHtpbmRleH1gfSBpbmRleD17aW5kZXh9IGRyYWdnYWJsZUlkPXtpbmRleC50b1N0cmluZygpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsocHJvdmlkZWQpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENvbmZpZ0hvbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj17cHJvdmlkZWQuaW5uZXJSZWZ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey4uLnByb3ZpZGVkLmRyYWdnYWJsZVByb3BzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsuLi5wcm92aWRlZC5kcmFnSGFuZGxlUHJvcHN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UG9pbnRDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cz17dmFsdWUucG9pbnRzLmxlbmd0aCAtIDEgLSBpbmRleH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ9e3B9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcj17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c0Rlc2NyaXB0b3JzRXJyb3JzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c0Rlc2NyaXB0b3JzRXJyb3JzW3ZhbHVlLnBvaW50cy5sZW5ndGggLSAxIC0gaW5kZXhdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVBbnN3ZXI9e3ZhbHVlLnNhbXBsZUFuc3dlcnMgJiYgdmFsdWUuc2FtcGxlQW5zd2Vyc1tpbmRleF19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGNvbnRlbnQpID0+IHRoaXMuY2hhbmdlQ29udGVudChpbmRleCwgY29udGVudCwgJ3BvaW50cycpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TYW1wbGVDaGFuZ2U9eyhjb250ZW50KSA9PiB0aGlzLmNoYW5nZUNvbnRlbnQoaW5kZXgsIGNvbnRlbnQsICdzYW1wbGVBbnN3ZXJzJyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk1lbnVDaGFuZ2U9eyhjbGlja2VkSXRlbSkgPT4gdGhpcy5vblBvaW50TWVudUNoYW5nZShpbmRleCwgY2xpY2tlZEl0ZW0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0aE1sT3B0aW9ucz17bWF0aE1sT3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbk9wdHM9e3BsdWdpbk9wdHN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Db25maWdIb2xkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRHJhZ2dhYmxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAge3Byb3ZpZGVkLnBsYWNlaG9sZGVyfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9Ecm9wcGFibGU+XG4gICAgICAgICAgICAgIDwvRHJhZ0Ryb3BDb250ZXh0PlxuICAgICAgICAgICAgPC9Db250YWluZXI+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbi8vIHN0eWxlcyBtaWdyYXRlZCB0byBzdHlsZWQtY29tcG9uZW50cyBhYm92ZVxuXG5jb25zdCBSZXZlcnNlID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcnVicmljbGVzcyA9IGZhbHNlLCBjb25maWcgPSB7fSwgcGx1Z2luT3B0cyA9IHt9IH0gPSBwcm9wcyB8fCB7fTtcbiAgY29uc3QgcG9pbnRzID0gQXJyYXkuZnJvbShwcm9wcy52YWx1ZS5wb2ludHMgfHwgW10pLnJldmVyc2UoKTtcbiAgbGV0IHNhbXBsZUFuc3dlcnMgPSBBcnJheS5mcm9tKHByb3BzLnZhbHVlLnNhbXBsZUFuc3dlcnMgfHwgW10pLnJldmVyc2UoKTtcblxuICBpZiAocG9pbnRzLmxlbmd0aCA+IHNhbXBsZUFuc3dlcnMubGVuZ3RoKSB7XG4gICAgc2FtcGxlQW5zd2VycyA9IHRpbWVzKHBvaW50cy5sZW5ndGggLSBzYW1wbGVBbnN3ZXJzLmxlbmd0aClcbiAgICAgIC5tYXAoKCkgPT4gbnVsbClcbiAgICAgIC5jb25jYXQoc2FtcGxlQW5zd2Vycyk7XG4gIH1cblxuICBjb25zdCB2YWx1ZSA9IHsgLi4ucHJvcHMudmFsdWUsIHBvaW50cywgc2FtcGxlQW5zd2VycyB9O1xuXG4gIGNvbnN0IG9uQ2hhbmdlID0gKHZhbHVlKSA9PiB7XG4gICAgcHJvcHMub25DaGFuZ2Uoe1xuICAgICAgLi4udmFsdWUsXG4gICAgICBwb2ludHM6IEFycmF5LmZyb20odmFsdWUucG9pbnRzIHx8IFtdKS5yZXZlcnNlKCksXG4gICAgICBzYW1wbGVBbnN3ZXJzOiBBcnJheS5mcm9tKHZhbHVlLnNhbXBsZUFuc3dlcnMgfHwgW10pLnJldmVyc2UoKSxcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxSYXdBdXRob3JpbmcgdmFsdWU9e3ZhbHVlfSBjb25maWc9e2NvbmZpZ30gb25DaGFuZ2U9e29uQ2hhbmdlfSBydWJyaWNsZXNzPXtydWJyaWNsZXNzfSBwbHVnaW5PcHRzPXtwbHVnaW5PcHRzfSAvPlxuICApO1xufTtcblxuUmV2ZXJzZS5wcm9wVHlwZXMgPSB7XG4gIHZhbHVlOiBSdWJyaWNUeXBlLFxuICBjb25maWc6IFByb3BUeXBlcy5vYmplY3QsXG4gIHBsdWdpbk9wdHM6IFByb3BUeXBlcy5vYmplY3QsXG4gIHJ1YnJpY2xlc3M6IFByb3BUeXBlcy5ib29sLFxuICBnZXRJbmRleDogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJldmVyc2U7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLFdBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLGNBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLFlBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLFNBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLE1BQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFTLFNBQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLFVBQUEsR0FBQVgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFXLGlCQUFBLEdBQUFaLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBWSxXQUFBLEdBQUFiLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBYSxjQUFBLEdBQUFkLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBYyxJQUFBLEdBQUFkLE9BQUE7QUFDQSxJQUFBZSxNQUFBLEdBQUFoQixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQWdCLFVBQUEsR0FBQWpCLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBaUIsVUFBQSxHQUFBbEIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFrQixNQUFBLEdBQUFuQixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQW1CLG1CQUFBLEdBQUFwQixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQW9CLFNBQUEsR0FBQXBCLE9BQUE7QUFDQSxJQUFBcUIsT0FBQSxHQUFBckIsT0FBQTtBQUE0QyxTQUFBc0IsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBRSxNQUFBLENBQUFjLHlCQUFBLEdBQUFkLE1BQUEsQ0FBQWUsZ0JBQUEsQ0FBQWxCLENBQUEsRUFBQUcsTUFBQSxDQUFBYyx5QkFBQSxDQUFBZixDQUFBLEtBQUFILE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLEdBQUFhLE9BQUEsV0FBQWQsQ0FBQSxJQUFBRSxNQUFBLENBQUFnQixjQUFBLENBQUFuQixDQUFBLEVBQUFDLENBQUEsRUFBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBTixDQUFBLEVBQUFELENBQUEsaUJBQUFELENBQUE7QUFBQSxTQUFBb0IsV0FBQWxCLENBQUEsRUFBQUksQ0FBQSxFQUFBTixDQUFBLFdBQUFNLENBQUEsT0FBQWUsZ0JBQUEsYUFBQWYsQ0FBQSxPQUFBZ0IsMkJBQUEsYUFBQXBCLENBQUEsRUFBQXFCLHlCQUFBLEtBQUFDLE9BQUEsQ0FBQUMsU0FBQSxDQUFBbkIsQ0FBQSxFQUFBTixDQUFBLFlBQUFxQixnQkFBQSxhQUFBbkIsQ0FBQSxFQUFBd0IsV0FBQSxJQUFBcEIsQ0FBQSxDQUFBSyxLQUFBLENBQUFULENBQUEsRUFBQUYsQ0FBQTtBQUFBLFNBQUF1QiwwQkFBQSxjQUFBckIsQ0FBQSxJQUFBeUIsT0FBQSxDQUFBQyxTQUFBLENBQUFDLE9BQUEsQ0FBQUMsSUFBQSxDQUFBTixPQUFBLENBQUFDLFNBQUEsQ0FBQUUsT0FBQSxpQ0FBQXpCLENBQUEsYUFBQXFCLHlCQUFBLFlBQUFBLDBCQUFBLGFBQUFyQixDQUFBO0FBRTVDLElBQU02QixHQUFHLEdBQUcsSUFBQUMsaUJBQUssRUFBQywwQkFBMEIsQ0FBQztBQUU3QyxJQUFNQyxPQUFPLEdBQUcsU0FBVkEsT0FBT0EsQ0FBSUMsSUFBSSxFQUFFQyxVQUFVLEVBQUVDLFFBQVEsRUFBSztFQUM5QyxJQUFNQyxNQUFNLEdBQUdDLEtBQUssQ0FBQ0MsSUFBSSxDQUFDTCxJQUFJLENBQUM7RUFDL0IsSUFBQU0sY0FBQSxHQUFrQkgsTUFBTSxDQUFDSSxNQUFNLENBQUNOLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFBQU8sZUFBQSxPQUFBQyxlQUFBLGFBQUFILGNBQUE7SUFBdkNJLE9BQU8sR0FBQUYsZUFBQTtFQUVkTCxNQUFNLENBQUNJLE1BQU0sQ0FBQ0wsUUFBUSxFQUFFLENBQUMsRUFBRVEsT0FBTyxDQUFDO0VBRW5DLE9BQU9QLE1BQU07QUFDZixDQUFDO0FBRU0sSUFBTVEsVUFBVSxHQUFBQyxPQUFBLENBQUFELFVBQUEsR0FBR0UscUJBQVMsQ0FBQ0MsS0FBSyxDQUFDO0VBQ3hDQyxXQUFXLEVBQUVGLHFCQUFTLENBQUNHLElBQUk7RUFDM0JDLE1BQU0sRUFBRUoscUJBQVMsQ0FBQ0ssT0FBTyxDQUFDTCxxQkFBUyxDQUFDTSxNQUFNLENBQUM7RUFDM0NDLGFBQWEsRUFBRVAscUJBQVMsQ0FBQ0ssT0FBTyxDQUFDTCxxQkFBUyxDQUFDTSxNQUFNLENBQUM7RUFDbERFLFNBQVMsRUFBRVIscUJBQVMsQ0FBQ1MsTUFBTTtFQUMzQkMscUJBQXFCLEVBQUVWLHFCQUFTLENBQUNNO0FBQ25DLENBQUMsQ0FBQztBQUVGLElBQU1LLFNBQVMsR0FBRyxTQUFaQSxTQUFTQSxDQUFJQyxLQUFLLEVBQUs7RUFDM0IsSUFBUUMsS0FBSyxHQUFvQkQsS0FBSyxDQUE5QkMsS0FBSztJQUFFQyxTQUFRLEdBQVVGLEtBQUssQ0FBdkJFLFFBQVE7SUFBRUMsR0FBRyxHQUFLSCxLQUFLLENBQWJHLEdBQUc7RUFDNUIsSUFBTUMsT0FBTyxHQUFHLGtCQUFrQjtFQUVsQyxvQkFDRXhGLE1BQUEsWUFBQXlGLGFBQUEsQ0FBQ2pGLFlBQUEsV0FBVztJQUFDa0YsRUFBRSxFQUFFO01BQUVDLFFBQVEsRUFBRSxHQUFHO01BQUVDLENBQUMsRUFBRTtJQUFFLENBQUU7SUFBQ0MsT0FBTyxFQUFDO0VBQVUsZ0JBQzFEN0YsTUFBQSxZQUFBeUYsYUFBQSxDQUFDcEYsV0FBQSxXQUFVO0lBQUN5RixFQUFFLEVBQUVOO0VBQVEsR0FBQyxZQUFzQixDQUFDLGVBQ2hEeEYsTUFBQSxZQUFBeUYsYUFBQSxDQUFDbEYsT0FBQSxXQUFNO0lBQ0xpRixPQUFPLEVBQUVBLE9BQVE7SUFDakJPLEtBQUssRUFBQyxZQUFZO0lBQ2xCVixLQUFLLEVBQUVBLEtBQU07SUFDYkMsUUFBUSxFQUFFLFNBQVZBLFFBQVFBLENBQUc3RCxDQUFDO01BQUEsT0FBSzZELFNBQVEsQ0FBQzdELENBQUMsQ0FBQ3VFLE1BQU0sQ0FBQ1gsS0FBSyxDQUFDO0lBQUEsQ0FBQztJQUMxQ1ksS0FBSyxlQUFFakcsTUFBQSxZQUFBeUYsYUFBQSxDQUFDbkYsY0FBQSxXQUFhO01BQUN5RixLQUFLLEVBQUM7SUFBWSxDQUFFLENBQUU7SUFDNUNHLFNBQVMsRUFBRTtNQUFFQyxrQkFBa0IsRUFBRTtRQUFFQyxLQUFLLEVBQUUsR0FBRztRQUFFQyxJQUFJLEVBQUU7TUFBSTtJQUFFO0VBQUUsR0FFNUQsSUFBQUMsaUJBQUssRUFBQyxDQUFDLEVBQUVmLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQ2dCLEdBQUcsQ0FBQyxVQUFDQyxDQUFDO0lBQUEsb0JBQ3ZCeEcsTUFBQSxZQUFBeUYsYUFBQSxDQUFDaEYsU0FBQSxXQUFRO01BQUNnRyxHQUFHLEtBQUFDLE1BQUEsQ0FBS0YsQ0FBQyxDQUFHO01BQUNuQixLQUFLLEVBQUVtQjtJQUFFLEdBQzdCQSxDQUNPLENBQUM7RUFBQSxDQUNaLENBQ0ssQ0FDRyxDQUFDO0FBRWxCLENBQUM7O0FBRUQ7QUFDQTtBQUNBLElBQU1HLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBaUJBLENBQUlDLFlBQVk7RUFBQSxPQUFLQSxZQUFZLEtBQUssSUFBSSxJQUFJQSxZQUFZLEtBQUssTUFBTTtBQUFBO0FBRTVGLElBQU1DLEdBQUcsR0FBRyxJQUFBQyxjQUFNLEVBQUMsS0FBSyxDQUFDLENBQUM7RUFBQSxPQUFPO0lBQUVDLE9BQU8sRUFBRSxNQUFNO0lBQUVDLEtBQUssRUFBRSxNQUFNO0lBQUVDLFFBQVEsRUFBRTtFQUFXLENBQUM7QUFBQSxDQUFDLENBQUM7QUFFM0YsSUFBTUMsU0FBUyxHQUFHLElBQUFKLGNBQU0sRUFBQyxLQUFLLENBQUMsQ0FBQyxVQUFBSyxJQUFBO0VBQUEsSUFBR0MsS0FBSyxHQUFBRCxJQUFBLENBQUxDLEtBQUs7RUFBQSxPQUFRO0lBQUVKLEtBQUssRUFBRSxNQUFNO0lBQUVLLGVBQWUsS0FBQVgsTUFBQSxDQUFLVSxLQUFLLENBQUNFLE9BQU8sQ0FBQ0MsTUFBTSxDQUFDQyxLQUFLO0VBQUcsQ0FBQztBQUFBLENBQUMsQ0FBQztBQUVySCxJQUFNQyxtQkFBbUIsR0FBRyxJQUFBWCxjQUFNLEVBQUNZLHlCQUFhLENBQUMsQ0FBQyxVQUFBQyxLQUFBO0VBQUEsSUFBR1AsS0FBSyxHQUFBTyxLQUFBLENBQUxQLEtBQUs7RUFBQSxPQUFRO0lBQUVRLFVBQVUsRUFBRVIsS0FBSyxDQUFDUyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQUVDLEtBQUssRUFBRUMsWUFBSSxDQUFDLEdBQUc7RUFBRSxDQUFDO0FBQUEsQ0FBQyxDQUFDO0FBRXRILElBQU1DLFdBQVcsR0FBRyxJQUFBbEIsY0FBTSxFQUFDbUIsc0JBQVUsQ0FBQyxDQUFDLFVBQUFDLEtBQUE7RUFBQSxJQUFHZCxLQUFLLEdBQUFjLEtBQUEsQ0FBTGQsS0FBSztFQUFBLE9BQVE7SUFDckRVLEtBQUssRUFBRUMsWUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNoQkksYUFBYSxFQUFFZixLQUFLLENBQUNTLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDL0JPLGFBQWEsRUFBRTtFQUNqQixDQUFDO0FBQUEsQ0FBQyxDQUFDO0FBRUgsSUFBTUMsbUJBQW1CLEdBQUcsSUFBQXZCLGNBQU0sRUFBQyxLQUFLLENBQUMsQ0FBQyxVQUFBd0IsS0FBQTtFQUFBLElBQUdsQixLQUFLLEdBQUFrQixLQUFBLENBQUxsQixLQUFLO0VBQUEsT0FBUTtJQUFFbUIsV0FBVyxFQUFFbkIsS0FBSyxDQUFDUyxPQUFPLENBQUMsQ0FBQztFQUFFLENBQUM7QUFBQSxDQUFDLENBQUM7QUFFN0YsSUFBTVcsU0FBUyxHQUFHLElBQUExQixjQUFNLEVBQUMsS0FBSyxDQUFDLENBQUMsVUFBQTJCLEtBQUE7RUFBQSxJQUFHckIsS0FBSyxHQUFBcUIsS0FBQSxDQUFMckIsS0FBSztFQUFBLE9BQVE7SUFDOUNzQixRQUFRLEVBQUV0QixLQUFLLENBQUN1QixVQUFVLENBQUNELFFBQVEsR0FBRyxDQUFDO0lBQ3ZDWixLQUFLLEVBQUVWLEtBQUssQ0FBQ0UsT0FBTyxDQUFDc0IsS0FBSyxDQUFDQyxJQUFJO0lBQy9CTixXQUFXLEVBQUVuQixLQUFLLENBQUNTLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDN0JELFVBQVUsRUFBRVIsS0FBSyxDQUFDUyxPQUFPLENBQUMsQ0FBQztFQUM3QixDQUFDO0FBQUEsQ0FBQyxDQUFDO0FBRUgsSUFBTWlCLGdCQUFnQixHQUFHLElBQUFoQyxjQUFNLEVBQUMsS0FBSyxDQUFDLENBQUM7RUFBQSxPQUFPO0lBQUVHLFFBQVEsRUFBRSxVQUFVO0lBQUU4QixLQUFLLEVBQUU7RUFBRSxDQUFDO0FBQUEsQ0FBQyxDQUFDO0FBRTNFLElBQU1DLFdBQVcsR0FBQXpFLE9BQUEsQ0FBQXlFLFdBQUEsR0FBRyxTQUFkQSxXQUFXQSxDQUFJNUQsS0FBSyxFQUFLO0VBQ3BDLElBQVFSLE1BQU0sR0FBd0VRLEtBQUssQ0FBbkZSLE1BQU07SUFBRXFFLE9BQU8sR0FBK0Q3RCxLQUFLLENBQTNFNkQsT0FBTztJQUFFckMsWUFBWSxHQUFpRHhCLEtBQUssQ0FBbEV3QixZQUFZO0lBQUFzQyxvQkFBQSxHQUFpRDlELEtBQUssQ0FBcEQrRCxhQUFhO0lBQWJBLGFBQWEsR0FBQUQsb0JBQUEsY0FBRyxDQUFDLENBQUMsR0FBQUEsb0JBQUE7SUFBRU4sS0FBSyxHQUFzQnhELEtBQUssQ0FBaEN3RCxLQUFLO0lBQUFRLGlCQUFBLEdBQXNCaEUsS0FBSyxDQUF6QmlFLFVBQVU7SUFBVkEsVUFBVSxHQUFBRCxpQkFBQSxjQUFHLENBQUMsQ0FBQyxHQUFBQSxpQkFBQTtFQUNqRixJQUFNRSxXQUFXLE1BQUE1QyxNQUFBLENBQU05QixNQUFNLE9BQUE4QixNQUFBLENBQUk5QixNQUFNLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUU7RUFDN0QsSUFBTTJFLGdCQUFnQixHQUFHNUMsaUJBQWlCLENBQUNDLFlBQVksQ0FBQztFQUV4RCxvQkFDRTVHLE1BQUEsWUFBQXlGLGFBQUEsMkJBQ0V6RixNQUFBLFlBQUF5RixhQUFBLENBQUN1QyxXQUFXO0lBQUNuQyxPQUFPLEVBQUM7RUFBVSxHQUFFeUQsV0FBeUIsQ0FBQyxlQUMzRHRKLE1BQUEsWUFBQXlGLGFBQUEsQ0FBQ29CLEdBQUcscUJBQ0Y3RyxNQUFBLFlBQUF5RixhQUFBLENBQUNnQyxtQkFBbUIsTUFBRSxDQUFDLGVBQ3ZCekgsTUFBQSxZQUFBeUYsYUFBQSxDQUFDeUIsU0FBUyxxQkFDUmxILE1BQUEsWUFBQXlGLGFBQUEsQ0FBQ3BFLG1CQUFBLFdBQVk7SUFDWHVILEtBQUssRUFBRUEsS0FBTTtJQUNiWSxXQUFXLEVBQUVILFVBQVc7SUFDeEJJLE1BQU0sRUFBRVIsT0FBUTtJQUNoQjNELFFBQVEsRUFBRUYsS0FBSyxDQUFDRSxRQUFTO0lBQ3pCNkQsYUFBYSxFQUFFQTtFQUFjLENBQzlCLENBQ1EsQ0FBQyxlQUNabkosTUFBQSxZQUFBeUYsYUFBQSxDQUFDcUQsZ0JBQWdCLHFCQUNmOUksTUFBQSxZQUFBeUYsYUFBQSxDQUFDdEUsVUFBQSxXQUFTO0lBQUNvSSxnQkFBZ0IsRUFBRUEsZ0JBQWlCO0lBQUNqRSxRQUFRLEVBQUVGLEtBQUssQ0FBQ3NFO0VBQWEsQ0FBRSxDQUM5RCxDQUNmLENBQUMsRUFDTGQsS0FBSyxpQkFBSTVJLE1BQUEsWUFBQXlGLGFBQUEsQ0FBQytDLFNBQVMsUUFBRUksS0FBaUIsQ0FBQyxFQUN2QyxDQUFDVyxnQkFBZ0IsaUJBQ2hCdkosTUFBQSxZQUFBeUYsYUFBQSxDQUFDNEMsbUJBQW1CLHFCQUNsQnJJLE1BQUEsWUFBQXlGLGFBQUEsQ0FBQ2dDLG1CQUFtQjtJQUFDa0MsRUFBRSxFQUFFMUIsc0JBQVc7SUFBQ3BDLE9BQU8sRUFBQztFQUFVLEdBQUMsaUJBRW5DLENBQUMsZUFDdEI3RixNQUFBLFlBQUF5RixhQUFBLENBQUN5QixTQUFTLHFCQUNSbEgsTUFBQSxZQUFBeUYsYUFBQSxDQUFDcEUsbUJBQUEsV0FBWTtJQUNYb0ksTUFBTSxFQUFFN0MsWUFBYTtJQUNyQjRDLFdBQVcsRUFBRUgsVUFBVztJQUN4Qi9ELFFBQVEsRUFBRUYsS0FBSyxDQUFDd0UsY0FBZTtJQUMvQlQsYUFBYSxFQUFFQTtFQUFjLENBQzlCLENBQ1EsQ0FDUSxDQUVwQixDQUFDO0FBRVYsQ0FBQztBQUVELElBQU1VLFNBQVMsR0FBRyxJQUFBL0MsY0FBTSxFQUFDLEtBQUssQ0FBQyxDQUFDLFVBQUFnRCxLQUFBO0VBQUEsSUFBRzFDLEtBQUssR0FBQTBDLEtBQUEsQ0FBTDFDLEtBQUs7RUFBQSxPQUFRO0lBQzlDQyxlQUFlLEVBQUVVLFlBQUksQ0FBQyxHQUFHLENBQUM7SUFDMUJnQyxXQUFXLEVBQUUsQ0FBQztJQUNkQyxXQUFXLEVBQUUsT0FBTztJQUNwQkMsV0FBVyxFQUFFbEMsWUFBSSxDQUFDLEdBQUcsQ0FBQztJQUN0Qm1DLE9BQU8sRUFBRTlDLEtBQUssQ0FBQ1MsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN6QnNDLE1BQU0sRUFBRS9DLEtBQUssQ0FBQ1MsT0FBTyxDQUFDLENBQUM7RUFDekIsQ0FBQztBQUFBLENBQUMsQ0FBQztBQUNILElBQU11QyxxQkFBcUIsR0FBRyxJQUFBdEQsY0FBTSxFQUFDLEtBQUssQ0FBQyxDQUFDLFVBQUF1RCxLQUFBO0VBQUEsSUFBR2pELEtBQUssR0FBQWlELEtBQUEsQ0FBTGpELEtBQUs7RUFBQSxPQUFRO0lBQzFESixLQUFLLEVBQUUsTUFBTTtJQUNiWSxVQUFVLEVBQUVSLEtBQUssQ0FBQ1MsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM1QnlDLFlBQVksRUFBRWxELEtBQUssQ0FBQ1MsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM5Qix1QkFBdUIsRUFBRTtNQUFFYixLQUFLLEVBQUU7SUFBTztFQUMzQyxDQUFDO0FBQUEsQ0FBQyxDQUFDO0FBQ0gsSUFBTXVELFVBQVUsR0FBRyxJQUFBekQsY0FBTSxFQUFDLEtBQUssQ0FBQyxDQUFDO0VBQUEsT0FBTztJQUFFQyxPQUFPLEVBQUU7RUFBTyxDQUFDO0FBQUEsQ0FBQyxDQUFDO0FBQzdELElBQU15RCxZQUFZLEdBQUcsSUFBQTFELGNBQU0sRUFBQyxLQUFLLENBQUMsQ0FBQyxVQUFBMkQsS0FBQTtFQUFBLElBQUdyRCxLQUFLLEdBQUFxRCxLQUFBLENBQUxyRCxLQUFLO0VBQUEsT0FBUTtJQUFFUSxVQUFVLEVBQUVSLEtBQUssQ0FBQ1MsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUFFTSxhQUFhLEVBQUVmLEtBQUssQ0FBQ1MsT0FBTyxDQUFDLENBQUM7RUFBRSxDQUFDO0FBQUEsQ0FBQyxDQUFDO0FBQ3RILElBQU02QyxXQUFXLEdBQUcsSUFBQTVELGNBQU0sRUFBQ21CLHNCQUFVLENBQUMsQ0FBQyxVQUFBMEMsS0FBQTtFQUFBLElBQUd2RCxLQUFLLEdBQUF1RCxLQUFBLENBQUx2RCxLQUFLO0VBQUEsT0FBUTtJQUFFbUIsV0FBVyxFQUFFbkIsS0FBSyxDQUFDUyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQUVzQyxNQUFNLEVBQUUvQyxLQUFLLENBQUNTLE9BQU8sQ0FBQyxDQUFDO0VBQUUsQ0FBQztBQUFBLENBQUMsQ0FBQztBQUFDLElBRXhHK0MsWUFBWSxHQUFBckcsT0FBQSxDQUFBcUcsWUFBQSwwQkFBQUMsZ0JBQUE7RUFBQSxTQUFBRCxhQUFBO0lBQUEsSUFBQUUsS0FBQTtJQUFBLElBQUFDLGdCQUFBLG1CQUFBSCxZQUFBO0lBQUEsU0FBQUksSUFBQSxHQUFBMUksU0FBQSxDQUFBQyxNQUFBLEVBQUEwSSxJQUFBLE9BQUFsSCxLQUFBLENBQUFpSCxJQUFBLEdBQUFFLElBQUEsTUFBQUEsSUFBQSxHQUFBRixJQUFBLEVBQUFFLElBQUE7TUFBQUQsSUFBQSxDQUFBQyxJQUFBLElBQUE1SSxTQUFBLENBQUE0SSxJQUFBO0lBQUE7SUFBQUosS0FBQSxHQUFBakksVUFBQSxPQUFBK0gsWUFBQSxLQUFBbEUsTUFBQSxDQUFBdUUsSUFBQTtJQUFBLElBQUF4SSxnQkFBQSxhQUFBcUksS0FBQSxhQVdiLFVBQUNoSCxNQUFNLEVBQUs7TUFDcEIsSUFBSSxDQUFDQSxNQUFNLENBQUNxSCxXQUFXLEVBQUU7UUFDdkI7TUFDRjtNQUVBLElBQUFDLFdBQUEsR0FBNEJOLEtBQUEsQ0FBSzFGLEtBQUs7UUFBOUJDLEtBQUssR0FBQStGLFdBQUEsQ0FBTC9GLEtBQUs7UUFBRUMsUUFBUSxHQUFBOEYsV0FBQSxDQUFSOUYsUUFBUTtNQUV2QixJQUFNVixNQUFNLEdBQUdsQixPQUFPLENBQUMyQixLQUFLLENBQUNULE1BQU0sRUFBRWQsTUFBTSxDQUFDdUgsTUFBTSxDQUFDQyxLQUFLLEVBQUV4SCxNQUFNLENBQUNxSCxXQUFXLENBQUNHLEtBQUssQ0FBQztNQUNuRixJQUFNdkcsYUFBYSxHQUFHckIsT0FBTyxDQUFDMkIsS0FBSyxDQUFDTixhQUFhLEVBQUVqQixNQUFNLENBQUN1SCxNQUFNLENBQUNDLEtBQUssRUFBRXhILE1BQU0sQ0FBQ3FILFdBQVcsQ0FBQ0csS0FBSyxDQUFDO01BRWpHaEcsUUFBUSxDQUFBakQsYUFBQSxDQUFBQSxhQUFBLEtBQU1nRCxLQUFLO1FBQUVULE1BQU0sRUFBTkEsTUFBTTtRQUFFRyxhQUFhLEVBQWJBO01BQWEsRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFBQSxJQUFBdEMsZ0JBQUEsYUFBQXFJLEtBQUEsaUNBRTZCLFVBQUM3RSxLQUFLLEVBQUs7TUFDdkMsSUFBQXNGLFlBQUEsR0FBNEJULEtBQUEsQ0FBSzFGLEtBQUs7UUFBOUJDLEtBQUssR0FBQWtHLFlBQUEsQ0FBTGxHLEtBQUs7UUFBRUMsUUFBUSxHQUFBaUcsWUFBQSxDQUFSakcsUUFBUTtNQUN2QkEsUUFBUSxDQUFBakQsYUFBQSxDQUFBQSxhQUFBLEtBQU1nRCxLQUFLO1FBQUVILHFCQUFxQixFQUFFZTtNQUFLLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBQUEsSUFBQXhELGdCQUFBLGFBQUFxSSxLQUFBLHFCQUVpQixVQUFDOUYsU0FBUyxFQUFLO01BQy9CLElBQUF3RyxZQUFBLEdBQXdDVixLQUFBLENBQUsxRixLQUFLO1FBQTFDQyxLQUFLLEdBQUFtRyxZQUFBLENBQUxuRyxLQUFLO1FBQUVDLFFBQVEsR0FBQWtHLFlBQUEsQ0FBUmxHLFFBQVE7UUFBRW1HLFVBQVUsR0FBQUQsWUFBQSxDQUFWQyxVQUFVO01BQ25DLElBQU1DLFVBQVUsR0FBR3JHLEtBQUssQ0FBQ1QsTUFBTSxDQUFDckMsTUFBTSxHQUFHLENBQUM7TUFFMUNpQixHQUFHLENBQUMsU0FBUyxFQUFFa0ksVUFBVSxFQUFFLE9BQU8sRUFBRTFHLFNBQVMsQ0FBQztNQUU5QyxJQUFJSixNQUFNLEVBQUVHLGFBQWE7TUFDekIsSUFBSUMsU0FBUyxHQUFHMEcsVUFBVSxFQUFFO1FBQzFCOUcsTUFBTSxHQUFHLElBQUErRyxpQkFBSyxFQUFDM0csU0FBUyxHQUFHMEcsVUFBVSxDQUFDLENBQ25DbkYsR0FBRyxDQUFDO1VBQUEsT0FBTSxFQUFFO1FBQUEsRUFBQyxDQUNiRyxNQUFNLENBQUNyQixLQUFLLENBQUNULE1BQU0sQ0FBQztRQUN2QkcsYUFBYSxHQUFHLElBQUE0RyxpQkFBSyxFQUFDM0csU0FBUyxHQUFHMEcsVUFBVSxDQUFDLENBQzFDbkYsR0FBRyxDQUFDO1VBQUEsT0FBTSxJQUFJO1FBQUEsRUFBQyxDQUNmRyxNQUFNLENBQUNyQixLQUFLLENBQUNOLGFBQWEsQ0FBQztNQUNoQztNQUVBLElBQUlDLFNBQVMsR0FBRzBHLFVBQVUsRUFBRTtRQUMxQmxJLEdBQUcsQ0FBQyxXQUFXLENBQUM7UUFDaEJvQixNQUFNLEdBQUcsSUFBQWdILHFCQUFTLEVBQUN2RyxLQUFLLENBQUNULE1BQU0sRUFBRUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUMvQ0QsYUFBYSxHQUFHLElBQUE2RyxxQkFBUyxFQUFDdkcsS0FBSyxDQUFDTixhQUFhLEVBQUVDLFNBQVMsR0FBRyxDQUFDLENBQUM7TUFDL0Q7TUFFQSxJQUFJSixNQUFNLElBQUksQ0FBQzZHLFVBQVUsRUFBRTtRQUN6Qm5HLFFBQVEsQ0FBQWpELGFBQUEsQ0FBQUEsYUFBQSxLQUFNZ0QsS0FBSztVQUFFVCxNQUFNLEVBQU5BLE1BQU07VUFBRUcsYUFBYSxFQUFiQSxhQUFhO1VBQUVDLFNBQVMsRUFBVEE7UUFBUyxFQUFFLENBQUM7TUFDMUQsQ0FBQyxNQUFNO1FBQ0xNLFFBQVEsQ0FBQWpELGFBQUEsQ0FBQUEsYUFBQSxLQUFNZ0QsS0FBSztVQUFFTCxTQUFTLEVBQVRBO1FBQVMsRUFBRSxDQUFDO01BQ25DO0lBQ0YsQ0FBQztJQUFBLElBQUF2QyxnQkFBQSxhQUFBcUksS0FBQSxtQkFFZSxVQUFDUSxLQUFLLEVBQUVyQyxPQUFPLEVBQUU0QyxJQUFJLEVBQUs7TUFDeEM7TUFDQXJJLEdBQUcsZ0JBQUFrRCxNQUFBLENBQWdCbUYsSUFBSSxTQUFNUCxLQUFLLEVBQUVyQyxPQUFPLENBQUM7TUFFNUMsSUFBSTRDLElBQUksS0FBSyxRQUFRLElBQUlBLElBQUksS0FBSyxlQUFlLEVBQUU7UUFDakQ7TUFDRjtNQUVBLElBQUFDLFlBQUEsR0FBNEJoQixLQUFBLENBQUsxRixLQUFLO1FBQTlCQyxLQUFLLEdBQUF5RyxZQUFBLENBQUx6RyxLQUFLO1FBQUVDLFFBQVEsR0FBQXdHLFlBQUEsQ0FBUnhHLFFBQVE7TUFDdkIsSUFBTXlHLEtBQUssR0FBRzFHLEtBQUssQ0FBQ3dHLElBQUksQ0FBQyxJQUFJOUgsS0FBSyxDQUFDQyxJQUFJLENBQUNxQixLQUFLLENBQUN3RyxJQUFJLENBQUMsQ0FBQztNQUVwREUsS0FBSyxDQUFDN0gsTUFBTSxDQUFDb0gsS0FBSyxFQUFFLENBQUMsRUFBRXJDLE9BQU8sQ0FBQztNQUMvQnpGLEdBQUcsZ0JBQUFrRCxNQUFBLENBQWdCbUYsSUFBSSxTQUFNRSxLQUFLLENBQUM7TUFFbkN6RyxRQUFRLENBQUFqRCxhQUFBLENBQUFBLGFBQUEsS0FBTWdELEtBQUssV0FBQTVDLGdCQUFBLGlCQUFHb0osSUFBSSxFQUFHRSxLQUFLLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBQUEsSUFBQXRKLGdCQUFBLGFBQUFxSSxLQUFBLGtCQUVjLFlBQU07TUFDbkIsSUFBQWtCLFlBQUEsR0FBNEJsQixLQUFBLENBQUsxRixLQUFLO1FBQTlCQyxLQUFLLEdBQUEyRyxZQUFBLENBQUwzRyxLQUFLO1FBQUVDLFFBQVEsR0FBQTBHLFlBQUEsQ0FBUjFHLFFBQVE7TUFFdkJBLFFBQVEsQ0FBQWpELGFBQUEsQ0FBQUEsYUFBQSxLQUFNZ0QsS0FBSztRQUFFWCxXQUFXLEVBQUUsQ0FBQ1csS0FBSyxDQUFDWDtNQUFXLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBQUEsSUFBQWpDLGdCQUFBLGFBQUFxSSxLQUFBLHVCQUVtQixVQUFDUSxLQUFLLEVBQUVqRyxLQUFLLEVBQUs7TUFDcEMsSUFBSSxDQUFDQSxLQUFLLENBQUNYLFdBQVcsRUFBRTtRQUN0QixPQUFPLElBQUk7TUFDYixDQUFDLE1BQU07UUFDTCxJQUFJNEcsS0FBSyxHQUFHakcsS0FBSyxDQUFDVCxNQUFNLENBQUNyQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1VBQ25DLE9BQU8sSUFBSTtRQUNiLENBQUMsTUFBTSxJQUFJK0ksS0FBSyxLQUFLakcsS0FBSyxDQUFDVCxNQUFNLENBQUNyQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1VBQzVDLE9BQU8sS0FBSztRQUNkO1FBRUEsT0FBTyxJQUFJO01BQ2I7SUFDRixDQUFDO0lBQUEsSUFBQUUsZ0JBQUEsYUFBQXFJLEtBQUEsdUJBRW1CLFVBQUNRLEtBQUssRUFBRVcsV0FBVyxFQUFLO01BQzFDLElBQUlBLFdBQVcsS0FBSyxRQUFRLEVBQUU7UUFDNUIsSUFBUTVHLEtBQUssR0FBS3lGLEtBQUEsQ0FBSzFGLEtBQUssQ0FBcEJDLEtBQUs7UUFDYixJQUFNTixhQUFhLEdBQUdoQixLQUFLLENBQUNDLElBQUksQ0FBQ3FCLEtBQUssQ0FBQ04sYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUUzRCxJQUFJNEIsaUJBQWlCLENBQUM1QixhQUFhLENBQUN1RyxLQUFLLENBQUMsQ0FBQyxFQUFFO1VBQzNDO1VBQ0FSLEtBQUEsQ0FBS29CLGFBQWEsQ0FBQ1osS0FBSyxFQUFFLEVBQUUsRUFBRSxlQUFlLENBQUM7UUFDaEQsQ0FBQyxNQUFNO1VBQ0w7VUFDQVIsS0FBQSxDQUFLb0IsYUFBYSxDQUFDWixLQUFLLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQztRQUNsRDtNQUNGO0lBQ0YsQ0FBQztJQUFBLE9BQUFSLEtBQUE7RUFBQTtFQUFBLElBQUFxQixVQUFBLGFBQUF2QixZQUFBLEVBQUFDLGdCQUFBO0VBQUEsV0FBQXVCLGFBQUEsYUFBQXhCLFlBQUE7SUFBQW5FLEdBQUE7SUFBQXBCLEtBQUEsRUFFRCxTQUFBZ0gsTUFBTUEsQ0FBQSxFQUFHO01BQUEsSUFBQUMsTUFBQTtNQUNQLElBQUFDLFlBQUEsR0FBd0YsSUFBSSxDQUFDbkgsS0FBSztRQUExRkMsS0FBSyxHQUFBa0gsWUFBQSxDQUFMbEgsS0FBSztRQUFBbUgscUJBQUEsR0FBQUQsWUFBQSxDQUFFcEQsYUFBYTtRQUFiQSxhQUFhLEdBQUFxRCxxQkFBQSxjQUFHLENBQUMsQ0FBQyxHQUFBQSxxQkFBQTtRQUFBQyxtQkFBQSxHQUFBRixZQUFBLENBQUVHLE1BQU07UUFBTkEsTUFBTSxHQUFBRCxtQkFBQSxjQUFHLENBQUMsQ0FBQyxHQUFBQSxtQkFBQTtRQUFBRSxxQkFBQSxHQUFBSixZQUFBLENBQUVkLFVBQVU7UUFBVkEsVUFBVSxHQUFBa0IscUJBQUEsY0FBRyxLQUFLLEdBQUFBLHFCQUFBO1FBQUFDLHFCQUFBLEdBQUFMLFlBQUEsQ0FBRWxELFVBQVU7UUFBVkEsVUFBVSxHQUFBdUQscUJBQUEsY0FBRyxDQUFDLENBQUMsR0FBQUEscUJBQUE7TUFDbkYsSUFBQUMsS0FBQSxHQU1JeEgsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUFBeUgscUJBQUEsR0FBQUQsS0FBQSxDQUxiRSxrQkFBa0I7UUFBbEJBLGtCQUFrQixHQUFBRCxxQkFBQSxjQUFHLElBQUksR0FBQUEscUJBQUE7UUFBQUUscUJBQUEsR0FBQUgsS0FBQSxDQUN6QkksZ0JBQWdCO1FBQWhCQSxnQkFBZ0IsR0FBQUQscUJBQUEsY0FBRyxJQUFJLEdBQUFBLHFCQUFBO1FBQUFFLFlBQUEsR0FBQUwsS0FBQSxDQUN2Qk0sTUFBTTtRQUFOQSxNQUFNLEdBQUFELFlBQUEsY0FBRyxDQUFDLENBQUMsR0FBQUEsWUFBQTtRQUFBRSxxQkFBQSxHQUFBUCxLQUFBLENBQ1hRLDRCQUE0QjtRQUE1QkEsNEJBQTRCLEdBQUFELHFCQUFBLGNBQUcsS0FBSyxHQUFBQSxxQkFBQTtRQUFBRSxlQUFBLEdBQUFULEtBQUEsQ0FDcEM3SCxTQUFTO1FBQVRBLFNBQVMsR0FBQXNJLGVBQUEsY0FBRyxFQUFFLEdBQUFBLGVBQUE7TUFFaEI7TUFDQSxJQUFBQyxLQUFBLEdBQTBEYixNQUFNLElBQUksQ0FBQyxDQUFDO1FBQUFjLHFCQUFBLEdBQUFELEtBQUEsQ0FBOURySSxxQkFBcUI7UUFBckJBLHFCQUFxQixHQUFBc0kscUJBQUEsY0FBRyxDQUFDLENBQUMsR0FBQUEscUJBQUE7UUFBQUMsa0JBQUEsR0FBQUYsS0FBQSxDQUFFRyxZQUFZO1FBQVpBLFlBQVksR0FBQUQsa0JBQUEsY0FBRyxFQUFFLEdBQUFBLGtCQUFBO01BQ3JELElBQUFFLE1BQUEsR0FBb0NSLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFBeENTLHVCQUF1QixHQUFBRCxNQUFBLENBQXZCQyx1QkFBdUI7TUFDL0IsSUFBSXZJLEtBQUssSUFBSXdJLE1BQU0sQ0FBQ0MsUUFBUSxDQUFDekksS0FBSyxDQUFDTCxTQUFTLENBQUMsRUFBRTtRQUM3QztRQUNBK0ksT0FBTyxDQUFDQyxJQUFJLENBQUMsNkNBQTZDLENBQUM7TUFDN0Q7O01BRUE7TUFDQSxJQUFNQyxjQUFjLEdBQUcsQ0FBQ3hDLFVBQVUsR0FBR3BHLEtBQUssQ0FBQ1QsTUFBTSxDQUFDckMsTUFBTSxHQUFHLENBQUMsR0FBR3lDLFNBQVM7TUFFeEUsb0JBQ0VoRixNQUFBLFlBQUF5RixhQUFBLDJCQUNFekYsTUFBQSxZQUFBeUYsYUFBQSxDQUFDaUYsV0FBVztRQUFDN0UsT0FBTyxFQUFDO01BQUksR0FBQyxRQUFtQixDQUFDLGVBQzlDN0YsTUFBQSxZQUFBeUYsYUFBQSxDQUFDN0UsVUFBQSxXQUFTO1FBQUNzTixHQUFHO01BQUEsR0FDWGpCLGdCQUFnQixpQkFDZmpOLE1BQUEsWUFBQXlGLGFBQUEsQ0FBQ04sU0FBUztRQUNSSSxHQUFHLEVBQUVtSSxZQUFZLEdBQUcsR0FBRyxHQUFHQSxZQUFZLEdBQUcsR0FBSTtRQUM3Q3JJLEtBQUssRUFBRTRJLGNBQWU7UUFDdEIzSSxRQUFRLEVBQUUsSUFBSSxDQUFDNkksZUFBZ0I7UUFDL0I5RSxVQUFVLEVBQUVBO01BQVcsQ0FDeEIsQ0FDRixFQUNBMEQsa0JBQWtCLGlCQUNqQi9NLE1BQUEsWUFBQXlGLGFBQUEsQ0FBQzVFLGlCQUFBLFdBQWdCO1FBQ2ZrRixLQUFLLEVBQUMsZUFBZTtRQUNyQnFJLE9BQU8sZUFBRXBPLE1BQUEsWUFBQXlGLGFBQUEsQ0FBQzlFLFNBQUEsV0FBUTtVQUFDME4sT0FBTyxFQUFFaEosS0FBSyxDQUFDWCxXQUFZO1VBQUNZLFFBQVEsRUFBRSxJQUFJLENBQUNnSjtRQUFhLENBQUU7TUFBRSxDQUNoRixDQUVNLENBQUMsRUFFWGpCLDRCQUE0QixJQUFJNUIsVUFBVSxpQkFDekN6TCxNQUFBLFlBQUF5RixhQUFBLENBQUMyRSxxQkFBcUIscUJBQ3BCcEssTUFBQSxZQUFBeUYsYUFBQSxDQUFDbkUsU0FBQSxDQUFBaU4sY0FBYztRQUFDeEksS0FBSyxFQUFFYixxQkFBcUIsQ0FBQ2E7TUFBTSxnQkFDakQvRixNQUFBLFlBQUF5RixhQUFBLENBQUNwRSxtQkFBQSxXQUFZO1FBQ1hvSSxNQUFNLEVBQUVwRSxLQUFLLENBQUNILHFCQUFxQixJQUFJLEVBQUc7UUFDMUNJLFFBQVEsRUFBRSxJQUFJLENBQUNrSiwyQkFBNEI7UUFDM0NoRixXQUFXLEVBQUVILFVBQVc7UUFDeEJvRixRQUFRLEVBQUUsS0FBTTtRQUNoQkMsZ0JBQWdCO1FBQ2hCQyx1QkFBdUIsRUFBRSxDQUFDO1VBQUVDLFFBQVEsRUFBRTtRQUFVLENBQUMsRUFBRTtVQUFFQSxRQUFRLEVBQUU7UUFBVSxDQUFDLENBQUU7UUFDNUV6RixhQUFhLEVBQUVBO01BQWMsQ0FDOUIsQ0FDYSxDQUNLLENBQ3hCLGVBRURuSixNQUFBLFlBQUF5RixhQUFBLGNBQ0dnRyxVQUFVLGdCQUNUekwsTUFBQSxZQUFBeUYsYUFBQSxDQUFDOEUsVUFBVSxNQUFFLENBQUMsZ0JBRWR2SyxNQUFBLFlBQUF5RixhQUFBLENBQUNvRSxTQUFTLHFCQUNSN0osTUFBQSxZQUFBeUYsYUFBQSxDQUFDekUsSUFBQSxDQUFBNk4sZUFBZTtRQUFDQyxTQUFTLEVBQUUsSUFBSSxDQUFDQztNQUFRLGdCQUN2Qy9PLE1BQUEsWUFBQXlGLGFBQUEsQ0FBQ3pFLElBQUEsQ0FBQWdPLFNBQVM7UUFBQ0MsV0FBVyxFQUFDO01BQVcsR0FDL0IsVUFBQ0MsUUFBUTtRQUFBLG9CQUNSbFAsTUFBQSxZQUFBeUYsYUFBQSxZQUFBMEosU0FBQSxpQkFBU0QsUUFBUSxDQUFDRSxjQUFjO1VBQUVDLEdBQUcsRUFBRUgsUUFBUSxDQUFDSTtRQUFTLElBQ3REakssS0FBSyxDQUFDVCxNQUFNLENBQUMyQixHQUFHLENBQ2YsVUFBQ2dKLENBQUMsRUFBRWpFLEtBQUs7VUFBQSxPQUNQZ0IsTUFBSSxDQUFDa0QsaUJBQWlCLENBQUNsRSxLQUFLLEVBQUVqRyxLQUFLLENBQUMsaUJBQ2xDckYsTUFBQSxZQUFBeUYsYUFBQSxDQUFDekUsSUFBQSxDQUFBeU8sU0FBUztZQUFDaEosR0FBRyxLQUFBQyxNQUFBLENBQUs2SSxDQUFDLENBQUMzSyxNQUFNLE9BQUE4QixNQUFBLENBQUk0RSxLQUFLLENBQUc7WUFBQ0EsS0FBSyxFQUFFQSxLQUFNO1lBQUNvRSxXQUFXLEVBQUVwRSxLQUFLLENBQUNxRSxRQUFRLENBQUM7VUFBRSxHQUNqRixVQUFDVCxRQUFRO1lBQUEsb0JBQ1JsUCxNQUFBLFlBQUF5RixhQUFBLENBQUMrRSxZQUFZLE1BQUEyRSxTQUFBO2NBQ1hFLEdBQUcsRUFBRUgsUUFBUSxDQUFDSTtZQUFTLEdBQ25CSixRQUFRLENBQUNVLGNBQWMsRUFDdkJWLFFBQVEsQ0FBQ1csZUFBZSxnQkFFNUI3UCxNQUFBLFlBQUF5RixhQUFBLENBQUN1RCxXQUFXO2NBQ1ZwRSxNQUFNLEVBQUVTLEtBQUssQ0FBQ1QsTUFBTSxDQUFDckMsTUFBTSxHQUFHLENBQUMsR0FBRytJLEtBQU07Y0FDeENyQyxPQUFPLEVBQUVzRyxDQUFFO2NBQ1gzRyxLQUFLLEVBQ0hnRix1QkFBdUIsSUFDdkJBLHVCQUF1QixDQUFDdkksS0FBSyxDQUFDVCxNQUFNLENBQUNyQyxNQUFNLEdBQUcsQ0FBQyxHQUFHK0ksS0FBSyxDQUN4RDtjQUNEMUUsWUFBWSxFQUFFdkIsS0FBSyxDQUFDTixhQUFhLElBQUlNLEtBQUssQ0FBQ04sYUFBYSxDQUFDdUcsS0FBSyxDQUFFO2NBQ2hFaEcsUUFBUSxFQUFFLFNBQVZBLFFBQVFBLENBQUcyRCxPQUFPO2dCQUFBLE9BQUtxRCxNQUFJLENBQUNKLGFBQWEsQ0FBQ1osS0FBSyxFQUFFckMsT0FBTyxFQUFFLFFBQVEsQ0FBQztjQUFBLENBQUM7Y0FDcEVXLGNBQWMsRUFBRSxTQUFoQkEsY0FBY0EsQ0FBR1gsT0FBTztnQkFBQSxPQUFLcUQsTUFBSSxDQUFDSixhQUFhLENBQUNaLEtBQUssRUFBRXJDLE9BQU8sRUFBRSxlQUFlLENBQUM7Y0FBQSxDQUFDO2NBQ2pGUyxZQUFZLEVBQUUsU0FBZEEsWUFBWUEsQ0FBR3VDLFdBQVc7Z0JBQUEsT0FBS0ssTUFBSSxDQUFDd0QsaUJBQWlCLENBQUN4RSxLQUFLLEVBQUVXLFdBQVcsQ0FBQztjQUFBLENBQUM7Y0FDMUU5QyxhQUFhLEVBQUVBLGFBQWM7Y0FDN0JFLFVBQVUsRUFBRUE7WUFBVyxDQUN4QixDQUNXLENBQUM7VUFBQSxDQUVSLENBQ1o7UUFBQSxDQUNMLENBQUMsRUFDQTZGLFFBQVEsQ0FBQ2EsV0FDUCxDQUFDO01BQUEsQ0FFQyxDQUNJLENBQ1IsQ0FFVixDQUNGLENBQUM7SUFFVjtFQUFDO0FBQUEsRUF0TitCQyxpQkFBSyxDQUFDQyxTQUFTLEdBeU5qRDtBQUFBLElBQUF4TixnQkFBQSxhQXpOYW1JLFlBQVksZUFDSjtFQUNqQnZGLEtBQUssRUFBRWYsVUFBVTtFQUNqQm9JLE1BQU0sRUFBRWxJLHFCQUFTLENBQUMwTCxNQUFNO0VBQ3hCN0csVUFBVSxFQUFFN0UscUJBQVMsQ0FBQzBMLE1BQU07RUFDNUJ6RSxVQUFVLEVBQUVqSCxxQkFBUyxDQUFDRyxJQUFJO0VBQzFCVyxRQUFRLEVBQUVkLHFCQUFTLENBQUMyTDtBQUN0QixDQUFDO0FBQUEsSUFBQTFOLGdCQUFBLGFBUFVtSSxZQUFZLGtCQVNELENBQUMsQ0FBQztBQWtOMUIsSUFBTXdGLE9BQU8sR0FBRyxTQUFWQSxPQUFPQSxDQUFJaEwsS0FBSyxFQUFLO0VBQ3pCLElBQUFpTCxNQUFBLEdBQTZEakwsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUFBa0wsaUJBQUEsR0FBQUQsTUFBQSxDQUFoRTVFLFVBQVU7SUFBVkEsVUFBVSxHQUFBNkUsaUJBQUEsY0FBRyxLQUFLLEdBQUFBLGlCQUFBO0lBQUFDLGFBQUEsR0FBQUYsTUFBQSxDQUFFM0QsTUFBTTtJQUFOQSxNQUFNLEdBQUE2RCxhQUFBLGNBQUcsQ0FBQyxDQUFDLEdBQUFBLGFBQUE7SUFBQUMsaUJBQUEsR0FBQUgsTUFBQSxDQUFFaEgsVUFBVTtJQUFWQSxVQUFVLEdBQUFtSCxpQkFBQSxjQUFHLENBQUMsQ0FBQyxHQUFBQSxpQkFBQTtFQUN4RCxJQUFNNUwsTUFBTSxHQUFHYixLQUFLLENBQUNDLElBQUksQ0FBQ29CLEtBQUssQ0FBQ0MsS0FBSyxDQUFDVCxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM2TCxPQUFPLENBQUMsQ0FBQztFQUM3RCxJQUFJMUwsYUFBYSxHQUFHaEIsS0FBSyxDQUFDQyxJQUFJLENBQUNvQixLQUFLLENBQUNDLEtBQUssQ0FBQ04sYUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFDMEwsT0FBTyxDQUFDLENBQUM7RUFFekUsSUFBSTdMLE1BQU0sQ0FBQ3JDLE1BQU0sR0FBR3dDLGFBQWEsQ0FBQ3hDLE1BQU0sRUFBRTtJQUN4Q3dDLGFBQWEsR0FBRyxJQUFBNEcsaUJBQUssRUFBQy9HLE1BQU0sQ0FBQ3JDLE1BQU0sR0FBR3dDLGFBQWEsQ0FBQ3hDLE1BQU0sQ0FBQyxDQUN4RGdFLEdBQUcsQ0FBQztNQUFBLE9BQU0sSUFBSTtJQUFBLEVBQUMsQ0FDZkcsTUFBTSxDQUFDM0IsYUFBYSxDQUFDO0VBQzFCO0VBRUEsSUFBTU0sS0FBSyxHQUFBaEQsYUFBQSxDQUFBQSxhQUFBLEtBQVErQyxLQUFLLENBQUNDLEtBQUs7SUFBRVQsTUFBTSxFQUFOQSxNQUFNO0lBQUVHLGFBQWEsRUFBYkE7RUFBYSxFQUFFO0VBRXZELElBQU1PLFFBQVEsR0FBRyxTQUFYQSxRQUFRQSxDQUFJRCxLQUFLLEVBQUs7SUFDMUJELEtBQUssQ0FBQ0UsUUFBUSxDQUFBakQsYUFBQSxDQUFBQSxhQUFBLEtBQ1RnRCxLQUFLO01BQ1JULE1BQU0sRUFBRWIsS0FBSyxDQUFDQyxJQUFJLENBQUNxQixLQUFLLENBQUNULE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQzZMLE9BQU8sQ0FBQyxDQUFDO01BQ2hEMUwsYUFBYSxFQUFFaEIsS0FBSyxDQUFDQyxJQUFJLENBQUNxQixLQUFLLENBQUNOLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQzBMLE9BQU8sQ0FBQztJQUFDLEVBQy9ELENBQUM7RUFDSixDQUFDO0VBRUQsb0JBQ0V6USxNQUFBLFlBQUF5RixhQUFBLENBQUNtRixZQUFZO0lBQUN2RixLQUFLLEVBQUVBLEtBQU07SUFBQ3FILE1BQU0sRUFBRUEsTUFBTztJQUFDcEgsUUFBUSxFQUFFQSxRQUFTO0lBQUNtRyxVQUFVLEVBQUVBLFVBQVc7SUFBQ3BDLFVBQVUsRUFBRUE7RUFBVyxDQUFFLENBQUM7QUFFdEgsQ0FBQztBQUVEK0csT0FBTyxDQUFDTSxTQUFTLEdBQUc7RUFDbEJyTCxLQUFLLEVBQUVmLFVBQVU7RUFDakJvSSxNQUFNLEVBQUVsSSxxQkFBUyxDQUFDMEwsTUFBTTtFQUN4QjdHLFVBQVUsRUFBRTdFLHFCQUFTLENBQUMwTCxNQUFNO0VBQzVCekUsVUFBVSxFQUFFakgscUJBQVMsQ0FBQ0csSUFBSTtFQUMxQmdNLFFBQVEsRUFBRW5NLHFCQUFTLENBQUMyTCxJQUFJO0VBQ3hCN0ssUUFBUSxFQUFFZCxxQkFBUyxDQUFDMkw7QUFDdEIsQ0FBQztBQUFDLElBQUFTLFFBQUEsR0FBQXJNLE9BQUEsY0FFYTZMLE9BQU8iLCJpZ25vcmVMaXN0IjpbXX0=