sliftutils 1.7.15 → 1.7.17

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.
@@ -608,7 +608,7 @@ class BlobStore {
608
608
  let currentTime = overlayEntry && overlayEntry.t || entry && entry.writeTime || 0;
609
609
  // An older write never overwrites a newer one (see IArchives.set)
610
610
  if (lastModified < currentTime)
611
- return;
611
+ return key;
612
612
  }
613
613
  let writeTime = lastModified || Date.now();
614
614
  if (config === null || config === void 0 ? void 0 : config.fast) {
@@ -619,15 +619,16 @@ class BlobStore {
619
619
  if (Date.now() >= deadline) {
620
620
  this.overlay.delete(key);
621
621
  await this.writeToSources(key, data, writeTime);
622
- return;
622
+ return key;
623
623
  }
624
624
  flushAt = Math.min(flushAt, deadline);
625
625
  }
626
626
  this.overlay.set(key, { data, t: writeTime, flushAt });
627
- return;
627
+ return key;
628
628
  }
629
629
  this.overlay.delete(key);
630
630
  await this.writeToSources(key, data, writeTime);
631
+ return key;
631
632
  }
632
633
  async del(key, config) {
633
634
  // Deletes are tombstone writes (an empty file IS a missing file): the size-0 index entry is
@@ -868,5 +869,5 @@ class BlobStore {
868
869
  }
869
870
  }
870
871
  exports.BlobStore = BlobStore;
871
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsMkRBQXNFO0FBQ3RFLG1EQUEwRTtBQUMxRSxrRUFBaUY7QUFDakYsNENBR3NCO0FBQ3RCLGtEQUFtRTtBQUNuRSw0Q0FBaUQ7QUFDakQsaURBQXVFO0FBQ3ZFLHdFQUF1RjtBQUN2RixvREFBOEY7QUFFOUYsNkZBQTZGO0FBQzdGLCtGQUErRjtBQUMvRiwwRkFBMEY7QUFDMUYsZ0ZBQWdGO0FBQ2hGLGlHQUFpRztBQUNqRywwRkFBMEY7QUFFN0UsUUFBQSx3QkFBd0IsR0FBRyxtQkFBWSxHQUFHLENBQUMsQ0FBQztBQUN6RCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLG1GQUFtRjtBQUNuRixNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDdkMsNkRBQTZEO0FBQzdELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN4QyxtRkFBbUY7QUFDbkYsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM1QywrRkFBK0Y7QUFDL0YsYUFBYTtBQUNiLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNyQyxzR0FBc0c7QUFDdEcsTUFBTSxvQkFBb0IsR0FBRyxtQkFBWSxDQUFDO0FBQzFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNuQyxrR0FBa0c7QUFDbEcsb0ZBQW9GO0FBQ3BGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNqRCxNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FB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QUFDLElBQUksS0FBSyxDQUFDO2dCQUFFLFNBQVM7WUFDL0IsSUFBSSxLQUFLLENBQUMsU0FBUyxHQUFHLE1BQU07Z0JBQUUsU0FBUztZQUN2QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0IsS0FBSyxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxJQUFBLCtCQUFtQixFQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7b0JBQUUsU0FBUztnQkFDNUQsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztnQkFDaEMsSUFBSSxDQUFDLENBQUMsTUFBTSxZQUFZLDZCQUFpQixDQUFDO29CQUFFLFNBQVM7Z0JBQ3JELEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFRLEVBQUUsRUFBRTs7b0JBQ3BDLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEdBQUcsU0FBUyxNQUFNLENBQUMsWUFBWSxFQUFFLFlBQVksTUFBQSxDQUFDLENBQUMsS0FBSyxtQ0FBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RyxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBdnhCRCw4QkF1eEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBydW5JbmZpbml0ZVBvbGwsIGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IHRpbWVJbk1pbnV0ZSwgc29ydCwgcHJvbWlzZU9iaiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQge1xuICAgIElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc1NvdXJjZSwgQXJjaGl2ZXNTeW5jU3RhdHVzLCBhc3NlcnRWYWxpZExhc3RNb2RpZmllZCxcbiAgICB3aW5kb3dBY2NlcHRzV3JpdGVzLCBTeW5jQWN0aXZpdHksXG59IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IEFyY2hpdmVzRGlzaywgYXBwbHlGaW5kSW5mb1NoYXBlIH0gZnJvbSBcIi4uL0FyY2hpdmVzRGlza1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNCYWNrYmxhemUgfSBmcm9tIFwiLi4vYmFja2JsYXplXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgeyBCdWxrRGF0YWJhc2VCYXNlLCBub29wUmVhY3RpdmVEZXBzIH0gZnJvbSBcIi4uL0J1bGtEYXRhYmFzZTIvQnVsa0RhdGFiYXNlQmFzZVwiO1xuaW1wb3J0IHsgd3JhcEhhbmRsZSwgTm9kZUpTRGlyZWN0b3J5SGFuZGxlV3JhcHBlciwgRGlyZWN0b3J5V3JhcHBlciB9IGZyb20gXCIuLi9GaWxlRm9sZGVyQVBJXCI7XG5cbi8vIFRoZSBzdG9yYWdlIGVuZ2luZSBvZiB0aGUgcmVtb3RlIHN0b3JhZ2Ugc2VydmVyLiBEYXRhIGxpdmVzIGluIHN5bmNocm9uaXphdGlvbiBzb3VyY2VzIChhdFxuLy8gbWluaW11bSBhbiBBcmNoaXZlc0Rpc2ssIHRoZSBsb2NhbCBkaXNrKTsgQmxvYlN0b3JlIGtlZXBzIGFuIGluZGV4IG9mIGV2ZXJ5IGZpbGUgKHBhdGgsIGxhc3Rcbi8vIG1vZGlmaWVkIHRpbWUsIHNpemUsIGFuZCB3aGljaCBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhKSBpbiBhIEJ1bGtEYXRhYmFzZTIsIGFuZFxuLy8gc3luY2hyb25pemVzIHRoZSBpbmRleCBmcm9tIGFsbCBzb3VyY2VzIChzZWUgQXJjaGl2ZXNTb3VyY2UgaW4gSUFyY2hpdmVzLnRzKS5cbi8vIEV2ZXJ5IHN0YXJ0dXAgZnVsbHkgcmVzY2FucyBlYWNoIHNvdXJjZSdzIG1ldGFkYXRhLCBzbyB0aGUgaW5kZXggc2VsZi1oZWFsczsgdGhlIGZpbGUgd2l0aCB0aGVcbi8vIGhpZ2hlc3Qgd3JpdGUgdGltZSB3aW5zIGFjcm9zcyBhbGwgc291cmNlcywgc28gbXVsdGlwbGUgc291cmNlcyBuZWVkIG5vIHN0YWNraW5nIG9yZGVyLlxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9GQVNUX1dSSVRFX0RFTEFZID0gdGltZUluTWludXRlICogNTtcbmNvbnN0IEZBU1RfRkxVU0hfUE9MTCA9IDEwMDAgKiAxNTtcbi8vIEluZGV4IGNoYW5nZXMgYXJlIGJ1ZmZlcmVkIGluIG1lbW9yeSBhbmQgd3JpdHRlbiB0byB0aGUgQnVsa0RhdGFiYXNlMiBpbiBiYXRjaGVzXG5jb25zdCBJTkRFWF9GTFVTSF9JTlRFUlZBTCA9IDEwMDAgKiAzMDtcbi8vIFNvdXJjZXMgdGhhdCBzdXBwb3J0IGdldENoYW5nZXNBZnRlciBhcmUgcG9sbGVkIHRoaXMgb2Z0ZW5cbmNvbnN0IENIQU5HRVNfUE9MTF9JTlRFUlZBTCA9IDEwMDAgKiA2MDtcbi8vIFNvdXJjZXMgdGhhdCBkb24ndCBzdXBwb3J0IGdldENoYW5nZXNBZnRlciBnZXQgYSBmdWxsIG1ldGFkYXRhIHJlc2NhbiB0aGlzIG9mdGVuXG5jb25zdCBGVUxMX1JFU0NBTl9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwO1xuLy8gT24gYSByZXF1ZXN0IGZvciBhIGZpbGUgdGhlIGluZGV4IGRvZXNuJ3Qga25vdywgY2hhbmdlcy1hZnRlciBzb3VyY2VzIGFyZSByZS1wb2xsZWQsIGF0IG1vc3Rcbi8vIHRoaXMgb2Z0ZW5cbmNvbnN0IE1JU1NfQ0hFQ0tfSU5URVJWQUwgPSAxMDAwICogNTtcbi8vIENoYW5nZSBwb2xscyByZS1yZXF1ZXN0IHRoaXMgbXVjaCBvdmVybGFwLCBzbyBjbG9jayBza2V3IGJldHdlZW4gdXMgYW5kIGEgc291cmNlIGNhbid0IGRyb3AgY2hhbmdlc1xuY29uc3QgQ0hBTkdFU19QT0xMX09WRVJMQVAgPSB0aW1lSW5NaW51dGU7XG5jb25zdCBTQ0FOX1JFVFJZX0RFTEFZID0gMTAwMCAqIDMwO1xuLy8gRGVsZXRlcyBhcmUgdG9tYnN0b25lcyAoYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSk6IHRoZSBzaXplLTAgaW5kZXggZW50cnkgaXMgd2hhdCBsZXRzIGFcbi8vIGRlbGV0aW9uIHByb3BhZ2F0ZS9yZWNvbmNpbGUgbGlrZSBhbnkgb3RoZXIgd3JpdGUsIGFuZCBpdCBleHBpcmVzIGFmdGVyIHRoaXMgbG9uZ1xuY29uc3QgVE9NQlNUT05FX0VYUElSWSA9IDEwMDAgKiA2MCAqIDYwICogMjQgKiA3O1xuY29uc3QgVE9NQlNUT05FX0NMRUFOVVBfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MDtcbi8vIFdoaWxlIGEgbWV0YWRhdGEgc2NhbiBvciBmdWxsIHN5bmMgaXMgcnVubmluZywgaXRzIHByb2dyZXNzIGlzIGxvZ2dlZCB0aGlzIG9mdGVuXG5jb25zdCBTWU5DX1BST0dSRVNTX0xPR19JTlRFUlZBTCA9IDEwMDAgKiA2MDtcbmNvbnN0IERJU0tfTElNSVRfQ0hFQ0tfSU5URVJWQUwgPSAxMDAwICogNjA7XG4vLyBGdWxsIHN5bmNzIGRvd25sb2FkIHRoaXMgbWFueSBmaWxlcyBjb25jdXJyZW50bHkgKGhpZ2gtbGF0ZW5jeSBzb3VyY2VzIGxpa2UgYmFja2JsYXplIHdvdWxkXG4vLyBvdGhlcndpc2UgY3Jhd2wgb25lIHJvdW5kLXRyaXAgYXQgYSB0aW1lKVxuY29uc3QgRlVMTF9TWU5DX1BBUkFMTEVMID0gODtcbi8vIEEgZnVsbCBzeW5jIHJ1bm5pbmcgbG9uZ2VyIHRoYW4gdGhpcyBpcyBjb25zb2xlLmVycm9yZWQgKGFuZCBhZ2FpbiBldmVyeSBpbnRlcnZhbCBhZnRlciksIHNvIGFcbi8vIHN5bmMgdGhhdCB3aWxsIHRha2UgZGF5cyBpcyBsb3VkIGluc3RlYWQgb2YgYSBxdWlldCBjb25zb2xlLmxvZyBldmVyeSBtaW51dGVcbmNvbnN0IEZVTExfU1lOQ19TTE9XX0VSUk9SX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjA7XG5cbmV4cG9ydCB0eXBlIFdyaXRlQ29uZmlnID0ge1xuICAgIC8vIFJlc29sdmUgb25jZSB0aGUgd3JpdGUgaXMgaW4gbWVtb3J5OyBmbHVzaCB0byB0aGUgc291cmNlcyBhZnRlciB3cml0ZURlbGF5LCBjb2FsZXNjaW5nXG4gICAgLy8gd3JpdGVzIHRvIHRoZSBzYW1lIGtleSAob25seSB0aGUgbGF0ZXN0IGlzIHdyaXR0ZW4pLiBEYXRhIGlzIGxvc3QgaWYgdGhlIHByb2Nlc3MgY3Jhc2hlcyBmaXJzdC5cbiAgICBmYXN0PzogYm9vbGVhbjtcbiAgICB3cml0ZURlbGF5PzogbnVtYmVyO1xuICAgIC8vIFN0YW1wcyB0aGUgd3JpdGUgd2l0aCB0aGlzIGxhc3Qtd3JpdGUgdGltZSBpbnN0ZWFkIG9mIG5vdy4gT2xkZXIgdGhhbiB0aGUgY3VycmVudCBmaWxlJ3NcbiAgICAvLyB0aW1lIG5vLW9wczsgbW9yZSB0aGFuIDE1IG1pbnV0ZXMgaW4gdGhlIGZ1dHVyZSB0aHJvd3MuIFNlZSBJQXJjaGl2ZXMuc2V0LlxuICAgIGxhc3RNb2RpZmllZD86IG51bWJlcjtcbn07XG5cbi8vIFdoYXQgdGhlIHN0b3JhZ2Ugc2VydmVyIG5lZWRzIGZyb20gYSBidWNrZXQncyBzdG9yZS4gQmxvYlN0b3JlIGltcGxlbWVudHMgaXQgZnVsbHk7IEFyY2hpdmVzRGlza1xuLy8gYWxzbyBzYXRpc2ZpZXMgaXQgKHVzZWQgZGlyZWN0bHkgZm9yIHJhd0Rpc2sgYnVja2V0cyksIG1pbnVzIHRoZSBvcHRpb25hbCBpbmRleC1iYWNrZWQgbWV0aG9kcy5cbmV4cG9ydCB0eXBlIElCdWNrZXRTdG9yZSA9IHtcbiAgICBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+O1xuICAgIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPjtcbiAgICBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBXcml0ZUNvbmZpZyk6IFByb21pc2U8dm9pZD47XG4gICAgZGVsKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFdyaXRlQ29uZmlnKTogUHJvbWlzZTx2b2lkPjtcbiAgICBnZXRJbmZvKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPjtcbiAgICBmaW5kSW5mbyhwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZT86IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPjtcbiAgICBnZXRDaGFuZ2VzQWZ0ZXI/KHRpbWU6IG51bWJlcik6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+O1xuICAgIGdldFN5bmNTdGF0dXM/KCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPjtcbiAgICBnZXRTeW5jUHJvZ3Jlc3M/KCk6IHtcbiAgICAgICAgaW5kZXg6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH07XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICAgICAgc3luY2luZzogU3luY0FjdGl2aXR5W107XG4gICAgfTtcbiAgICBjb21wdXRlSW5kZXhUb3RhbHM/KCk6IFByb21pc2U8eyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXI7IHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W10gfT47XG4gICAgc3RhcnRMYXJnZVVwbG9hZCgpOiBQcm9taXNlPHN0cmluZz47XG4gICAgYXBwZW5kTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZywgZGF0YTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgICBmaW5pc2hMYXJnZVVwbG9hZChpZDogc3RyaW5nLCBrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gICAgY2FuY2VsTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59O1xuXG50eXBlIE92ZXJsYXlFbnRyeSA9IHtcbiAgICAvLyBBIHplcm8tbGVuZ3RoIGJ1ZmZlciBpcyBhIHBlbmRpbmcgZGVsZXRlICh0b21ic3RvbmUpXG4gICAgZGF0YTogQnVmZmVyO1xuICAgIHQ6IG51bWJlcjtcbiAgICBmbHVzaEF0OiBudW1iZXI7XG59O1xuXG4vLyBPbmUgcm93IG9mIHRoZSBCdWxrRGF0YWJhc2UyIGluZGV4IChrZXkgaXMgdGhlIGZpbGUgcGF0aClcbnR5cGUgQmxvYkluZGV4RW50cnkgPSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgd3JpdGVUaW1lOiBudW1iZXI7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIC8vIFdoaWNoIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhIChhbiBpbmRleCBpbnRvIHRoZSBzb3VyY2VzIGFycmF5KVxuICAgIHNvdXJjZTogbnVtYmVyO1xufTtcbnR5cGUgSW5kZXhFbnRyeSA9IHtcbiAgICB3cml0ZVRpbWU6IG51bWJlcjtcbiAgICBzaXplOiBudW1iZXI7XG4gICAgc291cmNlOiBudW1iZXI7XG4gICAgLy8gV2hlbiBXRSBsYXN0IGNoYW5nZWQgdGhpcyBlbnRyeSAobm90IHRoZSBmaWxlJ3Mgd3JpdGUgdGltZSkg4oCUIHdoYXQgZ2V0Q2hhbmdlc0FmdGVyIGZpbHRlcnNcbiAgICAvLyBvbiwgc28gbGF0ZS1hcnJpdmluZyBmaWxlcyB3aXRoIG9sZCB3cml0ZSB0aW1lcyBhcmUgc3RpbGwgcmVwb3J0ZWQgYXMgY2hhbmdlc1xuICAgIGNoYW5nZWRBdDogbnVtYmVyO1xuICAgIC8vIEluLW1lbW9yeSBvbmx5IChub3QgcGVyc2lzdGVkKTogd2hlbiB0aGUgZmlsZSB3YXMgbGFzdCBzZXJ2ZWQsIGZvciByZWFkZXJEaXNrTGltaXQncyBMUlVcbiAgICAvLyBldmljdGlvbi4gU3RhcnRzIGFzIGNoYW5nZWRBdCBvbiBsb2FkLlxuICAgIGxhc3RBY2Nlc3M6IG51bWJlcjtcbn07XG5cbnR5cGUgU291cmNlU3RhdGUgPSB7XG4gICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IGJvb2xlYW47XG4gICAgaW5pdGlhbFNjYW46IFJldHVyblR5cGU8dHlwZW9mIHByb21pc2VPYmo+O1xuICAgIHNjYW5Db21wbGV0ZTogYm9vbGVhbjtcbiAgICAvLyBGaWxlcyBzZWVuIGluIHRoaXMgc291cmNlJ3Mgc2NhbnMgLyBjaGFuZ2UgcG9sbHMgc28gZmFyXG4gICAgc2Nhbm5lZENvdW50OiBudW1iZXI7XG4gICAgLy8gV2F0ZXJtYXJrIGZvciBnZXRDaGFuZ2VzQWZ0ZXIgcG9sbHNcbiAgICBjaGFuZ2VzQWZ0ZXJUaW1lOiBudW1iZXI7XG4gICAgbGFzdE1pc3NDaGVjazogbnVtYmVyO1xufTtcblxuZXhwb3J0IGNsYXNzIEJsb2JTdG9yZSBpbXBsZW1lbnRzIElCdWNrZXRTdG9yZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZm9sZGVyOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgc291cmNlczogQXJjaGl2ZXNTb3VyY2VbXSxcbiAgICAgICAgcHJpdmF0ZSBjb25maWc/OiB7XG4gICAgICAgICAgICAvLyBDYWxsZWQgd2hlbmV2ZXIgYSBrZXkncyBpbmRleCBlbnRyeSBjaGFuZ2VzIChvdXIgb3duIHdyaXRlcyBBTkQgZmlsZXMgcHVsbGVkIGluIHZpYVxuICAgICAgICAgICAgLy8gc3luY2hyb25pemF0aW9uKSDigJQgaG93IHRoZSBzdG9yYWdlIHNlcnZlciBub3RpY2VzIHJvdXRpbmcgY29uZmlnIHVwZGF0ZXMuXG4gICAgICAgICAgICBvbkluZGV4Q2hhbmdlZD86IChrZXk6IHN0cmluZykgPT4gdm9pZDtcbiAgICAgICAgICAgIC8vIExSVS1ib3VuZCB0aGUgZGlzayAoYmFzZSBzb3VyY2UpIHRvIHRoaXMgbWFueSBieXRlczsgc2VlIENvbW1vbkNvbmZpZy5yZWFkZXJEaXNrTGltaXRcbiAgICAgICAgICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICAgICAgICAgIC8vIERlcGxveSB0YWtlb3ZlcjogZmFzdC13cml0ZSBmbHVzaCBkZWxheXMgbmV2ZXIgZXh0ZW5kIHBhc3QgdGhpcyB0aW1lLCBhbmQgYWZ0ZXIgaXRcbiAgICAgICAgICAgIC8vIGZhc3Qgd3JpdGVzIGZsdXNoIGltbWVkaWF0ZWx5IChub3RoaW5nIG1heSBzaXQgaW4gbWVtb3J5IHdoZW4gdGhlIHdyaXRlIHdpbmRvd1xuICAgICAgICAgICAgLy8gdHJhbnNmZXJzIHRvIHRoZSBzdWNjZXNzb3IgcHJvY2VzcylcbiAgICAgICAgICAgIGdldEZsdXNoRGVhZGxpbmU/OiAoKSA9PiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICApIHsgfVxuXG4gICAgcHJpdmF0ZSBzdG9wcGVkID0geyBzdG9wOiBmYWxzZSB9O1xuXG4gICAgLy8gVGhlIGluZGV4J3MgQnVsa0RhdGFiYXNlMiBmaWxlcyBsaXZlIHVuZGVyIDxmb2xkZXI+L2luZGV4XG4gICAgcHJpdmF0ZSBpbmRleCA9IG5ldyBCdWxrRGF0YWJhc2VCYXNlPEJsb2JJbmRleEVudHJ5PihcImJsb2JJbmRleFwiLCBub29wUmVhY3RpdmVEZXBzLCBhc3luYyAocDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCBiYXNlOiBEaXJlY3RvcnlXcmFwcGVyID0gbmV3IE5vZGVKU0RpcmVjdG9yeUhhbmRsZVdyYXBwZXIocGF0aC5qb2luKHRoaXMuZm9sZGVyLCBcImluZGV4XCIpKTtcbiAgICAgICAgZm9yIChsZXQgcGFydCBvZiBwLnNwbGl0KFwiL1wiKSkge1xuICAgICAgICAgICAgaWYgKHBhcnQpIGJhc2UgPSBhd2FpdCBiYXNlLmdldERpcmVjdG9yeUhhbmRsZShwYXJ0LCB7IGNyZWF0ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JhcEhhbmRsZShiYXNlKTtcbiAgICB9KTtcbiAgICAvLyBUaGUgaW4tbWVtb3J5IGNvcHkgb2YgdGhlIGluZGV4LiBBbGwgcmVhZHMgYXJlIHNlcnZlZCBmcm9tIGl0OyBjaGFuZ2VzIGFyZSBidWZmZXJlZCBpblxuICAgIC8vIGRpcnR5IGFuZCBmbHVzaGVkIHRvIHRoZSBCdWxrRGF0YWJhc2UyIGluIGJhdGNoZXMgKHVuZGVmaW5lZCA9IGRlbGV0ZSkuXG4gICAgcHJpdmF0ZSBtZW0gPSBuZXcgTWFwPHN0cmluZywgSW5kZXhFbnRyeT4oKTtcbiAgICAvLyBMaXZlIHRvdGFscyBvdmVyIG1lbSAodG9tYnN0b25lcyBleGNsdWRlZCksIGFkanVzdGVkIG9uIGV2ZXJ5IG11dGF0aW9uIGFuZCByZWNvbXB1dGVkIG9uXG4gICAgLy8gbG9hZCAtIHNvIGFueSBkcmlmdCBoZWFscyBvbiByZXN0YXJ0LiBjb21wdXRlSW5kZXhUb3RhbHMgZ2l2ZXMgdGhlIHdhbGstdGhlLWluZGV4IHRydXRoLlxuICAgIHByaXZhdGUgaW5kZXhGaWxlQ291bnQgPSAwO1xuICAgIHByaXZhdGUgaW5kZXhCeXRlQ291bnQgPSAwO1xuICAgIC8vIFRoZSBzYW1lIHRvdGFscyBwZXIgaG9sZGluZyBzb3VyY2UgKGluZGV4IDAgPSBvdXIgZGlzaywgd2hpY2ggcmVhZGVyRGlza0xpbWl0IGJvdW5kcylcbiAgICBwcml2YXRlIHNvdXJjZUZpbGVDb3VudHMgPSB0aGlzLnNvdXJjZXMubWFwKCgpID0+IDApO1xuICAgIHByaXZhdGUgc291cmNlQnl0ZUNvdW50cyA9IHRoaXMuc291cmNlcy5tYXAoKCkgPT4gMCk7XG4gICAgLy8gQmFja2dyb3VuZCBzY2FucyAvIGZ1bGwgc3luY3MgY3VycmVudGx5IGluIHByb2dyZXNzIChhIFNldCAtIG9uZSBzb3VyY2UgY2FuIGhhdmUgYSBjaGFuZ2VcbiAgICAvLyBwb2xsJ3MgZnVsbCBzeW5jIGFuZCBhIHJlc2NhbiBvdmVybGFwcGluZylcbiAgICBwcml2YXRlIHN5bmNBY3Rpdml0aWVzID0gbmV3IFNldDxTeW5jQWN0aXZpdHk+KCk7XG4gICAgcHJpdmF0ZSBkaXJ0eSA9IG5ldyBNYXA8c3RyaW5nLCBJbmRleEVudHJ5IHwgdW5kZWZpbmVkPigpO1xuICAgIHByaXZhdGUgb3ZlcmxheSA9IG5ldyBNYXA8c3RyaW5nLCBPdmVybGF5RW50cnk+KCk7XG4gICAgcHJpdmF0ZSBzb3VyY2VTdGF0ZXMgPSB0aGlzLnNvdXJjZXMubWFwKCgpOiBTb3VyY2VTdGF0ZSA9PiAoe1xuICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogZmFsc2UsXG4gICAgICAgIGluaXRpYWxTY2FuOiBwcm9taXNlT2JqKCksXG4gICAgICAgIHNjYW5Db21wbGV0ZTogZmFsc2UsXG4gICAgICAgIHNjYW5uZWRDb3VudDogMCxcbiAgICAgICAgY2hhbmdlc0FmdGVyVGltZTogMCxcbiAgICAgICAgbGFzdE1pc3NDaGVjazogMCxcbiAgICB9KSk7XG5cbiAgICBwdWJsaWMgaW5pdCA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRJbmRleCgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdm9pZCB0aGlzLnJ1blNvdXJjZVN5bmMoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKEZBU1RfRkxVU0hfUE9MTCwgKCkgPT4gdGhpcy5mbHVzaE92ZXJsYXkoKSwgdGhpcy5zdG9wcGVkKTtcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKElOREVYX0ZMVVNIX0lOVEVSVkFMLCAoKSA9PiB0aGlzLmZsdXNoSW5kZXgoKSwgdGhpcy5zdG9wcGVkKTtcbiAgICAgICAgcnVuSW5maW5pdGVQb2xsKFRPTUJTVE9ORV9DTEVBTlVQX0lOVEVSVkFMLCAoKSA9PiB0aGlzLmNsZWFudXBUb21ic3RvbmVzKCksIHRoaXMuc3RvcHBlZCk7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZz8ucmVhZGVyRGlza0xpbWl0KSB7XG4gICAgICAgICAgICBydW5JbmZpbml0ZVBvbGwoRElTS19MSU1JVF9DSEVDS19JTlRFUlZBTCwgKCkgPT4gdGhpcy5lbmZvcmNlRGlza0xpbWl0KCksIHRoaXMuc3RvcHBlZCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFN0b3BzIGFsbCBzeW5jaHJvbml6YXRpb24gc2NhbnMvcG9sbHMgYW5kIGZsdXNoZXMgcGVuZGluZyB3cml0ZXMuIFVzZWQgd2hlbiBhIGJ1Y2tldCdzXG4gICAgLy8gcm91dGluZyBjb25maWcgY2hhbmdlcyBhbmQgdGhlIHN0b3JlIGlzIHJlYnVpbHQgd2l0aCBuZXcgc291cmNlcy5cbiAgICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmZsdXNoT3ZlcmxheSh0cnVlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5mbHVzaEluZGV4KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBbd3JpdGVUaW1lcywgc2l6ZXMsIHNvdXJjZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgdGhpcy5pbmRleC5nZXRDb2x1bW4oXCJ3cml0ZVRpbWVcIiksXG4gICAgICAgICAgICB0aGlzLmluZGV4LmdldENvbHVtbihcInNpemVcIiksXG4gICAgICAgICAgICB0aGlzLmluZGV4LmdldENvbHVtbihcInNvdXJjZVwiKSxcbiAgICAgICAgXSk7XG4gICAgICAgIGxldCBzaXplTWFwID0gbmV3IE1hcChzaXplcy5tYXAoeCA9PiBbeC5rZXksIHgudmFsdWVdKSk7XG4gICAgICAgIGxldCBzb3VyY2VNYXAgPSBuZXcgTWFwKHNvdXJjZXMubWFwKHggPT4gW3gua2V5LCB4LnZhbHVlXSkpO1xuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiB3cml0ZVRpbWVzKSB7XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHNpemVNYXAuZ2V0KGVudHJ5LmtleSk7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gc291cmNlTWFwLmdldChlbnRyeS5rZXkpO1xuICAgICAgICAgICAgLy8gRXhwbGljaXQgY2hlY2tzLCBhcyAwIGlzIGEgdmFsaWQgc2l6ZSBhbmQgYSB2YWxpZCBzb3VyY2UgbnVtYmVyXG4gICAgICAgICAgICBpZiAoc2l6ZSA9PT0gdW5kZWZpbmVkIHx8IHNvdXJjZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBmdWxsOiBJbmRleEVudHJ5ID0geyB3cml0ZVRpbWU6IGVudHJ5LnZhbHVlLCBzaXplLCBzb3VyY2UsIGNoYW5nZWRBdDogZW50cnkudGltZSwgbGFzdEFjY2VzczogZW50cnkudGltZSB9O1xuICAgICAgICAgICAgdGhpcy5tZW0uc2V0KGVudHJ5LmtleSwgZnVsbCk7XG4gICAgICAgICAgICB0aGlzLmNvdW50RW50cnkoZnVsbCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNvdW50RW50cnkoZW50cnk6IEluZGV4RW50cnkgfCB1bmRlZmluZWQsIGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghZW50cnkgfHwgZW50cnkuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmluZGV4RmlsZUNvdW50ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgdGhpcy5pbmRleEJ5dGVDb3VudCArPSBlbnRyeS5zaXplICogZGlyZWN0aW9uO1xuICAgICAgICAvLyBBIHN0YWxlIGVudHJ5IGNhbiByZWZlcmVuY2UgYSBzb3VyY2UgdGhhdCBubyBsb25nZXIgZXhpc3RzIChnZXRJbmRleEVudHJ5IGNsZWFucyB0aG9zZSlcbiAgICAgICAgaWYgKHRoaXMuc291cmNlc1tlbnRyeS5zb3VyY2VdKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUZpbGVDb3VudHNbZW50cnkuc291cmNlXSArPSBkaXJlY3Rpb247XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUJ5dGVDb3VudHNbZW50cnkuc291cmNlXSArPSBlbnRyeS5zaXplICogZGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRJbmRleEVudHJ5KGtleTogc3RyaW5nLCBlbnRyeTogeyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyBzb3VyY2U6IG51bWJlciB9KTogdm9pZCB7XG4gICAgICAgIGxldCBmdWxsOiBJbmRleEVudHJ5ID0geyAuLi5lbnRyeSwgY2hhbmdlZEF0OiBEYXRlLm5vdygpLCBsYXN0QWNjZXNzOiBEYXRlLm5vdygpIH07XG4gICAgICAgIHRoaXMuY291bnRFbnRyeSh0aGlzLm1lbS5nZXQoa2V5KSwgLTEpO1xuICAgICAgICB0aGlzLmNvdW50RW50cnkoZnVsbCwgMSk7XG4gICAgICAgIHRoaXMubWVtLnNldChrZXksIGZ1bGwpO1xuICAgICAgICB0aGlzLmRpcnR5LnNldChrZXksIGZ1bGwpO1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25JbmRleENoYW5nZWQ/LihrZXkpO1xuICAgIH1cbiAgICBwcml2YXRlIGRlbGV0ZUluZGV4RW50cnkoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5tZW0uZ2V0KGtleSk7XG4gICAgICAgIGlmICghZXhpc3RpbmcpIHJldHVybjtcbiAgICAgICAgdGhpcy5jb3VudEVudHJ5KGV4aXN0aW5nLCAtMSk7XG4gICAgICAgIHRoaXMubWVtLmRlbGV0ZShrZXkpO1xuICAgICAgICB0aGlzLmRpcnR5LnNldChrZXksIHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLyoqIFJlc2NhbnMgb3VyIG93biBkaXNrJ3MgbWV0YWRhdGEgaW50byB0aGUgaW5kZXggLSB1c2VkIGFyb3VuZCBkZXBsb3kgc3dpdGNob3ZlcnMsIHdoZXJlIHRoZVxuICAgICAqICBvdGhlciBwcm9jZXNzIHdyb3RlIGZpbGVzIHRvIHRoZSBzaGFyZWQgZm9sZGVyIHRoYXQgb3VyIGluZGV4IGhhc24ndCBzZWVuLiAqL1xuICAgIHB1YmxpYyBhc3luYyByZXNjYW5CYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zY2FuU291cmNlKDApO1xuICAgIH1cblxuICAgIC8qKiBUaGUgY2hlYXAgYWx3YXlzLWN1cnJlbnQgdG90YWxzIHBsdXMgYW55IGluLXByb2dyZXNzIGJhY2tncm91bmQgc3luY2hyb25pemF0aW9uLiAqL1xuICAgIHB1YmxpYyBnZXRTeW5jUHJvZ3Jlc3MoKToge1xuICAgICAgICBpbmRleDogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfTtcbiAgICAgICAgc291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXTtcbiAgICAgICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xuICAgICAgICBzeW5jaW5nOiBTeW5jQWN0aXZpdHlbXTtcbiAgICB9IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGV4OiB7IGZpbGVDb3VudDogdGhpcy5pbmRleEZpbGVDb3VudCwgYnl0ZUNvdW50OiB0aGlzLmluZGV4Qnl0ZUNvdW50IH0sXG4gICAgICAgICAgICBzb3VyY2VzOiB0aGlzLnNvdXJjZXMubWFwKCh4LCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgIGRlYnVnTmFtZTogeC5zb3VyY2UuZ2V0RGVidWdOYW1lKCksXG4gICAgICAgICAgICAgICAgZmlsZUNvdW50OiB0aGlzLnNvdXJjZUZpbGVDb3VudHNbaV0sXG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50OiB0aGlzLnNvdXJjZUJ5dGVDb3VudHNbaV0sXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHRoaXMuY29uZmlnPy5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgICAgICBzeW5jaW5nOiBbLi4udGhpcy5zeW5jQWN0aXZpdGllc10sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIFdhbGtzIHRoZSB3aG9sZSBpbmRleCBmb3IgZXhhY3QgdG90YWxzIC0gbW9yZSBleHBlbnNpdmUgdGhhbiBnZXRTeW5jUHJvZ3Jlc3MsIGJ1dCBpbW11bmUgdG9cbiAgICAgKiAgYW55IGRyaWZ0IGluIHRoZSBtYWludGFpbmVkIGNvdW50ZXJzIChhbmQgbG9hZHMgdGhlIGluZGV4IGZpcnN0LCBzbyBpdCdzIG5ldmVyIGNvbGQgemVyb3MpLiAqL1xuICAgIHB1YmxpYyBhc3luYyBjb21wdXRlSW5kZXhUb3RhbHMoKTogUHJvbWlzZTx7XG4gICAgICAgIGZpbGVDb3VudDogbnVtYmVyO1xuICAgICAgICBieXRlQ291bnQ6IG51bWJlcjtcbiAgICAgICAgc291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXTtcbiAgICB9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgZmlsZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGJ5dGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBzb3VyY2VzID0gdGhpcy5zb3VyY2VzLm1hcCh4ID0+ICh7IGRlYnVnTmFtZTogeC5zb3VyY2UuZ2V0RGVidWdOYW1lKCksIGZpbGVDb3VudDogMCwgYnl0ZUNvdW50OiAwIH0pKTtcbiAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgdGhpcy5tZW0udmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zaXplID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZpbGVDb3VudCsrO1xuICAgICAgICAgICAgYnl0ZUNvdW50ICs9IGVudHJ5LnNpemU7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gc291cmNlc1tlbnRyeS5zb3VyY2VdO1xuICAgICAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZS5maWxlQ291bnQrKztcbiAgICAgICAgICAgICAgICBzb3VyY2UuYnl0ZUNvdW50ICs9IGVudHJ5LnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZmlsZUNvdW50LCBieXRlQ291bnQsIHNvdXJjZXMgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZsdXNoSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5kaXJ0eS5zaXplKSByZXR1cm47XG4gICAgICAgIGxldCBkaXJ0eSA9IHRoaXMuZGlydHk7XG4gICAgICAgIHRoaXMuZGlydHkgPSBuZXcgTWFwKCk7XG4gICAgICAgIGxldCB3cml0ZXM6IEJsb2JJbmRleEVudHJ5W10gPSBbXTtcbiAgICAgICAgbGV0IGRlbGV0ZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiBkaXJ0eSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgd3JpdGVzLnB1c2goeyBrZXksIHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplLCBzb3VyY2U6IGVudHJ5LnNvdXJjZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlcy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdyaXRlcy5sZW5ndGgpIGF3YWl0IHRoaXMuaW5kZXgud3JpdGVCYXRjaCh3cml0ZXMpO1xuICAgICAgICBpZiAoZGVsZXRlcy5sZW5ndGgpIGF3YWl0IHRoaXMuaW5kZXguZGVsZXRlQmF0Y2goZGVsZXRlcyk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIHN5bmNocm9uaXphdGlvbiDilIDilIBcblxuICAgIHByaXZhdGUgYXN5bmMgcnVuU291cmNlU3luYyhzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgbm9GdWxsU3luYyB9ID0gdGhpcy5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zb3VyY2VTdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgbGlzdGluZzogTWFwPHN0cmluZywgbnVtYmVyPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgd2hpbGUgKCF0aGlzLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gYXdhaXQgc291cmNlLmdldENvbmZpZygpO1xuICAgICAgICAgICAgICAgIHN0YXRlLnN1cHBvcnRzQ2hhbmdlc0FmdGVyID0gISEoY29uZmlnLnN1cHBvcnRzQ2hhbmdlc0FmdGVyICYmIHNvdXJjZS5nZXRDaGFuZ2VzQWZ0ZXIpO1xuICAgICAgICAgICAgICAgIGxpc3RpbmcgPSBhd2FpdCB0aGlzLnNjYW5Tb3VyY2Uoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEluaXRpYWwgc2NhbiBvZiBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmFpbGVkLCByZXRyeWluZzpgLCBlKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShTQ0FOX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5zY2FuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5pbml0aWFsU2Nhbi5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0aGlzLnN0b3BwZWQuc3RvcCkgcmV0dXJuO1xuICAgICAgICBpZiAobGlzdGluZykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVTb3VyY2Uoc291cmNlSW5kZXgsIGxpc3RpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbm9GdWxsU3luYykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQ29weWluZyBmaWxlcyBmcm9tIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmYWlsZWQ6YCwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLnN1cHBvcnRzQ2hhbmdlc0FmdGVyKSB7XG4gICAgICAgICAgICBydW5JbmZpbml0ZVBvbGwoQ0hBTkdFU19QT0xMX0lOVEVSVkFMLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wb2xsQ2hhbmdlcyhzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKCFub0Z1bGxTeW5jKSBhd2FpdCB0aGlzLmNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICB9LCB0aGlzLnN0b3BwZWQpO1xuICAgICAgICAgICAgLy8gQ2hhbmdlIHBvbGxzIG9ubHkgc2hvdyB3aGF0IHRoZSBzb3VyY2UgSEFTLCBuZXZlciB3aGF0IGl0J3MgbWlzc2luZywgc28gcHVzaGVzIHJ1biBvblxuICAgICAgICAgICAgLy8gdGhlIGZ1bGwtcmVzY2FuIGNhZGVuY2UgKGZpbmRJbmZvIG9uIGFuIGluZGV4LWJhY2tlZCBzb3VyY2UgaXMgY2hlYXApXG4gICAgICAgICAgICBydW5JbmZpbml0ZVBvbGwoRlVMTF9SRVNDQU5fSU5URVJWQUwsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsZXMgPSBhd2FpdCBzb3VyY2UuZmluZEluZm8oXCJcIik7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVTb3VyY2Uoc291cmNlSW5kZXgsIG5ldyBNYXAoZmlsZXMubWFwKHggPT4gW3gucGF0aCwgeC5jcmVhdGVUaW1lXSkpKTtcbiAgICAgICAgICAgIH0sIHRoaXMuc3RvcHBlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW5JbmZpbml0ZVBvbGwoRlVMTF9SRVNDQU5fSU5URVJWQUwsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzY2FuID0gYXdhaXQgdGhpcy5zY2FuU291cmNlKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlY29uY2lsZVNvdXJjZShzb3VyY2VJbmRleCwgcmVzY2FuKTtcbiAgICAgICAgICAgICAgICBpZiAoIW5vRnVsbFN5bmMpIGF3YWl0IHRoaXMuY29weVNvdXJjZUZpbGVzKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgIH0sIHRoaXMuc3RvcHBlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGdWxsIG1ldGFkYXRhIHNjYW4gKHNpemUsIHdyaXRlVGltZSwgcGF0aCkgb2Ygb25lIHNvdXJjZSwgYXBwbGllZCB0byB0aGUgaW5kZXguIFJldHVybnMgdGhlXG4gICAgLy8gc291cmNlJ3MgbGlzdGluZyAocGF0aCAtPiB3cml0ZSB0aW1lKSwgd2hpY2ggcmVjb25jaWxlU291cmNlIHVzZXMgZm9yIHRoZSBwdXNoIGRpcmVjdGlvbi5cbiAgICBwcml2YXRlIGFzeW5jIHNjYW5Tb3VyY2Uoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8TWFwPHN0cmluZywgbnVtYmVyPj4ge1xuICAgICAgICBsZXQgeyBzb3VyY2UgfSA9IHRoaXMuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc291cmNlU3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHNjYW5TdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBzY2FuTG9nZ2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBhY3Rpdml0eTogU3luY0FjdGl2aXR5ID0geyB0eXBlOiBcIm1ldGFkYXRhU2NhblwiLCBzb3VyY2VEZWJ1Z05hbWU6IHNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgc3RhcnRUaW1lOiBzY2FuU3RhcnQgfTtcbiAgICAgICAgdGhpcy5zeW5jQWN0aXZpdGllcy5hZGQoYWN0aXZpdHkpO1xuICAgICAgICBsZXQgcHJvZ3Jlc3NUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIHNjYW5Mb2dnZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYE1ldGFkYXRhIHNjYW4gb2YgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHN0aWxsIHJ1bm5pbmcgKCR7TWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIHNjYW5TdGFydCkgLyAxMDAwKX1zLCBzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfSwgU1lOQ19QUk9HUkVTU19MT0dfSU5URVJWQUwpO1xuICAgICAgICAocHJvZ3Jlc3NUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIGxldCBmaWxlczogQXJjaGl2ZUZpbGVJbmZvW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmaWxlcyA9IGF3YWl0IHNvdXJjZS5maW5kSW5mbyhcIlwiKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgICAgICAgICB0aGlzLnN5bmNBY3Rpdml0aWVzLmRlbGV0ZShhY3Rpdml0eSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjYW5Mb2dnZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBNZXRhZGF0YSBzY2FuIG9mICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmaW5pc2hlZDogJHtmaWxlcy5sZW5ndGh9IGZpbGVzIGluICR7TWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIHNjYW5TdGFydCkgLyAxMDAwKX1zIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIHNlZW4uc2V0KGZpbGUucGF0aCwgZmlsZS5jcmVhdGVUaW1lKTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTY2FubmVkKHNvdXJjZUluZGV4LCBmaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5zY2FubmVkQ291bnQgPSBmaWxlcy5sZW5ndGg7XG4gICAgICAgIC8vIEluZGV4IGVudHJpZXMgdGhpcyBzb3VyY2Ugd2FzIHRoZSBob2xkZXIgb2YsIGJ1dCB0aGF0IHZhbmlzaGVkIGZyb20gaXQgKGUuZy4gZGVsZXRlZFxuICAgICAgICAvLyB3aGlsZSB3ZSB3ZXJlIG9mZmxpbmUpLCBjb21lIG91dCBvZiB0aGUgaW5kZXguIEVudHJpZXMgY2hhbmdlZCBhZnRlciB0aGUgc2NhbiBzdGFydGVkXG4gICAgICAgIC8vIGFyZSBrZXB0IOKAlCB0aGUgc2NhbiBsaXN0aW5nIG1heSBzaW1wbHkgcHJlZGF0ZSB0aGVtLiBUb21ic3RvbmVzIGhhdmUgbm8gcGh5c2ljYWwgZmlsZVxuICAgICAgICAvLyBmb3IgYSBsaXN0aW5nIHRvIHZvdWNoIGZvciwgc28gdGhleSdyZSBleGVtcHQgKGNsZWFudXBUb21ic3RvbmVzIGV4cGlyZXMgdGhlbSBpbnN0ZWFkKS5cbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMubWVtKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuc291cmNlICE9PSBzb3VyY2VJbmRleCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoZW50cnkuc2l6ZSA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoZW50cnkuY2hhbmdlZEF0ID49IHNjYW5TdGFydCkgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5jaGFuZ2VzQWZ0ZXJUaW1lID0gTWF0aC5tYXgoc3RhdGUuY2hhbmdlc0FmdGVyVGltZSwgc2NhblN0YXJ0IC0gQ0hBTkdFU19QT0xMX09WRVJMQVApO1xuICAgICAgICByZXR1cm4gc2VlbjtcbiAgICB9XG5cbiAgICAvLyBUaGUgcHVzaCBkaXJlY3Rpb24gb2Ygc3luY2hyb25pemF0aW9uOiBldmVyeXRoaW5nIHdlIGtub3cgdGhhdCB0aGUgc291cmNlIGlzIG1pc3NpbmcgKG9yXG4gICAgLy8gaG9sZHMgYW4gb2xkZXIgY29weSBvZikgaXMgd3JpdHRlbiB0byBpdCDigJQgaW5jbHVkaW5nIGRlbGV0aW9ucywgYXMgdG9tYnN0b25lIHdyaXRlcy4gVGhpcyBpc1xuICAgIC8vIHdoYXQgaGVhbHMgYSBzb3VyY2Ugd2hvc2UgYmFja2dyb3VuZCB3cml0ZXMgZmFpbGVkIChlLmcuIGl0IHdhcyBkb3duKTogdGhlIG5leHQgc2NhbiBzZWVzXG4gICAgLy8gd2hhdCdzIG1pc3NpbmcgYW5kIHJlLXNlbmRzIGl0LlxuICAgIHByaXZhdGUgYXN5bmMgcmVjb25jaWxlU291cmNlKHNvdXJjZUluZGV4OiBudW1iZXIsIGxpc3Rpbmc6IE1hcDxzdHJpbmcsIG51bWJlcj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHsgc291cmNlLCB2YWxpZFdpbmRvdywgcm91dGUgfSA9IHRoaXMuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBhY2NlcHRzV3JpdGVzID0gd2luZG93QWNjZXB0c1dyaXRlcyh2YWxpZFdpbmRvdyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tZW0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlID09PSBzb3VyY2VJbmRleCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gUGFzdC13aW5kb3cgc291cmNlcyBvbmx5IHJlY2VpdmUgdGhlIHJvdXRpbmcgZmlsZSAoc2VlIHdyaXRlVG9Tb3VyY2VzKSwgYW5kXG4gICAgICAgICAgICAgICAgLy8gc2hhcmRlZCBzb3VyY2VzIG9ubHkgdGhlIGtleXMgcm91dGluZyBpbnRvIHRoZW1cbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY2NlcHRzV3JpdGVzKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCB0aGVpclRpbWUgPSBsaXN0aW5nLmdldChrZXkpO1xuICAgICAgICAgICAgICAgIGlmICh0aGVpclRpbWUgIT09IHVuZGVmaW5lZCAmJiB0aGVpclRpbWUgPj0gZW50cnkud3JpdGVUaW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBIGRlbGV0aW9uIG9ubHkgbmVlZHMgcHVzaGluZyB3aGlsZSB0aGUgc291cmNlIHN0aWxsIGhvbGRzIGFuIG9sZGVyIGNvcHlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoZWlyVGltZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc291cmNlLnNldChrZXksIEJ1ZmZlci5hbGxvYygwKSwgeyBsYXN0TW9kaWZpZWQ6IGVudHJ5LndyaXRlVGltZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLnNvdXJjZXNbZW50cnkuc291cmNlXS5zb3VyY2UuZ2V0MihrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCBzb3VyY2Uuc2V0KGtleSwgcmVzdWx0LmRhdGEsIHsgbGFzdE1vZGlmaWVkOiByZXN1bHQud3JpdGVUaW1lIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBBYm9ydCB0aGUgcGFzcyBpbnN0ZWFkIG9mIGxvZ2dpbmcgcGVyIGZpbGU7IHRoZSBuZXh0IHNjYW4gY3ljbGUgcmV0cmllc1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgUmVjb25jaWxpbmcgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlTY2FubmVkKHNvdXJjZUluZGV4OiBudW1iZXIsIGZpbGU6IEFyY2hpdmVGaWxlSW5mbyk6IHZvaWQge1xuICAgICAgICBsZXQgeyB2YWxpZFdpbmRvdywgcm91dGUgfSA9IHRoaXMuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBbd2luZG93U3RhcnQsIHdpbmRvd0VuZF0gPSB2YWxpZFdpbmRvdztcbiAgICAgICAgaWYgKGZpbGUuY3JlYXRlVGltZSA8IHdpbmRvd1N0YXJ0IHx8IGZpbGUuY3JlYXRlVGltZSA+IHdpbmRvd0VuZCkgcmV0dXJuO1xuICAgICAgICAvLyBBIHBhcnRpYWxseS1vdmVybGFwcGluZyBzaGFyZCdzIGxpc3RpbmcgaW5jbHVkZXMga2V5cyBvdXRzaWRlIG91ciByb3V0ZTsgaWdub3JlIHRoZW1cbiAgICAgICAgaWYgKGZpbGUucGF0aCAhPT0gUk9VVElOR19GSUxFICYmICFyb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShmaWxlLnBhdGgpKSkgcmV0dXJuO1xuICAgICAgICBsZXQgZXhpc3RpbmcgPSB0aGlzLm1lbS5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgLy8gVGhlIGhpZ2hlc3Qgd3JpdGUgdGltZSB3aW5zIGFjcm9zcyBhbGwgc291cmNlcyAodGllcyBrZWVwIHRoZSBleGlzdGluZyBlbnRyeSlcbiAgICAgICAgaWYgKGV4aXN0aW5nICYmIGZpbGUuY3JlYXRlVGltZSA8PSBleGlzdGluZy53cml0ZVRpbWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGZpbGUucGF0aCwgeyB3cml0ZVRpbWU6IGZpbGUuY3JlYXRlVGltZSwgc2l6ZTogZmlsZS5zaXplLCBzb3VyY2U6IHNvdXJjZUluZGV4IH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcG9sbENoYW5nZXMoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBzb3VyY2UgfSA9IHRoaXMuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGlmICghc291cmNlLmdldENoYW5nZXNBZnRlcikgcmV0dXJuO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnNvdXJjZVN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBwb2xsU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgY2hhbmdlcyA9IGF3YWl0IHNvdXJjZS5nZXRDaGFuZ2VzQWZ0ZXIoc3RhdGUuY2hhbmdlc0FmdGVyVGltZSk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgY2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5hcHBseVNjYW5uZWQoc291cmNlSW5kZXgsIGZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnNjYW5uZWRDb3VudCArPSBjaGFuZ2VzLmxlbmd0aDtcbiAgICAgICAgc3RhdGUuY2hhbmdlc0FmdGVyVGltZSA9IHBvbGxTdGFydCAtIENIQU5HRVNfUE9MTF9PVkVSTEFQO1xuICAgIH1cblxuICAgIC8vIERvd25sb2FkcyB0aGUgZmlsZXMgYSBzb3VyY2UgY3VycmVudGx5IGhvbGRzIG9udG8gb3VyIG93biBiYXNlIHNvdXJjZSAodGhlIGxvY2FsIGRpc2spLFxuICAgIC8vIHByZXNlcnZpbmcgdGhlaXIgbW9kaWZpZWQgdGltZXMg4oCUIHNvIGEgbmV3ZXIgbG9jYWwgd3JpdGUgYWx3YXlzIHdpbnMuIFNraXBwZWQgZm9yIG5vRnVsbFN5bmNcbiAgICAvLyBzb3VyY2VzIChmcm9udGluZyBhIGxhcmdlIGRhdGFiYXNlIHdpdGhvdXQgY29weWluZyBpdCk7IHJlYWRzIHN0aWxsIGRvd24tY2FjaGUgbGF6aWx5LlxuICAgIHByaXZhdGUgYXN5bmMgY29weVNvdXJjZUZpbGVzKHNvdXJjZUluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHNvdXJjZUluZGV4ID09PSAwKSByZXR1cm47XG4gICAgICAgIGxldCB7IHNvdXJjZSB9ID0gdGhpcy5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IHBlbmRpbmc6IHsga2V5OiBzdHJpbmc7IGVudHJ5OiBJbmRleEVudHJ5IH1bXSA9IFtdO1xuICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLm1lbSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZSAhPT0gc291cmNlSW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNpemUgPT09IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgcGVuZGluZy5wdXNoKHsga2V5LCBlbnRyeSB9KTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBlbmRpbmcubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBhY3Rpdml0eTogU3luY0FjdGl2aXR5ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJmdWxsU3luY1wiLFxuICAgICAgICAgICAgc291cmNlRGVidWdOYW1lOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksXG4gICAgICAgICAgICBzdGFydFRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICBkb25lRmlsZXM6IDAsXG4gICAgICAgICAgICB0b3RhbEZpbGVzOiBwZW5kaW5nLmxlbmd0aCxcbiAgICAgICAgICAgIGRvbmVCeXRlczogMCxcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3luY0FjdGl2aXRpZXMuYWRkKGFjdGl2aXR5KTtcbiAgICAgICAgbGV0IHByb2dyZXNzTG9nZ2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBsb2dQcm9ncmVzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHByb2dyZXNzTG9nZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGdWxsIHN5bmMgZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogJHthY3Rpdml0eS5kb25lRmlsZXN9LyR7cGVuZGluZy5sZW5ndGh9IGZpbGVzICgkeygoYWN0aXZpdHkuZG9uZUZpbGVzIHx8IDApIC8gcGVuZGluZy5sZW5ndGggKiAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwKX1CLyR7Zm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpfUIgKCR7KHRvdGFsQnl0ZXMgJiYgKGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwKSAvIHRvdGFsQnl0ZXMgKiAxMDAgfHwgMTAwKS50b0ZpeGVkKDEpfSUpYCk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBwcm9ncmVzc1RpbWVyID0gc2V0SW50ZXJ2YWwobG9nUHJvZ3Jlc3MsIFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMKTtcbiAgICAgICAgKHByb2dyZXNzVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICBsZXQgc2xvd0Vycm9yVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgZWxhcHNlZCA9IERhdGUubm93KCkgLSBhY3Rpdml0eS5zdGFydFRpbWU7XG4gICAgICAgICAgICBsZXQgZG9uZUZpbGVzID0gYWN0aXZpdHkuZG9uZUZpbGVzIHx8IDA7XG4gICAgICAgICAgICBsZXQgZG9uZUJ5dGVzID0gYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDA7XG4gICAgICAgICAgICBsZXQgYnl0ZXNQZXJTZWNvbmQgPSBkb25lQnl0ZXMgLyAoZWxhcHNlZCAvIDEwMDApO1xuICAgICAgICAgICAgbGV0IHJlbWFpbmluZ0J5dGVzID0gdG90YWxCeXRlcyAtIGRvbmVCeXRlcztcbiAgICAgICAgICAgIGxldCBldGFUZXh0ID0gXCJ1bmtub3duIChubyBieXRlcyB0cmFuc2ZlcnJlZCB5ZXQpXCI7XG4gICAgICAgICAgICBpZiAoYnl0ZXNQZXJTZWNvbmQgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlbWFpbmluZ01zID0gcmVtYWluaW5nQnl0ZXMgLyBieXRlc1BlclNlY29uZCAqIDEwMDA7XG4gICAgICAgICAgICAgICAgZXRhVGV4dCA9IGAke2Zvcm1hdFRpbWUocmVtYWluaW5nTXMpfSByZW1haW5pbmcsIGNvbXBsZXRpbmcgYXJvdW5kICR7bmV3IERhdGUoRGF0ZS5ub3coKSArIHJlbWFpbmluZ01zKS50b0lTT1N0cmluZygpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGdWxsIHN5bmMgZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KSBoYXMgYmVlbiBydW5uaW5nIGZvciAke2Zvcm1hdFRpbWUoZWxhcHNlZCl9OiAke2RvbmVGaWxlc30vJHtwZW5kaW5nLmxlbmd0aH0gZmlsZXMgKCR7KGRvbmVGaWxlcyAvIHBlbmRpbmcubGVuZ3RoICogMTAwKS50b0ZpeGVkKDEpfSUpLCAke2Zvcm1hdE51bWJlcihkb25lQnl0ZXMpfUIvJHtmb3JtYXROdW1iZXIodG90YWxCeXRlcyl9QiAoJHsodG90YWxCeXRlcyAmJiBkb25lQnl0ZXMgLyB0b3RhbEJ5dGVzICogMTAwIHx8IDEwMCkudG9GaXhlZCgxKX0lKSwgJHtmb3JtYXROdW1iZXIoYnl0ZXNQZXJTZWNvbmQpfUIvcy4gRXN0aW1hdGVkICR7ZXRhVGV4dH0uYCk7XG4gICAgICAgIH0sIEZVTExfU1lOQ19TTE9XX0VSUk9SX0lOVEVSVkFMKTtcbiAgICAgICAgKHNsb3dFcnJvclRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBuZXh0SW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGZhaWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGNvcHlXb3JrZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFmYWlsZWQgJiYgIXRoaXMuc3RvcHBlZC5zdG9wKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG5leHRJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gcGVuZGluZy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsga2V5LCBlbnRyeSB9ID0gcGVuZGluZ1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBzb3VyY2UuZ2V0MihrZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbMF0uc291cmNlLnNldChrZXksIHJlc3VsdC5kYXRhLCB7IGxhc3RNb2RpZmllZDogcmVzdWx0LndyaXRlVGltZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgbW92ZSB0aGUgZW50cnkncyBzb3VyY2UgaWYgaXQgd2Fzbid0IGNoYW5nZWQgd2hpbGUgd2UgY29waWVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tZW0uZ2V0KGtleSkgPT09IGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5kYXRhLmxlbmd0aCwgc291cmNlOiAwIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5LmRvbmVGaWxlcyA9IChhY3Rpdml0eS5kb25lRmlsZXMgfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5kb25lQnl0ZXMgPSAoYWN0aXZpdHkuZG9uZUJ5dGVzIHx8IDApICsgZW50cnkuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IHdvcmtlcnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihGVUxMX1NZTkNfUEFSQUxMRUwsIHBlbmRpbmcubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgd29ya2Vycy5wdXNoKGNvcHlXb3JrZXIoKS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCB0aGUgb3RoZXIgd29ya2VycyBwdWxsaW5nIG5ldyBmaWxlcywgdGhlbiBzdXJmYWNlIHRoZSBlcnJvclxuICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdvcmtlcnMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoc2xvd0Vycm9yVGltZXIpO1xuICAgICAgICAgICAgdGhpcy5zeW5jQWN0aXZpdGllcy5kZWxldGUoYWN0aXZpdHkpO1xuICAgICAgICAgICAgLy8gQSBzeW5jIHNsb3cgZW5vdWdoIHRvIGhhdmUgbG9nZ2VkIHByb2dyZXNzIGFsc28gbG9ncyBpdHMgY29tcGxldGlvblxuICAgICAgICAgICAgaWYgKHByb2dyZXNzTG9nZ2VkKSB7XG4gICAgICAgICAgICAgICAgbG9nUHJvZ3Jlc3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZpbmRJbmZvIGFuZCBnZXRDaGFuZ2VzQWZ0ZXIgbGlzdCBmcm9tIHRoZSBpbmRleCwgc28gdGhleSBtdXN0IHdhaXQgZm9yIG91ciBvd24gYmFzZVxuICAgIC8vIHNvdXJjZSdzIGluaXRpYWwgc2NhbiAod2hpY2ggbWlnaHQgbGFnIG1pbnV0ZXMpIGJlZm9yZSB0aGUgbGlzdGluZyBpcyB0cnVzdHdvcnRoeS4gVGhlIGJhc2VcbiAgICAvLyAobG9jYWwgZGlzaykgaXMgaW1wbGljaXRseSByZXF1aXJlZCAtIHJlbW90ZSBzb3VyY2VzIGFyZSBub3QsIHRoZXkgY29tZSBhbmQgZ28uXG4gICAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yUmVxdWlyZWRTY2FucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VTdGF0ZXNbMF0uaW5pdGlhbFNjYW4ucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBBIHJlcXVlc3RlZCBmaWxlIGlzbid0IGluIHRoZSBpbmRleDogb3VyIG93biBiYXNlIHNvdXJjZSAoaW1wbGljaXRseSByZXF1aXJlZCkgaXMgY2hlY2tlZFxuICAgIC8vIGRpcmVjdGx5IGlmIGl0cyBpbml0aWFsIHNjYW4gaGFzbid0IGZpbmlzaGVkLCBhbmQgY2hhbmdlcy1hZnRlciBzb3VyY2VzIGFyZSByZS1wb2xsZWQgKGF0XG4gICAgLy8gbW9zdCBldmVyeSA1IHNlY29uZHMpXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja01pc3NpbmdLZXkoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7IHNvdXJjZSB9ID0gdGhpcy5zb3VyY2VzW2ldO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zb3VyY2VTdGF0ZXNbaV07XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiAhc3RhdGUuc2NhbkNvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluZm8gPSBhd2FpdCBzb3VyY2UuZ2V0SW5mbyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlTY2FubmVkKGksIHsgcGF0aDoga2V5LCBjcmVhdGVUaW1lOiBpbmZvLndyaXRlVGltZSwgc2l6ZTogaW5mby5zaXplIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5zdXBwb3J0c0NoYW5nZXNBZnRlciAmJiBEYXRlLm5vdygpIC0gc3RhdGUubGFzdE1pc3NDaGVjayA+IE1JU1NfQ0hFQ0tfSU5URVJWQUwpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5sYXN0TWlzc0NoZWNrID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBvbGxDaGFuZ2VzKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRJbmRleEVudHJ5KGtleTogc3RyaW5nKTogUHJvbWlzZTxJbmRleEVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMubWVtLmdldChrZXkpO1xuICAgICAgICBpZiAoZW50cnkgJiYgdGhpcy5zb3VyY2VzW2VudHJ5LnNvdXJjZV0pIHJldHVybiBlbnRyeTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAvLyBUaGUgc291cmNlIGxpc3QgY2hhbmdlZCBhbmQgdGhpcyBlbnRyeSdzIHNvdXJjZSBubyBsb25nZXIgZXhpc3RzOyB0cmVhdCBhcyBtaXNzaW5nXG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrTWlzc2luZ0tleShrZXkpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZW0uZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIGRhdGEgb3BlcmF0aW9ucyDilIDilIBcblxuICAgIHB1YmxpYyBhc3luYyBnZXQoa2V5OiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoa2V5LCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5kYXRhIHx8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihrZXk6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWc/LnJhbmdlO1xuICAgICAgICBsZXQgb3ZlcmxheUVudHJ5ID0gdGhpcy5vdmVybGF5LmdldChrZXkpO1xuICAgICAgICBpZiAob3ZlcmxheUVudHJ5KSB7XG4gICAgICAgICAgICAvLyBBbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlICh0b21ic3RvbmUpXG4gICAgICAgICAgICBpZiAob3ZlcmxheUVudHJ5LmRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBvdmVybGF5RW50cnkuZGF0YTtcbiAgICAgICAgICAgIGxldCBzaXplID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zdWJhcnJheShNYXRoLm1pbihyYW5nZS5zdGFydCwgZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IG92ZXJsYXlFbnRyeS50LCBzaXplIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVudHJ5ID0gYXdhaXQgdGhpcy5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIGlmICghZW50cnkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlbnRyeS5zaXplID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBlbnRyeS5sYXN0QWNjZXNzID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGhvbGRlciA9IGVudHJ5LnNvdXJjZTtcbiAgICAgICAgbGV0IHJlc3VsdDogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGhvbGRlckVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuc291cmNlc1tob2xkZXJdLnNvdXJjZS5nZXQyKGtleSwgeyByYW5nZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaG9sZGVyRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIFJhbmdlZCByZWFkcyBjYW4ndCBwb3B1bGF0ZSBhIGNhY2hlICh0aGV5J3JlIHBhcnRpYWwpXG4gICAgICAgICAgICBpZiAoaG9sZGVyICE9PSAwICYmICFyYW5nZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FjaGVSZWFkKGtleSwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGhvbGRlciBpcyBkb3duIG9yIGxvc3QgdGhlIGZpbGUuIEFOWSBvdGhlciBzb3VyY2UncyBjb3B5IGJlYXRzIG5vIHZhbHVlIC0gZXZlbiBhblxuICAgICAgICAvLyBPTERFUiBvbmUgLSBhbmQgaXQncyBjb3BpZWQgb250byBvdXIgZGlzayBzbyB0aGUgbmV4dCByZWFkIGRvZXNuJ3QgZGVwZW5kIG9uIGx1Y2suXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gaG9sZGVyKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBmYWxsYmFjazogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZmFsbGJhY2sgPSBhd2FpdCB0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldDIoa2V5KTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFmYWxsYmFjaykgY29udGludWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlUmVhZChrZXksIGZhbGxiYWNrKTtcbiAgICAgICAgICAgIGxldCBkYXRhID0gZmFsbGJhY2suZGF0YTtcbiAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnN1YmFycmF5KE1hdGgubWluKHJhbmdlLnN0YXJ0LCBkYXRhLmxlbmd0aCksIE1hdGgubWluKHJhbmdlLmVuZCwgZGF0YS5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGRhdGEsIHdyaXRlVGltZTogZmFsbGJhY2sud3JpdGVUaW1lLCBzaXplOiBmYWxsYmFjay5zaXplIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhvbGRlckVycm9yKSB0aHJvdyBob2xkZXJFcnJvcjtcbiAgICAgICAgLy8gVGhlIGhvbGRlciBhbnN3ZXJlZCBcIm5vdCB0aGVyZVwiIGFuZCBubyBvdGhlciBzb3VyY2UgaGFzIGl0IGVpdGhlcjogdGhlIGVudHJ5IHdhcyBzdGFsZVxuICAgICAgICB0aGlzLmRlbGV0ZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVhZCdzIGJ5dGVzIGNhbWUgZnJvbSBhIHJlbW90ZSBzb3VyY2UsIHNvIHdyaXRlIHRoZW0gb250byBvdXIgb3duIGJhc2Ugc291cmNlICh0aGVcbiAgICAvLyBsb2NhbCBkaXNrKSwgd2hpY2ggYmVjb21lcyB0aGUgZW50cnkncyBuZXcgaG9sZGVyIC0gcmVhZHMgb25seSBwYXkgdGhlIHJlbW90ZSBmZXRjaCBvbmNlXG4gICAgcHJpdmF0ZSBhc3luYyBjYWNoZVJlYWQoa2V5OiBzdHJpbmcsIHJlc3VsdDogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5zZXQoa2V5LCByZXN1bHQuZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHJlc3VsdC53cml0ZVRpbWUgfSk7XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuZGF0YS5sZW5ndGgsIHNvdXJjZTogMCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFdyaXRlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkID0gY29uZmlnPy5sYXN0TW9kaWZpZWQ7XG4gICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICBsZXQgb3ZlcmxheUVudHJ5ID0gdGhpcy5vdmVybGF5LmdldChrZXkpO1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5tZW0uZ2V0KGtleSk7XG4gICAgICAgICAgICBsZXQgY3VycmVudFRpbWUgPSBvdmVybGF5RW50cnkgJiYgb3ZlcmxheUVudHJ5LnQgfHwgZW50cnkgJiYgZW50cnkud3JpdGVUaW1lIHx8IDA7XG4gICAgICAgICAgICAvLyBBbiBvbGRlciB3cml0ZSBuZXZlciBvdmVyd3JpdGVzIGEgbmV3ZXIgb25lIChzZWUgSUFyY2hpdmVzLnNldClcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQgPCBjdXJyZW50VGltZSkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB3cml0ZVRpbWUgPSBsYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGNvbmZpZz8uZmFzdCkge1xuICAgICAgICAgICAgbGV0IHdyaXRlRGVsYXkgPSBjb25maWcud3JpdGVEZWxheSB8fCBERUZBVUxUX0ZBU1RfV1JJVEVfREVMQVk7XG4gICAgICAgICAgICBsZXQgZmx1c2hBdCA9IERhdGUubm93KCkgKyB3cml0ZURlbGF5O1xuICAgICAgICAgICAgbGV0IGRlYWRsaW5lID0gdGhpcy5jb25maWc/LmdldEZsdXNoRGVhZGxpbmU/LigpO1xuICAgICAgICAgICAgaWYgKGRlYWRsaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXkuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGVUb1NvdXJjZXMoa2V5LCBkYXRhLCB3cml0ZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZsdXNoQXQgPSBNYXRoLm1pbihmbHVzaEF0LCBkZWFkbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXkuc2V0KGtleSwgeyBkYXRhLCB0OiB3cml0ZVRpbWUsIGZsdXNoQXQgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdmVybGF5LmRlbGV0ZShrZXkpO1xuICAgICAgICBhd2FpdCB0aGlzLndyaXRlVG9Tb3VyY2VzKGtleSwgZGF0YSwgd3JpdGVUaW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGtleTogc3RyaW5nLCBjb25maWc/OiBXcml0ZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBEZWxldGVzIGFyZSB0b21ic3RvbmUgd3JpdGVzIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKTogdGhlIHNpemUtMCBpbmRleCBlbnRyeSBpc1xuICAgICAgICAvLyBvcmRlcmVkIGJ5IHdyaXRlIHRpbWUgbGlrZSBhbnkgb3RoZXIgd3JpdGUsIHByb3BhZ2F0ZXMgdGhyb3VnaCBzeW5jaHJvbml6YXRpb24sIGFuZFxuICAgICAgICAvLyBleHBpcmVzIGFmdGVyIFRPTUJTVE9ORV9FWFBJUllcbiAgICAgICAgYXdhaXQgdGhpcy5zZXQoa2V5LCBCdWZmZXIuYWxsb2MoMCksIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRXcml0YWJsZVNvdXJjZXMoY29uZmlnPzogeyBpZ25vcmVXaW5kb3c/OiBib29sZWFuIH0pOiBudW1iZXJbXSB7XG4gICAgICAgIGxldCB3cml0YWJsZTogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnPy5pZ25vcmVXaW5kb3cgJiYgIXdpbmRvd0FjY2VwdHNXcml0ZXModGhpcy5zb3VyY2VzW2ldLnZhbGlkV2luZG93KSkgY29udGludWU7XG4gICAgICAgICAgICB3cml0YWJsZS5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0YWJsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHdyaXRlVG9Tb3VyY2VzKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIHdyaXRlVGltZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgZXhlbXB0IGZyb20gdGhlIHZhbGlkLXdpbmRvdyBhbmQgcm91dGUgd3JpdGUgZmlsdGVyczogdGhlIENPTkZJR1xuICAgICAgICAvLyBtdXN0IGtlZXAgZmxvd2luZyB0byBldmVyeSBzb3VyY2UsIG9yIGEgY2xpZW50IHByb2Jpbmcgb25lIG9mIHRoZW0gZmlyc3Qgd291bGQgYWRvcHQgYVxuICAgICAgICAvLyBzdGFsZSBjb25maWcuIE9ubHkgZGF0YSB3cml0ZXMgc3RvcC5cbiAgICAgICAgbGV0IGlzUm91dGluZyA9IGtleSA9PT0gUk9VVElOR19GSUxFO1xuICAgICAgICBsZXQgd3JpdGFibGUgPSB0aGlzLmdldFdyaXRhYmxlU291cmNlcyh7IGlnbm9yZVdpbmRvdzogaXNSb3V0aW5nIH0pO1xuICAgICAgICBsZXQgZmlyc3QgPSB3cml0YWJsZS5zaGlmdCgpO1xuICAgICAgICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgYWNjZXB0cyB3cml0ZXMgKGV2ZXJ5IHNvdXJjZSdzIHZhbGlkIHdpbmRvdyBpcyBpbiB0aGUgcGFzdCksIHNvIHdyaXRlcyBjYW5ub3QgYmUgc3RvcmVkIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IG91ciBvd24gKGZpcnN0KSBzb3VyY2UgYmxvY2tzIHRoZSB3cml0ZS4gRG93bnN0cmVhbSBzb3VyY2VzIGFyZSB3cml0dGVuIGluIHRoZVxuICAgICAgICAvLyBiYWNrZ3JvdW5kOiBhIGRvd24gZG93bnN0cmVhbSBzb3VyY2UgbXVzdCBub3QgZmFpbCBvciBzdGFsbCB3cml0ZXMsIGFuZCByZWNvbmNpbGVTb3VyY2VcbiAgICAgICAgLy8gcmUtc2VuZHMgYW55dGhpbmcgdGhleSBtaXNzZWQgb25jZSB0aGV5IGNvbWUgYmFjay5cbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBBIHRvbWJzdG9uZSBzdG9yZXMgbm90aGluZyBvbiBvdXIgb3duIHNvdXJjZSAtIHRoZSBpbmRleCBlbnRyeSBhbG9uZSByZWNvcmRzIGl0XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbZmlyc3RdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1tmaXJzdF0uc291cmNlLnNldChrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWUsIHNpemU6IGRhdGEubGVuZ3RoLCBzb3VyY2U6IGZpcnN0IH0pO1xuICAgICAgICBsZXQgcm91dGUgPSAhaXNSb3V0aW5nICYmIGdldFJvdXRlKGtleSkgfHwgMDtcbiAgICAgICAgZm9yIChsZXQgaSBvZiB3cml0YWJsZSkge1xuICAgICAgICAgICAgaWYgKCFpc1JvdXRpbmcgJiYgIXJvdXRlQ29udGFpbnModGhpcy5zb3VyY2VzW2ldLnJvdXRlLCByb3V0ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gRG93bnN0cmVhbSBzb3VyY2VzIHJlY2VpdmUgdG9tYnN0b25lcyBhcyBhY3R1YWwgZW1wdHkgd3JpdGVzLCBzbyB0aGVpciBsaXN0aW5ncyBzaG93XG4gICAgICAgICAgICAvLyB0aGUgZGVsZXRpb24gKHNpemUgMCkgYW5kIG90aGVyIHN0b3JlcyBzY2FuIGl0IGluIGFzIGEgdG9tYnN0b25lXG4gICAgICAgICAgICB2b2lkIHRoaXMuc291cmNlc1tpXS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSB9KS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBCYWNrZ3JvdW5kIHdyaXRlIG9mICR7a2V5fSB0byBzeW5jIHNvdXJjZSAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGtleTogc3RyaW5nKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IG92ZXJsYXlFbnRyeSA9IHRoaXMub3ZlcmxheS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKG92ZXJsYXlFbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgd3JpdGVUaW1lOiBvdmVybGF5RW50cnkudCwgc2l6ZTogb3ZlcmxheUVudHJ5LmRhdGEubGVuZ3RoIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVudHJ5ID0gYXdhaXQgdGhpcy5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIGlmICghZW50cnkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlPzogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclJlcXVpcmVkU2NhbnMoKTtcbiAgICAgICAgbGV0IGluZm9zID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMubWVtKSB7XG4gICAgICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gVG9tYnN0b25lcyBhcmUgbWlzc2luZyBmaWxlcywgc28gbGlzdGluZ3MgaGlkZSB0aGVtXG4gICAgICAgICAgICBpZiAoZW50cnkuc2l6ZSA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBpbmZvcy5zZXQoa2V5LCB7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFtrZXksIG92ZXJsYXlFbnRyeV0gb2YgdGhpcy5vdmVybGF5KSB7XG4gICAgICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG92ZXJsYXlFbnRyeS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGluZm9zLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5mb3Muc2V0KGtleSwgeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IG92ZXJsYXlFbnRyeS50LCBzaXplOiBvdmVybGF5RW50cnkuZGF0YS5sZW5ndGggfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbGVzID0gYXBwbHlGaW5kSW5mb1NoYXBlKEFycmF5LmZyb20oaW5mb3MudmFsdWVzKCkpLCBwcmVmaXgsIGNvbmZpZyk7XG4gICAgICAgIHNvcnQoZmlsZXMsIHggPT4geC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cblxuICAgIC8vIEFsbCBmaWxlcyBjaGFuZ2VkIGFmdGVyIHRoZSBnaXZlbiB0aW1lIOKAlCBmYXN0LCBzdHJhaWdodCBmcm9tIHRoZSBpbi1tZW1vcnkgaW5kZXguIEZpbHRlcnMgb25cbiAgICAvLyB3aGVuIFdFIGxlYXJuZWQgb2YgdGhlIGNoYW5nZSAoY2hhbmdlZEF0KSwgc28gZmlsZXMgc3luY2hyb25pemVkIGxhdGUgKHdpdGggb2xkIHdyaXRlIHRpbWVzKVxuICAgIC8vIGFyZSBzdGlsbCByZXBvcnRlZC4gRGVsZXRpb25zIEFSRSByZXBvcnRlZCwgYXMgc2l6ZS0wIHRvbWJzdG9uZSBlbnRyaWVzIOKAlCB0aGF0J3MgaG93IHRoZXlcbiAgICAvLyBwcm9wYWdhdGUgdG8gc3RvcmVzIHN5bmNpbmcgZnJvbSB1cy5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyKHRpbWU6IG51bWJlcik6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclJlcXVpcmVkU2NhbnMoKTtcbiAgICAgICAgbGV0IGZpbGVzOiBBcmNoaXZlRmlsZUluZm9bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tZW0pIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5jaGFuZ2VkQXQgPD0gdGltZSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5LmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBba2V5LCBvdmVybGF5RW50cnldIG9mIHRoaXMub3ZlcmxheSkge1xuICAgICAgICAgICAgaWYgKG92ZXJsYXlFbnRyeS50IDw9IHRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogb3ZlcmxheUVudHJ5LnQsIHNpemU6IG92ZXJsYXlFbnRyeS5kYXRhLmxlbmd0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICBzb3J0KGZpbGVzLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBmaWxlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFsbFNjYW5zQ29tcGxldGU6IHRoaXMuc291cmNlU3RhdGVzLmV2ZXJ5KHggPT4geC5zY2FuQ29tcGxldGUpLFxuICAgICAgICAgICAgaW5kZXhTaXplOiB0aGlzLm1lbS5zaXplLFxuICAgICAgICAgICAgc291cmNlczogdGhpcy5zb3VyY2VzLm1hcCgoeCwgaSkgPT4gKHtcbiAgICAgICAgICAgICAgICBkZWJ1Z05hbWU6IHguc291cmNlLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgICAgIHZhbGlkV2luZG93OiB4LnZhbGlkV2luZG93LFxuICAgICAgICAgICAgICAgIHJvdXRlOiB4LnJvdXRlLFxuICAgICAgICAgICAgICAgIG5vRnVsbFN5bmM6IHgubm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogdGhpcy5zb3VyY2VTdGF0ZXNbaV0uc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIsXG4gICAgICAgICAgICAgICAgaW5pdGlhbFNjYW5Db21wbGV0ZTogdGhpcy5zb3VyY2VTdGF0ZXNbaV0uc2NhbkNvbXBsZXRlLFxuICAgICAgICAgICAgICAgIHNjYW5uZWRDb3VudDogdGhpcy5zb3VyY2VTdGF0ZXNbaV0uc2Nhbm5lZENvdW50LFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBsYXJnZSB1cGxvYWRzIOKUgOKUgFxuICAgIC8vIExhcmdlIHVwbG9hZHMgc3RyZWFtIG9udG8gdGhlIGxvY2FsIGRpc2sgc291cmNlIGRpcmVjdGx5ICh0aGV5IG1heSBub3QgZml0IGluIG1lbW9yeSlcblxuICAgIHByaXZhdGUgZ2V0RGlza1NvdXJjZSgpOiB7IGRpc2s6IEFyY2hpdmVzRGlzazsgc291cmNlSW5kZXg6IG51bWJlciB9IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnNvdXJjZXNbaV0uc291cmNlO1xuICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEFyY2hpdmVzRGlzaykgcmV0dXJuIHsgZGlzazogc291cmNlLCBzb3VyY2VJbmRleDogaSB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTGFyZ2UgdXBsb2FkcyByZXF1aXJlIGFuIEFyY2hpdmVzRGlzayBzb3VyY2UsIGFuZCB0aGlzIHN0b3JlIGhhcyBub25lIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHN0YXJ0TGFyZ2VVcGxvYWQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLnN0YXJ0TGFyZ2VVcGxvYWQoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGFwcGVuZExhcmdlVXBsb2FkKGlkOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmFwcGVuZExhcmdlVXBsb2FkKGlkLCBkYXRhKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmlzaExhcmdlVXBsb2FkKGlkOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IGRpc2ssIHNvdXJjZUluZGV4IH0gPSB0aGlzLmdldERpc2tTb3VyY2UoKTtcbiAgICAgICAgYXdhaXQgZGlzay5maW5pc2hMYXJnZVVwbG9hZChpZCwga2V5KTtcbiAgICAgICAgdGhpcy5vdmVybGF5LmRlbGV0ZShrZXkpO1xuICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IGRpc2suZ2V0SW5mbyhrZXkpO1xuICAgICAgICBpZiAoaW5mbykge1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGluZm8ud3JpdGVUaW1lLCBzaXplOiBpbmZvLnNpemUsIHNvdXJjZTogc291cmNlSW5kZXggfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGNhbmNlbExhcmdlVXBsb2FkKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5jYW5jZWxMYXJnZVVwbG9hZChpZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmbHVzaE92ZXJsYXkoZm9yY2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5vdmVybGF5KSB7XG4gICAgICAgICAgICBpZiAoIWZvcmNlICYmIGVudHJ5LmZsdXNoQXQgPiBub3cpIGNvbnRpbnVlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy53cml0ZVRvU291cmNlcyhrZXksIGVudHJ5LmRhdGEsIGVudHJ5LnQpO1xuICAgICAgICAgICAgLy8gT25seSByZW1vdmUgaWYgaXQgd2Fzbid0IG92ZXJ3cml0dGVuIHdoaWxlIHdlIHdlcmUgZmx1c2hpbmdcbiAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXkuZ2V0KGtleSkgPT09IGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5LmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVhZGVyRGlza0xpbWl0OiB0aGUgZGlzayBpcyBvbmx5IGEgYm91bmRlZCByZWFkIGNhY2hlLCBzbyBvbmNlIGl0IGV4Y2VlZHMgdGhlIGxpbWl0LCB0aGVcbiAgICAvLyBsZWFzdCByZWNlbnRseSB1c2VkIGZpbGVzIGFyZSBkZWxldGVkIGZyb20gaXQgLSBidXQgT05MWSB3aGVuIGFub3RoZXIgc291cmNlIHZlcmlmaWFibHlcbiAgICAvLyBob2xkcyBhIHNhbWUtb3ItbmV3ZXIgY29weSAodGhlIG9ubHkgY29weSBvZiBhIGZpbGUgaXMgbmV2ZXIgZGVsZXRlZCksIGFuZCB0aGUgaW5kZXggZW50cnlcbiAgICAvLyByZXBvaW50cyB0byB0aGF0IHNvdXJjZSBzbyByZWFkcyBrZWVwIHdvcmtpbmcgKHJlLWNhY2hpbmcgb24gdGhlIG5leHQgcmVhZCkuXG4gICAgcHJpdmF0ZSBldmljdGluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgYXN5bmMgZW5mb3JjZURpc2tMaW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGxpbWl0ID0gdGhpcy5jb25maWc/LnJlYWRlckRpc2tMaW1pdDtcbiAgICAgICAgaWYgKCFsaW1pdCB8fCB0aGlzLmV2aWN0aW5nKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnNvdXJjZUJ5dGVDb3VudHNbMF0gPD0gbGltaXQpIHJldHVybjtcbiAgICAgICAgdGhpcy5ldmljdGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgY2FuZGlkYXRlczogeyBrZXk6IHN0cmluZzsgZW50cnk6IEluZGV4RW50cnkgfVtdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tZW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlICE9PSAwIHx8IGVudHJ5LnNpemUgPT09IDAgfHwga2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaCh7IGtleSwgZW50cnkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb3J0KGNhbmRpZGF0ZXMsIHggPT4geC5lbnRyeS5sYXN0QWNjZXNzKTtcbiAgICAgICAgICAgIGZvciAobGV0IHsga2V5LCBlbnRyeSB9IG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VCeXRlQ291bnRzWzBdIDw9IGxpbWl0KSBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tZW0uZ2V0KGtleSkgIT09IGVudHJ5KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgaG9sZGVyOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvID0gYXdhaXQgdGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAmJiBpbmZvLndyaXRlVGltZSA+PSBlbnRyeS53cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgZG93biBzb3VyY2UganVzdCBjYW4ndCB2b3VjaCBmb3IgdGhpcyBmaWxlIHJpZ2h0IG5vd1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChob2xkZXIgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplLCBzb3VyY2U6IGhvbGRlciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuZXZpY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRvbWJzdG9uZXMgb25seSBuZWVkIHRvIGV4aXN0IGxvbmcgZW5vdWdoIGZvciBldmVyeSBzdG9yZSB0byBsZWFybiBvZiB0aGUgZGVsZXRpb247IGV4cGlyZWRcbiAgICAvLyBvbmVzIGNvbWUgb3V0IG9mIHRoZSBpbmRleC4gVGhlIHBoeXNpY2FsIGVtcHR5IGZpbGUgaXMgcmVtb3ZlZCBvbmx5IG9uIGJhY2tibGF6ZSBzb3VyY2VzOlxuICAgIC8vIHJlbW90ZSBzdG9yZXMgZXhwaXJlIHRoZWlyIG93biB0b21ic3RvbmVzIChhIGRlbCB0aGVyZSB3b3VsZCBqdXN0IG1pbnQgYSBmcmVzaCBvbmUpLCBhbmQgb3VyXG4gICAgLy8gb3duIGRpc2sgbmV2ZXIgc3RvcmVkIGFueXRoaW5nIGZvciBpdC5cbiAgICBwcml2YXRlIGFzeW5jIGNsZWFudXBUb21ic3RvbmVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgY3V0b2ZmID0gRGF0ZS5ub3coKSAtIFRPTUJTVE9ORV9FWFBJUlk7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLm1lbSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoZW50cnkuc2l6ZSAhPT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoZW50cnkud3JpdGVUaW1lID4gY3V0b2ZmKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgZm9yIChsZXQgc291cmNlRW50cnkgb2YgdGhpcy5zb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3aW5kb3dBY2NlcHRzV3JpdGVzKHNvdXJjZUVudHJ5LnZhbGlkV2luZG93KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZUVudHJ5LnNvdXJjZTtcbiAgICAgICAgICAgICAgICBpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBBcmNoaXZlc0JhY2tibGF6ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHZvaWQgc291cmNlLmRlbChrZXkpLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBSZW1vdmluZyBleHBpcmVkIHRvbWJzdG9uZSAke2tleX0gZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
872
- /* _JS_SOURCE_HASH = "b8a46cad13fce85d82a25625cfc6534f04920a8bbbd995330a8b1bb7babb3623"; */
872
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsMkRBQXNFO0FBQ3RFLG1EQUEwRTtBQUMxRSxrRUFBaUY7QUFDakYsNENBR3NCO0FBQ3RCLGtEQUFtRTtBQUNuRSw0Q0FBaUQ7QUFDakQsaURBQXVFO0FBQ3ZFLHdFQUF1RjtBQUN2RixvREFBOEY7QUFFOUYsNkZBQTZGO0FBQzdGLCtGQUErRjtBQUMvRiwwRkFBMEY7QUFDMUYsZ0ZBQWdGO0FBQ2hGLGlHQUFpRztBQUNqRywwRkFBMEY7QUFFN0UsUUFBQSx3QkFBd0IsR0FBRyxtQkFBWSxHQUFHLENBQUMsQ0FBQztBQUN6RCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLG1GQUFtRjtBQUNuRixNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDdkMsNkRBQTZEO0FBQzdELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN4QyxtRkFBbUY7QUFDbkYsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM1QywrRkFBK0Y7QUFDL0YsYUFBYTtBQUNiLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNyQyxzR0FBc0c7QUFDdEcsTUFBTSxvQkFBb0IsR0FBRyxtQkFBWSxDQUFDO0FBQzFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNuQyxrR0FBa0c7QUFDbEcsb0ZBQW9GO0FBQ3BGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNqRCxNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FB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SSxDQUFDLE9BQU8sQ0FBQyxJQUFJO2dCQUFFLE9BQU87WUFDOUIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUM7Z0JBQUUsU0FBUztZQUMvQixJQUFJLEtBQUssQ0FBQyxTQUFTLEdBQUcsTUFBTTtnQkFBRSxTQUFTO1lBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQixLQUFLLElBQUksV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLElBQUEsK0JBQW1CLEVBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztvQkFBRSxTQUFTO2dCQUM1RCxJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsQ0FBQyxNQUFNLFlBQVksNkJBQWlCLENBQUM7b0JBQUUsU0FBUztnQkFDckQsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQVEsRUFBRSxFQUFFOztvQkFDcEMsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxTQUFTLE1BQU0sQ0FBQyxZQUFZLEVBQUUsWUFBWSxNQUFBLENBQUMsQ0FBQyxLQUFLLG1DQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdHLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0NBQ0o7QUF4eEJELDhCQXd4QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCwgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgdGltZUluTWludXRlLCBzb3J0LCBwcm9taXNlT2JqIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyLCBmb3JtYXRUaW1lIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7XG4gICAgSUFyY2hpdmVzLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzU291cmNlLCBBcmNoaXZlc1N5bmNTdGF0dXMsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLFxuICAgIHdpbmRvd0FjY2VwdHNXcml0ZXMsIFN5bmNBY3Rpdml0eSxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNEaXNrLCBhcHBseUZpbmRJbmZvU2hhcGUgfSBmcm9tIFwiLi4vQXJjaGl2ZXNEaXNrXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0JhY2tibGF6ZSB9IGZyb20gXCIuLi9iYWNrYmxhemVcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IEJ1bGtEYXRhYmFzZUJhc2UsIG5vb3BSZWFjdGl2ZURlcHMgfSBmcm9tIFwiLi4vQnVsa0RhdGFiYXNlMi9CdWxrRGF0YWJhc2VCYXNlXCI7XG5pbXBvcnQgeyB3cmFwSGFuZGxlLCBOb2RlSlNEaXJlY3RvcnlIYW5kbGVXcmFwcGVyLCBEaXJlY3RvcnlXcmFwcGVyIH0gZnJvbSBcIi4uL0ZpbGVGb2xkZXJBUElcIjtcblxuLy8gVGhlIHN0b3JhZ2UgZW5naW5lIG9mIHRoZSByZW1vdGUgc3RvcmFnZSBzZXJ2ZXIuIERhdGEgbGl2ZXMgaW4gc3luY2hyb25pemF0aW9uIHNvdXJjZXMgKGF0XG4vLyBtaW5pbXVtIGFuIEFyY2hpdmVzRGlzaywgdGhlIGxvY2FsIGRpc2spOyBCbG9iU3RvcmUga2VlcHMgYW4gaW5kZXggb2YgZXZlcnkgZmlsZSAocGF0aCwgbGFzdFxuLy8gbW9kaWZpZWQgdGltZSwgc2l6ZSwgYW5kIHdoaWNoIHNvdXJjZSBjdXJyZW50bHkgaG9sZHMgdGhlIGRhdGEpIGluIGEgQnVsa0RhdGFiYXNlMiwgYW5kXG4vLyBzeW5jaHJvbml6ZXMgdGhlIGluZGV4IGZyb20gYWxsIHNvdXJjZXMgKHNlZSBBcmNoaXZlc1NvdXJjZSBpbiBJQXJjaGl2ZXMudHMpLlxuLy8gRXZlcnkgc3RhcnR1cCBmdWxseSByZXNjYW5zIGVhY2ggc291cmNlJ3MgbWV0YWRhdGEsIHNvIHRoZSBpbmRleCBzZWxmLWhlYWxzOyB0aGUgZmlsZSB3aXRoIHRoZVxuLy8gaGlnaGVzdCB3cml0ZSB0aW1lIHdpbnMgYWNyb3NzIGFsbCBzb3VyY2VzLCBzbyBtdWx0aXBsZSBzb3VyY2VzIG5lZWQgbm8gc3RhY2tpbmcgb3JkZXIuXG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZBU1RfV1JJVEVfREVMQVkgPSB0aW1lSW5NaW51dGUgKiA1O1xuY29uc3QgRkFTVF9GTFVTSF9QT0xMID0gMTAwMCAqIDE1O1xuLy8gSW5kZXggY2hhbmdlcyBhcmUgYnVmZmVyZWQgaW4gbWVtb3J5IGFuZCB3cml0dGVuIHRvIHRoZSBCdWxrRGF0YWJhc2UyIGluIGJhdGNoZXNcbmNvbnN0IElOREVYX0ZMVVNIX0lOVEVSVkFMID0gMTAwMCAqIDMwO1xuLy8gU291cmNlcyB0aGF0IHN1cHBvcnQgZ2V0Q2hhbmdlc0FmdGVyIGFyZSBwb2xsZWQgdGhpcyBvZnRlblxuY29uc3QgQ0hBTkdFU19QT0xMX0lOVEVSVkFMID0gMTAwMCAqIDYwO1xuLy8gU291cmNlcyB0aGF0IGRvbid0IHN1cHBvcnQgZ2V0Q2hhbmdlc0FmdGVyIGdldCBhIGZ1bGwgbWV0YWRhdGEgcmVzY2FuIHRoaXMgb2Z0ZW5cbmNvbnN0IEZVTExfUkVTQ0FOX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjA7XG4vLyBPbiBhIHJlcXVlc3QgZm9yIGEgZmlsZSB0aGUgaW5kZXggZG9lc24ndCBrbm93LCBjaGFuZ2VzLWFmdGVyIHNvdXJjZXMgYXJlIHJlLXBvbGxlZCwgYXQgbW9zdFxuLy8gdGhpcyBvZnRlblxuY29uc3QgTUlTU19DSEVDS19JTlRFUlZBTCA9IDEwMDAgKiA1O1xuLy8gQ2hhbmdlIHBvbGxzIHJlLXJlcXVlc3QgdGhpcyBtdWNoIG92ZXJsYXAsIHNvIGNsb2NrIHNrZXcgYmV0d2VlbiB1cyBhbmQgYSBzb3VyY2UgY2FuJ3QgZHJvcCBjaGFuZ2VzXG5jb25zdCBDSEFOR0VTX1BPTExfT1ZFUkxBUCA9IHRpbWVJbk1pbnV0ZTtcbmNvbnN0IFNDQU5fUkVUUllfREVMQVkgPSAxMDAwICogMzA7XG4vLyBEZWxldGVzIGFyZSB0b21ic3RvbmVzIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKTogdGhlIHNpemUtMCBpbmRleCBlbnRyeSBpcyB3aGF0IGxldHMgYVxuLy8gZGVsZXRpb24gcHJvcGFnYXRlL3JlY29uY2lsZSBsaWtlIGFueSBvdGhlciB3cml0ZSwgYW5kIGl0IGV4cGlyZXMgYWZ0ZXIgdGhpcyBsb25nXG5jb25zdCBUT01CU1RPTkVfRVhQSVJZID0gMTAwMCAqIDYwICogNjAgKiAyNCAqIDc7XG5jb25zdCBUT01CU1RPTkVfQ0xFQU5VUF9JTlRFUlZBTCA9IDEwMDAgKiA2MCAqIDYwO1xuLy8gV2hpbGUgYSBtZXRhZGF0YSBzY2FuIG9yIGZ1bGwgc3luYyBpcyBydW5uaW5nLCBpdHMgcHJvZ3Jlc3MgaXMgbG9nZ2VkIHRoaXMgb2Z0ZW5cbmNvbnN0IFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMID0gMTAwMCAqIDYwO1xuY29uc3QgRElTS19MSU1JVF9DSEVDS19JTlRFUlZBTCA9IDEwMDAgKiA2MDtcbi8vIEZ1bGwgc3luY3MgZG93bmxvYWQgdGhpcyBtYW55IGZpbGVzIGNvbmN1cnJlbnRseSAoaGlnaC1sYXRlbmN5IHNvdXJjZXMgbGlrZSBiYWNrYmxhemUgd291bGRcbi8vIG90aGVyd2lzZSBjcmF3bCBvbmUgcm91bmQtdHJpcCBhdCBhIHRpbWUpXG5jb25zdCBGVUxMX1NZTkNfUEFSQUxMRUwgPSA4O1xuLy8gQSBmdWxsIHN5bmMgcnVubmluZyBsb25nZXIgdGhhbiB0aGlzIGlzIGNvbnNvbGUuZXJyb3JlZCAoYW5kIGFnYWluIGV2ZXJ5IGludGVydmFsIGFmdGVyKSwgc28gYVxuLy8gc3luYyB0aGF0IHdpbGwgdGFrZSBkYXlzIGlzIGxvdWQgaW5zdGVhZCBvZiBhIHF1aWV0IGNvbnNvbGUubG9nIGV2ZXJ5IG1pbnV0ZVxuY29uc3QgRlVMTF9TWU5DX1NMT1dfRVJST1JfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MDtcblxuZXhwb3J0IHR5cGUgV3JpdGVDb25maWcgPSB7XG4gICAgLy8gUmVzb2x2ZSBvbmNlIHRoZSB3cml0ZSBpcyBpbiBtZW1vcnk7IGZsdXNoIHRvIHRoZSBzb3VyY2VzIGFmdGVyIHdyaXRlRGVsYXksIGNvYWxlc2NpbmdcbiAgICAvLyB3cml0ZXMgdG8gdGhlIHNhbWUga2V5IChvbmx5IHRoZSBsYXRlc3QgaXMgd3JpdHRlbikuIERhdGEgaXMgbG9zdCBpZiB0aGUgcHJvY2VzcyBjcmFzaGVzIGZpcnN0LlxuICAgIGZhc3Q/OiBib29sZWFuO1xuICAgIHdyaXRlRGVsYXk/OiBudW1iZXI7XG4gICAgLy8gU3RhbXBzIHRoZSB3cml0ZSB3aXRoIHRoaXMgbGFzdC13cml0ZSB0aW1lIGluc3RlYWQgb2Ygbm93LiBPbGRlciB0aGFuIHRoZSBjdXJyZW50IGZpbGUnc1xuICAgIC8vIHRpbWUgbm8tb3BzOyBtb3JlIHRoYW4gMTUgbWludXRlcyBpbiB0aGUgZnV0dXJlIHRocm93cy4gU2VlIElBcmNoaXZlcy5zZXQuXG4gICAgbGFzdE1vZGlmaWVkPzogbnVtYmVyO1xufTtcblxuLy8gV2hhdCB0aGUgc3RvcmFnZSBzZXJ2ZXIgbmVlZHMgZnJvbSBhIGJ1Y2tldCdzIHN0b3JlLiBCbG9iU3RvcmUgaW1wbGVtZW50cyBpdCBmdWxseTsgQXJjaGl2ZXNEaXNrXG4vLyBhbHNvIHNhdGlzZmllcyBpdCAodXNlZCBkaXJlY3RseSBmb3IgcmF3RGlzayBidWNrZXRzKSwgbWludXMgdGhlIG9wdGlvbmFsIGluZGV4LWJhY2tlZCBtZXRob2RzLlxuZXhwb3J0IHR5cGUgSUJ1Y2tldFN0b3JlID0ge1xuICAgIGdldChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD47XG4gICAgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+O1xuICAgIHNldChmaWxlTmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFdyaXRlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgIGRlbChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBXcml0ZUNvbmZpZyk6IFByb21pc2U8dm9pZD47XG4gICAgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD47XG4gICAgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU/OiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT47XG4gICAgZ2V0Q2hhbmdlc0FmdGVyPyh0aW1lOiBudW1iZXIpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPjtcbiAgICBnZXRTeW5jU3RhdHVzPygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz47XG4gICAgZ2V0U3luY1Byb2dyZXNzPygpOiB7XG4gICAgICAgIGluZGV4OiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9O1xuICAgICAgICBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdO1xuICAgICAgICByZWFkZXJEaXNrTGltaXQ/OiBudW1iZXI7XG4gICAgICAgIHN5bmNpbmc6IFN5bmNBY3Rpdml0eVtdO1xuICAgIH07XG4gICAgY29tcHV0ZUluZGV4VG90YWxzPygpOiBQcm9taXNlPHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0+O1xuICAgIHN0YXJ0TGFyZ2VVcGxvYWQoKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgIGFwcGVuZExhcmdlVXBsb2FkKGlkOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD47XG4gICAgZmluaXNoTGFyZ2VVcGxvYWQoaWQ6IHN0cmluZywga2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGNhbmNlbExhcmdlVXBsb2FkKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufTtcblxudHlwZSBPdmVybGF5RW50cnkgPSB7XG4gICAgLy8gQSB6ZXJvLWxlbmd0aCBidWZmZXIgaXMgYSBwZW5kaW5nIGRlbGV0ZSAodG9tYnN0b25lKVxuICAgIGRhdGE6IEJ1ZmZlcjtcbiAgICB0OiBudW1iZXI7XG4gICAgZmx1c2hBdDogbnVtYmVyO1xufTtcblxuLy8gT25lIHJvdyBvZiB0aGUgQnVsa0RhdGFiYXNlMiBpbmRleCAoa2V5IGlzIHRoZSBmaWxlIHBhdGgpXG50eXBlIEJsb2JJbmRleEVudHJ5ID0ge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHdyaXRlVGltZTogbnVtYmVyO1xuICAgIHNpemU6IG51bWJlcjtcbiAgICAvLyBXaGljaCBzeW5jaHJvbml6YXRpb24gc291cmNlIGN1cnJlbnRseSBob2xkcyB0aGUgZGF0YSAoYW4gaW5kZXggaW50byB0aGUgc291cmNlcyBhcnJheSlcbiAgICBzb3VyY2U6IG51bWJlcjtcbn07XG50eXBlIEluZGV4RW50cnkgPSB7XG4gICAgd3JpdGVUaW1lOiBudW1iZXI7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIHNvdXJjZTogbnVtYmVyO1xuICAgIC8vIFdoZW4gV0UgbGFzdCBjaGFuZ2VkIHRoaXMgZW50cnkgKG5vdCB0aGUgZmlsZSdzIHdyaXRlIHRpbWUpIOKAlCB3aGF0IGdldENoYW5nZXNBZnRlciBmaWx0ZXJzXG4gICAgLy8gb24sIHNvIGxhdGUtYXJyaXZpbmcgZmlsZXMgd2l0aCBvbGQgd3JpdGUgdGltZXMgYXJlIHN0aWxsIHJlcG9ydGVkIGFzIGNoYW5nZXNcbiAgICBjaGFuZ2VkQXQ6IG51bWJlcjtcbiAgICAvLyBJbi1tZW1vcnkgb25seSAobm90IHBlcnNpc3RlZCk6IHdoZW4gdGhlIGZpbGUgd2FzIGxhc3Qgc2VydmVkLCBmb3IgcmVhZGVyRGlza0xpbWl0J3MgTFJVXG4gICAgLy8gZXZpY3Rpb24uIFN0YXJ0cyBhcyBjaGFuZ2VkQXQgb24gbG9hZC5cbiAgICBsYXN0QWNjZXNzOiBudW1iZXI7XG59O1xuXG50eXBlIFNvdXJjZVN0YXRlID0ge1xuICAgIHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiBib29sZWFuO1xuICAgIGluaXRpYWxTY2FuOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9taXNlT2JqPjtcbiAgICBzY2FuQ29tcGxldGU6IGJvb2xlYW47XG4gICAgLy8gRmlsZXMgc2VlbiBpbiB0aGlzIHNvdXJjZSdzIHNjYW5zIC8gY2hhbmdlIHBvbGxzIHNvIGZhclxuICAgIHNjYW5uZWRDb3VudDogbnVtYmVyO1xuICAgIC8vIFdhdGVybWFyayBmb3IgZ2V0Q2hhbmdlc0FmdGVyIHBvbGxzXG4gICAgY2hhbmdlc0FmdGVyVGltZTogbnVtYmVyO1xuICAgIGxhc3RNaXNzQ2hlY2s6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjbGFzcyBCbG9iU3RvcmUgaW1wbGVtZW50cyBJQnVja2V0U3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGZvbGRlcjogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIHNvdXJjZXM6IEFyY2hpdmVzU291cmNlW10sXG4gICAgICAgIHByaXZhdGUgY29uZmlnPzoge1xuICAgICAgICAgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIGEga2V5J3MgaW5kZXggZW50cnkgY2hhbmdlcyAob3VyIG93biB3cml0ZXMgQU5EIGZpbGVzIHB1bGxlZCBpbiB2aWFcbiAgICAgICAgICAgIC8vIHN5bmNocm9uaXphdGlvbikg4oCUIGhvdyB0aGUgc3RvcmFnZSBzZXJ2ZXIgbm90aWNlcyByb3V0aW5nIGNvbmZpZyB1cGRhdGVzLlxuICAgICAgICAgICAgb25JbmRleENoYW5nZWQ/OiAoa2V5OiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgICAgICAgICAvLyBMUlUtYm91bmQgdGhlIGRpc2sgKGJhc2Ugc291cmNlKSB0byB0aGlzIG1hbnkgYnl0ZXM7IHNlZSBDb21tb25Db25maWcucmVhZGVyRGlza0xpbWl0XG4gICAgICAgICAgICByZWFkZXJEaXNrTGltaXQ/OiBudW1iZXI7XG4gICAgICAgICAgICAvLyBEZXBsb3kgdGFrZW92ZXI6IGZhc3Qtd3JpdGUgZmx1c2ggZGVsYXlzIG5ldmVyIGV4dGVuZCBwYXN0IHRoaXMgdGltZSwgYW5kIGFmdGVyIGl0XG4gICAgICAgICAgICAvLyBmYXN0IHdyaXRlcyBmbHVzaCBpbW1lZGlhdGVseSAobm90aGluZyBtYXkgc2l0IGluIG1lbW9yeSB3aGVuIHRoZSB3cml0ZSB3aW5kb3dcbiAgICAgICAgICAgIC8vIHRyYW5zZmVycyB0byB0aGUgc3VjY2Vzc29yIHByb2Nlc3MpXG4gICAgICAgICAgICBnZXRGbHVzaERlYWRsaW5lPzogKCkgPT4gbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgKSB7IH1cblxuICAgIHByaXZhdGUgc3RvcHBlZCA9IHsgc3RvcDogZmFsc2UgfTtcblxuICAgIC8vIFRoZSBpbmRleCdzIEJ1bGtEYXRhYmFzZTIgZmlsZXMgbGl2ZSB1bmRlciA8Zm9sZGVyPi9pbmRleFxuICAgIHByaXZhdGUgaW5kZXggPSBuZXcgQnVsa0RhdGFiYXNlQmFzZTxCbG9iSW5kZXhFbnRyeT4oXCJibG9iSW5kZXhcIiwgbm9vcFJlYWN0aXZlRGVwcywgYXN5bmMgKHA6IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgYmFzZTogRGlyZWN0b3J5V3JhcHBlciA9IG5ldyBOb2RlSlNEaXJlY3RvcnlIYW5kbGVXcmFwcGVyKHBhdGguam9pbih0aGlzLmZvbGRlciwgXCJpbmRleFwiKSk7XG4gICAgICAgIGZvciAobGV0IHBhcnQgb2YgcC5zcGxpdChcIi9cIikpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0KSBiYXNlID0gYXdhaXQgYmFzZS5nZXREaXJlY3RvcnlIYW5kbGUocGFydCwgeyBjcmVhdGU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyYXBIYW5kbGUoYmFzZSk7XG4gICAgfSk7XG4gICAgLy8gVGhlIGluLW1lbW9yeSBjb3B5IG9mIHRoZSBpbmRleC4gQWxsIHJlYWRzIGFyZSBzZXJ2ZWQgZnJvbSBpdDsgY2hhbmdlcyBhcmUgYnVmZmVyZWQgaW5cbiAgICAvLyBkaXJ0eSBhbmQgZmx1c2hlZCB0byB0aGUgQnVsa0RhdGFiYXNlMiBpbiBiYXRjaGVzICh1bmRlZmluZWQgPSBkZWxldGUpLlxuICAgIHByaXZhdGUgbWVtID0gbmV3IE1hcDxzdHJpbmcsIEluZGV4RW50cnk+KCk7XG4gICAgLy8gTGl2ZSB0b3RhbHMgb3ZlciBtZW0gKHRvbWJzdG9uZXMgZXhjbHVkZWQpLCBhZGp1c3RlZCBvbiBldmVyeSBtdXRhdGlvbiBhbmQgcmVjb21wdXRlZCBvblxuICAgIC8vIGxvYWQgLSBzbyBhbnkgZHJpZnQgaGVhbHMgb24gcmVzdGFydC4gY29tcHV0ZUluZGV4VG90YWxzIGdpdmVzIHRoZSB3YWxrLXRoZS1pbmRleCB0cnV0aC5cbiAgICBwcml2YXRlIGluZGV4RmlsZUNvdW50ID0gMDtcbiAgICBwcml2YXRlIGluZGV4Qnl0ZUNvdW50ID0gMDtcbiAgICAvLyBUaGUgc2FtZSB0b3RhbHMgcGVyIGhvbGRpbmcgc291cmNlIChpbmRleCAwID0gb3VyIGRpc2ssIHdoaWNoIHJlYWRlckRpc2tMaW1pdCBib3VuZHMpXG4gICAgcHJpdmF0ZSBzb3VyY2VGaWxlQ291bnRzID0gdGhpcy5zb3VyY2VzLm1hcCgoKSA9PiAwKTtcbiAgICBwcml2YXRlIHNvdXJjZUJ5dGVDb3VudHMgPSB0aGlzLnNvdXJjZXMubWFwKCgpID0+IDApO1xuICAgIC8vIEJhY2tncm91bmQgc2NhbnMgLyBmdWxsIHN5bmNzIGN1cnJlbnRseSBpbiBwcm9ncmVzcyAoYSBTZXQgLSBvbmUgc291cmNlIGNhbiBoYXZlIGEgY2hhbmdlXG4gICAgLy8gcG9sbCdzIGZ1bGwgc3luYyBhbmQgYSByZXNjYW4gb3ZlcmxhcHBpbmcpXG4gICAgcHJpdmF0ZSBzeW5jQWN0aXZpdGllcyA9IG5ldyBTZXQ8U3luY0FjdGl2aXR5PigpO1xuICAgIHByaXZhdGUgZGlydHkgPSBuZXcgTWFwPHN0cmluZywgSW5kZXhFbnRyeSB8IHVuZGVmaW5lZD4oKTtcbiAgICBwcml2YXRlIG92ZXJsYXkgPSBuZXcgTWFwPHN0cmluZywgT3ZlcmxheUVudHJ5PigpO1xuICAgIHByaXZhdGUgc291cmNlU3RhdGVzID0gdGhpcy5zb3VyY2VzLm1hcCgoKTogU291cmNlU3RhdGUgPT4gKHtcbiAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IGZhbHNlLFxuICAgICAgICBpbml0aWFsU2NhbjogcHJvbWlzZU9iaigpLFxuICAgICAgICBzY2FuQ29tcGxldGU6IGZhbHNlLFxuICAgICAgICBzY2FubmVkQ291bnQ6IDAsXG4gICAgICAgIGNoYW5nZXNBZnRlclRpbWU6IDAsXG4gICAgICAgIGxhc3RNaXNzQ2hlY2s6IDAsXG4gICAgfSkpO1xuXG4gICAgcHVibGljIGluaXQgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkSW5kZXgoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5ydW5Tb3VyY2VTeW5jKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChGQVNUX0ZMVVNIX1BPTEwsICgpID0+IHRoaXMuZmx1c2hPdmVybGF5KCksIHRoaXMuc3RvcHBlZCk7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChJTkRFWF9GTFVTSF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5mbHVzaEluZGV4KCksIHRoaXMuc3RvcHBlZCk7XG4gICAgICAgIHJ1bkluZmluaXRlUG9sbChUT01CU1RPTkVfQ0xFQU5VUF9JTlRFUlZBTCwgKCkgPT4gdGhpcy5jbGVhbnVwVG9tYnN0b25lcygpLCB0aGlzLnN0b3BwZWQpO1xuICAgICAgICBpZiAodGhpcy5jb25maWc/LnJlYWRlckRpc2tMaW1pdCkge1xuICAgICAgICAgICAgcnVuSW5maW5pdGVQb2xsKERJU0tfTElNSVRfQ0hFQ0tfSU5URVJWQUwsICgpID0+IHRoaXMuZW5mb3JjZURpc2tMaW1pdCgpLCB0aGlzLnN0b3BwZWQpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTdG9wcyBhbGwgc3luY2hyb25pemF0aW9uIHNjYW5zL3BvbGxzIGFuZCBmbHVzaGVzIHBlbmRpbmcgd3JpdGVzLiBVc2VkIHdoZW4gYSBidWNrZXQnc1xuICAgIC8vIHJvdXRpbmcgY29uZmlnIGNoYW5nZXMgYW5kIHRoZSBzdG9yZSBpcyByZWJ1aWx0IHdpdGggbmV3IHNvdXJjZXMuXG4gICAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc3RvcHBlZC5zdG9wID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5mbHVzaE92ZXJsYXkodHJ1ZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZmx1c2hJbmRleCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZEluZGV4KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgW3dyaXRlVGltZXMsIHNpemVzLCBzb3VyY2VzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuaW5kZXguZ2V0Q29sdW1uKFwid3JpdGVUaW1lXCIpLFxuICAgICAgICAgICAgdGhpcy5pbmRleC5nZXRDb2x1bW4oXCJzaXplXCIpLFxuICAgICAgICAgICAgdGhpcy5pbmRleC5nZXRDb2x1bW4oXCJzb3VyY2VcIiksXG4gICAgICAgIF0pO1xuICAgICAgICBsZXQgc2l6ZU1hcCA9IG5ldyBNYXAoc2l6ZXMubWFwKHggPT4gW3gua2V5LCB4LnZhbHVlXSkpO1xuICAgICAgICBsZXQgc291cmNlTWFwID0gbmV3IE1hcChzb3VyY2VzLm1hcCh4ID0+IFt4LmtleSwgeC52YWx1ZV0pKTtcbiAgICAgICAgZm9yIChsZXQgZW50cnkgb2Ygd3JpdGVUaW1lcykge1xuICAgICAgICAgICAgbGV0IHNpemUgPSBzaXplTWFwLmdldChlbnRyeS5rZXkpO1xuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZU1hcC5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgICAgIC8vIEV4cGxpY2l0IGNoZWNrcywgYXMgMCBpcyBhIHZhbGlkIHNpemUgYW5kIGEgdmFsaWQgc291cmNlIG51bWJlclxuICAgICAgICAgICAgaWYgKHNpemUgPT09IHVuZGVmaW5lZCB8fCBzb3VyY2UgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgZnVsbDogSW5kZXhFbnRyeSA9IHsgd3JpdGVUaW1lOiBlbnRyeS52YWx1ZSwgc2l6ZSwgc291cmNlLCBjaGFuZ2VkQXQ6IGVudHJ5LnRpbWUsIGxhc3RBY2Nlc3M6IGVudHJ5LnRpbWUgfTtcbiAgICAgICAgICAgIHRoaXMubWVtLnNldChlbnRyeS5rZXksIGZ1bGwpO1xuICAgICAgICAgICAgdGhpcy5jb3VudEVudHJ5KGZ1bGwsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb3VudEVudHJ5KGVudHJ5OiBJbmRleEVudHJ5IHwgdW5kZWZpbmVkLCBkaXJlY3Rpb246IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIWVudHJ5IHx8IGVudHJ5LnNpemUgPT09IDApIHJldHVybjtcbiAgICAgICAgdGhpcy5pbmRleEZpbGVDb3VudCArPSBkaXJlY3Rpb247XG4gICAgICAgIHRoaXMuaW5kZXhCeXRlQ291bnQgKz0gZW50cnkuc2l6ZSAqIGRpcmVjdGlvbjtcbiAgICAgICAgLy8gQSBzdGFsZSBlbnRyeSBjYW4gcmVmZXJlbmNlIGEgc291cmNlIHRoYXQgbm8gbG9uZ2VyIGV4aXN0cyAoZ2V0SW5kZXhFbnRyeSBjbGVhbnMgdGhvc2UpXG4gICAgICAgIGlmICh0aGlzLnNvdXJjZXNbZW50cnkuc291cmNlXSkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VGaWxlQ291bnRzW2VudHJ5LnNvdXJjZV0gKz0gZGlyZWN0aW9uO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VCeXRlQ291bnRzW2VudHJ5LnNvdXJjZV0gKz0gZW50cnkuc2l6ZSAqIGRpcmVjdGlvbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0SW5kZXhFbnRyeShrZXk6IHN0cmluZywgZW50cnk6IHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgc291cmNlOiBudW1iZXIgfSk6IHZvaWQge1xuICAgICAgICBsZXQgZnVsbDogSW5kZXhFbnRyeSA9IHsgLi4uZW50cnksIGNoYW5nZWRBdDogRGF0ZS5ub3coKSwgbGFzdEFjY2VzczogRGF0ZS5ub3coKSB9O1xuICAgICAgICB0aGlzLmNvdW50RW50cnkodGhpcy5tZW0uZ2V0KGtleSksIC0xKTtcbiAgICAgICAgdGhpcy5jb3VudEVudHJ5KGZ1bGwsIDEpO1xuICAgICAgICB0aGlzLm1lbS5zZXQoa2V5LCBmdWxsKTtcbiAgICAgICAgdGhpcy5kaXJ0eS5zZXQoa2V5LCBmdWxsKTtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uSW5kZXhDaGFuZ2VkPy4oa2V5KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBkZWxldGVJbmRleEVudHJ5KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMubWVtLmdldChrZXkpO1xuICAgICAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm47XG4gICAgICAgIHRoaXMuY291bnRFbnRyeShleGlzdGluZywgLTEpO1xuICAgICAgICB0aGlzLm1lbS5kZWxldGUoa2V5KTtcbiAgICAgICAgdGhpcy5kaXJ0eS5zZXQoa2V5LCB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8qKiBSZXNjYW5zIG91ciBvd24gZGlzaydzIG1ldGFkYXRhIGludG8gdGhlIGluZGV4IC0gdXNlZCBhcm91bmQgZGVwbG95IHN3aXRjaG92ZXJzLCB3aGVyZSB0aGVcbiAgICAgKiAgb3RoZXIgcHJvY2VzcyB3cm90ZSBmaWxlcyB0byB0aGUgc2hhcmVkIGZvbGRlciB0aGF0IG91ciBpbmRleCBoYXNuJ3Qgc2Vlbi4gKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVzY2FuQmFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2NhblNvdXJjZSgwKTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGNoZWFwIGFsd2F5cy1jdXJyZW50IHRvdGFscyBwbHVzIGFueSBpbi1wcm9ncmVzcyBiYWNrZ3JvdW5kIHN5bmNocm9uaXphdGlvbi4gKi9cbiAgICBwdWJsaWMgZ2V0U3luY1Byb2dyZXNzKCk6IHtcbiAgICAgICAgaW5kZXg6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH07XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICAgICAgc3luY2luZzogU3luY0FjdGl2aXR5W107XG4gICAgfSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRleDogeyBmaWxlQ291bnQ6IHRoaXMuaW5kZXhGaWxlQ291bnQsIGJ5dGVDb3VudDogdGhpcy5pbmRleEJ5dGVDb3VudCB9LFxuICAgICAgICAgICAgc291cmNlczogdGhpcy5zb3VyY2VzLm1hcCgoeCwgaSkgPT4gKHtcbiAgICAgICAgICAgICAgICBkZWJ1Z05hbWU6IHguc291cmNlLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgICAgIGZpbGVDb3VudDogdGhpcy5zb3VyY2VGaWxlQ291bnRzW2ldLFxuICAgICAgICAgICAgICAgIGJ5dGVDb3VudDogdGhpcy5zb3VyY2VCeXRlQ291bnRzW2ldLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgcmVhZGVyRGlza0xpbWl0OiB0aGlzLmNvbmZpZz8ucmVhZGVyRGlza0xpbWl0LFxuICAgICAgICAgICAgc3luY2luZzogWy4uLnRoaXMuc3luY0FjdGl2aXRpZXNdLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBXYWxrcyB0aGUgd2hvbGUgaW5kZXggZm9yIGV4YWN0IHRvdGFscyAtIG1vcmUgZXhwZW5zaXZlIHRoYW4gZ2V0U3luY1Byb2dyZXNzLCBidXQgaW1tdW5lIHRvXG4gICAgICogIGFueSBkcmlmdCBpbiB0aGUgbWFpbnRhaW5lZCBjb3VudGVycyAoYW5kIGxvYWRzIHRoZSBpbmRleCBmaXJzdCwgc28gaXQncyBuZXZlciBjb2xkIHplcm9zKS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgY29tcHV0ZUluZGV4VG90YWxzKCk6IFByb21pc2U8e1xuICAgICAgICBmaWxlQ291bnQ6IG51bWJlcjtcbiAgICAgICAgYnl0ZUNvdW50OiBudW1iZXI7XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgfT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGZpbGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBieXRlQ291bnQgPSAwO1xuICAgICAgICBsZXQgc291cmNlcyA9IHRoaXMuc291cmNlcy5tYXAoeCA9PiAoeyBkZWJ1Z05hbWU6IHguc291cmNlLmdldERlYnVnTmFtZSgpLCBmaWxlQ291bnQ6IDAsIGJ5dGVDb3VudDogMCB9KSk7XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHRoaXMubWVtLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuc2l6ZSA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBmaWxlQ291bnQrKztcbiAgICAgICAgICAgIGJ5dGVDb3VudCArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZXNbZW50cnkuc291cmNlXTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2UuZmlsZUNvdW50Kys7XG4gICAgICAgICAgICAgICAgc291cmNlLmJ5dGVDb3VudCArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZpbGVDb3VudCwgYnl0ZUNvdW50LCBzb3VyY2VzIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmbHVzaEluZGV4KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuZGlydHkuc2l6ZSkgcmV0dXJuO1xuICAgICAgICBsZXQgZGlydHkgPSB0aGlzLmRpcnR5O1xuICAgICAgICB0aGlzLmRpcnR5ID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgd3JpdGVzOiBCbG9iSW5kZXhFbnRyeVtdID0gW107XG4gICAgICAgIGxldCBkZWxldGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgZGlydHkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIHdyaXRlcy5wdXNoKHsga2V5LCB3cml0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSwgc291cmNlOiBlbnRyeS5zb3VyY2UgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlbGV0ZXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh3cml0ZXMubGVuZ3RoKSBhd2FpdCB0aGlzLmluZGV4LndyaXRlQmF0Y2god3JpdGVzKTtcbiAgICAgICAgaWYgKGRlbGV0ZXMubGVuZ3RoKSBhd2FpdCB0aGlzLmluZGV4LmRlbGV0ZUJhdGNoKGRlbGV0ZXMpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBzeW5jaHJvbml6YXRpb24g4pSA4pSAXG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1blNvdXJjZVN5bmMoc291cmNlSW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBzb3VyY2UsIG5vRnVsbFN5bmMgfSA9IHRoaXMuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc291cmNlU3RhdGVzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgbGV0IGxpc3Rpbmc6IE1hcDxzdHJpbmcsIG51bWJlcj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIHdoaWxlICghdGhpcy5zdG9wcGVkLnN0b3ApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IGF3YWl0IHNvdXJjZS5nZXRDb25maWcoKTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5zdXBwb3J0c0NoYW5nZXNBZnRlciA9ICEhKGNvbmZpZy5zdXBwb3J0c0NoYW5nZXNBZnRlciAmJiBzb3VyY2UuZ2V0Q2hhbmdlc0FmdGVyKTtcbiAgICAgICAgICAgICAgICBsaXN0aW5nID0gYXdhaXQgdGhpcy5zY2FuU291cmNlKHNvdXJjZUluZGV4KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBJbml0aWFsIHNjYW4gb2Ygc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZCwgcmV0cnlpbmc6YCwgZSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsYXkoU0NBTl9SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuc2NhbkNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUuaW5pdGlhbFNjYW4ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICBpZiAodGhpcy5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgaWYgKGxpc3RpbmcpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjb25jaWxlU291cmNlKHNvdXJjZUluZGV4LCBsaXN0aW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5vRnVsbFN5bmMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb3B5U291cmNlRmlsZXMoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENvcHlpbmcgZmlsZXMgZnJvbSBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmFpbGVkOmAsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5zdXBwb3J0c0NoYW5nZXNBZnRlcikge1xuICAgICAgICAgICAgcnVuSW5maW5pdGVQb2xsKENIQU5HRVNfUE9MTF9JTlRFUlZBTCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucG9sbENoYW5nZXMoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmICghbm9GdWxsU3luYykgYXdhaXQgdGhpcy5jb3B5U291cmNlRmlsZXMoc291cmNlSW5kZXgpO1xuICAgICAgICAgICAgfSwgdGhpcy5zdG9wcGVkKTtcbiAgICAgICAgICAgIC8vIENoYW5nZSBwb2xscyBvbmx5IHNob3cgd2hhdCB0aGUgc291cmNlIEhBUywgbmV2ZXIgd2hhdCBpdCdzIG1pc3NpbmcsIHNvIHB1c2hlcyBydW4gb25cbiAgICAgICAgICAgIC8vIHRoZSBmdWxsLXJlc2NhbiBjYWRlbmNlIChmaW5kSW5mbyBvbiBhbiBpbmRleC1iYWNrZWQgc291cmNlIGlzIGNoZWFwKVxuICAgICAgICAgICAgcnVuSW5maW5pdGVQb2xsKEZVTExfUkVTQ0FOX0lOVEVSVkFMLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVzID0gYXdhaXQgc291cmNlLmZpbmRJbmZvKFwiXCIpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVjb25jaWxlU291cmNlKHNvdXJjZUluZGV4LCBuZXcgTWFwKGZpbGVzLm1hcCh4ID0+IFt4LnBhdGgsIHguY3JlYXRlVGltZV0pKSk7XG4gICAgICAgICAgICB9LCB0aGlzLnN0b3BwZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcnVuSW5maW5pdGVQb2xsKEZVTExfUkVTQ0FOX0lOVEVSVkFMLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc2NhbiA9IGF3YWl0IHRoaXMuc2NhblNvdXJjZShzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVTb3VyY2Uoc291cmNlSW5kZXgsIHJlc2Nhbik7XG4gICAgICAgICAgICAgICAgaWYgKCFub0Z1bGxTeW5jKSBhd2FpdCB0aGlzLmNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleCk7XG4gICAgICAgICAgICB9LCB0aGlzLnN0b3BwZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRnVsbCBtZXRhZGF0YSBzY2FuIChzaXplLCB3cml0ZVRpbWUsIHBhdGgpIG9mIG9uZSBzb3VyY2UsIGFwcGxpZWQgdG8gdGhlIGluZGV4LiBSZXR1cm5zIHRoZVxuICAgIC8vIHNvdXJjZSdzIGxpc3RpbmcgKHBhdGggLT4gd3JpdGUgdGltZSksIHdoaWNoIHJlY29uY2lsZVNvdXJjZSB1c2VzIGZvciB0aGUgcHVzaCBkaXJlY3Rpb24uXG4gICAgcHJpdmF0ZSBhc3luYyBzY2FuU291cmNlKHNvdXJjZUluZGV4OiBudW1iZXIpOiBQcm9taXNlPE1hcDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICAgICAgbGV0IHsgc291cmNlIH0gPSB0aGlzLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnNvdXJjZVN0YXRlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBzY2FuU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgc2NhbkxvZ2dlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgYWN0aXZpdHk6IFN5bmNBY3Rpdml0eSA9IHsgdHlwZTogXCJtZXRhZGF0YVNjYW5cIiwgc291cmNlRGVidWdOYW1lOiBzb3VyY2UuZ2V0RGVidWdOYW1lKCksIHN0YXJ0VGltZTogc2NhblN0YXJ0IH07XG4gICAgICAgIHRoaXMuc3luY0FjdGl2aXRpZXMuYWRkKGFjdGl2aXR5KTtcbiAgICAgICAgbGV0IHByb2dyZXNzVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBzY2FuTG9nZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBNZXRhZGF0YSBzY2FuIG9mICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBzdGlsbCBydW5uaW5nICgke01hdGgucm91bmQoKERhdGUubm93KCkgLSBzY2FuU3RhcnQpIC8gMTAwMCl9cywgc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH0sIFNZTkNfUFJPR1JFU1NfTE9HX0lOVEVSVkFMKTtcbiAgICAgICAgKHByb2dyZXNzVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICBsZXQgZmlsZXM6IEFyY2hpdmVGaWxlSW5mb1tdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZmlsZXMgPSBhd2FpdCBzb3VyY2UuZmluZEluZm8oXCJcIik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHByb2dyZXNzVGltZXIpO1xuICAgICAgICAgICAgdGhpcy5zeW5jQWN0aXZpdGllcy5kZWxldGUoYWN0aXZpdHkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2FuTG9nZ2VkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgTWV0YWRhdGEgc2NhbiBvZiAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmluaXNoZWQ6ICR7ZmlsZXMubGVuZ3RofSBmaWxlcyBpbiAke01hdGgucm91bmQoKERhdGUubm93KCkgLSBzY2FuU3RhcnQpIC8gMTAwMCl9cyAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBzZWVuLnNldChmaWxlLnBhdGgsIGZpbGUuY3JlYXRlVGltZSk7XG4gICAgICAgICAgICB0aGlzLmFwcGx5U2Nhbm5lZChzb3VyY2VJbmRleCwgZmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuc2Nhbm5lZENvdW50ID0gZmlsZXMubGVuZ3RoO1xuICAgICAgICAvLyBJbmRleCBlbnRyaWVzIHRoaXMgc291cmNlIHdhcyB0aGUgaG9sZGVyIG9mLCBidXQgdGhhdCB2YW5pc2hlZCBmcm9tIGl0IChlLmcuIGRlbGV0ZWRcbiAgICAgICAgLy8gd2hpbGUgd2Ugd2VyZSBvZmZsaW5lKSwgY29tZSBvdXQgb2YgdGhlIGluZGV4LiBFbnRyaWVzIGNoYW5nZWQgYWZ0ZXIgdGhlIHNjYW4gc3RhcnRlZFxuICAgICAgICAvLyBhcmUga2VwdCDigJQgdGhlIHNjYW4gbGlzdGluZyBtYXkgc2ltcGx5IHByZWRhdGUgdGhlbS4gVG9tYnN0b25lcyBoYXZlIG5vIHBoeXNpY2FsIGZpbGVcbiAgICAgICAgLy8gZm9yIGEgbGlzdGluZyB0byB2b3VjaCBmb3IsIHNvIHRoZXkncmUgZXhlbXB0IChjbGVhbnVwVG9tYnN0b25lcyBleHBpcmVzIHRoZW0gaW5zdGVhZCkuXG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLm1lbSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZSAhPT0gc291cmNlSW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGVudHJ5LnNpemUgPT09IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGVudHJ5LmNoYW5nZWRBdCA+PSBzY2FuU3RhcnQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5kZWxldGVJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuY2hhbmdlc0FmdGVyVGltZSA9IE1hdGgubWF4KHN0YXRlLmNoYW5nZXNBZnRlclRpbWUsIHNjYW5TdGFydCAtIENIQU5HRVNfUE9MTF9PVkVSTEFQKTtcbiAgICAgICAgcmV0dXJuIHNlZW47XG4gICAgfVxuXG4gICAgLy8gVGhlIHB1c2ggZGlyZWN0aW9uIG9mIHN5bmNocm9uaXphdGlvbjogZXZlcnl0aGluZyB3ZSBrbm93IHRoYXQgdGhlIHNvdXJjZSBpcyBtaXNzaW5nIChvclxuICAgIC8vIGhvbGRzIGFuIG9sZGVyIGNvcHkgb2YpIGlzIHdyaXR0ZW4gdG8gaXQg4oCUIGluY2x1ZGluZyBkZWxldGlvbnMsIGFzIHRvbWJzdG9uZSB3cml0ZXMuIFRoaXMgaXNcbiAgICAvLyB3aGF0IGhlYWxzIGEgc291cmNlIHdob3NlIGJhY2tncm91bmQgd3JpdGVzIGZhaWxlZCAoZS5nLiBpdCB3YXMgZG93bik6IHRoZSBuZXh0IHNjYW4gc2Vlc1xuICAgIC8vIHdoYXQncyBtaXNzaW5nIGFuZCByZS1zZW5kcyBpdC5cbiAgICBwcml2YXRlIGFzeW5jIHJlY29uY2lsZVNvdXJjZShzb3VyY2VJbmRleDogbnVtYmVyLCBsaXN0aW5nOiBNYXA8c3RyaW5nLCBudW1iZXI+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IHNvdXJjZSwgdmFsaWRXaW5kb3csIHJvdXRlIH0gPSB0aGlzLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgYWNjZXB0c1dyaXRlcyA9IHdpbmRvd0FjY2VwdHNXcml0ZXModmFsaWRXaW5kb3cpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMubWVtKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZSA9PT0gc291cmNlSW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIFBhc3Qtd2luZG93IHNvdXJjZXMgb25seSByZWNlaXZlIHRoZSByb3V0aW5nIGZpbGUgKHNlZSB3cml0ZVRvU291cmNlcyksIGFuZFxuICAgICAgICAgICAgICAgIC8vIHNoYXJkZWQgc291cmNlcyBvbmx5IHRoZSBrZXlzIHJvdXRpbmcgaW50byB0aGVtXG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYWNjZXB0c1dyaXRlcykgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoa2V5KSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgdGhlaXJUaW1lID0gbGlzdGluZy5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAodGhlaXJUaW1lICE9PSB1bmRlZmluZWQgJiYgdGhlaXJUaW1lID49IGVudHJ5LndyaXRlVGltZSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBkZWxldGlvbiBvbmx5IG5lZWRzIHB1c2hpbmcgd2hpbGUgdGhlIHNvdXJjZSBzdGlsbCBob2xkcyBhbiBvbGRlciBjb3B5XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGVpclRpbWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNvdXJjZS5zZXQoa2V5LCBCdWZmZXIuYWxsb2MoMCksIHsgbGFzdE1vZGlmaWVkOiBlbnRyeS53cml0ZVRpbWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5zb3VyY2VzW2VudHJ5LnNvdXJjZV0uc291cmNlLmdldDIoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgc291cmNlLnNldChrZXksIHJlc3VsdC5kYXRhLCB7IGxhc3RNb2RpZmllZDogcmVzdWx0LndyaXRlVGltZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gQWJvcnQgdGhlIHBhc3MgaW5zdGVhZCBvZiBsb2dnaW5nIHBlciBmaWxlOyB0aGUgbmV4dCBzY2FuIGN5Y2xlIHJldHJpZXNcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlY29uY2lsaW5nIHN5bmMgc291cmNlICR7c291cmNlLmdldERlYnVnTmFtZSgpfSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5U2Nhbm5lZChzb3VyY2VJbmRleDogbnVtYmVyLCBmaWxlOiBBcmNoaXZlRmlsZUluZm8pOiB2b2lkIHtcbiAgICAgICAgbGV0IHsgdmFsaWRXaW5kb3csIHJvdXRlIH0gPSB0aGlzLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgW3dpbmRvd1N0YXJ0LCB3aW5kb3dFbmRdID0gdmFsaWRXaW5kb3c7XG4gICAgICAgIGlmIChmaWxlLmNyZWF0ZVRpbWUgPCB3aW5kb3dTdGFydCB8fCBmaWxlLmNyZWF0ZVRpbWUgPiB3aW5kb3dFbmQpIHJldHVybjtcbiAgICAgICAgLy8gQSBwYXJ0aWFsbHktb3ZlcmxhcHBpbmcgc2hhcmQncyBsaXN0aW5nIGluY2x1ZGVzIGtleXMgb3V0c2lkZSBvdXIgcm91dGU7IGlnbm9yZSB0aGVtXG4gICAgICAgIGlmIChmaWxlLnBhdGggIT09IFJPVVRJTkdfRklMRSAmJiAhcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoZmlsZS5wYXRoKSkpIHJldHVybjtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5tZW0uZ2V0KGZpbGUucGF0aCk7XG4gICAgICAgIC8vIFRoZSBoaWdoZXN0IHdyaXRlIHRpbWUgd2lucyBhY3Jvc3MgYWxsIHNvdXJjZXMgKHRpZXMga2VlcCB0aGUgZXhpc3RpbmcgZW50cnkpXG4gICAgICAgIGlmIChleGlzdGluZyAmJiBmaWxlLmNyZWF0ZVRpbWUgPD0gZXhpc3Rpbmcud3JpdGVUaW1lKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShmaWxlLnBhdGgsIHsgd3JpdGVUaW1lOiBmaWxlLmNyZWF0ZVRpbWUsIHNpemU6IGZpbGUuc2l6ZSwgc291cmNlOiBzb3VyY2VJbmRleCB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHBvbGxDaGFuZ2VzKHNvdXJjZUluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHsgc291cmNlIH0gPSB0aGlzLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBpZiAoIXNvdXJjZS5nZXRDaGFuZ2VzQWZ0ZXIpIHJldHVybjtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zb3VyY2VTdGF0ZXNbc291cmNlSW5kZXhdO1xuICAgICAgICBsZXQgcG9sbFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGNoYW5nZXMgPSBhd2FpdCBzb3VyY2UuZ2V0Q2hhbmdlc0FmdGVyKHN0YXRlLmNoYW5nZXNBZnRlclRpbWUpO1xuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTY2FubmVkKHNvdXJjZUluZGV4LCBmaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5zY2FubmVkQ291bnQgKz0gY2hhbmdlcy5sZW5ndGg7XG4gICAgICAgIHN0YXRlLmNoYW5nZXNBZnRlclRpbWUgPSBwb2xsU3RhcnQgLSBDSEFOR0VTX1BPTExfT1ZFUkxBUDtcbiAgICB9XG5cbiAgICAvLyBEb3dubG9hZHMgdGhlIGZpbGVzIGEgc291cmNlIGN1cnJlbnRseSBob2xkcyBvbnRvIG91ciBvd24gYmFzZSBzb3VyY2UgKHRoZSBsb2NhbCBkaXNrKSxcbiAgICAvLyBwcmVzZXJ2aW5nIHRoZWlyIG1vZGlmaWVkIHRpbWVzIOKAlCBzbyBhIG5ld2VyIGxvY2FsIHdyaXRlIGFsd2F5cyB3aW5zLiBTa2lwcGVkIGZvciBub0Z1bGxTeW5jXG4gICAgLy8gc291cmNlcyAoZnJvbnRpbmcgYSBsYXJnZSBkYXRhYmFzZSB3aXRob3V0IGNvcHlpbmcgaXQpOyByZWFkcyBzdGlsbCBkb3duLWNhY2hlIGxhemlseS5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlTb3VyY2VGaWxlcyhzb3VyY2VJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBsZXQgeyBzb3VyY2UgfSA9IHRoaXMuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgIGxldCBwZW5kaW5nOiB7IGtleTogc3RyaW5nOyBlbnRyeTogSW5kZXhFbnRyeSB9W10gPSBbXTtcbiAgICAgICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tZW0pIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2UgIT09IHNvdXJjZUluZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zaXplID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIHBlbmRpbmcucHVzaCh7IGtleSwgZW50cnkgfSk7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGVudHJ5LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwZW5kaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgYWN0aXZpdHk6IFN5bmNBY3Rpdml0eSA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZnVsbFN5bmNcIixcbiAgICAgICAgICAgIHNvdXJjZURlYnVnTmFtZTogc291cmNlLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgc3RhcnRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgZG9uZUZpbGVzOiAwLFxuICAgICAgICAgICAgdG90YWxGaWxlczogcGVuZGluZy5sZW5ndGgsXG4gICAgICAgICAgICBkb25lQnl0ZXM6IDAsXG4gICAgICAgICAgICB0b3RhbEJ5dGVzLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN5bmNBY3Rpdml0aWVzLmFkZChhY3Rpdml0eSk7XG4gICAgICAgIGxldCBwcm9ncmVzc0xvZ2dlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgbG9nUHJvZ3Jlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICBwcm9ncmVzc0xvZ2dlZCA9IHRydWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRnVsbCBzeW5jIGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6ICR7YWN0aXZpdHkuZG9uZUZpbGVzfS8ke3BlbmRpbmcubGVuZ3RofSBmaWxlcyAoJHsoKGFjdGl2aXR5LmRvbmVGaWxlcyB8fCAwKSAvIHBlbmRpbmcubGVuZ3RoICogMTAwKS50b0ZpeGVkKDEpfSUpLCAke2Zvcm1hdE51bWJlcihhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMCl9Qi8ke2Zvcm1hdE51bWJlcih0b3RhbEJ5dGVzKX1CICgkeyh0b3RhbEJ5dGVzICYmIChhY3Rpdml0eS5kb25lQnl0ZXMgfHwgMCkgLyB0b3RhbEJ5dGVzICogMTAwIHx8IDEwMCkudG9GaXhlZCgxKX0lKWApO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgcHJvZ3Jlc3NUaW1lciA9IHNldEludGVydmFsKGxvZ1Byb2dyZXNzLCBTWU5DX1BST0dSRVNTX0xPR19JTlRFUlZBTCk7XG4gICAgICAgIChwcm9ncmVzc1RpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgbGV0IHNsb3dFcnJvclRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gYWN0aXZpdHkuc3RhcnRUaW1lO1xuICAgICAgICAgICAgbGV0IGRvbmVGaWxlcyA9IGFjdGl2aXR5LmRvbmVGaWxlcyB8fCAwO1xuICAgICAgICAgICAgbGV0IGRvbmVCeXRlcyA9IGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwO1xuICAgICAgICAgICAgbGV0IGJ5dGVzUGVyU2Vjb25kID0gZG9uZUJ5dGVzIC8gKGVsYXBzZWQgLyAxMDAwKTtcbiAgICAgICAgICAgIGxldCByZW1haW5pbmdCeXRlcyA9IHRvdGFsQnl0ZXMgLSBkb25lQnl0ZXM7XG4gICAgICAgICAgICBsZXQgZXRhVGV4dCA9IFwidW5rbm93biAobm8gYnl0ZXMgdHJhbnNmZXJyZWQgeWV0KVwiO1xuICAgICAgICAgICAgaWYgKGJ5dGVzUGVyU2Vjb25kID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZW1haW5pbmdNcyA9IHJlbWFpbmluZ0J5dGVzIC8gYnl0ZXNQZXJTZWNvbmQgKiAxMDAwO1xuICAgICAgICAgICAgICAgIGV0YVRleHQgPSBgJHtmb3JtYXRUaW1lKHJlbWFpbmluZ01zKX0gcmVtYWluaW5nLCBjb21wbGV0aW5nIGFyb3VuZCAke25ldyBEYXRlKERhdGUubm93KCkgKyByZW1haW5pbmdNcykudG9JU09TdHJpbmcoKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRnVsbCBzeW5jIGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSkgaGFzIGJlZW4gcnVubmluZyBmb3IgJHtmb3JtYXRUaW1lKGVsYXBzZWQpfTogJHtkb25lRmlsZXN9LyR7cGVuZGluZy5sZW5ndGh9IGZpbGVzICgkeyhkb25lRmlsZXMgLyBwZW5kaW5nLmxlbmd0aCAqIDEwMCkudG9GaXhlZCgxKX0lKSwgJHtmb3JtYXROdW1iZXIoZG9uZUJ5dGVzKX1CLyR7Zm9ybWF0TnVtYmVyKHRvdGFsQnl0ZXMpfUIgKCR7KHRvdGFsQnl0ZXMgJiYgZG9uZUJ5dGVzIC8gdG90YWxCeXRlcyAqIDEwMCB8fCAxMDApLnRvRml4ZWQoMSl9JSksICR7Zm9ybWF0TnVtYmVyKGJ5dGVzUGVyU2Vjb25kKX1CL3MuIEVzdGltYXRlZCAke2V0YVRleHR9LmApO1xuICAgICAgICB9LCBGVUxMX1NZTkNfU0xPV19FUlJPUl9JTlRFUlZBTCk7XG4gICAgICAgIChzbG93RXJyb3JUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgbmV4dEluZGV4ID0gMDtcbiAgICAgICAgICAgIGxldCBmYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBjb3B5V29ya2VyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdoaWxlICghZmFpbGVkICYmICF0aGlzLnN0b3BwZWQuc3RvcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBuZXh0SW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IHBlbmRpbmcubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGxldCB7IGtleSwgZW50cnkgfSA9IHBlbmRpbmdbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc291cmNlLmdldDIoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5zZXQoa2V5LCByZXN1bHQuZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHJlc3VsdC53cml0ZVRpbWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IG1vdmUgdGhlIGVudHJ5J3Mgc291cmNlIGlmIGl0IHdhc24ndCBjaGFuZ2VkIHdoaWxlIHdlIGNvcGllZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWVtLmdldChrZXkpID09PSBlbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuZGF0YS5sZW5ndGgsIHNvdXJjZTogMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5kb25lRmlsZXMgPSAoYWN0aXZpdHkuZG9uZUZpbGVzIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkuZG9uZUJ5dGVzID0gKGFjdGl2aXR5LmRvbmVCeXRlcyB8fCAwKSArIGVudHJ5LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCB3b3JrZXJzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4oRlVMTF9TWU5DX1BBUkFMTEVMLCBwZW5kaW5nLmxlbmd0aCk7IGkrKykge1xuICAgICAgICAgICAgICAgIHdvcmtlcnMucHVzaChjb3B5V29ya2VyKCkuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0b3AgdGhlIG90aGVyIHdvcmtlcnMgcHVsbGluZyBuZXcgZmlsZXMsIHRoZW4gc3VyZmFjZSB0aGUgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3b3JrZXJzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHNsb3dFcnJvclRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuc3luY0FjdGl2aXRpZXMuZGVsZXRlKGFjdGl2aXR5KTtcbiAgICAgICAgICAgIC8vIEEgc3luYyBzbG93IGVub3VnaCB0byBoYXZlIGxvZ2dlZCBwcm9ncmVzcyBhbHNvIGxvZ3MgaXRzIGNvbXBsZXRpb25cbiAgICAgICAgICAgIGlmIChwcm9ncmVzc0xvZ2dlZCkge1xuICAgICAgICAgICAgICAgIGxvZ1Byb2dyZXNzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmaW5kSW5mbyBhbmQgZ2V0Q2hhbmdlc0FmdGVyIGxpc3QgZnJvbSB0aGUgaW5kZXgsIHNvIHRoZXkgbXVzdCB3YWl0IGZvciBvdXIgb3duIGJhc2VcbiAgICAvLyBzb3VyY2UncyBpbml0aWFsIHNjYW4gKHdoaWNoIG1pZ2h0IGxhZyBtaW51dGVzKSBiZWZvcmUgdGhlIGxpc3RpbmcgaXMgdHJ1c3R3b3J0aHkuIFRoZSBiYXNlXG4gICAgLy8gKGxvY2FsIGRpc2spIGlzIGltcGxpY2l0bHkgcmVxdWlyZWQgLSByZW1vdGUgc291cmNlcyBhcmUgbm90LCB0aGV5IGNvbWUgYW5kIGdvLlxuICAgIHByaXZhdGUgYXN5bmMgd2FpdEZvclJlcXVpcmVkU2NhbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlU3RhdGVzWzBdLmluaXRpYWxTY2FuLnByb21pc2U7XG4gICAgfVxuXG4gICAgLy8gQSByZXF1ZXN0ZWQgZmlsZSBpc24ndCBpbiB0aGUgaW5kZXg6IG91ciBvd24gYmFzZSBzb3VyY2UgKGltcGxpY2l0bHkgcmVxdWlyZWQpIGlzIGNoZWNrZWRcbiAgICAvLyBkaXJlY3RseSBpZiBpdHMgaW5pdGlhbCBzY2FuIGhhc24ndCBmaW5pc2hlZCwgYW5kIGNoYW5nZXMtYWZ0ZXIgc291cmNlcyBhcmUgcmUtcG9sbGVkIChhdFxuICAgIC8vIG1vc3QgZXZlcnkgNSBzZWNvbmRzKVxuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tNaXNzaW5nS2V5KGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyBzb3VyY2UgfSA9IHRoaXMuc291cmNlc1tpXTtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc291cmNlU3RhdGVzW2ldO1xuICAgICAgICAgICAgaWYgKGkgPT09IDAgJiYgIXN0YXRlLnNjYW5Db21wbGV0ZSkge1xuICAgICAgICAgICAgICAgIGxldCBpbmZvID0gYXdhaXQgc291cmNlLmdldEluZm8oa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5mbykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5U2Nhbm5lZChpLCB7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogaW5mby53cml0ZVRpbWUsIHNpemU6IGluZm8uc2l6ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIgJiYgRGF0ZS5ub3coKSAtIHN0YXRlLmxhc3RNaXNzQ2hlY2sgPiBNSVNTX0NIRUNLX0lOVEVSVkFMKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUubGFzdE1pc3NDaGVjayA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wb2xsQ2hhbmdlcyhpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0SW5kZXhFbnRyeShrZXk6IHN0cmluZyk6IFByb21pc2U8SW5kZXhFbnRyeSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLm1lbS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGVudHJ5ICYmIHRoaXMuc291cmNlc1tlbnRyeS5zb3VyY2VdKSByZXR1cm4gZW50cnk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgLy8gVGhlIHNvdXJjZSBsaXN0IGNoYW5nZWQgYW5kIHRoaXMgZW50cnkncyBzb3VyY2Ugbm8gbG9uZ2VyIGV4aXN0czsgdHJlYXQgYXMgbWlzc2luZ1xuICAgICAgICAgICAgdGhpcy5kZWxldGVJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja01pc3NpbmdLZXkoa2V5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBkYXRhIG9wZXJhdGlvbnMg4pSA4pSAXG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGtleSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldDIoa2V5OiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IHJhbmdlID0gY29uZmlnPy5yYW5nZTtcbiAgICAgICAgbGV0IG92ZXJsYXlFbnRyeSA9IHRoaXMub3ZlcmxheS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKG92ZXJsYXlFbnRyeSkge1xuICAgICAgICAgICAgLy8gQW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSAodG9tYnN0b25lKVxuICAgICAgICAgICAgaWYgKG92ZXJsYXlFbnRyeS5kYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBkYXRhID0gb3ZlcmxheUVudHJ5LmRhdGE7XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc3ViYXJyYXkoTWF0aC5taW4ocmFuZ2Uuc3RhcnQsIGRhdGEubGVuZ3RoKSwgTWF0aC5taW4ocmFuZ2UuZW5kLCBkYXRhLmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgd3JpdGVUaW1lOiBvdmVybGF5RW50cnkudCwgc2l6ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBlbnRyeSA9IGF3YWl0IHRoaXMuZ2V0SW5kZXhFbnRyeShrZXkpO1xuICAgICAgICBpZiAoIWVudHJ5KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZW50cnkuc2l6ZSA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgZW50cnkubGFzdEFjY2VzcyA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBob2xkZXIgPSBlbnRyeS5zb3VyY2U7XG4gICAgICAgIGxldCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBob2xkZXJFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnNvdXJjZXNbaG9sZGVyXS5zb3VyY2UuZ2V0MihrZXksIHsgcmFuZ2UgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGhvbGRlckVycm9yID0gZSBhcyBFcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBSYW5nZWQgcmVhZHMgY2FuJ3QgcG9wdWxhdGUgYSBjYWNoZSAodGhleSdyZSBwYXJ0aWFsKVxuICAgICAgICAgICAgaWYgKGhvbGRlciAhPT0gMCAmJiAhcmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlUmVhZChrZXksIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBob2xkZXIgaXMgZG93biBvciBsb3N0IHRoZSBmaWxlLiBBTlkgb3RoZXIgc291cmNlJ3MgY29weSBiZWF0cyBubyB2YWx1ZSAtIGV2ZW4gYW5cbiAgICAgICAgLy8gT0xERVIgb25lIC0gYW5kIGl0J3MgY29waWVkIG9udG8gb3VyIGRpc2sgc28gdGhlIG5leHQgcmVhZCBkb2Vzbid0IGRlcGVuZCBvbiBsdWNrLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPT09IGhvbGRlcikgY29udGludWU7XG4gICAgICAgICAgICBsZXQgZmFsbGJhY2s6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZhbGxiYWNrID0gYXdhaXQgdGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXQyKGtleSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZmFsbGJhY2spIGNvbnRpbnVlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jYWNoZVJlYWQoa2V5LCBmYWxsYmFjayk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGZhbGxiYWNrLmRhdGE7XG4gICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zdWJhcnJheShNYXRoLm1pbihyYW5nZS5zdGFydCwgZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IGZhbGxiYWNrLndyaXRlVGltZSwgc2l6ZTogZmFsbGJhY2suc2l6ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChob2xkZXJFcnJvcikgdGhyb3cgaG9sZGVyRXJyb3I7XG4gICAgICAgIC8vIFRoZSBob2xkZXIgYW5zd2VyZWQgXCJub3QgdGhlcmVcIiBhbmQgbm8gb3RoZXIgc291cmNlIGhhcyBpdCBlaXRoZXI6IHRoZSBlbnRyeSB3YXMgc3RhbGVcbiAgICAgICAgdGhpcy5kZWxldGVJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlYWQncyBieXRlcyBjYW1lIGZyb20gYSByZW1vdGUgc291cmNlLCBzbyB3cml0ZSB0aGVtIG9udG8gb3VyIG93biBiYXNlIHNvdXJjZSAodGhlXG4gICAgLy8gbG9jYWwgZGlzayksIHdoaWNoIGJlY29tZXMgdGhlIGVudHJ5J3MgbmV3IGhvbGRlciAtIHJlYWRzIG9ubHkgcGF5IHRoZSByZW1vdGUgZmV0Y2ggb25jZVxuICAgIHByaXZhdGUgYXN5bmMgY2FjaGVSZWFkKGtleTogc3RyaW5nLCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2Uuc2V0KGtleSwgcmVzdWx0LmRhdGEsIHsgbGFzdE1vZGlmaWVkOiByZXN1bHQud3JpdGVUaW1lIH0pO1xuICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LmRhdGEubGVuZ3RoLCBzb3VyY2U6IDAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBXcml0ZUNvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkID0gY29uZmlnPy5sYXN0TW9kaWZpZWQ7XG4gICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICBsZXQgb3ZlcmxheUVudHJ5ID0gdGhpcy5vdmVybGF5LmdldChrZXkpO1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5tZW0uZ2V0KGtleSk7XG4gICAgICAgICAgICBsZXQgY3VycmVudFRpbWUgPSBvdmVybGF5RW50cnkgJiYgb3ZlcmxheUVudHJ5LnQgfHwgZW50cnkgJiYgZW50cnkud3JpdGVUaW1lIHx8IDA7XG4gICAgICAgICAgICAvLyBBbiBvbGRlciB3cml0ZSBuZXZlciBvdmVyd3JpdGVzIGEgbmV3ZXIgb25lIChzZWUgSUFyY2hpdmVzLnNldClcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQgPCBjdXJyZW50VGltZSkgcmV0dXJuIGtleTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgd3JpdGVUaW1lID0gbGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCk7XG4gICAgICAgIGlmIChjb25maWc/LmZhc3QpIHtcbiAgICAgICAgICAgIGxldCB3cml0ZURlbGF5ID0gY29uZmlnLndyaXRlRGVsYXkgfHwgREVGQVVMVF9GQVNUX1dSSVRFX0RFTEFZO1xuICAgICAgICAgICAgbGV0IGZsdXNoQXQgPSBEYXRlLm5vdygpICsgd3JpdGVEZWxheTtcbiAgICAgICAgICAgIGxldCBkZWFkbGluZSA9IHRoaXMuY29uZmlnPy5nZXRGbHVzaERlYWRsaW5lPy4oKTtcbiAgICAgICAgICAgIGlmIChkZWFkbGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPj0gZGVhZGxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5LmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlVG9Tb3VyY2VzKGtleSwgZGF0YSwgd3JpdGVUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmx1c2hBdCA9IE1hdGgubWluKGZsdXNoQXQsIGRlYWRsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3ZlcmxheS5zZXQoa2V5LCB7IGRhdGEsIHQ6IHdyaXRlVGltZSwgZmx1c2hBdCB9KTtcbiAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdmVybGF5LmRlbGV0ZShrZXkpO1xuICAgICAgICBhd2FpdCB0aGlzLndyaXRlVG9Tb3VyY2VzKGtleSwgZGF0YSwgd3JpdGVUaW1lKTtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGtleTogc3RyaW5nLCBjb25maWc/OiBXcml0ZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBEZWxldGVzIGFyZSB0b21ic3RvbmUgd3JpdGVzIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKTogdGhlIHNpemUtMCBpbmRleCBlbnRyeSBpc1xuICAgICAgICAvLyBvcmRlcmVkIGJ5IHdyaXRlIHRpbWUgbGlrZSBhbnkgb3RoZXIgd3JpdGUsIHByb3BhZ2F0ZXMgdGhyb3VnaCBzeW5jaHJvbml6YXRpb24sIGFuZFxuICAgICAgICAvLyBleHBpcmVzIGFmdGVyIFRPTUJTVE9ORV9FWFBJUllcbiAgICAgICAgYXdhaXQgdGhpcy5zZXQoa2V5LCBCdWZmZXIuYWxsb2MoMCksIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRXcml0YWJsZVNvdXJjZXMoY29uZmlnPzogeyBpZ25vcmVXaW5kb3c/OiBib29sZWFuIH0pOiBudW1iZXJbXSB7XG4gICAgICAgIGxldCB3cml0YWJsZTogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnPy5pZ25vcmVXaW5kb3cgJiYgIXdpbmRvd0FjY2VwdHNXcml0ZXModGhpcy5zb3VyY2VzW2ldLnZhbGlkV2luZG93KSkgY29udGludWU7XG4gICAgICAgICAgICB3cml0YWJsZS5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0YWJsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHdyaXRlVG9Tb3VyY2VzKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIHdyaXRlVGltZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgZXhlbXB0IGZyb20gdGhlIHZhbGlkLXdpbmRvdyBhbmQgcm91dGUgd3JpdGUgZmlsdGVyczogdGhlIENPTkZJR1xuICAgICAgICAvLyBtdXN0IGtlZXAgZmxvd2luZyB0byBldmVyeSBzb3VyY2UsIG9yIGEgY2xpZW50IHByb2Jpbmcgb25lIG9mIHRoZW0gZmlyc3Qgd291bGQgYWRvcHQgYVxuICAgICAgICAvLyBzdGFsZSBjb25maWcuIE9ubHkgZGF0YSB3cml0ZXMgc3RvcC5cbiAgICAgICAgbGV0IGlzUm91dGluZyA9IGtleSA9PT0gUk9VVElOR19GSUxFO1xuICAgICAgICBsZXQgd3JpdGFibGUgPSB0aGlzLmdldFdyaXRhYmxlU291cmNlcyh7IGlnbm9yZVdpbmRvdzogaXNSb3V0aW5nIH0pO1xuICAgICAgICBsZXQgZmlyc3QgPSB3cml0YWJsZS5zaGlmdCgpO1xuICAgICAgICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgYWNjZXB0cyB3cml0ZXMgKGV2ZXJ5IHNvdXJjZSdzIHZhbGlkIHdpbmRvdyBpcyBpbiB0aGUgcGFzdCksIHNvIHdyaXRlcyBjYW5ub3QgYmUgc3RvcmVkIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IG91ciBvd24gKGZpcnN0KSBzb3VyY2UgYmxvY2tzIHRoZSB3cml0ZS4gRG93bnN0cmVhbSBzb3VyY2VzIGFyZSB3cml0dGVuIGluIHRoZVxuICAgICAgICAvLyBiYWNrZ3JvdW5kOiBhIGRvd24gZG93bnN0cmVhbSBzb3VyY2UgbXVzdCBub3QgZmFpbCBvciBzdGFsbCB3cml0ZXMsIGFuZCByZWNvbmNpbGVTb3VyY2VcbiAgICAgICAgLy8gcmUtc2VuZHMgYW55dGhpbmcgdGhleSBtaXNzZWQgb25jZSB0aGV5IGNvbWUgYmFjay5cbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBBIHRvbWJzdG9uZSBzdG9yZXMgbm90aGluZyBvbiBvdXIgb3duIHNvdXJjZSAtIHRoZSBpbmRleCBlbnRyeSBhbG9uZSByZWNvcmRzIGl0XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbZmlyc3RdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1tmaXJzdF0uc291cmNlLnNldChrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWUsIHNpemU6IGRhdGEubGVuZ3RoLCBzb3VyY2U6IGZpcnN0IH0pO1xuICAgICAgICBsZXQgcm91dGUgPSAhaXNSb3V0aW5nICYmIGdldFJvdXRlKGtleSkgfHwgMDtcbiAgICAgICAgZm9yIChsZXQgaSBvZiB3cml0YWJsZSkge1xuICAgICAgICAgICAgaWYgKCFpc1JvdXRpbmcgJiYgIXJvdXRlQ29udGFpbnModGhpcy5zb3VyY2VzW2ldLnJvdXRlLCByb3V0ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gRG93bnN0cmVhbSBzb3VyY2VzIHJlY2VpdmUgdG9tYnN0b25lcyBhcyBhY3R1YWwgZW1wdHkgd3JpdGVzLCBzbyB0aGVpciBsaXN0aW5ncyBzaG93XG4gICAgICAgICAgICAvLyB0aGUgZGVsZXRpb24gKHNpemUgMCkgYW5kIG90aGVyIHN0b3JlcyBzY2FuIGl0IGluIGFzIGEgdG9tYnN0b25lXG4gICAgICAgICAgICB2b2lkIHRoaXMuc291cmNlc1tpXS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSB9KS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBCYWNrZ3JvdW5kIHdyaXRlIG9mICR7a2V5fSB0byBzeW5jIHNvdXJjZSAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGtleTogc3RyaW5nKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IG92ZXJsYXlFbnRyeSA9IHRoaXMub3ZlcmxheS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKG92ZXJsYXlFbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgd3JpdGVUaW1lOiBvdmVybGF5RW50cnkudCwgc2l6ZTogb3ZlcmxheUVudHJ5LmRhdGEubGVuZ3RoIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVudHJ5ID0gYXdhaXQgdGhpcy5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIGlmICghZW50cnkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlPzogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclJlcXVpcmVkU2NhbnMoKTtcbiAgICAgICAgbGV0IGluZm9zID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMubWVtKSB7XG4gICAgICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gVG9tYnN0b25lcyBhcmUgbWlzc2luZyBmaWxlcywgc28gbGlzdGluZ3MgaGlkZSB0aGVtXG4gICAgICAgICAgICBpZiAoZW50cnkuc2l6ZSA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBpbmZvcy5zZXQoa2V5LCB7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFtrZXksIG92ZXJsYXlFbnRyeV0gb2YgdGhpcy5vdmVybGF5KSB7XG4gICAgICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG92ZXJsYXlFbnRyeS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGluZm9zLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5mb3Muc2V0KGtleSwgeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IG92ZXJsYXlFbnRyeS50LCBzaXplOiBvdmVybGF5RW50cnkuZGF0YS5sZW5ndGggfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbGVzID0gYXBwbHlGaW5kSW5mb1NoYXBlKEFycmF5LmZyb20oaW5mb3MudmFsdWVzKCkpLCBwcmVmaXgsIGNvbmZpZyk7XG4gICAgICAgIHNvcnQoZmlsZXMsIHggPT4geC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cblxuICAgIC8vIEFsbCBmaWxlcyBjaGFuZ2VkIGFmdGVyIHRoZSBnaXZlbiB0aW1lIOKAlCBmYXN0LCBzdHJhaWdodCBmcm9tIHRoZSBpbi1tZW1vcnkgaW5kZXguIEZpbHRlcnMgb25cbiAgICAvLyB3aGVuIFdFIGxlYXJuZWQgb2YgdGhlIGNoYW5nZSAoY2hhbmdlZEF0KSwgc28gZmlsZXMgc3luY2hyb25pemVkIGxhdGUgKHdpdGggb2xkIHdyaXRlIHRpbWVzKVxuICAgIC8vIGFyZSBzdGlsbCByZXBvcnRlZC4gRGVsZXRpb25zIEFSRSByZXBvcnRlZCwgYXMgc2l6ZS0wIHRvbWJzdG9uZSBlbnRyaWVzIOKAlCB0aGF0J3MgaG93IHRoZXlcbiAgICAvLyBwcm9wYWdhdGUgdG8gc3RvcmVzIHN5bmNpbmcgZnJvbSB1cy5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyKHRpbWU6IG51bWJlcik6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclJlcXVpcmVkU2NhbnMoKTtcbiAgICAgICAgbGV0IGZpbGVzOiBBcmNoaXZlRmlsZUluZm9bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tZW0pIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5jaGFuZ2VkQXQgPD0gdGltZSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5LmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBba2V5LCBvdmVybGF5RW50cnldIG9mIHRoaXMub3ZlcmxheSkge1xuICAgICAgICAgICAgaWYgKG92ZXJsYXlFbnRyeS50IDw9IHRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogb3ZlcmxheUVudHJ5LnQsIHNpemU6IG92ZXJsYXlFbnRyeS5kYXRhLmxlbmd0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICBzb3J0KGZpbGVzLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBmaWxlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFsbFNjYW5zQ29tcGxldGU6IHRoaXMuc291cmNlU3RhdGVzLmV2ZXJ5KHggPT4geC5zY2FuQ29tcGxldGUpLFxuICAgICAgICAgICAgaW5kZXhTaXplOiB0aGlzLm1lbS5zaXplLFxuICAgICAgICAgICAgc291cmNlczogdGhpcy5zb3VyY2VzLm1hcCgoeCwgaSkgPT4gKHtcbiAgICAgICAgICAgICAgICBkZWJ1Z05hbWU6IHguc291cmNlLmdldERlYnVnTmFtZSgpLFxuICAgICAgICAgICAgICAgIHZhbGlkV2luZG93OiB4LnZhbGlkV2luZG93LFxuICAgICAgICAgICAgICAgIHJvdXRlOiB4LnJvdXRlLFxuICAgICAgICAgICAgICAgIG5vRnVsbFN5bmM6IHgubm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogdGhpcy5zb3VyY2VTdGF0ZXNbaV0uc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIsXG4gICAgICAgICAgICAgICAgaW5pdGlhbFNjYW5Db21wbGV0ZTogdGhpcy5zb3VyY2VTdGF0ZXNbaV0uc2NhbkNvbXBsZXRlLFxuICAgICAgICAgICAgICAgIHNjYW5uZWRDb3VudDogdGhpcy5zb3VyY2VTdGF0ZXNbaV0uc2Nhbm5lZENvdW50LFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBsYXJnZSB1cGxvYWRzIOKUgOKUgFxuICAgIC8vIExhcmdlIHVwbG9hZHMgc3RyZWFtIG9udG8gdGhlIGxvY2FsIGRpc2sgc291cmNlIGRpcmVjdGx5ICh0aGV5IG1heSBub3QgZml0IGluIG1lbW9yeSlcblxuICAgIHByaXZhdGUgZ2V0RGlza1NvdXJjZSgpOiB7IGRpc2s6IEFyY2hpdmVzRGlzazsgc291cmNlSW5kZXg6IG51bWJlciB9IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnNvdXJjZXNbaV0uc291cmNlO1xuICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEFyY2hpdmVzRGlzaykgcmV0dXJuIHsgZGlzazogc291cmNlLCBzb3VyY2VJbmRleDogaSB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTGFyZ2UgdXBsb2FkcyByZXF1aXJlIGFuIEFyY2hpdmVzRGlzayBzb3VyY2UsIGFuZCB0aGlzIHN0b3JlIGhhcyBub25lIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHN0YXJ0TGFyZ2VVcGxvYWQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLnN0YXJ0TGFyZ2VVcGxvYWQoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGFwcGVuZExhcmdlVXBsb2FkKGlkOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmFwcGVuZExhcmdlVXBsb2FkKGlkLCBkYXRhKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmlzaExhcmdlVXBsb2FkKGlkOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCB7IGRpc2ssIHNvdXJjZUluZGV4IH0gPSB0aGlzLmdldERpc2tTb3VyY2UoKTtcbiAgICAgICAgYXdhaXQgZGlzay5maW5pc2hMYXJnZVVwbG9hZChpZCwga2V5KTtcbiAgICAgICAgdGhpcy5vdmVybGF5LmRlbGV0ZShrZXkpO1xuICAgICAgICBsZXQgaW5mbyA9IGF3YWl0IGRpc2suZ2V0SW5mbyhrZXkpO1xuICAgICAgICBpZiAoaW5mbykge1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGluZm8ud3JpdGVUaW1lLCBzaXplOiBpbmZvLnNpemUsIHNvdXJjZTogc291cmNlSW5kZXggfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGNhbmNlbExhcmdlVXBsb2FkKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5jYW5jZWxMYXJnZVVwbG9hZChpZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmbHVzaE92ZXJsYXkoZm9yY2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5vdmVybGF5KSB7XG4gICAgICAgICAgICBpZiAoIWZvcmNlICYmIGVudHJ5LmZsdXNoQXQgPiBub3cpIGNvbnRpbnVlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy53cml0ZVRvU291cmNlcyhrZXksIGVudHJ5LmRhdGEsIGVudHJ5LnQpO1xuICAgICAgICAgICAgLy8gT25seSByZW1vdmUgaWYgaXQgd2Fzbid0IG92ZXJ3cml0dGVuIHdoaWxlIHdlIHdlcmUgZmx1c2hpbmdcbiAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXkuZ2V0KGtleSkgPT09IGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5LmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVhZGVyRGlza0xpbWl0OiB0aGUgZGlzayBpcyBvbmx5IGEgYm91bmRlZCByZWFkIGNhY2hlLCBzbyBvbmNlIGl0IGV4Y2VlZHMgdGhlIGxpbWl0LCB0aGVcbiAgICAvLyBsZWFzdCByZWNlbnRseSB1c2VkIGZpbGVzIGFyZSBkZWxldGVkIGZyb20gaXQgLSBidXQgT05MWSB3aGVuIGFub3RoZXIgc291cmNlIHZlcmlmaWFibHlcbiAgICAvLyBob2xkcyBhIHNhbWUtb3ItbmV3ZXIgY29weSAodGhlIG9ubHkgY29weSBvZiBhIGZpbGUgaXMgbmV2ZXIgZGVsZXRlZCksIGFuZCB0aGUgaW5kZXggZW50cnlcbiAgICAvLyByZXBvaW50cyB0byB0aGF0IHNvdXJjZSBzbyByZWFkcyBrZWVwIHdvcmtpbmcgKHJlLWNhY2hpbmcgb24gdGhlIG5leHQgcmVhZCkuXG4gICAgcHJpdmF0ZSBldmljdGluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgYXN5bmMgZW5mb3JjZURpc2tMaW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGxpbWl0ID0gdGhpcy5jb25maWc/LnJlYWRlckRpc2tMaW1pdDtcbiAgICAgICAgaWYgKCFsaW1pdCB8fCB0aGlzLmV2aWN0aW5nKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnNvdXJjZUJ5dGVDb3VudHNbMF0gPD0gbGltaXQpIHJldHVybjtcbiAgICAgICAgdGhpcy5ldmljdGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgY2FuZGlkYXRlczogeyBrZXk6IHN0cmluZzsgZW50cnk6IEluZGV4RW50cnkgfVtdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5tZW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuc291cmNlICE9PSAwIHx8IGVudHJ5LnNpemUgPT09IDAgfHwga2V5ID09PSBST1VUSU5HX0ZJTEUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaCh7IGtleSwgZW50cnkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb3J0KGNhbmRpZGF0ZXMsIHggPT4geC5lbnRyeS5sYXN0QWNjZXNzKTtcbiAgICAgICAgICAgIGZvciAobGV0IHsga2V5LCBlbnRyeSB9IG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9wcGVkLnN0b3ApIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VCeXRlQ291bnRzWzBdIDw9IGxpbWl0KSBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tZW0uZ2V0KGtleSkgIT09IGVudHJ5KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgaG9sZGVyOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvID0gYXdhaXQgdGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXRJbmZvKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAmJiBpbmZvLndyaXRlVGltZSA+PSBlbnRyeS53cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgZG93biBzb3VyY2UganVzdCBjYW4ndCB2b3VjaCBmb3IgdGhpcyBmaWxlIHJpZ2h0IG5vd1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChob2xkZXIgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5kZWwoa2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplLCBzb3VyY2U6IGhvbGRlciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuZXZpY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRvbWJzdG9uZXMgb25seSBuZWVkIHRvIGV4aXN0IGxvbmcgZW5vdWdoIGZvciBldmVyeSBzdG9yZSB0byBsZWFybiBvZiB0aGUgZGVsZXRpb247IGV4cGlyZWRcbiAgICAvLyBvbmVzIGNvbWUgb3V0IG9mIHRoZSBpbmRleC4gVGhlIHBoeXNpY2FsIGVtcHR5IGZpbGUgaXMgcmVtb3ZlZCBvbmx5IG9uIGJhY2tibGF6ZSBzb3VyY2VzOlxuICAgIC8vIHJlbW90ZSBzdG9yZXMgZXhwaXJlIHRoZWlyIG93biB0b21ic3RvbmVzIChhIGRlbCB0aGVyZSB3b3VsZCBqdXN0IG1pbnQgYSBmcmVzaCBvbmUpLCBhbmQgb3VyXG4gICAgLy8gb3duIGRpc2sgbmV2ZXIgc3RvcmVkIGFueXRoaW5nIGZvciBpdC5cbiAgICBwcml2YXRlIGFzeW5jIGNsZWFudXBUb21ic3RvbmVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgY3V0b2ZmID0gRGF0ZS5ub3coKSAtIFRPTUJTVE9ORV9FWFBJUlk7XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLm1lbSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcHBlZC5zdG9wKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoZW50cnkuc2l6ZSAhPT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoZW50cnkud3JpdGVUaW1lID4gY3V0b2ZmKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlSW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAgICAgZm9yIChsZXQgc291cmNlRW50cnkgb2YgdGhpcy5zb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3aW5kb3dBY2NlcHRzV3JpdGVzKHNvdXJjZUVudHJ5LnZhbGlkV2luZG93KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZUVudHJ5LnNvdXJjZTtcbiAgICAgICAgICAgICAgICBpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBBcmNoaXZlc0JhY2tibGF6ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHZvaWQgc291cmNlLmRlbChrZXkpLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBSZW1vdmluZyBleHBpcmVkIHRvbWJzdG9uZSAke2tleX0gZnJvbSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
873
+ /* _JS_SOURCE_HASH = "f47413038845453e02b02930609b43c6fbfca6cf1a80b11023fe9fe8015c9fa7"; */