@aws-cdk/aws-glue-alpha 2.263.0-alpha.0 → 2.265.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 (43) hide show
  1. package/.jsii +1537 -320
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +23 -1
  4. package/README.md +175 -1
  5. package/awslint.json +2 -1
  6. package/lib/catalog.d.ts +259 -0
  7. package/lib/catalog.js +424 -0
  8. package/lib/code.js +3 -3
  9. package/lib/connection.js +12 -4
  10. package/lib/data-format.js +5 -5
  11. package/lib/data-quality-ruleset.d.ts +7 -1
  12. package/lib/data-quality-ruleset.js +4 -3
  13. package/lib/database.d.ts +27 -15
  14. package/lib/database.js +45 -23
  15. package/lib/external-table.js +3 -3
  16. package/lib/index.d.ts +1 -0
  17. package/lib/index.js +2 -1
  18. package/lib/jobs/job.d.ts +5 -0
  19. package/lib/jobs/job.js +5 -3
  20. package/lib/jobs/pyspark-etl-job.js +1 -1
  21. package/lib/jobs/pyspark-flex-etl-job.js +3 -3
  22. package/lib/jobs/pyspark-streaming-job.js +1 -1
  23. package/lib/jobs/python-shell-job.js +1 -1
  24. package/lib/jobs/ray-job.js +1 -1
  25. package/lib/jobs/scala-spark-etl-job.js +1 -1
  26. package/lib/jobs/scala-spark-flex-etl-job.js +3 -3
  27. package/lib/jobs/scala-spark-streaming-job.js +1 -1
  28. package/lib/jobs/spark-job.js +1 -1
  29. package/lib/partition-projection.js +1 -1
  30. package/lib/private/secret-detection.d.ts +22 -0
  31. package/lib/private/secret-detection.js +42 -0
  32. package/lib/s3-table.d.ts +10 -0
  33. package/lib/s3-table.js +26 -4
  34. package/lib/schema.js +1 -1
  35. package/lib/security-configuration.d.ts +6 -0
  36. package/lib/security-configuration.js +4 -3
  37. package/lib/storage-parameter.js +1 -1
  38. package/lib/table-base.d.ts +23 -3
  39. package/lib/table-base.js +37 -7
  40. package/lib/table-deprecated.js +1 -1
  41. package/lib/triggers/trigger-options.js +1 -1
  42. package/lib/triggers/workflow.js +2 -2
  43. package/package.json +7 -7
package/lib/table-base.js CHANGED
@@ -37,6 +37,7 @@ exports.TableBase = void 0;
37
37
  const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
38
38
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
39
39
  const iam = __importStar(require("aws-cdk-lib/aws-iam"));
40
+ const aws_kms_1 = require("aws-cdk-lib/aws-kms");
40
41
  const core_1 = require("aws-cdk-lib/core");
41
42
  const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
42
43
  const cr = __importStar(require("aws-cdk-lib/custom-resources"));
@@ -47,7 +48,7 @@ const partition_index_provider_generated_1 = require("../custom-resource-handler
47
48
  * A Glue table.
48
49
  */
49
50
  class TableBase extends core_1.Resource {
50
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.TableBase", version: "2.263.0-alpha.0" };
51
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.TableBase", version: "2.265.0-alpha.0" };
51
52
  static fromTableArn(scope, id, tableArn) {
52
53
  const tableName = core_1.Fn.select(1, core_1.Fn.split('/', core_1.Stack.of(scope).splitArn(tableArn, core_1.ArnFormat.SLASH_RESOURCE_NAME).resourceName));
53
54
  return TableBase.fromTableAttributes(scope, id, {
@@ -173,7 +174,16 @@ class TableBase extends core_1.Resource {
173
174
  if (numPartitions === 0) {
174
175
  // Add scoped permissions for this table's Glue resources
175
176
  // https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsglue.html
176
- const resources = [this.tableArn, this.database.databaseArn, this.database.catalogArn];
177
+ const resources = [this.tableArn, this.database.databaseArn, this.database.catalog.catalogArn];
178
+ // The catalog's encryption is fixed at construction, so the encryption key
179
+ // (if any) is known here. Grant the handlers access to it. No-op when the
180
+ // catalog uses an AWS-managed key or no encryption.
181
+ const key = this.database.catalog.encryptionKey;
182
+ if (key) {
183
+ const grants = aws_kms_1.KeyGrants.fromKey(key);
184
+ grants.decrypt(provider.onEventHandler);
185
+ grants.decrypt(provider.isCompleteHandler);
186
+ }
177
187
  // Both handlers create, delete, and inspect indexes: onEvent creates/deletes on
178
188
  // Create/Delete/Update, and isComplete recreates the index while driving a
179
189
  // key-change update (delete -> recreate -> ACTIVE). UpdateTable/GetTable are
@@ -286,8 +296,17 @@ class TableBase extends core_1.Resource {
286
296
  this.parameters['projection.enabled'] = 'true';
287
297
  }
288
298
  /**
289
- * Grant the given identity custom permissions.
299
+ * Grant the given identity custom permissions on this table.
300
+ *
301
+ * This is a low-level escape hatch: the `actions` are applied verbatim,
302
+ * scoped to this table's ARN. Prefer the intent-based `grantRead` /
303
+ * `grantWrite` / `grantReadWrite` methods, which grant a curated set of
304
+ * actions and also cover the underlying S3 data. Only pass the specific
305
+ * actions the grantee needs - avoid service wildcards such as `glue:*`.
290
306
  * [disable-awslint:no-grants]
307
+ *
308
+ * @param grantee the principal
309
+ * @param actions the set of Glue actions to allow (for example `glue:GetTable`)
291
310
  */
292
311
  grant(grantee, actions) {
293
312
  return iam.Grant.addToPrincipal({
@@ -297,16 +316,27 @@ class TableBase extends core_1.Resource {
297
316
  });
298
317
  }
299
318
  /**
300
- * Grant the given identity custom permissions to ALL underlying resources of the table.
301
- * Permissions will be granted to the catalog, the database, and the table.
319
+ * Grant the given identity custom permissions on this table AND its parent
320
+ * catalog and database.
321
+ *
322
+ * This is a low-level escape hatch for actions (such as certain Lake
323
+ * Formation or crawler operations) that must be authorized against the
324
+ * catalog and database in addition to the table. The `actions` are applied
325
+ * verbatim to all three ARNs (table, catalog, database), so scope them
326
+ * tightly: pass only the specific actions the grantee needs and avoid
327
+ * service wildcards such as `glue:*`, which would grant broad access across
328
+ * every resource in the catalog and database.
302
329
  * [disable-awslint:no-grants]
330
+ *
331
+ * @param grantee the principal
332
+ * @param actions the set of Glue actions to allow (for example `glue:GetTable`)
303
333
  */
304
334
  grantToUnderlyingResources(grantee, actions) {
305
335
  return iam.Grant.addToPrincipal({
306
336
  grantee,
307
337
  resourceArns: [
308
338
  this.tableArn,
309
- this.database.catalogArn,
339
+ this.database.catalog.catalogArn,
310
340
  this.database.databaseArn,
311
341
  ],
312
342
  actions,
@@ -376,4 +406,4 @@ function validateSchema(columns, partitionKeys) {
376
406
  names.add(column.name);
377
407
  });
378
408
  }
379
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRhYmxlLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSx5REFBMkM7QUFHM0MsMkNBQTBKO0FBQzFKLDRFQUFxRTtBQUNyRSxpRUFBbUQ7QUFDbkQsMkNBQXVDO0FBR3ZDLGlFQUF5RztBQUd6RywySUFBcUs7QUFvS3JLOztHQUVHO0FBQ0gsTUFBc0IsU0FBVSxTQUFRLGVBQVE7O0lBQ3ZDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsUUFBZ0I7UUFDdkUsTUFBTSxTQUFTLEdBQUcsU0FBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsU0FBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsWUFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGdCQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxZQUFhLENBQUMsQ0FBQyxDQUFDO1FBRS9ILE9BQU8sU0FBUyxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDOUMsUUFBUTtZQUNSLFNBQVM7U0FDVixDQUFDLENBQUM7S0FDSjtJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjs7Ozs7Ozs7OztRQUNwRixNQUFNLE1BQU8sU0FBUSxlQUFRO1lBQ1gsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDMUIsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7U0FDN0M7UUFFRCxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztLQUM5QjtJQU9EOztPQUVHO0lBQ2EsUUFBUSxDQUFZO0lBRXBDOztPQUVHO0lBQ2EsVUFBVSxDQUFVO0lBRXBDOztP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QyxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENmblRhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHR5cGUgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgdHlwZSB7IElSZXNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQXJuRm9ybWF0LCBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24sIEZuLCBMYXp5LCBOYW1lcywgUmVzb3VyY2UsIFN0YWNrLCBUb2tlbiwgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgbGl0LCBtZDVoYXNoIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgKiBhcyBjciBmcm9tICdhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBEYXRhRm9ybWF0IH0gZnJvbSAnLi9kYXRhLWZvcm1hdCc7XG5pbXBvcnQgdHlwZSB7IElEYXRhYmFzZSB9IGZyb20gJy4vZGF0YWJhc2UnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYXJ0aXRpb25Qcm9qZWN0aW9uUGFyYW1ldGVycywgdHlwZSBQYXJ0aXRpb25Qcm9qZWN0aW9uIH0gZnJvbSAnLi9wYXJ0aXRpb24tcHJvamVjdGlvbic7XG5pbXBvcnQgdHlwZSB7IENvbHVtbiB9IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB0eXBlIHsgU3RvcmFnZVBhcmFtZXRlciB9IGZyb20gJy4vc3RvcmFnZS1wYXJhbWV0ZXInO1xuaW1wb3J0IHsgUGFydGl0aW9uSW5kZXhJc0NvbXBsZXRlRnVuY3Rpb24sIFBhcnRpdGlvbkluZGV4T25FdmVudEZ1bmN0aW9uIH0gZnJvbSAnLi4vY3VzdG9tLXJlc291cmNlLWhhbmRsZXJzL2Rpc3QvYXdzLWdsdWUtYWxwaGEvcGFydGl0aW9uLWluZGV4LXByb3ZpZGVyLmdlbmVyYXRlZCc7XG5cbi8qKlxuICogUHJvcGVydGllcyBvZiBhIFBhcnRpdGlvbiBJbmRleC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0aXRpb25JbmRleCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcGFydGl0aW9uIGluZGV4LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmFtZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgeW91LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXhOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFydGl0aW9uIGtleSBuYW1lcyB0aGF0IGNvbXByaXNlIHRoZSBwYXJ0aXRpb25cbiAgICogaW5kZXguIFRoZSBuYW1lcyBtdXN0IGNvcnJlc3BvbmQgdG8gYSBuYW1lIGluIHRoZVxuICAgKiB0YWJsZSdzIHBhcnRpdGlvbiBrZXlzLlxuICAgKi9cbiAgcmVhZG9ubHkga2V5TmFtZXM6IHN0cmluZ1tdO1xufVxuZXhwb3J0IGludGVyZmFjZSBJVGFibGUgZXh0ZW5kcyBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVBdHRyaWJ1dGVzIHtcbiAgcmVhZG9ubHkgdGFibGVBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVCYXNlUHJvcHMge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZ2VuZXJhdGVkIGJ5IENESy5cbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gb2YgdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBnZW5lcmF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEYXRhYmFzZSBpbiB3aGljaCB0byBzdG9yZSB0aGUgdGFibGUuXG4gICAqL1xuICByZWFkb25seSBkYXRhYmFzZTogSURhdGFiYXNlO1xuXG4gIC8qKlxuICAgKiBDb2x1bW5zIG9mIHRoZSB0YWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbHVtbnM6IENvbHVtbltdO1xuXG4gIC8qKlxuICAgKiBQYXJ0aXRpb24gY29sdW1ucyBvZiB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRhYmxlIGlzIG5vdCBwYXJ0aXRpb25lZFxuICAgKi9cbiAgcmVhZG9ubHkgcGFydGl0aW9uS2V5cz86IENvbHVtbltdO1xuXG4gIC8qKlxuICAgKiBQYXJ0aXRpb24gaW5kZXhlcyBvbiB0aGUgdGFibGUuIEEgbWF4aW11bSBvZiAzIGluZGV4ZXNcbiAgICogYXJlIGFsbG93ZWQgb24gYSB0YWJsZS4gS2V5cyBpbiB0aGUgaW5kZXggbXVzdCBiZSBwYXJ0XG4gICAqIG9mIHRoZSB0YWJsZSdzIHBhcnRpdGlvbiBrZXlzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0YWJsZSBoYXMgbm8gcGFydGl0aW9uIGluZGV4ZXNcbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbkluZGV4ZXM/OiBQYXJ0aXRpb25JbmRleFtdO1xuXG4gIC8qKlxuICAgKiBTdG9yYWdlIHR5cGUgb2YgdGhlIHRhYmxlJ3MgZGF0YS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSdzIGRhdGEgaXMgY29tcHJlc3NlZCBvciBub3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjb21wcmVzc2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRhYmxlIGRhdGEgaXMgc3RvcmVkIGluIHN1YmRpcmVjdG9yaWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVkQXNTdWJEaXJlY3Rvcmllcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgcGFydGl0aW9uIGZpbHRlcmluZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9nbHVlLWJlc3QtcHJhY3RpY2VzLmh0bWwjZ2x1ZS1iZXN0LXByYWN0aWNlcy1wYXJ0aXRpb24taW5kZXhcbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgcGFyYW1ldGVyIGlzIG5vdCBkZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVQYXJ0aXRpb25GaWx0ZXJpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdXNlci1zdXBwbGllZCBwcm9wZXJ0aWVzIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHBoeXNpY2FsIHN0b3JhZ2Ugb2YgdGhpcyB0YWJsZS4gVGhlc2UgcHJvcGVydGllcyBoZWxwIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgdGhhdCBpcyBzdG9yZWQgd2l0aGluIHRoZSBjcmF3bGVkIGRhdGEgc291cmNlcy5cbiAgICpcbiAgICogVGhlIGtleS92YWx1ZSBwYWlycyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHN1Ym1pdHRlZCBhcmUgbm90IGxpbWl0ZWQsIGhvd2V2ZXIgdGhlaXIgZnVuY3Rpb25hbGl0eSBpcyBub3QgZ3VhcmFudGVlZC5cbiAgICpcbiAgICogU29tZSBrZXlzIHdpbGwgYmUgYXV0by1wb3B1bGF0ZWQgYnkgZ2x1ZSBjcmF3bGVycywgaG93ZXZlciwgeW91IGNhbiBvdmVycmlkZSB0aGVtIGJ5IHNwZWNpZnlpbmcgdGhlIGtleSBhbmQgdmFsdWUgaW4gdGhpcyBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvdGFibGUtcHJvcGVydGllcy1jcmF3bGVyLmh0bWxcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcmVkc2hpZnQvbGF0ZXN0L2RnL3JfQ1JFQVRFX0VYVEVSTkFMX1RBQkxFLmh0bWwjcl9DUkVBVEVfRVhURVJOQUxfVEFCTEUtcGFyYW1ldGVycyAtIHVuZGVyIF9cIlRBQkxFIFBST1BFUlRJRVNcIl9cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgZGVjbGFyZSBjb25zdCBnbHVlRGF0YWJhc2U6IGdsdWUuSURhdGFiYXNlO1xuICAgKiAgICBjb25zdCB0YWJsZSA9IG5ldyBnbHVlLlRhYmxlKHRoaXMsICdUYWJsZScsIHtcbiAgICogICAgICBzdG9yYWdlUGFyYW1ldGVyczogW1xuICAgKiAgICAgICAgICBnbHVlLlN0b3JhZ2VQYXJhbWV0ZXIuc2tpcEhlYWRlckxpbmVDb3VudCgxKSxcbiAgICogICAgICAgICAgZ2x1ZS5TdG9yYWdlUGFyYW1ldGVyLmNvbXByZXNzaW9uVHlwZShnbHVlLkNvbXByZXNzaW9uVHlwZS5HWklQKSxcbiAgICogICAgICAgICAgZ2x1ZS5TdG9yYWdlUGFyYW1ldGVyLmN1c3RvbSgnZm9vJywgJ2JhcicpLCAvLyBXaWxsIGhhdmUgbm8gZWZmZWN0XG4gICAqICAgICAgICAgIGdsdWUuU3RvcmFnZVBhcmFtZXRlci5jdXN0b20oJ3NlcGFyYXRvckNoYXInLCAnLCcpLCAvLyBXaWxsIGRlc2NyaWJlIHRoZSBzZXBhcmF0b3IgY2hhciB1c2VkIGluIHRoZSBkYXRhXG4gICAqICAgICAgICAgIGdsdWUuU3RvcmFnZVBhcmFtZXRlci5jdXN0b20oZ2x1ZS5TdG9yYWdlUGFyYW1ldGVycy5XUklURV9QQVJBTExFTCwgJ29mZicpLFxuICAgKiAgICAgIF0sXG4gICAqICAgICAgLy8gLi4uXG4gICAqICAgICAgZGF0YWJhc2U6IGdsdWVEYXRhYmFzZSxcbiAgICogICAgICBjb2x1bW5zOiBbe1xuICAgKiAgICAgICAgICBuYW1lOiAnY29sMScsXG4gICAqICAgICAgICAgIHR5cGU6IGdsdWUuU2NoZW1hLlNUUklORyxcbiAgICogICAgICB9XSxcbiAgICogICAgICBkYXRhRm9ybWF0OiBnbHVlLkRhdGFGb3JtYXQuQ1NWLFxuICAgKiAgICB9KTtcbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgcGFyYW1ldGVyIGlzIG5vdCBkZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlUGFyYW1ldGVycz86IFN0b3JhZ2VQYXJhbWV0ZXJbXTtcblxuICAvKipcbiAgICogVGhlIGtleS92YWx1ZSBwYWlycyBkZWZpbmUgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhYmxlLlxuICAgKiBUaGUga2V5L3ZhbHVlIHBhaXJzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgc3VibWl0dGVkIGFyZSBub3QgbGltaXRlZCwgaG93ZXZlciB0aGVpciBmdW5jdGlvbmFsaXR5IGlzIG5vdCBndWFyYW50ZWVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWdsdWUtdGFibGUtdGFibGVpbnB1dC5odG1sI2Nmbi1nbHVlLXRhYmxlLXRhYmxlaW5wdXQtcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBwYXJhbWV0ZXIgaXMgbm90IGRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGlzIHRhYmxlLlxuICAgKlxuICAgKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBhbGxvd3MgQXRoZW5hIHRvIGF1dG9tYXRpY2FsbHkgYWRkIG5ldyBwYXJ0aXRpb25zXG4gICAqIHdpdGhvdXQgcmVxdWlyaW5nIGBBTFRFUiBUQUJMRSBBREQgUEFSVElUSU9OYCBzdGF0ZW1lbnRzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL3BhcnRpdGlvbi1wcm9qZWN0aW9uLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwYXJ0aXRpb24gcHJvamVjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcGFydGl0aW9uUHJvamVjdGlvbj86IFBhcnRpdGlvblByb2plY3Rpb247XG59XG5cbi8qKlxuICogQSBHbHVlIHRhYmxlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGFibGVCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVGFibGUge1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCB0YWJsZUFybjogc3RyaW5nKTogSVRhYmxlIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBGbi5zZWxlY3QoMSwgRm4uc3BsaXQoJy8nLCBTdGFjay5vZihzY29wZSkuc3BsaXRBcm4odGFibGVBcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKS5yZXNvdXJjZU5hbWUhKSk7XG5cbiAgICByZXR1cm4gVGFibGVCYXNlLmZyb21UYWJsZUF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICB0YWJsZUFybixcbiAgICAgIHRhYmxlTmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVGFibGUgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBjcmVhdGluZyBjb25zdHJ1Y3QgKHVzdWFsbHkgYHRoaXNgKS5cbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QncyBpZC5cbiAgICogQHBhcmFtIGF0dHJzIEltcG9ydCBhdHRyaWJ1dGVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFRhYmxlQXR0cmlidXRlcyk6IElUYWJsZSB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVGFibGUge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHRhYmxlQXJuID0gYXR0cnMudGFibGVBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lID0gYXR0cnMudGFibGVOYW1lO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgdGFibGVSZXNvdXJjZTogQ2ZuVGFibGU7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBwYXJ0aXRpb25JbmRleGVzPzogUGFydGl0aW9uSW5kZXhbXTtcblxuICAvKipcbiAgICogRGF0YWJhc2UgdGhpcyB0YWJsZSBiZWxvbmdzIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhdGFiYXNlOiBJRGF0YWJhc2U7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSdzIGRhdGEgaXMgY29tcHJlc3NlZCBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcHJlc3NlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogRm9ybWF0IG9mIHRoaXMgdGFibGUncyBkYXRhIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQ7XG5cbiAgLyoqXG4gICAqIFRoaXMgdGFibGUncyBjb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbHVtbnM6IENvbHVtbltdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHRhYmxlJ3MgcGFydGl0aW9uIGtleXMgaWYgdGhlIHRhYmxlIGlzIHBhcnRpdGlvbmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcnRpdGlvbktleXM/OiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogVGhlIHRhYmxlcycgc3RvcmFnZSBkZXNjcmlwdG9yIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RvcmFnZVBhcmFtZXRlcnM/OiBTdG9yYWdlUGFyYW1ldGVyW107XG5cbiAgLyoqXG4gICAqIFRoaXMgdGFibGUncyBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGlmIGVuYWJsZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFydGl0aW9uUHJvamVjdGlvbj86IFBhcnRpdGlvblByb2plY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0YWJsZXMnIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWJsZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1nbHVlLXRhYmxlLXRhYmxlaW5wdXQuaHRtbCNjZm4tZ2x1ZS10YWJsZS10YWJsZWlucHV0LXBhcmFtZXRlcnNcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBQYXJ0aXRpb24gaW5kZXhlcyBtdXN0IGJlIGNyZWF0ZWQgb25lIGF0IGEgdGltZS4gVG8gYXZvaWRcbiAgICogcmFjZSBjb25kaXRpb25zLCB3ZSBzdG9yZSB0aGUgcmVzb3VyY2UgYW5kIGFkZCBkZXBlbmRlbmNpZXNcbiAgICogZWFjaCB0aW1lIGEgbmV3IHBhcnRpdGlvbiBpbmRleCBpcyBjcmVhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlczogQ3VzdG9tUmVzb3VyY2VbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBUYWJsZUJhc2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy50YWJsZU5hbWUgPz9cbiAgICAgICAgTGF6eS5zdHJpbmcoe1xuICAgICAgICAgIHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7fSkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgfSksXG4gICAgfSk7XG5cbiAgICB0aGlzLmRhdGFiYXNlID0gcHJvcHMuZGF0YWJhc2U7XG4gICAgdGhpcy5kYXRhRm9ybWF0ID0gcHJvcHMuZGF0YUZvcm1hdDtcblxuICAgIHZhbGlkYXRlU2NoZW1hKHByb3BzLmNvbHVtbnMsIHByb3BzLnBhcnRpdGlvbktleXMpO1xuICAgIHRoaXMuY29sdW1ucyA9IHByb3BzLmNvbHVtbnM7XG4gICAgdGhpcy5wYXJ0aXRpb25LZXlzID0gcHJvcHMucGFydGl0aW9uS2V5cztcbiAgICB0aGlzLnN0b3JhZ2VQYXJhbWV0ZXJzID0gcHJvcHMuc3RvcmFnZVBhcmFtZXRlcnM7XG4gICAgdGhpcy5wYXJ0aXRpb25Qcm9qZWN0aW9uID0gcHJvcHMucGFydGl0aW9uUHJvamVjdGlvbjtcbiAgICB0aGlzLnBhcmFtZXRlcnMgPSBwcm9wcy5wYXJhbWV0ZXJzID8/IHt9O1xuXG4gICAgdGhpcy5jb21wcmVzc2VkID0gcHJvcHMuY29tcHJlc3NlZCA/PyBmYWxzZTtcblxuICAgIHRoaXMudmFsaWRhdGVBbmRHZW5lcmF0ZVBhcnRpdGlvblByb2plY3Rpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG4gIHB1YmxpYyBhYnN0cmFjdCBncmFudFdyaXRlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuICBwdWJsaWMgYWJzdHJhY3QgZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBhcnRpdGlvbiBpbmRleCB0byB0aGUgdGFibGUuIFlvdSBjYW4gaGF2ZSBhIG1heGltdW0gb2YgMyBwYXJ0aXRpb25cbiAgICogaW5kZXhlcyB0byBhIHRhYmxlLiBQYXJ0aXRpb24gaW5kZXgga2V5cyBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSB0YWJsZSdzXG4gICAqIHBhcnRpdGlvbiBrZXlzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9wYXJ0aXRpb24taW5kZXhlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgYWRkUGFydGl0aW9uSW5kZXgoaW5kZXg6IFBhcnRpdGlvbkluZGV4KSB7XG4gICAgY29uc3QgbnVtUGFydGl0aW9ucyA9IHRoaXMucGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZXMubGVuZ3RoO1xuICAgIGlmIChudW1QYXJ0aXRpb25zID49IDMpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YE1heFBhcnRpdGlvbkluZGV4ZXNFeGNlZWRlZGAsICdNYXhpbXVtIG51bWJlciBvZiBwYXJ0aXRpb24gaW5kZXhlcyBhbGxvd2VkIGlzIDMnLCB0aGlzKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZVBhcnRpdGlvbkluZGV4KGluZGV4KTtcblxuICAgIGNvbnN0IGluZGV4TmFtZSA9IGluZGV4LmluZGV4TmFtZSA/PyB0aGlzLmdlbmVyYXRlSW5kZXhOYW1lKGluZGV4LmtleU5hbWVzKTtcbiAgICBjb25zdCBwcm92aWRlciA9IFBhcnRpdGlvbkluZGV4UHJvdmlkZXIuZ2V0T3JDcmVhdGUodGhpcyk7XG5cbiAgICAvLyBUaGUgZ3JhbnRzIGFyZSBpZGVudGljYWwgZm9yIGV2ZXJ5IGluZGV4IG9uIHRoaXMgdGFibGUsIHNvIG9ubHkgYWRkIHRoZW1cbiAgICAvLyBvbmNlLlxuICAgIGlmIChudW1QYXJ0aXRpb25zID09PSAwKSB7XG4gICAgICAvLyBBZGQgc2NvcGVkIHBlcm1pc3Npb25zIGZvciB0aGlzIHRhYmxlJ3MgR2x1ZSByZXNvdXJjZXNcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2F3c2dsdWUuaHRtbFxuICAgICAgY29uc3QgcmVzb3VyY2VzID0gW3RoaXMudGFibGVBcm4sIHRoaXMuZGF0YWJhc2UuZGF0YWJhc2VBcm4sIHRoaXMuZGF0YWJhc2UuY2F0YWxvZ0Fybl07XG5cbiAgICAgIC8vIEJvdGggaGFuZGxlcnMgY3JlYXRlLCBkZWxldGUsIGFuZCBpbnNwZWN0IGluZGV4ZXM6IG9uRXZlbnQgY3JlYXRlcy9kZWxldGVzIG9uXG4gICAgICAvLyBDcmVhdGUvRGVsZXRlL1VwZGF0ZSwgYW5kIGlzQ29tcGxldGUgcmVjcmVhdGVzIHRoZSBpbmRleCB3aGlsZSBkcml2aW5nIGFcbiAgICAgIC8vIGtleS1jaGFuZ2UgdXBkYXRlIChkZWxldGUgLT4gcmVjcmVhdGUgLT4gQUNUSVZFKS4gVXBkYXRlVGFibGUvR2V0VGFibGUgYXJlXG4gICAgICAvLyByZXF1aXJlZCBieSB0aGUgQ3JlYXRlUGFydGl0aW9uSW5kZXgvRGVsZXRlUGFydGl0aW9uSW5kZXggQVBJcy5cbiAgICAgIGNvbnN0IGFjdGlvbnMgPSBbXG4gICAgICAgICdnbHVlOkdldFBhcnRpdGlvbkluZGV4ZXMnLFxuICAgICAgICAnZ2x1ZTpDcmVhdGVQYXJ0aXRpb25JbmRleCcsXG4gICAgICAgICdnbHVlOkRlbGV0ZVBhcnRpdGlvbkluZGV4JyxcbiAgICAgICAgJ2dsdWU6R2V0VGFibGUnLFxuICAgICAgICAnZ2x1ZTpVcGRhdGVUYWJsZScsXG4gICAgICBdO1xuICAgICAgcHJvdmlkZXIub25FdmVudEhhbmRsZXIuYWRkVG9Sb2xlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHsgYWN0aW9ucywgcmVzb3VyY2VzIH0pKTtcbiAgICAgIHByb3ZpZGVyLmlzQ29tcGxldGVIYW5kbGVyLmFkZFRvUm9sZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7IGFjdGlvbnMsIHJlc291cmNlcyB9KSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZSA9IG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCBgcGFydGl0aW9uLWluZGV4LSR7aW5kZXhOYW1lfWAsIHtcbiAgICAgIHJlc291cmNlVHlwZTogJ0N1c3RvbTo6R2x1ZVBhcnRpdGlvbkluZGV4JyxcbiAgICAgIHNlcnZpY2VUb2tlbjogcHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBEYXRhYmFzZU5hbWU6IHRoaXMuZGF0YWJhc2UuZGF0YWJhc2VOYW1lLFxuICAgICAgICBUYWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgICBJbmRleE5hbWU6IGluZGV4TmFtZSxcbiAgICAgICAgS2V5czogaW5kZXgua2V5TmFtZXMsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIElBTSBwb2xpY2llcyBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIGN1c3RvbSByZXNvdXJjZSBpbnZva2VzIHRoZSBoYW5kbGVyc1xuICAgIHBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHByb3ZpZGVyLm9uRXZlbnRIYW5kbGVyLnJvbGUhKTtcbiAgICBwYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShwcm92aWRlci5pc0NvbXBsZXRlSGFuZGxlci5yb2xlISk7XG5cbiAgICAvLyBEZXBlbmQgb24gcHJldmlvdXMgcGFydGl0aW9uIGluZGV4IHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uXG4gICAgaWYgKG51bVBhcnRpdGlvbnMgPiAwKSB7XG4gICAgICBwYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLnBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2VzW251bVBhcnRpdGlvbnMtMV0pO1xuICAgIH1cbiAgICB0aGlzLnBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2VzLnB1c2gocGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZSk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlSW5kZXhOYW1lKGtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYXhJbmRleExlbmd0aCA9IDgwO1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoa2V5cykgfHwga2V5cy5zb21lKGsgPT4gVG9rZW4uaXNVbnJlc29sdmVkKGspKSkge1xuICAgICAgLy8gVGhlIGluZGV4IG5hbWUgaXMgZGVyaXZlZCBmcm9tIHRoZSBrZXkgbmFtZXMsIHNvIHRva2VuaXplZCBrZXlzIGxlYXZlXG4gICAgICAvLyBub3RoaW5nIHN0YWJsZSB0byBnZW5lcmF0ZSBmcm9tOiBhbnkgYXV0by1nZW5lcmF0ZWQgbmFtZSB3b3VsZCBoYXZlIHRvXG4gICAgICAvLyBmYWxsIGJhY2sgdG8gdGhlIGluZGV4J3MgcG9zaXRpb24gb24gdGhlIHRhYmxlLCB3aGljaCBzaGlmdHMgaWYgaW5kZXhlc1xuICAgICAgLy8gYXJlIGFkZGVkLCByZW1vdmVkLCBvciByZW9yZGVyZWQgLSBzaWxlbnRseSByZXBsYWNpbmcgaW5kZXhlcyB0aGF0IGRpZFxuICAgICAgLy8gbm90IGFjdHVhbGx5IGNoYW5nZS4gUmVxdWlyZSBhbiBleHBsaWNpdCwgc3RhYmxlIG5hbWUgaW5zdGVhZC5cbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBUb2tlbml6ZWRJbmRleEtleXNSZXF1aXJlTmFtZWAsXG4gICAgICAgICdjYW5ub3QgYXV0by1nZW5lcmF0ZSBhIHN0YWJsZSBwYXJ0aXRpb24gaW5kZXggbmFtZSBmcm9tIHRva2VuaXplZCBrZXkgbmFtZXM7ICcgK1xuICAgICAgICAgICdzcGVjaWZ5IGBpbmRleE5hbWVgIGV4cGxpY2l0bHkgd2hlbiBpbmRleCBrZXlzIGFyZSBub3Qga25vd24gYXQgc3ludGhlc2lzIHRpbWUnLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcHJlZml4ID0ga2V5cy5qb2luKCctJykgKyAnLSc7XG4gICAgY29uc3QgdW5pcXVlSWQgPSBOYW1lcy51bmlxdWVJZCh0aGlzKTtcbiAgICBpZiAocHJlZml4Lmxlbmd0aCA8IG1heEluZGV4TGVuZ3RoKSB7XG4gICAgICAvLyBDb21tb24gY2FzZTogdHJpbSB0aGUgdW5pcXVlSWQgdGFpbCBzbyB0aGUgd2hvbGUgbmFtZSBmaXRzIHVuZGVyIHRoZSBjYXAuXG4gICAgICBjb25zdCBzdGFydEluZGV4ID0gTWF0aC5tYXgoMCwgdW5pcXVlSWQubGVuZ3RoIC0gKG1heEluZGV4TGVuZ3RoIC0gcHJlZml4Lmxlbmd0aCkpO1xuICAgICAgcmV0dXJuIHByZWZpeCArIHVuaXF1ZUlkLnN1YnN0cmluZyhzdGFydEluZGV4KTtcbiAgICB9XG4gICAgLy8gVGhlIGpvaW5lZCBrZXkgbmFtZXMgYWxvbmUgZXhjZWVkIHRoZSBidWRnZXQgKGxvbmcga2V5IG5hbWVzKSwgc28gdHJpbW1pbmdcbiAgICAvLyB0aGUgdW5pcXVlSWQgaXMgbm90IGVub3VnaC4gVHJ1bmNhdGUgdGhlIHByZWZpeCBhbmQgYXBwZW5kIGEgaGFzaCBvZiB0aGVcbiAgICAvLyB0YWJsZSBwYXRoIHBsdXMgdGhlIGZ1bGwga2V5IGxpc3QsIHNvIHR3byBkaWZmZXJlbnQgKGxvbmcpIGtleSBzZXRzIGNhbm5vdFxuICAgIC8vIGNvbGxpZGUgYWZ0ZXIgdHJ1bmNhdGlvbi5cbiAgICBjb25zdCBoYXNoID0gbWQ1aGFzaCh1bmlxdWVJZCArICctJyArIGtleXMuam9pbignLScpKS5zbGljZSgwLCA4KTtcbiAgICByZXR1cm4gcHJlZml4LnN1YnN0cmluZygwLCBtYXhJbmRleExlbmd0aCAtIGhhc2gubGVuZ3RoIC0gMSkgKyAnLScgKyBoYXNoO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBhcnRpdGlvbkluZGV4KGluZGV4OiBQYXJ0aXRpb25JbmRleCkge1xuICAgIGlmIChpbmRleC5pbmRleE5hbWUgIT09IHVuZGVmaW5lZCAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKGluZGV4LmluZGV4TmFtZSkgJiYgKGluZGV4LmluZGV4TmFtZS5sZW5ndGggPCAxIHx8IGluZGV4LmluZGV4TmFtZS5sZW5ndGggPiAyNTUpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBJbmRleE5hbWVMZW5ndGhJbnZhbGlkYCwgYEluZGV4IG5hbWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSBjaGFyYWN0ZXJzLCBidXQgZ290ICR7aW5kZXguaW5kZXhOYW1lLmxlbmd0aH1gLCB0aGlzKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBhcnRpdGlvbktleXMgfHwgdGhpcy5wYXJ0aXRpb25LZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgTm9QYXJ0aXRpb25LZXlzRm9ySW5kZXhgLCAnVGhlIHRhYmxlIG11c3QgaGF2ZSBwYXJ0aXRpb24ga2V5cyB0byBjcmVhdGUgYSBwYXJ0aXRpb24gaW5kZXgnLCB0aGlzKTtcbiAgICB9XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoaW5kZXgua2V5TmFtZXMpKSB7XG4gICAgICBjb25zdCBrZXlOYW1lcyA9IHRoaXMucGFydGl0aW9uS2V5cy5tYXAocGsgPT4gcGsubmFtZSk7XG4gICAgICBjb25zdCBjb25jcmV0ZUtleXMgPSBpbmRleC5rZXlOYW1lcy5maWx0ZXIoayA9PiAhVG9rZW4uaXNVbnJlc29sdmVkKGspKTtcbiAgICAgIGlmIChjb25jcmV0ZUtleXMubGVuZ3RoID4gMCAmJiAhY29uY3JldGVLZXlzLmV2ZXJ5KGsgPT4ga2V5TmFtZXMuaW5jbHVkZXMoaykpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEluZGV4S2V5c05vdFBhcnRpdGlvbktleXNgLCBgQWxsIGluZGV4IGtleXMgbXVzdCBhbHNvIGJlIHBhcnRpdGlvbiBrZXlzLiBHb3QgJHtpbmRleC5rZXlOYW1lc30gYnV0IHBhcnRpdGlvbiBrZXkgbmFtZXMgYXJlICR7a2V5TmFtZXN9YCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIG1lcmdlIGdlbmVyYXRlZCBwYXJhbWV0ZXJzIGludG8gdGhpcy5wYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFuZEdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGFydGl0aW9uUHJvamVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgcGFydGl0aW9uIGtleXMgZXhpc3RcbiAgICBpZiAoIXRoaXMucGFydGl0aW9uS2V5cyB8fCB0aGlzLnBhcnRpdGlvbktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgTm9QYXJ0aXRpb25LZXlzRm9yUHJvamVjdGlvbmAsXG4gICAgICAgICdUaGUgdGFibGUgbXVzdCBoYXZlIHBhcnRpdGlvbiBrZXlzIHRvIHVzZSBwYXJ0aXRpb24gcHJvamVjdGlvbicsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRpdGlvbktleU5hbWVzID0gdGhpcy5wYXJ0aXRpb25LZXlzLm1hcChwayA9PiBway5uYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvblxuICAgIGZvciAoY29uc3QgW2NvbHVtbk5hbWUsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wYXJ0aXRpb25Qcm9qZWN0aW9uKSkge1xuICAgICAgLy8gVmFsaWRhdGUgdGhhdCBjb2x1bW4gaXMgYSBwYXJ0aXRpb24ga2V5XG4gICAgICBpZiAoIXBhcnRpdGlvbktleU5hbWVzLmluY2x1ZGVzKGNvbHVtbk5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YFByb2plY3Rpb25Db2x1bW5Ob3RQYXJ0aXRpb25LZXlgLFxuICAgICAgICAgIGBQYXJ0aXRpb24gcHJvamVjdGlvbiBjb2x1bW4gXCIke2NvbHVtbk5hbWV9XCIgbXVzdCBiZSBhIHBhcnRpdGlvbiBrZXkuIGAgK1xuICAgICAgICAgIGBQYXJ0aXRpb24ga2V5cyBhcmU6ICR7cGFydGl0aW9uS2V5TmFtZXMuam9pbignLCAnKX1gLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnNcbiAgICAgIGNvbnN0IGdlbmVyYXRlZFBhcmFtcyA9IGdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvblBhcmFtZXRlcnMoY29sdW1uTmFtZSwgY29uZmlnKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGNvbmZsaWN0cyB3aXRoIG1hbnVhbGx5IHNwZWNpZmllZCBwYXJhbWV0ZXJzXG4gICAgICBjb25zdCBjb25mbGljdGluZ0tleXMgPSBPYmplY3Qua2V5cyhnZW5lcmF0ZWRQYXJhbXMpLmZpbHRlcihrZXkgPT4ga2V5IGluIHRoaXMucGFyYW1ldGVycyk7XG4gICAgICBpZiAoY29uZmxpY3RpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgUHJvamVjdGlvblBhcmFtZXRlcnNDb25mbGljdGAsXG4gICAgICAgICAgYFBhcnRpdGlvbiBwcm9qZWN0aW9uIHBhcmFtZXRlcnMgY29uZmxpY3Qgd2l0aCBtYW51YWxseSBzcGVjaWZpZWQgcGFyYW1ldGVyczogJHtjb25mbGljdGluZ0tleXMuam9pbignLCAnKX0uIGAgK1xuICAgICAgICAgICdVc2UgdGhlIHBhcnRpdGlvblByb2plY3Rpb24gcHJvcGVydHkgaW5zdGVhZCBvZiBtYW51YWxseSBzcGVjaWZ5aW5nIHByb2plY3Rpb24gcGFyYW1ldGVycy4nLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1lcmdlIGludG8gdGhpcy5wYXJhbWV0ZXJzXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMucGFyYW1ldGVycywgZ2VuZXJhdGVkUGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgY29uZmxpY3Qgd2l0aCBwcm9qZWN0aW9uLmVuYWJsZWRcbiAgICBpZiAoJ3Byb2plY3Rpb24uZW5hYmxlZCcgaW4gdGhpcy5wYXJhbWV0ZXJzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgUHJvamVjdGlvbkVuYWJsZWRDb25mbGljdGAsXG4gICAgICAgICdQYXJhbWV0ZXIgXCJwcm9qZWN0aW9uLmVuYWJsZWRcIiBjb25mbGljdHMgd2l0aCBwYXJ0aXRpb25Qcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uICcgK1xuICAgICAgICAnVXNlIHRoZSBwYXJ0aXRpb25Qcm9qZWN0aW9uIHByb3BlcnR5IGluc3RlYWQgb2YgbWFudWFsbHkgc3BlY2lmeWluZyBwcm9qZWN0aW9uLmVuYWJsZWQuJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRW5hYmxlIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGdsb2JhbGx5XG4gICAgdGhpcy5wYXJhbWV0ZXJzWydwcm9qZWN0aW9uLmVuYWJsZWQnXSA9ICd0cnVlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gaWRlbnRpdHkgY3VzdG9tIHBlcm1pc3Npb25zLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICovXG4gIHB1YmxpYyBncmFudChncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgYWN0aW9uczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICByZXNvdXJjZUFybnM6IFt0aGlzLnRhYmxlQXJuXSxcbiAgICAgIGFjdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgdGhlIGdpdmVuIGlkZW50aXR5IGN1c3RvbSBwZXJtaXNzaW9ucyB0byBBTEwgdW5kZXJseWluZyByZXNvdXJjZXMgb2YgdGhlIHRhYmxlLlxuICAgKiBQZXJtaXNzaW9ucyB3aWxsIGJlIGdyYW50ZWQgdG8gdGhlIGNhdGFsb2csIHRoZSBkYXRhYmFzZSwgYW5kIHRoZSB0YWJsZS5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRUb1VuZGVybHlpbmdSZXNvdXJjZXMoZ3JhbnRlZTogaWFtLklHcmFudGFibGUsIGFjdGlvbnM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbXG4gICAgICAgIHRoaXMudGFibGVBcm4sXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuY2F0YWxvZ0FybixcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5kYXRhYmFzZUFybixcbiAgICAgIF0sXG4gICAgICBhY3Rpb25zLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQSBzdGFjay1zaW5nbGV0b24gY3VzdG9tIHJlc291cmNlIHByb3ZpZGVyIHRoYXQgbWFuYWdlcyBHbHVlIHBhcnRpdGlvbiBpbmRleGVzLlxuICpcbiAqIEFsbCBwYXJ0aXRpb24taW5kZXhlZCB0YWJsZXMgaW4gYSBzdGFjayBzaGFyZSBhIHNpbmdsZSBwcm92aWRlciAoYW5kIGl0cyB0d29cbiAqIExhbWJkYSBoYW5kbGVycykgdG8gYXZvaWQgcHJvdmlzaW9uaW5nIGEgcHJvdmlkZXIgZnJhbWV3b3JrIHBlciB0YWJsZS4gVGhlXG4gKiBwcm92aWRlciBhbmQgaGFuZGxlcnMgYXJlIGdyb3VwZWQgdW5kZXIgdGhpcyBzaW5nbGUgY29uc3RydWN0IHNvIG9ubHkgb25lXG4gKiBpZCBpcyBwbGFjZWQgYXQgc3RhY2sgc2NvcGUuXG4gKi9cbmNsYXNzIFBhcnRpdGlvbkluZGV4UHJvdmlkZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3RhY2stc2luZ2xldG9uIHByb3ZpZGVyLCBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCB5ZXQgZXhpc3QuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldE9yQ3JlYXRlKHNjb3BlOiBDb25zdHJ1Y3QpOiBQYXJ0aXRpb25JbmRleFByb3ZpZGVyIHtcbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHNjb3BlKTtcbiAgICAvLyBBIGZpeGVkLCBuYW1lc3BhY2VkIGlkIG1ha2VzIHRoaXMgYSBzdGFjayBzaW5nbGV0b246IGV2ZXJ5IGNhbGwgd2l0aGluIHRoZVxuICAgIC8vIHNhbWUgc3RhY2sgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgY2hpbGQgdmlhIGB0cnlGaW5kQ2hpbGRgLlxuICAgIGNvbnN0IGlkID0gJ0Bhd3MtY2RrL2F3cy1nbHVlLWFscGhhLlBhcnRpdGlvbkluZGV4UHJvdmlkZXInO1xuICAgIHJldHVybiAoc3RhY2subm9kZS50cnlGaW5kQ2hpbGQoaWQpIGFzIFBhcnRpdGlvbkluZGV4UHJvdmlkZXIpID8/IG5ldyBQYXJ0aXRpb25JbmRleFByb3ZpZGVyKHN0YWNrLCBpZCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgb25FdmVudEhhbmRsZXI6IGxhbWJkYS5GdW5jdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IGlzQ29tcGxldGVIYW5kbGVyOiBsYW1iZGEuRnVuY3Rpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvdmlkZXI6IGNyLlByb3ZpZGVyO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gVGhlIGhhbmRsZXIgc291cmNlIGxpdmVzIGluIGBAYXdzLWNkay9jdXN0b20tcmVzb3VyY2UtaGFuZGxlcnNgIGFuZCBpcyBjb2RlXG4gICAgLy8gZ2VuZXJhdGVkICsgYWlybGlmdGVkIGludG8gdGhpcyBwYWNrYWdlIGF0IGJ1aWxkIHRpbWUgKHNlZVxuICAgIC8vIHNjcmlwdHMvYWlybGlmdC1jdXN0b20tcmVzb3VyY2UtaGFuZGxlcnMuc2gpLCBmb2xsb3dpbmcgdGhlIHBhdHRlcm4gdXNlZCBieSB0aGVcbiAgICAvLyBvdGhlciBhbHBoYSBtb2R1bGVzIChhd3MtYW1wbGlmeS1hbHBoYSwgYXdzLXJlZHNoaWZ0LWFscGhhKS4gVGhlIEBhd3Mtc2RrL2NsaWVudC1nbHVlXG4gICAgLy8gbW9kdWxlIGlzIHByb3ZpZGVkIGJ5IHRoZSBMYW1iZGEgcnVudGltZSByYXRoZXIgdGhhbiBidW5kbGVkIGludG8gdGhlIGFzc2V0LlxuICAgIHRoaXMub25FdmVudEhhbmRsZXIgPSBuZXcgUGFydGl0aW9uSW5kZXhPbkV2ZW50RnVuY3Rpb24odGhpcywgJ0hhbmRsZXInLCB7XG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgIH0pO1xuICAgIHRoaXMuaXNDb21wbGV0ZUhhbmRsZXIgPSBuZXcgUGFydGl0aW9uSW5kZXhJc0NvbXBsZXRlRnVuY3Rpb24odGhpcywgJ0lzQ29tcGxldGUnLCB7XG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm92aWRlciA9IG5ldyBjci5Qcm92aWRlcih0aGlzLCAnUHJvdmlkZXInLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogdGhpcy5vbkV2ZW50SGFuZGxlcixcbiAgICAgIGlzQ29tcGxldGVIYW5kbGVyOiB0aGlzLmlzQ29tcGxldGVIYW5kbGVyLFxuICAgICAgcXVlcnlJbnRlcnZhbDogRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICB0b3RhbFRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIHRva2VuIHRvIHdpcmUgaW50byBwYXJ0aXRpb24gaW5kZXggY3VzdG9tIHJlc291cmNlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2VydmljZVRva2VuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXIuc2VydmljZVRva2VuO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU2NoZW1hKGNvbHVtbnM6IENvbHVtbltdLCBwYXJ0aXRpb25LZXlzPzogQ29sdW1uW10pOiB2b2lkIHtcbiAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBOb0NvbHVtbnNTcGVjaWZpZWRgLCAneW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgY29sdW1uIGZvciB0aGUgdGFibGUnKTtcbiAgfVxuICAvLyBDaGVjayB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY29sdW1uIGFuZCBubyBkdXBsaWNhdGVkIGNvbHVtbiBuYW1lcyBvciBwYXJ0aXRpb24ga2V5cy5cbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgKGNvbHVtbnMuY29uY2F0KHBhcnRpdGlvbktleXMgfHwgW10pKS5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgaWYgKG5hbWVzLmhhcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgRHVwbGljYXRlQ29sdW1uTmFtZWAsIGBjb2x1bW4gbmFtZXMgYW5kIHBhcnRpdGlvbiBrZXlzIG11c3QgYmUgdW5pcXVlLCBidXQgXFwnJHtjb2x1bW4ubmFtZX1cXCcgaXMgZHVwbGljYXRlZGApO1xuICAgIH1cbiAgICBuYW1lcy5hZGQoY29sdW1uLm5hbWUpO1xuICB9KTtcbn1cbiJdfQ==
409
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRhYmxlLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSx5REFBMkM7QUFDM0MsaURBQWdEO0FBR2hELDJDQUEwSjtBQUMxSiw0RUFBcUU7QUFDckUsaUVBQW1EO0FBQ25ELDJDQUF1QztBQUd2QyxpRUFBeUc7QUFHekcsMklBQXFLO0FBb0tySzs7R0FFRztBQUNILE1BQXNCLFNBQVUsU0FBUSxlQUFROztJQUN2QyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFFBQWdCO1FBQ3ZFLE1BQU0sU0FBUyxHQUFHLFNBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFlBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxnQkFBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsWUFBYSxDQUFDLENBQUMsQ0FBQztRQUUvSCxPQUFPLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQzlDLFFBQVE7WUFDUixTQUFTO1NBQ1YsQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7Ozs7Ozs7Ozs7UUFDcEYsTUFBTSxNQUFPLFNBQVEsZUFBUTtZQUNYLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQzFCLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1NBQzdDO1FBRUQsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDOUI7SUFPRDs7T0FFRztJQUNhLFFBQVEsQ0FBWTtJQUVwQzs7T0FFRztJQUNhLFVBQVUs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QztJQUNuSCxDQUFDO0lBQ0QsdUZBQXVGO0lBQ3ZGLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDaEMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNyRCxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLDhCQUF1QixDQUFDLElBQUEsc0JBQUcsRUFBQSxxQkFBcUIsRUFBRSx5REFBeUQsTUFBTSxDQUFDLElBQUksa0JBQWtCLENBQUMsQ0FBQztRQUN0SixDQUFDO1FBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDZm5UYWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1nbHVlJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEtleUdyYW50cyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0IHR5cGUgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgdHlwZSB7IElSZXNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQXJuRm9ybWF0LCBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24sIEZuLCBMYXp5LCBOYW1lcywgUmVzb3VyY2UsIFN0YWNrLCBUb2tlbiwgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgbGl0LCBtZDVoYXNoIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgKiBhcyBjciBmcm9tICdhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBEYXRhRm9ybWF0IH0gZnJvbSAnLi9kYXRhLWZvcm1hdCc7XG5pbXBvcnQgdHlwZSB7IElEYXRhYmFzZSB9IGZyb20gJy4vZGF0YWJhc2UnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYXJ0aXRpb25Qcm9qZWN0aW9uUGFyYW1ldGVycywgdHlwZSBQYXJ0aXRpb25Qcm9qZWN0aW9uIH0gZnJvbSAnLi9wYXJ0aXRpb24tcHJvamVjdGlvbic7XG5pbXBvcnQgdHlwZSB7IENvbHVtbiB9IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB0eXBlIHsgU3RvcmFnZVBhcmFtZXRlciB9IGZyb20gJy4vc3RvcmFnZS1wYXJhbWV0ZXInO1xuaW1wb3J0IHsgUGFydGl0aW9uSW5kZXhJc0NvbXBsZXRlRnVuY3Rpb24sIFBhcnRpdGlvbkluZGV4T25FdmVudEZ1bmN0aW9uIH0gZnJvbSAnLi4vY3VzdG9tLXJlc291cmNlLWhhbmRsZXJzL2Rpc3QvYXdzLWdsdWUtYWxwaGEvcGFydGl0aW9uLWluZGV4LXByb3ZpZGVyLmdlbmVyYXRlZCc7XG5cbi8qKlxuICogUHJvcGVydGllcyBvZiBhIFBhcnRpdGlvbiBJbmRleC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0aXRpb25JbmRleCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcGFydGl0aW9uIGluZGV4LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmFtZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgeW91LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXhOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFydGl0aW9uIGtleSBuYW1lcyB0aGF0IGNvbXByaXNlIHRoZSBwYXJ0aXRpb25cbiAgICogaW5kZXguIFRoZSBuYW1lcyBtdXN0IGNvcnJlc3BvbmQgdG8gYSBuYW1lIGluIHRoZVxuICAgKiB0YWJsZSdzIHBhcnRpdGlvbiBrZXlzLlxuICAgKi9cbiAgcmVhZG9ubHkga2V5TmFtZXM6IHN0cmluZ1tdO1xufVxuZXhwb3J0IGludGVyZmFjZSBJVGFibGUgZXh0ZW5kcyBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVBdHRyaWJ1dGVzIHtcbiAgcmVhZG9ubHkgdGFibGVBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVCYXNlUHJvcHMge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZ2VuZXJhdGVkIGJ5IENESy5cbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gb2YgdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBnZW5lcmF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEYXRhYmFzZSBpbiB3aGljaCB0byBzdG9yZSB0aGUgdGFibGUuXG4gICAqL1xuICByZWFkb25seSBkYXRhYmFzZTogSURhdGFiYXNlO1xuXG4gIC8qKlxuICAgKiBDb2x1bW5zIG9mIHRoZSB0YWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbHVtbnM6IENvbHVtbltdO1xuXG4gIC8qKlxuICAgKiBQYXJ0aXRpb24gY29sdW1ucyBvZiB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRhYmxlIGlzIG5vdCBwYXJ0aXRpb25lZFxuICAgKi9cbiAgcmVhZG9ubHkgcGFydGl0aW9uS2V5cz86IENvbHVtbltdO1xuXG4gIC8qKlxuICAgKiBQYXJ0aXRpb24gaW5kZXhlcyBvbiB0aGUgdGFibGUuIEEgbWF4aW11bSBvZiAzIGluZGV4ZXNcbiAgICogYXJlIGFsbG93ZWQgb24gYSB0YWJsZS4gS2V5cyBpbiB0aGUgaW5kZXggbXVzdCBiZSBwYXJ0XG4gICAqIG9mIHRoZSB0YWJsZSdzIHBhcnRpdGlvbiBrZXlzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0YWJsZSBoYXMgbm8gcGFydGl0aW9uIGluZGV4ZXNcbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbkluZGV4ZXM/OiBQYXJ0aXRpb25JbmRleFtdO1xuXG4gIC8qKlxuICAgKiBTdG9yYWdlIHR5cGUgb2YgdGhlIHRhYmxlJ3MgZGF0YS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSdzIGRhdGEgaXMgY29tcHJlc3NlZCBvciBub3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjb21wcmVzc2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRhYmxlIGRhdGEgaXMgc3RvcmVkIGluIHN1YmRpcmVjdG9yaWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVkQXNTdWJEaXJlY3Rvcmllcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgcGFydGl0aW9uIGZpbHRlcmluZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXRoZW5hL2xhdGVzdC91Zy9nbHVlLWJlc3QtcHJhY3RpY2VzLmh0bWwjZ2x1ZS1iZXN0LXByYWN0aWNlcy1wYXJ0aXRpb24taW5kZXhcbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgcGFyYW1ldGVyIGlzIG5vdCBkZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVQYXJ0aXRpb25GaWx0ZXJpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdXNlci1zdXBwbGllZCBwcm9wZXJ0aWVzIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHBoeXNpY2FsIHN0b3JhZ2Ugb2YgdGhpcyB0YWJsZS4gVGhlc2UgcHJvcGVydGllcyBoZWxwIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgdGhhdCBpcyBzdG9yZWQgd2l0aGluIHRoZSBjcmF3bGVkIGRhdGEgc291cmNlcy5cbiAgICpcbiAgICogVGhlIGtleS92YWx1ZSBwYWlycyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHN1Ym1pdHRlZCBhcmUgbm90IGxpbWl0ZWQsIGhvd2V2ZXIgdGhlaXIgZnVuY3Rpb25hbGl0eSBpcyBub3QgZ3VhcmFudGVlZC5cbiAgICpcbiAgICogU29tZSBrZXlzIHdpbGwgYmUgYXV0by1wb3B1bGF0ZWQgYnkgZ2x1ZSBjcmF3bGVycywgaG93ZXZlciwgeW91IGNhbiBvdmVycmlkZSB0aGVtIGJ5IHNwZWNpZnlpbmcgdGhlIGtleSBhbmQgdmFsdWUgaW4gdGhpcyBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvdGFibGUtcHJvcGVydGllcy1jcmF3bGVyLmh0bWxcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcmVkc2hpZnQvbGF0ZXN0L2RnL3JfQ1JFQVRFX0VYVEVSTkFMX1RBQkxFLmh0bWwjcl9DUkVBVEVfRVhURVJOQUxfVEFCTEUtcGFyYW1ldGVycyAtIHVuZGVyIF9cIlRBQkxFIFBST1BFUlRJRVNcIl9cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgZGVjbGFyZSBjb25zdCBnbHVlRGF0YWJhc2U6IGdsdWUuSURhdGFiYXNlO1xuICAgKiAgICBjb25zdCB0YWJsZSA9IG5ldyBnbHVlLlRhYmxlKHRoaXMsICdUYWJsZScsIHtcbiAgICogICAgICBzdG9yYWdlUGFyYW1ldGVyczogW1xuICAgKiAgICAgICAgICBnbHVlLlN0b3JhZ2VQYXJhbWV0ZXIuc2tpcEhlYWRlckxpbmVDb3VudCgxKSxcbiAgICogICAgICAgICAgZ2x1ZS5TdG9yYWdlUGFyYW1ldGVyLmNvbXByZXNzaW9uVHlwZShnbHVlLkNvbXByZXNzaW9uVHlwZS5HWklQKSxcbiAgICogICAgICAgICAgZ2x1ZS5TdG9yYWdlUGFyYW1ldGVyLmN1c3RvbSgnZm9vJywgJ2JhcicpLCAvLyBXaWxsIGhhdmUgbm8gZWZmZWN0XG4gICAqICAgICAgICAgIGdsdWUuU3RvcmFnZVBhcmFtZXRlci5jdXN0b20oJ3NlcGFyYXRvckNoYXInLCAnLCcpLCAvLyBXaWxsIGRlc2NyaWJlIHRoZSBzZXBhcmF0b3IgY2hhciB1c2VkIGluIHRoZSBkYXRhXG4gICAqICAgICAgICAgIGdsdWUuU3RvcmFnZVBhcmFtZXRlci5jdXN0b20oZ2x1ZS5TdG9yYWdlUGFyYW1ldGVycy5XUklURV9QQVJBTExFTCwgJ29mZicpLFxuICAgKiAgICAgIF0sXG4gICAqICAgICAgLy8gLi4uXG4gICAqICAgICAgZGF0YWJhc2U6IGdsdWVEYXRhYmFzZSxcbiAgICogICAgICBjb2x1bW5zOiBbe1xuICAgKiAgICAgICAgICBuYW1lOiAnY29sMScsXG4gICAqICAgICAgICAgIHR5cGU6IGdsdWUuU2NoZW1hLlNUUklORyxcbiAgICogICAgICB9XSxcbiAgICogICAgICBkYXRhRm9ybWF0OiBnbHVlLkRhdGFGb3JtYXQuQ1NWLFxuICAgKiAgICB9KTtcbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgcGFyYW1ldGVyIGlzIG5vdCBkZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlUGFyYW1ldGVycz86IFN0b3JhZ2VQYXJhbWV0ZXJbXTtcblxuICAvKipcbiAgICogVGhlIGtleS92YWx1ZSBwYWlycyBkZWZpbmUgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhYmxlLlxuICAgKiBUaGUga2V5L3ZhbHVlIHBhaXJzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgc3VibWl0dGVkIGFyZSBub3QgbGltaXRlZCwgaG93ZXZlciB0aGVpciBmdW5jdGlvbmFsaXR5IGlzIG5vdCBndWFyYW50ZWVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWdsdWUtdGFibGUtdGFibGVpbnB1dC5odG1sI2Nmbi1nbHVlLXRhYmxlLXRhYmxlaW5wdXQtcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBwYXJhbWV0ZXIgaXMgbm90IGRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGlzIHRhYmxlLlxuICAgKlxuICAgKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBhbGxvd3MgQXRoZW5hIHRvIGF1dG9tYXRpY2FsbHkgYWRkIG5ldyBwYXJ0aXRpb25zXG4gICAqIHdpdGhvdXQgcmVxdWlyaW5nIGBBTFRFUiBUQUJMRSBBREQgUEFSVElUSU9OYCBzdGF0ZW1lbnRzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL3BhcnRpdGlvbi1wcm9qZWN0aW9uLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwYXJ0aXRpb24gcHJvamVjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcGFydGl0aW9uUHJvamVjdGlvbj86IFBhcnRpdGlvblByb2plY3Rpb247XG59XG5cbi8qKlxuICogQSBHbHVlIHRhYmxlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGFibGVCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVGFibGUge1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCB0YWJsZUFybjogc3RyaW5nKTogSVRhYmxlIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBGbi5zZWxlY3QoMSwgRm4uc3BsaXQoJy8nLCBTdGFjay5vZihzY29wZSkuc3BsaXRBcm4odGFibGVBcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKS5yZXNvdXJjZU5hbWUhKSk7XG5cbiAgICByZXR1cm4gVGFibGVCYXNlLmZyb21UYWJsZUF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICB0YWJsZUFybixcbiAgICAgIHRhYmxlTmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVGFibGUgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBjcmVhdGluZyBjb25zdHJ1Y3QgKHVzdWFsbHkgYHRoaXNgKS5cbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QncyBpZC5cbiAgICogQHBhcmFtIGF0dHJzIEltcG9ydCBhdHRyaWJ1dGVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFRhYmxlQXR0cmlidXRlcyk6IElUYWJsZSB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVGFibGUge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHRhYmxlQXJuID0gYXR0cnMudGFibGVBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lID0gYXR0cnMudGFibGVOYW1lO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgdGFibGVSZXNvdXJjZTogQ2ZuVGFibGU7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBwYXJ0aXRpb25JbmRleGVzPzogUGFydGl0aW9uSW5kZXhbXTtcblxuICAvKipcbiAgICogRGF0YWJhc2UgdGhpcyB0YWJsZSBiZWxvbmdzIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhdGFiYXNlOiBJRGF0YWJhc2U7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSdzIGRhdGEgaXMgY29tcHJlc3NlZCBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcHJlc3NlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogRm9ybWF0IG9mIHRoaXMgdGFibGUncyBkYXRhIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQ7XG5cbiAgLyoqXG4gICAqIFRoaXMgdGFibGUncyBjb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbHVtbnM6IENvbHVtbltdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHRhYmxlJ3MgcGFydGl0aW9uIGtleXMgaWYgdGhlIHRhYmxlIGlzIHBhcnRpdGlvbmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcnRpdGlvbktleXM/OiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogVGhlIHRhYmxlcycgc3RvcmFnZSBkZXNjcmlwdG9yIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RvcmFnZVBhcmFtZXRlcnM/OiBTdG9yYWdlUGFyYW1ldGVyW107XG5cbiAgLyoqXG4gICAqIFRoaXMgdGFibGUncyBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGlmIGVuYWJsZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFydGl0aW9uUHJvamVjdGlvbj86IFBhcnRpdGlvblByb2plY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0YWJsZXMnIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWJsZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1nbHVlLXRhYmxlLXRhYmxlaW5wdXQuaHRtbCNjZm4tZ2x1ZS10YWJsZS10YWJsZWlucHV0LXBhcmFtZXRlcnNcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBQYXJ0aXRpb24gaW5kZXhlcyBtdXN0IGJlIGNyZWF0ZWQgb25lIGF0IGEgdGltZS4gVG8gYXZvaWRcbiAgICogcmFjZSBjb25kaXRpb25zLCB3ZSBzdG9yZSB0aGUgcmVzb3VyY2UgYW5kIGFkZCBkZXBlbmRlbmNpZXNcbiAgICogZWFjaCB0aW1lIGEgbmV3IHBhcnRpdGlvbiBpbmRleCBpcyBjcmVhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlczogQ3VzdG9tUmVzb3VyY2VbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBUYWJsZUJhc2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy50YWJsZU5hbWUgPz9cbiAgICAgICAgTGF6eS5zdHJpbmcoe1xuICAgICAgICAgIHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7fSkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgfSksXG4gICAgfSk7XG5cbiAgICB0aGlzLmRhdGFiYXNlID0gcHJvcHMuZGF0YWJhc2U7XG4gICAgdGhpcy5kYXRhRm9ybWF0ID0gcHJvcHMuZGF0YUZvcm1hdDtcblxuICAgIHZhbGlkYXRlU2NoZW1hKHByb3BzLmNvbHVtbnMsIHByb3BzLnBhcnRpdGlvbktleXMpO1xuICAgIHRoaXMuY29sdW1ucyA9IHByb3BzLmNvbHVtbnM7XG4gICAgdGhpcy5wYXJ0aXRpb25LZXlzID0gcHJvcHMucGFydGl0aW9uS2V5cztcbiAgICB0aGlzLnN0b3JhZ2VQYXJhbWV0ZXJzID0gcHJvcHMuc3RvcmFnZVBhcmFtZXRlcnM7XG4gICAgdGhpcy5wYXJ0aXRpb25Qcm9qZWN0aW9uID0gcHJvcHMucGFydGl0aW9uUHJvamVjdGlvbjtcbiAgICB0aGlzLnBhcmFtZXRlcnMgPSBwcm9wcy5wYXJhbWV0ZXJzID8/IHt9O1xuXG4gICAgdGhpcy5jb21wcmVzc2VkID0gcHJvcHMuY29tcHJlc3NlZCA/PyBmYWxzZTtcblxuICAgIHRoaXMudmFsaWRhdGVBbmRHZW5lcmF0ZVBhcnRpdGlvblByb2plY3Rpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG4gIHB1YmxpYyBhYnN0cmFjdCBncmFudFdyaXRlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuICBwdWJsaWMgYWJzdHJhY3QgZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBhcnRpdGlvbiBpbmRleCB0byB0aGUgdGFibGUuIFlvdSBjYW4gaGF2ZSBhIG1heGltdW0gb2YgMyBwYXJ0aXRpb25cbiAgICogaW5kZXhlcyB0byBhIHRhYmxlLiBQYXJ0aXRpb24gaW5kZXgga2V5cyBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSB0YWJsZSdzXG4gICAqIHBhcnRpdGlvbiBrZXlzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9wYXJ0aXRpb24taW5kZXhlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgYWRkUGFydGl0aW9uSW5kZXgoaW5kZXg6IFBhcnRpdGlvbkluZGV4KSB7XG4gICAgY29uc3QgbnVtUGFydGl0aW9ucyA9IHRoaXMucGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZXMubGVuZ3RoO1xuICAgIGlmIChudW1QYXJ0aXRpb25zID49IDMpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YE1heFBhcnRpdGlvbkluZGV4ZXNFeGNlZWRlZGAsICdNYXhpbXVtIG51bWJlciBvZiBwYXJ0aXRpb24gaW5kZXhlcyBhbGxvd2VkIGlzIDMnLCB0aGlzKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZVBhcnRpdGlvbkluZGV4KGluZGV4KTtcblxuICAgIGNvbnN0IGluZGV4TmFtZSA9IGluZGV4LmluZGV4TmFtZSA/PyB0aGlzLmdlbmVyYXRlSW5kZXhOYW1lKGluZGV4LmtleU5hbWVzKTtcbiAgICBjb25zdCBwcm92aWRlciA9IFBhcnRpdGlvbkluZGV4UHJvdmlkZXIuZ2V0T3JDcmVhdGUodGhpcyk7XG5cbiAgICAvLyBUaGUgZ3JhbnRzIGFyZSBpZGVudGljYWwgZm9yIGV2ZXJ5IGluZGV4IG9uIHRoaXMgdGFibGUsIHNvIG9ubHkgYWRkIHRoZW1cbiAgICAvLyBvbmNlLlxuICAgIGlmIChudW1QYXJ0aXRpb25zID09PSAwKSB7XG4gICAgICAvLyBBZGQgc2NvcGVkIHBlcm1pc3Npb25zIGZvciB0aGlzIHRhYmxlJ3MgR2x1ZSByZXNvdXJjZXNcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2F3c2dsdWUuaHRtbFxuICAgICAgY29uc3QgcmVzb3VyY2VzID0gW3RoaXMudGFibGVBcm4sIHRoaXMuZGF0YWJhc2UuZGF0YWJhc2VBcm4sIHRoaXMuZGF0YWJhc2UuY2F0YWxvZy5jYXRhbG9nQXJuXTtcblxuICAgICAgLy8gVGhlIGNhdGFsb2cncyBlbmNyeXB0aW9uIGlzIGZpeGVkIGF0IGNvbnN0cnVjdGlvbiwgc28gdGhlIGVuY3J5cHRpb24ga2V5XG4gICAgICAvLyAoaWYgYW55KSBpcyBrbm93biBoZXJlLiBHcmFudCB0aGUgaGFuZGxlcnMgYWNjZXNzIHRvIGl0LiBOby1vcCB3aGVuIHRoZVxuICAgICAgLy8gY2F0YWxvZyB1c2VzIGFuIEFXUy1tYW5hZ2VkIGtleSBvciBubyBlbmNyeXB0aW9uLlxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5kYXRhYmFzZS5jYXRhbG9nLmVuY3J5cHRpb25LZXk7XG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGNvbnN0IGdyYW50cyA9IEtleUdyYW50cy5mcm9tS2V5KGtleSk7XG4gICAgICAgIGdyYW50cy5kZWNyeXB0KHByb3ZpZGVyLm9uRXZlbnRIYW5kbGVyKTtcbiAgICAgICAgZ3JhbnRzLmRlY3J5cHQocHJvdmlkZXIuaXNDb21wbGV0ZUhhbmRsZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBCb3RoIGhhbmRsZXJzIGNyZWF0ZSwgZGVsZXRlLCBhbmQgaW5zcGVjdCBpbmRleGVzOiBvbkV2ZW50IGNyZWF0ZXMvZGVsZXRlcyBvblxuICAgICAgLy8gQ3JlYXRlL0RlbGV0ZS9VcGRhdGUsIGFuZCBpc0NvbXBsZXRlIHJlY3JlYXRlcyB0aGUgaW5kZXggd2hpbGUgZHJpdmluZyBhXG4gICAgICAvLyBrZXktY2hhbmdlIHVwZGF0ZSAoZGVsZXRlIC0+IHJlY3JlYXRlIC0+IEFDVElWRSkuIFVwZGF0ZVRhYmxlL0dldFRhYmxlIGFyZVxuICAgICAgLy8gcmVxdWlyZWQgYnkgdGhlIENyZWF0ZVBhcnRpdGlvbkluZGV4L0RlbGV0ZVBhcnRpdGlvbkluZGV4IEFQSXMuXG4gICAgICBjb25zdCBhY3Rpb25zID0gW1xuICAgICAgICAnZ2x1ZTpHZXRQYXJ0aXRpb25JbmRleGVzJyxcbiAgICAgICAgJ2dsdWU6Q3JlYXRlUGFydGl0aW9uSW5kZXgnLFxuICAgICAgICAnZ2x1ZTpEZWxldGVQYXJ0aXRpb25JbmRleCcsXG4gICAgICAgICdnbHVlOkdldFRhYmxlJyxcbiAgICAgICAgJ2dsdWU6VXBkYXRlVGFibGUnLFxuICAgICAgXTtcbiAgICAgIHByb3ZpZGVyLm9uRXZlbnRIYW5kbGVyLmFkZFRvUm9sZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7IGFjdGlvbnMsIHJlc291cmNlcyB9KSk7XG4gICAgICBwcm92aWRlci5pc0NvbXBsZXRlSGFuZGxlci5hZGRUb1JvbGVQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoeyBhY3Rpb25zLCByZXNvdXJjZXMgfSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2UgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgYHBhcnRpdGlvbi1pbmRleC0ke2luZGV4TmFtZX1gLCB7XG4gICAgICByZXNvdXJjZVR5cGU6ICdDdXN0b206OkdsdWVQYXJ0aXRpb25JbmRleCcsXG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgRGF0YWJhc2VOYW1lOiB0aGlzLmRhdGFiYXNlLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgSW5kZXhOYW1lOiBpbmRleE5hbWUsXG4gICAgICAgIEtleXM6IGluZGV4LmtleU5hbWVzLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIEVuc3VyZSBJQU0gcG9saWNpZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIHRoZSBjdXN0b20gcmVzb3VyY2UgaW52b2tlcyB0aGUgaGFuZGxlcnNcbiAgICBwYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShwcm92aWRlci5vbkV2ZW50SGFuZGxlci5yb2xlISk7XG4gICAgcGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kocHJvdmlkZXIuaXNDb21wbGV0ZUhhbmRsZXIucm9sZSEpO1xuXG4gICAgLy8gRGVwZW5kIG9uIHByZXZpb3VzIHBhcnRpdGlvbiBpbmRleCB0byBhdm9pZCByYWNlIGNvbmRpdGlvblxuICAgIGlmIChudW1QYXJ0aXRpb25zID4gMCkge1xuICAgICAgcGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5wYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlc1tudW1QYXJ0aXRpb25zLTFdKTtcbiAgICB9XG4gICAgdGhpcy5wYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlcy5wdXNoKHBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUluZGV4TmFtZShrZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWF4SW5kZXhMZW5ndGggPSA4MDtcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKGtleXMpIHx8IGtleXMuc29tZShrID0+IFRva2VuLmlzVW5yZXNvbHZlZChrKSkpIHtcbiAgICAgIC8vIFRoZSBpbmRleCBuYW1lIGlzIGRlcml2ZWQgZnJvbSB0aGUga2V5IG5hbWVzLCBzbyB0b2tlbml6ZWQga2V5cyBsZWF2ZVxuICAgICAgLy8gbm90aGluZyBzdGFibGUgdG8gZ2VuZXJhdGUgZnJvbTogYW55IGF1dG8tZ2VuZXJhdGVkIG5hbWUgd291bGQgaGF2ZSB0b1xuICAgICAgLy8gZmFsbCBiYWNrIHRvIHRoZSBpbmRleCdzIHBvc2l0aW9uIG9uIHRoZSB0YWJsZSwgd2hpY2ggc2hpZnRzIGlmIGluZGV4ZXNcbiAgICAgIC8vIGFyZSBhZGRlZCwgcmVtb3ZlZCwgb3IgcmVvcmRlcmVkIC0gc2lsZW50bHkgcmVwbGFjaW5nIGluZGV4ZXMgdGhhdCBkaWRcbiAgICAgIC8vIG5vdCBhY3R1YWxseSBjaGFuZ2UuIFJlcXVpcmUgYW4gZXhwbGljaXQsIHN0YWJsZSBuYW1lIGluc3RlYWQuXG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgVG9rZW5pemVkSW5kZXhLZXlzUmVxdWlyZU5hbWVgLFxuICAgICAgICAnY2Fubm90IGF1dG8tZ2VuZXJhdGUgYSBzdGFibGUgcGFydGl0aW9uIGluZGV4IG5hbWUgZnJvbSB0b2tlbml6ZWQga2V5IG5hbWVzOyAnICtcbiAgICAgICAgICAnc3BlY2lmeSBgaW5kZXhOYW1lYCBleHBsaWNpdGx5IHdoZW4gaW5kZXgga2V5cyBhcmUgbm90IGtub3duIGF0IHN5bnRoZXNpcyB0aW1lJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHByZWZpeCA9IGtleXMuam9pbignLScpICsgJy0nO1xuICAgIGNvbnN0IHVuaXF1ZUlkID0gTmFtZXMudW5pcXVlSWQodGhpcyk7XG4gICAgaWYgKHByZWZpeC5sZW5ndGggPCBtYXhJbmRleExlbmd0aCkge1xuICAgICAgLy8gQ29tbW9uIGNhc2U6IHRyaW0gdGhlIHVuaXF1ZUlkIHRhaWwgc28gdGhlIHdob2xlIG5hbWUgZml0cyB1bmRlciB0aGUgY2FwLlxuICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IE1hdGgubWF4KDAsIHVuaXF1ZUlkLmxlbmd0aCAtIChtYXhJbmRleExlbmd0aCAtIHByZWZpeC5sZW5ndGgpKTtcbiAgICAgIHJldHVybiBwcmVmaXggKyB1bmlxdWVJZC5zdWJzdHJpbmcoc3RhcnRJbmRleCk7XG4gICAgfVxuICAgIC8vIFRoZSBqb2luZWQga2V5IG5hbWVzIGFsb25lIGV4Y2VlZCB0aGUgYnVkZ2V0IChsb25nIGtleSBuYW1lcyksIHNvIHRyaW1taW5nXG4gICAgLy8gdGhlIHVuaXF1ZUlkIGlzIG5vdCBlbm91Z2guIFRydW5jYXRlIHRoZSBwcmVmaXggYW5kIGFwcGVuZCBhIGhhc2ggb2YgdGhlXG4gICAgLy8gdGFibGUgcGF0aCBwbHVzIHRoZSBmdWxsIGtleSBsaXN0LCBzbyB0d28gZGlmZmVyZW50IChsb25nKSBrZXkgc2V0cyBjYW5ub3RcbiAgICAvLyBjb2xsaWRlIGFmdGVyIHRydW5jYXRpb24uXG4gICAgY29uc3QgaGFzaCA9IG1kNWhhc2godW5pcXVlSWQgKyAnLScgKyBrZXlzLmpvaW4oJy0nKSkuc2xpY2UoMCwgOCk7XG4gICAgcmV0dXJuIHByZWZpeC5zdWJzdHJpbmcoMCwgbWF4SW5kZXhMZW5ndGggLSBoYXNoLmxlbmd0aCAtIDEpICsgJy0nICsgaGFzaDtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJ0aXRpb25JbmRleChpbmRleDogUGFydGl0aW9uSW5kZXgpIHtcbiAgICBpZiAoaW5kZXguaW5kZXhOYW1lICE9PSB1bmRlZmluZWQgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChpbmRleC5pbmRleE5hbWUpICYmIChpbmRleC5pbmRleE5hbWUubGVuZ3RoIDwgMSB8fCBpbmRleC5pbmRleE5hbWUubGVuZ3RoID4gMjU1KSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgSW5kZXhOYW1lTGVuZ3RoSW52YWxpZGAsIGBJbmRleCBuYW1lIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAyNTUgY2hhcmFjdGVycywgYnV0IGdvdCAke2luZGV4LmluZGV4TmFtZS5sZW5ndGh9YCwgdGhpcyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5wYXJ0aXRpb25LZXlzIHx8IHRoaXMucGFydGl0aW9uS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YE5vUGFydGl0aW9uS2V5c0ZvckluZGV4YCwgJ1RoZSB0YWJsZSBtdXN0IGhhdmUgcGFydGl0aW9uIGtleXMgdG8gY3JlYXRlIGEgcGFydGl0aW9uIGluZGV4JywgdGhpcyk7XG4gICAgfVxuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKGluZGV4LmtleU5hbWVzKSkge1xuICAgICAgY29uc3Qga2V5TmFtZXMgPSB0aGlzLnBhcnRpdGlvbktleXMubWFwKHBrID0+IHBrLm5hbWUpO1xuICAgICAgY29uc3QgY29uY3JldGVLZXlzID0gaW5kZXgua2V5TmFtZXMuZmlsdGVyKGsgPT4gIVRva2VuLmlzVW5yZXNvbHZlZChrKSk7XG4gICAgICBpZiAoY29uY3JldGVLZXlzLmxlbmd0aCA+IDAgJiYgIWNvbmNyZXRlS2V5cy5ldmVyeShrID0+IGtleU5hbWVzLmluY2x1ZGVzKGspKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBJbmRleEtleXNOb3RQYXJ0aXRpb25LZXlzYCwgYEFsbCBpbmRleCBrZXlzIG11c3QgYWxzbyBiZSBwYXJ0aXRpb24ga2V5cy4gR290ICR7aW5kZXgua2V5TmFtZXN9IGJ1dCBwYXJ0aXRpb24ga2V5IG5hbWVzIGFyZSAke2tleU5hbWVzfWAsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGFuZCBtZXJnZSBnZW5lcmF0ZWQgcGFyYW1ldGVycyBpbnRvIHRoaXMucGFyYW1ldGVycy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVBbmRHZW5lcmF0ZVBhcnRpdGlvblByb2plY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhcnRpdGlvblByb2plY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IHBhcnRpdGlvbiBrZXlzIGV4aXN0XG4gICAgaWYgKCF0aGlzLnBhcnRpdGlvbktleXMgfHwgdGhpcy5wYXJ0aXRpb25LZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YE5vUGFydGl0aW9uS2V5c0ZvclByb2plY3Rpb25gLFxuICAgICAgICAnVGhlIHRhYmxlIG11c3QgaGF2ZSBwYXJ0aXRpb24ga2V5cyB0byB1c2UgcGFydGl0aW9uIHByb2plY3Rpb24nLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aXRpb25LZXlOYW1lcyA9IHRoaXMucGFydGl0aW9uS2V5cy5tYXAocGsgPT4gcGsubmFtZSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBlYWNoIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICBmb3IgKGNvbnN0IFtjb2x1bW5OYW1lLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucGFydGl0aW9uUHJvamVjdGlvbikpIHtcbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgY29sdW1uIGlzIGEgcGFydGl0aW9uIGtleVxuICAgICAgaWYgKCFwYXJ0aXRpb25LZXlOYW1lcy5pbmNsdWRlcyhjb2x1bW5OYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBQcm9qZWN0aW9uQ29sdW1uTm90UGFydGl0aW9uS2V5YCxcbiAgICAgICAgICBgUGFydGl0aW9uIHByb2plY3Rpb24gY29sdW1uIFwiJHtjb2x1bW5OYW1lfVwiIG11c3QgYmUgYSBwYXJ0aXRpb24ga2V5LiBgICtcbiAgICAgICAgICBgUGFydGl0aW9uIGtleXMgYXJlOiAke3BhcnRpdGlvbktleU5hbWVzLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZSBDbG91ZEZvcm1hdGlvbiBwYXJhbWV0ZXJzXG4gICAgICBjb25zdCBnZW5lcmF0ZWRQYXJhbXMgPSBnZW5lcmF0ZVBhcnRpdGlvblByb2plY3Rpb25QYXJhbWV0ZXJzKGNvbHVtbk5hbWUsIGNvbmZpZyk7XG5cbiAgICAgIC8vIENoZWNrIGZvciBjb25mbGljdHMgd2l0aCBtYW51YWxseSBzcGVjaWZpZWQgcGFyYW1ldGVyc1xuICAgICAgY29uc3QgY29uZmxpY3RpbmdLZXlzID0gT2JqZWN0LmtleXMoZ2VuZXJhdGVkUGFyYW1zKS5maWx0ZXIoa2V5ID0+IGtleSBpbiB0aGlzLnBhcmFtZXRlcnMpO1xuICAgICAgaWYgKGNvbmZsaWN0aW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YFByb2plY3Rpb25QYXJhbWV0ZXJzQ29uZmxpY3RgLFxuICAgICAgICAgIGBQYXJ0aXRpb24gcHJvamVjdGlvbiBwYXJhbWV0ZXJzIGNvbmZsaWN0IHdpdGggbWFudWFsbHkgc3BlY2lmaWVkIHBhcmFtZXRlcnM6ICR7Y29uZmxpY3RpbmdLZXlzLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgICAnVXNlIHRoZSBwYXJ0aXRpb25Qcm9qZWN0aW9uIHByb3BlcnR5IGluc3RlYWQgb2YgbWFudWFsbHkgc3BlY2lmeWluZyBwcm9qZWN0aW9uIHBhcmFtZXRlcnMuJyxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBNZXJnZSBpbnRvIHRoaXMucGFyYW1ldGVyc1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBhcmFtZXRlcnMsIGdlbmVyYXRlZFBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGNvbmZsaWN0IHdpdGggcHJvamVjdGlvbi5lbmFibGVkXG4gICAgaWYgKCdwcm9qZWN0aW9uLmVuYWJsZWQnIGluIHRoaXMucGFyYW1ldGVycykge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YFByb2plY3Rpb25FbmFibGVkQ29uZmxpY3RgLFxuICAgICAgICAnUGFyYW1ldGVyIFwicHJvamVjdGlvbi5lbmFibGVkXCIgY29uZmxpY3RzIHdpdGggcGFydGl0aW9uUHJvamVjdGlvbiBjb25maWd1cmF0aW9uLiAnICtcbiAgICAgICAgJ1VzZSB0aGUgcGFydGl0aW9uUHJvamVjdGlvbiBwcm9wZXJ0eSBpbnN0ZWFkIG9mIG1hbnVhbGx5IHNwZWNpZnlpbmcgcHJvamVjdGlvbi5lbmFibGVkLicsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEVuYWJsZSBwYXJ0aXRpb24gcHJvamVjdGlvbiBnbG9iYWxseVxuICAgIHRoaXMucGFyYW1ldGVyc1sncHJvamVjdGlvbi5lbmFibGVkJ10gPSAndHJ1ZSc7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgdGhlIGdpdmVuIGlkZW50aXR5IGN1c3RvbSBwZXJtaXNzaW9ucyBvbiB0aGlzIHRhYmxlLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgbG93LWxldmVsIGVzY2FwZSBoYXRjaDogdGhlIGBhY3Rpb25zYCBhcmUgYXBwbGllZCB2ZXJiYXRpbSxcbiAgICogc2NvcGVkIHRvIHRoaXMgdGFibGUncyBBUk4uIFByZWZlciB0aGUgaW50ZW50LWJhc2VkIGBncmFudFJlYWRgIC9cbiAgICogYGdyYW50V3JpdGVgIC8gYGdyYW50UmVhZFdyaXRlYCBtZXRob2RzLCB3aGljaCBncmFudCBhIGN1cmF0ZWQgc2V0IG9mXG4gICAqIGFjdGlvbnMgYW5kIGFsc28gY292ZXIgdGhlIHVuZGVybHlpbmcgUzMgZGF0YS4gT25seSBwYXNzIHRoZSBzcGVjaWZpY1xuICAgKiBhY3Rpb25zIHRoZSBncmFudGVlIG5lZWRzIC0gYXZvaWQgc2VydmljZSB3aWxkY2FyZHMgc3VjaCBhcyBgZ2x1ZToqYC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIHRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIGFjdGlvbnMgdGhlIHNldCBvZiBHbHVlIGFjdGlvbnMgdG8gYWxsb3cgKGZvciBleGFtcGxlIGBnbHVlOkdldFRhYmxlYClcbiAgICovXG4gIHB1YmxpYyBncmFudChncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgYWN0aW9uczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICByZXNvdXJjZUFybnM6IFt0aGlzLnRhYmxlQXJuXSxcbiAgICAgIGFjdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgdGhlIGdpdmVuIGlkZW50aXR5IGN1c3RvbSBwZXJtaXNzaW9ucyBvbiB0aGlzIHRhYmxlIEFORCBpdHMgcGFyZW50XG4gICAqIGNhdGFsb2cgYW5kIGRhdGFiYXNlLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgbG93LWxldmVsIGVzY2FwZSBoYXRjaCBmb3IgYWN0aW9ucyAoc3VjaCBhcyBjZXJ0YWluIExha2VcbiAgICogRm9ybWF0aW9uIG9yIGNyYXdsZXIgb3BlcmF0aW9ucykgdGhhdCBtdXN0IGJlIGF1dGhvcml6ZWQgYWdhaW5zdCB0aGVcbiAgICogY2F0YWxvZyBhbmQgZGF0YWJhc2UgaW4gYWRkaXRpb24gdG8gdGhlIHRhYmxlLiBUaGUgYGFjdGlvbnNgIGFyZSBhcHBsaWVkXG4gICAqIHZlcmJhdGltIHRvIGFsbCB0aHJlZSBBUk5zICh0YWJsZSwgY2F0YWxvZywgZGF0YWJhc2UpLCBzbyBzY29wZSB0aGVtXG4gICAqIHRpZ2h0bHk6IHBhc3Mgb25seSB0aGUgc3BlY2lmaWMgYWN0aW9ucyB0aGUgZ3JhbnRlZSBuZWVkcyBhbmQgYXZvaWRcbiAgICogc2VydmljZSB3aWxkY2FyZHMgc3VjaCBhcyBgZ2x1ZToqYCwgd2hpY2ggd291bGQgZ3JhbnQgYnJvYWQgYWNjZXNzIGFjcm9zc1xuICAgKiBldmVyeSByZXNvdXJjZSBpbiB0aGUgY2F0YWxvZyBhbmQgZGF0YWJhc2UuXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSB0aGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBhY3Rpb25zIHRoZSBzZXQgb2YgR2x1ZSBhY3Rpb25zIHRvIGFsbG93IChmb3IgZXhhbXBsZSBgZ2x1ZTpHZXRUYWJsZWApXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRUb1VuZGVybHlpbmdSZXNvdXJjZXMoZ3JhbnRlZTogaWFtLklHcmFudGFibGUsIGFjdGlvbnM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgcmVzb3VyY2VBcm5zOiBbXG4gICAgICAgIHRoaXMudGFibGVBcm4sXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuY2F0YWxvZy5jYXRhbG9nQXJuLFxuICAgICAgICB0aGlzLmRhdGFiYXNlLmRhdGFiYXNlQXJuLFxuICAgICAgXSxcbiAgICAgIGFjdGlvbnMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHN0YWNrLXNpbmdsZXRvbiBjdXN0b20gcmVzb3VyY2UgcHJvdmlkZXIgdGhhdCBtYW5hZ2VzIEdsdWUgcGFydGl0aW9uIGluZGV4ZXMuXG4gKlxuICogQWxsIHBhcnRpdGlvbi1pbmRleGVkIHRhYmxlcyBpbiBhIHN0YWNrIHNoYXJlIGEgc2luZ2xlIHByb3ZpZGVyIChhbmQgaXRzIHR3b1xuICogTGFtYmRhIGhhbmRsZXJzKSB0byBhdm9pZCBwcm92aXNpb25pbmcgYSBwcm92aWRlciBmcmFtZXdvcmsgcGVyIHRhYmxlLiBUaGVcbiAqIHByb3ZpZGVyIGFuZCBoYW5kbGVycyBhcmUgZ3JvdXBlZCB1bmRlciB0aGlzIHNpbmdsZSBjb25zdHJ1Y3Qgc28gb25seSBvbmVcbiAqIGlkIGlzIHBsYWNlZCBhdCBzdGFjayBzY29wZS5cbiAqL1xuY2xhc3MgUGFydGl0aW9uSW5kZXhQcm92aWRlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdGFjay1zaW5nbGV0b24gcHJvdmlkZXIsIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IHlldCBleGlzdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0T3JDcmVhdGUoc2NvcGU6IENvbnN0cnVjdCk6IFBhcnRpdGlvbkluZGV4UHJvdmlkZXIge1xuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2Yoc2NvcGUpO1xuICAgIC8vIEEgZml4ZWQsIG5hbWVzcGFjZWQgaWQgbWFrZXMgdGhpcyBhIHN0YWNrIHNpbmdsZXRvbjogZXZlcnkgY2FsbCB3aXRoaW4gdGhlXG4gICAgLy8gc2FtZSBzdGFjayByZXNvbHZlcyB0byB0aGUgc2FtZSBjaGlsZCB2aWEgYHRyeUZpbmRDaGlsZGAuXG4gICAgY29uc3QgaWQgPSAnQGF3cy1jZGsvYXdzLWdsdWUtYWxwaGEuUGFydGl0aW9uSW5kZXhQcm92aWRlcic7XG4gICAgcmV0dXJuIChzdGFjay5ub2RlLnRyeUZpbmRDaGlsZChpZCkgYXMgUGFydGl0aW9uSW5kZXhQcm92aWRlcikgPz8gbmV3IFBhcnRpdGlvbkluZGV4UHJvdmlkZXIoc3RhY2ssIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBvbkV2ZW50SGFuZGxlcjogbGFtYmRhLkZ1bmN0aW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNDb21wbGV0ZUhhbmRsZXI6IGxhbWJkYS5GdW5jdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm92aWRlcjogY3IuUHJvdmlkZXI7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBUaGUgaGFuZGxlciBzb3VyY2UgbGl2ZXMgaW4gYEBhd3MtY2RrL2N1c3RvbS1yZXNvdXJjZS1oYW5kbGVyc2AgYW5kIGlzIGNvZGVcbiAgICAvLyBnZW5lcmF0ZWQgKyBhaXJsaWZ0ZWQgaW50byB0aGlzIHBhY2thZ2UgYXQgYnVpbGQgdGltZSAoc2VlXG4gICAgLy8gc2NyaXB0cy9haXJsaWZ0LWN1c3RvbS1yZXNvdXJjZS1oYW5kbGVycy5zaCksIGZvbGxvd2luZyB0aGUgcGF0dGVybiB1c2VkIGJ5IHRoZVxuICAgIC8vIG90aGVyIGFscGhhIG1vZHVsZXMgKGF3cy1hbXBsaWZ5LWFscGhhLCBhd3MtcmVkc2hpZnQtYWxwaGEpLiBUaGUgQGF3cy1zZGsvY2xpZW50LWdsdWVcbiAgICAvLyBtb2R1bGUgaXMgcHJvdmlkZWQgYnkgdGhlIExhbWJkYSBydW50aW1lIHJhdGhlciB0aGFuIGJ1bmRsZWQgaW50byB0aGUgYXNzZXQuXG4gICAgdGhpcy5vbkV2ZW50SGFuZGxlciA9IG5ldyBQYXJ0aXRpb25JbmRleE9uRXZlbnRGdW5jdGlvbih0aGlzLCAnSGFuZGxlcicsIHtcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgfSk7XG4gICAgdGhpcy5pc0NvbXBsZXRlSGFuZGxlciA9IG5ldyBQYXJ0aXRpb25JbmRleElzQ29tcGxldGVGdW5jdGlvbih0aGlzLCAnSXNDb21wbGV0ZScsIHtcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb3ZpZGVyID0gbmV3IGNyLlByb3ZpZGVyKHRoaXMsICdQcm92aWRlcicsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiB0aGlzLm9uRXZlbnRIYW5kbGVyLFxuICAgICAgaXNDb21wbGV0ZUhhbmRsZXI6IHRoaXMuaXNDb21wbGV0ZUhhbmRsZXIsXG4gICAgICBxdWVyeUludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICAgIHRvdGFsVGltZW91dDogRHVyYXRpb24ubWludXRlcygxNSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlcnZpY2UgdG9rZW4gdG8gd2lyZSBpbnRvIHBhcnRpdGlvbiBpbmRleCBjdXN0b20gcmVzb3VyY2VzLlxuICAgKi9cbiAgcHVibGljIGdldCBzZXJ2aWNlVG9rZW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm92aWRlci5zZXJ2aWNlVG9rZW47XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTY2hlbWEoY29sdW1uczogQ29sdW1uW10sIHBhcnRpdGlvbktleXM/OiBDb2x1bW5bXSk6IHZvaWQge1xuICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE5vQ29sdW1uc1NwZWNpZmllZGAsICd5b3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBjb2x1bW4gZm9yIHRoZSB0YWJsZScpO1xuICB9XG4gIC8vIENoZWNrIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjb2x1bW4gYW5kIG5vIGR1cGxpY2F0ZWQgY29sdW1uIG5hbWVzIG9yIHBhcnRpdGlvbiBrZXlzLlxuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAoY29sdW1ucy5jb25jYXQocGFydGl0aW9uS2V5cyB8fCBbXSkpLmZvckVhY2goY29sdW1uID0+IHtcbiAgICBpZiAobmFtZXMuaGFzKGNvbHVtbi5uYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBEdXBsaWNhdGVDb2x1bW5OYW1lYCwgYGNvbHVtbiBuYW1lcyBhbmQgcGFydGl0aW9uIGtleXMgbXVzdCBiZSB1bmlxdWUsIGJ1dCBcXCcke2NvbHVtbi5uYW1lfVxcJyBpcyBkdXBsaWNhdGVkYCk7XG4gICAgfVxuICAgIG5hbWVzLmFkZChjb2x1bW4ubmFtZSk7XG4gIH0pO1xufVxuIl19
@@ -57,7 +57,7 @@ let Table = (() => {
57
57
  Table = _classThis = _classDescriptor.value;
58
58
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
59
59
  }
60
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Table", version: "2.263.0-alpha.0" };
60
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Table", version: "2.265.0-alpha.0" };
61
61
  /** Uniquely identifies this class. */
62
62
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.Table';
63
63
  static {
@@ -41,7 +41,7 @@ const events = __importStar(require("aws-cdk-lib/aws-events"));
41
41
  */
42
42
  class TriggerSchedule {
43
43
  expressionString;
44
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.TriggerSchedule", version: "2.263.0-alpha.0" };
44
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.TriggerSchedule", version: "2.265.0-alpha.0" };
45
45
  /**
46
46
  * Creates a new TriggerSchedule instance with a cron expression.
47
47
  *
@@ -83,7 +83,7 @@ const trigger_options_1 = require("./trigger-options");
83
83
  * @see https://docs.aws.amazon.com/glue/latest/dg/about-triggers.html
84
84
  */
85
85
  class WorkflowBase extends cdk.Resource {
86
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.WorkflowBase", version: "2.263.0-alpha.0" };
86
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.WorkflowBase", version: "2.265.0-alpha.0" };
87
87
  /**
88
88
  * Extract workflowName from arn
89
89
  */
@@ -388,7 +388,7 @@ let Workflow = (() => {
388
388
  Workflow = _classThis = _classDescriptor.value;
389
389
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
390
390
  }
391
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Workflow", version: "2.263.0-alpha.0" };
391
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Workflow", version: "2.265.0-alpha.0" };
392
392
  /** Uniquely identifies this class. */
393
393
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.Workflow';
394
394
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-cdk/aws-glue-alpha",
3
- "version": "2.263.0-alpha.0",
3
+ "version": "2.265.0-alpha.0",
4
4
  "private": false,
5
5
  "description": "The CDK Construct Library for AWS::Glue",
6
6
  "main": "lib/index.js",
@@ -85,19 +85,19 @@
85
85
  },
86
86
  "license": "Apache-2.0",
87
87
  "devDependencies": {
88
- "@aws-cdk/cdk-build-tools": "2.263.0-alpha.0",
88
+ "@aws-cdk/cdk-build-tools": "2.265.0-alpha.0",
89
89
  "@aws-cdk/integ-runner": "^2.202.3",
90
- "@aws-cdk/integ-tests-alpha": "2.263.0-alpha.0",
91
- "@aws-cdk/custom-resource-handlers": "2.263.0-alpha.0",
92
- "@aws-cdk/pkglint": "2.263.0-alpha.0",
90
+ "@aws-cdk/integ-tests-alpha": "2.265.0-alpha.0",
91
+ "@aws-cdk/custom-resource-handlers": "2.265.0-alpha.0",
92
+ "@aws-cdk/pkglint": "2.265.0-alpha.0",
93
93
  "@types/jest": "^29.5.14",
94
- "aws-cdk-lib": "2.263.0",
94
+ "aws-cdk-lib": "2.265.0",
95
95
  "constructs": "^10.5.0",
96
96
  "jest": "^29.7.0"
97
97
  },
98
98
  "homepage": "https://github.com/aws/aws-cdk",
99
99
  "peerDependencies": {
100
- "aws-cdk-lib": "^2.263.0",
100
+ "aws-cdk-lib": "^2.265.0",
101
101
  "constructs": "^10.5.0"
102
102
  },
103
103
  "engines": {