@howlil/ez-agents 5.0.1 → 5.0.2

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.
@@ -11,7 +11,7 @@ import { fileURLToPath } from "url";
11
11
  // package.json
12
12
  var package_default = {
13
13
  name: "@howlil/ez-agents",
14
- version: "5.0.1",
14
+ version: "5.0.2",
15
15
  description: "EZ Agents \u2014 Meta-prompting with multi-model support (Qwen, Kimi, OpenAI)",
16
16
  type: "module",
17
17
  sideEffects: false,
@@ -2703,4 +2703,4 @@ if (hasGlobal && hasLocal) {
2703
2703
  export {
2704
2704
  testExports
2705
2705
  };
2706
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vYmluL2luc3RhbGwudHMiLCAiLi4vLi4vcGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tICdyZWFkbGluZSc7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuXG4vLyBDb2xvcnNcbmNvbnN0IGN5YW4gPSAnXFx4MWJbMzZtJztcbmNvbnN0IGdyZWVuID0gJ1xceDFiWzMybSc7XG5jb25zdCB5ZWxsb3cgPSAnXFx4MWJbMzNtJztcbmNvbnN0IGRpbSA9ICdcXHgxYlsybSc7XG5jb25zdCByZXNldCA9ICdcXHgxYlswbSc7XG5cbi8vIENvZGV4IGNvbmZpZy50b21sIGNvbnN0YW50c1xuY29uc3QgRVpfQ09ERVhfTUFSS0VSID0gJyMgRVpfQWdlbnRzIEFnZW50IENvbmZpZ3VyYXRpb24gXFx1MjAxNCBtYW5hZ2VkIGJ5IGV6LWFnZW50cyBpbnN0YWxsZXInO1xuXG4vLyBDb3BpbG90IGluc3RydWN0aW9ucyBtYXJrZXIgY29uc3RhbnRzXG5jb25zdCBFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19NQVJLRVIgPSAnPCEtLSBFWl9BR0VOVFMgQ29uZmlndXJhdGlvbiBcXHUyMDE0IG1hbmFnZWQgYnkgZXotYWdlbnRzIGluc3RhbGxlciAtLT4nO1xuY29uc3QgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfQ0xPU0VfTUFSS0VSID0gJzwhLS0gL0VaX0FHRU5UUyBDb25maWd1cmF0aW9uIC0tPic7XG4vLyBMZWdhY3kgbWFya2VycyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgaW5zdGFsbHMuXG5jb25zdCBMRUdBQ1lfRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfTUFSS0VSID0gJzwhLS0gRVpfQWdlbnRzIENvbmZpZ3VyYXRpb24gXFx1MjAxNCBtYW5hZ2VkIGJ5IGV6LWFnZW50cyBpbnN0YWxsZXIgLS0+JztcbmNvbnN0IExFR0FDWV9FWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19DTE9TRV9NQVJLRVIgPSAnPCEtLSAvRVpfQWdlbnRzIENvbmZpZ3VyYXRpb24gLS0+JztcblxuY29uc3QgQ09ERVhfQUdFTlRfU0FOREJPWCA9IHtcbiAgJ2V6LWV4ZWN1dG9yJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1wbGFubmVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1waGFzZS1yZXNlYXJjaGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1wcm9qZWN0LXJlc2VhcmNoZXInOiAnd29ya3NwYWNlLXdyaXRlJyxcbiAgJ2V6LXJlc2VhcmNoLXN5bnRoZXNpemVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei12ZXJpZmllcic6ICd3b3Jrc3BhY2Utd3JpdGUnLFxuICAnZXotY29kZWJhc2UtbWFwcGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1yb2FkbWFwcGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1kZWJ1Z2dlcic6ICd3b3Jrc3BhY2Utd3JpdGUnLFxuICAnZXotcGxhbi1jaGVja2VyJzogJ3JlYWQtb25seScsXG4gICdlei1pbnRlZ3JhdGlvbi1jaGVja2VyJzogJ3JlYWQtb25seScsXG59O1xuXG4vLyBDb3BpbG90IHRvb2wgbmFtZSBtYXBwaW5nIFx1MjAxNCBDbGF1ZGUgQ29kZSB0b29scyB0byBHaXRIdWIgQ29waWxvdCB0b29sc1xuLy8gVG9vbCBtYXBwaW5nIGFwcGxpZXMgT05MWSB0byBhZ2VudHMsIE5PVCB0byBza2lsbHMgKHBlciBDT05URVhULm1kIGRlY2lzaW9uKVxuY29uc3QgY2xhdWRlVG9Db3BpbG90VG9vbHMgPSB7XG4gIFJlYWQ6ICdyZWFkJyxcbiAgV3JpdGU6ICdlZGl0JyxcbiAgRWRpdDogJ2VkaXQnLFxuICBCYXNoOiAnZXhlY3V0ZScsXG4gIEdyZXA6ICdzZWFyY2gnLFxuICBHbG9iOiAnc2VhcmNoJyxcbiAgVGFzazogJ2FnZW50JyxcbiAgV2ViU2VhcmNoOiAnd2ViJyxcbiAgV2ViRmV0Y2g6ICd3ZWInLFxuICBUb2RvV3JpdGU6ICd0b2RvJyxcbiAgQXNrVXNlclF1ZXN0aW9uOiAnYXNrX3VzZXInLFxuICBTbGFzaENvbW1hbmQ6ICdza2lsbCcsXG59O1xuXG4vLyBHZXQgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvblxuaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfTtcblxuLy8gUGFyc2UgYXJnc1xuY29uc3QgYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbmNvbnN0IGhhc0dsb2JhbCA9IGFyZ3MuaW5jbHVkZXMoJy0tZ2xvYmFsJykgfHwgYXJncy5pbmNsdWRlcygnLWcnKTtcbmNvbnN0IGhhc0xvY2FsID0gYXJncy5pbmNsdWRlcygnLS1sb2NhbCcpIHx8IGFyZ3MuaW5jbHVkZXMoJy1sJyk7XG5jb25zdCBoYXNPcGVuY29kZSA9IGFyZ3MuaW5jbHVkZXMoJy0tb3BlbmNvZGUnKTtcbmNvbnN0IGhhc0NsYXVkZSA9IGFyZ3MuaW5jbHVkZXMoJy0tY2xhdWRlJyk7XG5jb25zdCBoYXNHZW1pbmkgPSBhcmdzLmluY2x1ZGVzKCctLWdlbWluaScpO1xuY29uc3QgaGFzQ29kZXggPSBhcmdzLmluY2x1ZGVzKCctLWNvZGV4Jyk7XG5jb25zdCBoYXNDb3BpbG90ID0gYXJncy5pbmNsdWRlcygnLS1jb3BpbG90Jyk7XG5jb25zdCBoYXNRd2VuID0gYXJncy5pbmNsdWRlcygnLS1xd2VuJyk7XG5jb25zdCBoYXNLaW1pID0gYXJncy5pbmNsdWRlcygnLS1raW1pJyk7XG5jb25zdCBoYXNCb3RoID0gYXJncy5pbmNsdWRlcygnLS1ib3RoJyk7IC8vIExlZ2FjeSBmbGFnLCBrZWVwcyB3b3JraW5nXG5jb25zdCBoYXNBbGwgPSBhcmdzLmluY2x1ZGVzKCctLWFsbCcpO1xuY29uc3QgaGFzVW5pbnN0YWxsID0gYXJncy5pbmNsdWRlcygnLS11bmluc3RhbGwnKSB8fCBhcmdzLmluY2x1ZGVzKCctdScpO1xuXG4vLyBSdW50aW1lIHNlbGVjdGlvbiAtIGNhbiBiZSBzZXQgYnkgZmxhZ3Mgb3IgaW50ZXJhY3RpdmUgcHJvbXB0XG5sZXQgc2VsZWN0ZWRSdW50aW1lczogc3RyaW5nW10gPSBbXTtcbmlmIChoYXNBbGwpIHtcbiAgc2VsZWN0ZWRSdW50aW1lcyA9IFsnY2xhdWRlJywgJ29wZW5jb2RlJywgJ2dlbWluaScsICdjb2RleCcsICdjb3BpbG90JywgJ3F3ZW4nLCAna2ltaSddO1xufSBlbHNlIGlmIChoYXNCb3RoKSB7XG4gIHNlbGVjdGVkUnVudGltZXMgPSBbJ2NsYXVkZScsICdvcGVuY29kZSddO1xufSBlbHNlIHtcbiAgaWYgKGhhc09wZW5jb2RlKSBzZWxlY3RlZFJ1bnRpbWVzLnB1c2goJ29wZW5jb2RlJyk7XG4gIGlmIChoYXNDbGF1ZGUpIHNlbGVjdGVkUnVudGltZXMucHVzaCgnY2xhdWRlJyk7XG4gIGlmIChoYXNHZW1pbmkpIHNlbGVjdGVkUnVudGltZXMucHVzaCgnZ2VtaW5pJyk7XG4gIGlmIChoYXNDb2RleCkgc2VsZWN0ZWRSdW50aW1lcy5wdXNoKCdjb2RleCcpO1xuICBpZiAoaGFzQ29waWxvdCkgc2VsZWN0ZWRSdW50aW1lcy5wdXNoKCdjb3BpbG90Jyk7XG4gIGlmIChoYXNRd2VuKSBzZWxlY3RlZFJ1bnRpbWVzLnB1c2goJ3F3ZW4nKTtcbiAgaWYgKGhhc0tpbWkpIHNlbGVjdGVkUnVudGltZXMucHVzaCgna2ltaScpO1xufVxuXG4vLyBXU0wgKyBXaW5kb3dzIE5vZGUuanMgZGV0ZWN0aW9uXG4vLyBXaGVuIFdpbmRvd3MtbmF0aXZlIE5vZGUgcnVucyBvbiBXU0wsIG9zLmhvbWVkaXIoKSBhbmQgcGF0aC5qb2luKCkgcHJvZHVjZVxuLy8gYmFja3NsYXNoIHBhdGhzIHRoYXQgZG9uJ3QgcmVzb2x2ZSBjb3JyZWN0bHkgb24gdGhlIExpbnV4IGZpbGVzeXN0ZW0uXG5pZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICBsZXQgaXNXU0wgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuV1NMX0RJU1RST19OQU1FKSB7XG4gICAgICBpc1dTTCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChmcy5leGlzdHNTeW5jKCcvcHJvYy92ZXJzaW9uJykpIHtcbiAgICAgIGNvbnN0IHByb2NWZXJzaW9uID0gZnMucmVhZEZpbGVTeW5jKCcvcHJvYy92ZXJzaW9uJywgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHByb2NWZXJzaW9uLmluY2x1ZGVzKCdtaWNyb3NvZnQnKSB8fCBwcm9jVmVyc2lvbi5pbmNsdWRlcygnd3NsJykpIHtcbiAgICAgICAgaXNXU0wgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gSWdub3JlIHJlYWQgZXJyb3JzIFx1MjAxNCBub3QgV1NMXG4gIH1cblxuICBpZiAoaXNXU0wpIHtcbiAgICBjb25zb2xlLmVycm9yKGBcbiR7eWVsbG93fVx1MjZBMCBEZXRlY3RlZCBXU0wgd2l0aCBXaW5kb3dzLW5hdGl2ZSBOb2RlLmpzLiR7cmVzZXR9XG5cblRoaXMgY2F1c2VzIHBhdGggcmVzb2x1dGlvbiBpc3N1ZXMgdGhhdCBwcmV2ZW50IGNvcnJlY3QgaW5zdGFsbGF0aW9uLlxuUGxlYXNlIGluc3RhbGwgYSBMaW51eC1uYXRpdmUgTm9kZS5qcyBpbnNpZGUgV1NMOlxuXG4gIGN1cmwgLWZzU0wgaHR0cHM6Ly9mbm0udmVyY2VsLmFwcC9pbnN0YWxsIHwgYmFzaFxuICBmbm0gaW5zdGFsbCAtLWx0c1xuXG5UaGVuIHJlLXJ1bjogbnB4IGV6LWFnZW50c1xuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIHBhdGhQcmVmaXggKHdoaWNoIHVzZXMgYWJzb2x1dGUgcGF0aHMgZm9yIGdsb2JhbCBpbnN0YWxscykgdG8gYVxuICogJEhPTUUtcmVsYXRpdmUgZm9ybSBmb3IgcmVwbGFjaW5nICRIT01FLy5jbGF1ZGUvIHJlZmVyZW5jZXMgaW4gYmFzaCBjb2RlIGJsb2Nrcy5cbiAqIFByZXNlcnZlcyAkSE9NRSBhcyBhIHNoZWxsIHZhcmlhYmxlIHNvIHBhdGhzIHJlbWFpbiBwb3J0YWJsZSBhY3Jvc3MgbWFjaGluZXMuXG4gKi9cbmZ1bmN0aW9uIHRvSG9tZVByZWZpeChwYXRoUHJlZml4OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBob21lID0gb3MuaG9tZWRpcigpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGhQcmVmaXgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKGhvbWUpKSB7XG4gICAgcmV0dXJuICckSE9NRScgKyBub3JtYWxpemVkLnNsaWNlKGhvbWUubGVuZ3RoKTtcbiAgfVxuICAvLyBDb252ZXJ0IHRpbGRlLWJhc2VkIHBhdGhzIHRvICRIT01FLWJhc2VkIHBhdGhzIGZvciBiYXNoIGNvZGUgYmxvY2tzXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoJ34vJykpIHtcbiAgICByZXR1cm4gJyRIT01FJyArIG5vcm1hbGl6ZWQuc2xpY2UoMSk7XG4gIH1cbiAgLy8gRm9yIHJlbGF0aXZlIHBhdGhzIG9yIHBhdGhzIG5vdCB1bmRlciAkSE9NRSwgcmV0dXJuIGFzLWlzXG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vLyBIZWxwZXIgdG8gZ2V0IGRpcmVjdG9yeSBuYW1lIGZvciBhIHJ1bnRpbWUgKHVzZWQgZm9yIGxvY2FsL3Byb2plY3QgaW5zdGFsbHMpXG5mdW5jdGlvbiBnZXREaXJOYW1lKHJ1bnRpbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHJldHVybiAnLmdpdGh1Yic7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSByZXR1cm4gJy5vcGVuY29kZSc7XG4gIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykgcmV0dXJuICcuZ2VtaW5pJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb2RleCcpIHJldHVybiAnLmNvZGV4JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcmV0dXJuICcucXdlbic7XG4gIGlmIChydW50aW1lID09PSAna2ltaScpIHJldHVybiAnLmtpbWknO1xuICByZXR1cm4gJy5jbGF1ZGUnO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY29uZmlnIGRpcmVjdG9yeSBwYXRoIHJlbGF0aXZlIHRvIGhvbWUgZGlyZWN0b3J5IGZvciBhIHJ1bnRpbWVcbiAqIFVzZWQgZm9yIHRlbXBsYXRpbmcgaG9va3MgdGhhdCB1c2UgcGF0aC5qb2luKGhvbWVEaXIsICc8Y29uZmlnRGlyPicsIC4uLilcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCAnY29waWxvdCcsIG9yICdxd2VuJ1xuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXG4gKi9cbmZ1bmN0aW9uIGdldENvbmZpZ0RpckZyb21Ib21lKHJ1bnRpbWU6IHN0cmluZywgaXNHbG9iYWw6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoIWlzR2xvYmFsKSB7XG4gICAgLy8gTG9jYWwgaW5zdGFsbHMgdXNlIHRoZSBzYW1lIGRpciBuYW1lIHBhdHRlcm5cbiAgICByZXR1cm4gYCcke2dldERpck5hbWUocnVudGltZSl9J2A7XG4gIH1cbiAgLy8gR2xvYmFsIGluc3RhbGxzIC0gT3BlbkNvZGUgdXNlcyBYREcgcGF0aCBzdHJ1Y3R1cmVcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb3BpbG90JykgcmV0dXJuIFwiJy5jb3BpbG90J1wiO1xuICBpZiAocnVudGltZSA9PT0gJ29wZW5jb2RlJykge1xuICAgIC8vIE9wZW5Db2RlOiB+Ly5jb25maWcvb3BlbmNvZGUgLT4gJy5jb25maWcnLCAnb3BlbmNvZGUnXG4gICAgLy8gUmV0dXJuIGFzIGNvbW1hLXNlcGFyYXRlZCBmb3IgcGF0aC5qb2luKCkgcmVwbGFjZW1lbnRcbiAgICByZXR1cm4gXCInLmNvbmZpZycsICdvcGVuY29kZSdcIjtcbiAgfVxuICBpZiAocnVudGltZSA9PT0gJ2dlbWluaScpIHJldHVybiBcIicuZ2VtaW5pJ1wiO1xuICBpZiAocnVudGltZSA9PT0gJ2NvZGV4JykgcmV0dXJuIFwiJy5jb2RleCdcIjtcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcmV0dXJuIFwiJy5xd2VuJ1wiO1xuICBpZiAocnVudGltZSA9PT0gJ2tpbWknKSByZXR1cm4gXCInLmtpbWknXCI7XG4gIHJldHVybiBcIicuY2xhdWRlJ1wiO1xufVxuXG4vKipcbiAqIEdldCB0aGUgZ2xvYmFsIGNvbmZpZyBkaXJlY3RvcnkgZm9yIE9wZW5Db2RlXG4gKiBPcGVuQ29kZSBmb2xsb3dzIFhERyBCYXNlIERpcmVjdG9yeSBzcGVjIGFuZCB1c2VzIH4vLmNvbmZpZy9vcGVuY29kZS9cbiAqIFByaW9yaXR5OiBPUEVOQ09ERV9DT05GSUdfRElSID4gZGlybmFtZShPUEVOQ09ERV9DT05GSUcpID4gWERHX0NPTkZJR19IT01FL29wZW5jb2RlID4gfi8uY29uZmlnL29wZW5jb2RlXG4gKi9cbmZ1bmN0aW9uIGdldE9wZW5jb2RlR2xvYmFsRGlyKCkge1xuICAvLyAxLiBFeHBsaWNpdCBPUEVOQ09ERV9DT05GSUdfRElSIGVudiB2YXJcbiAgaWYgKHByb2Nlc3MuZW52Lk9QRU5DT0RFX0NPTkZJR19ESVIpIHtcbiAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuT1BFTkNPREVfQ09ORklHX0RJUik7XG4gIH1cbiAgXG4gIC8vIDIuIE9QRU5DT0RFX0NPTkZJRyBlbnYgdmFyICh1c2UgaXRzIGRpcmVjdG9yeSlcbiAgaWYgKHByb2Nlc3MuZW52Lk9QRU5DT0RFX0NPTkZJRykge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUoZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuT1BFTkNPREVfQ09ORklHKSk7XG4gIH1cbiAgXG4gIC8vIDMuIFhER19DT05GSUdfSE9NRS9vcGVuY29kZVxuICBpZiAocHJvY2Vzcy5lbnYuWERHX0NPTkZJR19IT01FKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihleHBhbmRUaWxkZShwcm9jZXNzLmVudi5YREdfQ09ORklHX0hPTUUpLCAnb3BlbmNvZGUnKTtcbiAgfVxuICBcbiAgLy8gNC4gRGVmYXVsdDogfi8uY29uZmlnL29wZW5jb2RlIChYREcgZGVmYXVsdClcbiAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29uZmlnJywgJ29wZW5jb2RlJyk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBnbG9iYWwgY29uZmlnIGRpcmVjdG9yeSBmb3IgYSBydW50aW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcnVudGltZSAtICdjbGF1ZGUnLCAnb3BlbmNvZGUnLCAnZ2VtaW5pJywgJ2NvZGV4Jywgb3IgJ2NvcGlsb3QnXG4gKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBleHBsaWNpdERpciAtIEV4cGxpY2l0IGRpcmVjdG9yeSBmcm9tIC0tY29uZmlnLWRpciBmbGFnXG4gKi9cbmZ1bmN0aW9uIGdldEdsb2JhbERpcihydW50aW1lOiBzdHJpbmcsIGV4cGxpY2l0RGlyOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHN0cmluZyB7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSB7XG4gICAgLy8gRm9yIE9wZW5Db2RlLCAtLWNvbmZpZy1kaXIgb3ZlcnJpZGVzIGVudiB2YXJzXG4gICAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUoZXhwbGljaXREaXIpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0T3BlbmNvZGVHbG9iYWxEaXIoKTtcbiAgfVxuICBcbiAgaWYgKHJ1bnRpbWUgPT09ICdnZW1pbmknKSB7XG4gICAgLy8gR2VtaW5pOiAtLWNvbmZpZy1kaXIgPiBHRU1JTklfQ09ORklHX0RJUiA+IH4vLmdlbWluaVxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkdFTUlOSV9DT05GSUdfRElSKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuR0VNSU5JX0NPTkZJR19ESVIpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5nZW1pbmknKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSB7XG4gICAgLy8gQ29kZXg6IC0tY29uZmlnLWRpciA+IENPREVYX0hPTUUgPiB+Ly5jb2RleFxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkNPREVYX0hPTUUpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShwcm9jZXNzLmVudi5DT0RFWF9IT01FKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29kZXgnKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHtcbiAgICAvLyBDb3BpbG90OiAtLWNvbmZpZy1kaXIgPiBDT1BJTE9UX0NPTkZJR19ESVIgPiB+Ly5jb3BpbG90XG4gICAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUoZXhwbGljaXREaXIpO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuQ09QSUxPVF9DT05GSUdfRElSKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuQ09QSUxPVF9DT05GSUdfRElSKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29waWxvdCcpO1xuICB9XG5cbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykge1xuICAgIC8vIFF3ZW4gQ29kZTogLS1jb25maWctZGlyID4gUVdFTl9DT05GSUdfRElSID4gfi8ucXdlblxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LlFXRU5fQ09ORklHX0RJUikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKHByb2Nlc3MuZW52LlFXRU5fQ09ORklHX0RJUik7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLnF3ZW4nKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAna2ltaScpIHtcbiAgICAvLyBLaW1pIENvZGU6IC0tY29uZmlnLWRpciA+IEtJTUlfQ09ORklHX0RJUiA+IH4vLmtpbWlcbiAgICBpZiAoZXhwbGljaXREaXIpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShleHBsaWNpdERpcik7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5LSU1JX0NPTkZJR19ESVIpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShwcm9jZXNzLmVudi5LSU1JX0NPTkZJR19ESVIpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5raW1pJyk7XG4gIH1cblxuICAvLyBDbGF1ZGUgQ29kZTogLS1jb25maWctZGlyID4gQ0xBVURFX0NPTkZJR19ESVIgPiB+Ly5jbGF1ZGVcbiAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuQ0xBVURFX0NPTkZJR19ESVIpIHtcbiAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuQ0xBVURFX0NPTkZJR19ESVIpO1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNsYXVkZScpO1xufVxuXG5jb25zdCBiYW5uZXIgPSAnXFxuJyArXG4gIGN5YW4gKyAnICBcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1NTdcdTI1ODhcdTI1ODhcdTI1NTcgIFx1MjU4OFx1MjU4OFx1MjU1N1xcbicgK1xuICAnICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NURcdTI1NUFcdTI1ODhcdTI1ODhcdTI1NTdcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NURcXG4nICtcbiAgJyAgXHUyNTg4XHUyNTg4XHUyNTg4XHUyNTg4XHUyNTg4XHUyNTU3ICAgXHUyNTVBXHUyNTg4XHUyNTg4XHUyNTg4XHUyNTU0XHUyNTVEIFxcbicgK1xuICAnICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NTBcdTI1NTBcdTI1NUQgICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1ODhcdTI1ODhcdTI1NTcgXFxuJyArXG4gICcgIFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU1N1x1MjU4OFx1MjU4OFx1MjU1NFx1MjU1RFx1MjU1QVx1MjU4OFx1MjU4OFx1MjU1N1xcbicgK1xuICAnICBcdTI1NUFcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NURcdTI1NUFcdTI1NTBcdTI1NUQgXHUyNTVBXHUyNTUwXHUyNTVEJyArIHJlc2V0ICsgJ1xcbicgK1xuICAnXFxuJyArXG4gICcgIEVaX0FnZW50cyAnICsgZGltICsgJ3YnICsgcGtnLnZlcnNpb24gKyByZXNldCArICdcXG4nICtcbiAgJyAgTXVsdGktTW9kZWwgRWRpdGlvbicgKyByZXNldCArICdcXG4nICtcbiAgJyAgQSBtZXRhLXByb21wdGluZywgY29udGV4dCBlbmdpbmVlcmluZyBhbmQgc3BlYy1kcml2ZW5cXG4nICtcbiAgJyAgZGV2ZWxvcG1lbnQgc3lzdGVtIGZvciBDbGF1ZGUgQ29kZSwgT3BlbkNvZGUsIEdlbWluaSwgQ29kZXgsIENvcGlsb3QsXFxuJyArXG4gICcgIFF3ZW4gQ29kZSwgS2ltaSBDb2RlLCB3aXRoIG11bHRpLW1vZGVsIHN1cHBvcnQuXFxuJyArXG4gICcgIE9yaWdpbmFsIGJ5IFRcdTAwQzJDSEVTIHwgTXVsdGktTW9kZWwgRm9yayBieSBAaG93bGlsLlxcbic7XG5cblxuLy8gUGFyc2UgLS1jb25maWctZGlyIGFyZ3VtZW50XG5mdW5jdGlvbiBwYXJzZUNvbmZpZ0RpckFyZygpIHtcbiAgY29uc3QgY29uZmlnRGlySW5kZXggPSBhcmdzLmZpbmRJbmRleChhcmcgPT4gYXJnID09PSAnLS1jb25maWctZGlyJyB8fCBhcmcgPT09ICctYycpO1xuICBpZiAoY29uZmlnRGlySW5kZXggIT09IC0xKSB7XG4gICAgY29uc3QgbmV4dEFyZyA9IGFyZ3NbY29uZmlnRGlySW5kZXggKyAxXTtcbiAgICAvLyBFcnJvciBpZiAtLWNvbmZpZy1kaXIgaXMgcHJvdmlkZWQgd2l0aG91dCBhIHZhbHVlIG9yIG5leHQgYXJnIGlzIGFub3RoZXIgZmxhZ1xuICAgIGlmICghbmV4dEFyZyB8fCBuZXh0QXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd30tLWNvbmZpZy1kaXIgcmVxdWlyZXMgYSBwYXRoIGFyZ3VtZW50JHtyZXNldH1gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRBcmc7XG4gIH1cbiAgLy8gQWxzbyBoYW5kbGUgLS1jb25maWctZGlyPXZhbHVlIGZvcm1hdFxuICBjb25zdCBjb25maWdEaXJBcmcgPSBhcmdzLmZpbmQoYXJnID0+IGFyZy5zdGFydHNXaXRoKCctLWNvbmZpZy1kaXI9JykgfHwgYXJnLnN0YXJ0c1dpdGgoJy1jPScpKTtcbiAgaWYgKGNvbmZpZ0RpckFyZykge1xuICAgIGNvbnN0IHZhbHVlID0gY29uZmlnRGlyQXJnLnNwbGl0KCc9JylbMV07XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd30tLWNvbmZpZy1kaXIgcmVxdWlyZXMgYSBub24tZW1wdHkgcGF0aCR7cmVzZXR9YCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmNvbnN0IGV4cGxpY2l0Q29uZmlnRGlyID0gcGFyc2VDb25maWdEaXJBcmcoKTtcbmNvbnN0IGhhc0hlbHAgPSBhcmdzLmluY2x1ZGVzKCctLWhlbHAnKSB8fCBhcmdzLmluY2x1ZGVzKCctaCcpO1xuY29uc3QgaGFzVmVyc2lvbiA9IGFyZ3MuaW5jbHVkZXMoJy0tdmVyc2lvbicpIHx8IGFyZ3MuaW5jbHVkZXMoJy12Jyk7XG5jb25zdCBmb3JjZVN0YXR1c2xpbmUgPSBhcmdzLmluY2x1ZGVzKCctLWZvcmNlLXN0YXR1c2xpbmUnKTtcblxuLy8gU2hvdyB2ZXJzaW9uIGlmIHJlcXVlc3RlZCAoc2tpcCBiYW5uZXIsIGp1c3Qgb3V0cHV0IHZlcnNpb24pXG5pZiAoaGFzVmVyc2lvbikge1xuICBjb25zb2xlLmxvZyhwa2cudmVyc2lvbik7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuY29uc29sZS5sb2coYmFubmVyKTtcblxuaWYgKGhhc1VuaW5zdGFsbCkge1xuICBjb25zb2xlLmxvZygnICBNb2RlOiBVbmluc3RhbGxcXG4nKTtcbn1cblxuLy8gU2hvdyBoZWxwIGlmIHJlcXVlc3RlZFxuaWYgKGhhc0hlbHApIHtcbiAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9VXNhZ2U6JHtyZXNldH0gbnB4IGV6LWFnZW50cyBbb3B0aW9uc11cXG5cXG4gICR7eWVsbG93fU9wdGlvbnM6JHtyZXNldH1cXG4gICAgJHtjeWFufS1nLCAtLWdsb2JhbCR7cmVzZXR9ICAgICAgICAgICAgICBJbnN0YWxsIGdsb2JhbGx5ICh0byBjb25maWcgZGlyZWN0b3J5KVxcbiAgICAke2N5YW59LWwsIC0tbG9jYWwke3Jlc2V0fSAgICAgICAgICAgICAgIEluc3RhbGwgbG9jYWxseSAodG8gY3VycmVudCBkaXJlY3RvcnkpXFxuICAgICR7Y3lhbn0tLWNsYXVkZSR7cmVzZXR9ICAgICAgICAgICAgICAgICAgSW5zdGFsbCBmb3IgQ2xhdWRlIENvZGUgb25seVxcbiAgICAke2N5YW59LS1vcGVuY29kZSR7cmVzZXR9ICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIE9wZW5Db2RlIG9ubHlcXG4gICAgJHtjeWFufS0tZ2VtaW5pJHtyZXNldH0gICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBHZW1pbmkgb25seVxcbiAgICAke2N5YW59LS1jb2RleCR7cmVzZXR9ICAgICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIENvZGV4IG9ubHlcXG4gICAgJHtjeWFufS0tY29waWxvdCR7cmVzZXR9ICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBDb3BpbG90IG9ubHlcXG4gICAgJHtjeWFufS0tcXdlbiR7cmVzZXR9ICAgICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBRd2VuIENvZGUgb25seVxcbiAgICAke2N5YW59LS1raW1pJHtyZXNldH0gICAgICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIEtpbWkgQ29kZSBvbmx5XFxuICAgICR7Y3lhbn0tLWFsbCR7cmVzZXR9ICAgICAgICAgICAgICAgICAgICAgSW5zdGFsbCBmb3IgYWxsIHJ1bnRpbWVzXFxuICAgICR7Y3lhbn0tdSwgLS11bmluc3RhbGwke3Jlc2V0fSAgICAgICAgICAgVW5pbnN0YWxsIEVaX0FnZW50cyAocmVtb3ZlIGFsbCBFWl9BZ2VudHMgZmlsZXMpXFxuICAgICR7Y3lhbn0tYywgLS1jb25maWctZGlyIDxwYXRoPiR7cmVzZXR9ICAgU3BlY2lmeSBjdXN0b20gY29uZmlnIGRpcmVjdG9yeVxcbiAgICAke2N5YW59LXYsIC0tdmVyc2lvbiR7cmVzZXR9ICAgICAgICAgICAgIFNob3cgdmVyc2lvbiBudW1iZXJcXG4gICAgJHtjeWFufS1oLCAtLWhlbHAke3Jlc2V0fSAgICAgICAgICAgICAgICBTaG93IHRoaXMgaGVscCBtZXNzYWdlXFxuICAgICR7Y3lhbn0tLWZvcmNlLXN0YXR1c2xpbmUke3Jlc2V0fSAgICAgICAgUmVwbGFjZSBleGlzdGluZyBzdGF0dXNsaW5lIGNvbmZpZ1xcblxcbiAgJHt5ZWxsb3d9RXhhbXBsZXM6JHtyZXNldH1cXG4gICAgJHtkaW19IyBJbnRlcmFjdGl2ZSBpbnN0YWxsIChwcm9tcHRzIGZvciBydW50aW1lIGFuZCBsb2NhdGlvbikke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzXFxuXFxuICAgICR7ZGltfSMgSW5zdGFsbCBmb3IgQ2xhdWRlIENvZGUgZ2xvYmFsbHkke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzIC0tY2xhdWRlIC0tZ2xvYmFsXFxuXFxuICAgICR7ZGltfSMgSW5zdGFsbCBmb3IgUXdlbiBDb2RlIGdsb2JhbGx5JHtyZXNldH1cXG4gICAgbnB4IGV6LWFnZW50cyAtLXF3ZW4gLS1nbG9iYWxcXG5cXG4gICAgJHtkaW19IyBJbnN0YWxsIGZvciBLaW1pIENvZGUgZ2xvYmFsbHkke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzIC0ta2ltaSAtLWdsb2JhbFxcblxcbiAgICAke2RpbX0jIEluc3RhbGwgZm9yIGFsbCBydW50aW1lcyBnbG9iYWxseSR7cmVzZXR9XFxuICAgIG5weCBlei1hZ2VudHMgLS1hbGwgLS1nbG9iYWxcXG5cXG4gICAgJHtkaW19IyBVbmluc3RhbGwgRVpfQWdlbnRzIGdsb2JhbGx5JHtyZXNldH1cXG4gICAgbnB4IGV6LWFnZW50cyAtLWFsbCAtLWdsb2JhbCAtLXVuaW5zdGFsbFxcblxcbiAgICAke2RpbX0jIFNob3cgdmVyc2lvbiR7cmVzZXR9XFxuICAgIG5weCBlei1hZ2VudHMgLS12ZXJzaW9uXFxuXFxuICAke3llbGxvd31Ob3Rlczoke3Jlc2V0fVxcbiAgICBUaGUgLS1jb25maWctZGlyIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBjb25maWd1cmF0aW9ucy5cXG4gICAgSXQgdGFrZXMgcHJpb3JpdHkgb3ZlciBDTEFVREVfQ09ORklHX0RJUiAvIEdFTUlOSV9DT05GSUdfRElSIC8gQ09ERVhfSE9NRSAvIENPUElMT1RfQ09ORklHX0RJUiAvIFFXRU5fQ09ORklHX0RJUiAvIEtJTUlfQ09ORklHX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXFxuXFxuICAke3llbGxvd31Nb2RlbCBQcm92aWRlcnM6JHtyZXNldH1cXG4gICAgT3BlbkFJIGFuZCBBbnRocm9waWMgYXJlIG1vZGVsIHByb3ZpZGVycyBjb25maWd1cmVkIGluIHNldHRpbmdzLmpzb24sXFxuICAgIG5vdCBzZXBhcmF0ZSBDTEkgcnVudGltZXMuIFNlZSBSRUFETUUubWQgZm9yIG1vZGVsIGNvbmZpZ3VyYXRpb24uXFxuYCk7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuLyoqXG4gKiBFeHBhbmQgfiB0byBob21lIGRpcmVjdG9yeSAoc2hlbGwgZG9lc24ndCBleHBhbmQgaW4gZW52IHZhcnMgcGFzc2VkIHRvIG5vZGUpXG4gKi9cbmZ1bmN0aW9uIGV4cGFuZFRpbGRlKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aCAmJiBmaWxlUGF0aC5zdGFydHNXaXRoKCd+LycpKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksIGZpbGVQYXRoLnNsaWNlKDIpKTtcbiAgfVxuICByZXR1cm4gZmlsZVBhdGg7XG59XG5cbi8qKlxuICogQnVpbGQgYSBob29rIGNvbW1hbmQgcGF0aCB1c2luZyBmb3J3YXJkIHNsYXNoZXMgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhdGliaWxpdHkuXG4gKiBPbiBXaW5kb3dzLCAkSE9NRSBpcyBub3QgZXhwYW5kZWQgYnkgY21kLmV4ZS9Qb3dlclNoZWxsLCBzbyB3ZSB1c2UgdGhlIGFjdHVhbCBwYXRoLlxuICovXG5mdW5jdGlvbiBidWlsZEhvb2tDb21tYW5kKGNvbmZpZ0RpciwgaG9va05hbWUpIHtcbiAgLy8gVXNlIGZvcndhcmQgc2xhc2hlcyBmb3IgTm9kZS5qcyBjb21wYXRpYmlsaXR5IG9uIGFsbCBwbGF0Zm9ybXNcbiAgY29uc3QgaG9va3NQYXRoID0gY29uZmlnRGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKSArICcvaG9va3MvJyArIGhvb2tOYW1lO1xuICByZXR1cm4gYG5vZGUgXCIke2hvb2tzUGF0aH1cImA7XG59XG5cbi8qKlxuICogUmVhZCBhbmQgcGFyc2Ugc2V0dGluZ3MuanNvbiwgcmV0dXJuaW5nIGVtcHR5IG9iamVjdCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gKi9cbmZ1bmN0aW9uIHJlYWRTZXR0aW5ncyhzZXR0aW5nc1BhdGgpIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoc2V0dGluZ3NQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBXcml0ZSBzZXR0aW5ncy5qc29uIHdpdGggcHJvcGVyIGZvcm1hdHRpbmdcbiAqL1xuZnVuY3Rpb24gd3JpdGVTZXR0aW5ncyhzZXR0aW5nc1BhdGgsIHNldHRpbmdzKSB7XG4gIGZzLndyaXRlRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgbnVsbCwgMikgKyAnXFxuJyk7XG59XG5cbi8vIENhY2hlIGZvciBhdHRyaWJ1dGlvbiBzZXR0aW5ncyAocG9wdWxhdGVkIG9uY2UgcGVyIHJ1bnRpbWUgZHVyaW5nIGluc3RhbGwpXG5jb25zdCBhdHRyaWJ1dGlvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmc+KCk7XG5cbi8qKlxuICogR2V0IGNvbW1pdCBhdHRyaWJ1dGlvbiBzZXR0aW5nIGZvciBhIHJ1bnRpbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCBvciAnY29waWxvdCdcbiAqIEByZXR1cm5zIHtudWxsfHVuZGVmaW5lZHxzdHJpbmd9IG51bGwgPSByZW1vdmUsIHVuZGVmaW5lZCA9IGtlZXAgZGVmYXVsdCwgc3RyaW5nID0gY3VzdG9tXG4gKi9cbmZ1bmN0aW9uIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWU6IHN0cmluZyk6IG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcge1xuICAvLyBSZXR1cm4gY2FjaGVkIHZhbHVlIGlmIGF2YWlsYWJsZVxuICBpZiAoYXR0cmlidXRpb25DYWNoZS5oYXMocnVudGltZSkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRpb25DYWNoZS5nZXQocnVudGltZSk7XG4gIH1cblxuICBsZXQgcmVzdWx0OiBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nO1xuXG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVhZFNldHRpbmdzKHBhdGguam9pbihnZXRHbG9iYWxEaXIoJ29wZW5jb2RlJywgbnVsbCksICdvcGVuY29kZS5qc29uJykpO1xuICAgIHJlc3VsdCA9IGNvbmZpZy5kaXNhYmxlX2FpX2F0dHJpYnV0aW9uID09PSB0cnVlID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykge1xuICAgIC8vIEdlbWluaTogY2hlY2sgZ2VtaW5pIHNldHRpbmdzLmpzb24gZm9yIGF0dHJpYnV0aW9uIGNvbmZpZ1xuICAgIGNvbnN0IHNldHRpbmdzID0gcmVhZFNldHRpbmdzKHBhdGguam9pbihnZXRHbG9iYWxEaXIoJ2dlbWluaScsIGV4cGxpY2l0Q29uZmlnRGlyKSwgJ3NldHRpbmdzLmpzb24nKSk7XG4gICAgaWYgKCFzZXR0aW5ncy5hdHRyaWJ1dGlvbiB8fCBzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MuYXR0cmlidXRpb24uY29tbWl0ID09PSAnJykge1xuICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gc2V0dGluZ3MuYXR0cmlidXRpb24uY29tbWl0O1xuICAgIH1cbiAgfSBlbHNlIGlmIChydW50aW1lID09PSAnY2xhdWRlJykge1xuICAgIC8vIENsYXVkZSBDb2RlXG4gICAgY29uc3Qgc2V0dGluZ3MgPSByZWFkU2V0dGluZ3MocGF0aC5qb2luKGdldEdsb2JhbERpcignY2xhdWRlJywgZXhwbGljaXRDb25maWdEaXIpLCAnc2V0dGluZ3MuanNvbicpKTtcbiAgICBpZiAoIXNldHRpbmdzLmF0dHJpYnV0aW9uIHx8IHNldHRpbmdzLmF0dHJpYnV0aW9uLmNvbW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQgPT09ICcnKSB7XG4gICAgICByZXN1bHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIENvZGV4IGFuZCBDb3BpbG90IGN1cnJlbnRseSBoYXZlIG5vIGF0dHJpYnV0aW9uIHNldHRpbmcgZXF1aXZhbGVudFxuICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIENhY2hlIGFuZCByZXR1cm5cbiAgYXR0cmlidXRpb25DYWNoZS5zZXQocnVudGltZSwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIENvLUF1dGhvcmVkLUJ5IGxpbmVzIGJhc2VkIG9uIGF0dHJpYnV0aW9uIHNldHRpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gRmlsZSBjb250ZW50IHRvIHByb2Nlc3NcbiAqIEBwYXJhbSB7bnVsbHx1bmRlZmluZWR8c3RyaW5nfSBhdHRyaWJ1dGlvbiAtIG51bGw9cmVtb3ZlLCB1bmRlZmluZWQ9a2VlcCwgc3RyaW5nPXJlcGxhY2VcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFByb2Nlc3NlZCBjb250ZW50XG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50OiBzdHJpbmcsIGF0dHJpYnV0aW9uOiBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGF0dHJpYnV0aW9uID09PSBudWxsKSB7XG4gICAgLy8gUmVtb3ZlIENvLUF1dGhvcmVkLUJ5IGxpbmVzIGFuZCB0aGUgcHJlY2VkaW5nIGJsYW5rIGxpbmVcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKC8oXFxyP1xcbil7Mn1Dby1BdXRob3JlZC1CeTouKiQvZ2ltLCAnJyk7XG4gIH1cbiAgaWYgKGF0dHJpYnV0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICAvLyBSZXBsYWNlIHdpdGggY3VzdG9tIGF0dHJpYnV0aW9uIChlc2NhcGUgJCB0byBwcmV2ZW50IGJhY2tyZWZlcmVuY2UgaW5qZWN0aW9uKVxuICBjb25zdCBzYWZlQXR0cmlidXRpb24gPSBhdHRyaWJ1dGlvbi5yZXBsYWNlKC9cXCQvZywgJyQkJCQnKTtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSgvQ28tQXV0aG9yZWQtQnk6LiokL2dpbSwgYENvLUF1dGhvcmVkLUJ5OiAke3NhZmVBdHRyaWJ1dGlvbn1gKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IENsYXVkZSBDb2RlIGZyb250bWF0dGVyIHRvIG9wZW5jb2RlIGZvcm1hdFxuICogLSBDb252ZXJ0cyAnYWxsb3dlZC10b29sczonIGFycmF5IHRvICdwZXJtaXNzaW9uOicgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIE1hcmtkb3duIGZpbGUgY29udGVudCB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ29udGVudCB3aXRoIGNvbnZlcnRlZCBmcm9udG1hdHRlclxuICovXG4vLyBDb2xvciBuYW1lIHRvIGhleCBtYXBwaW5nIGZvciBvcGVuY29kZSBjb21wYXRpYmlsaXR5XG5jb25zdCBjb2xvck5hbWVUb0hleCA9IHtcbiAgY3lhbjogJyMwMEZGRkYnLFxuICByZWQ6ICcjRkYwMDAwJyxcbiAgZ3JlZW46ICcjMDBGRjAwJyxcbiAgYmx1ZTogJyMwMDAwRkYnLFxuICB5ZWxsb3c6ICcjRkZGRjAwJyxcbiAgbWFnZW50YTogJyNGRjAwRkYnLFxuICBvcmFuZ2U6ICcjRkZBNTAwJyxcbiAgcHVycGxlOiAnIzgwMDA4MCcsXG4gIHBpbms6ICcjRkZDMENCJyxcbiAgd2hpdGU6ICcjRkZGRkZGJyxcbiAgYmxhY2s6ICcjMDAwMDAwJyxcbiAgZ3JheTogJyM4MDgwODAnLFxuICBncmV5OiAnIzgwODA4MCcsXG59O1xuXG4vLyBUb29sIG5hbWUgbWFwcGluZyBmcm9tIENsYXVkZSBDb2RlIHRvIE9wZW5Db2RlXG4vLyBPcGVuQ29kZSB1c2VzIGxvd2VyY2FzZSB0b29sIG5hbWVzOyBzcGVjaWFsIG1hcHBpbmdzIGZvciByZW5hbWVkIHRvb2xzXG5jb25zdCBjbGF1ZGVUb09wZW5jb2RlVG9vbHMgPSB7XG4gIEFza1VzZXJRdWVzdGlvbjogJ3F1ZXN0aW9uJyxcbiAgU2xhc2hDb21tYW5kOiAnc2tpbGwnLFxuICBUb2RvV3JpdGU6ICd0b2Rvd3JpdGUnLFxuICBXZWJGZXRjaDogJ3dlYmZldGNoJyxcbiAgV2ViU2VhcmNoOiAnd2Vic2VhcmNoJywgIC8vIFBsdWdpbi9NQ1AgLSBrZWVwIGZvciBjb21wYXRpYmlsaXR5XG59O1xuXG4vLyBUb29sIG5hbWUgbWFwcGluZyBmcm9tIENsYXVkZSBDb2RlIHRvIEdlbWluaSBDTElcbi8vIEdlbWluaSBDTEkgdXNlcyBzbmFrZV9jYXNlIGJ1aWx0LWluIHRvb2wgbmFtZXNcbmNvbnN0IGNsYXVkZVRvR2VtaW5pVG9vbHMgPSB7XG4gIFJlYWQ6ICdyZWFkX2ZpbGUnLFxuICBXcml0ZTogJ3dyaXRlX2ZpbGUnLFxuICBFZGl0OiAncmVwbGFjZScsXG4gIEJhc2g6ICdydW5fc2hlbGxfY29tbWFuZCcsXG4gIEdsb2I6ICdnbG9iJyxcbiAgR3JlcDogJ3NlYXJjaF9maWxlX2NvbnRlbnQnLFxuICBXZWJTZWFyY2g6ICdnb29nbGVfd2ViX3NlYXJjaCcsXG4gIFdlYkZldGNoOiAnd2ViX2ZldGNoJyxcbiAgVG9kb1dyaXRlOiAnd3JpdGVfdG9kb3MnLFxuICBBc2tVc2VyUXVlc3Rpb246ICdhc2tfdXNlcicsXG59O1xuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gT3BlbkNvZGUgZm9ybWF0XG4gKiAtIEFwcGxpZXMgc3BlY2lhbCBtYXBwaW5ncyAoQXNrVXNlclF1ZXN0aW9uIC0+IHF1ZXN0aW9uLCBldGMuKVxuICogLSBDb252ZXJ0cyB0byBsb3dlcmNhc2UgKGV4Y2VwdCBNQ1AgdG9vbHMgd2hpY2gga2VlcCB0aGVpciBmb3JtYXQpXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRUb29sTmFtZShjbGF1ZGVUb29sKSB7XG4gIC8vIENoZWNrIGZvciBzcGVjaWFsIG1hcHBpbmcgZmlyc3RcbiAgaWYgKGNsYXVkZVRvT3BlbmNvZGVUb29sc1tjbGF1ZGVUb29sXSkge1xuICAgIHJldHVybiBjbGF1ZGVUb09wZW5jb2RlVG9vbHNbY2xhdWRlVG9vbF07XG4gIH1cbiAgLy8gTUNQIHRvb2xzIChtY3BfXyopIGtlZXAgdGhlaXIgZm9ybWF0XG4gIGlmIChjbGF1ZGVUb29sLnN0YXJ0c1dpdGgoJ21jcF9fJykpIHtcbiAgICByZXR1cm4gY2xhdWRlVG9vbDtcbiAgfVxuICAvLyBEZWZhdWx0OiBjb252ZXJ0IHRvIGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gR2VtaW5pIENMSSBmb3JtYXRcbiAqIC0gQXBwbGllcyBDbGF1ZGVcdTIxOTJHZW1pbmkgbWFwcGluZyAoUmVhZFx1MjE5MnJlYWRfZmlsZSwgQmFzaFx1MjE5MnJ1bl9zaGVsbF9jb21tYW5kLCBldGMuKVxuICogLSBGaWx0ZXJzIG91dCBNQ1AgdG9vbHMgKG1jcF9fKikgXHUyMDE0IHRoZXkgYXJlIGF1dG8tZGlzY292ZXJlZCBhdCBydW50aW1lIGluIEdlbWluaVxuICogLSBGaWx0ZXJzIG91dCBUYXNrIFx1MjAxNCBhZ2VudHMgYXJlIGF1dG8tcmVnaXN0ZXJlZCBhcyB0b29scyBpbiBHZW1pbmlcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH0gR2VtaW5pIHRvb2wgbmFtZSwgb3IgbnVsbCBpZiB0b29sIHNob3VsZCBiZSBleGNsdWRlZFxuICovXG5mdW5jdGlvbiBjb252ZXJ0R2VtaW5pVG9vbE5hbWUoY2xhdWRlVG9vbCkge1xuICAvLyBNQ1AgdG9vbHM6IGV4Y2x1ZGUgXHUyMDE0IGF1dG8tZGlzY292ZXJlZCBmcm9tIG1jcFNlcnZlcnMgY29uZmlnIGF0IHJ1bnRpbWVcbiAgaWYgKGNsYXVkZVRvb2wuc3RhcnRzV2l0aCgnbWNwX18nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIFRhc2s6IGV4Y2x1ZGUgXHUyMDE0IGFnZW50cyBhcmUgYXV0by1yZWdpc3RlcmVkIGFzIGNhbGxhYmxlIHRvb2xzXG4gIGlmIChjbGF1ZGVUb29sID09PSAnVGFzaycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBDaGVjayBmb3IgZXhwbGljaXQgbWFwcGluZ1xuICBpZiAoY2xhdWRlVG9HZW1pbmlUb29sc1tjbGF1ZGVUb29sXSkge1xuICAgIHJldHVybiBjbGF1ZGVUb0dlbWluaVRvb2xzW2NsYXVkZVRvb2xdO1xuICB9XG4gIC8vIERlZmF1bHQ6IGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gR2l0SHViIENvcGlsb3QgZm9ybWF0LlxuICogLSBBcHBsaWVzIGV4cGxpY2l0IG1hcHBpbmcgZnJvbSBjbGF1ZGVUb0NvcGlsb3RUb29sc1xuICogLSBIYW5kbGVzIG1jcF9fY29udGV4dDdfXyogcHJlZml4IFx1MjE5MiBpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8qXG4gKiAtIEZhbGxzIGJhY2sgdG8gbG93ZXJjYXNlIGZvciB1bmtub3duIHRvb2xzXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDb3BpbG90VG9vbE5hbWUoY2xhdWRlVG9vbCkge1xuICAvLyBtY3BfX2NvbnRleHQ3X18qIHdpbGRjYXJkIFx1MjE5MiBpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8qXG4gIGlmIChjbGF1ZGVUb29sLnN0YXJ0c1dpdGgoJ21jcF9fY29udGV4dDdfXycpKSB7XG4gICAgcmV0dXJuICdpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8nICsgY2xhdWRlVG9vbC5zbGljZSgnbWNwX19jb250ZXh0N19fJy5sZW5ndGgpO1xuICB9XG4gIC8vIENoZWNrIGV4cGxpY2l0IG1hcHBpbmdcbiAgaWYgKGNsYXVkZVRvQ29waWxvdFRvb2xzW2NsYXVkZVRvb2xdKSB7XG4gICAgcmV0dXJuIGNsYXVkZVRvQ29waWxvdFRvb2xzW2NsYXVkZVRvb2xdO1xuICB9XG4gIC8vIERlZmF1bHQ6IGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEFwcGx5IENvcGlsb3Qtc3BlY2lmaWMgY29udGVudCBjb252ZXJzaW9uIFx1MjAxNCBDT05WLTA2IChwYXRocykgKyBDT05WLTA3IChjb21tYW5kIG5hbWVzKS5cbiAqIFBhdGggbWFwcGluZ3MgZGVwZW5kIG9uIGluc3RhbGwgbW9kZTpcbiAqICAgR2xvYmFsOiB+Ly5jbGF1ZGUvIFx1MjE5MiB+Ly5jb3BpbG90LywgLi8uY2xhdWRlLyBcdTIxOTIgLi8uZ2l0aHViL1xuICogICBMb2NhbDogIH4vLmNsYXVkZS8gXHUyMTkyIC4vLmdpdGh1Yi8sIC4vLmNsYXVkZS8gXHUyMTkyIC4vLmdpdGh1Yi9cbiAqIEFwcGxpZWQgdG8gQUxMIENvcGlsb3QgY29udGVudCAoc2tpbGxzLCBhZ2VudHMsIGVuZ2luZSBmaWxlcykuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIFNvdXJjZSBjb250ZW50IHRvIGNvbnZlcnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzR2xvYmFsPWZhbHNlXSAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsID0gZmFsc2UpIHtcbiAgbGV0IGMgPSBjb250ZW50O1xuICAvLyBDT05WLTA2OiBQYXRoIHJlcGxhY2VtZW50IFx1MjAxNCBtb3N0IHNwZWNpZmljIGZpcnN0IHRvIGF2b2lkIHN1YnN0cmluZyBtYXRjaGVzXG4gIGlmIChpc0dsb2JhbCkge1xuICAgIGMgPSBjLnJlcGxhY2UoL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZywgJyRIT01FLy5jb3BpbG90LycpO1xuICAgIGMgPSBjLnJlcGxhY2UoL35cXC9cXC5jbGF1ZGVcXC8vZywgJ34vLmNvcGlsb3QvJyk7XG4gIH0gZWxzZSB7XG4gICAgYyA9IGMucmVwbGFjZSgvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nLCAnLmdpdGh1Yi8nKTtcbiAgICBjID0gYy5yZXBsYWNlKC9+XFwvXFwuY2xhdWRlXFwvL2csICcuZ2l0aHViLycpO1xuICB9XG4gIGMgPSBjLnJlcGxhY2UoL1xcLlxcL1xcLmNsYXVkZVxcLy9nLCAnLi8uZ2l0aHViLycpO1xuICBjID0gYy5yZXBsYWNlKC9cXC5jbGF1ZGVcXC8vZywgJy5naXRodWIvJyk7XG4gIC8vIENPTlYtMDc6IENvbW1hbmQgbmFtZSBjb252ZXJzaW9uIChhbGwgZXo6IHJlZmVyZW5jZXMgXHUyMTkyIGV6LSlcbiAgYyA9IGMucmVwbGFjZSgvZXo6L2csICdlei0nKTtcbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQ29udmVydCBhIENsYXVkZSBjb21tYW5kICgubWQpIHRvIGEgQ29waWxvdCBza2lsbCAoU0tJTEwubWQpLlxuICogVHJhbnNmb3JtcyBmcm9udG1hdHRlciBvbmx5IFx1MjAxNCBib2R5IHBhc3NlcyB0aHJvdWdoIHdpdGggQ09OVi0wNi8wNyBhcHBsaWVkLlxuICogU2tpbGxzIGtlZXAgb3JpZ2luYWwgdG9vbCBuYW1lcyAobm8gbWFwcGluZykgcGVyIENPTlRFWFQubWQgZGVjaXNpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db3BpbG90U2tpbGwoY29udGVudCwgc2tpbGxOYW1lLCBpc0dsb2JhbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsKTtcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb252ZXJ0ZWQpO1xuICBpZiAoIWZyb250bWF0dGVyKSByZXR1cm4gY29udmVydGVkO1xuXG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuICBjb25zdCBhcmd1bWVudEhpbnQgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2FyZ3VtZW50LWhpbnQnKTtcbiAgY29uc3QgYWdlbnQgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2FnZW50Jyk7XG5cbiAgLy8gQ09OVi0wMjogRXh0cmFjdCBhbGxvd2VkLXRvb2xzIFlBTUwgbXVsdGlsaW5lIGxpc3QgXHUyMTkyIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmdcbiAgY29uc3QgdG9vbHNNYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKC9eYWxsb3dlZC10b29sczpcXHMqXFxuKCg/OlxccystXFxzKy4rXFxuPykqKS9tKTtcbiAgbGV0IHRvb2xzTGluZSA9ICcnO1xuICBpZiAodG9vbHNNYXRjaCkge1xuICAgIGNvbnN0IHRvb2xzID0gdG9vbHNNYXRjaFsxXS5tYXRjaCgvXlxccystXFxzKyguKykvZ20pO1xuICAgIGlmICh0b29scykge1xuICAgICAgdG9vbHNMaW5lID0gdG9vbHMubWFwKHQgPT4gdC5yZXBsYWNlKC9eXFxzKy1cXHMrLywgJycpLnRyaW0oKSkuam9pbignLCAnKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWNvbnN0cnVjdCBmcm9udG1hdHRlciBpbiBDb3BpbG90IGZvcm1hdFxuICBsZXQgZm0gPSBgLS0tXFxubmFtZTogJHtza2lsbE5hbWV9XFxuZGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259XFxuYDtcbiAgaWYgKGFyZ3VtZW50SGludCkgZm0gKz0gYGFyZ3VtZW50LWhpbnQ6ICR7eWFtbFF1b3RlKGFyZ3VtZW50SGludCl9XFxuYDtcbiAgaWYgKGFnZW50KSBmbSArPSBgYWdlbnQ6ICR7YWdlbnR9XFxuYDtcbiAgaWYgKHRvb2xzTGluZSkgZm0gKz0gYGFsbG93ZWQtdG9vbHM6ICR7dG9vbHNMaW5lfVxcbmA7XG4gIGZtICs9ICctLS0nO1xuXG4gIHJldHVybiBgJHtmbX1cXG4ke2JvZHl9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgQ2xhdWRlIGFnZW50ICgubWQpIHRvIGEgQ29waWxvdCBhZ2VudCAoLmFnZW50Lm1kKS5cbiAqIEFwcGxpZXMgdG9vbCBtYXBwaW5nICsgZGVkdXBsaWNhdGlvbiwgZm9ybWF0cyB0b29scyBhcyBKU09OIGFycmF5LlxuICogQ09OVi0wNDogSlNPTiBhcnJheSBmb3JtYXQuIENPTlYtMDU6IFRvb2wgbmFtZSBtYXBwaW5nLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvcGlsb3RBZ2VudChjb250ZW50LCBpc0dsb2JhbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsKTtcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb252ZXJ0ZWQpO1xuICBpZiAoIWZyb250bWF0dGVyKSByZXR1cm4gY29udmVydGVkO1xuXG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ25hbWUnKSB8fCAndW5rbm93bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuICBjb25zdCBjb2xvciA9IGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCAnY29sb3InKTtcbiAgY29uc3QgdG9vbHNSYXcgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ3Rvb2xzJykgfHwgJyc7XG5cbiAgLy8gQ09OVi0wNCArIENPTlYtMDU6IE1hcCB0b29scywgZGVkdXBsaWNhdGUsIGZvcm1hdCBhcyBKU09OIGFycmF5XG4gIGNvbnN0IGNsYXVkZVRvb2xzID0gdG9vbHNSYXcuc3BsaXQoJywnKS5tYXAodCA9PiB0LnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBtYXBwZWRUb29scyA9IGNsYXVkZVRvb2xzLm1hcCh0ID0+IGNvbnZlcnRDb3BpbG90VG9vbE5hbWUodCkpO1xuICBjb25zdCB1bmlxdWVUb29scyA9IFsuLi5uZXcgU2V0KG1hcHBlZFRvb2xzKV07XG4gIGNvbnN0IHRvb2xzQXJyYXkgPSB1bmlxdWVUb29scy5sZW5ndGggPiAwXG4gICAgPyBcIlsnXCIgKyB1bmlxdWVUb29scy5qb2luKFwiJywgJ1wiKSArIFwiJ11cIlxuICAgIDogJ1tdJztcblxuICAvLyBSZWNvbnN0cnVjdCBmcm9udG1hdHRlciBpbiBDb3BpbG90IGZvcm1hdFxuICBsZXQgZm0gPSBgLS0tXFxubmFtZTogJHtuYW1lfVxcbmRlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufVxcbnRvb2xzOiAke3Rvb2xzQXJyYXl9XFxuYDtcbiAgaWYgKGNvbG9yKSBmbSArPSBgY29sb3I6ICR7Y29sb3J9XFxuYDtcbiAgZm0gKz0gJy0tLSc7XG5cbiAgcmV0dXJuIGAke2ZtfVxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiB0b1NpbmdsZUxpbmUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIHlhbWxRdW90ZSh2YWx1ZSkge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RnJvbnRtYXR0ZXJBbmRCb2R5KGNvbnRlbnQpIHtcbiAgaWYgKCFjb250ZW50LnN0YXJ0c1dpdGgoJy0tLScpKSB7XG4gICAgcmV0dXJuIHsgZnJvbnRtYXR0ZXI6IG51bGwsIGJvZHk6IGNvbnRlbnQgfTtcbiAgfVxuXG4gIGNvbnN0IGVuZEluZGV4ID0gY29udGVudC5pbmRleE9mKCctLS0nLCAzKTtcbiAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiB7IGZyb250bWF0dGVyOiBudWxsLCBib2R5OiBjb250ZW50IH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZyb250bWF0dGVyOiBjb250ZW50LnN1YnN0cmluZygzLCBlbmRJbmRleCkudHJpbSgpLFxuICAgIGJvZHk6IGNvbnRlbnQuc3Vic3RyaW5nKGVuZEluZGV4ICsgMyksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCBmaWVsZE5hbWUpIHtcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtmaWVsZE5hbWV9OlxcXFxzKiguKykkYCwgJ20nKTtcbiAgY29uc3QgbWF0Y2ggPSBmcm9udG1hdHRlci5tYXRjaChyZWdleCk7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuICByZXR1cm4gbWF0Y2hbMV0udHJpbSgpLnJlcGxhY2UoL15bJ1wiXXxbJ1wiXSQvZywgJycpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0U2xhc2hDb21tYW5kc1RvQ29kZXhTa2lsbE1lbnRpb25zKGNvbnRlbnQpIHtcbiAgbGV0IGNvbnZlcnRlZCA9IGNvbnRlbnQucmVwbGFjZSgvXFwvZXo6KFthLXowLTktXSspL2dpLCAoXywgY29tbWFuZE5hbWUpID0+IHtcbiAgICByZXR1cm4gYCRlei0ke1N0cmluZyhjb21tYW5kTmFtZSkudG9Mb3dlckNhc2UoKX1gO1xuICB9KTtcbiAgY29udmVydGVkID0gY29udmVydGVkLnJlcGxhY2UoL1xcL2V6LWhlbHBcXGIvZywgJyRlei1oZWxwJyk7XG4gIHJldHVybiBjb252ZXJ0ZWQ7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0NvZGV4TWFya2Rvd24oY29udGVudCkge1xuICBsZXQgY29udmVydGVkID0gY29udmVydFNsYXNoQ29tbWFuZHNUb0NvZGV4U2tpbGxNZW50aW9ucyhjb250ZW50KTtcbiAgY29udmVydGVkID0gY29udmVydGVkLnJlcGxhY2UoL1xcJEFSR1VNRU5UU1xcYi9nLCAne3tFWl9BUkdTfX0nKTtcbiAgcmV0dXJuIGNvbnZlcnRlZDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29kZXhTa2lsbEFkYXB0ZXJIZWFkZXIoc2tpbGxOYW1lKSB7XG4gIGNvbnN0IGludm9jYXRpb24gPSBgJCR7c2tpbGxOYW1lfWA7XG4gIHJldHVybiBgPGNvZGV4X3NraWxsX2FkYXB0ZXI+XG4jIyBBLiBTa2lsbCBJbnZvY2F0aW9uXG4tIFRoaXMgc2tpbGwgaXMgaW52b2tlZCBieSBtZW50aW9uaW5nIFxcYCR7aW52b2NhdGlvbn1cXGAuXG4tIFRyZWF0IGFsbCB1c2VyIHRleHQgYWZ0ZXIgXFxgJHtpbnZvY2F0aW9ufVxcYCBhcyBcXGB7e0VaX0FSR1N9fVxcYC5cbi0gSWYgbm8gYXJndW1lbnRzIGFyZSBwcmVzZW50LCB0cmVhdCBcXGB7e0VaX0FSR1N9fVxcYCBhcyBlbXB0eS5cblxuIyMgQi4gQXNrVXNlclF1ZXN0aW9uIFx1MjE5MiByZXF1ZXN0X3VzZXJfaW5wdXQgTWFwcGluZ1xuRVpfQWdlbnRzIHdvcmtmbG93cyB1c2UgXFxgQXNrVXNlclF1ZXN0aW9uXFxgIChDbGF1ZGUgQ29kZSBzeW50YXgpLiBUcmFuc2xhdGUgdG8gQ29kZXggXFxgcmVxdWVzdF91c2VyX2lucHV0XFxgOlxuXG5QYXJhbWV0ZXIgbWFwcGluZzpcbi0gXFxgaGVhZGVyXFxgIFx1MjE5MiBcXGBoZWFkZXJcXGBcbi0gXFxgcXVlc3Rpb25cXGAgXHUyMTkyIFxcYHF1ZXN0aW9uXFxgXG4tIE9wdGlvbnMgZm9ybWF0dGVkIGFzIFxcYFwiTGFiZWxcIiBcdTIwMTQgZGVzY3JpcHRpb25cXGAgXHUyMTkyIFxcYHtsYWJlbDogXCJMYWJlbFwiLCBkZXNjcmlwdGlvbjogXCJkZXNjcmlwdGlvblwifVxcYFxuLSBHZW5lcmF0ZSBcXGBpZFxcYCBmcm9tIGhlYWRlcjogbG93ZXJjYXNlLCByZXBsYWNlIHNwYWNlcyB3aXRoIHVuZGVyc2NvcmVzXG5cbkJhdGNoZWQgY2FsbHM6XG4tIFxcYEFza1VzZXJRdWVzdGlvbihbcTEsIHEyXSlcXGAgXHUyMTkyIHNpbmdsZSBcXGByZXF1ZXN0X3VzZXJfaW5wdXRcXGAgd2l0aCBtdWx0aXBsZSBlbnRyaWVzIGluIFxcYHF1ZXN0aW9uc1tdXFxgXG5cbk11bHRpLXNlbGVjdCB3b3JrYXJvdW5kOlxuLSBDb2RleCBoYXMgbm8gXFxgbXVsdGlTZWxlY3RcXGAuIFVzZSBzZXF1ZW50aWFsIHNpbmdsZS1zZWxlY3RzLCBvciBwcmVzZW50IGEgbnVtYmVyZWQgZnJlZWZvcm0gbGlzdCBhc2tpbmcgdGhlIHVzZXIgdG8gZW50ZXIgY29tbWEtc2VwYXJhdGVkIG51bWJlcnMuXG5cbkV4ZWN1dGUgbW9kZSBmYWxsYmFjazpcbi0gV2hlbiBcXGByZXF1ZXN0X3VzZXJfaW5wdXRcXGAgaXMgcmVqZWN0ZWQgKEV4ZWN1dGUgbW9kZSksIHByZXNlbnQgYSBwbGFpbi10ZXh0IG51bWJlcmVkIGxpc3QgYW5kIHBpY2sgYSByZWFzb25hYmxlIGRlZmF1bHQuXG5cbiMjIEMuIFRhc2soKSBcdTIxOTIgc3Bhd25fYWdlbnQgTWFwcGluZ1xuRVpfQWdlbnRzIHdvcmtmbG93cyB1c2UgXFxgVGFzayguLi4pXFxgIChDbGF1ZGUgQ29kZSBzeW50YXgpLiBUcmFuc2xhdGUgdG8gQ29kZXggY29sbGFib3JhdGlvbiB0b29sczpcblxuRGlyZWN0IG1hcHBpbmc6XG4tIFxcYFRhc2soc3ViYWdlbnRfdHlwZT1cIlhcIiwgcHJvbXB0PVwiWVwiKVxcYCBcdTIxOTIgXFxgc3Bhd25fYWdlbnQoYWdlbnRfdHlwZT1cIlhcIiwgbWVzc2FnZT1cIllcIilcXGBcbi0gXFxgVGFzayhtb2RlbD1cIi4uLlwiKVxcYCBcdTIxOTIgb21pdCAoQ29kZXggdXNlcyBwZXItcm9sZSBjb25maWcsIG5vdCBpbmxpbmUgbW9kZWwgc2VsZWN0aW9uKVxuLSBcXGBmb3JrX2NvbnRleHQ6IGZhbHNlXFxgIGJ5IGRlZmF1bHQgXHUyMDE0IEVaX0FnZW50cyBhZ2VudHMgbG9hZCB0aGVpciBvd24gY29udGV4dCB2aWEgXFxgPGZpbGVzX3RvX3JlYWQ+XFxgIGJsb2Nrc1xuXG5QYXJhbGxlbCBmYW4tb3V0OlxuLSBTcGF3biBtdWx0aXBsZSBhZ2VudHMgXHUyMTkyIGNvbGxlY3QgYWdlbnQgSURzIFx1MjE5MiBcXGB3YWl0KGlkcylcXGAgZm9yIGFsbCB0byBjb21wbGV0ZVxuXG5SZXN1bHQgcGFyc2luZzpcbi0gTG9vayBmb3Igc3RydWN0dXJlZCBtYXJrZXJzIGluIGFnZW50IG91dHB1dDogXFxgQ0hFQ0tQT0lOVFxcYCwgXFxgUExBTiBDT01QTEVURVxcYCwgXFxgU1VNTUFSWVxcYCwgZXRjLlxuLSBcXGBjbG9zZV9hZ2VudChpZClcXGAgYWZ0ZXIgY29sbGVjdGluZyByZXN1bHRzIGZyb20gZWFjaCBhZ2VudFxuPC9jb2RleF9za2lsbF9hZGFwdGVyPmA7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db2RleFNraWxsKGNvbnRlbnQsIHNraWxsTmFtZSkge1xuICBjb25zdCBjb252ZXJ0ZWQgPSBjb252ZXJ0Q2xhdWRlVG9Db2RleE1hcmtkb3duKGNvbnRlbnQpO1xuICBjb25zdCB7IGZyb250bWF0dGVyLCBib2R5IH0gPSBleHRyYWN0RnJvbnRtYXR0ZXJBbmRCb2R5KGNvbnZlcnRlZCk7XG4gIGxldCBkZXNjcmlwdGlvbiA9IGBSdW4gRVpfQWdlbnRzIHdvcmtmbG93ICR7c2tpbGxOYW1lfS5gO1xuICBpZiAoZnJvbnRtYXR0ZXIpIHtcbiAgICBjb25zdCBtYXliZURlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpO1xuICAgIGlmIChtYXliZURlc2NyaXB0aW9uKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9IG1heWJlRGVzY3JpcHRpb247XG4gICAgfVxuICB9XG4gIGRlc2NyaXB0aW9uID0gdG9TaW5nbGVMaW5lKGRlc2NyaXB0aW9uKTtcbiAgY29uc3Qgc2hvcnREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLmxlbmd0aCA+IDE4MCA/IGAke2Rlc2NyaXB0aW9uLnNsaWNlKDAsIDE3Nyl9Li4uYCA6IGRlc2NyaXB0aW9uO1xuICBjb25zdCBhZGFwdGVyID0gZ2V0Q29kZXhTa2lsbEFkYXB0ZXJIZWFkZXIoc2tpbGxOYW1lKTtcblxuICByZXR1cm4gYC0tLVxcbm5hbWU6ICR7eWFtbFF1b3RlKHNraWxsTmFtZSl9XFxuZGVzY3JpcHRpb246ICR7eWFtbFF1b3RlKGRlc2NyaXB0aW9uKX1cXG5tZXRhZGF0YTpcXG4gIHNob3J0LWRlc2NyaXB0aW9uOiAke3lhbWxRdW90ZShzaG9ydERlc2NyaXB0aW9uKX1cXG4tLS1cXG5cXG4ke2FkYXB0ZXJ9XFxuXFxuJHtib2R5LnRyaW1TdGFydCgpfWA7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb1F3ZW5BZ2VudChjb250ZW50KSB7XG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIsIGJvZHkgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBjb250ZW50O1xuXG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ25hbWUnKSB8fCAndW5rbm93bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuXG4gIC8vIFF3ZW4gQ29kZSB1c2VzIHNpbXBsZSBtYXJrZG93bi4gV2UnbGwgcHV0IG5hbWUgYW5kIGRlc2NyaXB0aW9uIGluIHRoZSBib2R5LlxuICByZXR1cm4gYCMgQWdlbnQ6ICR7bmFtZX1cXG5cXG4ke2Rlc2NyaXB0aW9ufVxcblxcbiR7Ym9keS50cmltU3RhcnQoKX1gO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlVG9LaW1pU2tpbGwoY29udGVudCwgc2tpbGxOYW1lKSB7XG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIsIGJvZHkgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBjb250ZW50O1xuXG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuXG4gIC8vIFJlY29uc3RydWN0IGFzIHNpbXBsZSBNYXJrZG93blxuICByZXR1cm4gYCMgU2tpbGw6ICR7c2tpbGxOYW1lfVxcblxcbiR7ZGVzY3JpcHRpb259XFxuXFxuJHtib2R5LnRyaW1TdGFydCgpfWA7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0tpbWlBZ2VudChjb250ZW50KSB7XG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIsIGJvZHkgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBjb250ZW50O1xuXG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ25hbWUnKSB8fCAndW5rbm93bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuXG4gIC8vIEtpbWkgQ29kZSB1c2VzIHNpbXBsZSBtYXJrZG93blxuICByZXR1cm4gYCMgQWdlbnQ6ICR7bmFtZX1cXG5cXG4ke2Rlc2NyaXB0aW9ufVxcblxcbiR7Ym9keS50cmltU3RhcnQoKX1gO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgY29tbWFuZCAoLm1kKSB0byBhIFF3ZW4gc2tpbGwgKFNLSUxMLm1kKS5cbiAqIFN0cmlwcyBmcm9udG1hdHRlciBhbmQgZm9ybWF0cyBhcyBzaW1wbGUgTWFya2Rvd24uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb1F3ZW5Ta2lsbChjb250ZW50LCBza2lsbE5hbWUpIHtcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb250ZW50KTtcbiAgaWYgKCFmcm9udG1hdHRlcikgcmV0dXJuIGNvbnRlbnQ7XG5cbiAgY29uc3QgZGVzY3JpcHRpb24gPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2Rlc2NyaXB0aW9uJykgfHwgJyc7XG5cbiAgLy8gUmVjb25zdHJ1Y3QgYXMgc2ltcGxlIE1hcmtkb3duXG4gIHJldHVybiBgIyBTa2lsbDogJHtza2lsbE5hbWV9XFxuXFxuJHtkZXNjcmlwdGlvbn1cXG5cXG4ke2JvZHkudHJpbVN0YXJ0KCl9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IENsYXVkZSBDb2RlIGFnZW50IG1hcmtkb3duIHRvIENvZGV4IGFnZW50IGZvcm1hdC5cbiAqIEFwcGxpZXMgYmFzZSBtYXJrZG93biBjb252ZXJzaW9ucywgdGhlbiBhZGRzIGEgPGNvZGV4X2FnZW50X3JvbGU+IGhlYWRlclxuICogYW5kIGNsZWFucyB1cCBmcm9udG1hdHRlciAocmVtb3ZlcyB0b29scy9jb2xvciBmaWVsZHMpLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvZGV4QWdlbnQoY29udGVudCkge1xuICBsZXQgY29udmVydGVkID0gY29udmVydENsYXVkZVRvQ29kZXhNYXJrZG93bihjb250ZW50KTtcblxuICBjb25zdCB7IGZyb250bWF0dGVyLCBib2R5IH0gPSBleHRyYWN0RnJvbnRtYXR0ZXJBbmRCb2R5KGNvbnZlcnRlZCk7XG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBjb252ZXJ0ZWQ7XG5cbiAgY29uc3QgbmFtZSA9IGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCAnbmFtZScpIHx8ICd1bmtub3duJztcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2Rlc2NyaXB0aW9uJykgfHwgJyc7XG4gIGNvbnN0IHRvb2xzID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICd0b29scycpIHx8ICcnO1xuXG4gIGNvbnN0IHJvbGVIZWFkZXIgPSBgPGNvZGV4X2FnZW50X3JvbGU+XG5yb2xlOiAke25hbWV9XG50b29sczogJHt0b29sc31cbnB1cnBvc2U6ICR7dG9TaW5nbGVMaW5lKGRlc2NyaXB0aW9uKX1cbjwvY29kZXhfYWdlbnRfcm9sZT5gO1xuXG4gIGNvbnN0IGNsZWFuRnJvbnRtYXR0ZXIgPSBgLS0tXFxubmFtZTogJHt5YW1sUXVvdGUobmFtZSl9XFxuZGVzY3JpcHRpb246ICR7eWFtbFF1b3RlKHRvU2luZ2xlTGluZShkZXNjcmlwdGlvbikpfVxcbi0tLWA7XG5cbiAgcmV0dXJuIGAke2NsZWFuRnJvbnRtYXR0ZXJ9XFxuXFxuJHtyb2xlSGVhZGVyfVxcbiR7Ym9keX1gO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgcGVyLWFnZW50IC50b21sIGNvbmZpZyBmaWxlIGZvciBDb2RleC5cbiAqIFNldHMgc2FuZGJveF9tb2RlIGFuZCBkZXZlbG9wZXJfaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGFnZW50IG1hcmtkb3duIGJvZHkuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQ29kZXhBZ2VudFRvbWwoYWdlbnROYW1lLCBhZ2VudENvbnRlbnQpIHtcbiAgY29uc3Qgc2FuZGJveE1vZGUgPSBDT0RFWF9BR0VOVF9TQU5EQk9YW2FnZW50TmFtZV0gfHwgJ3JlYWQtb25seSc7XG4gIGNvbnN0IHsgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShhZ2VudENvbnRlbnQpO1xuICBjb25zdCBpbnN0cnVjdGlvbnMgPSBib2R5LnRyaW0oKTtcblxuICBjb25zdCBsaW5lcyA9IFtcbiAgICBgc2FuZGJveF9tb2RlID0gXCIke3NhbmRib3hNb2RlfVwiYCxcbiAgICAvLyBBZ2VudCBwcm9tcHRzIGNvbnRhaW4gcmF3IGJhY2tzbGFzaGVzIGluIHJlZ2V4ZXMgYW5kIHNoZWxsIHNuaXBwZXRzLlxuICAgIC8vIFRPTUwgbGl0ZXJhbCBtdWx0aWxpbmUgc3RyaW5ncyBwcmVzZXJ2ZSB0aGVtIHdpdGhvdXQgZXNjYXBlIHBhcnNpbmcuXG4gICAgYGRldmVsb3Blcl9pbnN0cnVjdGlvbnMgPSAnJydgLFxuICAgIGluc3RydWN0aW9ucyxcbiAgICBgJycnYCxcbiAgXTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbic7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIEVaX0FnZW50cyBjb25maWcgYmxvY2sgZm9yIENvZGV4IGNvbmZpZy50b21sLlxuICogQHBhcmFtIHtBcnJheTx7bmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nfT59IGFnZW50c1xuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUNvZGV4Q29uZmlnQmxvY2soYWdlbnRzKSB7XG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIEVaX0NPREVYX01BUktFUixcbiAgICAnJyxcbiAgXTtcblxuICBmb3IgKGNvbnN0IHsgbmFtZSwgZGVzY3JpcHRpb24gfSBvZiBhZ2VudHMpIHtcbiAgICBsaW5lcy5wdXNoKGBbYWdlbnRzLiR7bmFtZX1dYCk7XG4gICAgbGluZXMucHVzaChgZGVzY3JpcHRpb24gPSAke0pTT04uc3RyaW5naWZ5KGRlc2NyaXB0aW9uKX1gKTtcbiAgICBsaW5lcy5wdXNoKGBjb25maWdfZmlsZSA9IFwiYWdlbnRzLyR7bmFtZX0udG9tbFwiYCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogU3RyaXAgRVpfQWdlbnRzIHNlY3Rpb25zIGZyb20gQ29kZXggY29uZmlnLnRvbWwgY29udGVudC5cbiAqIFJldHVybnMgY2xlYW5lZCBjb250ZW50LCBvciBudWxsIGlmIGZpbGUgd291bGQgYmUgZW1wdHkuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwRXpBZ2VudHNGcm9tQ29kZXhDb25maWcoY29udGVudCkge1xuICBjb25zdCBtYXJrZXJJbmRleCA9IGNvbnRlbnQuaW5kZXhPZihFWl9DT0RFWF9NQVJLRVIpO1xuXG4gIGlmIChtYXJrZXJJbmRleCAhPT0gLTEpIHtcbiAgICAvLyBIYXMgRVpfQWdlbnRzIG1hcmtlciBcdTIwMTQgcmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSBtYXJrZXIgdG8gRU9GXG4gICAgbGV0IGJlZm9yZSA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIG1hcmtlckluZGV4KS50cmltRW5kKCk7XG4gICAgLy8gQWxzbyBzdHJpcCBFWi1pbmplY3RlZCBmZWF0dXJlIGtleXMgYWJvdmUgdGhlIG1hcmtlciAoQ2FzZSAzIGluamVjdClcbiAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXm11bHRpX2FnZW50XFxzKj1cXHMqdHJ1ZVxccypcXG4/L20sICcnKTtcbiAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXmRlZmF1bHRfbW9kZV9yZXF1ZXN0X3VzZXJfaW5wdXRcXHMqPVxccyp0cnVlXFxzKlxcbj8vbSwgJycpO1xuICAgIGJlZm9yZSA9IGJlZm9yZS5yZXBsYWNlKC9eXFxbZmVhdHVyZXNcXF1cXHMqXFxuKD89XFxbfCQpL20sICcnKTtcbiAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXFxuezMsfS9nLCAnXFxuXFxuJykudHJpbSgpO1xuICAgIGlmICghYmVmb3JlKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYmVmb3JlICsgJ1xcbic7XG4gIH1cblxuICAvLyBObyBtYXJrZXIgYnV0IG1heSBoYXZlIEVaLWluamVjdGVkIGZlYXR1cmUga2V5c1xuICBsZXQgY2xlYW5lZCA9IGNvbnRlbnQ7XG4gIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoL15tdWx0aV9hZ2VudFxccyo9XFxzKnRydWVcXHMqXFxuPy9tLCAnJyk7XG4gIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoL15kZWZhdWx0X21vZGVfcmVxdWVzdF91c2VyX2lucHV0XFxzKj1cXHMqdHJ1ZVxccypcXG4/L20sICcnKTtcblxuICAvLyBSZW1vdmUgW2FnZW50cy5lei0qXSBzZWN0aW9ucyAoZnJvbSBoZWFkZXIgdG8gbmV4dCBzZWN0aW9uIG9yIEVPRilcbiAgY2xlYW5lZCA9IGNsZWFuZWQucmVwbGFjZSgvXlxcW2FnZW50c1xcLmV6LVteXFxdXStcXF1cXG4oPzooPyFcXFspW15cXG5dKlxcbj8pKi9nbSwgJycpO1xuXG4gIC8vIFJlbW92ZSBbZmVhdHVyZXNdIHNlY3Rpb24gaWYgbm93IGVtcHR5IChvbmx5IGhlYWRlciwgbm8ga2V5cyBiZWZvcmUgbmV4dCBzZWN0aW9uKVxuICBjbGVhbmVkID0gY2xlYW5lZC5yZXBsYWNlKC9eXFxbZmVhdHVyZXNcXF1cXHMqXFxuKD89XFxbfCQpL20sICcnKTtcblxuICAvLyBSZW1vdmUgW2FnZW50c10gc2VjdGlvbiBpZiBub3cgZW1wdHlcbiAgY2xlYW5lZCA9IGNsZWFuZWQucmVwbGFjZSgvXlxcW2FnZW50c1xcXVxccypcXG4oPz1cXFt8JCkvbSwgJycpO1xuXG4gIC8vIENsZWFuIHVwIGV4Y2Vzc2l2ZSBibGFuayBsaW5lc1xuICBjbGVhbmVkID0gY2xlYW5lZC5yZXBsYWNlKC9cXG57Myx9L2csICdcXG5cXG4nKS50cmltKCk7XG5cbiAgaWYgKCFjbGVhbmVkKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGNsZWFuZWQgKyAnXFxuJztcbn1cblxuLyoqXG4gKiBNZXJnZSBFWl9BZ2VudHMgY29uZmlnIGJsb2NrIGludG8gYW4gZXhpc3Rpbmcgb3IgbmV3IGNvbmZpZy50b21sLlxuICogVGhyZWUgY2FzZXM6IG5ldyBmaWxlLCBleGlzdGluZyB3aXRoIEVaX0FnZW50cyBtYXJrZXIsIGV4aXN0aW5nIHdpdGhvdXQgbWFya2VyLlxuICovXG5mdW5jdGlvbiBtZXJnZUNvZGV4Q29uZmlnKGNvbmZpZ1BhdGgsIEVaX0FnZW50c0Jsb2NrKSB7XG4gIC8vIENhc2UgMTogTm8gY29uZmlnLnRvbWwgXHUyMDE0IGNyZWF0ZSBmcmVzaFxuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEVaX0FnZW50c0Jsb2NrICsgJ1xcbicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nID0gZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IG1hcmtlckluZGV4ID0gZXhpc3RpbmcuaW5kZXhPZihFWl9DT0RFWF9NQVJLRVIpO1xuXG4gIC8vIENhc2UgMjogSGFzIEVaX0FnZW50cyBtYXJrZXIgXHUyMDE0IHRydW5jYXRlIGFuZCByZS1hcHBlbmRcbiAgaWYgKG1hcmtlckluZGV4ICE9PSAtMSkge1xuICAgIGxldCBiZWZvcmUgPSBleGlzdGluZy5zdWJzdHJpbmcoMCwgbWFya2VySW5kZXgpLnRyaW1FbmQoKTtcbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICAvLyBTdHJpcCBhbnkgRVotbWFuYWdlZCBzZWN0aW9ucyB0aGF0IGxlYWtlZCBhYm92ZSB0aGUgbWFya2VyIGZyb20gcHJldmlvdXMgaW5zdGFsbHNcbiAgICAgIGJlZm9yZSA9IGJlZm9yZS5yZXBsYWNlKC9eXFxbYWdlbnRzXFwuZXotW15cXF1dK1xcXVxcbig/Oig/IVxcWylbXlxcbl0qXFxuPykqL2dtLCAnJyk7XG4gICAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXlxcW2FnZW50c1xcXVxcbig/Oig/IVxcWylbXlxcbl0qXFxuPykqL20sICcnKTtcbiAgICAgIGJlZm9yZSA9IGJlZm9yZS5yZXBsYWNlKC9cXG57Myx9L2csICdcXG5cXG4nKS50cmltRW5kKCk7XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgYmVmb3JlICsgJ1xcblxcbicgKyBFWl9BZ2VudHNCbG9jayArICdcXG4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBFWl9BZ2VudHNCbG9jayArICdcXG4nKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ2FzZSAzOiBObyBtYXJrZXIgXHUyMDE0IGFwcGVuZCBFWl9BZ2VudHMgYmxvY2tcbiAgbGV0IGNvbnRlbnQgPSBleGlzdGluZztcbiAgY29udGVudCA9IGNvbnRlbnQudHJpbUVuZCgpICsgJ1xcblxcbicgKyBFWl9BZ2VudHNCbG9jayArICdcXG4nO1xuXG4gIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgY29udGVudCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRDb3BpbG90SW5zdHJ1Y3Rpb25zTWFya2VyUGFpcihjb250ZW50OiBzdHJpbmcpOiB7IG9wZW5JbmRleDogbnVtYmVyOyBjbG9zZUluZGV4OiBudW1iZXI7IGNsb3NlTWFya2VyOiBzdHJpbmcgfSB8IG51bGwge1xuICBjb25zdCBtYXJrZXJQYWlyczogW3N0cmluZywgc3RyaW5nXVtdID0gW1xuICAgIFtFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19NQVJLRVIsIEVaX0NPUElMT1RfSU5TVFJVQ1RJT05TX0NMT1NFX01BUktFUl0sXG4gICAgW0xFR0FDWV9FWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19NQVJLRVIsIExFR0FDWV9FWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19DTE9TRV9NQVJLRVJdLFxuICBdO1xuXG4gIGZvciAoY29uc3QgW29wZW5NYXJrZXIsIGNsb3NlTWFya2VyXSBvZiBtYXJrZXJQYWlycykge1xuICAgIGNvbnN0IG9wZW5JbmRleCA9IGNvbnRlbnQuaW5kZXhPZihvcGVuTWFya2VyKTtcbiAgICBjb25zdCBjbG9zZUluZGV4ID0gY29udGVudC5pbmRleE9mKGNsb3NlTWFya2VyKTtcbiAgICBpZiAob3BlbkluZGV4ICE9PSAtMSAmJiBjbG9zZUluZGV4ICE9PSAtMSAmJiBjbG9zZUluZGV4ID49IG9wZW5JbmRleCkge1xuICAgICAgcmV0dXJuIHsgb3BlbkluZGV4LCBjbG9zZUluZGV4LCBjbG9zZU1hcmtlciB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIE1lcmdlIEVaX0FnZW50cyBpbnN0cnVjdGlvbnMgaW50byBjb3BpbG90LWluc3RydWN0aW9ucy5tZC5cbiAqIFRocmVlIGNhc2VzOiBuZXcgZmlsZSwgZXhpc3Rpbmcgd2l0aCBtYXJrZXJzLCBleGlzdGluZyB3aXRob3V0IG1hcmtlcnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggLSBGdWxsIHBhdGggdG8gY29waWxvdC1pbnN0cnVjdGlvbnMubWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBFWl9BZ2VudHNDb250ZW50IC0gVGVtcGxhdGUgY29udGVudCAod2l0aG91dCBtYXJrZXJzKVxuICovXG5mdW5jdGlvbiBtZXJnZUNvcGlsb3RJbnN0cnVjdGlvbnMoZmlsZVBhdGgsIEVaX0FnZW50c0NvbnRlbnQpIHtcbiAgY29uc3QgRVpfQWdlbnRzQmxvY2sgPSBFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19NQVJLRVIgKyAnXFxuJyArXG4gICAgRVpfQWdlbnRzQ29udGVudC50cmltKCkgKyAnXFxuJyArXG4gICAgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfQ0xPU0VfTUFSS0VSO1xuXG4gIC8vIENhc2UgMTogTm8gZmlsZSBcdTIwMTQgY3JlYXRlIGZyZXNoXG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBFWl9BZ2VudHNCbG9jayArICdcXG4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgbWFya2VyTWF0Y2ggPSBmaW5kQ29waWxvdEluc3RydWN0aW9uc01hcmtlclBhaXIoZXhpc3RpbmcpO1xuXG4gIC8vIENhc2UgMjogSGFzIEVaX0FnZW50cyBtYXJrZXJzIFx1MjAxNCByZXBsYWNlIGJldHdlZW4gbWFya2Vyc1xuICBpZiAobWFya2VyTWF0Y2gpIHtcbiAgICBjb25zdCBiZWZvcmUgPSBleGlzdGluZy5zdWJzdHJpbmcoMCwgbWFya2VyTWF0Y2gub3BlbkluZGV4KS50cmltRW5kKCk7XG4gICAgY29uc3QgYWZ0ZXIgPSBleGlzdGluZy5zdWJzdHJpbmcobWFya2VyTWF0Y2guY2xvc2VJbmRleCArIG1hcmtlck1hdGNoLmNsb3NlTWFya2VyLmxlbmd0aCkudHJpbVN0YXJ0KCk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSAnJztcbiAgICBpZiAoYmVmb3JlKSBuZXdDb250ZW50ICs9IGJlZm9yZSArICdcXG5cXG4nO1xuICAgIG5ld0NvbnRlbnQgKz0gRVpfQWdlbnRzQmxvY2s7XG4gICAgaWYgKGFmdGVyKSBuZXdDb250ZW50ICs9ICdcXG5cXG4nICsgYWZ0ZXI7XG4gICAgbmV3Q29udGVudCArPSAnXFxuJztcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBDYXNlIDM6IE5vIG1hcmtlcnMgXHUyMDE0IGFwcGVuZCBhdCBlbmRcbiAgY29uc3QgY29udGVudCA9IGV4aXN0aW5nLnRyaW1FbmQoKSArICdcXG5cXG4nICsgRVpfQWdlbnRzQmxvY2sgKyAnXFxuJztcbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgY29udGVudCk7XG59XG5cbi8qKlxuICogU3RyaXAgRVpfQWdlbnRzIHNlY3Rpb24gZnJvbSBjb3BpbG90LWluc3RydWN0aW9ucy5tZCBjb250ZW50LlxuICogUmV0dXJucyBjbGVhbmVkIGNvbnRlbnQsIG9yIG51bGwgaWYgZmlsZSBzaG91bGQgYmUgZGVsZXRlZCAod2FzIEVaLW9ubHkpLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBGaWxlIGNvbnRlbnRcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH0gLSBDbGVhbmVkIGNvbnRlbnQgb3IgbnVsbCBpZiBlbXB0eVxuICovXG5mdW5jdGlvbiBzdHJpcEV6QWdlbnRzRnJvbUNvcGlsb3RJbnN0cnVjdGlvbnMoY29udGVudCkge1xuICBjb25zdCBtYXJrZXJNYXRjaCA9IGZpbmRDb3BpbG90SW5zdHJ1Y3Rpb25zTWFya2VyUGFpcihjb250ZW50KTtcblxuICBpZiAobWFya2VyTWF0Y2gpIHtcbiAgICBjb25zdCBiZWZvcmUgPSBjb250ZW50LnN1YnN0cmluZygwLCBtYXJrZXJNYXRjaC5vcGVuSW5kZXgpLnRyaW1FbmQoKTtcbiAgICBjb25zdCBhZnRlciA9IGNvbnRlbnQuc3Vic3RyaW5nKG1hcmtlck1hdGNoLmNsb3NlSW5kZXggKyBtYXJrZXJNYXRjaC5jbG9zZU1hcmtlci5sZW5ndGgpLnRyaW1TdGFydCgpO1xuICAgIGNvbnN0IGNsZWFuZWQgPSAoYmVmb3JlICsgKGJlZm9yZSAmJiBhZnRlciA/ICdcXG5cXG4nIDogJycpICsgYWZ0ZXIpLnRyaW0oKTtcbiAgICBpZiAoIWNsZWFuZWQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBjbGVhbmVkICsgJ1xcbic7XG4gIH1cblxuICAvLyBObyBtYXJrZXJzIGZvdW5kIFx1MjAxNCBub3RoaW5nIHRvIHN0cmlwXG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGNvbmZpZy50b21sIGFuZCBwZXItYWdlbnQgLnRvbWwgZmlsZXMgZm9yIENvZGV4LlxuICogUmVhZHMgYWdlbnQgLm1kIGZpbGVzIGZyb20gc291cmNlLCBleHRyYWN0cyBtZXRhZGF0YSwgd3JpdGVzIC50b21sIGNvbmZpZ3MuXG4gKi9cbmZ1bmN0aW9uIGluc3RhbGxDb2RleENvbmZpZyh0YXJnZXREaXI6IHN0cmluZywgYWdlbnRzU3JjOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvbmZpZy50b21sJyk7XG4gIGNvbnN0IGFnZW50c1RvbWxEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnYWdlbnRzJyk7XG4gIGZzLm1rZGlyU3luYyhhZ2VudHNUb21sRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBhZ2VudEVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhhZ2VudHNTcmMpLmZpbHRlcihmID0+IGYuc3RhcnRzV2l0aCgnZXotJykgJiYgZi5lbmRzV2l0aCgnLm1kJykpO1xuICBjb25zdCBhZ2VudHM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0+ID0gW107XG5cbiAgLy8gQ29tcHV0ZSB0aGUgQ29kZXggcGF0aFByZWZpeCBmb3IgcmVwbGFjaW5nIC5jbGF1ZGUgcGF0aHNcbiAgLy8gVXNlIHRpbGRlLWJhc2VkIHBhdGggdG8gYXZvaWQgYmFraW5nIGFic29sdXRlIHBhdGhzIGludG8gdGVtcGxhdGVzXG4gIGNvbnN0IGNvZGV4UGF0aFByZWZpeCA9IGAke3RhcmdldERpci5yZXBsYWNlKC9cXFxcL2csICcvJykucmVwbGFjZShvcy5ob21lZGlyKCkucmVwbGFjZSgvXFxcXC9nLCAnLycpLCAnficpfS9gO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhZ2VudEVudHJpZXMpIHtcbiAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oYWdlbnRzU3JjLCBmaWxlKSwgJ3V0ZjgnKTtcbiAgICAvLyBSZXBsYWNlIC5jbGF1ZGUgcGF0aHMgYmVmb3JlIGdlbmVyYXRpbmcgVE9NTCAoc291cmNlIGZpbGVzIHVzZSB+Ly5jbGF1ZGUgYW5kICRIT01FLy5jbGF1ZGUpXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvflxcL1xcLmNsYXVkZVxcLy9nLCBjb2RleFBhdGhQcmVmaXgpO1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZywgdG9Ib21lUHJlZml4KGNvZGV4UGF0aFByZWZpeCkpO1xuICAgIGNvbnN0IHsgZnJvbnRtYXR0ZXIgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XG4gICAgY29uc3QgbmFtZSA9IGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCAnbmFtZScpIHx8IGZpbGUucmVwbGFjZSgnLm1kJywgJycpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuXG4gICAgYWdlbnRzLnB1c2goeyBuYW1lLCBkZXNjcmlwdGlvbjogdG9TaW5nbGVMaW5lKGRlc2NyaXB0aW9uKSB9KTtcblxuICAgIGNvbnN0IHRvbWxDb250ZW50ID0gZ2VuZXJhdGVDb2RleEFnZW50VG9tbChuYW1lLCBjb250ZW50KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihhZ2VudHNUb21sRGlyLCBgJHtuYW1lfS50b21sYCksIHRvbWxDb250ZW50KTtcbiAgfVxuXG4gIGNvbnN0IEVaX0FnZW50c0Jsb2NrID0gZ2VuZXJhdGVDb2RleENvbmZpZ0Jsb2NrKGFnZW50cyk7XG4gIG1lcmdlQ29kZXhDb25maWcoY29uZmlnUGF0aCwgRVpfQWdlbnRzQmxvY2spO1xuXG4gIHJldHVybiBhZ2VudHMubGVuZ3RoO1xufVxuXG4vKipcbiAqIFN0cmlwIEhUTUwgPHN1Yj4gdGFncyBmb3IgR2VtaW5pIENMSSBvdXRwdXRcbiAqIFRlcm1pbmFscyBkb24ndCBzdXBwb3J0IHN1YnNjcmlwdCBcdTIwMTQgR2VtaW5pIHJlbmRlcnMgdGhlc2UgYXMgcmF3IEhUTUwuXG4gKiBDb252ZXJ0cyA8c3ViPnRleHQ8L3N1Yj4gdG8gaXRhbGljICoodGV4dCkqIGZvciByZWFkYWJsZSB0ZXJtaW5hbCBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwU3ViVGFncyhjb250ZW50KSB7XG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UoLzxzdWI+KC4qPyk8XFwvc3ViPi9nLCAnKigkMSkqJyk7XG59XG5cbi8qKlxuICogQ29udmVydCBDbGF1ZGUgQ29kZSBhZ2VudCBmcm9udG1hdHRlciB0byBHZW1pbmkgQ0xJIGZvcm1hdFxuICogR2VtaW5pIGFnZW50cyB1c2UgLm1kIGZpbGVzIHdpdGggWUFNTCBmcm9udG1hdHRlciwgc2FtZSBhcyBDbGF1ZGUsXG4gKiBidXQgd2l0aCBkaWZmZXJlbnQgZmllbGQgbmFtZXMgYW5kIGZvcm1hdHM6XG4gKiAtIHRvb2xzOiBtdXN0IGJlIGEgWUFNTCBhcnJheSAobm90IGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcpXG4gKiAtIHRvb2wgbmFtZXM6IG11c3QgdXNlIEdlbWluaSBidWlsdC1pbiBuYW1lcyAocmVhZF9maWxlLCBub3QgUmVhZClcbiAqIC0gY29sb3I6IG11c3QgYmUgcmVtb3ZlZCAoY2F1c2VzIHZhbGlkYXRpb24gZXJyb3IpXG4gKiAtIHNraWxsczogbXVzdCBiZSByZW1vdmVkIChjYXVzZXMgdmFsaWRhdGlvbiBlcnJvcilcbiAqIC0gbWNwX18qIHRvb2xzOiBtdXN0IGJlIGV4Y2x1ZGVkIChhdXRvLWRpc2NvdmVyZWQgYXQgcnVudGltZSlcbiAqL1xuZnVuY3Rpb24gY29udmVydENsYXVkZVRvR2VtaW5pQWdlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50LnN0YXJ0c1dpdGgoJy0tLScpKSByZXR1cm4gY29udGVudDtcblxuICBjb25zdCBlbmRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZignLS0tJywgMyk7XG4gIGlmIChlbmRJbmRleCA9PT0gLTEpIHJldHVybiBjb250ZW50O1xuXG4gIGNvbnN0IGZyb250bWF0dGVyID0gY29udGVudC5zdWJzdHJpbmcoMywgZW5kSW5kZXgpLnRyaW0oKTtcbiAgY29uc3QgYm9keSA9IGNvbnRlbnQuc3Vic3RyaW5nKGVuZEluZGV4ICsgMyk7XG5cbiAgY29uc3QgbGluZXMgPSBmcm9udG1hdHRlci5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IG5ld0xpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaW5BbGxvd2VkVG9vbHMgPSBmYWxzZTtcbiAgbGV0IGluU2tpcHBlZEFycmF5RmllbGQgPSBmYWxzZTtcbiAgY29uc3QgdG9vbHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuXG4gICAgaWYgKGluU2tpcHBlZEFycmF5RmllbGQpIHtcbiAgICAgIGlmICghdHJpbW1lZCB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoJy0gJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpblNraXBwZWRBcnJheUZpZWxkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBhbGxvd2VkLXRvb2xzIFlBTUwgYXJyYXkgdG8gdG9vbHMgbGlzdFxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ2FsbG93ZWQtdG9vbHM6JykpIHtcbiAgICAgIGluQWxsb3dlZFRvb2xzID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbmxpbmUgdG9vbHM6IGZpZWxkIChjb21tYS1zZXBhcmF0ZWQgc3RyaW5nKVxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ3Rvb2xzOicpKSB7XG4gICAgICBjb25zdCB0b29sc1ZhbHVlID0gdHJpbW1lZC5zdWJzdHJpbmcoNikudHJpbSgpO1xuICAgICAgaWYgKHRvb2xzVmFsdWUpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gdG9vbHNWYWx1ZS5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpKS5maWx0ZXIodCA9PiB0KTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHBhcnNlZCkge1xuICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IGNvbnZlcnRHZW1pbmlUb29sTmFtZSh0KTtcbiAgICAgICAgICBpZiAobWFwcGVkKSB0b29scy5wdXNoKG1hcHBlZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRvb2xzOiB3aXRoIG5vIHZhbHVlIG1lYW5zIFlBTUwgYXJyYXkgZm9sbG93c1xuICAgICAgICBpbkFsbG93ZWRUb29scyA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBTdHJpcCBjb2xvciBmaWVsZCAobm90IHN1cHBvcnRlZCBieSBHZW1pbmkgQ0xJLCBjYXVzZXMgdmFsaWRhdGlvbiBlcnJvcilcbiAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCdjb2xvcjonKSkgY29udGludWU7XG5cbiAgICAvLyBTdHJpcCBza2lsbHMgZmllbGQgKG5vdCBzdXBwb3J0ZWQgYnkgR2VtaW5pIENMSSwgY2F1c2VzIHZhbGlkYXRpb24gZXJyb3IpXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnc2tpbGxzOicpKSB7XG4gICAgICBpblNraXBwZWRBcnJheUZpZWxkID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3QgYWxsb3dlZC10b29scy90b29scyBhcnJheSBpdGVtc1xuICAgIGlmIChpbkFsbG93ZWRUb29scykge1xuICAgICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnLSAnKSkge1xuICAgICAgICBjb25zdCBtYXBwZWQgPSBjb252ZXJ0R2VtaW5pVG9vbE5hbWUodHJpbW1lZC5zdWJzdHJpbmcoMikudHJpbSgpKTtcbiAgICAgICAgaWYgKG1hcHBlZCkgdG9vbHMucHVzaChtYXBwZWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAodHJpbW1lZCAmJiAhdHJpbW1lZC5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgaW5BbGxvd2VkVG9vbHMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWluQWxsb3dlZFRvb2xzKSB7XG4gICAgICBuZXdMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB0b29scyBhcyBZQU1MIGFycmF5IChHZW1pbmkgcmVxdWlyZXMgYXJyYXkgZm9ybWF0KVxuICBpZiAodG9vbHMubGVuZ3RoID4gMCkge1xuICAgIG5ld0xpbmVzLnB1c2goJ3Rvb2xzOicpO1xuICAgIGZvciAoY29uc3QgdG9vbCBvZiB0b29scykge1xuICAgICAgbmV3TGluZXMucHVzaChgICAtICR7dG9vbH1gKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBuZXdGcm9udG1hdHRlciA9IG5ld0xpbmVzLmpvaW4oJ1xcbicpLnRyaW0oKTtcblxuICAvLyBFc2NhcGUgJHtWQVJ9IHBhdHRlcm5zIGluIGFnZW50IGJvZHkgZm9yIEdlbWluaSBDTEkgY29tcGF0aWJpbGl0eS5cbiAgLy8gR2VtaW5pJ3MgdGVtcGxhdGVTdHJpbmcoKSB0cmVhdHMgYWxsICR7d29yZH0gcGF0dGVybnMgYXMgdGVtcGxhdGUgdmFyaWFibGVzXG4gIC8vIGFuZCB0aHJvd3MgXCJUZW1wbGF0ZSB2YWxpZGF0aW9uIGZhaWxlZDogTWlzc2luZyByZXF1aXJlZCBpbnB1dCBwYXJhbWV0ZXJzXCJcbiAgLy8gd2hlbiB0aGV5IGNhbid0IGJlIHJlc29sdmVkLiBFWl9BZ2VudHMgYWdlbnRzIHVzZSAke1BIQVNFfSwgJHtQTEFOfSwgZXRjLiBhc1xuICAvLyBzaGVsbCB2YXJpYWJsZXMgaW4gYmFzaCBjb2RlIGJsb2NrcyBcdTIwMTQgY29udmVydCB0byAkVkFSIChubyBicmFjZXMpIHdoaWNoXG4gIC8vIGlzIGVxdWl2YWxlbnQgYmFzaCBhbmQgaW52aXNpYmxlIHRvIEdlbWluaSdzIC9cXCRcXHsoXFx3KylcXH0vZyByZWdleC5cbiAgY29uc3QgZXNjYXBlZEJvZHkgPSBib2R5LnJlcGxhY2UoL1xcJFxceyhcXHcrKVxcfS9nLCAnJCQkMScpO1xuXG4gIHJldHVybiBgLS0tXFxuJHtuZXdGcm9udG1hdHRlcn1cXG4tLS0ke3N0cmlwU3ViVGFncyhlc2NhcGVkQm9keSl9YDtcbn1cblxuZnVuY3Rpb24gY29udmVydENsYXVkZVRvT3BlbmNvZGVGcm9udG1hdHRlcihjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZXBsYWNlIHRvb2wgbmFtZSByZWZlcmVuY2VzIGluIGNvbnRlbnQgKGFwcGxpZXMgdG8gYWxsIGZpbGVzKVxuICBsZXQgY29udmVydGVkQ29udGVudCA9IGNvbnRlbnQ7XG4gIGNvbnZlcnRlZENvbnRlbnQgPSBjb252ZXJ0ZWRDb250ZW50LnJlcGxhY2UoL1xcYkFza1VzZXJRdWVzdGlvblxcYi9nLCAncXVlc3Rpb24nKTtcbiAgY29udmVydGVkQ29udGVudCA9IGNvbnZlcnRlZENvbnRlbnQucmVwbGFjZSgvXFxiU2xhc2hDb21tYW5kXFxiL2csICdza2lsbCcpO1xuICBjb252ZXJ0ZWRDb250ZW50ID0gY29udmVydGVkQ29udGVudC5yZXBsYWNlKC9cXGJUb2RvV3JpdGVcXGIvZywgJ3RvZG93cml0ZScpO1xuICAvLyBSZXBsYWNlIC9lejpjb21tYW5kIHdpdGggL2V6LWNvbW1hbmQgZm9yIG9wZW5jb2RlIChmbGF0IGNvbW1hbmQgc3RydWN0dXJlKVxuICBjb252ZXJ0ZWRDb250ZW50ID0gY29udmVydGVkQ29udGVudC5yZXBsYWNlKC9cXC9lejovZywgJy9lei0nKTtcbiAgLy8gUmVwbGFjZSB+Ly5jbGF1ZGUgYW5kICRIT01FLy5jbGF1ZGUgd2l0aCBPcGVuQ29kZSdzIGNvbmZpZyBsb2NhdGlvblxuICBjb252ZXJ0ZWRDb250ZW50ID0gY29udmVydGVkQ29udGVudC5yZXBsYWNlKC9+XFwvXFwuY2xhdWRlXFxiL2csICd+Ly5jb25maWcvb3BlbmNvZGUnKTtcbiAgY29udmVydGVkQ29udGVudCA9IGNvbnZlcnRlZENvbnRlbnQucmVwbGFjZSgvXFwkSE9NRVxcL1xcLmNsYXVkZVxcYi9nLCAnJEhPTUUvLmNvbmZpZy9vcGVuY29kZScpO1xuICAvLyBSZXBsYWNlIGdlbmVyYWwtcHVycG9zZSBzdWJhZ2VudCB0eXBlIHdpdGggT3BlbkNvZGUncyBlcXVpdmFsZW50IFwiZ2VuZXJhbFwiXG4gIGNvbnZlcnRlZENvbnRlbnQgPSBjb252ZXJ0ZWRDb250ZW50LnJlcGxhY2UoL3N1YmFnZW50X3R5cGU9XCJnZW5lcmFsLXB1cnBvc2VcIi9nLCAnc3ViYWdlbnRfdHlwZT1cImdlbmVyYWxcIicpO1xuXG4gIC8vIENoZWNrIGlmIGNvbnRlbnQgaGFzIGZyb250bWF0dGVyXG4gIGlmICghY29udmVydGVkQ29udGVudC5zdGFydHNXaXRoKCctLS0nKSkge1xuICAgIHJldHVybiBjb252ZXJ0ZWRDb250ZW50O1xuICB9XG5cbiAgLy8gRmluZCB0aGUgZW5kIG9mIGZyb250bWF0dGVyXG4gIGNvbnN0IGVuZEluZGV4ID0gY29udmVydGVkQ29udGVudC5pbmRleE9mKCctLS0nLCAzKTtcbiAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBjb252ZXJ0ZWRDb250ZW50O1xuICB9XG5cbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBjb252ZXJ0ZWRDb250ZW50LnN1YnN0cmluZygzLCBlbmRJbmRleCkudHJpbSgpO1xuICBjb25zdCBib2R5ID0gY29udmVydGVkQ29udGVudC5zdWJzdHJpbmcoZW5kSW5kZXggKyAzKTtcblxuICAvLyBQYXJzZSBmcm9udG1hdHRlciBsaW5lIGJ5IGxpbmUgKHNpbXBsZSBZQU1MIHBhcnNpbmcpXG4gIGNvbnN0IGxpbmVzID0gZnJvbnRtYXR0ZXIuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBuZXdMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGluQWxsb3dlZFRvb2xzID0gZmFsc2U7XG4gIGNvbnN0IGFsbG93ZWRUb29sczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG5cbiAgICAvLyBEZXRlY3Qgc3RhcnQgb2YgYWxsb3dlZC10b29scyBhcnJheVxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ2FsbG93ZWQtdG9vbHM6JykpIHtcbiAgICAgIGluQWxsb3dlZFRvb2xzID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERldGVjdCBpbmxpbmUgdG9vbHM6IGZpZWxkIChjb21tYS1zZXBhcmF0ZWQgc3RyaW5nKVxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ3Rvb2xzOicpKSB7XG4gICAgICBjb25zdCB0b29sc1ZhbHVlID0gdHJpbW1lZC5zdWJzdHJpbmcoNikudHJpbSgpO1xuICAgICAgaWYgKHRvb2xzVmFsdWUpIHtcbiAgICAgICAgLy8gUGFyc2UgY29tbWEtc2VwYXJhdGVkIHRvb2xzXG4gICAgICAgIGNvbnN0IHRvb2xzID0gdG9vbHNWYWx1ZS5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpKS5maWx0ZXIodCA9PiB0KTtcbiAgICAgICAgYWxsb3dlZFRvb2xzLnB1c2goLi4udG9vbHMpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIG5hbWU6IGZpZWxkIC0gb3BlbmNvZGUgdXNlcyBmaWxlbmFtZSBmb3IgY29tbWFuZCBuYW1lXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnbmFtZTonKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBjb2xvciBuYW1lcyB0byBoZXggZm9yIG9wZW5jb2RlXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnY29sb3I6JykpIHtcbiAgICAgIGNvbnN0IGNvbG9yVmFsdWUgPSB0cmltbWVkLnN1YnN0cmluZyg2KS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGhleENvbG9yID0gY29sb3JOYW1lVG9IZXhbY29sb3JWYWx1ZV07XG4gICAgICBpZiAoaGV4Q29sb3IpIHtcbiAgICAgICAgbmV3TGluZXMucHVzaChgY29sb3I6IFwiJHtoZXhDb2xvcn1cImApO1xuICAgICAgfSBlbHNlIGlmIChjb2xvclZhbHVlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICAvLyBWYWxpZGF0ZSBoZXggY29sb3IgZm9ybWF0ICgjUkdCIG9yICNSUkdHQkIpXG4gICAgICAgIGlmICgvXiNbMC05YS1mXXszfSR8XiNbMC05YS1mXXs2fSQvaS50ZXN0KGNvbG9yVmFsdWUpKSB7XG4gICAgICAgICAgLy8gQWxyZWFkeSBoZXggYW5kIHZhbGlkLCBrZWVwIGFzIGlzXG4gICAgICAgICAgbmV3TGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTa2lwIGludmFsaWQgaGV4IGNvbG9yc1xuICAgICAgfVxuICAgICAgLy8gU2tpcCB1bmtub3duIGNvbG9yIG5hbWVzXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBDb2xsZWN0IGFsbG93ZWQtdG9vbHMgaXRlbXNcbiAgICBpZiAoaW5BbGxvd2VkVG9vbHMpIHtcbiAgICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJy0gJykpIHtcbiAgICAgICAgYWxsb3dlZFRvb2xzLnB1c2godHJpbW1lZC5zdWJzdHJpbmcoMikudHJpbSgpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWQgJiYgIXRyaW1tZWQuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIC8vIEVuZCBvZiBhcnJheSwgbmV3IGZpZWxkIHN0YXJ0ZWRcbiAgICAgICAgaW5BbGxvd2VkVG9vbHMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBLZWVwIG90aGVyIGZpZWxkcyAoaW5jbHVkaW5nIG5hbWU6IHdoaWNoIG9wZW5jb2RlIGlnbm9yZXMpXG4gICAgaWYgKCFpbkFsbG93ZWRUb29scykge1xuICAgICAgbmV3TGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgdG9vbHMgb2JqZWN0IGlmIHdlIGhhZCBhbGxvd2VkLXRvb2xzIG9yIHRvb2xzXG4gIGlmIChhbGxvd2VkVG9vbHMubGVuZ3RoID4gMCkge1xuICAgIG5ld0xpbmVzLnB1c2goJ3Rvb2xzOicpO1xuICAgIGZvciAoY29uc3QgdG9vbCBvZiBhbGxvd2VkVG9vbHMpIHtcbiAgICAgIG5ld0xpbmVzLnB1c2goYCAgJHtjb252ZXJ0VG9vbE5hbWUodG9vbCl9OiB0cnVlYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVidWlsZCBmcm9udG1hdHRlciAoYm9keSBhbHJlYWR5IGhhcyB0b29sIG5hbWVzIGNvbnZlcnRlZClcbiAgY29uc3QgbmV3RnJvbnRtYXR0ZXIgPSBuZXdMaW5lcy5qb2luKCdcXG4nKS50cmltKCk7XG4gIHJldHVybiBgLS0tXFxuJHtuZXdGcm9udG1hdHRlcn1cXG4tLS0ke2JvZHl9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IENsYXVkZSBDb2RlIG1hcmtkb3duIGNvbW1hbmQgdG8gR2VtaW5pIFRPTUwgZm9ybWF0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIE1hcmtkb3duIGZpbGUgY29udGVudCB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVE9NTCBjb250ZW50XG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0dlbWluaVRvbWwoY29udGVudCkge1xuICAvLyBDaGVjayBpZiBjb250ZW50IGhhcyBmcm9udG1hdHRlclxuICBpZiAoIWNvbnRlbnQuc3RhcnRzV2l0aCgnLS0tJykpIHtcbiAgICByZXR1cm4gYHByb21wdCA9ICR7SlNPTi5zdHJpbmdpZnkoY29udGVudCl9XFxuYDtcbiAgfVxuXG4gIGNvbnN0IGVuZEluZGV4ID0gY29udGVudC5pbmRleE9mKCctLS0nLCAzKTtcbiAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBgcHJvbXB0ID0gJHtKU09OLnN0cmluZ2lmeShjb250ZW50KX1cXG5gO1xuICB9XG5cbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBjb250ZW50LnN1YnN0cmluZygzLCBlbmRJbmRleCkudHJpbSgpO1xuICBjb25zdCBib2R5ID0gY29udGVudC5zdWJzdHJpbmcoZW5kSW5kZXggKyAzKS50cmltKCk7XG4gIFxuICAvLyBFeHRyYWN0IGRlc2NyaXB0aW9uIGZyb20gZnJvbnRtYXR0ZXJcbiAgbGV0IGRlc2NyaXB0aW9uID0gJyc7XG4gIGNvbnN0IGxpbmVzID0gZnJvbnRtYXR0ZXIuc3BsaXQoJ1xcbicpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnZGVzY3JpcHRpb246JykpIHtcbiAgICAgIGRlc2NyaXB0aW9uID0gdHJpbW1lZC5zdWJzdHJpbmcoMTIpLnRyaW0oKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbnN0cnVjdCBUT01MXG4gIGxldCB0b21sID0gJyc7XG4gIGlmIChkZXNjcmlwdGlvbikge1xuICAgIHRvbWwgKz0gYGRlc2NyaXB0aW9uID0gJHtKU09OLnN0cmluZ2lmeShkZXNjcmlwdGlvbil9XFxuYDtcbiAgfVxuICBcbiAgdG9tbCArPSBgcHJvbXB0ID0gJHtKU09OLnN0cmluZ2lmeShib2R5KX1cXG5gO1xuICBcbiAgcmV0dXJuIHRvbWw7XG59XG5cbi8qKlxuICogQ29weSBjb21tYW5kcyB0byBhIGZsYXQgc3RydWN0dXJlIGZvciBPcGVuQ29kZVxuICogT3BlbkNvZGUgZXhwZWN0czogY29tbWFuZC9lei1oZWxwLm1kIChpbnZva2VkIGFzIC9lei1oZWxwKVxuICogU291cmNlIHN0cnVjdHVyZTogY29tbWFuZHMvZXovaGVscC5tZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNEaXIgLSBTb3VyY2UgZGlyZWN0b3J5IChlLmcuLCBjb21tYW5kcy9lei8pXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdERpciAtIERlc3RpbmF0aW9uIGRpcmVjdG9yeSAoZS5nLiwgY29tbWFuZC8pXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IC0gUHJlZml4IGZvciBmaWxlbmFtZXMgKGUuZy4sICdleicpXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFByZWZpeCAtIFBhdGggcHJlZml4IGZvciBmaWxlIHJlZmVyZW5jZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gVGFyZ2V0IHJ1bnRpbWUgKCdjbGF1ZGUnIG9yICdvcGVuY29kZScpXG4gKi9cbmZ1bmN0aW9uIGNvcHlGbGF0dGVuZWRDb21tYW5kcyhzcmNEaXIsIGRlc3REaXIsIHByZWZpeCwgcGF0aFByZWZpeCwgcnVudGltZSkge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc3JjRGlyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJlbW92ZSBvbGQgZXotKi5tZCBmaWxlcyBiZWZvcmUgY29weWluZyBuZXcgb25lc1xuICBpZiAoZnMuZXhpc3RzU3luYyhkZXN0RGlyKSkge1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmcy5yZWFkZGlyU3luYyhkZXN0RGlyKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aChgJHtwcmVmaXh9LWApICYmIGZpbGUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKGRlc3REaXIsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZnMubWtkaXJTeW5jKGRlc3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHNyY0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oc3JjRGlyLCBlbnRyeS5uYW1lKTtcblxuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAvLyBSZWN1cnNlIGludG8gc3ViZGlyZWN0b3JpZXMsIGFkZGluZyB0byBwcmVmaXhcbiAgICAgIC8vIGUuZy4sIGNvbW1hbmRzL2V6L2RlYnVnL3N0YXJ0Lm1kIC0+IGNvbW1hbmQvZXotZGVidWctc3RhcnQubWRcbiAgICAgIGNvcHlGbGF0dGVuZWRDb21tYW5kcyhzcmNQYXRoLCBkZXN0RGlyLCBgJHtwcmVmaXh9LSR7ZW50cnkubmFtZX1gLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAvLyBGbGF0dGVuOiBoZWxwLm1kIC0+IGV6LWhlbHAubWRcbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZW50cnkubmFtZS5yZXBsYWNlKCcubWQnLCAnJyk7XG4gICAgICBjb25zdCBkZXN0TmFtZSA9IGAke3ByZWZpeH0tJHtiYXNlTmFtZX0ubWRgO1xuICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdERpciwgZGVzdE5hbWUpO1xuXG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcmNQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlUmVnZXggPSAvflxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4ID0gL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBvcGVuY29kZURpclJlZ2V4ID0gL35cXC9cXC5vcGVuY29kZVxcLy9nO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShnbG9iYWxDbGF1ZGVSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZUhvbWVSZWdleCwgdG9Ib21lUHJlZml4KHBhdGhQcmVmaXgpKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UobG9jYWxDbGF1ZGVSZWdleCwgYC4vJHtnZXREaXJOYW1lKHJ1bnRpbWUpfS9gKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2Uob3BlbmNvZGVEaXJSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcbiAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9PcGVuY29kZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDb3B5IEVaIEFnZW50cyBza2lsbHMgdG8gZ2xvYmFsIHNraWxscyBkaXJlY3RvcnlcbiAqIFNraWxscyBhcmUgaW5zdGFsbGVkIHRvICRIT01FLy5za2lsbHMvZXotYWdlbnRzLyBmb3IgdW5pdmVyc2FsIGFjY2Vzc1xuICogQHBhcmFtIHtzdHJpbmd9IHNyY0RpciAtIFNvdXJjZSBkaXJlY3RvcnkgKGV6LWFnZW50cyByb290KVxuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXG4gKiBAcGFyYW0ge3N0cmluZ30gcnVudGltZSAtIFJ1bnRpbWUgaWRlbnRpZmllclxuICovXG5mdW5jdGlvbiBjb3B5U2tpbGxzKHNyY0Rpcjogc3RyaW5nLCBpc0dsb2JhbDogYm9vbGVhbiwgcnVudGltZTogc3RyaW5nKTogdm9pZCB7XG4gIC8vIE9ubHkgaW5zdGFsbCBza2lsbHMgZm9yIGdsb2JhbCBpbnN0YWxsc1xuICBpZiAoIWlzR2xvYmFsKSB7XG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gU2tpcHBpbmcgc2tpbGxzIChsb2NhbCBpbnN0YWxsKWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGhvbWVEaXIgPSBvcy5ob21lZGlyKCkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICBjb25zdCBza2lsbHNEZXN0RGlyID0gcGF0aC5wb3NpeC5qb2luKGhvbWVEaXIsICcuc2tpbGxzJywgJ2V6LWFnZW50cycpO1xuICBjb25zdCBzcmNTa2lsbHNEaXIgPSBwYXRoLmpvaW4oc3JjRGlyLCAnc2tpbGxzJyk7XG5cbiAgY29uc29sZS5sb2coYCAgSW5zdGFsbGluZyBza2lsbHMgdG8gJHtjeWFufSR7c2tpbGxzRGVzdERpcn0ke3Jlc2V0fS4uLmApO1xuXG4gIC8vIENyZWF0ZSBza2lsbHMgZGlyZWN0b3J5XG4gIGZzLm1rZGlyU3luYyhza2lsbHNEZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBDb3B5IGFsbCBza2lsbHMgZnJvbSBzb3VyY2VcbiAgaWYgKGZzLmV4aXN0c1N5bmMoc3JjU2tpbGxzRGlyKSkge1xuICAgIGZzLmNwU3luYyhzcmNTa2lsbHNEaXIsIHNraWxsc0Rlc3REaXIsIHtcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIGZvcmNlOiB0cnVlXG4gICAgfSk7XG5cbiAgICAvLyBDb3VudCBpbnN0YWxsZWQgc2tpbGxzXG4gICAgbGV0IHNraWxsQ291bnQgPSAwO1xuICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbJ3N0YWNrJywgJ2FyY2hpdGVjdHVyZScsICdkb21haW4nLCAnb3BlcmF0aW9uYWwnLCAnZ292ZXJuYW5jZScsICd0ZXN0aW5nJywgJ29ic2VydmFiaWxpdHknLCAnZGV2b3BzJywgJ3NlY3VyaXR5JywgJ2FpJywgJ2RhdGEnLCAncHJvZHVjdCddO1xuXG4gICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBjYXRlZ29yaWVzKSB7XG4gICAgICBjb25zdCBjYXRlZ29yeVBhdGggPSBwYXRoLmpvaW4oc2tpbGxzRGVzdERpciwgY2F0ZWdvcnkpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY2F0ZWdvcnlQYXRoKSkge1xuICAgICAgICBjb25zdCBza2lsbHMgPSBmcy5yZWFkZGlyU3luYyhjYXRlZ29yeVBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgICAgICAgIC5maWx0ZXIoZCA9PiBkLmlzRGlyZWN0b3J5KCkpLmxlbmd0aDtcbiAgICAgICAgc2tpbGxDb3VudCArPSBza2lsbHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgJHtza2lsbENvdW50fSBza2lsbHMgdG8gJHtza2lsbHNEZXN0RGlyfWApO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKGAgICR7eWVsbG93fVx1MjZBMCR7cmVzZXR9IFNraWxscyBkaXJlY3Rvcnkgbm90IGZvdW5kOiAke3NyY1NraWxsc0Rpcn1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsaXN0Q29kZXhTa2lsbE5hbWVzKHNraWxsc0RpciwgcHJlZml4ID0gJ2V6LScpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNraWxsc0RpcikpIHJldHVybiBbXTtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHNraWxsc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSAmJiBlbnRyeS5uYW1lLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAuZmlsdGVyKGVudHJ5ID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHNraWxsc0RpciwgZW50cnkubmFtZSwgJ1NLSUxMLm1kJykpKVxuICAgIC5tYXAoZW50cnkgPT4gZW50cnkubmFtZSlcbiAgICAuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb3B5Q29tbWFuZHNBc0NvZGV4U2tpbGxzKHNyY0Rpciwgc2tpbGxzRGlyLCBwcmVmaXgsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNyY0RpcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmcy5ta2RpclN5bmMoc2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBSZW1vdmUgcHJldmlvdXMgRVogQ29kZXggc2tpbGxzIHRvIGF2b2lkIHN0YWxlIGNvbW1hbmQgc2tpbGxzLlxuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRkaXJTeW5jKHNraWxsc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGV4aXN0aW5nKSB7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnkubmFtZS5zdGFydHNXaXRoKGAke3ByZWZpeH0tYCkpIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oc2tpbGxzRGlyLCBlbnRyeS5uYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjdXJzZShjdXJyZW50U3JjRGlyLCBjdXJyZW50UHJlZml4KSB7XG4gICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGN1cnJlbnRTcmNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihjdXJyZW50U3JjRGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHJlY3Vyc2Uoc3JjUGF0aCwgYCR7Y3VycmVudFByZWZpeH0tJHtlbnRyeS5uYW1lfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFzZU5hbWUgPSBlbnRyeS5uYW1lLnJlcGxhY2UoJy5tZCcsICcnKTtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGAke2N1cnJlbnRQcmVmaXh9LSR7YmFzZU5hbWV9YDtcbiAgICAgIGNvbnN0IHNraWxsRGlyID0gcGF0aC5qb2luKHNraWxsc0Rpciwgc2tpbGxOYW1lKTtcbiAgICAgIGZzLm1rZGlyU3luYyhza2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVSZWdleCA9IC9+XFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVIb21lUmVnZXggPSAvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgbG9jYWxDbGF1ZGVSZWdleCA9IC9cXC5cXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IGNvZGV4RGlyUmVnZXggPSAvflxcL1xcLmNvZGV4XFwvL2c7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZVJlZ2V4LCBwYXRoUHJlZml4KTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4LCB0b0hvbWVQcmVmaXgocGF0aFByZWZpeCkpO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShsb2NhbENsYXVkZVJlZ2V4LCBgLi8ke2dldERpck5hbWUocnVudGltZSl9L2ApO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShjb2RleERpclJlZ2V4LCBwYXRoUHJlZml4KTtcbiAgICAgIGNvbnRlbnQgPSBwcm9jZXNzQXR0cmlidXRpb24oY29udGVudCwgZ2V0Q29tbWl0QXR0cmlidXRpb24ocnVudGltZSkpO1xuICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db2RleFNraWxsKGNvbnRlbnQsIHNraWxsTmFtZSk7XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHNraWxsRGlyLCAnU0tJTEwubWQnKSwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgcmVjdXJzZShzcmNEaXIsIHByZWZpeCk7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgY29tbWFuZHMgYXMgQ29waWxvdCBza2lsbHMgXHUyMDE0IG9uZSBmb2xkZXIgcGVyIHNraWxsIHdpdGggU0tJTEwubWQuXG4gKiBBcHBsaWVzIENPTlYtMDEgKHN0cnVjdHVyZSksIENPTlYtMDIgKGFsbG93ZWQtdG9vbHMpLCBDT05WLTA2IChwYXRocyksIENPTlYtMDcgKGNvbW1hbmQgbmFtZXMpLlxuICovXG5mdW5jdGlvbiBjb3B5Q29tbWFuZHNBc0NvcGlsb3RTa2lsbHMoc3JjRGlyLCBza2lsbHNEaXIsIHByZWZpeCwgaXNHbG9iYWwgPSBmYWxzZSkge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc3JjRGlyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZzLm1rZGlyU3luYyhza2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIC8vIFJlbW92ZSBwcmV2aW91cyBFWiBDb3BpbG90IHNraWxsc1xuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRkaXJTeW5jKHNraWxsc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGV4aXN0aW5nKSB7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnkubmFtZS5zdGFydHNXaXRoKGAke3ByZWZpeH0tYCkpIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oc2tpbGxzRGlyLCBlbnRyeS5uYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjdXJzZShjdXJyZW50U3JjRGlyLCBjdXJyZW50UHJlZml4KSB7XG4gICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGN1cnJlbnRTcmNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihjdXJyZW50U3JjRGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHJlY3Vyc2Uoc3JjUGF0aCwgYCR7Y3VycmVudFByZWZpeH0tJHtlbnRyeS5uYW1lfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFzZU5hbWUgPSBlbnRyeS5uYW1lLnJlcGxhY2UoJy5tZCcsICcnKTtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGAke2N1cnJlbnRQcmVmaXh9LSR7YmFzZU5hbWV9YDtcbiAgICAgIGNvbnN0IHNraWxsRGlyID0gcGF0aC5qb2luKHNraWxsc0Rpciwgc2tpbGxOYW1lKTtcbiAgICAgIGZzLm1rZGlyU3luYyhza2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb250ZW50ID0gY29udmVydENsYXVkZUNvbW1hbmRUb0NvcGlsb3RTa2lsbChjb250ZW50LCBza2lsbE5hbWUsIGlzR2xvYmFsKTtcbiAgICAgIGNvbnRlbnQgPSBwcm9jZXNzQXR0cmlidXRpb24oY29udGVudCwgZ2V0Q29tbWl0QXR0cmlidXRpb24oJ2NvcGlsb3QnKSk7XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHNraWxsRGlyLCAnU0tJTEwubWQnKSwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgcmVjdXJzZShzcmNEaXIsIHByZWZpeCk7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgY29tbWFuZHMgYXMgS2ltaSBDb2RlIHNraWxscyBcdTIwMTQgb25lIGZvbGRlciBwZXIgc2tpbGwgd2l0aCBTS0lMTC5tZC5cbiAqL1xuZnVuY3Rpb24gY29weUNvbW1hbmRzQXNLaW1pU2tpbGxzKHNyY0Rpciwgc2tpbGxzRGlyLCBwcmVmaXgsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNyY0RpcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmcy5ta2RpclN5bmMoc2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBSZW1vdmUgcHJldmlvdXMgRVogS2ltaSBza2lsbHNcbiAgY29uc3QgZXhpc3RpbmcgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBleGlzdGluZykge1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChgJHtwcmVmaXh9LWApKSB7XG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHNraWxsc0RpciwgZW50cnkubmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2UoY3VycmVudFNyY0RpciwgY3VycmVudFByZWZpeCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhjdXJyZW50U3JjRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oY3VycmVudFNyY0RpciwgZW50cnkubmFtZSk7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICByZWN1cnNlKHNyY1BhdGgsIGAke2N1cnJlbnRQcmVmaXh9LSR7ZW50cnkubmFtZX1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZW50cnkubmFtZS5yZXBsYWNlKCcubWQnLCAnJyk7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBgJHtjdXJyZW50UHJlZml4fS0ke2Jhc2VOYW1lfWA7XG4gICAgICBjb25zdCBza2lsbERpciA9IHBhdGguam9pbihza2lsbHNEaXIsIHNraWxsTmFtZSk7XG4gICAgICBmcy5ta2RpclN5bmMoc2tpbGxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcmNQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlUmVnZXggPSAvflxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4ID0gL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBraW1pRGlyUmVnZXggPSAvflxcL1xcLmtpbWlcXC8vZztcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShnbG9iYWxDbGF1ZGVIb21lUmVnZXgsIHRvSG9tZVByZWZpeChwYXRoUHJlZml4KSk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGxvY2FsQ2xhdWRlUmVnZXgsIGAuLyR7Z2V0RGlyTmFtZShydW50aW1lKX0vYCk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGtpbWlEaXJSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcbiAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9LaW1pU2tpbGwoY29udGVudCwgc2tpbGxOYW1lKTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHNraWxsRGlyLCAnU0tJTEwubWQnKSwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgcmVjdXJzZShzcmNEaXIsIHByZWZpeCk7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgY29tbWFuZHMgYXMgUXdlbiBDb2RlIGNvbW1hbmRzIFx1MjAxNCBmbGF0IHN0cnVjdHVyZSBpbiBjb21tYW5kcy9lei8uXG4gKiBRd2VuIENvZGUgdXNlcyB+Ly5xd2VuL2NvbW1hbmRzL2V6LyoubWQgKGxpa2UgQ2xhdWRlIENvZGUgfi8uY2xhdWRlL2NvbW1hbmRzL2V6LylcbiAqL1xuZnVuY3Rpb24gY29weUNvbW1hbmRzQXNRd2VuQ29tbWFuZHMoc3JjRGlyLCBjb21tYW5kc0RpciwgcHJlZml4LCBwYXRoUHJlZml4LCBydW50aW1lKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhzcmNEaXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZnMubWtkaXJTeW5jKGNvbW1hbmRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBSZW1vdmUgcHJldmlvdXMgRVogUXdlbiBjb21tYW5kc1xuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRkaXJTeW5jKGNvbW1hbmRzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZXhpc3RpbmcpIHtcbiAgICBpZiAoZW50cnkuaXNGaWxlKCkgJiYgZW50cnkubmFtZS5zdGFydHNXaXRoKGAke3ByZWZpeH0tYCkgJiYgZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oY29tbWFuZHNEaXIsIGVudHJ5Lm5hbWUpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWN1cnNlKGN1cnJlbnRTcmNEaXIsIGN1cnJlbnRQcmVmaXgpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoY3VycmVudFNyY0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKGN1cnJlbnRTcmNEaXIsIGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgcmVjdXJzZShzcmNQYXRoLCBgJHtjdXJyZW50UHJlZml4fS0ke2VudHJ5Lm5hbWV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlTmFtZSA9IGVudHJ5Lm5hbWUucmVwbGFjZSgnLm1kJywgJycpO1xuICAgICAgY29uc3QgY29tbWFuZE5hbWUgPSBgJHtjdXJyZW50UHJlZml4fS0ke2Jhc2VOYW1lfWA7XG4gICAgICBjb25zdCBjb21tYW5kRmlsZSA9IHBhdGguam9pbihjb21tYW5kc0RpciwgYCR7Y29tbWFuZE5hbWV9Lm1kYCk7XG5cbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVSZWdleCA9IC9+XFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVIb21lUmVnZXggPSAvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgbG9jYWxDbGF1ZGVSZWdleCA9IC9cXC5cXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IHF3ZW5EaXJSZWdleCA9IC9+XFwvXFwucXdlblxcLy9nO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShnbG9iYWxDbGF1ZGVSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZUhvbWVSZWdleCwgdG9Ib21lUHJlZml4KHBhdGhQcmVmaXgpKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UobG9jYWxDbGF1ZGVSZWdleCwgYC4vJHtnZXREaXJOYW1lKHJ1bnRpbWUpfS9gKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UocXdlbkRpclJlZ2V4LCBwYXRoUHJlZml4KTtcbiAgICAgIGNvbnRlbnQgPSBwcm9jZXNzQXR0cmlidXRpb24oY29udGVudCwgZ2V0Q29tbWl0QXR0cmlidXRpb24ocnVudGltZSkpO1xuICAgICAgXG4gICAgICAvLyBRd2VuIENvZGUgdXNlcyBzaW1wbGUgbWFya2Rvd24gY29tbWFuZHMgKG5vIFNLSUxMLm1kIHdyYXBwZXIpXG4gICAgICAvLyBKdXN0IGNvcHkgdGhlIGNvbnRlbnQgYXMtaXMgd2l0aCBwYXRoIHJlcGxhY2VtZW50c1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhjb21tYW5kRmlsZSwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgcmVjdXJzZShzcmNEaXIsIHByZWZpeCk7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgY29tbWFuZHMgYXMgUXdlbiBDb2RlIHNraWxscyBcdTIwMTQgb25lIGZvbGRlciBwZXIgc2tpbGwgd2l0aCBTS0lMTC5tZC5cbiAqIFF3ZW4gQ29kZSB1c2VzIHRoZSBzYW1lIHNraWxscy8gc3RydWN0dXJlIGFzIENvZGV4IGJ1dCB3aXRoIHNpbXBsZXIgZm9ybWF0IChubyBhZGFwdGVycyBuZWVkZWQpLlxuICogQGRlcHJlY2F0ZWQgVXNlIGNvcHlDb21tYW5kc0FzUXdlbkNvbW1hbmRzIGluc3RlYWQgLSBRd2VuIENvZGUgdXNlcyBjb21tYW5kcy9lei8gbm90IHNraWxscy9cbiAqL1xuZnVuY3Rpb24gY29weUNvbW1hbmRzQXNRd2VuU2tpbGxzKHNyY0Rpciwgc2tpbGxzRGlyLCBwcmVmaXgsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNyY0RpcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmcy5ta2RpclN5bmMoc2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBSZW1vdmUgcHJldmlvdXMgRVogUXdlbiBza2lsbHNcbiAgY29uc3QgZXhpc3RpbmcgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBleGlzdGluZykge1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChgJHtwcmVmaXh9LWApKSB7XG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHNraWxsc0RpciwgZW50cnkubmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2UoY3VycmVudFNyY0RpciwgY3VycmVudFByZWZpeCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhjdXJyZW50U3JjRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oY3VycmVudFNyY0RpciwgZW50cnkubmFtZSk7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICByZWN1cnNlKHNyY1BhdGgsIGAke2N1cnJlbnRQcmVmaXh9LSR7ZW50cnkubmFtZX1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZW50cnkubmFtZS5yZXBsYWNlKCcubWQnLCAnJyk7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBgJHtjdXJyZW50UHJlZml4fS0ke2Jhc2VOYW1lfWA7XG4gICAgICBjb25zdCBza2lsbERpciA9IHBhdGguam9pbihza2lsbHNEaXIsIHNraWxsTmFtZSk7XG4gICAgICBmcy5ta2RpclN5bmMoc2tpbGxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcmNQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlUmVnZXggPSAvflxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4ID0gL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBxd2VuRGlyUmVnZXggPSAvflxcL1xcLnF3ZW5cXC8vZztcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShnbG9iYWxDbGF1ZGVIb21lUmVnZXgsIHRvSG9tZVByZWZpeChwYXRoUHJlZml4KSk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGxvY2FsQ2xhdWRlUmVnZXgsIGAuLyR7Z2V0RGlyTmFtZShydW50aW1lKX0vYCk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKHF3ZW5EaXJSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcbiAgICAgIC8vIFF3ZW4gQ29kZSB1c2VzIHNpbXBsZSBtYXJrZG93biBza2lsbHMgd2l0aG91dCBmcm9udG1hdHRlciBhZGFwdGVyc1xuICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb1F3ZW5Ta2lsbChjb250ZW50LCBza2lsbE5hbWUpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oc2tpbGxEaXIsICdTS0lMTC5tZCcpLCBjb250ZW50KTtcbiAgICB9XG4gIH1cblxuICByZWN1cnNlKHNyY0RpciwgcHJlZml4KTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb3B5IGRpcmVjdG9yeSwgcmVwbGFjaW5nIHBhdGhzIGluIC5tZCBmaWxlc1xuICogRGVsZXRlcyBleGlzdGluZyBkZXN0RGlyIGZpcnN0IHRvIHJlbW92ZSBvcnBoYW5lZCBmaWxlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjRGlyIC0gU291cmNlIGRpcmVjdG9yeVxuICogQHBhcmFtIHtzdHJpbmd9IGRlc3REaXIgLSBEZXN0aW5hdGlvbiBkaXJlY3RvcnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoUHJlZml4IC0gUGF0aCBwcmVmaXggZm9yIGZpbGUgcmVmZXJlbmNlc1xuICogQHBhcmFtIHtzdHJpbmd9IHJ1bnRpbWUgLSBUYXJnZXQgcnVudGltZSAoJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnKVxuICovXG5mdW5jdGlvbiBjb3B5V2l0aFBhdGhSZXBsYWNlbWVudChzcmNEaXIsIGRlc3REaXIsIHBhdGhQcmVmaXgsIHJ1bnRpbWUsIGlzQ29tbWFuZCA9IGZhbHNlLCBpc0dsb2JhbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xuICBjb25zdCBpc0NvZGV4ID0gcnVudGltZSA9PT0gJ2NvZGV4JztcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xuICBjb25zdCBkaXJOYW1lID0gZ2V0RGlyTmFtZShydW50aW1lKTtcblxuICAvLyBDbGVhbiBpbnN0YWxsOiByZW1vdmUgZXhpc3RpbmcgZGVzdGluYXRpb24gdG8gcHJldmVudCBvcnBoYW5lZCBmaWxlc1xuICBpZiAoZnMuZXhpc3RzU3luYyhkZXN0RGlyKSkge1xuICAgIGZzLnJtU3luYyhkZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuICBmcy5ta2RpclN5bmMoZGVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHNyY0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oc3JjRGlyLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihkZXN0RGlyLCBlbnRyeS5uYW1lKTtcblxuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb3B5V2l0aFBhdGhSZXBsYWNlbWVudChzcmNQYXRoLCBkZXN0UGF0aCwgcGF0aFByZWZpeCwgcnVudGltZSwgaXNDb21tYW5kLCBpc0dsb2JhbCk7XG4gICAgfSBlbHNlIGlmIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgLy8gUmVwbGFjZSB+Ly5jbGF1ZGUvIGFuZCAkSE9NRS8uY2xhdWRlLyBhbmQgLi8uY2xhdWRlLyB3aXRoIHJ1bnRpbWUtYXBwcm9wcmlhdGUgcGF0aHNcbiAgICAgIC8vIFNraXAgZ2VuZXJpYyByZXBsYWNlbWVudCBmb3IgQ29waWxvdCBcdTIwMTQgY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQgaGFuZGxlcyBhbGwgcGF0aHNcbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoIWlzQ29waWxvdCkge1xuICAgICAgICBjb25zdCBnbG9iYWxDbGF1ZGVSZWdleCA9IC9+XFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnN0IGdsb2JhbENsYXVkZUhvbWVSZWdleCA9IC9cXCRIT01FXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZUhvbWVSZWdleCwgdG9Ib21lUHJlZml4KHBhdGhQcmVmaXgpKTtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShsb2NhbENsYXVkZVJlZ2V4LCBgLi8ke2Rpck5hbWV9L2ApO1xuICAgICAgfVxuICAgICAgY29udGVudCA9IHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50LCBnZXRDb21taXRBdHRyaWJ1dGlvbihydW50aW1lKSk7XG5cbiAgICAgIC8vIENvbnZlcnQgZnJvbnRtYXR0ZXIgZm9yIG9wZW5jb2RlIGNvbXBhdGliaWxpdHlcbiAgICAgIGlmIChpc09wZW5jb2RlKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9PcGVuY29kZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcbiAgICAgIH0gZWxzZSBpZiAocnVudGltZSA9PT0gJ2dlbWluaScpIHtcbiAgICAgICAgaWYgKGlzQ29tbWFuZCkge1xuICAgICAgICAgIC8vIENvbnZlcnQgdG8gVE9NTCBmb3IgR2VtaW5pIChzdHJpcCA8c3ViPiB0YWdzIFx1MjAxNCB0ZXJtaW5hbHMgY2FuJ3QgcmVuZGVyIHN1YnNjcmlwdClcbiAgICAgICAgICBjb250ZW50ID0gc3RyaXBTdWJUYWdzKGNvbnRlbnQpO1xuICAgICAgICAgIGNvbnN0IHRvbWxDb250ZW50ID0gY29udmVydENsYXVkZVRvR2VtaW5pVG9tbChjb250ZW50KTtcbiAgICAgICAgICAvLyBSZXBsYWNlIGV4dGVuc2lvbiB3aXRoIC50b21sXG4gICAgICAgICAgY29uc3QgdG9tbFBhdGggPSBkZXN0UGF0aC5yZXBsYWNlKC9cXC5tZCQvLCAnLnRvbWwnKTtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRvbWxQYXRoLCB0b21sQ29udGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb2RleCkge1xuICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29kZXhNYXJrZG93bihjb250ZW50KTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICB9IGVsc2UgaWYgKGlzQ29waWxvdCkge1xuICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQoY29udGVudCwgaXNHbG9iYWwpO1xuICAgICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQ29waWxvdCAmJiAoZW50cnkubmFtZS5lbmRzV2l0aCgnLmNqcycpIHx8IGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5qcycpKSkge1xuICAgICAgLy8gQ29waWxvdDogYWxzbyB0cmFuc2Zvcm0gLmNqcy8uanMgZmlsZXMgZm9yIENPTlYtMDYgYW5kIENPTlYtMDdcbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQoY29udGVudCwgaXNHbG9iYWwpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmNQYXRoLCBkZXN0UGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2xlYW4gdXAgb3JwaGFuZWQgZmlsZXMgZnJvbSBwcmV2aW91cyB2ZXJzaW9uc1xuICovXG5mdW5jdGlvbiBjbGVhbnVwT3JwaGFuZWRGaWxlcyhjb25maWdEaXIpIHtcbiAgY29uc3Qgb3JwaGFuZWRGaWxlcyA9IFtcbiAgICAnaG9va3MvZXotbm90aWZ5LnNoJywgIC8vIFJlbW92ZWQgaW4gdjEuNi54XG4gICAgJ2hvb2tzL3N0YXR1c2xpbmUuanMnLCAgLy8gUmVuYW1lZCB0byBlei1zdGF0dXNsaW5lLmpzIGluIHYxLjkuMFxuICBdO1xuXG4gIGZvciAoY29uc3QgcmVsUGF0aCBvZiBvcnBoYW5lZEZpbGVzKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCByZWxQYXRoKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhmdWxsUGF0aCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmMoZnVsbFBhdGgpO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIG9ycGhhbmVkICR7cmVsUGF0aH1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDbGVhbiB1cCBvcnBoYW5lZCBob29rIHJlZ2lzdHJhdGlvbnMgZnJvbSBzZXR0aW5ncy5qc29uXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBPcnBoYW5lZEhvb2tzKHNldHRpbmdzKSB7XG4gIGNvbnN0IG9ycGhhbmVkSG9va1BhdHRlcm5zID0gW1xuICAgICdlei1ub3RpZnkuc2gnLCAgLy8gUmVtb3ZlZCBpbiB2MS42LnhcbiAgICAnaG9va3Mvc3RhdHVzbGluZS5qcycsICAvLyBSZW5hbWVkIHRvIGV6LXN0YXR1c2xpbmUuanMgaW4gdjEuOS4wXG4gICAgJ2V6LWludGVsLWluZGV4LmpzJywgIC8vIFJlbW92ZWQgaW4gdjEuOS4yXG4gICAgJ2V6LWludGVsLXNlc3Npb24uanMnLCAgLy8gUmVtb3ZlZCBpbiB2MS45LjJcbiAgICAnZXotaW50ZWwtcHJ1bmUuanMnLCAgLy8gUmVtb3ZlZCBpbiB2MS45LjJcbiAgXTtcblxuICBsZXQgY2xlYW5lZEhvb2tzID0gZmFsc2U7XG5cbiAgLy8gQ2hlY2sgYWxsIGhvb2sgZXZlbnQgdHlwZXMgKFN0b3AsIFNlc3Npb25TdGFydCwgZXRjLilcbiAgaWYgKHNldHRpbmdzLmhvb2tzKSB7XG4gICAgZm9yIChjb25zdCBldmVudFR5cGUgb2YgT2JqZWN0LmtleXMoc2V0dGluZ3MuaG9va3MpKSB7XG4gICAgICBjb25zdCBob29rRW50cmllcyA9IHNldHRpbmdzLmhvb2tzW2V2ZW50VHlwZV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShob29rRW50cmllcykpIHtcbiAgICAgICAgLy8gRmlsdGVyIG91dCBlbnRyaWVzIHRoYXQgY29udGFpbiBvcnBoYW5lZCBob29rc1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IGhvb2tFbnRyaWVzLmZpbHRlcihlbnRyeSA9PiB7XG4gICAgICAgICAgaWYgKGVudHJ5Lmhvb2tzICYmIEFycmF5LmlzQXJyYXkoZW50cnkuaG9va3MpKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBhbnkgaG9vayBpbiB0aGlzIGVudHJ5IG1hdGNoZXMgb3JwaGFuZWQgcGF0dGVybnNcbiAgICAgICAgICAgIGNvbnN0IGhhc09ycGhhbmVkID0gZW50cnkuaG9va3Muc29tZShoID0+XG4gICAgICAgICAgICAgIGguY29tbWFuZCAmJiBvcnBoYW5lZEhvb2tQYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gaC5jb21tYW5kLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChoYXNPcnBoYW5lZCkge1xuICAgICAgICAgICAgICBjbGVhbmVkSG9va3MgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBSZW1vdmUgdGhpcyBlbnRyeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIEtlZXAgdGhpcyBlbnRyeVxuICAgICAgICB9KTtcbiAgICAgICAgc2V0dGluZ3MuaG9va3NbZXZlbnRUeXBlXSA9IGZpbHRlcmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjbGVhbmVkSG9va3MpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgb3JwaGFuZWQgaG9vayByZWdpc3RyYXRpb25zYCk7XG4gIH1cblxuICAvLyBGaXggIzMzMDogVXBkYXRlIHN0YXR1c0xpbmUgaWYgaXQgcG9pbnRzIHRvIG9sZCBzdGF0dXNsaW5lLmpzIHBhdGhcbiAgLy8gT25seSBtYXRjaCB0aGUgc3BlY2lmaWMgb2xkIHBhdGggcGF0dGVybiAoaG9va3Mvc3RhdHVzbGluZS5qcyksXG4gIC8vIG5vdCB0aGlyZC1wYXJ0eSBzdGF0dXNsaW5lIHNjcmlwdHMgdGhhdCBoYXBwZW4gdG8gY29udGFpbiAnc3RhdHVzbGluZS5qcydcbiAgaWYgKHNldHRpbmdzLnN0YXR1c0xpbmUgJiYgc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kICYmXG4gICAgICAvaG9va3NbXFwvXFxcXF1zdGF0dXNsaW5lXFwuanMvLnRlc3Qoc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kKSkge1xuICAgIHNldHRpbmdzLnN0YXR1c0xpbmUuY29tbWFuZCA9IHNldHRpbmdzLnN0YXR1c0xpbmUuY29tbWFuZC5yZXBsYWNlKFxuICAgICAgL2hvb2tzKFtcXC9cXFxcXSlzdGF0dXNsaW5lXFwuanMvLFxuICAgICAgJ2hvb2tzJDFlei1zdGF0dXNsaW5lLmpzJ1xuICAgICk7XG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBVcGRhdGVkIHN0YXR1c2xpbmUgcGF0aCAoaG9va3Mvc3RhdHVzbGluZS5qcyBcdTIxOTIgaG9va3MvZXotc3RhdHVzbGluZS5qcylgKTtcbiAgfVxuXG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuLyoqXG4gKiBVbmluc3RhbGwgRVpfQWdlbnRzIGZyb20gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZm9yIGEgc3BlY2lmaWMgcnVudGltZVxuICogUmVtb3ZlcyBvbmx5IEVaLXNwZWNpZmljIGZpbGVzL2RpcmVjdG9yaWVzLCBwcmVzZXJ2ZXMgdXNlciBjb250ZW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzR2xvYmFsIC0gV2hldGhlciB0byB1bmluc3RhbGwgZnJvbSBnbG9iYWwgb3IgbG9jYWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gVGFyZ2V0IHJ1bnRpbWUgKCdjbGF1ZGUnLCAnb3BlbmNvZGUnLCAnZ2VtaW5pJywgJ2NvZGV4JywgJ2NvcGlsb3QnKVxuICovXG5mdW5jdGlvbiB1bmluc3RhbGwoaXNHbG9iYWwsIHJ1bnRpbWUgPSAnY2xhdWRlJykge1xuICBjb25zdCBpc09wZW5jb2RlID0gcnVudGltZSA9PT0gJ29wZW5jb2RlJztcbiAgY29uc3QgaXNDb2RleCA9IHJ1bnRpbWUgPT09ICdjb2RleCc7XG4gIGNvbnN0IGlzQ29waWxvdCA9IHJ1bnRpbWUgPT09ICdjb3BpbG90JztcbiAgY29uc3QgaXNRd2VuID0gcnVudGltZSA9PT0gJ3F3ZW4nO1xuICBjb25zdCBpc0tpbWkgPSBydW50aW1lID09PSAna2ltaSc7XG4gIGNvbnN0IGRpck5hbWUgPSBnZXREaXJOYW1lKHJ1bnRpbWUpO1xuXG4gIC8vIEdldCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBiYXNlZCBvbiBydW50aW1lIGFuZCBpbnN0YWxsIHR5cGVcbiAgY29uc3QgdGFyZ2V0RGlyID0gaXNHbG9iYWxcbiAgICA/IGdldEdsb2JhbERpcihydW50aW1lLCBleHBsaWNpdENvbmZpZ0RpcilcbiAgICA6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBkaXJOYW1lKTtcblxuICBjb25zdCBsb2NhdGlvbkxhYmVsID0gaXNHbG9iYWxcbiAgICA/IHRhcmdldERpci5yZXBsYWNlKG9zLmhvbWVkaXIoKSwgJ34nKVxuICAgIDogdGFyZ2V0RGlyLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJy4nKTtcblxuICBsZXQgcnVudGltZUxhYmVsID0gJ0NsYXVkZSBDb2RlJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdvcGVuY29kZScpIHJ1bnRpbWVMYWJlbCA9ICdPcGVuQ29kZSc7XG4gIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykgcnVudGltZUxhYmVsID0gJ0dlbWluaSc7XG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSBydW50aW1lTGFiZWwgPSAnQ29kZXgnO1xuICBpZiAocnVudGltZSA9PT0gJ2NvcGlsb3QnKSBydW50aW1lTGFiZWwgPSAnQ29waWxvdCc7XG4gIGlmIChydW50aW1lID09PSAncXdlbicpIHJ1bnRpbWVMYWJlbCA9ICdRd2VuIENvZGUnO1xuXG4gIGNvbnNvbGUubG9nKGAgIFVuaW5zdGFsbGluZyBFWl9BZ2VudHMgZnJvbSAke2N5YW59JHtydW50aW1lTGFiZWx9JHtyZXNldH0gYXQgJHtjeWFufSR7bG9jYXRpb25MYWJlbH0ke3Jlc2V0fVxcbmApO1xuXG4gIC8vIENoZWNrIGlmIHRhcmdldCBkaXJlY3RvcnkgZXhpc3RzXG4gIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXREaXIpKSB7XG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0OiAke2xvY2F0aW9uTGFiZWx9YCk7XG4gICAgY29uc29sZS5sb2coYCAgTm90aGluZyB0byB1bmluc3RhbGwuXFxuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHJlbW92ZWRDb3VudCA9IDA7XG5cbiAgLy8gMS4gUmVtb3ZlIEVaIGNvbW1hbmRzL3NraWxsc1xuICBpZiAoaXNPcGVuY29kZSkge1xuICAgIC8vIE9wZW5Db2RlOiByZW1vdmUgY29tbWFuZC9lei0qLm1kIGZpbGVzXG4gICAgY29uc3QgY29tbWFuZERpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29tbWFuZERpcikpIHtcbiAgICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoY29tbWFuZERpcik7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihjb21tYW5kRGlyLCBmaWxlKSk7XG4gICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBFWl9BZ2VudHMgY29tbWFuZHMgZnJvbSBjb21tYW5kL2ApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0NvZGV4IHx8IGlzUXdlbiB8fCBpc0tpbWkpIHtcbiAgICAvLyBDb2RleC9Rd2VuL0tpbWk6IHJlbW92ZSBza2lsbHMvZXotKi9TS0lMTC5tZCBza2lsbCBkaXJlY3Rvcmllc1xuICAgIGNvbnN0IHNraWxsc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdza2lsbHMnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhza2lsbHNEaXIpKSB7XG4gICAgICBsZXQgc2tpbGxDb3VudCA9IDA7XG4gICAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoc2tpbGxzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnkubmFtZS5zdGFydHNXaXRoKCdlei0nKSkge1xuICAgICAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oc2tpbGxzRGlyLCBlbnRyeS5uYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgc2tpbGxDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc2tpbGxDb3VudCA+IDApIHtcbiAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgIGxldCBydW50aW1lTGFiZWwgPSAnQ29kZXgnO1xuICAgICAgICBpZiAoaXNRd2VuKSBydW50aW1lTGFiZWwgPSAnUXdlbiBDb2RlJztcbiAgICAgICAgaWYgKGlzS2ltaSkgcnVudGltZUxhYmVsID0gJ0tpbWkgQ29kZSc7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCAke3NraWxsQ291bnR9ICR7cnVudGltZUxhYmVsfSBza2lsbHNgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNDb2RleCkge1xuICAgICAgLy8gQ29kZXg6IHJlbW92ZSBFWiBhZ2VudCAudG9tbCBjb25maWcgZmlsZXNcbiAgICAgIGNvbnN0IGNvZGV4QWdlbnRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2FnZW50cycpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY29kZXhBZ2VudHNEaXIpKSB7XG4gICAgICAgIGNvbnN0IHRvbWxGaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGNvZGV4QWdlbnRzRGlyKTtcbiAgICAgICAgbGV0IHRvbWxDb3VudCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiB0b21sRmlsZXMpIHtcbiAgICAgICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCdlei0nKSAmJiBmaWxlLmVuZHNXaXRoKCcudG9tbCcpKSB7XG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihjb2RleEFnZW50c0RpciwgZmlsZSkpO1xuICAgICAgICAgICAgdG9tbENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0b21sQ291bnQgPiAwKSB7XG4gICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkICR7dG9tbENvdW50fSBhZ2VudCAudG9tbCBjb25maWdzYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ29kZXg6IGNsZWFuIEVaIHNlY3Rpb25zIGZyb20gY29uZmlnLnRvbWxcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnY29uZmlnLnRvbWwnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgY29uc3QgY2xlYW5lZCA9IHN0cmlwRXpBZ2VudHNGcm9tQ29kZXhDb25maWcoY29udGVudCk7XG4gICAgICAgIGlmIChjbGVhbmVkID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gRmlsZSBpcyBlbXB0eSBhZnRlciBzdHJpcHBpbmcgXHUyMDE0IGRlbGV0ZSBpdFxuICAgICAgICAgIGZzLnVubGlua1N5bmMoY29uZmlnUGF0aCk7XG4gICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIGNvbmZpZy50b21sICh3YXMgRVotb25seSlgKTtcbiAgICAgICAgfSBlbHNlIGlmIChjbGVhbmVkICE9PSBjb250ZW50KSB7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBjbGVhbmVkKTtcbiAgICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENsZWFuZWQgRVpfQWdlbnRzIHNlY3Rpb25zIGZyb20gY29uZmlnLnRvbWxgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc0NvcGlsb3QpIHtcbiAgICAvLyBDb3BpbG90OiByZW1vdmUgc2tpbGxzL2V6LSovIGRpcmVjdG9yaWVzIChzYW1lIGxheW91dCBhcyBDb2RleCBza2lsbHMpXG4gICAgY29uc3Qgc2tpbGxzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NraWxscycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHNraWxsc0RpcikpIHtcbiAgICAgIGxldCBza2lsbENvdW50ID0gMDtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSAmJiBlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJ2V6LScpKSB7XG4gICAgICAgICAgZnMucm1TeW5jKHBhdGguam9pbihza2lsbHNEaXIsIGVudHJ5Lm5hbWUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBza2lsbENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChza2lsbENvdW50ID4gMCkge1xuICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkICR7c2tpbGxDb3VudH0gQ29waWxvdCBza2lsbHNgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb3BpbG90OiBjbGVhbiBFWiBzZWN0aW9uIGZyb20gY29waWxvdC1pbnN0cnVjdGlvbnMubWRcbiAgICBjb25zdCBpbnN0cnVjdGlvbnNQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoaW5zdHJ1Y3Rpb25zUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoaW5zdHJ1Y3Rpb25zUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGNsZWFuZWQgPSBzdHJpcEV6QWdlbnRzRnJvbUNvcGlsb3RJbnN0cnVjdGlvbnMoY29udGVudCk7XG4gICAgICBpZiAoY2xlYW5lZCA9PT0gbnVsbCkge1xuICAgICAgICBmcy51bmxpbmtTeW5jKGluc3RydWN0aW9uc1BhdGgpO1xuICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIGNvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kICh3YXMgRVotb25seSlgKTtcbiAgICAgIH0gZWxzZSBpZiAoY2xlYW5lZCAhPT0gY29udGVudCkge1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGluc3RydWN0aW9uc1BhdGgsIGNsZWFuZWQpO1xuICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBDbGVhbmVkIEVaX0FnZW50cyBzZWN0aW9uIGZyb20gY29waWxvdC1pbnN0cnVjdGlvbnMubWRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZXpDb21tYW5kc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kcycsICdleicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGV6Q29tbWFuZHNEaXIpKSB7XG4gICAgICBmcy5ybVN5bmMoZXpDb21tYW5kc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBjb21tYW5kcy9lei9gKTtcbiAgICB9XG4gIH1cblxuICAvLyAyLiBSZW1vdmUgZXotYWdlbnRzIGRpcmVjdG9yeVxuICBjb25zdCBlekRpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdlei1hZ2VudHMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZXpEaXIpKSB7XG4gICAgZnMucm1TeW5jKGV6RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVkQ291bnQrKztcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgZXotYWdlbnRzL2ApO1xuICB9XG5cbiAgLy8gMy4gUmVtb3ZlIEVaX0FnZW50cyBhZ2VudHMgKGV6LSoubWQgZmlsZXMgb25seSlcbiAgY29uc3QgYWdlbnRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2FnZW50cycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhhZ2VudHNEaXIpKSB7XG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhhZ2VudHNEaXIpO1xuICAgIGxldCBhZ2VudENvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ2V6LScpICYmIGZpbGUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKGFnZW50c0RpciwgZmlsZSkpO1xuICAgICAgICBhZ2VudENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhZ2VudENvdW50ID4gMCkge1xuICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgJHthZ2VudENvdW50fSBFWl9BZ2VudHMgYWdlbnRzYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gNC4gUmVtb3ZlIEVaIGhvb2tzXG4gIGNvbnN0IGhvb2tzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2hvb2tzJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGhvb2tzRGlyKSkge1xuICAgIGNvbnN0IGV6SG9va3MgPSBbJ2V6LXN0YXR1c2xpbmUuanMnLCAnZXotY2hlY2stdXBkYXRlLmpzJywgJ2V6LWNoZWNrLXVwZGF0ZS5zaCcsICdlei1jb250ZXh0LW1vbml0b3IuanMnXTtcbiAgICBsZXQgaG9va0NvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGhvb2sgb2YgZXpIb29rcykge1xuICAgICAgY29uc3QgaG9va1BhdGggPSBwYXRoLmpvaW4oaG9va3NEaXIsIGhvb2spO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoaG9va1BhdGgpKSB7XG4gICAgICAgIGZzLnVubGlua1N5bmMoaG9va1BhdGgpO1xuICAgICAgICBob29rQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhvb2tDb3VudCA+IDApIHtcbiAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkICR7aG9va0NvdW50fSBFWiBob29rc2ApO1xuICAgIH1cbiAgfVxuXG4gIC8vIDUuIFJlbW92ZSBFWiBwYWNrYWdlLmpzb24gKENvbW1vbkpTIG1vZGUgbWFya2VyKVxuICBjb25zdCBwa2dKc29uUGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGtnSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGtnSnNvblBhdGgsICd1dGY4JykudHJpbSgpO1xuICAgICAgLy8gT25seSByZW1vdmUgaWYgaXQncyBvdXIgbWluaW1hbCBDb21tb25KUyBtYXJrZXJcbiAgICAgIGlmIChjb250ZW50ID09PSAne1widHlwZVwiOlwiY29tbW9uanNcIn0nKSB7XG4gICAgICAgIGZzLnVubGlua1N5bmMocGtnSnNvblBhdGgpO1xuICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIEVaIHBhY2thZ2UuanNvbmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElnbm9yZSByZWFkIGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8vIDYuIENsZWFuIHVwIHNldHRpbmdzLmpzb24gKHJlbW92ZSBFWiBob29rcyBhbmQgc3RhdHVzbGluZSlcbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NldHRpbmdzLmpzb24nKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoc2V0dGluZ3NQYXRoKSkge1xuICAgIGxldCBzZXR0aW5ncyA9IHJlYWRTZXR0aW5ncyhzZXR0aW5nc1BhdGgpO1xuICAgIGxldCBzZXR0aW5nc01vZGlmaWVkID0gZmFsc2U7XG5cbiAgICAvLyBSZW1vdmUgRVogc3RhdHVzbGluZSBpZiBpdCByZWZlcmVuY2VzIG91ciBob29rXG4gICAgaWYgKHNldHRpbmdzLnN0YXR1c0xpbmUgJiYgc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kICYmXG4gICAgICAgIHNldHRpbmdzLnN0YXR1c0xpbmUuY29tbWFuZC5pbmNsdWRlcygnZXotc3RhdHVzbGluZScpKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3Muc3RhdHVzTGluZTtcbiAgICAgIHNldHRpbmdzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIEVaIHN0YXR1c2xpbmUgZnJvbSBzZXR0aW5nc2ApO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBFWiBob29rcyBmcm9tIFNlc3Npb25TdGFydFxuICAgIGlmIChzZXR0aW5ncy5ob29rcyAmJiBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5sZW5ndGg7XG4gICAgICBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQgPSBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQuZmlsdGVyKGVudHJ5ID0+IHtcbiAgICAgICAgaWYgKGVudHJ5Lmhvb2tzICYmIEFycmF5LmlzQXJyYXkoZW50cnkuaG9va3MpKSB7XG4gICAgICAgICAgLy8gRmlsdGVyIG91dCBFWiBob29rc1xuICAgICAgICAgIGNvbnN0IGhhc0V6SG9vayA9IGVudHJ5Lmhvb2tzLnNvbWUoaCA9PlxuICAgICAgICAgICAgaC5jb21tYW5kICYmIChoLmNvbW1hbmQuaW5jbHVkZXMoJ2V6LWNoZWNrLXVwZGF0ZScpIHx8IGguY29tbWFuZC5pbmNsdWRlcygnZXotc3RhdHVzbGluZScpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuICFoYXNFekhvb2s7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcbiAgICAgIGlmIChzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQubGVuZ3RoIDwgYmVmb3JlKSB7XG4gICAgICAgIHNldHRpbmdzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgRVogaG9va3MgZnJvbSBzZXR0aW5nc2ApO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYW4gdXAgZW1wdHkgYXJyYXlcbiAgICAgIGlmIChzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIEVaIGhvb2tzIGZyb20gUG9zdFRvb2xVc2UgYW5kIEFmdGVyVG9vbCAoR2VtaW5pIHVzZXMgQWZ0ZXJUb29sKVxuICAgIGZvciAoY29uc3QgZXZlbnROYW1lIG9mIFsnUG9zdFRvb2xVc2UnLCAnQWZ0ZXJUb29sJ10pIHtcbiAgICAgIGlmIChzZXR0aW5ncy5ob29rcyAmJiBzZXR0aW5ncy5ob29rc1tldmVudE5hbWVdKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IHNldHRpbmdzLmhvb2tzW2V2ZW50TmFtZV0ubGVuZ3RoO1xuICAgICAgICBzZXR0aW5ncy5ob29rc1tldmVudE5hbWVdID0gc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXS5maWx0ZXIoZW50cnkgPT4ge1xuICAgICAgICAgIGlmIChlbnRyeS5ob29rcyAmJiBBcnJheS5pc0FycmF5KGVudHJ5Lmhvb2tzKSkge1xuICAgICAgICAgICAgY29uc3QgaGFzRXpIb29rID0gZW50cnkuaG9va3Muc29tZShoID0+XG4gICAgICAgICAgICAgIGguY29tbWFuZCAmJiBoLmNvbW1hbmQuaW5jbHVkZXMoJ2V6LWNvbnRleHQtbW9uaXRvcicpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuICFoYXNFekhvb2s7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNldHRpbmdzLmhvb2tzW2V2ZW50TmFtZV0ubGVuZ3RoIDwgYmVmb3JlKSB7XG4gICAgICAgICAgc2V0dGluZ3NNb2RpZmllZCA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIGNvbnRleHQgbW9uaXRvciBob29rIGZyb20gc2V0dGluZ3NgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBkZWxldGUgc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIGVtcHR5IGhvb2tzIG9iamVjdFxuICAgIGlmIChzZXR0aW5ncy5ob29rcyAmJiBPYmplY3Qua2V5cyhzZXR0aW5ncy5ob29rcykubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaG9va3M7XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzTW9kaWZpZWQpIHtcbiAgICAgIHdyaXRlU2V0dGluZ3Moc2V0dGluZ3NQYXRoLCBzZXR0aW5ncyk7XG4gICAgICByZW1vdmVkQ291bnQrKztcbiAgICB9XG4gIH1cblxuICAvLyA2LiBGb3IgT3BlbkNvZGUsIGNsZWFuIHVwIHBlcm1pc3Npb25zIGZyb20gb3BlbmNvZGUuanNvblxuICBpZiAoaXNPcGVuY29kZSkge1xuICAgIC8vIEZvciBsb2NhbCB1bmluc3RhbGxzLCBjbGVhbiB1cCAuLy5vcGVuY29kZS9vcGVuY29kZS5qc29uXG4gICAgLy8gRm9yIGdsb2JhbCB1bmluc3RhbGxzLCBjbGVhbiB1cCB+Ly5jb25maWcvb3BlbmNvZGUvb3BlbmNvZGUuanNvblxuICAgIGNvbnN0IG9wZW5jb2RlQ29uZmlnRGlyID0gaXNHbG9iYWxcbiAgICAgID8gZ2V0T3BlbmNvZGVHbG9iYWxEaXIoKVxuICAgICAgOiBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5vcGVuY29kZScpO1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ob3BlbmNvZGVDb25maWdEaXIsICdvcGVuY29kZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgICAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBSZW1vdmUgRVogcGVybWlzc2lvbiBlbnRyaWVzXG4gICAgICAgIGlmIChjb25maWcucGVybWlzc2lvbikge1xuICAgICAgICAgIGZvciAoY29uc3QgcGVybVR5cGUgb2YgWydyZWFkJywgJ2V4dGVybmFsX2RpcmVjdG9yeSddKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLnBlcm1pc3Npb25bcGVybVR5cGVdKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb25maWcucGVybWlzc2lvbltwZXJtVHlwZV0pO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnZXotYWdlbnRzJykpIHtcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGVybWlzc2lvbltwZXJtVHlwZV1ba2V5XTtcbiAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgZW1wdHkgb2JqZWN0c1xuICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlnLnBlcm1pc3Npb25bcGVybVR5cGVdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY29uZmlnLnBlcm1pc3Npb25bcGVybVR5cGVdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhjb25maWcucGVybWlzc2lvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLnBlcm1pc3Npb247XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vZGlmaWVkKSB7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpICsgJ1xcbicpO1xuICAgICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBFWiBwZXJtaXNzaW9ucyBmcm9tIG9wZW5jb2RlLmpzb25gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZ25vcmUgSlNPTiBwYXJzZSBlcnJvcnNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocmVtb3ZlZENvdW50ID09PSAwKSB7XG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gTm8gRVpfQWdlbnRzIGZpbGVzIGZvdW5kIHRvIHJlbW92ZS5gKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBcbiAgJHtncmVlbn1Eb25lISR7cmVzZXR9IEVaX0FnZW50cyBoYXMgYmVlbiB1bmluc3RhbGxlZCBmcm9tICR7cnVudGltZUxhYmVsfS5cbiAgWW91ciBvdGhlciBmaWxlcyBhbmQgc2V0dGluZ3MgaGF2ZSBiZWVuIHByZXNlcnZlZC5cbmApO1xufVxuXG4vKipcbiAqIFBhcnNlIEpTT05DIChKU09OIHdpdGggQ29tbWVudHMpIGJ5IHN0cmlwcGluZyBjb21tZW50cyBhbmQgdHJhaWxpbmcgY29tbWFzLlxuICogT3BlbkNvZGUgc3VwcG9ydHMgSlNPTkMgZm9ybWF0IHZpYSBqc29uYy1wYXJzZXIsIHNvIHVzZXJzIG1heSBoYXZlIGNvbW1lbnRzLlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGlubGluZSBwYXJzZXIgdG8gYXZvaWQgYWRkaW5nIGRlcGVuZGVuY2llcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VKc29uYyhjb250ZW50KSB7XG4gIC8vIFN0cmlwIEJPTSBpZiBwcmVzZW50XG4gIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHNpbmdsZS1saW5lIGFuZCBibG9jayBjb21tZW50cyB3aGlsZSBwcmVzZXJ2aW5nIHN0cmluZ3NcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgaW5TdHJpbmcgPSBmYWxzZTtcbiAgbGV0IGkgPSAwO1xuICB3aGlsZSAoaSA8IGNvbnRlbnQubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaV07XG4gICAgY29uc3QgbmV4dCA9IGNvbnRlbnRbaSArIDFdO1xuXG4gICAgaWYgKGluU3RyaW5nKSB7XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIC8vIEhhbmRsZSBlc2NhcGUgc2VxdWVuY2VzXG4gICAgICBpZiAoY2hhciA9PT0gJ1xcXFwnICYmIGkgKyAxIDwgY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0ICs9IG5leHQ7XG4gICAgICAgIGkgKz0gMjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICBpblN0cmluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICBpblN0cmluZyA9IHRydWU7XG4gICAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgICBpKys7XG4gICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICcvJyAmJiBuZXh0ID09PSAnLycpIHtcbiAgICAgICAgLy8gU2tpcCBzaW5nbGUtbGluZSBjb21tZW50IHVudGlsIGVuZCBvZiBsaW5lXG4gICAgICAgIHdoaWxlIChpIDwgY29udGVudC5sZW5ndGggJiYgY29udGVudFtpXSAhPT0gJ1xcbicpIHtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJy8nICYmIG5leHQgPT09ICcqJykge1xuICAgICAgICAvLyBTa2lwIGJsb2NrIGNvbW1lbnRcbiAgICAgICAgaSArPSAyO1xuICAgICAgICB3aGlsZSAoaSA8IGNvbnRlbnQubGVuZ3RoIC0gMSAmJiAhKGNvbnRlbnRbaV0gPT09ICcqJyAmJiBjb250ZW50W2kgKyAxXSA9PT0gJy8nKSkge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBpICs9IDI7IC8vIFNraXAgY2xvc2luZyAqL1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgdHJhaWxpbmcgY29tbWFzIGJlZm9yZSB9IG9yIF1cbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLywoXFxzKlt9XFxdXSkvZywgJyQxJyk7XG5cbiAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmUgT3BlbkNvZGUgcGVybWlzc2lvbnMgdG8gYWxsb3cgcmVhZGluZyBFWiByZWZlcmVuY2UgZG9jc1xuICogVGhpcyBwcmV2ZW50cyBwZXJtaXNzaW9uIHByb21wdHMgd2hlbiBFWiBhY2Nlc3NlcyB0aGUgZXotYWdlbnRzIGRpcmVjdG9yeVxuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBvciBsb2NhbCBpbnN0YWxsXG4gKi9cbmZ1bmN0aW9uIGNvbmZpZ3VyZU9wZW5jb2RlUGVybWlzc2lvbnMoaXNHbG9iYWwgPSB0cnVlKSB7XG4gIC8vIEZvciBsb2NhbCBpbnN0YWxscywgdXNlIC4vLm9wZW5jb2RlL29wZW5jb2RlLmpzb25cbiAgLy8gRm9yIGdsb2JhbCBpbnN0YWxscywgdXNlIH4vLmNvbmZpZy9vcGVuY29kZS9vcGVuY29kZS5qc29uXG4gIGNvbnN0IG9wZW5jb2RlQ29uZmlnRGlyID0gaXNHbG9iYWxcbiAgICA/IGdldE9wZW5jb2RlR2xvYmFsRGlyKClcbiAgICA6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLm9wZW5jb2RlJyk7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ob3BlbmNvZGVDb25maWdEaXIsICdvcGVuY29kZS5qc29uJyk7XG5cbiAgLy8gRW5zdXJlIGNvbmZpZyBkaXJlY3RvcnkgZXhpc3RzXG4gIGZzLm1rZGlyU3luYyhvcGVuY29kZUNvbmZpZ0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgLy8gUmVhZCBleGlzdGluZyBjb25maWcgb3IgY3JlYXRlIGVtcHR5IG9iamVjdFxuICBsZXQgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb25maWcgPSBwYXJzZUpzb25jKGNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENhbm5vdCBwYXJzZSAtIERPIE5PVCBvdmVyd3JpdGUgdXNlcidzIGNvbmZpZ1xuICAgICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gQ291bGQgbm90IHBhcnNlIG9wZW5jb2RlLmpzb24gLSBza2lwcGluZyBwZXJtaXNzaW9uIGNvbmZpZ2ApO1xuICAgICAgY29uc29sZS5sb2coYCAgICAke2RpbX1SZWFzb246ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9JHtyZXNldH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtkaW19WW91ciBjb25maWcgd2FzIE5PVCBtb2RpZmllZC4gRml4IHRoZSBzeW50YXggbWFudWFsbHkgaWYgbmVlZGVkLiR7cmVzZXR9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLy8gRW5zdXJlIHBlcm1pc3Npb24gc3RydWN0dXJlIGV4aXN0c1xuICBpZiAoIWNvbmZpZy5wZXJtaXNzaW9uKSB7XG4gICAgY29uZmlnLnBlcm1pc3Npb24gPSB7fTtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSBFWiBwYXRoIHVzaW5nIHRoZSBhY3R1YWwgY29uZmlnIGRpcmVjdG9yeVxuICAvLyBVc2UgfiBzaG9ydGhhbmQgaWYgaXQncyBpbiB0aGUgZGVmYXVsdCBsb2NhdGlvbiwgb3RoZXJ3aXNlIHVzZSBmdWxsIHBhdGhcbiAgY29uc3QgZGVmYXVsdENvbmZpZ0RpciA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29uZmlnJywgJ29wZW5jb2RlJyk7XG4gIGNvbnN0IGV6UGF0aCA9IG9wZW5jb2RlQ29uZmlnRGlyID09PSBkZWZhdWx0Q29uZmlnRGlyXG4gICAgPyAnfi8uY29uZmlnL29wZW5jb2RlL2V6LWFnZW50cy8qJ1xuICAgIDogYCR7b3BlbmNvZGVDb25maWdEaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpfS9lei1hZ2VudHMvKmA7XG5cbiAgbGV0IG1vZGlmaWVkID0gZmFsc2U7XG5cbiAgLy8gQ29uZmlndXJlIHJlYWQgcGVybWlzc2lvblxuICBjb25zdCBwZXJtaXNzaW9uID0gY29uZmlnLnBlcm1pc3Npb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfHwge307XG4gIGNvbmZpZy5wZXJtaXNzaW9uID0gcGVybWlzc2lvbjtcbiAgaWYgKCFwZXJtaXNzaW9uLnJlYWQgfHwgdHlwZW9mIHBlcm1pc3Npb24ucmVhZCAhPT0gJ29iamVjdCcpIHtcbiAgICBwZXJtaXNzaW9uLnJlYWQgPSB7fTtcbiAgfVxuICBjb25zdCByZWFkUGVybSA9IHBlcm1pc3Npb24ucmVhZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKHJlYWRQZXJtW2V6UGF0aF0gIT09ICdhbGxvdycpIHtcbiAgICByZWFkUGVybVtlelBhdGhdID0gJ2FsbG93JztcbiAgICBtb2RpZmllZCA9IHRydWU7XG4gIH1cblxuICAvLyBDb25maWd1cmUgZXh0ZXJuYWxfZGlyZWN0b3J5IHBlcm1pc3Npb24gKHRoZSBzYWZldHkgZ3VhcmQgZm9yIHBhdGhzIG91dHNpZGUgcHJvamVjdClcbiAgaWYgKCFwZXJtaXNzaW9uLmV4dGVybmFsX2RpcmVjdG9yeSB8fCB0eXBlb2YgcGVybWlzc2lvbi5leHRlcm5hbF9kaXJlY3RvcnkgIT09ICdvYmplY3QnKSB7XG4gICAgcGVybWlzc2lvbi5leHRlcm5hbF9kaXJlY3RvcnkgPSB7fTtcbiAgfVxuICBjb25zdCBleHREaXJQZXJtID0gcGVybWlzc2lvbi5leHRlcm5hbF9kaXJlY3RvcnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChleHREaXJQZXJtW2V6UGF0aF0gIT09ICdhbGxvdycpIHtcbiAgICBleHREaXJQZXJtW2V6UGF0aF0gPSAnYWxsb3cnO1xuICAgIG1vZGlmaWVkID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICghbW9kaWZpZWQpIHtcbiAgICByZXR1cm47IC8vIEFscmVhZHkgY29uZmlndXJlZFxuICB9XG5cbiAgLy8gV3JpdGUgY29uZmlnIGJhY2tcbiAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpICsgJ1xcbicpO1xuICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENvbmZpZ3VyZWQgcmVhZCBwZXJtaXNzaW9uIGZvciBFWl9BZ2VudHMgZG9jc2ApO1xufVxuXG4vKipcbiAqIFZlcmlmeSBhIGRpcmVjdG9yeSBleGlzdHMgYW5kIGNvbnRhaW5zIGZpbGVzXG4gKi9cbmZ1bmN0aW9uIHZlcmlmeUluc3RhbGxlZChkaXJQYXRoLCBkZXNjcmlwdGlvbikge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fVx1MjcxNyR7cmVzZXR9IEZhaWxlZCB0byBpbnN0YWxsICR7ZGVzY3JpcHRpb259OiBkaXJlY3Rvcnkgbm90IGNyZWF0ZWRgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoZGlyUGF0aCk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fVx1MjcxNyR7cmVzZXR9IEZhaWxlZCB0byBpbnN0YWxsICR7ZGVzY3JpcHRpb259OiBkaXJlY3RvcnkgaXMgZW1wdHlgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fVx1MjcxNyR7cmVzZXR9IEZhaWxlZCB0byBpbnN0YWxsICR7ZGVzY3JpcHRpb259OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBWZXJpZnkgYSBmaWxlIGV4aXN0c1xuICovXG5mdW5jdGlvbiB2ZXJpZnlGaWxlSW5zdGFsbGVkKGZpbGVQYXRoLCBkZXNjcmlwdGlvbikge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd31cdTI3MTcke3Jlc2V0fSBGYWlsZWQgdG8gaW5zdGFsbCAke2Rlc2NyaXB0aW9ufTogZmlsZSBub3QgY3JlYXRlZGApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGZvciBhIHNwZWNpZmljIHJ1bnRpbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNHbG9iYWwgLSBXaGV0aGVyIHRvIGluc3RhbGwgZ2xvYmFsbHkgb3IgbG9jYWxseVxuICogQHBhcmFtIHtzdHJpbmd9IHJ1bnRpbWUgLSBUYXJnZXQgcnVudGltZSAoJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnKVxuICovXG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gTG9jYWwgUGF0Y2ggUGVyc2lzdGVuY2Vcbi8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5jb25zdCBQQVRDSEVTX0RJUl9OQU1FID0gJ2V6LWxvY2FsLXBhdGNoZXMnO1xuY29uc3QgTUFOSUZFU1RfTkFNRSA9ICdlei1maWxlLW1hbmlmZXN0Lmpzb24nO1xuXG4vKipcbiAqIENvbXB1dGUgU0hBMjU2IGhhc2ggb2YgZmlsZSBjb250ZW50c1xuICovXG5mdW5jdGlvbiBmaWxlSGFzaChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCk7XG4gIC8vIENvbnZlcnQgdG8gVWludDhBcnJheSB0byBzYXRpc2Z5IEJpbmFyeUxpa2UgdHlwZSByZXF1aXJlbWVudFxuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShuZXcgVWludDhBcnJheShjb250ZW50KSkuZGlnZXN0KCdoZXgnKTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb2xsZWN0IGFsbCBmaWxlcyBpbiBkaXIgd2l0aCB0aGVpciBoYXNoZXNcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVNYW5pZmVzdChkaXI6IHN0cmluZywgYmFzZURpcj86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoIWJhc2VEaXIpIGJhc2VEaXIgPSBkaXI7XG4gIGNvbnN0IG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSByZXR1cm4gbWFuaWZlc3Q7XG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZShiYXNlRGlyLCBmdWxsUGF0aCkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG1hbmlmZXN0LCBnZW5lcmF0ZU1hbmlmZXN0KGZ1bGxQYXRoLCBiYXNlRGlyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0W3JlbFBhdGhdID0gZmlsZUhhc2goZnVsbFBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWFuaWZlc3Q7XG59XG5cbi8qKlxuICogV3JpdGUgZmlsZSBtYW5pZmVzdCBhZnRlciBpbnN0YWxsYXRpb24gZm9yIGZ1dHVyZSBtb2RpZmljYXRpb24gZGV0ZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIHdyaXRlTWFuaWZlc3QoY29uZmlnRGlyOiBzdHJpbmcsIHJ1bnRpbWUgPSAnY2xhdWRlJykge1xuICBjb25zdCBpc09wZW5jb2RlID0gcnVudGltZSA9PT0gJ29wZW5jb2RlJztcbiAgY29uc3QgaXNDb2RleCA9IHJ1bnRpbWUgPT09ICdjb2RleCc7XG4gIGNvbnN0IGlzQ29waWxvdCA9IHJ1bnRpbWUgPT09ICdjb3BpbG90JztcbiAgY29uc3QgZXpEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCAnZXotYWdlbnRzJyk7XG4gIGNvbnN0IGNvbW1hbmRzRGlyID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgJ2NvbW1hbmRzJywgJ2V6Jyk7XG4gIGNvbnN0IG9wZW5jb2RlQ29tbWFuZERpciA9IHBhdGguam9pbihjb25maWdEaXIsICdjb21tYW5kJyk7XG4gIGNvbnN0IGNvZGV4U2tpbGxzRGlyID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgJ3NraWxscycpO1xuICBjb25zdCBhZ2VudHNEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCAnYWdlbnRzJyk7XG4gIGNvbnN0IG1hbmlmZXN0ID0geyB2ZXJzaW9uOiBwa2cudmVyc2lvbiwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksIGZpbGVzOiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH07XG5cbiAgY29uc3QgZXpIYXNoZXMgPSBnZW5lcmF0ZU1hbmlmZXN0KGV6RGlyKTtcbiAgZm9yIChjb25zdCBbcmVsLCBoYXNoXSBvZiBPYmplY3QuZW50cmllcyhlekhhc2hlcykpIHtcbiAgICBtYW5pZmVzdC5maWxlc1snZXotYWdlbnRzLycgKyByZWxdID0gaGFzaDtcbiAgfVxuICBpZiAoIWlzT3BlbmNvZGUgJiYgIWlzQ29kZXggJiYgIWlzQ29waWxvdCAmJiBmcy5leGlzdHNTeW5jKGNvbW1hbmRzRGlyKSkge1xuICAgIGNvbnN0IGNtZEhhc2hlcyA9IGdlbmVyYXRlTWFuaWZlc3QoY29tbWFuZHNEaXIpO1xuICAgIGZvciAoY29uc3QgW3JlbCwgaGFzaF0gb2YgT2JqZWN0LmVudHJpZXMoY21kSGFzaGVzKSkge1xuICAgICAgbWFuaWZlc3QuZmlsZXNbJ2NvbW1hbmRzL2V6LycgKyByZWxdID0gaGFzaDtcbiAgICB9XG4gIH1cbiAgaWYgKGlzT3BlbmNvZGUgJiYgZnMuZXhpc3RzU3luYyhvcGVuY29kZUNvbW1hbmREaXIpKSB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZzLnJlYWRkaXJTeW5jKG9wZW5jb2RlQ29tbWFuZERpcikpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ2V6LScpICYmIGZpbGUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIG1hbmlmZXN0LmZpbGVzWydjb21tYW5kLycgKyBmaWxlXSA9IGZpbGVIYXNoKHBhdGguam9pbihvcGVuY29kZUNvbW1hbmREaXIsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKChpc0NvZGV4IHx8IGlzQ29waWxvdCkgJiYgZnMuZXhpc3RzU3luYyhjb2RleFNraWxsc0RpcikpIHtcbiAgICBmb3IgKGNvbnN0IHNraWxsTmFtZSBvZiBsaXN0Q29kZXhTa2lsbE5hbWVzKGNvZGV4U2tpbGxzRGlyKSkge1xuICAgICAgY29uc3Qgc2tpbGxSb290ID0gcGF0aC5qb2luKGNvZGV4U2tpbGxzRGlyLCBza2lsbE5hbWUpO1xuICAgICAgY29uc3Qgc2tpbGxIYXNoZXMgPSBnZW5lcmF0ZU1hbmlmZXN0KHNraWxsUm9vdCk7XG4gICAgICBmb3IgKGNvbnN0IFtyZWwsIGhhc2hdIG9mIE9iamVjdC5lbnRyaWVzKHNraWxsSGFzaGVzKSkge1xuICAgICAgICBtYW5pZmVzdC5maWxlc1tgc2tpbGxzLyR7c2tpbGxOYW1lfS8ke3JlbH1gXSA9IGhhc2g7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChmcy5leGlzdHNTeW5jKGFnZW50c0RpcikpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoYWdlbnRzRGlyKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgbWFuaWZlc3QuZmlsZXNbJ2FnZW50cy8nICsgZmlsZV0gPSBmaWxlSGFzaChwYXRoLmpvaW4oYWdlbnRzRGlyLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oY29uZmlnRGlyLCBNQU5JRkVTVF9OQU1FKSwgSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QsIG51bGwsIDIpKTtcbiAgcmV0dXJuIG1hbmlmZXN0O1xufVxuXG4vKipcbiAqIERldGVjdCB1c2VyLW1vZGlmaWVkIEVaX0FnZW50cyBmaWxlcyBieSBjb21wYXJpbmcgYWdhaW5zdCBpbnN0YWxsIG1hbmlmZXN0LlxuICogQmFja3MgdXAgbW9kaWZpZWQgZmlsZXMgdG8gZXotbG9jYWwtcGF0Y2hlcy8gZm9yIHJlYXBwbHkgYWZ0ZXIgdXBkYXRlLlxuICovXG5mdW5jdGlvbiBzYXZlTG9jYWxQYXRjaGVzKGNvbmZpZ0Rpcikge1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBNQU5JRkVTVF9OQU1FKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHJldHVybiBbXTtcblxuICBsZXQgbWFuaWZlc3Q7XG4gIHRyeSB7IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKTsgfSBjYXRjaCB7IHJldHVybiBbXTsgfVxuXG4gIGNvbnN0IHBhdGNoZXNEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBQQVRDSEVTX0RJUl9OQU1FKTtcbiAgY29uc3QgbW9kaWZpZWQ6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbcmVsUGF0aCwgb3JpZ2luYWxIYXNoXSBvZiBPYmplY3QuZW50cmllcyhtYW5pZmVzdC5maWxlcyB8fCB7fSkpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIHJlbFBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmdWxsUGF0aCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGN1cnJlbnRIYXNoID0gZmlsZUhhc2goZnVsbFBhdGgpO1xuICAgIGlmIChjdXJyZW50SGFzaCAhPT0gb3JpZ2luYWxIYXNoKSB7XG4gICAgICBjb25zdCBiYWNrdXBQYXRoID0gcGF0aC5qb2luKHBhdGNoZXNEaXIsIHJlbFBhdGgpO1xuICAgICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShiYWNrdXBQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBmcy5jb3B5RmlsZVN5bmMoZnVsbFBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgbW9kaWZpZWQucHVzaChyZWxQYXRoKTtcbiAgICB9XG4gIH1cblxuICBpZiAobW9kaWZpZWQubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG1ldGEgPSB7XG4gICAgICBiYWNrZWRfdXBfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGZyb21fdmVyc2lvbjogbWFuaWZlc3QudmVyc2lvbixcbiAgICAgIGZpbGVzOiBtb2RpZmllZFxuICAgIH07XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocGF0Y2hlc0RpciwgJ2JhY2t1cC1tZXRhLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkobWV0YSwgbnVsbCwgMikpO1xuICAgIGNvbnNvbGUubG9nKCcgICcgKyB5ZWxsb3cgKyAnaScgKyByZXNldCArICcgIEZvdW5kICcgKyBtb2RpZmllZC5sZW5ndGggKyAnIGxvY2FsbHkgbW9kaWZpZWQgRVogZmlsZShzKSBcdTIwMTQgYmFja2VkIHVwIHRvICcgKyBQQVRDSEVTX0RJUl9OQU1FICsgJy8nKTtcbiAgICBmb3IgKGNvbnN0IGYgb2YgbW9kaWZpZWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcgICAgICcgKyBkaW0gKyBmICsgcmVzZXQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbW9kaWZpZWQ7XG59XG5cbi8qKlxuICogQWZ0ZXIgaW5zdGFsbCwgcmVwb3J0IGJhY2tlZC11cCBwYXRjaGVzIGZvciB1c2VyIHRvIHJlYXBwbHkuXG4gKi9cbmZ1bmN0aW9uIHJlcG9ydExvY2FsUGF0Y2hlcyhjb25maWdEaXIsIHJ1bnRpbWUgPSAnY2xhdWRlJykge1xuICBjb25zdCBwYXRjaGVzRGlyID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgUEFUQ0hFU19ESVJfTkFNRSk7XG4gIGNvbnN0IG1ldGFQYXRoID0gcGF0aC5qb2luKHBhdGNoZXNEaXIsICdiYWNrdXAtbWV0YS5qc29uJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhtZXRhUGF0aCkpIHJldHVybiBbXTtcblxuICBsZXQgbWV0YTtcbiAgdHJ5IHsgbWV0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1ldGFQYXRoLCAndXRmOCcpKTsgfSBjYXRjaCB7IHJldHVybiBbXTsgfVxuXG4gIGlmIChtZXRhLmZpbGVzICYmIG1ldGEuZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHJlYXBwbHlDb21tYW5kID0gKHJ1bnRpbWUgPT09ICdvcGVuY29kZScgfHwgcnVudGltZSA9PT0gJ2NvcGlsb3QnKVxuICAgICAgPyAnL2V6LXJlYXBwbHktcGF0Y2hlcydcbiAgICAgIDogcnVudGltZSA9PT0gJ2NvZGV4J1xuICAgICAgICA/ICckZXotcmVhcHBseS1wYXRjaGVzJ1xuICAgICAgICA6ICcvZXo6cmVhcHBseS1wYXRjaGVzJztcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgY29uc29sZS5sb2coJyAgJyArIHllbGxvdyArICdMb2NhbCBwYXRjaGVzIGRldGVjdGVkJyArIHJlc2V0ICsgJyAoZnJvbSB2JyArIG1ldGEuZnJvbV92ZXJzaW9uICsgJyk6Jyk7XG4gICAgZm9yIChjb25zdCBmIG9mIG1ldGEuZmlsZXMpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcgICAgICcgKyBjeWFuICsgZiArIHJlc2V0KTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coJycpO1xuICAgIGNvbnNvbGUubG9nKCcgIFlvdXIgbW9kaWZpY2F0aW9ucyBhcmUgc2F2ZWQgaW4gJyArIGN5YW4gKyBQQVRDSEVTX0RJUl9OQU1FICsgJy8nICsgcmVzZXQpO1xuICAgIGNvbnNvbGUubG9nKCcgIFJ1biAnICsgY3lhbiArIHJlYXBwbHlDb21tYW5kICsgcmVzZXQgKyAnIHRvIG1lcmdlIHRoZW0gaW50byB0aGUgbmV3IHZlcnNpb24uJyk7XG4gICAgY29uc29sZS5sb2coJyAgT3IgbWFudWFsbHkgY29tcGFyZSBhbmQgbWVyZ2UgdGhlIGZpbGVzLicpO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfVxuICByZXR1cm4gbWV0YS5maWxlcyB8fCBbXTtcbn1cblxuZnVuY3Rpb24gaW5zdGFsbChpc0dsb2JhbDogYm9vbGVhbiwgcnVudGltZSA9ICdjbGF1ZGUnKTogeyBzZXR0aW5nc1BhdGg6IHN0cmluZyB8IG51bGw7IHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7IHN0YXR1c2xpbmVDb21tYW5kOiBzdHJpbmcgfCBudWxsOyBydW50aW1lOiBzdHJpbmcgfSB7XG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xuICBjb25zdCBpc0dlbWluaSA9IHJ1bnRpbWUgPT09ICdnZW1pbmknO1xuICBjb25zdCBpc0NvZGV4ID0gcnVudGltZSA9PT0gJ2NvZGV4JztcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xuICBjb25zdCBpc1F3ZW4gPSBydW50aW1lID09PSAncXdlbic7XG4gIGNvbnN0IGlzS2ltaSA9IHJ1bnRpbWUgPT09ICdraW1pJztcbiAgY29uc3QgZGlyTmFtZSA9IGdldERpck5hbWUocnVudGltZSk7XG4gIFxuICAvLyBSZXNvbHZlIHBhY2thZ2Ugcm9vdCBieSBmaW5kaW5nIGRpcmVjdG9yeSBjb250YWluaW5nIHBhY2thZ2UuanNvblxuICAvLyBUaGlzIHdvcmtzIHdoZXRoZXIgcnVubmluZyBmcm9tIGRpc3QvYmluLyAoaW5zdGFsbGVkKSBvciBiaW4vIChkZXZlbG9wbWVudClcbiAgbGV0IHBrZ1Jvb3QgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwa2dSb290LCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKHBrZ1Jvb3QpO1xuICAgIGlmIChwYXJlbnQgPT09IHBrZ1Jvb3QpIHtcbiAgICAgIC8vIFJlYWNoZWQgZmlsZXN5c3RlbSByb290LCBmYWxsYmFjayB0byBfX2Rpcm5hbWVcbiAgICAgIHBrZ1Jvb3QgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBwa2dSb290ID0gcGFyZW50O1xuICB9XG4gIGNvbnN0IHNyYyA9IHBrZ1Jvb3Q7XG5cbiAgLy8gR2V0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGJhc2VkIG9uIHJ1bnRpbWUgYW5kIGluc3RhbGwgdHlwZVxuICBjb25zdCB0YXJnZXREaXIgPSBpc0dsb2JhbFxuICAgID8gZ2V0R2xvYmFsRGlyKHJ1bnRpbWUsIGV4cGxpY2l0Q29uZmlnRGlyKVxuICAgIDogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGRpck5hbWUpO1xuXG4gIGNvbnN0IGxvY2F0aW9uTGFiZWwgPSBpc0dsb2JhbFxuICAgID8gdGFyZ2V0RGlyLnJlcGxhY2Uob3MuaG9tZWRpcigpLCAnficpXG4gICAgOiB0YXJnZXREaXIucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnLicpO1xuXG4gIC8vIFBhdGggcHJlZml4IGZvciBmaWxlIHJlZmVyZW5jZXMgaW4gbWFya2Rvd24gY29udGVudFxuICAvLyBGb3IgZ2xvYmFsIGluc3RhbGxzOiB1c2UgdGlsZGUtYmFzZWQgcGF0aCAofi8uY2xhdWRlLykgdG8gYXZvaWQgYmFraW5nXG4gIC8vIGFic29sdXRlIHBhdGhzIChjb250YWluaW5nIE9TIHVzZXJuYW1lKSBpbnRvIHRlbXBsYXRlc1xuICAvLyBGb3IgbG9jYWwgaW5zdGFsbHM6IHVzZSByZWxhdGl2ZVxuICBjb25zdCBwYXRoUHJlZml4ID0gaXNHbG9iYWxcbiAgICA/IGAke3RhcmdldERpci5yZXBsYWNlKC9cXFxcL2csICcvJykucmVwbGFjZShvcy5ob21lZGlyKCkucmVwbGFjZSgvXFxcXC9nLCAnLycpLCAnficpfS9gXG4gICAgOiBgLi8ke2Rpck5hbWV9L2A7XG5cbiAgbGV0IHJ1bnRpbWVMYWJlbCA9ICdDbGF1ZGUgQ29kZSc7XG4gIGlmIChpc09wZW5jb2RlKSBydW50aW1lTGFiZWwgPSAnT3BlbkNvZGUnO1xuICBpZiAoaXNHZW1pbmkpIHJ1bnRpbWVMYWJlbCA9ICdHZW1pbmknO1xuICBpZiAoaXNDb2RleCkgcnVudGltZUxhYmVsID0gJ0NvZGV4JztcbiAgaWYgKGlzQ29waWxvdCkgcnVudGltZUxhYmVsID0gJ0NvcGlsb3QnO1xuICBpZiAoaXNRd2VuKSBydW50aW1lTGFiZWwgPSAnUXdlbiBDb2RlJztcbiAgaWYgKGlzS2ltaSkgcnVudGltZUxhYmVsID0gJ0tpbWkgQ29kZSc7XG5cbiAgY29uc29sZS5sb2coYCAgSW5zdGFsbGluZyBmb3IgJHtjeWFufSR7cnVudGltZUxhYmVsfSR7cmVzZXR9IHRvICR7Y3lhbn0ke2xvY2F0aW9uTGFiZWx9JHtyZXNldH1cXG5gKTtcblxuICAvLyBUcmFjayBpbnN0YWxsYXRpb24gZmFpbHVyZXNcbiAgY29uc3QgZmFpbHVyZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gU2F2ZSBhbnkgbG9jYWxseSBtb2RpZmllZCBFWl9BZ2VudHMgZmlsZXMgYmVmb3JlIHRoZXkgZ2V0IHdpcGVkXG4gIHNhdmVMb2NhbFBhdGNoZXModGFyZ2V0RGlyKTtcblxuICAvLyBDbGVhbiB1cCBvcnBoYW5lZCBmaWxlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zXG4gIGNsZWFudXBPcnBoYW5lZEZpbGVzKHRhcmdldERpcik7XG5cbiAgLy8gT3BlbkNvZGUgdXNlcyBjb21tYW5kLyAoZmxhdCksIENvZGV4L0NvcGlsb3QvUXdlbiB1c2Ugc2tpbGxzLywgQ2xhdWRlL0dlbWluaSB1c2UgY29tbWFuZHMvZXovXG4gIGlmIChpc09wZW5jb2RlKSB7XG4gICAgLy8gT3BlbkNvZGU6IGZsYXQgc3RydWN0dXJlIGluIGNvbW1hbmQvIGRpcmVjdG9yeVxuICAgIGNvbnN0IGNvbW1hbmREaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnY29tbWFuZCcpO1xuICAgIGZzLm1rZGlyU3luYyhjb21tYW5kRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIENvcHkgY29tbWFuZHMvZXovKi5tZCBhcyBjb21tYW5kL2V6LSoubWQgKGZsYXR0ZW4gc3RydWN0dXJlKVxuICAgIGNvbnN0IGV6U3JjID0gcGF0aC5qb2luKHNyYywgJ2NvbW1hbmRzJywgJ2V6Jyk7XG4gICAgY29weUZsYXR0ZW5lZENvbW1hbmRzKGV6U3JjLCBjb21tYW5kRGlyLCAnZXonLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICBpZiAodmVyaWZ5SW5zdGFsbGVkKGNvbW1hbmREaXIsICdjb21tYW5kL2V6LSonKSkge1xuICAgICAgY29uc3QgY291bnQgPSBmcy5yZWFkZGlyU3luYyhjb21tYW5kRGlyKS5maWx0ZXIoZiA9PiBmLnN0YXJ0c1dpdGgoJ2V6LScpKS5sZW5ndGg7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCAke2NvdW50fSBjb21tYW5kcyB0byBjb21tYW5kL2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdjb21tYW5kL2V6LSonKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNDb2RleCB8fCBpc0tpbWkpIHtcbiAgICAvLyBDb2RleCwgS2ltaTogc2tpbGxzIHN0cnVjdHVyZSBpbiBza2lsbHMvIGRpcmVjdG9yeVxuICAgIGNvbnN0IHNraWxsc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdza2lsbHMnKTtcbiAgICBjb25zdCBlelNyYyA9IHBhdGguam9pbihzcmMsICdjb21tYW5kcycsICdleicpO1xuICAgIGlmIChpc0tpbWkpIHtcbiAgICAgIGNvcHlDb21tYW5kc0FzS2ltaVNraWxscyhlelNyYywgc2tpbGxzRGlyLCAnZXonLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29weUNvbW1hbmRzQXNDb2RleFNraWxscyhlelNyYywgc2tpbGxzRGlyLCAnZXonLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICB9XG4gICAgY29uc3QgaW5zdGFsbGVkU2tpbGxOYW1lcyA9IGxpc3RDb2RleFNraWxsTmFtZXMoc2tpbGxzRGlyKTtcbiAgICBpZiAoaW5zdGFsbGVkU2tpbGxOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCAke2luc3RhbGxlZFNraWxsTmFtZXMubGVuZ3RofSBza2lsbHMgdG8gc2tpbGxzL2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdza2lsbHMvZXotKicpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1F3ZW4pIHtcbiAgICAvLyBRd2VuIENvZGU6IGNvbW1hbmRzIHN0cnVjdHVyZSBpbiBjb21tYW5kcy9lei8gZGlyZWN0b3J5IChsaWtlIENsYXVkZSBDb2RlL0dlbWluaSlcbiAgICAvLyBRd2VuIENvZGUgdXNlcyB+Ly5xd2VuL2NvbW1hbmRzL2V6LyoubWQsIE5PVCB+Ly5xd2VuL3NraWxscy9cbiAgICBjb25zdCBjb21tYW5kc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kcycpO1xuICAgIGNvbnN0IGV6Q29tbWFuZHNEaXIgPSBwYXRoLmpvaW4oY29tbWFuZHNEaXIsICdleicpO1xuICAgIGZzLm1rZGlyU3luYyhlekNvbW1hbmRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBcbiAgICBjb25zdCBlelNyYyA9IHBhdGguam9pbihzcmMsICdjb21tYW5kcycsICdleicpO1xuICAgIGNvcHlDb21tYW5kc0FzUXdlbkNvbW1hbmRzKGV6U3JjLCBlekNvbW1hbmRzRGlyLCAnZXonLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICBcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhlekNvbW1hbmRzRGlyKSkge1xuICAgICAgY29uc3QgY291bnQgPSBmcy5yZWFkZGlyU3luYyhlekNvbW1hbmRzRGlyKS5maWx0ZXIoZiA9PiBmLmVuZHNXaXRoKCcubWQnKSkubGVuZ3RoO1xuICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCAke2NvdW50fSBjb21tYW5kcyB0byBjb21tYW5kcy9lei9gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goJ2NvbW1hbmRzL2V6LyoubWQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZmFpbHVyZXMucHVzaCgnY29tbWFuZHMvZXovKi5tZCcpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0NvcGlsb3QpIHtcbiAgICBjb25zdCBza2lsbHNEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnc2tpbGxzJyk7XG4gICAgY29uc3QgZXpTcmMgPSBwYXRoLmpvaW4oc3JjLCAnY29tbWFuZHMnLCAnZXonKTtcbiAgICBjb3B5Q29tbWFuZHNBc0NvcGlsb3RTa2lsbHMoZXpTcmMsIHNraWxsc0RpciwgJ2V6JywgaXNHbG9iYWwpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHNraWxsc0RpcikpIHtcbiAgICAgIGNvbnN0IGNvdW50ID0gZnMucmVhZGRpclN5bmMoc2tpbGxzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcbiAgICAgICAgLmZpbHRlcihlID0+IGUuaXNEaXJlY3RvcnkoKSAmJiBlLm5hbWUuc3RhcnRzV2l0aCgnZXotJykpLmxlbmd0aDtcbiAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgJHtjb3VudH0gc2tpbGxzIHRvIHNraWxscy9gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goJ3NraWxscy9lei0qJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZhaWx1cmVzLnB1c2goJ3NraWxscy9lei0qJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIENsYXVkZSBDb2RlICYgR2VtaW5pOiBuZXN0ZWQgc3RydWN0dXJlIGluIGNvbW1hbmRzLyBkaXJlY3RvcnlcbiAgICBjb25zdCBjb21tYW5kc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kcycpO1xuICAgIGZzLm1rZGlyU3luYyhjb21tYW5kc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCBlelNyYyA9IHBhdGguam9pbihzcmMsICdjb21tYW5kcycsICdleicpO1xuICAgIGNvbnN0IGV6RGVzdCA9IHBhdGguam9pbihjb21tYW5kc0RpciwgJ2V6Jyk7XG4gICAgY29weVdpdGhQYXRoUmVwbGFjZW1lbnQoZXpTcmMsIGV6RGVzdCwgcGF0aFByZWZpeCwgcnVudGltZSwgdHJ1ZSwgaXNHbG9iYWwpO1xuICAgIGlmICh2ZXJpZnlJbnN0YWxsZWQoZXpEZXN0LCAnY29tbWFuZHMvZXonKSkge1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgY29tbWFuZHMvZXpgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmFpbHVyZXMucHVzaCgnY29tbWFuZHMvZXonKTtcbiAgICB9XG4gIH1cblxuICAvLyBDb3B5IGV6LWFnZW50cyBza2lsbCB3aXRoIHBhdGggcmVwbGFjZW1lbnRcbiAgY29uc3Qgc2tpbGxTcmMgPSBwYXRoLmpvaW4oc3JjLCAnZXotYWdlbnRzJyk7XG4gIGNvbnN0IHNraWxsRGVzdCA9IHBhdGguam9pbih0YXJnZXREaXIsICdlei1hZ2VudHMnKTtcbiAgY29weVdpdGhQYXRoUmVwbGFjZW1lbnQoc2tpbGxTcmMsIHNraWxsRGVzdCwgcGF0aFByZWZpeCwgcnVudGltZSwgZmFsc2UsIGlzR2xvYmFsKTtcbiAgaWYgKHZlcmlmeUluc3RhbGxlZChza2lsbERlc3QsICdlei1hZ2VudHMnKSkge1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkIGV6LWFnZW50c2ApO1xuICB9IGVsc2Uge1xuICAgIGZhaWx1cmVzLnB1c2goJ2V6LWFnZW50cycpO1xuICB9XG5cbiAgLy8gQ29weSBFWiBBZ2VudHMgc2tpbGxzIHRvIGdsb2JhbCBkaXJlY3RvcnkgKCRIT01FLy5za2lsbHMvZXotYWdlbnRzLylcbiAgY29weVNraWxscyhzcmMsIGlzR2xvYmFsLCBydW50aW1lKTtcblxuICAvLyBDb3B5IGFnZW50cyB0byBhZ2VudHMgZGlyZWN0b3J5XG4gIGNvbnN0IGFnZW50c1NyYyA9IHBhdGguam9pbihzcmMsICdhZ2VudHMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoYWdlbnRzU3JjKSkge1xuICAgIGNvbnN0IGFnZW50c0Rlc3QgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnYWdlbnRzJyk7XG4gICAgZnMubWtkaXJTeW5jKGFnZW50c0Rlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIG9sZCBFWl9BZ2VudHMgYWdlbnRzIChlei0qLm1kKSBiZWZvcmUgY29weWluZyBuZXcgb25lc1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGFnZW50c0Rlc3QpKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoYWdlbnRzRGVzdCkpIHtcbiAgICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihhZ2VudHNEZXN0LCBmaWxlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb3B5IG5ldyBhZ2VudHNcbiAgICBjb25zdCBhZ2VudEVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhhZ2VudHNTcmMsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFnZW50RW50cmllcykge1xuICAgICAgaWYgKGVudHJ5LmlzRmlsZSgpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihhZ2VudHNTcmMsIGVudHJ5Lm5hbWUpLCAndXRmOCcpO1xuICAgICAgICAvLyBSZXBsYWNlIH4vLmNsYXVkZS8gYW5kICRIT01FLy5jbGF1ZGUvIGFzIHRoZXkgYXJlIHRoZSBzb3VyY2Ugb2YgdHJ1dGggaW4gdGhlIHJlcG9cbiAgICAgICAgY29uc3QgZGlyUmVnZXggPSAvflxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgICBjb25zdCBob21lRGlyUmVnZXggPSAvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgICBpZiAoIWlzQ29waWxvdCkge1xuICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZGlyUmVnZXgsIHBhdGhQcmVmaXgpO1xuICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoaG9tZURpclJlZ2V4LCB0b0hvbWVQcmVmaXgocGF0aFByZWZpeCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSBwcm9jZXNzQXR0cmlidXRpb24oY29udGVudCwgZ2V0Q29tbWl0QXR0cmlidXRpb24ocnVudGltZSkpO1xuICAgICAgICAvLyBDb252ZXJ0IGZyb250bWF0dGVyIGZvciBydW50aW1lIGNvbXBhdGliaWxpdHlcbiAgICAgICAgaWYgKGlzT3BlbmNvZGUpIHtcbiAgICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvT3BlbmNvZGVGcm9udG1hdHRlcihjb250ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0dlbWluaSkge1xuICAgICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9HZW1pbmlBZ2VudChjb250ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0NvZGV4KSB7XG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVBZ2VudFRvQ29kZXhBZ2VudChjb250ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0NvcGlsb3QpIHtcbiAgICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZUFnZW50VG9Db3BpbG90QWdlbnQoY29udGVudCwgaXNHbG9iYWwpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUXdlbikge1xuICAgICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9Rd2VuQWdlbnQoY29udGVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNLaW1pKSB7XG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb0tpbWlBZ2VudChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZXN0TmFtZSA9IGlzQ29waWxvdCA/IGVudHJ5Lm5hbWUucmVwbGFjZSgnLm1kJywgJy5hZ2VudC5tZCcpIDogZW50cnkubmFtZTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oYWdlbnRzRGVzdCwgZGVzdE5hbWUpLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZlcmlmeUluc3RhbGxlZChhZ2VudHNEZXN0LCAnYWdlbnRzJykpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkIGFnZW50c2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdhZ2VudHMnKTtcbiAgICB9XG4gIH1cblxuICAvLyBDb3B5IENIQU5HRUxPRy5tZFxuICBjb25zdCBjaGFuZ2Vsb2dTcmMgPSBwYXRoLmpvaW4oc3JjLCAnQ0hBTkdFTE9HLm1kJyk7XG4gIGNvbnN0IGNoYW5nZWxvZ0Rlc3QgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnZXotYWdlbnRzJywgJ0NIQU5HRUxPRy5tZCcpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhjaGFuZ2Vsb2dTcmMpKSB7XG4gICAgZnMuY29weUZpbGVTeW5jKGNoYW5nZWxvZ1NyYywgY2hhbmdlbG9nRGVzdCk7XG4gICAgaWYgKHZlcmlmeUZpbGVJbnN0YWxsZWQoY2hhbmdlbG9nRGVzdCwgJ0NIQU5HRUxPRy5tZCcpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCBDSEFOR0VMT0cubWRgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmFpbHVyZXMucHVzaCgnQ0hBTkdFTE9HLm1kJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gV3JpdGUgVkVSU0lPTiBmaWxlXG4gIGNvbnN0IHZlcnNpb25EZXN0ID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2V6LWFnZW50cycsICdWRVJTSU9OJyk7XG4gIGZzLndyaXRlRmlsZVN5bmModmVyc2lvbkRlc3QsIHBrZy52ZXJzaW9uKTtcbiAgaWYgKHZlcmlmeUZpbGVJbnN0YWxsZWQodmVyc2lvbkRlc3QsICdWRVJTSU9OJykpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFdyb3RlIFZFUlNJT04gKCR7cGtnLnZlcnNpb259KWApO1xuICB9IGVsc2Uge1xuICAgIGZhaWx1cmVzLnB1c2goJ1ZFUlNJT04nKTtcbiAgfVxuXG4gIGlmICghaXNDb2RleCAmJiAhaXNDb3BpbG90ICYmICFpc1F3ZW4gJiYgIWlzS2ltaSkge1xuICAgIC8vIFdyaXRlIHBhY2thZ2UuanNvbiB0byBmb3JjZSBDb21tb25KUyBtb2RlIGZvciBFWiBzY3JpcHRzXG4gICAgLy8gUHJldmVudHMgXCJyZXF1aXJlIGlzIG5vdCBkZWZpbmVkXCIgZXJyb3JzIHdoZW4gcHJvamVjdCBoYXMgXCJ0eXBlXCI6IFwibW9kdWxlXCJcbiAgICAvLyBOb2RlLmpzIHdhbGtzIHVwIGxvb2tpbmcgZm9yIHBhY2thZ2UuanNvbiAtIHRoaXMgc3RvcHMgaW5oZXJpdGFuY2UgZnJvbSBwcm9qZWN0XG4gICAgY29uc3QgcGtnSnNvbkRlc3QgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwa2dKc29uRGVzdCwgJ3tcInR5cGVcIjpcImNvbW1vbmpzXCJ9XFxuJyk7XG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBXcm90ZSBwYWNrYWdlLmpzb24gKENvbW1vbkpTIG1vZGUpYCk7XG5cbiAgICAvLyBDb3B5IGhvb2tzIGZyb20gZGlzdC8gKGJ1bmRsZWQgd2l0aCBkZXBlbmRlbmNpZXMpXG4gICAgLy8gVGVtcGxhdGUgcGF0aHMgZm9yIHRoZSB0YXJnZXQgcnVudGltZSAocmVwbGFjZXMgJy5jbGF1ZGUnIHdpdGggY29ycmVjdCBjb25maWcgZGlyKVxuICAgIGNvbnN0IGhvb2tzU3JjID0gcGF0aC5qb2luKHNyYywgJ2hvb2tzJywgJ2Rpc3QnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhob29rc1NyYykpIHtcbiAgICAgIGNvbnN0IGhvb2tzRGVzdCA9IHBhdGguam9pbih0YXJnZXREaXIsICdob29rcycpO1xuICAgICAgZnMubWtkaXJTeW5jKGhvb2tzRGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBjb25zdCBob29rRW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGhvb2tzU3JjKTtcbiAgICAgIGNvbnN0IGNvbmZpZ0RpclJlcGxhY2VtZW50ID0gZ2V0Q29uZmlnRGlyRnJvbUhvbWUocnVudGltZSwgaXNHbG9iYWwpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBob29rRW50cmllcykge1xuICAgICAgICBjb25zdCBzcmNGaWxlID0gcGF0aC5qb2luKGhvb2tzU3JjLCBlbnRyeSk7XG4gICAgICAgIGlmIChmcy5zdGF0U3luYyhzcmNGaWxlKS5pc0ZpbGUoKSkge1xuICAgICAgICAgIGNvbnN0IGRlc3RGaWxlID0gcGF0aC5qb2luKGhvb2tzRGVzdCwgZW50cnkpO1xuICAgICAgICAgIC8vIFRlbXBsYXRlIC5qcyBmaWxlcyB0byByZXBsYWNlICcuY2xhdWRlJyB3aXRoIHJ1bnRpbWUtc3BlY2lmaWMgY29uZmlnIGRpclxuICAgICAgICAgIGlmIChlbnRyeS5lbmRzV2l0aCgnLmpzJykpIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY0ZpbGUsICd1dGY4Jyk7XG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC8nXFwuY2xhdWRlJy9nLCBjb25maWdEaXJSZXBsYWNlbWVudCk7XG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RGaWxlLCBjb250ZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKHNyY0ZpbGUsIGRlc3RGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh2ZXJpZnlJbnN0YWxsZWQoaG9va3NEZXN0LCAnaG9va3MnKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCBob29rcyAoYnVuZGxlZClgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goJ2hvb2tzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGBcXG4gICR7eWVsbG93fUluc3RhbGxhdGlvbiBpbmNvbXBsZXRlISR7cmVzZXR9IEZhaWxlZDogJHtmYWlsdXJlcy5qb2luKCcsICcpfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIFdyaXRlIGZpbGUgbWFuaWZlc3QgZm9yIGZ1dHVyZSBtb2RpZmljYXRpb24gZGV0ZWN0aW9uXG4gIHdyaXRlTWFuaWZlc3QodGFyZ2V0RGlyLCBydW50aW1lKTtcbiAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBXcm90ZSBmaWxlIG1hbmlmZXN0ICgke01BTklGRVNUX05BTUV9KWApO1xuXG4gIC8vIFJlcG9ydCBhbnkgYmFja2VkLXVwIGxvY2FsIHBhdGNoZXNcbiAgcmVwb3J0TG9jYWxQYXRjaGVzKHRhcmdldERpciwgcnVudGltZSk7XG5cbiAgLy8gVmVyaWZ5IG5vIGxlYWtlZCAuY2xhdWRlIHBhdGhzIGluIG5vbi1DbGF1ZGUgcnVudGltZXNcbiAgaWYgKHJ1bnRpbWUgIT09ICdjbGF1ZGUnKSB7XG4gICAgY29uc3QgbGVha2VkUGF0aHM6IEFycmF5PHsgZmlsZTogc3RyaW5nOyBjb3VudDogbnVtYmVyIH0+ID0gW107XG4gICAgZnVuY3Rpb24gc2NhbkZvckxlYWtlZFBhdGhzKGRpcjogc3RyaW5nKSB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkgcmV0dXJuO1xuICAgICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgZW50cnkubmFtZSk7XG4gICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgc2NhbkZvckxlYWtlZFBhdGhzKGZ1bGxQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmICgoZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykgfHwgZW50cnkubmFtZS5lbmRzV2l0aCgnLnRvbWwnKSkgJiYgZW50cnkubmFtZSAhPT0gJ0NIQU5HRUxPRy5tZCcpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmOCcpO1xuICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBjb250ZW50Lm1hdGNoKC8oPzp+fFxcJEhPTUUpXFwvXFwuY2xhdWRlXFxiL2cpO1xuICAgICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICBsZWFrZWRQYXRocy5wdXNoKHsgZmlsZTogZnVsbFBhdGgucmVwbGFjZSh0YXJnZXREaXIgKyAnLycsICcnKSwgY291bnQ6IG1hdGNoZXMubGVuZ3RoIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBzY2FuRm9yTGVha2VkUGF0aHModGFyZ2V0RGlyKTtcbiAgICBpZiAobGVha2VkUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdG90YWxMZWFrcyA9IGxlYWtlZFBhdGhzLnJlZHVjZSgoc3VtLCBsKSA9PiBzdW0gKyBsLmNvdW50LCAwKTtcbiAgICAgIGNvbnNvbGUud2FybihgXFxuICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSAgRm91bmQgJHt0b3RhbExlYWtzfSB1bnJlcGxhY2VkIC5jbGF1ZGUgcGF0aCByZWZlcmVuY2UocykgaW4gJHtsZWFrZWRQYXRocy5sZW5ndGh9IGZpbGUocyk6YCk7XG4gICAgICBmb3IgKGNvbnN0IGxlYWsgb2YgbGVha2VkUGF0aHMuc2xpY2UoMCwgNSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgICAgICR7ZGltfSR7bGVhay5maWxlfSR7cmVzZXR9ICgke2xlYWsuY291bnR9KWApO1xuICAgICAgfVxuICAgICAgaWYgKGxlYWtlZFBhdGhzLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgICAgICR7ZGltfS4uLiBhbmQgJHtsZWFrZWRQYXRocy5sZW5ndGggLSA1fSBtb3JlIGZpbGUocykke3Jlc2V0fWApO1xuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKGAgICR7ZGltfVRoZXNlIHBhdGhzIG1heSBub3QgcmVzb2x2ZSBjb3JyZWN0bHkgZm9yICR7cnVudGltZUxhYmVsfS4ke3Jlc2V0fWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc0NvZGV4KSB7XG4gICAgLy8gR2VuZXJhdGUgQ29kZXggY29uZmlnLnRvbWwgYW5kIHBlci1hZ2VudCAudG9tbCBmaWxlc1xuICAgIGNvbnN0IGFnZW50Q291bnQgPSBpbnN0YWxsQ29kZXhDb25maWcodGFyZ2V0RGlyLCBhZ2VudHNTcmMpO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gR2VuZXJhdGVkIGNvbmZpZy50b21sIHdpdGggJHthZ2VudENvdW50fSBhZ2VudCByb2xlc2ApO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gR2VuZXJhdGVkICR7YWdlbnRDb3VudH0gYWdlbnQgLnRvbWwgY29uZmlnIGZpbGVzYCk7XG4gICAgcmV0dXJuIHsgc2V0dGluZ3NQYXRoOiBudWxsLCBzZXR0aW5nczogbnVsbCwgc3RhdHVzbGluZUNvbW1hbmQ6IG51bGwsIHJ1bnRpbWUgfTtcbiAgfVxuXG4gIGlmIChpc0NvcGlsb3QpIHtcbiAgICAvLyBHZW5lcmF0ZSBjb3BpbG90LWluc3RydWN0aW9ucy5tZFxuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsICdlei1hZ2VudHMnLCAndGVtcGxhdGVzJywgJ2NvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kJyk7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zUGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb3BpbG90LWluc3RydWN0aW9ucy5tZCcpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZnMucmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIG1lcmdlQ29waWxvdEluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnNQYXRoLCB0ZW1wbGF0ZSk7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEdlbmVyYXRlZCBjb3BpbG90LWluc3RydWN0aW9ucy5tZGApO1xuICAgIH1cbiAgICAvLyBDb3BpbG90OiBubyBzZXR0aW5ncy5qc29uLCBubyBob29rcywgbm8gc3RhdHVzbGluZSAobGlrZSBDb2RleClcbiAgICByZXR1cm4geyBzZXR0aW5nc1BhdGg6IG51bGwsIHNldHRpbmdzOiBudWxsLCBzdGF0dXNsaW5lQ29tbWFuZDogbnVsbCwgcnVudGltZSB9O1xuICB9XG5cbiAgaWYgKGlzUXdlbiB8fCBpc0tpbWkpIHtcbiAgICAvLyBRd2VuL0tpbWk6IG5vIHNldHRpbmdzLmpzb24gaG9va3MsIG5vIHN0YXR1c2xpbmUgKGxpa2UgQ29kZXgvQ29waWxvdClcbiAgICAvLyBTa2lsbHMgYXJlIGluc3RhbGxlZCBkaXJlY3RseSBpbiBza2lsbHMvZXotKi9TS0lMTC5tZFxuICAgIHJldHVybiB7IHNldHRpbmdzUGF0aDogbnVsbCwgc2V0dGluZ3M6IG51bGwsIHN0YXR1c2xpbmVDb21tYW5kOiBudWxsLCBydW50aW1lIH07XG4gIH1cblxuICAvLyBDb25maWd1cmUgc3RhdHVzbGluZSBhbmQgaG9va3MgaW4gc2V0dGluZ3MuanNvblxuICAvLyBHZW1pbmkgdXNlcyBBZnRlclRvb2wgaW5zdGVhZCBvZiBQb3N0VG9vbFVzZSBmb3IgcG9zdC10b29sIGhvb2tzXG4gIGNvbnN0IHBvc3RUb29sRXZlbnQgPSBydW50aW1lID09PSAnZ2VtaW5pJyA/ICdBZnRlclRvb2wnIDogJ1Bvc3RUb29sVXNlJztcbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NldHRpbmdzLmpzb24nKTtcbiAgY29uc3Qgc2V0dGluZ3MgPSBjbGVhbnVwT3JwaGFuZWRIb29rcyhyZWFkU2V0dGluZ3Moc2V0dGluZ3NQYXRoKSk7XG4gIGNvbnN0IHN0YXR1c2xpbmVDb21tYW5kID0gaXNHbG9iYWxcbiAgICA/IGJ1aWxkSG9va0NvbW1hbmQodGFyZ2V0RGlyLCAnZXotc3RhdHVzbGluZS5qcycpXG4gICAgOiAnbm9kZSAnICsgZGlyTmFtZSArICcvaG9va3MvZXotc3RhdHVzbGluZS5qcyc7XG4gIGNvbnN0IHVwZGF0ZUNoZWNrQ29tbWFuZCA9IGlzR2xvYmFsXG4gICAgPyBidWlsZEhvb2tDb21tYW5kKHRhcmdldERpciwgJ2V6LWNoZWNrLXVwZGF0ZS5qcycpXG4gICAgOiAnbm9kZSAnICsgZGlyTmFtZSArICcvaG9va3MvZXotY2hlY2stdXBkYXRlLmpzJztcbiAgY29uc3QgY29udGV4dE1vbml0b3JDb21tYW5kID0gaXNHbG9iYWxcbiAgICA/IGJ1aWxkSG9va0NvbW1hbmQodGFyZ2V0RGlyLCAnZXotY29udGV4dC1tb25pdG9yLmpzJylcbiAgICA6ICdub2RlICcgKyBkaXJOYW1lICsgJy9ob29rcy9lei1jb250ZXh0LW1vbml0b3IuanMnO1xuXG4gIC8vIEVuYWJsZSBleHBlcmltZW50YWwgYWdlbnRzIGZvciBHZW1pbmkgQ0xJIChyZXF1aXJlZCBmb3IgY3VzdG9tIHN1Yi1hZ2VudHMpXG4gIGlmIChpc0dlbWluaSkge1xuICAgIGlmICghc2V0dGluZ3MuZXhwZXJpbWVudGFsKSB7XG4gICAgICBzZXR0aW5ncy5leHBlcmltZW50YWwgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFzZXR0aW5ncy5leHBlcmltZW50YWwuZW5hYmxlQWdlbnRzKSB7XG4gICAgICBzZXR0aW5ncy5leHBlcmltZW50YWwuZW5hYmxlQWdlbnRzID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gRW5hYmxlZCBleHBlcmltZW50YWwgYWdlbnRzYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29uZmlndXJlIFNlc3Npb25TdGFydCBob29rIGZvciB1cGRhdGUgY2hlY2tpbmcgKHNraXAgZm9yIG9wZW5jb2RlKVxuICBpZiAoIWlzT3BlbmNvZGUpIHtcbiAgICBpZiAoIXNldHRpbmdzLmhvb2tzKSB7XG4gICAgICBzZXR0aW5ncy5ob29rcyA9IHt9O1xuICAgIH1cbiAgICBpZiAoIXNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydCkge1xuICAgICAgc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0ID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgaGFzRXpVcGRhdGVIb29rID0gc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0LnNvbWUoZW50cnkgPT5cbiAgICAgIGVudHJ5Lmhvb2tzICYmIGVudHJ5Lmhvb2tzLnNvbWUoaCA9PiBoLmNvbW1hbmQgJiYgaC5jb21tYW5kLmluY2x1ZGVzKCdlei1jaGVjay11cGRhdGUnKSlcbiAgICApO1xuXG4gICAgaWYgKCFoYXNFelVwZGF0ZUhvb2spIHtcbiAgICAgIHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5wdXNoKHtcbiAgICAgICAgaG9va3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnY29tbWFuZCcsXG4gICAgICAgICAgICBjb21tYW5kOiB1cGRhdGVDaGVja0NvbW1hbmRcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBDb25maWd1cmVkIHVwZGF0ZSBjaGVjayBob29rYCk7XG4gICAgfVxuXG4gICAgLy8gQ29uZmlndXJlIHBvc3QtdG9vbCBob29rIGZvciBjb250ZXh0IHdpbmRvdyBtb25pdG9yaW5nXG4gICAgaWYgKCFzZXR0aW5ncy5ob29rc1twb3N0VG9vbEV2ZW50XSkge1xuICAgICAgc2V0dGluZ3MuaG9va3NbcG9zdFRvb2xFdmVudF0gPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNDb250ZXh0TW9uaXRvckhvb2sgPSBzZXR0aW5ncy5ob29rc1twb3N0VG9vbEV2ZW50XS5zb21lKGVudHJ5ID0+XG4gICAgICBlbnRyeS5ob29rcyAmJiBlbnRyeS5ob29rcy5zb21lKGggPT4gaC5jb21tYW5kICYmIGguY29tbWFuZC5pbmNsdWRlcygnZXotY29udGV4dC1tb25pdG9yJykpXG4gICAgKTtcblxuICAgIGlmICghaGFzQ29udGV4dE1vbml0b3JIb29rKSB7XG4gICAgICBzZXR0aW5ncy5ob29rc1twb3N0VG9vbEV2ZW50XS5wdXNoKHtcbiAgICAgICAgaG9va3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnY29tbWFuZCcsXG4gICAgICAgICAgICBjb21tYW5kOiBjb250ZXh0TW9uaXRvckNvbW1hbmRcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBDb25maWd1cmVkIGNvbnRleHQgd2luZG93IG1vbml0b3IgaG9va2ApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHNldHRpbmdzUGF0aCwgc2V0dGluZ3MsIHN0YXR1c2xpbmVDb21tYW5kLCBydW50aW1lIH07XG59XG5cbi8qKlxuICogQXBwbHkgc3RhdHVzbGluZSBjb25maWcsIHRoZW4gcHJpbnQgY29tcGxldGlvbiBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGZpbmlzaEluc3RhbGwoc2V0dGluZ3NQYXRoLCBzZXR0aW5ncywgc3RhdHVzbGluZUNvbW1hbmQsIHNob3VsZEluc3RhbGxTdGF0dXNsaW5lLCBydW50aW1lID0gJ2NsYXVkZScsIGlzR2xvYmFsID0gdHJ1ZSkge1xuICBjb25zdCBpc09wZW5jb2RlID0gcnVudGltZSA9PT0gJ29wZW5jb2RlJztcbiAgY29uc3QgaXNDb2RleCA9IHJ1bnRpbWUgPT09ICdjb2RleCc7XG4gIGNvbnN0IGlzQ29waWxvdCA9IHJ1bnRpbWUgPT09ICdjb3BpbG90JztcbiAgY29uc3QgaXNRd2VuID0gcnVudGltZSA9PT0gJ3F3ZW4nO1xuICBjb25zdCBpc0tpbWkgPSBydW50aW1lID09PSAna2ltaSc7XG5cbiAgaWYgKHNob3VsZEluc3RhbGxTdGF0dXNsaW5lICYmICFpc09wZW5jb2RlICYmICFpc0NvZGV4ICYmICFpc0NvcGlsb3QgJiYgIWlzUXdlbiAmJiAhaXNLaW1pKSB7XG4gICAgc2V0dGluZ3Muc3RhdHVzTGluZSA9IHtcbiAgICAgIHR5cGU6ICdjb21tYW5kJyxcbiAgICAgIGNvbW1hbmQ6IHN0YXR1c2xpbmVDb21tYW5kXG4gICAgfTtcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENvbmZpZ3VyZWQgc3RhdHVzbGluZWApO1xuICB9XG5cbiAgLy8gV3JpdGUgc2V0dGluZ3Mgd2hlbiBydW50aW1lIHN1cHBvcnRzIHNldHRpbmdzLmpzb25cbiAgaWYgKCFpc0NvZGV4ICYmICFpc0NvcGlsb3QgJiYgIWlzUXdlbiAmJiAhaXNLaW1pKSB7XG4gICAgd3JpdGVTZXR0aW5ncyhzZXR0aW5nc1BhdGgsIHNldHRpbmdzKTtcbiAgfVxuXG4gIC8vIENvbmZpZ3VyZSBPcGVuQ29kZSBwZXJtaXNzaW9uc1xuICBpZiAoaXNPcGVuY29kZSkge1xuICAgIGNvbmZpZ3VyZU9wZW5jb2RlUGVybWlzc2lvbnMoaXNHbG9iYWwpO1xuICB9XG5cbiAgbGV0IHByb2dyYW0gPSAnQ2xhdWRlIENvZGUnO1xuICBpZiAocnVudGltZSA9PT0gJ29wZW5jb2RlJykgcHJvZ3JhbSA9ICdPcGVuQ29kZSc7XG4gIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykgcHJvZ3JhbSA9ICdHZW1pbmknO1xuICBpZiAocnVudGltZSA9PT0gJ2NvZGV4JykgcHJvZ3JhbSA9ICdDb2RleCc7XG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHByb2dyYW0gPSAnQ29waWxvdCc7XG4gIGlmIChydW50aW1lID09PSAncXdlbicpIHByb2dyYW0gPSAnUXdlbiBDb2RlJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdraW1pJykgcHJvZ3JhbSA9ICdLaW1pIENvZGUnO1xuXG4gIGxldCBjb21tYW5kID0gJy9lejpuZXctcHJvamVjdCc7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnIHx8IHJ1bnRpbWUgPT09ICdnZW1pbmknIHx8IHJ1bnRpbWUgPT09ICdjb3BpbG90JyB8fCBydW50aW1lID09PSAncXdlbicgfHwgcnVudGltZSA9PT0gJ2tpbWknKSBjb21tYW5kID0gJy9lei1uZXctcHJvamVjdCc7XG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSBjb21tYW5kID0gJyRlei1uZXctcHJvamVjdCc7XG4gIGNvbnNvbGUubG9nKGBcbiAgJHtncmVlbn1Eb25lISR7cmVzZXR9IE9wZW4gYSBibGFuayBkaXJlY3RvcnkgaW4gJHtwcm9ncmFtfSBhbmQgcnVuICR7Y3lhbn0ke2NvbW1hbmR9JHtyZXNldH0uXG5cbiAgJHtjeWFufUpvaW4gdGhlIGNvbW11bml0eToke3Jlc2V0fSBodHRwczovL2Rpc2NvcmQuZ2cvZXotYWdlbnRzXG5gKTtcbn1cblxuLyoqXG4gKiBIYW5kbGUgc3RhdHVzbGluZSBjb25maWd1cmF0aW9uIHdpdGggb3B0aW9uYWwgcHJvbXB0XG4gKi9cbmZ1bmN0aW9uIGhhbmRsZVN0YXR1c2xpbmUoc2V0dGluZ3MsIGlzSW50ZXJhY3RpdmUsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGhhc0V4aXN0aW5nID0gc2V0dGluZ3Muc3RhdHVzTGluZSAhPSBudWxsO1xuXG4gIGlmICghaGFzRXhpc3RpbmcpIHtcbiAgICBjYWxsYmFjayh0cnVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZm9yY2VTdGF0dXNsaW5lKSB7XG4gICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFpc0ludGVyYWN0aXZlKSB7XG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gU2tpcHBpbmcgc3RhdHVzbGluZSAoYWxyZWFkeSBjb25maWd1cmVkKWApO1xuICAgIGNvbnNvbGUubG9nKGAgICAgVXNlICR7Y3lhbn0tLWZvcmNlLXN0YXR1c2xpbmUke3Jlc2V0fSB0byByZXBsYWNlXFxuYCk7XG4gICAgY2FsbGJhY2soZmFsc2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nQ21kID0gc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kIHx8IHNldHRpbmdzLnN0YXR1c0xpbmUudXJsIHx8ICcoY3VzdG9tKSc7XG5cbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXRcbiAgfSk7XG5cbiAgY29uc29sZS5sb2coYFxuICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBFeGlzdGluZyBzdGF0dXNsaW5lIGRldGVjdGVkXFxuXG4gIFlvdXIgY3VycmVudCBzdGF0dXNsaW5lOlxuICAgICR7ZGltfWNvbW1hbmQ6ICR7ZXhpc3RpbmdDbWR9JHtyZXNldH1cblxuICBFWl9BZ2VudHMgaW5jbHVkZXMgYSBzdGF0dXNsaW5lIHNob3dpbmc6XG4gICAgXHUyMDIyIE1vZGVsIG5hbWVcbiAgICBcdTIwMjIgQ3VycmVudCB0YXNrIChmcm9tIHRvZG8gbGlzdClcbiAgICBcdTIwMjIgQ29udGV4dCB3aW5kb3cgdXNhZ2UgKGNvbG9yLWNvZGVkKVxuXG4gICR7Y3lhbn0xJHtyZXNldH0pIEtlZXAgZXhpc3RpbmdcbiAgJHtjeWFufTIke3Jlc2V0fSkgUmVwbGFjZSB3aXRoIEVaX0FnZW50cyBzdGF0dXNsaW5lXG5gKTtcblxuICBybC5xdWVzdGlvbihgICBDaG9pY2UgJHtkaW19WzFdJHtyZXNldH06IGAsIChhbnN3ZXIpID0+IHtcbiAgICBybC5jbG9zZSgpO1xuICAgIGNvbnN0IGNob2ljZSA9IGFuc3dlci50cmltKCkgfHwgJzEnO1xuICAgIGNhbGxiYWNrKGNob2ljZSA9PT0gJzInKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUHJvbXB0IGZvciBydW50aW1lIHNlbGVjdGlvblxuICovXG5mdW5jdGlvbiBwcm9tcHRSdW50aW1lKGNhbGxiYWNrKSB7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0XG4gIH0pO1xuXG4gIGxldCBhbnN3ZXJlZCA9IGZhbHNlO1xuXG4gIHJsLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBpZiAoIWFuc3dlcmVkKSB7XG4gICAgICBhbnN3ZXJlZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmxvZyhgXFxuICAke3llbGxvd31JbnN0YWxsYXRpb24gY2FuY2VsbGVkJHtyZXNldH1cXG5gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnNvbGUubG9nKGAgICR7eWVsbG93fVdoaWNoIHJ1bnRpbWUocykgd291bGQgeW91IGxpa2UgdG8gaW5zdGFsbCBmb3I/JHtyZXNldH1cXG5cXG4gICR7Y3lhbn0xJHtyZXNldH0pIENsYXVkZSBDb2RlICR7ZGltfSh+Ly5jbGF1ZGUpJHtyZXNldH1cbiAgJHtjeWFufTIke3Jlc2V0fSkgT3BlbkNvZGUgICAgJHtkaW19KH4vLmNvbmZpZy9vcGVuY29kZSkke3Jlc2V0fSAtIG9wZW4gc291cmNlLCBmcmVlIG1vZGVsc1xuICAke2N5YW59MyR7cmVzZXR9KSBHZW1pbmkgICAgICAke2RpbX0ofi8uZ2VtaW5pKSR7cmVzZXR9XG4gICR7Y3lhbn00JHtyZXNldH0pIENvZGV4ICAgICAgICR7ZGltfSh+Ly5jb2RleCkke3Jlc2V0fVxuICAke2N5YW59NSR7cmVzZXR9KSBDb3BpbG90ICAgICAke2RpbX0ofi8uY29waWxvdCkke3Jlc2V0fVxuICAke2N5YW59NiR7cmVzZXR9KSBRd2VuIENvZGUgICAke2RpbX0ofi8ucXdlbikke3Jlc2V0fSAtIEFsaWJhYmEgUXdlbiBvZmZpY2lhbCBDTElcbiAgJHtjeWFufTcke3Jlc2V0fSkgS2ltaSBDb2RlICAgJHtkaW19KH4vLmtpbWkpJHtyZXNldH0gLSBNb29uc2hvdCBLaW1pIG9mZmljaWFsIENMSVxuICAke2N5YW59OCR7cmVzZXR9KSBBbGwgJHtkaW19KGFsbCA3IHJ1bnRpbWVzIGFib3ZlKSR7cmVzZXR9XG5cbiAgJHtkaW19Tm90ZTogT3BlbkFJIGFuZCBBbnRocm9waWMgYXJlIG1vZGVsIHByb3ZpZGVycyBjb25maWd1cmVkIHdpdGhpbiBlYWNoIHJ1bnRpbWUncyBzZXR0aW5ncyxcbiAgbm90IHNlcGFyYXRlIENMSSBydW50aW1lcy4gU2VlIFJFQURNRS5tZCBmb3IgbW9kZWwgY29uZmlndXJhdGlvbi4ke3Jlc2V0fVxuYCk7XG5cbiAgcmwucXVlc3Rpb24oYCAgQ2hvaWNlICR7ZGltfVsxXSR7cmVzZXR9OiBgLCAoYW5zd2VyKSA9PiB7XG4gICAgYW5zd2VyZWQgPSB0cnVlO1xuICAgIHJsLmNsb3NlKCk7XG4gICAgY29uc3QgY2hvaWNlID0gYW5zd2VyLnRyaW0oKSB8fCAnMSc7XG4gICAgaWYgKGNob2ljZSA9PT0gJzgnKSB7XG4gICAgICBjYWxsYmFjayhbJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCAnY29waWxvdCcsICdxd2VuJywgJ2tpbWknXSk7XG4gICAgfSBlbHNlIGlmIChjaG9pY2UgPT09ICc3Jykge1xuICAgICAgY2FsbGJhY2soWydraW1pJ10pO1xuICAgIH0gZWxzZSBpZiAoY2hvaWNlID09PSAnNicpIHtcbiAgICAgIGNhbGxiYWNrKFsncXdlbiddKTtcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzUnKSB7XG4gICAgICBjYWxsYmFjayhbJ2NvcGlsb3QnXSk7XG4gICAgfSBlbHNlIGlmIChjaG9pY2UgPT09ICc0Jykge1xuICAgICAgY2FsbGJhY2soWydjb2RleCddKTtcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzMnKSB7XG4gICAgICBjYWxsYmFjayhbJ2dlbWluaSddKTtcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzInKSB7XG4gICAgICBjYWxsYmFjayhbJ29wZW5jb2RlJ10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayhbJ2NsYXVkZSddKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFByb21wdCBmb3IgaW5zdGFsbCBsb2NhdGlvblxuICovXG5mdW5jdGlvbiBwcm9tcHRMb2NhdGlvbihydW50aW1lcykge1xuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31Ob24taW50ZXJhY3RpdmUgdGVybWluYWwgZGV0ZWN0ZWQsIGRlZmF1bHRpbmcgdG8gZ2xvYmFsIGluc3RhbGwke3Jlc2V0fVxcbmApO1xuICAgIGluc3RhbGxBbGxSdW50aW1lcyhydW50aW1lcywgdHJ1ZSwgZmFsc2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0XG4gIH0pO1xuXG4gIGxldCBhbnN3ZXJlZCA9IGZhbHNlO1xuXG4gIHJsLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBpZiAoIWFuc3dlcmVkKSB7XG4gICAgICBhbnN3ZXJlZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmxvZyhgXFxuICAke3llbGxvd31JbnN0YWxsYXRpb24gY2FuY2VsbGVkJHtyZXNldH1cXG5gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHBhdGhFeGFtcGxlcyA9IHJ1bnRpbWVzLm1hcChyID0+IHtcbiAgICBjb25zdCBnbG9iYWxQYXRoID0gZ2V0R2xvYmFsRGlyKHIsIGV4cGxpY2l0Q29uZmlnRGlyKTtcbiAgICByZXR1cm4gZ2xvYmFsUGF0aC5yZXBsYWNlKG9zLmhvbWVkaXIoKSwgJ34nKTtcbiAgfSkuam9pbignLCAnKTtcblxuICBjb25zdCBsb2NhbEV4YW1wbGVzID0gcnVudGltZXMubWFwKHIgPT4gYC4vJHtnZXREaXJOYW1lKHIpfWApLmpvaW4oJywgJyk7XG5cbiAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9V2hlcmUgd291bGQgeW91IGxpa2UgdG8gaW5zdGFsbD8ke3Jlc2V0fVxcblxcbiAgJHtjeWFufTEke3Jlc2V0fSkgR2xvYmFsICR7ZGltfSgke3BhdGhFeGFtcGxlc30pJHtyZXNldH0gLSBhdmFpbGFibGUgaW4gYWxsIHByb2plY3RzXG4gICR7Y3lhbn0yJHtyZXNldH0pIExvY2FsICAke2RpbX0oJHtsb2NhbEV4YW1wbGVzfSkke3Jlc2V0fSAtIHRoaXMgcHJvamVjdCBvbmx5XG5gKTtcblxuICBybC5xdWVzdGlvbihgICBDaG9pY2UgJHtkaW19WzFdJHtyZXNldH06IGAsIChhbnN3ZXIpID0+IHtcbiAgICBhbnN3ZXJlZCA9IHRydWU7XG4gICAgcmwuY2xvc2UoKTtcbiAgICBjb25zdCBjaG9pY2UgPSBhbnN3ZXIudHJpbSgpIHx8ICcxJztcbiAgICBjb25zdCBpc0dsb2JhbCA9IGNob2ljZSAhPT0gJzInO1xuICAgIGluc3RhbGxBbGxSdW50aW1lcyhydW50aW1lcywgaXNHbG9iYWwsIHRydWUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIEVaX0FnZW50cyBmb3IgYWxsIHNlbGVjdGVkIHJ1bnRpbWVzXG4gKi9cbmZ1bmN0aW9uIGluc3RhbGxBbGxSdW50aW1lcyhydW50aW1lczogc3RyaW5nW10sIGlzR2xvYmFsOiBib29sZWFuLCBpc0ludGVyYWN0aXZlOiBib29sZWFuKSB7XG4gIGNvbnN0IHJlc3VsdHM6IEFycmF5PHsgc2V0dGluZ3NQYXRoOiBzdHJpbmcgfCBudWxsOyBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsOyBzdGF0dXNsaW5lQ29tbWFuZDogc3RyaW5nIHwgbnVsbDsgcnVudGltZTogc3RyaW5nIH0+ID0gW107XG5cbiAgZm9yIChjb25zdCBydW50aW1lIG9mIHJ1bnRpbWVzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gaW5zdGFsbChpc0dsb2JhbCwgcnVudGltZSk7XG4gICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gIH1cblxuICBjb25zdCBzdGF0dXNsaW5lUnVudGltZXMgPSBbJ2NsYXVkZScsICdnZW1pbmknXTtcbiAgY29uc3Qgc3RhdHVzbGluZVJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcihyID0+IHN0YXR1c2xpbmVSdW50aW1lcy5pbmNsdWRlcyhyLnJ1bnRpbWUpKTtcblxuICAvLyBIYW5kbGUgc3RhdHVzbGluZSBwZXItcnVudGltZSB0byBhdm9pZCBjb25mbGljdHNcbiAgLy8gRWFjaCBydW50aW1lIHdpdGggc2V0dGluZ3MuanNvbiBnZXRzIGl0cyBvd24gc3RhdHVzbGluZSBwcm9tcHRcbiAgY29uc3QgZmluYWxpemVQZXJSdW50aW1lID0gKHJ1bnRpbWVSZXN1bHQ6IHsgc2V0dGluZ3NQYXRoOiBzdHJpbmcgfCBudWxsOyBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsOyBzdGF0dXNsaW5lQ29tbWFuZDogc3RyaW5nIHwgbnVsbDsgcnVudGltZTogc3RyaW5nIH0sIHNob3VsZEluc3RhbGxTdGF0dXNsaW5lOiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgdXNlU3RhdHVzbGluZSA9IHN0YXR1c2xpbmVSdW50aW1lcy5pbmNsdWRlcyhydW50aW1lUmVzdWx0LnJ1bnRpbWUpICYmIHNob3VsZEluc3RhbGxTdGF0dXNsaW5lO1xuICAgIGZpbmlzaEluc3RhbGwoXG4gICAgICBydW50aW1lUmVzdWx0LnNldHRpbmdzUGF0aCxcbiAgICAgIHJ1bnRpbWVSZXN1bHQuc2V0dGluZ3MsXG4gICAgICBydW50aW1lUmVzdWx0LnN0YXR1c2xpbmVDb21tYW5kLFxuICAgICAgdXNlU3RhdHVzbGluZSxcbiAgICAgIHJ1bnRpbWVSZXN1bHQucnVudGltZSxcbiAgICAgIGlzR2xvYmFsXG4gICAgKTtcbiAgfTtcblxuICBpZiAoc3RhdHVzbGluZVJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gTm8gcnVudGltZXMgc3VwcG9ydCBzdGF0dXNsaW5lIC0gZmluYWxpemUgYWxsIHdpdGhvdXQgc3RhdHVzbGluZVxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgIGZpbmFsaXplUGVyUnVudGltZShyZXN1bHQsIGZhbHNlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RhdHVzbGluZVJlc3VsdHMubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gU2luZ2xlIHJ1bnRpbWUgd2l0aCBzdGF0dXNsaW5lIHN1cHBvcnQgLSBwcm9tcHQgb25jZVxuICAgIGNvbnN0IHNpbmdsZVJlc3VsdCA9IHN0YXR1c2xpbmVSZXN1bHRzWzBdO1xuICAgIGlmIChzaW5nbGVSZXN1bHQpIHtcbiAgICAgIGhhbmRsZVN0YXR1c2xpbmUoc2luZ2xlUmVzdWx0LnNldHRpbmdzLCBpc0ludGVyYWN0aXZlLCAoc2hvdWxkSW5zdGFsbCkgPT4ge1xuICAgICAgICBmaW5hbGl6ZVBlclJ1bnRpbWUoc2luZ2xlUmVzdWx0LCBzaG91bGRJbnN0YWxsKTtcbiAgICAgICAgLy8gRmluYWxpemUgb3RoZXIgcnVudGltZXMgd2l0aG91dCBzdGF0dXNsaW5lXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICBpZiAoIXN0YXR1c2xpbmVSdW50aW1lcy5pbmNsdWRlcyhyZXN1bHQucnVudGltZSkpIHtcbiAgICAgICAgICAgIGZpbmFsaXplUGVyUnVudGltZShyZXN1bHQsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBNdWx0aXBsZSBydW50aW1lcyB3aXRoIHN0YXR1c2xpbmUgc3VwcG9ydCAtIHByb21wdCBmb3IgZWFjaFxuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICAgIGNvbnN0IHN0YXR1c2xpbmVDaG9pY2VzID0gbmV3IEFycmF5KHN0YXR1c2xpbmVSZXN1bHRzLmxlbmd0aCkuZmlsbChmYWxzZSk7XG5cbiAgICBjb25zdCBwcm9tcHROZXh0U3RhdHVzbGluZSA9ICgpID0+IHtcbiAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gc3RhdHVzbGluZVJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIEFsbCBzdGF0dXNsaW5lIHByb21wdHMgZG9uZSAtIGZpbmFsaXplIGFsbCBydW50aW1lc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzW2ldO1xuICAgICAgICAgIGlmICghcmVzdWx0KSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBzdGF0dXNsaW5lSW5kZXggPSBzdGF0dXNsaW5lUmVzdWx0cy5maW5kSW5kZXgociA9PiByLnJ1bnRpbWUgPT09IHJlc3VsdC5ydW50aW1lKTtcbiAgICAgICAgICBjb25zdCBzaG91bGRJbnN0YWxsID0gc3RhdHVzbGluZUluZGV4ICE9PSAtMSA/IHN0YXR1c2xpbmVDaG9pY2VzW3N0YXR1c2xpbmVJbmRleF0gOiBmYWxzZTtcbiAgICAgICAgICBmaW5hbGl6ZVBlclJ1bnRpbWUocmVzdWx0LCBzaG91bGRJbnN0YWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRSZXN1bHQgPSBzdGF0dXNsaW5lUmVzdWx0c1tjdXJyZW50SW5kZXhdO1xuICAgICAgaWYgKGN1cnJlbnRSZXN1bHQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFJ1bnRpbWVJbmRleCA9IGN1cnJlbnRJbmRleDtcbiAgICAgICAgaGFuZGxlU3RhdHVzbGluZShjdXJyZW50UmVzdWx0LnNldHRpbmdzLCBpc0ludGVyYWN0aXZlLCAoc2hvdWxkSW5zdGFsbCkgPT4ge1xuICAgICAgICAgIHN0YXR1c2xpbmVDaG9pY2VzW2N1cnJlbnRSdW50aW1lSW5kZXhdID0gc2hvdWxkSW5zdGFsbDtcbiAgICAgICAgICBjdXJyZW50SW5kZXgrKztcbiAgICAgICAgICBwcm9tcHROZXh0U3RhdHVzbGluZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvbXB0TmV4dFN0YXR1c2xpbmUoKTtcbiAgfVxufVxuXG4vLyBUZXN0LW9ubHkgZXhwb3J0cyBcdTIwMTQgc2tpcCBtYWluIGxvZ2ljIHdoZW4gbG9hZGVkIGFzIGEgbW9kdWxlIGZvciB0ZXN0aW5nXG5jb25zdCB0ZXN0RXhwb3J0cyA9IHtcbiAgICBnZXRDb2RleFNraWxsQWRhcHRlckhlYWRlcixcbiAgICBjb252ZXJ0Q2xhdWRlVG9HZW1pbmlBZ2VudCxcbiAgICBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvZGV4QWdlbnQsXG4gICAgZ2VuZXJhdGVDb2RleEFnZW50VG9tbCxcbiAgICBnZW5lcmF0ZUNvZGV4Q29uZmlnQmxvY2ssXG4gICAgc3RyaXBFekFnZW50c0Zyb21Db2RleENvbmZpZyxcbiAgICBtZXJnZUNvZGV4Q29uZmlnLFxuICAgIGluc3RhbGxDb2RleENvbmZpZyxcbiAgICBjb252ZXJ0Q2xhdWRlQ29tbWFuZFRvQ29kZXhTa2lsbCxcbiAgICBFWl9DT0RFWF9NQVJLRVIsXG4gICAgQ09ERVhfQUdFTlRfU0FOREJPWCxcbiAgICBnZXREaXJOYW1lLFxuICAgIGdldEdsb2JhbERpcixcbiAgICBnZXRDb25maWdEaXJGcm9tSG9tZSxcbiAgICBjbGF1ZGVUb0NvcGlsb3RUb29scyxcbiAgICBjb252ZXJ0Q29waWxvdFRvb2xOYW1lLFxuICAgIGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50LFxuICAgIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db3BpbG90U2tpbGwsXG4gICAgY29udmVydENsYXVkZUFnZW50VG9Db3BpbG90QWdlbnQsXG4gICAgY29weUNvbW1hbmRzQXNDb3BpbG90U2tpbGxzLFxuICAgIEVaX0NPUElMT1RfSU5TVFJVQ1RJT05TX01BUktFUixcbiAgICBFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19DTE9TRV9NQVJLRVIsXG4gICAgbWVyZ2VDb3BpbG90SW5zdHJ1Y3Rpb25zLFxuICAgIHN0cmlwRXpBZ2VudHNGcm9tQ29waWxvdEluc3RydWN0aW9ucyxcbiAgICB3cml0ZU1hbmlmZXN0LFxuICAgIHJlcG9ydExvY2FsUGF0Y2hlcyxcbiAgICBjb252ZXJ0Q2xhdWRlVG9Rd2VuU2tpbGwsXG4gICAgY29udmVydENsYXVkZVRvUXdlbkFnZW50LFxuICAgIGNvbnZlcnRDbGF1ZGVUb0tpbWlTa2lsbCxcbiAgICBjb252ZXJ0Q2xhdWRlVG9LaW1pQWdlbnQsXG4gIH07XG5cbi8vIE1haW4gbG9naWNcbmlmIChoYXNHbG9iYWwgJiYgaGFzTG9jYWwpIHtcbiAgY29uc29sZS5lcnJvcihgICAke3llbGxvd31DYW5ub3Qgc3BlY2lmeSBib3RoIC0tZ2xvYmFsIGFuZCAtLWxvY2FsJHtyZXNldH1gKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSBlbHNlIGlmIChleHBsaWNpdENvbmZpZ0RpciAmJiBoYXNMb2NhbCkge1xuICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fUNhbm5vdCB1c2UgLS1jb25maWctZGlyIHdpdGggLS1sb2NhbCR7cmVzZXR9YCk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0gZWxzZSBpZiAoaGFzVW5pbnN0YWxsKSB7XG4gIGlmICghaGFzR2xvYmFsICYmICFoYXNMb2NhbCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYCAgJHt5ZWxsb3d9LS11bmluc3RhbGwgcmVxdWlyZXMgLS1nbG9iYWwgb3IgLS1sb2NhbCR7cmVzZXR9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIGNvbnN0IHJ1bnRpbWVzID0gc2VsZWN0ZWRSdW50aW1lcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRSdW50aW1lcyA6IFsnY2xhdWRlJ107XG4gIGZvciAoY29uc3QgcnVudGltZSBvZiBydW50aW1lcykge1xuICAgIHVuaW5zdGFsbChoYXNHbG9iYWwsIHJ1bnRpbWUpO1xuICB9XG59IGVsc2UgaWYgKHNlbGVjdGVkUnVudGltZXMubGVuZ3RoID4gMCkge1xuICBpZiAoIWhhc0dsb2JhbCAmJiAhaGFzTG9jYWwpIHtcbiAgICBwcm9tcHRMb2NhdGlvbihzZWxlY3RlZFJ1bnRpbWVzKTtcbiAgfSBlbHNlIHtcbiAgICBpbnN0YWxsQWxsUnVudGltZXMoc2VsZWN0ZWRSdW50aW1lcywgaGFzR2xvYmFsLCBmYWxzZSk7XG4gIH1cbn0gZWxzZSBpZiAoaGFzR2xvYmFsIHx8IGhhc0xvY2FsKSB7XG4gIC8vIERlZmF1bHQgdG8gQ2xhdWRlIGlmIG5vIHJ1bnRpbWUgc3BlY2lmaWVkIGJ1dCBsb2NhdGlvbiBpc1xuICBpbnN0YWxsQWxsUnVudGltZXMoWydjbGF1ZGUnXSwgaGFzR2xvYmFsLCBmYWxzZSk7XG59IGVsc2Uge1xuICAvLyBJbnRlcmFjdGl2ZVxuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31Ob24taW50ZXJhY3RpdmUgdGVybWluYWwgZGV0ZWN0ZWQsIGRlZmF1bHRpbmcgdG8gQ2xhdWRlIENvZGUgZ2xvYmFsIGluc3RhbGwke3Jlc2V0fVxcbmApO1xuICAgIGluc3RhbGxBbGxSdW50aW1lcyhbJ2NsYXVkZSddLCB0cnVlLCBmYWxzZSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvbXB0UnVudGltZSgocnVudGltZXMpID0+IHtcbiAgICAgIHByb21wdExvY2F0aW9uKHJ1bnRpbWVzKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBFeHBvcnQgZm9yIHRlc3RpbmdcbmV4cG9ydCB7IHRlc3RFeHBvcnRzIH07XG4iLCAie1xuICBcIm5hbWVcIjogXCJAaG93bGlsL2V6LWFnZW50c1wiLFxuICBcInZlcnNpb25cIjogXCI1LjAuMVwiLFxuICBcImRlc2NyaXB0aW9uXCI6IFwiRVogQWdlbnRzIFx1MjAxNCBNZXRhLXByb21wdGluZyB3aXRoIG11bHRpLW1vZGVsIHN1cHBvcnQgKFF3ZW4sIEtpbWksIE9wZW5BSSlcIixcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwic2lkZUVmZmVjdHNcIjogZmFsc2UsXG4gIFwiYmluXCI6IHtcbiAgICBcImV6LWFnZW50c1wiOiBcImRpc3QvYmluL2luc3RhbGwuanNcIixcbiAgICBcImV6LWFnZW50cy11cGRhdGVcIjogXCJkaXN0L2Jpbi91cGRhdGUuanNcIlxuICB9LFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9mYWN0b3JpZXNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvZmFjdG9yaWVzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9mYWN0b3JpZXMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL3N0cmF0ZWdpZXNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvc3RyYXRlZ2llcy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvc3RyYXRlZ2llcy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vYWRhcHRlcnNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvYWRhcHRlcnMvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbGliL2FkYXB0ZXJzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9vYnNlcnZlclwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9vYnNlcnZlci9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvb2JzZXJ2ZXIvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2RlY29yYXRvcnNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvZGVjb3JhdG9ycy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvZGVjb3JhdG9ycy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vZmFjYWRlc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9mYWNhZGVzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9mYWNhZGVzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9jb21tYW5kc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9jb21tYW5kcy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvY29tbWFuZHMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL3NlcnZpY2VzXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL3NlcnZpY2VzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9zZXJ2aWNlcy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vcmVwb3NpdG9yaWVzXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL3JlcG9zaXRvcmllcy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvcmVwb3NpdG9yaWVzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9mcFwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9mcC9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvZnAvaW5kZXguanNcIlxuICAgIH1cbiAgfSxcbiAgXCJtYWluXCI6IFwiLi9kaXN0L2luZGV4LmpzXCIsXG4gIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImRpc3RcIixcbiAgICBcImNvbW1hbmRzXCIsXG4gICAgXCJlei1hZ2VudHNcIixcbiAgICBcImFnZW50c1wiLFxuICAgIFwiaG9va3MvZGlzdFwiLFxuICAgIFwic2NyaXB0c1wiXG4gIF0sXG4gIFwia2V5d29yZHNcIjogW1xuICAgIFwiY2xhdWRlXCIsXG4gICAgXCJjbGF1ZGUtY29kZVwiLFxuICAgIFwiYWlcIixcbiAgICBcIm1ldGEtcHJvbXB0aW5nXCIsXG4gICAgXCJjb250ZXh0LWVuZ2luZWVyaW5nXCIsXG4gICAgXCJzcGVjLWRyaXZlbi1kZXZlbG9wbWVudFwiLFxuICAgIFwiZ2VtaW5pXCIsXG4gICAgXCJnZW1pbmktY2xpXCIsXG4gICAgXCJjb2RleFwiLFxuICAgIFwiY29kZXgtY2xpXCIsXG4gICAgXCJlei1hZ2VudHNcIixcbiAgICBcImFnZW50LW9yY2hlc3RyYXRpb25cIlxuICBdLFxuICBcImF1dGhvclwiOiBcIlRcdTAwQzJDSEVTXCIsXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9ob3dsaWwvZXotYWdlbnRzLmdpdFwiXG4gIH0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vaG93bGlsL2V6LWFnZW50c1wiLFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2hvd2xpbC9lei1hZ2VudHMvaXNzdWVzXCJcbiAgfSxcbiAgXCJlbmdpbmVzXCI6IHtcbiAgICBcIm5vZGVcIjogXCI+PTE2LjcuMFwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB0eXBlcy9taWNyb21hdGNoXCI6IFwiNC4wLjBcIixcbiAgICBcIkB0eXBlcy9ub2RlXCI6IFwiMjAuMC4wXCIsXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpblwiOiBcIjguNTcuMlwiLFxuICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlclwiOiBcIjguNTcuMlwiLFxuICAgIFwiYzhcIjogXCIxMS4wLjBcIixcbiAgICBcImNvbXBsZXhpdHktcmVwb3J0XCI6IFwiMi4wLjAtYWxwaGFcIixcbiAgICBcImRlcGVuZGVuY3ktY3J1aXNlclwiOiBcIjE3LjMuOVwiLFxuICAgIFwiZXNsaW50XCI6IFwiOC41Ny4wXCIsXG4gICAgXCJlc2xpbnQtcGx1Z2luLWNvbXBsZXhpdHlcIjogXCIxLjAuMlwiLFxuICAgIFwiZXNsaW50LXBsdWdpbi1zb25hcmpzXCI6IFwiNC4wLjJcIixcbiAgICBcImVzbGludC1wbHVnaW4tdHNkb2NcIjogXCIwLjUuMlwiLFxuICAgIFwiZXhwZWN0LXR5cGVcIjogXCIxLjMuMFwiLFxuICAgIFwiZmFzdC1jaGVja1wiOiBcIjMuMC4wXCIsXG4gICAgXCJnbG9iXCI6IFwiMTMuMC42XCIsXG4gICAgXCJodXNreVwiOiBcIjkuMS43XCIsXG4gICAgXCJqcy15YW1sXCI6IFwiNC4xLjFcIixcbiAgICBcImpzY3BkXCI6IFwiNC4wLjhcIixcbiAgICBcImpzZG9jXCI6IFwiNC4wLjJcIixcbiAgICBcIms2XCI6IFwiMC4wLjBcIixcbiAgICBcImxpbnQtc3RhZ2VkXCI6IFwiMTUuNS4yXCIsXG4gICAgXCJtYWRnZVwiOiBcIjguMC4wXCIsXG4gICAgXCJtYXJrZG93bmxpbnRcIjogXCIwLjQwLjBcIixcbiAgICBcInRzLW1vcnBoXCI6IFwiMjcuMC4yXCIsXG4gICAgXCJ0cy1ub2RlXCI6IFwiMTAuOS4wXCIsXG4gICAgXCJ0cy1wcnVuZVwiOiBcIjAuMTAuM1wiLFxuICAgIFwidHN1cFwiOiBcIjguMC4wXCIsXG4gICAgXCJ0eXBlZG9jXCI6IFwiMC4yOC4xOFwiLFxuICAgIFwidHlwZWRvYy1wbHVnaW4tbWlzc2luZy1leHBvcnRzXCI6IFwiNC4xLjJcIixcbiAgICBcInR5cGVzY3JpcHRcIjogXCI1LjQuNVwiLFxuICAgIFwidml0ZXN0XCI6IFwiNC4xLjBcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwiYnVpbGRcIjogXCJ0c3VwXCIsXG4gICAgXCJidWlsZDp3YXRjaFwiOiBcInRzdXAgLS13YXRjaFwiLFxuICAgIFwidHlwZWNoZWNrXCI6IFwidHNjIC0tbm9FbWl0XCIsXG4gICAgXCJ0eXBlY2hlY2s6c3RyaWN0XCI6IFwidHNjIC0tbm9FbWl0IC0tc3RyaWN0XCIsXG4gICAgXCJkZXZcIjogXCJ0c3ggYmluL2luc3RhbGwudHNcIixcbiAgICBcImxpbnRcIjogXCJlc2xpbnQgLiAtLWV4dCAudHMgLS1tYXgtd2FybmluZ3M9MFwiLFxuICAgIFwibGludDpmaXhcIjogXCJlc2xpbnQgLiAtLWV4dCAudHMgLS1maXhcIixcbiAgICBcImJ1aWxkOmhvb2tzXCI6IFwibm9kZSBkaXN0L3NjcmlwdHMvYnVpbGQtaG9va3MuanNcIixcbiAgICBcInByZXB1Ymxpc2hPbmx5XCI6IFwibnBtIHJ1biBidWlsZCAmJiBucG0gcnVuIGJ1aWxkOmhvb2tzXCIsXG4gICAgXCJ0ZXN0XCI6IFwidHN4IHNjcmlwdHMvcnVuLXRlc3RzLnRzXCIsXG4gICAgXCJ0ZXN0OmNvdmVyYWdlXCI6IFwiYzggLS1jaGVjay1jb3ZlcmFnZSAtLWxpbmVzIDcwIC0tcmVwb3J0ZXIgdGV4dCAtLWluY2x1ZGUgJ2Jpbi9saWIvKiovKi50cycgLS1leGNsdWRlICd0ZXN0cy8qKicgLS1hbGwgdHN4IHNjcmlwdHMvcnVuLXRlc3RzLnRzXCIsXG4gICAgXCJ0ZXN0OmExMXlcIjogXCJub2RlIHRlc3RzL2FjY2Vzc2liaWxpdHkvcnVuLWExMXktdGVzdHMuY2pzXCIsXG4gICAgXCJ0ZXN0OnF3ZW46Y29kZVwiOiBcInNoIHRlc3RzL3N0YWdpbmcvcXdlbi1jb2RlLWJhdHRsZS1mdWxsLnNoXCIsXG4gICAgXCJ0ZXN0OnF3ZW46Y29kZTpzaW1wbGVcIjogXCJzaCB0ZXN0cy9zdGFnaW5nL3F3ZW4tY29kZS1zaW1wbGUtdGVzdC5zaFwiLFxuICAgIFwidGVzdDpxd2VuOmNvZGU6ZWRnZVwiOiBcInNoIHRlc3RzL3N0YWdpbmcvcXdlbi1jb2RlLWVkZ2UtY2FzZXMuc2hcIixcbiAgICBcInRlc3Q6ZG9ja2VyOnF3ZW46Y29kZVwiOiBcImRvY2tlci1jb21wb3NlIC1mIGRvY2tlci1jb21wb3NlLnN0YWdpbmcueW1sIHVwIC0tYnVpbGQgZXotYWdlbnRzLXF3ZW4tY29kZS1iYXR0bGVcIixcbiAgICBcInRlc3Q6ZG9ja2VyOnF3ZW46ZWRnZVwiOiBcImRvY2tlci1jb21wb3NlIC1mIGRvY2tlci1jb21wb3NlLnN0YWdpbmcueW1sIHVwIC0tYnVpbGQgZXotYWdlbnRzLXF3ZW4tY29kZS1lZGdlLWNhc2VzXCIsXG4gICAgXCJ0ZXN0OmRvY2tlcjphbGxcIjogXCJkb2NrZXItY29tcG9zZSAtZiBkb2NrZXItY29tcG9zZS5zdGFnaW5nLnltbCB1cCAtLWJ1aWxkIC0tYWJvcnQtb24tY29udGFpbmVyLWV4aXRcIixcbiAgICBcImluc3RhbGw6cHJvZHVjdGlvblwiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy9pbnN0YWxsLXByb2R1Y3Rpb24udHNcIixcbiAgICBcImluc3RhbGw6cHJvZHVjdGlvbjpsYXRlc3RcIjogXCJub2RlIC0tbG9hZGVyIHRzLW5vZGUvZXNtIHNjcmlwdHMvaW5zdGFsbC1wcm9kdWN0aW9uLnRzIGxhdGVzdFwiLFxuICAgIFwiaW5zdGFsbDpwcm9kdWN0aW9uOnY0XCI6IFwibm9kZSAtLWxvYWRlciB0cy1ub2RlL2VzbSBzY3JpcHRzL2luc3RhbGwtcHJvZHVjdGlvbi50cyA0LjAuMFwiLFxuICAgIFwidmFsaWRhdGU6dG9rZW5cIjogXCJub2RlIC0tbG9hZGVyIHRzLW5vZGUvZXNtIHNjcmlwdHMvdmFsaWRhdGUtdG9rZW4udHNcIixcbiAgICBcInNlY3VyaXR5OnNjYW5cIjogXCJucG0gYXVkaXQgLS1hdWRpdC1sZXZlbD1tb2RlcmF0ZVwiLFxuICAgIFwiZG9jczpnZW5lcmF0ZVwiOiBcImpzZG9jIC1jIGpzZG9jLmpzb24gLXIgYmluLyBlei1hZ2VudHMvYmluL2xpYi9cIixcbiAgICBcImRvY3M6YXBpXCI6IFwidHlwZWRvY1wiLFxuICAgIFwiYW5hbHl6ZTpkdXBsaWNhdGVzXCI6IFwianNjcGQgLS1jb25maWcgLmpzY3BkLmpzb25cIixcbiAgICBcImNoZWNrOmR1cGxpY2F0ZXNcIjogXCJqc2NwZCAtLWNvbmZpZyAuanNjcGQuanNvblwiLFxuICAgIFwiY2hlY2s6Y29tcGxleGl0eVwiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy9jaGVjay1jb21wbGV4aXR5LnRzXCIsXG4gICAgXCJjaGVjazp0c2RvY1wiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy9jaGVjay10c2RvYy1jb3ZlcmFnZS50c1wiLFxuICAgIFwidGVzdDpwYWNrYWdlXCI6IFwibm9kZSAtLWxvYWRlciB0cy1ub2RlL2VzbSBzY3JpcHRzL3Rlc3QtcGFja2FnZS1kb2NrZXIudHNcIixcbiAgICBcImNoZWNrOmNvdXBsaW5nXCI6IFwibWFkZ2UgLS1jaXJjdWxhciBiaW4vbGliL1wiLFxuICAgIFwiY2hlY2s6YWJzdHJhY3Rpb25zXCI6IFwidHMtcHJ1bmVcIixcbiAgICBcImNoZWNrOmFsbC1tZXRyaWNzXCI6IFwibnBtIHJ1biBsaW50ICYmIG5wbSBydW4gY2hlY2s6ZHVwbGljYXRlcyAmJiBucG0gcnVuIGNoZWNrOmNvdXBsaW5nXCIsXG4gICAgXCJwcmVwYXJlXCI6IFwiaHVza3lcIixcbiAgICBcImdhdGVzOmxvY2FsXCI6IFwibm9kZSBlei1hZ2VudHMvYmluL2xpYi9nYXRlLWV4ZWN1dG9yLmNqcyAtLWNpIC0tY2FjaGVcIixcbiAgICBcImdhdGVzOnN0YXR1c1wiOiBcIm5vZGUgZXotYWdlbnRzL2Jpbi9saWIvZ2F0ZS1leGVjdXRvci5janMgLS1zdGF0dXNcIixcbiAgICBcImdhdGVzOnN0YXRzXCI6IFwibm9kZSBlei1hZ2VudHMvYmluL2xpYi9nYXRlLWV4ZWN1dG9yLmNqcyAtLXN0YXRzXCIsXG4gICAgXCJkZXBzOmF1ZGl0XCI6IFwidHN4IGJpbi9kZXBlbmRlbmN5LWF1ZGl0LnRzXCIsXG4gICAgXCJkZXBzOmF1ZGl0Ompzb25cIjogXCJ0c3ggYmluL2RlcGVuZGVuY3ktYXVkaXQudHMgLS1qc29uXCIsXG4gICAgXCJkZXBzOmNoZWNrXCI6IFwidHN4IGJpbi9kZXBlbmRlbmN5LWF1ZGl0LnRzIC0tcXVpZXRcIlxuICB9LFxuICBcImxpbnQtc3RhZ2VkXCI6IHtcbiAgICBcIioudHNcIjogW1xuICAgICAgXCJub2RlIC0tdGVzdFwiXG4gICAgXSxcbiAgICBcIioubWRcIjogW1xuICAgICAgXCJ0c3ggc2NyaXB0cy9ydW4tdGVzdHMudHNcIlxuICAgIF1cbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwibWljcm9tYXRjaFwiOiBcIjQuMC41XCIsXG4gICAgXCJ0aWt0b2tlblwiOiBcIjEuMC4yMlwiLFxuICAgIFwiem9kXCI6IFwiNC4zLjZcIlxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUFFQSxZQUFZLFFBQVE7QUFDcEIsWUFBWSxVQUFVO0FBQ3RCLFlBQVksUUFBUTtBQUNwQixZQUFZLGNBQWM7QUFDMUIsWUFBWSxZQUFZO0FBQ3hCLFNBQVMscUJBQXFCOzs7QUNQOUI7QUFBQSxFQUNFLE1BQVE7QUFBQSxFQUNSLFNBQVc7QUFBQSxFQUNYLGFBQWU7QUFBQSxFQUNmLE1BQVE7QUFBQSxFQUNSLGFBQWU7QUFBQSxFQUNmLEtBQU87QUFBQSxJQUNMLGFBQWE7QUFBQSxJQUNiLG9CQUFvQjtBQUFBLEVBQ3RCO0FBQUEsRUFD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LElBQU0sY0FBYztBQUFBLEVBQ2hCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUdGLElBQUksYUFBYSxVQUFVO0FBQ3pCLFVBQVEsTUFBTSxLQUFLLE1BQU0sMkNBQTJDLEtBQUssRUFBRTtBQUMzRSxVQUFRLEtBQUssQ0FBQztBQUNoQixXQUFXLHFCQUFxQixVQUFVO0FBQ3hDLFVBQVEsTUFBTSxLQUFLLE1BQU0sdUNBQXVDLEtBQUssRUFBRTtBQUN2RSxVQUFRLEtBQUssQ0FBQztBQUNoQixXQUFXLGNBQWM7QUFDdkIsTUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVO0FBQzNCLFlBQVEsTUFBTSxLQUFLLE1BQU0sMkNBQTJDLEtBQUssRUFBRTtBQUMzRSxZQUFRLEtBQUssQ0FBQztBQUFBLEVBQ2hCO0FBQ0EsUUFBTSxXQUFXLGlCQUFpQixTQUFTLElBQUksbUJBQW1CLENBQUMsUUFBUTtBQUMzRSxhQUFXLFdBQVcsVUFBVTtBQUM5QixjQUFVLFdBQVcsT0FBTztBQUFBLEVBQzlCO0FBQ0YsV0FBVyxpQkFBaUIsU0FBUyxHQUFHO0FBQ3RDLE1BQUksQ0FBQyxhQUFhLENBQUMsVUFBVTtBQUMzQixtQkFBZSxnQkFBZ0I7QUFBQSxFQUNqQyxPQUFPO0FBQ0wsdUJBQW1CLGtCQUFrQixXQUFXLEtBQUs7QUFBQSxFQUN2RDtBQUNGLFdBQVcsYUFBYSxVQUFVO0FBRWhDLHFCQUFtQixDQUFDLFFBQVEsR0FBRyxXQUFXLEtBQUs7QUFDakQsT0FBTztBQUVMLE1BQUksQ0FBQyxRQUFRLE1BQU0sT0FBTztBQUN4QixZQUFRLElBQUksS0FBSyxNQUFNLDhFQUE4RSxLQUFLO0FBQUEsQ0FBSTtBQUM5Ryx1QkFBbUIsQ0FBQyxRQUFRLEdBQUcsTUFBTSxLQUFLO0FBQUEsRUFDNUMsT0FBTztBQUNMLGtCQUFjLENBQUMsYUFBYTtBQUMxQixxQkFBZSxRQUFRO0FBQUEsSUFDekIsQ0FBQztBQUFBLEVBQ0g7QUFDRjsiLAogICJuYW1lcyI6IFsicnVudGltZUxhYmVsIiwgInNjYW5Gb3JMZWFrZWRQYXRocyJdCn0K
2706
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vYmluL2luc3RhbGwudHMiLCAiLi4vLi4vcGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tICdyZWFkbGluZSc7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuXG4vLyBDb2xvcnNcbmNvbnN0IGN5YW4gPSAnXFx4MWJbMzZtJztcbmNvbnN0IGdyZWVuID0gJ1xceDFiWzMybSc7XG5jb25zdCB5ZWxsb3cgPSAnXFx4MWJbMzNtJztcbmNvbnN0IGRpbSA9ICdcXHgxYlsybSc7XG5jb25zdCByZXNldCA9ICdcXHgxYlswbSc7XG5cbi8vIENvZGV4IGNvbmZpZy50b21sIGNvbnN0YW50c1xuY29uc3QgRVpfQ09ERVhfTUFSS0VSID0gJyMgRVpfQWdlbnRzIEFnZW50IENvbmZpZ3VyYXRpb24gXFx1MjAxNCBtYW5hZ2VkIGJ5IGV6LWFnZW50cyBpbnN0YWxsZXInO1xuXG4vLyBDb3BpbG90IGluc3RydWN0aW9ucyBtYXJrZXIgY29uc3RhbnRzXG5jb25zdCBFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19NQVJLRVIgPSAnPCEtLSBFWl9BR0VOVFMgQ29uZmlndXJhdGlvbiBcXHUyMDE0IG1hbmFnZWQgYnkgZXotYWdlbnRzIGluc3RhbGxlciAtLT4nO1xuY29uc3QgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfQ0xPU0VfTUFSS0VSID0gJzwhLS0gL0VaX0FHRU5UUyBDb25maWd1cmF0aW9uIC0tPic7XG4vLyBMZWdhY3kgbWFya2VycyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgaW5zdGFsbHMuXG5jb25zdCBMRUdBQ1lfRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfTUFSS0VSID0gJzwhLS0gRVpfQWdlbnRzIENvbmZpZ3VyYXRpb24gXFx1MjAxNCBtYW5hZ2VkIGJ5IGV6LWFnZW50cyBpbnN0YWxsZXIgLS0+JztcbmNvbnN0IExFR0FDWV9FWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19DTE9TRV9NQVJLRVIgPSAnPCEtLSAvRVpfQWdlbnRzIENvbmZpZ3VyYXRpb24gLS0+JztcblxuY29uc3QgQ09ERVhfQUdFTlRfU0FOREJPWCA9IHtcbiAgJ2V6LWV4ZWN1dG9yJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1wbGFubmVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1waGFzZS1yZXNlYXJjaGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1wcm9qZWN0LXJlc2VhcmNoZXInOiAnd29ya3NwYWNlLXdyaXRlJyxcbiAgJ2V6LXJlc2VhcmNoLXN5bnRoZXNpemVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei12ZXJpZmllcic6ICd3b3Jrc3BhY2Utd3JpdGUnLFxuICAnZXotY29kZWJhc2UtbWFwcGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1yb2FkbWFwcGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1kZWJ1Z2dlcic6ICd3b3Jrc3BhY2Utd3JpdGUnLFxuICAnZXotcGxhbi1jaGVja2VyJzogJ3JlYWQtb25seScsXG4gICdlei1pbnRlZ3JhdGlvbi1jaGVja2VyJzogJ3JlYWQtb25seScsXG59O1xuXG4vLyBDb3BpbG90IHRvb2wgbmFtZSBtYXBwaW5nIFx1MjAxNCBDbGF1ZGUgQ29kZSB0b29scyB0byBHaXRIdWIgQ29waWxvdCB0b29sc1xuLy8gVG9vbCBtYXBwaW5nIGFwcGxpZXMgT05MWSB0byBhZ2VudHMsIE5PVCB0byBza2lsbHMgKHBlciBDT05URVhULm1kIGRlY2lzaW9uKVxuY29uc3QgY2xhdWRlVG9Db3BpbG90VG9vbHMgPSB7XG4gIFJlYWQ6ICdyZWFkJyxcbiAgV3JpdGU6ICdlZGl0JyxcbiAgRWRpdDogJ2VkaXQnLFxuICBCYXNoOiAnZXhlY3V0ZScsXG4gIEdyZXA6ICdzZWFyY2gnLFxuICBHbG9iOiAnc2VhcmNoJyxcbiAgVGFzazogJ2FnZW50JyxcbiAgV2ViU2VhcmNoOiAnd2ViJyxcbiAgV2ViRmV0Y2g6ICd3ZWInLFxuICBUb2RvV3JpdGU6ICd0b2RvJyxcbiAgQXNrVXNlclF1ZXN0aW9uOiAnYXNrX3VzZXInLFxuICBTbGFzaENvbW1hbmQ6ICdza2lsbCcsXG59O1xuXG4vLyBHZXQgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvblxuaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfTtcblxuLy8gUGFyc2UgYXJnc1xuY29uc3QgYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbmNvbnN0IGhhc0dsb2JhbCA9IGFyZ3MuaW5jbHVkZXMoJy0tZ2xvYmFsJykgfHwgYXJncy5pbmNsdWRlcygnLWcnKTtcbmNvbnN0IGhhc0xvY2FsID0gYXJncy5pbmNsdWRlcygnLS1sb2NhbCcpIHx8IGFyZ3MuaW5jbHVkZXMoJy1sJyk7XG5jb25zdCBoYXNPcGVuY29kZSA9IGFyZ3MuaW5jbHVkZXMoJy0tb3BlbmNvZGUnKTtcbmNvbnN0IGhhc0NsYXVkZSA9IGFyZ3MuaW5jbHVkZXMoJy0tY2xhdWRlJyk7XG5jb25zdCBoYXNHZW1pbmkgPSBhcmdzLmluY2x1ZGVzKCctLWdlbWluaScpO1xuY29uc3QgaGFzQ29kZXggPSBhcmdzLmluY2x1ZGVzKCctLWNvZGV4Jyk7XG5jb25zdCBoYXNDb3BpbG90ID0gYXJncy5pbmNsdWRlcygnLS1jb3BpbG90Jyk7XG5jb25zdCBoYXNRd2VuID0gYXJncy5pbmNsdWRlcygnLS1xd2VuJyk7XG5jb25zdCBoYXNLaW1pID0gYXJncy5pbmNsdWRlcygnLS1raW1pJyk7XG5jb25zdCBoYXNCb3RoID0gYXJncy5pbmNsdWRlcygnLS1ib3RoJyk7IC8vIExlZ2FjeSBmbGFnLCBrZWVwcyB3b3JraW5nXG5jb25zdCBoYXNBbGwgPSBhcmdzLmluY2x1ZGVzKCctLWFsbCcpO1xuY29uc3QgaGFzVW5pbnN0YWxsID0gYXJncy5pbmNsdWRlcygnLS11bmluc3RhbGwnKSB8fCBhcmdzLmluY2x1ZGVzKCctdScpO1xuXG4vLyBSdW50aW1lIHNlbGVjdGlvbiAtIGNhbiBiZSBzZXQgYnkgZmxhZ3Mgb3IgaW50ZXJhY3RpdmUgcHJvbXB0XG5sZXQgc2VsZWN0ZWRSdW50aW1lczogc3RyaW5nW10gPSBbXTtcbmlmIChoYXNBbGwpIHtcbiAgc2VsZWN0ZWRSdW50aW1lcyA9IFsnY2xhdWRlJywgJ29wZW5jb2RlJywgJ2dlbWluaScsICdjb2RleCcsICdjb3BpbG90JywgJ3F3ZW4nLCAna2ltaSddO1xufSBlbHNlIGlmIChoYXNCb3RoKSB7XG4gIHNlbGVjdGVkUnVudGltZXMgPSBbJ2NsYXVkZScsICdvcGVuY29kZSddO1xufSBlbHNlIHtcbiAgaWYgKGhhc09wZW5jb2RlKSBzZWxlY3RlZFJ1bnRpbWVzLnB1c2goJ29wZW5jb2RlJyk7XG4gIGlmIChoYXNDbGF1ZGUpIHNlbGVjdGVkUnVudGltZXMucHVzaCgnY2xhdWRlJyk7XG4gIGlmIChoYXNHZW1pbmkpIHNlbGVjdGVkUnVudGltZXMucHVzaCgnZ2VtaW5pJyk7XG4gIGlmIChoYXNDb2RleCkgc2VsZWN0ZWRSdW50aW1lcy5wdXNoKCdjb2RleCcpO1xuICBpZiAoaGFzQ29waWxvdCkgc2VsZWN0ZWRSdW50aW1lcy5wdXNoKCdjb3BpbG90Jyk7XG4gIGlmIChoYXNRd2VuKSBzZWxlY3RlZFJ1bnRpbWVzLnB1c2goJ3F3ZW4nKTtcbiAgaWYgKGhhc0tpbWkpIHNlbGVjdGVkUnVudGltZXMucHVzaCgna2ltaScpO1xufVxuXG4vLyBXU0wgKyBXaW5kb3dzIE5vZGUuanMgZGV0ZWN0aW9uXG4vLyBXaGVuIFdpbmRvd3MtbmF0aXZlIE5vZGUgcnVucyBvbiBXU0wsIG9zLmhvbWVkaXIoKSBhbmQgcGF0aC5qb2luKCkgcHJvZHVjZVxuLy8gYmFja3NsYXNoIHBhdGhzIHRoYXQgZG9uJ3QgcmVzb2x2ZSBjb3JyZWN0bHkgb24gdGhlIExpbnV4IGZpbGVzeXN0ZW0uXG5pZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICBsZXQgaXNXU0wgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuV1NMX0RJU1RST19OQU1FKSB7XG4gICAgICBpc1dTTCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChmcy5leGlzdHNTeW5jKCcvcHJvYy92ZXJzaW9uJykpIHtcbiAgICAgIGNvbnN0IHByb2NWZXJzaW9uID0gZnMucmVhZEZpbGVTeW5jKCcvcHJvYy92ZXJzaW9uJywgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHByb2NWZXJzaW9uLmluY2x1ZGVzKCdtaWNyb3NvZnQnKSB8fCBwcm9jVmVyc2lvbi5pbmNsdWRlcygnd3NsJykpIHtcbiAgICAgICAgaXNXU0wgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gSWdub3JlIHJlYWQgZXJyb3JzIFx1MjAxNCBub3QgV1NMXG4gIH1cblxuICBpZiAoaXNXU0wpIHtcbiAgICBjb25zb2xlLmVycm9yKGBcbiR7eWVsbG93fVx1MjZBMCBEZXRlY3RlZCBXU0wgd2l0aCBXaW5kb3dzLW5hdGl2ZSBOb2RlLmpzLiR7cmVzZXR9XG5cblRoaXMgY2F1c2VzIHBhdGggcmVzb2x1dGlvbiBpc3N1ZXMgdGhhdCBwcmV2ZW50IGNvcnJlY3QgaW5zdGFsbGF0aW9uLlxuUGxlYXNlIGluc3RhbGwgYSBMaW51eC1uYXRpdmUgTm9kZS5qcyBpbnNpZGUgV1NMOlxuXG4gIGN1cmwgLWZzU0wgaHR0cHM6Ly9mbm0udmVyY2VsLmFwcC9pbnN0YWxsIHwgYmFzaFxuICBmbm0gaW5zdGFsbCAtLWx0c1xuXG5UaGVuIHJlLXJ1bjogbnB4IGV6LWFnZW50c1xuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIHBhdGhQcmVmaXggKHdoaWNoIHVzZXMgYWJzb2x1dGUgcGF0aHMgZm9yIGdsb2JhbCBpbnN0YWxscykgdG8gYVxuICogJEhPTUUtcmVsYXRpdmUgZm9ybSBmb3IgcmVwbGFjaW5nICRIT01FLy5jbGF1ZGUvIHJlZmVyZW5jZXMgaW4gYmFzaCBjb2RlIGJsb2Nrcy5cbiAqIFByZXNlcnZlcyAkSE9NRSBhcyBhIHNoZWxsIHZhcmlhYmxlIHNvIHBhdGhzIHJlbWFpbiBwb3J0YWJsZSBhY3Jvc3MgbWFjaGluZXMuXG4gKi9cbmZ1bmN0aW9uIHRvSG9tZVByZWZpeChwYXRoUHJlZml4OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBob21lID0gb3MuaG9tZWRpcigpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGhQcmVmaXgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKGhvbWUpKSB7XG4gICAgcmV0dXJuICckSE9NRScgKyBub3JtYWxpemVkLnNsaWNlKGhvbWUubGVuZ3RoKTtcbiAgfVxuICAvLyBDb252ZXJ0IHRpbGRlLWJhc2VkIHBhdGhzIHRvICRIT01FLWJhc2VkIHBhdGhzIGZvciBiYXNoIGNvZGUgYmxvY2tzXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoJ34vJykpIHtcbiAgICByZXR1cm4gJyRIT01FJyArIG5vcm1hbGl6ZWQuc2xpY2UoMSk7XG4gIH1cbiAgLy8gRm9yIHJlbGF0aXZlIHBhdGhzIG9yIHBhdGhzIG5vdCB1bmRlciAkSE9NRSwgcmV0dXJuIGFzLWlzXG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vLyBIZWxwZXIgdG8gZ2V0IGRpcmVjdG9yeSBuYW1lIGZvciBhIHJ1bnRpbWUgKHVzZWQgZm9yIGxvY2FsL3Byb2plY3QgaW5zdGFsbHMpXG5mdW5jdGlvbiBnZXREaXJOYW1lKHJ1bnRpbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHJldHVybiAnLmdpdGh1Yic7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSByZXR1cm4gJy5vcGVuY29kZSc7XG4gIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykgcmV0dXJuICcuZ2VtaW5pJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb2RleCcpIHJldHVybiAnLmNvZGV4JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcmV0dXJuICcucXdlbic7XG4gIGlmIChydW50aW1lID09PSAna2ltaScpIHJldHVybiAnLmtpbWknO1xuICByZXR1cm4gJy5jbGF1ZGUnO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY29uZmlnIGRpcmVjdG9yeSBwYXRoIHJlbGF0aXZlIHRvIGhvbWUgZGlyZWN0b3J5IGZvciBhIHJ1bnRpbWVcbiAqIFVzZWQgZm9yIHRlbXBsYXRpbmcgaG9va3MgdGhhdCB1c2UgcGF0aC5qb2luKGhvbWVEaXIsICc8Y29uZmlnRGlyPicsIC4uLilcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCAnY29waWxvdCcsIG9yICdxd2VuJ1xuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXG4gKi9cbmZ1bmN0aW9uIGdldENvbmZpZ0RpckZyb21Ib21lKHJ1bnRpbWU6IHN0cmluZywgaXNHbG9iYWw6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoIWlzR2xvYmFsKSB7XG4gICAgLy8gTG9jYWwgaW5zdGFsbHMgdXNlIHRoZSBzYW1lIGRpciBuYW1lIHBhdHRlcm5cbiAgICByZXR1cm4gYCcke2dldERpck5hbWUocnVudGltZSl9J2A7XG4gIH1cbiAgLy8gR2xvYmFsIGluc3RhbGxzIC0gT3BlbkNvZGUgdXNlcyBYREcgcGF0aCBzdHJ1Y3R1cmVcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb3BpbG90JykgcmV0dXJuIFwiJy5jb3BpbG90J1wiO1xuICBpZiAocnVudGltZSA9PT0gJ29wZW5jb2RlJykge1xuICAgIC8vIE9wZW5Db2RlOiB+Ly5jb25maWcvb3BlbmNvZGUgLT4gJy5jb25maWcnLCAnb3BlbmNvZGUnXG4gICAgLy8gUmV0dXJuIGFzIGNvbW1hLXNlcGFyYXRlZCBmb3IgcGF0aC5qb2luKCkgcmVwbGFjZW1lbnRcbiAgICByZXR1cm4gXCInLmNvbmZpZycsICdvcGVuY29kZSdcIjtcbiAgfVxuICBpZiAocnVudGltZSA9PT0gJ2dlbWluaScpIHJldHVybiBcIicuZ2VtaW5pJ1wiO1xuICBpZiAocnVudGltZSA9PT0gJ2NvZGV4JykgcmV0dXJuIFwiJy5jb2RleCdcIjtcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcmV0dXJuIFwiJy5xd2VuJ1wiO1xuICBpZiAocnVudGltZSA9PT0gJ2tpbWknKSByZXR1cm4gXCInLmtpbWknXCI7XG4gIHJldHVybiBcIicuY2xhdWRlJ1wiO1xufVxuXG4vKipcbiAqIEdldCB0aGUgZ2xvYmFsIGNvbmZpZyBkaXJlY3RvcnkgZm9yIE9wZW5Db2RlXG4gKiBPcGVuQ29kZSBmb2xsb3dzIFhERyBCYXNlIERpcmVjdG9yeSBzcGVjIGFuZCB1c2VzIH4vLmNvbmZpZy9vcGVuY29kZS9cbiAqIFByaW9yaXR5OiBPUEVOQ09ERV9DT05GSUdfRElSID4gZGlybmFtZShPUEVOQ09ERV9DT05GSUcpID4gWERHX0NPTkZJR19IT01FL29wZW5jb2RlID4gfi8uY29uZmlnL29wZW5jb2RlXG4gKi9cbmZ1bmN0aW9uIGdldE9wZW5jb2RlR2xvYmFsRGlyKCkge1xuICAvLyAxLiBFeHBsaWNpdCBPUEVOQ09ERV9DT05GSUdfRElSIGVudiB2YXJcbiAgaWYgKHByb2Nlc3MuZW52Lk9QRU5DT0RFX0NPTkZJR19ESVIpIHtcbiAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuT1BFTkNPREVfQ09ORklHX0RJUik7XG4gIH1cbiAgXG4gIC8vIDIuIE9QRU5DT0RFX0NPTkZJRyBlbnYgdmFyICh1c2UgaXRzIGRpcmVjdG9yeSlcbiAgaWYgKHByb2Nlc3MuZW52Lk9QRU5DT0RFX0NPTkZJRykge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUoZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuT1BFTkNPREVfQ09ORklHKSk7XG4gIH1cbiAgXG4gIC8vIDMuIFhER19DT05GSUdfSE9NRS9vcGVuY29kZVxuICBpZiAocHJvY2Vzcy5lbnYuWERHX0NPTkZJR19IT01FKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihleHBhbmRUaWxkZShwcm9jZXNzLmVudi5YREdfQ09ORklHX0hPTUUpLCAnb3BlbmNvZGUnKTtcbiAgfVxuICBcbiAgLy8gNC4gRGVmYXVsdDogfi8uY29uZmlnL29wZW5jb2RlIChYREcgZGVmYXVsdClcbiAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29uZmlnJywgJ29wZW5jb2RlJyk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBnbG9iYWwgY29uZmlnIGRpcmVjdG9yeSBmb3IgYSBydW50aW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcnVudGltZSAtICdjbGF1ZGUnLCAnb3BlbmNvZGUnLCAnZ2VtaW5pJywgJ2NvZGV4Jywgb3IgJ2NvcGlsb3QnXG4gKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBleHBsaWNpdERpciAtIEV4cGxpY2l0IGRpcmVjdG9yeSBmcm9tIC0tY29uZmlnLWRpciBmbGFnXG4gKi9cbmZ1bmN0aW9uIGdldEdsb2JhbERpcihydW50aW1lOiBzdHJpbmcsIGV4cGxpY2l0RGlyOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHN0cmluZyB7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSB7XG4gICAgLy8gRm9yIE9wZW5Db2RlLCAtLWNvbmZpZy1kaXIgb3ZlcnJpZGVzIGVudiB2YXJzXG4gICAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUoZXhwbGljaXREaXIpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0T3BlbmNvZGVHbG9iYWxEaXIoKTtcbiAgfVxuICBcbiAgaWYgKHJ1bnRpbWUgPT09ICdnZW1pbmknKSB7XG4gICAgLy8gR2VtaW5pOiAtLWNvbmZpZy1kaXIgPiBHRU1JTklfQ09ORklHX0RJUiA+IH4vLmdlbWluaVxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkdFTUlOSV9DT05GSUdfRElSKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuR0VNSU5JX0NPTkZJR19ESVIpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5nZW1pbmknKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSB7XG4gICAgLy8gQ29kZXg6IC0tY29uZmlnLWRpciA+IENPREVYX0hPTUUgPiB+Ly5jb2RleFxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkNPREVYX0hPTUUpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShwcm9jZXNzLmVudi5DT0RFWF9IT01FKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29kZXgnKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHtcbiAgICAvLyBDb3BpbG90OiAtLWNvbmZpZy1kaXIgPiBDT1BJTE9UX0NPTkZJR19ESVIgPiB+Ly5jb3BpbG90XG4gICAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUoZXhwbGljaXREaXIpO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuQ09QSUxPVF9DT05GSUdfRElSKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuQ09QSUxPVF9DT05GSUdfRElSKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29waWxvdCcpO1xuICB9XG5cbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykge1xuICAgIC8vIFF3ZW4gQ29kZTogLS1jb25maWctZGlyID4gUVdFTl9DT05GSUdfRElSID4gfi8ucXdlblxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LlFXRU5fQ09ORklHX0RJUikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKHByb2Nlc3MuZW52LlFXRU5fQ09ORklHX0RJUik7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLnF3ZW4nKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAna2ltaScpIHtcbiAgICAvLyBLaW1pIENvZGU6IC0tY29uZmlnLWRpciA+IEtJTUlfQ09ORklHX0RJUiA+IH4vLmtpbWlcbiAgICBpZiAoZXhwbGljaXREaXIpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShleHBsaWNpdERpcik7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5LSU1JX0NPTkZJR19ESVIpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShwcm9jZXNzLmVudi5LSU1JX0NPTkZJR19ESVIpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5raW1pJyk7XG4gIH1cblxuICAvLyBDbGF1ZGUgQ29kZTogLS1jb25maWctZGlyID4gQ0xBVURFX0NPTkZJR19ESVIgPiB+Ly5jbGF1ZGVcbiAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuQ0xBVURFX0NPTkZJR19ESVIpIHtcbiAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuQ0xBVURFX0NPTkZJR19ESVIpO1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNsYXVkZScpO1xufVxuXG5jb25zdCBiYW5uZXIgPSAnXFxuJyArXG4gIGN5YW4gKyAnICBcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1NTdcdTI1ODhcdTI1ODhcdTI1NTcgIFx1MjU4OFx1MjU4OFx1MjU1N1xcbicgK1xuICAnICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NURcdTI1NUFcdTI1ODhcdTI1ODhcdTI1NTdcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NURcXG4nICtcbiAgJyAgXHUyNTg4XHUyNTg4XHUyNTg4XHUyNTg4XHUyNTg4XHUyNTU3ICAgXHUyNTVBXHUyNTg4XHUyNTg4XHUyNTg4XHUyNTU0XHUyNTVEIFxcbicgK1xuICAnICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NTBcdTI1NTBcdTI1NUQgICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1ODhcdTI1ODhcdTI1NTcgXFxuJyArXG4gICcgIFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU1N1x1MjU4OFx1MjU4OFx1MjU1NFx1MjU1RFx1MjU1QVx1MjU4OFx1MjU4OFx1MjU1N1xcbicgK1xuICAnICBcdTI1NUFcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NURcdTI1NUFcdTI1NTBcdTI1NUQgXHUyNTVBXHUyNTUwXHUyNTVEJyArIHJlc2V0ICsgJ1xcbicgK1xuICAnXFxuJyArXG4gICcgIEVaX0FnZW50cyAnICsgZGltICsgJ3YnICsgcGtnLnZlcnNpb24gKyByZXNldCArICdcXG4nICtcbiAgJyAgTXVsdGktTW9kZWwgRWRpdGlvbicgKyByZXNldCArICdcXG4nICtcbiAgJyAgQSBtZXRhLXByb21wdGluZywgY29udGV4dCBlbmdpbmVlcmluZyBhbmQgc3BlYy1kcml2ZW5cXG4nICtcbiAgJyAgZGV2ZWxvcG1lbnQgc3lzdGVtIGZvciBDbGF1ZGUgQ29kZSwgT3BlbkNvZGUsIEdlbWluaSwgQ29kZXgsIENvcGlsb3QsXFxuJyArXG4gICcgIFF3ZW4gQ29kZSwgS2ltaSBDb2RlLCB3aXRoIG11bHRpLW1vZGVsIHN1cHBvcnQuXFxuJyArXG4gICcgIE9yaWdpbmFsIGJ5IFRcdTAwQzJDSEVTIHwgTXVsdGktTW9kZWwgRm9yayBieSBAaG93bGlsLlxcbic7XG5cblxuLy8gUGFyc2UgLS1jb25maWctZGlyIGFyZ3VtZW50XG5mdW5jdGlvbiBwYXJzZUNvbmZpZ0RpckFyZygpIHtcbiAgY29uc3QgY29uZmlnRGlySW5kZXggPSBhcmdzLmZpbmRJbmRleChhcmcgPT4gYXJnID09PSAnLS1jb25maWctZGlyJyB8fCBhcmcgPT09ICctYycpO1xuICBpZiAoY29uZmlnRGlySW5kZXggIT09IC0xKSB7XG4gICAgY29uc3QgbmV4dEFyZyA9IGFyZ3NbY29uZmlnRGlySW5kZXggKyAxXTtcbiAgICAvLyBFcnJvciBpZiAtLWNvbmZpZy1kaXIgaXMgcHJvdmlkZWQgd2l0aG91dCBhIHZhbHVlIG9yIG5leHQgYXJnIGlzIGFub3RoZXIgZmxhZ1xuICAgIGlmICghbmV4dEFyZyB8fCBuZXh0QXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd30tLWNvbmZpZy1kaXIgcmVxdWlyZXMgYSBwYXRoIGFyZ3VtZW50JHtyZXNldH1gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRBcmc7XG4gIH1cbiAgLy8gQWxzbyBoYW5kbGUgLS1jb25maWctZGlyPXZhbHVlIGZvcm1hdFxuICBjb25zdCBjb25maWdEaXJBcmcgPSBhcmdzLmZpbmQoYXJnID0+IGFyZy5zdGFydHNXaXRoKCctLWNvbmZpZy1kaXI9JykgfHwgYXJnLnN0YXJ0c1dpdGgoJy1jPScpKTtcbiAgaWYgKGNvbmZpZ0RpckFyZykge1xuICAgIGNvbnN0IHZhbHVlID0gY29uZmlnRGlyQXJnLnNwbGl0KCc9JylbMV07XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd30tLWNvbmZpZy1kaXIgcmVxdWlyZXMgYSBub24tZW1wdHkgcGF0aCR7cmVzZXR9YCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmNvbnN0IGV4cGxpY2l0Q29uZmlnRGlyID0gcGFyc2VDb25maWdEaXJBcmcoKTtcbmNvbnN0IGhhc0hlbHAgPSBhcmdzLmluY2x1ZGVzKCctLWhlbHAnKSB8fCBhcmdzLmluY2x1ZGVzKCctaCcpO1xuY29uc3QgaGFzVmVyc2lvbiA9IGFyZ3MuaW5jbHVkZXMoJy0tdmVyc2lvbicpIHx8IGFyZ3MuaW5jbHVkZXMoJy12Jyk7XG5jb25zdCBmb3JjZVN0YXR1c2xpbmUgPSBhcmdzLmluY2x1ZGVzKCctLWZvcmNlLXN0YXR1c2xpbmUnKTtcblxuLy8gU2hvdyB2ZXJzaW9uIGlmIHJlcXVlc3RlZCAoc2tpcCBiYW5uZXIsIGp1c3Qgb3V0cHV0IHZlcnNpb24pXG5pZiAoaGFzVmVyc2lvbikge1xuICBjb25zb2xlLmxvZyhwa2cudmVyc2lvbik7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuY29uc29sZS5sb2coYmFubmVyKTtcblxuaWYgKGhhc1VuaW5zdGFsbCkge1xuICBjb25zb2xlLmxvZygnICBNb2RlOiBVbmluc3RhbGxcXG4nKTtcbn1cblxuLy8gU2hvdyBoZWxwIGlmIHJlcXVlc3RlZFxuaWYgKGhhc0hlbHApIHtcbiAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9VXNhZ2U6JHtyZXNldH0gbnB4IGV6LWFnZW50cyBbb3B0aW9uc11cXG5cXG4gICR7eWVsbG93fU9wdGlvbnM6JHtyZXNldH1cXG4gICAgJHtjeWFufS1nLCAtLWdsb2JhbCR7cmVzZXR9ICAgICAgICAgICAgICBJbnN0YWxsIGdsb2JhbGx5ICh0byBjb25maWcgZGlyZWN0b3J5KVxcbiAgICAke2N5YW59LWwsIC0tbG9jYWwke3Jlc2V0fSAgICAgICAgICAgICAgIEluc3RhbGwgbG9jYWxseSAodG8gY3VycmVudCBkaXJlY3RvcnkpXFxuICAgICR7Y3lhbn0tLWNsYXVkZSR7cmVzZXR9ICAgICAgICAgICAgICAgICAgSW5zdGFsbCBmb3IgQ2xhdWRlIENvZGUgb25seVxcbiAgICAke2N5YW59LS1vcGVuY29kZSR7cmVzZXR9ICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIE9wZW5Db2RlIG9ubHlcXG4gICAgJHtjeWFufS0tZ2VtaW5pJHtyZXNldH0gICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBHZW1pbmkgb25seVxcbiAgICAke2N5YW59LS1jb2RleCR7cmVzZXR9ICAgICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIENvZGV4IG9ubHlcXG4gICAgJHtjeWFufS0tY29waWxvdCR7cmVzZXR9ICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBDb3BpbG90IG9ubHlcXG4gICAgJHtjeWFufS0tcXdlbiR7cmVzZXR9ICAgICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBRd2VuIENvZGUgb25seVxcbiAgICAke2N5YW59LS1raW1pJHtyZXNldH0gICAgICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIEtpbWkgQ29kZSBvbmx5XFxuICAgICR7Y3lhbn0tLWFsbCR7cmVzZXR9ICAgICAgICAgICAgICAgICAgICAgSW5zdGFsbCBmb3IgYWxsIHJ1bnRpbWVzXFxuICAgICR7Y3lhbn0tdSwgLS11bmluc3RhbGwke3Jlc2V0fSAgICAgICAgICAgVW5pbnN0YWxsIEVaX0FnZW50cyAocmVtb3ZlIGFsbCBFWl9BZ2VudHMgZmlsZXMpXFxuICAgICR7Y3lhbn0tYywgLS1jb25maWctZGlyIDxwYXRoPiR7cmVzZXR9ICAgU3BlY2lmeSBjdXN0b20gY29uZmlnIGRpcmVjdG9yeVxcbiAgICAke2N5YW59LXYsIC0tdmVyc2lvbiR7cmVzZXR9ICAgICAgICAgICAgIFNob3cgdmVyc2lvbiBudW1iZXJcXG4gICAgJHtjeWFufS1oLCAtLWhlbHAke3Jlc2V0fSAgICAgICAgICAgICAgICBTaG93IHRoaXMgaGVscCBtZXNzYWdlXFxuICAgICR7Y3lhbn0tLWZvcmNlLXN0YXR1c2xpbmUke3Jlc2V0fSAgICAgICAgUmVwbGFjZSBleGlzdGluZyBzdGF0dXNsaW5lIGNvbmZpZ1xcblxcbiAgJHt5ZWxsb3d9RXhhbXBsZXM6JHtyZXNldH1cXG4gICAgJHtkaW19IyBJbnRlcmFjdGl2ZSBpbnN0YWxsIChwcm9tcHRzIGZvciBydW50aW1lIGFuZCBsb2NhdGlvbikke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzXFxuXFxuICAgICR7ZGltfSMgSW5zdGFsbCBmb3IgQ2xhdWRlIENvZGUgZ2xvYmFsbHkke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzIC0tY2xhdWRlIC0tZ2xvYmFsXFxuXFxuICAgICR7ZGltfSMgSW5zdGFsbCBmb3IgUXdlbiBDb2RlIGdsb2JhbGx5JHtyZXNldH1cXG4gICAgbnB4IGV6LWFnZW50cyAtLXF3ZW4gLS1nbG9iYWxcXG5cXG4gICAgJHtkaW19IyBJbnN0YWxsIGZvciBLaW1pIENvZGUgZ2xvYmFsbHkke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzIC0ta2ltaSAtLWdsb2JhbFxcblxcbiAgICAke2RpbX0jIEluc3RhbGwgZm9yIGFsbCBydW50aW1lcyBnbG9iYWxseSR7cmVzZXR9XFxuICAgIG5weCBlei1hZ2VudHMgLS1hbGwgLS1nbG9iYWxcXG5cXG4gICAgJHtkaW19IyBVbmluc3RhbGwgRVpfQWdlbnRzIGdsb2JhbGx5JHtyZXNldH1cXG4gICAgbnB4IGV6LWFnZW50cyAtLWFsbCAtLWdsb2JhbCAtLXVuaW5zdGFsbFxcblxcbiAgICAke2RpbX0jIFNob3cgdmVyc2lvbiR7cmVzZXR9XFxuICAgIG5weCBlei1hZ2VudHMgLS12ZXJzaW9uXFxuXFxuICAke3llbGxvd31Ob3Rlczoke3Jlc2V0fVxcbiAgICBUaGUgLS1jb25maWctZGlyIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBjb25maWd1cmF0aW9ucy5cXG4gICAgSXQgdGFrZXMgcHJpb3JpdHkgb3ZlciBDTEFVREVfQ09ORklHX0RJUiAvIEdFTUlOSV9DT05GSUdfRElSIC8gQ09ERVhfSE9NRSAvIENPUElMT1RfQ09ORklHX0RJUiAvIFFXRU5fQ09ORklHX0RJUiAvIEtJTUlfQ09ORklHX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXFxuXFxuICAke3llbGxvd31Nb2RlbCBQcm92aWRlcnM6JHtyZXNldH1cXG4gICAgT3BlbkFJIGFuZCBBbnRocm9waWMgYXJlIG1vZGVsIHByb3ZpZGVycyBjb25maWd1cmVkIGluIHNldHRpbmdzLmpzb24sXFxuICAgIG5vdCBzZXBhcmF0ZSBDTEkgcnVudGltZXMuIFNlZSBSRUFETUUubWQgZm9yIG1vZGVsIGNvbmZpZ3VyYXRpb24uXFxuYCk7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuLyoqXG4gKiBFeHBhbmQgfiB0byBob21lIGRpcmVjdG9yeSAoc2hlbGwgZG9lc24ndCBleHBhbmQgaW4gZW52IHZhcnMgcGFzc2VkIHRvIG5vZGUpXG4gKi9cbmZ1bmN0aW9uIGV4cGFuZFRpbGRlKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aCAmJiBmaWxlUGF0aC5zdGFydHNXaXRoKCd+LycpKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksIGZpbGVQYXRoLnNsaWNlKDIpKTtcbiAgfVxuICByZXR1cm4gZmlsZVBhdGg7XG59XG5cbi8qKlxuICogQnVpbGQgYSBob29rIGNvbW1hbmQgcGF0aCB1c2luZyBmb3J3YXJkIHNsYXNoZXMgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhdGliaWxpdHkuXG4gKiBPbiBXaW5kb3dzLCAkSE9NRSBpcyBub3QgZXhwYW5kZWQgYnkgY21kLmV4ZS9Qb3dlclNoZWxsLCBzbyB3ZSB1c2UgdGhlIGFjdHVhbCBwYXRoLlxuICovXG5mdW5jdGlvbiBidWlsZEhvb2tDb21tYW5kKGNvbmZpZ0RpciwgaG9va05hbWUpIHtcbiAgLy8gVXNlIGZvcndhcmQgc2xhc2hlcyBmb3IgTm9kZS5qcyBjb21wYXRpYmlsaXR5IG9uIGFsbCBwbGF0Zm9ybXNcbiAgY29uc3QgaG9va3NQYXRoID0gY29uZmlnRGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKSArICcvaG9va3MvJyArIGhvb2tOYW1lO1xuICByZXR1cm4gYG5vZGUgXCIke2hvb2tzUGF0aH1cImA7XG59XG5cbi8qKlxuICogUmVhZCBhbmQgcGFyc2Ugc2V0dGluZ3MuanNvbiwgcmV0dXJuaW5nIGVtcHR5IG9iamVjdCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gKi9cbmZ1bmN0aW9uIHJlYWRTZXR0aW5ncyhzZXR0aW5nc1BhdGgpIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoc2V0dGluZ3NQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBXcml0ZSBzZXR0aW5ncy5qc29uIHdpdGggcHJvcGVyIGZvcm1hdHRpbmdcbiAqL1xuZnVuY3Rpb24gd3JpdGVTZXR0aW5ncyhzZXR0aW5nc1BhdGgsIHNldHRpbmdzKSB7XG4gIGZzLndyaXRlRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgbnVsbCwgMikgKyAnXFxuJyk7XG59XG5cbi8vIENhY2hlIGZvciBhdHRyaWJ1dGlvbiBzZXR0aW5ncyAocG9wdWxhdGVkIG9uY2UgcGVyIHJ1bnRpbWUgZHVyaW5nIGluc3RhbGwpXG5jb25zdCBhdHRyaWJ1dGlvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmc+KCk7XG5cbi8qKlxuICogR2V0IGNvbW1pdCBhdHRyaWJ1dGlvbiBzZXR0aW5nIGZvciBhIHJ1bnRpbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCBvciAnY29waWxvdCdcbiAqIEByZXR1cm5zIHtudWxsfHVuZGVmaW5lZHxzdHJpbmd9IG51bGwgPSByZW1vdmUsIHVuZGVmaW5lZCA9IGtlZXAgZGVmYXVsdCwgc3RyaW5nID0gY3VzdG9tXG4gKi9cbmZ1bmN0aW9uIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWU6IHN0cmluZyk6IG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcge1xuICAvLyBSZXR1cm4gY2FjaGVkIHZhbHVlIGlmIGF2YWlsYWJsZVxuICBpZiAoYXR0cmlidXRpb25DYWNoZS5oYXMocnVudGltZSkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRpb25DYWNoZS5nZXQocnVudGltZSk7XG4gIH1cblxuICBsZXQgcmVzdWx0OiBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nO1xuXG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVhZFNldHRpbmdzKHBhdGguam9pbihnZXRHbG9iYWxEaXIoJ29wZW5jb2RlJywgbnVsbCksICdvcGVuY29kZS5qc29uJykpO1xuICAgIHJlc3VsdCA9IGNvbmZpZy5kaXNhYmxlX2FpX2F0dHJpYnV0aW9uID09PSB0cnVlID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykge1xuICAgIC8vIEdlbWluaTogY2hlY2sgZ2VtaW5pIHNldHRpbmdzLmpzb24gZm9yIGF0dHJpYnV0aW9uIGNvbmZpZ1xuICAgIGNvbnN0IHNldHRpbmdzID0gcmVhZFNldHRpbmdzKHBhdGguam9pbihnZXRHbG9iYWxEaXIoJ2dlbWluaScsIGV4cGxpY2l0Q29uZmlnRGlyKSwgJ3NldHRpbmdzLmpzb24nKSk7XG4gICAgaWYgKCFzZXR0aW5ncy5hdHRyaWJ1dGlvbiB8fCBzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MuYXR0cmlidXRpb24uY29tbWl0ID09PSAnJykge1xuICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gc2V0dGluZ3MuYXR0cmlidXRpb24uY29tbWl0O1xuICAgIH1cbiAgfSBlbHNlIGlmIChydW50aW1lID09PSAnY2xhdWRlJykge1xuICAgIC8vIENsYXVkZSBDb2RlXG4gICAgY29uc3Qgc2V0dGluZ3MgPSByZWFkU2V0dGluZ3MocGF0aC5qb2luKGdldEdsb2JhbERpcignY2xhdWRlJywgZXhwbGljaXRDb25maWdEaXIpLCAnc2V0dGluZ3MuanNvbicpKTtcbiAgICBpZiAoIXNldHRpbmdzLmF0dHJpYnV0aW9uIHx8IHNldHRpbmdzLmF0dHJpYnV0aW9uLmNvbW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQgPT09ICcnKSB7XG4gICAgICByZXN1bHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIENvZGV4IGFuZCBDb3BpbG90IGN1cnJlbnRseSBoYXZlIG5vIGF0dHJpYnV0aW9uIHNldHRpbmcgZXF1aXZhbGVudFxuICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIENhY2hlIGFuZCByZXR1cm5cbiAgYXR0cmlidXRpb25DYWNoZS5zZXQocnVudGltZSwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIENvLUF1dGhvcmVkLUJ5IGxpbmVzIGJhc2VkIG9uIGF0dHJpYnV0aW9uIHNldHRpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gRmlsZSBjb250ZW50IHRvIHByb2Nlc3NcbiAqIEBwYXJhbSB7bnVsbHx1bmRlZmluZWR8c3RyaW5nfSBhdHRyaWJ1dGlvbiAtIG51bGw9cmVtb3ZlLCB1bmRlZmluZWQ9a2VlcCwgc3RyaW5nPXJlcGxhY2VcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFByb2Nlc3NlZCBjb250ZW50XG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50OiBzdHJpbmcsIGF0dHJpYnV0aW9uOiBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGF0dHJpYnV0aW9uID09PSBudWxsKSB7XG4gICAgLy8gUmVtb3ZlIENvLUF1dGhvcmVkLUJ5IGxpbmVzIGFuZCB0aGUgcHJlY2VkaW5nIGJsYW5rIGxpbmVcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKC8oXFxyP1xcbil7Mn1Dby1BdXRob3JlZC1CeTouKiQvZ2ltLCAnJyk7XG4gIH1cbiAgaWYgKGF0dHJpYnV0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICAvLyBSZXBsYWNlIHdpdGggY3VzdG9tIGF0dHJpYnV0aW9uIChlc2NhcGUgJCB0byBwcmV2ZW50IGJhY2tyZWZlcmVuY2UgaW5qZWN0aW9uKVxuICBjb25zdCBzYWZlQXR0cmlidXRpb24gPSBhdHRyaWJ1dGlvbi5yZXBsYWNlKC9cXCQvZywgJyQkJCQnKTtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSgvQ28tQXV0aG9yZWQtQnk6LiokL2dpbSwgYENvLUF1dGhvcmVkLUJ5OiAke3NhZmVBdHRyaWJ1dGlvbn1gKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IENsYXVkZSBDb2RlIGZyb250bWF0dGVyIHRvIG9wZW5jb2RlIGZvcm1hdFxuICogLSBDb252ZXJ0cyAnYWxsb3dlZC10b29sczonIGFycmF5IHRvICdwZXJtaXNzaW9uOicgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIE1hcmtkb3duIGZpbGUgY29udGVudCB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ29udGVudCB3aXRoIGNvbnZlcnRlZCBmcm9udG1hdHRlclxuICovXG4vLyBDb2xvciBuYW1lIHRvIGhleCBtYXBwaW5nIGZvciBvcGVuY29kZSBjb21wYXRpYmlsaXR5XG5jb25zdCBjb2xvck5hbWVUb0hleCA9IHtcbiAgY3lhbjogJyMwMEZGRkYnLFxuICByZWQ6ICcjRkYwMDAwJyxcbiAgZ3JlZW46ICcjMDBGRjAwJyxcbiAgYmx1ZTogJyMwMDAwRkYnLFxuICB5ZWxsb3c6ICcjRkZGRjAwJyxcbiAgbWFnZW50YTogJyNGRjAwRkYnLFxuICBvcmFuZ2U6ICcjRkZBNTAwJyxcbiAgcHVycGxlOiAnIzgwMDA4MCcsXG4gIHBpbms6ICcjRkZDMENCJyxcbiAgd2hpdGU6ICcjRkZGRkZGJyxcbiAgYmxhY2s6ICcjMDAwMDAwJyxcbiAgZ3JheTogJyM4MDgwODAnLFxuICBncmV5OiAnIzgwODA4MCcsXG59O1xuXG4vLyBUb29sIG5hbWUgbWFwcGluZyBmcm9tIENsYXVkZSBDb2RlIHRvIE9wZW5Db2RlXG4vLyBPcGVuQ29kZSB1c2VzIGxvd2VyY2FzZSB0b29sIG5hbWVzOyBzcGVjaWFsIG1hcHBpbmdzIGZvciByZW5hbWVkIHRvb2xzXG5jb25zdCBjbGF1ZGVUb09wZW5jb2RlVG9vbHMgPSB7XG4gIEFza1VzZXJRdWVzdGlvbjogJ3F1ZXN0aW9uJyxcbiAgU2xhc2hDb21tYW5kOiAnc2tpbGwnLFxuICBUb2RvV3JpdGU6ICd0b2Rvd3JpdGUnLFxuICBXZWJGZXRjaDogJ3dlYmZldGNoJyxcbiAgV2ViU2VhcmNoOiAnd2Vic2VhcmNoJywgIC8vIFBsdWdpbi9NQ1AgLSBrZWVwIGZvciBjb21wYXRpYmlsaXR5XG59O1xuXG4vLyBUb29sIG5hbWUgbWFwcGluZyBmcm9tIENsYXVkZSBDb2RlIHRvIEdlbWluaSBDTElcbi8vIEdlbWluaSBDTEkgdXNlcyBzbmFrZV9jYXNlIGJ1aWx0LWluIHRvb2wgbmFtZXNcbmNvbnN0IGNsYXVkZVRvR2VtaW5pVG9vbHMgPSB7XG4gIFJlYWQ6ICdyZWFkX2ZpbGUnLFxuICBXcml0ZTogJ3dyaXRlX2ZpbGUnLFxuICBFZGl0OiAncmVwbGFjZScsXG4gIEJhc2g6ICdydW5fc2hlbGxfY29tbWFuZCcsXG4gIEdsb2I6ICdnbG9iJyxcbiAgR3JlcDogJ3NlYXJjaF9maWxlX2NvbnRlbnQnLFxuICBXZWJTZWFyY2g6ICdnb29nbGVfd2ViX3NlYXJjaCcsXG4gIFdlYkZldGNoOiAnd2ViX2ZldGNoJyxcbiAgVG9kb1dyaXRlOiAnd3JpdGVfdG9kb3MnLFxuICBBc2tVc2VyUXVlc3Rpb246ICdhc2tfdXNlcicsXG59O1xuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gT3BlbkNvZGUgZm9ybWF0XG4gKiAtIEFwcGxpZXMgc3BlY2lhbCBtYXBwaW5ncyAoQXNrVXNlclF1ZXN0aW9uIC0+IHF1ZXN0aW9uLCBldGMuKVxuICogLSBDb252ZXJ0cyB0byBsb3dlcmNhc2UgKGV4Y2VwdCBNQ1AgdG9vbHMgd2hpY2gga2VlcCB0aGVpciBmb3JtYXQpXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRUb29sTmFtZShjbGF1ZGVUb29sKSB7XG4gIC8vIENoZWNrIGZvciBzcGVjaWFsIG1hcHBpbmcgZmlyc3RcbiAgaWYgKGNsYXVkZVRvT3BlbmNvZGVUb29sc1tjbGF1ZGVUb29sXSkge1xuICAgIHJldHVybiBjbGF1ZGVUb09wZW5jb2RlVG9vbHNbY2xhdWRlVG9vbF07XG4gIH1cbiAgLy8gTUNQIHRvb2xzIChtY3BfXyopIGtlZXAgdGhlaXIgZm9ybWF0XG4gIGlmIChjbGF1ZGVUb29sLnN0YXJ0c1dpdGgoJ21jcF9fJykpIHtcbiAgICByZXR1cm4gY2xhdWRlVG9vbDtcbiAgfVxuICAvLyBEZWZhdWx0OiBjb252ZXJ0IHRvIGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gR2VtaW5pIENMSSBmb3JtYXRcbiAqIC0gQXBwbGllcyBDbGF1ZGVcdTIxOTJHZW1pbmkgbWFwcGluZyAoUmVhZFx1MjE5MnJlYWRfZmlsZSwgQmFzaFx1MjE5MnJ1bl9zaGVsbF9jb21tYW5kLCBldGMuKVxuICogLSBGaWx0ZXJzIG91dCBNQ1AgdG9vbHMgKG1jcF9fKikgXHUyMDE0IHRoZXkgYXJlIGF1dG8tZGlzY292ZXJlZCBhdCBydW50aW1lIGluIEdlbWluaVxuICogLSBGaWx0ZXJzIG91dCBUYXNrIFx1MjAxNCBhZ2VudHMgYXJlIGF1dG8tcmVnaXN0ZXJlZCBhcyB0b29scyBpbiBHZW1pbmlcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH0gR2VtaW5pIHRvb2wgbmFtZSwgb3IgbnVsbCBpZiB0b29sIHNob3VsZCBiZSBleGNsdWRlZFxuICovXG5mdW5jdGlvbiBjb252ZXJ0R2VtaW5pVG9vbE5hbWUoY2xhdWRlVG9vbCkge1xuICAvLyBNQ1AgdG9vbHM6IGV4Y2x1ZGUgXHUyMDE0IGF1dG8tZGlzY292ZXJlZCBmcm9tIG1jcFNlcnZlcnMgY29uZmlnIGF0IHJ1bnRpbWVcbiAgaWYgKGNsYXVkZVRvb2wuc3RhcnRzV2l0aCgnbWNwX18nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIFRhc2s6IGV4Y2x1ZGUgXHUyMDE0IGFnZW50cyBhcmUgYXV0by1yZWdpc3RlcmVkIGFzIGNhbGxhYmxlIHRvb2xzXG4gIGlmIChjbGF1ZGVUb29sID09PSAnVGFzaycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBDaGVjayBmb3IgZXhwbGljaXQgbWFwcGluZ1xuICBpZiAoY2xhdWRlVG9HZW1pbmlUb29sc1tjbGF1ZGVUb29sXSkge1xuICAgIHJldHVybiBjbGF1ZGVUb0dlbWluaVRvb2xzW2NsYXVkZVRvb2xdO1xuICB9XG4gIC8vIERlZmF1bHQ6IGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gR2l0SHViIENvcGlsb3QgZm9ybWF0LlxuICogLSBBcHBsaWVzIGV4cGxpY2l0IG1hcHBpbmcgZnJvbSBjbGF1ZGVUb0NvcGlsb3RUb29sc1xuICogLSBIYW5kbGVzIG1jcF9fY29udGV4dDdfXyogcHJlZml4IFx1MjE5MiBpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8qXG4gKiAtIEZhbGxzIGJhY2sgdG8gbG93ZXJjYXNlIGZvciB1bmtub3duIHRvb2xzXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDb3BpbG90VG9vbE5hbWUoY2xhdWRlVG9vbCkge1xuICAvLyBtY3BfX2NvbnRleHQ3X18qIHdpbGRjYXJkIFx1MjE5MiBpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8qXG4gIGlmIChjbGF1ZGVUb29sLnN0YXJ0c1dpdGgoJ21jcF9fY29udGV4dDdfXycpKSB7XG4gICAgcmV0dXJuICdpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8nICsgY2xhdWRlVG9vbC5zbGljZSgnbWNwX19jb250ZXh0N19fJy5sZW5ndGgpO1xuICB9XG4gIC8vIENoZWNrIGV4cGxpY2l0IG1hcHBpbmdcbiAgaWYgKGNsYXVkZVRvQ29waWxvdFRvb2xzW2NsYXVkZVRvb2xdKSB7XG4gICAgcmV0dXJuIGNsYXVkZVRvQ29waWxvdFRvb2xzW2NsYXVkZVRvb2xdO1xuICB9XG4gIC8vIERlZmF1bHQ6IGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEFwcGx5IENvcGlsb3Qtc3BlY2lmaWMgY29udGVudCBjb252ZXJzaW9uIFx1MjAxNCBDT05WLTA2IChwYXRocykgKyBDT05WLTA3IChjb21tYW5kIG5hbWVzKS5cbiAqIFBhdGggbWFwcGluZ3MgZGVwZW5kIG9uIGluc3RhbGwgbW9kZTpcbiAqICAgR2xvYmFsOiB+Ly5jbGF1ZGUvIFx1MjE5MiB+Ly5jb3BpbG90LywgLi8uY2xhdWRlLyBcdTIxOTIgLi8uZ2l0aHViL1xuICogICBMb2NhbDogIH4vLmNsYXVkZS8gXHUyMTkyIC4vLmdpdGh1Yi8sIC4vLmNsYXVkZS8gXHUyMTkyIC4vLmdpdGh1Yi9cbiAqIEFwcGxpZWQgdG8gQUxMIENvcGlsb3QgY29udGVudCAoc2tpbGxzLCBhZ2VudHMsIGVuZ2luZSBmaWxlcykuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIFNvdXJjZSBjb250ZW50IHRvIGNvbnZlcnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzR2xvYmFsPWZhbHNlXSAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsID0gZmFsc2UpIHtcbiAgbGV0IGMgPSBjb250ZW50O1xuICAvLyBDT05WLTA2OiBQYXRoIHJlcGxhY2VtZW50IFx1MjAxNCBtb3N0IHNwZWNpZmljIGZpcnN0IHRvIGF2b2lkIHN1YnN0cmluZyBtYXRjaGVzXG4gIGlmIChpc0dsb2JhbCkge1xuICAgIGMgPSBjLnJlcGxhY2UoL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZywgJyRIT01FLy5jb3BpbG90LycpO1xuICAgIGMgPSBjLnJlcGxhY2UoL35cXC9cXC5jbGF1ZGVcXC8vZywgJ34vLmNvcGlsb3QvJyk7XG4gIH0gZWxzZSB7XG4gICAgYyA9IGMucmVwbGFjZSgvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nLCAnLmdpdGh1Yi8nKTtcbiAgICBjID0gYy5yZXBsYWNlKC9+XFwvXFwuY2xhdWRlXFwvL2csICcuZ2l0aHViLycpO1xuICB9XG4gIGMgPSBjLnJlcGxhY2UoL1xcLlxcL1xcLmNsYXVkZVxcLy9nLCAnLi8uZ2l0aHViLycpO1xuICBjID0gYy5yZXBsYWNlKC9cXC5jbGF1ZGVcXC8vZywgJy5naXRodWIvJyk7XG4gIC8vIENPTlYtMDc6IENvbW1hbmQgbmFtZSBjb252ZXJzaW9uIChhbGwgZXo6IHJlZmVyZW5jZXMgXHUyMTkyIGV6LSlcbiAgYyA9IGMucmVwbGFjZSgvZXo6L2csICdlei0nKTtcbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQ29udmVydCBhIENsYXVkZSBjb21tYW5kICgubWQpIHRvIGEgQ29waWxvdCBza2lsbCAoU0tJTEwubWQpLlxuICogVHJhbnNmb3JtcyBmcm9udG1hdHRlciBvbmx5IFx1MjAxNCBib2R5IHBhc3NlcyB0aHJvdWdoIHdpdGggQ09OVi0wNi8wNyBhcHBsaWVkLlxuICogU2tpbGxzIGtlZXAgb3JpZ2luYWwgdG9vbCBuYW1lcyAobm8gbWFwcGluZykgcGVyIENPTlRFWFQubWQgZGVjaXNpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db3BpbG90U2tpbGwoY29udGVudCwgc2tpbGxOYW1lLCBpc0dsb2JhbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsKTtcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb252ZXJ0ZWQpO1xuICBpZiAoIWZyb250bWF0dGVyKSByZXR1cm4gY29udmVydGVkO1xuXG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuICBjb25zdCBhcmd1bWVudEhpbnQgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2FyZ3VtZW50LWhpbnQnKTtcbiAgY29uc3QgYWdlbnQgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2FnZW50Jyk7XG5cbiAgLy8gQ09OVi0wMjogRXh0cmFjdCBhbGxvd2VkLXRvb2xzIFlBTUwgbXVsdGlsaW5lIGxpc3QgXHUyMTkyIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmdcbiAgY29uc3QgdG9vbHNNYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKC9eYWxsb3dlZC10b29sczpcXHMqXFxuKCg/OlxccystXFxzKy4rXFxuPykqKS9tKTtcbiAgbGV0IHRvb2xzTGluZSA9ICcnO1xuICBpZiAodG9vbHNNYXRjaCkge1xuICAgIGNvbnN0IHRvb2xzID0gdG9vbHNNYXRjaFsxXS5tYXRjaCgvXlxccystXFxzKyguKykvZ20pO1xuICAgIGlmICh0b29scykge1xuICAgICAgdG9vbHNMaW5lID0gdG9vbHMubWFwKHQgPT4gdC5yZXBsYWNlKC9eXFxzKy1cXHMrLywgJycpLnRyaW0oKSkuam9pbignLCAnKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWNvbnN0cnVjdCBmcm9udG1hdHRlciBpbiBDb3BpbG90IGZvcm1hdFxuICBsZXQgZm0gPSBgLS0tXFxubmFtZTogJHtza2lsbE5hbWV9XFxuZGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259XFxuYDtcbiAgaWYgKGFyZ3VtZW50SGludCkgZm0gKz0gYGFyZ3VtZW50LWhpbnQ6ICR7eWFtbFF1b3RlKGFyZ3VtZW50SGludCl9XFxuYDtcbiAgaWYgKGFnZW50KSBmbSArPSBgYWdlbnQ6ICR7YWdlbnR9XFxuYDtcbiAgaWYgKHRvb2xzTGluZSkgZm0gKz0gYGFsbG93ZWQtdG9vbHM6ICR7dG9vbHNMaW5lfVxcbmA7XG4gIGZtICs9ICctLS0nO1xuXG4gIHJldHVybiBgJHtmbX1cXG4ke2JvZHl9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgQ2xhdWRlIGFnZW50ICgubWQpIHRvIGEgQ29waWxvdCBhZ2VudCAoLmFnZW50Lm1kKS5cbiAqIEFwcGxpZXMgdG9vbCBtYXBwaW5nICsgZGVkdXBsaWNhdGlvbiwgZm9ybWF0cyB0b29scyBhcyBKU09OIGFycmF5LlxuICogQ09OVi0wNDogSlNPTiBhcnJheSBmb3JtYXQuIENPTlYtMDU6IFRvb2wgbmFtZSBtYXBwaW5nLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvcGlsb3RBZ2VudChjb250ZW50LCBpc0dsb2JhbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsKTtcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb252ZXJ0ZWQpO1xuICBpZiAoIWZyb250bWF0dGVyKSByZXR1cm4gY29udmVydGVkO1xuXG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ25hbWUnKSB8fCAndW5rbm93bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuICBjb25zdCBjb2xvciA9IGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCAnY29sb3InKTtcbiAgY29uc3QgdG9vbHNSYXcgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ3Rvb2xzJykgfHwgJyc7XG5cbiAgLy8gQ09OVi0wNCArIENPTlYtMDU6IE1hcCB0b29scywgZGVkdXBsaWNhdGUsIGZvcm1hdCBhcyBKU09OIGFycmF5XG4gIGNvbnN0IGNsYXVkZVRvb2xzID0gdG9vbHNSYXcuc3BsaXQoJywnKS5tYXAodCA9PiB0LnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBtYXBwZWRUb29scyA9IGNsYXVkZVRvb2xzLm1hcCh0ID0+IGNvbnZlcnRDb3BpbG90VG9vbE5hbWUodCkpO1xuICBjb25zdCB1bmlxdWVUb29scyA9IFsuLi5uZXcgU2V0KG1hcHBlZFRvb2xzKV07XG4gIGNvbnN0IHRvb2xzQXJyYXkgPSB1bmlxdWVUb29scy5sZW5ndGggPiAwXG4gICAgPyBcIlsnXCIgKyB1bmlxdWVUb29scy5qb2luKFwiJywgJ1wiKSArIFwiJ11cIlxuICAgIDogJ1tdJztcblxuICAvLyBSZWNvbnN0cnVjdCBmcm9udG1hdHRlciBpbiBDb3BpbG90IGZvcm1hdFxuICBsZXQgZm0gPSBgLS0tXFxubmFtZTogJHtuYW1lfVxcbmRlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufVxcbnRvb2xzOiAke3Rvb2xzQXJyYXl9XFxuYDtcbiAgaWYgKGNvbG9yKSBmbSArPSBgY29sb3I6ICR7Y29sb3J9XFxuYDtcbiAgZm0gKz0gJy0tLSc7XG5cbiAgcmV0dXJuIGAke2ZtfVxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiB0b1NpbmdsZUxpbmUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIHlhbWxRdW90ZSh2YWx1ZSkge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RnJvbnRtYXR0ZXJBbmRCb2R5KGNvbnRlbnQpIHtcbiAgaWYgKCFjb250ZW50LnN0YXJ0c1dpdGgoJy0tLScpKSB7XG4gICAgcmV0dXJuIHsgZnJvbnRtYXR0ZXI6IG51bGwsIGJvZHk6IGNvbnRlbnQgfTtcbiAgfVxuXG4gIGNvbnN0IGVuZEluZGV4ID0gY29udGVudC5pbmRleE9mKCctLS0nLCAzKTtcbiAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiB7IGZyb250bWF0dGVyOiBudWxsLCBib2R5OiBjb250ZW50IH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZyb250bWF0dGVyOiBjb250ZW50LnN1YnN0cmluZygzLCBlbmRJbmRleCkudHJpbSgpLFxuICAgIGJvZHk6IGNvbnRlbnQuc3Vic3RyaW5nKGVuZEluZGV4ICsgMyksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCBmaWVsZE5hbWUpIHtcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtmaWVsZE5hbWV9OlxcXFxzKiguKykkYCwgJ20nKTtcbiAgY29uc3QgbWF0Y2ggPSBmcm9udG1hdHRlci5tYXRjaChyZWdleCk7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuICByZXR1cm4gbWF0Y2hbMV0udHJpbSgpLnJlcGxhY2UoL15bJ1wiXXxbJ1wiXSQvZywgJycpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0U2xhc2hDb21tYW5kc1RvQ29kZXhTa2lsbE1lbnRpb25zKGNvbnRlbnQpIHtcbiAgbGV0IGNvbnZlcnRlZCA9IGNvbnRlbnQucmVwbGFjZSgvXFwvZXo6KFthLXowLTktXSspL2dpLCAoXywgY29tbWFuZE5hbWUpID0+IHtcbiAgICByZXR1cm4gYCRlei0ke1N0cmluZyhjb21tYW5kTmFtZSkudG9Mb3dlckNhc2UoKX1gO1xuICB9KTtcbiAgY29udmVydGVkID0gY29udmVydGVkLnJlcGxhY2UoL1xcL2V6LWhlbHBcXGIvZywgJyRlei1oZWxwJyk7XG4gIHJldHVybiBjb252ZXJ0ZWQ7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0NvZGV4TWFya2Rvd24oY29udGVudCkge1xuICBsZXQgY29udmVydGVkID0gY29udmVydFNsYXNoQ29tbWFuZHNUb0NvZGV4U2tpbGxNZW50aW9ucyhjb250ZW50KTtcbiAgY29udmVydGVkID0gY29udmVydGVkLnJlcGxhY2UoL1xcJEFSR1VNRU5UU1xcYi9nLCAne3tFWl9BUkdTfX0nKTtcbiAgcmV0dXJuIGNvbnZlcnRlZDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29kZXhTa2lsbEFkYXB0ZXJIZWFkZXIoc2tpbGxOYW1lKSB7XG4gIGNvbnN0IGludm9jYXRpb24gPSBgJCR7c2tpbGxOYW1lfWA7XG4gIHJldHVybiBgPGNvZGV4X3NraWxsX2FkYXB0ZXI+XG4jIyBBLiBTa2lsbCBJbnZvY2F0aW9uXG4tIFRoaXMgc2tpbGwgaXMgaW52b2tlZCBieSBtZW50aW9uaW5nIFxcYCR7aW52b2NhdGlvbn1cXGAuXG4tIFRyZWF0IGFsbCB1c2VyIHRleHQgYWZ0ZXIgXFxgJHtpbnZvY2F0aW9ufVxcYCBhcyBcXGB7e0VaX0FSR1N9fVxcYC5cbi0gSWYgbm8gYXJndW1lbnRzIGFyZSBwcmVzZW50LCB0cmVhdCBcXGB7e0VaX0FSR1N9fVxcYCBhcyBlbXB0eS5cblxuIyMgQi4gQXNrVXNlclF1ZXN0aW9uIFx1MjE5MiByZXF1ZXN0X3VzZXJfaW5wdXQgTWFwcGluZ1xuRVpfQWdlbnRzIHdvcmtmbG93cyB1c2UgXFxgQXNrVXNlclF1ZXN0aW9uXFxgIChDbGF1ZGUgQ29kZSBzeW50YXgpLiBUcmFuc2xhdGUgdG8gQ29kZXggXFxgcmVxdWVzdF91c2VyX2lucHV0XFxgOlxuXG5QYXJhbWV0ZXIgbWFwcGluZzpcbi0gXFxgaGVhZGVyXFxgIFx1MjE5MiBcXGBoZWFkZXJcXGBcbi0gXFxgcXVlc3Rpb25cXGAgXHUyMTkyIFxcYHF1ZXN0aW9uXFxgXG4tIE9wdGlvbnMgZm9ybWF0dGVkIGFzIFxcYFwiTGFiZWxcIiBcdTIwMTQgZGVzY3JpcHRpb25cXGAgXHUyMTkyIFxcYHtsYWJlbDogXCJMYWJlbFwiLCBkZXNjcmlwdGlvbjogXCJkZXNjcmlwdGlvblwifVxcYFxuLSBHZW5lcmF0ZSBcXGBpZFxcYCBmcm9tIGhlYWRlcjogbG93ZXJjYXNlLCByZXBsYWNlIHNwYWNlcyB3aXRoIHVuZGVyc2NvcmVzXG5cbkJhdGNoZWQgY2FsbHM6XG4tIFxcYEFza1VzZXJRdWVzdGlvbihbcTEsIHEyXSlcXGAgXHUyMTkyIHNpbmdsZSBcXGByZXF1ZXN0X3VzZXJfaW5wdXRcXGAgd2l0aCBtdWx0aXBsZSBlbnRyaWVzIGluIFxcYHF1ZXN0aW9uc1tdXFxgXG5cbk11bHRpLXNlbGVjdCB3b3JrYXJvdW5kOlxuLSBDb2RleCBoYXMgbm8gXFxgbXVsdGlTZWxlY3RcXGAuIFVzZSBzZXF1ZW50aWFsIHNpbmdsZS1zZWxlY3RzLCBvciBwcmVzZW50IGEgbnVtYmVyZWQgZnJlZWZvcm0gbGlzdCBhc2tpbmcgdGhlIHVzZXIgdG8gZW50ZXIgY29tbWEtc2VwYXJhdGVkIG51bWJlcnMuXG5cbkV4ZWN1dGUgbW9kZSBmYWxsYmFjazpcbi0gV2hlbiBcXGByZXF1ZXN0X3VzZXJfaW5wdXRcXGAgaXMgcmVqZWN0ZWQgKEV4ZWN1dGUgbW9kZSksIHByZXNlbnQgYSBwbGFpbi10ZXh0IG51bWJlcmVkIGxpc3QgYW5kIHBpY2sgYSByZWFzb25hYmxlIGRlZmF1bHQuXG5cbiMjIEMuIFRhc2soKSBcdTIxOTIgc3Bhd25fYWdlbnQgTWFwcGluZ1xuRVpfQWdlbnRzIHdvcmtmbG93cyB1c2UgXFxgVGFzayguLi4pXFxgIChDbGF1ZGUgQ29kZSBzeW50YXgpLiBUcmFuc2xhdGUgdG8gQ29kZXggY29sbGFib3JhdGlvbiB0b29sczpcblxuRGlyZWN0IG1hcHBpbmc6XG4tIFxcYFRhc2soc3ViYWdlbnRfdHlwZT1cIlhcIiwgcHJvbXB0PVwiWVwiKVxcYCBcdTIxOTIgXFxgc3Bhd25fYWdlbnQoYWdlbnRfdHlwZT1cIlhcIiwgbWVzc2FnZT1cIllcIilcXGBcbi0gXFxgVGFzayhtb2RlbD1cIi4uLlwiKVxcYCBcdTIxOTIgb21pdCAoQ29kZXggdXNlcyBwZXItcm9sZSBjb25maWcsIG5vdCBpbmxpbmUgbW9kZWwgc2VsZWN0aW9uKVxuLSBcXGBmb3JrX2NvbnRleHQ6IGZhbHNlXFxgIGJ5IGRlZmF1bHQgXHUyMDE0IEVaX0FnZW50cyBhZ2VudHMgbG9hZCB0aGVpciBvd24gY29udGV4dCB2aWEgXFxgPGZpbGVzX3RvX3JlYWQ+XFxgIGJsb2Nrc1xuXG5QYXJhbGxlbCBmYW4tb3V0OlxuLSBTcGF3biBtdWx0aXBsZSBhZ2VudHMgXHUyMTkyIGNvbGxlY3QgYWdlbnQgSURzIFx1MjE5MiBcXGB3YWl0KGlkcylcXGAgZm9yIGFsbCB0byBjb21wbGV0ZVxuXG5SZXN1bHQgcGFyc2luZzpcbi0gTG9vayBmb3Igc3RydWN0dXJlZCBtYXJrZXJzIGluIGFnZW50IG91dHB1dDogXFxgQ0hFQ0tQT0lOVFxcYCwgXFxgUExBTiBDT01QTEVURVxcYCwgXFxgU1VNTUFSWVxcYCwgZXRjLlxuLSBcXGBjbG9zZV9hZ2VudChpZClcXGAgYWZ0ZXIgY29sbGVjdGluZyByZXN1bHRzIGZyb20gZWFjaCBhZ2VudFxuPC9jb2RleF9za2lsbF9hZGFwdGVyPmA7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db2RleFNraWxsKGNvbnRlbnQsIHNraWxsTmFtZSkge1xuICBjb25zdCBjb252ZXJ0ZWQgPSBjb252ZXJ0Q2xhdWRlVG9Db2RleE1hcmtkb3duKGNvbnRlbnQpO1xuICBjb25zdCB7IGZyb250bWF0dGVyLCBib2R5IH0gPSBleHRyYWN0RnJvbnRtYXR0ZXJBbmRCb2R5KGNvbnZlcnRlZCk7XG4gIGxldCBkZXNjcmlwdGlvbiA9IGBSdW4gRVpfQWdlbnRzIHdvcmtmbG93ICR7c2tpbGxOYW1lfS5gO1xuICBpZiAoZnJvbnRtYXR0ZXIpIHtcbiAgICBjb25zdCBtYXliZURlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpO1xuICAgIGlmIChtYXliZURlc2NyaXB0aW9uKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9IG1heWJlRGVzY3JpcHRpb247XG4gICAgfVxuICB9XG4gIGRlc2NyaXB0aW9uID0gdG9TaW5nbGVMaW5lKGRlc2NyaXB0aW9uKTtcbiAgY29uc3Qgc2hvcnREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLmxlbmd0aCA+IDE4MCA/IGAke2Rlc2NyaXB0aW9uLnNsaWNlKDAsIDE3Nyl9Li4uYCA6IGRlc2NyaXB0aW9uO1xuICBjb25zdCBhZGFwdGVyID0gZ2V0Q29kZXhTa2lsbEFkYXB0ZXJIZWFkZXIoc2tpbGxOYW1lKTtcblxuICByZXR1cm4gYC0tLVxcbm5hbWU6ICR7eWFtbFF1b3RlKHNraWxsTmFtZSl9XFxuZGVzY3JpcHRpb246ICR7eWFtbFF1b3RlKGRlc2NyaXB0aW9uKX1cXG5tZXRhZGF0YTpcXG4gIHNob3J0LWRlc2NyaXB0aW9uOiAke3lhbWxRdW90ZShzaG9ydERlc2NyaXB0aW9uKX1cXG4tLS1cXG5cXG4ke2FkYXB0ZXJ9XFxuXFxuJHtib2R5LnRyaW1TdGFydCgpfWA7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb1F3ZW5BZ2VudChjb250ZW50KSB7XG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIsIGJvZHkgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBjb250ZW50O1xuXG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ25hbWUnKSB8fCAndW5rbm93bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuXG4gIC8vIFF3ZW4gQ29kZSB1c2VzIHNpbXBsZSBtYXJrZG93bi4gV2UnbGwgcHV0IG5hbWUgYW5kIGRlc2NyaXB0aW9uIGluIHRoZSBib2R5LlxuICByZXR1cm4gYCMgQWdlbnQ6ICR7bmFtZX1cXG5cXG4ke2Rlc2NyaXB0aW9ufVxcblxcbiR7Ym9keS50cmltU3RhcnQoKX1gO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlVG9LaW1pU2tpbGwoY29udGVudCwgc2tpbGxOYW1lKSB7XG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIsIGJvZHkgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBjb250ZW50O1xuXG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuXG4gIC8vIFJlY29uc3RydWN0IGFzIHNpbXBsZSBNYXJrZG93blxuICByZXR1cm4gYCMgU2tpbGw6ICR7c2tpbGxOYW1lfVxcblxcbiR7ZGVzY3JpcHRpb259XFxuXFxuJHtib2R5LnRyaW1TdGFydCgpfWA7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0tpbWlBZ2VudChjb250ZW50KSB7XG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIsIGJvZHkgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBjb250ZW50O1xuXG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ25hbWUnKSB8fCAndW5rbm93bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuXG4gIC8vIEtpbWkgQ29kZSB1c2VzIHNpbXBsZSBtYXJrZG93blxuICByZXR1cm4gYCMgQWdlbnQ6ICR7bmFtZX1cXG5cXG4ke2Rlc2NyaXB0aW9ufVxcblxcbiR7Ym9keS50cmltU3RhcnQoKX1gO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgY29tbWFuZCAoLm1kKSB0byBhIFF3ZW4gc2tpbGwgKFNLSUxMLm1kKS5cbiAqIFN0cmlwcyBmcm9udG1hdHRlciBhbmQgZm9ybWF0cyBhcyBzaW1wbGUgTWFya2Rvd24uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb1F3ZW5Ta2lsbChjb250ZW50LCBza2lsbE5hbWUpIHtcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb250ZW50KTtcbiAgaWYgKCFmcm9udG1hdHRlcikgcmV0dXJuIGNvbnRlbnQ7XG5cbiAgY29uc3QgZGVzY3JpcHRpb24gPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2Rlc2NyaXB0aW9uJykgfHwgJyc7XG5cbiAgLy8gUmVjb25zdHJ1Y3QgYXMgc2ltcGxlIE1hcmtkb3duXG4gIHJldHVybiBgIyBTa2lsbDogJHtza2lsbE5hbWV9XFxuXFxuJHtkZXNjcmlwdGlvbn1cXG5cXG4ke2JvZHkudHJpbVN0YXJ0KCl9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IENsYXVkZSBDb2RlIGFnZW50IG1hcmtkb3duIHRvIENvZGV4IGFnZW50IGZvcm1hdC5cbiAqIEFwcGxpZXMgYmFzZSBtYXJrZG93biBjb252ZXJzaW9ucywgdGhlbiBhZGRzIGEgPGNvZGV4X2FnZW50X3JvbGU+IGhlYWRlclxuICogYW5kIGNsZWFucyB1cCBmcm9udG1hdHRlciAocmVtb3ZlcyB0b29scy9jb2xvciBmaWVsZHMpLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvZGV4QWdlbnQoY29udGVudCkge1xuICBsZXQgY29udmVydGVkID0gY29udmVydENsYXVkZVRvQ29kZXhNYXJrZG93bihjb250ZW50KTtcblxuICBjb25zdCB7IGZyb250bWF0dGVyLCBib2R5IH0gPSBleHRyYWN0RnJvbnRtYXR0ZXJBbmRCb2R5KGNvbnZlcnRlZCk7XG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBjb252ZXJ0ZWQ7XG5cbiAgY29uc3QgbmFtZSA9IGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCAnbmFtZScpIHx8ICd1bmtub3duJztcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2Rlc2NyaXB0aW9uJykgfHwgJyc7XG4gIGNvbnN0IHRvb2xzID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICd0b29scycpIHx8ICcnO1xuXG4gIGNvbnN0IHJvbGVIZWFkZXIgPSBgPGNvZGV4X2FnZW50X3JvbGU+XG5yb2xlOiAke25hbWV9XG50b29sczogJHt0b29sc31cbnB1cnBvc2U6ICR7dG9TaW5nbGVMaW5lKGRlc2NyaXB0aW9uKX1cbjwvY29kZXhfYWdlbnRfcm9sZT5gO1xuXG4gIGNvbnN0IGNsZWFuRnJvbnRtYXR0ZXIgPSBgLS0tXFxubmFtZTogJHt5YW1sUXVvdGUobmFtZSl9XFxuZGVzY3JpcHRpb246ICR7eWFtbFF1b3RlKHRvU2luZ2xlTGluZShkZXNjcmlwdGlvbikpfVxcbi0tLWA7XG5cbiAgcmV0dXJuIGAke2NsZWFuRnJvbnRtYXR0ZXJ9XFxuXFxuJHtyb2xlSGVhZGVyfVxcbiR7Ym9keX1gO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgcGVyLWFnZW50IC50b21sIGNvbmZpZyBmaWxlIGZvciBDb2RleC5cbiAqIFNldHMgc2FuZGJveF9tb2RlIGFuZCBkZXZlbG9wZXJfaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGFnZW50IG1hcmtkb3duIGJvZHkuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQ29kZXhBZ2VudFRvbWwoYWdlbnROYW1lLCBhZ2VudENvbnRlbnQpIHtcbiAgY29uc3Qgc2FuZGJveE1vZGUgPSBDT0RFWF9BR0VOVF9TQU5EQk9YW2FnZW50TmFtZV0gfHwgJ3JlYWQtb25seSc7XG4gIGNvbnN0IHsgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShhZ2VudENvbnRlbnQpO1xuICBjb25zdCBpbnN0cnVjdGlvbnMgPSBib2R5LnRyaW0oKTtcblxuICBjb25zdCBsaW5lcyA9IFtcbiAgICBgc2FuZGJveF9tb2RlID0gXCIke3NhbmRib3hNb2RlfVwiYCxcbiAgICAvLyBBZ2VudCBwcm9tcHRzIGNvbnRhaW4gcmF3IGJhY2tzbGFzaGVzIGluIHJlZ2V4ZXMgYW5kIHNoZWxsIHNuaXBwZXRzLlxuICAgIC8vIFRPTUwgbGl0ZXJhbCBtdWx0aWxpbmUgc3RyaW5ncyBwcmVzZXJ2ZSB0aGVtIHdpdGhvdXQgZXNjYXBlIHBhcnNpbmcuXG4gICAgYGRldmVsb3Blcl9pbnN0cnVjdGlvbnMgPSAnJydgLFxuICAgIGluc3RydWN0aW9ucyxcbiAgICBgJycnYCxcbiAgXTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbic7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIEVaX0FnZW50cyBjb25maWcgYmxvY2sgZm9yIENvZGV4IGNvbmZpZy50b21sLlxuICogQHBhcmFtIHtBcnJheTx7bmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nfT59IGFnZW50c1xuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUNvZGV4Q29uZmlnQmxvY2soYWdlbnRzKSB7XG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIEVaX0NPREVYX01BUktFUixcbiAgICAnJyxcbiAgXTtcblxuICBmb3IgKGNvbnN0IHsgbmFtZSwgZGVzY3JpcHRpb24gfSBvZiBhZ2VudHMpIHtcbiAgICBsaW5lcy5wdXNoKGBbYWdlbnRzLiR7bmFtZX1dYCk7XG4gICAgbGluZXMucHVzaChgZGVzY3JpcHRpb24gPSAke0pTT04uc3RyaW5naWZ5KGRlc2NyaXB0aW9uKX1gKTtcbiAgICBsaW5lcy5wdXNoKGBjb25maWdfZmlsZSA9IFwiYWdlbnRzLyR7bmFtZX0udG9tbFwiYCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogU3RyaXAgRVpfQWdlbnRzIHNlY3Rpb25zIGZyb20gQ29kZXggY29uZmlnLnRvbWwgY29udGVudC5cbiAqIFJldHVybnMgY2xlYW5lZCBjb250ZW50LCBvciBudWxsIGlmIGZpbGUgd291bGQgYmUgZW1wdHkuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwRXpBZ2VudHNGcm9tQ29kZXhDb25maWcoY29udGVudCkge1xuICBjb25zdCBtYXJrZXJJbmRleCA9IGNvbnRlbnQuaW5kZXhPZihFWl9DT0RFWF9NQVJLRVIpO1xuXG4gIGlmIChtYXJrZXJJbmRleCAhPT0gLTEpIHtcbiAgICAvLyBIYXMgRVpfQWdlbnRzIG1hcmtlciBcdTIwMTQgcmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSBtYXJrZXIgdG8gRU9GXG4gICAgbGV0IGJlZm9yZSA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIG1hcmtlckluZGV4KS50cmltRW5kKCk7XG4gICAgLy8gQWxzbyBzdHJpcCBFWi1pbmplY3RlZCBmZWF0dXJlIGtleXMgYWJvdmUgdGhlIG1hcmtlciAoQ2FzZSAzIGluamVjdClcbiAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXm11bHRpX2FnZW50XFxzKj1cXHMqdHJ1ZVxccypcXG4/L20sICcnKTtcbiAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXmRlZmF1bHRfbW9kZV9yZXF1ZXN0X3VzZXJfaW5wdXRcXHMqPVxccyp0cnVlXFxzKlxcbj8vbSwgJycpO1xuICAgIGJlZm9yZSA9IGJlZm9yZS5yZXBsYWNlKC9eXFxbZmVhdHVyZXNcXF1cXHMqXFxuKD89XFxbfCQpL20sICcnKTtcbiAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXFxuezMsfS9nLCAnXFxuXFxuJykudHJpbSgpO1xuICAgIGlmICghYmVmb3JlKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYmVmb3JlICsgJ1xcbic7XG4gIH1cblxuICAvLyBObyBtYXJrZXIgYnV0IG1heSBoYXZlIEVaLWluamVjdGVkIGZlYXR1cmUga2V5c1xuICBsZXQgY2xlYW5lZCA9IGNvbnRlbnQ7XG4gIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoL15tdWx0aV9hZ2VudFxccyo9XFxzKnRydWVcXHMqXFxuPy9tLCAnJyk7XG4gIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoL15kZWZhdWx0X21vZGVfcmVxdWVzdF91c2VyX2lucHV0XFxzKj1cXHMqdHJ1ZVxccypcXG4/L20sICcnKTtcblxuICAvLyBSZW1vdmUgW2FnZW50cy5lei0qXSBzZWN0aW9ucyAoZnJvbSBoZWFkZXIgdG8gbmV4dCBzZWN0aW9uIG9yIEVPRilcbiAgY2xlYW5lZCA9IGNsZWFuZWQucmVwbGFjZSgvXlxcW2FnZW50c1xcLmV6LVteXFxdXStcXF1cXG4oPzooPyFcXFspW15cXG5dKlxcbj8pKi9nbSwgJycpO1xuXG4gIC8vIFJlbW92ZSBbZmVhdHVyZXNdIHNlY3Rpb24gaWYgbm93IGVtcHR5IChvbmx5IGhlYWRlciwgbm8ga2V5cyBiZWZvcmUgbmV4dCBzZWN0aW9uKVxuICBjbGVhbmVkID0gY2xlYW5lZC5yZXBsYWNlKC9eXFxbZmVhdHVyZXNcXF1cXHMqXFxuKD89XFxbfCQpL20sICcnKTtcblxuICAvLyBSZW1vdmUgW2FnZW50c10gc2VjdGlvbiBpZiBub3cgZW1wdHlcbiAgY2xlYW5lZCA9IGNsZWFuZWQucmVwbGFjZSgvXlxcW2FnZW50c1xcXVxccypcXG4oPz1cXFt8JCkvbSwgJycpO1xuXG4gIC8vIENsZWFuIHVwIGV4Y2Vzc2l2ZSBibGFuayBsaW5lc1xuICBjbGVhbmVkID0gY2xlYW5lZC5yZXBsYWNlKC9cXG57Myx9L2csICdcXG5cXG4nKS50cmltKCk7XG5cbiAgaWYgKCFjbGVhbmVkKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGNsZWFuZWQgKyAnXFxuJztcbn1cblxuLyoqXG4gKiBNZXJnZSBFWl9BZ2VudHMgY29uZmlnIGJsb2NrIGludG8gYW4gZXhpc3Rpbmcgb3IgbmV3IGNvbmZpZy50b21sLlxuICogVGhyZWUgY2FzZXM6IG5ldyBmaWxlLCBleGlzdGluZyB3aXRoIEVaX0FnZW50cyBtYXJrZXIsIGV4aXN0aW5nIHdpdGhvdXQgbWFya2VyLlxuICovXG5mdW5jdGlvbiBtZXJnZUNvZGV4Q29uZmlnKGNvbmZpZ1BhdGgsIEVaX0FnZW50c0Jsb2NrKSB7XG4gIC8vIENhc2UgMTogTm8gY29uZmlnLnRvbWwgXHUyMDE0IGNyZWF0ZSBmcmVzaFxuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEVaX0FnZW50c0Jsb2NrICsgJ1xcbicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nID0gZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IG1hcmtlckluZGV4ID0gZXhpc3RpbmcuaW5kZXhPZihFWl9DT0RFWF9NQVJLRVIpO1xuXG4gIC8vIENhc2UgMjogSGFzIEVaX0FnZW50cyBtYXJrZXIgXHUyMDE0IHRydW5jYXRlIGFuZCByZS1hcHBlbmRcbiAgaWYgKG1hcmtlckluZGV4ICE9PSAtMSkge1xuICAgIGxldCBiZWZvcmUgPSBleGlzdGluZy5zdWJzdHJpbmcoMCwgbWFya2VySW5kZXgpLnRyaW1FbmQoKTtcbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICAvLyBTdHJpcCBhbnkgRVotbWFuYWdlZCBzZWN0aW9ucyB0aGF0IGxlYWtlZCBhYm92ZSB0aGUgbWFya2VyIGZyb20gcHJldmlvdXMgaW5zdGFsbHNcbiAgICAgIGJlZm9yZSA9IGJlZm9yZS5yZXBsYWNlKC9eXFxbYWdlbnRzXFwuZXotW15cXF1dK1xcXVxcbig/Oig/IVxcWylbXlxcbl0qXFxuPykqL2dtLCAnJyk7XG4gICAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXlxcW2FnZW50c1xcXVxcbig/Oig/IVxcWylbXlxcbl0qXFxuPykqL20sICcnKTtcbiAgICAgIGJlZm9yZSA9IGJlZm9yZS5yZXBsYWNlKC9cXG57Myx9L2csICdcXG5cXG4nKS50cmltRW5kKCk7XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgYmVmb3JlICsgJ1xcblxcbicgKyBFWl9BZ2VudHNCbG9jayArICdcXG4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBFWl9BZ2VudHNCbG9jayArICdcXG4nKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ2FzZSAzOiBObyBtYXJrZXIgXHUyMDE0IGFwcGVuZCBFWl9BZ2VudHMgYmxvY2tcbiAgbGV0IGNvbnRlbnQgPSBleGlzdGluZztcbiAgY29udGVudCA9IGNvbnRlbnQudHJpbUVuZCgpICsgJ1xcblxcbicgKyBFWl9BZ2VudHNCbG9jayArICdcXG4nO1xuXG4gIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgY29udGVudCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRDb3BpbG90SW5zdHJ1Y3Rpb25zTWFya2VyUGFpcihjb250ZW50OiBzdHJpbmcpOiB7IG9wZW5JbmRleDogbnVtYmVyOyBjbG9zZUluZGV4OiBudW1iZXI7IGNsb3NlTWFya2VyOiBzdHJpbmcgfSB8IG51bGwge1xuICBjb25zdCBtYXJrZXJQYWlyczogW3N0cmluZywgc3RyaW5nXVtdID0gW1xuICAgIFtFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19NQVJLRVIsIEVaX0NPUElMT1RfSU5TVFJVQ1RJT05TX0NMT1NFX01BUktFUl0sXG4gICAgW0xFR0FDWV9FWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19NQVJLRVIsIExFR0FDWV9FWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19DTE9TRV9NQVJLRVJdLFxuICBdO1xuXG4gIGZvciAoY29uc3QgW29wZW5NYXJrZXIsIGNsb3NlTWFya2VyXSBvZiBtYXJrZXJQYWlycykge1xuICAgIGNvbnN0IG9wZW5JbmRleCA9IGNvbnRlbnQuaW5kZXhPZihvcGVuTWFya2VyKTtcbiAgICBjb25zdCBjbG9zZUluZGV4ID0gY29udGVudC5pbmRleE9mKGNsb3NlTWFya2VyKTtcbiAgICBpZiAob3BlbkluZGV4ICE9PSAtMSAmJiBjbG9zZUluZGV4ICE9PSAtMSAmJiBjbG9zZUluZGV4ID49IG9wZW5JbmRleCkge1xuICAgICAgcmV0dXJuIHsgb3BlbkluZGV4LCBjbG9zZUluZGV4LCBjbG9zZU1hcmtlciB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIE1lcmdlIEVaX0FnZW50cyBpbnN0cnVjdGlvbnMgaW50byBjb3BpbG90LWluc3RydWN0aW9ucy5tZC5cbiAqIFRocmVlIGNhc2VzOiBuZXcgZmlsZSwgZXhpc3Rpbmcgd2l0aCBtYXJrZXJzLCBleGlzdGluZyB3aXRob3V0IG1hcmtlcnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggLSBGdWxsIHBhdGggdG8gY29waWxvdC1pbnN0cnVjdGlvbnMubWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBFWl9BZ2VudHNDb250ZW50IC0gVGVtcGxhdGUgY29udGVudCAod2l0aG91dCBtYXJrZXJzKVxuICovXG5mdW5jdGlvbiBtZXJnZUNvcGlsb3RJbnN0cnVjdGlvbnMoZmlsZVBhdGgsIEVaX0FnZW50c0NvbnRlbnQpIHtcbiAgY29uc3QgRVpfQWdlbnRzQmxvY2sgPSBFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19NQVJLRVIgKyAnXFxuJyArXG4gICAgRVpfQWdlbnRzQ29udGVudC50cmltKCkgKyAnXFxuJyArXG4gICAgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfQ0xPU0VfTUFSS0VSO1xuXG4gIC8vIENhc2UgMTogTm8gZmlsZSBcdTIwMTQgY3JlYXRlIGZyZXNoXG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBFWl9BZ2VudHNCbG9jayArICdcXG4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgbWFya2VyTWF0Y2ggPSBmaW5kQ29waWxvdEluc3RydWN0aW9uc01hcmtlclBhaXIoZXhpc3RpbmcpO1xuXG4gIC8vIENhc2UgMjogSGFzIEVaX0FnZW50cyBtYXJrZXJzIFx1MjAxNCByZXBsYWNlIGJldHdlZW4gbWFya2Vyc1xuICBpZiAobWFya2VyTWF0Y2gpIHtcbiAgICBjb25zdCBiZWZvcmUgPSBleGlzdGluZy5zdWJzdHJpbmcoMCwgbWFya2VyTWF0Y2gub3BlbkluZGV4KS50cmltRW5kKCk7XG4gICAgY29uc3QgYWZ0ZXIgPSBleGlzdGluZy5zdWJzdHJpbmcobWFya2VyTWF0Y2guY2xvc2VJbmRleCArIG1hcmtlck1hdGNoLmNsb3NlTWFya2VyLmxlbmd0aCkudHJpbVN0YXJ0KCk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSAnJztcbiAgICBpZiAoYmVmb3JlKSBuZXdDb250ZW50ICs9IGJlZm9yZSArICdcXG5cXG4nO1xuICAgIG5ld0NvbnRlbnQgKz0gRVpfQWdlbnRzQmxvY2s7XG4gICAgaWYgKGFmdGVyKSBuZXdDb250ZW50ICs9ICdcXG5cXG4nICsgYWZ0ZXI7XG4gICAgbmV3Q29udGVudCArPSAnXFxuJztcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBDYXNlIDM6IE5vIG1hcmtlcnMgXHUyMDE0IGFwcGVuZCBhdCBlbmRcbiAgY29uc3QgY29udGVudCA9IGV4aXN0aW5nLnRyaW1FbmQoKSArICdcXG5cXG4nICsgRVpfQWdlbnRzQmxvY2sgKyAnXFxuJztcbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgY29udGVudCk7XG59XG5cbi8qKlxuICogU3RyaXAgRVpfQWdlbnRzIHNlY3Rpb24gZnJvbSBjb3BpbG90LWluc3RydWN0aW9ucy5tZCBjb250ZW50LlxuICogUmV0dXJucyBjbGVhbmVkIGNvbnRlbnQsIG9yIG51bGwgaWYgZmlsZSBzaG91bGQgYmUgZGVsZXRlZCAod2FzIEVaLW9ubHkpLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBGaWxlIGNvbnRlbnRcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH0gLSBDbGVhbmVkIGNvbnRlbnQgb3IgbnVsbCBpZiBlbXB0eVxuICovXG5mdW5jdGlvbiBzdHJpcEV6QWdlbnRzRnJvbUNvcGlsb3RJbnN0cnVjdGlvbnMoY29udGVudCkge1xuICBjb25zdCBtYXJrZXJNYXRjaCA9IGZpbmRDb3BpbG90SW5zdHJ1Y3Rpb25zTWFya2VyUGFpcihjb250ZW50KTtcblxuICBpZiAobWFya2VyTWF0Y2gpIHtcbiAgICBjb25zdCBiZWZvcmUgPSBjb250ZW50LnN1YnN0cmluZygwLCBtYXJrZXJNYXRjaC5vcGVuSW5kZXgpLnRyaW1FbmQoKTtcbiAgICBjb25zdCBhZnRlciA9IGNvbnRlbnQuc3Vic3RyaW5nKG1hcmtlck1hdGNoLmNsb3NlSW5kZXggKyBtYXJrZXJNYXRjaC5jbG9zZU1hcmtlci5sZW5ndGgpLnRyaW1TdGFydCgpO1xuICAgIGNvbnN0IGNsZWFuZWQgPSAoYmVmb3JlICsgKGJlZm9yZSAmJiBhZnRlciA/ICdcXG5cXG4nIDogJycpICsgYWZ0ZXIpLnRyaW0oKTtcbiAgICBpZiAoIWNsZWFuZWQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBjbGVhbmVkICsgJ1xcbic7XG4gIH1cblxuICAvLyBObyBtYXJrZXJzIGZvdW5kIFx1MjAxNCBub3RoaW5nIHRvIHN0cmlwXG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGNvbmZpZy50b21sIGFuZCBwZXItYWdlbnQgLnRvbWwgZmlsZXMgZm9yIENvZGV4LlxuICogUmVhZHMgYWdlbnQgLm1kIGZpbGVzIGZyb20gc291cmNlLCBleHRyYWN0cyBtZXRhZGF0YSwgd3JpdGVzIC50b21sIGNvbmZpZ3MuXG4gKi9cbmZ1bmN0aW9uIGluc3RhbGxDb2RleENvbmZpZyh0YXJnZXREaXI6IHN0cmluZywgYWdlbnRzU3JjOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvbmZpZy50b21sJyk7XG4gIGNvbnN0IGFnZW50c1RvbWxEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnYWdlbnRzJyk7XG4gIGZzLm1rZGlyU3luYyhhZ2VudHNUb21sRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBhZ2VudEVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhhZ2VudHNTcmMpLmZpbHRlcihmID0+IGYuc3RhcnRzV2l0aCgnZXotJykgJiYgZi5lbmRzV2l0aCgnLm1kJykpO1xuICBjb25zdCBhZ2VudHM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0+ID0gW107XG5cbiAgLy8gQ29tcHV0ZSB0aGUgQ29kZXggcGF0aFByZWZpeCBmb3IgcmVwbGFjaW5nIC5jbGF1ZGUgcGF0aHNcbiAgLy8gVXNlIHRpbGRlLWJhc2VkIHBhdGggdG8gYXZvaWQgYmFraW5nIGFic29sdXRlIHBhdGhzIGludG8gdGVtcGxhdGVzXG4gIGNvbnN0IGNvZGV4UGF0aFByZWZpeCA9IGAke3RhcmdldERpci5yZXBsYWNlKC9cXFxcL2csICcvJykucmVwbGFjZShvcy5ob21lZGlyKCkucmVwbGFjZSgvXFxcXC9nLCAnLycpLCAnficpfS9gO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhZ2VudEVudHJpZXMpIHtcbiAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oYWdlbnRzU3JjLCBmaWxlKSwgJ3V0ZjgnKTtcbiAgICAvLyBSZXBsYWNlIC5jbGF1ZGUgcGF0aHMgYmVmb3JlIGdlbmVyYXRpbmcgVE9NTCAoc291cmNlIGZpbGVzIHVzZSB+Ly5jbGF1ZGUgYW5kICRIT01FLy5jbGF1ZGUpXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvflxcL1xcLmNsYXVkZVxcLy9nLCBjb2RleFBhdGhQcmVmaXgpO1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZywgdG9Ib21lUHJlZml4KGNvZGV4UGF0aFByZWZpeCkpO1xuICAgIGNvbnN0IHsgZnJvbnRtYXR0ZXIgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XG4gICAgY29uc3QgbmFtZSA9IGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCAnbmFtZScpIHx8IGZpbGUucmVwbGFjZSgnLm1kJywgJycpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuXG4gICAgYWdlbnRzLnB1c2goeyBuYW1lLCBkZXNjcmlwdGlvbjogdG9TaW5nbGVMaW5lKGRlc2NyaXB0aW9uKSB9KTtcblxuICAgIGNvbnN0IHRvbWxDb250ZW50ID0gZ2VuZXJhdGVDb2RleEFnZW50VG9tbChuYW1lLCBjb250ZW50KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihhZ2VudHNUb21sRGlyLCBgJHtuYW1lfS50b21sYCksIHRvbWxDb250ZW50KTtcbiAgfVxuXG4gIGNvbnN0IEVaX0FnZW50c0Jsb2NrID0gZ2VuZXJhdGVDb2RleENvbmZpZ0Jsb2NrKGFnZW50cyk7XG4gIG1lcmdlQ29kZXhDb25maWcoY29uZmlnUGF0aCwgRVpfQWdlbnRzQmxvY2spO1xuXG4gIHJldHVybiBhZ2VudHMubGVuZ3RoO1xufVxuXG4vKipcbiAqIFN0cmlwIEhUTUwgPHN1Yj4gdGFncyBmb3IgR2VtaW5pIENMSSBvdXRwdXRcbiAqIFRlcm1pbmFscyBkb24ndCBzdXBwb3J0IHN1YnNjcmlwdCBcdTIwMTQgR2VtaW5pIHJlbmRlcnMgdGhlc2UgYXMgcmF3IEhUTUwuXG4gKiBDb252ZXJ0cyA8c3ViPnRleHQ8L3N1Yj4gdG8gaXRhbGljICoodGV4dCkqIGZvciByZWFkYWJsZSB0ZXJtaW5hbCBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwU3ViVGFncyhjb250ZW50KSB7XG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UoLzxzdWI+KC4qPyk8XFwvc3ViPi9nLCAnKigkMSkqJyk7XG59XG5cbi8qKlxuICogQ29udmVydCBDbGF1ZGUgQ29kZSBhZ2VudCBmcm9udG1hdHRlciB0byBHZW1pbmkgQ0xJIGZvcm1hdFxuICogR2VtaW5pIGFnZW50cyB1c2UgLm1kIGZpbGVzIHdpdGggWUFNTCBmcm9udG1hdHRlciwgc2FtZSBhcyBDbGF1ZGUsXG4gKiBidXQgd2l0aCBkaWZmZXJlbnQgZmllbGQgbmFtZXMgYW5kIGZvcm1hdHM6XG4gKiAtIHRvb2xzOiBtdXN0IGJlIGEgWUFNTCBhcnJheSAobm90IGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcpXG4gKiAtIHRvb2wgbmFtZXM6IG11c3QgdXNlIEdlbWluaSBidWlsdC1pbiBuYW1lcyAocmVhZF9maWxlLCBub3QgUmVhZClcbiAqIC0gY29sb3I6IG11c3QgYmUgcmVtb3ZlZCAoY2F1c2VzIHZhbGlkYXRpb24gZXJyb3IpXG4gKiAtIHNraWxsczogbXVzdCBiZSByZW1vdmVkIChjYXVzZXMgdmFsaWRhdGlvbiBlcnJvcilcbiAqIC0gbWNwX18qIHRvb2xzOiBtdXN0IGJlIGV4Y2x1ZGVkIChhdXRvLWRpc2NvdmVyZWQgYXQgcnVudGltZSlcbiAqL1xuZnVuY3Rpb24gY29udmVydENsYXVkZVRvR2VtaW5pQWdlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50LnN0YXJ0c1dpdGgoJy0tLScpKSByZXR1cm4gY29udGVudDtcblxuICBjb25zdCBlbmRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZignLS0tJywgMyk7XG4gIGlmIChlbmRJbmRleCA9PT0gLTEpIHJldHVybiBjb250ZW50O1xuXG4gIGNvbnN0IGZyb250bWF0dGVyID0gY29udGVudC5zdWJzdHJpbmcoMywgZW5kSW5kZXgpLnRyaW0oKTtcbiAgY29uc3QgYm9keSA9IGNvbnRlbnQuc3Vic3RyaW5nKGVuZEluZGV4ICsgMyk7XG5cbiAgY29uc3QgbGluZXMgPSBmcm9udG1hdHRlci5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IG5ld0xpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaW5BbGxvd2VkVG9vbHMgPSBmYWxzZTtcbiAgbGV0IGluU2tpcHBlZEFycmF5RmllbGQgPSBmYWxzZTtcbiAgY29uc3QgdG9vbHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuXG4gICAgaWYgKGluU2tpcHBlZEFycmF5RmllbGQpIHtcbiAgICAgIGlmICghdHJpbW1lZCB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoJy0gJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpblNraXBwZWRBcnJheUZpZWxkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBhbGxvd2VkLXRvb2xzIFlBTUwgYXJyYXkgdG8gdG9vbHMgbGlzdFxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ2FsbG93ZWQtdG9vbHM6JykpIHtcbiAgICAgIGluQWxsb3dlZFRvb2xzID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbmxpbmUgdG9vbHM6IGZpZWxkIChjb21tYS1zZXBhcmF0ZWQgc3RyaW5nKVxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ3Rvb2xzOicpKSB7XG4gICAgICBjb25zdCB0b29sc1ZhbHVlID0gdHJpbW1lZC5zdWJzdHJpbmcoNikudHJpbSgpO1xuICAgICAgaWYgKHRvb2xzVmFsdWUpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gdG9vbHNWYWx1ZS5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpKS5maWx0ZXIodCA9PiB0KTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHBhcnNlZCkge1xuICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IGNvbnZlcnRHZW1pbmlUb29sTmFtZSh0KTtcbiAgICAgICAgICBpZiAobWFwcGVkKSB0b29scy5wdXNoKG1hcHBlZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRvb2xzOiB3aXRoIG5vIHZhbHVlIG1lYW5zIFlBTUwgYXJyYXkgZm9sbG93c1xuICAgICAgICBpbkFsbG93ZWRUb29scyA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBTdHJpcCBjb2xvciBmaWVsZCAobm90IHN1cHBvcnRlZCBieSBHZW1pbmkgQ0xJLCBjYXVzZXMgdmFsaWRhdGlvbiBlcnJvcilcbiAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCdjb2xvcjonKSkgY29udGludWU7XG5cbiAgICAvLyBTdHJpcCBza2lsbHMgZmllbGQgKG5vdCBzdXBwb3J0ZWQgYnkgR2VtaW5pIENMSSwgY2F1c2VzIHZhbGlkYXRpb24gZXJyb3IpXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnc2tpbGxzOicpKSB7XG4gICAgICBpblNraXBwZWRBcnJheUZpZWxkID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3QgYWxsb3dlZC10b29scy90b29scyBhcnJheSBpdGVtc1xuICAgIGlmIChpbkFsbG93ZWRUb29scykge1xuICAgICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnLSAnKSkge1xuICAgICAgICBjb25zdCBtYXBwZWQgPSBjb252ZXJ0R2VtaW5pVG9vbE5hbWUodHJpbW1lZC5zdWJzdHJpbmcoMikudHJpbSgpKTtcbiAgICAgICAgaWYgKG1hcHBlZCkgdG9vbHMucHVzaChtYXBwZWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAodHJpbW1lZCAmJiAhdHJpbW1lZC5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgaW5BbGxvd2VkVG9vbHMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWluQWxsb3dlZFRvb2xzKSB7XG4gICAgICBuZXdMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB0b29scyBhcyBZQU1MIGFycmF5IChHZW1pbmkgcmVxdWlyZXMgYXJyYXkgZm9ybWF0KVxuICBpZiAodG9vbHMubGVuZ3RoID4gMCkge1xuICAgIG5ld0xpbmVzLnB1c2goJ3Rvb2xzOicpO1xuICAgIGZvciAoY29uc3QgdG9vbCBvZiB0b29scykge1xuICAgICAgbmV3TGluZXMucHVzaChgICAtICR7dG9vbH1gKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBuZXdGcm9udG1hdHRlciA9IG5ld0xpbmVzLmpvaW4oJ1xcbicpLnRyaW0oKTtcblxuICAvLyBFc2NhcGUgJHtWQVJ9IHBhdHRlcm5zIGluIGFnZW50IGJvZHkgZm9yIEdlbWluaSBDTEkgY29tcGF0aWJpbGl0eS5cbiAgLy8gR2VtaW5pJ3MgdGVtcGxhdGVTdHJpbmcoKSB0cmVhdHMgYWxsICR7d29yZH0gcGF0dGVybnMgYXMgdGVtcGxhdGUgdmFyaWFibGVzXG4gIC8vIGFuZCB0aHJvd3MgXCJUZW1wbGF0ZSB2YWxpZGF0aW9uIGZhaWxlZDogTWlzc2luZyByZXF1aXJlZCBpbnB1dCBwYXJhbWV0ZXJzXCJcbiAgLy8gd2hlbiB0aGV5IGNhbid0IGJlIHJlc29sdmVkLiBFWl9BZ2VudHMgYWdlbnRzIHVzZSAke1BIQVNFfSwgJHtQTEFOfSwgZXRjLiBhc1xuICAvLyBzaGVsbCB2YXJpYWJsZXMgaW4gYmFzaCBjb2RlIGJsb2NrcyBcdTIwMTQgY29udmVydCB0byAkVkFSIChubyBicmFjZXMpIHdoaWNoXG4gIC8vIGlzIGVxdWl2YWxlbnQgYmFzaCBhbmQgaW52aXNpYmxlIHRvIEdlbWluaSdzIC9cXCRcXHsoXFx3KylcXH0vZyByZWdleC5cbiAgY29uc3QgZXNjYXBlZEJvZHkgPSBib2R5LnJlcGxhY2UoL1xcJFxceyhcXHcrKVxcfS9nLCAnJCQkMScpO1xuXG4gIHJldHVybiBgLS0tXFxuJHtuZXdGcm9udG1hdHRlcn1cXG4tLS0ke3N0cmlwU3ViVGFncyhlc2NhcGVkQm9keSl9YDtcbn1cblxuZnVuY3Rpb24gY29udmVydENsYXVkZVRvT3BlbmNvZGVGcm9udG1hdHRlcihjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZXBsYWNlIHRvb2wgbmFtZSByZWZlcmVuY2VzIGluIGNvbnRlbnQgKGFwcGxpZXMgdG8gYWxsIGZpbGVzKVxuICBsZXQgY29udmVydGVkQ29udGVudCA9IGNvbnRlbnQ7XG4gIGNvbnZlcnRlZENvbnRlbnQgPSBjb252ZXJ0ZWRDb250ZW50LnJlcGxhY2UoL1xcYkFza1VzZXJRdWVzdGlvblxcYi9nLCAncXVlc3Rpb24nKTtcbiAgY29udmVydGVkQ29udGVudCA9IGNvbnZlcnRlZENvbnRlbnQucmVwbGFjZSgvXFxiU2xhc2hDb21tYW5kXFxiL2csICdza2lsbCcpO1xuICBjb252ZXJ0ZWRDb250ZW50ID0gY29udmVydGVkQ29udGVudC5yZXBsYWNlKC9cXGJUb2RvV3JpdGVcXGIvZywgJ3RvZG93cml0ZScpO1xuICAvLyBSZXBsYWNlIC9lejpjb21tYW5kIHdpdGggL2V6LWNvbW1hbmQgZm9yIG9wZW5jb2RlIChmbGF0IGNvbW1hbmQgc3RydWN0dXJlKVxuICBjb252ZXJ0ZWRDb250ZW50ID0gY29udmVydGVkQ29udGVudC5yZXBsYWNlKC9cXC9lejovZywgJy9lei0nKTtcbiAgLy8gUmVwbGFjZSB+Ly5jbGF1ZGUgYW5kICRIT01FLy5jbGF1ZGUgd2l0aCBPcGVuQ29kZSdzIGNvbmZpZyBsb2NhdGlvblxuICBjb252ZXJ0ZWRDb250ZW50ID0gY29udmVydGVkQ29udGVudC5yZXBsYWNlKC9+XFwvXFwuY2xhdWRlXFxiL2csICd+Ly5jb25maWcvb3BlbmNvZGUnKTtcbiAgY29udmVydGVkQ29udGVudCA9IGNvbnZlcnRlZENvbnRlbnQucmVwbGFjZSgvXFwkSE9NRVxcL1xcLmNsYXVkZVxcYi9nLCAnJEhPTUUvLmNvbmZpZy9vcGVuY29kZScpO1xuICAvLyBSZXBsYWNlIGdlbmVyYWwtcHVycG9zZSBzdWJhZ2VudCB0eXBlIHdpdGggT3BlbkNvZGUncyBlcXVpdmFsZW50IFwiZ2VuZXJhbFwiXG4gIGNvbnZlcnRlZENvbnRlbnQgPSBjb252ZXJ0ZWRDb250ZW50LnJlcGxhY2UoL3N1YmFnZW50X3R5cGU9XCJnZW5lcmFsLXB1cnBvc2VcIi9nLCAnc3ViYWdlbnRfdHlwZT1cImdlbmVyYWxcIicpO1xuXG4gIC8vIENoZWNrIGlmIGNvbnRlbnQgaGFzIGZyb250bWF0dGVyXG4gIGlmICghY29udmVydGVkQ29udGVudC5zdGFydHNXaXRoKCctLS0nKSkge1xuICAgIHJldHVybiBjb252ZXJ0ZWRDb250ZW50O1xuICB9XG5cbiAgLy8gRmluZCB0aGUgZW5kIG9mIGZyb250bWF0dGVyXG4gIGNvbnN0IGVuZEluZGV4ID0gY29udmVydGVkQ29udGVudC5pbmRleE9mKCctLS0nLCAzKTtcbiAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBjb252ZXJ0ZWRDb250ZW50O1xuICB9XG5cbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBjb252ZXJ0ZWRDb250ZW50LnN1YnN0cmluZygzLCBlbmRJbmRleCkudHJpbSgpO1xuICBjb25zdCBib2R5ID0gY29udmVydGVkQ29udGVudC5zdWJzdHJpbmcoZW5kSW5kZXggKyAzKTtcblxuICAvLyBQYXJzZSBmcm9udG1hdHRlciBsaW5lIGJ5IGxpbmUgKHNpbXBsZSBZQU1MIHBhcnNpbmcpXG4gIGNvbnN0IGxpbmVzID0gZnJvbnRtYXR0ZXIuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBuZXdMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGluQWxsb3dlZFRvb2xzID0gZmFsc2U7XG4gIGNvbnN0IGFsbG93ZWRUb29sczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG5cbiAgICAvLyBEZXRlY3Qgc3RhcnQgb2YgYWxsb3dlZC10b29scyBhcnJheVxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ2FsbG93ZWQtdG9vbHM6JykpIHtcbiAgICAgIGluQWxsb3dlZFRvb2xzID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERldGVjdCBpbmxpbmUgdG9vbHM6IGZpZWxkIChjb21tYS1zZXBhcmF0ZWQgc3RyaW5nKVxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ3Rvb2xzOicpKSB7XG4gICAgICBjb25zdCB0b29sc1ZhbHVlID0gdHJpbW1lZC5zdWJzdHJpbmcoNikudHJpbSgpO1xuICAgICAgaWYgKHRvb2xzVmFsdWUpIHtcbiAgICAgICAgLy8gUGFyc2UgY29tbWEtc2VwYXJhdGVkIHRvb2xzXG4gICAgICAgIGNvbnN0IHRvb2xzID0gdG9vbHNWYWx1ZS5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpKS5maWx0ZXIodCA9PiB0KTtcbiAgICAgICAgYWxsb3dlZFRvb2xzLnB1c2goLi4udG9vbHMpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIG5hbWU6IGZpZWxkIC0gb3BlbmNvZGUgdXNlcyBmaWxlbmFtZSBmb3IgY29tbWFuZCBuYW1lXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnbmFtZTonKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBjb2xvciBuYW1lcyB0byBoZXggZm9yIG9wZW5jb2RlXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnY29sb3I6JykpIHtcbiAgICAgIGNvbnN0IGNvbG9yVmFsdWUgPSB0cmltbWVkLnN1YnN0cmluZyg2KS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGhleENvbG9yID0gY29sb3JOYW1lVG9IZXhbY29sb3JWYWx1ZV07XG4gICAgICBpZiAoaGV4Q29sb3IpIHtcbiAgICAgICAgbmV3TGluZXMucHVzaChgY29sb3I6IFwiJHtoZXhDb2xvcn1cImApO1xuICAgICAgfSBlbHNlIGlmIChjb2xvclZhbHVlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICAvLyBWYWxpZGF0ZSBoZXggY29sb3IgZm9ybWF0ICgjUkdCIG9yICNSUkdHQkIpXG4gICAgICAgIGlmICgvXiNbMC05YS1mXXszfSR8XiNbMC05YS1mXXs2fSQvaS50ZXN0KGNvbG9yVmFsdWUpKSB7XG4gICAgICAgICAgLy8gQWxyZWFkeSBoZXggYW5kIHZhbGlkLCBrZWVwIGFzIGlzXG4gICAgICAgICAgbmV3TGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTa2lwIGludmFsaWQgaGV4IGNvbG9yc1xuICAgICAgfVxuICAgICAgLy8gU2tpcCB1bmtub3duIGNvbG9yIG5hbWVzXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBDb2xsZWN0IGFsbG93ZWQtdG9vbHMgaXRlbXNcbiAgICBpZiAoaW5BbGxvd2VkVG9vbHMpIHtcbiAgICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJy0gJykpIHtcbiAgICAgICAgYWxsb3dlZFRvb2xzLnB1c2godHJpbW1lZC5zdWJzdHJpbmcoMikudHJpbSgpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWQgJiYgIXRyaW1tZWQuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIC8vIEVuZCBvZiBhcnJheSwgbmV3IGZpZWxkIHN0YXJ0ZWRcbiAgICAgICAgaW5BbGxvd2VkVG9vbHMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBLZWVwIG90aGVyIGZpZWxkcyAoaW5jbHVkaW5nIG5hbWU6IHdoaWNoIG9wZW5jb2RlIGlnbm9yZXMpXG4gICAgaWYgKCFpbkFsbG93ZWRUb29scykge1xuICAgICAgbmV3TGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgdG9vbHMgb2JqZWN0IGlmIHdlIGhhZCBhbGxvd2VkLXRvb2xzIG9yIHRvb2xzXG4gIGlmIChhbGxvd2VkVG9vbHMubGVuZ3RoID4gMCkge1xuICAgIG5ld0xpbmVzLnB1c2goJ3Rvb2xzOicpO1xuICAgIGZvciAoY29uc3QgdG9vbCBvZiBhbGxvd2VkVG9vbHMpIHtcbiAgICAgIG5ld0xpbmVzLnB1c2goYCAgJHtjb252ZXJ0VG9vbE5hbWUodG9vbCl9OiB0cnVlYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVidWlsZCBmcm9udG1hdHRlciAoYm9keSBhbHJlYWR5IGhhcyB0b29sIG5hbWVzIGNvbnZlcnRlZClcbiAgY29uc3QgbmV3RnJvbnRtYXR0ZXIgPSBuZXdMaW5lcy5qb2luKCdcXG4nKS50cmltKCk7XG4gIHJldHVybiBgLS0tXFxuJHtuZXdGcm9udG1hdHRlcn1cXG4tLS0ke2JvZHl9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IENsYXVkZSBDb2RlIG1hcmtkb3duIGNvbW1hbmQgdG8gR2VtaW5pIFRPTUwgZm9ybWF0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIE1hcmtkb3duIGZpbGUgY29udGVudCB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVE9NTCBjb250ZW50XG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0dlbWluaVRvbWwoY29udGVudCkge1xuICAvLyBDaGVjayBpZiBjb250ZW50IGhhcyBmcm9udG1hdHRlclxuICBpZiAoIWNvbnRlbnQuc3RhcnRzV2l0aCgnLS0tJykpIHtcbiAgICByZXR1cm4gYHByb21wdCA9ICR7SlNPTi5zdHJpbmdpZnkoY29udGVudCl9XFxuYDtcbiAgfVxuXG4gIGNvbnN0IGVuZEluZGV4ID0gY29udGVudC5pbmRleE9mKCctLS0nLCAzKTtcbiAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBgcHJvbXB0ID0gJHtKU09OLnN0cmluZ2lmeShjb250ZW50KX1cXG5gO1xuICB9XG5cbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBjb250ZW50LnN1YnN0cmluZygzLCBlbmRJbmRleCkudHJpbSgpO1xuICBjb25zdCBib2R5ID0gY29udGVudC5zdWJzdHJpbmcoZW5kSW5kZXggKyAzKS50cmltKCk7XG4gIFxuICAvLyBFeHRyYWN0IGRlc2NyaXB0aW9uIGZyb20gZnJvbnRtYXR0ZXJcbiAgbGV0IGRlc2NyaXB0aW9uID0gJyc7XG4gIGNvbnN0IGxpbmVzID0gZnJvbnRtYXR0ZXIuc3BsaXQoJ1xcbicpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnZGVzY3JpcHRpb246JykpIHtcbiAgICAgIGRlc2NyaXB0aW9uID0gdHJpbW1lZC5zdWJzdHJpbmcoMTIpLnRyaW0oKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbnN0cnVjdCBUT01MXG4gIGxldCB0b21sID0gJyc7XG4gIGlmIChkZXNjcmlwdGlvbikge1xuICAgIHRvbWwgKz0gYGRlc2NyaXB0aW9uID0gJHtKU09OLnN0cmluZ2lmeShkZXNjcmlwdGlvbil9XFxuYDtcbiAgfVxuICBcbiAgdG9tbCArPSBgcHJvbXB0ID0gJHtKU09OLnN0cmluZ2lmeShib2R5KX1cXG5gO1xuICBcbiAgcmV0dXJuIHRvbWw7XG59XG5cbi8qKlxuICogQ29weSBjb21tYW5kcyB0byBhIGZsYXQgc3RydWN0dXJlIGZvciBPcGVuQ29kZVxuICogT3BlbkNvZGUgZXhwZWN0czogY29tbWFuZC9lei1oZWxwLm1kIChpbnZva2VkIGFzIC9lei1oZWxwKVxuICogU291cmNlIHN0cnVjdHVyZTogY29tbWFuZHMvZXovaGVscC5tZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNEaXIgLSBTb3VyY2UgZGlyZWN0b3J5IChlLmcuLCBjb21tYW5kcy9lei8pXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdERpciAtIERlc3RpbmF0aW9uIGRpcmVjdG9yeSAoZS5nLiwgY29tbWFuZC8pXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IC0gUHJlZml4IGZvciBmaWxlbmFtZXMgKGUuZy4sICdleicpXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFByZWZpeCAtIFBhdGggcHJlZml4IGZvciBmaWxlIHJlZmVyZW5jZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gVGFyZ2V0IHJ1bnRpbWUgKCdjbGF1ZGUnIG9yICdvcGVuY29kZScpXG4gKi9cbmZ1bmN0aW9uIGNvcHlGbGF0dGVuZWRDb21tYW5kcyhzcmNEaXIsIGRlc3REaXIsIHByZWZpeCwgcGF0aFByZWZpeCwgcnVudGltZSkge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc3JjRGlyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJlbW92ZSBvbGQgZXotKi5tZCBmaWxlcyBiZWZvcmUgY29weWluZyBuZXcgb25lc1xuICBpZiAoZnMuZXhpc3RzU3luYyhkZXN0RGlyKSkge1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmcy5yZWFkZGlyU3luYyhkZXN0RGlyKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aChgJHtwcmVmaXh9LWApICYmIGZpbGUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKGRlc3REaXIsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZnMubWtkaXJTeW5jKGRlc3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHNyY0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oc3JjRGlyLCBlbnRyeS5uYW1lKTtcblxuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAvLyBSZWN1cnNlIGludG8gc3ViZGlyZWN0b3JpZXMsIGFkZGluZyB0byBwcmVmaXhcbiAgICAgIC8vIGUuZy4sIGNvbW1hbmRzL2V6L2RlYnVnL3N0YXJ0Lm1kIC0+IGNvbW1hbmQvZXotZGVidWctc3RhcnQubWRcbiAgICAgIGNvcHlGbGF0dGVuZWRDb21tYW5kcyhzcmNQYXRoLCBkZXN0RGlyLCBgJHtwcmVmaXh9LSR7ZW50cnkubmFtZX1gLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAvLyBGbGF0dGVuOiBoZWxwLm1kIC0+IGV6LWhlbHAubWRcbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZW50cnkubmFtZS5yZXBsYWNlKCcubWQnLCAnJyk7XG4gICAgICBjb25zdCBkZXN0TmFtZSA9IGAke3ByZWZpeH0tJHtiYXNlTmFtZX0ubWRgO1xuICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdERpciwgZGVzdE5hbWUpO1xuXG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcmNQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlUmVnZXggPSAvflxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4ID0gL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBvcGVuY29kZURpclJlZ2V4ID0gL35cXC9cXC5vcGVuY29kZVxcLy9nO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShnbG9iYWxDbGF1ZGVSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZUhvbWVSZWdleCwgdG9Ib21lUHJlZml4KHBhdGhQcmVmaXgpKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UobG9jYWxDbGF1ZGVSZWdleCwgYC4vJHtnZXREaXJOYW1lKHJ1bnRpbWUpfS9gKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2Uob3BlbmNvZGVEaXJSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcbiAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9PcGVuY29kZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDb3B5IEVaIEFnZW50cyBza2lsbHMgdG8gZ2xvYmFsIHNraWxscyBkaXJlY3RvcnlcbiAqIFNraWxscyBhcmUgaW5zdGFsbGVkIHRvICRIT01FLy5za2lsbHMvZXotYWdlbnRzLyBmb3IgdW5pdmVyc2FsIGFjY2Vzc1xuICogQHBhcmFtIHtzdHJpbmd9IHNyY0RpciAtIFNvdXJjZSBkaXJlY3RvcnkgKGV6LWFnZW50cyByb290KVxuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXG4gKiBAcGFyYW0ge3N0cmluZ30gcnVudGltZSAtIFJ1bnRpbWUgaWRlbnRpZmllclxuICovXG5mdW5jdGlvbiBjb3B5U2tpbGxzKHNyY0Rpcjogc3RyaW5nLCBpc0dsb2JhbDogYm9vbGVhbiwgcnVudGltZTogc3RyaW5nKTogdm9pZCB7XG4gIC8vIE9ubHkgaW5zdGFsbCBza2lsbHMgZm9yIGdsb2JhbCBpbnN0YWxsc1xuICBpZiAoIWlzR2xvYmFsKSB7XG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gU2tpcHBpbmcgc2tpbGxzIChsb2NhbCBpbnN0YWxsKWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGhvbWVEaXIgPSBvcy5ob21lZGlyKCkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICBjb25zdCBza2lsbHNEZXN0RGlyID0gcGF0aC5wb3NpeC5qb2luKGhvbWVEaXIsICcuc2tpbGxzJywgJ2V6LWFnZW50cycpO1xuICBjb25zdCBzcmNTa2lsbHNEaXIgPSBwYXRoLmpvaW4oc3JjRGlyLCAnc2tpbGxzJyk7XG5cbiAgY29uc29sZS5sb2coYCAgSW5zdGFsbGluZyBza2lsbHMgdG8gJHtjeWFufSR7c2tpbGxzRGVzdERpcn0ke3Jlc2V0fS4uLmApO1xuXG4gIC8vIENyZWF0ZSBza2lsbHMgZGlyZWN0b3J5XG4gIGZzLm1rZGlyU3luYyhza2lsbHNEZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBDb3B5IGFsbCBza2lsbHMgZnJvbSBzb3VyY2VcbiAgaWYgKGZzLmV4aXN0c1N5bmMoc3JjU2tpbGxzRGlyKSkge1xuICAgIGZzLmNwU3luYyhzcmNTa2lsbHNEaXIsIHNraWxsc0Rlc3REaXIsIHtcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIGZvcmNlOiB0cnVlXG4gICAgfSk7XG5cbiAgICAvLyBDb3VudCBpbnN0YWxsZWQgc2tpbGxzXG4gICAgbGV0IHNraWxsQ291bnQgPSAwO1xuICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbJ3N0YWNrJywgJ2FyY2hpdGVjdHVyZScsICdkb21haW4nLCAnb3BlcmF0aW9uYWwnLCAnZ292ZXJuYW5jZScsICd0ZXN0aW5nJywgJ29ic2VydmFiaWxpdHknLCAnZGV2b3BzJywgJ3NlY3VyaXR5JywgJ2FpJywgJ2RhdGEnLCAncHJvZHVjdCddO1xuXG4gICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBjYXRlZ29yaWVzKSB7XG4gICAgICBjb25zdCBjYXRlZ29yeVBhdGggPSBwYXRoLmpvaW4oc2tpbGxzRGVzdERpciwgY2F0ZWdvcnkpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY2F0ZWdvcnlQYXRoKSkge1xuICAgICAgICBjb25zdCBza2lsbHMgPSBmcy5yZWFkZGlyU3luYyhjYXRlZ29yeVBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgICAgICAgIC5maWx0ZXIoZCA9PiBkLmlzRGlyZWN0b3J5KCkpLmxlbmd0aDtcbiAgICAgICAgc2tpbGxDb3VudCArPSBza2lsbHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgJHtza2lsbENvdW50fSBza2lsbHMgdG8gJHtza2lsbHNEZXN0RGlyfWApO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKGAgICR7eWVsbG93fVx1MjZBMCR7cmVzZXR9IFNraWxscyBkaXJlY3Rvcnkgbm90IGZvdW5kOiAke3NyY1NraWxsc0Rpcn1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsaXN0Q29kZXhTa2lsbE5hbWVzKHNraWxsc0RpciwgcHJlZml4ID0gJ2V6LScpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNraWxsc0RpcikpIHJldHVybiBbXTtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHNraWxsc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSAmJiBlbnRyeS5uYW1lLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAuZmlsdGVyKGVudHJ5ID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHNraWxsc0RpciwgZW50cnkubmFtZSwgJ1NLSUxMLm1kJykpKVxuICAgIC5tYXAoZW50cnkgPT4gZW50cnkubmFtZSlcbiAgICAuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb3B5Q29tbWFuZHNBc0NvZGV4U2tpbGxzKHNyY0Rpciwgc2tpbGxzRGlyLCBwcmVmaXgsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNyY0RpcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmcy5ta2RpclN5bmMoc2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBSZW1vdmUgcHJldmlvdXMgRVogQ29kZXggc2tpbGxzIHRvIGF2b2lkIHN0YWxlIGNvbW1hbmQgc2tpbGxzLlxuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRkaXJTeW5jKHNraWxsc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGV4aXN0aW5nKSB7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnkubmFtZS5zdGFydHNXaXRoKGAke3ByZWZpeH0tYCkpIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oc2tpbGxzRGlyLCBlbnRyeS5uYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjdXJzZShjdXJyZW50U3JjRGlyLCBjdXJyZW50UHJlZml4KSB7XG4gICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGN1cnJlbnRTcmNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihjdXJyZW50U3JjRGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHJlY3Vyc2Uoc3JjUGF0aCwgYCR7Y3VycmVudFByZWZpeH0tJHtlbnRyeS5uYW1lfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFzZU5hbWUgPSBlbnRyeS5uYW1lLnJlcGxhY2UoJy5tZCcsICcnKTtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGAke2N1cnJlbnRQcmVmaXh9LSR7YmFzZU5hbWV9YDtcbiAgICAgIGNvbnN0IHNraWxsRGlyID0gcGF0aC5qb2luKHNraWxsc0Rpciwgc2tpbGxOYW1lKTtcbiAgICAgIGZzLm1rZGlyU3luYyhza2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVSZWdleCA9IC9+XFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVIb21lUmVnZXggPSAvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgbG9jYWxDbGF1ZGVSZWdleCA9IC9cXC5cXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IGNvZGV4RGlyUmVnZXggPSAvflxcL1xcLmNvZGV4XFwvL2c7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZVJlZ2V4LCBwYXRoUHJlZml4KTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4LCB0b0hvbWVQcmVmaXgocGF0aFByZWZpeCkpO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShsb2NhbENsYXVkZVJlZ2V4LCBgLi8ke2dldERpck5hbWUocnVudGltZSl9L2ApO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShjb2RleERpclJlZ2V4LCBwYXRoUHJlZml4KTtcbiAgICAgIGNvbnRlbnQgPSBwcm9jZXNzQXR0cmlidXRpb24oY29udGVudCwgZ2V0Q29tbWl0QXR0cmlidXRpb24ocnVudGltZSkpO1xuICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db2RleFNraWxsKGNvbnRlbnQsIHNraWxsTmFtZSk7XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHNraWxsRGlyLCAnU0tJTEwubWQnKSwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgcmVjdXJzZShzcmNEaXIsIHByZWZpeCk7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgY29tbWFuZHMgYXMgQ29waWxvdCBza2lsbHMgXHUyMDE0IG9uZSBmb2xkZXIgcGVyIHNraWxsIHdpdGggU0tJTEwubWQuXG4gKiBBcHBsaWVzIENPTlYtMDEgKHN0cnVjdHVyZSksIENPTlYtMDIgKGFsbG93ZWQtdG9vbHMpLCBDT05WLTA2IChwYXRocyksIENPTlYtMDcgKGNvbW1hbmQgbmFtZXMpLlxuICovXG5mdW5jdGlvbiBjb3B5Q29tbWFuZHNBc0NvcGlsb3RTa2lsbHMoc3JjRGlyLCBza2lsbHNEaXIsIHByZWZpeCwgaXNHbG9iYWwgPSBmYWxzZSkge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc3JjRGlyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZzLm1rZGlyU3luYyhza2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIC8vIFJlbW92ZSBwcmV2aW91cyBFWiBDb3BpbG90IHNraWxsc1xuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRkaXJTeW5jKHNraWxsc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGV4aXN0aW5nKSB7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnkubmFtZS5zdGFydHNXaXRoKGAke3ByZWZpeH0tYCkpIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oc2tpbGxzRGlyLCBlbnRyeS5uYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjdXJzZShjdXJyZW50U3JjRGlyLCBjdXJyZW50UHJlZml4KSB7XG4gICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGN1cnJlbnRTcmNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihjdXJyZW50U3JjRGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHJlY3Vyc2Uoc3JjUGF0aCwgYCR7Y3VycmVudFByZWZpeH0tJHtlbnRyeS5uYW1lfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFzZU5hbWUgPSBlbnRyeS5uYW1lLnJlcGxhY2UoJy5tZCcsICcnKTtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGAke2N1cnJlbnRQcmVmaXh9LSR7YmFzZU5hbWV9YDtcbiAgICAgIGNvbnN0IHNraWxsRGlyID0gcGF0aC5qb2luKHNraWxsc0Rpciwgc2tpbGxOYW1lKTtcbiAgICAgIGZzLm1rZGlyU3luYyhza2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb250ZW50ID0gY29udmVydENsYXVkZUNvbW1hbmRUb0NvcGlsb3RTa2lsbChjb250ZW50LCBza2lsbE5hbWUsIGlzR2xvYmFsKTtcbiAgICAgIGNvbnRlbnQgPSBwcm9jZXNzQXR0cmlidXRpb24oY29udGVudCwgZ2V0Q29tbWl0QXR0cmlidXRpb24oJ2NvcGlsb3QnKSk7XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHNraWxsRGlyLCAnU0tJTEwubWQnKSwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgcmVjdXJzZShzcmNEaXIsIHByZWZpeCk7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgY29tbWFuZHMgYXMgS2ltaSBDb2RlIHNraWxscyBcdTIwMTQgb25lIGZvbGRlciBwZXIgc2tpbGwgd2l0aCBTS0lMTC5tZC5cbiAqL1xuZnVuY3Rpb24gY29weUNvbW1hbmRzQXNLaW1pU2tpbGxzKHNyY0Rpciwgc2tpbGxzRGlyLCBwcmVmaXgsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNyY0RpcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmcy5ta2RpclN5bmMoc2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBSZW1vdmUgcHJldmlvdXMgRVogS2ltaSBza2lsbHNcbiAgY29uc3QgZXhpc3RpbmcgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBleGlzdGluZykge1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChgJHtwcmVmaXh9LWApKSB7XG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHNraWxsc0RpciwgZW50cnkubmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2UoY3VycmVudFNyY0RpciwgY3VycmVudFByZWZpeCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhjdXJyZW50U3JjRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oY3VycmVudFNyY0RpciwgZW50cnkubmFtZSk7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICByZWN1cnNlKHNyY1BhdGgsIGAke2N1cnJlbnRQcmVmaXh9LSR7ZW50cnkubmFtZX1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZW50cnkubmFtZS5yZXBsYWNlKCcubWQnLCAnJyk7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBgJHtjdXJyZW50UHJlZml4fS0ke2Jhc2VOYW1lfWA7XG4gICAgICBjb25zdCBza2lsbERpciA9IHBhdGguam9pbihza2lsbHNEaXIsIHNraWxsTmFtZSk7XG4gICAgICBmcy5ta2RpclN5bmMoc2tpbGxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcmNQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlUmVnZXggPSAvflxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4ID0gL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBraW1pRGlyUmVnZXggPSAvflxcL1xcLmtpbWlcXC8vZztcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShnbG9iYWxDbGF1ZGVIb21lUmVnZXgsIHRvSG9tZVByZWZpeChwYXRoUHJlZml4KSk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGxvY2FsQ2xhdWRlUmVnZXgsIGAuLyR7Z2V0RGlyTmFtZShydW50aW1lKX0vYCk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGtpbWlEaXJSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcbiAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9LaW1pU2tpbGwoY29udGVudCwgc2tpbGxOYW1lKTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHNraWxsRGlyLCAnU0tJTEwubWQnKSwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgcmVjdXJzZShzcmNEaXIsIHByZWZpeCk7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgY29tbWFuZHMgYXMgUXdlbiBDb2RlIGNvbW1hbmRzIFx1MjAxNCBmbGF0IHN0cnVjdHVyZSBpbiBjb21tYW5kcy9lei8uXG4gKiBRd2VuIENvZGUgdXNlcyB+Ly5xd2VuL2NvbW1hbmRzL2V6LyoubWQgKGxpa2UgQ2xhdWRlIENvZGUgfi8uY2xhdWRlL2NvbW1hbmRzL2V6LylcbiAqL1xuZnVuY3Rpb24gY29weUNvbW1hbmRzQXNRd2VuQ29tbWFuZHMoc3JjRGlyLCBjb21tYW5kc0RpciwgcHJlZml4LCBwYXRoUHJlZml4LCBydW50aW1lKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhzcmNEaXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZnMubWtkaXJTeW5jKGNvbW1hbmRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBSZW1vdmUgcHJldmlvdXMgRVogUXdlbiBjb21tYW5kc1xuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRkaXJTeW5jKGNvbW1hbmRzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZXhpc3RpbmcpIHtcbiAgICBpZiAoZW50cnkuaXNGaWxlKCkgJiYgZW50cnkubmFtZS5zdGFydHNXaXRoKGAke3ByZWZpeH0tYCkgJiYgZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oY29tbWFuZHNEaXIsIGVudHJ5Lm5hbWUpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWN1cnNlKGN1cnJlbnRTcmNEaXIsIGN1cnJlbnRQcmVmaXgpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoY3VycmVudFNyY0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKGN1cnJlbnRTcmNEaXIsIGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgcmVjdXJzZShzcmNQYXRoLCBgJHtjdXJyZW50UHJlZml4fS0ke2VudHJ5Lm5hbWV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlTmFtZSA9IGVudHJ5Lm5hbWUucmVwbGFjZSgnLm1kJywgJycpO1xuICAgICAgY29uc3QgY29tbWFuZE5hbWUgPSBgJHtjdXJyZW50UHJlZml4fS0ke2Jhc2VOYW1lfWA7XG4gICAgICBjb25zdCBjb21tYW5kRmlsZSA9IHBhdGguam9pbihjb21tYW5kc0RpciwgYCR7Y29tbWFuZE5hbWV9Lm1kYCk7XG5cbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVSZWdleCA9IC9+XFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVIb21lUmVnZXggPSAvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgbG9jYWxDbGF1ZGVSZWdleCA9IC9cXC5cXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IHF3ZW5EaXJSZWdleCA9IC9+XFwvXFwucXdlblxcLy9nO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShnbG9iYWxDbGF1ZGVSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZUhvbWVSZWdleCwgdG9Ib21lUHJlZml4KHBhdGhQcmVmaXgpKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UobG9jYWxDbGF1ZGVSZWdleCwgYC4vJHtnZXREaXJOYW1lKHJ1bnRpbWUpfS9gKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UocXdlbkRpclJlZ2V4LCBwYXRoUHJlZml4KTtcbiAgICAgIGNvbnRlbnQgPSBwcm9jZXNzQXR0cmlidXRpb24oY29udGVudCwgZ2V0Q29tbWl0QXR0cmlidXRpb24ocnVudGltZSkpO1xuICAgICAgXG4gICAgICAvLyBRd2VuIENvZGUgdXNlcyBzaW1wbGUgbWFya2Rvd24gY29tbWFuZHMgKG5vIFNLSUxMLm1kIHdyYXBwZXIpXG4gICAgICAvLyBKdXN0IGNvcHkgdGhlIGNvbnRlbnQgYXMtaXMgd2l0aCBwYXRoIHJlcGxhY2VtZW50c1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhjb21tYW5kRmlsZSwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgcmVjdXJzZShzcmNEaXIsIHByZWZpeCk7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgY29tbWFuZHMgYXMgUXdlbiBDb2RlIHNraWxscyBcdTIwMTQgb25lIGZvbGRlciBwZXIgc2tpbGwgd2l0aCBTS0lMTC5tZC5cbiAqIFF3ZW4gQ29kZSB1c2VzIHRoZSBzYW1lIHNraWxscy8gc3RydWN0dXJlIGFzIENvZGV4IGJ1dCB3aXRoIHNpbXBsZXIgZm9ybWF0IChubyBhZGFwdGVycyBuZWVkZWQpLlxuICogQGRlcHJlY2F0ZWQgVXNlIGNvcHlDb21tYW5kc0FzUXdlbkNvbW1hbmRzIGluc3RlYWQgLSBRd2VuIENvZGUgdXNlcyBjb21tYW5kcy9lei8gbm90IHNraWxscy9cbiAqL1xuZnVuY3Rpb24gY29weUNvbW1hbmRzQXNRd2VuU2tpbGxzKHNyY0Rpciwgc2tpbGxzRGlyLCBwcmVmaXgsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNyY0RpcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmcy5ta2RpclN5bmMoc2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBSZW1vdmUgcHJldmlvdXMgRVogUXdlbiBza2lsbHNcbiAgY29uc3QgZXhpc3RpbmcgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBleGlzdGluZykge1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChgJHtwcmVmaXh9LWApKSB7XG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHNraWxsc0RpciwgZW50cnkubmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2UoY3VycmVudFNyY0RpciwgY3VycmVudFByZWZpeCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhjdXJyZW50U3JjRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oY3VycmVudFNyY0RpciwgZW50cnkubmFtZSk7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICByZWN1cnNlKHNyY1BhdGgsIGAke2N1cnJlbnRQcmVmaXh9LSR7ZW50cnkubmFtZX1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZW50cnkubmFtZS5yZXBsYWNlKCcubWQnLCAnJyk7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBgJHtjdXJyZW50UHJlZml4fS0ke2Jhc2VOYW1lfWA7XG4gICAgICBjb25zdCBza2lsbERpciA9IHBhdGguam9pbihza2lsbHNEaXIsIHNraWxsTmFtZSk7XG4gICAgICBmcy5ta2RpclN5bmMoc2tpbGxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcmNQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlUmVnZXggPSAvflxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4ID0gL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBxd2VuRGlyUmVnZXggPSAvflxcL1xcLnF3ZW5cXC8vZztcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShnbG9iYWxDbGF1ZGVIb21lUmVnZXgsIHRvSG9tZVByZWZpeChwYXRoUHJlZml4KSk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGxvY2FsQ2xhdWRlUmVnZXgsIGAuLyR7Z2V0RGlyTmFtZShydW50aW1lKX0vYCk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKHF3ZW5EaXJSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcbiAgICAgIC8vIFF3ZW4gQ29kZSB1c2VzIHNpbXBsZSBtYXJrZG93biBza2lsbHMgd2l0aG91dCBmcm9udG1hdHRlciBhZGFwdGVyc1xuICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb1F3ZW5Ta2lsbChjb250ZW50LCBza2lsbE5hbWUpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oc2tpbGxEaXIsICdTS0lMTC5tZCcpLCBjb250ZW50KTtcbiAgICB9XG4gIH1cblxuICByZWN1cnNlKHNyY0RpciwgcHJlZml4KTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb3B5IGRpcmVjdG9yeSwgcmVwbGFjaW5nIHBhdGhzIGluIC5tZCBmaWxlc1xuICogRGVsZXRlcyBleGlzdGluZyBkZXN0RGlyIGZpcnN0IHRvIHJlbW92ZSBvcnBoYW5lZCBmaWxlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjRGlyIC0gU291cmNlIGRpcmVjdG9yeVxuICogQHBhcmFtIHtzdHJpbmd9IGRlc3REaXIgLSBEZXN0aW5hdGlvbiBkaXJlY3RvcnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoUHJlZml4IC0gUGF0aCBwcmVmaXggZm9yIGZpbGUgcmVmZXJlbmNlc1xuICogQHBhcmFtIHtzdHJpbmd9IHJ1bnRpbWUgLSBUYXJnZXQgcnVudGltZSAoJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnKVxuICovXG5mdW5jdGlvbiBjb3B5V2l0aFBhdGhSZXBsYWNlbWVudChzcmNEaXIsIGRlc3REaXIsIHBhdGhQcmVmaXgsIHJ1bnRpbWUsIGlzQ29tbWFuZCA9IGZhbHNlLCBpc0dsb2JhbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xuICBjb25zdCBpc0NvZGV4ID0gcnVudGltZSA9PT0gJ2NvZGV4JztcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xuICBjb25zdCBkaXJOYW1lID0gZ2V0RGlyTmFtZShydW50aW1lKTtcblxuICAvLyBDbGVhbiBpbnN0YWxsOiByZW1vdmUgZXhpc3RpbmcgZGVzdGluYXRpb24gdG8gcHJldmVudCBvcnBoYW5lZCBmaWxlc1xuICBpZiAoZnMuZXhpc3RzU3luYyhkZXN0RGlyKSkge1xuICAgIGZzLnJtU3luYyhkZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuICBmcy5ta2RpclN5bmMoZGVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHNyY0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oc3JjRGlyLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihkZXN0RGlyLCBlbnRyeS5uYW1lKTtcblxuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb3B5V2l0aFBhdGhSZXBsYWNlbWVudChzcmNQYXRoLCBkZXN0UGF0aCwgcGF0aFByZWZpeCwgcnVudGltZSwgaXNDb21tYW5kLCBpc0dsb2JhbCk7XG4gICAgfSBlbHNlIGlmIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgLy8gUmVwbGFjZSB+Ly5jbGF1ZGUvIGFuZCAkSE9NRS8uY2xhdWRlLyBhbmQgLi8uY2xhdWRlLyB3aXRoIHJ1bnRpbWUtYXBwcm9wcmlhdGUgcGF0aHNcbiAgICAgIC8vIFNraXAgZ2VuZXJpYyByZXBsYWNlbWVudCBmb3IgQ29waWxvdCBcdTIwMTQgY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQgaGFuZGxlcyBhbGwgcGF0aHNcbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoIWlzQ29waWxvdCkge1xuICAgICAgICBjb25zdCBnbG9iYWxDbGF1ZGVSZWdleCA9IC9+XFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnN0IGdsb2JhbENsYXVkZUhvbWVSZWdleCA9IC9cXCRIT01FXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZUhvbWVSZWdleCwgdG9Ib21lUHJlZml4KHBhdGhQcmVmaXgpKTtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShsb2NhbENsYXVkZVJlZ2V4LCBgLi8ke2Rpck5hbWV9L2ApO1xuICAgICAgfVxuICAgICAgY29udGVudCA9IHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50LCBnZXRDb21taXRBdHRyaWJ1dGlvbihydW50aW1lKSk7XG5cbiAgICAgIC8vIENvbnZlcnQgZnJvbnRtYXR0ZXIgZm9yIG9wZW5jb2RlIGNvbXBhdGliaWxpdHlcbiAgICAgIGlmIChpc09wZW5jb2RlKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9PcGVuY29kZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcbiAgICAgIH0gZWxzZSBpZiAocnVudGltZSA9PT0gJ2dlbWluaScpIHtcbiAgICAgICAgaWYgKGlzQ29tbWFuZCkge1xuICAgICAgICAgIC8vIENvbnZlcnQgdG8gVE9NTCBmb3IgR2VtaW5pIChzdHJpcCA8c3ViPiB0YWdzIFx1MjAxNCB0ZXJtaW5hbHMgY2FuJ3QgcmVuZGVyIHN1YnNjcmlwdClcbiAgICAgICAgICBjb250ZW50ID0gc3RyaXBTdWJUYWdzKGNvbnRlbnQpO1xuICAgICAgICAgIGNvbnN0IHRvbWxDb250ZW50ID0gY29udmVydENsYXVkZVRvR2VtaW5pVG9tbChjb250ZW50KTtcbiAgICAgICAgICAvLyBSZXBsYWNlIGV4dGVuc2lvbiB3aXRoIC50b21sXG4gICAgICAgICAgY29uc3QgdG9tbFBhdGggPSBkZXN0UGF0aC5yZXBsYWNlKC9cXC5tZCQvLCAnLnRvbWwnKTtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRvbWxQYXRoLCB0b21sQ29udGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb2RleCkge1xuICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29kZXhNYXJrZG93bihjb250ZW50KTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICB9IGVsc2UgaWYgKGlzQ29waWxvdCkge1xuICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQoY29udGVudCwgaXNHbG9iYWwpO1xuICAgICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQ29waWxvdCAmJiAoZW50cnkubmFtZS5lbmRzV2l0aCgnLmNqcycpIHx8IGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5qcycpKSkge1xuICAgICAgLy8gQ29waWxvdDogYWxzbyB0cmFuc2Zvcm0gLmNqcy8uanMgZmlsZXMgZm9yIENPTlYtMDYgYW5kIENPTlYtMDdcbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQoY29udGVudCwgaXNHbG9iYWwpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmNQYXRoLCBkZXN0UGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2xlYW4gdXAgb3JwaGFuZWQgZmlsZXMgZnJvbSBwcmV2aW91cyB2ZXJzaW9uc1xuICovXG5mdW5jdGlvbiBjbGVhbnVwT3JwaGFuZWRGaWxlcyhjb25maWdEaXIpIHtcbiAgY29uc3Qgb3JwaGFuZWRGaWxlcyA9IFtcbiAgICAnaG9va3MvZXotbm90aWZ5LnNoJywgIC8vIFJlbW92ZWQgaW4gdjEuNi54XG4gICAgJ2hvb2tzL3N0YXR1c2xpbmUuanMnLCAgLy8gUmVuYW1lZCB0byBlei1zdGF0dXNsaW5lLmpzIGluIHYxLjkuMFxuICBdO1xuXG4gIGZvciAoY29uc3QgcmVsUGF0aCBvZiBvcnBoYW5lZEZpbGVzKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCByZWxQYXRoKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhmdWxsUGF0aCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmMoZnVsbFBhdGgpO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIG9ycGhhbmVkICR7cmVsUGF0aH1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDbGVhbiB1cCBvcnBoYW5lZCBob29rIHJlZ2lzdHJhdGlvbnMgZnJvbSBzZXR0aW5ncy5qc29uXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBPcnBoYW5lZEhvb2tzKHNldHRpbmdzKSB7XG4gIGNvbnN0IG9ycGhhbmVkSG9va1BhdHRlcm5zID0gW1xuICAgICdlei1ub3RpZnkuc2gnLCAgLy8gUmVtb3ZlZCBpbiB2MS42LnhcbiAgICAnaG9va3Mvc3RhdHVzbGluZS5qcycsICAvLyBSZW5hbWVkIHRvIGV6LXN0YXR1c2xpbmUuanMgaW4gdjEuOS4wXG4gICAgJ2V6LWludGVsLWluZGV4LmpzJywgIC8vIFJlbW92ZWQgaW4gdjEuOS4yXG4gICAgJ2V6LWludGVsLXNlc3Npb24uanMnLCAgLy8gUmVtb3ZlZCBpbiB2MS45LjJcbiAgICAnZXotaW50ZWwtcHJ1bmUuanMnLCAgLy8gUmVtb3ZlZCBpbiB2MS45LjJcbiAgXTtcblxuICBsZXQgY2xlYW5lZEhvb2tzID0gZmFsc2U7XG5cbiAgLy8gQ2hlY2sgYWxsIGhvb2sgZXZlbnQgdHlwZXMgKFN0b3AsIFNlc3Npb25TdGFydCwgZXRjLilcbiAgaWYgKHNldHRpbmdzLmhvb2tzKSB7XG4gICAgZm9yIChjb25zdCBldmVudFR5cGUgb2YgT2JqZWN0LmtleXMoc2V0dGluZ3MuaG9va3MpKSB7XG4gICAgICBjb25zdCBob29rRW50cmllcyA9IHNldHRpbmdzLmhvb2tzW2V2ZW50VHlwZV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShob29rRW50cmllcykpIHtcbiAgICAgICAgLy8gRmlsdGVyIG91dCBlbnRyaWVzIHRoYXQgY29udGFpbiBvcnBoYW5lZCBob29rc1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IGhvb2tFbnRyaWVzLmZpbHRlcihlbnRyeSA9PiB7XG4gICAgICAgICAgaWYgKGVudHJ5Lmhvb2tzICYmIEFycmF5LmlzQXJyYXkoZW50cnkuaG9va3MpKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBhbnkgaG9vayBpbiB0aGlzIGVudHJ5IG1hdGNoZXMgb3JwaGFuZWQgcGF0dGVybnNcbiAgICAgICAgICAgIGNvbnN0IGhhc09ycGhhbmVkID0gZW50cnkuaG9va3Muc29tZShoID0+XG4gICAgICAgICAgICAgIGguY29tbWFuZCAmJiBvcnBoYW5lZEhvb2tQYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gaC5jb21tYW5kLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChoYXNPcnBoYW5lZCkge1xuICAgICAgICAgICAgICBjbGVhbmVkSG9va3MgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBSZW1vdmUgdGhpcyBlbnRyeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIEtlZXAgdGhpcyBlbnRyeVxuICAgICAgICB9KTtcbiAgICAgICAgc2V0dGluZ3MuaG9va3NbZXZlbnRUeXBlXSA9IGZpbHRlcmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjbGVhbmVkSG9va3MpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgb3JwaGFuZWQgaG9vayByZWdpc3RyYXRpb25zYCk7XG4gIH1cblxuICAvLyBGaXggIzMzMDogVXBkYXRlIHN0YXR1c0xpbmUgaWYgaXQgcG9pbnRzIHRvIG9sZCBzdGF0dXNsaW5lLmpzIHBhdGhcbiAgLy8gT25seSBtYXRjaCB0aGUgc3BlY2lmaWMgb2xkIHBhdGggcGF0dGVybiAoaG9va3Mvc3RhdHVzbGluZS5qcyksXG4gIC8vIG5vdCB0aGlyZC1wYXJ0eSBzdGF0dXNsaW5lIHNjcmlwdHMgdGhhdCBoYXBwZW4gdG8gY29udGFpbiAnc3RhdHVzbGluZS5qcydcbiAgaWYgKHNldHRpbmdzLnN0YXR1c0xpbmUgJiYgc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kICYmXG4gICAgICAvaG9va3NbXFwvXFxcXF1zdGF0dXNsaW5lXFwuanMvLnRlc3Qoc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kKSkge1xuICAgIHNldHRpbmdzLnN0YXR1c0xpbmUuY29tbWFuZCA9IHNldHRpbmdzLnN0YXR1c0xpbmUuY29tbWFuZC5yZXBsYWNlKFxuICAgICAgL2hvb2tzKFtcXC9cXFxcXSlzdGF0dXNsaW5lXFwuanMvLFxuICAgICAgJ2hvb2tzJDFlei1zdGF0dXNsaW5lLmpzJ1xuICAgICk7XG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBVcGRhdGVkIHN0YXR1c2xpbmUgcGF0aCAoaG9va3Mvc3RhdHVzbGluZS5qcyBcdTIxOTIgaG9va3MvZXotc3RhdHVzbGluZS5qcylgKTtcbiAgfVxuXG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuLyoqXG4gKiBVbmluc3RhbGwgRVpfQWdlbnRzIGZyb20gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZm9yIGEgc3BlY2lmaWMgcnVudGltZVxuICogUmVtb3ZlcyBvbmx5IEVaLXNwZWNpZmljIGZpbGVzL2RpcmVjdG9yaWVzLCBwcmVzZXJ2ZXMgdXNlciBjb250ZW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzR2xvYmFsIC0gV2hldGhlciB0byB1bmluc3RhbGwgZnJvbSBnbG9iYWwgb3IgbG9jYWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gVGFyZ2V0IHJ1bnRpbWUgKCdjbGF1ZGUnLCAnb3BlbmNvZGUnLCAnZ2VtaW5pJywgJ2NvZGV4JywgJ2NvcGlsb3QnKVxuICovXG5mdW5jdGlvbiB1bmluc3RhbGwoaXNHbG9iYWwsIHJ1bnRpbWUgPSAnY2xhdWRlJykge1xuICBjb25zdCBpc09wZW5jb2RlID0gcnVudGltZSA9PT0gJ29wZW5jb2RlJztcbiAgY29uc3QgaXNDb2RleCA9IHJ1bnRpbWUgPT09ICdjb2RleCc7XG4gIGNvbnN0IGlzQ29waWxvdCA9IHJ1bnRpbWUgPT09ICdjb3BpbG90JztcbiAgY29uc3QgaXNRd2VuID0gcnVudGltZSA9PT0gJ3F3ZW4nO1xuICBjb25zdCBpc0tpbWkgPSBydW50aW1lID09PSAna2ltaSc7XG4gIGNvbnN0IGRpck5hbWUgPSBnZXREaXJOYW1lKHJ1bnRpbWUpO1xuXG4gIC8vIEdldCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBiYXNlZCBvbiBydW50aW1lIGFuZCBpbnN0YWxsIHR5cGVcbiAgY29uc3QgdGFyZ2V0RGlyID0gaXNHbG9iYWxcbiAgICA/IGdldEdsb2JhbERpcihydW50aW1lLCBleHBsaWNpdENvbmZpZ0RpcilcbiAgICA6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBkaXJOYW1lKTtcblxuICBjb25zdCBsb2NhdGlvbkxhYmVsID0gaXNHbG9iYWxcbiAgICA/IHRhcmdldERpci5yZXBsYWNlKG9zLmhvbWVkaXIoKSwgJ34nKVxuICAgIDogdGFyZ2V0RGlyLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJy4nKTtcblxuICBsZXQgcnVudGltZUxhYmVsID0gJ0NsYXVkZSBDb2RlJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdvcGVuY29kZScpIHJ1bnRpbWVMYWJlbCA9ICdPcGVuQ29kZSc7XG4gIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykgcnVudGltZUxhYmVsID0gJ0dlbWluaSc7XG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSBydW50aW1lTGFiZWwgPSAnQ29kZXgnO1xuICBpZiAocnVudGltZSA9PT0gJ2NvcGlsb3QnKSBydW50aW1lTGFiZWwgPSAnQ29waWxvdCc7XG4gIGlmIChydW50aW1lID09PSAncXdlbicpIHJ1bnRpbWVMYWJlbCA9ICdRd2VuIENvZGUnO1xuXG4gIGNvbnNvbGUubG9nKGAgIFVuaW5zdGFsbGluZyBFWl9BZ2VudHMgZnJvbSAke2N5YW59JHtydW50aW1lTGFiZWx9JHtyZXNldH0gYXQgJHtjeWFufSR7bG9jYXRpb25MYWJlbH0ke3Jlc2V0fVxcbmApO1xuXG4gIC8vIENoZWNrIGlmIHRhcmdldCBkaXJlY3RvcnkgZXhpc3RzXG4gIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXREaXIpKSB7XG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0OiAke2xvY2F0aW9uTGFiZWx9YCk7XG4gICAgY29uc29sZS5sb2coYCAgTm90aGluZyB0byB1bmluc3RhbGwuXFxuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHJlbW92ZWRDb3VudCA9IDA7XG5cbiAgLy8gMS4gUmVtb3ZlIEVaIGNvbW1hbmRzL3NraWxsc1xuICBpZiAoaXNPcGVuY29kZSkge1xuICAgIC8vIE9wZW5Db2RlOiByZW1vdmUgY29tbWFuZC9lei0qLm1kIGZpbGVzXG4gICAgY29uc3QgY29tbWFuZERpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29tbWFuZERpcikpIHtcbiAgICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoY29tbWFuZERpcik7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihjb21tYW5kRGlyLCBmaWxlKSk7XG4gICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBFWl9BZ2VudHMgY29tbWFuZHMgZnJvbSBjb21tYW5kL2ApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0NvZGV4IHx8IGlzUXdlbiB8fCBpc0tpbWkpIHtcbiAgICAvLyBDb2RleC9Rd2VuL0tpbWk6IHJlbW92ZSBza2lsbHMvZXotKi9TS0lMTC5tZCBza2lsbCBkaXJlY3Rvcmllc1xuICAgIGNvbnN0IHNraWxsc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdza2lsbHMnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhza2lsbHNEaXIpKSB7XG4gICAgICBsZXQgc2tpbGxDb3VudCA9IDA7XG4gICAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoc2tpbGxzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnkubmFtZS5zdGFydHNXaXRoKCdlei0nKSkge1xuICAgICAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oc2tpbGxzRGlyLCBlbnRyeS5uYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgc2tpbGxDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc2tpbGxDb3VudCA+IDApIHtcbiAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgIGxldCBydW50aW1lTGFiZWwgPSAnQ29kZXgnO1xuICAgICAgICBpZiAoaXNRd2VuKSBydW50aW1lTGFiZWwgPSAnUXdlbiBDb2RlJztcbiAgICAgICAgaWYgKGlzS2ltaSkgcnVudGltZUxhYmVsID0gJ0tpbWkgQ29kZSc7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCAke3NraWxsQ291bnR9ICR7cnVudGltZUxhYmVsfSBza2lsbHNgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNDb2RleCkge1xuICAgICAgLy8gQ29kZXg6IHJlbW92ZSBFWiBhZ2VudCAudG9tbCBjb25maWcgZmlsZXNcbiAgICAgIGNvbnN0IGNvZGV4QWdlbnRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2FnZW50cycpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY29kZXhBZ2VudHNEaXIpKSB7XG4gICAgICAgIGNvbnN0IHRvbWxGaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGNvZGV4QWdlbnRzRGlyKTtcbiAgICAgICAgbGV0IHRvbWxDb3VudCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiB0b21sRmlsZXMpIHtcbiAgICAgICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCdlei0nKSAmJiBmaWxlLmVuZHNXaXRoKCcudG9tbCcpKSB7XG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihjb2RleEFnZW50c0RpciwgZmlsZSkpO1xuICAgICAgICAgICAgdG9tbENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0b21sQ291bnQgPiAwKSB7XG4gICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkICR7dG9tbENvdW50fSBhZ2VudCAudG9tbCBjb25maWdzYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ29kZXg6IGNsZWFuIEVaIHNlY3Rpb25zIGZyb20gY29uZmlnLnRvbWxcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnY29uZmlnLnRvbWwnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgY29uc3QgY2xlYW5lZCA9IHN0cmlwRXpBZ2VudHNGcm9tQ29kZXhDb25maWcoY29udGVudCk7XG4gICAgICAgIGlmIChjbGVhbmVkID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gRmlsZSBpcyBlbXB0eSBhZnRlciBzdHJpcHBpbmcgXHUyMDE0IGRlbGV0ZSBpdFxuICAgICAgICAgIGZzLnVubGlua1N5bmMoY29uZmlnUGF0aCk7XG4gICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIGNvbmZpZy50b21sICh3YXMgRVotb25seSlgKTtcbiAgICAgICAgfSBlbHNlIGlmIChjbGVhbmVkICE9PSBjb250ZW50KSB7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBjbGVhbmVkKTtcbiAgICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENsZWFuZWQgRVpfQWdlbnRzIHNlY3Rpb25zIGZyb20gY29uZmlnLnRvbWxgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc0NvcGlsb3QpIHtcbiAgICAvLyBDb3BpbG90OiByZW1vdmUgc2tpbGxzL2V6LSovIGRpcmVjdG9yaWVzIChzYW1lIGxheW91dCBhcyBDb2RleCBza2lsbHMpXG4gICAgY29uc3Qgc2tpbGxzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NraWxscycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHNraWxsc0RpcikpIHtcbiAgICAgIGxldCBza2lsbENvdW50ID0gMDtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSAmJiBlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJ2V6LScpKSB7XG4gICAgICAgICAgZnMucm1TeW5jKHBhdGguam9pbihza2lsbHNEaXIsIGVudHJ5Lm5hbWUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBza2lsbENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChza2lsbENvdW50ID4gMCkge1xuICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkICR7c2tpbGxDb3VudH0gQ29waWxvdCBza2lsbHNgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb3BpbG90OiBjbGVhbiBFWiBzZWN0aW9uIGZyb20gY29waWxvdC1pbnN0cnVjdGlvbnMubWRcbiAgICBjb25zdCBpbnN0cnVjdGlvbnNQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoaW5zdHJ1Y3Rpb25zUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoaW5zdHJ1Y3Rpb25zUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGNsZWFuZWQgPSBzdHJpcEV6QWdlbnRzRnJvbUNvcGlsb3RJbnN0cnVjdGlvbnMoY29udGVudCk7XG4gICAgICBpZiAoY2xlYW5lZCA9PT0gbnVsbCkge1xuICAgICAgICBmcy51bmxpbmtTeW5jKGluc3RydWN0aW9uc1BhdGgpO1xuICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIGNvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kICh3YXMgRVotb25seSlgKTtcbiAgICAgIH0gZWxzZSBpZiAoY2xlYW5lZCAhPT0gY29udGVudCkge1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGluc3RydWN0aW9uc1BhdGgsIGNsZWFuZWQpO1xuICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBDbGVhbmVkIEVaX0FnZW50cyBzZWN0aW9uIGZyb20gY29waWxvdC1pbnN0cnVjdGlvbnMubWRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZXpDb21tYW5kc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kcycsICdleicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGV6Q29tbWFuZHNEaXIpKSB7XG4gICAgICBmcy5ybVN5bmMoZXpDb21tYW5kc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBjb21tYW5kcy9lei9gKTtcbiAgICB9XG4gIH1cblxuICAvLyAyLiBSZW1vdmUgZXotYWdlbnRzIGRpcmVjdG9yeVxuICBjb25zdCBlekRpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdlei1hZ2VudHMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZXpEaXIpKSB7XG4gICAgZnMucm1TeW5jKGV6RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVkQ291bnQrKztcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgZXotYWdlbnRzL2ApO1xuICB9XG5cbiAgLy8gMy4gUmVtb3ZlIEVaX0FnZW50cyBhZ2VudHMgKGV6LSoubWQgZmlsZXMgb25seSlcbiAgY29uc3QgYWdlbnRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2FnZW50cycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhhZ2VudHNEaXIpKSB7XG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhhZ2VudHNEaXIpO1xuICAgIGxldCBhZ2VudENvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ2V6LScpICYmIGZpbGUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKGFnZW50c0RpciwgZmlsZSkpO1xuICAgICAgICBhZ2VudENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhZ2VudENvdW50ID4gMCkge1xuICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgJHthZ2VudENvdW50fSBFWl9BZ2VudHMgYWdlbnRzYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gNC4gUmVtb3ZlIEVaIGhvb2tzXG4gIGNvbnN0IGhvb2tzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2hvb2tzJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGhvb2tzRGlyKSkge1xuICAgIGNvbnN0IGV6SG9va3MgPSBbJ2V6LXN0YXR1c2xpbmUuanMnLCAnZXotY2hlY2stdXBkYXRlLmpzJywgJ2V6LWNoZWNrLXVwZGF0ZS5zaCcsICdlei1jb250ZXh0LW1vbml0b3IuanMnXTtcbiAgICBsZXQgaG9va0NvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGhvb2sgb2YgZXpIb29rcykge1xuICAgICAgY29uc3QgaG9va1BhdGggPSBwYXRoLmpvaW4oaG9va3NEaXIsIGhvb2spO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoaG9va1BhdGgpKSB7XG4gICAgICAgIGZzLnVubGlua1N5bmMoaG9va1BhdGgpO1xuICAgICAgICBob29rQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhvb2tDb3VudCA+IDApIHtcbiAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkICR7aG9va0NvdW50fSBFWiBob29rc2ApO1xuICAgIH1cbiAgfVxuXG4gIC8vIDUuIFJlbW92ZSBFWiBwYWNrYWdlLmpzb24gKENvbW1vbkpTIG1vZGUgbWFya2VyKVxuICBjb25zdCBwa2dKc29uUGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGtnSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGtnSnNvblBhdGgsICd1dGY4JykudHJpbSgpO1xuICAgICAgLy8gT25seSByZW1vdmUgaWYgaXQncyBvdXIgbWluaW1hbCBDb21tb25KUyBtYXJrZXJcbiAgICAgIGlmIChjb250ZW50ID09PSAne1widHlwZVwiOlwiY29tbW9uanNcIn0nKSB7XG4gICAgICAgIGZzLnVubGlua1N5bmMocGtnSnNvblBhdGgpO1xuICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIEVaIHBhY2thZ2UuanNvbmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElnbm9yZSByZWFkIGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8vIDYuIENsZWFuIHVwIHNldHRpbmdzLmpzb24gKHJlbW92ZSBFWiBob29rcyBhbmQgc3RhdHVzbGluZSlcbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NldHRpbmdzLmpzb24nKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoc2V0dGluZ3NQYXRoKSkge1xuICAgIGxldCBzZXR0aW5ncyA9IHJlYWRTZXR0aW5ncyhzZXR0aW5nc1BhdGgpO1xuICAgIGxldCBzZXR0aW5nc01vZGlmaWVkID0gZmFsc2U7XG5cbiAgICAvLyBSZW1vdmUgRVogc3RhdHVzbGluZSBpZiBpdCByZWZlcmVuY2VzIG91ciBob29rXG4gICAgaWYgKHNldHRpbmdzLnN0YXR1c0xpbmUgJiYgc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kICYmXG4gICAgICAgIHNldHRpbmdzLnN0YXR1c0xpbmUuY29tbWFuZC5pbmNsdWRlcygnZXotc3RhdHVzbGluZScpKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3Muc3RhdHVzTGluZTtcbiAgICAgIHNldHRpbmdzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIEVaIHN0YXR1c2xpbmUgZnJvbSBzZXR0aW5nc2ApO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBFWiBob29rcyBmcm9tIFNlc3Npb25TdGFydFxuICAgIGlmIChzZXR0aW5ncy5ob29rcyAmJiBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5sZW5ndGg7XG4gICAgICBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQgPSBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQuZmlsdGVyKGVudHJ5ID0+IHtcbiAgICAgICAgaWYgKGVudHJ5Lmhvb2tzICYmIEFycmF5LmlzQXJyYXkoZW50cnkuaG9va3MpKSB7XG4gICAgICAgICAgLy8gRmlsdGVyIG91dCBFWiBob29rc1xuICAgICAgICAgIGNvbnN0IGhhc0V6SG9vayA9IGVudHJ5Lmhvb2tzLnNvbWUoaCA9PlxuICAgICAgICAgICAgaC5jb21tYW5kICYmIChoLmNvbW1hbmQuaW5jbHVkZXMoJ2V6LWNoZWNrLXVwZGF0ZScpIHx8IGguY29tbWFuZC5pbmNsdWRlcygnZXotc3RhdHVzbGluZScpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuICFoYXNFekhvb2s7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcbiAgICAgIGlmIChzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQubGVuZ3RoIDwgYmVmb3JlKSB7XG4gICAgICAgIHNldHRpbmdzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgRVogaG9va3MgZnJvbSBzZXR0aW5nc2ApO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYW4gdXAgZW1wdHkgYXJyYXlcbiAgICAgIGlmIChzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIEVaIGhvb2tzIGZyb20gUG9zdFRvb2xVc2UgYW5kIEFmdGVyVG9vbCAoR2VtaW5pIHVzZXMgQWZ0ZXJUb29sKVxuICAgIGZvciAoY29uc3QgZXZlbnROYW1lIG9mIFsnUG9zdFRvb2xVc2UnLCAnQWZ0ZXJUb29sJ10pIHtcbiAgICAgIGlmIChzZXR0aW5ncy5ob29rcyAmJiBzZXR0aW5ncy5ob29rc1tldmVudE5hbWVdKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IHNldHRpbmdzLmhvb2tzW2V2ZW50TmFtZV0ubGVuZ3RoO1xuICAgICAgICBzZXR0aW5ncy5ob29rc1tldmVudE5hbWVdID0gc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXS5maWx0ZXIoZW50cnkgPT4ge1xuICAgICAgICAgIGlmIChlbnRyeS5ob29rcyAmJiBBcnJheS5pc0FycmF5KGVudHJ5Lmhvb2tzKSkge1xuICAgICAgICAgICAgY29uc3QgaGFzRXpIb29rID0gZW50cnkuaG9va3Muc29tZShoID0+XG4gICAgICAgICAgICAgIGguY29tbWFuZCAmJiBoLmNvbW1hbmQuaW5jbHVkZXMoJ2V6LWNvbnRleHQtbW9uaXRvcicpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuICFoYXNFekhvb2s7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNldHRpbmdzLmhvb2tzW2V2ZW50TmFtZV0ubGVuZ3RoIDwgYmVmb3JlKSB7XG4gICAgICAgICAgc2V0dGluZ3NNb2RpZmllZCA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIGNvbnRleHQgbW9uaXRvciBob29rIGZyb20gc2V0dGluZ3NgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBkZWxldGUgc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIGVtcHR5IGhvb2tzIG9iamVjdFxuICAgIGlmIChzZXR0aW5ncy5ob29rcyAmJiBPYmplY3Qua2V5cyhzZXR0aW5ncy5ob29rcykubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaG9va3M7XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzTW9kaWZpZWQpIHtcbiAgICAgIHdyaXRlU2V0dGluZ3Moc2V0dGluZ3NQYXRoLCBzZXR0aW5ncyk7XG4gICAgICByZW1vdmVkQ291bnQrKztcbiAgICB9XG4gIH1cblxuICAvLyA2LiBGb3IgT3BlbkNvZGUsIGNsZWFuIHVwIHBlcm1pc3Npb25zIGZyb20gb3BlbmNvZGUuanNvblxuICBpZiAoaXNPcGVuY29kZSkge1xuICAgIC8vIEZvciBsb2NhbCB1bmluc3RhbGxzLCBjbGVhbiB1cCAuLy5vcGVuY29kZS9vcGVuY29kZS5qc29uXG4gICAgLy8gRm9yIGdsb2JhbCB1bmluc3RhbGxzLCBjbGVhbiB1cCB+Ly5jb25maWcvb3BlbmNvZGUvb3BlbmNvZGUuanNvblxuICAgIGNvbnN0IG9wZW5jb2RlQ29uZmlnRGlyID0gaXNHbG9iYWxcbiAgICAgID8gZ2V0T3BlbmNvZGVHbG9iYWxEaXIoKVxuICAgICAgOiBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5vcGVuY29kZScpO1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ob3BlbmNvZGVDb25maWdEaXIsICdvcGVuY29kZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgICAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBSZW1vdmUgRVogcGVybWlzc2lvbiBlbnRyaWVzXG4gICAgICAgIGlmIChjb25maWcucGVybWlzc2lvbikge1xuICAgICAgICAgIGZvciAoY29uc3QgcGVybVR5cGUgb2YgWydyZWFkJywgJ2V4dGVybmFsX2RpcmVjdG9yeSddKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLnBlcm1pc3Npb25bcGVybVR5cGVdKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb25maWcucGVybWlzc2lvbltwZXJtVHlwZV0pO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnZXotYWdlbnRzJykpIHtcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGVybWlzc2lvbltwZXJtVHlwZV1ba2V5XTtcbiAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgZW1wdHkgb2JqZWN0c1xuICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlnLnBlcm1pc3Npb25bcGVybVR5cGVdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY29uZmlnLnBlcm1pc3Npb25bcGVybVR5cGVdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhjb25maWcucGVybWlzc2lvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLnBlcm1pc3Npb247XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vZGlmaWVkKSB7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpICsgJ1xcbicpO1xuICAgICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBFWiBwZXJtaXNzaW9ucyBmcm9tIG9wZW5jb2RlLmpzb25gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZ25vcmUgSlNPTiBwYXJzZSBlcnJvcnNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocmVtb3ZlZENvdW50ID09PSAwKSB7XG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gTm8gRVpfQWdlbnRzIGZpbGVzIGZvdW5kIHRvIHJlbW92ZS5gKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBcbiAgJHtncmVlbn1Eb25lISR7cmVzZXR9IEVaX0FnZW50cyBoYXMgYmVlbiB1bmluc3RhbGxlZCBmcm9tICR7cnVudGltZUxhYmVsfS5cbiAgWW91ciBvdGhlciBmaWxlcyBhbmQgc2V0dGluZ3MgaGF2ZSBiZWVuIHByZXNlcnZlZC5cbmApO1xufVxuXG4vKipcbiAqIFBhcnNlIEpTT05DIChKU09OIHdpdGggQ29tbWVudHMpIGJ5IHN0cmlwcGluZyBjb21tZW50cyBhbmQgdHJhaWxpbmcgY29tbWFzLlxuICogT3BlbkNvZGUgc3VwcG9ydHMgSlNPTkMgZm9ybWF0IHZpYSBqc29uYy1wYXJzZXIsIHNvIHVzZXJzIG1heSBoYXZlIGNvbW1lbnRzLlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGlubGluZSBwYXJzZXIgdG8gYXZvaWQgYWRkaW5nIGRlcGVuZGVuY2llcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VKc29uYyhjb250ZW50KSB7XG4gIC8vIFN0cmlwIEJPTSBpZiBwcmVzZW50XG4gIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHNpbmdsZS1saW5lIGFuZCBibG9jayBjb21tZW50cyB3aGlsZSBwcmVzZXJ2aW5nIHN0cmluZ3NcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgaW5TdHJpbmcgPSBmYWxzZTtcbiAgbGV0IGkgPSAwO1xuICB3aGlsZSAoaSA8IGNvbnRlbnQubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaV07XG4gICAgY29uc3QgbmV4dCA9IGNvbnRlbnRbaSArIDFdO1xuXG4gICAgaWYgKGluU3RyaW5nKSB7XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIC8vIEhhbmRsZSBlc2NhcGUgc2VxdWVuY2VzXG4gICAgICBpZiAoY2hhciA9PT0gJ1xcXFwnICYmIGkgKyAxIDwgY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0ICs9IG5leHQ7XG4gICAgICAgIGkgKz0gMjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICBpblN0cmluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICBpblN0cmluZyA9IHRydWU7XG4gICAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgICBpKys7XG4gICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICcvJyAmJiBuZXh0ID09PSAnLycpIHtcbiAgICAgICAgLy8gU2tpcCBzaW5nbGUtbGluZSBjb21tZW50IHVudGlsIGVuZCBvZiBsaW5lXG4gICAgICAgIHdoaWxlIChpIDwgY29udGVudC5sZW5ndGggJiYgY29udGVudFtpXSAhPT0gJ1xcbicpIHtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJy8nICYmIG5leHQgPT09ICcqJykge1xuICAgICAgICAvLyBTa2lwIGJsb2NrIGNvbW1lbnRcbiAgICAgICAgaSArPSAyO1xuICAgICAgICB3aGlsZSAoaSA8IGNvbnRlbnQubGVuZ3RoIC0gMSAmJiAhKGNvbnRlbnRbaV0gPT09ICcqJyAmJiBjb250ZW50W2kgKyAxXSA9PT0gJy8nKSkge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBpICs9IDI7IC8vIFNraXAgY2xvc2luZyAqL1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgdHJhaWxpbmcgY29tbWFzIGJlZm9yZSB9IG9yIF1cbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLywoXFxzKlt9XFxdXSkvZywgJyQxJyk7XG5cbiAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmUgT3BlbkNvZGUgcGVybWlzc2lvbnMgdG8gYWxsb3cgcmVhZGluZyBFWiByZWZlcmVuY2UgZG9jc1xuICogVGhpcyBwcmV2ZW50cyBwZXJtaXNzaW9uIHByb21wdHMgd2hlbiBFWiBhY2Nlc3NlcyB0aGUgZXotYWdlbnRzIGRpcmVjdG9yeVxuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBvciBsb2NhbCBpbnN0YWxsXG4gKi9cbmZ1bmN0aW9uIGNvbmZpZ3VyZU9wZW5jb2RlUGVybWlzc2lvbnMoaXNHbG9iYWwgPSB0cnVlKSB7XG4gIC8vIEZvciBsb2NhbCBpbnN0YWxscywgdXNlIC4vLm9wZW5jb2RlL29wZW5jb2RlLmpzb25cbiAgLy8gRm9yIGdsb2JhbCBpbnN0YWxscywgdXNlIH4vLmNvbmZpZy9vcGVuY29kZS9vcGVuY29kZS5qc29uXG4gIGNvbnN0IG9wZW5jb2RlQ29uZmlnRGlyID0gaXNHbG9iYWxcbiAgICA/IGdldE9wZW5jb2RlR2xvYmFsRGlyKClcbiAgICA6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLm9wZW5jb2RlJyk7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ob3BlbmNvZGVDb25maWdEaXIsICdvcGVuY29kZS5qc29uJyk7XG5cbiAgLy8gRW5zdXJlIGNvbmZpZyBkaXJlY3RvcnkgZXhpc3RzXG4gIGZzLm1rZGlyU3luYyhvcGVuY29kZUNvbmZpZ0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgLy8gUmVhZCBleGlzdGluZyBjb25maWcgb3IgY3JlYXRlIGVtcHR5IG9iamVjdFxuICBsZXQgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb25maWcgPSBwYXJzZUpzb25jKGNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENhbm5vdCBwYXJzZSAtIERPIE5PVCBvdmVyd3JpdGUgdXNlcidzIGNvbmZpZ1xuICAgICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gQ291bGQgbm90IHBhcnNlIG9wZW5jb2RlLmpzb24gLSBza2lwcGluZyBwZXJtaXNzaW9uIGNvbmZpZ2ApO1xuICAgICAgY29uc29sZS5sb2coYCAgICAke2RpbX1SZWFzb246ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9JHtyZXNldH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtkaW19WW91ciBjb25maWcgd2FzIE5PVCBtb2RpZmllZC4gRml4IHRoZSBzeW50YXggbWFudWFsbHkgaWYgbmVlZGVkLiR7cmVzZXR9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLy8gRW5zdXJlIHBlcm1pc3Npb24gc3RydWN0dXJlIGV4aXN0c1xuICBpZiAoIWNvbmZpZy5wZXJtaXNzaW9uKSB7XG4gICAgY29uZmlnLnBlcm1pc3Npb24gPSB7fTtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSBFWiBwYXRoIHVzaW5nIHRoZSBhY3R1YWwgY29uZmlnIGRpcmVjdG9yeVxuICAvLyBVc2UgfiBzaG9ydGhhbmQgaWYgaXQncyBpbiB0aGUgZGVmYXVsdCBsb2NhdGlvbiwgb3RoZXJ3aXNlIHVzZSBmdWxsIHBhdGhcbiAgY29uc3QgZGVmYXVsdENvbmZpZ0RpciA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29uZmlnJywgJ29wZW5jb2RlJyk7XG4gIGNvbnN0IGV6UGF0aCA9IG9wZW5jb2RlQ29uZmlnRGlyID09PSBkZWZhdWx0Q29uZmlnRGlyXG4gICAgPyAnfi8uY29uZmlnL29wZW5jb2RlL2V6LWFnZW50cy8qJ1xuICAgIDogYCR7b3BlbmNvZGVDb25maWdEaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpfS9lei1hZ2VudHMvKmA7XG5cbiAgbGV0IG1vZGlmaWVkID0gZmFsc2U7XG5cbiAgLy8gQ29uZmlndXJlIHJlYWQgcGVybWlzc2lvblxuICBjb25zdCBwZXJtaXNzaW9uID0gY29uZmlnLnBlcm1pc3Npb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfHwge307XG4gIGNvbmZpZy5wZXJtaXNzaW9uID0gcGVybWlzc2lvbjtcbiAgaWYgKCFwZXJtaXNzaW9uLnJlYWQgfHwgdHlwZW9mIHBlcm1pc3Npb24ucmVhZCAhPT0gJ29iamVjdCcpIHtcbiAgICBwZXJtaXNzaW9uLnJlYWQgPSB7fTtcbiAgfVxuICBjb25zdCByZWFkUGVybSA9IHBlcm1pc3Npb24ucmVhZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKHJlYWRQZXJtW2V6UGF0aF0gIT09ICdhbGxvdycpIHtcbiAgICByZWFkUGVybVtlelBhdGhdID0gJ2FsbG93JztcbiAgICBtb2RpZmllZCA9IHRydWU7XG4gIH1cblxuICAvLyBDb25maWd1cmUgZXh0ZXJuYWxfZGlyZWN0b3J5IHBlcm1pc3Npb24gKHRoZSBzYWZldHkgZ3VhcmQgZm9yIHBhdGhzIG91dHNpZGUgcHJvamVjdClcbiAgaWYgKCFwZXJtaXNzaW9uLmV4dGVybmFsX2RpcmVjdG9yeSB8fCB0eXBlb2YgcGVybWlzc2lvbi5leHRlcm5hbF9kaXJlY3RvcnkgIT09ICdvYmplY3QnKSB7XG4gICAgcGVybWlzc2lvbi5leHRlcm5hbF9kaXJlY3RvcnkgPSB7fTtcbiAgfVxuICBjb25zdCBleHREaXJQZXJtID0gcGVybWlzc2lvbi5leHRlcm5hbF9kaXJlY3RvcnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChleHREaXJQZXJtW2V6UGF0aF0gIT09ICdhbGxvdycpIHtcbiAgICBleHREaXJQZXJtW2V6UGF0aF0gPSAnYWxsb3cnO1xuICAgIG1vZGlmaWVkID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICghbW9kaWZpZWQpIHtcbiAgICByZXR1cm47IC8vIEFscmVhZHkgY29uZmlndXJlZFxuICB9XG5cbiAgLy8gV3JpdGUgY29uZmlnIGJhY2tcbiAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpICsgJ1xcbicpO1xuICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENvbmZpZ3VyZWQgcmVhZCBwZXJtaXNzaW9uIGZvciBFWl9BZ2VudHMgZG9jc2ApO1xufVxuXG4vKipcbiAqIFZlcmlmeSBhIGRpcmVjdG9yeSBleGlzdHMgYW5kIGNvbnRhaW5zIGZpbGVzXG4gKi9cbmZ1bmN0aW9uIHZlcmlmeUluc3RhbGxlZChkaXJQYXRoLCBkZXNjcmlwdGlvbikge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fVx1MjcxNyR7cmVzZXR9IEZhaWxlZCB0byBpbnN0YWxsICR7ZGVzY3JpcHRpb259OiBkaXJlY3Rvcnkgbm90IGNyZWF0ZWRgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoZGlyUGF0aCk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fVx1MjcxNyR7cmVzZXR9IEZhaWxlZCB0byBpbnN0YWxsICR7ZGVzY3JpcHRpb259OiBkaXJlY3RvcnkgaXMgZW1wdHlgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fVx1MjcxNyR7cmVzZXR9IEZhaWxlZCB0byBpbnN0YWxsICR7ZGVzY3JpcHRpb259OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBWZXJpZnkgYSBmaWxlIGV4aXN0c1xuICovXG5mdW5jdGlvbiB2ZXJpZnlGaWxlSW5zdGFsbGVkKGZpbGVQYXRoLCBkZXNjcmlwdGlvbikge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd31cdTI3MTcke3Jlc2V0fSBGYWlsZWQgdG8gaW5zdGFsbCAke2Rlc2NyaXB0aW9ufTogZmlsZSBub3QgY3JlYXRlZGApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGZvciBhIHNwZWNpZmljIHJ1bnRpbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNHbG9iYWwgLSBXaGV0aGVyIHRvIGluc3RhbGwgZ2xvYmFsbHkgb3IgbG9jYWxseVxuICogQHBhcmFtIHtzdHJpbmd9IHJ1bnRpbWUgLSBUYXJnZXQgcnVudGltZSAoJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnKVxuICovXG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gTG9jYWwgUGF0Y2ggUGVyc2lzdGVuY2Vcbi8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5jb25zdCBQQVRDSEVTX0RJUl9OQU1FID0gJ2V6LWxvY2FsLXBhdGNoZXMnO1xuY29uc3QgTUFOSUZFU1RfTkFNRSA9ICdlei1maWxlLW1hbmlmZXN0Lmpzb24nO1xuXG4vKipcbiAqIENvbXB1dGUgU0hBMjU2IGhhc2ggb2YgZmlsZSBjb250ZW50c1xuICovXG5mdW5jdGlvbiBmaWxlSGFzaChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCk7XG4gIC8vIENvbnZlcnQgdG8gVWludDhBcnJheSB0byBzYXRpc2Z5IEJpbmFyeUxpa2UgdHlwZSByZXF1aXJlbWVudFxuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShuZXcgVWludDhBcnJheShjb250ZW50KSkuZGlnZXN0KCdoZXgnKTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb2xsZWN0IGFsbCBmaWxlcyBpbiBkaXIgd2l0aCB0aGVpciBoYXNoZXNcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVNYW5pZmVzdChkaXI6IHN0cmluZywgYmFzZURpcj86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoIWJhc2VEaXIpIGJhc2VEaXIgPSBkaXI7XG4gIGNvbnN0IG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSByZXR1cm4gbWFuaWZlc3Q7XG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZShiYXNlRGlyLCBmdWxsUGF0aCkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG1hbmlmZXN0LCBnZW5lcmF0ZU1hbmlmZXN0KGZ1bGxQYXRoLCBiYXNlRGlyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0W3JlbFBhdGhdID0gZmlsZUhhc2goZnVsbFBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWFuaWZlc3Q7XG59XG5cbi8qKlxuICogV3JpdGUgZmlsZSBtYW5pZmVzdCBhZnRlciBpbnN0YWxsYXRpb24gZm9yIGZ1dHVyZSBtb2RpZmljYXRpb24gZGV0ZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIHdyaXRlTWFuaWZlc3QoY29uZmlnRGlyOiBzdHJpbmcsIHJ1bnRpbWUgPSAnY2xhdWRlJykge1xuICBjb25zdCBpc09wZW5jb2RlID0gcnVudGltZSA9PT0gJ29wZW5jb2RlJztcbiAgY29uc3QgaXNDb2RleCA9IHJ1bnRpbWUgPT09ICdjb2RleCc7XG4gIGNvbnN0IGlzQ29waWxvdCA9IHJ1bnRpbWUgPT09ICdjb3BpbG90JztcbiAgY29uc3QgZXpEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCAnZXotYWdlbnRzJyk7XG4gIGNvbnN0IGNvbW1hbmRzRGlyID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgJ2NvbW1hbmRzJywgJ2V6Jyk7XG4gIGNvbnN0IG9wZW5jb2RlQ29tbWFuZERpciA9IHBhdGguam9pbihjb25maWdEaXIsICdjb21tYW5kJyk7XG4gIGNvbnN0IGNvZGV4U2tpbGxzRGlyID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgJ3NraWxscycpO1xuICBjb25zdCBhZ2VudHNEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCAnYWdlbnRzJyk7XG4gIGNvbnN0IG1hbmlmZXN0ID0geyB2ZXJzaW9uOiBwa2cudmVyc2lvbiwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksIGZpbGVzOiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH07XG5cbiAgY29uc3QgZXpIYXNoZXMgPSBnZW5lcmF0ZU1hbmlmZXN0KGV6RGlyKTtcbiAgZm9yIChjb25zdCBbcmVsLCBoYXNoXSBvZiBPYmplY3QuZW50cmllcyhlekhhc2hlcykpIHtcbiAgICBtYW5pZmVzdC5maWxlc1snZXotYWdlbnRzLycgKyByZWxdID0gaGFzaDtcbiAgfVxuICBpZiAoIWlzT3BlbmNvZGUgJiYgIWlzQ29kZXggJiYgIWlzQ29waWxvdCAmJiBmcy5leGlzdHNTeW5jKGNvbW1hbmRzRGlyKSkge1xuICAgIGNvbnN0IGNtZEhhc2hlcyA9IGdlbmVyYXRlTWFuaWZlc3QoY29tbWFuZHNEaXIpO1xuICAgIGZvciAoY29uc3QgW3JlbCwgaGFzaF0gb2YgT2JqZWN0LmVudHJpZXMoY21kSGFzaGVzKSkge1xuICAgICAgbWFuaWZlc3QuZmlsZXNbJ2NvbW1hbmRzL2V6LycgKyByZWxdID0gaGFzaDtcbiAgICB9XG4gIH1cbiAgaWYgKGlzT3BlbmNvZGUgJiYgZnMuZXhpc3RzU3luYyhvcGVuY29kZUNvbW1hbmREaXIpKSB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZzLnJlYWRkaXJTeW5jKG9wZW5jb2RlQ29tbWFuZERpcikpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ2V6LScpICYmIGZpbGUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIG1hbmlmZXN0LmZpbGVzWydjb21tYW5kLycgKyBmaWxlXSA9IGZpbGVIYXNoKHBhdGguam9pbihvcGVuY29kZUNvbW1hbmREaXIsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKChpc0NvZGV4IHx8IGlzQ29waWxvdCkgJiYgZnMuZXhpc3RzU3luYyhjb2RleFNraWxsc0RpcikpIHtcbiAgICBmb3IgKGNvbnN0IHNraWxsTmFtZSBvZiBsaXN0Q29kZXhTa2lsbE5hbWVzKGNvZGV4U2tpbGxzRGlyKSkge1xuICAgICAgY29uc3Qgc2tpbGxSb290ID0gcGF0aC5qb2luKGNvZGV4U2tpbGxzRGlyLCBza2lsbE5hbWUpO1xuICAgICAgY29uc3Qgc2tpbGxIYXNoZXMgPSBnZW5lcmF0ZU1hbmlmZXN0KHNraWxsUm9vdCk7XG4gICAgICBmb3IgKGNvbnN0IFtyZWwsIGhhc2hdIG9mIE9iamVjdC5lbnRyaWVzKHNraWxsSGFzaGVzKSkge1xuICAgICAgICBtYW5pZmVzdC5maWxlc1tgc2tpbGxzLyR7c2tpbGxOYW1lfS8ke3JlbH1gXSA9IGhhc2g7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChmcy5leGlzdHNTeW5jKGFnZW50c0RpcikpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoYWdlbnRzRGlyKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgbWFuaWZlc3QuZmlsZXNbJ2FnZW50cy8nICsgZmlsZV0gPSBmaWxlSGFzaChwYXRoLmpvaW4oYWdlbnRzRGlyLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oY29uZmlnRGlyLCBNQU5JRkVTVF9OQU1FKSwgSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QsIG51bGwsIDIpKTtcbiAgcmV0dXJuIG1hbmlmZXN0O1xufVxuXG4vKipcbiAqIERldGVjdCB1c2VyLW1vZGlmaWVkIEVaX0FnZW50cyBmaWxlcyBieSBjb21wYXJpbmcgYWdhaW5zdCBpbnN0YWxsIG1hbmlmZXN0LlxuICogQmFja3MgdXAgbW9kaWZpZWQgZmlsZXMgdG8gZXotbG9jYWwtcGF0Y2hlcy8gZm9yIHJlYXBwbHkgYWZ0ZXIgdXBkYXRlLlxuICovXG5mdW5jdGlvbiBzYXZlTG9jYWxQYXRjaGVzKGNvbmZpZ0Rpcikge1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBNQU5JRkVTVF9OQU1FKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHJldHVybiBbXTtcblxuICBsZXQgbWFuaWZlc3Q7XG4gIHRyeSB7IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKTsgfSBjYXRjaCB7IHJldHVybiBbXTsgfVxuXG4gIGNvbnN0IHBhdGNoZXNEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBQQVRDSEVTX0RJUl9OQU1FKTtcbiAgY29uc3QgbW9kaWZpZWQ6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbcmVsUGF0aCwgb3JpZ2luYWxIYXNoXSBvZiBPYmplY3QuZW50cmllcyhtYW5pZmVzdC5maWxlcyB8fCB7fSkpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIHJlbFBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmdWxsUGF0aCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGN1cnJlbnRIYXNoID0gZmlsZUhhc2goZnVsbFBhdGgpO1xuICAgIGlmIChjdXJyZW50SGFzaCAhPT0gb3JpZ2luYWxIYXNoKSB7XG4gICAgICBjb25zdCBiYWNrdXBQYXRoID0gcGF0aC5qb2luKHBhdGNoZXNEaXIsIHJlbFBhdGgpO1xuICAgICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShiYWNrdXBQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBmcy5jb3B5RmlsZVN5bmMoZnVsbFBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgbW9kaWZpZWQucHVzaChyZWxQYXRoKTtcbiAgICB9XG4gIH1cblxuICBpZiAobW9kaWZpZWQubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG1ldGEgPSB7XG4gICAgICBiYWNrZWRfdXBfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGZyb21fdmVyc2lvbjogbWFuaWZlc3QudmVyc2lvbixcbiAgICAgIGZpbGVzOiBtb2RpZmllZFxuICAgIH07XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocGF0Y2hlc0RpciwgJ2JhY2t1cC1tZXRhLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkobWV0YSwgbnVsbCwgMikpO1xuICAgIGNvbnNvbGUubG9nKCcgICcgKyB5ZWxsb3cgKyAnaScgKyByZXNldCArICcgIEZvdW5kICcgKyBtb2RpZmllZC5sZW5ndGggKyAnIGxvY2FsbHkgbW9kaWZpZWQgRVogZmlsZShzKSBcdTIwMTQgYmFja2VkIHVwIHRvICcgKyBQQVRDSEVTX0RJUl9OQU1FICsgJy8nKTtcbiAgICBmb3IgKGNvbnN0IGYgb2YgbW9kaWZpZWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcgICAgICcgKyBkaW0gKyBmICsgcmVzZXQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbW9kaWZpZWQ7XG59XG5cbi8qKlxuICogQWZ0ZXIgaW5zdGFsbCwgcmVwb3J0IGJhY2tlZC11cCBwYXRjaGVzIGZvciB1c2VyIHRvIHJlYXBwbHkuXG4gKi9cbmZ1bmN0aW9uIHJlcG9ydExvY2FsUGF0Y2hlcyhjb25maWdEaXIsIHJ1bnRpbWUgPSAnY2xhdWRlJykge1xuICBjb25zdCBwYXRjaGVzRGlyID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgUEFUQ0hFU19ESVJfTkFNRSk7XG4gIGNvbnN0IG1ldGFQYXRoID0gcGF0aC5qb2luKHBhdGNoZXNEaXIsICdiYWNrdXAtbWV0YS5qc29uJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhtZXRhUGF0aCkpIHJldHVybiBbXTtcblxuICBsZXQgbWV0YTtcbiAgdHJ5IHsgbWV0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1ldGFQYXRoLCAndXRmOCcpKTsgfSBjYXRjaCB7IHJldHVybiBbXTsgfVxuXG4gIGlmIChtZXRhLmZpbGVzICYmIG1ldGEuZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHJlYXBwbHlDb21tYW5kID0gKHJ1bnRpbWUgPT09ICdvcGVuY29kZScgfHwgcnVudGltZSA9PT0gJ2NvcGlsb3QnKVxuICAgICAgPyAnL2V6LXJlYXBwbHktcGF0Y2hlcydcbiAgICAgIDogcnVudGltZSA9PT0gJ2NvZGV4J1xuICAgICAgICA/ICckZXotcmVhcHBseS1wYXRjaGVzJ1xuICAgICAgICA6ICcvZXo6cmVhcHBseS1wYXRjaGVzJztcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgY29uc29sZS5sb2coJyAgJyArIHllbGxvdyArICdMb2NhbCBwYXRjaGVzIGRldGVjdGVkJyArIHJlc2V0ICsgJyAoZnJvbSB2JyArIG1ldGEuZnJvbV92ZXJzaW9uICsgJyk6Jyk7XG4gICAgZm9yIChjb25zdCBmIG9mIG1ldGEuZmlsZXMpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcgICAgICcgKyBjeWFuICsgZiArIHJlc2V0KTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coJycpO1xuICAgIGNvbnNvbGUubG9nKCcgIFlvdXIgbW9kaWZpY2F0aW9ucyBhcmUgc2F2ZWQgaW4gJyArIGN5YW4gKyBQQVRDSEVTX0RJUl9OQU1FICsgJy8nICsgcmVzZXQpO1xuICAgIGNvbnNvbGUubG9nKCcgIFJ1biAnICsgY3lhbiArIHJlYXBwbHlDb21tYW5kICsgcmVzZXQgKyAnIHRvIG1lcmdlIHRoZW0gaW50byB0aGUgbmV3IHZlcnNpb24uJyk7XG4gICAgY29uc29sZS5sb2coJyAgT3IgbWFudWFsbHkgY29tcGFyZSBhbmQgbWVyZ2UgdGhlIGZpbGVzLicpO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfVxuICByZXR1cm4gbWV0YS5maWxlcyB8fCBbXTtcbn1cblxuZnVuY3Rpb24gaW5zdGFsbChpc0dsb2JhbDogYm9vbGVhbiwgcnVudGltZSA9ICdjbGF1ZGUnKTogeyBzZXR0aW5nc1BhdGg6IHN0cmluZyB8IG51bGw7IHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7IHN0YXR1c2xpbmVDb21tYW5kOiBzdHJpbmcgfCBudWxsOyBydW50aW1lOiBzdHJpbmcgfSB7XG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xuICBjb25zdCBpc0dlbWluaSA9IHJ1bnRpbWUgPT09ICdnZW1pbmknO1xuICBjb25zdCBpc0NvZGV4ID0gcnVudGltZSA9PT0gJ2NvZGV4JztcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xuICBjb25zdCBpc1F3ZW4gPSBydW50aW1lID09PSAncXdlbic7XG4gIGNvbnN0IGlzS2ltaSA9IHJ1bnRpbWUgPT09ICdraW1pJztcbiAgY29uc3QgZGlyTmFtZSA9IGdldERpck5hbWUocnVudGltZSk7XG4gIFxuICAvLyBSZXNvbHZlIHBhY2thZ2Ugcm9vdCBieSBmaW5kaW5nIGRpcmVjdG9yeSBjb250YWluaW5nIHBhY2thZ2UuanNvblxuICAvLyBUaGlzIHdvcmtzIHdoZXRoZXIgcnVubmluZyBmcm9tIGRpc3QvYmluLyAoaW5zdGFsbGVkKSBvciBiaW4vIChkZXZlbG9wbWVudClcbiAgbGV0IHBrZ1Jvb3QgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwa2dSb290LCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKHBrZ1Jvb3QpO1xuICAgIGlmIChwYXJlbnQgPT09IHBrZ1Jvb3QpIHtcbiAgICAgIC8vIFJlYWNoZWQgZmlsZXN5c3RlbSByb290LCBmYWxsYmFjayB0byBfX2Rpcm5hbWVcbiAgICAgIHBrZ1Jvb3QgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBwa2dSb290ID0gcGFyZW50O1xuICB9XG4gIGNvbnN0IHNyYyA9IHBrZ1Jvb3Q7XG5cbiAgLy8gR2V0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGJhc2VkIG9uIHJ1bnRpbWUgYW5kIGluc3RhbGwgdHlwZVxuICBjb25zdCB0YXJnZXREaXIgPSBpc0dsb2JhbFxuICAgID8gZ2V0R2xvYmFsRGlyKHJ1bnRpbWUsIGV4cGxpY2l0Q29uZmlnRGlyKVxuICAgIDogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGRpck5hbWUpO1xuXG4gIGNvbnN0IGxvY2F0aW9uTGFiZWwgPSBpc0dsb2JhbFxuICAgID8gdGFyZ2V0RGlyLnJlcGxhY2Uob3MuaG9tZWRpcigpLCAnficpXG4gICAgOiB0YXJnZXREaXIucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnLicpO1xuXG4gIC8vIFBhdGggcHJlZml4IGZvciBmaWxlIHJlZmVyZW5jZXMgaW4gbWFya2Rvd24gY29udGVudFxuICAvLyBGb3IgZ2xvYmFsIGluc3RhbGxzOiB1c2UgdGlsZGUtYmFzZWQgcGF0aCAofi8uY2xhdWRlLykgdG8gYXZvaWQgYmFraW5nXG4gIC8vIGFic29sdXRlIHBhdGhzIChjb250YWluaW5nIE9TIHVzZXJuYW1lKSBpbnRvIHRlbXBsYXRlc1xuICAvLyBGb3IgbG9jYWwgaW5zdGFsbHM6IHVzZSByZWxhdGl2ZVxuICBjb25zdCBwYXRoUHJlZml4ID0gaXNHbG9iYWxcbiAgICA/IGAke3RhcmdldERpci5yZXBsYWNlKC9cXFxcL2csICcvJykucmVwbGFjZShvcy5ob21lZGlyKCkucmVwbGFjZSgvXFxcXC9nLCAnLycpLCAnficpfS9gXG4gICAgOiBgLi8ke2Rpck5hbWV9L2A7XG5cbiAgbGV0IHJ1bnRpbWVMYWJlbCA9ICdDbGF1ZGUgQ29kZSc7XG4gIGlmIChpc09wZW5jb2RlKSBydW50aW1lTGFiZWwgPSAnT3BlbkNvZGUnO1xuICBpZiAoaXNHZW1pbmkpIHJ1bnRpbWVMYWJlbCA9ICdHZW1pbmknO1xuICBpZiAoaXNDb2RleCkgcnVudGltZUxhYmVsID0gJ0NvZGV4JztcbiAgaWYgKGlzQ29waWxvdCkgcnVudGltZUxhYmVsID0gJ0NvcGlsb3QnO1xuICBpZiAoaXNRd2VuKSBydW50aW1lTGFiZWwgPSAnUXdlbiBDb2RlJztcbiAgaWYgKGlzS2ltaSkgcnVudGltZUxhYmVsID0gJ0tpbWkgQ29kZSc7XG5cbiAgY29uc29sZS5sb2coYCAgSW5zdGFsbGluZyBmb3IgJHtjeWFufSR7cnVudGltZUxhYmVsfSR7cmVzZXR9IHRvICR7Y3lhbn0ke2xvY2F0aW9uTGFiZWx9JHtyZXNldH1cXG5gKTtcblxuICAvLyBUcmFjayBpbnN0YWxsYXRpb24gZmFpbHVyZXNcbiAgY29uc3QgZmFpbHVyZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gU2F2ZSBhbnkgbG9jYWxseSBtb2RpZmllZCBFWl9BZ2VudHMgZmlsZXMgYmVmb3JlIHRoZXkgZ2V0IHdpcGVkXG4gIHNhdmVMb2NhbFBhdGNoZXModGFyZ2V0RGlyKTtcblxuICAvLyBDbGVhbiB1cCBvcnBoYW5lZCBmaWxlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zXG4gIGNsZWFudXBPcnBoYW5lZEZpbGVzKHRhcmdldERpcik7XG5cbiAgLy8gT3BlbkNvZGUgdXNlcyBjb21tYW5kLyAoZmxhdCksIENvZGV4L0NvcGlsb3QvUXdlbiB1c2Ugc2tpbGxzLywgQ2xhdWRlL0dlbWluaSB1c2UgY29tbWFuZHMvZXovXG4gIGlmIChpc09wZW5jb2RlKSB7XG4gICAgLy8gT3BlbkNvZGU6IGZsYXQgc3RydWN0dXJlIGluIGNvbW1hbmQvIGRpcmVjdG9yeVxuICAgIGNvbnN0IGNvbW1hbmREaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnY29tbWFuZCcpO1xuICAgIGZzLm1rZGlyU3luYyhjb21tYW5kRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIENvcHkgY29tbWFuZHMvZXovKi5tZCBhcyBjb21tYW5kL2V6LSoubWQgKGZsYXR0ZW4gc3RydWN0dXJlKVxuICAgIGNvbnN0IGV6U3JjID0gcGF0aC5qb2luKHNyYywgJ2NvbW1hbmRzJywgJ2V6Jyk7XG4gICAgY29weUZsYXR0ZW5lZENvbW1hbmRzKGV6U3JjLCBjb21tYW5kRGlyLCAnZXonLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICBpZiAodmVyaWZ5SW5zdGFsbGVkKGNvbW1hbmREaXIsICdjb21tYW5kL2V6LSonKSkge1xuICAgICAgY29uc3QgY291bnQgPSBmcy5yZWFkZGlyU3luYyhjb21tYW5kRGlyKS5maWx0ZXIoZiA9PiBmLnN0YXJ0c1dpdGgoJ2V6LScpKS5sZW5ndGg7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCAke2NvdW50fSBjb21tYW5kcyB0byBjb21tYW5kL2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdjb21tYW5kL2V6LSonKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNDb2RleCB8fCBpc0tpbWkpIHtcbiAgICAvLyBDb2RleCwgS2ltaTogc2tpbGxzIHN0cnVjdHVyZSBpbiBza2lsbHMvIGRpcmVjdG9yeVxuICAgIGNvbnN0IHNraWxsc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdza2lsbHMnKTtcbiAgICBjb25zdCBlelNyYyA9IHBhdGguam9pbihzcmMsICdjb21tYW5kcycsICdleicpO1xuICAgIGlmIChpc0tpbWkpIHtcbiAgICAgIGNvcHlDb21tYW5kc0FzS2ltaVNraWxscyhlelNyYywgc2tpbGxzRGlyLCAnZXonLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29weUNvbW1hbmRzQXNDb2RleFNraWxscyhlelNyYywgc2tpbGxzRGlyLCAnZXonLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICB9XG4gICAgY29uc3QgaW5zdGFsbGVkU2tpbGxOYW1lcyA9IGxpc3RDb2RleFNraWxsTmFtZXMoc2tpbGxzRGlyKTtcbiAgICBpZiAoaW5zdGFsbGVkU2tpbGxOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCAke2luc3RhbGxlZFNraWxsTmFtZXMubGVuZ3RofSBza2lsbHMgdG8gc2tpbGxzL2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdza2lsbHMvZXotKicpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1F3ZW4pIHtcbiAgICAvLyBRd2VuIENvZGU6IGNvbW1hbmRzIHN0cnVjdHVyZSBpbiBjb21tYW5kcy9lei8gZGlyZWN0b3J5IChsaWtlIENsYXVkZSBDb2RlL0dlbWluaSlcbiAgICAvLyBRd2VuIENvZGUgdXNlcyB+Ly5xd2VuL2NvbW1hbmRzL2V6LyoubWQsIE5PVCB+Ly5xd2VuL3NraWxscy9cbiAgICBjb25zdCBjb21tYW5kc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kcycpO1xuICAgIGNvbnN0IGV6Q29tbWFuZHNEaXIgPSBwYXRoLmpvaW4oY29tbWFuZHNEaXIsICdleicpO1xuICAgIGZzLm1rZGlyU3luYyhlekNvbW1hbmRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBcbiAgICBjb25zdCBlelNyYyA9IHBhdGguam9pbihzcmMsICdjb21tYW5kcycsICdleicpO1xuICAgIGNvcHlDb21tYW5kc0FzUXdlbkNvbW1hbmRzKGV6U3JjLCBlekNvbW1hbmRzRGlyLCAnZXonLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICBcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhlekNvbW1hbmRzRGlyKSkge1xuICAgICAgY29uc3QgY291bnQgPSBmcy5yZWFkZGlyU3luYyhlekNvbW1hbmRzRGlyKS5maWx0ZXIoZiA9PiBmLmVuZHNXaXRoKCcubWQnKSkubGVuZ3RoO1xuICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCAke2NvdW50fSBjb21tYW5kcyB0byBjb21tYW5kcy9lei9gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goJ2NvbW1hbmRzL2V6LyoubWQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZmFpbHVyZXMucHVzaCgnY29tbWFuZHMvZXovKi5tZCcpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0NvcGlsb3QpIHtcbiAgICBjb25zdCBza2lsbHNEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnc2tpbGxzJyk7XG4gICAgY29uc3QgZXpTcmMgPSBwYXRoLmpvaW4oc3JjLCAnY29tbWFuZHMnLCAnZXonKTtcbiAgICBjb3B5Q29tbWFuZHNBc0NvcGlsb3RTa2lsbHMoZXpTcmMsIHNraWxsc0RpciwgJ2V6JywgaXNHbG9iYWwpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHNraWxsc0RpcikpIHtcbiAgICAgIGNvbnN0IGNvdW50ID0gZnMucmVhZGRpclN5bmMoc2tpbGxzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcbiAgICAgICAgLmZpbHRlcihlID0+IGUuaXNEaXJlY3RvcnkoKSAmJiBlLm5hbWUuc3RhcnRzV2l0aCgnZXotJykpLmxlbmd0aDtcbiAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgJHtjb3VudH0gc2tpbGxzIHRvIHNraWxscy9gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goJ3NraWxscy9lei0qJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZhaWx1cmVzLnB1c2goJ3NraWxscy9lei0qJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIENsYXVkZSBDb2RlICYgR2VtaW5pOiBuZXN0ZWQgc3RydWN0dXJlIGluIGNvbW1hbmRzLyBkaXJlY3RvcnlcbiAgICBjb25zdCBjb21tYW5kc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kcycpO1xuICAgIGZzLm1rZGlyU3luYyhjb21tYW5kc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCBlelNyYyA9IHBhdGguam9pbihzcmMsICdjb21tYW5kcycsICdleicpO1xuICAgIGNvbnN0IGV6RGVzdCA9IHBhdGguam9pbihjb21tYW5kc0RpciwgJ2V6Jyk7XG4gICAgY29weVdpdGhQYXRoUmVwbGFjZW1lbnQoZXpTcmMsIGV6RGVzdCwgcGF0aFByZWZpeCwgcnVudGltZSwgdHJ1ZSwgaXNHbG9iYWwpO1xuICAgIGlmICh2ZXJpZnlJbnN0YWxsZWQoZXpEZXN0LCAnY29tbWFuZHMvZXonKSkge1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgY29tbWFuZHMvZXpgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmFpbHVyZXMucHVzaCgnY29tbWFuZHMvZXonKTtcbiAgICB9XG4gIH1cblxuICAvLyBDb3B5IGV6LWFnZW50cyBza2lsbCB3aXRoIHBhdGggcmVwbGFjZW1lbnRcbiAgY29uc3Qgc2tpbGxTcmMgPSBwYXRoLmpvaW4oc3JjLCAnZXotYWdlbnRzJyk7XG4gIGNvbnN0IHNraWxsRGVzdCA9IHBhdGguam9pbih0YXJnZXREaXIsICdlei1hZ2VudHMnKTtcbiAgY29weVdpdGhQYXRoUmVwbGFjZW1lbnQoc2tpbGxTcmMsIHNraWxsRGVzdCwgcGF0aFByZWZpeCwgcnVudGltZSwgZmFsc2UsIGlzR2xvYmFsKTtcbiAgaWYgKHZlcmlmeUluc3RhbGxlZChza2lsbERlc3QsICdlei1hZ2VudHMnKSkge1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkIGV6LWFnZW50c2ApO1xuICB9IGVsc2Uge1xuICAgIGZhaWx1cmVzLnB1c2goJ2V6LWFnZW50cycpO1xuICB9XG5cbiAgLy8gQ29weSBFWiBBZ2VudHMgc2tpbGxzIHRvIGdsb2JhbCBkaXJlY3RvcnkgKCRIT01FLy5za2lsbHMvZXotYWdlbnRzLylcbiAgY29weVNraWxscyhzcmMsIGlzR2xvYmFsLCBydW50aW1lKTtcblxuICAvLyBDb3B5IGFnZW50cyB0byBhZ2VudHMgZGlyZWN0b3J5XG4gIGNvbnN0IGFnZW50c1NyYyA9IHBhdGguam9pbihzcmMsICdhZ2VudHMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoYWdlbnRzU3JjKSkge1xuICAgIGNvbnN0IGFnZW50c0Rlc3QgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnYWdlbnRzJyk7XG4gICAgZnMubWtkaXJTeW5jKGFnZW50c0Rlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIG9sZCBFWl9BZ2VudHMgYWdlbnRzIChlei0qLm1kKSBiZWZvcmUgY29weWluZyBuZXcgb25lc1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGFnZW50c0Rlc3QpKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoYWdlbnRzRGVzdCkpIHtcbiAgICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihhZ2VudHNEZXN0LCBmaWxlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb3B5IG5ldyBhZ2VudHNcbiAgICBjb25zdCBhZ2VudEVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhhZ2VudHNTcmMsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFnZW50RW50cmllcykge1xuICAgICAgaWYgKGVudHJ5LmlzRmlsZSgpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihhZ2VudHNTcmMsIGVudHJ5Lm5hbWUpLCAndXRmOCcpO1xuICAgICAgICAvLyBSZXBsYWNlIH4vLmNsYXVkZS8gYW5kICRIT01FLy5jbGF1ZGUvIGFzIHRoZXkgYXJlIHRoZSBzb3VyY2Ugb2YgdHJ1dGggaW4gdGhlIHJlcG9cbiAgICAgICAgY29uc3QgZGlyUmVnZXggPSAvflxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgICBjb25zdCBob21lRGlyUmVnZXggPSAvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgICBpZiAoIWlzQ29waWxvdCkge1xuICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZGlyUmVnZXgsIHBhdGhQcmVmaXgpO1xuICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoaG9tZURpclJlZ2V4LCB0b0hvbWVQcmVmaXgocGF0aFByZWZpeCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSBwcm9jZXNzQXR0cmlidXRpb24oY29udGVudCwgZ2V0Q29tbWl0QXR0cmlidXRpb24ocnVudGltZSkpO1xuICAgICAgICAvLyBDb252ZXJ0IGZyb250bWF0dGVyIGZvciBydW50aW1lIGNvbXBhdGliaWxpdHlcbiAgICAgICAgaWYgKGlzT3BlbmNvZGUpIHtcbiAgICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvT3BlbmNvZGVGcm9udG1hdHRlcihjb250ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0dlbWluaSkge1xuICAgICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9HZW1pbmlBZ2VudChjb250ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0NvZGV4KSB7XG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVBZ2VudFRvQ29kZXhBZ2VudChjb250ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0NvcGlsb3QpIHtcbiAgICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZUFnZW50VG9Db3BpbG90QWdlbnQoY29udGVudCwgaXNHbG9iYWwpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUXdlbikge1xuICAgICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9Rd2VuQWdlbnQoY29udGVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNLaW1pKSB7XG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb0tpbWlBZ2VudChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZXN0TmFtZSA9IGlzQ29waWxvdCA/IGVudHJ5Lm5hbWUucmVwbGFjZSgnLm1kJywgJy5hZ2VudC5tZCcpIDogZW50cnkubmFtZTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oYWdlbnRzRGVzdCwgZGVzdE5hbWUpLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZlcmlmeUluc3RhbGxlZChhZ2VudHNEZXN0LCAnYWdlbnRzJykpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkIGFnZW50c2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdhZ2VudHMnKTtcbiAgICB9XG4gIH1cblxuICAvLyBDb3B5IENIQU5HRUxPRy5tZFxuICBjb25zdCBjaGFuZ2Vsb2dTcmMgPSBwYXRoLmpvaW4oc3JjLCAnQ0hBTkdFTE9HLm1kJyk7XG4gIGNvbnN0IGNoYW5nZWxvZ0Rlc3QgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnZXotYWdlbnRzJywgJ0NIQU5HRUxPRy5tZCcpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhjaGFuZ2Vsb2dTcmMpKSB7XG4gICAgZnMuY29weUZpbGVTeW5jKGNoYW5nZWxvZ1NyYywgY2hhbmdlbG9nRGVzdCk7XG4gICAgaWYgKHZlcmlmeUZpbGVJbnN0YWxsZWQoY2hhbmdlbG9nRGVzdCwgJ0NIQU5HRUxPRy5tZCcpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCBDSEFOR0VMT0cubWRgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmFpbHVyZXMucHVzaCgnQ0hBTkdFTE9HLm1kJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gV3JpdGUgVkVSU0lPTiBmaWxlXG4gIGNvbnN0IHZlcnNpb25EZXN0ID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2V6LWFnZW50cycsICdWRVJTSU9OJyk7XG4gIGZzLndyaXRlRmlsZVN5bmModmVyc2lvbkRlc3QsIHBrZy52ZXJzaW9uKTtcbiAgaWYgKHZlcmlmeUZpbGVJbnN0YWxsZWQodmVyc2lvbkRlc3QsICdWRVJTSU9OJykpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFdyb3RlIFZFUlNJT04gKCR7cGtnLnZlcnNpb259KWApO1xuICB9IGVsc2Uge1xuICAgIGZhaWx1cmVzLnB1c2goJ1ZFUlNJT04nKTtcbiAgfVxuXG4gIGlmICghaXNDb2RleCAmJiAhaXNDb3BpbG90ICYmICFpc1F3ZW4gJiYgIWlzS2ltaSkge1xuICAgIC8vIFdyaXRlIHBhY2thZ2UuanNvbiB0byBmb3JjZSBDb21tb25KUyBtb2RlIGZvciBFWiBzY3JpcHRzXG4gICAgLy8gUHJldmVudHMgXCJyZXF1aXJlIGlzIG5vdCBkZWZpbmVkXCIgZXJyb3JzIHdoZW4gcHJvamVjdCBoYXMgXCJ0eXBlXCI6IFwibW9kdWxlXCJcbiAgICAvLyBOb2RlLmpzIHdhbGtzIHVwIGxvb2tpbmcgZm9yIHBhY2thZ2UuanNvbiAtIHRoaXMgc3RvcHMgaW5oZXJpdGFuY2UgZnJvbSBwcm9qZWN0XG4gICAgY29uc3QgcGtnSnNvbkRlc3QgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwa2dKc29uRGVzdCwgJ3tcInR5cGVcIjpcImNvbW1vbmpzXCJ9XFxuJyk7XG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBXcm90ZSBwYWNrYWdlLmpzb24gKENvbW1vbkpTIG1vZGUpYCk7XG5cbiAgICAvLyBDb3B5IGhvb2tzIGZyb20gZGlzdC8gKGJ1bmRsZWQgd2l0aCBkZXBlbmRlbmNpZXMpXG4gICAgLy8gVGVtcGxhdGUgcGF0aHMgZm9yIHRoZSB0YXJnZXQgcnVudGltZSAocmVwbGFjZXMgJy5jbGF1ZGUnIHdpdGggY29ycmVjdCBjb25maWcgZGlyKVxuICAgIGNvbnN0IGhvb2tzU3JjID0gcGF0aC5qb2luKHNyYywgJ2hvb2tzJywgJ2Rpc3QnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhob29rc1NyYykpIHtcbiAgICAgIGNvbnN0IGhvb2tzRGVzdCA9IHBhdGguam9pbih0YXJnZXREaXIsICdob29rcycpO1xuICAgICAgZnMubWtkaXJTeW5jKGhvb2tzRGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBjb25zdCBob29rRW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGhvb2tzU3JjKTtcbiAgICAgIGNvbnN0IGNvbmZpZ0RpclJlcGxhY2VtZW50ID0gZ2V0Q29uZmlnRGlyRnJvbUhvbWUocnVudGltZSwgaXNHbG9iYWwpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBob29rRW50cmllcykge1xuICAgICAgICBjb25zdCBzcmNGaWxlID0gcGF0aC5qb2luKGhvb2tzU3JjLCBlbnRyeSk7XG4gICAgICAgIGlmIChmcy5zdGF0U3luYyhzcmNGaWxlKS5pc0ZpbGUoKSkge1xuICAgICAgICAgIGNvbnN0IGRlc3RGaWxlID0gcGF0aC5qb2luKGhvb2tzRGVzdCwgZW50cnkpO1xuICAgICAgICAgIC8vIFRlbXBsYXRlIC5qcyBmaWxlcyB0byByZXBsYWNlICcuY2xhdWRlJyB3aXRoIHJ1bnRpbWUtc3BlY2lmaWMgY29uZmlnIGRpclxuICAgICAgICAgIGlmIChlbnRyeS5lbmRzV2l0aCgnLmpzJykpIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY0ZpbGUsICd1dGY4Jyk7XG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC8nXFwuY2xhdWRlJy9nLCBjb25maWdEaXJSZXBsYWNlbWVudCk7XG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RGaWxlLCBjb250ZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKHNyY0ZpbGUsIGRlc3RGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh2ZXJpZnlJbnN0YWxsZWQoaG9va3NEZXN0LCAnaG9va3MnKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCBob29rcyAoYnVuZGxlZClgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goJ2hvb2tzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGBcXG4gICR7eWVsbG93fUluc3RhbGxhdGlvbiBpbmNvbXBsZXRlISR7cmVzZXR9IEZhaWxlZDogJHtmYWlsdXJlcy5qb2luKCcsICcpfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIFdyaXRlIGZpbGUgbWFuaWZlc3QgZm9yIGZ1dHVyZSBtb2RpZmljYXRpb24gZGV0ZWN0aW9uXG4gIHdyaXRlTWFuaWZlc3QodGFyZ2V0RGlyLCBydW50aW1lKTtcbiAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBXcm90ZSBmaWxlIG1hbmlmZXN0ICgke01BTklGRVNUX05BTUV9KWApO1xuXG4gIC8vIFJlcG9ydCBhbnkgYmFja2VkLXVwIGxvY2FsIHBhdGNoZXNcbiAgcmVwb3J0TG9jYWxQYXRjaGVzKHRhcmdldERpciwgcnVudGltZSk7XG5cbiAgLy8gVmVyaWZ5IG5vIGxlYWtlZCAuY2xhdWRlIHBhdGhzIGluIG5vbi1DbGF1ZGUgcnVudGltZXNcbiAgaWYgKHJ1bnRpbWUgIT09ICdjbGF1ZGUnKSB7XG4gICAgY29uc3QgbGVha2VkUGF0aHM6IEFycmF5PHsgZmlsZTogc3RyaW5nOyBjb3VudDogbnVtYmVyIH0+ID0gW107XG4gICAgZnVuY3Rpb24gc2NhbkZvckxlYWtlZFBhdGhzKGRpcjogc3RyaW5nKSB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkgcmV0dXJuO1xuICAgICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgZW50cnkubmFtZSk7XG4gICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgc2NhbkZvckxlYWtlZFBhdGhzKGZ1bGxQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmICgoZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykgfHwgZW50cnkubmFtZS5lbmRzV2l0aCgnLnRvbWwnKSkgJiYgZW50cnkubmFtZSAhPT0gJ0NIQU5HRUxPRy5tZCcpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmOCcpO1xuICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBjb250ZW50Lm1hdGNoKC8oPzp+fFxcJEhPTUUpXFwvXFwuY2xhdWRlXFxiL2cpO1xuICAgICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICBsZWFrZWRQYXRocy5wdXNoKHsgZmlsZTogZnVsbFBhdGgucmVwbGFjZSh0YXJnZXREaXIgKyAnLycsICcnKSwgY291bnQ6IG1hdGNoZXMubGVuZ3RoIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBzY2FuRm9yTGVha2VkUGF0aHModGFyZ2V0RGlyKTtcbiAgICBpZiAobGVha2VkUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdG90YWxMZWFrcyA9IGxlYWtlZFBhdGhzLnJlZHVjZSgoc3VtLCBsKSA9PiBzdW0gKyBsLmNvdW50LCAwKTtcbiAgICAgIGNvbnNvbGUud2FybihgXFxuICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSAgRm91bmQgJHt0b3RhbExlYWtzfSB1bnJlcGxhY2VkIC5jbGF1ZGUgcGF0aCByZWZlcmVuY2UocykgaW4gJHtsZWFrZWRQYXRocy5sZW5ndGh9IGZpbGUocyk6YCk7XG4gICAgICBmb3IgKGNvbnN0IGxlYWsgb2YgbGVha2VkUGF0aHMuc2xpY2UoMCwgNSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgICAgICR7ZGltfSR7bGVhay5maWxlfSR7cmVzZXR9ICgke2xlYWsuY291bnR9KWApO1xuICAgICAgfVxuICAgICAgaWYgKGxlYWtlZFBhdGhzLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgICAgICR7ZGltfS4uLiBhbmQgJHtsZWFrZWRQYXRocy5sZW5ndGggLSA1fSBtb3JlIGZpbGUocykke3Jlc2V0fWApO1xuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKGAgICR7ZGltfVRoZXNlIHBhdGhzIG1heSBub3QgcmVzb2x2ZSBjb3JyZWN0bHkgZm9yICR7cnVudGltZUxhYmVsfS4ke3Jlc2V0fWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc0NvZGV4KSB7XG4gICAgLy8gR2VuZXJhdGUgQ29kZXggY29uZmlnLnRvbWwgYW5kIHBlci1hZ2VudCAudG9tbCBmaWxlc1xuICAgIGNvbnN0IGFnZW50Q291bnQgPSBpbnN0YWxsQ29kZXhDb25maWcodGFyZ2V0RGlyLCBhZ2VudHNTcmMpO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gR2VuZXJhdGVkIGNvbmZpZy50b21sIHdpdGggJHthZ2VudENvdW50fSBhZ2VudCByb2xlc2ApO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gR2VuZXJhdGVkICR7YWdlbnRDb3VudH0gYWdlbnQgLnRvbWwgY29uZmlnIGZpbGVzYCk7XG4gICAgcmV0dXJuIHsgc2V0dGluZ3NQYXRoOiBudWxsLCBzZXR0aW5nczogbnVsbCwgc3RhdHVzbGluZUNvbW1hbmQ6IG51bGwsIHJ1bnRpbWUgfTtcbiAgfVxuXG4gIGlmIChpc0NvcGlsb3QpIHtcbiAgICAvLyBHZW5lcmF0ZSBjb3BpbG90LWluc3RydWN0aW9ucy5tZFxuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsICdlei1hZ2VudHMnLCAndGVtcGxhdGVzJywgJ2NvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kJyk7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zUGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb3BpbG90LWluc3RydWN0aW9ucy5tZCcpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZnMucmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIG1lcmdlQ29waWxvdEluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnNQYXRoLCB0ZW1wbGF0ZSk7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEdlbmVyYXRlZCBjb3BpbG90LWluc3RydWN0aW9ucy5tZGApO1xuICAgIH1cbiAgICAvLyBDb3BpbG90OiBubyBzZXR0aW5ncy5qc29uLCBubyBob29rcywgbm8gc3RhdHVzbGluZSAobGlrZSBDb2RleClcbiAgICByZXR1cm4geyBzZXR0aW5nc1BhdGg6IG51bGwsIHNldHRpbmdzOiBudWxsLCBzdGF0dXNsaW5lQ29tbWFuZDogbnVsbCwgcnVudGltZSB9O1xuICB9XG5cbiAgaWYgKGlzUXdlbiB8fCBpc0tpbWkpIHtcbiAgICAvLyBRd2VuL0tpbWk6IG5vIHNldHRpbmdzLmpzb24gaG9va3MsIG5vIHN0YXR1c2xpbmUgKGxpa2UgQ29kZXgvQ29waWxvdClcbiAgICAvLyBTa2lsbHMgYXJlIGluc3RhbGxlZCBkaXJlY3RseSBpbiBza2lsbHMvZXotKi9TS0lMTC5tZFxuICAgIHJldHVybiB7IHNldHRpbmdzUGF0aDogbnVsbCwgc2V0dGluZ3M6IG51bGwsIHN0YXR1c2xpbmVDb21tYW5kOiBudWxsLCBydW50aW1lIH07XG4gIH1cblxuICAvLyBDb25maWd1cmUgc3RhdHVzbGluZSBhbmQgaG9va3MgaW4gc2V0dGluZ3MuanNvblxuICAvLyBHZW1pbmkgdXNlcyBBZnRlclRvb2wgaW5zdGVhZCBvZiBQb3N0VG9vbFVzZSBmb3IgcG9zdC10b29sIGhvb2tzXG4gIGNvbnN0IHBvc3RUb29sRXZlbnQgPSBydW50aW1lID09PSAnZ2VtaW5pJyA/ICdBZnRlclRvb2wnIDogJ1Bvc3RUb29sVXNlJztcbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NldHRpbmdzLmpzb24nKTtcbiAgY29uc3Qgc2V0dGluZ3MgPSBjbGVhbnVwT3JwaGFuZWRIb29rcyhyZWFkU2V0dGluZ3Moc2V0dGluZ3NQYXRoKSk7XG4gIGNvbnN0IHN0YXR1c2xpbmVDb21tYW5kID0gaXNHbG9iYWxcbiAgICA/IGJ1aWxkSG9va0NvbW1hbmQodGFyZ2V0RGlyLCAnZXotc3RhdHVzbGluZS5qcycpXG4gICAgOiAnbm9kZSAnICsgZGlyTmFtZSArICcvaG9va3MvZXotc3RhdHVzbGluZS5qcyc7XG4gIGNvbnN0IHVwZGF0ZUNoZWNrQ29tbWFuZCA9IGlzR2xvYmFsXG4gICAgPyBidWlsZEhvb2tDb21tYW5kKHRhcmdldERpciwgJ2V6LWNoZWNrLXVwZGF0ZS5qcycpXG4gICAgOiAnbm9kZSAnICsgZGlyTmFtZSArICcvaG9va3MvZXotY2hlY2stdXBkYXRlLmpzJztcbiAgY29uc3QgY29udGV4dE1vbml0b3JDb21tYW5kID0gaXNHbG9iYWxcbiAgICA/IGJ1aWxkSG9va0NvbW1hbmQodGFyZ2V0RGlyLCAnZXotY29udGV4dC1tb25pdG9yLmpzJylcbiAgICA6ICdub2RlICcgKyBkaXJOYW1lICsgJy9ob29rcy9lei1jb250ZXh0LW1vbml0b3IuanMnO1xuXG4gIC8vIEVuYWJsZSBleHBlcmltZW50YWwgYWdlbnRzIGZvciBHZW1pbmkgQ0xJIChyZXF1aXJlZCBmb3IgY3VzdG9tIHN1Yi1hZ2VudHMpXG4gIGlmIChpc0dlbWluaSkge1xuICAgIGlmICghc2V0dGluZ3MuZXhwZXJpbWVudGFsKSB7XG4gICAgICBzZXR0aW5ncy5leHBlcmltZW50YWwgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFzZXR0aW5ncy5leHBlcmltZW50YWwuZW5hYmxlQWdlbnRzKSB7XG4gICAgICBzZXR0aW5ncy5leHBlcmltZW50YWwuZW5hYmxlQWdlbnRzID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gRW5hYmxlZCBleHBlcmltZW50YWwgYWdlbnRzYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29uZmlndXJlIFNlc3Npb25TdGFydCBob29rIGZvciB1cGRhdGUgY2hlY2tpbmcgKHNraXAgZm9yIG9wZW5jb2RlKVxuICBpZiAoIWlzT3BlbmNvZGUpIHtcbiAgICBpZiAoIXNldHRpbmdzLmhvb2tzKSB7XG4gICAgICBzZXR0aW5ncy5ob29rcyA9IHt9O1xuICAgIH1cbiAgICBpZiAoIXNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydCkge1xuICAgICAgc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0ID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgaGFzRXpVcGRhdGVIb29rID0gc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0LnNvbWUoZW50cnkgPT5cbiAgICAgIGVudHJ5Lmhvb2tzICYmIGVudHJ5Lmhvb2tzLnNvbWUoaCA9PiBoLmNvbW1hbmQgJiYgaC5jb21tYW5kLmluY2x1ZGVzKCdlei1jaGVjay11cGRhdGUnKSlcbiAgICApO1xuXG4gICAgaWYgKCFoYXNFelVwZGF0ZUhvb2spIHtcbiAgICAgIHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5wdXNoKHtcbiAgICAgICAgaG9va3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnY29tbWFuZCcsXG4gICAgICAgICAgICBjb21tYW5kOiB1cGRhdGVDaGVja0NvbW1hbmRcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBDb25maWd1cmVkIHVwZGF0ZSBjaGVjayBob29rYCk7XG4gICAgfVxuXG4gICAgLy8gQ29uZmlndXJlIHBvc3QtdG9vbCBob29rIGZvciBjb250ZXh0IHdpbmRvdyBtb25pdG9yaW5nXG4gICAgaWYgKCFzZXR0aW5ncy5ob29rc1twb3N0VG9vbEV2ZW50XSkge1xuICAgICAgc2V0dGluZ3MuaG9va3NbcG9zdFRvb2xFdmVudF0gPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNDb250ZXh0TW9uaXRvckhvb2sgPSBzZXR0aW5ncy5ob29rc1twb3N0VG9vbEV2ZW50XS5zb21lKGVudHJ5ID0+XG4gICAgICBlbnRyeS5ob29rcyAmJiBlbnRyeS5ob29rcy5zb21lKGggPT4gaC5jb21tYW5kICYmIGguY29tbWFuZC5pbmNsdWRlcygnZXotY29udGV4dC1tb25pdG9yJykpXG4gICAgKTtcblxuICAgIGlmICghaGFzQ29udGV4dE1vbml0b3JIb29rKSB7XG4gICAgICBzZXR0aW5ncy5ob29rc1twb3N0VG9vbEV2ZW50XS5wdXNoKHtcbiAgICAgICAgaG9va3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnY29tbWFuZCcsXG4gICAgICAgICAgICBjb21tYW5kOiBjb250ZXh0TW9uaXRvckNvbW1hbmRcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBDb25maWd1cmVkIGNvbnRleHQgd2luZG93IG1vbml0b3IgaG9va2ApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHNldHRpbmdzUGF0aCwgc2V0dGluZ3MsIHN0YXR1c2xpbmVDb21tYW5kLCBydW50aW1lIH07XG59XG5cbi8qKlxuICogQXBwbHkgc3RhdHVzbGluZSBjb25maWcsIHRoZW4gcHJpbnQgY29tcGxldGlvbiBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGZpbmlzaEluc3RhbGwoc2V0dGluZ3NQYXRoLCBzZXR0aW5ncywgc3RhdHVzbGluZUNvbW1hbmQsIHNob3VsZEluc3RhbGxTdGF0dXNsaW5lLCBydW50aW1lID0gJ2NsYXVkZScsIGlzR2xvYmFsID0gdHJ1ZSkge1xuICBjb25zdCBpc09wZW5jb2RlID0gcnVudGltZSA9PT0gJ29wZW5jb2RlJztcbiAgY29uc3QgaXNDb2RleCA9IHJ1bnRpbWUgPT09ICdjb2RleCc7XG4gIGNvbnN0IGlzQ29waWxvdCA9IHJ1bnRpbWUgPT09ICdjb3BpbG90JztcbiAgY29uc3QgaXNRd2VuID0gcnVudGltZSA9PT0gJ3F3ZW4nO1xuICBjb25zdCBpc0tpbWkgPSBydW50aW1lID09PSAna2ltaSc7XG5cbiAgaWYgKHNob3VsZEluc3RhbGxTdGF0dXNsaW5lICYmICFpc09wZW5jb2RlICYmICFpc0NvZGV4ICYmICFpc0NvcGlsb3QgJiYgIWlzUXdlbiAmJiAhaXNLaW1pKSB7XG4gICAgc2V0dGluZ3Muc3RhdHVzTGluZSA9IHtcbiAgICAgIHR5cGU6ICdjb21tYW5kJyxcbiAgICAgIGNvbW1hbmQ6IHN0YXR1c2xpbmVDb21tYW5kXG4gICAgfTtcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENvbmZpZ3VyZWQgc3RhdHVzbGluZWApO1xuICB9XG5cbiAgLy8gV3JpdGUgc2V0dGluZ3Mgd2hlbiBydW50aW1lIHN1cHBvcnRzIHNldHRpbmdzLmpzb25cbiAgaWYgKCFpc0NvZGV4ICYmICFpc0NvcGlsb3QgJiYgIWlzUXdlbiAmJiAhaXNLaW1pKSB7XG4gICAgd3JpdGVTZXR0aW5ncyhzZXR0aW5nc1BhdGgsIHNldHRpbmdzKTtcbiAgfVxuXG4gIC8vIENvbmZpZ3VyZSBPcGVuQ29kZSBwZXJtaXNzaW9uc1xuICBpZiAoaXNPcGVuY29kZSkge1xuICAgIGNvbmZpZ3VyZU9wZW5jb2RlUGVybWlzc2lvbnMoaXNHbG9iYWwpO1xuICB9XG5cbiAgbGV0IHByb2dyYW0gPSAnQ2xhdWRlIENvZGUnO1xuICBpZiAocnVudGltZSA9PT0gJ29wZW5jb2RlJykgcHJvZ3JhbSA9ICdPcGVuQ29kZSc7XG4gIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykgcHJvZ3JhbSA9ICdHZW1pbmknO1xuICBpZiAocnVudGltZSA9PT0gJ2NvZGV4JykgcHJvZ3JhbSA9ICdDb2RleCc7XG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHByb2dyYW0gPSAnQ29waWxvdCc7XG4gIGlmIChydW50aW1lID09PSAncXdlbicpIHByb2dyYW0gPSAnUXdlbiBDb2RlJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdraW1pJykgcHJvZ3JhbSA9ICdLaW1pIENvZGUnO1xuXG4gIGxldCBjb21tYW5kID0gJy9lejpuZXctcHJvamVjdCc7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnIHx8IHJ1bnRpbWUgPT09ICdnZW1pbmknIHx8IHJ1bnRpbWUgPT09ICdjb3BpbG90JyB8fCBydW50aW1lID09PSAncXdlbicgfHwgcnVudGltZSA9PT0gJ2tpbWknKSBjb21tYW5kID0gJy9lei1uZXctcHJvamVjdCc7XG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSBjb21tYW5kID0gJyRlei1uZXctcHJvamVjdCc7XG4gIGNvbnNvbGUubG9nKGBcbiAgJHtncmVlbn1Eb25lISR7cmVzZXR9IE9wZW4gYSBibGFuayBkaXJlY3RvcnkgaW4gJHtwcm9ncmFtfSBhbmQgcnVuICR7Y3lhbn0ke2NvbW1hbmR9JHtyZXNldH0uXG5cbiAgJHtjeWFufUpvaW4gdGhlIGNvbW11bml0eToke3Jlc2V0fSBodHRwczovL2Rpc2NvcmQuZ2cvZXotYWdlbnRzXG5gKTtcbn1cblxuLyoqXG4gKiBIYW5kbGUgc3RhdHVzbGluZSBjb25maWd1cmF0aW9uIHdpdGggb3B0aW9uYWwgcHJvbXB0XG4gKi9cbmZ1bmN0aW9uIGhhbmRsZVN0YXR1c2xpbmUoc2V0dGluZ3MsIGlzSW50ZXJhY3RpdmUsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGhhc0V4aXN0aW5nID0gc2V0dGluZ3Muc3RhdHVzTGluZSAhPSBudWxsO1xuXG4gIGlmICghaGFzRXhpc3RpbmcpIHtcbiAgICBjYWxsYmFjayh0cnVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZm9yY2VTdGF0dXNsaW5lKSB7XG4gICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFpc0ludGVyYWN0aXZlKSB7XG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gU2tpcHBpbmcgc3RhdHVzbGluZSAoYWxyZWFkeSBjb25maWd1cmVkKWApO1xuICAgIGNvbnNvbGUubG9nKGAgICAgVXNlICR7Y3lhbn0tLWZvcmNlLXN0YXR1c2xpbmUke3Jlc2V0fSB0byByZXBsYWNlXFxuYCk7XG4gICAgY2FsbGJhY2soZmFsc2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nQ21kID0gc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kIHx8IHNldHRpbmdzLnN0YXR1c0xpbmUudXJsIHx8ICcoY3VzdG9tKSc7XG5cbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXRcbiAgfSk7XG5cbiAgY29uc29sZS5sb2coYFxuICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBFeGlzdGluZyBzdGF0dXNsaW5lIGRldGVjdGVkXFxuXG4gIFlvdXIgY3VycmVudCBzdGF0dXNsaW5lOlxuICAgICR7ZGltfWNvbW1hbmQ6ICR7ZXhpc3RpbmdDbWR9JHtyZXNldH1cblxuICBFWl9BZ2VudHMgaW5jbHVkZXMgYSBzdGF0dXNsaW5lIHNob3dpbmc6XG4gICAgXHUyMDIyIE1vZGVsIG5hbWVcbiAgICBcdTIwMjIgQ3VycmVudCB0YXNrIChmcm9tIHRvZG8gbGlzdClcbiAgICBcdTIwMjIgQ29udGV4dCB3aW5kb3cgdXNhZ2UgKGNvbG9yLWNvZGVkKVxuXG4gICR7Y3lhbn0xJHtyZXNldH0pIEtlZXAgZXhpc3RpbmdcbiAgJHtjeWFufTIke3Jlc2V0fSkgUmVwbGFjZSB3aXRoIEVaX0FnZW50cyBzdGF0dXNsaW5lXG5gKTtcblxuICBybC5xdWVzdGlvbihgICBDaG9pY2UgJHtkaW19WzFdJHtyZXNldH06IGAsIChhbnN3ZXIpID0+IHtcbiAgICBybC5jbG9zZSgpO1xuICAgIGNvbnN0IGNob2ljZSA9IGFuc3dlci50cmltKCkgfHwgJzEnO1xuICAgIGNhbGxiYWNrKGNob2ljZSA9PT0gJzInKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUHJvbXB0IGZvciBydW50aW1lIHNlbGVjdGlvblxuICovXG5mdW5jdGlvbiBwcm9tcHRSdW50aW1lKGNhbGxiYWNrKSB7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0XG4gIH0pO1xuXG4gIGxldCBhbnN3ZXJlZCA9IGZhbHNlO1xuXG4gIHJsLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBpZiAoIWFuc3dlcmVkKSB7XG4gICAgICBhbnN3ZXJlZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmxvZyhgXFxuICAke3llbGxvd31JbnN0YWxsYXRpb24gY2FuY2VsbGVkJHtyZXNldH1cXG5gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnNvbGUubG9nKGAgICR7eWVsbG93fVdoaWNoIHJ1bnRpbWUocykgd291bGQgeW91IGxpa2UgdG8gaW5zdGFsbCBmb3I/JHtyZXNldH1cXG5cXG4gICR7Y3lhbn0xJHtyZXNldH0pIENsYXVkZSBDb2RlICR7ZGltfSh+Ly5jbGF1ZGUpJHtyZXNldH1cbiAgJHtjeWFufTIke3Jlc2V0fSkgT3BlbkNvZGUgICAgJHtkaW19KH4vLmNvbmZpZy9vcGVuY29kZSkke3Jlc2V0fSAtIG9wZW4gc291cmNlLCBmcmVlIG1vZGVsc1xuICAke2N5YW59MyR7cmVzZXR9KSBHZW1pbmkgICAgICAke2RpbX0ofi8uZ2VtaW5pKSR7cmVzZXR9XG4gICR7Y3lhbn00JHtyZXNldH0pIENvZGV4ICAgICAgICR7ZGltfSh+Ly5jb2RleCkke3Jlc2V0fVxuICAke2N5YW59NSR7cmVzZXR9KSBDb3BpbG90ICAgICAke2RpbX0ofi8uY29waWxvdCkke3Jlc2V0fVxuICAke2N5YW59NiR7cmVzZXR9KSBRd2VuIENvZGUgICAke2RpbX0ofi8ucXdlbikke3Jlc2V0fSAtIEFsaWJhYmEgUXdlbiBvZmZpY2lhbCBDTElcbiAgJHtjeWFufTcke3Jlc2V0fSkgS2ltaSBDb2RlICAgJHtkaW19KH4vLmtpbWkpJHtyZXNldH0gLSBNb29uc2hvdCBLaW1pIG9mZmljaWFsIENMSVxuICAke2N5YW59OCR7cmVzZXR9KSBBbGwgJHtkaW19KGFsbCA3IHJ1bnRpbWVzIGFib3ZlKSR7cmVzZXR9XG5cbiAgJHtkaW19Tm90ZTogT3BlbkFJIGFuZCBBbnRocm9waWMgYXJlIG1vZGVsIHByb3ZpZGVycyBjb25maWd1cmVkIHdpdGhpbiBlYWNoIHJ1bnRpbWUncyBzZXR0aW5ncyxcbiAgbm90IHNlcGFyYXRlIENMSSBydW50aW1lcy4gU2VlIFJFQURNRS5tZCBmb3IgbW9kZWwgY29uZmlndXJhdGlvbi4ke3Jlc2V0fVxuYCk7XG5cbiAgcmwucXVlc3Rpb24oYCAgQ2hvaWNlICR7ZGltfVsxXSR7cmVzZXR9OiBgLCAoYW5zd2VyKSA9PiB7XG4gICAgYW5zd2VyZWQgPSB0cnVlO1xuICAgIHJsLmNsb3NlKCk7XG4gICAgY29uc3QgY2hvaWNlID0gYW5zd2VyLnRyaW0oKSB8fCAnMSc7XG4gICAgaWYgKGNob2ljZSA9PT0gJzgnKSB7XG4gICAgICBjYWxsYmFjayhbJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCAnY29waWxvdCcsICdxd2VuJywgJ2tpbWknXSk7XG4gICAgfSBlbHNlIGlmIChjaG9pY2UgPT09ICc3Jykge1xuICAgICAgY2FsbGJhY2soWydraW1pJ10pO1xuICAgIH0gZWxzZSBpZiAoY2hvaWNlID09PSAnNicpIHtcbiAgICAgIGNhbGxiYWNrKFsncXdlbiddKTtcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzUnKSB7XG4gICAgICBjYWxsYmFjayhbJ2NvcGlsb3QnXSk7XG4gICAgfSBlbHNlIGlmIChjaG9pY2UgPT09ICc0Jykge1xuICAgICAgY2FsbGJhY2soWydjb2RleCddKTtcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzMnKSB7XG4gICAgICBjYWxsYmFjayhbJ2dlbWluaSddKTtcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzInKSB7XG4gICAgICBjYWxsYmFjayhbJ29wZW5jb2RlJ10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayhbJ2NsYXVkZSddKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFByb21wdCBmb3IgaW5zdGFsbCBsb2NhdGlvblxuICovXG5mdW5jdGlvbiBwcm9tcHRMb2NhdGlvbihydW50aW1lcykge1xuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31Ob24taW50ZXJhY3RpdmUgdGVybWluYWwgZGV0ZWN0ZWQsIGRlZmF1bHRpbmcgdG8gZ2xvYmFsIGluc3RhbGwke3Jlc2V0fVxcbmApO1xuICAgIGluc3RhbGxBbGxSdW50aW1lcyhydW50aW1lcywgdHJ1ZSwgZmFsc2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0XG4gIH0pO1xuXG4gIGxldCBhbnN3ZXJlZCA9IGZhbHNlO1xuXG4gIHJsLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBpZiAoIWFuc3dlcmVkKSB7XG4gICAgICBhbnN3ZXJlZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmxvZyhgXFxuICAke3llbGxvd31JbnN0YWxsYXRpb24gY2FuY2VsbGVkJHtyZXNldH1cXG5gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHBhdGhFeGFtcGxlcyA9IHJ1bnRpbWVzLm1hcChyID0+IHtcbiAgICBjb25zdCBnbG9iYWxQYXRoID0gZ2V0R2xvYmFsRGlyKHIsIGV4cGxpY2l0Q29uZmlnRGlyKTtcbiAgICByZXR1cm4gZ2xvYmFsUGF0aC5yZXBsYWNlKG9zLmhvbWVkaXIoKSwgJ34nKTtcbiAgfSkuam9pbignLCAnKTtcblxuICBjb25zdCBsb2NhbEV4YW1wbGVzID0gcnVudGltZXMubWFwKHIgPT4gYC4vJHtnZXREaXJOYW1lKHIpfWApLmpvaW4oJywgJyk7XG5cbiAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9V2hlcmUgd291bGQgeW91IGxpa2UgdG8gaW5zdGFsbD8ke3Jlc2V0fVxcblxcbiAgJHtjeWFufTEke3Jlc2V0fSkgR2xvYmFsICR7ZGltfSgke3BhdGhFeGFtcGxlc30pJHtyZXNldH0gLSBhdmFpbGFibGUgaW4gYWxsIHByb2plY3RzXG4gICR7Y3lhbn0yJHtyZXNldH0pIExvY2FsICAke2RpbX0oJHtsb2NhbEV4YW1wbGVzfSkke3Jlc2V0fSAtIHRoaXMgcHJvamVjdCBvbmx5XG5gKTtcblxuICBybC5xdWVzdGlvbihgICBDaG9pY2UgJHtkaW19WzFdJHtyZXNldH06IGAsIChhbnN3ZXIpID0+IHtcbiAgICBhbnN3ZXJlZCA9IHRydWU7XG4gICAgcmwuY2xvc2UoKTtcbiAgICBjb25zdCBjaG9pY2UgPSBhbnN3ZXIudHJpbSgpIHx8ICcxJztcbiAgICBjb25zdCBpc0dsb2JhbCA9IGNob2ljZSAhPT0gJzInO1xuICAgIGluc3RhbGxBbGxSdW50aW1lcyhydW50aW1lcywgaXNHbG9iYWwsIHRydWUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIEVaX0FnZW50cyBmb3IgYWxsIHNlbGVjdGVkIHJ1bnRpbWVzXG4gKi9cbmZ1bmN0aW9uIGluc3RhbGxBbGxSdW50aW1lcyhydW50aW1lczogc3RyaW5nW10sIGlzR2xvYmFsOiBib29sZWFuLCBpc0ludGVyYWN0aXZlOiBib29sZWFuKSB7XG4gIGNvbnN0IHJlc3VsdHM6IEFycmF5PHsgc2V0dGluZ3NQYXRoOiBzdHJpbmcgfCBudWxsOyBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsOyBzdGF0dXNsaW5lQ29tbWFuZDogc3RyaW5nIHwgbnVsbDsgcnVudGltZTogc3RyaW5nIH0+ID0gW107XG5cbiAgZm9yIChjb25zdCBydW50aW1lIG9mIHJ1bnRpbWVzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gaW5zdGFsbChpc0dsb2JhbCwgcnVudGltZSk7XG4gICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gIH1cblxuICBjb25zdCBzdGF0dXNsaW5lUnVudGltZXMgPSBbJ2NsYXVkZScsICdnZW1pbmknXTtcbiAgY29uc3Qgc3RhdHVzbGluZVJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcihyID0+IHN0YXR1c2xpbmVSdW50aW1lcy5pbmNsdWRlcyhyLnJ1bnRpbWUpKTtcblxuICAvLyBIYW5kbGUgc3RhdHVzbGluZSBwZXItcnVudGltZSB0byBhdm9pZCBjb25mbGljdHNcbiAgLy8gRWFjaCBydW50aW1lIHdpdGggc2V0dGluZ3MuanNvbiBnZXRzIGl0cyBvd24gc3RhdHVzbGluZSBwcm9tcHRcbiAgY29uc3QgZmluYWxpemVQZXJSdW50aW1lID0gKHJ1bnRpbWVSZXN1bHQ6IHsgc2V0dGluZ3NQYXRoOiBzdHJpbmcgfCBudWxsOyBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsOyBzdGF0dXNsaW5lQ29tbWFuZDogc3RyaW5nIHwgbnVsbDsgcnVudGltZTogc3RyaW5nIH0sIHNob3VsZEluc3RhbGxTdGF0dXNsaW5lOiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgdXNlU3RhdHVzbGluZSA9IHN0YXR1c2xpbmVSdW50aW1lcy5pbmNsdWRlcyhydW50aW1lUmVzdWx0LnJ1bnRpbWUpICYmIHNob3VsZEluc3RhbGxTdGF0dXNsaW5lO1xuICAgIGZpbmlzaEluc3RhbGwoXG4gICAgICBydW50aW1lUmVzdWx0LnNldHRpbmdzUGF0aCxcbiAgICAgIHJ1bnRpbWVSZXN1bHQuc2V0dGluZ3MsXG4gICAgICBydW50aW1lUmVzdWx0LnN0YXR1c2xpbmVDb21tYW5kLFxuICAgICAgdXNlU3RhdHVzbGluZSxcbiAgICAgIHJ1bnRpbWVSZXN1bHQucnVudGltZSxcbiAgICAgIGlzR2xvYmFsXG4gICAgKTtcbiAgfTtcblxuICBpZiAoc3RhdHVzbGluZVJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gTm8gcnVudGltZXMgc3VwcG9ydCBzdGF0dXNsaW5lIC0gZmluYWxpemUgYWxsIHdpdGhvdXQgc3RhdHVzbGluZVxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgIGZpbmFsaXplUGVyUnVudGltZShyZXN1bHQsIGZhbHNlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RhdHVzbGluZVJlc3VsdHMubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gU2luZ2xlIHJ1bnRpbWUgd2l0aCBzdGF0dXNsaW5lIHN1cHBvcnQgLSBwcm9tcHQgb25jZVxuICAgIGNvbnN0IHNpbmdsZVJlc3VsdCA9IHN0YXR1c2xpbmVSZXN1bHRzWzBdO1xuICAgIGlmIChzaW5nbGVSZXN1bHQpIHtcbiAgICAgIGhhbmRsZVN0YXR1c2xpbmUoc2luZ2xlUmVzdWx0LnNldHRpbmdzLCBpc0ludGVyYWN0aXZlLCAoc2hvdWxkSW5zdGFsbCkgPT4ge1xuICAgICAgICBmaW5hbGl6ZVBlclJ1bnRpbWUoc2luZ2xlUmVzdWx0LCBzaG91bGRJbnN0YWxsKTtcbiAgICAgICAgLy8gRmluYWxpemUgb3RoZXIgcnVudGltZXMgd2l0aG91dCBzdGF0dXNsaW5lXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICBpZiAoIXN0YXR1c2xpbmVSdW50aW1lcy5pbmNsdWRlcyhyZXN1bHQucnVudGltZSkpIHtcbiAgICAgICAgICAgIGZpbmFsaXplUGVyUnVudGltZShyZXN1bHQsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBNdWx0aXBsZSBydW50aW1lcyB3aXRoIHN0YXR1c2xpbmUgc3VwcG9ydCAtIHByb21wdCBmb3IgZWFjaFxuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICAgIGNvbnN0IHN0YXR1c2xpbmVDaG9pY2VzID0gbmV3IEFycmF5KHN0YXR1c2xpbmVSZXN1bHRzLmxlbmd0aCkuZmlsbChmYWxzZSk7XG5cbiAgICBjb25zdCBwcm9tcHROZXh0U3RhdHVzbGluZSA9ICgpID0+IHtcbiAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gc3RhdHVzbGluZVJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIEFsbCBzdGF0dXNsaW5lIHByb21wdHMgZG9uZSAtIGZpbmFsaXplIGFsbCBydW50aW1lc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzW2ldO1xuICAgICAgICAgIGlmICghcmVzdWx0KSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBzdGF0dXNsaW5lSW5kZXggPSBzdGF0dXNsaW5lUmVzdWx0cy5maW5kSW5kZXgociA9PiByLnJ1bnRpbWUgPT09IHJlc3VsdC5ydW50aW1lKTtcbiAgICAgICAgICBjb25zdCBzaG91bGRJbnN0YWxsID0gc3RhdHVzbGluZUluZGV4ICE9PSAtMSA/IHN0YXR1c2xpbmVDaG9pY2VzW3N0YXR1c2xpbmVJbmRleF0gOiBmYWxzZTtcbiAgICAgICAgICBmaW5hbGl6ZVBlclJ1bnRpbWUocmVzdWx0LCBzaG91bGRJbnN0YWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRSZXN1bHQgPSBzdGF0dXNsaW5lUmVzdWx0c1tjdXJyZW50SW5kZXhdO1xuICAgICAgaWYgKGN1cnJlbnRSZXN1bHQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFJ1bnRpbWVJbmRleCA9IGN1cnJlbnRJbmRleDtcbiAgICAgICAgaGFuZGxlU3RhdHVzbGluZShjdXJyZW50UmVzdWx0LnNldHRpbmdzLCBpc0ludGVyYWN0aXZlLCAoc2hvdWxkSW5zdGFsbCkgPT4ge1xuICAgICAgICAgIHN0YXR1c2xpbmVDaG9pY2VzW2N1cnJlbnRSdW50aW1lSW5kZXhdID0gc2hvdWxkSW5zdGFsbDtcbiAgICAgICAgICBjdXJyZW50SW5kZXgrKztcbiAgICAgICAgICBwcm9tcHROZXh0U3RhdHVzbGluZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvbXB0TmV4dFN0YXR1c2xpbmUoKTtcbiAgfVxufVxuXG4vLyBUZXN0LW9ubHkgZXhwb3J0cyBcdTIwMTQgc2tpcCBtYWluIGxvZ2ljIHdoZW4gbG9hZGVkIGFzIGEgbW9kdWxlIGZvciB0ZXN0aW5nXG5jb25zdCB0ZXN0RXhwb3J0cyA9IHtcbiAgICBnZXRDb2RleFNraWxsQWRhcHRlckhlYWRlcixcbiAgICBjb252ZXJ0Q2xhdWRlVG9HZW1pbmlBZ2VudCxcbiAgICBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvZGV4QWdlbnQsXG4gICAgZ2VuZXJhdGVDb2RleEFnZW50VG9tbCxcbiAgICBnZW5lcmF0ZUNvZGV4Q29uZmlnQmxvY2ssXG4gICAgc3RyaXBFekFnZW50c0Zyb21Db2RleENvbmZpZyxcbiAgICBtZXJnZUNvZGV4Q29uZmlnLFxuICAgIGluc3RhbGxDb2RleENvbmZpZyxcbiAgICBjb252ZXJ0Q2xhdWRlQ29tbWFuZFRvQ29kZXhTa2lsbCxcbiAgICBFWl9DT0RFWF9NQVJLRVIsXG4gICAgQ09ERVhfQUdFTlRfU0FOREJPWCxcbiAgICBnZXREaXJOYW1lLFxuICAgIGdldEdsb2JhbERpcixcbiAgICBnZXRDb25maWdEaXJGcm9tSG9tZSxcbiAgICBjbGF1ZGVUb0NvcGlsb3RUb29scyxcbiAgICBjb252ZXJ0Q29waWxvdFRvb2xOYW1lLFxuICAgIGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50LFxuICAgIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db3BpbG90U2tpbGwsXG4gICAgY29udmVydENsYXVkZUFnZW50VG9Db3BpbG90QWdlbnQsXG4gICAgY29weUNvbW1hbmRzQXNDb3BpbG90U2tpbGxzLFxuICAgIEVaX0NPUElMT1RfSU5TVFJVQ1RJT05TX01BUktFUixcbiAgICBFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19DTE9TRV9NQVJLRVIsXG4gICAgbWVyZ2VDb3BpbG90SW5zdHJ1Y3Rpb25zLFxuICAgIHN0cmlwRXpBZ2VudHNGcm9tQ29waWxvdEluc3RydWN0aW9ucyxcbiAgICB3cml0ZU1hbmlmZXN0LFxuICAgIHJlcG9ydExvY2FsUGF0Y2hlcyxcbiAgICBjb252ZXJ0Q2xhdWRlVG9Rd2VuU2tpbGwsXG4gICAgY29udmVydENsYXVkZVRvUXdlbkFnZW50LFxuICAgIGNvbnZlcnRDbGF1ZGVUb0tpbWlTa2lsbCxcbiAgICBjb252ZXJ0Q2xhdWRlVG9LaW1pQWdlbnQsXG4gIH07XG5cbi8vIE1haW4gbG9naWNcbmlmIChoYXNHbG9iYWwgJiYgaGFzTG9jYWwpIHtcbiAgY29uc29sZS5lcnJvcihgICAke3llbGxvd31DYW5ub3Qgc3BlY2lmeSBib3RoIC0tZ2xvYmFsIGFuZCAtLWxvY2FsJHtyZXNldH1gKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSBlbHNlIGlmIChleHBsaWNpdENvbmZpZ0RpciAmJiBoYXNMb2NhbCkge1xuICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fUNhbm5vdCB1c2UgLS1jb25maWctZGlyIHdpdGggLS1sb2NhbCR7cmVzZXR9YCk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0gZWxzZSBpZiAoaGFzVW5pbnN0YWxsKSB7XG4gIGlmICghaGFzR2xvYmFsICYmICFoYXNMb2NhbCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYCAgJHt5ZWxsb3d9LS11bmluc3RhbGwgcmVxdWlyZXMgLS1nbG9iYWwgb3IgLS1sb2NhbCR7cmVzZXR9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIGNvbnN0IHJ1bnRpbWVzID0gc2VsZWN0ZWRSdW50aW1lcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRSdW50aW1lcyA6IFsnY2xhdWRlJ107XG4gIGZvciAoY29uc3QgcnVudGltZSBvZiBydW50aW1lcykge1xuICAgIHVuaW5zdGFsbChoYXNHbG9iYWwsIHJ1bnRpbWUpO1xuICB9XG59IGVsc2UgaWYgKHNlbGVjdGVkUnVudGltZXMubGVuZ3RoID4gMCkge1xuICBpZiAoIWhhc0dsb2JhbCAmJiAhaGFzTG9jYWwpIHtcbiAgICBwcm9tcHRMb2NhdGlvbihzZWxlY3RlZFJ1bnRpbWVzKTtcbiAgfSBlbHNlIHtcbiAgICBpbnN0YWxsQWxsUnVudGltZXMoc2VsZWN0ZWRSdW50aW1lcywgaGFzR2xvYmFsLCBmYWxzZSk7XG4gIH1cbn0gZWxzZSBpZiAoaGFzR2xvYmFsIHx8IGhhc0xvY2FsKSB7XG4gIC8vIERlZmF1bHQgdG8gQ2xhdWRlIGlmIG5vIHJ1bnRpbWUgc3BlY2lmaWVkIGJ1dCBsb2NhdGlvbiBpc1xuICBpbnN0YWxsQWxsUnVudGltZXMoWydjbGF1ZGUnXSwgaGFzR2xvYmFsLCBmYWxzZSk7XG59IGVsc2Uge1xuICAvLyBJbnRlcmFjdGl2ZVxuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31Ob24taW50ZXJhY3RpdmUgdGVybWluYWwgZGV0ZWN0ZWQsIGRlZmF1bHRpbmcgdG8gQ2xhdWRlIENvZGUgZ2xvYmFsIGluc3RhbGwke3Jlc2V0fVxcbmApO1xuICAgIGluc3RhbGxBbGxSdW50aW1lcyhbJ2NsYXVkZSddLCB0cnVlLCBmYWxzZSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvbXB0UnVudGltZSgocnVudGltZXMpID0+IHtcbiAgICAgIHByb21wdExvY2F0aW9uKHJ1bnRpbWVzKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBFeHBvcnQgZm9yIHRlc3RpbmdcbmV4cG9ydCB7IHRlc3RFeHBvcnRzIH07XG4iLCAie1xuICBcIm5hbWVcIjogXCJAaG93bGlsL2V6LWFnZW50c1wiLFxuICBcInZlcnNpb25cIjogXCI1LjAuMlwiLFxuICBcImRlc2NyaXB0aW9uXCI6IFwiRVogQWdlbnRzIFx1MjAxNCBNZXRhLXByb21wdGluZyB3aXRoIG11bHRpLW1vZGVsIHN1cHBvcnQgKFF3ZW4sIEtpbWksIE9wZW5BSSlcIixcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwic2lkZUVmZmVjdHNcIjogZmFsc2UsXG4gIFwiYmluXCI6IHtcbiAgICBcImV6LWFnZW50c1wiOiBcImRpc3QvYmluL2luc3RhbGwuanNcIixcbiAgICBcImV6LWFnZW50cy11cGRhdGVcIjogXCJkaXN0L2Jpbi91cGRhdGUuanNcIlxuICB9LFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9mYWN0b3JpZXNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvZmFjdG9yaWVzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9mYWN0b3JpZXMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL3N0cmF0ZWdpZXNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvc3RyYXRlZ2llcy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvc3RyYXRlZ2llcy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vYWRhcHRlcnNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvYWRhcHRlcnMvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbGliL2FkYXB0ZXJzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9vYnNlcnZlclwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9vYnNlcnZlci9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvb2JzZXJ2ZXIvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2RlY29yYXRvcnNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvZGVjb3JhdG9ycy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvZGVjb3JhdG9ycy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vZmFjYWRlc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9mYWNhZGVzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9mYWNhZGVzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9jb21tYW5kc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9jb21tYW5kcy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvY29tbWFuZHMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL3NlcnZpY2VzXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL3NlcnZpY2VzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9zZXJ2aWNlcy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vcmVwb3NpdG9yaWVzXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL3JlcG9zaXRvcmllcy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvcmVwb3NpdG9yaWVzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9mcFwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9mcC9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvZnAvaW5kZXguanNcIlxuICAgIH1cbiAgfSxcbiAgXCJtYWluXCI6IFwiLi9kaXN0L2luZGV4LmpzXCIsXG4gIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImRpc3RcIixcbiAgICBcImNvbW1hbmRzXCIsXG4gICAgXCJlei1hZ2VudHNcIixcbiAgICBcImFnZW50c1wiLFxuICAgIFwiaG9va3MvZGlzdFwiLFxuICAgIFwic2NyaXB0c1wiXG4gIF0sXG4gIFwia2V5d29yZHNcIjogW1xuICAgIFwiY2xhdWRlXCIsXG4gICAgXCJjbGF1ZGUtY29kZVwiLFxuICAgIFwiYWlcIixcbiAgICBcIm1ldGEtcHJvbXB0aW5nXCIsXG4gICAgXCJjb250ZXh0LWVuZ2luZWVyaW5nXCIsXG4gICAgXCJzcGVjLWRyaXZlbi1kZXZlbG9wbWVudFwiLFxuICAgIFwiZ2VtaW5pXCIsXG4gICAgXCJnZW1pbmktY2xpXCIsXG4gICAgXCJjb2RleFwiLFxuICAgIFwiY29kZXgtY2xpXCIsXG4gICAgXCJlei1hZ2VudHNcIixcbiAgICBcImFnZW50LW9yY2hlc3RyYXRpb25cIlxuICBdLFxuICBcImF1dGhvclwiOiBcIlRcdTAwQzJDSEVTXCIsXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9ob3dsaWwvZXotYWdlbnRzLmdpdFwiXG4gIH0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vaG93bGlsL2V6LWFnZW50c1wiLFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2hvd2xpbC9lei1hZ2VudHMvaXNzdWVzXCJcbiAgfSxcbiAgXCJlbmdpbmVzXCI6IHtcbiAgICBcIm5vZGVcIjogXCI+PTE2LjcuMFwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB0eXBlcy9taWNyb21hdGNoXCI6IFwiNC4wLjBcIixcbiAgICBcIkB0eXBlcy9ub2RlXCI6IFwiMjAuMC4wXCIsXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpblwiOiBcIjguNTcuMlwiLFxuICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlclwiOiBcIjguNTcuMlwiLFxuICAgIFwiYzhcIjogXCIxMS4wLjBcIixcbiAgICBcImNvbXBsZXhpdHktcmVwb3J0XCI6IFwiMi4wLjAtYWxwaGFcIixcbiAgICBcImRlcGVuZGVuY3ktY3J1aXNlclwiOiBcIjE3LjMuOVwiLFxuICAgIFwiZXNsaW50XCI6IFwiOC41Ny4wXCIsXG4gICAgXCJlc2xpbnQtcGx1Z2luLWNvbXBsZXhpdHlcIjogXCIxLjAuMlwiLFxuICAgIFwiZXNsaW50LXBsdWdpbi1zb25hcmpzXCI6IFwiNC4wLjJcIixcbiAgICBcImVzbGludC1wbHVnaW4tdHNkb2NcIjogXCIwLjUuMlwiLFxuICAgIFwiZXhwZWN0LXR5cGVcIjogXCIxLjMuMFwiLFxuICAgIFwiZmFzdC1jaGVja1wiOiBcIjMuMC4wXCIsXG4gICAgXCJnbG9iXCI6IFwiMTMuMC42XCIsXG4gICAgXCJodXNreVwiOiBcIjkuMS43XCIsXG4gICAgXCJqcy15YW1sXCI6IFwiNC4xLjFcIixcbiAgICBcImpzY3BkXCI6IFwiNC4wLjhcIixcbiAgICBcImpzZG9jXCI6IFwiNC4wLjJcIixcbiAgICBcIms2XCI6IFwiMC4wLjBcIixcbiAgICBcImxpbnQtc3RhZ2VkXCI6IFwiMTUuNS4yXCIsXG4gICAgXCJtYWRnZVwiOiBcIjguMC4wXCIsXG4gICAgXCJtYXJrZG93bmxpbnRcIjogXCIwLjQwLjBcIixcbiAgICBcInRzLW1vcnBoXCI6IFwiMjcuMC4yXCIsXG4gICAgXCJ0cy1ub2RlXCI6IFwiMTAuOS4wXCIsXG4gICAgXCJ0cy1wcnVuZVwiOiBcIjAuMTAuM1wiLFxuICAgIFwidHN1cFwiOiBcIjguMC4wXCIsXG4gICAgXCJ0eXBlZG9jXCI6IFwiMC4yOC4xOFwiLFxuICAgIFwidHlwZWRvYy1wbHVnaW4tbWlzc2luZy1leHBvcnRzXCI6IFwiNC4xLjJcIixcbiAgICBcInR5cGVzY3JpcHRcIjogXCI1LjQuNVwiLFxuICAgIFwidml0ZXN0XCI6IFwiNC4xLjBcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwiYnVpbGRcIjogXCJ0c3VwXCIsXG4gICAgXCJidWlsZDp3YXRjaFwiOiBcInRzdXAgLS13YXRjaFwiLFxuICAgIFwidHlwZWNoZWNrXCI6IFwidHNjIC0tbm9FbWl0XCIsXG4gICAgXCJ0eXBlY2hlY2s6c3RyaWN0XCI6IFwidHNjIC0tbm9FbWl0IC0tc3RyaWN0XCIsXG4gICAgXCJkZXZcIjogXCJ0c3ggYmluL2luc3RhbGwudHNcIixcbiAgICBcImxpbnRcIjogXCJlc2xpbnQgLiAtLWV4dCAudHMgLS1tYXgtd2FybmluZ3M9MFwiLFxuICAgIFwibGludDpmaXhcIjogXCJlc2xpbnQgLiAtLWV4dCAudHMgLS1maXhcIixcbiAgICBcImJ1aWxkOmhvb2tzXCI6IFwibm9kZSBkaXN0L3NjcmlwdHMvYnVpbGQtaG9va3MuanNcIixcbiAgICBcInByZXB1Ymxpc2hPbmx5XCI6IFwibnBtIHJ1biBidWlsZCAmJiBucG0gcnVuIGJ1aWxkOmhvb2tzXCIsXG4gICAgXCJ0ZXN0XCI6IFwidHN4IHNjcmlwdHMvcnVuLXRlc3RzLnRzXCIsXG4gICAgXCJ0ZXN0OmNvdmVyYWdlXCI6IFwiYzggLS1jaGVjay1jb3ZlcmFnZSAtLWxpbmVzIDcwIC0tcmVwb3J0ZXIgdGV4dCAtLWluY2x1ZGUgJ2Jpbi9saWIvKiovKi50cycgLS1leGNsdWRlICd0ZXN0cy8qKicgLS1hbGwgdHN4IHNjcmlwdHMvcnVuLXRlc3RzLnRzXCIsXG4gICAgXCJ0ZXN0OmExMXlcIjogXCJub2RlIHRlc3RzL2FjY2Vzc2liaWxpdHkvcnVuLWExMXktdGVzdHMuY2pzXCIsXG4gICAgXCJ0ZXN0OnF3ZW46Y29kZVwiOiBcInNoIHRlc3RzL3N0YWdpbmcvcXdlbi1jb2RlLWJhdHRsZS1mdWxsLnNoXCIsXG4gICAgXCJ0ZXN0OnF3ZW46Y29kZTpzaW1wbGVcIjogXCJzaCB0ZXN0cy9zdGFnaW5nL3F3ZW4tY29kZS1zaW1wbGUtdGVzdC5zaFwiLFxuICAgIFwidGVzdDpxd2VuOmNvZGU6ZWRnZVwiOiBcInNoIHRlc3RzL3N0YWdpbmcvcXdlbi1jb2RlLWVkZ2UtY2FzZXMuc2hcIixcbiAgICBcInRlc3Q6ZG9ja2VyOnF3ZW46Y29kZVwiOiBcImRvY2tlci1jb21wb3NlIC1mIGRvY2tlci1jb21wb3NlLnN0YWdpbmcueW1sIHVwIC0tYnVpbGQgZXotYWdlbnRzLXF3ZW4tY29kZS1iYXR0bGVcIixcbiAgICBcInRlc3Q6ZG9ja2VyOnF3ZW46ZWRnZVwiOiBcImRvY2tlci1jb21wb3NlIC1mIGRvY2tlci1jb21wb3NlLnN0YWdpbmcueW1sIHVwIC0tYnVpbGQgZXotYWdlbnRzLXF3ZW4tY29kZS1lZGdlLWNhc2VzXCIsXG4gICAgXCJ0ZXN0OmRvY2tlcjphbGxcIjogXCJkb2NrZXItY29tcG9zZSAtZiBkb2NrZXItY29tcG9zZS5zdGFnaW5nLnltbCB1cCAtLWJ1aWxkIC0tYWJvcnQtb24tY29udGFpbmVyLWV4aXRcIixcbiAgICBcImluc3RhbGw6cHJvZHVjdGlvblwiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy9pbnN0YWxsLXByb2R1Y3Rpb24udHNcIixcbiAgICBcImluc3RhbGw6cHJvZHVjdGlvbjpsYXRlc3RcIjogXCJub2RlIC0tbG9hZGVyIHRzLW5vZGUvZXNtIHNjcmlwdHMvaW5zdGFsbC1wcm9kdWN0aW9uLnRzIGxhdGVzdFwiLFxuICAgIFwiaW5zdGFsbDpwcm9kdWN0aW9uOnY0XCI6IFwibm9kZSAtLWxvYWRlciB0cy1ub2RlL2VzbSBzY3JpcHRzL2luc3RhbGwtcHJvZHVjdGlvbi50cyA0LjAuMFwiLFxuICAgIFwidmFsaWRhdGU6dG9rZW5cIjogXCJub2RlIC0tbG9hZGVyIHRzLW5vZGUvZXNtIHNjcmlwdHMvdmFsaWRhdGUtdG9rZW4udHNcIixcbiAgICBcInNlY3VyaXR5OnNjYW5cIjogXCJucG0gYXVkaXQgLS1hdWRpdC1sZXZlbD1tb2RlcmF0ZVwiLFxuICAgIFwiZG9jczpnZW5lcmF0ZVwiOiBcImpzZG9jIC1jIGpzZG9jLmpzb24gLXIgYmluLyBlei1hZ2VudHMvYmluL2xpYi9cIixcbiAgICBcImRvY3M6YXBpXCI6IFwidHlwZWRvY1wiLFxuICAgIFwiYW5hbHl6ZTpkdXBsaWNhdGVzXCI6IFwianNjcGQgLS1jb25maWcgLmpzY3BkLmpzb25cIixcbiAgICBcImNoZWNrOmR1cGxpY2F0ZXNcIjogXCJqc2NwZCAtLWNvbmZpZyAuanNjcGQuanNvblwiLFxuICAgIFwiY2hlY2s6Y29tcGxleGl0eVwiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy9jaGVjay1jb21wbGV4aXR5LnRzXCIsXG4gICAgXCJjaGVjazp0c2RvY1wiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy9jaGVjay10c2RvYy1jb3ZlcmFnZS50c1wiLFxuICAgIFwidGVzdDpwYWNrYWdlXCI6IFwibm9kZSAtLWxvYWRlciB0cy1ub2RlL2VzbSBzY3JpcHRzL3Rlc3QtcGFja2FnZS1kb2NrZXIudHNcIixcbiAgICBcImNoZWNrOmNvdXBsaW5nXCI6IFwibWFkZ2UgLS1jaXJjdWxhciBiaW4vbGliL1wiLFxuICAgIFwiY2hlY2s6YWJzdHJhY3Rpb25zXCI6IFwidHMtcHJ1bmVcIixcbiAgICBcImNoZWNrOmFsbC1tZXRyaWNzXCI6IFwibnBtIHJ1biBsaW50ICYmIG5wbSBydW4gY2hlY2s6ZHVwbGljYXRlcyAmJiBucG0gcnVuIGNoZWNrOmNvdXBsaW5nXCIsXG4gICAgXCJwcmVwYXJlXCI6IFwiaHVza3lcIixcbiAgICBcImdhdGVzOmxvY2FsXCI6IFwibm9kZSBlei1hZ2VudHMvYmluL2xpYi9nYXRlLWV4ZWN1dG9yLmNqcyAtLWNpIC0tY2FjaGVcIixcbiAgICBcImdhdGVzOnN0YXR1c1wiOiBcIm5vZGUgZXotYWdlbnRzL2Jpbi9saWIvZ2F0ZS1leGVjdXRvci5janMgLS1zdGF0dXNcIixcbiAgICBcImdhdGVzOnN0YXRzXCI6IFwibm9kZSBlei1hZ2VudHMvYmluL2xpYi9nYXRlLWV4ZWN1dG9yLmNqcyAtLXN0YXRzXCIsXG4gICAgXCJkZXBzOmF1ZGl0XCI6IFwidHN4IGJpbi9kZXBlbmRlbmN5LWF1ZGl0LnRzXCIsXG4gICAgXCJkZXBzOmF1ZGl0Ompzb25cIjogXCJ0c3ggYmluL2RlcGVuZGVuY3ktYXVkaXQudHMgLS1qc29uXCIsXG4gICAgXCJkZXBzOmNoZWNrXCI6IFwidHN4IGJpbi9kZXBlbmRlbmN5LWF1ZGl0LnRzIC0tcXVpZXRcIlxuICB9LFxuICBcImxpbnQtc3RhZ2VkXCI6IHtcbiAgICBcIioudHNcIjogW1xuICAgICAgXCJub2RlIC0tdGVzdFwiXG4gICAgXSxcbiAgICBcIioubWRcIjogW1xuICAgICAgXCJ0c3ggc2NyaXB0cy9ydW4tdGVzdHMudHNcIlxuICAgIF1cbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwibWljcm9tYXRjaFwiOiBcIjQuMC41XCIsXG4gICAgXCJ0aWt0b2tlblwiOiBcIjEuMC4yMlwiLFxuICAgIFwiem9kXCI6IFwiNC4zLjZcIlxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUFFQSxZQUFZLFFBQVE7QUFDcEIsWUFBWSxVQUFVO0FBQ3RCLFlBQVksUUFBUTtBQUNwQixZQUFZLGNBQWM7QUFDMUIsWUFBWSxZQUFZO0FBQ3hCLFNBQVMscUJBQXFCOzs7QUNQOUI7QUFBQSxFQUNFLE1BQVE7QUFBQSxFQUNSLFNBQVc7QUFBQSxFQUNYLGFBQWU7QUFBQSxFQUNmLE1BQVE7QUFBQSxFQUNSLGFBQWU7QUFBQSxFQUNmLEtBQU87QUFBQSxJQUNMLGFBQWE7QUFBQSxJQUNiLG9CQUFvQjtBQUFBLEVBQ3RCO0FBQUEsRUFD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LElBQU0sY0FBYztBQUFBLEVBQ2hCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUdGLElBQUksYUFBYSxVQUFVO0FBQ3pCLFVBQVEsTUFBTSxLQUFLLE1BQU0sMkNBQTJDLEtBQUssRUFBRTtBQUMzRSxVQUFRLEtBQUssQ0FBQztBQUNoQixXQUFXLHFCQUFxQixVQUFVO0FBQ3hDLFVBQVEsTUFBTSxLQUFLLE1BQU0sdUNBQXVDLEtBQUssRUFBRTtBQUN2RSxVQUFRLEtBQUssQ0FBQztBQUNoQixXQUFXLGNBQWM7QUFDdkIsTUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVO0FBQzNCLFlBQVEsTUFBTSxLQUFLLE1BQU0sMkNBQTJDLEtBQUssRUFBRTtBQUMzRSxZQUFRLEtBQUssQ0FBQztBQUFBLEVBQ2hCO0FBQ0EsUUFBTSxXQUFXLGlCQUFpQixTQUFTLElBQUksbUJBQW1CLENBQUMsUUFBUTtBQUMzRSxhQUFXLFdBQVcsVUFBVTtBQUM5QixjQUFVLFdBQVcsT0FBTztBQUFBLEVBQzlCO0FBQ0YsV0FBVyxpQkFBaUIsU0FBUyxHQUFHO0FBQ3RDLE1BQUksQ0FBQyxhQUFhLENBQUMsVUFBVTtBQUMzQixtQkFBZSxnQkFBZ0I7QUFBQSxFQUNqQyxPQUFPO0FBQ0wsdUJBQW1CLGtCQUFrQixXQUFXLEtBQUs7QUFBQSxFQUN2RDtBQUNGLFdBQVcsYUFBYSxVQUFVO0FBRWhDLHFCQUFtQixDQUFDLFFBQVEsR0FBRyxXQUFXLEtBQUs7QUFDakQsT0FBTztBQUVMLE1BQUksQ0FBQyxRQUFRLE1BQU0sT0FBTztBQUN4QixZQUFRLElBQUksS0FBSyxNQUFNLDhFQUE4RSxLQUFLO0FBQUEsQ0FBSTtBQUM5Ryx1QkFBbUIsQ0FBQyxRQUFRLEdBQUcsTUFBTSxLQUFLO0FBQUEsRUFDNUMsT0FBTztBQUNMLGtCQUFjLENBQUMsYUFBYTtBQUMxQixxQkFBZSxRQUFRO0FBQUEsSUFDekIsQ0FBQztBQUFBLEVBQ0g7QUFDRjsiLAogICJuYW1lcyI6IFsicnVudGltZUxhYmVsIiwgInNjYW5Gb3JMZWFrZWRQYXRocyJdCn0K