@carto/kepler.gl 0.0.44 → 0.0.45-alpha.carto-colors-range

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.
@@ -7,7 +7,10 @@ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWild
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
10
- exports.ColorPaletteGroup = exports.PaletteConfig = exports["default"] = exports.ALL_STEPS = exports.ALL_TYPES = void 0;
10
+ exports["default"] = ColorRangeSelectFactory;
11
+ exports.PaletteConfigFactory = PaletteConfigFactory;
12
+ exports.ColorPaletteGroupFactory = ColorPaletteGroupFactory;
13
+ exports.ALL_STEPS = exports.ALL_TYPES = void 0;
11
14
 
12
15
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
16
 
@@ -105,182 +108,209 @@ var CONFIG_SETTINGS = {
105
108
  options: [true, false]
106
109
  }
107
110
  };
111
+ ColorRangeSelectFactory.deps = [ColorPaletteGroupFactory, PaletteConfigFactory];
108
112
 
109
- var ColorRangeSelect = /*#__PURE__*/function (_Component) {
110
- (0, _inherits2["default"])(ColorRangeSelect, _Component);
113
+ function ColorRangeSelectFactory(ColorPaletteGroup, PaletteConfig) {
114
+ var ColorRangeSelect = /*#__PURE__*/function (_Component) {
115
+ (0, _inherits2["default"])(ColorRangeSelect, _Component);
111
116
 
112
- var _super = _createSuper(ColorRangeSelect);
117
+ var _super = _createSuper(ColorRangeSelect);
113
118
 
114
- function ColorRangeSelect() {
115
- var _this;
119
+ function ColorRangeSelect() {
120
+ var _this;
116
121
 
117
- (0, _classCallCheck2["default"])(this, ColorRangeSelect);
122
+ (0, _classCallCheck2["default"])(this, ColorRangeSelect);
118
123
 
119
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
120
- args[_key] = arguments[_key];
121
- }
124
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
125
+ args[_key] = arguments[_key];
126
+ }
122
127
 
123
- _this = _super.call.apply(_super, [this].concat(args));
124
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "colorRangesSelector", function (props) {
125
- return props.colorRanges;
126
- });
127
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "configTypeSelector", function (props) {
128
- return props.colorPaletteUI.colorRangeConfig.type;
129
- });
130
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "configStepSelector", function (props) {
131
- return props.colorPaletteUI.colorRangeConfig.steps;
132
- });
133
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "filteredColorRange", (0, _reselect.createSelector)(_this.colorRangesSelector, _this.configTypeSelector, _this.configStepSelector, function (colorRanges, type, steps) {
134
- return colorRanges.filter(function (colorRange) {
135
- var isType = type === 'all' || type === colorRange.type;
136
- var isStep = Number(steps) === colorRange.colors.length;
137
- return isType && isStep;
128
+ _this = _super.call.apply(_super, [this].concat(args));
129
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "colorRangesSelector", function (props) {
130
+ return props.colorRanges;
138
131
  });
139
- }));
140
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_updateConfig", function (_ref) {
141
- var key = _ref.key,
142
- value = _ref.value;
143
-
144
- _this._setColorRangeConfig(_objectSpread((0, _defineProperty2["default"])({}, key, value), key === 'type' && {
145
- custom: value === 'custom'
146
- }));
147
- });
148
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onSetCustomPalette", function (config) {
149
- _this.props.setColorPaletteUI({
150
- customPalette: config
132
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "configTypeSelector", function (props) {
133
+ return props.colorPaletteUI.colorRangeConfig.type;
151
134
  });
152
- });
153
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_setColorRangeConfig", function (newConfig) {
154
- _this.props.setColorPaletteUI({
155
- colorRangeConfig: newConfig
135
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "configStepSelector", function (props) {
136
+ return props.colorPaletteUI.colorRangeConfig.steps;
156
137
  });
157
- });
158
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onCustomPaletteCancel", function (newConfig) {
159
- _this.props.setColorPaletteUI({
160
- showSketcher: false,
161
- colorRangeConfig: {
162
- custom: false
163
- }
138
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "filteredColorRange", (0, _reselect.createSelector)(_this.colorRangesSelector, _this.configTypeSelector, _this.configStepSelector, function (colorRanges, type, steps) {
139
+ return colorRanges.filter(function (colorRange) {
140
+ var isType = type === 'all' || type === colorRange.type;
141
+ var isStep = Number(steps) === colorRange.colors.length;
142
+ return isType && isStep;
143
+ });
144
+ }));
145
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_updateConfig", function (_ref) {
146
+ var key = _ref.key,
147
+ value = _ref.value;
148
+
149
+ _this._setColorRangeConfig(_objectSpread((0, _defineProperty2["default"])({}, key, value), key === 'type' && {
150
+ custom: value === 'custom'
151
+ }));
164
152
  });
165
- });
166
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onToggleSketcher", function (val) {
167
- _this.props.setColorPaletteUI({
168
- showSketcher: val
153
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onSetCustomPalette", function (config) {
154
+ _this.props.setColorPaletteUI({
155
+ customPalette: config
156
+ });
169
157
  });
170
- });
171
- return _this;
172
- }
173
-
174
- (0, _createClass2["default"])(ColorRangeSelect, [{
175
- key: "render",
176
- value: function render() {
177
- var _this2 = this;
178
-
179
- var _this$props$colorPale = this.props.colorPaletteUI,
180
- customPalette = _this$props$colorPale.customPalette,
181
- showSketcher = _this$props$colorPale.showSketcher,
182
- colorRangeConfig = _this$props$colorPale.colorRangeConfig;
183
- var filteredColorRanges = this.filteredColorRange(this.props);
184
- return /*#__PURE__*/_react["default"].createElement(StyledColorRangeSelector, null, /*#__PURE__*/_react["default"].createElement(StyledColorConfig, {
185
- className: "color-range-selector__config"
186
- }, Object.keys(colorRangeConfig).filter(function (key) {
187
- return Boolean(CONFIG_SETTINGS[key]) && (colorRangeConfig.custom ? key === 'type' : true);
188
- }).map(function (key) {
189
- return /*#__PURE__*/_react["default"].createElement(PaletteConfig, {
190
- key: key,
191
- label: CONFIG_SETTINGS[key].label || key,
192
- config: CONFIG_SETTINGS[key],
193
- value: colorRangeConfig[key],
194
- onChange: function onChange(value) {
195
- return _this2._updateConfig({
196
- key: key,
197
- value: value
198
- });
158
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_setColorRangeConfig", function (newConfig) {
159
+ _this.props.setColorPaletteUI({
160
+ colorRangeConfig: newConfig
161
+ });
162
+ });
163
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onCustomPaletteCancel", function (newConfig) {
164
+ _this.props.setColorPaletteUI({
165
+ showSketcher: false,
166
+ colorRangeConfig: {
167
+ custom: false
199
168
  }
200
169
  });
201
- })), colorRangeConfig.custom ? /*#__PURE__*/_react["default"].createElement(_customPalette["default"], {
202
- customPalette: customPalette,
203
- showSketcher: showSketcher,
204
- selected: this.props.selectedColorRange,
205
- onApply: this.props.onSelectColorRange,
206
- onToggleSketcher: this._onToggleSketcher,
207
- setCustomPalette: this._onSetCustomPalette,
208
- onCancel: this._onCustomPaletteCancel
209
- }) : /*#__PURE__*/_react["default"].createElement(ColorPaletteGroup, {
210
- colorRanges: filteredColorRanges,
211
- onSelect: this.props.onSelectColorRange,
212
- selected: this.props.selectedColorRange,
213
- reversed: colorRangeConfig.reversed
214
- }));
170
+ });
171
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onToggleSketcher", function (val) {
172
+ _this.props.setColorPaletteUI({
173
+ showSketcher: val
174
+ });
175
+ });
176
+ return _this;
215
177
  }
216
- }]);
178
+
179
+ (0, _createClass2["default"])(ColorRangeSelect, [{
180
+ key: "render",
181
+ value: function render() {
182
+ var _this2 = this;
183
+
184
+ var _this$props$colorPale = this.props.colorPaletteUI,
185
+ customPalette = _this$props$colorPale.customPalette,
186
+ showSketcher = _this$props$colorPale.showSketcher,
187
+ colorRangeConfig = _this$props$colorPale.colorRangeConfig;
188
+ var filteredColorRanges = this.filteredColorRange(this.props);
189
+ return /*#__PURE__*/_react["default"].createElement(StyledColorRangeSelector, null, /*#__PURE__*/_react["default"].createElement(StyledColorConfig, {
190
+ className: "color-range-selector__config"
191
+ }, Object.keys(colorRangeConfig).filter(function (key) {
192
+ return Boolean(CONFIG_SETTINGS[key]) && (colorRangeConfig.custom ? key === 'type' : true);
193
+ }).map(function (key) {
194
+ return /*#__PURE__*/_react["default"].createElement(PaletteConfig, {
195
+ key: key,
196
+ label: CONFIG_SETTINGS[key].label || key,
197
+ config: CONFIG_SETTINGS[key],
198
+ value: colorRangeConfig[key],
199
+ onChange: function onChange(value) {
200
+ return _this2._updateConfig({
201
+ key: key,
202
+ value: value
203
+ });
204
+ }
205
+ });
206
+ })), colorRangeConfig.custom ? /*#__PURE__*/_react["default"].createElement(_customPalette["default"], {
207
+ customPalette: customPalette,
208
+ showSketcher: showSketcher,
209
+ selected: this.props.selectedColorRange,
210
+ onApply: this.props.onSelectColorRange,
211
+ onToggleSketcher: this._onToggleSketcher,
212
+ setCustomPalette: this._onSetCustomPalette,
213
+ onCancel: this._onCustomPaletteCancel
214
+ }) : /*#__PURE__*/_react["default"].createElement(ColorPaletteGroup, {
215
+ colorRanges: filteredColorRanges,
216
+ onSelect: this.props.onSelectColorRange,
217
+ selected: this.props.selectedColorRange,
218
+ reversed: colorRangeConfig.reversed,
219
+ configTypeSelector: function configTypeSelector() {
220
+ return _this2.props.colorPaletteUI.colorRangeConfig.type;
221
+ },
222
+ configStepSelector: function configStepSelector() {
223
+ return _this2.props.colorPaletteUI.colorRangeConfig.steps;
224
+ }
225
+ }));
226
+ }
227
+ }]);
228
+ return ColorRangeSelect;
229
+ }(_react.Component);
230
+
231
+ (0, _defineProperty2["default"])(ColorRangeSelect, "propTypes", {
232
+ colorPaletteUI: _propTypes["default"].object.isRequired,
233
+ selectedColorRange: _propTypes["default"].object.isRequired,
234
+ onSelectColorRange: _propTypes["default"].func.isRequired,
235
+ setColorPaletteUI: _propTypes["default"].func.isRequired,
236
+ // optional
237
+ colorRanges: _propTypes["default"].arrayOf(_propTypes["default"].any)
238
+ });
239
+ (0, _defineProperty2["default"])(ColorRangeSelect, "defaultProps", {
240
+ colorRanges: _colorRanges.COLOR_RANGES,
241
+ onSelectColorRange: function onSelectColorRange() {},
242
+ setColorPaletteUI: function setColorPaletteUI() {}
243
+ });
217
244
  return ColorRangeSelect;
218
- }(_react.Component);
219
-
220
- exports["default"] = ColorRangeSelect;
221
- (0, _defineProperty2["default"])(ColorRangeSelect, "propTypes", {
222
- colorPaletteUI: _propTypes["default"].object.isRequired,
223
- selectedColorRange: _propTypes["default"].object.isRequired,
224
- onSelectColorRange: _propTypes["default"].func.isRequired,
225
- setColorPaletteUI: _propTypes["default"].func.isRequired,
226
- // optional
227
- colorRanges: _propTypes["default"].arrayOf(_propTypes["default"].any)
228
- });
229
- (0, _defineProperty2["default"])(ColorRangeSelect, "defaultProps", {
230
- colorRanges: _colorRanges.COLOR_RANGES,
231
- onSelectColorRange: function onSelectColorRange() {},
232
- setColorPaletteUI: function setColorPaletteUI() {}
233
- });
245
+ }
234
246
 
235
- var PaletteConfig = function PaletteConfig(_ref2) {
236
- var label = _ref2.label,
237
- value = _ref2.value,
238
- _ref2$config = _ref2.config,
239
- type = _ref2$config.type,
240
- options = _ref2$config.options,
241
- _onChange = _ref2.onChange;
242
- return /*#__PURE__*/_react["default"].createElement(StyledPaletteConfig, {
243
- className: "color-palette__config color-palette__config--".concat(label),
244
- onClick: function onClick(e) {
245
- return e.stopPropagation();
246
- }
247
- }, /*#__PURE__*/_react["default"].createElement("div", {
248
- className: "color-palette__config__label"
249
- }, type !== CONFIG_SETTINGS_CUSTOM_REVERSED_BUTTON_TYPE && /*#__PURE__*/_react["default"].createElement(_styledComponents2.PanelLabel, null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
250
- id: "color.".concat(label)
251
- }))), type === 'select' && /*#__PURE__*/_react["default"].createElement("div", {
252
- className: "color-palette__config__select"
253
- }, /*#__PURE__*/_react["default"].createElement(_itemSelector["default"], {
254
- selectedItems: value,
255
- options: options,
256
- multiSelect: false,
257
- searchable: false,
258
- onChange: _onChange
259
- })), type === 'switch' && /*#__PURE__*/_react["default"].createElement(_switch["default"], {
260
- checked: value,
261
- id: "".concat(label, "-toggle"),
262
- onChange: function onChange() {
263
- return _onChange(!value);
264
- },
265
- secondary: true
266
- }), type === CONFIG_SETTINGS_CUSTOM_REVERSED_BUTTON_TYPE && /*#__PURE__*/_react["default"].createElement(_styledComponents2.Button, (0, _extends2["default"])({
267
- className: "color-palette__config__button ".concat(value ? 'color-palette__config__button--active' : ''),
268
- "data-tip": true,
269
- "data-for": "".concat(label, "-tooltip")
270
- }, !value && {
271
- link: true
272
- }, {
273
- onClick: function onClick() {
274
- return _onChange(!value);
247
+ function PaletteConfigFactory() {
248
+ var PaletteConfig = /*#__PURE__*/function (_Component2) {
249
+ (0, _inherits2["default"])(PaletteConfig, _Component2);
250
+
251
+ var _super2 = _createSuper(PaletteConfig);
252
+
253
+ function PaletteConfig() {
254
+ (0, _classCallCheck2["default"])(this, PaletteConfig);
255
+ return _super2.apply(this, arguments);
275
256
  }
276
- }), /*#__PURE__*/_react["default"].createElement(_icons.SwapHorizontal, null), /*#__PURE__*/_react["default"].createElement(_styledComponents2.Tooltip, {
277
- id: "".concat(label, "-tooltip"),
278
- effect: "solid",
279
- place: "top"
280
- }, label)));
281
- };
282
257
 
283
- exports.PaletteConfig = PaletteConfig;
258
+ (0, _createClass2["default"])(PaletteConfig, [{
259
+ key: "render",
260
+ value: function render() {
261
+ var _this$props = this.props,
262
+ label = _this$props.label,
263
+ value = _this$props.value,
264
+ _this$props$config = _this$props.config,
265
+ type = _this$props$config.type,
266
+ options = _this$props$config.options,
267
+ _onChange = _this$props.onChange;
268
+ return /*#__PURE__*/_react["default"].createElement(StyledPaletteConfig, {
269
+ className: "color-palette__config color-palette__config--".concat(label),
270
+ onClick: function onClick(e) {
271
+ return e.stopPropagation();
272
+ }
273
+ }, /*#__PURE__*/_react["default"].createElement("div", {
274
+ className: "color-palette__config__label"
275
+ }, type !== CONFIG_SETTINGS_CUSTOM_REVERSED_BUTTON_TYPE && /*#__PURE__*/_react["default"].createElement(_styledComponents2.PanelLabel, null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
276
+ id: "color.".concat(label)
277
+ }))), type === 'select' && /*#__PURE__*/_react["default"].createElement("div", {
278
+ className: "color-palette__config__select"
279
+ }, /*#__PURE__*/_react["default"].createElement(_itemSelector["default"], {
280
+ selectedItems: value,
281
+ options: options,
282
+ multiSelect: false,
283
+ searchable: false,
284
+ onChange: _onChange
285
+ })), type === 'switch' && /*#__PURE__*/_react["default"].createElement(_switch["default"], {
286
+ checked: value,
287
+ id: "".concat(label, "-toggle"),
288
+ onChange: function onChange() {
289
+ return _onChange(!value);
290
+ },
291
+ secondary: true
292
+ }), type === CONFIG_SETTINGS_CUSTOM_REVERSED_BUTTON_TYPE && /*#__PURE__*/_react["default"].createElement(_styledComponents2.Button, (0, _extends2["default"])({
293
+ className: "color-palette__config__button ".concat(value ? 'color-palette__config__button--active' : ''),
294
+ "data-tip": true,
295
+ "data-for": "".concat(label, "-tooltip")
296
+ }, !value && {
297
+ link: true
298
+ }, {
299
+ onClick: function onClick() {
300
+ return _onChange(!value);
301
+ }
302
+ }), /*#__PURE__*/_react["default"].createElement(_icons.SwapHorizontal, null), /*#__PURE__*/_react["default"].createElement(_styledComponents2.Tooltip, {
303
+ id: "".concat(label, "-tooltip"),
304
+ effect: "solid",
305
+ place: "top"
306
+ }, label)));
307
+ }
308
+ }]);
309
+ return PaletteConfig;
310
+ }(_react.Component);
311
+
312
+ return PaletteConfig;
313
+ }
284
314
 
285
315
  var StyledColorRange = _styledComponents["default"].div.attrs({
286
316
  className: 'color-palette-outer'
@@ -288,34 +318,53 @@ var StyledColorRange = _styledComponents["default"].div.attrs({
288
318
  return props.theme.panelBackgroundHover;
289
319
  });
290
320
 
291
- var ColorPaletteGroup = function ColorPaletteGroup(_ref3) {
292
- var reversed = _ref3.reversed,
293
- onSelect = _ref3.onSelect,
294
- selected = _ref3.selected,
295
- colorRanges = _ref3.colorRanges;
296
- return /*#__PURE__*/_react["default"].createElement("div", {
297
- className: "color-palette__group"
298
- }, colorRanges.map(function (colorRange, i) {
299
- return /*#__PURE__*/_react["default"].createElement(StyledColorRange, {
300
- key: "".concat(colorRange.name, "-").concat(i),
301
- onClick: function onClick(e) {
302
- return onSelect(reversed ? (0, _colorUtils.reverseColorRange)(true, colorRange) : colorRange, e);
303
- }
304
- }, /*#__PURE__*/_react["default"].createElement(_colorPalette["default"], {
305
- colors: colorRange.colors,
306
- isReversed: reversed,
307
- isSelected: colorRange.name === selected.name && reversed === Boolean(selected.reversed),
308
- rootProps: {
309
- 'data-tip': true,
310
- 'data-for': "color-range-".concat(i, "-tooltip")
321
+ function ColorPaletteGroupFactory() {
322
+ var ColorPaletteGroup = /*#__PURE__*/function (_Component3) {
323
+ (0, _inherits2["default"])(ColorPaletteGroup, _Component3);
324
+
325
+ var _super3 = _createSuper(ColorPaletteGroup);
326
+
327
+ function ColorPaletteGroup() {
328
+ (0, _classCallCheck2["default"])(this, ColorPaletteGroup);
329
+ return _super3.apply(this, arguments);
330
+ }
331
+
332
+ (0, _createClass2["default"])(ColorPaletteGroup, [{
333
+ key: "render",
334
+ value: function render() {
335
+ var _this$props2 = this.props,
336
+ reversed = _this$props2.reversed,
337
+ onSelect = _this$props2.onSelect,
338
+ selected = _this$props2.selected,
339
+ colorRanges = _this$props2.colorRanges,
340
+ title = _this$props2.title;
341
+ return /*#__PURE__*/_react["default"].createElement("div", {
342
+ className: "color-palette__group"
343
+ }, title && title, colorRanges.map(function (colorRange, i) {
344
+ return /*#__PURE__*/_react["default"].createElement(StyledColorRange, {
345
+ key: "".concat(colorRange.name, "-").concat(i),
346
+ onClick: function onClick(e) {
347
+ return onSelect(reversed ? (0, _colorUtils.reverseColorRange)(true, colorRange) : colorRange, e);
348
+ }
349
+ }, /*#__PURE__*/_react["default"].createElement(_colorPalette["default"], {
350
+ colors: colorRange.colors,
351
+ isReversed: reversed,
352
+ isSelected: colorRange.name === selected.name && reversed === Boolean(selected.reversed),
353
+ rootProps: {
354
+ 'data-tip': true,
355
+ 'data-for': "color-range-".concat(i, "-tooltip")
356
+ }
357
+ }, /*#__PURE__*/_react["default"].createElement(_styledComponents2.Tooltip, {
358
+ id: "color-range-".concat(i, "-tooltip"),
359
+ effect: "solid",
360
+ place: "top"
361
+ }, colorRange.name)));
362
+ }));
311
363
  }
312
- }, /*#__PURE__*/_react["default"].createElement(_styledComponents2.Tooltip, {
313
- id: "color-range-".concat(i, "-tooltip"),
314
- effect: "solid",
315
- place: "top"
316
- }, colorRange.name)));
317
- }));
318
- };
364
+ }]);
365
+ return ColorPaletteGroup;
366
+ }(_react.Component);
319
367
 
320
- exports.ColorPaletteGroup = ColorPaletteGroup;
321
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvY29sb3ItcmFuZ2Utc2VsZWN0b3IuanMiXSwibmFtZXMiOlsiQUxMX1RZUEVTIiwiQ09MT1JfUkFOR0VTIiwibWFwIiwiYyIsInR5cGUiLCJmaWx0ZXIiLCJjdHlwZSIsIkFMTF9TVEVQUyIsImQiLCJjb2xvcnMiLCJsZW5ndGgiLCJzb3J0IiwibnVtYmVyU29ydCIsIlN0eWxlZENvbG9yQ29uZmlnIiwic3R5bGVkIiwiZGl2IiwiU3R5bGVkQ29sb3JSYW5nZVNlbGVjdG9yIiwiYXR0cnMiLCJjbGFzc05hbWUiLCJTdHlsZWRQYWxldHRlQ29uZmlnIiwicHJvcHMiLCJ0aGVtZSIsInNlY29uZGFyeUlucHV0IiwiQ09ORklHX1NFVFRJTkdTX0NVU1RPTV9SRVZFUlNFRF9CVVRUT05fVFlQRSIsIkNPTkZJR19TRVRUSU5HUyIsIm9wdGlvbnMiLCJzdGVwcyIsInJldmVyc2VkIiwiQ29sb3JSYW5nZVNlbGVjdCIsImNvbG9yUmFuZ2VzIiwiY29sb3JQYWxldHRlVUkiLCJjb2xvclJhbmdlQ29uZmlnIiwiY29sb3JSYW5nZXNTZWxlY3RvciIsImNvbmZpZ1R5cGVTZWxlY3RvciIsImNvbmZpZ1N0ZXBTZWxlY3RvciIsImNvbG9yUmFuZ2UiLCJpc1R5cGUiLCJpc1N0ZXAiLCJOdW1iZXIiLCJrZXkiLCJ2YWx1ZSIsIl9zZXRDb2xvclJhbmdlQ29uZmlnIiwiY3VzdG9tIiwiY29uZmlnIiwic2V0Q29sb3JQYWxldHRlVUkiLCJjdXN0b21QYWxldHRlIiwibmV3Q29uZmlnIiwic2hvd1NrZXRjaGVyIiwidmFsIiwiZmlsdGVyZWRDb2xvclJhbmdlcyIsImZpbHRlcmVkQ29sb3JSYW5nZSIsIk9iamVjdCIsImtleXMiLCJCb29sZWFuIiwibGFiZWwiLCJfdXBkYXRlQ29uZmlnIiwic2VsZWN0ZWRDb2xvclJhbmdlIiwib25TZWxlY3RDb2xvclJhbmdlIiwiX29uVG9nZ2xlU2tldGNoZXIiLCJfb25TZXRDdXN0b21QYWxldHRlIiwiX29uQ3VzdG9tUGFsZXR0ZUNhbmNlbCIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJmdW5jIiwiYXJyYXlPZiIsImFueSIsIlBhbGV0dGVDb25maWciLCJvbkNoYW5nZSIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJsaW5rIiwiU3R5bGVkQ29sb3JSYW5nZSIsInBhbmVsQmFja2dyb3VuZEhvdmVyIiwiQ29sb3JQYWxldHRlR3JvdXAiLCJvblNlbGVjdCIsInNlbGVjdGVkIiwiaSIsIm5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7OztBQUVPLElBQU1BLFNBQVMsR0FBRyx5QkFDdkIsS0FEdUIsNkNBRXBCQywwQkFBYUMsR0FBYixDQUFpQixVQUFBQyxDQUFDO0FBQUEsU0FBSUEsQ0FBQyxDQUFDQyxJQUFOO0FBQUEsQ0FBbEIsRUFBOEJDLE1BQTlCLENBQXFDLFVBQUFDLEtBQUs7QUFBQSxTQUFJQSxLQUFKO0FBQUEsQ0FBMUMsQ0FGb0IsSUFHdkIsUUFIdUIsR0FBbEI7O0FBTUEsSUFBTUMsU0FBUyxHQUFHLHdCQUFLTiwwQkFBYUMsR0FBYixDQUFpQixVQUFBTSxDQUFDO0FBQUEsU0FBSUEsQ0FBQyxDQUFDQyxNQUFGLENBQVNDLE1BQWI7QUFBQSxDQUFsQixDQUFMLEVBQTZDQyxJQUE3QyxDQUFrREMscUJBQWxELENBQWxCOzs7QUFFUCxJQUFNQyxpQkFBaUIsR0FBR0MsNkJBQU9DLEdBQVYsc0hBQXZCOztBQUlBLElBQU1DLHdCQUF3QixHQUFHRiw2QkFBT0MsR0FBUCxDQUFXRSxLQUFYLENBQWlCO0FBQ2hEQyxFQUFBQSxTQUFTLEVBQUU7QUFEcUMsQ0FBakIsQ0FBSCxtSEFBOUI7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QUFHLG1DQUFrQixJQUFsQixFQUF3QlEsVUFBeEIsQ0FBSCxHQUF5Q0EsVUFBbEQsRUFBOERtQyxDQUE5RCxDQUFaO0FBQUE7QUFGWixvQkFJRSxnQ0FBQyx3QkFBRDtBQUNFLE1BQUEsTUFBTSxFQUFFbkMsVUFBVSxDQUFDMUIsTUFEckI7QUFFRSxNQUFBLFVBQVUsRUFBRWtCLFFBRmQ7QUFHRSxNQUFBLFVBQVUsRUFBRVEsVUFBVSxDQUFDNEMsSUFBWCxLQUFvQkYsUUFBUSxDQUFDRSxJQUE3QixJQUFxQ3BELFFBQVEsS0FBSzBCLE9BQU8sQ0FBQ3dCLFFBQVEsQ0FBQ2xELFFBQVYsQ0FIdkU7QUFJRSxNQUFBLFNBQVMsRUFBRTtBQUNULG9CQUFZLElBREg7QUFFVCwwQ0FBMkJtRCxDQUEzQjtBQUZTO0FBSmIsb0JBU0UsZ0NBQUMsMEJBQUQ7QUFBUyxNQUFBLEVBQUUsd0JBQWlCQSxDQUFqQixhQUFYO0FBQXlDLE1BQUEsTUFBTSxFQUFDLE9BQWhEO0FBQXdELE1BQUEsS0FBSyxFQUFDO0FBQTlELE9BQ0czQyxVQUFVLENBQUM0QyxJQURkLENBVEYsQ0FKRixDQURlO0FBQUEsR0FBaEIsQ0FESCxDQUQrQjtBQUFBLENBQTFCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIyIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHVuaXEgZnJvbSAnbG9kYXNoLnVuaXEnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge2NyZWF0ZVNlbGVjdG9yfSBmcm9tICdyZXNlbGVjdCc7XG5cbmltcG9ydCBJdGVtU2VsZWN0b3IgZnJvbSAnY29tcG9uZW50cy9jb21tb24vaXRlbS1zZWxlY3Rvci9pdGVtLXNlbGVjdG9yJztcbmltcG9ydCB7UGFuZWxMYWJlbCwgQnV0dG9uLCBUb29sdGlwfSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgU3dpdGNoIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL3N3aXRjaCc7XG5pbXBvcnQgQ29sb3JQYWxldHRlIGZyb20gJy4vY29sb3ItcGFsZXR0ZSc7XG5pbXBvcnQgQ3VzdG9tUGFsZXR0ZSBmcm9tICcuL2N1c3RvbS1wYWxldHRlJztcbmltcG9ydCB7Q09MT1JfUkFOR0VTfSBmcm9tICdjb25zdGFudHMvY29sb3ItcmFuZ2VzJztcbmltcG9ydCB7bnVtYmVyU29ydH0gZnJvbSAndXRpbHMvZGF0YS11dGlscyc7XG5pbXBvcnQge3JldmVyc2VDb2xvclJhbmdlfSBmcm9tICd1dGlscy9jb2xvci11dGlscyc7XG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ2xvY2FsaXphdGlvbic7XG5pbXBvcnQge1N3YXBIb3Jpem9udGFsfSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9pY29ucyc7XG5cbmV4cG9ydCBjb25zdCBBTExfVFlQRVMgPSB1bmlxKFtcbiAgJ2FsbCcsXG4gIC4uLkNPTE9SX1JBTkdFUy5tYXAoYyA9PiBjLnR5cGUpLmZpbHRlcihjdHlwZSA9PiBjdHlwZSksXG4gICdjdXN0b20nXG5dKTtcblxuZXhwb3J0IGNvbnN0IEFMTF9TVEVQUyA9IHVuaXEoQ09MT1JfUkFOR0VTLm1hcChkID0+IGQuY29sb3JzLmxlbmd0aCkpLnNvcnQobnVtYmVyU29ydCk7XG5cbmNvbnN0IFN0eWxlZENvbG9yQ29uZmlnID0gc3R5bGVkLmRpdmBcbiAgcGFkZGluZzogMTJweCAxMnB4IDAgMTJweDtcbmA7XG5cbmNvbnN0IFN0eWxlZENvbG9yUmFuZ2VTZWxlY3RvciA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdjb2xvci1yYW5nZS1zZWxlY3Rvcidcbn0pYFxuICBwYWRkaW5nLWJvdHRvbTogMTJweDtcbmA7XG5cbmNvbnN0IFN0eWxlZFBhbGV0dGVDb25maWcgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgLmNvbG9yLXBhbGV0dGVfX2NvbmZpZ19fbGFiZWwge1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgfVxuICAuY29sb3ItcGFsZXR0ZV9fY29uZmlnX19zZWxlY3Qge1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgfVxuICAuaXRlbS1zZWxlY3RvciAuaXRlbS1zZWxlY3Rvcl9fZHJvcGRvd24ge1xuICAgICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2Vjb25kYXJ5SW5wdXR9O1xuICB9XG4gIC5jb2xvci1wYWxldHRlX19jb25maWdfX2J1dHRvbiB7XG4gICAgc3ZnIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gIH1cbmA7XG5cbmNvbnN0IENPTkZJR19TRVRUSU5HU19DVVNUT01fUkVWRVJTRURfQlVUVE9OX1RZUEUgPSAnY3VzdG9tLXJldmVyc2VkLWJ1dHRvbic7XG5cbmNvbnN0IENPTkZJR19TRVRUSU5HUyA9IHtcbiAgdHlwZToge1xuICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgIG9wdGlvbnM6IEFMTF9UWVBFU1xuICB9LFxuICBzdGVwczoge1xuICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgIG9wdGlvbnM6IEFMTF9TVEVQU1xuICB9LFxuICByZXZlcnNlZDoge1xuICAgIHR5cGU6IENPTkZJR19TRVRUSU5HU19DVVNUT01fUkVWRVJTRURfQlVUVE9OX1RZUEUsXG4gICAgb3B0aW9uczogW3RydWUsIGZhbHNlXVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2xvclJhbmdlU2VsZWN0IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBjb2xvclBhbGV0dGVVSTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIHNlbGVjdGVkQ29sb3JSYW5nZTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIG9uU2VsZWN0Q29sb3JSYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBzZXRDb2xvclBhbGV0dGVVSTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAvLyBvcHRpb25hbFxuICAgIGNvbG9yUmFuZ2VzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KVxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgY29sb3JSYW5nZXM6IENPTE9SX1JBTkdFUyxcbiAgICBvblNlbGVjdENvbG9yUmFuZ2U6ICgpID0+IHt9LFxuICAgIHNldENvbG9yUGFsZXR0ZVVJOiAoKSA9PiB7fVxuICB9O1xuXG4gIGNvbG9yUmFuZ2VzU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5jb2xvclJhbmdlcztcbiAgY29uZmlnVHlwZVNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMuY29sb3JQYWxldHRlVUkuY29sb3JSYW5nZUNvbmZpZy50eXBlO1xuICBjb25maWdTdGVwU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5jb2xvclBhbGV0dGVVSS5jb2xvclJhbmdlQ29uZmlnLnN0ZXBzO1xuICBmaWx0ZXJlZENvbG9yUmFuZ2UgPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmNvbG9yUmFuZ2VzU2VsZWN0b3IsXG4gICAgdGhpcy5jb25maWdUeXBlU2VsZWN0b3IsXG4gICAgdGhpcy5jb25maWdTdGVwU2VsZWN0b3IsXG4gICAgKGNvbG9yUmFuZ2VzLCB0eXBlLCBzdGVwcykgPT4ge1xuICAgICAgcmV0dXJuIGNvbG9yUmFuZ2VzLmZpbHRlcihjb2xvclJhbmdlID0+IHtcbiAgICAgICAgY29uc3QgaXNUeXBlID0gdHlwZSA9PT0gJ2FsbCcgfHwgdHlwZSA9PT0gY29sb3JSYW5nZS50eXBlO1xuICAgICAgICBjb25zdCBpc1N0ZXAgPSBOdW1iZXIoc3RlcHMpID09PSBjb2xvclJhbmdlLmNvbG9ycy5sZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIGlzVHlwZSAmJiBpc1N0ZXA7XG4gICAgICB9KTtcbiAgICB9XG4gICk7XG5cbiAgX3VwZGF0ZUNvbmZpZyA9ICh7a2V5LCB2YWx1ZX0pID0+IHtcbiAgICB0aGlzLl9zZXRDb2xvclJhbmdlQ29uZmlnKHtcbiAgICAgIFtrZXldOiB2YWx1ZSxcbiAgICAgIC4uLihrZXkgPT09ICd0eXBlJyAmJiB7Y3VzdG9tOiB2YWx1ZSA9PT0gJ2N1c3RvbSd9KVxuICAgIH0pO1xuICB9O1xuXG4gIF9vblNldEN1c3RvbVBhbGV0dGUgPSBjb25maWcgPT4ge1xuICAgIHRoaXMucHJvcHMuc2V0Q29sb3JQYWxldHRlVUkoe1xuICAgICAgY3VzdG9tUGFsZXR0ZTogY29uZmlnXG4gICAgfSk7XG4gIH07XG5cbiAgX3NldENvbG9yUmFuZ2VDb25maWcgPSBuZXdDb25maWcgPT4ge1xuICAgIHRoaXMucHJvcHMuc2V0Q29sb3JQYWxldHRlVUkoe1xuICAgICAgY29sb3JSYW5nZUNvbmZpZzogbmV3Q29uZmlnXG4gICAgfSk7XG4gIH07XG5cbiAgX29uQ3VzdG9tUGFsZXR0ZUNhbmNlbCA9IG5ld0NvbmZpZyA9PiB7XG4gICAgdGhpcy5wcm9wcy5zZXRDb2xvclBhbGV0dGVVSSh7XG4gICAgICBzaG93U2tldGNoZXI6IGZhbHNlLFxuICAgICAgY29sb3JSYW5nZUNvbmZpZzoge2N1c3RvbTogZmFsc2V9XG4gICAgfSk7XG4gIH07XG5cbiAgX29uVG9nZ2xlU2tldGNoZXIgPSB2YWwgPT4ge1xuICAgIHRoaXMucHJvcHMuc2V0Q29sb3JQYWxldHRlVUkoe1xuICAgICAgc2hvd1NrZXRjaGVyOiB2YWxcbiAgICB9KTtcbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge2N1c3RvbVBhbGV0dGUsIHNob3dTa2V0Y2hlciwgY29sb3JSYW5nZUNvbmZpZ30gPSB0aGlzLnByb3BzLmNvbG9yUGFsZXR0ZVVJO1xuXG4gICAgY29uc3QgZmlsdGVyZWRDb2xvclJhbmdlcyA9IHRoaXMuZmlsdGVyZWRDb2xvclJhbmdlKHRoaXMucHJvcHMpO1xuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkQ29sb3JSYW5nZVNlbGVjdG9yPlxuICAgICAgICA8U3R5bGVkQ29sb3JDb25maWcgY2xhc3NOYW1lPVwiY29sb3ItcmFuZ2Utc2VsZWN0b3JfX2NvbmZpZ1wiPlxuICAgICAgICAgIHtPYmplY3Qua2V5cyhjb2xvclJhbmdlQ29uZmlnKVxuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAga2V5ID0+XG4gICAgICAgICAgICAgICAgQm9vbGVhbihDT05GSUdfU0VUVElOR1Nba2V5XSkgJiYgKGNvbG9yUmFuZ2VDb25maWcuY3VzdG9tID8ga2V5ID09PSAndHlwZScgOiB0cnVlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hcChrZXkgPT4gKFxuICAgICAgICAgICAgICA8UGFsZXR0ZUNvbmZpZ1xuICAgICAgICAgICAgICAgIGtleT17a2V5fVxuICAgICAgICAgICAgICAgIGxhYmVsPXtDT05GSUdfU0VUVElOR1Nba2V5XS5sYWJlbCB8fCBrZXl9XG4gICAgICAgICAgICAgICAgY29uZmlnPXtDT05GSUdfU0VUVElOR1Nba2V5XX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17Y29sb3JSYW5nZUNvbmZpZ1trZXldfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt2YWx1ZSA9PiB0aGlzLl91cGRhdGVDb25maWcoe2tleSwgdmFsdWV9KX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkpfVxuICAgICAgICA8L1N0eWxlZENvbG9yQ29uZmlnPlxuXG4gICAgICAgIHtjb2xvclJhbmdlQ29uZmlnLmN1c3RvbSA/IChcbiAgICAgICAgICA8Q3VzdG9tUGFsZXR0ZVxuICAgICAgICAgICAgY3VzdG9tUGFsZXR0ZT17Y3VzdG9tUGFsZXR0ZX1cbiAgICAgICAgICAgIHNob3dTa2V0Y2hlcj17c2hvd1NrZXRjaGVyfVxuICAgICAgICAgICAgc2VsZWN0ZWQ9e3RoaXMucHJvcHMuc2VsZWN0ZWRDb2xvclJhbmdlfVxuICAgICAgICAgICAgb25BcHBseT17dGhpcy5wcm9wcy5vblNlbGVjdENvbG9yUmFuZ2V9XG4gICAgICAgICAgICBvblRvZ2dsZVNrZXRjaGVyPXt0aGlzLl9vblRvZ2dsZVNrZXRjaGVyfVxuICAgICAgICAgICAgc2V0Q3VzdG9tUGFsZXR0ZT17dGhpcy5fb25TZXRDdXN0b21QYWxldHRlfVxuICAgICAgICAgICAgb25DYW5jZWw9e3RoaXMuX29uQ3VzdG9tUGFsZXR0ZUNhbmNlbH1cbiAgICAgICAgICAvPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxDb2xvclBhbGV0dGVHcm91cFxuICAgICAgICAgICAgY29sb3JSYW5nZXM9e2ZpbHRlcmVkQ29sb3JSYW5nZXN9XG4gICAgICAgICAgICBvblNlbGVjdD17dGhpcy5wcm9wcy5vblNlbGVjdENvbG9yUmFuZ2V9XG4gICAgICAgICAgICBzZWxlY3RlZD17dGhpcy5wcm9wcy5zZWxlY3RlZENvbG9yUmFuZ2V9XG4gICAgICAgICAgICByZXZlcnNlZD17Y29sb3JSYW5nZUNvbmZpZy5yZXZlcnNlZH1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgPC9TdHlsZWRDb2xvclJhbmdlU2VsZWN0b3I+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUGFsZXR0ZUNvbmZpZyA9ICh7bGFiZWwsIHZhbHVlLCBjb25maWc6IHt0eXBlLCBvcHRpb25zfSwgb25DaGFuZ2V9KSA9PiAoXG4gIDxTdHlsZWRQYWxldHRlQ29uZmlnXG4gICAgY2xhc3NOYW1lPXtgY29sb3ItcGFsZXR0ZV9fY29uZmlnIGNvbG9yLXBhbGV0dGVfX2NvbmZpZy0tJHtsYWJlbH1gfVxuICAgIG9uQ2xpY2s9e2UgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgPlxuICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sb3ItcGFsZXR0ZV9fY29uZmlnX19sYWJlbFwiPlxuICAgICAge3R5cGUgIT09IENPTkZJR19TRVRUSU5HU19DVVNUT01fUkVWRVJTRURfQlVUVE9OX1RZUEUgJiYgKFxuICAgICAgICA8UGFuZWxMYWJlbD5cbiAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17YGNvbG9yLiR7bGFiZWx9YH0gLz5cbiAgICAgICAgPC9QYW5lbExhYmVsPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgICB7dHlwZSA9PT0gJ3NlbGVjdCcgJiYgKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2xvci1wYWxldHRlX19jb25maWdfX3NlbGVjdFwiPlxuICAgICAgICA8SXRlbVNlbGVjdG9yXG4gICAgICAgICAgc2VsZWN0ZWRJdGVtcz17dmFsdWV9XG4gICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICBtdWx0aVNlbGVjdD17ZmFsc2V9XG4gICAgICAgICAgc2VhcmNoYWJsZT17ZmFsc2V9XG4gICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKX1cbiAgICB7dHlwZSA9PT0gJ3N3aXRjaCcgJiYgKFxuICAgICAgPFN3aXRjaCBjaGVja2VkPXt2YWx1ZX0gaWQ9e2Ake2xhYmVsfS10b2dnbGVgfSBvbkNoYW5nZT17KCkgPT4gb25DaGFuZ2UoIXZhbHVlKX0gc2Vjb25kYXJ5IC8+XG4gICAgKX1cbiAgICB7dHlwZSA9PT0gQ09ORklHX1NFVFRJTkdTX0NVU1RPTV9SRVZFUlNFRF9CVVRUT05fVFlQRSAmJiAoXG4gICAgICA8QnV0dG9uXG4gICAgICAgIGNsYXNzTmFtZT17YGNvbG9yLXBhbGV0dGVfX2NvbmZpZ19fYnV0dG9uICR7XG4gICAgICAgICAgdmFsdWUgPyAnY29sb3ItcGFsZXR0ZV9fY29uZmlnX19idXR0b24tLWFjdGl2ZScgOiAnJ1xuICAgICAgICB9YH1cbiAgICAgICAgZGF0YS10aXBcbiAgICAgICAgZGF0YS1mb3I9e2Ake2xhYmVsfS10b29sdGlwYH1cbiAgICAgICAgey4uLighdmFsdWUgJiYge2xpbms6IHRydWV9KX1cbiAgICAgICAgb25DbGljaz17KCkgPT4gb25DaGFuZ2UoIXZhbHVlKX1cbiAgICAgID5cbiAgICAgICAgPFN3YXBIb3Jpem9udGFsIC8+XG4gICAgICAgIDxUb29sdGlwIGlkPXtgJHtsYWJlbH0tdG9vbHRpcGB9IGVmZmVjdD1cInNvbGlkXCIgcGxhY2U9XCJ0b3BcIj5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvVG9vbHRpcD5cbiAgICAgIDwvQnV0dG9uPlxuICAgICl9XG4gIDwvU3R5bGVkUGFsZXR0ZUNvbmZpZz5cbik7XG5cbmNvbnN0IFN0eWxlZENvbG9yUmFuZ2UgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnY29sb3ItcGFsZXR0ZS1vdXRlcidcbn0pYFxuICBwYWRkaW5nOiAwIDhweDtcbiAgOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZEhvdmVyfTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbmA7XG5cbmV4cG9ydCBjb25zdCBDb2xvclBhbGV0dGVHcm91cCA9ICh7cmV2ZXJzZWQsIG9uU2VsZWN0LCBzZWxlY3RlZCwgY29sb3JSYW5nZXN9KSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPVwiY29sb3ItcGFsZXR0ZV9fZ3JvdXBcIj5cbiAgICB7Y29sb3JSYW5nZXMubWFwKChjb2xvclJhbmdlLCBpKSA9PiAoXG4gICAgICA8U3R5bGVkQ29sb3JSYW5nZVxuICAgICAgICBrZXk9e2Ake2NvbG9yUmFuZ2UubmFtZX0tJHtpfWB9XG4gICAgICAgIG9uQ2xpY2s9e2UgPT4gb25TZWxlY3QocmV2ZXJzZWQgPyByZXZlcnNlQ29sb3JSYW5nZSh0cnVlLCBjb2xvclJhbmdlKSA6IGNvbG9yUmFuZ2UsIGUpfVxuICAgICAgPlxuICAgICAgICA8Q29sb3JQYWxldHRlXG4gICAgICAgICAgY29sb3JzPXtjb2xvclJhbmdlLmNvbG9yc31cbiAgICAgICAgICBpc1JldmVyc2VkPXtyZXZlcnNlZH1cbiAgICAgICAgICBpc1NlbGVjdGVkPXtjb2xvclJhbmdlLm5hbWUgPT09IHNlbGVjdGVkLm5hbWUgJiYgcmV2ZXJzZWQgPT09IEJvb2xlYW4oc2VsZWN0ZWQucmV2ZXJzZWQpfVxuICAgICAgICAgIHJvb3RQcm9wcz17e1xuICAgICAgICAgICAgJ2RhdGEtdGlwJzogdHJ1ZSxcbiAgICAgICAgICAgICdkYXRhLWZvcic6IGBjb2xvci1yYW5nZS0ke2l9LXRvb2x0aXBgXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxUb29sdGlwIGlkPXtgY29sb3ItcmFuZ2UtJHtpfS10b29sdGlwYH0gZWZmZWN0PVwic29saWRcIiBwbGFjZT1cInRvcFwiPlxuICAgICAgICAgICAge2NvbG9yUmFuZ2UubmFtZX1cbiAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgIDwvQ29sb3JQYWxldHRlPlxuICAgICAgPC9TdHlsZWRDb2xvclJhbmdlPlxuICAgICkpfVxuICA8L2Rpdj5cbik7XG4iXX0=
368
+ return ColorPaletteGroup;
369
+ }
370
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvY29sb3ItcmFuZ2Utc2VsZWN0b3IuanMiXSwibmFtZXMiOlsiQUxMX1RZUEVTIiwiQ09MT1JfUkFOR0VTIiwibWFwIiwiYyIsInR5cGUiLCJmaWx0ZXIiLCJjdHlwZSIsIkFMTF9TVEVQUyIsImQiLCJjb2xvcnMiLCJsZW5ndGgiLCJzb3J0IiwibnVtYmVyU29ydCIsIlN0eWxlZENvbG9yQ29uZmlnIiwic3R5bGVkIiwiZGl2IiwiU3R5bGVkQ29sb3JSYW5nZVNlbGVjdG9yIiwiYXR0cnMiLCJjbGFzc05hbWUiLCJTdHlsZWRQYWxldHRlQ29uZmlnIiwicHJvcHMiLCJ0aGVtZSIsInNlY29uZGFyeUlucHV0IiwiQ09ORklHX1NFVFRJTkdTX0NVU1RPTV9SRVZFUlNFRF9CVVRUT05fVFlQRSIsIkNPTkZJR19TRVRUSU5HUyIsIm9wdGlvbnMiLCJzdGVwcyIsInJldmVyc2VkIiwiQ29sb3JSYW5nZVNlbGVjdEZhY3RvcnkiLCJkZXBzIiwiQ29sb3JQYWxldHRlR3JvdXBGYWN0b3J5IiwiUGFsZXR0ZUNvbmZpZ0ZhY3RvcnkiLCJDb2xvclBhbGV0dGVHcm91cCIsIlBhbGV0dGVDb25maWciLCJDb2xvclJhbmdlU2VsZWN0IiwiY29sb3JSYW5nZXMiLCJjb2xvclBhbGV0dGVVSSIsImNvbG9yUmFuZ2VDb25maWciLCJjb2xvclJhbmdlc1NlbGVjdG9yIiwiY29uZmlnVHlwZVNlbGVjdG9yIiwiY29uZmlnU3RlcFNlbGVjdG9yIiwiY29sb3JSYW5nZSIsImlzVHlwZSIsImlzU3RlcCIsIk51bWJlciIsImtleSIsInZhbHVlIiwiX3NldENvbG9yUmFuZ2VDb25maWciLCJjdXN0b20iLCJjb25maWciLCJzZXRDb2xvclBhbGV0dGVVSSIsImN1c3RvbVBhbGV0dGUiLCJuZXdDb25maWciLCJzaG93U2tldGNoZXIiLCJ2YWwiLCJmaWx0ZXJlZENvbG9yUmFuZ2VzIiwiZmlsdGVyZWRDb2xvclJhbmdlIiwiT2JqZWN0Iiwia2V5cyIsIkJvb2xlYW4iLCJsYWJlbCIsIl91cGRhdGVDb25maWciLCJzZWxlY3RlZENvbG9yUmFuZ2UiLCJvblNlbGVjdENvbG9yUmFuZ2UiLCJfb25Ub2dnbGVTa2V0Y2hlciIsIl9vblNldEN1c3RvbVBhbGV0dGUiLCJfb25DdXN0b21QYWxldHRlQ2FuY2VsIiwiQ29tcG9uZW50IiwiUHJvcFR5cGVzIiwib2JqZWN0IiwiaXNSZXF1aXJlZCIsImZ1bmMiLCJhcnJheU9mIiwiYW55Iiwib25DaGFuZ2UiLCJlIiwic3RvcFByb3BhZ2F0aW9uIiwibGluayIsIlN0eWxlZENvbG9yUmFuZ2UiLCJwYW5lbEJhY2tncm91bmRIb3ZlciIsIm9uU2VsZWN0Iiwic2VsZWN0ZWQiLCJ0aXRsZSIsImkiLCJuYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7QUFFTyxJQUFNQSxTQUFTLEdBQUcseUJBQ3ZCLEtBRHVCLDZDQUVwQkMsMEJBQWFDLEdBQWIsQ0FBaUIsVUFBQUMsQ0FBQztBQUFBLFNBQUlBLENBQUMsQ0FBQ0MsSUFBTjtBQUFBLENBQWxCLEVBQThCQyxNQUE5QixDQUFxQyxVQUFBQyxLQUFLO0FBQUEsU0FBSUEsS0FBSjtBQUFBLENBQTFDLENBRm9CLElBR3ZCLFFBSHVCLEdBQWxCOztBQU1BLElBQU1DLFNBQVMsR0FBRyx3QkFBS04sMEJBQWFDLEdBQWIsQ0FBaUIsVUFBQU0sQ0FBQztBQUFBLFNBQUlBLENBQUMsQ0FBQ0MsTUFBRixDQUFTQyxNQUFiO0FBQUEsQ0FBbEIsQ0FBTCxFQUE2Q0MsSUFBN0MsQ0FBa0RDLHFCQUFsRCxDQUFsQjs7O0FBRVAsSUFBTUMsaUJBQWlCLEdBQUdDLDZCQUFPQyxHQUFWLHNIQUF2Qjs7QUFJQSxJ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QUFBLHFCQUNSSyxRQUFRLENBQUNyRCxRQUFRLEdBQUcsbUNBQWtCLElBQWxCLEVBQXdCYyxVQUF4QixDQUFILEdBQXlDQSxVQUFsRCxFQUE4RGtDLENBQTlELENBREE7QUFBQTtBQUZaLDBCQU1FLGdDQUFDLHdCQUFEO0FBQ0UsWUFBQSxNQUFNLEVBQUVsQyxVQUFVLENBQUNoQyxNQURyQjtBQUVFLFlBQUEsVUFBVSxFQUFFa0IsUUFGZDtBQUdFLFlBQUEsVUFBVSxFQUNSYyxVQUFVLENBQUMyQyxJQUFYLEtBQW9CSCxRQUFRLENBQUNHLElBQTdCLElBQXFDekQsUUFBUSxLQUFLZ0MsT0FBTyxDQUFDc0IsUUFBUSxDQUFDdEQsUUFBVixDQUo3RDtBQU1FLFlBQUEsU0FBUyxFQUFFO0FBQ1QsMEJBQVksSUFESDtBQUVULGdEQUEyQndELENBQTNCO0FBRlM7QUFOYiwwQkFXRSxnQ0FBQywwQkFBRDtBQUFTLFlBQUEsRUFBRSx3QkFBaUJBLENBQWpCLGFBQVg7QUFBeUMsWUFBQSxNQUFNLEVBQUMsT0FBaEQ7QUFBd0QsWUFBQSxLQUFLLEVBQUM7QUFBOUQsYUFDRzFDLFVBQVUsQ0FBQzJDLElBRGQsQ0FYRixDQU5GLENBRGU7QUFBQSxTQUFoQixDQUZILENBREY7QUE2QkQ7QUFqQ3NDO0FBQUE7QUFBQSxJQUNUakIsZ0JBRFM7O0FBbUN6QyxTQUFPbkMsaUJBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMiBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC51bmlxJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtjcmVhdGVTZWxlY3Rvcn0gZnJvbSAncmVzZWxlY3QnO1xuXG5pbXBvcnQgSXRlbVNlbGVjdG9yIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2l0ZW0tc2VsZWN0b3IvaXRlbS1zZWxlY3Rvcic7XG5pbXBvcnQge1BhbmVsTGFiZWwsIEJ1dHRvbiwgVG9vbHRpcH0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFN3aXRjaCBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zd2l0Y2gnO1xuaW1wb3J0IENvbG9yUGFsZXR0ZSBmcm9tICcuL2NvbG9yLXBhbGV0dGUnO1xuaW1wb3J0IEN1c3RvbVBhbGV0dGUgZnJvbSAnLi9jdXN0b20tcGFsZXR0ZSc7XG5pbXBvcnQge0NPTE9SX1JBTkdFU30gZnJvbSAnY29uc3RhbnRzL2NvbG9yLXJhbmdlcyc7XG5pbXBvcnQge251bWJlclNvcnR9IGZyb20gJ3V0aWxzL2RhdGEtdXRpbHMnO1xuaW1wb3J0IHtyZXZlcnNlQ29sb3JSYW5nZX0gZnJvbSAndXRpbHMvY29sb3ItdXRpbHMnO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlfSBmcm9tICdsb2NhbGl6YXRpb24nO1xuaW1wb3J0IHtTd2FwSG9yaXpvbnRhbH0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vaWNvbnMnO1xuXG5leHBvcnQgY29uc3QgQUxMX1RZUEVTID0gdW5pcShbXG4gICdhbGwnLFxuICAuLi5DT0xPUl9SQU5HRVMubWFwKGMgPT4gYy50eXBlKS5maWx0ZXIoY3R5cGUgPT4gY3R5cGUpLFxuICAnY3VzdG9tJ1xuXSk7XG5cbmV4cG9ydCBjb25zdCBBTExfU1RFUFMgPSB1bmlxKENPTE9SX1JBTkdFUy5tYXAoZCA9PiBkLmNvbG9ycy5sZW5ndGgpKS5zb3J0KG51bWJlclNvcnQpO1xuXG5jb25zdCBTdHlsZWRDb2xvckNvbmZpZyA9IHN0eWxlZC5kaXZgXG4gIHBhZGRpbmc6IDEycHggMTJweCAwIDEycHg7XG5gO1xuXG5jb25zdCBTdHlsZWRDb2xvclJhbmdlU2VsZWN0b3IgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnY29sb3ItcmFuZ2Utc2VsZWN0b3InXG59KWBcbiAgcGFkZGluZy1ib3R0b206IDEycHg7XG5gO1xuXG5jb25zdCBTdHlsZWRQYWxldHRlQ29uZmlnID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIC5jb2xvci1wYWxldHRlX19jb25maWdfX2xhYmVsIHtcbiAgICBmbGV4LWdyb3c6IDE7XG4gIH1cbiAgLmNvbG9yLXBhbGV0dGVfX2NvbmZpZ19fc2VsZWN0IHtcbiAgICBmbGV4LWdyb3c6IDE7XG4gIH1cbiAgLml0ZW0tc2VsZWN0b3IgLml0ZW0tc2VsZWN0b3JfX2Ryb3Bkb3duIHtcbiAgICAke3Byb3BzID0+IHByb3BzLnRoZW1lLnNlY29uZGFyeUlucHV0fTtcbiAgfVxuICAuY29sb3ItcGFsZXR0ZV9fY29uZmlnX19idXR0b24ge1xuICAgIHN2ZyB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgfVxuICB9XG5gO1xuXG5jb25zdCBDT05GSUdfU0VUVElOR1NfQ1VTVE9NX1JFVkVSU0VEX0JVVFRPTl9UWVBFID0gJ2N1c3RvbS1yZXZlcnNlZC1idXR0b24nO1xuXG5jb25zdCBDT05GSUdfU0VUVElOR1MgPSB7XG4gIHR5cGU6IHtcbiAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICBvcHRpb25zOiBBTExfVFlQRVNcbiAgfSxcbiAgc3RlcHM6IHtcbiAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICBvcHRpb25zOiBBTExfU1RFUFNcbiAgfSxcbiAgcmV2ZXJzZWQ6IHtcbiAgICB0eXBlOiBDT05GSUdfU0VUVElOR1NfQ1VTVE9NX1JFVkVSU0VEX0JVVFRPTl9UWVBFLFxuICAgIG9wdGlvbnM6IFt0cnVlLCBmYWxzZV1cbiAgfVxufTtcblxuQ29sb3JSYW5nZVNlbGVjdEZhY3RvcnkuZGVwcyA9IFtDb2xvclBhbGV0dGVHcm91cEZhY3RvcnksIFBhbGV0dGVDb25maWdGYWN0b3J5XTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvbG9yUmFuZ2VTZWxlY3RGYWN0b3J5KENvbG9yUGFsZXR0ZUdyb3VwLCBQYWxldHRlQ29uZmlnKSB7XG4gIGNsYXNzIENvbG9yUmFuZ2VTZWxlY3QgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICBjb2xvclBhbGV0dGVVSTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgc2VsZWN0ZWRDb2xvclJhbmdlOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgICBvblNlbGVjdENvbG9yUmFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBzZXRDb2xvclBhbGV0dGVVSTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIC8vIG9wdGlvbmFsXG4gICAgICBjb2xvclJhbmdlczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSlcbiAgICB9O1xuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIGNvbG9yUmFuZ2VzOiBDT0xPUl9SQU5HRVMsXG4gICAgICBvblNlbGVjdENvbG9yUmFuZ2U6ICgpID0+IHt9LFxuICAgICAgc2V0Q29sb3JQYWxldHRlVUk6ICgpID0+IHt9XG4gICAgfTtcblxuICAgIGNvbG9yUmFuZ2VzU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5jb2xvclJhbmdlcztcbiAgICBjb25maWdUeXBlU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5jb2xvclBhbGV0dGVVSS5jb2xvclJhbmdlQ29uZmlnLnR5cGU7XG4gICAgY29uZmlnU3RlcFNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMuY29sb3JQYWxldHRlVUkuY29sb3JSYW5nZUNvbmZpZy5zdGVwcztcbiAgICBmaWx0ZXJlZENvbG9yUmFuZ2UgPSBjcmVhdGVTZWxlY3RvcihcbiAgICAgIHRoaXMuY29sb3JSYW5nZXNTZWxlY3RvcixcbiAgICAgIHRoaXMuY29uZmlnVHlwZVNlbGVjdG9yLFxuICAgICAgdGhpcy5jb25maWdTdGVwU2VsZWN0b3IsXG4gICAgICAoY29sb3JSYW5nZXMsIHR5cGUsIHN0ZXBzKSA9PiB7XG4gICAgICAgIHJldHVybiBjb2xvclJhbmdlcy5maWx0ZXIoY29sb3JSYW5nZSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNUeXBlID0gdHlwZSA9PT0gJ2FsbCcgfHwgdHlwZSA9PT0gY29sb3JSYW5nZS50eXBlO1xuICAgICAgICAgIGNvbnN0IGlzU3RlcCA9IE51bWJlcihzdGVwcykgPT09IGNvbG9yUmFuZ2UuY29sb3JzLmxlbmd0aDtcblxuICAgICAgICAgIHJldHVybiBpc1R5cGUgJiYgaXNTdGVwO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgX3VwZGF0ZUNvbmZpZyA9ICh7a2V5LCB2YWx1ZX0pID0+IHtcbiAgICAgIHRoaXMuX3NldENvbG9yUmFuZ2VDb25maWcoe1xuICAgICAgICBba2V5XTogdmFsdWUsXG4gICAgICAgIC4uLihrZXkgPT09ICd0eXBlJyAmJiB7Y3VzdG9tOiB2YWx1ZSA9PT0gJ2N1c3RvbSd9KVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9vblNldEN1c3RvbVBhbGV0dGUgPSBjb25maWcgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5zZXRDb2xvclBhbGV0dGVVSSh7XG4gICAgICAgIGN1c3RvbVBhbGV0dGU6IGNvbmZpZ1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9zZXRDb2xvclJhbmdlQ29uZmlnID0gbmV3Q29uZmlnID0+IHtcbiAgICAgIHRoaXMucHJvcHMuc2V0Q29sb3JQYWxldHRlVUkoe1xuICAgICAgICBjb2xvclJhbmdlQ29uZmlnOiBuZXdDb25maWdcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfb25DdXN0b21QYWxldHRlQ2FuY2VsID0gbmV3Q29uZmlnID0+IHtcbiAgICAgIHRoaXMucHJvcHMuc2V0Q29sb3JQYWxldHRlVUkoe1xuICAgICAgICBzaG93U2tldGNoZXI6IGZhbHNlLFxuICAgICAgICBjb2xvclJhbmdlQ29uZmlnOiB7Y3VzdG9tOiBmYWxzZX1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfb25Ub2dnbGVTa2V0Y2hlciA9IHZhbCA9PiB7XG4gICAgICB0aGlzLnByb3BzLnNldENvbG9yUGFsZXR0ZVVJKHtcbiAgICAgICAgc2hvd1NrZXRjaGVyOiB2YWxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICBjb25zdCB7Y3VzdG9tUGFsZXR0ZSwgc2hvd1NrZXRjaGVyLCBjb2xvclJhbmdlQ29uZmlnfSA9IHRoaXMucHJvcHMuY29sb3JQYWxldHRlVUk7XG4gICAgICBjb25zdCBmaWx0ZXJlZENvbG9yUmFuZ2VzID0gdGhpcy5maWx0ZXJlZENvbG9yUmFuZ2UodGhpcy5wcm9wcyk7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxTdHlsZWRDb2xvclJhbmdlU2VsZWN0b3I+XG4gICAgICAgICAgPFN0eWxlZENvbG9yQ29uZmlnIGNsYXNzTmFtZT1cImNvbG9yLXJhbmdlLXNlbGVjdG9yX19jb25maWdcIj5cbiAgICAgICAgICAgIHtPYmplY3Qua2V5cyhjb2xvclJhbmdlQ29uZmlnKVxuICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGtleSA9PlxuICAgICAgICAgICAgICAgICAgQm9vbGVhbihDT05GSUdfU0VUVElOR1Nba2V5XSkgJiYgKGNvbG9yUmFuZ2VDb25maWcuY3VzdG9tID8ga2V5ID09PSAndHlwZScgOiB0cnVlKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5tYXAoa2V5ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgPFBhbGV0dGVDb25maWdcbiAgICAgICAgICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPXtDT05GSUdfU0VUVElOR1Nba2V5XS5sYWJlbCB8fCBrZXl9XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZz17Q09ORklHX1NFVFRJTkdTW2tleV19XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb2xvclJhbmdlQ29uZmlnW2tleV19XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt2YWx1ZSA9PiB0aGlzLl91cGRhdGVDb25maWcoe2tleSwgdmFsdWV9KX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9TdHlsZWRDb2xvckNvbmZpZz5cblxuICAgICAgICAgIHtjb2xvclJhbmdlQ29uZmlnLmN1c3RvbSA/IChcbiAgICAgICAgICAgIDxDdXN0b21QYWxldHRlXG4gICAgICAgICAgICAgIGN1c3RvbVBhbGV0dGU9e2N1c3RvbVBhbGV0dGV9XG4gICAgICAgICAgICAgIHNob3dTa2V0Y2hlcj17c2hvd1NrZXRjaGVyfVxuICAgICAgICAgICAgICBzZWxlY3RlZD17dGhpcy5wcm9wcy5zZWxlY3RlZENvbG9yUmFuZ2V9XG4gICAgICAgICAgICAgIG9uQXBwbHk9e3RoaXMucHJvcHMub25TZWxlY3RDb2xvclJhbmdlfVxuICAgICAgICAgICAgICBvblRvZ2dsZVNrZXRjaGVyPXt0aGlzLl9vblRvZ2dsZVNrZXRjaGVyfVxuICAgICAgICAgICAgICBzZXRDdXN0b21QYWxldHRlPXt0aGlzLl9vblNldEN1c3RvbVBhbGV0dGV9XG4gICAgICAgICAgICAgIG9uQ2FuY2VsPXt0aGlzLl9vbkN1c3RvbVBhbGV0dGVDYW5jZWx9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8Q29sb3JQYWxldHRlR3JvdXBcbiAgICAgICAgICAgICAgY29sb3JSYW5nZXM9e2ZpbHRlcmVkQ29sb3JSYW5nZXN9XG4gICAgICAgICAgICAgIG9uU2VsZWN0PXt0aGlzLnByb3BzLm9uU2VsZWN0Q29sb3JSYW5nZX1cbiAgICAgICAgICAgICAgc2VsZWN0ZWQ9e3RoaXMucHJvcHMuc2VsZWN0ZWRDb2xvclJhbmdlfVxuICAgICAgICAgICAgICByZXZlcnNlZD17Y29sb3JSYW5nZUNvbmZpZy5yZXZlcnNlZH1cbiAgICAgICAgICAgICAgY29uZmlnVHlwZVNlbGVjdG9yPXsoKSA9PiB0aGlzLnByb3BzLmNvbG9yUGFsZXR0ZVVJLmNvbG9yUmFuZ2VDb25maWcudHlwZX1cbiAgICAgICAgICAgICAgY29uZmlnU3RlcFNlbGVjdG9yPXsoKSA9PiB0aGlzLnByb3BzLmNvbG9yUGFsZXR0ZVVJLmNvbG9yUmFuZ2VDb25maWcuc3RlcHN9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvU3R5bGVkQ29sb3JSYW5nZVNlbGVjdG9yPlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gQ29sb3JSYW5nZVNlbGVjdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFBhbGV0dGVDb25maWdGYWN0b3J5KCkge1xuICBjbGFzcyBQYWxldHRlQ29uZmlnIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGxhYmVsLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgY29uZmlnOiB7dHlwZSwgb3B0aW9uc30sXG4gICAgICAgIG9uQ2hhbmdlXG4gICAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFN0eWxlZFBhbGV0dGVDb25maWdcbiAgICAgICAgICBjbGFzc05hbWU9e2Bjb2xvci1wYWxldHRlX19jb25maWcgY29sb3ItcGFsZXR0ZV9fY29uZmlnLS0ke2xhYmVsfWB9XG4gICAgICAgICAgb25DbGljaz17ZSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2xvci1wYWxldHRlX19jb25maWdfX2xhYmVsXCI+XG4gICAgICAgICAgICB7dHlwZSAhPT0gQ09ORklHX1NFVFRJTkdTX0NVU1RPTV9SRVZFUlNFRF9CVVRUT05fVFlQRSAmJiAoXG4gICAgICAgICAgICAgIDxQYW5lbExhYmVsPlxuICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXtgY29sb3IuJHtsYWJlbH1gfSAvPlxuICAgICAgICAgICAgICA8L1BhbmVsTGFiZWw+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHt0eXBlID09PSAnc2VsZWN0JyAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbG9yLXBhbGV0dGVfX2NvbmZpZ19fc2VsZWN0XCI+XG4gICAgICAgICAgICAgIDxJdGVtU2VsZWN0b3JcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zPXt2YWx1ZX1cbiAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICAgICAgICAgIG11bHRpU2VsZWN0PXtmYWxzZX1cbiAgICAgICAgICAgICAgICBzZWFyY2hhYmxlPXtmYWxzZX1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHt0eXBlID09PSAnc3dpdGNoJyAmJiAoXG4gICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgIGNoZWNrZWQ9e3ZhbHVlfVxuICAgICAgICAgICAgICBpZD17YCR7bGFiZWx9LXRvZ2dsZWB9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoKSA9PiBvbkNoYW5nZSghdmFsdWUpfVxuICAgICAgICAgICAgICBzZWNvbmRhcnlcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7dHlwZSA9PT0gQ09ORklHX1NFVFRJTkdTX0NVU1RPTV9SRVZFUlNFRF9CVVRUT05fVFlQRSAmJiAoXG4gICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17YGNvbG9yLXBhbGV0dGVfX2NvbmZpZ19fYnV0dG9uICR7XG4gICAgICAgICAgICAgICAgdmFsdWUgPyAnY29sb3ItcGFsZXR0ZV9fY29uZmlnX19idXR0b24tLWFjdGl2ZScgOiAnJ1xuICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgZGF0YS10aXBcbiAgICAgICAgICAgICAgZGF0YS1mb3I9e2Ake2xhYmVsfS10b29sdGlwYH1cbiAgICAgICAgICAgICAgey4uLighdmFsdWUgJiYge2xpbms6IHRydWV9KX1cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25DaGFuZ2UoIXZhbHVlKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFN3YXBIb3Jpem9udGFsIC8+XG4gICAgICAgICAgICAgIDxUb29sdGlwIGlkPXtgJHtsYWJlbH0tdG9vbHRpcGB9IGVmZmVjdD1cInNvbGlkXCIgcGxhY2U9XCJ0b3BcIj5cbiAgICAgICAgICAgICAgICB7bGFiZWx9XG4gICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvU3R5bGVkUGFsZXR0ZUNvbmZpZz5cbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBQYWxldHRlQ29uZmlnO1xufVxuXG5jb25zdCBTdHlsZWRDb2xvclJhbmdlID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ2NvbG9yLXBhbGV0dGUtb3V0ZXInXG59KWBcbiAgcGFkZGluZzogMCA4cHg7XG4gIDpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmRIb3Zlcn07XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG5gO1xuXG5leHBvcnQgZnVuY3Rpb24gQ29sb3JQYWxldHRlR3JvdXBGYWN0b3J5KCkge1xuICBjbGFzcyBDb2xvclBhbGV0dGVHcm91cCBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge3JldmVyc2VkLCBvblNlbGVjdCwgc2VsZWN0ZWQsIGNvbG9yUmFuZ2VzLCB0aXRsZX0gPSB0aGlzLnByb3BzO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2xvci1wYWxldHRlX19ncm91cFwiPlxuICAgICAgICAgIHt0aXRsZSAmJiB0aXRsZX1cbiAgICAgICAgICB7Y29sb3JSYW5nZXMubWFwKChjb2xvclJhbmdlLCBpKSA9PiAoXG4gICAgICAgICAgICA8U3R5bGVkQ29sb3JSYW5nZVxuICAgICAgICAgICAgICBrZXk9e2Ake2NvbG9yUmFuZ2UubmFtZX0tJHtpfWB9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2UgPT5cbiAgICAgICAgICAgICAgICBvblNlbGVjdChyZXZlcnNlZCA/IHJldmVyc2VDb2xvclJhbmdlKHRydWUsIGNvbG9yUmFuZ2UpIDogY29sb3JSYW5nZSwgZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8Q29sb3JQYWxldHRlXG4gICAgICAgICAgICAgICAgY29sb3JzPXtjb2xvclJhbmdlLmNvbG9yc31cbiAgICAgICAgICAgICAgICBpc1JldmVyc2VkPXtyZXZlcnNlZH1cbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkPXtcbiAgICAgICAgICAgICAgICAgIGNvbG9yUmFuZ2UubmFtZSA9PT0gc2VsZWN0ZWQubmFtZSAmJiByZXZlcnNlZCA9PT0gQm9vbGVhbihzZWxlY3RlZC5yZXZlcnNlZClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcm9vdFByb3BzPXt7XG4gICAgICAgICAgICAgICAgICAnZGF0YS10aXAnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgJ2RhdGEtZm9yJzogYGNvbG9yLXJhbmdlLSR7aX0tdG9vbHRpcGBcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPFRvb2x0aXAgaWQ9e2Bjb2xvci1yYW5nZS0ke2l9LXRvb2x0aXBgfSBlZmZlY3Q9XCJzb2xpZFwiIHBsYWNlPVwidG9wXCI+XG4gICAgICAgICAgICAgICAgICB7Y29sb3JSYW5nZS5uYW1lfVxuICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgPC9Db2xvclBhbGV0dGU+XG4gICAgICAgICAgICA8L1N0eWxlZENvbG9yUmFuZ2U+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIENvbG9yUGFsZXR0ZUdyb3VwO1xufVxuIl19