sliftutils 1.7.136 → 1.7.138

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/bin/printmachineid.js +5 -0
  2. package/examplestorage/browser.tsx +2 -2
  3. package/index.d.ts +10 -4
  4. package/misc/dist/strings.ts.cache +2 -2
  5. package/misc/https/certs.d.ts +6 -1
  6. package/misc/https/certs.ts +11 -2
  7. package/misc/https/dist/certs.ts.cache +14 -5
  8. package/misc/https/dist/persistentLocalStorage.ts.cache +14 -4
  9. package/misc/https/persistentLocalStorage.d.ts +1 -0
  10. package/misc/https/persistentLocalStorage.ts +10 -0
  11. package/package.json +5 -3
  12. package/security/authorizedKeys/daemon/daemon.ts +4 -3
  13. package/security/authorizedKeys/daemon/dist/revocation.ts.cache +0 -0
  14. package/security/authorizedKeys/daemon/dist/trust.ts.cache +126 -4
  15. package/security/authorizedKeys/daemon/revocation.d.ts +4 -7
  16. package/security/authorizedKeys/daemon/revocation.ts +0 -0
  17. package/security/authorizedKeys/daemon/trust.d.ts +12 -1
  18. package/security/authorizedKeys/daemon/trust.ts +124 -1
  19. package/security/authorizedKeys/dist/unrevoke.ts.cache +5 -186
  20. package/security/authorizedKeys/dist/unrevokeCli.ts.cache +195 -0
  21. package/security/machines/dist/machines.ts.cache +20 -68
  22. package/security/machines/dist/printMachineId.ts.cache +21 -0
  23. package/security/machines/identity2.ts +94 -6
  24. package/security/machines/machines.ts +27 -76
  25. package/security/machines/printMachineId.ts +19 -0
  26. package/security/signedFiles/dist/signFiles.ts.cache +16 -52
  27. package/storage/remoteStorage/ArchivesRemote.d.ts +1 -1
  28. package/storage/remoteStorage/ArchivesRemote.ts +14 -8
  29. package/storage/remoteStorage/accessPage.tsx +7 -123
  30. package/storage/remoteStorage/createArchives.d.ts +1 -1
  31. package/storage/remoteStorage/createArchives.ts +1 -1
  32. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +14 -7
  33. package/storage/remoteStorage/dist/createArchives.ts.cache +2 -2
  34. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +3 -3
  35. package/storage/remoteStorage/dist/storageController.ts.cache +8 -7
  36. package/storage/remoteStorage/sourceWrapper.ts +1 -1
  37. package/storage/remoteStorage/storageController.d.ts +1 -1
  38. package/storage/remoteStorage/storageController.ts +10 -10
@@ -906,5 +906,5 @@ async function getBucketInfo(config) {
906
906
  return await remote.getConfig();
907
907
  }
908
908
  exports.getBucketInfo = getBucketInfo;
909
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQXJjaGl2ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjcmVhdGVBcmNoaXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBa0U7QUFDbEUsMkRBQXFEO0FBQ3JELDRDQUlzQjtBQUN0QixzREFBb0Q7QUFDcEQsaURBSXdCO0FBQ3hCLCtDQUE0QztBQUM1QyxtRUFBZ0U7QUFDaEUscURBQXdGO0FBRXhGLDJEQUF5RjtBQUV6RixpREFBK0Q7QUFDL0Qsb0RBQWlGO0FBQ2pGLGtFQUEyRjtBQUUzRix5UUFBeVE7QUFDelEsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMvQyxNQUFNLGlDQUFpQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDcEQsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzFDLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN4QyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN0Qyx3SkFBd0o7QUFDeEosTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLDZHQUE2RztBQUM3RyxNQUFNLHVDQUF1QyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDNUQsTUFBTSxxQ0FBcUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ3pELG9KQUFvSjtBQUNwSixNQUFNLG9CQUFvQixHQUFHLCtCQUErQixDQUFDO0FBVTdELHFOQUFxTjtBQUNyTiwrQ0FBcUY7QUFBNUUsOEdBQUEs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QUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3BDLENBQUM7QUFKRCxzQ0FJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNvcnQsIHdhdGNoU2xvd1Byb21pc2UgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQge1xuICAgIElBcmNoaXZlcywgUmVtb3RlQ29uZmlnLCBSZW1vdGVDb25maWdCYXNlLCBTb3VyY2VDb25maWcsXG4gICAgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZywgQXJjaGl2ZXNTeW5jU3RhdHVzLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIERlbENvbmZpZywgRmluZENvbmZpZywgR2V0Q29uZmlnLCBHZXRJbmZvQ29uZmlnLCBNb3ZlRmlsZUNvbmZpZywgU2V0Q29uZmlnLCBTZXRMYXJnZUZpbGVDb25maWcsIFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XLFxuICAgIFNUT1JBR0VfV1JPTkdfUk9VVEUsIFNUT1JBR0VfTk9UX0NPTkZJR1VSRUQsIEZVTExfUk9VVEUsIFZBUklBQkxFX1NIQVJELCBMQVJHRV9TRVRfVEhSRVNIT0xELCBidWZmZXJDaHVua1N0cmVhbSxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgY29weUFyY2hpdmVGaWxlIH0gZnJvbSBcIi4uL2FyY2hpdmVIZWxwZXJzXCI7XG5pbXBvcnQge1xuICAgIFJPVVRJTkdfRklMRSwgcGFyc2VIb3N0ZWRVcmwsIHBhcnNlQmFja2JsYXplVXJsLCBwYXJzZVJvdXRpbmdEYXRhLCBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZyxcbiAgICBub3JtYWxpemVSZW1vdGVDb25maWcsIG5vcm1hbGl6ZVNvdXJjZSxcbiAgICBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcGFyc2VWYXJpYWJsZVJvdXRlLCBnZXRCdWNrZXRCYXNlVXJsLCBidWlsZEZpbGVVcmwsXG59IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNVcmwgfSBmcm9tIFwiLi9BcmNoaXZlc1VybFwiO1xuaW1wb3J0IHsgU29ja2V0RnVuY3Rpb24gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL1NvY2tldEZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1JlbW90ZSwgcGFyc2VTdG9yYWdlVXJsLCBhdXRoZW50aWNhdGVTdG9yYWdlIH0gZnJvbSBcIi4vQXJjaGl2ZXNSZW1vdGVcIjtcbmltcG9ydCB7IFNlcnZlckJ1Y2tldEluZm8sIEFjdGl2ZUJ1Y2tldEluZm8gfSBmcm9tIFwiLi9zdG9yYWdlU2VydmVyU3RhdGVcIjtcbmltcG9ydCB7IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLCBTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEIH0gZnJvbSBcIi4vc3RvcmFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFNvdXJjZVdyYXBwZXIgfSBmcm9tIFwiLi9zb3VyY2VXcmFwcGVyXCI7XG5pbXBvcnQgeyBDaGFpblN0YXRlLCBDaGFpblN0YXRlTWFuYWdlciB9IGZyb20gXCIuL2NoYWluU3RhcnR1cFwiO1xuaW1wb3J0IHsgTG9nRmlsZUluZm8sIGRlY29kZUxvZ0ZpbGUsIGNyZWF0ZUxvZ1NlYXJjaGVyIH0gZnJvbSBcIi4uL1N0cmVhbWluZ0xvZ3NcIjtcbmltcG9ydCB7IGZvcm1hdFRpbWUsIGZvcm1hdERhdGVUaW1lRGV0YWlsZWQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuXG4vLyBIb3cgbWFueSBleHRyYSBmdWxsIHBhc3NlcyBvdmVyIHRoZSBzb3VyY2VzIGZhbGxiYWNrIGRpc3BhdGNoIG1ha2VzIHdoZW4gRVZFUlkgc291cmNlIGluIGEgcGFzcyBmYWlsZWQsIGJlZm9yZSB0aGUgb3BlcmF0aW9uIHRocm93cyAoc2VlIEdldENvbmZpZy5yZXRyaWVzKSAtIG1vc3QgcmVxdWVzdHMgc2hvdWxkbid0IGZhaWwgYXQgYWxsLCBzbyBhIGNvdXBsZSBvZiBibGFua2V0IHJldHJpZXMgYnV5cyBhdmFpbGFiaWxpdHkgZm9yIGFsbW9zdCBub3RoaW5nXG5jb25zdCBERUZBVUxUX0ZBTExCQUNLX1JFVFJJRVMgPSAzO1xuY29uc3QgRkFMTEJBQ0tfUkVUUllfREVMQVkgPSAyICogMTAwMDtcbmNvbnN0IFdST05HX1RBUkdFVF9CT1VOREFSWV9XSU5ET1cgPSAzMCAqIDEwMDA7XG5jb25zdCBXUk9OR19UQVJHRVRfQk9VTkRBUllfUkVUUllfREVMQVkgPSAxNSAqIDEwMDA7XG5jb25zdCBDT05GSUdfUkVGUkVTSF9USFJPVFRMRSA9IDMwICogMTAwMDtcbmNvbnN0IFBSSU1BUllfUkVUUllfVElNRU9VVCA9IDMwICogMTAwMDtcbmNvbnN0IFBSSU1BUllfUkVUUllfREVMQVkgPSAyICogMTAwMDtcbmNvbnN0IENPVkVSSU5HX1JFVFJZX1RJTUVPVVQgPSAzMCAqIDEwMDA7XG5jb25zdCBDT1ZFUklOR19SRVRSWV9ERUxBWSA9IDUgKiAxMDAwO1xuLy8gU21hcnQgdGltZW91dHM6IGFuIGF0dGVtcHQgZ2V0cyB0aGlzIGxvbmcgdG8gcHJvZHVjZSBhbnl0aGluZyBiZWZvcmUgd2UgcHJvYmUgZ2V0SW5mbyBmb3IgdGhlIGZpbGUncyBzaXplIChhbmQgdGhlIHByb2JlIGl0c2VsZiBnZXRzIHRoZSBzYW1lIHdpbmRvdylcbmNvbnN0IFNNQVJUX1RJTUVPVVRfUFJPQkUgPSA2MCAqIDEwMDA7XG4vLyBWZXJ5IGdlbmVyb3VzIGFzc3VtZWQgdHJhbnNmZXIgcmF0ZXMgLSB0aGUgcmVzdWx0aW5nIGRlYWRsaW5lIGV4aXN0cyB0byBjYXRjaCBzdHVjayBzb3VyY2VzLCBub3Qgc2xvdyBvbmVzXG5jb25zdCBTTUFSVF9USU1FT1VUX0RPV05MT0FEX0JZVEVTX1BFUl9TRUNPTkQgPSAxMDI0ICogMTAyNDtcbmNvbnN0IFNNQVJUX1RJTUVPVVRfVVBMT0FEX0JZVEVTX1BFUl9TRUNPTkQgPSA1MTIgKiAxMDI0O1xuLy8gTWFya2VyIGluIHNtYXJ0LXRpbWVvdXQgZXJyb3JzLCBzbyB0aGUgcmVhZCBsb29wIGNhbiBsb2cgdGhlbSBhbmQgY29udGludWUgd2l0aCB0aGUgb3RoZXIgc291cmNlcyAoYSBjb25uZWN0ZWQgc291cmNlJ3Mgb3RoZXIgZXJyb3JzIHN0aWxsIHRocm93KVxuY29uc3QgU01BUlRfVElNRU9VVF9NQVJLRVIgPSBcIkFSQ0hJVkVTX1NNQVJUX1RJTUVPVVRfYzQxYTlkXCI7XG5cbi8vIFNpemVzIGEgZ2VuZXJvdXMgcGVyLWF0dGVtcHQgZGVhZGxpbmUuIEdldC1zdHlsZSBjYWxscyBwYXNzIHBhdGg6IHRoZSBzaXplIGlzIG9ubHkgZmV0Y2hlZCAodmlhIGdldEluZm8pIHdoZW4gdGhlIGNhbGwgdHVybnMgb3V0IHRvIGJlIHNsb3cuIFNldC1zdHlsZSBjYWxscyBwYXNzIHVwbG9hZEJ5dGVzLCB3aGljaCB0aGV5IGFscmVhZHkga25vdy5cbnR5cGUgU21hcnRUaW1lb3V0ID0ge1xuICAgIHBhdGg/OiBzdHJpbmc7XG4gICAgdXBsb2FkQnl0ZXM/OiBudW1iZXI7XG4gICAgLy8gTmFtZXMgdGhlIG9wZXJhdGlvbiBpbiB0aW1lb3V0IGVycm9ycyAtIHdpdGhvdXQgaXQgYSBkZWxldGlvbiAoYSB0b21ic3RvbmUgd3JpdGUsIHVwbG9hZEJ5dGVzIDApIHJlYWRzIGFzIFwiVXBsb2FkIG9mIDAgYnl0ZXNcIiwgd2hpY2ggbG9va3MgbGlrZSBhIGJ1ZyByYXRoZXIgdGhhbiBhIGRlbGV0ZVxuICAgIGxhYmVsPzogc3RyaW5nO1xufTtcblxuLyoqIFRoZSBhZGRyZXNzLCBwb3J0LCBhY2NvdW50LCBhbmQgYnVja2V0IG5hbWUgYSBidWNrZXQgcm91dGluZyBVUkwgYWRkcmVzc2VzLiBUaHJvd3Mgd2hlbiB0aGUgVVJMIGlzbid0IGEgaG9zdGVkIGJ1Y2tldCByb3V0aW5nIFVSTCAoaHR0cHM6Ly9ob3N0OnBvcnQvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvbikuICovXG5leHBvcnQgeyBwYXJzZUhvc3RlZFVybCwgcGFyc2VCYWNrYmxhemVVcmwsIGdldEJ1Y2tldEJhc2VVcmwgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcblxuLyoqIEEgY2xpZW50IGZvciBPTkUgc291cmNlIC0gc2VlIHN0b3JlU291cmNlcy50cy4gUmUtZXhwb3J0ZWQgaGVyZSBiZWNhdXNlIGEgY2hhaW4gaXMgYnVpbHQgb3V0IG9mIHRoZW0uICovXG5leHBvcnQgeyBjcmVhdGVBcGlBcmNoaXZlcyB9IGZyb20gXCIuL3N0b3JlU291cmNlc1wiO1xuXG5leHBvcnQgdHlwZSBBcmNoaXZlc0NoYWluT3B0aW9ucyA9IHtcbiAgICAvKiogT3V0c2lkZSBvZiBub2RlIHdlIGRlZmF1bHQgdG8gcmVhZC1vbmx5IGRvd25sb2FkcyBvdmVyIHRoZSBwdWJsaWMgVVJMcyAobm8gQVBJIGNvbm5lY3Rpb24pIHdoZW4gdGhlIGNvbmZpZyBoYXMgcHVibGljIHNvdXJjZXMuIFNldCB0aGlzIHRvIGNvbm5lY3QgdG8gdGhlIEFQSSBhbnl3YXkgLSBuZWVkZWQgZm9yIHdyaXRpbmcsIGxpc3RpbmcsIGFuZCBhbnkgb3RoZXIgb3BlcmF0aW9uIHRoZSBwbGFpbiBVUkwgZm9ybSBjYW5ub3Qgc2VydmUuICovXG4gICAgZGlyZWN0Q29ubmVjdD86IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBjb25maWdXaW5kb3dDdXJyZW50KGNvbmZpZzogU291cmNlQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgbGV0IFtzdGFydCwgZW5kXSA9IGNvbmZpZy52YWxpZFdpbmRvdztcbiAgICByZXR1cm4gc3RhcnQgPD0gbm93ICYmIG5vdyA8IGVuZDtcbn1cblxuZnVuY3Rpb24gbWF0ZXJpYWxpemVTaGFyZEtleShrZXk6IHN0cmluZywgdGFyZ2V0OiBTb3VyY2VXcmFwcGVyKTogc3RyaW5nIHtcbiAgICBsZXQgW3N0YXJ0LCBlbmRdID0gdGFyZ2V0LmNvbmZpZy5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgIHJldHVybiBrZXkucmVwbGFjZShWQVJJQUJMRV9TSEFSRCwgVkFSSUFCTEVfU0hBUkQgKyBcIl9cIiArIChzdGFydCArIE1hdGgucmFuZG9tKCkgKiAoZW5kIC0gc3RhcnQpKSk7XG59XG5cbi8qKiBDb3ZlcnMgdGhlIHdob2xlIGtleSBzcGFjZSB3aXRoIHRoZSBBVVRIT1JJVEFUSVZFIHNvdXJjZXM6IGZvciBlYWNoIHVuY292ZXJlZCBwb2ludCwgdGhlIEZJUlNUIHNvdXJjZSBpbiBjb25maWcgb3JkZXIgd2hvc2Ugcm91dGUgY29udGFpbnMgaXQgLSB0aGUgZXhhY3Qgc2VsZWN0aW9uIGV2ZXJ5IHJlYWQgYW5kIHdyaXRlIHVzZXMsIHNvIGxpc3RpbmdzIGNvbWUgZnJvbSB0aGUgc2FtZSBub2RlcyB3cml0ZXMgd2VudCB0byAocmVhZC15b3VyLXdyaXRlcykuIE5ldmVyIFwiZmV3ZXN0XCIgb3IgXCJ3aWRlc3RcIjogcHJlZmVycmluZyBhIHdpZGUgcmVhZCByZXBsaWNhIG92ZXIgdGhlIHJvdXRlZCB3cml0ZSBzaGFyZHMgd291bGQgc2VydmUgbGlzdGluZ3MgZnJvbSBhIG5vZGUgdGhhdCBvbmx5IGhhcyB0aGUgZGF0YSBzZWNvbmQtaGFuZC4gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgY2FuZGlkYXRlcyBsZWF2ZSBhIGdhcC4gKi9cbmZ1bmN0aW9uIGNvdmVyUm91dGVzKGNhbmRpZGF0ZXM6IFNvdXJjZVdyYXBwZXJbXSk6IFNvdXJjZVdyYXBwZXJbXSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNob3NlbjogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgbGV0IGNvdmVyZWQgPSAwO1xuICAgIHdoaWxlIChjb3ZlcmVkIDwgMSkge1xuICAgICAgICBsZXQgbmV4dCA9IGNhbmRpZGF0ZXMuZmluZCh4ID0+IHJvdXRlQ29udGFpbnMoeC5jb25maWcucm91dGUsIGNvdmVyZWQpKTtcbiAgICAgICAgaWYgKCFuZXh0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjaG9zZW4ucHVzaChuZXh0KTtcbiAgICAgICAgbGV0IFssIGVuZF0gPSBuZXh0LmNvbmZpZy5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgICAgICBjb3ZlcmVkID0gZW5kO1xuICAgIH1cbiAgICByZXR1cm4gY2hvc2VuO1xufVxuXG4vKiogUkVBRFMgT05MWS4gRHJvcHMgc291cmNlcyB0aGF0IHJlY2VudGx5IGZhaWxlZCB3aGlsZSBkaXNjb25uZWN0ZWQgLSB1bmxlc3MgdGhhdCB3b3VsZCBsZWF2ZSBub3RoaW5nLCBpbiB3aGljaCBjYXNlIGEgZG93biBzb3VyY2UgaXMgc3RpbGwgYmV0dGVyIHRoYW4gbm8gc291cmNlLCBhbmQgd2UgcmV0cnkgaXQgaW1tZWRpYXRlbHkuIE5ldmVyIGFwcGxpZXMgdG8gd3JpdGVzIChvciBub0ZhbGxiYWNrcyByZWFkcyBvZiB0aGUgd3JpdGUgdGFyZ2V0KTogdGhlIHdyaXRlIG5vZGUgaXMgc3RyaWN0bHkgdGhlIEZJUlNUIHNvdXJjZSBtYXRjaGluZyB0aGUgcm91dGUgYW5kIHZhbGlkIHdpbmRvdywgcmVnYXJkbGVzcyBvZiBjb25uZWN0aXZpdHkgLSBhIGNsaWVudCdzIGZsYWt5IHZpZXcgb2YgdGhlIG5ldHdvcmsgbXVzdCBuZXZlciBzY2F0dGVyIHdyaXRlcyBhY3Jvc3MgdGhlIGNoYWluIChzcGVjOiBjbGllbnQgd3JpdGVzIGFyZSBjb25zaXN0ZW50LCBjbGllbnQgcmVhZHMgYXJlIHJlZHVuZGFudCkuICovXG5mdW5jdGlvbiBwcmVmZXJVc2FibGUoc291cmNlczogU291cmNlV3JhcHBlcltdKTogU291cmNlV3JhcHBlcltdIHtcbiAgICBsZXQgdXNhYmxlID0gc291cmNlcy5maWx0ZXIoeCA9PiAheC5pc09uQ29vbGRvd24oKSk7XG4gICAgcmV0dXJuIHVzYWJsZS5sZW5ndGggJiYgdXNhYmxlIHx8IHNvdXJjZXM7XG59XG5cbmV4cG9ydCBjbGFzcyBBcmNoaXZlc0NoYWluIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICAvLyBUaGUgY2hhaW4ncyBzdGF0ZSwgYW5kIGV2ZXJ5dGhpbmcgYWJvdXQgaGF2aW5nIG9uZSAoaW5pdCArIGl0cyByZXRyeSwgY29uZmlnIHBvbGxpbmcvYWRvcHRpb24sIGF2YWlsYWJpbGl0eSByZWNoZWNrcywgdGhlIGNvbmZpZyByZXdyaXRlIGxvb3ApLCBsaXZlcyBpbiB0aGUgbWFuYWdlciAtIHdoYXQgc3RheXMgaW4gdGhpcyBjbGFzcyBpcyBkaXNwYXRjaCBvdmVyIHRoYXQgc3RhdGVcbiAgICBwcml2YXRlIHN0YXRlOiBDaGFpblN0YXRlTWFuYWdlcjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogUmVtb3RlQ29uZmlnIHwgUmVtb3RlQ29uZmlnQmFzZSwgb3B0aW9ucz86IEFyY2hpdmVzQ2hhaW5PcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgQ2hhaW5TdGF0ZU1hbmFnZXIoe1xuICAgICAgICAgICAgY29uZmlndXJlZDogbm9ybWFsaXplUmVtb3RlQ29uZmlnKGNvbmZpZyksXG4gICAgICAgICAgICBkZWJ1Z05hbWU6ICgpID0+IHRoaXMuZ2V0RGVidWdOYW1lKCksXG4gICAgICAgICAgICBkaXJlY3RDb25uZWN0OiBvcHRpb25zPy5kaXJlY3RDb25uZWN0LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICBsZXQgdXJscyA9IHRoaXMuc3RhdGUuYWN0aXZlQ29uZmlnLnNvdXJjZXMubWFwKHggPT4gdHlwZW9mIHggPT09IFwic3RyaW5nXCIgJiYgeCB8fCAoeCBhcyBTb3VyY2VDb25maWcpLnVybCk7XG4gICAgICAgIHJldHVybiBgY2hhaW4gJHt1cmxzLmpvaW4oXCIsIFwiKX1gO1xuICAgIH1cblxuICAgIC8vIFRoZSBPTkUgZGlzcGF0Y2ggZm9yIGV2ZXJ5IG9wZXJhdGlvbjogbm8gZmFsbGJhY2tzIChhbGwgd3JpdGVzIGJ5IGRlZmF1bHQsIGFuZCBub0ZhbGxiYWNrcyByZWFkcykgLT4gdGhlIHByaW1hcnkgbm9kZSBvbmx5LCB2aWEgcnVuUHJpbWFyeTsgZXZlcnl0aGluZyBlbHNlIC0+IHRoZSBzaGFyZWQgZmFsbGJhY2sgbG9vcCwgdHJ5aW5nIHNvdXJjZXMgaW4gY29uZmlnIG9yZGVyIChvciBsYXRlbmN5IG9yZGVyIGZvciBmYXN0IHJlYWRzKSBhbmQgb25seSBtb3Zpbmcgb24gd2hlbiBvbmUgZmFpbHMuIFdyaXRlcyBpbiB0aGUgbG9vcCBkaWZmZXIgZnJvbSByZWFkcyBvbmx5IGluIGNhbGxpbmcgc291cmNlLndyaXRlLlxuICAgIHByaXZhdGUgYXN5bmMgcnVuPFQ+KHN0YXRlOiBDaGFpblN0YXRlLCBjb25maWc6IHsgYXBpT25seT86IGJvb2xlYW47IHdyaXRlPzogYm9vbGVhbjsgcm91dGU/OiBudW1iZXI7IG5vRmFsbGJhY2tzPzogYm9vbGVhbjsgZmFsbGJhY2tzPzogYm9vbGVhbjsgcmV0cmllcz86IG51bWJlcjsgZmFzdD86IGJvb2xlYW47IHRpbWVvdXQ/OiBTbWFydFRpbWVvdXQgfSwgcnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcywgc291cmNlVXJsOiBzdHJpbmcpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5mYXN0ICYmIGNvbmZpZy5ub0ZhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmYXN0IGFuZCBub0ZhbGxiYWNrcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiBub0ZhbGxiYWNrcyBvbmx5IGNvbnNpZGVycyBvbmUgc291cmNlICh0aGUgd3JpdGUgbm9kZSksIHNvIHRoZXJlIGlzIG5vIG9yZGVyIHRvIHNwZWVkIHVwYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5ub0ZhbGxiYWNrcyB8fCBjb25maWcud3JpdGUgJiYgIWNvbmZpZy5mYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1blByaW1hcnkoY29uZmlnLCBydW4pO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRyaWVzID0gY29uZmlnLnJldHJpZXM7XG4gICAgICAgIGlmIChyZXRyaWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHJpZXMgPSBERUZBVUxUX0ZBTExCQUNLX1JFVFJJRVM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IGZhbHNlO1xuICAgICAgICBsZXQgcmV0cmllZFdyb25nVGFyZ2V0ID0gZmFsc2U7XG4gICAgICAgIGxldCByZXRyaWVkUGFzc2VzID0gMDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBsZXQgY2FuZGlkYXRlcyA9IHN0YXRlLnNvdXJjZXMuZmlsdGVyKHNvdXJjZSA9PlxuICAgICAgICAgICAgICAgIChjb25maWcucm91dGUgPT09IHVuZGVmaW5lZCB8fCByb3V0ZUNvbnRhaW5zKHNvdXJjZS5jb25maWcucm91dGUsIGNvbmZpZy5yb3V0ZSkpXG4gICAgICAgICAgICAgICAgJiYgY29uZmlnV2luZG93Q3VycmVudChzb3VyY2UuY29uZmlnKVxuICAgICAgICAgICAgICAgIC8vIEEgd3JpdGUtYmxvY2tlZCBzb3VyY2UgKHJlYWQtb25seSBtb2RlLCBiYWNrYmxhemUgd2l0aG91dCBjcmVkZW50aWFscykgY2FuIG5ldmVyIHRha2UgYSB3cml0ZSwgc28gaXQgaXMgbm90IGEgZmFsbGJhY2sgY2FuZGlkYXRlIC0gaXRzIHRocm93IHdvdWxkIGVuZCB0aGUgcGFzcyBlYXJseSAoaXQgY291bnRzIGFzIGNvbm5lY3RlZClcbiAgICAgICAgICAgICAgICAmJiAhKGNvbmZpZy53cml0ZSAmJiAoc291cmNlLndyaXRlQmxvY2tlZCB8fCAhc291cmNlLmFwaSkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IG9yZGVyZWQgPSBwcmVmZXJVc2FibGUoY2FuZGlkYXRlcyk7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmZhc3QpIHtcbiAgICAgICAgICAgICAgICBvcmRlcmVkID0gWy4uLm9yZGVyZWRdO1xuICAgICAgICAgICAgICAgIHNvcnQob3JkZXJlZCwgeCA9PiB4LmdldExhdGVuY3koKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgd3JvbmdUYXJnZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBvcmRlcmVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5hcGlPbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXBpID0gc291cmNlLmFwaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7c291cmNlLmNvbmZpZy51cmx9IGhhcyBVUkwtb25seSBhY2Nlc3MsIHdoaWNoIGNhbm5vdCBzZXJ2ZSB0aGlzIG9wZXJhdGlvbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bihhcGksIHNvdXJjZS5jb25maWcudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBseVNtYXJ0VGltZW91dChjb25maWcudGltZW91dCwgc291cmNlLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLndyaXRlKSByZXR1cm4gc291cmNlLndyaXRlKGFyY2hpdmVzID0+IHJ1bihhcmNoaXZlcywgc291cmNlLmNvbmZpZy51cmwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2UucmVhZChhcmNoaXZlcyA9PiBydW4oYXJjaGl2ZXMsIHNvdXJjZS5jb25maWcudXJsKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTTUFSVF9USU1FT1VUX01BUktFUikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFNvdXJjZSB0aW1lZCBvdXQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0sIGNvbnRpbnVpbmcgd2l0aCB0aGUgbmV4dCBzb3VyY2U6ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQSB3cm9uZy13aW5kb3cvcm91dGUvdW5jb25maWd1cmVkIHJlamVjdGlvbiBtZWFucyBPVVIgY29uZmlnIGRpc2FncmVlcyB3aXRoIHRoZSBzZXJ2ZXIncywgc28gZXZlcnkgc291cmNlIHdlJ2QgZmFsbCBiYWNrIHRvIGlzIGp1ZGdlZCBieSB0aGUgc2FtZSBzdGFsZSBjb25maWcgLSByZWZyZXNoIGl0IGFuZCByZXN0YXJ0IHRoZSBwYXNzIGluc3RlYWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKChtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XKSB8fCBtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfV1JPTkdfUk9VVEUpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9OT1RfQ09ORklHVVJFRCkpICYmICFyZXRyaWVkV3JvbmdUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZWRXcm9uZ1RhcmdldCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cm9uZ1RhcmdldCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByZXBhcmVXcm9uZ1RhcmdldFJldHJ5KHN0YXRlLCBtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XKSAmJiBcIndpbmRvd1wiIHx8IG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19ST1VURSkgJiYgXCJyb3V0ZVwiIHx8IFwidW5jb25maWd1cmVkXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2tzIG1lYW5zIGF2YWlsYWJpbGl0eSBhYm92ZSBldmVyeXRoaW5nOiBBTlkgZmFpbGluZyBzb3VyY2UgLSBkb3duLCBtaXNjb25maWd1cmVkLCByZWplY3RpbmcsIG1pZC1zd2l0Y2hvdmVyIC0gaXMgc2tpcHBlZCBhbmQgdGhlIG5leHQgY292ZXJpbmcgc291cmNlIHRha2VzIHRoZSBjYWxsLiBPbmx5IGV2ZXJ5IHNvdXJjZSBmYWlsaW5nIHRocm93cyAoYmVsb3cpLiBXaXRob3V0IGZhbGxiYWNrcywgYSBDT05ORUNURUQgc291cmNlJ3MgZXJyb3IgaXMgYSByZWFsIGFuc3dlciBhbmQgdGhyb3dzLlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmZhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU291cmNlIGZhaWxlZCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgZmFsbGluZyBiYWNrIHRvIHRoZSBuZXh0IHNvdXJjZTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzb3VyY2UuaXNDb25uZWN0ZWQoKSkgc291cmNlLm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaXNDb25uZWN0ZWQoKSkgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3cm9uZ1RhcmdldCkge1xuICAgICAgICAgICAgICAgIHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZWNoZWNrZWRBdmFpbGFiaWxpdHkpIHtcbiAgICAgICAgICAgICAgICByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhdGUucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgIHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQmxhbmtldCByZXRyeSBvZiB0aGUgd2hvbGUgcGFzcywgQU5ZIGVycm9yIChzZWUgR2V0Q29uZmlnLnJldHJpZXMpOiBtb3N0IHJlcXVlc3RzIHNob3VsZG4ndCBmYWlsIGF0IGFsbCwgc28gcmV0cnlpbmcgdGhlIHJhcmUgZmFpbHVyZSAtIHdoYXRldmVyIGl0IHdhcyAtIGJ1eXMgYXZhaWxhYmlsaXR5IGZvciBhbG1vc3Qgbm90aGluZ1xuICAgICAgICAgICAgaWYgKHJldHJpZWRQYXNzZXMgPCByZXRyaWVzKSB7XG4gICAgICAgICAgICAgICAgcmV0cmllZFBhc3NlcysrO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgRXZlcnkgc291cmNlIGZhaWxlZCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSR7Y29uZmlnLnJvdXRlICE9PSB1bmRlZmluZWQgJiYgYCAocm91dGUgJHtjb25maWcucm91dGV9KWAgfHwgXCJcIn07IHJldHJ5aW5nIHRoZSB3aG9sZSBwYXNzIGluICR7RkFMTEJBQ0tfUkVUUllfREVMQVkgLyAxMDAwfXMgKHJldHJ5ICR7cmV0cmllZFBhc3Nlc30gb2YgJHtyZXRyaWVzfSlgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShGQUxMQkFDS19SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZS5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFsbCBzb3VyY2VzIGZhaWxlZCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSR7Y29uZmlnLnJvdXRlICE9PSB1bmRlZmluZWQgJiYgYCAocm91dGUgJHtjb25maWcucm91dGV9KWAgfHwgXCJcIn0gKGFmdGVyICR7cmV0cmllZFBhc3Nlc30gcmV0ciR7cmV0cmllZFBhc3NlcyA9PT0gMSAmJiBcInlcIiB8fCBcImllc1wifSk6ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIikgfHwgXCJubyBzb3VyY2VzIGF2YWlsYWJsZVwifWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gV3JpdGVzIGFuZCBub0ZhbGxiYWNrcyByZWFkcyBhcmUgdGhlIHNhbWUgY2FzZTogdGFrZSB0aGUgYXV0aG9yaXRhdGl2ZSBub2RlIC0gc3RyaWN0bHkgdGhlIGZpcnN0IHNvdXJjZSBtYXRjaGluZyB0aGUgcm91dGUgYW5kIHZhbGlkIHdpbmRvdywgd2hldGhlciBpdCBpcyB1cCBvciBkb3duIC0gYW5kIHVzZSBpdCwgbmV2ZXIgZmFsbGluZyBiYWNrIHRvIGFub3RoZXIgbm9kZS4gSXQncyBpbXBvcnRhbnQgdGhhdCB3cml0aW5nIGFsd2F5cyBhY2Nlc3NlcyB0aGUgc2FtZSBub2RlIGV2ZXJ5d2hlcmUsIGV2ZW4gaWYgdGhhdCBub2RlIGlzIGRvd24gLSBvdGhlcndpc2Ugd2UncmUganVzdCB3cml0aW5nIGludG8gdGhlIHZvaWQsIGFuZCB3aG8ga25vd3MgaWYgdGhlIHdyaXRlcyB3aWxsIGV2ZW4gYmUgYWNjZXB0ZWQsIG9yIGNsb2JiZXJlZCwgb3Igd2hhdDsgYW5kIG5vRmFsbGJhY2tzIHJlYWRzIHdhbnQgdGhlIHNhbWUgbm9kZSBwcmVjaXNlbHkgYmVjYXVzZSBpdCBpcyB0aGUgb25lIHdyaXRlcyB0YXJnZXQuIEEgc2xvdyBjYWxsIGlzIGFsbW9zdCBhbHdheXMgYmV0dGVyIHRoYW4gdGhyb3dpbmcsIHNvIGEgZmFpbGluZyBwcmltYXJ5IGlzIHJldHJpZWQgKHRoZSBTQU1FIG5vZGUsIHJlLXJlc29sdmVkIGVhY2ggYXR0ZW1wdCBzaW5jZSBhIGNvbmZpZyByZWZyZXNoIGNhbiBjaGFuZ2Ugd2hpY2ggc291cmNlIGlzIHByaW1hcnkpIHVudGlsIHRoZSBkZWFkbGluZSwgdGhlbiB0aHJvd3MuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5QcmltYXJ5PFQ+KGNvbmZpZzogeyB3cml0ZT86IGJvb2xlYW47IHJvdXRlPzogbnVtYmVyOyB0aW1lb3V0PzogU21hcnRUaW1lb3V0IH0sIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMsIHNvdXJjZVVybDogc3RyaW5nKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCByZXRyaWVkV3JvbmdXaW5kb3cgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJldHJpZWRXcm9uZ1JvdXRlID0gZmFsc2U7XG4gICAgICAgIGxldCByZXRyaWVkTm90Q29uZmlndXJlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgUFJJTUFSWV9SRVRSWV9USU1FT1VUO1xuICAgICAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgICAgICBsZXQgYXR0ZW1wdFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBzdGF0ZS5zb3VyY2VzLmZpbmQoeCA9PiBjb25maWdXaW5kb3dDdXJyZW50KHguY29uZmlnKSAmJiAoY29uZmlnLnJvdXRlID09PSB1bmRlZmluZWQgfHwgcm91dGVDb250YWlucyh4LmNvbmZpZy5yb3V0ZSwgY29uZmlnLnJvdXRlKSkpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHZhbGlkIHNvdXJjZSBjb3ZlcnMgdGhpcyByZXF1ZXN0LiBObyBzb3VyY2UgaXMgdGhlICR7Y29uZmlnLndyaXRlICYmIFwid3JpdGUgdGFyZ2V0XCIgfHwgXCJwcmltYXJ5IHJlYWQgc291cmNlXCJ9IGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9JHtjb25maWcucm91dGUgIT09IHVuZGVmaW5lZCAmJiBgIChyb3V0ZSAke2NvbmZpZy5yb3V0ZX0pYCB8fCBcIlwifSAoZXZlcnkgc291cmNlIGlzIG91dHNpZGUgaXRzIHZhbGlkIHdpbmRvdyBvciBvdXRzaWRlIHRoZSBrZXkncyByb3V0ZSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcHJpbWFyeSA9IHRhcmdldDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBseVNtYXJ0VGltZW91dChjb25maWcudGltZW91dCwgcHJpbWFyeSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLndyaXRlKSByZXR1cm4gcHJpbWFyeS53cml0ZShhcmNoaXZlcyA9PiBydW4oYXJjaGl2ZXMsIHByaW1hcnkuY29uZmlnLnVybCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJpbWFyeS5yZWFkKGFyY2hpdmVzID0+IHJ1bihhcmNoaXZlcywgcHJpbWFyeS5jb25maWcudXJsKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XKSAmJiAhcmV0cmllZFdyb25nV2luZG93KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJpZWRXcm9uZ1dpbmRvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVdyb25nVGFyZ2V0UmV0cnkoc3RhdGUsIFwid2luZG93XCIpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19ST1VURSkgJiYgIXJldHJpZWRXcm9uZ1JvdXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJpZWRXcm9uZ1JvdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZSwgXCJyb3V0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfTk9UX0NPTkZJR1VSRUQpICYmICFyZXRyaWVkTm90Q29uZmlndXJlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXRyaWVkTm90Q29uZmlndXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVdyb25nVGFyZ2V0UmV0cnkoc3RhdGUsIFwidW5jb25maWd1cmVkXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAmJiAhdGFyZ2V0LmlzQ29ubmVjdGVkKCkpIHRhcmdldC5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnLndyaXRlICYmIHRhcmdldCAmJiAoYXR0ZW1wdCA9PT0gMSB8fCBhdHRlbXB0ICUgMyA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlYXNvbiB3ZSB0cnkgdGhlIEhUVFAgcmVxdWVzdDogaHR0cHNSZXF1ZXN0IGhhcyBiZXR0ZXIgRE5TIHJldHJ5aW5nIGNhcGFiaWxpdGllcyB0aGFuIG91ciBXZWJTb2NrZXQgc2VydmVyICh3ZSBoYXZlIG1vcmUgY29udHJvbCBvdmVyIGl0KSwgc28ganVzdCB1c2luZyBpdCBjYW4gZml4IHNvbWUgRE5TIGlzc3Vlcywgd2hpY2ggY2FuIHByb3BhZ2F0ZSB0byBmaXggdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBJdCBpcyBzdGlsbCB0aGUgcHJpbWFyeSBzb3VyY2UncyBvd24gZGF0YSwgc28gdGhlIG5vLWZhbGxiYWNrIHNlbWFudGljcyBob2xkIC0gYW5kIEFyY2hpdmVzVXJsIGhhcyBubyBzZXR1cCBjb3N0LCBzbyBtYWtpbmcgb25lIG9uIHRoZSBzcG90IGlzIGZpbmUuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKHRhcmdldC51cmwgfHwgbmV3IEFyY2hpdmVzVXJsKGdldEJ1Y2tldEJhc2VVcmwodGFyZ2V0LmNvbmZpZy51cmwpKSwgdGFyZ2V0LmNvbmZpZy51cmwpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0OiB0aGUgcHJpbWFyeSdzIGVycm9yICh0aHJvd24gYXQgdGhlIGRlYWRsaW5lKSBpcyB0aGUgcmVhbCBvbmVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEF0IG1vc3Qgb25lIGF0dGVtcHQgcGVyIGludGVydmFsLCBpbiBjYXNlIHRoZSBmYWlsdXJlIGlzIGZhc3RcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KE1hdGgubWF4KDAsIGF0dGVtcHRTdGFydCArIFBSSU1BUllfUkVUUllfREVMQVkgLSBEYXRlLm5vdygpKSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBSYWNlcyBjYWxsIGFnYWluc3QgYSBzaXplLWJhc2VkIGRlYWRsaW5lLiBVcGxvYWRzIGtub3cgdGhlaXIgc2l6ZSB1cGZyb250OyBnZXRzIGFyZSBnaXZlbiBTTUFSVF9USU1FT1VUX1BST0JFIHRvIHByb2R1Y2UgYW55dGhpbmcsIGFuZCBvbmx5IHRoZW4gaXMgdGhlIGZpbGUncyBpbmZvIGZldGNoZWQgKGZyb20gdGhlIHNhbWUgc291cmNlLCBpdHNlbGYgdGltZS1saW1pdGVkKSB0byBzaXplIHRoZSBkZWFkbGluZSAtIG1lYXN1cmVkIGZyb20gdGhlIGNhbGwncyBzdGFydCwgc28gYSBzb3VyY2UgdGhhdCB3YXMgc2xvdyBiZWZvcmUgdGhlIHByb2JlIGRvZXNuJ3QgZ2V0IHRoZSBmdWxsIGFsbG93YW5jZSBhZ2Fpbi4gVGltZWQtb3V0IGNhbGxzIGtlZXAgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZCAodGhleSBjYW5ub3QgYmUgY2FuY2VsbGVkKSBidXQgdGhlaXIgZXZlbnR1YWwgcmVzdWx0IGlzIGlnbm9yZWQuICovXG4gICAgcHJpdmF0ZSBhc3luYyBhcHBseVNtYXJ0VGltZW91dDxUPih0aW1lb3V0OiBTbWFydFRpbWVvdXQgfCB1bmRlZmluZWQsIHNvdXJjZTogU291cmNlV3JhcHBlciwgY2FsbDogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAoIXRpbWVvdXQpIHJldHVybiBhd2FpdCBjYWxsKCk7XG4gICAgICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBjYWxsUHJvbWlzZSA9IGNhbGwoKTtcbiAgICAgICAgLy8gQW4gYWJhbmRvbmVkIGNhbGwgbXVzdCBub3Qgc3VyZmFjZSBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIHdoZW4gaXQgZXZlbnR1YWxseSBmYWlsc1xuICAgICAgICBsZXQgYWJhbmRvbiA9ICgpID0+IHZvaWQgY2FsbFByb21pc2UudGhlbigoKSA9PiB7IH0sICgpID0+IHsgfSk7XG4gICAgICAgIGlmICh0aW1lb3V0LnVwbG9hZEJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIEEgZmxhdCBiYXNlIHBsdXMgdGhlIHByZWRpY3RlZCB0cmFuc2ZlciB0aW1lLCBzbyB0aW55IHVwbG9hZHMgc3RpbGwgZ2V0IHRoZSBmdWxsIGJhc2Ugd2luZG93XG4gICAgICAgICAgICBsZXQgYWxsb3dlZCA9IFNNQVJUX1RJTUVPVVRfUFJPQkUgKyB0aW1lb3V0LnVwbG9hZEJ5dGVzIC8gU01BUlRfVElNRU9VVF9VUExPQURfQllURVNfUEVSX1NFQ09ORCAqIDEwMDA7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtjYWxsUHJvbWlzZS50aGVuKHZhbHVlID0+ICh7IHZhbHVlIH0pKSwgZGVsYXkoYWxsb3dlZCkudGhlbigoKSA9PiB1bmRlZmluZWQpXSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgYWJhbmRvbigpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NNQVJUX1RJTUVPVVRfTUFSS0VSfSBVcGxvYWQgdGltZWQgb3V0LiAke3RpbWVvdXQubGFiZWwgfHwgYFVwbG9hZCBvZiAke3RpbWVvdXQudXBsb2FkQnl0ZXN9IGJ5dGVzYH0gdG8gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHRpbWVkIG91dCBhZnRlciAke0RhdGUubm93KCkgLSBzdGFydH1tcyAoYWxsb3dlZCAke01hdGgucm91bmQoYWxsb3dlZCl9bXM6ICR7U01BUlRfVElNRU9VVF9QUk9CRX1tcyBiYXNlIHBsdXMgdHJhbnNmZXIgYXQgYW4gYXNzdW1lZCAke1NNQVJUX1RJTUVPVVRfVVBMT0FEX0JZVEVTX1BFUl9TRUNPTkR9IGJ5dGVzL3MpYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGF0aCA9IHRpbWVvdXQucGF0aDtcbiAgICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuIGF3YWl0IGNhbGxQcm9taXNlO1xuICAgICAgICBsZXQgZmlyc3QgPSBhd2FpdCBQcm9taXNlLnJhY2UoW2NhbGxQcm9taXNlLnRoZW4odmFsdWUgPT4gKHsgdmFsdWUgfSkpLCBkZWxheShTTUFSVF9USU1FT1VUX1BST0JFKS50aGVuKCgpID0+IHVuZGVmaW5lZCldKTtcbiAgICAgICAgaWYgKGZpcnN0KSByZXR1cm4gZmlyc3QudmFsdWU7XG4gICAgICAgIGxldCBwcm9iZUVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBpbmZvOiB7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5mbyA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgICAgICAgc291cmNlLnJlYWQoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZ2V0SW5mbyhwYXRoKSkudGhlbih4ID0+ICh7IHNpemU6IHggJiYgeC5zaXplIHx8IDAgfSkpLFxuICAgICAgICAgICAgICAgIGRlbGF5KFNNQVJUX1RJTUVPVVRfUFJPQkUpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBwcm9iZUVycm9yID0gU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgICAgIGFiYW5kb24oKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTTUFSVF9USU1FT1VUX01BUktFUn0gUmVhZCB0aW1lZCBvdXQgd2l0aCBubyBzaXplIHByb2JlLiBSZWFkIG9mICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9IGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9OiBubyByZXN1bHQgYWZ0ZXIgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXMsIGFuZCBnZXRJbmZvICR7cHJvYmVFcnJvciAmJiBgZmFpbGVkICgke3Byb2JlRXJyb3J9KWAgfHwgYGNvdWxkIG5vdCBhbnN3ZXIgd2l0aGluICR7U01BUlRfVElNRU9VVF9QUk9CRX1tcyBlaXRoZXJgfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbGxvd2VkID0gTWF0aC5tYXgoU01BUlRfVElNRU9VVF9QUk9CRSwgaW5mby5zaXplIC8gU01BUlRfVElNRU9VVF9ET1dOTE9BRF9CWVRFU19QRVJfU0VDT05EICogMTAwMCk7XG4gICAgICAgIGxldCByZW1haW5pbmcgPSBzdGFydCArIGFsbG93ZWQgLSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgICAgICAgbGV0IHNlY29uZCA9IGF3YWl0IFByb21pc2UucmFjZShbY2FsbFByb21pc2UudGhlbih2YWx1ZSA9PiAoeyB2YWx1ZSB9KSksIGRlbGF5KHJlbWFpbmluZykudGhlbigoKSA9PiB1bmRlZmluZWQpXSk7XG4gICAgICAgICAgICBpZiAoc2Vjb25kKSByZXR1cm4gc2Vjb25kLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGFiYW5kb24oKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NNQVJUX1RJTUVPVVRfTUFSS0VSfSBSZWFkIHRpbWVkIG91dC4gUmVhZCBvZiAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSAoJHtpbmZvLnNpemV9IGJ5dGVzKSBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSB0aW1lZCBvdXQgYWZ0ZXIgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXMgKGFsbG93ZWQgJHtNYXRoLnJvdW5kKGFsbG93ZWQpfW1zIGZyb20gdGhlIGNhbGwncyBzdGFydCwgYXQgYW4gYXNzdW1lZCAke1NNQVJUX1RJTUVPVVRfRE9XTkxPQURfQllURVNfUEVSX1NFQ09ORH0gYnl0ZXMvcylgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxhc3RDb25maWdSZWZyZXNoID0gMDtcbiAgICBwcml2YXRlIGFzeW5jIHByZXBhcmVXcm9uZ1RhcmdldFJldHJ5KHN0YXRlOiBDaGFpblN0YXRlLCBraW5kOiBcIndpbmRvd1wiIHwgXCJyb3V0ZVwiIHwgXCJ1bmNvbmZpZ3VyZWRcIik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoa2luZCA9PT0gXCJ3aW5kb3dcIikge1xuICAgICAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgbmVhckJvdW5kYXJ5ID0gc3RhdGUuc291cmNlcy5zb21lKHNvdXJjZSA9PiBzb3VyY2UuY29uZmlnLnZhbGlkV2luZG93LnNvbWUodCA9PiB0ID4gMCAmJiB0IDwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgJiYgTWF0aC5hYnModCAtIG5vdykgPD0gV1JPTkdfVEFSR0VUX0JPVU5EQVJZX1dJTkRPVykpO1xuICAgICAgICAgICAgaWYgKG5lYXJCb3VuZGFyeSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBXcml0ZSByZWplY3RlZCBieSAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiByYWNlZCBhIHZhbGlkIHdpbmRvdyBib3VuZGFyeTsgd2FpdGluZyAke1dST05HX1RBUkdFVF9CT1VOREFSWV9SRVRSWV9ERUxBWSAvIDEwMDB9cyBhbmQgcmV0cnlpbmdgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShXUk9OR19UQVJHRVRfQk9VTkRBUllfUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdENvbmZpZ1JlZnJlc2ggPCBDT05GSUdfUkVGUkVTSF9USFJPVFRMRSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmxhc3RDb25maWdSZWZyZXNoID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IHJlYXNvbiA9IGtpbmQgPT09IFwid2luZG93XCIgJiYgXCJ3cm9uZyB2YWxpZCB3aW5kb3dcIiB8fCBraW5kID09PSBcInJvdXRlXCIgJiYgXCJ3cm9uZyByb3V0ZVwiIHx8IFwidGhlIHN0b3JlIGhhcyBubyBjb25maWd1cmF0aW9uIGVudHJ5IG9uIHRoYXQgc2VydmVyXCI7XG4gICAgICAgIGNvbnNvbGUubG9nKGBXcml0ZSByZWplY3RlZCBieSAke3RoaXMuZ2V0RGVidWdOYW1lKCl9ICgke3JlYXNvbn0pOiBvdXIgY29uZmlnIGRpc2FncmVlcyB3aXRoIHRoZSBzZXJ2ZXIncyAobGlrZWx5IHN0YWxlLCBvciBhIGRlcGxveSBzd2l0Y2hvdmVyKTsgcmVmcmVzaGluZyBpdCBhbmQgcmV0cnlpbmdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZS5yZWZyZXNoQWN0aXZlQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXF1ZXN0PFQ+KGNvbmZpZzogeyBhcGlPbmx5PzogYm9vbGVhbjsgd3JpdGU/OiBib29sZWFuOyByb3V0ZT86IG51bWJlcjsgbm9GYWxsYmFja3M/OiBib29sZWFuOyBmYWxsYmFja3M/OiBib29sZWFuOyByZXRyaWVzPzogbnVtYmVyOyBmYXN0PzogYm9vbGVhbjsgdGltZW91dD86IFNtYXJ0VGltZW91dCB9LCBydW46IChhcmNoaXZlczogSUFyY2hpdmVzLCBzb3VyY2VVcmw6IHN0cmluZykgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bihzdGF0ZSwgY29uZmlnLCBydW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB3YWl0aW5nRm9yQWNjZXNzKCk6IFByb21pc2U8eyBsaW5rOiBzdHJpbmc7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgLy8gQSBzb3VyY2Ugd2hvc2Ugd2luZG93IGhhcyBwYXNzZWQgaXMgbmV2ZXIgcmVhZCBvciB3cml0dGVuIGFnYWluLCBzbyBpdHMgYWNjZXNzIHN0YXRlIGlzIGlycmVsZXZhbnQgLSBhbmQgYXNraW5nIGEgZGVhZCBpbnRlcm1lZGlhdGUgd291bGQganVzdCBoYW5nIG9yIHRocm93LiBGdXR1cmUgd2luZG93cyBETyBtYXR0ZXI6IGFjY2VzcyBzaG91bGQgYmUgZ3JhbnRlZCBiZWZvcmUgdGhlaXIgd2luZG93IHN0YXJ0cy5cbiAgICAgICAgICAgIGlmIChzb3VyY2UuY29uZmlnLnZhbGlkV2luZG93WzFdIDw9IERhdGUubm93KCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5hcGkgaW5zdGFuY2VvZiBBcmNoaXZlc1JlbW90ZSkge1xuICAgICAgICAgICAgICAgIGxldCB3YWl0aW5nID0gYXdhaXQgc291cmNlLmFwaS53YWl0aW5nRm9yQWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgaWYgKHdhaXRpbmcpIHJldHVybiB3YWl0aW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBzb3VyY2VzIHRoYXQgY2FuIHNlcnZlIGEgZmlsZSByaWdodCBub3csIGluIGRpc3BhdGNoIG9yZGVyIC0gdGhlIGZpcnN0IGlzIHRoZSB3cml0ZSBub2RlLCB0aGUgb25lIGEgcGxhaW4gcmVhZCBhc2tzIGZpcnN0LiBFYWNoIGVudHJ5J3MgdXJsIGlzIHdoYXQgR2V0Q29uZmlnLnNvdXJjZVVybCAvIEdldEluZm9Db25maWcuc291cmNlVXJsIGFjY2VwdCwgc28gbGlzdGluZyB0aGVzZSBhbmQgdGhlbiByZWFkaW5nIHdpdGggc291cmNlVXJsIGNvbXBhcmVzIHRoZSBjb3BpZXMgdGhlIHNvdXJjZXMgYWN0dWFsbHkgaG9sZC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RmlsZVNvdXJjZXMoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8U291cmNlQ29uZmlnW10+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShmaWxlTmFtZSk7XG4gICAgICAgIHJldHVybiBzdGF0ZS5zb3VyY2VzLmZpbHRlcih4ID0+IHJvdXRlQ29udGFpbnMoeC5jb25maWcucm91dGUsIHJvdXRlKSAmJiBjb25maWdXaW5kb3dDdXJyZW50KHguY29uZmlnKSkubWFwKHggPT4geC5jb25maWcpO1xuICAgIH1cblxuICAgIC8vIFRoZSBvbmUgZXhhY3Qgc291cmNlIGEgc291cmNlVXJsIHJlYWQgbWVhbnMsIG5vIGZhbGxiYWNrIG9mIGFueSBraW5kIC0gYXNraW5nIGZvciBhIFNQRUNJRklDIHNvdXJjZSdzIGNvcHkgYW5kIGdldHRpbmcgYW5vdGhlcidzIHdvdWxkIGRlZmVhdCB0aGUgcG9pbnRcbiAgICBwcml2YXRlIGFzeW5jIHJ1bk9uU291cmNlPFQ+KHNvdXJjZVVybDogc3RyaW5nLCBydW46IChhcmNoaXZlczogSUFyY2hpdmVzKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHN0YXRlLnNvdXJjZXMuZmluZCh4ID0+IHguY29uZmlnLnVybCA9PT0gc291cmNlVXJsKTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29uZmlndXJlZCBzb3VyY2UgaGFzIHRoZSB1cmwgJHtKU09OLnN0cmluZ2lmeShzb3VyY2VVcmwpfSBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSAoc291cmNlczogJHtzdGF0ZS5zb3VyY2VzLm1hcCh4ID0+IHguY29uZmlnLnVybCkuam9pbihcIiwgXCIpfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgc291cmNlLnJlYWQocnVuKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LmRhdGEgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKiogZ2V0MiwgYnV0IHRyeWluZyBzb3VyY2VzIGluIGxhdGVuY3kgb3JkZXIgKGZhc3Rlc3QgZmlyc3QpIGluc3RlYWQgb2YgY29uZmlnIG9yZGVyLiBXaGlsZSB0aGlzIGlzIG11Y2ggZmFzdGVyLCBpdCBtaWdodCBtaXNzIGltbWVkaWF0ZSB3cml0ZXM6IHRoZSB3cml0ZSBub2RlIGlzIG5vIGxvbmdlciB0cmllZCBmaXJzdCwgc28gYSBsYWdnaW5nIHJlcGxpY2EgbWF5IGFuc3dlciB3aXRoIGEgc2xpZ2h0bHkgb2xkZXIgdmFsdWUuIEV4Y2x1c2l2ZSB3aXRoIG5vRmFsbGJhY2tzICh3aGljaCBvbmx5IGNvbnNpZGVycyBvbmUgc291cmNlIC0gdGhlIHdyaXRlIG5vZGUgLSBzbyB0aGVyZSBpcyBubyBvcmRlciB0byBzcGVlZCB1cCk7IHBhc3NpbmcgYm90aCB0aHJvd3MuICovXG4gICAgcHVibGljIGFzeW5jIGdldEZhc3QoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgdXJsOiBzdHJpbmcgfSB8IHsgZGF0YT86IHVuZGVmaW5lZDsgd3JpdGVUaW1lPzogdW5kZWZpbmVkOyBzaXplPzogdW5kZWZpbmVkOyB1cmw6IHN0cmluZyB9PiB7XG4gICAgICAgIGlmIChjb25maWc/LnNvdXJjZVVybCkge1xuICAgICAgICAgICAgLy8gQSBzcGVjaWZpYyBzb3VyY2UgbGVhdmVzIG5vdGhpbmcgZm9yIHRoZSBsYXRlbmN5IG9yZGVyaW5nIHRvIGRlY2lkZVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHsgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSwgbm9GYWxsYmFja3M6IGNvbmZpZz8ubm9GYWxsYmFja3MsIHJldHJpZXM6IGNvbmZpZz8ucmV0cmllcywgZmFzdDogdHJ1ZSwgdGltZW91dDogeyBwYXRoOiBmaWxlTmFtZSB9IH0sIGFzeW5jIChhcmNoaXZlcywgdXJsKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIC8vIEVtcHR5IGRhdGEgaXMgYSB0b21ic3RvbmUsIG5vdCBjb250ZW50IC0gc2VlIGdldDJcbiAgICAgICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSB8fCAhcmVzdWx0LmRhdGEubGVuZ3RoICYmICFjb25maWc/LmluY2x1ZGVUb21ic3RvbmVzICYmICEoY29uZmlnPy5yYW5nZSAmJiByZXN1bHQuc2l6ZSkpIHJldHVybiB7IHVybCB9O1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0LmRhdGEsIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUsIHVybCB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqIEFsd2F5cyByZXNvbHZlcyB3aXRoIGEgdXJsIC0gdGhlIGF1dGhvcml0eSB0aGF0IGFuc3dlcmVkLiBBIHZhbHVlIHRoYXQgZG9lc24ndCBleGlzdCBpcyBzdGlsbCBhbiBhbnN3ZXIgRlJPTSBhIHNlcnZlciwgc28gaXQgY29tZXMgYmFjayBhcyB7IHVybCB9IHdpdGggbm8gZGF0YSAobmV2ZXIgcGxhaW4gdW5kZWZpbmVkKTsgZXJyb3JzIGZyb20gZXZlcnkgc291cmNlIHRocm93IGluc3RlYWQuICovXG4gICAgcHVibGljIGFzeW5jIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgdXJsOiBzdHJpbmcgfSB8IHsgZGF0YT86IHVuZGVmaW5lZDsgd3JpdGVUaW1lPzogdW5kZWZpbmVkOyBzaXplPzogdW5kZWZpbmVkOyB1cmw6IHN0cmluZyB9PiB7XG4gICAgICAgIGNvbnN0IHNvdXJjZVVybCA9IGNvbmZpZz8uc291cmNlVXJsO1xuICAgICAgICBpZiAoc291cmNlVXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5PblNvdXJjZShzb3VyY2VVcmwsIGFzeW5jIGFyY2hpdmVzID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LmRhdGEgfHwgIXJlc3VsdC5kYXRhLmxlbmd0aCAmJiAhY29uZmlnPy5pbmNsdWRlVG9tYnN0b25lcyAmJiAhKGNvbmZpZz8ucmFuZ2UgJiYgcmVzdWx0LnNpemUpKSByZXR1cm4geyB1cmw6IHNvdXJjZVVybCB9O1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHJlc3VsdC5kYXRhLCB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplLCB1cmw6IHNvdXJjZVVybCB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdCh7IHJvdXRlOiBnZXRSb3V0ZShmaWxlTmFtZSksIG5vRmFsbGJhY2tzOiBjb25maWc/Lm5vRmFsbGJhY2tzLCByZXRyaWVzOiBjb25maWc/LnJldHJpZXMsIHRpbWVvdXQ6IHsgcGF0aDogZmlsZU5hbWUgfSB9LCBhc3luYyAoYXJjaGl2ZXMsIHVybCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFyY2hpdmVzLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICAvLyBFbXB0eSBkYXRhIGlzIGEgdG9tYnN0b25lLCBub3QgY29udGVudCAodW5sZXNzIHRoZSBjYWxsZXIgYXNrZWQgZm9yIHRvbWJzdG9uZXMpIC0gYSByYW5nZWQgcmVhZCBvZiBhIFJFQUwgZmlsZSBjYW4gbGVnaXRpbWF0ZWx5IGJlIGVtcHR5IHRob3VnaCAocmFuZ2UgcGFzdCBFT0YpLCB3aGljaCB0aGUgdG90YWwgc2l6ZSBkaXN0aW5ndWlzaGVzXG4gICAgICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LmRhdGEgfHwgIXJlc3VsdC5kYXRhLmxlbmd0aCAmJiAhY29uZmlnPy5pbmNsdWRlVG9tYnN0b25lcyAmJiAhKGNvbmZpZz8ucmFuZ2UgJiYgcmVzdWx0LnNpemUpKSByZXR1cm4geyB1cmwgfTtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHJlc3VsdC5kYXRhLCB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplLCB1cmwgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldEluZm9Db25maWcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgdXJsOiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCBzb3VyY2VVcmwgPSBjb25maWc/LnNvdXJjZVVybDtcbiAgICAgICAgaWYgKHNvdXJjZVVybCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuT25Tb3VyY2Uoc291cmNlVXJsLCBhc3luYyBhcmNoaXZlcyA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFyY2hpdmVzLmdldEluZm8oZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiB7IC4uLnJlc3VsdCwgdXJsOiBzb3VyY2VVcmwgfSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHsgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSwgbm9GYWxsYmFja3M6IGNvbmZpZz8ubm9GYWxsYmFja3MsIHJldHJpZXM6IGNvbmZpZz8ucmV0cmllcyB9LCBhc3luYyAoYXJjaGl2ZXMsIHVybCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFyY2hpdmVzLmdldEluZm8oZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHsgLi4ucmVzdWx0LCB1cmwgfSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFdpdGhvdXQgZmFsbGJhY2tzOiB0aGUgQVVUSE9SSVRBVElWRSBjb3ZlcmluZyBPTkxZIC0gdGhlIGZpcnN0IHNvdXJjZSBwZXIgcm91dGUgaW4gY29uZmlnIG9yZGVyICh0aGUgc2FtZSBub2RlIGV2ZXJ5IHdyaXRlIGFuZCByZWFkIHRhcmdldHMpLCBkb3duIG9yIG5vdC4gSXQgaXMgTkVWRVIgZXhjbHVkZWQgYW5kIE5FVkVSIHN1YnN0aXR1dGVkLCBzbyBhIGxpc3RpbmcgdGhhdCBjYW4ndCByZWFjaCBpdHMgd3JpdGUgbm9kZXMgcmV0cmllcyB0aG9zZSBzYW1lIG5vZGVzIHVudGlsIHRoZSBkZWFkbGluZSBhbmQgdGhlbiBmYWlscywgcmF0aGVyIHRoYW4gcXVpZXRseSByZWFkaW5nIHNlY29uZC1oYW5kIGRhdGEgb2ZmIGEgcmVwbGljYSBvciBiYWNrYmxhemUuIGV4Y2x1ZGUvY29vbGRvd24vc3Vic3RpdHV0aW9uIGFwcGx5IE9OTFkgd2hlbiB0aGUgY2FsbGVyIG9wdGVkIGludG8gZmFsbGJhY2tzLlxuICAgIHByaXZhdGUgc2VsZWN0Q292ZXJpbmdTb3VyY2VzKHN0YXRlOiBDaGFpblN0YXRlLCBjb25maWc/OiB7IGZhbGxiYWNrcz86IGJvb2xlYW47IGV4Y2x1ZGU/OiBTZXQ8U291cmNlV3JhcHBlcj4gfSk6IFNvdXJjZVdyYXBwZXJbXSB7XG4gICAgICAgIGlmIChjb25maWc/LmZhbGxiYWNrcykge1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSBzdGF0ZS5zb3VyY2VzLmZpbHRlcih4ID0+IGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpICYmIHguYXBpICYmICFjb25maWcuZXhjbHVkZT8uaGFzKHgpKTtcbiAgICAgICAgICAgIGxldCB1c2FibGUgPSBjYW5kaWRhdGVzLmZpbHRlcih4ID0+ICF4LmlzT25Db29sZG93bigpKTtcbiAgICAgICAgICAgIGxldCBjaG9zZW4gPSBjb3ZlclJvdXRlcyh1c2FibGUpIHx8IGNvdmVyUm91dGVzKGNhbmRpZGF0ZXMpO1xuICAgICAgICAgICAgaWYgKGNob3NlbikgcmV0dXJuIGNob3NlbjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvdmVyIHRoZSBmdWxsIHJvdXRlIHNwYWNlIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiB0aGUgYXZhaWxhYmxlIHNvdXJjZXMgbGVhdmUgYSBnYXAgKHNvbWUgc2hhcmRzIGFyZSBkb3duIG9yIFVSTC1vbmx5KWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjYW5kaWRhdGVzID0gc3RhdGUuc291cmNlcy5maWx0ZXIoeCA9PiBjb25maWdXaW5kb3dDdXJyZW50KHguY29uZmlnKSAmJiB4LmFwaSk7XG4gICAgICAgIGxldCBjaG9zZW4gPSBjb3ZlclJvdXRlcyhjYW5kaWRhdGVzKTtcbiAgICAgICAgaWYgKCFjaG9zZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvdmVyIHRoZSBmdWxsIHJvdXRlIHNwYWNlIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiB0aGUgYXZhaWxhYmxlIHNvdXJjZXMgbGVhdmUgYSBnYXAgKHNvbWUgc2hhcmRzIGFyZSBkb3duIG9yIFVSTC1vbmx5KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaG9zZW47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5PbkNvdmVyaW5nPFQ+KG9wZXJhdGlvbjogc3RyaW5nLCBydW46IChhcmNoaXZlczogSUFyY2hpdmVzKSA9PiBQcm9taXNlPFQ+LCBjb25maWc/OiB7IGZhbGxiYWNrcz86IGJvb2xlYW4gfSk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQ09WRVJJTkdfUkVUUllfVElNRU9VVDtcbiAgICAgICAgLy8gU291cmNlcyB0aGF0IGZhaWxlZCBkdXJpbmcgdGhpcyBjYWxsIC0gd2l0aCBmYWxsYmFja3MsIHRoZSBuZXh0IGF0dGVtcHQgY292ZXJzIHRoZWlyIHJvdXRlcyB3aXRoIHRoZSBuZXh0IHNvdXJjZSBob2xkaW5nIHRoZW0gaW5zdGVhZFxuICAgICAgICBsZXQgZmFpbGVkID0gbmV3IFNldDxTb3VyY2VXcmFwcGVyPigpO1xuICAgICAgICBsZXQgdHJpZXMgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdHJpZXMrKztcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIC8vIEVycm9ycyBuYW1lIHRoZSBPUEVSQVRJT04gYW5kIHRoZSBTUEVDSUZJQyBzb3VyY2VzIHRoYXQgZmFpbGVkIC0gXCJ0aGUgZmluZCBmYWlsZWQgYmVjYXVzZSBzb3VyY2UgWCBpcyB1bmF2YWlsYWJsZVwiLCBuZXZlciBhbiBhbm9ueW1vdXMgZmFpbHVyZSBhdHRyaWJ1dGVkIHRvIHRoZSB3aG9sZSBjaGFpblxuICAgICAgICAgICAgbGV0IG91dGNvbWUgPSBhd2FpdCAoYXN5bmMgKCk6IFByb21pc2U8eyB2YWx1ZXM6IFRbXSB9IHwgeyBlcnJvcjogRXJyb3IgfT4gPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjb3ZlcmluZzogU291cmNlV3JhcHBlcltdO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdmVyaW5nID0gdGhpcy5zZWxlY3RDb3ZlcmluZ1NvdXJjZXMoc3RhdGUsIHsgZmFsbGJhY2tzOiBjb25maWc/LmZhbGxiYWNrcywgZXhjbHVkZTogZmFpbGVkIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG5ldyBFcnJvcihgJHtvcGVyYXRpb259IGNhbm5vdCBydW46ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlczogVFtdID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGZhaWx1cmVzOiB7IHNvdXJjZTogU291cmNlV3JhcHBlcjsgZXJyb3I6IEVycm9yIH1bXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChjb3ZlcmluZy5tYXAoYXN5bmMgKHNvdXJjZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwaSA9IHNvdXJjZS5hcGk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQuYWRkKHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlcy5wdXNoKHsgc291cmNlLCBlcnJvcjogbmV3IEVycm9yKGBVUkwtb25seSBhY2Nlc3MsIHdoaWNoIGNhbm5vdCBzZXJ2ZSAke29wZXJhdGlvbn1gKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goYXdhaXQgcnVuKGFwaSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZS5pc0Nvbm5lY3RlZCgpKSBzb3VyY2Uubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZC5hZGQoc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzLnB1c2goeyBzb3VyY2UsIGVycm9yOiBlIGFzIEVycm9yIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCBhZnRlciAke2Zvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHRpbWUpfSBpbmRleCAke2luZGV4fSBvZiAke2NvdmVyaW5nLmxlbmd0aH1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZhaWx1cmVzLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWVzIH07XG4gICAgICAgICAgICAgICAgaWYgKGZhaWx1cmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IEVycm9yKGAke29wZXJhdGlvbn0gZmFpbGVkIGJlY2F1c2Ugc291cmNlICR7ZmFpbHVyZXNbMF0uc291cmNlLmdldERlYnVnTmFtZSgpfSBpcyB1bmF2YWlsYWJsZTogJHtmYWlsdXJlc1swXS5lcnJvci5tZXNzYWdlID8/IGZhaWx1cmVzWzBdLmVycm9yfS4gRmFsbGJhY2tzID0gJHshIWNvbmZpZz8uZmFsbGJhY2tzfS4gVHJpZXMgPSAke3RyaWVzfSwgVG9vayAke2Zvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9YCkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG5ldyBFcnJvcihgJHtvcGVyYXRpb259IGZhaWxlZCBiZWNhdXNlICR7ZmFpbHVyZXMubGVuZ3RofSBvZiB0aGUgJHtjb3ZlcmluZy5sZW5ndGh9IGNvdmVyaW5nIHNvdXJjZXMgYXJlIHVuYXZhaWxhYmxlOiAke2ZhaWx1cmVzLm1hcCh4ID0+IGAke3guc291cmNlLmdldERlYnVnTmFtZSgpfTogJHt4LmVycm9yLm1lc3NhZ2UgPz8geC5lcnJvcn1gKS5qb2luKFwiIHwgXCIpfS4gRmFsbGJhY2tzID0gJHshIWNvbmZpZz8uZmFsbGJhY2tzfS4gVHJpZXMgPSAke3RyaWVzfSwgVG9vayAke2Zvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9YCkgfTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICBpZiAoXCJ2YWx1ZXNcIiBpbiBvdXRjb21lKSByZXR1cm4gb3V0Y29tZS52YWx1ZXM7XG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBvdXRjb21lLmVycm9yO1xuICAgICAgICAgICAgLy8gU3Vic3RpdHV0aW9uIGNvbWVzIEJFRk9SRSB0aGUgZGVhZGxpbmUgY2hlY2s6IGEgc2luZ2xlIGNvbm5lY3QgdGltZW91dCBjYW4gZWF0IHRoZSBlbnRpcmUgZGVhZGxpbmUsIGFuZCBnaXZpbmcgdXAgdGhlbiAtIHdpdGhvdXQgZXZlciB0cnlpbmcgdGhlIHN1YnN0aXR1dGUgdGhhdCBmYWxsYmFja3MgZXhpc3QgZm9yIC0gdGhyb3dzIGV4YWN0bHkgd2hlbiBmYWxsaW5nIGJhY2sgbWF0dGVycyBtb3N0LiBTdWJzdGl0dXRpb24gY2Fubm90IGxvb3AgcGFzdCB0aGUgZGVhZGxpbmUgZm9yZXZlcjogZXZlcnkgcGFzcyBhZGRzIGl0cyBmYWlsdXJlcyB0byBgZmFpbGVkYCwgc28gdGhlIHN1YnN0aXR1dGVzIHJ1biBvdXQgd2l0aCB0aGUgc291cmNlcy5cbiAgICAgICAgICAgIGlmIChjb25maWc/LmZhbGxiYWNrcyAmJiBmYWlsZWQuc2l6ZSkge1xuICAgICAgICAgICAgICAgIGxldCBzdWJzdGl0dXRhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDb3ZlcmluZ1NvdXJjZXMoc3RhdGUsIHsgZmFsbGJhY2tzOiB0cnVlLCBleGNsdWRlOiBmYWlsZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN1YnN0aXR1dGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGAocmV0cnlpbmcgd2l0aCBmYWxsYmFja3MpICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE5vIHN1YnN0aXR1dGUgY292ZXJzIHRoZSBmYWlsZWQgcm91dGVzIC0gcmV0cnkgdGhlIGZhaWxlZCBzb3VyY2VzIHRoZW1zZWx2ZXMgYWZ0ZXIgdGhlIGRlbGF5XG4gICAgICAgICAgICAgICAgZmFpbGVkLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtlcnJvci5tZXNzYWdlfS4gUmV0cnlpbmcgaW4gJHtDT1ZFUklOR19SRVRSWV9ERUxBWSAvIDEwMDB9cyAoZ2l2aW5nIHVwIGF0ICR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZChkZWFkbGluZSl9KS5gKTtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5zdGF0ZS5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICBhd2FpdCBkZWxheShDT1ZFUklOR19SRVRSWV9ERUxBWSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogRmluZENvbmZpZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKSkubWFwKHggPT4geC5wYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhgVGhlIGZpbmQgb2YgJHtKU09OLnN0cmluZ2lmeShwcmVmaXgpfWAsIGFyY2hpdmVzID0+IGFyY2hpdmVzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKSwgeyBmYWxsYmFja3M6IGNvbmZpZz8uZmFsbGJhY2tzIH0pO1xuICAgICAgICBsZXQgYnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgZm9yIChsZXQgbGlzdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGxpc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBieVBhdGguZ2V0KGZpbGUucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZyB8fCBmaWxlLmNyZWF0ZVRpbWUgPiBleGlzdGluZy5jcmVhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5UGF0aC5zZXQoZmlsZS5wYXRoLCBmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1lcmdlZCA9IFsuLi5ieVBhdGgudmFsdWVzKCldO1xuICAgICAgICBzb3J0KG1lcmdlZCwgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1bk9uQ292ZXJpbmcoYFRoZSBjaGFuZ2VzIGxpc3Rpbmcgc2luY2UgJHtmb3JtYXREYXRlVGltZURldGFpbGVkKGNvbmZpZy50aW1lKX1gLCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5nZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZykpO1xuICAgICAgICBsZXQgYnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgZm9yIChsZXQgbGlzdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBmaWxlIG9mIGxpc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBieVBhdGguZ2V0KGZpbGUucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZyB8fCBmaWxlLmNyZWF0ZVRpbWUgPiBleGlzdGluZy5jcmVhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5UGF0aC5zZXQoZmlsZS5wYXRoLCBmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1lcmdlZCA9IFsuLi5ieVBhdGgudmFsdWVzKCldO1xuICAgICAgICBzb3J0KG1lcmdlZCwgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBsZXQgc3RhdHVzZXMgPSBhd2FpdCB0aGlzLnJ1bk9uQ292ZXJpbmcoYFRoZSBzeW5jIHN0YXR1cyBjaGVja2AsIGFzeW5jIGFyY2hpdmVzID0+IHtcbiAgICAgICAgICAgIGlmICghYXJjaGl2ZXMuZ2V0U3luY1N0YXR1cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZ2V0U3luY1N0YXR1cyBpcyBub3Qgc3VwcG9ydGVkOiAke2FyY2hpdmVzLmdldERlYnVnTmFtZSgpfSBkb2VzIG5vdCBpbXBsZW1lbnQgaXRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhcmNoaXZlcy5nZXRTeW5jU3RhdHVzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWxsU2NhbnNDb21wbGV0ZTogc3RhdHVzZXMuZXZlcnkoeCA9PiB4LmFsbFNjYW5zQ29tcGxldGUpLFxuICAgICAgICAgICAgaW5kZXhTaXplOiBzdGF0dXNlcy5yZWR1Y2UoKHN1bSwgeCkgPT4gc3VtICsgeC5pbmRleFNpemUsIDApLFxuICAgICAgICAgICAgc291cmNlczogc3RhdHVzZXMuZmxhdE1hcCh4ID0+IHguc291cmNlcyksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGlmICghc3RhdGUuc291cmNlcy5zb21lKHggPT4geC5hcGkpKSByZXR1cm4geyByZW1vdGVDb25maWc6IHN0YXRlLmNvbmZpZyB9O1xuICAgICAgICBsZXQgY29uZmlnID0gYXdhaXQgdGhpcy5ydW4oc3RhdGUsIHsgYXBpT25seTogdHJ1ZSB9LCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5nZXRDb25maWcoKSk7XG4gICAgICAgIHJldHVybiB7IC4uLmNvbmZpZywgcmVtb3RlQ29uZmlnOiBzdGF0ZS5jb25maWcgfTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZ1dpbmRvd0N1cnJlbnQoc291cmNlLmNvbmZpZykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFhd2FpdCBzb3VyY2UuaGFzV3JpdGVBY2Nlc3MoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVtcHR5IHdyaXRlIHJlZnVzZWQ6IHNldCB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgYnVmZmVyIGZvciAke0pTT04uc3RyaW5naWZ5KGZpbGVOYW1lKX06IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSBhbmQgd291bGQgcmVhZCBiYWNrIGFzIG1pc3NpbmcgLSBjYWxsIGRlbCBpbnN0ZWFkYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVOYW1lID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNldFJvdXRpbmdDb25maWcoZGF0YSwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoVkFSSUFCTEVfU0hBUkQpICYmIHBhcnNlVmFyaWFibGVSb3V0ZShmaWxlTmFtZSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0VmFyaWFibGVTaGFyZChmaWxlTmFtZSwgZGF0YSwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBMQVJHRV9TRVRfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAvLyBTdHJlYW1lZCBhdXRvbWF0aWNhbGx5IHNvIGNhbGxlcnMgbmV2ZXIgaGF2ZSB0byBjYWxsIHNldExhcmdlRmlsZSB0aGVtc2VsdmVzIHdoZW4gdGhleSBhbHJlYWR5IGhvbGQgdGhlIGJ1ZmZlciAtIG9uZSBnaWFudCBtZXNzYWdlIHdvdWxkIGV4Y2VlZCB0aGUgd2lyZSBsaW1pdCBhbmQgbGFnIGV2ZXJ5IG90aGVyIGNsaWVudCBvbiB0aGUgY29ubmVjdGlvbi4gVGhlIHdob2xlIGNvbmZpZyBnb2VzIHdpdGggaXQgKGluY2x1ZGluZyBmYWxsYmFja3MsIHdoaWNoIHRoZSBidWZmZXIncyByZXN0YXJ0U3RyZWFtIG1ha2VzIHBvc3NpYmxlKTogYSBmaWxlIG11c3Qgbm90IGdldCBkaWZmZXJlbnQgd3JpdGUgc2VtYW50aWNzIGp1c3QgZm9yIGJlaW5nIGJpZy5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TGFyZ2VGaWxlKHsgcGF0aDogZmlsZU5hbWUsIC4uLmNvbmZpZywgLi4uYnVmZmVyQ2h1bmtTdHJlYW0oZGF0YSkgfSk7XG4gICAgICAgICAgICByZXR1cm4gZmlsZU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KHsgd3JpdGU6IHRydWUsIGZhbGxiYWNrczogY29uZmlnPy5mYWxsYmFja3MsIHJldHJpZXM6IGNvbmZpZz8ucmV0cmllcywgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSwgdGltZW91dDogeyB1cGxvYWRCeXRlczogZGF0YS5sZW5ndGgsIGxhYmVsOiBgVXBsb2FkIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZU5hbWUpfSAoJHtkYXRhLmxlbmd0aH0gYnl0ZXMpYCB9IH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChmaWxlTmFtZSwgZGF0YSwgY29uZmlnKSk7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNldFJvdXRpbmdDb25maWcoZGF0YTogQnVmZmVyLCBjb25maWc/OiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgLy8gQ2hlY2tlZCBiZWZvcmUgdGhlIGZpcnN0IG5vZGUgaXMgd3JpdHRlbiB0bywgbm90IGp1c3QgYnkgZWFjaCBub2RlIGFzIGl0IGFycml2ZXM6IGV2ZXJ5IHNlcnZlciB3b3VsZCByZWplY3QgaXQgYW55d2F5LCBhbmQgZmluZGluZyB0aGF0IG91dCBvbmUgbm9kZSBhdCBhIHRpbWUgaXMgaG93IGEgY29uZmlnIHdyaXRlIGVuZHMgdXAgaGFsZi1hcHBsaWVkXG4gICAgICAgIGxldCBwYXJzZWRDb25maWcgPSBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgICAgICBpZiAoIXBhcnNlZENvbmZpZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0aW5nIGNvbmZpZyB3cml0ZSByZWplY3RlZCAtIG5vdCBhIHBhcnNlYWJsZSBjb25maWcuIFRoZSBkYXRhIGlzIG5vdCBhIHZhbGlkIHsgdmVyc2lvbj8sIHNvdXJjZXM6IFsuLi5dIH0gSlNPTiBjb25maWcgKCR7ZGF0YS5sZW5ndGh9IGJ5dGVzLCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZyhwYXJzZWRDb25maWcpO1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCB3cml0ZVRpbWUgPSBNYXRoLnJvdW5kKGNvbmZpZz8ubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCkpO1xuICAgICAgICBsZXQgd3JpdHRlbjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgLy8gT25lIHdyaXRlIHBlciBTVE9SRSwgbm90IHBlciBzZXJ2ZXI6IHRoZSB3cml0ZSBsYW5kcyBpbiB0aGUgc3RvcmUgdGhlIGVudHJ5IE5BTUVTLCBzbyB0d28gZW50cmllcyBzaGFyaW5nIGEgVVJMIGJ1dCBuYW1pbmcgZGlmZmVyZW50IHN0b3JlcyBhcmUgdHdvIHNlcGFyYXRlIGRlbGl2ZXJpZXMgLSBkZWR1cGluZyBieSBVUkwgYWxvbmUgbGVhdmVzIHRoZSBzZWNvbmQgc3RvcmUgdW5jb25maWd1cmVkIGZvcmV2ZXJcbiAgICAgICAgbGV0IHRhcmdldHM6IFNvdXJjZVdyYXBwZXJbXSA9IFtdO1xuICAgICAgICBsZXQgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IGtleSA9IGAke3NvdXJjZS5jb25maWcudXJsfXwke3NvdXJjZS5jb25maWcubmFtZX1gO1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgICAgIHRhcmdldHMucHVzaChzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBXcml0aW5nIHN0b3JhZ2Ugcm91dGluZyBjb25maWcgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gdG8gYWxsICR7dGFyZ2V0cy5sZW5ndGh9IHN0b3JlcyAod3JpdGUgdGltZSAke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQod3JpdGVUaW1lKX0pOiAke2RhdGEudG9TdHJpbmcoXCJ1dGY4XCIpLnNsaWNlKDAsIDIwMDApfWApO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0YXJnZXRzLm1hcChhc3luYyBzb3VyY2UgPT4ge1xuICAgICAgICAgICAgbGV0IGxhYmVsID0gYCR7c291cmNlLmNvbmZpZy51cmx9IChzdG9yZSAke0pTT04uc3RyaW5naWZ5KHNvdXJjZS5jb25maWcubmFtZSl9KWA7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHNvdXJjZS53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXQoUk9VVElOR19GSUxFLCBkYXRhLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lIH0pKTtcbiAgICAgICAgICAgICAgICB3cml0dGVuLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBXcm90ZSB0aGUgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyB0byAke2xhYmVsfWApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke2xhYmVsfTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlZnJlc2hBY3RpdmVDb25maWcoKTtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGluZyBjb25maWcgd3JpdGUgZmFpbGVkIG9uIHNvbWUgc3RvcmVzLiBGb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfTogZmFpbGVkIG9uICR7ZXJyb3JzLmxlbmd0aH0gb2YgJHt0YXJnZXRzLmxlbmd0aH0gc3RvcmVzIChzdWNjZWVkZWQgb246ICR7d3JpdHRlbi5qb2luKFwiLCBcIikgfHwgXCJub25lXCJ9KTogJHtlcnJvcnMuam9pbihcIiB8IFwiKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUk9VVElOR19GSUxFO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IERlbENvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyB3cml0ZTogdHJ1ZSwgZmFsbGJhY2tzOiBjb25maWc/LmZhbGxiYWNrcywgcmV0cmllczogY29uZmlnPy5yZXRyaWVzLCByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCB0aW1lb3V0OiB7IHVwbG9hZEJ5dGVzOiAwLCBsYWJlbDogYERlbGV0aW9uIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZU5hbWUpfWAgfSB9LCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5kZWwoZmlsZU5hbWUsIGNvbmZpZykpO1xuICAgIH1cblxuICAgIC8qKiBTZWUgSUFyY2hpdmVzLnVuZGVsZXRlOiByZXN0b3JlcyBhIGZpbGUgbWFya2VkIGZvciBkZWxldGlvbiwgZGlzcGF0Y2hlZCB0byB0aGUgd3JpdGUgbm9kZSBhcyBTZXRDb25maWcudW5kZWxldGUgKHRoZSB3cml0ZSBub2RlIHByb3BhZ2F0ZXMgdGhlIHJlc3RvcmUgdG8gaXRzIHBlZXJzIGl0c2VsZikuICovXG4gICAgcHVibGljIGFzeW5jIHVuZGVsZXRlKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gc2V0IHJlZnVzZXMgZW1wdHkgYnVmZmVycywgYW5kIGFuIHVuZGVsZXRlIGNhcnJpZXMgbm8gZGF0YSAtIHRoZSBieXRlIGlzIGlnbm9yZWRcbiAgICAgICAgbGV0IHBsYWNlaG9sZGVyID0gQnVmZmVyLmZyb20oWzFdKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KHsgd3JpdGU6IHRydWUsIHJvdXRlOiBnZXRSb3V0ZShmaWxlTmFtZSksIHRpbWVvdXQ6IHsgdXBsb2FkQnl0ZXM6IHBsYWNlaG9sZGVyLmxlbmd0aCwgbGFiZWw6IGBVbmRlbGV0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGZpbGVOYW1lKX1gIH0gfSwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0KGZpbGVOYW1lLCBwbGFjZWhvbGRlciwgeyB1bmRlbGV0ZTogdHJ1ZSB9KSk7XG4gICAgfVxuXG4gICAgLyoqIFNlZSBJQXJjaGl2ZXMubW92ZS4gV2hlbiBvbmUgbm9kZSBpcyB0aGUgd3JpdGUgdGFyZ2V0IGZvciBCT1RIIHBhdGhzLCB0aGF0IG5vZGUgbW92ZXMgdGhlIGZpbGUgaXRzZWxmIC0gdGhlIGJ5dGVzIG5ldmVyIGNvbWUgdGhyb3VnaCB1cyAtIHdpdGggdGhlIHNhbWUgd3Jvbmctd2luZG93L3JvdXRlIHJlLXJlc29sdXRpb24gYXMgYW55IHdyaXRlLiBXaGVuIHRoZSBwYXRocyByb3V0ZSB0byBkaWZmZXJlbnQgc2hhcmRzIG5vIHNpbmdsZSBub2RlIGhvbGRzIGJvdGgsIHNvIHRoZSBtb3ZlIGRlZ3JhZGVzIHRvIGEgY29weSB0aHJvdWdoIHVzIHBsdXMgYSBkZWxldGUsIENPTkZJUk1FRCBhdCB0aGUgZGVzdGluYXRpb24gYmVmb3JlIHRoZSBzb3VyY2UgaXMgdG91Y2hlZC4gTm8gc21hcnQgdGltZW91dCBvbiB0aGUgbm9kZS1zaWRlIG1vdmU6IGl0IGNhbiBiZSBhIGJpZyBmaWxlJ3Mgd29ydGggb2Ygbm9kZS1zaWRlIHdvcmssIHdoaWNoIHRoZSB1cGxvYWQtc2l6ZWQgZGVhZGxpbmVzIHdvdWxkIG1pc2p1ZGdlLiAqL1xuICAgIHB1YmxpYyBhc3luYyBtb3ZlKGNvbmZpZzogTW92ZUZpbGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5mcm9tUGF0aCA9PT0gY29uZmlnLnRvUGF0aCkgcmV0dXJuO1xuICAgICAgICBpZiAoY29uZmlnLmZyb21QYXRoID09PSBST1VUSU5HX0ZJTEUgfHwgY29uZmlnLnRvUGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBtb3ZlZGApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmcm9tUm91dGUgPSBnZXRSb3V0ZShjb25maWcuZnJvbVBhdGgpO1xuICAgICAgICBsZXQgdG9Sb3V0ZSA9IGdldFJvdXRlKGNvbmZpZy50b1BhdGgpO1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCB0YXJnZXQgPSBzdGF0ZS5zb3VyY2VzLmZpbmQoeCA9PiBjb25maWdXaW5kb3dDdXJyZW50KHguY29uZmlnKSAmJiByb3V0ZUNvbnRhaW5zKHguY29uZmlnLnJvdXRlLCBmcm9tUm91dGUpKTtcbiAgICAgICAgaWYgKHRhcmdldCAmJiByb3V0ZUNvbnRhaW5zKHRhcmdldC5jb25maWcucm91dGUsIHRvUm91dGUpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyB3cml0ZTogdHJ1ZSwgcm91dGU6IGZyb21Sb3V0ZSB9LCBhc3luYyBhcmNoaXZlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFhcmNoaXZlcy5tb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTW92ZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgc291cmNlOiAke2FyY2hpdmVzLmdldERlYnVnTmFtZSgpfSAobW92aW5nICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmZyb21QYXRoKX0gdG8gJHtKU09OLnN0cmluZ2lmeShjb25maWcudG9QYXRoKX0pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF3YWl0IGFyY2hpdmVzLm1vdmUoY29uZmlnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElubGluZSByYXRoZXIgdGhhbiBtb3ZlQXJjaGl2ZUZpbGUsIHdoaWNoIC0gZ2l2ZW4gb25lIGFyY2hpdmVzIHRoYXQgaW1wbGVtZW50cyBtb3ZlIC0gd291bGQganVzdCBjYWxsIGJhY2sgaW50byB0aGlzIG1ldGhvZFxuICAgICAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbTogdGhpcywgdG86IHRoaXMsIHBhdGg6IGNvbmZpZy5mcm9tUGF0aCwgdG9QYXRoOiBjb25maWcudG9QYXRoIH0pO1xuICAgICAgICBpZiAoIWNvcGllZCkge1xuICAgICAgICAgICAgLy8gVW5kZWZpbmVkIGlzIHR3byBjYXNlcyAoc2VlIGNvcHlBcmNoaXZlRmlsZSkgLSBhc2tpbmcgdGhlIHNvdXJjZSB3aGljaCBvbmUga2VlcHMgdGhlIGVycm9yIGhvbmVzdFxuICAgICAgICAgICAgbGV0IHNvdXJjZUluZm8gPSBhd2FpdCB0aGlzLmdldEluZm8oY29uZmlnLmZyb21QYXRoKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VJbmZvKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3ZlIHJlZnVzZWQgLSBhIG5ld2VyIGZpbGUgZXhpc3RzIGF0IHRoZSBkZXN0aW5hdGlvbi4gQ2Fubm90IG1vdmUgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSAoJHtzb3VyY2VJbmZvLnNpemV9IGJ5dGVzIGF0ICR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZChzb3VyY2VJbmZvLndyaXRlVGltZSl9KSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfTogdGhlIGNvcHkgd2FzIHJlZnVzZWQgcmF0aGVyIHRoYW4gcm9sbCBpdCBiYWNrICgke3RoaXMuZ2V0RGVidWdOYW1lKCl9KSAtIHRoZSBzb3VyY2UgaXMgbGVmdCB1bnRvdWNoZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTW92ZSBzb3VyY2UgZG9lcyBub3QgZXhpc3QuIENhbm5vdCBtb3ZlICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmZyb21QYXRoKX0gdG8gJHtKU09OLnN0cmluZ2lmeShjb25maWcudG9QYXRoKX06IG5vdCBmb3VuZCBvbiAke3RoaXMuZ2V0RGVidWdOYW1lKCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhjb25maWcudG9QYXRoKTtcbiAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTW92ZSBjb3B5IGNvdWxkIG5vdCBiZSBjb25maXJtZWQgLSB0aGUgc291cmNlIGlzIGtlcHQuIE5vdCBkZWxldGluZyAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy5mcm9tUGF0aCl9IGFmdGVyIGNvcHlpbmcgaXQgdG8gJHtKU09OLnN0cmluZ2lmeShjb25maWcudG9QYXRoKX06IHRoZSBkZXN0aW5hdGlvbiBkb2VzIG5vdCByZXBvcnQgaXQgKCR7dGhpcy5nZXREZWJ1Z05hbWUoKX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5kZWwoY29uZmlnLmZyb21QYXRoKTtcbiAgICB9XG5cbiAgICAvLyBPbmUgd3JpdGUgdGFyZ2V0IHBlciByb3V0ZSByYW5nZSwgbG93ZXN0IGxhdGVuY3kgZmlyc3QuIFdpdGhpbiBhIHNoYXJkIHRoZSB0YXJnZXQgaXMgQUxXQVlTIHRoZSBmaXJzdCBzb3VyY2UgaW4gY29uZmlnIG9yZGVyIChzZWUgcnVuUHJpbWFyeSAtIHdyaXRlcyBtdXN0IHN0YXkgb24gdGhlIHNhbWUgbm9kZSk6IGNvbm5lY3Rpdml0eSBvbmx5IGRlY2lkZXMgd2hpY2ggU0hBUkQgd2UgcGljaywgbmV2ZXIgd2hpY2ggbm9kZSB3aXRoaW4gaXQsIHNvIGEgc2hhcmQgd2hvc2Ugbm9kZSBpcyBkaXNjb25uZWN0ZWQgaXMgZHJvcHBlZCBlbnRpcmVseSB3aGVuIGNvbm5lY3RlZE9ubHkgaXMgc2V0LlxuICAgIHByaXZhdGUgZ2V0VmFyaWFibGVTaGFyZFRhcmdldHMoc3RhdGU6IENoYWluU3RhdGUsIGNvbmZpZzogeyBjb25uZWN0ZWRPbmx5OiBib29sZWFuIH0pOiBTb3VyY2VXcmFwcGVyW10ge1xuICAgICAgICBsZXQgdGFyZ2V0c0J5Um91dGUgPSBuZXcgTWFwPHN0cmluZywgU291cmNlV3JhcHBlcj4oKTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnV2luZG93Q3VycmVudChzb3VyY2UuY29uZmlnKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgcm91dGVLZXkgPSBKU09OLnN0cmluZ2lmeShzb3VyY2UuY29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEUpO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXRzQnlSb3V0ZS5oYXMocm91dGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0c0J5Um91dGUuc2V0KHJvdXRlS2V5LCBzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB0YXJnZXRzID0gWy4uLnRhcmdldHNCeVJvdXRlLnZhbHVlcygpXTtcbiAgICAgICAgaWYgKGNvbmZpZy5jb25uZWN0ZWRPbmx5KSB7XG4gICAgICAgICAgICB0YXJnZXRzID0gdGFyZ2V0cy5maWx0ZXIoeCA9PiB4LmlzQ29ubmVjdGVkKCkpO1xuICAgICAgICB9XG4gICAgICAgIHNvcnQodGFyZ2V0cywgeCA9PiB4LmdldExhdGVuY3koKSk7XG4gICAgICAgIHJldHVybiB0YXJnZXRzO1xuICAgIH1cblxuICAgIC8qKiBUaGUga2V5IHNldFZhcmlhYmxlU2hhcmQgd291bGQgbWF0ZXJpYWxpemUgZm9yIHRoaXMgVkFSSUFCTEVfU0hBUkQga2V5IChhIHZhbHVlIGluIHRoZSBwcmVmZXJyZWQgc2hhcmQncyByb3V0ZSByYW5nZSksIHdpdGhvdXQgd3JpdGluZyBhbnl0aGluZy4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U2hhcmRLZXkoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcyhWQVJJQUJMRV9TSEFSRCkgfHwgcGFyc2VWYXJpYWJsZVJvdXRlKGtleSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBnZXRTaGFyZEtleSByZXF1aXJlcyBhIGtleSBjb250YWluaW5nIGFuIHVubWF0ZXJpYWxpemVkICR7SlNPTi5zdHJpbmdpZnkoVkFSSUFCTEVfU0hBUkQpfSwgZ290ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLmdldFZhcmlhYmxlU2hhcmRUYXJnZXRzKHN0YXRlLCB7IGNvbm5lY3RlZE9ubHk6IHRydWUgfSlbMF1cbiAgICAgICAgICAgIHx8IHRoaXMuZ2V0VmFyaWFibGVTaGFyZFRhcmdldHMoc3RhdGUsIHsgY29ubmVjdGVkT25seTogZmFsc2UgfSlbMF07XG4gICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdXJjZSBhY2NlcHRzIHdyaXRlcyBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgc28gdGhlcmUgaXMgbm8gc2hhcmQgdG8gbWF0ZXJpYWxpemUgJHtKU09OLnN0cmluZ2lmeShrZXkpfSBpbnRvYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hdGVyaWFsaXplU2hhcmRLZXkoa2V5LCB0YXJnZXQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0VmFyaWFibGVTaGFyZChrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gZmFsc2U7XG4gICAgICAgIC8vIFRoZXJlJ3Mgbm8gcG9pbnQgdGFsa2luZyB0byBhIHNoYXJkIHdob3NlIG5vZGUgd2FzIGZhc3QgYnV0IGlzIG5vdyBkaXNjb25uZWN0ZWQgLSBvbmx5IHdoZW4gbm8gY29ubmVjdGVkIHNoYXJkIHdvcmtzIGRvIHdlIHJlY2hlY2sgYXZhaWxhYmlsaXR5IGFuZCB0cnkgZXZlcnkgc2hhcmRcbiAgICAgICAgbGV0IGNvbm5lY3RlZE9ubHkgPSB0cnVlO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgbGV0IHRhcmdldHMgPSB0aGlzLmdldFZhcmlhYmxlU2hhcmRUYXJnZXRzKHN0YXRlLCB7IGNvbm5lY3RlZE9ubHkgfSk7XG4gICAgICAgICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZnVsbEtleSA9IG1hdGVyaWFsaXplU2hhcmRLZXkoa2V5LCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzaGFyZCBwaWNraW5nIGFscmVhZHkgcmV0cmllcyBhY3Jvc3Mgc2hhcmRzLCBzbyBhIHN0dWNrIHNoYXJkIGp1c3QgY29zdHMgaXRzIHRpbWVvdXQgYW5kIHdlIG1vdmUgb24uIExhcmdlIGRhdGEgc3RyZWFtcyB2aWEgc2V0TGFyZ2VGaWxlIC0gdGhlIGtleSBpcyBhbHJlYWR5IG1hdGVyaWFsaXplZCBoZXJlLCBzbyB0aGUgbm8tVkFSSUFCTEVfU0hBUkQgcmVzdHJpY3Rpb24gb24gc2V0TGFyZ2VGaWxlIGRvZXNuJ3QgYXBwbHkuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwbHlTbWFydFRpbWVvdXQoeyB1cGxvYWRCeXRlczogZGF0YS5sZW5ndGgsIGxhYmVsOiBgVmFyaWFibGUtc2hhcmQgdXBsb2FkIG9mICR7SlNPTi5zdHJpbmdpZnkoZnVsbEtleSl9ICgke2RhdGEubGVuZ3RofSBieXRlcylgIH0sIHRhcmdldCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gTEFSR0VfU0VUX1RIUkVTSE9MRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQud3JpdGUoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0TGFyZ2VGaWxlKHsgcGF0aDogZnVsbEtleSwgLi4uY29uZmlnLCAuLi5idWZmZXJDaHVua1N0cmVhbShkYXRhKSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChmdWxsS2V5LCBkYXRhLCBjb25maWcpKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVsbEtleTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU01BUlRfVElNRU9VVF9NQVJLRVIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBWYXJpYWJsZS1zaGFyZCB3cml0ZSB0YXJnZXQgJHt0YXJnZXQuZ2V0RGVidWdOYW1lKCl9IHRpbWVkIG91dDsgbW92aW5nIHRvIHRoZSBuZXh0LWxvd2VzdC1sYXRlbmN5IHNoYXJkOiAke21lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaXNDb25uZWN0ZWQoKSkgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBWYXJpYWJsZS1zaGFyZCB3cml0ZSB0YXJnZXQgJHt0YXJnZXQuZ2V0RGVidWdOYW1lKCl9IGlzIGRvd247IG1vdmluZyB0byB0aGUgbmV4dC1sb3dlc3QtbGF0ZW5jeSBzaGFyZGApO1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlY2hlY2tlZEF2YWlsYWJpbGl0eSkge1xuICAgICAgICAgICAgICAgIHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29ubmVjdGVkT25seSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhdGUucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVyeSB2YXJpYWJsZS1zaGFyZCB3cml0ZSB0YXJnZXQgZmFpbGVkIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiAke2Vycm9ycy5qb2luKFwiIHwgXCIpIHx8IFwibm8gc291cmNlcyBhY2NlcHQgd3JpdGVzXCJ9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQSBsYXJnZSBmaWxlIGlzIHdyaXR0ZW4gZXhhY3RseSBsaWtlIGEgc21hbGwgb25lIC0gc2FtZSB3cml0ZSBub2RlLCBzYW1lIHdyb25nLXdpbmRvdy9yb3V0ZSByZS1yZXNvbHV0aW9uLCBzYW1lIGZhbGxiYWNrcyAtIHNvIGEgdmFsdWUncyBTSVpFIG5ldmVyIGRlY2lkZXMgaXRzIHdyaXRlIHNlbWFudGljcyAoc2V0IHN0cmVhbXMgdGhyb3VnaCBoZXJlIHBhc3QgTEFSR0VfU0VUX1RIUkVTSE9MRCwgYW5kIGEgZmlsZSB0aGF0IGdyZXcgcGFzdCBpdCBtdXN0IG5vdCBzdWRkZW5seSBsb3NlIHRoZSBhdmFpbGFiaWxpdHkgaXRzIGNhbGxlciBhc2tlZCBmb3IpLiBUaGUgb25lIGRpZmZlcmVuY2U6IGV2ZXJ5IGF0dGVtcHQgYWZ0ZXIgdGhlIGZpcnN0IGhhcyB0byByZXdpbmQgdGhlIHN0cmVhbSwgc28gYSBjb25maWcgd2l0aG91dCByZXN0YXJ0U3RyZWFtIGdldHMgYSBzaW5nbGUgYXR0ZW1wdC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogU2V0TGFyZ2VGaWxlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChjb25maWcucGF0aC5pbmNsdWRlcyhWQVJJQUJMRV9TSEFSRCkgJiYgcGFyc2VWYXJpYWJsZVJvdXRlKGNvbmZpZy5wYXRoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNldExhcmdlRmlsZSBkb2VzIG5vdCBzdXBwb3J0IFZBUklBQkxFX1NIQVJEIGtleXMgKHRoZXJlIGlzIG5vIHdheSB0byByZXR1cm4gdGhlIG1hdGVyaWFsaXplZCBrZXkpOyB3cml0ZSB0aGUgZmlsZSB3aXRoIHNldCwgb3IgbWF0ZXJpYWxpemUgdGhlIGtleSB5b3Vyc2VsZi4gS2V5OiAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy5wYXRoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShjb25maWcucGF0aCk7XG4gICAgICAgIGNvbnN0IHJlc3RhcnRTdHJlYW0gPSBjb25maWcucmVzdGFydFN0cmVhbTtcbiAgICAgICAgaWYgKCFyZXN0YXJ0U3RyZWFtKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldExhcmdlRmlsZU9uY2UoY29uZmlnLCByb3V0ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyB3cml0ZTogdHJ1ZSwgZmFsbGJhY2tzOiBjb25maWcuZmFsbGJhY2tzLCByZXRyaWVzOiBjb25maWcucmV0cmllcywgcm91dGUgfSwgYXN5bmMgYXJjaGl2ZXMgPT4ge1xuICAgICAgICAgICAgYXR0ZW1wdCsrO1xuICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIGF0dGVtcHQgY29uc3VtZWQgc29tZSAob3IgYWxsKSBvZiB0aGUgc3RyZWFtLCBhbmQgdGhpcyBzb3VyY2UgbmVlZHMgdGhlIGZpbGUgZnJvbSBpdHMgZmlyc3QgYnl0ZVxuICAgICAgICAgICAgaWYgKGF0dGVtcHQgPiAxKSBhd2FpdCByZXN0YXJ0U3RyZWFtKCk7XG4gICAgICAgICAgICBhd2FpdCB3YXRjaFNsb3dQcm9taXNlKGBzZXRMYXJnZUZpbGV8JHtjb25maWcucGF0aH1gLCBhcmNoaXZlcy5zZXRMYXJnZUZpbGUoY29uZmlnKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEEgc3RyZWFtIHRoYXQgY2Fubm90IHJld2luZCBnZXRzIGV4YWN0bHkgT05FIGF0dGVtcHQgYXQgdGhlIHdyaXRlIG5vZGU6IHJldHJ5aW5nIGFueXdoZXJlIChhbm90aGVyIHNvdXJjZSwgb3IgdGhpcyBvbmUgYWdhaW4pIHdvdWxkIHNlbmQgd2hhdGV2ZXIgaXMgbGVmdCBvZiBhbiBhbHJlYWR5LWNvbnN1bWVkIHN0cmVhbSBhcyBpZiBpdCB3ZXJlIHRoZSB3aG9sZSBmaWxlLlxuICAgIHByaXZhdGUgYXN5bmMgc2V0TGFyZ2VGaWxlT25jZShjb25maWc6IFNldExhcmdlRmlsZUNvbmZpZywgcm91dGU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gZmFsc2U7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gc3RhdGUuc291cmNlcy5maW5kKHggPT4gY29uZmlnV2luZG93Q3VycmVudCh4LmNvbmZpZykgJiYgcm91dGVDb250YWlucyh4LmNvbmZpZy5yb3V0ZSwgcm91dGUpKTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWNoZWNrZWRBdmFpbGFiaWxpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZS5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdXJjZSBhY2NlcHRzIHdyaXRlcyBmb3Igc2V0TGFyZ2VGaWxlIG9uICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKHJvdXRlICR7cm91dGV9KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB3YXRjaFNsb3dQcm9taXNlKGBzZXRMYXJnZUZpbGV8JHtjb25maWcucGF0aH1gLCB0YXJnZXQud3JpdGUoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0TGFyZ2VGaWxlKGNvbmZpZykpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IHVybHMgPSBhd2FpdCB0aGlzLmdldFVSTHMocGF0aCk7XG4gICAgICAgIGlmICghdXJscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcHVibGljIHNvdXJjZSBjb3ZlcmluZyByb3V0ZSAke2dldFJvdXRlKHBhdGgpfSB0byBidWlsZCBhIFVSTCBmcm9tIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVybHNbMF07XG4gICAgfVxuXG4gICAgLyoqIEV2ZXJ5IFVSTCB0aGF0IGNvdWxkIHNlcnZlIHRoaXMgcGF0aDogcHVibGljIHNvdXJjZXMgbWF0Y2hpbmcgYm90aCB0aGUgcGF0aCdzIHJvdXRlIGFuZCB0aGUgY3VycmVudCB2YWxpZCB3aW5kb3cuIFRoZSBmaXJzdCBpcyB0aGUgd3JpdGUgbm9kZSdzIChmaXJzdCBtYXRjaGluZyBzb3VyY2UgaW4gY29uZmlnIG9yZGVyLCBzZWUgcnVuUHJpbWFyeSAtIHRoZSBvbmUgZ3VhcmFudGVlZCBjdXJyZW50KTsgdGhlIHJlc3QgYXJlIHJhbmtlZCBmYXN0ZXN0LWZpcnN0IGJ5IG1lYXN1cmVkIGxhdGVuY3kuIEVtcHR5IHdoZW4gbm9uZSBxdWFsaWZ5LiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRVUkxzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldEdldFVSTHMoKSkocGF0aCk7XG4gICAgfVxuXG4gICAgLyoqIGdldFVSTHMsIGJ1dCBhZnRlciB0aGUgb25lIGF3YWl0IChpbml0aWFsaXphdGlvbikgdGhlIHJldHVybmVkIGZ1bmN0aW9uIGlzIHN5bmNocm9ub3VzOiBldmVyeXRoaW5nIHVuZGVybmVhdGggLSByb3V0ZSBoYXNoaW5nLCB3aW5kb3cgY2hlY2tzLCBsYXRlbmNpZXMsIFVSTCBidWlsZGluZyAtIGlzIHN5bmNocm9ub3VzLCBhbmQgdGhlIGNsb3N1cmUgYWx3YXlzIHJlYWRzIHRoZSBuZXdlc3QgYWRvcHRlZCBjb25maWcsIHNvIGl0IHN0YXlzIGNvcnJlY3QgYWNyb3NzIGNvbmZpZyByZWZyZXNoZXMuICovXG4gICAgcHVibGljIGFzeW5jIGdldEdldFVSTHMoKTogUHJvbWlzZTwocGF0aDogc3RyaW5nKSA9PiBzdHJpbmdbXT4ge1xuICAgICAgICBsZXQgaW5pdGlhbFN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5tYWtlR2V0VVJMcyhpbml0aWFsU3RhdGUsIHsgd3JpdGVOb2RlRmlyc3Q6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLyoqIGdldEdldFVSTHMsIGJ1dCBzb3J0ZWQgcHVyZWx5IGJ5IGxhdGVuY3kgLSB0aGUgd3JpdGUgbm9kZSBnZXRzIG5vIHNwZWNpYWwgZmlyc3QgcG9zaXRpb24uIEZvciByZWFkLW9ubHkgY29uc3VtZXJzIHRoYXQganVzdCB3YW50IHRoZSBmYXN0ZXN0IGhvc3QuICovXG4gICAgcHVibGljIGFzeW5jIGdldEdldEZhc3RVUkxzKCk6IFByb21pc2U8KHBhdGg6IHN0cmluZykgPT4gc3RyaW5nW10+IHtcbiAgICAgICAgbGV0IGluaXRpYWxTdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFrZUdldFVSTHMoaW5pdGlhbFN0YXRlLCB7IHdyaXRlTm9kZUZpcnN0OiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VHZXRVUkxzKGluaXRpYWxTdGF0ZTogQ2hhaW5TdGF0ZSwgY29uZmlnOiB7IHdyaXRlTm9kZUZpcnN0OiBib29sZWFuIH0pOiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlLmxhdGVzdCgpIHx8IGluaXRpYWxTdGF0ZTtcbiAgICAgICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKHBhdGgpO1xuICAgICAgICAgICAgbGV0IHNvdXJjZXM6IFNvdXJjZVdyYXBwZXJbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShzb3VyY2UuY29uZmlnLnB1YmxpYyA/PyB0cnVlKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHNvdXJjZS5jb25maWcucm91dGUsIHJvdXRlKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWdXaW5kb3dDdXJyZW50KHNvdXJjZS5jb25maWcpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBvcmRlcmVkOiBTb3VyY2VXcmFwcGVyW107XG4gICAgICAgICAgICBpZiAoY29uZmlnLndyaXRlTm9kZUZpcnN0KSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3QgPSBzb3VyY2VzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIHNvcnQocmVzdCwgeCA9PiB4LmdldExhdGVuY3koKSk7XG4gICAgICAgICAgICAgICAgb3JkZXJlZCA9IFsuLi5zb3VyY2VzLnNsaWNlKDAsIDEpLCAuLi5yZXN0XTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3JkZXJlZCA9IFsuLi5zb3VyY2VzXTtcbiAgICAgICAgICAgICAgICBzb3J0KG9yZGVyZWQsIHggPT4geC5nZXRMYXRlbmN5KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHVybHMgPSBvcmRlcmVkLm1hcCh4ID0+IGJ1aWxkRmlsZVVybChnZXRCdWNrZXRCYXNlVXJsKHguY29uZmlnLnVybCksIHBhdGgpKTtcbiAgICAgICAgICAgIHJldHVybiBbLi4ubmV3IFNldCh1cmxzKV07XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdGUuZGlzcG9zZSgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFyY2hpdmVzKGNvbmZpZzogUmVtb3RlQ29uZmlnIHwgUmVtb3RlQ29uZmlnQmFzZSwgb3B0aW9ucz86IEFyY2hpdmVzQ2hhaW5PcHRpb25zKTogQXJjaGl2ZXNDaGFpbiB7XG4gICAgcmV0dXJuIG5ldyBBcmNoaXZlc0NoYWluKGNvbmZpZywgb3B0aW9ucyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbGxTZXJ2ZXI8VD4odXJsOiBzdHJpbmcsIHJ1bjogKGNvbnRyb2xsZXI6IHR5cGVvZiBSZW1vdGVTdG9yYWdlQ29udHJvbGxlci5ub2Rlc1tzdHJpbmddKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgU29ja2V0RnVuY3Rpb24uRU5BQkxFX0NMSUVOVF9NT0RFID0gdHJ1ZTtcbiAgICBsZXQgcGFyc2VkID0gcGFyc2VTdG9yYWdlVXJsKHVybCk7XG4gICAgbGV0IG5vZGVJZCA9IFNvY2tldEZ1bmN0aW9uLmNvbm5lY3QoeyBhZGRyZXNzOiBwYXJzZWQuYWRkcmVzcywgcG9ydDogcGFyc2VkLnBvcnQgfSk7XG4gICAgbGV0IGNvbnRyb2xsZXIgPSBSZW1vdGVTdG9yYWdlQ29udHJvbGxlci5ub2Rlc1tub2RlSWRdO1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBydW4oY29udHJvbGxlcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoIVN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuaW5jbHVkZXMoU1RPUkFHRV9OT1RfQVVUSEVOVElDQVRFRCkpIHRocm93IGU7XG4gICAgICAgIGF3YWl0IGF1dGhlbnRpY2F0ZVN0b3JhZ2UoeyBhZGRyZXNzOiBwYXJzZWQuYWRkcmVzcywgcG9ydDogcGFyc2VkLnBvcnQsIG5vZGVJZCB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bihjb250cm9sbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0U2VydmVyQnVja2V0cyhjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTxTZXJ2ZXJCdWNrZXRJbmZvW10+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIubGlzdEJ1Y2tldHMoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCB9KSk7XG59XG5cbi8qKiBUaGUgbGl2ZSwgaW4tbWVtb3J5IHN0YXRlIG9mIG9uZSBidWNrZXQgb24gYSBzZXJ2ZXIgKHJvdXRpbmcgY29uZmlnIGluY2x1ZGVkKSwgb3IgYSBzdHJpbmcgc2F5aW5nIHdoeSBpdCBpcyB1bmF2YWlsYWJsZS4gQ2hlYXAgLSBpdCBuZXZlciB0b3VjaGVzIHRoZSBzZXJ2ZXIncyBkaXNrIC0gYnV0IG9ubHkgd29ya3Mgd2hpbGUgdGhhdCBidWNrZXQgaXMgbG9hZGVkIHRoZXJlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNlcnZlckFjdGl2ZUJ1Y2tldChjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIuZ2V0QWN0aXZlQnVja2V0KHsgYWNjb3VudDogY29uZmlnLmFjY291bnQsIGJ1Y2tldE5hbWU6IGNvbmZpZy5idWNrZXROYW1lIH0pKTtcbn1cblxuLyoqIFRoZSBidWNrZXRzIGEgc2VydmVyIGN1cnJlbnRseSBoYXMgbG9hZGVkLiBBZG1pbiBvbmx5LCBzbyBpbiBwcmFjdGljZSB0aGlzIGlzIG91ciBvd24gbWFjaGluZSdzIG90aGVyIHByb2Nlc3MgLSBhIGRlcGxveSBzdWNjZXNzb3IgYXNraW5nIGl0cyBwcmVkZWNlc3NvciB3aGF0IGlzIGFjdHVhbGx5IGluIHVzZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0U2VydmVyQWN0aXZlQnVja2V0S2V5cyhjb25maWc6IHsgdXJsOiBzdHJpbmcgfSk6IFByb21pc2U8eyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9W10+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIuYWRtaW5MaXN0QWN0aXZlQnVja2V0cygpKTtcbn1cblxuLyoqIFRlbGxzIGEgc2VydmVyIHRvIGxvYWQgb25lIG9mIGl0cyBidWNrZXRzIGludG8gbWVtb3J5IChzdGFydGluZyBpdHMgc3luY2hyb25pemF0aW9uKSBhbmQgcmV0dXJucyBpdHMgbGl2ZSBzdGF0ZSwgb3IgYSBzdHJpbmcgc2F5aW5nIHdoeSBpdCBjb3VsZCBub3QgYmUgbG9hZGVkLiBPbmx5IHRvdWNoZXMgdGhhdCBzZXJ2ZXIgLSBub3RoaW5nIGlzIHdyaXR0ZW4gYW5kIG5vIG90aGVyIHNvdXJjZSBpcyBjb250YWN0ZWQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aXZhdGVTZXJ2ZXJCdWNrZXQoY29uZmlnOiB7IHVybDogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgY29udHJvbGxlciA9PiBjb250cm9sbGVyLmFjdGl2YXRlQnVja2V0KHsgYWNjb3VudDogY29uZmlnLmFjY291bnQsIGJ1Y2tldE5hbWU6IGNvbmZpZy5idWNrZXROYW1lIH0pKTtcbn1cblxuLyoqIFplcm9lcyB0aGUgd3JpdGUgc3RhdGlzdGljcyBsaXN0U2VydmVyQnVja2V0cyByZXBvcnRzLCBmb3IgZXZlcnkgYnVja2V0IGluIHRoZSBhY2NvdW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFyU2VydmVyV3JpdGVTdGF0cyhjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTx7IGNsZWFyZWRCdWNrZXRzOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5jbGVhcldyaXRlU3RhdHMoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCB9KSk7XG59XG5cbi8qKiBUaGUgb3BlcmF0aW9uLWxvZyBmaWxlcyBPTkUgc3RvcmFnZSBzZXJ2ZXIgaG9sZHMgKGV2ZXJ5IHNlcnZlciBsb2dzIG9ubHkgaXRzIG93biBvcGVyYXRpb25zIC0gc2VlIGxpc3RBbGxTZXJ2ZXJMb2dGaWxlcyBmb3IgdGhlIHdob2xlIGZsZWV0KS4gVGhlIG5hbWVzIGNhcnJ5IHBpZC90aHJlYWQvdGltZS1yYW5nZS9lbnRyeS1jb3VudCBtZXRhZGF0YTsgc2VlIExvZ0ZpbGVJbmZvLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2ZXJMb2dGaWxlcyhjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTxMb2dGaWxlSW5mb1tdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgY29udHJvbGxlciA9PiBjb250cm9sbGVyLmxpc3RMb2dGaWxlcyh7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50IH0pKTtcbn1cblxuLyoqIEV2ZXJ5IHNlcnZlcidzIGxvZyBmaWxlcyBhdCBvbmNlLCBvbmUgZW50cnkgcGVyIHVybCAtIGEgc2VydmVyIHRoYXQgY2Fubm90IGFuc3dlciByZXBvcnRzIGl0cyBlcnJvciBpbnN0ZWFkIG9mIGZhaWxpbmcgdGhlIHJlc3QuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdEFsbFNlcnZlckxvZ0ZpbGVzKGNvbmZpZzogeyB1cmxzOiBzdHJpbmdbXTsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPHsgdXJsOiBzdHJpbmc7IGZpbGVzPzogTG9nRmlsZUluZm9bXTsgZXJyb3I/OiBzdHJpbmcgfVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGNvbmZpZy51cmxzLm1hcChhc3luYyB1cmwgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdXJsLCBmaWxlczogYXdhaXQgbGlzdFNlcnZlckxvZ0ZpbGVzKHsgdXJsLCBhY2NvdW50OiBjb25maWcuYWNjb3VudCB9KSB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1cmwsIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpIH07XG4gICAgICAgIH1cbiAgICB9KSk7XG59XG5cbi8qKiBEb3dubG9hZHMgdGhlIG5hbWVkIGxvZyBmaWxlcyBvZmYgb25lIHNlcnZlciBhbmQgZGVjb2RlcyB0aGVtIGludG8gdGhlIGxvZ2dlZCBvYmplY3RzICh0aGUgd2lyZSBhbHdheXMgY2FycmllcyB0aGVtIExaNC1jb21wcmVzc2VkIC0gbGl2ZSBmaWxlcyBhcmUgY29tcHJlc3NlZCBpbiBtZW1vcnkgc2VydmVyLXNpZGUpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNlcnZlckxvZ3MoY29uZmlnOiB7IHVybDogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmc7IG5hbWVzOiBzdHJpbmdbXSB9KTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgZW50cmllczogdW5rbm93bltdIH1bXT4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGFzeW5jIGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0czogeyBuYW1lOiBzdHJpbmc7IGVudHJpZXM6IHVua25vd25bXSB9W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBvZiBjb25maWcubmFtZXMpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29udHJvbGxlci5nZXRMb2dGaWxlKHsgYWNjb3VudDogY29uZmlnLmFjY291bnQsIG5hbWUgfSk7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goeyBuYW1lLCBlbnRyaWVzOiBkZWNvZGVMb2dGaWxlKEJ1ZmZlci5mcm9tKGRhdGEpKSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9KTtcbn1cblxuLyoqIGdldFNlcnZlckxvZ3MsIGJ1dCBTRUFSQ0hFRCBpbnN0ZWFkIG9mIGZ1bGx5IGRlY29kZWQ6IHRoZSByYXcgSlNPTiB0ZXh0IGlzIHN1YnN0cmluZy1tYXRjaGVkIChldmVyeSBzZWFyY2ggc3RyaW5nIG11c3QgYXBwZWFyIGluIGEgc3RhdGVtZW50IC0gc2VlIGNyZWF0ZUxvZ1NlYXJjaGVyKSwgYW5kIG9ubHkgdGhlIG1hdGNoaW5nIHN0YXRlbWVudHMgYXJlIGRlY29kZWQgaW50byBvYmplY3RzLiBGYXIgY2hlYXBlciB0aGFuIGRlY29kaW5nIHdob2xlIGZpbGVzIHRvIGxvb2sgZm9yIG9uZSBwYXRoIG9yIGNhbGxlci4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWFyY2hTZXJ2ZXJMb2dzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nOyBuYW1lczogc3RyaW5nW107IHNlYXJjaGVzOiBzdHJpbmdbXSB9KTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgZW50cmllczogdW5rbm93bltdIH1bXT4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGFzeW5jIGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0czogeyBuYW1lOiBzdHJpbmc7IGVudHJpZXM6IHVua25vd25bXSB9W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBvZiBjb25maWcubmFtZXMpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29udHJvbGxlci5nZXRMb2dGaWxlKHsgYWNjb3VudDogY29uZmlnLmFjY291bnQsIG5hbWUgfSk7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goeyBuYW1lLCBlbnRyaWVzOiBjcmVhdGVMb2dTZWFyY2hlcihCdWZmZXIuZnJvbShkYXRhKSkoY29uZmlnLnNlYXJjaGVzKSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Y2tldEluZm8oY29uZmlnOiB7IHVybDogc3RyaW5nIH0pOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgLy8gZ2V0Q29uZmlnIGlzIGJ1Y2tldC1sZXZlbCAobm8gc3RvcmUgc2VsZWN0aW9uKSwgc28gdGhlIGZhYnJpY2F0ZWQgc291cmNlQ29uZmlnIG5ldmVyIGhhcyB0byBtYXRjaCBhbnl0aGluZ1xuICAgIGxldCByZW1vdGUgPSBuZXcgQXJjaGl2ZXNSZW1vdGUoeyB1cmw6IGNvbmZpZy51cmwsIHdhaXRGb3JBY2Nlc3M6IGZhbHNlLCBzb3VyY2VDb25maWc6IG5vcm1hbGl6ZVNvdXJjZShjb25maWcudXJsKSB9KTtcbiAgICByZXR1cm4gYXdhaXQgcmVtb3RlLmdldENvbmZpZygpO1xufVxuIl19
910
- /* _JS_SOURCE_HASH = "575fb0d55bc7960f6f07a5d80bee04956d8027fd7c713b1b3483d8163a49df4e"; */
909
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQXJjaGl2ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjcmVhdGVBcmNoaXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBa0U7QUFDbEUsMkRBQXFEO0FBQ3JELDRDQUlzQjtBQUN0QixzREFBb0Q7QUFDcEQsaURBSXdCO0FBQ3hCLCtDQUE0QztBQUM1QyxtRUFBZ0U7QUFDaEUscURBQXdGO0FBRXhGLDJEQUF5RjtBQUV6RixpREFBK0Q7QUFDL0Qsb0RBQWlGO0FBQ2pGLGtFQUEyRjtBQUUzRix5UUFBeVE7QUFDelEsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMvQyxNQUFNLGlDQUFpQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDcEQsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzFDLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN4QyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN0Qyx3SkFBd0o7QUFDeEosTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLDZHQUE2RztBQUM3RyxNQUFNLHVDQUF1QyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDNUQsTUFBTSxxQ0FBcUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ3pELG9KQUFvSjtBQUNwSixNQUFNLG9CQUFvQixHQUFHLCtCQUErQixDQUFDO0FBVTdELHFOQUFxTjtBQUNyTiwrQ0FBcUY7QUFBNUUsOEdBQUEs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QUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3BDLENBQUM7QUFKRCxzQ0FJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNvcnQsIHdhdGNoU2xvd1Byb21pc2UgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQge1xuICAgIElBcmNoaXZlcywgUmVtb3RlQ29uZmlnLCBSZW1vdGVDb25maWdCYXNlLCBTb3VyY2VDb25maWcsXG4gICAgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZywgQXJjaGl2ZXNTeW5jU3RhdHVzLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIERlbENvbmZpZywgRmluZENvbmZpZywgR2V0Q29uZmlnLCBHZXRJbmZvQ29uZmlnLCBNb3ZlRmlsZUNvbmZpZywgU2V0Q29uZmlnLCBTZXRMYXJnZUZpbGVDb25maWcsIFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XLFxuICAgIFNUT1JBR0VfV1JPTkdfUk9VVEUsIFNUT1JBR0VfTk9UX0NPTkZJR1VSRUQsIEZVTExfUk9VVEUsIFZBUklBQkxFX1NIQVJELCBMQVJHRV9TRVRfVEhSRVNIT0xELCBidWZmZXJDaHVua1N0cmVhbSxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgY29weUFyY2hpdmVGaWxlIH0gZnJvbSBcIi4uL2FyY2hpdmVIZWxwZXJzXCI7XG5pbXBvcnQge1xuICAgIFJPVVRJTkdfRklMRSwgcGFyc2VIb3N0ZWRVcmwsIHBhcnNlQmFja2JsYXplVXJsLCBwYXJzZVJvdXRpbmdEYXRhLCBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZyxcbiAgICBub3JtYWxpemVSZW1vdGVDb25maWcsIG5vcm1hbGl6ZVNvdXJjZSxcbiAgICBnZXRSb3V0ZSwgcm91dGVDb250YWlucywgcGFyc2VWYXJpYWJsZVJvdXRlLCBnZXRCdWNrZXRCYXNlVXJsLCBidWlsZEZpbGVVcmwsXG59IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNVcmwgfSBmcm9tIFwiLi9BcmNoaXZlc1VybFwiO1xuaW1wb3J0IHsgU29ja2V0RnVuY3Rpb24gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL1NvY2tldEZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1JlbW90ZSwgcGFyc2VTdG9yYWdlVXJsLCBhdXRoZW50aWNhdGVTdG9yYWdlIH0gZnJvbSBcIi4vQXJjaGl2ZXNSZW1vdGVcIjtcbmltcG9ydCB7IFNlcnZlckJ1Y2tldEluZm8sIEFjdGl2ZUJ1Y2tldEluZm8gfSBmcm9tIFwiLi9zdG9yYWdlU2VydmVyU3RhdGVcIjtcbmltcG9ydCB7IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLCBTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEIH0gZnJvbSBcIi4vc3RvcmFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFNvdXJjZVdyYXBwZXIgfSBmcm9tIFwiLi9zb3VyY2VXcmFwcGVyXCI7XG5pbXBvcnQgeyBDaGFpblN0YXRlLCBDaGFpblN0YXRlTWFuYWdlciB9IGZyb20gXCIuL2NoYWluU3RhcnR1cFwiO1xuaW1wb3J0IHsgTG9nRmlsZUluZm8sIGRlY29kZUxvZ0ZpbGUsIGNyZWF0ZUxvZ1NlYXJjaGVyIH0gZnJvbSBcIi4uL1N0cmVhbWluZ0xvZ3NcIjtcbmltcG9ydCB7IGZvcm1hdFRpbWUsIGZvcm1hdERhdGVUaW1lRGV0YWlsZWQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuXG4vLyBIb3cgbWFueSBleHRyYSBmdWxsIHBhc3NlcyBvdmVyIHRoZSBzb3VyY2VzIGZhbGxiYWNrIGRpc3BhdGNoIG1ha2VzIHdoZW4gRVZFUlkgc291cmNlIGluIGEgcGFzcyBmYWlsZWQsIGJlZm9yZSB0aGUgb3BlcmF0aW9uIHRocm93cyAoc2VlIEdldENvbmZpZy5yZXRyaWVzKSAtIG1vc3QgcmVxdWVzdHMgc2hvdWxkbid0IGZhaWwgYXQgYWxsLCBzbyBhIGNvdXBsZSBvZiBibGFua2V0IHJldHJpZXMgYnV5cyBhdmFpbGFiaWxpdHkgZm9yIGFsbW9zdCBub3RoaW5nXG5jb25zdCBERUZBVUxUX0ZBTExCQUNLX1JFVFJJRVMgPSAzO1xuY29uc3QgRkFMTEJBQ0tfUkVUUllfREVMQVkgPSAyICogMTAwMDtcbmNvbnN0IFdST05HX1RBUkdFVF9CT1VOREFSWV9XSU5ET1cgPSAzMCAqIDEwMDA7XG5jb25zdCBXUk9OR19UQVJHRVRfQk9VTkRBUllfUkVUUllfREVMQVkgPSAxNSAqIDEwMDA7XG5jb25zdCBDT05GSUdfUkVGUkVTSF9USFJPVFRMRSA9IDMwICogMTAwMDtcbmNvbnN0IFBSSU1BUllfUkVUUllfVElNRU9VVCA9IDMwICogMTAwMDtcbmNvbnN0IFBSSU1BUllfUkVUUllfREVMQVkgPSAyICogMTAwMDtcbmNvbnN0IENPVkVSSU5HX1JFVFJZX1RJTUVPVVQgPSAzMCAqIDEwMDA7XG5jb25zdCBDT1ZFUklOR19SRVRSWV9ERUxBWSA9IDUgKiAxMDAwO1xuLy8gU21hcnQgdGltZW91dHM6IGFuIGF0dGVtcHQgZ2V0cyB0aGlzIGxvbmcgdG8gcHJvZHVjZSBhbnl0aGluZyBiZWZvcmUgd2UgcHJvYmUgZ2V0SW5mbyBmb3IgdGhlIGZpbGUncyBzaXplIChhbmQgdGhlIHByb2JlIGl0c2VsZiBnZXRzIHRoZSBzYW1lIHdpbmRvdylcbmNvbnN0IFNNQVJUX1RJTUVPVVRfUFJPQkUgPSA2MCAqIDEwMDA7XG4vLyBWZXJ5IGdlbmVyb3VzIGFzc3VtZWQgdHJhbnNmZXIgcmF0ZXMgLSB0aGUgcmVzdWx0aW5nIGRlYWRsaW5lIGV4aXN0cyB0byBjYXRjaCBzdHVjayBzb3VyY2VzLCBub3Qgc2xvdyBvbmVzXG5jb25zdCBTTUFSVF9USU1FT1VUX0RPV05MT0FEX0JZVEVTX1BFUl9TRUNPTkQgPSAxMDI0ICogMTAyNDtcbmNvbnN0IFNNQVJUX1RJTUVPVVRfVVBMT0FEX0JZVEVTX1BFUl9TRUNPTkQgPSA1MTIgKiAxMDI0O1xuLy8gTWFya2VyIGluIHNtYXJ0LXRpbWVvdXQgZXJyb3JzLCBzbyB0aGUgcmVhZCBsb29wIGNhbiBsb2cgdGhlbSBhbmQgY29udGludWUgd2l0aCB0aGUgb3RoZXIgc291cmNlcyAoYSBjb25uZWN0ZWQgc291cmNlJ3Mgb3RoZXIgZXJyb3JzIHN0aWxsIHRocm93KVxuY29uc3QgU01BUlRfVElNRU9VVF9NQVJLRVIgPSBcIkFSQ0hJVkVTX1NNQVJUX1RJTUVPVVRfYzQxYTlkXCI7XG5cbi8vIFNpemVzIGEgZ2VuZXJvdXMgcGVyLWF0dGVtcHQgZGVhZGxpbmUuIEdldC1zdHlsZSBjYWxscyBwYXNzIHBhdGg6IHRoZSBzaXplIGlzIG9ubHkgZmV0Y2hlZCAodmlhIGdldEluZm8pIHdoZW4gdGhlIGNhbGwgdHVybnMgb3V0IHRvIGJlIHNsb3cuIFNldC1zdHlsZSBjYWxscyBwYXNzIHVwbG9hZEJ5dGVzLCB3aGljaCB0aGV5IGFscmVhZHkga25vdy5cbnR5cGUgU21hcnRUaW1lb3V0ID0ge1xuICAgIHBhdGg/OiBzdHJpbmc7XG4gICAgdXBsb2FkQnl0ZXM/OiBudW1iZXI7XG4gICAgLy8gTmFtZXMgdGhlIG9wZXJhdGlvbiBpbiB0aW1lb3V0IGVycm9ycyAtIHdpdGhvdXQgaXQgYSBkZWxldGlvbiAoYSB0b21ic3RvbmUgd3JpdGUsIHVwbG9hZEJ5dGVzIDApIHJlYWRzIGFzIFwiVXBsb2FkIG9mIDAgYnl0ZXNcIiwgd2hpY2ggbG9va3MgbGlrZSBhIGJ1ZyByYXRoZXIgdGhhbiBhIGRlbGV0ZVxuICAgIGxhYmVsPzogc3RyaW5nO1xufTtcblxuLyoqIFRoZSBhZGRyZXNzLCBwb3J0LCBhY2NvdW50LCBhbmQgYnVja2V0IG5hbWUgYSBidWNrZXQgcm91dGluZyBVUkwgYWRkcmVzc2VzLiBUaHJvd3Mgd2hlbiB0aGUgVVJMIGlzbid0IGEgaG9zdGVkIGJ1Y2tldCByb3V0aW5nIFVSTCAoaHR0cHM6Ly9ob3N0OnBvcnQvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvbikuICovXG5leHBvcnQgeyBwYXJzZUhvc3RlZFVybCwgcGFyc2VCYWNrYmxhemVVcmwsIGdldEJ1Y2tldEJhc2VVcmwgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcblxuLyoqIEEgY2xpZW50IGZvciBPTkUgc291cmNlIC0gc2VlIHN0b3JlU291cmNlcy50cy4gUmUtZXhwb3J0ZWQgaGVyZSBiZWNhdXNlIGEgY2hhaW4gaXMgYnVpbHQgb3V0IG9mIHRoZW0uICovXG5leHBvcnQgeyBjcmVhdGVBcGlBcmNoaXZlcyB9IGZyb20gXCIuL3N0b3JlU291cmNlc1wiO1xuXG5leHBvcnQgdHlwZSBBcmNoaXZlc0NoYWluT3B0aW9ucyA9IHtcbiAgICAvKiogT3V0c2lkZSBvZiBub2RlIHdlIGRlZmF1bHQgdG8gcmVhZC1vbmx5IGRvd25sb2FkcyBvdmVyIHRoZSBwdWJsaWMgVVJMcyAobm8gQVBJIGNvbm5lY3Rpb24pIHdoZW4gdGhlIGNvbmZpZyBoYXMgcHVibGljIHNvdXJjZXMuIFNldCB0aGlzIHRvIGNvbm5lY3QgdG8gdGhlIEFQSSBhbnl3YXkgLSBuZWVkZWQgZm9yIHdyaXRpbmcsIGxpc3RpbmcsIGFuZCBhbnkgb3RoZXIgb3BlcmF0aW9uIHRoZSBwbGFpbiBVUkwgZm9ybSBjYW5ub3Qgc2VydmUuICovXG4gICAgZGlyZWN0Q29ubmVjdD86IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBjb25maWdXaW5kb3dDdXJyZW50KGNvbmZpZzogU291cmNlQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgbGV0IFtzdGFydCwgZW5kXSA9IGNvbmZpZy52YWxpZFdpbmRvdztcbiAgICByZXR1cm4gc3RhcnQgPD0gbm93ICYmIG5vdyA8IGVuZDtcbn1cblxuZnVuY3Rpb24gbWF0ZXJpYWxpemVTaGFyZEtleShrZXk6IHN0cmluZywgdGFyZ2V0OiBTb3VyY2VXcmFwcGVyKTogc3RyaW5nIHtcbiAgICBsZXQgW3N0YXJ0LCBlbmRdID0gdGFyZ2V0LmNvbmZpZy5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgIHJldHVybiBrZXkucmVwbGFjZShWQVJJQUJMRV9TSEFSRCwgVkFSSUFCTEVfU0hBUkQgKyBcIl9cIiArIChzdGFydCArIE1hdGgucmFuZG9tKCkgKiAoZW5kIC0gc3RhcnQpKSk7XG59XG5cbi8qKiBDb3ZlcnMgdGhlIHdob2xlIGtleSBzcGFjZSB3aXRoIHRoZSBBVVRIT1JJVEFUSVZFIHNvdXJjZXM6IGZvciBlYWNoIHVuY292ZXJlZCBwb2ludCwgdGhlIEZJUlNUIHNvdXJjZSBpbiBjb25maWcgb3JkZXIgd2hvc2Ugcm91dGUgY29udGFpbnMgaXQgLSB0aGUgZXhhY3Qgc2VsZWN0aW9uIGV2ZXJ5IHJlYWQgYW5kIHdyaXRlIHVzZXMsIHNvIGxpc3RpbmdzIGNvbWUgZnJvbSB0aGUgc2FtZSBub2RlcyB3cml0ZXMgd2VudCB0byAocmVhZC15b3VyLXdyaXRlcykuIE5ldmVyIFwiZmV3ZXN0XCIgb3IgXCJ3aWRlc3RcIjogcHJlZmVycmluZyBhIHdpZGUgcmVhZCByZXBsaWNhIG92ZXIgdGhlIHJvdXRlZCB3cml0ZSBzaGFyZHMgd291bGQgc2VydmUgbGlzdGluZ3MgZnJvbSBhIG5vZGUgdGhhdCBvbmx5IGhhcyB0aGUgZGF0YSBzZWNvbmQtaGFuZC4gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgY2FuZGlkYXRlcyBsZWF2ZSBhIGdhcC4gKi9cbmZ1bmN0aW9uIGNvdmVyUm91dGVzKGNhbmRpZGF0ZXM6IFNvdXJjZVdyYXBwZXJbXSk6IFNvdXJjZVdyYXBwZXJbXSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGNob3NlbjogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgbGV0IGNvdmVyZWQgPSAwO1xuICAgIHdoaWxlIChjb3ZlcmVkIDwgMSkge1xuICAgICAgICBsZXQgbmV4dCA9IGNhbmRpZGF0ZXMuZmluZCh4ID0+IHJvdXRlQ29udGFpbnMoeC5jb25maWcucm91dGUsIGNvdmVyZWQpKTtcbiAgICAgICAgaWYgKCFuZXh0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjaG9zZW4ucHVzaChuZXh0KTtcbiAgICAgICAgbGV0IFssIGVuZF0gPSBuZXh0LmNvbmZpZy5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgICAgICBjb3ZlcmVkID0gZW5kO1xuICAgIH1cbiAgICByZXR1cm4gY2hvc2VuO1xufVxuXG4vKiogUkVBRFMgT05MWS4gRHJvcHMgc291cmNlcyB0aGF0IHJlY2VudGx5IGZhaWxlZCB3aGlsZSBkaXNjb25uZWN0ZWQgLSB1bmxlc3MgdGhhdCB3b3VsZCBsZWF2ZSBub3RoaW5nLCBpbiB3aGljaCBjYXNlIGEgZG93biBzb3VyY2UgaXMgc3RpbGwgYmV0dGVyIHRoYW4gbm8gc291cmNlLCBhbmQgd2UgcmV0cnkgaXQgaW1tZWRpYXRlbHkuIE5ldmVyIGFwcGxpZXMgdG8gd3JpdGVzIChvciBub0ZhbGxiYWNrcyByZWFkcyBvZiB0aGUgd3JpdGUgdGFyZ2V0KTogdGhlIHdyaXRlIG5vZGUgaXMgc3RyaWN0bHkgdGhlIEZJUlNUIHNvdXJjZSBtYXRjaGluZyB0aGUgcm91dGUgYW5kIHZhbGlkIHdpbmRvdywgcmVnYXJkbGVzcyBvZiBjb25uZWN0aXZpdHkgLSBhIGNsaWVudCdzIGZsYWt5IHZpZXcgb2YgdGhlIG5ldHdvcmsgbXVzdCBuZXZlciBzY2F0dGVyIHdyaXRlcyBhY3Jvc3MgdGhlIGNoYWluIChzcGVjOiBjbGllbnQgd3JpdGVzIGFyZSBjb25zaXN0ZW50LCBjbGllbnQgcmVhZHMgYXJlIHJlZHVuZGFudCkuICovXG5mdW5jdGlvbiBwcmVmZXJVc2FibGUoc291cmNlczogU291cmNlV3JhcHBlcltdKTogU291cmNlV3JhcHBlcltdIHtcbiAgICBsZXQgdXNhYmxlID0gc291cmNlcy5maWx0ZXIoeCA9PiAheC5pc09uQ29vbGRvd24oKSk7XG4gICAgcmV0dXJuIHVzYWJsZS5sZW5ndGggJiYgdXNhYmxlIHx8IHNvdXJjZXM7XG59XG5cbmV4cG9ydCBjbGFzcyBBcmNoaXZlc0NoYWluIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICAvLyBUaGUgY2hhaW4ncyBzdGF0ZSwgYW5kIGV2ZXJ5dGhpbmcgYWJvdXQgaGF2aW5nIG9uZSAoaW5pdCArIGl0cyByZXRyeSwgY29uZmlnIHBvbGxpbmcvYWRvcHRpb24sIGF2YWlsYWJpbGl0eSByZWNoZWNrcywgdGhlIGNvbmZpZyByZXdyaXRlIGxvb3ApLCBsaXZlcyBpbiB0aGUgbWFuYWdlciAtIHdoYXQgc3RheXMgaW4gdGhpcyBjbGFzcyBpcyBkaXNwYXRjaCBvdmVyIHRoYXQgc3RhdGVcbiAgICBwcml2YXRlIHN0YXRlOiBDaGFpblN0YXRlTWFuYWdlcjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogUmVtb3RlQ29uZmlnIHwgUmVtb3RlQ29uZmlnQmFzZSwgb3B0aW9ucz86IEFyY2hpdmVzQ2hhaW5PcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgQ2hhaW5TdGF0ZU1hbmFnZXIoe1xuICAgICAgICAgICAgY29uZmlndXJlZDogbm9ybWFsaXplUmVtb3RlQ29uZmlnKGNvbmZpZyksXG4gICAgICAgICAgICBkZWJ1Z05hbWU6ICgpID0+IHRoaXMuZ2V0RGVidWdOYW1lKCksXG4gICAgICAgICAgICBkaXJlY3RDb25uZWN0OiBvcHRpb25zPy5kaXJlY3RDb25uZWN0LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICBsZXQgdXJscyA9IHRoaXMuc3RhdGUuYWN0aXZlQ29uZmlnLnNvdXJjZXMubWFwKHggPT4gdHlwZW9mIHggPT09IFwic3RyaW5nXCIgJiYgeCB8fCAoeCBhcyBTb3VyY2VDb25maWcpLnVybCk7XG4gICAgICAgIHJldHVybiBgY2hhaW4gJHt1cmxzLmpvaW4oXCIsIFwiKX1gO1xuICAgIH1cblxuICAgIC8vIFRoZSBPTkUgZGlzcGF0Y2ggZm9yIGV2ZXJ5IG9wZXJhdGlvbjogbm8gZmFsbGJhY2tzIChhbGwgd3JpdGVzIGJ5IGRlZmF1bHQsIGFuZCBub0ZhbGxiYWNrcyByZWFkcykgLT4gdGhlIHByaW1hcnkgbm9kZSBvbmx5LCB2aWEgcnVuUHJpbWFyeTsgZXZlcnl0aGluZyBlbHNlIC0+IHRoZSBzaGFyZWQgZmFsbGJhY2sgbG9vcCwgdHJ5aW5nIHNvdXJjZXMgaW4gY29uZmlnIG9yZGVyIChvciBsYXRlbmN5IG9yZGVyIGZvciBmYXN0IHJlYWRzKSBhbmQgb25seSBtb3Zpbmcgb24gd2hlbiBvbmUgZmFpbHMuIFdyaXRlcyBpbiB0aGUgbG9vcCBkaWZmZXIgZnJvbSByZWFkcyBvbmx5IGluIGNhbGxpbmcgc291cmNlLndyaXRlLlxuICAgIHByaXZhdGUgYXN5bmMgcnVuPFQ+KHN0YXRlOiBDaGFpblN0YXRlLCBjb25maWc6IHsgYXBpT25seT86IGJvb2xlYW47IHdyaXRlPzogYm9vbGVhbjsgcm91dGU/OiBudW1iZXI7IG5vRmFsbGJhY2tzPzogYm9vbGVhbjsgZmFsbGJhY2tzPzogYm9vbGVhbjsgcmV0cmllcz86IG51bWJlcjsgZmFzdD86IGJvb2xlYW47IHRpbWVvdXQ/OiBTbWFydFRpbWVvdXQgfSwgcnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcywgc291cmNlVXJsOiBzdHJpbmcpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5mYXN0ICYmIGNvbmZpZy5ub0ZhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmYXN0IGFuZCBub0ZhbGxiYWNrcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiBub0ZhbGxiYWNrcyBvbmx5IGNvbnNpZGVycyBvbmUgc291cmNlICh0aGUgd3JpdGUgbm9kZSksIHNvIHRoZXJlIGlzIG5vIG9yZGVyIHRvIHNwZWVkIHVwYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5ub0ZhbGxiYWNrcyB8fCBjb25maWcud3JpdGUgJiYgIWNvbmZpZy5mYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1blByaW1hcnkoY29uZmlnLCBydW4pO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRyaWVzID0gY29uZmlnLnJldHJpZXM7XG4gICAgICAgIGlmIChyZXRyaWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHJpZXMgPSBERUZBVUxUX0ZBTExCQUNLX1JFVFJJRVM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlY2hlY2tlZEF2YWlsYWJpbGl0eSA9IGZhbHNlO1xuICAgICAgICBsZXQgcmV0cmllZFdyb25nVGFyZ2V0ID0gZmFsc2U7XG4gICAgICAgIGxldCByZXRyaWVkUGFzc2VzID0gMDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBsZXQgY2FuZGlkYXRlcyA9IHN0YXRlLnNvdXJjZXMuZmlsdGVyKHNvdXJjZSA9PlxuICAgICAgICAgICAgICAgIChjb25maWcucm91dGUgPT09IHVuZGVmaW5lZCB8fCByb3V0ZUNvbnRhaW5zKHNvdXJjZS5jb25maWcucm91dGUsIGNvbmZpZy5yb3V0ZSkpXG4gICAgICAgICAgICAgICAgJiYgY29uZmlnV2luZG93Q3VycmVudChzb3VyY2UuY29uZmlnKVxuICAgICAgICAgICAgICAgIC8vIEEgd3JpdGUtYmxvY2tlZCBzb3VyY2UgKHJlYWQtb25seSBtb2RlLCBiYWNrYmxhemUgd2l0aG91dCBjcmVkZW50aWFscykgY2FuIG5ldmVyIHRha2UgYSB3cml0ZSwgc28gaXQgaXMgbm90IGEgZmFsbGJhY2sgY2FuZGlkYXRlIC0gaXRzIHRocm93IHdvdWxkIGVuZCB0aGUgcGFzcyBlYXJseSAoaXQgY291bnRzIGFzIGNvbm5lY3RlZClcbiAgICAgICAgICAgICAgICAmJiAhKGNvbmZpZy53cml0ZSAmJiAoc291cmNlLndyaXRlQmxvY2tlZCB8fCAhc291cmNlLmFwaSkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IG9yZGVyZWQgPSBwcmVmZXJVc2FibGUoY2FuZGlkYXRlcyk7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmZhc3QpIHtcbiAgICAgICAgICAgICAgICBvcmRlcmVkID0gWy4uLm9yZGVyZWRdO1xuICAgICAgICAgICAgICAgIHNvcnQob3JkZXJlZCwgeCA9PiB4LmdldExhdGVuY3koKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgd3JvbmdUYXJnZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBvcmRlcmVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5hcGlPbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXBpID0gc291cmNlLmFwaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7c291cmNlLmNvbmZpZy51cmx9IGhhcyBVUkwtb25seSBhY2Nlc3MsIHdoaWNoIGNhbm5vdCBzZXJ2ZSB0aGlzIG9wZXJhdGlvbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bihhcGksIHNvdXJjZS5jb25maWcudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBseVNtYXJ0VGltZW91dChjb25maWcudGltZW91dCwgc291cmNlLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLndyaXRlKSByZXR1cm4gc291cmNlLndyaXRlKGFyY2hpdmVzID0+IHJ1bihhcmNoaXZlcywgc291cmNlLmNvbmZpZy51cmwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2UucmVhZChhcmNoaXZlcyA9PiBydW4oYXJjaGl2ZXMsIHNvdXJjZS5jb25maWcudXJsKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTTUFSVF9USU1FT1VUX01BUktFUikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFNvdXJjZSB0aW1lZCBvdXQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0sIGNvbnRpbnVpbmcgd2l0aCB0aGUgbmV4dCBzb3VyY2U6ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQSB3cm9uZy13aW5kb3cvcm91dGUvdW5jb25maWd1cmVkIHJlamVjdGlvbiBtZWFucyBPVVIgY29uZmlnIGRpc2FncmVlcyB3aXRoIHRoZSBzZXJ2ZXIncywgc28gZXZlcnkgc291cmNlIHdlJ2QgZmFsbCBiYWNrIHRvIGlzIGp1ZGdlZCBieSB0aGUgc2FtZSBzdGFsZSBjb25maWcgLSByZWZyZXNoIGl0IGFuZCByZXN0YXJ0IHRoZSBwYXNzIGluc3RlYWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKChtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XKSB8fCBtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfV1JPTkdfUk9VVEUpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9OT1RfQ09ORklHVVJFRCkpICYmICFyZXRyaWVkV3JvbmdUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZWRXcm9uZ1RhcmdldCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cm9uZ1RhcmdldCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByZXBhcmVXcm9uZ1RhcmdldFJldHJ5KHN0YXRlLCBtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XKSAmJiBcIndpbmRvd1wiIHx8IG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19ST1VURSkgJiYgXCJyb3V0ZVwiIHx8IFwidW5jb25maWd1cmVkXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2tzIG1lYW5zIGF2YWlsYWJpbGl0eSBhYm92ZSBldmVyeXRoaW5nOiBBTlkgZmFpbGluZyBzb3VyY2UgLSBkb3duLCBtaXNjb25maWd1cmVkLCByZWplY3RpbmcsIG1pZC1zd2l0Y2hvdmVyIC0gaXMgc2tpcHBlZCBhbmQgdGhlIG5leHQgY292ZXJpbmcgc291cmNlIHRha2VzIHRoZSBjYWxsLiBPbmx5IGV2ZXJ5IHNvdXJjZSBmYWlsaW5nIHRocm93cyAoYmVsb3cpLiBXaXRob3V0IGZhbGxiYWNrcywgYSBDT05ORUNURUQgc291cmNlJ3MgZXJyb3IgaXMgYSByZWFsIGFuc3dlciBhbmQgdGhyb3dzLlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmZhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU291cmNlIGZhaWxlZCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgZmFsbGluZyBiYWNrIHRvIHRoZSBuZXh0IHNvdXJjZTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzb3VyY2UuaXNDb25uZWN0ZWQoKSkgc291cmNlLm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaXNDb25uZWN0ZWQoKSkgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLm5vdGVGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3cm9uZ1RhcmdldCkge1xuICAgICAgICAgICAgICAgIHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZWNoZWNrZWRBdmFpbGFiaWxpdHkpIHtcbiAgICAgICAgICAgICAgICByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhdGUucmVjaGVja0F2YWlsYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgIHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQmxhbmtldCByZXRyeSBvZiB0aGUgd2hvbGUgcGFzcywgQU5ZIGVycm9yIChzZWUgR2V0Q29uZmlnLnJldHJpZXMpOiBtb3N0IHJlcXVlc3RzIHNob3VsZG4ndCBmYWlsIGF0IGFsbCwgc28gcmV0cnlpbmcgdGhlIHJhcmUgZmFpbHVyZSAtIHdoYXRldmVyIGl0IHdhcyAtIGJ1eXMgYXZhaWxhYmlsaXR5IGZvciBhbG1vc3Qgbm90aGluZ1xuICAgICAgICAgICAgaWYgKHJldHJpZWRQYXNzZXMgPCByZXRyaWVzKSB7XG4gICAgICAgICAgICAgICAgcmV0cmllZFBhc3NlcysrO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgRXZlcnkgc291cmNlIGZhaWxlZCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSR7Y29uZmlnLnJvdXRlICE9PSB1bmRlZmluZWQgJiYgYCAocm91dGUgJHtjb25maWcucm91dGV9KWAgfHwgXCJcIn07IHJldHJ5aW5nIHRoZSB3aG9sZSBwYXNzIGluICR7RkFMTEJBQ0tfUkVUUllfREVMQVkgLyAxMDAwfXMgKHJldHJ5ICR7cmV0cmllZFBhc3Nlc30gb2YgJHtyZXRyaWVzfSlgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShGQUxMQkFDS19SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZS5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFsbCBzb3VyY2VzIGZhaWxlZCBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSR7Y29uZmlnLnJvdXRlICE9PSB1bmRlZmluZWQgJiYgYCAocm91dGUgJHtjb25maWcucm91dGV9KWAgfHwgXCJcIn0gKGFmdGVyICR7cmV0cmllZFBhc3Nlc30gcmV0ciR7cmV0cmllZFBhc3NlcyA9PT0gMSAmJiBcInlcIiB8fCBcImllc1wifSk6ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIikgfHwgXCJubyBzb3VyY2VzIGF2YWlsYWJsZVwifWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gV3JpdGVzIGFuZCBub0ZhbGxiYWNrcyByZWFkcyBhcmUgdGhlIHNhbWUgY2FzZTogdGFrZSB0aGUgYXV0aG9yaXRhdGl2ZSBub2RlIC0gc3RyaWN0bHkgdGhlIGZpcnN0IHNvdXJjZSBtYXRjaGluZyB0aGUgcm91dGUgYW5kIHZhbGlkIHdpbmRvdywgd2hldGhlciBpdCBpcyB1cCBvciBkb3duIC0gYW5kIHVzZSBpdCwgbmV2ZXIgZmFsbGluZyBiYWNrIHRvIGFub3RoZXIgbm9kZS4gSXQncyBpbXBvcnRhbnQgdGhhdCB3cml0aW5nIGFsd2F5cyBhY2Nlc3NlcyB0aGUgc2FtZSBub2RlIGV2ZXJ5d2hlcmUsIGV2ZW4gaWYgdGhhdCBub2RlIGlzIGRvd24gLSBvdGhlcndpc2Ugd2UncmUganVzdCB3cml0aW5nIGludG8gdGhlIHZvaWQsIGFuZCB3aG8ga25vd3MgaWYgdGhlIHdyaXRlcyB3aWxsIGV2ZW4gYmUgYWNjZXB0ZWQsIG9yIGNsb2JiZXJlZCwgb3Igd2hhdDsgYW5kIG5vRmFsbGJhY2tzIHJlYWRzIHdhbnQgdGhlIHNhbWUgbm9kZSBwcmVjaXNlbHkgYmVjYXVzZSBpdCBpcyB0aGUgb25lIHdyaXRlcyB0YXJnZXQuIEEgc2xvdyBjYWxsIGlzIGFsbW9zdCBhbHdheXMgYmV0dGVyIHRoYW4gdGhyb3dpbmcsIHNvIGEgZmFpbGluZyBwcmltYXJ5IGlzIHJldHJpZWQgKHRoZSBTQU1FIG5vZGUsIHJlLXJlc29sdmVkIGVhY2ggYXR0ZW1wdCBzaW5jZSBhIGNvbmZpZyByZWZyZXNoIGNhbiBjaGFuZ2Ugd2hpY2ggc291cmNlIGlzIHByaW1hcnkpIHVudGlsIHRoZSBkZWFkbGluZSwgdGhlbiB0aHJvd3MuXG4gICAgcHJpdmF0ZSBhc3luYyBydW5QcmltYXJ5PFQ+KGNvbmZpZzogeyB3cml0ZT86IGJvb2xlYW47IHJvdXRlPzogbnVtYmVyOyB0aW1lb3V0PzogU21hcnRUaW1lb3V0IH0sIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMsIHNvdXJjZVVybDogc3RyaW5nKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCByZXRyaWVkV3JvbmdXaW5kb3cgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJldHJpZWRXcm9uZ1JvdXRlID0gZmFsc2U7XG4gICAgICAgIGxldCByZXRyaWVkTm90Q29uZmlndXJlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgUFJJTUFSWV9SRVRSWV9USU1FT1VUO1xuICAgICAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgICAgICBsZXQgYXR0ZW1wdFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBzdGF0ZS5zb3VyY2VzLmZpbmQoeCA9PiBjb25maWdXaW5kb3dDdXJyZW50KHguY29uZmlnKSAmJiAoY29uZmlnLnJvdXRlID09PSB1bmRlZmluZWQgfHwgcm91dGVDb250YWlucyh4LmNvbmZpZy5yb3V0ZSwgY29uZmlnLnJvdXRlKSkpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHZhbGlkIHNvdXJjZSBjb3ZlcnMgdGhpcyByZXF1ZXN0LiBObyBzb3VyY2UgaXMgdGhlICR7Y29uZmlnLndyaXRlICYmIFwid3JpdGUgdGFyZ2V0XCIgfHwgXCJwcmltYXJ5IHJlYWQgc291cmNlXCJ9IGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9JHtjb25maWcucm91dGUgIT09IHVuZGVmaW5lZCAmJiBgIChyb3V0ZSAke2NvbmZpZy5yb3V0ZX0pYCB8fCBcIlwifSAoZXZlcnkgc291cmNlIGlzIG91dHNpZGUgaXRzIHZhbGlkIHdpbmRvdyBvciBvdXRzaWRlIHRoZSBrZXkncyByb3V0ZSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcHJpbWFyeSA9IHRhcmdldDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBseVNtYXJ0VGltZW91dChjb25maWcudGltZW91dCwgcHJpbWFyeSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLndyaXRlKSByZXR1cm4gcHJpbWFyeS53cml0ZShhcmNoaXZlcyA9PiBydW4oYXJjaGl2ZXMsIHByaW1hcnkuY29uZmlnLnVybCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJpbWFyeS5yZWFkKGFyY2hpdmVzID0+IHJ1bihhcmNoaXZlcywgcHJpbWFyeS5jb25maWcudXJsKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XKSAmJiAhcmV0cmllZFdyb25nV2luZG93KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJpZWRXcm9uZ1dpbmRvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVdyb25nVGFyZ2V0UmV0cnkoc3RhdGUsIFwid2luZG93XCIpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9XUk9OR19ST1VURSkgJiYgIXJldHJpZWRXcm9uZ1JvdXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJpZWRXcm9uZ1JvdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlV3JvbmdUYXJnZXRSZXRyeShzdGF0ZSwgXCJyb3V0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfTk9UX0NPTkZJR1VSRUQpICYmICFyZXRyaWVkTm90Q29uZmlndXJlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXRyaWVkTm90Q29uZmlndXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVdyb25nVGFyZ2V0UmV0cnkoc3RhdGUsIFwidW5jb25maWd1cmVkXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAmJiAhdGFyZ2V0LmlzQ29ubmVjdGVkKCkpIHRhcmdldC5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnLndyaXRlICYmIHRhcmdldCAmJiAoYXR0ZW1wdCA9PT0gMSB8fCBhdHRlbXB0ICUgMyA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlYXNvbiB3ZSB0cnkgdGhlIEhUVFAgcmVxdWVzdDogaHR0cHNSZXF1ZXN0IGhhcyBiZXR0ZXIgRE5TIHJldHJ5aW5nIGNhcGFiaWxpdGllcyB0aGFuIG91ciBXZWJTb2NrZXQgc2VydmVyICh3ZSBoYXZlIG1vcmUgY29udHJvbCBvdmVyIGl0KSwgc28ganVzdCB1c2luZyBpdCBjYW4gZml4IHNvbWUgRE5TIGlzc3Vlcywgd2hpY2ggY2FuIHByb3BhZ2F0ZSB0byBmaXggdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBJdCBpcyBzdGlsbCB0aGUgcHJpbWFyeSBzb3VyY2UncyBvd24gZGF0YSwgc28gdGhlIG5vLWZhbGxiYWNrIHNlbWFudGljcyBob2xkIC0gYW5kIEFyY2hpdmVzVXJsIGhhcyBubyBzZXR1cCBjb3N0LCBzbyBtYWtpbmcgb25lIG9uIHRoZSBzcG90IGlzIGZpbmUuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKHRhcmdldC51cmwgfHwgbmV3IEFyY2hpdmVzVXJsKGdldEJ1Y2tldEJhc2VVcmwodGFyZ2V0LmNvbmZpZy51cmwpKSwgdGFyZ2V0LmNvbmZpZy51cmwpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0OiB0aGUgcHJpbWFyeSdzIGVycm9yICh0aHJvd24gYXQgdGhlIGRlYWRsaW5lKSBpcyB0aGUgcmVhbCBvbmVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEF0IG1vc3Qgb25lIGF0dGVtcHQgcGVyIGludGVydmFsLCBpbiBjYXNlIHRoZSBmYWlsdXJlIGlzIGZhc3RcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KE1hdGgubWF4KDAsIGF0dGVtcHRTdGFydCArIFBSSU1BUllfUkVUUllfREVMQVkgLSBEYXRlLm5vdygpKSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBSYWNlcyBjYWxsIGFnYWluc3QgYSBzaXplLWJhc2VkIGRlYWRsaW5lLiBVcGxvYWRzIGtub3cgdGhlaXIgc2l6ZSB1cGZyb250OyBnZXRzIGFyZSBnaXZlbiBTTUFSVF9USU1FT1VUX1BST0JFIHRvIHByb2R1Y2UgYW55dGhpbmcsIGFuZCBvbmx5IHRoZW4gaXMgdGhlIGZpbGUncyBpbmZvIGZldGNoZWQgKGZyb20gdGhlIHNhbWUgc291cmNlLCBpdHNlbGYgdGltZS1saW1pdGVkKSB0byBzaXplIHRoZSBkZWFkbGluZSAtIG1lYXN1cmVkIGZyb20gdGhlIGNhbGwncyBzdGFydCwgc28gYSBzb3VyY2UgdGhhdCB3YXMgc2xvdyBiZWZvcmUgdGhlIHByb2JlIGRvZXNuJ3QgZ2V0IHRoZSBmdWxsIGFsbG93YW5jZSBhZ2Fpbi4gVGltZWQtb3V0IGNhbGxzIGtlZXAgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZCAodGhleSBjYW5ub3QgYmUgY2FuY2VsbGVkKSBidXQgdGhlaXIgZXZlbnR1YWwgcmVzdWx0IGlzIGlnbm9yZWQuICovXG4gICAgcHJpdmF0ZSBhc3luYyBhcHBseVNtYXJ0VGltZW91dDxUPih0aW1lb3V0OiBTbWFydFRpbWVvdXQgfCB1bmRlZmluZWQsIHNvdXJjZTogU291cmNlV3JhcHBlciwgY2FsbDogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAoIXRpbWVvdXQpIHJldHVybiBhd2FpdCBjYWxsKCk7XG4gICAgICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBjYWxsUHJvbWlzZSA9IGNhbGwoKTtcbiAgICAgICAgLy8gQW4gYWJhbmRvbmVkIGNhbGwgbXVzdCBub3Qgc3VyZmFjZSBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIHdoZW4gaXQgZXZlbnR1YWxseSBmYWlsc1xuICAgICAgICBsZXQgYWJhbmRvbiA9ICgpID0+IHZvaWQgY2FsbFByb21pc2UudGhlbigoKSA9PiB7IH0sICgpID0+IHsgfSk7XG4gICAgICAgIGlmICh0aW1lb3V0LnVwbG9hZEJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIEEgZmxhdCBiYXNlIHBsdXMgdGhlIHByZWRpY3RlZCB0cmFuc2ZlciB0aW1lLCBzbyB0aW55IHVwbG9hZHMgc3RpbGwgZ2V0IHRoZSBmdWxsIGJhc2Ugd2luZG93XG4gICAgICAgICAgICBsZXQgYWxsb3dlZCA9IFNNQVJUX1RJTUVPVVRfUFJPQkUgKyB0aW1lb3V0LnVwbG9hZEJ5dGVzIC8gU01BUlRfVElNRU9VVF9VUExPQURfQllURVNfUEVSX1NFQ09ORCAqIDEwMDA7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtjYWxsUHJvbWlzZS50aGVuKHZhbHVlID0+ICh7IHZhbHVlIH0pKSwgZGVsYXkoYWxsb3dlZCkudGhlbigoKSA9PiB1bmRlZmluZWQpXSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgYWJhbmRvbigpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NNQVJUX1RJTUVPVVRfTUFSS0VSfSBVcGxvYWQgdGltZWQgb3V0LiAke3RpbWVvdXQubGFiZWwgfHwgYFVwbG9hZCBvZiAke3RpbWVvdXQudXBsb2FkQnl0ZXN9IGJ5dGVzYH0gdG8gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IHRpbWVkIG91dCBhZnRlciAke0RhdGUubm93KCkgLSBzdGFydH1tcyAoYWxsb3dlZCAke01hdGgucm91bmQoYWxsb3dlZCl9bXM6ICR7U01BUlRfVElNRU9VVF9QUk9CRX1tcyBiYXNlIHBsdXMgdHJhbnNmZXIgYXQgYW4gYXNzdW1lZCAke1NNQVJUX1RJTUVPVVRfVVBMT0FEX0JZVEVTX1BFUl9TRUNPTkR9IGJ5dGVzL3MpYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGF0aCA9IHRpbWVvdXQucGF0aDtcbiAgICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuIGF3YWl0IGNhbGxQcm9taXNlO1xuICAgICAgICBsZXQgZmlyc3QgPSBhd2FpdCBQcm9taXNlLnJhY2UoW2NhbGxQcm9taXNlLnRoZW4odmFsdWUgPT4gKHsgdmFsdWUgfSkpLCBkZWxheShTTUFSVF9USU1FT1VUX1BST0JFKS50aGVuKCgpID0+IHVuZGVmaW5lZCldKTtcbiAgICAgICAgaWYgKGZpcnN0KSByZXR1cm4gZmlyc3QudmFsdWU7XG4gICAgICAgIGxldCBwcm9iZUVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBpbmZvOiB7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5mbyA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgICAgICAgc291cmNlLnJlYWQoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZ2V0SW5mbyhwYXRoKSkudGhlbih4ID0+ICh7IHNpemU6IHggJiYgeC5zaXplIHx8IDAgfSkpLFxuICAgICAgICAgICAgICAgIGRlbGF5KFNNQVJUX1RJTUVPVVRfUFJPQkUpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBwcm9iZUVycm9yID0gU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgICAgIGFiYW5kb24oKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTTUFSVF9USU1FT1VUX01BUktFUn0gUmVhZCB0aW1lZCBvdXQgd2l0aCBubyBzaXplIHByb2JlLiBSZWFkIG9mICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9IGZyb20gJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9OiBubyByZXN1bHQgYWZ0ZXIgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXMsIGFuZCBnZXRJbmZvICR7cHJvYmVFcnJvciAmJiBgZmFpbGVkICgke3Byb2JlRXJyb3J9KWAgfHwgYGNvdWxkIG5vdCBhbnN3ZXIgd2l0aGluICR7U01BUlRfVElNRU9VVF9QUk9CRX1tcyBlaXRoZXJgfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbGxvd2VkID0gTWF0aC5tYXgoU01BUlRfVElNRU9VVF9QUk9CRSwgaW5mby5zaXplIC8gU01BUlRfVElNRU9VVF9ET1dOTE9BRF9CWVRFU19QRVJfU0VDT05EICogMTAwMCk7XG4gICAgICAgIGxldCByZW1haW5pbmcgPSBzdGFydCArIGFsbG93ZWQgLSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgICAgICAgbGV0IHNlY29uZCA9IGF3YWl0IFByb21pc2UucmFjZShbY2FsbFByb21pc2UudGhlbih2YWx1ZSA9PiAoeyB2YWx1ZSB9KSksIGRlbGF5KHJlbWFpbmluZykudGhlbigoKSA9PiB1bmRlZmluZWQpXSk7XG4gICAgICAgICAgICBpZiAoc2Vjb25kKSByZXR1cm4gc2Vjb25kLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGFiYW5kb24oKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NNQVJUX1RJTUVPVVRfTUFSS0VSfSBSZWFkIHRpbWVkIG91dC4gUmVhZCBvZiAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSAoJHtpbmZvLnNpemV9IGJ5dGVzKSBmcm9tICR7c291cmNlLmdldERlYnVnTmFtZSgpfSB0aW1lZCBvdXQgYWZ0ZXIgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXMgKGFsbG93ZWQgJHtNYXRoLnJvdW5kKGFsbG93ZWQpfW1zIGZyb20gdGhlIGNhbGwncyBzdGFydCwgYXQgYW4gYXNzdW1lZCAke1NNQVJUX1RJTUVPVVRfRE9XTkxPQURfQllURVNfUEVSX1NFQ09ORH0gYnl0ZXMvcylgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxhc3RDb25maWdSZWZyZXNoID0gMDtcbiAgICBwcml2YXRlIGFzeW5jIHByZXBhcmVXcm9uZ1RhcmdldFJldHJ5KHN0YXRlOiBDaGFpblN0YXRlLCBraW5kOiBcIndpbmRvd1wiIHwgXCJyb3V0ZVwiIHwgXCJ1bmNvbmZpZ3VyZWRcIik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoa2luZCA9PT0gXCJ3aW5kb3dcIikge1xuICAgICAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgbmVhckJvdW5kYXJ5ID0gc3RhdGUuc291cmNlcy5zb21lKHNvdXJjZSA9PiBzb3VyY2UuY29uZmlnLnZhbGlkV2luZG93LnNvbWUodCA9PiB0ID4gMCAmJiB0IDwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgJiYgTWF0aC5hYnModCAtIG5vdykgPD0gV1JPTkdfVEFSR0VUX0JPVU5EQVJZX1dJTkRPVykpO1xuICAgICAgICAgICAgaWYgKG5lYXJCb3VuZGFyeSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBXcml0ZSByZWplY3RlZCBieSAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiByYWNlZCBhIHZhbGlkIHdpbmRvdyBib3VuZGFyeTsgd2FpdGluZyAke1dST05HX1RBUkdFVF9CT1VOREFSWV9SRVRSWV9ERUxBWSAvIDEwMDB9cyBhbmQgcmV0cnlpbmdgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShXUk9OR19UQVJHRVRfQk9VTkRBUllfUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdENvbmZpZ1JlZnJlc2ggPCBDT05GSUdfUkVGUkVTSF9USFJPVFRMRSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmxhc3RDb25maWdSZWZyZXNoID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IHJlYXNvbiA9IGtpbmQgPT09IFwid2luZG93XCIgJiYgXCJ3cm9uZyB2YWxpZCB3aW5kb3dcIiB8fCBraW5kID09PSBcInJvdXRlXCIgJiYgXCJ3cm9uZyByb3V0ZVwiIHx8IFwidGhlIHN0b3JlIGhhcyBubyBjb25maWd1cmF0aW9uIGVudHJ5IG9uIHRoYXQgc2VydmVyXCI7XG4gICAgICAgIGNvbnNvbGUubG9nKGBXcml0ZSByZWplY3RlZCBieSAke3RoaXMuZ2V0RGVidWdOYW1lKCl9ICgke3JlYXNvbn0pOiBvdXIgY29uZmlnIGRpc2FncmVlcyB3aXRoIHRoZSBzZXJ2ZXIncyAobGlrZWx5IHN0YWxlLCBvciBhIGRlcGxveSBzd2l0Y2hvdmVyKTsgcmVmcmVzaGluZyBpdCBhbmQgcmV0cnlpbmdgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZS5yZWZyZXNoQWN0aXZlQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXF1ZXN0PFQ+KGNvbmZpZzogeyBhcGlPbmx5PzogYm9vbGVhbjsgd3JpdGU/OiBib29sZWFuOyByb3V0ZT86IG51bWJlcjsgbm9GYWxsYmFja3M/OiBib29sZWFuOyBmYWxsYmFja3M/OiBib29sZWFuOyByZXRyaWVzPzogbnVtYmVyOyBmYXN0PzogYm9vbGVhbjsgdGltZW91dD86IFNtYXJ0VGltZW91dCB9LCBydW46IChhcmNoaXZlczogSUFyY2hpdmVzLCBzb3VyY2VVcmw6IHN0cmluZykgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bihzdGF0ZSwgY29uZmlnLCBydW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB3YWl0aW5nRm9yQWNjZXNzKCk6IFByb21pc2U8eyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZzsgcmVhc29uOiBzdHJpbmc7IGFkZE1hY2hpbmVDb21tYW5kOiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAvLyBBIHNvdXJjZSB3aG9zZSB3aW5kb3cgaGFzIHBhc3NlZCBpcyBuZXZlciByZWFkIG9yIHdyaXR0ZW4gYWdhaW4sIHNvIGl0cyBhY2Nlc3Mgc3RhdGUgaXMgaXJyZWxldmFudCAtIGFuZCBhc2tpbmcgYSBkZWFkIGludGVybWVkaWF0ZSB3b3VsZCBqdXN0IGhhbmcgb3IgdGhyb3cuIEZ1dHVyZSB3aW5kb3dzIERPIG1hdHRlcjogYWNjZXNzIHNob3VsZCBiZSBncmFudGVkIGJlZm9yZSB0aGVpciB3aW5kb3cgc3RhcnRzLlxuICAgICAgICAgICAgaWYgKHNvdXJjZS5jb25maWcudmFsaWRXaW5kb3dbMV0gPD0gRGF0ZS5ub3coKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoc291cmNlLmFwaSBpbnN0YW5jZW9mIEFyY2hpdmVzUmVtb3RlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHdhaXRpbmcgPSBhd2FpdCBzb3VyY2UuYXBpLndhaXRpbmdGb3JBY2Nlc3MoKTtcbiAgICAgICAgICAgICAgICBpZiAod2FpdGluZykgcmV0dXJuIHdhaXRpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKiogVGhlIHNvdXJjZXMgdGhhdCBjYW4gc2VydmUgYSBmaWxlIHJpZ2h0IG5vdywgaW4gZGlzcGF0Y2ggb3JkZXIgLSB0aGUgZmlyc3QgaXMgdGhlIHdyaXRlIG5vZGUsIHRoZSBvbmUgYSBwbGFpbiByZWFkIGFza3MgZmlyc3QuIEVhY2ggZW50cnkncyB1cmwgaXMgd2hhdCBHZXRDb25maWcuc291cmNlVXJsIC8gR2V0SW5mb0NvbmZpZy5zb3VyY2VVcmwgYWNjZXB0LCBzbyBsaXN0aW5nIHRoZXNlIGFuZCB0aGVuIHJlYWRpbmcgd2l0aCBzb3VyY2VVcmwgY29tcGFyZXMgdGhlIGNvcGllcyB0aGUgc291cmNlcyBhY3R1YWxseSBob2xkLiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRGaWxlU291cmNlcyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxTb3VyY2VDb25maWdbXT4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGZpbGVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlLnNvdXJjZXMuZmlsdGVyKHggPT4gcm91dGVDb250YWlucyh4LmNvbmZpZy5yb3V0ZSwgcm91dGUpICYmIGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpKS5tYXAoeCA9PiB4LmNvbmZpZyk7XG4gICAgfVxuXG4gICAgLy8gVGhlIG9uZSBleGFjdCBzb3VyY2UgYSBzb3VyY2VVcmwgcmVhZCBtZWFucywgbm8gZmFsbGJhY2sgb2YgYW55IGtpbmQgLSBhc2tpbmcgZm9yIGEgU1BFQ0lGSUMgc291cmNlJ3MgY29weSBhbmQgZ2V0dGluZyBhbm90aGVyJ3Mgd291bGQgZGVmZWF0IHRoZSBwb2ludFxuICAgIHByaXZhdGUgYXN5bmMgcnVuT25Tb3VyY2U8VD4oc291cmNlVXJsOiBzdHJpbmcsIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgc291cmNlID0gc3RhdGUuc291cmNlcy5maW5kKHggPT4geC5jb25maWcudXJsID09PSBzb3VyY2VVcmwpO1xuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb25maWd1cmVkIHNvdXJjZSBoYXMgdGhlIHVybCAke0pTT04uc3RyaW5naWZ5KHNvdXJjZVVybCl9IGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9IChzb3VyY2VzOiAke3N0YXRlLnNvdXJjZXMubWFwKHggPT4geC5jb25maWcudXJsKS5qb2luKFwiLCBcIil9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBzb3VyY2UucmVhZChydW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKiBnZXQyLCBidXQgdHJ5aW5nIHNvdXJjZXMgaW4gbGF0ZW5jeSBvcmRlciAoZmFzdGVzdCBmaXJzdCkgaW5zdGVhZCBvZiBjb25maWcgb3JkZXIuIFdoaWxlIHRoaXMgaXMgbXVjaCBmYXN0ZXIsIGl0IG1pZ2h0IG1pc3MgaW1tZWRpYXRlIHdyaXRlczogdGhlIHdyaXRlIG5vZGUgaXMgbm8gbG9uZ2VyIHRyaWVkIGZpcnN0LCBzbyBhIGxhZ2dpbmcgcmVwbGljYSBtYXkgYW5zd2VyIHdpdGggYSBzbGlnaHRseSBvbGRlciB2YWx1ZS4gRXhjbHVzaXZlIHdpdGggbm9GYWxsYmFja3MgKHdoaWNoIG9ubHkgY29uc2lkZXJzIG9uZSBzb3VyY2UgLSB0aGUgd3JpdGUgbm9kZSAtIHNvIHRoZXJlIGlzIG5vIG9yZGVyIHRvIHNwZWVkIHVwKTsgcGFzc2luZyBib3RoIHRocm93cy4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RmFzdChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw6IHN0cmluZyB9IHwgeyBkYXRhPzogdW5kZWZpbmVkOyB3cml0ZVRpbWU/OiB1bmRlZmluZWQ7IHNpemU/OiB1bmRlZmluZWQ7IHVybDogc3RyaW5nIH0+IHtcbiAgICAgICAgaWYgKGNvbmZpZz8uc291cmNlVXJsKSB7XG4gICAgICAgICAgICAvLyBBIHNwZWNpZmljIHNvdXJjZSBsZWF2ZXMgbm90aGluZyBmb3IgdGhlIGxhdGVuY3kgb3JkZXJpbmcgdG8gZGVjaWRlXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoeyByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCBub0ZhbGxiYWNrczogY29uZmlnPy5ub0ZhbGxiYWNrcywgcmV0cmllczogY29uZmlnPy5yZXRyaWVzLCBmYXN0OiB0cnVlLCB0aW1lb3V0OiB7IHBhdGg6IGZpbGVOYW1lIH0gfSwgYXN5bmMgKGFyY2hpdmVzLCB1cmwpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcmNoaXZlcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICAgICAgLy8gRW1wdHkgZGF0YSBpcyBhIHRvbWJzdG9uZSwgbm90IGNvbnRlbnQgLSBzZWUgZ2V0MlxuICAgICAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhIHx8ICFyZXN1bHQuZGF0YS5sZW5ndGggJiYgIWNvbmZpZz8uaW5jbHVkZVRvbWJzdG9uZXMgJiYgIShjb25maWc/LnJhbmdlICYmIHJlc3VsdC5zaXplKSkgcmV0dXJuIHsgdXJsIH07XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiByZXN1bHQuZGF0YSwgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuc2l6ZSwgdXJsIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKiogQWx3YXlzIHJlc29sdmVzIHdpdGggYSB1cmwgLSB0aGUgYXV0aG9yaXR5IHRoYXQgYW5zd2VyZWQuIEEgdmFsdWUgdGhhdCBkb2Vzbid0IGV4aXN0IGlzIHN0aWxsIGFuIGFuc3dlciBGUk9NIGEgc2VydmVyLCBzbyBpdCBjb21lcyBiYWNrIGFzIHsgdXJsIH0gd2l0aCBubyBkYXRhIChuZXZlciBwbGFpbiB1bmRlZmluZWQpOyBlcnJvcnMgZnJvbSBldmVyeSBzb3VyY2UgdGhyb3cgaW5zdGVhZC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw6IHN0cmluZyB9IHwgeyBkYXRhPzogdW5kZWZpbmVkOyB3cml0ZVRpbWU/OiB1bmRlZmluZWQ7IHNpemU/OiB1bmRlZmluZWQ7IHVybDogc3RyaW5nIH0+IHtcbiAgICAgICAgY29uc3Qgc291cmNlVXJsID0gY29uZmlnPy5zb3VyY2VVcmw7XG4gICAgICAgIGlmIChzb3VyY2VVcmwpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bk9uU291cmNlKHNvdXJjZVVybCwgYXN5bmMgYXJjaGl2ZXMgPT4ge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhcmNoaXZlcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSB8fCAhcmVzdWx0LmRhdGEubGVuZ3RoICYmICFjb25maWc/LmluY2x1ZGVUb21ic3RvbmVzICYmICEoY29uZmlnPy5yYW5nZSAmJiByZXN1bHQuc2l6ZSkpIHJldHVybiB7IHVybDogc291cmNlVXJsIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0LmRhdGEsIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUsIHVybDogc291cmNlVXJsIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHsgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSwgbm9GYWxsYmFja3M6IGNvbmZpZz8ubm9GYWxsYmFja3MsIHJldHJpZXM6IGNvbmZpZz8ucmV0cmllcywgdGltZW91dDogeyBwYXRoOiBmaWxlTmFtZSB9IH0sIGFzeW5jIChhcmNoaXZlcywgdXJsKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIC8vIEVtcHR5IGRhdGEgaXMgYSB0b21ic3RvbmUsIG5vdCBjb250ZW50ICh1bmxlc3MgdGhlIGNhbGxlciBhc2tlZCBmb3IgdG9tYnN0b25lcykgLSBhIHJhbmdlZCByZWFkIG9mIGEgUkVBTCBmaWxlIGNhbiBsZWdpdGltYXRlbHkgYmUgZW1wdHkgdGhvdWdoIChyYW5nZSBwYXN0IEVPRiksIHdoaWNoIHRoZSB0b3RhbCBzaXplIGRpc3Rpbmd1aXNoZXNcbiAgICAgICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSB8fCAhcmVzdWx0LmRhdGEubGVuZ3RoICYmICFjb25maWc/LmluY2x1ZGVUb21ic3RvbmVzICYmICEoY29uZmlnPy5yYW5nZSAmJiByZXN1bHQuc2l6ZSkpIHJldHVybiB7IHVybCB9O1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0LmRhdGEsIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUsIHVybCB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0SW5mb0NvbmZpZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw6IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IHNvdXJjZVVybCA9IGNvbmZpZz8uc291cmNlVXJsO1xuICAgICAgICBpZiAoc291cmNlVXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5PblNvdXJjZShzb3VyY2VVcmwsIGFzeW5jIGFyY2hpdmVzID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0SW5mbyhmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHsgLi4ucmVzdWx0LCB1cmw6IHNvdXJjZVVybCB9IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoeyByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCBub0ZhbGxiYWNrczogY29uZmlnPy5ub0ZhbGxiYWNrcywgcmV0cmllczogY29uZmlnPy5yZXRyaWVzIH0sIGFzeW5jIChhcmNoaXZlcywgdXJsKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXJjaGl2ZXMuZ2V0SW5mbyhmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgJiYgeyAuLi5yZXN1bHQsIHVybCB9IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gV2l0aG91dCBmYWxsYmFja3M6IHRoZSBBVVRIT1JJVEFUSVZFIGNvdmVyaW5nIE9OTFkgLSB0aGUgZmlyc3Qgc291cmNlIHBlciByb3V0ZSBpbiBjb25maWcgb3JkZXIgKHRoZSBzYW1lIG5vZGUgZXZlcnkgd3JpdGUgYW5kIHJlYWQgdGFyZ2V0cyksIGRvd24gb3Igbm90LiBJdCBpcyBORVZFUiBleGNsdWRlZCBhbmQgTkVWRVIgc3Vic3RpdHV0ZWQsIHNvIGEgbGlzdGluZyB0aGF0IGNhbid0IHJlYWNoIGl0cyB3cml0ZSBub2RlcyByZXRyaWVzIHRob3NlIHNhbWUgbm9kZXMgdW50aWwgdGhlIGRlYWRsaW5lIGFuZCB0aGVuIGZhaWxzLCByYXRoZXIgdGhhbiBxdWlldGx5IHJlYWRpbmcgc2Vjb25kLWhhbmQgZGF0YSBvZmYgYSByZXBsaWNhIG9yIGJhY2tibGF6ZS4gZXhjbHVkZS9jb29sZG93bi9zdWJzdGl0dXRpb24gYXBwbHkgT05MWSB3aGVuIHRoZSBjYWxsZXIgb3B0ZWQgaW50byBmYWxsYmFja3MuXG4gICAgcHJpdmF0ZSBzZWxlY3RDb3ZlcmluZ1NvdXJjZXMoc3RhdGU6IENoYWluU3RhdGUsIGNvbmZpZz86IHsgZmFsbGJhY2tzPzogYm9vbGVhbjsgZXhjbHVkZT86IFNldDxTb3VyY2VXcmFwcGVyPiB9KTogU291cmNlV3JhcHBlcltdIHtcbiAgICAgICAgaWYgKGNvbmZpZz8uZmFsbGJhY2tzKSB7XG4gICAgICAgICAgICBsZXQgY2FuZGlkYXRlcyA9IHN0YXRlLnNvdXJjZXMuZmlsdGVyKHggPT4gY29uZmlnV2luZG93Q3VycmVudCh4LmNvbmZpZykgJiYgeC5hcGkgJiYgIWNvbmZpZy5leGNsdWRlPy5oYXMoeCkpO1xuICAgICAgICAgICAgbGV0IHVzYWJsZSA9IGNhbmRpZGF0ZXMuZmlsdGVyKHggPT4gIXguaXNPbkNvb2xkb3duKCkpO1xuICAgICAgICAgICAgbGV0IGNob3NlbiA9IGNvdmVyUm91dGVzKHVzYWJsZSkgfHwgY292ZXJSb3V0ZXMoY2FuZGlkYXRlcyk7XG4gICAgICAgICAgICBpZiAoY2hvc2VuKSByZXR1cm4gY2hvc2VuO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY292ZXIgdGhlIGZ1bGwgcm91dGUgc3BhY2UgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IHRoZSBhdmFpbGFibGUgc291cmNlcyBsZWF2ZSBhIGdhcCAoc29tZSBzaGFyZHMgYXJlIGRvd24gb3IgVVJMLW9ubHkpYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSBzdGF0ZS5zb3VyY2VzLmZpbHRlcih4ID0+IGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpICYmIHguYXBpKTtcbiAgICAgICAgbGV0IGNob3NlbiA9IGNvdmVyUm91dGVzKGNhbmRpZGF0ZXMpO1xuICAgICAgICBpZiAoIWNob3Nlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY292ZXIgdGhlIGZ1bGwgcm91dGUgc3BhY2UgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06IHRoZSBhdmFpbGFibGUgc291cmNlcyBsZWF2ZSBhIGdhcCAoc29tZSBzaGFyZHMgYXJlIGRvd24gb3IgVVJMLW9ubHkpYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNob3NlbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bk9uQ292ZXJpbmc8VD4ob3BlcmF0aW9uOiBzdHJpbmcsIHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4sIGNvbmZpZz86IHsgZmFsbGJhY2tzPzogYm9vbGVhbiB9KTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBDT1ZFUklOR19SRVRSWV9USU1FT1VUO1xuICAgICAgICAvLyBTb3VyY2VzIHRoYXQgZmFpbGVkIGR1cmluZyB0aGlzIGNhbGwgLSB3aXRoIGZhbGxiYWNrcywgdGhlIG5leHQgYXR0ZW1wdCBjb3ZlcnMgdGhlaXIgcm91dGVzIHdpdGggdGhlIG5leHQgc291cmNlIGhvbGRpbmcgdGhlbSBpbnN0ZWFkXG4gICAgICAgIGxldCBmYWlsZWQgPSBuZXcgU2V0PFNvdXJjZVdyYXBwZXI+KCk7XG4gICAgICAgIGxldCB0cmllcyA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB0cmllcysrO1xuICAgICAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgLy8gRXJyb3JzIG5hbWUgdGhlIE9QRVJBVElPTiBhbmQgdGhlIFNQRUNJRklDIHNvdXJjZXMgdGhhdCBmYWlsZWQgLSBcInRoZSBmaW5kIGZhaWxlZCBiZWNhdXNlIHNvdXJjZSBYIGlzIHVuYXZhaWxhYmxlXCIsIG5ldmVyIGFuIGFub255bW91cyBmYWlsdXJlIGF0dHJpYnV0ZWQgdG8gdGhlIHdob2xlIGNoYWluXG4gICAgICAgICAgICBsZXQgb3V0Y29tZSA9IGF3YWl0IChhc3luYyAoKTogUHJvbWlzZTx7IHZhbHVlczogVFtdIH0gfCB7IGVycm9yOiBFcnJvciB9PiA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNvdmVyaW5nOiBTb3VyY2VXcmFwcGVyW107XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY292ZXJpbmcgPSB0aGlzLnNlbGVjdENvdmVyaW5nU291cmNlcyhzdGF0ZSwgeyBmYWxsYmFja3M6IGNvbmZpZz8uZmFsbGJhY2tzLCBleGNsdWRlOiBmYWlsZWQgfSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IEVycm9yKGAke29wZXJhdGlvbn0gY2Fubm90IHJ1bjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVzOiBUW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgZmFpbHVyZXM6IHsgc291cmNlOiBTb3VyY2VXcmFwcGVyOyBlcnJvcjogRXJyb3IgfVtdID0gW107XG4gICAgICAgICAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGNvdmVyaW5nLm1hcChhc3luYyAoc291cmNlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXBpID0gc291cmNlLmFwaTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZC5hZGQoc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzLnB1c2goeyBzb3VyY2UsIGVycm9yOiBuZXcgRXJyb3IoYFVSTC1vbmx5IGFjY2Vzcywgd2hpY2ggY2Fubm90IHNlcnZlICR7b3BlcmF0aW9ufWApIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChhd2FpdCBydW4oYXBpKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc291cmNlLmlzQ29ubmVjdGVkKCkpIHNvdXJjZS5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkLmFkZChzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZXMucHVzaCh7IHNvdXJjZSwgZXJyb3I6IGUgYXMgRXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIGFmdGVyICR7Zm9ybWF0VGltZShEYXRlLm5vdygpIC0gdGltZSl9IGluZGV4ICR7aW5kZXh9IG9mICR7Y292ZXJpbmcubGVuZ3RofWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGlmICghZmFpbHVyZXMubGVuZ3RoKSByZXR1cm4geyB2YWx1ZXMgfTtcbiAgICAgICAgICAgICAgICBpZiAoZmFpbHVyZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBuZXcgRXJyb3IoYCR7b3BlcmF0aW9ufSBmYWlsZWQgYmVjYXVzZSBzb3VyY2UgJHtmYWlsdXJlc1swXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IGlzIHVuYXZhaWxhYmxlOiAke2ZhaWx1cmVzWzBdLmVycm9yLm1lc3NhZ2UgPz8gZmFpbHVyZXNbMF0uZXJyb3J9LiBGYWxsYmFja3MgPSAkeyEhY29uZmlnPy5mYWxsYmFja3N9LiBUcmllcyA9ICR7dHJpZXN9LCBUb29rICR7Zm9ybWF0VGltZShEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbmV3IEVycm9yKGAke29wZXJhdGlvbn0gZmFpbGVkIGJlY2F1c2UgJHtmYWlsdXJlcy5sZW5ndGh9IG9mIHRoZSAke2NvdmVyaW5nLmxlbmd0aH0gY292ZXJpbmcgc291cmNlcyBhcmUgdW5hdmFpbGFibGU6ICR7ZmFpbHVyZXMubWFwKHggPT4gYCR7eC5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9OiAke3guZXJyb3IubWVzc2FnZSA/PyB4LmVycm9yfWApLmpvaW4oXCIgfCBcIil9LiBGYWxsYmFja3MgPSAkeyEhY29uZmlnPy5mYWxsYmFja3N9LiBUcmllcyA9ICR7dHJpZXN9LCBUb29rICR7Zm9ybWF0VGltZShEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gKSB9O1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIGlmIChcInZhbHVlc1wiIGluIG91dGNvbWUpIHJldHVybiBvdXRjb21lLnZhbHVlcztcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG91dGNvbWUuZXJyb3I7XG4gICAgICAgICAgICAvLyBTdWJzdGl0dXRpb24gY29tZXMgQkVGT1JFIHRoZSBkZWFkbGluZSBjaGVjazogYSBzaW5nbGUgY29ubmVjdCB0aW1lb3V0IGNhbiBlYXQgdGhlIGVudGlyZSBkZWFkbGluZSwgYW5kIGdpdmluZyB1cCB0aGVuIC0gd2l0aG91dCBldmVyIHRyeWluZyB0aGUgc3Vic3RpdHV0ZSB0aGF0IGZhbGxiYWNrcyBleGlzdCBmb3IgLSB0aHJvd3MgZXhhY3RseSB3aGVuIGZhbGxpbmcgYmFjayBtYXR0ZXJzIG1vc3QuIFN1YnN0aXR1dGlvbiBjYW5ub3QgbG9vcCBwYXN0IHRoZSBkZWFkbGluZSBmb3JldmVyOiBldmVyeSBwYXNzIGFkZHMgaXRzIGZhaWx1cmVzIHRvIGBmYWlsZWRgLCBzbyB0aGUgc3Vic3RpdHV0ZXMgcnVuIG91dCB3aXRoIHRoZSBzb3VyY2VzLlxuICAgICAgICAgICAgaWYgKGNvbmZpZz8uZmFsbGJhY2tzICYmIGZhaWxlZC5zaXplKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1YnN0aXR1dGFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENvdmVyaW5nU291cmNlcyhzdGF0ZSwgeyBmYWxsYmFja3M6IHRydWUsIGV4Y2x1ZGU6IGZhaWxlZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3Vic3RpdHV0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgICAgICAgICBpZiAoc3Vic3RpdHV0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYChyZXRyeWluZyB3aXRoIGZhbGxiYWNrcykgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTm8gc3Vic3RpdHV0ZSBjb3ZlcnMgdGhlIGZhaWxlZCByb3V0ZXMgLSByZXRyeSB0aGUgZmFpbGVkIHNvdXJjZXMgdGhlbXNlbHZlcyBhZnRlciB0aGUgZGVsYXlcbiAgICAgICAgICAgICAgICBmYWlsZWQuY2xlYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke2Vycm9yLm1lc3NhZ2V9LiBSZXRyeWluZyBpbiAke0NPVkVSSU5HX1JFVFJZX0RFTEFZIC8gMTAwMH1zIChnaXZpbmcgdXAgYXQgJHtmb3JtYXREYXRlVGltZURldGFpbGVkKGRlYWRsaW5lKX0pLmApO1xuICAgICAgICAgICAgdm9pZCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KENPVkVSSU5HX1JFVFJZX0RFTEFZKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpKS5tYXAoeCA9PiB4LnBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IEZpbmRDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgdGhpcy5ydW5PbkNvdmVyaW5nKGBUaGUgZmluZCBvZiAke0pTT04uc3RyaW5naWZ5KHByZWZpeCl9YCwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpLCB7IGZhbGxiYWNrczogY29uZmlnPy5mYWxsYmFja3MgfSk7XG4gICAgICAgIGxldCBieVBhdGggPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICBmb3IgKGxldCBsaXN0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGJ5UGF0aC5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nIHx8IGZpbGUuY3JlYXRlVGltZSA+IGV4aXN0aW5nLmNyZWF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnlQYXRoLnNldChmaWxlLnBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWVyZ2VkID0gWy4uLmJ5UGF0aC52YWx1ZXMoKV07XG4gICAgICAgIHNvcnQobWVyZ2VkLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhgVGhlIGNoYW5nZXMgbGlzdGluZyBzaW5jZSAke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQoY29uZmlnLnRpbWUpfWAsIGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldENoYW5nZXNBZnRlcjIoY29uZmlnKSk7XG4gICAgICAgIGxldCBieVBhdGggPSBuZXcgTWFwPHN0cmluZywgQXJjaGl2ZUZpbGVJbmZvPigpO1xuICAgICAgICBmb3IgKGxldCBsaXN0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGJ5UGF0aC5nZXQoZmlsZS5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nIHx8IGZpbGUuY3JlYXRlVGltZSA+IGV4aXN0aW5nLmNyZWF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnlQYXRoLnNldChmaWxlLnBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWVyZ2VkID0gWy4uLmJ5UGF0aC52YWx1ZXMoKV07XG4gICAgICAgIHNvcnQobWVyZ2VkLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRTeW5jU3RhdHVzKCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgICAgIGxldCBzdGF0dXNlcyA9IGF3YWl0IHRoaXMucnVuT25Db3ZlcmluZyhgVGhlIHN5bmMgc3RhdHVzIGNoZWNrYCwgYXN5bmMgYXJjaGl2ZXMgPT4ge1xuICAgICAgICAgICAgaWYgKCFhcmNoaXZlcy5nZXRTeW5jU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBnZXRTeW5jU3RhdHVzIGlzIG5vdCBzdXBwb3J0ZWQ6ICR7YXJjaGl2ZXMuZ2V0RGVidWdOYW1lKCl9IGRvZXMgbm90IGltcGxlbWVudCBpdGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFyY2hpdmVzLmdldFN5bmNTdGF0dXMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGxTY2Fuc0NvbXBsZXRlOiBzdGF0dXNlcy5ldmVyeSh4ID0+IHguYWxsU2NhbnNDb21wbGV0ZSksXG4gICAgICAgICAgICBpbmRleFNpemU6IHN0YXR1c2VzLnJlZHVjZSgoc3VtLCB4KSA9PiBzdW0gKyB4LmluZGV4U2l6ZSwgMCksXG4gICAgICAgICAgICBzb3VyY2VzOiBzdGF0dXNlcy5mbGF0TWFwKHggPT4geC5zb3VyY2VzKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5zb3VyY2VzLnNvbWUoeCA9PiB4LmFwaSkpIHJldHVybiB7IHJlbW90ZUNvbmZpZzogc3RhdGUuY29uZmlnIH07XG4gICAgICAgIGxldCBjb25maWcgPSBhd2FpdCB0aGlzLnJ1bihzdGF0ZSwgeyBhcGlPbmx5OiB0cnVlIH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmdldENvbmZpZygpKTtcbiAgICAgICAgcmV0dXJuIHsgLi4uY29uZmlnLCByZW1vdGVDb25maWc6IHN0YXRlLmNvbmZpZyB9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHN0YXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnV2luZG93Q3VycmVudChzb3VyY2UuY29uZmlnKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWF3YWl0IHNvdXJjZS5oYXNXcml0ZUFjY2VzcygpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldChmaWxlTmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFNldENvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICghZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRW1wdHkgd3JpdGUgcmVmdXNlZDogc2V0IHdhcyBjYWxsZWQgd2l0aCBhbiBlbXB0eSBidWZmZXIgZm9yICR7SlNPTi5zdHJpbmdpZnkoZmlsZU5hbWUpfTogYW4gZW1wdHkgZmlsZSBJUyBhIGRlbGV0aW9uIGluIHRoaXMgc3lzdGVtIGFuZCB3b3VsZCByZWFkIGJhY2sgYXMgbWlzc2luZyAtIGNhbGwgZGVsIGluc3RlYWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZU5hbWUgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0Um91dGluZ0NvbmZpZyhkYXRhLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlTmFtZS5pbmNsdWRlcyhWQVJJQUJMRV9TSEFSRCkgJiYgcGFyc2VWYXJpYWJsZVJvdXRlKGZpbGVOYW1lKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXRWYXJpYWJsZVNoYXJkKGZpbGVOYW1lLCBkYXRhLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IExBUkdFX1NFVF9USFJFU0hPTEQpIHtcbiAgICAgICAgICAgIC8vIFN0cmVhbWVkIGF1dG9tYXRpY2FsbHkgc28gY2FsbGVycyBuZXZlciBoYXZlIHRvIGNhbGwgc2V0TGFyZ2VGaWxlIHRoZW1zZWx2ZXMgd2hlbiB0aGV5IGFscmVhZHkgaG9sZCB0aGUgYnVmZmVyIC0gb25lIGdpYW50IG1lc3NhZ2Ugd291bGQgZXhjZWVkIHRoZSB3aXJlIGxpbWl0IGFuZCBsYWcgZXZlcnkgb3RoZXIgY2xpZW50IG9uIHRoZSBjb25uZWN0aW9uLiBUaGUgd2hvbGUgY29uZmlnIGdvZXMgd2l0aCBpdCAoaW5jbHVkaW5nIGZhbGxiYWNrcywgd2hpY2ggdGhlIGJ1ZmZlcidzIHJlc3RhcnRTdHJlYW0gbWFrZXMgcG9zc2libGUpOiBhIGZpbGUgbXVzdCBub3QgZ2V0IGRpZmZlcmVudCB3cml0ZSBzZW1hbnRpY3MganVzdCBmb3IgYmVpbmcgYmlnLlxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRMYXJnZUZpbGUoeyBwYXRoOiBmaWxlTmFtZSwgLi4uY29uZmlnLCAuLi5idWZmZXJDaHVua1N0cmVhbShkYXRhKSB9KTtcbiAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyB3cml0ZTogdHJ1ZSwgZmFsbGJhY2tzOiBjb25maWc/LmZhbGxiYWNrcywgcmV0cmllczogY29uZmlnPy5yZXRyaWVzLCByb3V0ZTogZ2V0Um91dGUoZmlsZU5hbWUpLCB0aW1lb3V0OiB7IHVwbG9hZEJ5dGVzOiBkYXRhLmxlbmd0aCwgbGFiZWw6IGBVcGxvYWQgb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlTmFtZSl9ICgke2RhdGEubGVuZ3RofSBieXRlcylgIH0gfSwgYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0KGZpbGVOYW1lLCBkYXRhLCBjb25maWcpKTtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0Um91dGluZ0NvbmZpZyhkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICAvLyBDaGVja2VkIGJlZm9yZSB0aGUgZmlyc3Qgbm9kZSBpcyB3cml0dGVuIHRvLCBub3QganVzdCBieSBlYWNoIG5vZGUgYXMgaXQgYXJyaXZlczogZXZlcnkgc2VydmVyIHdvdWxkIHJlamVjdCBpdCBhbnl3YXksIGFuZCBmaW5kaW5nIHRoYXQgb3V0IG9uZSBub2RlIGF0IGEgdGltZSBpcyBob3cgYSBjb25maWcgd3JpdGUgZW5kcyB1cCBoYWxmLWFwcGxpZWRcbiAgICAgICAgbGV0IHBhcnNlZENvbmZpZyA9IHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgICAgIGlmICghcGFyc2VkQ29uZmlnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdXRpbmcgY29uZmlnIHdyaXRlIHJlamVjdGVkIC0gbm90IGEgcGFyc2VhYmxlIGNvbmZpZy4gVGhlIGRhdGEgaXMgbm90IGEgdmFsaWQgeyB2ZXJzaW9uPywgc291cmNlczogWy4uLl0gfSBKU09OIGNvbmZpZyAoJHtkYXRhLmxlbmd0aH0gYnl0ZXMsIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9KWApO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnKHBhcnNlZENvbmZpZyk7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHdyaXRlVGltZSA9IE1hdGgucm91bmQoY29uZmlnPy5sYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKSk7XG4gICAgICAgIGxldCB3cml0dGVuOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAvLyBPbmUgd3JpdGUgcGVyIFNUT1JFLCBub3QgcGVyIHNlcnZlcjogdGhlIHdyaXRlIGxhbmRzIGluIHRoZSBzdG9yZSB0aGUgZW50cnkgTkFNRVMsIHNvIHR3byBlbnRyaWVzIHNoYXJpbmcgYSBVUkwgYnV0IG5hbWluZyBkaWZmZXJlbnQgc3RvcmVzIGFyZSB0d28gc2VwYXJhdGUgZGVsaXZlcmllcyAtIGRlZHVwaW5nIGJ5IFVSTCBhbG9uZSBsZWF2ZXMgdGhlIHNlY29uZCBzdG9yZSB1bmNvbmZpZ3VyZWQgZm9yZXZlclxuICAgICAgICBsZXQgdGFyZ2V0czogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgIGxldCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBzdGF0ZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gYCR7c291cmNlLmNvbmZpZy51cmx9fCR7c291cmNlLmNvbmZpZy5uYW1lfWA7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgICAgICAgdGFyZ2V0cy5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYFdyaXRpbmcgc3RvcmFnZSByb3V0aW5nIGNvbmZpZyBmb3IgJHt0aGlzLmdldERlYnVnTmFtZSgpfSB0byBhbGwgJHt0YXJnZXRzLmxlbmd0aH0gc3RvcmVzICh3cml0ZSB0aW1lICR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3cml0ZVRpbWUpfSk6ICR7ZGF0YS50b1N0cmluZyhcInV0ZjhcIikuc2xpY2UoMCwgMjAwMCl9YCk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRhcmdldHMubWFwKGFzeW5jIHNvdXJjZSA9PiB7XG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBgJHtzb3VyY2UuY29uZmlnLnVybH0gKHN0b3JlICR7SlNPTi5zdHJpbmdpZnkoc291cmNlLmNvbmZpZy5uYW1lKX0pYDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc291cmNlLndyaXRlKGFyY2hpdmVzID0+IGFyY2hpdmVzLnNldChST1VUSU5HX0ZJTEUsIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUgfSkpO1xuICAgICAgICAgICAgICAgIHdyaXR0ZW4ucHVzaChsYWJlbCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFdyb3RlIHRoZSBzdG9yYWdlIHJvdXRpbmcgY29uZmlnIHRvICR7bGFiZWx9YCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7bGFiZWx9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RhdGUucmVmcmVzaEFjdGl2ZUNvbmZpZygpO1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0aW5nIGNvbmZpZyB3cml0ZSBmYWlsZWQgb24gc29tZSBzdG9yZXMuIEZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9OiBmYWlsZWQgb24gJHtlcnJvcnMubGVuZ3RofSBvZiAke3RhcmdldHMubGVuZ3RofSBzdG9yZXMgKHN1Y2NlZWRlZCBvbjogJHt3cml0dGVuLmpvaW4oXCIsIFwiKSB8fCBcIm5vbmVcIn0pOiAke2Vycm9ycy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBST1VUSU5HX0ZJTEU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBkZWwoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogRGVsQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCBmYWxsYmFja3M6IGNvbmZpZz8uZmFsbGJhY2tzLCByZXRyaWVzOiBjb25maWc/LnJldHJpZXMsIHJvdXRlOiBnZXRSb3V0ZShmaWxlTmFtZSksIHRpbWVvdXQ6IHsgdXBsb2FkQnl0ZXM6IDAsIGxhYmVsOiBgRGVsZXRpb24gb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlTmFtZSl9YCB9IH0sIGFyY2hpdmVzID0+IGFyY2hpdmVzLmRlbChmaWxlTmFtZSwgY29uZmlnKSk7XG4gICAgfVxuXG4gICAgLyoqIFNlZSBJQXJjaGl2ZXMudW5kZWxldGU6IHJlc3RvcmVzIGEgZmlsZSBtYXJrZWQgZm9yIGRlbGV0aW9uLCBkaXNwYXRjaGVkIHRvIHRoZSB3cml0ZSBub2RlIGFzIFNldENvbmZpZy51bmRlbGV0ZSAodGhlIHdyaXRlIG5vZGUgcHJvcGFnYXRlcyB0aGUgcmVzdG9yZSB0byBpdHMgcGVlcnMgaXRzZWxmKS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgdW5kZWxldGUoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBzZXQgcmVmdXNlcyBlbXB0eSBidWZmZXJzLCBhbmQgYW4gdW5kZWxldGUgY2FycmllcyBubyBkYXRhIC0gdGhlIGJ5dGUgaXMgaWdub3JlZFxuICAgICAgICBsZXQgcGxhY2Vob2xkZXIgPSBCdWZmZXIuZnJvbShbMV0pO1xuICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QoeyB3cml0ZTogdHJ1ZSwgcm91dGU6IGdldFJvdXRlKGZpbGVOYW1lKSwgdGltZW91dDogeyB1cGxvYWRCeXRlczogcGxhY2Vob2xkZXIubGVuZ3RoLCBsYWJlbDogYFVuZGVsZXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZU5hbWUpfWAgfSB9LCBhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXQoZmlsZU5hbWUsIHBsYWNlaG9sZGVyLCB7IHVuZGVsZXRlOiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICAvKiogU2VlIElBcmNoaXZlcy5tb3ZlLiBXaGVuIG9uZSBub2RlIGlzIHRoZSB3cml0ZSB0YXJnZXQgZm9yIEJPVEggcGF0aHMsIHRoYXQgbm9kZSBtb3ZlcyB0aGUgZmlsZSBpdHNlbGYgLSB0aGUgYnl0ZXMgbmV2ZXIgY29tZSB0aHJvdWdoIHVzIC0gd2l0aCB0aGUgc2FtZSB3cm9uZy13aW5kb3cvcm91dGUgcmUtcmVzb2x1dGlvbiBhcyBhbnkgd3JpdGUuIFdoZW4gdGhlIHBhdGhzIHJvdXRlIHRvIGRpZmZlcmVudCBzaGFyZHMgbm8gc2luZ2xlIG5vZGUgaG9sZHMgYm90aCwgc28gdGhlIG1vdmUgZGVncmFkZXMgdG8gYSBjb3B5IHRocm91Z2ggdXMgcGx1cyBhIGRlbGV0ZSwgQ09ORklSTUVEIGF0IHRoZSBkZXN0aW5hdGlvbiBiZWZvcmUgdGhlIHNvdXJjZSBpcyB0b3VjaGVkLiBObyBzbWFydCB0aW1lb3V0IG9uIHRoZSBub2RlLXNpZGUgbW92ZTogaXQgY2FuIGJlIGEgYmlnIGZpbGUncyB3b3J0aCBvZiBub2RlLXNpZGUgd29yaywgd2hpY2ggdGhlIHVwbG9hZC1zaXplZCBkZWFkbGluZXMgd291bGQgbWlzanVkZ2UuICovXG4gICAgcHVibGljIGFzeW5jIG1vdmUoY29uZmlnOiBNb3ZlRmlsZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoY29uZmlnLmZyb21QYXRoID09PSBjb25maWcudG9QYXRoKSByZXR1cm47XG4gICAgICAgIGlmIChjb25maWcuZnJvbVBhdGggPT09IFJPVVRJTkdfRklMRSB8fCBjb25maWcudG9QYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHJvdXRpbmcgY29uZmlnICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gY2Fubm90IGJlIG1vdmVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZyb21Sb3V0ZSA9IGdldFJvdXRlKGNvbmZpZy5mcm9tUGF0aCk7XG4gICAgICAgIGxldCB0b1JvdXRlID0gZ2V0Um91dGUoY29uZmlnLnRvUGF0aCk7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHRhcmdldCA9IHN0YXRlLnNvdXJjZXMuZmluZCh4ID0+IGNvbmZpZ1dpbmRvd0N1cnJlbnQoeC5jb25maWcpICYmIHJvdXRlQ29udGFpbnMoeC5jb25maWcucm91dGUsIGZyb21Sb3V0ZSkpO1xuICAgICAgICBpZiAodGFyZ2V0ICYmIHJvdXRlQ29udGFpbnModGFyZ2V0LmNvbmZpZy5yb3V0ZSwgdG9Sb3V0ZSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCByb3V0ZTogZnJvbVJvdXRlIH0sIGFzeW5jIGFyY2hpdmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWFyY2hpdmVzLm1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3ZlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBzb3VyY2U6ICR7YXJjaGl2ZXMuZ2V0RGVidWdOYW1lKCl9IChtb3ZpbmcgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgYXJjaGl2ZXMubW92ZShjb25maWcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5saW5lIHJhdGhlciB0aGFuIG1vdmVBcmNoaXZlRmlsZSwgd2hpY2ggLSBnaXZlbiBvbmUgYXJjaGl2ZXMgdGhhdCBpbXBsZW1lbnRzIG1vdmUgLSB3b3VsZCBqdXN0IGNhbGwgYmFjayBpbnRvIHRoaXMgbWV0aG9kXG4gICAgICAgIGxldCBjb3BpZWQgPSBhd2FpdCBjb3B5QXJjaGl2ZUZpbGUoeyBmcm9tOiB0aGlzLCB0bzogdGhpcywgcGF0aDogY29uZmlnLmZyb21QYXRoLCB0b1BhdGg6IGNvbmZpZy50b1BhdGggfSk7XG4gICAgICAgIGlmICghY29waWVkKSB7XG4gICAgICAgICAgICAvLyBVbmRlZmluZWQgaXMgdHdvIGNhc2VzIChzZWUgY29weUFyY2hpdmVGaWxlKSAtIGFza2luZyB0aGUgc291cmNlIHdoaWNoIG9uZSBrZWVwcyB0aGUgZXJyb3IgaG9uZXN0XG4gICAgICAgICAgICBsZXQgc291cmNlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5mbyhjb25maWcuZnJvbVBhdGgpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vdmUgcmVmdXNlZCAtIGEgbmV3ZXIgZmlsZSBleGlzdHMgYXQgdGhlIGRlc3RpbmF0aW9uLiBDYW5ub3QgbW92ZSAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy5mcm9tUGF0aCl9ICgke3NvdXJjZUluZm8uc2l6ZX0gYnl0ZXMgYXQgJHtmb3JtYXREYXRlVGltZURldGFpbGVkKHNvdXJjZUluZm8ud3JpdGVUaW1lKX0pIHRvICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnRvUGF0aCl9OiB0aGUgY29weSB3YXMgcmVmdXNlZCByYXRoZXIgdGhhbiByb2xsIGl0IGJhY2sgKCR7dGhpcy5nZXREZWJ1Z05hbWUoKX0pIC0gdGhlIHNvdXJjZSBpcyBsZWZ0IHVudG91Y2hlZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3ZlIHNvdXJjZSBkb2VzIG5vdCBleGlzdC4gQ2Fubm90IG1vdmUgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfTogbm90IGZvdW5kIG9uICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29uZmlybWVkID0gYXdhaXQgdGhpcy5nZXRJbmZvKGNvbmZpZy50b1BhdGgpO1xuICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3ZlIGNvcHkgY291bGQgbm90IGJlIGNvbmZpcm1lZCAtIHRoZSBzb3VyY2UgaXMga2VwdC4gTm90IGRlbGV0aW5nICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmZyb21QYXRoKX0gYWZ0ZXIgY29weWluZyBpdCB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfTogdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90IHJlcG9ydCBpdCAoJHt0aGlzLmdldERlYnVnTmFtZSgpfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmRlbChjb25maWcuZnJvbVBhdGgpO1xuICAgIH1cblxuICAgIC8vIE9uZSB3cml0ZSB0YXJnZXQgcGVyIHJvdXRlIHJhbmdlLCBsb3dlc3QgbGF0ZW5jeSBmaXJzdC4gV2l0aGluIGEgc2hhcmQgdGhlIHRhcmdldCBpcyBBTFdBWVMgdGhlIGZpcnN0IHNvdXJjZSBpbiBjb25maWcgb3JkZXIgKHNlZSBydW5QcmltYXJ5IC0gd3JpdGVzIG11c3Qgc3RheSBvbiB0aGUgc2FtZSBub2RlKTogY29ubmVjdGl2aXR5IG9ubHkgZGVjaWRlcyB3aGljaCBTSEFSRCB3ZSBwaWNrLCBuZXZlciB3aGljaCBub2RlIHdpdGhpbiBpdCwgc28gYSBzaGFyZCB3aG9zZSBub2RlIGlzIGRpc2Nvbm5lY3RlZCBpcyBkcm9wcGVkIGVudGlyZWx5IHdoZW4gY29ubmVjdGVkT25seSBpcyBzZXQuXG4gICAgcHJpdmF0ZSBnZXRWYXJpYWJsZVNoYXJkVGFyZ2V0cyhzdGF0ZTogQ2hhaW5TdGF0ZSwgY29uZmlnOiB7IGNvbm5lY3RlZE9ubHk6IGJvb2xlYW4gfSk6IFNvdXJjZVdyYXBwZXJbXSB7XG4gICAgICAgIGxldCB0YXJnZXRzQnlSb3V0ZSA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VXcmFwcGVyPigpO1xuICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgaWYgKCFjb25maWdXaW5kb3dDdXJyZW50KHNvdXJjZS5jb25maWcpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCByb3V0ZUtleSA9IEpTT04uc3RyaW5naWZ5KHNvdXJjZS5jb25maWcucm91dGUgfHwgRlVMTF9ST1VURSk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldHNCeVJvdXRlLmhhcyhyb3V0ZUtleSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRzQnlSb3V0ZS5zZXQocm91dGVLZXksIHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRhcmdldHMgPSBbLi4udGFyZ2V0c0J5Um91dGUudmFsdWVzKCldO1xuICAgICAgICBpZiAoY29uZmlnLmNvbm5lY3RlZE9ubHkpIHtcbiAgICAgICAgICAgIHRhcmdldHMgPSB0YXJnZXRzLmZpbHRlcih4ID0+IHguaXNDb25uZWN0ZWQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc29ydCh0YXJnZXRzLCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldHM7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBrZXkgc2V0VmFyaWFibGVTaGFyZCB3b3VsZCBtYXRlcmlhbGl6ZSBmb3IgdGhpcyBWQVJJQUJMRV9TSEFSRCBrZXkgKGEgdmFsdWUgaW4gdGhlIHByZWZlcnJlZCBzaGFyZCdzIHJvdXRlIHJhbmdlKSwgd2l0aG91dCB3cml0aW5nIGFueXRoaW5nLiAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRTaGFyZEtleShrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSB8fCBwYXJzZVZhcmlhYmxlUm91dGUoa2V5KSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGdldFNoYXJkS2V5IHJlcXVpcmVzIGEga2V5IGNvbnRhaW5pbmcgYW4gdW5tYXRlcmlhbGl6ZWQgJHtKU09OLnN0cmluZ2lmeShWQVJJQUJMRV9TSEFSRCl9LCBnb3QgJHtKU09OLnN0cmluZ2lmeShrZXkpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuZ2V0VmFyaWFibGVTaGFyZFRhcmdldHMoc3RhdGUsIHsgY29ubmVjdGVkT25seTogdHJ1ZSB9KVswXVxuICAgICAgICAgICAgfHwgdGhpcy5nZXRWYXJpYWJsZVNoYXJkVGFyZ2V0cyhzdGF0ZSwgeyBjb25uZWN0ZWRPbmx5OiBmYWxzZSB9KVswXTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIGZvciAke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCBzbyB0aGVyZSBpcyBubyBzaGFyZCB0byBtYXRlcmlhbGl6ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IGludG9gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0ZXJpYWxpemVTaGFyZEtleShrZXksIHRhcmdldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRWYXJpYWJsZVNoYXJkKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFNldENvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgLy8gVGhlcmUncyBubyBwb2ludCB0YWxraW5nIHRvIGEgc2hhcmQgd2hvc2Ugbm9kZSB3YXMgZmFzdCBidXQgaXMgbm93IGRpc2Nvbm5lY3RlZCAtIG9ubHkgd2hlbiBubyBjb25uZWN0ZWQgc2hhcmQgd29ya3MgZG8gd2UgcmVjaGVjayBhdmFpbGFiaWxpdHkgYW5kIHRyeSBldmVyeSBzaGFyZFxuICAgICAgICBsZXQgY29ubmVjdGVkT25seSA9IHRydWU7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0cyA9IHRoaXMuZ2V0VmFyaWFibGVTaGFyZFRhcmdldHMoc3RhdGUsIHsgY29ubmVjdGVkT25seSB9KTtcbiAgICAgICAgICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgICAgIGxldCBmdWxsS2V5ID0gbWF0ZXJpYWxpemVTaGFyZEtleShrZXksIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNoYXJkIHBpY2tpbmcgYWxyZWFkeSByZXRyaWVzIGFjcm9zcyBzaGFyZHMsIHNvIGEgc3R1Y2sgc2hhcmQganVzdCBjb3N0cyBpdHMgdGltZW91dCBhbmQgd2UgbW92ZSBvbi4gTGFyZ2UgZGF0YSBzdHJlYW1zIHZpYSBzZXRMYXJnZUZpbGUgLSB0aGUga2V5IGlzIGFscmVhZHkgbWF0ZXJpYWxpemVkIGhlcmUsIHNvIHRoZSBuby1WQVJJQUJMRV9TSEFSRCByZXN0cmljdGlvbiBvbiBzZXRMYXJnZUZpbGUgZG9lc24ndCBhcHBseS5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBseVNtYXJ0VGltZW91dCh7IHVwbG9hZEJ5dGVzOiBkYXRhLmxlbmd0aCwgbGFiZWw6IGBWYXJpYWJsZS1zaGFyZCB1cGxvYWQgb2YgJHtKU09OLnN0cmluZ2lmeShmdWxsS2V5KX0gKCR7ZGF0YS5sZW5ndGh9IGJ5dGVzKWAgfSwgdGFyZ2V0LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiBMQVJHRV9TRVRfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXRMYXJnZUZpbGUoeyBwYXRoOiBmdWxsS2V5LCAuLi5jb25maWcsIC4uLmJ1ZmZlckNodW5rU3RyZWFtKGRhdGEpIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQud3JpdGUoYXJjaGl2ZXMgPT4gYXJjaGl2ZXMuc2V0KGZ1bGxLZXksIGRhdGEsIGNvbmZpZykpIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdWxsS2V5O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTTUFSVF9USU1FT1VUX01BUktFUikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCAke3RhcmdldC5nZXREZWJ1Z05hbWUoKX0gdGltZWQgb3V0OyBtb3ZpbmcgdG8gdGhlIG5leHQtbG93ZXN0LWxhdGVuY3kgc2hhcmQ6ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pc0Nvbm5lY3RlZCgpKSB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCAke3RhcmdldC5nZXREZWJ1Z05hbWUoKX0gaXMgZG93bjsgbW92aW5nIHRvIHRoZSBuZXh0LWxvd2VzdC1sYXRlbmN5IHNoYXJkYCk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVjaGVja2VkQXZhaWxhYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgcmVjaGVja2VkQXZhaWxhYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25uZWN0ZWRPbmx5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdGF0ZS5yZWNoZWNrQXZhaWxhYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV2ZXJ5IHZhcmlhYmxlLXNoYXJkIHdyaXRlIHRhcmdldCBmYWlsZWQgZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX06ICR7ZXJyb3JzLmpvaW4oXCIgfCBcIikgfHwgXCJubyBzb3VyY2VzIGFjY2VwdCB3cml0ZXNcIn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIGxhcmdlIGZpbGUgaXMgd3JpdHRlbiBleGFjdGx5IGxpa2UgYSBzbWFsbCBvbmUgLSBzYW1lIHdyaXRlIG5vZGUsIHNhbWUgd3Jvbmctd2luZG93L3JvdXRlIHJlLXJlc29sdXRpb24sIHNhbWUgZmFsbGJhY2tzIC0gc28gYSB2YWx1ZSdzIFNJWkUgbmV2ZXIgZGVjaWRlcyBpdHMgd3JpdGUgc2VtYW50aWNzIChzZXQgc3RyZWFtcyB0aHJvdWdoIGhlcmUgcGFzdCBMQVJHRV9TRVRfVEhSRVNIT0xELCBhbmQgYSBmaWxlIHRoYXQgZ3JldyBwYXN0IGl0IG11c3Qgbm90IHN1ZGRlbmx5IGxvc2UgdGhlIGF2YWlsYWJpbGl0eSBpdHMgY2FsbGVyIGFza2VkIGZvcikuIFRoZSBvbmUgZGlmZmVyZW5jZTogZXZlcnkgYXR0ZW1wdCBhZnRlciB0aGUgZmlyc3QgaGFzIHRvIHJld2luZCB0aGUgc3RyZWFtLCBzbyBhIGNvbmZpZyB3aXRob3V0IHJlc3RhcnRTdHJlYW0gZ2V0cyBhIHNpbmdsZSBhdHRlbXB0LiAqL1xuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiBTZXRMYXJnZUZpbGVDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5wYXRoLmluY2x1ZGVzKFZBUklBQkxFX1NIQVJEKSAmJiBwYXJzZVZhcmlhYmxlUm91dGUoY29uZmlnLnBhdGgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2V0TGFyZ2VGaWxlIGRvZXMgbm90IHN1cHBvcnQgVkFSSUFCTEVfU0hBUkQga2V5cyAodGhlcmUgaXMgbm8gd2F5IHRvIHJldHVybiB0aGUgbWF0ZXJpYWxpemVkIGtleSk7IHdyaXRlIHRoZSBmaWxlIHdpdGggc2V0LCBvciBtYXRlcmlhbGl6ZSB0aGUga2V5IHlvdXJzZWxmLiBLZXk6ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnBhdGgpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGNvbmZpZy5wYXRoKTtcbiAgICAgICAgY29uc3QgcmVzdGFydFN0cmVhbSA9IGNvbmZpZy5yZXN0YXJ0U3RyZWFtO1xuICAgICAgICBpZiAoIXJlc3RhcnRTdHJlYW0pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TGFyZ2VGaWxlT25jZShjb25maWcsIHJvdXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCh7IHdyaXRlOiB0cnVlLCBmYWxsYmFja3M6IGNvbmZpZy5mYWxsYmFja3MsIHJldHJpZXM6IGNvbmZpZy5yZXRyaWVzLCByb3V0ZSB9LCBhc3luYyBhcmNoaXZlcyA9PiB7XG4gICAgICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgYXR0ZW1wdCBjb25zdW1lZCBzb21lIChvciBhbGwpIG9mIHRoZSBzdHJlYW0sIGFuZCB0aGlzIHNvdXJjZSBuZWVkcyB0aGUgZmlsZSBmcm9tIGl0cyBmaXJzdCBieXRlXG4gICAgICAgICAgICBpZiAoYXR0ZW1wdCA+IDEpIGF3YWl0IHJlc3RhcnRTdHJlYW0oKTtcbiAgICAgICAgICAgIGF3YWl0IHdhdGNoU2xvd1Byb21pc2UoYHNldExhcmdlRmlsZXwke2NvbmZpZy5wYXRofWAsIGFyY2hpdmVzLnNldExhcmdlRmlsZShjb25maWcpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQSBzdHJlYW0gdGhhdCBjYW5ub3QgcmV3aW5kIGdldHMgZXhhY3RseSBPTkUgYXR0ZW1wdCBhdCB0aGUgd3JpdGUgbm9kZTogcmV0cnlpbmcgYW55d2hlcmUgKGFub3RoZXIgc291cmNlLCBvciB0aGlzIG9uZSBhZ2Fpbikgd291bGQgc2VuZCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGFuIGFscmVhZHktY29uc3VtZWQgc3RyZWFtIGFzIGlmIGl0IHdlcmUgdGhlIHdob2xlIGZpbGUuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRMYXJnZUZpbGVPbmNlKGNvbmZpZzogU2V0TGFyZ2VGaWxlQ29uZmlnLCByb3V0ZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBzdGF0ZS5zb3VyY2VzLmZpbmQoeCA9PiBjb25maWdXaW5kb3dDdXJyZW50KHguY29uZmlnKSAmJiByb3V0ZUNvbnRhaW5zKHguY29uZmlnLnJvdXRlLCByb3V0ZSkpO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlY2hlY2tlZEF2YWlsYWJpbGl0eSkge1xuICAgICAgICAgICAgICAgICAgICByZWNoZWNrZWRBdmFpbGFiaWxpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXRlLnJlY2hlY2tBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIGZvciBzZXRMYXJnZUZpbGUgb24gJHt0aGlzLmdldERlYnVnTmFtZSgpfSAocm91dGUgJHtyb3V0ZX0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhdGNoU2xvd1Byb21pc2UoYHNldExhcmdlRmlsZXwke2NvbmZpZy5wYXRofWAsIHRhcmdldC53cml0ZShhcmNoaXZlcyA9PiBhcmNoaXZlcy5zZXRMYXJnZUZpbGUoY29uZmlnKSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVSTChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgdXJscyA9IGF3YWl0IHRoaXMuZ2V0VVJMcyhwYXRoKTtcbiAgICAgICAgaWYgKCF1cmxzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwdWJsaWMgc291cmNlIGNvdmVyaW5nIHJvdXRlICR7Z2V0Um91dGUocGF0aCl9IHRvIGJ1aWxkIGEgVVJMIGZyb20gZm9yICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsc1swXTtcbiAgICB9XG5cbiAgICAvKiogRXZlcnkgVVJMIHRoYXQgY291bGQgc2VydmUgdGhpcyBwYXRoOiBwdWJsaWMgc291cmNlcyBtYXRjaGluZyBib3RoIHRoZSBwYXRoJ3Mgcm91dGUgYW5kIHRoZSBjdXJyZW50IHZhbGlkIHdpbmRvdy4gVGhlIGZpcnN0IGlzIHRoZSB3cml0ZSBub2RlJ3MgKGZpcnN0IG1hdGNoaW5nIHNvdXJjZSBpbiBjb25maWcgb3JkZXIsIHNlZSBydW5QcmltYXJ5IC0gdGhlIG9uZSBndWFyYW50ZWVkIGN1cnJlbnQpOyB0aGUgcmVzdCBhcmUgcmFua2VkIGZhc3Rlc3QtZmlyc3QgYnkgbWVhc3VyZWQgbGF0ZW5jeS4gRW1wdHkgd2hlbiBub25lIHF1YWxpZnkuICovXG4gICAgcHVibGljIGFzeW5jIGdldFVSTHMocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0R2V0VVJMcygpKShwYXRoKTtcbiAgICB9XG5cbiAgICAvKiogZ2V0VVJMcywgYnV0IGFmdGVyIHRoZSBvbmUgYXdhaXQgKGluaXRpYWxpemF0aW9uKSB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gaXMgc3luY2hyb25vdXM6IGV2ZXJ5dGhpbmcgdW5kZXJuZWF0aCAtIHJvdXRlIGhhc2hpbmcsIHdpbmRvdyBjaGVja3MsIGxhdGVuY2llcywgVVJMIGJ1aWxkaW5nIC0gaXMgc3luY2hyb25vdXMsIGFuZCB0aGUgY2xvc3VyZSBhbHdheXMgcmVhZHMgdGhlIG5ld2VzdCBhZG9wdGVkIGNvbmZpZywgc28gaXQgc3RheXMgY29ycmVjdCBhY3Jvc3MgY29uZmlnIHJlZnJlc2hlcy4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0R2V0VVJMcygpOiBQcm9taXNlPChwYXRoOiBzdHJpbmcpID0+IHN0cmluZ1tdPiB7XG4gICAgICAgIGxldCBpbml0aWFsU3RhdGUgPSBhd2FpdCB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm1ha2VHZXRVUkxzKGluaXRpYWxTdGF0ZSwgeyB3cml0ZU5vZGVGaXJzdDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvKiogZ2V0R2V0VVJMcywgYnV0IHNvcnRlZCBwdXJlbHkgYnkgbGF0ZW5jeSAtIHRoZSB3cml0ZSBub2RlIGdldHMgbm8gc3BlY2lhbCBmaXJzdCBwb3NpdGlvbi4gRm9yIHJlYWQtb25seSBjb25zdW1lcnMgdGhhdCBqdXN0IHdhbnQgdGhlIGZhc3Rlc3QgaG9zdC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0R2V0RmFzdFVSTHMoKTogUHJvbWlzZTwocGF0aDogc3RyaW5nKSA9PiBzdHJpbmdbXT4ge1xuICAgICAgICBsZXQgaW5pdGlhbFN0YXRlID0gYXdhaXQgdGhpcy5zdGF0ZS5nZXRTdGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5tYWtlR2V0VVJMcyhpbml0aWFsU3RhdGUsIHsgd3JpdGVOb2RlRmlyc3Q6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZUdldFVSTHMoaW5pdGlhbFN0YXRlOiBDaGFpblN0YXRlLCBjb25maWc6IHsgd3JpdGVOb2RlRmlyc3Q6IGJvb2xlYW4gfSk6IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGUubGF0ZXN0KCkgfHwgaW5pdGlhbFN0YXRlO1xuICAgICAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUocGF0aCk7XG4gICAgICAgICAgICBsZXQgc291cmNlczogU291cmNlV3JhcHBlcltdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc3RhdGUuc291cmNlcykge1xuICAgICAgICAgICAgICAgIGlmICghKHNvdXJjZS5jb25maWcucHVibGljID8/IHRydWUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnMoc291cmNlLmNvbmZpZy5yb3V0ZSwgcm91dGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ1dpbmRvd0N1cnJlbnQoc291cmNlLmNvbmZpZykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG9yZGVyZWQ6IFNvdXJjZVdyYXBwZXJbXTtcbiAgICAgICAgICAgIGlmIChjb25maWcud3JpdGVOb2RlRmlyc3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdCA9IHNvdXJjZXMuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgc29ydChyZXN0LCB4ID0+IHguZ2V0TGF0ZW5jeSgpKTtcbiAgICAgICAgICAgICAgICBvcmRlcmVkID0gWy4uLnNvdXJjZXMuc2xpY2UoMCwgMSksIC4uLnJlc3RdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcmRlcmVkID0gWy4uLnNvdXJjZXNdO1xuICAgICAgICAgICAgICAgIHNvcnQob3JkZXJlZCwgeCA9PiB4LmdldExhdGVuY3koKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdXJscyA9IG9yZGVyZWQubWFwKHggPT4gYnVpbGRGaWxlVXJsKGdldEJ1Y2tldEJhc2VVcmwoeC5jb25maWcudXJsKSwgcGF0aCkpO1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5uZXcgU2V0KHVybHMpXTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5kaXNwb3NlKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXJjaGl2ZXMoY29uZmlnOiBSZW1vdGVDb25maWcgfCBSZW1vdGVDb25maWdCYXNlLCBvcHRpb25zPzogQXJjaGl2ZXNDaGFpbk9wdGlvbnMpOiBBcmNoaXZlc0NoYWluIHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVzQ2hhaW4oY29uZmlnLCBvcHRpb25zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2FsbFNlcnZlcjxUPih1cmw6IHN0cmluZywgcnVuOiAoY29udHJvbGxlcjogdHlwZW9mIFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLm5vZGVzW3N0cmluZ10pID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBTb2NrZXRGdW5jdGlvbi5FTkFCTEVfQ0xJRU5UX01PREUgPSB0cnVlO1xuICAgIGxldCBwYXJzZWQgPSBwYXJzZVN0b3JhZ2VVcmwodXJsKTtcbiAgICBsZXQgbm9kZUlkID0gU29ja2V0RnVuY3Rpb24uY29ubmVjdCh7IGFkZHJlc3M6IHBhcnNlZC5hZGRyZXNzLCBwb3J0OiBwYXJzZWQucG9ydCB9KTtcbiAgICBsZXQgY29udHJvbGxlciA9IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLm5vZGVzW25vZGVJZF07XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bihjb250cm9sbGVyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICghU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5pbmNsdWRlcyhTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEKSkgdGhyb3cgZTtcbiAgICAgICAgYXdhaXQgYXV0aGVudGljYXRlU3RvcmFnZSh7IGFkZHJlc3M6IHBhcnNlZC5hZGRyZXNzLCBwb3J0OiBwYXJzZWQucG9ydCwgbm9kZUlkIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVuKGNvbnRyb2xsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2ZXJCdWNrZXRzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5saXN0QnVja2V0cyh7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50IH0pKTtcbn1cblxuLyoqIFRoZSBsaXZlLCBpbi1tZW1vcnkgc3RhdGUgb2Ygb25lIGJ1Y2tldCBvbiBhIHNlcnZlciAocm91dGluZyBjb25maWcgaW5jbHVkZWQpLCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGlzIHVuYXZhaWxhYmxlLiBDaGVhcCAtIGl0IG5ldmVyIHRvdWNoZXMgdGhlIHNlcnZlcidzIGRpc2sgLSBidXQgb25seSB3b3JrcyB3aGlsZSB0aGF0IGJ1Y2tldCBpcyBsb2FkZWQgdGhlcmUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VydmVyQWN0aXZlQnVja2V0KGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfSk6IFByb21pc2U8QWN0aXZlQnVja2V0SW5mbyB8IHN0cmluZz4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5nZXRBY3RpdmVCdWNrZXQoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgYnVja2V0TmFtZTogY29uZmlnLmJ1Y2tldE5hbWUgfSkpO1xufVxuXG4vKiogVGhlIGJ1Y2tldHMgYSBzZXJ2ZXIgY3VycmVudGx5IGhhcyBsb2FkZWQuIEFkbWluIG9ubHksIHNvIGluIHByYWN0aWNlIHRoaXMgaXMgb3VyIG93biBtYWNoaW5lJ3Mgb3RoZXIgcHJvY2VzcyAtIGEgZGVwbG95IHN1Y2Nlc3NvciBhc2tpbmcgaXRzIHByZWRlY2Vzc29yIHdoYXQgaXMgYWN0dWFsbHkgaW4gdXNlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2ZXJBY3RpdmVCdWNrZXRLZXlzKGNvbmZpZzogeyB1cmw6IHN0cmluZyB9KTogUHJvbWlzZTx7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH1bXT4ge1xuICAgIHJldHVybiBhd2FpdCBjYWxsU2VydmVyKGNvbmZpZy51cmwsIGNvbnRyb2xsZXIgPT4gY29udHJvbGxlci5hZG1pbkxpc3RBY3RpdmVCdWNrZXRzKCkpO1xufVxuXG4vKiogVGVsbHMgYSBzZXJ2ZXIgdG8gbG9hZCBvbmUgb2YgaXRzIGJ1Y2tldHMgaW50byBtZW1vcnkgKHN0YXJ0aW5nIGl0cyBzeW5jaHJvbml6YXRpb24pIGFuZCByZXR1cm5zIGl0cyBsaXZlIHN0YXRlLCBvciBhIHN0cmluZyBzYXlpbmcgd2h5IGl0IGNvdWxkIG5vdCBiZSBsb2FkZWQuIE9ubHkgdG91Y2hlcyB0aGF0IHNlcnZlciAtIG5vdGhpbmcgaXMgd3JpdHRlbiBhbmQgbm8gb3RoZXIgc291cmNlIGlzIGNvbnRhY3RlZC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3RpdmF0ZVNlcnZlckJ1Y2tldChjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIuYWN0aXZhdGVCdWNrZXQoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgYnVja2V0TmFtZTogY29uZmlnLmJ1Y2tldE5hbWUgfSkpO1xufVxuXG4vKiogWmVyb2VzIHRoZSB3cml0ZSBzdGF0aXN0aWNzIGxpc3RTZXJ2ZXJCdWNrZXRzIHJlcG9ydHMsIGZvciBldmVyeSBidWNrZXQgaW4gdGhlIGFjY291bnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYXJTZXJ2ZXJXcml0ZVN0YXRzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPHsgY2xlYXJlZEJ1Y2tldHM6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgY29udHJvbGxlciA9PiBjb250cm9sbGVyLmNsZWFyV3JpdGVTdGF0cyh7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50IH0pKTtcbn1cblxuLyoqIFRoZSBvcGVyYXRpb24tbG9nIGZpbGVzIE9ORSBzdG9yYWdlIHNlcnZlciBob2xkcyAoZXZlcnkgc2VydmVyIGxvZ3Mgb25seSBpdHMgb3duIG9wZXJhdGlvbnMgLSBzZWUgbGlzdEFsbFNlcnZlckxvZ0ZpbGVzIGZvciB0aGUgd2hvbGUgZmxlZXQpLiBUaGUgbmFtZXMgY2FycnkgcGlkL3RocmVhZC90aW1lLXJhbmdlL2VudHJ5LWNvdW50IG1ldGFkYXRhOyBzZWUgTG9nRmlsZUluZm8uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFNlcnZlckxvZ0ZpbGVzKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nIH0pOiBQcm9taXNlPExvZ0ZpbGVJbmZvW10+IHtcbiAgICByZXR1cm4gYXdhaXQgY2FsbFNlcnZlcihjb25maWcudXJsLCBjb250cm9sbGVyID0+IGNvbnRyb2xsZXIubGlzdExvZ0ZpbGVzKHsgYWNjb3VudDogY29uZmlnLmFjY291bnQgfSkpO1xufVxuXG4vKiogRXZlcnkgc2VydmVyJ3MgbG9nIGZpbGVzIGF0IG9uY2UsIG9uZSBlbnRyeSBwZXIgdXJsIC0gYSBzZXJ2ZXIgdGhhdCBjYW5ub3QgYW5zd2VyIHJlcG9ydHMgaXRzIGVycm9yIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgcmVzdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0QWxsU2VydmVyTG9nRmlsZXMoY29uZmlnOiB7IHVybHM6IHN0cmluZ1tdOyBhY2NvdW50OiBzdHJpbmcgfSk6IFByb21pc2U8eyB1cmw6IHN0cmluZzsgZmlsZXM/OiBMb2dGaWxlSW5mb1tdOyBlcnJvcj86IHN0cmluZyB9W10+IHtcbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoY29uZmlnLnVybHMubWFwKGFzeW5jIHVybCA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyB1cmwsIGZpbGVzOiBhd2FpdCBsaXN0U2VydmVyTG9nRmlsZXMoeyB1cmwsIGFjY291bnQ6IGNvbmZpZy5hY2NvdW50IH0pIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVybCwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkgfTtcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuLyoqIERvd25sb2FkcyB0aGUgbmFtZWQgbG9nIGZpbGVzIG9mZiBvbmUgc2VydmVyIGFuZCBkZWNvZGVzIHRoZW0gaW50byB0aGUgbG9nZ2VkIG9iamVjdHMgKHRoZSB3aXJlIGFsd2F5cyBjYXJyaWVzIHRoZW0gTFo0LWNvbXByZXNzZWQgLSBsaXZlIGZpbGVzIGFyZSBjb21wcmVzc2VkIGluIG1lbW9yeSBzZXJ2ZXItc2lkZSkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VydmVyTG9ncyhjb25maWc6IHsgdXJsOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZzsgbmFtZXM6IHN0cmluZ1tdIH0pOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBlbnRyaWVzOiB1bmtub3duW10gfVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgYXN5bmMgY29udHJvbGxlciA9PiB7XG4gICAgICAgIGxldCByZXN1bHRzOiB7IG5hbWU6IHN0cmluZzsgZW50cmllczogdW5rbm93bltdIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBuYW1lIG9mIGNvbmZpZy5uYW1lcykge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb250cm9sbGVyLmdldExvZ0ZpbGUoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgbmFtZSB9KTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IG5hbWUsIGVudHJpZXM6IGRlY29kZUxvZ0ZpbGUoQnVmZmVyLmZyb20oZGF0YSkpIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH0pO1xufVxuXG4vKiogZ2V0U2VydmVyTG9ncywgYnV0IFNFQVJDSEVEIGluc3RlYWQgb2YgZnVsbHkgZGVjb2RlZDogdGhlIHJhdyBKU09OIHRleHQgaXMgc3Vic3RyaW5nLW1hdGNoZWQgKGV2ZXJ5IHNlYXJjaCBzdHJpbmcgbXVzdCBhcHBlYXIgaW4gYSBzdGF0ZW1lbnQgLSBzZWUgY3JlYXRlTG9nU2VhcmNoZXIpLCBhbmQgb25seSB0aGUgbWF0Y2hpbmcgc3RhdGVtZW50cyBhcmUgZGVjb2RlZCBpbnRvIG9iamVjdHMuIEZhciBjaGVhcGVyIHRoYW4gZGVjb2Rpbmcgd2hvbGUgZmlsZXMgdG8gbG9vayBmb3Igb25lIHBhdGggb3IgY2FsbGVyLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlYXJjaFNlcnZlckxvZ3MoY29uZmlnOiB7IHVybDogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmc7IG5hbWVzOiBzdHJpbmdbXTsgc2VhcmNoZXM6IHN0cmluZ1tdIH0pOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBlbnRyaWVzOiB1bmtub3duW10gfVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxTZXJ2ZXIoY29uZmlnLnVybCwgYXN5bmMgY29udHJvbGxlciA9PiB7XG4gICAgICAgIGxldCByZXN1bHRzOiB7IG5hbWU6IHN0cmluZzsgZW50cmllczogdW5rbm93bltdIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBuYW1lIG9mIGNvbmZpZy5uYW1lcykge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb250cm9sbGVyLmdldExvZ0ZpbGUoeyBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgbmFtZSB9KTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IG5hbWUsIGVudHJpZXM6IGNyZWF0ZUxvZ1NlYXJjaGVyKEJ1ZmZlci5mcm9tKGRhdGEpKShjb25maWcuc2VhcmNoZXMpIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVja2V0SW5mbyhjb25maWc6IHsgdXJsOiBzdHJpbmcgfSk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAvLyBnZXRDb25maWcgaXMgYnVja2V0LWxldmVsIChubyBzdG9yZSBzZWxlY3Rpb24pLCBzbyB0aGUgZmFicmljYXRlZCBzb3VyY2VDb25maWcgbmV2ZXIgaGFzIHRvIG1hdGNoIGFueXRoaW5nXG4gICAgbGV0IHJlbW90ZSA9IG5ldyBBcmNoaXZlc1JlbW90ZSh7IHVybDogY29uZmlnLnVybCwgd2FpdEZvckFjY2VzczogZmFsc2UsIHNvdXJjZUNvbmZpZzogbm9ybWFsaXplU291cmNlKGNvbmZpZy51cmwpIH0pO1xuICAgIHJldHVybiBhd2FpdCByZW1vdGUuZ2V0Q29uZmlnKCk7XG59XG4iXX0=
910
+ /* _JS_SOURCE_HASH = "e75539ae38ccd6674f337706128844738c671548b84f17658c3b0f50471a5b50"; */