@sapui5/sap.fe.base 1.131.0 → 1.133.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.
@@ -2,7 +2,7 @@ import ObjectPath from "sap/base/util/ObjectPath";
2
2
  import deepClone from "sap/base/util/deepClone";
3
3
  import merge from "sap/base/util/merge";
4
4
  import uid from "sap/base/util/uid";
5
- import { hookable } from "sap/fe/base/HookSupport";
5
+ import { hookable, propagateHookFromMixin } from "sap/fe/base/HookSupport";
6
6
  import type { Ref } from "sap/fe/base/jsx-runtime/jsx";
7
7
  import type UI5Event from "sap/ui/base/Event";
8
8
  import type ManagedObject from "sap/ui/base/ManagedObject";
@@ -34,7 +34,7 @@ type UI5PropertyMetadata = {
34
34
  defaultValue?: unknown;
35
35
  byValue?: boolean;
36
36
  isBindingInfo?: boolean;
37
- bindToState?: string;
37
+ bindToState?: boolean;
38
38
  expectedAnnotations?: string[];
39
39
  expectedTypes?: string[];
40
40
  allowedValues?: string[];
@@ -529,20 +529,14 @@ export function mixin<T extends IInterfaceWithMixin>(interfaceClass: Constructor
529
529
  throw new Error("The mixinInterface decorator must be placed after `defineUi5Class`");
530
530
  }
531
531
  const metadata = ensureMetadata(baseCtor.prototype);
532
- const interfaceName = interfaceClass.prototype.getInterfaceName?.();
533
- if (interfaceName) {
534
- metadata.interfaces.push(interfaceName);
532
+
533
+ let interfaceProtoTypeToMix = interfaceClass.prototype;
534
+ while (interfaceProtoTypeToMix) {
535
+ baseCtor = _addInterfaceProtoTypesToBaseClass(baseCtor, metadata, interfaceProtoTypeToMix);
536
+ interfaceProtoTypeToMix = Object.getPrototypeOf(interfaceProtoTypeToMix);
535
537
  }
538
+ propagateHookFromMixin(baseCtor, interfaceClass);
536
539
 
537
- Object.getOwnPropertyNames(interfaceClass.prototype).forEach((name) => {
538
- if (name !== "constructor" && name !== "setupMixin") {
539
- Object.defineProperty(
540
- baseCtor.prototype,
541
- name,
542
- Object.getOwnPropertyDescriptor(interfaceClass.prototype, name) || Object.create(null)
543
- );
544
- }
545
- });
546
540
  // Hook to add potentially more logic to the mixin
547
541
  interfaceClass.prototype.setupMixin?.(baseCtor);
548
542
  return baseCtor;
@@ -594,6 +588,34 @@ export function defineReference(): PropertyDecorator {
594
588
  } as unknown as PropertyDecorator; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
595
589
  }
596
590
 
591
+ function _addInterfaceProtoTypesToBaseClass(
592
+ baseCtor: UI5ControlAndMore,
593
+ baseClassMetadata: UI5ControlMetadataDefinition,
594
+ interfaceClassPrototype: Function["prototype"]
595
+ ): UI5ControlAndMore {
596
+ const interfaceName = interfaceClassPrototype?.getInterfaceName?.();
597
+ if (interfaceName) {
598
+ baseClassMetadata.interfaces.push(interfaceName);
599
+ }
600
+
601
+ Object.getOwnPropertyNames(interfaceClassPrototype).forEach((name) => {
602
+ if (name !== "constructor" && name !== "setupMixin" && name !== "metadata") {
603
+ if (!baseCtor.prototype[name]) {
604
+ // The base class "wins" over the mixin
605
+ Object.defineProperty(
606
+ baseCtor.prototype,
607
+ name,
608
+ Object.getOwnPropertyDescriptor(interfaceClassPrototype, name) || Object.create(null)
609
+ );
610
+ }
611
+ }
612
+ if (name === "metadata") {
613
+ baseCtor.prototype.metadata = merge(baseCtor.prototype.metadata, interfaceClassPrototype.metadata);
614
+ }
615
+ });
616
+ return baseCtor;
617
+ }
618
+
597
619
  function _getHandlerForStateProperty(jsonModel: JSONModel, prop: string): unknown {
598
620
  const pathInModel = `/${prop.toString()}`;
599
621
  const oObj = deepClone(jsonModel.getObject(pathInModel));
@@ -635,10 +657,68 @@ function _getHandlerForStateProperty(jsonModel: JSONModel, prop: string): unknow
635
657
  }
636
658
  return oTarget;
637
659
  }
660
+ const boundProperties = Symbol("boundProperties");
661
+
662
+ function createStateProxy(
663
+ targetControl: Control & {
664
+ [boundProperties]: string[];
665
+ __stateCreated: boolean;
666
+ _updateState: Function;
667
+ _updateStateDebounced: Function;
668
+ _ignoreStatePropertyUpdate: boolean;
669
+ _updateStateTimer: unknown;
670
+ _changedProps?: string[];
671
+ },
672
+ statePropertyName: string,
673
+ boundToStateProps: string[],
674
+ initialData?: object
675
+ ): JSONModel {
676
+ // Lazy initialization of the state property
677
+ targetControl.setModel(new JSONModel(initialData), "$componentState");
678
+ const stateModel = targetControl.getModel("$componentState") as JSONModel;
679
+ stateModel.attachPropertyChange((evt: Model$PropertyChangeEvent) => {
680
+ const path = evt.getParameter("path")?.substring(1); // to remove the first /
681
+ if (path && boundToStateProps.includes(path)) {
682
+ targetControl.setProperty(path, evt.getParameter("value"));
683
+ }
684
+ });
685
+ targetControl.__stateCreated = true;
686
+ const proxy = new Proxy(stateModel, {
687
+ get: (target: JSONModel, prop: string): unknown => {
688
+ return _getHandlerForStateProperty(target, prop);
689
+ },
690
+ set: (setStateModel: JSONModel, prop, value): boolean => {
691
+ // we need to check whether the property is a known bound property in any of the related classes
692
+ const knownBoundProperties = targetControl[boundProperties];
693
+ if (knownBoundProperties.includes(prop.toString())) {
694
+ targetControl._ignoreStatePropertyUpdate = true;
695
+ targetControl.setProperty(prop.toString(), value);
696
+ targetControl._ignoreStatePropertyUpdate = false;
697
+ }
698
+ const setResult = setStateModel.setProperty(`/${prop.toString()}`, value);
699
+ targetControl._updateStateDebounced(prop.toString());
700
+ return setResult;
701
+ }
702
+ });
703
+ Object.defineProperty(targetControl, statePropertyName, {
704
+ configurable: true,
705
+ get: () => {
706
+ return proxy;
707
+ },
708
+ set(value) {
709
+ // Replacing the complete state
710
+ stateModel.setProperty(`/`, value);
711
+ }
712
+ });
713
+ return proxy;
714
+ }
638
715
 
639
716
  function _createStateProperty(
640
717
  obj: UI5ControlDefinition,
641
718
  targetControl: Control & {
719
+ [boundProperties]: string[];
720
+ __stateCreated: boolean;
721
+ __stateName: string;
642
722
  _updateState: Function;
643
723
  _updateStateDebounced: Function;
644
724
  _ignoreStatePropertyUpdate: boolean;
@@ -646,78 +726,71 @@ function _createStateProperty(
646
726
  _changedProps?: string[];
647
727
  }
648
728
  ): void {
649
- if (obj.metadata?.stateProperty) {
650
- const stateModel = new JSONModel({});
651
-
652
- targetControl.setModel(stateModel, "$componentState");
729
+ if (obj.metadata?.stateProperty || targetControl[boundProperties]) {
653
730
  let updatingState = false;
654
731
  const boundToStateProps: string[] = [];
655
- for (const propertyName in obj.metadata.properties) {
732
+ for (const propertyName in obj.metadata?.properties) {
656
733
  const propertyDef = obj.metadata.properties[propertyName];
657
734
  if (propertyDef.bindToState) {
658
735
  boundToStateProps.push(propertyName);
659
736
  }
660
737
  }
661
- stateModel.attachPropertyChange((evt: Model$PropertyChangeEvent) => {
662
- const path = evt.getParameter("path")?.substring(1); // to remove the first /
663
- if (path && boundToStateProps.includes(path)) {
664
- targetControl.setProperty(path, evt.getParameter("value"));
665
- }
666
- });
667
- // This method can be used to force the state to be applied and wait for it to be applied in tests
668
- targetControl._updateState = async function (): Promise<void> {
669
- delete this._updateStateTimer;
670
- if (!updatingState) {
671
- updatingState = true;
672
- await (this as { onStateChange?: Function }).onStateChange?.(this._changedProps);
673
- this._changedProps = [];
674
- updatingState = false;
675
- }
676
- };
677
- targetControl._updateStateDebounced = function (changedProp: string): void {
678
- this._changedProps ??= [];
679
- if (!this._changedProps.includes(changedProp)) {
680
- this._changedProps.push(changedProp);
681
- }
682
- if (!this._updateStateTimer && !updatingState) {
683
- this._updateStateTimer = setTimeout(() => {
684
- this._updateState();
685
- }, 200);
686
- }
687
- };
688
- Object.defineProperty(targetControl, obj.metadata.stateProperty, {
689
- configurable: true,
690
- get: () => {
691
- return new Proxy(stateModel, {
692
- get: (target: JSONModel, prop: string): unknown => {
693
- return _getHandlerForStateProperty(target, prop);
694
- },
695
- set: (setStateModel: JSONModel, prop, value): boolean => {
696
- if (boundToStateProps.includes(prop.toString())) {
697
- targetControl._ignoreStatePropertyUpdate = true;
698
- targetControl.setProperty(prop.toString(), value);
699
- targetControl._ignoreStatePropertyUpdate = false;
700
- }
701
- const setResult = setStateModel.setProperty(`/${prop.toString()}`, value);
702
- targetControl._updateStateDebounced(prop.toString());
703
- return setResult;
704
- }
705
- });
706
- },
707
- set: function (value) {
708
- // Replacing the complete state
709
- stateModel.setProperty(`/`, value);
738
+ // as we may have bound properties in parent classes and subclasses, we keep track of those in the model itself
739
+ targetControl[boundProperties] ??= [];
740
+ targetControl[boundProperties] = [...targetControl[boundProperties], ...boundToStateProps];
741
+
742
+ if (obj.metadata?.stateProperty) {
743
+ // This method can be used to force the state to be applied and wait for it to be applied in tests
744
+ targetControl._updateState = async function (): Promise<void> {
745
+ delete this._updateStateTimer;
746
+ if (!updatingState) {
747
+ updatingState = true;
748
+ await (this as { onStateChange?: Function }).onStateChange?.(this._changedProps);
749
+ this._changedProps = [];
750
+ updatingState = false;
751
+ }
752
+ };
753
+ targetControl._updateStateDebounced = function (changedProp: string): void {
754
+ this._changedProps ??= [];
755
+ if (!this._changedProps.includes(changedProp)) {
756
+ this._changedProps.push(changedProp);
757
+ }
758
+ if (!this._updateStateTimer && !updatingState) {
759
+ this._updateStateTimer = setTimeout(() => {
760
+ this._updateState();
761
+ }, 200);
762
+ }
763
+ };
764
+ const statePropertyName = obj.metadata.stateProperty;
765
+ targetControl.__stateCreated = false;
766
+ targetControl.__stateName = statePropertyName;
767
+ Object.defineProperty(targetControl, statePropertyName, {
768
+ configurable: true,
769
+ get: () => {
770
+ return createStateProxy(targetControl, statePropertyName, targetControl[boundProperties]);
771
+ },
772
+ set: (value) => {
773
+ createStateProxy(targetControl, statePropertyName, targetControl[boundProperties], value);
774
+ }
775
+ });
776
+ if (obj.metadata.statePropertyDefaultValue) {
777
+ targetControl[obj.metadata.stateProperty as keyof Control] = { ...obj.metadata.statePropertyDefaultValue } as never;
710
778
  }
711
- });
712
- if (obj.metadata.statePropertyDefaultValue) {
713
- targetControl[obj.metadata.stateProperty as keyof Control] = { ...obj.metadata.statePropertyDefaultValue } as never;
779
+ const fnApplySettings = targetControl.applySettings;
780
+ targetControl.applySettings = function (mSettings: { models?: Record<string, never> }): typeof targetControl {
781
+ delete mSettings?.models?.$componentState;
782
+ return fnApplySettings.call(this, mSettings);
783
+ };
714
784
  }
715
785
  const fnSetProperty = targetControl.setProperty;
716
-
717
- if (boundToStateProps.length > 0) {
786
+ if (targetControl[boundProperties].length > 0) {
718
787
  targetControl.setProperty = function (sPropertyName: string, oValue: unknown, bSuppressInvalidate): typeof targetControl {
719
- if (boundToStateProps.includes(sPropertyName) && !this._ignoreStatePropertyUpdate) {
720
- (this[obj.metadata?.stateProperty as keyof typeof targetControl] as Record<string, unknown>)[sPropertyName] = oValue;
788
+ if (targetControl[boundProperties].includes(sPropertyName) && !this._ignoreStatePropertyUpdate) {
789
+ if (!this.__stateCreated) {
790
+ createStateProxy(targetControl, targetControl.__stateName, targetControl[boundProperties]);
791
+ }
792
+ (this.getModel("$componentState") as JSONModel).setProperty(`/${sPropertyName}`, oValue);
793
+ targetControl._updateStateDebounced(sPropertyName);
721
794
  }
722
795
  return fnSetProperty.call(this, sPropertyName, oValue, bSuppressInvalidate);
723
796
  };
@@ -829,7 +902,8 @@ function registerUI5Metadata(clazz: UI5ControlAndMore, name: string, inObj: UI5C
829
902
  }
830
903
  });
831
904
  }
832
- if (propertyDefault !== undefined) {
905
+ if (propertyDefault !== undefined && this[propertyKey] !== propertyDefault) {
906
+ // don't overwrite the default value if it's already there
833
907
  this._applyingSettings = true;
834
908
  this[propertyKey] = propertyDefault;
835
909
  this._applyingSettings = false;
@@ -11,7 +11,6 @@ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/core/Element"], function (Cla
11
11
  var event = ClassSupport.event;
12
12
  var defineUI5Class = ClassSupport.defineUI5Class;
13
13
  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }
14
- function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
15
14
  function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
16
15
  function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
17
16
  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
@@ -25,15 +24,15 @@ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/core/Element"], function (Cla
25
24
  let EventDelegateHook = (_dec = defineUI5Class("sap.fe.base.EventDelegateHook"), _dec2 = property({
26
25
  type: "boolean"
27
26
  }), _dec3 = event(), _dec(_class = (_class2 = /*#__PURE__*/function (_Element) {
28
- _inheritsLoose(EventDelegateHook, _Element);
29
27
  function EventDelegateHook(idOrSettings, settings) {
30
28
  var _this;
31
29
  _this = _Element.call(this, idOrSettings, settings) || this;
32
- _initializerDefineProperty(_this, "stopTapPropagation", _descriptor, _assertThisInitialized(_this));
33
- _initializerDefineProperty(_this, "tap", _descriptor2, _assertThisInitialized(_this));
30
+ _initializerDefineProperty(_this, "stopTapPropagation", _descriptor, _this);
31
+ _initializerDefineProperty(_this, "tap", _descriptor2, _this);
34
32
  return _this;
35
33
  }
36
34
  _exports = EventDelegateHook;
35
+ _inheritsLoose(EventDelegateHook, _Element);
37
36
  var _proto = EventDelegateHook.prototype;
38
37
  _proto.setParent = function setParent(parentObject) {
39
38
  if (this.getParent()) {
@@ -49,7 +48,7 @@ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/core/Element"], function (Cla
49
48
  this.fireEvent("tap");
50
49
  };
51
50
  return EventDelegateHook;
52
- }(Element), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "stopTapPropagation", [_dec2], {
51
+ }(Element), _descriptor = _applyDecoratedDescriptor(_class2.prototype, "stopTapPropagation", [_dec2], {
53
52
  configurable: true,
54
53
  enumerable: true,
55
54
  writable: true,
@@ -61,8 +60,8 @@ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/core/Element"], function (Cla
61
60
  enumerable: true,
62
61
  writable: true,
63
62
  initializer: null
64
- })), _class2)) || _class);
63
+ }), _class2)) || _class);
65
64
  _exports = EventDelegateHook;
66
65
  return _exports;
67
66
  }, false);
68
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFdmVudERlbGVnYXRlSG9vayIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9kZWMyIiwicHJvcGVydHkiLCJ0eXBlIiwiX2RlYzMiLCJldmVudCIsIl9jbGFzcyIsIl9jbGFzczIiLCJfRWxlbWVudCIsIl9pbmhlcml0c0xvb3NlIiwiaWRPclNldHRpbmdzIiwic2V0dGluZ3MiLCJfdGhpcyIsImNhbGwiLCJfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSIsIl9kZXNjcmlwdG9yIiwiX2Fzc2VydFRoaXNJbml0aWFsaXplZCIsIl9kZXNjcmlwdG9yMiIsIl9leHBvcnRzIiwiX3Byb3RvIiwicHJvdG90eXBlIiwic2V0UGFyZW50IiwicGFyZW50T2JqZWN0IiwiZ2V0UGFyZW50IiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsImFkZEV2ZW50RGVsZWdhdGUiLCJvbnRhcCIsInRhcEV2ZW50Iiwic3RvcFRhcFByb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwiZmlyZUV2ZW50IiwiRWxlbWVudCIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJpbml0aWFsaXplciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRXZlbnREZWxlZ2F0ZUhvb2sudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9wZXJ0aWVzT2YgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXZlbnQsIHByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyAkRWxlbWVudFNldHRpbmdzIH0gZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgdHlwZSB7IEV2ZW50SGFuZGxlciB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuLyoqXG4gKiBDcmVhdGUgYW4gZXZlbnQgZGVsZWdhdGUgaG9vayBvbiB0aGUgcGFyZW50IG9mIHRoaXMgY29udHJvbCB0byBkZWFsIHdpdGggZXZlbnQgcHJvcGFnYXRpb24uXG4gKlxuICogVGhpcyBpcyBhIHNwZWNpZmljIHNvbHV0aW9uIGZvciB0aGUgQXZhdGFyIGNvbnRyb2wgY2FzZSB3aGVyZSB0aGUgcHJlc3MgY2Fubm90IGJlIGludGVycnVwdGVkIGFuZCB3aGljaCB0aGVuIGVuZHMgdXAgaW50ZXJhY3Rpbmcgd2l0aCBjb250cm9sIGJlaGluZCBpdC5cbiAqXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5iYXNlLkV2ZW50RGVsZWdhdGVIb29rXCIpXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudERlbGVnYXRlSG9vayBleHRlbmRzIEVsZW1lbnQge1xuXHRAcHJvcGVydHkoeyB0eXBlOiBcImJvb2xlYW5cIiB9KVxuXHRzdG9wVGFwUHJvcGFnYXRpb24gPSBmYWxzZTtcblxuXHRAZXZlbnQoKVxuXHR0YXA/OiBFdmVudEhhbmRsZXI7XG5cblx0Y29uc3RydWN0b3IoaWRPclNldHRpbmdzPzogRXZlbnREZWxlZ2F0ZVNldHRpbmdzKTtcblxuXHRjb25zdHJ1Y3RvcihpZE9yU2V0dGluZ3M6IHN0cmluZywgc2V0dGluZ3M/OiBFdmVudERlbGVnYXRlU2V0dGluZ3MpO1xuXG5cdGNvbnN0cnVjdG9yKGlkT3JTZXR0aW5ncz86IHN0cmluZyB8IFByb3BlcnRpZXNPZjxFdmVudERlbGVnYXRlSG9vaz4sIHNldHRpbmdzPzogRXZlbnREZWxlZ2F0ZVNldHRpbmdzKSB7XG5cdFx0c3VwZXIoaWRPclNldHRpbmdzIGFzIHN0cmluZywgc2V0dGluZ3MpO1xuXHR9XG5cblx0c2V0UGFyZW50KHBhcmVudE9iamVjdDogRWxlbWVudCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmdldFBhcmVudCgpKSB7XG5cdFx0XHQodGhpcy5nZXRQYXJlbnQoKSBhcyBFbGVtZW50KS5yZW1vdmVFdmVudERlbGVnYXRlKHRoaXMpO1xuXHRcdH1cblx0XHRwYXJlbnRPYmplY3QuYWRkRXZlbnREZWxlZ2F0ZSh0aGlzKTtcblx0XHRzdXBlci5zZXRQYXJlbnQocGFyZW50T2JqZWN0KTtcblx0fVxuXG5cdG9udGFwKHRhcEV2ZW50OiBKUXVlcnkuRXZlbnQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5zdG9wVGFwUHJvcGFnYXRpb24pIHtcblx0XHRcdHRhcEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0XHR0aGlzLmZpcmVFdmVudChcInRhcFwiKTtcblx0fVxufVxuXG50eXBlIEV2ZW50RGVsZWdhdGVTZXR0aW5ncyA9ICRFbGVtZW50U2V0dGluZ3MgJiBQcm9wZXJ0aWVzT2Y8RXZlbnREZWxlZ2F0ZUhvb2s+O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQSxJQU9xQkEsaUJBQWlCLElBQUFDLElBQUEsR0FEckNDLGNBQWMsQ0FBQywrQkFBK0IsQ0FBQyxFQUFBQyxLQUFBLEdBRTlDQyxRQUFRLENBQUM7SUFBRUMsSUFBSSxFQUFFO0VBQVUsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0FHN0JDLEtBQUssQ0FBQyxDQUFDLEVBQUFOLElBQUEsQ0FBQU8sTUFBQSxJQUFBQyxPQUFBLDBCQUFBQyxRQUFBO0lBQUFDLGNBQUEsQ0FBQVgsaUJBQUEsRUFBQVUsUUFBQTtJQU9SLFNBQUFWLGtCQUFZWSxZQUF1RCxFQUFFQyxRQUFnQyxFQUFFO01BQUEsSUFBQUMsS0FBQTtNQUN0R0EsS0FBQSxHQUFBSixRQUFBLENBQUFLLElBQUEsT0FBTUgsWUFBWSxFQUFZQyxRQUFRLENBQUM7TUFBQ0csMEJBQUEsQ0FBQUYsS0FBQSx3QkFBQUcsV0FBQSxFQUFBQyxzQkFBQSxDQUFBSixLQUFBO01BQUFFLDBCQUFBLENBQUFGLEtBQUEsU0FBQUssWUFBQSxFQUFBRCxzQkFBQSxDQUFBSixLQUFBO01BQUEsT0FBQUEsS0FBQTtJQUN6QztJQUFDTSxRQUFBLEdBQUFwQixpQkFBQTtJQUFBLElBQUFxQixNQUFBLEdBQUFyQixpQkFBQSxDQUFBc0IsU0FBQTtJQUFBRCxNQUFBLENBRURFLFNBQVMsR0FBVCxTQUFBQSxVQUFVQyxZQUFxQixFQUFRO01BQ3RDLElBQUksSUFBSSxDQUFDQyxTQUFTLENBQUMsQ0FBQyxFQUFFO1FBQ3BCLElBQUksQ0FBQ0EsU0FBUyxDQUFDLENBQUMsQ0FBYUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO01BQ3hEO01BQ0FGLFlBQVksQ0FBQ0csZ0JBQWdCLENBQUMsSUFBSSxDQUFDO01BQ25DakIsUUFBQSxDQUFBWSxTQUFBLENBQU1DLFNBQVMsQ0FBQVIsSUFBQSxPQUFDUyxZQUFZO0lBQzdCLENBQUM7SUFBQUgsTUFBQSxDQUVETyxLQUFLLEdBQUwsU0FBQUEsTUFBTUMsUUFBc0IsRUFBUTtNQUNuQyxJQUFJLElBQUksQ0FBQ0Msa0JBQWtCLEVBQUU7UUFDNUJELFFBQVEsQ0FBQ0UsZUFBZSxDQUFDLENBQUM7TUFDM0I7TUFDQSxJQUFJLENBQUNDLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUFBLE9BQUFoQyxpQkFBQTtFQUFBLEVBNUI2Q2lDLE9BQU8sSUFBQWhCLFdBQUEsR0FBQWlCLHlCQUFBLENBQUF6QixPQUFBLENBQUFhLFNBQUEseUJBQUFuQixLQUFBO0lBQUFnQyxZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBLFdBQUFBLENBQUE7TUFBQSxPQUVoQyxLQUFLO0lBQUE7RUFBQSxJQUFBbkIsWUFBQSxHQUFBZSx5QkFBQSxDQUFBekIsT0FBQSxDQUFBYSxTQUFBLFVBQUFoQixLQUFBO0lBQUE2QixZQUFBO0lBQUFDLFVBQUE7SUFBQUMsUUFBQTtJQUFBQyxXQUFBO0VBQUEsS0FBQTdCLE9BQUEsTUFBQUQsTUFBQTtFQUFBWSxRQUFBLEdBQUFwQixpQkFBQTtFQUFBLE9BQUFvQixRQUFBO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
67
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFdmVudERlbGVnYXRlSG9vayIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9kZWMyIiwicHJvcGVydHkiLCJ0eXBlIiwiX2RlYzMiLCJldmVudCIsIl9jbGFzcyIsIl9jbGFzczIiLCJfRWxlbWVudCIsImlkT3JTZXR0aW5ncyIsInNldHRpbmdzIiwiX3RoaXMiLCJjYWxsIiwiX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkiLCJfZGVzY3JpcHRvciIsIl9kZXNjcmlwdG9yMiIsIl9leHBvcnRzIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJzZXRQYXJlbnQiLCJwYXJlbnRPYmplY3QiLCJnZXRQYXJlbnQiLCJyZW1vdmVFdmVudERlbGVnYXRlIiwiYWRkRXZlbnREZWxlZ2F0ZSIsIm9udGFwIiwidGFwRXZlbnQiLCJzdG9wVGFwUHJvcGFnYXRpb24iLCJzdG9wUHJvcGFnYXRpb24iLCJmaXJlRXZlbnQiLCJFbGVtZW50IiwiX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImluaXRpYWxpemVyIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJFdmVudERlbGVnYXRlSG9vay50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFByb3BlcnRpZXNPZiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBldmVudCwgcHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7ICRFbGVtZW50U2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIHsgRXZlbnRIYW5kbGVyIH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBldmVudCBkZWxlZ2F0ZSBob29rIG9uIHRoZSBwYXJlbnQgb2YgdGhpcyBjb250cm9sIHRvIGRlYWwgd2l0aCBldmVudCBwcm9wYWdhdGlvbi5cbiAqXG4gKiBUaGlzIGlzIGEgc3BlY2lmaWMgc29sdXRpb24gZm9yIHRoZSBBdmF0YXIgY29udHJvbCBjYXNlIHdoZXJlIHRoZSBwcmVzcyBjYW5ub3QgYmUgaW50ZXJydXB0ZWQgYW5kIHdoaWNoIHRoZW4gZW5kcyB1cCBpbnRlcmFjdGluZyB3aXRoIGNvbnRyb2wgYmVoaW5kIGl0LlxuICpcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmJhc2UuRXZlbnREZWxlZ2F0ZUhvb2tcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50RGVsZWdhdGVIb29rIGV4dGVuZHMgRWxlbWVudCB7XG5cdEBwcm9wZXJ0eSh7IHR5cGU6IFwiYm9vbGVhblwiIH0pXG5cdHN0b3BUYXBQcm9wYWdhdGlvbiA9IGZhbHNlO1xuXG5cdEBldmVudCgpXG5cdHRhcD86IEV2ZW50SGFuZGxlcjtcblxuXHRjb25zdHJ1Y3RvcihpZE9yU2V0dGluZ3M/OiBFdmVudERlbGVnYXRlU2V0dGluZ3MpO1xuXG5cdGNvbnN0cnVjdG9yKGlkT3JTZXR0aW5nczogc3RyaW5nLCBzZXR0aW5ncz86IEV2ZW50RGVsZWdhdGVTZXR0aW5ncyk7XG5cblx0Y29uc3RydWN0b3IoaWRPclNldHRpbmdzPzogc3RyaW5nIHwgUHJvcGVydGllc09mPEV2ZW50RGVsZWdhdGVIb29rPiwgc2V0dGluZ3M/OiBFdmVudERlbGVnYXRlU2V0dGluZ3MpIHtcblx0XHRzdXBlcihpZE9yU2V0dGluZ3MgYXMgc3RyaW5nLCBzZXR0aW5ncyk7XG5cdH1cblxuXHRzZXRQYXJlbnQocGFyZW50T2JqZWN0OiBFbGVtZW50KTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuZ2V0UGFyZW50KCkpIHtcblx0XHRcdCh0aGlzLmdldFBhcmVudCgpIGFzIEVsZW1lbnQpLnJlbW92ZUV2ZW50RGVsZWdhdGUodGhpcyk7XG5cdFx0fVxuXHRcdHBhcmVudE9iamVjdC5hZGRFdmVudERlbGVnYXRlKHRoaXMpO1xuXHRcdHN1cGVyLnNldFBhcmVudChwYXJlbnRPYmplY3QpO1xuXHR9XG5cblx0b250YXAodGFwRXZlbnQ6IEpRdWVyeS5FdmVudCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLnN0b3BUYXBQcm9wYWdhdGlvbikge1xuXHRcdFx0dGFwRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHRcdHRoaXMuZmlyZUV2ZW50KFwidGFwXCIpO1xuXHR9XG59XG5cbnR5cGUgRXZlbnREZWxlZ2F0ZVNldHRpbmdzID0gJEVsZW1lbnRTZXR0aW5ncyAmIFByb3BlcnRpZXNPZjxFdmVudERlbGVnYXRlSG9vaz47XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEEsSUFPcUJBLGlCQUFpQixJQUFBQyxJQUFBLEdBRHJDQyxjQUFjLENBQUMsK0JBQStCLENBQUMsRUFBQUMsS0FBQSxHQUU5Q0MsUUFBUSxDQUFDO0lBQUVDLElBQUksRUFBRTtFQUFVLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBRzdCQyxLQUFLLENBQUMsQ0FBQyxFQUFBTixJQUFBLENBQUFPLE1BQUEsSUFBQUMsT0FBQSwwQkFBQUMsUUFBQTtJQU9SLFNBQUFWLGtCQUFZVyxZQUF1RCxFQUFFQyxRQUFnQyxFQUFFO01BQUEsSUFBQUMsS0FBQTtNQUN0R0EsS0FBQSxHQUFBSCxRQUFBLENBQUFJLElBQUEsT0FBTUgsWUFBWSxFQUFZQyxRQUFRLENBQUM7TUFBQ0csMEJBQUEsQ0FBQUYsS0FBQSx3QkFBQUcsV0FBQSxFQUFBSCxLQUFBO01BQUFFLDBCQUFBLENBQUFGLEtBQUEsU0FBQUksWUFBQSxFQUFBSixLQUFBO01BQUEsT0FBQUEsS0FBQTtJQUN6QztJQUFDSyxRQUFBLEdBQUFsQixpQkFBQTtJQUFBbUIsY0FBQSxDQUFBbkIsaUJBQUEsRUFBQVUsUUFBQTtJQUFBLElBQUFVLE1BQUEsR0FBQXBCLGlCQUFBLENBQUFxQixTQUFBO0lBQUFELE1BQUEsQ0FFREUsU0FBUyxHQUFULFNBQUFBLFNBQVNBLENBQUNDLFlBQXFCLEVBQVE7TUFDdEMsSUFBSSxJQUFJLENBQUNDLFNBQVMsQ0FBQyxDQUFDLEVBQUU7UUFDcEIsSUFBSSxDQUFDQSxTQUFTLENBQUMsQ0FBQyxDQUFhQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUM7TUFDeEQ7TUFDQUYsWUFBWSxDQUFDRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7TUFDbkNoQixRQUFBLENBQUFXLFNBQUEsQ0FBTUMsU0FBUyxDQUFBUixJQUFBLE9BQUNTLFlBQVk7SUFDN0IsQ0FBQztJQUFBSCxNQUFBLENBRURPLEtBQUssR0FBTCxTQUFBQSxLQUFLQSxDQUFDQyxRQUFzQixFQUFRO01BQ25DLElBQUksSUFBSSxDQUFDQyxrQkFBa0IsRUFBRTtRQUM1QkQsUUFBUSxDQUFDRSxlQUFlLENBQUMsQ0FBQztNQUMzQjtNQUNBLElBQUksQ0FBQ0MsU0FBUyxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBQUEsT0FBQS9CLGlCQUFBO0VBQUEsRUE1QjZDZ0MsT0FBTyxHQUFBaEIsV0FBQSxHQUFBaUIseUJBQUEsQ0FBQXhCLE9BQUEsQ0FBQVksU0FBQSx5QkFBQWxCLEtBQUE7SUFBQStCLFlBQUE7SUFBQUMsVUFBQTtJQUFBQyxRQUFBO0lBQUFDLFdBQUEsV0FBQUEsQ0FBQTtNQUFBLE9BRWhDLEtBQUs7SUFBQTtFQUFBLElBQUFwQixZQUFBLEdBQUFnQix5QkFBQSxDQUFBeEIsT0FBQSxDQUFBWSxTQUFBLFVBQUFmLEtBQUE7SUFBQTRCLFlBQUE7SUFBQUMsVUFBQTtJQUFBQyxRQUFBO0lBQUFDLFdBQUE7RUFBQSxJQUFBNUIsT0FBQSxNQUFBRCxNQUFBO0VBQUFVLFFBQUEsR0FBQWxCLGlCQUFBO0VBQUEsT0FBQWtCLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
@@ -2,14 +2,16 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define([], function () {
5
+ sap.ui.define(["sap/base/util/deepClone"], function (deepClone) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
9
  /**
10
10
  * This type is to be extended with all controller extensions and methods that are hookable.
11
11
  */
12
+
12
13
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+
13
15
  // Use two arrays as we cannot index a map through an arbitrary object instance
14
16
  const registeredInstances = [];
15
17
  const registeredHandlers = [];
@@ -44,7 +46,7 @@ sap.ui.define([], function () {
44
46
  if (execution === "BeforeAsync" || execution === "AfterAsync") {
45
47
  descriptor.value = async function () {
46
48
  const cExTInstanceHookMap = this;
47
- const handlers = (cExTInstanceHookMap === null || cExTInstanceHookMap === void 0 ? void 0 : cExTInstanceHookMap.hookedHandlers) && (cExTInstanceHookMap === null || cExTInstanceHookMap === void 0 ? void 0 : cExTInstanceHookMap.hookedHandlers[propertyKey.toString()]) || [];
49
+ const handlers = cExTInstanceHookMap?.hookedHandlers && cExTInstanceHookMap?.hookedHandlers[propertyKey.toString()] || [];
48
50
  let returnValue;
49
51
  if (execution === "AfterAsync") {
50
52
  returnValue = await oldValue.bind(this)(...arguments);
@@ -60,7 +62,7 @@ sap.ui.define([], function () {
60
62
  } else {
61
63
  descriptor.value = function () {
62
64
  const cExTInstanceHookMap = this;
63
- const handlers = (cExTInstanceHookMap === null || cExTInstanceHookMap === void 0 ? void 0 : cExTInstanceHookMap.hookedHandlers) && (cExTInstanceHookMap === null || cExTInstanceHookMap === void 0 ? void 0 : cExTInstanceHookMap.hookedHandlers[propertyKey.toString()]) || [];
65
+ const handlers = cExTInstanceHookMap?.hookedHandlers && cExTInstanceHookMap?.hookedHandlers[propertyKey.toString()] || [];
64
66
  let returnValue;
65
67
  if (execution === "After") {
66
68
  returnValue = oldValue.bind(this)(...arguments);
@@ -87,6 +89,7 @@ sap.ui.define([], function () {
87
89
  function isAlreadyRegistered(existingRegistrations, newRegistration) {
88
90
  return !!existingRegistrations.find(r => r.name === newRegistration.name && r.method === newRegistration.method && r.targetMethod === newRegistration.targetMethod);
89
91
  }
92
+ const hooks = Symbol("hooks");
90
93
 
91
94
  /**
92
95
  * Registers a method as controller extension hook handler.
@@ -96,6 +99,7 @@ sap.ui.define([], function () {
96
99
  * @param method Method to hook into
97
100
  * @returns A method decorator
98
101
  */
102
+ _exports.hooks = hooks;
99
103
  function controllerExtensionHandler(name, method) {
100
104
  return function (target, propertyKey) {
101
105
  const newRegistration = {
@@ -104,7 +108,12 @@ sap.ui.define([], function () {
104
108
  targetMethod: propertyKey
105
109
  };
106
110
  const index = registeredInstances.indexOf(target.constructor);
107
-
111
+ if (!target.constructor[hooks]) {
112
+ Object.defineProperty(target.constructor, hooks, {
113
+ value: []
114
+ });
115
+ }
116
+ target.constructor[hooks]?.push(newRegistration);
108
117
  // We need to check if this exact handler is already registered as handlers are registered statically (on the constructor)
109
118
  if (index !== -1 && !isAlreadyRegistered(registeredHandlers[index], newRegistration)) {
110
119
  registeredHandlers[index].push(newRegistration);
@@ -123,21 +132,42 @@ sap.ui.define([], function () {
123
132
  */
124
133
  _exports.controllerExtensionHandler = controllerExtensionHandler;
125
134
  function initControllerExtensionHookHandlers(target, controller) {
126
- const index = registeredInstances.indexOf(target.constructor);
127
- if (index !== -1) {
128
- const indexableController = controller;
135
+ if (target.constructor[hooks]) {
136
+ let registeredHooks = target.constructor[hooks];
137
+ target[hooks] = deepClone(registeredHooks);
138
+ registeredHooks = target[hooks];
129
139
  const indexableTarget = target;
130
- for (const registeredHandler of registeredHandlers[index]) {
131
- var _controller$getView;
132
- const handlerFunction = indexableTarget[registeredHandler.targetMethod].bind(target);
133
- indexableController[registeredHandler.name][`attach${String(registeredHandler.method)}`](handlerFunction);
134
- (_controller$getView = controller.getView()) === null || _controller$getView === void 0 ? void 0 : _controller$getView.attachBeforeExit(() => {
135
- indexableController[registeredHandler.name][`detach${String(registeredHandler.method)}`](handlerFunction);
140
+ const indexableController = controller;
141
+ for (const registeredHook of registeredHooks) {
142
+ registeredHook.handlerFunction = indexableTarget[registeredHook.targetMethod].bind(target);
143
+ indexableController[registeredHook.name][`attach${String(registeredHook.method)}`](registeredHook.handlerFunction);
144
+ controller.getView()?.attachBeforeExit(() => {
145
+ indexableController[registeredHook.name][`detach${String(registeredHook.method)}`](registeredHook.handlerFunction);
136
146
  });
137
147
  }
138
148
  }
139
149
  }
140
150
  _exports.initControllerExtensionHookHandlers = initControllerExtensionHookHandlers;
151
+ function removeControllerExtensionHookHandlers(target, controller) {
152
+ if (target[hooks]) {
153
+ const registeredHooks = target[hooks];
154
+ const indexableController = controller;
155
+ for (const registeredHook of registeredHooks) {
156
+ indexableController[registeredHook.name]?.[`detach${String(registeredHook.method)}`]?.(registeredHook.handlerFunction);
157
+ }
158
+ }
159
+ }
160
+ _exports.removeControllerExtensionHookHandlers = removeControllerExtensionHookHandlers;
161
+ function propagateHookFromMixin(target, source) {
162
+ if (source[hooks]) {
163
+ if (target[hooks]) {
164
+ target[hooks].splice(0, 0, ...source[hooks]);
165
+ } else {
166
+ Object.defineProperty(target, hooks, Object.getOwnPropertyDescriptor(source, hooks) || Object.create([]));
167
+ }
168
+ }
169
+ }
170
+ _exports.propagateHookFromMixin = propagateHookFromMixin;
141
171
  function xmlViewPreprocessor(source, _caller, _settings) {
142
172
  const sourceView = source;
143
173
  const controller = sourceView.getController();
@@ -151,4 +181,4 @@ sap.ui.define([], function () {
151
181
  _exports.xmlViewPreprocessor = xmlViewPreprocessor;
152
182
  return _exports;
153
183
  }, false);
154
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWdpc3RlcmVkSW5zdGFuY2VzIiwicmVnaXN0ZXJlZEhhbmRsZXJzIiwiaG9va2FibGUiLCJleGVjdXRpb24iLCJ0YXJnZXQiLCJwcm9wZXJ0eUtleSIsImRlc2NyaXB0b3IiLCJpbmRleGFibGVUYXJnZXQiLCJ0b1N0cmluZyIsImZuIiwiY0V4VEluc3RhbmNlSG9va01hcCIsImhvb2tlZEhhbmRsZXJzIiwicHVzaCIsImhhbmRsZXJzIiwiaW5kZXgiLCJpbmRleE9mIiwic3BsaWNlIiwib2xkVmFsdWUiLCJ2YWx1ZSIsInJldHVyblZhbHVlIiwiYmluZCIsImFyZ3VtZW50cyIsImhhbmRsZXIiLCJfZXhwb3J0cyIsImlzQWxyZWFkeVJlZ2lzdGVyZWQiLCJleGlzdGluZ1JlZ2lzdHJhdGlvbnMiLCJuZXdSZWdpc3RyYXRpb24iLCJmaW5kIiwiciIsIm5hbWUiLCJtZXRob2QiLCJ0YXJnZXRNZXRob2QiLCJjb250cm9sbGVyRXh0ZW5zaW9uSGFuZGxlciIsIlN0cmluZyIsImNvbnN0cnVjdG9yIiwiaW5pdENvbnRyb2xsZXJFeHRlbnNpb25Ib29rSGFuZGxlcnMiLCJjb250cm9sbGVyIiwiaW5kZXhhYmxlQ29udHJvbGxlciIsInJlZ2lzdGVyZWRIYW5kbGVyIiwiX2NvbnRyb2xsZXIkZ2V0VmlldyIsImhhbmRsZXJGdW5jdGlvbiIsImdldFZpZXciLCJhdHRhY2hCZWZvcmVFeGl0IiwieG1sVmlld1ByZXByb2Nlc3NvciIsInNvdXJjZSIsIl9jYWxsZXIiLCJfc2V0dGluZ3MiLCJzb3VyY2VWaWV3IiwiZ2V0Q29udHJvbGxlciIsIm1hY3JvQVBJQ2hpbGQiLCJmaW5kQWdncmVnYXRlZE9iamVjdHMiLCJzIiwiaXNBIiwibWFuYWdlZE9iamVjdCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSG9va1N1cHBvcnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFeHRlbnNpb25PdmVycmlkZUV4ZWN1dGlvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBYTUxWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvWE1MVmlld1wiO1xuXG4vKipcbiAqIFRoaXMgdHlwZSBpcyB0byBiZSBleHRlbmRlZCB3aXRoIGFsbCBjb250cm9sbGVyIGV4dGVuc2lvbnMgYW5kIG1ldGhvZHMgdGhhdCBhcmUgaG9va2FibGUuXG4gKi9cbnR5cGUgSG9va2FibGVDb250cm9sbGVyRXh0ZW5zaW9ucyA9IHtcblx0ZWRpdEZsb3c6IHtcblx0XHRvbkFmdGVyU2F2ZTogdHJ1ZTtcblx0XHRvbkJlZm9yZVNhdmU6IHRydWU7XG5cdH07XG5cdGNvbGxhYm9yYXRpb25NYW5hZ2VyOiB7XG5cdFx0Y29sbGVjdEF2YWlsYWJsZUNhcmRzOiB0cnVlO1xuXHR9O1xuXHRwYWdpbmF0b3I6IHtcblx0XHRpbml0aWFsaXplOiB0cnVlO1xuXHR9O1xuXHRyb3V0aW5nOiB7XG5cdFx0b25BZnRlckJpbmRpbmc6IHRydWU7XG5cdH07XG59O1xuXG50eXBlIEhhbmRsZXJDb25maWd1cmF0aW9uPENFeHROYW1lIGV4dGVuZHMga2V5b2YgSG9va2FibGVDb250cm9sbGVyRXh0ZW5zaW9ucz4gPSB7XG5cdG5hbWU6IENFeHROYW1lO1xuXHRtZXRob2Q6IGtleW9mIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnNbQ0V4dE5hbWVdO1xufTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIEhhbmRsZXJSZWdpc3RyYXRpb24gPSBIYW5kbGVyQ29uZmlndXJhdGlvbjxhbnk+ICYgeyB0YXJnZXRNZXRob2Q6IHN0cmluZyB9O1xuXG50eXBlIEZ1bmN0aW9uTWFwID0ge1xuXHRba2V5OiBzdHJpbmddOiBGdW5jdGlvbjtcbn07XG50eXBlIERlZXBGdW5jdGlvbk1hcCA9IHtcblx0W2tleTogc3RyaW5nXTogRnVuY3Rpb25NYXA7XG59O1xudHlwZSBIb29rTWFwID0ge1xuXHRob29rZWRIYW5kbGVyczoge1xuXHRcdFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uW107XG5cdH07XG59O1xuXG4vLyBVc2UgdHdvIGFycmF5cyBhcyB3ZSBjYW5ub3QgaW5kZXggYSBtYXAgdGhyb3VnaCBhbiBhcmJpdHJhcnkgb2JqZWN0IGluc3RhbmNlXG5jb25zdCByZWdpc3RlcmVkSW5zdGFuY2VzOiBGdW5jdGlvbltdID0gW107XG5jb25zdCByZWdpc3RlcmVkSGFuZGxlcnM6IEhhbmRsZXJSZWdpc3RyYXRpb25bXVtdID0gW107XG5cbi8qKlxuICogTWFya3MgYSBjb250cm9sbGVyIGV4dGVuc2lvbiBtZXRob2QgdG8gYmUgaG9va2FibGUgYnkgZ2VuZXJhdGluZyBhZGRpdGlvbmFsIG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBhdHRhY2ggYW5kIGRldGFjaCBoYW5kbGVycyBhdCBydW50aW1lLlxuICogQHBhcmFtIGV4ZWN1dGlvblxuICogQHJldHVybnMgQSBtZXRob2QgZGVjb3JhdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob29rYWJsZShleGVjdXRpb246IEV4dGVuc2lvbk92ZXJyaWRlRXhlY3V0aW9uKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IHVua25vd24sIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IGluZGV4YWJsZVRhcmdldCA9IHRhcmdldCBhcyBGdW5jdGlvbk1hcDtcblxuXHRcdGluZGV4YWJsZVRhcmdldFtgYXR0YWNoJHtwcm9wZXJ0eUtleS50b1N0cmluZygpfWBdID0gZnVuY3Rpb24gKGZuOiBGdW5jdGlvbik6IHZvaWQge1xuXHRcdFx0Y29uc3QgY0V4VEluc3RhbmNlSG9va01hcCA9IHRoaXMgYXMgdW5rbm93biBhcyBIb29rTWFwO1xuXHRcdFx0aWYgKCFjRXhUSW5zdGFuY2VIb29rTWFwLmhvb2tlZEhhbmRsZXJzKSB7XG5cdFx0XHRcdGNFeFRJbnN0YW5jZUhvb2tNYXAuaG9va2VkSGFuZGxlcnMgPSB7fTtcblx0XHRcdH1cblx0XHRcdGlmICghY0V4VEluc3RhbmNlSG9va01hcC5ob29rZWRIYW5kbGVyc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0XHRjRXhUSW5zdGFuY2VIb29rTWFwLmhvb2tlZEhhbmRsZXJzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0gW107XG5cdFx0XHR9XG5cdFx0XHRjRXhUSW5zdGFuY2VIb29rTWFwLmhvb2tlZEhhbmRsZXJzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLnB1c2goZm4pO1xuXHRcdH07XG5cdFx0aW5kZXhhYmxlVGFyZ2V0W2BkZXRhY2gke3Byb3BlcnR5S2V5LnRvU3RyaW5nKCl9YF0gPSBmdW5jdGlvbiAoZm46IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0XHRjb25zdCBjRXhUSW5zdGFuY2VIb29rTWFwID0gdGhpcyBhcyB1bmtub3duIGFzIEhvb2tNYXA7XG5cdFx0XHRjb25zdCBoYW5kbGVycyA9IGNFeFRJbnN0YW5jZUhvb2tNYXAuaG9va2VkSGFuZGxlcnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV07XG5cdFx0XHRjb25zdCBpbmRleCA9IGhhbmRsZXJzLmluZGV4T2YoZm4pO1xuXHRcdFx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCBvbGRWYWx1ZSA9IGRlc2NyaXB0b3IudmFsdWU7XG5cdFx0aWYgKGV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVBc3luY1wiIHx8IGV4ZWN1dGlvbiA9PT0gXCJBZnRlckFzeW5jXCIpIHtcblx0XHRcdGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0XHRcdGNvbnN0IGNFeFRJbnN0YW5jZUhvb2tNYXAgPSB0aGlzIGFzIHVua25vd24gYXMgSG9va01hcDtcblx0XHRcdFx0Y29uc3QgaGFuZGxlcnMgPSAoY0V4VEluc3RhbmNlSG9va01hcD8uaG9va2VkSGFuZGxlcnMgJiYgY0V4VEluc3RhbmNlSG9va01hcD8uaG9va2VkSGFuZGxlcnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHx8IFtdO1xuXHRcdFx0XHRsZXQgcmV0dXJuVmFsdWU6IHVua25vd247XG5cdFx0XHRcdGlmIChleGVjdXRpb24gPT09IFwiQWZ0ZXJBc3luY1wiKSB7XG5cdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBhd2FpdCBvbGRWYWx1ZS5iaW5kKHRoaXMpKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuXHRcdFx0XHRcdGF3YWl0IGhhbmRsZXIuYmluZCh0aGlzKSguLi5hcmdzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXhlY3V0aW9uID09PSBcIkJlZm9yZUFzeW5jXCIpIHtcblx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IGF3YWl0IG9sZFZhbHVlLmJpbmQodGhpcykoLi4uYXJncyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJldHVyblZhbHVlO1xuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pOiB1bmtub3duIHtcblx0XHRcdFx0Y29uc3QgY0V4VEluc3RhbmNlSG9va01hcCA9IHRoaXMgYXMgdW5rbm93biBhcyBIb29rTWFwO1xuXHRcdFx0XHRjb25zdCBoYW5kbGVycyA9IChjRXhUSW5zdGFuY2VIb29rTWFwPy5ob29rZWRIYW5kbGVycyAmJiBjRXhUSW5zdGFuY2VIb29rTWFwPy5ob29rZWRIYW5kbGVyc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkgfHwgW107XG5cdFx0XHRcdGxldCByZXR1cm5WYWx1ZTogdW5rbm93bjtcblx0XHRcdFx0aWYgKGV4ZWN1dGlvbiA9PT0gXCJBZnRlclwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBvbGRWYWx1ZS5iaW5kKHRoaXMpKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuXHRcdFx0XHRcdGhhbmRsZXIuYmluZCh0aGlzKSguLi5hcmdzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXhlY3V0aW9uID09PSBcIkJlZm9yZVwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBvbGRWYWx1ZS5iaW5kKHRoaXMpKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0XHRcdH07XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbmV3UmVnaXN0cmF0aW9uIGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gc29tZSBleGlzdGluZ1JlZ2lzdHJhdGlvbnMgYnkgY29tcGFyaW5nIGFsbCByZWxldmFudCBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIGV4aXN0aW5nUmVnaXN0cmF0aW9uc1xuICogQHBhcmFtIG5ld1JlZ2lzdHJhdGlvblxuICogQHJldHVybnMgUmVzdWx0IG9mIHRoZSBjaGVja1xuICovXG5mdW5jdGlvbiBpc0FscmVhZHlSZWdpc3RlcmVkKGV4aXN0aW5nUmVnaXN0cmF0aW9uczogSGFuZGxlclJlZ2lzdHJhdGlvbltdLCBuZXdSZWdpc3RyYXRpb246IEhhbmRsZXJSZWdpc3RyYXRpb24pOiBib29sZWFuIHtcblx0cmV0dXJuICEhZXhpc3RpbmdSZWdpc3RyYXRpb25zLmZpbmQoXG5cdFx0KHIpID0+IHIubmFtZSA9PT0gbmV3UmVnaXN0cmF0aW9uLm5hbWUgJiYgci5tZXRob2QgPT09IG5ld1JlZ2lzdHJhdGlvbi5tZXRob2QgJiYgci50YXJnZXRNZXRob2QgPT09IG5ld1JlZ2lzdHJhdGlvbi50YXJnZXRNZXRob2Rcblx0KTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBtZXRob2QgYXMgY29udHJvbGxlciBleHRlbnNpb24gaG9vayBoYW5kbGVyLlxuICpcbiAqIEN1cnJlbnRseSwgb25seSBtZXRob2RzIG9mIHJ1bnRpbWUgYnVpbGRpbmcgYmxvY2tzIGFyZSBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gbmFtZSBDb250cm9sbGVyIGV4dGVuc2lvbiB0byBob29rIGludG9cbiAqIEBwYXJhbSBtZXRob2QgTWV0aG9kIHRvIGhvb2sgaW50b1xuICogQHJldHVybnMgQSBtZXRob2QgZGVjb3JhdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cm9sbGVyRXh0ZW5zaW9uSGFuZGxlcjxDRXh0TmFtZSBleHRlbmRzIGtleW9mIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnM+KFxuXHRuYW1lOiBDRXh0TmFtZSxcblx0bWV0aG9kOiBrZXlvZiBIb29rYWJsZUNvbnRyb2xsZXJFeHRlbnNpb25zW0NFeHROYW1lXVxuKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IHsgY29uc3RydWN0b3I6IEZ1bmN0aW9uIH0sIHByb3BlcnR5S2V5OiBzdHJpbmcpIHtcblx0XHRjb25zdCBuZXdSZWdpc3RyYXRpb24gPSB7IG5hbWUsIG1ldGhvZDogU3RyaW5nKG1ldGhvZCksIHRhcmdldE1ldGhvZDogcHJvcGVydHlLZXkgfTtcblx0XHRjb25zdCBpbmRleCA9IHJlZ2lzdGVyZWRJbnN0YW5jZXMuaW5kZXhPZih0YXJnZXQuY29uc3RydWN0b3IpO1xuXG5cdFx0Ly8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGlzIGV4YWN0IGhhbmRsZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGFzIGhhbmRsZXJzIGFyZSByZWdpc3RlcmVkIHN0YXRpY2FsbHkgKG9uIHRoZSBjb25zdHJ1Y3Rvcilcblx0XHRpZiAoaW5kZXggIT09IC0xICYmICFpc0FscmVhZHlSZWdpc3RlcmVkKHJlZ2lzdGVyZWRIYW5kbGVyc1tpbmRleF0sIG5ld1JlZ2lzdHJhdGlvbikpIHtcblx0XHRcdHJlZ2lzdGVyZWRIYW5kbGVyc1tpbmRleF0ucHVzaChuZXdSZWdpc3RyYXRpb24pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZWdpc3RlcmVkSW5zdGFuY2VzLnB1c2godGFyZ2V0LmNvbnN0cnVjdG9yKTtcblx0XHRcdHJlZ2lzdGVyZWRIYW5kbGVycy5wdXNoKFtuZXdSZWdpc3RyYXRpb25dKTtcblx0XHR9XG5cdH0gYXMgTWV0aG9kRGVjb3JhdG9yO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGFsbCBjb250cm9sbGVyIGV4dGVuc2lvbiBoYW5kbGVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIHRhcmdldC5cbiAqIEBwYXJhbSB0YXJnZXQgVGFyZ2V0IGNsYXNzIHRvIGluaXRpYWxpemUgdGhlIGhhbmRsZXJzIGZvclxuICogQHBhcmFtIHRhcmdldC5jb25zdHJ1Y3RvclxuICogQHBhcmFtIGNvbnRyb2xsZXIgUGFnZUNvbnRyb2xsZXIgaW5zdGFuY2UgdG8gZ2V0IHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbnMgaW5zdGFuY2VzIGZyb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRDb250cm9sbGVyRXh0ZW5zaW9uSG9va0hhbmRsZXJzKHRhcmdldDogeyBjb25zdHJ1Y3RvcjogRnVuY3Rpb24gfSwgY29udHJvbGxlcjogQ29udHJvbGxlcik6IHZvaWQge1xuXHRjb25zdCBpbmRleCA9IHJlZ2lzdGVyZWRJbnN0YW5jZXMuaW5kZXhPZih0YXJnZXQuY29uc3RydWN0b3IpO1xuXHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0Y29uc3QgaW5kZXhhYmxlQ29udHJvbGxlciA9IGNvbnRyb2xsZXIgYXMgdW5rbm93biBhcyBEZWVwRnVuY3Rpb25NYXA7XG5cdFx0Y29uc3QgaW5kZXhhYmxlVGFyZ2V0ID0gdGFyZ2V0IGFzIHVua25vd24gYXMgRnVuY3Rpb25NYXA7XG5cblx0XHRmb3IgKGNvbnN0IHJlZ2lzdGVyZWRIYW5kbGVyIG9mIHJlZ2lzdGVyZWRIYW5kbGVyc1tpbmRleF0pIHtcblx0XHRcdGNvbnN0IGhhbmRsZXJGdW5jdGlvbiA9IGluZGV4YWJsZVRhcmdldFtyZWdpc3RlcmVkSGFuZGxlci50YXJnZXRNZXRob2RdLmJpbmQodGFyZ2V0KTtcblxuXHRcdFx0aW5kZXhhYmxlQ29udHJvbGxlcltyZWdpc3RlcmVkSGFuZGxlci5uYW1lXVtgYXR0YWNoJHtTdHJpbmcocmVnaXN0ZXJlZEhhbmRsZXIubWV0aG9kKX1gXShoYW5kbGVyRnVuY3Rpb24pO1xuXHRcdFx0Y29udHJvbGxlci5nZXRWaWV3KCk/LmF0dGFjaEJlZm9yZUV4aXQoKCkgPT4ge1xuXHRcdFx0XHRpbmRleGFibGVDb250cm9sbGVyW3JlZ2lzdGVyZWRIYW5kbGVyLm5hbWVdW2BkZXRhY2gke1N0cmluZyhyZWdpc3RlcmVkSGFuZGxlci5tZXRob2QpfWBdKGhhbmRsZXJGdW5jdGlvbik7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHhtbFZpZXdQcmVwcm9jZXNzb3Ioc291cmNlOiBvYmplY3QsIF9jYWxsZXI/OiB1bmtub3duLCBfc2V0dGluZ3M/OiBvYmplY3QpOiB2b2lkIHtcblx0Y29uc3Qgc291cmNlVmlldyA9IHNvdXJjZSBhcyBYTUxWaWV3O1xuXHRjb25zdCBjb250cm9sbGVyID0gc291cmNlVmlldy5nZXRDb250cm9sbGVyKCkgYXMgQ29udHJvbGxlciB8IHVuZGVmaW5lZDtcblx0aWYgKGNvbnRyb2xsZXIpIHtcblx0XHRjb25zdCBtYWNyb0FQSUNoaWxkID0gc291cmNlVmlldy5maW5kQWdncmVnYXRlZE9iamVjdHModHJ1ZSwgKHMpID0+IHMuaXNBKFwic2FwLmZlLm1hY3Jvcy5NYWNyb0FQSVwiKSk7XG5cdFx0Zm9yIChjb25zdCBtYW5hZ2VkT2JqZWN0IG9mIG1hY3JvQVBJQ2hpbGQpIHtcblx0XHRcdGluaXRDb250cm9sbGVyRXh0ZW5zaW9uSG9va0hhbmRsZXJzKG1hbmFnZWRPYmplY3QsIGNvbnRyb2xsZXIpO1xuXHRcdH1cblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztFQUlBO0FBQ0E7QUFDQTtFQXFCQTtFQWVBO0VBQ0EsTUFBTUEsbUJBQStCLEdBQUcsRUFBRTtFQUMxQyxNQUFNQyxrQkFBMkMsR0FBRyxFQUFFOztFQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0MsUUFBUUEsQ0FBQ0MsU0FBcUMsRUFBbUI7SUFDaEYsT0FBTyxVQUFVQyxNQUFlLEVBQUVDLFdBQTRCLEVBQUVDLFVBQThCLEVBQUU7TUFDL0YsTUFBTUMsZUFBZSxHQUFHSCxNQUFxQjtNQUU3Q0csZUFBZSxDQUFDLFNBQVNGLFdBQVcsQ0FBQ0csUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVUMsRUFBWSxFQUFRO1FBQ2xGLE1BQU1DLG1CQUFtQixHQUFHLElBQTBCO1FBQ3RELElBQUksQ0FBQ0EsbUJBQW1CLENBQUNDLGNBQWMsRUFBRTtVQUN4Q0QsbUJBQW1CLENBQUNDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDeEM7UUFDQSxJQUFJLENBQUNELG1CQUFtQixDQUFDQyxjQUFjLENBQUNOLFdBQVcsQ0FBQ0csUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1VBQ2hFRSxtQkFBbUIsQ0FBQ0MsY0FBYyxDQUFDTixXQUFXLENBQUNHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO1FBQ2hFO1FBQ0FFLG1CQUFtQixDQUFDQyxjQUFjLENBQUNOLFdBQVcsQ0FBQ0csUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDSSxJQUFJLENBQUNILEVBQUUsQ0FBQztNQUNwRSxDQUFDO01BQ0RGLGVBQWUsQ0FBQyxTQUFTRixXQUFXLENBQUNHLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVVDLEVBQVksRUFBUTtRQUNsRixNQUFNQyxtQkFBbUIsR0FBRyxJQUEwQjtRQUN0RCxNQUFNRyxRQUFRLEdBQUdILG1CQUFt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TUFDakIsTUFBTXVCLG1CQUFtQixHQUFHRCxVQUF3QztNQUNwRSxNQUFNN0IsZUFBZSxHQUFHSCxNQUFnQztNQUV4RCxLQUFLLE1BQU1rQyxpQkFBaUIsSUFBSXJDLGtCQUFrQixDQUFDYSxLQUFLLENBQUMsRUFBRTtRQUFBLElBQUF5QixtQkFBQTtRQUMxRCxNQUFNQyxlQUFlLEdBQUdqQyxlQUFlLENBQUMrQixpQkFBaUIsQ0FBQ1AsWUFBWSxDQUFDLENBQUNYLElBQUksQ0FBQ2hCLE1BQU0sQ0FBQztRQUVwRmlDLG1CQUFtQixDQUFDQyxpQkFBaUIsQ0FBQ1QsSUFBSSxDQUFDLENBQUMsU0FBU0ksTUFBTSxDQUFDSyxpQkFBaUIsQ0FBQ1IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDVSxlQUFlLENBQUM7UUFDekcsQ0FBQUQsbUJBQUEsR0FBQUgsVUFBVSxDQUFDSyxPQUFPLENBQUMsQ0FBQyxjQUFBRixtQkFBQSx1QkFBcEJBLG1CQUFBLENBQXNCRyxnQkFBZ0IsQ0FBQyxNQUFNO1VBQzVDTCxtQkFBbUIsQ0FBQ0MsaUJBQWlCLENBQUNULElBQUksQ0FBQyxDQUFDLFNBQVNJLE1BQU0sQ0FBQ0ssaUJBQWlCLENBQUNSLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQ1UsZUFBZSxDQUFDO1FBQzFHLENBQUMsQ0FBQztNQUNIO0lBQ0Q7RUFDRDtFQUFDakIsUUFBQSxDQUFBWSxtQ0FBQSxHQUFBQSxtQ0FBQTtFQUVNLFNBQVNRLG1CQUFtQkEsQ0FBQ0MsTUFBYyxFQUFFQyxPQUFpQixFQUFFQyxTQUFrQixFQUFRO0lBQ2hHLE1BQU1DLFVBQVUsR0FBR0gsTUFBaUI7SUFDcEMsTUFBTVIsVUFBVSxHQUFHVyxVQUFVLENBQUNDLGFBQWEsQ0FBQyxDQUEyQjtJQUN2RSxJQUFJWixVQUFVLEVBQUU7TUFDZixNQUFNYSxhQUFhLEdBQUdGLFVBQVUsQ0FBQ0cscUJBQXFCLENBQUMsSUFBSSxFQUFHQyxDQUFDLElBQUtBLENBQUMsQ0FBQ0MsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7TUFDcEcsS0FBSyxNQUFNQyxhQUFhLElBQUlKLGFBQWEsRUFBRTtRQUMxQ2QsbUNBQW1DLENBQUNrQixhQUFhLEVBQUVqQixVQUFVLENBQUM7TUFDL0Q7SUFDRDtFQUNEO0VBQUNiLFFBQUEsQ0FBQW9CLG1CQUFBLEdBQUFBLG1CQUFBO0VBQUEsT0FBQXBCLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
184
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWdpc3RlcmVkSW5zdGFuY2VzIiwicmVnaXN0ZXJlZEhhbmRsZXJzIiwiaG9va2FibGUiLCJleGVjdXRpb24iLCJ0YXJnZXQiLCJwcm9wZXJ0eUtleSIsImRlc2NyaXB0b3IiLCJpbmRleGFibGVUYXJnZXQiLCJ0b1N0cmluZyIsImZuIiwiY0V4VEluc3RhbmNlSG9va01hcCIsImhvb2tlZEhhbmRsZXJzIiwicHVzaCIsImhhbmRsZXJzIiwiaW5kZXgiLCJpbmRleE9mIiwic3BsaWNlIiwib2xkVmFsdWUiLCJ2YWx1ZSIsInJldHVyblZhbHVlIiwiYmluZCIsImFyZ3VtZW50cyIsImhhbmRsZXIiLCJfZXhwb3J0cyIsImlzQWxyZWFkeVJlZ2lzdGVyZWQiLCJleGlzdGluZ1JlZ2lzdHJhdGlvbnMiLCJuZXdSZWdpc3RyYXRpb24iLCJmaW5kIiwiciIsIm5hbWUiLCJtZXRob2QiLCJ0YXJnZXRNZXRob2QiLCJob29rcyIsIlN5bWJvbCIsImNvbnRyb2xsZXJFeHRlbnNpb25IYW5kbGVyIiwiU3RyaW5nIiwiY29uc3RydWN0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImluaXRDb250cm9sbGVyRXh0ZW5zaW9uSG9va0hhbmRsZXJzIiwiY29udHJvbGxlciIsInJlZ2lzdGVyZWRIb29rcyIsImRlZXBDbG9uZSIsImluZGV4YWJsZUNvbnRyb2xsZXIiLCJyZWdpc3RlcmVkSG9vayIsImhhbmRsZXJGdW5jdGlvbiIsImdldFZpZXciLCJhdHRhY2hCZWZvcmVFeGl0IiwicmVtb3ZlQ29udHJvbGxlckV4dGVuc2lvbkhvb2tIYW5kbGVycyIsInByb3BhZ2F0ZUhvb2tGcm9tTWl4aW4iLCJzb3VyY2UiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJjcmVhdGUiLCJ4bWxWaWV3UHJlcHJvY2Vzc29yIiwiX2NhbGxlciIsIl9zZXR0aW5ncyIsInNvdXJjZVZpZXciLCJnZXRDb250cm9sbGVyIiwibWFjcm9BUElDaGlsZCIsImZpbmRBZ2dyZWdhdGVkT2JqZWN0cyIsInMiLCJpc0EiLCJtYW5hZ2VkT2JqZWN0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJIb29rU3VwcG9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZGVlcENsb25lIGZyb20gXCJzYXAvYmFzZS91dGlsL2RlZXBDbG9uZVwiO1xuaW1wb3J0IHR5cGUgeyBFeHRlbnNpb25PdmVycmlkZUV4ZWN1dGlvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBYTUxWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvWE1MVmlld1wiO1xuLyoqXG4gKiBUaGlzIHR5cGUgaXMgdG8gYmUgZXh0ZW5kZWQgd2l0aCBhbGwgY29udHJvbGxlciBleHRlbnNpb25zIGFuZCBtZXRob2RzIHRoYXQgYXJlIGhvb2thYmxlLlxuICovXG50eXBlIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnMgPSB7XG5cdGVkaXRGbG93OiB7XG5cdFx0aW5saW5lRWRpdEVuZDogdHJ1ZTtcblx0XHRpbmxpbmVFZGl0U3RhcnQ6IHRydWU7XG5cdFx0b25BZnRlclNhdmU6IHRydWU7XG5cdFx0b25CZWZvcmVTYXZlOiB0cnVlO1xuXHR9O1xuXHRjb2xsYWJvcmF0aW9uTWFuYWdlcjoge1xuXHRcdGNvbGxlY3RBdmFpbGFibGVDYXJkczogdHJ1ZTtcblx0fTtcblx0cGFnaW5hdG9yOiB7XG5cdFx0aW5pdGlhbGl6ZTogdHJ1ZTtcblx0fTtcblx0cm91dGluZzoge1xuXHRcdG9uQWZ0ZXJCaW5kaW5nOiB0cnVlO1xuXHR9O1xufTtcblxudHlwZSBIYW5kbGVyQ29uZmlndXJhdGlvbjxDRXh0TmFtZSBleHRlbmRzIGtleW9mIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnM+ID0ge1xuXHRuYW1lOiBDRXh0TmFtZTtcblx0bWV0aG9kOiBrZXlvZiBIb29rYWJsZUNvbnRyb2xsZXJFeHRlbnNpb25zW0NFeHROYW1lXTtcbn07XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxudHlwZSBIYW5kbGVyUmVnaXN0cmF0aW9uID0gSGFuZGxlckNvbmZpZ3VyYXRpb248YW55PiAmIHsgdGFyZ2V0TWV0aG9kOiBzdHJpbmc7IGhhbmRsZXJGdW5jdGlvbj86IEZ1bmN0aW9uIH07XG5cbnR5cGUgRnVuY3Rpb25NYXAgPSB7XG5cdFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uO1xufTtcbnR5cGUgRGVlcEZ1bmN0aW9uTWFwID0ge1xuXHRba2V5OiBzdHJpbmddOiBGdW5jdGlvbk1hcDtcbn07XG50eXBlIEhvb2tNYXAgPSB7XG5cdGhvb2tlZEhhbmRsZXJzOiB7XG5cdFx0W2tleTogc3RyaW5nXTogRnVuY3Rpb25bXTtcblx0fTtcbn07XG5cbi8vIFVzZSB0d28gYXJyYXlzIGFzIHdlIGNhbm5vdCBpbmRleCBhIG1hcCB0aHJvdWdoIGFuIGFyYml0cmFyeSBvYmplY3QgaW5zdGFuY2VcbmNvbnN0IHJlZ2lzdGVyZWRJbnN0YW5jZXM6IEZ1bmN0aW9uW10gPSBbXTtcbmNvbnN0IHJlZ2lzdGVyZWRIYW5kbGVyczogSGFuZGxlclJlZ2lzdHJhdGlvbltdW10gPSBbXTtcblxuLyoqXG4gKiBNYXJrcyBhIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG1ldGhvZCB0byBiZSBob29rYWJsZSBieSBnZW5lcmF0aW5nIGFkZGl0aW9uYWwgbWV0aG9kcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBhbmQgZGV0YWNoIGhhbmRsZXJzIGF0IHJ1bnRpbWUuXG4gKiBAcGFyYW0gZXhlY3V0aW9uXG4gKiBAcmV0dXJucyBBIG1ldGhvZCBkZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhvb2thYmxlKGV4ZWN1dGlvbjogRXh0ZW5zaW9uT3ZlcnJpZGVFeGVjdXRpb24pOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogdW5rbm93biwgcHJvcGVydHlLZXk6IHN0cmluZyB8IHN5bWJvbCwgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSB7XG5cdFx0Y29uc3QgaW5kZXhhYmxlVGFyZ2V0ID0gdGFyZ2V0IGFzIEZ1bmN0aW9uTWFwO1xuXG5cdFx0aW5kZXhhYmxlVGFyZ2V0W2BhdHRhY2gke3Byb3BlcnR5S2V5LnRvU3RyaW5nKCl9YF0gPSBmdW5jdGlvbiAoZm46IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0XHRjb25zdCBjRXhUSW5zdGFuY2VIb29rTWFwID0gdGhpcyBhcyB1bmtub3duIGFzIEhvb2tNYXA7XG5cdFx0XHRpZiAoIWNFeFRJbnN0YW5jZUhvb2tNYXAuaG9va2VkSGFuZGxlcnMpIHtcblx0XHRcdFx0Y0V4VEluc3RhbmNlSG9va01hcC5ob29rZWRIYW5kbGVycyA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFjRXhUSW5zdGFuY2VIb29rTWFwLmhvb2tlZEhhbmRsZXJzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRcdGNFeFRJbnN0YW5jZUhvb2tNYXAuaG9va2VkSGFuZGxlcnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSBbXTtcblx0XHRcdH1cblx0XHRcdGNFeFRJbnN0YW5jZUhvb2tNYXAuaG9va2VkSGFuZGxlcnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0ucHVzaChmbik7XG5cdFx0fTtcblx0XHRpbmRleGFibGVUYXJnZXRbYGRldGFjaCR7cHJvcGVydHlLZXkudG9TdHJpbmcoKX1gXSA9IGZ1bmN0aW9uIChmbjogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHRcdGNvbnN0IGNFeFRJbnN0YW5jZUhvb2tNYXAgPSB0aGlzIGFzIHVua25vd24gYXMgSG9va01hcDtcblx0XHRcdGNvbnN0IGhhbmRsZXJzID0gY0V4VEluc3RhbmNlSG9va01hcC5ob29rZWRIYW5kbGVyc1twcm9wZXJ0eUtleS50b1N0cmluZygpXTtcblx0XHRcdGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihmbik7XG5cdFx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGNvbnN0IG9sZFZhbHVlID0gZGVzY3JpcHRvci52YWx1ZTtcblx0XHRpZiAoZXhlY3V0aW9uID09PSBcIkJlZm9yZUFzeW5jXCIgfHwgZXhlY3V0aW9uID09PSBcIkFmdGVyQXN5bmNcIikge1xuXHRcdFx0ZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRcdFx0Y29uc3QgY0V4VEluc3RhbmNlSG9va01hcCA9IHRoaXMgYXMgdW5rbm93biBhcyBIb29rTWFwO1xuXHRcdFx0XHRjb25zdCBoYW5kbGVycyA9IChjRXhUSW5zdGFuY2VIb29rTWFwPy5ob29rZWRIYW5kbGVycyAmJiBjRXhUSW5zdGFuY2VIb29rTWFwPy5ob29rZWRIYW5kbGVyc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkgfHwgW107XG5cdFx0XHRcdGxldCByZXR1cm5WYWx1ZTogdW5rbm93bjtcblx0XHRcdFx0aWYgKGV4ZWN1dGlvbiA9PT0gXCJBZnRlckFzeW5jXCIpIHtcblx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IGF3YWl0IG9sZFZhbHVlLmJpbmQodGhpcykoLi4uYXJncyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG5cdFx0XHRcdFx0YXdhaXQgaGFuZGxlci5iaW5kKHRoaXMpKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChleGVjdXRpb24gPT09IFwiQmVmb3JlQXN5bmNcIikge1xuXHRcdFx0XHRcdHJldHVyblZhbHVlID0gYXdhaXQgb2xkVmFsdWUuYmluZCh0aGlzKSguLi5hcmdzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmV0dXJuVmFsdWU7XG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZXNjcmlwdG9yLnZhbHVlID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IHVua25vd24ge1xuXHRcdFx0XHRjb25zdCBjRXhUSW5zdGFuY2VIb29rTWFwID0gdGhpcyBhcyB1bmtub3duIGFzIEhvb2tNYXA7XG5cdFx0XHRcdGNvbnN0IGhhbmRsZXJzID0gKGNFeFRJbnN0YW5jZUhvb2tNYXA/Lmhvb2tlZEhhbmRsZXJzICYmIGNFeFRJbnN0YW5jZUhvb2tNYXA/Lmhvb2tlZEhhbmRsZXJzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB8fCBbXTtcblx0XHRcdFx0bGV0IHJldHVyblZhbHVlOiB1bmtub3duO1xuXHRcdFx0XHRpZiAoZXhlY3V0aW9uID09PSBcIkFmdGVyXCIpIHtcblx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IG9sZFZhbHVlLmJpbmQodGhpcykoLi4uYXJncyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG5cdFx0XHRcdFx0aGFuZGxlci5iaW5kKHRoaXMpKC4uLmFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChleGVjdXRpb24gPT09IFwiQmVmb3JlXCIpIHtcblx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IG9sZFZhbHVlLmJpbmQodGhpcykoLi4uYXJncyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJldHVyblZhbHVlO1xuXHRcdFx0fTtcblx0XHR9XG5cdH07XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBuZXdSZWdpc3RyYXRpb24gaXMgYWxyZWFkeSBpbmNsdWRlZCBpbiBzb21lIGV4aXN0aW5nUmVnaXN0cmF0aW9ucyBieSBjb21wYXJpbmcgYWxsIHJlbGV2YW50IGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0gZXhpc3RpbmdSZWdpc3RyYXRpb25zXG4gKiBAcGFyYW0gbmV3UmVnaXN0cmF0aW9uXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIGNoZWNrXG4gKi9cbmZ1bmN0aW9uIGlzQWxyZWFkeVJlZ2lzdGVyZWQoZXhpc3RpbmdSZWdpc3RyYXRpb25zOiBIYW5kbGVyUmVnaXN0cmF0aW9uW10sIG5ld1JlZ2lzdHJhdGlvbjogSGFuZGxlclJlZ2lzdHJhdGlvbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gISFleGlzdGluZ1JlZ2lzdHJhdGlvbnMuZmluZChcblx0XHQocikgPT4gci5uYW1lID09PSBuZXdSZWdpc3RyYXRpb24ubmFtZSAmJiByLm1ldGhvZCA9PT0gbmV3UmVnaXN0cmF0aW9uLm1ldGhvZCAmJiByLnRhcmdldE1ldGhvZCA9PT0gbmV3UmVnaXN0cmF0aW9uLnRhcmdldE1ldGhvZFxuXHQpO1xufVxuXG5leHBvcnQgY29uc3QgaG9va3MgPSBTeW1ib2woXCJob29rc1wiKTtcblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBtZXRob2QgYXMgY29udHJvbGxlciBleHRlbnNpb24gaG9vayBoYW5kbGVyLlxuICpcbiAqIEN1cnJlbnRseSwgb25seSBtZXRob2RzIG9mIHJ1bnRpbWUgYnVpbGRpbmcgYmxvY2tzIGFyZSBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gbmFtZSBDb250cm9sbGVyIGV4dGVuc2lvbiB0byBob29rIGludG9cbiAqIEBwYXJhbSBtZXRob2QgTWV0aG9kIHRvIGhvb2sgaW50b1xuICogQHJldHVybnMgQSBtZXRob2QgZGVjb3JhdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cm9sbGVyRXh0ZW5zaW9uSGFuZGxlcjxDRXh0TmFtZSBleHRlbmRzIGtleW9mIEhvb2thYmxlQ29udHJvbGxlckV4dGVuc2lvbnM+KFxuXHRuYW1lOiBDRXh0TmFtZSxcblx0bWV0aG9kOiBrZXlvZiBIb29rYWJsZUNvbnRyb2xsZXJFeHRlbnNpb25zW0NFeHROYW1lXVxuKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IHsgY29uc3RydWN0b3I6IEZ1bmN0aW9uICYgeyBbaG9va3NdPzogSGFuZGxlclJlZ2lzdHJhdGlvbltdIH0gfSwgcHJvcGVydHlLZXk6IHN0cmluZykge1xuXHRcdGNvbnN0IG5ld1JlZ2lzdHJhdGlvbiA9IHsgbmFtZSwgbWV0aG9kOiBTdHJpbmcobWV0aG9kKSwgdGFyZ2V0TWV0aG9kOiBwcm9wZXJ0eUtleSB9O1xuXHRcdGNvbnN0IGluZGV4ID0gcmVnaXN0ZXJlZEluc3RhbmNlcy5pbmRleE9mKHRhcmdldC5jb25zdHJ1Y3Rvcik7XG5cdFx0aWYgKCF0YXJnZXQuY29uc3RydWN0b3JbaG9va3NdKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LmNvbnN0cnVjdG9yLCBob29rcywge1xuXHRcdFx0XHR2YWx1ZTogW11cblx0XHRcdH0pO1xuXHRcdH1cblx0XHR0YXJnZXQuY29uc3RydWN0b3JbaG9va3NdPy5wdXNoKG5ld1JlZ2lzdHJhdGlvbik7XG5cdFx0Ly8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGlzIGV4YWN0IGhhbmRsZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGFzIGhhbmRsZXJzIGFyZSByZWdpc3RlcmVkIHN0YXRpY2FsbHkgKG9uIHRoZSBjb25zdHJ1Y3Rvcilcblx0XHRpZiAoaW5kZXggIT09IC0xICYmICFpc0FscmVhZHlSZWdpc3RlcmVkKHJlZ2lzdGVyZWRIYW5kbGVyc1tpbmRleF0sIG5ld1JlZ2lzdHJhdGlvbikpIHtcblx0XHRcdHJlZ2lzdGVyZWRIYW5kbGVyc1tpbmRleF0ucHVzaChuZXdSZWdpc3RyYXRpb24pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZWdpc3RlcmVkSW5zdGFuY2VzLnB1c2godGFyZ2V0LmNvbnN0cnVjdG9yKTtcblx0XHRcdHJlZ2lzdGVyZWRIYW5kbGVycy5wdXNoKFtuZXdSZWdpc3RyYXRpb25dKTtcblx0XHR9XG5cdH0gYXMgTWV0aG9kRGVjb3JhdG9yO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGFsbCBjb250cm9sbGVyIGV4dGVuc2lvbiBoYW5kbGVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIHRhcmdldC5cbiAqIEBwYXJhbSB0YXJnZXQgVGFyZ2V0IGNsYXNzIHRvIGluaXRpYWxpemUgdGhlIGhhbmRsZXJzIGZvclxuICogQHBhcmFtIHRhcmdldC5jb25zdHJ1Y3RvclxuICogQHBhcmFtIGNvbnRyb2xsZXIgUGFnZUNvbnRyb2xsZXIgaW5zdGFuY2UgdG8gZ2V0IHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbnMgaW5zdGFuY2VzIGZyb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRDb250cm9sbGVyRXh0ZW5zaW9uSG9va0hhbmRsZXJzKFxuXHR0YXJnZXQ6IHsgY29uc3RydWN0b3I6IEZ1bmN0aW9uICYgeyBbaG9va3NdPzogSGFuZGxlclJlZ2lzdHJhdGlvbltdIH0gfSAmIHsgW2hvb2tzXT86IEhhbmRsZXJSZWdpc3RyYXRpb25bXSB9LFxuXHRjb250cm9sbGVyOiBDb250cm9sbGVyXG4pOiB2b2lkIHtcblx0aWYgKHRhcmdldC5jb25zdHJ1Y3Rvcltob29rc10pIHtcblx0XHRsZXQgcmVnaXN0ZXJlZEhvb2tzID0gdGFyZ2V0LmNvbnN0cnVjdG9yW2hvb2tzXTtcblx0XHR0YXJnZXRbaG9va3NdID0gZGVlcENsb25lKHJlZ2lzdGVyZWRIb29rcyk7XG5cdFx0cmVnaXN0ZXJlZEhvb2tzID0gdGFyZ2V0W2hvb2tzXSE7XG5cdFx0Y29uc3QgaW5kZXhhYmxlVGFyZ2V0ID0gdGFyZ2V0IGFzIHVua25vd24gYXMgRnVuY3Rpb25NYXA7XG5cdFx0Y29uc3QgaW5kZXhhYmxlQ29udHJvbGxlciA9IGNvbnRyb2xsZXIgYXMgdW5rbm93biBhcyBEZWVwRnVuY3Rpb25NYXA7XG5cdFx0Zm9yIChjb25zdCByZWdpc3RlcmVkSG9vayBvZiByZWdpc3RlcmVkSG9va3MpIHtcblx0XHRcdHJlZ2lzdGVyZWRIb29rLmhhbmRsZXJGdW5jdGlvbiA9IGluZGV4YWJsZVRhcmdldFtyZWdpc3RlcmVkSG9vay50YXJnZXRNZXRob2RdLmJpbmQodGFyZ2V0KTtcblx0XHRcdGluZGV4YWJsZUNvbnRyb2xsZXJbcmVnaXN0ZXJlZEhvb2submFtZV1bYGF0dGFjaCR7U3RyaW5nKHJlZ2lzdGVyZWRIb29rLm1ldGhvZCl9YF0ocmVnaXN0ZXJlZEhvb2suaGFuZGxlckZ1bmN0aW9uKTtcblx0XHRcdGNvbnRyb2xsZXIuZ2V0VmlldygpPy5hdHRhY2hCZWZvcmVFeGl0KCgpID0+IHtcblx0XHRcdFx0aW5kZXhhYmxlQ29udHJvbGxlcltyZWdpc3RlcmVkSG9vay5uYW1lXVtgZGV0YWNoJHtTdHJpbmcocmVnaXN0ZXJlZEhvb2subWV0aG9kKX1gXShyZWdpc3RlcmVkSG9vay5oYW5kbGVyRnVuY3Rpb24pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDb250cm9sbGVyRXh0ZW5zaW9uSG9va0hhbmRsZXJzKFxuXHR0YXJnZXQ6IHsgY29uc3RydWN0b3I6IEZ1bmN0aW9uICYgeyBbaG9va3NdPzogSGFuZGxlclJlZ2lzdHJhdGlvbltdIH0gfSAmIHsgW2hvb2tzXT86IEhhbmRsZXJSZWdpc3RyYXRpb25bXSB9LFxuXHRjb250cm9sbGVyOiBDb250cm9sbGVyXG4pOiB2b2lkIHtcblx0aWYgKHRhcmdldFtob29rc10pIHtcblx0XHRjb25zdCByZWdpc3RlcmVkSG9va3MgPSB0YXJnZXRbaG9va3NdO1xuXHRcdGNvbnN0IGluZGV4YWJsZUNvbnRyb2xsZXIgPSBjb250cm9sbGVyIGFzIHVua25vd24gYXMgRGVlcEZ1bmN0aW9uTWFwO1xuXHRcdGZvciAoY29uc3QgcmVnaXN0ZXJlZEhvb2sgb2YgcmVnaXN0ZXJlZEhvb2tzKSB7XG5cdFx0XHRpbmRleGFibGVDb250cm9sbGVyW3JlZ2lzdGVyZWRIb29rLm5hbWVdPy5bYGRldGFjaCR7U3RyaW5nKHJlZ2lzdGVyZWRIb29rLm1ldGhvZCl9YF0/LihyZWdpc3RlcmVkSG9vay5oYW5kbGVyRnVuY3Rpb24pO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvcGFnYXRlSG9va0Zyb21NaXhpbihcblx0dGFyZ2V0OiBGdW5jdGlvbiAmIHsgW2hvb2tzXT86IEhhbmRsZXJSZWdpc3RyYXRpb25bXSB9LFxuXHRzb3VyY2U6IEZ1bmN0aW9uICYgeyBbaG9va3NdPzogSGFuZGxlclJlZ2lzdHJhdGlvbltdIH1cbik6IHZvaWQge1xuXHRpZiAoc291cmNlW2hvb2tzXSkge1xuXHRcdGlmICh0YXJnZXRbaG9va3NdKSB7XG5cdFx0XHR0YXJnZXRbaG9va3NdIS5zcGxpY2UoMCwgMCwgLi4uc291cmNlW2hvb2tzXSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGhvb2tzLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgaG9va3MpIHx8IE9iamVjdC5jcmVhdGUoW10pKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHhtbFZpZXdQcmVwcm9jZXNzb3Ioc291cmNlOiBvYmplY3QsIF9jYWxsZXI/OiB1bmtub3duLCBfc2V0dGluZ3M/OiBvYmplY3QpOiB2b2lkIHtcblx0Y29uc3Qgc291cmNlVmlldyA9IHNvdXJjZSBhcyBYTUxWaWV3O1xuXHRjb25zdCBjb250cm9sbGVyID0gc291cmNlVmlldy5nZXRDb250cm9sbGVyKCkgYXMgQ29udHJvbGxlciB8IHVuZGVmaW5lZDtcblx0aWYgKGNvbnRyb2xsZXIpIHtcblx0XHRjb25zdCBtYWNyb0FQSUNoaWxkID0gc291cmNlVmlldy5maW5kQWdncmVnYXRlZE9iamVjdHModHJ1ZSwgKHMpID0+IHMuaXNBKFwic2FwLmZlLm1hY3Jvcy5NYWNyb0FQSVwiKSk7XG5cdFx0Zm9yIChjb25zdCBtYW5hZ2VkT2JqZWN0IG9mIG1hY3JvQVBJQ2hpbGQpIHtcblx0XHRcdGluaXRDb250cm9sbGVyRXh0ZW5zaW9uSG9va0hhbmRsZXJzKG1hbmFnZWRPYmplY3QsIGNvbnRyb2xsZXIpO1xuXHRcdH1cblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztFQUlBO0FBQ0E7QUFDQTs7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QUFLLE1BQU1JLGNBQWMsSUFBSUgsZUFBZSxFQUFFO1FBQzdDRSxtQkFBbUIsQ0FBQ0MsY0FBYyxDQUFDZixJQUFJLENBQUMsR0FBRyxTQUFTTSxNQUFNLENBQUNTLGNBQWMsQ0FBQ2QsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHYyxjQUFjLENBQUNDLGVBQWUsQ0FBQztNQUN2SDtJQUNEO0VBQ0Q7RUFBQ3RCLFFBQUEsQ0FBQXlCLHFDQUFBLEdBQUFBLHFDQUFBO0VBRU0sU0FBU0Msc0JBQXNCQSxDQUNyQzdDLE1BQXNELEVBQ3REOEMsTUFBc0QsRUFDL0M7SUFDUCxJQUFJQSxNQUFNLENBQUNsQixLQUFLLENBQUMsRUFBRTtNQUNsQixJQUFJNUIsTUFBTSxDQUFDNEIsS0FBSyxDQUFDLEVBQUU7UUFDbEI1QixNQUFNLENBQUM0QixLQUFLLENBQUMsQ0FBRWhCLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUdrQyxNQUFNLENBQUNsQixLQUFLLENBQUMsQ0FBQztNQUM5QyxDQUFDLE1BQU07UUFDTkssTUFBTSxDQUFDQyxjQUFjLENBQUNsQyxNQUFNLEVBQUU0QixLQUFLLEVBQUVLLE1BQU0sQ0FBQ2Msd0JBQXdCLENBQUNELE1BQU0sRUFBRWxCLEtBQUssQ0FBQyxJQUFJSyxNQUFNLENBQUNlLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztNQUMxRztJQUNEO0VBQ0Q7RUFBQzdCLFFBQUEsQ0FBQTBCLHNCQUFBLEdBQUFBLHNCQUFBO0VBRU0sU0FBU0ksbUJBQW1CQSxDQUFDSCxNQUFjLEVBQUVJLE9BQWlCLEVBQUVDLFNBQWtCLEVBQVE7SUFDaEcsTUFBTUMsVUFBVSxHQUFHTixNQUFpQjtJQUNwQyxNQUFNVixVQUFVLEdBQUdnQixVQUFVLENBQUNDLGFBQWEsQ0FBQyxDQUEyQjtJQUN2RSxJQUFJakIsVUFBVSxFQUFFO01BQ2YsTUFBTWtCLGFBQWEsR0FBR0YsVUFBVSxDQUFDRyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUdDLENBQUMsSUFBS0EsQ0FBQyxDQUFDQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztNQUNwRyxLQUFLLE1BQU1DLGFBQWEsSUFBSUosYUFBYSxFQUFFO1FBQzFDbkIsbUNBQW1DLENBQUN1QixhQUFhLEVBQUV0QixVQUFVLENBQUM7TUFDL0Q7SUFDRDtFQUNEO0VBQUNqQixRQUFBLENBQUE4QixtQkFBQSxHQUFBQSxtQkFBQTtFQUFBLE9BQUE5QixRQUFBO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=