@sapui5/sap.fe.base 1.149.0 → 1.151.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.
@@ -66,9 +66,7 @@ type BaseExpression<_T> = {
66
66
 
67
67
  /**
68
68
  * Collection of functions to support the manipulation of UI5 bindings
69
- * @public
70
69
  * @namespace
71
- * @ui5-experimental-since 1.145.0
72
70
  */
73
71
  export const bindingToolkitNamespace = "sap.fe.base.BindingToolkit";
74
72
 
@@ -217,8 +215,6 @@ function isActionParameter(serviceObject: unknown): serviceObject is ActionParam
217
215
 
218
216
  /**
219
217
  * A binding expression that evaluates to type T.
220
- * @public
221
- * @ui5-experimental-since 1.145.0
222
218
  */
223
219
  export type BindingToolkitExpression<T> =
224
220
  | UnresolvablePathExpression
@@ -822,6 +818,86 @@ export function pathInModel<TargetType extends PrimitiveType>(
822
818
  };
823
819
  }
824
820
 
821
+ /**
822
+ * Transforms a binding path from a navigation property context to its parent context.
823
+ *
824
+ * This is used to transform a binding made for a NavProp context /MainObject/NavProp1/NavProp2
825
+ * into a binding on the previous context /MainObject/NavProp1.
826
+ * @param path The path string to transform
827
+ * @param partnerPath The optional partner navigation property name to check against
828
+ * @returns A binding expression for the upper context, or unresolvableExpression if the path cannot be transformed
829
+ */
830
+ export function getBindingPathExpressionFromPartnerNavigation(path: string, partnerPath?: string): BindingToolkitExpression<unknown> {
831
+ if (path.startsWith("/")) {
832
+ // path is absolute it can be resolved from anywhere
833
+ return pathInModel(path);
834
+ }
835
+
836
+ if (partnerPath && path.startsWith(partnerPath + "/")) {
837
+ // Remove the partner navigation path prefix
838
+ return pathInModel(path.substring(partnerPath.length + 1));
839
+ } else {
840
+ return unresolvableExpression;
841
+ }
842
+ }
843
+
844
+ /**
845
+ * Recursively transforms an expression from a navigation property context to its parent context.
846
+ *
847
+ * This function walks through the expression tree and transforms all PathInModel expressions
848
+ * that reference relative paths (non-absolute, default model) using the partner navigation property.
849
+ * If the resulting expression contains unresolvable parts, the fallback value is returned instead.
850
+ * @template T The type of the binding expression
851
+ * @param expression The initial binding expression to transform
852
+ * @param partnerNavigationPropertyName The partner navigation property name to use for transformation
853
+ * @param fallbackValue The value to return if the expression becomes unresolvable
854
+ * @returns The transformed expression or the fallback value if unresolvable
855
+ */
856
+ export function getBindingExpressionFromUpperContext<T extends PrimitiveType>(
857
+ expression: BindingToolkitExpression<T>,
858
+ partnerNavigationPropertyName: string | undefined,
859
+ fallbackValue: BindingToolkitExpression<T>
860
+ ): BindingToolkitExpression<T> {
861
+ if (expression._type === "Set") {
862
+ const newOperands = expression.operands.map((operand: BindingToolkitExpression<boolean>) =>
863
+ getBindingExpressionFromUpperContext(
864
+ operand,
865
+ partnerNavigationPropertyName,
866
+ fallbackValue as unknown as BindingToolkitExpression<boolean>
867
+ )
868
+ );
869
+
870
+ if (expression.operator === "||") {
871
+ return or(...(newOperands as unknown as BindingToolkitExpression<boolean>[])) as unknown as BindingToolkitExpression<T>;
872
+ } else {
873
+ return and(...(newOperands as unknown as BindingToolkitExpression<boolean>[])) as unknown as BindingToolkitExpression<T>;
874
+ }
875
+ }
876
+ // Transform PathInModel expressions using the partner navigation
877
+ const transformedExpression = transformRecursively<T, "PathInModel">(
878
+ expression,
879
+ "PathInModel",
880
+ (pathExpression: PathInModelExpression<T>) => {
881
+ // Only transform relative paths in the default model (modelName is undefined or empty)
882
+ if (!pathExpression.modelName || pathExpression.modelName === "") {
883
+ return getBindingPathExpressionFromPartnerNavigation(
884
+ pathExpression.path,
885
+ partnerNavigationPropertyName
886
+ ) as BindingToolkitExpression<T>;
887
+ }
888
+ return pathExpression;
889
+ },
890
+ true // includeAllExpression - transform all expression types in the tree
891
+ );
892
+
893
+ // Check if the transformed expression contains unresolvable parts
894
+ if (hasUnresolvableExpression(transformedExpression)) {
895
+ return fallbackValue;
896
+ }
897
+
898
+ return transformedExpression;
899
+ }
900
+
825
901
  type PlainExpressionObject = { [index: string]: BindingToolkitExpression<unknown> };
826
902
 
827
903
  /**
@@ -2491,6 +2567,63 @@ export function concat(...inExpressions: ExpressionOrPrimitive<string>[]): Bindi
2491
2567
  };
2492
2568
  }
2493
2569
 
2570
+ /**
2571
+ * Concatenate multiple expressions with a separator.
2572
+ * @param separator The separator to insert between expressions
2573
+ * @param inExpressions Expressions to concatenate
2574
+ * @returns The concatenated expression
2575
+ */
2576
+ export function concatWithSeparator(
2577
+ separator: string,
2578
+ ...inExpressions: ExpressionOrPrimitive<string>[]
2579
+ ): BindingToolkitExpression<string> {
2580
+ const expressions = inExpressions.map(wrapPrimitive);
2581
+ if (hasUnresolvableExpression(...expressions)) {
2582
+ return unresolvableExpression;
2583
+ }
2584
+
2585
+ const separatorConstant = constant(separator);
2586
+
2587
+ if (expressions.every(isConstant)) {
2588
+ return constant(
2589
+ expressions.reduce((concatenated: string, value, index) => {
2590
+ const constantValue = value;
2591
+ if (constantValue.value !== undefined && constantValue.value !== null) {
2592
+ const prefix = index > 0 ? separator : "";
2593
+ return concatenated + prefix + constantValue.value.toString();
2594
+ }
2595
+ return concatenated;
2596
+ }, "")
2597
+ );
2598
+ }
2599
+
2600
+ // Interleave separator constants between expressions
2601
+ const expressionsWithSeparators: BindingToolkitExpression<string>[] = [];
2602
+ expressions.forEach((expr, index) => {
2603
+ if (index > 0) {
2604
+ expressionsWithSeparators.push(separatorConstant);
2605
+ }
2606
+ expressionsWithSeparators.push(expr);
2607
+ });
2608
+
2609
+ if (expressionsWithSeparators.some(isComplexTypeExpression)) {
2610
+ let pathIdx = 0;
2611
+ const myConcatExpression = formatResult(expressionsWithSeparators, "._formatters.StandardFormatter#concat", undefined, true);
2612
+ const allParts = [];
2613
+ transformRecursively(myConcatExpression, "PathInModel", (constantPath: PathInModelExpression<unknown>) => {
2614
+ allParts.push(constantPath);
2615
+ return pathInModel(`$${pathIdx++}`, "$");
2616
+ });
2617
+ allParts.unshift(constant(JSON.stringify(myConcatExpression)));
2618
+ return formatResult(allParts, "._formatters.StandardFormatter.bind($control)#evaluateComplexExpression", undefined, true);
2619
+ }
2620
+
2621
+ return {
2622
+ _type: "Concat",
2623
+ expressions: expressionsWithSeparators
2624
+ };
2625
+ }
2626
+
2494
2627
  type ExpressionTypeToExpression<T extends ExpressionType, V> = T extends "Constant"
2495
2628
  ? ConstantExpression<V>
2496
2629
  : T extends "PathInModel"
@@ -2838,6 +2971,42 @@ export function wrapBindingExpression(
2838
2971
  }
2839
2972
  }
2840
2973
 
2974
+ /**
2975
+ * Resolves a binding expression by substituting path values from preloaded data.
2976
+ * Uses transformRecursively to replace PathInModel expressions with constants where values are available.
2977
+ * Only resolves paths from the default (empty) model name.
2978
+ * @template T The target type
2979
+ * @param expression The binding toolkit expression to resolve
2980
+ * @param preloadedValues A flat object with property paths as keys and their values
2981
+ * @returns The resolved expression with PathInModel expressions replaced by constants where possible
2982
+ */
2983
+ export function resolveWithPreloadedValues<T extends PrimitiveType>(
2984
+ expression: ExpressionOrPrimitive<T>,
2985
+ preloadedValues: Record<string, unknown>
2986
+ ): BindingToolkitExpression<T> {
2987
+ const expr = wrapPrimitive(expression);
2988
+
2989
+ return transformRecursively(
2990
+ expr,
2991
+ "PathInModel",
2992
+ (pathExpression: PathInModelExpression<unknown>) => {
2993
+ // Only resolve paths from the default model (empty model name)
2994
+ if (pathExpression.modelName && pathExpression.modelName !== "") {
2995
+ return pathExpression;
2996
+ }
2997
+
2998
+ // Check if this path is in preloaded values
2999
+ if (preloadedValues.hasOwnProperty(pathExpression.path)) {
3000
+ return constant(preloadedValues[pathExpression.path] as T);
3001
+ }
3002
+
3003
+ // Path not in preloaded values, return as-is
3004
+ return pathExpression;
3005
+ },
3006
+ true
3007
+ ) as BindingToolkitExpression<T>;
3008
+ }
3009
+
2841
3010
  /**
2842
3011
  * Compile an expression into an expression binding.
2843
3012
  * @template T The target type
@@ -149,14 +149,21 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/base/ClassSupport", "sap/ui
149
149
 
150
150
  /**
151
151
  * This function (if available on the concrete control) provides the current accessibility state of the control.
152
- * @returns The accessibility information for the control.
152
+ * When the content control is not visible, null is returned so that sap.m.Table can set aria-label=""
153
+ * on the gridcell, preventing screen reader virtual buffer bleed-through (ACC-264.1 / WCAG 2.1 Level A).
154
+ * @returns The accessibility information for the control, or null (cast) when content is not visible.
153
155
  */;
154
156
  _proto.getAccessibilityInfo = function getAccessibilityInfo() {
155
- let accessibilityInfo = {};
156
157
  if (this.content?.isA("sap.ui.core.Control") && this.content.getAccessibilityInfo) {
157
- accessibilityInfo = this.content.getAccessibilityInfo();
158
+ if (!this.content.getVisible()) {
159
+ // Content is not visible: return null (cast to preserve the type contract) so that
160
+ // sap.m.Table receives a falsy value and sets aria-label="" on the gridcell,
161
+ // preventing screen reader virtual buffer bleed-through (ACC-264.1 / WCAG 2.1 Level A).
162
+ return null;
163
+ }
164
+ return this.content.getAccessibilityInfo();
158
165
  }
159
- return accessibilityInfo;
166
+ return {};
160
167
  }
161
168
 
162
169
  /**
@@ -186,8 +193,6 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/base/ClassSupport", "sap/ui
186
193
  * Shorthand for the BindingToolkit.bindState function with the current state object.
187
194
  * @param path A property in the state object
188
195
  * @returns The binding toolkit expression for the state
189
- * @public
190
- * @ui5-experimental-since 1.145.0
191
196
  */;
192
197
  _proto.bindState = function bindState(path) {
193
198
  return BindingToolkit.bindState(this.state, path);
@@ -211,8 +216,6 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/base/ClassSupport", "sap/ui
211
216
  * Framework hook for state change handling.
212
217
  * Subclasses can override this method to react to state changes.
213
218
  * @param _changedProps List of changed property names
214
- * @public
215
- * @ui5-experimental-since 1.145.0
216
219
  */;
217
220
  _proto.onStateChange = async function onStateChange(_changedProps) {};
218
221
  return BuildingBlockBase;
@@ -234,4 +237,4 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/base/ClassSupport", "sap/ui
234
237
  }), _class2)) || _class);
235
238
  return BuildingBlockBase;
236
239
  }, false);
237
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdWlsZGluZ0Jsb2NrQmFzZSIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9kZWMyIiwiYWdncmVnYXRpb24iLCJ0eXBlIiwibXVsdGlwbGUiLCJpc0RlZmF1bHQiLCJfZGVjMyIsImFzc29jaWF0aW9uIiwic2luZ3VsYXJOYW1lIiwiX2RlYzQiLCJkZWZpbmVTdGF0ZSIsIl9jbGFzcyIsIl9jbGFzczIiLCJfQ29udHJvbCIsInNldHRpbmdzIiwib3RoZXJzIiwic2NvcGUiLCJfdGhpcyIsImlkIiwiY2FsbCIsIl9pbml0aWFsaXplckRlZmluZVByb3BlcnR5IiwiX2Rlc2NyaXB0b3IiLCJfZGVzY3JpcHRvcjIiLCJfZGVzY3JpcHRvcjMiLCJfb2xkRG9tUmVmIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJnZXRQbGFjZWhvbGRlciIsIl9ybSIsInJlbmRlciIsIm9SbSIsIm9Db250cm9sIiwiY29udGVudCIsImdldFZpc2libGUiLCJJbnZpc2libGVSZW5kZXJlciIsInJlbmRlckNvbnRyb2wiLCJzZXRCaW5kaW5nQ29udGV4dCIsImNvbnRleHQiLCJtb2RlbCIsInVuZGVmaW5lZCIsImludmFsaWRhdGUiLCJiaW5kUHJvcGVydHkiLCJuYW1lIiwiYmluZGluZ0luZm8iLCJwcm9wZXJ0eU1ldGFkYXRhIiwiZ2V0TWV0YWRhdGEiLCJnZXRQcm9wZXJ0eSIsImJpbmRhYmxlIiwiZ3JvdXAiLCJvbkFmdGVyUmVuZGVyaW5nIiwiZXZlbnQiLCJkb21SZWYiLCJnZXREb21SZWYiLCJXZWFrUmVmIiwic3VmZml4Iiwib0NvbnRlbnQiLCJkZXJlZiIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJnZXRGb2N1c0RvbVJlZiIsImVuaGFuY2VBY2Nlc3NpYmlsaXR5U3RhdGUiLCJfb0VsZW1lbnQiLCJtQXJpYVByb3BzIiwib1BhcmVudCIsImdldFBhcmVudCIsImdldEFjY2Vzc2liaWxpdHlJbmZvIiwiYWNjZXNzaWJpbGl0eUluZm8iLCJpc0EiLCJnZXRJZEZvckxhYmVsIiwiYWRkU3R5bGVDbGFzcyIsInN0eWxlQ2xhc3MiLCJyZW1vdmVTdHlsZUNsYXNzIiwiYmluZFN0YXRlIiwicGF0aCIsIkJpbmRpbmdUb29sa2l0Iiwic3RhdGUiLCJzeW5jU3RhdGVQcm9wZXJ0eSIsInByb3BOYW1lIiwic291cmNlIiwicHJvcGVydHkiLCJwcm9wQmluZGluZyIsImdldE1vZGVsIiwiU1RBVEVfTU9ERUxfTkFNRSIsImF0dGFjaENoYW5nZSIsIm9uU3RhdGVDaGFuZ2UiLCJfY2hhbmdlZFByb3BzIiwiQ29udHJvbCIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJpbml0aWFsaXplciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQnVpbGRpbmdCbG9ja0Jhc2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIFByaW1pdGl2ZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCAqIGFzIEJpbmRpbmdUb29sa2l0IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmljU3RhdGUsIFByb3BlcnRpZXNPZiwgU3RhdGVPZiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IGFnZ3JlZ2F0aW9uLCBhc3NvY2lhdGlvbiwgZGVmaW5lU3RhdGUsIGRlZmluZVVJNUNsYXNzLCBTVEFURV9NT0RFTF9OQU1FIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eUJpbmRpbmdJbmZvIH0gZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgSW52aXNpYmxlUmVuZGVyZXIgZnJvbSBcInNhcC91aS9jb3JlL0ludmlzaWJsZVJlbmRlcmVyXCI7XG5pbXBvcnQgdHlwZSBSZW5kZXJNYW5hZ2VyIGZyb20gXCJzYXAvdWkvY29yZS9SZW5kZXJNYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IEFjY2Vzc2liaWxpdHlJbmZvIH0gZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmludGVyZmFjZSBCdWlsZGluZ0Jsb2NrQmFzZTxUIGV4dGVuZHMgVUk1RWxlbWVudCA9IENvbnRyb2wsIEsgZXh0ZW5kcyBvYmplY3QgPSB7fT4ge1xuXHQvLyBGb3JjZSBhIHN0YXRlIHVwZGF0ZVxuXHRfdXBkYXRlU3RhdGUoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBidWlsZGluZyBibG9ja3MuXG4gKiBUaGlzIGNvbnRhaW5zIHRoZSBsb3ctbGV2ZWwgZnVuY3Rpb25hbGl0eSBvZiBoYXZpbmcgYSBjb250ZW50IGFnZ3JlZ2F0aW9uIGFuZCBoYW5kbGluZyB0aGUgcmVuZGVyaW5nIG9mIHRoZSBjb250ZW50IHdpdGhvdXQgYW4gYWN0dWFsIERPTSBlbGVtZW50Ljxici8+XG4gKiBUaGUgYnVpbGRpbmcgYmxvY2sgYWxzbyBkZWZpbmVzIGEgc3RhdGUgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBidWlsZGluZyBibG9jay48YnIvPlxuICogQWNjZXNzaWJpbGl0eSBhbmQgY2xhc3NlcyBpbmZvcm1hdGlvbiBhcmUgZm9yd2FyZGVkIHRvIHRoZSBjb250ZW50IGNvbnRyb2wuPGJyLz5cbiAqIFRoaXMgY2xhc3MgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgZGlyZWN0bHksIGl0J3MgdGhlcmUgZm9yIGludGVybmFsIHVzZSBvbmx5IChhbmQgZG9jdW1lbnRhdGlvbilcbiAqIEBwdWJsaWNcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmJhc2UuQnVpbGRpbmdCbG9ja0Jhc2VcIilcbmNsYXNzIEJ1aWxkaW5nQmxvY2tCYXNlPFQgZXh0ZW5kcyBVSTVFbGVtZW50ID0gQ29udHJvbCwgSyBleHRlbmRzIG9iamVjdCA9IHt9PiBleHRlbmRzIENvbnRyb2wge1xuXHQvKipcblx0ICogT3B0aW9uYWwgY29udGVudCBvZiBnZW5lcmljIHR5cGUgVC5cblx0ICpcblx0ICogVGhpcyBwcm9wZXJ0eSBob2xkcyB0aGUgbWFpbiBkYXRhIG9yIHBheWxvYWQgZm9yIHRoZSBjb250YWluaW5nIG9iamVjdC5cblx0ICogV2hlbiB1bmRlZmluZWQsIGl0IGluZGljYXRlcyB0aGF0IG5vIGNvbnRlbnQgaGFzIGJlZW4gc2V0IG9yIGlzIGF2YWlsYWJsZS5cblx0ICogVGhlIHNwZWNpZmljIHR5cGUgYW5kIHN0cnVjdHVyZSBvZiB0aGUgY29udGVudCBkZXBlbmRzIG9uIHRoZSBnZW5lcmljIHR5cGUgcGFyYW1ldGVyIFQuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBhZ2dyZWdhdGlvbih7IHR5cGU6IFwic2FwLnVpLmNvcmUuRWxlbWVudFwiLCBtdWx0aXBsZTogZmFsc2UsIGlzRGVmYXVsdDogdHJ1ZSB9KVxuXHRjb250ZW50PzogVDtcblxuXHQvKipcblx0ICogQXNzb2NpYXRpb24gdG8gY29udHJvbHMgLyBJRHMgdGhhdCBsYWJlbCB0aGlzIGNvbnRyb2wgKHNlZSBXQUktQVJJQSBhdHRyaWJ1dGUgYXJpYS1sYWJlbGxlZGJ5KS5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QGFzc29jaWF0aW9uKHsgdHlwZTogXCJzYXAudWkuY29yZS5Db250cm9sXCIsIG11bHRpcGxlOiB0cnVlLCBzaW5ndWxhck5hbWU6IFwiYXJpYUxhYmVsbGVkQnlcIiB9KVxuXHRhcmlhTGFiZWxsZWRCeSE6IHN0cmluZ1tdO1xuXG5cdC8qKlxuXHQgKiBUaGUgY3VycmVudCBzdGF0ZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBUaGlzIHByb3BlcnR5IGhvbGRzIHRoZSBzdGF0ZSBkYXRhIG1hbmFnZWQgYnkgdGhlIGNvbXBvbmVudCwgd2l0aCB0aGUgdHlwZVxuXHQgKiBkZXRlcm1pbmVkIGJ5IHRoZSBnZW5lcmljIHBhcmFtZXRlciBLLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAZGVmaW5lU3RhdGUoKVxuXHRwcm90ZWN0ZWQgc3RhdGUhOiBTdGF0ZU9mPEs+O1xuXG5cdGdldFBsYWNlaG9sZGVyKF9ybTogUmVuZGVyTWFuYWdlcik6IHZvaWQge31cblxuXHRjb25zdHJ1Y3RvcihzZXR0aW5ncz86IHN0cmluZyB8IFByb3BlcnRpZXNPZjxCdWlsZGluZ0Jsb2NrQmFzZTxUPj4sIG90aGVycz86IFByb3BlcnRpZXNPZjxCdWlsZGluZ0Jsb2NrQmFzZTxUPj4sIHNjb3BlPzogb2JqZWN0KSB7XG5cdFx0aWYgKHR5cGVvZiBzZXR0aW5ncyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0b3RoZXJzID8/PSB7fTtcblx0XHRcdG90aGVycy5pZCA9IHNldHRpbmdzO1xuXHRcdH1cblx0XHQvLyBTY29wZSBpcyBkZWZpbmVkIGFuZCBpcyB0aGVyZSwgYnV0IHNvbWVob3cgZG9lc24ndCBhcHBlYXIgb24gYWxsIHRoZSBjaGlsZHJlbiBvZiBNYW5hZ2VkT2JqZWN0XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRzdXBlcihzZXR0aW5ncyBhcyB1bmtub3duIGFzIHN0cmluZywgb3RoZXJzLCBzY29wZSk7XG5cdH1cblxuXHRwcml2YXRlIF9vbGREb21SZWY6IFdlYWtSZWY8RWxlbWVudD4gfCBudWxsID0gbnVsbDtcblxuXHRzdGF0aWMgcmVuZGVyPFQgZXh0ZW5kcyBDb250cm9sPihvUm06IFJlbmRlck1hbmFnZXIsIG9Db250cm9sOiBCdWlsZGluZ0Jsb2NrQmFzZTxUPik6IHZvaWQge1xuXHRcdGlmICghb0NvbnRyb2wuY29udGVudCB8fCBvQ29udHJvbC5nZXRWaXNpYmxlKCkgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSBpcyBubyBjb250ZW50LCB3ZSByZW5kZXIgYW4gaW52aXNpYmxlIHJlbmRlcmVyIHRvIGF2b2lkIHRoZSBjb250cm9sIGJlaW5nXG5cdFx0XHRJbnZpc2libGVSZW5kZXJlci5yZW5kZXIob1JtLCBvQ29udHJvbCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9Db250cm9sLmdldFBsYWNlaG9sZGVyPy4ob1JtKTtcblx0XHRcdG9SbS5yZW5kZXJDb250cm9sKG9Db250cm9sLmNvbnRlbnQpO1xuXHRcdH1cblx0fVxuXG5cdHNldEJpbmRpbmdDb250ZXh0KGNvbnRleHQ6IENvbnRleHQsIG1vZGVsPzogc3RyaW5nKTogdGhpcyB7XG5cdFx0c3VwZXIuc2V0QmluZGluZ0NvbnRleHQoY29udGV4dCwgbW9kZWwpO1xuXHRcdGlmIChtb2RlbCA9PT0gdW5kZWZpbmVkICYmIGNvbnRleHQpIHtcblx0XHRcdHRoaXMuaW52YWxpZGF0ZSgpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBPdmVycmlkZSB0aGUgYmluZFByb3BlcnR5IHRvIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSB0aGUgcHJvcGVydHkgaXMgYSBiaW5kaW5nIGluZm8uXG5cdCAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvXG5cdCAqIEByZXR1cm5zIFRoZSBpbnN0YW5jZSBvZiB0aGUgYnVpbGRpbmcgYmxvY2sgZm9yIGNoYWluaW5nXG5cdCAqL1xuXHRvdmVycmlkZSBiaW5kUHJvcGVydHkobmFtZTogc3RyaW5nLCBiaW5kaW5nSW5mbzogUHJvcGVydHlCaW5kaW5nSW5mbyk6IHRoaXMge1xuXHRcdGNvbnN0IHByb3BlcnR5TWV0YWRhdGEgPSB0aGlzLmdldE1ldGFkYXRhKCkuZ2V0UHJvcGVydHkobmFtZSk7XG5cdFx0aWYgKHByb3BlcnR5TWV0YWRhdGE/LmJpbmRhYmxlID09PSBmYWxzZSAmJiBwcm9wZXJ0eU1ldGFkYXRhLmdyb3VwID09PSBcIkRhdGFcIikge1xuXHRcdFx0KHRoaXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW25hbWVdID0gYmluZGluZ0luZm87XG5cdFx0fSBlbHNlIHtcblx0XHRcdHN1cGVyLmJpbmRQcm9wZXJ0eShuYW1lLCBiaW5kaW5nSW5mbyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Ly9zZXQgdGhlIG9sZCBkb20gcmVmXG5cdG92ZXJyaWRlIG9uQWZ0ZXJSZW5kZXJpbmcoZXZlbnQ6IEpRdWVyeS5FdmVudCk6IHZvaWQge1xuXHRcdGNvbnN0IGRvbVJlZiA9IHRoaXMuZ2V0RG9tUmVmKCk7XG5cdFx0aWYgKGRvbVJlZikge1xuXHRcdFx0dGhpcy5fb2xkRG9tUmVmID0gbmV3IFdlYWtSZWYoZG9tUmVmKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fb2xkRG9tUmVmID0gbnVsbDtcblx0XHR9XG5cdFx0c3VwZXIub25BZnRlclJlbmRlcmluZyhldmVudCk7XG5cdH1cblxuXHRvdmVycmlkZSBnZXREb21SZWYoc3VmZml4Pzogc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xuXHRcdGNvbnN0IG9Db250ZW50ID0gdGhpcy5jb250ZW50O1xuXHRcdGxldCBkb21SZWY6IEVsZW1lbnQgfCBudWxsID0gb0NvbnRlbnQ/LmdldERvbVJlZihzdWZmaXgpID8/IHN1cGVyLmdldERvbVJlZihzdWZmaXgpO1xuXHRcdGlmICghZG9tUmVmICYmICFzdWZmaXgpIHtcblx0XHRcdGRvbVJlZiA9IHRoaXMuX29sZERvbVJlZj8uZGVyZWYoKSA/PyBudWxsO1xuXHRcdFx0aWYgKGRvbVJlZikge1xuXHRcdFx0XHRyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tUmVmLmlkKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRvbVJlZjtcblx0fVxuXG5cdG92ZXJyaWRlIGdldEZvY3VzRG9tUmVmKCk6IEVsZW1lbnQgfCBudWxsIHtcblx0XHRjb25zdCBvQ29udGVudCA9IHRoaXMuY29udGVudDtcblx0XHRyZXR1cm4gb0NvbnRlbnQgPyBvQ29udGVudC5nZXRGb2N1c0RvbVJlZigpIDogc3VwZXIuZ2V0Rm9jdXNEb21SZWYoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGFza3MgdXAgdGhlIGNvbnRyb2wgdHJlZSB0byBlbmhhbmNlIHRoZSBhY2Nlc3NpYmlsaXR5IHN0YXRlIG9mIHRoZSBjb250cm9sLlxuXHQgKiBAcGFyYW0gX29FbGVtZW50IFRoZSBlbGVtZW50IHRvIGVuaGFuY2Vcblx0ICogQHBhcmFtIG1BcmlhUHJvcHMgVGhlIGN1cnJlbnQgYXJpYSBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIFRoZSBlbmhhbmNlZCBhcmlhIHByb3BlcnRpZXNcblx0ICovXG5cdG92ZXJyaWRlIGVuaGFuY2VBY2Nlc3NpYmlsaXR5U3RhdGUoX29FbGVtZW50OiBvYmplY3QsIG1BcmlhUHJvcHM6IG9iamVjdCk6IG9iamVjdCB7XG5cdFx0Y29uc3Qgb1BhcmVudCA9IHRoaXMuZ2V0UGFyZW50KCk7XG5cblx0XHRpZiAob1BhcmVudCAmJiAob1BhcmVudCBhcyBNYW5hZ2VkT2JqZWN0ICYgeyBlbmhhbmNlQWNjZXNzaWJpbGl0eVN0YXRlPzogRnVuY3Rpb24gfSkuZW5oYW5jZUFjY2Vzc2liaWxpdHlTdGF0ZSkge1xuXHRcdFx0Ly8gZm9yd2FyZCAgZW5oYW5jZUFjY2Vzc2liaWxpdHlTdGF0ZSBjYWxsIHRvIHRoZSBwYXJlbnRcblx0XHRcdChvUGFyZW50IGFzIE1hbmFnZWRPYmplY3QgJiB7IGVuaGFuY2VBY2Nlc3NpYmlsaXR5U3RhdGU6IEZ1bmN0aW9uIH0pLmVuaGFuY2VBY2Nlc3NpYmlsaXR5U3RhdGUoX29FbGVtZW50LCBtQXJpYVByb3BzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbUFyaWFQcm9wcztcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIChpZiBhdmFpbGFibGUgb24gdGhlIGNvbmNyZXRlIGNvbnRyb2wpIHByb3ZpZGVzIHRoZSBjdXJyZW50IGFjY2Vzc2liaWxpdHkgc3RhdGUgb2YgdGhlIGNvbnRyb2wuXG5cdCAqIEByZXR1cm5zIFRoZSBhY2Nlc3NpYmlsaXR5IGluZm9ybWF0aW9uIGZvciB0aGUgY29udHJvbC5cblx0ICovXG5cdG92ZXJyaWRlIGdldEFjY2Vzc2liaWxpdHlJbmZvKCk6IEFjY2Vzc2liaWxpdHlJbmZvIHtcblx0XHRsZXQgYWNjZXNzaWJpbGl0eUluZm8gPSB7fTtcblx0XHRpZiAodGhpcy5jb250ZW50Py5pc0E8Q29udHJvbD4oXCJzYXAudWkuY29yZS5Db250cm9sXCIpICYmIHRoaXMuY29udGVudC5nZXRBY2Nlc3NpYmlsaXR5SW5mbykge1xuXHRcdFx0YWNjZXNzaWJpbGl0eUluZm8gPSB0aGlzLmNvbnRlbnQuZ2V0QWNjZXNzaWJpbGl0eUluZm8oKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFjY2Vzc2liaWxpdHlJbmZvO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIERPTU5vZGUgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIFwibGFiZWxGb3JcIiBhdHRyaWJ1dGUuXG5cdCAqXG5cdCAqIFdlIGZvcndhcmQgdGhlIGNhbGwgb2YgdGhpcyBtZXRob2QgdG8gdGhlIGNvbnRlbnQgY29udHJvbC5cblx0ICogQHJldHVybnMgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIDxjb2RlPmxhYmVsRm9yPC9jb2RlPlxuXHQgKi9cblx0b3ZlcnJpZGUgZ2V0SWRGb3JMYWJlbCgpOiBzdHJpbmcge1xuXHRcdGlmICh0aGlzLmNvbnRlbnQ/LmlzQTxDb250cm9sPihcInNhcC51aS5jb3JlLkNvbnRyb2xcIikpIHtcblx0XHRcdHJldHVybiB0aGlzLmNvbnRlbnQuZ2V0SWRGb3JMYWJlbCgpO1xuXHRcdH1cblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdG92ZXJyaWRlIGFkZFN0eWxlQ2xhc3Moc3R5bGVDbGFzczogc3RyaW5nKTogdGhpcyB7XG5cdFx0KHRoaXMuY29udGVudCBhcyB1bmtub3duIGFzIENvbnRyb2wpPy5hZGRTdHlsZUNsYXNzKHN0eWxlQ2xhc3MpO1xuXHRcdHN1cGVyLmFkZFN0eWxlQ2xhc3Moc3R5bGVDbGFzcyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRvdmVycmlkZSByZW1vdmVTdHlsZUNsYXNzKHN0eWxlQ2xhc3M6IHN0cmluZyk6IHRoaXMge1xuXHRcdCh0aGlzLmNvbnRlbnQgYXMgdW5rbm93biBhcyBDb250cm9sKT8ucmVtb3ZlU3R5bGVDbGFzcyhzdHlsZUNsYXNzKTtcblx0XHRzdXBlci5yZW1vdmVTdHlsZUNsYXNzKHN0eWxlQ2xhc3MpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNob3J0aGFuZCBmb3IgdGhlIEJpbmRpbmdUb29sa2l0LmJpbmRTdGF0ZSBmdW5jdGlvbiB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdC5cblx0ICogQHBhcmFtIHBhdGggQSBwcm9wZXJ0eSBpbiB0aGUgc3RhdGUgb2JqZWN0XG5cdCAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIHRvb2xraXQgZXhwcmVzc2lvbiBmb3IgdGhlIHN0YXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHVpNS1leHBlcmltZW50YWwtc2luY2UgMS4xNDUuMFxuXHQgKi9cblx0cHVibGljIGJpbmRTdGF0ZTxTVCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KHBhdGg6IGtleW9mIEspOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248U1Q+IHtcblx0XHRyZXR1cm4gQmluZGluZ1Rvb2xraXQuYmluZFN0YXRlKHRoaXMuc3RhdGUgYXMgSywgcGF0aCk7XG5cdH1cblxuXHQvKipcblx0ICogU3luY2hyb25pemVzIGEgc3RhdGUgcHJvcGVydHkgd2l0aCBhbm90aGVyIGJ1aWxkaW5nIGJsb2NrJ3Mgc3RhdGUgcHJvcGVydHkuXG5cdCAqIEBwYXJhbSBwcm9wTmFtZSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgY3VycmVudCBzdGF0ZSBvYmplY3Rcblx0ICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGJ1aWxkaW5nIGJsb2NrXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgaW4gdGhlIHNvdXJjZSBidWlsZGluZyBibG9jaydzIHN0YXRlIG9iamVjdFxuXHQgKi9cblx0cHVibGljIHN5bmNTdGF0ZVByb3BlcnR5KHByb3BOYW1lOiBzdHJpbmcsIHNvdXJjZTogQnVpbGRpbmdCbG9ja0Jhc2UsIHByb3BlcnR5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHQodGhpcy5zdGF0ZSBhcyBHZW5lcmljU3RhdGUpW3Byb3BOYW1lXSA9IChzb3VyY2Uuc3RhdGUgYXMgR2VuZXJpY1N0YXRlKVtwcm9wZXJ0eV07XG5cdFx0Y29uc3QgcHJvcEJpbmRpbmcgPSBzb3VyY2UuZ2V0TW9kZWwoU1RBVEVfTU9ERUxfTkFNRSk/LmJpbmRQcm9wZXJ0eShcIi9cIiArIHByb3BlcnR5KTtcblx0XHRwcm9wQmluZGluZz8uYXR0YWNoQ2hhbmdlKCgpOiB2b2lkID0+IHtcblx0XHRcdCh0aGlzLnN0YXRlIGFzIEdlbmVyaWNTdGF0ZSlbcHJvcE5hbWVdID0gKHNvdXJjZS5zdGF0ZSBhcyBHZW5lcmljU3RhdGUpW3Byb3BlcnR5XTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGcmFtZXdvcmsgaG9vayBmb3Igc3RhdGUgY2hhbmdlIGhhbmRsaW5nLlxuXHQgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZWFjdCB0byBzdGF0ZSBjaGFuZ2VzLlxuXHQgKiBAcGFyYW0gX2NoYW5nZWRQcm9wcyBMaXN0IG9mIGNoYW5nZWQgcHJvcGVydHkgbmFtZXNcblx0ICogQHB1YmxpY1xuXHQgKiBAdWk1LWV4cGVyaW1lbnRhbC1zaW5jZSAxLjE0NS4wXG5cdCAqL1xuXHRwcm90ZWN0ZWQgb25TdGF0ZUNoYW5nZShfY2hhbmdlZFByb3BzOiBzdHJpbmdbXSk6IHZvaWQ7XG5cblx0cHJvdGVjdGVkIGFzeW5jIG9uU3RhdGVDaGFuZ2UoX2NoYW5nZWRQcm9wczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHt9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJ1aWxkaW5nQmxvY2tCYXNlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFhQTtFQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQQSxJQVNNQSxpQkFBaUIsSUFBQUMsSUFBQSxHQUR0QkMsY0FBYyxDQUFDLCtCQUErQixDQUFDLEVBQUFDLEtBQUEsR0FVOUNDLFdBQVcsQ0FBQztJQUFFQyxJQUFJLEVBQUUscUJBQXFCO0lBQUVDLFFBQVEsRUFBRSxLQUFLO0lBQUVDLFNBQVMsRUFBRTtFQUFLLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBTzlFQyxXQUFXLENBQUM7SUFBRUosSUFBSSxFQUFFLHFCQUFxQjtJQUFFQyxRQUFRLEVBQUUsSUFBSTtJQUFFSSxZQUFZLEVBQUU7RUFBaUIsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0FVNUZDLFdBQVcsQ0FBQyxDQUFDLEVBQUFYLElBQUEsQ0FBQVksTUFBQSxJQUFBQyxPQUFBLDBCQUFBQyxRQUFBO0lBS2QsU0FBQWYsa0JBQVlnQixRQUFzRCxFQUFFQyxNQUEyQyxFQUFFQyxLQUFjLEVBQUU7TUFBQSxJQUFBQyxLQUFBO01BQ2hJLElBQUksT0FBT0gsUUFBUSxLQUFLLFFBQVEsRUFBRTtRQUNqQ0MsTUFBTSxLQUFL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
240
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCdWlsZGluZ0Jsb2NrQmFzZSIsIl9kZWMiLCJkZWZpbmVVSTVDbGFzcyIsIl9kZWMyIiwiYWdncmVnYXRpb24iLCJ0eXBlIiwibXVsdGlwbGUiLCJpc0RlZmF1bHQiLCJfZGVjMyIsImFzc29jaWF0aW9uIiwic2luZ3VsYXJOYW1lIiwiX2RlYzQiLCJkZWZpbmVTdGF0ZSIsIl9jbGFzcyIsIl9jbGFzczIiLCJfQ29udHJvbCIsInNldHRpbmdzIiwib3RoZXJzIiwic2NvcGUiLCJfdGhpcyIsImlkIiwiY2FsbCIsIl9pbml0aWFsaXplckRlZmluZVByb3BlcnR5IiwiX2Rlc2NyaXB0b3IiLCJfZGVzY3JpcHRvcjIiLCJfZGVzY3JpcHRvcjMiLCJfb2xkRG9tUmVmIiwiX2luaGVyaXRzTG9vc2UiLCJfcHJvdG8iLCJwcm90b3R5cGUiLCJnZXRQbGFjZWhvbGRlciIsIl9ybSIsInJlbmRlciIsIm9SbSIsIm9Db250cm9sIiwiY29udGVudCIsImdldFZpc2libGUiLCJJbnZpc2libGVSZW5kZXJlciIsInJlbmRlckNvbnRyb2wiLCJzZXRCaW5kaW5nQ29udGV4dCIsImNvbnRleHQiLCJtb2RlbCIsInVuZGVmaW5lZCIsImludmFsaWRhdGUiLCJiaW5kUHJvcGVydHkiLCJuYW1lIiwiYmluZGluZ0luZm8iLCJwcm9wZXJ0eU1ldGFkYXRhIiwiZ2V0TWV0YWRhdGEiLCJnZXRQcm9wZXJ0eSIsImJpbmRhYmxlIiwiZ3JvdXAiLCJvbkFmdGVyUmVuZGVyaW5nIiwiZXZlbnQiLCJkb21SZWYiLCJnZXREb21SZWYiLCJXZWFrUmVmIiwic3VmZml4Iiwib0NvbnRlbnQiLCJkZXJlZiIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJnZXRGb2N1c0RvbVJlZiIsImVuaGFuY2VBY2Nlc3NpYmlsaXR5U3RhdGUiLCJfb0VsZW1lbnQiLCJtQXJpYVByb3BzIiwib1BhcmVudCIsImdldFBhcmVudCIsImdldEFjY2Vzc2liaWxpdHlJbmZvIiwiaXNBIiwiZ2V0SWRGb3JMYWJlbCIsImFkZFN0eWxlQ2xhc3MiLCJzdHlsZUNsYXNzIiwicmVtb3ZlU3R5bGVDbGFzcyIsImJpbmRTdGF0ZSIsInBhdGgiLCJCaW5kaW5nVG9vbGtpdCIsInN0YXRlIiwic3luY1N0YXRlUHJvcGVydHkiLCJwcm9wTmFtZSIsInNvdXJjZSIsInByb3BlcnR5IiwicHJvcEJpbmRpbmciLCJnZXRNb2RlbCIsIlNUQVRFX01PREVMX05BTUUiLCJhdHRhY2hDaGFuZ2UiLCJvblN0YXRlQ2hhbmdlIiwiX2NoYW5nZWRQcm9wcyIsIkNvbnRyb2wiLCJfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsIndyaXRhYmxlIiwiaW5pdGlhbGl6ZXIiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tCYXNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBQcmltaXRpdmVUeXBlIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgKiBhcyBCaW5kaW5nVG9vbGtpdCBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgR2VuZXJpY1N0YXRlLCBQcm9wZXJ0aWVzT2YsIFN0YXRlT2YgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGlvbiwgYXNzb2NpYXRpb24sIGRlZmluZVN0YXRlLCBkZWZpbmVVSTVDbGFzcywgU1RBVEVfTU9ERUxfTkFNRSB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgUHJvcGVydHlCaW5kaW5nSW5mbyB9IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IEludmlzaWJsZVJlbmRlcmVyIGZyb20gXCJzYXAvdWkvY29yZS9JbnZpc2libGVSZW5kZXJlclwiO1xuaW1wb3J0IHR5cGUgUmVuZGVyTWFuYWdlciBmcm9tIFwic2FwL3VpL2NvcmUvUmVuZGVyTWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBBY2Nlc3NpYmlsaXR5SW5mbyB9IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5pbnRlcmZhY2UgQnVpbGRpbmdCbG9ja0Jhc2U8VCBleHRlbmRzIFVJNUVsZW1lbnQgPSBDb250cm9sLCBLIGV4dGVuZHMgb2JqZWN0ID0ge30+IHtcblx0Ly8gRm9yY2UgYSBzdGF0ZSB1cGRhdGVcblx0X3VwZGF0ZVN0YXRlKCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYnVpbGRpbmcgYmxvY2tzLlxuICogVGhpcyBjb250YWlucyB0aGUgbG93LWxldmVsIGZ1bmN0aW9uYWxpdHkgb2YgaGF2aW5nIGEgY29udGVudCBhZ2dyZWdhdGlvbiBhbmQgaGFuZGxpbmcgdGhlIHJlbmRlcmluZyBvZiB0aGUgY29udGVudCB3aXRob3V0IGFuIGFjdHVhbCBET00gZWxlbWVudC48YnIvPlxuICogVGhlIGJ1aWxkaW5nIGJsb2NrIGFsc28gZGVmaW5lcyBhIHN0YXRlIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgYnVpbGRpbmcgYmxvY2suPGJyLz5cbiAqIEFjY2Vzc2liaWxpdHkgYW5kIGNsYXNzZXMgaW5mb3JtYXRpb24gYXJlIGZvcndhcmRlZCB0byB0aGUgY29udGVudCBjb250cm9sLjxici8+XG4gKiBUaGlzIGNsYXNzIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGRpcmVjdGx5LCBpdCdzIHRoZXJlIGZvciBpbnRlcm5hbCB1c2Ugb25seSAoYW5kIGRvY3VtZW50YXRpb24pXG4gKiBAcHVibGljXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5iYXNlLkJ1aWxkaW5nQmxvY2tCYXNlXCIpXG5jbGFzcyBCdWlsZGluZ0Jsb2NrQmFzZTxUIGV4dGVuZHMgVUk1RWxlbWVudCA9IENvbnRyb2wsIEsgZXh0ZW5kcyBvYmplY3QgPSB7fT4gZXh0ZW5kcyBDb250cm9sIHtcblx0LyoqXG5cdCAqIE9wdGlvbmFsIGNvbnRlbnQgb2YgZ2VuZXJpYyB0eXBlIFQuXG5cdCAqXG5cdCAqIFRoaXMgcHJvcGVydHkgaG9sZHMgdGhlIG1haW4gZGF0YSBvciBwYXlsb2FkIGZvciB0aGUgY29udGFpbmluZyBvYmplY3QuXG5cdCAqIFdoZW4gdW5kZWZpbmVkLCBpdCBpbmRpY2F0ZXMgdGhhdCBubyBjb250ZW50IGhhcyBiZWVuIHNldCBvciBpcyBhdmFpbGFibGUuXG5cdCAqIFRoZSBzcGVjaWZpYyB0eXBlIGFuZCBzdHJ1Y3R1cmUgb2YgdGhlIGNvbnRlbnQgZGVwZW5kcyBvbiB0aGUgZ2VuZXJpYyB0eXBlIHBhcmFtZXRlciBULlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRAYWdncmVnYXRpb24oeyB0eXBlOiBcInNhcC51aS5jb3JlLkVsZW1lbnRcIiwgbXVsdGlwbGU6IGZhbHNlLCBpc0RlZmF1bHQ6IHRydWUgfSlcblx0Y29udGVudD86IFQ7XG5cblx0LyoqXG5cdCAqIEFzc29jaWF0aW9uIHRvIGNvbnRyb2xzIC8gSURzIHRoYXQgbGFiZWwgdGhpcyBjb250cm9sIChzZWUgV0FJLUFSSUEgYXR0cmlidXRlIGFyaWEtbGFiZWxsZWRieSkuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBhc3NvY2lhdGlvbih7IHR5cGU6IFwic2FwLnVpLmNvcmUuQ29udHJvbFwiLCBtdWx0aXBsZTogdHJ1ZSwgc2luZ3VsYXJOYW1lOiBcImFyaWFMYWJlbGxlZEJ5XCIgfSlcblx0YXJpYUxhYmVsbGVkQnkhOiBzdHJpbmdbXTtcblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgc3RhdGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogVGhpcyBwcm9wZXJ0eSBob2xkcyB0aGUgc3RhdGUgZGF0YSBtYW5hZ2VkIGJ5IHRoZSBjb21wb25lbnQsIHdpdGggdGhlIHR5cGVcblx0ICogZGV0ZXJtaW5lZCBieSB0aGUgZ2VuZXJpYyBwYXJhbWV0ZXIgSy5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QGRlZmluZVN0YXRlKClcblx0cHJvdGVjdGVkIHN0YXRlITogU3RhdGVPZjxLPjtcblxuXHRnZXRQbGFjZWhvbGRlcihfcm06IFJlbmRlck1hbmFnZXIpOiB2b2lkIHt9XG5cblx0Y29uc3RydWN0b3Ioc2V0dGluZ3M/OiBzdHJpbmcgfCBQcm9wZXJ0aWVzT2Y8QnVpbGRpbmdCbG9ja0Jhc2U8VD4+LCBvdGhlcnM/OiBQcm9wZXJ0aWVzT2Y8QnVpbGRpbmdCbG9ja0Jhc2U8VD4+LCBzY29wZT86IG9iamVjdCkge1xuXHRcdGlmICh0eXBlb2Ygc2V0dGluZ3MgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG90aGVycyA/Pz0ge307XG5cdFx0XHRvdGhlcnMuaWQgPSBzZXR0aW5ncztcblx0XHR9XG5cdFx0Ly8gU2NvcGUgaXMgZGVmaW5lZCBhbmQgaXMgdGhlcmUsIGJ1dCBzb21laG93IGRvZXNuJ3QgYXBwZWFyIG9uIGFsbCB0aGUgY2hpbGRyZW4gb2YgTWFuYWdlZE9iamVjdFxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0c3VwZXIoc2V0dGluZ3MgYXMgdW5rbm93biBhcyBzdHJpbmcsIG90aGVycywgc2NvcGUpO1xuXHR9XG5cblx0cHJpdmF0ZSBfb2xkRG9tUmVmOiBXZWFrUmVmPEVsZW1lbnQ+IHwgbnVsbCA9IG51bGw7XG5cblx0c3RhdGljIHJlbmRlcjxUIGV4dGVuZHMgQ29udHJvbD4ob1JtOiBSZW5kZXJNYW5hZ2VyLCBvQ29udHJvbDogQnVpbGRpbmdCbG9ja0Jhc2U8VD4pOiB2b2lkIHtcblx0XHRpZiAoIW9Db250cm9sLmNvbnRlbnQgfHwgb0NvbnRyb2wuZ2V0VmlzaWJsZSgpID09PSBmYWxzZSkge1xuXHRcdFx0Ly8gSWYgdGhlcmUgaXMgbm8gY29udGVudCwgd2UgcmVuZGVyIGFuIGludmlzaWJsZSByZW5kZXJlciB0byBhdm9pZCB0aGUgY29udHJvbCBiZWluZ1xuXHRcdFx0SW52aXNpYmxlUmVuZGVyZXIucmVuZGVyKG9SbSwgb0NvbnRyb2wpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvQ29udHJvbC5nZXRQbGFjZWhvbGRlcj8uKG9SbSk7XG5cdFx0XHRvUm0ucmVuZGVyQ29udHJvbChvQ29udHJvbC5jb250ZW50KTtcblx0XHR9XG5cdH1cblxuXHRzZXRCaW5kaW5nQ29udGV4dChjb250ZXh0OiBDb250ZXh0LCBtb2RlbD86IHN0cmluZyk6IHRoaXMge1xuXHRcdHN1cGVyLnNldEJpbmRpbmdDb250ZXh0KGNvbnRleHQsIG1vZGVsKTtcblx0XHRpZiAobW9kZWwgPT09IHVuZGVmaW5lZCAmJiBjb250ZXh0KSB7XG5cdFx0XHR0aGlzLmludmFsaWRhdGUoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogT3ZlcnJpZGUgdGhlIGJpbmRQcm9wZXJ0eSB0byBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgdGhlIHByb3BlcnR5IGlzIGEgYmluZGluZyBpbmZvLlxuXHQgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0ZSBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mb1xuXHQgKiBAcmV0dXJucyBUaGUgaW5zdGFuY2Ugb2YgdGhlIGJ1aWxkaW5nIGJsb2NrIGZvciBjaGFpbmluZ1xuXHQgKi9cblx0b3ZlcnJpZGUgYmluZFByb3BlcnR5KG5hbWU6IHN0cmluZywgYmluZGluZ0luZm86IFByb3BlcnR5QmluZGluZ0luZm8pOiB0aGlzIHtcblx0XHRjb25zdCBwcm9wZXJ0eU1ldGFkYXRhID0gdGhpcy5nZXRNZXRhZGF0YSgpLmdldFByb3BlcnR5KG5hbWUpO1xuXHRcdGlmIChwcm9wZXJ0eU1ldGFkYXRhPy5iaW5kYWJsZSA9PT0gZmFsc2UgJiYgcHJvcGVydHlNZXRhZGF0YS5ncm91cCA9PT0gXCJEYXRhXCIpIHtcblx0XHRcdCh0aGlzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtuYW1lXSA9IGJpbmRpbmdJbmZvO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdXBlci5iaW5kUHJvcGVydHkobmFtZSwgYmluZGluZ0luZm8pO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8vc2V0IHRoZSBvbGQgZG9tIHJlZlxuXHRvdmVycmlkZSBvbkFmdGVyUmVuZGVyaW5nKGV2ZW50OiBKUXVlcnkuRXZlbnQpOiB2b2lkIHtcblx0XHRjb25zdCBkb21SZWYgPSB0aGlzLmdldERvbVJlZigpO1xuXHRcdGlmIChkb21SZWYpIHtcblx0XHRcdHRoaXMuX29sZERvbVJlZiA9IG5ldyBXZWFrUmVmKGRvbVJlZik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX29sZERvbVJlZiA9IG51bGw7XG5cdFx0fVxuXHRcdHN1cGVyLm9uQWZ0ZXJSZW5kZXJpbmcoZXZlbnQpO1xuXHR9XG5cblx0b3ZlcnJpZGUgZ2V0RG9tUmVmKHN1ZmZpeD86IHN0cmluZyk6IEVsZW1lbnQgfCBudWxsIHtcblx0XHRjb25zdCBvQ29udGVudCA9IHRoaXMuY29udGVudDtcblx0XHRsZXQgZG9tUmVmOiBFbGVtZW50IHwgbnVsbCA9IG9Db250ZW50Py5nZXREb21SZWYoc3VmZml4KSA/PyBzdXBlci5nZXREb21SZWYoc3VmZml4KTtcblx0XHRpZiAoIWRvbVJlZiAmJiAhc3VmZml4KSB7XG5cdFx0XHRkb21SZWYgPSB0aGlzLl9vbGREb21SZWY/LmRlcmVmKCkgPz8gbnVsbDtcblx0XHRcdGlmIChkb21SZWYpIHtcblx0XHRcdFx0cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbVJlZi5pZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBkb21SZWY7XG5cdH1cblxuXHRvdmVycmlkZSBnZXRGb2N1c0RvbVJlZigpOiBFbGVtZW50IHwgbnVsbCB7XG5cdFx0Y29uc3Qgb0NvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7XG5cdFx0cmV0dXJuIG9Db250ZW50ID8gb0NvbnRlbnQuZ2V0Rm9jdXNEb21SZWYoKSA6IHN1cGVyLmdldEZvY3VzRG9tUmVmKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBhc2tzIHVwIHRoZSBjb250cm9sIHRyZWUgdG8gZW5oYW5jZSB0aGUgYWNjZXNzaWJpbGl0eSBzdGF0ZSBvZiB0aGUgY29udHJvbC5cblx0ICogQHBhcmFtIF9vRWxlbWVudCBUaGUgZWxlbWVudCB0byBlbmhhbmNlXG5cdCAqIEBwYXJhbSBtQXJpYVByb3BzIFRoZSBjdXJyZW50IGFyaWEgcHJvcGVydGllc1xuXHQgKiBAcmV0dXJucyBUaGUgZW5oYW5jZWQgYXJpYSBwcm9wZXJ0aWVzXG5cdCAqL1xuXHRvdmVycmlkZSBlbmhhbmNlQWNjZXNzaWJpbGl0eVN0YXRlKF9vRWxlbWVudDogb2JqZWN0LCBtQXJpYVByb3BzOiBvYmplY3QpOiBvYmplY3Qge1xuXHRcdGNvbnN0IG9QYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpO1xuXG5cdFx0aWYgKG9QYXJlbnQgJiYgKG9QYXJlbnQgYXMgTWFuYWdlZE9iamVjdCAmIHsgZW5oYW5jZUFjY2Vzc2liaWxpdHlTdGF0ZT86IEZ1bmN0aW9uIH0pLmVuaGFuY2VBY2Nlc3NpYmlsaXR5U3RhdGUpIHtcblx0XHRcdC8vIGZvcndhcmQgIGVuaGFuY2VBY2Nlc3NpYmlsaXR5U3RhdGUgY2FsbCB0byB0aGUgcGFyZW50XG5cdFx0XHQob1BhcmVudCBhcyBNYW5hZ2VkT2JqZWN0ICYgeyBlbmhhbmNlQWNjZXNzaWJpbGl0eVN0YXRlOiBGdW5jdGlvbiB9KS5lbmhhbmNlQWNjZXNzaWJpbGl0eVN0YXRlKF9vRWxlbWVudCwgbUFyaWFQcm9wcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1BcmlhUHJvcHM7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiAoaWYgYXZhaWxhYmxlIG9uIHRoZSBjb25jcmV0ZSBjb250cm9sKSBwcm92aWRlcyB0aGUgY3VycmVudCBhY2Nlc3NpYmlsaXR5IHN0YXRlIG9mIHRoZSBjb250cm9sLlxuXHQgKiBXaGVuIHRoZSBjb250ZW50IGNvbnRyb2wgaXMgbm90IHZpc2libGUsIG51bGwgaXMgcmV0dXJuZWQgc28gdGhhdCBzYXAubS5UYWJsZSBjYW4gc2V0IGFyaWEtbGFiZWw9XCJcIlxuXHQgKiBvbiB0aGUgZ3JpZGNlbGwsIHByZXZlbnRpbmcgc2NyZWVuIHJlYWRlciB2aXJ0dWFsIGJ1ZmZlciBibGVlZC10aHJvdWdoIChBQ0MtMjY0LjEgLyBXQ0FHIDIuMSBMZXZlbCBBKS5cblx0ICogQHJldHVybnMgVGhlIGFjY2Vzc2liaWxpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBjb250cm9sLCBvciBudWxsIChjYXN0KSB3aGVuIGNvbnRlbnQgaXMgbm90IHZpc2libGUuXG5cdCAqL1xuXHRvdmVycmlkZSBnZXRBY2Nlc3NpYmlsaXR5SW5mbygpOiBBY2Nlc3NpYmlsaXR5SW5mbyB7XG5cdFx0aWYgKHRoaXMuY29udGVudD8uaXNBPENvbnRyb2w+KFwic2FwLnVpLmNvcmUuQ29udHJvbFwiKSAmJiB0aGlzLmNvbnRlbnQuZ2V0QWNjZXNzaWJpbGl0eUluZm8pIHtcblx0XHRcdGlmICghdGhpcy5jb250ZW50LmdldFZpc2libGUoKSkge1xuXHRcdFx0XHQvLyBDb250ZW50IGlzIG5vdCB2aXNpYmxlOiByZXR1cm4gbnVsbCAoY2FzdCB0byBwcmVzZXJ2ZSB0aGUgdHlwZSBjb250cmFjdCkgc28gdGhhdFxuXHRcdFx0XHQvLyBzYXAubS5UYWJsZSByZWNlaXZlcyBhIGZhbHN5IHZhbHVlIGFuZCBzZXRzIGFyaWEtbGFiZWw9XCJcIiBvbiB0aGUgZ3JpZGNlbGwsXG5cdFx0XHRcdC8vIHByZXZlbnRpbmcgc2NyZWVuIHJlYWRlciB2aXJ0dWFsIGJ1ZmZlciBibGVlZC10aHJvdWdoIChBQ0MtMjY0LjEgLyBXQ0FHIDIuMSBMZXZlbCBBKS5cblx0XHRcdFx0cmV0dXJuIG51bGwgYXMgdW5rbm93biBhcyBBY2Nlc3NpYmlsaXR5SW5mbztcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLmNvbnRlbnQuZ2V0QWNjZXNzaWJpbGl0eUluZm8oKTtcblx0XHR9XG5cdFx0cmV0dXJuIHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIERPTU5vZGUgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIFwibGFiZWxGb3JcIiBhdHRyaWJ1dGUuXG5cdCAqXG5cdCAqIFdlIGZvcndhcmQgdGhlIGNhbGwgb2YgdGhpcyBtZXRob2QgdG8gdGhlIGNvbnRlbnQgY29udHJvbC5cblx0ICogQHJldHVybnMgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIDxjb2RlPmxhYmVsRm9yPC9jb2RlPlxuXHQgKi9cblx0b3ZlcnJpZGUgZ2V0SWRGb3JMYWJlbCgpOiBzdHJpbmcge1xuXHRcdGlmICh0aGlzLmNvbnRlbnQ/LmlzQTxDb250cm9sPihcInNhcC51aS5jb3JlLkNvbnRyb2xcIikpIHtcblx0XHRcdHJldHVybiB0aGlzLmNvbnRlbnQuZ2V0SWRGb3JMYWJlbCgpO1xuXHRcdH1cblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdG92ZXJyaWRlIGFkZFN0eWxlQ2xhc3Moc3R5bGVDbGFzczogc3RyaW5nKTogdGhpcyB7XG5cdFx0KHRoaXMuY29udGVudCBhcyB1bmtub3duIGFzIENvbnRyb2wpPy5hZGRTdHlsZUNsYXNzKHN0eWxlQ2xhc3MpO1xuXHRcdHN1cGVyLmFkZFN0eWxlQ2xhc3Moc3R5bGVDbGFzcyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRvdmVycmlkZSByZW1vdmVTdHlsZUNsYXNzKHN0eWxlQ2xhc3M6IHN0cmluZyk6IHRoaXMge1xuXHRcdCh0aGlzLmNvbnRlbnQgYXMgdW5rbm93biBhcyBDb250cm9sKT8ucmVtb3ZlU3R5bGVDbGFzcyhzdHlsZUNsYXNzKTtcblx0XHRzdXBlci5yZW1vdmVTdHlsZUNsYXNzKHN0eWxlQ2xhc3MpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNob3J0aGFuZCBmb3IgdGhlIEJpbmRpbmdUb29sa2l0LmJpbmRTdGF0ZSBmdW5jdGlvbiB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdC5cblx0ICogQHBhcmFtIHBhdGggQSBwcm9wZXJ0eSBpbiB0aGUgc3RhdGUgb2JqZWN0XG5cdCAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIHRvb2xraXQgZXhwcmVzc2lvbiBmb3IgdGhlIHN0YXRlXG5cdCAqL1xuXHRwdWJsaWMgYmluZFN0YXRlPFNUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4ocGF0aDoga2V5b2YgSyk6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxTVD4ge1xuXHRcdHJldHVybiBCaW5kaW5nVG9vbGtpdC5iaW5kU3RhdGUodGhpcy5zdGF0ZSBhcyBLLCBwYXRoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTeW5jaHJvbml6ZXMgYSBzdGF0ZSBwcm9wZXJ0eSB3aXRoIGFub3RoZXIgYnVpbGRpbmcgYmxvY2sncyBzdGF0ZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIHByb3BOYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdFxuXHQgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgYnVpbGRpbmcgYmxvY2tcblx0ICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBpbiB0aGUgc291cmNlIGJ1aWxkaW5nIGJsb2NrJ3Mgc3RhdGUgb2JqZWN0XG5cdCAqL1xuXHRwdWJsaWMgc3luY1N0YXRlUHJvcGVydHkocHJvcE5hbWU6IHN0cmluZywgc291cmNlOiBCdWlsZGluZ0Jsb2NrQmFzZSwgcHJvcGVydHk6IHN0cmluZyk6IHZvaWQge1xuXHRcdCh0aGlzLnN0YXRlIGFzIEdlbmVyaWNTdGF0ZSlbcHJvcE5hbWVdID0gKHNvdXJjZS5zdGF0ZSBhcyBHZW5lcmljU3RhdGUpW3Byb3BlcnR5XTtcblx0XHRjb25zdCBwcm9wQmluZGluZyA9IHNvdXJjZS5nZXRNb2RlbChTVEFURV9NT0RFTF9OQU1FKT8uYmluZFByb3BlcnR5KFwiL1wiICsgcHJvcGVydHkpO1xuXHRcdHByb3BCaW5kaW5nPy5hdHRhY2hDaGFuZ2UoKCk6IHZvaWQgPT4ge1xuXHRcdFx0KHRoaXMuc3RhdGUgYXMgR2VuZXJpY1N0YXRlKVtwcm9wTmFtZV0gPSAoc291cmNlLnN0YXRlIGFzIEdlbmVyaWNTdGF0ZSlbcHJvcGVydHldO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZyYW1ld29yayBob29rIGZvciBzdGF0ZSBjaGFuZ2UgaGFuZGxpbmcuXG5cdCAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJlYWN0IHRvIHN0YXRlIGNoYW5nZXMuXG5cdCAqIEBwYXJhbSBfY2hhbmdlZFByb3BzIExpc3Qgb2YgY2hhbmdlZCBwcm9wZXJ0eSBuYW1lc1xuXHQgKi9cblx0cHJvdGVjdGVkIG9uU3RhdGVDaGFuZ2UoX2NoYW5nZWRQcm9wczogc3RyaW5nW10pOiB2b2lkO1xuXG5cdHByb3RlY3RlZCBhc3luYyBvblN0YXRlQ2hhbmdlKF9jaGFuZ2VkUHJvcHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7fVxufVxuXG5leHBvcnQgZGVmYXVsdCBCdWlsZGluZ0Jsb2NrQmFzZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBYUE7RUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUEEs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
@@ -151,14 +151,21 @@ class BuildingBlockBase<T extends UI5Element = Control, K extends object = {}> e
151
151
 
152
152
  /**
153
153
  * This function (if available on the concrete control) provides the current accessibility state of the control.
154
- * @returns The accessibility information for the control.
154
+ * When the content control is not visible, null is returned so that sap.m.Table can set aria-label=""
155
+ * on the gridcell, preventing screen reader virtual buffer bleed-through (ACC-264.1 / WCAG 2.1 Level A).
156
+ * @returns The accessibility information for the control, or null (cast) when content is not visible.
155
157
  */
156
158
  override getAccessibilityInfo(): AccessibilityInfo {
157
- let accessibilityInfo = {};
158
159
  if (this.content?.isA<Control>("sap.ui.core.Control") && this.content.getAccessibilityInfo) {
159
- accessibilityInfo = this.content.getAccessibilityInfo();
160
+ if (!this.content.getVisible()) {
161
+ // Content is not visible: return null (cast to preserve the type contract) so that
162
+ // sap.m.Table receives a falsy value and sets aria-label="" on the gridcell,
163
+ // preventing screen reader virtual buffer bleed-through (ACC-264.1 / WCAG 2.1 Level A).
164
+ return null as unknown as AccessibilityInfo;
165
+ }
166
+ return this.content.getAccessibilityInfo();
160
167
  }
161
- return accessibilityInfo;
168
+ return {};
162
169
  }
163
170
 
164
171
  /**
@@ -190,8 +197,6 @@ class BuildingBlockBase<T extends UI5Element = Control, K extends object = {}> e
190
197
  * Shorthand for the BindingToolkit.bindState function with the current state object.
191
198
  * @param path A property in the state object
192
199
  * @returns The binding toolkit expression for the state
193
- * @public
194
- * @ui5-experimental-since 1.145.0
195
200
  */
196
201
  public bindState<ST extends PrimitiveType>(path: keyof K): BindingToolkitExpression<ST> {
197
202
  return BindingToolkit.bindState(this.state as K, path);
@@ -215,8 +220,6 @@ class BuildingBlockBase<T extends UI5Element = Control, K extends object = {}> e
215
220
  * Framework hook for state change handling.
216
221
  * Subclasses can override this method to react to state changes.
217
222
  * @param _changedProps List of changed property names
218
- * @public
219
- * @ui5-experimental-since 1.145.0
220
223
  */
221
224
  protected onStateChange(_changedProps: string[]): void;
222
225