@bitgo/sdk-coin-iota 1.10.8 → 1.11.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.
package/dist/src/iota.js CHANGED
@@ -626,7 +626,7 @@ class Iota extends sdk_core_1.BaseCoin {
626
626
  // Decrypt private keys from KeyCard values
627
627
  let userPrv;
628
628
  try {
629
- userPrv = this.bitgo.decrypt({ input: userKey, password: params.walletPassphrase });
629
+ userPrv = await this.bitgo.decryptAsync({ input: userKey, password: params.walletPassphrase });
630
630
  }
631
631
  catch (e) {
632
632
  throw new Error(`Error decrypting user keychain: ${e.message}`);
@@ -634,7 +634,7 @@ class Iota extends sdk_core_1.BaseCoin {
634
634
  const userSigningMaterial = JSON.parse(userPrv);
635
635
  let backupPrv;
636
636
  try {
637
- backupPrv = this.bitgo.decrypt({ input: backupKey, password: params.walletPassphrase });
637
+ backupPrv = await this.bitgo.decryptAsync({ input: backupKey, password: params.walletPassphrase });
638
638
  }
639
639
  catch (e) {
640
640
  throw new Error(`Error decrypting backup keychain: ${e.message}`);
@@ -868,4 +868,4 @@ class Iota extends sdk_core_1.BaseCoin {
868
868
  }
869
869
  }
870
870
  exports.Iota = Iota;
871
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQTZCeUI7QUFDekIsNENBQWdGO0FBQ2hGLHdEQUFnQztBQUNoQywrQkFBMkc7QUFDM0csb0RBQTZFO0FBQzdFLGdFQUFxQztBQUNyQywwQ0FBNEI7QUFRNUIsbUVBQWdFO0FBQ2hFLCtDQU15QjtBQVV6Qjs7O0dBR0c7QUFDSCxNQUFhLElBQUssU0FBUSxtQkFBUTtJQUdoQyxZQUFzQixLQUFnQixFQUFFLFdBQXVDO1FBQzdFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLDZCQUE2QjtJQUM3QiwyQ0FBMkM7SUFFM0MsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFB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Q0FBQztRQUNwRCxJQUFJLENBQUM7WUFDSCxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsT0FBTyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1FBQ2xELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBbGlDRCxvQkFraUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIEVERFNBTWV0aG9kcyxcbiAgRUREU0FNZXRob2RUeXBlcyxcbiAgRW52aXJvbm1lbnRzLFxuICBLZXlQYWlyLFxuICBNUENBbGdvcml0aG0sXG4gIE1QQ0NvbnNvbGlkYXRpb25SZWNvdmVyeU9wdGlvbnMsXG4gIE1QQ1JlY292ZXJ5T3B0aW9ucyxcbiAgTVBDU3dlZXBUeHMsXG4gIE1QQ1R4LFxuICBNUENUeHMsXG4gIE1QQ1R5cGUsXG4gIE1QQ1Vuc2lnbmVkVHgsXG4gIE11bHRpc2lnVHlwZSxcbiAgbXVsdGlzaWdUeXBlcyxcbiAgUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFBvcHVsYXRlZEludGVudCxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvbldpdGhJbnRlbnRPcHRpb25zLFxuICBSZWNvdmVyeVR4UmVxdWVzdCxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFRyYW5zYWN0aW9uUmVjaXBpZW50LFxuICBUcmFuc2FjdGlvblR5cGUsXG4gIFRzc1ZlcmlmeUFkZHJlc3NPcHRpb25zLFxuICB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiwgQ29pbkZhbWlseSwgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuaW1wb3J0IHsgS2V5UGFpciBhcyBJb3RhS2V5UGFpciwgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uQnVpbGRlciwgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4vbGliJztcbmltcG9ydCB7IGF1ZGl0RWRkc2FQcml2YXRlS2V5LCBnZXREZXJpdmF0aW9uUGF0aCB9IGZyb20gJ0BiaXRnby9zZGstbGliLW1wYyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zLFxuICBJb3RhUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFRyYW5zZmVyVHhEYXRhLFxuICBUcmFuc2FjdGlvbk9iamVjdElucHV0LFxufSBmcm9tICcuL2xpYi9pZmFjZSc7XG5pbXBvcnQgeyBUcmFuc2ZlclRyYW5zYWN0aW9uIH0gZnJvbSAnLi9saWIvdHJhbnNmZXJUcmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBERUZBVUxUX0dBU19PVkVSSEVBRCxcbiAgREVGQVVMVF9TQ0FOX0ZBQ1RPUixcbiAgTUFYX0dBU19CVURHRVQsXG4gIE1BWF9HQVNfT0JKRUNUUyxcbiAgTUFYX09CSkVDVF9MSU1JVCxcbn0gZnJvbSAnLi9saWIvY29uc3RhbnRzJztcblxuZXhwb3J0IGludGVyZmFjZSBJb3RhUmVjb3ZlcnlPcHRpb25zIGV4dGVuZHMgTVBDUmVjb3ZlcnlPcHRpb25zIHtcbiAgZnVsbG5vZGVScGNVcmw/OiBzdHJpbmc7IC8vIE92ZXJyaWRlIGRlZmF1bHQgUlBDIFVSTFxufVxuXG5pbnRlcmZhY2UgSW90YU9iamVjdFdpdGhCYWxhbmNlIGV4dGVuZHMgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCB7XG4gIGJhbGFuY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBJT1RBIGNvaW4gaW1wbGVtZW50YXRpb24uXG4gKiBTdXBwb3J0cyBUU1MgKFRocmVzaG9sZCBTaWduYXR1cmUgU2NoZW1lKSB3aXRoIEVERFNBIGFsZ29yaXRobS5cbiAqL1xuZXhwb3J0IGNsYXNzIElvdGEgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPikge1xuICAgIHN1cGVyKGJpdGdvKTtcblxuICAgIGlmICghc3RhdGljc0NvaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgc3RhdGljc0NvaW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0aWNzQ29pbiA9IHN0YXRpY3NDb2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiBJT1RBIGNvaW4gaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBuZXcgSW90YShiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb2luIENvbmZpZ3VyYXRpb24gTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZ2V0QmFzZUZhY3RvcigpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnBvdygxMCwgdGhpcy5fc3RhdGljc0NvaW4uZGVjaW1hbFBsYWNlcyk7XG4gIH1cblxuICBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5uYW1lO1xuICB9XG5cbiAgZ2V0RmFtaWx5KCk6IENvaW5GYW1pbHkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mYW1pbHk7XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mdWxsTmFtZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTXVsdGktU2lnbmF0dXJlIGFuZCBUU1MgU3VwcG9ydFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgc3VwcG9ydHNUc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk6IE11bHRpc2lnVHlwZSB7XG4gICAgcmV0dXJuIG11bHRpc2lnVHlwZXMudHNzO1xuICB9XG5cbiAgZ2V0TVBDQWxnb3JpdGhtKCk6IE1QQ0FsZ29yaXRobSB7XG4gICAgcmV0dXJuIE1QQ1R5cGUuRUREU0E7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFkZHJlc3MgYW5kIFB1YmxpYyBLZXkgVmFsaWRhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbiBJT1RBIGFkZHJlc3MuXG4gICAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIGFkZHJlc3MgdG8gdmFsaWRhdGUgKDY0LWNoYXJhY3RlciBoZXggc3RyaW5nKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgcHVibGljIGtleS5cbiAgICogQHBhcmFtIHB1YiAtIFRoZSBwdWJsaWMga2V5IHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHB1YmxpYyBrZXkgaXMgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZFB1YmxpY0tleShwdWIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIGFuIGFkZHJlc3MgYmVsb25ncyB0byBhIFRTUyB3YWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBWZXJpZmljYXRpb24gcGFyYW1ldGVycyBpbmNsdWRpbmcgd2FsbGV0IGFkZHJlc3MgYW5kIHVzZXIvYmFja3VwIHB1YmxpYyBrZXlzXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgYmVsb25ncyB0byB0aGUgd2FsbGV0XG4gICAqL1xuICBhc3luYyBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoXG4gICAgICBwYXJhbXMsXG4gICAgICAoYWRkcmVzcykgPT4gdGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSxcbiAgICAgIChwdWJsaWNLZXkpID0+IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHB1YmxpY0tleSlcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBUcmFuc2FjdGlvbiBFeHBsYW5hdGlvbiBhbmQgVmVyaWZpY2F0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXhwbGFpbnMgYSB0cmFuc2FjdGlvbiBieSBwYXJzaW5nIGl0cyBoZXggcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBEZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHRocm93cyBFcnJvciBpZiB0eEhleCBpcyBtaXNzaW5nIG9yIHRyYW5zYWN0aW9uIGNhbm5vdCBiZSBleHBsYWluZWRcbiAgICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbihwYXJhbXM6IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFRyYW5zYWN0aW9uRXhwbGFuYXRpb24+IHtcbiAgICBjb25zdCByYXdUeCA9IHRoaXMudmFsaWRhdGVBbmRFeHRyYWN0VHhIZXgocGFyYW1zLnR4SGV4LCAnZXhwbGFpbicpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgIHJldHVybiB0cmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgbWF0Y2hlcyB0aGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24gcGFyYW1ldGVycy5cbiAgICogRW5zdXJlcyByZWNpcGllbnRzIGFuZCBhbW91bnRzIGFsaWduIHdpdGggdGhlIGludGVuZGVkIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVmVyaWZpY2F0aW9uIHBhcmFtZXRlcnMgY29udGFpbmluZyBwcmVidWlsZCBhbmQgb3JpZ2luYWwgcGFyYW1zXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdmVyaWZpY2F0aW9uIHN1Y2NlZWRzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmVyaWZpY2F0aW9uIGZhaWxzXG4gICAqL1xuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZCwgdHhQYXJhbXMgfSA9IHBhcmFtcztcbiAgICBjb25zdCByYXdUeCA9IHRoaXMudmFsaWRhdGVBbmRFeHRyYWN0VHhIZXgodHhQcmVidWlsZC50eEhleCwgJ3ZlcmlmeScpO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnJlYnVpbGRUcmFuc2FjdGlvbihyYXdUeCk7XG4gICAgdGhpcy52YWxpZGF0ZVRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvbik7XG5cbiAgICBpZiAodHhQYXJhbXMucmVjaXBpZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZlcmlmeVRyYW5zYWN0aW9uUmVjaXBpZW50cyh0cmFuc2FjdGlvbiBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uLCB0eFBhcmFtcy5yZWNpcGllbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYSB0cmFuc2FjdGlvbiBhbmQgZXh0cmFjdHMgaW5wdXRzLCBvdXRwdXRzLCBhbmQgZmVlcy5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgY29udGFpbmluZyB0aGUgdHJhbnNhY3Rpb24gaGV4XG4gICAqIEByZXR1cm5zIFBhcnNlZCB0cmFuc2FjdGlvbiB3aXRoIGlucHV0cywgb3V0cHV0cywgYW5kIGZlZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgYXN5bmMgcGFyc2VUcmFuc2FjdGlvbihwYXJhbXM6IElvdGFQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uID0gYXdhaXQgdGhpcy5leHBsYWluVHJhbnNhY3Rpb24oeyB0eEhleDogcGFyYW1zLnR4SGV4IH0pO1xuXG4gICAgaWYgKCF0cmFuc2FjdGlvbkV4cGxhbmF0aW9uIHx8IHRyYW5zYWN0aW9uRXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUVtcHR5UGFyc2VkVHJhbnNhY3Rpb24oKTtcbiAgICB9XG5cbiAgICBjb25zdCBmZWUgPSB0aGlzLmNhbGN1bGF0ZVRyYW5zYWN0aW9uRmVlKHRyYW5zYWN0aW9uRXhwbGFuYXRpb24pO1xuICAgIGNvbnN0IGlucHV0cyA9IHRoaXMuYnVpbGRUcmFuc2FjdGlvbklucHV0cyh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBmZWUpO1xuICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLmJ1aWxkVHJhbnNhY3Rpb25PdXRwdXRzKHRyYW5zYWN0aW9uRXhwbGFuYXRpb24pO1xuXG4gICAgcmV0dXJuIHsgaW5wdXRzLCBvdXRwdXRzLCBmZWUgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gS2V5IEdlbmVyYXRpb24gYW5kIFNpZ25pbmdcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBrZXkgcGFpciBmb3IgSU9UQSB0cmFuc2FjdGlvbnMuXG4gICAqIEBwYXJhbSBzZWVkIC0gT3B0aW9uYWwgc2VlZCB0byBnZW5lcmF0ZSBkZXRlcm1pbmlzdGljIGtleSBwYWlyXG4gICAqIEByZXR1cm5zIEtleSBwYWlyIHdpdGggcHVibGljIGFuZCBwcml2YXRlIGtleXNcbiAgICogQHRocm93cyBFcnJvciBpZiBwcml2YXRlIGtleSBnZW5lcmF0aW9uIGZhaWxzXG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IElvdGFLZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBJb3RhS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcblxuICAgIGlmICgha2V5cy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcnYgaW4ga2V5IGdlbmVyYXRpb24uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHB1Yjoga2V5cy5wdWIsXG4gICAgICBwcnY6IGtleXMucHJ2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiAobm90IGltcGxlbWVudGVkIGZvciBJT1RBKS5cbiAgICogSU9UQSB0cmFuc2FjdGlvbnMgYXJlIHNpZ25lZCBleHRlcm5hbGx5IHVzaW5nIFRTUy5cbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1ZGl0cyBhIGRlY3J5cHRlZCBwcml2YXRlIGtleSB0byBlbnN1cmUgaXQncyB2YWxpZCBmb3IgdGhlIGdpdmVuIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgbXVsdGlTaWdUeXBlLCBwcml2YXRlIGtleSwgYW5kIHB1YmxpYyBrZXlcbiAgICogQHRocm93cyBFcnJvciBpZiBtdWx0aVNpZ1R5cGUgaXMgbm90IFRTUyBvciBpZiBrZXkgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgYXVkaXREZWNyeXB0ZWRLZXkoeyBtdWx0aVNpZ1R5cGUsIHBydiwgcHVibGljS2V5IH06IEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zKTogdm9pZCB7XG4gICAgaWYgKG11bHRpU2lnVHlwZSAhPT0gbXVsdGlzaWdUeXBlcy50c3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbXVsdGlTaWdUeXBlJyk7XG4gICAgfVxuICAgIGF1ZGl0RWRkc2FQcml2YXRlS2V5KHBydiwgcHVibGljS2V5ID8/ICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgc2lnbmFibGUgcGF5bG9hZCBmcm9tIGEgc2VyaWFsaXplZCB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHNlcmlhbGl6ZWRUeCAtIFRoZSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBCdWZmZXIgY29udGFpbmluZyB0aGUgc2lnbmFibGUgcGF5bG9hZFxuICAgKi9cbiAgYXN5bmMgZ2V0U2lnbmFibGVQYXlsb2FkKHNlcmlhbGl6ZWRUeDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCByZWJ1aWx0VHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnJlYnVpbGRUcmFuc2FjdGlvbihzZXJpYWxpemVkVHgpO1xuICAgIHJldHVybiByZWJ1aWx0VHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBhbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBjb2luLXNwZWNpZmljIGZpZWxkcyBpbiB0aGUgdHJhbnNhY3Rpb24gaW50ZW50LlxuICAgKiBAcGFyYW0gaW50ZW50IC0gVGhlIHBvcHVsYXRlZCBpbnRlbnQgb2JqZWN0IHRvIG1vZGlmeVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIHVuc3BlbnRzIGRhdGFcbiAgICovXG4gIHNldENvaW5TcGVjaWZpY0ZpZWxkc0luSW50ZW50KGludGVudDogUG9wdWxhdGVkSW50ZW50LCBwYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25XaXRoSW50ZW50T3B0aW9ucyk6IHZvaWQge1xuICAgIGludGVudC51bnNwZW50cyA9IHBhcmFtcy51bnNwZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgZnVuZHMgcmVjb3ZlcnkgdHJhbnNhY3Rpb24ocykgd2l0aG91dCBCaXRHb1xuICAgKlxuICAgKiBAcGFyYW0ge0lvdGFSZWNvdmVyeU9wdGlvbnN9IHBhcmFtcyBwYXJhbWV0ZXJzIG5lZWRlZCB0byBjb25zdHJ1Y3QgYW5kXG4gICAqIChtYXliZSkgc2lnbiB0aGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHJldHVybnMge01QQ1R4IHwgTVBDU3dlZXBUeHN9IGFycmF5IG9mIHRoZSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uIGhleCBzdHJpbmdzIGFuZCBpbmRpY2VzXG4gICAqIG9mIHRoZSBhZGRyZXNzZXMgYmVpbmcgc3dlcHRcbiAgICovXG4gIGFzeW5jIHJlY292ZXIocGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zKTogUHJvbWlzZTxNUENUeHMgfCBNUENTd2VlcFR4cz4ge1xuICAgIGlmICghcGFyYW1zLmJpdGdvS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYml0Z29LZXknKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyhwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZWNvdmVyeURlc3RpbmF0aW9uIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydElkeCA9IHV0aWxzLmdldFNhZmVOdW1iZXIoMCwgJ0ludmFsaWQgc3RhcnRpbmcgaW5kZXggdG8gc2NhbiBmb3IgYWRkcmVzc2VzJywgcGFyYW1zLnN0YXJ0aW5nU2NhbkluZGV4KTtcbiAgICBjb25zdCBudW1JdGVyYXRpb25zID0gdXRpbHMuZ2V0U2FmZU51bWJlcihERUZBVUxUX1NDQU5fRkFDVE9SLCAnSW52YWxpZCBzY2FubmluZyBmYWN0b3InLCBwYXJhbXMuc2Nhbik7XG4gICAgY29uc3QgZW5kSWR4ID0gc3RhcnRJZHggKyBudW1JdGVyYXRpb25zO1xuICAgIGNvbnN0IGJpdGdvS2V5ID0gcGFyYW1zLmJpdGdvS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcblxuICAgIGZvciAobGV0IGlkeCA9IHN0YXJ0SWR4OyBpZHggPCBlbmRJZHg7IGlkeCsrKSB7XG4gICAgICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9IChwYXJhbXMuc2VlZCA/IGdldERlcml2YXRpb25QYXRoKHBhcmFtcy5zZWVkKSA6ICdtJykgKyBgLyR7aWR4fWA7XG4gICAgICBjb25zdCBkZXJpdmVkUHVibGljS2V5ID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoYml0Z29LZXksIGRlcml2YXRpb25QYXRoKS5zbGljZSgwLCA2NCk7XG4gICAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0gdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoZGVyaXZlZFB1YmxpY0tleSk7XG5cbiAgICAgIC8vIFRva2VuIHJlY292ZXJ5IHBhdGg6IHJlY292ZXIgdGhlIHRva2VuIHByb3ZpZGVkIGJ5IHVzZXJcbiAgICAgIGlmIChwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3MpIHtcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5oYXNUb2tlbkJhbGFuY2Uoc2VuZGVyQWRkcmVzcywgcGFyYW1zKSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0b2tlbk9iamVjdHM6IElvdGFPYmplY3RXaXRoQmFsYW5jZVtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRva2VuT2JqZWN0cyA9IGF3YWl0IHRoaXMuZmV0Y2hPd25lZE9iamVjdHMoXG4gICAgICAgICAgICBzZW5kZXJBZGRyZXNzLFxuICAgICAgICAgICAgcGFyYW1zLmZ1bGxub2RlUnBjVXJsLFxuICAgICAgICAgICAgcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuT2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVjb3ZlcklvdGFUb2tlbihcbiAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgIHRva2VuT2JqZWN0cyxcbiAgICAgICAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICAgICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgICAgIGRlcml2ZWRQdWJsaWNLZXksXG4gICAgICAgICAgICBpZHgsXG4gICAgICAgICAgICBiaXRnb0tleVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgb3duZWRPYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG93bmVkT2JqZWN0cyA9IGF3YWl0IHRoaXMuZmV0Y2hPd25lZE9iamVjdHMoc2VuZGVyQWRkcmVzcywgcGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChvd25lZE9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDYXAgb2JqZWN0cyB0byBwcmV2ZW50IG92ZXJzaXplZCB0cmFuc2FjdGlvbnMgKElPVEEgbWF4IHR4IHNpemUgPSAxMjggS2lCKVxuICAgICAgaWYgKG93bmVkT2JqZWN0cy5sZW5ndGggPiBNQVhfR0FTX09CSkVDVFMpIHtcbiAgICAgICAgb3duZWRPYmplY3RzID0gb3duZWRPYmplY3RzXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IChCaWdJbnQoYi5iYWxhbmNlKSA+IEJpZ0ludChhLmJhbGFuY2UpID8gMSA6IC0xKSlcbiAgICAgICAgICAuc2xpY2UoMCwgTUFYX0dBU19PQkpFQ1RTKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNPYmplY3RzLCB0b3RhbEJhbGFuY2UgfSA9IGF3YWl0IHRoaXMucHJlcGFyZUdhc0FuZE9iamVjdHMoXG4gICAgICAgIG93bmVkT2JqZWN0cyxcbiAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgcGFyYW1zXG4gICAgICApO1xuXG4gICAgICBjb25zdCBuZXRCYWxhbmNlID0gdG90YWxCYWxhbmNlIC0gQmlnSW50KGdhc0J1ZGdldCk7XG5cbiAgICAgIGlmIChuZXRCYWxhbmNlIDw9IDBuKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSBuZXRCYWxhbmNlLnRvU3RyaW5nKCk7XG5cbiAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG5cbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuc2VuZGVyKHNlbmRlckFkZHJlc3MpXG4gICAgICAgIC5yZWNpcGllbnRzKFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IHJlY292ZXJ5QW1vdW50IH1dKVxuICAgICAgICAuZ2FzRGF0YSh7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc1BheW1lbnRPYmplY3RzOiBnYXNPYmplY3RzIH0pO1xuXG4gICAgICAvLyBSZXR1cm4gdW5zaWduZWQgdHJhbnNhY3Rpb24gZm9yIGNvbGQvY3VzdG9keSB3YWxsZXRzXG4gICAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG4gICAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVW5zaWduZWRTd2VlcFRyYW5zYWN0aW9uKHR4QnVpbGRlciwgc2VuZGVyQWRkcmVzcywgYml0Z29LZXksIGlkeCwgZGVyaXZhdGlvblBhdGgpO1xuICAgICAgfVxuXG4gICAgICAvLyBCdWlsZCB0cmFuc2FjdGlvbiBmb3Igc2lnbmluZ1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gU2lnbiB0aGUgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQga2V5c1xuICAgICAgY29uc3QgZnVsbFNpZ25hdHVyZUJhc2U2NCA9IGF3YWl0IHRoaXMuc2lnblJlY292ZXJ5VHJhbnNhY3Rpb24oXG4gICAgICAgIHR4QnVpbGRlcixcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgZGVyaXZlZFB1YmxpY0tleSxcbiAgICAgICAgdW5zaWduZWRUeFxuICAgICAgKTtcblxuICAgICAgLy8gQnVpbGQgYW5kIHJldHVybiBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGZpbmFsVHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHggPSBhd2FpdCBmaW5hbFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNjYW5JbmRleDogaWR4LFxuICAgICAgICAgICAgcmVjb3ZlcnlBbW91bnQsXG4gICAgICAgICAgICBzZXJpYWxpemVkVHgsXG4gICAgICAgICAgICBzaWduYXR1cmU6IGZ1bGxTaWduYXR1cmVCYXNlNjQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGFzdFNjYW5JbmRleDogaWR4LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGlkIG5vdCBmaW5kIGFuIGFkZHJlc3Mgd2l0aCBzdWZmaWNpZW50IGZ1bmRzIHRvIHJlY292ZXIuIGAgK1xuICAgICAgICBgU2Nhbm5lZCBhZGRyZXNzZXMgZnJvbSBpbmRleCAke3N0YXJ0SWR4fSB0byAke2VuZElkeCAtIDF9LiBgICtcbiAgICAgICAgYFBsZWFzZSBzdGFydCB0aGUgbmV4dCBzY2FuIGF0IGFkZHJlc3MgaW5kZXggJHtlbmRJZHh9LmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBhZGRyZXNzIGhvbGRzIGEgcG9zaXRpdmUgYmFsYW5jZSBvZiB0aGUgc3BlY2lmaWVkIHRva2VuLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYXNUb2tlbkJhbGFuY2Uoc2VuZGVyQWRkcmVzczogc3RyaW5nLCBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHRoaXMuZ2V0QmFsYW5jZShzZW5kZXJBZGRyZXNzLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwsIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICByZXR1cm4gYmFsYW5jZSA+IDBuO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGVzIGZ1bmRzIGZyb20gbXVsdGlwbGUgcmVjZWl2ZSBhZGRyZXNzZXMgdG8gdGhlIGJhc2UgYWRkcmVzcyAoaW5kZXggMCkuXG4gICAqIElmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IHByb3ZpZGVkLCByZXR1cm5zIHVuc2lnbmVkIHRyYW5zYWN0aW9ucyBmb3Igb2ZmbGluZSBzaWduaW5nXG4gICAqIChjb2xkL2N1c3RvZHkgd2FsbGV0IHJlY292ZXJ5KS4gT3RoZXJ3aXNlLCByZXR1cm5zIHNpZ25lZCB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBDb25zb2xpZGF0aW9uIHJlY292ZXJ5IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRnb0tleSAtIFRoZSBjb21tb25LZXljaGFpbiAoY29tYmluZWQgVFNTIHB1YmxpYyBrZXkpXG4gICAqIEBwYXJhbSBwYXJhbXMuc3RhcnRpbmdTY2FuSW5kZXggLSBTdGFydGluZyBhZGRyZXNzIGluZGV4IHRvIHNjYW4gKGRlZmF1bHQ6IDEpXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5kaW5nU2NhbkluZGV4IC0gRW5kaW5nIGFkZHJlc3MgaW5kZXggdG8gc2NhbiAoZGVmYXVsdDogc3RhcnRpbmdTY2FuSW5kZXggKyAyMClcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gT3B0aW9uYWwgcGFzc3BocmFzZSBmb3Igc2lnbmluZyAob21pdCBmb3IgdW5zaWduZWQgdHJhbnNhY3Rpb25zKVxuICAgKiBAcmV0dXJucyBNUENUeHMgKHNpZ25lZCkgb3IgTVBDU3dlZXBUeHMgKHVuc2lnbmVkKSBjb250YWluaW5nIGFsbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIG5vIGFkZHJlc3NlcyB3aXRoIGZ1bmRzIGFyZSBmb3VuZCBpbiB0aGUgc2NhbiByYW5nZVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlckNvbnNvbGlkYXRpb25zKHBhcmFtczogTVBDQ29uc29saWRhdGlvblJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8TVBDVHhzIHwgTVBDU3dlZXBUeHM+IHtcbiAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG5cbiAgICBjb25zdCBzdGFydElkeCA9IHV0aWxzLmdldFNhZmVOdW1iZXIoMSwgJ0ludmFsaWQgc3RhcnRpbmcgaW5kZXggdG8gc2NhbiBmb3IgYWRkcmVzc2VzJywgcGFyYW1zLnN0YXJ0aW5nU2NhbkluZGV4KTtcbiAgICBjb25zdCBlbmRJZHggPSB1dGlscy5nZXRTYWZlTnVtYmVyKFxuICAgICAgc3RhcnRJZHggKyBERUZBVUxUX1NDQU5fRkFDVE9SLFxuICAgICAgJ0ludmFsaWQgZW5kaW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3NlcycsXG4gICAgICBwYXJhbXMuZW5kaW5nU2NhbkluZGV4XG4gICAgKTtcblxuICAgIGlmIChzdGFydElkeCA8IDEgfHwgZW5kSWR4IDw9IHN0YXJ0SWR4IHx8IGVuZElkeCAtIHN0YXJ0SWR4ID4gMTAgKiBERUZBVUxUX1NDQU5fRkFDVE9SKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHN0YXJ0aW5nIG9yIGVuZGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMuIHN0YXJ0aW5nU2NhbkluZGV4OiAke3N0YXJ0SWR4fSwgZW5kaW5nU2NhbkluZGV4OiAke2VuZElkeH0uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0tleSA9IHBhcmFtcy5iaXRnb0tleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG5cbiAgICBjb25zdCBiYXNlUGF0aCA9IChwYXJhbXMuc2VlZCA/IGdldERlcml2YXRpb25QYXRoKHBhcmFtcy5zZWVkKSA6ICdtJykgKyAnLzAnO1xuICAgIGNvbnN0IGRlcml2ZWRCYXNlUHVibGljS2V5ID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoYml0Z29LZXksIGJhc2VQYXRoKS5zbGljZSgwLCA2NCk7XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShkZXJpdmVkQmFzZVB1YmxpY0tleSk7XG5cbiAgICBjb25zdCBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIGxldCBsYXN0U2NhbkluZGV4ID0gc3RhcnRJZHg7XG5cbiAgICBmb3IgKGxldCBpZHggPSBzdGFydElkeDsgaWR4IDwgZW5kSWR4OyBpZHgrKykge1xuICAgICAgY29uc3QgcmVjb3ZlclBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyA9IHtcbiAgICAgICAgdXNlcktleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleTogcGFyYW1zLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IHBhcmFtcy5iaXRnb0tleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBiYXNlQWRkcmVzcywgLy8gQ29uc29saWRhdGUgdG8gYmFzZSBhZGRyZXNzXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiBpZHgsXG4gICAgICAgIHNjYW46IDEsXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVjb3ZlcnlUcmFuc2FjdGlvbjogTVBDVHhzIHwgTVBDU3dlZXBUeHM7XG4gICAgICB0cnkge1xuICAgICAgICByZWNvdmVyeVRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWNvdmVyKHJlY292ZXJQYXJhbXMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoKGUgYXMgRXJyb3IpLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnRGlkIG5vdCBmaW5kIGFuIGFkZHJlc3Mgd2l0aCBzdWZmaWNpZW50IGZ1bmRzIHRvIHJlY292ZXIuJykpIHtcbiAgICAgICAgICBsYXN0U2NhbkluZGV4ID0gaWR4O1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5wdXNoKChyZWNvdmVyeVRyYW5zYWN0aW9uIGFzIE1QQ1N3ZWVwVHhzKS50eFJlcXVlc3RzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaCgocmVjb3ZlcnlUcmFuc2FjdGlvbiBhcyBNUENUeHMpLnRyYW5zYWN0aW9uc1swXSk7XG4gICAgICB9XG4gICAgICBsYXN0U2NhbkluZGV4ID0gaWR4O1xuICAgIH1cblxuICAgIGlmIChjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGlkIG5vdCBmaW5kIGFuIGFkZHJlc3Mgd2l0aCBzdWZmaWNpZW50IGZ1bmRzIHRvIHJlY292ZXIuIFBsZWFzZSBzdGFydCB0aGUgbmV4dCBzY2FuIGF0IGFkZHJlc3MgaW5kZXggJHtcbiAgICAgICAgICBsYXN0U2NhbkluZGV4ICsgMVxuICAgICAgICB9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9uc1tcbiAgICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5sZW5ndGggLSAxXG4gICAgICBdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LmNvaW5TcGVjaWZpYy5sYXN0U2NhbkluZGV4ID0gbGFzdFNjYW5JbmRleDtcbiAgICAgIHJldHVybiB7IHR4UmVxdWVzdHM6IGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB0cmFuc2FjdGlvbnM6IGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMsIGxhc3RTY2FuSW5kZXggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0b3RhbCBjb2luIGJhbGFuY2UgZm9yIGFuIGFkZHJlc3MuXG4gICAqXG4gICAqIEBwYXJhbSBhZGRyZXNzIC0gSU9UQSBhZGRyZXNzIHRvIHF1ZXJ5XG4gICAqIEBwYXJhbSBycGNVcmwgLSBPcHRpb25hbCBSUEMgVVJMIG92ZXJyaWRlXG4gICAqIEBwYXJhbSBjb2luVHlwZSAtIE9wdGlvbmFsIGNvaW4gdHlwZSAoZGVmYXVsdHMgdG8gbmF0aXZlIElPVEEpXG4gICAqIEByZXR1cm5zIFRvdGFsIGJhbGFuY2UgYXMgYSBiaWdpbnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QmFsYW5jZShhZGRyZXNzOiBzdHJpbmcsIHJwY1VybD86IHN0cmluZywgY29pblR5cGU/OiBzdHJpbmcpOiBQcm9taXNlPGJpZ2ludD4ge1xuICAgIGNvbnN0IHVybCA9IHJwY1VybCB8fCB0aGlzLmdldFB1YmxpY05vZGVVcmwoKTtcbiAgICBjb25zdCBub3JtYWxpemVkQ29pblR5cGUgPSBjb2luVHlwZSB8fCB0aGlzLmdldE5hdGl2ZUNvaW5UeXBlKCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm1ha2VScGNDYWxsKHVybCwgJ2lvdGF4X2dldEJhbGFuY2UnLCBbYWRkcmVzcywgbm9ybWFsaXplZENvaW5UeXBlXSk7XG4gICAgcmV0dXJuIEJpZ0ludChyZXNwb25zZS50b3RhbEJhbGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgb3duZWQgb2JqZWN0cyBmb3IgYW4gYWRkcmVzcyB2aWEgZnVsbG5vZGUgUlBDLlxuICAgKiBIYW5kbGVzIHBhZ2luYXRpb24gdG8gcmV0cmlldmUgYWxsIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSBhZGRyZXNzIC0gSU9UQSBhZGRyZXNzIHRvIHF1ZXJ5XG4gICAqIEBwYXJhbSBycGNVcmwgLSBPcHRpb25hbCBSUEMgVVJMIG92ZXJyaWRlXG4gICAqIEBwYXJhbSBjb2luVHlwZSAtIE9wdGlvbmFsIGNvaW4gdHlwZSB0byBmaWx0ZXIgb2JqZWN0cyAoZGVmYXVsdHMgdG8gbmF0aXZlIElPVEEpXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIG93bmVkIG9iamVjdHMgd2l0aCBiYWxhbmNlIGluZm9ybWF0aW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoT3duZWRPYmplY3RzKFxuICAgIGFkZHJlc3M6IHN0cmluZyxcbiAgICBycGNVcmw/OiBzdHJpbmcsXG4gICAgY29pblR5cGU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXT4ge1xuICAgIGNvbnN0IHVybCA9IHJwY1VybCB8fCB0aGlzLmdldFB1YmxpY05vZGVVcmwoKTtcbiAgICBjb25zdCBhbGxPYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXSA9IFtdO1xuICAgIGNvbnN0IGlubmVyQ29pblR5cGUgPSBjb2luVHlwZSB8fCB0aGlzLmdldE5hdGl2ZUNvaW5UeXBlKCk7XG4gICAgY29uc3Qgc3RydWN0VHlwZSA9IGAweDI6OmNvaW46OkNvaW48JHtpbm5lckNvaW5UeXBlfT5gO1xuICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoYXNOZXh0UGFnZSA9IHRydWU7XG4gICAgY29uc3QgTUFYX1BBR0VTID0gNTAwO1xuICAgIGxldCBwYWdlQ291bnQgPSAwO1xuICAgIHdoaWxlIChoYXNOZXh0UGFnZSAmJiBwYWdlQ291bnQgPCBNQVhfUEFHRVMpIHtcbiAgICAgIHBhZ2VDb3VudCsrO1xuICAgICAgY29uc3QgcXVlcnkgPSB7XG4gICAgICAgIGZpbHRlcjogeyBTdHJ1Y3RUeXBlOiBzdHJ1Y3RUeXBlIH0sXG4gICAgICAgIG9wdGlvbnM6IHsgc2hvd0NvbnRlbnQ6IHRydWUsIHNob3dUeXBlOiB0cnVlIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWFrZVJwY0NhbGwodXJsLCAnaW90YXhfZ2V0T3duZWRPYmplY3RzJywgW2FkZHJlc3MsIHF1ZXJ5LCBjdXJzb3IsIDUwXSk7XG4gICAgICBjb25zdCB7IGRhdGEsIG5leHRDdXJzb3IsIGhhc05leHRQYWdlOiBtb3JlIH0gPSByZXNwb25zZTtcblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGEgfHwgW10pIHtcbiAgICAgICAgY29uc3QgeyBvYmplY3RJZCwgdmVyc2lvbiwgZGlnZXN0IH0gPSBpdGVtLmRhdGE7XG4gICAgICAgIGNvbnN0IGJhbGFuY2UgPSBpdGVtLmRhdGEuY29udGVudD8uZmllbGRzPy5iYWxhbmNlIHx8ICcwJztcbiAgICAgICAgaWYgKEJpZ0ludChiYWxhbmNlKSA+IDBuKSB7XG4gICAgICAgICAgYWxsT2JqZWN0cy5wdXNoKHsgb2JqZWN0SWQsIHZlcnNpb246IHZlcnNpb24udG9TdHJpbmcoKSwgZGlnZXN0LCBiYWxhbmNlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0Q3Vyc29yID09PSBjdXJzb3IpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBoYXNOZXh0UGFnZSA9IG1vcmU7XG4gICAgICBjdXJzb3IgPSBuZXh0Q3Vyc29yO1xuICAgIH1cblxuICAgIGlmIChwYWdlQ291bnQgPj0gTUFYX1BBR0VTKSB7XG4gICAgICBjb25zb2xlLndhcm4oYGZldGNoT3duZWRPYmplY3RzOiBIaXQgbWF4IHBhZ2UgbGltaXQgKCR7TUFYX1BBR0VTfSkgZm9yICR7YWRkcmVzc31gKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbE9iamVjdHM7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgSlNPTi1SUEMgY2FsbCB0byBJT1RBIGZ1bGxub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gRnVsbG5vZGUgUlBDIFVSTFxuICAgKiBAcGFyYW0gbWV0aG9kIC0gUlBDIG1ldGhvZCBuYW1lXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBSUEMgcGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyBSUEMgcmVzdWx0XG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgUlBDIGNhbGwgZmFpbHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbWFrZVJwY0NhbGwodXJsOiBzdHJpbmcsIG1ldGhvZDogc3RyaW5nLCBwYXJhbXM6IGFueVtdKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgIGlkOiAxLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSUEMgY2FsbCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmIChqc29uLmVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJQQyBlcnJvcjogJHtqc29uLmVycm9yLm1lc3NhZ2UgfHwgSlNPTi5zdHJpbmdpZnkoanNvbi5lcnJvcil9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpzb24ucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHB1YmxpYyBub2RlIFJQQyBVUkwgZnJvbSB0aGUgY2VudHJhbGl6ZWQgZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgUlBDIFVSTCBmb3IgdGhlIGN1cnJlbnQgQml0R28gZW52aXJvbm1lbnRcbiAgICovXG4gIHByb3RlY3RlZCBnZXRQdWJsaWNOb2RlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEVudmlyb25tZW50c1t0aGlzLmJpdGdvLmdldEVudigpXS5pb3RhTm9kZVVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuYXRpdmUgY29pbiB0eXBlIGlkZW50aWZpZXIgZm9yIGZpbHRlcmluZyBvd25lZCBvYmplY3RzLlxuICAgKlxuICAgKiBAcmV0dXJucyBOYXRpdmUgY29pbiB0eXBlIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBnZXROYXRpdmVDb2luVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnMHgyOjppb3RhOjpJT1RBJztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBnYXMgY29uZmlndXJhdGlvbiBmb3IgYSByZWNvdmVyeSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogR2FzIGVzdGltYXRpb24gaXMgZG9uZSB2aWEgYSBkcnktcnVuIG9mIGEgdGVtcG9yYXJ5IHRyYW5zYWN0aW9uLCB0aGVuXG4gICAqIG11bHRpcGxpZWQgYnkgREVGQVVMVF9HQVNfT1ZFUkhFQUQgKDEuMXgpIGFzIGEgc2FmZXR5IGJ1ZmZlci5cbiAgICpcbiAgICogQHBhcmFtIG93bmVkT2JqZWN0cyAtIE5hdGl2ZSBJT1RBIGNvaW4gb2JqZWN0cyB0byB1c2UgYXMgZ2FzIHBheW1lbnRcbiAgICogQHBhcmFtIHNlbmRlckFkZHJlc3MgLSBTZW5kZXIgYWRkcmVzcyBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBSZWNvdmVyeSBwYXJhbWV0ZXJzIChpbmNsdWRlcyByZWNvdmVyeURlc3RpbmF0aW9uLCBycGNVcmwpXG4gICAqIEBwYXJhbSBwYXltZW50T2JqZWN0cyAtIE9wdGlvbmFsIHRva2VuIG9iamVjdHMgZm9yIHRva2VuIHJlY292ZXJ5XG4gICAqIEByZXR1cm5zIEdhcyBidWRnZXQsIGdhcyBwcmljZSwgZ2FzIG9iamVjdHMgYXJyYXksIGFuZCB0b3RhbCBuYXRpdmUgYmFsYW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlR2FzQW5kT2JqZWN0cyhcbiAgICBvd25lZE9iamVjdHM6IElvdGFPYmplY3RXaXRoQmFsYW5jZVtdLFxuICAgIHNlbmRlckFkZHJlc3M6IHN0cmluZyxcbiAgICBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMsXG4gICAgcGF5bWVudE9iamVjdHM/OiBUcmFuc2FjdGlvbk9iamVjdElucHV0W11cbiAgKTogUHJvbWlzZTx7XG4gICAgZ2FzQnVkZ2V0OiBudW1iZXI7XG4gICAgZ2FzUHJpY2U6IG51bWJlcjtcbiAgICBnYXNPYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W107XG4gICAgdG90YWxCYWxhbmNlOiBiaWdpbnQ7XG4gIH0+IHtcbiAgICBjb25zdCBnYXNPYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gPSBvd25lZE9iamVjdHMubWFwKChvYmopID0+ICh7XG4gICAgICBvYmplY3RJZDogb2JqLm9iamVjdElkLFxuICAgICAgdmVyc2lvbjogb2JqLnZlcnNpb24sXG4gICAgICBkaWdlc3Q6IG9iai5kaWdlc3QsXG4gICAgfSkpO1xuICAgIGNvbnN0IHRvdGFsQmFsYW5jZSA9IG93bmVkT2JqZWN0cy5yZWR1Y2UoKHN1bSwgb2JqKSA9PiBzdW0gKyBCaWdJbnQob2JqLmJhbGFuY2UpLCAwbik7XG5cbiAgICBjb25zdCBnYXNQcmljZSA9IGF3YWl0IHRoaXMuZmV0Y2hHYXNQcmljZShwYXJhbXMuZnVsbG5vZGVScGNVcmwpO1xuXG4gICAgLy8gQnVpbGQgdGVtcCB0cmFuc2FjdGlvbiBmb3IgZXN0aW1hdGlvblxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKTtcbiAgICBjb25zdCB0ZW1wQnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgY29uc3QgZXN0aW1hdGlvbkFtb3VudCA9IHRvdGFsQmFsYW5jZSA+IDBuID8gJzEnIDogJzAnO1xuXG4gICAgdGVtcEJ1aWxkZXIuc2VuZGVyKHNlbmRlckFkZHJlc3MpLnJlY2lwaWVudHMoW3sgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIGFtb3VudDogZXN0aW1hdGlvbkFtb3VudCB9XSk7XG5cbiAgICBpZiAocGF5bWVudE9iamVjdHMgJiYgcGF5bWVudE9iamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgdGVtcEJ1aWxkZXIucGF5bWVudE9iamVjdHMocGF5bWVudE9iamVjdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wQnVpbGRlci5wYXltZW50T2JqZWN0cyhnYXNPYmplY3RzKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wVHggPSBhd2FpdCB0ZW1wQnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IGVzdGltYXRlZEdhcyA9IGF3YWl0IHRoaXMuZXN0aW1hdGVHYXMoYXdhaXQgdGVtcFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHBhcmFtcy5mdWxsbm9kZVJwY1VybCk7XG4gICAgY29uc3QgZ2FzQnVkZ2V0ID0gTWF0aC5taW4oTUFYX0dBU19CVURHRVQsIE1hdGgudHJ1bmMoZXN0aW1hdGVkR2FzICogREVGQVVMVF9HQVNfT1ZFUkhFQUQpKTtcblxuICAgIHJldHVybiB7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc09iamVjdHMsIHRvdGFsQmFsYW5jZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWNvdmVySW90YVRva2VuKFxuICAgIHBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyxcbiAgICB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZTogSW90YU9iamVjdFdpdGhCYWxhbmNlW10sXG4gICAgc2VuZGVyQWRkcmVzczogc3RyaW5nLFxuICAgIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsXG4gICAgZGVyaXZlZFB1YmxpY0tleTogc3RyaW5nLFxuICAgIGlkeDogbnVtYmVyLFxuICAgIGJpdGdvS2V5OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxNUENUeHMgfCBNUENTd2VlcFR4cz4ge1xuICAgIHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlID0gdG9rZW5PYmplY3RzV2l0aEJhbGFuY2Uuc29ydCgoYSwgYikgPT4gKEJpZ0ludChiLmJhbGFuY2UpID4gQmlnSW50KGEuYmFsYW5jZSkgPyAxIDogLTEpKTtcbiAgICBpZiAodG9rZW5PYmplY3RzV2l0aEJhbGFuY2UubGVuZ3RoID4gTUFYX09CSkVDVF9MSU1JVCkge1xuICAgICAgdG9rZW5PYmplY3RzV2l0aEJhbGFuY2UgPSB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5zbGljZSgwLCBNQVhfT0JKRUNUX0xJTUlUKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbk9iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlLm1hcCgob2JqKSA9PiAoe1xuICAgICAgb2JqZWN0SWQ6IG9iai5vYmplY3RJZCxcbiAgICAgIHZlcnNpb246IG9iai52ZXJzaW9uLFxuICAgICAgZGlnZXN0OiBvYmouZGlnZXN0LFxuICAgIH0pKTtcbiAgICBjb25zdCB0b2tlbkJhbGFuY2UgPSB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5yZWR1Y2UoKHN1bSwgb2JqKSA9PiBzdW0gKyBCaWdJbnQob2JqLmJhbGFuY2UpLCAwbik7XG4gICAgaWYgKHRva2VuQmFsYW5jZSA8PSAwbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBiYWxhbmNlIGlzIHplcm8nKTtcbiAgICB9XG5cbiAgICBsZXQgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICB0cnkge1xuICAgICAgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlID0gYXdhaXQgdGhpcy5mZXRjaE93bmVkT2JqZWN0cyhzZW5kZXJBZGRyZXNzLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZldGNoIGdhcyBvYmplY3RzIGZvciB0b2tlbiByZWNvdmVyeScpO1xuICAgIH1cbiAgICBpZiAoZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBnYXMgb2JqZWN0cyBmb3VuZCBmb3IgdG9rZW4gcmVjb3ZlcnknKTtcbiAgICB9XG5cbiAgICBnYXNPYmplY3RzV2l0aEJhbGFuY2UgPSBnYXNPYmplY3RzV2l0aEJhbGFuY2Uuc29ydCgoYSwgYikgPT4gKEJpZ0ludChiLmJhbGFuY2UpID4gQmlnSW50KGEuYmFsYW5jZSkgPyAxIDogLTEpKTtcbiAgICBpZiAoZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLmxlbmd0aCA+PSBNQVhfR0FTX09CSkVDVFMpIHtcbiAgICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSA9IGdhc09iamVjdHNXaXRoQmFsYW5jZS5zbGljZSgwLCBNQVhfR0FTX09CSkVDVFMgLSAxKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc09iamVjdHMsIHRvdGFsQmFsYW5jZSB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlR2FzQW5kT2JqZWN0cyhcbiAgICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSxcbiAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICBwYXJhbXMsXG4gICAgICB0b2tlbk9iamVjdHNcbiAgICApO1xuICAgIGNvbnN0IG5ldEdhc0JhbGFuY2UgPSB0b3RhbEJhbGFuY2UgLSBCaWdJbnQoZ2FzQnVkZ2V0KTtcbiAgICBpZiAobmV0R2FzQmFsYW5jZSA8PSAwbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnN1ZmZpY2llbnQgZ2FzIGJhbGFuY2UgZm9yIHRva2VuIHJlY292ZXJ5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB0b2tlbkJhbGFuY2UudG9TdHJpbmcoKTtcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRUeEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcblxuICAgIHR4QnVpbGRlclxuICAgICAgLnNlbmRlcihzZW5kZXJBZGRyZXNzKVxuICAgICAgLnJlY2lwaWVudHMoW3sgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIGFtb3VudDogcmVjb3ZlcnlBbW91bnQgfV0pXG4gICAgICAucGF5bWVudE9iamVjdHModG9rZW5PYmplY3RzKVxuICAgICAgLmdhc0RhdGEoeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNQYXltZW50T2JqZWN0czogZ2FzT2JqZWN0cyB9KTtcblxuICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9ICFwYXJhbXMud2FsbGV0UGFzc3BocmFzZTtcbiAgICBjb25zdCB0b2tlbkNvaW4gPSBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3MgfHwgdGhpcy5nZXRDaGFpbigpO1xuXG4gICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRVbnNpZ25lZFN3ZWVwVHJhbnNhY3Rpb24oXG4gICAgICAgIHR4QnVpbGRlcixcbiAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYml0Z29LZXksXG4gICAgICAgIGlkeCxcbiAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgY29uc3QgZnVsbFNpZ25hdHVyZUJhc2U2NCA9IGF3YWl0IHRoaXMuc2lnblJlY292ZXJ5VHJhbnNhY3Rpb24oXG4gICAgICB0eEJ1aWxkZXIsXG4gICAgICBwYXJhbXMsXG4gICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgIGRlcml2ZWRQdWJsaWNLZXksXG4gICAgICB1bnNpZ25lZFR4XG4gICAgKTtcblxuICAgIGNvbnN0IGZpbmFsVHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gYXdhaXQgZmluYWxUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgc2NhbkluZGV4OiBpZHgsXG4gICAgICAgICAgcmVjb3ZlcnlBbW91bnQsXG4gICAgICAgICAgc2VyaWFsaXplZFR4LFxuICAgICAgICAgIHNpZ25hdHVyZTogZnVsbFNpZ25hdHVyZUJhc2U2NCxcbiAgICAgICAgICBjb2luOiB0b2tlbkNvaW4sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgbGFzdFNjYW5JbmRleDogaWR4LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNpZ25SZWNvdmVyeVRyYW5zYWN0aW9uKFxuICAgIHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyLFxuICAgIHBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyxcbiAgICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIGRlcml2ZWRQdWJsaWNLZXk6IHN0cmluZyxcbiAgICB1bnNpZ25lZFR4OiBUcmFuc2ZlclRyYW5zYWN0aW9uXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFwYXJhbXMudXNlcktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHVzZXJLZXknKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMuYmFja3VwS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYmFja3VwS2V5Jyk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXJhbXMudXNlcktleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IGJhY2t1cEtleSA9IHBhcmFtcy5iYWNrdXBLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcblxuICAgIC8vIERlY3J5cHQgcHJpdmF0ZSBrZXlzIGZyb20gS2V5Q2FyZCB2YWx1ZXNcbiAgICBsZXQgdXNlclBydjogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICB1c2VyUHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IHVzZXJLZXksIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgdXNlciBrZXljaGFpbjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgY29uc3QgdXNlclNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UodXNlclBydikgYXMgRUREU0FNZXRob2RUeXBlcy5Vc2VyU2lnbmluZ01hdGVyaWFsO1xuXG4gICAgbGV0IGJhY2t1cFBydjogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBiYWNrdXBQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogYmFja3VwS2V5LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkZWNyeXB0aW5nIGJhY2t1cCBrZXljaGFpbjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgY29uc3QgYmFja3VwU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShiYWNrdXBQcnYpIGFzIEVERFNBTWV0aG9kVHlwZXMuQmFja3VwU2lnbmluZ01hdGVyaWFsO1xuXG4gICAgLy8gR2VuZXJhdGUgVFNTIHNpZ25hdHVyZVxuICAgIGNvbnN0IHNpZ25hdHVyZUJ1ZmZlciA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRUU1NTaWduYXR1cmUoXG4gICAgICB1c2VyU2lnbmluZ01hdGVyaWFsLFxuICAgICAgYmFja3VwU2lnbmluZ01hdGVyaWFsLFxuICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICB1bnNpZ25lZFR4XG4gICAgKTtcblxuICAgIC8vIEJ1aWxkIGZ1bGwgc2lnbmF0dXJlOiBzY2hlbWVfZmxhZyAoMSBieXRlKSArIHNpZ25hdHVyZSAoNjQgYnl0ZXMpICsgcHVibGljX2tleSAoMzIgYnl0ZXMpXG4gICAgY29uc3Qgc2NoZW1lRmxhZyA9IEJ1ZmZlci5hbGxvYygxLCAweDAwKTsgLy8gRWQyNTUxOSBzY2hlbWVcbiAgICBjb25zdCBwdWJsaWNLZXlCeXRlcyA9IEJ1ZmZlci5mcm9tKGRlcml2ZWRQdWJsaWNLZXksICdoZXgnKTtcbiAgICBjb25zdCBmdWxsU2lnbmF0dXJlID0gQnVmZmVyLmNvbmNhdChbc2NoZW1lRmxhZywgc2lnbmF0dXJlQnVmZmVyLCBwdWJsaWNLZXlCeXRlc10pO1xuXG4gICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogZGVyaXZlZFB1YmxpY0tleSB9LCBzaWduYXR1cmVCdWZmZXIpO1xuXG4gICAgcmV0dXJuIGZ1bGxTaWduYXR1cmUudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY3VycmVudCByZWZlcmVuY2UgZ2FzIHByaWNlIGZyb20gZnVsbG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSBycGNVcmwgLSBPcHRpb25hbCBSUEMgVVJMIG92ZXJyaWRlXG4gICAqIEByZXR1cm5zIEN1cnJlbnQgZ2FzIHByaWNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoR2FzUHJpY2UocnBjVXJsPzogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB1cmwgPSBycGNVcmwgfHwgdGhpcy5nZXRQdWJsaWNOb2RlVXJsKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5tYWtlUnBjQ2FsbCh1cmwsICdpb3RheF9nZXRSZWZlcmVuY2VHYXNQcmljZScsIFtdKTtcbiAgICByZXR1cm4gcGFyc2VJbnQocmVzdWx0LCAxMCk7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVzIGdhcyBmb3IgYSB0cmFuc2FjdGlvbiB2aWEgZHJ5IHJ1bi5cbiAgICpcbiAgICogQHBhcmFtIHR4QmFzZTY0IC0gVHJhbnNhY3Rpb24gaW4gYmFzZTY0IGZvcm1hdFxuICAgKiBAcGFyYW0gcnBjVXJsIC0gT3B0aW9uYWwgUlBDIFVSTCBvdmVycmlkZVxuICAgKiBAcmV0dXJucyBFc3RpbWF0ZWQgZ2FzIGNvc3RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXN0aW1hdGVHYXModHhCYXNlNjQ6IHN0cmluZywgcnBjVXJsPzogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB1cmwgPSBycGNVcmwgfHwgdGhpcy5nZXRQdWJsaWNOb2RlVXJsKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5tYWtlUnBjQ2FsbCh1cmwsICdpb3RhX2RyeVJ1blRyYW5zYWN0aW9uQmxvY2snLCBbdHhCYXNlNjRdKTtcblxuICAgIGNvbnN0IGNvbXB1dGF0aW9uQ29zdCA9IHBhcnNlSW50KHJlc3VsdC5lZmZlY3RzLmdhc1VzZWQuY29tcHV0YXRpb25Db3N0LCAxMCk7XG4gICAgY29uc3Qgc3RvcmFnZUNvc3QgPSBwYXJzZUludChyZXN1bHQuZWZmZWN0cy5nYXNVc2VkLnN0b3JhZ2VDb3N0LCAxMCk7XG4gICAgY29uc3Qgc3RvcmFnZVJlYmF0ZSA9IHBhcnNlSW50KHJlc3VsdC5lZmZlY3RzLmdhc1VzZWQuc3RvcmFnZVJlYmF0ZSwgMTApO1xuXG4gICAgcmV0dXJuIE1hdGgubWF4KGNvbXB1dGF0aW9uQ29zdCArIHN0b3JhZ2VDb3N0IC0gc3RvcmFnZVJlYmF0ZSwgY29tcHV0YXRpb25Db3N0KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRVbnNpZ25lZFN3ZWVwVHJhbnNhY3Rpb24oXG4gICAgdHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gICAgc2VuZGVyQWRkcmVzczogc3RyaW5nLFxuICAgIGJpdGdvS2V5OiBzdHJpbmcsXG4gICAgc2NhbkluZGV4OiBudW1iZXIsXG4gICAgZGVyaXZhdGlvblBhdGg6IHN0cmluZyxcbiAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcz86IHN0cmluZ1xuICApOiBQcm9taXNlPE1QQ1N3ZWVwVHhzPiB7XG4gICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICBjb25zdCBzZXJpYWxpemVkVHggPSBhd2FpdCB1bnNpZ25lZFRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFR4SGV4ID0gQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4LCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHBhcnNlZFR4ID0gYXdhaXQgdGhpcy5wYXJzZVRyYW5zYWN0aW9uKHsgdHhIZXg6IHNlcmlhbGl6ZWRUeEhleCB9KTtcbiAgICBjb25zdCB3YWxsZXRDb2luID0gdG9rZW5Db250cmFjdEFkZHJlc3MgfHwgdGhpcy5nZXRDaGFpbigpO1xuICAgIGNvbnN0IHBhcnNlZE91dHB1dHMgPSBwYXJzZWRUeC5vdXRwdXRzIGFzIEFycmF5PHsgYWRkcmVzczogc3RyaW5nOyBhbW91bnQ6IHN0cmluZyB9PjtcbiAgICBjb25zdCBvdXRwdXQgPSBwYXJzZWRPdXRwdXRzWzBdO1xuXG4gICAgLy8gQnVpbGQgcGFyc2VkIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSBmcm9tIHBhcnNlZCBkYXRhXG4gICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBzZW5kZXJBZGRyZXNzLFxuICAgICAgICB2YWx1ZVN0cmluZzogb3V0cHV0LmFtb3VudCxcbiAgICAgICAgdmFsdWU6IG5ldyBCaWdOdW1iZXIob3V0cHV0LmFtb3VudCksXG4gICAgICB9LFxuICAgIF07XG4gICAgY29uc3Qgb3V0cHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogb3V0cHV0LmFkZHJlc3MsXG4gICAgICAgIHZhbHVlU3RyaW5nOiBvdXRwdXQuYW1vdW50LFxuICAgICAgICBjb2luTmFtZTogd2FsbGV0Q29pbixcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IGNvbXBsZXRlZFBhcnNlZFR4ID0ge1xuICAgICAgaW5wdXRzOiBpbnB1dHMsXG4gICAgICBvdXRwdXRzOiBvdXRwdXRzLFxuICAgICAgc3BlbmRBbW91bnQ6IG91dHB1dC5hbW91bnQsXG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuU2VuZCxcbiAgICB9O1xuXG4gICAgY29uc3QgZmVlID0gcGFyc2VkVHguZmVlIGFzIEJpZ051bWJlcjtcbiAgICBjb25zdCBmZWVJbmZvID0geyBmZWU6IGZlZS50b051bWJlcigpLCBmZWVTdHJpbmc6IGZlZS50b1N0cmluZygpIH07XG4gICAgY29uc3QgY29pblNwZWNpZmljID0geyBjb21tb25LZXljaGFpbjogYml0Z29LZXkgfTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBNUENUeCA9IHtcbiAgICAgIHNlcmlhbGl6ZWRUeDogc2VyaWFsaXplZFR4SGV4LFxuICAgICAgc2NhbkluZGV4LFxuICAgICAgY29pbjogd2FsbGV0Q29pbixcbiAgICAgIHNpZ25hYmxlSGV4OiB1bnNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnaGV4JyksXG4gICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgIHBhcnNlZFR4OiBjb21wbGV0ZWRQYXJzZWRUeCxcbiAgICAgIGZlZUluZm86IGZlZUluZm8sXG4gICAgICBjb2luU3BlY2lmaWM6IGNvaW5TcGVjaWZpYyxcbiAgICB9O1xuXG4gICAgY29uc3QgdW5zaWduZWRUeFdyYXBwZXI6IE1QQ1Vuc2lnbmVkVHggPSB7IHVuc2lnbmVkVHg6IHRyYW5zYWN0aW9uLCBzaWduYXR1cmVTaGFyZXM6IFtdIH07XG4gICAgY29uc3QgdHhSZXF1ZXN0OiBSZWNvdmVyeVR4UmVxdWVzdCA9IHsgdHJhbnNhY3Rpb25zOiBbdW5zaWduZWRUeFdyYXBwZXJdLCB3YWxsZXRDb2luIH07XG4gICAgcmV0dXJuIHsgdHhSZXF1ZXN0czogW3R4UmVxdWVzdF0gfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHJpdmF0ZSBIZWxwZXIgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbmQgZXh0cmFjdHMgdHJhbnNhY3Rpb24gaGV4IGZyb20gcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHR4SGV4IC0gVGhlIHRyYW5zYWN0aW9uIGhleCB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQgKGZvciBlcnJvciBtZXNzYWdlcylcbiAgICogQHJldHVybnMgVGhlIHZhbGlkYXRlZCB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHRocm93cyBFcnJvciBpZiB0eEhleCBpcyBtaXNzaW5nXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHR4SGV4OiBzdHJpbmcgfCB1bmRlZmluZWQsIG9wZXJhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG1pc3NpbmcgcmVxdWlyZWQgdHggcHJlYnVpbGQgcHJvcGVydHkgdHhIZXggZm9yICR7b3BlcmF0aW9ufSBvcGVyYXRpb25gKTtcbiAgICB9XG4gICAgcmV0dXJuIHR4SGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSB0cmFuc2FjdGlvbiBpcyBhIFRyYW5zZmVyVHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiB0byB2YWxpZGF0ZVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRyYW5zYWN0aW9uIGlzIG5vdCBhIFRyYW5zZmVyVHJhbnNhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKCEodHJhbnNhY3Rpb24gaW5zdGFuY2VvZiBUcmFuc2ZlclRyYW5zYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCBub3QgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRyYW5zYWN0aW9uIHJlY2lwaWVudHMgbWF0Y2ggdGhlIGV4cGVjdGVkIHJlY2lwaWVudHMuXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbiAtIFRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGV4cGVjdGVkUmVjaXBpZW50cyAtIFRoZSBleHBlY3RlZCByZWNpcGllbnRzIGZyb20gdHJhbnNhY3Rpb24gcGFyYW1zXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgcmVjaXBpZW50cyBkb24ndCBtYXRjaFxuICAgKi9cbiAgcHJpdmF0ZSB2ZXJpZnlUcmFuc2FjdGlvblJlY2lwaWVudHMoXG4gICAgdHJhbnNhY3Rpb246IFRyYW5zZmVyVHJhbnNhY3Rpb24sXG4gICAgZXhwZWN0ZWRSZWNpcGllbnRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHR4RGF0YSA9IHRyYW5zYWN0aW9uLnRvSnNvbigpIGFzIFRyYW5zZmVyVHhEYXRhO1xuXG4gICAgaWYgKCF0eERhdGEucmVjaXBpZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCByZWNpcGllbnRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdHVhbFJlY2lwaWVudHMgPSB0aGlzLm5vcm1hbGl6ZVJlY2lwaWVudHModHhEYXRhLnJlY2lwaWVudHMpO1xuICAgIGNvbnN0IGV4cGVjdGVkID0gdGhpcy5ub3JtYWxpemVSZWNpcGllbnRzKGV4cGVjdGVkUmVjaXBpZW50cyk7XG5cbiAgICBpZiAoIXRoaXMucmVjaXBpZW50c01hdGNoKGV4cGVjdGVkLCBhY3R1YWxSZWNpcGllbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCByZWNpcGllbnRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIHJlY2lwaWVudHMgYnkgZXh0cmFjdGluZyBvbmx5IHJlbGV2YW50IGZpZWxkcy5cbiAgICogQHBhcmFtIHJlY2lwaWVudHMgLSBSZWNpcGllbnRzIHRvIG5vcm1hbGl6ZVxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIHJlY2lwaWVudHMgd2l0aCBhZGRyZXNzLCBhbW91bnQsIGFuZCB0b2tlbk5hbWUgb25seVxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVSZWNpcGllbnRzKHJlY2lwaWVudHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10pOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdIHtcbiAgICByZXR1cm4gcmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4gXy5waWNrKHJlY2lwaWVudCwgWydhZGRyZXNzJywgJ2Ftb3VudCcsICd0b2tlbk5hbWUnXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBleHBlY3RlZCByZWNpcGllbnRzIG1hdGNoIGFjdHVhbCByZWNpcGllbnRzLlxuICAgKiBAcGFyYW0gZXhwZWN0ZWQgLSBFeHBlY3RlZCByZWNpcGllbnRzXG4gICAqIEBwYXJhbSBhY3R1YWwgLSBBY3R1YWwgcmVjaXBpZW50cyBmcm9tIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHRydWUgaWYgYWxsIGV4cGVjdGVkIHJlY2lwaWVudHMgYXJlIGZvdW5kIGluIGFjdHVhbCByZWNpcGllbnRzXG4gICAqL1xuICBwcml2YXRlIHJlY2lwaWVudHNNYXRjaChleHBlY3RlZDogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSwgYWN0dWFsOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV4cGVjdGVkLmV2ZXJ5KChleHBlY3RlZFJlY2lwaWVudCkgPT5cbiAgICAgIGFjdHVhbC5zb21lKChhY3R1YWxSZWNpcGllbnQpID0+IF8uaXNFcXVhbChleHBlY3RlZFJlY2lwaWVudCwgYWN0dWFsUmVjaXBpZW50KSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gZW1wdHkgcGFyc2VkIHRyYW5zYWN0aW9uIHJlc3VsdC5cbiAgICogVXNlZCB3aGVuIHRyYW5zYWN0aW9uIGhhcyBubyBvdXRwdXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVFbXB0eVBhcnNlZFRyYW5zYWN0aW9uKCk6IFBhcnNlZFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXRzOiBbXSxcbiAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgZmVlOiBuZXcgQmlnTnVtYmVyKDApLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgdHJhbnNhY3Rpb24gZmVlIGZyb20gdGhlIGV4cGxhbmF0aW9uLlxuICAgKiBAcGFyYW0gZXhwbGFuYXRpb24gLSBUaGUgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb25cbiAgICogQHJldHVybnMgVGhlIGZlZSBhcyBhIEJpZ051bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVUcmFuc2FjdGlvbkZlZShleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IEJpZ051bWJlciB7XG4gICAgaWYgKGV4cGxhbmF0aW9uLmZlZS5mZWUgPT09ICcnKSB7XG4gICAgICByZXR1cm4gbmV3IEJpZ051bWJlcigwKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBCaWdOdW1iZXIoZXhwbGFuYXRpb24uZmVlLmZlZSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBpbnB1dHMgYXJyYXkgZm9yIGEgcGFyc2VkIHRyYW5zYWN0aW9uLlxuICAgKiBJbmNsdWRlcyBzZW5kZXIgaW5wdXQgYW5kIG9wdGlvbmFsbHkgc3BvbnNvciBpbnB1dCBpZiBwcmVzZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZXhwbGFuYXRpb24gLSBUaGUgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb25cbiAgICogQHBhcmFtIGZlZSAtIFRoZSBjYWxjdWxhdGVkIHRyYW5zYWN0aW9uIGZlZVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB0cmFuc2FjdGlvbiBpbnB1dHNcbiAgICovXG4gIHByaXZhdGUgYnVpbGRUcmFuc2FjdGlvbklucHV0cyhcbiAgICBleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgICBmZWU6IEJpZ051bWJlclxuICApOiBBcnJheTx7XG4gICAgYWRkcmVzczogc3RyaW5nO1xuICAgIGFtb3VudDogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IGV4cGxhbmF0aW9uLm91dHB1dHNbMF0uYWRkcmVzcztcbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSBuZXcgQmlnTnVtYmVyKGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudCk7XG5cbiAgICAvLyBJZiB0aGVyZSdzIGEgc3BvbnNvciwgc2VuZGVyIG9ubHkgcGF5cyBmb3Igb3V0cHV0c1xuICAgIC8vIE90aGVyd2lzZSwgc2VuZGVyIHBheXMgZm9yIG91dHB1dHMgKyBmZWVcbiAgICBjb25zdCBzZW5kZXJBbW91bnQgPSBleHBsYW5hdGlvbi5zcG9uc29yID8gb3V0cHV0QW1vdW50LnRvRml4ZWQoKSA6IG91dHB1dEFtb3VudC5wbHVzKGZlZSkudG9GaXhlZCgpO1xuXG4gICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBzZW5kZXJBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IHNlbmRlckFtb3VudCxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIEFkZCBzcG9uc29yIGlucHV0IGlmIHByZXNlbnRcbiAgICBpZiAoZXhwbGFuYXRpb24uc3BvbnNvcikge1xuICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiBleHBsYW5hdGlvbi5zcG9uc29yLFxuICAgICAgICBhbW91bnQ6IGZlZS50b0ZpeGVkKCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5wdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgb3V0cHV0cyBhcnJheSBmb3IgYSBwYXJzZWQgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBleHBsYW5hdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB0cmFuc2FjdGlvbiBvdXRwdXRzXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVHJhbnNhY3Rpb25PdXRwdXRzKGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogQXJyYXk8e1xuICAgIGFkZHJlc3M6IHN0cmluZztcbiAgICBhbW91bnQ6IHN0cmluZztcbiAgfT4ge1xuICAgIHJldHVybiBleHBsYW5hdGlvbi5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiAoe1xuICAgICAgYWRkcmVzczogb3V0cHV0LmFkZHJlc3MsXG4gICAgICBhbW91bnQ6IG5ldyBCaWdOdW1iZXIob3V0cHV0LmFtb3VudCkudG9GaXhlZCgpLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdHJhbnNhY3Rpb24gYnVpbGRlciBmYWN0b3J5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IGZvciB0aGlzIGNvaW5cbiAgICovXG4gIHByaXZhdGUgZ2V0VHhCdWlsZGVyRmFjdG9yeSgpOiBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IHtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYnVpbGRzIGEgdHJhbnNhY3Rpb24gZnJvbSBpdHMgaGV4IHJlcHJlc2VudGF0aW9uLlxuICAgKiBAcGFyYW0gdHhIZXggLSBUaGUgdHJhbnNhY3Rpb24gaGV4IHRvIHJlYnVpbGRcbiAgICogQHJldHVybnMgVGhlIHJlYnVpbHQgdHJhbnNhY3Rpb25cbiAgICogQHRocm93cyBFcnJvciBpZiB0cmFuc2FjdGlvbiBjYW5ub3QgYmUgcmVidWlsdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWJ1aWxkVHJhbnNhY3Rpb24odHhIZXg6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXJGYWN0b3J5ID0gdGhpcy5nZXRUeEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IHR4QnVpbGRlckZhY3RvcnkuZnJvbSh0eEhleCk7XG4gICAgICByZXR1cm4gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlYnVpbGQgdHJhbnNhY3Rpb246ICR7ZXJyLnRvU3RyaW5nKCl9YCk7XG4gICAgfVxuICB9XG59XG4iXX0=
871
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQTZCeUI7QUFDekIsNENBQWdGO0FBQ2hGLHdEQUFnQztBQUNoQywrQkFBMkc7QUFDM0csb0RBQTZFO0FBQzdFLGdFQUFxQztBQUNyQywwQ0FBNEI7QUFRNUIsbUVBQWdFO0FBQ2hFLCtDQU15QjtBQVV6Qjs7O0dBR0c7QUFDSCxNQUFhLElBQUssU0FBUSxtQkFBUTtJQUdoQyxZQUFzQixLQUFnQixFQUFFLFdBQXVDO1FBQzdFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLDZCQUE2QjtJQUM3QiwyQ0FBMkM7SUFFM0MsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFB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QUFtQixFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLE9BQU8sQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztRQUNsRCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWxpQ0Qsb0JBa2lDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBFRERTQU1ldGhvZHMsXG4gIEVERFNBTWV0aG9kVHlwZXMsXG4gIEVudmlyb25tZW50cyxcbiAgS2V5UGFpcixcbiAgTVBDQWxnb3JpdGhtLFxuICBNUENDb25zb2xpZGF0aW9uUmVjb3ZlcnlPcHRpb25zLFxuICBNUENSZWNvdmVyeU9wdGlvbnMsXG4gIE1QQ1N3ZWVwVHhzLFxuICBNUENUeCxcbiAgTVBDVHhzLFxuICBNUENUeXBlLFxuICBNUENVbnNpZ25lZFR4LFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBQb3B1bGF0ZWRJbnRlbnQsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25XaXRoSW50ZW50T3B0aW9ucyxcbiAgUmVjb3ZlcnlUeFJlcXVlc3QsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzLFxuICBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIENvaW5GYW1pbHksIGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgYXMgSW90YUtleVBhaXIsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkJ1aWxkZXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuL2xpYic7XG5pbXBvcnQgeyBhdWRpdEVkZHNhUHJpdmF0ZUtleSwgZ2V0RGVyaXZhdGlvblBhdGggfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgSW90YVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBUcmFuc2ZlclR4RGF0YSxcbiAgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCxcbn0gZnJvbSAnLi9saWIvaWZhY2UnO1xuaW1wb3J0IHsgVHJhbnNmZXJUcmFuc2FjdGlvbiB9IGZyb20gJy4vbGliL3RyYW5zZmVyVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9HQVNfT1ZFUkhFQUQsXG4gIERFRkFVTFRfU0NBTl9GQUNUT1IsXG4gIE1BWF9HQVNfQlVER0VULFxuICBNQVhfR0FTX09CSkVDVFMsXG4gIE1BWF9PQkpFQ1RfTElNSVQsXG59IGZyb20gJy4vbGliL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW90YVJlY292ZXJ5T3B0aW9ucyBleHRlbmRzIE1QQ1JlY292ZXJ5T3B0aW9ucyB7XG4gIGZ1bGxub2RlUnBjVXJsPzogc3RyaW5nOyAvLyBPdmVycmlkZSBkZWZhdWx0IFJQQyBVUkxcbn1cblxuaW50ZXJmYWNlIElvdGFPYmplY3RXaXRoQmFsYW5jZSBleHRlbmRzIFRyYW5zYWN0aW9uT2JqZWN0SW5wdXQge1xuICBiYWxhbmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSU9UQSBjb2luIGltcGxlbWVudGF0aW9uLlxuICogU3VwcG9ydHMgVFNTIChUaHJlc2hvbGQgU2lnbmF0dXJlIFNjaGVtZSkgd2l0aCBFRERTQSBhbGdvcml0aG0uXG4gKi9cbmV4cG9ydCBjbGFzcyBJb3RhIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gSU9UQSBjb2luIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IElvdGEoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29pbiBDb25maWd1cmF0aW9uIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGdldEJhc2VGYWN0b3IoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4ubmFtZTtcbiAgfVxuXG4gIGdldEZhbWlseSgpOiBDb2luRmFtaWx5IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZmFtaWx5O1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZnVsbE5hbWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE11bHRpLVNpZ25hdHVyZSBhbmQgVFNTIFN1cHBvcnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLnRzcztcbiAgfVxuXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiBNUENUeXBlLkVERFNBO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBZGRyZXNzIGFuZCBQdWJsaWMgS2V5IFZhbGlkYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW4gSU9UQSBhZGRyZXNzLlxuICAgKiBAcGFyYW0gYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHZhbGlkYXRlICg2NC1jaGFyYWN0ZXIgaGV4IHN0cmluZylcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZFxuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBwdWIgLSBUaGUgcHVibGljIGtleSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBwdWJsaWMga2V5IGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkocHViKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBpZiBhbiBhZGRyZXNzIGJlbG9uZ3MgdG8gYSBUU1Mgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVmVyaWZpY2F0aW9uIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHdhbGxldCBhZGRyZXNzIGFuZCB1c2VyL2JhY2t1cCBwdWJsaWMga2V5c1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGJlbG9uZ3MgdG8gdGhlIHdhbGxldFxuICAgKi9cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKFxuICAgICAgcGFyYW1zLFxuICAgICAgKGFkZHJlc3MpID0+IHRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksXG4gICAgICAocHVibGljS2V5KSA9PiB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXkpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVHJhbnNhY3Rpb24gRXhwbGFuYXRpb24gYW5kIFZlcmlmaWNhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEV4cGxhaW5zIGEgdHJhbnNhY3Rpb24gYnkgcGFyc2luZyBpdHMgaGV4IHJlcHJlc2VudGF0aW9uLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIHRoZSB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMgRGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHhIZXggaXMgbWlzc2luZyBvciB0cmFuc2FjdGlvbiBjYW5ub3QgYmUgZXhwbGFpbmVkXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgY29uc3QgcmF3VHggPSB0aGlzLnZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHBhcmFtcy50eEhleCwgJ2V4cGxhaW4nKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucmVidWlsZFRyYW5zYWN0aW9uKHJhd1R4KTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIHBhcmFtZXRlcnMuXG4gICAqIEVuc3VyZXMgcmVjaXBpZW50cyBhbmQgYW1vdW50cyBhbGlnbiB3aXRoIHRoZSBpbnRlbmRlZCB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFZlcmlmaWNhdGlvbiBwYXJhbWV0ZXJzIGNvbnRhaW5pbmcgcHJlYnVpbGQgYW5kIG9yaWdpbmFsIHBhcmFtc1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHZlcmlmaWNhdGlvbiBzdWNjZWVkc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZlcmlmaWNhdGlvbiBmYWlsc1xuICAgKi9cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQsIHR4UGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcmF3VHggPSB0aGlzLnZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHR4UHJlYnVpbGQudHhIZXgsICd2ZXJpZnknKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb24pO1xuXG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy52ZXJpZnlUcmFuc2FjdGlvblJlY2lwaWVudHModHJhbnNhY3Rpb24gYXMgVHJhbnNmZXJUcmFuc2FjdGlvbiwgdHhQYXJhbXMucmVjaXBpZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgdHJhbnNhY3Rpb24gYW5kIGV4dHJhY3RzIGlucHV0cywgb3V0cHV0cywgYW5kIGZlZXMuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBQYXJzZWQgdHJhbnNhY3Rpb24gd2l0aCBpbnB1dHMsIG91dHB1dHMsIGFuZCBmZWUgaW5mb3JtYXRpb25cbiAgICovXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBJb3RhUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXg6IHBhcmFtcy50eEhleCB9KTtcblxuICAgIGlmICghdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB8fCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVFbXB0eVBhcnNlZFRyYW5zYWN0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmVlID0gdGhpcy5jYWxjdWxhdGVUcmFuc2FjdGlvbkZlZSh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKTtcbiAgICBjb25zdCBpbnB1dHMgPSB0aGlzLmJ1aWxkVHJhbnNhY3Rpb25JbnB1dHModHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgZmVlKTtcbiAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5idWlsZFRyYW5zYWN0aW9uT3V0cHV0cyh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKTtcblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgZmVlIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEtleSBHZW5lcmF0aW9uIGFuZCBTaWduaW5nXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEga2V5IHBhaXIgZm9yIElPVEEgdHJhbnNhY3Rpb25zLlxuICAgKiBAcGFyYW0gc2VlZCAtIE9wdGlvbmFsIHNlZWQgdG8gZ2VuZXJhdGUgZGV0ZXJtaW5pc3RpYyBrZXkgcGFpclxuICAgKiBAcmV0dXJucyBLZXkgcGFpciB3aXRoIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXlzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgcHJpdmF0ZSBrZXkgZ2VuZXJhdGlvbiBmYWlsc1xuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBJb3RhS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgSW90YUtleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG5cbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleXMucHViLFxuICAgICAgcHJ2OiBrZXlzLnBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gKG5vdCBpbXBsZW1lbnRlZCBmb3IgSU9UQSkuXG4gICAqIElPVEEgdHJhbnNhY3Rpb25zIGFyZSBzaWduZWQgZXh0ZXJuYWxseSB1c2luZyBUU1MuXG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdWRpdHMgYSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXkgdG8gZW5zdXJlIGl0J3MgdmFsaWQgZm9yIHRoZSBnaXZlbiBwdWJsaWMga2V5LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIG11bHRpU2lnVHlwZSwgcHJpdmF0ZSBrZXksIGFuZCBwdWJsaWMga2V5XG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgbXVsdGlTaWdUeXBlIGlzIG5vdCBUU1Mgb3IgaWYga2V5IHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgbXVsdGlTaWdUeXBlLCBwcnYsIHB1YmxpY0tleSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyk6IHZvaWQge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgIT09IG11bHRpc2lnVHlwZXMudHNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cbiAgICBhdWRpdEVkZHNhUHJpdmF0ZUtleShwcnYsIHB1YmxpY0tleSA/PyAnJyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIHNpZ25hYmxlIHBheWxvYWQgZnJvbSBhIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBzZXJpYWxpemVkVHggLSBUaGUgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNpZ25hYmxlIHBheWxvYWRcbiAgICovXG4gIGFzeW5jIGdldFNpZ25hYmxlUGF5bG9hZChzZXJpYWxpemVkVHg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgcmVidWlsdFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24oc2VyaWFsaXplZFR4KTtcbiAgICByZXR1cm4gcmVidWlsdFRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY29pbi1zcGVjaWZpYyBmaWVsZHMgaW4gdGhlIHRyYW5zYWN0aW9uIGludGVudC5cbiAgICogQHBhcmFtIGludGVudCAtIFRoZSBwb3B1bGF0ZWQgaW50ZW50IG9iamVjdCB0byBtb2RpZnlcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgY29udGFpbmluZyB1bnNwZW50cyBkYXRhXG4gICAqL1xuICBzZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudChpbnRlbnQ6IFBvcHVsYXRlZEludGVudCwgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpbnRlbnQudW5zcGVudHMgPSBwYXJhbXMudW5zcGVudHM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uKHMpIHdpdGhvdXQgQml0R29cbiAgICpcbiAgICogQHBhcmFtIHtJb3RhUmVjb3ZlcnlPcHRpb25zfSBwYXJhbXMgcGFyYW1ldGVycyBuZWVkZWQgdG8gY29uc3RydWN0IGFuZFxuICAgKiAobWF5YmUpIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEByZXR1cm5zIHtNUENUeCB8IE1QQ1N3ZWVwVHhzfSBhcnJheSBvZiB0aGUgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBoZXggc3RyaW5ncyBhbmQgaW5kaWNlc1xuICAgKiBvZiB0aGUgYWRkcmVzc2VzIGJlaW5nIHN3ZXB0XG4gICAqL1xuICBhc3luYyByZWNvdmVyKHBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8TVBDVHhzIHwgTVBDU3dlZXBUeHM+IHtcbiAgICBpZiAoIXBhcmFtcy5iaXRnb0tleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGJpdGdvS2V5Jyk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24gfHwgIXRoaXMuaXNWYWxpZEFkZHJlc3MocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbiBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRJZHggPSB1dGlscy5nZXRTYWZlTnVtYmVyKDAsICdJbnZhbGlkIHN0YXJ0aW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3NlcycsIHBhcmFtcy5zdGFydGluZ1NjYW5JbmRleCk7XG4gICAgY29uc3QgbnVtSXRlcmF0aW9ucyA9IHV0aWxzLmdldFNhZmVOdW1iZXIoREVGQVVMVF9TQ0FOX0ZBQ1RPUiwgJ0ludmFsaWQgc2Nhbm5pbmcgZmFjdG9yJywgcGFyYW1zLnNjYW4pO1xuICAgIGNvbnN0IGVuZElkeCA9IHN0YXJ0SWR4ICsgbnVtSXRlcmF0aW9ucztcbiAgICBjb25zdCBiaXRnb0tleSA9IHBhcmFtcy5iaXRnb0tleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG5cbiAgICBmb3IgKGxldCBpZHggPSBzdGFydElkeDsgaWR4IDwgZW5kSWR4OyBpZHgrKykge1xuICAgICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSAocGFyYW1zLnNlZWQgPyBnZXREZXJpdmF0aW9uUGF0aChwYXJhbXMuc2VlZCkgOiAnbScpICsgYC8ke2lkeH1gO1xuICAgICAgY29uc3QgZGVyaXZlZFB1YmxpY0tleSA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGJpdGdvS2V5LCBkZXJpdmF0aW9uUGF0aCkuc2xpY2UoMCwgNjQpO1xuICAgICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KGRlcml2ZWRQdWJsaWNLZXkpO1xuXG4gICAgICAvLyBUb2tlbiByZWNvdmVyeSBwYXRoOiByZWNvdmVyIHRoZSB0b2tlbiBwcm92aWRlZCBieSB1c2VyXG4gICAgICBpZiAocGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzKSB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuaGFzVG9rZW5CYWxhbmNlKHNlbmRlckFkZHJlc3MsIHBhcmFtcykpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdG9rZW5PYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0b2tlbk9iamVjdHMgPSBhd2FpdCB0aGlzLmZldGNoT3duZWRPYmplY3RzKFxuICAgICAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgICAgIHBhcmFtcy5mdWxsbm9kZVJwY1VybCxcbiAgICAgICAgICAgIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbk9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlY292ZXJJb3RhVG9rZW4oXG4gICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICB0b2tlbk9iamVjdHMsXG4gICAgICAgICAgICBzZW5kZXJBZGRyZXNzLFxuICAgICAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgICAgICBkZXJpdmVkUHVibGljS2V5LFxuICAgICAgICAgICAgaWR4LFxuICAgICAgICAgICAgYml0Z29LZXlcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IG93bmVkT2JqZWN0czogSW90YU9iamVjdFdpdGhCYWxhbmNlW107XG4gICAgICB0cnkge1xuICAgICAgICBvd25lZE9iamVjdHMgPSBhd2FpdCB0aGlzLmZldGNoT3duZWRPYmplY3RzKHNlbmRlckFkZHJlc3MsIHBhcmFtcy5mdWxsbm9kZVJwY1VybCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAob3duZWRPYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FwIG9iamVjdHMgdG8gcHJldmVudCBvdmVyc2l6ZWQgdHJhbnNhY3Rpb25zIChJT1RBIG1heCB0eCBzaXplID0gMTI4IEtpQilcbiAgICAgIGlmIChvd25lZE9iamVjdHMubGVuZ3RoID4gTUFYX0dBU19PQkpFQ1RTKSB7XG4gICAgICAgIG93bmVkT2JqZWN0cyA9IG93bmVkT2JqZWN0c1xuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiAoQmlnSW50KGIuYmFsYW5jZSkgPiBCaWdJbnQoYS5iYWxhbmNlKSA/IDEgOiAtMSkpXG4gICAgICAgICAgLnNsaWNlKDAsIE1BWF9HQVNfT0JKRUNUUyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZ2FzQnVkZ2V0LCBnYXNQcmljZSwgZ2FzT2JqZWN0cywgdG90YWxCYWxhbmNlIH0gPSBhd2FpdCB0aGlzLnByZXBhcmVHYXNBbmRPYmplY3RzKFxuICAgICAgICBvd25lZE9iamVjdHMsXG4gICAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICAgIHBhcmFtc1xuICAgICAgKTtcblxuICAgICAgY29uc3QgbmV0QmFsYW5jZSA9IHRvdGFsQmFsYW5jZSAtIEJpZ0ludChnYXNCdWRnZXQpO1xuXG4gICAgICBpZiAobmV0QmFsYW5jZSA8PSAwbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gbmV0QmFsYW5jZS50b1N0cmluZygpO1xuXG4gICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRUeEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuXG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLnNlbmRlcihzZW5kZXJBZGRyZXNzKVxuICAgICAgICAucmVjaXBpZW50cyhbeyBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgYW1vdW50OiByZWNvdmVyeUFtb3VudCB9XSlcbiAgICAgICAgLmdhc0RhdGEoeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNQYXltZW50T2JqZWN0czogZ2FzT2JqZWN0cyB9KTtcblxuICAgICAgLy8gUmV0dXJuIHVuc2lnbmVkIHRyYW5zYWN0aW9uIGZvciBjb2xkL2N1c3RvZHkgd2FsbGV0c1xuICAgICAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlO1xuICAgICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFVuc2lnbmVkU3dlZXBUcmFuc2FjdGlvbih0eEJ1aWxkZXIsIHNlbmRlckFkZHJlc3MsIGJpdGdvS2V5LCBpZHgsIGRlcml2YXRpb25QYXRoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQnVpbGQgdHJhbnNhY3Rpb24gZm9yIHNpZ25pbmdcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIC8vIFNpZ24gdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIGtleXNcbiAgICAgIGNvbnN0IGZ1bGxTaWduYXR1cmVCYXNlNjQgPSBhd2FpdCB0aGlzLnNpZ25SZWNvdmVyeVRyYW5zYWN0aW9uKFxuICAgICAgICB0eEJ1aWxkZXIsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgIGRlcml2ZWRQdWJsaWNLZXksXG4gICAgICAgIHVuc2lnbmVkVHhcbiAgICAgICk7XG5cbiAgICAgIC8vIEJ1aWxkIGFuZCByZXR1cm4gc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBmaW5hbFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gYXdhaXQgZmluYWxUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzY2FuSW5kZXg6IGlkeCxcbiAgICAgICAgICAgIHJlY292ZXJ5QW1vdW50LFxuICAgICAgICAgICAgc2VyaWFsaXplZFR4LFxuICAgICAgICAgICAgc2lnbmF0dXJlOiBmdWxsU2lnbmF0dXJlQmFzZTY0LFxuICAgICAgICAgICAgY29pbjogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGxhc3RTY2FuSW5kZXg6IGlkeCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggc3VmZmljaWVudCBmdW5kcyB0byByZWNvdmVyLiBgICtcbiAgICAgICAgYFNjYW5uZWQgYWRkcmVzc2VzIGZyb20gaW5kZXggJHtzdGFydElkeH0gdG8gJHtlbmRJZHggLSAxfS4gYCArXG4gICAgICAgIGBQbGVhc2Ugc3RhcnQgdGhlIG5leHQgc2NhbiBhdCBhZGRyZXNzIGluZGV4ICR7ZW5kSWR4fS5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgYWRkcmVzcyBob2xkcyBhIHBvc2l0aXZlIGJhbGFuY2Ugb2YgdGhlIHNwZWNpZmllZCB0b2tlbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFzVG9rZW5CYWxhbmNlKHNlbmRlckFkZHJlc3M6IHN0cmluZywgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCB0aGlzLmdldEJhbGFuY2Uoc2VuZGVyQWRkcmVzcywgcGFyYW1zLmZ1bGxub2RlUnBjVXJsLCBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3MpO1xuICAgICAgcmV0dXJuIGJhbGFuY2UgPiAwbjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlcyBmdW5kcyBmcm9tIG11bHRpcGxlIHJlY2VpdmUgYWRkcmVzc2VzIHRvIHRoZSBiYXNlIGFkZHJlc3MgKGluZGV4IDApLlxuICAgKiBJZiB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBwcm92aWRlZCwgcmV0dXJucyB1bnNpZ25lZCB0cmFuc2FjdGlvbnMgZm9yIG9mZmxpbmUgc2lnbmluZ1xuICAgKiAoY29sZC9jdXN0b2R5IHdhbGxldCByZWNvdmVyeSkuIE90aGVyd2lzZSwgcmV0dXJucyBzaWduZWQgdHJhbnNhY3Rpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQ29uc29saWRhdGlvbiByZWNvdmVyeSBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBwYXJhbXMuYml0Z29LZXkgLSBUaGUgY29tbW9uS2V5Y2hhaW4gKGNvbWJpbmVkIFRTUyBwdWJsaWMga2V5KVxuICAgKiBAcGFyYW0gcGFyYW1zLnN0YXJ0aW5nU2NhbkluZGV4IC0gU3RhcnRpbmcgYWRkcmVzcyBpbmRleCB0byBzY2FuIChkZWZhdWx0OiAxKVxuICAgKiBAcGFyYW0gcGFyYW1zLmVuZGluZ1NjYW5JbmRleCAtIEVuZGluZyBhZGRyZXNzIGluZGV4IHRvIHNjYW4gKGRlZmF1bHQ6IHN0YXJ0aW5nU2NhbkluZGV4ICsgMjApXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIE9wdGlvbmFsIHBhc3NwaHJhc2UgZm9yIHNpZ25pbmcgKG9taXQgZm9yIHVuc2lnbmVkIHRyYW5zYWN0aW9ucylcbiAgICogQHJldHVybnMgTVBDVHhzIChzaWduZWQpIG9yIE1QQ1N3ZWVwVHhzICh1bnNpZ25lZCkgY29udGFpbmluZyBhbGwgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnNcbiAgICogQHRocm93cyBFcnJvciBpZiBubyBhZGRyZXNzZXMgd2l0aCBmdW5kcyBhcmUgZm91bmQgaW4gdGhlIHNjYW4gcmFuZ2VcbiAgICovXG4gIGFzeW5jIHJlY292ZXJDb25zb2xpZGF0aW9ucyhwYXJhbXM6IE1QQ0NvbnNvbGlkYXRpb25SZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPE1QQ1R4cyB8IE1QQ1N3ZWVwVHhzPiB7XG4gICAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlO1xuXG4gICAgY29uc3Qgc3RhcnRJZHggPSB1dGlscy5nZXRTYWZlTnVtYmVyKDEsICdJbnZhbGlkIHN0YXJ0aW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3NlcycsIHBhcmFtcy5zdGFydGluZ1NjYW5JbmRleCk7XG4gICAgY29uc3QgZW5kSWR4ID0gdXRpbHMuZ2V0U2FmZU51bWJlcihcbiAgICAgIHN0YXJ0SWR4ICsgREVGQVVMVF9TQ0FOX0ZBQ1RPUixcbiAgICAgICdJbnZhbGlkIGVuZGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMnLFxuICAgICAgcGFyYW1zLmVuZGluZ1NjYW5JbmRleFxuICAgICk7XG5cbiAgICBpZiAoc3RhcnRJZHggPCAxIHx8IGVuZElkeCA8PSBzdGFydElkeCB8fCBlbmRJZHggLSBzdGFydElkeCA+IDEwICogREVGQVVMVF9TQ0FOX0ZBQ1RPUikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBzdGFydGluZyBvciBlbmRpbmcgaW5kZXggdG8gc2NhbiBmb3IgYWRkcmVzc2VzLiBzdGFydGluZ1NjYW5JbmRleDogJHtzdGFydElkeH0sIGVuZGluZ1NjYW5JbmRleDogJHtlbmRJZHh9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29LZXkgPSBwYXJhbXMuYml0Z29LZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBNUEMgPSBhd2FpdCBFRERTQU1ldGhvZHMuZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSAocGFyYW1zLnNlZWQgPyBnZXREZXJpdmF0aW9uUGF0aChwYXJhbXMuc2VlZCkgOiAnbScpICsgJy8wJztcbiAgICBjb25zdCBkZXJpdmVkQmFzZVB1YmxpY0tleSA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGJpdGdvS2V5LCBiYXNlUGF0aCkuc2xpY2UoMCwgNjQpO1xuICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoZGVyaXZlZEJhc2VQdWJsaWNLZXkpO1xuXG4gICAgY29uc3QgY29uc29saWRhdGlvblRyYW5zYWN0aW9uczogYW55W10gPSBbXTtcbiAgICBsZXQgbGFzdFNjYW5JbmRleCA9IHN0YXJ0SWR4O1xuXG4gICAgZm9yIChsZXQgaWR4ID0gc3RhcnRJZHg7IGlkeCA8IGVuZElkeDsgaWR4KyspIHtcbiAgICAgIGNvbnN0IHJlY292ZXJQYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMgPSB7XG4gICAgICAgIHVzZXJLZXk6IHBhcmFtcy51c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXk6IHBhcmFtcy5iYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5OiBwYXJhbXMuYml0Z29LZXksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBzZWVkOiBwYXJhbXMuc2VlZCxcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogYmFzZUFkZHJlc3MsIC8vIENvbnNvbGlkYXRlIHRvIGJhc2UgYWRkcmVzc1xuICAgICAgICBzdGFydGluZ1NjYW5JbmRleDogaWR4LFxuICAgICAgICBzY2FuOiAxLFxuICAgICAgfTtcblxuICAgICAgbGV0IHJlY292ZXJ5VHJhbnNhY3Rpb246IE1QQ1R4cyB8IE1QQ1N3ZWVwVHhzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVjb3ZlcnlUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucmVjb3ZlcihyZWNvdmVyUGFyYW1zKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKChlIGFzIEVycm9yKS5tZXNzYWdlLnN0YXJ0c1dpdGgoJ0RpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggc3VmZmljaWVudCBmdW5kcyB0byByZWNvdmVyLicpKSB7XG4gICAgICAgICAgbGFzdFNjYW5JbmRleCA9IGlkeDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaCgocmVjb3ZlcnlUcmFuc2FjdGlvbiBhcyBNUENTd2VlcFR4cykudHhSZXF1ZXN0c1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLnB1c2goKHJlY292ZXJ5VHJhbnNhY3Rpb24gYXMgTVBDVHhzKS50cmFuc2FjdGlvbnNbMF0pO1xuICAgICAgfVxuICAgICAgbGFzdFNjYW5JbmRleCA9IGlkeDtcbiAgICB9XG5cbiAgICBpZiAoY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggc3VmZmljaWVudCBmdW5kcyB0byByZWNvdmVyLiBQbGVhc2Ugc3RhcnQgdGhlIG5leHQgc2NhbiBhdCBhZGRyZXNzIGluZGV4ICR7XG4gICAgICAgICAgbGFzdFNjYW5JbmRleCArIDFcbiAgICAgICAgfS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnNbXG4gICAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMubGVuZ3RoIC0gMVxuICAgICAgXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5jb2luU3BlY2lmaWMubGFzdFNjYW5JbmRleCA9IGxhc3RTY2FuSW5kZXg7XG4gICAgICByZXR1cm4geyB0eFJlcXVlc3RzOiBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHJhbnNhY3Rpb25zOiBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLCBsYXN0U2NhbkluZGV4IH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdG90YWwgY29pbiBiYWxhbmNlIGZvciBhbiBhZGRyZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gYWRkcmVzcyAtIElPVEEgYWRkcmVzcyB0byBxdWVyeVxuICAgKiBAcGFyYW0gcnBjVXJsIC0gT3B0aW9uYWwgUlBDIFVSTCBvdmVycmlkZVxuICAgKiBAcGFyYW0gY29pblR5cGUgLSBPcHRpb25hbCBjb2luIHR5cGUgKGRlZmF1bHRzIHRvIG5hdGl2ZSBJT1RBKVxuICAgKiBAcmV0dXJucyBUb3RhbCBiYWxhbmNlIGFzIGEgYmlnaW50XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEJhbGFuY2UoYWRkcmVzczogc3RyaW5nLCBycGNVcmw/OiBzdHJpbmcsIGNvaW5UeXBlPzogc3RyaW5nKTogUHJvbWlzZTxiaWdpbnQ+IHtcbiAgICBjb25zdCB1cmwgPSBycGNVcmwgfHwgdGhpcy5nZXRQdWJsaWNOb2RlVXJsKCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZENvaW5UeXBlID0gY29pblR5cGUgfHwgdGhpcy5nZXROYXRpdmVDb2luVHlwZSgpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5tYWtlUnBjQ2FsbCh1cmwsICdpb3RheF9nZXRCYWxhbmNlJywgW2FkZHJlc3MsIG5vcm1hbGl6ZWRDb2luVHlwZV0pO1xuICAgIHJldHVybiBCaWdJbnQocmVzcG9uc2UudG90YWxCYWxhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIG93bmVkIG9iamVjdHMgZm9yIGFuIGFkZHJlc3MgdmlhIGZ1bGxub2RlIFJQQy5cbiAgICogSGFuZGxlcyBwYWdpbmF0aW9uIHRvIHJldHJpZXZlIGFsbCBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0gYWRkcmVzcyAtIElPVEEgYWRkcmVzcyB0byBxdWVyeVxuICAgKiBAcGFyYW0gcnBjVXJsIC0gT3B0aW9uYWwgUlBDIFVSTCBvdmVycmlkZVxuICAgKiBAcGFyYW0gY29pblR5cGUgLSBPcHRpb25hbCBjb2luIHR5cGUgdG8gZmlsdGVyIG9iamVjdHMgKGRlZmF1bHRzIHRvIG5hdGl2ZSBJT1RBKVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBvd25lZCBvYmplY3RzIHdpdGggYmFsYW5jZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaE93bmVkT2JqZWN0cyhcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgcnBjVXJsPzogc3RyaW5nLFxuICAgIGNvaW5UeXBlPzogc3RyaW5nXG4gICk6IFByb21pc2U8SW90YU9iamVjdFdpdGhCYWxhbmNlW10+IHtcbiAgICBjb25zdCB1cmwgPSBycGNVcmwgfHwgdGhpcy5nZXRQdWJsaWNOb2RlVXJsKCk7XG4gICAgY29uc3QgYWxsT2JqZWN0czogSW90YU9iamVjdFdpdGhCYWxhbmNlW10gPSBbXTtcbiAgICBjb25zdCBpbm5lckNvaW5UeXBlID0gY29pblR5cGUgfHwgdGhpcy5nZXROYXRpdmVDb2luVHlwZSgpO1xuICAgIGNvbnN0IHN0cnVjdFR5cGUgPSBgMHgyOjpjb2luOjpDb2luPCR7aW5uZXJDb2luVHlwZX0+YDtcbiAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzTmV4dFBhZ2UgPSB0cnVlO1xuICAgIGNvbnN0IE1BWF9QQUdFUyA9IDUwMDtcbiAgICBsZXQgcGFnZUNvdW50ID0gMDtcbiAgICB3aGlsZSAoaGFzTmV4dFBhZ2UgJiYgcGFnZUNvdW50IDwgTUFYX1BBR0VTKSB7XG4gICAgICBwYWdlQ291bnQrKztcbiAgICAgIGNvbnN0IHF1ZXJ5ID0ge1xuICAgICAgICBmaWx0ZXI6IHsgU3RydWN0VHlwZTogc3RydWN0VHlwZSB9LFxuICAgICAgICBvcHRpb25zOiB7IHNob3dDb250ZW50OiB0cnVlLCBzaG93VHlwZTogdHJ1ZSB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm1ha2VScGNDYWxsKHVybCwgJ2lvdGF4X2dldE93bmVkT2JqZWN0cycsIFthZGRyZXNzLCBxdWVyeSwgY3Vyc29yLCA1MF0pO1xuICAgICAgY29uc3QgeyBkYXRhLCBuZXh0Q3Vyc29yLCBoYXNOZXh0UGFnZTogbW9yZSB9ID0gcmVzcG9uc2U7XG5cbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhIHx8IFtdKSB7XG4gICAgICAgIGNvbnN0IHsgb2JqZWN0SWQsIHZlcnNpb24sIGRpZ2VzdCB9ID0gaXRlbS5kYXRhO1xuICAgICAgICBjb25zdCBiYWxhbmNlID0gaXRlbS5kYXRhLmNvbnRlbnQ/LmZpZWxkcz8uYmFsYW5jZSB8fCAnMCc7XG4gICAgICAgIGlmIChCaWdJbnQoYmFsYW5jZSkgPiAwbikge1xuICAgICAgICAgIGFsbE9iamVjdHMucHVzaCh7IG9iamVjdElkLCB2ZXJzaW9uOiB2ZXJzaW9uLnRvU3RyaW5nKCksIGRpZ2VzdCwgYmFsYW5jZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV4dEN1cnNvciA9PT0gY3Vyc29yKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaGFzTmV4dFBhZ2UgPSBtb3JlO1xuICAgICAgY3Vyc29yID0gbmV4dEN1cnNvcjtcbiAgICB9XG5cbiAgICBpZiAocGFnZUNvdW50ID49IE1BWF9QQUdFUykge1xuICAgICAgY29uc29sZS53YXJuKGBmZXRjaE93bmVkT2JqZWN0czogSGl0IG1heCBwYWdlIGxpbWl0ICgke01BWF9QQUdFU30pIGZvciAke2FkZHJlc3N9YCk7XG4gICAgfVxuICAgIHJldHVybiBhbGxPYmplY3RzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIEpTT04tUlBDIGNhbGwgdG8gSU9UQSBmdWxsbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHVybCAtIEZ1bGxub2RlIFJQQyBVUkxcbiAgICogQHBhcmFtIG1ldGhvZCAtIFJQQyBtZXRob2QgbmFtZVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUlBDIHBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgUlBDIHJlc3VsdFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIFJQQyBjYWxsIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1ha2VScGNDYWxsKHVybDogc3RyaW5nLCBtZXRob2Q6IHN0cmluZywgcGFyYW1zOiBhbnlbXSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICBpZDogMSxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBwYXJhbXMsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUlBDIGNhbGwgZmFpbGVkIHdpdGggc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICBpZiAoanNvbi5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSUEMgZXJyb3I6ICR7anNvbi5lcnJvci5tZXNzYWdlIHx8IEpTT04uc3RyaW5naWZ5KGpzb24uZXJyb3IpfWApO1xuICAgIH1cblxuICAgIHJldHVybiBqc29uLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwdWJsaWMgbm9kZSBSUEMgVVJMIGZyb20gdGhlIGNlbnRyYWxpemVkIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFJQQyBVUkwgZm9yIHRoZSBjdXJyZW50IEJpdEdvIGVudmlyb25tZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0UHVibGljTm9kZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFbnZpcm9ubWVudHNbdGhpcy5iaXRnby5nZXRFbnYoKV0uaW90YU5vZGVVcmw7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmF0aXZlIGNvaW4gdHlwZSBpZGVudGlmaWVyIGZvciBmaWx0ZXJpbmcgb3duZWQgb2JqZWN0cy5cbiAgICpcbiAgICogQHJldHVybnMgTmF0aXZlIGNvaW4gdHlwZSBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgZ2V0TmF0aXZlQ29pblR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJzB4Mjo6aW90YTo6SU9UQSc7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgZ2FzIGNvbmZpZ3VyYXRpb24gZm9yIGEgcmVjb3ZlcnkgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEdhcyBlc3RpbWF0aW9uIGlzIGRvbmUgdmlhIGEgZHJ5LXJ1biBvZiBhIHRlbXBvcmFyeSB0cmFuc2FjdGlvbiwgdGhlblxuICAgKiBtdWx0aXBsaWVkIGJ5IERFRkFVTFRfR0FTX09WRVJIRUFEICgxLjF4KSBhcyBhIHNhZmV0eSBidWZmZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvd25lZE9iamVjdHMgLSBOYXRpdmUgSU9UQSBjb2luIG9iamVjdHMgdG8gdXNlIGFzIGdhcyBwYXltZW50XG4gICAqIEBwYXJhbSBzZW5kZXJBZGRyZXNzIC0gU2VuZGVyIGFkZHJlc3MgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUmVjb3ZlcnkgcGFyYW1ldGVycyAoaW5jbHVkZXMgcmVjb3ZlcnlEZXN0aW5hdGlvbiwgcnBjVXJsKVxuICAgKiBAcGFyYW0gcGF5bWVudE9iamVjdHMgLSBPcHRpb25hbCB0b2tlbiBvYmplY3RzIGZvciB0b2tlbiByZWNvdmVyeVxuICAgKiBAcmV0dXJucyBHYXMgYnVkZ2V0LCBnYXMgcHJpY2UsIGdhcyBvYmplY3RzIGFycmF5LCBhbmQgdG90YWwgbmF0aXZlIGJhbGFuY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUdhc0FuZE9iamVjdHMoXG4gICAgb3duZWRPYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXSxcbiAgICBzZW5kZXJBZGRyZXNzOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zLFxuICAgIHBheW1lbnRPYmplY3RzPzogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdXG4gICk6IFByb21pc2U8e1xuICAgIGdhc0J1ZGdldDogbnVtYmVyO1xuICAgIGdhc1ByaWNlOiBudW1iZXI7XG4gICAgZ2FzT2JqZWN0czogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdO1xuICAgIHRvdGFsQmFsYW5jZTogYmlnaW50O1xuICB9PiB7XG4gICAgY29uc3QgZ2FzT2JqZWN0czogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdID0gb3duZWRPYmplY3RzLm1hcCgob2JqKSA9PiAoe1xuICAgICAgb2JqZWN0SWQ6IG9iai5vYmplY3RJZCxcbiAgICAgIHZlcnNpb246IG9iai52ZXJzaW9uLFxuICAgICAgZGlnZXN0OiBvYmouZGlnZXN0LFxuICAgIH0pKTtcbiAgICBjb25zdCB0b3RhbEJhbGFuY2UgPSBvd25lZE9iamVjdHMucmVkdWNlKChzdW0sIG9iaikgPT4gc3VtICsgQmlnSW50KG9iai5iYWxhbmNlKSwgMG4pO1xuXG4gICAgY29uc3QgZ2FzUHJpY2UgPSBhd2FpdCB0aGlzLmZldGNoR2FzUHJpY2UocGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcblxuICAgIC8vIEJ1aWxkIHRlbXAgdHJhbnNhY3Rpb24gZm9yIGVzdGltYXRpb25cbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRUeEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgY29uc3QgdGVtcEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIGNvbnN0IGVzdGltYXRpb25BbW91bnQgPSB0b3RhbEJhbGFuY2UgPiAwbiA/ICcxJyA6ICcwJztcblxuICAgIHRlbXBCdWlsZGVyLnNlbmRlcihzZW5kZXJBZGRyZXNzKS5yZWNpcGllbnRzKFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IGVzdGltYXRpb25BbW91bnQgfV0pO1xuXG4gICAgaWYgKHBheW1lbnRPYmplY3RzICYmIHBheW1lbnRPYmplY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRlbXBCdWlsZGVyLnBheW1lbnRPYmplY3RzKHBheW1lbnRPYmplY3RzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGVtcEJ1aWxkZXIucGF5bWVudE9iamVjdHMoZ2FzT2JqZWN0cyk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcFR4ID0gYXdhaXQgdGVtcEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBlc3RpbWF0ZWRHYXMgPSBhd2FpdCB0aGlzLmVzdGltYXRlR2FzKGF3YWl0IHRlbXBUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwpO1xuICAgIGNvbnN0IGdhc0J1ZGdldCA9IE1hdGgubWluKE1BWF9HQVNfQlVER0VULCBNYXRoLnRydW5jKGVzdGltYXRlZEdhcyAqIERFRkFVTFRfR0FTX09WRVJIRUFEKSk7XG5cbiAgICByZXR1cm4geyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNPYmplY3RzLCB0b3RhbEJhbGFuY2UgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVjb3ZlcklvdGFUb2tlbihcbiAgICBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMsXG4gICAgdG9rZW5PYmplY3RzV2l0aEJhbGFuY2U6IElvdGFPYmplY3RXaXRoQmFsYW5jZVtdLFxuICAgIHNlbmRlckFkZHJlc3M6IHN0cmluZyxcbiAgICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIGRlcml2ZWRQdWJsaWNLZXk6IHN0cmluZyxcbiAgICBpZHg6IG51bWJlcixcbiAgICBiaXRnb0tleTogc3RyaW5nXG4gICk6IFByb21pc2U8TVBDVHhzIHwgTVBDU3dlZXBUeHM+IHtcbiAgICB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZSA9IHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlLnNvcnQoKGEsIGIpID0+IChCaWdJbnQoYi5iYWxhbmNlKSA+IEJpZ0ludChhLmJhbGFuY2UpID8gMSA6IC0xKSk7XG4gICAgaWYgKHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlLmxlbmd0aCA+IE1BWF9PQkpFQ1RfTElNSVQpIHtcbiAgICAgIHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlID0gdG9rZW5PYmplY3RzV2l0aEJhbGFuY2Uuc2xpY2UoMCwgTUFYX09CSkVDVF9MSU1JVCk7XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5PYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gPSB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5tYXAoKG9iaikgPT4gKHtcbiAgICAgIG9iamVjdElkOiBvYmoub2JqZWN0SWQsXG4gICAgICB2ZXJzaW9uOiBvYmoudmVyc2lvbixcbiAgICAgIGRpZ2VzdDogb2JqLmRpZ2VzdCxcbiAgICB9KSk7XG4gICAgY29uc3QgdG9rZW5CYWxhbmNlID0gdG9rZW5PYmplY3RzV2l0aEJhbGFuY2UucmVkdWNlKChzdW0sIG9iaikgPT4gc3VtICsgQmlnSW50KG9iai5iYWxhbmNlKSwgMG4pO1xuICAgIGlmICh0b2tlbkJhbGFuY2UgPD0gMG4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gYmFsYW5jZSBpcyB6ZXJvJyk7XG4gICAgfVxuXG4gICAgbGV0IGdhc09iamVjdHNXaXRoQmFsYW5jZTogSW90YU9iamVjdFdpdGhCYWxhbmNlW107XG4gICAgdHJ5IHtcbiAgICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSA9IGF3YWl0IHRoaXMuZmV0Y2hPd25lZE9iamVjdHMoc2VuZGVyQWRkcmVzcywgcGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBnYXMgb2JqZWN0cyBmb3IgdG9rZW4gcmVjb3ZlcnknKTtcbiAgICB9XG4gICAgaWYgKGdhc09iamVjdHNXaXRoQmFsYW5jZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gZ2FzIG9iamVjdHMgZm91bmQgZm9yIHRva2VuIHJlY292ZXJ5Jyk7XG4gICAgfVxuXG4gICAgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlID0gZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLnNvcnQoKGEsIGIpID0+IChCaWdJbnQoYi5iYWxhbmNlKSA+IEJpZ0ludChhLmJhbGFuY2UpID8gMSA6IC0xKSk7XG4gICAgaWYgKGdhc09iamVjdHNXaXRoQmFsYW5jZS5sZW5ndGggPj0gTUFYX0dBU19PQkpFQ1RTKSB7XG4gICAgICBnYXNPYmplY3RzV2l0aEJhbGFuY2UgPSBnYXNPYmplY3RzV2l0aEJhbGFuY2Uuc2xpY2UoMCwgTUFYX0dBU19PQkpFQ1RTIC0gMSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNPYmplY3RzLCB0b3RhbEJhbGFuY2UgfSA9IGF3YWl0IHRoaXMucHJlcGFyZUdhc0FuZE9iamVjdHMoXG4gICAgICBnYXNPYmplY3RzV2l0aEJhbGFuY2UsXG4gICAgICBzZW5kZXJBZGRyZXNzLFxuICAgICAgcGFyYW1zLFxuICAgICAgdG9rZW5PYmplY3RzXG4gICAgKTtcbiAgICBjb25zdCBuZXRHYXNCYWxhbmNlID0gdG90YWxCYWxhbmNlIC0gQmlnSW50KGdhc0J1ZGdldCk7XG4gICAgaWYgKG5ldEdhc0JhbGFuY2UgPD0gMG4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5zdWZmaWNpZW50IGdhcyBiYWxhbmNlIGZvciB0b2tlbiByZWNvdmVyeScpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gdG9rZW5CYWxhbmNlLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG5cbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5zZW5kZXIoc2VuZGVyQWRkcmVzcylcbiAgICAgIC5yZWNpcGllbnRzKFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IHJlY292ZXJ5QW1vdW50IH1dKVxuICAgICAgLnBheW1lbnRPYmplY3RzKHRva2VuT2JqZWN0cylcbiAgICAgIC5nYXNEYXRhKHsgZ2FzQnVkZ2V0LCBnYXNQcmljZSwgZ2FzUGF5bWVudE9iamVjdHM6IGdhc09iamVjdHMgfSk7XG5cbiAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG4gICAgY29uc3QgdG9rZW5Db2luID0gcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzIHx8IHRoaXMuZ2V0Q2hhaW4oKTtcblxuICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkVW5zaWduZWRTd2VlcFRyYW5zYWN0aW9uKFxuICAgICAgICB0eEJ1aWxkZXIsXG4gICAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICAgIGJpdGdvS2V5LFxuICAgICAgICBpZHgsXG4gICAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgICBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3NcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdW5zaWduZWRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgIGNvbnN0IGZ1bGxTaWduYXR1cmVCYXNlNjQgPSBhd2FpdCB0aGlzLnNpZ25SZWNvdmVyeVRyYW5zYWN0aW9uKFxuICAgICAgdHhCdWlsZGVyLFxuICAgICAgcGFyYW1zLFxuICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICBkZXJpdmVkUHVibGljS2V5LFxuICAgICAgdW5zaWduZWRUeFxuICAgICk7XG5cbiAgICBjb25zdCBmaW5hbFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IGF3YWl0IGZpbmFsVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNjYW5JbmRleDogaWR4LFxuICAgICAgICAgIHJlY292ZXJ5QW1vdW50LFxuICAgICAgICAgIHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgICBzaWduYXR1cmU6IGZ1bGxTaWduYXR1cmVCYXNlNjQsXG4gICAgICAgICAgY29pbjogdG9rZW5Db2luLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGxhc3RTY2FuSW5kZXg6IGlkeCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVjb3ZlcnlUcmFuc2FjdGlvbihcbiAgICB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgICBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMsXG4gICAgZGVyaXZhdGlvblBhdGg6IHN0cmluZyxcbiAgICBkZXJpdmVkUHVibGljS2V5OiBzdHJpbmcsXG4gICAgdW5zaWduZWRUeDogVHJhbnNmZXJUcmFuc2FjdGlvblxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghcGFyYW1zLnVzZXJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1c2VyS2V5Jyk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLmJhY2t1cEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGJhY2t1cEtleScpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3Npbmcgd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyS2V5ID0gcGFyYW1zLnVzZXJLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBiYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICAvLyBEZWNyeXB0IHByaXZhdGUga2V5cyBmcm9tIEtleUNhcmQgdmFsdWVzXG4gICAgbGV0IHVzZXJQcnY6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgdXNlclBydiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdEFzeW5jKHsgaW5wdXQ6IHVzZXJLZXksIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgdXNlciBrZXljaGFpbjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgY29uc3QgdXNlclNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UodXNlclBydikgYXMgRUREU0FNZXRob2RUeXBlcy5Vc2VyU2lnbmluZ01hdGVyaWFsO1xuXG4gICAgbGV0IGJhY2t1cFBydjogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBiYWNrdXBQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHRBc3luYyh7IGlucHV0OiBiYWNrdXBLZXksIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgYmFja3VwIGtleWNoYWluOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBjb25zdCBiYWNrdXBTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKGJhY2t1cFBydikgYXMgRUREU0FNZXRob2RUeXBlcy5CYWNrdXBTaWduaW5nTWF0ZXJpYWw7XG5cbiAgICAvLyBHZW5lcmF0ZSBUU1Mgc2lnbmF0dXJlXG4gICAgY29uc3Qgc2lnbmF0dXJlQnVmZmVyID0gYXdhaXQgRUREU0FNZXRob2RzLmdldFRTU1NpZ25hdHVyZShcbiAgICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwsXG4gICAgICBiYWNrdXBTaWduaW5nTWF0ZXJpYWwsXG4gICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgIHVuc2lnbmVkVHhcbiAgICApO1xuXG4gICAgLy8gQnVpbGQgZnVsbCBzaWduYXR1cmU6IHNjaGVtZV9mbGFnICgxIGJ5dGUpICsgc2lnbmF0dXJlICg2NCBieXRlcykgKyBwdWJsaWNfa2V5ICgzMiBieXRlcylcbiAgICBjb25zdCBzY2hlbWVGbGFnID0gQnVmZmVyLmFsbG9jKDEsIDB4MDApOyAvLyBFZDI1NTE5IHNjaGVtZVxuICAgIGNvbnN0IHB1YmxpY0tleUJ5dGVzID0gQnVmZmVyLmZyb20oZGVyaXZlZFB1YmxpY0tleSwgJ2hleCcpO1xuICAgIGNvbnN0IGZ1bGxTaWduYXR1cmUgPSBCdWZmZXIuY29uY2F0KFtzY2hlbWVGbGFnLCBzaWduYXR1cmVCdWZmZXIsIHB1YmxpY0tleUJ5dGVzXSk7XG5cbiAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBkZXJpdmVkUHVibGljS2V5IH0sIHNpZ25hdHVyZUJ1ZmZlcik7XG5cbiAgICByZXR1cm4gZnVsbFNpZ25hdHVyZS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjdXJyZW50IHJlZmVyZW5jZSBnYXMgcHJpY2UgZnJvbSBmdWxsbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHJldHVybnMgQ3VycmVudCBnYXMgcHJpY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hHYXNQcmljZShycGNVcmw/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHVybCA9IHJwY1VybCB8fCB0aGlzLmdldFB1YmxpY05vZGVVcmwoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1ha2VScGNDYWxsKHVybCwgJ2lvdGF4X2dldFJlZmVyZW5jZUdhc1ByaWNlJywgW10pO1xuICAgIHJldHVybiBwYXJzZUludChyZXN1bHQsIDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZXMgZ2FzIGZvciBhIHRyYW5zYWN0aW9uIHZpYSBkcnkgcnVuLlxuICAgKlxuICAgKiBAcGFyYW0gdHhCYXNlNjQgLSBUcmFuc2FjdGlvbiBpbiBiYXNlNjQgZm9ybWF0XG4gICAqIEBwYXJhbSBycGNVcmwgLSBPcHRpb25hbCBSUEMgVVJMIG92ZXJyaWRlXG4gICAqIEByZXR1cm5zIEVzdGltYXRlZCBnYXMgY29zdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlc3RpbWF0ZUdhcyh0eEJhc2U2NDogc3RyaW5nLCBycGNVcmw/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHVybCA9IHJwY1VybCB8fCB0aGlzLmdldFB1YmxpY05vZGVVcmwoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1ha2VScGNDYWxsKHVybCwgJ2lvdGFfZHJ5UnVuVHJhbnNhY3Rpb25CbG9jaycsIFt0eEJhc2U2NF0pO1xuXG4gICAgY29uc3QgY29tcHV0YXRpb25Db3N0ID0gcGFyc2VJbnQocmVzdWx0LmVmZmVjdHMuZ2FzVXNlZC5jb21wdXRhdGlvbkNvc3QsIDEwKTtcbiAgICBjb25zdCBzdG9yYWdlQ29zdCA9IHBhcnNlSW50KHJlc3VsdC5lZmZlY3RzLmdhc1VzZWQuc3RvcmFnZUNvc3QsIDEwKTtcbiAgICBjb25zdCBzdG9yYWdlUmViYXRlID0gcGFyc2VJbnQocmVzdWx0LmVmZmVjdHMuZ2FzVXNlZC5zdG9yYWdlUmViYXRlLCAxMCk7XG5cbiAgICByZXR1cm4gTWF0aC5tYXgoY29tcHV0YXRpb25Db3N0ICsgc3RvcmFnZUNvc3QgLSBzdG9yYWdlUmViYXRlLCBjb21wdXRhdGlvbkNvc3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFVuc2lnbmVkU3dlZXBUcmFuc2FjdGlvbihcbiAgICB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgICBzZW5kZXJBZGRyZXNzOiBzdHJpbmcsXG4gICAgYml0Z29LZXk6IHN0cmluZyxcbiAgICBzY2FuSW5kZXg6IG51bWJlcixcbiAgICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIHRva2VuQ29udHJhY3RBZGRyZXNzPzogc3RyaW5nXG4gICk6IFByb21pc2U8TVBDU3dlZXBUeHM+IHtcbiAgICBjb25zdCB1bnNpZ25lZFRyYW5zYWN0aW9uID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IGF3YWl0IHVuc2lnbmVkVHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSBCdWZmZXIuZnJvbShzZXJpYWxpemVkVHgsICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgcGFyc2VkVHggPSBhd2FpdCB0aGlzLnBhcnNlVHJhbnNhY3Rpb24oeyB0eEhleDogc2VyaWFsaXplZFR4SGV4IH0pO1xuICAgIGNvbnN0IHdhbGxldENvaW4gPSB0b2tlbkNvbnRyYWN0QWRkcmVzcyB8fCB0aGlzLmdldENoYWluKCk7XG4gICAgY29uc3QgcGFyc2VkT3V0cHV0cyA9IHBhcnNlZFR4Lm91dHB1dHMgYXMgQXJyYXk8eyBhZGRyZXNzOiBzdHJpbmc7IGFtb3VudDogc3RyaW5nIH0+O1xuICAgIGNvbnN0IG91dHB1dCA9IHBhcnNlZE91dHB1dHNbMF07XG5cbiAgICAvLyBCdWlsZCBwYXJzZWQgdHJhbnNhY3Rpb24gc3RydWN0dXJlIGZyb20gcGFyc2VkIGRhdGFcbiAgICBjb25zdCBpbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHNlbmRlckFkZHJlc3MsXG4gICAgICAgIHZhbHVlU3RyaW5nOiBvdXRwdXQuYW1vdW50LFxuICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcihvdXRwdXQuYW1vdW50KSxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBjb25zdCBvdXRwdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgICAgdmFsdWVTdHJpbmc6IG91dHB1dC5hbW91bnQsXG4gICAgICAgIGNvaW5OYW1lOiB3YWxsZXRDb2luLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgY29tcGxldGVkUGFyc2VkVHggPSB7XG4gICAgICBpbnB1dHM6IGlucHV0cyxcbiAgICAgIG91dHB1dHM6IG91dHB1dHMsXG4gICAgICBzcGVuZEFtb3VudDogb3V0cHV0LmFtb3VudCxcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5TZW5kLFxuICAgIH07XG5cbiAgICBjb25zdCBmZWUgPSBwYXJzZWRUeC5mZWUgYXMgQmlnTnVtYmVyO1xuICAgIGNvbnN0IGZlZUluZm8gPSB7IGZlZTogZmVlLnRvTnVtYmVyKCksIGZlZVN0cmluZzogZmVlLnRvU3RyaW5nKCkgfTtcbiAgICBjb25zdCBjb2luU3BlY2lmaWMgPSB7IGNvbW1vbktleWNoYWluOiBiaXRnb0tleSB9O1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb246IE1QQ1R4ID0ge1xuICAgICAgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHhIZXgsXG4gICAgICBzY2FuSW5kZXgsXG4gICAgICBjb2luOiB3YWxsZXRDb2luLFxuICAgICAgc2lnbmFibGVIZXg6IHVuc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgcGFyc2VkVHg6IGNvbXBsZXRlZFBhcnNlZFR4LFxuICAgICAgZmVlSW5mbzogZmVlSW5mbyxcbiAgICAgIGNvaW5TcGVjaWZpYzogY29pblNwZWNpZmljLFxuICAgIH07XG5cbiAgICBjb25zdCB1bnNpZ25lZFR4V3JhcHBlcjogTVBDVW5zaWduZWRUeCA9IHsgdW5zaWduZWRUeDogdHJhbnNhY3Rpb24sIHNpZ25hdHVyZVNoYXJlczogW10gfTtcbiAgICBjb25zdCB0eFJlcXVlc3Q6IFJlY292ZXJ5VHhSZXF1ZXN0ID0geyB0cmFuc2FjdGlvbnM6IFt1bnNpZ25lZFR4V3JhcHBlcl0sIHdhbGxldENvaW4gfTtcbiAgICByZXR1cm4geyB0eFJlcXVlc3RzOiBbdHhSZXF1ZXN0XSB9O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcml2YXRlIEhlbHBlciBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuZCBleHRyYWN0cyB0cmFuc2FjdGlvbiBoZXggZnJvbSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gdHhIZXggLSBUaGUgdHJhbnNhY3Rpb24gaGV4IHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZCAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICAgKiBAcmV0dXJucyBUaGUgdmFsaWRhdGVkIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHR4SGV4IGlzIG1pc3NpbmdcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVBbmRFeHRyYWN0VHhIZXgodHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZCwgb3BlcmF0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCBmb3IgJHtvcGVyYXRpb259IG9wZXJhdGlvbmApO1xuICAgIH1cbiAgICByZXR1cm4gdHhIZXg7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIGEgVHJhbnNmZXJUcmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHJhbnNhY3Rpb24gaXMgbm90IGEgVHJhbnNmZXJUcmFuc2FjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoISh0cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFRyYW5zZmVyVHJhbnNhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IG5vdCBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdHJhbnNhY3Rpb24gcmVjaXBpZW50cyBtYXRjaCB0aGUgZXhwZWN0ZWQgcmVjaXBpZW50cy5cbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZXhwZWN0ZWRSZWNpcGllbnRzIC0gVGhlIGV4cGVjdGVkIHJlY2lwaWVudHMgZnJvbSB0cmFuc2FjdGlvbiBwYXJhbXNcbiAgICogQHRocm93cyBFcnJvciBpZiByZWNpcGllbnRzIGRvbid0IG1hdGNoXG4gICAqL1xuICBwcml2YXRlIHZlcmlmeVRyYW5zYWN0aW9uUmVjaXBpZW50cyhcbiAgICB0cmFuc2FjdGlvbjogVHJhbnNmZXJUcmFuc2FjdGlvbixcbiAgICBleHBlY3RlZFJlY2lwaWVudHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W11cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdHhEYXRhID0gdHJhbnNhY3Rpb24udG9Kc29uKCkgYXMgVHJhbnNmZXJUeERhdGE7XG5cbiAgICBpZiAoIXR4RGF0YS5yZWNpcGllbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IHJlY2lwaWVudHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsUmVjaXBpZW50cyA9IHRoaXMubm9ybWFsaXplUmVjaXBpZW50cyh0eERhdGEucmVjaXBpZW50cyk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSB0aGlzLm5vcm1hbGl6ZVJlY2lwaWVudHMoZXhwZWN0ZWRSZWNpcGllbnRzKTtcblxuICAgIGlmICghdGhpcy5yZWNpcGllbnRzTWF0Y2goZXhwZWN0ZWQsIGFjdHVhbFJlY2lwaWVudHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IHJlY2lwaWVudHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgcmVjaXBpZW50cyBieSBleHRyYWN0aW5nIG9ubHkgcmVsZXZhbnQgZmllbGRzLlxuICAgKiBAcGFyYW0gcmVjaXBpZW50cyAtIFJlY2lwaWVudHMgdG8gbm9ybWFsaXplXG4gICAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgcmVjaXBpZW50cyB3aXRoIGFkZHJlc3MsIGFtb3VudCwgYW5kIHRva2VuTmFtZSBvbmx5XG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVJlY2lwaWVudHMocmVjaXBpZW50czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSk6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10ge1xuICAgIHJldHVybiByZWNpcGllbnRzLm1hcCgocmVjaXBpZW50KSA9PiBfLnBpY2socmVjaXBpZW50LCBbJ2FkZHJlc3MnLCAnYW1vdW50JywgJ3Rva2VuTmFtZSddKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGV4cGVjdGVkIHJlY2lwaWVudHMgbWF0Y2ggYWN0dWFsIHJlY2lwaWVudHMuXG4gICAqIEBwYXJhbSBleHBlY3RlZCAtIEV4cGVjdGVkIHJlY2lwaWVudHNcbiAgICogQHBhcmFtIGFjdHVhbCAtIEFjdHVhbCByZWNpcGllbnRzIGZyb20gdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgZXhwZWN0ZWQgcmVjaXBpZW50cyBhcmUgZm91bmQgaW4gYWN0dWFsIHJlY2lwaWVudHNcbiAgICovXG4gIHByaXZhdGUgcmVjaXBpZW50c01hdGNoKGV4cGVjdGVkOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdLCBhY3R1YWw6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXhwZWN0ZWQuZXZlcnkoKGV4cGVjdGVkUmVjaXBpZW50KSA9PlxuICAgICAgYWN0dWFsLnNvbWUoKGFjdHVhbFJlY2lwaWVudCkgPT4gXy5pc0VxdWFsKGV4cGVjdGVkUmVjaXBpZW50LCBhY3R1YWxSZWNpcGllbnQpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBlbXB0eSBwYXJzZWQgdHJhbnNhY3Rpb24gcmVzdWx0LlxuICAgKiBVc2VkIHdoZW4gdHJhbnNhY3Rpb24gaGFzIG5vIG91dHB1dHMuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUVtcHR5UGFyc2VkVHJhbnNhY3Rpb24oKTogUGFyc2VkVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHM6IFtdLFxuICAgICAgb3V0cHV0czogW10sXG4gICAgICBmZWU6IG5ldyBCaWdOdW1iZXIoMCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSB0cmFuc2FjdGlvbiBmZWUgZnJvbSB0aGUgZXhwbGFuYXRpb24uXG4gICAqIEBwYXJhbSBleHBsYW5hdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICAgKiBAcmV0dXJucyBUaGUgZmVlIGFzIGEgQmlnTnVtYmVyXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVRyYW5zYWN0aW9uRmVlKGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogQmlnTnVtYmVyIHtcbiAgICBpZiAoZXhwbGFuYXRpb24uZmVlLmZlZSA9PT0gJycpIHtcbiAgICAgIHJldHVybiBuZXcgQmlnTnVtYmVyKDApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJpZ051bWJlcihleHBsYW5hdGlvbi5mZWUuZmVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGlucHV0cyBhcnJheSBmb3IgYSBwYXJzZWQgdHJhbnNhY3Rpb24uXG4gICAqIEluY2x1ZGVzIHNlbmRlciBpbnB1dCBhbmQgb3B0aW9uYWxseSBzcG9uc29yIGlucHV0IGlmIHByZXNlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBleHBsYW5hdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICAgKiBAcGFyYW0gZmVlIC0gVGhlIGNhbGN1bGF0ZWQgdHJhbnNhY3Rpb24gZmVlXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHRyYW5zYWN0aW9uIGlucHV0c1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRyYW5zYWN0aW9uSW5wdXRzKFxuICAgIGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICAgIGZlZTogQmlnTnVtYmVyXG4gICk6IEFycmF5PHtcbiAgICBhZGRyZXNzOiBzdHJpbmc7XG4gICAgYW1vdW50OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0gZXhwbGFuYXRpb24ub3V0cHV0c1swXS5hZGRyZXNzO1xuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IG5ldyBCaWdOdW1iZXIoZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50KTtcblxuICAgIC8vIElmIHRoZXJlJ3MgYSBzcG9uc29yLCBzZW5kZXIgb25seSBwYXlzIGZvciBvdXRwdXRzXG4gICAgLy8gT3RoZXJ3aXNlLCBzZW5kZXIgcGF5cyBmb3Igb3V0cHV0cyArIGZlZVxuICAgIGNvbnN0IHNlbmRlckFtb3VudCA9IGV4cGxhbmF0aW9uLnNwb25zb3IgPyBvdXRwdXRBbW91bnQudG9GaXhlZCgpIDogb3V0cHV0QW1vdW50LnBsdXMoZmVlKS50b0ZpeGVkKCk7XG5cbiAgICBjb25zdCBpbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHNlbmRlckFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogc2VuZGVyQW1vdW50LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgLy8gQWRkIHNwb25zb3IgaW5wdXQgaWYgcHJlc2VudFxuICAgIGlmIChleHBsYW5hdGlvbi5zcG9uc29yKSB7XG4gICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgIGFkZHJlc3M6IGV4cGxhbmF0aW9uLnNwb25zb3IsXG4gICAgICAgIGFtb3VudDogZmVlLnRvRml4ZWQoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBvdXRwdXRzIGFycmF5IGZvciBhIHBhcnNlZCB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIGV4cGxhbmF0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHRyYW5zYWN0aW9uIG91dHB1dHNcbiAgICovXG4gIHByaXZhdGUgYnVpbGRUcmFuc2FjdGlvbk91dHB1dHMoZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBBcnJheTx7XG4gICAgYWRkcmVzczogc3RyaW5nO1xuICAgIGFtb3VudDogc3RyaW5nO1xuICB9PiB7XG4gICAgcmV0dXJuIGV4cGxhbmF0aW9uLm91dHB1dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgIGFtb3VudDogbmV3IEJpZ051bWJlcihvdXRwdXQuYW1vdW50KS50b0ZpeGVkKCksXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0cmFuc2FjdGlvbiBidWlsZGVyIGZhY3RvcnkgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgZm9yIHRoaXMgY29pblxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUeEJ1aWxkZXJGYWN0b3J5KCk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZHMgYSB0cmFuc2FjdGlvbiBmcm9tIGl0cyBoZXggcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSB0eEhleCAtIFRoZSB0cmFuc2FjdGlvbiBoZXggdG8gcmVidWlsZFxuICAgKiBAcmV0dXJucyBUaGUgcmVidWlsdCB0cmFuc2FjdGlvblxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRyYW5zYWN0aW9uIGNhbm5vdCBiZSByZWJ1aWx0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYnVpbGRUcmFuc2FjdGlvbih0eEhleDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4QnVpbGRlckZhY3RvcnkgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdHhCdWlsZGVyRmFjdG9yeS5mcm9tKHR4SGV4KTtcbiAgICAgIHJldHVybiAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVidWlsZCB0cmFuc2FjdGlvbjogJHtlcnIudG9TdHJpbmcoKX1gKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==