@sapui5/sap.fe.core 1.133.0 → 1.133.2

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.
@@ -317,7 +317,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/MetaModelCo
317
317
  } : {};
318
318
  };
319
319
  _exports.getConstraintOptions = getConstraintOptions;
320
- const getBindingWithUnitOrCurrency = function (oPropertyDataModelPath, propertyBindingExpression, ignoreUnitConstraint, formatOptions) {
320
+ const getBindingWithUnitOrCurrency = function (oPropertyDataModelPath, propertyBindingExpression, ignoreUnitConstraint, formatOptions, forDisplayMode, showOnlyUnitDecimals) {
321
321
  const oPropertyDefinition = oPropertyDataModelPath.targetObject;
322
322
  let unit = oPropertyDefinition.annotations?.Measures?.Unit;
323
323
  const relativeLocation = getRelativePaths(oPropertyDataModelPath);
@@ -331,7 +331,17 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/MetaModelCo
331
331
  const complexType = unit ? "sap.ui.model.odata.type.Unit" : "sap.ui.model.odata.type.Currency";
332
332
  unit = unit ? unit : oPropertyDefinition.annotations?.Measures?.ISOCurrency;
333
333
  const unitBindingExpression = isPathAnnotationExpression(unit) && unit.$target ? formatWithTypeInformation(unit.$target, getExpressionFromAnnotation(unit, relativeLocation), ignoreUnitConstraint) : getExpressionFromAnnotation(unit, relativeLocation);
334
- const constraintOptions = complexType === "sap.ui.model.odata.type.Unit" ? getConstraintOptions(oPropertyDataModelPath.targetObject) : undefined;
334
+ let constraintOptions;
335
+ if (complexType === "sap.ui.model.odata.type.Unit") {
336
+ if (forDisplayMode && !showOnlyUnitDecimals) {
337
+ constraintOptions = {
338
+ skipDecimalsValidation: true
339
+ };
340
+ } else if (!forDisplayMode) {
341
+ // Consider annotation only in edit mode
342
+ constraintOptions = getConstraintOptions(oPropertyDataModelPath.targetObject);
343
+ }
344
+ }
335
345
  return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType, undefined, formatOptions, constraintOptions);
336
346
  };
337
347
 
@@ -355,7 +365,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/MetaModelCo
355
365
  return (minExpression || maxExpression) && addTypeInformation([propertyBindingExpression, minExpression, maxExpression], complexType, undefined, formatOptions);
356
366
  };
357
367
  _exports.getBindingForDatePicker = getBindingForDatePicker;
358
- const getBindingForUnitOrCurrency = function (oPropertyDataModelPath) {
368
+ const getBindingForUnitOrCurrency = function (oPropertyDataModelPath, forDisplayMode, showOnlyUnitDecimals) {
359
369
  const oPropertyDefinition = oPropertyDataModelPath?.targetObject;
360
370
  if (!oPropertyDefinition) {
361
371
  return "";
@@ -370,7 +380,16 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/MetaModelCo
370
380
  const unitBindingExpression = isPathAnnotationExpression(unit) && unit.$target ? formatWithTypeInformation(unit.$target, getExpressionFromAnnotation(unit, relativeLocation)) : getExpressionFromAnnotation(unit, relativeLocation);
371
381
  let propertyBindingExpression = pathInModel(getContextRelativeTargetObjectPath(oPropertyDataModelPath));
372
382
  propertyBindingExpression = formatWithTypeInformation(oPropertyDefinition, propertyBindingExpression, true);
373
- const constraintOptions = complexType === "sap.ui.model.odata.type.Unit" ? getConstraintOptions(oPropertyDataModelPath.targetObject) : undefined;
383
+ let constraintOptions;
384
+ if (complexType === "sap.ui.model.odata.type.Unit") {
385
+ if (forDisplayMode && !showOnlyUnitDecimals) {
386
+ constraintOptions = {
387
+ skipDecimalsValidation: true
388
+ };
389
+ } else if (!forDisplayMode) {
390
+ constraintOptions = getConstraintOptions(oPropertyDefinition);
391
+ }
392
+ }
374
393
  return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType, undefined, {
375
394
  parseKeepsEmptyString: true,
376
395
  showNumber: false
@@ -707,4 +726,4 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/MetaModelCo
707
726
  _exports.isQuickViewFacetVisible = isQuickViewFacetVisible;
708
727
  return _exports;
709
728
  }, false);
710
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGaWVsZEVkaXRNb2RlIiwiRGlzYWJsZWQiLCJEaXNwbGF5IiwiRWRpdGFibGUiLCJFZGl0YWJsZURpc3BsYXkiLCJFZGl0YWJsZVJlYWRPbmx5IiwiUmVhZE9ubHkiLCJfZXhwb3J0cyIsImdldERpc3BsYXlNb2RlIiwib0RhdGFNb2RlbE9iamVjdFBhdGgiLCJEaXNwbGF5TW9kZUZvcm1hdHRlciIsInRhcmdldE9iamVjdCIsImdldEVkaXRhYmxlRXhwcmVzc2lvbkFzT2JqZWN0Iiwib1Byb3BlcnR5UGF0aCIsIm9EYXRhRmllbGRDb252ZXJ0ZWQiLCJpc0VkaXRhYmxlIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiVUkiLCJJc0VkaXRhYmxlIiwiY29uc2lkZXJVcGRhdGVSZXN0cmljdGlvbnMiLCJnZXRFZGl0YWJsZUV4cHJlc3Npb24iLCJiQXNPYmplY3QiLCJyZWxhdGl2ZVBhdGgiLCJnZXRSZWxhdGl2ZVBhdGhzIiwiY29tcGlsZUV4cHJlc3Npb24iLCJkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24iLCJjb25zdGFudCIsImlzUHJvcGVydHkiLCJpZkVsc2UiLCJpc05vbkVkaXRhYmxlRXhwcmVzc2lvbiIsIm9Qcm9wZXJ0eSIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiJHRhcmdldCIsImlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24iLCJpc1BhdGhVcGRhdGFibGUiLCJwcm9wZXJ0eVBhdGgiLCJwYXRoVmlzaXRvciIsInBhdGgiLCJuYXZpZ2F0aW9uUGF0aHMiLCJzaW5nbGV0b25QYXRoVmlzaXRvciIsImNvbnZlcnRlZFR5cGVzIiwiZWRpdGFibGVFeHByZXNzaW9uIiwib3IiLCJhbmQiLCJub3QiLCJpc0NvbXB1dGVkIiwiaXNLZXkiLCJpc0ltbXV0YWJsZSIsIklzVHJhbnNpZW50QmluZGluZyIsInVucmVzb2x2YWJsZUV4cHJlc3Npb24iLCJnZXRDb2xsYWJvcmF0aW9uRXhwcmVzc2lvbiIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJmb3JtYXR0ZXIiLCJvYmplY3RQYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsImFjdGl2aXR5RXhwcmVzc2lvbiIsInBhdGhJbk1vZGVsIiwia2V5cyIsImNvbnRleHRMb2NhdGlvbiIsInRhcmdldEVudGl0eVR5cGUiLCJrZXlzRXhwcmVzc2lvbnMiLCJmb3JFYWNoIiwia2V5Iiwia2V5RXhwcmVzc2lvbiIsIm5hbWUiLCJwdXNoIiwiZm9ybWF0UmVzdWx0IiwiZ2V0RW5hYmxlZEV4cHJlc3Npb25Bc09iamVjdCIsImdldEVuYWJsZWRFeHByZXNzaW9uIiwiZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb24iLCJpc0Rpc2FibGVkRXhwcmVzc2lvbiIsImVuYWJsZWRFeHByZXNzaW9uIiwiZ2V0RWRpdE1vZGUiLCJtZWFzdXJlUmVhZE9ubHkiLCJhc09iamVjdCIsImRhdGFGaWVsZENvbnZlcnRlZCIsIiRUeXBlIiwicHJvcGVydHkiLCJhc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5IiwidW5pdFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSIsInJlc3VsdEV4cHJlc3Npb24iLCJpc1VuaXRSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwiaXNDb25zdGFudCIsImFubm90YXRpb25zIiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJyZWFkT25seUV4cHJlc3Npb24iLCJlZGl0TW9kZUV4cHJlc3Npb24iLCJoYXNWYWxpZEFuYWx5dGljYWxDdXJyZW5jeU9yVW5pdCIsIm9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJvUHJvcGVydHlEZWZpbml0aW9uIiwiY3VycmVuY3kiLCJtZWFzdXJlIiwiaXNUcnV0aHkiLCJnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24iLCJJc1RvdGFsIiwiZ2V0RmllbGREaXNwbGF5Iiwic1RhcmdldERpc3BsYXlNb2RlIiwib0NvbXB1dGVkRWRpdE1vZGUiLCJoYXNUZXh0QW5ub3RhdGlvbiIsIkNvbW1vbiIsIlRleHQiLCJoYXNWYWx1ZUhlbHAiLCJlcXVhbCIsImdldFR5cGVDb25maWciLCJkYXRhVHlwZSIsIm9UYXJnZXRNYXBwaW5nIiwiRURNX1RZUEVfTUFQUElORyIsInR5cGUiLCJwcm9wZXJ0eVR5cGVDb25maWciLCJjb25zdHJhaW50cyIsImZvcm1hdE9wdGlvbnMiLCJzY2FsZSIsIiRTY2FsZSIsInByZWNpc2lvbiIsIiRQcmVjaXNpb24iLCJtYXhMZW5ndGgiLCIkTWF4TGVuZ3RoIiwibnVsbGFibGUiLCIkTnVsbGFibGUiLCJtaW5pbXVtIiwiaXNOYU4iLCJWYWxpZGF0aW9uIiwiTWluaW11bSIsIm1heGltdW0iLCJNYXhpbXVtIiwiaXNEaWdpdFNlcXVlbmNlIiwiSXNEaWdpdFNlcXVlbmNlIiwiVjQiLCIkVjQiLCJwYXJzZUFzU3RyaW5nIiwiaW5kZXhPZiIsImVtcHR5U3RyaW5nIiwicGFyc2VLZWVwc0VtcHR5U3RyaW5nIiwiZ2V0Q29uc3RyYWludE9wdGlvbnMiLCJEb05vdENoZWNrU2NhbGVPZk1lYXN1cmVkUXVhbnRpdHkiLCJ2YWx1ZU9mIiwic2tpcERlY2ltYWxzVmFsaWRhdGlvbiIsImdldEJpbmRpbmdXaXRoVW5pdE9yQ3VycmVuY3kiLCJvUHJvcGVydHlEYXRhTW9kZWxQYXRoIiwicHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiIsImlnbm9yZVVuaXRDb25zdHJhaW50IiwidW5pdCIsInJlbGF0aXZlTG9jYXRpb24iLCJmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uIiwiaGFzU3RhdGljUGVyY2VudFVuaXQiLCJzaG93TWVhc3VyZSIsInZhbHVlRm9ybWF0dGVycyIsImZvcm1hdFdpdGhQZXJjZW50YWdlIiwiY29tcGxleFR5cGUiLCJ1bml0QmluZGluZ0V4cHJlc3Npb24iLCJjb25zdHJhaW50T3B0aW9ucyIsImFkZFR5cGVJbmZvcm1hdGlvbiIsImdldEJpbmRpbmdGb3JEYXRlUGlja2VyIiwibWluRGF0ZSIsIiREYXRlIiwibWF4RGF0ZSIsIm1pbkV4cHJlc3Npb24iLCJtYXhFeHByZXNzaW9uIiwiZ2V0QmluZGluZ0ZvclVuaXRPckN1cnJlbmN5IiwiZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCIsInNob3dOdW1iZXIiLCJnZXRCaW5kaW5nV2l0aFRpbWV6b25lIiwiaGlkZVRpbWV6b25lRm9yRW1wdHlWYWx1ZXMiLCJmaWVsZEZvcm1hdE9wdGlvbnMiLCJ0aW1lem9uZSIsIlRpbWV6b25lIiwic3R5bGUiLCJEYXRlVGltZVN0eWxlIiwic2hvd1RpbWV6b25lRm9yRW1wdHlWYWx1ZXMiLCJkYXRlVGltZVN0eWxlIiwiZGF0ZVRpbWVQYXR0ZXJuIiwicGF0dGVybiIsInNob3dUaW1lIiwic2hvd0RhdGUiLCJzaG93VGltZXpvbmUiLCJnZXRCaW5kaW5nRm9yRGF0ZUZvcm1hdCIsInByb3BlcnR5RGF0YU1vZGVsUGF0aCIsImZvcm1hdE9wdGlvbnNEYXRlRm9ybWF0IiwidG9TdHJpbmciLCJnZXRCaW5kaW5nRm9yVGltZXpvbmUiLCJwcm9wZXJ0eURlZmluaXRpb24iLCJnZXRBbGlnbm1lbnRFeHByZXNzaW9uIiwic0FsaWduRGlzcGxheSIsInNBbGlnbkVkaXQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Iiwib0NvbnRleHQiLCJvSW50ZXJmYWNlIiwiY29udGV4dCIsImNvbnZlcnRNZXRhTW9kZWxDb250ZXh0IiwicmVxdWlyZXNJQ29udGV4dCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJpc011bHRpVmFsdWVGaWVsZCIsIm9EYXRhTW9kZWxQYXRoIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJoYXNPbmVUb01hbnlOYXZpZ2F0aW9uIiwiZmluZEluZGV4Iiwib05hdiIsImlzTXVsdGlwbGVOYXZpZ2F0aW9uUHJvcGVydHkiLCJvQ29udGV4dE5hdiIsImdldFJlcXVpcmVkRXhwcmVzc2lvbkFzT2JqZWN0IiwiZm9yY2VFZGl0TW9kZSIsImdldFJlcXVpcmVkRXhwcmVzc2lvbiIsIm9SZXF1aXJlZFByb3BlcnRpZXMiLCJhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyIsInJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMiLCJhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbVVwZGF0ZVJlc3RyaWN0aW9ucyIsInJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMiLCJkYXRhRmllbGRSZXF1aXJlZEV4cHJlc3Npb24iLCJpc1JlcXVpcmVkRXhwcmVzc2lvbiIsInJlcXVpcmVkUHJvcGVydHlGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zRXhwcmVzc2lvbiIsInJlcXVpcmVkUHJvcGVydHlGcm9tVXBkYXRlUmVzdHJpY3Rpb25zRXhwcmVzc2lvbiIsInJlcXVpcmVkRXhwcmVzc2lvbiIsImVkaXRNb2RlIiwiaW5jbHVkZXMiLCJJc0NyZWF0ZU1vZGUiLCJyZXR1cm5FeHByZXNzaW9uIiwiZ2V0UmVxdWlyZWRFeHByZXNzaW9uRm9yQ29ubmVjdGVkRGF0YUZpZWxkIiwiZGF0YUZpZWxkT2JqZWN0UGF0aCIsImRhdGEiLCJEYXRhIiwiT2JqZWN0IiwiZGF0YUZpZWxkcyIsImlzUmVxdWlyZWRFeHByZXNzaW9ucyIsImRhdGFGaWVsZCIsIlZhbHVlIiwiVGFyZ2V0IiwiaXNBbm5vdGF0aW9uT2ZUeXBlIiwiaXNWaXNpYmxlIiwiSGlkZGVuIiwiaXNNdWx0aUxpbmUiLCJpc011bHRpTGluZVRleHQiLCJnZXRBY3Rpb25FbmFibGVkRXhwcmVzc2lvbiIsImFjdGlvblRhcmdldCIsInBhdGhGcm9tQ29udGV4dExvY2F0aW9uIiwib3BlcmF0aW9uQXZhaWxhYmxlSXNBbm5vdGF0ZWQiLCJDb3JlIiwiT3BlcmF0aW9uQXZhaWxhYmxlIiwidGVybSIsInByZWZpeCIsInNvdXJjZUVudGl0eVR5cGUiLCJuYXZpZ2F0aW9ucyIsInNvdXJjZUFjdGlvbkRhdGFNb2RlbE9iamVjdCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwibmF2Iiwiam9pbiIsImJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSIsImlzQm91bmQiLCJwYXJhbWV0ZXJzIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwib3BlcmF0aW9uQXZhaWxhYmxlRXhwcmVzc2lvbiIsImJpbmRpbmdDb250ZXh0UGF0aFZpc2l0b3IiLCJpc1F1aWNrVmlld0ZhY2V0VmlzaWJsZSIsImZhY2V0TW9kZWxQYXRoIiwidGFyZ2V0VmlzaWJsZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVUlGb3JtYXR0ZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uLCBBY3Rpb25QYXJhbWV0ZXIsIENvbnZlcnRlZE1ldGFkYXRhLCBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFubm90YXRpb25QYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL0VkbVwiO1xuaW1wb3J0IHsgQ29yZUFubm90YXRpb25UZXJtcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29yZVwiO1xuaW1wb3J0IHR5cGUgeyBVbml0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9NZWFzdXJlc1wiO1xuaW1wb3J0IHR5cGUge1xuXHRDb2xsZWN0aW9uRmFjZXQsXG5cdENvbm5lY3RlZEZpZWxkc1R5cGUsXG5cdERhdGFGaWVsZCxcblx0RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0RGF0YUZpZWxkRm9yQWN0aW9uVHlwZXMsXG5cdERhdGFGaWVsZFR5cGVzLFxuXHREYXRhUG9pbnRUeXBlLFxuXHREYXRhUG9pbnRUeXBlVHlwZXMsXG5cdEZpZWxkR3JvdXAsXG5cdFJlZmVyZW5jZUZhY2V0XG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHR5cGUge1xuXHRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRDb21wbGV4VHlwZUNvbnN0cmFpbnRPcHRpb25zLFxuXHRGblxufSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7XG5cdEVETV9UWVBFX01BUFBJTkcsXG5cdGFkZFR5cGVJbmZvcm1hdGlvbixcblx0YW5kLFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0Y29uc3RhbnQsXG5cdGVxdWFsLFxuXHRmb3JtYXRSZXN1bHQsXG5cdGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24sXG5cdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbixcblx0aWZFbHNlLFxuXHRpc0NvbnN0YW50LFxuXHRpc1RydXRoeSxcblx0bm90LFxuXHRvcixcblx0cGF0aEluTW9kZWwsXG5cdHVucmVzb2x2YWJsZUV4cHJlc3Npb25cbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dCwgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IFBhZ2VDb250ZXh0UGF0aFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgdmFsdWVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1ZhbHVlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBVSSwgYmluZGluZ0NvbnRleHRQYXRoVmlzaXRvciwgc2luZ2xldG9uUGF0aFZpc2l0b3IgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgeyBpc0Fubm90YXRpb25PZlR5cGUsIGlzTXVsdGlwbGVOYXZpZ2F0aW9uUHJvcGVydHksIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uLCBpc1Byb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHtcblx0ZW5oYW5jZURhdGFNb2RlbFBhdGgsXG5cdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgsXG5cdGdldFJlbGF0aXZlUGF0aHMsXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdGlzUGF0aFVwZGF0YWJsZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgKiBhcyBEaXNwbGF5TW9kZUZvcm1hdHRlciBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHtcblx0aXNEaXNhYmxlZEV4cHJlc3Npb24sXG5cdGlzTm9uRWRpdGFibGVFeHByZXNzaW9uLFxuXHRpc1JlYWRPbmx5RXhwcmVzc2lvbixcblx0aXNSZXF1aXJlZEV4cHJlc3Npb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQge1xuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0aGFzU3RhdGljUGVyY2VudFVuaXQsXG5cdGhhc1ZhbHVlSGVscCxcblx0aXNDb21wdXRlZCxcblx0aXNJbW11dGFibGUsXG5cdGlzS2V5LFxuXHRpc011bHRpTGluZVRleHRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCB0eXBlIEZpZWxkRm9ybWF0T3B0aW9ucyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZEZvcm1hdE9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YVBvaW50Rm9ybWF0T3B0aW9ucyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL2hlbHBlcnMvRGF0YVBvaW50VGVtcGxhdGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcblxuLy8gSW1wb3J0LWV4cG9ydCBtZXRob2QgdXNlZCBieSB0aGUgY29udmVydGVyIHRvIHVzZSB0aGVtIGluIHRoZSB0ZW1wbGF0aW5nIHRocm91Z2ggdGhlIFVJRm9ybWF0dGVycy5cbmV4cG9ydCB0eXBlIERpc3BsYXlNb2RlID0gRGlzcGxheU1vZGVGb3JtYXR0ZXIuRGlzcGxheU1vZGU7XG5cbmV4cG9ydCB0eXBlIEZpZWxkRWRpdFN0eWxlID0gXCJSYWRpb0J1dHRvbnNcIjtcblxuZXhwb3J0IHR5cGUgUHJvcGVydHlPclBhdGg8UD4gPSBzdHJpbmcgfCBQIHwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPFA+O1xuZXhwb3J0IHR5cGUgTWV0YU1vZGVsQ29udGV4dCA9IHtcblx0JGtpbmQ6IHN0cmluZztcblx0JFR5cGU6IHN0cmluZztcblx0JE51bGxhYmxlPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyB0aGUgc3RydWN0dXJlIHJldHVybmVkIGJ5IHRoZSBPRGF0YU1ldGFNb2RlbCB3aGVuIHVzaW5nIHRoZSBAQCBvcGVyYXRvciBpbiBYTUwgdGVtcGxhdGVzLlxuICovXG5leHBvcnQgdHlwZSBDb21wdXRlZEFubm90YXRpb25JbnRlcmZhY2UgPSB7XG5cdGNvbnRleHQ6IENvbnRleHQ7XG5cdGFyZ3VtZW50cz86IHVua25vd25bXTtcblx0JCR2YWx1ZUFzUHJvbWlzZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlQ29uc3RyYWludHMgPSB7XG5cdHNjYWxlPzogbnVtYmVyO1xuXHRwcmVjaXNpb24/OiBudW1iZXI7XG5cdG1heExlbmd0aD86IG51bWJlcjtcblx0bnVsbGFibGU/OiBib29sZWFuO1xuXHRtaW5pbXVtPzogc3RyaW5nO1xuXHRtYXhpbXVtPzogc3RyaW5nO1xuXHRpc0RpZ2l0U2VxdWVuY2U/OiBib29sZWFuO1xuXHRWND86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlZm9ybWF0T3B0aW9ucyA9IHtcblx0cGFyc2VBc1N0cmluZz86IGJvb2xlYW47XG5cdGVtcHR5U3RyaW5nPzogc3RyaW5nO1xuXHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQ29uZmlnVHlwZSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRjb25zdHJhaW50czogY29uZmlnVHlwZUNvbnN0cmFpbnRzO1xuXHRmb3JtYXRPcHRpb25zOiBjb25maWdUeXBlZm9ybWF0T3B0aW9ucztcbn07XG5cbmV4cG9ydCB0eXBlIERhdGVUaW1lU3R5bGUgPSBcInNob3J0XCIgfCBcIm1lZGl1bVwiIHwgXCJsb25nXCIgfCBcImZ1bGxcIjtcblxuZXhwb3J0IHR5cGUgRm9ybWF0T3B0aW9uc0RhdGVGb3JtYXQgPSBGaWVsZEZvcm1hdE9wdGlvbnMgfCBEYXRhUG9pbnRGb3JtYXRPcHRpb25zO1xuXG5leHBvcnQgY29uc3QgRmllbGRFZGl0TW9kZSA9IHtcblx0LyoqXG5cdCAqIHtAbGluayBzYXAudWkubWRjLkZpZWxkIEZpZWxkfSwge0BsaW5rIHNhcC51aS5tZGMuRmlsdGVyRmllbGQgRmlsdGVyRmllbGR9IG9yIHtAbGluayBzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZCBNdWx0aVZhbHVlRmllbGQgfVxuXHQgKiBpcyByZW5kZXJlZCBpbiBkaXNhYmxlZCBtb2RlXG5cdCAqL1xuXHREaXNhYmxlZDogXCJEaXNhYmxlZFwiLFxuXHQvKipcblx0ICoge0BsaW5rIHNhcC51aS5tZGMuRmllbGQgRmllbGR9LCB7QGxpbmsgc2FwLnVpLm1kYy5GaWx0ZXJGaWVsZCBGaWx0ZXJGaWVsZH0gb3Ige0BsaW5rIHNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkIE11bHRpVmFsdWVGaWVsZCB9XG5cdCAqIGlzIHJlbmRlcmVkIGluIGRpc3BsYXkgbW9kZVxuXHQgKi9cblx0RGlzcGxheTogXCJEaXNwbGF5XCIsXG5cdC8qKlxuXHQgKiB7QGxpbmsgc2FwLnVpLm1kYy5GaWVsZCBGaWVsZH0sIHtAbGluayBzYXAudWkubWRjLkZpbHRlckZpZWxkIEZpbHRlckZpZWxkfSBvciB7QGxpbmsgc2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGQgTXVsdGlWYWx1ZUZpZWxkIH1cblx0ICogaXMgcmVuZGVyZWQgaW4gZWRpdGFibGUgbW9kZVxuXHQgKi9cblx0RWRpdGFibGU6IFwiRWRpdGFibGVcIixcblx0LyoqXG5cdCAqIElmIG1vcmUgdGhhbiBvbmUgY29udHJvbCBpcyByZW5kZXJlZCBieSB0aGUge0BsaW5rIHNhcC51aS5tZGMuRmllbGQgRmllbGR9LCB7QGxpbmsgc2FwLnVpLm1kYy5GaWx0ZXJGaWVsZCBGaWx0ZXJGaWVsZCB9XG5cdCAqIG9yIHtAbGluayBzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZCBNdWx0aVZhbHVlRmllbGR9IGNvbnRyb2wsIHRoZSBmaXJzdCBwYXJ0IGlzIGVkaXRhYmxlLCBhbmQgdGhlIG90aGVyXG5cdCAqIHBhcnRzIGFyZSBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqL1xuXHRFZGl0YWJsZURpc3BsYXk6IFwiRWRpdGFibGVEaXNwbGF5XCIsXG5cdC8qKlxuXHQgKiBJZiBtb3JlIHRoYW4gb25lIGNvbnRyb2wgaXMgcmVuZGVyZWQgYnkgdGhlIHtAbGluayBzYXAudWkubWRjLkZpZWxkIEZpZWxkfSwge0BsaW5rIHNhcC51aS5tZGMuRmlsdGVyRmllbGQgRmlsdGVyRmllbGQgfVxuXHQgKiBvciB7QGxpbmsgc2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGQgTXVsdGlWYWx1ZUZpZWxkfSBjb250cm9sLCB0aGUgZmlyc3QgcGFydCBpcyBlZGl0YWJsZSwgYW5kIHRoZSBvdGhlclxuXHQgKiBwYXJ0cyBhcmUgcmVhZC1vbmx5LlxuXHQgKi9cblx0RWRpdGFibGVSZWFkT25seTogXCJFZGl0YWJsZVJlYWRPbmx5XCIsXG5cdC8qKlxuXHQgKiB7QGxpbmsgc2FwLnVpLm1kYy5GaWVsZCBGaWVsZH0sIHtAbGluayBzYXAudWkubWRjLkZpbHRlckZpZWxkIEZpbHRlckZpZWxkfSBvciB7QGxpbmsgc2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGQgTXVsdGlWYWx1ZUZpZWxkIH1cblx0ICogaXMgcmVuZGVyZWQgaW4gcmVhZC1vbmx5IG1vZGVcblx0ICovXG5cdFJlYWRPbmx5OiBcIlJlYWRPbmx5XCJcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREaXNwbGF5TW9kZSA9IGZ1bmN0aW9uIChcblx0b0RhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzPlxuKTogRGlzcGxheU1vZGUge1xuXHRyZXR1cm4gRGlzcGxheU1vZGVGb3JtYXR0ZXIuZ2V0RGlzcGxheU1vZGUob0RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LCBvRGF0YU1vZGVsT2JqZWN0UGF0aCk7XG59O1xuZXhwb3J0IGNvbnN0IGdldEVkaXRhYmxlRXhwcmVzc2lvbkFzT2JqZWN0ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ6IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyB8IHVuZGVmaW5lZCxcblx0b0RhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj4sXG5cdGlzRWRpdGFibGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IFVJLklzRWRpdGFibGUsXG5cdGNvbnNpZGVyVXBkYXRlUmVzdHJpY3Rpb25zID0gdHJ1ZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGdldEVkaXRhYmxlRXhwcmVzc2lvbihcblx0XHRvUHJvcGVydHlQYXRoLFxuXHRcdG9EYXRhRmllbGRDb252ZXJ0ZWQsXG5cdFx0b0RhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0dHJ1ZSxcblx0XHRpc0VkaXRhYmxlLFxuXHRcdGNvbnNpZGVyVXBkYXRlUmVzdHJpY3Rpb25zXG5cdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gdG8gZ2VuZXJhdGUgYW4gXCJlZGl0YWJsZVwiIEJvb2xlYW4gdmFsdWUuXG4gKiBAcGFyYW0gb1Byb3BlcnR5UGF0aCBUaGUgaW5wdXQgcHJvcGVydHlcbiAqIEBwYXJhbSBvRGF0YUZpZWxkQ29udmVydGVkIFRoZSBEYXRhRmllbGRDb252ZXJ0ZWQgb2JqZWN0IHRvIHJlYWQgdGhlIGZpZWxkQ29udHJvbCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gb0RhdGFNb2RlbE9iamVjdFBhdGggVGhlIHBhdGggdG8gdGhpcyBwcm9wZXJ0eSBvYmplY3RcbiAqIEBwYXJhbSBiQXNPYmplY3QgV2hldGhlciBvciBub3QgdGhpcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IG9yIGEgYmluZGluZyBzdHJpbmdcbiAqIEBwYXJhbSBpc0VkaXRhYmxlIFdoZXRoZXIgb3Igbm90IFVJLklzRWRpdGFibGUgYmUgY29uc2lkZXJlZC5cbiAqIEBwYXJhbSBjb25zaWRlclVwZGF0ZVJlc3RyaWN0aW9ucyBXaGV0aGVyIHdlIHdhbnQgdG8gdGFrZSBpbnRvIGFjY291bnQgVXBkYXRlUmVzdHJpY3Rpb25zIHRvIGNvbXB1dGUgdGhlIGVkaXRhYmxlXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgcHJvcGVydHkgaXMgZWRpdGFibGUgb3Igbm90XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0YWJsZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFGaWVsZENvbnZlcnRlZDogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuXHRvRGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDx1bmtub3duPixcblx0YkFzT2JqZWN0ID0gZmFsc2UsXG5cdGlzRWRpdGFibGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IFVJLklzRWRpdGFibGUsXG5cdGNvbnNpZGVyVXBkYXRlUmVzdHJpY3Rpb25zID0gdHJ1ZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCByZWxhdGl2ZVBhdGggPSBnZXRSZWxhdGl2ZVBhdGhzKG9EYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0aWYgKCFvUHJvcGVydHlQYXRoIHx8IHR5cGVvZiBvUHJvcGVydHlQYXRoID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGZhbHNlKTtcblx0fVxuXHRsZXQgZGF0YUZpZWxkRWRpdGFibGVFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudCh0cnVlKTtcblx0aWYgKG9EYXRhRmllbGRDb252ZXJ0ZWQgIT09IHVuZGVmaW5lZCAmJiAhaXNQcm9wZXJ0eShvRGF0YUZpZWxkQ29udmVydGVkKSkge1xuXHRcdGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbiA9IGlmRWxzZShpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSwgZmFsc2UsIGlzRWRpdGFibGUpO1xuXHR9IGVsc2UgaWYgKG9EYXRhRmllbGRDb252ZXJ0ZWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbiA9IGlzRWRpdGFibGU7XG5cdH1cblxuXHRjb25zdCBvUHJvcGVydHkgPSBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSA/IG9Qcm9wZXJ0eVBhdGguJHRhcmdldCA6IG9Qcm9wZXJ0eVBhdGg7XG5cblx0Ly8gRWRpdGFiaWxpdHkgZGVwZW5kcyBvbiB0aGUgZmllbGQgY29udHJvbCBleHByZXNzaW9uXG5cdC8vIElmIHRoZSBGaWVsZCBjb250cm9sIGlzIHN0YXRpY2FsbHkgaW4gUmVhZE9ubHkgb3IgSW5hcHBsaWNhYmxlIChkaXNhYmxlZCkgLT4gbm90IGVkaXRhYmxlXG5cdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBhIGtleSAtPiBub3QgZWRpdGFibGUgZXhjZXB0IGluIGNyZWF0aW9uIGlmIG5vdCBjb21wdXRlZFxuXHQvLyBJZiB0aGUgcHJvcGVydHkgaXMgY29tcHV0ZWQgLT4gbm90IGVkaXRhYmxlXG5cdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgdXBkYXRhYmxlIC0+IG5vdCBlZGl0YWJsZVxuXHQvLyBJZiB0aGUgcHJvcGVydHkgaXMgaW1tdXRhYmxlIC0+IG5vdCBlZGl0YWJsZSBleGNlcHQgaW4gY3JlYXRpb25cblx0Ly8gSWYgdGhlIEZpZWxkIGNvbnRyb2wgaXMgYSBwYXRoIHJlc29sdmluZyB0byBSZWFkT25seSBvciBJbmFwcGxpY2FibGUgKGRpc2FibGVkKSAoPD0gMSkgLT4gbm90IGVkaXRhYmxlXG5cdC8vIEVsc2UsIHRvIGJlIGVkaXRhYmxlIHlvdSBuZWVkXG5cdC8vIGltbXV0YWJsZSBhbmQga2V5IHdoaWxlIGluIHRoZSBjcmVhdGlvbiByb3dcblx0Ly8gdWkvaXNFZGl0YWJsZVxuXHRjb25zdCBpc1BhdGhVcGRhdGFibGVFeHByZXNzaW9uID0gaXNQYXRoVXBkYXRhYmxlKG9EYXRhTW9kZWxPYmplY3RQYXRoLCB7XG5cdFx0cHJvcGVydHlQYXRoOiBvUHJvcGVydHlQYXRoLFxuXHRcdHBhdGhWaXNpdG9yOiAocGF0aDogc3RyaW5nLCBuYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdKSA9PlxuXHRcdFx0c2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgb0RhdGFNb2RlbE9iamVjdFBhdGguY29udmVydGVkVHlwZXMsIG5hdmlnYXRpb25QYXRocylcblx0fSk7XG5cdGlmIChjb21waWxlRXhwcmVzc2lvbihpc1BhdGhVcGRhdGFibGVFeHByZXNzaW9uKSA9PT0gXCJmYWxzZVwiICYmIGNvbnNpZGVyVXBkYXRlUmVzdHJpY3Rpb25zKSB7XG5cdFx0cmV0dXJuIGJBc09iamVjdCA/IGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24gOiBcImZhbHNlXCI7XG5cdH1cblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID1cblx0XHRvUHJvcGVydHkgIT09IHVuZGVmaW5lZFxuXHRcdFx0PyBpZkVsc2UoXG5cdFx0XHRcdFx0b3IoXG5cdFx0XHRcdFx0XHRhbmQobm90KGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24pLCBjb25zaWRlclVwZGF0ZVJlc3RyaWN0aW9ucyksXG5cdFx0XHRcdFx0XHRpc0NvbXB1dGVkKG9Qcm9wZXJ0eSksXG5cdFx0XHRcdFx0XHRpc0tleShvUHJvcGVydHkpLFxuXHRcdFx0XHRcdFx0aXNJbW11dGFibGUob1Byb3BlcnR5KSxcblx0XHRcdFx0XHRcdGlzTm9uRWRpdGFibGVFeHByZXNzaW9uKG9Qcm9wZXJ0eSwgcmVsYXRpdmVQYXRoKVxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0aWZFbHNlKG9yKGlzQ29tcHV0ZWQob1Byb3BlcnR5KSwgaXNOb25FZGl0YWJsZUV4cHJlc3Npb24ob1Byb3BlcnR5LCByZWxhdGl2ZVBhdGgpKSwgZmFsc2UsIFVJLklzVHJhbnNpZW50QmluZGluZyksXG5cdFx0XHRcdFx0aXNFZGl0YWJsZVxuXHRcdFx0ICApXG5cdFx0XHQ6IHVucmVzb2x2YWJsZUV4cHJlc3Npb247XG5cdGlmIChiQXNPYmplY3QpIHtcblx0XHRyZXR1cm4gYW5kKGVkaXRhYmxlRXhwcmVzc2lvbiwgZGF0YUZpZWxkRWRpdGFibGVFeHByZXNzaW9uKTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oYW5kKGVkaXRhYmxlRXhwcmVzc2lvbiwgZGF0YUZpZWxkRWRpdGFibGVFeHByZXNzaW9uKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29sbGFib3JhdGlvbkV4cHJlc3Npb24gPSBmdW5jdGlvbiA8VD4oXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHRmb3JtYXR0ZXI6IEZuPFQ+XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD4ge1xuXHRjb25zdCBvYmplY3RQYXRoID0gZ2V0VGFyZ2V0T2JqZWN0UGF0aChkYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0Y29uc3QgYWN0aXZpdHlFeHByZXNzaW9uID0gcGF0aEluTW9kZWwoYC9jb2xsYWJvcmF0aW9uL2FjdGl2aXRpZXMke29iamVjdFBhdGh9YCwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3Qga2V5cyA9IGRhdGFNb2RlbE9iamVjdFBhdGg/LmNvbnRleHRMb2NhdGlvbj8udGFyZ2V0RW50aXR5VHlwZT8ua2V5cztcblx0Y29uc3Qga2V5c0V4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248dW5rbm93bj5bXSA9IFtdO1xuXHRrZXlzPy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcblx0XHRjb25zdCBrZXlFeHByZXNzaW9uID0gcGF0aEluTW9kZWwoa2V5Lm5hbWUpO1xuXHRcdGtleXNFeHByZXNzaW9ucy5wdXNoKGtleUV4cHJlc3Npb24pO1xuXHR9KTtcblx0cmV0dXJuIGZvcm1hdFJlc3VsdChbYWN0aXZpdHlFeHByZXNzaW9uLCAuLi5rZXlzRXhwcmVzc2lvbnNdLCBmb3JtYXR0ZXIpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRFbmFibGVkRXhwcmVzc2lvbkFzT2JqZWN0ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMsXG5cdG9EYXRhTW9kZWxPYmplY3RQYXRoPzogRGF0YU1vZGVsT2JqZWN0UGF0aDx1bmtub3duPlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGdldEVuYWJsZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgsIG9EYXRhRmllbGRDb252ZXJ0ZWQsIHRydWUsIG9EYXRhTW9kZWxPYmplY3RQYXRoKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG59O1xuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gdG8gZ2VuZXJhdGUgYW4gXCJlbmFibGVkXCIgQm9vbGVhbiB2YWx1ZS5cbiAqIEBwYXJhbSBvUHJvcGVydHlQYXRoIFRoZSBpbnB1dCBwcm9wZXJ0eVxuICogQHBhcmFtIG9EYXRhRmllbGRDb252ZXJ0ZWQgVGhlIERhdGFGaWVsZENvbnZlcnRlZCBPYmplY3QgdG8gcmVhZCB0aGUgZmllbGRDb250cm9sIGFubm90YXRpb25cbiAqIEBwYXJhbSBiQXNPYmplY3QgV2hldGhlciBvciBub3QgdGhpcyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IG9yIGEgYmluZGluZyBzdHJpbmdcbiAqIEBwYXJhbSBvRGF0YU1vZGVsT2JqZWN0UGF0aFxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0byBkZXRlcm1pbmUgaWYgYSBwcm9wZXJ0eSBpcyBlbmFibGVkIG9yIG5vdFxuICovXG5leHBvcnQgY29uc3QgZ2V0RW5hYmxlZEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFGaWVsZENvbnZlcnRlZD86IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyxcblx0YkFzT2JqZWN0ID0gZmFsc2UsXG5cdG9EYXRhTW9kZWxPYmplY3RQYXRoPzogRGF0YU1vZGVsT2JqZWN0UGF0aDx1bmtub3duPlxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRpZiAoIW9Qcm9wZXJ0eVBhdGggfHwgdHlwZW9mIG9Qcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24odHJ1ZSk7XG5cdH1cblx0bGV0IHJlbGF0aXZlUGF0aDtcblx0aWYgKG9EYXRhTW9kZWxPYmplY3RQYXRoKSB7XG5cdFx0cmVsYXRpdmVQYXRoID0gZ2V0UmVsYXRpdmVQYXRocyhvRGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdH1cblx0bGV0IGRhdGFGaWVsZEVuYWJsZWRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudCh0cnVlKTtcblx0aWYgKG9EYXRhRmllbGRDb252ZXJ0ZWQgIT09IHVuZGVmaW5lZCAmJiAhaXNQcm9wZXJ0eShvRGF0YUZpZWxkQ29udmVydGVkKSkge1xuXHRcdGRhdGFGaWVsZEVuYWJsZWRFeHByZXNzaW9uID0gaWZFbHNlKGlzRGlzYWJsZWRFeHByZXNzaW9uKG9EYXRhRmllbGRDb252ZXJ0ZWQpLCBmYWxzZSwgdHJ1ZSk7XG5cdH1cblxuXHRjb25zdCBvUHJvcGVydHkgPSBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSA/IG9Qcm9wZXJ0eVBhdGguJHRhcmdldCA6IG9Qcm9wZXJ0eVBhdGg7XG5cdC8vIEVuYWJsZW1lbnQgZGVwZW5kcyBvbiB0aGUgZmllbGQgY29udHJvbCBleHByZXNzaW9uXG5cdC8vIElmIHRoZSBGaWVsZCBjb250cm9sIGlzIHN0YXRpY2FsbHkgaW4gSW5hcHBsaWNhYmxlIChkaXNhYmxlZCkgLT4gbm90IGVuYWJsZWRcblx0Y29uc3QgZW5hYmxlZEV4cHJlc3Npb24gPVxuXHRcdG9Qcm9wZXJ0eSAhPT0gdW5kZWZpbmVkID8gaWZFbHNlKGlzRGlzYWJsZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eSwgcmVsYXRpdmVQYXRoKSwgZmFsc2UsIHRydWUpIDogdW5yZXNvbHZhYmxlRXhwcmVzc2lvbjtcblx0aWYgKGJBc09iamVjdCkge1xuXHRcdHJldHVybiBhbmQoZW5hYmxlZEV4cHJlc3Npb24sIGRhdGFGaWVsZEVuYWJsZWRFeHByZXNzaW9uKTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oYW5kKGVuYWJsZWRFeHByZXNzaW9uLCBkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbikpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cHJlc3Npb24gdG8gZ2VuZXJhdGUgYW4gXCJlZGl0TW9kZVwiIGVudW0gdmFsdWUuXG4gKiBAcGFyYW0gcHJvcGVydHlQYXRoIFRoZSBpbnB1dCBwcm9wZXJ0eVxuICogQHBhcmFtIGRhdGFNb2RlbE9iamVjdFBhdGggVGhlIGxpc3Qgb2YgZGF0YSBtb2RlbCBvYmplY3RzIHRoYXQgYXJlIGludm9sdmVkIHRvIHJlYWNoIHRoYXQgcHJvcGVydHlcbiAqIEBwYXJhbSBtZWFzdXJlUmVhZE9ubHkgV2hldGhlciB3ZSBzaG91bGQgc2V0IFVvTSAvIGN1cnJlbmN5IGZpZWxkIG1vZGUgdG8gcmVhZCBvbmx5XG4gKiBAcGFyYW0gYXNPYmplY3QgV2hldGhlciB3ZSBzaG91bGQgcmV0dXJuIHRoaXMgYXMgYW4gZXhwcmVzc2lvbiBvciBhcyBhIHN0cmluZ1xuICogQHBhcmFtIGRhdGFGaWVsZENvbnZlcnRlZCBUaGUgZGF0YUZpZWxkIG9iamVjdFxuICogQHBhcmFtIGlzRWRpdGFibGUgV2hldGhlciBvciBub3QgVUkuSXNFZGl0YWJsZSBiZSBjb25zaWRlcmVkLlxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcHJvcGVydHkgZWRpdCBtb2RlLCBjb21wbGlhbnQgd2l0aCB0aGUgTURDIEZpZWxkIGRlZmluaXRpb24gb2YgZWRpdE1vZGUuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0TW9kZSA9IGZ1bmN0aW9uIChcblx0cHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj4sXG5cdG1lYXN1cmVSZWFkT25seSA9IGZhbHNlLFxuXHRhc09iamVjdCA9IGZhbHNlLFxuXHRkYXRhRmllbGRDb252ZXJ0ZWQ6IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcblx0aXNFZGl0YWJsZTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gVUkuSXNFZGl0YWJsZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB7XG5cdGlmIChcblx0XHQhcHJvcGVydHlQYXRoIHx8XG5cdFx0dHlwZW9mIHByb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIiB8fFxuXHRcdCghaXNQcm9wZXJ0eShkYXRhRmllbGRDb252ZXJ0ZWQpICYmIGRhdGFGaWVsZENvbnZlcnRlZD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aClcblx0KSB7XG5cdFx0cmV0dXJuIEZpZWxkRWRpdE1vZGUuRGlzcGxheTtcblx0fVxuXHRjb25zdCBwcm9wZXJ0eSA9IGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHByb3BlcnR5UGF0aCkgPyBwcm9wZXJ0eVBhdGguJHRhcmdldCA6IHByb3BlcnR5UGF0aDtcblx0Y29uc3QgcmVsYXRpdmVQYXRoID0gZ2V0UmVsYXRpdmVQYXRocyhkYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0Y29uc3QgaXNQYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiA9IGlzUGF0aFVwZGF0YWJsZShkYXRhTW9kZWxPYmplY3RQYXRoLCB7XG5cdFx0cHJvcGVydHlQYXRoOiBwcm9wZXJ0eSxcblx0XHRwYXRoVmlzaXRvcjogKHBhdGg6IHN0cmluZywgbmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSkgPT5cblx0XHRcdHNpbmdsZXRvblBhdGhWaXNpdG9yKHBhdGgsIGRhdGFNb2RlbE9iamVjdFBhdGguY29udmVydGVkVHlwZXMsIG5hdmlnYXRpb25QYXRocylcblx0fSk7XG5cblx0Ly8gd2UgZ2V0IHRoZSBlZGl0YWJsZSBFeHByZXNzaW9uIHdpdGhvdXQgY29uc2lkZXJpbmcgdXBkYXRlIFJlc3RyaWN0aW9ucyBiZWNhdXNlIHRoZXkgYXJlIGhhbmRsZWQgc2VwYXJhdGVseVxuXHRjb25zdCBlZGl0YWJsZUV4cHJlc3Npb24gPSBnZXRFZGl0YWJsZUV4cHJlc3Npb25Bc09iamVjdChwcm9wZXJ0eVBhdGgsIGRhdGFGaWVsZENvbnZlcnRlZCwgZGF0YU1vZGVsT2JqZWN0UGF0aCwgaXNFZGl0YWJsZSwgZmFsc2UpO1xuXG5cdGNvbnN0IGVuYWJsZWRFeHByZXNzaW9uID0gZ2V0RW5hYmxlZEV4cHJlc3Npb25Bc09iamVjdChwcm9wZXJ0eVBhdGgsIGRhdGFGaWVsZENvbnZlcnRlZCwgZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdGNvbnN0IGFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkocHJvcGVydHkpO1xuXHRjb25zdCB1bml0UHJvcGVydHkgPSBhc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KHByb3BlcnR5KTtcblx0bGV0IHJlc3VsdEV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+ID0gY29uc3RhbnQoRmllbGRFZGl0TW9kZS5FZGl0YWJsZSk7XG5cdGlmICh1bml0UHJvcGVydHkpIHtcblx0XHRjb25zdCBpc1VuaXRSZWFkT25seSA9IGlzUmVhZE9ubHlFeHByZXNzaW9uKHVuaXRQcm9wZXJ0eSwgcmVsYXRpdmVQYXRoKTtcblx0XHRyZXN1bHRFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdFx0b3IoaXNVbml0UmVhZE9ubHksIGlzQ29tcHV0ZWQodW5pdFByb3BlcnR5KSwgYW5kKGlzSW1tdXRhYmxlKHVuaXRQcm9wZXJ0eSksIG5vdChVSS5Jc1RyYW5zaWVudEJpbmRpbmcpKSwgbWVhc3VyZVJlYWRPbmx5KSxcblx0XHRcdGlmRWxzZSghaXNDb25zdGFudChpc1VuaXRSZWFkT25seSkgJiYgaXNVbml0UmVhZE9ubHksIEZpZWxkRWRpdE1vZGUuRWRpdGFibGVSZWFkT25seSwgRmllbGRFZGl0TW9kZS5FZGl0YWJsZURpc3BsYXkpLFxuXHRcdFx0RmllbGRFZGl0TW9kZS5FZGl0YWJsZVxuXHRcdCk7XG5cdH1cblx0aWYgKCF1bml0UHJvcGVydHkgJiYgKHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IHx8IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQpKSB7XG5cdFx0Ly8gbm8gdW5pdCBwcm9wZXJ0eSBhc3NvY2lhdGVkIG1lYW5zIHRoaXMgaXMgYSBzdGF0aWMgdW5pdFxuXHRcdHJlc3VsdEV4cHJlc3Npb24gPSBjb25zdGFudChGaWVsZEVkaXRNb2RlLkVkaXRhYmxlRGlzcGxheSk7XG5cdH1cblx0bGV0IHJlYWRPbmx5RXhwcmVzc2lvbjtcblx0aWYgKGRhdGFGaWVsZENvbnZlcnRlZCAhPSB1bmRlZmluZWQgJiYgIWlzUHJvcGVydHkoZGF0YUZpZWxkQ29udmVydGVkKSkge1xuXHRcdHJlYWRPbmx5RXhwcmVzc2lvbiA9IG9yKGlzUmVhZE9ubHlFeHByZXNzaW9uKHByb3BlcnR5LCByZWxhdGl2ZVBhdGgpLCBpc1JlYWRPbmx5RXhwcmVzc2lvbihkYXRhRmllbGRDb252ZXJ0ZWQpKTtcblx0fSBlbHNlIHtcblx0XHRyZWFkT25seUV4cHJlc3Npb24gPSBpc1JlYWRPbmx5RXhwcmVzc2lvbihwcm9wZXJ0eSwgcmVsYXRpdmVQYXRoKTtcblx0fVxuXG5cdC8vIGlmIHRoZXJlIGFyZSB1cGRhdGUgUmVzdHJpY3Rpb25zIGl0IGlzIGFsd2F5cyBkaXNwbGF5IG1vZGVcblx0Y29uc3QgZWRpdE1vZGVFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdG9yKGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24sIFVJLklzVHJhbnNpZW50QmluZGluZyksXG5cdFx0aWZFbHNlKFxuXHRcdFx0ZW5hYmxlZEV4cHJlc3Npb24sXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdGVkaXRhYmxlRXhwcmVzc2lvbixcblx0XHRcdFx0cmVzdWx0RXhwcmVzc2lvbixcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdGFuZCghaXNDb25zdGFudChyZWFkT25seUV4cHJlc3Npb24pICYmIHJlYWRPbmx5RXhwcmVzc2lvbiwgaXNFZGl0YWJsZSksXG5cdFx0XHRcdFx0RmllbGRFZGl0TW9kZS5SZWFkT25seSxcblx0XHRcdFx0XHRGaWVsZEVkaXRNb2RlLkRpc3BsYXlcblx0XHRcdFx0KVxuXHRcdFx0KSxcblx0XHRcdGlmRWxzZShpc0VkaXRhYmxlLCBGaWVsZEVkaXRNb2RlLkRpc2FibGVkLCBGaWVsZEVkaXRNb2RlLkRpc3BsYXkpXG5cdFx0KSxcblx0XHRGaWVsZEVkaXRNb2RlLkRpc3BsYXlcblx0KTtcblx0aWYgKGFzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIGVkaXRNb2RlRXhwcmVzc2lvbjtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oZWRpdE1vZGVFeHByZXNzaW9uKTtcbn07XG5cbmV4cG9ydCBjb25zdCBoYXNWYWxpZEFuYWx5dGljYWxDdXJyZW5jeU9yVW5pdCA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4gfCB1bmRlZmluZWRcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg/LnRhcmdldE9iamVjdDtcblx0Y29uc3QgY3VycmVuY3kgPSBvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5O1xuXHRjb25zdCBtZWFzdXJlID0gY3VycmVuY3kgPyBjdXJyZW5jeSA6IG9Qcm9wZXJ0eURlZmluaXRpb24/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uVW5pdDtcblx0aWYgKG1lYXN1cmUpIHtcblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24ob3IoaXNUcnV0aHkoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKG1lYXN1cmUpKSwgbm90KFVJLklzVG90YWwpKSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGNvbnN0YW50KHRydWUpKTtcblx0fVxufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIGZpZWxkRGlzcGxheS5cbiAqIEBwYXJhbSBvUHJvcGVydHlQYXRoXG4gKiBAcGFyYW0gc1RhcmdldERpc3BsYXlNb2RlXG4gKiBAcGFyYW0gb0NvbXB1dGVkRWRpdE1vZGVcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHByb3BlcnR5IGRpc3BsYXkgbW9kZSwgY29tcGxpYW50IHdpdGggdGhlIE1EQyBGaWVsZCBkZWZpbml0aW9uIG9mIGRpc3BsYXlNb2RlLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGREaXNwbGF5ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdHNUYXJnZXREaXNwbGF5TW9kZTogc3RyaW5nLFxuXHRvQ29tcHV0ZWRFZGl0TW9kZTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz5cbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3Qgb1Byb3BlcnR5ID0gKGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHRjb25zdCBoYXNUZXh0QW5ub3RhdGlvbiA9IG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0ICE9PSB1bmRlZmluZWQ7XG5cblx0aWYgKGhhc1ZhbHVlSGVscChvUHJvcGVydHkpKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHNUYXJnZXREaXNwbGF5TW9kZSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGhhc1RleHRBbm5vdGF0aW9uID8gY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKGVxdWFsKG9Db21wdXRlZEVkaXRNb2RlLCBcIkVkaXRhYmxlXCIpLCBcIlZhbHVlXCIsIHNUYXJnZXREaXNwbGF5TW9kZSkpIDogXCJWYWx1ZVwiO1xuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VHlwZUNvbmZpZyA9IGZ1bmN0aW9uIChvUHJvcGVydHk6IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcywgZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IENvbmZpZ1R5cGUge1xuXHRjb25zdCBvVGFyZ2V0TWFwcGluZyA9IEVETV9UWVBFX01BUFBJTkdbKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSk/LnR5cGVdIHx8IChkYXRhVHlwZSA/IEVETV9UWVBFX01BUFBJTkdbZGF0YVR5cGVdIDogdW5kZWZpbmVkKTtcblx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnOiBDb25maWdUeXBlID0ge1xuXHRcdHR5cGU6IG9UYXJnZXRNYXBwaW5nLnR5cGUsXG5cdFx0Y29uc3RyYWludHM6IHt9LFxuXHRcdGZvcm1hdE9wdGlvbnM6IHt9XG5cdH07XG5cdGlmIChpc1Byb3BlcnR5KG9Qcm9wZXJ0eSkpIHtcblx0XHRwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHMgPSB7XG5cdFx0XHRzY2FsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRTY2FsZSA/IG9Qcm9wZXJ0eS5zY2FsZSA6IHVuZGVmaW5lZCxcblx0XHRcdHByZWNpc2lvbjogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRQcmVjaXNpb24gPyBvUHJvcGVydHkucHJlY2lzaW9uIDogdW5kZWZpbmVkLFxuXHRcdFx0bWF4TGVuZ3RoOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJE1heExlbmd0aCA/IG9Qcm9wZXJ0eS5tYXhMZW5ndGggOiB1bmRlZmluZWQsXG5cdFx0XHRudWxsYWJsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiROdWxsYWJsZSA/IG9Qcm9wZXJ0eS5udWxsYWJsZSA6IHVuZGVmaW5lZCxcblx0XHRcdG1pbmltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluaW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdG1heGltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWF4aW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdGlzRGlnaXRTZXF1ZW5jZTpcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgJiZcblx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEaWdpdFNlcXVlbmNlXCJdICYmXG5cdFx0XHRcdG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5Jc0RpZ2l0U2VxdWVuY2Vcblx0XHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdFY0OiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJFY0ID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHRcdH07XG5cdH1cblx0cHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0cGFyc2VBc1N0cmluZzpcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCB8fFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwXG5cdFx0XHRcdD8gZmFsc2Vcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0ZW1wdHlTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IFwiXCJcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nOiBwcm9wZXJ0eVR5cGVDb25maWcudHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIiA/IHRydWUgOiB1bmRlZmluZWRcblx0fTtcblx0cmV0dXJuIHByb3BlcnR5VHlwZUNvbmZpZztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb25zdHJhaW50T3B0aW9ucyA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHkgfCB1bmRlZmluZWQpOiBDb21wbGV4VHlwZUNvbnN0cmFpbnRPcHRpb25zIHtcblx0cmV0dXJuIHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uVUk/LkRvTm90Q2hlY2tTY2FsZU9mTWVhc3VyZWRRdWFudGl0eSAmJlxuXHRcdHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uVUkuRG9Ob3RDaGVja1NjYWxlT2ZNZWFzdXJlZFF1YW50aXR5Py52YWx1ZU9mKClcblx0XHQ/IHsgc2tpcERlY2ltYWxzVmFsaWRhdGlvbjogdHJ1ZSB9XG5cdFx0OiB7fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nV2l0aFVuaXRPckN1cnJlbmN5ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4sXG5cdGlnbm9yZVVuaXRDb25zdHJhaW50PzogYm9vbGVhbixcblx0Zm9ybWF0T3B0aW9ucz86IHtcblx0XHRzaG93TWVhc3VyZT86IGJvb2xlYW47XG5cdFx0ZGVjaW1hbFBhZGRpbmc/OiBudW1iZXI7XG5cdH1cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXHRsZXQgdW5pdCA9IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRjb25zdCByZWxhdGl2ZUxvY2F0aW9uID0gZ2V0UmVsYXRpdmVQYXRocyhvUHJvcGVydHlEYXRhTW9kZWxQYXRoKTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbik7XG5cdGlmIChoYXNTdGF0aWNQZXJjZW50VW5pdChvUHJvcGVydHlEZWZpbml0aW9uKSkge1xuXHRcdGlmIChmb3JtYXRPcHRpb25zPy5zaG93TWVhc3VyZSA9PT0gZmFsc2UpIHtcblx0XHRcdHJldHVybiBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uO1xuXHRcdH1cblx0XHRyZXR1cm4gZm9ybWF0UmVzdWx0KFtwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uXSwgdmFsdWVGb3JtYXR0ZXJzLmZvcm1hdFdpdGhQZXJjZW50YWdlKTtcblx0fVxuXHRjb25zdCBjb21wbGV4VHlwZSA9IHVuaXQgPyBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlVuaXRcIiA6IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuQ3VycmVuY3lcIjtcblx0dW5pdCA9IHVuaXQgPyB1bml0IDogKG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSBhcyB1bmtub3duIGFzIFVuaXQgfCB1bmRlZmluZWQpO1xuXHRjb25zdCB1bml0QmluZGluZ0V4cHJlc3Npb24gPVxuXHRcdGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHVuaXQpICYmIHVuaXQuJHRhcmdldFxuXHRcdFx0PyBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKHVuaXQuJHRhcmdldCwgZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHVuaXQsIHJlbGF0aXZlTG9jYXRpb24pLCBpZ25vcmVVbml0Q29uc3RyYWludClcblx0XHRcdDogZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHVuaXQsIHJlbGF0aXZlTG9jYXRpb24pO1xuXHRjb25zdCBjb25zdHJhaW50T3B0aW9uczogQ29tcGxleFR5cGVDb25zdHJhaW50T3B0aW9ucyB8IHVuZGVmaW5lZCA9XG5cdFx0Y29tcGxleFR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiID8gZ2V0Q29uc3RyYWludE9wdGlvbnMob1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QpIDogdW5kZWZpbmVkO1xuXHRyZXR1cm4gYWRkVHlwZUluZm9ybWF0aW9uKFtwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLCB1bml0QmluZGluZ0V4cHJlc3Npb25dLCBjb21wbGV4VHlwZSwgdW5kZWZpbmVkLCBmb3JtYXRPcHRpb25zLCBjb25zdHJhaW50T3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgZGF0ZSBwaWNrZXIgd2l0aCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlIHByZXNlbnQuXG4gKiBAcGFyYW0gb1Byb3BlcnR5RGF0YU1vZGVsUGF0aCBUaGUgbGlzdCBvZiBkYXRhIG1vZGVsIG9iamVjdHMgdGhhdCBhcmUgaW52b2x2ZWQgdG8gcmVhY2ggdGhhdCBwcm9wZXJ0eVxuICogQHBhcmFtIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gQmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgcHJvcGVydHlcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBkYXRlIHByb3BlcnR5IHdpdGggbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSBmb3IgdGhlIHNhbWVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdGb3JEYXRlUGlja2VyID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5IHwgRGF0YUZpZWxkVHlwZXM+LFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4gfCBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eURlZmluaXRpb24gPSBvUHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFJlbGF0aXZlUGF0aHMob1Byb3BlcnR5RGF0YU1vZGVsUGF0aCk7XG5cdGNvbnN0IGZvcm1hdE9wdGlvbnMgPSB7fTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbik7XG5cdGNvbnN0IGNvbXBsZXhUeXBlID0gXCJzYXAuZmUuY29yZS50eXBlLkRhdGVcIjtcblx0Y29uc3QgbWluRGF0ZSA9IG9Qcm9wZXJ0eURlZmluaXRpb24/LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtPy4kRGF0ZVxuXHRcdD8gb1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW0/LiREYXRlXG5cdFx0OiBvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bTtcblx0Y29uc3QgbWF4RGF0ZSA9IG9Qcm9wZXJ0eURlZmluaXRpb24/LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtPy4kRGF0ZVxuXHRcdD8gb1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW0/LiREYXRlXG5cdFx0OiBvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bTtcblx0Y29uc3QgbWluRXhwcmVzc2lvbiA9XG5cdFx0bWluRGF0ZSAmJiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihtaW5EYXRlKVxuXHRcdFx0PyBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eURlZmluaXRpb24/LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtLFxuXHRcdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bSwgcmVsYXRpdmVMb2NhdGlvbilcblx0XHRcdCAgKVxuXHRcdFx0OiBtaW5EYXRlO1xuXHRjb25zdCBtYXhFeHByZXNzaW9uID1cblx0XHRtYXhEYXRlICYmIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKG1heERhdGUpXG5cdFx0XHQ/IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0b1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW0sXG5cdFx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKG9Qcm9wZXJ0eURlZmluaXRpb24/LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtLCByZWxhdGl2ZUxvY2F0aW9uKVxuXHRcdFx0ICApXG5cdFx0XHQ6IG1heERhdGU7XG5cblx0cmV0dXJuIChcblx0XHQobWluRXhwcmVzc2lvbiB8fCBtYXhFeHByZXNzaW9uKSAmJlxuXHRcdGFkZFR5cGVJbmZvcm1hdGlvbihbcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiwgbWluRXhwcmVzc2lvbiwgbWF4RXhwcmVzc2lvbl0sIGNvbXBsZXhUeXBlLCB1bmRlZmluZWQsIGZvcm1hdE9wdGlvbnMpXG5cdCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmluZGluZ0ZvclVuaXRPckN1cnJlbmN5ID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5PiB8IHVuZGVmaW5lZFxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4gfCBzdHJpbmcge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsUGF0aD8udGFyZ2V0T2JqZWN0O1xuXHRpZiAoIW9Qcm9wZXJ0eURlZmluaXRpb24pIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdGxldCB1bml0ID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdGlmIChoYXNTdGF0aWNQZXJjZW50VW5pdChvUHJvcGVydHlEZWZpbml0aW9uKSkge1xuXHRcdHJldHVybiBjb25zdGFudChcIiVcIik7XG5cdH1cblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFJlbGF0aXZlUGF0aHMob1Byb3BlcnR5RGF0YU1vZGVsUGF0aCk7XG5cblx0Y29uc3QgY29tcGxleFR5cGUgPSB1bml0ID8gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Vbml0XCIgOiBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkN1cnJlbmN5XCI7XG5cdHVuaXQgPSB1bml0ID8gdW5pdCA6IChvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kgYXMgdW5rbm93biBhcyBVbml0IHwgdW5kZWZpbmVkKTtcblx0Y29uc3QgdW5pdEJpbmRpbmdFeHByZXNzaW9uID1cblx0XHRpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih1bml0KSAmJiB1bml0LiR0YXJnZXRcblx0XHRcdD8gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbih1bml0LiR0YXJnZXQsIGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih1bml0LCByZWxhdGl2ZUxvY2F0aW9uKSlcblx0XHRcdDogZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHVuaXQsIHJlbGF0aXZlTG9jYXRpb24pO1xuXG5cdGxldCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gcGF0aEluTW9kZWwoXG5cdFx0Z2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChvUHJvcGVydHlEYXRhTW9kZWxQYXRoKVxuXHQpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihvUHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLCB0cnVlKTtcblx0Y29uc3QgY29uc3RyYWludE9wdGlvbnM6IENvbXBsZXhUeXBlQ29uc3RyYWludE9wdGlvbnMgfCB1bmRlZmluZWQgPVxuXHRcdGNvbXBsZXhUeXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlVuaXRcIiA/IGdldENvbnN0cmFpbnRPcHRpb25zKG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0KSA6IHVuZGVmaW5lZDtcblx0cmV0dXJuIGFkZFR5cGVJbmZvcm1hdGlvbihcblx0XHRbcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiwgdW5pdEJpbmRpbmdFeHByZXNzaW9uXSxcblx0XHRjb21wbGV4VHlwZSxcblx0XHR1bmRlZmluZWQsXG5cdFx0e1xuXHRcdFx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nOiB0cnVlLFxuXHRcdFx0c2hvd051bWJlcjogZmFsc2Vcblx0XHR9LFxuXHRcdGNvbnN0cmFpbnRPcHRpb25zXG5cdCk7XG59O1xuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdXaXRoVGltZXpvbmUgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPixcblx0aWdub3JlVW5pdENvbnN0cmFpbnQgPSBmYWxzZSxcblx0aGlkZVRpbWV6b25lRm9yRW1wdHlWYWx1ZXMgPSBmYWxzZSxcblx0ZmllbGRGb3JtYXRPcHRpb25zPzogRmllbGRGb3JtYXRPcHRpb25zXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eURlZmluaXRpb24gPSBvUHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblx0Y29uc3QgdGltZXpvbmUgPSBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5Db21tb24/LlRpbWV6b25lO1xuXHRjb25zdCBzdHlsZSA9IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/LlVJPy5EYXRlVGltZVN0eWxlO1xuXHRjb25zdCByZWxhdGl2ZUxvY2F0aW9uID0gZ2V0UmVsYXRpdmVQYXRocyhvUHJvcGVydHlEYXRhTW9kZWxQYXRoKTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbik7XG5cblx0Y29uc3QgY29tcGxleFR5cGUgPSBcInNhcC5mZS5jb3JlLnR5cGUuRGF0ZVRpbWVXaXRoVGltZXpvbmVcIjtcblx0Y29uc3QgdW5pdEJpbmRpbmdFeHByZXNzaW9uID1cblx0XHRpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0aW1lem9uZSkgJiYgdGltZXpvbmUuJHRhcmdldFxuXHRcdFx0PyBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKFxuXHRcdFx0XHRcdCh0aW1lem9uZSBhcyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248dW5rbm93bj4pLiR0YXJnZXQgYXMgUHJvcGVydHksXG5cdFx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHRpbWV6b25lLCByZWxhdGl2ZUxvY2F0aW9uKSxcblx0XHRcdFx0XHRpZ25vcmVVbml0Q29uc3RyYWludFxuXHRcdFx0ICApXG5cdFx0XHQ6IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih0aW1lem9uZSwgcmVsYXRpdmVMb2NhdGlvbik7XG5cdGxldCBmb3JtYXRPcHRpb25zID0ge307XG5cdGlmIChoaWRlVGltZXpvbmVGb3JFbXB0eVZhbHVlcykge1xuXHRcdGZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRzaG93VGltZXpvbmVGb3JFbXB0eVZhbHVlczogZmFsc2Vcblx0XHR9O1xuXHR9XG5cdC8vIGlmIHN0eWxlIG9yIHBhdHRlcm4gaXMgYWxzbyBzZXRcblx0aWYgKHN0eWxlKSB7XG5cdFx0Zm9ybWF0T3B0aW9ucyA9IHsgLi4uZm9ybWF0T3B0aW9ucywgLi4ueyBzdHlsZTogc3R5bGUgfSB9O1xuXHR9IGVsc2UgaWYgKGZpZWxkRm9ybWF0T3B0aW9ucz8uZGF0ZVRpbWVTdHlsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Zm9ybWF0T3B0aW9ucyA9IHsgLi4uZm9ybWF0T3B0aW9ucywgLi4ueyBzdHlsZTogZmllbGRGb3JtYXRPcHRpb25zLmRhdGVUaW1lU3R5bGUgfSB9O1xuXHR9XG5cblx0aWYgKGZpZWxkRm9ybWF0T3B0aW9ucz8uZGF0ZVRpbWVQYXR0ZXJuICE9PSB1bmRlZmluZWQpIHtcblx0XHRmb3JtYXRPcHRpb25zID0geyAuLi5mb3JtYXRPcHRpb25zLCAuLi57IHBhdHRlcm46IGZpZWxkRm9ybWF0T3B0aW9ucy5kYXRlVGltZVBhdHRlcm4gfSB9O1xuXHR9XG5cblx0aWYgKGZpZWxkRm9ybWF0T3B0aW9ucz8uc2hvd1RpbWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdGZvcm1hdE9wdGlvbnMgPSB7IC4uLmZvcm1hdE9wdGlvbnMsIC4uLnsgc2hvd1RpbWU6IGZpZWxkRm9ybWF0T3B0aW9ucy5zaG93VGltZSB9IH07XG5cdH1cblx0aWYgKGZpZWxkRm9ybWF0T3B0aW9ucz8uc2hvd0RhdGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdGZvcm1hdE9wdGlvbnMgPSB7IC4uLmZvcm1hdE9wdGlvbnMsIC4uLnsgc2hvd0RhdGU6IGZpZWxkRm9ybWF0T3B0aW9ucy5zaG93RGF0ZSB9IH07XG5cdH1cblx0aWYgKGZpZWxkRm9ybWF0T3B0aW9ucz8uc2hvd1RpbWV6b25lICE9PSB1bmRlZmluZWQpIHtcblx0XHRmb3JtYXRPcHRpb25zID0geyAuLi5mb3JtYXRPcHRpb25zLCAuLi57IHNob3dUaW1lem9uZTogZmllbGRGb3JtYXRPcHRpb25zLnNob3dUaW1lem9uZSB9IH07XG5cdH1cblxuXHRyZXR1cm4gYWRkVHlwZUluZm9ybWF0aW9uKFtwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLCB1bml0QmluZGluZ0V4cHJlc3Npb25dLCBjb21wbGV4VHlwZSwgdW5kZWZpbmVkLCBmb3JtYXRPcHRpb25zKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgZGF0ZSBmb3JtYXQgb2YgYSBkYXRlLCB0aW1lIG9yIGRhdGVUaW1lLlxuICogQHBhcmFtIHByb3BlcnR5RGF0YU1vZGVsUGF0aCBUaGUgbGlzdCBvZiBkYXRhIG1vZGVsIG9iamVjdHMgdGhhdCBhcmUgaW52b2x2ZWQgdG8gcmVhY2ggdGhhdCBwcm9wZXJ0eVxuICogQHBhcmFtIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gQmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBmb3JtYXRPcHRpb25zRGF0ZUZvcm1hdCBGb3JtYXQgb3B0aW9ucyB3aGljaCBjb250YWluIHRoZSBzdHlsZSBvciBwYXR0ZXJuIHByb3BlcnR5XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIHJlcHJlc2VudGluZyBhIGRhdGUsIHRpbWUsIG9yIGRhdGUtdGltZSwgd2l0aCB0aGUgZ2l2ZW4gcGF0dGVybiBvciBzdHlsZSBwcm9wZXJ0eVxuICovXG5leHBvcnQgY29uc3QgZ2V0QmluZGluZ0ZvckRhdGVGb3JtYXQgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnR5RGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRmb3JtYXRPcHRpb25zRGF0ZUZvcm1hdD86IEZvcm1hdE9wdGlvbnNEYXRlRm9ybWF0XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eURlZmluaXRpb24gPSBwcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXHRjb25zdCBwYXR0ZXJuID0gZm9ybWF0T3B0aW9uc0RhdGVGb3JtYXQ/LmRhdGVUaW1lUGF0dGVybjtcblx0Y29uc3Qgc3R5bGUgPSBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5VST8uRGF0ZVRpbWVTdHlsZSA/PyBmb3JtYXRPcHRpb25zRGF0ZUZvcm1hdD8uZGF0ZVRpbWVTdHlsZTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbik7XG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24udHlwZSA9IEVETV9UWVBFX01BUFBJTkdbb1Byb3BlcnR5RGVmaW5pdGlvbi50eXBlXS50eXBlO1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0Li4uKHN0eWxlICYmIHsgc3R5bGU6IHN0eWxlLnRvU3RyaW5nKCkgfSksXG5cdFx0Li4uKHBhdHRlcm4gJiYgeyBwYXR0ZXJuOiBwYXR0ZXJuIH0pXG5cdH07XG5cblx0cmV0dXJuIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb247XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmluZGluZ0ZvclRpbWV6b25lID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBwcm9wZXJ0eURlZmluaXRpb24gPSBwcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihwcm9wZXJ0eURlZmluaXRpb24sIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24pO1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLnR5cGUgPSBcImFueVwiO1xuXHRjb25zdCBjb21wbGV4VHlwZSA9IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRGF0ZVRpbWVXaXRoVGltZXpvbmVcIjtcblx0Y29uc3QgZm9ybWF0T3B0aW9ucyA9IHsgc2hvd1RpbWU6IGZhbHNlLCBzaG93RGF0ZTogZmFsc2UsIHNob3dUaW1lem9uZTogdHJ1ZSB9O1xuXG5cdC8vIG51bGwgaXMgcmVxdWlyZWQgYnkgZm9ybWF0dGVyIHdoZW4gdGhlcmUgaXMganVzdCBhIHRpbWV6b25lXG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oW251bGwsIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb25dLCBjb21wbGV4VHlwZSwgdW5kZWZpbmVkLCBmb3JtYXRPcHRpb25zKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBbGlnbm1lbnRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvQ29tcHV0ZWRFZGl0TW9kZTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4sXG5cdHNBbGlnbkRpc3BsYXkgPSBcIkJlZ2luXCIsXG5cdHNBbGlnbkVkaXQgPSBcIkJlZ2luXCJcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShlcXVhbChvQ29tcHV0ZWRFZGl0TW9kZSwgXCJEaXNwbGF5XCIpLCBzQWxpZ25EaXNwbGF5LCBzQWxpZ25FZGl0KSk7XG59O1xuXG4vKipcbiAqIEZvcm1hdHRlciBoZWxwZXIgdG8gcmV0cmlldmUgdGhlIGNvbnZlcnRlckNvbnRleHQgZnJvbSB0aGUgbWV0YW1vZGVsIGNvbnRleHQuXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIG9yaWdpbmFsIG1ldGFtb2RlbCBjb250ZXh0XG4gKiBAcGFyYW0gb0ludGVyZmFjZSBUaGUgY3VycmVudCB0ZW1wbGF0aW5nIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBDb252ZXJ0ZXJDb250ZXh0IHJlcHJlc2VudGluZyB0aGF0IG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgZ2V0Q29udmVydGVyQ29udGV4dCA9IGZ1bmN0aW9uIChvQ29udGV4dDogTWV0YU1vZGVsQ29udGV4dCwgb0ludGVyZmFjZTogQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlKTogb2JqZWN0IHwgbnVsbCB7XG5cdGlmIChvSW50ZXJmYWNlICYmIG9JbnRlcmZhY2UuY29udGV4dCkge1xuXHRcdHJldHVybiBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dChvSW50ZXJmYWNlLmNvbnRleHQpIGFzIG9iamVjdDtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn07XG5nZXRDb252ZXJ0ZXJDb250ZXh0LnJlcXVpcmVzSUNvbnRleHQgPSB0cnVlO1xuXG4vKipcbiAqIEZvcm1hdHRlciBoZWxwZXIgdG8gcmV0cmlldmUgdGhlIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IGFyZSBpbnZvbHZlZCBmcm9tIHRoZSBtZXRhbW9kZWwgY29udGV4dC5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgb3JpZ2luYWwgT0RhdGFNZXRhTW9kZWwgY29udGV4dFxuICogQHBhcmFtIG9JbnRlcmZhY2UgVGhlIGN1cnJlbnQgdGVtcGxhdGluZyBjb250ZXh0XG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlbnRpdHlzZXRzIGFuZCBuYXZwcm9wZXJ0aWVzIHRoYXQgYXJlIGludm9sdmVkIHRvIGdldCB0byBhIHNwZWNpZmljIG9iamVjdCBpbiB0aGUgbWV0YW1vZGVsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXREYXRhTW9kZWxPYmplY3RQYXRoID0gZnVuY3Rpb24gPFQ+KFxuXHRvQ29udGV4dDogTWV0YU1vZGVsQ29udGV4dCxcblx0b0ludGVyZmFjZTogQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoPFQ+IHwgbnVsbCB7XG5cdGlmIChvSW50ZXJmYWNlICYmIG9JbnRlcmZhY2UuY29udGV4dCkge1xuXHRcdHJldHVybiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0ludGVyZmFjZS5jb250ZXh0KTtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn07XG5nZXREYXRhTW9kZWxPYmplY3RQYXRoLnJlcXVpcmVzSUNvbnRleHQgPSB0cnVlO1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0eSBpcyBwYXJ0IG9mIGEgMS4ubiBuYXZpZ2F0aW9uLlxuICogQHBhcmFtIG9EYXRhTW9kZWxQYXRoIFRoZSBkYXRhIG1vZGVsIHBhdGggdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHBhcnQgb2YgYSAxLi5uIG5hdmlnYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGlzTXVsdGlWYWx1ZUZpZWxkID0gZnVuY3Rpb24gKG9EYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPHVua25vd24+KTogYm9vbGVhbiB7XG5cdGlmIChvRGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0Y29uc3QgaGFzT25lVG9NYW55TmF2aWdhdGlvbiA9XG5cdFx0XHRvRGF0YU1vZGVsUGF0aD8ubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZEluZGV4KChvTmF2KSA9PiB7XG5cdFx0XHRcdGlmIChpc011bHRpcGxlTmF2aWdhdGlvblByb3BlcnR5KG9OYXYpKSB7XG5cdFx0XHRcdFx0aWYgKG9EYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbj8ubmF2aWdhdGlvblByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Ly93ZSBjaGVjayB0aGUgb25lIHRvIG1hbnkgbmF2IGlzIG5vdCBhbHJlYWR5IHBhcnQgb2YgdGhlIGNvbnRleHRcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdG9EYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbj8ubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZEluZGV4KFxuXHRcdFx0XHRcdFx0XHRcdChvQ29udGV4dE5hdikgPT4gb0NvbnRleHROYXYubmFtZSA9PT0gb05hdi5uYW1lXG5cdFx0XHRcdFx0XHRcdCkgPT09IC0xXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9KSA+IC0xO1xuXHRcdGlmIChoYXNPbmVUb01hbnlOYXZpZ2F0aW9uKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcbmV4cG9ydCBjb25zdCBnZXRSZXF1aXJlZEV4cHJlc3Npb25Bc09iamVjdCA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkPzogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzLFxuXHRmb3JjZUVkaXRNb2RlID0gZmFsc2Vcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBnZXRSZXF1aXJlZEV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCwgb0RhdGFGaWVsZENvbnZlcnRlZCwgZm9yY2VFZGl0TW9kZSwgdHJ1ZSkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xufTtcbmV4cG9ydCBjb25zdCBnZXRSZXF1aXJlZEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFGaWVsZENvbnZlcnRlZD86IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyxcblx0Zm9yY2VFZGl0TW9kZSA9IGZhbHNlLFxuXHRiQXNPYmplY3QgPSBmYWxzZSxcblx0b1JlcXVpcmVkUHJvcGVydGllczoge1xuXHRcdHJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnM/OiB1bmtub3duW107XG5cdFx0cmVxdWlyZWRQcm9wZXJ0aWVzRnJvbVVwZGF0ZVJlc3RyaWN0aW9ucz86IHVua25vd25bXTtcblx0fSA9IHt9LFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoPzogRGF0YU1vZGVsT2JqZWN0UGF0aDx1bmtub3duPlxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBhUmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyA9IG9SZXF1aXJlZFByb3BlcnRpZXMucmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucztcblx0Y29uc3QgYVJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMgPSBvUmVxdWlyZWRQcm9wZXJ0aWVzLnJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnM7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdGlmIChiQXNPYmplY3QpIHtcblx0XHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihjb25zdGFudChmYWxzZSkpO1xuXHR9XG5cdGxldCByZWxhdGl2ZVBhdGg7XG5cdGlmIChkYXRhTW9kZWxPYmplY3RQYXRoKSB7XG5cdFx0cmVsYXRpdmVQYXRoID0gZ2V0UmVsYXRpdmVQYXRocyhkYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0fVxuXHRsZXQgZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudChmYWxzZSk7XG5cdGlmIChvRGF0YUZpZWxkQ29udmVydGVkICE9PSB1bmRlZmluZWQgJiYgIWlzUHJvcGVydHkob0RhdGFGaWVsZENvbnZlcnRlZCkpIHtcblx0XHQvLyBGb3IgdGhlIGRhdGFmaWVsZCBleHByZXNzaW9uIHdlIHNob3VsZCBub3QgIGNvbnNpZGVyIHRoZSByZWxhdGl2ZSBwYXRoXG5cdFx0ZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uID0gaXNSZXF1aXJlZEV4cHJlc3Npb24ob0RhdGFGaWVsZENvbnZlcnRlZCk7XG5cdH1cblx0bGV0IHJlcXVpcmVkUHJvcGVydHlGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQoZmFsc2UpO1xuXHRsZXQgcmVxdWlyZWRQcm9wZXJ0eUZyb21VcGRhdGVSZXN0cmljdGlvbnNFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudChmYWxzZSk7XG5cblx0Y29uc3Qgb1Byb3BlcnR5OiBQcm9wZXJ0eSA9IChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0Ly8gRW5hYmxlbWVudCBkZXBlbmRzIG9uIHRoZSBmaWVsZCBjb250cm9sIGV4cHJlc3Npb25cblx0Ly8gSWYgdGhlIEZpZWxkIGNvbnRyb2wgaXMgc3RhdGljYWxseSBpbiBJbmFwcGxpY2FibGUgKGRpc2FibGVkKSAtPiBub3QgZW5hYmxlZFxuXHRjb25zdCByZXF1aXJlZEV4cHJlc3Npb24gPSBpc1JlcXVpcmVkRXhwcmVzc2lvbihvUHJvcGVydHksIHJlbGF0aXZlUGF0aCk7XG5cdGNvbnN0IGVkaXRNb2RlID0gZm9yY2VFZGl0TW9kZSB8fCBVSS5Jc0VkaXRhYmxlO1xuXHRpZiAoYVJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnM/LmluY2x1ZGVzKG9Qcm9wZXJ0eS5uYW1lKSkge1xuXHRcdHJlcXVpcmVkUHJvcGVydHlGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zRXhwcmVzc2lvbiA9IFVJLklzQ3JlYXRlTW9kZTtcblx0fVxuXHRpZiAoYVJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnM/LmluY2x1ZGVzKG9Qcm9wZXJ0eS5uYW1lKSkge1xuXHRcdHJlcXVpcmVkUHJvcGVydHlGcm9tVXBkYXRlUmVzdHJpY3Rpb25zRXhwcmVzc2lvbiA9IGFuZChVSS5Jc0VkaXRhYmxlLCBub3QoVUkuSXNDcmVhdGVNb2RlKSk7XG5cdH1cblx0Y29uc3QgcmV0dXJuRXhwcmVzc2lvbiA9IG9yKFxuXHRcdGFuZChvcihyZXF1aXJlZEV4cHJlc3Npb24sIGRhdGFGaWVsZFJlcXVpcmVkRXhwcmVzc2lvbiksIGVkaXRNb2RlKSxcblx0XHRyZXF1aXJlZFByb3BlcnR5RnJvbUluc2VydFJlc3RyaWN0aW9uc0V4cHJlc3Npb24sXG5cdFx0cmVxdWlyZWRQcm9wZXJ0eUZyb21VcGRhdGVSZXN0cmljdGlvbnNFeHByZXNzaW9uXG5cdCk7XG5cdGlmIChiQXNPYmplY3QpIHtcblx0XHRyZXR1cm4gcmV0dXJuRXhwcmVzc2lvbjtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24ocmV0dXJuRXhwcmVzc2lvbik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uRm9yQ29ubmVjdGVkRGF0YUZpZWxkID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGRPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPEFubm90YXRpb25QYXRoPENvbm5lY3RlZEZpZWxkc1R5cGU+PlxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzPiA9IChkYXRhRmllbGRPYmplY3RQYXRoPy50YXJnZXRPYmplY3Q/LiR0YXJnZXQ/LkRhdGEgPz8ge30pIGFzIFJlY29yZDxcblx0XHRzdHJpbmcsXG5cdFx0RGF0YUZpZWxkQWJzdHJhY3RUeXBlc1xuXHQ+O1xuXHRjb25zdCBrZXlzOiBBcnJheTxzdHJpbmc+ID0gT2JqZWN0LmtleXMoZGF0YSk7XG5cdGNvbnN0IGRhdGFGaWVsZHMgPSBbXTtcblx0bGV0IHByb3BlcnR5UGF0aDtcblx0Y29uc3QgaXNSZXF1aXJlZEV4cHJlc3Npb25zOiAoQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfCBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4pW10gfCB1bmRlZmluZWQgPSBbXTtcblx0Zm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuXHRcdGlmIChkYXRhW2tleV0/LltcIiRUeXBlXCJdICYmIGRhdGFba2V5XVtcIiRUeXBlXCJdPy5pbmNsdWRlcyhcIkRhdGFGaWVsZFwiKSkge1xuXHRcdFx0ZGF0YUZpZWxkcy5wdXNoKGRhdGFba2V5XSk7XG5cdFx0fVxuXHR9XG5cdGZvciAoY29uc3QgZGF0YUZpZWxkIG9mIGRhdGFGaWVsZHMpIHtcblx0XHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGggPSBkYXRhRmllbGQuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdFx0aWYgKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQpIHtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRpc0Fubm90YXRpb25PZlR5cGU8RGF0YUZpZWxkIHwgRGF0YVBvaW50VHlwZT4oZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LCBbXG5cdFx0XHRcdFx0XHRcdFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCxcblx0XHRcdFx0XHRcdFx0VUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZVxuXHRcdFx0XHRcdFx0XSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YgZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5UGF0aCA9IGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5UYXJnZXQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHQvLyBubyBkZWZhdWx0XG5cdFx0fVxuXHRcdGlzUmVxdWlyZWRFeHByZXNzaW9ucy5wdXNoKGdldFJlcXVpcmVkRXhwcmVzc2lvbkFzT2JqZWN0KHByb3BlcnR5UGF0aCwgZGF0YUZpZWxkLCBmYWxzZSkpO1xuXHR9XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihvciguLi4oaXNSZXF1aXJlZEV4cHJlc3Npb25zIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdKSkpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBoZWFkZXIgZmFjZXQgb3IgYWN0aW9uIGlzIHZpc2libGUuXG4gKiBAcGFyYW0gdGFyZ2V0T2JqZWN0IEhlYWRlciBmYWNldHMgb3IgQWN0aW9uc1xuICogQHJldHVybnMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Zpc2libGUoXG5cdHRhcmdldE9iamVjdDpcblx0XHR8IERhdGFGaWVsZEFic3RyYWN0VHlwZXNcblx0XHR8IERhdGFQb2ludFR5cGVUeXBlc1xuXHRcdHwgUmVmZXJlbmNlRmFjZXRcblx0XHR8IENvbGxlY3Rpb25GYWNldFxuXHRcdHwgRGF0YUZpZWxkRm9yQWN0aW9uVHlwZXNcblx0XHR8IEZpZWxkR3JvdXBcblx0XHR8IFByb3BlcnR5XG5cdFx0fCB1bmRlZmluZWQsXG5cdG5hdmlnYXRpb25Qcm9wZXJ0aWVzPzogc3RyaW5nW11cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBub3QoZXF1YWwoZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4sIG5hdmlnYXRpb25Qcm9wZXJ0aWVzKSwgdHJ1ZSkpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGFjdGlvbiBwYXJhbWV0ZXIgaXMgc3VwcG9ydHMgbXVsdGkgbGluZSBpbnB1dC5cbiAqIEBwYXJhbSBkYXRhTW9kZWxPYmplY3RQYXRoIE9iamVjdCBwYXRoIHRvIHRoZSBhY3Rpb24gcGFyYW1ldGVyLlxuICogQHJldHVybnMgQm9vbGVhblxuICovXG5leHBvcnQgY29uc3QgaXNNdWx0aUxpbmUgPSBmdW5jdGlvbiAoZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxBY3Rpb25QYXJhbWV0ZXI+KTogYm9vbGVhbiB7XG5cdHJldHVybiBpc011bHRpTGluZVRleHQoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIGVuYWJsZWQuXG4gKiBAcGFyYW0gYWN0aW9uVGFyZ2V0IEFjdGlvblxuICogQHBhcmFtIGNvbnZlcnRlZFR5cGVzIENvbnZlcnRlZE1ldGFkYXRhXG4gKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aCBEYXRhTW9kZWxPYmplY3RQYXRoXG4gKiBAcGFyYW0gcGF0aEZyb21Db250ZXh0TG9jYXRpb24gQm9vbGVhblxuICogQHJldHVybnMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3Rpb25FbmFibGVkRXhwcmVzc2lvbihcblx0YWN0aW9uVGFyZ2V0OiBBY3Rpb24sXG5cdGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZWRNZXRhZGF0YSxcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aD86IERhdGFNb2RlbE9iamVjdFBhdGg8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cGF0aEZyb21Db250ZXh0TG9jYXRpb24/OiBib29sZWFuXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVJc0Fubm90YXRlZCA9XG5cdFx0YWN0aW9uVGFyZ2V0LmFubm90YXRpb25zLkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZT8udGVybSA9PT0gQ29yZUFubm90YXRpb25UZXJtcy5PcGVyYXRpb25BdmFpbGFibGU7XG5cblx0aWYgKCFvcGVyYXRpb25BdmFpbGFibGVJc0Fubm90YXRlZCkge1xuXHRcdC8vIE9wZXJhdGlvbkF2YWlsYWJsZSB0ZXJtIGRvZXNuJ3QgZXhpc3QgZm9yIHRoZSBhY3Rpb25cblx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdH1cblxuXHRsZXQgcHJlZml4ID0gXCJcIjtcblx0aWYgKFxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGggJiZcblx0XHRwYXRoRnJvbUNvbnRleHRMb2NhdGlvbiAmJlxuXHRcdHBhdGhGcm9tQ29udGV4dExvY2F0aW9uID09PSB0cnVlICYmXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5jb250ZXh0TG9jYXRpb24/LnRhcmdldEVudGl0eVR5cGUgJiZcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLmNvbnRleHRMb2NhdGlvbi50YXJnZXRFbnRpdHlUeXBlICE9PSBhY3Rpb25UYXJnZXQuc291cmNlRW50aXR5VHlwZVxuXHQpIHtcblx0XHRjb25zdCBuYXZpZ2F0aW9ucyA9IGdldFJlbGF0aXZlUGF0aHMoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdFx0bGV0IHNvdXJjZUFjdGlvbkRhdGFNb2RlbE9iamVjdCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKGRhdGFNb2RlbE9iamVjdFBhdGguY29udGV4dExvY2F0aW9uKTtcblx0XHQvL1N0YXJ0IGZyb20gY29udGV4dExvY2F0aW9uIGFuZCBuYXZpZ2F0ZSB1bnRpbCB0aGUgc291cmNlIGVudGl0eVR5cGUgb2YgdGhlIGFjdGlvbiB0byBnZXQgdGhlIHJpZ2h0IHByZWZpeFxuXHRcdGZvciAoY29uc3QgbmF2IG9mIG5hdmlnYXRpb25zKSB7XG5cdFx0XHRzb3VyY2VBY3Rpb25EYXRhTW9kZWxPYmplY3QgPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChzb3VyY2VBY3Rpb25EYXRhTW9kZWxPYmplY3QsIG5hdik7XG5cdFx0XHRpZiAoc291cmNlQWN0aW9uRGF0YU1vZGVsT2JqZWN0LnRhcmdldEVudGl0eVR5cGUgPT09IGFjdGlvblRhcmdldC5zb3VyY2VFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdHByZWZpeCA9IGAke2dldFJlbGF0aXZlUGF0aHMoc291cmNlQWN0aW9uRGF0YU1vZGVsT2JqZWN0KS5qb2luKFwiL1wiKX0vYDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSA9IGFjdGlvblRhcmdldC5pc0JvdW5kID8gYWN0aW9uVGFyZ2V0LnBhcmFtZXRlcnNbMF0/LmZ1bGx5UXVhbGlmaWVkTmFtZSA6IHVuZGVmaW5lZDtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlRXhwcmVzc2lvbiA9IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihcblx0XHRhY3Rpb25UYXJnZXQuYW5ub3RhdGlvbnMuQ29yZT8uT3BlcmF0aW9uQXZhaWxhYmxlLFxuXHRcdFtdLFxuXHRcdHVuZGVmaW5lZCxcblx0XHQocGF0aDogc3RyaW5nKSA9PiBgJHtwcmVmaXh9JHtiaW5kaW5nQ29udGV4dFBhdGhWaXNpdG9yKHBhdGgsIGNvbnZlcnRlZFR5cGVzLCBiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUpfWBcblx0KTtcblxuXHRyZXR1cm4gZXF1YWwob3BlcmF0aW9uQXZhaWxhYmxlRXhwcmVzc2lvbiwgdHJ1ZSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBleHByZXNzaW9uIHRvIGNoZWNrIGlmIHRoZSBxdWlja1ZpZXcgZmFjZXQgaXMgdmlzaWJsZS5cbiAqIEBwYXJhbSBmYWNldE1vZGVsUGF0aFxuICogQHJldHVybnMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gb2YgdGhlIHZpc2liaWxpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUXVpY2tWaWV3RmFjZXRWaXNpYmxlKGZhY2V0TW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFJlZmVyZW5jZUZhY2V0Pik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0bGV0IHRhcmdldFZpc2libGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IGNvbnN0YW50KHRydWUpO1xuXHRpZiAoaXNBbm5vdGF0aW9uT2ZUeXBlPEZpZWxkR3JvdXA+KGZhY2V0TW9kZWxQYXRoLnRhcmdldE9iamVjdD8uVGFyZ2V0Py4kdGFyZ2V0LCBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZSkpIHtcblx0XHR0YXJnZXRWaXNpYmxlID0gaXNWaXNpYmxlKGZhY2V0TW9kZWxQYXRoLnRhcmdldE9iamVjdD8uVGFyZ2V0Py4kdGFyZ2V0KTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oYW5kKGlzVmlzaWJsZShmYWNldE1vZGVsUGF0aC50YXJnZXRPYmplY3QpLCB0YXJnZXRWaXNpYmxlKSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VB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
729
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGaWVsZEVkaXRNb2RlIiwiRGlzYWJsZWQiLCJEaXNwbGF5IiwiRWRpdGFibGUiLCJFZGl0YWJsZURpc3BsYXkiLCJFZGl0YWJsZVJlYWRPbmx5IiwiUmVhZE9ubHkiLCJfZXhwb3J0cyIsImdldERpc3BsYXlNb2RlIiwib0RhdGFNb2RlbE9iamVjdFBhdGgiLCJEaXNwbGF5TW9kZUZvcm1hdHRlciIsInRhcmdldE9iamVjdCIsImdldEVkaXRhYmxlRXhwcmVzc2lvbkFzT2JqZWN0Iiwib1Byb3BlcnR5UGF0aCIsIm9EYXRhRmllbGRDb252ZXJ0ZWQiLCJpc0VkaXRhYmxlIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiVUkiLCJJc0VkaXRhYmxlIiwiY29uc2lkZXJVcGRhdGVSZXN0cmljdGlvbnMiLCJnZXRFZGl0YWJsZUV4cHJlc3Npb24iLCJiQXNPYmplY3QiLCJyZWxhdGl2ZVBhdGgiLCJnZXRSZWxhdGl2ZVBhdGhzIiwiY29tcGlsZUV4cHJlc3Npb24iLCJkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24iLCJjb25zdGFudCIsImlzUHJvcGVydHkiLCJpZkVsc2UiLCJpc05vbkVkaXRhYmxlRXhwcmVzc2lvbiIsIm9Qcm9wZXJ0eSIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiJHRhcmdldCIsImlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24iLCJpc1BhdGhVcGRhdGFibGUiLCJwcm9wZXJ0eVBhdGgiLCJwYXRoVmlzaXRvciIsInBhdGgiLCJuYXZpZ2F0aW9uUGF0aHMiLCJzaW5nbGV0b25QYXRoVmlzaXRvciIsImNvbnZlcnRlZFR5cGVzIiwiZWRpdGFibGVFeHByZXNzaW9uIiwib3IiLCJhbmQiLCJub3QiLCJpc0NvbXB1dGVkIiwiaXNLZXkiLCJpc0ltbXV0YWJsZSIsIklzVHJhbnNpZW50QmluZGluZyIsInVucmVzb2x2YWJsZUV4cHJlc3Npb24iLCJnZXRDb2xsYWJvcmF0aW9uRXhwcmVzc2lvbiIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJmb3JtYXR0ZXIiLCJvYmplY3RQYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsImFjdGl2aXR5RXhwcmVzc2lvbiIsInBhdGhJbk1vZGVsIiwia2V5cyIsImNvbnRleHRMb2NhdGlvbiIsInRhcmdldEVudGl0eVR5cGUiLCJrZXlzRXhwcmVzc2lvbnMiLCJmb3JFYWNoIiwia2V5Iiwia2V5RXhwcmVzc2lvbiIsIm5hbWUiLCJwdXNoIiwiZm9ybWF0UmVzdWx0IiwiZ2V0RW5hYmxlZEV4cHJlc3Npb25Bc09iamVjdCIsImdldEVuYWJsZWRFeHByZXNzaW9uIiwiZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb24iLCJpc0Rpc2FibGVkRXhwcmVzc2lvbiIsImVuYWJsZWRFeHByZXNzaW9uIiwiZ2V0RWRpdE1vZGUiLCJtZWFzdXJlUmVhZE9ubHkiLCJhc09iamVjdCIsImRhdGFGaWVsZENvbnZlcnRlZCIsIiRUeXBlIiwicHJvcGVydHkiLCJhc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5IiwidW5pdFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSIsInJlc3VsdEV4cHJlc3Npb24iLCJpc1VuaXRSZWFkT25seSIsImlzUmVhZE9ubHlFeHByZXNzaW9uIiwiaXNDb25zdGFudCIsImFubm90YXRpb25zIiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJyZWFkT25seUV4cHJlc3Npb24iLCJlZGl0TW9kZUV4cHJlc3Npb24iLCJoYXNWYWxpZEFuYWx5dGljYWxDdXJyZW5jeU9yVW5pdCIsIm9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJvUHJvcGVydHlEZWZpbml0aW9uIiwiY3VycmVuY3kiLCJtZWFzdXJlIiwiaXNUcnV0aHkiLCJnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24iLCJJc1RvdGFsIiwiZ2V0RmllbGREaXNwbGF5Iiwic1RhcmdldERpc3BsYXlNb2RlIiwib0NvbXB1dGVkRWRpdE1vZGUiLCJoYXNUZXh0QW5ub3RhdGlvbiIsIkNvbW1vbiIsIlRleHQiLCJoYXNWYWx1ZUhlbHAiLCJlcXVhbCIsImdldFR5cGVDb25maWciLCJkYXRhVHlwZSIsIm9UYXJnZXRNYXBwaW5nIiwiRURNX1RZUEVfTUFQUElORyIsInR5cGUiLCJwcm9wZXJ0eVR5cGVDb25maWciLCJjb25zdHJhaW50cyIsImZvcm1hdE9wdGlvbnMiLCJzY2FsZSIsIiRTY2FsZSIsInByZWNpc2lvbiIsIiRQcmVjaXNpb24iLCJtYXhMZW5ndGgiLCIkTWF4TGVuZ3RoIiwibnVsbGFibGUiLCIkTnVsbGFibGUiLCJtaW5pbXVtIiwiaXNOYU4iLCJWYWxpZGF0aW9uIiwiTWluaW11bSIsIm1heGltdW0iLCJNYXhpbXVtIiwiaXNEaWdpdFNlcXVlbmNlIiwiSXNEaWdpdFNlcXVlbmNlIiwiVjQiLCIkVjQiLCJwYXJzZUFzU3RyaW5nIiwiaW5kZXhPZiIsImVtcHR5U3RyaW5nIiwicGFyc2VLZWVwc0VtcHR5U3RyaW5nIiwiZ2V0Q29uc3RyYWludE9wdGlvbnMiLCJEb05vdENoZWNrU2NhbGVPZk1lYXN1cmVkUXVhbnRpdHkiLCJ2YWx1ZU9mIiwic2tpcERlY2ltYWxzVmFsaWRhdGlvbiIsImdldEJpbmRpbmdXaXRoVW5pdE9yQ3VycmVuY3kiLCJvUHJvcGVydHlEYXRhTW9kZWxQYXRoIiwicHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiIsImlnbm9yZVVuaXRDb25zdHJhaW50IiwiZm9yRGlzcGxheU1vZGUiLCJzaG93T25seVVuaXREZWNpbWFscyIsInVuaXQiLCJyZWxhdGl2ZUxvY2F0aW9uIiwiZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbiIsImhhc1N0YXRpY1BlcmNlbnRVbml0Iiwic2hvd01lYXN1cmUiLCJ2YWx1ZUZvcm1hdHRlcnMiLCJmb3JtYXRXaXRoUGVyY2VudGFnZSIsImNvbXBsZXhUeXBlIiwidW5pdEJpbmRpbmdFeHByZXNzaW9uIiwiY29uc3RyYWludE9wdGlvbnMiLCJhZGRUeXBlSW5mb3JtYXRpb24iLCJnZXRCaW5kaW5nRm9yRGF0ZVBpY2tlciIsIm1pbkRhdGUiLCIkRGF0ZSIsIm1heERhdGUiLCJtaW5FeHByZXNzaW9uIiwibWF4RXhwcmVzc2lvbiIsImdldEJpbmRpbmdGb3JVbml0T3JDdXJyZW5jeSIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJzaG93TnVtYmVyIiwiZ2V0QmluZGluZ1dpdGhUaW1lem9uZSIsImhpZGVUaW1lem9uZUZvckVtcHR5VmFsdWVzIiwiZmllbGRGb3JtYXRPcHRpb25zIiwidGltZXpvbmUiLCJUaW1lem9uZSIsInN0eWxlIiwiRGF0ZVRpbWVTdHlsZSIsInNob3dUaW1lem9uZUZvckVtcHR5VmFsdWVzIiwiZGF0ZVRpbWVTdHlsZSIsImRhdGVUaW1lUGF0dGVybiIsInBhdHRlcm4iLCJzaG93VGltZSIsInNob3dEYXRlIiwic2hvd1RpbWV6b25lIiwiZ2V0QmluZGluZ0ZvckRhdGVGb3JtYXQiLCJwcm9wZXJ0eURhdGFNb2RlbFBhdGgiLCJmb3JtYXRPcHRpb25zRGF0ZUZvcm1hdCIsInRvU3RyaW5nIiwiZ2V0QmluZGluZ0ZvclRpbWV6b25lIiwicHJvcGVydHlEZWZpbml0aW9uIiwiZ2V0QWxpZ25tZW50RXhwcmVzc2lvbiIsInNBbGlnbkRpc3BsYXkiLCJzQWxpZ25FZGl0IiwiZ2V0Q29udmVydGVyQ29udGV4dCIsIm9Db250ZXh0Iiwib0ludGVyZmFjZSIsImNvbnRleHQiLCJjb252ZXJ0TWV0YU1vZGVsQ29udGV4dCIsInJlcXVpcmVzSUNvbnRleHQiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNNdWx0aVZhbHVlRmllbGQiLCJvRGF0YU1vZGVsUGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiaGFzT25lVG9NYW55TmF2aWdhdGlvbiIsImZpbmRJbmRleCIsIm9OYXYiLCJpc011bHRpcGxlTmF2aWdhdGlvblByb3BlcnR5Iiwib0NvbnRleHROYXYiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb25Bc09iamVjdCIsImZvcmNlRWRpdE1vZGUiLCJnZXRSZXF1aXJlZEV4cHJlc3Npb24iLCJvUmVxdWlyZWRQcm9wZXJ0aWVzIiwiYVJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMiLCJyZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zIiwiYVJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnMiLCJyZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zIiwiZGF0YUZpZWxkUmVxdWlyZWRFeHByZXNzaW9uIiwiaXNSZXF1aXJlZEV4cHJlc3Npb24iLCJyZXF1aXJlZFByb3BlcnR5RnJvbUluc2VydFJlc3RyaWN0aW9uc0V4cHJlc3Npb24iLCJyZXF1aXJlZFByb3BlcnR5RnJvbVVwZGF0ZVJlc3RyaWN0aW9uc0V4cHJlc3Npb24iLCJyZXF1aXJlZEV4cHJlc3Npb24iLCJlZGl0TW9kZSIsImluY2x1ZGVzIiwiSXNDcmVhdGVNb2RlIiwicmV0dXJuRXhwcmVzc2lvbiIsImdldFJlcXVpcmVkRXhwcmVzc2lvbkZvckNvbm5lY3RlZERhdGFGaWVsZCIsImRhdGFGaWVsZE9iamVjdFBhdGgiLCJkYXRhIiwiRGF0YSIsIk9iamVjdCIsImRhdGFGaWVsZHMiLCJpc1JlcXVpcmVkRXhwcmVzc2lvbnMiLCJkYXRhRmllbGQiLCJWYWx1ZSIsIlRhcmdldCIsImlzQW5ub3RhdGlvbk9mVHlwZSIsImlzVmlzaWJsZSIsIkhpZGRlbiIsImlzTXVsdGlMaW5lIiwiaXNNdWx0aUxpbmVUZXh0IiwiZ2V0QWN0aW9uRW5hYmxlZEV4cHJlc3Npb24iLCJhY3Rpb25UYXJnZXQiLCJwYXRoRnJvbUNvbnRleHRMb2NhdGlvbiIsIm9wZXJhdGlvbkF2YWlsYWJsZUlzQW5ub3RhdGVkIiwiQ29yZSIsIk9wZXJhdGlvbkF2YWlsYWJsZSIsInRlcm0iLCJwcmVmaXgiLCJzb3VyY2VFbnRpdHlUeXBlIiwibmF2aWdhdGlvbnMiLCJzb3VyY2VBY3Rpb25EYXRhTW9kZWxPYmplY3QiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsIm5hdiIsImpvaW4iLCJiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUiLCJpc0JvdW5kIiwicGFyYW1ldGVycyIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsIm9wZXJhdGlvbkF2YWlsYWJsZUV4cHJlc3Npb24iLCJiaW5kaW5nQ29udGV4dFBhdGhWaXNpdG9yIiwiaXNRdWlja1ZpZXdGYWNldFZpc2libGUiLCJmYWNldE1vZGVsUGF0aCIsInRhcmdldFZpc2libGUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlVJRm9ybWF0dGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFjdGlvbiwgQWN0aW9uUGFyYW1ldGVyLCBDb252ZXJ0ZWRNZXRhZGF0YSwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uLCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBBbm5vdGF0aW9uUGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9FZG1cIjtcbmltcG9ydCB7IENvcmVBbm5vdGF0aW9uVGVybXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvcmVcIjtcbmltcG9ydCB0eXBlIHsgVW5pdCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvTWVhc3VyZXNcIjtcbmltcG9ydCB0eXBlIHtcblx0Q29sbGVjdGlvbkZhY2V0LFxuXHRDb25uZWN0ZWRGaWVsZHNUeXBlLFxuXHREYXRhRmllbGQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvblR5cGVzLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50VHlwZSxcblx0RGF0YVBvaW50VHlwZVR5cGVzLFxuXHRGaWVsZEdyb3VwLFxuXHRSZWZlcmVuY2VGYWNldFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHtcblx0QmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbixcblx0Q29tcGxleFR5cGVDb25zdHJhaW50T3B0aW9ucyxcblx0Rm5cbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRFRE1fVFlQRV9NQVBQSU5HLFxuXHRhZGRUeXBlSW5mb3JtYXRpb24sXG5cdGFuZCxcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0Zm9ybWF0UmVzdWx0LFxuXHRmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uLFxuXHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24sXG5cdGlmRWxzZSxcblx0aXNDb25zdGFudCxcblx0aXNUcnV0aHksXG5cdG5vdCxcblx0b3IsXG5cdHBhdGhJbk1vZGVsLFxuXHR1bnJlc29sdmFibGVFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY29udmVydE1ldGFNb2RlbENvbnRleHQsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHZhbHVlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9WYWx1ZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgVUksIGJpbmRpbmdDb250ZXh0UGF0aFZpc2l0b3IsIHNpbmdsZXRvblBhdGhWaXNpdG9yIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IHsgaXNBbm5vdGF0aW9uT2ZUeXBlLCBpc011bHRpcGxlTmF2aWdhdGlvblByb3BlcnR5LCBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiwgaXNQcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7XG5cdGVuaGFuY2VEYXRhTW9kZWxQYXRoLFxuXHRnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoLFxuXHRnZXRSZWxhdGl2ZVBhdGhzLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoLFxuXHRpc1BhdGhVcGRhdGFibGVcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0ICogYXMgRGlzcGxheU1vZGVGb3JtYXR0ZXIgZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGlzcGxheU1vZGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7XG5cdGlzRGlzYWJsZWRFeHByZXNzaW9uLFxuXHRpc05vbkVkaXRhYmxlRXhwcmVzc2lvbixcblx0aXNSZWFkT25seUV4cHJlc3Npb24sXG5cdGlzUmVxdWlyZWRFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0ZpZWxkQ29udHJvbEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGhhc1N0YXRpY1BlcmNlbnRVbml0LFxuXHRoYXNWYWx1ZUhlbHAsXG5cdGlzQ29tcHV0ZWQsXG5cdGlzSW1tdXRhYmxlLFxuXHRpc0tleSxcblx0aXNNdWx0aUxpbmVUZXh0XG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBGaWVsZEZvcm1hdE9wdGlvbnMgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRGb3JtYXRPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFQb2ludEZvcm1hdE9wdGlvbnMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9oZWxwZXJzL0RhdGFQb2ludFRlbXBsYXRpbmdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5cbi8vIEltcG9ydC1leHBvcnQgbWV0aG9kIHVzZWQgYnkgdGhlIGNvbnZlcnRlciB0byB1c2UgdGhlbSBpbiB0aGUgdGVtcGxhdGluZyB0aHJvdWdoIHRoZSBVSUZvcm1hdHRlcnMuXG5leHBvcnQgdHlwZSBEaXNwbGF5TW9kZSA9IERpc3BsYXlNb2RlRm9ybWF0dGVyLkRpc3BsYXlNb2RlO1xuXG5leHBvcnQgdHlwZSBGaWVsZEVkaXRTdHlsZSA9IFwiUmFkaW9CdXR0b25zXCI7XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5T3JQYXRoPFA+ID0gc3RyaW5nIHwgUCB8IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPjtcbmV4cG9ydCB0eXBlIE1ldGFNb2RlbENvbnRleHQgPSB7XG5cdCRraW5kOiBzdHJpbmc7XG5cdCRUeXBlOiBzdHJpbmc7XG5cdCROdWxsYWJsZT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgdGhlIHN0cnVjdHVyZSByZXR1cm5lZCBieSB0aGUgT0RhdGFNZXRhTW9kZWwgd2hlbiB1c2luZyB0aGUgQEAgb3BlcmF0b3IgaW4gWE1MIHRlbXBsYXRlcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ29tcHV0ZWRBbm5vdGF0aW9uSW50ZXJmYWNlID0ge1xuXHRjb250ZXh0OiBDb250ZXh0O1xuXHRhcmd1bWVudHM/OiB1bmtub3duW107XG5cdCQkdmFsdWVBc1Byb21pc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZUNvbnN0cmFpbnRzID0ge1xuXHRzY2FsZT86IG51bWJlcjtcblx0cHJlY2lzaW9uPzogbnVtYmVyO1xuXHRtYXhMZW5ndGg/OiBudW1iZXI7XG5cdG51bGxhYmxlPzogYm9vbGVhbjtcblx0bWluaW11bT86IHN0cmluZztcblx0bWF4aW11bT86IHN0cmluZztcblx0aXNEaWdpdFNlcXVlbmNlPzogYm9vbGVhbjtcblx0VjQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZWZvcm1hdE9wdGlvbnMgPSB7XG5cdHBhcnNlQXNTdHJpbmc/OiBib29sZWFuO1xuXHRlbXB0eVN0cmluZz86IHN0cmluZztcblx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIENvbmZpZ1R5cGUgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0Y29uc3RyYWludHM6IGNvbmZpZ1R5cGVDb25zdHJhaW50cztcblx0Zm9ybWF0T3B0aW9uczogY29uZmlnVHlwZWZvcm1hdE9wdGlvbnM7XG59O1xuXG5leHBvcnQgdHlwZSBEYXRlVGltZVN0eWxlID0gXCJzaG9ydFwiIHwgXCJtZWRpdW1cIiB8IFwibG9uZ1wiIHwgXCJmdWxsXCI7XG5cbmV4cG9ydCB0eXBlIEZvcm1hdE9wdGlvbnNEYXRlRm9ybWF0ID0gRmllbGRGb3JtYXRPcHRpb25zIHwgRGF0YVBvaW50Rm9ybWF0T3B0aW9ucztcblxuZXhwb3J0IGNvbnN0IEZpZWxkRWRpdE1vZGUgPSB7XG5cdC8qKlxuXHQgKiB7QGxpbmsgc2FwLnVpLm1kYy5GaWVsZCBGaWVsZH0sIHtAbGluayBzYXAudWkubWRjLkZpbHRlckZpZWxkIEZpbHRlckZpZWxkfSBvciB7QGxpbmsgc2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGQgTXVsdGlWYWx1ZUZpZWxkIH1cblx0ICogaXMgcmVuZGVyZWQgaW4gZGlzYWJsZWQgbW9kZVxuXHQgKi9cblx0RGlzYWJsZWQ6IFwiRGlzYWJsZWRcIixcblx0LyoqXG5cdCAqIHtAbGluayBzYXAudWkubWRjLkZpZWxkIEZpZWxkfSwge0BsaW5rIHNhcC51aS5tZGMuRmlsdGVyRmllbGQgRmlsdGVyRmllbGR9IG9yIHtAbGluayBzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZCBNdWx0aVZhbHVlRmllbGQgfVxuXHQgKiBpcyByZW5kZXJlZCBpbiBkaXNwbGF5IG1vZGVcblx0ICovXG5cdERpc3BsYXk6IFwiRGlzcGxheVwiLFxuXHQvKipcblx0ICoge0BsaW5rIHNhcC51aS5tZGMuRmllbGQgRmllbGR9LCB7QGxpbmsgc2FwLnVpLm1kYy5GaWx0ZXJGaWVsZCBGaWx0ZXJGaWVsZH0gb3Ige0BsaW5rIHNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkIE11bHRpVmFsdWVGaWVsZCB9XG5cdCAqIGlzIHJlbmRlcmVkIGluIGVkaXRhYmxlIG1vZGVcblx0ICovXG5cdEVkaXRhYmxlOiBcIkVkaXRhYmxlXCIsXG5cdC8qKlxuXHQgKiBJZiBtb3JlIHRoYW4gb25lIGNvbnRyb2wgaXMgcmVuZGVyZWQgYnkgdGhlIHtAbGluayBzYXAudWkubWRjLkZpZWxkIEZpZWxkfSwge0BsaW5rIHNhcC51aS5tZGMuRmlsdGVyRmllbGQgRmlsdGVyRmllbGQgfVxuXHQgKiBvciB7QGxpbmsgc2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGQgTXVsdGlWYWx1ZUZpZWxkfSBjb250cm9sLCB0aGUgZmlyc3QgcGFydCBpcyBlZGl0YWJsZSwgYW5kIHRoZSBvdGhlclxuXHQgKiBwYXJ0cyBhcmUgaW4gZGlzcGxheSBtb2RlLlxuXHQgKi9cblx0RWRpdGFibGVEaXNwbGF5OiBcIkVkaXRhYmxlRGlzcGxheVwiLFxuXHQvKipcblx0ICogSWYgbW9yZSB0aGFuIG9uZSBjb250cm9sIGlzIHJlbmRlcmVkIGJ5IHRoZSB7QGxpbmsgc2FwLnVpLm1kYy5GaWVsZCBGaWVsZH0sIHtAbGluayBzYXAudWkubWRjLkZpbHRlckZpZWxkIEZpbHRlckZpZWxkIH1cblx0ICogb3Ige0BsaW5rIHNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkIE11bHRpVmFsdWVGaWVsZH0gY29udHJvbCwgdGhlIGZpcnN0IHBhcnQgaXMgZWRpdGFibGUsIGFuZCB0aGUgb3RoZXJcblx0ICogcGFydHMgYXJlIHJlYWQtb25seS5cblx0ICovXG5cdEVkaXRhYmxlUmVhZE9ubHk6IFwiRWRpdGFibGVSZWFkT25seVwiLFxuXHQvKipcblx0ICoge0BsaW5rIHNhcC51aS5tZGMuRmllbGQgRmllbGR9LCB7QGxpbmsgc2FwLnVpLm1kYy5GaWx0ZXJGaWVsZCBGaWx0ZXJGaWVsZH0gb3Ige0BsaW5rIHNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkIE11bHRpVmFsdWVGaWVsZCB9XG5cdCAqIGlzIHJlbmRlcmVkIGluIHJlYWQtb25seSBtb2RlXG5cdCAqL1xuXHRSZWFkT25seTogXCJSZWFkT25seVwiXG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlzcGxheU1vZGUgPSBmdW5jdGlvbiAoXG5cdG9EYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcz5cbik6IERpc3BsYXlNb2RlIHtcblx0cmV0dXJuIERpc3BsYXlNb2RlRm9ybWF0dGVyLmdldERpc3BsYXlNb2RlKG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCwgb0RhdGFNb2RlbE9iamVjdFBhdGgpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRFZGl0YWJsZUV4cHJlc3Npb25Bc09iamVjdCA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkOiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMgfCB1bmRlZmluZWQsXG5cdG9EYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPHVua25vd24+LFxuXHRpc0VkaXRhYmxlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBVSS5Jc0VkaXRhYmxlLFxuXHRjb25zaWRlclVwZGF0ZVJlc3RyaWN0aW9ucyA9IHRydWVcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBnZXRFZGl0YWJsZUV4cHJlc3Npb24oXG5cdFx0b1Byb3BlcnR5UGF0aCxcblx0XHRvRGF0YUZpZWxkQ29udmVydGVkLFxuXHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdHRydWUsXG5cdFx0aXNFZGl0YWJsZSxcblx0XHRjb25zaWRlclVwZGF0ZVJlc3RyaWN0aW9uc1xuXHQpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZWRpdGFibGVcIiBCb29sZWFuIHZhbHVlLlxuICogQHBhcmFtIG9Qcm9wZXJ0eVBhdGggVGhlIGlucHV0IHByb3BlcnR5XG4gKiBAcGFyYW0gb0RhdGFGaWVsZENvbnZlcnRlZCBUaGUgRGF0YUZpZWxkQ29udmVydGVkIG9iamVjdCB0byByZWFkIHRoZSBmaWVsZENvbnRyb2wgYW5ub3RhdGlvblxuICogQHBhcmFtIG9EYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBwYXRoIHRvIHRoaXMgcHJvcGVydHkgb2JqZWN0XG4gKiBAcGFyYW0gYkFzT2JqZWN0IFdoZXRoZXIgb3Igbm90IHRoaXMgc2hvdWxkIGJlIHJldHVybmVkIGFzIGFuIG9iamVjdCBvciBhIGJpbmRpbmcgc3RyaW5nXG4gKiBAcGFyYW0gaXNFZGl0YWJsZSBXaGV0aGVyIG9yIG5vdCBVSS5Jc0VkaXRhYmxlIGJlIGNvbnNpZGVyZWQuXG4gKiBAcGFyYW0gY29uc2lkZXJVcGRhdGVSZXN0cmljdGlvbnMgV2hldGhlciB3ZSB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IFVwZGF0ZVJlc3RyaWN0aW9ucyB0byBjb21wdXRlIHRoZSBlZGl0YWJsZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB1c2VkIHRvIGRldGVybWluZSBpZiBhIHByb3BlcnR5IGlzIGVkaXRhYmxlIG9yIG5vdFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdGFibGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ6IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcblx0b0RhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj4sXG5cdGJBc09iamVjdCA9IGZhbHNlLFxuXHRpc0VkaXRhYmxlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBVSS5Jc0VkaXRhYmxlLFxuXHRjb25zaWRlclVwZGF0ZVJlc3RyaWN0aW9ucyA9IHRydWVcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgcmVsYXRpdmVQYXRoID0gZ2V0UmVsYXRpdmVQYXRocyhvRGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdGlmICghb1Byb3BlcnR5UGF0aCB8fCB0eXBlb2Ygb1Byb3BlcnR5UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihmYWxzZSk7XG5cdH1cblx0bGV0IGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQodHJ1ZSk7XG5cdGlmIChvRGF0YUZpZWxkQ29udmVydGVkICE9PSB1bmRlZmluZWQgJiYgIWlzUHJvcGVydHkob0RhdGFGaWVsZENvbnZlcnRlZCkpIHtcblx0XHRkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24gPSBpZkVsc2UoaXNOb25FZGl0YWJsZUV4cHJlc3Npb24ob0RhdGFGaWVsZENvbnZlcnRlZCksIGZhbHNlLCBpc0VkaXRhYmxlKTtcblx0fSBlbHNlIGlmIChvRGF0YUZpZWxkQ29udmVydGVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRkYXRhRmllbGRFZGl0YWJsZUV4cHJlc3Npb24gPSBpc0VkaXRhYmxlO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5ID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgPyBvUHJvcGVydHlQYXRoLiR0YXJnZXQgOiBvUHJvcGVydHlQYXRoO1xuXG5cdC8vIEVkaXRhYmlsaXR5IGRlcGVuZHMgb24gdGhlIGZpZWxkIGNvbnRyb2wgZXhwcmVzc2lvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBzdGF0aWNhbGx5IGluIFJlYWRPbmx5IG9yIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpIC0+IG5vdCBlZGl0YWJsZVxuXHQvLyBJZiB0aGUgcHJvcGVydHkgaXMgYSBrZXkgLT4gbm90IGVkaXRhYmxlIGV4Y2VwdCBpbiBjcmVhdGlvbiBpZiBub3QgY29tcHV0ZWRcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIGNvbXB1dGVkIC0+IG5vdCBlZGl0YWJsZVxuXHQvLyBJZiB0aGUgcHJvcGVydHkgaXMgbm90IHVwZGF0YWJsZSAtPiBub3QgZWRpdGFibGVcblx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIGltbXV0YWJsZSAtPiBub3QgZWRpdGFibGUgZXhjZXB0IGluIGNyZWF0aW9uXG5cdC8vIElmIHRoZSBGaWVsZCBjb250cm9sIGlzIGEgcGF0aCByZXNvbHZpbmcgdG8gUmVhZE9ubHkgb3IgSW5hcHBsaWNhYmxlIChkaXNhYmxlZCkgKDw9IDEpIC0+IG5vdCBlZGl0YWJsZVxuXHQvLyBFbHNlLCB0byBiZSBlZGl0YWJsZSB5b3UgbmVlZFxuXHQvLyBpbW11dGFibGUgYW5kIGtleSB3aGlsZSBpbiB0aGUgY3JlYXRpb24gcm93XG5cdC8vIHVpL2lzRWRpdGFibGVcblx0Y29uc3QgaXNQYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiA9IGlzUGF0aFVwZGF0YWJsZShvRGF0YU1vZGVsT2JqZWN0UGF0aCwge1xuXHRcdHByb3BlcnR5UGF0aDogb1Byb3BlcnR5UGF0aCxcblx0XHRwYXRoVmlzaXRvcjogKHBhdGg6IHN0cmluZywgbmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSkgPT5cblx0XHRcdHNpbmdsZXRvblBhdGhWaXNpdG9yKHBhdGgsIG9EYXRhTW9kZWxPYmplY3RQYXRoLmNvbnZlcnRlZFR5cGVzLCBuYXZpZ2F0aW9uUGF0aHMpXG5cdH0pO1xuXHRpZiAoY29tcGlsZUV4cHJlc3Npb24oaXNQYXRoVXBkYXRhYmxlRXhwcmVzc2lvbikgPT09IFwiZmFsc2VcIiAmJiBjb25zaWRlclVwZGF0ZVJlc3RyaWN0aW9ucykge1xuXHRcdHJldHVybiBiQXNPYmplY3QgPyBpc1BhdGhVcGRhdGFibGVFeHByZXNzaW9uIDogXCJmYWxzZVwiO1xuXHR9XG5cdGNvbnN0IGVkaXRhYmxlRXhwcmVzc2lvbiA9XG5cdFx0b1Byb3BlcnR5ICE9PSB1bmRlZmluZWRcblx0XHRcdD8gaWZFbHNlKFxuXHRcdFx0XHRcdG9yKFxuXHRcdFx0XHRcdFx0YW5kKG5vdChpc1BhdGhVcGRhdGFibGVFeHByZXNzaW9uKSwgY29uc2lkZXJVcGRhdGVSZXN0cmljdGlvbnMpLFxuXHRcdFx0XHRcdFx0aXNDb21wdXRlZChvUHJvcGVydHkpLFxuXHRcdFx0XHRcdFx0aXNLZXkob1Byb3BlcnR5KSxcblx0XHRcdFx0XHRcdGlzSW1tdXRhYmxlKG9Qcm9wZXJ0eSksXG5cdFx0XHRcdFx0XHRpc05vbkVkaXRhYmxlRXhwcmVzc2lvbihvUHJvcGVydHksIHJlbGF0aXZlUGF0aClcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGlmRWxzZShvcihpc0NvbXB1dGVkKG9Qcm9wZXJ0eSksIGlzTm9uRWRpdGFibGVFeHByZXNzaW9uKG9Qcm9wZXJ0eSwgcmVsYXRpdmVQYXRoKSksIGZhbHNlLCBVSS5Jc1RyYW5zaWVudEJpbmRpbmcpLFxuXHRcdFx0XHRcdGlzRWRpdGFibGVcblx0XHRcdCAgKVxuXHRcdFx0OiB1bnJlc29sdmFibGVFeHByZXNzaW9uO1xuXHRpZiAoYkFzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGFuZChlZGl0YWJsZUV4cHJlc3Npb24sIGRhdGFGaWVsZEVkaXRhYmxlRXhwcmVzc2lvbikpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbGxhYm9yYXRpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gPFQ+KFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0Zm9ybWF0dGVyOiBGbjxUPlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+IHtcblx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldFRhcmdldE9iamVjdFBhdGgoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdGNvbnN0IGFjdGl2aXR5RXhwcmVzc2lvbiA9IHBhdGhJbk1vZGVsKGAvY29sbGFib3JhdGlvbi9hY3Rpdml0aWVzJHtvYmplY3RQYXRofWAsIFwiaW50ZXJuYWxcIik7XG5cdGNvbnN0IGtleXMgPSBkYXRhTW9kZWxPYmplY3RQYXRoPy5jb250ZXh0TG9jYXRpb24/LnRhcmdldEVudGl0eVR5cGU/LmtleXM7XG5cdGNvbnN0IGtleXNFeHByZXNzaW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHVua25vd24+W10gPSBbXTtcblx0a2V5cz8uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0Y29uc3Qga2V5RXhwcmVzc2lvbiA9IHBhdGhJbk1vZGVsKGtleS5uYW1lKTtcblx0XHRrZXlzRXhwcmVzc2lvbnMucHVzaChrZXlFeHByZXNzaW9uKTtcblx0fSk7XG5cdHJldHVybiBmb3JtYXRSZXN1bHQoW2FjdGl2aXR5RXhwcmVzc2lvbiwgLi4ua2V5c0V4cHJlc3Npb25zXSwgZm9ybWF0dGVyKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RW5hYmxlZEV4cHJlc3Npb25Bc09iamVjdCA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRvRGF0YUZpZWxkQ29udmVydGVkPzogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzLFxuXHRvRGF0YU1vZGVsT2JqZWN0UGF0aD86IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBnZXRFbmFibGVkRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoLCBvRGF0YUZpZWxkQ29udmVydGVkLCB0cnVlLCBvRGF0YU1vZGVsT2JqZWN0UGF0aCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+O1xufTtcbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZW5hYmxlZFwiIEJvb2xlYW4gdmFsdWUuXG4gKiBAcGFyYW0gb1Byb3BlcnR5UGF0aCBUaGUgaW5wdXQgcHJvcGVydHlcbiAqIEBwYXJhbSBvRGF0YUZpZWxkQ29udmVydGVkIFRoZSBEYXRhRmllbGRDb252ZXJ0ZWQgT2JqZWN0IHRvIHJlYWQgdGhlIGZpZWxkQ29udHJvbCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gYkFzT2JqZWN0IFdoZXRoZXIgb3Igbm90IHRoaXMgc2hvdWxkIGJlIHJldHVybmVkIGFzIGFuIG9iamVjdCBvciBhIGJpbmRpbmcgc3RyaW5nXG4gKiBAcGFyYW0gb0RhdGFNb2RlbE9iamVjdFBhdGhcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gZGV0ZXJtaW5lIGlmIGEgcHJvcGVydHkgaXMgZW5hYmxlZCBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVuYWJsZWRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMsXG5cdGJBc09iamVjdCA9IGZhbHNlLFxuXHRvRGF0YU1vZGVsT2JqZWN0UGF0aD86IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj5cbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0aWYgKCFvUHJvcGVydHlQYXRoIHx8IHR5cGVvZiBvUHJvcGVydHlQYXRoID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHRydWUpO1xuXHR9XG5cdGxldCByZWxhdGl2ZVBhdGg7XG5cdGlmIChvRGF0YU1vZGVsT2JqZWN0UGF0aCkge1xuXHRcdHJlbGF0aXZlUGF0aCA9IGdldFJlbGF0aXZlUGF0aHMob0RhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHR9XG5cdGxldCBkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQodHJ1ZSk7XG5cdGlmIChvRGF0YUZpZWxkQ29udmVydGVkICE9PSB1bmRlZmluZWQgJiYgIWlzUHJvcGVydHkob0RhdGFGaWVsZENvbnZlcnRlZCkpIHtcblx0XHRkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbiA9IGlmRWxzZShpc0Rpc2FibGVkRXhwcmVzc2lvbihvRGF0YUZpZWxkQ29udmVydGVkKSwgZmFsc2UsIHRydWUpO1xuXHR9XG5cblx0Y29uc3Qgb1Byb3BlcnR5ID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgPyBvUHJvcGVydHlQYXRoLiR0YXJnZXQgOiBvUHJvcGVydHlQYXRoO1xuXHQvLyBFbmFibGVtZW50IGRlcGVuZHMgb24gdGhlIGZpZWxkIGNvbnRyb2wgZXhwcmVzc2lvblxuXHQvLyBJZiB0aGUgRmllbGQgY29udHJvbCBpcyBzdGF0aWNhbGx5IGluIEluYXBwbGljYWJsZSAoZGlzYWJsZWQpIC0+IG5vdCBlbmFibGVkXG5cdGNvbnN0IGVuYWJsZWRFeHByZXNzaW9uID1cblx0XHRvUHJvcGVydHkgIT09IHVuZGVmaW5lZCA/IGlmRWxzZShpc0Rpc2FibGVkRXhwcmVzc2lvbihvUHJvcGVydHksIHJlbGF0aXZlUGF0aCksIGZhbHNlLCB0cnVlKSA6IHVucmVzb2x2YWJsZUV4cHJlc3Npb247XG5cdGlmIChiQXNPYmplY3QpIHtcblx0XHRyZXR1cm4gYW5kKGVuYWJsZWRFeHByZXNzaW9uLCBkYXRhRmllbGRFbmFibGVkRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGFuZChlbmFibGVkRXhwcmVzc2lvbiwgZGF0YUZpZWxkRW5hYmxlZEV4cHJlc3Npb24pKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBleHByZXNzaW9uIHRvIGdlbmVyYXRlIGFuIFwiZWRpdE1vZGVcIiBlbnVtIHZhbHVlLlxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgaW5wdXQgcHJvcGVydHlcbiAqIEBwYXJhbSBkYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBsaXN0IG9mIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IGFyZSBpbnZvbHZlZCB0byByZWFjaCB0aGF0IHByb3BlcnR5XG4gKiBAcGFyYW0gbWVhc3VyZVJlYWRPbmx5IFdoZXRoZXIgd2Ugc2hvdWxkIHNldCBVb00gLyBjdXJyZW5jeSBmaWVsZCBtb2RlIHRvIHJlYWQgb25seVxuICogQHBhcmFtIGFzT2JqZWN0IFdoZXRoZXIgd2Ugc2hvdWxkIHJldHVybiB0aGlzIGFzIGFuIGV4cHJlc3Npb24gb3IgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSBkYXRhRmllbGRDb252ZXJ0ZWQgVGhlIGRhdGFGaWVsZCBvYmplY3RcbiAqIEBwYXJhbSBpc0VkaXRhYmxlIFdoZXRoZXIgb3Igbm90IFVJLklzRWRpdGFibGUgYmUgY29uc2lkZXJlZC5cbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHByb3BlcnR5IGVkaXQgbW9kZSwgY29tcGxpYW50IHdpdGggdGhlIE1EQyBGaWVsZCBkZWZpbml0aW9uIG9mIGVkaXRNb2RlLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdE1vZGUgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPHVua25vd24+LFxuXHRtZWFzdXJlUmVhZE9ubHkgPSBmYWxzZSxcblx0YXNPYmplY3QgPSBmYWxzZSxcblx0ZGF0YUZpZWxkQ29udmVydGVkOiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG5cdGlzRWRpdGFibGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IFVJLklzRWRpdGFibGVcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRpZiAoXG5cdFx0IXByb3BlcnR5UGF0aCB8fFxuXHRcdHR5cGVvZiBwcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIgfHxcblx0XHQoIWlzUHJvcGVydHkoZGF0YUZpZWxkQ29udmVydGVkKSAmJiBkYXRhRmllbGRDb252ZXJ0ZWQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGgpXG5cdCkge1xuXHRcdHJldHVybiBGaWVsZEVkaXRNb2RlLkRpc3BsYXk7XG5cdH1cblx0Y29uc3QgcHJvcGVydHkgPSBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eVBhdGgpID8gcHJvcGVydHlQYXRoLiR0YXJnZXQgOiBwcm9wZXJ0eVBhdGg7XG5cdGNvbnN0IHJlbGF0aXZlUGF0aCA9IGdldFJlbGF0aXZlUGF0aHMoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdGNvbnN0IGlzUGF0aFVwZGF0YWJsZUV4cHJlc3Npb24gPSBpc1BhdGhVcGRhdGFibGUoZGF0YU1vZGVsT2JqZWN0UGF0aCwge1xuXHRcdHByb3BlcnR5UGF0aDogcHJvcGVydHksXG5cdFx0cGF0aFZpc2l0b3I6IChwYXRoOiBzdHJpbmcsIG5hdmlnYXRpb25QYXRoczogc3RyaW5nW10pID0+XG5cdFx0XHRzaW5nbGV0b25QYXRoVmlzaXRvcihwYXRoLCBkYXRhTW9kZWxPYmplY3RQYXRoLmNvbnZlcnRlZFR5cGVzLCBuYXZpZ2F0aW9uUGF0aHMpXG5cdH0pO1xuXG5cdC8vIHdlIGdldCB0aGUgZWRpdGFibGUgRXhwcmVzc2lvbiB3aXRob3V0IGNvbnNpZGVyaW5nIHVwZGF0ZSBSZXN0cmljdGlvbnMgYmVjYXVzZSB0aGV5IGFyZSBoYW5kbGVkIHNlcGFyYXRlbHlcblx0Y29uc3QgZWRpdGFibGVFeHByZXNzaW9uID0gZ2V0RWRpdGFibGVFeHByZXNzaW9uQXNPYmplY3QocHJvcGVydHlQYXRoLCBkYXRhRmllbGRDb252ZXJ0ZWQsIGRhdGFNb2RlbE9iamVjdFBhdGgsIGlzRWRpdGFibGUsIGZhbHNlKTtcblxuXHRjb25zdCBlbmFibGVkRXhwcmVzc2lvbiA9IGdldEVuYWJsZWRFeHByZXNzaW9uQXNPYmplY3QocHJvcGVydHlQYXRoLCBkYXRhRmllbGRDb252ZXJ0ZWQsIGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRjb25zdCBhc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KHByb3BlcnR5KTtcblx0Y29uc3QgdW5pdFByb3BlcnR5ID0gYXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdGxldCByZXN1bHRFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiA9IGNvbnN0YW50KEZpZWxkRWRpdE1vZGUuRWRpdGFibGUpO1xuXHRpZiAodW5pdFByb3BlcnR5KSB7XG5cdFx0Y29uc3QgaXNVbml0UmVhZE9ubHkgPSBpc1JlYWRPbmx5RXhwcmVzc2lvbih1bml0UHJvcGVydHksIHJlbGF0aXZlUGF0aCk7XG5cdFx0cmVzdWx0RXhwcmVzc2lvbiA9IGlmRWxzZShcblx0XHRcdG9yKGlzVW5pdFJlYWRPbmx5LCBpc0NvbXB1dGVkKHVuaXRQcm9wZXJ0eSksIGFuZChpc0ltbXV0YWJsZSh1bml0UHJvcGVydHkpLCBub3QoVUkuSXNUcmFuc2llbnRCaW5kaW5nKSksIG1lYXN1cmVSZWFkT25seSksXG5cdFx0XHRpZkVsc2UoIWlzQ29uc3RhbnQoaXNVbml0UmVhZE9ubHkpICYmIGlzVW5pdFJlYWRPbmx5LCBGaWVsZEVkaXRNb2RlLkVkaXRhYmxlUmVhZE9ubHksIEZpZWxkRWRpdE1vZGUuRWRpdGFibGVEaXNwbGF5KSxcblx0XHRcdEZpZWxkRWRpdE1vZGUuRWRpdGFibGVcblx0XHQpO1xuXHR9XG5cdGlmICghdW5pdFByb3BlcnR5ICYmIChwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSB8fCBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0KSkge1xuXHRcdC8vIG5vIHVuaXQgcHJvcGVydHkgYXNzb2NpYXRlZCBtZWFucyB0aGlzIGlzIGEgc3RhdGljIHVuaXRcblx0XHRyZXN1bHRFeHByZXNzaW9uID0gY29uc3RhbnQoRmllbGRFZGl0TW9kZS5FZGl0YWJsZURpc3BsYXkpO1xuXHR9XG5cdGxldCByZWFkT25seUV4cHJlc3Npb247XG5cdGlmIChkYXRhRmllbGRDb252ZXJ0ZWQgIT0gdW5kZWZpbmVkICYmICFpc1Byb3BlcnR5KGRhdGFGaWVsZENvbnZlcnRlZCkpIHtcblx0XHRyZWFkT25seUV4cHJlc3Npb24gPSBvcihpc1JlYWRPbmx5RXhwcmVzc2lvbihwcm9wZXJ0eSwgcmVsYXRpdmVQYXRoKSwgaXNSZWFkT25seUV4cHJlc3Npb24oZGF0YUZpZWxkQ29udmVydGVkKSk7XG5cdH0gZWxzZSB7XG5cdFx0cmVhZE9ubHlFeHByZXNzaW9uID0gaXNSZWFkT25seUV4cHJlc3Npb24ocHJvcGVydHksIHJlbGF0aXZlUGF0aCk7XG5cdH1cblxuXHQvLyBpZiB0aGVyZSBhcmUgdXBkYXRlIFJlc3RyaWN0aW9ucyBpdCBpcyBhbHdheXMgZGlzcGxheSBtb2RlXG5cdGNvbnN0IGVkaXRNb2RlRXhwcmVzc2lvbiA9IGlmRWxzZShcblx0XHRvcihpc1BhdGhVcGRhdGFibGVFeHByZXNzaW9uLCBVSS5Jc1RyYW5zaWVudEJpbmRpbmcpLFxuXHRcdGlmRWxzZShcblx0XHRcdGVuYWJsZWRFeHByZXNzaW9uLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRlZGl0YWJsZUV4cHJlc3Npb24sXG5cdFx0XHRcdHJlc3VsdEV4cHJlc3Npb24sXG5cdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRhbmQoIWlzQ29uc3RhbnQocmVhZE9ubHlFeHByZXNzaW9uKSAmJiByZWFkT25seUV4cHJlc3Npb24sIGlzRWRpdGFibGUpLFxuXHRcdFx0XHRcdEZpZWxkRWRpdE1vZGUuUmVhZE9ubHksXG5cdFx0XHRcdFx0RmllbGRFZGl0TW9kZS5EaXNwbGF5XG5cdFx0XHRcdClcblx0XHRcdCksXG5cdFx0XHRpZkVsc2UoaXNFZGl0YWJsZSwgRmllbGRFZGl0TW9kZS5EaXNhYmxlZCwgRmllbGRFZGl0TW9kZS5EaXNwbGF5KVxuXHRcdCksXG5cdFx0RmllbGRFZGl0TW9kZS5EaXNwbGF5XG5cdCk7XG5cdGlmIChhc09iamVjdCkge1xuXHRcdHJldHVybiBlZGl0TW9kZUV4cHJlc3Npb247XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGVkaXRNb2RlRXhwcmVzc2lvbik7XG59O1xuXG5leHBvcnQgY29uc3QgaGFzVmFsaWRBbmFseXRpY2FsQ3VycmVuY3lPclVuaXQgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+IHwgdW5kZWZpbmVkXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eURlZmluaXRpb24gPSBvUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRPYmplY3Q7XG5cdGNvbnN0IGN1cnJlbmN5ID0gb1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeTtcblx0Y29uc3QgbWVhc3VyZSA9IGN1cnJlbmN5ID8gY3VycmVuY3kgOiBvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdGlmIChtZWFzdXJlKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKG9yKGlzVHJ1dGh5KGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihtZWFzdXJlKSksIG5vdChVSS5Jc1RvdGFsKSkpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihjb25zdGFudCh0cnVlKSk7XG5cdH1cbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBmaWVsZERpc3BsYXkuXG4gKiBAcGFyYW0gb1Byb3BlcnR5UGF0aFxuICogQHBhcmFtIHNUYXJnZXREaXNwbGF5TW9kZVxuICogQHBhcmFtIG9Db21wdXRlZEVkaXRNb2RlXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBwcm9wZXJ0eSBkaXNwbGF5IG1vZGUsIGNvbXBsaWFudCB3aXRoIHRoZSBNREMgRmllbGQgZGVmaW5pdGlvbiBvZiBkaXNwbGF5TW9kZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZpZWxkRGlzcGxheSA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5UGF0aDogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRzVGFyZ2V0RGlzcGxheU1vZGU6IHN0cmluZyxcblx0b0NvbXB1dGVkRWRpdE1vZGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+XG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IG9Qcm9wZXJ0eSA9IChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihvUHJvcGVydHlQYXRoKSAmJiBvUHJvcGVydHlQYXRoLiR0YXJnZXQpIHx8IChvUHJvcGVydHlQYXRoIGFzIFByb3BlcnR5KTtcblx0Y29uc3QgaGFzVGV4dEFubm90YXRpb24gPSBvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCAhPT0gdW5kZWZpbmVkO1xuXG5cdGlmIChoYXNWYWx1ZUhlbHAob1Byb3BlcnR5KSkge1xuXHRcdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihzVGFyZ2V0RGlzcGxheU1vZGUpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBoYXNUZXh0QW5ub3RhdGlvbiA/IGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShlcXVhbChvQ29tcHV0ZWRFZGl0TW9kZSwgXCJFZGl0YWJsZVwiKSwgXCJWYWx1ZVwiLCBzVGFyZ2V0RGlzcGxheU1vZGUpKSA6IFwiVmFsdWVcIjtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGdldFR5cGVDb25maWcgPSBmdW5jdGlvbiAob1Byb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBDb25maWdUeXBlIHtcblx0Y29uc3Qgb1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWyhvUHJvcGVydHkgYXMgUHJvcGVydHkpPy50eXBlXSB8fCAoZGF0YVR5cGUgPyBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXSA6IHVuZGVmaW5lZCk7XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZzogQ29uZmlnVHlwZSA9IHtcblx0XHR0eXBlOiBvVGFyZ2V0TWFwcGluZy50eXBlLFxuXHRcdGNvbnN0cmFpbnRzOiB7fSxcblx0XHRmb3JtYXRPcHRpb25zOiB7fVxuXHR9O1xuXHRpZiAoaXNQcm9wZXJ0eShvUHJvcGVydHkpKSB7XG5cdFx0cHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzID0ge1xuXHRcdFx0c2NhbGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kU2NhbGUgPyBvUHJvcGVydHkuc2NhbGUgOiB1bmRlZmluZWQsXG5cdFx0XHRwcmVjaXNpb246IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kUHJlY2lzaW9uID8gb1Byb3BlcnR5LnByZWNpc2lvbiA6IHVuZGVmaW5lZCxcblx0XHRcdG1heExlbmd0aDogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRNYXhMZW5ndGggPyBvUHJvcGVydHkubWF4TGVuZ3RoIDogdW5kZWZpbmVkLFxuXHRcdFx0bnVsbGFibGU6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kTnVsbGFibGUgPyBvUHJvcGVydHkubnVsbGFibGUgOiB1bmRlZmluZWQsXG5cdFx0XHRtaW5pbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbmltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRtYXhpbXVtOlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW0vJERlY2ltYWxcIl0gJiZcblx0XHRcdFx0IWlzTmFOKG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bSlcblx0XHRcdFx0XHQ/IGAke29Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bX1gXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRpc0RpZ2l0U2VxdWVuY2U6XG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiICYmXG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLklzRGlnaXRTZXF1ZW5jZVwiXSAmJlxuXHRcdFx0XHRvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNEaWdpdFNlcXVlbmNlXG5cdFx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRWNDogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRWNCA/IHRydWUgOiB1bmRlZmluZWRcblx0XHR9O1xuXHR9XG5cdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zID0ge1xuXHRcdHBhcnNlQXNTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IGZhbHNlXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdGVtcHR5U3RyaW5nOlxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHBhcnNlS2VlcHNFbXB0eVN0cmluZzogcHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgPyB0cnVlIDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVDb25maWc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29uc3RyYWludE9wdGlvbnMgPSBmdW5jdGlvbiAocHJvcGVydHk6IFByb3BlcnR5IHwgdW5kZWZpbmVkKTogQ29tcGxleFR5cGVDb25zdHJhaW50T3B0aW9ucyB7XG5cdHJldHVybiBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LlVJPy5Eb05vdENoZWNrU2NhbGVPZk1lYXN1cmVkUXVhbnRpdHkgJiZcblx0XHRwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LlVJLkRvTm90Q2hlY2tTY2FsZU9mTWVhc3VyZWRRdWFudGl0eT8udmFsdWVPZigpXG5cdFx0PyB7IHNraXBEZWNpbWFsc1ZhbGlkYXRpb246IHRydWUgfVxuXHRcdDoge307XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmluZGluZ1dpdGhVbml0T3JDdXJyZW5jeSA9IGZ1bmN0aW9uIChcblx0b1Byb3BlcnR5RGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRpZ25vcmVVbml0Q29uc3RyYWludD86IGJvb2xlYW4sXG5cdGZvcm1hdE9wdGlvbnM/OiB7XG5cdFx0c2hvd01lYXN1cmU/OiBib29sZWFuO1xuXHRcdGRlY2ltYWxQYWRkaW5nPzogbnVtYmVyO1xuXHR9LFxuXHRmb3JEaXNwbGF5TW9kZT86IGJvb2xlYW4sXG5cdHNob3dPbmx5VW5pdERlY2ltYWxzPzogYm9vbGVhblxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdGxldCB1bml0ID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdGNvbnN0IHJlbGF0aXZlTG9jYXRpb24gPSBnZXRSZWxhdGl2ZVBhdGhzKG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgpO1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihvUHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uKTtcblx0aWYgKGhhc1N0YXRpY1BlcmNlbnRVbml0KG9Qcm9wZXJ0eURlZmluaXRpb24pKSB7XG5cdFx0aWYgKGZvcm1hdE9wdGlvbnM/LnNob3dNZWFzdXJlID09PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb247XG5cdFx0fVxuXHRcdHJldHVybiBmb3JtYXRSZXN1bHQoW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb25dLCB2YWx1ZUZvcm1hdHRlcnMuZm9ybWF0V2l0aFBlcmNlbnRhZ2UpO1xuXHR9XG5cdGNvbnN0IGNvbXBsZXhUeXBlID0gdW5pdCA/IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiIDogXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5DdXJyZW5jeVwiO1xuXHR1bml0ID0gdW5pdCA/IHVuaXQgOiAob1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IGFzIHVua25vd24gYXMgVW5pdCB8IHVuZGVmaW5lZCk7XG5cdGNvbnN0IHVuaXRCaW5kaW5nRXhwcmVzc2lvbiA9XG5cdFx0aXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odW5pdCkgJiYgdW5pdC4kdGFyZ2V0XG5cdFx0XHQ/IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24odW5pdC4kdGFyZ2V0LCBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odW5pdCwgcmVsYXRpdmVMb2NhdGlvbiksIGlnbm9yZVVuaXRDb25zdHJhaW50KVxuXHRcdFx0OiBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odW5pdCwgcmVsYXRpdmVMb2NhdGlvbik7XG5cdGxldCBjb25zdHJhaW50T3B0aW9uczogQ29tcGxleFR5cGVDb25zdHJhaW50T3B0aW9ucyB8IHVuZGVmaW5lZDtcblx0aWYgKGNvbXBsZXhUeXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlVuaXRcIikge1xuXHRcdGlmIChmb3JEaXNwbGF5TW9kZSAmJiAhc2hvd09ubHlVbml0RGVjaW1hbHMpIHtcblx0XHRcdGNvbnN0cmFpbnRPcHRpb25zID0geyBza2lwRGVjaW1hbHNWYWxpZGF0aW9uOiB0cnVlIH07XG5cdFx0fSBlbHNlIGlmICghZm9yRGlzcGxheU1vZGUpIHtcblx0XHRcdC8vIENvbnNpZGVyIGFubm90YXRpb24gb25seSBpbiBlZGl0IG1vZGVcblx0XHRcdGNvbnN0cmFpbnRPcHRpb25zID0gZ2V0Q29uc3RyYWludE9wdGlvbnMob1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oW3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHVuaXRCaW5kaW5nRXhwcmVzc2lvbl0sIGNvbXBsZXhUeXBlLCB1bmRlZmluZWQsIGZvcm1hdE9wdGlvbnMsIGNvbnN0cmFpbnRPcHRpb25zKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBkYXRlIHBpY2tlciB3aXRoIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUgcHJlc2VudC5cbiAqIEBwYXJhbSBvUHJvcGVydHlEYXRhTW9kZWxQYXRoIFRoZSBsaXN0IG9mIGRhdGEgbW9kZWwgb2JqZWN0cyB0aGF0IGFyZSBpbnZvbHZlZCB0byByZWFjaCB0aGF0IHByb3BlcnR5XG4gKiBAcGFyYW0gcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiBCaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGRhdGUgcHJvcGVydHkgd2l0aCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlIGZvciB0aGUgc2FtZVxuICovXG5leHBvcnQgY29uc3QgZ2V0QmluZGluZ0ZvckRhdGVQaWNrZXIgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHkgfCBEYXRhRmllbGRUeXBlcz4sXG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB8IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgudGFyZ2V0T2JqZWN0IGFzIFByb3BlcnR5O1xuXHRjb25zdCByZWxhdGl2ZUxvY2F0aW9uID0gZ2V0UmVsYXRpdmVQYXRocyhvUHJvcGVydHlEYXRhTW9kZWxQYXRoKTtcblx0Y29uc3QgZm9ybWF0T3B0aW9ucyA9IHt9O1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uID0gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihvUHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uKTtcblx0Y29uc3QgY29tcGxleFR5cGUgPSBcInNhcC5mZS5jb3JlLnR5cGUuRGF0ZVwiO1xuXHRjb25zdCBtaW5EYXRlID0gb1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW0/LiREYXRlXG5cdFx0PyBvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWluaW11bT8uJERhdGVcblx0XHQ6IG9Qcm9wZXJ0eURlZmluaXRpb24/LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtO1xuXHRjb25zdCBtYXhEYXRlID0gb1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW0/LiREYXRlXG5cdFx0PyBvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bT8uJERhdGVcblx0XHQ6IG9Qcm9wZXJ0eURlZmluaXRpb24/LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtO1xuXHRjb25zdCBtaW5FeHByZXNzaW9uID1cblx0XHRtaW5EYXRlICYmIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKG1pbkRhdGUpXG5cdFx0XHQ/IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0b1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW0sXG5cdFx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKG9Qcm9wZXJ0eURlZmluaXRpb24/LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtLCByZWxhdGl2ZUxvY2F0aW9uKVxuXHRcdFx0ICApXG5cdFx0XHQ6IG1pbkRhdGU7XG5cdGNvbnN0IG1heEV4cHJlc3Npb24gPVxuXHRcdG1heERhdGUgJiYgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24obWF4RGF0ZSlcblx0XHRcdD8gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRvUHJvcGVydHlEZWZpbml0aW9uPy5hbm5vdGF0aW9ucz8uVmFsaWRhdGlvbj8uTWF4aW11bSxcblx0XHRcdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbj8uYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW0sIHJlbGF0aXZlTG9jYXRpb24pXG5cdFx0XHQgIClcblx0XHRcdDogbWF4RGF0ZTtcblxuXHRyZXR1cm4gKFxuXHRcdChtaW5FeHByZXNzaW9uIHx8IG1heEV4cHJlc3Npb24pICYmXG5cdFx0YWRkVHlwZUluZm9ybWF0aW9uKFtwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLCBtaW5FeHByZXNzaW9uLCBtYXhFeHByZXNzaW9uXSwgY29tcGxleFR5cGUsIHVuZGVmaW5lZCwgZm9ybWF0T3B0aW9ucylcblx0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nRm9yVW5pdE9yQ3VycmVuY3kgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+IHwgdW5kZWZpbmVkLFxuXHRmb3JEaXNwbGF5TW9kZTogYm9vbGVhbixcblx0c2hvd09ubHlVbml0RGVjaW1hbHM6IGJvb2xlYW5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+IHwgc3RyaW5nIHtcblx0Y29uc3Qgb1Byb3BlcnR5RGVmaW5pdGlvbiA9IG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGg/LnRhcmdldE9iamVjdDtcblx0aWYgKCFvUHJvcGVydHlEZWZpbml0aW9uKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHRsZXQgdW5pdCA9IG9Qcm9wZXJ0eURlZmluaXRpb24uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRpZiAoaGFzU3RhdGljUGVyY2VudFVuaXQob1Byb3BlcnR5RGVmaW5pdGlvbikpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoXCIlXCIpO1xuXHR9XG5cdGNvbnN0IHJlbGF0aXZlTG9jYXRpb24gPSBnZXRSZWxhdGl2ZVBhdGhzKG9Qcm9wZXJ0eURhdGFNb2RlbFBhdGgpO1xuXG5cdGNvbnN0IGNvbXBsZXhUeXBlID0gdW5pdCA/IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiIDogXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5DdXJyZW5jeVwiO1xuXHR1bml0ID0gdW5pdCA/IHVuaXQgOiAob1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IGFzIHVua25vd24gYXMgVW5pdCB8IHVuZGVmaW5lZCk7XG5cdGNvbnN0IHVuaXRCaW5kaW5nRXhwcmVzc2lvbiA9XG5cdFx0aXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odW5pdCkgJiYgdW5pdC4kdGFyZ2V0XG5cdFx0XHQ/IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24odW5pdC4kdGFyZ2V0LCBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odW5pdCwgcmVsYXRpdmVMb2NhdGlvbikpXG5cdFx0XHQ6IGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih1bml0LCByZWxhdGl2ZUxvY2F0aW9uKTtcblxuXHRsZXQgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IHBhdGhJbk1vZGVsKFxuXHRcdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgob1Byb3BlcnR5RGF0YU1vZGVsUGF0aClcblx0KSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPjtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ob1Byb3BlcnR5RGVmaW5pdGlvbiwgcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiwgdHJ1ZSk7XG5cdGxldCBjb25zdHJhaW50T3B0aW9uczogQ29tcGxleFR5cGVDb25zdHJhaW50T3B0aW9ucyB8IHVuZGVmaW5lZDtcblx0aWYgKGNvbXBsZXhUeXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlVuaXRcIikge1xuXHRcdGlmIChmb3JEaXNwbGF5TW9kZSAmJiAhc2hvd09ubHlVbml0RGVjaW1hbHMpIHtcblx0XHRcdGNvbnN0cmFpbnRPcHRpb25zID0geyBza2lwRGVjaW1hbHNWYWxpZGF0aW9uOiB0cnVlIH07XG5cdFx0fSBlbHNlIGlmICghZm9yRGlzcGxheU1vZGUpIHtcblx0XHRcdGNvbnN0cmFpbnRPcHRpb25zID0gZ2V0Q29uc3RyYWludE9wdGlvbnMob1Byb3BlcnR5RGVmaW5pdGlvbik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhZGRUeXBlSW5mb3JtYXRpb24oXG5cdFx0W3Byb3BlcnR5QmluZGluZ0V4cHJlc3Npb24sIHVuaXRCaW5kaW5nRXhwcmVzc2lvbl0sXG5cdFx0Y29tcGxleFR5cGUsXG5cdFx0dW5kZWZpbmVkLFxuXHRcdHtcblx0XHRcdHBhcnNlS2VlcHNFbXB0eVN0cmluZzogdHJ1ZSxcblx0XHRcdHNob3dOdW1iZXI6IGZhbHNlXG5cdFx0fSxcblx0XHRjb25zdHJhaW50T3B0aW9uc1xuXHQpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRCaW5kaW5nV2l0aFRpbWV6b25lID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4sXG5cdGlnbm9yZVVuaXRDb25zdHJhaW50ID0gZmFsc2UsXG5cdGhpZGVUaW1lem9uZUZvckVtcHR5VmFsdWVzID0gZmFsc2UsXG5cdGZpZWxkRm9ybWF0T3B0aW9ucz86IEZpZWxkRm9ybWF0T3B0aW9uc1xuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gb1Byb3BlcnR5RGF0YU1vZGVsUGF0aC50YXJnZXRPYmplY3QgYXMgUHJvcGVydHk7XG5cdGNvbnN0IHRpbWV6b25lID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblx0Y29uc3Qgc3R5bGUgPSBvUHJvcGVydHlEZWZpbml0aW9uLmFubm90YXRpb25zPy5VST8uRGF0ZVRpbWVTdHlsZTtcblx0Y29uc3QgcmVsYXRpdmVMb2NhdGlvbiA9IGdldFJlbGF0aXZlUGF0aHMob1Byb3BlcnR5RGF0YU1vZGVsUGF0aCk7XG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gPSBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKG9Qcm9wZXJ0eURlZmluaXRpb24sIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24pO1xuXG5cdGNvbnN0IGNvbXBsZXhUeXBlID0gXCJzYXAuZmUuY29yZS50eXBlLkRhdGVUaW1lV2l0aFRpbWV6b25lXCI7XG5cdGNvbnN0IHVuaXRCaW5kaW5nRXhwcmVzc2lvbiA9XG5cdFx0aXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odGltZXpvbmUpICYmIHRpbWV6b25lLiR0YXJnZXRcblx0XHRcdD8gZm9ybWF0V2l0aFR5cGVJbmZvcm1hdGlvbihcblx0XHRcdFx0XHQodGltZXpvbmUgYXMgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPHVua25vd24+KS4kdGFyZ2V0IGFzIFByb3BlcnR5LFxuXHRcdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih0aW1lem9uZSwgcmVsYXRpdmVMb2NhdGlvbiksXG5cdFx0XHRcdFx0aWdub3JlVW5pdENvbnN0cmFpbnRcblx0XHRcdCAgKVxuXHRcdFx0OiBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odGltZXpvbmUsIHJlbGF0aXZlTG9jYXRpb24pO1xuXHRsZXQgZm9ybWF0T3B0aW9ucyA9IHt9O1xuXHRpZiAoaGlkZVRpbWV6b25lRm9yRW1wdHlWYWx1ZXMpIHtcblx0XHRmb3JtYXRPcHRpb25zID0ge1xuXHRcdFx0c2hvd1RpbWV6b25lRm9yRW1wdHlWYWx1ZXM6IGZhbHNlXG5cdFx0fTtcblx0fVxuXHQvLyBpZiBzdHlsZSBvciBwYXR0ZXJuIGlzIGFsc28gc2V0XG5cdGlmIChzdHlsZSkge1xuXHRcdGZvcm1hdE9wdGlvbnMgPSB7IC4uLmZvcm1hdE9wdGlvbnMsIC4uLnsgc3R5bGU6IHN0eWxlIH0gfTtcblx0fSBlbHNlIGlmIChmaWVsZEZvcm1hdE9wdGlvbnM/LmRhdGVUaW1lU3R5bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdGZvcm1hdE9wdGlvbnMgPSB7IC4uLmZvcm1hdE9wdGlvbnMsIC4uLnsgc3R5bGU6IGZpZWxkRm9ybWF0T3B0aW9ucy5kYXRlVGltZVN0eWxlIH0gfTtcblx0fVxuXG5cdGlmIChmaWVsZEZvcm1hdE9wdGlvbnM/LmRhdGVUaW1lUGF0dGVybiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Zm9ybWF0T3B0aW9ucyA9IHsgLi4uZm9ybWF0T3B0aW9ucywgLi4ueyBwYXR0ZXJuOiBmaWVsZEZvcm1hdE9wdGlvbnMuZGF0ZVRpbWVQYXR0ZXJuIH0gfTtcblx0fVxuXG5cdGlmIChmaWVsZEZvcm1hdE9wdGlvbnM/LnNob3dUaW1lICE9PSB1bmRlZmluZWQpIHtcblx0XHRmb3JtYXRPcHRpb25zID0geyAuLi5mb3JtYXRPcHRpb25zLCAuLi57IHNob3dUaW1lOiBmaWVsZEZvcm1hdE9wdGlvbnMuc2hvd1RpbWUgfSB9O1xuXHR9XG5cdGlmIChmaWVsZEZvcm1hdE9wdGlvbnM/LnNob3dEYXRlICE9PSB1bmRlZmluZWQpIHtcblx0XHRmb3JtYXRPcHRpb25zID0geyAuLi5mb3JtYXRPcHRpb25zLCAuLi57IHNob3dEYXRlOiBmaWVsZEZvcm1hdE9wdGlvbnMuc2hvd0RhdGUgfSB9O1xuXHR9XG5cdGlmIChmaWVsZEZvcm1hdE9wdGlvbnM/LnNob3dUaW1lem9uZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Zm9ybWF0T3B0aW9ucyA9IHsgLi4uZm9ybWF0T3B0aW9ucywgLi4ueyBzaG93VGltZXpvbmU6IGZpZWxkRm9ybWF0T3B0aW9ucy5zaG93VGltZXpvbmUgfSB9O1xuXHR9XG5cblx0cmV0dXJuIGFkZFR5cGVJbmZvcm1hdGlvbihbcHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiwgdW5pdEJpbmRpbmdFeHByZXNzaW9uXSwgY29tcGxleFR5cGUsIHVuZGVmaW5lZCwgZm9ybWF0T3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIGRhdGUgZm9ybWF0IG9mIGEgZGF0ZSwgdGltZSBvciBkYXRlVGltZS5cbiAqIEBwYXJhbSBwcm9wZXJ0eURhdGFNb2RlbFBhdGggVGhlIGxpc3Qgb2YgZGF0YSBtb2RlbCBvYmplY3RzIHRoYXQgYXJlIGludm9sdmVkIHRvIHJlYWNoIHRoYXQgcHJvcGVydHlcbiAqIEBwYXJhbSBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uIEJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gZm9ybWF0T3B0aW9uc0RhdGVGb3JtYXQgRm9ybWF0IG9wdGlvbnMgd2hpY2ggY29udGFpbiB0aGUgc3R5bGUgb3IgcGF0dGVybiBwcm9wZXJ0eVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYSBkYXRlLCB0aW1lLCBvciBkYXRlLXRpbWUsIHdpdGggdGhlIGdpdmVuIHBhdHRlcm4gb3Igc3R5bGUgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdGb3JEYXRlRm9ybWF0ID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0eURhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPixcblx0Zm9ybWF0T3B0aW9uc0RhdGVGb3JtYXQ/OiBGb3JtYXRPcHRpb25zRGF0ZUZvcm1hdFxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBvUHJvcGVydHlEZWZpbml0aW9uID0gcHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblx0Y29uc3QgcGF0dGVybiA9IGZvcm1hdE9wdGlvbnNEYXRlRm9ybWF0Py5kYXRlVGltZVBhdHRlcm47XG5cdGNvbnN0IHN0eWxlID0gb1Byb3BlcnR5RGVmaW5pdGlvbi5hbm5vdGF0aW9ucz8uVUk/LkRhdGVUaW1lU3R5bGUgPz8gZm9ybWF0T3B0aW9uc0RhdGVGb3JtYXQ/LmRhdGVUaW1lU3R5bGU7XG5cdHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24gPSBmb3JtYXRXaXRoVHlwZUluZm9ybWF0aW9uKG9Qcm9wZXJ0eURlZmluaXRpb24sIHByb3BlcnR5QmluZGluZ0V4cHJlc3Npb24pO1xuXHRwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uLnR5cGUgPSBFRE1fVFlQRV9NQVBQSU5HW29Qcm9wZXJ0eURlZmluaXRpb24udHlwZV0udHlwZTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zID0ge1xuXHRcdC4uLihzdHlsZSAmJiB7IHN0eWxlOiBzdHlsZS50b1N0cmluZygpIH0pLFxuXHRcdC4uLihwYXR0ZXJuICYmIHsgcGF0dGVybjogcGF0dGVybiB9KVxuXHR9O1xuXG5cdHJldHVybiBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJpbmRpbmdGb3JUaW1lem9uZSA9IGZ1bmN0aW9uIChcblx0cHJvcGVydHlEYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3QgcHJvcGVydHlEZWZpbml0aW9uID0gcHJvcGVydHlEYXRhTW9kZWxQYXRoLnRhcmdldE9iamVjdCBhcyBQcm9wZXJ0eTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbiA9IGZvcm1hdFdpdGhUeXBlSW5mb3JtYXRpb24ocHJvcGVydHlEZWZpbml0aW9uLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uKTtcblx0cHJvcGVydHlCaW5kaW5nRXhwcmVzc2lvbi50eXBlID0gXCJhbnlcIjtcblx0Y29uc3QgY29tcGxleFR5cGUgPSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRhdGVUaW1lV2l0aFRpbWV6b25lXCI7XG5cdGNvbnN0IGZvcm1hdE9wdGlvbnMgPSB7IHNob3dUaW1lOiBmYWxzZSwgc2hvd0RhdGU6IGZhbHNlLCBzaG93VGltZXpvbmU6IHRydWUgfTtcblxuXHQvLyBudWxsIGlzIHJlcXVpcmVkIGJ5IGZvcm1hdHRlciB3aGVuIHRoZXJlIGlzIGp1c3QgYSB0aW1lem9uZVxuXHRyZXR1cm4gYWRkVHlwZUluZm9ybWF0aW9uKFtudWxsLCBwcm9wZXJ0eUJpbmRpbmdFeHByZXNzaW9uXSwgY29tcGxleFR5cGUsIHVuZGVmaW5lZCwgZm9ybWF0T3B0aW9ucyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWxpZ25tZW50RXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChcblx0b0NvbXB1dGVkRWRpdE1vZGU6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxzdHJpbmc+LFxuXHRzQWxpZ25EaXNwbGF5ID0gXCJCZWdpblwiLFxuXHRzQWxpZ25FZGl0ID0gXCJCZWdpblwiXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdHJldHVybiBjb21waWxlRXhwcmVzc2lvbihpZkVsc2UoZXF1YWwob0NvbXB1dGVkRWRpdE1vZGUsIFwiRGlzcGxheVwiKSwgc0FsaWduRGlzcGxheSwgc0FsaWduRWRpdCkpO1xufTtcblxuLyoqXG4gKiBGb3JtYXR0ZXIgaGVscGVyIHRvIHJldHJpZXZlIHRoZSBjb252ZXJ0ZXJDb250ZXh0IGZyb20gdGhlIG1ldGFtb2RlbCBjb250ZXh0LlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBvcmlnaW5hbCBtZXRhbW9kZWwgY29udGV4dFxuICogQHBhcmFtIG9JbnRlcmZhY2UgVGhlIGN1cnJlbnQgdGVtcGxhdGluZyBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgQ29udmVydGVyQ29udGV4dCByZXByZXNlbnRpbmcgdGhhdCBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldENvbnZlcnRlckNvbnRleHQgPSBmdW5jdGlvbiAob0NvbnRleHQ6IE1ldGFNb2RlbENvbnRleHQsIG9JbnRlcmZhY2U6IENvbXB1dGVkQW5ub3RhdGlvbkludGVyZmFjZSk6IG9iamVjdCB8IG51bGwge1xuXHRpZiAob0ludGVyZmFjZSAmJiBvSW50ZXJmYWNlLmNvbnRleHQpIHtcblx0XHRyZXR1cm4gY29udmVydE1ldGFNb2RlbENvbnRleHQob0ludGVyZmFjZS5jb250ZXh0KSBhcyBvYmplY3Q7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59O1xuZ2V0Q29udmVydGVyQ29udGV4dC5yZXF1aXJlc0lDb250ZXh0ID0gdHJ1ZTtcblxuLyoqXG4gKiBGb3JtYXR0ZXIgaGVscGVyIHRvIHJldHJpZXZlIHRoZSBkYXRhIG1vZGVsIG9iamVjdHMgdGhhdCBhcmUgaW52b2x2ZWQgZnJvbSB0aGUgbWV0YW1vZGVsIGNvbnRleHQuXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIG9yaWdpbmFsIE9EYXRhTWV0YU1vZGVsIGNvbnRleHRcbiAqIEBwYXJhbSBvSW50ZXJmYWNlIFRoZSBjdXJyZW50IHRlbXBsYXRpbmcgY29udGV4dFxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgZW50aXR5c2V0cyBhbmQgbmF2cHJvcGVydGllcyB0aGF0IGFyZSBpbnZvbHZlZCB0byBnZXQgdG8gYSBzcGVjaWZpYyBvYmplY3QgaW4gdGhlIG1ldGFtb2RlbFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGZ1bmN0aW9uIDxUPihcblx0b0NvbnRleHQ6IE1ldGFNb2RlbENvbnRleHQsXG5cdG9JbnRlcmZhY2U6IENvbXB1dGVkQW5ub3RhdGlvbkludGVyZmFjZVxuKTogRGF0YU1vZGVsT2JqZWN0UGF0aDxUPiB8IG51bGwge1xuXHRpZiAob0ludGVyZmFjZSAmJiBvSW50ZXJmYWNlLmNvbnRleHQpIHtcblx0XHRyZXR1cm4gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9JbnRlcmZhY2UuY29udGV4dCk7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59O1xuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aC5yZXF1aXJlc0lDb250ZXh0ID0gdHJ1ZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIHJlZmVyZW5jZWQgcHJvcGVydHkgaXMgcGFydCBvZiBhIDEuLm4gbmF2aWdhdGlvbi5cbiAqIEBwYXJhbSBvRGF0YU1vZGVsUGF0aCBUaGUgZGF0YSBtb2RlbCBwYXRoIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBwYXJ0IG9mIGEgMS4ubiBuYXZpZ2F0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBpc011bHRpVmFsdWVGaWVsZCA9IGZ1bmN0aW9uIChvRGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDx1bmtub3duPik6IGJvb2xlYW4ge1xuXHRpZiAob0RhdGFNb2RlbFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdGNvbnN0IGhhc09uZVRvTWFueU5hdmlnYXRpb24gPVxuXHRcdFx0b0RhdGFNb2RlbFBhdGg/Lm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmRJbmRleCgob05hdikgPT4ge1xuXHRcdFx0XHRpZiAoaXNNdWx0aXBsZU5hdmlnYXRpb25Qcm9wZXJ0eShvTmF2KSkge1xuXHRcdFx0XHRcdGlmIChvRGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24/Lm5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vd2UgY2hlY2sgdGhlIG9uZSB0byBtYW55IG5hdiBpcyBub3QgYWxyZWFkeSBwYXJ0IG9mIHRoZSBjb250ZXh0XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRvRGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24/Lm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmRJbmRleChcblx0XHRcdFx0XHRcdFx0XHQob0NvbnRleHROYXYpID0+IG9Db250ZXh0TmF2Lm5hbWUgPT09IG9OYXYubmFtZVxuXHRcdFx0XHRcdFx0XHQpID09PSAtMVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSkgPiAtMTtcblx0XHRpZiAoaGFzT25lVG9NYW55TmF2aWdhdGlvbikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uQXNPYmplY3QgPSBmdW5jdGlvbiAoXG5cdG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0b0RhdGFGaWVsZENvbnZlcnRlZD86IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyxcblx0Zm9yY2VFZGl0TW9kZSA9IGZhbHNlXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gZ2V0UmVxdWlyZWRFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgsIG9EYXRhRmllbGRDb252ZXJ0ZWQsIGZvcmNlRWRpdE1vZGUsIHRydWUpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRvUHJvcGVydHlQYXRoOiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdG9EYXRhRmllbGRDb252ZXJ0ZWQ/OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMsXG5cdGZvcmNlRWRpdE1vZGUgPSBmYWxzZSxcblx0YkFzT2JqZWN0ID0gZmFsc2UsXG5cdG9SZXF1aXJlZFByb3BlcnRpZXM6IHtcblx0XHRyZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zPzogdW5rbm93bltdO1xuXHRcdHJlcXVpcmVkUHJvcGVydGllc0Zyb21VcGRhdGVSZXN0cmljdGlvbnM/OiB1bmtub3duW107XG5cdH0gPSB7fSxcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aD86IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj5cbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgYVJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnMgPSBvUmVxdWlyZWRQcm9wZXJ0aWVzLnJlcXVpcmVkUHJvcGVydGllc0Zyb21JbnNlcnRSZXN0cmljdGlvbnM7XG5cdGNvbnN0IGFSZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zID0gb1JlcXVpcmVkUHJvcGVydGllcy5yZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zO1xuXHRpZiAoIW9Qcm9wZXJ0eVBhdGggfHwgdHlwZW9mIG9Qcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRpZiAoYkFzT2JqZWN0KSB7XG5cdFx0XHRyZXR1cm4gY29uc3RhbnQoZmFsc2UpO1xuXHRcdH1cblx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oY29uc3RhbnQoZmFsc2UpKTtcblx0fVxuXHRsZXQgcmVsYXRpdmVQYXRoO1xuXHRpZiAoZGF0YU1vZGVsT2JqZWN0UGF0aCkge1xuXHRcdHJlbGF0aXZlUGF0aCA9IGdldFJlbGF0aXZlUGF0aHMoZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdH1cblx0bGV0IGRhdGFGaWVsZFJlcXVpcmVkRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQoZmFsc2UpO1xuXHRpZiAob0RhdGFGaWVsZENvbnZlcnRlZCAhPT0gdW5kZWZpbmVkICYmICFpc1Byb3BlcnR5KG9EYXRhRmllbGRDb252ZXJ0ZWQpKSB7XG5cdFx0Ly8gRm9yIHRoZSBkYXRhZmllbGQgZXhwcmVzc2lvbiB3ZSBzaG91bGQgbm90ICBjb25zaWRlciB0aGUgcmVsYXRpdmUgcGF0aFxuXHRcdGRhdGFGaWVsZFJlcXVpcmVkRXhwcmVzc2lvbiA9IGlzUmVxdWlyZWRFeHByZXNzaW9uKG9EYXRhRmllbGRDb252ZXJ0ZWQpO1xuXHR9XG5cdGxldCByZXF1aXJlZFByb3BlcnR5RnJvbUluc2VydFJlc3RyaWN0aW9uc0V4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiA9IGNvbnN0YW50KGZhbHNlKTtcblx0bGV0IHJlcXVpcmVkUHJvcGVydHlGcm9tVXBkYXRlUmVzdHJpY3Rpb25zRXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+ID0gY29uc3RhbnQoZmFsc2UpO1xuXG5cdGNvbnN0IG9Qcm9wZXJ0eTogUHJvcGVydHkgPSAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24ob1Byb3BlcnR5UGF0aCkgJiYgb1Byb3BlcnR5UGF0aC4kdGFyZ2V0KSB8fCAob1Byb3BlcnR5UGF0aCBhcyBQcm9wZXJ0eSk7XG5cdC8vIEVuYWJsZW1lbnQgZGVwZW5kcyBvbiB0aGUgZmllbGQgY29udHJvbCBleHByZXNzaW9uXG5cdC8vIElmIHRoZSBGaWVsZCBjb250cm9sIGlzIHN0YXRpY2FsbHkgaW4gSW5hcHBsaWNhYmxlIChkaXNhYmxlZCkgLT4gbm90IGVuYWJsZWRcblx0Y29uc3QgcmVxdWlyZWRFeHByZXNzaW9uID0gaXNSZXF1aXJlZEV4cHJlc3Npb24ob1Byb3BlcnR5LCByZWxhdGl2ZVBhdGgpO1xuXHRjb25zdCBlZGl0TW9kZSA9IGZvcmNlRWRpdE1vZGUgfHwgVUkuSXNFZGl0YWJsZTtcblx0aWYgKGFSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zPy5pbmNsdWRlcyhvUHJvcGVydHkubmFtZSkpIHtcblx0XHRyZXF1aXJlZFByb3BlcnR5RnJvbUluc2VydFJlc3RyaWN0aW9uc0V4cHJlc3Npb24gPSBVSS5Jc0NyZWF0ZU1vZGU7XG5cdH1cblx0aWYgKGFSZXF1aXJlZFByb3BlcnRpZXNGcm9tVXBkYXRlUmVzdHJpY3Rpb25zPy5pbmNsdWRlcyhvUHJvcGVydHkubmFtZSkpIHtcblx0XHRyZXF1aXJlZFByb3BlcnR5RnJvbVVwZGF0ZVJlc3RyaWN0aW9uc0V4cHJlc3Npb24gPSBhbmQoVUkuSXNFZGl0YWJsZSwgbm90KFVJLklzQ3JlYXRlTW9kZSkpO1xuXHR9XG5cdGNvbnN0IHJldHVybkV4cHJlc3Npb24gPSBvcihcblx0XHRhbmQob3IocmVxdWlyZWRFeHByZXNzaW9uLCBkYXRhRmllbGRSZXF1aXJlZEV4cHJlc3Npb24pLCBlZGl0TW9kZSksXG5cdFx0cmVxdWlyZWRQcm9wZXJ0eUZyb21JbnNlcnRSZXN0cmljdGlvbnNFeHByZXNzaW9uLFxuXHRcdHJlcXVpcmVkUHJvcGVydHlGcm9tVXBkYXRlUmVzdHJpY3Rpb25zRXhwcmVzc2lvblxuXHQpO1xuXHRpZiAoYkFzT2JqZWN0KSB7XG5cdFx0cmV0dXJuIHJldHVybkV4cHJlc3Npb247XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHJldHVybkV4cHJlc3Npb24pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlcXVpcmVkRXhwcmVzc2lvbkZvckNvbm5lY3RlZERhdGFGaWVsZCA9IGZ1bmN0aW9uIChcblx0ZGF0YUZpZWxkT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxBbm5vdGF0aW9uUGF0aDxDb25uZWN0ZWRGaWVsZHNUeXBlPj5cbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcz4gPSAoZGF0YUZpZWxkT2JqZWN0UGF0aD8udGFyZ2V0T2JqZWN0Py4kdGFyZ2V0Py5EYXRhID8/IHt9KSBhcyBSZWNvcmQ8XG5cdFx0c3RyaW5nLFxuXHRcdERhdGFGaWVsZEFic3RyYWN0VHlwZXNcblx0Pjtcblx0Y29uc3Qga2V5czogQXJyYXk8c3RyaW5nPiA9IE9iamVjdC5rZXlzKGRhdGEpO1xuXHRjb25zdCBkYXRhRmllbGRzID0gW107XG5cdGxldCBwcm9wZXJ0eVBhdGg7XG5cdGNvbnN0IGlzUmVxdWlyZWRFeHByZXNzaW9uczogKENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+KVtdIHwgdW5kZWZpbmVkID0gW107XG5cdGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcblx0XHRpZiAoZGF0YVtrZXldPy5bXCIkVHlwZVwiXSAmJiBkYXRhW2tleV1bXCIkVHlwZVwiXT8uaW5jbHVkZXMoXCJEYXRhRmllbGRcIikpIHtcblx0XHRcdGRhdGFGaWVsZHMucHVzaChkYXRhW2tleV0pO1xuXHRcdH1cblx0fVxuXHRmb3IgKGNvbnN0IGRhdGFGaWVsZCBvZiBkYXRhRmllbGRzKSB7XG5cdFx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRcdGlmICh0eXBlb2YgZGF0YUZpZWxkLlZhbHVlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoID0gZGF0YUZpZWxkLlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRcdGlmIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0KSB7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0aXNBbm5vdGF0aW9uT2ZUeXBlPERhdGFGaWVsZCB8IERhdGFQb2ludFR5cGU+KGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldCwgW1xuXHRcdFx0XHRcdFx0XHRVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRcdFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGVcblx0XHRcdFx0XHRcdF0pXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC5WYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVBhdGggPSBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuVGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5UGF0aCA9IGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Ly8gbm8gZGVmYXVsdFxuXHRcdH1cblx0XHRpc1JlcXVpcmVkRXhwcmVzc2lvbnMucHVzaChnZXRSZXF1aXJlZEV4cHJlc3Npb25Bc09iamVjdChwcm9wZXJ0eVBhdGgsIGRhdGFGaWVsZCwgZmFsc2UpKTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24ob3IoLi4uKGlzUmVxdWlyZWRFeHByZXNzaW9ucyBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSkpKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgaGVhZGVyIGZhY2V0IG9yIGFjdGlvbiBpcyB2aXNpYmxlLlxuICogQHBhcmFtIHRhcmdldE9iamVjdCBIZWFkZXIgZmFjZXRzIG9yIEFjdGlvbnNcbiAqIEByZXR1cm5zIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWaXNpYmxlKFxuXHR0YXJnZXRPYmplY3Q6XG5cdFx0fCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzXG5cdFx0fCBEYXRhUG9pbnRUeXBlVHlwZXNcblx0XHR8IFJlZmVyZW5jZUZhY2V0XG5cdFx0fCBDb2xsZWN0aW9uRmFjZXRcblx0XHR8IERhdGFGaWVsZEZvckFjdGlvblR5cGVzXG5cdFx0fCBGaWVsZEdyb3VwXG5cdFx0fCBQcm9wZXJ0eVxuXHRcdHwgdW5kZWZpbmVkLFxuXHRuYXZpZ2F0aW9uUHJvcGVydGllcz86IHN0cmluZ1tdXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gbm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih0YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5VST8uSGlkZGVuLCBuYXZpZ2F0aW9uUHJvcGVydGllcyksIHRydWUpKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhY3Rpb24gcGFyYW1ldGVyIGlzIHN1cHBvcnRzIG11bHRpIGxpbmUgaW5wdXQuXG4gKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aCBPYmplY3QgcGF0aCB0byB0aGUgYWN0aW9uIHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIEJvb2xlYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzTXVsdGlMaW5lID0gZnVuY3Rpb24gKGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8QWN0aW9uUGFyYW1ldGVyPik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gaXNNdWx0aUxpbmVUZXh0KGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBlbmFibGVkLlxuICogQHBhcmFtIGFjdGlvblRhcmdldCBBY3Rpb25cbiAqIEBwYXJhbSBjb252ZXJ0ZWRUeXBlcyBDb252ZXJ0ZWRNZXRhZGF0YVxuICogQHBhcmFtIGRhdGFNb2RlbE9iamVjdFBhdGggRGF0YU1vZGVsT2JqZWN0UGF0aFxuICogQHBhcmFtIHBhdGhGcm9tQ29udGV4dExvY2F0aW9uIEJvb2xlYW5cbiAqIEByZXR1cm5zIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aW9uRW5hYmxlZEV4cHJlc3Npb24oXG5cdGFjdGlvblRhcmdldDogQWN0aW9uLFxuXHRjb252ZXJ0ZWRUeXBlczogQ29udmVydGVkTWV0YWRhdGEsXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg/OiBEYXRhTW9kZWxPYmplY3RQYXRoPFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHBhdGhGcm9tQ29udGV4dExvY2F0aW9uPzogYm9vbGVhblxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlSXNBbm5vdGF0ZWQgPVxuXHRcdGFjdGlvblRhcmdldC5hbm5vdGF0aW9ucy5Db3JlPy5PcGVyYXRpb25BdmFpbGFibGU/LnRlcm0gPT09IENvcmVBbm5vdGF0aW9uVGVybXMuT3BlcmF0aW9uQXZhaWxhYmxlO1xuXG5cdGlmICghb3BlcmF0aW9uQXZhaWxhYmxlSXNBbm5vdGF0ZWQpIHtcblx0XHQvLyBPcGVyYXRpb25BdmFpbGFibGUgdGVybSBkb2Vzbid0IGV4aXN0IGZvciB0aGUgYWN0aW9uXG5cdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHR9XG5cblx0bGV0IHByZWZpeCA9IFwiXCI7XG5cdGlmIChcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoICYmXG5cdFx0cGF0aEZyb21Db250ZXh0TG9jYXRpb24gJiZcblx0XHRwYXRoRnJvbUNvbnRleHRMb2NhdGlvbiA9PT0gdHJ1ZSAmJlxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGguY29udGV4dExvY2F0aW9uPy50YXJnZXRFbnRpdHlUeXBlICYmXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5jb250ZXh0TG9jYXRpb24udGFyZ2V0RW50aXR5VHlwZSAhPT0gYWN0aW9uVGFyZ2V0LnNvdXJjZUVudGl0eVR5cGVcblx0KSB7XG5cdFx0Y29uc3QgbmF2aWdhdGlvbnMgPSBnZXRSZWxhdGl2ZVBhdGhzKGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRcdGxldCBzb3VyY2VBY3Rpb25EYXRhTW9kZWxPYmplY3QgPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChkYXRhTW9kZWxPYmplY3RQYXRoLmNvbnRleHRMb2NhdGlvbik7XG5cdFx0Ly9TdGFydCBmcm9tIGNvbnRleHRMb2NhdGlvbiBhbmQgbmF2aWdhdGUgdW50aWwgdGhlIHNvdXJjZSBlbnRpdHlUeXBlIG9mIHRoZSBhY3Rpb24gdG8gZ2V0IHRoZSByaWdodCBwcmVmaXhcblx0XHRmb3IgKGNvbnN0IG5hdiBvZiBuYXZpZ2F0aW9ucykge1xuXHRcdFx0c291cmNlQWN0aW9uRGF0YU1vZGVsT2JqZWN0ID0gZW5oYW5jZURhdGFNb2RlbFBhdGgoc291cmNlQWN0aW9uRGF0YU1vZGVsT2JqZWN0LCBuYXYpO1xuXHRcdFx0aWYgKHNvdXJjZUFjdGlvbkRhdGFNb2RlbE9iamVjdC50YXJnZXRFbnRpdHlUeXBlID09PSBhY3Rpb25UYXJnZXQuc291cmNlRW50aXR5VHlwZSkge1xuXHRcdFx0XHRwcmVmaXggPSBgJHtnZXRSZWxhdGl2ZVBhdGhzKHNvdXJjZUFjdGlvbkRhdGFNb2RlbE9iamVjdCkuam9pbihcIi9cIil9L2A7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRjb25zdCBiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUgPSBhY3Rpb25UYXJnZXQuaXNCb3VuZCA/IGFjdGlvblRhcmdldC5wYXJhbWV0ZXJzWzBdPy5mdWxseVF1YWxpZmllZE5hbWUgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IG9wZXJhdGlvbkF2YWlsYWJsZUV4cHJlc3Npb24gPSBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oXG5cdFx0YWN0aW9uVGFyZ2V0LmFubm90YXRpb25zLkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSxcblx0XHRbXSxcblx0XHR1bmRlZmluZWQsXG5cdFx0KHBhdGg6IHN0cmluZykgPT4gYCR7cHJlZml4fSR7YmluZGluZ0NvbnRleHRQYXRoVmlzaXRvcihwYXRoLCBjb252ZXJ0ZWRUeXBlcywgYmluZGluZ1BhcmFtZXRlckZ1bGxOYW1lKX1gXG5cdCk7XG5cblx0cmV0dXJuIGVxdWFsKG9wZXJhdGlvbkF2YWlsYWJsZUV4cHJlc3Npb24sIHRydWUpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgZXhwcmVzc2lvbiB0byBjaGVjayBpZiB0aGUgcXVpY2tWaWV3IGZhY2V0IGlzIHZpc2libGUuXG4gKiBAcGFyYW0gZmFjZXRNb2RlbFBhdGhcbiAqIEByZXR1cm5zIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiBUaGUgYmluZGluZyBleHByZXNzaW9uIG9mIHRoZSB2aXNpYmlsaXR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1F1aWNrVmlld0ZhY2V0VmlzaWJsZShmYWNldE1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxSZWZlcmVuY2VGYWNldD4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGxldCB0YXJnZXRWaXNpYmxlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4gPSBjb25zdGFudCh0cnVlKTtcblx0aWYgKGlzQW5ub3RhdGlvbk9mVHlwZTxGaWVsZEdyb3VwPihmYWNldE1vZGVsUGF0aC50YXJnZXRPYmplY3Q/LlRhcmdldD8uJHRhcmdldCwgVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGUpKSB7XG5cdFx0dGFyZ2V0VmlzaWJsZSA9IGlzVmlzaWJsZShmYWNldE1vZGVsUGF0aC50YXJnZXRPYmplY3Q/LlRhcmdldD8uJHRhcmdldCk7XG5cdH1cblx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGFuZChpc1Zpc2libGUoZmFjZXRNb2RlbFBhdGgudGFyZ2V0T2JqZWN0KSwgdGFyZ2V0VmlzaWJsZSkpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTJFQTs7RUFZQTtBQUNBO0FBQ0E7O0VBa0NPLE1BQU1BLGFBQWEsR0FBRztJQUM1QjtBQUNEO0FBQ0E7QUFDQTtJQUNDQyxRQUFRLEVBQUUsVUFBVTtJQUNwQjtBQUNEO0FBQ0E7QUFDQTtJQUNDQyxPQUFPLEVBQUUsU0FBUztJQUNsQjtBQUNEO0FBQ0E7QUFDQTtJQUNDQyxRQUFRLEVBQUUsVUFBVTtJQUNwQjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDQyxnQkFBZ0IsRUFBRSxrQkFBa0I7SUFDcEM7QUFDRDtBQUNBO0FBQ0E7SUFDQ0MsUUFBUSxFQUFFO0VBQ1gsQ0FBQztFQUFDQyxRQUFBLENBQUFQLGFBQUEsR0FBQUEsYUFBQTtF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
@@ -485,7 +485,9 @@ export const getBindingWithUnitOrCurrency = function (
485
485
  formatOptions?: {
486
486
  showMeasure?: boolean;
487
487
  decimalPadding?: number;
488
- }
488
+ },
489
+ forDisplayMode?: boolean,
490
+ showOnlyUnitDecimals?: boolean
489
491
  ): BindingToolkitExpression<string> {
490
492
  const oPropertyDefinition = oPropertyDataModelPath.targetObject as Property;
491
493
  let unit = oPropertyDefinition.annotations?.Measures?.Unit;
@@ -503,8 +505,16 @@ export const getBindingWithUnitOrCurrency = function (
503
505
  isPathAnnotationExpression(unit) && unit.$target
504
506
  ? formatWithTypeInformation(unit.$target, getExpressionFromAnnotation(unit, relativeLocation), ignoreUnitConstraint)
505
507
  : getExpressionFromAnnotation(unit, relativeLocation);
506
- const constraintOptions: ComplexTypeConstraintOptions | undefined =
507
- complexType === "sap.ui.model.odata.type.Unit" ? getConstraintOptions(oPropertyDataModelPath.targetObject) : undefined;
508
+ let constraintOptions: ComplexTypeConstraintOptions | undefined;
509
+ if (complexType === "sap.ui.model.odata.type.Unit") {
510
+ if (forDisplayMode && !showOnlyUnitDecimals) {
511
+ constraintOptions = { skipDecimalsValidation: true };
512
+ } else if (!forDisplayMode) {
513
+ // Consider annotation only in edit mode
514
+ constraintOptions = getConstraintOptions(oPropertyDataModelPath.targetObject);
515
+ }
516
+ }
517
+
508
518
  return addTypeInformation([propertyBindingExpression, unitBindingExpression], complexType, undefined, formatOptions, constraintOptions);
509
519
  };
510
520
 
@@ -551,7 +561,9 @@ export const getBindingForDatePicker = function (
551
561
  };
552
562
 
553
563
  export const getBindingForUnitOrCurrency = function (
554
- oPropertyDataModelPath: DataModelObjectPath<Property> | undefined
564
+ oPropertyDataModelPath: DataModelObjectPath<Property> | undefined,
565
+ forDisplayMode: boolean,
566
+ showOnlyUnitDecimals: boolean
555
567
  ): BindingToolkitExpression<string> | string {
556
568
  const oPropertyDefinition = oPropertyDataModelPath?.targetObject;
557
569
  if (!oPropertyDefinition) {
@@ -575,8 +587,14 @@ export const getBindingForUnitOrCurrency = function (
575
587
  getContextRelativeTargetObjectPath(oPropertyDataModelPath)
576
588
  ) as BindingToolkitExpression<string>;
577
589
  propertyBindingExpression = formatWithTypeInformation(oPropertyDefinition, propertyBindingExpression, true);
578
- const constraintOptions: ComplexTypeConstraintOptions | undefined =
579
- complexType === "sap.ui.model.odata.type.Unit" ? getConstraintOptions(oPropertyDataModelPath.targetObject) : undefined;
590
+ let constraintOptions: ComplexTypeConstraintOptions | undefined;
591
+ if (complexType === "sap.ui.model.odata.type.Unit") {
592
+ if (forDisplayMode && !showOnlyUnitDecimals) {
593
+ constraintOptions = { skipDecimalsValidation: true };
594
+ } else if (!forDisplayMode) {
595
+ constraintOptions = getConstraintOptions(oPropertyDefinition);
596
+ }
597
+ }
580
598
  return addTypeInformation(
581
599
  [propertyBindingExpression, unitBindingExpression],
582
600
  complexType,