@sapui5/sap.fe.test 1.109.0 → 1.110.1

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.
Files changed (84) hide show
  1. package/README.md +5 -1
  2. package/package.json +8 -6
  3. package/src/sap/fe/test/.library +17 -18
  4. package/src/sap/fe/test/BaseActions.js +3 -2
  5. package/src/sap/fe/test/BaseArrangements.js +3 -2
  6. package/src/sap/fe/test/BaseAssertions.js +3 -2
  7. package/src/sap/fe/test/CollaborationClient.js +12 -5
  8. package/src/sap/fe/test/CollaborationClient.ts +12 -1
  9. package/src/sap/fe/test/ConfirmDialog.js +12 -11
  10. package/src/sap/fe/test/FCLView.js +16 -15
  11. package/src/sap/fe/test/FeMocks.js +1 -11
  12. package/src/sap/fe/test/Flexibility.js +12 -7
  13. package/src/sap/fe/test/FlexibleColumnLayout.js +12 -11
  14. package/src/sap/fe/test/JestFlexibilityHelper.js +113 -102
  15. package/src/sap/fe/test/JestFlexibilityHelper.ts +112 -99
  16. package/src/sap/fe/test/JestTemplatingHelper.js +73 -170
  17. package/src/sap/fe/test/JestTemplatingHelper.ts +53 -39
  18. package/src/sap/fe/test/JourneyRunner.js +3 -2
  19. package/src/sap/fe/test/ListReport.js +3 -2
  20. package/src/sap/fe/test/LocationUtil.js +3 -2
  21. package/src/sap/fe/test/ObjectPage.js +121 -17
  22. package/src/sap/fe/test/Shell.js +9 -4
  23. package/src/sap/fe/test/Stubs.js +18 -17
  24. package/src/sap/fe/test/TemplatePage.js +3 -2
  25. package/src/sap/fe/test/TemplatingTestUtils.js +3 -2
  26. package/src/sap/fe/test/UI5MockHelper.js +39 -72
  27. package/src/sap/fe/test/UI5MockHelper.ts +3 -0
  28. package/src/sap/fe/test/Utils.js +4 -3
  29. package/src/sap/fe/test/api/APIHelper.js +3 -2
  30. package/src/sap/fe/test/api/BaseAPI.js +3 -2
  31. package/src/sap/fe/test/api/ChartActions.js +3 -2
  32. package/src/sap/fe/test/api/ChartAssertions.js +3 -2
  33. package/src/sap/fe/test/api/CollaborationAPI.js +2 -30
  34. package/src/sap/fe/test/api/DialogAPI.js +3 -2
  35. package/src/sap/fe/test/api/DialogActions.js +3 -2
  36. package/src/sap/fe/test/api/DialogAssertions.js +4 -3
  37. package/src/sap/fe/test/api/DialogCreateActions.js +6 -5
  38. package/src/sap/fe/test/api/DialogCreateAssertions.js +48 -49
  39. package/src/sap/fe/test/api/DialogHelper.js +4 -3
  40. package/src/sap/fe/test/api/DialogMassEditActions.js +3 -2
  41. package/src/sap/fe/test/api/DialogMassEditAssertions.js +3 -2
  42. package/src/sap/fe/test/api/DialogMessageActions.js +3 -2
  43. package/src/sap/fe/test/api/DialogMessageAssertions.js +82 -79
  44. package/src/sap/fe/test/api/DialogType.js +3 -2
  45. package/src/sap/fe/test/api/DialogValueHelpActions.js +3 -2
  46. package/src/sap/fe/test/api/DialogValueHelpAssertions.js +3 -2
  47. package/src/sap/fe/test/api/EditState.js +4 -3
  48. package/src/sap/fe/test/api/FilterBarAPI.js +3 -2
  49. package/src/sap/fe/test/api/FilterBarActions.js +3 -2
  50. package/src/sap/fe/test/api/FilterBarAssertions.js +3 -2
  51. package/src/sap/fe/test/api/FooterAPI.js +5 -4
  52. package/src/sap/fe/test/api/FooterActionsBase.js +3 -2
  53. package/src/sap/fe/test/api/FooterActionsOP.js +3 -2
  54. package/src/sap/fe/test/api/FooterAssertionsBase.js +3 -2
  55. package/src/sap/fe/test/api/FooterAssertionsOP.js +3 -2
  56. package/src/sap/fe/test/api/FormAPI.js +3 -2
  57. package/src/sap/fe/test/api/FormActions.js +3 -2
  58. package/src/sap/fe/test/api/FormAssertions.js +3 -2
  59. package/src/sap/fe/test/api/HeaderAPI.js +3 -2
  60. package/src/sap/fe/test/api/HeaderActions.js +3 -2
  61. package/src/sap/fe/test/api/HeaderActionsLR.js +3 -2
  62. package/src/sap/fe/test/api/HeaderAssertions.js +3 -2
  63. package/src/sap/fe/test/api/HeaderAssertionsLR.js +3 -2
  64. package/src/sap/fe/test/api/HeaderLR.js +3 -2
  65. package/src/sap/fe/test/api/KPICardAPI.js +5 -4
  66. package/src/sap/fe/test/api/KPICardActions.js +7 -11
  67. package/src/sap/fe/test/api/KPICardAssertions.js +3 -2
  68. package/src/sap/fe/test/api/TableAPI.js +5 -4
  69. package/src/sap/fe/test/api/TableActions.js +16 -9
  70. package/src/sap/fe/test/api/TableAssertions.js +8 -7
  71. package/src/sap/fe/test/builder/DialogBuilder.js +99 -102
  72. package/src/sap/fe/test/builder/FEBuilder.js +3 -2
  73. package/src/sap/fe/test/builder/KPIBuilder.js +16 -25
  74. package/src/sap/fe/test/builder/MacroFieldBuilder.js +4 -2
  75. package/src/sap/fe/test/builder/MdcFieldBuilder.js +3 -2
  76. package/src/sap/fe/test/builder/MdcFilterBarBuilder.js +3 -2
  77. package/src/sap/fe/test/builder/MdcFilterFieldBuilder.js +3 -2
  78. package/src/sap/fe/test/builder/MdcTableBuilder.js +186 -95
  79. package/src/sap/fe/test/builder/OverflowToolbarBuilder.js +3 -2
  80. package/src/sap/fe/test/builder/VMBuilder.js +3 -2
  81. package/src/sap/fe/test/internal/ConsoleErrorChecker.js +13 -48
  82. package/src/sap/fe/test/internal/FEArrangements.js +3 -2
  83. package/src/sap/fe/test/internal/FEJourneyRunner.js +5 -3
  84. package/src/sap/fe/test/library.js +3 -2
@@ -2,42 +2,29 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "sap/base/util/LoaderExtensions", "sap/base/util/merge", "sap/fe/core/buildingBlocks/BuildingBlockRuntime", "sap/fe/core/converters/ConverterContext", "sap/fe/core/services/SideEffectsServiceFactory", "sap/fe/core/TemplateModel", "sap/ui/base/BindingParser", "sap/ui/core/Component", "sap/ui/core/InvisibleText", "sap/ui/core/util/serializer/Serializer", "sap/ui/core/util/XMLPreprocessor", "sap/ui/fl/apply/_internal/flexState/FlexState", "sap/ui/fl/apply/_internal/preprocessors/XmlPreprocessor", "sap/ui/fl/initial/_internal/Storage", "sap/ui/fl/Utils", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/lib/_MetadataRequestor", "sap/ui/model/odata/v4/ODataMetaModel", "xpath", "./JestFlexibilityHelper"], function (compiler, fs, path, prettier, Log, LoaderExtensions, merge, BuildingBlockRuntime, ConverterContext, SideEffectsFactory, TemplateModel, BindingParser, Component, InvisibleText, Serializer, XMLPreprocessor, FlexState, XmlPreprocessor, AppStorage, Utils, JSONModel, _MetadataRequestor, ODataMetaModel, xpath, JestFlexibilityHelper) {
5
+ sap.ui.define(["@sap/cds-compiler", "fs", "@prettier/plugin-xml", "path", "prettier", "sap/base/Log", "sap/base/util/LoaderExtensions", "sap/base/util/merge", "sap/fe/core/buildingBlocks/BuildingBlockRuntime", "sap/fe/core/converters/ConverterContext", "sap/fe/core/services/SideEffectsServiceFactory", "sap/fe/core/TemplateModel", "sap/ui/base/BindingParser", "sap/ui/base/ManagedObjectMetadata", "sap/ui/core/Component", "sap/ui/core/InvisibleText", "sap/ui/core/util/serializer/Serializer", "sap/ui/core/util/XMLPreprocessor", "sap/ui/fl/apply/_internal/flexState/FlexState", "sap/ui/fl/apply/_internal/preprocessors/XmlPreprocessor", "sap/ui/fl/initial/_internal/Storage", "sap/ui/fl/Utils", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/lib/_MetadataRequestor", "sap/ui/model/odata/v4/ODataMetaModel", "xpath", "./JestFlexibilityHelper"], function (compiler, fs, plugin, path, prettier, Log, LoaderExtensions, merge, BuildingBlockRuntime, ConverterContext, SideEffectsFactory, TemplateModel, BindingParser, ManagedObjectMetadata, Component, InvisibleText, Serializer, XMLPreprocessor, FlexState, XmlPreprocessor, AppStorage, Utils, JSONModel, _MetadataRequestor, ODataMetaModel, xpath, JestFlexibilityHelper) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
9
  var createFlexibilityChangesObject = JestFlexibilityHelper.createFlexibilityChangesObject;
10
10
  var registerBuildingBlock = BuildingBlockRuntime.registerBuildingBlock;
11
11
  var format = prettier.format;
12
-
13
12
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
14
-
15
13
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
16
-
17
14
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
18
-
19
15
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
20
-
21
16
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
22
-
23
17
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
24
-
25
18
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
26
-
27
19
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
28
-
29
20
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
30
-
31
- function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
32
-
21
+ function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0) { ; } } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
33
22
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
34
-
35
23
  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; }
36
-
37
24
  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) { _defineProperty(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; }
38
-
39
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
40
-
25
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
26
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
27
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
41
28
  /**
42
29
  * Process the requested XML fragment with the provided data.
43
30
  *
@@ -49,31 +36,29 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
49
36
  try {
50
37
  var inputXml = "<root><core:Fragment fragmentName=\"".concat(name, "\" type=\"XML\" xmlns:core=\"sap.ui.core\" /></root>");
51
38
  var parser = new window.DOMParser();
52
- var inputDoc = parser.parseFromString(inputXml, "text/xml"); // build model and bindings for given test data
39
+ var inputDoc = parser.parseFromString(inputXml, "text/xml");
53
40
 
41
+ // build model and bindings for given test data
54
42
  var settings = {
55
43
  models: {},
56
44
  bindingContexts: {}
57
45
  };
58
-
59
46
  for (var _model2 in testData) {
60
47
  var jsonModel = new JSONModel();
61
48
  jsonModel.setData(testData[_model2]);
62
49
  settings.models[_model2] = jsonModel;
63
50
  settings.bindingContexts[_model2] = settings.models[_model2].createBindingContext("/");
64
- } // execute the pre-processor
65
-
51
+ }
66
52
 
53
+ // execute the pre-processor
67
54
  return Promise.resolve(XMLPreprocessor.process(inputDoc.firstElementChild, {
68
55
  name: name
69
56
  }, settings)).then(function (resultDoc) {
70
57
  // exclude nested fragments from test snapshots
71
58
  var fragments = resultDoc.getElementsByTagName("core:Fragment");
72
-
73
59
  if ((fragments === null || fragments === void 0 ? void 0 : fragments.length) > 0) {
74
60
  var _iterator = _createForOfIteratorHelper(fragments),
75
- _step;
76
-
61
+ _step;
77
62
  try {
78
63
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
79
64
  var fragment = _step.value;
@@ -84,9 +69,9 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
84
69
  } finally {
85
70
  _iterator.f();
86
71
  }
87
- } // Keep the fragment result as child of root node when fragment generates multiple root controls
88
-
72
+ }
89
73
 
74
+ // Keep the fragment result as child of root node when fragment generates multiple root controls
90
75
  var xmlResult = resultDoc.children.length > 1 ? resultDoc.outerHTML : resultDoc.innerHTML;
91
76
  return _removeCommentFromXml(xmlResult);
92
77
  });
@@ -94,9 +79,7 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
94
79
  return Promise.reject(e);
95
80
  }
96
81
  };
97
-
98
82
  _exports.processFragment = processFragment;
99
-
100
83
  /**
101
84
  * Process the requested view with the provided data.
102
85
  *
@@ -104,35 +87,31 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
104
87
  * @param sMetadataUrl Url of the metadata.
105
88
  * @param mBindingContexts Map of the bindingContexts to set on the models.
106
89
  * @param mModels Map of the models.
107
- * @param aVariantDependentControlChanges
90
+ * @param flexChanges Object with UI changes like 'changes' or 'variantDependentControlChanges'
108
91
  * @returns Templated view as string
109
92
  */
110
- var processView = function (name, sMetadataUrl, mBindingContexts, mModels, aVariantDependentControlChanges) {
93
+ var processView = function (name, sMetadataUrl, mBindingContexts, mModels, flexChanges) {
111
94
  try {
112
95
  return Promise.resolve(getMetaModel(sMetadataUrl)).then(function (oMetaModel) {
113
96
  var oViewDocument = _loadResourceView(name);
114
-
115
97
  return Promise.resolve(_buildPreProcessorSettings(sMetadataUrl, mBindingContexts, mModels)).then(function (oPreprocessorSettings) {
116
98
  return Promise.resolve(XMLPreprocessor.process(oViewDocument, {
117
99
  name: name
118
100
  }, oPreprocessorSettings)).then(function (oPreprocessedView) {
119
101
  function _temp7() {
120
102
  var _oPreprocessedView;
121
-
122
103
  return {
123
104
  asElement: oPreprocessedView,
124
105
  asString: _removeCommentFromXml(((_oPreprocessedView = oPreprocessedView) === null || _oPreprocessedView === void 0 ? void 0 : _oPreprocessedView.outerHTML) || "")
125
106
  };
126
107
  }
127
-
128
108
  var _temp6 = function () {
129
- if (aVariantDependentControlChanges) {
130
- return Promise.resolve(applyFlexChanges(aVariantDependentControlChanges || [], oMetaModel, oPreprocessedView)).then(function (_applyFlexChanges2) {
109
+ if (flexChanges) {
110
+ return Promise.resolve(applyFlexChanges(flexChanges !== null && flexChanges !== void 0 ? flexChanges : [], oMetaModel, oPreprocessedView)).then(function (_applyFlexChanges2) {
131
111
  oPreprocessedView = _applyFlexChanges2;
132
112
  });
133
113
  }
134
114
  }();
135
-
136
115
  return _temp6 && _temp6.then ? _temp6.then(_temp7) : _temp7(_temp6);
137
116
  });
138
117
  });
@@ -141,9 +120,7 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
141
120
  return Promise.reject(e);
142
121
  }
143
122
  };
144
-
145
123
  _exports.processView = processView;
146
-
147
124
  var _buildPreProcessorSettings = function (sMetadataUrl, mBindingContexts, mModels) {
148
125
  try {
149
126
  return Promise.resolve(getMetaModel(sMetadataUrl)).then(function (oMetaModel) {
@@ -151,10 +128,9 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
151
128
  // if not already passed to teh templating
152
129
  if (!mModels.hasOwnProperty("converterContext")) {
153
130
  mModels = Object.assign(mModels, {
154
- "converterContext": new TemplateModel({}, oMetaModel)
131
+ converterContext: new TemplateModel({}, oMetaModel)
155
132
  });
156
133
  }
157
-
158
134
  Object.keys(mModels).forEach(function (sModelName) {
159
135
  if (mModels[sModelName] && mModels[sModelName].isTemplateModel) {
160
136
  mModels[sModelName] = new TemplateModel(mModels[sModelName].data, oMetaModel);
@@ -165,14 +141,14 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
165
141
  metaModel: oMetaModel
166
142
  }, mModels),
167
143
  bindingContexts: {}
168
- }; //Inject models and bindingContexts
144
+ };
169
145
 
146
+ //Inject models and bindingContexts
170
147
  Object.keys(mBindingContexts).forEach(function (sKey) {
171
148
  /* Assert to make sure the annotations are in the test metadata -> avoid misleading tests */
172
149
  expect(typeof oMetaModel.getObject(mBindingContexts[sKey])).toBeDefined();
173
150
  var oModel = mModels[sKey] || oMetaModel;
174
151
  settings.bindingContexts[sKey] = oModel.createBindingContext(mBindingContexts[sKey]); //Value is sPath
175
-
176
152
  settings.models[sKey] = oModel;
177
153
  });
178
154
  return settings;
@@ -181,35 +157,34 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
181
157
  return Promise.reject(e);
182
158
  }
183
159
  };
184
-
185
160
  // eslint-disable-next-line @typescript-eslint/no-var-requires
186
161
  var formatXml = require("xml-formatter");
187
-
188
162
  Log.setLevel(1, "sap.ui.core.util.XMLPreprocessor");
189
163
  jest.setTimeout(40000);
190
164
  var nameSpaceMap = {
191
- "macros": "sap.fe.macros",
192
- "macro": "sap.fe.macros",
193
- "macroField": "sap.fe.macros.field",
194
- "macrodata": "http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1",
195
- "log": "http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1",
196
- "unittest": "http://schemas.sap.com/sapui5/preprocessorextension/sap.fe.unittesting/1",
197
- "control": "sap.fe.core.controls",
198
- "core": "sap.ui.core",
199
- "m": "sap.m",
200
- "f": "sap.ui.layout.form",
201
- "internalMacro": "sap.fe.macros.internal",
202
- "mdc": "sap.ui.mdc",
203
- "mdcat": "sap.ui.mdc.actiontoolbar",
204
- "mdcField": "sap.ui.mdc.field",
205
- "mdcTable": "sap.ui.mdc.table",
206
- "u": "sap.ui.unified",
207
- "macroMicroChart": "sap.fe.macros.microchart",
208
- "microChart": "sap.suite.ui.microchart",
209
- "macroTable": "sap.fe.macros.table"
165
+ macros: "sap.fe.macros",
166
+ macro: "sap.fe.macros",
167
+ macroField: "sap.fe.macros.field",
168
+ macrodata: "http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1",
169
+ log: "http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1",
170
+ unittest: "http://schemas.sap.com/sapui5/preprocessorextension/sap.fe.unittesting/1",
171
+ control: "sap.fe.core.controls",
172
+ core: "sap.ui.core",
173
+ dt: "sap.ui.dt",
174
+ m: "sap.m",
175
+ f: "sap.ui.layout.form",
176
+ fl: "sap.ui.fl",
177
+ internalMacro: "sap.fe.macros.internal",
178
+ mdc: "sap.ui.mdc",
179
+ mdcat: "sap.ui.mdc.actiontoolbar",
180
+ mdcField: "sap.ui.mdc.field",
181
+ mdcTable: "sap.ui.mdc.table",
182
+ u: "sap.ui.unified",
183
+ macroMicroChart: "sap.fe.macros.microchart",
184
+ microChart: "sap.suite.ui.microchart",
185
+ macroTable: "sap.fe.macros.table"
210
186
  };
211
187
  var select = xpath.useNamespaces(nameSpaceMap);
212
-
213
188
  function _getTemplatedSelector(xmldom, selector) {
214
189
  /**
215
190
  * if a root element has been added during the templating by our Jest Templating methods
@@ -218,7 +193,6 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
218
193
  var rootPath = "/root";
219
194
  return "".concat(xmldom.nodeName === "root" && !selector.startsWith(rootPath) ? rootPath : "").concat(selector);
220
195
  }
221
-
222
196
  function _removeCommentFromXml(xml) {
223
197
  return formatXml(xml, {
224
198
  filter: function (node) {
@@ -226,33 +200,25 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
226
200
  }
227
201
  });
228
202
  }
229
-
230
203
  function _loadResourceView(viewName) {
231
204
  var name = viewName.replace(/\./g, "/") + ".view.xml";
232
205
  var view = LoaderExtensions.loadResource(name);
233
206
  return view.documentElement;
234
207
  }
235
-
236
208
  var registerMacro = function (macroMetadata) {
237
209
  registerBuildingBlock(macroMetadata);
238
210
  };
239
-
240
211
  _exports.registerMacro = registerMacro;
241
-
242
212
  var unregisterMacro = function (macroMetadata) {
243
213
  XMLPreprocessor.plugIn(null, macroMetadata.namespace, macroMetadata.name);
244
-
245
214
  if (macroMetadata.publicNamespace) {
246
215
  XMLPreprocessor.plugIn(null, macroMetadata.publicNamespace, macroMetadata.name);
247
216
  }
248
217
  };
249
-
250
218
  _exports.unregisterMacro = unregisterMacro;
251
-
252
219
  var runXPathQuery = function (selector, xmldom) {
253
220
  return select(selector, xmldom);
254
221
  };
255
-
256
222
  expect.extend({
257
223
  toHaveControl: function (xmldom, selector) {
258
224
  var nodes = runXPathQuery(_getTemplatedSelector(xmldom, selector), xmldom);
@@ -276,42 +242,34 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
276
242
  }
277
243
  });
278
244
  _exports.runXPathQuery = runXPathQuery;
279
-
280
245
  var formatBuildingBlockXML = function (xmlString) {
281
246
  if (Array.isArray(xmlString)) {
282
247
  xmlString = xmlString.join("");
283
248
  }
284
-
285
249
  var xmlFormatted = formatXML(xmlString);
286
250
  xmlFormatted = xmlFormatted.replace(/uid--id-[0-9]{13}-[0-9]{1,2}/g, "uid--id");
287
251
  return xmlFormatted;
288
252
  };
289
-
290
253
  _exports.formatBuildingBlockXML = formatBuildingBlockXML;
291
-
292
254
  var getControlAttribute = function (controlSelector, attributeName, xmlDom) {
293
255
  var selector = "string(".concat(_getTemplatedSelector(xmlDom, controlSelector), "/@").concat(attributeName, ")");
294
256
  return runXPathQuery(selector, xmlDom);
295
257
  };
296
-
297
258
  _exports.getControlAttribute = getControlAttribute;
298
-
299
259
  var serializeXML = function (xmlDom) {
300
260
  var serializer = new window.XMLSerializer();
301
261
  var xmlString = serializer.serializeToString(xmlDom);
302
262
  return formatXML(xmlString);
303
263
  };
304
-
305
264
  _exports.serializeXML = serializeXML;
306
-
307
265
  var formatXML = function (xmlString) {
308
266
  return format(xmlString, {
309
267
  parser: "xml",
310
- xmlWhitespaceSensitivity: "ignore"
311
- }
312
- /* options by the Prettier XML plugin */
313
- );
268
+ xmlWhitespaceSensitivity: "ignore",
269
+ plugins: [plugin]
270
+ });
314
271
  };
272
+
315
273
  /**
316
274
  * Compile a CDS file into an EDMX file.
317
275
  *
@@ -321,10 +279,7 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
321
279
  * @param edmxFileName Allows you to override the name of the compiled EDMX metadata file
322
280
  * @returns The path of the generated EDMX
323
281
  */
324
-
325
-
326
282
  _exports.formatXML = formatXML;
327
-
328
283
  var compileCDS = function (cdsUrl) {
329
284
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
330
285
  var edmxFileName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : path.basename(cdsUrl).replace(".cds", ".xml");
@@ -338,6 +293,7 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
338
293
  fs.writeFileSync(edmxFilePath, edmxContent);
339
294
  return edmxFilePath;
340
295
  };
296
+
341
297
  /**
342
298
  * Compile CDS to EDMX.
343
299
  *
@@ -346,23 +302,19 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
346
302
  * @param options Options for creating the EDMX output
347
303
  * @returns The compiled service model as EDMX.
348
304
  */
349
-
350
-
351
305
  _exports.compileCDS = compileCDS;
352
-
353
306
  function cds2edmx(cds) {
354
307
  var service = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "sap.fe.test.JestService";
355
308
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
356
309
  var sources = {
357
310
  "source.cds": cds
358
- }; // allow to include stuff from @sap/cds/common
311
+ };
359
312
 
313
+ // allow to include stuff from @sap/cds/common
360
314
  if (cds.includes("'@sap/cds/common'")) {
361
315
  sources["common.cds"] = fs.readFileSync(require.resolve("@sap/cds/common.cds"), "utf-8");
362
316
  }
363
-
364
317
  var csn = compiler.compileSources(sources, {});
365
-
366
318
  var edmxOptions = _objectSpread(_objectSpread({
367
319
  odataForeignKeys: true,
368
320
  odataFormat: "structured",
@@ -370,18 +322,13 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
370
322
  }, options), {}, {
371
323
  service: service
372
324
  });
373
-
374
325
  var edmx = compiler.to.edmx(csn, edmxOptions);
375
-
376
326
  if (!edmx) {
377
327
  throw new Error("Compilation failed. Hint: Make sure that the CDS model defines service ".concat(service, "."));
378
328
  }
379
-
380
329
  return edmx;
381
330
  }
382
-
383
331
  _exports.cds2edmx = cds2edmx;
384
-
385
332
  var getFakeSideEffectsService = function (oMetaModel) {
386
333
  try {
387
334
  var oServiceContext = {
@@ -391,7 +338,6 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
391
338
  };
392
339
  return Promise.resolve(new SideEffectsFactory().createInstance(oServiceContext).then(function (oServiceInstance) {
393
340
  var oJestSideEffectsService = oServiceInstance.getInterface();
394
-
395
341
  oJestSideEffectsService.getContext = function () {
396
342
  return {
397
343
  scopeObject: {
@@ -405,16 +351,13 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
405
351
  }
406
352
  };
407
353
  };
408
-
409
354
  return oJestSideEffectsService;
410
355
  }));
411
356
  } catch (e) {
412
357
  return Promise.reject(e);
413
358
  }
414
359
  };
415
-
416
360
  _exports.getFakeSideEffectsService = getFakeSideEffectsService;
417
-
418
361
  var getFakeDiagnostics = function () {
419
362
  var issues = [];
420
363
  return {
@@ -435,9 +378,7 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
435
378
  }
436
379
  };
437
380
  };
438
-
439
381
  _exports.getFakeDiagnostics = getFakeDiagnostics;
440
-
441
382
  var getConverterContextForTest = function (convertedTypes, manifestSettings) {
442
383
  var entitySet = convertedTypes.entitySets.find(function (es) {
443
384
  return es.name === manifestSettings.entitySet;
@@ -445,18 +386,14 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
445
386
  var dataModelPath = getDataModelObjectPathForProperty(entitySet, convertedTypes, entitySet);
446
387
  return new ConverterContext(convertedTypes, manifestSettings, getFakeDiagnostics(), merge, dataModelPath);
447
388
  };
448
-
449
389
  _exports.getConverterContextForTest = getConverterContextForTest;
450
390
  var metaModelCache = {};
451
-
452
391
  var getMetaModel = function (sMetadataUrl) {
453
392
  try {
454
393
  function _temp3() {
455
394
  return metaModelCache[sMetadataUrl];
456
395
  }
457
-
458
396
  var oRequestor = _MetadataRequestor.create({}, "4.0", {});
459
-
460
397
  var _temp4 = function () {
461
398
  if (!metaModelCache[sMetadataUrl]) {
462
399
  var oMetaModel = new ODataMetaModel(oRequestor, sMetadataUrl, undefined, null);
@@ -465,15 +402,12 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
465
402
  });
466
403
  }
467
404
  }();
468
-
469
405
  return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(_temp3) : _temp3(_temp4));
470
406
  } catch (e) {
471
407
  return Promise.reject(e);
472
408
  }
473
409
  };
474
-
475
410
  _exports.getMetaModel = getMetaModel;
476
-
477
411
  var getDataModelObjectPathForProperty = function (entitySet, convertedTypes, property) {
478
412
  var targetPath = {
479
413
  startingEntitySet: entitySet,
@@ -486,21 +420,15 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
486
420
  targetPath.contextLocation = targetPath;
487
421
  return targetPath;
488
422
  };
489
-
490
423
  _exports.getDataModelObjectPathForProperty = getDataModelObjectPathForProperty;
491
-
492
424
  var evaluateBinding = function (bindingString) {
493
425
  var bindingElement = BindingParser.complexParser(bindingString);
494
-
495
426
  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
496
427
  args[_key - 1] = arguments[_key];
497
428
  }
498
-
499
429
  return bindingElement.formatter.apply(undefined, args);
500
430
  };
501
-
502
431
  _exports.evaluateBinding = evaluateBinding;
503
-
504
432
  /**
505
433
  * Evaluate a binding against a model.
506
434
  *
@@ -516,34 +444,27 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
516
444
  var defaultModel = new JSONModel(modelContent);
517
445
  text.setModel(defaultModel);
518
446
  text.setBindingContext(defaultModel.createBindingContext("/"));
519
-
520
447
  if (namedModelsContent) {
521
448
  for (var _i = 0, _Object$entries = Object.entries(namedModelsContent); _i < _Object$entries.length; _i++) {
522
449
  var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
523
- _name = _Object$entries$_i[0],
524
- content = _Object$entries$_i[1];
525
-
450
+ _name = _Object$entries$_i[0],
451
+ content = _Object$entries$_i[1];
526
452
  var _model = new JSONModel(content);
527
-
528
453
  text.setModel(_model, _name);
529
454
  text.setBindingContext(_model.createBindingContext("/"), _name);
530
455
  }
531
456
  }
532
-
533
457
  return text.getText();
534
458
  }
535
-
536
459
  _exports.evaluateBindingWithModel = evaluateBindingWithModel;
537
460
  var TESTVIEWID = "testViewId";
538
-
539
- var applyFlexChanges = function (aVariantDependentControlChanges, oMetaModel, resultXML) {
461
+ var applyFlexChanges = function (flexChanges, oMetaModel, resultXML) {
540
462
  try {
541
463
  // prefix Ids
542
464
  _toConsumableArray(resultXML.querySelectorAll("[id]")).forEach(function (node) {
543
465
  node.id = "".concat(TESTVIEWID, "--").concat(node.id);
544
466
  });
545
-
546
- var changes = createFlexibilityChangesObject(TESTVIEWID, aVariantDependentControlChanges);
467
+ var changes = createFlexibilityChangesObject(TESTVIEWID, flexChanges);
547
468
  var appId = "someComponent";
548
469
  var oManifest = {
549
470
  "sap.app": {
@@ -564,9 +485,12 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
564
485
  getEntry: function (name) {
565
486
  return oManifest[name];
566
487
  }
488
+ }),
489
+ getLocalId: jest.fn(function (sId) {
490
+ return sId;
567
491
  })
568
- }; //fake changes
569
-
492
+ };
493
+ //fake changes
570
494
  jest.spyOn(AppStorage, "loadFlexData").mockReturnValue(Promise.resolve(changes));
571
495
  jest.spyOn(Component, "get").mockReturnValue(oAppComponent);
572
496
  jest.spyOn(Utils, "getAppComponentForControl").mockReturnValue(oAppComponent);
@@ -578,10 +502,11 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
578
502
  componentId: appId,
579
503
  id: TESTVIEWID
580
504
  })).then(function (_XmlPreprocessor$proc) {
505
+ var _ref, _flexChanges$changes$, _flexChanges$changes, _flexChanges$variantD;
581
506
  resultXML = _XmlPreprocessor$proc;
582
507
  //Assert that all changes have been applied
583
508
  var changesApplied = getChangesFromXML(resultXML);
584
- expect(changesApplied.length).toBe(aVariantDependentControlChanges.length);
509
+ expect(changesApplied.length).toBe((_ref = (_flexChanges$changes$ = flexChanges === null || flexChanges === void 0 ? void 0 : (_flexChanges$changes = flexChanges.changes) === null || _flexChanges$changes === void 0 ? void 0 : _flexChanges$changes.length) !== null && _flexChanges$changes$ !== void 0 ? _flexChanges$changes$ : 0 + (flexChanges === null || flexChanges === void 0 ? void 0 : (_flexChanges$variantD = flexChanges.variantDependentControlChanges) === null || _flexChanges$variantD === void 0 ? void 0 : _flexChanges$variantD.length)) !== null && _ref !== void 0 ? _ref : 0);
585
510
  return resultXML;
586
511
  });
587
512
  });
@@ -589,7 +514,6 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
589
514
  return Promise.reject(e);
590
515
  }
591
516
  };
592
-
593
517
  var getChangesFromXML = function (xml) {
594
518
  return _toConsumableArray(xml.querySelectorAll("*")).flatMap(function (e) {
595
519
  return _toConsumableArray(e.attributes).map(function (a) {
@@ -599,37 +523,32 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
599
523
  return attr.includes("sap.ui.fl.appliedChanges");
600
524
  });
601
525
  };
602
-
603
526
  _exports.getChangesFromXML = getChangesFromXML;
604
-
605
- var getTemplatingResult = function (xmlInput, sMetadataUrl, mBindingContexts, mModels, aVariantDependentControlChanges) {
527
+ var getTemplatingResult = function (xmlInput, sMetadataUrl, mBindingContexts, mModels, flexChanges) {
606
528
  try {
607
529
  var templatedXml = "<root>".concat(xmlInput, "</root>");
608
530
  var parser = new window.DOMParser();
609
- var xmlDoc = parser.parseFromString(templatedXml, "text/xml"); // To ensure our macro can use #setBindingContext we ensure there is a pre existing JSONModel for converterContext
531
+ var xmlDoc = parser.parseFromString(templatedXml, "text/xml");
532
+ // To ensure our macro can use #setBindingContext we ensure there is a pre existing JSONModel for converterContext
610
533
  // if not already passed to teh templating
611
-
612
534
  return Promise.resolve(getMetaModel(sMetadataUrl)).then(function (oMetaModel) {
613
535
  return Promise.resolve(_buildPreProcessorSettings(sMetadataUrl, mBindingContexts, mModels)).then(function (oPreprocessorSettings) {
614
536
  //This context for macro testing
615
537
  if (oPreprocessorSettings.models["this"]) {
616
538
  oPreprocessorSettings.bindingContexts["this"] = oPreprocessorSettings.models["this"].createBindingContext("/");
617
539
  }
618
-
619
540
  return Promise.resolve(XMLPreprocessor.process(xmlDoc.firstElementChild, {
620
541
  name: "Test Fragment"
621
542
  }, oPreprocessorSettings)).then(function (_XMLPreprocessor$proc) {
622
543
  var resultXML = _XMLPreprocessor$proc;
623
-
624
544
  var _temp5 = function () {
625
- if (aVariantDependentControlChanges) {
545
+ if (flexChanges) {
626
546
  // apply flex changes
627
- return Promise.resolve(applyFlexChanges(aVariantDependentControlChanges, oMetaModel, resultXML)).then(function (_applyFlexChanges) {
547
+ return Promise.resolve(applyFlexChanges(flexChanges, oMetaModel, resultXML)).then(function (_applyFlexChanges) {
628
548
  resultXML = _applyFlexChanges;
629
549
  });
630
550
  }
631
551
  }();
632
-
633
552
  return _temp5 && _temp5.then ? _temp5.then(function () {
634
553
  return resultXML;
635
554
  }) : resultXML;
@@ -640,49 +559,37 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
640
559
  return Promise.reject(e);
641
560
  }
642
561
  };
643
-
644
562
  _exports.getTemplatingResult = getTemplatingResult;
645
-
646
- var getTemplatedXML = function (xmlInput, sMetadataUrl, mBindingContexts, mModels, aVariantDependentControlChanges) {
563
+ var getTemplatedXML = function (xmlInput, sMetadataUrl, mBindingContexts, mModels, flexChanges) {
647
564
  try {
648
- return Promise.resolve(getTemplatingResult(xmlInput, sMetadataUrl, mBindingContexts, mModels, aVariantDependentControlChanges)).then(serializeXML);
565
+ return Promise.resolve(getTemplatingResult(xmlInput, sMetadataUrl, mBindingContexts, mModels, flexChanges)).then(serializeXML);
649
566
  } catch (e) {
650
567
  return Promise.reject(e);
651
568
  }
652
569
  };
653
-
654
570
  _exports.getTemplatedXML = getTemplatedXML;
655
-
656
571
  function serializeControl(controlToSerialize) {
657
572
  var tabCount = 0;
658
-
659
573
  function getTab() {
660
574
  var toAdd = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
661
575
  var tab = "";
662
-
663
576
  for (var i = 0; i < tabCount + toAdd; i++) {
664
577
  tab += "\t";
665
578
  }
666
-
667
579
  return tab;
668
580
  }
669
-
670
581
  var serializeDelegate = {
671
582
  start: function (control, sAggregationName) {
672
583
  var controlDetail = "";
673
-
674
584
  if (sAggregationName) {
675
585
  if (control.getParent()) {
676
586
  var _control$getParent$ge, _control$getParent$ge2;
677
-
678
587
  var indexInParent = (_control$getParent$ge = control.getParent().getAggregation(sAggregationName)) === null || _control$getParent$ge === void 0 ? void 0 : (_control$getParent$ge2 = _control$getParent$ge.indexOf) === null || _control$getParent$ge2 === void 0 ? void 0 : _control$getParent$ge2.call(_control$getParent$ge, control);
679
-
680
588
  if (indexInParent > 0) {
681
589
  controlDetail += ",\n".concat(getTab());
682
590
  }
683
591
  }
684
592
  }
685
-
686
593
  controlDetail += "".concat(control.getMetadata().getName(), "(");
687
594
  return controlDetail;
688
595
  },
@@ -690,8 +597,8 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
690
597
  return "})";
691
598
  },
692
599
  middle: function (control) {
693
- var data = "{id: ".concat(control.getId());
694
-
600
+ var id = control.getId();
601
+ var data = "{id: ".concat(ManagedObjectMetadata.isGeneratedId(id) ? "__dynamicId" : id);
695
602
  for (var oControlKey in control.mProperties) {
696
603
  if (control.mProperties.hasOwnProperty(oControlKey)) {
697
604
  data += ",\n".concat(getTab(), " ").concat(oControlKey, ": ").concat(control.mProperties[oControlKey]);
@@ -702,31 +609,31 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
702
609
  }), ")");
703
610
  }
704
611
  }
705
-
706
612
  for (var _oControlKey in control.mAssociations) {
707
613
  if (control.mAssociations.hasOwnProperty(_oControlKey)) {
708
614
  data += ",\n".concat(getTab(), " ").concat(_oControlKey, ": ").concat(control.mAssociations[_oControlKey][0]);
709
615
  }
710
616
  }
711
-
617
+ for (var _oControlKey2 in control.mEventRegistry) {
618
+ if (control.mEventRegistry.hasOwnProperty(_oControlKey2)) {
619
+ data += ",\n".concat(getTab(), " ").concat(_oControlKey2, ": true}");
620
+ }
621
+ }
712
622
  data += "";
713
623
  return data;
714
624
  },
715
625
  startAggregation: function (control, sName) {
716
626
  var out = ",\n".concat(getTab()).concat(sName);
717
627
  tabCount++;
718
-
719
628
  if (control.mBindingInfos[sName]) {
720
629
  out += "={ path:'".concat(control.mBindingInfos[sName].path, "', template:\n").concat(getTab());
721
630
  } else {
722
631
  out += "=[\n".concat(getTab());
723
632
  }
724
-
725
633
  return out;
726
634
  },
727
635
  endAggregation: function (control, sName) {
728
636
  tabCount--;
729
-
730
637
  if (control.mBindingInfos[sName]) {
731
638
  return "\n".concat(getTab(), "}");
732
639
  } else {
@@ -734,7 +641,6 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
734
641
  }
735
642
  }
736
643
  };
737
-
738
644
  if (Array.isArray(controlToSerialize)) {
739
645
  return controlToSerialize.map(function (controlToRender) {
740
646
  return new Serializer(controlToRender, serializeDelegate).serialize();
@@ -743,9 +649,7 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
743
649
  return new Serializer(controlToSerialize, serializeDelegate).serialize();
744
650
  }
745
651
  }
746
-
747
652
  _exports.serializeControl = serializeControl;
748
-
749
653
  function createAwaiter() {
750
654
  var fnResolve;
751
655
  var myPromise = new Promise(function (resolve) {
@@ -756,8 +660,7 @@ sap.ui.define(["@sap/cds-compiler", "fs", "path", "prettier", "sap/base/Log", "s
756
660
  resolve: fnResolve
757
661
  };
758
662
  }
759
-
760
663
  _exports.createAwaiter = createAwaiter;
761
664
  return _exports;
762
665
  }, false);
763
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwcm9jZXNzRnJhZ21lbnQiLCJuYW1lIiwidGVzdERhdGEiLCJpbnB1dFhtbCIsInBhcnNlciIsIndpbmRvdyIsIkRPTVBhcnNlciIsImlucHV0RG9jIiwicGFyc2VGcm9tU3RyaW5nIiwic2V0dGluZ3MiLCJtb2RlbHMiLCJiaW5kaW5nQ29udGV4dHMiLCJtb2RlbCIsImpzb25Nb2RlbCIsIkpTT05Nb2RlbCIsInNldERhdGEiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJmaXJzdEVsZW1lbnRDaGlsZCIsInJlc3VsdERvYyIsImZyYWdtZW50cyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwibGVuZ3RoIiwiZnJhZ21lbnQiLCJpbm5lckhUTUwiLCJ4bWxSZXN1bHQiLCJjaGlsZHJlbiIsIm91dGVySFRNTCIsIl9yZW1vdmVDb21tZW50RnJvbVhtbCIsInByb2Nlc3NWaWV3Iiwic01ldGFkYXRhVXJsIiwibUJpbmRpbmdDb250ZXh0cyIsIm1Nb2RlbHMiLCJhVmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzIiwiZ2V0TWV0YU1vZGVsIiwib01ldGFNb2RlbCIsIm9WaWV3RG9jdW1lbnQiLCJfbG9hZFJlc291cmNlVmlldyIsIl9idWlsZFByZVByb2Nlc3NvclNldHRpbmdzIiwib1ByZXByb2Nlc3NvclNldHRpbmdzIiwib1ByZXByb2Nlc3NlZFZpZXciLCJhc0VsZW1lbnQiLCJhc1N0cmluZyIsImFwcGx5RmxleENoYW5nZXMiLCJoYXNPd25Qcm9wZXJ0eSIsIk9iamVjdCIsImFzc2lnbiIsIlRlbXBsYXRlTW9kZWwiLCJrZXlzIiwiZm9yRWFjaCIsInNNb2RlbE5hbWUiLCJpc1RlbXBsYXRlTW9kZWwiLCJkYXRhIiwibWV0YU1vZGVsIiwic0tleSIsImV4cGVjdCIsImdldE9iamVjdCIsInRvQmVEZWZpbmVkIiwib01vZGVsIiwiZm9ybWF0WG1sIiwicmVxdWlyZSIsIkxvZyIsInNldExldmVsIiwiamVzdCIsInNldFRpbWVvdXQiLCJuYW1lU3BhY2VNYXAiLCJzZWxlY3QiLCJ4cGF0aCIsInVzZU5hbWVzcGFjZXMiLCJfZ2V0VGVtcGxhdGVkU2VsZWN0b3IiLCJ4bWxkb20iLCJzZWxlY3RvciIsInJvb3RQYXRoIiwibm9kZU5hbWUiLCJzdGFydHNXaXRoIiwieG1sIiwiZmlsdGVyIiwibm9kZSIsInR5cGUiLCJ2aWV3TmFtZSIsInJlcGxhY2UiLCJ2aWV3IiwiTG9hZGVyRXh0ZW5zaW9ucyIsImxvYWRSZXNvdXJjZSIsImRvY3VtZW50RWxlbWVudCIsInJlZ2lzdGVyTWFjcm8iLCJtYWNyb01ldGFkYXRhIiwicmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIiwidW5yZWdpc3Rlck1hY3JvIiwicGx1Z0luIiwibmFtZXNwYWNlIiwicHVibGljTmFtZXNwYWNlIiwicnVuWFBhdGhRdWVyeSIsImV4dGVuZCIsInRvSGF2ZUNvbnRyb2wiLCJub2RlcyIsIm1lc3NhZ2UiLCJvdXRwdXRYbWwiLCJzZXJpYWxpemVYTUwiLCJwYXNzIiwidG9Ob3RIYXZlQ29udHJvbCIsImZvcm1hdEJ1aWxkaW5nQmxvY2tYTUwiLCJ4bWxTdHJpbmciLCJBcnJheSIsImlzQXJyYXkiLCJqb2luIiwieG1sRm9ybWF0dGVkIiwiZm9ybWF0WE1MIiwiZ2V0Q29udHJvbEF0dHJpYnV0ZSIsImNvbnRyb2xTZWxlY3RvciIsImF0dHJpYnV0ZU5hbWUiLCJ4bWxEb20iLCJzZXJpYWxpemVyIiwiWE1MU2VyaWFsaXplciIsInNlcmlhbGl6ZVRvU3RyaW5nIiwiZm9ybWF0IiwieG1sV2hpdGVzcGFjZVNlbnNpdGl2aXR5IiwiY29tcGlsZUNEUyIsImNkc1VybCIsIm9wdGlvbnMiLCJlZG14RmlsZU5hbWUiLCJwYXRoIiwiYmFzZW5hbWUiLCJjZHNTdHJpbmciLCJmcyIsInJlYWRGaWxlU3luYyIsImVkbXhDb250ZW50IiwiY2RzMmVkbXgiLCJkaXIiLCJyZXNvbHZlIiwiZWRteEZpbGVQYXRoIiwibWtkaXJTeW5jIiwicmVjdXJzaXZlIiwid3JpdGVGaWxlU3luYyIsImNkcyIsInNlcnZpY2UiLCJzb3VyY2VzIiwiaW5jbHVkZXMiLCJjc24iLCJjb21waWxlciIsImNvbXBpbGVTb3VyY2VzIiwiZWRteE9wdGlvbnMiLCJvZGF0YUZvcmVpZ25LZXlzIiwib2RhdGFGb3JtYXQiLCJvZGF0YUNvbnRhaW5tZW50IiwiZWRteCIsInRvIiwiRXJyb3IiLCJnZXRGYWtlU2lkZUVmZmVjdHNTZXJ2aWNlIiwib1NlcnZpY2VDb250ZXh0Iiwic2NvcGVPYmplY3QiLCJzY29wZVR5cGUiLCJTaWRlRWZmZWN0c0ZhY3RvcnkiLCJjcmVhdGVJbnN0YW5jZSIsInRoZW4iLCJvU2VydmljZUluc3RhbmNlIiwib0plc3RTaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRJbnRlcmZhY2UiLCJnZXRDb250ZXh0IiwiZ2V0TW9kZWwiLCJnZXRGYWtlRGlhZ25vc3RpY3MiLCJpc3N1ZXMiLCJhZGRJc3N1ZSIsImlzc3VlQ2F0ZWdvcnkiLCJpc3N1ZVNldmVyaXR5IiwiZGV0YWlscyIsInB1c2giLCJnZXRJc3N1ZXMiLCJjaGVja0lmSXNzdWVFeGlzdHMiLCJmaW5kIiwiaXNzdWUiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yVGVzdCIsImNvbnZlcnRlZFR5cGVzIiwibWFuaWZlc3RTZXR0aW5ncyIsImVudGl0eVNldCIsImVudGl0eVNldHMiLCJlcyIsImRhdGFNb2RlbFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoRm9yUHJvcGVydHkiLCJDb252ZXJ0ZXJDb250ZXh0IiwibWVyZ2UiLCJtZXRhTW9kZWxDYWNoZSIsIm9SZXF1ZXN0b3IiLCJfTWV0YWRhdGFSZXF1ZXN0b3IiLCJjcmVhdGUiLCJPRGF0YU1ldGFNb2RlbCIsInVuZGVmaW5lZCIsImZldGNoRW50aXR5Q29udGFpbmVyIiwicHJvcGVydHkiLCJ0YXJnZXRQYXRoIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsInRhcmdldE9iamVjdCIsInRhcmdldEVudGl0eVNldCIsInRhcmdldEVudGl0eVR5cGUiLCJlbnRpdHlUeXBlIiwiY29udGV4dExvY2F0aW9uIiwiZXZhbHVhdGVCaW5kaW5nIiwiYmluZGluZ1N0cmluZyIsImJpbmRpbmdFbGVtZW50IiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJhcmdzIiwiZm9ybWF0dGVyIiwiYXBwbHkiLCJldmFsdWF0ZUJpbmRpbmdXaXRoTW9kZWwiLCJtb2RlbENvbnRlbnQiLCJuYW1lZE1vZGVsc0NvbnRlbnQiLCJ0ZXh0IiwiSW52aXNpYmxlVGV4dCIsImJpbmRQcm9wZXJ0eSIsImRlZmF1bHRNb2RlbCIsInNldE1vZGVsIiwic2V0QmluZGluZ0NvbnRleHQiLCJlbnRyaWVzIiwiY29udGVudCIsImdldFRleHQiLCJURVNUVklFV0lEIiwicmVzdWx0WE1MIiwicXVlcnlTZWxlY3RvckFsbCIsImlkIiwiY2hhbmdlcyIsImNyZWF0ZUZsZXhpYmlsaXR5Q2hhbmdlc09iamVjdCIsImFwcElkIiwib01hbmlmZXN0IiwiY3Jvc3NOYXZpZ2F0aW9uIiwib3V0Ym91bmRzIiwib0FwcENvbXBvbmVudCIsImdldERpYWdub3N0aWNzIiwiZm4iLCJtb2NrUmV0dXJuVmFsdWUiLCJnZXRDb21wb25lbnREYXRhIiwiZ2V0TWFuaWZlc3RPYmplY3QiLCJnZXRFbnRyeSIsInNweU9uIiwiQXBwU3RvcmFnZSIsIlByb21pc2UiLCJDb21wb25lbnQiLCJVdGlscyIsIkZsZXhTdGF0ZSIsImluaXRpYWxpemUiLCJjb21wb25lbnRJZCIsIlhtbFByZXByb2Nlc3NvciIsImNoYW5nZXNBcHBsaWVkIiwiZ2V0Q2hhbmdlc0Zyb21YTUwiLCJ0b0JlIiwiZmxhdE1hcCIsImUiLCJhdHRyaWJ1dGVzIiwibWFwIiwiYSIsImF0dHIiLCJnZXRUZW1wbGF0aW5nUmVzdWx0IiwieG1sSW5wdXQiLCJ0ZW1wbGF0ZWRYbWwiLCJ4bWxEb2MiLCJnZXRUZW1wbGF0ZWRYTUwiLCJzZXJpYWxpemVDb250cm9sIiwiY29udHJvbFRvU2VyaWFsaXplIiwidGFiQ291bnQiLCJnZXRUYWIiLCJ0b0FkZCIsInRhYiIsImkiLCJzZXJpYWxpemVEZWxlZ2F0ZSIsInN0YXJ0IiwiY29udHJvbCIsInNBZ2dyZWdhdGlvbk5hbWUiLCJjb250cm9sRGV0YWlsIiwiZ2V0UGFyZW50IiwiaW5kZXhJblBhcmVudCIsImdldEFnZ3JlZ2F0aW9uIiwiaW5kZXhPZiIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsImVuZCIsIm1pZGRsZSIsImdldElkIiwib0NvbnRyb2xLZXkiLCJtUHJvcGVydGllcyIsIm1CaW5kaW5nSW5mb3MiLCJiaW5kaW5nRGV0YWlsIiwicGFydHMiLCJiaW5kaW5nSW5mbyIsIm1Bc3NvY2lhdGlvbnMiLCJzdGFydEFnZ3JlZ2F0aW9uIiwic05hbWUiLCJvdXQiLCJlbmRBZ2dyZWdhdGlvbiIsImNvbnRyb2xUb1JlbmRlciIsIlNlcmlhbGl6ZXIiLCJzZXJpYWxpemUiLCJjcmVhdGVBd2FpdGVyIiwiZm5SZXNvbHZlIiwibXlQcm9taXNlIiwicHJvbWlzZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSmVzdFRlbXBsYXRpbmdIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbnlBbm5vdGF0aW9uLCBDb252ZXJ0ZWRNZXRhZGF0YSwgRW50aXR5U2V0LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IGNvbXBpbGVyIGZyb20gXCJAc2FwL2Nkcy1jb21waWxlclwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVpcmVkT3B0aW9ucyB9IGZyb20gXCJwcmV0dGllclwiO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBMb2FkZXJFeHRlbnNpb25zIGZyb20gXCJzYXAvYmFzZS91dGlsL0xvYWRlckV4dGVuc2lvbnNcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgeyByZWdpc3RlckJ1aWxkaW5nQmxvY2sgfSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvQnVpbGRpbmdCbG9ja1J1bnRpbWVcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzLCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgSURpYWdub3N0aWNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCBTaWRlRWZmZWN0c0ZhY3RvcnkgZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBJbnZpc2libGVUZXh0IGZyb20gXCJzYXAvdWkvY29yZS9JbnZpc2libGVUZXh0XCI7XG5pbXBvcnQgU2VyaWFsaXplciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9zZXJpYWxpemVyL1NlcmlhbGl6ZXJcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgRmxleFN0YXRlIGZyb20gXCJzYXAvdWkvZmwvYXBwbHkvX2ludGVybmFsL2ZsZXhTdGF0ZS9GbGV4U3RhdGVcIjtcbmltcG9ydCBYbWxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9mbC9hcHBseS9faW50ZXJuYWwvcHJlcHJvY2Vzc29ycy9YbWxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBBcHBTdG9yYWdlIGZyb20gXCJzYXAvdWkvZmwvaW5pdGlhbC9faW50ZXJuYWwvU3RvcmFnZVwiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCJzYXAvdWkvZmwvVXRpbHNcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9NZXRhTW9kZWxcIjtcbmltcG9ydCBfTWV0YWRhdGFSZXF1ZXN0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9saWIvX01ldGFkYXRhUmVxdWVzdG9yXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHhwYXRoIGZyb20gXCJ4cGF0aFwiO1xuaW1wb3J0IHsgY3JlYXRlRmxleGliaWxpdHlDaGFuZ2VzT2JqZWN0IH0gZnJvbSBcIi4vSmVzdEZsZXhpYmlsaXR5SGVscGVyXCI7XG5cbnR5cGUgUHJlUHJvY2Vzc29yU2V0dGluZ3NUeXBlID0ge1xuXHRtb2RlbHM6IHtcblx0XHRbbmFtZTogc3RyaW5nXTogSlNPTk1vZGVsIHwgT0RhdGFNZXRhTW9kZWw7XG5cdH07XG5cdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFtuYW1lOiBzdHJpbmddOiBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHR9O1xufTtcblxudHlwZSBKZXN0VGVtcGxhdGVkVmlldyA9IHtcblx0YXNFbGVtZW50OiBFbGVtZW50IHwgdW5kZWZpbmVkO1xuXHRhc1N0cmluZzogc3RyaW5nO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbmNvbnN0IGZvcm1hdFhtbCA9IHJlcXVpcmUoXCJ4bWwtZm9ybWF0dGVyXCIpO1xuXG5Mb2cuc2V0TGV2ZWwoMSBhcyBhbnksIFwic2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3JcIik7XG5qZXN0LnNldFRpbWVvdXQoNDAwMDApO1xuXG5jb25zdCBuYW1lU3BhY2VNYXAgPSB7XG5cdFwibWFjcm9zXCI6IFwic2FwLmZlLm1hY3Jvc1wiLFxuXHRcIm1hY3JvXCI6IFwic2FwLmZlLm1hY3Jvc1wiLFxuXHRcIm1hY3JvRmllbGRcIjogXCJzYXAuZmUubWFjcm9zLmZpZWxkXCIsXG5cdFwibWFjcm9kYXRhXCI6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRcImxvZ1wiOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0XCJ1bml0dGVzdFwiOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L3ByZXByb2Nlc3NvcmV4dGVuc2lvbi9zYXAuZmUudW5pdHRlc3RpbmcvMVwiLFxuXHRcImNvbnRyb2xcIjogXCJzYXAuZmUuY29yZS5jb250cm9sc1wiLFxuXHRcImNvcmVcIjogXCJzYXAudWkuY29yZVwiLFxuXHRcIm1cIjogXCJzYXAubVwiLFxuXHRcImZcIjogXCJzYXAudWkubGF5b3V0LmZvcm1cIixcblx0XCJpbnRlcm5hbE1hY3JvXCI6IFwic2FwLmZlLm1hY3Jvcy5pbnRlcm5hbFwiLFxuXHRcIm1kY1wiOiBcInNhcC51aS5tZGNcIixcblx0XCJtZGNhdFwiOiBcInNhcC51aS5tZGMuYWN0aW9udG9vbGJhclwiLFxuXHRcIm1kY0ZpZWxkXCI6IFwic2FwLnVpLm1kYy5maWVsZFwiLFxuXHRcIm1kY1RhYmxlXCI6IFwic2FwLnVpLm1kYy50YWJsZVwiLFxuXHRcInVcIjogXCJzYXAudWkudW5pZmllZFwiLFxuXHRcIm1hY3JvTWljcm9DaGFydFwiOiBcInNhcC5mZS5tYWNyb3MubWljcm9jaGFydFwiLFxuXHRcIm1pY3JvQ2hhcnRcIjogXCJzYXAuc3VpdGUudWkubWljcm9jaGFydFwiLFxuXHRcIm1hY3JvVGFibGVcIjogXCJzYXAuZmUubWFjcm9zLnRhYmxlXCJcbn07XG5jb25zdCBzZWxlY3QgPSB4cGF0aC51c2VOYW1lc3BhY2VzKG5hbWVTcGFjZU1hcCk7XG5cbmZ1bmN0aW9uIF9nZXRUZW1wbGF0ZWRTZWxlY3Rvcih4bWxkb206IE5vZGUsIHNlbGVjdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuXHQvKipcblx0ICogaWYgYSByb290IGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgZHVyaW5nIHRoZSB0ZW1wbGF0aW5nIGJ5IG91ciBKZXN0IFRlbXBsYXRpbmcgbWV0aG9kc1xuXHQgKiB0aGUgcm9vdCBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZSBzZWxlY3RvciBwYXRoLlxuXHQgKi9cblx0Y29uc3Qgcm9vdFBhdGggPSBcIi9yb290XCI7XG5cdHJldHVybiBgJHt4bWxkb20ubm9kZU5hbWUgPT09IFwicm9vdFwiICYmICFzZWxlY3Rvci5zdGFydHNXaXRoKHJvb3RQYXRoKSA/IHJvb3RQYXRoIDogXCJcIn0ke3NlbGVjdG9yfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9idWlsZFByZVByb2Nlc3NvclNldHRpbmdzKFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9XG4pOiBQcm9taXNlPFByZVByb2Nlc3NvclNldHRpbmdzVHlwZT4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cblx0Ly8gVG8gZW5zdXJlIG91ciBtYWNybyBjYW4gdXNlICNzZXRCaW5kaW5nQ29udGV4dCB3ZSBlbnN1cmUgdGhlcmUgaXMgYSBwcmUgZXhpc3RpbmcgSlNPTk1vZGVsIGZvciBjb252ZXJ0ZXJDb250ZXh0XG5cdC8vIGlmIG5vdCBhbHJlYWR5IHBhc3NlZCB0byB0ZWggdGVtcGxhdGluZ1xuXHRpZiAoIW1Nb2RlbHMuaGFzT3duUHJvcGVydHkoXCJjb252ZXJ0ZXJDb250ZXh0XCIpKSB7XG5cdFx0bU1vZGVscyA9IE9iamVjdC5hc3NpZ24obU1vZGVscywgeyBcImNvbnZlcnRlckNvbnRleHRcIjogbmV3IFRlbXBsYXRlTW9kZWwoe30sIG9NZXRhTW9kZWwpIH0pO1xuXHR9XG5cblx0T2JqZWN0LmtleXMobU1vZGVscykuZm9yRWFjaChmdW5jdGlvbiAoc01vZGVsTmFtZSkge1xuXHRcdGlmIChtTW9kZWxzW3NNb2RlbE5hbWVdICYmIG1Nb2RlbHNbc01vZGVsTmFtZV0uaXNUZW1wbGF0ZU1vZGVsKSB7XG5cdFx0XHRtTW9kZWxzW3NNb2RlbE5hbWVdID0gbmV3IFRlbXBsYXRlTW9kZWwobU1vZGVsc1tzTW9kZWxOYW1lXS5kYXRhLCBvTWV0YU1vZGVsKTtcblx0XHR9XG5cdH0pO1xuXG5cdGNvbnN0IHNldHRpbmdzOiBhbnkgPSB7XG5cdFx0bW9kZWxzOiBPYmplY3QuYXNzaWduKFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWxcblx0XHRcdH0sXG5cdFx0XHRtTW9kZWxzXG5cdFx0KSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9XG5cdH07XG5cblx0Ly9JbmplY3QgbW9kZWxzIGFuZCBiaW5kaW5nQ29udGV4dHNcblx0T2JqZWN0LmtleXMobUJpbmRpbmdDb250ZXh0cykuZm9yRWFjaChmdW5jdGlvbiAoc0tleSkge1xuXHRcdC8qIEFzc2VydCB0byBtYWtlIHN1cmUgdGhlIGFubm90YXRpb25zIGFyZSBpbiB0aGUgdGVzdCBtZXRhZGF0YSAtPiBhdm9pZCBtaXNsZWFkaW5nIHRlc3RzICovXG5cdFx0ZXhwZWN0KHR5cGVvZiBvTWV0YU1vZGVsLmdldE9iamVjdChtQmluZGluZ0NvbnRleHRzW3NLZXldKSkudG9CZURlZmluZWQoKTtcblx0XHRjb25zdCBvTW9kZWwgPSBtTW9kZWxzW3NLZXldIHx8IG9NZXRhTW9kZWw7XG5cdFx0c2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW3NLZXldID0gb01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pOyAvL1ZhbHVlIGlzIHNQYXRoXG5cdFx0c2V0dGluZ3MubW9kZWxzW3NLZXldID0gb01vZGVsO1xuXHR9KTtcblx0cmV0dXJuIHNldHRpbmdzO1xufVxuXG5mdW5jdGlvbiBfcmVtb3ZlQ29tbWVudEZyb21YbWwoeG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gZm9ybWF0WG1sKHhtbCwge1xuXHRcdGZpbHRlcjogKG5vZGU6IGFueSkgPT4gbm9kZS50eXBlICE9PSBcIkNvbW1lbnRcIlxuXHR9KTtcbn1cblxuZnVuY3Rpb24gX2xvYWRSZXNvdXJjZVZpZXcodmlld05hbWU6IHN0cmluZyk6IEVsZW1lbnQge1xuXHRjb25zdCBuYW1lID0gdmlld05hbWUucmVwbGFjZSgvXFwuL2csIFwiL1wiKSArIFwiLnZpZXcueG1sXCI7XG5cdGNvbnN0IHZpZXcgPSBMb2FkZXJFeHRlbnNpb25zLmxvYWRSZXNvdXJjZShuYW1lKTtcblx0cmV0dXJuIHZpZXcuZG9jdW1lbnRFbGVtZW50O1xufVxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJNYWNybyA9IGZ1bmN0aW9uIChtYWNyb01ldGFkYXRhOiBhbnkpIHtcblx0cmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKG1hY3JvTWV0YWRhdGEpO1xufTtcbmV4cG9ydCBjb25zdCB1bnJlZ2lzdGVyTWFjcm8gPSBmdW5jdGlvbiAobWFjcm9NZXRhZGF0YTogYW55KSB7XG5cdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4obnVsbCwgbWFjcm9NZXRhZGF0YS5uYW1lc3BhY2UsIG1hY3JvTWV0YWRhdGEubmFtZSk7XG5cdGlmIChtYWNyb01ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSkge1xuXHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4obnVsbCwgbWFjcm9NZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UsIG1hY3JvTWV0YWRhdGEubmFtZSk7XG5cdH1cbn07XG5leHBvcnQgY29uc3QgcnVuWFBhdGhRdWVyeSA9IGZ1bmN0aW9uIChzZWxlY3Rvcjogc3RyaW5nLCB4bWxkb206IE5vZGUgfCB1bmRlZmluZWQpIHtcblx0cmV0dXJuIHNlbGVjdChzZWxlY3RvciwgeG1sZG9tKTtcbn07XG5cbmV4cGVjdC5leHRlbmQoe1xuXHR0b0hhdmVDb250cm9sKHhtbGRvbSwgc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoX2dldFRlbXBsYXRlZFNlbGVjdG9yKHhtbGRvbSwgc2VsZWN0b3IpLCB4bWxkb20pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG91dHB1dFhtbCA9IHNlcmlhbGl6ZVhNTCh4bWxkb20pO1xuXHRcdFx0XHRyZXR1cm4gYGRpZCBub3QgZmluZCBjb250cm9scyBtYXRjaGluZyAke3NlbGVjdG9yfSBpbiBnZW5lcmF0ZWQgeG1sOlxcbiAke291dHB1dFhtbH1gO1xuXHRcdFx0fSxcblx0XHRcdHBhc3M6IG5vZGVzICYmIG5vZGVzLmxlbmd0aCA+PSAxXG5cdFx0fTtcblx0fSxcblx0dG9Ob3RIYXZlQ29udHJvbCh4bWxkb20sIHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgbm9kZXMgPSBydW5YUGF0aFF1ZXJ5KF9nZXRUZW1wbGF0ZWRTZWxlY3Rvcih4bWxkb20sIHNlbGVjdG9yKSwgeG1sZG9tKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVzc2FnZTogKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBvdXRwdXRYbWwgPSBzZXJpYWxpemVYTUwoeG1sZG9tKTtcblx0XHRcdFx0cmV0dXJuIGBUaGVyZSBpcyBhIGNvbnRyb2wgbWF0Y2hpbmcgJHtzZWxlY3Rvcn0gaW4gZ2VuZXJhdGVkIHhtbDpcXG4gJHtvdXRwdXRYbWx9YDtcblx0XHRcdH0sXG5cdFx0XHRwYXNzOiBub2RlcyAmJiBub2Rlcy5sZW5ndGggPT09IDBcblx0XHR9O1xuXHR9XG59KTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdEJ1aWxkaW5nQmxvY2tYTUwgPSBmdW5jdGlvbiAoeG1sU3RyaW5nOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuXHRpZiAoQXJyYXkuaXNBcnJheSh4bWxTdHJpbmcpKSB7XG5cdFx0eG1sU3RyaW5nID0geG1sU3RyaW5nLmpvaW4oXCJcIik7XG5cdH1cblx0bGV0IHhtbEZvcm1hdHRlZCA9IGZvcm1hdFhNTCh4bWxTdHJpbmcpO1xuXHR4bWxGb3JtYXR0ZWQgPSB4bWxGb3JtYXR0ZWQucmVwbGFjZSgvdWlkLS1pZC1bMC05XXsxM30tWzAtOV17MSwyfS9nLCBcInVpZC0taWRcIik7XG5cdHJldHVybiB4bWxGb3JtYXR0ZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udHJvbEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChjb250cm9sU2VsZWN0b3I6IHN0cmluZywgYXR0cmlidXRlTmFtZTogc3RyaW5nLCB4bWxEb206IE5vZGUpIHtcblx0Y29uc3Qgc2VsZWN0b3IgPSBgc3RyaW5nKCR7X2dldFRlbXBsYXRlZFNlbGVjdG9yKHhtbERvbSwgY29udHJvbFNlbGVjdG9yKX0vQCR7YXR0cmlidXRlTmFtZX0pYDtcblx0cmV0dXJuIHJ1blhQYXRoUXVlcnkoc2VsZWN0b3IsIHhtbERvbSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplWE1MID0gZnVuY3Rpb24gKHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZXJpYWxpemVyID0gbmV3IHdpbmRvdy5YTUxTZXJpYWxpemVyKCk7XG5cdGNvbnN0IHhtbFN0cmluZyA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcoeG1sRG9tKTtcblx0cmV0dXJuIGZvcm1hdFhNTCh4bWxTdHJpbmcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFhNTCA9IGZ1bmN0aW9uICh4bWxTdHJpbmc6IHN0cmluZykge1xuXHRyZXR1cm4gZm9ybWF0KFxuXHRcdHhtbFN0cmluZyxcblx0XHR7IHBhcnNlcjogXCJ4bWxcIiwgeG1sV2hpdGVzcGFjZVNlbnNpdGl2aXR5OiBcImlnbm9yZVwiIH0gYXMgUGFydGlhbDxSZXF1aXJlZE9wdGlvbnM+IC8qIG9wdGlvbnMgYnkgdGhlIFByZXR0aWVyIFhNTCBwbHVnaW4gKi9cblx0KTtcbn07XG5cbi8qKlxuICogQ29tcGlsZSBhIENEUyBmaWxlIGludG8gYW4gRURNWCBmaWxlLlxuICpcbiAqIEBwYXJhbSBjZHNVcmwgVGhlIHBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgQ0RTIGRlZmluaXRpb24uIFRoaXMgZmlsZSBtdXN0IGRlY2xhcmUgdGhlIG5hbWVzcGFjZVxuICogc2FwLmZlLnRlc3QgYW5kIGEgc2VydmljZSBKZXN0U2VydmljZVxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhlIEVETVggb3V0cHV0XG4gKiBAcGFyYW0gZWRteEZpbGVOYW1lIEFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVkIEVETVggbWV0YWRhdGEgZmlsZVxuICogQHJldHVybnMgVGhlIHBhdGggb2YgdGhlIGdlbmVyYXRlZCBFRE1YXG4gKi9cbmV4cG9ydCBjb25zdCBjb21waWxlQ0RTID0gZnVuY3Rpb24gKFxuXHRjZHNVcmw6IHN0cmluZyxcblx0b3B0aW9uczogY29tcGlsZXIuT0RhdGFPcHRpb25zID0ge30sXG5cdGVkbXhGaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoY2RzVXJsKS5yZXBsYWNlKFwiLmNkc1wiLCBcIi54bWxcIilcbikge1xuXHRjb25zdCBjZHNTdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoY2RzVXJsLCBcInV0Zi04XCIpO1xuXHRjb25zdCBlZG14Q29udGVudCA9IGNkczJlZG14KGNkc1N0cmluZywgXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLCBvcHRpb25zKTtcblx0Y29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKGNkc1VybCwgXCIuLlwiLCBcImdlblwiKTtcblxuXHRjb25zdCBlZG14RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyLCBlZG14RmlsZU5hbWUpO1xuXG5cdGZzLm1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdGZzLndyaXRlRmlsZVN5bmMoZWRteEZpbGVQYXRoLCBlZG14Q29udGVudCk7XG5cdHJldHVybiBlZG14RmlsZVBhdGg7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgQ0RTIHRvIEVETVguXG4gKlxuICogQHBhcmFtIGNkcyBUaGUgQ0RTIG1vZGVsLiBJdCBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgc2VydmljZS5cbiAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2VydmljZSB0byBiZSBjb21waWxlZC4gRGVmYXVsdHMgdG8gXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhlIEVETVggb3V0cHV0XG4gKiBAcmV0dXJucyBUaGUgY29tcGlsZWQgc2VydmljZSBtb2RlbCBhcyBFRE1YLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2RzMmVkbXgoY2RzOiBzdHJpbmcsIHNlcnZpY2UgPSBcInNhcC5mZS50ZXN0Lkplc3RTZXJ2aWNlXCIsIG9wdGlvbnM6IGNvbXBpbGVyLk9EYXRhT3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7IFwic291cmNlLmNkc1wiOiBjZHMgfTtcblxuXHQvLyBhbGxvdyB0byBpbmNsdWRlIHN0dWZmIGZyb20gQHNhcC9jZHMvY29tbW9uXG5cdGlmIChjZHMuaW5jbHVkZXMoXCInQHNhcC9jZHMvY29tbW9uJ1wiKSkge1xuXHRcdHNvdXJjZXNbXCJjb21tb24uY2RzXCJdID0gZnMucmVhZEZpbGVTeW5jKHJlcXVpcmUucmVzb2x2ZShcIkBzYXAvY2RzL2NvbW1vbi5jZHNcIiksIFwidXRmLThcIik7XG5cdH1cblxuXHRjb25zdCBjc24gPSBjb21waWxlci5jb21waWxlU291cmNlcyhzb3VyY2VzLCB7fSk7XG5cblx0Y29uc3QgZWRteE9wdGlvbnM6IGNvbXBpbGVyLk9EYXRhT3B0aW9ucyA9IHtcblx0XHRvZGF0YUZvcmVpZ25LZXlzOiB0cnVlLFxuXHRcdG9kYXRhRm9ybWF0OiBcInN0cnVjdHVyZWRcIixcblx0XHRvZGF0YUNvbnRhaW5tZW50OiBmYWxzZSxcblx0XHQuLi5vcHRpb25zLFxuXHRcdHNlcnZpY2U6IHNlcnZpY2Vcblx0fTtcblxuXHRjb25zdCBlZG14ID0gY29tcGlsZXIudG8uZWRteChjc24sIGVkbXhPcHRpb25zKTtcblx0aWYgKCFlZG14KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBDb21waWxhdGlvbiBmYWlsZWQuIEhpbnQ6IE1ha2Ugc3VyZSB0aGF0IHRoZSBDRFMgbW9kZWwgZGVmaW5lcyBzZXJ2aWNlICR7c2VydmljZX0uYCk7XG5cdH1cblx0cmV0dXJuIGVkbXg7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGYWtlU2lkZUVmZmVjdHNTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogUHJvbWlzZTxhbnk+IHtcblx0Y29uc3Qgb1NlcnZpY2VDb250ZXh0ID0geyBzY29wZU9iamVjdDoge30sIHNjb3BlVHlwZTogXCJcIiwgc2V0dGluZ3M6IHt9IH07XG5cdHJldHVybiBuZXcgU2lkZUVmZmVjdHNGYWN0b3J5KCkuY3JlYXRlSW5zdGFuY2Uob1NlcnZpY2VDb250ZXh0KS50aGVuKGZ1bmN0aW9uIChvU2VydmljZUluc3RhbmNlOiBhbnkpIHtcblx0XHRjb25zdCBvSmVzdFNpZGVFZmZlY3RzU2VydmljZSA9IG9TZXJ2aWNlSW5zdGFuY2UuZ2V0SW50ZXJmYWNlKCk7XG5cdFx0b0plc3RTaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNjb3BlT2JqZWN0OiB7XG5cdFx0XHRcdFx0Z2V0TW9kZWw6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdGdldE1ldGFNb2RlbDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvTWV0YU1vZGVsO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9O1xuXHRcdHJldHVybiBvSmVzdFNpZGVFZmZlY3RzU2VydmljZTtcblx0fSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmFrZURpYWdub3N0aWNzID0gZnVuY3Rpb24gKCk6IElEaWFnbm9zdGljcyB7XG5cdGNvbnN0IGlzc3VlczogYW55W10gPSBbXTtcblx0cmV0dXJuIHtcblx0XHRhZGRJc3N1ZShpc3N1ZUNhdGVnb3J5OiBJc3N1ZUNhdGVnb3J5LCBpc3N1ZVNldmVyaXR5OiBJc3N1ZVNldmVyaXR5LCBkZXRhaWxzOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRcdGlzc3Vlcy5wdXNoKHtcblx0XHRcdFx0aXNzdWVDYXRlZ29yeSxcblx0XHRcdFx0aXNzdWVTZXZlcml0eSxcblx0XHRcdFx0ZGV0YWlsc1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHRnZXRJc3N1ZXMoKTogYW55W10ge1xuXHRcdFx0cmV0dXJuIGlzc3Vlcztcblx0XHR9LFxuXHRcdGNoZWNrSWZJc3N1ZUV4aXN0cyhpc3N1ZUNhdGVnb3J5OiBJc3N1ZUNhdGVnb3J5LCBpc3N1ZVNldmVyaXR5OiBJc3N1ZVNldmVyaXR5LCBkZXRhaWxzOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdHJldHVybiBpc3N1ZXMuZmluZCgoaXNzdWUpID0+IHtcblx0XHRcdFx0cmV0dXJuIGlzc3VlLmlzc3VlQ2F0ZWdvcnkgPT09IGlzc3VlQ2F0ZWdvcnkgJiYgaXNzdWUuaXNzdWVTZXZlcml0eSA9PT0gaXNzdWVTZXZlcml0eSAmJiBpc3N1ZS5kZXRhaWxzID09PSBkZXRhaWxzO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnZlcnRlckNvbnRleHRGb3JUZXN0ID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZWRUeXBlczogQ29udmVydGVkTWV0YWRhdGEsXG5cdG1hbmlmZXN0U2V0dGluZ3M6IExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzIHwgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3Ncbikge1xuXHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZWRUeXBlcy5lbnRpdHlTZXRzLmZpbmQoKGVzKSA9PiBlcy5uYW1lID09PSBtYW5pZmVzdFNldHRpbmdzLmVudGl0eVNldCk7XG5cdGNvbnN0IGRhdGFNb2RlbFBhdGggPSBnZXREYXRhTW9kZWxPYmplY3RQYXRoRm9yUHJvcGVydHkoZW50aXR5U2V0IGFzIEVudGl0eVNldCwgY29udmVydGVkVHlwZXMsIGVudGl0eVNldCk7XG5cdHJldHVybiBuZXcgQ29udmVydGVyQ29udGV4dChjb252ZXJ0ZWRUeXBlcywgbWFuaWZlc3RTZXR0aW5ncywgZ2V0RmFrZURpYWdub3N0aWNzKCksIG1lcmdlLCBkYXRhTW9kZWxQYXRoKTtcbn07XG5jb25zdCBtZXRhTW9kZWxDYWNoZTogYW55ID0ge307XG5leHBvcnQgY29uc3QgZ2V0TWV0YU1vZGVsID0gYXN5bmMgZnVuY3Rpb24gKHNNZXRhZGF0YVVybDogc3RyaW5nKSB7XG5cdGNvbnN0IG9SZXF1ZXN0b3IgPSBfTWV0YWRhdGFSZXF1ZXN0b3IuY3JlYXRlKHt9LCBcIjQuMFwiLCB7fSk7XG5cdGlmICghbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBuZXcgKE9EYXRhTWV0YU1vZGVsIGFzIGFueSkob1JlcXVlc3Rvciwgc01ldGFkYXRhVXJsLCB1bmRlZmluZWQsIG51bGwpO1xuXHRcdGF3YWl0IG9NZXRhTW9kZWwuZmV0Y2hFbnRpdHlDb250YWluZXIoKTtcblx0XHRtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdID0gb01ldGFNb2RlbDtcblx0fVxuXG5cdHJldHVybiBtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZWRNZXRhZGF0YSxcblx0cHJvcGVydHk/OiBQcm9wZXJ0eSB8IEVudGl0eVNldCB8IEFueUFubm90YXRpb25cbik6IERhdGFNb2RlbE9iamVjdFBhdGgge1xuXHRjb25zdCB0YXJnZXRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoID0ge1xuXHRcdHN0YXJ0aW5nRW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IFtdLFxuXHRcdHRhcmdldE9iamVjdDogcHJvcGVydHksXG5cdFx0dGFyZ2V0RW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZTogZW50aXR5U2V0LmVudGl0eVR5cGUsXG5cdFx0Y29udmVydGVkVHlwZXM6IGNvbnZlcnRlZFR5cGVzXG5cdH07XG5cdHRhcmdldFBhdGguY29udGV4dExvY2F0aW9uID0gdGFyZ2V0UGF0aDtcblx0cmV0dXJuIHRhcmdldFBhdGg7XG59O1xuXG5leHBvcnQgY29uc3QgZXZhbHVhdGVCaW5kaW5nID0gZnVuY3Rpb24gKGJpbmRpbmdTdHJpbmc6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcblx0Y29uc3QgYmluZGluZ0VsZW1lbnQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoYmluZGluZ1N0cmluZyk7XG5cdHJldHVybiBiaW5kaW5nRWxlbWVudC5mb3JtYXR0ZXIuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbn07XG5cbnR5cGUgTW9kZWxDb250ZW50ID0ge1xuXHRbbmFtZTogc3RyaW5nXTogYW55O1xufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSBhIGJpbmRpbmcgYWdhaW5zdCBhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBiaW5kaW5nU3RyaW5nIFRoZSBiaW5kaW5nIHN0cmluZy5cbiAqIEBwYXJhbSBtb2RlbENvbnRlbnQgQ29udGVudCBvZiB0aGUgZGVmYXVsdCBtb2RlbCB0byB1c2UgZm9yIGV2YWx1YXRpb24uXG4gKiBAcGFyYW0gbmFtZWRNb2RlbHNDb250ZW50IENvbnRlbnRzIG9mIGFkZGl0aW9uYWwsIG5hbWVkIG1vZGVscyB0byB1c2UuXG4gKiBAcmV0dXJucyBUaGUgZXZhbHVhdGVkIGJpbmRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUJpbmRpbmdXaXRoTW9kZWwoXG5cdGJpbmRpbmdTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bW9kZWxDb250ZW50OiBNb2RlbENvbnRlbnQsXG5cdG5hbWVkTW9kZWxzQ29udGVudD86IHsgW21vZGVsTmFtZTogc3RyaW5nXTogTW9kZWxDb250ZW50IH1cbik6IHN0cmluZyB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRjb25zdCB0ZXh0ID0gbmV3IEludmlzaWJsZVRleHQoKTtcblx0dGV4dC5iaW5kUHJvcGVydHkoXCJ0ZXh0XCIsIGJpbmRpbmdFbGVtZW50KTtcblxuXHRjb25zdCBkZWZhdWx0TW9kZWwgPSBuZXcgSlNPTk1vZGVsKG1vZGVsQ29udGVudCk7XG5cdHRleHQuc2V0TW9kZWwoZGVmYXVsdE1vZGVsKTtcblx0dGV4dC5zZXRCaW5kaW5nQ29udGV4dChkZWZhdWx0TW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQpO1xuXG5cdGlmIChuYW1lZE1vZGVsc0NvbnRlbnQpIHtcblx0XHRmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhuYW1lZE1vZGVsc0NvbnRlbnQpKSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IG5ldyBKU09OTW9kZWwoY29udGVudCk7XG5cdFx0XHR0ZXh0LnNldE1vZGVsKG1vZGVsLCBuYW1lKTtcblx0XHRcdHRleHQuc2V0QmluZGluZ0NvbnRleHQobW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQsIG5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0ZXh0LmdldFRleHQoKTtcbn1cblxuY29uc3QgVEVTVFZJRVdJRCA9IFwidGVzdFZpZXdJZFwiO1xuXG5jb25zdCBhcHBseUZsZXhDaGFuZ2VzID0gYXN5bmMgZnVuY3Rpb24gKGFWYXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXM6IGFueVtdLCBvTWV0YU1vZGVsOiBNZXRhTW9kZWwsIHJlc3VsdFhNTDogYW55KSB7XG5cdC8vIHByZWZpeCBJZHNcblx0Wy4uLnJlc3VsdFhNTC5xdWVyeVNlbGVjdG9yQWxsKFwiW2lkXVwiKV0uZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdG5vZGUuaWQgPSBgJHtURVNUVklFV0lEfS0tJHtub2RlLmlkfWA7XG5cdH0pO1xuXHRjb25zdCBjaGFuZ2VzID0gY3JlYXRlRmxleGliaWxpdHlDaGFuZ2VzT2JqZWN0KFRFU1RWSUVXSUQsIGFWYXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXMpO1xuXHRjb25zdCBhcHBJZCA9IFwic29tZUNvbXBvbmVudFwiO1xuXHRjb25zdCBvTWFuaWZlc3QgPSB7XG5cdFx0XCJzYXAuYXBwXCI6IHtcblx0XHRcdGlkOiBhcHBJZCxcblx0XHRcdHR5cGU6IFwiYXBwbGljYXRpb25cIixcblx0XHRcdGNyb3NzTmF2aWdhdGlvbjoge1xuXHRcdFx0XHRvdXRib3VuZHM6IFtdXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQgPSB7XG5cdFx0Z2V0RGlhZ25vc3RpY3M6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoZ2V0RmFrZURpYWdub3N0aWNzKCkpLFxuXHRcdGdldE1vZGVsOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcblx0XHRcdGdldE1ldGFNb2RlbDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShvTWV0YU1vZGVsKVxuXHRcdH0pLFxuXHRcdGdldENvbXBvbmVudERhdGE6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoe30pLFxuXHRcdGdldE1hbmlmZXN0T2JqZWN0OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcblx0XHRcdGdldEVudHJ5OiBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiAob01hbmlmZXN0IGFzIGFueSlbbmFtZV07XG5cdFx0XHR9XG5cdFx0fSlcblx0fSBhcyB1bmtub3duIGFzIEFwcENvbXBvbmVudDtcblx0Ly9mYWtlIGNoYW5nZXNcblx0amVzdC5zcHlPbihBcHBTdG9yYWdlLCBcImxvYWRGbGV4RGF0YVwiKS5tb2NrUmV0dXJuVmFsdWUoUHJvbWlzZS5yZXNvbHZlKGNoYW5nZXMpKTtcblx0amVzdC5zcHlPbihDb21wb25lbnQsIFwiZ2V0XCIpLm1vY2tSZXR1cm5WYWx1ZShvQXBwQ29tcG9uZW50KTtcblx0amVzdC5zcHlPbihVdGlscywgXCJnZXRBcHBDb21wb25lbnRGb3JDb250cm9sXCIpLm1vY2tSZXR1cm5WYWx1ZShvQXBwQ29tcG9uZW50KTtcblx0YXdhaXQgRmxleFN0YXRlLmluaXRpYWxpemUoe1xuXHRcdGNvbXBvbmVudElkOiBhcHBJZFxuXHR9KTtcblx0cmVzdWx0WE1MID0gYXdhaXQgWG1sUHJlcHJvY2Vzc29yLnByb2Nlc3MocmVzdWx0WE1MLCB7IG5hbWU6IFwiVGVzdCBGcmFnbWVudFwiLCBjb21wb25lbnRJZDogYXBwSWQsIGlkOiBURVNUVklFV0lEIH0pO1xuXG5cdC8vQXNzZXJ0IHRoYXQgYWxsIGNoYW5nZXMgaGF2ZSBiZWVuIGFwcGxpZWRcblx0Y29uc3QgY2hhbmdlc0FwcGxpZWQgPSBnZXRDaGFuZ2VzRnJvbVhNTChyZXN1bHRYTUwpO1xuXHRleHBlY3QoY2hhbmdlc0FwcGxpZWQubGVuZ3RoKS50b0JlKGFWYXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXMubGVuZ3RoKTtcblx0cmV0dXJuIHJlc3VsdFhNTDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDaGFuZ2VzRnJvbVhNTCA9ICh4bWw6IGFueSkgPT5cblx0Wy4uLnhtbC5xdWVyeVNlbGVjdG9yQWxsKFwiKlwiKV1cblx0XHQuZmxhdE1hcCgoZSkgPT4gWy4uLmUuYXR0cmlidXRlc10ubWFwKChhKSA9PiBhLm5hbWUpKVxuXHRcdC5maWx0ZXIoKGF0dHIpID0+IGF0dHIuaW5jbHVkZXMoXCJzYXAudWkuZmwuYXBwbGllZENoYW5nZXNcIikpO1xuXG5leHBvcnQgY29uc3QgZ2V0VGVtcGxhdGluZ1Jlc3VsdCA9IGFzeW5jIGZ1bmN0aW9uIChcblx0eG1sSW5wdXQ6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IGFueTsgZW50aXR5U2V0Pzogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9LFxuXHRhVmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzPzogYW55W11cbikge1xuXHRjb25zdCB0ZW1wbGF0ZWRYbWwgPSBgPHJvb3Q+JHt4bWxJbnB1dH08L3Jvb3Q+YDtcblx0Y29uc3QgcGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTtcblx0Y29uc3QgeG1sRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh0ZW1wbGF0ZWRYbWwsIFwidGV4dC94bWxcIik7XG5cdC8vIFRvIGVuc3VyZSBvdXIgbWFjcm8gY2FuIHVzZSAjc2V0QmluZGluZ0NvbnRleHQgd2UgZW5zdXJlIHRoZXJlIGlzIGEgcHJlIGV4aXN0aW5nIEpTT05Nb2RlbCBmb3IgY29udmVydGVyQ29udGV4dFxuXHQvLyBpZiBub3QgYWxyZWFkeSBwYXNzZWQgdG8gdGVoIHRlbXBsYXRpbmdcblxuXHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cdGNvbnN0IG9QcmVwcm9jZXNzb3JTZXR0aW5ncyA9IGF3YWl0IF9idWlsZFByZVByb2Nlc3NvclNldHRpbmdzKHNNZXRhZGF0YVVybCwgbUJpbmRpbmdDb250ZXh0cywgbU1vZGVscyk7XG5cblx0Ly9UaGlzIGNvbnRleHQgZm9yIG1hY3JvIHRlc3Rpbmdcblx0aWYgKG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbXCJ0aGlzXCJdKSB7XG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tcInRoaXNcIl0gPSBvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdH1cblxuXHRsZXQgcmVzdWx0WE1MID0gKGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKHhtbERvYy5maXJzdEVsZW1lbnRDaGlsZCEsIHsgbmFtZTogXCJUZXN0IEZyYWdtZW50XCIgfSwgb1ByZXByb2Nlc3NvclNldHRpbmdzKSkgYXMgYW55O1xuXG5cdGlmIChhVmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzKSB7XG5cdFx0Ly8gYXBwbHkgZmxleCBjaGFuZ2VzXG5cdFx0cmVzdWx0WE1MID0gYXdhaXQgYXBwbHlGbGV4Q2hhbmdlcyhhVmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzLCBvTWV0YU1vZGVsLCByZXN1bHRYTUwpO1xuXHR9XG5cdHJldHVybiByZXN1bHRYTUw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGVtcGxhdGVkWE1MID0gYXN5bmMgZnVuY3Rpb24gKFxuXHR4bWxJbnB1dDogc3RyaW5nLFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9LFxuXHRhVmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzPzogYW55W11cbikge1xuXHRjb25zdCB0ZW1wbGF0ZWRYTUwgPSBhd2FpdCBnZXRUZW1wbGF0aW5nUmVzdWx0KHhtbElucHV0LCBzTWV0YWRhdGFVcmwsIG1CaW5kaW5nQ29udGV4dHMsIG1Nb2RlbHMsIGFWYXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXMpO1xuXHRyZXR1cm4gc2VyaWFsaXplWE1MKHRlbXBsYXRlZFhNTCk7XG59O1xuXG4vKipcbiAqIFByb2Nlc3MgdGhlIHJlcXVlc3RlZCB2aWV3IHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHBhcmFtIG5hbWUgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHZpZXcgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHNNZXRhZGF0YVVybCBVcmwgb2YgdGhlIG1ldGFkYXRhLlxuICogQHBhcmFtIG1CaW5kaW5nQ29udGV4dHMgTWFwIG9mIHRoZSBiaW5kaW5nQ29udGV4dHMgdG8gc2V0IG9uIHRoZSBtb2RlbHMuXG4gKiBAcGFyYW0gbU1vZGVscyBNYXAgb2YgdGhlIG1vZGVscy5cbiAqIEBwYXJhbSBhVmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzXG4gKiBAcmV0dXJucyBUZW1wbGF0ZWQgdmlldyBhcyBzdHJpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NWaWV3KFxuXHRuYW1lOiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGFWYXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXM/OiBhbnlbXVxuKTogUHJvbWlzZTxKZXN0VGVtcGxhdGVkVmlldz4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cdGNvbnN0IG9WaWV3RG9jdW1lbnQgPSBfbG9hZFJlc291cmNlVmlldyhuYW1lKTtcblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzID0gYXdhaXQgX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3Moc01ldGFkYXRhVXJsLCBtQmluZGluZ0NvbnRleHRzLCBtTW9kZWxzKTtcblx0bGV0IG9QcmVwcm9jZXNzZWRWaWV3ID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3Mob1ZpZXdEb2N1bWVudCwgeyBuYW1lOiBuYW1lIH0sIG9QcmVwcm9jZXNzb3JTZXR0aW5ncyk7XG5cdGlmIChhVmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzKSB7XG5cdFx0b1ByZXByb2Nlc3NlZFZpZXcgPSBhd2FpdCBhcHBseUZsZXhDaGFuZ2VzKGFWYXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXMgfHwgW10sIG9NZXRhTW9kZWwsIG9QcmVwcm9jZXNzZWRWaWV3KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGFzRWxlbWVudDogb1ByZXByb2Nlc3NlZFZpZXcsXG5cdFx0YXNTdHJpbmc6IF9yZW1vdmVDb21tZW50RnJvbVhtbChvUHJlcHJvY2Vzc2VkVmlldz8ub3V0ZXJIVE1MIHx8IFwiXCIpXG5cdH07XG59XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgcmVxdWVzdGVkIFhNTCBmcmFnbWVudCB3aXRoIHRoZSBwcm92aWRlZCBkYXRhLlxuICpcbiAqIEBwYXJhbSBuYW1lIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBmcmFnbWVudCB0byBiZSB0ZXN0ZWQuXG4gKiBAcGFyYW0gdGVzdERhdGEgVGVzdCBkYXRhIGNvbnNpc3RpbmdcbiAqIEByZXR1cm5zIFRlbXBsYXRlZCBmcmFnbWVudCBhcyBzdHJpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGcmFnbWVudChuYW1lOiBzdHJpbmcsIHRlc3REYXRhOiB7IFttb2RlbDogc3RyaW5nXTogb2JqZWN0IH0pOiBQcm9taXNlPHN0cmluZz4ge1xuXHRjb25zdCBpbnB1dFhtbCA9IGA8cm9vdD48Y29yZTpGcmFnbWVudCBmcmFnbWVudE5hbWU9XCIke25hbWV9XCIgdHlwZT1cIlhNTFwiIHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiIC8+PC9yb290PmA7XG5cdGNvbnN0IHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG5cdGNvbnN0IGlucHV0RG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhpbnB1dFhtbCwgXCJ0ZXh0L3htbFwiKTtcblxuXHQvLyBidWlsZCBtb2RlbCBhbmQgYmluZGluZ3MgZm9yIGdpdmVuIHRlc3QgZGF0YVxuXHRjb25zdCBzZXR0aW5ncyA9IHtcblx0XHRtb2RlbHM6IHt9IGFzIHsgW25hbWU6IHN0cmluZ106IEpTT05Nb2RlbCB9LFxuXHRcdGJpbmRpbmdDb250ZXh0czoge30gYXMgeyBbbmFtZTogc3RyaW5nXTogb2JqZWN0IH1cblx0fTtcblx0Zm9yIChjb25zdCBtb2RlbCBpbiB0ZXN0RGF0YSkge1xuXHRcdGNvbnN0IGpzb25Nb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0XHRqc29uTW9kZWwuc2V0RGF0YSh0ZXN0RGF0YVttb2RlbF0pO1xuXHRcdHNldHRpbmdzLm1vZGVsc1ttb2RlbF0gPSBqc29uTW9kZWw7XG5cdFx0c2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW21vZGVsXSA9IHNldHRpbmdzLm1vZGVsc1ttb2RlbF0uY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQ7XG5cdH1cblxuXHQvLyBleGVjdXRlIHRoZSBwcmUtcHJvY2Vzc29yXG5cdGNvbnN0IHJlc3VsdERvYyA9IGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKGlucHV0RG9jLmZpcnN0RWxlbWVudENoaWxkLCB7IG5hbWUgfSwgc2V0dGluZ3MpO1xuXG5cdC8vIGV4Y2x1ZGUgbmVzdGVkIGZyYWdtZW50cyBmcm9tIHRlc3Qgc25hcHNob3RzXG5cdGNvbnN0IGZyYWdtZW50cyA9IHJlc3VsdERvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNvcmU6RnJhZ21lbnRcIikgYXMgYW55O1xuXHRpZiAoZnJhZ21lbnRzPy5sZW5ndGggPiAwKSB7XG5cdFx0Zm9yIChjb25zdCBmcmFnbWVudCBvZiBmcmFnbWVudHMpIHtcblx0XHRcdGZyYWdtZW50LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0fVxuXHR9XG5cblx0Ly8gS2VlcCB0aGUgZnJhZ21lbnQgcmVzdWx0IGFzIGNoaWxkIG9mIHJvb3Qgbm9kZSB3aGVuIGZyYWdtZW50IGdlbmVyYXRlcyBtdWx0aXBsZSByb290IGNvbnRyb2xzXG5cdGNvbnN0IHhtbFJlc3VsdCA9IHJlc3VsdERvYy5jaGlsZHJlbi5sZW5ndGggPiAxID8gcmVzdWx0RG9jLm91dGVySFRNTCA6IHJlc3VsdERvYy5pbm5lckhUTUw7XG5cblx0cmV0dXJuIF9yZW1vdmVDb21tZW50RnJvbVhtbCh4bWxSZXN1bHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQ29udHJvbChjb250cm9sVG9TZXJpYWxpemU6IENvbnRyb2wgfCBDb250cm9sW10pIHtcblx0bGV0IHRhYkNvdW50ID0gMDtcblx0ZnVuY3Rpb24gZ2V0VGFiKHRvQWRkOiBudW1iZXIgPSAwKSB7XG5cdFx0bGV0IHRhYiA9IFwiXCI7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0YWJDb3VudCArIHRvQWRkOyBpKyspIHtcblx0XHRcdHRhYiArPSBcIlxcdFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFiO1xuXHR9XG5cdGNvbnN0IHNlcmlhbGl6ZURlbGVnYXRlID0ge1xuXHRcdHN0YXJ0OiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdGxldCBjb250cm9sRGV0YWlsID0gXCJcIjtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLmdldFBhcmVudCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5kZXhJblBhcmVudCA9IChjb250cm9sLmdldFBhcmVudCgpLmdldEFnZ3JlZ2F0aW9uKHNBZ2dyZWdhdGlvbk5hbWUpIGFzIE1hbmFnZWRPYmplY3RbXSk/LmluZGV4T2Y/Lihjb250cm9sKTtcblx0XHRcdFx0XHRpZiAoaW5kZXhJblBhcmVudCA+IDApIHtcblx0XHRcdFx0XHRcdGNvbnRyb2xEZXRhaWwgKz0gYCxcXG4ke2dldFRhYigpfWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb250cm9sRGV0YWlsICs9IGAke2NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCl9KGA7XG5cdFx0XHRyZXR1cm4gY29udHJvbERldGFpbDtcblx0XHR9LFxuXHRcdGVuZDogZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIFwifSlcIjtcblx0XHR9LFxuXHRcdG1pZGRsZTogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSkge1xuXHRcdFx0bGV0IGRhdGEgPSBge2lkOiAke2NvbnRyb2wuZ2V0SWQoKX1gO1xuXHRcdFx0Zm9yIChjb25zdCBvQ29udHJvbEtleSBpbiBjb250cm9sLm1Qcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLm1Qcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGRhdGEgKz0gYCxcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fTogJHtjb250cm9sLm1Qcm9wZXJ0aWVzW29Db250cm9sS2V5XX1gO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wubUJpbmRpbmdJbmZvcy5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRjb25zdCBiaW5kaW5nRGV0YWlsID0gY29udHJvbC5tQmluZGluZ0luZm9zW29Db250cm9sS2V5XTtcblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06IGZvcm1hdHRlcigke2JpbmRpbmdEZXRhaWwucGFydHMubWFwKFxuXHRcdFx0XHRcdFx0KGJpbmRpbmdJbmZvOiBhbnkpID0+IGBcXG4ke2dldFRhYigxKX0ke2JpbmRpbmdJbmZvLm1vZGVsID8gYmluZGluZ0luZm8ubW9kZWwgOiBcIlwifT4ke2JpbmRpbmdJbmZvLnBhdGh9YFxuXHRcdFx0XHRcdCl9KWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGZvciAoY29uc3Qgb0NvbnRyb2xLZXkgaW4gY29udHJvbC5tQXNzb2NpYXRpb25zKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLm1Bc3NvY2lhdGlvbnMuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9ICR7b0NvbnRyb2xLZXl9OiAke2NvbnRyb2wubUFzc29jaWF0aW9uc1tvQ29udHJvbEtleV1bMF19YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGF0YSArPSBgYDtcblx0XHRcdHJldHVybiBkYXRhO1xuXHRcdH0sXG5cdFx0c3RhcnRBZ2dyZWdhdGlvbjogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSwgc05hbWU6IHN0cmluZykge1xuXHRcdFx0bGV0IG91dCA9IGAsXFxuJHtnZXRUYWIoKX0ke3NOYW1lfWA7XG5cdFx0XHR0YWJDb3VudCsrO1xuXG5cdFx0XHRpZiAoY29udHJvbC5tQmluZGluZ0luZm9zW3NOYW1lXSkge1xuXHRcdFx0XHRvdXQgKz0gYD17IHBhdGg6JyR7Y29udHJvbC5tQmluZGluZ0luZm9zW3NOYW1lXS5wYXRofScsIHRlbXBsYXRlOlxcbiR7Z2V0VGFiKCl9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dCArPSBgPVtcXG4ke2dldFRhYigpfWA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb3V0O1xuXHRcdH0sXG5cdFx0ZW5kQWdncmVnYXRpb246IGZ1bmN0aW9uIChjb250cm9sOiBhbnksIHNOYW1lOiBzdHJpbmcpIHtcblx0XHRcdHRhYkNvdW50LS07XG5cdFx0XHRpZiAoY29udHJvbC5tQmluZGluZ0luZm9zW3NOYW1lXSkge1xuXHRcdFx0XHRyZXR1cm4gYFxcbiR7Z2V0VGFiKCl9fWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gYFxcbiR7Z2V0VGFiKCl9XWA7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoQXJyYXkuaXNBcnJheShjb250cm9sVG9TZXJpYWxpemUpKSB7XG5cdFx0cmV0dXJuIGNvbnRyb2xUb1NlcmlhbGl6ZS5tYXAoKGNvbnRyb2xUb1JlbmRlcjogQ29udHJvbCkgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBTZXJpYWxpemVyKGNvbnRyb2xUb1JlbmRlciwgc2VyaWFsaXplRGVsZWdhdGUpLnNlcmlhbGl6ZSgpO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBuZXcgU2VyaWFsaXplcihjb250cm9sVG9TZXJpYWxpemUsIHNlcmlhbGl6ZURlbGVnYXRlKS5zZXJpYWxpemUoKTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXdhaXRlcigpIHtcblx0bGV0IGZuUmVzb2x2ZSE6IEZ1bmN0aW9uO1xuXHRjb25zdCBteVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdGZuUmVzb2x2ZSA9IHJlc29sdmU7XG5cdH0pO1xuXHRyZXR1cm4geyBwcm9taXNlOiBteVByb21pc2UsIHJlc29sdmU6IGZuUmVzb2x2ZSB9O1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBd2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO01BQ3NCQSxlLGFBQWdCQyxJLEVBQWNDLFE7UUFBd0Q7TUFDM0csSUFBTUMsUUFBUSxpREFBeUNGLElBQXpDLHlEQUFkO01BQ0EsSUFBTUcsTUFBTSxHQUFHLElBQUlDLE1BQU0sQ0FBQ0MsU0FBWCxFQUFmO01BQ0EsSUFBTUMsUUFBUSxHQUFHSCxNQUFNLENBQUNJLGVBQVAsQ0FBdUJMLFFBQXZCLEVBQWlDLFVBQWpDLENBQWpCLENBSDJHLENBSzNHOztNQUNBLElBQU1NLFFBQVEsR0FBRztRQUNoQkMsTUFBTSxFQUFFLEVBRFE7UUFFaEJDLGVBQWUsRUFBRTtNQUZELENBQWpCOztNQUlBLEtBQUssSUFBTUMsT0FBWCxJQUFvQlYsUUFBcEIsRUFBOEI7UUFDN0IsSUFBTVcsU0FBUyxHQUFHLElBQUlDLFNBQUosRUFBbEI7UUFDQUQsU0FBUyxDQUFDRSxPQUFWLENBQWtCYixRQUFRLENBQUNVLE9BQUQsQ0FBMUI7UUFDQUgsUUFBUSxDQUFDQyxNQUFULENBQWdCRSxPQUFoQixJQUF5QkMsU0FBekI7UUFDQUosUUFBUSxDQUFDRSxlQUFULENBQXlCQyxPQUF6QixJQUFrQ0gsUUFBUSxDQUFDQyxNQUFULENBQWdCRSxPQUFoQixFQUF1Qkksb0JBQXZCLENBQTRDLEdBQTVDLENBQWxDO01BQ0EsQ0FmMEcsQ0FpQjNHOzs7TUFqQjJHLHVCQWtCbkZDLGVBQWUsQ0FBQ0MsT0FBaEIs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
666
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwcm9jZXNzRnJhZ21lbnQiLCJuYW1lIiwidGVzdERhdGEiLCJpbnB1dFhtbCIsInBhcnNlciIsIndpbmRvdyIsIkRPTVBhcnNlciIsImlucHV0RG9jIiwicGFyc2VGcm9tU3RyaW5nIiwic2V0dGluZ3MiLCJtb2RlbHMiLCJiaW5kaW5nQ29udGV4dHMiLCJtb2RlbCIsImpzb25Nb2RlbCIsIkpTT05Nb2RlbCIsInNldERhdGEiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJmaXJzdEVsZW1lbnRDaGlsZCIsInJlc3VsdERvYyIsImZyYWdtZW50cyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwibGVuZ3RoIiwiZnJhZ21lbnQiLCJpbm5lckhUTUwiLCJ4bWxSZXN1bHQiLCJjaGlsZHJlbiIsIm91dGVySFRNTCIsIl9yZW1vdmVDb21tZW50RnJvbVhtbCIsInByb2Nlc3NWaWV3Iiwic01ldGFkYXRhVXJsIiwibUJpbmRpbmdDb250ZXh0cyIsIm1Nb2RlbHMiLCJmbGV4Q2hhbmdlcyIsImdldE1ldGFNb2RlbCIsIm9NZXRhTW9kZWwiLCJvVmlld0RvY3VtZW50IiwiX2xvYWRSZXNvdXJjZVZpZXciLCJfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyIsIm9QcmVwcm9jZXNzb3JTZXR0aW5ncyIsIm9QcmVwcm9jZXNzZWRWaWV3IiwiYXNFbGVtZW50IiwiYXNTdHJpbmciLCJhcHBseUZsZXhDaGFuZ2VzIiwiaGFzT3duUHJvcGVydHkiLCJPYmplY3QiLCJhc3NpZ24iLCJjb252ZXJ0ZXJDb250ZXh0IiwiVGVtcGxhdGVNb2RlbCIsImtleXMiLCJmb3JFYWNoIiwic01vZGVsTmFtZSIsImlzVGVtcGxhdGVNb2RlbCIsImRhdGEiLCJtZXRhTW9kZWwiLCJzS2V5IiwiZXhwZWN0IiwiZ2V0T2JqZWN0IiwidG9CZURlZmluZWQiLCJvTW9kZWwiLCJmb3JtYXRYbWwiLCJyZXF1aXJlIiwiTG9nIiwic2V0TGV2ZWwiLCJqZXN0Iiwic2V0VGltZW91dCIsIm5hbWVTcGFjZU1hcCIsIm1hY3JvcyIsIm1hY3JvIiwibWFjcm9GaWVsZCIsIm1hY3JvZGF0YSIsImxvZyIsInVuaXR0ZXN0IiwiY29udHJvbCIsImNvcmUiLCJkdCIsIm0iLCJmIiwiZmwiLCJpbnRlcm5hbE1hY3JvIiwibWRjIiwibWRjYXQiLCJtZGNGaWVsZCIsIm1kY1RhYmxlIiwidSIsIm1hY3JvTWljcm9DaGFydCIsIm1pY3JvQ2hhcnQiLCJtYWNyb1RhYmxlIiwic2VsZWN0IiwieHBhdGgiLCJ1c2VOYW1lc3BhY2VzIiwiX2dldFRlbXBsYXRlZFNlbGVjdG9yIiwieG1sZG9tIiwic2VsZWN0b3IiLCJyb290UGF0aCIsIm5vZGVOYW1lIiwic3RhcnRzV2l0aCIsInhtbCIsImZpbHRlciIsIm5vZGUiLCJ0eXBlIiwidmlld05hbWUiLCJyZXBsYWNlIiwidmlldyIsIkxvYWRlckV4dGVuc2lvbnMiLCJsb2FkUmVzb3VyY2UiLCJkb2N1bWVudEVsZW1lbnQiLCJyZWdpc3Rlck1hY3JvIiwibWFjcm9NZXRhZGF0YSIsInJlZ2lzdGVyQnVpbGRpbmdCbG9jayIsInVucmVnaXN0ZXJNYWNybyIsInBsdWdJbiIsIm5hbWVzcGFjZSIsInB1YmxpY05hbWVzcGFjZSIsInJ1blhQYXRoUXVlcnkiLCJleHRlbmQiLCJ0b0hhdmVDb250cm9sIiwibm9kZXMiLCJtZXNzYWdlIiwib3V0cHV0WG1sIiwic2VyaWFsaXplWE1MIiwicGFzcyIsInRvTm90SGF2ZUNvbnRyb2wiLCJmb3JtYXRCdWlsZGluZ0Jsb2NrWE1MIiwieG1sU3RyaW5nIiwiQXJyYXkiLCJpc0FycmF5Iiwiam9pbiIsInhtbEZvcm1hdHRlZCIsImZvcm1hdFhNTCIsImdldENvbnRyb2xBdHRyaWJ1dGUiLCJjb250cm9sU2VsZWN0b3IiLCJhdHRyaWJ1dGVOYW1lIiwieG1sRG9tIiwic2VyaWFsaXplciIsIlhNTFNlcmlhbGl6ZXIiLCJzZXJpYWxpemVUb1N0cmluZyIsImZvcm1hdCIsInhtbFdoaXRlc3BhY2VTZW5zaXRpdml0eSIsInBsdWdpbnMiLCJwbHVnaW4iLCJjb21waWxlQ0RTIiwiY2RzVXJsIiwib3B0aW9ucyIsImVkbXhGaWxlTmFtZSIsInBhdGgiLCJiYXNlbmFtZSIsImNkc1N0cmluZyIsImZzIiwicmVhZEZpbGVTeW5jIiwiZWRteENvbnRlbnQiLCJjZHMyZWRteCIsImRpciIsInJlc29sdmUiLCJlZG14RmlsZVBhdGgiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJ3cml0ZUZpbGVTeW5jIiwiY2RzIiwic2VydmljZSIsInNvdXJjZXMiLCJpbmNsdWRlcyIsImNzbiIsImNvbXBpbGVyIiwiY29tcGlsZVNvdXJjZXMiLCJlZG14T3B0aW9ucyIsIm9kYXRhRm9yZWlnbktleXMiLCJvZGF0YUZvcm1hdCIsIm9kYXRhQ29udGFpbm1lbnQiLCJlZG14IiwidG8iLCJFcnJvciIsImdldEZha2VTaWRlRWZmZWN0c1NlcnZpY2UiLCJvU2VydmljZUNvbnRleHQiLCJzY29wZU9iamVjdCIsInNjb3BlVHlwZSIsIlNpZGVFZmZlY3RzRmFjdG9yeSIsImNyZWF0ZUluc3RhbmNlIiwidGhlbiIsIm9TZXJ2aWNlSW5zdGFuY2UiLCJvSmVzdFNpZGVFZmZlY3RzU2VydmljZSIsImdldEludGVyZmFjZSIsImdldENvbnRleHQiLCJnZXRNb2RlbCIsImdldEZha2VEaWFnbm9zdGljcyIsImlzc3VlcyIsImFkZElzc3VlIiwiaXNzdWVDYXRlZ29yeSIsImlzc3VlU2V2ZXJpdHkiLCJkZXRhaWxzIiwicHVzaCIsImdldElzc3VlcyIsImNoZWNrSWZJc3N1ZUV4aXN0cyIsImZpbmQiLCJpc3N1ZSIsImdldENvbnZlcnRlckNvbnRleHRGb3JUZXN0IiwiY29udmVydGVkVHlwZXMiLCJtYW5pZmVzdFNldHRpbmdzIiwiZW50aXR5U2V0IiwiZW50aXR5U2V0cyIsImVzIiwiZGF0YU1vZGVsUGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSIsIkNvbnZlcnRlckNvbnRleHQiLCJtZXJnZSIsIm1ldGFNb2RlbENhY2hlIiwib1JlcXVlc3RvciIsIl9NZXRhZGF0YVJlcXVlc3RvciIsImNyZWF0ZSIsIk9EYXRhTWV0YU1vZGVsIiwidW5kZWZpbmVkIiwiZmV0Y2hFbnRpdHlDb250YWluZXIiLCJwcm9wZXJ0eSIsInRhcmdldFBhdGgiLCJzdGFydGluZ0VudGl0eVNldCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJjb250ZXh0TG9jYXRpb24iLCJldmFsdWF0ZUJpbmRpbmciLCJiaW5kaW5nU3RyaW5nIiwiYmluZGluZ0VsZW1lbnQiLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsImFyZ3MiLCJmb3JtYXR0ZXIiLCJhcHBseSIsImV2YWx1YXRlQmluZGluZ1dpdGhNb2RlbCIsIm1vZGVsQ29udGVudCIsIm5hbWVkTW9kZWxzQ29udGVudCIsInRleHQiLCJJbnZpc2libGVUZXh0IiwiYmluZFByb3BlcnR5IiwiZGVmYXVsdE1vZGVsIiwic2V0TW9kZWwiLCJzZXRCaW5kaW5nQ29udGV4dCIsImVudHJpZXMiLCJjb250ZW50IiwiZ2V0VGV4dCIsIlRFU1RWSUVXSUQiLCJyZXN1bHRYTUwiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaWQiLCJjaGFuZ2VzIiwiY3JlYXRlRmxleGliaWxpdHlDaGFuZ2VzT2JqZWN0IiwiYXBwSWQiLCJvTWFuaWZlc3QiLCJjcm9zc05hdmlnYXRpb24iLCJvdXRib3VuZHMiLCJvQXBwQ29tcG9uZW50IiwiZ2V0RGlhZ25vc3RpY3MiLCJmbiIsIm1vY2tSZXR1cm5WYWx1ZSIsImdldENvbXBvbmVudERhdGEiLCJnZXRNYW5pZmVzdE9iamVjdCIsImdldEVudHJ5IiwiZ2V0TG9jYWxJZCIsInNJZCIsInNweU9uIiwiQXBwU3RvcmFnZSIsIlByb21pc2UiLCJDb21wb25lbnQiLCJVdGlscyIsIkZsZXhTdGF0ZSIsImluaXRpYWxpemUiLCJjb21wb25lbnRJZCIsIlhtbFByZXByb2Nlc3NvciIsImNoYW5nZXNBcHBsaWVkIiwiZ2V0Q2hhbmdlc0Zyb21YTUwiLCJ0b0JlIiwidmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzIiwiZmxhdE1hcCIsImUiLCJhdHRyaWJ1dGVzIiwibWFwIiwiYSIsImF0dHIiLCJnZXRUZW1wbGF0aW5nUmVzdWx0IiwieG1sSW5wdXQiLCJ0ZW1wbGF0ZWRYbWwiLCJ4bWxEb2MiLCJnZXRUZW1wbGF0ZWRYTUwiLCJzZXJpYWxpemVDb250cm9sIiwiY29udHJvbFRvU2VyaWFsaXplIiwidGFiQ291bnQiLCJnZXRUYWIiLCJ0b0FkZCIsInRhYiIsImkiLCJzZXJpYWxpemVEZWxlZ2F0ZSIsInN0YXJ0Iiwic0FnZ3JlZ2F0aW9uTmFtZSIsImNvbnRyb2xEZXRhaWwiLCJnZXRQYXJlbnQiLCJpbmRleEluUGFyZW50IiwiZ2V0QWdncmVnYXRpb24iLCJpbmRleE9mIiwiZ2V0TWV0YWRhdGEiLCJnZXROYW1lIiwiZW5kIiwibWlkZGxlIiwiZ2V0SWQiLCJNYW5hZ2VkT2JqZWN0TWV0YWRhdGEiLCJpc0dlbmVyYXRlZElkIiwib0NvbnRyb2xLZXkiLCJtUHJvcGVydGllcyIsIm1CaW5kaW5nSW5mb3MiLCJiaW5kaW5nRGV0YWlsIiwicGFydHMiLCJiaW5kaW5nSW5mbyIsIm1Bc3NvY2lhdGlvbnMiLCJtRXZlbnRSZWdpc3RyeSIsInN0YXJ0QWdncmVnYXRpb24iLCJzTmFtZSIsIm91dCIsImVuZEFnZ3JlZ2F0aW9uIiwiY29udHJvbFRvUmVuZGVyIiwiU2VyaWFsaXplciIsInNlcmlhbGl6ZSIsImNyZWF0ZUF3YWl0ZXIiLCJmblJlc29sdmUiLCJteVByb21pc2UiLCJwcm9taXNlIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJKZXN0VGVtcGxhdGluZ0hlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFueUFubm90YXRpb24sIENvbnZlcnRlZE1ldGFkYXRhLCBFbnRpdHlTZXQsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgY29tcGlsZXIgZnJvbSBcIkBzYXAvY2RzLWNvbXBpbGVyXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiQHByZXR0aWVyL3BsdWdpbi14bWxcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gXCJwcmV0dGllclwiO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBMb2FkZXJFeHRlbnNpb25zIGZyb20gXCJzYXAvYmFzZS91dGlsL0xvYWRlckV4dGVuc2lvbnNcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgeyByZWdpc3RlckJ1aWxkaW5nQmxvY2sgfSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvQnVpbGRpbmdCbG9ja1J1bnRpbWVcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzLCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgSURpYWdub3N0aWNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCBTaWRlRWZmZWN0c0ZhY3RvcnkgZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RNZXRhZGF0YVwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEludmlzaWJsZVRleHQgZnJvbSBcInNhcC91aS9jb3JlL0ludmlzaWJsZVRleHRcIjtcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL3NlcmlhbGl6ZXIvU2VyaWFsaXplclwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBGbGV4U3RhdGUgZnJvbSBcInNhcC91aS9mbC9hcHBseS9faW50ZXJuYWwvZmxleFN0YXRlL0ZsZXhTdGF0ZVwiO1xuaW1wb3J0IFhtbFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L19pbnRlcm5hbC9wcmVwcm9jZXNzb3JzL1htbFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IEFwcFN0b3JhZ2UgZnJvbSBcInNhcC91aS9mbC9pbml0aWFsL19pbnRlcm5hbC9TdG9yYWdlXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcInNhcC91aS9mbC9VdGlsc1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IE1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01ldGFNb2RlbFwiO1xuaW1wb3J0IF9NZXRhZGF0YVJlcXVlc3RvciBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L2xpYi9fTWV0YWRhdGFSZXF1ZXN0b3JcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgeHBhdGggZnJvbSBcInhwYXRoXCI7XG5pbXBvcnQgeyBjcmVhdGVGbGV4aWJpbGl0eUNoYW5nZXNPYmplY3QgfSBmcm9tIFwiLi9KZXN0RmxleGliaWxpdHlIZWxwZXJcIjtcblxudHlwZSBQcmVQcm9jZXNzb3JTZXR0aW5nc1R5cGUgPSB7XG5cdG1vZGVsczoge1xuXHRcdFtuYW1lOiBzdHJpbmddOiBKU09OTW9kZWwgfCBPRGF0YU1ldGFNb2RlbDtcblx0fTtcblx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0W25hbWU6IHN0cmluZ106IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdH07XG59O1xuXG50eXBlIEplc3RUZW1wbGF0ZWRWaWV3ID0ge1xuXHRhc0VsZW1lbnQ6IEVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cdGFzU3RyaW5nOiBzdHJpbmc7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuY29uc3QgZm9ybWF0WG1sID0gcmVxdWlyZShcInhtbC1mb3JtYXR0ZXJcIik7XG5cbkxvZy5zZXRMZXZlbCgxIGFzIGFueSwgXCJzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3NvclwiKTtcbmplc3Quc2V0VGltZW91dCg0MDAwMCk7XG5cbmNvbnN0IG5hbWVTcGFjZU1hcCA9IHtcblx0bWFjcm9zOiBcInNhcC5mZS5tYWNyb3NcIixcblx0bWFjcm86IFwic2FwLmZlLm1hY3Jvc1wiLFxuXHRtYWNyb0ZpZWxkOiBcInNhcC5mZS5tYWNyb3MuZmllbGRcIixcblx0bWFjcm9kYXRhOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0bG9nOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0dW5pdHRlc3Q6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvcHJlcHJvY2Vzc29yZXh0ZW5zaW9uL3NhcC5mZS51bml0dGVzdGluZy8xXCIsXG5cdGNvbnRyb2w6IFwic2FwLmZlLmNvcmUuY29udHJvbHNcIixcblx0Y29yZTogXCJzYXAudWkuY29yZVwiLFxuXHRkdDogXCJzYXAudWkuZHRcIixcblx0bTogXCJzYXAubVwiLFxuXHRmOiBcInNhcC51aS5sYXlvdXQuZm9ybVwiLFxuXHRmbDogXCJzYXAudWkuZmxcIixcblx0aW50ZXJuYWxNYWNybzogXCJzYXAuZmUubWFjcm9zLmludGVybmFsXCIsXG5cdG1kYzogXCJzYXAudWkubWRjXCIsXG5cdG1kY2F0OiBcInNhcC51aS5tZGMuYWN0aW9udG9vbGJhclwiLFxuXHRtZGNGaWVsZDogXCJzYXAudWkubWRjLmZpZWxkXCIsXG5cdG1kY1RhYmxlOiBcInNhcC51aS5tZGMudGFibGVcIixcblx0dTogXCJzYXAudWkudW5pZmllZFwiLFxuXHRtYWNyb01pY3JvQ2hhcnQ6IFwic2FwLmZlLm1hY3Jvcy5taWNyb2NoYXJ0XCIsXG5cdG1pY3JvQ2hhcnQ6IFwic2FwLnN1aXRlLnVpLm1pY3JvY2hhcnRcIixcblx0bWFjcm9UYWJsZTogXCJzYXAuZmUubWFjcm9zLnRhYmxlXCJcbn07XG5jb25zdCBzZWxlY3QgPSB4cGF0aC51c2VOYW1lc3BhY2VzKG5hbWVTcGFjZU1hcCk7XG5cbmZ1bmN0aW9uIF9nZXRUZW1wbGF0ZWRTZWxlY3Rvcih4bWxkb206IE5vZGUsIHNlbGVjdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuXHQvKipcblx0ICogaWYgYSByb290IGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgZHVyaW5nIHRoZSB0ZW1wbGF0aW5nIGJ5IG91ciBKZXN0IFRlbXBsYXRpbmcgbWV0aG9kc1xuXHQgKiB0aGUgcm9vdCBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZSBzZWxlY3RvciBwYXRoLlxuXHQgKi9cblx0Y29uc3Qgcm9vdFBhdGggPSBcIi9yb290XCI7XG5cdHJldHVybiBgJHt4bWxkb20ubm9kZU5hbWUgPT09IFwicm9vdFwiICYmICFzZWxlY3Rvci5zdGFydHNXaXRoKHJvb3RQYXRoKSA/IHJvb3RQYXRoIDogXCJcIn0ke3NlbGVjdG9yfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9idWlsZFByZVByb2Nlc3NvclNldHRpbmdzKFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9XG4pOiBQcm9taXNlPFByZVByb2Nlc3NvclNldHRpbmdzVHlwZT4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cblx0Ly8gVG8gZW5zdXJlIG91ciBtYWNybyBjYW4gdXNlICNzZXRCaW5kaW5nQ29udGV4dCB3ZSBlbnN1cmUgdGhlcmUgaXMgYSBwcmUgZXhpc3RpbmcgSlNPTk1vZGVsIGZvciBjb252ZXJ0ZXJDb250ZXh0XG5cdC8vIGlmIG5vdCBhbHJlYWR5IHBhc3NlZCB0byB0ZWggdGVtcGxhdGluZ1xuXHRpZiAoIW1Nb2RlbHMuaGFzT3duUHJvcGVydHkoXCJjb252ZXJ0ZXJDb250ZXh0XCIpKSB7XG5cdFx0bU1vZGVscyA9IE9iamVjdC5hc3NpZ24obU1vZGVscywgeyBjb252ZXJ0ZXJDb250ZXh0OiBuZXcgVGVtcGxhdGVNb2RlbCh7fSwgb01ldGFNb2RlbCkgfSk7XG5cdH1cblxuXHRPYmplY3Qua2V5cyhtTW9kZWxzKS5mb3JFYWNoKGZ1bmN0aW9uIChzTW9kZWxOYW1lKSB7XG5cdFx0aWYgKG1Nb2RlbHNbc01vZGVsTmFtZV0gJiYgbU1vZGVsc1tzTW9kZWxOYW1lXS5pc1RlbXBsYXRlTW9kZWwpIHtcblx0XHRcdG1Nb2RlbHNbc01vZGVsTmFtZV0gPSBuZXcgVGVtcGxhdGVNb2RlbChtTW9kZWxzW3NNb2RlbE5hbWVdLmRhdGEsIG9NZXRhTW9kZWwpO1xuXHRcdH1cblx0fSk7XG5cblx0Y29uc3Qgc2V0dGluZ3M6IGFueSA9IHtcblx0XHRtb2RlbHM6IE9iamVjdC5hc3NpZ24oXG5cdFx0XHR7XG5cdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbFxuXHRcdFx0fSxcblx0XHRcdG1Nb2RlbHNcblx0XHQpLFxuXHRcdGJpbmRpbmdDb250ZXh0czoge31cblx0fTtcblxuXHQvL0luamVjdCBtb2RlbHMgYW5kIGJpbmRpbmdDb250ZXh0c1xuXHRPYmplY3Qua2V5cyhtQmluZGluZ0NvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0LyogQXNzZXJ0IHRvIG1ha2Ugc3VyZSB0aGUgYW5ub3RhdGlvbnMgYXJlIGluIHRoZSB0ZXN0IG1ldGFkYXRhIC0+IGF2b2lkIG1pc2xlYWRpbmcgdGVzdHMgKi9cblx0XHRleHBlY3QodHlwZW9mIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pKS50b0JlRGVmaW5lZCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG1Nb2RlbHNbc0tleV0gfHwgb01ldGFNb2RlbDtcblx0XHRzZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0tleV0gPSBvTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQobUJpbmRpbmdDb250ZXh0c1tzS2V5XSk7IC8vVmFsdWUgaXMgc1BhdGhcblx0XHRzZXR0aW5ncy5tb2RlbHNbc0tleV0gPSBvTW9kZWw7XG5cdH0pO1xuXHRyZXR1cm4gc2V0dGluZ3M7XG59XG5cbmZ1bmN0aW9uIF9yZW1vdmVDb21tZW50RnJvbVhtbCh4bWw6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBmb3JtYXRYbWwoeG1sLCB7XG5cdFx0ZmlsdGVyOiAobm9kZTogYW55KSA9PiBub2RlLnR5cGUgIT09IFwiQ29tbWVudFwiXG5cdH0pO1xufVxuXG5mdW5jdGlvbiBfbG9hZFJlc291cmNlVmlldyh2aWV3TmFtZTogc3RyaW5nKTogRWxlbWVudCB7XG5cdGNvbnN0IG5hbWUgPSB2aWV3TmFtZS5yZXBsYWNlKC9cXC4vZywgXCIvXCIpICsgXCIudmlldy54bWxcIjtcblx0Y29uc3QgdmlldyA9IExvYWRlckV4dGVuc2lvbnMubG9hZFJlc291cmNlKG5hbWUpO1xuXHRyZXR1cm4gdmlldy5kb2N1bWVudEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCByZWdpc3Rlck1hY3JvID0gZnVuY3Rpb24gKG1hY3JvTWV0YWRhdGE6IGFueSkge1xuXHRyZWdpc3RlckJ1aWxkaW5nQmxvY2sobWFjcm9NZXRhZGF0YSk7XG59O1xuZXhwb3J0IGNvbnN0IHVucmVnaXN0ZXJNYWNybyA9IGZ1bmN0aW9uIChtYWNyb01ldGFkYXRhOiBhbnkpIHtcblx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihudWxsLCBtYWNyb01ldGFkYXRhLm5hbWVzcGFjZSwgbWFjcm9NZXRhZGF0YS5uYW1lKTtcblx0aWYgKG1hY3JvTWV0YWRhdGEucHVibGljTmFtZXNwYWNlKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihudWxsLCBtYWNyb01ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSwgbWFjcm9NZXRhZGF0YS5uYW1lKTtcblx0fVxufTtcbmV4cG9ydCBjb25zdCBydW5YUGF0aFF1ZXJ5ID0gZnVuY3Rpb24gKHNlbGVjdG9yOiBzdHJpbmcsIHhtbGRvbTogTm9kZSB8IHVuZGVmaW5lZCkge1xuXHRyZXR1cm4gc2VsZWN0KHNlbGVjdG9yLCB4bWxkb20pO1xufTtcblxuZXhwZWN0LmV4dGVuZCh7XG5cdHRvSGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sZG9tLCBzZWxlY3RvciksIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgZGlkIG5vdCBmaW5kIGNvbnRyb2xzIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID49IDFcblx0XHR9O1xuXHR9LFxuXHR0b05vdEhhdmVDb250cm9sKHhtbGRvbSwgc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoX2dldFRlbXBsYXRlZFNlbGVjdG9yKHhtbGRvbSwgc2VsZWN0b3IpLCB4bWxkb20pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG91dHB1dFhtbCA9IHNlcmlhbGl6ZVhNTCh4bWxkb20pO1xuXHRcdFx0XHRyZXR1cm4gYFRoZXJlIGlzIGEgY29udHJvbCBtYXRjaGluZyAke3NlbGVjdG9yfSBpbiBnZW5lcmF0ZWQgeG1sOlxcbiAke291dHB1dFhtbH1gO1xuXHRcdFx0fSxcblx0XHRcdHBhc3M6IG5vZGVzICYmIG5vZGVzLmxlbmd0aCA9PT0gMFxuXHRcdH07XG5cdH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCA9IGZ1bmN0aW9uICh4bWxTdHJpbmc6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG5cdGlmIChBcnJheS5pc0FycmF5KHhtbFN0cmluZykpIHtcblx0XHR4bWxTdHJpbmcgPSB4bWxTdHJpbmcuam9pbihcIlwiKTtcblx0fVxuXHRsZXQgeG1sRm9ybWF0dGVkID0gZm9ybWF0WE1MKHhtbFN0cmluZyk7XG5cdHhtbEZvcm1hdHRlZCA9IHhtbEZvcm1hdHRlZC5yZXBsYWNlKC91aWQtLWlkLVswLTldezEzfS1bMC05XXsxLDJ9L2csIFwidWlkLS1pZFwiKTtcblx0cmV0dXJuIHhtbEZvcm1hdHRlZDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250cm9sQXR0cmlidXRlID0gZnVuY3Rpb24gKGNvbnRyb2xTZWxlY3Rvcjogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZWxlY3RvciA9IGBzdHJpbmcoJHtfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sRG9tLCBjb250cm9sU2VsZWN0b3IpfS9AJHthdHRyaWJ1dGVOYW1lfSlgO1xuXHRyZXR1cm4gcnVuWFBhdGhRdWVyeShzZWxlY3RvciwgeG1sRG9tKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVYTUwgPSBmdW5jdGlvbiAoeG1sRG9tOiBOb2RlKSB7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgd2luZG93LlhNTFNlcmlhbGl6ZXIoKTtcblx0Y29uc3QgeG1sU3RyaW5nID0gc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyh4bWxEb20pO1xuXHRyZXR1cm4gZm9ybWF0WE1MKHhtbFN0cmluZyk7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0WE1MID0gZnVuY3Rpb24gKHhtbFN0cmluZzogc3RyaW5nKSB7XG5cdHJldHVybiBmb3JtYXQoeG1sU3RyaW5nLCB7XG5cdFx0cGFyc2VyOiBcInhtbFwiLFxuXHRcdHhtbFdoaXRlc3BhY2VTZW5zaXRpdml0eTogXCJpZ25vcmVcIixcblx0XHRwbHVnaW5zOiBbcGx1Z2luXVxuXHR9IGFzIE9wdGlvbnMgJiB7IHhtbFdoaXRlc3BhY2VTZW5zaXRpdml0eTogXCJpZ25vcmVcIiB8IFwic3RyaWN0XCIgfSk7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgYSBDRFMgZmlsZSBpbnRvIGFuIEVETVggZmlsZS5cbiAqXG4gKiBAcGFyYW0gY2RzVXJsIFRoZSBwYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIENEUyBkZWZpbml0aW9uLiBUaGlzIGZpbGUgbXVzdCBkZWNsYXJlIHRoZSBuYW1lc3BhY2VcbiAqIHNhcC5mZS50ZXN0IGFuZCBhIHNlcnZpY2UgSmVzdFNlcnZpY2VcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoZSBFRE1YIG91dHB1dFxuICogQHBhcmFtIGVkbXhGaWxlTmFtZSBBbGxvd3MgeW91IHRvIG92ZXJyaWRlIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlZCBFRE1YIG1ldGFkYXRhIGZpbGVcbiAqIEByZXR1cm5zIFRoZSBwYXRoIG9mIHRoZSBnZW5lcmF0ZWQgRURNWFxuICovXG5leHBvcnQgY29uc3QgY29tcGlsZUNEUyA9IGZ1bmN0aW9uIChcblx0Y2RzVXJsOiBzdHJpbmcsXG5cdG9wdGlvbnM6IGNvbXBpbGVyLk9EYXRhT3B0aW9ucyA9IHt9LFxuXHRlZG14RmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGNkc1VybCkucmVwbGFjZShcIi5jZHNcIiwgXCIueG1sXCIpXG4pIHtcblx0Y29uc3QgY2RzU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGNkc1VybCwgXCJ1dGYtOFwiKTtcblx0Y29uc3QgZWRteENvbnRlbnQgPSBjZHMyZWRteChjZHNTdHJpbmcsIFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIiwgb3B0aW9ucyk7XG5cdGNvbnN0IGRpciA9IHBhdGgucmVzb2x2ZShjZHNVcmwsIFwiLi5cIiwgXCJnZW5cIik7XG5cblx0Y29uc3QgZWRteEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpciwgZWRteEZpbGVOYW1lKTtcblxuXHRmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuXHRmcy53cml0ZUZpbGVTeW5jKGVkbXhGaWxlUGF0aCwgZWRteENvbnRlbnQpO1xuXHRyZXR1cm4gZWRteEZpbGVQYXRoO1xufTtcblxuLyoqXG4gKiBDb21waWxlIENEUyB0byBFRE1YLlxuICpcbiAqIEBwYXJhbSBjZHMgVGhlIENEUyBtb2RlbC4gSXQgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIHNlcnZpY2UuXG4gKiBAcGFyYW0gc2VydmljZSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gYmUgY29tcGlsZWQuIERlZmF1bHRzIHRvIFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIi5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoZSBFRE1YIG91dHB1dFxuICogQHJldHVybnMgVGhlIGNvbXBpbGVkIHNlcnZpY2UgbW9kZWwgYXMgRURNWC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNkczJlZG14KGNkczogc3RyaW5nLCBzZXJ2aWNlID0gXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLCBvcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBcInNvdXJjZS5jZHNcIjogY2RzIH07XG5cblx0Ly8gYWxsb3cgdG8gaW5jbHVkZSBzdHVmZiBmcm9tIEBzYXAvY2RzL2NvbW1vblxuXHRpZiAoY2RzLmluY2x1ZGVzKFwiJ0BzYXAvY2RzL2NvbW1vbidcIikpIHtcblx0XHRzb3VyY2VzW1wiY29tbW9uLmNkc1wiXSA9IGZzLnJlYWRGaWxlU3luYyhyZXF1aXJlLnJlc29sdmUoXCJAc2FwL2Nkcy9jb21tb24uY2RzXCIpLCBcInV0Zi04XCIpO1xuXHR9XG5cblx0Y29uc3QgY3NuID0gY29tcGlsZXIuY29tcGlsZVNvdXJjZXMoc291cmNlcywge30pO1xuXG5cdGNvbnN0IGVkbXhPcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7XG5cdFx0b2RhdGFGb3JlaWduS2V5czogdHJ1ZSxcblx0XHRvZGF0YUZvcm1hdDogXCJzdHJ1Y3R1cmVkXCIsXG5cdFx0b2RhdGFDb250YWlubWVudDogZmFsc2UsXG5cdFx0Li4ub3B0aW9ucyxcblx0XHRzZXJ2aWNlOiBzZXJ2aWNlXG5cdH07XG5cblx0Y29uc3QgZWRteCA9IGNvbXBpbGVyLnRvLmVkbXgoY3NuLCBlZG14T3B0aW9ucyk7XG5cdGlmICghZWRteCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgQ29tcGlsYXRpb24gZmFpbGVkLiBIaW50OiBNYWtlIHN1cmUgdGhhdCB0aGUgQ0RTIG1vZGVsIGRlZmluZXMgc2VydmljZSAke3NlcnZpY2V9LmApO1xuXHR9XG5cdHJldHVybiBlZG14O1xufVxuXG5leHBvcnQgY29uc3QgZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSA9IGFzeW5jIGZ1bmN0aW9uIChvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IFByb21pc2U8YW55PiB7XG5cdGNvbnN0IG9TZXJ2aWNlQ29udGV4dCA9IHsgc2NvcGVPYmplY3Q6IHt9LCBzY29wZVR5cGU6IFwiXCIsIHNldHRpbmdzOiB7fSB9O1xuXHRyZXR1cm4gbmV3IFNpZGVFZmZlY3RzRmFjdG9yeSgpLmNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dCkudGhlbihmdW5jdGlvbiAob1NlcnZpY2VJbnN0YW5jZTogYW55KSB7XG5cdFx0Y29uc3Qgb0plc3RTaWRlRWZmZWN0c1NlcnZpY2UgPSBvU2VydmljZUluc3RhbmNlLmdldEludGVyZmFjZSgpO1xuXHRcdG9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlLmdldENvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzY29wZU9iamVjdDoge1xuXHRcdFx0XHRcdGdldE1vZGVsOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRnZXRNZXRhTW9kZWw6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb01ldGFNb2RlbDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fTtcblx0XHRyZXR1cm4gb0plc3RTaWRlRWZmZWN0c1NlcnZpY2U7XG5cdH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZha2VEaWFnbm9zdGljcyA9IGZ1bmN0aW9uICgpOiBJRGlhZ25vc3RpY3Mge1xuXHRjb25zdCBpc3N1ZXM6IGFueVtdID0gW107XG5cdHJldHVybiB7XG5cdFx0YWRkSXNzdWUoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRpc3N1ZXMucHVzaCh7XG5cdFx0XHRcdGlzc3VlQ2F0ZWdvcnksXG5cdFx0XHRcdGlzc3VlU2V2ZXJpdHksXG5cdFx0XHRcdGRldGFpbHNcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0Z2V0SXNzdWVzKCk6IGFueVtdIHtcblx0XHRcdHJldHVybiBpc3N1ZXM7XG5cdFx0fSxcblx0XHRjaGVja0lmSXNzdWVFeGlzdHMoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzLmZpbmQoKGlzc3VlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBpc3N1ZS5pc3N1ZUNhdGVnb3J5ID09PSBpc3N1ZUNhdGVnb3J5ICYmIGlzc3VlLmlzc3VlU2V2ZXJpdHkgPT09IGlzc3VlU2V2ZXJpdHkgJiYgaXNzdWUuZGV0YWlscyA9PT0gZGV0YWlscztcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yVGVzdCA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRtYW5pZmVzdFNldHRpbmdzOiBMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5ncyB8IE9iamVjdFBhZ2VNYW5pZmVzdFNldHRpbmdzXG4pIHtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVkVHlwZXMuZW50aXR5U2V0cy5maW5kKChlcykgPT4gZXMubmFtZSA9PT0gbWFuaWZlc3RTZXR0aW5ncy5lbnRpdHlTZXQpO1xuXHRjb25zdCBkYXRhTW9kZWxQYXRoID0gZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5KGVudGl0eVNldCBhcyBFbnRpdHlTZXQsIGNvbnZlcnRlZFR5cGVzLCBlbnRpdHlTZXQpO1xuXHRyZXR1cm4gbmV3IENvbnZlcnRlckNvbnRleHQoY29udmVydGVkVHlwZXMsIG1hbmlmZXN0U2V0dGluZ3MsIGdldEZha2VEaWFnbm9zdGljcygpLCBtZXJnZSwgZGF0YU1vZGVsUGF0aCk7XG59O1xuY29uc3QgbWV0YU1vZGVsQ2FjaGU6IGFueSA9IHt9O1xuZXhwb3J0IGNvbnN0IGdldE1ldGFNb2RlbCA9IGFzeW5jIGZ1bmN0aW9uIChzTWV0YWRhdGFVcmw6IHN0cmluZykge1xuXHRjb25zdCBvUmVxdWVzdG9yID0gX01ldGFkYXRhUmVxdWVzdG9yLmNyZWF0ZSh7fSwgXCI0LjBcIiwge30pO1xuXHRpZiAoIW1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF0pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gbmV3IChPRGF0YU1ldGFNb2RlbCBhcyBhbnkpKG9SZXF1ZXN0b3IsIHNNZXRhZGF0YVVybCwgdW5kZWZpbmVkLCBudWxsKTtcblx0XHRhd2FpdCBvTWV0YU1vZGVsLmZldGNoRW50aXR5Q29udGFpbmVyKCk7XG5cdFx0bWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSA9IG9NZXRhTW9kZWw7XG5cdH1cblxuXHRyZXR1cm4gbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRhTW9kZWxPYmplY3RQYXRoRm9yUHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdGVudGl0eVNldDogRW50aXR5U2V0LFxuXHRjb252ZXJ0ZWRUeXBlczogQ29udmVydGVkTWV0YWRhdGEsXG5cdHByb3BlcnR5PzogUHJvcGVydHkgfCBFbnRpdHlTZXQgfCBBbnlBbm5vdGF0aW9uXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0Y29uc3QgdGFyZ2V0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCA9IHtcblx0XHRzdGFydGluZ0VudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXSxcblx0XHR0YXJnZXRPYmplY3Q6IHByb3BlcnR5LFxuXHRcdHRhcmdldEVudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVR5cGU6IGVudGl0eVNldC5lbnRpdHlUeXBlLFxuXHRcdGNvbnZlcnRlZFR5cGVzOiBjb252ZXJ0ZWRUeXBlc1xuXHR9O1xuXHR0YXJnZXRQYXRoLmNvbnRleHRMb2NhdGlvbiA9IHRhcmdldFBhdGg7XG5cdHJldHVybiB0YXJnZXRQYXRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGV2YWx1YXRlQmluZGluZyA9IGZ1bmN0aW9uIChiaW5kaW5nU3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRyZXR1cm4gYmluZGluZ0VsZW1lbnQuZm9ybWF0dGVyLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG59O1xuXG50eXBlIE1vZGVsQ29udGVudCA9IHtcblx0W25hbWU6IHN0cmluZ106IGFueTtcbn07XG5cbi8qKlxuICogRXZhbHVhdGUgYSBiaW5kaW5nIGFnYWluc3QgYSBtb2RlbC5cbiAqXG4gKiBAcGFyYW0gYmluZGluZ1N0cmluZyBUaGUgYmluZGluZyBzdHJpbmcuXG4gKiBAcGFyYW0gbW9kZWxDb250ZW50IENvbnRlbnQgb2YgdGhlIGRlZmF1bHQgbW9kZWwgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIG5hbWVkTW9kZWxzQ29udGVudCBDb250ZW50cyBvZiBhZGRpdGlvbmFsLCBuYW1lZCBtb2RlbHMgdG8gdXNlLlxuICogQHJldHVybnMgVGhlIGV2YWx1YXRlZCBiaW5kaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVCaW5kaW5nV2l0aE1vZGVsKFxuXHRiaW5kaW5nU3RyaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1vZGVsQ29udGVudDogTW9kZWxDb250ZW50LFxuXHRuYW1lZE1vZGVsc0NvbnRlbnQ/OiB7IFttb2RlbE5hbWU6IHN0cmluZ106IE1vZGVsQ29udGVudCB9XG4pOiBzdHJpbmcge1xuXHRjb25zdCBiaW5kaW5nRWxlbWVudCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihiaW5kaW5nU3RyaW5nKTtcblx0Y29uc3QgdGV4dCA9IG5ldyBJbnZpc2libGVUZXh0KCk7XG5cdHRleHQuYmluZFByb3BlcnR5KFwidGV4dFwiLCBiaW5kaW5nRWxlbWVudCk7XG5cblx0Y29uc3QgZGVmYXVsdE1vZGVsID0gbmV3IEpTT05Nb2RlbChtb2RlbENvbnRlbnQpO1xuXHR0ZXh0LnNldE1vZGVsKGRlZmF1bHRNb2RlbCk7XG5cdHRleHQuc2V0QmluZGluZ0NvbnRleHQoZGVmYXVsdE1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSBhcyBDb250ZXh0KTtcblxuXHRpZiAobmFtZWRNb2RlbHNDb250ZW50KSB7XG5cdFx0Zm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMobmFtZWRNb2RlbHNDb250ZW50KSkge1xuXHRcdFx0Y29uc3QgbW9kZWwgPSBuZXcgSlNPTk1vZGVsKGNvbnRlbnQpO1xuXHRcdFx0dGV4dC5zZXRNb2RlbChtb2RlbCwgbmFtZSk7XG5cdFx0XHR0ZXh0LnNldEJpbmRpbmdDb250ZXh0KG1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSBhcyBDb250ZXh0LCBuYW1lKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdGV4dC5nZXRUZXh0KCk7XG59XG5cbmNvbnN0IFRFU1RWSUVXSUQgPSBcInRlc3RWaWV3SWRcIjtcblxuY29uc3QgYXBwbHlGbGV4Q2hhbmdlcyA9IGFzeW5jIGZ1bmN0aW9uIChmbGV4Q2hhbmdlczogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfSwgb01ldGFNb2RlbDogTWV0YU1vZGVsLCByZXN1bHRYTUw6IGFueSkge1xuXHQvLyBwcmVmaXggSWRzXG5cdFsuLi5yZXN1bHRYTUwucXVlcnlTZWxlY3RvckFsbChcIltpZF1cIildLmZvckVhY2goKG5vZGUpID0+IHtcblx0XHRub2RlLmlkID0gYCR7VEVTVFZJRVdJRH0tLSR7bm9kZS5pZH1gO1xuXHR9KTtcblx0Y29uc3QgY2hhbmdlcyA9IGNyZWF0ZUZsZXhpYmlsaXR5Q2hhbmdlc09iamVjdChURVNUVklFV0lELCBmbGV4Q2hhbmdlcyk7XG5cdGNvbnN0IGFwcElkID0gXCJzb21lQ29tcG9uZW50XCI7XG5cdGNvbnN0IG9NYW5pZmVzdCA9IHtcblx0XHRcInNhcC5hcHBcIjoge1xuXHRcdFx0aWQ6IGFwcElkLFxuXHRcdFx0dHlwZTogXCJhcHBsaWNhdGlvblwiLFxuXHRcdFx0Y3Jvc3NOYXZpZ2F0aW9uOiB7XG5cdFx0XHRcdG91dGJvdW5kczogW11cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGNvbnN0IG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCA9IHtcblx0XHRnZXREaWFnbm9zdGljczogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShnZXRGYWtlRGlhZ25vc3RpY3MoKSksXG5cdFx0Z2V0TW9kZWw6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoe1xuXHRcdFx0Z2V0TWV0YU1vZGVsOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKG9NZXRhTW9kZWwpXG5cdFx0fSksXG5cdFx0Z2V0Q29tcG9uZW50RGF0YTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7fSksXG5cdFx0Z2V0TWFuaWZlc3RPYmplY3Q6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoe1xuXHRcdFx0Z2V0RW50cnk6IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0cmV0dXJuIChvTWFuaWZlc3QgYXMgYW55KVtuYW1lXTtcblx0XHRcdH1cblx0XHR9KSxcblx0XHRnZXRMb2NhbElkOiBqZXN0LmZuKChzSWQpID0+IHNJZClcblx0fSBhcyB1bmtub3duIGFzIEFwcENvbXBvbmVudDtcblx0Ly9mYWtlIGNoYW5nZXNcblx0amVzdC5zcHlPbihBcHBTdG9yYWdlLCBcImxvYWRGbGV4RGF0YVwiKS5tb2NrUmV0dXJuVmFsdWUoUHJvbWlzZS5yZXNvbHZlKGNoYW5nZXMpKTtcblx0amVzdC5zcHlPbihDb21wb25lbnQsIFwiZ2V0XCIpLm1vY2tSZXR1cm5WYWx1ZShvQXBwQ29tcG9uZW50KTtcblx0amVzdC5zcHlPbihVdGlscywgXCJnZXRBcHBDb21wb25lbnRGb3JDb250cm9sXCIpLm1vY2tSZXR1cm5WYWx1ZShvQXBwQ29tcG9uZW50KTtcblx0YXdhaXQgRmxleFN0YXRlLmluaXRpYWxpemUoe1xuXHRcdGNvbXBvbmVudElkOiBhcHBJZFxuXHR9KTtcblx0cmVzdWx0WE1MID0gYXdhaXQgWG1sUHJlcHJvY2Vzc29yLnByb2Nlc3MocmVzdWx0WE1MLCB7IG5hbWU6IFwiVGVzdCBGcmFnbWVudFwiLCBjb21wb25lbnRJZDogYXBwSWQsIGlkOiBURVNUVklFV0lEIH0pO1xuXG5cdC8vQXNzZXJ0IHRoYXQgYWxsIGNoYW5nZXMgaGF2ZSBiZWVuIGFwcGxpZWRcblx0Y29uc3QgY2hhbmdlc0FwcGxpZWQgPSBnZXRDaGFuZ2VzRnJvbVhNTChyZXN1bHRYTUwpO1xuXHRleHBlY3QoY2hhbmdlc0FwcGxpZWQubGVuZ3RoKS50b0JlKGZsZXhDaGFuZ2VzPy5jaGFuZ2VzPy5sZW5ndGggPz8gMCArIGZsZXhDaGFuZ2VzPy52YXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXM/Lmxlbmd0aCA/PyAwKTtcblx0cmV0dXJuIHJlc3VsdFhNTDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDaGFuZ2VzRnJvbVhNTCA9ICh4bWw6IGFueSkgPT5cblx0Wy4uLnhtbC5xdWVyeVNlbGVjdG9yQWxsKFwiKlwiKV1cblx0XHQuZmxhdE1hcCgoZSkgPT4gWy4uLmUuYXR0cmlidXRlc10ubWFwKChhKSA9PiBhLm5hbWUpKVxuXHRcdC5maWx0ZXIoKGF0dHIpID0+IGF0dHIuaW5jbHVkZXMoXCJzYXAudWkuZmwuYXBwbGllZENoYW5nZXNcIikpO1xuXG5leHBvcnQgY29uc3QgZ2V0VGVtcGxhdGluZ1Jlc3VsdCA9IGFzeW5jIGZ1bmN0aW9uIChcblx0eG1sSW5wdXQ6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IGFueTsgZW50aXR5U2V0Pzogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9LFxuXHRmbGV4Q2hhbmdlcz86IHsgW3g6IHN0cmluZ106IG9iamVjdFtdIH1cbikge1xuXHRjb25zdCB0ZW1wbGF0ZWRYbWwgPSBgPHJvb3Q+JHt4bWxJbnB1dH08L3Jvb3Q+YDtcblx0Y29uc3QgcGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTtcblx0Y29uc3QgeG1sRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh0ZW1wbGF0ZWRYbWwsIFwidGV4dC94bWxcIik7XG5cdC8vIFRvIGVuc3VyZSBvdXIgbWFjcm8gY2FuIHVzZSAjc2V0QmluZGluZ0NvbnRleHQgd2UgZW5zdXJlIHRoZXJlIGlzIGEgcHJlIGV4aXN0aW5nIEpTT05Nb2RlbCBmb3IgY29udmVydGVyQ29udGV4dFxuXHQvLyBpZiBub3QgYWxyZWFkeSBwYXNzZWQgdG8gdGVoIHRlbXBsYXRpbmdcblxuXHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cdGNvbnN0IG9QcmVwcm9jZXNzb3JTZXR0aW5ncyA9IGF3YWl0IF9idWlsZFByZVByb2Nlc3NvclNldHRpbmdzKHNNZXRhZGF0YVVybCwgbUJpbmRpbmdDb250ZXh0cywgbU1vZGVscyk7XG5cblx0Ly9UaGlzIGNvbnRleHQgZm9yIG1hY3JvIHRlc3Rpbmdcblx0aWYgKG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbXCJ0aGlzXCJdKSB7XG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tcInRoaXNcIl0gPSBvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdH1cblxuXHRsZXQgcmVzdWx0WE1MID0gKGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKHhtbERvYy5maXJzdEVsZW1lbnRDaGlsZCEsIHsgbmFtZTogXCJUZXN0IEZyYWdtZW50XCIgfSwgb1ByZXByb2Nlc3NvclNldHRpbmdzKSkgYXMgYW55O1xuXG5cdGlmIChmbGV4Q2hhbmdlcykge1xuXHRcdC8vIGFwcGx5IGZsZXggY2hhbmdlc1xuXHRcdHJlc3VsdFhNTCA9IGF3YWl0IGFwcGx5RmxleENoYW5nZXMoZmxleENoYW5nZXMsIG9NZXRhTW9kZWwsIHJlc3VsdFhNTCk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdFhNTDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZW1wbGF0ZWRYTUwgPSBhc3luYyBmdW5jdGlvbiAoXG5cdHhtbElucHV0OiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZsZXhDaGFuZ2VzPzogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfVxuKSB7XG5cdGNvbnN0IHRlbXBsYXRlZFhNTCA9IGF3YWl0IGdldFRlbXBsYXRpbmdSZXN1bHQoeG1sSW5wdXQsIHNNZXRhZGF0YVVybCwgbUJpbmRpbmdDb250ZXh0cywgbU1vZGVscywgZmxleENoYW5nZXMpO1xuXHRyZXR1cm4gc2VyaWFsaXplWE1MKHRlbXBsYXRlZFhNTCk7XG59O1xuXG4vKipcbiAqIFByb2Nlc3MgdGhlIHJlcXVlc3RlZCB2aWV3IHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHBhcmFtIG5hbWUgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHZpZXcgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHNNZXRhZGF0YVVybCBVcmwgb2YgdGhlIG1ldGFkYXRhLlxuICogQHBhcmFtIG1CaW5kaW5nQ29udGV4dHMgTWFwIG9mIHRoZSBiaW5kaW5nQ29udGV4dHMgdG8gc2V0IG9uIHRoZSBtb2RlbHMuXG4gKiBAcGFyYW0gbU1vZGVscyBNYXAgb2YgdGhlIG1vZGVscy5cbiAqIEBwYXJhbSBmbGV4Q2hhbmdlcyBPYmplY3Qgd2l0aCBVSSBjaGFuZ2VzIGxpa2UgJ2NoYW5nZXMnIG9yICd2YXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXMnXG4gKiBAcmV0dXJucyBUZW1wbGF0ZWQgdmlldyBhcyBzdHJpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NWaWV3KFxuXHRuYW1lOiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZsZXhDaGFuZ2VzPzogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfVxuKTogUHJvbWlzZTxKZXN0VGVtcGxhdGVkVmlldz4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cdGNvbnN0IG9WaWV3RG9jdW1lbnQgPSBfbG9hZFJlc291cmNlVmlldyhuYW1lKTtcblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzID0gYXdhaXQgX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3Moc01ldGFkYXRhVXJsLCBtQmluZGluZ0NvbnRleHRzLCBtTW9kZWxzKTtcblx0bGV0IG9QcmVwcm9jZXNzZWRWaWV3ID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3Mob1ZpZXdEb2N1bWVudCwgeyBuYW1lOiBuYW1lIH0sIG9QcmVwcm9jZXNzb3JTZXR0aW5ncyk7XG5cdGlmIChmbGV4Q2hhbmdlcykge1xuXHRcdG9QcmVwcm9jZXNzZWRWaWV3ID0gYXdhaXQgYXBwbHlGbGV4Q2hhbmdlcyhmbGV4Q2hhbmdlcyA/PyBbXSwgb01ldGFNb2RlbCwgb1ByZXByb2Nlc3NlZFZpZXcpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0YXNFbGVtZW50OiBvUHJlcHJvY2Vzc2VkVmlldyxcblx0XHRhc1N0cmluZzogX3JlbW92ZUNvbW1lbnRGcm9tWG1sKG9QcmVwcm9jZXNzZWRWaWV3Py5vdXRlckhUTUwgfHwgXCJcIilcblx0fTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIHRoZSByZXF1ZXN0ZWQgWE1MIGZyYWdtZW50IHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHBhcmFtIG5hbWUgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGJlIHRlc3RlZC5cbiAqIEBwYXJhbSB0ZXN0RGF0YSBUZXN0IGRhdGEgY29uc2lzdGluZ1xuICogQHJldHVybnMgVGVtcGxhdGVkIGZyYWdtZW50IGFzIHN0cmluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0ZyYWdtZW50KG5hbWU6IHN0cmluZywgdGVzdERhdGE6IHsgW21vZGVsOiBzdHJpbmddOiBvYmplY3QgfSk6IFByb21pc2U8c3RyaW5nPiB7XG5cdGNvbnN0IGlucHV0WG1sID0gYDxyb290Pjxjb3JlOkZyYWdtZW50IGZyYWdtZW50TmFtZT1cIiR7bmFtZX1cIiB0eXBlPVwiWE1MXCIgeG1sbnM6Y29yZT1cInNhcC51aS5jb3JlXCIgLz48L3Jvb3Q+YDtcblx0Y29uc3QgcGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTtcblx0Y29uc3QgaW5wdXREb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGlucHV0WG1sLCBcInRleHQveG1sXCIpO1xuXG5cdC8vIGJ1aWxkIG1vZGVsIGFuZCBiaW5kaW5ncyBmb3IgZ2l2ZW4gdGVzdCBkYXRhXG5cdGNvbnN0IHNldHRpbmdzID0ge1xuXHRcdG1vZGVsczoge30gYXMgeyBbbmFtZTogc3RyaW5nXTogSlNPTk1vZGVsIH0sXG5cdFx0YmluZGluZ0NvbnRleHRzOiB7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBvYmplY3QgfVxuXHR9O1xuXHRmb3IgKGNvbnN0IG1vZGVsIGluIHRlc3REYXRhKSB7XG5cdFx0Y29uc3QganNvbk1vZGVsID0gbmV3IEpTT05Nb2RlbCgpO1xuXHRcdGpzb25Nb2RlbC5zZXREYXRhKHRlc3REYXRhW21vZGVsXSk7XG5cdFx0c2V0dGluZ3MubW9kZWxzW21vZGVsXSA9IGpzb25Nb2RlbDtcblx0XHRzZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbbW9kZWxdID0gc2V0dGluZ3MubW9kZWxzW21vZGVsXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgYXMgQ29udGV4dDtcblx0fVxuXG5cdC8vIGV4ZWN1dGUgdGhlIHByZS1wcm9jZXNzb3Jcblx0Y29uc3QgcmVzdWx0RG9jID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXREb2MuZmlyc3RFbGVtZW50Q2hpbGQsIHsgbmFtZSB9LCBzZXR0aW5ncyk7XG5cblx0Ly8gZXhjbHVkZSBuZXN0ZWQgZnJhZ21lbnRzIGZyb20gdGVzdCBzbmFwc2hvdHNcblx0Y29uc3QgZnJhZ21lbnRzID0gcmVzdWx0RG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY29yZTpGcmFnbWVudFwiKSBhcyBhbnk7XG5cdGlmIChmcmFnbWVudHM/Lmxlbmd0aCA+IDApIHtcblx0XHRmb3IgKGNvbnN0IGZyYWdtZW50IG9mIGZyYWdtZW50cykge1xuXHRcdFx0ZnJhZ21lbnQuaW5uZXJIVE1MID0gXCJcIjtcblx0XHR9XG5cdH1cblxuXHQvLyBLZWVwIHRoZSBmcmFnbWVudCByZXN1bHQgYXMgY2hpbGQgb2Ygcm9vdCBub2RlIHdoZW4gZnJhZ21lbnQgZ2VuZXJhdGVzIG11bHRpcGxlIHJvb3QgY29udHJvbHNcblx0Y29uc3QgeG1sUmVzdWx0ID0gcmVzdWx0RG9jLmNoaWxkcmVuLmxlbmd0aCA+IDEgPyByZXN1bHREb2Mub3V0ZXJIVE1MIDogcmVzdWx0RG9jLmlubmVySFRNTDtcblxuXHRyZXR1cm4gX3JlbW92ZUNvbW1lbnRGcm9tWG1sKHhtbFJlc3VsdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDb250cm9sKGNvbnRyb2xUb1NlcmlhbGl6ZTogQ29udHJvbCB8IENvbnRyb2xbXSkge1xuXHRsZXQgdGFiQ291bnQgPSAwO1xuXHRmdW5jdGlvbiBnZXRUYWIodG9BZGQ6IG51bWJlciA9IDApIHtcblx0XHRsZXQgdGFiID0gXCJcIjtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRhYkNvdW50ICsgdG9BZGQ7IGkrKykge1xuXHRcdFx0dGFiICs9IFwiXFx0XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0YWI7XG5cdH1cblx0Y29uc3Qgc2VyaWFsaXplRGVsZWdhdGUgPSB7XG5cdFx0c3RhcnQ6IGZ1bmN0aW9uIChjb250cm9sOiBhbnksIHNBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZykge1xuXHRcdFx0bGV0IGNvbnRyb2xEZXRhaWwgPSBcIlwiO1xuXHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWUpIHtcblx0XHRcdFx0aWYgKGNvbnRyb2wuZ2V0UGFyZW50KCkpIHtcblx0XHRcdFx0XHRjb25zdCBpbmRleEluUGFyZW50ID0gKGNvbnRyb2wuZ2V0UGFyZW50KCkuZ2V0QWdncmVnYXRpb24oc0FnZ3JlZ2F0aW9uTmFtZSkgYXMgTWFuYWdlZE9iamVjdFtdKT8uaW5kZXhPZj8uKGNvbnRyb2wpO1xuXHRcdFx0XHRcdGlmIChpbmRleEluUGFyZW50ID4gMCkge1xuXHRcdFx0XHRcdFx0Y29udHJvbERldGFpbCArPSBgLFxcbiR7Z2V0VGFiKCl9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnRyb2xEZXRhaWwgKz0gYCR7Y29udHJvbC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKX0oYDtcblx0XHRcdHJldHVybiBjb250cm9sRGV0YWlsO1xuXHRcdH0sXG5cdFx0ZW5kOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gXCJ9KVwiO1xuXHRcdH0sXG5cdFx0bWlkZGxlOiBmdW5jdGlvbiAoY29udHJvbDogYW55KSB7XG5cdFx0XHRjb25zdCBpZCA9IGNvbnRyb2wuZ2V0SWQoKTtcblx0XHRcdGxldCBkYXRhID0gYHtpZDogJHtNYW5hZ2VkT2JqZWN0TWV0YWRhdGEuaXNHZW5lcmF0ZWRJZChpZCkgPyBcIl9fZHluYW1pY0lkXCIgOiBpZH1gO1xuXHRcdFx0Zm9yIChjb25zdCBvQ29udHJvbEtleSBpbiBjb250cm9sLm1Qcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLm1Qcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGRhdGEgKz0gYCxcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fTogJHtjb250cm9sLm1Qcm9wZXJ0aWVzW29Db250cm9sS2V5XX1gO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wubUJpbmRpbmdJbmZvcy5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRjb25zdCBiaW5kaW5nRGV0YWlsID0gY29udHJvbC5tQmluZGluZ0luZm9zW29Db250cm9sS2V5XTtcblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06IGZvcm1hdHRlcigke2JpbmRpbmdEZXRhaWwucGFydHMubWFwKFxuXHRcdFx0XHRcdFx0KGJpbmRpbmdJbmZvOiBhbnkpID0+IGBcXG4ke2dldFRhYigxKX0ke2JpbmRpbmdJbmZvLm1vZGVsID8gYmluZGluZ0luZm8ubW9kZWwgOiBcIlwifT4ke2JpbmRpbmdJbmZvLnBhdGh9YFxuXHRcdFx0XHRcdCl9KWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGZvciAoY29uc3Qgb0NvbnRyb2xLZXkgaW4gY29udHJvbC5tQXNzb2NpYXRpb25zKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLm1Bc3NvY2lhdGlvbnMuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9ICR7b0NvbnRyb2xLZXl9OiAke2NvbnRyb2wubUFzc29jaWF0aW9uc1tvQ29udHJvbEtleV1bMF19YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBvQ29udHJvbEtleSBpbiBjb250cm9sLm1FdmVudFJlZ2lzdHJ5KSB7XG5cdFx0XHRcdGlmIChjb250cm9sLm1FdmVudFJlZ2lzdHJ5Lmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGRhdGEgKz0gYCxcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fTogdHJ1ZX1gO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRkYXRhICs9IGBgO1xuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fSxcblx0XHRzdGFydEFnZ3JlZ2F0aW9uOiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRsZXQgb3V0ID0gYCxcXG4ke2dldFRhYigpfSR7c05hbWV9YDtcblx0XHRcdHRhYkNvdW50Kys7XG5cblx0XHRcdGlmIChjb250cm9sLm1CaW5kaW5nSW5mb3Nbc05hbWVdKSB7XG5cdFx0XHRcdG91dCArPSBgPXsgcGF0aDonJHtjb250cm9sLm1CaW5kaW5nSW5mb3Nbc05hbWVdLnBhdGh9JywgdGVtcGxhdGU6XFxuJHtnZXRUYWIoKX1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3V0ICs9IGA9W1xcbiR7Z2V0VGFiKCl9YDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvdXQ7XG5cdFx0fSxcblx0XHRlbmRBZ2dyZWdhdGlvbjogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSwgc05hbWU6IHN0cmluZykge1xuXHRcdFx0dGFiQ291bnQtLTtcblx0XHRcdGlmIChjb250cm9sLm1CaW5kaW5nSW5mb3Nbc05hbWVdKSB7XG5cdFx0XHRcdHJldHVybiBgXFxuJHtnZXRUYWIoKX19YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBgXFxuJHtnZXRUYWIoKX1dYDtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xUb1NlcmlhbGl6ZSkpIHtcblx0XHRyZXR1cm4gY29udHJvbFRvU2VyaWFsaXplLm1hcCgoY29udHJvbFRvUmVuZGVyOiBDb250cm9sKSA9PiB7XG5cdFx0XHRyZXR1cm4gbmV3IFNlcmlhbGl6ZXIoY29udHJvbFRvUmVuZGVyLCBzZXJpYWxpemVEZWxlZ2F0ZSkuc2VyaWFsaXplKCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG5ldyBTZXJpYWxpemVyKGNvbnRyb2xUb1NlcmlhbGl6ZSwgc2VyaWFsaXplRGVsZWdhdGUpLnNlcmlhbGl6ZSgpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBd2FpdGVyKCkge1xuXHRsZXQgZm5SZXNvbHZlITogRnVuY3Rpb247XG5cdGNvbnN0IG15UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0Zm5SZXNvbHZlID0gcmVzb2x2ZTtcblx0fSk7XG5cdHJldHVybiB7IHByb21pc2U6IG15UHJvbWlzZSwgcmVzb2x2ZTogZm5SZXNvbHZlIH07XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWdnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOQSxJQU9zQkEsZUFBZSxhQUFDQyxJQUFZLEVBQUVDLFFBQXFDO0lBQUEsSUFBbUI7TUFDM0csSUFBTUMsUUFBUSxpREFBeUNGLElBQUkseURBQWlEO01BQzVHLElBQU1HLE1BQU0sR0FBRyxJQUFJQyxNQUFNLENBQUNDLFNBQVMsRUFBRTtNQUNyQyxJQUFNQyxRQUFRLEdBQUdILE1BQU0sQ0FBQ0ksZUFBZSxDQUFDTCxRQUFRLEVBQUUsVUFBVSxDQUFDOztNQUU3RDtNQUNBLElBQU1NLFFBQVEsR0FBRztRQUNoQkMsTUFBTSxFQUFFLENBQUMsQ0FBa0M7UUFDM0NDLGVBQWUsRUFBRSxDQUFDO01BQ25CLENBQUM7TUFDRCxLQUFLLElBQU1DLE9BQUssSUFBSVYsUUFBUSxFQUFFO1FBQzdCLElBQU1XLFNBQVMsR0FBRyxJQUFJQyxTQUFTLEVBQUU7UUFDakNELFNBQVMsQ0FBQ0UsT0FBTyxDQUFDYixRQUFRLENBQUNVLE9BQUssQ0FBQyxDQUFDO1FBQ2xDSCxRQUFRLENBQUNDLE1BQU0sQ0FBQ0UsT0FBSyxDQUFDLEdBQUdDLFNBQVM7UUFDbENKLFFBQVEsQ0FBQ0UsZUFBZSxDQUFDQyxPQUFLLENBQUMsR0FBR0gsUUFBUSxDQUFDQyxNQUFNLENBQUNFLE9BQUssQ0FBQyxDQUFDSSxvQkFBb0IsQ0FBQyxHQUFHLENBQVk7TUFDOUY7O01BRUE7TUFBQSx1QkFDd0JDLGVBQWUsQ0FBQ0MsT0FBTyxDQUFDWCxRQUFRLENBQUNZLGlCQUFpQixFQUFFO1FBQUVsQixJQUFJLEVBQUpBO01BQUssQ0FBQyxFQUFFUSxRQUFRLENBQUMsaUJBQXpGVyxTQUFTO1FBRWY7UUFD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