@sapui5/sap.fe.test 1.110.1 → 1.111.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/package.json +2 -19
  2. package/src/sap/fe/test/.library +1 -1
  3. package/src/sap/fe/test/BaseActions.js +26 -2
  4. package/src/sap/fe/test/BaseArrangements.js +2 -2
  5. package/src/sap/fe/test/BaseAssertions.js +2 -2
  6. package/src/sap/fe/test/CollaborationClient.js +10 -10
  7. package/src/sap/fe/test/ConfirmDialog.js +2 -2
  8. package/src/sap/fe/test/FCLView.js +2 -2
  9. package/src/sap/fe/test/FeMocks.js +10 -11
  10. package/src/sap/fe/test/FeMocks.ts +3 -1
  11. package/src/sap/fe/test/Flexibility.js +2 -2
  12. package/src/sap/fe/test/FlexibleColumnLayout.js +2 -2
  13. package/src/sap/fe/test/JestFlexibilityHelper.js +12 -13
  14. package/src/sap/fe/test/JestTemplatingHelper.js +305 -403
  15. package/src/sap/fe/test/JestTemplatingHelper.ts +5 -5
  16. package/src/sap/fe/test/JourneyRunner.js +2 -2
  17. package/src/sap/fe/test/ListReport.js +103 -13
  18. package/src/sap/fe/test/LocationUtil.js +2 -2
  19. package/src/sap/fe/test/ObjectPage.js +3 -3
  20. package/src/sap/fe/test/Shell.js +2 -2
  21. package/src/sap/fe/test/Stubs.js +2 -2
  22. package/src/sap/fe/test/TemplatePage.js +2 -2
  23. package/src/sap/fe/test/TemplatingTestUtils.js +2 -2
  24. package/src/sap/fe/test/UI5MockHelper.js +76 -90
  25. package/src/sap/fe/test/Utils.js +2 -2
  26. package/src/sap/fe/test/api/APIHelper.js +2 -2
  27. package/src/sap/fe/test/api/BaseAPI.js +11 -2
  28. package/src/sap/fe/test/api/ChartActions.js +2 -2
  29. package/src/sap/fe/test/api/ChartAssertions.js +2 -2
  30. package/src/sap/fe/test/api/CollaborationAPI.js +32 -35
  31. package/src/sap/fe/test/api/DialogAPI.js +2 -2
  32. package/src/sap/fe/test/api/DialogActions.js +2 -2
  33. package/src/sap/fe/test/api/DialogAssertions.js +2 -2
  34. package/src/sap/fe/test/api/DialogCreateActions.js +2 -2
  35. package/src/sap/fe/test/api/DialogCreateAssertions.js +2 -2
  36. package/src/sap/fe/test/api/DialogHelper.js +2 -2
  37. package/src/sap/fe/test/api/DialogMassEditActions.js +2 -2
  38. package/src/sap/fe/test/api/DialogMassEditAssertions.js +2 -2
  39. package/src/sap/fe/test/api/DialogMessageActions.js +2 -2
  40. package/src/sap/fe/test/api/DialogMessageAssertions.js +2 -2
  41. package/src/sap/fe/test/api/DialogType.js +2 -2
  42. package/src/sap/fe/test/api/DialogValueHelpActions.js +2 -2
  43. package/src/sap/fe/test/api/DialogValueHelpAssertions.js +2 -2
  44. package/src/sap/fe/test/api/EditState.js +2 -2
  45. package/src/sap/fe/test/api/FilterBarAPI.js +2 -2
  46. package/src/sap/fe/test/api/FilterBarActions.js +2 -2
  47. package/src/sap/fe/test/api/FilterBarAssertions.js +4 -4
  48. package/src/sap/fe/test/api/FooterAPI.js +2 -2
  49. package/src/sap/fe/test/api/FooterActionsBase.js +2 -2
  50. package/src/sap/fe/test/api/FooterActionsOP.js +2 -2
  51. package/src/sap/fe/test/api/FooterAssertionsBase.js +2 -2
  52. package/src/sap/fe/test/api/FooterAssertionsOP.js +2 -2
  53. package/src/sap/fe/test/api/FormAPI.js +2 -2
  54. package/src/sap/fe/test/api/FormActions.js +2 -2
  55. package/src/sap/fe/test/api/FormAssertions.js +2 -2
  56. package/src/sap/fe/test/api/HeaderAPI.js +2 -2
  57. package/src/sap/fe/test/api/HeaderActions.js +2 -2
  58. package/src/sap/fe/test/api/HeaderActionsLR.js +2 -2
  59. package/src/sap/fe/test/api/HeaderAssertions.js +2 -2
  60. package/src/sap/fe/test/api/HeaderAssertionsLR.js +2 -2
  61. package/src/sap/fe/test/api/HeaderLR.js +2 -2
  62. package/src/sap/fe/test/api/KPICardAPI.js +2 -2
  63. package/src/sap/fe/test/api/KPICardActions.js +2 -2
  64. package/src/sap/fe/test/api/KPICardAssertions.js +2 -2
  65. package/src/sap/fe/test/api/TableAPI.js +2 -2
  66. package/src/sap/fe/test/api/TableActions.js +2 -2
  67. package/src/sap/fe/test/api/TableAssertions.js +20 -5
  68. package/src/sap/fe/test/builder/DialogBuilder.js +2 -2
  69. package/src/sap/fe/test/builder/FEBuilder.js +2 -2
  70. package/src/sap/fe/test/builder/KPIBuilder.js +2 -2
  71. package/src/sap/fe/test/builder/MacroFieldBuilder.js +3 -3
  72. package/src/sap/fe/test/builder/MdcFieldBuilder.js +5 -5
  73. package/src/sap/fe/test/builder/MdcFilterBarBuilder.js +2 -2
  74. package/src/sap/fe/test/builder/MdcFilterFieldBuilder.js +2 -2
  75. package/src/sap/fe/test/builder/MdcTableBuilder.js +10 -6
  76. package/src/sap/fe/test/builder/OverflowToolbarBuilder.js +2 -2
  77. package/src/sap/fe/test/builder/VMBuilder.js +2 -2
  78. package/src/sap/fe/test/internal/ConsoleErrorChecker.js +41 -53
  79. package/src/sap/fe/test/internal/FEArrangements.js +3 -3
  80. package/src/sap/fe/test/internal/FEJourneyRunner.js +2 -2
  81. package/src/sap/fe/test/library-preload.js +17993 -0
  82. package/src/sap/fe/test/library-preload.js.map +1 -0
  83. package/src/sap/fe/test/library.js +4 -4
  84. package/src/sap/fe/test/manifest.json +35 -0
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2023 SAP SE. All rights reserved
4
4
  */
5
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";
@@ -9,159 +9,11 @@ sap.ui.define(["@sap/cds-compiler", "fs", "@prettier/plugin-xml", "path", "prett
9
9
  var createFlexibilityChangesObject = JestFlexibilityHelper.createFlexibilityChangesObject;
10
10
  var registerBuildingBlock = BuildingBlockRuntime.registerBuildingBlock;
11
11
  var format = prettier.format;
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; } } }; }
13
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
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."); }
15
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
16
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
17
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
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."); }
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); }
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; }
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; } }
22
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
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; }
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; }
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); }
28
- /**
29
- * Process the requested XML fragment with the provided data.
30
- *
31
- * @param name Fully qualified name of the fragment to be tested.
32
- * @param testData Test data consisting
33
- * @returns Templated fragment as string
34
- */
35
- var processFragment = function (name, testData) {
36
- try {
37
- var inputXml = "<root><core:Fragment fragmentName=\"".concat(name, "\" type=\"XML\" xmlns:core=\"sap.ui.core\" /></root>");
38
- var parser = new window.DOMParser();
39
- var inputDoc = parser.parseFromString(inputXml, "text/xml");
40
-
41
- // build model and bindings for given test data
42
- var settings = {
43
- models: {},
44
- bindingContexts: {}
45
- };
46
- for (var _model2 in testData) {
47
- var jsonModel = new JSONModel();
48
- jsonModel.setData(testData[_model2]);
49
- settings.models[_model2] = jsonModel;
50
- settings.bindingContexts[_model2] = settings.models[_model2].createBindingContext("/");
51
- }
52
-
53
- // execute the pre-processor
54
- return Promise.resolve(XMLPreprocessor.process(inputDoc.firstElementChild, {
55
- name: name
56
- }, settings)).then(function (resultDoc) {
57
- // exclude nested fragments from test snapshots
58
- var fragments = resultDoc.getElementsByTagName("core:Fragment");
59
- if ((fragments === null || fragments === void 0 ? void 0 : fragments.length) > 0) {
60
- var _iterator = _createForOfIteratorHelper(fragments),
61
- _step;
62
- try {
63
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
64
- var fragment = _step.value;
65
- fragment.innerHTML = "";
66
- }
67
- } catch (err) {
68
- _iterator.e(err);
69
- } finally {
70
- _iterator.f();
71
- }
72
- }
73
-
74
- // Keep the fragment result as child of root node when fragment generates multiple root controls
75
- var xmlResult = resultDoc.children.length > 1 ? resultDoc.outerHTML : resultDoc.innerHTML;
76
- return _removeCommentFromXml(xmlResult);
77
- });
78
- } catch (e) {
79
- return Promise.reject(e);
80
- }
81
- };
82
- _exports.processFragment = processFragment;
83
- /**
84
- * Process the requested view with the provided data.
85
- *
86
- * @param name Fully qualified name of the view to be tested.
87
- * @param sMetadataUrl Url of the metadata.
88
- * @param mBindingContexts Map of the bindingContexts to set on the models.
89
- * @param mModels Map of the models.
90
- * @param flexChanges Object with UI changes like 'changes' or 'variantDependentControlChanges'
91
- * @returns Templated view as string
92
- */
93
- var processView = function (name, sMetadataUrl, mBindingContexts, mModels, flexChanges) {
94
- try {
95
- return Promise.resolve(getMetaModel(sMetadataUrl)).then(function (oMetaModel) {
96
- var oViewDocument = _loadResourceView(name);
97
- return Promise.resolve(_buildPreProcessorSettings(sMetadataUrl, mBindingContexts, mModels)).then(function (oPreprocessorSettings) {
98
- return Promise.resolve(XMLPreprocessor.process(oViewDocument, {
99
- name: name
100
- }, oPreprocessorSettings)).then(function (oPreprocessedView) {
101
- function _temp7() {
102
- var _oPreprocessedView;
103
- return {
104
- asElement: oPreprocessedView,
105
- asString: _removeCommentFromXml(((_oPreprocessedView = oPreprocessedView) === null || _oPreprocessedView === void 0 ? void 0 : _oPreprocessedView.outerHTML) || "")
106
- };
107
- }
108
- var _temp6 = function () {
109
- if (flexChanges) {
110
- return Promise.resolve(applyFlexChanges(flexChanges !== null && flexChanges !== void 0 ? flexChanges : [], oMetaModel, oPreprocessedView)).then(function (_applyFlexChanges2) {
111
- oPreprocessedView = _applyFlexChanges2;
112
- });
113
- }
114
- }();
115
- return _temp6 && _temp6.then ? _temp6.then(_temp7) : _temp7(_temp6);
116
- });
117
- });
118
- });
119
- } catch (e) {
120
- return Promise.reject(e);
121
- }
122
- };
123
- _exports.processView = processView;
124
- var _buildPreProcessorSettings = function (sMetadataUrl, mBindingContexts, mModels) {
125
- try {
126
- return Promise.resolve(getMetaModel(sMetadataUrl)).then(function (oMetaModel) {
127
- // To ensure our macro can use #setBindingContext we ensure there is a pre existing JSONModel for converterContext
128
- // if not already passed to teh templating
129
- if (!mModels.hasOwnProperty("converterContext")) {
130
- mModels = Object.assign(mModels, {
131
- converterContext: new TemplateModel({}, oMetaModel)
132
- });
133
- }
134
- Object.keys(mModels).forEach(function (sModelName) {
135
- if (mModels[sModelName] && mModels[sModelName].isTemplateModel) {
136
- mModels[sModelName] = new TemplateModel(mModels[sModelName].data, oMetaModel);
137
- }
138
- });
139
- var settings = {
140
- models: Object.assign({
141
- metaModel: oMetaModel
142
- }, mModels),
143
- bindingContexts: {}
144
- };
145
-
146
- //Inject models and bindingContexts
147
- Object.keys(mBindingContexts).forEach(function (sKey) {
148
- /* Assert to make sure the annotations are in the test metadata -> avoid misleading tests */
149
- expect(typeof oMetaModel.getObject(mBindingContexts[sKey])).toBeDefined();
150
- var oModel = mModels[sKey] || oMetaModel;
151
- settings.bindingContexts[sKey] = oModel.createBindingContext(mBindingContexts[sKey]); //Value is sPath
152
- settings.models[sKey] = oModel;
153
- });
154
- return settings;
155
- });
156
- } catch (e) {
157
- return Promise.reject(e);
158
- }
159
- };
160
12
  // eslint-disable-next-line @typescript-eslint/no-var-requires
161
- var formatXml = require("xml-formatter");
13
+ const formatXml = require("xml-formatter");
162
14
  Log.setLevel(1, "sap.ui.core.util.XMLPreprocessor");
163
15
  jest.setTimeout(40000);
164
- var nameSpaceMap = {
16
+ const nameSpaceMap = {
165
17
  macros: "sap.fe.macros",
166
18
  macro: "sap.fe.macros",
167
19
  macroField: "sap.fe.macros.field",
@@ -184,85 +36,115 @@ sap.ui.define(["@sap/cds-compiler", "fs", "@prettier/plugin-xml", "path", "prett
184
36
  microChart: "sap.suite.ui.microchart",
185
37
  macroTable: "sap.fe.macros.table"
186
38
  };
187
- var select = xpath.useNamespaces(nameSpaceMap);
39
+ const select = xpath.useNamespaces(nameSpaceMap);
188
40
  function _getTemplatedSelector(xmldom, selector) {
189
41
  /**
190
42
  * if a root element has been added during the templating by our Jest Templating methods
191
43
  * the root element is added to the selector path.
192
44
  */
193
- var rootPath = "/root";
194
- return "".concat(xmldom.nodeName === "root" && !selector.startsWith(rootPath) ? rootPath : "").concat(selector);
45
+ const rootPath = "/root";
46
+ return `${xmldom.nodeName === "root" && !selector.startsWith(rootPath) ? rootPath : ""}${selector}`;
47
+ }
48
+ async function _buildPreProcessorSettings(sMetadataUrl, mBindingContexts, mModels) {
49
+ const oMetaModel = await getMetaModel(sMetadataUrl);
50
+
51
+ // To ensure our macro can use #setBindingContext we ensure there is a pre existing JSONModel for converterContext
52
+ // if not already passed to teh templating
53
+ if (!mModels.hasOwnProperty("converterContext")) {
54
+ mModels = Object.assign(mModels, {
55
+ converterContext: new TemplateModel({}, oMetaModel)
56
+ });
57
+ }
58
+ Object.keys(mModels).forEach(function (sModelName) {
59
+ if (mModels[sModelName] && mModels[sModelName].isTemplateModel) {
60
+ mModels[sModelName] = new TemplateModel(mModels[sModelName].data, oMetaModel);
61
+ }
62
+ });
63
+ const settings = {
64
+ models: Object.assign({
65
+ metaModel: oMetaModel
66
+ }, mModels),
67
+ bindingContexts: {}
68
+ };
69
+
70
+ //Inject models and bindingContexts
71
+ Object.keys(mBindingContexts).forEach(function (sKey) {
72
+ /* Assert to make sure the annotations are in the test metadata -> avoid misleading tests */
73
+ expect(typeof oMetaModel.getObject(mBindingContexts[sKey])).toBeDefined();
74
+ const oModel = mModels[sKey] || oMetaModel;
75
+ settings.bindingContexts[sKey] = oModel.createBindingContext(mBindingContexts[sKey]); //Value is sPath
76
+ settings.models[sKey] = oModel;
77
+ });
78
+ return settings;
195
79
  }
196
80
  function _removeCommentFromXml(xml) {
197
81
  return formatXml(xml, {
198
- filter: function (node) {
199
- return node.type !== "Comment";
200
- }
82
+ filter: node => node.type !== "Comment"
201
83
  });
202
84
  }
203
85
  function _loadResourceView(viewName) {
204
- var name = viewName.replace(/\./g, "/") + ".view.xml";
205
- var view = LoaderExtensions.loadResource(name);
86
+ const name = viewName.replace(/\./g, "/") + ".view.xml";
87
+ const view = LoaderExtensions.loadResource(name);
206
88
  return view.documentElement;
207
89
  }
208
- var registerMacro = function (macroMetadata) {
90
+ const registerMacro = function (macroMetadata) {
209
91
  registerBuildingBlock(macroMetadata);
210
92
  };
211
93
  _exports.registerMacro = registerMacro;
212
- var unregisterMacro = function (macroMetadata) {
94
+ const unregisterMacro = function (macroMetadata) {
213
95
  XMLPreprocessor.plugIn(null, macroMetadata.namespace, macroMetadata.name);
214
96
  if (macroMetadata.publicNamespace) {
215
97
  XMLPreprocessor.plugIn(null, macroMetadata.publicNamespace, macroMetadata.name);
216
98
  }
217
99
  };
218
100
  _exports.unregisterMacro = unregisterMacro;
219
- var runXPathQuery = function (selector, xmldom) {
101
+ const runXPathQuery = function (selector, xmldom) {
220
102
  return select(selector, xmldom);
221
103
  };
222
104
  expect.extend({
223
- toHaveControl: function (xmldom, selector) {
224
- var nodes = runXPathQuery(_getTemplatedSelector(xmldom, selector), xmldom);
105
+ toHaveControl(xmldom, selector) {
106
+ const nodes = runXPathQuery(_getTemplatedSelector(xmldom, selector), xmldom);
225
107
  return {
226
- message: function () {
227
- var outputXml = serializeXML(xmldom);
228
- return "did not find controls matching ".concat(selector, " in generated xml:\n ").concat(outputXml);
108
+ message: () => {
109
+ const outputXml = serializeXML(xmldom);
110
+ return `did not find controls matching ${selector} in generated xml:\n ${outputXml}`;
229
111
  },
230
112
  pass: nodes && nodes.length >= 1
231
113
  };
232
114
  },
233
- toNotHaveControl: function (xmldom, selector) {
234
- var nodes = runXPathQuery(_getTemplatedSelector(xmldom, selector), xmldom);
115
+ toNotHaveControl(xmldom, selector) {
116
+ const nodes = runXPathQuery(_getTemplatedSelector(xmldom, selector), xmldom);
235
117
  return {
236
- message: function () {
237
- var outputXml = serializeXML(xmldom);
238
- return "There is a control matching ".concat(selector, " in generated xml:\n ").concat(outputXml);
118
+ message: () => {
119
+ const outputXml = serializeXML(xmldom);
120
+ return `There is a control matching ${selector} in generated xml:\n ${outputXml}`;
239
121
  },
240
122
  pass: nodes && nodes.length === 0
241
123
  };
242
124
  }
243
125
  });
244
126
  _exports.runXPathQuery = runXPathQuery;
245
- var formatBuildingBlockXML = function (xmlString) {
127
+ const formatBuildingBlockXML = function (xmlString) {
246
128
  if (Array.isArray(xmlString)) {
247
129
  xmlString = xmlString.join("");
248
130
  }
249
- var xmlFormatted = formatXML(xmlString);
131
+ let xmlFormatted = formatXML(xmlString);
250
132
  xmlFormatted = xmlFormatted.replace(/uid--id-[0-9]{13}-[0-9]{1,2}/g, "uid--id");
251
133
  return xmlFormatted;
252
134
  };
253
135
  _exports.formatBuildingBlockXML = formatBuildingBlockXML;
254
- var getControlAttribute = function (controlSelector, attributeName, xmlDom) {
255
- var selector = "string(".concat(_getTemplatedSelector(xmlDom, controlSelector), "/@").concat(attributeName, ")");
136
+ const getControlAttribute = function (controlSelector, attributeName, xmlDom) {
137
+ const selector = `string(${_getTemplatedSelector(xmlDom, controlSelector)}/@${attributeName})`;
256
138
  return runXPathQuery(selector, xmlDom);
257
139
  };
258
140
  _exports.getControlAttribute = getControlAttribute;
259
- var serializeXML = function (xmlDom) {
260
- var serializer = new window.XMLSerializer();
261
- var xmlString = serializer.serializeToString(xmlDom);
141
+ const serializeXML = function (xmlDom) {
142
+ const serializer = new window.XMLSerializer();
143
+ const xmlString = serializer.serializeToString(xmlDom);
262
144
  return formatXML(xmlString);
263
145
  };
264
146
  _exports.serializeXML = serializeXML;
265
- var formatXML = function (xmlString) {
147
+ const formatXML = function (xmlString) {
266
148
  return format(xmlString, {
267
149
  parser: "xml",
268
150
  xmlWhitespaceSensitivity: "ignore",
@@ -280,13 +162,13 @@ sap.ui.define(["@sap/cds-compiler", "fs", "@prettier/plugin-xml", "path", "prett
280
162
  * @returns The path of the generated EDMX
281
163
  */
282
164
  _exports.formatXML = formatXML;
283
- var compileCDS = function (cdsUrl) {
284
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
285
- var edmxFileName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : path.basename(cdsUrl).replace(".cds", ".xml");
286
- var cdsString = fs.readFileSync(cdsUrl, "utf-8");
287
- var edmxContent = cds2edmx(cdsString, "sap.fe.test.JestService", options);
288
- var dir = path.resolve(cdsUrl, "..", "gen");
289
- var edmxFilePath = path.resolve(dir, edmxFileName);
165
+ const compileCDS = function (cdsUrl) {
166
+ let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
167
+ let edmxFileName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : path.basename(cdsUrl).replace(".cds", ".xml");
168
+ const cdsString = fs.readFileSync(cdsUrl, "utf-8");
169
+ const edmxContent = cds2edmx(cdsString, "sap.fe.test.JestService", options);
170
+ const dir = path.resolve(cdsUrl, "..", "gen");
171
+ const edmxFilePath = path.resolve(dir, edmxFileName);
290
172
  fs.mkdirSync(dir, {
291
173
  recursive: true
292
174
  });
@@ -304,9 +186,9 @@ sap.ui.define(["@sap/cds-compiler", "fs", "@prettier/plugin-xml", "path", "prett
304
186
  */
305
187
  _exports.compileCDS = compileCDS;
306
188
  function cds2edmx(cds) {
307
- var service = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "sap.fe.test.JestService";
308
- var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
309
- var sources = {
189
+ let service = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "sap.fe.test.JestService";
190
+ let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
191
+ const sources = {
310
192
  "source.cds": cds
311
193
  };
312
194
 
@@ -314,102 +196,86 @@ sap.ui.define(["@sap/cds-compiler", "fs", "@prettier/plugin-xml", "path", "prett
314
196
  if (cds.includes("'@sap/cds/common'")) {
315
197
  sources["common.cds"] = fs.readFileSync(require.resolve("@sap/cds/common.cds"), "utf-8");
316
198
  }
317
- var csn = compiler.compileSources(sources, {});
318
- var edmxOptions = _objectSpread(_objectSpread({
199
+ const csn = compiler.compileSources(sources, {});
200
+ const edmxOptions = {
319
201
  odataForeignKeys: true,
320
202
  odataFormat: "structured",
321
- odataContainment: false
322
- }, options), {}, {
203
+ odataContainment: false,
204
+ ...options,
323
205
  service: service
324
- });
325
- var edmx = compiler.to.edmx(csn, edmxOptions);
206
+ };
207
+ const edmx = compiler.to.edmx(csn, edmxOptions);
326
208
  if (!edmx) {
327
- throw new Error("Compilation failed. Hint: Make sure that the CDS model defines service ".concat(service, "."));
209
+ throw new Error(`Compilation failed. Hint: Make sure that the CDS model defines service ${service}.`);
328
210
  }
329
211
  return edmx;
330
212
  }
331
213
  _exports.cds2edmx = cds2edmx;
332
- var getFakeSideEffectsService = function (oMetaModel) {
333
- try {
334
- var oServiceContext = {
335
- scopeObject: {},
336
- scopeType: "",
337
- settings: {}
338
- };
339
- return Promise.resolve(new SideEffectsFactory().createInstance(oServiceContext).then(function (oServiceInstance) {
340
- var oJestSideEffectsService = oServiceInstance.getInterface();
341
- oJestSideEffectsService.getContext = function () {
342
- return {
343
- scopeObject: {
344
- getModel: function () {
345
- return {
346
- getMetaModel: function () {
347
- return oMetaModel;
348
- }
349
- };
350
- }
214
+ const getFakeSideEffectsService = async function (oMetaModel) {
215
+ const oServiceContext = {
216
+ scopeObject: {},
217
+ scopeType: "",
218
+ settings: {}
219
+ };
220
+ return new SideEffectsFactory().createInstance(oServiceContext).then(function (oServiceInstance) {
221
+ const oJestSideEffectsService = oServiceInstance.getInterface();
222
+ oJestSideEffectsService.getContext = function () {
223
+ return {
224
+ scopeObject: {
225
+ getModel: function () {
226
+ return {
227
+ getMetaModel: function () {
228
+ return oMetaModel;
229
+ }
230
+ };
351
231
  }
352
- };
232
+ }
353
233
  };
354
- return oJestSideEffectsService;
355
- }));
356
- } catch (e) {
357
- return Promise.reject(e);
358
- }
234
+ };
235
+ return oJestSideEffectsService;
236
+ });
359
237
  };
360
238
  _exports.getFakeSideEffectsService = getFakeSideEffectsService;
361
- var getFakeDiagnostics = function () {
362
- var issues = [];
239
+ const getFakeDiagnostics = function () {
240
+ const issues = [];
363
241
  return {
364
- addIssue: function (issueCategory, issueSeverity, details) {
242
+ addIssue(issueCategory, issueSeverity, details) {
365
243
  issues.push({
366
- issueCategory: issueCategory,
367
- issueSeverity: issueSeverity,
368
- details: details
244
+ issueCategory,
245
+ issueSeverity,
246
+ details
369
247
  });
370
248
  },
371
- getIssues: function () {
249
+ getIssues() {
372
250
  return issues;
373
251
  },
374
- checkIfIssueExists: function (issueCategory, issueSeverity, details) {
375
- return issues.find(function (issue) {
252
+ checkIfIssueExists(issueCategory, issueSeverity, details) {
253
+ return issues.find(issue => {
376
254
  return issue.issueCategory === issueCategory && issue.issueSeverity === issueSeverity && issue.details === details;
377
255
  });
378
256
  }
379
257
  };
380
258
  };
381
259
  _exports.getFakeDiagnostics = getFakeDiagnostics;
382
- var getConverterContextForTest = function (convertedTypes, manifestSettings) {
383
- var entitySet = convertedTypes.entitySets.find(function (es) {
384
- return es.name === manifestSettings.entitySet;
385
- });
386
- var dataModelPath = getDataModelObjectPathForProperty(entitySet, convertedTypes, entitySet);
260
+ const getConverterContextForTest = function (convertedTypes, manifestSettings) {
261
+ const entitySet = convertedTypes.entitySets.find(es => es.name === manifestSettings.entitySet);
262
+ const dataModelPath = getDataModelObjectPathForProperty(entitySet, convertedTypes, entitySet);
387
263
  return new ConverterContext(convertedTypes, manifestSettings, getFakeDiagnostics(), merge, dataModelPath);
388
264
  };
389
265
  _exports.getConverterContextForTest = getConverterContextForTest;
390
- var metaModelCache = {};
391
- var getMetaModel = function (sMetadataUrl) {
392
- try {
393
- function _temp3() {
394
- return metaModelCache[sMetadataUrl];
395
- }
396
- var oRequestor = _MetadataRequestor.create({}, "4.0", {});
397
- var _temp4 = function () {
398
- if (!metaModelCache[sMetadataUrl]) {
399
- var oMetaModel = new ODataMetaModel(oRequestor, sMetadataUrl, undefined, null);
400
- return Promise.resolve(oMetaModel.fetchEntityContainer()).then(function () {
401
- metaModelCache[sMetadataUrl] = oMetaModel;
402
- });
403
- }
404
- }();
405
- return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(_temp3) : _temp3(_temp4));
406
- } catch (e) {
407
- return Promise.reject(e);
266
+ const metaModelCache = {};
267
+ const getMetaModel = async function (sMetadataUrl) {
268
+ const oRequestor = _MetadataRequestor.create({}, "4.0", undefined, {});
269
+ if (!metaModelCache[sMetadataUrl]) {
270
+ const oMetaModel = new ODataMetaModel(oRequestor, sMetadataUrl, undefined, null);
271
+ await oMetaModel.fetchEntityContainer();
272
+ metaModelCache[sMetadataUrl] = oMetaModel;
408
273
  }
274
+ return metaModelCache[sMetadataUrl];
409
275
  };
410
276
  _exports.getMetaModel = getMetaModel;
411
- var getDataModelObjectPathForProperty = function (entitySet, convertedTypes, property) {
412
- var targetPath = {
277
+ const getDataModelObjectPathForProperty = function (entitySet, convertedTypes, property) {
278
+ const targetPath = {
413
279
  startingEntitySet: entitySet,
414
280
  navigationProperties: [],
415
281
  targetObject: property,
@@ -421,8 +287,8 @@ sap.ui.define(["@sap/cds-compiler", "fs", "@prettier/plugin-xml", "path", "prett
421
287
  return targetPath;
422
288
  };
423
289
  _exports.getDataModelObjectPathForProperty = getDataModelObjectPathForProperty;
424
- var evaluateBinding = function (bindingString) {
425
- var bindingElement = BindingParser.complexParser(bindingString);
290
+ const evaluateBinding = function (bindingString) {
291
+ const bindingElement = BindingParser.complexParser(bindingString);
426
292
  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
427
293
  args[_key - 1] = arguments[_key];
428
294
  }
@@ -438,211 +304,247 @@ sap.ui.define(["@sap/cds-compiler", "fs", "@prettier/plugin-xml", "path", "prett
438
304
  * @returns The evaluated binding.
439
305
  */
440
306
  function evaluateBindingWithModel(bindingString, modelContent, namedModelsContent) {
441
- var bindingElement = BindingParser.complexParser(bindingString);
442
- var text = new InvisibleText();
307
+ const bindingElement = BindingParser.complexParser(bindingString);
308
+ const text = new InvisibleText();
443
309
  text.bindProperty("text", bindingElement);
444
- var defaultModel = new JSONModel(modelContent);
310
+ const defaultModel = new JSONModel(modelContent);
445
311
  text.setModel(defaultModel);
446
312
  text.setBindingContext(defaultModel.createBindingContext("/"));
447
313
  if (namedModelsContent) {
448
- for (var _i = 0, _Object$entries = Object.entries(namedModelsContent); _i < _Object$entries.length; _i++) {
449
- var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
450
- _name = _Object$entries$_i[0],
451
- content = _Object$entries$_i[1];
452
- var _model = new JSONModel(content);
453
- text.setModel(_model, _name);
454
- text.setBindingContext(_model.createBindingContext("/"), _name);
314
+ for (const [name, content] of Object.entries(namedModelsContent)) {
315
+ const model = new JSONModel(content);
316
+ text.setModel(model, name);
317
+ text.setBindingContext(model.createBindingContext("/"), name);
455
318
  }
456
319
  }
457
320
  return text.getText();
458
321
  }
459
322
  _exports.evaluateBindingWithModel = evaluateBindingWithModel;
460
- var TESTVIEWID = "testViewId";
461
- var applyFlexChanges = function (flexChanges, oMetaModel, resultXML) {
462
- try {
463
- // prefix Ids
464
- _toConsumableArray(resultXML.querySelectorAll("[id]")).forEach(function (node) {
465
- node.id = "".concat(TESTVIEWID, "--").concat(node.id);
466
- });
467
- var changes = createFlexibilityChangesObject(TESTVIEWID, flexChanges);
468
- var appId = "someComponent";
469
- var oManifest = {
470
- "sap.app": {
471
- id: appId,
472
- type: "application",
473
- crossNavigation: {
474
- outbounds: []
475
- }
323
+ const TESTVIEWID = "testViewId";
324
+ const applyFlexChanges = async function (flexChanges, oMetaModel, resultXML) {
325
+ var _flexChanges$changes, _flexChanges$variantD;
326
+ // prefix Ids
327
+ [...resultXML.querySelectorAll("[id]")].forEach(node => {
328
+ node.id = `${TESTVIEWID}--${node.id}`;
329
+ });
330
+ const changes = createFlexibilityChangesObject(TESTVIEWID, flexChanges);
331
+ const appId = "someComponent";
332
+ const oManifest = {
333
+ "sap.app": {
334
+ id: appId,
335
+ type: "application",
336
+ crossNavigation: {
337
+ outbounds: []
476
338
  }
477
- };
478
- var oAppComponent = {
479
- getDiagnostics: jest.fn().mockReturnValue(getFakeDiagnostics()),
480
- getModel: jest.fn().mockReturnValue({
481
- getMetaModel: jest.fn().mockReturnValue(oMetaModel)
482
- }),
483
- getComponentData: jest.fn().mockReturnValue({}),
484
- getManifestObject: jest.fn().mockReturnValue({
485
- getEntry: function (name) {
486
- return oManifest[name];
487
- }
488
- }),
489
- getLocalId: jest.fn(function (sId) {
490
- return sId;
491
- })
492
- };
493
- //fake changes
494
- jest.spyOn(AppStorage, "loadFlexData").mockReturnValue(Promise.resolve(changes));
495
- jest.spyOn(Component, "get").mockReturnValue(oAppComponent);
496
- jest.spyOn(Utils, "getAppComponentForControl").mockReturnValue(oAppComponent);
497
- return Promise.resolve(FlexState.initialize({
498
- componentId: appId
499
- })).then(function () {
500
- return Promise.resolve(XmlPreprocessor.process(resultXML, {
501
- name: "Test Fragment",
502
- componentId: appId,
503
- id: TESTVIEWID
504
- })).then(function (_XmlPreprocessor$proc) {
505
- var _ref, _flexChanges$changes$, _flexChanges$changes, _flexChanges$variantD;
506
- resultXML = _XmlPreprocessor$proc;
507
- //Assert that all changes have been applied
508
- var changesApplied = getChangesFromXML(resultXML);
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);
510
- return resultXML;
511
- });
512
- });
513
- } catch (e) {
514
- return Promise.reject(e);
515
- }
516
- };
517
- var getChangesFromXML = function (xml) {
518
- return _toConsumableArray(xml.querySelectorAll("*")).flatMap(function (e) {
519
- return _toConsumableArray(e.attributes).map(function (a) {
520
- return a.name;
521
- });
522
- }).filter(function (attr) {
523
- return attr.includes("sap.ui.fl.appliedChanges");
339
+ }
340
+ };
341
+ const oAppComponent = {
342
+ getDiagnostics: jest.fn().mockReturnValue(getFakeDiagnostics()),
343
+ getModel: jest.fn().mockReturnValue({
344
+ getMetaModel: jest.fn().mockReturnValue(oMetaModel)
345
+ }),
346
+ getComponentData: jest.fn().mockReturnValue({}),
347
+ getManifestObject: jest.fn().mockReturnValue({
348
+ getEntry: function (name) {
349
+ return oManifest[name];
350
+ }
351
+ }),
352
+ getLocalId: jest.fn(sId => sId)
353
+ };
354
+ //fake changes
355
+ jest.spyOn(AppStorage, "loadFlexData").mockReturnValue(Promise.resolve(changes));
356
+ jest.spyOn(Component, "get").mockReturnValue(oAppComponent);
357
+ jest.spyOn(Utils, "getAppComponentForControl").mockReturnValue(oAppComponent);
358
+ await FlexState.initialize({
359
+ componentId: appId
524
360
  });
361
+ resultXML = await XmlPreprocessor.process(resultXML, {
362
+ name: "Test Fragment",
363
+ componentId: appId,
364
+ id: TESTVIEWID
365
+ });
366
+
367
+ //Assert that all changes have been applied
368
+ const changesApplied = getChangesFromXML(resultXML);
369
+ expect(changesApplied.length).toBe((flexChanges === null || flexChanges === void 0 ? void 0 : (_flexChanges$changes = flexChanges.changes) === null || _flexChanges$changes === void 0 ? void 0 : _flexChanges$changes.length) ?? 0 + (flexChanges === null || flexChanges === void 0 ? void 0 : (_flexChanges$variantD = flexChanges.variantDependentControlChanges) === null || _flexChanges$variantD === void 0 ? void 0 : _flexChanges$variantD.length) ?? 0);
370
+ return resultXML;
525
371
  };
372
+ const getChangesFromXML = xml => [...xml.querySelectorAll("*")].flatMap(e => [...e.attributes].map(a => a.name)).filter(attr => attr.includes("sap.ui.fl.appliedChanges"));
526
373
  _exports.getChangesFromXML = getChangesFromXML;
527
- var getTemplatingResult = function (xmlInput, sMetadataUrl, mBindingContexts, mModels, flexChanges) {
528
- try {
529
- var templatedXml = "<root>".concat(xmlInput, "</root>");
530
- var parser = new window.DOMParser();
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
533
- // if not already passed to teh templating
534
- return Promise.resolve(getMetaModel(sMetadataUrl)).then(function (oMetaModel) {
535
- return Promise.resolve(_buildPreProcessorSettings(sMetadataUrl, mBindingContexts, mModels)).then(function (oPreprocessorSettings) {
536
- //This context for macro testing
537
- if (oPreprocessorSettings.models["this"]) {
538
- oPreprocessorSettings.bindingContexts["this"] = oPreprocessorSettings.models["this"].createBindingContext("/");
539
- }
540
- return Promise.resolve(XMLPreprocessor.process(xmlDoc.firstElementChild, {
541
- name: "Test Fragment"
542
- }, oPreprocessorSettings)).then(function (_XMLPreprocessor$proc) {
543
- var resultXML = _XMLPreprocessor$proc;
544
- var _temp5 = function () {
545
- if (flexChanges) {
546
- // apply flex changes
547
- return Promise.resolve(applyFlexChanges(flexChanges, oMetaModel, resultXML)).then(function (_applyFlexChanges) {
548
- resultXML = _applyFlexChanges;
549
- });
550
- }
551
- }();
552
- return _temp5 && _temp5.then ? _temp5.then(function () {
553
- return resultXML;
554
- }) : resultXML;
555
- });
556
- });
557
- });
558
- } catch (e) {
559
- return Promise.reject(e);
374
+ const getTemplatingResult = async function (xmlInput, sMetadataUrl, mBindingContexts, mModels, flexChanges) {
375
+ const templatedXml = `<root>${xmlInput}</root>`;
376
+ const parser = new window.DOMParser();
377
+ const xmlDoc = parser.parseFromString(templatedXml, "text/xml");
378
+ // To ensure our macro can use #setBindingContext we ensure there is a pre existing JSONModel for converterContext
379
+ // if not already passed to teh templating
380
+
381
+ const oMetaModel = await getMetaModel(sMetadataUrl);
382
+ const oPreprocessorSettings = await _buildPreProcessorSettings(sMetadataUrl, mBindingContexts, mModels);
383
+
384
+ //This context for macro testing
385
+ if (oPreprocessorSettings.models["this"]) {
386
+ oPreprocessorSettings.bindingContexts["this"] = oPreprocessorSettings.models["this"].createBindingContext("/");
387
+ }
388
+ let resultXML = await XMLPreprocessor.process(xmlDoc.firstElementChild, {
389
+ name: "Test Fragment"
390
+ }, oPreprocessorSettings);
391
+ if (flexChanges) {
392
+ // apply flex changes
393
+ resultXML = await applyFlexChanges(flexChanges, oMetaModel, resultXML);
560
394
  }
395
+ return resultXML;
561
396
  };
562
397
  _exports.getTemplatingResult = getTemplatingResult;
563
- var getTemplatedXML = function (xmlInput, sMetadataUrl, mBindingContexts, mModels, flexChanges) {
564
- try {
565
- return Promise.resolve(getTemplatingResult(xmlInput, sMetadataUrl, mBindingContexts, mModels, flexChanges)).then(serializeXML);
566
- } catch (e) {
567
- return Promise.reject(e);
568
- }
398
+ const getTemplatedXML = async function (xmlInput, sMetadataUrl, mBindingContexts, mModels, flexChanges) {
399
+ const templatedXML = await getTemplatingResult(xmlInput, sMetadataUrl, mBindingContexts, mModels, flexChanges);
400
+ return serializeXML(templatedXML);
569
401
  };
402
+
403
+ /**
404
+ * Process the requested view with the provided data.
405
+ *
406
+ * @param name Fully qualified name of the view to be tested.
407
+ * @param sMetadataUrl Url of the metadata.
408
+ * @param mBindingContexts Map of the bindingContexts to set on the models.
409
+ * @param mModels Map of the models.
410
+ * @param flexChanges Object with UI changes like 'changes' or 'variantDependentControlChanges'
411
+ * @returns Templated view as string
412
+ */
570
413
  _exports.getTemplatedXML = getTemplatedXML;
414
+ async function processView(name, sMetadataUrl, mBindingContexts, mModels, flexChanges) {
415
+ var _oPreprocessedView;
416
+ const oMetaModel = await getMetaModel(sMetadataUrl);
417
+ const oViewDocument = _loadResourceView(name);
418
+ const oPreprocessorSettings = await _buildPreProcessorSettings(sMetadataUrl, mBindingContexts, mModels);
419
+ let oPreprocessedView = await XMLPreprocessor.process(oViewDocument, {
420
+ name: name
421
+ }, oPreprocessorSettings);
422
+ if (flexChanges) {
423
+ oPreprocessedView = await applyFlexChanges(flexChanges ?? [], oMetaModel, oPreprocessedView);
424
+ }
425
+ return {
426
+ asElement: oPreprocessedView,
427
+ asString: _removeCommentFromXml(((_oPreprocessedView = oPreprocessedView) === null || _oPreprocessedView === void 0 ? void 0 : _oPreprocessedView.outerHTML) || "")
428
+ };
429
+ }
430
+
431
+ /**
432
+ * Process the requested XML fragment with the provided data.
433
+ *
434
+ * @param name Fully qualified name of the fragment to be tested.
435
+ * @param testData Test data consisting
436
+ * @returns Templated fragment as string
437
+ */
438
+ _exports.processView = processView;
439
+ async function processFragment(name, testData) {
440
+ const inputXml = `<root><core:Fragment fragmentName="${name}" type="XML" xmlns:core="sap.ui.core" /></root>`;
441
+ const parser = new window.DOMParser();
442
+ const inputDoc = parser.parseFromString(inputXml, "text/xml");
443
+
444
+ // build model and bindings for given test data
445
+ const settings = {
446
+ models: {},
447
+ bindingContexts: {}
448
+ };
449
+ for (const model in testData) {
450
+ const jsonModel = new JSONModel();
451
+ jsonModel.setData(testData[model]);
452
+ settings.models[model] = jsonModel;
453
+ settings.bindingContexts[model] = settings.models[model].createBindingContext("/");
454
+ }
455
+
456
+ // execute the pre-processor
457
+ const resultDoc = await XMLPreprocessor.process(inputDoc.firstElementChild, {
458
+ name
459
+ }, settings);
460
+
461
+ // exclude nested fragments from test snapshots
462
+ const fragments = resultDoc.getElementsByTagName("core:Fragment");
463
+ if ((fragments === null || fragments === void 0 ? void 0 : fragments.length) > 0) {
464
+ for (const fragment of fragments) {
465
+ fragment.innerHTML = "";
466
+ }
467
+ }
468
+
469
+ // Keep the fragment result as child of root node when fragment generates multiple root controls
470
+ const xmlResult = resultDoc.children.length > 1 ? resultDoc.outerHTML : resultDoc.innerHTML;
471
+ return _removeCommentFromXml(xmlResult);
472
+ }
473
+ _exports.processFragment = processFragment;
571
474
  function serializeControl(controlToSerialize) {
572
- var tabCount = 0;
475
+ let tabCount = 0;
573
476
  function getTab() {
574
- var toAdd = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
575
- var tab = "";
576
- for (var i = 0; i < tabCount + toAdd; i++) {
477
+ let toAdd = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
478
+ let tab = "";
479
+ for (let i = 0; i < tabCount + toAdd; i++) {
577
480
  tab += "\t";
578
481
  }
579
482
  return tab;
580
483
  }
581
- var serializeDelegate = {
484
+ const serializeDelegate = {
582
485
  start: function (control, sAggregationName) {
583
- var controlDetail = "";
486
+ let controlDetail = "";
584
487
  if (sAggregationName) {
585
488
  if (control.getParent()) {
586
489
  var _control$getParent$ge, _control$getParent$ge2;
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);
490
+ const 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);
588
491
  if (indexInParent > 0) {
589
- controlDetail += ",\n".concat(getTab());
492
+ controlDetail += `,\n${getTab()}`;
590
493
  }
591
494
  }
592
495
  }
593
- controlDetail += "".concat(control.getMetadata().getName(), "(");
496
+ controlDetail += `${control.getMetadata().getName()}(`;
594
497
  return controlDetail;
595
498
  },
596
499
  end: function () {
597
500
  return "})";
598
501
  },
599
502
  middle: function (control) {
600
- var id = control.getId();
601
- var data = "{id: ".concat(ManagedObjectMetadata.isGeneratedId(id) ? "__dynamicId" : id);
602
- for (var oControlKey in control.mProperties) {
503
+ const id = control.getId();
504
+ let data = `{id: ${ManagedObjectMetadata.isGeneratedId(id) ? "__dynamicId" : id}`;
505
+ for (const oControlKey in control.mProperties) {
603
506
  if (control.mProperties.hasOwnProperty(oControlKey)) {
604
- data += ",\n".concat(getTab(), " ").concat(oControlKey, ": ").concat(control.mProperties[oControlKey]);
507
+ data += `,\n${getTab()} ${oControlKey}: ${control.mProperties[oControlKey]}`;
605
508
  } else if (control.mBindingInfos.hasOwnProperty(oControlKey)) {
606
- var bindingDetail = control.mBindingInfos[oControlKey];
607
- data += ",\n".concat(getTab(), " ").concat(oControlKey, ": formatter(").concat(bindingDetail.parts.map(function (bindingInfo) {
608
- return "\n".concat(getTab(1)).concat(bindingInfo.model ? bindingInfo.model : "", ">").concat(bindingInfo.path);
609
- }), ")");
509
+ const bindingDetail = control.mBindingInfos[oControlKey];
510
+ data += `,\n${getTab()} ${oControlKey}: ${JSON.stringify(bindingDetail)}`;
610
511
  }
611
512
  }
612
- for (var _oControlKey in control.mAssociations) {
613
- if (control.mAssociations.hasOwnProperty(_oControlKey)) {
614
- data += ",\n".concat(getTab(), " ").concat(_oControlKey, ": ").concat(control.mAssociations[_oControlKey][0]);
513
+ for (const oControlKey in control.mAssociations) {
514
+ if (control.mAssociations.hasOwnProperty(oControlKey)) {
515
+ var _control$mAssociation, _control$mAssociation2, _control$mAssociation3;
516
+ data += `,\n${getTab()} ${oControlKey}: ${(((_control$mAssociation = control.mAssociations[oControlKey]) === null || _control$mAssociation === void 0 ? void 0 : (_control$mAssociation2 = (_control$mAssociation3 = _control$mAssociation).join) === null || _control$mAssociation2 === void 0 ? void 0 : _control$mAssociation2.call(_control$mAssociation3, ",")) ?? control.mAssociations[oControlKey]) || undefined}`;
615
517
  }
616
518
  }
617
- for (var _oControlKey2 in control.mEventRegistry) {
618
- if (control.mEventRegistry.hasOwnProperty(_oControlKey2)) {
619
- data += ",\n".concat(getTab(), " ").concat(_oControlKey2, ": true}");
519
+ for (const oControlKey in control.mEventRegistry) {
520
+ if (control.mEventRegistry.hasOwnProperty(oControlKey)) {
521
+ data += `,\n${getTab()} ${oControlKey}: true}`;
620
522
  }
621
523
  }
622
- data += "";
524
+ data += ``;
623
525
  return data;
624
526
  },
625
527
  startAggregation: function (control, sName) {
626
- var out = ",\n".concat(getTab()).concat(sName);
528
+ let out = `,\n${getTab()}${sName}`;
627
529
  tabCount++;
628
530
  if (control.mBindingInfos[sName]) {
629
- out += "={ path:'".concat(control.mBindingInfos[sName].path, "', template:\n").concat(getTab());
531
+ out += `={ path:'${control.mBindingInfos[sName].path}', template:\n${getTab()}`;
630
532
  } else {
631
- out += "=[\n".concat(getTab());
533
+ out += `=[\n${getTab()}`;
632
534
  }
633
535
  return out;
634
536
  },
635
537
  endAggregation: function (control, sName) {
636
538
  tabCount--;
637
539
  if (control.mBindingInfos[sName]) {
638
- return "\n".concat(getTab(), "}");
540
+ return `\n${getTab()}}`;
639
541
  } else {
640
- return "\n".concat(getTab(), "]");
542
+ return `\n${getTab()}]`;
641
543
  }
642
544
  }
643
545
  };
644
546
  if (Array.isArray(controlToSerialize)) {
645
- return controlToSerialize.map(function (controlToRender) {
547
+ return controlToSerialize.map(controlToRender => {
646
548
  return new Serializer(controlToRender, serializeDelegate).serialize();
647
549
  });
648
550
  } else {
@@ -651,8 +553,8 @@ sap.ui.define(["@sap/cds-compiler", "fs", "@prettier/plugin-xml", "path", "prett
651
553
  }
652
554
  _exports.serializeControl = serializeControl;
653
555
  function createAwaiter() {
654
- var fnResolve;
655
- var myPromise = new Promise(function (resolve) {
556
+ let fnResolve;
557
+ const myPromise = new Promise(resolve => {
656
558
  fnResolve = resolve;
657
559
  });
658
560
  return {
@@ -663,4 +565,4 @@ sap.ui.define(["@sap/cds-compiler", "fs", "@prettier/plugin-xml", "path", "prett
663
565
  _exports.createAwaiter = createAwaiter;
664
566
  return _exports;
665
567
  }, false);
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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
568
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmb3JtYXRYbWwiLCJyZXF1aXJlIiwiTG9nIiwic2V0TGV2ZWwiLCJqZXN0Iiwic2V0VGltZW91dCIsIm5hbWVTcGFjZU1hcCIsIm1hY3JvcyIsIm1hY3JvIiwibWFjcm9GaWVsZCIsIm1hY3JvZGF0YSIsImxvZyIsInVuaXR0ZXN0IiwiY29udHJvbCIsImNvcmUiLCJkdCIsIm0iLCJmIiwiZmwiLCJpbnRlcm5hbE1hY3JvIiwibWRjIiwibWRjYXQiLCJtZGNGaWVsZCIsIm1kY1RhYmxlIiwidSIsIm1hY3JvTWljcm9DaGFydCIsIm1pY3JvQ2hhcnQiLCJtYWNyb1RhYmxlIiwic2VsZWN0IiwieHBhdGgiLCJ1c2VOYW1lc3BhY2VzIiwiX2dldFRlbXBsYXRlZFNlbGVjdG9yIiwieG1sZG9tIiwic2VsZWN0b3IiLCJyb290UGF0aCIsIm5vZGVOYW1lIiwic3RhcnRzV2l0aCIsIl9idWlsZFByZVByb2Nlc3NvclNldHRpbmdzIiwic01ldGFkYXRhVXJsIiwibUJpbmRpbmdDb250ZXh0cyIsIm1Nb2RlbHMiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiaGFzT3duUHJvcGVydHkiLCJPYmplY3QiLCJhc3NpZ24iLCJjb252ZXJ0ZXJDb250ZXh0IiwiVGVtcGxhdGVNb2RlbCIsImtleXMiLCJmb3JFYWNoIiwic01vZGVsTmFtZSIsImlzVGVtcGxhdGVNb2RlbCIsImRhdGEiLCJzZXR0aW5ncyIsIm1vZGVscyIsIm1ldGFNb2RlbCIsImJpbmRpbmdDb250ZXh0cyIsInNLZXkiLCJleHBlY3QiLCJnZXRPYmplY3QiLCJ0b0JlRGVmaW5lZCIsIm9Nb2RlbCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiX3JlbW92ZUNvbW1lbnRGcm9tWG1sIiwieG1sIiwiZmlsdGVyIiwibm9kZSIsInR5cGUiLCJfbG9hZFJlc291cmNlVmlldyIsInZpZXdOYW1lIiwibmFtZSIsInJlcGxhY2UiLCJ2aWV3IiwiTG9hZGVyRXh0ZW5zaW9ucyIsImxvYWRSZXNvdXJjZSIsImRvY3VtZW50RWxlbWVudCIsInJlZ2lzdGVyTWFjcm8iLCJtYWNyb01ldGFkYXRhIiwicmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIiwidW5yZWdpc3Rlck1hY3JvIiwiWE1MUHJlcHJvY2Vzc29yIiwicGx1Z0luIiwibmFtZXNwYWNlIiwicHVibGljTmFtZXNwYWNlIiwicnVuWFBhdGhRdWVyeSIsImV4dGVuZCIsInRvSGF2ZUNvbnRyb2wiLCJub2RlcyIsIm1lc3NhZ2UiLCJvdXRwdXRYbWwiLCJzZXJpYWxpemVYTUwiLCJwYXNzIiwibGVuZ3RoIiwidG9Ob3RIYXZlQ29udHJvbCIsImZvcm1hdEJ1aWxkaW5nQmxvY2tYTUwiLCJ4bWxTdHJpbmciLCJBcnJheSIsImlzQXJyYXkiLCJqb2luIiwieG1sRm9ybWF0dGVkIiwiZm9ybWF0WE1MIiwiZ2V0Q29udHJvbEF0dHJpYnV0ZSIsImNvbnRyb2xTZWxlY3RvciIsImF0dHJpYnV0ZU5hbWUiLCJ4bWxEb20iLCJzZXJpYWxpemVyIiwid2luZG93IiwiWE1MU2VyaWFsaXplciIsInNlcmlhbGl6ZVRvU3RyaW5nIiwiZm9ybWF0IiwicGFyc2VyIiwieG1sV2hpdGVzcGFjZVNlbnNpdGl2aXR5IiwicGx1Z2lucyIsInBsdWdpbiIsImNvbXBpbGVDRFMiLCJjZHNVcmwiLCJvcHRpb25zIiwiZWRteEZpbGVOYW1lIiwicGF0aCIsImJhc2VuYW1lIiwiY2RzU3RyaW5nIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJlZG14Q29udGVudCIsImNkczJlZG14IiwiZGlyIiwicmVzb2x2ZSIsImVkbXhGaWxlUGF0aCIsIm1rZGlyU3luYyIsInJlY3Vyc2l2ZSIsIndyaXRlRmlsZVN5bmMiLCJjZHMiLCJzZXJ2aWNlIiwic291cmNlcyIsImluY2x1ZGVzIiwiY3NuIiwiY29tcGlsZXIiLCJjb21waWxlU291cmNlcyIsImVkbXhPcHRpb25zIiwib2RhdGFGb3JlaWduS2V5cyIsIm9kYXRhRm9ybWF0Iiwib2RhdGFDb250YWlubWVudCIsImVkbXgiLCJ0byIsIkVycm9yIiwiZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSIsIm9TZXJ2aWNlQ29udGV4dCIsInNjb3BlT2JqZWN0Iiwic2NvcGVUeXBlIiwiU2lkZUVmZmVjdHNGYWN0b3J5IiwiY3JlYXRlSW5zdGFuY2UiLCJ0aGVuIiwib1NlcnZpY2VJbnN0YW5jZSIsIm9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0SW50ZXJmYWNlIiwiZ2V0Q29udGV4dCIsImdldE1vZGVsIiwiZ2V0RmFrZURpYWdub3N0aWNzIiwiaXNzdWVzIiwiYWRkSXNzdWUiLCJpc3N1ZUNhdGVnb3J5IiwiaXNzdWVTZXZlcml0eSIsImRldGFpbHMiLCJwdXNoIiwiZ2V0SXNzdWVzIiwiY2hlY2tJZklzc3VlRXhpc3RzIiwiZmluZCIsImlzc3VlIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QiLCJjb252ZXJ0ZWRUeXBlcyIsIm1hbmlmZXN0U2V0dGluZ3MiLCJlbnRpdHlTZXQiLCJlbnRpdHlTZXRzIiwiZXMiLCJkYXRhTW9kZWxQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5IiwiQ29udmVydGVyQ29udGV4dCIsIm1lcmdlIiwibWV0YU1vZGVsQ2FjaGUiLCJvUmVxdWVzdG9yIiwiX01ldGFkYXRhUmVxdWVzdG9yIiwiY3JlYXRlIiwidW5kZWZpbmVkIiwiT0RhdGFNZXRhTW9kZWwiLCJmZXRjaEVudGl0eUNvbnRhaW5lciIsInByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRFbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsImNvbnRleHRMb2NhdGlvbiIsImV2YWx1YXRlQmluZGluZyIsImJpbmRpbmdTdHJpbmciLCJiaW5kaW5nRWxlbWVudCIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiYXJncyIsImZvcm1hdHRlciIsImFwcGx5IiwiZXZhbHVhdGVCaW5kaW5nV2l0aE1vZGVsIiwibW9kZWxDb250ZW50IiwibmFtZWRNb2RlbHNDb250ZW50IiwidGV4dCIsIkludmlzaWJsZVRleHQiLCJiaW5kUHJvcGVydHkiLCJkZWZhdWx0TW9kZWwiLCJKU09OTW9kZWwiLCJzZXRNb2RlbCIsInNldEJpbmRpbmdDb250ZXh0IiwiY29udGVudCIsImVudHJpZXMiLCJtb2RlbCIsImdldFRleHQiLCJURVNUVklFV0lEIiwiYXBwbHlGbGV4Q2hhbmdlcyIsImZsZXhDaGFuZ2VzIiwicmVzdWx0WE1MIiwicXVlcnlTZWxlY3RvckFsbCIsImlkIiwiY2hhbmdlcyIsImNyZWF0ZUZsZXhpYmlsaXR5Q2hhbmdlc09iamVjdCIsImFwcElkIiwib01hbmlmZXN0IiwiY3Jvc3NOYXZpZ2F0aW9uIiwib3V0Ym91bmRzIiwib0FwcENvbXBvbmVudCIsImdldERpYWdub3N0aWNzIiwiZm4iLCJtb2NrUmV0dXJuVmFsdWUiLCJnZXRDb21wb25lbnREYXRhIiwiZ2V0TWFuaWZlc3RPYmplY3QiLCJnZXRFbnRyeSIsImdldExvY2FsSWQiLCJzSWQiLCJzcHlPbiIsIkFwcFN0b3JhZ2UiLCJQcm9taXNlIiwiQ29tcG9uZW50IiwiVXRpbHMiLCJGbGV4U3RhdGUiLCJpbml0aWFsaXplIiwiY29tcG9uZW50SWQiLCJYbWxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwiY2hhbmdlc0FwcGxpZWQiLCJnZXRDaGFuZ2VzRnJvbVhNTCIsInRvQmUiLCJ2YXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXMiLCJmbGF0TWFwIiwiZSIsImF0dHJpYnV0ZXMiLCJtYXAiLCJhIiwiYXR0ciIsImdldFRlbXBsYXRpbmdSZXN1bHQiLCJ4bWxJbnB1dCIsInRlbXBsYXRlZFhtbCIsIkRPTVBhcnNlciIsInhtbERvYyIsInBhcnNlRnJvbVN0cmluZyIsIm9QcmVwcm9jZXNzb3JTZXR0aW5ncyIsImZpcnN0RWxlbWVudENoaWxkIiwiZ2V0VGVtcGxhdGVkWE1MIiwidGVtcGxhdGVkWE1MIiwicHJvY2Vzc1ZpZXciLCJvVmlld0RvY3VtZW50Iiwib1ByZXByb2Nlc3NlZFZpZXciLCJhc0VsZW1lbnQiLCJhc1N0cmluZyIsIm91dGVySFRNTCIsInByb2Nlc3NGcmFnbWVudCIsInRlc3REYXRhIiwiaW5wdXRYbWwiLCJpbnB1dERvYyIsImpzb25Nb2RlbCIsInNldERhdGEiLCJyZXN1bHREb2MiLCJmcmFnbWVudHMiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImZyYWdtZW50IiwiaW5uZXJIVE1MIiwieG1sUmVzdWx0IiwiY2hpbGRyZW4iLCJzZXJpYWxpemVDb250cm9sIiwiY29udHJvbFRvU2VyaWFsaXplIiwidGFiQ291bnQiLCJnZXRUYWIiLCJ0b0FkZCIsInRhYiIsImkiLCJzZXJpYWxpemVEZWxlZ2F0ZSIsInN0YXJ0Iiwic0FnZ3JlZ2F0aW9uTmFtZSIsImNvbnRyb2xEZXRhaWwiLCJnZXRQYXJlbnQiLCJpbmRleEluUGFyZW50IiwiZ2V0QWdncmVnYXRpb24iLCJpbmRleE9mIiwiZ2V0TWV0YWRhdGEiLCJnZXROYW1lIiwiZW5kIiwibWlkZGxlIiwiZ2V0SWQiLCJNYW5hZ2VkT2JqZWN0TWV0YWRhdGEiLCJpc0dlbmVyYXRlZElkIiwib0NvbnRyb2xLZXkiLCJtUHJvcGVydGllcyIsIm1CaW5kaW5nSW5mb3MiLCJiaW5kaW5nRGV0YWlsIiwiSlNPTiIsInN0cmluZ2lmeSIsIm1Bc3NvY2lhdGlvbnMiLCJtRXZlbnRSZWdpc3RyeSIsInN0YXJ0QWdncmVnYXRpb24iLCJzTmFtZSIsIm91dCIsImVuZEFnZ3JlZ2F0aW9uIiwiY29udHJvbFRvUmVuZGVyIiwiU2VyaWFsaXplciIsInNlcmlhbGl6ZSIsImNyZWF0ZUF3YWl0ZXIiLCJmblJlc29sdmUiLCJteVByb21pc2UiLCJwcm9taXNlIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJKZXN0VGVtcGxhdGluZ0hlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFueUFubm90YXRpb24sIENvbnZlcnRlZE1ldGFkYXRhLCBFbnRpdHlTZXQsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgY29tcGlsZXIgZnJvbSBcIkBzYXAvY2RzLWNvbXBpbGVyXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiQHByZXR0aWVyL3BsdWdpbi14bWxcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gXCJwcmV0dGllclwiO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBMb2FkZXJFeHRlbnNpb25zIGZyb20gXCJzYXAvYmFzZS91dGlsL0xvYWRlckV4dGVuc2lvbnNcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgeyByZWdpc3RlckJ1aWxkaW5nQmxvY2sgfSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvQnVpbGRpbmdCbG9ja1J1bnRpbWVcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzLCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgSURpYWdub3N0aWNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCBTaWRlRWZmZWN0c0ZhY3RvcnkgZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RNZXRhZGF0YVwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEludmlzaWJsZVRleHQgZnJvbSBcInNhcC91aS9jb3JlL0ludmlzaWJsZVRleHRcIjtcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL3NlcmlhbGl6ZXIvU2VyaWFsaXplclwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBGbGV4U3RhdGUgZnJvbSBcInNhcC91aS9mbC9hcHBseS9faW50ZXJuYWwvZmxleFN0YXRlL0ZsZXhTdGF0ZVwiO1xuaW1wb3J0IFhtbFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L19pbnRlcm5hbC9wcmVwcm9jZXNzb3JzL1htbFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IEFwcFN0b3JhZ2UgZnJvbSBcInNhcC91aS9mbC9pbml0aWFsL19pbnRlcm5hbC9TdG9yYWdlXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcInNhcC91aS9mbC9VdGlsc1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IE1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01ldGFNb2RlbFwiO1xuaW1wb3J0IF9NZXRhZGF0YVJlcXVlc3RvciBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L2xpYi9fTWV0YWRhdGFSZXF1ZXN0b3JcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgeHBhdGggZnJvbSBcInhwYXRoXCI7XG5pbXBvcnQgeyBjcmVhdGVGbGV4aWJpbGl0eUNoYW5nZXNPYmplY3QgfSBmcm9tIFwiLi9KZXN0RmxleGliaWxpdHlIZWxwZXJcIjtcblxudHlwZSBQcmVQcm9jZXNzb3JTZXR0aW5nc1R5cGUgPSB7XG5cdG1vZGVsczoge1xuXHRcdFtuYW1lOiBzdHJpbmddOiBKU09OTW9kZWwgfCBPRGF0YU1ldGFNb2RlbDtcblx0fTtcblx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0W25hbWU6IHN0cmluZ106IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdH07XG59O1xuXG50eXBlIEplc3RUZW1wbGF0ZWRWaWV3ID0ge1xuXHRhc0VsZW1lbnQ6IEVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cdGFzU3RyaW5nOiBzdHJpbmc7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuY29uc3QgZm9ybWF0WG1sID0gcmVxdWlyZShcInhtbC1mb3JtYXR0ZXJcIik7XG5cbkxvZy5zZXRMZXZlbCgxIGFzIGFueSwgXCJzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3NvclwiKTtcbmplc3Quc2V0VGltZW91dCg0MDAwMCk7XG5cbmNvbnN0IG5hbWVTcGFjZU1hcCA9IHtcblx0bWFjcm9zOiBcInNhcC5mZS5tYWNyb3NcIixcblx0bWFjcm86IFwic2FwLmZlLm1hY3Jvc1wiLFxuXHRtYWNyb0ZpZWxkOiBcInNhcC5mZS5tYWNyb3MuZmllbGRcIixcblx0bWFjcm9kYXRhOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0bG9nOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0dW5pdHRlc3Q6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvcHJlcHJvY2Vzc29yZXh0ZW5zaW9uL3NhcC5mZS51bml0dGVzdGluZy8xXCIsXG5cdGNvbnRyb2w6IFwic2FwLmZlLmNvcmUuY29udHJvbHNcIixcblx0Y29yZTogXCJzYXAudWkuY29yZVwiLFxuXHRkdDogXCJzYXAudWkuZHRcIixcblx0bTogXCJzYXAubVwiLFxuXHRmOiBcInNhcC51aS5sYXlvdXQuZm9ybVwiLFxuXHRmbDogXCJzYXAudWkuZmxcIixcblx0aW50ZXJuYWxNYWNybzogXCJzYXAuZmUubWFjcm9zLmludGVybmFsXCIsXG5cdG1kYzogXCJzYXAudWkubWRjXCIsXG5cdG1kY2F0OiBcInNhcC51aS5tZGMuYWN0aW9udG9vbGJhclwiLFxuXHRtZGNGaWVsZDogXCJzYXAudWkubWRjLmZpZWxkXCIsXG5cdG1kY1RhYmxlOiBcInNhcC51aS5tZGMudGFibGVcIixcblx0dTogXCJzYXAudWkudW5pZmllZFwiLFxuXHRtYWNyb01pY3JvQ2hhcnQ6IFwic2FwLmZlLm1hY3Jvcy5taWNyb2NoYXJ0XCIsXG5cdG1pY3JvQ2hhcnQ6IFwic2FwLnN1aXRlLnVpLm1pY3JvY2hhcnRcIixcblx0bWFjcm9UYWJsZTogXCJzYXAuZmUubWFjcm9zLnRhYmxlXCJcbn07XG5jb25zdCBzZWxlY3QgPSB4cGF0aC51c2VOYW1lc3BhY2VzKG5hbWVTcGFjZU1hcCk7XG5cbmZ1bmN0aW9uIF9nZXRUZW1wbGF0ZWRTZWxlY3Rvcih4bWxkb206IE5vZGUsIHNlbGVjdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuXHQvKipcblx0ICogaWYgYSByb290IGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgZHVyaW5nIHRoZSB0ZW1wbGF0aW5nIGJ5IG91ciBKZXN0IFRlbXBsYXRpbmcgbWV0aG9kc1xuXHQgKiB0aGUgcm9vdCBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZSBzZWxlY3RvciBwYXRoLlxuXHQgKi9cblx0Y29uc3Qgcm9vdFBhdGggPSBcIi9yb290XCI7XG5cdHJldHVybiBgJHt4bWxkb20ubm9kZU5hbWUgPT09IFwicm9vdFwiICYmICFzZWxlY3Rvci5zdGFydHNXaXRoKHJvb3RQYXRoKSA/IHJvb3RQYXRoIDogXCJcIn0ke3NlbGVjdG9yfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9idWlsZFByZVByb2Nlc3NvclNldHRpbmdzKFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9XG4pOiBQcm9taXNlPFByZVByb2Nlc3NvclNldHRpbmdzVHlwZT4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cblx0Ly8gVG8gZW5zdXJlIG91ciBtYWNybyBjYW4gdXNlICNzZXRCaW5kaW5nQ29udGV4dCB3ZSBlbnN1cmUgdGhlcmUgaXMgYSBwcmUgZXhpc3RpbmcgSlNPTk1vZGVsIGZvciBjb252ZXJ0ZXJDb250ZXh0XG5cdC8vIGlmIG5vdCBhbHJlYWR5IHBhc3NlZCB0byB0ZWggdGVtcGxhdGluZ1xuXHRpZiAoIW1Nb2RlbHMuaGFzT3duUHJvcGVydHkoXCJjb252ZXJ0ZXJDb250ZXh0XCIpKSB7XG5cdFx0bU1vZGVscyA9IE9iamVjdC5hc3NpZ24obU1vZGVscywgeyBjb252ZXJ0ZXJDb250ZXh0OiBuZXcgVGVtcGxhdGVNb2RlbCh7fSwgb01ldGFNb2RlbCkgfSk7XG5cdH1cblxuXHRPYmplY3Qua2V5cyhtTW9kZWxzKS5mb3JFYWNoKGZ1bmN0aW9uIChzTW9kZWxOYW1lKSB7XG5cdFx0aWYgKG1Nb2RlbHNbc01vZGVsTmFtZV0gJiYgbU1vZGVsc1tzTW9kZWxOYW1lXS5pc1RlbXBsYXRlTW9kZWwpIHtcblx0XHRcdG1Nb2RlbHNbc01vZGVsTmFtZV0gPSBuZXcgVGVtcGxhdGVNb2RlbChtTW9kZWxzW3NNb2RlbE5hbWVdLmRhdGEsIG9NZXRhTW9kZWwpO1xuXHRcdH1cblx0fSk7XG5cblx0Y29uc3Qgc2V0dGluZ3M6IGFueSA9IHtcblx0XHRtb2RlbHM6IE9iamVjdC5hc3NpZ24oXG5cdFx0XHR7XG5cdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbFxuXHRcdFx0fSxcblx0XHRcdG1Nb2RlbHNcblx0XHQpLFxuXHRcdGJpbmRpbmdDb250ZXh0czoge31cblx0fTtcblxuXHQvL0luamVjdCBtb2RlbHMgYW5kIGJpbmRpbmdDb250ZXh0c1xuXHRPYmplY3Qua2V5cyhtQmluZGluZ0NvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0LyogQXNzZXJ0IHRvIG1ha2Ugc3VyZSB0aGUgYW5ub3RhdGlvbnMgYXJlIGluIHRoZSB0ZXN0IG1ldGFkYXRhIC0+IGF2b2lkIG1pc2xlYWRpbmcgdGVzdHMgKi9cblx0XHRleHBlY3QodHlwZW9mIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pKS50b0JlRGVmaW5lZCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG1Nb2RlbHNbc0tleV0gfHwgb01ldGFNb2RlbDtcblx0XHRzZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0tleV0gPSBvTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQobUJpbmRpbmdDb250ZXh0c1tzS2V5XSk7IC8vVmFsdWUgaXMgc1BhdGhcblx0XHRzZXR0aW5ncy5tb2RlbHNbc0tleV0gPSBvTW9kZWw7XG5cdH0pO1xuXHRyZXR1cm4gc2V0dGluZ3M7XG59XG5cbmZ1bmN0aW9uIF9yZW1vdmVDb21tZW50RnJvbVhtbCh4bWw6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBmb3JtYXRYbWwoeG1sLCB7XG5cdFx0ZmlsdGVyOiAobm9kZTogYW55KSA9PiBub2RlLnR5cGUgIT09IFwiQ29tbWVudFwiXG5cdH0pO1xufVxuXG5mdW5jdGlvbiBfbG9hZFJlc291cmNlVmlldyh2aWV3TmFtZTogc3RyaW5nKTogRWxlbWVudCB7XG5cdGNvbnN0IG5hbWUgPSB2aWV3TmFtZS5yZXBsYWNlKC9cXC4vZywgXCIvXCIpICsgXCIudmlldy54bWxcIjtcblx0Y29uc3QgdmlldyA9IExvYWRlckV4dGVuc2lvbnMubG9hZFJlc291cmNlKG5hbWUpO1xuXHRyZXR1cm4gdmlldy5kb2N1bWVudEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCByZWdpc3Rlck1hY3JvID0gZnVuY3Rpb24gKG1hY3JvTWV0YWRhdGE6IGFueSkge1xuXHRyZWdpc3RlckJ1aWxkaW5nQmxvY2sobWFjcm9NZXRhZGF0YSk7XG59O1xuZXhwb3J0IGNvbnN0IHVucmVnaXN0ZXJNYWNybyA9IGZ1bmN0aW9uIChtYWNyb01ldGFkYXRhOiBhbnkpIHtcblx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihudWxsLCBtYWNyb01ldGFkYXRhLm5hbWVzcGFjZSwgbWFjcm9NZXRhZGF0YS5uYW1lKTtcblx0aWYgKG1hY3JvTWV0YWRhdGEucHVibGljTmFtZXNwYWNlKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihudWxsLCBtYWNyb01ldGFkYXRhLnB1YmxpY05hbWVzcGFjZSwgbWFjcm9NZXRhZGF0YS5uYW1lKTtcblx0fVxufTtcbmV4cG9ydCBjb25zdCBydW5YUGF0aFF1ZXJ5ID0gZnVuY3Rpb24gKHNlbGVjdG9yOiBzdHJpbmcsIHhtbGRvbTogTm9kZSB8IHVuZGVmaW5lZCkge1xuXHRyZXR1cm4gc2VsZWN0KHNlbGVjdG9yLCB4bWxkb20pO1xufTtcblxuZXhwZWN0LmV4dGVuZCh7XG5cdHRvSGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sZG9tLCBzZWxlY3RvciksIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgZGlkIG5vdCBmaW5kIGNvbnRyb2xzIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID49IDFcblx0XHR9O1xuXHR9LFxuXHR0b05vdEhhdmVDb250cm9sKHhtbGRvbSwgc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoX2dldFRlbXBsYXRlZFNlbGVjdG9yKHhtbGRvbSwgc2VsZWN0b3IpLCB4bWxkb20pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG91dHB1dFhtbCA9IHNlcmlhbGl6ZVhNTCh4bWxkb20pO1xuXHRcdFx0XHRyZXR1cm4gYFRoZXJlIGlzIGEgY29udHJvbCBtYXRjaGluZyAke3NlbGVjdG9yfSBpbiBnZW5lcmF0ZWQgeG1sOlxcbiAke291dHB1dFhtbH1gO1xuXHRcdFx0fSxcblx0XHRcdHBhc3M6IG5vZGVzICYmIG5vZGVzLmxlbmd0aCA9PT0gMFxuXHRcdH07XG5cdH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCA9IGZ1bmN0aW9uICh4bWxTdHJpbmc6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG5cdGlmIChBcnJheS5pc0FycmF5KHhtbFN0cmluZykpIHtcblx0XHR4bWxTdHJpbmcgPSB4bWxTdHJpbmcuam9pbihcIlwiKTtcblx0fVxuXHRsZXQgeG1sRm9ybWF0dGVkID0gZm9ybWF0WE1MKHhtbFN0cmluZyk7XG5cdHhtbEZvcm1hdHRlZCA9IHhtbEZvcm1hdHRlZC5yZXBsYWNlKC91aWQtLWlkLVswLTldezEzfS1bMC05XXsxLDJ9L2csIFwidWlkLS1pZFwiKTtcblx0cmV0dXJuIHhtbEZvcm1hdHRlZDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250cm9sQXR0cmlidXRlID0gZnVuY3Rpb24gKGNvbnRyb2xTZWxlY3Rvcjogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZWxlY3RvciA9IGBzdHJpbmcoJHtfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sRG9tLCBjb250cm9sU2VsZWN0b3IpfS9AJHthdHRyaWJ1dGVOYW1lfSlgO1xuXHRyZXR1cm4gcnVuWFBhdGhRdWVyeShzZWxlY3RvciwgeG1sRG9tKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVYTUwgPSBmdW5jdGlvbiAoeG1sRG9tOiBOb2RlKSB7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgd2luZG93LlhNTFNlcmlhbGl6ZXIoKTtcblx0Y29uc3QgeG1sU3RyaW5nID0gc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyh4bWxEb20pO1xuXHRyZXR1cm4gZm9ybWF0WE1MKHhtbFN0cmluZyk7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0WE1MID0gZnVuY3Rpb24gKHhtbFN0cmluZzogc3RyaW5nKSB7XG5cdHJldHVybiBmb3JtYXQoeG1sU3RyaW5nLCB7XG5cdFx0cGFyc2VyOiBcInhtbFwiLFxuXHRcdHhtbFdoaXRlc3BhY2VTZW5zaXRpdml0eTogXCJpZ25vcmVcIixcblx0XHRwbHVnaW5zOiBbcGx1Z2luXVxuXHR9IGFzIE9wdGlvbnMgJiB7IHhtbFdoaXRlc3BhY2VTZW5zaXRpdml0eTogXCJpZ25vcmVcIiB8IFwic3RyaWN0XCIgfSk7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgYSBDRFMgZmlsZSBpbnRvIGFuIEVETVggZmlsZS5cbiAqXG4gKiBAcGFyYW0gY2RzVXJsIFRoZSBwYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIENEUyBkZWZpbml0aW9uLiBUaGlzIGZpbGUgbXVzdCBkZWNsYXJlIHRoZSBuYW1lc3BhY2VcbiAqIHNhcC5mZS50ZXN0IGFuZCBhIHNlcnZpY2UgSmVzdFNlcnZpY2VcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoZSBFRE1YIG91dHB1dFxuICogQHBhcmFtIGVkbXhGaWxlTmFtZSBBbGxvd3MgeW91IHRvIG92ZXJyaWRlIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlZCBFRE1YIG1ldGFkYXRhIGZpbGVcbiAqIEByZXR1cm5zIFRoZSBwYXRoIG9mIHRoZSBnZW5lcmF0ZWQgRURNWFxuICovXG5leHBvcnQgY29uc3QgY29tcGlsZUNEUyA9IGZ1bmN0aW9uIChcblx0Y2RzVXJsOiBzdHJpbmcsXG5cdG9wdGlvbnM6IGNvbXBpbGVyLk9EYXRhT3B0aW9ucyA9IHt9LFxuXHRlZG14RmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGNkc1VybCkucmVwbGFjZShcIi5jZHNcIiwgXCIueG1sXCIpXG4pIHtcblx0Y29uc3QgY2RzU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGNkc1VybCwgXCJ1dGYtOFwiKTtcblx0Y29uc3QgZWRteENvbnRlbnQgPSBjZHMyZWRteChjZHNTdHJpbmcsIFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIiwgb3B0aW9ucyk7XG5cdGNvbnN0IGRpciA9IHBhdGgucmVzb2x2ZShjZHNVcmwsIFwiLi5cIiwgXCJnZW5cIik7XG5cblx0Y29uc3QgZWRteEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpciwgZWRteEZpbGVOYW1lKTtcblxuXHRmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuXHRmcy53cml0ZUZpbGVTeW5jKGVkbXhGaWxlUGF0aCwgZWRteENvbnRlbnQpO1xuXHRyZXR1cm4gZWRteEZpbGVQYXRoO1xufTtcblxuLyoqXG4gKiBDb21waWxlIENEUyB0byBFRE1YLlxuICpcbiAqIEBwYXJhbSBjZHMgVGhlIENEUyBtb2RlbC4gSXQgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIHNlcnZpY2UuXG4gKiBAcGFyYW0gc2VydmljZSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gYmUgY29tcGlsZWQuIERlZmF1bHRzIHRvIFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIi5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoZSBFRE1YIG91dHB1dFxuICogQHJldHVybnMgVGhlIGNvbXBpbGVkIHNlcnZpY2UgbW9kZWwgYXMgRURNWC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNkczJlZG14KGNkczogc3RyaW5nLCBzZXJ2aWNlID0gXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLCBvcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBcInNvdXJjZS5jZHNcIjogY2RzIH07XG5cblx0Ly8gYWxsb3cgdG8gaW5jbHVkZSBzdHVmZiBmcm9tIEBzYXAvY2RzL2NvbW1vblxuXHRpZiAoY2RzLmluY2x1ZGVzKFwiJ0BzYXAvY2RzL2NvbW1vbidcIikpIHtcblx0XHRzb3VyY2VzW1wiY29tbW9uLmNkc1wiXSA9IGZzLnJlYWRGaWxlU3luYyhyZXF1aXJlLnJlc29sdmUoXCJAc2FwL2Nkcy9jb21tb24uY2RzXCIpLCBcInV0Zi04XCIpO1xuXHR9XG5cblx0Y29uc3QgY3NuID0gY29tcGlsZXIuY29tcGlsZVNvdXJjZXMoc291cmNlcywge30pO1xuXG5cdGNvbnN0IGVkbXhPcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7XG5cdFx0b2RhdGFGb3JlaWduS2V5czogdHJ1ZSxcblx0XHRvZGF0YUZvcm1hdDogXCJzdHJ1Y3R1cmVkXCIsXG5cdFx0b2RhdGFDb250YWlubWVudDogZmFsc2UsXG5cdFx0Li4ub3B0aW9ucyxcblx0XHRzZXJ2aWNlOiBzZXJ2aWNlXG5cdH07XG5cblx0Y29uc3QgZWRteCA9IGNvbXBpbGVyLnRvLmVkbXgoY3NuLCBlZG14T3B0aW9ucyk7XG5cdGlmICghZWRteCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgQ29tcGlsYXRpb24gZmFpbGVkLiBIaW50OiBNYWtlIHN1cmUgdGhhdCB0aGUgQ0RTIG1vZGVsIGRlZmluZXMgc2VydmljZSAke3NlcnZpY2V9LmApO1xuXHR9XG5cdHJldHVybiBlZG14O1xufVxuXG5leHBvcnQgY29uc3QgZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSA9IGFzeW5jIGZ1bmN0aW9uIChvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IFByb21pc2U8YW55PiB7XG5cdGNvbnN0IG9TZXJ2aWNlQ29udGV4dCA9IHsgc2NvcGVPYmplY3Q6IHt9LCBzY29wZVR5cGU6IFwiXCIsIHNldHRpbmdzOiB7fSB9O1xuXHRyZXR1cm4gbmV3IFNpZGVFZmZlY3RzRmFjdG9yeSgpLmNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dCkudGhlbihmdW5jdGlvbiAob1NlcnZpY2VJbnN0YW5jZTogYW55KSB7XG5cdFx0Y29uc3Qgb0plc3RTaWRlRWZmZWN0c1NlcnZpY2UgPSBvU2VydmljZUluc3RhbmNlLmdldEludGVyZmFjZSgpO1xuXHRcdG9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlLmdldENvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzY29wZU9iamVjdDoge1xuXHRcdFx0XHRcdGdldE1vZGVsOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRnZXRNZXRhTW9kZWw6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb01ldGFNb2RlbDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fTtcblx0XHRyZXR1cm4gb0plc3RTaWRlRWZmZWN0c1NlcnZpY2U7XG5cdH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZha2VEaWFnbm9zdGljcyA9IGZ1bmN0aW9uICgpOiBJRGlhZ25vc3RpY3Mge1xuXHRjb25zdCBpc3N1ZXM6IGFueVtdID0gW107XG5cdHJldHVybiB7XG5cdFx0YWRkSXNzdWUoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRpc3N1ZXMucHVzaCh7XG5cdFx0XHRcdGlzc3VlQ2F0ZWdvcnksXG5cdFx0XHRcdGlzc3VlU2V2ZXJpdHksXG5cdFx0XHRcdGRldGFpbHNcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0Z2V0SXNzdWVzKCk6IGFueVtdIHtcblx0XHRcdHJldHVybiBpc3N1ZXM7XG5cdFx0fSxcblx0XHRjaGVja0lmSXNzdWVFeGlzdHMoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzLmZpbmQoKGlzc3VlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBpc3N1ZS5pc3N1ZUNhdGVnb3J5ID09PSBpc3N1ZUNhdGVnb3J5ICYmIGlzc3VlLmlzc3VlU2V2ZXJpdHkgPT09IGlzc3VlU2V2ZXJpdHkgJiYgaXNzdWUuZGV0YWlscyA9PT0gZGV0YWlscztcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yVGVzdCA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRtYW5pZmVzdFNldHRpbmdzOiBMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5ncyB8IE9iamVjdFBhZ2VNYW5pZmVzdFNldHRpbmdzXG4pIHtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVkVHlwZXMuZW50aXR5U2V0cy5maW5kKChlcykgPT4gZXMubmFtZSA9PT0gbWFuaWZlc3RTZXR0aW5ncy5lbnRpdHlTZXQpO1xuXHRjb25zdCBkYXRhTW9kZWxQYXRoID0gZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5KGVudGl0eVNldCBhcyBFbnRpdHlTZXQsIGNvbnZlcnRlZFR5cGVzLCBlbnRpdHlTZXQpO1xuXHRyZXR1cm4gbmV3IENvbnZlcnRlckNvbnRleHQoY29udmVydGVkVHlwZXMsIG1hbmlmZXN0U2V0dGluZ3MsIGdldEZha2VEaWFnbm9zdGljcygpLCBtZXJnZSwgZGF0YU1vZGVsUGF0aCk7XG59O1xuY29uc3QgbWV0YU1vZGVsQ2FjaGU6IGFueSA9IHt9O1xuZXhwb3J0IGNvbnN0IGdldE1ldGFNb2RlbCA9IGFzeW5jIGZ1bmN0aW9uIChzTWV0YWRhdGFVcmw6IHN0cmluZykge1xuXHRjb25zdCBvUmVxdWVzdG9yID0gX01ldGFkYXRhUmVxdWVzdG9yLmNyZWF0ZSh7fSwgXCI0LjBcIiwgdW5kZWZpbmVkLCB7fSk7XG5cdGlmICghbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBuZXcgKE9EYXRhTWV0YU1vZGVsIGFzIGFueSkob1JlcXVlc3Rvciwgc01ldGFkYXRhVXJsLCB1bmRlZmluZWQsIG51bGwpO1xuXHRcdGF3YWl0IG9NZXRhTW9kZWwuZmV0Y2hFbnRpdHlDb250YWluZXIoKTtcblx0XHRtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdID0gb01ldGFNb2RlbDtcblx0fVxuXG5cdHJldHVybiBtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZWRNZXRhZGF0YSxcblx0cHJvcGVydHk/OiBQcm9wZXJ0eSB8IEVudGl0eVNldCB8IEFueUFubm90YXRpb25cbik6IERhdGFNb2RlbE9iamVjdFBhdGgge1xuXHRjb25zdCB0YXJnZXRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoID0ge1xuXHRcdHN0YXJ0aW5nRW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IFtdLFxuXHRcdHRhcmdldE9iamVjdDogcHJvcGVydHksXG5cdFx0dGFyZ2V0RW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZTogZW50aXR5U2V0LmVudGl0eVR5cGUsXG5cdFx0Y29udmVydGVkVHlwZXM6IGNvbnZlcnRlZFR5cGVzXG5cdH07XG5cdHRhcmdldFBhdGguY29udGV4dExvY2F0aW9uID0gdGFyZ2V0UGF0aDtcblx0cmV0dXJuIHRhcmdldFBhdGg7XG59O1xuXG5leHBvcnQgY29uc3QgZXZhbHVhdGVCaW5kaW5nID0gZnVuY3Rpb24gKGJpbmRpbmdTdHJpbmc6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcblx0Y29uc3QgYmluZGluZ0VsZW1lbnQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoYmluZGluZ1N0cmluZyk7XG5cdHJldHVybiBiaW5kaW5nRWxlbWVudC5mb3JtYXR0ZXIuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbn07XG5cbnR5cGUgTW9kZWxDb250ZW50ID0ge1xuXHRbbmFtZTogc3RyaW5nXTogYW55O1xufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSBhIGJpbmRpbmcgYWdhaW5zdCBhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBiaW5kaW5nU3RyaW5nIFRoZSBiaW5kaW5nIHN0cmluZy5cbiAqIEBwYXJhbSBtb2RlbENvbnRlbnQgQ29udGVudCBvZiB0aGUgZGVmYXVsdCBtb2RlbCB0byB1c2UgZm9yIGV2YWx1YXRpb24uXG4gKiBAcGFyYW0gbmFtZWRNb2RlbHNDb250ZW50IENvbnRlbnRzIG9mIGFkZGl0aW9uYWwsIG5hbWVkIG1vZGVscyB0byB1c2UuXG4gKiBAcmV0dXJucyBUaGUgZXZhbHVhdGVkIGJpbmRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUJpbmRpbmdXaXRoTW9kZWwoXG5cdGJpbmRpbmdTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bW9kZWxDb250ZW50OiBNb2RlbENvbnRlbnQsXG5cdG5hbWVkTW9kZWxzQ29udGVudD86IHsgW21vZGVsTmFtZTogc3RyaW5nXTogTW9kZWxDb250ZW50IH1cbik6IHN0cmluZyB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRjb25zdCB0ZXh0ID0gbmV3IEludmlzaWJsZVRleHQoKTtcblx0dGV4dC5iaW5kUHJvcGVydHkoXCJ0ZXh0XCIsIGJpbmRpbmdFbGVtZW50KTtcblxuXHRjb25zdCBkZWZhdWx0TW9kZWwgPSBuZXcgSlNPTk1vZGVsKG1vZGVsQ29udGVudCk7XG5cdHRleHQuc2V0TW9kZWwoZGVmYXVsdE1vZGVsKTtcblx0dGV4dC5zZXRCaW5kaW5nQ29udGV4dChkZWZhdWx0TW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQpO1xuXG5cdGlmIChuYW1lZE1vZGVsc0NvbnRlbnQpIHtcblx0XHRmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhuYW1lZE1vZGVsc0NvbnRlbnQpKSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IG5ldyBKU09OTW9kZWwoY29udGVudCk7XG5cdFx0XHR0ZXh0LnNldE1vZGVsKG1vZGVsLCBuYW1lKTtcblx0XHRcdHRleHQuc2V0QmluZGluZ0NvbnRleHQobW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQsIG5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0ZXh0LmdldFRleHQoKTtcbn1cblxuY29uc3QgVEVTVFZJRVdJRCA9IFwidGVzdFZpZXdJZFwiO1xuXG5jb25zdCBhcHBseUZsZXhDaGFuZ2VzID0gYXN5bmMgZnVuY3Rpb24gKGZsZXhDaGFuZ2VzOiB7IFt4OiBzdHJpbmddOiBvYmplY3RbXSB9LCBvTWV0YU1vZGVsOiBNZXRhTW9kZWwsIHJlc3VsdFhNTDogYW55KSB7XG5cdC8vIHByZWZpeCBJZHNcblx0Wy4uLnJlc3VsdFhNTC5xdWVyeVNlbGVjdG9yQWxsKFwiW2lkXVwiKV0uZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdG5vZGUuaWQgPSBgJHtURVNUVklFV0lEfS0tJHtub2RlLmlkfWA7XG5cdH0pO1xuXHRjb25zdCBjaGFuZ2VzID0gY3JlYXRlRmxleGliaWxpdHlDaGFuZ2VzT2JqZWN0KFRFU1RWSUVXSUQsIGZsZXhDaGFuZ2VzKTtcblx0Y29uc3QgYXBwSWQgPSBcInNvbWVDb21wb25lbnRcIjtcblx0Y29uc3Qgb01hbmlmZXN0ID0ge1xuXHRcdFwic2FwLmFwcFwiOiB7XG5cdFx0XHRpZDogYXBwSWQsXG5cdFx0XHR0eXBlOiBcImFwcGxpY2F0aW9uXCIsXG5cdFx0XHRjcm9zc05hdmlnYXRpb246IHtcblx0XHRcdFx0b3V0Ym91bmRzOiBbXVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3Qgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50ID0ge1xuXHRcdGdldERpYWdub3N0aWNzOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKGdldEZha2VEaWFnbm9zdGljcygpKSxcblx0XHRnZXRNb2RlbDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7XG5cdFx0XHRnZXRNZXRhTW9kZWw6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUob01ldGFNb2RlbClcblx0XHR9KSxcblx0XHRnZXRDb21wb25lbnREYXRhOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHt9KSxcblx0XHRnZXRNYW5pZmVzdE9iamVjdDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7XG5cdFx0XHRnZXRFbnRyeTogZnVuY3Rpb24gKG5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRyZXR1cm4gKG9NYW5pZmVzdCBhcyBhbnkpW25hbWVdO1xuXHRcdFx0fVxuXHRcdH0pLFxuXHRcdGdldExvY2FsSWQ6IGplc3QuZm4oKHNJZCkgPT4gc0lkKVxuXHR9IGFzIHVua25vd24gYXMgQXBwQ29tcG9uZW50O1xuXHQvL2Zha2UgY2hhbmdlc1xuXHRqZXN0LnNweU9uKEFwcFN0b3JhZ2UsIFwibG9hZEZsZXhEYXRhXCIpLm1vY2tSZXR1cm5WYWx1ZShQcm9taXNlLnJlc29sdmUoY2hhbmdlcykpO1xuXHRqZXN0LnNweU9uKENvbXBvbmVudCwgXCJnZXRcIikubW9ja1JldHVyblZhbHVlKG9BcHBDb21wb25lbnQpO1xuXHRqZXN0LnNweU9uKFV0aWxzLCBcImdldEFwcENvbXBvbmVudEZvckNvbnRyb2xcIikubW9ja1JldHVyblZhbHVlKG9BcHBDb21wb25lbnQpO1xuXHRhd2FpdCBGbGV4U3RhdGUuaW5pdGlhbGl6ZSh7XG5cdFx0Y29tcG9uZW50SWQ6IGFwcElkXG5cdH0pO1xuXHRyZXN1bHRYTUwgPSBhd2FpdCBYbWxQcmVwcm9jZXNzb3IucHJvY2VzcyhyZXN1bHRYTUwsIHsgbmFtZTogXCJUZXN0IEZyYWdtZW50XCIsIGNvbXBvbmVudElkOiBhcHBJZCwgaWQ6IFRFU1RWSUVXSUQgfSk7XG5cblx0Ly9Bc3NlcnQgdGhhdCBhbGwgY2hhbmdlcyBoYXZlIGJlZW4gYXBwbGllZFxuXHRjb25zdCBjaGFuZ2VzQXBwbGllZCA9IGdldENoYW5nZXNGcm9tWE1MKHJlc3VsdFhNTCk7XG5cdGV4cGVjdChjaGFuZ2VzQXBwbGllZC5sZW5ndGgpLnRvQmUoZmxleENoYW5nZXM/LmNoYW5nZXM/Lmxlbmd0aCA/PyAwICsgZmxleENoYW5nZXM/LnZhcmlhbnREZXBlbmRlbnRDb250cm9sQ2hhbmdlcz8ubGVuZ3RoID8/IDApO1xuXHRyZXR1cm4gcmVzdWx0WE1MO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENoYW5nZXNGcm9tWE1MID0gKHhtbDogYW55KSA9PlxuXHRbLi4ueG1sLnF1ZXJ5U2VsZWN0b3JBbGwoXCIqXCIpXVxuXHRcdC5mbGF0TWFwKChlKSA9PiBbLi4uZS5hdHRyaWJ1dGVzXS5tYXAoKGEpID0+IGEubmFtZSkpXG5cdFx0LmZpbHRlcigoYXR0cikgPT4gYXR0ci5pbmNsdWRlcyhcInNhcC51aS5mbC5hcHBsaWVkQ2hhbmdlc1wiKSk7XG5cbmV4cG9ydCBjb25zdCBnZXRUZW1wbGF0aW5nUmVzdWx0ID0gYXN5bmMgZnVuY3Rpb24gKFxuXHR4bWxJbnB1dDogc3RyaW5nLFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogYW55OyBlbnRpdHlTZXQ/OiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZsZXhDaGFuZ2VzPzogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfVxuKSB7XG5cdGNvbnN0IHRlbXBsYXRlZFhtbCA9IGA8cm9vdD4ke3htbElucHV0fTwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXHRjb25zdCB4bWxEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRlbXBsYXRlZFhtbCwgXCJ0ZXh0L3htbFwiKTtcblx0Ly8gVG8gZW5zdXJlIG91ciBtYWNybyBjYW4gdXNlICNzZXRCaW5kaW5nQ29udGV4dCB3ZSBlbnN1cmUgdGhlcmUgaXMgYSBwcmUgZXhpc3RpbmcgSlNPTk1vZGVsIGZvciBjb252ZXJ0ZXJDb250ZXh0XG5cdC8vIGlmIG5vdCBhbHJlYWR5IHBhc3NlZCB0byB0ZWggdGVtcGxhdGluZ1xuXG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBhd2FpdCBnZXRNZXRhTW9kZWwoc01ldGFkYXRhVXJsKTtcblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzID0gYXdhaXQgX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3Moc01ldGFkYXRhVXJsLCBtQmluZGluZ0NvbnRleHRzLCBtTW9kZWxzKTtcblxuXHQvL1RoaXMgY29udGV4dCBmb3IgbWFjcm8gdGVzdGluZ1xuXHRpZiAob1ByZXByb2Nlc3NvclNldHRpbmdzLm1vZGVsc1tcInRoaXNcIl0pIHtcblx0XHRvUHJlcHJvY2Vzc29yU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW1widGhpc1wiXSA9IG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbXCJ0aGlzXCJdLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKTtcblx0fVxuXG5cdGxldCByZXN1bHRYTUwgPSAoYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoeG1sRG9jLmZpcnN0RWxlbWVudENoaWxkISwgeyBuYW1lOiBcIlRlc3QgRnJhZ21lbnRcIiB9LCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MpKSBhcyBhbnk7XG5cblx0aWYgKGZsZXhDaGFuZ2VzKSB7XG5cdFx0Ly8gYXBwbHkgZmxleCBjaGFuZ2VzXG5cdFx0cmVzdWx0WE1MID0gYXdhaXQgYXBwbHlGbGV4Q2hhbmdlcyhmbGV4Q2hhbmdlcywgb01ldGFNb2RlbCwgcmVzdWx0WE1MKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0WE1MO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRlZFhNTCA9IGFzeW5jIGZ1bmN0aW9uIChcblx0eG1sSW5wdXQ6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmxleENoYW5nZXM/OiB7IFt4OiBzdHJpbmddOiBvYmplY3RbXSB9XG4pIHtcblx0Y29uc3QgdGVtcGxhdGVkWE1MID0gYXdhaXQgZ2V0VGVtcGxhdGluZ1Jlc3VsdCh4bWxJbnB1dCwgc01ldGFkYXRhVXJsLCBtQmluZGluZ0NvbnRleHRzLCBtTW9kZWxzLCBmbGV4Q2hhbmdlcyk7XG5cdHJldHVybiBzZXJpYWxpemVYTUwodGVtcGxhdGVkWE1MKTtcbn07XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgcmVxdWVzdGVkIHZpZXcgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAcGFyYW0gbmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdmlldyB0byBiZSB0ZXN0ZWQuXG4gKiBAcGFyYW0gc01ldGFkYXRhVXJsIFVybCBvZiB0aGUgbWV0YWRhdGEuXG4gKiBAcGFyYW0gbUJpbmRpbmdDb250ZXh0cyBNYXAgb2YgdGhlIGJpbmRpbmdDb250ZXh0cyB0byBzZXQgb24gdGhlIG1vZGVscy5cbiAqIEBwYXJhbSBtTW9kZWxzIE1hcCBvZiB0aGUgbW9kZWxzLlxuICogQHBhcmFtIGZsZXhDaGFuZ2VzIE9iamVjdCB3aXRoIFVJIGNoYW5nZXMgbGlrZSAnY2hhbmdlcycgb3IgJ3ZhcmlhbnREZXBlbmRlbnRDb250cm9sQ2hhbmdlcydcbiAqIEByZXR1cm5zIFRlbXBsYXRlZCB2aWV3IGFzIHN0cmluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1ZpZXcoXG5cdG5hbWU6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmxleENoYW5nZXM/OiB7IFt4OiBzdHJpbmddOiBvYmplY3RbXSB9XG4pOiBQcm9taXNlPEplc3RUZW1wbGF0ZWRWaWV3PiB7XG5cdGNvbnN0IG9NZXRhTW9kZWwgPSBhd2FpdCBnZXRNZXRhTW9kZWwoc01ldGFkYXRhVXJsKTtcblx0Y29uc3Qgb1ZpZXdEb2N1bWVudCA9IF9sb2FkUmVzb3VyY2VWaWV3KG5hbWUpO1xuXHRjb25zdCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MgPSBhd2FpdCBfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyhzTWV0YWRhdGFVcmwsIG1CaW5kaW5nQ29udGV4dHMsIG1Nb2RlbHMpO1xuXHRsZXQgb1ByZXByb2Nlc3NlZFZpZXcgPSBhd2FpdCBYTUxQcmVwcm9jZXNzb3IucHJvY2VzcyhvVmlld0RvY3VtZW50LCB7IG5hbWU6IG5hbWUgfSwgb1ByZXByb2Nlc3NvclNldHRpbmdzKTtcblx0aWYgKGZsZXhDaGFuZ2VzKSB7XG5cdFx0b1ByZXByb2Nlc3NlZFZpZXcgPSBhd2FpdCBhcHBseUZsZXhDaGFuZ2VzKGZsZXhDaGFuZ2VzID8/IFtdLCBvTWV0YU1vZGVsLCBvUHJlcHJvY2Vzc2VkVmlldyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRhc0VsZW1lbnQ6IG9QcmVwcm9jZXNzZWRWaWV3LFxuXHRcdGFzU3RyaW5nOiBfcmVtb3ZlQ29tbWVudEZyb21YbWwob1ByZXByb2Nlc3NlZFZpZXc/Lm91dGVySFRNTCB8fCBcIlwiKVxuXHR9O1xufVxuXG4vKipcbiAqIFByb2Nlc3MgdGhlIHJlcXVlc3RlZCBYTUwgZnJhZ21lbnQgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAcGFyYW0gbmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHRlc3REYXRhIFRlc3QgZGF0YSBjb25zaXN0aW5nXG4gKiBAcmV0dXJucyBUZW1wbGF0ZWQgZnJhZ21lbnQgYXMgc3RyaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJhZ21lbnQobmFtZTogc3RyaW5nLCB0ZXN0RGF0YTogeyBbbW9kZWw6IHN0cmluZ106IG9iamVjdCB9KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0Y29uc3QgaW5wdXRYbWwgPSBgPHJvb3Q+PGNvcmU6RnJhZ21lbnQgZnJhZ21lbnROYW1lPVwiJHtuYW1lfVwiIHR5cGU9XCJYTUxcIiB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIiAvPjwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXHRjb25zdCBpbnB1dERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaW5wdXRYbWwsIFwidGV4dC94bWxcIik7XG5cblx0Ly8gYnVpbGQgbW9kZWwgYW5kIGJpbmRpbmdzIGZvciBnaXZlbiB0ZXN0IGRhdGFcblx0Y29uc3Qgc2V0dGluZ3MgPSB7XG5cdFx0bW9kZWxzOiB7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBKU09OTW9kZWwgfSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9IGFzIHsgW25hbWU6IHN0cmluZ106IG9iamVjdCB9XG5cdH07XG5cdGZvciAoY29uc3QgbW9kZWwgaW4gdGVzdERhdGEpIHtcblx0XHRjb25zdCBqc29uTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0anNvbk1vZGVsLnNldERhdGEodGVzdERhdGFbbW9kZWxdKTtcblx0XHRzZXR0aW5ncy5tb2RlbHNbbW9kZWxdID0ganNvbk1vZGVsO1xuXHRcdHNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1ttb2RlbF0gPSBzZXR0aW5ncy5tb2RlbHNbbW9kZWxdLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSBhcyBDb250ZXh0O1xuXHR9XG5cblx0Ly8gZXhlY3V0ZSB0aGUgcHJlLXByb2Nlc3NvclxuXHRjb25zdCByZXN1bHREb2MgPSBhd2FpdCBYTUxQcmVwcm9jZXNzb3IucHJvY2VzcyhpbnB1dERvYy5maXJzdEVsZW1lbnRDaGlsZCwgeyBuYW1lIH0sIHNldHRpbmdzKTtcblxuXHQvLyBleGNsdWRlIG5lc3RlZCBmcmFnbWVudHMgZnJvbSB0ZXN0IHNuYXBzaG90c1xuXHRjb25zdCBmcmFnbWVudHMgPSByZXN1bHREb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjb3JlOkZyYWdtZW50XCIpIGFzIGFueTtcblx0aWYgKGZyYWdtZW50cz8ubGVuZ3RoID4gMCkge1xuXHRcdGZvciAoY29uc3QgZnJhZ21lbnQgb2YgZnJhZ21lbnRzKSB7XG5cdFx0XHRmcmFnbWVudC5pbm5lckhUTUwgPSBcIlwiO1xuXHRcdH1cblx0fVxuXG5cdC8vIEtlZXAgdGhlIGZyYWdtZW50IHJlc3VsdCBhcyBjaGlsZCBvZiByb290IG5vZGUgd2hlbiBmcmFnbWVudCBnZW5lcmF0ZXMgbXVsdGlwbGUgcm9vdCBjb250cm9sc1xuXHRjb25zdCB4bWxSZXN1bHQgPSByZXN1bHREb2MuY2hpbGRyZW4ubGVuZ3RoID4gMSA/IHJlc3VsdERvYy5vdXRlckhUTUwgOiByZXN1bHREb2MuaW5uZXJIVE1MO1xuXG5cdHJldHVybiBfcmVtb3ZlQ29tbWVudEZyb21YbWwoeG1sUmVzdWx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUNvbnRyb2woY29udHJvbFRvU2VyaWFsaXplOiBDb250cm9sIHwgQ29udHJvbFtdKSB7XG5cdGxldCB0YWJDb3VudCA9IDA7XG5cdGZ1bmN0aW9uIGdldFRhYih0b0FkZDogbnVtYmVyID0gMCkge1xuXHRcdGxldCB0YWIgPSBcIlwiO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGFiQ291bnQgKyB0b0FkZDsgaSsrKSB7XG5cdFx0XHR0YWIgKz0gXCJcXHRcIjtcblx0XHR9XG5cdFx0cmV0dXJuIHRhYjtcblx0fVxuXHRjb25zdCBzZXJpYWxpemVEZWxlZ2F0ZSA9IHtcblx0XHRzdGFydDogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSwgc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRsZXQgY29udHJvbERldGFpbCA9IFwiXCI7XG5cdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZSkge1xuXHRcdFx0XHRpZiAoY29udHJvbC5nZXRQYXJlbnQoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGluZGV4SW5QYXJlbnQgPSAoY29udHJvbC5nZXRQYXJlbnQoKS5nZXRBZ2dyZWdhdGlvbihzQWdncmVnYXRpb25OYW1lKSBhcyBNYW5hZ2VkT2JqZWN0W10pPy5pbmRleE9mPy4oY29udHJvbCk7XG5cdFx0XHRcdFx0aWYgKGluZGV4SW5QYXJlbnQgPiAwKSB7XG5cdFx0XHRcdFx0XHRjb250cm9sRGV0YWlsICs9IGAsXFxuJHtnZXRUYWIoKX1gO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29udHJvbERldGFpbCArPSBgJHtjb250cm9sLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpfShgO1xuXHRcdFx0cmV0dXJuIGNvbnRyb2xEZXRhaWw7XG5cdFx0fSxcblx0XHRlbmQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBcIn0pXCI7XG5cdFx0fSxcblx0XHRtaWRkbGU6IGZ1bmN0aW9uIChjb250cm9sOiBhbnkpIHtcblx0XHRcdGNvbnN0IGlkID0gY29udHJvbC5nZXRJZCgpO1xuXHRcdFx0bGV0IGRhdGEgPSBge2lkOiAke01hbmFnZWRPYmplY3RNZXRhZGF0YS5pc0dlbmVyYXRlZElkKGlkKSA/IFwiX19keW5hbWljSWRcIiA6IGlkfWA7XG5cdFx0XHRmb3IgKGNvbnN0IG9Db250cm9sS2V5IGluIGNvbnRyb2wubVByb3BlcnRpZXMpIHtcblx0XHRcdFx0aWYgKGNvbnRyb2wubVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9ICR7b0NvbnRyb2xLZXl9OiAke2NvbnRyb2wubVByb3BlcnRpZXNbb0NvbnRyb2xLZXldfWA7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY29udHJvbC5tQmluZGluZ0luZm9zLmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdEZXRhaWwgPSBjb250cm9sLm1CaW5kaW5nSW5mb3Nbb0NvbnRyb2xLZXldO1xuXHRcdFx0XHRcdGRhdGEgKz0gYCxcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fTogJHtKU09OLnN0cmluZ2lmeShiaW5kaW5nRGV0YWlsKX1gO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGNvbnN0IG9Db250cm9sS2V5IGluIGNvbnRyb2wubUFzc29jaWF0aW9ucykge1xuXHRcdFx0XHRpZiAoY29udHJvbC5tQXNzb2NpYXRpb25zLmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGRhdGEgKz0gYCxcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fTogJHtcblx0XHRcdFx0XHRcdChjb250cm9sLm1Bc3NvY2lhdGlvbnNbb0NvbnRyb2xLZXldPy5qb2luPy4oXCIsXCIpID8/IGNvbnRyb2wubUFzc29jaWF0aW9uc1tvQ29udHJvbEtleV0pIHx8IHVuZGVmaW5lZFxuXHRcdFx0XHRcdH1gO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGNvbnN0IG9Db250cm9sS2V5IGluIGNvbnRyb2wubUV2ZW50UmVnaXN0cnkpIHtcblx0XHRcdFx0aWYgKGNvbnRyb2wubUV2ZW50UmVnaXN0cnkuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9ICR7b0NvbnRyb2xLZXl9OiB0cnVlfWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGRhdGEgKz0gYGA7XG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9LFxuXHRcdHN0YXJ0QWdncmVnYXRpb246IGZ1bmN0aW9uIChjb250cm9sOiBhbnksIHNOYW1lOiBzdHJpbmcpIHtcblx0XHRcdGxldCBvdXQgPSBgLFxcbiR7Z2V0VGFiKCl9JHtzTmFtZX1gO1xuXHRcdFx0dGFiQ291bnQrKztcblxuXHRcdFx0aWYgKGNvbnRyb2wubUJpbmRpbmdJbmZvc1tzTmFtZV0pIHtcblx0XHRcdFx0b3V0ICs9IGA9eyBwYXRoOicke2NvbnRyb2wubUJpbmRpbmdJbmZvc1tzTmFtZV0ucGF0aH0nLCB0ZW1wbGF0ZTpcXG4ke2dldFRhYigpfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvdXQgKz0gYD1bXFxuJHtnZXRUYWIoKX1gO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG91dDtcblx0XHR9LFxuXHRcdGVuZEFnZ3JlZ2F0aW9uOiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzTmFtZTogc3RyaW5nKSB7XG5cdFx0XHR0YWJDb3VudC0tO1xuXHRcdFx0aWYgKGNvbnRyb2wubUJpbmRpbmdJbmZvc1tzTmFtZV0pIHtcblx0XHRcdFx0cmV0dXJuIGBcXG4ke2dldFRhYigpfX1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGBcXG4ke2dldFRhYigpfV1gO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKEFycmF5LmlzQXJyYXkoY29udHJvbFRvU2VyaWFsaXplKSkge1xuXHRcdHJldHVybiBjb250cm9sVG9TZXJpYWxpemUubWFwKChjb250cm9sVG9SZW5kZXI6IENvbnRyb2wpID0+IHtcblx0XHRcdHJldHVybiBuZXcgU2VyaWFsaXplcihjb250cm9sVG9SZW5kZXIsIHNlcmlhbGl6ZURlbGVnYXRlKS5zZXJpYWxpemUoKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbmV3IFNlcmlhbGl6ZXIoY29udHJvbFRvU2VyaWFsaXplLCBzZXJpYWxpemVEZWxlZ2F0ZSkuc2VyaWFsaXplKCk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF3YWl0ZXIoKSB7XG5cdGxldCBmblJlc29sdmUhOiBGdW5jdGlvbjtcblx0Y29uc3QgbXlQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRmblJlc29sdmUgPSByZXNvbHZlO1xuXHR9KTtcblx0cmV0dXJuIHsgcHJvbWlzZTogbXlQcm9taXNlLCByZXNvbHZlOiBmblJlc29sdmUgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7RUF1REE7RUFDQSxNQUFNQSxTQUFTLEdBQUdDLE9BQU8sQ0FBQyxlQUFlLENBQUM7RUFFMUNDLEdBQUcsQ0FBQ0MsUUFBUSxDQUFDLENBQUMsRUFBUyxrQ0FBa0MsQ0FBQztFQUMxREMsSUFBSSxDQUFDQyxVQUFVLENBQUMsS0FBSyxDQUFDO0VBRXRCLE1BQU1DLFlBQVksR0FBRztJQUNwQkMsTUFBTSxFQUFFLGVBQWU7SUFDdkJDLEtBQUssRUFBRSxlQUFlO0lBQ3RCQyxVQUFVLEVBQUUscUJBQXFCO0lBQ2pDQyxTQUFTLEVBQUUsa0VBQWtFO0lBQzdFQyxHQUFHLEVBQUUsa0VBQWtFO0lBQ3ZFQyxRQUFRLEVBQUUsMEVBQTBFO0lBQ3BGQyxPQUFPLEVBQUUsc0JBQXNCO0lBQy9CQyxJQUFJLEVBQUUsYUFBYTtJQUNuQkMsRUFBRSxFQUFFLFdBQVc7SUFDZkMsQ0FBQyxFQUFFLE9BQU87SUFDVkMsQ0FBQyxFQUFFLG9CQUFvQjtJQUN2QkMsRUFBRSxFQUFFLFdBQVc7SUFDZkMsYUFBYSxFQUFFLHdCQUF3QjtJQUN2Q0MsR0FBRyxFQUFFLFlBQVk7SUFDakJDLEtBQUssRUFBRSwwQkFBMEI7SUFDakNDLFFBQVEsRUFBRSxrQkFBa0I7SUFDNUJDLFFBQVEsRUFBRSxrQkFBa0I7SUFDNUJDLENBQUMsRUFBRSxnQkFBZ0I7SUFDbkJDLGVBQWUsRUFBRSwwQkFBMEI7SUFDM0NDLFVBQVUsRUFBRSx5QkFBeUI7SUFDckNDLFVBQVUsRUFBRTtFQUNiLENBQUM7RUFDRCxNQUFNQyxNQUFNLEdBQUdDLEtBQUssQ0FBQ0MsYUFBYSxDQUFDeEIsWUFBWSxDQUFDO0VBRWhELFNBQVN5QixxQkFBcUIsQ0FBQ0MsTUFBWSxFQUFFQyxRQUFnQixFQUFVO0lBQ3RFO0FBQ0Q7QUFDQTtBQUNBO0lBQ0MsTUFBTUMsUUFBUSxH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