@aws-cdk/aws-glue-alpha 2.266.0-alpha.0 → 2.267.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.
Files changed (41) hide show
  1. package/.jsii +487 -349
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +0 -58
  4. package/README.md +47 -29
  5. package/awslint.json +4 -0
  6. package/lib/catalog.js +3 -3
  7. package/lib/code.js +3 -3
  8. package/lib/connection.d.ts +41 -1
  9. package/lib/connection.js +48 -9
  10. package/lib/data-format.js +5 -5
  11. package/lib/data-quality-ruleset.js +3 -3
  12. package/lib/database.js +1 -1
  13. package/lib/external-table.js +1 -1
  14. package/lib/index.d.ts +0 -1
  15. package/lib/index.js +1 -2
  16. package/lib/jobs/job.js +2 -2
  17. package/lib/jobs/pyspark-etl-job.js +1 -1
  18. package/lib/jobs/pyspark-flex-etl-job.js +1 -1
  19. package/lib/jobs/pyspark-streaming-job.js +1 -1
  20. package/lib/jobs/python-shell-job.js +1 -1
  21. package/lib/jobs/ray-job.js +1 -1
  22. package/lib/jobs/scala-spark-etl-job.js +1 -1
  23. package/lib/jobs/scala-spark-flex-etl-job.js +1 -1
  24. package/lib/jobs/scala-spark-streaming-job.js +1 -1
  25. package/lib/jobs/spark-job.js +1 -1
  26. package/lib/partition-projection.d.ts +8 -8
  27. package/lib/partition-projection.js +49 -2
  28. package/lib/s3-table.d.ts +83 -40
  29. package/lib/s3-table.js +133 -85
  30. package/lib/schema.d.ts +26 -6
  31. package/lib/schema.js +74 -77
  32. package/lib/security-configuration.js +4 -4
  33. package/lib/storage-parameter.d.ts +14 -3
  34. package/lib/storage-parameter.js +16 -6
  35. package/lib/table-base.d.ts +1 -1
  36. package/lib/table-base.js +2 -2
  37. package/lib/triggers/trigger-options.js +1 -1
  38. package/lib/triggers/workflow.js +2 -2
  39. package/package.json +7 -7
  40. package/lib/table-deprecated.d.ts +0 -13
  41. package/lib/table-deprecated.js +0 -70
@@ -8,7 +8,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
8
8
  */
9
9
  class InputFormat {
10
10
  className;
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.InputFormat", version: "2.266.0-alpha.0" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.InputFormat", version: "2.267.0-alpha.0" };
12
12
  /**
13
13
  * InputFormat for Avro files.
14
14
  *
@@ -52,7 +52,7 @@ exports.InputFormat = InputFormat;
52
52
  */
53
53
  class OutputFormat {
54
54
  className;
55
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.OutputFormat", version: "2.266.0-alpha.0" };
55
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.OutputFormat", version: "2.267.0-alpha.0" };
56
56
  /**
57
57
  * Writes text data with a null key (value only).
58
58
  *
@@ -89,7 +89,7 @@ exports.OutputFormat = OutputFormat;
89
89
  */
90
90
  class SerializationLibrary {
91
91
  className;
92
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.SerializationLibrary", version: "2.266.0-alpha.0" };
92
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.SerializationLibrary", version: "2.267.0-alpha.0" };
93
93
  /**
94
94
  * @see https://svn.apache.org/repos/infra/websites/production/hive/content/javadocs/r3.1.3/api/org/apache/hadoop/hive/serde2/avro/AvroSerDe.html
95
95
  */
@@ -142,7 +142,7 @@ exports.SerializationLibrary = SerializationLibrary;
142
142
  */
143
143
  class ClassificationString {
144
144
  value;
145
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.ClassificationString", version: "2.266.0-alpha.0" };
145
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.ClassificationString", version: "2.267.0-alpha.0" };
146
146
  /**
147
147
  * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format.html#aws-glue-programming-etl-format-avro
148
148
  */
@@ -176,7 +176,7 @@ exports.ClassificationString = ClassificationString;
176
176
  * Defines the input/output formats and ser/de for a single DataFormat.
177
177
  */
178
178
  class DataFormat {
179
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.DataFormat", version: "2.266.0-alpha.0" };
179
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.DataFormat", version: "2.267.0-alpha.0" };
180
180
  /**
181
181
  * DataFormat for Apache Web Server Logs. Also works for CloudFront logs
182
182
  *
@@ -80,7 +80,7 @@ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
80
80
  * Properties of a DataQualityTargetTable.
81
81
  */
82
82
  class DataQualityTargetTable {
83
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.DataQualityTargetTable", version: "2.266.0-alpha.0" };
83
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.DataQualityTargetTable", version: "2.267.0-alpha.0" };
84
84
  /**
85
85
  * The database name of the target table.
86
86
  */
@@ -105,7 +105,7 @@ exports.DataQualityTargetTable = DataQualityTargetTable;
105
105
  */
106
106
  class Dqdl {
107
107
  dqdl;
108
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Dqdl", version: "2.266.0-alpha.0" };
108
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Dqdl", version: "2.267.0-alpha.0" };
109
109
  /**
110
110
  * Create a `Dqdl` from a raw DQDL string.
111
111
  *
@@ -151,7 +151,7 @@ let DataQualityRuleset = (() => {
151
151
  DataQualityRuleset = _classThis = _classDescriptor.value;
152
152
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
153
153
  }
154
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.DataQualityRuleset", version: "2.266.0-alpha.0" };
154
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.DataQualityRuleset", version: "2.267.0-alpha.0" };
155
155
  /** Uniquely identifies this class. */
156
156
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.DataQualityRuleset';
157
157
  static fromRulesetArn(scope, id, rulesetArn) {
package/lib/database.js CHANGED
@@ -70,7 +70,7 @@ let Database = (() => {
70
70
  Database = _classThis = _classDescriptor.value;
71
71
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
72
72
  }
73
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Database", version: "2.266.0-alpha.0" };
73
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Database", version: "2.267.0-alpha.0" };
74
74
  /** Uniquely identifies this class. */
75
75
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.Database';
76
76
  static fromDatabaseArn(scope, id, databaseArn) {
@@ -77,7 +77,7 @@ let ExternalTable = (() => {
77
77
  ExternalTable = _classThis = _classDescriptor.value;
78
78
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
79
79
  }
80
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.ExternalTable", version: "2.266.0-alpha.0" };
80
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.ExternalTable", version: "2.267.0-alpha.0" };
81
81
  /** Uniquely identifies this class. */
82
82
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.ExternalTable';
83
83
  /**
package/lib/index.d.ts CHANGED
@@ -22,6 +22,5 @@ export * from './jobs/scala-spark-etl-job';
22
22
  export * from './jobs/scala-spark-flex-etl-job';
23
23
  export * from './jobs/scala-spark-streaming-job';
24
24
  export * from './table-base';
25
- export * from './table-deprecated';
26
25
  export * from './triggers/workflow';
27
26
  export * from './triggers/trigger-options';
package/lib/index.js CHANGED
@@ -39,7 +39,6 @@ __exportStar(require("./jobs/scala-spark-etl-job"), exports);
39
39
  __exportStar(require("./jobs/scala-spark-flex-etl-job"), exports);
40
40
  __exportStar(require("./jobs/scala-spark-streaming-job"), exports);
41
41
  __exportStar(require("./table-base"), exports);
42
- __exportStar(require("./table-deprecated"), exports);
43
42
  __exportStar(require("./triggers/workflow"), exports);
44
43
  __exportStar(require("./triggers/trigger-options"), exports);
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsc0NBQXNDOzs7Ozs7Ozs7Ozs7Ozs7O0FBRXRDLDRDQUEwQjtBQUMxQix5Q0FBdUI7QUFDdkIsK0NBQTZCO0FBQzdCLGdEQUE4QjtBQUM5Qix5REFBdUM7QUFDdkMsNkNBQTJCO0FBQzNCLG1EQUFpQztBQUNqQyx5REFBdUM7QUFDdkMsNkNBQTJCO0FBQzNCLDJDQUF5QjtBQUN6QiwyREFBeUM7QUFDekMsc0RBQW9DO0FBQ3BDLDhDQUE0QjtBQUM1Qiw2Q0FBMkI7QUFDM0IsbURBQWlDO0FBQ2pDLHlEQUF1QztBQUN2Qyw4REFBNEM7QUFDNUMsK0RBQTZDO0FBQzdDLDBEQUF3QztBQUN4QyxpREFBK0I7QUFDL0IsNkRBQTJDO0FBQzNDLGtFQUFnRDtBQUNoRCxtRUFBaUQ7QUFDakQsK0NBQTZCO0FBQzdCLHFEQUFtQztBQUNuQyxzREFBb0M7QUFDcEMsNkRBQTJDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQVdTOjpHbHVlIENsb3VkRm9ybWF0aW9uIFJlc291cmNlczpcblxuZXhwb3J0ICogZnJvbSAnLi9jYXRhbG9nJztcbmV4cG9ydCAqIGZyb20gJy4vY29kZSc7XG5leHBvcnQgKiBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhLWZvcm1hdCc7XG5leHBvcnQgKiBmcm9tICcuL2RhdGEtcXVhbGl0eS1ydWxlc2V0JztcbmV4cG9ydCAqIGZyb20gJy4vZGF0YWJhc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRlcm5hbC10YWJsZSc7XG5leHBvcnQgKiBmcm9tICcuL3BhcnRpdGlvbi1wcm9qZWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vczMtdGFibGUnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2hlbWEnO1xuZXhwb3J0ICogZnJvbSAnLi9zZWN1cml0eS1jb25maWd1cmF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZS1wYXJhbWV0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9qb2JzL2pvYic7XG5leHBvcnQgKiBmcm9tICcuL2pvYnMvc3Bhcmstam9iJztcbmV4cG9ydCAqIGZyb20gJy4vam9icy9weXNwYXJrLWV0bC1qb2InO1xuZXhwb3J0ICogZnJvbSAnLi9qb2JzL3B5c3BhcmstZmxleC1ldGwtam9iJztcbmV4cG9ydCAqIGZyb20gJy4vam9icy9weXNwYXJrLXN0cmVhbWluZy1qb2InO1xuZXhwb3J0ICogZnJvbSAnLi9qb2JzL3B5dGhvbi1zaGVsbC1qb2InO1xuZXhwb3J0ICogZnJvbSAnLi9qb2JzL3JheS1qb2InO1xuZXhwb3J0ICogZnJvbSAnLi9qb2JzL3NjYWxhLXNwYXJrLWV0bC1qb2InO1xuZXhwb3J0ICogZnJvbSAnLi9qb2JzL3NjYWxhLXNwYXJrLWZsZXgtZXRsLWpvYic7XG5leHBvcnQgKiBmcm9tICcuL2pvYnMvc2NhbGEtc3Bhcmstc3RyZWFtaW5nLWpvYic7XG5leHBvcnQgKiBmcm9tICcuL3RhYmxlLWJhc2UnO1xuZXhwb3J0ICogZnJvbSAnLi90YWJsZS1kZXByZWNhdGVkJztcbmV4cG9ydCAqIGZyb20gJy4vdHJpZ2dlcnMvd29ya2Zsb3cnO1xuZXhwb3J0ICogZnJvbSAnLi90cmlnZ2Vycy90cmlnZ2VyLW9wdGlvbnMnO1xuIl19
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsc0NBQXNDOzs7Ozs7Ozs7Ozs7Ozs7O0FBRXRDLDRDQUEwQjtBQUMxQix5Q0FBdUI7QUFDdkIsK0NBQTZCO0FBQzdCLGdEQUE4QjtBQUM5Qix5REFBdUM7QUFDdkMsNkNBQTJCO0FBQzNCLG1EQUFpQztBQUNqQyx5REFBdUM7QUFDdkMsNkNBQTJCO0FBQzNCLDJDQUF5QjtBQUN6QiwyREFBeUM7QUFDekMsc0RBQW9DO0FBQ3BDLDhDQUE0QjtBQUM1Qiw2Q0FBMkI7QUFDM0IsbURBQWlDO0FBQ2pDLHlEQUF1QztBQUN2Qyw4REFBNEM7QUFDNUMsK0RBQTZDO0FBQzdDLDBEQUF3QztBQUN4QyxpREFBK0I7QUFDL0IsNkRBQTJDO0FBQzNDLGtFQUFnRDtBQUNoRCxtRUFBaUQ7QUFDakQsK0NBQTZCO0FBQzdCLHNEQUFvQztBQUNwQyw2REFBMkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBV1M6OkdsdWUgQ2xvdWRGb3JtYXRpb24gUmVzb3VyY2VzOlxuXG5leHBvcnQgKiBmcm9tICcuL2NhdGFsb2cnO1xuZXhwb3J0ICogZnJvbSAnLi9jb2RlJztcbmV4cG9ydCAqIGZyb20gJy4vY29ubmVjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2RhdGEtZm9ybWF0JztcbmV4cG9ydCAqIGZyb20gJy4vZGF0YS1xdWFsaXR5LXJ1bGVzZXQnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhYmFzZSc7XG5leHBvcnQgKiBmcm9tICcuL2V4dGVybmFsLXRhYmxlJztcbmV4cG9ydCAqIGZyb20gJy4vcGFydGl0aW9uLXByb2plY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9zMy10YWJsZSc7XG5leHBvcnQgKiBmcm9tICcuL3NjaGVtYSc7XG5leHBvcnQgKiBmcm9tICcuL3NlY3VyaXR5LWNvbmZpZ3VyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9zdG9yYWdlLXBhcmFtZXRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgKiBmcm9tICcuL2pvYnMvam9iJztcbmV4cG9ydCAqIGZyb20gJy4vam9icy9zcGFyay1qb2InO1xuZXhwb3J0ICogZnJvbSAnLi9qb2JzL3B5c3BhcmstZXRsLWpvYic7XG5leHBvcnQgKiBmcm9tICcuL2pvYnMvcHlzcGFyay1mbGV4LWV0bC1qb2InO1xuZXhwb3J0ICogZnJvbSAnLi9qb2JzL3B5c3Bhcmstc3RyZWFtaW5nLWpvYic7XG5leHBvcnQgKiBmcm9tICcuL2pvYnMvcHl0aG9uLXNoZWxsLWpvYic7XG5leHBvcnQgKiBmcm9tICcuL2pvYnMvcmF5LWpvYic7XG5leHBvcnQgKiBmcm9tICcuL2pvYnMvc2NhbGEtc3BhcmstZXRsLWpvYic7XG5leHBvcnQgKiBmcm9tICcuL2pvYnMvc2NhbGEtc3BhcmstZmxleC1ldGwtam9iJztcbmV4cG9ydCAqIGZyb20gJy4vam9icy9zY2FsYS1zcGFyay1zdHJlYW1pbmctam9iJztcbmV4cG9ydCAqIGZyb20gJy4vdGFibGUtYmFzZSc7XG5leHBvcnQgKiBmcm9tICcuL3RyaWdnZXJzL3dvcmtmbG93JztcbmV4cG9ydCAqIGZyb20gJy4vdHJpZ2dlcnMvdHJpZ2dlci1vcHRpb25zJztcbiJdfQ==
package/lib/jobs/job.js CHANGED
@@ -51,7 +51,7 @@ const secret_detection_1 = require("../private/secret-detection");
51
51
  * event-driven flow using the job.
52
52
  */
53
53
  class JobBase extends cdk.Resource {
54
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.JobBase", version: "2.266.0-alpha.0" };
54
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.JobBase", version: "2.267.0-alpha.0" };
55
55
  /**
56
56
  * Create a CloudWatch Event Rule for this Glue Job when it's in a given state
57
57
  *
@@ -210,7 +210,7 @@ exports.JobBase = JobBase;
210
210
  * @resource AWS::Glue::Job
211
211
  */
212
212
  class Job extends JobBase {
213
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Job", version: "2.266.0-alpha.0" };
213
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Job", version: "2.267.0-alpha.0" };
214
214
  /**
215
215
  * Identifies an existing Glue Job from a subset of attributes that can
216
216
  * be referenced from within another Stack or Construct.
@@ -78,7 +78,7 @@ let PySparkEtlJob = (() => {
78
78
  PySparkEtlJob = _classThis = _classDescriptor.value;
79
79
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
80
80
  }
81
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PySparkEtlJob", version: "2.266.0-alpha.0" };
81
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PySparkEtlJob", version: "2.267.0-alpha.0" };
82
82
  /** Uniquely identifies this class. */
83
83
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.PySparkEtlJob';
84
84
  resource = __runInitializers(this, _instanceExtraInitializers);
@@ -77,7 +77,7 @@ let PySparkFlexEtlJob = (() => {
77
77
  PySparkFlexEtlJob = _classThis = _classDescriptor.value;
78
78
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
79
79
  }
80
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PySparkFlexEtlJob", version: "2.266.0-alpha.0" };
80
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PySparkFlexEtlJob", version: "2.267.0-alpha.0" };
81
81
  /** Uniquely identifies this class. */
82
82
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.PySparkFlexEtlJob';
83
83
  resource = __runInitializers(this, _instanceExtraInitializers);
@@ -77,7 +77,7 @@ let PySparkStreamingJob = (() => {
77
77
  PySparkStreamingJob = _classThis = _classDescriptor.value;
78
78
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
79
79
  }
80
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PySparkStreamingJob", version: "2.266.0-alpha.0" };
80
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PySparkStreamingJob", version: "2.267.0-alpha.0" };
81
81
  /** Uniquely identifies this class. */
82
82
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.PySparkStreamingJob';
83
83
  resource = __runInitializers(this, _instanceExtraInitializers);
@@ -71,7 +71,7 @@ let PythonShellJob = (() => {
71
71
  PythonShellJob = _classThis = _classDescriptor.value;
72
72
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
73
73
  }
74
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PythonShellJob", version: "2.266.0-alpha.0" };
74
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PythonShellJob", version: "2.267.0-alpha.0" };
75
75
  /** Uniquely identifies this class. */
76
76
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.PythonShellJob';
77
77
  role = __runInitializers(this, _instanceExtraInitializers);
@@ -76,7 +76,7 @@ let RayJob = (() => {
76
76
  RayJob = _classThis = _classDescriptor.value;
77
77
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
78
78
  }
79
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.RayJob", version: "2.266.0-alpha.0" };
79
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.RayJob", version: "2.267.0-alpha.0" };
80
80
  /** Uniquely identifies this class. */
81
81
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.RayJob';
82
82
  role = __runInitializers(this, _instanceExtraInitializers);
@@ -76,7 +76,7 @@ let ScalaSparkEtlJob = (() => {
76
76
  ScalaSparkEtlJob = _classThis = _classDescriptor.value;
77
77
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
78
78
  }
79
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.ScalaSparkEtlJob", version: "2.266.0-alpha.0" };
79
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.ScalaSparkEtlJob", version: "2.267.0-alpha.0" };
80
80
  /** Uniquely identifies this class. */
81
81
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.ScalaSparkEtlJob';
82
82
  resource = __runInitializers(this, _instanceExtraInitializers);
@@ -76,7 +76,7 @@ let ScalaSparkFlexEtlJob = (() => {
76
76
  ScalaSparkFlexEtlJob = _classThis = _classDescriptor.value;
77
77
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
78
78
  }
79
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.ScalaSparkFlexEtlJob", version: "2.266.0-alpha.0" };
79
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.ScalaSparkFlexEtlJob", version: "2.267.0-alpha.0" };
80
80
  /** Uniquely identifies this class. */
81
81
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.ScalaSparkFlexEtlJob';
82
82
  resource = __runInitializers(this, _instanceExtraInitializers);
@@ -76,7 +76,7 @@ let ScalaSparkStreamingJob = (() => {
76
76
  ScalaSparkStreamingJob = _classThis = _classDescriptor.value;
77
77
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
78
78
  }
79
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.ScalaSparkStreamingJob", version: "2.266.0-alpha.0" };
79
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.ScalaSparkStreamingJob", version: "2.267.0-alpha.0" };
80
80
  /** Uniquely identifies this class. */
81
81
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.ScalaSparkStreamingJob';
82
82
  resource = __runInitializers(this, _instanceExtraInitializers);
@@ -46,7 +46,7 @@ const job_1 = require("./job");
46
46
  * Base class for different types of Spark Jobs.
47
47
  */
48
48
  class SparkJob extends job_1.Job {
49
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.SparkJob", version: "2.266.0-alpha.0" };
49
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.SparkJob", version: "2.267.0-alpha.0" };
50
50
  role;
51
51
  grantPrincipal;
52
52
  /**
@@ -122,21 +122,21 @@ export interface DatePartitionProjectionConfigurationProps {
122
122
  /**
123
123
  * Interval between partition values.
124
124
  *
125
- * When the provided dates are at single-day or single-month precision,
126
- * the interval is optional and defaults to 1 day or 1 month, respectively.
127
- * Otherwise, interval is required.
125
+ * Required (together with `intervalUnit`) when `format` carries sub-day
126
+ * precision — i.e. a field finer than a day, such as hours or AM/PM. At day
127
+ * or coarser precision Athena defaults the step, so it is optional.
128
128
  *
129
- * @default - 1 for single-day or single-month precision, otherwise required
129
+ * @default - Athena's default step for the format's precision; required when `format` is sub-day precision
130
130
  */
131
131
  readonly interval?: number;
132
132
  /**
133
133
  * Unit for the interval.
134
134
  *
135
- * When the provided dates are at single-day or single-month precision,
136
- * the intervalUnit is optional and defaults to 1 day or 1 month, respectively.
137
- * Otherwise, the intervalUnit is required.
135
+ * Required (together with `interval`) when `format` carries sub-day
136
+ * precision — i.e. a field finer than a day, such as hours or AM/PM. At day
137
+ * or coarser precision Athena defaults the step, so it is optional.
138
138
  *
139
- * @default - DAYS for single-day precision, MONTHS for single-month precision, otherwise required
139
+ * @default - Athena's default unit for the format's precision; required when `format` is sub-day precision
140
140
  */
141
141
  readonly intervalUnit?: DateIntervalUnit;
142
142
  }
@@ -68,11 +68,50 @@ var DateIntervalUnit;
68
68
  */
69
69
  DateIntervalUnit["SECONDS"] = "SECONDS";
70
70
  })(DateIntervalUnit || (exports.DateIntervalUnit = DateIntervalUnit = {}));
71
+ /**
72
+ * Whether a DATE projection `format` carries sub-day precision, in which case
73
+ * Athena requires both `interval` and `intervalUnit`.
74
+ *
75
+ * Athena only requires the two when the format contains a field finer than a
76
+ * day (hour/minute/second/fraction, or AM/PM). At day, month, or coarser
77
+ * precision it defaults the step and accepts the format without them — so, e.g.
78
+ * a plain `yyyy` needs no interval.
79
+ *
80
+ * @see https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html#partition-projection-date-type
81
+ */
82
+ function dateFormatRequiresInterval(format) {
83
+ // Collect the unquoted Java DateTimeFormatter pattern letters, honoring the
84
+ // same single-quote literal escaping as the format validation above.
85
+ const letters = new Set();
86
+ let inQuote = false;
87
+ for (let i = 0; i < format.length; i++) {
88
+ const ch = format[i];
89
+ if (ch === "'") {
90
+ if (i + 1 < format.length && format[i + 1] === "'") {
91
+ i++;
92
+ }
93
+ else {
94
+ inQuote = !inQuote;
95
+ }
96
+ }
97
+ else if (!inQuote && /[a-zA-Z]/.test(ch)) {
98
+ letters.add(ch);
99
+ }
100
+ }
101
+ // Sub-day fields — anything finer than a day. `a` (AM/PM-of-day) splits the
102
+ // day in two, so it counts alongside hour/minute/second/fraction/nano:
103
+ // a am/pm h clock-hour(1-12) K hour-of-am-pm(0-11) k clock-hour(1-24)
104
+ // H hour-of-day(0-23) m minute s second S fraction A milli-of-day
105
+ // n nano-of-second N nano-of-day
106
+ // Every coarser field (day, month, year, week, quarter, day-of-week) is
107
+ // accepted by Athena without an interval, so only the sub-day set requires it.
108
+ return [...'ahKkHmsSAnN'].some(c => letters.has(c));
109
+ }
71
110
  /**
72
111
  * Factory class for creating partition projection configurations.
73
112
  */
74
113
  class PartitionProjectionConfiguration {
75
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PartitionProjectionConfiguration", version: "2.266.0-alpha.0" };
114
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.PartitionProjectionConfiguration", version: "2.267.0-alpha.0" };
76
115
  /**
77
116
  * Create an INTEGER partition projection configuration.
78
117
  */
@@ -176,6 +215,14 @@ class PartitionProjectionConfiguration {
176
215
  (!Number.isInteger(props.interval) || props.interval <= 0)) {
177
216
  throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `DateIntervalInvalid`, `DATE partition projection interval must be a positive integer, but got ${props.interval}`);
178
217
  }
218
+ // For sub-day precision (a field finer than a day), Athena requires both
219
+ // `interval` and `intervalUnit`; at day or coarser precision it defaults
220
+ // them. Only enforce when the format is a resolved literal we can inspect.
221
+ if (!aws_cdk_lib_1.Token.isUnresolved(props.format) && dateFormatRequiresInterval(props.format)) {
222
+ if (props.interval === undefined || props.intervalUnit === undefined) {
223
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `DateIntervalRequired`, `DATE partition projection with format '${props.format}' has sub-day precision, so both 'interval' and 'intervalUnit' are required`);
224
+ }
225
+ }
179
226
  return new PartitionProjectionConfiguration({
180
227
  type: PartitionProjectionType.DATE,
181
228
  dateRange: [props.min, props.max],
@@ -337,4 +384,4 @@ exports.PartitionProjectionConfiguration = PartitionProjectionConfiguration;
337
384
  function generatePartitionProjectionParameters(columnName, config) {
338
385
  return config._renderParameters(columnName);
339
386
  }
340
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydGl0aW9uLXByb2plY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwYXJ0aXRpb24tcHJvamVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFtaUJBLHNGQUtDOzs7QUF4aUJELDZDQUE2RDtBQUM3RCw0RUFBNEQ7QUFFNUQ7Ozs7OztHQU1HO0FBQ0gsSUFBWSx1QkFvQlg7QUFwQkQsV0FBWSx1QkFBdUI7SUFDakM7O09BRUc7SUFDSCw4Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILHdDQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILHdDQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILGdEQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFwQlcsdUJBQXVCLHVDQUF2Qix1QkFBdUIsUUFvQmxDO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksZ0JBbUNYO0FBbkNELFdBQVksZ0JBQWdCO0lBQzFCOztPQUVHO0lBQ0gsbUNBQWUsQ0FBQTtJQUVmOztPQUVHO0lBQ0gscUNBQWlCLENBQUE7SUFFakI7O09BRUc7SUFDSCxtQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCxpQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxtQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCx1Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILHVDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFuQ1csZ0JBQWdCLGdDQUFoQixnQkFBZ0IsUUFtQzNCO0FBMEpEOztHQUVHO0FBQ0gsTUFBYSxnQ0FBZ0M7O0lBQzNDOztPQUVHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFtRDs7Ozs7Ozs7OztRQUN2RSxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JFLElBQUksQ0FBQyxNQUFNLENB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LENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRSxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDdEMsd0NBQXdDO2dCQUN4QyxNQUFNO1lBQ1IsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ1Isa0NBQWtDO2dCQUNsQyxNQUFNLGVBQWUsR0FBVSxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUN6QyxNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSx1QkFBdUIsRUFDMUIsMENBQTBDLFVBQVUsTUFBTSxlQUFlLEVBQUUsQ0FDNUUsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7S0FDZjs7QUExU0gsNEVBMlNDO0FBWUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IscUNBQXFDLENBQ25ELFVBQWtCLEVBQ2xCLE1BQXdDO0lBRXhDLE9BQU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUb2tlbiwgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBsaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcblxuLyoqXG4gKiBQYXJ0aXRpb24gcHJvamVjdGlvbiB0eXBlLlxuICpcbiAqIERldGVybWluZXMgaG93IEF0aGVuYSBwcm9qZWN0cyBwYXJ0aXRpb24gdmFsdWVzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvcGFydGl0aW9uLXByb2plY3Rpb24tc3VwcG9ydGVkLXR5cGVzLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gUGFydGl0aW9uUHJvamVjdGlvblR5cGUge1xuICAvKipcbiAgICogUHJvamVjdCBwYXJ0aXRpb24gdmFsdWVzIGFzIGludGVnZXJzIHdpdGhpbiBhIHJhbmdlLlxuICAgKi9cbiAgSU5URUdFUiA9ICdpbnRlZ2VyJyxcblxuICAvKipcbiAgICogUHJvamVjdCBwYXJ0aXRpb24gdmFsdWVzIGFzIGRhdGVzIHdpdGhpbiBhIHJhbmdlLlxuICAgKi9cbiAgREFURSA9ICdkYXRlJyxcblxuICAvKipcbiAgICogUHJvamVjdCBwYXJ0aXRpb24gdmFsdWVzIGZyb20gYW4gZXhwbGljaXQgbGlzdCBvZiB2YWx1ZXMuXG4gICAqL1xuICBFTlVNID0gJ2VudW0nLFxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgdGhhdCBhcmUgaW5qZWN0ZWQgYXQgcXVlcnkgdGltZS5cbiAgICovXG4gIElOSkVDVEVEID0gJ2luamVjdGVkJyxcbn1cblxuLyoqXG4gKiBEYXRlIGludGVydmFsIHVuaXQgZm9yIHBhcnRpdGlvbiBwcm9qZWN0aW9uLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvcGFydGl0aW9uLXByb2plY3Rpb24tc3VwcG9ydGVkLXR5cGVzLmh0bWwjcGFydGl0aW9uLXByb2plY3Rpb24tZGF0ZS10eXBlXG4gKi9cbmV4cG9ydCBlbnVtIERhdGVJbnRlcnZhbFVuaXQge1xuICAvKipcbiAgICogWWVhciBpbnRlcnZhbC5cbiAgICovXG4gIFlFQVJTID0gJ1lFQVJTJyxcblxuICAvKipcbiAgICogTW9udGggaW50ZXJ2YWwuXG4gICAqL1xuICBNT05USFMgPSAnTU9OVEhTJyxcblxuICAvKipcbiAgICogV2VlayBpbnRlcnZhbC5cbiAgICovXG4gIFdFRUtTID0gJ1dFRUtTJyxcblxuICAvKipcbiAgICogRGF5IGludGVydmFsIChkZWZhdWx0KS5cbiAgICovXG4gIERBWVMgPSAnREFZUycsXG5cbiAgLyoqXG4gICAqIEhvdXIgaW50ZXJ2YWwuXG4gICAqL1xuICBIT1VSUyA9ICdIT1VSUycsXG5cbiAgLyoqXG4gICAqIE1pbnV0ZSBpbnRlcnZhbC5cbiAgICovXG4gIE1JTlVURVMgPSAnTUlOVVRFUycsXG5cbiAgLyoqXG4gICAqIFNlY29uZCBpbnRlcnZhbC5cbiAgICovXG4gIFNFQ09ORFMgPSAnU0VDT05EUycsXG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgSU5URUdFUiBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVnZXJQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIE1pbmltdW0gdmFsdWUgZm9yIHRoZSBpbnRlZ2VyIHBhcnRpdGlvbiByYW5nZSAoaW5jbHVzaXZlKS5cbiAgICovXG4gIHJlYWRvbmx5IG1pbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHZhbHVlIGZvciB0aGUgaW50ZWdlciBwYXJ0aXRpb24gcmFuZ2UgKGluY2x1c2l2ZSkuXG4gICAqL1xuICByZWFkb25seSBtYXg6IG51bWJlcjtcblxuICAvKipcbiAgICogSW50ZXJ2YWwgYmV0d2VlbiBwYXJ0aXRpb24gdmFsdWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGRpZ2l0cyB0byBwYWQgdGhlIHBhcnRpdGlvbiB2YWx1ZSB3aXRoIGxlYWRpbmcgemVyb3MuXG4gICAqXG4gICAqIFdpdGggZGlnaXRzOiA0LCBwYXJ0aXRpb24gdmFsdWVzOiAwMDAxLCAwMDAyLCAuLi4sIDAxMDBcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBzdGF0aWMgbnVtYmVyIG9mIGRpZ2l0cyBhbmQgbm8gbGVhZGluZyB6ZXJvZXNcbiAgICovXG4gIHJlYWRvbmx5IGRpZ2l0cz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBEQVRFIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogU3RhcnQgZGF0ZSBmb3IgdGhlIHBhcnRpdGlvbiByYW5nZSAoaW5jbHVzaXZlKS5cbiAgICpcbiAgICogQ2FuIGJlIGVpdGhlcjpcbiAgICogLSBGaXhlZCBkYXRlIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IGBmb3JtYXRgIHByb3BlcnR5XG4gICAqICAgKGUuZy4sICcyMDIwLTAxLTAxJyBmb3IgZm9ybWF0ICd5eXl5LU1NLWRkJylcbiAgICogLSBSZWxhdGl2ZSBkYXRlIHVzaW5nIE5PVyBzeW50YXhcbiAgICogICAoZS5nLiwgJ05PVycsICdOT1ctM1lFQVJTJywgJ05PVysxTU9OVEgnKVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL3BhcnRpdGlvbi1wcm9qZWN0aW9uLXN1cHBvcnRlZC10eXBlcy5odG1sI3BhcnRpdGlvbi1wcm9qZWN0aW9uLWRhdGUtdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgbWluOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVuZCBkYXRlIGZvciB0aGUgcGFydGl0aW9uIHJhbmdlIChpbmNsdXNpdmUpLlxuICAgKlxuICAgKiBDYW4gYmUgZWl0aGVyOlxuICAgKiAtIEZpeGVkIGRhdGUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgYGZvcm1hdGAgcHJvcGVydHlcbiAgICogLSBSZWxhdGl2ZSBkYXRlIHVzaW5nIE5PVyBzeW50YXhcbiAgICpcbiAgICogU2FtZSBmb3JtYXQgY29uc3RyYWludHMgYXMgYG1pbmAuXG4gICAqL1xuICByZWFkb25seSBtYXg6IHN0cmluZztcblxuICAvKipcbiAgICogRGF0ZSBmb3JtYXQgZm9yIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIFVzZXMgSmF2YSBTaW1wbGVEYXRlRm9ybWF0IHBhdHRlcm5zLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvdGV4dC9TaW1wbGVEYXRlRm9ybWF0Lmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbnRlcnZhbCBiZXR3ZWVuIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIFdoZW4gdGhlIHByb3ZpZGVkIGRhdGVzIGFyZSBhdCBzaW5nbGUtZGF5IG9yIHNpbmdsZS1tb250aCBwcmVjaXNpb24sXG4gICAqIHRoZSBpbnRlcnZhbCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gMSBkYXkgb3IgMSBtb250aCwgcmVzcGVjdGl2ZWx5LlxuICAgKiBPdGhlcndpc2UsIGludGVydmFsIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIDEgZm9yIHNpbmdsZS1kYXkgb3Igc2luZ2xlLW1vbnRoIHByZWNpc2lvbiwgb3RoZXJ3aXNlIHJlcXVpcmVkXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogVW5pdCBmb3IgdGhlIGludGVydmFsLlxuICAgKlxuICAgKiBXaGVuIHRoZSBwcm92aWRlZCBkYXRlcyBhcmUgYXQgc2luZ2xlLWRheSBvciBzaW5nbGUtbW9udGggcHJlY2lzaW9uLFxuICAgKiB0aGUgaW50ZXJ2YWxVbml0IGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAxIGRheSBvciAxIG1vbnRoLCByZXNwZWN0aXZlbHkuXG4gICAqIE90aGVyd2lzZSwgdGhlIGludGVydmFsVW5pdCBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBEQVlTIGZvciBzaW5nbGUtZGF5IHByZWNpc2lvbiwgTU9OVEhTIGZvciBzaW5nbGUtbW9udGggcHJlY2lzaW9uLCBvdGhlcndpc2UgcmVxdWlyZWRcbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsVW5pdD86IERhdGVJbnRlcnZhbFVuaXQ7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgRU5VTSBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudW1QYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIEV4cGxpY2l0IGxpc3Qgb2YgcGFydGl0aW9uIHZhbHVlcy5cbiAgICpcbiAgICogQGV4YW1wbGUgWyd1cy1lYXN0LTEnLCAndXMtd2VzdC0yJywgJ2V1LXdlc3QtMSddXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEludGVybmFsIHByb3BlcnRpZXMgZm9yIFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uLlxuICovXG5pbnRlcmZhY2UgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBwYXJ0aXRpb24gcHJvamVjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IFBhcnRpdGlvblByb2plY3Rpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBSYW5nZSBvZiBwYXJ0aXRpb24gdmFsdWVzIGZvciBJTlRFR0VSIHR5cGUuXG4gICAqXG4gICAqIEFycmF5IG9mIFttaW4sIG1heF0gYXMgbnVtYmVycy5cbiAgICovXG4gIHJlYWRvbmx5IGludGVnZXJSYW5nZT86IG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBSYW5nZSBvZiBwYXJ0aXRpb24gdmFsdWVzIGZvciBEQVRFIHR5cGUuXG4gICAqXG4gICAqIEFycmF5IG9mIFtzdGFydCwgZW5kXSBhcyBkYXRlIHN0cmluZ3MuXG4gICAqL1xuICByZWFkb25seSBkYXRlUmFuZ2U/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogSW50ZXJ2YWwgYmV0d2VlbiBwYXJ0aXRpb24gdmFsdWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBkaWdpdHMgdG8gcGFkIElOVEVHRVIgcGFydGl0aW9uIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IGRpZ2l0cz86IG51bWJlcjtcblxuICAvKipcbiAgICogRGF0ZSBmb3JtYXQgZm9yIERBVEUgcGFydGl0aW9uIHZhbHVlcyAoSmF2YSBTaW1wbGVEYXRlRm9ybWF0KS5cbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdD86IHN0cmluZztcblxuICAvKipcbiAgICogVW5pdCBmb3IgREFURSBwYXJ0aXRpb24gaW50ZXJ2YWwuXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbFVuaXQ/OiBEYXRlSW50ZXJ2YWxVbml0O1xuXG4gIC8qKlxuICAgKiBFeHBsaWNpdCBsaXN0IG9mIHZhbHVlcyBmb3IgRU5VTSBwYXJ0aXRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSU5URUdFUiBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpbnRlZ2VyKHByb3BzOiBJbnRlZ2VyUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyk6IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uIHtcbiAgICAvLyBWYWxpZGF0ZSBtaW4vbWF4IGFyZSBpbnRlZ2Vyc1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm1pbikgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5tYXgpKSB7XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocHJvcHMubWluKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihwcm9wcy5tYXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgSW50ZWdlclJhbmdlTm90SW50ZWdlcnNgLFxuICAgICAgICAgIGBJTlRFR0VSIHBhcnRpdGlvbiBwcm9qZWN0aW9uIHJhbmdlIG11c3QgY29udGFpbiBpbnRlZ2VycywgYnV0IGdvdCBbJHtwcm9wcy5taW59LCAke3Byb3BzLm1heH1dYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgbWluIDw9IG1heFxuICAgICAgaWYgKHByb3BzLm1pbiA+IHByb3BzLm1heCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEludGVnZXJSYW5nZU1pbkdyZWF0ZXJUaGFuTWF4YCxcbiAgICAgICAgICBgSU5URUdFUiBwYXJ0aXRpb24gcHJvamVjdGlvbiByYW5nZSBtdXN0IGJlIFttaW4sIG1heF0gd2hlcmUgbWluIDw9IG1heCwgYnV0IGdvdCBbJHtwcm9wcy5taW59LCAke3Byb3BzLm1heH1dYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBpbnRlcnZhbFxuICAgIGlmIChcbiAgICAgIHByb3BzLmludGVydmFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuaW50ZXJ2YWwpICYmXG4gICAgICAoIU51bWJlci5pc0ludGVnZXIocHJvcHMuaW50ZXJ2YWwpIHx8IHByb3BzLmludGVydmFsIDw9IDApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBJbnRlZ2VySW50ZXJ2YWxJbnZhbGlkYCxcbiAgICAgICAgYElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gaW50ZXJ2YWwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGJ1dCBnb3QgJHtwcm9wcy5pbnRlcnZhbH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBkaWdpdHNcbiAgICBpZiAoXG4gICAgICBwcm9wcy5kaWdpdHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5kaWdpdHMpICYmXG4gICAgICAoIU51bWJlci5pc0ludGVnZXIocHJvcHMuZGlnaXRzKSB8fCBwcm9wcy5kaWdpdHMgPCAxKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgSW50ZWdlckRpZ2l0c0ludmFsaWRgLFxuICAgICAgICBgSU5URUdFUiBwYXJ0aXRpb24gcHJvamVjdGlvbiBkaWdpdHMgbXVzdCBiZSBhbiBpbnRlZ2VyID49IDEsIGJ1dCBnb3QgJHtwcm9wcy5kaWdpdHN9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbih7XG4gICAgICB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5JTlRFR0VSLFxuICAgICAgaW50ZWdlclJhbmdlOiBbcHJvcHMubWluLCBwcm9wcy5tYXhdLFxuICAgICAgaW50ZXJ2YWw6IHByb3BzLmludGVydmFsLFxuICAgICAgZGlnaXRzOiBwcm9wcy5kaWdpdHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkYXRlKHByb3BzOiBEYXRlUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyk6IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uIHtcbiAgICAvLyBWYWxpZGF0ZSBtaW4vbWF4IGFyZSBub3QgZW1wdHlcbiAgICBpZiAoXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm1pbikgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMubWF4KSAmJlxuICAgICAgKHByb3BzLm1pbi50cmltKCkgPT09ICcnIHx8IHByb3BzLm1heC50cmltKCkgPT09ICcnKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgRGF0ZVJhbmdlRW1wdHlgLFxuICAgICAgICAnREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiByYW5nZSBtdXN0IG5vdCBjb250YWluIGVtcHR5IHN0cmluZ3MnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBmb3JtYXRcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5mb3JtYXQpKSB7XG4gICAgICAvLyBWYWxpZGF0ZSBmb3JtYXQgaXMgbm90IGVtcHR5XG4gICAgICBpZiAocHJvcHMuZm9ybWF0LnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBEYXRlRm9ybWF0RW1wdHlgLFxuICAgICAgICAgICdEQVRFIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGZvcm1hdCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGZvcm1hdCBwYXR0ZXJuIGNoYXJhY3RlcnMgKEphdmEgOCBEYXRlVGltZUZvcm1hdHRlcilcbiAgICAgIGNvbnN0IHZhbGlkUGF0dGVybkxldHRlcnMgPSAnR3l1WURNTGRRcXdXRWVjRmFoS2tIbXNTQW5OVnpPWHhacCc7XG4gICAgICBjb25zdCBmb3JtYXQgPSBwcm9wcy5mb3JtYXQ7XG4gICAgICBsZXQgaW5RdW90ZSA9IGZhbHNlO1xuICAgICAgY29uc3QgaW52YWxpZENoYXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1hdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaCA9IGZvcm1hdFtpXTtcbiAgICAgICAgaWYgKGNoID09PSBcIidcIikge1xuICAgICAgICAgIGlmIChpICsgMSA8IGZvcm1hdC5sZW5ndGggJiYgZm9ybWF0W2kgKyAxXSA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIC8vICcnIGlzIGFuIGVzY2FwZWQgc2luZ2xlIHF1b3RlIGxpdGVyYWwsIHNraXAgYm90aFxuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpblF1b3RlID0gIWluUXVvdGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFpblF1b3RlICYmIC9bYS16QS1aXS8udGVzdChjaCkpIHtcbiAgICAgICAgICBpZiAoIXZhbGlkUGF0dGVybkxldHRlcnMuaW5jbHVkZXMoY2gpKSB7XG4gICAgICAgICAgICBpbnZhbGlkQ2hhcnMucHVzaChjaCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpblF1b3RlKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgRGF0ZUZvcm1hdFVuY2xvc2VkUXVvdGVgLFxuICAgICAgICAgIGBEQVRFIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGZvcm1hdCBoYXMgYW4gdW5jbG9zZWQgc2luZ2xlIHF1b3RlOiAnJHtmb3JtYXR9J2AsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnZhbGlkQ2hhcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB1bmlxdWUgPSBbLi4ubmV3IFNldChpbnZhbGlkQ2hhcnMpXTtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBEYXRlRm9ybWF0SW52YWxpZENoYXJhY3RlcnNgLFxuICAgICAgICAgIGBEQVRFIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGZvcm1hdCBjb250YWlucyBpbnZhbGlkIHBhdHRlcm4gY2hhcmFjdGVyczogJHt1bmlxdWUuam9pbignLCAnKX0uIE11c3QgdXNlIEphdmEgRGF0ZVRpbWVGb3JtYXR0ZXIgdmFsaWQgcGF0dGVybiBsZXR0ZXJzLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW50ZXJ2YWxcbiAgICBpZiAoXG4gICAgICBwcm9wcy5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLmludGVydmFsKSAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLmludGVydmFsKSB8fCBwcm9wcy5pbnRlcnZhbCA8PSAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgRGF0ZUludGVydmFsSW52YWxpZGAsXG4gICAgICAgIGBEQVRFIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGludGVydmFsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgZ290ICR7cHJvcHMuaW50ZXJ2YWx9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbih7XG4gICAgICB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5EQVRFLFxuICAgICAgZGF0ZVJhbmdlOiBbcHJvcHMubWluLCBwcm9wcy5tYXhdLFxuICAgICAgaW50ZXJ2YWw6IHByb3BzLmludGVydmFsLFxuICAgICAgZm9ybWF0OiBwcm9wcy5mb3JtYXQsXG4gICAgICBpbnRlcnZhbFVuaXQ6IHByb3BzLmludGVydmFsVW5pdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gRU5VTSBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBlbnVtKHByb3BzOiBFbnVtUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyk6IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uIHtcbiAgICAvLyBWYWxpZGF0ZSB2YWx1ZXMgaXMgbm90IGVtcHR5XG4gICAgaWYgKHByb3BzLnZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEVudW1WYWx1ZXNFbXB0eWAsXG4gICAgICAgICdFTlVNIHBhcnRpdGlvbiBwcm9qZWN0aW9uIHZhbHVlcyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5JyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wcy52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcHJvcHMudmFsdWVzW2ldO1xuICAgICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQodmFsdWUpKSB7XG4gICAgICAgIGlmICh2YWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICAgbGl0YEVudW1WYWx1ZUVtcHR5YCxcbiAgICAgICAgICAgICdFTlVNIHBhcnRpdGlvbiBwcm9qZWN0aW9uIHZhbHVlcyBtdXN0IG5vdCBjb250YWluIGVtcHR5IHN0cmluZ3MnLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKCcsJykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBsaXRgRW51bVZhbHVlQ29udGFpbnNDb21tYWAsXG4gICAgICAgICAgICBgRU5VTSBwYXJ0aXRpb24gcHJvamVjdGlvbiB2YWx1ZXMgbXVzdCBub3QgY29udGFpbiBjb21tYXMgYmVjYXVzZSB0aGUgdmFsdWVzIGFyZSBzZXJpYWxpemVkIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QsIGdvdDogJyR7dmFsdWV9J2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24oe1xuICAgICAgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGUuRU5VTSxcbiAgICAgIHZhbHVlczogcHJvcHMudmFsdWVzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBJTkpFQ1RFRCBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBQYXJ0aXRpb24gdmFsdWVzIGFyZSBpbmplY3RlZCBhdCBxdWVyeSB0aW1lIHRocm91Z2ggdGhlIHF1ZXJ5IHN0YXRlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9wYXJ0aXRpb24tcHJvamVjdGlvbi1zdXBwb3J0ZWQtdHlwZXMuaHRtbCNwYXJ0aXRpb24tcHJvamVjdGlvbi1pbmplY3RlZC10eXBlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGluamVjdGVkKCk6IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uKHtcbiAgICAgIHR5cGU6IFBhcnRpdGlvblByb2plY3Rpb25UeXBlLklOSkVDVEVELFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHBhcnRpdGlvbiBwcm9qZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFBhcnRpdGlvblByb2plY3Rpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBSYW5nZSBvZiBwYXJ0aXRpb24gdmFsdWVzIGZvciBJTlRFR0VSIHR5cGUuXG4gICAqXG4gICAqIEFycmF5IG9mIFttaW4sIG1heF0gYXMgbnVtYmVycy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnRlZ2VyUmFuZ2U/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogUmFuZ2Ugb2YgcGFydGl0aW9uIHZhbHVlcyBmb3IgREFURSB0eXBlLlxuICAgKlxuICAgKiBBcnJheSBvZiBbc3RhcnQsIGVuZF0gYXMgZGF0ZSBzdHJpbmdzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhdGVSYW5nZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBJbnRlcnZhbCBiZXR3ZWVuIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBkaWdpdHMgdG8gcGFkIElOVEVHRVIgcGFydGl0aW9uIHZhbHVlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkaWdpdHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERhdGUgZm9ybWF0IGZvciBEQVRFIHBhcnRpdGlvbiB2YWx1ZXMgKEphdmEgU2ltcGxlRGF0ZUZvcm1hdCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZm9ybWF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVbml0IGZvciBEQVRFIHBhcnRpdGlvbiBpbnRlcnZhbC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnRlcnZhbFVuaXQ/OiBEYXRlSW50ZXJ2YWxVbml0O1xuXG4gIC8qKlxuICAgKiBFeHBsaWNpdCBsaXN0IG9mIHZhbHVlcyBmb3IgRU5VTSBwYXJ0aXRpb25zLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvcHM6IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpIHtcbiAgICB0aGlzLnR5cGUgPSBwcm9wcy50eXBlO1xuICAgIHRoaXMuaW50ZWdlclJhbmdlID0gcHJvcHMuaW50ZWdlclJhbmdlO1xuICAgIHRoaXMuZGF0ZVJhbmdlID0gcHJvcHMuZGF0ZVJhbmdlO1xuICAgIHRoaXMuaW50ZXJ2YWwgPSBwcm9wcy5pbnRlcnZhbDtcbiAgICB0aGlzLmRpZ2l0cyA9IHByb3BzLmRpZ2l0cztcbiAgICB0aGlzLmZvcm1hdCA9IHByb3BzLmZvcm1hdDtcbiAgICB0aGlzLmludGVydmFsVW5pdCA9IHByb3BzLmludGVydmFsVW5pdDtcbiAgICB0aGlzLnZhbHVlcyA9IHByb3BzLnZhbHVlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbk5hbWUgLSBUaGUgcGFydGl0aW9uIGNvbHVtbiBuYW1lXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9yZW5kZXJQYXJhbWV0ZXJzKGNvbHVtbk5hbWU6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIFtgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LnR5cGVgXTogdGhpcy50eXBlLFxuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5JTlRFR0VSOiB7XG4gICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB0aGlzLmludGVnZXJSYW5nZSE7XG4gICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LnJhbmdlYF0gPSBgJHttaW59LCR7bWF4fWA7XG4gICAgICAgIGlmICh0aGlzLmludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5pbnRlcnZhbGBdID0gdGhpcy5pbnRlcnZhbC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRpZ2l0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0uZGlnaXRzYF0gPSB0aGlzLmRpZ2l0cy50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5EQVRFOiB7XG4gICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMuZGF0ZVJhbmdlITtcbiAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0ucmFuZ2VgXSA9IGAke3N0YXJ0fSwke2VuZH1gO1xuICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5mb3JtYXRgXSA9IHRoaXMuZm9ybWF0ITtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LmludGVydmFsYF0gPSB0aGlzLmludGVydmFsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWxVbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5pbnRlcnZhbC51bml0YF0gPSB0aGlzLmludGVydmFsVW5pdDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgUGFydGl0aW9uUHJvamVjdGlvblR5cGUuRU5VTToge1xuICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS52YWx1ZXNgXSA9IHRoaXMudmFsdWVzIS5qb2luKCcsJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5JTkpFQ1RFRDoge1xuICAgICAgICAvLyBJTkpFQ1RFRCBoYXMgbm8gYWRkaXRpb25hbCBwYXJhbWV0ZXJzXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBUeXBlU2NyaXB0IGV4aGF1c3RpdmVuZXNzIGNoZWNrXG4gICAgICAgIGNvbnN0IGV4aGF1c3RpdmVDaGVjazogbmV2ZXIgPSB0aGlzLnR5cGU7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgVW5rbm93blByb2plY3Rpb25UeXBlYCxcbiAgICAgICAgICBgVW5rbm93biBwYXJ0aXRpb24gcHJvamVjdGlvbiB0eXBlIGZvciBcIiR7Y29sdW1uTmFtZX1cIjogJHtleGhhdXN0aXZlQ2hlY2t9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG59XG5cbi8qKlxuICogUGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbiBmb3IgYSB0YWJsZS5cbiAqXG4gKiBNYXBzIHBhcnRpdGlvbiBjb2x1bW4gbmFtZXMgdG8gdGhlaXIgcHJvamVjdGlvbiBjb25maWd1cmF0aW9ucy5cbiAqIFRoZSBrZXkgaXMgdGhlIHBhcnRpdGlvbiBjb2x1bW4gbmFtZSwgdGhlIHZhbHVlIGlzIHRoZSBwYXJ0aXRpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgUGFydGl0aW9uUHJvamVjdGlvbiA9IHtcbiAgW2NvbHVtbk5hbWU6IHN0cmluZ106IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgQ2xvdWRGb3JtYXRpb24gcGFyYW1ldGVycyBmb3IgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gY29sdW1uTmFtZSAtIFRoZSBwYXJ0aXRpb24gY29sdW1uIG5hbWVcbiAqIEBwYXJhbSBjb25maWcgLSBUaGUgcGFydGl0aW9uIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvblBhcmFtZXRlcnMoXG4gIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgY29uZmlnOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbixcbik6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICByZXR1cm4gY29uZmlnLl9yZW5kZXJQYXJhbWV0ZXJzKGNvbHVtbk5hbWUpO1xufVxuIl19
387
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydGl0aW9uLXByb2plY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwYXJ0aXRpb24tcHJvamVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFzbEJBLHNGQUtDOzs7QUEzbEJELDZDQUE2RDtBQUM3RCw0RUFBNEQ7QUFFNUQ7Ozs7OztHQU1HO0FBQ0gsSUFBWSx1QkFvQlg7QUFwQkQsV0FBWSx1QkFBdUI7SUFDakM7O09BRUc7SUFDSCw4Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILHdDQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILHdDQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILGdEQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFwQlcsdUJBQXVCLHVDQUF2Qix1QkFBdUIsUUFvQmxDO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksZ0JBbUNYO0FBbkNELFdBQVksZ0JBQWdCO0lBQzFCOztPQUVHO0lBQ0gsbUNBQWUsQ0FBQTtJQUVmOztPQUVHO0lBQ0gscUNBQWlCLENBQUE7SUFFakI7O09BRUc7SUFDSCxtQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCxpQ0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxtQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCx1Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILHVDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFuQ1csZ0JBQWdCLGdDQUFoQixnQkFBZ0IsUUFtQzNCO0FBMEpEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLDBCQUEwQixDQUFDLE1BQWM7SUFDaEQsNEVBQTRFO0lBQzVFLHFFQUFxRTtJQUNyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2xDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZD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UUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN6RSxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxDQUFDLGNBQWMsVUFBVSxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZFLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxjQUFjLFVBQVUsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25FLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN0Qyx3Q0FBd0M7Z0JBQ3hDLE1BQU07WUFDUixDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDUixrQ0FBa0M7Z0JBQ2xDLE1BQU0sZUFBZSxHQUFVLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3pDLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLHVCQUF1QixFQUMxQiwwQ0FBMEMsVUFBVSxNQUFNLGVBQWUsRUFBRSxDQUM1RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztLQUNmOztBQXRUSCw0RUF1VEM7QUFZRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixxQ0FBcUMsQ0FDbkQsVUFBa0IsRUFDbEIsTUFBd0M7SUFFeEMsT0FBTyxNQUFNLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRva2VuLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuXG4vKipcbiAqIFBhcnRpdGlvbiBwcm9qZWN0aW9uIHR5cGUuXG4gKlxuICogRGV0ZXJtaW5lcyBob3cgQXRoZW5hIHByb2plY3RzIHBhcnRpdGlvbiB2YWx1ZXMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9wYXJ0aXRpb24tcHJvamVjdGlvbi1zdXBwb3J0ZWQtdHlwZXMuaHRtbFxuICovXG5leHBvcnQgZW51bSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZSB7XG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgYXMgaW50ZWdlcnMgd2l0aGluIGEgcmFuZ2UuXG4gICAqL1xuICBJTlRFR0VSID0gJ2ludGVnZXInLFxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgYXMgZGF0ZXMgd2l0aGluIGEgcmFuZ2UuXG4gICAqL1xuICBEQVRFID0gJ2RhdGUnLFxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IHBhcnRpdGlvbiB2YWx1ZXMgZnJvbSBhbiBleHBsaWNpdCBsaXN0IG9mIHZhbHVlcy5cbiAgICovXG4gIEVOVU0gPSAnZW51bScsXG5cbiAgLyoqXG4gICAqIFByb2plY3QgcGFydGl0aW9uIHZhbHVlcyB0aGF0IGFyZSBpbmplY3RlZCBhdCBxdWVyeSB0aW1lLlxuICAgKi9cbiAgSU5KRUNURUQgPSAnaW5qZWN0ZWQnLFxufVxuXG4vKipcbiAqIERhdGUgaW50ZXJ2YWwgdW5pdCBmb3IgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9wYXJ0aXRpb24tcHJvamVjdGlvbi1zdXBwb3J0ZWQtdHlwZXMuaHRtbCNwYXJ0aXRpb24tcHJvamVjdGlvbi1kYXRlLXR5cGVcbiAqL1xuZXhwb3J0IGVudW0gRGF0ZUludGVydmFsVW5pdCB7XG4gIC8qKlxuICAgKiBZZWFyIGludGVydmFsLlxuICAgKi9cbiAgWUVBUlMgPSAnWUVBUlMnLFxuXG4gIC8qKlxuICAgKiBNb250aCBpbnRlcnZhbC5cbiAgICovXG4gIE1PTlRIUyA9ICdNT05USFMnLFxuXG4gIC8qKlxuICAgKiBXZWVrIGludGVydmFsLlxuICAgKi9cbiAgV0VFS1MgPSAnV0VFS1MnLFxuXG4gIC8qKlxuICAgKiBEYXkgaW50ZXJ2YWwgKGRlZmF1bHQpLlxuICAgKi9cbiAgREFZUyA9ICdEQVlTJyxcblxuICAvKipcbiAgICogSG91ciBpbnRlcnZhbC5cbiAgICovXG4gIEhPVVJTID0gJ0hPVVJTJyxcblxuICAvKipcbiAgICogTWludXRlIGludGVydmFsLlxuICAgKi9cbiAgTUlOVVRFUyA9ICdNSU5VVEVTJyxcblxuICAvKipcbiAgICogU2Vjb25kIGludGVydmFsLlxuICAgKi9cbiAgU0VDT05EUyA9ICdTRUNPTkRTJyxcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBJTlRFR0VSIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZWdlclBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogTWluaW11bSB2YWx1ZSBmb3IgdGhlIGludGVnZXIgcGFydGl0aW9uIHJhbmdlIChpbmNsdXNpdmUpLlxuICAgKi9cbiAgcmVhZG9ubHkgbWluOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdmFsdWUgZm9yIHRoZSBpbnRlZ2VyIHBhcnRpdGlvbiByYW5nZSAoaW5jbHVzaXZlKS5cbiAgICovXG4gIHJlYWRvbmx5IG1heDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbnRlcnZhbCBiZXR3ZWVuIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGlnaXRzIHRvIHBhZCB0aGUgcGFydGl0aW9uIHZhbHVlIHdpdGggbGVhZGluZyB6ZXJvcy5cbiAgICpcbiAgICogV2l0aCBkaWdpdHM6IDQsIHBhcnRpdGlvbiB2YWx1ZXM6IDAwMDEsIDAwMDIsIC4uLiwgMDEwMFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHN0YXRpYyBudW1iZXIgb2YgZGlnaXRzIGFuZCBubyBsZWFkaW5nIHplcm9lc1xuICAgKi9cbiAgcmVhZG9ubHkgZGlnaXRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIERBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRlUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBTdGFydCBkYXRlIGZvciB0aGUgcGFydGl0aW9uIHJhbmdlIChpbmNsdXNpdmUpLlxuICAgKlxuICAgKiBDYW4gYmUgZWl0aGVyOlxuICAgKiAtIEZpeGVkIGRhdGUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgYGZvcm1hdGAgcHJvcGVydHlcbiAgICogICAoZS5nLiwgJzIwMjAtMDEtMDEnIGZvciBmb3JtYXQgJ3l5eXktTU0tZGQnKVxuICAgKiAtIFJlbGF0aXZlIGRhdGUgdXNpbmcgTk9XIHN5bnRheFxuICAgKiAgIChlLmcuLCAnTk9XJywgJ05PVy0zWUVBUlMnLCAnTk9XKzFNT05USCcpXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvcGFydGl0aW9uLXByb2plY3Rpb24tc3VwcG9ydGVkLXR5cGVzLmh0bWwjcGFydGl0aW9uLXByb2plY3Rpb24tZGF0ZS10eXBlXG4gICAqL1xuICByZWFkb25seSBtaW46IHN0cmluZztcblxuICAvKipcbiAgICogRW5kIGRhdGUgZm9yIHRoZSBwYXJ0aXRpb24gcmFuZ2UgKGluY2x1c2l2ZSkuXG4gICAqXG4gICAqIENhbiBiZSBlaXRoZXI6XG4gICAqIC0gRml4ZWQgZGF0ZSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSBgZm9ybWF0YCBwcm9wZXJ0eVxuICAgKiAtIFJlbGF0aXZlIGRhdGUgdXNpbmcgTk9XIHN5bnRheFxuICAgKlxuICAgKiBTYW1lIGZvcm1hdCBjb25zdHJhaW50cyBhcyBgbWluYC5cbiAgICovXG4gIHJlYWRvbmx5IG1heDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEYXRlIGZvcm1hdCBmb3IgcGFydGl0aW9uIHZhbHVlcy5cbiAgICpcbiAgICogVXNlcyBKYXZhIFNpbXBsZURhdGVGb3JtYXQgcGF0dGVybnMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcy5cbiAgICpcbiAgICogUmVxdWlyZWQgKHRvZ2V0aGVyIHdpdGggYGludGVydmFsVW5pdGApIHdoZW4gYGZvcm1hdGAgY2FycmllcyBzdWItZGF5XG4gICAqIHByZWNpc2lvbiDigJQgaS5lLiBhIGZpZWxkIGZpbmVyIHRoYW4gYSBkYXksIHN1Y2ggYXMgaG91cnMgb3IgQU0vUE0uIEF0IGRheVxuICAgKiBvciBjb2Fyc2VyIHByZWNpc2lvbiBBdGhlbmEgZGVmYXVsdHMgdGhlIHN0ZXAsIHNvIGl0IGlzIG9wdGlvbmFsLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEF0aGVuYSdzIGRlZmF1bHQgc3RlcCBmb3IgdGhlIGZvcm1hdCdzIHByZWNpc2lvbjsgcmVxdWlyZWQgd2hlbiBgZm9ybWF0YCBpcyBzdWItZGF5IHByZWNpc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFVuaXQgZm9yIHRoZSBpbnRlcnZhbC5cbiAgICpcbiAgICogUmVxdWlyZWQgKHRvZ2V0aGVyIHdpdGggYGludGVydmFsYCkgd2hlbiBgZm9ybWF0YCBjYXJyaWVzIHN1Yi1kYXlcbiAgICogcHJlY2lzaW9uIOKAlCBpLmUuIGEgZmllbGQgZmluZXIgdGhhbiBhIGRheSwgc3VjaCBhcyBob3VycyBvciBBTS9QTS4gQXQgZGF5XG4gICAqIG9yIGNvYXJzZXIgcHJlY2lzaW9uIEF0aGVuYSBkZWZhdWx0cyB0aGUgc3RlcCwgc28gaXQgaXMgb3B0aW9uYWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQXRoZW5hJ3MgZGVmYXVsdCB1bml0IGZvciB0aGUgZm9ybWF0J3MgcHJlY2lzaW9uOyByZXF1aXJlZCB3aGVuIGBmb3JtYXRgIGlzIHN1Yi1kYXkgcHJlY2lzaW9uXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbFVuaXQ/OiBEYXRlSW50ZXJ2YWxVbml0O1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIEVOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnVtUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBFeHBsaWNpdCBsaXN0IG9mIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlIFsndXMtZWFzdC0xJywgJ3VzLXdlc3QtMicsICdldS13ZXN0LTEnXVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBwcm9wZXJ0aWVzIGZvciBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbi5cbiAqL1xuaW50ZXJmYWNlIFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogUmFuZ2Ugb2YgcGFydGl0aW9uIHZhbHVlcyBmb3IgSU5URUdFUiB0eXBlLlxuICAgKlxuICAgKiBBcnJheSBvZiBbbWluLCBtYXhdIGFzIG51bWJlcnMuXG4gICAqL1xuICByZWFkb25seSBpbnRlZ2VyUmFuZ2U/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogUmFuZ2Ugb2YgcGFydGl0aW9uIHZhbHVlcyBmb3IgREFURSB0eXBlLlxuICAgKlxuICAgKiBBcnJheSBvZiBbc3RhcnQsIGVuZF0gYXMgZGF0ZSBzdHJpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0ZVJhbmdlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZGlnaXRzIHRvIHBhZCBJTlRFR0VSIHBhcnRpdGlvbiB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBkaWdpdHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERhdGUgZm9ybWF0IGZvciBEQVRFIHBhcnRpdGlvbiB2YWx1ZXMgKEphdmEgU2ltcGxlRGF0ZUZvcm1hdCkuXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVuaXQgZm9yIERBVEUgcGFydGl0aW9uIGludGVydmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWxVbml0PzogRGF0ZUludGVydmFsVW5pdDtcblxuICAvKipcbiAgICogRXhwbGljaXQgbGlzdCBvZiB2YWx1ZXMgZm9yIEVOVU0gcGFydGl0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBEQVRFIHByb2plY3Rpb24gYGZvcm1hdGAgY2FycmllcyBzdWItZGF5IHByZWNpc2lvbiwgaW4gd2hpY2ggY2FzZVxuICogQXRoZW5hIHJlcXVpcmVzIGJvdGggYGludGVydmFsYCBhbmQgYGludGVydmFsVW5pdGAuXG4gKlxuICogQXRoZW5hIG9ubHkgcmVxdWlyZXMgdGhlIHR3byB3aGVuIHRoZSBmb3JtYXQgY29udGFpbnMgYSBmaWVsZCBmaW5lciB0aGFuIGFcbiAqIGRheSAoaG91ci9taW51dGUvc2Vjb25kL2ZyYWN0aW9uLCBvciBBTS9QTSkuIEF0IGRheSwgbW9udGgsIG9yIGNvYXJzZXJcbiAqIHByZWNpc2lvbiBpdCBkZWZhdWx0cyB0aGUgc3RlcCBhbmQgYWNjZXB0cyB0aGUgZm9ybWF0IHdpdGhvdXQgdGhlbSDigJQgc28sIGUuZy5cbiAqIGEgcGxhaW4gYHl5eXlgIG5lZWRzIG5vIGludGVydmFsLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvcGFydGl0aW9uLXByb2plY3Rpb24tc3VwcG9ydGVkLXR5cGVzLmh0bWwjcGFydGl0aW9uLXByb2plY3Rpb24tZGF0ZS10eXBlXG4gKi9cbmZ1bmN0aW9uIGRhdGVGb3JtYXRSZXF1aXJlc0ludGVydmFsKGZvcm1hdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENvbGxlY3QgdGhlIHVucXVvdGVkIEphdmEgRGF0ZVRpbWVGb3JtYXR0ZXIgcGF0dGVybiBsZXR0ZXJzLCBob25vcmluZyB0aGVcbiAgLy8gc2FtZSBzaW5nbGUtcXVvdGUgbGl0ZXJhbCBlc2NhcGluZyBhcyB0aGUgZm9ybWF0IHZhbGlkYXRpb24gYWJvdmUuXG4gIGNvbnN0IGxldHRlcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbGV0IGluUXVvdGUgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaCA9IGZvcm1hdFtpXTtcbiAgICBpZiAoY2ggPT09IFwiJ1wiKSB7XG4gICAgICBpZiAoaSArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdFtpICsgMV0gPT09IFwiJ1wiKSB7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluUXVvdGUgPSAhaW5RdW90ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpblF1b3RlICYmIC9bYS16QS1aXS8udGVzdChjaCkpIHtcbiAgICAgIGxldHRlcnMuYWRkKGNoKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdWItZGF5IGZpZWxkcyDigJQgYW55dGhpbmcgZmluZXIgdGhhbiBhIGRheS4gYGFgIChBTS9QTS1vZi1kYXkpIHNwbGl0cyB0aGVcbiAgLy8gZGF5IGluIHR3bywgc28gaXQgY291bnRzIGFsb25nc2lkZSBob3VyL21pbnV0ZS9zZWNvbmQvZnJhY3Rpb24vbmFubzpcbiAgLy8gICBhIGFtL3BtICBoIGNsb2NrLWhvdXIoMS0xMikgIEsgaG91ci1vZi1hbS1wbSgwLTExKSAgayBjbG9jay1ob3VyKDEtMjQpXG4gIC8vICAgSCBob3VyLW9mLWRheSgwLTIzKSAgbSBtaW51dGUgIHMgc2Vjb25kICBTIGZyYWN0aW9uICBBIG1pbGxpLW9mLWRheVxuICAvLyAgIG4gbmFuby1vZi1zZWNvbmQgIE4gbmFuby1vZi1kYXlcbiAgLy8gRXZlcnkgY29hcnNlciBmaWVsZCAoZGF5LCBtb250aCwgeWVhciwgd2VlaywgcXVhcnRlciwgZGF5LW9mLXdlZWspIGlzXG4gIC8vIGFjY2VwdGVkIGJ5IEF0aGVuYSB3aXRob3V0IGFuIGludGVydmFsLCBzbyBvbmx5IHRoZSBzdWItZGF5IHNldCByZXF1aXJlcyBpdC5cbiAgcmV0dXJuIFsuLi4nYWhLa0htc1NBbk4nXS5zb21lKGMgPT4gbGV0dGVycy5oYXMoYykpO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGFuIElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW50ZWdlcihwcm9wczogSW50ZWdlclBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gICAgLy8gVmFsaWRhdGUgbWluL21heCBhcmUgaW50ZWdlcnNcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5taW4pICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMubWF4KSkge1xuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLm1pbikgfHwgIU51bWJlci5pc0ludGVnZXIocHJvcHMubWF4KSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEludGVnZXJSYW5nZU5vdEludGVnZXJzYCxcbiAgICAgICAgICBgSU5URUdFUiBwYXJ0aXRpb24gcHJvamVjdGlvbiByYW5nZSBtdXN0IGNvbnRhaW4gaW50ZWdlcnMsIGJ1dCBnb3QgWyR7cHJvcHMubWlufSwgJHtwcm9wcy5tYXh9XWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG1pbiA8PSBtYXhcbiAgICAgIGlmIChwcm9wcy5taW4gPiBwcm9wcy5tYXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBJbnRlZ2VyUmFuZ2VNaW5HcmVhdGVyVGhhbk1heGAsXG4gICAgICAgICAgYElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gcmFuZ2UgbXVzdCBiZSBbbWluLCBtYXhdIHdoZXJlIG1pbiA8PSBtYXgsIGJ1dCBnb3QgWyR7cHJvcHMubWlufSwgJHtwcm9wcy5tYXh9XWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW50ZXJ2YWxcbiAgICBpZiAoXG4gICAgICBwcm9wcy5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLmludGVydmFsKSAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLmludGVydmFsKSB8fCBwcm9wcy5pbnRlcnZhbCA8PSAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgSW50ZWdlckludGVydmFsSW52YWxpZGAsXG4gICAgICAgIGBJTlRFR0VSIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGludGVydmFsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBidXQgZ290ICR7cHJvcHMuaW50ZXJ2YWx9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZGlnaXRzXG4gICAgaWYgKFxuICAgICAgcHJvcHMuZGlnaXRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZGlnaXRzKSAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKHByb3BzLmRpZ2l0cykgfHwgcHJvcHMuZGlnaXRzIDwgMSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEludGVnZXJEaWdpdHNJbnZhbGlkYCxcbiAgICAgICAgYElOVEVHRVIgcGFydGl0aW9uIHByb2plY3Rpb24gZGlnaXRzIG11c3QgYmUgYW4gaW50ZWdlciA+PSAxLCBidXQgZ290ICR7cHJvcHMuZGlnaXRzfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24oe1xuICAgICAgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGUuSU5URUdFUixcbiAgICAgIGludGVnZXJSYW5nZTogW3Byb3BzLm1pbiwgcHJvcHMubWF4XSxcbiAgICAgIGludGVydmFsOiBwcm9wcy5pbnRlcnZhbCxcbiAgICAgIGRpZ2l0czogcHJvcHMuZGlnaXRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZShwcm9wczogRGF0ZVBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uUHJvcHMpOiBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gICAgLy8gVmFsaWRhdGUgbWluL21heCBhcmUgbm90IGVtcHR5XG4gICAgaWYgKFxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5taW4pICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm1heCkgJiZcbiAgICAgIChwcm9wcy5taW4udHJpbSgpID09PSAnJyB8fCBwcm9wcy5tYXgudHJpbSgpID09PSAnJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YERhdGVSYW5nZUVtcHR5YCxcbiAgICAgICAgJ0RBVEUgcGFydGl0aW9uIHByb2plY3Rpb24gcmFuZ2UgbXVzdCBub3QgY29udGFpbiBlbXB0eSBzdHJpbmdzJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZm9ybWF0XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZm9ybWF0KSkge1xuICAgICAgLy8gVmFsaWRhdGUgZm9ybWF0IGlzIG5vdCBlbXB0eVxuICAgICAgaWYgKHByb3BzLmZvcm1hdC50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgRGF0ZUZvcm1hdEVtcHR5YCxcbiAgICAgICAgICAnREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBmb3JtYXQgcGF0dGVybiBjaGFyYWN0ZXJzIChKYXZhIDggRGF0ZVRpbWVGb3JtYXR0ZXIpXG4gICAgICBjb25zdCB2YWxpZFBhdHRlcm5MZXR0ZXJzID0gJ0d5dVlETUxkUXF3V0VlY0ZhaEtrSG1zU0FuTlZ6T1h4WnAnO1xuICAgICAgY29uc3QgZm9ybWF0ID0gcHJvcHMuZm9ybWF0O1xuICAgICAgbGV0IGluUXVvdGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGludmFsaWRDaGFyczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2ggPSBmb3JtYXRbaV07XG4gICAgICAgIGlmIChjaCA9PT0gXCInXCIpIHtcbiAgICAgICAgICBpZiAoaSArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdFtpICsgMV0gPT09IFwiJ1wiKSB7XG4gICAgICAgICAgICAvLyAnJyBpcyBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZSBsaXRlcmFsLCBza2lwIGJvdGhcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5RdW90ZSA9ICFpblF1b3RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaW5RdW90ZSAmJiAvW2EtekEtWl0vLnRlc3QoY2gpKSB7XG4gICAgICAgICAgaWYgKCF2YWxpZFBhdHRlcm5MZXR0ZXJzLmluY2x1ZGVzKGNoKSkge1xuICAgICAgICAgICAgaW52YWxpZENoYXJzLnB1c2goY2gpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5RdW90ZSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YERhdGVGb3JtYXRVbmNsb3NlZFF1b3RlYCxcbiAgICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgaGFzIGFuIHVuY2xvc2VkIHNpbmdsZSBxdW90ZTogJyR7Zm9ybWF0fSdgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW52YWxpZENoYXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdW5pcXVlID0gWy4uLm5ldyBTZXQoaW52YWxpZENoYXJzKV07XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgRGF0ZUZvcm1hdEludmFsaWRDaGFyYWN0ZXJzYCxcbiAgICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBmb3JtYXQgY29udGFpbnMgaW52YWxpZCBwYXR0ZXJuIGNoYXJhY3RlcnM6ICR7dW5pcXVlLmpvaW4oJywgJyl9LiBNdXN0IHVzZSBKYXZhIERhdGVUaW1lRm9ybWF0dGVyIHZhbGlkIHBhdHRlcm4gbGV0dGVycy5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGludGVydmFsXG4gICAgaWYgKFxuICAgICAgcHJvcHMuaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5pbnRlcnZhbCkgJiZcbiAgICAgICghTnVtYmVyLmlzSW50ZWdlcihwcm9wcy5pbnRlcnZhbCkgfHwgcHJvcHMuaW50ZXJ2YWwgPD0gMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YERhdGVJbnRlcnZhbEludmFsaWRgLFxuICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiBpbnRlcnZhbCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYnV0IGdvdCAke3Byb3BzLmludGVydmFsfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZvciBzdWItZGF5IHByZWNpc2lvbiAoYSBmaWVsZCBmaW5lciB0aGFuIGEgZGF5KSwgQXRoZW5hIHJlcXVpcmVzIGJvdGhcbiAgICAvLyBgaW50ZXJ2YWxgIGFuZCBgaW50ZXJ2YWxVbml0YDsgYXQgZGF5IG9yIGNvYXJzZXIgcHJlY2lzaW9uIGl0IGRlZmF1bHRzXG4gICAgLy8gdGhlbS4gT25seSBlbmZvcmNlIHdoZW4gdGhlIGZvcm1hdCBpcyBhIHJlc29sdmVkIGxpdGVyYWwgd2UgY2FuIGluc3BlY3QuXG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZm9ybWF0KSAmJiBkYXRlRm9ybWF0UmVxdWlyZXNJbnRlcnZhbChwcm9wcy5mb3JtYXQpKSB7XG4gICAgICBpZiAocHJvcHMuaW50ZXJ2YWwgPT09IHVuZGVmaW5lZCB8fCBwcm9wcy5pbnRlcnZhbFVuaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YERhdGVJbnRlcnZhbFJlcXVpcmVkYCxcbiAgICAgICAgICBgREFURSBwYXJ0aXRpb24gcHJvamVjdGlvbiB3aXRoIGZvcm1hdCAnJHtwcm9wcy5mb3JtYXR9JyBoYXMgc3ViLWRheSBwcmVjaXNpb24sIHNvIGJvdGggJ2ludGVydmFsJyBhbmQgJ2ludGVydmFsVW5pdCcgYXJlIHJlcXVpcmVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uKHtcbiAgICAgIHR5cGU6IFBhcnRpdGlvblByb2plY3Rpb25UeXBlLkRBVEUsXG4gICAgICBkYXRlUmFuZ2U6IFtwcm9wcy5taW4sIHByb3BzLm1heF0sXG4gICAgICBpbnRlcnZhbDogcHJvcHMuaW50ZXJ2YWwsXG4gICAgICBmb3JtYXQ6IHByb3BzLmZvcm1hdCxcbiAgICAgIGludGVydmFsVW5pdDogcHJvcHMuaW50ZXJ2YWxVbml0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBFTlVNIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGVudW0ocHJvcHM6IEVudW1QYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvblByb3BzKTogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAgIC8vIFZhbGlkYXRlIHZhbHVlcyBpcyBub3QgZW1wdHlcbiAgICBpZiAocHJvcHMudmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgRW51bVZhbHVlc0VtcHR5YCxcbiAgICAgICAgJ0VOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gdmFsdWVzIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXknLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSBwcm9wcy52YWx1ZXNbaV07XG4gICAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZCh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBsaXRgRW51bVZhbHVlRW1wdHlgLFxuICAgICAgICAgICAgJ0VOVU0gcGFydGl0aW9uIHByb2plY3Rpb24gdmFsdWVzIG11c3Qgbm90IGNvbnRhaW4gZW1wdHkgc3RyaW5ncycsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGxpdGBFbnVtVmFsdWVDb250YWluc0NvbW1hYCxcbiAgICAgICAgICAgIGBFTlVNIHBhcnRpdGlvbiBwcm9qZWN0aW9uIHZhbHVlcyBtdXN0IG5vdCBjb250YWluIGNvbW1hcyBiZWNhdXNlIHRoZSB2YWx1ZXMgYXJlIHNlcmlhbGl6ZWQgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgZ290OiAnJHt2YWx1ZX0nYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25Qcm9qZWN0aW9uQ29uZmlndXJhdGlvbih7XG4gICAgICB0eXBlOiBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5FTlVNLFxuICAgICAgdmFsdWVzOiBwcm9wcy52YWx1ZXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIElOSkVDVEVEIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFBhcnRpdGlvbiB2YWx1ZXMgYXJlIGluamVjdGVkIGF0IHF1ZXJ5IHRpbWUgdGhyb3VnaCB0aGUgcXVlcnkgc3RhdGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL3BhcnRpdGlvbi1wcm9qZWN0aW9uLXN1cHBvcnRlZC10eXBlcy5odG1sI3BhcnRpdGlvbi1wcm9qZWN0aW9uLWluamVjdGVkLXR5cGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW5qZWN0ZWQoKTogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb24oe1xuICAgICAgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGUuSU5KRUNURUQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgcGFydGl0aW9uIHByb2plY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogUGFydGl0aW9uUHJvamVjdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIFJhbmdlIG9mIHBhcnRpdGlvbiB2YWx1ZXMgZm9yIElOVEVHRVIgdHlwZS5cbiAgICpcbiAgICogQXJyYXkgb2YgW21pbiwgbWF4XSBhcyBudW1iZXJzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGludGVnZXJSYW5nZT86IG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBSYW5nZSBvZiBwYXJ0aXRpb24gdmFsdWVzIGZvciBEQVRFIHR5cGUuXG4gICAqXG4gICAqIEFycmF5IG9mIFtzdGFydCwgZW5kXSBhcyBkYXRlIHN0cmluZ3MuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0ZVJhbmdlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEludGVydmFsIGJldHdlZW4gcGFydGl0aW9uIHZhbHVlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnRlcnZhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGRpZ2l0cyB0byBwYWQgSU5URUdFUiBwYXJ0aXRpb24gdmFsdWVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpZ2l0cz86IG51bWJlcjtcblxuICAvKipcbiAgICogRGF0ZSBmb3JtYXQgZm9yIERBVEUgcGFydGl0aW9uIHZhbHVlcyAoSmF2YSBTaW1wbGVEYXRlRm9ybWF0KS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVuaXQgZm9yIERBVEUgcGFydGl0aW9uIGludGVydmFsLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGludGVydmFsVW5pdD86IERhdGVJbnRlcnZhbFVuaXQ7XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IGxpc3Qgb2YgdmFsdWVzIGZvciBFTlVNIHBhcnRpdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcm9wczogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb25Qcm9wcykge1xuICAgIHRoaXMudHlwZSA9IHByb3BzLnR5cGU7XG4gICAgdGhpcy5pbnRlZ2VyUmFuZ2UgPSBwcm9wcy5pbnRlZ2VyUmFuZ2U7XG4gICAgdGhpcy5kYXRlUmFuZ2UgPSBwcm9wcy5kYXRlUmFuZ2U7XG4gICAgdGhpcy5pbnRlcnZhbCA9IHByb3BzLmludGVydmFsO1xuICAgIHRoaXMuZGlnaXRzID0gcHJvcHMuZGlnaXRzO1xuICAgIHRoaXMuZm9ybWF0ID0gcHJvcHMuZm9ybWF0O1xuICAgIHRoaXMuaW50ZXJ2YWxVbml0ID0gcHJvcHMuaW50ZXJ2YWxVbml0O1xuICAgIHRoaXMudmFsdWVzID0gcHJvcHMudmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgQ2xvdWRGb3JtYXRpb24gcGFyYW1ldGVycyBmb3IgdGhpcyBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uTmFtZSAtIFRoZSBwYXJ0aXRpb24gY29sdW1uIG5hbWVcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3JlbmRlclBhcmFtZXRlcnMoY29sdW1uTmFtZTogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0udHlwZWBdOiB0aGlzLnR5cGUsXG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFBhcnRpdGlvblByb2plY3Rpb25UeXBlLklOVEVHRVI6IHtcbiAgICAgICAgY29uc3QgW21pbiwgbWF4XSA9IHRoaXMuaW50ZWdlclJhbmdlITtcbiAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0ucmFuZ2VgXSA9IGAke21pbn0sJHttYXh9YDtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LmludGVydmFsYF0gPSB0aGlzLmludGVydmFsLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGlnaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5kaWdpdHNgXSA9IHRoaXMuZGlnaXRzLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBhcnRpdGlvblByb2plY3Rpb25UeXBlLkRBVEU6IHtcbiAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy5kYXRlUmFuZ2UhO1xuICAgICAgICBwYXJhbXNbYHByb2plY3Rpb24uJHtjb2x1bW5OYW1lfS5yYW5nZWBdID0gYCR7c3RhcnR9LCR7ZW5kfWA7XG4gICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LmZvcm1hdGBdID0gdGhpcy5mb3JtYXQhO1xuICAgICAgICBpZiAodGhpcy5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGFyYW1zW2Bwcm9qZWN0aW9uLiR7Y29sdW1uTmFtZX0uaW50ZXJ2YWxgXSA9IHRoaXMuaW50ZXJ2YWwudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbnRlcnZhbFVuaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LmludGVydmFsLnVuaXRgXSA9IHRoaXMuaW50ZXJ2YWxVbml0O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQYXJ0aXRpb25Qcm9qZWN0aW9uVHlwZS5FTlVNOiB7XG4gICAgICAgIHBhcmFtc1tgcHJvamVjdGlvbi4ke2NvbHVtbk5hbWV9LnZhbHVlc2BdID0gdGhpcy52YWx1ZXMhLmpvaW4oJywnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBhcnRpdGlvblByb2plY3Rpb25UeXBlLklOSkVDVEVEOiB7XG4gICAgICAgIC8vIElOSkVDVEVEIGhhcyBubyBhZGRpdGlvbmFsIHBhcmFtZXRlcnNcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFR5cGVTY3JpcHQgZXhoYXVzdGl2ZW5lc3MgY2hlY2tcbiAgICAgICAgY29uc3QgZXhoYXVzdGl2ZUNoZWNrOiBuZXZlciA9IHRoaXMudHlwZTtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBVbmtub3duUHJvamVjdGlvblR5cGVgLFxuICAgICAgICAgIGBVbmtub3duIHBhcnRpdGlvbiBwcm9qZWN0aW9uIHR5cGUgZm9yIFwiJHtjb2x1bW5OYW1lfVwiOiAke2V4aGF1c3RpdmVDaGVja31gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGZvciBhIHRhYmxlLlxuICpcbiAqIE1hcHMgcGFydGl0aW9uIGNvbHVtbiBuYW1lcyB0byB0aGVpciBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICogVGhlIGtleSBpcyB0aGUgcGFydGl0aW9uIGNvbHVtbiBuYW1lLCB0aGUgdmFsdWUgaXMgdGhlIHBhcnRpdGlvbiBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBQYXJ0aXRpb25Qcm9qZWN0aW9uID0ge1xuICBbY29sdW1uTmFtZTogc3RyaW5nXTogUGFydGl0aW9uUHJvamVjdGlvbkNvbmZpZ3VyYXRpb247XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBDbG91ZEZvcm1hdGlvbiBwYXJhbWV0ZXJzIGZvciBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBwYXJhbSBjb2x1bW5OYW1lIC0gVGhlIHBhcnRpdGlvbiBjb2x1bW4gbmFtZVxuICogQHBhcmFtIGNvbmZpZyAtIFRoZSBwYXJ0aXRpb24gY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQ2xvdWRGb3JtYXRpb24gcGFyYW1ldGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVQYXJ0aXRpb25Qcm9qZWN0aW9uUGFyYW1ldGVycyhcbiAgY29sdW1uTmFtZTogc3RyaW5nLFxuICBjb25maWc6IFBhcnRpdGlvblByb2plY3Rpb25Db25maWd1cmF0aW9uLFxuKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gIHJldHVybiBjb25maWcuX3JlbmRlclBhcmFtZXRlcnMoY29sdW1uTmFtZSk7XG59XG4iXX0=