@hmcts/ccd-case-ui-toolkit 5.0.46-fix-case-link → 5.0.47-fix-case-link

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.
@@ -56,7 +56,7 @@ export class FieldsUtils {
56
56
  if (!caseField) {
57
57
  return false;
58
58
  }
59
- return caseField.field_type.collection_field_type.id === 'CaseLink';
59
+ return caseField.field_type.collection_field_type.id === 'CaseLink' && caseField.id === 'caseLinks';
60
60
  }
61
61
  static cloneObject(obj) {
62
62
  return Object.assign({}, obj);
@@ -555,4 +555,4 @@ FieldsUtils.ɵprov = i0.ɵɵdefineInjectable({ token: FieldsUtils, factory: Fiel
555
555
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FieldsUtils, [{
556
556
  type: Injectable
557
557
  }], null, null); })();
558
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9zZXJ2aWNlcy9maWVsZHMvZmllbGRzLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUkxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDaEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzFELE9BQU8sRUFBb0IsU0FBUyxFQUF5RSxNQUFNLGNBQWMsQ0FBQztBQUNsSSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7QUFFbkYsV0FBVztBQUVYLE1BQU0sT0FBTyxXQUFXO0lBWWYsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQVE7UUFDdkMsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLFNBQVMsQ0FBQyxFQUFFO1lBQy9CLE9BQU8scUJBQXFCLENBQUMsSUFBSSxTQUFTLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNwRDtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBdUI7UUFDL0MsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekIsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FB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aUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO3dDQUNoRixXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztxQ0FDakQ7Z0NBQ0gsQ0FBQyxDQUFDLENBQUM7NkJBQ0o7NEJBQ0QsTUFBTTt5QkFDUDtxQkFDRjtnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsTUFBTTtTQUNQO0tBQ0Y7QUFDSCxDQUFDLENBQUM7c0VBM09TLFdBQVc7bURBQVgsV0FBVyxXQUFYLFdBQVc7dUZBQVgsV0FBVztjQUR2QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3VycmVuY3lQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgcGxhaW5Ub0NsYXNzRnJvbUV4aXN0IH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgV2l6YXJkUGFnZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvY2FzZS1lZGl0b3IvZG9tYWluJztcbmltcG9ydCB7IEFic3RyYWN0Rm9ybUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9wYWxldHRlL2Jhc2UtZmllbGQvYWJzdHJhY3QtZm9ybS1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRmxhZ0RldGFpbCwgRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcGFsZXR0ZS9jYXNlLWZsYWcvZG9tYWluL2Nhc2UtZmxhZy5tb2RlbCc7XG5pbXBvcnQgeyBDYXNlRmxhZ1N0YXR1cyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcGFsZXR0ZS9jYXNlLWZsYWcvZW51bXMvY2FzZS1mbGFnLXN0YXR1cy5lbnVtJztcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9wYWxldHRlL3V0aWxzJztcbmltcG9ydCB7IENhc2VFdmVudFRyaWdnZXIsIENhc2VGaWVsZCwgQ2FzZVRhYiwgQ2FzZVZpZXcsIEZpZWxkVHlwZSwgRmllbGRUeXBlRW51bSwgRml4ZWRMaXN0SXRlbSwgUHJlZGljYXRlIH0gZnJvbSAnLi4vLi4vZG9tYWluJztcbmltcG9ydCB7IEZvcm1hdFRyYW5zbGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vY2FzZS1maWVsZHMvZm9ybWF0LXRyYW5zbGF0b3Iuc2VydmljZSc7XG5cbi8vIEBkeW5hbWljXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmllbGRzVXRpbHMge1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGNhc2VMZXZlbENhc2VGbGFnc0ZpZWxkSWQgPSAnY2FzZUZsYWdzJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgY3VycmVuY3lQaXBlOiBDdXJyZW5jeVBpcGUgPSBuZXcgQ3VycmVuY3lQaXBlKCdlbi1HQicpO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBkYXRlUGlwZTogRGF0ZVBpcGUgPSBuZXcgRGF0ZVBpcGUobmV3IEZvcm1hdFRyYW5zbGF0b3JTZXJ2aWNlKCkpO1xuICAvLyBFVUktNDI0NC4gMyBkYXNoZXMgaW5zdGVhZCBvZiAxIHRvIG1ha2UgdGhpcyBsZXNzIGxpa2VseSB0byBjbGFzaCB3aXRoIGEgcmVhbCBmaWVsZC5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBMQUJFTF9TVUZGSVggPSAnLS0tTEFCRUwnO1xuICAvLyBIYW5kbGluZyBvZiBEeW5hbWljIExpc3RzIGluIENvbXBsZXggVHlwZXNcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9DT0xMRUNUSU9OID0gJ0NvbGxlY3Rpb24nO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0NPTVBMRVggPSAnQ29tcGxleCc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0VSVkVSX1JFU1BPTlNFX0ZJRUxEX1RZUEVfRFlOQU1JQ19MSVNUX1RZUEU6IEZpZWxkVHlwZUVudW1bXSA9IFsnRHluYW1pY0xpc3QnLCAnRHluYW1pY1JhZGlvTGlzdCddO1xuXG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFRvQ2FzZUZpZWxkKG9iajogYW55KTogQ2FzZUZpZWxkIHtcbiAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBDYXNlRmllbGQpKSB7XG4gICAgICByZXR1cm4gcGxhaW5Ub0NsYXNzRnJvbUV4aXN0KG5ldyBDYXNlRmllbGQoKSwgb2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9WYWx1ZXNNYXAoY2FzZUZpZWxkczogQ2FzZUZpZWxkW10pOiBhbnkge1xuICAgIGNvbnN0IHZhbHVlTWFwID0ge307XG4gICAgY2FzZUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIHZhbHVlTWFwW2ZpZWxkLmlkXSA9IEZpZWxkc1V0aWxzLnByZXBhcmVWYWx1ZShmaWVsZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlTWFwO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRUeXBlKGVsZW06IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbGVtKS5zbGljZSg4LCAtMSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzT2JqZWN0KGVsZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgZWxlbSA9PT0gJ29iamVjdCcgJiYgZWxlbSAhPT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNOb25FbXB0eU9iamVjdChlbGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc09iamVjdChlbGVtKSAmJiBPYmplY3Qua2V5cyhlbGVtKS5sZW5ndGggIT09IDA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzQXJyYXkoZWxlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZWxlbSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFyZUNvbGxlY3Rpb25WYWx1ZXNTaW1wbGVGaWVsZHMoZmllbGRWYWx1ZTogYW55W10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNPYmplY3QoZmllbGRWYWx1ZVswXVsndmFsdWUnXSkgJiYgIUFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZVswXVsndmFsdWUnXSkgJiYgZmllbGRWYWx1ZVswXVsndmFsdWUnXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0NvbGxlY3Rpb25PZlNpbXBsZVR5cGVzKGZpZWxkVmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQ29sbGVjdGlvbihmaWVsZFZhbHVlKSAmJiB0aGlzLmFyZUNvbGxlY3Rpb25WYWx1ZXNTaW1wbGVGaWVsZHMoZmllbGRWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTXVsdGlTZWxlY3RWYWx1ZShmb3JtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc05vbkVtcHR5QXJyYXkoZm9ybSkgJiYgIXRoaXMuaXNDb2xsZWN0aW9uV2l0aFZhbHVlKGZvcm0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc05vbkVtcHR5QXJyYXkocGFnZUZvcm1GaWVsZHM6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhZ2VGb3JtRmllbGRzKSAmJiBwYWdlRm9ybUZpZWxkc1swXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0NvbGxlY3Rpb24ocGFnZUZvcm1GaWVsZHM6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTm9uRW1wdHlBcnJheShwYWdlRm9ybUZpZWxkcykgJiYgdGhpcy5pc0NvbGxlY3Rpb25XaXRoVmFsdWUocGFnZUZvcm1GaWVsZHMpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0NvbGxlY3Rpb25XaXRoVmFsdWUocGFnZUZvcm1GaWVsZHM6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBhZ2VGb3JtRmllbGRzWzBdWyd2YWx1ZSddICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTGlua2VkQ2FzZXNDYXNlRmllbGQoY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBib29sZWFuIHtcbiAgICBpZiAoIWNhc2VGaWVsZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gY2FzZUZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmlkID09PSAnQ2FzZUxpbmsnO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjbG9uZU9iamVjdChvYmo6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9iaik7XG4gIH1cblxuICAvLyB0ZW1wb3JhcnkgZnVuY3Rpb24gdW50aWwgdGhpcyBjYW4gYmUgbW92ZWQgdG8gQ2FzZVZpZXcgY2xhc3MgKFJETS0yNjgxKVxuICBwdWJsaWMgc3RhdGljIGdldENhc2VGaWVsZHMoY2FzZVZpZXc6IENhc2VWaWV3KTogQ2FzZUZpZWxkW10ge1xuICAgIGNvbnN0IGNhc2VEYXRhRmllbGRzOiBDYXNlRmllbGRbXSA9IGNhc2VWaWV3LnRhYnMucmVkdWNlKChhY2M6IENhc2VGaWVsZFtdLCB0YWI6IENhc2VUYWIpID0+IHtcbiAgICAgIHJldHVybiBhY2MuY29uY2F0KHRhYi5maWVsZHMpO1xuICAgIH0sIFtdKTtcblxuICAgIGNvbnN0IG1ldGFkYXRhRmllbGRzOiBDYXNlRmllbGRbXSA9IGNhc2VWaWV3Lm1ldGFkYXRhRmllbGRzO1xuICAgIHJldHVybiBtZXRhZGF0YUZpZWxkcy5jb25jYXQoY2FzZURhdGFGaWVsZHMuZmlsdGVyKChjYXNlRmllbGQ6IENhc2VGaWVsZCkgPT4ge1xuICAgICAgcmV0dXJuIG1ldGFkYXRhRmllbGRzLmZpbmRJbmRleChtZXRhZGF0YUZpZWxkID0+IG1ldGFkYXRhRmllbGQuaWQgPT09IGNhc2VGaWVsZC5pZCkgPCAwO1xuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYWRkQ2FzZUZpZWxkQW5kQ29tcG9uZW50UmVmZXJlbmNlcyAoYzogQWJzdHJhY3RDb250cm9sLCBjZjogQ2FzZUZpZWxkLCBjb21wOiBBYnN0cmFjdEZvcm1GaWVsZENvbXBvbmVudCk6IHZvaWQge1xuICAgIGNbJ2Nhc2VGaWVsZCddID0gY2Y7XG4gICAgY1snY29tcG9uZW50J10gPSBjb21wO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBjaGVjayBvZiBhbiBhcnJheSBvciBvYmplY3QgYW5kIGl0cyBkZXNjZW5kYW50cyBmb3IgdGhlIHByZXNlbmNlIG9mIGFueSBub24tZW1wdHkgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBhcnJheSBvciBvYmplY3QgdG8gY2hlY2tcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheSBvciBvYmplY3QgKG9yIGEgZGVzY2VuZGFudCkgY29udGFpbnMgYXQgbGVhc3Qgb25lIG5vbi1lbXB0eSB2YWx1ZTsgYGZhbHNlYCBvdGhlcndpc2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY29udGFpbnNOb25FbXB0eVZhbHVlcyhvYmplY3Q6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKG9iamVjdCkubWFwKGtleSA9PiBvYmplY3Rba2V5XSk7XG4gICAgY29uc3Qgb2JqZWN0UmVmcyA9IFtdO1xuICAgIC8vIEFsc28gdGVzdCBmb3IgbnVtZXJpYyB2YWx1ZXMsIGFuZCBsZW5ndGggPiAwIGZvciBub24tbnVtZXJpYyB2YWx1ZXMgYmVjYXVzZSB0aGlzIGNvdmVycyBib3RoIHN0cmluZ3MgYW5kIGFycmF5cy5cbiAgICAvLyBOb3RlOiBEZWxpYmVyYXRlIHVzZSBvZiBub24tZXF1YWxpdHkgKCE9KSBvcGVyYXRvciBmb3IgbnVsbCBjaGVjaywgdG8gaGFuZGxlIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlcy5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHRyaXBsZS1lcXVhbHNcbiAgICBjb25zdCBoYXNOb25OdWxsUHJpbWl0aXZlID0gdmFsdWVzLnNvbWUoeCA9PiAoeCAhPSBudWxsICYmXG4gICAgICAoKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4LmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHx8IEFycmF5LmlzQXJyYXkoeClcbiAgICAgICAgPyAhb2JqZWN0UmVmcy5wdXNoKHgpXG4gICAgICAgIDogdHlwZW9mIHggPT09ICdudW1iZXInIHx8IHgubGVuZ3RoID4gMClcbiAgICApKTtcbiAgICByZXR1cm4gIWhhc05vbk51bGxQcmltaXRpdmUgPyBvYmplY3RSZWZzLnNvbWUoeSA9PiB0aGlzLmNvbnRhaW5zTm9uRW1wdHlWYWx1ZXMoeSkpIDogaGFzTm9uTnVsbFByaW1pdGl2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBoYW5kbGVOZXN0ZWREeW5hbWljTGlzdHMoKVxuICAgKiBSZWFzc2lnbnMgbGlzdF9pdGVtIGFuZCB2YWx1ZSBkYXRhIHRvIER5bmFtaWNMaXN0IGNoaWxkcmVuXG4gICAqIGRvd24gdGhlIHRyZWUuIFNlcnZlciByZXNwb25zZSByZXR1cm5zIGRhdGEgb25seSBpblxuICAgKiB0aGUgYHZhbHVlYCBvYmplY3Qgb2YgcGFyZW50IGNvbXBsZXggdHlwZVxuICAgKlxuICAgKiBFVUktMjUzMCBEeW5hbWljIExpc3RzIGZvciBFbGVtZW50cyBpbiBhIENvbXBsZXggVHlwZVxuICAgKlxuICAgKiBAcGFyYW0ganNvbkJvZHkgLSB7IGNhc2VfZmllbGRzOiBbIENhc2VGaWVsZCwgQ2FzZUZpZWxkIF0gfVxuICAgKi9cbiAgIHB1YmxpYyBzdGF0aWMgaGFuZGxlTmVzdGVkRHluYW1pY0xpc3RzKGpzb25Cb2R5OiB7IGNhc2VfZmllbGRzOiBDYXNlRmllbGRbXSB9KTogYW55IHtcblxuICAgIGlmIChqc29uQm9keS5jYXNlX2ZpZWxkcykge1xuICAgICAganNvbkJvZHkuY2FzZV9maWVsZHMuZm9yRWFjaChjYXNlRmllbGQgPT4ge1xuICAgICAgICBpZiAoY2FzZUZpZWxkLmZpZWxkX3R5cGUpIHtcbiAgICAgICAgICB0aGlzLnNldER5bmFtaWNMaXN0RGVmaW5pdGlvbihjYXNlRmllbGQsIGNhc2VGaWVsZC5maWVsZF90eXBlLCBjYXNlRmllbGQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ganNvbkJvZHk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwcmVwYXJlVmFsdWUoZmllbGQ6IENhc2VGaWVsZCk6IGFueSB7XG4gICAgaWYgKGZpZWxkLnZhbHVlKSB7XG4gICAgICByZXR1cm4gZmllbGQudmFsdWU7XG4gICAgfSBlbHNlIGlmIChmaWVsZC5pc0NvbXBsZXgoKSkge1xuICAgICAgY29uc3QgdmFsdWVNYXAgPSB7fTtcbiAgICAgIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMuZm9yRWFjaChjb21wbGV4RmllbGQgPT4ge1xuICAgICAgICB2YWx1ZU1hcFtjb21wbGV4RmllbGQuaWRdID0gRmllbGRzVXRpbHMucHJlcGFyZVZhbHVlKGNvbXBsZXhGaWVsZCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB2YWx1ZU1hcDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX01FUkdFX0ZVTkNUSU9OID0gZnVuY3Rpb24gbWVyZ2VGdW5jdGlvbihmaWVsZDogQ2FzZUZpZWxkLCByZXN1bHQ6IG9iamVjdCk6IHZvaWQge1xuICAgIGlmICghcmVzdWx0Lmhhc093blByb3BlcnR5KGZpZWxkLmlkKSkge1xuICAgICAgcmVzdWx0W2ZpZWxkLmlkXSA9IGZpZWxkLnZhbHVlO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMQUJFTF9NRVJHRV9GVU5DVElPTiA9IGZ1bmN0aW9uIG1lcmdlRnVuY3Rpb24oZmllbGQ6IENhc2VGaWVsZCwgcmVzdWx0OiBvYmplY3QpOiB2b2lkIHtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmVzdWx0ID0ge31cbiAgICB9XG4gICAgaWYgKCFyZXN1bHQuaGFzT3duUHJvcGVydHkoZmllbGQuaWQpKSB7XG4gICAgICByZXN1bHRbZmllbGQuaWRdID0gZmllbGQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBzd2l0Y2gtZGVmYXVsdFxuICAgIHN3aXRjaCAoZmllbGQuZmllbGRfdHlwZS50eXBlKSB7XG4gICAgICBjYXNlICdGaXhlZExpc3QnOlxuICAgICAgY2FzZSAnRml4ZWRSYWRpb0xpc3QnOiB7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5nZXRGaXhlZExpc3RMYWJlbEJ5Q29kZU9yRW1wdHkoZmllbGQsIHJlc3VsdFtmaWVsZC5pZF0gfHwgZmllbGQudmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ011bHRpU2VsZWN0TGlzdCc6IHtcbiAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHJlc3VsdFtmaWVsZC5pZF0gfHwgW107XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZCArIEZpZWxkc1V0aWxzLkxBQkVMX1NVRkZJWF0gPSBbXTtcbiAgICAgICAgZmllbGRWYWx1ZS5mb3JFYWNoKChjb2RlOiBhbnksIGlkeDogYW55KSA9PiB7XG4gICAgICAgICAgcmVzdWx0W2ZpZWxkLmlkICsgRmllbGRzVXRpbHMuTEFCRUxfU1VGRklYXVtpZHhdID0gRmllbGRzVXRpbHMuZ2V0Rml4ZWRMaXN0TGFiZWxCeUNvZGVPckVtcHR5KGZpZWxkLCBjb2RlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnTGFiZWwnOiB7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5nZXRMYWJlbChmaWVsZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnTW9uZXlHQlAnOiB7XG4gICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSAocmVzdWx0W2ZpZWxkLmlkXSB8fCBmaWVsZC52YWx1ZSk7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5nZXRNb25leUdCUChmaWVsZFZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdEYXRlJzoge1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gKHJlc3VsdFtmaWVsZC5pZF0gfHwgZmllbGQudmFsdWUpO1xuICAgICAgICByZXN1bHRbZmllbGQuaWRdID0gRmllbGRzVXRpbHMuZ2V0RGF0ZShmaWVsZFZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdDb21wbGV4Jzoge1xuICAgICAgICBpZiAocmVzdWx0W2ZpZWxkLmlkXSAmJiBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5mb3JFYWNoKChmOiBDYXNlRmllbGQpID0+IHtcbiAgICAgICAgICAgIGlmIChbJ0NvbGxlY3Rpb24nLCAnQ29tcGxleCcsICdNdWx0aVNlbGVjdExpc3QnXS5pbmRleE9mKGYuZmllbGRfdHlwZS50eXBlKSA+IC0xKSB7XG4gICAgICAgICAgICAgIEZpZWxkc1V0aWxzLkxBQkVMX01FUkdFX0ZVTkNUSU9OKGYsIHJlc3VsdFtmaWVsZC5pZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQ29sbGVjdGlvbic6IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSAocmVzdWx0W2ZpZWxkLmlkXSB8fCBmaWVsZC52YWx1ZSk7XG4gICAgICAgIGlmIChlbGVtZW50cykge1xuICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ01vbmV5R0JQJzoge1xuICAgICAgICAgICAgICAgIGVsZW0udmFsdWUgPSBGaWVsZHNVdGlscy5nZXRNb25leUdCUChlbGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICdEYXRlJzoge1xuICAgICAgICAgICAgICAgIGVsZW0udmFsdWUgPSBGaWVsZHNVdGlscy5nZXREYXRlKGVsZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ0NvbXBsZXgnOiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5mb3JFYWNoKChmOiBDYXNlRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFsnQ29sbGVjdGlvbicsICdDb21wbGV4JywgJ011bHRpU2VsZWN0TGlzdCddLmluZGV4T2YoZi5maWVsZF90eXBlLnR5cGUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBGaWVsZHNVdGlscy5MQUJFTF9NRVJHRV9GVU5DVElPTihmLCBlbGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGb3JtYXRzIGEgYE1vbmV5R0JQYCB2YWx1ZSB0byBpbmNsdWRlIGN1cnJlbmN5IHVuaXRzLlxuICAgKiBAcGFyYW0gZmllbGRWYWx1ZSBUaGUgQ3VycmVuY3lQaXBlIGV4cGVjdHMgYW4gYGFueWAgcGFyYW1ldGVyIHNvIHRoaXMgbXVzdCBhbHNvIGJlIGBhbnlgLFxuICAgKiBidXQgaXQgc2hvdWxkIGJlIFwibnVtYmVyLWxpa2VcIiAoZS5nLiwgJzEyMzQnKVxuICAgKiBAcmV0dXJucyBBIGZvcm1hdHRlZCBzdHJpbmcgKGUuZy4sIMKjMTIuMzQpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRNb25leUdCUChmaWVsZFZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWVsZFZhbHVlID8gRmllbGRzVXRpbHMuY3VycmVuY3lQaXBlLnRyYW5zZm9ybShmaWVsZFZhbHVlIC8gMTAwLCAnR0JQJywgJ3N5bWJvbCcpIDogZmllbGRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldExhYmVsKGZpZWxkVmFsdWU6IENhc2VGaWVsZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpZWxkVmFsdWUgPyBmaWVsZFZhbHVlLmxhYmVsIDogJyc7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXREYXRlKGZpZWxkVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZvcm1hdCBzcGVjaWZpZWQgaGVyZSB3YXNuJ3QgcHJldmlvdXNseSB3b3JraW5nIGFuZCBsb3RzIG9mIHRlc3RzIGRlcGVuZCBvbiBpdCBub3Qgd29ya2luZ1xuICAgICAgLy8gTm93IHRoYXQgZm9ybWF0cyB3b3JrIGNvcnJlY3RseSBtYW55IHRlc3Qgd291bGQgYnJlYWsgLSBhbmQgdGhpcyBjb3VsZCBhZmZlY3Qgc2VydmljZXMgd2hpY2ggbWF5IGRlcGVuZCBvblxuICAgICAgLy8gdGhlIG9yZ2luYWwgYmVoYXZpb3VyIG9mIHJldHVybmluZyBkYXRlcyBpbiBcImQgTU1NIHl5eXlcIlxuICAgICAgLy8gTm90ZSAtIHJlcGxhY2VkICdkJyB3aXRoICdEJyBhcyBkYXRlcGlwZSB1c2luZyBtb21lbnQgdG8gYXZvaWQgdGltZXpvbmUgZGlzY3JlcGFuY2llc1xuICAgICAgcmV0dXJuIEZpZWxkc1V0aWxzLmRhdGVQaXBlLnRyYW5zZm9ybShmaWVsZFZhbHVlLCBudWxsLCAnRCBNTU0geXl5eScpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHRGb3JJbnZhbGlkRmllbGQoJ0RhdGUnLCBmaWVsZFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRGaXhlZExpc3RMYWJlbEJ5Q29kZU9yRW1wdHkoZmllbGQ6IENhc2VGaWVsZCwgY29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZWxldmFudEl0ZW06IEZpeGVkTGlzdEl0ZW0gPSBjb2RlID8gZmllbGQuZmllbGRfdHlwZS5maXhlZF9saXN0X2l0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLmNvZGUgPT09IGNvZGUpIDogbnVsbDtcbiAgICByZXR1cm4gcmVsZXZhbnRJdGVtID8gcmVsZXZhbnRJdGVtLmxhYmVsIDogJyc7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB0ZXh0Rm9ySW52YWxpZEZpZWxkKHR5cGU6IHN0cmluZywgaW52YWxpZFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgeyBJbnZhbGlkICR7dHlwZX06ICR7aW52YWxpZFZhbHVlfSB9YDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNldER5bmFtaWNMaXN0RGVmaW5pdGlvbihjYXNlRmllbGQ6IENhc2VGaWVsZCwgY2FzZUZpZWxkVHlwZTogRmllbGRUeXBlLCByb290Q2FzZUZpZWxkOiBDYXNlRmllbGQpIHtcbiAgICBpZiAoY2FzZUZpZWxkVHlwZS50eXBlID09PSBGaWVsZHNVdGlscy5TRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9DT01QTEVYKSB7XG5cbiAgICAgIGNhc2VGaWVsZFR5cGUuY29tcGxleF9maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaXNEeW5hbWljRmllbGQgPSBGaWVsZHNVdGlscy5TRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9EWU5BTUlDX0xJU1RfVFlQRS5pbmRleE9mKGZpZWxkLmZpZWxkX3R5cGUudHlwZSkgIT09IC0xO1xuXG4gICAgICAgICAgaWYgKGlzRHluYW1pY0ZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBkeW5hbWljTGlzdFZhbHVlID0gdGhpcy5nZXREeW5hbWljTGlzdFZhbHVlKHJvb3RDYXNlRmllbGQudmFsdWUsIGZpZWxkLmlkKTtcbiAgICAgICAgICAgIGlmIChkeW5hbWljTGlzdFZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxpc3RfaXRlbXMgPSBkeW5hbWljTGlzdFZhbHVlWzBdLmxpc3RfaXRlbXM7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXhWYWx1ZSA9IGR5bmFtaWNMaXN0VmFsdWUubWFwKGRhdGEgPT4gZGF0YS52YWx1ZSk7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0ge1xuICAgICAgICAgICAgICAgIGxpc3RfaXRlbXMsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNvbXBsZXhWYWx1ZS5sZW5ndGggPiAwID8gY29tcGxleFZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0ge1xuICAgICAgICAgICAgICAgIC4uLnZhbHVlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGZpZWxkLmZvcm1hdHRlZF92YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5maWVsZC5mb3JtYXR0ZWRfdmFsdWUsXG4gICAgICAgICAgICAgICAgLi4udmFsdWVcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXREeW5hbWljTGlzdERlZmluaXRpb24oZmllbGQsIGZpZWxkLmZpZWxkX3R5cGUsIHJvb3RDYXNlRmllbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoY2FzZUZpZWxkVHlwZS50eXBlID09PSBGaWVsZHNVdGlscy5TRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9DT0xMRUNUSU9OKSB7XG4gICAgICBpZiAoY2FzZUZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUpIHtcbiAgICAgICAgdGhpcy5zZXREeW5hbWljTGlzdERlZmluaXRpb24oY2FzZUZpZWxkLCBjYXNlRmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZSwgcm9vdENhc2VGaWVsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RHluYW1pY0xpc3RWYWx1ZShqc29uQmxvY2s6IGFueSwga2V5OiBzdHJpbmcpIHtcblxuICAgIGNvbnN0IGRhdGEgPSBqc29uQmxvY2sgPyB0aGlzLmdldE5lc3RlZEZpZWxkVmFsdWVzKGpzb25CbG9jaywga2V5LCBbXSkgOiBbXTtcblxuICAgIHJldHVybiBkYXRhLmxlbmd0aCA+IDAgPyBkYXRhIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldE5lc3RlZEZpZWxkVmFsdWVzKGpzb25EYXRhOiBhbnksIGtleTogc3RyaW5nLCBvdXRwdXQ6IGFueVtdID0gW10pIHtcbiAgICBpZiAoanNvbkRhdGEgJiYganNvbkRhdGFba2V5XSkge1xuICAgICAgb3V0cHV0LnB1c2goanNvbkRhdGFba2V5XSk7XG4gICAgfSBlbHNlICB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnRLZXkgaW4ganNvbkRhdGEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uRGF0YSA9PT0gJ29iamVjdCcgJiYganNvbkRhdGEuaGFzT3duUHJvcGVydHkoZWxlbWVudEtleSkpIHtcbiAgICAgICAgICB0aGlzLmdldE5lc3RlZEZpZWxkVmFsdWVzKGpzb25EYXRhW2VsZW1lbnRLZXldLCBrZXksIG91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNGbGFnc0Nhc2VGaWVsZChjYXNlRmllbGQ6IENhc2VGaWVsZCk6IGJvb2xlYW4ge1xuICAgIGlmICghY2FzZUZpZWxkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaXNGbGFnc0ZpZWxkVHlwZShjYXNlRmllbGQuZmllbGRfdHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRmxhZ0xhdW5jaGVyQ2FzZUZpZWxkKGNhc2VGaWVsZDogQ2FzZUZpZWxkKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjYXNlRmllbGQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FzZUZpZWxkLmZpZWxkX3R5cGUudHlwZSA9PT0gJ0ZsYWdMYXVuY2hlcic7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRmxhZ3NGaWVsZFR5cGUoZmllbGRUeXBlOiBGaWVsZFR5cGUpOiBib29sZWFuIHtcbiAgICBpZiAoIWZpZWxkVHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlIGR1bW15IGZpZWxkIHR5cGUgSUQgb2YgXCJDYXNlRmxhZ1wiIGZvciB0ZXN0aW5nIGFuZCB0aGUgcmVhbCBmaWVsZCB0eXBlXG4gICAgLy8gSUQgb2YgXCJGbGFnc1wiXG4gICAgcmV0dXJuIChmaWVsZFR5cGUudHlwZSA9PT0gJ0NvbXBsZXgnICYmIChmaWVsZFR5cGUuaWQgPT09ICdDYXNlRmxhZycgfHwgZmllbGRUeXBlLmlkID09PSAnRmxhZ3MnKSk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBmbGFncyBkYXRhIGZyb20gYSBgQ2FzZUZpZWxkYCBpbnN0YW5jZSwgcmVjdXJzaW5nIGFuZCBpdGVyYXRpbmcgdGhyb3VnaCBzdWItZmllbGRzIG9mIGEgQ29tcGxleCBmaWVsZCBvclxuICAgKiBlYWNoIGZpZWxkIGluIGEgQ29sbGVjdGlvbiBmaWVsZC5cbiAgICpcbiAgICogQHBhcmFtIGZsYWdzIEFuIGFycmF5IGZvciBhY2N1bXVsYXRpbmcgZXh0cmFjdGVkIGZsYWdzIGRhdGEgYW5kIGRlcml2ZWQgYEZvcm1Hcm91cGAgcGF0aHNcbiAgICogQHBhcmFtIGNhc2VGaWVsZCBBIGBDYXNlRmllbGRgIGluc3RhbmNlIGZyb20gd2hpY2ggdG8gZXh0cmFjdCB0aGUgZmxhZ3MgZGF0YVxuICAgKiBAcGFyYW0gcGF0aFRvRmxhZ3NGb3JtR3JvdXAgQSAoZG90LWRlbGltaXRlZCkgc3RyaW5nIGZvciBjb25jYXRlbmF0aW5nIHRoZSBuYW1lIG9mIGVhY2ggY29udHJvbCB0aGF0IGZvcm1zIHRoZSBwYXRoXG4gICAqIHRvIHRoZSBgRm9ybUdyb3VwYCBmb3IgdGhlIGBGbGFnc2AgaW5zdGFuY2VcbiAgICogQHBhcmFtIHRvcExldmVsQ2FzZUZpZWxkIFRoZSB0b3AtbGV2ZWwgYENhc2VGaWVsZGAgdGhhdCBjb250YWlucyB0aGUgdmFsdWUgcHJvcGVydHkuIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBfb25seVxuICAgKiB0b3AtbGV2ZWxfIGBDYXNlRmllbGRgcyBjb250YWluIGFjdHVhbCB2YWx1ZXMgYW5kIGEgcmVmZXJlbmNlIG5lZWRzIHRvIGJlIG1haW50YWluZWQgdG8gc3VjaCBhIGZpZWxkXG4gICAqIEBwYXJhbSBjdXJyZW50VmFsdWUgVGhlIGN1cnJlbnQgdmFsdWUgb2JqZWN0IG9mIGEgYENhc2VGaWVsZGAgdGhhdCBpcyBhIHN1Yi1maWVsZCBvZiBhIG5vbiByb290LWxldmVsIENvbXBsZXggZmllbGQuXG4gICAqIFJlcXVpcmVkIGZvciBtYXBwaW5nIHRoZSBgQ2FzZUZpZWxkYCB2YWx1ZSB0byBhIGBGbGFnc2Agb2JqZWN0IGlmIGl0IGlzIGEgXCJGbGFnc1wiIGBDYXNlRmllbGRgLiAoRm9yIENvbXBsZXggdHlwZXMsXG4gICAqIG9ubHkgdGhlIF9yb290LWxldmVsXyBgQ2FzZUZpZWxkYCBjb250YWlucyBhIHZhbHVlIHByb3BlcnR5IC0gYWxsIHN1Yi1maWVsZHMsIGluY2x1ZGluZyBhbnkgbmVzdGVkIENvbXBsZXggZmllbGRzLFxuICAgKiBkbyAqbm90KiBjb250YWluIGFueSB2YWx1ZXMgdGhlbXNlbHZlcy4pXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoYCwgZWFjaCBpbnN0YW5jZSBjb21wcmlzaW5nIGEgYEZsYWdzYCBvYmplY3QgZGVyaXZlZCBmcm9tIGEgYENhc2VGaWVsZGBcbiAgICogb2YgdHlwZSBcIkZsYWdzXCIsIGFuZCB0aGUgZG90LWRlbGltaXRlZCBwYXRoIHN0cmluZyB0byB0aGUgY29ycmVzcG9uZGluZyBgRm9ybUdyb3VwYFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBleHRyYWN0RmxhZ3NEYXRhRnJvbUNhc2VGaWVsZChmbGFnczogRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aFtdLCBjYXNlRmllbGQ6IENhc2VGaWVsZCxcbiAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cDogc3RyaW5nLCB0b3BMZXZlbENhc2VGaWVsZDogQ2FzZUZpZWxkLCBjdXJyZW50VmFsdWU/OiBvYmplY3QpOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoW10ge1xuICAgICAgY29uc3QgZmllbGRUeXBlID0gY2FzZUZpZWxkLmZpZWxkX3R5cGU7XG4gICAgICBzd2l0Y2ggKGZpZWxkVHlwZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0NvbXBsZXgnOlxuICAgICAgICAgIC8vIElmIHRoZSBmaWVsZCBpcyBhIEZsYWdzIENhc2VGaWVsZCAodGhlc2UgYXJlIGltcGxlbWVudGVkIGFzIENvbXBsZXggdHlwZXMpLCBpdCBjYW4gYmUgbWFwcGVkIHRvIGEgRmxhZ3NcbiAgICAgICAgICAvLyBvYmplY3QgaW1tZWRpYXRlbHlcbiAgICAgICAgICBpZiAoRmllbGRzVXRpbHMuaXNGbGFnc0Nhc2VGaWVsZChjYXNlRmllbGQpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgRmxhZ3MgQ2FzZUZpZWxkIGhhcyBhIHZhbHVlLCBpdCBpcyBhIHJvb3QtbGV2ZWwgQ29tcGxleCBmaWVsZDsgaWYgaXQgZG9lcyBub3QsIGl0IGlzIGEgRmxhZ3NcbiAgICAgICAgICAgIC8vIENhc2VGaWVsZCB0aGF0IGlzIGEgc3ViLWZpZWxkIHdpdGhpbiBhbm90aGVyIENvbXBsZXggZmllbGQsIHNvIHVzZSB0aGUgY3VycmVudFZhbHVlIHZhbHVlIChpZiBhbnkpXG4gICAgICAgICAgICAvLyBpbnN0ZWFkLiBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXMgdGhlIFwiY2FzZUZsYWdzXCIgRmxhZ3MgQ2FzZUZpZWxkLCB3aGljaCB3aWxsIGhhdmUgYW4gZW1wdHkgb2JqZWN0IHZhbHVlXG4gICAgICAgICAgICAvLyBpbml0aWFsbHkgb3IgY291bGQgYmUgbnVsbCBvciB1bmRlZmluZWQsIGJlY2F1c2Ugbm8gcGFydHkgbmFtZSBpcyByZXF1aXJlZFxuICAgICAgICAgICAgaWYgKGNhc2VGaWVsZC52YWx1ZSAmJiBGaWVsZHNVdGlscy5pc05vbkVtcHR5T2JqZWN0KGNhc2VGaWVsZC52YWx1ZSkgfHxcbiAgICAgICAgICAgICAgY2FzZUZpZWxkLmlkID09PSB0aGlzLmNhc2VMZXZlbENhc2VGbGFnc0ZpZWxkSWQpIHtcbiAgICAgICAgICAgICAgZmxhZ3MucHVzaCh0aGlzLm1hcENhc2VGaWVsZFRvRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aE9iamVjdChjYXNlRmllbGQsIHBhdGhUb0ZsYWdzRm9ybUdyb3VwKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZSAmJiBGaWVsZHNVdGlscy5pc05vbkVtcHR5T2JqZWN0KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXAgKz0gYC4ke2Nhc2VGaWVsZC5pZH1gO1xuICAgICAgICAgICAgICBmbGFncy5wdXNoKHRoaXMubWFwVmFsdWVUb0ZsYWdzV2l0aEZvcm1Hcm91cFBhdGhPYmplY3QoXG4gICAgICAgICAgICAgICAgY2FzZUZpZWxkLmlkLCBjdXJyZW50VmFsdWUsIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLCB0b3BMZXZlbENhc2VGaWVsZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNhc2VGaWVsZC52YWx1ZSA/IGNhc2VGaWVsZC52YWx1ZSA6IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBGaWVsZHNVdGlscy5pc05vbkVtcHR5T2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICBmbGFncyA9IGZpZWxkVHlwZS5jb21wbGV4X2ZpZWxkcy5yZWR1Y2UoKGZsYWdzT2ZDb21wbGV4RmllbGQsIHN1YkZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdEZsYWdzRGF0YUZyb21DYXNlRmllbGQoXG4gICAgICAgICAgICAgICAgICBmbGFnc09mQ29tcGxleEZpZWxkLCBzdWJGaWVsZCwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkLCB2YWx1ZVtzdWJGaWVsZC5pZF0pO1xuICAgICAgICAgICAgICB9LCBmbGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBGb3IgYSBDb2xsZWN0aW9uIGZpZWxkLCB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgZGlyZWN0bHkgYXMga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBDYXNlRmllbGQncyB2YWx1ZSBwcm9wZXJ0eVxuICAgICAgICAvLyBhcyBhbiBhcnJheSwgdW5sZXNzIHRoZSBjb2xsZWN0aW9uIGlzIGEgc3ViLWZpZWxkIG9mIGEgQ29tcGxleCB0eXBlIC0gc3ViLWZpZWxkcyBuZXZlciBjb250YWluIHZhbHVlc1xuICAgICAgICBjYXNlICdDb2xsZWN0aW9uJzpcbiAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgY29sbGVjdGlvbiBvZiBGbGFncyBDYXNlRmllbGRzLCB0aGVzZSBjYW4gYmUgbWFwcGVkIHRvIEZsYWdzIG9iamVjdHMgaW1tZWRpYXRlbHlcbiAgICAgICAgICBpZiAoRmllbGRzVXRpbHMuaXNGbGFnc0ZpZWxkVHlwZShmaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIENvbGxlY3Rpb24gQ2FzZUZpZWxkIGhhcyBhIHZhbHVlIChhbiBhcnJheSksIGl0IGlzIGEgcm9vdC1sZXZlbCBDb2xsZWN0aW9uIGZpZWxkOyBpZiBpdCBkb2VzIG5vdCxcbiAgICAgICAgICAgIC8vIGl0IGlzIGEgQ29sbGVjdGlvbiBDYXNlRmllbGQgdGhhdCBpcyBhIHN1Yi1maWVsZCB3aXRoaW4gYSBDb21wbGV4IGZpZWxkLCBzbyB1c2UgdGhlIGN1cnJlbnRWYWx1ZSB2YWx1ZVxuICAgICAgICAgICAgLy8gKGlmIGFueSkgaW5zdGVhZFxuICAgICAgICAgICAgY29uc3QgcGF0aEZyYWdtZW50ID0gcGF0aFRvRmxhZ3NGb3JtR3JvdXAgKz0gJy5pbmRleC52YWx1ZSc7XG4gICAgICAgICAgICBpZiAoY2FzZUZpZWxkLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGNhc2VGaWVsZC52YWx1ZS5mb3JFYWNoKChpdGVtOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBvYmplY3Q7IH0sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBBdCBlYWNoIGl0ZXJhdGlvbiwgcmVwbGFjZSB0aGUgXCJpbmRleFwiIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBpbmRleFxuICAgICAgICAgICAgICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwID0gcGF0aEZyYWdtZW50LnJlcGxhY2UoJ2luZGV4JywgaW5kZXgudG9TdHJpbmcoMTApKTtcbiAgICAgICAgICAgICAgICBmbGFncy5wdXNoKFxuICAgICAgICAgICAgICAgICAgdGhpcy5tYXBWYWx1ZVRvRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aE9iamVjdChpdGVtLmlkLCBpdGVtLnZhbHVlLCBwYXRoVG9GbGFnc0Zvcm1Hcm91cCwgY2FzZUZpZWxkKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgKGN1cnJlbnRWYWx1ZSBhcyBbXSkuZm9yRWFjaCgoaXRlbTogeyBpZDogc3RyaW5nOyB2YWx1ZTogb2JqZWN0OyB9LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXAgPSBwYXRoRnJhZ21lbnQucmVwbGFjZSgnaW5kZXgnLCBpbmRleC50b1N0cmluZygxMCkpO1xuICAgICAgICAgICAgICAgIGZsYWdzLnB1c2goXG4gICAgICAgICAgICAgICAgICB0aGlzLm1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGl0ZW0uaWQsIGl0ZW0udmFsdWUsIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLCB0b3BMZXZlbENhc2VGaWVsZCkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBsZXgnICYmIGZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChjYXNlRmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgLy8gUGVyZm9ybSBhIHJlZHVjdGlvbiBvdmVyIGVhY2ggQ29tcGxleCBmaWVsZCdzIHN1Yi1maWVsZHMgKHNpbWlsYXIgdG8gd2hhdCBpcyBkb25lIGFib3ZlIGZvciBub24tRmxhZ3NcbiAgICAgICAgICAgICAgLy8gQ29tcGxleCBmaWVsZHMpXG4gICAgICAgICAgICAgIC8vIChDYW5ub3QganVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gcmVjdXJzaXZlbHkgZm9yIGVhY2ggQ29tcGxleCBmaWVsZCBpbiB0aGUgY29sbGVjdGlvbiBiZWNhdXNlIHRoZSBDYXNlRmllbGRcbiAgICAgICAgICAgICAgLy8gZm9yIGVhY2ggb25lIGlzIG5vdCBwYXJ0IG9mIHRoZSBjb2xsZWN0aW9uKVxuICAgICAgICAgICAgICBjb25zdCBwYXRoRnJhZ21lbnQgPSBwYXRoVG9GbGFnc0Zvcm1Hcm91cCArPSAnLmluZGV4LnZhbHVlJztcbiAgICAgICAgICAgICAgY2FzZUZpZWxkLnZhbHVlLmZvckVhY2goKGl0ZW06IHsgaWQ6IHN0cmluZzsgdmFsdWU6IG9iamVjdDsgfSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEF0IGVhY2ggaXRlcmF0aW9uLCByZXBsYWNlIHRoZSBcImluZGV4XCIgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGluZGV4XG4gICAgICAgICAgICAgICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXAgPSBwYXRoRnJhZ21lbnQucmVwbGFjZSgnaW5kZXgnLCBpbmRleC50b1N0cmluZygxMCkpO1xuICAgICAgICAgICAgICAgIGZsYWdzID0gZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5yZWR1Y2UoKGZsYWdzT2ZDb21wbGV4RmllbGQsIHN1YkZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RmxhZ3NEYXRhRnJvbUNhc2VGaWVsZChcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3NPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQsIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLCB0b3BMZXZlbENhc2VGaWVsZCwgaXRlbS52YWx1ZVtzdWJGaWVsZC5pZF0pO1xuICAgICAgICAgICAgICAgIH0sIGZsYWdzKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIElnbm9yZSBhbGwgb3RoZXIgZmllbGQgdHlwZXNcbiAgICAgIH1cbiAgICAgIHJldHVybiBmbGFncztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG1hcENhc2VGaWVsZFRvRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aE9iamVjdChjYXNlRmllbGQ6IENhc2VGaWVsZCxcbiAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cDogc3RyaW5nKTogRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aCB7XG4gICAgICByZXR1cm4gdGhpcy5tYXBWYWx1ZVRvRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aE9iamVjdChjYXNlRmllbGQuaWQsIGNhc2VGaWVsZC52YWx1ZSwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIGNhc2VGaWVsZCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBtYXBWYWx1ZVRvRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aE9iamVjdChpZDogc3RyaW5nLCB2YWx1ZTogb2JqZWN0LFxuICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwOiBzdHJpbmcsIGNhc2VGaWVsZDogQ2FzZUZpZWxkKTogRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aCB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmbGFnczoge1xuICAgICAgICAgIGZsYWdzQ2FzZUZpZWxkSWQ6IGlkLFxuICAgICAgICAgIHBhcnR5TmFtZTogdmFsdWUgPyB2YWx1ZVsncGFydHlOYW1lJ10gOiBudWxsLFxuICAgICAgICAgIHJvbGVPbkNhc2U6IHZhbHVlID8gdmFsdWVbJ3JvbGVPbkNhc2UnXSA6IG51bGwsXG4gICAgICAgICAgZGV0YWlsczogdmFsdWUgJiYgdmFsdWVbJ2RldGFpbHMnXSAmJiB2YWx1ZVsnZGV0YWlscyddLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gKHZhbHVlWydkZXRhaWxzJ10gYXMgYW55W10pLm1hcChkZXRhaWwgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgLi4uT2JqZWN0LmtleXMoZGV0YWlsLnZhbHVlKS5tYXAoayA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGlkIHByb3BlcnR5IHNldCBiZWxvdyB3aWxsIGJlIG51bGwgZm9yIGEgbmV3IGNhc2UgZmxhZywgYW5kIGEgdW5pcXVlIGlkIHJldHVybmVkIGZyb20gQ0NEIHdoZW5cbiAgICAgICAgICAgICAgICAvLyB1cGRhdGluZyBhbiBleGlzdGluZyBmbGFnXG4gICAgICAgICAgICAgICAgc3dpdGNoIChrKSB7XG4gICAgICAgICAgICAgICAgICAvLyBUaGVzZSB0d28gZmllbGRzIGFyZSBkYXRlLXRpbWUgZmllbGRzXG4gICAgICAgICAgICAgICAgICBjYXNlICdkYXRlVGltZU1vZGlmaWVkJzpcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGVUaW1lQ3JlYXRlZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7W2tdOiBkZXRhaWwudmFsdWVba10gPyBuZXcgRGF0ZShkZXRhaWwudmFsdWVba10pIDogbnVsbCwgaWQ6IGRldGFpbC5pZH07XG4gICAgICAgICAgICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIGEgXCJ5ZXMvbm9cIiBmaWVsZFxuICAgICAgICAgICAgICAgICAgY2FzZSAnaGVhcmluZ1JlbGV2YW50JzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldGFpbC52YWx1ZVtrXS50b1VwcGVyQ2FzZSgpID09PSAnWUVTJyA/IHtba106IHRydWUsIGlkOiBkZXRhaWwuaWR9IDoge1trXTogZmFsc2UsIGlkOiBkZXRhaWwuaWR9O1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtba106IGRldGFpbC52YWx1ZVtrXSwgaWQ6IGRldGFpbC5pZH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KSBhcyBGbGFnRGV0YWlsW11cbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICB9LFxuICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCxcbiAgICAgICAgY2FzZUZpZWxkXG4gICAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvdW50IGFjdGl2ZSBmbGFncyBpbiBhIGBDYXNlRmllbGRgIGluc3RhbmNlLCByZWN1cnNpbmcgYW5kIGl0ZXJhdGluZyB0aHJvdWdoIHN1Yi1maWVsZHMgb2YgYSBDb21wbGV4IGZpZWxkIG9yIGVhY2hcbiAgICogZmllbGQgaW4gYSBDb2xsZWN0aW9uIGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0gYWN0aXZlQ291bnQgQW4gYWNjdW11bGF0aW9uIG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgYWN0aXZlIGZsYWdzXG4gICAqIEBwYXJhbSBjYXNlRmllbGQgQSBgQ2FzZUZpZWxkYCBpbnN0YW5jZSBmb3Igd2hpY2ggdG8gY291bnQgdGhlIGFjdGl2ZSBmbGFnc1xuICAgKiBAcGFyYW0gY3VycmVudFZhbHVlIFRoZSBjdXJyZW50IHZhbHVlIG9iamVjdCBvZiBhIGBDYXNlRmllbGRgIHRoYXQgaXMgYSBzdWItZmllbGQgb2YgYSBub24gcm9vdC1sZXZlbCBDb21wbGV4IGZpZWxkLlxuICAgKiAoRm9yIENvbXBsZXggdHlwZXMsIG9ubHkgdGhlIF9yb290LWxldmVsXyBgQ2FzZUZpZWxkYCBjb250YWlucyBhIHZhbHVlIHByb3BlcnR5IC0gYWxsIHN1Yi1maWVsZHMsIGluY2x1ZGluZyBhbnlcbiAgICogbmVzdGVkIENvbXBsZXggZmllbGRzLCBkbyAqbm90KiBjb250YWluIGFueSB2YWx1ZXMgdGhlbXNlbHZlcy4pXG4gICAqIEByZXR1cm5zIFRoZSBjb3VudCBvZiBhY3RpdmUgZmxhZ3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY291bnRBY3RpdmVGbGFnc0luQ2FzZUZpZWxkKGFjdGl2ZUNvdW50OiBudW1iZXIsIGNhc2VGaWVsZDogQ2FzZUZpZWxkLCBjdXJyZW50VmFsdWU/OiBvYmplY3QpOiBudW1iZXIge1xuICAgICAgY29uc3QgZmllbGRUeXBlID0gY2FzZUZpZWxkLmZpZWxkX3R5cGU7XG4gICAgICBzd2l0Y2ggKGZpZWxkVHlwZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0NvbXBsZXgnOlxuICAgICAgICAgIGlmIChGaWVsZHNVdGlscy5pc0ZsYWdzQ2FzZUZpZWxkKGNhc2VGaWVsZCkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBGbGFncyBDYXNlRmllbGQgaGFzIGEgdmFsdWUsIGl0IGlzIGEgcm9vdC1sZXZlbCBDb21wbGV4IGZpZWxkOyBpZiBpdCBkb2VzIG5vdCwgaXQgaXMgYSBGbGFnc1xuICAgICAgICAgICAgLy8gQ2FzZUZpZWxkIHRoYXQgaXMgYSBzdWItZmllbGQgd2l0aGluIGFub3RoZXIgQ29tcGxleCBmaWVsZCwgc28gdXNlIHRoZSBjdXJyZW50VmFsdWUgdmFsdWUgKGlmIGFueSkgaW5zdGVhZFxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjYXNlRmllbGQudmFsdWUgPyBjYXNlRmllbGQudmFsdWUgOiBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgRmllbGRzVXRpbHMuaXNOb25FbXB0eU9iamVjdCh2YWx1ZSkgJiYgdmFsdWUuZGV0YWlscykge1xuICAgICAgICAgICAgICBhY3RpdmVDb3VudCA9IHZhbHVlLmRldGFpbHMucmVkdWNlKFxuICAgICAgICAgICAgICAgIChjb3VudCwgZGV0YWlsKSA9PiBkZXRhaWwudmFsdWUuc3RhdHVzID09PSBDYXNlRmxhZ1N0YXR1cy5BQ1RJVkUgPyBjb3VudCArIDEgOiBjb3VudCxcbiAgICAgICAgICAgICAgICBhY3RpdmVDb3VudFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNhc2VGaWVsZC52YWx1ZSA/IGNhc2VGaWVsZC52YWx1ZSA6IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBGaWVsZHNVdGlscy5pc05vbkVtcHR5T2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICBhY3RpdmVDb3VudCA9IGZpZWxkVHlwZS5jb21wbGV4X2ZpZWxkcy5yZWR1Y2UoKGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb3VudEFjdGl2ZUZsYWdzSW5DYXNlRmllbGQoXG4gICAgICAgICAgICAgICAgICBhY3RpdmVGbGFnc0NvdW50T2ZDb21wbGV4RmllbGQsXG4gICAgICAgICAgICAgICAgICBzdWJGaWVsZCxcbiAgICAgICAgICAgICAgICAgIHZhbHVlW3N1YkZpZWxkLmlkXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0sIGFjdGl2ZUNvdW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIEZvciBhIENvbGxlY3Rpb24gZmllbGQsIHRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBkaXJlY3RseSBhcyBrZXktdmFsdWUgcGFpcnMgaW4gdGhlIENhc2VGaWVsZCdzIHZhbHVlIHByb3BlcnR5XG4gICAgICAgIC8vIGFzIGFuIGFycmF5LCB1bmxlc3MgdGhlIGNvbGxlY3Rpb24gaXMgYSBzdWItZmllbGQgb2YgYSBDb21wbGV4IHR5cGUgLSBzdWItZmllbGRzIG5ldmVyIGNvbnRhaW4gdmFsdWVzXG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgIGlmIChGaWVsZHNVdGlscy5pc0ZsYWdzRmllbGRUeXBlKGZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgQ29sbGVjdGlvbiBDYXNlRmllbGQgaGFzIGEgdmFsdWUgKGFuIGFycmF5KSwgaXQgaXMgYSByb290LWxldmVsIENvbGxlY3Rpb24gZmllbGQ7IGlmIGl0IGRvZXMgbm90LFxuICAgICAgICAgICAgLy8gaXQgaXMgYSBDb2xsZWN0aW9uIENhc2VGaWVsZCB0aGF0IGlzIGEgc3ViLWZpZWxkIHdpdGhpbiBhIENvbXBsZXggZmllbGQsIHNvIHVzZSB0aGUgY3VycmVudFZhbHVlIHZhbHVlXG4gICAgICAgICAgICAvLyAoaWYgYW55KSBpbnN0ZWFkXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNhc2VGaWVsZC52YWx1ZSA/IGNhc2VGaWVsZC52YWx1ZSA6IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKChpdGVtOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBvYmplY3Q7IH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS52YWx1ZVsnZGV0YWlscyddKSB7XG4gICAgICAgICAgICAgICAgICBhY3RpdmVDb3VudCA9IGl0ZW0udmFsdWVbJ2RldGFpbHMnXS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgIChjb3VudCwgZGV0YWlsKSA9PiBkZXRhaWwudmFsdWUuc3RhdHVzID09PSBDYXNlRmxhZ1N0YXR1cy5BQ1RJVkUgPyBjb3VudCArIDEgOiBjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlQ291bnRcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBsZXgnICYmIGZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChjYXNlRmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgLy8gUGVyZm9ybSBhIHJlZHVjdGlvbiBvdmVyIGVhY2ggQ29tcGxleCBmaWVsZCdzIHN1Yi1maWVsZHMgKHNpbWlsYXIgdG8gd2hhdCBpcyBkb25lIGFib3ZlIGZvciBub24tRmxhZ3NcbiAgICAgICAgICAgICAgLy8gQ29tcGxleCBmaWVsZHMpXG4gICAgICAgICAgICAgIC8vIChDYW5ub3QganVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gcmVjdXJzaXZlbHkgZm9yIGVhY2ggQ29tcGxleCBmaWVsZCBpbiB0aGUgY29sbGVjdGlvbiBiZWNhdXNlIHRoZSBDYXNlRmllbGRcbiAgICAgICAgICAgICAgLy8gZm9yIGVhY2ggb25lIGlzIG5vdCBwYXJ0IG9mIHRoZSBjb2xsZWN0aW9uKVxuICAgICAgICAgICAgICBjYXNlRmllbGQudmFsdWUuZm9yRWFjaCgoaXRlbTogeyBpZDogc3RyaW5nOyB2YWx1ZTogb2JqZWN0OyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgYWN0aXZlQ291bnQgPSBmaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgIChhY3RpdmVGbGFnc0NvdW50T2ZDb21wbGV4RmllbGQsIHN1YkZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvdW50QWN0aXZlRmxhZ3NJbkNhc2VGaWVsZChhY3RpdmVGbGFnc0NvdW50T2ZDb21wbGV4RmllbGQsIHN1YkZpZWxkLCBpdGVtLnZhbHVlW3N1YkZpZWxkLmlkXSk7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgYWN0aXZlQ291bnRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSWdub3JlIGFsbCBvdGhlciBmaWVsZCB0eXBlc1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjdGl2ZUNvdW50O1xuICB9XG5cbiAgcHVibGljIGJ1aWxkQ2FuU2hvd1ByZWRpY2F0ZShldmVudFRyaWdnZXI6IENhc2VFdmVudFRyaWdnZXIsIGZvcm06IGFueSk6IFByZWRpY2F0ZTxXaXphcmRQYWdlPiB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5nZXRDdXJyZW50RXZlbnRTdGF0ZShldmVudFRyaWdnZXIsIGZvcm0pO1xuICAgIHJldHVybiAocGFnZTogV2l6YXJkUGFnZSk6IGJvb2xlYW4gPT4ge1xuICAgICAgcmV0dXJuIHBhZ2UucGFyc2VkU2hvd0NvbmRpdGlvbi5tYXRjaChjdXJyZW50U3RhdGUpO1xuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudEV2ZW50U3RhdGUoZXZlbnRUcmlnZ2VyOiB7IGNhc2VfZmllbGRzOiBDYXNlRmllbGRbXSB9LCBmb3JtOiBGb3JtR3JvdXApOiBvYmplY3Qge1xuICAgIHJldHVybiB0aGlzLm1lcmdlQ2FzZUZpZWxkc0FuZEZvcm1GaWVsZHMoZXZlbnRUcmlnZ2VyLmNhc2VfZmllbGRzLCBmb3JtLmNvbnRyb2xzWydkYXRhJ10udmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGNsb25lQ2FzZUZpZWxkKG9iajogYW55KTogQ2FzZUZpZWxkIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgQ2FzZUZpZWxkKCksIG9iaik7XG4gIH1cblxuICBwdWJsaWMgbWVyZ2VDYXNlRmllbGRzQW5kRm9ybUZpZWxkcyhjYXNlRmllbGRzOiBDYXNlRmllbGRbXSwgZm9ybUZpZWxkczogb2JqZWN0KTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZUZpZWxkcyhjYXNlRmllbGRzLCBmb3JtRmllbGRzLCBGaWVsZHNVdGlscy5ERUZBVUxUX01FUkdFX0ZVTkNUSU9OKTtcbiAgfVxuXG4gIHB1YmxpYyBtZXJnZUxhYmVsQ2FzZUZpZWxkc0FuZEZvcm1GaWVsZHMoY2FzZUZpZWxkczogQ2FzZUZpZWxkW10sIGZvcm1GaWVsZHM6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VGaWVsZHMoY2FzZUZpZWxkcywgZm9ybUZpZWxkcywgRmllbGRzVXRpbHMuTEFCRUxfTUVSR0VfRlVOQ1RJT04pO1xuICB9XG5cbiAgcHVibGljIGNvbnRyb2xJdGVyYXRvcihcbiAgICBhQ29udHJvbDogQWJzdHJhY3RDb250cm9sLFxuICAgIGZvcm1BcnJheUZuOiAoYXJyYXk6IEZvcm1BcnJheSkgPT4gdm9pZCxcbiAgICBmb3JtR3JvdXBGbjogKGdyb3VwOiBGb3JtR3JvdXApID0+IHZvaWQsXG4gICAgY29udHJvbEZuOiAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+IHZvaWRcbiAgKTogdm9pZCB7XG4gICAgaWYgKGFDb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7IC8vIFdlJ3JlIGluIGEgY29sbGVjdGlvblxuICAgICAgZm9ybUFycmF5Rm4oYUNvbnRyb2wpO1xuICAgIH0gZWxzZSBpZiAoYUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHsgLy8gV2UncmUgaW4gYSBjb21wbGV4IHR5cGUuXG4gICAgICBmb3JtR3JvdXBGbihhQ29udHJvbCk7XG4gICAgfSBlbHNlIGlmIChhQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSB7IC8vIEZvcm1Db250cm9sXG4gICAgICBjb250cm9sRm4oYUNvbnRyb2wpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VGaWVsZHMoY2FzZUZpZWxkczogQ2FzZUZpZWxkW10sIGZvcm1GaWVsZHM6IG9iamVjdCwgbWVyZ2VGdW5jdGlvbjogKGZpZWxkOiBDYXNlRmllbGQsIHJlc3VsdDogb2JqZWN0KSA9PiB2b2lkKTogb2JqZWN0IHtcbiAgICBjb25zdCByZXN1bHQ6IG9iamVjdCA9IEZpZWxkc1V0aWxzLmNsb25lT2JqZWN0KGZvcm1GaWVsZHMpO1xuICAgIGNhc2VGaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICBtZXJnZUZ1bmN0aW9uKGZpZWxkLCByZXN1bHQpO1xuICAgICAgaWYgKGZpZWxkLmZpZWxkX3R5cGUgJiYgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcyAmJiBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0W2ZpZWxkLmlkXSA9IHRoaXMubWVyZ2VGaWVsZHMoZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcywgcmVzdWx0W2ZpZWxkLmlkXSwgbWVyZ2VGdW5jdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIl19
558
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9zZXJ2aWNlcy9maWVsZHMvZmllbGRzLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUkxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDaEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzFELE9BQU8sRUFBb0IsU0FBUyxFQUF5RSxNQUFNLGNBQWMsQ0FBQztBQUNsSSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7QUFFbkYsV0FBVztBQUVYLE1BQU0sT0FBTyxXQUFXO0lBWWYsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQVE7UUFDdkMsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLFNBQVMsQ0FBQyxFQUFFO1lBQy9CLE9BQU8scUJBQXFCLENBQUMsSUFBSSxTQUFTLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNwRDtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBdUI7UUFDL0MsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekIsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FB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LENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO3dDQUNoRixXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztxQ0FDakQ7Z0NBQ0gsQ0FBQyxDQUFDLENBQUM7NkJBQ0o7NEJBQ0QsTUFBTTt5QkFDUDtxQkFDRjtnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsTUFBTTtTQUNQO0tBQ0Y7QUFDSCxDQUFDLENBQUM7c0VBM09TLFdBQVc7bURBQVgsV0FBVyxXQUFYLFdBQVc7dUZBQVgsV0FBVztjQUR2QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3VycmVuY3lQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgcGxhaW5Ub0NsYXNzRnJvbUV4aXN0IH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgV2l6YXJkUGFnZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvY2FzZS1lZGl0b3IvZG9tYWluJztcbmltcG9ydCB7IEFic3RyYWN0Rm9ybUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9wYWxldHRlL2Jhc2UtZmllbGQvYWJzdHJhY3QtZm9ybS1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRmxhZ0RldGFpbCwgRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcGFsZXR0ZS9jYXNlLWZsYWcvZG9tYWluL2Nhc2UtZmxhZy5tb2RlbCc7XG5pbXBvcnQgeyBDYXNlRmxhZ1N0YXR1cyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcGFsZXR0ZS9jYXNlLWZsYWcvZW51bXMvY2FzZS1mbGFnLXN0YXR1cy5lbnVtJztcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9wYWxldHRlL3V0aWxzJztcbmltcG9ydCB7IENhc2VFdmVudFRyaWdnZXIsIENhc2VGaWVsZCwgQ2FzZVRhYiwgQ2FzZVZpZXcsIEZpZWxkVHlwZSwgRmllbGRUeXBlRW51bSwgRml4ZWRMaXN0SXRlbSwgUHJlZGljYXRlIH0gZnJvbSAnLi4vLi4vZG9tYWluJztcbmltcG9ydCB7IEZvcm1hdFRyYW5zbGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vY2FzZS1maWVsZHMvZm9ybWF0LXRyYW5zbGF0b3Iuc2VydmljZSc7XG5cbi8vIEBkeW5hbWljXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmllbGRzVXRpbHMge1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGNhc2VMZXZlbENhc2VGbGFnc0ZpZWxkSWQgPSAnY2FzZUZsYWdzJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgY3VycmVuY3lQaXBlOiBDdXJyZW5jeVBpcGUgPSBuZXcgQ3VycmVuY3lQaXBlKCdlbi1HQicpO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBkYXRlUGlwZTogRGF0ZVBpcGUgPSBuZXcgRGF0ZVBpcGUobmV3IEZvcm1hdFRyYW5zbGF0b3JTZXJ2aWNlKCkpO1xuICAvLyBFVUktNDI0NC4gMyBkYXNoZXMgaW5zdGVhZCBvZiAxIHRvIG1ha2UgdGhpcyBsZXNzIGxpa2VseSB0byBjbGFzaCB3aXRoIGEgcmVhbCBmaWVsZC5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBMQUJFTF9TVUZGSVggPSAnLS0tTEFCRUwnO1xuICAvLyBIYW5kbGluZyBvZiBEeW5hbWljIExpc3RzIGluIENvbXBsZXggVHlwZXNcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9DT0xMRUNUSU9OID0gJ0NvbGxlY3Rpb24nO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0NPTVBMRVggPSAnQ29tcGxleCc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0VSVkVSX1JFU1BPTlNFX0ZJRUxEX1RZUEVfRFlOQU1JQ19MSVNUX1RZUEU6IEZpZWxkVHlwZUVudW1bXSA9IFsnRHluYW1pY0xpc3QnLCAnRHluYW1pY1JhZGlvTGlzdCddO1xuXG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFRvQ2FzZUZpZWxkKG9iajogYW55KTogQ2FzZUZpZWxkIHtcbiAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBDYXNlRmllbGQpKSB7XG4gICAgICByZXR1cm4gcGxhaW5Ub0NsYXNzRnJvbUV4aXN0KG5ldyBDYXNlRmllbGQoKSwgb2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9WYWx1ZXNNYXAoY2FzZUZpZWxkczogQ2FzZUZpZWxkW10pOiBhbnkge1xuICAgIGNvbnN0IHZhbHVlTWFwID0ge307XG4gICAgY2FzZUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIHZhbHVlTWFwW2ZpZWxkLmlkXSA9IEZpZWxkc1V0aWxzLnByZXBhcmVWYWx1ZShmaWVsZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlTWFwO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRUeXBlKGVsZW06IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbGVtKS5zbGljZSg4LCAtMSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzT2JqZWN0KGVsZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgZWxlbSA9PT0gJ29iamVjdCcgJiYgZWxlbSAhPT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNOb25FbXB0eU9iamVjdChlbGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc09iamVjdChlbGVtKSAmJiBPYmplY3Qua2V5cyhlbGVtKS5sZW5ndGggIT09IDA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzQXJyYXkoZWxlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZWxlbSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFyZUNvbGxlY3Rpb25WYWx1ZXNTaW1wbGVGaWVsZHMoZmllbGRWYWx1ZTogYW55W10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNPYmplY3QoZmllbGRWYWx1ZVswXVsndmFsdWUnXSkgJiYgIUFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZVswXVsndmFsdWUnXSkgJiYgZmllbGRWYWx1ZVswXVsndmFsdWUnXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0NvbGxlY3Rpb25PZlNpbXBsZVR5cGVzKGZpZWxkVmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQ29sbGVjdGlvbihmaWVsZFZhbHVlKSAmJiB0aGlzLmFyZUNvbGxlY3Rpb25WYWx1ZXNTaW1wbGVGaWVsZHMoZmllbGRWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTXVsdGlTZWxlY3RWYWx1ZShmb3JtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc05vbkVtcHR5QXJyYXkoZm9ybSkgJiYgIXRoaXMuaXNDb2xsZWN0aW9uV2l0aFZhbHVlKGZvcm0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc05vbkVtcHR5QXJyYXkocGFnZUZvcm1GaWVsZHM6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhZ2VGb3JtRmllbGRzKSAmJiBwYWdlRm9ybUZpZWxkc1swXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0NvbGxlY3Rpb24ocGFnZUZvcm1GaWVsZHM6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTm9uRW1wdHlBcnJheShwYWdlRm9ybUZpZWxkcykgJiYgdGhpcy5pc0NvbGxlY3Rpb25XaXRoVmFsdWUocGFnZUZvcm1GaWVsZHMpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0NvbGxlY3Rpb25XaXRoVmFsdWUocGFnZUZvcm1GaWVsZHM6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBhZ2VGb3JtRmllbGRzWzBdWyd2YWx1ZSddICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTGlua2VkQ2FzZXNDYXNlRmllbGQoY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBib29sZWFuIHtcbiAgICBpZiAoIWNhc2VGaWVsZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gY2FzZUZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmlkID09PSAnQ2FzZUxpbmsnICYmIGNhc2VGaWVsZC5pZCA9PT0gJ2Nhc2VMaW5rcyc7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNsb25lT2JqZWN0KG9iajogYW55KTogYW55IHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb2JqKTtcbiAgfVxuXG4gIC8vIHRlbXBvcmFyeSBmdW5jdGlvbiB1bnRpbCB0aGlzIGNhbiBiZSBtb3ZlZCB0byBDYXNlVmlldyBjbGFzcyAoUkRNLTI2ODEpXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Q2FzZUZpZWxkcyhjYXNlVmlldzogQ2FzZVZpZXcpOiBDYXNlRmllbGRbXSB7XG4gICAgY29uc3QgY2FzZURhdGFGaWVsZHM6IENhc2VGaWVsZFtdID0gY2FzZVZpZXcudGFicy5yZWR1Y2UoKGFjYzogQ2FzZUZpZWxkW10sIHRhYjogQ2FzZVRhYikgPT4ge1xuICAgICAgcmV0dXJuIGFjYy5jb25jYXQodGFiLmZpZWxkcyk7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3QgbWV0YWRhdGFGaWVsZHM6IENhc2VGaWVsZFtdID0gY2FzZVZpZXcubWV0YWRhdGFGaWVsZHM7XG4gICAgcmV0dXJuIG1ldGFkYXRhRmllbGRzLmNvbmNhdChjYXNlRGF0YUZpZWxkcy5maWx0ZXIoKGNhc2VGaWVsZDogQ2FzZUZpZWxkKSA9PiB7XG4gICAgICByZXR1cm4gbWV0YWRhdGFGaWVsZHMuZmluZEluZGV4KG1ldGFkYXRhRmllbGQgPT4gbWV0YWRhdGFGaWVsZC5pZCA9PT0gY2FzZUZpZWxkLmlkKSA8IDA7XG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhZGRDYXNlRmllbGRBbmRDb21wb25lbnRSZWZlcmVuY2VzIChjOiBBYnN0cmFjdENvbnRyb2wsIGNmOiBDYXNlRmllbGQsIGNvbXA6IEFic3RyYWN0Rm9ybUZpZWxkQ29tcG9uZW50KTogdm9pZCB7XG4gICAgY1snY2FzZUZpZWxkJ10gPSBjZjtcbiAgICBjWydjb21wb25lbnQnXSA9IGNvbXA7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlIGNoZWNrIG9mIGFuIGFycmF5IG9yIG9iamVjdCBhbmQgaXRzIGRlc2NlbmRhbnRzIGZvciB0aGUgcHJlc2VuY2Ugb2YgYW55IG5vbi1lbXB0eSB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBvYmplY3QgVGhlIGFycmF5IG9yIG9iamVjdCB0byBjaGVja1xuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5IG9yIG9iamVjdCAob3IgYSBkZXNjZW5kYW50KSBjb250YWlucyBhdCBsZWFzdCBvbmUgbm9uLWVtcHR5IHZhbHVlOyBgZmFsc2VgIG90aGVyd2lzZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb250YWluc05vbkVtcHR5VmFsdWVzKG9iamVjdDogb2JqZWN0KTogYm9vbGVhbiB7XG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmtleXMob2JqZWN0KS5tYXAoa2V5ID0+IG9iamVjdFtrZXldKTtcbiAgICBjb25zdCBvYmplY3RSZWZzID0gW107XG4gICAgLy8gQWxzbyB0ZXN0IGZvciBudW1lcmljIHZhbHVlcywgYW5kIGxlbmd0aCA+IDAgZm9yIG5vbi1udW1lcmljIHZhbHVlcyBiZWNhdXNlIHRoaXMgY292ZXJzIGJvdGggc3RyaW5ncyBhbmQgYXJyYXlzLlxuICAgIC8vIE5vdGU6IERlbGliZXJhdGUgdXNlIG9mIG5vbi1lcXVhbGl0eSAoIT0pIG9wZXJhdG9yIGZvciBudWxsIGNoZWNrLCB0byBoYW5kbGUgYm90aCBudWxsIGFuZCB1bmRlZmluZWQgdmFsdWVzLlxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdHJpcGxlLWVxdWFsc1xuICAgIGNvbnN0IGhhc05vbk51bGxQcmltaXRpdmUgPSB2YWx1ZXMuc29tZSh4ID0+ICh4ICE9IG51bGwgJiZcbiAgICAgICgodHlwZW9mIHggPT09ICdvYmplY3QnICYmIHguY29uc3RydWN0b3IgPT09IE9iamVjdCkgfHwgQXJyYXkuaXNBcnJheSh4KVxuICAgICAgICA/ICFvYmplY3RSZWZzLnB1c2goeClcbiAgICAgICAgOiB0eXBlb2YgeCA9PT0gJ251bWJlcicgfHwgeC5sZW5ndGggPiAwKVxuICAgICkpO1xuICAgIHJldHVybiAhaGFzTm9uTnVsbFByaW1pdGl2ZSA/IG9iamVjdFJlZnMuc29tZSh5ID0+IHRoaXMuY29udGFpbnNOb25FbXB0eVZhbHVlcyh5KSkgOiBoYXNOb25OdWxsUHJpbWl0aXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIGhhbmRsZU5lc3RlZER5bmFtaWNMaXN0cygpXG4gICAqIFJlYXNzaWducyBsaXN0X2l0ZW0gYW5kIHZhbHVlIGRhdGEgdG8gRHluYW1pY0xpc3QgY2hpbGRyZW5cbiAgICogZG93biB0aGUgdHJlZS4gU2VydmVyIHJlc3BvbnNlIHJldHVybnMgZGF0YSBvbmx5IGluXG4gICAqIHRoZSBgdmFsdWVgIG9iamVjdCBvZiBwYXJlbnQgY29tcGxleCB0eXBlXG4gICAqXG4gICAqIEVVSS0yNTMwIER5bmFtaWMgTGlzdHMgZm9yIEVsZW1lbnRzIGluIGEgQ29tcGxleCBUeXBlXG4gICAqXG4gICAqIEBwYXJhbSBqc29uQm9keSAtIHsgY2FzZV9maWVsZHM6IFsgQ2FzZUZpZWxkLCBDYXNlRmllbGQgXSB9XG4gICAqL1xuICAgcHVibGljIHN0YXRpYyBoYW5kbGVOZXN0ZWREeW5hbWljTGlzdHMoanNvbkJvZHk6IHsgY2FzZV9maWVsZHM6IENhc2VGaWVsZFtdIH0pOiBhbnkge1xuXG4gICAgaWYgKGpzb25Cb2R5LmNhc2VfZmllbGRzKSB7XG4gICAgICBqc29uQm9keS5jYXNlX2ZpZWxkcy5mb3JFYWNoKGNhc2VGaWVsZCA9PiB7XG4gICAgICAgIGlmIChjYXNlRmllbGQuZmllbGRfdHlwZSkge1xuICAgICAgICAgIHRoaXMuc2V0RHluYW1pY0xpc3REZWZpbml0aW9uKGNhc2VGaWVsZCwgY2FzZUZpZWxkLmZpZWxkX3R5cGUsIGNhc2VGaWVsZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBqc29uQm9keTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHByZXBhcmVWYWx1ZShmaWVsZDogQ2FzZUZpZWxkKTogYW55IHtcbiAgICBpZiAoZmllbGQudmFsdWUpIHtcbiAgICAgIHJldHVybiBmaWVsZC52YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLmlzQ29tcGxleCgpKSB7XG4gICAgICBjb25zdCB2YWx1ZU1hcCA9IHt9O1xuICAgICAgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5mb3JFYWNoKGNvbXBsZXhGaWVsZCA9PiB7XG4gICAgICAgIHZhbHVlTWFwW2NvbXBsZXhGaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5wcmVwYXJlVmFsdWUoY29tcGxleEZpZWxkKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlTWFwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfTUVSR0VfRlVOQ1RJT04gPSBmdW5jdGlvbiBtZXJnZUZ1bmN0aW9uKGZpZWxkOiBDYXNlRmllbGQsIHJlc3VsdDogb2JqZWN0KTogdm9pZCB7XG4gICAgaWYgKCFyZXN1bHQuaGFzT3duUHJvcGVydHkoZmllbGQuaWQpKSB7XG4gICAgICByZXN1bHRbZmllbGQuaWRdID0gZmllbGQudmFsdWU7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IExBQkVMX01FUkdFX0ZVTkNUSU9OID0gZnVuY3Rpb24gbWVyZ2VGdW5jdGlvbihmaWVsZDogQ2FzZUZpZWxkLCByZXN1bHQ6IG9iamVjdCk6IHZvaWQge1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXN1bHQgPSB7fVxuICAgIH1cbiAgICBpZiAoIXJlc3VsdC5oYXNPd25Qcm9wZXJ0eShmaWVsZC5pZCkpIHtcbiAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBmaWVsZC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHN3aXRjaC1kZWZhdWx0XG4gICAgc3dpdGNoIChmaWVsZC5maWVsZF90eXBlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ0ZpeGVkTGlzdCc6XG4gICAgICBjYXNlICdGaXhlZFJhZGlvTGlzdCc6IHtcbiAgICAgICAgcmVzdWx0W2ZpZWxkLmlkXSA9IEZpZWxkc1V0aWxzLmdldEZpeGVkTGlzdExhYmVsQnlDb2RlT3JFbXB0eShmaWVsZCwgcmVzdWx0W2ZpZWxkLmlkXSB8fCBmaWVsZC52YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnTXVsdGlTZWxlY3RMaXN0Jzoge1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gcmVzdWx0W2ZpZWxkLmlkXSB8fCBbXTtcbiAgICAgICAgcmVzdWx0W2ZpZWxkLmlkICsgRmllbGRzVXRpbHMuTEFCRUxfU1VGRklYXSA9IFtdO1xuICAgICAgICBmaWVsZFZhbHVlLmZvckVhY2goKGNvZGU6IGFueSwgaWR4OiBhbnkpID0+IHtcbiAgICAgICAgICByZXN1bHRbZmllbGQuaWQgKyBGaWVsZHNVdGlscy5MQUJFTF9TVUZGSVhdW2lkeF0gPSBGaWVsZHNVdGlscy5nZXRGaXhlZExpc3RMYWJlbEJ5Q29kZU9yRW1wdHkoZmllbGQsIGNvZGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdMYWJlbCc6IHtcbiAgICAgICAgcmVzdWx0W2ZpZWxkLmlkXSA9IEZpZWxkc1V0aWxzLmdldExhYmVsKGZpZWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdNb25leUdCUCc6IHtcbiAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IChyZXN1bHRbZmllbGQuaWRdIHx8IGZpZWxkLnZhbHVlKTtcbiAgICAgICAgcmVzdWx0W2ZpZWxkLmlkXSA9IEZpZWxkc1V0aWxzLmdldE1vbmV5R0JQKGZpZWxkVmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0RhdGUnOiB7XG4gICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSAocmVzdWx0W2ZpZWxkLmlkXSB8fCBmaWVsZC52YWx1ZSk7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5nZXREYXRlKGZpZWxkVmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0NvbXBsZXgnOiB7XG4gICAgICAgIGlmIChyZXN1bHRbZmllbGQuaWRdICYmIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmZvckVhY2goKGY6IENhc2VGaWVsZCkgPT4ge1xuICAgICAgICAgICAgaWYgKFsnQ29sbGVjdGlvbicsICdDb21wbGV4JywgJ011bHRpU2VsZWN0TGlzdCddLmluZGV4T2YoZi5maWVsZF90eXBlLnR5cGUpID4gLTEpIHtcbiAgICAgICAgICAgICAgRmllbGRzVXRpbHMuTEFCRUxfTUVSR0VfRlVOQ1RJT04oZiwgcmVzdWx0W2ZpZWxkLmlkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdDb2xsZWN0aW9uJzoge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IChyZXN1bHRbZmllbGQuaWRdIHx8IGZpZWxkLnZhbHVlKTtcbiAgICAgICAgaWYgKGVsZW1lbnRzKSB7XG4gICAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAnTW9uZXlHQlAnOiB7XG4gICAgICAgICAgICAgICAgZWxlbS52YWx1ZSA9IEZpZWxkc1V0aWxzLmdldE1vbmV5R0JQKGVsZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ0RhdGUnOiB7XG4gICAgICAgICAgICAgICAgZWxlbS52YWx1ZSA9IEZpZWxkc1V0aWxzLmdldERhdGUoZWxlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnQ29tcGxleCc6IHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmZvckVhY2goKGY6IENhc2VGaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoWydDb2xsZWN0aW9uJywgJ0NvbXBsZXgnLCAnTXVsdGlTZWxlY3RMaXN0J10uaW5kZXhPZihmLmZpZWxkX3R5cGUudHlwZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIEZpZWxkc1V0aWxzLkxBQkVMX01FUkdFX0ZVTkNUSU9OKGYsIGVsZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYSBgTW9uZXlHQlBgIHZhbHVlIHRvIGluY2x1ZGUgY3VycmVuY3kgdW5pdHMuXG4gICAqIEBwYXJhbSBmaWVsZFZhbHVlIFRoZSBDdXJyZW5jeVBpcGUgZXhwZWN0cyBhbiBgYW55YCBwYXJhbWV0ZXIgc28gdGhpcyBtdXN0IGFsc28gYmUgYGFueWAsXG4gICAqIGJ1dCBpdCBzaG91bGQgYmUgXCJudW1iZXItbGlrZVwiIChlLmcuLCAnMTIzNCcpXG4gICAqIEByZXR1cm5zIEEgZm9ybWF0dGVkIHN0cmluZyAoZS5nLiwgwqMxMi4zNClcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldE1vbmV5R0JQKGZpZWxkVmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpZWxkVmFsdWUgPyBGaWVsZHNVdGlscy5jdXJyZW5jeVBpcGUudHJhbnNmb3JtKGZpZWxkVmFsdWUgLyAxMDAsICdHQlAnLCAnc3ltYm9sJykgOiBmaWVsZFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TGFiZWwoZmllbGRWYWx1ZTogQ2FzZUZpZWxkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZmllbGRWYWx1ZSA/IGZpZWxkVmFsdWUubGFiZWwgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldERhdGUoZmllbGRWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgLy8gRm9ybWF0IHNwZWNpZmllZCBoZXJlIHdhc24ndCBwcmV2aW91c2x5IHdvcmtpbmcgYW5kIGxvdHMgb2YgdGVzdHMgZGVwZW5kIG9uIGl0IG5vdCB3b3JraW5nXG4gICAgICAvLyBOb3cgdGhhdCBmb3JtYXRzIHdvcmsgY29ycmVjdGx5IG1hbnkgdGVzdCB3b3VsZCBicmVhayAtIGFuZCB0aGlzIGNvdWxkIGFmZmVjdCBzZXJ2aWNlcyB3aGljaCBtYXkgZGVwZW5kIG9uXG4gICAgICAvLyB0aGUgb3JnaW5hbCBiZWhhdmlvdXIgb2YgcmV0dXJuaW5nIGRhdGVzIGluIFwiZCBNTU0geXl5eVwiXG4gICAgICAvLyBOb3RlIC0gcmVwbGFjZWQgJ2QnIHdpdGggJ0QnIGFzIGRhdGVwaXBlIHVzaW5nIG1vbWVudCB0byBhdm9pZCB0aW1lem9uZSBkaXNjcmVwYW5jaWVzXG4gICAgICByZXR1cm4gRmllbGRzVXRpbHMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkVmFsdWUsIG51bGwsICdEIE1NTSB5eXl5Jyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dEZvckludmFsaWRGaWVsZCgnRGF0ZScsIGZpZWxkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldEZpeGVkTGlzdExhYmVsQnlDb2RlT3JFbXB0eShmaWVsZDogQ2FzZUZpZWxkLCBjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlbGV2YW50SXRlbTogRml4ZWRMaXN0SXRlbSA9IGNvZGUgPyBmaWVsZC5maWVsZF90eXBlLmZpeGVkX2xpc3RfaXRlbXMuZmluZChpdGVtID0+IGl0ZW0uY29kZSA9PT0gY29kZSkgOiBudWxsO1xuICAgIHJldHVybiByZWxldmFudEl0ZW0gPyByZWxldmFudEl0ZW0ubGFiZWwgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHRleHRGb3JJbnZhbGlkRmllbGQodHlwZTogc3RyaW5nLCBpbnZhbGlkVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB7IEludmFsaWQgJHt0eXBlfTogJHtpbnZhbGlkVmFsdWV9IH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2V0RHluYW1pY0xpc3REZWZpbml0aW9uKGNhc2VGaWVsZDogQ2FzZUZpZWxkLCBjYXNlRmllbGRUeXBlOiBGaWVsZFR5cGUsIHJvb3RDYXNlRmllbGQ6IENhc2VGaWVsZCkge1xuICAgIGlmIChjYXNlRmllbGRUeXBlLnR5cGUgPT09IEZpZWxkc1V0aWxzLlNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0NPTVBMRVgpIHtcblxuICAgICAgY2FzZUZpZWxkVHlwZS5jb21wbGV4X2ZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBpc0R5bmFtaWNGaWVsZCA9IEZpZWxkc1V0aWxzLlNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0RZTkFNSUNfTElTVF9UWVBFLmluZGV4T2YoZmllbGQuZmllbGRfdHlwZS50eXBlKSAhPT0gLTE7XG5cbiAgICAgICAgICBpZiAoaXNEeW5hbWljRmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNMaXN0VmFsdWUgPSB0aGlzLmdldER5bmFtaWNMaXN0VmFsdWUocm9vdENhc2VGaWVsZC52YWx1ZSwgZmllbGQuaWQpO1xuICAgICAgICAgICAgaWYgKGR5bmFtaWNMaXN0VmFsdWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgbGlzdF9pdGVtcyA9IGR5bmFtaWNMaXN0VmFsdWVbMF0ubGlzdF9pdGVtcztcbiAgICAgICAgICAgICAgY29uc3QgY29tcGxleFZhbHVlID0gZHluYW1pY0xpc3RWYWx1ZS5tYXAoZGF0YSA9PiBkYXRhLnZhbHVlKTtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgbGlzdF9pdGVtcyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogY29tcGxleFZhbHVlLmxlbmd0aCA+IDAgPyBjb21wbGV4VmFsdWUgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgLi4udmFsdWVcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZmllbGQuZm9ybWF0dGVkX3ZhbHVlID0ge1xuICAgICAgICAgICAgICAgIC4uLmZpZWxkLmZvcm1hdHRlZF92YWx1ZSxcbiAgICAgICAgICAgICAgICAuLi52YWx1ZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldER5bmFtaWNMaXN0RGVmaW5pdGlvbihmaWVsZCwgZmllbGQuZmllbGRfdHlwZSwgcm9vdENhc2VGaWVsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjYXNlRmllbGRUeXBlLnR5cGUgPT09IEZpZWxkc1V0aWxzLlNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0NPTExFQ1RJT04pIHtcbiAgICAgIGlmIChjYXNlRmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZSkge1xuICAgICAgICB0aGlzLnNldER5bmFtaWNMaXN0RGVmaW5pdGlvbihjYXNlRmllbGQsIGNhc2VGaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLCByb290Q2FzZUZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXREeW5hbWljTGlzdFZhbHVlKGpzb25CbG9jazogYW55LCBrZXk6IHN0cmluZykge1xuXG4gICAgY29uc3QgZGF0YSA9IGpzb25CbG9jayA/IHRoaXMuZ2V0TmVzdGVkRmllbGRWYWx1ZXMoanNvbkJsb2NrLCBrZXksIFtdKSA6IFtdO1xuXG4gICAgcmV0dXJuIGRhdGEubGVuZ3RoID4gMCA/IGRhdGEgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TmVzdGVkRmllbGRWYWx1ZXMoanNvbkRhdGE6IGFueSwga2V5OiBzdHJpbmcsIG91dHB1dDogYW55W10gPSBbXSkge1xuICAgIGlmIChqc29uRGF0YSAmJiBqc29uRGF0YVtrZXldKSB7XG4gICAgICBvdXRwdXQucHVzaChqc29uRGF0YVtrZXldKTtcbiAgICB9IGVsc2UgIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudEtleSBpbiBqc29uRGF0YSkge1xuICAgICAgICBpZiAodHlwZW9mIGpzb25EYXRhID09PSAnb2JqZWN0JyAmJiBqc29uRGF0YS5oYXNPd25Qcm9wZXJ0eShlbGVtZW50S2V5KSkge1xuICAgICAgICAgIHRoaXMuZ2V0TmVzdGVkRmllbGRWYWx1ZXMoanNvbkRhdGFbZWxlbWVudEtleV0sIGtleSwgb3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0ZsYWdzQ2FzZUZpZWxkKGNhc2VGaWVsZDogQ2FzZUZpZWxkKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjYXNlRmllbGQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc0ZsYWdzRmllbGRUeXBlKGNhc2VGaWVsZC5maWVsZF90eXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNGbGFnTGF1bmNoZXJDYXNlRmllbGQoY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBib29sZWFuIHtcbiAgICBpZiAoIWNhc2VGaWVsZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBjYXNlRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnRmxhZ0xhdW5jaGVyJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNGbGFnc0ZpZWxkVHlwZShmaWVsZFR5cGU6IEZpZWxkVHlwZSk6IGJvb2xlYW4ge1xuICAgIGlmICghZmllbGRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUgZHVtbXkgZmllbGQgdHlwZSBJRCBvZiBcIkNhc2VGbGFnXCIgZm9yIHRlc3RpbmcgYW5kIHRoZSByZWFsIGZpZWxkIHR5cGVcbiAgICAvLyBJRCBvZiBcIkZsYWdzXCJcbiAgICByZXR1cm4gKGZpZWxkVHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgKGZpZWxkVHlwZS5pZCA9PT0gJ0Nhc2VGbGFnJyB8fCBmaWVsZFR5cGUuaWQgPT09ICdGbGFncycpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGZsYWdzIGRhdGEgZnJvbSBhIGBDYXNlRmllbGRgIGluc3RhbmNlLCByZWN1cnNpbmcgYW5kIGl0ZXJhdGluZyB0aHJvdWdoIHN1Yi1maWVsZHMgb2YgYSBDb21wbGV4IGZpZWxkIG9yXG4gICAqIGVhY2ggZmllbGQgaW4gYSBDb2xsZWN0aW9uIGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZmxhZ3MgQW4gYXJyYXkgZm9yIGFjY3VtdWxhdGluZyBleHRyYWN0ZWQgZmxhZ3MgZGF0YSBhbmQgZGVyaXZlZCBgRm9ybUdyb3VwYCBwYXRoc1xuICAgKiBAcGFyYW0gY2FzZUZpZWxkIEEgYENhc2VGaWVsZGAgaW5zdGFuY2UgZnJvbSB3aGljaCB0byBleHRyYWN0IHRoZSBmbGFncyBkYXRhXG4gICAqIEBwYXJhbSBwYXRoVG9GbGFnc0Zvcm1Hcm91cCBBIChkb3QtZGVsaW1pdGVkKSBzdHJpbmcgZm9yIGNvbmNhdGVuYXRpbmcgdGhlIG5hbWUgb2YgZWFjaCBjb250cm9sIHRoYXQgZm9ybXMgdGhlIHBhdGhcbiAgICogdG8gdGhlIGBGb3JtR3JvdXBgIGZvciB0aGUgYEZsYWdzYCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gdG9wTGV2ZWxDYXNlRmllbGQgVGhlIHRvcC1sZXZlbCBgQ2FzZUZpZWxkYCB0aGF0IGNvbnRhaW5zIHRoZSB2YWx1ZSBwcm9wZXJ0eS4gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIF9vbmx5XG4gICAqIHRvcC1sZXZlbF8gYENhc2VGaWVsZGBzIGNvbnRhaW4gYWN0dWFsIHZhbHVlcyBhbmQgYSByZWZlcmVuY2UgbmVlZHMgdG8gYmUgbWFpbnRhaW5lZCB0byBzdWNoIGEgZmllbGRcbiAgICogQHBhcmFtIGN1cnJlbnRWYWx1ZSBUaGUgY3VycmVudCB2YWx1ZSBvYmplY3Qgb2YgYSBgQ2FzZUZpZWxkYCB0aGF0IGlzIGEgc3ViLWZpZWxkIG9mIGEgbm9uIHJvb3QtbGV2ZWwgQ29tcGxleCBmaWVsZC5cbiAgICogUmVxdWlyZWQgZm9yIG1hcHBpbmcgdGhlIGBDYXNlRmllbGRgIHZhbHVlIHRvIGEgYEZsYWdzYCBvYmplY3QgaWYgaXQgaXMgYSBcIkZsYWdzXCIgYENhc2VGaWVsZGAuIChGb3IgQ29tcGxleCB0eXBlcyxcbiAgICogb25seSB0aGUgX3Jvb3QtbGV2ZWxfIGBDYXNlRmllbGRgIGNvbnRhaW5zIGEgdmFsdWUgcHJvcGVydHkgLSBhbGwgc3ViLWZpZWxkcywgaW5jbHVkaW5nIGFueSBuZXN0ZWQgQ29tcGxleCBmaWVsZHMsXG4gICAqIGRvICpub3QqIGNvbnRhaW4gYW55IHZhbHVlcyB0aGVtc2VsdmVzLilcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgYEZsYWdzV2l0aEZvcm1Hcm91cFBhdGhgLCBlYWNoIGluc3RhbmNlIGNvbXByaXNpbmcgYSBgRmxhZ3NgIG9iamVjdCBkZXJpdmVkIGZyb20gYSBgQ2FzZUZpZWxkYFxuICAgKiBvZiB0eXBlIFwiRmxhZ3NcIiwgYW5kIHRoZSBkb3QtZGVsaW1pdGVkIHBhdGggc3RyaW5nIHRvIHRoZSBjb3JyZXNwb25kaW5nIGBGb3JtR3JvdXBgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGV4dHJhY3RGbGFnc0RhdGFGcm9tQ2FzZUZpZWxkKGZsYWdzOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoW10sIGNhc2VGaWVsZDogQ2FzZUZpZWxkLFxuICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwOiBzdHJpbmcsIHRvcExldmVsQ2FzZUZpZWxkOiBDYXNlRmllbGQsIGN1cnJlbnRWYWx1ZT86IG9iamVjdCk6IEZsYWdzV2l0aEZvcm1Hcm91cFBhdGhbXSB7XG4gICAgICBjb25zdCBmaWVsZFR5cGUgPSBjYXNlRmllbGQuZmllbGRfdHlwZTtcbiAgICAgIHN3aXRjaCAoZmllbGRUeXBlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ29tcGxleCc6XG4gICAgICAgICAgLy8gSWYgdGhlIGZpZWxkIGlzIGEgRmxhZ3MgQ2FzZUZpZWxkICh0aGVzZSBhcmUgaW1wbGVtZW50ZWQgYXMgQ29tcGxleCB0eXBlcyksIGl0IGNhbiBiZSBtYXBwZWQgdG8gYSBGbGFnc1xuICAgICAgICAgIC8vIG9iamVjdCBpbW1lZGlhdGVseVxuICAgICAgICAgIGlmIChGaWVsZHNVdGlscy5pc0ZsYWdzQ2FzZUZpZWxkKGNhc2VGaWVsZCkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBGbGFncyBDYXNlRmllbGQgaGFzIGEgdmFsdWUsIGl0IGlzIGEgcm9vdC1sZXZlbCBDb21wbGV4IGZpZWxkOyBpZiBpdCBkb2VzIG5vdCwgaXQgaXMgYSBGbGFnc1xuICAgICAgICAgICAgLy8gQ2FzZUZpZWxkIHRoYXQgaXMgYSBzdWItZmllbGQgd2l0aGluIGFub3RoZXIgQ29tcGxleCBmaWVsZCwgc28gdXNlIHRoZSBjdXJyZW50VmFsdWUgdmFsdWUgKGlmIGFueSlcbiAgICAgICAgICAgIC8vIGluc3RlYWQuIFRoZSBleGNlcHRpb24gdG8gdGhpcyBpcyB0aGUgXCJjYXNlRmxhZ3NcIiBGbGFncyBDYXNlRmllbGQsIHdoaWNoIHdpbGwgaGF2ZSBhbiBlbXB0eSBvYmplY3QgdmFsdWVcbiAgICAgICAgICAgIC8vIGluaXRpYWxseSBvciBjb3VsZCBiZSBudWxsIG9yIHVuZGVmaW5lZCwgYmVjYXVzZSBubyBwYXJ0eSBuYW1lIGlzIHJlcXVpcmVkXG4gICAgICAgICAgICBpZiAoY2FzZUZpZWxkLnZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QoY2FzZUZpZWxkLnZhbHVlKSB8fFxuICAgICAgICAgICAgICBjYXNlRmllbGQuaWQgPT09IHRoaXMuY2FzZUxldmVsQ2FzZUZsYWdzRmllbGRJZCkge1xuICAgICAgICAgICAgICBmbGFncy5wdXNoKHRoaXMubWFwQ2FzZUZpZWxkVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGNhc2VGaWVsZCwgcGF0aFRvRmxhZ3NGb3JtR3JvdXApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QoY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCArPSBgLiR7Y2FzZUZpZWxkLmlkfWA7XG4gICAgICAgICAgICAgIGZsYWdzLnB1c2godGhpcy5tYXBWYWx1ZVRvRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aE9iamVjdChcbiAgICAgICAgICAgICAgICBjYXNlRmllbGQuaWQsIGN1cnJlbnRWYWx1ZSwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGZsYWdzID0gZmllbGRUeXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZSgoZmxhZ3NPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RmxhZ3NEYXRhRnJvbUNhc2VGaWVsZChcbiAgICAgICAgICAgICAgICAgIGZsYWdzT2ZDb21wbGV4RmllbGQsIHN1YkZpZWxkLCBwYXRoVG9GbGFnc0Zvcm1Hcm91cCwgdG9wTGV2ZWxDYXNlRmllbGQsIHZhbHVlW3N1YkZpZWxkLmlkXSk7XG4gICAgICAgICAgICAgIH0sIGZsYWdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIEZvciBhIENvbGxlY3Rpb24gZmllbGQsIHRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBkaXJlY3RseSBhcyBrZXktdmFsdWUgcGFpcnMgaW4gdGhlIENhc2VGaWVsZCdzIHZhbHVlIHByb3BlcnR5XG4gICAgICAgIC8vIGFzIGFuIGFycmF5LCB1bmxlc3MgdGhlIGNvbGxlY3Rpb24gaXMgYSBzdWItZmllbGQgb2YgYSBDb21wbGV4IHR5cGUgLSBzdWItZmllbGRzIG5ldmVyIGNvbnRhaW4gdmFsdWVzXG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIEZsYWdzIENhc2VGaWVsZHMsIHRoZXNlIGNhbiBiZSBtYXBwZWQgdG8gRmxhZ3Mgb2JqZWN0cyBpbW1lZGlhdGVseVxuICAgICAgICAgIGlmIChGaWVsZHNVdGlscy5pc0ZsYWdzRmllbGRUeXBlKGZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgQ29sbGVjdGlvbiBDYXNlRmllbGQgaGFzIGEgdmFsdWUgKGFuIGFycmF5KSwgaXQgaXMgYSByb290LWxldmVsIENvbGxlY3Rpb24gZmllbGQ7IGlmIGl0IGRvZXMgbm90LFxuICAgICAgICAgICAgLy8gaXQgaXMgYSBDb2xsZWN0aW9uIENhc2VGaWVsZCB0aGF0IGlzIGEgc3ViLWZpZWxkIHdpdGhpbiBhIENvbXBsZXggZmllbGQsIHNvIHVzZSB0aGUgY3VycmVudFZhbHVlIHZhbHVlXG4gICAgICAgICAgICAvLyAoaWYgYW55KSBpbnN0ZWFkXG4gICAgICAgICAgICBjb25zdCBwYXRoRnJhZ21lbnQgPSBwYXRoVG9GbGFnc0Zvcm1Hcm91cCArPSAnLmluZGV4LnZhbHVlJztcbiAgICAgICAgICAgIGlmIChjYXNlRmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgICAgY2FzZUZpZWxkLnZhbHVlLmZvckVhY2goKGl0ZW06IHsgaWQ6IHN0cmluZzsgdmFsdWU6IG9iamVjdDsgfSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEF0IGVhY2ggaXRlcmF0aW9uLCByZXBsYWNlIHRoZSBcImluZGV4XCIgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGluZGV4XG4gICAgICAgICAgICAgICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXAgPSBwYXRoRnJhZ21lbnQucmVwbGFjZSgnaW5kZXgnLCBpbmRleC50b1N0cmluZygxMCkpO1xuICAgICAgICAgICAgICAgIGZsYWdzLnB1c2goXG4gICAgICAgICAgICAgICAgICB0aGlzLm1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGl0ZW0uaWQsIGl0ZW0udmFsdWUsIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLCBjYXNlRmllbGQpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICAoY3VycmVudFZhbHVlIGFzIFtdKS5mb3JFYWNoKChpdGVtOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBvYmplY3Q7IH0sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCA9IHBhdGhGcmFnbWVudC5yZXBsYWNlKCdpbmRleCcsIGluZGV4LnRvU3RyaW5nKDEwKSk7XG4gICAgICAgICAgICAgICAgZmxhZ3MucHVzaChcbiAgICAgICAgICAgICAgICAgIHRoaXMubWFwVmFsdWVUb0ZsYWdzV2l0aEZvcm1Hcm91cFBhdGhPYmplY3QoaXRlbS5pZCwgaXRlbS52YWx1ZSwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGNhc2VGaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAvLyBQZXJmb3JtIGEgcmVkdWN0aW9uIG92ZXIgZWFjaCBDb21wbGV4IGZpZWxkJ3Mgc3ViLWZpZWxkcyAoc2ltaWxhciB0byB3aGF0IGlzIGRvbmUgYWJvdmUgZm9yIG5vbi1GbGFnc1xuICAgICAgICAgICAgICAvLyBDb21wbGV4IGZpZWxkcylcbiAgICAgICAgICAgICAgLy8gKENhbm5vdCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSBmb3IgZWFjaCBDb21wbGV4IGZpZWxkIGluIHRoZSBjb2xsZWN0aW9uIGJlY2F1c2UgdGhlIENhc2VGaWVsZFxuICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBvbmUgaXMgbm90IHBhcnQgb2YgdGhlIGNvbGxlY3Rpb24pXG4gICAgICAgICAgICAgIGNvbnN0IHBhdGhGcmFnbWVudCA9IHBhdGhUb0ZsYWdzRm9ybUdyb3VwICs9ICcuaW5kZXgudmFsdWUnO1xuICAgICAgICAgICAgICBjYXNlRmllbGQudmFsdWUuZm9yRWFjaCgoaXRlbTogeyBpZDogc3RyaW5nOyB2YWx1ZTogb2JqZWN0OyB9LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQXQgZWFjaCBpdGVyYXRpb24sIHJlcGxhY2UgdGhlIFwiaW5kZXhcIiBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgaW5kZXhcbiAgICAgICAgICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCA9IHBhdGhGcmFnbWVudC5yZXBsYWNlKCdpbmRleCcsIGluZGV4LnRvU3RyaW5nKDEwKSk7XG4gICAgICAgICAgICAgICAgZmxhZ3MgPSBmaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZSgoZmxhZ3NPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RGbGFnc0RhdGFGcm9tQ2FzZUZpZWxkKFxuICAgICAgICAgICAgICAgICAgICBmbGFnc09mQ29tcGxleEZpZWxkLCBzdWJGaWVsZCwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkLCBpdGVtLnZhbHVlW3N1YkZpZWxkLmlkXSk7XG4gICAgICAgICAgICAgICAgfSwgZmxhZ3MpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSWdub3JlIGFsbCBvdGhlciBmaWVsZCB0eXBlc1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZsYWdzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWFwQ2FzZUZpZWxkVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGNhc2VGaWVsZDogQ2FzZUZpZWxkLFxuICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwOiBzdHJpbmcpOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGNhc2VGaWVsZC5pZCwgY2FzZUZpZWxkLnZhbHVlLCBwYXRoVG9GbGFnc0Zvcm1Hcm91cCwgY2FzZUZpZWxkKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGlkOiBzdHJpbmcsIHZhbHVlOiBvYmplY3QsXG4gICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXA6IHN0cmluZywgY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZsYWdzOiB7XG4gICAgICAgICAgZmxhZ3NDYXNlRmllbGRJZDogaWQsXG4gICAgICAgICAgcGFydHlOYW1lOiB2YWx1ZSA/IHZhbHVlWydwYXJ0eU5hbWUnXSA6IG51bGwsXG4gICAgICAgICAgcm9sZU9uQ2FzZTogdmFsdWUgPyB2YWx1ZVsncm9sZU9uQ2FzZSddIDogbnVsbCxcbiAgICAgICAgICBkZXRhaWxzOiB2YWx1ZSAmJiB2YWx1ZVsnZGV0YWlscyddICYmIHZhbHVlWydkZXRhaWxzJ10ubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyAodmFsdWVbJ2RldGFpbHMnXSBhcyBhbnlbXSkubWFwKGRldGFpbCA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCAuLi5PYmplY3Qua2V5cyhkZXRhaWwudmFsdWUpLm1hcChrID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgaWQgcHJvcGVydHkgc2V0IGJlbG93IHdpbGwgYmUgbnVsbCBmb3IgYSBuZXcgY2FzZSBmbGFnLCBhbmQgYSB1bmlxdWUgaWQgcmV0dXJuZWQgZnJvbSBDQ0Qgd2hlblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGZsYWdcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGspIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHR3byBmaWVsZHMgYXJlIGRhdGUtdGltZSBmaWVsZHNcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGVUaW1lTW9kaWZpZWQnOlxuICAgICAgICAgICAgICAgICAgY2FzZSAnZGF0ZVRpbWVDcmVhdGVkJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtba106IGRldGFpbC52YWx1ZVtrXSA/IG5ldyBEYXRlKGRldGFpbC52YWx1ZVtrXSkgOiBudWxsLCBpZDogZGV0YWlsLmlkfTtcbiAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZmllbGQgaXMgYSBcInllcy9ub1wiIGZpZWxkXG4gICAgICAgICAgICAgICAgICBjYXNlICdoZWFyaW5nUmVsZXZhbnQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV0YWlsLnZhbHVlW2tdLnRvVXBwZXJDYXNlKCkgPT09ICdZRVMnID8ge1trXTogdHJ1ZSwgaWQ6IGRldGFpbC5pZH0gOiB7W2tdOiBmYWxzZSwgaWQ6IGRldGFpbC5pZH07XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1trXTogZGV0YWlsLnZhbHVlW2tdLCBpZDogZGV0YWlsLmlkfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pIGFzIEZsYWdEZXRhaWxbXVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLFxuICAgICAgICBjYXNlRmllbGRcbiAgICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ291bnQgYWN0aXZlIGZsYWdzIGluIGEgYENhc2VGaWVsZGAgaW5zdGFuY2UsIHJlY3Vyc2luZyBhbmQgaXRlcmF0aW5nIHRocm91Z2ggc3ViLWZpZWxkcyBvZiBhIENvbXBsZXggZmllbGQgb3IgZWFjaFxuICAgKiBmaWVsZCBpbiBhIENvbGxlY3Rpb24gZmllbGQuXG4gICAqXG4gICAqIEBwYXJhbSBhY3RpdmVDb3VudCBBbiBhY2N1bXVsYXRpb24gb2YgdGhlIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgZmxhZ3NcbiAgICogQHBhcmFtIGNhc2VGaWVsZCBBIGBDYXNlRmllbGRgIGluc3RhbmNlIGZvciB3aGljaCB0byBjb3VudCB0aGUgYWN0aXZlIGZsYWdzXG4gICAqIEBwYXJhbSBjdXJyZW50VmFsdWUgVGhlIGN1cnJlbnQgdmFsdWUgb2JqZWN0IG9mIGEgYENhc2VGaWVsZGAgdGhhdCBpcyBhIHN1Yi1maWVsZCBvZiBhIG5vbiByb290LWxldmVsIENvbXBsZXggZmllbGQuXG4gICAqIChGb3IgQ29tcGxleCB0eXBlcywgb25seSB0aGUgX3Jvb3QtbGV2ZWxfIGBDYXNlRmllbGRgIGNvbnRhaW5zIGEgdmFsdWUgcHJvcGVydHkgLSBhbGwgc3ViLWZpZWxkcywgaW5jbHVkaW5nIGFueVxuICAgKiBuZXN0ZWQgQ29tcGxleCBmaWVsZHMsIGRvICpub3QqIGNvbnRhaW4gYW55IHZhbHVlcyB0aGVtc2VsdmVzLilcbiAgICogQHJldHVybnMgVGhlIGNvdW50IG9mIGFjdGl2ZSBmbGFnc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb3VudEFjdGl2ZUZsYWdzSW5DYXNlRmllbGQoYWN0aXZlQ291bnQ6IG51bWJlciwgY2FzZUZpZWxkOiBDYXNlRmllbGQsIGN1cnJlbnRWYWx1ZT86IG9iamVjdCk6IG51bWJlciB7XG4gICAgICBjb25zdCBmaWVsZFR5cGUgPSBjYXNlRmllbGQuZmllbGRfdHlwZTtcbiAgICAgIHN3aXRjaCAoZmllbGRUeXBlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ29tcGxleCc6XG4gICAgICAgICAgaWYgKEZpZWxkc1V0aWxzLmlzRmxhZ3NDYXNlRmllbGQoY2FzZUZpZWxkKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIEZsYWdzIENhc2VGaWVsZCBoYXMgYSB2YWx1ZSwgaXQgaXMgYSByb290LWxldmVsIENvbXBsZXggZmllbGQ7IGlmIGl0IGRvZXMgbm90LCBpdCBpcyBhIEZsYWdzXG4gICAgICAgICAgICAvLyBDYXNlRmllbGQgdGhhdCBpcyBhIHN1Yi1maWVsZCB3aXRoaW4gYW5vdGhlciBDb21wbGV4IGZpZWxkLCBzbyB1c2UgdGhlIGN1cnJlbnRWYWx1ZSB2YWx1ZSAoaWYgYW55KSBpbnN0ZWFkXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNhc2VGaWVsZC52YWx1ZSA/IGNhc2VGaWVsZC52YWx1ZSA6IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBGaWVsZHNVdGlscy5pc05vbkVtcHR5T2JqZWN0KHZhbHVlKSAmJiB2YWx1ZS5kZXRhaWxzKSB7XG4gICAgICAgICAgICAgIGFjdGl2ZUNvdW50ID0gdmFsdWUuZGV0YWlscy5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGNvdW50LCBkZXRhaWwpID0+IGRldGFpbC52YWx1ZS5zdGF0dXMgPT09IENhc2VGbGFnU3RhdHVzLkFDVElWRSA/IGNvdW50ICsgMSA6IGNvdW50LFxuICAgICAgICAgICAgICAgIGFjdGl2ZUNvdW50XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGFjdGl2ZUNvdW50ID0gZmllbGRUeXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZSgoYWN0aXZlRmxhZ3NDb3VudE9mQ29tcGxleEZpZWxkLCBzdWJGaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvdW50QWN0aXZlRmxhZ3NJbkNhc2VGaWVsZChcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCxcbiAgICAgICAgICAgICAgICAgIHN1YkZpZWxkLFxuICAgICAgICAgICAgICAgICAgdmFsdWVbc3ViRmllbGQuaWRdXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSwgYWN0aXZlQ291bnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gRm9yIGEgQ29sbGVjdGlvbiBmaWVsZCwgdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGRpcmVjdGx5IGFzIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgQ2FzZUZpZWxkJ3MgdmFsdWUgcHJvcGVydHlcbiAgICAgICAgLy8gYXMgYW4gYXJyYXksIHVubGVzcyB0aGUgY29sbGVjdGlvbiBpcyBhIHN1Yi1maWVsZCBvZiBhIENvbXBsZXggdHlwZSAtIHN1Yi1maWVsZHMgbmV2ZXIgY29udGFpbiB2YWx1ZXNcbiAgICAgICAgY2FzZSAnQ29sbGVjdGlvbic6XG4gICAgICAgICAgaWYgKEZpZWxkc1V0aWxzLmlzRmxhZ3NGaWVsZFR5cGUoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZSkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBDb2xsZWN0aW9uIENhc2VGaWVsZCBoYXMgYSB2YWx1ZSAoYW4gYXJyYXkpLCBpdCBpcyBhIHJvb3QtbGV2ZWwgQ29sbGVjdGlvbiBmaWVsZDsgaWYgaXQgZG9lcyBub3QsXG4gICAgICAgICAgICAvLyBpdCBpcyBhIENvbGxlY3Rpb24gQ2FzZUZpZWxkIHRoYXQgaXMgYSBzdWItZmllbGQgd2l0aGluIGEgQ29tcGxleCBmaWVsZCwgc28gdXNlIHRoZSBjdXJyZW50VmFsdWUgdmFsdWVcbiAgICAgICAgICAgIC8vIChpZiBhbnkpIGluc3RlYWRcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goKGl0ZW06IHsgaWQ6IHN0cmluZzsgdmFsdWU6IG9iamVjdDsgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlWydkZXRhaWxzJ10pIHtcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUNvdW50ID0gaXRlbS52YWx1ZVsnZGV0YWlscyddLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgKGNvdW50LCBkZXRhaWwpID0+IGRldGFpbC52YWx1ZS5zdGF0dXMgPT09IENhc2VGbGFnU3RhdHVzLkFDVElWRSA/IGNvdW50ICsgMSA6IGNvdW50LFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVDb3VudFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGNhc2VGaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgICAvLyBQZXJmb3JtIGEgcmVkdWN0aW9uIG92ZXIgZWFjaCBDb21wbGV4IGZpZWxkJ3Mgc3ViLWZpZWxkcyAoc2ltaWxhciB0byB3aGF0IGlzIGRvbmUgYWJvdmUgZm9yIG5vbi1GbGFnc1xuICAgICAgICAgICAgICAvLyBDb21wbGV4IGZpZWxkcylcbiAgICAgICAgICAgICAgLy8gKENhbm5vdCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSBmb3IgZWFjaCBDb21wbGV4IGZpZWxkIGluIHRoZSBjb2xsZWN0aW9uIGJlY2F1c2UgdGhlIENhc2VGaWVsZFxuICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBvbmUgaXMgbm90IHBhcnQgb2YgdGhlIGNvbGxlY3Rpb24pXG4gICAgICAgICAgICAgIGNhc2VGaWVsZC52YWx1ZS5mb3JFYWNoKChpdGVtOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBvYmplY3Q7IH0pID0+IHtcbiAgICAgICAgICAgICAgICBhY3RpdmVDb3VudCA9IGZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgKGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY291bnRBY3RpdmVGbGFnc0luQ2FzZUZpZWxkKGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQsIGl0ZW0udmFsdWVbc3ViRmllbGQuaWRdKTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBhY3RpdmVDb3VudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBJZ25vcmUgYWxsIG90aGVyIGZpZWxkIHR5cGVzXG4gICAgICB9XG4gICAgICByZXR1cm4gYWN0aXZlQ291bnQ7XG4gIH1cblxuICBwdWJsaWMgYnVpbGRDYW5TaG93UHJlZGljYXRlKGV2ZW50VHJpZ2dlcjogQ2FzZUV2ZW50VHJpZ2dlciwgZm9ybTogYW55KTogUHJlZGljYXRlPFdpemFyZFBhZ2U+IHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLmdldEN1cnJlbnRFdmVudFN0YXRlKGV2ZW50VHJpZ2dlciwgZm9ybSk7XG4gICAgcmV0dXJuIChwYWdlOiBXaXphcmRQYWdlKTogYm9vbGVhbiA9PiB7XG4gICAgICByZXR1cm4gcGFnZS5wYXJzZWRTaG93Q29uZGl0aW9uLm1hdGNoKGN1cnJlbnRTdGF0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50RXZlbnRTdGF0ZShldmVudFRyaWdnZXI6IHsgY2FzZV9maWVsZHM6IENhc2VGaWVsZFtdIH0sIGZvcm06IEZvcm1Hcm91cCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VDYXNlRmllbGRzQW5kRm9ybUZpZWxkcyhldmVudFRyaWdnZXIuY2FzZV9maWVsZHMsIGZvcm0uY29udHJvbHNbJ2RhdGEnXS52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgY2xvbmVDYXNlRmllbGQob2JqOiBhbnkpOiBDYXNlRmllbGQge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBDYXNlRmllbGQoKSwgb2JqKTtcbiAgfVxuXG4gIHB1YmxpYyBtZXJnZUNhc2VGaWVsZHNBbmRGb3JtRmllbGRzKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBmb3JtRmllbGRzOiBvYmplY3QpOiBvYmplY3Qge1xuICAgIHJldHVybiB0aGlzLm1lcmdlRmllbGRzKGNhc2VGaWVsZHMsIGZvcm1GaWVsZHMsIEZpZWxkc1V0aWxzLkRFRkFVTFRfTUVSR0VfRlVOQ1RJT04pO1xuICB9XG5cbiAgcHVibGljIG1lcmdlTGFiZWxDYXNlRmllbGRzQW5kRm9ybUZpZWxkcyhjYXNlRmllbGRzOiBDYXNlRmllbGRbXSwgZm9ybUZpZWxkczogb2JqZWN0KTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZUZpZWxkcyhjYXNlRmllbGRzLCBmb3JtRmllbGRzLCBGaWVsZHNVdGlscy5MQUJFTF9NRVJHRV9GVU5DVElPTik7XG4gIH1cblxuICBwdWJsaWMgY29udHJvbEl0ZXJhdG9yKFxuICAgIGFDb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXG4gICAgZm9ybUFycmF5Rm46IChhcnJheTogRm9ybUFycmF5KSA9PiB2b2lkLFxuICAgIGZvcm1Hcm91cEZuOiAoZ3JvdXA6IEZvcm1Hcm91cCkgPT4gdm9pZCxcbiAgICBjb250cm9sRm46IChjb250cm9sOiBGb3JtQ29udHJvbCkgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICBpZiAoYUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHsgLy8gV2UncmUgaW4gYSBjb2xsZWN0aW9uXG4gICAgICBmb3JtQXJyYXlGbihhQ29udHJvbCk7XG4gICAgfSBlbHNlIGlmIChhQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkgeyAvLyBXZSdyZSBpbiBhIGNvbXBsZXggdHlwZS5cbiAgICAgIGZvcm1Hcm91cEZuKGFDb250cm9sKTtcbiAgICB9IGVsc2UgaWYgKGFDb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpIHsgLy8gRm9ybUNvbnRyb2xcbiAgICAgIGNvbnRyb2xGbihhQ29udHJvbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUZpZWxkcyhjYXNlRmllbGRzOiBDYXNlRmllbGRbXSwgZm9ybUZpZWxkczogb2JqZWN0LCBtZXJnZUZ1bmN0aW9uOiAoZmllbGQ6IENhc2VGaWVsZCwgcmVzdWx0OiBvYmplY3QpID0+IHZvaWQpOiBvYmplY3Qge1xuICAgIGNvbnN0IHJlc3VsdDogb2JqZWN0ID0gRmllbGRzVXRpbHMuY2xvbmVPYmplY3QoZm9ybUZpZWxkcyk7XG4gICAgY2FzZUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIG1lcmdlRnVuY3Rpb24oZmllbGQsIHJlc3VsdCk7XG4gICAgICBpZiAoZmllbGQuZmllbGRfdHlwZSAmJiBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzICYmIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHRbZmllbGQuaWRdID0gdGhpcy5tZXJnZUZpZWxkcyhmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLCByZXN1bHRbZmllbGQuaWRdLCBtZXJnZUZ1bmN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=