@sapui5/sap.fe.test 1.120.4 → 1.121.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.
@@ -9,11 +9,12 @@ import LoaderExtensions from "sap/base/util/LoaderExtensions";
9
9
  import merge from "sap/base/util/merge";
10
10
  import AppComponent from "sap/fe/core/AppComponent";
11
11
  import TemplateModel from "sap/fe/core/TemplateModel";
12
- import { parseXMLString } from "sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor";
12
+ import { parseXMLString } from "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor";
13
13
  import ConverterContext from "sap/fe/core/converters/ConverterContext";
14
14
  import type { ListReportManifestSettings, ObjectPageManifestSettings } from "sap/fe/core/converters/ManifestSettings";
15
15
  import type { IDiagnostics } from "sap/fe/core/converters/TemplateConverter";
16
16
  import type { IssueCategory, IssueSeverity } from "sap/fe/core/converters/helpers/IssueManager";
17
+ import jsx from "sap/fe/core/jsx-runtime/jsx";
17
18
  import type { SideEffectsService } from "sap/fe/core/services/SideEffectsServiceFactory";
18
19
  import SideEffectsFactory from "sap/fe/core/services/SideEffectsServiceFactory";
19
20
  import type { DataModelObjectPath } from "sap/fe/core/templating/DataModelPathHelper";
@@ -64,13 +65,13 @@ type JestTemplatedView = {
64
65
  Log.setLevel(1 as any, "sap.ui.core.util.XMLPreprocessor");
65
66
  jest.setTimeout(40000);
66
67
 
67
- const nameSpaceMap = {
68
- macros: "sap.fe.macros",
68
+ const nameSpaceMap: Record<string, string> = {
69
69
  macro: "sap.fe.macros",
70
+ macros: "sap.fe.macros",
71
+ feBB: "sap.fe.core.buildingBlocks.templating",
70
72
  macroField: "sap.fe.macros.field",
71
73
  macrodata: "http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1",
72
74
  log: "http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1",
73
- unittest: "http://schemas.sap.com/sapui5/preprocessorextension/sap.fe.unittesting/1",
74
75
  control: "sap.fe.core.controls",
75
76
  controls: "sap.fe.macros.controls",
76
77
  core: "sap.ui.core",
@@ -88,6 +89,10 @@ const nameSpaceMap = {
88
89
  microChart: "sap.suite.ui.microchart",
89
90
  macroTable: "sap.fe.macros.table"
90
91
  };
92
+ const reveseNamespaceMap = Object.keys(nameSpaceMap).reduce((reverseMap: Record<string, string>, currentName) => {
93
+ reverseMap[nameSpaceMap[currentName]] = currentName;
94
+ return reverseMap;
95
+ }, {});
91
96
  const select = xpath.useNamespaces(nameSpaceMap);
92
97
 
93
98
  const defaultFakeSideEffectService = { computeFieldGroupIds: () => [] };
@@ -180,7 +185,7 @@ expect.extend({
180
185
  * an XML node.
181
186
  *
182
187
  * This function checkes for the xml errors created by the
183
- * function [BuildingBlockTemplateProcessor.createErrorXML]{@link sap.fe.core.buildingBlocks.BuildingBlockTemplateProcessor#createErrorXML}.
188
+ * function [BuildingBlockTemplateProcessor.createErrorXML]{@link sap.fe.core.buildingBlocks.templating.BuildingBlockTemplateProcessor#createErrorXML}.
184
189
  *
185
190
  * @param xml XML String or XML Node to be tested for errors
186
191
  * @returns Jest Matcher result object
@@ -270,8 +275,21 @@ export const formatXML = function (xmlString: string): string {
270
275
 
271
276
  function appendAttributes() {
272
277
  if (attributes.length > 0) {
273
- // attributes = attributes.sort((a, b) => a.name.localeCompare(b.name));
274
- attributes = attributes.reverse();
278
+ attributes = attributes.sort((a, b) => {
279
+ if (a.name.startsWith("xmlns") && !b.name.startsWith("xmlns")) {
280
+ return -1;
281
+ } else if (!a.name.startsWith("xmlns") && b.name.startsWith("xmlns")) {
282
+ return 1;
283
+ } else if (a.name.startsWith("xmlns") && b.name.startsWith("xmlns")) {
284
+ return a.name.localeCompare(b.name);
285
+ } else if (a.name.includes(":") && !b.name.includes(":")) {
286
+ return -1;
287
+ } else if (!a.name.includes(":") && b.name.includes(":")) {
288
+ return 1;
289
+ } else {
290
+ return a.name.localeCompare(b.name);
291
+ }
292
+ });
275
293
 
276
294
  level++;
277
295
  for (const attribute of attributes) {
@@ -400,7 +418,8 @@ export const getFakeSideEffectsService = async function (
400
418
  isA: () => classNameODataModel === "sap.ui.model.odata.v4.ODataModel",
401
419
  getMetaModel: () => {
402
420
  return metaModel;
403
- }
421
+ },
422
+ getServiceUrl: () => undefined
404
423
  };
405
424
  },
406
425
  getService: () => {
@@ -547,7 +566,6 @@ const applyFlexChanges = async function (flexChanges: { [x: string]: object[] },
547
566
  jest.spyOn(AppStorage, "loadFlexData").mockReturnValue(Promise.resolve(changes));
548
567
  jest.spyOn(Loader, "loadFlexData").mockReturnValue(Promise.resolve(changes));
549
568
 
550
- jest.spyOn(Component, "get").mockReturnValue(oAppComponent);
551
569
  jest.spyOn(Component as unknown as { getComponentById: () => AppComponent }, "getComponentById").mockReturnValue(oAppComponent);
552
570
  jest.spyOn(Utils, "getAppComponentForControl").mockReturnValue(oAppComponent);
553
571
  await FlexState.initialize({
@@ -608,11 +626,20 @@ export const getTemplatedXML = async function (
608
626
  mModels: { [x: string]: any },
609
627
  flexChanges?: { [x: string]: object[] },
610
628
  fakeSideEffectService?: unknown
611
- ) {
612
- const templatedXML = await getTemplatingResult(xmlInput, sMetadataUrl, mBindingContexts, mModels, flexChanges, fakeSideEffectService);
613
- const serialiedXML = serializeXML(templatedXML);
614
- expect(serialiedXML).not.toHaveTemplatingErrors();
615
- return serialiedXML;
629
+ ): Promise<string> {
630
+ return jsx.defineXMLNamespaceMap(reveseNamespaceMap, async () => {
631
+ const templatedXML = await getTemplatingResult(
632
+ xmlInput,
633
+ sMetadataUrl,
634
+ mBindingContexts,
635
+ mModels,
636
+ flexChanges,
637
+ fakeSideEffectService
638
+ );
639
+ const serialiedXML = serializeXML(templatedXML, undefined);
640
+ expect(serialiedXML).not.toHaveTemplatingErrors();
641
+ return serialiedXML;
642
+ }) as unknown as Promise<string>;
616
643
  };
617
644
 
618
645
  /**
@@ -688,7 +715,7 @@ export async function processFragment(name: string, testData: { [model: string]:
688
715
  return formatXML(xmlResult);
689
716
  }
690
717
 
691
- export function serializeControl(controlToSerialize: UI5Element | UI5Element[]) {
718
+ export function serializeControl(controlToSerialize?: UI5Element | UI5Element[]) {
692
719
  let tabCount = 0;
693
720
  function getTab(toAdd: number = 0) {
694
721
  let tab = "";
@@ -20,7 +20,8 @@ sap.ui.define(
20
20
  "sap/fe/test/api/HeaderActionsLR",
21
21
  "sap/fe/test/api/HeaderAssertionsLR",
22
22
  "sap/fe/test/api/KPICardAssertions",
23
- "sap/fe/test/api/KPICardActions"
23
+ "sap/fe/test/api/KPICardActions",
24
+ "sap/ui/core/Lib"
24
25
  ],
25
26
  function (
26
27
  Utils,
@@ -37,7 +38,8 @@ sap.ui.define(
37
38
  HeaderActionsLR,
38
39
  HeaderAssertionsLR,
39
40
  KPICardAssertions,
40
- KPICardActions
41
+ KPICardActions,
42
+ Lib
41
43
  ) {
42
44
  "use strict";
43
45
 
@@ -83,7 +85,7 @@ sap.ui.define(
83
85
  SingleChartId = "fe::Chart::" + sEntityPath + "::Chart",
84
86
  FilterBarId = "fe::FilterBar::" + sEntityPath,
85
87
  FilterBarVHDId = FilterBarId + "::FilterFieldValueHelp::",
86
- oResourceBundleCore = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
88
+ oResourceBundleCore = Lib.getResourceBundleFor("sap.fe.core"),
87
89
  IconTabBarId = "fe::TabMultipleMode",
88
90
  PageId = "fe::ListReport",
89
91
  aAdditionalPageDefinitions = Array.isArray(arguments[1]) ? arguments[1] : Array.prototype.slice.call(arguments, 1);
@@ -19,7 +19,8 @@ sap.ui.define(
19
19
  "sap/fe/test/api/HeaderActions",
20
20
  "sap/fe/test/api/HeaderAssertions",
21
21
  "sap/fe/test/api/FormActions",
22
- "sap/fe/test/api/FormAssertions"
22
+ "sap/fe/test/api/FormAssertions",
23
+ "sap/ui/core/Lib"
23
24
  ],
24
25
  function (
25
26
  mergeObjects,
@@ -35,7 +36,8 @@ sap.ui.define(
35
36
  HeaderActions,
36
37
  HeaderAssertions,
37
38
  FormActions,
38
- FormAssertions
39
+ FormAssertions,
40
+ Lib
39
41
  ) {
40
42
  "use strict";
41
43
 
@@ -187,7 +189,7 @@ sap.ui.define(
187
189
  DISPLAY: "Display",
188
190
  EDITABLE: "Editable"
189
191
  },
190
- oResourceBundleCore = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
192
+ oResourceBundleCore = Lib.getResourceBundleFor("sap.fe.core"),
191
193
  aAdditionalPages = Array.prototype.slice.call(arguments, 1);
192
194
 
193
195
  return TemplatePage.apply(
@@ -639,7 +641,6 @@ sap.ui.define(
639
641
  .description("Messagebutton is visible with " + message[messageType]["type"] + " button type")
640
642
  .execute();
641
643
  },
642
-
643
644
  iSeeLinkWithText: function (sText) {
644
645
  return OpaBuilder.create(this)
645
646
  .hasType("sap.m.Link")
@@ -10,9 +10,10 @@ sap.ui.define(
10
10
  "sap/ui/core/util/XMLPreprocessor",
11
11
  "sap/ui/core/XMLTemplateProcessor",
12
12
  "sap/fe/macros/macroLibrary",
13
- "sap/fe/core/TemplateModel"
13
+ "sap/fe/core/TemplateModel",
14
+ "sap/ui/base/Object"
14
15
  ],
15
- function (ODataMetaModel, XMLPreprocessor, XMLTemplateProcessor, macroLibrary, TemplateModel) {
16
+ function (ODataMetaModel, XMLPreprocessor, XMLTemplateProcessor, macroLibrary, TemplateModel, BaseObject) {
16
17
  "use strict";
17
18
  /**
18
19
  * Unit Test parts of XML fragments for mocked metadata against expected results.
@@ -78,7 +79,10 @@ sap.ui.define(
78
79
  //Inject models and bindingContexts
79
80
  Object.keys(mBindingContexts).forEach(function (sKey) {
80
81
  var oModel = mModels[sKey] || oMetaModel;
81
- if (!(oModel instanceof sap.ui.model.Model) && !(oModel instanceof sap.ui.model.odata.v4.ODataMetaModel)) {
82
+ if (
83
+ !BaseObject.isObjectA(oModel, "sap.ui.model.Model") &&
84
+ !BaseObject.isObjectA(oModel, "sap.ui.model.odata.v4.ODataMetaModel")
85
+ ) {
82
86
  oModel = new TemplateModel(oModel, oMetaModel);
83
87
  }
84
88
  /* Assert to make sure the annotations are in the test metadata -> avoid misleading tests */
@@ -1,8 +1,8 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2023 SAP SE. All rights reserved
3
+ * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent", "sap/fe/core/controllerextensions/EditFlow", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/Recommendations", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/SideEffects", "sap/fe/core/ResourceModel", "sap/ui/base/Event", "sap/ui/core/mvc/Controller", "sap/ui/core/mvc/View", "sap/ui/model/CompositeBinding", "sap/ui/model/odata/v4/Context", "sap/ui/model/odata/v4/ODataContextBinding", "sap/ui/model/odata/v4/ODataListBinding", "sap/ui/model/odata/v4/ODataMetaModel", "sap/ui/model/odata/v4/ODataModel", "sap/ui/model/odata/v4/ODataPropertyBinding"], function (generic, AppComponent, EditFlow, InternalRouting, Recommendations, Share, SideEffects, ResourceModel, Event, Controller, View, CompositeBinding, Context, ODataContextBinding, ODataListBinding, ODataMetaModel, ODataModel, ODataPropertyBinding) {
5
+ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent", "sap/fe/core/ResourceModel", "sap/fe/core/controllerextensions/CollaborativeDraft", "sap/fe/core/controllerextensions/EditFlow", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/Recommendations", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/SideEffects", "sap/ui/base/Event", "sap/ui/core/mvc/Controller", "sap/ui/core/mvc/View", "sap/ui/model/CompositeBinding", "sap/ui/model/odata/v4/Context", "sap/ui/model/odata/v4/ODataContextBinding", "sap/ui/model/odata/v4/ODataListBinding", "sap/ui/model/odata/v4/ODataMetaModel", "sap/ui/model/odata/v4/ODataModel", "sap/ui/model/odata/v4/ODataPropertyBinding"], function (generic, AppComponent, ResourceModel, CollaborativeDraft, EditFlow, InternalRouting, Recommendations, Share, SideEffects, Event, Controller, View, CompositeBinding, Context, ODataContextBinding, ODataListBinding, ODataMetaModel, ODataModel, ODataPropertyBinding) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -37,7 +37,7 @@ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent",
37
37
  return Promise.resolve(mocked._contextData[keyOrKeys]);
38
38
  });
39
39
  mocked.mock.requestObject.mockImplementation(key => {
40
- return Promise.resolve(mocked._contextData[key]);
40
+ return key ? Promise.resolve(mocked._contextData[key]) : mocked._contextData;
41
41
  });
42
42
  mocked.mock.setProperty.mockImplementation((key, value) => {
43
43
  mocked._contextData[key] = value;
@@ -83,9 +83,12 @@ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent",
83
83
  * @param params The parameters of the event
84
84
  * @returns A new MockEvent
85
85
  */
86
- function createMockEvent(params) {
86
+ function createMockEvent(params, source) {
87
87
  const mocked = mock(Event);
88
88
  mocked._params = params || {};
89
+ if (source) {
90
+ mocked.mock.getSource.mockReturnValue(source);
91
+ }
89
92
 
90
93
  // Default behavior
91
94
  mocked.mock.getParameter.mockImplementation(name => mocked._params[name]);
@@ -298,6 +301,9 @@ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent",
298
301
  const metamodel = new ODataMetaModel();
299
302
  return sPath ? metamodel.getMetaPath(sPath) : sPath;
300
303
  });
304
+ mocked.mock.isA.mockImplementation(sClassName => {
305
+ return sClassName === "sap.ui.model.odata.v4.ODataMetaModel";
306
+ });
301
307
  return mocked;
302
308
  }
303
309
  /**
@@ -319,6 +325,7 @@ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent",
319
325
  */
320
326
  function createMockModel(oMockListBinding, oMockContextBinding) {
321
327
  const mocked = mock(ODataModel);
328
+ mocked.fnOptimisticBatchEnabler = null;
322
329
  mocked.mockListBinding = oMockListBinding;
323
330
  mocked.mockContextBinding = oMockContextBinding;
324
331
  if (oMockListBinding) {
@@ -343,6 +350,9 @@ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent",
343
350
  mocked.mock.getMetaModel.mockImplementation(() => {
344
351
  return mocked.oMetaModel;
345
352
  });
353
+ mocked.mock.isA.mockImplementation(sClassName => {
354
+ return sClassName === "sap.ui.model.odata.v4.ODataModel";
355
+ });
346
356
  return mocked;
347
357
  }
348
358
  /**
@@ -410,6 +420,7 @@ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent",
410
420
  mocked._sideEffects = mock(SideEffects);
411
421
  mocked.editFlow = mock(EditFlow);
412
422
  mocked.share = mock(Share);
423
+ mocked.collaborativeDraft = mock(CollaborativeDraft);
413
424
  mocked.recommendations = mock(Recommendations);
414
425
  mocked.getAppComponent = jest.fn().mockReturnValue(mock(AppComponent));
415
426
  // Default Behavior
@@ -482,4 +493,4 @@ sap.ui.define(["@sap-ux/jest-mock-ui5/dist/generic", "sap/fe/core/AppComponent",
482
493
  _exports.createMockResourceModel = createMockResourceModel;
483
494
  return _exports;
484
495
  }, false);
485
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVNb2NrQ29udGV4dCIsIm9Db250ZXh0RGF0YSIsIm9CaW5kaW5nIiwiaXNJbmFjdGl2ZSIsIm1vY2tlZCIsIm1vY2siLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIkNvbnRleHQiLCJjcmVhdGVOZXdDb250ZXh0IiwiX2lzS2VwdEFsaXZlIiwiX2NvbnRleHREYXRhIiwiX29CaW5kaW5nIiwiX2lzSW5hY3RpdmUiLCJpc0EiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJzQ2xhc3NOYW1lIiwiZ2V0UHJvcGVydHkiLCJrZXkiLCJyZXF1ZXN0UHJvcGVydHkiLCJrZXlPcktleXMiLCJBcnJheSIsImlzQXJyYXkiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm1hcCIsInJlcXVlc3RPYmplY3QiLCJzZXRQcm9wZXJ0eSIsInZhbHVlIiwiZ2V0T2JqZWN0IiwicGF0aCIsInJlc3VsdCIsImluZGV4T2YiLCJwYXJ0cyIsInNwbGl0IiwicmVkdWNlIiwic3VtIiwicGFydCIsImdldFBhdGgiLCJnZXRCaW5kaW5nIiwiZ2V0TW9kZWwiLCJzZXRLZWVwQWxpdmUiLCJib29sIiwiX2ZuT25CZWZvcmVEZXN0cm95IiwiX2JSZXF1ZXN0TWVzc2FnZXMiLCJpc0tlZXBBbGl2ZSIsIk1vY2tDb250ZXh0IiwiY3JlYXRlTW9ja0V2ZW50IiwicGFyYW1zIiwiRXZlbnQiLCJfcGFyYW1zIiwiZ2V0UGFyYW1ldGVyIiwibmFtZSIsImdldFBhcmFtZXRlcnMiLCJNb2NrRXZlbnQiLCJjcmVhdGVNb2NrTGlzdEJpbmRpbmciLCJhQ29udGV4dERhdGEiLCJvTW9ja01vZGVsIiwiT0RhdGFMaXN0QmluZGluZyIsIl9hTW9ja0NvbnRleHRzIiwiY29udGV4dERhdGEiLCJfbW9ja01vZGVsIiwic2V0TW9kZWwiLCJtb2RlbCIsInJlcXVlc3RDb250ZXh0cyIsImdldEN1cnJlbnRDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImdldENvbnRleHRzIiwiZ2V0VXBkYXRlR3JvdXBJZCIsIm1vY2tSZXR1cm5WYWx1ZSIsIk1vY2tMaXN0QmluZGluZyIsImNyZWF0ZU1vY2tQcm9wZXJ0eUJpbmRpbmciLCJPRGF0YVByb3BlcnR5QmluZGluZyIsIl92YWx1ZSIsIl9wYXRoIiwiZ2V0VmFsdWUiLCJNb2NrUHJvcGVydHlCaW5kaW5nIiwiY3JlYXRlTW9ja0NvbXBvc2l0ZUJpbmRpbmciLCJhQmluZGluZ3MiLCJDb21wb3NpdGVCaW5kaW5nIiwiX2FCaW5kaW5ncyIsImdldEJpbmRpbmdzIiwiYmluZGluZyIsIk1vY2tDb21wb3NpdGVCaW5kaW5nIiwiY3JlYXRlTW9ja0NvbnRleHRCaW5kaW5nIiwib0NvbnRleHQiLCJPRGF0YUNvbnRleHRCaW5kaW5nIiwibW9ja01vZGVsIiwib01vY2tDb250ZXh0IiwiZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCIsIm9Nb2RlbCIsImdldEJvdW5kQ29udGV4dCIsImV4ZWN1dGUiLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsIk1vY2tDb250ZXh0QmluZGluZyIsImNyZWF0ZU1vY2tNZXRhTW9kZWwiLCJvTWV0YURhdGEiLCJPRGF0YU1ldGFNb2RlbCIsIm9NZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0Iiwic1BhdGgiLCIkcGF0aCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiZ2V0TWV0YVBhdGgiLCJtZXRhbW9kZWwiLCJNb2NrTWV0YU1vZGVsIiwiY3JlYXRlTW9ja01vZGVsIiwib01vY2tMaXN0QmluZGluZyIsIm9Nb2NrQ29udGV4dEJpbmRpbmciLCJPRGF0YU1vZGVsIiwibW9ja0xpc3RCaW5kaW5nIiwibW9ja0NvbnRleHRCaW5kaW5nIiwic2V0TWV0YU1vZGVsIiwib01ldGFNb2RlbCIsImJpbmRMaXN0IiwiYmluZENvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJNb2NrTW9kZWwiLCJjcmVhdGVNb2NrTW9kZWxGcm9tTGlzdEJpbmRpbmciLCJjcmVhdGVNb2NrTW9kZWxGcm9tQ29udGV4dEJpbmRpbmciLCJ1bmRlZmluZWQiLCJjcmVhdGVNb2NrVmlldyIsIlZpZXciLCJNb2NrVmlldyIsImNyZWF0ZU1vY2tDb250cm9sbGVyIiwiQ29udHJvbGxlciIsIl9yb3V0aW5nIiwiSW50ZXJuYWxSb3V0aW5nIiwiX3NpZGVFZmZlY3RzIiwiU2lkZUVmZmVjdHMiLCJlZGl0RmxvdyIsIkVkaXRGbG93Iiwic2hhcmUiLCJTaGFyZSIsInJlY29tbWVuZGF0aW9ucyIsIlJlY29tbWVuZGF0aW9ucyIsImdldEFwcENvbXBvbmVudCIsImplc3QiLCJmbiIsIkFwcENvbXBvbmVudCIsImdldFZpZXciLCJNb2NrQ29udHJvbGxlciIsIm1vY2tNVkMiLCJleGlzdGluZyIsInZpZXciLCJjb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsImdldFRleHQiLCJ0ZXh0SUQiLCJwYXJhbWV0ZXJzIiwibWV0YVBhdGgiLCJyZXNvdXJjZU1vZGVsIiwiUmVzb3VyY2VNb2RlbCIsImJ1bmRsZU5hbWUiLCJlbmhhbmNlV2l0aCIsImFzeW5jIiwiY3JlYXRlTW9ja1Jlc291cmNlTW9kZWwiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBXaXRoTW9jayB9IGZyb20gXCJAc2FwLXV4L2plc3QtbW9jay11aTUvZGlzdC9nZW5lcmljXCI7XG5pbXBvcnQgeyBtb2NrIH0gZnJvbSBcIkBzYXAtdXgvamVzdC1tb2NrLXVpNS9kaXN0L2dlbmVyaWNcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IEVkaXRGbG93IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9FZGl0Rmxvd1wiO1xuaW1wb3J0IEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgUmVjb21tZW5kYXRpb25zIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9SZWNvbW1lbmRhdGlvbnNcIjtcbmltcG9ydCBTaGFyZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2hhcmVcIjtcbmltcG9ydCBTaWRlRWZmZWN0cyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2lkZUVmZmVjdHNcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgQ29udHJvbGxlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IENvbXBvc2l0ZUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9Db21wb3NpdGVCaW5kaW5nXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YVByb3BlcnR5QmluZGluZ1wiO1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja0NvbnRleHQgPSBXaXRoTW9jazxDb250ZXh0PiAmIHtcblx0X2lzS2VwdEFsaXZlOiBib29sZWFuO1xuXHRfY29udGV4dERhdGE6IGFueTtcblx0X29CaW5kaW5nOiBhbnk7XG5cdF9pc0luYWN0aXZlOiBib29sZWFuO1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja0NvbnRleHQuXG4gKlxuICogQHBhcmFtIG9Db250ZXh0RGF0YSBBIG1hcCBvZiB0aGUgZGlmZmVyZW50IHByb3BlcnRpZXMgb2YgdGhlIGNvbnRleHQuIFRoZSB2YWx1ZSBmb3IgdGhlIGtleSAnJHBhdGgnIHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhlICdnZXRQYXRoJyBtZXRob2RcbiAqIEBwYXJhbSBvQmluZGluZyBUaGUgYmluZGluZyBvZiB0aGUgY29udGV4dFxuICogQHBhcmFtIGlzSW5hY3RpdmUgSXMgdGhlIGNvbnRleHQgaW5pYWN0aXZlIG9yIG5vdFxuICogQHJldHVybnMgQSBuZXcgTW9ja0NvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tDb250ZXh0KG9Db250ZXh0RGF0YT86IGFueSwgb0JpbmRpbmc/OiBhbnksIGlzSW5hY3RpdmU/OiBib29sZWFuKTogTW9ja0NvbnRleHQge1xuXHQvLyBVZ2x5IHdvcmthcm91bmQgdG8gZ2V0IGEgcHJvcGVyIG1vY2sgcGJqZWN0LCBhcyBDb250ZXh0IGlzbid0IHByb3Blcmx5IGV4cG9ydGVkIGZyb20gVUk1XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soT2JqZWN0LmdldFByb3RvdHlwZU9mKChDb250ZXh0IGFzIGFueSkuY3JlYXRlTmV3Q29udGV4dChudWxsLCBudWxsLCBcIi9lXCIpKSkgYXMgTW9ja0NvbnRleHQ7XG5cdG1vY2tlZC5faXNLZXB0QWxpdmUgPSBmYWxzZTtcblx0bW9ja2VkLl9jb250ZXh0RGF0YSA9IG9Db250ZXh0RGF0YSB8fCB7fTtcblx0bW9ja2VkLl9vQmluZGluZyA9IG9CaW5kaW5nO1xuXHRtb2NrZWQuX2lzSW5hY3RpdmUgPSAhIWlzSW5hY3RpdmU7XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0UHJvcGVydHkubW9ja0ltcGxlbWVudGF0aW9uKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQuX2NvbnRleHREYXRhW2tleV07XG5cdH0pO1xuXHRtb2NrZWQubW9jay5yZXF1ZXN0UHJvcGVydHkubW9ja0ltcGxlbWVudGF0aW9uKChrZXlPcktleXM6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoa2V5T3JLZXlzKSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShrZXlPcktleXMubWFwKChrZXkpID0+IG1vY2tlZC5fY29udGV4dERhdGFba2V5XSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1vY2tlZC5fY29udGV4dERhdGFba2V5T3JLZXlzXSk7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5yZXF1ZXN0T2JqZWN0Lm1vY2tJbXBsZW1lbnRhdGlvbigoa2V5OiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1vY2tlZC5fY29udGV4dERhdGFba2V5XSk7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5zZXRQcm9wZXJ0eS5tb2NrSW1wbGVtZW50YXRpb24oKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG5cdFx0bW9ja2VkLl9jb250ZXh0RGF0YVtrZXldID0gdmFsdWU7XG5cdFx0cmV0dXJuIG1vY2tlZC5fY29udGV4dERhdGFba2V5XTtcblx0fSk7XG5cblx0bW9ja2VkLm1vY2suZ2V0T2JqZWN0Lm1vY2tJbXBsZW1lbnRhdGlvbigocGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0bGV0IHJlc3VsdCA9IHBhdGggPyBtb2NrZWQuX2NvbnRleHREYXRhW3BhdGhdIDogbW9ja2VkLl9jb250ZXh0RGF0YTtcblxuXHRcdGlmICghcmVzdWx0ICYmIHBhdGggJiYgcGF0aC5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0cmVzdWx0ID0gcGFydHMucmVkdWNlKChzdW0sIHBhcnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRzdW0gPSBwYXJ0ID8gc3VtW3BhcnRdIDogc3VtO1xuXHRcdFx0XHRyZXR1cm4gc3VtO1xuXHRcdFx0fSwgbW9ja2VkLl9jb250ZXh0RGF0YSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSk7XG5cblx0bW9ja2VkLm1vY2suZ2V0UGF0aC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9jb250ZXh0RGF0YVtcIiRwYXRoXCJdKTtcblx0bW9ja2VkLm1vY2suZ2V0QmluZGluZy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9vQmluZGluZyk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBtb2NrZWQuX29CaW5kaW5nPy5nZXRNb2RlbCgpKTtcblx0bW9ja2VkLm1vY2suc2V0S2VlcEFsaXZlLm1vY2tJbXBsZW1lbnRhdGlvbigoYm9vbDogYm9vbGVhbiwgX2ZuT25CZWZvcmVEZXN0cm95PzogYW55LCBfYlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4pID0+IHtcblx0XHRtb2NrZWQuX2lzS2VwdEFsaXZlID0gYm9vbDtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmlzS2VlcEFsaXZlLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBtb2NrZWQuX2lzS2VwdEFsaXZlKTtcblx0bW9ja2VkLm1vY2suaXNJbmFjdGl2ZS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9pc0luYWN0aXZlKTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRleHQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tDb250ZXh0OiBuZXcgKG9WYWx1ZXM/OiBhbnksIG9CaW5kaW5nPzogYW55LCBpc0luYWN0aXZlPzogYm9vbGVhbikgPT4gTW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dCBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkuYmFzZS5FdmVudFxuICovXG5leHBvcnQgdHlwZSBNb2NrRXZlbnQgPSBXaXRoTW9jazxFdmVudD4gJiB7XG5cdF9wYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrRXZlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyBUaGUgcGFyYW1ldGVycyBvZiB0aGUgZXZlbnRcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tFdmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0V2ZW50KHBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiBNb2NrRXZlbnQge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKEV2ZW50KSBhcyBNb2NrRXZlbnQ7XG5cdG1vY2tlZC5fcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suZ2V0UGFyYW1ldGVyLm1vY2tJbXBsZW1lbnRhdGlvbigobmFtZSkgPT4gbW9ja2VkLl9wYXJhbXNbbmFtZV0pO1xuXHRtb2NrZWQubW9jay5nZXRQYXJhbWV0ZXJzLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fcGFyYW1zO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja0V2ZW50IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrRXZlbnQ6IG5ldyAocGFyYW1zPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgPT4gTW9ja0V2ZW50ID0gY3JlYXRlTW9ja0V2ZW50IGFzIGFueTtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gbW9jayBhIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXG4gKi9cbmV4cG9ydCB0eXBlIE1vY2tMaXN0QmluZGluZyA9IFdpdGhNb2NrPE9EYXRhTGlzdEJpbmRpbmc+ICYge1xuXHRfYU1vY2tDb250ZXh0czogTW9ja0NvbnRleHRbXTtcblx0X21vY2tNb2RlbD86IE1vY2tNb2RlbDtcblxuXHQvKipcblx0ICogVXRpbGl0eSBtZXRob2QgdG8gc2V0IHRoZSBtb2RlbCBvZiB0aGUgTGlzdEJpbmRpbmdcblx0ICovXG5cdHNldE1vZGVsOiAobW9kZWw6IE1vY2tNb2RlbCkgPT4gdm9pZDtcbn07XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tMaXN0QmluZGluZy5cbiAqXG4gKiBAcGFyYW0gYUNvbnRleHREYXRhIEFuIGFycmF5IG9mIG9iamVjdHMgaG9sZGluZyB0aGUgZGlmZmVyZW50IHByb3BlcnRpZXMgb2YgdGhlIGNvbnRleHRzIHJlZmVyZW5jZWQgYnkgdGhlIExpc3RCaW5kaW5nXG4gKiBAcGFyYW0gb01vY2tNb2RlbCBUaGUgbW9kZWwgb2YgdGhlIExpc3RCaW5kaW5nXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrTGlzdEJpbmRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tMaXN0QmluZGluZyhhQ29udGV4dERhdGE/OiBhbnlbXSwgb01vY2tNb2RlbD86IE1vY2tNb2RlbCk6IE1vY2tMaXN0QmluZGluZyB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soT0RhdGFMaXN0QmluZGluZykgYXMgTW9ja0xpc3RCaW5kaW5nO1xuXHRhQ29udGV4dERhdGEgPSBhQ29udGV4dERhdGEgfHwgW107XG5cdG1vY2tlZC5fYU1vY2tDb250ZXh0cyA9IGFDb250ZXh0RGF0YS5tYXAoKGNvbnRleHREYXRhKSA9PiB7XG5cdFx0cmV0dXJuIGNyZWF0ZU1vY2tDb250ZXh0KGNvbnRleHREYXRhLCBtb2NrZWQpO1xuXHR9KTtcblx0bW9ja2VkLl9tb2NrTW9kZWwgPSBvTW9ja01vZGVsO1xuXG5cdC8vIFV0aWxpdHkgQVBJXG5cdG1vY2tlZC5zZXRNb2RlbCA9IChtb2RlbDogTW9ja01vZGVsKSA9PiB7XG5cdFx0bW9ja2VkLl9tb2NrTW9kZWwgPSBtb2RlbDtcblx0fTtcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrSW1wbGVtZW50YXRpb24oKHNDbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCI7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5yZXF1ZXN0Q29udGV4dHMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1vY2tlZC5fYU1vY2tDb250ZXh0cyk7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRDdXJyZW50Q29udGV4dHMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9hTW9ja0NvbnRleHRzO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0QWxsQ3VycmVudENvbnRleHRzLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fYU1vY2tDb250ZXh0cztcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldENvbnRleHRzLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fYU1vY2tDb250ZXh0cztcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fbW9ja01vZGVsO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0VXBkYXRlR3JvdXBJZC5tb2NrUmV0dXJuVmFsdWUoXCJhdXRvXCIpO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrTGlzdEJpbmRpbmcgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tMaXN0QmluZGluZzogbmV3IChhQ29udGV4dHM/OiBhbnlbXSwgbW9ja01vZGVsPzogTW9ja01vZGVsKSA9PiBNb2NrTGlzdEJpbmRpbmcgPSBjcmVhdGVNb2NrTGlzdEJpbmRpbmcgYXMgYW55O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhUHJvcGVydHlCaW5kaW5nXG4gKi9cbmV4cG9ydCB0eXBlIE1vY2tQcm9wZXJ0eUJpbmRpbmcgPSBXaXRoTW9jazxPRGF0YVByb3BlcnR5QmluZGluZz4gJiB7XG5cdF92YWx1ZT86IGFueTtcblx0X3BhdGg/OiBzdHJpbmc7XG5cdF9tb2NrTW9kZWw/OiBNb2NrTW9kZWw7XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrUHJvcGVydHlCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgcmV0dXJuZCBieSB0aGUgUHJvcGVydHlCaW5kaW5nXG4gKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvZiB0aGUgUHJvcGVydHlCaW5kaW5nXG4gKiBAcGFyYW0gb01vY2tNb2RlbCBUaGUgbW9kZWwgb2YgdGhlIFByb3BlcnR5QmluZGluZ1xuICogQHJldHVybnMgQSBuZXcgTW9ja1Byb3BlcnR5QmluZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja1Byb3BlcnR5QmluZGluZyh2YWx1ZTogYW55LCBwYXRoPzogc3RyaW5nLCBvTW9ja01vZGVsPzogTW9ja01vZGVsKTogTW9ja1Byb3BlcnR5QmluZGluZyB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soT0RhdGFQcm9wZXJ0eUJpbmRpbmcpIGFzIE1vY2tQcm9wZXJ0eUJpbmRpbmc7XG5cdG1vY2tlZC5fbW9ja01vZGVsID0gb01vY2tNb2RlbDtcblx0bW9ja2VkLl92YWx1ZSA9IHZhbHVlO1xuXHRtb2NrZWQuX3BhdGggPSBwYXRoO1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suaXNBLm1vY2tJbXBsZW1lbnRhdGlvbigoc0NsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRNb2RlbC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQuX21vY2tNb2RlbDtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldFZhbHVlLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fdmFsdWU7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRQYXRoLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fcGF0aDtcblx0fSk7XG5cblx0cmV0dXJuIG1vY2tlZDtcbn1cbi8qKlxuICogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgd2Uga2VlcCBhIG5ldyBvcGVyYXRvci4gVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZU1vY2tQcm9wZXJ0eUJpbmRpbmcgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tQcm9wZXJ0eUJpbmRpbmc6IG5ldyAodmFsdWU6IGFueSwgb01vY2tNb2RlbD86IE1vY2tNb2RlbCkgPT4gTW9ja1Byb3BlcnR5QmluZGluZyA9IGNyZWF0ZU1vY2tQcm9wZXJ0eUJpbmRpbmcgYXMgYW55O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLnVpLm1vZGVsLkNvbXBvc2l0ZUJpbmRpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja0NvbXBvc2l0ZUJpbmRpbmcgPSBXaXRoTW9jazxDb21wb3NpdGVCaW5kaW5nPiAmIHtcblx0X2FCaW5kaW5nczogTW9ja1Byb3BlcnR5QmluZGluZ1tdO1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja0NvbXBvc2l0ZUJpbmRpbmcuXG4gKlxuICogQHBhcmFtIGFCaW5kaW5ncyBUaGUgYmluZGluZ3Mgb2YgdGhlIENvbXBvc2l0ZUJpbmRpbmdcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tDb21wb3NpdGVCaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrQ29tcG9zaXRlQmluZGluZyhhQmluZGluZ3M6IE1vY2tQcm9wZXJ0eUJpbmRpbmdbXSk6IE1vY2tDb21wb3NpdGVCaW5kaW5nIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhDb21wb3NpdGVCaW5kaW5nKSBhcyBNb2NrQ29tcG9zaXRlQmluZGluZztcblx0bW9ja2VkLl9hQmluZGluZ3MgPSBhQmluZGluZ3M7XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkubW9kZWwuQ29tcG9zaXRlQmluZGluZ1wiO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0QmluZGluZ3MubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9hQmluZGluZ3M7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRWYWx1ZS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQuX2FCaW5kaW5ncy5tYXAoKGJpbmRpbmcpID0+IGJpbmRpbmcuZ2V0VmFsdWUoKSk7XG5cdH0pO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrQ29tcG9zaXRlQmluZGluZyBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja0NvbXBvc2l0ZUJpbmRpbmc6IG5ldyAoYUJpbmRpbmdzOiBNb2NrUHJvcGVydHlCaW5kaW5nW10pID0+IE1vY2tDb21wb3NpdGVCaW5kaW5nID0gY3JlYXRlTW9ja0NvbXBvc2l0ZUJpbmRpbmcgYXMgYW55O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja0NvbnRleHRCaW5kaW5nID0gV2l0aE1vY2s8T0RhdGFDb250ZXh0QmluZGluZz4gJiB7XG5cdG9Nb2NrQ29udGV4dDogTW9ja0NvbnRleHQ7XG5cdGlzS2VwdEFsaXZlOiBib29sZWFuO1xuXHRtb2NrTW9kZWw/OiBNb2NrTW9kZWw7XG5cblx0LyoqXG5cdCAqIFV0aWxpdHkgbWV0aG9kIHRvIGFjY2VzcyB0aGUgaW50ZXJuYWwgTW9ja0NvbnRleHQgb2YgdGhlIENvbnRleHRCaW5kaW5nXG5cdCAqL1xuXHRnZXRJbnRlcm5hbE1vY2tDb250ZXh0OiAoKSA9PiBNb2NrQ29udGV4dDtcblx0LyoqXG5cdCAqIFV0aWxpdHkgbWV0aG9kIHRvIHNldCB0aGUgbW9kZWwgb2YgdGhlIENvbnRleHRCaW5kaW5nXG5cdCAqL1xuXHRzZXRNb2RlbDogKG9Nb2RlbDogTW9ja01vZGVsKSA9PiB2b2lkO1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja0NvbnRleHRCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgQ29udGV4dEJpbmRpbmdcbiAqIEBwYXJhbSBvTW9ja01vZGVsIFRoZSBtb2RlbCBvZiB0aGUgQ29udGV4dEJpbmRpbmdcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tDb250ZXh0QmluZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRleHRCaW5kaW5nKG9Db250ZXh0PzogYW55LCBvTW9ja01vZGVsPzogTW9ja01vZGVsKTogTW9ja0NvbnRleHRCaW5kaW5nIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhPRGF0YUNvbnRleHRCaW5kaW5nKSBhcyBNb2NrQ29udGV4dEJpbmRpbmc7XG5cdG1vY2tlZC5tb2NrTW9kZWwgPSBvTW9ja01vZGVsO1xuXHRtb2NrZWQub01vY2tDb250ZXh0ID0gY3JlYXRlTW9ja0NvbnRleHQob0NvbnRleHQgfHwge30sIG1vY2tlZCk7XG5cblx0Ly8gVXRpbGl0eSBBUElcblx0bW9ja2VkLmdldEludGVybmFsTW9ja0NvbnRleHQgPSAoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5vTW9ja0NvbnRleHQ7XG5cdH07XG5cdG1vY2tlZC5zZXRNb2RlbCA9IChvTW9kZWw6IE1vY2tNb2RlbCkgPT4ge1xuXHRcdG1vY2tlZC5tb2NrTW9kZWwgPSBvTW9kZWw7XG5cdH07XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0Qm91bmRDb250ZXh0Lm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5vTW9ja0NvbnRleHQ7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRNb2RlbC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQubW9ja01vZGVsO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZXhlY3V0ZS5tb2NrUmVzb2x2ZWRWYWx1ZSh0cnVlKTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRleHRCaW5kaW5nIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrQ29udGV4dEJpbmRpbmc6IG5ldyAob0NvbnRleHQ/OiBhbnksIG9Nb2NrTW9kZWw/OiBNb2NrTW9kZWwpID0+IE1vY2tDb250ZXh0QmluZGluZyA9IGNyZWF0ZU1vY2tDb250ZXh0QmluZGluZyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja01ldGFNb2RlbCA9IFdpdGhNb2NrPE9EYXRhTWV0YU1vZGVsPiAmIHtcblx0b01ldGFDb250ZXh0OiBNb2NrQ29udGV4dDtcbn07XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tNZXRhTW9kZWwuXG4gKlxuICogQHBhcmFtIG9NZXRhRGF0YSBBIG1hcCBvZiB0aGUgZGlmZmVyZW50IG1ldGFkYXRhIHByb3BlcnRpZXMgb2YgdGhlIE1ldGFNb2RlbCAocGF0aCAtPiB2YWx1ZSkuXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrTWV0YU1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrTWV0YU1vZGVsKG9NZXRhRGF0YT86IGFueSk6IE1vY2tNZXRhTW9kZWwge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKE9EYXRhTWV0YU1vZGVsKSBhcyBNb2NrTWV0YU1vZGVsO1xuXHRtb2NrZWQub01ldGFDb250ZXh0ID0gY3JlYXRlTW9ja0NvbnRleHQob01ldGFEYXRhIHx8IHt9KTtcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmdldE1ldGFDb250ZXh0Lm1vY2tJbXBsZW1lbnRhdGlvbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBjcmVhdGVNb2NrQ29udGV4dCh7ICRwYXRoOiBzUGF0aCB9KTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE9iamVjdC5tb2NrSW1wbGVtZW50YXRpb24oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm9NZXRhQ29udGV4dC5nZXRQcm9wZXJ0eShzUGF0aCk7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5jcmVhdGVCaW5kaW5nQ29udGV4dC5tb2NrSW1wbGVtZW50YXRpb24oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gY3JlYXRlTW9ja0NvbnRleHQoeyAkcGF0aDogc1BhdGggfSk7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRNZXRhUGF0aC5tb2NrSW1wbGVtZW50YXRpb24oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCBtZXRhbW9kZWwgPSBuZXcgT0RhdGFNZXRhTW9kZWwoKTtcblx0XHRyZXR1cm4gc1BhdGggPyBtZXRhbW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpIDogc1BhdGg7XG5cdH0pO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrTWV0YU1vZGVsIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrTWV0YU1vZGVsOiBuZXcgKG9NZXRhRGF0YT86IGFueSkgPT4gTW9ja01ldGFNb2RlbCA9IGNyZWF0ZU1vY2tNZXRhTW9kZWwgYXMgYW55O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja01vZGVsID0gV2l0aE1vY2s8T0RhdGFNb2RlbD4gJiB7XG5cdG9NZXRhTW9kZWw/OiBNb2NrTWV0YU1vZGVsO1xuXHRtb2NrTGlzdEJpbmRpbmc/OiBNb2NrTGlzdEJpbmRpbmc7XG5cdG1vY2tDb250ZXh0QmluZGluZz86IE1vY2tDb250ZXh0QmluZGluZztcblxuXHQvKipcblx0ICogVXRpbGl0eSBtZXRob2QgdG8gc2V0IHRoZSBtZXRhbW9kZWwgb2YgdGhlIE1vY2tNb2RlbFxuXHQgKi9cblx0c2V0TWV0YU1vZGVsOiAob01ldGFNb2RlbDogTW9ja01ldGFNb2RlbCkgPT4gdm9pZDtcbn07XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tNb2RlbC5cbiAqXG4gKiBAcGFyYW0gb01vY2tMaXN0QmluZGluZyBBIGxpc3QgYmluZGluZyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgd2hlbiBjYWxsaW5nIGJpbmRMaXN0LlxuICogQHBhcmFtIG9Nb2NrQ29udGV4dEJpbmRpbmcgQSBjb250ZXh0IGJpbmRpbmcgdGhhdCB3aWxsIGJlIHJldHVybmVkIHdoZW4gY2FsbGluZyBiaW5kQ29udGV4dC5cbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja01vZGVsKG9Nb2NrTGlzdEJpbmRpbmc/OiBNb2NrTGlzdEJpbmRpbmcsIG9Nb2NrQ29udGV4dEJpbmRpbmc/OiBNb2NrQ29udGV4dEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKE9EYXRhTW9kZWwpIGFzIE1vY2tNb2RlbDtcblx0bW9ja2VkLm1vY2tMaXN0QmluZGluZyA9IG9Nb2NrTGlzdEJpbmRpbmc7XG5cdG1vY2tlZC5tb2NrQ29udGV4dEJpbmRpbmcgPSBvTW9ja0NvbnRleHRCaW5kaW5nO1xuXHRpZiAob01vY2tMaXN0QmluZGluZykge1xuXHRcdG9Nb2NrTGlzdEJpbmRpbmcuc2V0TW9kZWwobW9ja2VkKTtcblx0fVxuXHRpZiAob01vY2tDb250ZXh0QmluZGluZykge1xuXHRcdG9Nb2NrQ29udGV4dEJpbmRpbmcuc2V0TW9kZWwobW9ja2VkKTtcblx0fVxuXG5cdC8vIFV0aWxpdHkgQVBJXG5cdG1vY2tlZC5zZXRNZXRhTW9kZWwgPSAob01ldGFNb2RlbDogTW9ja01ldGFNb2RlbCkgPT4ge1xuXHRcdG1vY2tlZC5vTWV0YU1vZGVsID0gb01ldGFNb2RlbDtcblx0fTtcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmJpbmRMaXN0Lm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5tb2NrTGlzdEJpbmRpbmc7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5iaW5kQ29udGV4dC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQubW9ja0NvbnRleHRCaW5kaW5nO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0TWV0YU1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5vTWV0YU1vZGVsO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja01vZGVsIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrTW9kZWw6IG5ldyAob01vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZywgb01vY2tDb250ZXh0QmluZGluZz86IE1vY2tDb250ZXh0QmluZGluZykgPT4gTW9ja01vZGVsID1cblx0Y3JlYXRlTW9ja01vZGVsIGFzIGFueTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja01vZGVsIHVzZWQgd2l0aCBhIGxpc3RCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSBvTW9ja0xpc3RCaW5kaW5nIEEgbGlzdCBiaW5kaW5nIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB3aGVuIGNhbGxpbmcgYmluZExpc3QuXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNb2RlbEZyb21MaXN0QmluZGluZyhvTW9ja0xpc3RCaW5kaW5nOiBNb2NrTGlzdEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRyZXR1cm4gY3JlYXRlTW9ja01vZGVsKG9Nb2NrTGlzdEJpbmRpbmcpO1xufVxuLyoqXG4gKiAgRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja01vZGVsIHVzZWQgd2l0aCBhIGNvbnRleHRCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSBvTW9ja0NvbnRleHRCaW5kaW5nIEEgY29udGV4dCBiaW5kaW5nIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB3aGVuIGNhbGxpbmcgYmluZENvbnRleHQuXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNb2RlbEZyb21Db250ZXh0QmluZGluZyhvTW9ja0NvbnRleHRCaW5kaW5nOiBNb2NrQ29udGV4dEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRyZXR1cm4gY3JlYXRlTW9ja01vZGVsKHVuZGVmaW5lZCwgb01vY2tDb250ZXh0QmluZGluZyk7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkuY29yZS5tdmMuVmlld1xuICovXG5leHBvcnQgdHlwZSBNb2NrVmlldyA9IFdpdGhNb2NrPFZpZXc+O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrVmlldy5cbiAqXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrVmlld1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja1ZpZXcoKTogTW9ja1ZpZXcge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKFZpZXcpO1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suaXNBLm1vY2tJbXBsZW1lbnRhdGlvbigoc0NsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLmNvcmUubXZjLlZpZXdcIjtcblx0fSk7XG5cblx0cmV0dXJuIG1vY2tlZDtcbn1cbi8qKlxuICogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgd2Uga2VlcCBhIG5ldyBvcGVyYXRvci4gVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZU1vY2tWaWV3IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrVmlldzogbmV3ICgpID0+IE1vY2tWaWV3ID0gY3JlYXRlTW9ja1ZpZXcgYXMgYW55O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLmZlLmNvcmUuUGFnZUNvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja0NvbnRyb2xsZXIgPSBXaXRoTW9jazxDb250cm9sbGVyPiAmIHtcblx0X3JvdXRpbmc6IFdpdGhNb2NrPEludGVybmFsUm91dGluZz47XG5cdF9zaWRlRWZmZWN0czogV2l0aE1vY2s8U2lkZUVmZmVjdHM+O1xuXHRlZGl0RmxvdzogV2l0aE1vY2s8RWRpdEZsb3c+O1xuXHRzaGFyZTogV2l0aE1vY2s8U2hhcmU+O1xuXHRyZWNvbW1lbmRhdGlvbnM6IFdpdGhNb2NrPFJlY29tbWVuZGF0aW9ucz47XG5cdGdldEFwcENvbXBvbmVudDogKCkgPT4gV2l0aE1vY2s8QXBwQ29tcG9uZW50Pjtcbn07XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tDb250cm9sbGVyLlxuICpcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tDb250cm9sbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrQ29udHJvbGxlcigpOiBNb2NrQ29udHJvbGxlciB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soQ29udHJvbGxlcikgYXMgTW9ja0NvbnRyb2xsZXI7XG5cdG1vY2tlZC5fcm91dGluZyA9IG1vY2soSW50ZXJuYWxSb3V0aW5nKTtcblx0bW9ja2VkLl9zaWRlRWZmZWN0cyA9IG1vY2soU2lkZUVmZmVjdHMpO1xuXHRtb2NrZWQuZWRpdEZsb3cgPSBtb2NrKEVkaXRGbG93KTtcblx0bW9ja2VkLnNoYXJlID0gbW9jayhTaGFyZSk7XG5cdG1vY2tlZC5yZWNvbW1lbmRhdGlvbnMgPSBtb2NrKFJlY29tbWVuZGF0aW9ucyk7XG5cdG1vY2tlZC5nZXRBcHBDb21wb25lbnQgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKG1vY2soQXBwQ29tcG9uZW50KSk7XG5cdC8vIERlZmF1bHQgQmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suZ2V0Vmlldy5tb2NrUmV0dXJuVmFsdWUoY3JlYXRlTW9ja1ZpZXcoKSk7XG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBtb2NrQ29udHJvbGxlciBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja0NvbnRyb2xsZXI6IG5ldyAoKSA9PiBNb2NrQ29udHJvbGxlciA9IGNyZWF0ZU1vY2tDb250cm9sbGVyIGFzIGFueTtcblxuZXhwb3J0IGludGVyZmFjZSBNVkNNb2NrIHtcblx0bW9kZWw6IE1vY2tNb2RlbDtcblx0dmlldzogTW9ja1ZpZXc7XG5cdGNvbnRyb2xsZXI6IE1vY2tDb250cm9sbGVyO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBtb2RlbCwgdmlldyBhbmQgY29udHJvbGxlciBtb2NrcyB0aGF0IHJlZmVyIHRvIGVhY2ggb3RoZXIuXG4gKlxuICogQHBhcmFtIGV4aXN0aW5nIE9wdGlvbmFsIGV4aXN0aW5nIG1vY2tlZCBpbnN0YW5jZXMgdGhhdCBzaG91bGQgYmUgdXNlZFxuICogQHJldHVybnMgTW9ja2VkIG1vZGVsLCB2aWV3IGFuZCBjb250cm9sbGVyIGluc3RhbmNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja01WQyhleGlzdGluZz86IFBhcnRpYWw8TVZDTW9jaz4pOiBNVkNNb2NrIHtcblx0Y29uc3QgbW9kZWwgPSBleGlzdGluZz8ubW9kZWwgfHwgY3JlYXRlTW9ja01vZGVsKCk7XG5cdGNvbnN0IHZpZXcgPSBleGlzdGluZz8udmlldyB8fCBjcmVhdGVNb2NrVmlldygpO1xuXHRjb25zdCBjb250cm9sbGVyID0gZXhpc3Rpbmc/LmNvbnRyb2xsZXIgfHwgY3JlYXRlTW9ja0NvbnRyb2xsZXIoKTtcblxuXHR2aWV3Lm1vY2suZ2V0Q29udHJvbGxlci5tb2NrUmV0dXJuVmFsdWUoY29udHJvbGxlcik7XG5cdHZpZXcubW9jay5nZXRNb2RlbC5tb2NrUmV0dXJuVmFsdWUobW9kZWwpO1xuXHRjb250cm9sbGVyLm1vY2suZ2V0Vmlldy5tb2NrUmV0dXJuVmFsdWUodmlldyk7XG5cblx0cmV0dXJuIHsgbW9kZWwsIHZpZXcsIGNvbnRyb2xsZXIgfTtcbn1cblxuLyoqXG4gKiBUbyBiZSB1c2VkIHRvIGxvYWQgbWVzc2FnZXMgYnVuZGxlcyBmb3IgdGVzdHMgd2l0aG91dCBhcHAvcGFnZSBjb21wb25lbnQuXG4gKlxuICogQHBhcmFtIHRleHRJRCBJRCBvZiB0aGUgVGV4dFxuICogQHBhcmFtIHBhcmFtZXRlcnMgQXJyYXkgb2YgcGFyYW1ldGVycyB0aGF0IGFyZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdGV4dFxuICogQHBhcmFtIG1ldGFQYXRoIEVudGl0eSBzZXQgbmFtZSBvciBhY3Rpb24gbmFtZSB0byBvdmVybG9hZCBhIHRleHRcbiAqIEByZXR1cm5zIERldGVybWluZWQgdGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dCh0ZXh0SUQ6IHN0cmluZywgcGFyYW1ldGVycz86IGFueVtdLCBtZXRhUGF0aD86IHN0cmluZykge1xuXHRjb25zdCByZXNvdXJjZU1vZGVsID0gbmV3IFJlc291cmNlTW9kZWwoe1xuXHRcdGJ1bmRsZU5hbWU6IFwic2FwLmZlLmNvcmUubWVzc2FnZWJ1bmRsZVwiLFxuXHRcdGVuaGFuY2VXaXRoOiBbeyBidW5kbGVOYW1lOiBcInNhcC5mZS5tYWNyb3MubWVzc2FnZWJ1bmRsZVwiIH0sIHsgYnVuZGxlTmFtZTogXCJzYXAuZmUudGVtcGxhdGVzLm1lc3NhZ2VidW5kbGVcIiB9XSxcblx0XHRhc3luYzogZmFsc2Vcblx0fSk7XG5cdHJldHVybiByZXNvdXJjZU1vZGVsLmdldFRleHQodGV4dElELCBwYXJhbWV0ZXJzLCBtZXRhUGF0aCk7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgUmVzb3VyY2VNb2RlbFxuICovXG5leHBvcnQgdHlwZSBNb2NrUmVzb3VyY2VNb2RlbCA9IFdpdGhNb2NrPFJlc291cmNlTW9kZWw+O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrVmlldy5cbiAqXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrVmlld1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja1Jlc291cmNlTW9kZWwoKTogTW9ja1Jlc291cmNlTW9kZWwge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKFJlc291cmNlTW9kZWwpO1xuXHRtb2NrZWQuZ2V0VGV4dCA9IGplc3QuZm4oKS5tb2NrSW1wbGVtZW50YXRpb24oZ2V0VGV4dCk7XG5cdHJldHVybiBtb2NrZWQ7XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7OztFQTZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0EsaUJBQWlCLENBQUNDLFlBQWtCLEVBQUVDLFFBQWMsRUFBRUMsVUFBb0IsRUFBZTtJQUN4RztJQUNBLE1BQU1DLE1BQU0sR0FBR0MsSUFBSSxDQUFDQyxNQUFNLENBQUNDLGNBQWMsQ0FBRUMsT0FBTyxDQUFTQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQWdCO0lBQzlHTCxNQUFNLENBQUNNLFlBQVksR0FBRyxLQUFLO0lBQzNCTixNQUFNLENBQUNPLFlBQVksR0FBR1YsWUFBWSxJQUFJLENBQUMsQ0FBQztJQUN4Q0csTUFBTSxDQUFDUSxTQUFTLEdBQUdWLFFBQVE7SUFDM0JFLE1BQU0sQ0FBQ1MsV0FBVyxHQUFHLENBQUMsQ0FBQ1YsVUFBVTs7SUFFakM7SUFDQUMsTUFBTSxDQUFDQyxJQUFJLENBQUNTLEdBQUcsQ0FBQ0Msa0JBQWtCLENBQUVDLFVBQWtCLElBQUs7TUFDMUQsT0FBT0EsVUFBVSxLQUFLLCtCQUErQjtJQUN0RCxDQUFDLENBQUM7SUFDRlosTUFBTSxDQUFDQyxJQUFJLENBQUNZLFdBQVcsQ0FBQ0Ysa0JBQWtCLENBQUVHLEdBQVcsSUFBSztNQUMzRCxPQUFPZCxNQUFNLENBQUNPLFlBQVksQ0FBQ08sR0FBRyxDQUFDO0lBQ2hDLENBQUMsQ0FBQztJQUNGZCxNQUFNLENBQUNDLElBQUksQ0FBQ2MsZUFBZSxDQUFDSixrQkFBa0IsQ0FBRUssU0FBNEIsSUFBSztNQUNoRixJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsU0FBUyxDQUFDLEVBQUU7UUFDN0IsT0FBT0csT0FBTyxDQUFDQyxPQUFPLENBQUNKLFNBQVMsQ0FBQ0ssR0FBRyxDQUFFUCxHQUFHLElBQUtkLE1BQU0sQ0FBQ08sWUFBWSxDQUFDTyxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQ3pFO01BQ0EsT0FBT0ssT0FBTyxDQUFDQyxPQUFPLENBQUNwQixNQUFNLENBQUNPLFlBQVksQ0FBQ1MsU0FBUyxDQUFDLENBQUM7SUFDdkQsQ0FBQyxDQUFDO0lBQ0ZoQixNQUFNLENBQUNDLElBQUksQ0FBQ3FCLGFBQWEsQ0FBQ1gsa0JBQWtCLENBQUVHLEdBQVcsSUFBSztNQUM3RCxPQUFPSyxPQUFPLENBQUNDLE9BQU8sQ0FBQ3BCLE1BQU0sQ0FBQ08sWUFBWSxDQUFDTyxHQUFHLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUM7SUFDRmQsTUFBTSxDQUFDQyxJQUFJLENBQUNzQixXQUFXLENBQUNaLGtCQUFrQixDQUFDLENBQUNHLEdBQVcsRUFBRVUsS0FBVSxLQUFLO01BQ3ZFeEIsTUFBTSxDQUFDTyxZQUFZLENBQUNPLEdBQUcsQ0FBQyxHQUFHVSxLQUFLO01BQ2hDLE9BQU94QixNQUFNLENBQUNPLFlBQVksQ0FBQ08sR0FBRyxDQUFDO0lBQ2hDLENBQUMsQ0FBQztJQUVGZCxNQUFNLENBQUNDLElBQUksQ0FBQ3dCLFNBQVMsQ0FBQ2Qsa0JBQWtCLENBQUVlLElBQVksSUFBSztNQUMxRCxJQUFJQyxNQUFNLEdBQUdELElBQUksR0FBRzFCLE1BQU0sQ0FBQ08sWUFBWSxDQUFDbUIsSUFBSSxDQUFDLEdBQUcxQixNQUFNLENBQUNPLFlBQVk7TUFFbkUsSUFBSSxDQUFDb0IsTUFBTSxJQUFJRCxJQUFJLElBQUlBLElBQUksQ0FBQ0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1FBQzlDLE1BQU1DLEtBQUssR0FBR0gsSUFBSSxDQUFDSSxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQzdCSCxNQUFNLEdBQUdFLEtBQUssQ0FBQ0UsTUFBTSxDQUFDLENBQUNDLEdBQUcsRUFBRUMsSUFBUyxLQUFLO1VBQ3pDRCxHQUFHLEdBQUdDLElBQUksR0FBR0QsR0FBRyxDQUFDQyxJQUFJLENBQUMsR0FBR0QsR0FBRztVQUM1QixPQUFPQSxHQUFHO1FBQ1gsQ0FBQyxFQUFFaEMsTUFBTSxDQUFDTyxZQUFZLENBQUM7TUFDeEI7TUFFQSxPQUFPb0IsTUFBTTtJQUNkLENBQUMsQ0FBQztJQUVGM0IsTUFBTSxDQUFDQyxJQUFJLENBQUNpQyxPQUFPLENBQUN2QixrQkFBa0IsQ0FBQyxNQUFNWCxNQUFNLENBQUNPLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxRVAsTUFBTSxDQUFDQyxJQUFJLENBQUNrQyxVQUFVLENBQUN4QixrQkFBa0IsQ0FBQyxNQUFNWCxNQUFNLENBQUNRLFNBQVMsQ0FBQztJQUNqRVIsTUFBTSxDQUFDQyxJQUFJLENBQUNtQyxRQUFRLENBQUN6QixrQkFBa0IsQ0FBQztNQUFBO01BQUEsNEJBQU1YLE1BQU0sQ0FBQ1EsU0FBUyxzREFBaEIsa0JBQWtCNEIsUUFBUSxFQUFFO0lBQUEsRUFBQztJQUMzRXBDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDb0MsWUFBWSxDQUFDMUIsa0JBQWtCLENBQUMsQ0FBQzJCLElBQWEsRUFBRUMsa0JBQXdCLEVBQUVDLGlCQUEyQixLQUFLO01BQ3JIeEMsTUFBTSxDQUFDTSxZQUFZLEdBQUdnQyxJQUFJO0lBQzNCLENBQUMsQ0FBQztJQUNGdEMsTUFBTSxDQUFDQyxJQUFJLENBQUN3QyxXQUFXLENBQUM5QixrQkFBa0IsQ0FBQyxNQUFNWCxNQUFNLENBQUNNLFlBQVksQ0FBQztJQUNyRU4sTUFBTSxDQUFDQyxJQUFJLENBQUNGLFVBQVUsQ0FBQ1ksa0JBQWtCLENBQUMsTUFBTVgsTUFBTSxDQUFDUyxXQUFXLENBQUM7SUFFbkUsT0FBT1QsTUFBTTtFQUNkO0VBQ0E7QUFDQTtBQUNBO0VBRkE7RUFHTyxNQUFNMEMsV0FBcUYsR0FBRzlDLGlCQUF3Qjs7RUFFN0g7QUFDQTtBQUNBO0VBRkE7RUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTK0MsZUFBZSxDQUFDQyxNQUErQixFQUFhO0lBQzNFLE1BQU01QyxNQUFNLEdBQUdDLElBQUksQ0FBQzRDLEtBQUssQ0FBYztJQUN2QzdDLE1BQU0sQ0FBQzhDLE9BQU8sR0FBR0YsTUFBTSxJQUFJLENBQUMsQ0FBQzs7SUFFN0I7SUFDQTVDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDOEMsWUFBWSxDQUFDcEMsa0JBQWtCLENBQUVxQyxJQUFJLElBQUtoRCxNQUFNLENBQUM4QyxPQUFPLENBQUNFLElBQUksQ0FBQyxDQUFDO0lBQzNFaEQsTUFBTSxDQUFDQyxJQUFJLENBQUNnRCxhQUFhLENBQUN0QyxrQkFBa0IsQ0FBQyxNQUFNO01BQ2xELE9BQU9YLE1BQU0sQ0FBQzhDLE9BQU87SUFDdEIsQ0FBQyxDQUFDO0lBRUYsT0FBTzlDLE1BQU07RUFDZDtFQUNBO0FBQ0E7QUFDQTtFQUZBO0VBR08sTUFBTWtELFNBQTZELEdBQUdQLGVBQXNCOztFQUVuRztBQUNBO0FBQ0E7RUFGQTtFQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU1EscUJBQXFCLENBQUNDLFlBQW9CLEVBQUVDLFVBQXNCLEVBQW1CO0lBQ3BHLE1BQU1yRCxNQUFNLEdBQUdDLElBQUksQ0FBQ3FELGdCQUFnQixDQUFvQjtJQUN4REYsWUFBWSxHQUFHQSxZQUFZLElBQUksRUFBRTtJQUNqQ3BELE1BQU0sQ0FBQ3VELGNBQWMsR0FBR0gsWUFBWSxDQUFDL0IsR0FBRyxDQUFFbUMsV0FBVyxJQUFLO01BQ3pELE9BQU81RCxpQkFBaUIsQ0FBQzRELFdBQVcsRUFBRXhELE1BQU0sQ0FBQztJQUM5QyxDQUFDLENBQUM7SUFDRkEsTUFBTSxDQUFDeUQsVUFBVSxHQUFHSixVQUFVOztJQUU5QjtJQUNBckQsTUFBTSxDQUFDMEQsUUFBUSxHQUFJQyxLQUFnQixJQUFLO01BQ3ZDM0QsTUFBTSxDQUFDeUQsVUFBVSxHQUFHRSxLQUFLO0lBQzFCLENBQUM7O0lBRUQ7SUFDQTNELE1BQU0sQ0FBQ0MsSUFBSSxDQUFDUyxHQUFHLENBQUNDLGtCQUFrQixDQUFFQyxVQUFrQixJQUFLO01BQzFELE9BQU9BLFVBQVUsS0FBSyx3Q0FBd0M7SUFDL0QsQ0FBQyxDQUFDO0lBQ0ZaLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDMkQsZUFBZSxDQUFDakQsa0JBQWtCLENBQUMsTUFBTTtNQUNwRCxPQUFPUSxPQUFPLENBQUNDLE9BQU8sQ0FBQ3BCLE1BQU0sQ0FBQ3VELGNBQWMsQ0FBQztJQUM5QyxDQUFDLENBQUM7SUFDRnZELE1BQU0sQ0FBQ0MsSUFBSSxDQUFDNEQsa0JBQWtCLENBQUNsRCxrQkFBa0IsQ0FBQyxNQUFNO01BQ3ZELE9BQU9YLE1BQU0sQ0FBQ3VELGNBQWM7SUFDN0IsQ0FBQyxDQUFDO0lBQ0Z2RCxNQUFNLENBQUNDLElBQUksQ0FBQzZELHFCQUFxQixDQUFDbkQsa0JBQWtCLENBQUMsTUFBTTtNQUMxRCxPQUFPWCxNQUFNLENBQUN1RCxjQUFjO0lBQzdCLENBQUMsQ0FBQztJQUNGdkQsTUFBTSxDQUFDQyxJQUFJLENBQUM4RCxXQUFXLENBQUNwRCxrQkFBa0IsQ0FBQyxNQUFNO01BQ2hELE9BQU9YLE1BQU0sQ0FBQ3VELGNBQWM7SUFDN0IsQ0FBQyxDQUFDO0lBQ0Z2RCxNQUFNLENBQUNDLElBQUksQ0FBQ21DLFFBQVEsQ0FBQ3pCLGtCQUFrQixDQUFDLE1BQU07TUFDN0MsT0FBT1gsTUFBTSxDQUFDeUQsVUFBVTtJQUN6QixDQUFDLENBQUM7SUFDRnpELE1BQU0sQ0FBQ0MsSUFBSSxDQUFDK0QsZ0JBQWdCLENBQUNDLGVBQWUsQ0FBQyxNQUFNLENBQUM7SUFFcEQsT0FBT2pFLE1BQU07RUFDZDtFQUNBO0FBQ0E7QUFDQTtFQUZBO0VBR08sTUFBTWtFLGVBQWtGLEdBQUdmLHFCQUE0Qjs7RUFFOUg7QUFDQTtBQUNBO0VBRkE7RUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU2dCLHlCQUF5QixDQUFDM0MsS0FBVSxFQUFFRSxJQUFhLEVBQUUyQixVQUFzQixFQUF1QjtJQUNqSCxNQUFNckQsTUFBTSxHQUFHQyxJQUFJLENBQUNtRSxvQkFBb0IsQ0FBd0I7SUFDaEVwRSxNQUFNLENBQUN5RCxVQUFVLEdBQUdKLFVBQVU7SUFDOUJyRCxNQUFNLENBQUNxRSxNQUFNLEdBQUc3QyxLQUFLO0lBQ3JCeEIsTUFBTSxDQUFDc0UsS0FBSyxHQUFHNUMsSUFBSTs7SUFFbkI7SUFDQTFCLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDUyxHQUFHLENBQUNDLGtCQUFrQixDQUFFQyxVQUFrQixJQUFLO01BQzFELE9BQU9BLFVBQVUsS0FBSyw0Q0FBNEM7SUFDbkUsQ0FBQyxDQUFDO0lBQ0ZaLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDbUMsUUFBUSxDQUFDekIsa0JBQWtCLENBQUMsTUFBTTtNQUM3QyxPQUFPWCxNQUFNLENBQUN5RCxVQUFVO0lBQ3pCLENBQUMsQ0FBQztJQUNGekQsTUFBTSxDQUFDQyxJQUFJLENBQUNzRSxRQUFRLENBQUM1RCxrQkFBa0IsQ0FBQyxNQUFNO01BQzdDLE9BQU9YLE1BQU0sQ0FBQ3FFLE1BQU07SUFDckIsQ0FBQyxDQUFDO0lBQ0ZyRSxNQUFNLENBQUNDLElBQUksQ0FBQ2lDLE9BQU8sQ0FBQ3ZCLGtCQUFrQixDQUFDLE1BQU07TUFDNUMsT0FBT1gsTUFBTSxDQUFDc0UsS0FBSztJQUNwQixDQUFDLENBQUM7SUFFRixPQUFPdEUsTUFBTTtFQUNkO0VBQ0E7QUFDQTtBQUNBO0VBRkE7RUFHTyxNQUFNd0UsbUJBQW9GLEdBQUdMLHlCQUFnQzs7RUFFcEk7QUFDQTtBQUNBO0VBRkE7RUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTTSwwQkFBMEIsQ0FBQ0MsU0FBZ0MsRUFBd0I7SUFDbEcsTUFBTTFFLE1BQU0sR0FBR0MsSUFBSSxDQUFDMEUsZ0JBQWdCLENBQXlCO0lBQzdEM0UsTUFBTSxDQUFDNEUsVUFBVSxHQUFHRixTQUFTOztJQUU3QjtJQUNBMUUsTUFBTSxDQUFDQyxJQUFJLENBQUNTLEdBQUcsQ0FBQ0Msa0JBQWtCLENBQUVDLFVBQWtCLElBQUs7TUFDMUQsT0FBT0EsVUFBVSxLQUFLLCtCQUErQjtJQUN0RCxDQUFDLENBQUM7SUFDRlosTUFBTSxDQUFDQyxJQUFJLENBQUM0RSxXQUFXLENBQUNsRSxrQkFBa0IsQ0FBQyxNQUFNO01BQ2hELE9BQU9YLE1BQU0sQ0FBQzRFLFVBQVU7SUFDekIsQ0FBQyxDQUFDO0lBQ0Y1RSxNQUFNLENBQUNDLElBQUksQ0FBQ3NFLFFBQVEsQ0FBQzVELGtCQUFrQixDQUFDLE1BQU07TUFDN0MsT0FBT1gsTUFBTSxDQUFDNEUsVUFBVSxDQUFDdkQsR0FBRyxDQUFFeUQsT0FBTyxJQUFLQSxPQUFPLENBQUNQLFFBQVEsRUFBRSxDQUFDO0lBQzlELENBQUMsQ0FBQztJQUVGLE9BQU92RSxNQUFNO0VBQ2Q7RUFDQTtBQUNBO0FBQ0E7RUFGQTtFQUdPLE1BQU0rRSxvQkFBb0YsR0FBR04sMEJBQWlDOztFQUVySTtBQUNBO0FBQ0E7RUFGQTtFQWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNPLHdCQUF3QixDQUFDQyxRQUFjLEVBQUU1QixVQUFzQixFQUFzQjtJQUNwRyxNQUFNckQsTUFBTSxHQUFHQyxJQUFJLENBQUNpRixtQkFBbUIsQ0FBdUI7SUFDOURsRixNQUFNLENBQUNtRixTQUFTLEdBQUc5QixVQUFVO0lBQzdCckQsTUFBTSxDQUFDb0YsWUFBWSxHQUFHeEYsaUJBQWlCLENBQUNxRixRQUFRLElBQUksQ0FBQyxDQUFDLEVBQUVqRixNQUFNLENBQUM7O0lBRS9EO0lBQ0FBLE1BQU0sQ0FBQ3FGLHNCQUFzQixHQUFHLE1BQU07TUFDckMsT0FBT3JGLE1BQU0sQ0FBQ29GLFlBQVk7SUFDM0IsQ0FBQztJQUNEcEYsTUFBTSxDQUFDMEQsUUFBUSxHQUFJNEIsTUFBaUIsSUFBSztNQUN4Q3RGLE1BQU0sQ0FBQ21GLFNBQVMsR0FBR0csTUFBTTtJQUMxQixDQUFDOztJQUVEO0lBQ0F0RixNQUFNLENBQUNDLElBQUksQ0FBQ1MsR0FBRyxDQUFDQyxrQkFBa0IsQ0FBRUMsVUFBa0IsSUFBSztNQUMxRCxPQUFPQSxVQUFVLEtBQUssMkNBQTJDO0lBQ2xFLENBQUMsQ0FBQztJQUNGWixNQUFNLENBQUNDLElBQUksQ0FBQ3NGLGVBQWUsQ0FBQzVFLGtCQUFrQixDQUFDLE1BQU07TUFDcEQsT0FBT1gsTUFBTSxDQUFDb0YsWUFBWTtJQUMzQixDQUFDLENBQUM7SUFDRnBGLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDbUMsUUFBUSxDQUFDekIsa0JBQWtCLENBQUMsTUFBTTtNQUM3QyxPQUFPWCxNQUFNLENBQUNtRixTQUFTO0lBQ3hCLENBQUMsQ0FBQztJQUNGbkYsTUFBTSxDQUFDQyxJQUFJLENBQUN1RixPQUFPLENBQUNDLGlCQUFpQixDQUFDLElBQUksQ0FBQztJQUUzQyxPQUFPekYsTUFBTTtFQUNkO0VBQ0E7QUFDQTtBQUNBO0VBRkE7RUFHTyxNQUFNMEYsa0JBQXNGLEdBQUdWLHdCQUErQjs7RUFFckk7QUFDQTtBQUNBO0VBRkE7RUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTVyxtQkFBbUIsQ0FBQ0MsU0FBZSxFQUFpQjtJQUNuRSxNQUFNNUYsTUFBTSxHQUFHQyxJQUFJLENBQUM0RixjQUFjLENBQWtCO0lBQ3BEN0YsTUFBTSxDQUFDOEYsWUFBWSxHQUFHbEcsaUJBQWlCLENBQUNnRyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUM7O0lBRXhEO0lBQ0E1RixNQUFNLENBQUNDLElBQUksQ0FBQzhGLGNBQWMsQ0FBQ3BGLGtCQUFrQixDQUFFcUYsS0FBYSxJQUFLO01BQ2hFLE9BQU9wRyxpQkFBaUIsQ0FBQztRQUFFcUcsS0FBSyxFQUFFRDtNQUFNLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7SUFDRmhHLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDd0IsU0FBUyxDQUFDZCxrQkFBa0IsQ0FBRXFGLEtBQWEsSUFBSztNQUMzRCxPQUFPaEcsTUFBTSxDQUFDOEYsWUFBWSxDQUFDakYsV0FBVyxDQUFDbUYsS0FBSyxDQUFDO0lBQzlDLENBQUMsQ0FBQztJQUNGaEcsTUFBTSxDQUFDQyxJQUFJLENBQUNpRyxvQkFBb0IsQ0FBQ3ZGLGtCQUFrQixDQUFFcUYsS0FBYSxJQUFLO01BQ3RFLE9BQU9wRyxpQkFBaUIsQ0FBQztRQUFFcUcsS0FBSyxFQUFFRDtNQUFNLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7SUFDRmhHLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDa0csV0FBVyxDQUFDeEYsa0JBQWtCLENBQUVxRixLQUFhLElBQUs7TUFDN0QsTUFBTUksU0FBUyxHQUFHLElBQUlQLGNBQWMsRUFBRTtNQUN0QyxPQUFPRyxLQUFLLEdBQUdJLFNBQVMsQ0FBQ0QsV0FBVyxDQUFDSCxLQUFLLENBQUMsR0FBR0EsS0FBSztJQUNwRCxDQUFDLENBQUM7SUFFRixPQUFPaEcsTUFBTTtFQUNkO0VBQ0E7QUFDQTtBQUNBO0VBRkE7RUFHTyxNQUFNcUcsYUFBcUQsR0FBR1YsbUJBQTBCOztFQUUvRjtBQUNBO0FBQ0E7RUFGQTtFQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU1csZUFBZSxDQUFDQyxnQkFBa0MsRUFBRUMsbUJBQXdDLEVBQWE7SUFDeEgsTUFBTXhHLE1BQU0sR0FBR0MsSUFBSSxDQUFDd0csVUFBVSxDQUFjO0lBQzVDekcsTUFBTSxDQUFDMEcsZUFBZSxHQUFHSCxnQkFBZ0I7SUFDekN2RyxNQUFNLENBQUMyRyxrQkFBa0IsR0FBR0gsbUJBQW1CO0lBQy9DLElBQUlELGdCQUFnQixFQUFFO01BQ3JCQSxnQkFBZ0IsQ0FBQzdDLFFBQVEsQ0FBQzFELE1BQU0sQ0FBQztJQUNsQztJQUNBLElBQUl3RyxtQkFBbUIsRUFBRTtNQUN4QkEsbUJBQW1CLENBQUM5QyxRQUFRLENBQUMxRCxNQUFNLENBQUM7SUFDckM7O0lBRUE7SUFDQUEsTUFBTSxDQUFDNEcsWUFBWSxHQUFJQyxVQUF5QixJQUFLO01BQ3BEN0csTUFBTSxDQUFDNkcsVUFBVSxHQUFHQSxVQUFVO0lBQy9CLENBQUM7O0lBRUQ7SUFDQTdHLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDNkcsUUFBUSxDQUFDbkcsa0JBQWtCLENBQUMsTUFBTTtNQUM3QyxPQUFPWCxNQUFNLENBQUMwRyxlQUFlO0lBQzlCLENBQUMsQ0FBQztJQUNGMUcsTUFBTSxDQUFDQyxJQUFJLENBQUM4RyxXQUFXLENBQUNwRyxrQkFBa0IsQ0FBQyxNQUFNO01BQ2hELE9BQU9YLE1BQU0sQ0FBQzJHLGtCQUFrQjtJQUNqQyxDQUFDLENBQUM7SUFDRjNHLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDK0csWUFBWSxDQUFDckcsa0JBQWtCLENBQUMsTUFBTTtNQUNqRCxPQUFPWCxNQUFNLENBQUM2RyxVQUFVO0lBQ3pCLENBQUMsQ0FBQztJQUVGLE9BQU83RyxNQUFNO0VBQ2Q7RUFDQTtBQUNBO0FBQ0E7RUFGQTtFQUdPLE1BQU1pSCxTQUEwRyxHQUN0SFgsZUFBc0I7RUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEE7RUFNTyxTQUFTWSw4QkFBOEIsQ0FBQ1gsZ0JBQWlDLEVBQWE7SUFDNUYsT0FBT0QsZUFBZSxDQUFDQyxnQkFBZ0IsQ0FBQztFQUN6QztFQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxBO0VBTU8sU0FBU1ksaUNBQWlDLENBQUNYLG1CQUF1QyxFQUFhO0lBQ3JHLE9BQU9GLGVBQWUsQ0FBQ2MsU0FBUyxFQUFFWixtQkFBbUIsQ0FBQztFQUN2RDs7RUFFQTtBQUNBO0FBQ0E7RUFGQTtFQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTYSxjQUFjLEdBQWE7SUFDMUMsTUFBTXJILE1BQU0sR0FBR0MsSUFBSSxDQUFDcUgsSUFBSSxDQUFDOztJQUV6QjtJQUNBdEgsTUFBTSxDQUFDQyxJQUFJLENBQUNTLEdBQUcsQ0FBQ0Msa0JBQWtCLENBQUVDLFVBQWtCLElBQUs7TUFDMUQsT0FBT0EsVUFBVSxLQUFLLHNCQUFzQjtJQUM3QyxDQUFDLENBQUM7SUFFRixPQUFPWixNQUFNO0VBQ2Q7RUFDQTtBQUNBO0FBQ0E7RUFGQTtFQUdPLE1BQU11SCxRQUE0QixHQUFHRixjQUFxQjs7RUFFakU7QUFDQTtBQUNBO0VBRkE7RUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0csb0JBQW9CLEdBQW1CO0lBQ3RELE1BQU14SCxNQUFNLEdBQUdDLElBQUksQ0FBQ3dILFVBQVUsQ0FBbUI7SUFDakR6SCxNQUFNLENBQUMwSCxRQUFRLEdBQUd6SCxJQUFJLENBQUMwSCxlQUFlLENBQUM7SUFDdkMzSCxNQUFNLENBQUM0SCxZQUFZLEdBQUczSCxJQUFJLENBQUM0SCxXQUFXLENBQUM7SUFDdkM3SCxNQUFNLENBQUM4SCxRQUFRLEdBQUc3SCxJQUFJLENBQUM4SCxRQUFRLENBQUM7SUFDaEMvSCxNQUFNLENBQUNnSSxLQUFLLEdBQUcvSCxJQUFJLENBQUNnSSxLQUFLLENBQUM7SUFDMUJqSSxNQUFNLENBQUNrSSxlQUFlLEdBQUdqSSxJQUFJLENBQUNrSSxlQUFlLENBQUM7SUFDOUNuSSxNQUFNLENBQUNvSSxlQUFlLEdBQUdDLElBQUksQ0FBQ0MsRUFBRSxFQUFFLENBQUNyRSxlQUFlLENBQUNoRSxJQUFJLENBQUNzSSxZQUFZLENBQUMsQ0FBQztJQUN0RTtJQUNBdkksTUFBTSxDQUFDQyxJQUFJLENBQUN1SSxPQUFPLENBQUN2RSxlQUFlLENBQUNvRCxjQUFjLEVBQUUsQ0FBQztJQUNyRHJILE1BQU0sQ0FBQ0MsSUFBSSxDQUFDUyxHQUFHLENBQUN1RCxlQUFlLENBQUMsS0FBSyxDQUFDO0lBRXRDLE9BQU9qRSxNQUFNO0VBQ2Q7RUFDQTtBQUNBO0FBQ0E7RUFGQTtFQUdPLE1BQU15SSxjQUF3QyxHQUFHakIsb0JBQTJCO0VBQUM7RUFPcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU2tCLE9BQU8sQ0FBQ0MsUUFBMkIsRUFBVztJQUM3RCxNQUFNaEYsS0FBSyxHQUFHLENBQUFnRixRQUFRLGFBQVJBLFFBQVEsdUJBQVJBLFFBQVEsQ0FBRWhGLEtBQUssS0FBSTJDLGVBQWUsRUFBRTtJQUNsRCxNQUFNc0MsSUFBSSxHQUFHLENBQUFELFFBQVEsYUFBUkEsUUFBUSx1QkFBUkEsUUFBUSxDQUFFQyxJQUFJLEtBQUl2QixjQUFjLEVBQUU7SUFDL0MsTUFBTXdCLFVBQVUsR0FBRyxDQUFBRixRQUFRLGFBQVJBLFFBQVEsdUJBQVJBLFFBQVEsQ0FBRUUsVUFBVSxLQUFJckIsb0JBQW9CLEVBQUU7SUFFakVvQixJQUFJLENBQUMzSSxJQUFJLENBQUM2SSxhQUFhLENBQUM3RSxlQUFlLENBQUM0RSxVQUFVLENBQUM7SUFDbkRELElBQUksQ0FBQzNJLElBQUksQ0FBQ21DLFFBQVEsQ0FBQzZCLGVBQWUsQ0FBQ04sS0FBSyxDQUFDO0lBQ3pDa0YsVUFBVSxDQUFDNUksSUFBSSxDQUFDdUksT0FBTyxDQUFDdkUsZUFBZSxDQUFDMkUsSUFBSSxDQUFDO0lBRTdDLE9BQU87TUFBRWpGLEtBQUs7TUFBRWlGLElBQUk7TUFBRUM7SUFBVyxDQUFDO0VBQ25DOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQQTtFQVFPLFNBQVNFLE9BQU8sQ0FBQ0MsTUFBYyxFQUFFQyxVQUFrQixFQUFFQyxRQUFpQixFQUFFO0lBQzlFLE1BQU1DLGFBQWEsR0FBRyxJQUFJQyxhQUFhLENBQUM7TUFDdkNDLFVBQVUsRUFBRSwyQkFBMkI7TUFDdkNDLFdBQVcsRUFBRSxDQUFDO1FBQUVELFVBQVUsRUFBRTtNQUE4QixDQUFDLEVBQUU7UUFBRUEsVUFBVSxFQUFFO01BQWlDLENBQUMsQ0FBQztNQUM5R0UsS0FBSyxFQUFFO0lBQ1IsQ0FBQyxDQUFDO0lBQ0YsT0FBT0osYUFBYSxDQUFDSixPQUFPLENBQUNDLE1BQU0sRUFBRUMsVUFBVSxFQUFFQyxRQUFRLENBQUM7RUFDM0Q7O0VBRUE7QUFDQTtBQUNBO0VBRkE7RUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU00sdUJBQXVCLEdBQXNCO0lBQzVELE1BQU14SixNQUFNLEdBQUdDLElBQUksQ0FBQ21KLGFBQWEsQ0FBQztJQUNsQ3BKLE1BQU0sQ0FBQytJLE9BQU8sR0FBR1YsSUFBSSxDQUFDQyxFQUFFLEVBQUUsQ0FBQzNILGtCQUFrQixDQUFDb0ksT0FBTyxDQUFDO0lBQ3RELE9BQU8vSSxNQUFNO0VBQ2Q7RUFBQztFQUFBO0FBQUEifQ==
496
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVNb2NrQ29udGV4dCIsIm9Db250ZXh0RGF0YSIsIm9CaW5kaW5nIiwiaXNJbmFjdGl2ZSIsIm1vY2tlZCIsIm1vY2siLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIkNvbnRleHQiLCJjcmVhdGVOZXdDb250ZXh0IiwiX2lzS2VwdEFsaXZlIiwiX2NvbnRleHREYXRhIiwiX29CaW5kaW5nIiwiX2lzSW5hY3RpdmUiLCJpc0EiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJzQ2xhc3NOYW1lIiwiZ2V0UHJvcGVydHkiLCJrZXkiLCJyZXF1ZXN0UHJvcGVydHkiLCJrZXlPcktleXMiLCJBcnJheSIsImlzQXJyYXkiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm1hcCIsInJlcXVlc3RPYmplY3QiLCJzZXRQcm9wZXJ0eSIsInZhbHVlIiwiZ2V0T2JqZWN0IiwicGF0aCIsInJlc3VsdCIsImluZGV4T2YiLCJwYXJ0cyIsInNwbGl0IiwicmVkdWNlIiwic3VtIiwicGFydCIsImdldFBhdGgiLCJnZXRCaW5kaW5nIiwiZ2V0TW9kZWwiLCJzZXRLZWVwQWxpdmUiLCJib29sIiwiX2ZuT25CZWZvcmVEZXN0cm95IiwiX2JSZXF1ZXN0TWVzc2FnZXMiLCJpc0tlZXBBbGl2ZSIsIk1vY2tDb250ZXh0IiwiY3JlYXRlTW9ja0V2ZW50IiwicGFyYW1zIiwic291cmNlIiwiRXZlbnQiLCJfcGFyYW1zIiwiZ2V0U291cmNlIiwibW9ja1JldHVyblZhbHVlIiwiZ2V0UGFyYW1ldGVyIiwibmFtZSIsImdldFBhcmFtZXRlcnMiLCJNb2NrRXZlbnQiLCJjcmVhdGVNb2NrTGlzdEJpbmRpbmciLCJhQ29udGV4dERhdGEiLCJvTW9ja01vZGVsIiwiT0RhdGFMaXN0QmluZGluZyIsIl9hTW9ja0NvbnRleHRzIiwiY29udGV4dERhdGEiLCJfbW9ja01vZGVsIiwic2V0TW9kZWwiLCJtb2RlbCIsInJlcXVlc3RDb250ZXh0cyIsImdldEN1cnJlbnRDb250ZXh0cyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImdldENvbnRleHRzIiwiZ2V0VXBkYXRlR3JvdXBJZCIsIk1vY2tMaXN0QmluZGluZyIsImNyZWF0ZU1vY2tQcm9wZXJ0eUJpbmRpbmciLCJPRGF0YVByb3BlcnR5QmluZGluZyIsIl92YWx1ZSIsIl9wYXRoIiwiZ2V0VmFsdWUiLCJNb2NrUHJvcGVydHlCaW5kaW5nIiwiY3JlYXRlTW9ja0NvbXBvc2l0ZUJpbmRpbmciLCJhQmluZGluZ3MiLCJDb21wb3NpdGVCaW5kaW5nIiwiX2FCaW5kaW5ncyIsImdldEJpbmRpbmdzIiwiYmluZGluZyIsIk1vY2tDb21wb3NpdGVCaW5kaW5nIiwiY3JlYXRlTW9ja0NvbnRleHRCaW5kaW5nIiwib0NvbnRleHQiLCJPRGF0YUNvbnRleHRCaW5kaW5nIiwibW9ja01vZGVsIiwib01vY2tDb250ZXh0IiwiZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCIsIm9Nb2RlbCIsImdldEJvdW5kQ29udGV4dCIsImV4ZWN1dGUiLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsIk1vY2tDb250ZXh0QmluZGluZyIsImNyZWF0ZU1vY2tNZXRhTW9kZWwiLCJvTWV0YURhdGEiLCJPRGF0YU1ldGFNb2RlbCIsIm9NZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0Iiwic1BhdGgiLCIkcGF0aCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiZ2V0TWV0YVBhdGgiLCJtZXRhbW9kZWwiLCJNb2NrTWV0YU1vZGVsIiwiY3JlYXRlTW9ja01vZGVsIiwib01vY2tMaXN0QmluZGluZyIsIm9Nb2NrQ29udGV4dEJpbmRpbmciLCJPRGF0YU1vZGVsIiwiZm5PcHRpbWlzdGljQmF0Y2hFbmFibGVyIiwibW9ja0xpc3RCaW5kaW5nIiwibW9ja0NvbnRleHRCaW5kaW5nIiwic2V0TWV0YU1vZGVsIiwib01ldGFNb2RlbCIsImJpbmRMaXN0IiwiYmluZENvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJNb2NrTW9kZWwiLCJjcmVhdGVNb2NrTW9kZWxGcm9tTGlzdEJpbmRpbmciLCJjcmVhdGVNb2NrTW9kZWxGcm9tQ29udGV4dEJpbmRpbmciLCJ1bmRlZmluZWQiLCJjcmVhdGVNb2NrVmlldyIsIlZpZXciLCJNb2NrVmlldyIsImNyZWF0ZU1vY2tDb250cm9sbGVyIiwiQ29udHJvbGxlciIsIl9yb3V0aW5nIiwiSW50ZXJuYWxSb3V0aW5nIiwiX3NpZGVFZmZlY3RzIiwiU2lkZUVmZmVjdHMiLCJlZGl0RmxvdyIsIkVkaXRGbG93Iiwic2hhcmUiLCJTaGFyZSIsImNvbGxhYm9yYXRpdmVEcmFmdCIsIkNvbGxhYm9yYXRpdmVEcmFmdCIsInJlY29tbWVuZGF0aW9ucyIsIlJlY29tbWVuZGF0aW9ucyIsImdldEFwcENvbXBvbmVudCIsImplc3QiLCJmbiIsIkFwcENvbXBvbmVudCIsImdldFZpZXciLCJNb2NrQ29udHJvbGxlciIsIm1vY2tNVkMiLCJleGlzdGluZyIsInZpZXciLCJjb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsImdldFRleHQiLCJ0ZXh0SUQiLCJwYXJhbWV0ZXJzIiwibWV0YVBhdGgiLCJyZXNvdXJjZU1vZGVsIiwiUmVzb3VyY2VNb2RlbCIsImJ1bmRsZU5hbWUiLCJlbmhhbmNlV2l0aCIsImFzeW5jIiwiY3JlYXRlTW9ja1Jlc291cmNlTW9kZWwiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBXaXRoTW9jayB9IGZyb20gXCJAc2FwLXV4L2plc3QtbW9jay11aTUvZGlzdC9nZW5lcmljXCI7XG5pbXBvcnQgeyBtb2NrIH0gZnJvbSBcIkBzYXAtdXgvamVzdC1tb2NrLXVpNS9kaXN0L2dlbmVyaWNcIjtcbmltcG9ydCBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgQ29sbGFib3JhdGl2ZURyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9Db2xsYWJvcmF0aXZlRHJhZnRcIjtcbmltcG9ydCBFZGl0RmxvdyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvRWRpdEZsb3dcIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IFJlY29tbWVuZGF0aW9ucyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUmVjb21tZW5kYXRpb25zXCI7XG5pbXBvcnQgU2hhcmUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NoYXJlXCI7XG5pbXBvcnQgU2lkZUVmZmVjdHMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NpZGVFZmZlY3RzXCI7XG5pbXBvcnQgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgQ29udHJvbGxlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL21kYy9Db250cm9sXCI7XG5pbXBvcnQgQ29tcG9zaXRlQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0NvbXBvc2l0ZUJpbmRpbmdcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YVByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFxuICovXG5leHBvcnQgdHlwZSBNb2NrQ29udGV4dCA9IFdpdGhNb2NrPENvbnRleHQ+ICYge1xuXHRfaXNLZXB0QWxpdmU6IGJvb2xlYW47XG5cdF9jb250ZXh0RGF0YTogYW55O1xuXHRfb0JpbmRpbmc6IGFueTtcblx0X2lzSW5hY3RpdmU6IGJvb2xlYW47XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrQ29udGV4dC5cbiAqXG4gKiBAcGFyYW0gb0NvbnRleHREYXRhIEEgbWFwIG9mIHRoZSBkaWZmZXJlbnQgcHJvcGVydGllcyBvZiB0aGUgY29udGV4dC4gVGhlIHZhbHVlIGZvciB0aGUga2V5ICckcGF0aCcgd2lsbCBiZSByZXR1cm5lZCBieSB0aGUgJ2dldFBhdGgnIG1ldGhvZFxuICogQHBhcmFtIG9CaW5kaW5nIFRoZSBiaW5kaW5nIG9mIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0gaXNJbmFjdGl2ZSBJcyB0aGUgY29udGV4dCBpbmlhY3RpdmUgb3Igbm90XG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrQ29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRleHQob0NvbnRleHREYXRhPzogYW55LCBvQmluZGluZz86IGFueSwgaXNJbmFjdGl2ZT86IGJvb2xlYW4pOiBNb2NrQ29udGV4dCB7XG5cdC8vIFVnbHkgd29ya2Fyb3VuZCB0byBnZXQgYSBwcm9wZXIgbW9jayBwYmplY3QsIGFzIENvbnRleHQgaXNuJ3QgcHJvcGVybHkgZXhwb3J0ZWQgZnJvbSBVSTVcblx0Y29uc3QgbW9ja2VkID0gbW9jayhPYmplY3QuZ2V0UHJvdG90eXBlT2YoKENvbnRleHQgYXMgYW55KS5jcmVhdGVOZXdDb250ZXh0KG51bGwsIG51bGwsIFwiL2VcIikpKSBhcyBNb2NrQ29udGV4dDtcblx0bW9ja2VkLl9pc0tlcHRBbGl2ZSA9IGZhbHNlO1xuXHRtb2NrZWQuX2NvbnRleHREYXRhID0gb0NvbnRleHREYXRhIHx8IHt9O1xuXHRtb2NrZWQuX29CaW5kaW5nID0gb0JpbmRpbmc7XG5cdG1vY2tlZC5faXNJbmFjdGl2ZSA9ICEhaXNJbmFjdGl2ZTtcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrSW1wbGVtZW50YXRpb24oKHNDbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCI7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRQcm9wZXJ0eS5tb2NrSW1wbGVtZW50YXRpb24oKGtleTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fY29udGV4dERhdGFba2V5XTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLnJlcXVlc3RQcm9wZXJ0eS5tb2NrSW1wbGVtZW50YXRpb24oKGtleU9yS2V5czogc3RyaW5nIHwgc3RyaW5nW10pID0+IHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShrZXlPcktleXMpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGtleU9yS2V5cy5tYXAoKGtleSkgPT4gbW9ja2VkLl9jb250ZXh0RGF0YVtrZXldKSk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobW9ja2VkLl9jb250ZXh0RGF0YVtrZXlPcktleXNdKTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLnJlcXVlc3RPYmplY3QubW9ja0ltcGxlbWVudGF0aW9uKChrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuXHRcdHJldHVybiBrZXkgPyBQcm9taXNlLnJlc29sdmUobW9ja2VkLl9jb250ZXh0RGF0YVtrZXldKSA6IG1vY2tlZC5fY29udGV4dERhdGE7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5zZXRQcm9wZXJ0eS5tb2NrSW1wbGVtZW50YXRpb24oKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG5cdFx0bW9ja2VkLl9jb250ZXh0RGF0YVtrZXldID0gdmFsdWU7XG5cdFx0cmV0dXJuIG1vY2tlZC5fY29udGV4dERhdGFba2V5XTtcblx0fSk7XG5cblx0bW9ja2VkLm1vY2suZ2V0T2JqZWN0Lm1vY2tJbXBsZW1lbnRhdGlvbigocGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0bGV0IHJlc3VsdCA9IHBhdGggPyBtb2NrZWQuX2NvbnRleHREYXRhW3BhdGhdIDogbW9ja2VkLl9jb250ZXh0RGF0YTtcblxuXHRcdGlmICghcmVzdWx0ICYmIHBhdGggJiYgcGF0aC5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0cmVzdWx0ID0gcGFydHMucmVkdWNlKChzdW0sIHBhcnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRzdW0gPSBwYXJ0ID8gc3VtW3BhcnRdIDogc3VtO1xuXHRcdFx0XHRyZXR1cm4gc3VtO1xuXHRcdFx0fSwgbW9ja2VkLl9jb250ZXh0RGF0YSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSk7XG5cblx0bW9ja2VkLm1vY2suZ2V0UGF0aC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9jb250ZXh0RGF0YVtcIiRwYXRoXCJdKTtcblx0bW9ja2VkLm1vY2suZ2V0QmluZGluZy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9vQmluZGluZyk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBtb2NrZWQuX29CaW5kaW5nPy5nZXRNb2RlbCgpKTtcblx0bW9ja2VkLm1vY2suc2V0S2VlcEFsaXZlLm1vY2tJbXBsZW1lbnRhdGlvbigoYm9vbDogYm9vbGVhbiwgX2ZuT25CZWZvcmVEZXN0cm95PzogYW55LCBfYlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4pID0+IHtcblx0XHRtb2NrZWQuX2lzS2VwdEFsaXZlID0gYm9vbDtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmlzS2VlcEFsaXZlLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBtb2NrZWQuX2lzS2VwdEFsaXZlKTtcblx0bW9ja2VkLm1vY2suaXNJbmFjdGl2ZS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gbW9ja2VkLl9pc0luYWN0aXZlKTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRleHQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tDb250ZXh0OiBuZXcgKG9WYWx1ZXM/OiBhbnksIG9CaW5kaW5nPzogYW55LCBpc0luYWN0aXZlPzogYm9vbGVhbikgPT4gTW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dCBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkuYmFzZS5FdmVudFxuICovXG5leHBvcnQgdHlwZSBNb2NrRXZlbnQgPSBXaXRoTW9jazxFdmVudD4gJiB7XG5cdF9wYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrRXZlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyBUaGUgcGFyYW1ldGVycyBvZiB0aGUgZXZlbnRcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tFdmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0V2ZW50KHBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9LCBzb3VyY2U/OiBDb250cm9sKTogTW9ja0V2ZW50IHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhFdmVudCkgYXMgTW9ja0V2ZW50O1xuXHRtb2NrZWQuX3BhcmFtcyA9IHBhcmFtcyB8fCB7fTtcblxuXHRpZiAoc291cmNlKSB7XG5cdFx0bW9ja2VkLm1vY2suZ2V0U291cmNlLm1vY2tSZXR1cm5WYWx1ZShzb3VyY2UpO1xuXHR9XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5nZXRQYXJhbWV0ZXIubW9ja0ltcGxlbWVudGF0aW9uKChuYW1lKSA9PiBtb2NrZWQuX3BhcmFtc1tuYW1lXSk7XG5cdG1vY2tlZC5tb2NrLmdldFBhcmFtZXRlcnMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9wYXJhbXM7XG5cdH0pO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrRXZlbnQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tFdmVudDogbmV3IChwYXJhbXM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA9PiBNb2NrRXZlbnQgPSBjcmVhdGVNb2NrRXZlbnQgYXMgYW55O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIGEgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja0xpc3RCaW5kaW5nID0gV2l0aE1vY2s8T0RhdGFMaXN0QmluZGluZz4gJiB7XG5cdF9hTW9ja0NvbnRleHRzOiBNb2NrQ29udGV4dFtdO1xuXHRfbW9ja01vZGVsPzogTW9ja01vZGVsO1xuXG5cdC8qKlxuXHQgKiBVdGlsaXR5IG1ldGhvZCB0byBzZXQgdGhlIG1vZGVsIG9mIHRoZSBMaXN0QmluZGluZ1xuXHQgKi9cblx0c2V0TW9kZWw6IChtb2RlbDogTW9ja01vZGVsKSA9PiB2b2lkO1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja0xpc3RCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSBhQ29udGV4dERhdGEgQW4gYXJyYXkgb2Ygb2JqZWN0cyBob2xkaW5nIHRoZSBkaWZmZXJlbnQgcHJvcGVydGllcyBvZiB0aGUgY29udGV4dHMgcmVmZXJlbmNlZCBieSB0aGUgTGlzdEJpbmRpbmdcbiAqIEBwYXJhbSBvTW9ja01vZGVsIFRoZSBtb2RlbCBvZiB0aGUgTGlzdEJpbmRpbmdcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tMaXN0QmluZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0xpc3RCaW5kaW5nKGFDb250ZXh0RGF0YT86IGFueVtdLCBvTW9ja01vZGVsPzogTW9ja01vZGVsKTogTW9ja0xpc3RCaW5kaW5nIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhPRGF0YUxpc3RCaW5kaW5nKSBhcyBNb2NrTGlzdEJpbmRpbmc7XG5cdGFDb250ZXh0RGF0YSA9IGFDb250ZXh0RGF0YSB8fCBbXTtcblx0bW9ja2VkLl9hTW9ja0NvbnRleHRzID0gYUNvbnRleHREYXRhLm1hcCgoY29udGV4dERhdGEpID0+IHtcblx0XHRyZXR1cm4gY3JlYXRlTW9ja0NvbnRleHQoY29udGV4dERhdGEsIG1vY2tlZCk7XG5cdH0pO1xuXHRtb2NrZWQuX21vY2tNb2RlbCA9IG9Nb2NrTW9kZWw7XG5cblx0Ly8gVXRpbGl0eSBBUElcblx0bW9ja2VkLnNldE1vZGVsID0gKG1vZGVsOiBNb2NrTW9kZWwpID0+IHtcblx0XHRtb2NrZWQuX21vY2tNb2RlbCA9IG1vZGVsO1xuXHR9O1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suaXNBLm1vY2tJbXBsZW1lbnRhdGlvbigoc0NsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIjtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLnJlcXVlc3RDb250ZXh0cy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobW9ja2VkLl9hTW9ja0NvbnRleHRzKTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldEN1cnJlbnRDb250ZXh0cy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQuX2FNb2NrQ29udGV4dHM7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRBbGxDdXJyZW50Q29udGV4dHMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9hTW9ja0NvbnRleHRzO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0Q29udGV4dHMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9hTW9ja0NvbnRleHRzO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0TW9kZWwubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9tb2NrTW9kZWw7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRVcGRhdGVHcm91cElkLm1vY2tSZXR1cm5WYWx1ZShcImF1dG9cIik7XG5cblx0cmV0dXJuIG1vY2tlZDtcbn1cbi8qKlxuICogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgd2Uga2VlcCBhIG5ldyBvcGVyYXRvci4gVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZU1vY2tMaXN0QmluZGluZyBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja0xpc3RCaW5kaW5nOiBuZXcgKGFDb250ZXh0cz86IGFueVtdLCBtb2NrTW9kZWw/OiBNb2NrTW9kZWwpID0+IE1vY2tMaXN0QmluZGluZyA9IGNyZWF0ZU1vY2tMaXN0QmluZGluZyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja1Byb3BlcnR5QmluZGluZyA9IFdpdGhNb2NrPE9EYXRhUHJvcGVydHlCaW5kaW5nPiAmIHtcblx0X3ZhbHVlPzogYW55O1xuXHRfcGF0aD86IHN0cmluZztcblx0X21vY2tNb2RlbD86IE1vY2tNb2RlbDtcbn07XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tQcm9wZXJ0eUJpbmRpbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSByZXR1cm5kIGJ5IHRoZSBQcm9wZXJ0eUJpbmRpbmdcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBQcm9wZXJ0eUJpbmRpbmdcbiAqIEBwYXJhbSBvTW9ja01vZGVsIFRoZSBtb2RlbCBvZiB0aGUgUHJvcGVydHlCaW5kaW5nXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrUHJvcGVydHlCaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrUHJvcGVydHlCaW5kaW5nKHZhbHVlOiBhbnksIHBhdGg/OiBzdHJpbmcsIG9Nb2NrTW9kZWw/OiBNb2NrTW9kZWwpOiBNb2NrUHJvcGVydHlCaW5kaW5nIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhPRGF0YVByb3BlcnR5QmluZGluZykgYXMgTW9ja1Byb3BlcnR5QmluZGluZztcblx0bW9ja2VkLl9tb2NrTW9kZWwgPSBvTW9ja01vZGVsO1xuXHRtb2NrZWQuX3ZhbHVlID0gdmFsdWU7XG5cdG1vY2tlZC5fcGF0aCA9IHBhdGg7XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fbW9ja01vZGVsO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0VmFsdWUubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl92YWx1ZTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldFBhdGgubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLl9wYXRoO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja1Byb3BlcnR5QmluZGluZyBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja1Byb3BlcnR5QmluZGluZzogbmV3ICh2YWx1ZTogYW55LCBvTW9ja01vZGVsPzogTW9ja01vZGVsKSA9PiBNb2NrUHJvcGVydHlCaW5kaW5nID0gY3JlYXRlTW9ja1Byb3BlcnR5QmluZGluZyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwuQ29tcG9zaXRlQmluZGluZ1xuICovXG5leHBvcnQgdHlwZSBNb2NrQ29tcG9zaXRlQmluZGluZyA9IFdpdGhNb2NrPENvbXBvc2l0ZUJpbmRpbmc+ICYge1xuXHRfYUJpbmRpbmdzOiBNb2NrUHJvcGVydHlCaW5kaW5nW107XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrQ29tcG9zaXRlQmluZGluZy5cbiAqXG4gKiBAcGFyYW0gYUJpbmRpbmdzIFRoZSBiaW5kaW5ncyBvZiB0aGUgQ29tcG9zaXRlQmluZGluZ1xuICogQHJldHVybnMgQSBuZXcgTW9ja0NvbXBvc2l0ZUJpbmRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tDb21wb3NpdGVCaW5kaW5nKGFCaW5kaW5nczogTW9ja1Byb3BlcnR5QmluZGluZ1tdKTogTW9ja0NvbXBvc2l0ZUJpbmRpbmcge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKENvbXBvc2l0ZUJpbmRpbmcpIGFzIE1vY2tDb21wb3NpdGVCaW5kaW5nO1xuXHRtb2NrZWQuX2FCaW5kaW5ncyA9IGFCaW5kaW5ncztcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrSW1wbGVtZW50YXRpb24oKHNDbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5Db21wb3NpdGVCaW5kaW5nXCI7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRCaW5kaW5ncy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQuX2FCaW5kaW5ncztcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldFZhbHVlLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5fYUJpbmRpbmdzLm1hcCgoYmluZGluZykgPT4gYmluZGluZy5nZXRWYWx1ZSgpKTtcblx0fSk7XG5cblx0cmV0dXJuIG1vY2tlZDtcbn1cbi8qKlxuICogRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgd2Uga2VlcCBhIG5ldyBvcGVyYXRvci4gVXNlIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZU1vY2tDb21wb3NpdGVCaW5kaW5nIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrQ29tcG9zaXRlQmluZGluZzogbmV3IChhQmluZGluZ3M6IE1vY2tQcm9wZXJ0eUJpbmRpbmdbXSkgPT4gTW9ja0NvbXBvc2l0ZUJpbmRpbmcgPSBjcmVhdGVNb2NrQ29tcG9zaXRlQmluZGluZyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1xuICovXG5leHBvcnQgdHlwZSBNb2NrQ29udGV4dEJpbmRpbmcgPSBXaXRoTW9jazxPRGF0YUNvbnRleHRCaW5kaW5nPiAmIHtcblx0b01vY2tDb250ZXh0OiBNb2NrQ29udGV4dDtcblx0aXNLZXB0QWxpdmU6IGJvb2xlYW47XG5cdG1vY2tNb2RlbD86IE1vY2tNb2RlbDtcblxuXHQvKipcblx0ICogVXRpbGl0eSBtZXRob2QgdG8gYWNjZXNzIHRoZSBpbnRlcm5hbCBNb2NrQ29udGV4dCBvZiB0aGUgQ29udGV4dEJpbmRpbmdcblx0ICovXG5cdGdldEludGVybmFsTW9ja0NvbnRleHQ6ICgpID0+IE1vY2tDb250ZXh0O1xuXHQvKipcblx0ICogVXRpbGl0eSBtZXRob2QgdG8gc2V0IHRoZSBtb2RlbCBvZiB0aGUgQ29udGV4dEJpbmRpbmdcblx0ICovXG5cdHNldE1vZGVsOiAob01vZGVsOiBNb2NrTW9kZWwpID0+IHZvaWQ7XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrQ29udGV4dEJpbmRpbmcuXG4gKlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBDb250ZXh0QmluZGluZ1xuICogQHBhcmFtIG9Nb2NrTW9kZWwgVGhlIG1vZGVsIG9mIHRoZSBDb250ZXh0QmluZGluZ1xuICogQHJldHVybnMgQSBuZXcgTW9ja0NvbnRleHRCaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrQ29udGV4dEJpbmRpbmcob0NvbnRleHQ/OiBhbnksIG9Nb2NrTW9kZWw/OiBNb2NrTW9kZWwpOiBNb2NrQ29udGV4dEJpbmRpbmcge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKE9EYXRhQ29udGV4dEJpbmRpbmcpIGFzIE1vY2tDb250ZXh0QmluZGluZztcblx0bW9ja2VkLm1vY2tNb2RlbCA9IG9Nb2NrTW9kZWw7XG5cdG1vY2tlZC5vTW9ja0NvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dChvQ29udGV4dCB8fCB7fSwgbW9ja2VkKTtcblxuXHQvLyBVdGlsaXR5IEFQSVxuXHRtb2NrZWQuZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCA9ICgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm9Nb2NrQ29udGV4dDtcblx0fTtcblx0bW9ja2VkLnNldE1vZGVsID0gKG9Nb2RlbDogTW9ja01vZGVsKSA9PiB7XG5cdFx0bW9ja2VkLm1vY2tNb2RlbCA9IG9Nb2RlbDtcblx0fTtcblxuXHQvLyBEZWZhdWx0IGJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrSW1wbGVtZW50YXRpb24oKHNDbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRCb3VuZENvbnRleHQubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm9Nb2NrQ29udGV4dDtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE1vZGVsLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5tb2NrTW9kZWw7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5leGVjdXRlLm1vY2tSZXNvbHZlZFZhbHVlKHRydWUpO1xuXG5cdHJldHVybiBtb2NrZWQ7XG59XG4vKipcbiAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHdlIGtlZXAgYSBuZXcgb3BlcmF0b3IuIFVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVNb2NrQ29udGV4dEJpbmRpbmcgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tDb250ZXh0QmluZGluZzogbmV3IChvQ29udGV4dD86IGFueSwgb01vY2tNb2RlbD86IE1vY2tNb2RlbCkgPT4gTW9ja0NvbnRleHRCaW5kaW5nID0gY3JlYXRlTW9ja0NvbnRleHRCaW5kaW5nIGFzIGFueTtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gbW9jayBhIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1ldGFNb2RlbFxuICovXG5leHBvcnQgdHlwZSBNb2NrTWV0YU1vZGVsID0gV2l0aE1vY2s8T0RhdGFNZXRhTW9kZWw+ICYge1xuXHRvTWV0YUNvbnRleHQ6IE1vY2tDb250ZXh0O1xufTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja01ldGFNb2RlbC5cbiAqXG4gKiBAcGFyYW0gb01ldGFEYXRhIEEgbWFwIG9mIHRoZSBkaWZmZXJlbnQgbWV0YWRhdGEgcHJvcGVydGllcyBvZiB0aGUgTWV0YU1vZGVsIChwYXRoIC0+IHZhbHVlKS5cbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tNZXRhTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNZXRhTW9kZWwob01ldGFEYXRhPzogYW55KTogTW9ja01ldGFNb2RlbCB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soT0RhdGFNZXRhTW9kZWwpIGFzIE1vY2tNZXRhTW9kZWw7XG5cdG1vY2tlZC5vTWV0YUNvbnRleHQgPSBjcmVhdGVNb2NrQ29udGV4dChvTWV0YURhdGEgfHwge30pO1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suZ2V0TWV0YUNvbnRleHQubW9ja0ltcGxlbWVudGF0aW9uKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIGNyZWF0ZU1vY2tDb250ZXh0KHsgJHBhdGg6IHNQYXRoIH0pO1xuXHR9KTtcblx0bW9ja2VkLm1vY2suZ2V0T2JqZWN0Lm1vY2tJbXBsZW1lbnRhdGlvbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBtb2NrZWQub01ldGFDb250ZXh0LmdldFByb3BlcnR5KHNQYXRoKTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmNyZWF0ZUJpbmRpbmdDb250ZXh0Lm1vY2tJbXBsZW1lbnRhdGlvbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBjcmVhdGVNb2NrQ29udGV4dCh7ICRwYXRoOiBzUGF0aCB9KTtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmdldE1ldGFQYXRoLm1vY2tJbXBsZW1lbnRhdGlvbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IG1ldGFtb2RlbCA9IG5ldyBPRGF0YU1ldGFNb2RlbCgpO1xuXHRcdHJldHVybiBzUGF0aCA/IG1ldGFtb2RlbC5nZXRNZXRhUGF0aChzUGF0aCkgOiBzUGF0aDtcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmlzQS5tb2NrSW1wbGVtZW50YXRpb24oKHNDbGFzc05hbWU6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1ldGFNb2RlbFwiO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja01ldGFNb2RlbCBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgTW9ja01ldGFNb2RlbDogbmV3IChvTWV0YURhdGE/OiBhbnkpID0+IE1vY2tNZXRhTW9kZWwgPSBjcmVhdGVNb2NrTWV0YU1vZGVsIGFzIGFueTtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gbW9jayBhIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsXG4gKi9cbmV4cG9ydCB0eXBlIE1vY2tNb2RlbCA9IFdpdGhNb2NrPE9EYXRhTW9kZWw+ICYge1xuXHRvTWV0YU1vZGVsPzogTW9ja01ldGFNb2RlbDtcblx0bW9ja0xpc3RCaW5kaW5nPzogTW9ja0xpc3RCaW5kaW5nO1xuXHRtb2NrQ29udGV4dEJpbmRpbmc/OiBNb2NrQ29udGV4dEJpbmRpbmc7XG5cblx0LyoqXG5cdCAqIFV0aWxpdHkgbWV0aG9kIHRvIHNldCB0aGUgbWV0YW1vZGVsIG9mIHRoZSBNb2NrTW9kZWxcblx0ICovXG5cdHNldE1ldGFNb2RlbDogKG9NZXRhTW9kZWw6IE1vY2tNZXRhTW9kZWwpID0+IHZvaWQ7XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrTW9kZWwuXG4gKlxuICogQHBhcmFtIG9Nb2NrTGlzdEJpbmRpbmcgQSBsaXN0IGJpbmRpbmcgdGhhdCB3aWxsIGJlIHJldHVybmVkIHdoZW4gY2FsbGluZyBiaW5kTGlzdC5cbiAqIEBwYXJhbSBvTW9ja0NvbnRleHRCaW5kaW5nIEEgY29udGV4dCBiaW5kaW5nIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB3aGVuIGNhbGxpbmcgYmluZENvbnRleHQuXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNb2RlbChvTW9ja0xpc3RCaW5kaW5nPzogTW9ja0xpc3RCaW5kaW5nLCBvTW9ja0NvbnRleHRCaW5kaW5nPzogTW9ja0NvbnRleHRCaW5kaW5nKTogTW9ja01vZGVsIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhPRGF0YU1vZGVsKSBhcyBNb2NrTW9kZWw7XG5cdG1vY2tlZC5mbk9wdGltaXN0aWNCYXRjaEVuYWJsZXIgPSBudWxsO1xuXHRtb2NrZWQubW9ja0xpc3RCaW5kaW5nID0gb01vY2tMaXN0QmluZGluZztcblx0bW9ja2VkLm1vY2tDb250ZXh0QmluZGluZyA9IG9Nb2NrQ29udGV4dEJpbmRpbmc7XG5cdGlmIChvTW9ja0xpc3RCaW5kaW5nKSB7XG5cdFx0b01vY2tMaXN0QmluZGluZy5zZXRNb2RlbChtb2NrZWQpO1xuXHR9XG5cdGlmIChvTW9ja0NvbnRleHRCaW5kaW5nKSB7XG5cdFx0b01vY2tDb250ZXh0QmluZGluZy5zZXRNb2RlbChtb2NrZWQpO1xuXHR9XG5cblx0Ly8gVXRpbGl0eSBBUElcblx0bW9ja2VkLnNldE1ldGFNb2RlbCA9IChvTWV0YU1vZGVsOiBNb2NrTWV0YU1vZGVsKSA9PiB7XG5cdFx0bW9ja2VkLm9NZXRhTW9kZWwgPSBvTWV0YU1vZGVsO1xuXHR9O1xuXG5cdC8vIERlZmF1bHQgYmVoYXZpb3Jcblx0bW9ja2VkLm1vY2suYmluZExpc3QubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm1vY2tMaXN0QmluZGluZztcblx0fSk7XG5cdG1vY2tlZC5tb2NrLmJpbmRDb250ZXh0Lm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG5cdFx0cmV0dXJuIG1vY2tlZC5tb2NrQ29udGV4dEJpbmRpbmc7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5nZXRNZXRhTW9kZWwubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHtcblx0XHRyZXR1cm4gbW9ja2VkLm9NZXRhTW9kZWw7XG5cdH0pO1xuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja01vZGVsIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2NrTW9kZWw6IG5ldyAob01vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZywgb01vY2tDb250ZXh0QmluZGluZz86IE1vY2tDb250ZXh0QmluZGluZykgPT4gTW9ja01vZGVsID1cblx0Y3JlYXRlTW9ja01vZGVsIGFzIGFueTtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja01vZGVsIHVzZWQgd2l0aCBhIGxpc3RCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSBvTW9ja0xpc3RCaW5kaW5nIEEgbGlzdCBiaW5kaW5nIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB3aGVuIGNhbGxpbmcgYmluZExpc3QuXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNb2RlbEZyb21MaXN0QmluZGluZyhvTW9ja0xpc3RCaW5kaW5nOiBNb2NrTGlzdEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRyZXR1cm4gY3JlYXRlTW9ja01vZGVsKG9Nb2NrTGlzdEJpbmRpbmcpO1xufVxuLyoqXG4gKiAgRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja01vZGVsIHVzZWQgd2l0aCBhIGNvbnRleHRCaW5kaW5nLlxuICpcbiAqIEBwYXJhbSBvTW9ja0NvbnRleHRCaW5kaW5nIEEgY29udGV4dCBiaW5kaW5nIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB3aGVuIGNhbGxpbmcgYmluZENvbnRleHQuXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tNb2RlbEZyb21Db250ZXh0QmluZGluZyhvTW9ja0NvbnRleHRCaW5kaW5nOiBNb2NrQ29udGV4dEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRyZXR1cm4gY3JlYXRlTW9ja01vZGVsKHVuZGVmaW5lZCwgb01vY2tDb250ZXh0QmluZGluZyk7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAudWkuY29yZS5tdmMuVmlld1xuICovXG5leHBvcnQgdHlwZSBNb2NrVmlldyA9IFdpdGhNb2NrPEZFVmlldz47XG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IE1vY2tWaWV3LlxuICpcbiAqIEByZXR1cm5zIEEgbmV3IE1vY2tWaWV3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrVmlldygpOiBNb2NrVmlldyB7XG5cdGNvbnN0IG1vY2tlZCA9IG1vY2soVmlldyk7XG5cblx0Ly8gRGVmYXVsdCBiZWhhdmlvclxuXHRtb2NrZWQubW9jay5pc0EubW9ja0ltcGxlbWVudGF0aW9uKChzQ2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkuY29yZS5tdmMuVmlld1wiO1xuXHR9KTtcblxuXHRyZXR1cm4gbW9ja2VkIGFzIE1vY2tWaWV3O1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlTW9ja1ZpZXcgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tWaWV3OiBuZXcgKCkgPT4gTW9ja1ZpZXcgPSBjcmVhdGVNb2NrVmlldyBhcyBhbnk7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIG1vY2sgYSBzYXAuZmUuY29yZS5QYWdlQ29udHJvbGxlclxuICovXG5leHBvcnQgdHlwZSBNb2NrQ29udHJvbGxlciA9IFdpdGhNb2NrPENvbnRyb2xsZXI+ICYge1xuXHRfcm91dGluZzogV2l0aE1vY2s8SW50ZXJuYWxSb3V0aW5nPjtcblx0X3NpZGVFZmZlY3RzOiBXaXRoTW9jazxTaWRlRWZmZWN0cz47XG5cdGVkaXRGbG93OiBXaXRoTW9jazxFZGl0Rmxvdz47XG5cdHNoYXJlOiBXaXRoTW9jazxTaGFyZT47XG5cdHJlY29tbWVuZGF0aW9uczogV2l0aE1vY2s8UmVjb21tZW5kYXRpb25zPjtcblx0Y29sbGFib3JhdGl2ZURyYWZ0OiBXaXRoTW9jazxDb2xsYWJvcmF0aXZlRHJhZnQ+O1xuXHRnZXRBcHBDb21wb25lbnQ6ICgpID0+IFdpdGhNb2NrPEFwcENvbXBvbmVudD47XG59O1xuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBNb2NrQ29udHJvbGxlci5cbiAqXG4gKiBAcmV0dXJucyBBIG5ldyBNb2NrQ29udHJvbGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9ja0NvbnRyb2xsZXIoKTogTW9ja0NvbnRyb2xsZXIge1xuXHRjb25zdCBtb2NrZWQgPSBtb2NrKENvbnRyb2xsZXIpIGFzIE1vY2tDb250cm9sbGVyO1xuXHRtb2NrZWQuX3JvdXRpbmcgPSBtb2NrKEludGVybmFsUm91dGluZyk7XG5cdG1vY2tlZC5fc2lkZUVmZmVjdHMgPSBtb2NrKFNpZGVFZmZlY3RzKTtcblx0bW9ja2VkLmVkaXRGbG93ID0gbW9jayhFZGl0Rmxvdyk7XG5cdG1vY2tlZC5zaGFyZSA9IG1vY2soU2hhcmUpO1xuXHRtb2NrZWQuY29sbGFib3JhdGl2ZURyYWZ0ID0gbW9jayhDb2xsYWJvcmF0aXZlRHJhZnQpO1xuXHRtb2NrZWQucmVjb21tZW5kYXRpb25zID0gbW9jayhSZWNvbW1lbmRhdGlvbnMpO1xuXHRtb2NrZWQuZ2V0QXBwQ29tcG9uZW50ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShtb2NrKEFwcENvbXBvbmVudCkpO1xuXHQvLyBEZWZhdWx0IEJlaGF2aW9yXG5cdG1vY2tlZC5tb2NrLmdldFZpZXcubW9ja1JldHVyblZhbHVlKGNyZWF0ZU1vY2tWaWV3KCkpO1xuXHRtb2NrZWQubW9jay5pc0EubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcblxuXHRyZXR1cm4gbW9ja2VkO1xufVxuLyoqXG4gKiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLCB3ZSBrZWVwIGEgbmV3IG9wZXJhdG9yLiBVc2UgdGhlIGZhY3RvcnkgZnVuY3Rpb24gbW9ja0NvbnRyb2xsZXIgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vY2tDb250cm9sbGVyOiBuZXcgKCkgPT4gTW9ja0NvbnRyb2xsZXIgPSBjcmVhdGVNb2NrQ29udHJvbGxlciBhcyBhbnk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTVZDTW9jayB7XG5cdG1vZGVsOiBNb2NrTW9kZWw7XG5cdHZpZXc6IE1vY2tWaWV3O1xuXHRjb250cm9sbGVyOiBNb2NrQ29udHJvbGxlcjtcbn1cbi8qKlxuICogR2VuZXJhdGUgbW9kZWwsIHZpZXcgYW5kIGNvbnRyb2xsZXIgbW9ja3MgdGhhdCByZWZlciB0byBlYWNoIG90aGVyLlxuICpcbiAqIEBwYXJhbSBleGlzdGluZyBPcHRpb25hbCBleGlzdGluZyBtb2NrZWQgaW5zdGFuY2VzIHRoYXQgc2hvdWxkIGJlIHVzZWRcbiAqIEByZXR1cm5zIE1vY2tlZCBtb2RlbCwgdmlldyBhbmQgY29udHJvbGxlciBpbnN0YW5jZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vY2tNVkMoZXhpc3Rpbmc/OiBQYXJ0aWFsPE1WQ01vY2s+KTogTVZDTW9jayB7XG5cdGNvbnN0IG1vZGVsID0gZXhpc3Rpbmc/Lm1vZGVsIHx8IGNyZWF0ZU1vY2tNb2RlbCgpO1xuXHRjb25zdCB2aWV3ID0gZXhpc3Rpbmc/LnZpZXcgfHwgY3JlYXRlTW9ja1ZpZXcoKTtcblx0Y29uc3QgY29udHJvbGxlciA9IGV4aXN0aW5nPy5jb250cm9sbGVyIHx8IGNyZWF0ZU1vY2tDb250cm9sbGVyKCk7XG5cblx0dmlldy5tb2NrLmdldENvbnRyb2xsZXIubW9ja1JldHVyblZhbHVlKGNvbnRyb2xsZXIpO1xuXHR2aWV3Lm1vY2suZ2V0TW9kZWwubW9ja1JldHVyblZhbHVlKG1vZGVsKTtcblx0Y29udHJvbGxlci5tb2NrLmdldFZpZXcubW9ja1JldHVyblZhbHVlKHZpZXcpO1xuXG5cdHJldHVybiB7IG1vZGVsLCB2aWV3LCBjb250cm9sbGVyIH07XG59XG5cbi8qKlxuICogVG8gYmUgdXNlZCB0byBsb2FkIG1lc3NhZ2VzIGJ1bmRsZXMgZm9yIHRlc3RzIHdpdGhvdXQgYXBwL3BhZ2UgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB0ZXh0SUQgSUQgb2YgdGhlIFRleHRcbiAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFycmF5IG9mIHBhcmFtZXRlcnMgdGhhdCBhcmUgdXNlZCB0byBjcmVhdGUgdGhlIHRleHRcbiAqIEBwYXJhbSBtZXRhUGF0aCBFbnRpdHkgc2V0IG5hbWUgb3IgYWN0aW9uIG5hbWUgdG8gb3ZlcmxvYWQgYSB0ZXh0XG4gKiBAcmV0dXJucyBEZXRlcm1pbmVkIHRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHQodGV4dElEOiBzdHJpbmcsIHBhcmFtZXRlcnM/OiBhbnlbXSwgbWV0YVBhdGg/OiBzdHJpbmcpIHtcblx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IG5ldyBSZXNvdXJjZU1vZGVsKHtcblx0XHRidW5kbGVOYW1lOiBcInNhcC5mZS5jb3JlLm1lc3NhZ2VidW5kbGVcIixcblx0XHRlbmhhbmNlV2l0aDogW3sgYnVuZGxlTmFtZTogXCJzYXAuZmUubWFjcm9zLm1lc3NhZ2VidW5kbGVcIiB9LCB7IGJ1bmRsZU5hbWU6IFwic2FwLmZlLnRlbXBsYXRlcy5tZXNzYWdlYnVuZGxlXCIgfV0sXG5cdFx0YXN5bmM6IGZhbHNlXG5cdH0pO1xuXHRyZXR1cm4gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KHRleHRJRCwgcGFyYW1ldGVycywgbWV0YVBhdGgpO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBtb2NrIFJlc291cmNlTW9kZWxcbiAqL1xuZXhwb3J0IHR5cGUgTW9ja1Jlc291cmNlTW9kZWwgPSBXaXRoTW9jazxSZXNvdXJjZU1vZGVsPjtcbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgTW9ja1ZpZXcuXG4gKlxuICogQHJldHVybnMgQSBuZXcgTW9ja1ZpZXdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tSZXNvdXJjZU1vZGVsKCk6IE1vY2tSZXNvdXJjZU1vZGVsIHtcblx0Y29uc3QgbW9ja2VkID0gbW9jayhSZXNvdXJjZU1vZGVsKTtcblx0bW9ja2VkLmdldFRleHQgPSBq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
@@ -1,15 +1,18 @@
1
1
  import type { WithMock } from "@sap-ux/jest-mock-ui5/dist/generic";
2
2
  import { mock } from "@sap-ux/jest-mock-ui5/dist/generic";
3
3
  import AppComponent from "sap/fe/core/AppComponent";
4
+ import type { FEView } from "sap/fe/core/BaseController";
5
+ import ResourceModel from "sap/fe/core/ResourceModel";
6
+ import CollaborativeDraft from "sap/fe/core/controllerextensions/CollaborativeDraft";
4
7
  import EditFlow from "sap/fe/core/controllerextensions/EditFlow";
5
8
  import InternalRouting from "sap/fe/core/controllerextensions/InternalRouting";
6
9
  import Recommendations from "sap/fe/core/controllerextensions/Recommendations";
7
10
  import Share from "sap/fe/core/controllerextensions/Share";
8
11
  import SideEffects from "sap/fe/core/controllerextensions/SideEffects";
9
- import ResourceModel from "sap/fe/core/ResourceModel";
10
12
  import Event from "sap/ui/base/Event";
11
13
  import Controller from "sap/ui/core/mvc/Controller";
12
14
  import View from "sap/ui/core/mvc/View";
15
+ import type Control from "sap/ui/mdc/Control";
13
16
  import CompositeBinding from "sap/ui/model/CompositeBinding";
14
17
  import Context from "sap/ui/model/odata/v4/Context";
15
18
  import ODataContextBinding from "sap/ui/model/odata/v4/ODataContextBinding";
@@ -56,8 +59,8 @@ export function createMockContext(oContextData?: any, oBinding?: any, isInactive
56
59
  }
57
60
  return Promise.resolve(mocked._contextData[keyOrKeys]);
58
61
  });
59
- mocked.mock.requestObject.mockImplementation((key: string) => {
60
- return Promise.resolve(mocked._contextData[key]);
62
+ mocked.mock.requestObject.mockImplementation((key: string | undefined) => {
63
+ return key ? Promise.resolve(mocked._contextData[key]) : mocked._contextData;
61
64
  });
62
65
  mocked.mock.setProperty.mockImplementation((key: string, value: any) => {
63
66
  mocked._contextData[key] = value;
@@ -106,10 +109,14 @@ export type MockEvent = WithMock<Event> & {
106
109
  * @param params The parameters of the event
107
110
  * @returns A new MockEvent
108
111
  */
109
- export function createMockEvent(params?: { [key: string]: any }): MockEvent {
112
+ export function createMockEvent(params?: { [key: string]: unknown }, source?: Control): MockEvent {
110
113
  const mocked = mock(Event) as MockEvent;
111
114
  mocked._params = params || {};
112
115
 
116
+ if (source) {
117
+ mocked.mock.getSource.mockReturnValue(source);
118
+ }
119
+
113
120
  // Default behavior
114
121
  mocked.mock.getParameter.mockImplementation((name) => mocked._params[name]);
115
122
  mocked.mock.getParameters.mockImplementation(() => {
@@ -346,6 +353,9 @@ export function createMockMetaModel(oMetaData?: any): MockMetaModel {
346
353
  const metamodel = new ODataMetaModel();
347
354
  return sPath ? metamodel.getMetaPath(sPath) : sPath;
348
355
  });
356
+ mocked.mock.isA.mockImplementation((sClassName: string) => {
357
+ return sClassName === "sap.ui.model.odata.v4.ODataMetaModel";
358
+ });
349
359
 
350
360
  return mocked;
351
361
  }
@@ -376,6 +386,7 @@ export type MockModel = WithMock<ODataModel> & {
376
386
  */
377
387
  export function createMockModel(oMockListBinding?: MockListBinding, oMockContextBinding?: MockContextBinding): MockModel {
378
388
  const mocked = mock(ODataModel) as MockModel;
389
+ mocked.fnOptimisticBatchEnabler = null;
379
390
  mocked.mockListBinding = oMockListBinding;
380
391
  mocked.mockContextBinding = oMockContextBinding;
381
392
  if (oMockListBinding) {
@@ -400,6 +411,9 @@ export function createMockModel(oMockListBinding?: MockListBinding, oMockContext
400
411
  mocked.mock.getMetaModel.mockImplementation(() => {
401
412
  return mocked.oMetaModel;
402
413
  });
414
+ mocked.mock.isA.mockImplementation((sClassName: string) => {
415
+ return sClassName === "sap.ui.model.odata.v4.ODataModel";
416
+ });
403
417
 
404
418
  return mocked;
405
419
  }
@@ -430,7 +444,7 @@ export function createMockModelFromContextBinding(oMockContextBinding: MockConte
430
444
  /**
431
445
  * Utility type to mock a sap.ui.core.mvc.View
432
446
  */
433
- export type MockView = WithMock<View>;
447
+ export type MockView = WithMock<FEView>;
434
448
  /**
435
449
  * Factory function to create a new MockView.
436
450
  *
@@ -444,7 +458,7 @@ export function createMockView(): MockView {
444
458
  return sClassName === "sap.ui.core.mvc.View";
445
459
  });
446
460
 
447
- return mocked;
461
+ return mocked as MockView;
448
462
  }
449
463
  /**
450
464
  * For compatibility reasons, we keep a new operator. Use the factory function createMockView instead.
@@ -460,6 +474,7 @@ export type MockController = WithMock<Controller> & {
460
474
  editFlow: WithMock<EditFlow>;
461
475
  share: WithMock<Share>;
462
476
  recommendations: WithMock<Recommendations>;
477
+ collaborativeDraft: WithMock<CollaborativeDraft>;
463
478
  getAppComponent: () => WithMock<AppComponent>;
464
479
  };
465
480
  /**
@@ -473,6 +488,7 @@ export function createMockController(): MockController {
473
488
  mocked._sideEffects = mock(SideEffects);
474
489
  mocked.editFlow = mock(EditFlow);
475
490
  mocked.share = mock(Share);
491
+ mocked.collaborativeDraft = mock(CollaborativeDraft);
476
492
  mocked.recommendations = mock(Recommendations);
477
493
  mocked.getAppComponent = jest.fn().mockReturnValue(mock(AppComponent));
478
494
  // Default Behavior
@@ -142,6 +142,10 @@ sap.ui.define(
142
142
  SalesOrder: {
143
143
  appName: "SalesOrder",
144
144
  appPath: "/apps/salesorder/webapp"
145
+ },
146
+ "Cinema-manage": {
147
+ appName: "CollaborationDraft",
148
+ appPath: "/apps/collaborationDraft/webapp"
145
149
  }
146
150
  };
147
151
  return oApps[sApp];
@@ -5,10 +5,11 @@
5
5
 
6
6
  */
7
7
  sap.ui.define(
8
- ["./BaseAPI", "sap/fe/test/Utils", "sap/ui/test/OpaBuilder", "sap/fe/test/builder/FEBuilder", "sap/ui/core/SortOrder"],
9
- function (BaseAPI, Utils, OpaBuilder, FEBuilder, SortOrder) {
8
+ ["./BaseAPI", "sap/fe/test/Utils", "sap/ui/test/OpaBuilder", "sap/fe/test/builder/FEBuilder", "sap/ui/core/library"],
9
+ function (BaseAPI, Utils, OpaBuilder, FEBuilder, library) {
10
10
  "use strict";
11
11
 
12
+ var SortOrder = library.SortOrder;
12
13
  /**
13
14
  * Constructs a new ChartAssertions instance.
14
15
  *