@aws-cdk/aws-mediaconnect-alpha 2.263.0-alpha.0 → 2.264.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -50,7 +50,7 @@ const shared_1 = require("./shared");
50
50
  */
51
51
  class RouterInputProtocolOptions {
52
52
  value;
53
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.RouterInputProtocolOptions", version: "2.263.0-alpha.0" };
53
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.RouterInputProtocolOptions", version: "2.264.0-alpha.0" };
54
54
  /** Real-time Transport Protocol */
55
55
  static RTP = new RouterInputProtocolOptions('RTP');
56
56
  /** Reliable Internet Stream Transport */
@@ -81,7 +81,7 @@ exports.RouterInputProtocolOptions = RouterInputProtocolOptions;
81
81
  */
82
82
  class RoutingScope {
83
83
  value;
84
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.RoutingScope", version: "2.263.0-alpha.0" };
84
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.RoutingScope", version: "2.264.0-alpha.0" };
85
85
  /** Route traffic within the same AWS region */
86
86
  static REGIONAL = new RoutingScope('REGIONAL');
87
87
  /** Route traffic globally across AWS regions */
@@ -108,7 +108,7 @@ exports.RoutingScope = RoutingScope;
108
108
  */
109
109
  class RouterInputTier {
110
110
  value;
111
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.RouterInputTier", version: "2.263.0-alpha.0" };
111
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.RouterInputTier", version: "2.264.0-alpha.0" };
112
112
  /** Supports a maximum bitrate up to 100 megabits per second. */
113
113
  static INPUT_100 = new RouterInputTier('INPUT_100');
114
114
  /** Supports a maximum bitrate up to 50 megabits per second. */
@@ -169,7 +169,7 @@ var SourcePriorityMode;
169
169
  class SourcePriorityConfig {
170
170
  _mode;
171
171
  _primary;
172
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.SourcePriorityConfig", version: "2.263.0-alpha.0" };
172
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.SourcePriorityConfig", version: "2.264.0-alpha.0" };
173
173
  /**
174
174
  * Treat both sources with equal priority — MediaConnect picks one when needed.
175
175
  */
@@ -222,7 +222,7 @@ var ProtocolConfigType;
222
222
  * Factory class for creating Router Input protocol configurations
223
223
  */
224
224
  class RouterInputProtocol {
225
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.RouterInputProtocol", version: "2.263.0-alpha.0" };
225
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.RouterInputProtocol", version: "2.264.0-alpha.0" };
226
226
  /**
227
227
  * Create an RTP protocol configuration
228
228
  * @param props RTP protocol properties
@@ -462,7 +462,7 @@ exports.RouterInputProtocol = RouterInputProtocol;
462
462
  * Factory class for creating Router Input configurations
463
463
  */
464
464
  class RouterInputConfiguration {
465
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.RouterInputConfiguration", version: "2.263.0-alpha.0" };
465
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.RouterInputConfiguration", version: "2.264.0-alpha.0" };
466
466
  /**
467
467
  * Create a standard Router Input configuration with a single protocol
468
468
  * @param props Standard configuration properties
@@ -653,6 +653,7 @@ class StandardRouterInputConfig extends RouterInputConfiguration {
653
653
  protocolConfiguration: protocol.config,
654
654
  },
655
655
  },
656
+ availabilityZone: this.props.availabilityZone,
656
657
  };
657
658
  }
658
659
  _endpoints(ipAddress) {
@@ -684,6 +685,7 @@ class FailoverRouterInputConfig extends RouterInputConfiguration {
684
685
  primarySourceIndex: priority.primarySourceIndex,
685
686
  },
686
687
  },
688
+ availabilityZone: this.props.availabilityZone,
687
689
  };
688
690
  }
689
691
  _endpoints(ipAddress) {
@@ -717,6 +719,7 @@ class MergeRouterInputConfig extends RouterInputConfiguration {
717
719
  mergeRecoveryWindowMilliseconds: this.props.mergeRecoveryWindow.toMilliseconds(),
718
720
  },
719
721
  },
722
+ availabilityZone: this.props.availabilityZone,
720
723
  };
721
724
  }
722
725
  _endpoints(ipAddress) {
@@ -914,7 +917,7 @@ let RouterInput = (() => {
914
917
  RouterInput = _classThis = _classDescriptor.value;
915
918
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
916
919
  }
917
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.RouterInput", version: "2.263.0-alpha.0" };
920
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.RouterInput", version: "2.264.0-alpha.0" };
918
921
  /** Uniquely identifies this class. */
919
922
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-mediaconnect-alpha.RouterInput';
920
923
  /**
@@ -1050,7 +1053,8 @@ let RouterInput = (() => {
1050
1053
  });
1051
1054
  const configBind = props.configuration._bind(this, routerInputArn);
1052
1055
  // Validate AZ matches region if provided
1053
- if (configBind.availabilityZone && !configBind.availabilityZone.startsWith(targetRegion)) {
1056
+ if (configBind.availabilityZone && !aws_cdk_lib_1.Token.isUnresolved(configBind.availabilityZone) && !aws_cdk_lib_1.Token.isUnresolved(targetRegion)
1057
+ && !configBind.availabilityZone.startsWith(targetRegion)) {
1054
1058
  throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `RouterInputAzRegionMismatch`, `Availability zone '${configBind.availabilityZone}' must be within region '${targetRegion}'`, this);
1055
1059
  }
1056
1060
  const transit = (0, shared_1.resolveTransitEncryption)(this, 'TransitEncryptionRole', props.transitEncryption, routerInputArn);
@@ -1092,4 +1096,4 @@ let RouterInput = (() => {
1092
1096
  return RouterInput = _classThis;
1093
1097
  })();
1094
1098
  exports.RouterInput = RouterInput;
1095
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLWlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicm91dGVyLWlucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLDZDQUFxSTtBQUVySSwrREFBMEQ7QUFDMUQsbUVBQThEO0FBRzlELDRFQUE0RDtBQUM1RCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBSTFFLG1GQUFvRTtBQUdwRSxxQ0FBdUs7QUFFdks7O0dBRUc7QUFDSCxNQUFhLDBCQUEwQjtJQW1CRDs7SUFsQnBDLG1DQUFtQztJQUM1QixNQUFNLENBQVUsR0FBRyxHQUFHLElBQUksMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkUseUNBQXlDO0lBQ2xDLE1BQU0sQ0FBVSxJQUFJLEdBQUcsSUFBSSwwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyRSw4Q0FBOEM7SUFDdkMsTUFBTSxDQUFVLFVBQVUsR0FBRyxJQUFJLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2pGLGdEQUFnRDtJQUN6QyxNQUFNLENBQVUsWUFBWSxHQUFHLElBQUksMEJBQTBCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFckY7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFhO1FBQzVCLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM5QztJQUVELDZDQUE2QztJQUM3QyxZQUFvQyxLQUFhO1FBQWIsVUFBSyxHQUFMLEtBQUssQ0FBUTtLQUFJO0lBRXJELCtCQUErQjtJQUN4QixRQUFRO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBQ25COztBQXhCSCxnRUF5QkM7QUFrSkQ7O0dBRUc7QUFDSCxNQUFhLFlBQVk7SUFlYTs7SUFkcEMsK0NBQStDO0lBQ3hDLE1BQU0sQ0FBVSxRQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFD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QUFVLENBQUMsTUFBTTtnQkFDaEMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLE1BQU07Z0JBQ2pDLFVBQVUsRUFBRSxZQUFZO2dCQUN4QixnQkFBZ0IsRUFBRSxVQUFVLENBQUMsZ0JBQWdCO2dCQUM3QyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBQSxtQkFBVSxFQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUN0RCxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7WUFDMUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQztZQUMzQyxJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7WUFDM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDO1lBRTNDLDBEQUEwRDtZQUMxRCxxRkFBcUY7WUFDckYsb0RBQW9EO1lBQ3BELE9BQU8sQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXhDLHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUU1RSw2REFBNkQ7WUFDN0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUM7WUFDL0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxpREFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkQ7O1lBM0xVLHVEQUFXOzs7OztBQUFYLGtDQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaXRyYXRlLCBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBcm5Gb3JtYXQsIER1cmF0aW9uLCBGbiwgTGF6eSwgTmFtZXMsIFJlc291cmNlLCBTdGFjaywgVG9rZW4sIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY09wdGlvbnMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBNZXRyaWMsIFVuaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBDZm5Sb3V0ZXJJbnB1dCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYWNvbm5lY3QnO1xuaW1wb3J0IHR5cGUgeyBJUm91dGVySW5wdXRSZWYsIFJvdXRlcklucHV0UmVmZXJlbmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhY29ubmVjdCc7XG5pbXBvcnQgdHlwZSB7IElTZWNyZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0IHsgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBJRmxvdyB9IGZyb20gJy4vZmxvdyc7XG5pbXBvcnQgdHlwZSB7IElGbG93T3V0cHV0IH0gZnJvbSAnLi9mbG93LW91dHB1dCc7XG5pbXBvcnQgeyBSb3V0ZXJJbnB1dEdyYW50cyB9IGZyb20gJy4vbWVkaWFjb25uZWN0LWdyYW50cy5nZW5lcmF0ZWQnO1xuaW1wb3J0IHR5cGUgeyBJUm91dGVyTmV0d29ya0ludGVyZmFjZSB9IGZyb20gJy4vcm91dGVyLW5ldHdvcmstaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgTWFpbnRlbmFuY2VEYXksIE1lZGlhTGl2ZVBpcGVsaW5lLCBSb3V0ZXJTcnRFbmNyeXB0aW9uLCBUcmFuc2l0RW5jcnlwdGlvbiB9IGZyb20gJy4vc2hhcmVkJztcbmltcG9ydCB7IHJlbmRlclRhZ3MsIGV4Y2VlZHNSb3V0ZXJUaWVyQml0cmF0ZSwgcmVuZGVyUm91dGVyU3J0RW5jcnlwdGlvbiwgcmVuZGVyVHJhbnNpdEVuY3J5cHRpb24sIHJlc29sdmVUcmFuc2l0RW5jcnlwdGlvbiwgdmFsaWRhdGVNYWludGVuYW5jZVRpbWUgfSBmcm9tICcuL3NoYXJlZCc7XG5cbi8qKlxuICogUHJvdG9jb2wgb3B0aW9ucyBhdmFpbGFibGUgZm9yIFJvdXRlciBJbnB1dCBjb25maWd1cmF0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgUm91dGVySW5wdXRQcm90b2NvbE9wdGlvbnMge1xuICAvKiogUmVhbC10aW1lIFRyYW5zcG9ydCBQcm90b2NvbCAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJUUCA9IG5ldyBSb3V0ZXJJbnB1dFByb3RvY29sT3B0aW9ucygnUlRQJyk7XG4gIC8qKiBSZWxpYWJsZSBJbnRlcm5ldCBTdHJlYW0gVHJhbnNwb3J0ICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUklTVCA9IG5ldyBSb3V0ZXJJbnB1dFByb3RvY29sT3B0aW9ucygnUklTVCcpO1xuICAvKiogU2VjdXJlIFJlbGlhYmxlIFRyYW5zcG9ydCAtIENhbGxlciBtb2RlICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1JUX0NBTExFUiA9IG5ldyBSb3V0ZXJJbnB1dFByb3RvY29sT3B0aW9ucygnU1JUX0NBTExFUicpO1xuICAvKiogU2VjdXJlIFJlbGlhYmxlIFRyYW5zcG9ydCAtIExpc3RlbmVyIG1vZGUgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTUlRfTElTVEVORVIgPSBuZXcgUm91dGVySW5wdXRQcm90b2NvbE9wdGlvbnMoJ1NSVF9MSVNURU5FUicpO1xuXG4gIC8qKlxuICAgKiBVc2UgYSBjdXN0b20gcHJvdG9jb2wgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBwcm90b2NvbCBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IFJvdXRlcklucHV0UHJvdG9jb2xPcHRpb25zIHtcbiAgICByZXR1cm4gbmV3IFJvdXRlcklucHV0UHJvdG9jb2xPcHRpb25zKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0gdmFsdWUgVGhlIHByb3RvY29sIHN0cmluZyB2YWx1ZSAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBpbmdlc3QgZW5kcG9pbnQgd2hlcmUgdGhlIHJvdXRlciBpbnB1dCBsaXN0ZW5zIGZvciB1cHN0cmVhbSBjb250ZW50LlxuICpcbiAqIEZhaWxvdmVyIGFuZCBtZXJnZSBjb25maWd1cmF0aW9ucyBleHBvc2UgdHdvIGVuZHBvaW50czsgc3RhbmRhcmQgY29uZmlndXJhdGlvbnNcbiAqIGV4cG9zZSBvbmUuIFJldHVybmVkIGJ5IHtAbGluayBJUm91dGVySW5wdXQuZW5kcG9pbnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb3V0ZXJJbnB1dEVuZHBvaW50IHtcbiAgLyoqXG4gICAqIFRoZSBmdWxsIGluZ2VzdCBVUkwgY29tYmluaW5nIHByb3RvY29sIHNjaGVtZSwgSVAsIGFuZCBwb3J0LiBGb3IgZXhhbXBsZTpcbiAgICogYHNydDovLzIwMy4wLjExMy4xMDo1MDAwYCBvciBgcnRwOi8vMjAzLjAuMTEzLjEwOjUwMDFgLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0ZW5pbmcgcG9ydCBhdCB3aGljaCB0aGUgcm91dGVyIGlucHV0IGFjY2VwdHMgdXBzdHJlYW0gY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIFJvdXRlciBJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElSb3V0ZXJJbnB1dCBleHRlbmRzIElSZXNvdXJjZSwgSVJvdXRlcklucHV0UmVmIHtcbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgcm91dGVyIGlucHV0LlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJJbnB1dEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJvdXRlciBpbnB1dC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVySW5wdXRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgcm91dGVyIGlucHV0LlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBpcEFkZHJlc3M6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSByb3V0ZXIgaW5wdXQgd2FzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZWRBdD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSByb3V0ZXIgaW5wdXQgd2FzIGxhc3QgdXBkYXRlZC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5nZXN0IGVuZHBvaW50cyAoVVJMICsgcG9ydCkgd2hlcmUgdGhlIHJvdXRlciBpbnB1dCBsaXN0ZW5zLlxuICAgKlxuICAgKiBSZXR1cm5zIG9uZSBlbnRyeSBmb3Igc3RhbmRhcmQgcHJvdG9jb2wtYmFzZWQgdmFyaWFudHMgKFJUUCwgUklTVCwgU1JUIGxpc3RlbmVyKSxcbiAgICogYW5kIG9uZSBlbnRyeSBwZXIgc291cmNlIGZvciBmYWlsb3ZlciBhbmQgbWVyZ2UgY29uZmlndXJhdGlvbnMgYnVpbHQgZnJvbSB0aG9zZVxuICAgKiBwcm90b2NvbHMuIEZvciBleGFtcGxlIGEgZmFpbG92ZXIgUlRQIGlucHV0IHdpbGwgcmV0dXJuOlxuICAgKlxuICAgKiBgYGBcbiAgICogW1xuICAgKiAgIHsgdXJsOiAncnRwOi8vMjAzLjAuMTEzLjEwOjUwMDAnLCBwb3J0OiA1MDAwIH0sXG4gICAqICAgeyB1cmw6ICdydHA6Ly8yMDMuMC4xMTMuMTA6NTAwMScsIHBvcnQ6IDUwMDEgfSxcbiAgICogXVxuICAgKiBgYGBcbiAgICpcbiAgICogQWNjZXNzaW5nIHRoaXMgb24gU1JUIGNhbGxlciAod2hlcmUgdGhlIHJvdXRlciBpbnB1dCBkaWFscyBvdXQgdG8gYSByZW1vdGVcbiAgICogc291cmNlKSwgTWVkaWFDb25uZWN0IEZsb3csIE1lZGlhTGl2ZSBDaGFubmVsLCBvciBpbXBvcnRlZCBpbnB1dHMgdGhyb3dzIOKAlCB0aG9zZVxuICAgKiB2YXJpYW50cyBkbyBub3QgZXhwb3NlIGhvc3Q6cG9ydCBwYWlycyB0aGUgaW5wdXQgbGlzdGVucyBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50czogUm91dGVySW5wdXRFbmRwb2ludFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIHRoZSB0cmFuc2l0IGVuY3J5cHRpb24gcGFzc3BocmFzZS5cbiAgICpcbiAgICogT25seSBhdmFpbGFibGUgd2hlbiB0aGUgUm91dGVyIElucHV0IHdhcyBjcmVhdGVkIHdpdGggZXhwbGljaXRcbiAgICogYHRyYW5zaXRFbmNyeXB0aW9uYCBjb25maWd1cmF0aW9uLiBOb3QgYXZhaWxhYmxlIGZvclxuICAgKiBhdXRvbWF0aWMgZW5jcnlwdGlvbiBvciBpbXBvcnRlZCBpbnB1dHMuXG4gICAqL1xuICByZWFkb25seSB0cmFuc2l0RW5jcnlwdGlvblNlY3JldD86IElTZWNyZXQ7XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgZ3JhbnQgbWV0aG9kcyBmb3IgdGhpcyByb3V0ZXIgaW5wdXQuXG4gICAqL1xuICByZWFkb25seSBncmFudHM6IFJvdXRlcklucHV0R3JhbnRzO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdGhpcyByb3V0ZXIgaW5wdXQuXG4gICAqXG4gICAqIFJvdXRlciBpbnB1dCBtZXRyaWNzIGFyZSBkaW1lbnNpb25lZCBieSBgUm91dGVySW5wdXRBUk5gLiBTZWUgdGhlIE1lZGlhQ29ubmVjdFxuICAgKiBkb2N1bWVudGF0aW9uIGZvciBhdmFpbGFibGUgbWV0cmljIG5hbWVzIChlLmcuIGBSb3V0ZXJJbnB1dEJpdFJhdGVgLFxuICAgKiBgUm91dGVySW5wdXROb3RSZWNvdmVyZWRQYWNrZXRzYCkuXG4gICAqL1xuICBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIGJpdHJhdGUgb2YgdGhlIHJvdXRlciBpbnB1dCdzIHBheWxvYWQuXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY0JpdHJhdGUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHBhY2tldHMgbG9zdCBpbiB0cmFuc2l0IHRoYXQgd2VyZSBub3QgcmVjb3ZlcmVkIGJ5IGVycm9yIGNvcnJlY3Rpb24uXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljTm90UmVjb3ZlcmVkUGFja2V0cyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkIGJ5IHRoZSByb3V0ZXIgaW5wdXQuXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljVG90YWxQYWNrZXRzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgcm91dGVyIGlucHV0IGNvbm5lY3Rpb24gc3RhdGUgKDEgY29ubmVjdGVkLCAwIGRpc2Nvbm5lY3RlZCkuIEFwcGxpZXMgdG8gU1JUIHNvdXJjZXMgb25seS5cbiAgICogQGRlZmF1bHQgLSBtaW5pbXVtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljQ29ubmVjdGVkKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciBjb250aW51aXR5IGNvdW50ZXIgZXJyb3JzIGluIHRoZSB0cmFuc3BvcnQgc3RyZWFtLlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY0NvbnRpbnVpdHlDb3VudGVyRXJyb3JzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgcmVjb3ZlcnkgbGF0ZW5jeSBvZiB0aGUgaW5wdXQgc3RyZWFtLiBBcHBsaWVzIHRvIFJJU1QsIFNSVCwgYW5kIFJUUC1GRUMuXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY0xhdGVuY3kocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHJvdXRlciBpbnB1dCBoYXMgc3dpdGNoZWQgc291cmNlcyBpbiBGYWlsb3ZlciBtb2RlLlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY0ZhaWxvdmVyU3dpdGNoZXMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xufVxuXG4vKipcbiAqIFJvdXRpbmcgc2NvcGUgZm9yIHRoZSBSb3V0ZXIgSW5wdXRcbiAqL1xuZXhwb3J0IGNsYXNzIFJvdXRpbmdTY29wZSB7XG4gIC8qKiBSb3V0ZSB0cmFmZmljIHdpdGhpbiB0aGUgc2FtZSBBV1MgcmVnaW9uICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUkVHSU9OQUwgPSBuZXcgUm91dGluZ1Njb3BlKCdSRUdJT05BTCcpO1xuICAvKiogUm91dGUgdHJhZmZpYyBnbG9iYWxseSBhY3Jvc3MgQVdTIHJlZ2lvbnMgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBHTE9CQUwgPSBuZXcgUm91dGluZ1Njb3BlKCdHTE9CQUwnKTtcblxuICAvKipcbiAgICogVXNlIGEgY3VzdG9tIHJvdXRpbmcgc2NvcGUgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSByb3V0aW5nIHNjb3BlIHN0cmluZyB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogUm91dGluZ1Njb3BlIHtcbiAgICByZXR1cm4gbmV3IFJvdXRpbmdTY29wZSh2YWx1ZSk7XG4gIH1cblxuICAvKiogQHBhcmFtIHZhbHVlIFRoZSByb3V0aW5nIHNjb3BlIHN0cmluZyB2YWx1ZSAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBSb3V0aW5nIHRpZXIgYmFzZWQgb24geW91ciBtYXhpbXVtIGJpdHJhdGUgcmVxdWlyZW1lbnRzLlxuICovXG5leHBvcnQgY2xhc3MgUm91dGVySW5wdXRUaWVyIHtcbiAgLyoqIFN1cHBvcnRzIGEgbWF4aW11bSBiaXRyYXRlIHVwIHRvIDEwMCBtZWdhYml0cyBwZXIgc2Vjb25kLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElOUFVUXzEwMCA9IG5ldyBSb3V0ZXJJbnB1dFRpZXIoJ0lOUFVUXzEwMCcpO1xuICAvKiogU3VwcG9ydHMgYSBtYXhpbXVtIGJpdHJhdGUgdXAgdG8gNTAgbWVnYWJpdHMgcGVyIHNlY29uZC4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBJTlBVVF81MCA9IG5ldyBSb3V0ZXJJbnB1dFRpZXIoJ0lOUFVUXzUwJyk7XG4gIC8qKiBTdXBwb3J0cyBhIG1heGltdW0gYml0cmF0ZSB1cCB0byAyMCBtZWdhYml0cyBwZXIgc2Vjb25kLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElOUFVUXzIwID0gbmV3IFJvdXRlcklucHV0VGllcignSU5QVVRfMjAnKTtcblxuICAvKipcbiAgICogVXNlIGEgY3VzdG9tIHRpZXIgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB0aWVyIHN0cmluZyB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogUm91dGVySW5wdXRUaWVyIHtcbiAgICByZXR1cm4gbmV3IFJvdXRlcklucHV0VGllcih2YWx1ZSk7XG4gIH1cblxuICAvKiogQHBhcmFtIHZhbHVlIFRoZSB0aWVyIHN0cmluZyB2YWx1ZSAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBzY2hlZHVsZWQgbWFpbnRlbmFuY2Ugd2luZG93c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1haW50ZW5hbmNlQ29uZmlndXJhdGlvbiB7XG4gIC8qKiBEYXkgb2YgdGhlIHdlZWsgZm9yIG1haW50ZW5hbmNlIChlLmcuLCAnTW9uZGF5JywgJ1R1ZXNkYXknKSAqL1xuICByZWFkb25seSBkYXk6IE1haW50ZW5hbmNlRGF5O1xuICAvKiogVGltZSBvZiBkYXkgZm9yIG1haW50ZW5hbmNlIGluIEhIOk1NIGZvcm1hdCAoZS5nLiwgJzAyOjAwJykgKi9cbiAgcmVhZG9ubHkgdGltZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGEgUm91dGVyIElucHV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVySW5wdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBSb3V0ZXIgSW5wdXRcbiAgICogQGRlZmF1bHQgLSBHZW5lcmF0ZWQgYXV0b21hdGljYWxseVxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVySW5wdXROYW1lPzogc3RyaW5nO1xuICAvKiogTWF4aW11bSBiaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZCB0aGF0IHRoZSBSb3V0ZXIgSW5wdXQgY2FuIGhhbmRsZSAqL1xuICByZWFkb25seSBtYXhpbXVtQml0cmF0ZTogQml0cmF0ZTtcbiAgLyoqIFJvdXRpbmcgc2NvcGUgZm9yIHRoZSBSb3V0ZXIgSW5wdXQgKi9cbiAgcmVhZG9ubHkgcm91dGluZ1Njb3BlOiBSb3V0aW5nU2NvcGU7XG4gIC8qKlxuICAgKiBTZWxlY3QgYSB0aWVyIGJhc2VkIG9uIHlvdXIgbWF4aW11bSBiaXRyYXRlIHJlcXVpcmVtZW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQgUm91dGVySW5wdXRUaWVyLklOUFVUXzIwXG4gICAqL1xuICByZWFkb25seSB0aWVyPzogUm91dGVySW5wdXRUaWVyO1xuICAvKiogQ29uZmlndXJhdGlvbiBmb3IgdGhlIFJvdXRlciBJbnB1dCAoc3RhbmRhcmQsIGZhaWxvdmVyLCBtZXJnZSwgb3IgTWVkaWFDb25uZWN0IGZsb3cpICovXG4gIHJlYWRvbmx5IGNvbmZpZ3VyYXRpb246IFJvdXRlcklucHV0Q29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICAqIE1haW50ZW5hbmNlIHdpbmRvdyBjb25maWd1cmF0aW9uXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBtYWludGVuYW5jZSB3aW5kb3cgd2lsbCBiZSB1c2VkXG4gICAqL1xuICByZWFkb25seSBtYWludGVuYW5jZUNvbmZpZ3VyYXRpb24/OiBNYWludGVuYW5jZUNvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAgKiBBV1MgcmVnaW9uIHdoZXJlIHRoZSBSb3V0ZXIgSW5wdXQgd2lsbCBiZSBjcmVhdGVkIChpLmUuIHVzLWVhc3QtMSkuXG4gICAqXG4gICAqIE11c3QgbWF0Y2ggdGhlIHJlZ2lvbiBvZiB0aGUgZmxvd3MsIGZsb3cgb3V0cHV0cywgYW5kIG5ldHdvcmsgaW50ZXJmYWNlcyBpdCBjb25uZWN0cyB0byDigJRcbiAgICogTWVkaWFDb25uZWN0IHJlamVjdHMgYSBjcm9zcy1yZWdpb24gY29ubmVjdGlvbiBhdCBkZXBsb3kuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gU2FtZSBhcyB0aGUgc3RhY2sncyByZWdpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUYWdzIHRvIGFkZCB0byB0aGUgUm91dGVyIElucHV0XG4gICAqIEBkZWZhdWx0IC0gTm8gdGFnZ2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKlxuICAgKiBUcmFuc2l0IGVuY3J5cHRpb24gY29uZmlndXJhdGlvbiB1c2luZyBBV1MgU2VjcmV0cyBNYW5hZ2VyLlxuICAgKlxuICAgKiBXaGVuIHByb3ZpZGVkIHdpdGhvdXQgYSByb2xlLCBhIHNjb3BlZCBJQU0gcm9sZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2l0aCByZWFkXG4gICAqIGFjY2VzcyB0byB0aGUgc2VjcmV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEF1dG9tYXRpYyBlbmNyeXB0aW9uIHdpbGwgYmUgY29uZmlndXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNpdEVuY3J5cHRpb24/OiBUcmFuc2l0RW5jcnlwdGlvbjtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGVzIGZvciBpbXBvcnRpbmcgYW4gZXhpc3RpbmcgUm91dGVyIElucHV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlcklucHV0QXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIHJvdXRlciBpbnB1dC5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlcklucHV0QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcm91dGVyIGlucHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFjY2Vzc2luZyBgcm91dGVySW5wdXRJZGAgb24gdGhlIGltcG9ydGVkIGlucHV0IHRocm93czsgb25seSBwcm92aWRlIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVySW5wdXRJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQIGFkZHJlc3MgdGhhdCB0aGUgcm91dGVyIGlucHV0IHVzZXMgdG8gaW5nZXN0IGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWNjZXNzaW5nIGBpcEFkZHJlc3NgIG9uIHRoZSBpbXBvcnRlZCBpbnB1dCB0aHJvd3M7IG9ubHkgcHJvdmlkZSB3aGVuIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGlwQWRkcmVzcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBGb3J3YXJkIEVycm9yIENvcnJlY3Rpb24gKEZFQykgb3B0aW9ucyBmb3IgUlRQIHByb3RvY29sXG4gKi9cbmV4cG9ydCBlbnVtIEZvcndhcmRFcnJvckNvcnJlY3Rpb24ge1xuICAvKiogRW5hYmxlIEZvcndhcmQgRXJyb3IgQ29ycmVjdGlvbiAqL1xuICBFTkFCTEVEPSdFTkFCTEVEJyxcbiAgLyoqIERpc2FibGUgRm9yd2FyZCBFcnJvciBDb3JyZWN0aW9uICovXG4gIERJU0FCTEVEPSdESVNBQkxFRCcsXG59XG5cbi8qKlxuICogSWRlbnRpZmllcyB3aGljaCBwcm90b2NvbCBpbiBhIGZhaWxvdmVyIGNvbmZpZ3VyYXRpb24ncyBwcm90b2NvbHMgYXJyYXkgaXMgcHJpbWFyeS5cbiAqL1xuZXhwb3J0IGVudW0gUHJpbWFyeVNvdXJjZSB7XG4gIC8qKiBUaGUgZmlyc3QgcHJvdG9jb2wgaW4gdGhlIGZhaWxvdmVyIHByb3RvY29scyBhcnJheS4gKi9cbiAgRklSU1RfU09VUkNFID0gMCxcbiAgLyoqIFRoZSBzZWNvbmQgcHJvdG9jb2wgaW4gdGhlIGZhaWxvdmVyIHByb3RvY29scyBhcnJheS4gKi9cbiAgU0VDT05EX1NPVVJDRSA9IDEsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgQ0ZOLWxldmVsIHZhbHVlcyBmb3IgdGhlIHNvdXJjZSBwcmlvcml0eSBtb2RlLlxuICogQGludGVybmFsXG4gKi9cbmVudW0gU291cmNlUHJpb3JpdHlNb2RlIHtcbiAgLyoqIEJvdGggc291cmNlcyBhcmUgZXF1YWwgcHJpb3JpdHkg4oCUIHRoZSBzZXJ2aWNlIHBpY2tzIG9uZS4gKi9cbiAgTk9fUFJJT1JJVFkgPSAnTk9fUFJJT1JJVFknLFxuICAvKiogT25lIHNvdXJjZSBpcyBwcmltYXJ5LCB0aGUgb3RoZXIgaXMgYmFja3VwLiAqL1xuICBQUklNQVJZX1NFQ09OREFSWSA9ICdQUklNQVJZX1NFQ09OREFSWScsXG59XG5cbi8qKlxuICogU291cmNlIHByaW9yaXR5IGNvbmZpZ3VyYXRpb24gZm9yIGZhaWxvdmVyIFJvdXRlciBJbnB1dCBjb25maWd1cmF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvdXJjZVByaW9yaXR5Q29uZmlnIHtcbiAgLyoqXG4gICAqIFRyZWF0IGJvdGggc291cmNlcyB3aXRoIGVxdWFsIHByaW9yaXR5IOKAlCBNZWRpYUNvbm5lY3QgcGlja3Mgb25lIHdoZW4gbmVlZGVkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBub25lKCk6IFNvdXJjZVByaW9yaXR5Q29uZmlnIHtcbiAgICByZXR1cm4gbmV3IFNvdXJjZVByaW9yaXR5Q29uZmlnKFNvdXJjZVByaW9yaXR5TW9kZS5OT19QUklPUklUWSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGUgb25lIG9mIHRoZSB0d28gc291cmNlcyBhcyBwcmltYXJ5OyB0aGUgb3RoZXIgaXMgdHJlYXRlZCBhcyBiYWNrdXAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHByaW1hcnlTZWNvbmRhcnkocHJpbWFyeTogUHJpbWFyeVNvdXJjZSk6IFNvdXJjZVByaW9yaXR5Q29uZmlnIHtcbiAgICByZXR1cm4gbmV3IFNvdXJjZVByaW9yaXR5Q29uZmlnKFNvdXJjZVByaW9yaXR5TW9kZS5QUklNQVJZX1NFQ09OREFSWSwgcHJpbWFyeSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21vZGU6IFNvdXJjZVByaW9yaXR5TW9kZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9wcmltYXJ5OiBQcmltYXJ5U291cmNlIHwgdW5kZWZpbmVkLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGNvbmZpZ3VyYXRpb24gdG8gaXRzIENGTiBzaGFwZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2JpbmQoKTogeyBzb3VyY2VQcmlvcml0eU1vZGU6IHN0cmluZzsgcHJpbWFyeVNvdXJjZUluZGV4PzogbnVtYmVyIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBzb3VyY2VQcmlvcml0eU1vZGU6IHRoaXMuX21vZGUsXG4gICAgICBwcmltYXJ5U291cmNlSW5kZXg6IHRoaXMuX3ByaW1hcnksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIFJUUCBwcm90b2NvbCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnRwUHJvdG9jb2xQcm9wcyB7XG4gIC8qKiBQb3J0IG51bWJlciBmb3IgUlRQIHRyYWZmaWMgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICAvKipcbiAgICogRm9yd2FyZCBFcnJvciBDb3JyZWN0aW9uIHNldHRpbmdcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQ7IHdoZW4gb21pdHRlZCwgTWVkaWFDb25uZWN0IGFwcGxpZXMgRm9yd2FyZEVycm9yQ29ycmVjdGlvbi5ESVNBQkxFRCBhdCBkZXBsb3kgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgZm9yd2FyZEVycm9yQ29ycmVjdGlvbj86IEZvcndhcmRFcnJvckNvcnJlY3Rpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgUklTVCBwcm90b2NvbCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlzdFByb3RvY29sUHJvcHMge1xuICAvKiogUG9ydCBudW1iZXIgZm9yIFJJU1QgdHJhZmZpYyAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG4gIC8qKiBSZWNvdmVyeSBsYXRlbmN5IGZvciBSSVNUICovXG4gIHJlYWRvbmx5IHJlY292ZXJ5TGF0ZW5jeTogRHVyYXRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgU1JUIExpc3RlbmVyIHByb3RvY29sIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcnRMaXN0ZW5lclByb3RvY29sUHJvcHMge1xuICAvKiogUG9ydCBudW1iZXIgZm9yIFNSVCBsaXN0ZW5lciAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG4gIC8qKiBNaW5pbXVtIGxhdGVuY3kgZm9yIFNSVCAqL1xuICByZWFkb25seSBtaW5pbXVtTGF0ZW5jeTogRHVyYXRpb247XG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZWNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIGVuY3J5cHRlZCBTUlQgc3RyZWFtc1xuICAgKiBAZGVmYXVsdCAtIE5vIGRlY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlY3J5cHRpb25Db25maWd1cmF0aW9uPzogUm91dGVyU3J0RW5jcnlwdGlvbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBTUlQgQ2FsbGVyIHByb3RvY29sIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcnRDYWxsZXJQcm90b2NvbFByb3BzIHtcbiAgLyoqIFNvdXJjZSBJUCBhZGRyZXNzIHRvIGNvbm5lY3QgdG8gKi9cbiAgcmVhZG9ubHkgc291cmNlQWRkcmVzczogc3RyaW5nO1xuICAvKiogU291cmNlIHBvcnQgdG8gY29ubmVjdCB0byAqL1xuICByZWFkb25seSBzb3VyY2VQb3J0OiBudW1iZXI7XG4gIC8qKiBNaW5pbXVtIGxhdGVuY3kgZm9yIFNSVCAqL1xuICByZWFkb25seSBtaW5pbXVtTGF0ZW5jeTogRHVyYXRpb247XG4gIC8qKlxuICAgKiBPcHRpb25hbCBzdHJlYW0gSUQgZm9yIFNSVCBjb25uZWN0aW9uXG4gICAqIEBkZWZhdWx0IC0gTm8gc3RyZWFtIElEXG4gICAqL1xuICByZWFkb25seSBzdHJlYW1JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRlY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgZW5jcnlwdGVkIFNSVCBzdHJlYW1zXG4gICAqIEBkZWZhdWx0IC0gTm8gZGVjcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVjcnlwdGlvbkNvbmZpZ3VyYXRpb24/OiBSb3V0ZXJTcnRFbmNyeXB0aW9uO1xufVxuXG4vKipcbiAqIElkZW50aWZpZXMgd2hpY2ggY29uZmlndXJhdGlvbiB0eXBlIGEgcG9ydCBjb25mbGljdCBjaGVjayBpcyBiZWluZyBwZXJmb3JtZWQgZm9yLlxuICogQGludGVybmFsXG4gKi9cbmVudW0gUHJvdG9jb2xDb25maWdUeXBlIHtcbiAgLyoqIEZhaWxvdmVyLW1vZGUgcm91dGVyIGlucHV0IGNvbmZpZ3VyYXRpb24uICovXG4gIEZBSUxPVkVSID0gJ2ZhaWxvdmVyJyxcbiAgLyoqIE1lcmdlLW1vZGUgcm91dGVyIGlucHV0IGNvbmZpZ3VyYXRpb24uICovXG4gIE1FUkdFID0gJ21lcmdlJyxcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGNsYXNzIGZvciBjcmVhdGluZyBSb3V0ZXIgSW5wdXQgcHJvdG9jb2wgY29uZmlndXJhdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIFJvdXRlcklucHV0UHJvdG9jb2wge1xuICAvKipcbiAgICogQ3JlYXRlIGFuIFJUUCBwcm90b2NvbCBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBwcm9wcyBSVFAgcHJvdG9jb2wgcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBSb3V0ZXJJbnB1dFByb3RvY29sIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIFJUUFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBydHAocHJvcHM6IFJ0cFByb3RvY29sUHJvcHMpOiBSb3V0ZXJJbnB1dFByb3RvY29sIHtcbiAgICBSb3V0ZXJJbnB1dFByb3RvY29sLnZhbGlkYXRlUG9ydChwcm9wcy5wb3J0KTtcbiAgICByZXR1cm4gbmV3IFJvdXRlcklucHV0UHJvdG9jb2woUm91dGVySW5wdXRQcm90b2NvbE9wdGlvbnMuUlRQLCB7XG4gICAgICBydHA6IHtcbiAgICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgICAgZm9yd2FyZEVycm9yQ29ycmVjdGlvbjogcHJvcHMuZm9yd2FyZEVycm9yQ29ycmVjdGlvbixcbiAgICAgIH0sXG4gICAgfSwgcHJvcHMucG9ydCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgUklTVCBwcm90b2NvbCBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBwcm9wcyBSSVNUIHByb3RvY29sIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgUm91dGVySW5wdXRQcm90b2NvbCBpbnN0YW5jZSBjb25maWd1cmVkIGZvciBSSVNUXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJpc3QocHJvcHM6IFJpc3RQcm90b2NvbFByb3BzKTogUm91dGVySW5wdXRQcm90b2NvbCB7XG4gICAgUm91dGVySW5wdXRQcm90b2NvbC52YWxpZGF0ZVBvcnQocHJvcHMucG9ydCk7XG4gICAgcmV0dXJuIG5ldyBSb3V0ZXJJbnB1dFByb3RvY29sKFJvdXRlcklucHV0UHJvdG9jb2xPcHRpb25zLlJJU1QsIHtcbiAgICAgIHJpc3Q6IHtcbiAgICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgICAgcmVjb3ZlcnlMYXRlbmN5TWlsbGlzZWNvbmRzOiBwcm9wcy5yZWNvdmVyeUxhdGVuY3kudG9NaWxsaXNlY29uZHMoKSxcbiAgICAgIH0sXG4gICAgfSwgcHJvcHMucG9ydCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIFNSVCBMaXN0ZW5lciBwcm90b2NvbCBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBwcm9wcyBTUlQgTGlzdGVuZXIgcHJvdG9jb2wgcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBSb3V0ZXJJbnB1dFByb3RvY29sIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIFNSVCBMaXN0ZW5lclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcnRMaXN0ZW5lcihwcm9wczogU3J0TGlzdGVuZXJQcm90b2NvbFByb3BzKTogUm91dGVySW5wdXRQcm90b2NvbCB7XG4gICAgUm91dGVySW5wdXRQcm90b2NvbC52YWxpZGF0ZVBvcnQocHJvcHMucG9ydCk7XG4gICAgcmV0dXJuIG5ldyBSb3V0ZXJJbnB1dFByb3RvY29sKFJvdXRlcklucHV0UHJvdG9jb2xPcHRpb25zLlNSVF9MSVNURU5FUiwge1xuICAgICAgc3J0TGlzdGVuZXI6IHtcbiAgICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgICAgbWluaW11bUxhdGVuY3lNaWxsaXNlY29uZHM6IHByb3BzLm1pbmltdW1MYXRlbmN5LnRvTWlsbGlzZWNvbmRzKCksXG4gICAgICB9LFxuICAgIH0sIHByb3BzLnBvcnQsIHByb3BzLmRlY3J5cHRpb25Db25maWd1cmF0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gU1JUIENhbGxlciBwcm90b2NvbCBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBwcm9wcyBTUlQgQ2FsbGVyIHByb3RvY29sIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgUm91dGVySW5wdXRQcm90b2NvbCBpbnN0YW5jZSBjb25maWd1cmVkIGZvciBTUlQgQ2FsbGVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNydENhbGxlcihwcm9wczogU3J0Q2FsbGVyUHJvdG9jb2xQcm9wcyk6IFJvdXRlcklucHV0UHJvdG9jb2wge1xuICAgIFJvdXRlcklucHV0UHJvdG9jb2wudmFsaWRhdGVTcnRDYWxsZXJQb3J0KHByb3BzLnNvdXJjZVBvcnQpO1xuICAgIHJldHVybiBuZXcgUm91dGVySW5wdXRQcm90b2NvbChSb3V0ZXJJbnB1dFByb3RvY29sT3B0aW9ucy5TUlRfQ0FMTEVSLCB7XG4gICAgICBzcnRDYWxsZXI6IHtcbiAgICAgICAgc291cmNlQWRkcmVzczogcHJvcHMuc291cmNlQWRkcmVzcyxcbiAgICAgICAgc291cmNlUG9ydDogcHJvcHMuc291cmNlUG9ydCxcbiAgICAgICAgbWluaW11bUxhdGVuY3lNaWxsaXNlY29uZHM6IHByb3BzLm1pbmltdW1MYXRlbmN5LnRvTWlsbGlzZWNvbmRzKCksXG4gICAgICAgIHN0cmVhbUlkOiBwcm9wcy5zdHJlYW1JZCxcbiAgICAgIH0sXG4gICAgfSwgdW5kZWZpbmVkLCBwcm9wcy5kZWNyeXB0aW9uQ29uZmlndXJhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCBwb3J0IGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2UgKDMwMDAtMzAwMDApXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZVBvcnQocG9ydDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocG9ydCkgJiYgKHBvcnQgPCAzMDAwIHx8IHBvcnQgPiAzMDAwMCkpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgUm91dGVySW5wdXRQb3J0UmFuZ2VgLCBgUG9ydCBtdXN0IGJlIGJldHdlZW4gMzAwMCBhbmQgMzAwMDAsIGdvdCAke3BvcnR9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgU1JUIENhbGxlciBwb3J0IGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2UgKDAtNjU1MzUpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZVNydENhbGxlclBvcnQocG9ydDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocG9ydCkgJiYgKHBvcnQgPCAwIHx8IHBvcnQgPiA2NTUzNSkpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU3J0Q2FsbGVyUG9ydFJhbmdlYCwgYFNSVCBDYWxsZXIgcG9ydCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNjU1MzUsIGdvdCAke3BvcnR9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvdG9jb2xOYW1lOiBSb3V0ZXJJbnB1dFByb3RvY29sT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlnOiBDZm5Sb3V0ZXJJbnB1dC5Sb3V0ZXJJbnB1dFByb3RvY29sQ29uZmlndXJhdGlvblByb3BlcnR5O1xuICBwcml2YXRlIHJlYWRvbmx5IF9wb3J0PzogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWNyeXB0aW9uPzogUm91dGVyU3J0RW5jcnlwdGlvbjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByb3RvY29sTmFtZTogUm91dGVySW5wdXRQcm90b2NvbE9wdGlvbnMsXG4gICAgY29uZmlnOiBDZm5Sb3V0ZXJJbnB1dC5Sb3V0ZXJJbnB1dFByb3RvY29sQ29uZmlndXJhdGlvblByb3BlcnR5LFxuICAgIHBvcnQ/OiBudW1iZXIsXG4gICAgZGVjcnlwdGlvbj86IFJvdXRlclNydEVuY3J5cHRpb24sXG4gICkge1xuICAgIHRoaXMuX3Byb3RvY29sTmFtZSA9IHByb3RvY29sTmFtZTtcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5fcG9ydCA9IHBvcnQ7XG4gICAgdGhpcy5fZGVjcnlwdGlvbiA9IGRlY3J5cHRpb247XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGlzIHByb3RvY29sIHRvIGl0cyBDRk4tcmVhZHkgZm9ybS4gUmV0dXJucyB0aGUgcHJvdG9jb2wgaWRlbnRpZmllcixcbiAgICogdGhlIENGTiBjb25maWd1cmF0aW9uIHNoYXBlICh3aXRoIFNSVCBkZWNyeXB0aW9uIGF1dG8tcm9sZSBtYXRlcmlhbGl6ZWQgaWYgbmVlZGVkKSxcbiAgICogYW5kIHRoZSBpbmdlc3QgcG9ydCBpZiB0aGUgcHJvdG9jb2wgaGFzIG9uZS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlICAgICAgICAgQ29uc3RydWN0IHRoYXQgc2NvcGVzIHRoZSBhdXRvLWNyZWF0ZWQgZGVjcnlwdGlvbiByb2xlXG4gICAqIEBwYXJhbSByb3V0ZXJJbnB1dEFybiAgT3B0aW9uYWwgQVJOIG9mIHRoZSBjb25zdW1pbmcgcm91dGVyIGlucHV0IOKAlCB3aGVuIHByb3ZpZGVkLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlcyB0aGUgYXV0by1jcmVhdGVkIGRlY3J5cHRpb24gcm9sZSdzIHRydXN0IHBvbGljeS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCwgcm91dGVySW5wdXRBcm4/OiBzdHJpbmcpOiB7XG4gICAgbmFtZTogUm91dGVySW5wdXRQcm90b2NvbE9wdGlvbnM7XG4gICAgY29uZmlnOiBDZm5Sb3V0ZXJJbnB1dC5Sb3V0ZXJJbnB1dFByb3RvY29sQ29uZmlndXJhdGlvblByb3BlcnR5O1xuICAgIHBvcnQ/OiBudW1iZXI7XG4gIH0ge1xuICAgIGlmICghdGhpcy5fZGVjcnlwdGlvbikge1xuICAgICAgcmV0dXJuIHsgbmFtZTogdGhpcy5fcHJvdG9jb2xOYW1lLCBjb25maWc6IHRoaXMuX2NvbmZpZywgcG9ydDogdGhpcy5fcG9ydCB9O1xuICAgIH1cblxuICAgIGNvbnN0IGRlY3J5cHRpb25Db25maWd1cmF0aW9uID0gcmVuZGVyUm91dGVyU3J0RW5jcnlwdGlvbihzY29wZSwgJ0RlY3J5cHRpb25Sb2xlJywgdGhpcy5fZGVjcnlwdGlvbiwgcm91dGVySW5wdXRBcm4pO1xuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5zcnRMaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogdGhpcy5fcHJvdG9jb2xOYW1lLFxuICAgICAgICBwb3J0OiB0aGlzLl9wb3J0LFxuICAgICAgICBjb25maWc6IHsgc3J0TGlzdGVuZXI6IHsgLi4udGhpcy5fY29uZmlnLnNydExpc3RlbmVyLCBkZWNyeXB0aW9uQ29uZmlndXJhdGlvbiB9IH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29uZmlnLnNydENhbGxlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogdGhpcy5fcHJvdG9jb2xOYW1lLFxuICAgICAgICBwb3J0OiB0aGlzLl9wb3J0LFxuICAgICAgICBjb25maWc6IHsgc3J0Q2FsbGVyOiB7IC4uLnRoaXMuX2NvbmZpZy5zcnRDYWxsZXIsIGRlY3J5cHRpb25Db25maWd1cmF0aW9uIH0gfSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IG5hbWU6IHRoaXMuX3Byb3RvY29sTmFtZSwgY29uZmlnOiB0aGlzLl9jb25maWcsIHBvcnQ6IHRoaXMuX3BvcnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSBpbmdlc3QgVVJMIChzY2hlbWU6Ly9pcEFkZHJlc3M6cG9ydCkgZm9yIHRoaXMgcHJvdG9jb2wsIGlmIGl0IGhhc1xuICAgKiBhIGxpc3RlbmluZyBwb3J0LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfaW5nZXN0VXJsKGlwQWRkcmVzczogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fcG9ydCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZW5kZXJJbmdlc3RVcmwodGhpcy5fcHJvdG9jb2xOYW1lLnZhbHVlLCB0aGlzLl9wb3J0LCBpcEFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0ZW5pbmcgcG9ydCBmb3IgdGhpcyBwcm90b2NvbCwgaWYgaXQgaGFzIG9uZS4gVW5kZWZpbmVkIGZvciBTUlQgY2FsbGVyXG4gICAqICh3aGljaCBoYXMgYSBgc291cmNlUG9ydGAgcG9pbnRpbmcgYXQgdGhlIHVwc3RyZWFtIGxpc3RlbmVyLCBub3QgYSBwb3J0IHRoZSBpbnB1dFxuICAgKiBpdHNlbGYgbGlzdGVucyBvbikuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9saXN0ZW5pbmdQb3J0KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BvcnQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0d28gcHJvdG9jb2xzIHNoYXJlIHRoZSBzYW1lIHByb3RvY29sIGlkZW50aWZpZXIuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9tYXRjaGVzS2luZChvdGhlcjogUm91dGVySW5wdXRQcm90b2NvbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wcm90b2NvbE5hbWUudmFsdWUgPT09IG90aGVyLl9wcm90b2NvbE5hbWUudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHByb3RvY29sIGlzIFNSVCAoQ2FsbGVyIG9yIExpc3RlbmVyKS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2lzU3J0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wcm90b2NvbE5hbWUudmFsdWUgPT09IFJvdXRlcklucHV0UHJvdG9jb2xPcHRpb25zLlNSVF9DQUxMRVIudmFsdWVcbiAgICAgIHx8IHRoaXMuX3Byb3RvY29sTmFtZS52YWx1ZSA9PT0gUm91dGVySW5wdXRQcm90b2NvbE9wdGlvbnMuU1JUX0xJU1RFTkVSLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBvcnQgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHRoaXMgcHJvdG9jb2wgYW5kIGFub3RoZXIgaW4gYSBmYWlsb3ZlciBvclxuICAgKiBtZXJnZSBjb25maWd1cmF0aW9uLiBUaHJvd3Mgb24gY29uZmxpY3RzIGFwcHJvcHJpYXRlIHRvIHRoZSBwcm90b2NvbCBraW5kLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdmFsaWRhdGVQb3J0Q29uZmxpY3RzKG90aGVyOiBSb3V0ZXJJbnB1dFByb3RvY29sLCBjb25maWdUeXBlOiBQcm90b2NvbENvbmZpZ1R5cGUpOiB2b2lkIHtcbiAgICBjb25zdCBwcm90b2NvbFZhbHVlID0gdGhpcy5fcHJvdG9jb2xOYW1lLnZhbHVlO1xuXG4gICAgaWYgKHByb3RvY29sVmFsdWUgPT09IFJvdXRlcklucHV0UHJvdG9jb2xPcHRpb25zLlJJU1QudmFsdWUpIHtcbiAgICAgIGNvbnN0IHJpc3QxID0gdGhpcy5fY29uZmlnLnJpc3Q7XG4gICAgICBjb25zdCByaXN0MiA9IG90aGVyLl9jb25maWcucmlzdDtcbiAgICAgIGlmIChyaXN0MSAmJiByaXN0MiAmJiAncG9ydCcgaW4gcmlzdDEgJiYgJ3BvcnQnIGluIHJpc3QyKSB7XG4gICAgICAgIGNvbnN0IHBvcnQxID0gcmlzdDEucG9ydDtcbiAgICAgICAgY29uc3QgcG9ydDIgPSByaXN0Mi5wb3J0O1xuICAgICAgICBpZiAocG9ydDEgPT09IHBvcnQyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICAgbGl0YER1cGxpY2F0ZVJpc3RQb3J0YCxcbiAgICAgICAgICAgIGAke2NvbmZpZ1R5cGV9IGNvbmZpZ3VyYXRpb24gY2Fubm90IHVzZSB0aGUgc2FtZSBSSVNUIHBvcnQgJHtwb3J0MX0gZm9yIGJvdGggcHJvdG9jb2xzLCBgICtcbiAgICAgICAgICAgICdlYWNoIHByb3RvY29sIG11c3QgdXNlIGEgZGlmZmVyZW50IHBvcnQgbnVtYmVyJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChNYXRoLmFicyhwb3J0MSAtIHBvcnQyKSA8IDIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBsaXRgQ29uc2VjdXRpdmVSaXN0UG9ydGAsXG4gICAgICAgICAgICBgJHtjb25maWdUeXBlfSBjb25maWd1cmF0aW9uIGNhbm5vdCB1c2UgY29uc2VjdXRpdmUgUklTVCBwb3J0cyAke01hdGgubWluKHBvcnQxLCBwb3J0Mil9IGFuZCAke01hdGgubWF4KHBvcnQxLCBwb3J0Mil9LCBgICtcbiAgICAgICAgICAgICdSSVNUIHByb3RvY29scyByZXF1aXJlIG5vbi1jb25zZWN1dGl2ZSBwb3J0cyB0byBhdm9pZCBvdmVybGFwcGluZyByYW5nZXMgKGUuZy4sIHVzZSA2MDAwIGFuZCA2MDAyKScsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm90b2NvbFZhbHVlID09PSBSb3V0ZXJJbnB1dFByb3RvY29sT3B0aW9ucy5SVFAudmFsdWUpIHtcbiAgICAgIGNvbnN0IHJ0cDEgPSB0aGlzLl9jb25maWcucnRwO1xuICAgICAgY29uc3QgcnRwMiA9IG90aGVyLl9jb25maWcucnRwO1xuICAgICAgaWYgKHJ0cDEgJiYgcnRwMiAmJiAncG9ydCcgaW4gcnRwMSAmJiAncG9ydCcgaW4gcnRwMiAmJiBydHAxLnBvcnQgPT09IHJ0cDIucG9ydCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YER1cGxpY2F0ZVJ0cFBvcnRgLFxuICAgICAgICAgIGAke2NvbmZpZ1R5cGV9IGNvbmZpZ3VyYXRpb24gY2Fubm90IHVzZSB0aGUgc2FtZSBSVFAgcG9ydCAke3J0cDEucG9ydH0gZm9yIGJvdGggcHJvdG9jb2xzLCBgICtcbiAgICAgICAgICAnZWFjaCBwcm90b2NvbCBtdXN0IHVzZSBhIGRpZmZlcmVudCBwb3J0IG51bWJlcicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3RvY29sVmFsdWUgPT09IFJvdXRlcklucHV0UHJvdG9jb2xPcHRpb25zLlNSVF9MSVNURU5FUi52YWx1ZSkge1xuICAgICAgY29uc3Qgc3J0MSA9IHRoaXMuX2NvbmZpZy5zcnRMaXN0ZW5lcjtcbiAgICAgIGNvbnN0IHNydDIgPSBvdGhlci5fY29uZmlnLnNydExpc3RlbmVyO1xuICAgICAgaWYgKHNydDEgJiYgc3J0MiAmJiAncG9ydCcgaW4gc3J0MSAmJiAncG9ydCcgaW4gc3J0MiAmJiBzcnQxLnBvcnQgPT09IHNydDIucG9ydCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YER1cGxpY2F0ZVNydExpc3RlbmVyUG9ydGAsXG4gICAgICAgICAgYCR7Y29uZmlnVHlwZX0gY29uZmlndXJhdGlvbiBjYW5ub3QgdXNlIHRoZSBzYW1lIFNSVCBMaXN0ZW5lciBwb3J0ICR7c3J0MS5wb3J0fSBmb3IgYm90aCBwcm90b2NvbHMsIGAgK1xuICAgICAgICAgICdlYWNoIHByb3RvY29sIG11c3QgdXNlIGEgZGlmZmVyZW50IHBvcnQgbnVtYmVyJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBzdGFuZGFyZCBSb3V0ZXIgSW5wdXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYXJkQ29uZmlndXJhdGlvblByb3BzIHtcbiAgLyoqIE5ldHdvcmsgaW50ZXJmYWNlIGZvciB0aGUgUm91dGVyIElucHV0ICovXG4gIHJlYWRvbmx5IG5ldHdvcmtJbnRlcmZhY2U6IElSb3V0ZXJOZXR3b3JrSW50ZXJmYWNlO1xuICAvKiogUHJvdG9jb2wgY29uZmlndXJhdGlvbiBmb3IgdGhlIGlucHV0ICovXG4gIHJlYWRvbmx5IHByb3RvY29sOiBSb3V0ZXJJbnB1dFByb3RvY29sO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGZhaWxvdmVyIFJvdXRlciBJbnB1dCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmFpbG92ZXJDb25maWd1cmF0aW9uUHJvcHMge1xuICAvKiogTmV0d29yayBpbnRlcmZhY2UgZm9yIHRoZSBSb3V0ZXIgSW5wdXQgKi9cbiAgcmVhZG9ubHkgbmV0d29ya0ludGVyZmFjZTogSVJvdXRlck5ldHdvcmtJbnRlcmZhY2U7XG4gIC8qKiBBcnJheSBvZiBleGFjdGx5IDIgcHJvdG9jb2wgY29uZmlndXJhdGlvbnMgZm9yIGZhaWxvdmVyIChtdXN0IGJlIHNhbWUgcHJvdG9jb2wgdHlwZSkgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2xzOiBSb3V0ZXJJbnB1dFByb3RvY29sW107XG4gIC8qKlxuICAgKiBTb3VyY2UgcHJpb3JpdHkgY29uZmlndXJhdGlvbiBmb3IgZmFpbG92ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IFNvdXJjZVByaW9yaXR5Q29uZmlnLm5vbmUoKVxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUHJpb3JpdHk/OiBTb3VyY2VQcmlvcml0eUNvbmZpZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBtZXJnZSBSb3V0ZXIgSW5wdXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lcmdlQ29uZmlndXJhdGlvblByb3BzIHtcbiAgLyoqIE5ldHdvcmsgaW50ZXJmYWNlIGZvciB0aGUgUm91dGVyIElucHV0ICovXG4gIHJlYWRvbmx5IG5ldHdvcmtJbnRlcmZhY2U6IElSb3V0ZXJOZXR3b3JrSW50ZXJmYWNlO1xuICAvKiogQXJyYXkgb2YgZXhhY3RseSAyIHByb3RvY29sIGNvbmZpZ3VyYXRpb25zIGZvciBtZXJnZSAobXVzdCBiZSBzYW1lIG5vbi1TUlQgcHJvdG9jb2wgdHlwZSkgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2xzOiBSb3V0ZXJJbnB1dFByb3RvY29sW107XG4gIC8qKiBSZWNvdmVyeSB3aW5kb3cgZm9yIG1lcmdlIG9wZXJhdGlvbiAqL1xuICByZWFkb25seSBtZXJnZVJlY292ZXJ5V2luZG93OiBEdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBNZWRpYUNvbm5lY3QgRmxvdyBSb3V0ZXIgSW5wdXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhQ29ubmVjdEZsb3dDb25maWd1cmF0aW9uUHJvcHMge1xuICAvKiogVGhlIE1lZGlhQ29ubmVjdCBmbG93IHRvIHVzZSBhcyBpbnB1dCAqL1xuICByZWFkb25seSBmbG93OiBJRmxvdztcbiAgLyoqIFRoZSBmbG93IG91dHB1dCB0aGF0IGZlZWRzIHRoaXMgcm91dGVyIGlucHV0ICovXG4gIHJlYWRvbmx5IGZsb3dPdXRwdXQ6IElGbG93T3V0cHV0O1xuICAvKipcbiAgICogT3B0aW9uYWwgdHJhbnNpdCBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICogQGRlZmF1bHQgLSBBdXRvbWF0aWMgZW5jcnlwdGlvbiB3aWxsIGJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVRyYW5zaXREZWNyeXB0aW9uPzogVHJhbnNpdEVuY3J5cHRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgTWVkaWFDb25uZWN0IEZsb3cgUm91dGVyIElucHV0IGNvbmZpZ3VyYXRpb24gLSB3aXRob3V0IGEgY29ubmVjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhQ29ubmVjdEZsb3dDb25maWd1cmF0aW9uV2l0aG91dENvbm5lY3Rpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBBdmFpbGFiaWxpdHkgWm9uZSB0aGUgcm91dGVyIGlucHV0IHdpbGwgYmUgcGxhY2VkIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgdHJhbnNpdCBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICogQGRlZmF1bHQgLSBBdXRvbWF0aWMgZW5jcnlwdGlvbiB3aWxsIGJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVRyYW5zaXREZWNyeXB0aW9uPzogVHJhbnNpdEVuY3J5cHRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgTWVkaWFMaXZlIENoYW5uZWwgUm91dGVyIElucHV0IGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVXNlIHRoaXMgd2hlbiB0aGUgTWVkaWFMaXZlIGNoYW5uZWwgYWxyZWFkeSBleGlzdHMgYW5kIHlvdSB3YW50IHRvIGluZ2VzdFxuICogZnJvbSBvbmUgb2YgaXRzIG91dHB1dHMgaW1tZWRpYXRlbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFMaXZlQ2hhbm5lbENvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBBUk4gb2YgdGhlIE1lZGlhTGl2ZSBjaGFubmVsIHRvIHVzZSBhcyBpbnB1dC5cbiAgICpcbiAgICogTm90ZTogVGhpcyB3aWxsIGNoYW5nZSB0byBhY2NlcHQgYSB0eXBlZCBNZWRpYUxpdmUgY2hhbm5lbCByZWZlcmVuY2VcbiAgICogd2hlbiB0aGUgQGF3cy1jZGsvYXdzLW1lZGlhbGl2ZS1hbHBoYSBMMiBjb25zdHJ1Y3QgaXMgcmVsZWFzZWQuXG4gICAqL1xuICByZWFkb25seSBtZWRpYUxpdmVDaGFubmVsQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBNZWRpYUxpdmUgY2hhbm5lbCBvdXRwdXQgdG8gY29ubmVjdCB0byB0aGlzIHJvdXRlciBpbnB1dC5cbiAgICovXG4gIHJlYWRvbmx5IG1lZGlhTGl2ZUNoYW5uZWxPdXRwdXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBNZWRpYUxpdmUgcGlwZWxpbmUgdG8gY29ubmVjdCB0byB0aGlzIHJvdXRlciBpbnB1dC5cbiAgICovXG4gIHJlYWRvbmx5IG1lZGlhTGl2ZVBpcGVsaW5lSWQ6IE1lZGlhTGl2ZVBpcGVsaW5lO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCB0cmFuc2l0IGVuY3J5cHRpb24gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBdXRvbWF0aWMgZW5jcnlwdGlvbiB3aWxsIGJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVRyYW5zaXREZWNyeXB0aW9uPzogVHJhbnNpdEVuY3J5cHRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgTWVkaWFMaXZlIENoYW5uZWwgUm91dGVyIElucHV0IGNvbmZpZ3VyYXRpb24gd2l0aG91dCBhIHNwZWNpZmljIGNoYW5uZWwgY29ubmVjdGlvbi5cbiAqXG4gKiBVc2UgdGhpcyB3aGVuIHlvdSB3YW50IHRvIHNldCB1cCB0aGUgcm91dGVyIGlucHV0IGJlZm9yZSB0aGUgdGFyZ2V0IE1lZGlhTGl2ZSBjaGFubmVsIGV4aXN0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZWRpYUxpdmVDaGFubmVsQ29uZmlndXJhdGlvbldpdGhvdXRDb25uZWN0aW9uUHJvcHMge1xuICAvKipcbiAgICogQXZhaWxhYmlsaXR5IFpvbmUgdGhlIHJvdXRlciBpbnB1dCB3aWxsIGJlIHBsYWNlZCBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgdHJhbnNpdCBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQXV0b21hdGljIGVuY3J5cHRpb24gd2lsbCBiZSB1c2VkXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VUcmFuc2l0RGVjcnlwdGlvbj86IFRyYW5zaXRFbmNyeXB0aW9uO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIFJvdXRlciBJbnB1dCBjb25maWd1cmF0aW9uc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUm91dGVySW5wdXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0YW5kYXJkIFJvdXRlciBJbnB1dCBjb25maWd1cmF0aW9uIHdpdGggYSBzaW5nbGUgcHJvdG9jb2xcbiAgICogQHBhcmFtIHByb3BzIFN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBSb3V0ZXJJbnB1dENvbmZpZ3VyYXRpb24gaW5zdGFuY2UgZm9yIHN0YW5kYXJkIHNldHVwXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHN0YW5kYXJkKHByb3BzOiBTdGFuZGFyZENvbmZpZ3VyYXRpb25Qcm9wcyk6IFJvdXRlcklucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBTdGFuZGFyZFJvdXRlcklucHV0Q29uZmlnKHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBmYWlsb3ZlciBSb3V0ZXIgSW5wdXQgY29uZmlndXJhdGlvbiB3aXRoIHR3byBtYXRjaGluZyBwcm90b2NvbHNcbiAgICogQHBhcmFtIHByb3BzIEZhaWxvdmVyIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBSb3V0ZXJJbnB1dENvbmZpZ3VyYXRpb24gaW5zdGFuY2UgZm9yIGZhaWxvdmVyIHNldHVwXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgcHJvdG9jb2xzIGRvbid0IG1hdGNoIG9yIGNvdW50IGlzIG5vdCBleGFjdGx5IDJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZmFpbG92ZXIocHJvcHM6IEZhaWxvdmVyQ29uZmlndXJhdGlvblByb3BzKTogUm91dGVySW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5wcm90b2NvbHMpICYmIHByb3BzLnByb3RvY29scy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgRmFpbG92ZXJQcm90b2NvbENvdW50YCwgYEZhaWxvdmVyIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgZXhhY3RseSAyIHByb3RvY29scywgZ290ICR7cHJvcHMucHJvdG9jb2xzLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgaWYgKCFwcm9wcy5wcm90b2NvbHNbMF0uX21hdGNoZXNLaW5kKHByb3BzLnByb3RvY29sc1sxXSkpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgRmFpbG92ZXJQcm90b2NvbE1pc21hdGNoYCwgJ1Byb3RvY29scyBtdXN0IG1hdGNoJyk7XG4gICAgfVxuICAgIHByb3BzLnByb3RvY29sc1swXS5fdmFsaWRhdGVQb3J0Q29uZmxpY3RzKHByb3BzLnByb3RvY29sc1sxXSwgUHJvdG9jb2xDb25maWdUeXBlLkZBSUxPVkVSKTtcbiAgICByZXR1cm4gbmV3IEZhaWxvdmVyUm91dGVySW5wdXRDb25maWcocHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG1lcmdlIFJvdXRlciBJbnB1dCBjb25maWd1cmF0aW9uIHdpdGggdHdvIG1hdGNoaW5nIG5vbi1TUlQgcHJvdG9jb2xzXG4gICAqIEBwYXJhbSBwcm9wcyBNZXJnZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgUm91dGVySW5wdXRDb25maWd1cmF0aW9uIGluc3RhbmNlIGZvciBtZXJnZSBzZXR1cFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHByb3RvY29scyBkb24ndCBtYXRjaCwgY291bnQgaXMgbm90IGV4YWN0bHkgMiwgb3IgU1JUIHByb3RvY29scyBhcmUgdXNlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtZXJnZShwcm9wczogTWVyZ2VDb25maWd1cmF0aW9uUHJvcHMpOiBSb3V0ZXJJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLnByb3RvY29scykgJiYgcHJvcHMucHJvdG9jb2xzLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBNZXJnZVByb3RvY29sQ291bnRgLCBgTWVyZ2UgY29uZmlndXJhdGlvbiByZXF1aXJlcyBleGFjdGx5IDIgcHJvdG9jb2xzLCBnb3QgJHtwcm9wcy5wcm90b2NvbHMubGVuZ3RofWApO1xuICAgIH1cbiAgICBpZiAocHJvcHMucHJvdG9jb2xzLnNvbWUocCA9PiBwLl9pc1NydCgpKSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBNZXJnZVNydE5vdFN1cHBvcnRlZGAsICdTUlQgcHJvdG9jb2xzIGFyZSBub3Qgc3VwcG9ydGVkIGluIG1lcmdlIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCFwcm9wcy5wcm90b2NvbHNbMF0uX21hdGNoZXNLaW5kKHByb3BzLnByb3RvY29sc1sxXSkpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTWVyZ2VQcm90b2NvbE1pc21hdGNoYCwgJ1Byb3RvY29scyBtdXN0IG1hdGNoJyk7XG4gICAgfVxuICAgIHByb3BzLnByb3RvY29sc1swXS5fdmFsaWRhdGVQb3J0Q29uZmxpY3RzKHByb3BzLnByb3RvY29sc1sxXSwgUHJvdG9jb2xDb25maWdUeXBlLk1FUkdFKTtcbiAgICByZXR1cm4gbmV3IE1lcmdlUm91dGVySW5wdXRDb25maWcocHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIE1lZGlhQ29ubmVjdCBGbG93IFJvdXRlciBJbnB1dCBjb25maWd1cmF0aW9uIHdpdGhvdXQgY29ubmVjdGluZyB0byBhIHNwZWNpZmljIGZsb3dcbiAgICogVXNlIHRoaXMgd2hlbiB5b3Ugd2FudCB0byBwcmVwYXJlIHRoZSByb3V0ZXIgaW5wdXQgZm9yIGEgZmxvdyBjb25uZWN0aW9uIGxhdGVyXG4gICAqIEBwYXJhbSBwcm9wcyBNZWRpYUNvbm5lY3QgRmxvdyBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgd2l0aG91dCBjb25uZWN0aW9uXG4gICAqIEByZXR1cm5zIFJvdXRlcklucHV0Q29uZmlndXJhdGlvbiBpbnN0YW5jZSBmb3IgTWVkaWFDb25uZWN0IEZsb3cgc2V0dXAgd2l0aG91dCBjb25uZWN0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1lZGlhQ29ubmVjdEZsb3dXaXRob3V0Q29ubmVjdGlvbihwcm9wczogTWVkaWFDb25uZWN0Rmxvd0NvbmZpZ3VyYXRpb25XaXRob3V0Q29ubmVjdGlvblByb3BzKTogUm91dGVySW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE1lZGlhQ29ubmVjdEZsb3dSb3V0ZXJJbnB1dENvbmZpZyh7IHNvdXJjZVRyYW5zaXREZWNyeXB0aW9uOiBwcm9wcy5zb3VyY2VUcmFuc2l0RGVjcnlwdGlvbiB9LCBwcm9wcy5hdmFpbGFiaWxpdHlab25lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBNZWRpYUNvbm5lY3QgRmxvdyBSb3V0ZXIgSW5wdXQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogVXNlIHRoaXMgd2hlbiB0aGUgc291cmNlIGZsb3cgYWxyZWFkeSBleGlzdHMgYW5kIHlvdSB3YW50IHRvIGNvbm5lY3QgaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBNZWRpYUNvbm5lY3QgRmxvdyBjb25maWd1cmF0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgUm91dGVySW5wdXRDb25maWd1cmF0aW9uIGluc3RhbmNlIGZvciBNZWRpYUNvbm5lY3QgRmxvdyBzZXR1cFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtZWRpYUNvbm5lY3RGbG93KHByb3BzOiBNZWRpYUNvbm5lY3RGbG93Q29uZmlndXJhdGlvblByb3BzKTogUm91dGVySW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE1lZGlhQ29ubmVjdEZsb3dSb3V0ZXJJbnB1dENvbmZpZyh7XG4gICAgICBmbG93OiBwcm9wcy5mbG93LFxuICAgICAgZmxvd091dHB1dDogcHJvcHMuZmxvd091dHB1dCxcbiAgICAgIHNvdXJjZVRyYW5zaXREZWNyeXB0aW9uOiBwcm9wcy5zb3VyY2VUcmFuc2l0RGVjcnlwdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBNZWRpYUxpdmUgQ2hhbm5lbCBSb3V0ZXIgSW5wdXQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogVXNlIHRoaXMgd2hlbiB0aGUgc291cmNlIE1lZGlhTGl2ZSBjaGFubmVsIGFscmVhZHkgZXhpc3RzIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBpbmdlc3QgZnJvbSBvbmUgb2YgaXRzIG91dHB1dHMgaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBNZWRpYUxpdmUgY2hhbm5lbCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgUm91dGVySW5wdXRDb25maWd1cmF0aW9uIGluc3RhbmNlIGZvciBNZWRpYUxpdmUgY2hhbm5lbCBzZXR1cFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtZWRpYUxpdmVDaGFubmVsKHByb3BzOiBNZWRpYUxpdmVDaGFubmVsQ29uZmlndXJhdGlvblByb3BzKTogUm91dGVySW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE1lZGlhTGl2ZUNoYW5uZWxSb3V0ZXJJbnB1dENvbmZpZyh7XG4gICAgICBtZWRpYUxpdmVDaGFubmVsQXJuOiBwcm9wcy5tZWRpYUxpdmVDaGFubmVsQXJuLFxuICAgICAgbWVkaWFMaXZlQ2hhbm5lbE91dHB1dE5hbWU6IHByb3BzLm1lZGlhTGl2ZUNoYW5uZWxPdXRwdXROYW1lLFxuICAgICAgbWVkaWFMaXZlUGlwZWxpbmVJZDogcHJvcHMubWVkaWFMaXZlUGlwZWxpbmVJZCxcbiAgICAgIHNvdXJjZVRyYW5zaXREZWNyeXB0aW9uOiBwcm9wcy5zb3VyY2VUcmFuc2l0RGVjcnlwdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBNZWRpYUxpdmUgQ2hhbm5lbCBSb3V0ZXIgSW5wdXQgY29uZmlndXJhdGlvbiB3aXRob3V0IGEgc3BlY2lmaWMgY2hhbm5lbCBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBVc2UgdGhpcyB3aGVuIHlvdSB3YW50IHRvIHNldCB1cCB0aGUgcm91dGVyIGlucHV0IGJlZm9yZSB0aGUgdGFyZ2V0IE1lZGlhTGl2ZSBjaGFubmVsIGV4aXN0cy5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIE1lZGlhTGl2ZSBjaGFubmVsIG5vLWNvbm5lY3Rpb24gcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBSb3V0ZXJJbnB1dENvbmZpZ3VyYXRpb24gaW5zdGFuY2UgZm9yIE1lZGlhTGl2ZSBjaGFubmVsIHNldHVwIHdpdGhvdXQgY29ubmVjdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtZWRpYUxpdmVDaGFubmVsV2l0aG91dENvbm5lY3Rpb24ocHJvcHM6IE1lZGlhTGl2ZUNoYW5uZWxDb25maWd1cmF0aW9uV2l0aG91dENvbm5lY3Rpb25Qcm9wcyk6IFJvdXRlcklucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBNZWRpYUxpdmVDaGFubmVsUm91dGVySW5wdXRDb25maWcoeyBzb3VyY2VUcmFuc2l0RGVjcnlwdGlvbjogcHJvcHMuc291cmNlVHJhbnNpdERlY3J5cHRpb24gfSwgcHJvcHMuYXZhaWxhYmlsaXR5Wm9uZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gaXRzIENsb3VkRm9ybWF0aW9uIHNoYXBlLiBDYWxsZWQgYnkgdGhlIFJvdXRlcklucHV0XG4gICAqIGNvbnN0cnVjdG9yIOKAlCBlYWNoIGNvbmNyZXRlIHN1YmNsYXNzIHN1cHBsaWVzIGl0cyBvd24gdmFyaWFudC1zcGVjaWZpYyByZW5kZXJpbmcuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIHJvdXRlcklucHV0QXJuPzogc3RyaW5nKToge1xuICAgIGNvbmZpZzogQ2ZuUm91dGVySW5wdXQuUm91dGVySW5wdXRDb25maWd1cmF0aW9uUHJvcGVydHk7IGF2YWlsYWJpbGl0eVpvbmU/OiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgdGhlIGluZ2VzdCBlbmRwb2ludHMgZm9yIHByb3RvY29sLWJhc2VkIGlucHV0cyB0aGF0IGxpc3RlbiBvbiBvbmUgb3IgbW9yZVxuICAgKiBwb3J0cy5cbiAgICpcbiAgICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSB2YXJpYW50IGhhcyBubyBjb25jZXB0IG9mIGEgbGlzdGVuIHBvcnQgKFNSVCBjYWxsZXIsXG4gICAqIE1lZGlhQ29ubmVjdCBGbG93LCBNZWRpYUxpdmUgQ2hhbm5lbCkuIFJldHVybnMgYW4gYXJyYXkgd2l0aCBvbmUgZW50cnkgZm9yXG4gICAqIHN0YW5kYXJkIHZhcmlhbnRzLCBhbmQgb25lIGVudHJ5IHBlciBzb3VyY2UgZm9yIGZhaWxvdmVyIGFuZCBtZXJnZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgX2VuZHBvaW50cyhpcEFkZHJlc3M6IHN0cmluZyk6IFJvdXRlcklucHV0RW5kcG9pbnRbXSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZW5kZXIgYW4gaW5nZXN0IFVSTCBzdHJpbmcgKHNjaGVtZTovL2lwOnBvcnQpLiBVc2VkIGJ5IGBfaW5nZXN0VXJsKClgIG9uIGluZGl2aWR1YWxcbiAqIHByb3RvY29scyBhbmQgY29tcG9zZWQgaW50byB0aGUgcGVyLWNvbmZpZy12YXJpYW50IGBfZW5kcG9pbnRzKClgIHJlc3VsdHMuXG4gKlxuICogRXh0cmFjdHMgdGhlIGJhc2UgcHJvdG9jb2wgZm9yIHRoZSBVUkwgc2NoZW1lIChlLmcuIFNSVF9MSVNURU5FUiDihpIgc3J0LCBSVFAg4oaSIHJ0cCkuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckluZ2VzdFVybChwcm90b2NvbE5hbWU6IHN0cmluZywgcG9ydDogbnVtYmVyLCBpcEFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNjaGVtZSA9IHByb3RvY29sTmFtZS50b0xvd2VyQ2FzZSgpLnNwbGl0KCdfJylbMF07XG4gIHJldHVybiBGbi5qb2luKCcnLCBbYCR7c2NoZW1lfTovL2AsIGlwQWRkcmVzcywgYDoke3BvcnR9YF0pO1xufVxuXG4vKipcbiAqIENvbmNyZXRlIHZhcmlhbnQ6IHN0YW5kYXJkIChzaW5nbGUtcHJvdG9jb2wpIHJvdXRlciBpbnB1dCBjb25maWd1cmF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbmNsYXNzIFN0YW5kYXJkUm91dGVySW5wdXRDb25maWcgZXh0ZW5kcyBSb3V0ZXJJbnB1dENvbmZpZ3VyYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBTdGFuZGFyZENvbmZpZ3VyYXRpb25Qcm9wcykgeyBzdXBlcigpOyB9XG5cbiAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIHJvdXRlcklucHV0QXJuPzogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLnByb3BzLnByb3RvY29sLl9iaW5kKHNjb3BlLCByb3V0ZXJJbnB1dEFybik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBzdGFuZGFyZDoge1xuICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2VBcm46IHRoaXMucHJvcHMubmV0d29ya0ludGVyZmFjZS5yb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQXJuLFxuICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbC5uYW1lLnZhbHVlLFxuICAgICAgICAgIHByb3RvY29sQ29uZmlndXJhdGlvbjogcHJvdG9jb2wuY29uZmlnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIF9lbmRwb2ludHMoaXBBZGRyZXNzOiBzdHJpbmcpOiBSb3V0ZXJJbnB1dEVuZHBvaW50W10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHVybCA9IHRoaXMucHJvcHMucHJvdG9jb2wuX2luZ2VzdFVybChpcEFkZHJlc3MpO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnByb3BzLnByb3RvY29sLl9saXN0ZW5pbmdQb3J0KCk7XG4gICAgaWYgKHVybCA9PT0gdW5kZWZpbmVkIHx8IHBvcnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gW3sgdXJsLCBwb3J0IH1dO1xuICB9XG59XG5cbi8qKlxuICogQ29uY3JldGUgdmFyaWFudDogZmFpbG92ZXIgcm91dGVyIGlucHV0IGNvbmZpZ3VyYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuY2xhc3MgRmFpbG92ZXJSb3V0ZXJJbnB1dENvbmZpZyBleHRlbmRzIFJvdXRlcklucHV0Q29uZmlndXJhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEZhaWxvdmVyQ29uZmlndXJhdGlvblByb3BzKSB7IHN1cGVyKCk7IH1cblxuICBwdWJsaWMgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCwgcm91dGVySW5wdXRBcm4/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBwcmlvcml0eSA9ICh0aGlzLnByb3BzLnNvdXJjZVByaW9yaXR5ID8/IFNvdXJjZVByaW9yaXR5Q29uZmlnLm5vbmUoKSkuX2JpbmQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGZhaWxvdmVyOiB7XG4gICAgICAgICAgbmV0d29ya0ludGVyZmFjZUFybjogdGhpcy5wcm9wcy5uZXR3b3JrSW50ZXJmYWNlLnJvdXRlck5ldHdvcmtJbnRlcmZhY2VBcm4sXG4gICAgICAgICAgcHJvdG9jb2xDb25maWd1cmF0aW9uczogdGhpcy5wcm9wcy5wcm90b2NvbHMubWFwKHAgPT4gcC5fYmluZChzY29wZSwgcm91dGVySW5wdXRBcm4pLmNvbmZpZyksXG4gICAgICAgICAgc291cmNlUHJpb3JpdHlNb2RlOiBwcmlvcml0eS5zb3VyY2VQcmlvcml0eU1vZGUsXG4gICAgICAgICAgcHJpbWFyeVNvdXJjZUluZGV4OiBwcmlvcml0eS5wcmltYXJ5U291cmNlSW5kZXgsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgX2VuZHBvaW50cyhpcEFkZHJlc3M6IHN0cmluZyk6IFJvdXRlcklucHV0RW5kcG9pbnRbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZW5kcG9pbnRzOiBSb3V0ZXJJbnB1dEVuZHBvaW50W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5wcm9wcy5wcm90b2NvbHMpIHtcbiAgICAgIGNvbnN0IHVybCA9IHAuX2luZ2VzdFVybChpcEFkZHJlc3MpO1xuICAgICAgY29uc3QgcG9ydCA9IHAuX2xpc3RlbmluZ1BvcnQoKTtcbiAgICAgIGlmICh1cmwgPT09IHVuZGVmaW5lZCB8fCBwb3J0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBlbmRwb2ludHMucHVzaCh7IHVybCwgcG9ydCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGVuZHBvaW50cztcbiAgfVxufVxuXG4vKipcbiAqIENvbmNyZXRlIHZhcmlhbnQ6IG1lcmdlIHJvdXRlciBpbnB1dCBjb25maWd1cmF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbmNsYXNzIE1lcmdlUm91dGVySW5wdXRDb25maWcgZXh0ZW5kcyBSb3V0ZXJJbnB1dENvbmZpZ3VyYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBNZXJnZUNvbmZpZ3VyYXRpb25Qcm9wcykgeyBzdXBlcigpOyB9XG5cbiAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIHJvdXRlcklucHV0QXJuPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBtZXJnZToge1xuICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2VBcm46IHRoaXMucHJvcHMubmV0d29ya0ludGVyZmFjZS5yb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQXJuLFxuICAgICAgICAgIHByb3RvY29sQ29uZmlndXJhdGlvbnM6IHRoaXMucHJvcHMucHJvdG9jb2xzLm1hcChwID0+IHAuX2JpbmQoc2NvcGUsIHJvdXRlcklucHV0QXJuKS5jb25maWcpLFxuICAgICAgICAgIG1lcmdlUmVjb3ZlcnlXaW5kb3dNaWxsaXNlY29uZHM6IHRoaXMucHJvcHMubWVyZ2VSZWNvdmVyeVdpbmRvdy50b01pbGxpc2Vjb25kcygpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIF9lbmRwb2ludHMoaXBBZGRyZXNzOiBzdHJpbmcpOiBSb3V0ZXJJbnB1dEVuZHBvaW50W10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVuZHBvaW50czogUm91dGVySW5wdXRFbmRwb2ludFtdID0gW107XG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMucHJvcHMucHJvdG9jb2xzKSB7XG4gICAgICBjb25zdCB1cmwgPSBwLl9pbmdlc3RVcmwoaXBBZGRyZXNzKTtcbiAgICAgIGNvbnN0IHBvcnQgPSBwLl9saXN0ZW5pbmdQb3J0KCk7XG4gICAgICBpZiAodXJsID09PSB1bmRlZmluZWQgfHwgcG9ydCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgZW5kcG9pbnRzLnB1c2goeyB1cmwsIHBvcnQgfSk7XG4gICAgfVxuICAgIHJldHVybiBlbmRwb2ludHM7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBvcHRpb25zIGZvciB7QGxpbmsgTWVkaWFDb25uZWN0Rmxvd1JvdXRlcklucHV0Q29uZmlnfS4gTm90IGV4cG9ydGVkOyBqc2lpIG5ldmVyIHNlZXMgdGhpcy5cbiAqL1xuaW50ZXJmYWNlIE1lZGlhQ29ubmVjdEZsb3dSb3V0ZXJJbnB1dE9wdGlvbnMge1xuICByZWFkb25seSBmbG93PzogSUZsb3c7XG4gIHJlYWRvbmx5IGZsb3dPdXRwdXQ/OiBJRmxvd091dHB1dDtcbiAgcmVhZG9ubHkgc291cmNlVHJhbnNpdERlY3J5cHRpb24/OiBUcmFuc2l0RW5jcnlwdGlvbjtcbn1cblxuLyoqXG4gKiBDb25jcmV0ZSB2YXJpYW50OiBNZWRpYUNvbm5lY3QgRmxvdyByb3V0ZXIgaW5wdXQgY29uZmlndXJhdGlvbiAod2l0aCBvciB3aXRob3V0IGNvbm5lY3Rpb24pLlxuICogQGludGVybmFsXG4gKi9cbmNsYXNzIE1lZGlhQ29ubmVjdEZsb3dSb3V0ZXJJbnB1dENvbmZpZyBleHRlbmRzIFJvdXRlcklucHV0Q29uZmlndXJhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogTWVkaWFDb25uZWN0Rmxvd1JvdXRlcklucHV0T3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF2YWlsYWJpbGl0eVpvbmU/OiBzdHJpbmcsXG4gICkgeyBzdXBlcigpOyB9XG5cbiAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIHJvdXRlcklucHV0QXJuPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBtZWRpYUNvbm5lY3RGbG93OiB7XG4gICAgICAgICAgZmxvd0FybjogdGhpcy5vcHRpb25zLmZsb3c/LmZsb3dBcm4sXG4gICAgICAgICAgZmxvd091dHB1dEFybjogdGhpcy5vcHRpb25zLmZsb3dPdXRwdXQ/LmZsb3dPdXRwdXRBcm4sXG4gICAgICAgICAgc291cmNlVHJhbnNpdERlY3J5cHRpb246IHJlbmRlclRyYW5zaXRFbmNyeXB0aW9uKHNjb3BlLCAnU291cmNlVHJhbnNpdERlY3J5cHRpb25Sb2xlJywgdGhpcy5vcHRpb25zLnNvdXJjZVRyYW5zaXREZWNyeXB0aW9uLCByb3V0ZXJJbnB1dEFybiksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogdGhpcy5hdmFpbGFiaWxpdHlab25lLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgX2VuZHBvaW50cyhfaXBBZGRyZXNzOiBzdHJpbmcpOiBSb3V0ZXJJbnB1dEVuZHBvaW50W10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBvcHRpb25zIGZvciB7QGxpbmsgTWVkaWFMaXZlQ2hhbm5lbFJvdXRlcklucHV0Q29uZmlnfS4gTm90IGV4cG9ydGVkOyBqc2lpIG5ldmVyIHNlZXMgdGhpcy5cbiAqL1xuaW50ZXJmYWNlIE1lZGlhTGl2ZUNoYW5uZWxSb3V0ZXJJbnB1dE9wdGlvbnMge1xuICByZWFkb25seSBtZWRpYUxpdmVDaGFubmVsQXJuPzogc3RyaW5nO1xuICByZWFkb25seSBtZWRpYUxpdmVDaGFubmVsT3V0cHV0TmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgbWVkaWFMaXZlUGlwZWxpbmVJZD86IE1lZGlhTGl2ZVBpcGVsaW5lO1xuICByZWFkb25seSBzb3VyY2VUcmFuc2l0RGVjcnlwdGlvbj86IFRyYW5zaXRFbmNyeXB0aW9uO1xufVxuXG4vKipcbiAqIENvbmNyZXRlIHZhcmlhbnQ6IE1lZGlhTGl2ZSBDaGFubmVsIHJvdXRlciBpbnB1dCBjb25maWd1cmF0aW9uICh3aXRoIG9yIHdpdGhvdXQgY29ubmVjdGlvbikuXG4gKiBAaW50ZXJuYWxcbiAqL1xuY2xhc3MgTWVkaWFMaXZlQ2hhbm5lbFJvdXRlcklucHV0Q29uZmlnIGV4dGVuZHMgUm91dGVySW5wdXRDb25maWd1cmF0aW9uIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBNZWRpYUxpdmVDaGFubmVsUm91dGVySW5wdXRPcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZT86IHN0cmluZyxcbiAgKSB7IHN1cGVyKCk7IH1cblxuICBwdWJsaWMgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCwgcm91dGVySW5wdXRBcm4/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG1lZGlhTGl2ZUNoYW5uZWw6IHtcbiAgICAgICAgICBtZWRpYUxpdmVDaGFubmVsQXJuOiB0aGlzLm9wdGlvbnMubWVkaWFMaXZlQ2hhbm5lbEFybixcbiAgICAgICAgICBtZWRpYUxpdmVDaGFubmVsT3V0cHV0TmFtZTogdGhpcy5vcHRpb25zLm1lZGlhTGl2ZUNoYW5uZWxPdXRwdXROYW1lLFxuICAgICAgICAgIG1lZGlhTGl2ZVBpcGVsaW5lSWQ6IHRoaXMub3B0aW9ucy5tZWRpYUxpdmVQaXBlbGluZUlkLFxuICAgICAgICAgIHNvdXJjZVRyYW5zaXREZWNyeXB0aW9uOiByZW5kZXJUcmFuc2l0RW5jcnlwdGlvbihzY29wZSwgJ1NvdXJjZVRyYW5zaXREZWNyeXB0aW9uUm9sZScsIHRoaXMub3B0aW9ucy5zb3VyY2VUcmFuc2l0RGVjcnlwdGlvbiwgcm91dGVySW5wdXRBcm4pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IHRoaXMuYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIF9lbmRwb2ludHMoX2lwQWRkcmVzczogc3RyaW5nKTogUm91dGVySW5wdXRFbmRwb2ludFtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQSBNZWRpYUNvbm5lY3QgUm91dGVyIElucHV0IHRoYXQgcmVjZWl2ZXMgbWVkaWEgc3RyZWFtcyBhbmQgcm91dGVzIHRoZW0gdG8gb3V0cHV0cy5cbiAqXG4gKiBSb3V0ZXIgSW5wdXRzIHN1cHBvcnQgbXVsdGlwbGUgY29uZmlndXJhdGlvbiB0eXBlczpcbiAqIC0gU3RhbmRhcmQ6IFNpbmdsZSBwcm90b2NvbCBpbnB1dFxuICogLSBGYWlsb3ZlcjogVHdvIG1hdGNoaW5nIHByb3RvY29scyBmb3IgcmVkdW5kYW5jeVxuICogLSBNZXJnZTogVHdvIG1hdGNoaW5nIG5vbi1TUlQgcHJvdG9jb2xzIGZvciBzdHJlYW0gbWVyZ2luZ1xuICogLSBNZWRpYUNvbm5lY3QgRmxvdzogSW5wdXQgZnJvbSBhbiBleGlzdGluZyBNZWRpYUNvbm5lY3QgRmxvd1xuICovXG5hYnN0cmFjdCBjbGFzcyBSb3V0ZXJJbnB1dEJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElSb3V0ZXJJbnB1dCB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSByb3V0ZXJJbnB1dEFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcm91dGVySW5wdXRJZDogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgaXBBZGRyZXNzOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB1cGRhdGVkQXQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBlbmRwb2ludHM6IFJvdXRlcklucHV0RW5kcG9pbnRbXTtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRyYW5zaXRFbmNyeXB0aW9uU2VjcmV0PzogSVNlY3JldDtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGdyYW50czogUm91dGVySW5wdXRHcmFudHM7XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIHRvIHRoaXMgUm91dGVyIElucHV0IHJlc291cmNlLlxuICAgKiBSZXF1aXJlZCBieSB0aGUgYXV0by1nZW5lcmF0ZWQgSVJvdXRlcklucHV0UmVmIGludGVyZmFjZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcm91dGVySW5wdXRSZWYoKTogUm91dGVySW5wdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiB7IHJvdXRlcklucHV0QXJuOiB0aGlzLnJvdXRlcklucHV0QXJuIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMgZm9yIHRoaXMgcm91dGVyIGlucHV0LlxuICAgKi9cbiAgcHVibGljIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIG5hbWVzcGFjZTogJ0FXUy9NZWRpYUNvbm5lY3QnLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIFJvdXRlcklucHV0QVJOOiB0aGlzLnJvdXRlcklucHV0QXJuLFxuICAgICAgICAuLi5wcm9wcz8uZGltZW5zaW9uc01hcCxcbiAgICAgIH0sXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgYml0cmF0ZSBvZiB0aGUgcm91dGVyIGlucHV0J3MgcGF5bG9hZC5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNCaXRyYXRlKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdSb3V0ZXJJbnB1dEJpdFJhdGUnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdhdmcnLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuQklUU19QRVJfU0VDT05ELFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciBwYWNrZXRzIGxvc3QgaW4gdHJhbnNpdCB0aGF0IHdlcmUgbm90IHJlY292ZXJlZCBieSBlcnJvciBjb3JyZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY05vdFJlY292ZXJlZFBhY2tldHMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ1JvdXRlcklucHV0Tm90UmVjb3ZlcmVkUGFja2V0cycsIHtcbiAgICAgIHN0YXRpc3RpYzogJ3N1bScsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkIGJ5IHRoZSByb3V0ZXIgaW5wdXQuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljVG90YWxQYWNrZXRzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdSb3V0ZXJJbnB1dFRvdGFsUGFja2V0cycsIHtcbiAgICAgIHN0YXRpc3RpYzogJ3N1bScsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHJvdXRlciBpbnB1dCBjb25uZWN0aW9uIHN0YXRlICgxIGNvbm5lY3RlZCwgMCBkaXNjb25uZWN0ZWQpLiBBcHBsaWVzIHRvIFNSVCBzb3VyY2VzIG9ubHkuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljQ29ubmVjdGVkKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdSb3V0ZXJJbnB1dENvbm5lY3RlZCcsIHtcbiAgICAgIHN0YXRpc3RpYzogJ21pbicsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5OT05FLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciBjb250aW51aXR5IGNvdW50ZXIgZXJyb3JzIGluIHRoZSB0cmFuc3BvcnQgc3RyZWFtLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY0NvbnRpbnVpdHlDb3VudGVyRXJyb3JzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdSb3V0ZXJJbnB1dENDRXJyb3JzJywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgcmVjb3ZlcnkgbGF0ZW5jeSBvZiB0aGUgaW5wdXQgc3RyZWFtLiBBcHBsaWVzIHRvIFJJU1QsIFNSVCwgYW5kIFJUUC1GRUMuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljTGF0ZW5jeShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnUm91dGVySW5wdXRMYXRlbmN5Jywge1xuICAgICAgc3RhdGlzdGljOiAnYXZnJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0Lk1JTExJU0VDT05EUyxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgcm91dGVyIGlucHV0IGhhcyBzd2l0Y2hlZCBzb3VyY2VzIGluIEZhaWxvdmVyIG1vZGUuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljRmFpbG92ZXJTd2l0Y2hlcyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnUm91dGVySW5wdXRGYWlsb3ZlclN3aXRjaGVzJywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGFuIEFXUyBFbGVtZW50YWwgTWVkaWFDb25uZWN0IFJvdXRlciBJbnB1dC5cbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIFJvdXRlcklucHV0IGV4dGVuZHMgUm91dGVySW5wdXRCYXNlIGltcGxlbWVudHMgSVJvdXRlcklucHV0IHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtbWVkaWFjb25uZWN0LWFscGhhLlJvdXRlcklucHV0JztcblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIFJvdXRlciBJbnB1dCBmcm9tIGl0cyBBUk4uXG4gICAqXG4gICAqIFVzZSBgZnJvbVJvdXRlcklucHV0QXR0cmlidXRlcygpYCBpbnN0ZWFkIGlmIHlvdSBuZWVkIHRvIGV4cG9zZSBgcm91dGVySW5wdXRJZGBcbiAgICogb3IgYGlwQWRkcmVzc2Agb24gdGhlIGltcG9ydGVkIGNvbnN0cnVjdC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0IGlkXG4gICAqIEBwYXJhbSByb3V0ZXJJbnB1dEFybiBUaGUgQVJOIG9mIHRoZSBSb3V0ZXIgSW5wdXRcbiAgICogQHJldHVybnMgQSBSb3V0ZXIgSW5wdXQgY29uc3RydWN0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Sb3V0ZXJJbnB1dEFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCByb3V0ZXJJbnB1dEFybjogc3RyaW5nKTogSVJvdXRlcklucHV0IHtcbiAgICByZXR1cm4gUm91dGVySW5wdXQuZnJvbVJvdXRlcklucHV0QXR0cmlidXRlcyhzY29wZSwgaWQsIHsgcm91dGVySW5wdXRBcm4gfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIFJvdXRlciBJbnB1dCBmcm9tIGl0cyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBQcm92aWRlIGByb3V0ZXJJbnB1dElkYCBhbmQvb3IgYGlwQWRkcmVzc2Agd2hlbiBpbXBvcnRpbmcgYW4gaW5wdXQgdGhhdCB3YXMgZGVwbG95ZWRcbiAgICogZXh0ZXJuYWxseSDigJQgb3RoZXJ3aXNlIGFjY2Vzc2luZyB0aG9zZSBwcm9wZXJ0aWVzIG9uIHRoZSBpbXBvcnRlZCBjb25zdHJ1Y3Qgd2lsbCB0aHJvdy5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0IGlkXG4gICAqIEBwYXJhbSBhdHRycyBUaGUgUm91dGVyIElucHV0IGF0dHJpYnV0ZXNcbiAgICogQHJldHVybnMgQSBSb3V0ZXIgSW5wdXQgY29uc3RydWN0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Sb3V0ZXJJbnB1dEF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFJvdXRlcklucHV0QXR0cmlidXRlcyk6IElSb3V0ZXJJbnB1dCB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUm91dGVySW5wdXRCYXNlIGltcGxlbWVudHMgSVJvdXRlcklucHV0IHtcbiAgICAgIHB1YmxpYyByZWFkb25seSByb3V0ZXJJbnB1dEFybiA9IGF0dHJzLnJvdXRlcklucHV0QXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSB1cGRhdGVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdHJhbnNpdEVuY3J5cHRpb25TZWNyZXQgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRzID0gUm91dGVySW5wdXRHcmFudHMuZnJvbVJvdXRlcklucHV0KHRoaXMpO1xuXG4gICAgICBwdWJsaWMgZ2V0IGVuZHBvaW50cygpOiBSb3V0ZXJJbnB1dEVuZHBvaW50W10ge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBSb3V0ZXJJbnB1dEVuZHBvaW50c05vdEF2YWlsYWJsZUltcG9ydGVkYCxcbiAgICAgICAgICBgJ2VuZHBvaW50cycgaXMgbm90IGF2YWlsYWJsZSBvbiBpbXBvcnRlZCBSb3V0ZXJJbnB1dCAke3RoaXMubm9kZS5wYXRofTsgb25seSBSb3V0ZXJJbnB1dHMgY29uc3RydWN0ZWQgaW4gdGhpcyBhcHAgZm9yIGxpc3RlbmluZyBwcm90b2NvbCB2YXJpYW50cyAoUlRQLCBSSVNULCBTUlQgbGlzdGVuZXIsIGluY2x1ZGluZyBmYWlsb3ZlciBhbmQgbWVyZ2UpIGV4cG9zZSBpbmdlc3QgZW5kcG9pbnRzYCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgZ2V0IHJvdXRlcklucHV0SWQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGF0dHJzLnJvdXRlcklucHV0SWQpIHJldHVybiBhdHRycy5yb3V0ZXJJbnB1dElkO1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBSb3V0ZXJJbnB1dElkTm90UHJvdmlkZWRgLFxuICAgICAgICAgIGAncm91dGVySW5wdXRJZCcgaXMgbm90IGF2YWlsYWJsZSBvbiBpbXBvcnRlZCBSb3V0ZXJJbnB1dCAke3RoaXMubm9kZS5wYXRofTsgcGFzcyBpdCB2aWEgZnJvbVJvdXRlcklucHV0QXR0cmlidXRlc2AsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIGdldCBpcEFkZHJlc3MoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGF0dHJzLmlwQWRkcmVzcykgcmV0dXJuIGF0dHJzLmlwQWRkcmVzcztcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgUm91dGVySW5wdXRJcEFkZHJlc3NOb3RQcm92aWRlZGAsXG4gICAgICAgICAgYCdpcEFkZHJlc3MnIGlzIG5vdCBhdmFpbGFibGUgb24gaW1wb3J0ZWQgUm91dGVySW5wdXQgJHt0aGlzLm5vZGUucGF0aH07IHBhc3MgaXQgdmlhIGZyb21Sb3V0ZXJJbnB1dEF0dHJpYnV0ZXNgLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbWF4aW11bSBiaXRyYXRlIGluIE1icHMgZm9yIGEga25vd24gdGllciwgb3IgdW5kZWZpbmVkIGZvciBjdXN0b20gdGllcnMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyB0aWVyTGltaXRNYnBzKHRpZXI6IFJvdXRlcklucHV0VGllcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRpZXIudmFsdWUgPT09IFJvdXRlcklucHV0VGllci5JTlBVVF8yMC52YWx1ZSkgcmV0dXJuIDIwO1xuICAgIGlmICh0aWVyLnZhbHVlID09PSBSb3V0ZXJJbnB1dFRpZXIuSU5QVVRfNTAudmFsdWUpIHJldHVybiA1MDtcbiAgICBpZiAodGllci52YWx1ZSA9PT0gUm91dGVySW5wdXRUaWVyLklOUFVUXzEwMC52YWx1ZSkgcmV0dXJuIDEwMDtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHJvdXRlcklucHV0QXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByb3V0ZXJJbnB1dElkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBpcEFkZHJlc3M6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdD86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHVwZGF0ZWRBdD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBfZW5kcG9pbnRzOiBSb3V0ZXJJbnB1dEVuZHBvaW50W10gfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSB0cmFuc2l0RW5jcnlwdGlvblNlY3JldD86IElTZWNyZXQ7XG4gIHB1YmxpYyByZWFkb25seSBncmFudHM6IFJvdXRlcklucHV0R3JhbnRzO1xuXG4gIHB1YmxpYyBnZXQgZW5kcG9pbnRzKCk6IFJvdXRlcklucHV0RW5kcG9pbnRbXSB7XG4gICAgaWYgKHRoaXMuX2VuZHBvaW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgUm91dGVySW5wdXRFbmRwb2ludHNOb3RBdmFpbGFibGVDb25maWdgLFxuICAgICAgICBgJ2VuZHBvaW50cycgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIFJvdXRlcklucHV0ICR7dGhpcy5ub2RlLnBhdGh9OyBvbmx5IGxpc3RlbmluZyBwcm90b2NvbCB2YXJpYW50cyAoUlRQLCBSSVNULCBTUlQgbGlzdGVuZXIg4oCUIGluY2x1ZGluZyBmYWlsb3ZlciBhbmQgbWVyZ2UgYnVpbHQgZnJvbSB0aG9zZSkgZXhwb3NlIGluZ2VzdCBlbmRwb2ludHMg4oCUIFNSVCBjYWxsZXIsIE1lZGlhQ29ubmVjdCBGbG93LCBhbmQgTWVkaWFMaXZlIENoYW5uZWwgaW5wdXRzIGRvIG5vdGAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZW5kcG9pbnRzO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJvdXRlcklucHV0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMucm91dGVySW5wdXROYW1lID8/IExhenkuc3RyaW5nKHsgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiAxMjggfSkgfSksXG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSByb3V0ZXIgaW5wdXQgbmFtZSBpZiBwcm92aWRlZFxuICAgIGlmIChwcm9wcy5yb3V0ZXJJbnB1dE5hbWUgIT0gbnVsbCAmJiBwcm9wcy5yb3V0ZXJJbnB1dE5hbWUgIT09ICcnICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMucm91dGVySW5wdXROYW1lKSkge1xuICAgICAgaWYgKHByb3BzLnJvdXRlcklucHV0TmFtZS5sZW5ndGggPiAxMjgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgUm91dGVySW5wdXROYW1lTGVuZ3RoYCwgYFJvdXRlciBpbnB1dCBuYW1lIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMjggY2hhcmFjdGVycywgZ290ICR7cHJvcHMucm91dGVySW5wdXROYW1lLmxlbmd0aH1gLCB0aGlzKTtcbiAgICAgIH1cbiAgICAgIGlmICghL15bYS16QS1aMC05LV0rJC8udGVzdChwcm9wcy5yb3V0ZXJJbnB1dE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YFJvdXRlcklucHV0TmFtZUZvcm1hdGAsIGBSb3V0ZXIgaW5wdXQgbmFtZSBtdXN0IGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgaHlwaGVucywgZ290ICcke3Byb3BzLnJvdXRlcklucHV0TmFtZX0nYCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWF4aW11bSBiaXRyYXRlXG4gICAgaWYgKCFwcm9wcy5tYXhpbXVtQml0cmF0ZS5pc1VucmVzb2x2ZWQoKSAmJiBwcm9wcy5tYXhpbXVtQml0cmF0ZS50b0JwcygpIDwgMTAwMDAwMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgUm91dGVySW5wdXRNaW5CaXRyYXRlYCwgYE1heGltdW0gYml0cmF0ZSBtdXN0IGJlIGF0IGxlYXN0IDEsMDAwLDAwMCBiaXRzL3MgKDEgTWJwcyksIGdvdCAke3Byb3BzLm1heGltdW1CaXRyYXRlLnRvQnBzKCl9YCwgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYml0cmF0ZSBkb2VzIG5vdCBleGNlZWQgdGllciBsaW1pdFxuICAgIGNvbnN0IHJlc29sdmVkVGllciA9IHByb3BzLnRpZXIgPz8gUm91dGVySW5wdXRUaWVyLklOUFVUXzIwO1xuICAgIGNvbnN0IHRpZXJNYnBzID0gUm91dGVySW5wdXQudGllckxpbWl0TWJwcyhyZXNvbHZlZFRpZXIpO1xuICAgIGlmIChleGNlZWRzUm91dGVyVGllckJpdHJhdGUodGllck1icHMsIHByb3BzLm1heGltdW1CaXRyYXRlKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgUm91dGVySW5wdXRCaXRyYXRlRXhjZWVkc1RpZXJgLCBgTWF4aW11bSBiaXRyYXRlICR7cHJvcHMubWF4aW11bUJpdHJhdGUudG9CcHMoKSAvIDFfMDAwXzAwMH0gTWJwcyBleGNlZWRzIHRoZSAke3Jlc29sdmVkVGllci52YWx1ZX0gdGllciBsaW1pdCBvZiAke3RpZXJNYnBzfSBNYnBzYCwgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWFpbnRlbmFuY2UgdGltZSBmb3JtYXRcbiAgICBpZiAocHJvcHMubWFpbnRlbmFuY2VDb25maWd1cmF0aW9uKSB7XG4gICAgICB2YWxpZGF0ZU1haW50ZW5hbmNlVGltZShwcm9wcy5tYWludGVuYW5jZUNvbmZpZ3VyYXRpb24udGltZSk7XG4gICAgfVxuXG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHRoaXMpO1xuICAgIGNvbnN0IHRhcmdldFJlZ2lvbiA9IHByb3BzLnJlZ2lvbk5hbWUgPz8gc3RhY2sucmVnaW9uO1xuXG4gICAgLy8gV2lsZGNhcmQgdGhlIGlkIOKAlCBwaW5uaW5nIHRoZSBsaXZlIEFSTiAoYXR0ckFybikgd291bGQgY3JlYXRlIGEgcm9sZSDihpIgcm91dGVyLWlucHV0IOKGkiByb2xlIGN5Y2xlLlxuICAgIGNvbnN0IHJvdXRlcklucHV0QXJuID0gc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdtZWRpYWNvbm5lY3QnLFxuICAgICAgcmVnaW9uOiB0YXJnZXRSZWdpb24sXG4gICAgICByZXNvdXJjZTogJ3JvdXRlcklucHV0JyxcbiAgICAgIHJlc291cmNlTmFtZTogJyonLFxuICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmZpZ0JpbmQgPSBwcm9wcy5jb25maWd1cmF0aW9uLl9iaW5kKHRoaXMsIHJvdXRlcklucHV0QXJuKTtcblxuICAgIC8vIFZhbGlkYXRlIEFaIG1hdGNoZXMgcmVnaW9uIGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZ0JpbmQuYXZhaWxhYmlsaXR5Wm9uZSAmJiAhY29uZmlnQmluZC5hdmFpbGFiaWxpdHlab25lLnN0YXJ0c1dpdGgodGFyZ2V0UmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgUm91dGVySW5wdXRBelJlZ2lvbk1pc21hdGNoYCwgYEF2YWlsYWJpbGl0eSB6b25lICcke2NvbmZpZ0JpbmQuYXZhaWxhYmlsaXR5Wm9uZX0nIG11c3QgYmUgd2l0aGluIHJlZ2lvbiAnJHt0YXJnZXRSZWdpb259J2AsIHRoaXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zaXQgPSByZXNvbHZlVHJhbnNpdEVuY3J5cHRpb24odGhpcywgJ1RyYW5zaXRFbmNyeXB0aW9uUm9sZScsIHByb3BzLnRyYW5zaXRFbmNyeXB0aW9uLCByb3V0ZXJJbnB1dEFybik7XG5cbiAgICBjb25zdCByb3V0ZXJpbnB1dCA9IG5ldyBDZm5Sb3V0ZXJJbnB1dCh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIG1heGltdW1CaXRyYXRlOiBwcm9wcy5tYXhpbXVtQml0cmF0ZS50b0JwcygpLFxuICAgICAgdGllcjogKHByb3BzLnRpZXIgPz8gUm91dGVySW5wdXRUaWVyLklOUFVUXzIwKS52YWx1ZSxcbiAgICAgIHJvdXRpbmdTY29wZTogcHJvcHMucm91dGluZ1Njb3BlLnZhbHVlLFxuICAgICAgbWFpbnRlbmFuY2VDb25maWd1cmF0aW9uOiBwcm9wcy5tYWludGVuYW5jZUNvbmZpZ3VyYXRpb24gPyB7XG4gICAgICAgIHByZWZlcnJlZERheVRpbWU6IHByb3BzLm1haW50ZW5hbmNlQ29uZmlndXJhdGlvbixcbiAgICAgIH0gOiB7XG4gICAgICAgIGRlZmF1bHQ6IHt9LFxuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZ0JpbmQuY29uZmlnLFxuICAgICAgdHJhbnNpdEVuY3J5cHRpb246IHRyYW5zaXQuY29uZmlnLFxuICAgICAgcmVnaW9uTmFtZTogdGFyZ2V0UmVnaW9uLFxuICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogY29uZmlnQmluZC5hdmFpbGFiaWxpdHlab25lLFxuICAgICAgdGFnczogcHJvcHMudGFncyA/IHJlbmRlclRhZ3MocHJvcHMudGFncykgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnJvdXRlcklucHV0QXJuID0gcm91dGVyaW5wdXQuYXR0ckFybjtcbiAgICB0aGlzLnJvdXRlcklucHV0SWQgPSByb3V0ZXJpbnB1dC5hdHRySWQ7XG4gICAgdGhpcy5pcEFkZHJlc3MgPSByb3V0ZXJpbnB1dC5hdHRySXBBZGRyZXNzO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gcm91dGVyaW5wdXQuYXR0ckNyZWF0ZWRBdDtcbiAgICB0aGlzLnVwZGF0ZWRBdCA9IHJvdXRlcmlucHV0LmF0dHJVcGRhdGVkQXQ7XG5cbiAgICAvLyBXaXRob3V0IHRoaXMgdGhlIHJvdXRlciBpbnB1dCBjYW4gYmUgY3JlYXRlZCBiZWZvcmUgdGhlXG4gICAgLy8gcG9saWN5IGlzIGF0dGFjaGVkIChcImFjY2VzcyBkZW5pZWRcIiBhdCBjcmVhdGUgdGltZSkuIE9yZGVyaW5nIHRoZSBncmFudCBiZWZvcmUgdGhlXG4gICAgLy8gcm91dGVyIGlucHV0IHB1bGxzIHRoZSBwb2xpY3kgaW4gYXMgYSBkZXBlbmRlbmN5LlxuICAgIHRyYW5zaXQuZ3JhbnQ/LmFwcGx5QmVmb3JlKHJvdXRlcmlucHV0KTtcblxuICAgIC8vIENvbXB1dGUgaW5nZXN0IGVuZHBvaW50cyBmb3IgcHJvdG9jb2wtYmFzZWQgdmFyaWFudHNcbiAgICB0aGlzLl9lbmRwb2ludHMgPSBwcm9wcy5jb25maWd1cmF0aW9uLl9lbmRwb2ludHMocm91dGVyaW5wdXQuYXR0cklwQWRkcmVzcyk7XG5cbiAgICAvLyBTdG9yZSB0aGUgdHJhbnNpdCBlbmNyeXB0aW9uIHNlY3JldCBpZiBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgdGhpcy50cmFuc2l0RW5jcnlwdGlvblNlY3JldCA9IHByb3BzLnRyYW5zaXRFbmNyeXB0aW9uPy5zZWNyZXQ7XG4gICAgdGhpcy5ncmFudHMgPSBSb3V0ZXJJbnB1dEdyYW50cy5mcm9tUm91dGVySW5wdXQodGhpcyk7XG4gIH1cbn1cblxuIl19
1099
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLWlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicm91dGVyLWlucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLDZDQUFxSTtBQUVySSwrREFBMEQ7QUFDMUQsbUVBQThEO0FBRzlELDRFQUE0RDtBQUM1RCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBSTFFLG1GQUFvRTtBQUdwRSxxQ0FBdUs7QUFFdks7O0dBRUc7QUFDSCxNQUFhLDBCQUEwQjtJQW1CRDs7SUFsQnBDLG1DQUFtQztJQUM1QixNQUFNLENBQVUsR0FBRyxHQUFHLElBQUksMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkUseUNBQXlDO0lBQ2xDLE1BQU0sQ0FBVSxJQUFJLEdBQUcsSUFBSSwwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyRSw4Q0FBOEM7SUFDdkMsTUFBTSxDQUFVLFVBQVUsR0FBRyxJQUFJLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2pGLGdEQUFnRDtJQUN6QyxNQUFNLENBQVUsWUFBWSxHQUFHLElBQUksMEJBQTBCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFckY7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFhO1FBQzVCLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM5QztJQUVELDZDQUE2QztJQUM3QyxZQUFvQyxLQUFhO1FBQWIsVUFBSyxHQUFMLEtBQUssQ0FBUTtLQUFJO0lBRXJELCtCQUErQjtJQUN4QixRQUFRO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBQ25COztBQXhCSCxnRUF5QkM7QUFrSkQ7O0dBRUc7QUFDSCxNQUFhLFlBQVk7SUFlYTs7SUFkcEMsK0NBQStDO0lBQ3hDLE1BQU0sQ0FBVSxRQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFD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QUF1QixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUM7WUFDL0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxpREFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkQ7O1lBNUxVLHVEQUFXOzs7OztBQUFYLGtDQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaXRyYXRlLCBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBcm5Gb3JtYXQsIER1cmF0aW9uLCBGbiwgTGF6eSwgTmFtZXMsIFJlc291cmNlLCBTdGFjaywgVG9rZW4sIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY09wdGlvbnMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBNZXRyaWMsIFVuaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBDZm5Sb3V0ZXJJbnB1dCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYWNvbm5lY3QnO1xuaW1wb3J0IHR5cGUgeyBJUm91dGVySW5wdXRSZWYsIFJvdXRlcklucHV0UmVmZXJlbmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhY29ubmVjdCc7XG5pbXBvcnQgdHlwZSB7IElTZWNyZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0IHsgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBJRmxvdyB9IGZyb20gJy4vZmxvdyc7XG5pbXBvcnQgdHlwZSB7IElGbG93T3V0cHV0IH0gZnJvbSAnLi9mbG93LW91dHB1dCc7XG5pbXBvcnQgeyBSb3V0ZXJJbnB1dEdyYW50cyB9IGZyb20gJy4vbWVkaWFjb25uZWN0LWdyYW50cy5nZW5lcmF0ZWQnO1xuaW1wb3J0IHR5cGUgeyBJUm91dGVyTmV0d29ya0ludGVyZmFjZSB9IGZyb20gJy4vcm91dGVyLW5ldHdvcmstaW50ZXJmYWNlJztcbmltcG9ydCB0eXBlIHsgTWFpbnRlbmFuY2VEYXksIE1lZGlhTGl2ZVBpcGVsaW5lLCBSb3V0ZXJTcnRFbmNyeXB0aW9uLCBUcmFuc2l0RW5jcnlwdGlvbiB9IGZyb20gJy4vc2hhcmVkJztcbmltcG9ydCB7IHJlbmRlclRhZ3MsIGV4Y2VlZHNSb3V0ZXJUaWVyQml0cmF0ZSwgcmVuZGVyUm91dGVyU3J0RW5jcnlwdGlvbiwgcmVuZGVyVHJhbnNpdEVuY3J5cHRpb24sIHJlc29sdmVUcmFuc2l0RW5jcnlwdGlvbiwgdmFsaWRhdGVNYWludGVuYW5jZVRpbWUgfSBmcm9tICcuL3NoYXJlZCc7XG5cbi8qKlxuICogUHJvdG9jb2wgb3B0aW9ucyBhdmFpbGFibGUgZm9yIFJvdXRlciBJbnB1dCBjb25maWd1cmF0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgUm91dGVySW5wdXRQcm90b2NvbE9wdGlvbnMge1xuICAvKiogUmVhbC10aW1lIFRyYW5zcG9ydCBQcm90b2NvbCAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJUUCA9IG5ldyBSb3V0ZXJJbnB1dFByb3RvY29sT3B0aW9ucygnUlRQJyk7XG4gIC8qKiBSZWxpYWJsZSBJbnRlcm5ldCBTdHJlYW0gVHJhbnNwb3J0ICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUklTVCA9IG5ldyBSb3V0ZXJJbnB1dFByb3RvY29sT3B0aW9ucygnUklTVCcpO1xuICAvKiogU2VjdXJlIFJlbGlhYmxlIFRyYW5zcG9ydCAtIENhbGxlciBtb2RlICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1JUX0NBTExFUiA9IG5ldyBSb3V0ZXJJbnB1dFByb3RvY29sT3B0aW9ucygnU1JUX0NBTExFUicpO1xuICAvKiogU2VjdXJlIFJlbGlhYmxlIFRyYW5zcG9ydCAtIExpc3RlbmVyIG1vZGUgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTUlRfTElTVEVORVIgPSBuZXcgUm91dGVySW5wdXRQcm90b2NvbE9wdGlvbnMoJ1NSVF9MSVNURU5FUicpO1xuXG4gIC8qKlxuICAgKiBVc2UgYSBjdXN0b20gcHJvdG9jb2wgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBwcm90b2NvbCBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IFJvdXRlcklucHV0UHJvdG9jb2xPcHRpb25zIHtcbiAgICByZXR1cm4gbmV3IFJvdXRlcklucHV0UHJvdG9jb2xPcHRpb25zKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0gdmFsdWUgVGhlIHByb3RvY29sIHN0cmluZyB2YWx1ZSAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBpbmdlc3QgZW5kcG9pbnQgd2hlcmUgdGhlIHJvdXRlciBpbnB1dCBsaXN0ZW5zIGZvciB1cHN0cmVhbSBjb250ZW50LlxuICpcbiAqIEZhaWxvdmVyIGFuZCBtZXJnZSBjb25maWd1cmF0aW9ucyBleHBvc2UgdHdvIGVuZHBvaW50czsgc3RhbmRhcmQgY29uZmlndXJhdGlvbnNcbiAqIGV4cG9zZSBvbmUuIFJldHVybmVkIGJ5IHtAbGluayBJUm91dGVySW5wdXQuZW5kcG9pbnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb3V0ZXJJbnB1dEVuZHBvaW50IHtcbiAgLyoqXG4gICAqIFRoZSBmdWxsIGluZ2VzdCBVUkwgY29tYmluaW5nIHByb3RvY29sIHNjaGVtZSwgSVAsIGFuZCBwb3J0LiBGb3IgZXhhbXBsZTpcbiAgICogYHNydDovLzIwMy4wLjExMy4xMDo1MDAwYCBvciBgcnRwOi8vMjAzLjAuMTEzLjEwOjUwMDFgLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0ZW5pbmcgcG9ydCBhdCB3aGljaCB0aGUgcm91dGVyIGlucHV0IGFjY2VwdHMgdXBzdHJlYW0gY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIFJvdXRlciBJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElSb3V0ZXJJbnB1dCBleHRlbmRzIElSZXNvdXJjZSwgSVJvdXRlcklucHV0UmVmIHtcbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgcm91dGVyIGlucHV0LlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJJbnB1dEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJvdXRlciBpbnB1dC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVySW5wdXRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgcm91dGVyIGlucHV0LlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBpcEFkZHJlc3M6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSByb3V0ZXIgaW5wdXQgd2FzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZWRBdD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSByb3V0ZXIgaW5wdXQgd2FzIGxhc3QgdXBkYXRlZC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5nZXN0IGVuZHBvaW50cyAoVVJMICsgcG9ydCkgd2hlcmUgdGhlIHJvdXRlciBpbnB1dCBsaXN0ZW5zLlxuICAgKlxuICAgKiBSZXR1cm5zIG9uZSBlbnRyeSBmb3Igc3RhbmRhcmQgcHJvdG9jb2wtYmFzZWQgdmFyaWFudHMgKFJUUCwgUklTVCwgU1JUIGxpc3RlbmVyKSxcbiAgICogYW5kIG9uZSBlbnRyeSBwZXIgc291cmNlIGZvciBmYWlsb3ZlciBhbmQgbWVyZ2UgY29uZmlndXJhdGlvbnMgYnVpbHQgZnJvbSB0aG9zZVxuICAgKiBwcm90b2NvbHMuIEZvciBleGFtcGxlIGEgZmFpbG92ZXIgUlRQIGlucHV0IHdpbGwgcmV0dXJuOlxuICAgKlxuICAgKiBgYGBcbiAgICogW1xuICAgKiAgIHsgdXJsOiAncnRwOi8vMjAzLjAuMTEzLjEwOjUwMDAnLCBwb3J0OiA1MDAwIH0sXG4gICAqICAgeyB1cmw6ICdydHA6Ly8yMDMuMC4xMTMuMTA6NTAwMScsIHBvcnQ6IDUwMDEgfSxcbiAgICogXVxuICAgKiBgYGBcbiAgICpcbiAgICogQWNjZXNzaW5nIHRoaXMgb24gU1JUIGNhbGxlciAod2hlcmUgdGhlIHJvdXRlciBpbnB1dCBkaWFscyBvdXQgdG8gYSByZW1vdGVcbiAgICogc291cmNlKSwgTWVkaWFDb25uZWN0IEZsb3csIE1lZGlhTGl2ZSBDaGFubmVsLCBvciBpbXBvcnRlZCBpbnB1dHMgdGhyb3dzIOKAlCB0aG9zZVxuICAgKiB2YXJpYW50cyBkbyBub3QgZXhwb3NlIGhvc3Q6cG9ydCBwYWlycyB0aGUgaW5wdXQgbGlzdGVucyBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50czogUm91dGVySW5wdXRFbmRwb2ludFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIHRoZSB0cmFuc2l0IGVuY3J5cHRpb24gcGFzc3BocmFzZS5cbiAgICpcbiAgICogT25seSBhdmFpbGFibGUgd2hlbiB0aGUgUm91dGVyIElucHV0IHdhcyBjcmVhdGVkIHdpdGggZXhwbGljaXRcbiAgICogYHRyYW5zaXRFbmNyeXB0aW9uYCBjb25maWd1cmF0aW9uLiBOb3QgYXZhaWxhYmxlIGZvclxuICAgKiBhdXRvbWF0aWMgZW5jcnlwdGlvbiBvciBpbXBvcnRlZCBpbnB1dHMuXG4gICAqL1xuICByZWFkb25seSB0cmFuc2l0RW5jcnlwdGlvblNlY3JldD86IElTZWNyZXQ7XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgZ3JhbnQgbWV0aG9kcyBmb3IgdGhpcyByb3V0ZXIgaW5wdXQuXG4gICAqL1xuICByZWFkb25seSBncmFudHM6IFJvdXRlcklucHV0R3JhbnRzO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdGhpcyByb3V0ZXIgaW5wdXQuXG4gICAqXG4gICAqIFJvdXRlciBpbnB1dCBtZXRyaWNzIGFyZSBkaW1lbnNpb25lZCBieSBgUm91dGVySW5wdXRBUk5gLiBTZWUgdGhlIE1lZGlhQ29ubmVjdFxuICAgKiBkb2N1bWVudGF0aW9uIGZvciBhdmFpbGFibGUgbWV0cmljIG5hbWVzIChlLmcuIGBSb3V0ZXJJbnB1dEJpdFJhdGVgLFxuICAgKiBgUm91dGVySW5wdXROb3RSZWNvdmVyZWRQYWNrZXRzYCkuXG4gICAqL1xuICBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIGJpdHJhdGUgb2YgdGhlIHJvdXRlciBpbnB1dCdzIHBheWxvYWQuXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY0JpdHJhdGUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHBhY2tldHMgbG9zdCBpbiB0cmFuc2l0IHRoYXQgd2VyZSBub3QgcmVjb3ZlcmVkIGJ5IGVycm9yIGNvcnJlY3Rpb24uXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljTm90UmVjb3ZlcmVkUGFja2V0cyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkIGJ5IHRoZSByb3V0ZXIgaW5wdXQuXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljVG90YWxQYWNrZXRzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgcm91dGVyIGlucHV0IGNvbm5lY3Rpb24gc3RhdGUgKDEgY29ubmVjdGVkLCAwIGRpc2Nvbm5lY3RlZCkuIEFwcGxpZXMgdG8gU1JUIHNvdXJjZXMgb25seS5cbiAgICogQGRlZmF1bHQgLSBtaW5pbXVtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljQ29ubmVjdGVkKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciBjb250aW51aXR5IGNvdW50ZXIgZXJyb3JzIGluIHRoZSB0cmFuc3BvcnQgc3RyZWFtLlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY0NvbnRpbnVpdHlDb3VudGVyRXJyb3JzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgcmVjb3ZlcnkgbGF0ZW5jeSBvZiB0aGUgaW5wdXQgc3RyZWFtLiBBcHBsaWVzIHRvIFJJU1QsIFNSVCwgYW5kIFJUUC1GRUMuXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY0xhdGVuY3kocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHJvdXRlciBpbnB1dCBoYXMgc3dpdGNoZWQgc291cmNlcyBpbiBGYWlsb3ZlciBtb2RlLlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY0ZhaWxvdmVyU3dpdGNoZXMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xufVxuXG4vKipcbiAqIFJvdXRpbmcgc2NvcGUgZm9yIHRoZSBSb3V0ZXIgSW5wdXRcbiAqL1xuZXhwb3J0IGNsYXNzIFJvdXRpbmdTY29wZSB7XG4gIC8qKiBSb3V0ZSB0cmFmZmljIHdpdGhpbiB0aGUgc2FtZSBBV1MgcmVnaW9uICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUkVHSU9OQUwgPSBuZXcgUm91dGluZ1Njb3BlKCdSRUdJT05BTCcpO1xuICAvKiogUm91dGUgdHJhZmZpYyBnbG9iYWxseSBhY3Jvc3MgQVdTIHJlZ2lvbnMgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBHTE9CQUwgPSBuZXcgUm91dGluZ1Njb3BlKCdHTE9CQUwnKTtcblxuICAvKipcbiAgICogVXNlIGEgY3VzdG9tIHJvdXRpbmcgc2NvcGUgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSByb3V0aW5nIHNjb3BlIHN0cmluZyB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogUm91dGluZ1Njb3BlIHtcbiAgICByZXR1cm4gbmV3IFJvdXRpbmdTY29wZSh2YWx1ZSk7XG4gIH1cblxuICAvKiogQHBhcmFtIHZhbHVlIFRoZSByb3V0aW5nIHNjb3BlIHN0cmluZyB2YWx1ZSAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBSb3V0aW5nIHRpZXIgYmFzZWQgb24geW91ciBtYXhpbXVtIGJpdHJhdGUgcmVxdWlyZW1lbnRzLlxuICovXG5leHBvcnQgY2xhc3MgUm91dGVySW5wdXRUaWVyIHtcbiAgLyoqIFN1cHBvcnRzIGEgbWF4aW11bSBiaXRyYXRlIHVwIHRvIDEwMCBtZWdhYml0cyBwZXIgc2Vjb25kLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElOUFVUXzEwMCA9IG5ldyBSb3V0ZXJJbnB1dFRpZXIoJ0lOUFVUXzEwMCcpO1xuICAvKiogU3VwcG9ydHMgYSBtYXhpbXVtIGJpdHJhdGUgdXAgdG8gNTAgbWVnYWJpdHMgcGVyIHNlY29uZC4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBJTlBVVF81MCA9IG5ldyBSb3V0ZXJJbnB1dFRpZXIoJ0lOUFVUXzUwJyk7XG4gIC8qKiBTdXBwb3J0cyBhIG1heGltdW0gYml0cmF0ZSB1cCB0byAyMCBtZWdhYml0cyBwZXIgc2Vjb25kLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElOUFVUXzIwID0gbmV3IFJvdXRlcklucHV0VGllcignSU5QVVRfMjAnKTtcblxuICAvKipcbiAgICogVXNlIGEgY3VzdG9tIHRpZXIgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB0aWVyIHN0cmluZyB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogUm91dGVySW5wdXRUaWVyIHtcbiAgICByZXR1cm4gbmV3IFJvdXRlcklucHV0VGllcih2YWx1ZSk7XG4gIH1cblxuICAvKiogQHBhcmFtIHZhbHVlIFRoZSB0aWVyIHN0cmluZyB2YWx1ZSAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBzY2hlZHVsZWQgbWFpbnRlbmFuY2Ugd2luZG93c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1haW50ZW5hbmNlQ29uZmlndXJhdGlvbiB7XG4gIC8qKiBEYXkgb2YgdGhlIHdlZWsgZm9yIG1haW50ZW5hbmNlIChlLmcuLCAnTW9uZGF5JywgJ1R1ZXNkYXknKSAqL1xuICByZWFkb25seSBkYXk6IE1haW50ZW5hbmNlRGF5O1xuICAvKiogVGltZSBvZiBkYXkgZm9yIG1haW50ZW5hbmNlIGluIEhIOk1NIGZvcm1hdCAoZS5nLiwgJzAyOjAwJykgKi9cbiAgcmVhZG9ubHkgdGltZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGEgUm91dGVyIElucHV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVySW5wdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBSb3V0ZXIgSW5wdXRcbiAgICogQGRlZmF1bHQgLSBHZW5lcmF0ZWQgYXV0b21hdGljYWxseVxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVySW5wdXROYW1lPzogc3RyaW5nO1xuICAvKiogVGhlIG1heGltdW0gYml0cmF0ZSBmb3IgdGhlIHJvdXRlciBpbnB1dC4gKi9cbiAgcmVhZG9ubHkgbWF4aW11bUJpdHJhdGU6IEJpdHJhdGU7XG4gIC8qKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcm91dGVyIGlucHV0IGlzIGNvbmZpZ3VyZWQgZm9yIFJlZ2lvbmFsIG9yIGdsb2JhbCByb3V0aW5nLiAqL1xuICByZWFkb25seSByb3V0aW5nU2NvcGU6IFJvdXRpbmdTY29wZTtcbiAgLyoqXG4gICAqIFNlbGVjdCBhIHRpZXIgYmFzZWQgb24geW91ciBtYXhpbXVtIGJpdHJhdGUgcmVxdWlyZW1lbnRzLlxuICAgKiBAZGVmYXVsdCBSb3V0ZXJJbnB1dFRpZXIuSU5QVVRfMjBcbiAgICovXG4gIHJlYWRvbmx5IHRpZXI/OiBSb3V0ZXJJbnB1dFRpZXI7XG4gIC8qKiBDb25maWd1cmF0aW9uIGZvciB0aGUgUm91dGVyIElucHV0IChzdGFuZGFyZCwgZmFpbG92ZXIsIG1lcmdlLCBvciBNZWRpYUNvbm5lY3QgZmxvdykgKi9cbiAgcmVhZG9ubHkgY29uZmlndXJhdGlvbjogUm91dGVySW5wdXRDb25maWd1cmF0aW9uO1xuICAvKipcbiAgICogTWFpbnRlbmFuY2Ugd2luZG93IGNvbmZpZ3VyYXRpb25cbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IG1haW50ZW5hbmNlIHdpbmRvdyB3aWxsIGJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IG1haW50ZW5hbmNlQ29uZmlndXJhdGlvbj86IE1haW50ZW5hbmNlQ29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBBV1MgUmVnaW9uIHdoZXJlIHRoZSByb3V0ZXIgaW5wdXQgaXMgbG9jYXRlZC5cbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0cyB0byB0aGUgc2FtZSByZWdpb24gYXMgc3RhY2tcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUYWdzIHRvIGFkZCB0byB0aGUgUm91dGVyIElucHV0XG4gICAqIEBkZWZhdWx0IC0gTm8gdGFnZ2luZ1xuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKlxuICAgKiBUcmFuc2l0IGVuY3J5cHRpb24gY29uZmlndXJhdGlvbiB1c2luZyBBV1MgU2VjcmV0cyBNYW5hZ2VyLlxuICAgKlxuICAgKiBXaGVuIHByb3ZpZGVkIHdpdGhvdXQgYSByb2xlLCBhIHNjb3BlZCBJQU0gcm9sZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2l0aCByZWFkXG4gICAqIGFjY2VzcyB0byB0aGUgc2VjcmV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEF1dG9tYXRpYyBlbmNyeXB0aW9uIHdpbGwgYmUgY29uZmlndXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNpdEVuY3J5cHRpb24/OiBUcmFuc2l0RW5jcnlwdGlvbjtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGVzIGZvciBpbXBvcnRpbmcgYW4gZXhpc3RpbmcgUm91dGVyIElucHV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlcklucHV0QXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIHJvdXRlciBpbnB1dC5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlcklucHV0QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcm91dGVyIGlucHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFjY2Vzc2luZyBgcm91dGVySW5wdXRJZGAgb24gdGhlIGltcG9ydGVkIGlucHV0IHRocm93czsgb25seSBwcm92aWRlIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVySW5wdXRJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQIGFkZHJlc3MgdGhhdCB0aGUgcm91dGVyIGlucHV0IHVzZXMgdG8gaW5nZXN0IGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWNjZXNzaW5nIGBpcEFkZHJlc3NgIG9uIHRoZSBpbXBvcnRlZCBpbnB1dCB0aHJvd3M7IG9ubHkgcHJvdmlkZSB3aGVuIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGlwQWRkcmVzcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBGb3J3YXJkIEVycm9yIENvcnJlY3Rpb24gKEZFQykgb3B0aW9ucyBmb3IgUlRQIHByb3RvY29sXG4gKi9cbmV4cG9ydCBlbnVtIEZvcndhcmRFcnJvckNvcnJlY3Rpb24ge1xuICAvKiogRW5hYmxlIEZvcndhcmQgRXJyb3IgQ29ycmVjdGlvbiAqL1xuICBFTkFCTEVEPSdFTkFCTEVEJyxcbiAgLyoqIERpc2FibGUgRm9yd2FyZCBFcnJvciBDb3JyZWN0aW9uICovXG4gIERJU0FCTEVEPSdESVNBQkxFRCcsXG59XG5cbi8qKlxuICogSWRlbnRpZmllcyB3aGljaCBwcm90b2NvbCBpbiBhIGZhaWxvdmVyIGNvbmZpZ3VyYXRpb24ncyBwcm90b2NvbHMgYXJyYXkgaXMgcHJpbWFyeS5cbiAqL1xuZXhwb3J0IGVudW0gUHJpbWFyeVNvdXJjZSB7XG4gIC8qKiBUaGUgZmlyc3QgcHJvdG9jb2wgaW4gdGhlIGZhaWxvdmVyIHByb3RvY29scyBhcnJheS4gKi9cbiAgRklSU1RfU09VUkNFID0gMCxcbiAgLyoqIFRoZSBzZWNvbmQgcHJvdG9jb2wgaW4gdGhlIGZhaWxvdmVyIHByb3RvY29scyBhcnJheS4gKi9cbiAgU0VDT05EX1NPVVJDRSA9IDEsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgQ0ZOLWxldmVsIHZhbHVlcyBmb3IgdGhlIHNvdXJjZSBwcmlvcml0eSBtb2RlLlxuICogQGludGVybmFsXG4gKi9cbmVudW0gU291cmNlUHJpb3JpdHlNb2RlIHtcbiAgLyoqIEJvdGggc291cmNlcyBhcmUgZXF1YWwgcHJpb3JpdHkg4oCUIHRoZSBzZXJ2aWNlIHBpY2tzIG9uZS4gKi9cbiAgTk9fUFJJT1JJVFkgPSAnTk9fUFJJT1JJVFknLFxuICAvKiogT25lIHNvdXJjZSBpcyBwcmltYXJ5LCB0aGUgb3RoZXIgaXMgYmFja3VwLiAqL1xuICBQUklNQVJZX1NFQ09OREFSWSA9ICdQUklNQVJZX1NFQ09OREFSWScsXG59XG5cbi8qKlxuICogU291cmNlIHByaW9yaXR5IGNvbmZpZ3VyYXRpb24gZm9yIGZhaWxvdmVyIFJvdXRlciBJbnB1dCBjb25maWd1cmF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvdXJjZVByaW9yaXR5Q29uZmlnIHtcbiAgLyoqXG4gICAqIFRyZWF0IGJvdGggc291cmNlcyB3aXRoIGVxdWFsIHByaW9yaXR5IOKAlCBNZWRpYUNvbm5lY3QgcGlja3Mgb25lIHdoZW4gbmVlZGVkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBub25lKCk6IFNvdXJjZVByaW9yaXR5Q29uZmlnIHtcbiAgICByZXR1cm4gbmV3IFNvdXJjZVByaW9yaXR5Q29uZmlnKFNvdXJjZVByaW9yaXR5TW9kZS5OT19QUklPUklUWSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGUgb25lIG9mIHRoZSB0d28gc291cmNlcyBhcyBwcmltYXJ5OyB0aGUgb3RoZXIgaXMgdHJlYXRlZCBhcyBiYWNrdXAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHByaW1hcnlTZWNvbmRhcnkocHJpbWFyeTogUHJpbWFyeVNvdXJjZSk6IFNvdXJjZVByaW9yaXR5Q29uZmlnIHtcbiAgICByZXR1cm4gbmV3IFNvdXJjZVByaW9yaXR5Q29uZmlnKFNvdXJjZVByaW9yaXR5TW9kZS5QUklNQVJZX1NFQ09OREFSWSwgcHJpbWFyeSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21vZGU6IFNvdXJjZVByaW9yaXR5TW9kZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9wcmltYXJ5OiBQcmltYXJ5U291cmNlIHwgdW5kZWZpbmVkLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGNvbmZpZ3VyYXRpb24gdG8gaXRzIENGTiBzaGFwZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2JpbmQoKTogeyBzb3VyY2VQcmlvcml0eU1vZGU6IHN0cmluZzsgcHJpbWFyeVNvdXJjZUluZGV4PzogbnVtYmVyIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBzb3VyY2VQcmlvcml0eU1vZGU6IHRoaXMuX21vZGUsXG4gICAgICBwcmltYXJ5U291cmNlSW5kZXg6IHRoaXMuX3ByaW1hcnksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIFJUUCBwcm90b2NvbCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnRwUHJvdG9jb2xQcm9wcyB7XG4gIC8qKiBQb3J0IG51bWJlciBmb3IgUlRQIHRyYWZmaWMgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICAvKipcbiAgICogRm9yd2FyZCBFcnJvciBDb3JyZWN0aW9uIHNldHRpbmdcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQ7IHdoZW4gb21pdHRlZCwgTWVkaWFDb25uZWN0IGFwcGxpZXMgRm9yd2FyZEVycm9yQ29ycmVjdGlvbi5ESVNBQkxFRCBhdCBkZXBsb3kgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgZm9yd2FyZEVycm9yQ29ycmVjdGlvbj86IEZvcndhcmRFcnJvckNvcnJlY3Rpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgUklTVCBwcm90b2NvbCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlzdFByb3RvY29sUHJvcHMge1xuICAvKiogUG9ydCBudW1iZXIgZm9yIFJJU1QgdHJhZmZpYyAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG4gIC8qKiBSZWNvdmVyeSBsYXRlbmN5IGZvciBSSVNUICovXG4gIHJlYWRvbmx5IHJlY292ZXJ5TGF0ZW5jeTogRHVyYXRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgU1JUIExpc3RlbmVyIHByb3RvY29sIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcnRMaXN0ZW5lclByb3RvY29sUHJvcHMge1xuICAvKiogUG9ydCBudW1iZXIgZm9yIFNSVCBsaXN0ZW5lciAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG4gIC8qKiBNaW5pbXVtIGxhdGVuY3kgZm9yIFNSVCAqL1xuICByZWFkb25seSBtaW5pbXVtTGF0ZW5jeTogRHVyYXRpb247XG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZWNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIGVuY3J5cHRlZCBTUlQgc3RyZWFtc1xuICAgKiBAZGVmYXVsdCAtIE5vIGRlY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlY3J5cHRpb25Db25maWd1cmF0aW9uPzogUm91dGVyU3J0RW5jcnlwdGlvbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBTUlQgQ2FsbGVyIHByb3RvY29sIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcnRDYWxsZXJQcm90b2NvbFByb3BzIHtcbiAgLyoqIFNvdXJjZSBJUCBhZGRyZXNzIHRvIGNvbm5lY3QgdG8gKi9cbiAgcmVhZG9ubHkgc291cmNlQWRkcmVzczogc3RyaW5nO1xuICAvKiogU291cmNlIHBvcnQgdG8gY29ubmVjdCB0byAqL1xuICByZWFkb25seSBzb3VyY2VQb3J0OiBudW1iZXI7XG4gIC8qKiBNaW5pbXVtIGxhdGVuY3kgZm9yIFNSVCAqL1xuICByZWFkb25seSBtaW5pbXVtTGF0ZW5jeTogRHVyYXRpb247XG4gIC8qKlxuICAgKiBPcHRpb25hbCBzdHJlYW0gSUQgZm9yIFNSVCBjb25uZWN0aW9uXG4gICAqIEBkZWZhdWx0IC0gTm8gc3RyZWFtIElEXG4gICAqL1xuICByZWFkb25seSBzdHJlYW1JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRlY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgZW5jcnlwdGVkIFNSVCBzdHJlYW1zXG4gICAqIEBkZWZhdWx0IC0gTm8gZGVjcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVjcnlwdGlvbkNvbmZpZ3VyYXRpb24/OiBSb3V0ZXJTcnRFbmNyeXB0aW9uO1xufVxuXG4vKipcbiAqIElkZW50aWZpZXMgd2hpY2ggY29uZmlndXJhdGlvbiB0eXBlIGEgcG9ydCBjb25mbGljdCBjaGVjayBpcyBiZWluZyBwZXJmb3JtZWQgZm9yLlxuICogQGludGVybmFsXG4gKi9cbmVudW0gUHJvdG9jb2xDb25maWdUeXBlIHtcbiAgLyoqIEZhaWxvdmVyLW1vZGUgcm91dGVyIGlucHV0IGNvbmZpZ3VyYXRpb24uICovXG4gIEZBSUxPVkVSID0gJ2ZhaWxvdmVyJyxcbiAgLyoqIE1lcmdlLW1vZGUgcm91dGVyIGlucHV0IGNvbmZpZ3VyYXRpb24uICovXG4gIE1FUkdFID0gJ21lcmdlJyxcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGNsYXNzIGZvciBjcmVhdGluZyBSb3V0ZXIgSW5wdXQgcHJvdG9jb2wgY29uZmlndXJhdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIFJvdXRlcklucHV0UHJvdG9jb2wge1xuICAvKipcbiAgICogQ3JlYXRlIGFuIFJUUCBwcm90b2NvbCBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBwcm9wcyBSVFAgcHJvdG9jb2wgcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBSb3V0ZXJJbnB1dFByb3RvY29sIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIFJUUFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBydHAocHJvcHM6IFJ0cFByb3RvY29sUHJvcHMpOiBSb3V0ZXJJbnB1dFByb3RvY29sIHtcbiAgICBSb3V0ZXJJbnB1dFByb3RvY29sLnZhbGlkYXRlUG9ydChwcm9wcy5wb3J0KTtcbiAgICByZXR1cm4gbmV3IFJvdXRlcklucHV0UHJvdG9jb2woUm91dGVySW5wdXRQcm90b2NvbE9wdGlvbnMuUlRQLCB7XG4gICAgICBydHA6IHtcbiAgICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgICAgZm9yd2FyZEVycm9yQ29ycmVjdGlvbjogcHJvcHMuZm9yd2FyZEVycm9yQ29ycmVjdGlvbixcbiAgICAgIH0sXG4gICAgfSwgcHJvcHMucG9ydCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgUklTVCBwcm90b2NvbCBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBwcm9wcyBSSVNUIHByb3RvY29sIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgUm91dGVySW5wdXRQcm90b2NvbCBpbnN0YW5jZSBjb25maWd1cmVkIGZvciBSSVNUXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJpc3QocHJvcHM6IFJpc3RQcm90b2NvbFByb3BzKTogUm91dGVySW5wdXRQcm90b2NvbCB7XG4gICAgUm91dGVySW5wdXRQcm90b2NvbC52YWxpZGF0ZVBvcnQocHJvcHMucG9ydCk7XG4gICAgcmV0dXJuIG5ldyBSb3V0ZXJJbnB1dFByb3RvY29sKFJvdXRlcklucHV0UHJvdG9jb2xPcHRpb25zLlJJU1QsIHtcbiAgICAgIHJpc3Q6IHtcbiAgICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgICAgcmVjb3ZlcnlMYXRlbmN5TWlsbGlzZWNvbmRzOiBwcm9wcy5yZWNvdmVyeUxhdGVuY3kudG9NaWxsaXNlY29uZHMoKSxcbiAgICAgIH0sXG4gICAgfSwgcHJvcHMucG9ydCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIFNSVCBMaXN0ZW5lciBwcm90b2NvbCBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBwcm9wcyBTUlQgTGlzdGVuZXIgcHJvdG9jb2wgcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBSb3V0ZXJJbnB1dFByb3RvY29sIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIFNSVCBMaXN0ZW5lclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcnRMaXN0ZW5lcihwcm9wczogU3J0TGlzdGVuZXJQcm90b2NvbFByb3BzKTogUm91dGVySW5wdXRQcm90b2NvbCB7XG4gICAgUm91dGVySW5wdXRQcm90b2NvbC52YWxpZGF0ZVBvcnQocHJvcHMucG9ydCk7XG4gICAgcmV0dXJuIG5ldyBSb3V0ZXJJbnB1dFByb3RvY29sKFJvdXRlcklucHV0UHJvdG9jb2xPcHRpb25zLlNSVF9MSVNURU5FUiwge1xuICAgICAgc3J0TGlzdGVuZXI6IHtcbiAgICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgICAgbWluaW11bUxhdGVuY3lNaWxsaXNlY29uZHM6IHByb3BzLm1pbmltdW1MYXRlbmN5LnRvTWlsbGlzZWNvbmRzKCksXG4gICAgICB9LFxuICAgIH0sIHByb3BzLnBvcnQsIHByb3BzLmRlY3J5cHRpb25Db25maWd1cmF0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gU1JUIENhbGxlciBwcm90b2NvbCBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBwcm9wcyBTUlQgQ2FsbGVyIHByb3RvY29sIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgUm91dGVySW5wdXRQcm90b2NvbCBpbnN0YW5jZSBjb25maWd1cmVkIGZvciBTUlQgQ2FsbGVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNydENhbGxlcihwcm9wczogU3J0Q2FsbGVyUHJvdG9jb2xQcm9wcyk6IFJvdXRlcklucHV0UHJvdG9jb2wge1xuICAgIFJvdXRlcklucHV0UHJvdG9jb2wudmFsaWRhdGVTcnRDYWxsZXJQb3J0KHByb3BzLnNvdXJjZVBvcnQpO1xuICAgIHJldHVybiBuZXcgUm91dGVySW5wdXRQcm90b2NvbChSb3V0ZXJJbnB1dFByb3RvY29sT3B0aW9ucy5TUlRfQ0FMTEVSLCB7XG4gICAgICBzcnRDYWxsZXI6IHtcbiAgICAgICAgc291cmNlQWRkcmVzczogcHJvcHMuc291cmNlQWRkcmVzcyxcbiAgICAgICAgc291cmNlUG9ydDogcHJvcHMuc291cmNlUG9ydCxcbiAgICAgICAgbWluaW11bUxhdGVuY3lNaWxsaXNlY29uZHM6IHByb3BzLm1pbmltdW1MYXRlbmN5LnRvTWlsbGlzZWNvbmRzKCksXG4gICAgICAgIHN0cmVhbUlkOiBwcm9wcy5zdHJlYW1JZCxcbiAgICAgIH0sXG4gICAgfSwgdW5kZWZpbmVkLCBwcm9wcy5kZWNyeXB0aW9uQ29uZmlndXJhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCBwb3J0IGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2UgKDMwMDAtMzAwMDApXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZVBvcnQocG9ydDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocG9ydCkgJiYgKHBvcnQgPCAzMDAwIHx8IHBvcnQgPiAzMDAwMCkpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgUm91dGVySW5wdXRQb3J0UmFuZ2VgLCBgUG9ydCBtdXN0IGJlIGJldHdlZW4gMzAwMCBhbmQgMzAwMDAsIGdvdCAke3BvcnR9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgU1JUIENhbGxlciBwb3J0IGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2UgKDAtNjU1MzUpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZVNydENhbGxlclBvcnQocG9ydDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocG9ydCkgJiYgKHBvcnQgPCAwIHx8IHBvcnQgPiA2NTUzNSkpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU3J0Q2FsbGVyUG9ydFJhbmdlYCwgYFNSVCBDYWxsZXIgcG9ydCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNjU1MzUsIGdvdCAke3BvcnR9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvdG9jb2xOYW1lOiBSb3V0ZXJJbnB1dFByb3RvY29sT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlnOiBDZm5Sb3V0ZXJJbnB1dC5Sb3V0ZXJJbnB1dFByb3RvY29sQ29uZmlndXJhdGlvblByb3BlcnR5O1xuICBwcml2YXRlIHJlYWRvbmx5IF9wb3J0PzogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWNyeXB0aW9uPzogUm91dGVyU3J0RW5jcnlwdGlvbjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByb3RvY29sTmFtZTogUm91dGVySW5wdXRQcm90b2NvbE9wdGlvbnMsXG4gICAgY29uZmlnOiBDZm5Sb3V0ZXJJbnB1dC5Sb3V0ZXJJbnB1dFByb3RvY29sQ29uZmlndXJhdGlvblByb3BlcnR5LFxuICAgIHBvcnQ/OiBudW1iZXIsXG4gICAgZGVjcnlwdGlvbj86IFJvdXRlclNydEVuY3J5cHRpb24sXG4gICkge1xuICAgIHRoaXMuX3Byb3RvY29sTmFtZSA9IHByb3RvY29sTmFtZTtcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5fcG9ydCA9IHBvcnQ7XG4gICAgdGhpcy5fZGVjcnlwdGlvbiA9IGRlY3J5cHRpb247XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGlzIHByb3RvY29sIHRvIGl0cyBDRk4tcmVhZHkgZm9ybS4gUmV0dXJucyB0aGUgcHJvdG9jb2wgaWRlbnRpZmllcixcbiAgICogdGhlIENGTiBjb25maWd1cmF0aW9uIHNoYXBlICh3aXRoIFNSVCBkZWNyeXB0aW9uIGF1dG8tcm9sZSBtYXRlcmlhbGl6ZWQgaWYgbmVlZGVkKSxcbiAgICogYW5kIHRoZSBpbmdlc3QgcG9ydCBpZiB0aGUgcHJvdG9jb2wgaGFzIG9uZS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlICAgICAgICAgQ29uc3RydWN0IHRoYXQgc2NvcGVzIHRoZSBhdXRvLWNyZWF0ZWQgZGVjcnlwdGlvbiByb2xlXG4gICAqIEBwYXJhbSByb3V0ZXJJbnB1dEFybiAgT3B0aW9uYWwgQVJOIG9mIHRoZSBjb25zdW1pbmcgcm91dGVyIGlucHV0IOKAlCB3aGVuIHByb3ZpZGVkLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlcyB0aGUgYXV0by1jcmVhdGVkIGRlY3J5cHRpb24gcm9sZSdzIHRydXN0IHBvbGljeS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCwgcm91dGVySW5wdXRBcm4/OiBzdHJpbmcpOiB7XG4gICAgbmFtZTogUm91dGVySW5wdXRQcm90b2NvbE9wdGlvbnM7XG4gICAgY29uZmlnOiBDZm5Sb3V0ZXJJbnB1dC5Sb3V0ZXJJbnB1dFByb3RvY29sQ29uZmlndXJhdGlvblByb3BlcnR5O1xuICAgIHBvcnQ/OiBudW1iZXI7XG4gIH0ge1xuICAgIGlmICghdGhpcy5fZGVjcnlwdGlvbikge1xuICAgICAgcmV0dXJuIHsgbmFtZTogdGhpcy5fcHJvdG9jb2xOYW1lLCBjb25maWc6IHRoaXMuX2NvbmZpZywgcG9ydDogdGhpcy5fcG9ydCB9O1xuICAgIH1cblxuICAgIGNvbnN0IGRlY3J5cHRpb25Db25maWd1cmF0aW9uID0gcmVuZGVyUm91dGVyU3J0RW5jcnlwdGlvbihzY29wZSwgJ0RlY3J5cHRpb25Sb2xlJywgdGhpcy5fZGVjcnlwdGlvbiwgcm91dGVySW5wdXRBcm4pO1xuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5zcnRMaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogdGhpcy5fcHJvdG9jb2xOYW1lLFxuICAgICAgICBwb3J0OiB0aGlzLl9wb3J0LFxuICAgICAgICBjb25maWc6IHsgc3J0TGlzdGVuZXI6IHsgLi4udGhpcy5fY29uZmlnLnNydExpc3RlbmVyLCBkZWNyeXB0aW9uQ29uZmlndXJhdGlvbiB9IH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29uZmlnLnNydENhbGxlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogdGhpcy5fcHJvdG9jb2xOYW1lLFxuICAgICAgICBwb3J0OiB0aGlzLl9wb3J0LFxuICAgICAgICBjb25maWc6IHsgc3J0Q2FsbGVyOiB7IC4uLnRoaXMuX2NvbmZpZy5zcnRDYWxsZXIsIGRlY3J5cHRpb25Db25maWd1cmF0aW9uIH0gfSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IG5hbWU6IHRoaXMuX3Byb3RvY29sTmFtZSwgY29uZmlnOiB0aGlzLl9jb25maWcsIHBvcnQ6IHRoaXMuX3BvcnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSBpbmdlc3QgVVJMIChzY2hlbWU6Ly9pcEFkZHJlc3M6cG9ydCkgZm9yIHRoaXMgcHJvdG9jb2wsIGlmIGl0IGhhc1xuICAgKiBhIGxpc3RlbmluZyBwb3J0LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfaW5nZXN0VXJsKGlwQWRkcmVzczogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fcG9ydCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZW5kZXJJbmdlc3RVcmwodGhpcy5fcHJvdG9jb2xOYW1lLnZhbHVlLCB0aGlzLl9wb3J0LCBpcEFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0ZW5pbmcgcG9ydCBmb3IgdGhpcyBwcm90b2NvbCwgaWYgaXQgaGFzIG9uZS4gVW5kZWZpbmVkIGZvciBTUlQgY2FsbGVyXG4gICAqICh3aGljaCBoYXMgYSBgc291cmNlUG9ydGAgcG9pbnRpbmcgYXQgdGhlIHVwc3RyZWFtIGxpc3RlbmVyLCBub3QgYSBwb3J0IHRoZSBpbnB1dFxuICAgKiBpdHNlbGYgbGlzdGVucyBvbikuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9saXN0ZW5pbmdQb3J0KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BvcnQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0d28gcHJvdG9jb2xzIHNoYXJlIHRoZSBzYW1lIHByb3RvY29sIGlkZW50aWZpZXIuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9tYXRjaGVzS2luZChvdGhlcjogUm91dGVySW5wdXRQcm90b2NvbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wcm90b2NvbE5hbWUudmFsdWUgPT09IG90aGVyLl9wcm90b2NvbE5hbWUudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHByb3RvY29sIGlzIFNSVCAoQ2FsbGVyIG9yIExpc3RlbmVyKS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2lzU3J0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wcm90b2NvbE5hbWUudmFsdWUgPT09IFJvdXRlcklucHV0UHJvdG9jb2xPcHRpb25zLlNSVF9DQUxMRVIudmFsdWVcbiAgICAgIHx8IHRoaXMuX3Byb3RvY29sTmFtZS52YWx1ZSA9PT0gUm91dGVySW5wdXRQcm90b2NvbE9wdGlvbnMuU1JUX0xJU1RFTkVSLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBvcnQgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHRoaXMgcHJvdG9jb2wgYW5kIGFub3RoZXIgaW4gYSBmYWlsb3ZlciBvclxuICAgKiBtZXJnZSBjb25maWd1cmF0aW9uLiBUaHJvd3Mgb24gY29uZmxpY3RzIGFwcHJvcHJpYXRlIHRvIHRoZSBwcm90b2NvbCBraW5kLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdmFsaWRhdGVQb3J0Q29uZmxpY3RzKG90aGVyOiBSb3V0ZXJJbnB1dFByb3RvY29sLCBjb25maWdUeXBlOiBQcm90b2NvbENvbmZpZ1R5cGUpOiB2b2lkIHtcbiAgICBjb25zdCBwcm90b2NvbFZhbHVlID0gdGhpcy5fcHJvdG9jb2xOYW1lLnZhbHVlO1xuXG4gICAgaWYgKHByb3RvY29sVmFsdWUgPT09IFJvdXRlcklucHV0UHJvdG9jb2xPcHRpb25zLlJJU1QudmFsdWUpIHtcbiAgICAgIGNvbnN0IHJpc3QxID0gdGhpcy5fY29uZmlnLnJpc3Q7XG4gICAgICBjb25zdCByaXN0MiA9IG90aGVyLl9jb25maWcucmlzdDtcbiAgICAgIGlmIChyaXN0MSAmJiByaXN0MiAmJiAncG9ydCcgaW4gcmlzdDEgJiYgJ3BvcnQnIGluIHJpc3QyKSB7XG4gICAgICAgIGNvbnN0IHBvcnQxID0gcmlzdDEucG9ydDtcbiAgICAgICAgY29uc3QgcG9ydDIgPSByaXN0Mi5wb3J0O1xuICAgICAgICBpZiAocG9ydDEgPT09IHBvcnQyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICAgbGl0YER1cGxpY2F0ZVJpc3RQb3J0YCxcbiAgICAgICAgICAgIGAke2NvbmZpZ1R5cGV9IGNvbmZpZ3VyYXRpb24gY2Fubm90IHVzZSB0aGUgc2FtZSBSSVNUIHBvcnQgJHtwb3J0MX0gZm9yIGJvdGggcHJvdG9jb2xzLCBgICtcbiAgICAgICAgICAgICdlYWNoIHByb3RvY29sIG11c3QgdXNlIGEgZGlmZmVyZW50IHBvcnQgbnVtYmVyJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChNYXRoLmFicyhwb3J0MSAtIHBvcnQyKSA8IDIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBsaXRgQ29uc2VjdXRpdmVSaXN0UG9ydGAsXG4gICAgICAgICAgICBgJHtjb25maWdUeXBlfSBjb25maWd1cmF0aW9uIGNhbm5vdCB1c2UgY29uc2VjdXRpdmUgUklTVCBwb3J0cyAke01hdGgubWluKHBvcnQxLCBwb3J0Mil9IGFuZCAke01hdGgubWF4KHBvcnQxLCBwb3J0Mil9LCBgICtcbiAgICAgICAgICAgICdSSVNUIHByb3RvY29scyByZXF1aXJlIG5vbi1jb25zZWN1dGl2ZSBwb3J0cyB0byBhdm9pZCBvdmVybGFwcGluZyByYW5nZXMgKGUuZy4sIHVzZSA2MDAwIGFuZCA2MDAyKScsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm90b2NvbFZhbHVlID09PSBSb3V0ZXJJbnB1dFByb3RvY29sT3B0aW9ucy5SVFAudmFsdWUpIHtcbiAgICAgIGNvbnN0IHJ0cDEgPSB0aGlzLl9jb25maWcucnRwO1xuICAgICAgY29uc3QgcnRwMiA9IG90aGVyLl9jb25maWcucnRwO1xuICAgICAgaWYgKHJ0cDEgJiYgcnRwMiAmJiAncG9ydCcgaW4gcnRwMSAmJiAncG9ydCcgaW4gcnRwMiAmJiBydHAxLnBvcnQgPT09IHJ0cDIucG9ydCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YER1cGxpY2F0ZVJ0cFBvcnRgLFxuICAgICAgICAgIGAke2NvbmZpZ1R5cGV9IGNvbmZpZ3VyYXRpb24gY2Fubm90IHVzZSB0aGUgc2FtZSBSVFAgcG9ydCAke3J0cDEucG9ydH0gZm9yIGJvdGggcHJvdG9jb2xzLCBgICtcbiAgICAgICAgICAnZWFjaCBwcm90b2NvbCBtdXN0IHVzZSBhIGRpZmZlcmVudCBwb3J0IG51bWJlcicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3RvY29sVmFsdWUgPT09IFJvdXRlcklucHV0UHJvdG9jb2xPcHRpb25zLlNSVF9MSVNURU5FUi52YWx1ZSkge1xuICAgICAgY29uc3Qgc3J0MSA9IHRoaXMuX2NvbmZpZy5zcnRMaXN0ZW5lcjtcbiAgICAgIGNvbnN0IHNydDIgPSBvdGhlci5fY29uZmlnLnNydExpc3RlbmVyO1xuICAgICAgaWYgKHNydDEgJiYgc3J0MiAmJiAncG9ydCcgaW4gc3J0MSAmJiAncG9ydCcgaW4gc3J0MiAmJiBzcnQxLnBvcnQgPT09IHNydDIucG9ydCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YER1cGxpY2F0ZVNydExpc3RlbmVyUG9ydGAsXG4gICAgICAgICAgYCR7Y29uZmlnVHlwZX0gY29uZmlndXJhdGlvbiBjYW5ub3QgdXNlIHRoZSBzYW1lIFNSVCBMaXN0ZW5lciBwb3J0ICR7c3J0MS5wb3J0fSBmb3IgYm90aCBwcm90b2NvbHMsIGAgK1xuICAgICAgICAgICdlYWNoIHByb3RvY29sIG11c3QgdXNlIGEgZGlmZmVyZW50IHBvcnQgbnVtYmVyJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBzdGFuZGFyZCBSb3V0ZXIgSW5wdXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYXJkQ29uZmlndXJhdGlvblByb3BzIHtcbiAgLyoqIE5ldHdvcmsgaW50ZXJmYWNlIGZvciB0aGUgUm91dGVyIElucHV0ICovXG4gIHJlYWRvbmx5IG5ldHdvcmtJbnRlcmZhY2U6IElSb3V0ZXJOZXR3b3JrSW50ZXJmYWNlO1xuICAvKiogUHJvdG9jb2wgY29uZmlndXJhdGlvbiBmb3IgdGhlIGlucHV0ICovXG4gIHJlYWRvbmx5IHByb3RvY29sOiBSb3V0ZXJJbnB1dFByb3RvY29sO1xuICAvKipcbiAgICogVGhlIGF2YWlsYWJpbGl0eSB6b25lIHdoZXJlIHRoZSByb3V0ZXIgaW5wdXQgaXMgbG9jYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhc3NpZ25lZCBieSB0aGUgTWVkaWFDb25uZWN0IHNlcnZpY2VcbiAgICovXG4gIHJlYWRvbmx5IGF2YWlsYWJpbGl0eVpvbmU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgZmFpbG92ZXIgUm91dGVyIElucHV0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYWlsb3ZlckNvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKiBOZXR3b3JrIGludGVyZmFjZSBmb3IgdGhlIFJvdXRlciBJbnB1dCAqL1xuICByZWFkb25seSBuZXR3b3JrSW50ZXJmYWNlOiBJUm91dGVyTmV0d29ya0ludGVyZmFjZTtcbiAgLyoqIEFycmF5IG9mIGV4YWN0bHkgMiBwcm90b2NvbCBjb25maWd1cmF0aW9ucyBmb3IgZmFpbG92ZXIgKG11c3QgYmUgc2FtZSBwcm90b2NvbCB0eXBlKSAqL1xuICByZWFkb25seSBwcm90b2NvbHM6IFJvdXRlcklucHV0UHJvdG9jb2xbXTtcbiAgLyoqXG4gICAqIFNvdXJjZSBwcmlvcml0eSBjb25maWd1cmF0aW9uIGZvciBmYWlsb3Zlci5cbiAgICpcbiAgICogQGRlZmF1bHQgU291cmNlUHJpb3JpdHlDb25maWcubm9uZSgpXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQcmlvcml0eT86IFNvdXJjZVByaW9yaXR5Q29uZmlnO1xuICAvKipcbiAgICogVGhlIGF2YWlsYWJpbGl0eSB6b25lIHdoZXJlIHRoZSByb3V0ZXIgaW5wdXQgaXMgbG9jYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhc3NpZ25lZCBieSB0aGUgTWVkaWFDb25uZWN0IHNlcnZpY2VcbiAgICovXG4gIHJlYWRvbmx5IGF2YWlsYWJpbGl0eVpvbmU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgbWVyZ2UgUm91dGVyIElucHV0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXJnZUNvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKiBOZXR3b3JrIGludGVyZmFjZSBmb3IgdGhlIFJvdXRlciBJbnB1dCAqL1xuICByZWFkb25seSBuZXR3b3JrSW50ZXJmYWNlOiBJUm91dGVyTmV0d29ya0ludGVyZmFjZTtcbiAgLyoqIEFycmF5IG9mIGV4YWN0bHkgMiBwcm90b2NvbCBjb25maWd1cmF0aW9ucyBmb3IgbWVyZ2UgKG11c3QgYmUgc2FtZSBub24tU1JUIHByb3RvY29sIHR5cGUpICovXG4gIHJlYWRvbmx5IHByb3RvY29sczogUm91dGVySW5wdXRQcm90b2NvbFtdO1xuICAvKiogUmVjb3Zlcnkgd2luZG93IGZvciBtZXJnZSBvcGVyYXRpb24gKi9cbiAgcmVhZG9ubHkgbWVyZ2VSZWNvdmVyeVdpbmRvdzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgYXZhaWxhYmlsaXR5IHpvbmUgd2hlcmUgdGhlIHJvdXRlciBpbnB1dCBpcyBsb2NhdGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFzc2lnbmVkIGJ5IHRoZSBNZWRpYUNvbm5lY3Qgc2VydmljZVxuICAgKi9cbiAgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBNZWRpYUNvbm5lY3QgRmxvdyBSb3V0ZXIgSW5wdXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhQ29ubmVjdEZsb3dDb25maWd1cmF0aW9uUHJvcHMge1xuICAvKiogVGhlIE1lZGlhQ29ubmVjdCBmbG93IHRvIHVzZSBhcyBpbnB1dCAqL1xuICByZWFkb25seSBmbG93OiBJRmxvdztcbiAgLyoqIFRoZSBmbG93IG91dHB1dCB0aGF0IGZlZWRzIHRoaXMgcm91dGVyIGlucHV0ICovXG4gIHJlYWRvbmx5IGZsb3dPdXRwdXQ6IElGbG93T3V0cHV0O1xuICAvKipcbiAgICogT3B0aW9uYWwgdHJhbnNpdCBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICogQGRlZmF1bHQgLSBBdXRvbWF0aWMgZW5jcnlwdGlvbiB3aWxsIGJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVRyYW5zaXREZWNyeXB0aW9uPzogVHJhbnNpdEVuY3J5cHRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgTWVkaWFDb25uZWN0IEZsb3cgUm91dGVyIElucHV0IGNvbmZpZ3VyYXRpb24gLSB3aXRob3V0IGEgY29ubmVjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhQ29ubmVjdEZsb3dDb25maWd1cmF0aW9uV2l0aG91dENvbm5lY3Rpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBBdmFpbGFiaWxpdHkgWm9uZSB0aGUgcm91dGVyIGlucHV0IHdpbGwgYmUgcGxhY2VkIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgdHJhbnNpdCBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICogQGRlZmF1bHQgLSBBdXRvbWF0aWMgZW5jcnlwdGlvbiB3aWxsIGJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVRyYW5zaXREZWNyeXB0aW9uPzogVHJhbnNpdEVuY3J5cHRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgTWVkaWFMaXZlIENoYW5uZWwgUm91dGVyIElucHV0IGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVXNlIHRoaXMgd2hlbiB0aGUgTWVkaWFMaXZlIGNoYW5uZWwgYWxyZWFkeSBleGlzdHMgYW5kIHlvdSB3YW50IHRvIGluZ2VzdFxuICogZnJvbSBvbmUgb2YgaXRzIG91dHB1dHMgaW1tZWRpYXRlbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFMaXZlQ2hhbm5lbENvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBBUk4gb2YgdGhlIE1lZGlhTGl2ZSBjaGFubmVsIHRvIHVzZSBhcyBpbnB1dC5cbiAgICpcbiAgICogTm90ZTogVGhpcyB3aWxsIGNoYW5nZSB0byBhY2NlcHQgYSB0eXBlZCBNZWRpYUxpdmUgY2hhbm5lbCByZWZlcmVuY2VcbiAgICogd2hlbiB0aGUgQGF3cy1jZGsvYXdzLW1lZGlhbGl2ZS1hbHBoYSBMMiBjb25zdHJ1Y3QgaXMgcmVsZWFzZWQuXG4gICAqL1xuICByZWFkb25seSBtZWRpYUxpdmVDaGFubmVsQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBNZWRpYUxpdmUgY2hhbm5lbCBvdXRwdXQgdG8gY29ubmVjdCB0byB0aGlzIHJvdXRlciBpbnB1dC5cbiAgICovXG4gIHJlYWRvbmx5IG1lZGlhTGl2ZUNoYW5uZWxPdXRwdXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBNZWRpYUxpdmUgcGlwZWxpbmUgdG8gY29ubmVjdCB0byB0aGlzIHJvdXRlciBpbnB1dC5cbiAgICovXG4gIHJlYWRvbmx5IG1lZGlhTGl2ZVBpcGVsaW5lSWQ6IE1lZGlhTGl2ZVBpcGVsaW5lO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCB0cmFuc2l0IGVuY3J5cHRpb24gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBdXRvbWF0aWMgZW5jcnlwdGlvbiB3aWxsIGJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVRyYW5zaXREZWNyeXB0aW9uPzogVHJhbnNpdEVuY3J5cHRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgTWVkaWFMaXZlIENoYW5uZWwgUm91dGVyIElucHV0IGNvbmZpZ3VyYXRpb24gd2l0aG91dCBhIHNwZWNpZmljIGNoYW5uZWwgY29ubmVjdGlvbi5cbiAqXG4gKiBVc2UgdGhpcyB3aGVuIHlvdSB3YW50IHRvIHNldCB1cCB0aGUgcm91dGVyIGlucHV0IGJlZm9yZSB0aGUgdGFyZ2V0IE1lZGlhTGl2ZSBjaGFubmVsIGV4aXN0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZWRpYUxpdmVDaGFubmVsQ29uZmlndXJhdGlvbldpdGhvdXRDb25uZWN0aW9uUHJvcHMge1xuICAvKipcbiAgICogQXZhaWxhYmlsaXR5IFpvbmUgdGhlIHJvdXRlciBpbnB1dCB3aWxsIGJlIHBsYWNlZCBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgdHJhbnNpdCBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQXV0b21hdGljIGVuY3J5cHRpb24gd2lsbCBiZSB1c2VkXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VUcmFuc2l0RGVjcnlwdGlvbj86IFRyYW5zaXRFbmNyeXB0aW9uO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIFJvdXRlciBJbnB1dCBjb25maWd1cmF0aW9uc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUm91dGVySW5wdXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0YW5kYXJkIFJvdXRlciBJbnB1dCBjb25maWd1cmF0aW9uIHdpdGggYSBzaW5nbGUgcHJvdG9jb2xcbiAgICogQHBhcmFtIHByb3BzIFN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBSb3V0ZXJJbnB1dENvbmZpZ3VyYXRpb24gaW5zdGFuY2UgZm9yIHN0YW5kYXJkIHNldHVwXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHN0YW5kYXJkKHByb3BzOiBTdGFuZGFyZENvbmZpZ3VyYXRpb25Qcm9wcyk6IFJvdXRlcklucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBTdGFuZGFyZFJvdXRlcklucHV0Q29uZmlnKHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBmYWlsb3ZlciBSb3V0ZXIgSW5wdXQgY29uZmlndXJhdGlvbiB3aXRoIHR3byBtYXRjaGluZyBwcm90b2NvbHNcbiAgICogQHBhcmFtIHByb3BzIEZhaWxvdmVyIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBSb3V0ZXJJbnB1dENvbmZpZ3VyYXRpb24gaW5zdGFuY2UgZm9yIGZhaWxvdmVyIHNldHVwXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgcHJvdG9jb2xzIGRvbid0IG1hdGNoIG9yIGNvdW50IGlzIG5vdCBleGFjdGx5IDJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZmFpbG92ZXIocHJvcHM6IEZhaWxvdmVyQ29uZmlndXJhdGlvblByb3BzKTogUm91dGVySW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5wcm90b2NvbHMpICYmIHByb3BzLnByb3RvY29scy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgRmFpbG92ZXJQcm90b2NvbENvdW50YCwgYEZhaWxvdmVyIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgZXhhY3RseSAyIHByb3RvY29scywgZ290ICR7cHJvcHMucHJvdG9jb2xzLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgaWYgKCFwcm9wcy5wcm90b2NvbHNbMF0uX21hdGNoZXNLaW5kKHByb3BzLnByb3RvY29sc1sxXSkpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgRmFpbG92ZXJQcm90b2NvbE1pc21hdGNoYCwgJ1Byb3RvY29scyBtdXN0IG1hdGNoJyk7XG4gICAgfVxuICAgIHByb3BzLnByb3RvY29sc1swXS5fdmFsaWRhdGVQb3J0Q29uZmxpY3RzKHByb3BzLnByb3RvY29sc1sxXSwgUHJvdG9jb2xDb25maWdUeXBlLkZBSUxPVkVSKTtcbiAgICByZXR1cm4gbmV3IEZhaWxvdmVyUm91dGVySW5wdXRDb25maWcocHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG1lcmdlIFJvdXRlciBJbnB1dCBjb25maWd1cmF0aW9uIHdpdGggdHdvIG1hdGNoaW5nIG5vbi1TUlQgcHJvdG9jb2xzXG4gICAqIEBwYXJhbSBwcm9wcyBNZXJnZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgUm91dGVySW5wdXRDb25maWd1cmF0aW9uIGluc3RhbmNlIGZvciBtZXJnZSBzZXR1cFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHByb3RvY29scyBkb24ndCBtYXRjaCwgY291bnQgaXMgbm90IGV4YWN0bHkgMiwgb3IgU1JUIHByb3RvY29scyBhcmUgdXNlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtZXJnZShwcm9wczogTWVyZ2VDb25maWd1cmF0aW9uUHJvcHMpOiBSb3V0ZXJJbnB1dENvbmZpZ3VyYXRpb24ge1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLnByb3RvY29scykgJiYgcHJvcHMucHJvdG9jb2xzLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBNZXJnZVByb3RvY29sQ291bnRgLCBgTWVyZ2UgY29uZmlndXJhdGlvbiByZXF1aXJlcyBleGFjdGx5IDIgcHJvdG9jb2xzLCBnb3QgJHtwcm9wcy5wcm90b2NvbHMubGVuZ3RofWApO1xuICAgIH1cbiAgICBpZiAocHJvcHMucHJvdG9jb2xzLnNvbWUocCA9PiBwLl9pc1NydCgpKSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBNZXJnZVNydE5vdFN1cHBvcnRlZGAsICdTUlQgcHJvdG9jb2xzIGFyZSBub3Qgc3VwcG9ydGVkIGluIG1lcmdlIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCFwcm9wcy5wcm90b2NvbHNbMF0uX21hdGNoZXNLaW5kKHByb3BzLnByb3RvY29sc1sxXSkpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTWVyZ2VQcm90b2NvbE1pc21hdGNoYCwgJ1Byb3RvY29scyBtdXN0IG1hdGNoJyk7XG4gICAgfVxuICAgIHByb3BzLnByb3RvY29sc1swXS5fdmFsaWRhdGVQb3J0Q29uZmxpY3RzKHByb3BzLnByb3RvY29sc1sxXSwgUHJvdG9jb2xDb25maWdUeXBlLk1FUkdFKTtcbiAgICByZXR1cm4gbmV3IE1lcmdlUm91dGVySW5wdXRDb25maWcocHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIE1lZGlhQ29ubmVjdCBGbG93IFJvdXRlciBJbnB1dCBjb25maWd1cmF0aW9uIHdpdGhvdXQgY29ubmVjdGluZyB0byBhIHNwZWNpZmljIGZsb3dcbiAgICogVXNlIHRoaXMgd2hlbiB5b3Ugd2FudCB0byBwcmVwYXJlIHRoZSByb3V0ZXIgaW5wdXQgZm9yIGEgZmxvdyBjb25uZWN0aW9uIGxhdGVyXG4gICAqIEBwYXJhbSBwcm9wcyBNZWRpYUNvbm5lY3QgRmxvdyBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgd2l0aG91dCBjb25uZWN0aW9uXG4gICAqIEByZXR1cm5zIFJvdXRlcklucHV0Q29uZmlndXJhdGlvbiBpbnN0YW5jZSBmb3IgTWVkaWFDb25uZWN0IEZsb3cgc2V0dXAgd2l0aG91dCBjb25uZWN0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1lZGlhQ29ubmVjdEZsb3dXaXRob3V0Q29ubmVjdGlvbihwcm9wczogTWVkaWFDb25uZWN0Rmxvd0NvbmZpZ3VyYXRpb25XaXRob3V0Q29ubmVjdGlvblByb3BzKTogUm91dGVySW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE1lZGlhQ29ubmVjdEZsb3dSb3V0ZXJJbnB1dENvbmZpZyh7IHNvdXJjZVRyYW5zaXREZWNyeXB0aW9uOiBwcm9wcy5zb3VyY2VUcmFuc2l0RGVjcnlwdGlvbiB9LCBwcm9wcy5hdmFpbGFiaWxpdHlab25lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBNZWRpYUNvbm5lY3QgRmxvdyBSb3V0ZXIgSW5wdXQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogVXNlIHRoaXMgd2hlbiB0aGUgc291cmNlIGZsb3cgYWxyZWFkeSBleGlzdHMgYW5kIHlvdSB3YW50IHRvIGNvbm5lY3QgaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBNZWRpYUNvbm5lY3QgRmxvdyBjb25maWd1cmF0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgUm91dGVySW5wdXRDb25maWd1cmF0aW9uIGluc3RhbmNlIGZvciBNZWRpYUNvbm5lY3QgRmxvdyBzZXR1cFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtZWRpYUNvbm5lY3RGbG93KHByb3BzOiBNZWRpYUNvbm5lY3RGbG93Q29uZmlndXJhdGlvblByb3BzKTogUm91dGVySW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE1lZGlhQ29ubmVjdEZsb3dSb3V0ZXJJbnB1dENvbmZpZyh7XG4gICAgICBmbG93OiBwcm9wcy5mbG93LFxuICAgICAgZmxvd091dHB1dDogcHJvcHMuZmxvd091dHB1dCxcbiAgICAgIHNvdXJjZVRyYW5zaXREZWNyeXB0aW9uOiBwcm9wcy5zb3VyY2VUcmFuc2l0RGVjcnlwdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBNZWRpYUxpdmUgQ2hhbm5lbCBSb3V0ZXIgSW5wdXQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogVXNlIHRoaXMgd2hlbiB0aGUgc291cmNlIE1lZGlhTGl2ZSBjaGFubmVsIGFscmVhZHkgZXhpc3RzIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBpbmdlc3QgZnJvbSBvbmUgb2YgaXRzIG91dHB1dHMgaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBNZWRpYUxpdmUgY2hhbm5lbCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgUm91dGVySW5wdXRDb25maWd1cmF0aW9uIGluc3RhbmNlIGZvciBNZWRpYUxpdmUgY2hhbm5lbCBzZXR1cFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtZWRpYUxpdmVDaGFubmVsKHByb3BzOiBNZWRpYUxpdmVDaGFubmVsQ29uZmlndXJhdGlvblByb3BzKTogUm91dGVySW5wdXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE1lZGlhTGl2ZUNoYW5uZWxSb3V0ZXJJbnB1dENvbmZpZyh7XG4gICAgICBtZWRpYUxpdmVDaGFubmVsQXJuOiBwcm9wcy5tZWRpYUxpdmVDaGFubmVsQXJuLFxuICAgICAgbWVkaWFMaXZlQ2hhbm5lbE91dHB1dE5hbWU6IHByb3BzLm1lZGlhTGl2ZUNoYW5uZWxPdXRwdXROYW1lLFxuICAgICAgbWVkaWFMaXZlUGlwZWxpbmVJZDogcHJvcHMubWVkaWFMaXZlUGlwZWxpbmVJZCxcbiAgICAgIHNvdXJjZVRyYW5zaXREZWNyeXB0aW9uOiBwcm9wcy5zb3VyY2VUcmFuc2l0RGVjcnlwdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBNZWRpYUxpdmUgQ2hhbm5lbCBSb3V0ZXIgSW5wdXQgY29uZmlndXJhdGlvbiB3aXRob3V0IGEgc3BlY2lmaWMgY2hhbm5lbCBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBVc2UgdGhpcyB3aGVuIHlvdSB3YW50IHRvIHNldCB1cCB0aGUgcm91dGVyIGlucHV0IGJlZm9yZSB0aGUgdGFyZ2V0IE1lZGlhTGl2ZSBjaGFubmVsIGV4aXN0cy5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIE1lZGlhTGl2ZSBjaGFubmVsIG5vLWNvbm5lY3Rpb24gcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBSb3V0ZXJJbnB1dENvbmZpZ3VyYXRpb24gaW5zdGFuY2UgZm9yIE1lZGlhTGl2ZSBjaGFubmVsIHNldHVwIHdpdGhvdXQgY29ubmVjdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtZWRpYUxpdmVDaGFubmVsV2l0aG91dENvbm5lY3Rpb24ocHJvcHM6IE1lZGlhTGl2ZUNoYW5uZWxDb25maWd1cmF0aW9uV2l0aG91dENvbm5lY3Rpb25Qcm9wcyk6IFJvdXRlcklucHV0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBNZWRpYUxpdmVDaGFubmVsUm91dGVySW5wdXRDb25maWcoeyBzb3VyY2VUcmFuc2l0RGVjcnlwdGlvbjogcHJvcHMuc291cmNlVHJhbnNpdERlY3J5cHRpb24gfSwgcHJvcHMuYXZhaWxhYmlsaXR5Wm9uZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gaXRzIENsb3VkRm9ybWF0aW9uIHNoYXBlLiBDYWxsZWQgYnkgdGhlIFJvdXRlcklucHV0XG4gICAqIGNvbnN0cnVjdG9yIOKAlCBlYWNoIGNvbmNyZXRlIHN1YmNsYXNzIHN1cHBsaWVzIGl0cyBvd24gdmFyaWFudC1zcGVjaWZpYyByZW5kZXJpbmcuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIHJvdXRlcklucHV0QXJuPzogc3RyaW5nKToge1xuICAgIGNvbmZpZzogQ2ZuUm91dGVySW5wdXQuUm91dGVySW5wdXRDb25maWd1cmF0aW9uUHJvcGVydHk7IGF2YWlsYWJpbGl0eVpvbmU/OiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgdGhlIGluZ2VzdCBlbmRwb2ludHMgZm9yIHByb3RvY29sLWJhc2VkIGlucHV0cyB0aGF0IGxpc3RlbiBvbiBvbmUgb3IgbW9yZVxuICAgKiBwb3J0cy5cbiAgICpcbiAgICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSB2YXJpYW50IGhhcyBubyBjb25jZXB0IG9mIGEgbGlzdGVuIHBvcnQgKFNSVCBjYWxsZXIsXG4gICAqIE1lZGlhQ29ubmVjdCBGbG93LCBNZWRpYUxpdmUgQ2hhbm5lbCkuIFJldHVybnMgYW4gYXJyYXkgd2l0aCBvbmUgZW50cnkgZm9yXG4gICAqIHN0YW5kYXJkIHZhcmlhbnRzLCBhbmQgb25lIGVudHJ5IHBlciBzb3VyY2UgZm9yIGZhaWxvdmVyIGFuZCBtZXJnZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgX2VuZHBvaW50cyhpcEFkZHJlc3M6IHN0cmluZyk6IFJvdXRlcklucHV0RW5kcG9pbnRbXSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZW5kZXIgYW4gaW5nZXN0IFVSTCBzdHJpbmcgKHNjaGVtZTovL2lwOnBvcnQpLiBVc2VkIGJ5IGBfaW5nZXN0VXJsKClgIG9uIGluZGl2aWR1YWxcbiAqIHByb3RvY29scyBhbmQgY29tcG9zZWQgaW50byB0aGUgcGVyLWNvbmZpZy12YXJpYW50IGBfZW5kcG9pbnRzKClgIHJlc3VsdHMuXG4gKlxuICogRXh0cmFjdHMgdGhlIGJhc2UgcHJvdG9jb2wgZm9yIHRoZSBVUkwgc2NoZW1lIChlLmcuIFNSVF9MSVNURU5FUiDihpIgc3J0LCBSVFAg4oaSIHJ0cCkuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckluZ2VzdFVybChwcm90b2NvbE5hbWU6IHN0cmluZywgcG9ydDogbnVtYmVyLCBpcEFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNjaGVtZSA9IHByb3RvY29sTmFtZS50b0xvd2VyQ2FzZSgpLnNwbGl0KCdfJylbMF07XG4gIHJldHVybiBGbi5qb2luKCcnLCBbYCR7c2NoZW1lfTovL2AsIGlwQWRkcmVzcywgYDoke3BvcnR9YF0pO1xufVxuXG4vKipcbiAqIENvbmNyZXRlIHZhcmlhbnQ6IHN0YW5kYXJkIChzaW5nbGUtcHJvdG9jb2wpIHJvdXRlciBpbnB1dCBjb25maWd1cmF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbmNsYXNzIFN0YW5kYXJkUm91dGVySW5wdXRDb25maWcgZXh0ZW5kcyBSb3V0ZXJJbnB1dENvbmZpZ3VyYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBTdGFuZGFyZENvbmZpZ3VyYXRpb25Qcm9wcykgeyBzdXBlcigpOyB9XG5cbiAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIHJvdXRlcklucHV0QXJuPzogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLnByb3BzLnByb3RvY29sLl9iaW5kKHNjb3BlLCByb3V0ZXJJbnB1dEFybik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBzdGFuZGFyZDoge1xuICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2VBcm46IHRoaXMucHJvcHMubmV0d29ya0ludGVyZmFjZS5yb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQXJuLFxuICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbC5uYW1lLnZhbHVlLFxuICAgICAgICAgIHByb3RvY29sQ29uZmlndXJhdGlvbjogcHJvdG9jb2wuY29uZmlnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IHRoaXMucHJvcHMuYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIF9lbmRwb2ludHMoaXBBZGRyZXNzOiBzdHJpbmcpOiBSb3V0ZXJJbnB1dEVuZHBvaW50W10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHVybCA9IHRoaXMucHJvcHMucHJvdG9jb2wuX2luZ2VzdFVybChpcEFkZHJlc3MpO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnByb3BzLnByb3RvY29sLl9saXN0ZW5pbmdQb3J0KCk7XG4gICAgaWYgKHVybCA9PT0gdW5kZWZpbmVkIHx8IHBvcnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gW3sgdXJsLCBwb3J0IH1dO1xuICB9XG59XG5cbi8qKlxuICogQ29uY3JldGUgdmFyaWFudDogZmFpbG92ZXIgcm91dGVyIGlucHV0IGNvbmZpZ3VyYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuY2xhc3MgRmFpbG92ZXJSb3V0ZXJJbnB1dENvbmZpZyBleHRlbmRzIFJvdXRlcklucHV0Q29uZmlndXJhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEZhaWxvdmVyQ29uZmlndXJhdGlvblByb3BzKSB7IHN1cGVyKCk7IH1cblxuICBwdWJsaWMgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCwgcm91dGVySW5wdXRBcm4/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBwcmlvcml0eSA9ICh0aGlzLnByb3BzLnNvdXJjZVByaW9yaXR5ID8/IFNvdXJjZVByaW9yaXR5Q29uZmlnLm5vbmUoKSkuX2JpbmQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGZhaWxvdmVyOiB7XG4gICAgICAgICAgbmV0d29ya0ludGVyZmFjZUFybjogdGhpcy5wcm9wcy5uZXR3b3JrSW50ZXJmYWNlLnJvdXRlck5ldHdvcmtJbnRlcmZhY2VBcm4sXG4gICAgICAgICAgcHJvdG9jb2xDb25maWd1cmF0aW9uczogdGhpcy5wcm9wcy5wcm90b2NvbHMubWFwKHAgPT4gcC5fYmluZChzY29wZSwgcm91dGVySW5wdXRBcm4pLmNvbmZpZyksXG4gICAgICAgICAgc291cmNlUHJpb3JpdHlNb2RlOiBwcmlvcml0eS5zb3VyY2VQcmlvcml0eU1vZGUsXG4gICAgICAgICAgcHJpbWFyeVNvdXJjZUluZGV4OiBwcmlvcml0eS5wcmltYXJ5U291cmNlSW5kZXgsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogdGhpcy5wcm9wcy5hdmFpbGFiaWxpdHlab25lLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgX2VuZHBvaW50cyhpcEFkZHJlc3M6IHN0cmluZyk6IFJvdXRlcklucHV0RW5kcG9pbnRbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZW5kcG9pbnRzOiBSb3V0ZXJJbnB1dEVuZHBvaW50W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5wcm9wcy5wcm90b2NvbHMpIHtcbiAgICAgIGNvbnN0IHVybCA9IHAuX2luZ2VzdFVybChpcEFkZHJlc3MpO1xuICAgICAgY29uc3QgcG9ydCA9IHAuX2xpc3RlbmluZ1BvcnQoKTtcbiAgICAgIGlmICh1cmwgPT09IHVuZGVmaW5lZCB8fCBwb3J0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBlbmRwb2ludHMucHVzaCh7IHVybCwgcG9ydCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGVuZHBvaW50cztcbiAgfVxufVxuXG4vKipcbiAqIENvbmNyZXRlIHZhcmlhbnQ6IG1lcmdlIHJvdXRlciBpbnB1dCBjb25maWd1cmF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbmNsYXNzIE1lcmdlUm91dGVySW5wdXRDb25maWcgZXh0ZW5kcyBSb3V0ZXJJbnB1dENvbmZpZ3VyYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBNZXJnZUNvbmZpZ3VyYXRpb25Qcm9wcykgeyBzdXBlcigpOyB9XG5cbiAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIHJvdXRlcklucHV0QXJuPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBtZXJnZToge1xuICAgICAgICAgIG5ldHdvcmtJbnRlcmZhY2VBcm46IHRoaXMucHJvcHMubmV0d29ya0ludGVyZmFjZS5yb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQXJuLFxuICAgICAgICAgIHByb3RvY29sQ29uZmlndXJhdGlvbnM6IHRoaXMucHJvcHMucHJvdG9jb2xzLm1hcChwID0+IHAuX2JpbmQoc2NvcGUsIHJvdXRlcklucHV0QXJuKS5jb25maWcpLFxuICAgICAgICAgIG1lcmdlUmVjb3ZlcnlXaW5kb3dNaWxsaXNlY29uZHM6IHRoaXMucHJvcHMubWVyZ2VSZWNvdmVyeVdpbmRvdy50b01pbGxpc2Vjb25kcygpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IHRoaXMucHJvcHMuYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIF9lbmRwb2ludHMoaXBBZGRyZXNzOiBzdHJpbmcpOiBSb3V0ZXJJbnB1dEVuZHBvaW50W10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVuZHBvaW50czogUm91dGVySW5wdXRFbmRwb2ludFtdID0gW107XG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMucHJvcHMucHJvdG9jb2xzKSB7XG4gICAgICBjb25zdCB1cmwgPSBwLl9pbmdlc3RVcmwoaXBBZGRyZXNzKTtcbiAgICAgIGNvbnN0IHBvcnQgPSBwLl9saXN0ZW5pbmdQb3J0KCk7XG4gICAgICBpZiAodXJsID09PSB1bmRlZmluZWQgfHwgcG9ydCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgZW5kcG9pbnRzLnB1c2goeyB1cmwsIHBvcnQgfSk7XG4gICAgfVxuICAgIHJldHVybiBlbmRwb2ludHM7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBvcHRpb25zIGZvciB7QGxpbmsgTWVkaWFDb25uZWN0Rmxvd1JvdXRlcklucHV0Q29uZmlnfS5cbiAqL1xuaW50ZXJmYWNlIE1lZGlhQ29ubmVjdEZsb3dSb3V0ZXJJbnB1dE9wdGlvbnMge1xuICByZWFkb25seSBmbG93PzogSUZsb3c7XG4gIHJlYWRvbmx5IGZsb3dPdXRwdXQ/OiBJRmxvd091dHB1dDtcbiAgcmVhZG9ubHkgc291cmNlVHJhbnNpdERlY3J5cHRpb24/OiBUcmFuc2l0RW5jcnlwdGlvbjtcbn1cblxuLyoqXG4gKiBDb25jcmV0ZSB2YXJpYW50OiBNZWRpYUNvbm5lY3QgRmxvdyByb3V0ZXIgaW5wdXQgY29uZmlndXJhdGlvbiAod2l0aCBvciB3aXRob3V0IGNvbm5lY3Rpb24pLlxuICogQGludGVybmFsXG4gKi9cbmNsYXNzIE1lZGlhQ29ubmVjdEZsb3dSb3V0ZXJJbnB1dENvbmZpZyBleHRlbmRzIFJvdXRlcklucHV0Q29uZmlndXJhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogTWVkaWFDb25uZWN0Rmxvd1JvdXRlcklucHV0T3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF2YWlsYWJpbGl0eVpvbmU/OiBzdHJpbmcsXG4gICkgeyBzdXBlcigpOyB9XG5cbiAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIHJvdXRlcklucHV0QXJuPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBtZWRpYUNvbm5lY3RGbG93OiB7XG4gICAgICAgICAgZmxvd0FybjogdGhpcy5vcHRpb25zLmZsb3c/LmZsb3dBcm4sXG4gICAgICAgICAgZmxvd091dHB1dEFybjogdGhpcy5vcHRpb25zLmZsb3dPdXRwdXQ/LmZsb3dPdXRwdXRBcm4sXG4gICAgICAgICAgc291cmNlVHJhbnNpdERlY3J5cHRpb246IHJlbmRlclRyYW5zaXRFbmNyeXB0aW9uKHNjb3BlLCAnU291cmNlVHJhbnNpdERlY3J5cHRpb25Sb2xlJywgdGhpcy5vcHRpb25zLnNvdXJjZVRyYW5zaXREZWNyeXB0aW9uLCByb3V0ZXJJbnB1dEFybiksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogdGhpcy5hdmFpbGFiaWxpdHlab25lLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgX2VuZHBvaW50cyhfaXBBZGRyZXNzOiBzdHJpbmcpOiBSb3V0ZXJJbnB1dEVuZHBvaW50W10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBvcHRpb25zIGZvciB7QGxpbmsgTWVkaWFMaXZlQ2hhbm5lbFJvdXRlcklucHV0Q29uZmlnfS5cbiAqL1xuaW50ZXJmYWNlIE1lZGlhTGl2ZUNoYW5uZWxSb3V0ZXJJbnB1dE9wdGlvbnMge1xuICByZWFkb25seSBtZWRpYUxpdmVDaGFubmVsQXJuPzogc3RyaW5nO1xuICByZWFkb25seSBtZWRpYUxpdmVDaGFubmVsT3V0cHV0TmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgbWVkaWFMaXZlUGlwZWxpbmVJZD86IE1lZGlhTGl2ZVBpcGVsaW5lO1xuICByZWFkb25seSBzb3VyY2VUcmFuc2l0RGVjcnlwdGlvbj86IFRyYW5zaXRFbmNyeXB0aW9uO1xufVxuXG4vKipcbiAqIENvbmNyZXRlIHZhcmlhbnQ6IE1lZGlhTGl2ZSBDaGFubmVsIHJvdXRlciBpbnB1dCBjb25maWd1cmF0aW9uICh3aXRoIG9yIHdpdGhvdXQgY29ubmVjdGlvbikuXG4gKiBAaW50ZXJuYWxcbiAqL1xuY2xhc3MgTWVkaWFMaXZlQ2hhbm5lbFJvdXRlcklucHV0Q29uZmlnIGV4dGVuZHMgUm91dGVySW5wdXRDb25maWd1cmF0aW9uIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBNZWRpYUxpdmVDaGFubmVsUm91dGVySW5wdXRPcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZT86IHN0cmluZyxcbiAgKSB7IHN1cGVyKCk7IH1cblxuICBwdWJsaWMgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCwgcm91dGVySW5wdXRBcm4/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG1lZGlhTGl2ZUNoYW5uZWw6IHtcbiAgICAgICAgICBtZWRpYUxpdmVDaGFubmVsQXJuOiB0aGlzLm9wdGlvbnMubWVkaWFMaXZlQ2hhbm5lbEFybixcbiAgICAgICAgICBtZWRpYUxpdmVDaGFubmVsT3V0cHV0TmFtZTogdGhpcy5vcHRpb25zLm1lZGlhTGl2ZUNoYW5uZWxPdXRwdXROYW1lLFxuICAgICAgICAgIG1lZGlhTGl2ZVBpcGVsaW5lSWQ6IHRoaXMub3B0aW9ucy5tZWRpYUxpdmVQaXBlbGluZUlkLFxuICAgICAgICAgIHNvdXJjZVRyYW5zaXREZWNyeXB0aW9uOiByZW5kZXJUcmFuc2l0RW5jcnlwdGlvbihzY29wZSwgJ1NvdXJjZVRyYW5zaXREZWNyeXB0aW9uUm9sZScsIHRoaXMub3B0aW9ucy5zb3VyY2VUcmFuc2l0RGVjcnlwdGlvbiwgcm91dGVySW5wdXRBcm4pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IHRoaXMuYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIF9lbmRwb2ludHMoX2lwQWRkcmVzczogc3RyaW5nKTogUm91dGVySW5wdXRFbmRwb2ludFtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQSBNZWRpYUNvbm5lY3QgUm91dGVyIElucHV0IHRoYXQgcmVjZWl2ZXMgbWVkaWEgc3RyZWFtcyBhbmQgcm91dGVzIHRoZW0gdG8gb3V0cHV0cy5cbiAqXG4gKiBSb3V0ZXIgSW5wdXRzIHN1cHBvcnQgbXVsdGlwbGUgY29uZmlndXJhdGlvbiB0eXBlczpcbiAqIC0gU3RhbmRhcmQ6IFNpbmdsZSBwcm90b2NvbCBpbnB1dFxuICogLSBGYWlsb3ZlcjogVHdvIG1hdGNoaW5nIHByb3RvY29scyBmb3IgcmVkdW5kYW5jeVxuICogLSBNZXJnZTogVHdvIG1hdGNoaW5nIG5vbi1TUlQgcHJvdG9jb2xzIGZvciBzdHJlYW0gbWVyZ2luZ1xuICogLSBNZWRpYUNvbm5lY3QgRmxvdzogSW5wdXQgZnJvbSBhbiBleGlzdGluZyBNZWRpYUNvbm5lY3QgRmxvd1xuICovXG5hYnN0cmFjdCBjbGFzcyBSb3V0ZXJJbnB1dEJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElSb3V0ZXJJbnB1dCB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSByb3V0ZXJJbnB1dEFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcm91dGVySW5wdXRJZDogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgaXBBZGRyZXNzOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB1cGRhdGVkQXQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBlbmRwb2ludHM6IFJvdXRlcklucHV0RW5kcG9pbnRbXTtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRyYW5zaXRFbmNyeXB0aW9uU2VjcmV0PzogSVNlY3JldDtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGdyYW50czogUm91dGVySW5wdXRHcmFudHM7XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIHRvIHRoaXMgUm91dGVyIElucHV0IHJlc291cmNlLlxuICAgKiBSZXF1aXJlZCBieSB0aGUgYXV0by1nZW5lcmF0ZWQgSVJvdXRlcklucHV0UmVmIGludGVyZmFjZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcm91dGVySW5wdXRSZWYoKTogUm91dGVySW5wdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiB7IHJvdXRlcklucHV0QXJuOiB0aGlzLnJvdXRlcklucHV0QXJuIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMgZm9yIHRoaXMgcm91dGVyIGlucHV0LlxuICAgKi9cbiAgcHVibGljIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIG5hbWVzcGFjZTogJ0FXUy9NZWRpYUNvbm5lY3QnLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIFJvdXRlcklucHV0QVJOOiB0aGlzLnJvdXRlcklucHV0QXJuLFxuICAgICAgICAuLi5wcm9wcz8uZGltZW5zaW9uc01hcCxcbiAgICAgIH0sXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgYml0cmF0ZSBvZiB0aGUgcm91dGVyIGlucHV0J3MgcGF5bG9hZC5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNCaXRyYXRlKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdSb3V0ZXJJbnB1dEJpdFJhdGUnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdhdmcnLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuQklUU19QRVJfU0VDT05ELFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciBwYWNrZXRzIGxvc3QgaW4gdHJhbnNpdCB0aGF0IHdlcmUgbm90IHJlY292ZXJlZCBieSBlcnJvciBjb3JyZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY05vdFJlY292ZXJlZFBhY2tldHMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ1JvdXRlcklucHV0Tm90UmVjb3ZlcmVkUGFja2V0cycsIHtcbiAgICAgIHN0YXRpc3RpYzogJ3N1bScsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkIGJ5IHRoZSByb3V0ZXIgaW5wdXQuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljVG90YWxQYWNrZXRzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdSb3V0ZXJJbnB1dFRvdGFsUGFja2V0cycsIHtcbiAgICAgIHN0YXRpc3RpYzogJ3N1bScsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHJvdXRlciBpbnB1dCBjb25uZWN0aW9uIHN0YXRlICgxIGNvbm5lY3RlZCwgMCBkaXNjb25uZWN0ZWQpLiBBcHBsaWVzIHRvIFNSVCBzb3VyY2VzIG9ubHkuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljQ29ubmVjdGVkKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdSb3V0ZXJJbnB1dENvbm5lY3RlZCcsIHtcbiAgICAgIHN0YXRpc3RpYzogJ21pbicsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5OT05FLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciBjb250aW51aXR5IGNvdW50ZXIgZXJyb3JzIGluIHRoZSB0cmFuc3BvcnQgc3RyZWFtLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY0NvbnRpbnVpdHlDb3VudGVyRXJyb3JzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdSb3V0ZXJJbnB1dENDRXJyb3JzJywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgcmVjb3ZlcnkgbGF0ZW5jeSBvZiB0aGUgaW5wdXQgc3RyZWFtLiBBcHBsaWVzIHRvIFJJU1QsIFNSVCwgYW5kIFJUUC1GRUMuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljTGF0ZW5jeShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnUm91dGVySW5wdXRMYXRlbmN5Jywge1xuICAgICAgc3RhdGlzdGljOiAnYXZnJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0Lk1JTExJU0VDT05EUyxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgcm91dGVyIGlucHV0IGhhcyBzd2l0Y2hlZCBzb3VyY2VzIGluIEZhaWxvdmVyIG1vZGUuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljRmFpbG92ZXJTd2l0Y2hlcyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnUm91dGVySW5wdXRGYWlsb3ZlclN3aXRjaGVzJywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGFuIEFXUyBFbGVtZW50YWwgTWVkaWFDb25uZWN0IFJvdXRlciBJbnB1dC5cbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIFJvdXRlcklucHV0IGV4dGVuZHMgUm91dGVySW5wdXRCYXNlIGltcGxlbWVudHMgSVJvdXRlcklucHV0IHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtbWVkaWFjb25uZWN0LWFscGhhLlJvdXRlcklucHV0JztcblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIFJvdXRlciBJbnB1dCBmcm9tIGl0cyBBUk4uXG4gICAqXG4gICAqIFVzZSBgZnJvbVJvdXRlcklucHV0QXR0cmlidXRlcygpYCBpbnN0ZWFkIGlmIHlvdSBuZWVkIHRvIGV4cG9zZSBgcm91dGVySW5wdXRJZGBcbiAgICogb3IgYGlwQWRkcmVzc2Agb24gdGhlIGltcG9ydGVkIGNvbnN0cnVjdC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0IGlkXG4gICAqIEBwYXJhbSByb3V0ZXJJbnB1dEFybiBUaGUgQVJOIG9mIHRoZSBSb3V0ZXIgSW5wdXRcbiAgICogQHJldHVybnMgQSBSb3V0ZXIgSW5wdXQgY29uc3RydWN0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Sb3V0ZXJJbnB1dEFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCByb3V0ZXJJbnB1dEFybjogc3RyaW5nKTogSVJvdXRlcklucHV0IHtcbiAgICByZXR1cm4gUm91dGVySW5wdXQuZnJvbVJvdXRlcklucHV0QXR0cmlidXRlcyhzY29wZSwgaWQsIHsgcm91dGVySW5wdXRBcm4gfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIFJvdXRlciBJbnB1dCBmcm9tIGl0cyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBQcm92aWRlIGByb3V0ZXJJbnB1dElkYCBhbmQvb3IgYGlwQWRkcmVzc2Agd2hlbiBpbXBvcnRpbmcgYW4gaW5wdXQgdGhhdCB3YXMgZGVwbG95ZWRcbiAgICogZXh0ZXJuYWxseSDigJQgb3RoZXJ3aXNlIGFjY2Vzc2luZyB0aG9zZSBwcm9wZXJ0aWVzIG9uIHRoZSBpbXBvcnRlZCBjb25zdHJ1Y3Qgd2lsbCB0aHJvdy5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0IGlkXG4gICAqIEBwYXJhbSBhdHRycyBUaGUgUm91dGVyIElucHV0IGF0dHJpYnV0ZXNcbiAgICogQHJldHVybnMgQSBSb3V0ZXIgSW5wdXQgY29uc3RydWN0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Sb3V0ZXJJbnB1dEF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFJvdXRlcklucHV0QXR0cmlidXRlcyk6IElSb3V0ZXJJbnB1dCB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUm91dGVySW5wdXRCYXNlIGltcGxlbWVudHMgSVJvdXRlcklucHV0IHtcbiAgICAgIHB1YmxpYyByZWFkb25seSByb3V0ZXJJbnB1dEFybiA9IGF0dHJzLnJvdXRlcklucHV0QXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSB1cGRhdGVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdHJhbnNpdEVuY3J5cHRpb25TZWNyZXQgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRzID0gUm91dGVySW5wdXRHcmFudHMuZnJvbVJvdXRlcklucHV0KHRoaXMpO1xuXG4gICAgICBwdWJsaWMgZ2V0IGVuZHBvaW50cygpOiBSb3V0ZXJJbnB1dEVuZHBvaW50W10ge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBSb3V0ZXJJbnB1dEVuZHBvaW50c05vdEF2YWlsYWJsZUltcG9ydGVkYCxcbiAgICAgICAgICBgJ2VuZHBvaW50cycgaXMgbm90IGF2YWlsYWJsZSBvbiBpbXBvcnRlZCBSb3V0ZXJJbnB1dCAke3RoaXMubm9kZS5wYXRofTsgb25seSBSb3V0ZXJJbnB1dHMgY29uc3RydWN0ZWQgaW4gdGhpcyBhcHAgZm9yIGxpc3RlbmluZyBwcm90b2NvbCB2YXJpYW50cyAoUlRQLCBSSVNULCBTUlQgbGlzdGVuZXIsIGluY2x1ZGluZyBmYWlsb3ZlciBhbmQgbWVyZ2UpIGV4cG9zZSBpbmdlc3QgZW5kcG9pbnRzYCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgZ2V0IHJvdXRlcklucHV0SWQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGF0dHJzLnJvdXRlcklucHV0SWQpIHJldHVybiBhdHRycy5yb3V0ZXJJbnB1dElkO1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBSb3V0ZXJJbnB1dElkTm90UHJvdmlkZWRgLFxuICAgICAgICAgIGAncm91dGVySW5wdXRJZCcgaXMgbm90IGF2YWlsYWJsZSBvbiBpbXBvcnRlZCBSb3V0ZXJJbnB1dCAke3RoaXMubm9kZS5wYXRofTsgcGFzcyBpdCB2aWEgZnJvbVJvdXRlcklucHV0QXR0cmlidXRlc2AsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIGdldCBpcEFkZHJlc3MoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGF0dHJzLmlwQWRkcmVzcykgcmV0dXJuIGF0dHJzLmlwQWRkcmVzcztcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgUm91dGVySW5wdXRJcEFkZHJlc3NOb3RQcm92aWRlZGAsXG4gICAgICAgICAgYCdpcEFkZHJlc3MnIGlzIG5vdCBhdmFpbGFibGUgb24gaW1wb3J0ZWQgUm91dGVySW5wdXQgJHt0aGlzLm5vZGUucGF0aH07IHBhc3MgaXQgdmlhIGZyb21Sb3V0ZXJJbnB1dEF0dHJpYnV0ZXNgLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbWF4aW11bSBiaXRyYXRlIGluIE1icHMgZm9yIGEga25vd24gdGllciwgb3IgdW5kZWZpbmVkIGZvciBjdXN0b20gdGllcnMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyB0aWVyTGltaXRNYnBzKHRpZXI6IFJvdXRlcklucHV0VGllcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRpZXIudmFsdWUgPT09IFJvdXRlcklucHV0VGllci5JTlBVVF8yMC52YWx1ZSkgcmV0dXJuIDIwO1xuICAgIGlmICh0aWVyLnZhbHVlID09PSBSb3V0ZXJJbnB1dFRpZXIuSU5QVVRfNTAudmFsdWUpIHJldHVybiA1MDtcbiAgICBpZiAodGllci52YWx1ZSA9PT0gUm91dGVySW5wdXRUaWVyLklOUFVUXzEwMC52YWx1ZSkgcmV0dXJuIDEwMDtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHJvdXRlcklucHV0QXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByb3V0ZXJJbnB1dElkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBpcEFkZHJlc3M6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdD86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHVwZGF0ZWRBdD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBfZW5kcG9pbnRzOiBSb3V0ZXJJbnB1dEVuZHBvaW50W10gfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSB0cmFuc2l0RW5jcnlwdGlvblNlY3JldD86IElTZWNyZXQ7XG4gIHB1YmxpYyByZWFkb25seSBncmFudHM6IFJvdXRlcklucHV0R3JhbnRzO1xuXG4gIHB1YmxpYyBnZXQgZW5kcG9pbnRzKCk6IFJvdXRlcklucHV0RW5kcG9pbnRbXSB7XG4gICAgaWYgKHRoaXMuX2VuZHBvaW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgUm91dGVySW5wdXRFbmRwb2ludHNOb3RBdmFpbGFibGVDb25maWdgLFxuICAgICAgICBgJ2VuZHBvaW50cycgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIFJvdXRlcklucHV0ICR7dGhpcy5ub2RlLnBhdGh9OyBvbmx5IGxpc3RlbmluZyBwcm90b2NvbCB2YXJpYW50cyAoUlRQLCBSSVNULCBTUlQgbGlzdGVuZXIg4oCUIGluY2x1ZGluZyBmYWlsb3ZlciBhbmQgbWVyZ2UgYnVpbHQgZnJvbSB0aG9zZSkgZXhwb3NlIGluZ2VzdCBlbmRwb2ludHMg4oCUIFNSVCBjYWxsZXIsIE1lZGlhQ29ubmVjdCBGbG93LCBhbmQgTWVkaWFMaXZlIENoYW5uZWwgaW5wdXRzIGRvIG5vdGAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZW5kcG9pbnRzO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJvdXRlcklucHV0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMucm91dGVySW5wdXROYW1lID8/IExhenkuc3RyaW5nKHsgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiAxMjggfSkgfSksXG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSByb3V0ZXIgaW5wdXQgbmFtZSBpZiBwcm92aWRlZFxuICAgIGlmIChwcm9wcy5yb3V0ZXJJbnB1dE5hbWUgIT0gbnVsbCAmJiBwcm9wcy5yb3V0ZXJJbnB1dE5hbWUgIT09ICcnICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMucm91dGVySW5wdXROYW1lKSkge1xuICAgICAgaWYgKHByb3BzLnJvdXRlcklucHV0TmFtZS5sZW5ndGggPiAxMjgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgUm91dGVySW5wdXROYW1lTGVuZ3RoYCwgYFJvdXRlciBpbnB1dCBuYW1lIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMjggY2hhcmFjdGVycywgZ290ICR7cHJvcHMucm91dGVySW5wdXROYW1lLmxlbmd0aH1gLCB0aGlzKTtcbiAgICAgIH1cbiAgICAgIGlmICghL15bYS16QS1aMC05LV0rJC8udGVzdChwcm9wcy5yb3V0ZXJJbnB1dE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YFJvdXRlcklucHV0TmFtZUZvcm1hdGAsIGBSb3V0ZXIgaW5wdXQgbmFtZSBtdXN0IGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgaHlwaGVucywgZ290ICcke3Byb3BzLnJvdXRlcklucHV0TmFtZX0nYCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWF4aW11bSBiaXRyYXRlXG4gICAgaWYgKCFwcm9wcy5tYXhpbXVtQml0cmF0ZS5pc1VucmVzb2x2ZWQoKSAmJiBwcm9wcy5tYXhpbXVtQml0cmF0ZS50b0JwcygpIDwgMTAwMDAwMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgUm91dGVySW5wdXRNaW5CaXRyYXRlYCwgYE1heGltdW0gYml0cmF0ZSBtdXN0IGJlIGF0IGxlYXN0IDEsMDAwLDAwMCBiaXRzL3MgKDEgTWJwcyksIGdvdCAke3Byb3BzLm1heGltdW1CaXRyYXRlLnRvQnBzKCl9YCwgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYml0cmF0ZSBkb2VzIG5vdCBleGNlZWQgdGllciBsaW1pdFxuICAgIGNvbnN0IHJlc29sdmVkVGllciA9IHByb3BzLnRpZXIgPz8gUm91dGVySW5wdXRUaWVyLklOUFVUXzIwO1xuICAgIGNvbnN0IHRpZXJNYnBzID0gUm91dGVySW5wdXQudGllckxpbWl0TWJwcyhyZXNvbHZlZFRpZXIpO1xuICAgIGlmIChleGNlZWRzUm91dGVyVGllckJpdHJhdGUodGllck1icHMsIHByb3BzLm1heGltdW1CaXRyYXRlKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgUm91dGVySW5wdXRCaXRyYXRlRXhjZWVkc1RpZXJgLCBgTWF4aW11bSBiaXRyYXRlICR7cHJvcHMubWF4aW11bUJpdHJhdGUudG9CcHMoKSAvIDFfMDAwXzAwMH0gTWJwcyBleGNlZWRzIHRoZSAke3Jlc29sdmVkVGllci52YWx1ZX0gdGllciBsaW1pdCBvZiAke3RpZXJNYnBzfSBNYnBzYCwgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWFpbnRlbmFuY2UgdGltZSBmb3JtYXRcbiAgICBpZiAocHJvcHMubWFpbnRlbmFuY2VDb25maWd1cmF0aW9uKSB7XG4gICAgICB2YWxpZGF0ZU1haW50ZW5hbmNlVGltZShwcm9wcy5tYWludGVuYW5jZUNvbmZpZ3VyYXRpb24udGltZSk7XG4gICAgfVxuXG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHRoaXMpO1xuICAgIGNvbnN0IHRhcmdldFJlZ2lvbiA9IHByb3BzLnJlZ2lvbk5hbWUgPz8gc3RhY2sucmVnaW9uO1xuXG4gICAgLy8gV2lsZGNhcmQgdGhlIGlkIOKAlCBwaW5uaW5nIHRoZSBsaXZlIEFSTiAoYXR0ckFybikgd291bGQgY3JlYXRlIGEgcm9sZSDihpIgcm91dGVyLWlucHV0IOKGkiByb2xlIGN5Y2xlLlxuICAgIGNvbnN0IHJvdXRlcklucHV0QXJuID0gc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdtZWRpYWNvbm5lY3QnLFxuICAgICAgcmVnaW9uOiB0YXJnZXRSZWdpb24sXG4gICAgICByZXNvdXJjZTogJ3JvdXRlcklucHV0JyxcbiAgICAgIHJlc291cmNlTmFtZTogJyonLFxuICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmZpZ0JpbmQgPSBwcm9wcy5jb25maWd1cmF0aW9uLl9iaW5kKHRoaXMsIHJvdXRlcklucHV0QXJuKTtcblxuICAgIC8vIFZhbGlkYXRlIEFaIG1hdGNoZXMgcmVnaW9uIGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZ0JpbmQuYXZhaWxhYmlsaXR5Wm9uZSAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKGNvbmZpZ0JpbmQuYXZhaWxhYmlsaXR5Wm9uZSkgJiYgIVRva2VuLmlzVW5yZXNvbHZlZCh0YXJnZXRSZWdpb24pXG4gICAgICAmJiAhY29uZmlnQmluZC5hdmFpbGFiaWxpdHlab25lLnN0YXJ0c1dpdGgodGFyZ2V0UmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgUm91dGVySW5wdXRBelJlZ2lvbk1pc21hdGNoYCwgYEF2YWlsYWJpbGl0eSB6b25lICcke2NvbmZpZ0JpbmQuYXZhaWxhYmlsaXR5Wm9uZX0nIG11c3QgYmUgd2l0aGluIHJlZ2lvbiAnJHt0YXJnZXRSZWdpb259J2AsIHRoaXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zaXQgPSByZXNvbHZlVHJhbnNpdEVuY3J5cHRpb24odGhpcywgJ1RyYW5zaXRFbmNyeXB0aW9uUm9sZScsIHByb3BzLnRyYW5zaXRFbmNyeXB0aW9uLCByb3V0ZXJJbnB1dEFybik7XG5cbiAgICBjb25zdCByb3V0ZXJpbnB1dCA9IG5ldyBDZm5Sb3V0ZXJJbnB1dCh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIG1heGltdW1CaXRyYXRlOiBwcm9wcy5tYXhpbXVtQml0cmF0ZS50b0JwcygpLFxuICAgICAgdGllcjogKHByb3BzLnRpZXIgPz8gUm91dGVySW5wdXRUaWVyLklOUFVUXzIwKS52YWx1ZSxcbiAgICAgIHJvdXRpbmdTY29wZTogcHJvcHMucm91dGluZ1Njb3BlLnZhbHVlLFxuICAgICAgbWFpbnRlbmFuY2VDb25maWd1cmF0aW9uOiBwcm9wcy5tYWludGVuYW5jZUNvbmZpZ3VyYXRpb24gPyB7XG4gICAgICAgIHByZWZlcnJlZERheVRpbWU6IHByb3BzLm1haW50ZW5hbmNlQ29uZmlndXJhdGlvbixcbiAgICAgIH0gOiB7XG4gICAgICAgIGRlZmF1bHQ6IHt9LFxuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZ0JpbmQuY29uZmlnLFxuICAgICAgdHJhbnNpdEVuY3J5cHRpb246IHRyYW5zaXQuY29uZmlnLFxuICAgICAgcmVnaW9uTmFtZTogdGFyZ2V0UmVnaW9uLFxuICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogY29uZmlnQmluZC5hdmFpbGFiaWxpdHlab25lLFxuICAgICAgdGFnczogcHJvcHMudGFncyA/IHJlbmRlclRhZ3MocHJvcHMudGFncykgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnJvdXRlcklucHV0QXJuID0gcm91dGVyaW5wdXQuYXR0ckFybjtcbiAgICB0aGlzLnJvdXRlcklucHV0SWQgPSByb3V0ZXJpbnB1dC5hdHRySWQ7XG4gICAgdGhpcy5pcEFkZHJlc3MgPSByb3V0ZXJpbnB1dC5hdHRySXBBZGRyZXNzO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gcm91dGVyaW5wdXQuYXR0ckNyZWF0ZWRBdDtcbiAgICB0aGlzLnVwZGF0ZWRBdCA9IHJvdXRlcmlucHV0LmF0dHJVcGRhdGVkQXQ7XG5cbiAgICAvLyBXaXRob3V0IHRoaXMgdGhlIHJvdXRlciBpbnB1dCBjYW4gYmUgY3JlYXRlZCBiZWZvcmUgdGhlXG4gICAgLy8gcG9saWN5IGlzIGF0dGFjaGVkIChcImFjY2VzcyBkZW5pZWRcIiBhdCBjcmVhdGUgdGltZSkuIE9yZGVyaW5nIHRoZSBncmFudCBiZWZvcmUgdGhlXG4gICAgLy8gcm91dGVyIGlucHV0IHB1bGxzIHRoZSBwb2xpY3kgaW4gYXMgYSBkZXBlbmRlbmN5LlxuICAgIHRyYW5zaXQuZ3JhbnQ/LmFwcGx5QmVmb3JlKHJvdXRlcmlucHV0KTtcblxuICAgIC8vIENvbXB1dGUgaW5nZXN0IGVuZHBvaW50cyBmb3IgcHJvdG9jb2wtYmFzZWQgdmFyaWFudHNcbiAgICB0aGlzLl9lbmRwb2ludHMgPSBwcm9wcy5jb25maWd1cmF0aW9uLl9lbmRwb2ludHMocm91dGVyaW5wdXQuYXR0cklwQWRkcmVzcyk7XG5cbiAgICAvLyBTdG9yZSB0aGUgdHJhbnNpdCBlbmNyeXB0aW9uIHNlY3JldCBpZiBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgdGhpcy50cmFuc2l0RW5jcnlwdGlvblNlY3JldCA9IHByb3BzLnRyYW5zaXRFbmNyeXB0aW9uPy5zZWNyZXQ7XG4gICAgdGhpcy5ncmFudHMgPSBSb3V0ZXJJbnB1dEdyYW50cy5mcm9tUm91dGVySW5wdXQodGhpcyk7XG4gIH1cbn1cbiJdfQ==