@howlil/ez-agents 5.0.4 → 5.0.5

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.4",
14
+ version: "5.0.5",
15
15
  description: "EZ Agents \u2014 Meta-prompting with multi-model support (Qwen, Kimi, OpenAI)",
16
16
  type: "module",
17
17
  sideEffects: false,
@@ -2744,4 +2744,4 @@ if (hasGlobal && hasLocal) {
2744
2744
  export {
2745
2745
  testExports
2746
2746
  };
2747
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vYmluL2luc3RhbGwudHMiLCAiLi4vLi4vcGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tICdyZWFkbGluZSc7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuXG4vLyBDb2xvcnNcbmNvbnN0IGN5YW4gPSAnXFx4MWJbMzZtJztcbmNvbnN0IGdyZWVuID0gJ1xceDFiWzMybSc7XG5jb25zdCB5ZWxsb3cgPSAnXFx4MWJbMzNtJztcbmNvbnN0IGRpbSA9ICdcXHgxYlsybSc7XG5jb25zdCByZXNldCA9ICdcXHgxYlswbSc7XG5cbi8vIENvZGV4IGNvbmZpZy50b21sIGNvbnN0YW50c1xuY29uc3QgRVpfQ09ERVhfTUFSS0VSID0gJyMgRVpfQWdlbnRzIEFnZW50IENvbmZpZ3VyYXRpb24gXFx1MjAxNCBtYW5hZ2VkIGJ5IGV6LWFnZW50cyBpbnN0YWxsZXInO1xuXG4vLyBDb3BpbG90IGluc3RydWN0aW9ucyBtYXJrZXIgY29uc3RhbnRzXG5jb25zdCBFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19NQVJLRVIgPSAnPCEtLSBFWl9BR0VOVFMgQ29uZmlndXJhdGlvbiBcXHUyMDE0IG1hbmFnZWQgYnkgZXotYWdlbnRzIGluc3RhbGxlciAtLT4nO1xuY29uc3QgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfQ0xPU0VfTUFSS0VSID0gJzwhLS0gL0VaX0FHRU5UUyBDb25maWd1cmF0aW9uIC0tPic7XG4vLyBMZWdhY3kgbWFya2VycyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgaW5zdGFsbHMuXG5jb25zdCBMRUdBQ1lfRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfTUFSS0VSID0gJzwhLS0gRVpfQWdlbnRzIENvbmZpZ3VyYXRpb24gXFx1MjAxNCBtYW5hZ2VkIGJ5IGV6LWFnZW50cyBpbnN0YWxsZXIgLS0+JztcbmNvbnN0IExFR0FDWV9FWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19DTE9TRV9NQVJLRVIgPSAnPCEtLSAvRVpfQWdlbnRzIENvbmZpZ3VyYXRpb24gLS0+JztcblxuY29uc3QgQ09ERVhfQUdFTlRfU0FOREJPWCA9IHtcbiAgJ2V6LWV4ZWN1dG9yJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1wbGFubmVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1waGFzZS1yZXNlYXJjaGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1wcm9qZWN0LXJlc2VhcmNoZXInOiAnd29ya3NwYWNlLXdyaXRlJyxcbiAgJ2V6LXJlc2VhcmNoLXN5bnRoZXNpemVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei12ZXJpZmllcic6ICd3b3Jrc3BhY2Utd3JpdGUnLFxuICAnZXotY29kZWJhc2UtbWFwcGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1yb2FkbWFwcGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1kZWJ1Z2dlcic6ICd3b3Jrc3BhY2Utd3JpdGUnLFxuICAnZXotcGxhbi1jaGVja2VyJzogJ3JlYWQtb25seScsXG4gICdlei1pbnRlZ3JhdGlvbi1jaGVja2VyJzogJ3JlYWQtb25seScsXG59O1xuXG4vLyBDb3BpbG90IHRvb2wgbmFtZSBtYXBwaW5nIFx1MjAxNCBDbGF1ZGUgQ29kZSB0b29scyB0byBHaXRIdWIgQ29waWxvdCB0b29sc1xuLy8gVG9vbCBtYXBwaW5nIGFwcGxpZXMgT05MWSB0byBhZ2VudHMsIE5PVCB0byBza2lsbHMgKHBlciBDT05URVhULm1kIGRlY2lzaW9uKVxuY29uc3QgY2xhdWRlVG9Db3BpbG90VG9vbHMgPSB7XG4gIFJlYWQ6ICdyZWFkJyxcbiAgV3JpdGU6ICdlZGl0JyxcbiAgRWRpdDogJ2VkaXQnLFxuICBCYXNoOiAnZXhlY3V0ZScsXG4gIEdyZXA6ICdzZWFyY2gnLFxuICBHbG9iOiAnc2VhcmNoJyxcbiAgVGFzazogJ2FnZW50JyxcbiAgV2ViU2VhcmNoOiAnd2ViJyxcbiAgV2ViRmV0Y2g6ICd3ZWInLFxuICBUb2RvV3JpdGU6ICd0b2RvJyxcbiAgQXNrVXNlclF1ZXN0aW9uOiAnYXNrX3VzZXInLFxuICBTbGFzaENvbW1hbmQ6ICdza2lsbCcsXG59O1xuXG4vLyBHZXQgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvblxuaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfTtcblxuLy8gUGFyc2UgYXJnc1xuY29uc3QgYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbmNvbnN0IGhhc0dsb2JhbCA9IGFyZ3MuaW5jbHVkZXMoJy0tZ2xvYmFsJykgfHwgYXJncy5pbmNsdWRlcygnLWcnKTtcbmNvbnN0IGhhc0xvY2FsID0gYXJncy5pbmNsdWRlcygnLS1sb2NhbCcpIHx8IGFyZ3MuaW5jbHVkZXMoJy1sJyk7XG5jb25zdCBoYXNPcGVuY29kZSA9IGFyZ3MuaW5jbHVkZXMoJy0tb3BlbmNvZGUnKTtcbmNvbnN0IGhhc0NsYXVkZSA9IGFyZ3MuaW5jbHVkZXMoJy0tY2xhdWRlJyk7XG5jb25zdCBoYXNHZW1pbmkgPSBhcmdzLmluY2x1ZGVzKCctLWdlbWluaScpO1xuY29uc3QgaGFzQ29kZXggPSBhcmdzLmluY2x1ZGVzKCctLWNvZGV4Jyk7XG5jb25zdCBoYXNDb3BpbG90ID0gYXJncy5pbmNsdWRlcygnLS1jb3BpbG90Jyk7XG5jb25zdCBoYXNRd2VuID0gYXJncy5pbmNsdWRlcygnLS1xd2VuJyk7XG5jb25zdCBoYXNLaW1pID0gYXJncy5pbmNsdWRlcygnLS1raW1pJyk7XG5jb25zdCBoYXNCb3RoID0gYXJncy5pbmNsdWRlcygnLS1ib3RoJyk7IC8vIExlZ2FjeSBmbGFnLCBrZWVwcyB3b3JraW5nXG5jb25zdCBoYXNBbGwgPSBhcmdzLmluY2x1ZGVzKCctLWFsbCcpO1xuY29uc3QgaGFzVW5pbnN0YWxsID0gYXJncy5pbmNsdWRlcygnLS11bmluc3RhbGwnKSB8fCBhcmdzLmluY2x1ZGVzKCctdScpO1xuXG4vLyBSdW50aW1lIHNlbGVjdGlvbiAtIGNhbiBiZSBzZXQgYnkgZmxhZ3Mgb3IgaW50ZXJhY3RpdmUgcHJvbXB0XG5sZXQgc2VsZWN0ZWRSdW50aW1lczogc3RyaW5nW10gPSBbXTtcbmlmIChoYXNBbGwpIHtcbiAgc2VsZWN0ZWRSdW50aW1lcyA9IFsnY2xhdWRlJywgJ29wZW5jb2RlJywgJ2dlbWluaScsICdjb2RleCcsICdjb3BpbG90JywgJ3F3ZW4nLCAna2ltaSddO1xufSBlbHNlIGlmIChoYXNCb3RoKSB7XG4gIHNlbGVjdGVkUnVudGltZXMgPSBbJ2NsYXVkZScsICdvcGVuY29kZSddO1xufSBlbHNlIHtcbiAgaWYgKGhhc09wZW5jb2RlKSBzZWxlY3RlZFJ1bnRpbWVzLnB1c2goJ29wZW5jb2RlJyk7XG4gIGlmIChoYXNDbGF1ZGUpIHNlbGVjdGVkUnVudGltZXMucHVzaCgnY2xhdWRlJyk7XG4gIGlmIChoYXNHZW1pbmkpIHNlbGVjdGVkUnVudGltZXMucHVzaCgnZ2VtaW5pJyk7XG4gIGlmIChoYXNDb2RleCkgc2VsZWN0ZWRSdW50aW1lcy5wdXNoKCdjb2RleCcpO1xuICBpZiAoaGFzQ29waWxvdCkgc2VsZWN0ZWRSdW50aW1lcy5wdXNoKCdjb3BpbG90Jyk7XG4gIGlmIChoYXNRd2VuKSBzZWxlY3RlZFJ1bnRpbWVzLnB1c2goJ3F3ZW4nKTtcbiAgaWYgKGhhc0tpbWkpIHNlbGVjdGVkUnVudGltZXMucHVzaCgna2ltaScpO1xufVxuXG4vLyBXU0wgKyBXaW5kb3dzIE5vZGUuanMgZGV0ZWN0aW9uXG4vLyBXaGVuIFdpbmRvd3MtbmF0aXZlIE5vZGUgcnVucyBvbiBXU0wsIG9zLmhvbWVkaXIoKSBhbmQgcGF0aC5qb2luKCkgcHJvZHVjZVxuLy8gYmFja3NsYXNoIHBhdGhzIHRoYXQgZG9uJ3QgcmVzb2x2ZSBjb3JyZWN0bHkgb24gdGhlIExpbnV4IGZpbGVzeXN0ZW0uXG5pZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICBsZXQgaXNXU0wgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuV1NMX0RJU1RST19OQU1FKSB7XG4gICAgICBpc1dTTCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChmcy5leGlzdHNTeW5jKCcvcHJvYy92ZXJzaW9uJykpIHtcbiAgICAgIGNvbnN0IHByb2NWZXJzaW9uID0gZnMucmVhZEZpbGVTeW5jKCcvcHJvYy92ZXJzaW9uJywgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHByb2NWZXJzaW9uLmluY2x1ZGVzKCdtaWNyb3NvZnQnKSB8fCBwcm9jVmVyc2lvbi5pbmNsdWRlcygnd3NsJykpIHtcbiAgICAgICAgaXNXU0wgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gSWdub3JlIHJlYWQgZXJyb3JzIFx1MjAxNCBub3QgV1NMXG4gIH1cblxuICBpZiAoaXNXU0wpIHtcbiAgICBjb25zb2xlLmVycm9yKGBcbiR7eWVsbG93fVx1MjZBMCBEZXRlY3RlZCBXU0wgd2l0aCBXaW5kb3dzLW5hdGl2ZSBOb2RlLmpzLiR7cmVzZXR9XG5cblRoaXMgY2F1c2VzIHBhdGggcmVzb2x1dGlvbiBpc3N1ZXMgdGhhdCBwcmV2ZW50IGNvcnJlY3QgaW5zdGFsbGF0aW9uLlxuUGxlYXNlIGluc3RhbGwgYSBMaW51eC1uYXRpdmUgTm9kZS5qcyBpbnNpZGUgV1NMOlxuXG4gIGN1cmwgLWZzU0wgaHR0cHM6Ly9mbm0udmVyY2VsLmFwcC9pbnN0YWxsIHwgYmFzaFxuICBmbm0gaW5zdGFsbCAtLWx0c1xuXG5UaGVuIHJlLXJ1bjogbnB4IGV6LWFnZW50c1xuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIHBhdGhQcmVmaXggKHdoaWNoIHVzZXMgYWJzb2x1dGUgcGF0aHMgZm9yIGdsb2JhbCBpbnN0YWxscykgdG8gYVxuICogJEhPTUUtcmVsYXRpdmUgZm9ybSBmb3IgcmVwbGFjaW5nICRIT01FLy5jbGF1ZGUvIHJlZmVyZW5jZXMgaW4gYmFzaCBjb2RlIGJsb2Nrcy5cbiAqIFByZXNlcnZlcyAkSE9NRSBhcyBhIHNoZWxsIHZhcmlhYmxlIHNvIHBhdGhzIHJlbWFpbiBwb3J0YWJsZSBhY3Jvc3MgbWFjaGluZXMuXG4gKi9cbmZ1bmN0aW9uIHRvSG9tZVByZWZpeChwYXRoUHJlZml4OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBob21lID0gb3MuaG9tZWRpcigpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGhQcmVmaXgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKGhvbWUpKSB7XG4gICAgcmV0dXJuICckSE9NRScgKyBub3JtYWxpemVkLnNsaWNlKGhvbWUubGVuZ3RoKTtcbiAgfVxuICAvLyBDb252ZXJ0IHRpbGRlLWJhc2VkIHBhdGhzIHRvICRIT01FLWJhc2VkIHBhdGhzIGZvciBiYXNoIGNvZGUgYmxvY2tzXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoJ34vJykpIHtcbiAgICByZXR1cm4gJyRIT01FJyArIG5vcm1hbGl6ZWQuc2xpY2UoMSk7XG4gIH1cbiAgLy8gRm9yIHJlbGF0aXZlIHBhdGhzIG9yIHBhdGhzIG5vdCB1bmRlciAkSE9NRSwgcmV0dXJuIGFzLWlzXG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vLyBIZWxwZXIgdG8gZ2V0IGRpcmVjdG9yeSBuYW1lIGZvciBhIHJ1bnRpbWUgKHVzZWQgZm9yIGxvY2FsL3Byb2plY3QgaW5zdGFsbHMpXG5mdW5jdGlvbiBnZXREaXJOYW1lKHJ1bnRpbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHJldHVybiAnLmdpdGh1Yic7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSByZXR1cm4gJy5vcGVuY29kZSc7XG4gIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykgcmV0dXJuICcuZ2VtaW5pJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb2RleCcpIHJldHVybiAnLmNvZGV4JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcmV0dXJuICcucXdlbic7XG4gIGlmIChydW50aW1lID09PSAna2ltaScpIHJldHVybiAnLmtpbWknO1xuICByZXR1cm4gJy5jbGF1ZGUnO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY29uZmlnIGRpcmVjdG9yeSBwYXRoIHJlbGF0aXZlIHRvIGhvbWUgZGlyZWN0b3J5IGZvciBhIHJ1bnRpbWVcbiAqIFVzZWQgZm9yIHRlbXBsYXRpbmcgaG9va3MgdGhhdCB1c2UgcGF0aC5qb2luKGhvbWVEaXIsICc8Y29uZmlnRGlyPicsIC4uLilcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCAnY29waWxvdCcsIG9yICdxd2VuJ1xuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXG4gKi9cbmZ1bmN0aW9uIGdldENvbmZpZ0RpckZyb21Ib21lKHJ1bnRpbWU6IHN0cmluZywgaXNHbG9iYWw6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoIWlzR2xvYmFsKSB7XG4gICAgLy8gTG9jYWwgaW5zdGFsbHMgdXNlIHRoZSBzYW1lIGRpciBuYW1lIHBhdHRlcm5cbiAgICByZXR1cm4gYCcke2dldERpck5hbWUocnVudGltZSl9J2A7XG4gIH1cbiAgLy8gR2xvYmFsIGluc3RhbGxzIC0gT3BlbkNvZGUgdXNlcyBYREcgcGF0aCBzdHJ1Y3R1cmVcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb3BpbG90JykgcmV0dXJuIFwiJy5jb3BpbG90J1wiO1xuICBpZiAocnVudGltZSA9PT0gJ29wZW5jb2RlJykge1xuICAgIC8vIE9wZW5Db2RlOiB+Ly5jb25maWcvb3BlbmNvZGUgLT4gJy5jb25maWcnLCAnb3BlbmNvZGUnXG4gICAgLy8gUmV0dXJuIGFzIGNvbW1hLXNlcGFyYXRlZCBmb3IgcGF0aC5qb2luKCkgcmVwbGFjZW1lbnRcbiAgICByZXR1cm4gXCInLmNvbmZpZycsICdvcGVuY29kZSdcIjtcbiAgfVxuICBpZiAocnVudGltZSA9PT0gJ2dlbWluaScpIHJldHVybiBcIicuZ2VtaW5pJ1wiO1xuICBpZiAocnVudGltZSA9PT0gJ2NvZGV4JykgcmV0dXJuIFwiJy5jb2RleCdcIjtcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcmV0dXJuIFwiJy5xd2VuJ1wiO1xuICBpZiAocnVudGltZSA9PT0gJ2tpbWknKSByZXR1cm4gXCInLmtpbWknXCI7XG4gIHJldHVybiBcIicuY2xhdWRlJ1wiO1xufVxuXG4vKipcbiAqIEdldCB0aGUgZ2xvYmFsIGNvbmZpZyBkaXJlY3RvcnkgZm9yIE9wZW5Db2RlXG4gKiBPcGVuQ29kZSBmb2xsb3dzIFhERyBCYXNlIERpcmVjdG9yeSBzcGVjIGFuZCB1c2VzIH4vLmNvbmZpZy9vcGVuY29kZS9cbiAqIFByaW9yaXR5OiBPUEVOQ09ERV9DT05GSUdfRElSID4gZGlybmFtZShPUEVOQ09ERV9DT05GSUcpID4gWERHX0NPTkZJR19IT01FL29wZW5jb2RlID4gfi8uY29uZmlnL29wZW5jb2RlXG4gKi9cbmZ1bmN0aW9uIGdldE9wZW5jb2RlR2xvYmFsRGlyKCkge1xuICAvLyAxLiBFeHBsaWNpdCBPUEVOQ09ERV9DT05GSUdfRElSIGVudiB2YXJcbiAgaWYgKHByb2Nlc3MuZW52Lk9QRU5DT0RFX0NPTkZJR19ESVIpIHtcbiAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuT1BFTkNPREVfQ09ORklHX0RJUik7XG4gIH1cbiAgXG4gIC8vIDIuIE9QRU5DT0RFX0NPTkZJRyBlbnYgdmFyICh1c2UgaXRzIGRpcmVjdG9yeSlcbiAgaWYgKHByb2Nlc3MuZW52Lk9QRU5DT0RFX0NPTkZJRykge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUoZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuT1BFTkNPREVfQ09ORklHKSk7XG4gIH1cbiAgXG4gIC8vIDMuIFhER19DT05GSUdfSE9NRS9vcGVuY29kZVxuICBpZiAocHJvY2Vzcy5lbnYuWERHX0NPTkZJR19IT01FKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihleHBhbmRUaWxkZShwcm9jZXNzLmVudi5YREdfQ09ORklHX0hPTUUpLCAnb3BlbmNvZGUnKTtcbiAgfVxuICBcbiAgLy8gNC4gRGVmYXVsdDogfi8uY29uZmlnL29wZW5jb2RlIChYREcgZGVmYXVsdClcbiAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29uZmlnJywgJ29wZW5jb2RlJyk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBnbG9iYWwgY29uZmlnIGRpcmVjdG9yeSBmb3IgYSBydW50aW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcnVudGltZSAtICdjbGF1ZGUnLCAnb3BlbmNvZGUnLCAnZ2VtaW5pJywgJ2NvZGV4Jywgb3IgJ2NvcGlsb3QnXG4gKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBleHBsaWNpdERpciAtIEV4cGxpY2l0IGRpcmVjdG9yeSBmcm9tIC0tY29uZmlnLWRpciBmbGFnXG4gKi9cbmZ1bmN0aW9uIGdldEdsb2JhbERpcihydW50aW1lOiBzdHJpbmcsIGV4cGxpY2l0RGlyOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHN0cmluZyB7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSB7XG4gICAgLy8gRm9yIE9wZW5Db2RlLCAtLWNvbmZpZy1kaXIgb3ZlcnJpZGVzIGVudiB2YXJzXG4gICAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUoZXhwbGljaXREaXIpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0T3BlbmNvZGVHbG9iYWxEaXIoKTtcbiAgfVxuICBcbiAgaWYgKHJ1bnRpbWUgPT09ICdnZW1pbmknKSB7XG4gICAgLy8gR2VtaW5pOiAtLWNvbmZpZy1kaXIgPiBHRU1JTklfQ09ORklHX0RJUiA+IH4vLmdlbWluaVxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkdFTUlOSV9DT05GSUdfRElSKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuR0VNSU5JX0NPTkZJR19ESVIpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5nZW1pbmknKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSB7XG4gICAgLy8gQ29kZXg6IC0tY29uZmlnLWRpciA+IENPREVYX0hPTUUgPiB+Ly5jb2RleFxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkNPREVYX0hPTUUpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShwcm9jZXNzLmVudi5DT0RFWF9IT01FKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29kZXgnKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHtcbiAgICAvLyBDb3BpbG90OiAtLWNvbmZpZy1kaXIgPiBDT1BJTE9UX0NPTkZJR19ESVIgPiB+Ly5jb3BpbG90XG4gICAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUoZXhwbGljaXREaXIpO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuQ09QSUxPVF9DT05GSUdfRElSKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuQ09QSUxPVF9DT05GSUdfRElSKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29waWxvdCcpO1xuICB9XG5cbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykge1xuICAgIC8vIFF3ZW4gQ29kZTogLS1jb25maWctZGlyID4gUVdFTl9DT05GSUdfRElSID4gfi8ucXdlblxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LlFXRU5fQ09ORklHX0RJUikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKHByb2Nlc3MuZW52LlFXRU5fQ09ORklHX0RJUik7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLnF3ZW4nKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAna2ltaScpIHtcbiAgICAvLyBLaW1pIENvZGU6IC0tY29uZmlnLWRpciA+IEtJTUlfQ09ORklHX0RJUiA+IH4vLmtpbWlcbiAgICBpZiAoZXhwbGljaXREaXIpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShleHBsaWNpdERpcik7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5LSU1JX0NPTkZJR19ESVIpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShwcm9jZXNzLmVudi5LSU1JX0NPTkZJR19ESVIpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5raW1pJyk7XG4gIH1cblxuICAvLyBDbGF1ZGUgQ29kZTogLS1jb25maWctZGlyID4gQ0xBVURFX0NPTkZJR19ESVIgPiB+Ly5jbGF1ZGVcbiAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuQ0xBVURFX0NPTkZJR19ESVIpIHtcbiAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuQ0xBVURFX0NPTkZJR19ESVIpO1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNsYXVkZScpO1xufVxuXG5jb25zdCBiYW5uZXIgPSAnXFxuJyArXG4gIGN5YW4gKyAnICBcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1NTdcdTI1ODhcdTI1ODhcdTI1NTcgIFx1MjU4OFx1MjU4OFx1MjU1N1xcbicgK1xuICAnICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NURcdTI1NUFcdTI1ODhcdTI1ODhcdTI1NTdcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NURcXG4nICtcbiAgJyAgXHUyNTg4XHUyNTg4XHUyNTg4XHUyNTg4XHUyNTg4XHUyNTU3ICAgXHUyNTVBXHUyNTg4XHUyNTg4XHUyNTg4XHUyNTU0XHUyNTVEIFxcbicgK1xuICAnICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NTBcdTI1NTBcdTI1NUQgICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1ODhcdTI1ODhcdTI1NTcgXFxuJyArXG4gICcgIFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU1N1x1MjU4OFx1MjU4OFx1MjU1NFx1MjU1RFx1MjU1QVx1MjU4OFx1MjU4OFx1MjU1N1xcbicgK1xuICAnICBcdTI1NUFcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NURcdTI1NUFcdTI1NTBcdTI1NUQgXHUyNTVBXHUyNTUwXHUyNTVEJyArIHJlc2V0ICsgJ1xcbicgK1xuICAnXFxuJyArXG4gICcgIEVaX0FnZW50cyAnICsgZGltICsgJ3YnICsgcGtnLnZlcnNpb24gKyByZXNldCArICdcXG4nICtcbiAgJyAgTXVsdGktTW9kZWwgRWRpdGlvbicgKyByZXNldCArICdcXG4nICtcbiAgJyAgQSBtZXRhLXByb21wdGluZywgY29udGV4dCBlbmdpbmVlcmluZyBhbmQgc3BlYy1kcml2ZW5cXG4nICtcbiAgJyAgZGV2ZWxvcG1lbnQgc3lzdGVtIGZvciBDbGF1ZGUgQ29kZSwgT3BlbkNvZGUsIEdlbWluaSwgQ29kZXgsIENvcGlsb3QsXFxuJyArXG4gICcgIFF3ZW4gQ29kZSwgS2ltaSBDb2RlLCB3aXRoIG11bHRpLW1vZGVsIHN1cHBvcnQuXFxuJyArXG4gICcgIE9yaWdpbmFsIGJ5IFRcdTAwQzJDSEVTIHwgTXVsdGktTW9kZWwgRm9yayBieSBAaG93bGlsLlxcbic7XG5cblxuLy8gUGFyc2UgLS1jb25maWctZGlyIGFyZ3VtZW50XG5mdW5jdGlvbiBwYXJzZUNvbmZpZ0RpckFyZygpIHtcbiAgY29uc3QgY29uZmlnRGlySW5kZXggPSBhcmdzLmZpbmRJbmRleChhcmcgPT4gYXJnID09PSAnLS1jb25maWctZGlyJyB8fCBhcmcgPT09ICctYycpO1xuICBpZiAoY29uZmlnRGlySW5kZXggIT09IC0xKSB7XG4gICAgY29uc3QgbmV4dEFyZyA9IGFyZ3NbY29uZmlnRGlySW5kZXggKyAxXTtcbiAgICAvLyBFcnJvciBpZiAtLWNvbmZpZy1kaXIgaXMgcHJvdmlkZWQgd2l0aG91dCBhIHZhbHVlIG9yIG5leHQgYXJnIGlzIGFub3RoZXIgZmxhZ1xuICAgIGlmICghbmV4dEFyZyB8fCBuZXh0QXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd30tLWNvbmZpZy1kaXIgcmVxdWlyZXMgYSBwYXRoIGFyZ3VtZW50JHtyZXNldH1gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRBcmc7XG4gIH1cbiAgLy8gQWxzbyBoYW5kbGUgLS1jb25maWctZGlyPXZhbHVlIGZvcm1hdFxuICBjb25zdCBjb25maWdEaXJBcmcgPSBhcmdzLmZpbmQoYXJnID0+IGFyZy5zdGFydHNXaXRoKCctLWNvbmZpZy1kaXI9JykgfHwgYXJnLnN0YXJ0c1dpdGgoJy1jPScpKTtcbiAgaWYgKGNvbmZpZ0RpckFyZykge1xuICAgIGNvbnN0IHZhbHVlID0gY29uZmlnRGlyQXJnLnNwbGl0KCc9JylbMV07XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd30tLWNvbmZpZy1kaXIgcmVxdWlyZXMgYSBub24tZW1wdHkgcGF0aCR7cmVzZXR9YCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmNvbnN0IGV4cGxpY2l0Q29uZmlnRGlyID0gcGFyc2VDb25maWdEaXJBcmcoKTtcbmNvbnN0IGhhc0hlbHAgPSBhcmdzLmluY2x1ZGVzKCctLWhlbHAnKSB8fCBhcmdzLmluY2x1ZGVzKCctaCcpO1xuY29uc3QgaGFzVmVyc2lvbiA9IGFyZ3MuaW5jbHVkZXMoJy0tdmVyc2lvbicpIHx8IGFyZ3MuaW5jbHVkZXMoJy12Jyk7XG5jb25zdCBmb3JjZVN0YXR1c2xpbmUgPSBhcmdzLmluY2x1ZGVzKCctLWZvcmNlLXN0YXR1c2xpbmUnKTtcblxuLy8gU2hvdyB2ZXJzaW9uIGlmIHJlcXVlc3RlZCAoc2tpcCBiYW5uZXIsIGp1c3Qgb3V0cHV0IHZlcnNpb24pXG5pZiAoaGFzVmVyc2lvbikge1xuICBjb25zb2xlLmxvZyhwa2cudmVyc2lvbik7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuY29uc29sZS5sb2coYmFubmVyKTtcblxuaWYgKGhhc1VuaW5zdGFsbCkge1xuICBjb25zb2xlLmxvZygnICBNb2RlOiBVbmluc3RhbGxcXG4nKTtcbn1cblxuLy8gU2hvdyBoZWxwIGlmIHJlcXVlc3RlZFxuaWYgKGhhc0hlbHApIHtcbiAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9VXNhZ2U6JHtyZXNldH0gbnB4IGV6LWFnZW50cyBbb3B0aW9uc11cXG5cXG4gICR7eWVsbG93fU9wdGlvbnM6JHtyZXNldH1cXG4gICAgJHtjeWFufS1nLCAtLWdsb2JhbCR7cmVzZXR9ICAgICAgICAgICAgICBJbnN0YWxsIGdsb2JhbGx5ICh0byBjb25maWcgZGlyZWN0b3J5KVxcbiAgICAke2N5YW59LWwsIC0tbG9jYWwke3Jlc2V0fSAgICAgICAgICAgICAgIEluc3RhbGwgbG9jYWxseSAodG8gY3VycmVudCBkaXJlY3RvcnkpXFxuICAgICR7Y3lhbn0tLWNsYXVkZSR7cmVzZXR9ICAgICAgICAgICAgICAgICAgSW5zdGFsbCBmb3IgQ2xhdWRlIENvZGUgb25seVxcbiAgICAke2N5YW59LS1vcGVuY29kZSR7cmVzZXR9ICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIE9wZW5Db2RlIG9ubHlcXG4gICAgJHtjeWFufS0tZ2VtaW5pJHtyZXNldH0gICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBHZW1pbmkgb25seVxcbiAgICAke2N5YW59LS1jb2RleCR7cmVzZXR9ICAgICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIENvZGV4IG9ubHlcXG4gICAgJHtjeWFufS0tY29waWxvdCR7cmVzZXR9ICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBDb3BpbG90IG9ubHlcXG4gICAgJHtjeWFufS0tcXdlbiR7cmVzZXR9ICAgICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBRd2VuIENvZGUgb25seVxcbiAgICAke2N5YW59LS1raW1pJHtyZXNldH0gICAgICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIEtpbWkgQ29kZSBvbmx5XFxuICAgICR7Y3lhbn0tLWFsbCR7cmVzZXR9ICAgICAgICAgICAgICAgICAgICAgSW5zdGFsbCBmb3IgYWxsIHJ1bnRpbWVzXFxuICAgICR7Y3lhbn0tdSwgLS11bmluc3RhbGwke3Jlc2V0fSAgICAgICAgICAgVW5pbnN0YWxsIEVaX0FnZW50cyAocmVtb3ZlIGFsbCBFWl9BZ2VudHMgZmlsZXMpXFxuICAgICR7Y3lhbn0tYywgLS1jb25maWctZGlyIDxwYXRoPiR7cmVzZXR9ICAgU3BlY2lmeSBjdXN0b20gY29uZmlnIGRpcmVjdG9yeVxcbiAgICAke2N5YW59LXYsIC0tdmVyc2lvbiR7cmVzZXR9ICAgICAgICAgICAgIFNob3cgdmVyc2lvbiBudW1iZXJcXG4gICAgJHtjeWFufS1oLCAtLWhlbHAke3Jlc2V0fSAgICAgICAgICAgICAgICBTaG93IHRoaXMgaGVscCBtZXNzYWdlXFxuICAgICR7Y3lhbn0tLWZvcmNlLXN0YXR1c2xpbmUke3Jlc2V0fSAgICAgICAgUmVwbGFjZSBleGlzdGluZyBzdGF0dXNsaW5lIGNvbmZpZ1xcblxcbiAgJHt5ZWxsb3d9RXhhbXBsZXM6JHtyZXNldH1cXG4gICAgJHtkaW19IyBJbnRlcmFjdGl2ZSBpbnN0YWxsIChwcm9tcHRzIGZvciBydW50aW1lIGFuZCBsb2NhdGlvbikke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzXFxuXFxuICAgICR7ZGltfSMgSW5zdGFsbCBmb3IgQ2xhdWRlIENvZGUgZ2xvYmFsbHkke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzIC0tY2xhdWRlIC0tZ2xvYmFsXFxuXFxuICAgICR7ZGltfSMgSW5zdGFsbCBmb3IgUXdlbiBDb2RlIGdsb2JhbGx5JHtyZXNldH1cXG4gICAgbnB4IGV6LWFnZW50cyAtLXF3ZW4gLS1nbG9iYWxcXG5cXG4gICAgJHtkaW19IyBJbnN0YWxsIGZvciBLaW1pIENvZGUgZ2xvYmFsbHkke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzIC0ta2ltaSAtLWdsb2JhbFxcblxcbiAgICAke2RpbX0jIEluc3RhbGwgZm9yIGFsbCBydW50aW1lcyBnbG9iYWxseSR7cmVzZXR9XFxuICAgIG5weCBlei1hZ2VudHMgLS1hbGwgLS1nbG9iYWxcXG5cXG4gICAgJHtkaW19IyBVbmluc3RhbGwgRVpfQWdlbnRzIGdsb2JhbGx5JHtyZXNldH1cXG4gICAgbnB4IGV6LWFnZW50cyAtLWFsbCAtLWdsb2JhbCAtLXVuaW5zdGFsbFxcblxcbiAgICAke2RpbX0jIFNob3cgdmVyc2lvbiR7cmVzZXR9XFxuICAgIG5weCBlei1hZ2VudHMgLS12ZXJzaW9uXFxuXFxuICAke3llbGxvd31Ob3Rlczoke3Jlc2V0fVxcbiAgICBUaGUgLS1jb25maWctZGlyIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBjb25maWd1cmF0aW9ucy5cXG4gICAgSXQgdGFrZXMgcHJpb3JpdHkgb3ZlciBDTEFVREVfQ09ORklHX0RJUiAvIEdFTUlOSV9DT05GSUdfRElSIC8gQ09ERVhfSE9NRSAvIENPUElMT1RfQ09ORklHX0RJUiAvIFFXRU5fQ09ORklHX0RJUiAvIEtJTUlfQ09ORklHX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXFxuXFxuICAke3llbGxvd31Nb2RlbCBQcm92aWRlcnM6JHtyZXNldH1cXG4gICAgT3BlbkFJIGFuZCBBbnRocm9waWMgYXJlIG1vZGVsIHByb3ZpZGVycyBjb25maWd1cmVkIGluIHNldHRpbmdzLmpzb24sXFxuICAgIG5vdCBzZXBhcmF0ZSBDTEkgcnVudGltZXMuIFNlZSBSRUFETUUubWQgZm9yIG1vZGVsIGNvbmZpZ3VyYXRpb24uXFxuYCk7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuLyoqXG4gKiBFeHBhbmQgfiB0byBob21lIGRpcmVjdG9yeSAoc2hlbGwgZG9lc24ndCBleHBhbmQgaW4gZW52IHZhcnMgcGFzc2VkIHRvIG5vZGUpXG4gKi9cbmZ1bmN0aW9uIGV4cGFuZFRpbGRlKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aCAmJiBmaWxlUGF0aC5zdGFydHNXaXRoKCd+LycpKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksIGZpbGVQYXRoLnNsaWNlKDIpKTtcbiAgfVxuICByZXR1cm4gZmlsZVBhdGg7XG59XG5cbi8qKlxuICogQnVpbGQgYSBob29rIGNvbW1hbmQgcGF0aCB1c2luZyBmb3J3YXJkIHNsYXNoZXMgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhdGliaWxpdHkuXG4gKiBPbiBXaW5kb3dzLCAkSE9NRSBpcyBub3QgZXhwYW5kZWQgYnkgY21kLmV4ZS9Qb3dlclNoZWxsLCBzbyB3ZSB1c2UgdGhlIGFjdHVhbCBwYXRoLlxuICovXG5mdW5jdGlvbiBidWlsZEhvb2tDb21tYW5kKGNvbmZpZ0RpciwgaG9va05hbWUpIHtcbiAgLy8gVXNlIGZvcndhcmQgc2xhc2hlcyBmb3IgTm9kZS5qcyBjb21wYXRpYmlsaXR5IG9uIGFsbCBwbGF0Zm9ybXNcbiAgY29uc3QgaG9va3NQYXRoID0gY29uZmlnRGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKSArICcvaG9va3MvJyArIGhvb2tOYW1lO1xuICByZXR1cm4gYG5vZGUgXCIke2hvb2tzUGF0aH1cImA7XG59XG5cbi8qKlxuICogUmVhZCBhbmQgcGFyc2Ugc2V0dGluZ3MuanNvbiwgcmV0dXJuaW5nIGVtcHR5IG9iamVjdCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gKi9cbmZ1bmN0aW9uIHJlYWRTZXR0aW5ncyhzZXR0aW5nc1BhdGgpIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoc2V0dGluZ3NQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBXcml0ZSBzZXR0aW5ncy5qc29uIHdpdGggcHJvcGVyIGZvcm1hdHRpbmdcbiAqL1xuZnVuY3Rpb24gd3JpdGVTZXR0aW5ncyhzZXR0aW5nc1BhdGgsIHNldHRpbmdzKSB7XG4gIGZzLndyaXRlRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgbnVsbCwgMikgKyAnXFxuJyk7XG59XG5cbi8vIENhY2hlIGZvciBhdHRyaWJ1dGlvbiBzZXR0aW5ncyAocG9wdWxhdGVkIG9uY2UgcGVyIHJ1bnRpbWUgZHVyaW5nIGluc3RhbGwpXG5jb25zdCBhdHRyaWJ1dGlvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmc+KCk7XG5cbi8qKlxuICogR2V0IGNvbW1pdCBhdHRyaWJ1dGlvbiBzZXR0aW5nIGZvciBhIHJ1bnRpbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCBvciAnY29waWxvdCdcbiAqIEByZXR1cm5zIHtudWxsfHVuZGVmaW5lZHxzdHJpbmd9IG51bGwgPSByZW1vdmUsIHVuZGVmaW5lZCA9IGtlZXAgZGVmYXVsdCwgc3RyaW5nID0gY3VzdG9tXG4gKi9cbmZ1bmN0aW9uIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWU6IHN0cmluZyk6IG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcge1xuICAvLyBSZXR1cm4gY2FjaGVkIHZhbHVlIGlmIGF2YWlsYWJsZVxuICBpZiAoYXR0cmlidXRpb25DYWNoZS5oYXMocnVudGltZSkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRpb25DYWNoZS5nZXQocnVudGltZSk7XG4gIH1cblxuICBsZXQgcmVzdWx0OiBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nO1xuXG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVhZFNldHRpbmdzKHBhdGguam9pbihnZXRHbG9iYWxEaXIoJ29wZW5jb2RlJywgbnVsbCksICdvcGVuY29kZS5qc29uJykpO1xuICAgIHJlc3VsdCA9IGNvbmZpZy5kaXNhYmxlX2FpX2F0dHJpYnV0aW9uID09PSB0cnVlID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykge1xuICAgIC8vIEdlbWluaTogY2hlY2sgZ2VtaW5pIHNldHRpbmdzLmpzb24gZm9yIGF0dHJpYnV0aW9uIGNvbmZpZ1xuICAgIGNvbnN0IHNldHRpbmdzID0gcmVhZFNldHRpbmdzKHBhdGguam9pbihnZXRHbG9iYWxEaXIoJ2dlbWluaScsIGV4cGxpY2l0Q29uZmlnRGlyKSwgJ3NldHRpbmdzLmpzb24nKSk7XG4gICAgaWYgKCFzZXR0aW5ncy5hdHRyaWJ1dGlvbiB8fCBzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MuYXR0cmlidXRpb24uY29tbWl0ID09PSAnJykge1xuICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gc2V0dGluZ3MuYXR0cmlidXRpb24uY29tbWl0O1xuICAgIH1cbiAgfSBlbHNlIGlmIChydW50aW1lID09PSAnY2xhdWRlJykge1xuICAgIC8vIENsYXVkZSBDb2RlXG4gICAgY29uc3Qgc2V0dGluZ3MgPSByZWFkU2V0dGluZ3MocGF0aC5qb2luKGdldEdsb2JhbERpcignY2xhdWRlJywgZXhwbGljaXRDb25maWdEaXIpLCAnc2V0dGluZ3MuanNvbicpKTtcbiAgICBpZiAoIXNldHRpbmdzLmF0dHJpYnV0aW9uIHx8IHNldHRpbmdzLmF0dHJpYnV0aW9uLmNvbW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQgPT09ICcnKSB7XG4gICAgICByZXN1bHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIENvZGV4IGFuZCBDb3BpbG90IGN1cnJlbnRseSBoYXZlIG5vIGF0dHJpYnV0aW9uIHNldHRpbmcgZXF1aXZhbGVudFxuICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIENhY2hlIGFuZCByZXR1cm5cbiAgYXR0cmlidXRpb25DYWNoZS5zZXQocnVudGltZSwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIENvLUF1dGhvcmVkLUJ5IGxpbmVzIGJhc2VkIG9uIGF0dHJpYnV0aW9uIHNldHRpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gRmlsZSBjb250ZW50IHRvIHByb2Nlc3NcbiAqIEBwYXJhbSB7bnVsbHx1bmRlZmluZWR8c3RyaW5nfSBhdHRyaWJ1dGlvbiAtIG51bGw9cmVtb3ZlLCB1bmRlZmluZWQ9a2VlcCwgc3RyaW5nPXJlcGxhY2VcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFByb2Nlc3NlZCBjb250ZW50XG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50OiBzdHJpbmcsIGF0dHJpYnV0aW9uOiBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGF0dHJpYnV0aW9uID09PSBudWxsKSB7XG4gICAgLy8gUmVtb3ZlIENvLUF1dGhvcmVkLUJ5IGxpbmVzIGFuZCB0aGUgcHJlY2VkaW5nIGJsYW5rIGxpbmVcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKC8oXFxyP1xcbil7Mn1Dby1BdXRob3JlZC1CeTouKiQvZ2ltLCAnJyk7XG4gIH1cbiAgaWYgKGF0dHJpYnV0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICAvLyBSZXBsYWNlIHdpdGggY3VzdG9tIGF0dHJpYnV0aW9uIChlc2NhcGUgJCB0byBwcmV2ZW50IGJhY2tyZWZlcmVuY2UgaW5qZWN0aW9uKVxuICBjb25zdCBzYWZlQXR0cmlidXRpb24gPSBhdHRyaWJ1dGlvbi5yZXBsYWNlKC9cXCQvZywgJyQkJCQnKTtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSgvQ28tQXV0aG9yZWQtQnk6LiokL2dpbSwgYENvLUF1dGhvcmVkLUJ5OiAke3NhZmVBdHRyaWJ1dGlvbn1gKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IENsYXVkZSBDb2RlIGZyb250bWF0dGVyIHRvIG9wZW5jb2RlIGZvcm1hdFxuICogLSBDb252ZXJ0cyAnYWxsb3dlZC10b29sczonIGFycmF5IHRvICdwZXJtaXNzaW9uOicgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIE1hcmtkb3duIGZpbGUgY29udGVudCB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ29udGVudCB3aXRoIGNvbnZlcnRlZCBmcm9udG1hdHRlclxuICovXG4vLyBDb2xvciBuYW1lIHRvIGhleCBtYXBwaW5nIGZvciBvcGVuY29kZSBjb21wYXRpYmlsaXR5XG5jb25zdCBjb2xvck5hbWVUb0hleCA9IHtcbiAgY3lhbjogJyMwMEZGRkYnLFxuICByZWQ6ICcjRkYwMDAwJyxcbiAgZ3JlZW46ICcjMDBGRjAwJyxcbiAgYmx1ZTogJyMwMDAwRkYnLFxuICB5ZWxsb3c6ICcjRkZGRjAwJyxcbiAgbWFnZW50YTogJyNGRjAwRkYnLFxuICBvcmFuZ2U6ICcjRkZBNTAwJyxcbiAgcHVycGxlOiAnIzgwMDA4MCcsXG4gIHBpbms6ICcjRkZDMENCJyxcbiAgd2hpdGU6ICcjRkZGRkZGJyxcbiAgYmxhY2s6ICcjMDAwMDAwJyxcbiAgZ3JheTogJyM4MDgwODAnLFxuICBncmV5OiAnIzgwODA4MCcsXG59O1xuXG4vLyBUb29sIG5hbWUgbWFwcGluZyBmcm9tIENsYXVkZSBDb2RlIHRvIE9wZW5Db2RlXG4vLyBPcGVuQ29kZSB1c2VzIGxvd2VyY2FzZSB0b29sIG5hbWVzOyBzcGVjaWFsIG1hcHBpbmdzIGZvciByZW5hbWVkIHRvb2xzXG5jb25zdCBjbGF1ZGVUb09wZW5jb2RlVG9vbHMgPSB7XG4gIEFza1VzZXJRdWVzdGlvbjogJ3F1ZXN0aW9uJyxcbiAgU2xhc2hDb21tYW5kOiAnc2tpbGwnLFxuICBUb2RvV3JpdGU6ICd0b2Rvd3JpdGUnLFxuICBXZWJGZXRjaDogJ3dlYmZldGNoJyxcbiAgV2ViU2VhcmNoOiAnd2Vic2VhcmNoJywgIC8vIFBsdWdpbi9NQ1AgLSBrZWVwIGZvciBjb21wYXRpYmlsaXR5XG59O1xuXG4vLyBUb29sIG5hbWUgbWFwcGluZyBmcm9tIENsYXVkZSBDb2RlIHRvIEdlbWluaSBDTElcbi8vIEdlbWluaSBDTEkgdXNlcyBzbmFrZV9jYXNlIGJ1aWx0LWluIHRvb2wgbmFtZXNcbmNvbnN0IGNsYXVkZVRvR2VtaW5pVG9vbHMgPSB7XG4gIFJlYWQ6ICdyZWFkX2ZpbGUnLFxuICBXcml0ZTogJ3dyaXRlX2ZpbGUnLFxuICBFZGl0OiAncmVwbGFjZScsXG4gIEJhc2g6ICdydW5fc2hlbGxfY29tbWFuZCcsXG4gIEdsb2I6ICdnbG9iJyxcbiAgR3JlcDogJ3NlYXJjaF9maWxlX2NvbnRlbnQnLFxuICBXZWJTZWFyY2g6ICdnb29nbGVfd2ViX3NlYXJjaCcsXG4gIFdlYkZldGNoOiAnd2ViX2ZldGNoJyxcbiAgVG9kb1dyaXRlOiAnd3JpdGVfdG9kb3MnLFxuICBBc2tVc2VyUXVlc3Rpb246ICdhc2tfdXNlcicsXG59O1xuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gT3BlbkNvZGUgZm9ybWF0XG4gKiAtIEFwcGxpZXMgc3BlY2lhbCBtYXBwaW5ncyAoQXNrVXNlclF1ZXN0aW9uIC0+IHF1ZXN0aW9uLCBldGMuKVxuICogLSBDb252ZXJ0cyB0byBsb3dlcmNhc2UgKGV4Y2VwdCBNQ1AgdG9vbHMgd2hpY2gga2VlcCB0aGVpciBmb3JtYXQpXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRUb29sTmFtZShjbGF1ZGVUb29sKSB7XG4gIC8vIENoZWNrIGZvciBzcGVjaWFsIG1hcHBpbmcgZmlyc3RcbiAgaWYgKGNsYXVkZVRvT3BlbmNvZGVUb29sc1tjbGF1ZGVUb29sXSkge1xuICAgIHJldHVybiBjbGF1ZGVUb09wZW5jb2RlVG9vbHNbY2xhdWRlVG9vbF07XG4gIH1cbiAgLy8gTUNQIHRvb2xzIChtY3BfXyopIGtlZXAgdGhlaXIgZm9ybWF0XG4gIGlmIChjbGF1ZGVUb29sLnN0YXJ0c1dpdGgoJ21jcF9fJykpIHtcbiAgICByZXR1cm4gY2xhdWRlVG9vbDtcbiAgfVxuICAvLyBEZWZhdWx0OiBjb252ZXJ0IHRvIGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gR2VtaW5pIENMSSBmb3JtYXRcbiAqIC0gQXBwbGllcyBDbGF1ZGVcdTIxOTJHZW1pbmkgbWFwcGluZyAoUmVhZFx1MjE5MnJlYWRfZmlsZSwgQmFzaFx1MjE5MnJ1bl9zaGVsbF9jb21tYW5kLCBldGMuKVxuICogLSBGaWx0ZXJzIG91dCBNQ1AgdG9vbHMgKG1jcF9fKikgXHUyMDE0IHRoZXkgYXJlIGF1dG8tZGlzY292ZXJlZCBhdCBydW50aW1lIGluIEdlbWluaVxuICogLSBGaWx0ZXJzIG91dCBUYXNrIFx1MjAxNCBhZ2VudHMgYXJlIGF1dG8tcmVnaXN0ZXJlZCBhcyB0b29scyBpbiBHZW1pbmlcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH0gR2VtaW5pIHRvb2wgbmFtZSwgb3IgbnVsbCBpZiB0b29sIHNob3VsZCBiZSBleGNsdWRlZFxuICovXG5mdW5jdGlvbiBjb252ZXJ0R2VtaW5pVG9vbE5hbWUoY2xhdWRlVG9vbCkge1xuICAvLyBNQ1AgdG9vbHM6IGV4Y2x1ZGUgXHUyMDE0IGF1dG8tZGlzY292ZXJlZCBmcm9tIG1jcFNlcnZlcnMgY29uZmlnIGF0IHJ1bnRpbWVcbiAgaWYgKGNsYXVkZVRvb2wuc3RhcnRzV2l0aCgnbWNwX18nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIFRhc2s6IGV4Y2x1ZGUgXHUyMDE0IGFnZW50cyBhcmUgYXV0by1yZWdpc3RlcmVkIGFzIGNhbGxhYmxlIHRvb2xzXG4gIGlmIChjbGF1ZGVUb29sID09PSAnVGFzaycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBDaGVjayBmb3IgZXhwbGljaXQgbWFwcGluZ1xuICBpZiAoY2xhdWRlVG9HZW1pbmlUb29sc1tjbGF1ZGVUb29sXSkge1xuICAgIHJldHVybiBjbGF1ZGVUb0dlbWluaVRvb2xzW2NsYXVkZVRvb2xdO1xuICB9XG4gIC8vIERlZmF1bHQ6IGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gR2l0SHViIENvcGlsb3QgZm9ybWF0LlxuICogLSBBcHBsaWVzIGV4cGxpY2l0IG1hcHBpbmcgZnJvbSBjbGF1ZGVUb0NvcGlsb3RUb29sc1xuICogLSBIYW5kbGVzIG1jcF9fY29udGV4dDdfXyogcHJlZml4IFx1MjE5MiBpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8qXG4gKiAtIEZhbGxzIGJhY2sgdG8gbG93ZXJjYXNlIGZvciB1bmtub3duIHRvb2xzXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDb3BpbG90VG9vbE5hbWUoY2xhdWRlVG9vbCkge1xuICAvLyBtY3BfX2NvbnRleHQ3X18qIHdpbGRjYXJkIFx1MjE5MiBpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8qXG4gIGlmIChjbGF1ZGVUb29sLnN0YXJ0c1dpdGgoJ21jcF9fY29udGV4dDdfXycpKSB7XG4gICAgcmV0dXJuICdpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8nICsgY2xhdWRlVG9vbC5zbGljZSgnbWNwX19jb250ZXh0N19fJy5sZW5ndGgpO1xuICB9XG4gIC8vIENoZWNrIGV4cGxpY2l0IG1hcHBpbmdcbiAgaWYgKGNsYXVkZVRvQ29waWxvdFRvb2xzW2NsYXVkZVRvb2xdKSB7XG4gICAgcmV0dXJuIGNsYXVkZVRvQ29waWxvdFRvb2xzW2NsYXVkZVRvb2xdO1xuICB9XG4gIC8vIERlZmF1bHQ6IGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEFwcGx5IENvcGlsb3Qtc3BlY2lmaWMgY29udGVudCBjb252ZXJzaW9uIFx1MjAxNCBDT05WLTA2IChwYXRocykgKyBDT05WLTA3IChjb21tYW5kIG5hbWVzKS5cbiAqIFBhdGggbWFwcGluZ3MgZGVwZW5kIG9uIGluc3RhbGwgbW9kZTpcbiAqICAgR2xvYmFsOiB+Ly5jbGF1ZGUvIFx1MjE5MiB+Ly5jb3BpbG90LywgLi8uY2xhdWRlLyBcdTIxOTIgLi8uZ2l0aHViL1xuICogICBMb2NhbDogIH4vLmNsYXVkZS8gXHUyMTkyIC4vLmdpdGh1Yi8sIC4vLmNsYXVkZS8gXHUyMTkyIC4vLmdpdGh1Yi9cbiAqIEFwcGxpZWQgdG8gQUxMIENvcGlsb3QgY29udGVudCAoc2tpbGxzLCBhZ2VudHMsIGVuZ2luZSBmaWxlcykuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIFNvdXJjZSBjb250ZW50IHRvIGNvbnZlcnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzR2xvYmFsPWZhbHNlXSAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsID0gZmFsc2UpIHtcbiAgbGV0IGMgPSBjb250ZW50O1xuICAvLyBDT05WLTA2OiBQYXRoIHJlcGxhY2VtZW50IFx1MjAxNCBtb3N0IHNwZWNpZmljIGZpcnN0IHRvIGF2b2lkIHN1YnN0cmluZyBtYXRjaGVzXG4gIGlmIChpc0dsb2JhbCkge1xuICAgIGMgPSBjLnJlcGxhY2UoL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZywgJyRIT01FLy5jb3BpbG90LycpO1xuICAgIGMgPSBjLnJlcGxhY2UoL35cXC9cXC5jbGF1ZGVcXC8vZywgJ34vLmNvcGlsb3QvJyk7XG4gIH0gZWxzZSB7XG4gICAgYyA9IGMucmVwbGFjZSgvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nLCAnLmdpdGh1Yi8nKTtcbiAgICBjID0gYy5yZXBsYWNlKC9+XFwvXFwuY2xhdWRlXFwvL2csICcuZ2l0aHViLycpO1xuICB9XG4gIGMgPSBjLnJlcGxhY2UoL1xcLlxcL1xcLmNsYXVkZVxcLy9nLCAnLi8uZ2l0aHViLycpO1xuICBjID0gYy5yZXBsYWNlKC9cXC5jbGF1ZGVcXC8vZywgJy5naXRodWIvJyk7XG4gIC8vIENPTlYtMDc6IENvbW1hbmQgbmFtZSBjb252ZXJzaW9uIChhbGwgZXo6IHJlZmVyZW5jZXMgXHUyMTkyIGV6LSlcbiAgYyA9IGMucmVwbGFjZSgvZXo6L2csICdlei0nKTtcbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQ29udmVydCBhIENsYXVkZSBjb21tYW5kICgubWQpIHRvIGEgQ29waWxvdCBza2lsbCAoU0tJTEwubWQpLlxuICogVHJhbnNmb3JtcyBmcm9udG1hdHRlciBvbmx5IFx1MjAxNCBib2R5IHBhc3NlcyB0aHJvdWdoIHdpdGggQ09OVi0wNi8wNyBhcHBsaWVkLlxuICogU2tpbGxzIGtlZXAgb3JpZ2luYWwgdG9vbCBuYW1lcyAobm8gbWFwcGluZykgcGVyIENPTlRFWFQubWQgZGVjaXNpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db3BpbG90U2tpbGwoY29udGVudCwgc2tpbGxOYW1lLCBpc0dsb2JhbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsKTtcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb252ZXJ0ZWQpO1xuICBpZiAoIWZyb250bWF0dGVyKSByZXR1cm4gY29udmVydGVkO1xuXG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuICBjb25zdCBhcmd1bWVudEhpbnQgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2FyZ3VtZW50LWhpbnQnKTtcbiAgY29uc3QgYWdlbnQgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2FnZW50Jyk7XG5cbiAgLy8gQ09OVi0wMjogRXh0cmFjdCBhbGxvd2VkLXRvb2xzIFlBTUwgbXVsdGlsaW5lIGxpc3QgXHUyMTkyIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmdcbiAgY29uc3QgdG9vbHNNYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKC9eYWxsb3dlZC10b29sczpcXHMqXFxuKCg/OlxccystXFxzKy4rXFxuPykqKS9tKTtcbiAgbGV0IHRvb2xzTGluZSA9ICcnO1xuICBpZiAodG9vbHNNYXRjaCkge1xuICAgIGNvbnN0IHRvb2xzID0gdG9vbHNNYXRjaFsxXS5tYXRjaCgvXlxccystXFxzKyguKykvZ20pO1xuICAgIGlmICh0b29scykge1xuICAgICAgdG9vbHNMaW5lID0gdG9vbHMubWFwKHQgPT4gdC5yZXBsYWNlKC9eXFxzKy1cXHMrLywgJycpLnRyaW0oKSkuam9pbignLCAnKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWNvbnN0cnVjdCBmcm9udG1hdHRlciBpbiBDb3BpbG90IGZvcm1hdFxuICBsZXQgZm0gPSBgLS0tXFxubmFtZTogJHtza2lsbE5hbWV9XFxuZGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259XFxuYDtcbiAgaWYgKGFyZ3VtZW50SGludCkgZm0gKz0gYGFyZ3VtZW50LWhpbnQ6ICR7eWFtbFF1b3RlKGFyZ3VtZW50SGludCl9XFxuYDtcbiAgaWYgKGFnZW50KSBmbSArPSBgYWdlbnQ6ICR7YWdlbnR9XFxuYDtcbiAgaWYgKHRvb2xzTGluZSkgZm0gKz0gYGFsbG93ZWQtdG9vbHM6ICR7dG9vbHNMaW5lfVxcbmA7XG4gIGZtICs9ICctLS0nO1xuXG4gIHJldHVybiBgJHtmbX1cXG4ke2JvZHl9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgQ2xhdWRlIGFnZW50ICgubWQpIHRvIGEgQ29waWxvdCBhZ2VudCAoLmFnZW50Lm1kKS5cbiAqIEFwcGxpZXMgdG9vbCBtYXBwaW5nICsgZGVkdXBsaWNhdGlvbiwgZm9ybWF0cyB0b29scyBhcyBKU09OIGFycmF5LlxuICogQ09OVi0wNDogSlNPTiBhcnJheSBmb3JtYXQuIENPTlYtMDU6IFRvb2wgbmFtZSBtYXBwaW5nLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvcGlsb3RBZ2VudChjb250ZW50LCBpc0dsb2JhbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsKTtcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb252ZXJ0ZWQpO1xuICBpZiAoIWZyb250bWF0dGVyKSByZXR1cm4gY29udmVydGVkO1xuXG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ25hbWUnKSB8fCAndW5rbm93bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuICBjb25zdCBjb2xvciA9IGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCAnY29sb3InKTtcbiAgY29uc3QgdG9vbHNSYXcgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ3Rvb2xzJykgfHwgJyc7XG5cbiAgLy8gQ09OVi0wNCArIENPTlYtMDU6IE1hcCB0b29scywgZGVkdXBsaWNhdGUsIGZvcm1hdCBhcyBKU09OIGFycmF5XG4gIGNvbnN0IGNsYXVkZVRvb2xzID0gdG9vbHNSYXcuc3BsaXQoJywnKS5tYXAodCA9PiB0LnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBtYXBwZWRUb29scyA9IGNsYXVkZVRvb2xzLm1hcCh0ID0+IGNvbnZlcnRDb3BpbG90VG9vbE5hbWUodCkpO1xuICBjb25zdCB1bmlxdWVUb29scyA9IFsuLi5uZXcgU2V0KG1hcHBlZFRvb2xzKV07XG4gIGNvbnN0IHRvb2xzQXJyYXkgPSB1bmlxdWVUb29scy5sZW5ndGggPiAwXG4gICAgPyBcIlsnXCIgKyB1bmlxdWVUb29scy5qb2luKFwiJywgJ1wiKSArIFwiJ11cIlxuICAgIDogJ1tdJztcblxuICAvLyBSZWNvbnN0cnVjdCBmcm9udG1hdHRlciBpbiBDb3BpbG90IGZvcm1hdFxuICBsZXQgZm0gPSBgLS0tXFxubmFtZTogJHtuYW1lfVxcbmRlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufVxcbnRvb2xzOiAke3Rvb2xzQXJyYXl9XFxuYDtcbiAgaWYgKGNvbG9yKSBmbSArPSBgY29sb3I6ICR7Y29sb3J9XFxuYDtcbiAgZm0gKz0gJy0tLSc7XG5cbiAgcmV0dXJuIGAke2ZtfVxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiB0b1NpbmdsZUxpbmUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIHlhbWxRdW90ZSh2YWx1ZSkge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RnJvbnRtYXR0ZXJBbmRCb2R5KGNvbnRlbnQpIHtcbiAgaWYgKCFjb250ZW50LnN0YXJ0c1dpdGgoJy0tLScpKSB7XG4gICAgcmV0dXJuIHsgZnJvbnRtYXR0ZXI6IG51bGwsIGJvZHk6IGNvbnRlbnQgfTtcbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGNsb3NpbmcgLS0tIChjYW4gYmUgb24gc2FtZSBsaW5lIG9yIG5leHQgbGluZSlcbiAgLy8gSGFuZGxlIGJvdGggXCItLS1cXG4uLi5cXG4tLS1cIiBhbmQgXCItLS0uLi5cXG4tLS1cIiBmb3JtYXRzXG4gIGxldCBlbmRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZignXFxuLS0tJywgMyk7XG4gIGlmIChlbmRJbmRleCA9PT0gLTEpIHtcbiAgICAvLyBUcnkgZmluZGluZyAtLS0gd2l0aG91dCBuZXdsaW5lIChtYWxmb3JtZWQgZnJvbnRtYXR0ZXIpXG4gICAgZW5kSW5kZXggPSBjb250ZW50LmluZGV4T2YoJy0tLScsIDMpO1xuICB9XG4gIFxuICBpZiAoZW5kSW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIHsgZnJvbnRtYXR0ZXI6IG51bGwsIGJvZHk6IGNvbnRlbnQgfTtcbiAgfVxuXG4gIC8vIEV4dHJhY3QgZnJvbnRtYXR0ZXIgKHNraXAgaW5pdGlhbCAtLS0pIGFuZCBib2R5IChhZnRlciBjbG9zaW5nIC0tLSlcbiAgY29uc3QgZnJvbnRtYXR0ZXJFbmQgPSBjb250ZW50LmluZGV4T2YoJ1xcbicsIDMpO1xuICBjb25zdCBhY3R1YWxFbmQgPSBjb250ZW50LnN0YXJ0c1dpdGgoJy0tLVxcbicpID8gZW5kSW5kZXggOiBlbmRJbmRleCArIDM7XG4gIFxuICByZXR1cm4ge1xuICAgIGZyb250bWF0dGVyOiBjb250ZW50LnN1YnN0cmluZygzLCBlbmRJbmRleCkudHJpbSgpLFxuICAgIGJvZHk6IGNvbnRlbnQuc3Vic3RyaW5nKGFjdHVhbEVuZCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCBmaWVsZE5hbWUpIHtcbiAgLy8gVHJ5IHN0YW5kYXJkIG11bHRpbGluZSBmb3JtYXQgZmlyc3QgKGZpZWxkOiB2YWx1ZSBmb2xsb3dlZCBieSBuZXdsaW5lKVxuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF4ke2ZpZWxkTmFtZX06XFxcXHMqKC4rKSRgLCAnbScpO1xuICBsZXQgbWF0Y2ggPSBmcm9udG1hdHRlci5tYXRjaChyZWdleCk7XG4gIGlmIChtYXRjaCkge1xuICAgIHJldHVybiBtYXRjaFsxXS50cmltKCkucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJyk7XG4gIH1cbiAgXG4gIC8vIEhhbmRsZSBzaW5nbGUtbGluZSBtYWxmb3JtZWQgZnJvbnRtYXR0ZXIgKGZpZWxkOiB2YWx1ZSBmb2xsb3dlZCBieSBuZXh0IGZpZWxkIG9yIGVuZClcbiAgLy8gUGF0dGVybjogXCJmaWVsZE5hbWU6IHZhbHVlXCIgd2hlcmUgdmFsdWUgZW5kcyBhdCBuZXh0IGZpZWxkIG9yIGVuZCBvZiBzdHJpbmdcbiAgY29uc3Qgc2luZ2xlTGluZVJlZ2V4ID0gbmV3IFJlZ0V4cChgJHtmaWVsZE5hbWV9OlxcXFxzKihbXjpdKz8pKD86XFxcXHMrW2EtekEtWl9dKzp8JClgLCAnaScpO1xuICBtYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKHNpbmdsZUxpbmVSZWdleCk7XG4gIGlmIChtYXRjaCkge1xuICAgIHJldHVybiBtYXRjaFsxXS50cmltKCkucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJyk7XG4gIH1cbiAgXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0U2xhc2hDb21tYW5kc1RvQ29kZXhTa2lsbE1lbnRpb25zKGNvbnRlbnQpIHtcbiAgbGV0IGNvbnZlcnRlZCA9IGNvbnRlbnQucmVwbGFjZSgvXFwvZXo6KFthLXowLTktXSspL2dpLCAoXywgY29tbWFuZE5hbWUpID0+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+XFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnN0IGdsb2JhbENsYXVkZUhvbWVSZWdleCA9IC9cXCRIT01FXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZUhvbWVSZWdleCwgdG9Ib21lUHJlZml4KHBhdGhQcmVmaXgpKTtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShsb2NhbENsYXVkZVJlZ2V4LCBgLi8ke2Rpck5hbWV9L2ApO1xuICAgICAgfVxuICAgICAgY29udGVudCA9IHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50LCBnZXRDb21taXRBdHRyaWJ1dGlvbihydW50aW1lKSk7XG5cbiAgICAgIC8vIENvbnZlcnQgZnJvbnRtYXR0ZXIgZm9yIG9wZW5jb2RlIGNvbXBhdGliaWxpdHlcbiAgICAgIGlmIChpc09wZW5jb2RlKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9PcGVuY29kZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcbiAgICAgIH0gZWxzZSBpZiAocnVudGltZSA9PT0gJ2dlbWluaScpIHtcbiAgICAgICAgaWYgKGlzQ29tbWFuZCkge1xuICAgICAgICAgIC8vIENvbnZlcnQgdG8gVE9NTCBmb3IgR2VtaW5pIChzdHJpcCA8c3ViPiB0YWdzIFx1MjAxNCB0ZXJtaW5hbHMgY2FuJ3QgcmVuZGVyIHN1YnNjcmlwdClcbiAgICAgICAgICBjb250ZW50ID0gc3RyaXBTdWJUYWdzKGNvbnRlbnQpO1xuICAgICAgICAgIGNvbnN0IHRvbWxDb250ZW50ID0gY29udmVydENsYXVkZVRvR2VtaW5pVG9tbChjb250ZW50KTtcbiAgICAgICAgICAvLyBSZXBsYWNlIGV4dGVuc2lvbiB3aXRoIC50b21sXG4gICAgICAgICAgY29uc3QgdG9tbFBhdGggPSBkZXN0UGF0aC5yZXBsYWNlKC9cXC5tZCQvLCAnLnRvbWwnKTtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRvbWxQYXRoLCB0b21sQ29udGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb2RleCkge1xuICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29kZXhNYXJrZG93bihjb250ZW50KTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICB9IGVsc2UgaWYgKGlzQ29waWxvdCkge1xuICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQoY29udGVudCwgaXNHbG9iYWwpO1xuICAgICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQ29waWxvdCAmJiAoZW50cnkubmFtZS5lbmRzV2l0aCgnLmNqcycpIHx8IGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5qcycpKSkge1xuICAgICAgLy8gQ29waWxvdDogYWxzbyB0cmFuc2Zvcm0gLmNqcy8uanMgZmlsZXMgZm9yIENPTlYtMDYgYW5kIENPTlYtMDdcbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQoY29udGVudCwgaXNHbG9iYWwpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmNQYXRoLCBkZXN0UGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29weSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkgKHNpbXBsZSBjb3B5IHdpdGhvdXQgcGF0aCByZXBsYWNlbWVudClcbiAqL1xuZnVuY3Rpb24gY29weURpcmVjdG9yeVJlY3Vyc2l2ZShzcmNEaXI6IHN0cmluZywgZGVzdERpcjogc3RyaW5nKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhzcmNEaXIpKSByZXR1cm47XG4gIFxuICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoc3JjRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIFxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKHNyY0RpciwgZW50cnkubmFtZSk7XG4gICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdERpciwgZW50cnkubmFtZSk7XG4gICAgXG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGZzLm1rZGlyU3luYyhkZXN0UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBjb3B5RGlyZWN0b3J5UmVjdXJzaXZlKHNyY1BhdGgsIGRlc3RQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnMuY29weUZpbGVTeW5jKHNyY1BhdGgsIGRlc3RQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDbGVhbiB1cCBvcnBoYW5lZCBmaWxlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBPcnBoYW5lZEZpbGVzKGNvbmZpZ0Rpcikge1xuICBjb25zdCBvcnBoYW5lZEZpbGVzID0gW1xuICAgICdob29rcy9lei1ub3RpZnkuc2gnLCAgLy8gUmVtb3ZlZCBpbiB2MS42LnhcbiAgICAnaG9va3Mvc3RhdHVzbGluZS5qcycsICAvLyBSZW5hbWVkIHRvIGV6LXN0YXR1c2xpbmUuanMgaW4gdjEuOS4wXG4gIF07XG5cbiAgZm9yIChjb25zdCByZWxQYXRoIG9mIG9ycGhhbmVkRmlsZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIHJlbFBhdGgpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgICAgZnMudW5saW5rU3luYyhmdWxsUGF0aCk7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgb3JwaGFuZWQgJHtyZWxQYXRofWApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENsZWFuIHVwIG9ycGhhbmVkIGhvb2sgcmVnaXN0cmF0aW9ucyBmcm9tIHNldHRpbmdzLmpzb25cbiAqL1xuZnVuY3Rpb24gY2xlYW51cE9ycGhhbmVkSG9va3Moc2V0dGluZ3MpIHtcbiAgY29uc3Qgb3JwaGFuZWRIb29rUGF0dGVybnMgPSBbXG4gICAgJ2V6LW5vdGlmeS5zaCcsICAvLyBSZW1vdmVkIGluIHYxLjYueFxuICAgICdob29rcy9zdGF0dXNsaW5lLmpzJywgIC8vIFJlbmFtZWQgdG8gZXotc3RhdHVzbGluZS5qcyBpbiB2MS45LjBcbiAgICAnZXotaW50ZWwtaW5kZXguanMnLCAgLy8gUmVtb3ZlZCBpbiB2MS45LjJcbiAgICAnZXotaW50ZWwtc2Vzc2lvbi5qcycsICAvLyBSZW1vdmVkIGluIHYxLjkuMlxuICAgICdlei1pbnRlbC1wcnVuZS5qcycsICAvLyBSZW1vdmVkIGluIHYxLjkuMlxuICBdO1xuXG4gIGxldCBjbGVhbmVkSG9va3MgPSBmYWxzZTtcblxuICAvLyBDaGVjayBhbGwgaG9vayBldmVudCB0eXBlcyAoU3RvcCwgU2Vzc2lvblN0YXJ0LCBldGMuKVxuICBpZiAoc2V0dGluZ3MuaG9va3MpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50VHlwZSBvZiBPYmplY3Qua2V5cyhzZXR0aW5ncy5ob29rcykpIHtcbiAgICAgIGNvbnN0IGhvb2tFbnRyaWVzID0gc2V0dGluZ3MuaG9va3NbZXZlbnRUeXBlXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGhvb2tFbnRyaWVzKSkge1xuICAgICAgICAvLyBGaWx0ZXIgb3V0IGVudHJpZXMgdGhhdCBjb250YWluIG9ycGhhbmVkIGhvb2tzXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gaG9va0VudHJpZXMuZmlsdGVyKGVudHJ5ID0+IHtcbiAgICAgICAgICBpZiAoZW50cnkuaG9va3MgJiYgQXJyYXkuaXNBcnJheShlbnRyeS5ob29rcykpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGFueSBob29rIGluIHRoaXMgZW50cnkgbWF0Y2hlcyBvcnBoYW5lZCBwYXR0ZXJuc1xuICAgICAgICAgICAgY29uc3QgaGFzT3JwaGFuZWQgPSBlbnRyeS5ob29rcy5zb21lKGggPT5cbiAgICAgICAgICAgICAgaC5jb21tYW5kICYmIG9ycGhhbmVkSG9va1BhdHRlcm5zLnNvbWUocGF0dGVybiA9PiBoLmNvbW1hbmQuaW5jbHVkZXMocGF0dGVybikpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGhhc09ycGhhbmVkKSB7XG4gICAgICAgICAgICAgIGNsZWFuZWRIb29rcyA9IHRydWU7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIFJlbW92ZSB0aGlzIGVudHJ5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlOyAgLy8gS2VlcCB0aGlzIGVudHJ5XG4gICAgICAgIH0pO1xuICAgICAgICBzZXR0aW5ncy5ob29rc1tldmVudFR5cGVdID0gZmlsdGVyZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNsZWFuZWRIb29rcykge1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBvcnBoYW5lZCBob29rIHJlZ2lzdHJhdGlvbnNgKTtcbiAgfVxuXG4gIC8vIEZpeCAjMzMwOiBVcGRhdGUgc3RhdHVzTGluZSBpZiBpdCBwb2ludHMgdG8gb2xkIHN0YXR1c2xpbmUuanMgcGF0aFxuICAvLyBPbmx5IG1hdGNoIHRoZSBzcGVjaWZpYyBvbGQgcGF0aCBwYXR0ZXJuIChob29rcy9zdGF0dXNsaW5lLmpzKSxcbiAgLy8gbm90IHRoaXJkLXBhcnR5IHN0YXR1c2xpbmUgc2NyaXB0cyB0aGF0IGhhcHBlbiB0byBjb250YWluICdzdGF0dXNsaW5lLmpzJ1xuICBpZiAoc2V0dGluZ3Muc3RhdHVzTGluZSAmJiBzZXR0aW5ncy5zdGF0dXNMaW5lLmNvbW1hbmQgJiZcbiAgICAgIC9ob29rc1tcXC9cXFxcXXN0YXR1c2xpbmVcXC5qcy8udGVzdChzZXR0aW5ncy5zdGF0dXNMaW5lLmNvbW1hbmQpKSB7XG4gICAgc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kID0gc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kLnJlcGxhY2UoXG4gICAgICAvaG9va3MoW1xcL1xcXFxdKXN0YXR1c2xpbmVcXC5qcy8sXG4gICAgICAnaG9va3MkMWV6LXN0YXR1c2xpbmUuanMnXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFVwZGF0ZWQgc3RhdHVzbGluZSBwYXRoIChob29rcy9zdGF0dXNsaW5lLmpzIFx1MjE5MiBob29rcy9lei1zdGF0dXNsaW5lLmpzKWApO1xuICB9XG5cbiAgcmV0dXJuIHNldHRpbmdzO1xufVxuXG4vKipcbiAqIFVuaW5zdGFsbCBFWl9BZ2VudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBmb3IgYSBzcGVjaWZpYyBydW50aW1lXG4gKiBSZW1vdmVzIG9ubHkgRVotc3BlY2lmaWMgZmlsZXMvZGlyZWN0b3JpZXMsIHByZXNlcnZlcyB1c2VyIGNvbnRlbnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNHbG9iYWwgLSBXaGV0aGVyIHRvIHVuaW5zdGFsbCBmcm9tIGdsb2JhbCBvciBsb2NhbFxuICogQHBhcmFtIHtzdHJpbmd9IHJ1bnRpbWUgLSBUYXJnZXQgcnVudGltZSAoJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCAnY29waWxvdCcpXG4gKi9cbmZ1bmN0aW9uIHVuaW5zdGFsbChpc0dsb2JhbCwgcnVudGltZSA9ICdjbGF1ZGUnKSB7XG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xuICBjb25zdCBpc0NvZGV4ID0gcnVudGltZSA9PT0gJ2NvZGV4JztcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xuICBjb25zdCBpc1F3ZW4gPSBydW50aW1lID09PSAncXdlbic7XG4gIGNvbnN0IGlzS2ltaSA9IHJ1bnRpbWUgPT09ICdraW1pJztcbiAgY29uc3QgZGlyTmFtZSA9IGdldERpck5hbWUocnVudGltZSk7XG5cbiAgLy8gR2V0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGJhc2VkIG9uIHJ1bnRpbWUgYW5kIGluc3RhbGwgdHlwZVxuICBjb25zdCB0YXJnZXREaXIgPSBpc0dsb2JhbFxuICAgID8gZ2V0R2xvYmFsRGlyKHJ1bnRpbWUsIGV4cGxpY2l0Q29uZmlnRGlyKVxuICAgIDogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGRpck5hbWUpO1xuXG4gIGNvbnN0IGxvY2F0aW9uTGFiZWwgPSBpc0dsb2JhbFxuICAgID8gdGFyZ2V0RGlyLnJlcGxhY2Uob3MuaG9tZWRpcigpLCAnficpXG4gICAgOiB0YXJnZXREaXIucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnLicpO1xuXG4gIGxldCBydW50aW1lTGFiZWwgPSAnQ2xhdWRlIENvZGUnO1xuICBpZiAocnVudGltZSA9PT0gJ29wZW5jb2RlJykgcnVudGltZUxhYmVsID0gJ09wZW5Db2RlJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdnZW1pbmknKSBydW50aW1lTGFiZWwgPSAnR2VtaW5pJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb2RleCcpIHJ1bnRpbWVMYWJlbCA9ICdDb2RleCc7XG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHJ1bnRpbWVMYWJlbCA9ICdDb3BpbG90JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcnVudGltZUxhYmVsID0gJ1F3ZW4gQ29kZSc7XG5cbiAgY29uc29sZS5sb2coYCAgVW5pbnN0YWxsaW5nIEVaX0FnZW50cyBmcm9tICR7Y3lhbn0ke3J1bnRpbWVMYWJlbH0ke3Jlc2V0fSBhdCAke2N5YW59JHtsb2NhdGlvbkxhYmVsfSR7cmVzZXR9XFxuYCk7XG5cbiAgLy8gQ2hlY2sgaWYgdGFyZ2V0IGRpcmVjdG9yeSBleGlzdHNcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldERpcikpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Q6ICR7bG9jYXRpb25MYWJlbH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBOb3RoaW5nIHRvIHVuaW5zdGFsbC5cXG5gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgcmVtb3ZlZENvdW50ID0gMDtcblxuICAvLyAxLiBSZW1vdmUgRVogY29tbWFuZHMvc2tpbGxzXG4gIGlmIChpc09wZW5jb2RlKSB7XG4gICAgLy8gT3BlbkNvZGU6IHJlbW92ZSBjb21tYW5kL2V6LSoubWQgZmlsZXNcbiAgICBjb25zdCBjb21tYW5kRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvbW1hbmQnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjb21tYW5kRGlyKSkge1xuICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhjb21tYW5kRGlyKTtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCdlei0nKSAmJiBmaWxlLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKGNvbW1hbmREaXIsIGZpbGUpKTtcbiAgICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIEVaX0FnZW50cyBjb21tYW5kcyBmcm9tIGNvbW1hbmQvYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzQ29kZXggfHwgaXNRd2VuIHx8IGlzS2ltaSkge1xuICAgIC8vIENvZGV4L1F3ZW4vS2ltaTogcmVtb3ZlIHNraWxscy9lei0qL1NLSUxMLm1kIHNraWxsIGRpcmVjdG9yaWVzXG4gICAgY29uc3Qgc2tpbGxzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NraWxscycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHNraWxsc0RpcikpIHtcbiAgICAgIGxldCBza2lsbENvdW50ID0gMDtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSAmJiBlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJ2V6LScpKSB7XG4gICAgICAgICAgZnMucm1TeW5jKHBhdGguam9pbihza2lsbHNEaXIsIGVudHJ5Lm5hbWUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBza2lsbENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChza2lsbENvdW50ID4gMCkge1xuICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgbGV0IHJ1bnRpbWVMYWJlbCA9ICdDb2RleCc7XG4gICAgICAgIGlmIChpc1F3ZW4pIHJ1bnRpbWVMYWJlbCA9ICdRd2VuIENvZGUnO1xuICAgICAgICBpZiAoaXNLaW1pKSBydW50aW1lTGFiZWwgPSAnS2ltaSBDb2RlJztcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkICR7c2tpbGxDb3VudH0gJHtydW50aW1lTGFiZWx9IHNraWxsc2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0NvZGV4KSB7XG4gICAgICAvLyBDb2RleDogcmVtb3ZlIEVaIGFnZW50IC50b21sIGNvbmZpZyBmaWxlc1xuICAgICAgY29uc3QgY29kZXhBZ2VudHNEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnYWdlbnRzJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhjb2RleEFnZW50c0RpcikpIHtcbiAgICAgICAgY29uc3QgdG9tbEZpbGVzID0gZnMucmVhZGRpclN5bmMoY29kZXhBZ2VudHNEaXIpO1xuICAgICAgICBsZXQgdG9tbENvdW50ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIHRvbWxGaWxlcykge1xuICAgICAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ2V6LScpICYmIGZpbGUuZW5kc1dpdGgoJy50b21sJykpIHtcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKGNvZGV4QWdlbnRzRGlyLCBmaWxlKSk7XG4gICAgICAgICAgICB0b21sQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvbWxDb3VudCA+IDApIHtcbiAgICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgJHt0b21sQ291bnR9IGFnZW50IC50b21sIGNvbmZpZ3NgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDb2RleDogY2xlYW4gRVogc2VjdGlvbnMgZnJvbSBjb25maWcudG9tbFxuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb25maWcudG9tbCcpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpO1xuICAgICAgICBjb25zdCBjbGVhbmVkID0gc3RyaXBFekFnZW50c0Zyb21Db2RleENvbmZpZyhjb250ZW50KTtcbiAgICAgICAgaWYgKGNsZWFuZWQgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBGaWxlIGlzIGVtcHR5IGFmdGVyIHN0cmlwcGluZyBcdTIwMTQgZGVsZXRlIGl0XG4gICAgICAgICAgZnMudW5saW5rU3luYyhjb25maWdQYXRoKTtcbiAgICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgY29uZmlnLnRvbWwgKHdhcyBFWi1vbmx5KWApO1xuICAgICAgICB9IGVsc2UgaWYgKGNsZWFuZWQgIT09IGNvbnRlbnQpIHtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGNsZWFuZWQpO1xuICAgICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gQ2xlYW5lZCBFWl9BZ2VudHMgc2VjdGlvbnMgZnJvbSBjb25maWcudG9tbGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzQ29waWxvdCkge1xuICAgIC8vIENvcGlsb3Q6IHJlbW92ZSBza2lsbHMvZXotKi8gZGlyZWN0b3JpZXMgKHNhbWUgbGF5b3V0IGFzIENvZGV4IHNraWxscylcbiAgICBjb25zdCBza2lsbHNEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnc2tpbGxzJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoc2tpbGxzRGlyKSkge1xuICAgICAgbGV0IHNraWxsQ291bnQgPSAwO1xuICAgICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHNraWxsc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnZXotJykpIHtcbiAgICAgICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHNraWxsc0RpciwgZW50cnkubmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIHNraWxsQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNraWxsQ291bnQgPiAwKSB7XG4gICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgJHtza2lsbENvdW50fSBDb3BpbG90IHNraWxsc2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvcGlsb3Q6IGNsZWFuIEVaIHNlY3Rpb24gZnJvbSBjb3BpbG90LWluc3RydWN0aW9ucy5tZFxuICAgIGNvbnN0IGluc3RydWN0aW9uc1BhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnY29waWxvdC1pbnN0cnVjdGlvbnMubWQnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhpbnN0cnVjdGlvbnNQYXRoKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhpbnN0cnVjdGlvbnNQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgY2xlYW5lZCA9IHN0cmlwRXpBZ2VudHNGcm9tQ29waWxvdEluc3RydWN0aW9ucyhjb250ZW50KTtcbiAgICAgIGlmIChjbGVhbmVkID09PSBudWxsKSB7XG4gICAgICAgIGZzLnVubGlua1N5bmMoaW5zdHJ1Y3Rpb25zUGF0aCk7XG4gICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgY29waWxvdC1pbnN0cnVjdGlvbnMubWQgKHdhcyBFWi1vbmx5KWApO1xuICAgICAgfSBlbHNlIGlmIChjbGVhbmVkICE9PSBjb250ZW50KSB7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoaW5zdHJ1Y3Rpb25zUGF0aCwgY2xlYW5lZCk7XG4gICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENsZWFuZWQgRVpfQWdlbnRzIHNlY3Rpb24gZnJvbSBjb3BpbG90LWluc3RydWN0aW9ucy5tZGApO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBlekNvbW1hbmRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvbW1hbmRzJywgJ2V6Jyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZXpDb21tYW5kc0RpcikpIHtcbiAgICAgIGZzLnJtU3luYyhlekNvbW1hbmRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIGNvbW1hbmRzL2V6L2ApO1xuICAgIH1cbiAgfVxuXG4gIC8vIDIuIFJlbW92ZSBlei1hZ2VudHMgZGlyZWN0b3J5XG4gIGNvbnN0IGV6RGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2V6LWFnZW50cycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhlekRpcikpIHtcbiAgICBmcy5ybVN5bmMoZXpEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJlbW92ZWRDb3VudCsrO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBlei1hZ2VudHMvYCk7XG4gIH1cblxuICAvLyAzLiBSZW1vdmUgRVpfQWdlbnRzIGFnZW50cyAoZXotKi5tZCBmaWxlcyBvbmx5KVxuICBjb25zdCBhZ2VudHNEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnYWdlbnRzJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGFnZW50c0RpcikpIHtcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGFnZW50c0Rpcik7XG4gICAgbGV0IGFnZW50Q291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgZnMudW5saW5rU3luYyhwYXRoLmpvaW4oYWdlbnRzRGlyLCBmaWxlKSk7XG4gICAgICAgIGFnZW50Q291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFnZW50Q291bnQgPiAwKSB7XG4gICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCAke2FnZW50Q291bnR9IEVaX0FnZW50cyBhZ2VudHNgKTtcbiAgICB9XG4gIH1cblxuICAvLyA0LiBSZW1vdmUgRVogaG9va3NcbiAgY29uc3QgaG9va3NEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnaG9va3MnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoaG9va3NEaXIpKSB7XG4gICAgY29uc3QgZXpIb29rcyA9IFsnZXotc3RhdHVzbGluZS5qcycsICdlei1jaGVjay11cGRhdGUuanMnLCAnZXotY2hlY2stdXBkYXRlLnNoJywgJ2V6LWNvbnRleHQtbW9uaXRvci5qcyddO1xuICAgIGxldCBob29rQ291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgaG9vayBvZiBlekhvb2tzKSB7XG4gICAgICBjb25zdCBob29rUGF0aCA9IHBhdGguam9pbihob29rc0RpciwgaG9vayk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhob29rUGF0aCkpIHtcbiAgICAgICAgZnMudW5saW5rU3luYyhob29rUGF0aCk7XG4gICAgICAgIGhvb2tDb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaG9va0NvdW50ID4gMCkge1xuICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgJHtob29rQ291bnR9IEVaIGhvb2tzYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gNS4gUmVtb3ZlIEVaIHBhY2thZ2UuanNvbiAoQ29tbW9uSlMgbW9kZSBtYXJrZXIpXG4gIGNvbnN0IHBrZ0pzb25QYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhwa2dKc29uUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwa2dKc29uUGF0aCwgJ3V0ZjgnKS50cmltKCk7XG4gICAgICAvLyBPbmx5IHJlbW92ZSBpZiBpdCdzIG91ciBtaW5pbWFsIENvbW1vbkpTIG1hcmtlclxuICAgICAgaWYgKGNvbnRlbnQgPT09ICd7XCJ0eXBlXCI6XCJjb21tb25qc1wifScpIHtcbiAgICAgICAgZnMudW5saW5rU3luYyhwa2dKc29uUGF0aCk7XG4gICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgRVogcGFja2FnZS5qc29uYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIHJlYWQgZXJyb3JzXG4gICAgfVxuICB9XG5cbiAgLy8gNi4gQ2xlYW4gdXAgc2V0dGluZ3MuanNvbiAocmVtb3ZlIEVaIGhvb2tzIGFuZCBzdGF0dXNsaW5lKVxuICBjb25zdCBzZXR0aW5nc1BhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnc2V0dGluZ3MuanNvbicpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSB7XG4gICAgbGV0IHNldHRpbmdzID0gcmVhZFNldHRpbmdzKHNldHRpbmdzUGF0aCk7XG4gICAgbGV0IHNldHRpbmdzTW9kaWZpZWQgPSBmYWxzZTtcblxuICAgIC8vIFJlbW92ZSBFWiBzdGF0dXNsaW5lIGlmIGl0IHJlZmVyZW5jZXMgb3VyIGhvb2tcbiAgICBpZiAoc2V0dGluZ3Muc3RhdHVzTGluZSAmJiBzZXR0aW5ncy5zdGF0dXNMaW5lLmNvbW1hbmQgJiZcbiAgICAgICAgc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kLmluY2x1ZGVzKCdlei1zdGF0dXNsaW5lJykpIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5zdGF0dXNMaW5lO1xuICAgICAgc2V0dGluZ3NNb2RpZmllZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgRVogc3RhdHVzbGluZSBmcm9tIHNldHRpbmdzYCk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIEVaIGhvb2tzIGZyb20gU2Vzc2lvblN0YXJ0XG4gICAgaWYgKHNldHRpbmdzLmhvb2tzICYmIHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydCkge1xuICAgICAgY29uc3QgYmVmb3JlID0gc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0Lmxlbmd0aDtcbiAgICAgIHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydCA9IHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5maWx0ZXIoZW50cnkgPT4ge1xuICAgICAgICBpZiAoZW50cnkuaG9va3MgJiYgQXJyYXkuaXNBcnJheShlbnRyeS5ob29rcykpIHtcbiAgICAgICAgICAvLyBGaWx0ZXIgb3V0IEVaIGhvb2tzXG4gICAgICAgICAgY29uc3QgaGFzRXpIb29rID0gZW50cnkuaG9va3Muc29tZShoID0+XG4gICAgICAgICAgICBoLmNvbW1hbmQgJiYgKGguY29tbWFuZC5pbmNsdWRlcygnZXotY2hlY2stdXBkYXRlJykgfHwgaC5jb21tYW5kLmluY2x1ZGVzKCdlei1zdGF0dXNsaW5lJykpXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gIWhhc0V6SG9vaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5sZW5ndGggPCBiZWZvcmUpIHtcbiAgICAgICAgc2V0dGluZ3NNb2RpZmllZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBFWiBob29rcyBmcm9tIHNldHRpbmdzYCk7XG4gICAgICB9XG4gICAgICAvLyBDbGVhbiB1cCBlbXB0eSBhcnJheVxuICAgICAgaWYgKHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgRVogaG9va3MgZnJvbSBQb3N0VG9vbFVzZSBhbmQgQWZ0ZXJUb29sIChHZW1pbmkgdXNlcyBBZnRlclRvb2wpXG4gICAgZm9yIChjb25zdCBldmVudE5hbWUgb2YgWydQb3N0VG9vbFVzZScsICdBZnRlclRvb2wnXSkge1xuICAgICAgaWYgKHNldHRpbmdzLmhvb2tzICYmIHNldHRpbmdzLmhvb2tzW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXS5sZW5ndGg7XG4gICAgICAgIHNldHRpbmdzLmhvb2tzW2V2ZW50TmFtZV0gPSBzZXR0aW5ncy5ob29rc1tldmVudE5hbWVdLmZpbHRlcihlbnRyeSA9PiB7XG4gICAgICAgICAgaWYgKGVudHJ5Lmhvb2tzICYmIEFycmF5LmlzQXJyYXkoZW50cnkuaG9va3MpKSB7XG4gICAgICAgICAgICBjb25zdCBoYXNFekhvb2sgPSBlbnRyeS5ob29rcy5zb21lKGggPT5cbiAgICAgICAgICAgICAgaC5jb21tYW5kICYmIGguY29tbWFuZC5pbmNsdWRlcygnZXotY29udGV4dC1tb25pdG9yJylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gIWhhc0V6SG9vaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXS5sZW5ndGggPCBiZWZvcmUpIHtcbiAgICAgICAgICBzZXR0aW5nc01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgY29udGV4dCBtb25pdG9yIGhvb2sgZnJvbSBzZXR0aW5nc2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR0aW5ncy5ob29rc1tldmVudE5hbWVdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGRlbGV0ZSBzZXR0aW5ncy5ob29rc1tldmVudE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgZW1wdHkgaG9va3Mgb2JqZWN0XG4gICAgaWYgKHNldHRpbmdzLmhvb2tzICYmIE9iamVjdC5rZXlzKHNldHRpbmdzLmhvb2tzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5ob29rcztcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3NNb2RpZmllZCkge1xuICAgICAgd3JpdGVTZXR0aW5ncyhzZXR0aW5nc1BhdGgsIHNldHRpbmdzKTtcbiAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgIH1cbiAgfVxuXG4gIC8vIDYuIEZvciBPcGVuQ29kZSwgY2xlYW4gdXAgcGVybWlzc2lvbnMgZnJvbSBvcGVuY29kZS5qc29uXG4gIGlmIChpc09wZW5jb2RlKSB7XG4gICAgLy8gRm9yIGxvY2FsIHVuaW5zdGFsbHMsIGNsZWFuIHVwIC4vLm9wZW5jb2RlL29wZW5jb2RlLmpzb25cbiAgICAvLyBGb3IgZ2xvYmFsIHVuaW5zdGFsbHMsIGNsZWFuIHVwIH4vLmNvbmZpZy9vcGVuY29kZS9vcGVuY29kZS5qc29uXG4gICAgY29uc3Qgb3BlbmNvZGVDb25maWdEaXIgPSBpc0dsb2JhbFxuICAgICAgPyBnZXRPcGVuY29kZUdsb2JhbERpcigpXG4gICAgICA6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLm9wZW5jb2RlJyk7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihvcGVuY29kZUNvbmZpZ0RpciwgJ29wZW5jb2RlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIGxldCBtb2RpZmllZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFJlbW92ZSBFWiBwZXJtaXNzaW9uIGVudHJpZXNcbiAgICAgICAgaWYgKGNvbmZpZy5wZXJtaXNzaW9uKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwZXJtVHlwZSBvZiBbJ3JlYWQnLCAnZXh0ZXJuYWxfZGlyZWN0b3J5J10pIHtcbiAgICAgICAgICAgIGlmIChjb25maWcucGVybWlzc2lvbltwZXJtVHlwZV0pIHtcbiAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbmZpZy5wZXJtaXNzaW9uW3Blcm1UeXBlXSk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCdlei1hZ2VudHMnKSkge1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5wZXJtaXNzaW9uW3Blcm1UeXBlXVtrZXldO1xuICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBDbGVhbiB1cCBlbXB0eSBvYmplY3RzXG4gICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhjb25maWcucGVybWlzc2lvbltwZXJtVHlwZV0pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGVybWlzc2lvbltwZXJtVHlwZV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbmZpZy5wZXJtaXNzaW9uKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGVybWlzc2lvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kaWZpZWQpIHtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMikgKyAnXFxuJyk7XG4gICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIEVaIHBlcm1pc3Npb25zIGZyb20gb3BlbmNvZGUuanNvbmApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElnbm9yZSBKU09OIHBhcnNlIGVycm9yc1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChyZW1vdmVkQ291bnQgPT09IDApIHtcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBObyBFWl9BZ2VudHMgZmlsZXMgZm91bmQgdG8gcmVtb3ZlLmApO1xuICB9XG5cbiAgY29uc29sZS5sb2coYFxuICAke2dyZWVufURvbmUhJHtyZXNldH0gRVpfQWdlbnRzIGhhcyBiZWVuIHVuaW5zdGFsbGVkIGZyb20gJHtydW50aW1lTGFiZWx9LlxuICBZb3VyIG90aGVyIGZpbGVzIGFuZCBzZXR0aW5ncyBoYXZlIGJlZW4gcHJlc2VydmVkLlxuYCk7XG59XG5cbi8qKlxuICogUGFyc2UgSlNPTkMgKEpTT04gd2l0aCBDb21tZW50cykgYnkgc3RyaXBwaW5nIGNvbW1lbnRzIGFuZCB0cmFpbGluZyBjb21tYXMuXG4gKiBPcGVuQ29kZSBzdXBwb3J0cyBKU09OQyBmb3JtYXQgdmlhIGpzb25jLXBhcnNlciwgc28gdXNlcnMgbWF5IGhhdmUgY29tbWVudHMuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgaW5saW5lIHBhcnNlciB0byBhdm9pZCBhZGRpbmcgZGVwZW5kZW5jaWVzLlxuICovXG5mdW5jdGlvbiBwYXJzZUpzb25jKGNvbnRlbnQpIHtcbiAgLy8gU3RyaXAgQk9NIGlmIHByZXNlbnRcbiAgaWYgKGNvbnRlbnQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XG4gICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XG4gIH1cblxuICAvLyBSZW1vdmUgc2luZ2xlLWxpbmUgYW5kIGJsb2NrIGNvbW1lbnRzIHdoaWxlIHByZXNlcnZpbmcgc3RyaW5nc1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBpblN0cmluZyA9IGZhbHNlO1xuICBsZXQgaSA9IDA7XG4gIHdoaWxlIChpIDwgY29udGVudC5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpXTtcbiAgICBjb25zdCBuZXh0ID0gY29udGVudFtpICsgMV07XG5cbiAgICBpZiAoaW5TdHJpbmcpIHtcbiAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgLy8gSGFuZGxlIGVzY2FwZSBzZXF1ZW5jZXNcbiAgICAgIGlmIChjaGFyID09PSAnXFxcXCcgJiYgaSArIDEgPCBjb250ZW50Lmxlbmd0aCkge1xuICAgICAgICByZXN1bHQgKz0gbmV4dDtcbiAgICAgICAgaSArPSAyO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSAnXCInKSB7XG4gICAgICAgIGluU3RyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGFyID09PSAnXCInKSB7XG4gICAgICAgIGluU3RyaW5nID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJy8nICYmIG5leHQgPT09ICcvJykge1xuICAgICAgICAvLyBTa2lwIHNpbmdsZS1saW5lIGNvbW1lbnQgdW50aWwgZW5kIG9mIGxpbmVcbiAgICAgICAgd2hpbGUgKGkgPCBjb250ZW50Lmxlbmd0aCAmJiBjb250ZW50W2ldICE9PSAnXFxuJykge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnLycgJiYgbmV4dCA9PT0gJyonKSB7XG4gICAgICAgIC8vIFNraXAgYmxvY2sgY29tbWVudFxuICAgICAgICBpICs9IDI7XG4gICAgICAgIHdoaWxlIChpIDwgY29udGVudC5sZW5ndGggLSAxICYmICEoY29udGVudFtpXSA9PT0gJyonICYmIGNvbnRlbnRbaSArIDFdID09PSAnLycpKSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGkgKz0gMjsgLy8gU2tpcCBjbG9zaW5nICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYXMgYmVmb3JlIH0gb3IgXVxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvLChcXHMqW31cXF1dKS9nLCAnJDEnKTtcblxuICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZSBPcGVuQ29kZSBwZXJtaXNzaW9ucyB0byBhbGxvdyByZWFkaW5nIEVaIHJlZmVyZW5jZSBkb2NzXG4gKiBUaGlzIHByZXZlbnRzIHBlcm1pc3Npb24gcHJvbXB0cyB3aGVuIEVaIGFjY2Vzc2VzIHRoZSBlei1hZ2VudHMgZGlyZWN0b3J5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzR2xvYmFsIC0gV2hldGhlciB0aGlzIGlzIGEgZ2xvYmFsIG9yIGxvY2FsIGluc3RhbGxcbiAqL1xuZnVuY3Rpb24gY29uZmlndXJlT3BlbmNvZGVQZXJtaXNzaW9ucyhpc0dsb2JhbCA9IHRydWUpIHtcbiAgLy8gRm9yIGxvY2FsIGluc3RhbGxzLCB1c2UgLi8ub3BlbmNvZGUvb3BlbmNvZGUuanNvblxuICAvLyBGb3IgZ2xvYmFsIGluc3RhbGxzLCB1c2Ugfi8uY29uZmlnL29wZW5jb2RlL29wZW5jb2RlLmpzb25cbiAgY29uc3Qgb3BlbmNvZGVDb25maWdEaXIgPSBpc0dsb2JhbFxuICAgID8gZ2V0T3BlbmNvZGVHbG9iYWxEaXIoKVxuICAgIDogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcub3BlbmNvZGUnKTtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihvcGVuY29kZUNvbmZpZ0RpciwgJ29wZW5jb2RlLmpzb24nKTtcblxuICAvLyBFbnN1cmUgY29uZmlnIGRpcmVjdG9yeSBleGlzdHNcbiAgZnMubWtkaXJTeW5jKG9wZW5jb2RlQ29uZmlnRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBSZWFkIGV4aXN0aW5nIGNvbmZpZyBvciBjcmVhdGUgZW1wdHkgb2JqZWN0XG4gIGxldCBjb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbmZpZyA9IHBhcnNlSnNvbmMoY29udGVudCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gQ2Fubm90IHBhcnNlIC0gRE8gTk9UIG92ZXJ3cml0ZSB1c2VyJ3MgY29uZmlnXG4gICAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBDb3VsZCBub3QgcGFyc2Ugb3BlbmNvZGUuanNvbiAtIHNraXBwaW5nIHBlcm1pc3Npb24gY29uZmlnYCk7XG4gICAgICBjb25zb2xlLmxvZyhgICAgICR7ZGltfVJlYXNvbjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX0ke3Jlc2V0fWApO1xuICAgICAgY29uc29sZS5sb2coYCAgICAke2RpbX1Zb3VyIGNvbmZpZyB3YXMgTk9UIG1vZGlmaWVkLiBGaXggdGhlIHN5bnRheCBtYW51YWxseSBpZiBuZWVkZWQuJHtyZXNldH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBFbnN1cmUgcGVybWlzc2lvbiBzdHJ1Y3R1cmUgZXhpc3RzXG4gIGlmICghY29uZmlnLnBlcm1pc3Npb24pIHtcbiAgICBjb25maWcucGVybWlzc2lvbiA9IHt9O1xuICB9XG5cbiAgLy8gQnVpbGQgdGhlIEVaIHBhdGggdXNpbmcgdGhlIGFjdHVhbCBjb25maWcgZGlyZWN0b3J5XG4gIC8vIFVzZSB+IHNob3J0aGFuZCBpZiBpdCdzIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9uLCBvdGhlcndpc2UgdXNlIGZ1bGwgcGF0aFxuICBjb25zdCBkZWZhdWx0Q29uZmlnRGlyID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jb25maWcnLCAnb3BlbmNvZGUnKTtcbiAgY29uc3QgZXpQYXRoID0gb3BlbmNvZGVDb25maWdEaXIgPT09IGRlZmF1bHRDb25maWdEaXJcbiAgICA/ICd+Ly5jb25maWcvb3BlbmNvZGUvZXotYWdlbnRzLyonXG4gICAgOiBgJHtvcGVuY29kZUNvbmZpZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyl9L2V6LWFnZW50cy8qYDtcblxuICBsZXQgbW9kaWZpZWQgPSBmYWxzZTtcblxuICAvLyBDb25maWd1cmUgcmVhZCBwZXJtaXNzaW9uXG4gIGNvbnN0IHBlcm1pc3Npb24gPSBjb25maWcucGVybWlzc2lvbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8fCB7fTtcbiAgY29uZmlnLnBlcm1pc3Npb24gPSBwZXJtaXNzaW9uO1xuICBpZiAoIXBlcm1pc3Npb24ucmVhZCB8fCB0eXBlb2YgcGVybWlzc2lvbi5yZWFkICE9PSAnb2JqZWN0Jykge1xuICAgIHBlcm1pc3Npb24ucmVhZCA9IHt9O1xuICB9XG4gIGNvbnN0IHJlYWRQZXJtID0gcGVybWlzc2lvbi5yZWFkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAocmVhZFBlcm1bZXpQYXRoXSAhPT0gJ2FsbG93Jykge1xuICAgIHJlYWRQZXJtW2V6UGF0aF0gPSAnYWxsb3cnO1xuICAgIG1vZGlmaWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIENvbmZpZ3VyZSBleHRlcm5hbF9kaXJlY3RvcnkgcGVybWlzc2lvbiAodGhlIHNhZmV0eSBndWFyZCBmb3IgcGF0aHMgb3V0c2lkZSBwcm9qZWN0KVxuICBpZiAoIXBlcm1pc3Npb24uZXh0ZXJuYWxfZGlyZWN0b3J5IHx8IHR5cGVvZiBwZXJtaXNzaW9uLmV4dGVybmFsX2RpcmVjdG9yeSAhPT0gJ29iamVjdCcpIHtcbiAgICBwZXJtaXNzaW9uLmV4dGVybmFsX2RpcmVjdG9yeSA9IHt9O1xuICB9XG4gIGNvbnN0IGV4dERpclBlcm0gPSBwZXJtaXNzaW9uLmV4dGVybmFsX2RpcmVjdG9yeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKGV4dERpclBlcm1bZXpQYXRoXSAhPT0gJ2FsbG93Jykge1xuICAgIGV4dERpclBlcm1bZXpQYXRoXSA9ICdhbGxvdyc7XG4gICAgbW9kaWZpZWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKCFtb2RpZmllZCkge1xuICAgIHJldHVybjsgLy8gQWxyZWFkeSBjb25maWd1cmVkXG4gIH1cblxuICAvLyBXcml0ZSBjb25maWcgYmFja1xuICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMikgKyAnXFxuJyk7XG4gIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gQ29uZmlndXJlZCByZWFkIHBlcm1pc3Npb24gZm9yIEVaX0FnZW50cyBkb2NzYCk7XG59XG5cbi8qKlxuICogVmVyaWZ5IGEgZGlyZWN0b3J5IGV4aXN0cyBhbmQgY29udGFpbnMgZmlsZXNcbiAqL1xuZnVuY3Rpb24gdmVyaWZ5SW5zdGFsbGVkKGRpclBhdGgsIGRlc2NyaXB0aW9uKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYCAgJHt5ZWxsb3d9XHUyNzE3JHtyZXNldH0gRmFpbGVkIHRvIGluc3RhbGwgJHtkZXNjcmlwdGlvbn06IGRpcmVjdG9yeSBub3QgY3JlYXRlZGApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYCAgJHt5ZWxsb3d9XHUyNzE3JHtyZXNldH0gRmFpbGVkIHRvIGluc3RhbGwgJHtkZXNjcmlwdGlvbn06IGRpcmVjdG9yeSBpcyBlbXB0eWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYCAgJHt5ZWxsb3d9XHUyNzE3JHtyZXNldH0gRmFpbGVkIHRvIGluc3RhbGwgJHtkZXNjcmlwdGlvbn06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFZlcmlmeSBhIGZpbGUgZXhpc3RzXG4gKi9cbmZ1bmN0aW9uIHZlcmlmeUZpbGVJbnN0YWxsZWQoZmlsZVBhdGgsIGRlc2NyaXB0aW9uKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fVx1MjcxNyR7cmVzZXR9IEZhaWxlZCB0byBpbnN0YWxsICR7ZGVzY3JpcHRpb259OiBmaWxlIG5vdCBjcmVhdGVkYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEluc3RhbGwgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZm9yIGEgc3BlY2lmaWMgcnVudGltZVxuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdG8gaW5zdGFsbCBnbG9iYWxseSBvciBsb2NhbGx5XG4gKiBAcGFyYW0ge3N0cmluZ30gcnVudGltZSAtIFRhcmdldCBydW50aW1lICgnY2xhdWRlJywgJ29wZW5jb2RlJywgJ2dlbWluaScsICdjb2RleCcpXG4gKi9cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vLyBMb2NhbCBQYXRjaCBQZXJzaXN0ZW5jZVxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IFBBVENIRVNfRElSX05BTUUgPSAnZXotbG9jYWwtcGF0Y2hlcyc7XG5jb25zdCBNQU5JRkVTVF9OQU1FID0gJ2V6LWZpbGUtbWFuaWZlc3QuanNvbic7XG5cbi8qKlxuICogQ29tcHV0ZSBTSEEyNTYgaGFzaCBvZiBmaWxlIGNvbnRlbnRzXG4gKi9cbmZ1bmN0aW9uIGZpbGVIYXNoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKTtcbiAgLy8gQ29udmVydCB0byBVaW50OEFycmF5IHRvIHNhdGlzZnkgQmluYXJ5TGlrZSB0eXBlIHJlcXVpcmVtZW50XG4gIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKG5ldyBVaW50OEFycmF5KGNvbnRlbnQpKS5kaWdlc3QoJ2hleCcpO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGNvbGxlY3QgYWxsIGZpbGVzIGluIGRpciB3aXRoIHRoZWlyIGhhc2hlc1xuICovXG5mdW5jdGlvbiBnZW5lcmF0ZU1hbmlmZXN0KGRpcjogc3RyaW5nLCBiYXNlRGlyPzogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmICghYmFzZURpcikgYmFzZURpciA9IGRpcjtcbiAgY29uc3QgbWFuaWZlc3Q6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGRpcikpIHJldHVybiBtYW5pZmVzdDtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuICAgIGNvbnN0IHJlbFBhdGggPSBwYXRoLnJlbGF0aXZlKGJhc2VEaXIsIGZ1bGxQYXRoKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24obWFuaWZlc3QsIGdlbmVyYXRlTWFuaWZlc3QoZnVsbFBhdGgsIGJhc2VEaXIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuaWZlc3RbcmVsUGF0aF0gPSBmaWxlSGFzaChmdWxsUGF0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYW5pZmVzdDtcbn1cblxuLyoqXG4gKiBXcml0ZSBmaWxlIG1hbmlmZXN0IGFmdGVyIGluc3RhbGxhdGlvbiBmb3IgZnV0dXJlIG1vZGlmaWNhdGlvbiBkZXRlY3Rpb25cbiAqL1xuZnVuY3Rpb24gd3JpdGVNYW5pZmVzdChjb25maWdEaXI6IHN0cmluZywgcnVudGltZSA9ICdjbGF1ZGUnKSB7XG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xuICBjb25zdCBpc0NvZGV4ID0gcnVudGltZSA9PT0gJ2NvZGV4JztcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xuICBjb25zdCBlekRpciA9IHBhdGguam9pbihjb25maWdEaXIsICdlei1hZ2VudHMnKTtcbiAgY29uc3QgY29tbWFuZHNEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCAnY29tbWFuZHMnLCAnZXonKTtcbiAgY29uc3Qgb3BlbmNvZGVDb21tYW5kRGlyID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgJ2NvbW1hbmQnKTtcbiAgY29uc3QgY29kZXhTa2lsbHNEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCAnc2tpbGxzJyk7XG4gIGNvbnN0IGFnZW50c0RpciA9IHBhdGguam9pbihjb25maWdEaXIsICdhZ2VudHMnKTtcbiAgY29uc3QgbWFuaWZlc3QgPSB7IHZlcnNpb246IHBrZy52ZXJzaW9uLCB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgZmlsZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfTtcblxuICBjb25zdCBlekhhc2hlcyA9IGdlbmVyYXRlTWFuaWZlc3QoZXpEaXIpO1xuICBmb3IgKGNvbnN0IFtyZWwsIGhhc2hdIG9mIE9iamVjdC5lbnRyaWVzKGV6SGFzaGVzKSkge1xuICAgIG1hbmlmZXN0LmZpbGVzWydlei1hZ2VudHMvJyArIHJlbF0gPSBoYXNoO1xuICB9XG4gIGlmICghaXNPcGVuY29kZSAmJiAhaXNDb2RleCAmJiAhaXNDb3BpbG90ICYmIGZzLmV4aXN0c1N5bmMoY29tbWFuZHNEaXIpKSB7XG4gICAgY29uc3QgY21kSGFzaGVzID0gZ2VuZXJhdGVNYW5pZmVzdChjb21tYW5kc0Rpcik7XG4gICAgZm9yIChjb25zdCBbcmVsLCBoYXNoXSBvZiBPYmplY3QuZW50cmllcyhjbWRIYXNoZXMpKSB7XG4gICAgICBtYW5pZmVzdC5maWxlc1snY29tbWFuZHMvZXovJyArIHJlbF0gPSBoYXNoO1xuICAgIH1cbiAgfVxuICBpZiAoaXNPcGVuY29kZSAmJiBmcy5leGlzdHNTeW5jKG9wZW5jb2RlQ29tbWFuZERpcikpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMob3BlbmNvZGVDb21tYW5kRGlyKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgbWFuaWZlc3QuZmlsZXNbJ2NvbW1hbmQvJyArIGZpbGVdID0gZmlsZUhhc2gocGF0aC5qb2luKG9wZW5jb2RlQ29tbWFuZERpciwgZmlsZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoKGlzQ29kZXggfHwgaXNDb3BpbG90KSAmJiBmcy5leGlzdHNTeW5jKGNvZGV4U2tpbGxzRGlyKSkge1xuICAgIGZvciAoY29uc3Qgc2tpbGxOYW1lIG9mIGxpc3RDb2RleFNraWxsTmFtZXMoY29kZXhTa2lsbHNEaXIpKSB7XG4gICAgICBjb25zdCBza2lsbFJvb3QgPSBwYXRoLmpvaW4oY29kZXhTa2lsbHNEaXIsIHNraWxsTmFtZSk7XG4gICAgICBjb25zdCBza2lsbEhhc2hlcyA9IGdlbmVyYXRlTWFuaWZlc3Qoc2tpbGxSb290KTtcbiAgICAgIGZvciAoY29uc3QgW3JlbCwgaGFzaF0gb2YgT2JqZWN0LmVudHJpZXMoc2tpbGxIYXNoZXMpKSB7XG4gICAgICAgIG1hbmlmZXN0LmZpbGVzW2Bza2lsbHMvJHtza2lsbE5hbWV9LyR7cmVsfWBdID0gaGFzaDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGZzLmV4aXN0c1N5bmMoYWdlbnRzRGlyKSkge1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmcy5yZWFkZGlyU3luYyhhZ2VudHNEaXIpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCdlei0nKSAmJiBmaWxlLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICBtYW5pZmVzdC5maWxlc1snYWdlbnRzLycgKyBmaWxlXSA9IGZpbGVIYXNoKHBhdGguam9pbihhZ2VudHNEaXIsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihjb25maWdEaXIsIE1BTklGRVNUX05BTUUpLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMikpO1xuICByZXR1cm4gbWFuaWZlc3Q7XG59XG5cbi8qKlxuICogRGV0ZWN0IHVzZXItbW9kaWZpZWQgRVpfQWdlbnRzIGZpbGVzIGJ5IGNvbXBhcmluZyBhZ2FpbnN0IGluc3RhbGwgbWFuaWZlc3QuXG4gKiBCYWNrcyB1cCBtb2RpZmllZCBmaWxlcyB0byBlei1sb2NhbC1wYXRjaGVzLyBmb3IgcmVhcHBseSBhZnRlciB1cGRhdGUuXG4gKi9cbmZ1bmN0aW9uIHNhdmVMb2NhbFBhdGNoZXMoY29uZmlnRGlyKSB7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIE1BTklGRVNUX05BTUUpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkgcmV0dXJuIFtdO1xuXG4gIGxldCBtYW5pZmVzdDtcbiAgdHJ5IHsgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsICd1dGY4JykpOyB9IGNhdGNoIHsgcmV0dXJuIFtdOyB9XG5cbiAgY29uc3QgcGF0Y2hlc0RpciA9IHBhdGguam9pbihjb25maWdEaXIsIFBBVENIRVNfRElSX05BTUUpO1xuICBjb25zdCBtb2RpZmllZDogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtyZWxQYXRoLCBvcmlnaW5hbEhhc2hdIG9mIE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0LmZpbGVzIHx8IHt9KSkge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgcmVsUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZ1bGxQYXRoKSkgY29udGludWU7XG4gICAgY29uc3QgY3VycmVudEhhc2ggPSBmaWxlSGFzaChmdWxsUGF0aCk7XG4gICAgaWYgKGN1cnJlbnRIYXNoICE9PSBvcmlnaW5hbEhhc2gpIHtcbiAgICAgIGNvbnN0IGJhY2t1cFBhdGggPSBwYXRoLmpvaW4ocGF0Y2hlc0RpciwgcmVsUGF0aCk7XG4gICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKGJhY2t1cFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGZzLmNvcHlGaWxlU3luYyhmdWxsUGF0aCwgYmFja3VwUGF0aCk7XG4gICAgICBtb2RpZmllZC5wdXNoKHJlbFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtb2RpZmllZC5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbWV0YSA9IHtcbiAgICAgIGJhY2tlZF91cF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZnJvbV92ZXJzaW9uOiBtYW5pZmVzdC52ZXJzaW9uLFxuICAgICAgZmlsZXM6IG1vZGlmaWVkXG4gICAgfTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihwYXRjaGVzRGlyLCAnYmFja3VwLW1ldGEuanNvbicpLCBKU09OLnN0cmluZ2lmeShtZXRhLCBudWxsLCAyKSk7XG4gICAgY29uc29sZS5sb2coJyAgJyArIHllbGxvdyArICdpJyArIHJlc2V0ICsgJyAgRm91bmQgJyArIG1vZGlmaWVkLmxlbmd0aCArICcgbG9jYWxseSBtb2RpZmllZCBFWiBmaWxlKHMpIFx1MjAxNCBiYWNrZWQgdXAgdG8gJyArIFBBVENIRVNfRElSX05BTUUgKyAnLycpO1xuICAgIGZvciAoY29uc3QgZiBvZiBtb2RpZmllZCkge1xuICAgICAgY29uc29sZS5sb2coJyAgICAgJyArIGRpbSArIGYgKyByZXNldCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtb2RpZmllZDtcbn1cblxuLyoqXG4gKiBBZnRlciBpbnN0YWxsLCByZXBvcnQgYmFja2VkLXVwIHBhdGNoZXMgZm9yIHVzZXIgdG8gcmVhcHBseS5cbiAqL1xuZnVuY3Rpb24gcmVwb3J0TG9jYWxQYXRjaGVzKGNvbmZpZ0RpciwgcnVudGltZSA9ICdjbGF1ZGUnKSB7XG4gIGNvbnN0IHBhdGNoZXNEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBQQVRDSEVTX0RJUl9OQU1FKTtcbiAgY29uc3QgbWV0YVBhdGggPSBwYXRoLmpvaW4ocGF0Y2hlc0RpciwgJ2JhY2t1cC1tZXRhLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG1ldGFQYXRoKSkgcmV0dXJuIFtdO1xuXG4gIGxldCBtZXRhO1xuICB0cnkgeyBtZXRhID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWV0YVBhdGgsICd1dGY4JykpOyB9IGNhdGNoIHsgcmV0dXJuIFtdOyB9XG5cbiAgaWYgKG1ldGEuZmlsZXMgJiYgbWV0YS5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcmVhcHBseUNvbW1hbmQgPSAocnVudGltZSA9PT0gJ29wZW5jb2RlJyB8fCBydW50aW1lID09PSAnY29waWxvdCcpXG4gICAgICA/ICcvZXotcmVhcHBseS1wYXRjaGVzJ1xuICAgICAgOiBydW50aW1lID09PSAnY29kZXgnXG4gICAgICAgID8gJyRlei1yZWFwcGx5LXBhdGNoZXMnXG4gICAgICAgIDogJy9lejpyZWFwcGx5LXBhdGNoZXMnO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICBjb25zb2xlLmxvZygnICAnICsgeWVsbG93ICsgJ0xvY2FsIHBhdGNoZXMgZGV0ZWN0ZWQnICsgcmVzZXQgKyAnIChmcm9tIHYnICsgbWV0YS5mcm9tX3ZlcnNpb24gKyAnKTonKTtcbiAgICBmb3IgKGNvbnN0IGYgb2YgbWV0YS5maWxlcykge1xuICAgICAgY29uc29sZS5sb2coJyAgICAgJyArIGN5YW4gKyBmICsgcmVzZXQpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgY29uc29sZS5sb2coJyAgWW91ciBtb2RpZmljYXRpb25zIGFyZSBzYXZlZCBpbiAnICsgY3lhbiArIFBBVENIRVNfRElSX05BTUUgKyAnLycgKyByZXNldCk7XG4gICAgY29uc29sZS5sb2coJyAgUnVuICcgKyBjeWFuICsgcmVhcHBseUNvbW1hbmQgKyByZXNldCArICcgdG8gbWVyZ2UgdGhlbSBpbnRvIHRoZSBuZXcgdmVyc2lvbi4nKTtcbiAgICBjb25zb2xlLmxvZygnICBPciBtYW51YWxseSBjb21wYXJlIGFuZCBtZXJnZSB0aGUgZmlsZXMuJyk7XG4gICAgY29uc29sZS5sb2coJycpO1xuICB9XG4gIHJldHVybiBtZXRhLmZpbGVzIHx8IFtdO1xufVxuXG5mdW5jdGlvbiBpbnN0YWxsKGlzR2xvYmFsOiBib29sZWFuLCBydW50aW1lID0gJ2NsYXVkZScpOiB7IHNldHRpbmdzUGF0aDogc3RyaW5nIHwgbnVsbDsgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDsgc3RhdHVzbGluZUNvbW1hbmQ6IHN0cmluZyB8IG51bGw7IHJ1bnRpbWU6IHN0cmluZyB9IHtcbiAgY29uc3QgaXNPcGVuY29kZSA9IHJ1bnRpbWUgPT09ICdvcGVuY29kZSc7XG4gIGNvbnN0IGlzR2VtaW5pID0gcnVudGltZSA9PT0gJ2dlbWluaSc7XG4gIGNvbnN0IGlzQ29kZXggPSBydW50aW1lID09PSAnY29kZXgnO1xuICBjb25zdCBpc0NvcGlsb3QgPSBydW50aW1lID09PSAnY29waWxvdCc7XG4gIGNvbnN0IGlzUXdlbiA9IHJ1bnRpbWUgPT09ICdxd2VuJztcbiAgY29uc3QgaXNLaW1pID0gcnVudGltZSA9PT0gJ2tpbWknO1xuICBjb25zdCBkaXJOYW1lID0gZ2V0RGlyTmFtZShydW50aW1lKTtcbiAgXG4gIC8vIFJlc29sdmUgcGFja2FnZSByb290IGJ5IGZpbmRpbmcgZGlyZWN0b3J5IGNvbnRhaW5pbmcgcGFja2FnZS5qc29uXG4gIC8vIFRoaXMgd29ya3Mgd2hldGhlciBydW5uaW5nIGZyb20gZGlzdC9iaW4vIChpbnN0YWxsZWQpIG9yIGJpbi8gKGRldmVsb3BtZW50KVxuICBsZXQgcGtnUm9vdCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBrZ1Jvb3QsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUocGtnUm9vdCk7XG4gICAgaWYgKHBhcmVudCA9PT0gcGtnUm9vdCkge1xuICAgICAgLy8gUmVhY2hlZCBmaWxlc3lzdGVtIHJvb3QsIGZhbGxiYWNrIHRvIF9fZGlybmFtZVxuICAgICAgcGtnUm9vdCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHBrZ1Jvb3QgPSBwYXJlbnQ7XG4gIH1cbiAgY29uc3Qgc3JjID0gcGtnUm9vdDtcblxuICAvLyBHZXQgdGhlIHRhcmdldCBkaXJlY3RvcnkgYmFzZWQgb24gcnVudGltZSBhbmQgaW5zdGFsbCB0eXBlXG4gIGNvbnN0IHRhcmdldERpciA9IGlzR2xvYmFsXG4gICAgPyBnZXRHbG9iYWxEaXIocnVudGltZSwgZXhwbGljaXRDb25maWdEaXIpXG4gICAgOiBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgZGlyTmFtZSk7XG5cbiAgY29uc3QgbG9jYXRpb25MYWJlbCA9IGlzR2xvYmFsXG4gICAgPyB0YXJnZXREaXIucmVwbGFjZShvcy5ob21lZGlyKCksICd+JylcbiAgICA6IHRhcmdldERpci5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcuJyk7XG5cbiAgLy8gUGF0aCBwcmVmaXggZm9yIGZpbGUgcmVmZXJlbmNlcyBpbiBtYXJrZG93biBjb250ZW50XG4gIC8vIEZvciBnbG9iYWwgaW5zdGFsbHM6IHVzZSB0aWxkZS1iYXNlZCBwYXRoICh+Ly5jbGF1ZGUvKSB0byBhdm9pZCBiYWtpbmdcbiAgLy8gYWJzb2x1dGUgcGF0aHMgKGNvbnRhaW5pbmcgT1MgdXNlcm5hbWUpIGludG8gdGVtcGxhdGVzXG4gIC8vIEZvciBsb2NhbCBpbnN0YWxsczogdXNlIHJlbGF0aXZlXG4gIGNvbnN0IHBhdGhQcmVmaXggPSBpc0dsb2JhbFxuICAgID8gYCR7dGFyZ2V0RGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKS5yZXBsYWNlKG9zLmhvbWVkaXIoKS5yZXBsYWNlKC9cXFxcL2csICcvJyksICd+Jyl9L2BcbiAgICA6IGAuLyR7ZGlyTmFtZX0vYDtcblxuICBsZXQgcnVudGltZUxhYmVsID0gJ0NsYXVkZSBDb2RlJztcbiAgaWYgKGlzT3BlbmNvZGUpIHJ1bnRpbWVMYWJlbCA9ICdPcGVuQ29kZSc7XG4gIGlmIChpc0dlbWluaSkgcnVudGltZUxhYmVsID0gJ0dlbWluaSc7XG4gIGlmIChpc0NvZGV4KSBydW50aW1lTGFiZWwgPSAnQ29kZXgnO1xuICBpZiAoaXNDb3BpbG90KSBydW50aW1lTGFiZWwgPSAnQ29waWxvdCc7XG4gIGlmIChpc1F3ZW4pIHJ1bnRpbWVMYWJlbCA9ICdRd2VuIENvZGUnO1xuICBpZiAoaXNLaW1pKSBydW50aW1lTGFiZWwgPSAnS2ltaSBDb2RlJztcblxuICBjb25zb2xlLmxvZyhgICBJbnN0YWxsaW5nIGZvciAke2N5YW59JHtydW50aW1lTGFiZWx9JHtyZXNldH0gdG8gJHtjeWFufSR7bG9jYXRpb25MYWJlbH0ke3Jlc2V0fVxcbmApO1xuXG4gIC8vIFRyYWNrIGluc3RhbGxhdGlvbiBmYWlsdXJlc1xuICBjb25zdCBmYWlsdXJlczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBTYXZlIGFueSBsb2NhbGx5IG1vZGlmaWVkIEVaX0FnZW50cyBmaWxlcyBiZWZvcmUgdGhleSBnZXQgd2lwZWRcbiAgc2F2ZUxvY2FsUGF0Y2hlcyh0YXJnZXREaXIpO1xuXG4gIC8vIENsZWFuIHVwIG9ycGhhbmVkIGZpbGVzIGZyb20gcHJldmlvdXMgdmVyc2lvbnNcbiAgY2xlYW51cE9ycGhhbmVkRmlsZXModGFyZ2V0RGlyKTtcblxuICAvLyBPcGVuQ29kZSB1c2VzIGNvbW1hbmQvIChmbGF0KSwgQ29kZXgvQ29waWxvdC9Rd2VuIHVzZSBza2lsbHMvLCBDbGF1ZGUvR2VtaW5pIHVzZSBjb21tYW5kcy9lei9cbiAgaWYgKGlzT3BlbmNvZGUpIHtcbiAgICAvLyBPcGVuQ29kZTogZmxhdCBzdHJ1Y3R1cmUgaW4gY29tbWFuZC8gZGlyZWN0b3J5XG4gICAgY29uc3QgY29tbWFuZERpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kJyk7XG4gICAgZnMubWtkaXJTeW5jKGNvbW1hbmREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gQ29weSBjb21tYW5kcy9lei8qLm1kIGFzIGNvbW1hbmQvZXotKi5tZCAoZmxhdHRlbiBzdHJ1Y3R1cmUpXG4gICAgY29uc3QgZXpTcmMgPSBwYXRoLmpvaW4oc3JjLCAnY29tbWFuZHMnLCAnZXonKTtcbiAgICBjb3B5RmxhdHRlbmVkQ29tbWFuZHMoZXpTcmMsIGNvbW1hbmREaXIsICdleicsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpO1xuICAgIGlmICh2ZXJpZnlJbnN0YWxsZWQoY29tbWFuZERpciwgJ2NvbW1hbmQvZXotKicpKSB7XG4gICAgICBjb25zdCBjb3VudCA9IGZzLnJlYWRkaXJTeW5jKGNvbW1hbmREaXIpLmZpbHRlcihmID0+IGYuc3RhcnRzV2l0aCgnZXotJykpLmxlbmd0aDtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkICR7Y291bnR9IGNvbW1hbmRzIHRvIGNvbW1hbmQvYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZhaWx1cmVzLnB1c2goJ2NvbW1hbmQvZXotKicpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0NvZGV4IHx8IGlzS2ltaSkge1xuICAgIC8vIENvZGV4LCBLaW1pOiBza2lsbHMgc3RydWN0dXJlIGluIHNraWxscy8gZGlyZWN0b3J5XG4gICAgY29uc3Qgc2tpbGxzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NraWxscycpO1xuICAgIGNvbnN0IGV6U3JjID0gcGF0aC5qb2luKHNyYywgJ2NvbW1hbmRzJywgJ2V6Jyk7XG4gICAgaWYgKGlzS2ltaSkge1xuICAgICAgY29weUNvbW1hbmRzQXNLaW1pU2tpbGxzKGV6U3JjLCBza2lsbHNEaXIsICdleicsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb3B5Q29tbWFuZHNBc0NvZGV4U2tpbGxzKGV6U3JjLCBza2lsbHNEaXIsICdleicsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YWxsZWRTa2lsbE5hbWVzID0gbGlzdENvZGV4U2tpbGxOYW1lcyhza2lsbHNEaXIpO1xuICAgIGlmIChpbnN0YWxsZWRTa2lsbE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkICR7aW5zdGFsbGVkU2tpbGxOYW1lcy5sZW5ndGh9IHNraWxscyB0byBza2lsbHMvYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZhaWx1cmVzLnB1c2goJ3NraWxscy9lei0qJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUXdlbikge1xuICAgIC8vIFF3ZW4gQ29kZTogY29tbWFuZHMgc3RydWN0dXJlIGluIGNvbW1hbmRzL2V6LyBkaXJlY3RvcnkgKGxpa2UgQ2xhdWRlIENvZGUvR2VtaW5pKVxuICAgIC8vIFF3ZW4gQ29kZSB1c2VzIH4vLnF3ZW4vY29tbWFuZHMvZXovKi5tZCwgTk9UIH4vLnF3ZW4vc2tpbGxzL1xuICAgIGNvbnN0IGNvbW1hbmRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvbW1hbmRzJyk7XG4gICAgY29uc3QgZXpDb21tYW5kc0RpciA9IHBhdGguam9pbihjb21tYW5kc0RpciwgJ2V6Jyk7XG4gICAgZnMubWtkaXJTeW5jKGV6Q29tbWFuZHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIFxuICAgIGNvbnN0IGV6U3JjID0gcGF0aC5qb2luKHNyYywgJ2NvbW1hbmRzJywgJ2V6Jyk7XG4gICAgY29weUNvbW1hbmRzQXNRd2VuQ29tbWFuZHMoZXpTcmMsIGV6Q29tbWFuZHNEaXIsICdleicsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpO1xuICAgIFxuICAgIGlmIChmcy5leGlzdHNTeW5jKGV6Q29tbWFuZHNEaXIpKSB7XG4gICAgICBjb25zdCBjb3VudCA9IGZzLnJlYWRkaXJTeW5jKGV6Q29tbWFuZHNEaXIpLmZpbHRlcihmID0+IGYuZW5kc1dpdGgoJy5tZCcpKS5sZW5ndGg7XG4gICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkICR7Y291bnR9IGNvbW1hbmRzIHRvIGNvbW1hbmRzL2V6L2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmFpbHVyZXMucHVzaCgnY29tbWFuZHMvZXovKi5tZCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdjb21tYW5kcy9lei8qLm1kJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzQ29waWxvdCkge1xuICAgIGNvbnN0IHNraWxsc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdza2lsbHMnKTtcbiAgICBjb25zdCBlelNyYyA9IHBhdGguam9pbihzcmMsICdjb21tYW5kcycsICdleicpO1xuICAgIGNvcHlDb21tYW5kc0FzQ29waWxvdFNraWxscyhlelNyYywgc2tpbGxzRGlyLCAnZXonLCBpc0dsb2JhbCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoc2tpbGxzRGlyKSkge1xuICAgICAgY29uc3QgY291bnQgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgICAgICAuZmlsdGVyKGUgPT4gZS5pc0RpcmVjdG9yeSgpICYmIGUubmFtZS5zdGFydHNXaXRoKCdlei0nKSkubGVuZ3RoO1xuICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCAke2NvdW50fSBza2lsbHMgdG8gc2tpbGxzL2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmFpbHVyZXMucHVzaCgnc2tpbGxzL2V6LSonKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZmFpbHVyZXMucHVzaCgnc2tpbGxzL2V6LSonKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gQ2xhdWRlIENvZGUgJiBHZW1pbmk6IG5lc3RlZCBzdHJ1Y3R1cmUgaW4gY29tbWFuZHMvIGRpcmVjdG9yeVxuICAgIGNvbnN0IGNvbW1hbmRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvbW1hbmRzJyk7XG4gICAgZnMubWtkaXJTeW5jKGNvbW1hbmRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGV6U3JjID0gcGF0aC5qb2luKHNyYywgJ2NvbW1hbmRzJywgJ2V6Jyk7XG4gICAgY29uc3QgZXpEZXN0ID0gcGF0aC5qb2luKGNvbW1hbmRzRGlyLCAnZXonKTtcbiAgICBjb3B5V2l0aFBhdGhSZXBsYWNlbWVudChlelNyYywgZXpEZXN0LCBwYXRoUHJlZml4LCBydW50aW1lLCB0cnVlLCBpc0dsb2JhbCk7XG4gICAgaWYgKHZlcmlmeUluc3RhbGxlZChlekRlc3QsICdjb21tYW5kcy9leicpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCBjb21tYW5kcy9lemApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdjb21tYW5kcy9leicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvcHkgZXotYWdlbnRzIHNraWxsIHdpdGggcGF0aCByZXBsYWNlbWVudFxuICBjb25zdCBza2lsbFNyYyA9IHBhdGguam9pbihzcmMsICdlei1hZ2VudHMnKTtcbiAgY29uc3Qgc2tpbGxEZXN0ID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2V6LWFnZW50cycpO1xuICBjb3B5V2l0aFBhdGhSZXBsYWNlbWVudChza2lsbFNyYywgc2tpbGxEZXN0LCBwYXRoUHJlZml4LCBydW50aW1lLCBmYWxzZSwgaXNHbG9iYWwpO1xuICBpZiAodmVyaWZ5SW5zdGFsbGVkKHNraWxsRGVzdCwgJ2V6LWFnZW50cycpKSB7XG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgZXotYWdlbnRzYCk7XG4gIH0gZWxzZSB7XG4gICAgZmFpbHVyZXMucHVzaCgnZXotYWdlbnRzJyk7XG4gIH1cblxuICAvLyBDb3B5IGRpc3QgZm9sZGVyIChjb21waWxlZCBiaW5hcmllcykgLSByZXF1aXJlZCBmb3IgZXotdG9vbHMuanMgdG8gd29ya1xuICBjb25zdCBkaXN0U3JjID0gcGF0aC5qb2luKHNyYywgJ2Rpc3QnKTtcbiAgY29uc3QgZGlzdERlc3QgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnZXotYWdlbnRzJywgJ2Rpc3QnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGlzdFNyYykpIHtcbiAgICBmcy5ta2RpclN5bmMoZGlzdERlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvcHlEaXJlY3RvcnlSZWN1cnNpdmUoZGlzdFNyYywgZGlzdERlc3QpO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gQ29waWVkIGRpc3QvIHRvIGV6LWFnZW50cy9kaXN0L2ApO1xuICB9XG5cbiAgLy8gQ29weSBob29rcyBmb2xkZXIgKGNvbXBpbGVkIGhvb2sgc2NyaXB0cylcbiAgY29uc3QgaG9va3NTcmMgPSBwYXRoLmpvaW4oc3JjLCAnaG9va3MnKTtcbiAgY29uc3QgaG9va3NEZXN0ID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2V6LWFnZW50cycsICdob29rcycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhob29rc1NyYykpIHtcbiAgICBmcy5ta2RpclN5bmMoaG9va3NEZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBjb3B5RGlyZWN0b3J5UmVjdXJzaXZlKGhvb2tzU3JjLCBob29rc0Rlc3QpO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gQ29waWVkIGhvb2tzLyB0byBlei1hZ2VudHMvaG9va3MvYCk7XG4gIH1cblxuICAvLyBDb3B5IEVaIEFnZW50cyBza2lsbHMgdG8gZ2xvYmFsIGRpcmVjdG9yeSAoJEhPTUUvLnNraWxscy9lei1hZ2VudHMvKVxuICBjb3B5U2tpbGxzKHNyYywgaXNHbG9iYWwsIHJ1bnRpbWUpO1xuXG4gIC8vIENvcHkgYWdlbnRzIHRvIGFnZW50cyBkaXJlY3RvcnlcbiAgY29uc3QgYWdlbnRzU3JjID0gcGF0aC5qb2luKHNyYywgJ2FnZW50cycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhhZ2VudHNTcmMpKSB7XG4gICAgY29uc3QgYWdlbnRzRGVzdCA9IHBhdGguam9pbih0YXJnZXREaXIsICdhZ2VudHMnKTtcbiAgICBmcy5ta2RpclN5bmMoYWdlbnRzRGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZW1vdmUgb2xkIEVaX0FnZW50cyBhZ2VudHMgKGV6LSoubWQpIGJlZm9yZSBjb3B5aW5nIG5ldyBvbmVzXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYWdlbnRzRGVzdCkpIHtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmcy5yZWFkZGlyU3luYyhhZ2VudHNEZXN0KSkge1xuICAgICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCdlei0nKSAmJiBmaWxlLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKGFnZW50c0Rlc3QsIGZpbGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvcHkgbmV3IGFnZW50c1xuICAgIGNvbnN0IGFnZW50RW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGFnZW50c1NyYywgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgYWdlbnRFbnRyaWVzKSB7XG4gICAgICBpZiAoZW50cnkuaXNGaWxlKCkgJiYgZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGFnZW50c1NyYywgZW50cnkubmFtZSksICd1dGY4Jyk7XG4gICAgICAgIC8vIFJlcGxhY2Ugfi8uY2xhdWRlLyBhbmQgJEhPTUUvLmNsYXVkZS8gYXMgdGhleSBhcmUgdGhlIHNvdXJjZSBvZiB0cnV0aCBpbiB0aGUgcmVwb1xuICAgICAgICBjb25zdCBkaXJSZWdleCA9IC9+XFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnN0IGhvbWVEaXJSZWdleCA9IC9cXCRIT01FXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGlmICghaXNDb3BpbG90KSB7XG4gICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShkaXJSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShob21lRGlyUmVnZXgsIHRvSG9tZVByZWZpeChwYXRoUHJlZml4KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50LCBnZXRDb21taXRBdHRyaWJ1dGlvbihydW50aW1lKSk7XG4gICAgICAgIC8vIENvbnZlcnQgZnJvbnRtYXR0ZXIgZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eVxuICAgICAgICBpZiAoaXNPcGVuY29kZSkge1xuICAgICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9PcGVuY29kZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzR2VtaW5pKSB7XG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb0dlbWluaUFnZW50KGNvbnRlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ29kZXgpIHtcbiAgICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZUFnZW50VG9Db2RleEFnZW50KGNvbnRlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ29waWxvdCkge1xuICAgICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvcGlsb3RBZ2VudChjb250ZW50LCBpc0dsb2JhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNRd2VuKSB7XG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb1F3ZW5BZ2VudChjb250ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0tpbWkpIHtcbiAgICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvS2ltaUFnZW50KGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlc3ROYW1lID0gaXNDb3BpbG90ID8gZW50cnkubmFtZS5yZXBsYWNlKCcubWQnLCAnLmFnZW50Lm1kJykgOiBlbnRyeS5uYW1lO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihhZ2VudHNEZXN0LCBkZXN0TmFtZSksIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmVyaWZ5SW5zdGFsbGVkKGFnZW50c0Rlc3QsICdhZ2VudHMnKSkge1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgYWdlbnRzYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZhaWx1cmVzLnB1c2goJ2FnZW50cycpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvcHkgQ0hBTkdFTE9HLm1kXG4gIGNvbnN0IGNoYW5nZWxvZ1NyYyA9IHBhdGguam9pbihzcmMsICdDSEFOR0VMT0cubWQnKTtcbiAgY29uc3QgY2hhbmdlbG9nRGVzdCA9IHBhdGguam9pbih0YXJnZXREaXIsICdlei1hZ2VudHMnLCAnQ0hBTkdFTE9HLm1kJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGNoYW5nZWxvZ1NyYykpIHtcbiAgICBmcy5jb3B5RmlsZVN5bmMoY2hhbmdlbG9nU3JjLCBjaGFuZ2Vsb2dEZXN0KTtcbiAgICBpZiAodmVyaWZ5RmlsZUluc3RhbGxlZChjaGFuZ2Vsb2dEZXN0LCAnQ0hBTkdFTE9HLm1kJykpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkIENIQU5HRUxPRy5tZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdDSEFOR0VMT0cubWQnKTtcbiAgICB9XG4gIH1cblxuICAvLyBXcml0ZSBWRVJTSU9OIGZpbGVcbiAgY29uc3QgdmVyc2lvbkRlc3QgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnZXotYWdlbnRzJywgJ1ZFUlNJT04nKTtcbiAgZnMud3JpdGVGaWxlU3luYyh2ZXJzaW9uRGVzdCwgcGtnLnZlcnNpb24pO1xuICBpZiAodmVyaWZ5RmlsZUluc3RhbGxlZCh2ZXJzaW9uRGVzdCwgJ1ZFUlNJT04nKSkge1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gV3JvdGUgVkVSU0lPTiAoJHtwa2cudmVyc2lvbn0pYCk7XG4gIH0gZWxzZSB7XG4gICAgZmFpbHVyZXMucHVzaCgnVkVSU0lPTicpO1xuICB9XG5cbiAgaWYgKCFpc0NvZGV4ICYmICFpc0NvcGlsb3QgJiYgIWlzUXdlbiAmJiAhaXNLaW1pKSB7XG4gICAgLy8gV3JpdGUgcGFja2FnZS5qc29uIHRvIGZvcmNlIENvbW1vbkpTIG1vZGUgZm9yIEVaIHNjcmlwdHNcbiAgICAvLyBQcmV2ZW50cyBcInJlcXVpcmUgaXMgbm90IGRlZmluZWRcIiBlcnJvcnMgd2hlbiBwcm9qZWN0IGhhcyBcInR5cGVcIjogXCJtb2R1bGVcIlxuICAgIC8vIE5vZGUuanMgd2Fsa3MgdXAgbG9va2luZyBmb3IgcGFja2FnZS5qc29uIC0gdGhpcyBzdG9wcyBpbmhlcml0YW5jZSBmcm9tIHByb2plY3RcbiAgICBjb25zdCBwa2dKc29uRGVzdCA9IHBhdGguam9pbih0YXJnZXREaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBrZ0pzb25EZXN0LCAne1widHlwZVwiOlwiY29tbW9uanNcIn1cXG4nKTtcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFdyb3RlIHBhY2thZ2UuanNvbiAoQ29tbW9uSlMgbW9kZSlgKTtcblxuICAgIC8vIENvcHkgaG9va3MgZnJvbSBkaXN0LyAoYnVuZGxlZCB3aXRoIGRlcGVuZGVuY2llcylcbiAgICAvLyBUZW1wbGF0ZSBwYXRocyBmb3IgdGhlIHRhcmdldCBydW50aW1lIChyZXBsYWNlcyAnLmNsYXVkZScgd2l0aCBjb3JyZWN0IGNvbmZpZyBkaXIpXG4gICAgY29uc3QgaG9va3NTcmMgPSBwYXRoLmpvaW4oc3JjLCAnaG9va3MnLCAnZGlzdCcpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGhvb2tzU3JjKSkge1xuICAgICAgY29uc3QgaG9va3NEZXN0ID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2hvb2tzJyk7XG4gICAgICBmcy5ta2RpclN5bmMoaG9va3NEZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IGhvb2tFbnRyaWVzID0gZnMucmVhZGRpclN5bmMoaG9va3NTcmMpO1xuICAgICAgY29uc3QgY29uZmlnRGlyUmVwbGFjZW1lbnQgPSBnZXRDb25maWdEaXJGcm9tSG9tZShydW50aW1lLCBpc0dsb2JhbCk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGhvb2tFbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IHNyY0ZpbGUgPSBwYXRoLmpvaW4oaG9va3NTcmMsIGVudHJ5KTtcbiAgICAgICAgaWYgKGZzLnN0YXRTeW5jKHNyY0ZpbGUpLmlzRmlsZSgpKSB7XG4gICAgICAgICAgY29uc3QgZGVzdEZpbGUgPSBwYXRoLmpvaW4oaG9va3NEZXN0LCBlbnRyeSk7XG4gICAgICAgICAgLy8gVGVtcGxhdGUgLmpzIGZpbGVzIHRvIHJlcGxhY2UgJy5jbGF1ZGUnIHdpdGggcnVudGltZS1zcGVjaWZpYyBjb25maWcgZGlyXG4gICAgICAgICAgaWYgKGVudHJ5LmVuZHNXaXRoKCcuanMnKSkge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc3JjRmlsZSwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLydcXC5jbGF1ZGUnL2csIGNvbmZpZ0RpclJlcGxhY2VtZW50KTtcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZGVzdEZpbGUsIGNvbnRlbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoc3JjRmlsZSwgZGVzdEZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHZlcmlmeUluc3RhbGxlZChob29rc0Rlc3QsICdob29rcycpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkIGhvb2tzIChidW5kbGVkKWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmFpbHVyZXMucHVzaCgnaG9va3MnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZmFpbHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFxcbiAgJHt5ZWxsb3d9SW5zdGFsbGF0aW9uIGluY29tcGxldGUhJHtyZXNldH0gRmFpbGVkOiAke2ZhaWx1cmVzLmpvaW4oJywgJyl9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gV3JpdGUgZmlsZSBtYW5pZmVzdCBmb3IgZnV0dXJlIG1vZGlmaWNhdGlvbiBkZXRlY3Rpb25cbiAgd3JpdGVNYW5pZmVzdCh0YXJnZXREaXIsIHJ1bnRpbWUpO1xuICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFdyb3RlIGZpbGUgbWFuaWZlc3QgKCR7TUFOSUZFU1RfTkFNRX0pYCk7XG5cbiAgLy8gUmVwb3J0IGFueSBiYWNrZWQtdXAgbG9jYWwgcGF0Y2hlc1xuICByZXBvcnRMb2NhbFBhdGNoZXModGFyZ2V0RGlyLCBydW50aW1lKTtcblxuICAvLyBWZXJpZnkgbm8gbGVha2VkIC5jbGF1ZGUgcGF0aHMgaW4gbm9uLUNsYXVkZSBydW50aW1lc1xuICBpZiAocnVudGltZSAhPT0gJ2NsYXVkZScpIHtcbiAgICBjb25zdCBsZWFrZWRQYXRoczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGNvdW50OiBudW1iZXIgfT4gPSBbXTtcbiAgICBmdW5jdGlvbiBzY2FuRm9yTGVha2VkUGF0aHMoZGlyOiBzdHJpbmcpIHtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSByZXR1cm47XG4gICAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICBzY2FuRm9yTGVha2VkUGF0aHMoZnVsbFBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKChlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSB8fCBlbnRyeS5uYW1lLmVuZHNXaXRoKCcudG9tbCcpKSAmJiBlbnRyeS5uYW1lICE9PSAnQ0hBTkdFTE9HLm1kJykge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2goLyg/On58XFwkSE9NRSlcXC9cXC5jbGF1ZGVcXGIvZyk7XG4gICAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGxlYWtlZFBhdGhzLnB1c2goeyBmaWxlOiBmdWxsUGF0aC5yZXBsYWNlKHRhcmdldERpciArICcvJywgJycpLCBjb3VudDogbWF0Y2hlcy5sZW5ndGggfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHNjYW5Gb3JMZWFrZWRQYXRocyh0YXJnZXREaXIpO1xuICAgIGlmIChsZWFrZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB0b3RhbExlYWtzID0gbGVha2VkUGF0aHMucmVkdWNlKChzdW0sIGwpID0+IHN1bSArIGwuY291bnQsIDApO1xuICAgICAgY29uc29sZS53YXJuKGBcXG4gICR7eWVsbG93fVx1MjZBMCR7cmVzZXR9ICBGb3VuZCAke3RvdGFsTGVha3N9IHVucmVwbGFjZWQgLmNsYXVkZSBwYXRoIHJlZmVyZW5jZShzKSBpbiAke2xlYWtlZFBhdGhzLmxlbmd0aH0gZmlsZShzKTpgKTtcbiAgICAgIGZvciAoY29uc3QgbGVhayBvZiBsZWFrZWRQYXRocy5zbGljZSgwLCA1KSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYCAgICAgJHtkaW19JHtsZWFrLmZpbGV9JHtyZXNldH0gKCR7bGVhay5jb3VudH0pYCk7XG4gICAgICB9XG4gICAgICBpZiAobGVha2VkUGF0aHMubGVuZ3RoID4gNSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYCAgICAgJHtkaW19Li4uIGFuZCAke2xlYWtlZFBhdGhzLmxlbmd0aCAtIDV9IG1vcmUgZmlsZShzKSR7cmVzZXR9YCk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oYCAgJHtkaW19VGhlc2UgcGF0aHMgbWF5IG5vdCByZXNvbHZlIGNvcnJlY3RseSBmb3IgJHtydW50aW1lTGFiZWx9LiR7cmVzZXR9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzQ29kZXgpIHtcbiAgICAvLyBHZW5lcmF0ZSBDb2RleCBjb25maWcudG9tbCBhbmQgcGVyLWFnZW50IC50b21sIGZpbGVzXG4gICAgY29uc3QgYWdlbnRDb3VudCA9IGluc3RhbGxDb2RleENvbmZpZyh0YXJnZXREaXIsIGFnZW50c1NyYyk7XG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBHZW5lcmF0ZWQgY29uZmlnLnRvbWwgd2l0aCAke2FnZW50Q291bnR9IGFnZW50IHJvbGVzYCk7XG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBHZW5lcmF0ZWQgJHthZ2VudENvdW50fSBhZ2VudCAudG9tbCBjb25maWcgZmlsZXNgKTtcbiAgICByZXR1cm4geyBzZXR0aW5nc1BhdGg6IG51bGwsIHNldHRpbmdzOiBudWxsLCBzdGF0dXNsaW5lQ29tbWFuZDogbnVsbCwgcnVudGltZSB9O1xuICB9XG5cbiAgaWYgKGlzQ29waWxvdCkge1xuICAgIC8vIEdlbmVyYXRlIGNvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kXG4gICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2V6LWFnZW50cycsICd0ZW1wbGF0ZXMnLCAnY29waWxvdC1pbnN0cnVjdGlvbnMubWQnKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnNQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCAndXRmOCcpO1xuICAgICAgbWVyZ2VDb3BpbG90SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uc1BhdGgsIHRlbXBsYXRlKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gR2VuZXJhdGVkIGNvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kYCk7XG4gICAgfVxuICAgIC8vIENvcGlsb3Q6IG5vIHNldHRpbmdzLmpzb24sIG5vIGhvb2tzLCBubyBzdGF0dXNsaW5lIChsaWtlIENvZGV4KVxuICAgIHJldHVybiB7IHNldHRpbmdzUGF0aDogbnVsbCwgc2V0dGluZ3M6IG51bGwsIHN0YXR1c2xpbmVDb21tYW5kOiBudWxsLCBydW50aW1lIH07XG4gIH1cblxuICBpZiAoaXNRd2VuIHx8IGlzS2ltaSkge1xuICAgIC8vIFF3ZW4vS2ltaTogbm8gc2V0dGluZ3MuanNvbiBob29rcywgbm8gc3RhdHVzbGluZSAobGlrZSBDb2RleC9Db3BpbG90KVxuICAgIC8vIFNraWxscyBhcmUgaW5zdGFsbGVkIGRpcmVjdGx5IGluIHNraWxscy9lei0qL1NLSUxMLm1kXG4gICAgcmV0dXJuIHsgc2V0dGluZ3NQYXRoOiBudWxsLCBzZXR0aW5nczogbnVsbCwgc3RhdHVzbGluZUNvbW1hbmQ6IG51bGwsIHJ1bnRpbWUgfTtcbiAgfVxuXG4gIC8vIENvbmZpZ3VyZSBzdGF0dXNsaW5lIGFuZCBob29rcyBpbiBzZXR0aW5ncy5qc29uXG4gIC8vIEdlbWluaSB1c2VzIEFmdGVyVG9vbCBpbnN0ZWFkIG9mIFBvc3RUb29sVXNlIGZvciBwb3N0LXRvb2wgaG9va3NcbiAgY29uc3QgcG9zdFRvb2xFdmVudCA9IHJ1bnRpbWUgPT09ICdnZW1pbmknID8gJ0FmdGVyVG9vbCcgOiAnUG9zdFRvb2xVc2UnO1xuICBjb25zdCBzZXR0aW5nc1BhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnc2V0dGluZ3MuanNvbicpO1xuICBjb25zdCBzZXR0aW5ncyA9IGNsZWFudXBPcnBoYW5lZEhvb2tzKHJlYWRTZXR0aW5ncyhzZXR0aW5nc1BhdGgpKTtcbiAgY29uc3Qgc3RhdHVzbGluZUNvbW1hbmQgPSBpc0dsb2JhbFxuICAgID8gYnVpbGRIb29rQ29tbWFuZCh0YXJnZXREaXIsICdlei1zdGF0dXNsaW5lLmpzJylcbiAgICA6ICdub2RlICcgKyBkaXJOYW1lICsgJy9ob29rcy9lei1zdGF0dXNsaW5lLmpzJztcbiAgY29uc3QgdXBkYXRlQ2hlY2tDb21tYW5kID0gaXNHbG9iYWxcbiAgICA/IGJ1aWxkSG9va0NvbW1hbmQodGFyZ2V0RGlyLCAnZXotY2hlY2stdXBkYXRlLmpzJylcbiAgICA6ICdub2RlICcgKyBkaXJOYW1lICsgJy9ob29rcy9lei1jaGVjay11cGRhdGUuanMnO1xuICBjb25zdCBjb250ZXh0TW9uaXRvckNvbW1hbmQgPSBpc0dsb2JhbFxuICAgID8gYnVpbGRIb29rQ29tbWFuZCh0YXJnZXREaXIsICdlei1jb250ZXh0LW1vbml0b3IuanMnKVxuICAgIDogJ25vZGUgJyArIGRpck5hbWUgKyAnL2hvb2tzL2V6LWNvbnRleHQtbW9uaXRvci5qcyc7XG5cbiAgLy8gRW5hYmxlIGV4cGVyaW1lbnRhbCBhZ2VudHMgZm9yIEdlbWluaSBDTEkgKHJlcXVpcmVkIGZvciBjdXN0b20gc3ViLWFnZW50cylcbiAgaWYgKGlzR2VtaW5pKSB7XG4gICAgaWYgKCFzZXR0aW5ncy5leHBlcmltZW50YWwpIHtcbiAgICAgIHNldHRpbmdzLmV4cGVyaW1lbnRhbCA9IHt9O1xuICAgIH1cbiAgICBpZiAoIXNldHRpbmdzLmV4cGVyaW1lbnRhbC5lbmFibGVBZ2VudHMpIHtcbiAgICAgIHNldHRpbmdzLmV4cGVyaW1lbnRhbC5lbmFibGVBZ2VudHMgPSB0cnVlO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBFbmFibGVkIGV4cGVyaW1lbnRhbCBhZ2VudHNgKTtcbiAgICB9XG4gIH1cblxuICAvLyBDb25maWd1cmUgU2Vzc2lvblN0YXJ0IGhvb2sgZm9yIHVwZGF0ZSBjaGVja2luZyAoc2tpcCBmb3Igb3BlbmNvZGUpXG4gIGlmICghaXNPcGVuY29kZSkge1xuICAgIGlmICghc2V0dGluZ3MuaG9va3MpIHtcbiAgICAgIHNldHRpbmdzLmhvb2tzID0ge307XG4gICAgfVxuICAgIGlmICghc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0KSB7XG4gICAgICBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQgPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNFelVwZGF0ZUhvb2sgPSBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQuc29tZShlbnRyeSA9PlxuICAgICAgZW50cnkuaG9va3MgJiYgZW50cnkuaG9va3Muc29tZShoID0+IGguY29tbWFuZCAmJiBoLmNvbW1hbmQuaW5jbHVkZXMoJ2V6LWNoZWNrLXVwZGF0ZScpKVxuICAgICk7XG5cbiAgICBpZiAoIWhhc0V6VXBkYXRlSG9vaykge1xuICAgICAgc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0LnB1c2goe1xuICAgICAgICBob29rczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdjb21tYW5kJyxcbiAgICAgICAgICAgIGNvbW1hbmQ6IHVwZGF0ZUNoZWNrQ29tbWFuZFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENvbmZpZ3VyZWQgdXBkYXRlIGNoZWNrIGhvb2tgKTtcbiAgICB9XG5cbiAgICAvLyBDb25maWd1cmUgcG9zdC10b29sIGhvb2sgZm9yIGNvbnRleHQgd2luZG93IG1vbml0b3JpbmdcbiAgICBpZiAoIXNldHRpbmdzLmhvb2tzW3Bvc3RUb29sRXZlbnRdKSB7XG4gICAgICBzZXR0aW5ncy5ob29rc1twb3N0VG9vbEV2ZW50XSA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0NvbnRleHRNb25pdG9ySG9vayA9IHNldHRpbmdzLmhvb2tzW3Bvc3RUb29sRXZlbnRdLnNvbWUoZW50cnkgPT5cbiAgICAgIGVudHJ5Lmhvb2tzICYmIGVudHJ5Lmhvb2tzLnNvbWUoaCA9PiBoLmNvbW1hbmQgJiYgaC5jb21tYW5kLmluY2x1ZGVzKCdlei1jb250ZXh0LW1vbml0b3InKSlcbiAgICApO1xuXG4gICAgaWYgKCFoYXNDb250ZXh0TW9uaXRvckhvb2spIHtcbiAgICAgIHNldHRpbmdzLmhvb2tzW3Bvc3RUb29sRXZlbnRdLnB1c2goe1xuICAgICAgICBob29rczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdjb21tYW5kJyxcbiAgICAgICAgICAgIGNvbW1hbmQ6IGNvbnRleHRNb25pdG9yQ29tbWFuZFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENvbmZpZ3VyZWQgY29udGV4dCB3aW5kb3cgbW9uaXRvciBob29rYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgc2V0dGluZ3NQYXRoLCBzZXR0aW5ncywgc3RhdHVzbGluZUNvbW1hbmQsIHJ1bnRpbWUgfTtcbn1cblxuLyoqXG4gKiBBcHBseSBzdGF0dXNsaW5lIGNvbmZpZywgdGhlbiBwcmludCBjb21wbGV0aW9uIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gZmluaXNoSW5zdGFsbChzZXR0aW5nc1BhdGgsIHNldHRpbmdzLCBzdGF0dXNsaW5lQ29tbWFuZCwgc2hvdWxkSW5zdGFsbFN0YXR1c2xpbmUsIHJ1bnRpbWUgPSAnY2xhdWRlJywgaXNHbG9iYWwgPSB0cnVlKSB7XG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xuICBjb25zdCBpc0NvZGV4ID0gcnVudGltZSA9PT0gJ2NvZGV4JztcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xuICBjb25zdCBpc1F3ZW4gPSBydW50aW1lID09PSAncXdlbic7XG4gIGNvbnN0IGlzS2ltaSA9IHJ1bnRpbWUgPT09ICdraW1pJztcblxuICBpZiAoc2hvdWxkSW5zdGFsbFN0YXR1c2xpbmUgJiYgIWlzT3BlbmNvZGUgJiYgIWlzQ29kZXggJiYgIWlzQ29waWxvdCAmJiAhaXNRd2VuICYmICFpc0tpbWkpIHtcbiAgICBzZXR0aW5ncy5zdGF0dXNMaW5lID0ge1xuICAgICAgdHlwZTogJ2NvbW1hbmQnLFxuICAgICAgY29tbWFuZDogc3RhdHVzbGluZUNvbW1hbmRcbiAgICB9O1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gQ29uZmlndXJlZCBzdGF0dXNsaW5lYCk7XG4gIH1cblxuICAvLyBXcml0ZSBzZXR0aW5ncyB3aGVuIHJ1bnRpbWUgc3VwcG9ydHMgc2V0dGluZ3MuanNvblxuICBpZiAoIWlzQ29kZXggJiYgIWlzQ29waWxvdCAmJiAhaXNRd2VuICYmICFpc0tpbWkpIHtcbiAgICB3cml0ZVNldHRpbmdzKHNldHRpbmdzUGF0aCwgc2V0dGluZ3MpO1xuICB9XG5cbiAgLy8gQ29uZmlndXJlIE9wZW5Db2RlIHBlcm1pc3Npb25zXG4gIGlmIChpc09wZW5jb2RlKSB7XG4gICAgY29uZmlndXJlT3BlbmNvZGVQZXJtaXNzaW9ucyhpc0dsb2JhbCk7XG4gIH1cblxuICBsZXQgcHJvZ3JhbSA9ICdDbGF1ZGUgQ29kZSc7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSBwcm9ncmFtID0gJ09wZW5Db2RlJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdnZW1pbmknKSBwcm9ncmFtID0gJ0dlbWluaSc7XG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSBwcm9ncmFtID0gJ0NvZGV4JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb3BpbG90JykgcHJvZ3JhbSA9ICdDb3BpbG90JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcHJvZ3JhbSA9ICdRd2VuIENvZGUnO1xuICBpZiAocnVudGltZSA9PT0gJ2tpbWknKSBwcm9ncmFtID0gJ0tpbWkgQ29kZSc7XG5cbiAgbGV0IGNvbW1hbmQgPSAnL2V6Om5ldy1wcm9qZWN0JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdvcGVuY29kZScgfHwgcnVudGltZSA9PT0gJ2dlbWluaScgfHwgcnVudGltZSA9PT0gJ2NvcGlsb3QnIHx8IHJ1bnRpbWUgPT09ICdxd2VuJyB8fCBydW50aW1lID09PSAna2ltaScpIGNvbW1hbmQgPSAnL2V6LW5ldy1wcm9qZWN0JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb2RleCcpIGNvbW1hbmQgPSAnJGV6LW5ldy1wcm9qZWN0JztcbiAgY29uc29sZS5sb2coYFxuICAke2dyZWVufURvbmUhJHtyZXNldH0gT3BlbiBhIGJsYW5rIGRpcmVjdG9yeSBpbiAke3Byb2dyYW19IGFuZCBydW4gJHtjeWFufSR7Y29tbWFuZH0ke3Jlc2V0fS5cblxuICAke2N5YW59Sm9pbiB0aGUgY29tbXVuaXR5OiR7cmVzZXR9IGh0dHBzOi8vZGlzY29yZC5nZy9lei1hZ2VudHNcbmApO1xufVxuXG4vKipcbiAqIEhhbmRsZSBzdGF0dXNsaW5lIGNvbmZpZ3VyYXRpb24gd2l0aCBvcHRpb25hbCBwcm9tcHRcbiAqL1xuZnVuY3Rpb24gaGFuZGxlU3RhdHVzbGluZShzZXR0aW5ncywgaXNJbnRlcmFjdGl2ZSwgY2FsbGJhY2spIHtcbiAgY29uc3QgaGFzRXhpc3RpbmcgPSBzZXR0aW5ncy5zdGF0dXNMaW5lICE9IG51bGw7XG5cbiAgaWYgKCFoYXNFeGlzdGluZykge1xuICAgIGNhbGxiYWNrKHRydWUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChmb3JjZVN0YXR1c2xpbmUpIHtcbiAgICBjYWxsYmFjayh0cnVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzSW50ZXJhY3RpdmUpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBTa2lwcGluZyBzdGF0dXNsaW5lIChhbHJlYWR5IGNvbmZpZ3VyZWQpYCk7XG4gICAgY29uc29sZS5sb2coYCAgICBVc2UgJHtjeWFufS0tZm9yY2Utc3RhdHVzbGluZSR7cmVzZXR9IHRvIHJlcGxhY2VcXG5gKTtcbiAgICBjYWxsYmFjayhmYWxzZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmdDbWQgPSBzZXR0aW5ncy5zdGF0dXNMaW5lLmNvbW1hbmQgfHwgc2V0dGluZ3Muc3RhdHVzTGluZS51cmwgfHwgJyhjdXN0b20pJztcblxuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dFxuICB9KTtcblxuICBjb25zb2xlLmxvZyhgXG4gICR7eWVsbG93fVx1MjZBMCR7cmVzZXR9IEV4aXN0aW5nIHN0YXR1c2xpbmUgZGV0ZWN0ZWRcXG5cbiAgWW91ciBjdXJyZW50IHN0YXR1c2xpbmU6XG4gICAgJHtkaW19Y29tbWFuZDogJHtleGlzdGluZ0NtZH0ke3Jlc2V0fVxuXG4gIEVaX0FnZW50cyBpbmNsdWRlcyBhIHN0YXR1c2xpbmUgc2hvd2luZzpcbiAgICBcdTIwMjIgTW9kZWwgbmFtZVxuICAgIFx1MjAyMiBDdXJyZW50IHRhc2sgKGZyb20gdG9kbyBsaXN0KVxuICAgIFx1MjAyMiBDb250ZXh0IHdpbmRvdyB1c2FnZSAoY29sb3ItY29kZWQpXG5cbiAgJHtjeWFufTEke3Jlc2V0fSkgS2VlcCBleGlzdGluZ1xuICAke2N5YW59MiR7cmVzZXR9KSBSZXBsYWNlIHdpdGggRVpfQWdlbnRzIHN0YXR1c2xpbmVcbmApO1xuXG4gIHJsLnF1ZXN0aW9uKGAgIENob2ljZSAke2RpbX1bMV0ke3Jlc2V0fTogYCwgKGFuc3dlcikgPT4ge1xuICAgIHJsLmNsb3NlKCk7XG4gICAgY29uc3QgY2hvaWNlID0gYW5zd2VyLnRyaW0oKSB8fCAnMSc7XG4gICAgY2FsbGJhY2soY2hvaWNlID09PSAnMicpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQcm9tcHQgZm9yIHJ1bnRpbWUgc2VsZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb21wdFJ1bnRpbWUoY2FsbGJhY2spIHtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXRcbiAgfSk7XG5cbiAgbGV0IGFuc3dlcmVkID0gZmFsc2U7XG5cbiAgcmwub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGlmICghYW5zd2VyZWQpIHtcbiAgICAgIGFuc3dlcmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUubG9nKGBcXG4gICR7eWVsbG93fUluc3RhbGxhdGlvbiBjYW5jZWxsZWQke3Jlc2V0fVxcbmApO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9V2hpY2ggcnVudGltZShzKSB3b3VsZCB5b3UgbGlrZSB0byBpbnN0YWxsIGZvcj8ke3Jlc2V0fVxcblxcbiAgJHtjeWFufTEke3Jlc2V0fSkgQ2xhdWRlIENvZGUgJHtkaW19KH4vLmNsYXVkZSkke3Jlc2V0fVxuICAke2N5YW59MiR7cmVzZXR9KSBPcGVuQ29kZSAgICAke2RpbX0ofi8uY29uZmlnL29wZW5jb2RlKSR7cmVzZXR9IC0gb3BlbiBzb3VyY2UsIGZyZWUgbW9kZWxzXG4gICR7Y3lhbn0zJHtyZXNldH0pIEdlbWluaSAgICAgICR7ZGltfSh+Ly5nZW1pbmkpJHtyZXNldH1cbiAgJHtjeWFufTQke3Jlc2V0fSkgQ29kZXggICAgICAgJHtkaW19KH4vLmNvZGV4KSR7cmVzZXR9XG4gICR7Y3lhbn01JHtyZXNldH0pIENvcGlsb3QgICAgICR7ZGltfSh+Ly5jb3BpbG90KSR7cmVzZXR9XG4gICR7Y3lhbn02JHtyZXNldH0pIFF3ZW4gQ29kZSAgICR7ZGltfSh+Ly5xd2VuKSR7cmVzZXR9IC0gQWxpYmFiYSBRd2VuIG9mZmljaWFsIENMSVxuICAke2N5YW59NyR7cmVzZXR9KSBLaW1pIENvZGUgICAke2RpbX0ofi8ua2ltaSkke3Jlc2V0fSAtIE1vb25zaG90IEtpbWkgb2ZmaWNpYWwgQ0xJXG4gICR7Y3lhbn04JHtyZXNldH0pIEFsbCAke2RpbX0oYWxsIDcgcnVudGltZXMgYWJvdmUpJHtyZXNldH1cblxuICAke2RpbX1Ob3RlOiBPcGVuQUkgYW5kIEFudGhyb3BpYyBhcmUgbW9kZWwgcHJvdmlkZXJzIGNvbmZpZ3VyZWQgd2l0aGluIGVhY2ggcnVudGltZSdzIHNldHRpbmdzLFxuICBub3Qgc2VwYXJhdGUgQ0xJIHJ1bnRpbWVzLiBTZWUgUkVBRE1FLm1kIGZvciBtb2RlbCBjb25maWd1cmF0aW9uLiR7cmVzZXR9XG5gKTtcblxuICBybC5xdWVzdGlvbihgICBDaG9pY2UgJHtkaW19WzFdJHtyZXNldH06IGAsIChhbnN3ZXIpID0+IHtcbiAgICBhbnN3ZXJlZCA9IHRydWU7XG4gICAgcmwuY2xvc2UoKTtcbiAgICBjb25zdCBjaG9pY2UgPSBhbnN3ZXIudHJpbSgpIHx8ICcxJztcbiAgICBpZiAoY2hvaWNlID09PSAnOCcpIHtcbiAgICAgIGNhbGxiYWNrKFsnY2xhdWRlJywgJ29wZW5jb2RlJywgJ2dlbWluaScsICdjb2RleCcsICdjb3BpbG90JywgJ3F3ZW4nLCAna2ltaSddKTtcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzcnKSB7XG4gICAgICBjYWxsYmFjayhbJ2tpbWknXSk7XG4gICAgfSBlbHNlIGlmIChjaG9pY2UgPT09ICc2Jykge1xuICAgICAgY2FsbGJhY2soWydxd2VuJ10pO1xuICAgIH0gZWxzZSBpZiAoY2hvaWNlID09PSAnNScpIHtcbiAgICAgIGNhbGxiYWNrKFsnY29waWxvdCddKTtcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzQnKSB7XG4gICAgICBjYWxsYmFjayhbJ2NvZGV4J10pO1xuICAgIH0gZWxzZSBpZiAoY2hvaWNlID09PSAnMycpIHtcbiAgICAgIGNhbGxiYWNrKFsnZ2VtaW5pJ10pO1xuICAgIH0gZWxzZSBpZiAoY2hvaWNlID09PSAnMicpIHtcbiAgICAgIGNhbGxiYWNrKFsnb3BlbmNvZGUnXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKFsnY2xhdWRlJ10pO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUHJvbXB0IGZvciBpbnN0YWxsIGxvY2F0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb21wdExvY2F0aW9uKHJ1bnRpbWVzKSB7XG4gIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIGNvbnNvbGUubG9nKGAgICR7eWVsbG93fU5vbi1pbnRlcmFjdGl2ZSB0ZXJtaW5hbCBkZXRlY3RlZCwgZGVmYXVsdGluZyB0byBnbG9iYWwgaW5zdGFsbCR7cmVzZXR9XFxuYCk7XG4gICAgaW5zdGFsbEFsbFJ1bnRpbWVzKHJ1bnRpbWVzLCB0cnVlLCBmYWxzZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXRcbiAgfSk7XG5cbiAgbGV0IGFuc3dlcmVkID0gZmFsc2U7XG5cbiAgcmwub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGlmICghYW5zd2VyZWQpIHtcbiAgICAgIGFuc3dlcmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUubG9nKGBcXG4gICR7eWVsbG93fUluc3RhbGxhdGlvbiBjYW5jZWxsZWQke3Jlc2V0fVxcbmApO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgcGF0aEV4YW1wbGVzID0gcnVudGltZXMubWFwKHIgPT4ge1xuICAgIGNvbnN0IGdsb2JhbFBhdGggPSBnZXRHbG9iYWxEaXIociwgZXhwbGljaXRDb25maWdEaXIpO1xuICAgIHJldHVybiBnbG9iYWxQYXRoLnJlcGxhY2Uob3MuaG9tZWRpcigpLCAnficpO1xuICB9KS5qb2luKCcsICcpO1xuXG4gIGNvbnN0IGxvY2FsRXhhbXBsZXMgPSBydW50aW1lcy5tYXAociA9PiBgLi8ke2dldERpck5hbWUocil9YCkuam9pbignLCAnKTtcblxuICBjb25zb2xlLmxvZyhgICAke3llbGxvd31XaGVyZSB3b3VsZCB5b3UgbGlrZSB0byBpbnN0YWxsPyR7cmVzZXR9XFxuXFxuICAke2N5YW59MSR7cmVzZXR9KSBHbG9iYWwgJHtkaW19KCR7cGF0aEV4YW1wbGVzfSkke3Jlc2V0fSAtIGF2YWlsYWJsZSBpbiBhbGwgcHJvamVjdHNcbiAgJHtjeWFufTIke3Jlc2V0fSkgTG9jYWwgICR7ZGltfSgke2xvY2FsRXhhbXBsZXN9KSR7cmVzZXR9IC0gdGhpcyBwcm9qZWN0IG9ubHlcbmApO1xuXG4gIHJsLnF1ZXN0aW9uKGAgIENob2ljZSAke2RpbX1bMV0ke3Jlc2V0fTogYCwgKGFuc3dlcikgPT4ge1xuICAgIGFuc3dlcmVkID0gdHJ1ZTtcbiAgICBybC5jbG9zZSgpO1xuICAgIGNvbnN0IGNob2ljZSA9IGFuc3dlci50cmltKCkgfHwgJzEnO1xuICAgIGNvbnN0IGlzR2xvYmFsID0gY2hvaWNlICE9PSAnMic7XG4gICAgaW5zdGFsbEFsbFJ1bnRpbWVzKHJ1bnRpbWVzLCBpc0dsb2JhbCwgdHJ1ZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEluc3RhbGwgRVpfQWdlbnRzIGZvciBhbGwgc2VsZWN0ZWQgcnVudGltZXNcbiAqL1xuZnVuY3Rpb24gaW5zdGFsbEFsbFJ1bnRpbWVzKHJ1bnRpbWVzOiBzdHJpbmdbXSwgaXNHbG9iYWw6IGJvb2xlYW4sIGlzSW50ZXJhY3RpdmU6IGJvb2xlYW4pIHtcbiAgY29uc3QgcmVzdWx0czogQXJyYXk8eyBzZXR0aW5nc1BhdGg6IHN0cmluZyB8IG51bGw7IHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7IHN0YXR1c2xpbmVDb21tYW5kOiBzdHJpbmcgfCBudWxsOyBydW50aW1lOiBzdHJpbmcgfT4gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJ1bnRpbWUgb2YgcnVudGltZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBpbnN0YWxsKGlzR2xvYmFsLCBydW50aW1lKTtcbiAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1c2xpbmVSdW50aW1lcyA9IFsnY2xhdWRlJywgJ2dlbWluaSddO1xuICBjb25zdCBzdGF0dXNsaW5lUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKHIgPT4gc3RhdHVzbGluZVJ1bnRpbWVzLmluY2x1ZGVzKHIucnVudGltZSkpO1xuXG4gIC8vIEhhbmRsZSBzdGF0dXNsaW5lIHBlci1ydW50aW1lIHRvIGF2b2lkIGNvbmZsaWN0c1xuICAvLyBFYWNoIHJ1bnRpbWUgd2l0aCBzZXR0aW5ncy5qc29uIGdldHMgaXRzIG93biBzdGF0dXNsaW5lIHByb21wdFxuICBjb25zdCBmaW5hbGl6ZVBlclJ1bnRpbWUgPSAocnVudGltZVJlc3VsdDogeyBzZXR0aW5nc1BhdGg6IHN0cmluZyB8IG51bGw7IHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7IHN0YXR1c2xpbmVDb21tYW5kOiBzdHJpbmcgfCBudWxsOyBydW50aW1lOiBzdHJpbmcgfSwgc2hvdWxkSW5zdGFsbFN0YXR1c2xpbmU6IGJvb2xlYW4pID0+IHtcbiAgICBjb25zdCB1c2VTdGF0dXNsaW5lID0gc3RhdHVzbGluZVJ1bnRpbWVzLmluY2x1ZGVzKHJ1bnRpbWVSZXN1bHQucnVudGltZSkgJiYgc2hvdWxkSW5zdGFsbFN0YXR1c2xpbmU7XG4gICAgZmluaXNoSW5zdGFsbChcbiAgICAgIHJ1bnRpbWVSZXN1bHQuc2V0dGluZ3NQYXRoLFxuICAgICAgcnVudGltZVJlc3VsdC5zZXR0aW5ncyxcbiAgICAgIHJ1bnRpbWVSZXN1bHQuc3RhdHVzbGluZUNvbW1hbmQsXG4gICAgICB1c2VTdGF0dXNsaW5lLFxuICAgICAgcnVudGltZVJlc3VsdC5ydW50aW1lLFxuICAgICAgaXNHbG9iYWxcbiAgICApO1xuICB9O1xuXG4gIGlmIChzdGF0dXNsaW5lUmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBObyBydW50aW1lcyBzdXBwb3J0IHN0YXR1c2xpbmUgLSBmaW5hbGl6ZSBhbGwgd2l0aG91dCBzdGF0dXNsaW5lXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgZmluYWxpemVQZXJSdW50aW1lKHJlc3VsdCwgZmFsc2UpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChzdGF0dXNsaW5lUmVzdWx0cy5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBTaW5nbGUgcnVudGltZSB3aXRoIHN0YXR1c2xpbmUgc3VwcG9ydCAtIHByb21wdCBvbmNlXG4gICAgY29uc3Qgc2luZ2xlUmVzdWx0ID0gc3RhdHVzbGluZVJlc3VsdHNbMF07XG4gICAgaWYgKHNpbmdsZVJlc3VsdCkge1xuICAgICAgaGFuZGxlU3RhdHVzbGluZShzaW5nbGVSZXN1bHQuc2V0dGluZ3MsIGlzSW50ZXJhY3RpdmUsIChzaG91bGRJbnN0YWxsKSA9PiB7XG4gICAgICAgIGZpbmFsaXplUGVyUnVudGltZShzaW5nbGVSZXN1bHQsIHNob3VsZEluc3RhbGwpO1xuICAgICAgICAvLyBGaW5hbGl6ZSBvdGhlciBydW50aW1lcyB3aXRob3V0IHN0YXR1c2xpbmVcbiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgIGlmICghc3RhdHVzbGluZVJ1bnRpbWVzLmluY2x1ZGVzKHJlc3VsdC5ydW50aW1lKSkge1xuICAgICAgICAgICAgZmluYWxpemVQZXJSdW50aW1lKHJlc3VsdCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE11bHRpcGxlIHJ1bnRpbWVzIHdpdGggc3RhdHVzbGluZSBzdXBwb3J0IC0gcHJvbXB0IGZvciBlYWNoXG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XG4gICAgY29uc3Qgc3RhdHVzbGluZUNob2ljZXMgPSBuZXcgQXJyYXkoc3RhdHVzbGluZVJlc3VsdHMubGVuZ3RoKS5maWxsKGZhbHNlKTtcblxuICAgIGNvbnN0IHByb21wdE5leHRTdGF0dXNsaW5lID0gKCkgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSBzdGF0dXNsaW5lUmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgLy8gQWxsIHN0YXR1c2xpbmUgcHJvbXB0cyBkb25lIC0gZmluYWxpemUgYWxsIHJ1bnRpbWVzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbaV07XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IHN0YXR1c2xpbmVJbmRleCA9IHN0YXR1c2xpbmVSZXN1bHRzLmZpbmRJbmRleChyID0+IHIucnVudGltZSA9PT0gcmVzdWx0LnJ1bnRpbWUpO1xuICAgICAgICAgIGNvbnN0IHNob3VsZEluc3RhbGwgPSBzdGF0dXNsaW5lSW5kZXggIT09IC0xID8gc3RhdHVzbGluZUNob2ljZXNbc3RhdHVzbGluZUluZGV4XSA6IGZhbHNlO1xuICAgICAgICAgIGZpbmFsaXplUGVyUnVudGltZShyZXN1bHQsIHNob3VsZEluc3RhbGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudFJlc3VsdCA9IHN0YXR1c2xpbmVSZXN1bHRzW2N1cnJlbnRJbmRleF07XG4gICAgICBpZiAoY3VycmVudFJlc3VsdCkge1xuICAgICAgICBjb25zdCBjdXJyZW50UnVudGltZUluZGV4ID0gY3VycmVudEluZGV4O1xuICAgICAgICBoYW5kbGVTdGF0dXNsaW5lKGN1cnJlbnRSZXN1bHQuc2V0dGluZ3MsIGlzSW50ZXJhY3RpdmUsIChzaG91bGRJbnN0YWxsKSA9PiB7XG4gICAgICAgICAgc3RhdHVzbGluZUNob2ljZXNbY3VycmVudFJ1bnRpbWVJbmRleF0gPSBzaG91bGRJbnN0YWxsO1xuICAgICAgICAgIGN1cnJlbnRJbmRleCsrO1xuICAgICAgICAgIHByb21wdE5leHRTdGF0dXNsaW5lKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwcm9tcHROZXh0U3RhdHVzbGluZSgpO1xuICB9XG59XG5cbi8vIFRlc3Qtb25seSBleHBvcnRzIFx1MjAxNCBza2lwIG1haW4gbG9naWMgd2hlbiBsb2FkZWQgYXMgYSBtb2R1bGUgZm9yIHRlc3RpbmdcbmNvbnN0IHRlc3RFeHBvcnRzID0ge1xuICAgIGdldENvZGV4U2tpbGxBZGFwdGVySGVhZGVyLFxuICAgIGNvbnZlcnRDbGF1ZGVUb0dlbWluaUFnZW50LFxuICAgIGNvbnZlcnRDbGF1ZGVBZ2VudFRvQ29kZXhBZ2VudCxcbiAgICBnZW5lcmF0ZUNvZGV4QWdlbnRUb21sLFxuICAgIGdlbmVyYXRlQ29kZXhDb25maWdCbG9jayxcbiAgICBzdHJpcEV6QWdlbnRzRnJvbUNvZGV4Q29uZmlnLFxuICAgIG1lcmdlQ29kZXhDb25maWcsXG4gICAgaW5zdGFsbENvZGV4Q29uZmlnLFxuICAgIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db2RleFNraWxsLFxuICAgIEVaX0NPREVYX01BUktFUixcbiAgICBDT0RFWF9BR0VOVF9TQU5EQk9YLFxuICAgIGdldERpck5hbWUsXG4gICAgZ2V0R2xvYmFsRGlyLFxuICAgIGdldENvbmZpZ0RpckZyb21Ib21lLFxuICAgIGNsYXVkZVRvQ29waWxvdFRvb2xzLFxuICAgIGNvbnZlcnRDb3BpbG90VG9vbE5hbWUsXG4gICAgY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQsXG4gICAgY29udmVydENsYXVkZUNvbW1hbmRUb0NvcGlsb3RTa2lsbCxcbiAgICBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvcGlsb3RBZ2VudCxcbiAgICBjb3B5Q29tbWFuZHNBc0NvcGlsb3RTa2lsbHMsXG4gICAgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfTUFSS0VSLFxuICAgIEVaX0NPUElMT1RfSU5TVFJVQ1RJT05TX0NMT1NFX01BUktFUixcbiAgICBtZXJnZUNvcGlsb3RJbnN0cnVjdGlvbnMsXG4gICAgc3RyaXBFekFnZW50c0Zyb21Db3BpbG90SW5zdHJ1Y3Rpb25zLFxuICAgIHdyaXRlTWFuaWZlc3QsXG4gICAgcmVwb3J0TG9jYWxQYXRjaGVzLFxuICAgIGNvbnZlcnRDbGF1ZGVUb1F3ZW5Ta2lsbCxcbiAgICBjb252ZXJ0Q2xhdWRlVG9Rd2VuQWdlbnQsXG4gICAgY29udmVydENsYXVkZVRvS2ltaVNraWxsLFxuICAgIGNvbnZlcnRDbGF1ZGVUb0tpbWlBZ2VudCxcbiAgfTtcblxuLy8gTWFpbiBsb2dpY1xuaWYgKGhhc0dsb2JhbCAmJiBoYXNMb2NhbCkge1xuICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fUNhbm5vdCBzcGVjaWZ5IGJvdGggLS1nbG9iYWwgYW5kIC0tbG9jYWwke3Jlc2V0fWApO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59IGVsc2UgaWYgKGV4cGxpY2l0Q29uZmlnRGlyICYmIGhhc0xvY2FsKSB7XG4gIGNvbnNvbGUuZXJyb3IoYCAgJHt5ZWxsb3d9Q2Fubm90IHVzZSAtLWNvbmZpZy1kaXIgd2l0aCAtLWxvY2FsJHtyZXNldH1gKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSBlbHNlIGlmIChoYXNVbmluc3RhbGwpIHtcbiAgaWYgKCFoYXNHbG9iYWwgJiYgIWhhc0xvY2FsKSB7XG4gICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd30tLXVuaW5zdGFsbCByZXF1aXJlcyAtLWdsb2JhbCBvciAtLWxvY2FsJHtyZXNldH1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgY29uc3QgcnVudGltZXMgPSBzZWxlY3RlZFJ1bnRpbWVzLmxlbmd0aCA+IDAgPyBzZWxlY3RlZFJ1bnRpbWVzIDogWydjbGF1ZGUnXTtcbiAgZm9yIChjb25zdCBydW50aW1lIG9mIHJ1bnRpbWVzKSB7XG4gICAgdW5pbnN0YWxsKGhhc0dsb2JhbCwgcnVudGltZSk7XG4gIH1cbn0gZWxzZSBpZiAoc2VsZWN0ZWRSdW50aW1lcy5sZW5ndGggPiAwKSB7XG4gIGlmICghaGFzR2xvYmFsICYmICFoYXNMb2NhbCkge1xuICAgIHByb21wdExvY2F0aW9uKHNlbGVjdGVkUnVudGltZXMpO1xuICB9IGVsc2Uge1xuICAgIGluc3RhbGxBbGxSdW50aW1lcyhzZWxlY3RlZFJ1bnRpbWVzLCBoYXNHbG9iYWwsIGZhbHNlKTtcbiAgfVxufSBlbHNlIGlmIChoYXNHbG9iYWwgfHwgaGFzTG9jYWwpIHtcbiAgLy8gRGVmYXVsdCB0byBDbGF1ZGUgaWYgbm8gcnVudGltZSBzcGVjaWZpZWQgYnV0IGxvY2F0aW9uIGlzXG4gIGluc3RhbGxBbGxSdW50aW1lcyhbJ2NsYXVkZSddLCBoYXNHbG9iYWwsIGZhbHNlKTtcbn0gZWxzZSB7XG4gIC8vIEludGVyYWN0aXZlXG4gIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIGNvbnNvbGUubG9nKGAgICR7eWVsbG93fU5vbi1pbnRlcmFjdGl2ZSB0ZXJtaW5hbCBkZXRlY3RlZCwgZGVmYXVsdGluZyB0byBDbGF1ZGUgQ29kZSBnbG9iYWwgaW5zdGFsbCR7cmVzZXR9XFxuYCk7XG4gICAgaW5zdGFsbEFsbFJ1bnRpbWVzKFsnY2xhdWRlJ10sIHRydWUsIGZhbHNlKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9tcHRSdW50aW1lKChydW50aW1lcykgPT4ge1xuICAgICAgcHJvbXB0TG9jYXRpb24ocnVudGltZXMpO1xuICAgIH0pO1xuICB9XG59XG5cbi8vIEV4cG9ydCBmb3IgdGVzdGluZ1xuZXhwb3J0IHsgdGVzdEV4cG9ydHMgfTtcbiIsICJ7XG4gIFwibmFtZVwiOiBcIkBob3dsaWwvZXotYWdlbnRzXCIsXG4gIFwidmVyc2lvblwiOiBcIjUuMC40XCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJFWiBBZ2VudHMgXHUyMDE0IE1ldGEtcHJvbXB0aW5nIHdpdGggbXVsdGktbW9kZWwgc3VwcG9ydCAoUXdlbiwgS2ltaSwgT3BlbkFJKVwiLFxuICBcInR5cGVcIjogXCJtb2R1bGVcIixcbiAgXCJzaWRlRWZmZWN0c1wiOiBmYWxzZSxcbiAgXCJiaW5cIjoge1xuICAgIFwiZXotYWdlbnRzXCI6IFwiZGlzdC9iaW4vaW5zdGFsbC5qc1wiLFxuICAgIFwiZXotYWdlbnRzLXVwZGF0ZVwiOiBcImRpc3QvYmluL3VwZGF0ZS5qc1wiXG4gIH0sXG4gIFwiZXhwb3J0c1wiOiB7XG4gICAgXCIuXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2ZhY3Rvcmllc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9mYWN0b3JpZXMvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbGliL2ZhY3Rvcmllcy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vc3RyYXRlZ2llc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9zdHJhdGVnaWVzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9zdHJhdGVnaWVzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9hZGFwdGVyc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9hZGFwdGVycy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvYWRhcHRlcnMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL29ic2VydmVyXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL29ic2VydmVyL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9vYnNlcnZlci9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vZGVjb3JhdG9yc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9kZWNvcmF0b3JzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9kZWNvcmF0b3JzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9mYWNhZGVzXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL2ZhY2FkZXMvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbGliL2ZhY2FkZXMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2NvbW1hbmRzXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL2NvbW1hbmRzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9jb21tYW5kcy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vc2VydmljZXNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvc2VydmljZXMvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbGliL3NlcnZpY2VzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9yZXBvc2l0b3JpZXNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvcmVwb3NpdG9yaWVzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9yZXBvc2l0b3JpZXMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2ZwXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL2ZwL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9mcC9pbmRleC5qc1wiXG4gICAgfVxuICB9LFxuICBcIm1haW5cIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9pbmRleC5kLnRzXCIsXG4gIFwiZmlsZXNcIjogW1xuICAgIFwiZGlzdFwiLFxuICAgIFwiY29tbWFuZHNcIixcbiAgICBcImV6LWFnZW50c1wiLFxuICAgIFwiYWdlbnRzXCIsXG4gICAgXCJza2lsbHNcIixcbiAgICBcImhvb2tzL2Rpc3RcIixcbiAgICBcInNjcmlwdHNcIlxuICBdLFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImNsYXVkZVwiLFxuICAgIFwiY2xhdWRlLWNvZGVcIixcbiAgICBcImFpXCIsXG4gICAgXCJtZXRhLXByb21wdGluZ1wiLFxuICAgIFwiY29udGV4dC1lbmdpbmVlcmluZ1wiLFxuICAgIFwic3BlYy1kcml2ZW4tZGV2ZWxvcG1lbnRcIixcbiAgICBcImdlbWluaVwiLFxuICAgIFwiZ2VtaW5pLWNsaVwiLFxuICAgIFwiY29kZXhcIixcbiAgICBcImNvZGV4LWNsaVwiLFxuICAgIFwiZXotYWdlbnRzXCIsXG4gICAgXCJhZ2VudC1vcmNoZXN0cmF0aW9uXCJcbiAgXSxcbiAgXCJhdXRob3JcIjogXCJUXHUwMEMyQ0hFU1wiLFxuICBcImxpY2Vuc2VcIjogXCJNSVRcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vaG93bGlsL2V6LWFnZW50cy5naXRcIlxuICB9LFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2hvd2xpbC9lei1hZ2VudHNcIixcbiAgXCJidWdzXCI6IHtcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ob3dsaWwvZXotYWdlbnRzL2lzc3Vlc1wiXG4gIH0sXG4gIFwiZW5naW5lc1wiOiB7XG4gICAgXCJub2RlXCI6IFwiPj0xNi43LjBcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAdHlwZXMvbWljcm9tYXRjaFwiOiBcIjQuMC4wXCIsXG4gICAgXCJAdHlwZXMvbm9kZVwiOiBcIjIwLjAuMFwiLFxuICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW5cIjogXCI4LjU3LjJcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9wYXJzZXJcIjogXCI4LjU3LjJcIixcbiAgICBcImM4XCI6IFwiMTEuMC4wXCIsXG4gICAgXCJjb21wbGV4aXR5LXJlcG9ydFwiOiBcIjIuMC4wLWFscGhhXCIsXG4gICAgXCJkZXBlbmRlbmN5LWNydWlzZXJcIjogXCIxNy4zLjlcIixcbiAgICBcImVzbGludFwiOiBcIjguNTcuMFwiLFxuICAgIFwiZXNsaW50LXBsdWdpbi1jb21wbGV4aXR5XCI6IFwiMS4wLjJcIixcbiAgICBcImVzbGludC1wbHVnaW4tc29uYXJqc1wiOiBcIjQuMC4yXCIsXG4gICAgXCJlc2xpbnQtcGx1Z2luLXRzZG9jXCI6IFwiMC41LjJcIixcbiAgICBcImV4cGVjdC10eXBlXCI6IFwiMS4zLjBcIixcbiAgICBcImZhc3QtY2hlY2tcIjogXCIzLjAuMFwiLFxuICAgIFwiZ2xvYlwiOiBcIjEzLjAuNlwiLFxuICAgIFwiaHVza3lcIjogXCI5LjEuN1wiLFxuICAgIFwianMteWFtbFwiOiBcIjQuMS4xXCIsXG4gICAgXCJqc2NwZFwiOiBcIjQuMC44XCIsXG4gICAgXCJqc2RvY1wiOiBcIjQuMC4yXCIsXG4gICAgXCJrNlwiOiBcIjAuMC4wXCIsXG4gICAgXCJsaW50LXN0YWdlZFwiOiBcIjE1LjUuMlwiLFxuICAgIFwibWFkZ2VcIjogXCI4LjAuMFwiLFxuICAgIFwibWFya2Rvd25saW50XCI6IFwiMC40MC4wXCIsXG4gICAgXCJ0cy1tb3JwaFwiOiBcIjI3LjAuMlwiLFxuICAgIFwidHMtbm9kZVwiOiBcIjEwLjkuMFwiLFxuICAgIFwidHMtcHJ1bmVcIjogXCIwLjEwLjNcIixcbiAgICBcInRzdXBcIjogXCI4LjAuMFwiLFxuICAgIFwidHlwZWRvY1wiOiBcIjAuMjguMThcIixcbiAgICBcInR5cGVkb2MtcGx1Z2luLW1pc3NpbmctZXhwb3J0c1wiOiBcIjQuMS4yXCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiNS40LjVcIixcbiAgICBcInZpdGVzdFwiOiBcIjQuMS4wXCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcImJ1aWxkXCI6IFwidHN1cFwiLFxuICAgIFwiYnVpbGQ6d2F0Y2hcIjogXCJ0c3VwIC0td2F0Y2hcIixcbiAgICBcInR5cGVjaGVja1wiOiBcInRzYyAtLW5vRW1pdFwiLFxuICAgIFwidHlwZWNoZWNrOnN0cmljdFwiOiBcInRzYyAtLW5vRW1pdCAtLXN0cmljdFwiLFxuICAgIFwiZGV2XCI6IFwidHN4IGJpbi9pbnN0YWxsLnRzXCIsXG4gICAgXCJsaW50XCI6IFwiZXNsaW50IC4gLS1leHQgLnRzIC0tbWF4LXdhcm5pbmdzPTBcIixcbiAgICBcImxpbnQ6Zml4XCI6IFwiZXNsaW50IC4gLS1leHQgLnRzIC0tZml4XCIsXG4gICAgXCJidWlsZDpob29rc1wiOiBcIm5vZGUgZGlzdC9zY3JpcHRzL2J1aWxkLWhvb2tzLmpzXCIsXG4gICAgXCJwcmVwdWJsaXNoT25seVwiOiBcIm5wbSBydW4gYnVpbGQgJiYgbnBtIHJ1biBidWlsZDpob29rc1wiLFxuICAgIFwidGVzdFwiOiBcInRzeCBzY3JpcHRzL3J1bi10ZXN0cy50c1wiLFxuICAgIFwidGVzdDpjb3ZlcmFnZVwiOiBcImM4IC0tY2hlY2stY292ZXJhZ2UgLS1saW5lcyA3MCAtLXJlcG9ydGVyIHRleHQgLS1pbmNsdWRlICdiaW4vbGliLyoqLyoudHMnIC0tZXhjbHVkZSAndGVzdHMvKionIC0tYWxsIHRzeCBzY3JpcHRzL3J1bi10ZXN0cy50c1wiLFxuICAgIFwidGVzdDphMTF5XCI6IFwibm9kZSB0ZXN0cy9hY2Nlc3NpYmlsaXR5L3J1bi1hMTF5LXRlc3RzLmNqc1wiLFxuICAgIFwidGVzdDpxd2VuOmNvZGVcIjogXCJzaCB0ZXN0cy9zdGFnaW5nL3F3ZW4tY29kZS1iYXR0bGUtZnVsbC5zaFwiLFxuICAgIFwidGVzdDpxd2VuOmNvZGU6c2ltcGxlXCI6IFwic2ggdGVzdHMvc3RhZ2luZy9xd2VuLWNvZGUtc2ltcGxlLXRlc3Quc2hcIixcbiAgICBcInRlc3Q6cXdlbjpjb2RlOmVkZ2VcIjogXCJzaCB0ZXN0cy9zdGFnaW5nL3F3ZW4tY29kZS1lZGdlLWNhc2VzLnNoXCIsXG4gICAgXCJ0ZXN0OmRvY2tlcjpxd2VuOmNvZGVcIjogXCJkb2NrZXItY29tcG9zZSAtZiBkb2NrZXItY29tcG9zZS5zdGFnaW5nLnltbCB1cCAtLWJ1aWxkIGV6LWFnZW50cy1xd2VuLWNvZGUtYmF0dGxlXCIsXG4gICAgXCJ0ZXN0OmRvY2tlcjpxd2VuOmVkZ2VcIjogXCJkb2NrZXItY29tcG9zZSAtZiBkb2NrZXItY29tcG9zZS5zdGFnaW5nLnltbCB1cCAtLWJ1aWxkIGV6LWFnZW50cy1xd2VuLWNvZGUtZWRnZS1jYXNlc1wiLFxuICAgIFwidGVzdDpkb2NrZXI6YWxsXCI6IFwiZG9ja2VyLWNvbXBvc2UgLWYgZG9ja2VyLWNvbXBvc2Uuc3RhZ2luZy55bWwgdXAgLS1idWlsZCAtLWFib3J0LW9uLWNvbnRhaW5lci1leGl0XCIsXG4gICAgXCJpbnN0YWxsOnByb2R1Y3Rpb25cIjogXCJub2RlIC0tbG9hZGVyIHRzLW5vZGUvZXNtIHNjcmlwdHMvaW5zdGFsbC1wcm9kdWN0aW9uLnRzXCIsXG4gICAgXCJpbnN0YWxsOnByb2R1Y3Rpb246bGF0ZXN0XCI6IFwibm9kZSAtLWxvYWRlciB0cy1ub2RlL2VzbSBzY3JpcHRzL2luc3RhbGwtcHJvZHVjdGlvbi50cyBsYXRlc3RcIixcbiAgICBcImluc3RhbGw6cHJvZHVjdGlvbjp2NFwiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy9pbnN0YWxsLXByb2R1Y3Rpb24udHMgNC4wLjBcIixcbiAgICBcInZhbGlkYXRlOnRva2VuXCI6IFwibm9kZSAtLWxvYWRlciB0cy1ub2RlL2VzbSBzY3JpcHRzL3ZhbGlkYXRlLXRva2VuLnRzXCIsXG4gICAgXCJzZWN1cml0eTpzY2FuXCI6IFwibnBtIGF1ZGl0IC0tYXVkaXQtbGV2ZWw9bW9kZXJhdGVcIixcbiAgICBcImRvY3M6Z2VuZXJhdGVcIjogXCJqc2RvYyAtYyBqc2RvYy5qc29uIC1yIGJpbi8gZXotYWdlbnRzL2Jpbi9saWIvXCIsXG4gICAgXCJkb2NzOmFwaVwiOiBcInR5cGVkb2NcIixcbiAgICBcImFuYWx5emU6ZHVwbGljYXRlc1wiOiBcImpzY3BkIC0tY29uZmlnIC5qc2NwZC5qc29uXCIsXG4gICAgXCJjaGVjazpkdXBsaWNhdGVzXCI6IFwianNjcGQgLS1jb25maWcgLmpzY3BkLmpzb25cIixcbiAgICBcImNoZWNrOmNvbXBsZXhpdHlcIjogXCJub2RlIC0tbG9hZGVyIHRzLW5vZGUvZXNtIHNjcmlwdHMvY2hlY2stY29tcGxleGl0eS50c1wiLFxuICAgIFwiY2hlY2s6dHNkb2NcIjogXCJub2RlIC0tbG9hZGVyIHRzLW5vZGUvZXNtIHNjcmlwdHMvY2hlY2stdHNkb2MtY292ZXJhZ2UudHNcIixcbiAgICBcInRlc3Q6cGFja2FnZVwiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy90ZXN0LXBhY2thZ2UtZG9ja2VyLnRzXCIsXG4gICAgXCJjaGVjazpjb3VwbGluZ1wiOiBcIm1hZGdlIC0tY2lyY3VsYXIgYmluL2xpYi9cIixcbiAgICBcImNoZWNrOmFic3RyYWN0aW9uc1wiOiBcInRzLXBydW5lXCIsXG4gICAgXCJjaGVjazphbGwtbWV0cmljc1wiOiBcIm5wbSBydW4gbGludCAmJiBucG0gcnVuIGNoZWNrOmR1cGxpY2F0ZXMgJiYgbnBtIHJ1biBjaGVjazpjb3VwbGluZ1wiLFxuICAgIFwicHJlcGFyZVwiOiBcImh1c2t5XCIsXG4gICAgXCJnYXRlczpsb2NhbFwiOiBcIm5vZGUgZXotYWdlbnRzL2Jpbi9saWIvZ2F0ZS1leGVjdXRvci5janMgLS1jaSAtLWNhY2hlXCIsXG4gICAgXCJnYXRlczpzdGF0dXNcIjogXCJub2RlIGV6LWFnZW50cy9iaW4vbGliL2dhdGUtZXhlY3V0b3IuY2pzIC0tc3RhdHVzXCIsXG4gICAgXCJnYXRlczpzdGF0c1wiOiBcIm5vZGUgZXotYWdlbnRzL2Jpbi9saWIvZ2F0ZS1leGVjdXRvci5janMgLS1zdGF0c1wiLFxuICAgIFwiZGVwczphdWRpdFwiOiBcInRzeCBiaW4vZGVwZW5kZW5jeS1hdWRpdC50c1wiLFxuICAgIFwiZGVwczphdWRpdDpqc29uXCI6IFwidHN4IGJpbi9kZXBlbmRlbmN5LWF1ZGl0LnRzIC0tanNvblwiLFxuICAgIFwiZGVwczpjaGVja1wiOiBcInRzeCBiaW4vZGVwZW5kZW5jeS1hdWRpdC50cyAtLXF1aWV0XCJcbiAgfSxcbiAgXCJsaW50LXN0YWdlZFwiOiB7XG4gICAgXCIqLnRzXCI6IFtcbiAgICAgIFwibm9kZSAtLXRlc3RcIlxuICAgIF0sXG4gICAgXCIqLm1kXCI6IFtcbiAgICAgIFwidHN4IHNjcmlwdHMvcnVuLXRlc3RzLnRzXCJcbiAgICBdXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIm1pY3JvbWF0Y2hcIjogXCI0LjAuNVwiLFxuICAgIFwidGlrdG9rZW5cIjogXCIxLjAuMjJcIixcbiAgICBcInpvZFwiOiBcIjQuMy42XCJcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7O0FBRUEsWUFBWSxRQUFRO0FBQ3BCLFlBQVksVUFBVTtBQUN0QixZQUFZLFFBQVE7QUFDcEIsWUFBWSxjQUFjO0FBQzFCLFlBQVksWUFBWTtBQUN4QixTQUFTLHFCQUFxQjs7O0FDUDlCO0FBQUEsRUFDRSxNQUFRO0FBQUEsRUFDUixTQUFXO0FBQUEsRUFDWCxhQUFlO0FBQUEsRUFDZixNQUFRO0FBQUEsRUFDUixhQUFlO0FBQUEsRUFDZixLQUFPO0FBQUEsSUFDTCxhQUFhO0FBQUEsSUFDYixvQkFBb0I7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsU0FBVztBQUFBLElBQ1QsS0FBSztBQUFBLE1BQ0gsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLElBQ1o7QUFBQSxJQUNBLGVBQWU7QUFBQSxNQUNiLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxJQUNaO0FBQUEsSUFDQSxnQkFBZ0I7QUFBQSxNQUNkLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxJQUNaO0FBQUEsSUFDQSxjQUFjO0FBQUEsTUFDWixPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsSUFDWjtBQUFBLElBQ0EsY0FBYztBQUFBLE1BQ1osT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLElBQ1o7QUFBQSxJQUNBLGdCQUFnQjtBQUFBLE1BQ2QsT0FB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O0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUdGLElBQUksYUFBYSxVQUFVO0FBQ3pCLFVBQVEsTUFBTSxLQUFLLE1BQU0sMkNBQTJDLEtBQUssRUFBRTtBQUMzRSxVQUFRLEtBQUssQ0FBQztBQUNoQixXQUFXLHFCQUFxQixVQUFVO0FBQ3hDLFVBQVEsTUFBTSxLQUFLLE1BQU0sdUNBQXVDLEtBQUssRUFBRTtBQUN2RSxVQUFRLEtBQUssQ0FBQztBQUNoQixXQUFXLGNBQWM7QUFDdkIsTUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVO0FBQzNCLFlBQVEsTUFBTSxLQUFLLE1BQU0sMkNBQTJDLEtBQUssRUFBRTtBQUMzRSxZQUFRLEtBQUssQ0FBQztBQUFBLEVBQ2hCO0FBQ0EsUUFBTSxXQUFXLGlCQUFpQixTQUFTLElBQUksbUJBQW1CLENBQUMsUUFBUTtBQUMzRSxhQUFXLFdBQVcsVUFBVTtBQUM5QixjQUFVLFdBQVcsT0FBTztBQUFBLEVBQzlCO0FBQ0YsV0FBVyxpQkFBaUIsU0FBUyxHQUFHO0FBQ3RDLE1BQUksQ0FBQyxhQUFhLENBQUMsVUFBVTtBQUMzQixtQkFBZSxnQkFBZ0I7QUFBQSxFQUNqQyxPQUFPO0FBQ0wsdUJBQW1CLGtCQUFrQixXQUFXLEtBQUs7QUFBQSxFQUN2RDtBQUNGLFdBQVcsYUFBYSxVQUFVO0FBRWhDLHFCQUFtQixDQUFDLFFBQVEsR0FBRyxXQUFXLEtBQUs7QUFDakQsT0FBTztBQUVMLE1BQUksQ0FBQyxRQUFRLE1BQU0sT0FBTztBQUN4QixZQUFRLElBQUksS0FBSyxNQUFNLDhFQUE4RSxLQUFLO0FBQUEsQ0FBSTtBQUM5Ryx1QkFBbUIsQ0FBQyxRQUFRLEdBQUcsTUFBTSxLQUFLO0FBQUEsRUFDNUMsT0FBTztBQUNMLGtCQUFjLENBQUMsYUFBYTtBQUMxQixxQkFBZSxRQUFRO0FBQUEsSUFDekIsQ0FBQztBQUFBLEVBQ0g7QUFDRjsiLAogICJuYW1lcyI6IFsicnVudGltZUxhYmVsIiwgImhvb2tzU3JjIiwgImhvb2tzRGVzdCIsICJzY2FuRm9yTGVha2VkUGF0aHMiXQp9Cg==
2747
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vYmluL2luc3RhbGwudHMiLCAiLi4vLi4vcGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tICdyZWFkbGluZSc7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuXG4vLyBDb2xvcnNcbmNvbnN0IGN5YW4gPSAnXFx4MWJbMzZtJztcbmNvbnN0IGdyZWVuID0gJ1xceDFiWzMybSc7XG5jb25zdCB5ZWxsb3cgPSAnXFx4MWJbMzNtJztcbmNvbnN0IGRpbSA9ICdcXHgxYlsybSc7XG5jb25zdCByZXNldCA9ICdcXHgxYlswbSc7XG5cbi8vIENvZGV4IGNvbmZpZy50b21sIGNvbnN0YW50c1xuY29uc3QgRVpfQ09ERVhfTUFSS0VSID0gJyMgRVpfQWdlbnRzIEFnZW50IENvbmZpZ3VyYXRpb24gXFx1MjAxNCBtYW5hZ2VkIGJ5IGV6LWFnZW50cyBpbnN0YWxsZXInO1xuXG4vLyBDb3BpbG90IGluc3RydWN0aW9ucyBtYXJrZXIgY29uc3RhbnRzXG5jb25zdCBFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19NQVJLRVIgPSAnPCEtLSBFWl9BR0VOVFMgQ29uZmlndXJhdGlvbiBcXHUyMDE0IG1hbmFnZWQgYnkgZXotYWdlbnRzIGluc3RhbGxlciAtLT4nO1xuY29uc3QgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfQ0xPU0VfTUFSS0VSID0gJzwhLS0gL0VaX0FHRU5UUyBDb25maWd1cmF0aW9uIC0tPic7XG4vLyBMZWdhY3kgbWFya2VycyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgaW5zdGFsbHMuXG5jb25zdCBMRUdBQ1lfRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfTUFSS0VSID0gJzwhLS0gRVpfQWdlbnRzIENvbmZpZ3VyYXRpb24gXFx1MjAxNCBtYW5hZ2VkIGJ5IGV6LWFnZW50cyBpbnN0YWxsZXIgLS0+JztcbmNvbnN0IExFR0FDWV9FWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19DTE9TRV9NQVJLRVIgPSAnPCEtLSAvRVpfQWdlbnRzIENvbmZpZ3VyYXRpb24gLS0+JztcblxuY29uc3QgQ09ERVhfQUdFTlRfU0FOREJPWCA9IHtcbiAgJ2V6LWV4ZWN1dG9yJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1wbGFubmVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1waGFzZS1yZXNlYXJjaGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1wcm9qZWN0LXJlc2VhcmNoZXInOiAnd29ya3NwYWNlLXdyaXRlJyxcbiAgJ2V6LXJlc2VhcmNoLXN5bnRoZXNpemVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei12ZXJpZmllcic6ICd3b3Jrc3BhY2Utd3JpdGUnLFxuICAnZXotY29kZWJhc2UtbWFwcGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1yb2FkbWFwcGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1kZWJ1Z2dlcic6ICd3b3Jrc3BhY2Utd3JpdGUnLFxuICAnZXotcGxhbi1jaGVja2VyJzogJ3JlYWQtb25seScsXG4gICdlei1pbnRlZ3JhdGlvbi1jaGVja2VyJzogJ3JlYWQtb25seScsXG59O1xuXG4vLyBDb3BpbG90IHRvb2wgbmFtZSBtYXBwaW5nIFx1MjAxNCBDbGF1ZGUgQ29kZSB0b29scyB0byBHaXRIdWIgQ29waWxvdCB0b29sc1xuLy8gVG9vbCBtYXBwaW5nIGFwcGxpZXMgT05MWSB0byBhZ2VudHMsIE5PVCB0byBza2lsbHMgKHBlciBDT05URVhULm1kIGRlY2lzaW9uKVxuY29uc3QgY2xhdWRlVG9Db3BpbG90VG9vbHMgPSB7XG4gIFJlYWQ6ICdyZWFkJyxcbiAgV3JpdGU6ICdlZGl0JyxcbiAgRWRpdDogJ2VkaXQnLFxuICBCYXNoOiAnZXhlY3V0ZScsXG4gIEdyZXA6ICdzZWFyY2gnLFxuICBHbG9iOiAnc2VhcmNoJyxcbiAgVGFzazogJ2FnZW50JyxcbiAgV2ViU2VhcmNoOiAnd2ViJyxcbiAgV2ViRmV0Y2g6ICd3ZWInLFxuICBUb2RvV3JpdGU6ICd0b2RvJyxcbiAgQXNrVXNlclF1ZXN0aW9uOiAnYXNrX3VzZXInLFxuICBTbGFzaENvbW1hbmQ6ICdza2lsbCcsXG59O1xuXG4vLyBHZXQgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvblxuaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfTtcblxuLy8gUGFyc2UgYXJnc1xuY29uc3QgYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbmNvbnN0IGhhc0dsb2JhbCA9IGFyZ3MuaW5jbHVkZXMoJy0tZ2xvYmFsJykgfHwgYXJncy5pbmNsdWRlcygnLWcnKTtcbmNvbnN0IGhhc0xvY2FsID0gYXJncy5pbmNsdWRlcygnLS1sb2NhbCcpIHx8IGFyZ3MuaW5jbHVkZXMoJy1sJyk7XG5jb25zdCBoYXNPcGVuY29kZSA9IGFyZ3MuaW5jbHVkZXMoJy0tb3BlbmNvZGUnKTtcbmNvbnN0IGhhc0NsYXVkZSA9IGFyZ3MuaW5jbHVkZXMoJy0tY2xhdWRlJyk7XG5jb25zdCBoYXNHZW1pbmkgPSBhcmdzLmluY2x1ZGVzKCctLWdlbWluaScpO1xuY29uc3QgaGFzQ29kZXggPSBhcmdzLmluY2x1ZGVzKCctLWNvZGV4Jyk7XG5jb25zdCBoYXNDb3BpbG90ID0gYXJncy5pbmNsdWRlcygnLS1jb3BpbG90Jyk7XG5jb25zdCBoYXNRd2VuID0gYXJncy5pbmNsdWRlcygnLS1xd2VuJyk7XG5jb25zdCBoYXNLaW1pID0gYXJncy5pbmNsdWRlcygnLS1raW1pJyk7XG5jb25zdCBoYXNCb3RoID0gYXJncy5pbmNsdWRlcygnLS1ib3RoJyk7IC8vIExlZ2FjeSBmbGFnLCBrZWVwcyB3b3JraW5nXG5jb25zdCBoYXNBbGwgPSBhcmdzLmluY2x1ZGVzKCctLWFsbCcpO1xuY29uc3QgaGFzVW5pbnN0YWxsID0gYXJncy5pbmNsdWRlcygnLS11bmluc3RhbGwnKSB8fCBhcmdzLmluY2x1ZGVzKCctdScpO1xuXG4vLyBSdW50aW1lIHNlbGVjdGlvbiAtIGNhbiBiZSBzZXQgYnkgZmxhZ3Mgb3IgaW50ZXJhY3RpdmUgcHJvbXB0XG5sZXQgc2VsZWN0ZWRSdW50aW1lczogc3RyaW5nW10gPSBbXTtcbmlmIChoYXNBbGwpIHtcbiAgc2VsZWN0ZWRSdW50aW1lcyA9IFsnY2xhdWRlJywgJ29wZW5jb2RlJywgJ2dlbWluaScsICdjb2RleCcsICdjb3BpbG90JywgJ3F3ZW4nLCAna2ltaSddO1xufSBlbHNlIGlmIChoYXNCb3RoKSB7XG4gIHNlbGVjdGVkUnVudGltZXMgPSBbJ2NsYXVkZScsICdvcGVuY29kZSddO1xufSBlbHNlIHtcbiAgaWYgKGhhc09wZW5jb2RlKSBzZWxlY3RlZFJ1bnRpbWVzLnB1c2goJ29wZW5jb2RlJyk7XG4gIGlmIChoYXNDbGF1ZGUpIHNlbGVjdGVkUnVudGltZXMucHVzaCgnY2xhdWRlJyk7XG4gIGlmIChoYXNHZW1pbmkpIHNlbGVjdGVkUnVudGltZXMucHVzaCgnZ2VtaW5pJyk7XG4gIGlmIChoYXNDb2RleCkgc2VsZWN0ZWRSdW50aW1lcy5wdXNoKCdjb2RleCcpO1xuICBpZiAoaGFzQ29waWxvdCkgc2VsZWN0ZWRSdW50aW1lcy5wdXNoKCdjb3BpbG90Jyk7XG4gIGlmIChoYXNRd2VuKSBzZWxlY3RlZFJ1bnRpbWVzLnB1c2goJ3F3ZW4nKTtcbiAgaWYgKGhhc0tpbWkpIHNlbGVjdGVkUnVudGltZXMucHVzaCgna2ltaScpO1xufVxuXG4vLyBXU0wgKyBXaW5kb3dzIE5vZGUuanMgZGV0ZWN0aW9uXG4vLyBXaGVuIFdpbmRvd3MtbmF0aXZlIE5vZGUgcnVucyBvbiBXU0wsIG9zLmhvbWVkaXIoKSBhbmQgcGF0aC5qb2luKCkgcHJvZHVjZVxuLy8gYmFja3NsYXNoIHBhdGhzIHRoYXQgZG9uJ3QgcmVzb2x2ZSBjb3JyZWN0bHkgb24gdGhlIExpbnV4IGZpbGVzeXN0ZW0uXG5pZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICBsZXQgaXNXU0wgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuV1NMX0RJU1RST19OQU1FKSB7XG4gICAgICBpc1dTTCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChmcy5leGlzdHNTeW5jKCcvcHJvYy92ZXJzaW9uJykpIHtcbiAgICAgIGNvbnN0IHByb2NWZXJzaW9uID0gZnMucmVhZEZpbGVTeW5jKCcvcHJvYy92ZXJzaW9uJywgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHByb2NWZXJzaW9uLmluY2x1ZGVzKCdtaWNyb3NvZnQnKSB8fCBwcm9jVmVyc2lvbi5pbmNsdWRlcygnd3NsJykpIHtcbiAgICAgICAgaXNXU0wgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gSWdub3JlIHJlYWQgZXJyb3JzIFx1MjAxNCBub3QgV1NMXG4gIH1cblxuICBpZiAoaXNXU0wpIHtcbiAgICBjb25zb2xlLmVycm9yKGBcbiR7eWVsbG93fVx1MjZBMCBEZXRlY3RlZCBXU0wgd2l0aCBXaW5kb3dzLW5hdGl2ZSBOb2RlLmpzLiR7cmVzZXR9XG5cblRoaXMgY2F1c2VzIHBhdGggcmVzb2x1dGlvbiBpc3N1ZXMgdGhhdCBwcmV2ZW50IGNvcnJlY3QgaW5zdGFsbGF0aW9uLlxuUGxlYXNlIGluc3RhbGwgYSBMaW51eC1uYXRpdmUgTm9kZS5qcyBpbnNpZGUgV1NMOlxuXG4gIGN1cmwgLWZzU0wgaHR0cHM6Ly9mbm0udmVyY2VsLmFwcC9pbnN0YWxsIHwgYmFzaFxuICBmbm0gaW5zdGFsbCAtLWx0c1xuXG5UaGVuIHJlLXJ1bjogbnB4IGV6LWFnZW50c1xuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIHBhdGhQcmVmaXggKHdoaWNoIHVzZXMgYWJzb2x1dGUgcGF0aHMgZm9yIGdsb2JhbCBpbnN0YWxscykgdG8gYVxuICogJEhPTUUtcmVsYXRpdmUgZm9ybSBmb3IgcmVwbGFjaW5nICRIT01FLy5jbGF1ZGUvIHJlZmVyZW5jZXMgaW4gYmFzaCBjb2RlIGJsb2Nrcy5cbiAqIFByZXNlcnZlcyAkSE9NRSBhcyBhIHNoZWxsIHZhcmlhYmxlIHNvIHBhdGhzIHJlbWFpbiBwb3J0YWJsZSBhY3Jvc3MgbWFjaGluZXMuXG4gKi9cbmZ1bmN0aW9uIHRvSG9tZVByZWZpeChwYXRoUHJlZml4OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBob21lID0gb3MuaG9tZWRpcigpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGhQcmVmaXgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKGhvbWUpKSB7XG4gICAgcmV0dXJuICckSE9NRScgKyBub3JtYWxpemVkLnNsaWNlKGhvbWUubGVuZ3RoKTtcbiAgfVxuICAvLyBDb252ZXJ0IHRpbGRlLWJhc2VkIHBhdGhzIHRvICRIT01FLWJhc2VkIHBhdGhzIGZvciBiYXNoIGNvZGUgYmxvY2tzXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoJ34vJykpIHtcbiAgICByZXR1cm4gJyRIT01FJyArIG5vcm1hbGl6ZWQuc2xpY2UoMSk7XG4gIH1cbiAgLy8gRm9yIHJlbGF0aXZlIHBhdGhzIG9yIHBhdGhzIG5vdCB1bmRlciAkSE9NRSwgcmV0dXJuIGFzLWlzXG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vLyBIZWxwZXIgdG8gZ2V0IGRpcmVjdG9yeSBuYW1lIGZvciBhIHJ1bnRpbWUgKHVzZWQgZm9yIGxvY2FsL3Byb2plY3QgaW5zdGFsbHMpXG5mdW5jdGlvbiBnZXREaXJOYW1lKHJ1bnRpbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHJldHVybiAnLmdpdGh1Yic7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSByZXR1cm4gJy5vcGVuY29kZSc7XG4gIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykgcmV0dXJuICcuZ2VtaW5pJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb2RleCcpIHJldHVybiAnLmNvZGV4JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcmV0dXJuICcucXdlbic7XG4gIGlmIChydW50aW1lID09PSAna2ltaScpIHJldHVybiAnLmtpbWknO1xuICByZXR1cm4gJy5jbGF1ZGUnO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY29uZmlnIGRpcmVjdG9yeSBwYXRoIHJlbGF0aXZlIHRvIGhvbWUgZGlyZWN0b3J5IGZvciBhIHJ1bnRpbWVcbiAqIFVzZWQgZm9yIHRlbXBsYXRpbmcgaG9va3MgdGhhdCB1c2UgcGF0aC5qb2luKGhvbWVEaXIsICc8Y29uZmlnRGlyPicsIC4uLilcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCAnY29waWxvdCcsIG9yICdxd2VuJ1xuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXG4gKi9cbmZ1bmN0aW9uIGdldENvbmZpZ0RpckZyb21Ib21lKHJ1bnRpbWU6IHN0cmluZywgaXNHbG9iYWw6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoIWlzR2xvYmFsKSB7XG4gICAgLy8gTG9jYWwgaW5zdGFsbHMgdXNlIHRoZSBzYW1lIGRpciBuYW1lIHBhdHRlcm5cbiAgICByZXR1cm4gYCcke2dldERpck5hbWUocnVudGltZSl9J2A7XG4gIH1cbiAgLy8gR2xvYmFsIGluc3RhbGxzIC0gT3BlbkNvZGUgdXNlcyBYREcgcGF0aCBzdHJ1Y3R1cmVcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb3BpbG90JykgcmV0dXJuIFwiJy5jb3BpbG90J1wiO1xuICBpZiAocnVudGltZSA9PT0gJ29wZW5jb2RlJykge1xuICAgIC8vIE9wZW5Db2RlOiB+Ly5jb25maWcvb3BlbmNvZGUgLT4gJy5jb25maWcnLCAnb3BlbmNvZGUnXG4gICAgLy8gUmV0dXJuIGFzIGNvbW1hLXNlcGFyYXRlZCBmb3IgcGF0aC5qb2luKCkgcmVwbGFjZW1lbnRcbiAgICByZXR1cm4gXCInLmNvbmZpZycsICdvcGVuY29kZSdcIjtcbiAgfVxuICBpZiAocnVudGltZSA9PT0gJ2dlbWluaScpIHJldHVybiBcIicuZ2VtaW5pJ1wiO1xuICBpZiAocnVudGltZSA9PT0gJ2NvZGV4JykgcmV0dXJuIFwiJy5jb2RleCdcIjtcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcmV0dXJuIFwiJy5xd2VuJ1wiO1xuICBpZiAocnVudGltZSA9PT0gJ2tpbWknKSByZXR1cm4gXCInLmtpbWknXCI7XG4gIHJldHVybiBcIicuY2xhdWRlJ1wiO1xufVxuXG4vKipcbiAqIEdldCB0aGUgZ2xvYmFsIGNvbmZpZyBkaXJlY3RvcnkgZm9yIE9wZW5Db2RlXG4gKiBPcGVuQ29kZSBmb2xsb3dzIFhERyBCYXNlIERpcmVjdG9yeSBzcGVjIGFuZCB1c2VzIH4vLmNvbmZpZy9vcGVuY29kZS9cbiAqIFByaW9yaXR5OiBPUEVOQ09ERV9DT05GSUdfRElSID4gZGlybmFtZShPUEVOQ09ERV9DT05GSUcpID4gWERHX0NPTkZJR19IT01FL29wZW5jb2RlID4gfi8uY29uZmlnL29wZW5jb2RlXG4gKi9cbmZ1bmN0aW9uIGdldE9wZW5jb2RlR2xvYmFsRGlyKCkge1xuICAvLyAxLiBFeHBsaWNpdCBPUEVOQ09ERV9DT05GSUdfRElSIGVudiB2YXJcbiAgaWYgKHByb2Nlc3MuZW52Lk9QRU5DT0RFX0NPTkZJR19ESVIpIHtcbiAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuT1BFTkNPREVfQ09ORklHX0RJUik7XG4gIH1cbiAgXG4gIC8vIDIuIE9QRU5DT0RFX0NPTkZJRyBlbnYgdmFyICh1c2UgaXRzIGRpcmVjdG9yeSlcbiAgaWYgKHByb2Nlc3MuZW52Lk9QRU5DT0RFX0NPTkZJRykge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUoZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuT1BFTkNPREVfQ09ORklHKSk7XG4gIH1cbiAgXG4gIC8vIDMuIFhER19DT05GSUdfSE9NRS9vcGVuY29kZVxuICBpZiAocHJvY2Vzcy5lbnYuWERHX0NPTkZJR19IT01FKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihleHBhbmRUaWxkZShwcm9jZXNzLmVudi5YREdfQ09ORklHX0hPTUUpLCAnb3BlbmNvZGUnKTtcbiAgfVxuICBcbiAgLy8gNC4gRGVmYXVsdDogfi8uY29uZmlnL29wZW5jb2RlIChYREcgZGVmYXVsdClcbiAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29uZmlnJywgJ29wZW5jb2RlJyk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBnbG9iYWwgY29uZmlnIGRpcmVjdG9yeSBmb3IgYSBydW50aW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcnVudGltZSAtICdjbGF1ZGUnLCAnb3BlbmNvZGUnLCAnZ2VtaW5pJywgJ2NvZGV4Jywgb3IgJ2NvcGlsb3QnXG4gKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBleHBsaWNpdERpciAtIEV4cGxpY2l0IGRpcmVjdG9yeSBmcm9tIC0tY29uZmlnLWRpciBmbGFnXG4gKi9cbmZ1bmN0aW9uIGdldEdsb2JhbERpcihydW50aW1lOiBzdHJpbmcsIGV4cGxpY2l0RGlyOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHN0cmluZyB7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSB7XG4gICAgLy8gRm9yIE9wZW5Db2RlLCAtLWNvbmZpZy1kaXIgb3ZlcnJpZGVzIGVudiB2YXJzXG4gICAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUoZXhwbGljaXREaXIpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0T3BlbmNvZGVHbG9iYWxEaXIoKTtcbiAgfVxuICBcbiAgaWYgKHJ1bnRpbWUgPT09ICdnZW1pbmknKSB7XG4gICAgLy8gR2VtaW5pOiAtLWNvbmZpZy1kaXIgPiBHRU1JTklfQ09ORklHX0RJUiA+IH4vLmdlbWluaVxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkdFTUlOSV9DT05GSUdfRElSKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuR0VNSU5JX0NPTkZJR19ESVIpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5nZW1pbmknKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSB7XG4gICAgLy8gQ29kZXg6IC0tY29uZmlnLWRpciA+IENPREVYX0hPTUUgPiB+Ly5jb2RleFxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkNPREVYX0hPTUUpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShwcm9jZXNzLmVudi5DT0RFWF9IT01FKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29kZXgnKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHtcbiAgICAvLyBDb3BpbG90OiAtLWNvbmZpZy1kaXIgPiBDT1BJTE9UX0NPTkZJR19ESVIgPiB+Ly5jb3BpbG90XG4gICAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUoZXhwbGljaXREaXIpO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuQ09QSUxPVF9DT05GSUdfRElSKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuQ09QSUxPVF9DT05GSUdfRElSKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29waWxvdCcpO1xuICB9XG5cbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykge1xuICAgIC8vIFF3ZW4gQ29kZTogLS1jb25maWctZGlyID4gUVdFTl9DT05GSUdfRElSID4gfi8ucXdlblxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LlFXRU5fQ09ORklHX0RJUikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKHByb2Nlc3MuZW52LlFXRU5fQ09ORklHX0RJUik7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLnF3ZW4nKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAna2ltaScpIHtcbiAgICAvLyBLaW1pIENvZGU6IC0tY29uZmlnLWRpciA+IEtJTUlfQ09ORklHX0RJUiA+IH4vLmtpbWlcbiAgICBpZiAoZXhwbGljaXREaXIpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShleHBsaWNpdERpcik7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5LSU1JX0NPTkZJR19ESVIpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShwcm9jZXNzLmVudi5LSU1JX0NPTkZJR19ESVIpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5raW1pJyk7XG4gIH1cblxuICAvLyBDbGF1ZGUgQ29kZTogLS1jb25maWctZGlyID4gQ0xBVURFX0NPTkZJR19ESVIgPiB+Ly5jbGF1ZGVcbiAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuQ0xBVURFX0NPTkZJR19ESVIpIHtcbiAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuQ0xBVURFX0NPTkZJR19ESVIpO1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNsYXVkZScpO1xufVxuXG5jb25zdCBiYW5uZXIgPSAnXFxuJyArXG4gIGN5YW4gKyAnICBcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1NTdcdTI1ODhcdTI1ODhcdTI1NTcgIFx1MjU4OFx1MjU4OFx1MjU1N1xcbicgK1xuICAnICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NURcdTI1NUFcdTI1ODhcdTI1ODhcdTI1NTdcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NURcXG4nICtcbiAgJyAgXHUyNTg4XHUyNTg4XHUyNTg4XHUyNTg4XHUyNTg4XHUyNTU3ICAgXHUyNTVBXHUyNTg4XHUyNTg4XHUyNTg4XHUyNTU0XHUyNTVEIFxcbicgK1xuICAnICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NTBcdTI1NTBcdTI1NUQgICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1ODhcdTI1ODhcdTI1NTcgXFxuJyArXG4gICcgIFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU1N1x1MjU4OFx1MjU4OFx1MjU1NFx1MjU1RFx1MjU1QVx1MjU4OFx1MjU4OFx1MjU1N1xcbicgK1xuICAnICBcdTI1NUFcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NURcdTI1NUFcdTI1NTBcdTI1NUQgXHUyNTVBXHUyNTUwXHUyNTVEJyArIHJlc2V0ICsgJ1xcbicgK1xuICAnXFxuJyArXG4gICcgIEVaX0FnZW50cyAnICsgZGltICsgJ3YnICsgcGtnLnZlcnNpb24gKyByZXNldCArICdcXG4nICtcbiAgJyAgTXVsdGktTW9kZWwgRWRpdGlvbicgKyByZXNldCArICdcXG4nICtcbiAgJyAgQSBtZXRhLXByb21wdGluZywgY29udGV4dCBlbmdpbmVlcmluZyBhbmQgc3BlYy1kcml2ZW5cXG4nICtcbiAgJyAgZGV2ZWxvcG1lbnQgc3lzdGVtIGZvciBDbGF1ZGUgQ29kZSwgT3BlbkNvZGUsIEdlbWluaSwgQ29kZXgsIENvcGlsb3QsXFxuJyArXG4gICcgIFF3ZW4gQ29kZSwgS2ltaSBDb2RlLCB3aXRoIG11bHRpLW1vZGVsIHN1cHBvcnQuXFxuJyArXG4gICcgIE9yaWdpbmFsIGJ5IFRcdTAwQzJDSEVTIHwgTXVsdGktTW9kZWwgRm9yayBieSBAaG93bGlsLlxcbic7XG5cblxuLy8gUGFyc2UgLS1jb25maWctZGlyIGFyZ3VtZW50XG5mdW5jdGlvbiBwYXJzZUNvbmZpZ0RpckFyZygpIHtcbiAgY29uc3QgY29uZmlnRGlySW5kZXggPSBhcmdzLmZpbmRJbmRleChhcmcgPT4gYXJnID09PSAnLS1jb25maWctZGlyJyB8fCBhcmcgPT09ICctYycpO1xuICBpZiAoY29uZmlnRGlySW5kZXggIT09IC0xKSB7XG4gICAgY29uc3QgbmV4dEFyZyA9IGFyZ3NbY29uZmlnRGlySW5kZXggKyAxXTtcbiAgICAvLyBFcnJvciBpZiAtLWNvbmZpZy1kaXIgaXMgcHJvdmlkZWQgd2l0aG91dCBhIHZhbHVlIG9yIG5leHQgYXJnIGlzIGFub3RoZXIgZmxhZ1xuICAgIGlmICghbmV4dEFyZyB8fCBuZXh0QXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd30tLWNvbmZpZy1kaXIgcmVxdWlyZXMgYSBwYXRoIGFyZ3VtZW50JHtyZXNldH1gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRBcmc7XG4gIH1cbiAgLy8gQWxzbyBoYW5kbGUgLS1jb25maWctZGlyPXZhbHVlIGZvcm1hdFxuICBjb25zdCBjb25maWdEaXJBcmcgPSBhcmdzLmZpbmQoYXJnID0+IGFyZy5zdGFydHNXaXRoKCctLWNvbmZpZy1kaXI9JykgfHwgYXJnLnN0YXJ0c1dpdGgoJy1jPScpKTtcbiAgaWYgKGNvbmZpZ0RpckFyZykge1xuICAgIGNvbnN0IHZhbHVlID0gY29uZmlnRGlyQXJnLnNwbGl0KCc9JylbMV07XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd30tLWNvbmZpZy1kaXIgcmVxdWlyZXMgYSBub24tZW1wdHkgcGF0aCR7cmVzZXR9YCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmNvbnN0IGV4cGxpY2l0Q29uZmlnRGlyID0gcGFyc2VDb25maWdEaXJBcmcoKTtcbmNvbnN0IGhhc0hlbHAgPSBhcmdzLmluY2x1ZGVzKCctLWhlbHAnKSB8fCBhcmdzLmluY2x1ZGVzKCctaCcpO1xuY29uc3QgaGFzVmVyc2lvbiA9IGFyZ3MuaW5jbHVkZXMoJy0tdmVyc2lvbicpIHx8IGFyZ3MuaW5jbHVkZXMoJy12Jyk7XG5jb25zdCBmb3JjZVN0YXR1c2xpbmUgPSBhcmdzLmluY2x1ZGVzKCctLWZvcmNlLXN0YXR1c2xpbmUnKTtcblxuLy8gU2hvdyB2ZXJzaW9uIGlmIHJlcXVlc3RlZCAoc2tpcCBiYW5uZXIsIGp1c3Qgb3V0cHV0IHZlcnNpb24pXG5pZiAoaGFzVmVyc2lvbikge1xuICBjb25zb2xlLmxvZyhwa2cudmVyc2lvbik7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuY29uc29sZS5sb2coYmFubmVyKTtcblxuaWYgKGhhc1VuaW5zdGFsbCkge1xuICBjb25zb2xlLmxvZygnICBNb2RlOiBVbmluc3RhbGxcXG4nKTtcbn1cblxuLy8gU2hvdyBoZWxwIGlmIHJlcXVlc3RlZFxuaWYgKGhhc0hlbHApIHtcbiAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9VXNhZ2U6JHtyZXNldH0gbnB4IGV6LWFnZW50cyBbb3B0aW9uc11cXG5cXG4gICR7eWVsbG93fU9wdGlvbnM6JHtyZXNldH1cXG4gICAgJHtjeWFufS1nLCAtLWdsb2JhbCR7cmVzZXR9ICAgICAgICAgICAgICBJbnN0YWxsIGdsb2JhbGx5ICh0byBjb25maWcgZGlyZWN0b3J5KVxcbiAgICAke2N5YW59LWwsIC0tbG9jYWwke3Jlc2V0fSAgICAgICAgICAgICAgIEluc3RhbGwgbG9jYWxseSAodG8gY3VycmVudCBkaXJlY3RvcnkpXFxuICAgICR7Y3lhbn0tLWNsYXVkZSR7cmVzZXR9ICAgICAgICAgICAgICAgICAgSW5zdGFsbCBmb3IgQ2xhdWRlIENvZGUgb25seVxcbiAgICAke2N5YW59LS1vcGVuY29kZSR7cmVzZXR9ICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIE9wZW5Db2RlIG9ubHlcXG4gICAgJHtjeWFufS0tZ2VtaW5pJHtyZXNldH0gICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBHZW1pbmkgb25seVxcbiAgICAke2N5YW59LS1jb2RleCR7cmVzZXR9ICAgICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIENvZGV4IG9ubHlcXG4gICAgJHtjeWFufS0tY29waWxvdCR7cmVzZXR9ICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBDb3BpbG90IG9ubHlcXG4gICAgJHtjeWFufS0tcXdlbiR7cmVzZXR9ICAgICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBRd2VuIENvZGUgb25seVxcbiAgICAke2N5YW59LS1raW1pJHtyZXNldH0gICAgICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIEtpbWkgQ29kZSBvbmx5XFxuICAgICR7Y3lhbn0tLWFsbCR7cmVzZXR9ICAgICAgICAgICAgICAgICAgICAgSW5zdGFsbCBmb3IgYWxsIHJ1bnRpbWVzXFxuICAgICR7Y3lhbn0tdSwgLS11bmluc3RhbGwke3Jlc2V0fSAgICAgICAgICAgVW5pbnN0YWxsIEVaX0FnZW50cyAocmVtb3ZlIGFsbCBFWl9BZ2VudHMgZmlsZXMpXFxuICAgICR7Y3lhbn0tYywgLS1jb25maWctZGlyIDxwYXRoPiR7cmVzZXR9ICAgU3BlY2lmeSBjdXN0b20gY29uZmlnIGRpcmVjdG9yeVxcbiAgICAke2N5YW59LXYsIC0tdmVyc2lvbiR7cmVzZXR9ICAgICAgICAgICAgIFNob3cgdmVyc2lvbiBudW1iZXJcXG4gICAgJHtjeWFufS1oLCAtLWhlbHAke3Jlc2V0fSAgICAgICAgICAgICAgICBTaG93IHRoaXMgaGVscCBtZXNzYWdlXFxuICAgICR7Y3lhbn0tLWZvcmNlLXN0YXR1c2xpbmUke3Jlc2V0fSAgICAgICAgUmVwbGFjZSBleGlzdGluZyBzdGF0dXNsaW5lIGNvbmZpZ1xcblxcbiAgJHt5ZWxsb3d9RXhhbXBsZXM6JHtyZXNldH1cXG4gICAgJHtkaW19IyBJbnRlcmFjdGl2ZSBpbnN0YWxsIChwcm9tcHRzIGZvciBydW50aW1lIGFuZCBsb2NhdGlvbikke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzXFxuXFxuICAgICR7ZGltfSMgSW5zdGFsbCBmb3IgQ2xhdWRlIENvZGUgZ2xvYmFsbHkke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzIC0tY2xhdWRlIC0tZ2xvYmFsXFxuXFxuICAgICR7ZGltfSMgSW5zdGFsbCBmb3IgUXdlbiBDb2RlIGdsb2JhbGx5JHtyZXNldH1cXG4gICAgbnB4IGV6LWFnZW50cyAtLXF3ZW4gLS1nbG9iYWxcXG5cXG4gICAgJHtkaW19IyBJbnN0YWxsIGZvciBLaW1pIENvZGUgZ2xvYmFsbHkke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzIC0ta2ltaSAtLWdsb2JhbFxcblxcbiAgICAke2RpbX0jIEluc3RhbGwgZm9yIGFsbCBydW50aW1lcyBnbG9iYWxseSR7cmVzZXR9XFxuICAgIG5weCBlei1hZ2VudHMgLS1hbGwgLS1nbG9iYWxcXG5cXG4gICAgJHtkaW19IyBVbmluc3RhbGwgRVpfQWdlbnRzIGdsb2JhbGx5JHtyZXNldH1cXG4gICAgbnB4IGV6LWFnZW50cyAtLWFsbCAtLWdsb2JhbCAtLXVuaW5zdGFsbFxcblxcbiAgICAke2RpbX0jIFNob3cgdmVyc2lvbiR7cmVzZXR9XFxuICAgIG5weCBlei1hZ2VudHMgLS12ZXJzaW9uXFxuXFxuICAke3llbGxvd31Ob3Rlczoke3Jlc2V0fVxcbiAgICBUaGUgLS1jb25maWctZGlyIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBjb25maWd1cmF0aW9ucy5cXG4gICAgSXQgdGFrZXMgcHJpb3JpdHkgb3ZlciBDTEFVREVfQ09ORklHX0RJUiAvIEdFTUlOSV9DT05GSUdfRElSIC8gQ09ERVhfSE9NRSAvIENPUElMT1RfQ09ORklHX0RJUiAvIFFXRU5fQ09ORklHX0RJUiAvIEtJTUlfQ09ORklHX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXFxuXFxuICAke3llbGxvd31Nb2RlbCBQcm92aWRlcnM6JHtyZXNldH1cXG4gICAgT3BlbkFJIGFuZCBBbnRocm9waWMgYXJlIG1vZGVsIHByb3ZpZGVycyBjb25maWd1cmVkIGluIHNldHRpbmdzLmpzb24sXFxuICAgIG5vdCBzZXBhcmF0ZSBDTEkgcnVudGltZXMuIFNlZSBSRUFETUUubWQgZm9yIG1vZGVsIGNvbmZpZ3VyYXRpb24uXFxuYCk7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuLyoqXG4gKiBFeHBhbmQgfiB0byBob21lIGRpcmVjdG9yeSAoc2hlbGwgZG9lc24ndCBleHBhbmQgaW4gZW52IHZhcnMgcGFzc2VkIHRvIG5vZGUpXG4gKi9cbmZ1bmN0aW9uIGV4cGFuZFRpbGRlKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aCAmJiBmaWxlUGF0aC5zdGFydHNXaXRoKCd+LycpKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksIGZpbGVQYXRoLnNsaWNlKDIpKTtcbiAgfVxuICByZXR1cm4gZmlsZVBhdGg7XG59XG5cbi8qKlxuICogQnVpbGQgYSBob29rIGNvbW1hbmQgcGF0aCB1c2luZyBmb3J3YXJkIHNsYXNoZXMgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhdGliaWxpdHkuXG4gKiBPbiBXaW5kb3dzLCAkSE9NRSBpcyBub3QgZXhwYW5kZWQgYnkgY21kLmV4ZS9Qb3dlclNoZWxsLCBzbyB3ZSB1c2UgdGhlIGFjdHVhbCBwYXRoLlxuICovXG5mdW5jdGlvbiBidWlsZEhvb2tDb21tYW5kKGNvbmZpZ0RpciwgaG9va05hbWUpIHtcbiAgLy8gVXNlIGZvcndhcmQgc2xhc2hlcyBmb3IgTm9kZS5qcyBjb21wYXRpYmlsaXR5IG9uIGFsbCBwbGF0Zm9ybXNcbiAgY29uc3QgaG9va3NQYXRoID0gY29uZmlnRGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKSArICcvaG9va3MvJyArIGhvb2tOYW1lO1xuICByZXR1cm4gYG5vZGUgXCIke2hvb2tzUGF0aH1cImA7XG59XG5cbi8qKlxuICogUmVhZCBhbmQgcGFyc2Ugc2V0dGluZ3MuanNvbiwgcmV0dXJuaW5nIGVtcHR5IG9iamVjdCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gKi9cbmZ1bmN0aW9uIHJlYWRTZXR0aW5ncyhzZXR0aW5nc1BhdGgpIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoc2V0dGluZ3NQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBXcml0ZSBzZXR0aW5ncy5qc29uIHdpdGggcHJvcGVyIGZvcm1hdHRpbmdcbiAqL1xuZnVuY3Rpb24gd3JpdGVTZXR0aW5ncyhzZXR0aW5nc1BhdGgsIHNldHRpbmdzKSB7XG4gIGZzLndyaXRlRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgbnVsbCwgMikgKyAnXFxuJyk7XG59XG5cbi8vIENhY2hlIGZvciBhdHRyaWJ1dGlvbiBzZXR0aW5ncyAocG9wdWxhdGVkIG9uY2UgcGVyIHJ1bnRpbWUgZHVyaW5nIGluc3RhbGwpXG5jb25zdCBhdHRyaWJ1dGlvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmc+KCk7XG5cbi8qKlxuICogR2V0IGNvbW1pdCBhdHRyaWJ1dGlvbiBzZXR0aW5nIGZvciBhIHJ1bnRpbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCBvciAnY29waWxvdCdcbiAqIEByZXR1cm5zIHtudWxsfHVuZGVmaW5lZHxzdHJpbmd9IG51bGwgPSByZW1vdmUsIHVuZGVmaW5lZCA9IGtlZXAgZGVmYXVsdCwgc3RyaW5nID0gY3VzdG9tXG4gKi9cbmZ1bmN0aW9uIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWU6IHN0cmluZyk6IG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcge1xuICAvLyBSZXR1cm4gY2FjaGVkIHZhbHVlIGlmIGF2YWlsYWJsZVxuICBpZiAoYXR0cmlidXRpb25DYWNoZS5oYXMocnVudGltZSkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRpb25DYWNoZS5nZXQocnVudGltZSk7XG4gIH1cblxuICBsZXQgcmVzdWx0OiBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nO1xuXG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVhZFNldHRpbmdzKHBhdGguam9pbihnZXRHbG9iYWxEaXIoJ29wZW5jb2RlJywgbnVsbCksICdvcGVuY29kZS5qc29uJykpO1xuICAgIHJlc3VsdCA9IGNvbmZpZy5kaXNhYmxlX2FpX2F0dHJpYnV0aW9uID09PSB0cnVlID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykge1xuICAgIC8vIEdlbWluaTogY2hlY2sgZ2VtaW5pIHNldHRpbmdzLmpzb24gZm9yIGF0dHJpYnV0aW9uIGNvbmZpZ1xuICAgIGNvbnN0IHNldHRpbmdzID0gcmVhZFNldHRpbmdzKHBhdGguam9pbihnZXRHbG9iYWxEaXIoJ2dlbWluaScsIGV4cGxpY2l0Q29uZmlnRGlyKSwgJ3NldHRpbmdzLmpzb24nKSk7XG4gICAgaWYgKCFzZXR0aW5ncy5hdHRyaWJ1dGlvbiB8fCBzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MuYXR0cmlidXRpb24uY29tbWl0ID09PSAnJykge1xuICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gc2V0dGluZ3MuYXR0cmlidXRpb24uY29tbWl0O1xuICAgIH1cbiAgfSBlbHNlIGlmIChydW50aW1lID09PSAnY2xhdWRlJykge1xuICAgIC8vIENsYXVkZSBDb2RlXG4gICAgY29uc3Qgc2V0dGluZ3MgPSByZWFkU2V0dGluZ3MocGF0aC5qb2luKGdldEdsb2JhbERpcignY2xhdWRlJywgZXhwbGljaXRDb25maWdEaXIpLCAnc2V0dGluZ3MuanNvbicpKTtcbiAgICBpZiAoIXNldHRpbmdzLmF0dHJpYnV0aW9uIHx8IHNldHRpbmdzLmF0dHJpYnV0aW9uLmNvbW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQgPT09ICcnKSB7XG4gICAgICByZXN1bHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIENvZGV4IGFuZCBDb3BpbG90IGN1cnJlbnRseSBoYXZlIG5vIGF0dHJpYnV0aW9uIHNldHRpbmcgZXF1aXZhbGVudFxuICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIENhY2hlIGFuZCByZXR1cm5cbiAgYXR0cmlidXRpb25DYWNoZS5zZXQocnVudGltZSwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIENvLUF1dGhvcmVkLUJ5IGxpbmVzIGJhc2VkIG9uIGF0dHJpYnV0aW9uIHNldHRpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gRmlsZSBjb250ZW50IHRvIHByb2Nlc3NcbiAqIEBwYXJhbSB7bnVsbHx1bmRlZmluZWR8c3RyaW5nfSBhdHRyaWJ1dGlvbiAtIG51bGw9cmVtb3ZlLCB1bmRlZmluZWQ9a2VlcCwgc3RyaW5nPXJlcGxhY2VcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFByb2Nlc3NlZCBjb250ZW50XG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50OiBzdHJpbmcsIGF0dHJpYnV0aW9uOiBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGF0dHJpYnV0aW9uID09PSBudWxsKSB7XG4gICAgLy8gUmVtb3ZlIENvLUF1dGhvcmVkLUJ5IGxpbmVzIGFuZCB0aGUgcHJlY2VkaW5nIGJsYW5rIGxpbmVcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKC8oXFxyP1xcbil7Mn1Dby1BdXRob3JlZC1CeTouKiQvZ2ltLCAnJyk7XG4gIH1cbiAgaWYgKGF0dHJpYnV0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICAvLyBSZXBsYWNlIHdpdGggY3VzdG9tIGF0dHJpYnV0aW9uIChlc2NhcGUgJCB0byBwcmV2ZW50IGJhY2tyZWZlcmVuY2UgaW5qZWN0aW9uKVxuICBjb25zdCBzYWZlQXR0cmlidXRpb24gPSBhdHRyaWJ1dGlvbi5yZXBsYWNlKC9cXCQvZywgJyQkJCQnKTtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSgvQ28tQXV0aG9yZWQtQnk6LiokL2dpbSwgYENvLUF1dGhvcmVkLUJ5OiAke3NhZmVBdHRyaWJ1dGlvbn1gKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IENsYXVkZSBDb2RlIGZyb250bWF0dGVyIHRvIG9wZW5jb2RlIGZvcm1hdFxuICogLSBDb252ZXJ0cyAnYWxsb3dlZC10b29sczonIGFycmF5IHRvICdwZXJtaXNzaW9uOicgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIE1hcmtkb3duIGZpbGUgY29udGVudCB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ29udGVudCB3aXRoIGNvbnZlcnRlZCBmcm9udG1hdHRlclxuICovXG4vLyBDb2xvciBuYW1lIHRvIGhleCBtYXBwaW5nIGZvciBvcGVuY29kZSBjb21wYXRpYmlsaXR5XG5jb25zdCBjb2xvck5hbWVUb0hleCA9IHtcbiAgY3lhbjogJyMwMEZGRkYnLFxuICByZWQ6ICcjRkYwMDAwJyxcbiAgZ3JlZW46ICcjMDBGRjAwJyxcbiAgYmx1ZTogJyMwMDAwRkYnLFxuICB5ZWxsb3c6ICcjRkZGRjAwJyxcbiAgbWFnZW50YTogJyNGRjAwRkYnLFxuICBvcmFuZ2U6ICcjRkZBNTAwJyxcbiAgcHVycGxlOiAnIzgwMDA4MCcsXG4gIHBpbms6ICcjRkZDMENCJyxcbiAgd2hpdGU6ICcjRkZGRkZGJyxcbiAgYmxhY2s6ICcjMDAwMDAwJyxcbiAgZ3JheTogJyM4MDgwODAnLFxuICBncmV5OiAnIzgwODA4MCcsXG59O1xuXG4vLyBUb29sIG5hbWUgbWFwcGluZyBmcm9tIENsYXVkZSBDb2RlIHRvIE9wZW5Db2RlXG4vLyBPcGVuQ29kZSB1c2VzIGxvd2VyY2FzZSB0b29sIG5hbWVzOyBzcGVjaWFsIG1hcHBpbmdzIGZvciByZW5hbWVkIHRvb2xzXG5jb25zdCBjbGF1ZGVUb09wZW5jb2RlVG9vbHMgPSB7XG4gIEFza1VzZXJRdWVzdGlvbjogJ3F1ZXN0aW9uJyxcbiAgU2xhc2hDb21tYW5kOiAnc2tpbGwnLFxuICBUb2RvV3JpdGU6ICd0b2Rvd3JpdGUnLFxuICBXZWJGZXRjaDogJ3dlYmZldGNoJyxcbiAgV2ViU2VhcmNoOiAnd2Vic2VhcmNoJywgIC8vIFBsdWdpbi9NQ1AgLSBrZWVwIGZvciBjb21wYXRpYmlsaXR5XG59O1xuXG4vLyBUb29sIG5hbWUgbWFwcGluZyBmcm9tIENsYXVkZSBDb2RlIHRvIEdlbWluaSBDTElcbi8vIEdlbWluaSBDTEkgdXNlcyBzbmFrZV9jYXNlIGJ1aWx0LWluIHRvb2wgbmFtZXNcbmNvbnN0IGNsYXVkZVRvR2VtaW5pVG9vbHMgPSB7XG4gIFJlYWQ6ICdyZWFkX2ZpbGUnLFxuICBXcml0ZTogJ3dyaXRlX2ZpbGUnLFxuICBFZGl0OiAncmVwbGFjZScsXG4gIEJhc2g6ICdydW5fc2hlbGxfY29tbWFuZCcsXG4gIEdsb2I6ICdnbG9iJyxcbiAgR3JlcDogJ3NlYXJjaF9maWxlX2NvbnRlbnQnLFxuICBXZWJTZWFyY2g6ICdnb29nbGVfd2ViX3NlYXJjaCcsXG4gIFdlYkZldGNoOiAnd2ViX2ZldGNoJyxcbiAgVG9kb1dyaXRlOiAnd3JpdGVfdG9kb3MnLFxuICBBc2tVc2VyUXVlc3Rpb246ICdhc2tfdXNlcicsXG59O1xuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gT3BlbkNvZGUgZm9ybWF0XG4gKiAtIEFwcGxpZXMgc3BlY2lhbCBtYXBwaW5ncyAoQXNrVXNlclF1ZXN0aW9uIC0+IHF1ZXN0aW9uLCBldGMuKVxuICogLSBDb252ZXJ0cyB0byBsb3dlcmNhc2UgKGV4Y2VwdCBNQ1AgdG9vbHMgd2hpY2gga2VlcCB0aGVpciBmb3JtYXQpXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRUb29sTmFtZShjbGF1ZGVUb29sKSB7XG4gIC8vIENoZWNrIGZvciBzcGVjaWFsIG1hcHBpbmcgZmlyc3RcbiAgaWYgKGNsYXVkZVRvT3BlbmNvZGVUb29sc1tjbGF1ZGVUb29sXSkge1xuICAgIHJldHVybiBjbGF1ZGVUb09wZW5jb2RlVG9vbHNbY2xhdWRlVG9vbF07XG4gIH1cbiAgLy8gTUNQIHRvb2xzIChtY3BfXyopIGtlZXAgdGhlaXIgZm9ybWF0XG4gIGlmIChjbGF1ZGVUb29sLnN0YXJ0c1dpdGgoJ21jcF9fJykpIHtcbiAgICByZXR1cm4gY2xhdWRlVG9vbDtcbiAgfVxuICAvLyBEZWZhdWx0OiBjb252ZXJ0IHRvIGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gR2VtaW5pIENMSSBmb3JtYXRcbiAqIC0gQXBwbGllcyBDbGF1ZGVcdTIxOTJHZW1pbmkgbWFwcGluZyAoUmVhZFx1MjE5MnJlYWRfZmlsZSwgQmFzaFx1MjE5MnJ1bl9zaGVsbF9jb21tYW5kLCBldGMuKVxuICogLSBGaWx0ZXJzIG91dCBNQ1AgdG9vbHMgKG1jcF9fKikgXHUyMDE0IHRoZXkgYXJlIGF1dG8tZGlzY292ZXJlZCBhdCBydW50aW1lIGluIEdlbWluaVxuICogLSBGaWx0ZXJzIG91dCBUYXNrIFx1MjAxNCBhZ2VudHMgYXJlIGF1dG8tcmVnaXN0ZXJlZCBhcyB0b29scyBpbiBHZW1pbmlcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH0gR2VtaW5pIHRvb2wgbmFtZSwgb3IgbnVsbCBpZiB0b29sIHNob3VsZCBiZSBleGNsdWRlZFxuICovXG5mdW5jdGlvbiBjb252ZXJ0R2VtaW5pVG9vbE5hbWUoY2xhdWRlVG9vbCkge1xuICAvLyBNQ1AgdG9vbHM6IGV4Y2x1ZGUgXHUyMDE0IGF1dG8tZGlzY292ZXJlZCBmcm9tIG1jcFNlcnZlcnMgY29uZmlnIGF0IHJ1bnRpbWVcbiAgaWYgKGNsYXVkZVRvb2wuc3RhcnRzV2l0aCgnbWNwX18nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIFRhc2s6IGV4Y2x1ZGUgXHUyMDE0IGFnZW50cyBhcmUgYXV0by1yZWdpc3RlcmVkIGFzIGNhbGxhYmxlIHRvb2xzXG4gIGlmIChjbGF1ZGVUb29sID09PSAnVGFzaycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBDaGVjayBmb3IgZXhwbGljaXQgbWFwcGluZ1xuICBpZiAoY2xhdWRlVG9HZW1pbmlUb29sc1tjbGF1ZGVUb29sXSkge1xuICAgIHJldHVybiBjbGF1ZGVUb0dlbWluaVRvb2xzW2NsYXVkZVRvb2xdO1xuICB9XG4gIC8vIERlZmF1bHQ6IGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gR2l0SHViIENvcGlsb3QgZm9ybWF0LlxuICogLSBBcHBsaWVzIGV4cGxpY2l0IG1hcHBpbmcgZnJvbSBjbGF1ZGVUb0NvcGlsb3RUb29sc1xuICogLSBIYW5kbGVzIG1jcF9fY29udGV4dDdfXyogcHJlZml4IFx1MjE5MiBpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8qXG4gKiAtIEZhbGxzIGJhY2sgdG8gbG93ZXJjYXNlIGZvciB1bmtub3duIHRvb2xzXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDb3BpbG90VG9vbE5hbWUoY2xhdWRlVG9vbCkge1xuICAvLyBtY3BfX2NvbnRleHQ3X18qIHdpbGRjYXJkIFx1MjE5MiBpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8qXG4gIGlmIChjbGF1ZGVUb29sLnN0YXJ0c1dpdGgoJ21jcF9fY29udGV4dDdfXycpKSB7XG4gICAgcmV0dXJuICdpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8nICsgY2xhdWRlVG9vbC5zbGljZSgnbWNwX19jb250ZXh0N19fJy5sZW5ndGgpO1xuICB9XG4gIC8vIENoZWNrIGV4cGxpY2l0IG1hcHBpbmdcbiAgaWYgKGNsYXVkZVRvQ29waWxvdFRvb2xzW2NsYXVkZVRvb2xdKSB7XG4gICAgcmV0dXJuIGNsYXVkZVRvQ29waWxvdFRvb2xzW2NsYXVkZVRvb2xdO1xuICB9XG4gIC8vIERlZmF1bHQ6IGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEFwcGx5IENvcGlsb3Qtc3BlY2lmaWMgY29udGVudCBjb252ZXJzaW9uIFx1MjAxNCBDT05WLTA2IChwYXRocykgKyBDT05WLTA3IChjb21tYW5kIG5hbWVzKS5cbiAqIFBhdGggbWFwcGluZ3MgZGVwZW5kIG9uIGluc3RhbGwgbW9kZTpcbiAqICAgR2xvYmFsOiB+Ly5jbGF1ZGUvIFx1MjE5MiB+Ly5jb3BpbG90LywgLi8uY2xhdWRlLyBcdTIxOTIgLi8uZ2l0aHViL1xuICogICBMb2NhbDogIH4vLmNsYXVkZS8gXHUyMTkyIC4vLmdpdGh1Yi8sIC4vLmNsYXVkZS8gXHUyMTkyIC4vLmdpdGh1Yi9cbiAqIEFwcGxpZWQgdG8gQUxMIENvcGlsb3QgY29udGVudCAoc2tpbGxzLCBhZ2VudHMsIGVuZ2luZSBmaWxlcykuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIFNvdXJjZSBjb250ZW50IHRvIGNvbnZlcnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzR2xvYmFsPWZhbHNlXSAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsID0gZmFsc2UpIHtcbiAgbGV0IGMgPSBjb250ZW50O1xuICAvLyBDT05WLTA2OiBQYXRoIHJlcGxhY2VtZW50IFx1MjAxNCBtb3N0IHNwZWNpZmljIGZpcnN0IHRvIGF2b2lkIHN1YnN0cmluZyBtYXRjaGVzXG4gIGlmIChpc0dsb2JhbCkge1xuICAgIGMgPSBjLnJlcGxhY2UoL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZywgJyRIT01FLy5jb3BpbG90LycpO1xuICAgIGMgPSBjLnJlcGxhY2UoL35cXC9cXC5jbGF1ZGVcXC8vZywgJ34vLmNvcGlsb3QvJyk7XG4gIH0gZWxzZSB7XG4gICAgYyA9IGMucmVwbGFjZSgvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nLCAnLmdpdGh1Yi8nKTtcbiAgICBjID0gYy5yZXBsYWNlKC9+XFwvXFwuY2xhdWRlXFwvL2csICcuZ2l0aHViLycpO1xuICB9XG4gIGMgPSBjLnJlcGxhY2UoL1xcLlxcL1xcLmNsYXVkZVxcLy9nLCAnLi8uZ2l0aHViLycpO1xuICBjID0gYy5yZXBsYWNlKC9cXC5jbGF1ZGVcXC8vZywgJy5naXRodWIvJyk7XG4gIC8vIENPTlYtMDc6IENvbW1hbmQgbmFtZSBjb252ZXJzaW9uIChhbGwgZXo6IHJlZmVyZW5jZXMgXHUyMTkyIGV6LSlcbiAgYyA9IGMucmVwbGFjZSgvZXo6L2csICdlei0nKTtcbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQ29udmVydCBhIENsYXVkZSBjb21tYW5kICgubWQpIHRvIGEgQ29waWxvdCBza2lsbCAoU0tJTEwubWQpLlxuICogVHJhbnNmb3JtcyBmcm9udG1hdHRlciBvbmx5IFx1MjAxNCBib2R5IHBhc3NlcyB0aHJvdWdoIHdpdGggQ09OVi0wNi8wNyBhcHBsaWVkLlxuICogU2tpbGxzIGtlZXAgb3JpZ2luYWwgdG9vbCBuYW1lcyAobm8gbWFwcGluZykgcGVyIENPTlRFWFQubWQgZGVjaXNpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db3BpbG90U2tpbGwoY29udGVudCwgc2tpbGxOYW1lLCBpc0dsb2JhbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsKTtcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb252ZXJ0ZWQpO1xuICBpZiAoIWZyb250bWF0dGVyKSByZXR1cm4gY29udmVydGVkO1xuXG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuICBjb25zdCBhcmd1bWVudEhpbnQgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2FyZ3VtZW50LWhpbnQnKTtcbiAgY29uc3QgYWdlbnQgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2FnZW50Jyk7XG5cbiAgLy8gQ09OVi0wMjogRXh0cmFjdCBhbGxvd2VkLXRvb2xzIFlBTUwgbXVsdGlsaW5lIGxpc3QgXHUyMTkyIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmdcbiAgY29uc3QgdG9vbHNNYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKC9eYWxsb3dlZC10b29sczpcXHMqXFxuKCg/OlxccystXFxzKy4rXFxuPykqKS9tKTtcbiAgbGV0IHRvb2xzTGluZSA9ICcnO1xuICBpZiAodG9vbHNNYXRjaCkge1xuICAgIGNvbnN0IHRvb2xzID0gdG9vbHNNYXRjaFsxXS5tYXRjaCgvXlxccystXFxzKyguKykvZ20pO1xuICAgIGlmICh0b29scykge1xuICAgICAgdG9vbHNMaW5lID0gdG9vbHMubWFwKHQgPT4gdC5yZXBsYWNlKC9eXFxzKy1cXHMrLywgJycpLnRyaW0oKSkuam9pbignLCAnKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWNvbnN0cnVjdCBmcm9udG1hdHRlciBpbiBDb3BpbG90IGZvcm1hdFxuICBsZXQgZm0gPSBgLS0tXFxubmFtZTogJHtza2lsbE5hbWV9XFxuZGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259XFxuYDtcbiAgaWYgKGFyZ3VtZW50SGludCkgZm0gKz0gYGFyZ3VtZW50LWhpbnQ6ICR7eWFtbFF1b3RlKGFyZ3VtZW50SGludCl9XFxuYDtcbiAgaWYgKGFnZW50KSBmbSArPSBgYWdlbnQ6ICR7YWdlbnR9XFxuYDtcbiAgaWYgKHRvb2xzTGluZSkgZm0gKz0gYGFsbG93ZWQtdG9vbHM6ICR7dG9vbHNMaW5lfVxcbmA7XG4gIGZtICs9ICctLS0nO1xuXG4gIHJldHVybiBgJHtmbX1cXG4ke2JvZHl9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgQ2xhdWRlIGFnZW50ICgubWQpIHRvIGEgQ29waWxvdCBhZ2VudCAoLmFnZW50Lm1kKS5cbiAqIEFwcGxpZXMgdG9vbCBtYXBwaW5nICsgZGVkdXBsaWNhdGlvbiwgZm9ybWF0cyB0b29scyBhcyBKU09OIGFycmF5LlxuICogQ09OVi0wNDogSlNPTiBhcnJheSBmb3JtYXQuIENPTlYtMDU6IFRvb2wgbmFtZSBtYXBwaW5nLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvcGlsb3RBZ2VudChjb250ZW50LCBpc0dsb2JhbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsKTtcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb252ZXJ0ZWQpO1xuICBpZiAoIWZyb250bWF0dGVyKSByZXR1cm4gY29udmVydGVkO1xuXG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ25hbWUnKSB8fCAndW5rbm93bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuICBjb25zdCBjb2xvciA9IGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCAnY29sb3InKTtcbiAgY29uc3QgdG9vbHNSYXcgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ3Rvb2xzJykgfHwgJyc7XG5cbiAgLy8gQ09OVi0wNCArIENPTlYtMDU6IE1hcCB0b29scywgZGVkdXBsaWNhdGUsIGZvcm1hdCBhcyBKU09OIGFycmF5XG4gIGNvbnN0IGNsYXVkZVRvb2xzID0gdG9vbHNSYXcuc3BsaXQoJywnKS5tYXAodCA9PiB0LnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBtYXBwZWRUb29scyA9IGNsYXVkZVRvb2xzLm1hcCh0ID0+IGNvbnZlcnRDb3BpbG90VG9vbE5hbWUodCkpO1xuICBjb25zdCB1bmlxdWVUb29scyA9IFsuLi5uZXcgU2V0KG1hcHBlZFRvb2xzKV07XG4gIGNvbnN0IHRvb2xzQXJyYXkgPSB1bmlxdWVUb29scy5sZW5ndGggPiAwXG4gICAgPyBcIlsnXCIgKyB1bmlxdWVUb29scy5qb2luKFwiJywgJ1wiKSArIFwiJ11cIlxuICAgIDogJ1tdJztcblxuICAvLyBSZWNvbnN0cnVjdCBmcm9udG1hdHRlciBpbiBDb3BpbG90IGZvcm1hdFxuICBsZXQgZm0gPSBgLS0tXFxubmFtZTogJHtuYW1lfVxcbmRlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufVxcbnRvb2xzOiAke3Rvb2xzQXJyYXl9XFxuYDtcbiAgaWYgKGNvbG9yKSBmbSArPSBgY29sb3I6ICR7Y29sb3J9XFxuYDtcbiAgZm0gKz0gJy0tLSc7XG5cbiAgcmV0dXJuIGAke2ZtfVxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiB0b1NpbmdsZUxpbmUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIHlhbWxRdW90ZSh2YWx1ZSkge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RnJvbnRtYXR0ZXJBbmRCb2R5KGNvbnRlbnQpIHtcbiAgaWYgKCFjb250ZW50LnN0YXJ0c1dpdGgoJy0tLScpKSB7XG4gICAgcmV0dXJuIHsgZnJvbnRtYXR0ZXI6IG51bGwsIGJvZHk6IGNvbnRlbnQgfTtcbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGNsb3NpbmcgLS0tIChjYW4gYmUgb24gc2FtZSBsaW5lIG9yIG5leHQgbGluZSlcbiAgLy8gSGFuZGxlIGJvdGggXCItLS1cXG4uLi5cXG4tLS1cIiBhbmQgXCItLS0uLi5cXG4tLS1cIiBmb3JtYXRzXG4gIGxldCBlbmRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZignXFxuLS0tJywgMyk7XG4gIGlmIChlbmRJbmRleCA9PT0gLTEpIHtcbiAgICAvLyBUcnkgZmluZGluZyAtLS0gd2l0aG91dCBuZXdsaW5lIChtYWxmb3JtZWQgZnJvbnRtYXR0ZXIpXG4gICAgZW5kSW5kZXggPSBjb250ZW50LmluZGV4T2YoJy0tLScsIDMpO1xuICB9XG4gIFxuICBpZiAoZW5kSW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIHsgZnJvbnRtYXR0ZXI6IG51bGwsIGJvZHk6IGNvbnRlbnQgfTtcbiAgfVxuXG4gIC8vIEV4dHJhY3QgZnJvbnRtYXR0ZXIgKHNraXAgaW5pdGlhbCAtLS0pIGFuZCBib2R5IChhZnRlciBjbG9zaW5nIC0tLSlcbiAgY29uc3QgZnJvbnRtYXR0ZXJFbmQgPSBjb250ZW50LmluZGV4T2YoJ1xcbicsIDMpO1xuICBjb25zdCBhY3R1YWxFbmQgPSBjb250ZW50LnN0YXJ0c1dpdGgoJy0tLVxcbicpID8gZW5kSW5kZXggOiBlbmRJbmRleCArIDM7XG4gIFxuICByZXR1cm4ge1xuICAgIGZyb250bWF0dGVyOiBjb250ZW50LnN1YnN0cmluZygzLCBlbmRJbmRleCkudHJpbSgpLFxuICAgIGJvZHk6IGNvbnRlbnQuc3Vic3RyaW5nKGFjdHVhbEVuZCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCBmaWVsZE5hbWUpIHtcbiAgLy8gVHJ5IHN0YW5kYXJkIG11bHRpbGluZSBmb3JtYXQgZmlyc3QgKGZpZWxkOiB2YWx1ZSBmb2xsb3dlZCBieSBuZXdsaW5lKVxuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF4ke2ZpZWxkTmFtZX06XFxcXHMqKC4rKSRgLCAnbScpO1xuICBsZXQgbWF0Y2ggPSBmcm9udG1hdHRlci5tYXRjaChyZWdleCk7XG4gIGlmIChtYXRjaCkge1xuICAgIHJldHVybiBtYXRjaFsxXS50cmltKCkucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJyk7XG4gIH1cbiAgXG4gIC8vIEhhbmRsZSBzaW5nbGUtbGluZSBtYWxmb3JtZWQgZnJvbnRtYXR0ZXIgKGZpZWxkOiB2YWx1ZSBmb2xsb3dlZCBieSBuZXh0IGZpZWxkIG9yIGVuZClcbiAgLy8gUGF0dGVybjogXCJmaWVsZE5hbWU6IHZhbHVlXCIgd2hlcmUgdmFsdWUgZW5kcyBhdCBuZXh0IGZpZWxkIG9yIGVuZCBvZiBzdHJpbmdcbiAgY29uc3Qgc2luZ2xlTGluZVJlZ2V4ID0gbmV3IFJlZ0V4cChgJHtmaWVsZE5hbWV9OlxcXFxzKihbXjpdKz8pKD86XFxcXHMrW2EtekEtWl9dKzp8JClgLCAnaScpO1xuICBtYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKHNpbmdsZUxpbmVSZWdleCk7XG4gIGlmIChtYXRjaCkge1xuICAgIHJldHVybiBtYXRjaFsxXS50cmltKCkucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJyk7XG4gIH1cbiAgXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0U2xhc2hDb21tYW5kc1RvQ29kZXhTa2lsbE1lbnRpb25zKGNvbnRlbnQpIHtcbiAgbGV0IGNvbnZlcnRlZCA9IGNvbnRlbnQucmVwbGFjZSgvXFwvZXo6KFthLXowLTktXSspL2dpLCAoXywgY29tbWFuZE5hbWUpID0+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+XFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnN0IGdsb2JhbENsYXVkZUhvbWVSZWdleCA9IC9cXCRIT01FXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZUhvbWVSZWdleCwgdG9Ib21lUHJlZml4KHBhdGhQcmVmaXgpKTtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShsb2NhbENsYXVkZVJlZ2V4LCBgLi8ke2Rpck5hbWV9L2ApO1xuICAgICAgfVxuICAgICAgY29udGVudCA9IHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50LCBnZXRDb21taXRBdHRyaWJ1dGlvbihydW50aW1lKSk7XG5cbiAgICAgIC8vIENvbnZlcnQgZnJvbnRtYXR0ZXIgZm9yIG9wZW5jb2RlIGNvbXBhdGliaWxpdHlcbiAgICAgIGlmIChpc09wZW5jb2RlKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9PcGVuY29kZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcbiAgICAgIH0gZWxzZSBpZiAocnVudGltZSA9PT0gJ2dlbWluaScpIHtcbiAgICAgICAgaWYgKGlzQ29tbWFuZCkge1xuICAgICAgICAgIC8vIENvbnZlcnQgdG8gVE9NTCBmb3IgR2VtaW5pIChzdHJpcCA8c3ViPiB0YWdzIFx1MjAxNCB0ZXJtaW5hbHMgY2FuJ3QgcmVuZGVyIHN1YnNjcmlwdClcbiAgICAgICAgICBjb250ZW50ID0gc3RyaXBTdWJUYWdzKGNvbnRlbnQpO1xuICAgICAgICAgIGNvbnN0IHRvbWxDb250ZW50ID0gY29udmVydENsYXVkZVRvR2VtaW5pVG9tbChjb250ZW50KTtcbiAgICAgICAgICAvLyBSZXBsYWNlIGV4dGVuc2lvbiB3aXRoIC50b21sXG4gICAgICAgICAgY29uc3QgdG9tbFBhdGggPSBkZXN0UGF0aC5yZXBsYWNlKC9cXC5tZCQvLCAnLnRvbWwnKTtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRvbWxQYXRoLCB0b21sQ29udGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb2RleCkge1xuICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29kZXhNYXJrZG93bihjb250ZW50KTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICB9IGVsc2UgaWYgKGlzQ29waWxvdCkge1xuICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQoY29udGVudCwgaXNHbG9iYWwpO1xuICAgICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQ29waWxvdCAmJiAoZW50cnkubmFtZS5lbmRzV2l0aCgnLmNqcycpIHx8IGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5qcycpKSkge1xuICAgICAgLy8gQ29waWxvdDogYWxzbyB0cmFuc2Zvcm0gLmNqcy8uanMgZmlsZXMgZm9yIENPTlYtMDYgYW5kIENPTlYtMDdcbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQoY29udGVudCwgaXNHbG9iYWwpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmNQYXRoLCBkZXN0UGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29weSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkgKHNpbXBsZSBjb3B5IHdpdGhvdXQgcGF0aCByZXBsYWNlbWVudClcbiAqL1xuZnVuY3Rpb24gY29weURpcmVjdG9yeVJlY3Vyc2l2ZShzcmNEaXI6IHN0cmluZywgZGVzdERpcjogc3RyaW5nKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhzcmNEaXIpKSByZXR1cm47XG4gIFxuICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoc3JjRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIFxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKHNyY0RpciwgZW50cnkubmFtZSk7XG4gICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdERpciwgZW50cnkubmFtZSk7XG4gICAgXG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGZzLm1rZGlyU3luYyhkZXN0UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBjb3B5RGlyZWN0b3J5UmVjdXJzaXZlKHNyY1BhdGgsIGRlc3RQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnMuY29weUZpbGVTeW5jKHNyY1BhdGgsIGRlc3RQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDbGVhbiB1cCBvcnBoYW5lZCBmaWxlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBPcnBoYW5lZEZpbGVzKGNvbmZpZ0Rpcikge1xuICBjb25zdCBvcnBoYW5lZEZpbGVzID0gW1xuICAgICdob29rcy9lei1ub3RpZnkuc2gnLCAgLy8gUmVtb3ZlZCBpbiB2MS42LnhcbiAgICAnaG9va3Mvc3RhdHVzbGluZS5qcycsICAvLyBSZW5hbWVkIHRvIGV6LXN0YXR1c2xpbmUuanMgaW4gdjEuOS4wXG4gIF07XG5cbiAgZm9yIChjb25zdCByZWxQYXRoIG9mIG9ycGhhbmVkRmlsZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIHJlbFBhdGgpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgICAgZnMudW5saW5rU3luYyhmdWxsUGF0aCk7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgb3JwaGFuZWQgJHtyZWxQYXRofWApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENsZWFuIHVwIG9ycGhhbmVkIGhvb2sgcmVnaXN0cmF0aW9ucyBmcm9tIHNldHRpbmdzLmpzb25cbiAqL1xuZnVuY3Rpb24gY2xlYW51cE9ycGhhbmVkSG9va3Moc2V0dGluZ3MpIHtcbiAgY29uc3Qgb3JwaGFuZWRIb29rUGF0dGVybnMgPSBbXG4gICAgJ2V6LW5vdGlmeS5zaCcsICAvLyBSZW1vdmVkIGluIHYxLjYueFxuICAgICdob29rcy9zdGF0dXNsaW5lLmpzJywgIC8vIFJlbmFtZWQgdG8gZXotc3RhdHVzbGluZS5qcyBpbiB2MS45LjBcbiAgICAnZXotaW50ZWwtaW5kZXguanMnLCAgLy8gUmVtb3ZlZCBpbiB2MS45LjJcbiAgICAnZXotaW50ZWwtc2Vzc2lvbi5qcycsICAvLyBSZW1vdmVkIGluIHYxLjkuMlxuICAgICdlei1pbnRlbC1wcnVuZS5qcycsICAvLyBSZW1vdmVkIGluIHYxLjkuMlxuICBdO1xuXG4gIGxldCBjbGVhbmVkSG9va3MgPSBmYWxzZTtcblxuICAvLyBDaGVjayBhbGwgaG9vayBldmVudCB0eXBlcyAoU3RvcCwgU2Vzc2lvblN0YXJ0LCBldGMuKVxuICBpZiAoc2V0dGluZ3MuaG9va3MpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50VHlwZSBvZiBPYmplY3Qua2V5cyhzZXR0aW5ncy5ob29rcykpIHtcbiAgICAgIGNvbnN0IGhvb2tFbnRyaWVzID0gc2V0dGluZ3MuaG9va3NbZXZlbnRUeXBlXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGhvb2tFbnRyaWVzKSkge1xuICAgICAgICAvLyBGaWx0ZXIgb3V0IGVudHJpZXMgdGhhdCBjb250YWluIG9ycGhhbmVkIGhvb2tzXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gaG9va0VudHJpZXMuZmlsdGVyKGVudHJ5ID0+IHtcbiAgICAgICAgICBpZiAoZW50cnkuaG9va3MgJiYgQXJyYXkuaXNBcnJheShlbnRyeS5ob29rcykpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGFueSBob29rIGluIHRoaXMgZW50cnkgbWF0Y2hlcyBvcnBoYW5lZCBwYXR0ZXJuc1xuICAgICAgICAgICAgY29uc3QgaGFzT3JwaGFuZWQgPSBlbnRyeS5ob29rcy5zb21lKGggPT5cbiAgICAgICAgICAgICAgaC5jb21tYW5kICYmIG9ycGhhbmVkSG9va1BhdHRlcm5zLnNvbWUocGF0dGVybiA9PiBoLmNvbW1hbmQuaW5jbHVkZXMocGF0dGVybikpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGhhc09ycGhhbmVkKSB7XG4gICAgICAgICAgICAgIGNsZWFuZWRIb29rcyA9IHRydWU7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIFJlbW92ZSB0aGlzIGVudHJ5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlOyAgLy8gS2VlcCB0aGlzIGVudHJ5XG4gICAgICAgIH0pO1xuICAgICAgICBzZXR0aW5ncy5ob29rc1tldmVudFR5cGVdID0gZmlsdGVyZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNsZWFuZWRIb29rcykge1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBvcnBoYW5lZCBob29rIHJlZ2lzdHJhdGlvbnNgKTtcbiAgfVxuXG4gIC8vIEZpeCAjMzMwOiBVcGRhdGUgc3RhdHVzTGluZSBpZiBpdCBwb2ludHMgdG8gb2xkIHN0YXR1c2xpbmUuanMgcGF0aFxuICAvLyBPbmx5IG1hdGNoIHRoZSBzcGVjaWZpYyBvbGQgcGF0aCBwYXR0ZXJuIChob29rcy9zdGF0dXNsaW5lLmpzKSxcbiAgLy8gbm90IHRoaXJkLXBhcnR5IHN0YXR1c2xpbmUgc2NyaXB0cyB0aGF0IGhhcHBlbiB0byBjb250YWluICdzdGF0dXNsaW5lLmpzJ1xuICBpZiAoc2V0dGluZ3Muc3RhdHVzTGluZSAmJiBzZXR0aW5ncy5zdGF0dXNMaW5lLmNvbW1hbmQgJiZcbiAgICAgIC9ob29rc1tcXC9cXFxcXXN0YXR1c2xpbmVcXC5qcy8udGVzdChzZXR0aW5ncy5zdGF0dXNMaW5lLmNvbW1hbmQpKSB7XG4gICAgc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kID0gc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kLnJlcGxhY2UoXG4gICAgICAvaG9va3MoW1xcL1xcXFxdKXN0YXR1c2xpbmVcXC5qcy8sXG4gICAgICAnaG9va3MkMWV6LXN0YXR1c2xpbmUuanMnXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFVwZGF0ZWQgc3RhdHVzbGluZSBwYXRoIChob29rcy9zdGF0dXNsaW5lLmpzIFx1MjE5MiBob29rcy9lei1zdGF0dXNsaW5lLmpzKWApO1xuICB9XG5cbiAgcmV0dXJuIHNldHRpbmdzO1xufVxuXG4vKipcbiAqIFVuaW5zdGFsbCBFWl9BZ2VudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBmb3IgYSBzcGVjaWZpYyBydW50aW1lXG4gKiBSZW1vdmVzIG9ubHkgRVotc3BlY2lmaWMgZmlsZXMvZGlyZWN0b3JpZXMsIHByZXNlcnZlcyB1c2VyIGNvbnRlbnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNHbG9iYWwgLSBXaGV0aGVyIHRvIHVuaW5zdGFsbCBmcm9tIGdsb2JhbCBvciBsb2NhbFxuICogQHBhcmFtIHtzdHJpbmd9IHJ1bnRpbWUgLSBUYXJnZXQgcnVudGltZSAoJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCAnY29waWxvdCcpXG4gKi9cbmZ1bmN0aW9uIHVuaW5zdGFsbChpc0dsb2JhbCwgcnVudGltZSA9ICdjbGF1ZGUnKSB7XG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xuICBjb25zdCBpc0NvZGV4ID0gcnVudGltZSA9PT0gJ2NvZGV4JztcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xuICBjb25zdCBpc1F3ZW4gPSBydW50aW1lID09PSAncXdlbic7XG4gIGNvbnN0IGlzS2ltaSA9IHJ1bnRpbWUgPT09ICdraW1pJztcbiAgY29uc3QgZGlyTmFtZSA9IGdldERpck5hbWUocnVudGltZSk7XG5cbiAgLy8gR2V0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGJhc2VkIG9uIHJ1bnRpbWUgYW5kIGluc3RhbGwgdHlwZVxuICBjb25zdCB0YXJnZXREaXIgPSBpc0dsb2JhbFxuICAgID8gZ2V0R2xvYmFsRGlyKHJ1bnRpbWUsIGV4cGxpY2l0Q29uZmlnRGlyKVxuICAgIDogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGRpck5hbWUpO1xuXG4gIGNvbnN0IGxvY2F0aW9uTGFiZWwgPSBpc0dsb2JhbFxuICAgID8gdGFyZ2V0RGlyLnJlcGxhY2Uob3MuaG9tZWRpcigpLCAnficpXG4gICAgOiB0YXJnZXREaXIucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnLicpO1xuXG4gIGxldCBydW50aW1lTGFiZWwgPSAnQ2xhdWRlIENvZGUnO1xuICBpZiAocnVudGltZSA9PT0gJ29wZW5jb2RlJykgcnVudGltZUxhYmVsID0gJ09wZW5Db2RlJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdnZW1pbmknKSBydW50aW1lTGFiZWwgPSAnR2VtaW5pJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb2RleCcpIHJ1bnRpbWVMYWJlbCA9ICdDb2RleCc7XG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHJ1bnRpbWVMYWJlbCA9ICdDb3BpbG90JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcnVudGltZUxhYmVsID0gJ1F3ZW4gQ29kZSc7XG5cbiAgY29uc29sZS5sb2coYCAgVW5pbnN0YWxsaW5nIEVaX0FnZW50cyBmcm9tICR7Y3lhbn0ke3J1bnRpbWVMYWJlbH0ke3Jlc2V0fSBhdCAke2N5YW59JHtsb2NhdGlvbkxhYmVsfSR7cmVzZXR9XFxuYCk7XG5cbiAgLy8gQ2hlY2sgaWYgdGFyZ2V0IGRpcmVjdG9yeSBleGlzdHNcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldERpcikpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Q6ICR7bG9jYXRpb25MYWJlbH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBOb3RoaW5nIHRvIHVuaW5zdGFsbC5cXG5gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgcmVtb3ZlZENvdW50ID0gMDtcblxuICAvLyAxLiBSZW1vdmUgRVogY29tbWFuZHMvc2tpbGxzXG4gIGlmIChpc09wZW5jb2RlKSB7XG4gICAgLy8gT3BlbkNvZGU6IHJlbW92ZSBjb21tYW5kL2V6LSoubWQgZmlsZXNcbiAgICBjb25zdCBjb21tYW5kRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvbW1hbmQnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjb21tYW5kRGlyKSkge1xuICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhjb21tYW5kRGlyKTtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCdlei0nKSAmJiBmaWxlLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKGNvbW1hbmREaXIsIGZpbGUpKTtcbiAgICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIEVaX0FnZW50cyBjb21tYW5kcyBmcm9tIGNvbW1hbmQvYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzQ29kZXggfHwgaXNRd2VuIHx8IGlzS2ltaSkge1xuICAgIC8vIENvZGV4L1F3ZW4vS2ltaTogcmVtb3ZlIHNraWxscy9lei0qL1NLSUxMLm1kIHNraWxsIGRpcmVjdG9yaWVzXG4gICAgY29uc3Qgc2tpbGxzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NraWxscycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHNraWxsc0RpcikpIHtcbiAgICAgIGxldCBza2lsbENvdW50ID0gMDtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSAmJiBlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJ2V6LScpKSB7XG4gICAgICAgICAgZnMucm1TeW5jKHBhdGguam9pbihza2lsbHNEaXIsIGVudHJ5Lm5hbWUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBza2lsbENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChza2lsbENvdW50ID4gMCkge1xuICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgbGV0IHJ1bnRpbWVMYWJlbCA9ICdDb2RleCc7XG4gICAgICAgIGlmIChpc1F3ZW4pIHJ1bnRpbWVMYWJlbCA9ICdRd2VuIENvZGUnO1xuICAgICAgICBpZiAoaXNLaW1pKSBydW50aW1lTGFiZWwgPSAnS2ltaSBDb2RlJztcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkICR7c2tpbGxDb3VudH0gJHtydW50aW1lTGFiZWx9IHNraWxsc2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0NvZGV4KSB7XG4gICAgICAvLyBDb2RleDogcmVtb3ZlIEVaIGFnZW50IC50b21sIGNvbmZpZyBmaWxlc1xuICAgICAgY29uc3QgY29kZXhBZ2VudHNEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnYWdlbnRzJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhjb2RleEFnZW50c0RpcikpIHtcbiAgICAgICAgY29uc3QgdG9tbEZpbGVzID0gZnMucmVhZGRpclN5bmMoY29kZXhBZ2VudHNEaXIpO1xuICAgICAgICBsZXQgdG9tbENvdW50ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIHRvbWxGaWxlcykge1xuICAgICAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ2V6LScpICYmIGZpbGUuZW5kc1dpdGgoJy50b21sJykpIHtcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKGNvZGV4QWdlbnRzRGlyLCBmaWxlKSk7XG4gICAgICAgICAgICB0b21sQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvbWxDb3VudCA+IDApIHtcbiAgICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgJHt0b21sQ291bnR9IGFnZW50IC50b21sIGNvbmZpZ3NgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDb2RleDogY2xlYW4gRVogc2VjdGlvbnMgZnJvbSBjb25maWcudG9tbFxuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb25maWcudG9tbCcpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpO1xuICAgICAgICBjb25zdCBjbGVhbmVkID0gc3RyaXBFekFnZW50c0Zyb21Db2RleENvbmZpZyhjb250ZW50KTtcbiAgICAgICAgaWYgKGNsZWFuZWQgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBGaWxlIGlzIGVtcHR5IGFmdGVyIHN0cmlwcGluZyBcdTIwMTQgZGVsZXRlIGl0XG4gICAgICAgICAgZnMudW5saW5rU3luYyhjb25maWdQYXRoKTtcbiAgICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgY29uZmlnLnRvbWwgKHdhcyBFWi1vbmx5KWApO1xuICAgICAgICB9IGVsc2UgaWYgKGNsZWFuZWQgIT09IGNvbnRlbnQpIHtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGNsZWFuZWQpO1xuICAgICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gQ2xlYW5lZCBFWl9BZ2VudHMgc2VjdGlvbnMgZnJvbSBjb25maWcudG9tbGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzQ29waWxvdCkge1xuICAgIC8vIENvcGlsb3Q6IHJlbW92ZSBza2lsbHMvZXotKi8gZGlyZWN0b3JpZXMgKHNhbWUgbGF5b3V0IGFzIENvZGV4IHNraWxscylcbiAgICBjb25zdCBza2lsbHNEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnc2tpbGxzJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoc2tpbGxzRGlyKSkge1xuICAgICAgbGV0IHNraWxsQ291bnQgPSAwO1xuICAgICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHNraWxsc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnZXotJykpIHtcbiAgICAgICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHNraWxsc0RpciwgZW50cnkubmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIHNraWxsQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNraWxsQ291bnQgPiAwKSB7XG4gICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgJHtza2lsbENvdW50fSBDb3BpbG90IHNraWxsc2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvcGlsb3Q6IGNsZWFuIEVaIHNlY3Rpb24gZnJvbSBjb3BpbG90LWluc3RydWN0aW9ucy5tZFxuICAgIGNvbnN0IGluc3RydWN0aW9uc1BhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnY29waWxvdC1pbnN0cnVjdGlvbnMubWQnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhpbnN0cnVjdGlvbnNQYXRoKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhpbnN0cnVjdGlvbnNQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgY2xlYW5lZCA9IHN0cmlwRXpBZ2VudHNGcm9tQ29waWxvdEluc3RydWN0aW9ucyhjb250ZW50KTtcbiAgICAgIGlmIChjbGVhbmVkID09PSBudWxsKSB7XG4gICAgICAgIGZzLnVubGlua1N5bmMoaW5zdHJ1Y3Rpb25zUGF0aCk7XG4gICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgY29waWxvdC1pbnN0cnVjdGlvbnMubWQgKHdhcyBFWi1vbmx5KWApO1xuICAgICAgfSBlbHNlIGlmIChjbGVhbmVkICE9PSBjb250ZW50KSB7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoaW5zdHJ1Y3Rpb25zUGF0aCwgY2xlYW5lZCk7XG4gICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENsZWFuZWQgRVpfQWdlbnRzIHNlY3Rpb24gZnJvbSBjb3BpbG90LWluc3RydWN0aW9ucy5tZGApO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBlekNvbW1hbmRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvbW1hbmRzJywgJ2V6Jyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZXpDb21tYW5kc0RpcikpIHtcbiAgICAgIGZzLnJtU3luYyhlekNvbW1hbmRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIGNvbW1hbmRzL2V6L2ApO1xuICAgIH1cbiAgfVxuXG4gIC8vIDIuIFJlbW92ZSBlei1hZ2VudHMgZGlyZWN0b3J5XG4gIGNvbnN0IGV6RGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2V6LWFnZW50cycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhlekRpcikpIHtcbiAgICBmcy5ybVN5bmMoZXpEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJlbW92ZWRDb3VudCsrO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBlei1hZ2VudHMvYCk7XG4gIH1cblxuICAvLyAzLiBSZW1vdmUgRVpfQWdlbnRzIGFnZW50cyAoZXotKi5tZCBmaWxlcyBvbmx5KVxuICBjb25zdCBhZ2VudHNEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnYWdlbnRzJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGFnZW50c0RpcikpIHtcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGFnZW50c0Rpcik7XG4gICAgbGV0IGFnZW50Q291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgZnMudW5saW5rU3luYyhwYXRoLmpvaW4oYWdlbnRzRGlyLCBmaWxlKSk7XG4gICAgICAgIGFnZW50Q291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFnZW50Q291bnQgPiAwKSB7XG4gICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCAke2FnZW50Q291bnR9IEVaX0FnZW50cyBhZ2VudHNgKTtcbiAgICB9XG4gIH1cblxuICAvLyA0LiBSZW1vdmUgRVogaG9va3NcbiAgY29uc3QgaG9va3NEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnaG9va3MnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoaG9va3NEaXIpKSB7XG4gICAgY29uc3QgZXpIb29rcyA9IFsnZXotc3RhdHVzbGluZS5qcycsICdlei1jaGVjay11cGRhdGUuanMnLCAnZXotY2hlY2stdXBkYXRlLnNoJywgJ2V6LWNvbnRleHQtbW9uaXRvci5qcyddO1xuICAgIGxldCBob29rQ291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgaG9vayBvZiBlekhvb2tzKSB7XG4gICAgICBjb25zdCBob29rUGF0aCA9IHBhdGguam9pbihob29rc0RpciwgaG9vayk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhob29rUGF0aCkpIHtcbiAgICAgICAgZnMudW5saW5rU3luYyhob29rUGF0aCk7XG4gICAgICAgIGhvb2tDb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaG9va0NvdW50ID4gMCkge1xuICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgJHtob29rQ291bnR9IEVaIGhvb2tzYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gNS4gUmVtb3ZlIEVaIHBhY2thZ2UuanNvbiAoQ29tbW9uSlMgbW9kZSBtYXJrZXIpXG4gIGNvbnN0IHBrZ0pzb25QYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhwa2dKc29uUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwa2dKc29uUGF0aCwgJ3V0ZjgnKS50cmltKCk7XG4gICAgICAvLyBPbmx5IHJlbW92ZSBpZiBpdCdzIG91ciBtaW5pbWFsIENvbW1vbkpTIG1hcmtlclxuICAgICAgaWYgKGNvbnRlbnQgPT09ICd7XCJ0eXBlXCI6XCJjb21tb25qc1wifScpIHtcbiAgICAgICAgZnMudW5saW5rU3luYyhwa2dKc29uUGF0aCk7XG4gICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgRVogcGFja2FnZS5qc29uYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIHJlYWQgZXJyb3JzXG4gICAgfVxuICB9XG5cbiAgLy8gNi4gQ2xlYW4gdXAgc2V0dGluZ3MuanNvbiAocmVtb3ZlIEVaIGhvb2tzIGFuZCBzdGF0dXNsaW5lKVxuICBjb25zdCBzZXR0aW5nc1BhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnc2V0dGluZ3MuanNvbicpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSB7XG4gICAgbGV0IHNldHRpbmdzID0gcmVhZFNldHRpbmdzKHNldHRpbmdzUGF0aCk7XG4gICAgbGV0IHNldHRpbmdzTW9kaWZpZWQgPSBmYWxzZTtcblxuICAgIC8vIFJlbW92ZSBFWiBzdGF0dXNsaW5lIGlmIGl0IHJlZmVyZW5jZXMgb3VyIGhvb2tcbiAgICBpZiAoc2V0dGluZ3Muc3RhdHVzTGluZSAmJiBzZXR0aW5ncy5zdGF0dXNMaW5lLmNvbW1hbmQgJiZcbiAgICAgICAgc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kLmluY2x1ZGVzKCdlei1zdGF0dXNsaW5lJykpIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5zdGF0dXNMaW5lO1xuICAgICAgc2V0dGluZ3NNb2RpZmllZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgRVogc3RhdHVzbGluZSBmcm9tIHNldHRpbmdzYCk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIEVaIGhvb2tzIGZyb20gU2Vzc2lvblN0YXJ0XG4gICAgaWYgKHNldHRpbmdzLmhvb2tzICYmIHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydCkge1xuICAgICAgY29uc3QgYmVmb3JlID0gc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0Lmxlbmd0aDtcbiAgICAgIHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydCA9IHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5maWx0ZXIoZW50cnkgPT4ge1xuICAgICAgICBpZiAoZW50cnkuaG9va3MgJiYgQXJyYXkuaXNBcnJheShlbnRyeS5ob29rcykpIHtcbiAgICAgICAgICAvLyBGaWx0ZXIgb3V0IEVaIGhvb2tzXG4gICAgICAgICAgY29uc3QgaGFzRXpIb29rID0gZW50cnkuaG9va3Muc29tZShoID0+XG4gICAgICAgICAgICBoLmNvbW1hbmQgJiYgKGguY29tbWFuZC5pbmNsdWRlcygnZXotY2hlY2stdXBkYXRlJykgfHwgaC5jb21tYW5kLmluY2x1ZGVzKCdlei1zdGF0dXNsaW5lJykpXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gIWhhc0V6SG9vaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5sZW5ndGggPCBiZWZvcmUpIHtcbiAgICAgICAgc2V0dGluZ3NNb2RpZmllZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBFWiBob29rcyBmcm9tIHNldHRpbmdzYCk7XG4gICAgICB9XG4gICAgICAvLyBDbGVhbiB1cCBlbXB0eSBhcnJheVxuICAgICAgaWYgKHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgRVogaG9va3MgZnJvbSBQb3N0VG9vbFVzZSBhbmQgQWZ0ZXJUb29sIChHZW1pbmkgdXNlcyBBZnRlclRvb2wpXG4gICAgZm9yIChjb25zdCBldmVudE5hbWUgb2YgWydQb3N0VG9vbFVzZScsICdBZnRlclRvb2wnXSkge1xuICAgICAgaWYgKHNldHRpbmdzLmhvb2tzICYmIHNldHRpbmdzLmhvb2tzW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXS5sZW5ndGg7XG4gICAgICAgIHNldHRpbmdzLmhvb2tzW2V2ZW50TmFtZV0gPSBzZXR0aW5ncy5ob29rc1tldmVudE5hbWVdLmZpbHRlcihlbnRyeSA9PiB7XG4gICAgICAgICAgaWYgKGVudHJ5Lmhvb2tzICYmIEFycmF5LmlzQXJyYXkoZW50cnkuaG9va3MpKSB7XG4gICAgICAgICAgICBjb25zdCBoYXNFekhvb2sgPSBlbnRyeS5ob29rcy5zb21lKGggPT5cbiAgICAgICAgICAgICAgaC5jb21tYW5kICYmIGguY29tbWFuZC5pbmNsdWRlcygnZXotY29udGV4dC1tb25pdG9yJylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gIWhhc0V6SG9vaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXS5sZW5ndGggPCBiZWZvcmUpIHtcbiAgICAgICAgICBzZXR0aW5nc01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgY29udGV4dCBtb25pdG9yIGhvb2sgZnJvbSBzZXR0aW5nc2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR0aW5ncy5ob29rc1tldmVudE5hbWVdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGRlbGV0ZSBzZXR0aW5ncy5ob29rc1tldmVudE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgZW1wdHkgaG9va3Mgb2JqZWN0XG4gICAgaWYgKHNldHRpbmdzLmhvb2tzICYmIE9iamVjdC5rZXlzKHNldHRpbmdzLmhvb2tzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5ob29rcztcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3NNb2RpZmllZCkge1xuICAgICAgd3JpdGVTZXR0aW5ncyhzZXR0aW5nc1BhdGgsIHNldHRpbmdzKTtcbiAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgIH1cbiAgfVxuXG4gIC8vIDYuIEZvciBPcGVuQ29kZSwgY2xlYW4gdXAgcGVybWlzc2lvbnMgZnJvbSBvcGVuY29kZS5qc29uXG4gIGlmIChpc09wZW5jb2RlKSB7XG4gICAgLy8gRm9yIGxvY2FsIHVuaW5zdGFsbHMsIGNsZWFuIHVwIC4vLm9wZW5jb2RlL29wZW5jb2RlLmpzb25cbiAgICAvLyBGb3IgZ2xvYmFsIHVuaW5zdGFsbHMsIGNsZWFuIHVwIH4vLmNvbmZpZy9vcGVuY29kZS9vcGVuY29kZS5qc29uXG4gICAgY29uc3Qgb3BlbmNvZGVDb25maWdEaXIgPSBpc0dsb2JhbFxuICAgICAgPyBnZXRPcGVuY29kZUdsb2JhbERpcigpXG4gICAgICA6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLm9wZW5jb2RlJyk7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihvcGVuY29kZUNvbmZpZ0RpciwgJ29wZW5jb2RlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIGxldCBtb2RpZmllZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFJlbW92ZSBFWiBwZXJtaXNzaW9uIGVudHJpZXNcbiAgICAgICAgaWYgKGNvbmZpZy5wZXJtaXNzaW9uKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwZXJtVHlwZSBvZiBbJ3JlYWQnLCAnZXh0ZXJuYWxfZGlyZWN0b3J5J10pIHtcbiAgICAgICAgICAgIGlmIChjb25maWcucGVybWlzc2lvbltwZXJtVHlwZV0pIHtcbiAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbmZpZy5wZXJtaXNzaW9uW3Blcm1UeXBlXSk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCdlei1hZ2VudHMnKSkge1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5wZXJtaXNzaW9uW3Blcm1UeXBlXVtrZXldO1xuICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBDbGVhbiB1cCBlbXB0eSBvYmplY3RzXG4gICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhjb25maWcucGVybWlzc2lvbltwZXJtVHlwZV0pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGVybWlzc2lvbltwZXJtVHlwZV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbmZpZy5wZXJtaXNzaW9uKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGVybWlzc2lvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kaWZpZWQpIHtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMikgKyAnXFxuJyk7XG4gICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIEVaIHBlcm1pc3Npb25zIGZyb20gb3BlbmNvZGUuanNvbmApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElnbm9yZSBKU09OIHBhcnNlIGVycm9yc1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChyZW1vdmVkQ291bnQgPT09IDApIHtcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBObyBFWl9BZ2VudHMgZmlsZXMgZm91bmQgdG8gcmVtb3ZlLmApO1xuICB9XG5cbiAgY29uc29sZS5sb2coYFxuICAke2dyZWVufURvbmUhJHtyZXNldH0gRVpfQWdlbnRzIGhhcyBiZWVuIHVuaW5zdGFsbGVkIGZyb20gJHtydW50aW1lTGFiZWx9LlxuICBZb3VyIG90aGVyIGZpbGVzIGFuZCBzZXR0aW5ncyBoYXZlIGJlZW4gcHJlc2VydmVkLlxuYCk7XG59XG5cbi8qKlxuICogUGFyc2UgSlNPTkMgKEpTT04gd2l0aCBDb21tZW50cykgYnkgc3RyaXBwaW5nIGNvbW1lbnRzIGFuZCB0cmFpbGluZyBjb21tYXMuXG4gKiBPcGVuQ29kZSBzdXBwb3J0cyBKU09OQyBmb3JtYXQgdmlhIGpzb25jLXBhcnNlciwgc28gdXNlcnMgbWF5IGhhdmUgY29tbWVudHMuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgaW5saW5lIHBhcnNlciB0byBhdm9pZCBhZGRpbmcgZGVwZW5kZW5jaWVzLlxuICovXG5mdW5jdGlvbiBwYXJzZUpzb25jKGNvbnRlbnQpIHtcbiAgLy8gU3RyaXAgQk9NIGlmIHByZXNlbnRcbiAgaWYgKGNvbnRlbnQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XG4gICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XG4gIH1cblxuICAvLyBSZW1vdmUgc2luZ2xlLWxpbmUgYW5kIGJsb2NrIGNvbW1lbnRzIHdoaWxlIHByZXNlcnZpbmcgc3RyaW5nc1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBpblN0cmluZyA9IGZhbHNlO1xuICBsZXQgaSA9IDA7XG4gIHdoaWxlIChpIDwgY29udGVudC5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpXTtcbiAgICBjb25zdCBuZXh0ID0gY29udGVudFtpICsgMV07XG5cbiAgICBpZiAoaW5TdHJpbmcpIHtcbiAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgLy8gSGFuZGxlIGVzY2FwZSBzZXF1ZW5jZXNcbiAgICAgIGlmIChjaGFyID09PSAnXFxcXCcgJiYgaSArIDEgPCBjb250ZW50Lmxlbmd0aCkge1xuICAgICAgICByZXN1bHQgKz0gbmV4dDtcbiAgICAgICAgaSArPSAyO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSAnXCInKSB7XG4gICAgICAgIGluU3RyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGFyID09PSAnXCInKSB7XG4gICAgICAgIGluU3RyaW5nID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJy8nICYmIG5leHQgPT09ICcvJykge1xuICAgICAgICAvLyBTa2lwIHNpbmdsZS1saW5lIGNvbW1lbnQgdW50aWwgZW5kIG9mIGxpbmVcbiAgICAgICAgd2hpbGUgKGkgPCBjb250ZW50Lmxlbmd0aCAmJiBjb250ZW50W2ldICE9PSAnXFxuJykge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnLycgJiYgbmV4dCA9PT0gJyonKSB7XG4gICAgICAgIC8vIFNraXAgYmxvY2sgY29tbWVudFxuICAgICAgICBpICs9IDI7XG4gICAgICAgIHdoaWxlIChpIDwgY29udGVudC5sZW5ndGggLSAxICYmICEoY29udGVudFtpXSA9PT0gJyonICYmIGNvbnRlbnRbaSArIDFdID09PSAnLycpKSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGkgKz0gMjsgLy8gU2tpcCBjbG9zaW5nICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYXMgYmVmb3JlIH0gb3IgXVxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvLChcXHMqW31cXF1dKS9nLCAnJDEnKTtcblxuICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZSBPcGVuQ29kZSBwZXJtaXNzaW9ucyB0byBhbGxvdyByZWFkaW5nIEVaIHJlZmVyZW5jZSBkb2NzXG4gKiBUaGlzIHByZXZlbnRzIHBlcm1pc3Npb24gcHJvbXB0cyB3aGVuIEVaIGFjY2Vzc2VzIHRoZSBlei1hZ2VudHMgZGlyZWN0b3J5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzR2xvYmFsIC0gV2hldGhlciB0aGlzIGlzIGEgZ2xvYmFsIG9yIGxvY2FsIGluc3RhbGxcbiAqL1xuZnVuY3Rpb24gY29uZmlndXJlT3BlbmNvZGVQZXJtaXNzaW9ucyhpc0dsb2JhbCA9IHRydWUpIHtcbiAgLy8gRm9yIGxvY2FsIGluc3RhbGxzLCB1c2UgLi8ub3BlbmNvZGUvb3BlbmNvZGUuanNvblxuICAvLyBGb3IgZ2xvYmFsIGluc3RhbGxzLCB1c2Ugfi8uY29uZmlnL29wZW5jb2RlL29wZW5jb2RlLmpzb25cbiAgY29uc3Qgb3BlbmNvZGVDb25maWdEaXIgPSBpc0dsb2JhbFxuICAgID8gZ2V0T3BlbmNvZGVHbG9iYWxEaXIoKVxuICAgIDogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcub3BlbmNvZGUnKTtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihvcGVuY29kZUNvbmZpZ0RpciwgJ29wZW5jb2RlLmpzb24nKTtcblxuICAvLyBFbnN1cmUgY29uZmlnIGRpcmVjdG9yeSBleGlzdHNcbiAgZnMubWtkaXJTeW5jKG9wZW5jb2RlQ29uZmlnRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBSZWFkIGV4aXN0aW5nIGNvbmZpZyBvciBjcmVhdGUgZW1wdHkgb2JqZWN0XG4gIGxldCBjb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbmZpZyA9IHBhcnNlSnNvbmMoY29udGVudCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gQ2Fubm90IHBhcnNlIC0gRE8gTk9UIG92ZXJ3cml0ZSB1c2VyJ3MgY29uZmlnXG4gICAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBDb3VsZCBub3QgcGFyc2Ugb3BlbmNvZGUuanNvbiAtIHNraXBwaW5nIHBlcm1pc3Npb24gY29uZmlnYCk7XG4gICAgICBjb25zb2xlLmxvZyhgICAgICR7ZGltfVJlYXNvbjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX0ke3Jlc2V0fWApO1xuICAgICAgY29uc29sZS5sb2coYCAgICAke2RpbX1Zb3VyIGNvbmZpZyB3YXMgTk9UIG1vZGlmaWVkLiBGaXggdGhlIHN5bnRheCBtYW51YWxseSBpZiBuZWVkZWQuJHtyZXNldH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBFbnN1cmUgcGVybWlzc2lvbiBzdHJ1Y3R1cmUgZXhpc3RzXG4gIGlmICghY29uZmlnLnBlcm1pc3Npb24pIHtcbiAgICBjb25maWcucGVybWlzc2lvbiA9IHt9O1xuICB9XG5cbiAgLy8gQnVpbGQgdGhlIEVaIHBhdGggdXNpbmcgdGhlIGFjdHVhbCBjb25maWcgZGlyZWN0b3J5XG4gIC8vIFVzZSB+IHNob3J0aGFuZCBpZiBpdCdzIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9uLCBvdGhlcndpc2UgdXNlIGZ1bGwgcGF0aFxuICBjb25zdCBkZWZhdWx0Q29uZmlnRGlyID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jb25maWcnLCAnb3BlbmNvZGUnKTtcbiAgY29uc3QgZXpQYXRoID0gb3BlbmNvZGVDb25maWdEaXIgPT09IGRlZmF1bHRDb25maWdEaXJcbiAgICA/ICd+Ly5jb25maWcvb3BlbmNvZGUvZXotYWdlbnRzLyonXG4gICAgOiBgJHtvcGVuY29kZUNvbmZpZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyl9L2V6LWFnZW50cy8qYDtcblxuICBsZXQgbW9kaWZpZWQgPSBmYWxzZTtcblxuICAvLyBDb25maWd1cmUgcmVhZCBwZXJtaXNzaW9uXG4gIGNvbnN0IHBlcm1pc3Npb24gPSBjb25maWcucGVybWlzc2lvbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8fCB7fTtcbiAgY29uZmlnLnBlcm1pc3Npb24gPSBwZXJtaXNzaW9uO1xuICBpZiAoIXBlcm1pc3Npb24ucmVhZCB8fCB0eXBlb2YgcGVybWlzc2lvbi5yZWFkICE9PSAnb2JqZWN0Jykge1xuICAgIHBlcm1pc3Npb24ucmVhZCA9IHt9O1xuICB9XG4gIGNvbnN0IHJlYWRQZXJtID0gcGVybWlzc2lvbi5yZWFkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAocmVhZFBlcm1bZXpQYXRoXSAhPT0gJ2FsbG93Jykge1xuICAgIHJlYWRQZXJtW2V6UGF0aF0gPSAnYWxsb3cnO1xuICAgIG1vZGlmaWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIENvbmZpZ3VyZSBleHRlcm5hbF9kaXJlY3RvcnkgcGVybWlzc2lvbiAodGhlIHNhZmV0eSBndWFyZCBmb3IgcGF0aHMgb3V0c2lkZSBwcm9qZWN0KVxuICBpZiAoIXBlcm1pc3Npb24uZXh0ZXJuYWxfZGlyZWN0b3J5IHx8IHR5cGVvZiBwZXJtaXNzaW9uLmV4dGVybmFsX2RpcmVjdG9yeSAhPT0gJ29iamVjdCcpIHtcbiAgICBwZXJtaXNzaW9uLmV4dGVybmFsX2RpcmVjdG9yeSA9IHt9O1xuICB9XG4gIGNvbnN0IGV4dERpclBlcm0gPSBwZXJtaXNzaW9uLmV4dGVybmFsX2RpcmVjdG9yeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKGV4dERpclBlcm1bZXpQYXRoXSAhPT0gJ2FsbG93Jykge1xuICAgIGV4dERpclBlcm1bZXpQYXRoXSA9ICdhbGxvdyc7XG4gICAgbW9kaWZpZWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKCFtb2RpZmllZCkge1xuICAgIHJldHVybjsgLy8gQWxyZWFkeSBjb25maWd1cmVkXG4gIH1cblxuICAvLyBXcml0ZSBjb25maWcgYmFja1xuICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMikgKyAnXFxuJyk7XG4gIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gQ29uZmlndXJlZCByZWFkIHBlcm1pc3Npb24gZm9yIEVaX0FnZW50cyBkb2NzYCk7XG59XG5cbi8qKlxuICogVmVyaWZ5IGEgZGlyZWN0b3J5IGV4aXN0cyBhbmQgY29udGFpbnMgZmlsZXNcbiAqL1xuZnVuY3Rpb24gdmVyaWZ5SW5zdGFsbGVkKGRpclBhdGgsIGRlc2NyaXB0aW9uKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYCAgJHt5ZWxsb3d9XHUyNzE3JHtyZXNldH0gRmFpbGVkIHRvIGluc3RhbGwgJHtkZXNjcmlwdGlvbn06IGRpcmVjdG9yeSBub3QgY3JlYXRlZGApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYCAgJHt5ZWxsb3d9XHUyNzE3JHtyZXNldH0gRmFpbGVkIHRvIGluc3RhbGwgJHtkZXNjcmlwdGlvbn06IGRpcmVjdG9yeSBpcyBlbXB0eWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYCAgJHt5ZWxsb3d9XHUyNzE3JHtyZXNldH0gRmFpbGVkIHRvIGluc3RhbGwgJHtkZXNjcmlwdGlvbn06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFZlcmlmeSBhIGZpbGUgZXhpc3RzXG4gKi9cbmZ1bmN0aW9uIHZlcmlmeUZpbGVJbnN0YWxsZWQoZmlsZVBhdGgsIGRlc2NyaXB0aW9uKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fVx1MjcxNyR7cmVzZXR9IEZhaWxlZCB0byBpbnN0YWxsICR7ZGVzY3JpcHRpb259OiBmaWxlIG5vdCBjcmVhdGVkYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEluc3RhbGwgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZm9yIGEgc3BlY2lmaWMgcnVudGltZVxuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdG8gaW5zdGFsbCBnbG9iYWxseSBvciBsb2NhbGx5XG4gKiBAcGFyYW0ge3N0cmluZ30gcnVudGltZSAtIFRhcmdldCBydW50aW1lICgnY2xhdWRlJywgJ29wZW5jb2RlJywgJ2dlbWluaScsICdjb2RleCcpXG4gKi9cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vLyBMb2NhbCBQYXRjaCBQZXJzaXN0ZW5jZVxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IFBBVENIRVNfRElSX05BTUUgPSAnZXotbG9jYWwtcGF0Y2hlcyc7XG5jb25zdCBNQU5JRkVTVF9OQU1FID0gJ2V6LWZpbGUtbWFuaWZlc3QuanNvbic7XG5cbi8qKlxuICogQ29tcHV0ZSBTSEEyNTYgaGFzaCBvZiBmaWxlIGNvbnRlbnRzXG4gKi9cbmZ1bmN0aW9uIGZpbGVIYXNoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKTtcbiAgLy8gQ29udmVydCB0byBVaW50OEFycmF5IHRvIHNhdGlzZnkgQmluYXJ5TGlrZSB0eXBlIHJlcXVpcmVtZW50XG4gIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKG5ldyBVaW50OEFycmF5KGNvbnRlbnQpKS5kaWdlc3QoJ2hleCcpO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGNvbGxlY3QgYWxsIGZpbGVzIGluIGRpciB3aXRoIHRoZWlyIGhhc2hlc1xuICovXG5mdW5jdGlvbiBnZW5lcmF0ZU1hbmlmZXN0KGRpcjogc3RyaW5nLCBiYXNlRGlyPzogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmICghYmFzZURpcikgYmFzZURpciA9IGRpcjtcbiAgY29uc3QgbWFuaWZlc3Q6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGRpcikpIHJldHVybiBtYW5pZmVzdDtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuICAgIGNvbnN0IHJlbFBhdGggPSBwYXRoLnJlbGF0aXZlKGJhc2VEaXIsIGZ1bGxQYXRoKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24obWFuaWZlc3QsIGdlbmVyYXRlTWFuaWZlc3QoZnVsbFBhdGgsIGJhc2VEaXIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuaWZlc3RbcmVsUGF0aF0gPSBmaWxlSGFzaChmdWxsUGF0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYW5pZmVzdDtcbn1cblxuLyoqXG4gKiBXcml0ZSBmaWxlIG1hbmlmZXN0IGFmdGVyIGluc3RhbGxhdGlvbiBmb3IgZnV0dXJlIG1vZGlmaWNhdGlvbiBkZXRlY3Rpb25cbiAqL1xuZnVuY3Rpb24gd3JpdGVNYW5pZmVzdChjb25maWdEaXI6IHN0cmluZywgcnVudGltZSA9ICdjbGF1ZGUnKSB7XG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xuICBjb25zdCBpc0NvZGV4ID0gcnVudGltZSA9PT0gJ2NvZGV4JztcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xuICBjb25zdCBlekRpciA9IHBhdGguam9pbihjb25maWdEaXIsICdlei1hZ2VudHMnKTtcbiAgY29uc3QgY29tbWFuZHNEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCAnY29tbWFuZHMnLCAnZXonKTtcbiAgY29uc3Qgb3BlbmNvZGVDb21tYW5kRGlyID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgJ2NvbW1hbmQnKTtcbiAgY29uc3QgY29kZXhTa2lsbHNEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCAnc2tpbGxzJyk7XG4gIGNvbnN0IGFnZW50c0RpciA9IHBhdGguam9pbihjb25maWdEaXIsICdhZ2VudHMnKTtcbiAgY29uc3QgbWFuaWZlc3QgPSB7IHZlcnNpb246IHBrZy52ZXJzaW9uLCB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgZmlsZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfTtcblxuICBjb25zdCBlekhhc2hlcyA9IGdlbmVyYXRlTWFuaWZlc3QoZXpEaXIpO1xuICBmb3IgKGNvbnN0IFtyZWwsIGhhc2hdIG9mIE9iamVjdC5lbnRyaWVzKGV6SGFzaGVzKSkge1xuICAgIG1hbmlmZXN0LmZpbGVzWydlei1hZ2VudHMvJyArIHJlbF0gPSBoYXNoO1xuICB9XG4gIGlmICghaXNPcGVuY29kZSAmJiAhaXNDb2RleCAmJiAhaXNDb3BpbG90ICYmIGZzLmV4aXN0c1N5bmMoY29tbWFuZHNEaXIpKSB7XG4gICAgY29uc3QgY21kSGFzaGVzID0gZ2VuZXJhdGVNYW5pZmVzdChjb21tYW5kc0Rpcik7XG4gICAgZm9yIChjb25zdCBbcmVsLCBoYXNoXSBvZiBPYmplY3QuZW50cmllcyhjbWRIYXNoZXMpKSB7XG4gICAgICBtYW5pZmVzdC5maWxlc1snY29tbWFuZHMvZXovJyArIHJlbF0gPSBoYXNoO1xuICAgIH1cbiAgfVxuICBpZiAoaXNPcGVuY29kZSAmJiBmcy5leGlzdHNTeW5jKG9wZW5jb2RlQ29tbWFuZERpcikpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMob3BlbmNvZGVDb21tYW5kRGlyKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgbWFuaWZlc3QuZmlsZXNbJ2NvbW1hbmQvJyArIGZpbGVdID0gZmlsZUhhc2gocGF0aC5qb2luKG9wZW5jb2RlQ29tbWFuZERpciwgZmlsZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoKGlzQ29kZXggfHwgaXNDb3BpbG90KSAmJiBmcy5leGlzdHNTeW5jKGNvZGV4U2tpbGxzRGlyKSkge1xuICAgIGZvciAoY29uc3Qgc2tpbGxOYW1lIG9mIGxpc3RDb2RleFNraWxsTmFtZXMoY29kZXhTa2lsbHNEaXIpKSB7XG4gICAgICBjb25zdCBza2lsbFJvb3QgPSBwYXRoLmpvaW4oY29kZXhTa2lsbHNEaXIsIHNraWxsTmFtZSk7XG4gICAgICBjb25zdCBza2lsbEhhc2hlcyA9IGdlbmVyYXRlTWFuaWZlc3Qoc2tpbGxSb290KTtcbiAgICAgIGZvciAoY29uc3QgW3JlbCwgaGFzaF0gb2YgT2JqZWN0LmVudHJpZXMoc2tpbGxIYXNoZXMpKSB7XG4gICAgICAgIG1hbmlmZXN0LmZpbGVzW2Bza2lsbHMvJHtza2lsbE5hbWV9LyR7cmVsfWBdID0gaGFzaDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGZzLmV4aXN0c1N5bmMoYWdlbnRzRGlyKSkge1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmcy5yZWFkZGlyU3luYyhhZ2VudHNEaXIpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCdlei0nKSAmJiBmaWxlLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICBtYW5pZmVzdC5maWxlc1snYWdlbnRzLycgKyBmaWxlXSA9IGZpbGVIYXNoKHBhdGguam9pbihhZ2VudHNEaXIsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihjb25maWdEaXIsIE1BTklGRVNUX05BTUUpLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMikpO1xuICByZXR1cm4gbWFuaWZlc3Q7XG59XG5cbi8qKlxuICogRGV0ZWN0IHVzZXItbW9kaWZpZWQgRVpfQWdlbnRzIGZpbGVzIGJ5IGNvbXBhcmluZyBhZ2FpbnN0IGluc3RhbGwgbWFuaWZlc3QuXG4gKiBCYWNrcyB1cCBtb2RpZmllZCBmaWxlcyB0byBlei1sb2NhbC1wYXRjaGVzLyBmb3IgcmVhcHBseSBhZnRlciB1cGRhdGUuXG4gKi9cbmZ1bmN0aW9uIHNhdmVMb2NhbFBhdGNoZXMoY29uZmlnRGlyKSB7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIE1BTklGRVNUX05BTUUpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkgcmV0dXJuIFtdO1xuXG4gIGxldCBtYW5pZmVzdDtcbiAgdHJ5IHsgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsICd1dGY4JykpOyB9IGNhdGNoIHsgcmV0dXJuIFtdOyB9XG5cbiAgY29uc3QgcGF0Y2hlc0RpciA9IHBhdGguam9pbihjb25maWdEaXIsIFBBVENIRVNfRElSX05BTUUpO1xuICBjb25zdCBtb2RpZmllZDogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtyZWxQYXRoLCBvcmlnaW5hbEhhc2hdIG9mIE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0LmZpbGVzIHx8IHt9KSkge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgcmVsUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZ1bGxQYXRoKSkgY29udGludWU7XG4gICAgY29uc3QgY3VycmVudEhhc2ggPSBmaWxlSGFzaChmdWxsUGF0aCk7XG4gICAgaWYgKGN1cnJlbnRIYXNoICE9PSBvcmlnaW5hbEhhc2gpIHtcbiAgICAgIGNvbnN0IGJhY2t1cFBhdGggPSBwYXRoLmpvaW4ocGF0Y2hlc0RpciwgcmVsUGF0aCk7XG4gICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKGJhY2t1cFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGZzLmNvcHlGaWxlU3luYyhmdWxsUGF0aCwgYmFja3VwUGF0aCk7XG4gICAgICBtb2RpZmllZC5wdXNoKHJlbFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtb2RpZmllZC5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbWV0YSA9IHtcbiAgICAgIGJhY2tlZF91cF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZnJvbV92ZXJzaW9uOiBtYW5pZmVzdC52ZXJzaW9uLFxuICAgICAgZmlsZXM6IG1vZGlmaWVkXG4gICAgfTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihwYXRjaGVzRGlyLCAnYmFja3VwLW1ldGEuanNvbicpLCBKU09OLnN0cmluZ2lmeShtZXRhLCBudWxsLCAyKSk7XG4gICAgY29uc29sZS5sb2coJyAgJyArIHllbGxvdyArICdpJyArIHJlc2V0ICsgJyAgRm91bmQgJyArIG1vZGlmaWVkLmxlbmd0aCArICcgbG9jYWxseSBtb2RpZmllZCBFWiBmaWxlKHMpIFx1MjAxNCBiYWNrZWQgdXAgdG8gJyArIFBBVENIRVNfRElSX05BTUUgKyAnLycpO1xuICAgIGZvciAoY29uc3QgZiBvZiBtb2RpZmllZCkge1xuICAgICAgY29uc29sZS5sb2coJyAgICAgJyArIGRpbSArIGYgKyByZXNldCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtb2RpZmllZDtcbn1cblxuLyoqXG4gKiBBZnRlciBpbnN0YWxsLCByZXBvcnQgYmFja2VkLXVwIHBhdGNoZXMgZm9yIHVzZXIgdG8gcmVhcHBseS5cbiAqL1xuZnVuY3Rpb24gcmVwb3J0TG9jYWxQYXRjaGVzKGNvbmZpZ0RpciwgcnVudGltZSA9ICdjbGF1ZGUnKSB7XG4gIGNvbnN0IHBhdGNoZXNEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBQQVRDSEVTX0RJUl9OQU1FKTtcbiAgY29uc3QgbWV0YVBhdGggPSBwYXRoLmpvaW4ocGF0Y2hlc0RpciwgJ2JhY2t1cC1tZXRhLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG1ldGFQYXRoKSkgcmV0dXJuIFtdO1xuXG4gIGxldCBtZXRhO1xuICB0cnkgeyBtZXRhID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWV0YVBhdGgsICd1dGY4JykpOyB9IGNhdGNoIHsgcmV0dXJuIFtdOyB9XG5cbiAgaWYgKG1ldGEuZmlsZXMgJiYgbWV0YS5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcmVhcHBseUNvbW1hbmQgPSAocnVudGltZSA9PT0gJ29wZW5jb2RlJyB8fCBydW50aW1lID09PSAnY29waWxvdCcpXG4gICAgICA/ICcvZXotcmVhcHBseS1wYXRjaGVzJ1xuICAgICAgOiBydW50aW1lID09PSAnY29kZXgnXG4gICAgICAgID8gJyRlei1yZWFwcGx5LXBhdGNoZXMnXG4gICAgICAgIDogJy9lejpyZWFwcGx5LXBhdGNoZXMnO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICBjb25zb2xlLmxvZygnICAnICsgeWVsbG93ICsgJ0xvY2FsIHBhdGNoZXMgZGV0ZWN0ZWQnICsgcmVzZXQgKyAnIChmcm9tIHYnICsgbWV0YS5mcm9tX3ZlcnNpb24gKyAnKTonKTtcbiAgICBmb3IgKGNvbnN0IGYgb2YgbWV0YS5maWxlcykge1xuICAgICAgY29uc29sZS5sb2coJyAgICAgJyArIGN5YW4gKyBmICsgcmVzZXQpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgY29uc29sZS5sb2coJyAgWW91ciBtb2RpZmljYXRpb25zIGFyZSBzYXZlZCBpbiAnICsgY3lhbiArIFBBVENIRVNfRElSX05BTUUgKyAnLycgKyByZXNldCk7XG4gICAgY29uc29sZS5sb2coJyAgUnVuICcgKyBjeWFuICsgcmVhcHBseUNvbW1hbmQgKyByZXNldCArICcgdG8gbWVyZ2UgdGhlbSBpbnRvIHRoZSBuZXcgdmVyc2lvbi4nKTtcbiAgICBjb25zb2xlLmxvZygnICBPciBtYW51YWxseSBjb21wYXJlIGFuZCBtZXJnZSB0aGUgZmlsZXMuJyk7XG4gICAgY29uc29sZS5sb2coJycpO1xuICB9XG4gIHJldHVybiBtZXRhLmZpbGVzIHx8IFtdO1xufVxuXG5mdW5jdGlvbiBpbnN0YWxsKGlzR2xvYmFsOiBib29sZWFuLCBydW50aW1lID0gJ2NsYXVkZScpOiB7IHNldHRpbmdzUGF0aDogc3RyaW5nIHwgbnVsbDsgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDsgc3RhdHVzbGluZUNvbW1hbmQ6IHN0cmluZyB8IG51bGw7IHJ1bnRpbWU6IHN0cmluZyB9IHtcbiAgY29uc3QgaXNPcGVuY29kZSA9IHJ1bnRpbWUgPT09ICdvcGVuY29kZSc7XG4gIGNvbnN0IGlzR2VtaW5pID0gcnVudGltZSA9PT0gJ2dlbWluaSc7XG4gIGNvbnN0IGlzQ29kZXggPSBydW50aW1lID09PSAnY29kZXgnO1xuICBjb25zdCBpc0NvcGlsb3QgPSBydW50aW1lID09PSAnY29waWxvdCc7XG4gIGNvbnN0IGlzUXdlbiA9IHJ1bnRpbWUgPT09ICdxd2VuJztcbiAgY29uc3QgaXNLaW1pID0gcnVudGltZSA9PT0gJ2tpbWknO1xuICBjb25zdCBkaXJOYW1lID0gZ2V0RGlyTmFtZShydW50aW1lKTtcbiAgXG4gIC8vIFJlc29sdmUgcGFja2FnZSByb290IGJ5IGZpbmRpbmcgZGlyZWN0b3J5IGNvbnRhaW5pbmcgcGFja2FnZS5qc29uXG4gIC8vIFRoaXMgd29ya3Mgd2hldGhlciBydW5uaW5nIGZyb20gZGlzdC9iaW4vIChpbnN0YWxsZWQpIG9yIGJpbi8gKGRldmVsb3BtZW50KVxuICBsZXQgcGtnUm9vdCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBrZ1Jvb3QsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUocGtnUm9vdCk7XG4gICAgaWYgKHBhcmVudCA9PT0gcGtnUm9vdCkge1xuICAgICAgLy8gUmVhY2hlZCBmaWxlc3lzdGVtIHJvb3QsIGZhbGxiYWNrIHRvIF9fZGlybmFtZVxuICAgICAgcGtnUm9vdCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHBrZ1Jvb3QgPSBwYXJlbnQ7XG4gIH1cbiAgY29uc3Qgc3JjID0gcGtnUm9vdDtcblxuICAvLyBHZXQgdGhlIHRhcmdldCBkaXJlY3RvcnkgYmFzZWQgb24gcnVudGltZSBhbmQgaW5zdGFsbCB0eXBlXG4gIGNvbnN0IHRhcmdldERpciA9IGlzR2xvYmFsXG4gICAgPyBnZXRHbG9iYWxEaXIocnVudGltZSwgZXhwbGljaXRDb25maWdEaXIpXG4gICAgOiBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgZGlyTmFtZSk7XG5cbiAgY29uc3QgbG9jYXRpb25MYWJlbCA9IGlzR2xvYmFsXG4gICAgPyB0YXJnZXREaXIucmVwbGFjZShvcy5ob21lZGlyKCksICd+JylcbiAgICA6IHRhcmdldERpci5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcuJyk7XG5cbiAgLy8gUGF0aCBwcmVmaXggZm9yIGZpbGUgcmVmZXJlbmNlcyBpbiBtYXJrZG93biBjb250ZW50XG4gIC8vIEZvciBnbG9iYWwgaW5zdGFsbHM6IHVzZSB0aWxkZS1iYXNlZCBwYXRoICh+Ly5jbGF1ZGUvKSB0byBhdm9pZCBiYWtpbmdcbiAgLy8gYWJzb2x1dGUgcGF0aHMgKGNvbnRhaW5pbmcgT1MgdXNlcm5hbWUpIGludG8gdGVtcGxhdGVzXG4gIC8vIEZvciBsb2NhbCBpbnN0YWxsczogdXNlIHJlbGF0aXZlXG4gIGNvbnN0IHBhdGhQcmVmaXggPSBpc0dsb2JhbFxuICAgID8gYCR7dGFyZ2V0RGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKS5yZXBsYWNlKG9zLmhvbWVkaXIoKS5yZXBsYWNlKC9cXFxcL2csICcvJyksICd+Jyl9L2BcbiAgICA6IGAuLyR7ZGlyTmFtZX0vYDtcblxuICBsZXQgcnVudGltZUxhYmVsID0gJ0NsYXVkZSBDb2RlJztcbiAgaWYgKGlzT3BlbmNvZGUpIHJ1bnRpbWVMYWJlbCA9ICdPcGVuQ29kZSc7XG4gIGlmIChpc0dlbWluaSkgcnVudGltZUxhYmVsID0gJ0dlbWluaSc7XG4gIGlmIChpc0NvZGV4KSBydW50aW1lTGFiZWwgPSAnQ29kZXgnO1xuICBpZiAoaXNDb3BpbG90KSBydW50aW1lTGFiZWwgPSAnQ29waWxvdCc7XG4gIGlmIChpc1F3ZW4pIHJ1bnRpbWVMYWJlbCA9ICdRd2VuIENvZGUnO1xuICBpZiAoaXNLaW1pKSBydW50aW1lTGFiZWwgPSAnS2ltaSBDb2RlJztcblxuICBjb25zb2xlLmxvZyhgICBJbnN0YWxsaW5nIGZvciAke2N5YW59JHtydW50aW1lTGFiZWx9JHtyZXNldH0gdG8gJHtjeWFufSR7bG9jYXRpb25MYWJlbH0ke3Jlc2V0fVxcbmApO1xuXG4gIC8vIFRyYWNrIGluc3RhbGxhdGlvbiBmYWlsdXJlc1xuICBjb25zdCBmYWlsdXJlczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBTYXZlIGFueSBsb2NhbGx5IG1vZGlmaWVkIEVaX0FnZW50cyBmaWxlcyBiZWZvcmUgdGhleSBnZXQgd2lwZWRcbiAgc2F2ZUxvY2FsUGF0Y2hlcyh0YXJnZXREaXIpO1xuXG4gIC8vIENsZWFuIHVwIG9ycGhhbmVkIGZpbGVzIGZyb20gcHJldmlvdXMgdmVyc2lvbnNcbiAgY2xlYW51cE9ycGhhbmVkRmlsZXModGFyZ2V0RGlyKTtcblxuICAvLyBPcGVuQ29kZSB1c2VzIGNvbW1hbmQvIChmbGF0KSwgQ29kZXgvQ29waWxvdC9Rd2VuIHVzZSBza2lsbHMvLCBDbGF1ZGUvR2VtaW5pIHVzZSBjb21tYW5kcy9lei9cbiAgaWYgKGlzT3BlbmNvZGUpIHtcbiAgICAvLyBPcGVuQ29kZTogZmxhdCBzdHJ1Y3R1cmUgaW4gY29tbWFuZC8gZGlyZWN0b3J5XG4gICAgY29uc3QgY29tbWFuZERpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kJyk7XG4gICAgZnMubWtkaXJTeW5jKGNvbW1hbmREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gQ29weSBjb21tYW5kcy9lei8qLm1kIGFzIGNvbW1hbmQvZXotKi5tZCAoZmxhdHRlbiBzdHJ1Y3R1cmUpXG4gICAgY29uc3QgZXpTcmMgPSBwYXRoLmpvaW4oc3JjLCAnY29tbWFuZHMnLCAnZXonKTtcbiAgICBjb3B5RmxhdHRlbmVkQ29tbWFuZHMoZXpTcmMsIGNvbW1hbmREaXIsICdleicsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpO1xuICAgIGlmICh2ZXJpZnlJbnN0YWxsZWQoY29tbWFuZERpciwgJ2NvbW1hbmQvZXotKicpKSB7XG4gICAgICBjb25zdCBjb3VudCA9IGZzLnJlYWRkaXJTeW5jKGNvbW1hbmREaXIpLmZpbHRlcihmID0+IGYuc3RhcnRzV2l0aCgnZXotJykpLmxlbmd0aDtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkICR7Y291bnR9IGNvbW1hbmRzIHRvIGNvbW1hbmQvYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZhaWx1cmVzLnB1c2goJ2NvbW1hbmQvZXotKicpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0NvZGV4IHx8IGlzS2ltaSkge1xuICAgIC8vIENvZGV4LCBLaW1pOiBza2lsbHMgc3RydWN0dXJlIGluIHNraWxscy8gZGlyZWN0b3J5XG4gICAgY29uc3Qgc2tpbGxzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NraWxscycpO1xuICAgIGNvbnN0IGV6U3JjID0gcGF0aC5qb2luKHNyYywgJ2NvbW1hbmRzJywgJ2V6Jyk7XG4gICAgaWYgKGlzS2ltaSkge1xuICAgICAgY29weUNvbW1hbmRzQXNLaW1pU2tpbGxzKGV6U3JjLCBza2lsbHNEaXIsICdleicsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb3B5Q29tbWFuZHNBc0NvZGV4U2tpbGxzKGV6U3JjLCBza2lsbHNEaXIsICdleicsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YWxsZWRTa2lsbE5hbWVzID0gbGlzdENvZGV4U2tpbGxOYW1lcyhza2lsbHNEaXIpO1xuICAgIGlmIChpbnN0YWxsZWRTa2lsbE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkICR7aW5zdGFsbGVkU2tpbGxOYW1lcy5sZW5ndGh9IHNraWxscyB0byBza2lsbHMvYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZhaWx1cmVzLnB1c2goJ3NraWxscy9lei0qJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUXdlbikge1xuICAgIC8vIFF3ZW4gQ29kZTogY29tbWFuZHMgc3RydWN0dXJlIGluIGNvbW1hbmRzL2V6LyBkaXJlY3RvcnkgKGxpa2UgQ2xhdWRlIENvZGUvR2VtaW5pKVxuICAgIC8vIFF3ZW4gQ29kZSB1c2VzIH4vLnF3ZW4vY29tbWFuZHMvZXovKi5tZCwgTk9UIH4vLnF3ZW4vc2tpbGxzL1xuICAgIGNvbnN0IGNvbW1hbmRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvbW1hbmRzJyk7XG4gICAgY29uc3QgZXpDb21tYW5kc0RpciA9IHBhdGguam9pbihjb21tYW5kc0RpciwgJ2V6Jyk7XG4gICAgZnMubWtkaXJTeW5jKGV6Q29tbWFuZHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIFxuICAgIGNvbnN0IGV6U3JjID0gcGF0aC5qb2luKHNyYywgJ2NvbW1hbmRzJywgJ2V6Jyk7XG4gICAgY29weUNvbW1hbmRzQXNRd2VuQ29tbWFuZHMoZXpTcmMsIGV6Q29tbWFuZHNEaXIsICdleicsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpO1xuICAgIFxuICAgIGlmIChmcy5leGlzdHNTeW5jKGV6Q29tbWFuZHNEaXIpKSB7XG4gICAgICBjb25zdCBjb3VudCA9IGZzLnJlYWRkaXJTeW5jKGV6Q29tbWFuZHNEaXIpLmZpbHRlcihmID0+IGYuZW5kc1dpdGgoJy5tZCcpKS5sZW5ndGg7XG4gICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkICR7Y291bnR9IGNvbW1hbmRzIHRvIGNvbW1hbmRzL2V6L2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmFpbHVyZXMucHVzaCgnY29tbWFuZHMvZXovKi5tZCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdjb21tYW5kcy9lei8qLm1kJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzQ29waWxvdCkge1xuICAgIGNvbnN0IHNraWxsc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdza2lsbHMnKTtcbiAgICBjb25zdCBlelNyYyA9IHBhdGguam9pbihzcmMsICdjb21tYW5kcycsICdleicpO1xuICAgIGNvcHlDb21tYW5kc0FzQ29waWxvdFNraWxscyhlelNyYywgc2tpbGxzRGlyLCAnZXonLCBpc0dsb2JhbCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoc2tpbGxzRGlyKSkge1xuICAgICAgY29uc3QgY291bnQgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgICAgICAuZmlsdGVyKGUgPT4gZS5pc0RpcmVjdG9yeSgpICYmIGUubmFtZS5zdGFydHNXaXRoKCdlei0nKSkubGVuZ3RoO1xuICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCAke2NvdW50fSBza2lsbHMgdG8gc2tpbGxzL2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmFpbHVyZXMucHVzaCgnc2tpbGxzL2V6LSonKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZmFpbHVyZXMucHVzaCgnc2tpbGxzL2V6LSonKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gQ2xhdWRlIENvZGUgJiBHZW1pbmk6IG5lc3RlZCBzdHJ1Y3R1cmUgaW4gY29tbWFuZHMvIGRpcmVjdG9yeVxuICAgIGNvbnN0IGNvbW1hbmRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvbW1hbmRzJyk7XG4gICAgZnMubWtkaXJTeW5jKGNvbW1hbmRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGV6U3JjID0gcGF0aC5qb2luKHNyYywgJ2NvbW1hbmRzJywgJ2V6Jyk7XG4gICAgY29uc3QgZXpEZXN0ID0gcGF0aC5qb2luKGNvbW1hbmRzRGlyLCAnZXonKTtcbiAgICBjb3B5V2l0aFBhdGhSZXBsYWNlbWVudChlelNyYywgZXpEZXN0LCBwYXRoUHJlZml4LCBydW50aW1lLCB0cnVlLCBpc0dsb2JhbCk7XG4gICAgaWYgKHZlcmlmeUluc3RhbGxlZChlekRlc3QsICdjb21tYW5kcy9leicpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCBjb21tYW5kcy9lemApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdjb21tYW5kcy9leicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvcHkgZXotYWdlbnRzIHNraWxsIHdpdGggcGF0aCByZXBsYWNlbWVudFxuICBjb25zdCBza2lsbFNyYyA9IHBhdGguam9pbihzcmMsICdlei1hZ2VudHMnKTtcbiAgY29uc3Qgc2tpbGxEZXN0ID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2V6LWFnZW50cycpO1xuICBjb3B5V2l0aFBhdGhSZXBsYWNlbWVudChza2lsbFNyYywgc2tpbGxEZXN0LCBwYXRoUHJlZml4LCBydW50aW1lLCBmYWxzZSwgaXNHbG9iYWwpO1xuICBpZiAodmVyaWZ5SW5zdGFsbGVkKHNraWxsRGVzdCwgJ2V6LWFnZW50cycpKSB7XG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgZXotYWdlbnRzYCk7XG4gIH0gZWxzZSB7XG4gICAgZmFpbHVyZXMucHVzaCgnZXotYWdlbnRzJyk7XG4gIH1cblxuICAvLyBDb3B5IGRpc3QgZm9sZGVyIChjb21waWxlZCBiaW5hcmllcykgLSByZXF1aXJlZCBmb3IgZXotdG9vbHMuanMgdG8gd29ya1xuICBjb25zdCBkaXN0U3JjID0gcGF0aC5qb2luKHNyYywgJ2Rpc3QnKTtcbiAgY29uc3QgZGlzdERlc3QgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnZXotYWdlbnRzJywgJ2Rpc3QnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGlzdFNyYykpIHtcbiAgICBmcy5ta2RpclN5bmMoZGlzdERlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvcHlEaXJlY3RvcnlSZWN1cnNpdmUoZGlzdFNyYywgZGlzdERlc3QpO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gQ29waWVkIGRpc3QvIHRvIGV6LWFnZW50cy9kaXN0L2ApO1xuICB9XG5cbiAgLy8gQ29weSBob29rcyBmb2xkZXIgKGNvbXBpbGVkIGhvb2sgc2NyaXB0cylcbiAgY29uc3QgaG9va3NTcmMgPSBwYXRoLmpvaW4oc3JjLCAnaG9va3MnKTtcbiAgY29uc3QgaG9va3NEZXN0ID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2V6LWFnZW50cycsICdob29rcycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhob29rc1NyYykpIHtcbiAgICBmcy5ta2RpclN5bmMoaG9va3NEZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBjb3B5RGlyZWN0b3J5UmVjdXJzaXZlKGhvb2tzU3JjLCBob29rc0Rlc3QpO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gQ29waWVkIGhvb2tzLyB0byBlei1hZ2VudHMvaG9va3MvYCk7XG4gIH1cblxuICAvLyBDb3B5IEVaIEFnZW50cyBza2lsbHMgdG8gZ2xvYmFsIGRpcmVjdG9yeSAoJEhPTUUvLnNraWxscy9lei1hZ2VudHMvKVxuICBjb3B5U2tpbGxzKHNyYywgaXNHbG9iYWwsIHJ1bnRpbWUpO1xuXG4gIC8vIENvcHkgYWdlbnRzIHRvIGFnZW50cyBkaXJlY3RvcnlcbiAgY29uc3QgYWdlbnRzU3JjID0gcGF0aC5qb2luKHNyYywgJ2FnZW50cycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhhZ2VudHNTcmMpKSB7XG4gICAgY29uc3QgYWdlbnRzRGVzdCA9IHBhdGguam9pbih0YXJnZXREaXIsICdhZ2VudHMnKTtcbiAgICBmcy5ta2RpclN5bmMoYWdlbnRzRGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZW1vdmUgb2xkIEVaX0FnZW50cyBhZ2VudHMgKGV6LSoubWQpIGJlZm9yZSBjb3B5aW5nIG5ldyBvbmVzXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYWdlbnRzRGVzdCkpIHtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmcy5yZWFkZGlyU3luYyhhZ2VudHNEZXN0KSkge1xuICAgICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCdlei0nKSAmJiBmaWxlLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKGFnZW50c0Rlc3QsIGZpbGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvcHkgbmV3IGFnZW50c1xuICAgIGNvbnN0IGFnZW50RW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGFnZW50c1NyYywgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgYWdlbnRFbnRyaWVzKSB7XG4gICAgICBpZiAoZW50cnkuaXNGaWxlKCkgJiYgZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGFnZW50c1NyYywgZW50cnkubmFtZSksICd1dGY4Jyk7XG4gICAgICAgIC8vIFJlcGxhY2Ugfi8uY2xhdWRlLyBhbmQgJEhPTUUvLmNsYXVkZS8gYXMgdGhleSBhcmUgdGhlIHNvdXJjZSBvZiB0cnV0aCBpbiB0aGUgcmVwb1xuICAgICAgICBjb25zdCBkaXJSZWdleCA9IC9+XFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnN0IGhvbWVEaXJSZWdleCA9IC9cXCRIT01FXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGlmICghaXNDb3BpbG90KSB7XG4gICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShkaXJSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShob21lRGlyUmVnZXgsIHRvSG9tZVByZWZpeChwYXRoUHJlZml4KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50LCBnZXRDb21taXRBdHRyaWJ1dGlvbihydW50aW1lKSk7XG4gICAgICAgIC8vIENvbnZlcnQgZnJvbnRtYXR0ZXIgZm9yIHJ1bnRpbWUgY29tcGF0aWJpbGl0eVxuICAgICAgICBpZiAoaXNPcGVuY29kZSkge1xuICAgICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9PcGVuY29kZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzR2VtaW5pKSB7XG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb0dlbWluaUFnZW50KGNvbnRlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ29kZXgpIHtcbiAgICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZUFnZW50VG9Db2RleEFnZW50KGNvbnRlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ29waWxvdCkge1xuICAgICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvcGlsb3RBZ2VudChjb250ZW50LCBpc0dsb2JhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNRd2VuKSB7XG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb1F3ZW5BZ2VudChjb250ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0tpbWkpIHtcbiAgICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvS2ltaUFnZW50KGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlc3ROYW1lID0gaXNDb3BpbG90ID8gZW50cnkubmFtZS5yZXBsYWNlKCcubWQnLCAnLmFnZW50Lm1kJykgOiBlbnRyeS5uYW1lO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihhZ2VudHNEZXN0LCBkZXN0TmFtZSksIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmVyaWZ5SW5zdGFsbGVkKGFnZW50c0Rlc3QsICdhZ2VudHMnKSkge1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgYWdlbnRzYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZhaWx1cmVzLnB1c2goJ2FnZW50cycpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvcHkgQ0hBTkdFTE9HLm1kXG4gIGNvbnN0IGNoYW5nZWxvZ1NyYyA9IHBhdGguam9pbihzcmMsICdDSEFOR0VMT0cubWQnKTtcbiAgY29uc3QgY2hhbmdlbG9nRGVzdCA9IHBhdGguam9pbih0YXJnZXREaXIsICdlei1hZ2VudHMnLCAnQ0hBTkdFTE9HLm1kJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGNoYW5nZWxvZ1NyYykpIHtcbiAgICBmcy5jb3B5RmlsZVN5bmMoY2hhbmdlbG9nU3JjLCBjaGFuZ2Vsb2dEZXN0KTtcbiAgICBpZiAodmVyaWZ5RmlsZUluc3RhbGxlZChjaGFuZ2Vsb2dEZXN0LCAnQ0hBTkdFTE9HLm1kJykpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkIENIQU5HRUxPRy5tZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdDSEFOR0VMT0cubWQnKTtcbiAgICB9XG4gIH1cblxuICAvLyBXcml0ZSBWRVJTSU9OIGZpbGVcbiAgY29uc3QgdmVyc2lvbkRlc3QgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnZXotYWdlbnRzJywgJ1ZFUlNJT04nKTtcbiAgZnMud3JpdGVGaWxlU3luYyh2ZXJzaW9uRGVzdCwgcGtnLnZlcnNpb24pO1xuICBpZiAodmVyaWZ5RmlsZUluc3RhbGxlZCh2ZXJzaW9uRGVzdCwgJ1ZFUlNJT04nKSkge1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gV3JvdGUgVkVSU0lPTiAoJHtwa2cudmVyc2lvbn0pYCk7XG4gIH0gZWxzZSB7XG4gICAgZmFpbHVyZXMucHVzaCgnVkVSU0lPTicpO1xuICB9XG5cbiAgaWYgKCFpc0NvZGV4ICYmICFpc0NvcGlsb3QgJiYgIWlzUXdlbiAmJiAhaXNLaW1pKSB7XG4gICAgLy8gV3JpdGUgcGFja2FnZS5qc29uIHRvIGZvcmNlIENvbW1vbkpTIG1vZGUgZm9yIEVaIHNjcmlwdHNcbiAgICAvLyBQcmV2ZW50cyBcInJlcXVpcmUgaXMgbm90IGRlZmluZWRcIiBlcnJvcnMgd2hlbiBwcm9qZWN0IGhhcyBcInR5cGVcIjogXCJtb2R1bGVcIlxuICAgIC8vIE5vZGUuanMgd2Fsa3MgdXAgbG9va2luZyBmb3IgcGFja2FnZS5qc29uIC0gdGhpcyBzdG9wcyBpbmhlcml0YW5jZSBmcm9tIHByb2plY3RcbiAgICBjb25zdCBwa2dKc29uRGVzdCA9IHBhdGguam9pbih0YXJnZXREaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBrZ0pzb25EZXN0LCAne1widHlwZVwiOlwiY29tbW9uanNcIn1cXG4nKTtcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFdyb3RlIHBhY2thZ2UuanNvbiAoQ29tbW9uSlMgbW9kZSlgKTtcblxuICAgIC8vIENvcHkgaG9va3MgZnJvbSBkaXN0LyAoYnVuZGxlZCB3aXRoIGRlcGVuZGVuY2llcylcbiAgICAvLyBUZW1wbGF0ZSBwYXRocyBmb3IgdGhlIHRhcmdldCBydW50aW1lIChyZXBsYWNlcyAnLmNsYXVkZScgd2l0aCBjb3JyZWN0IGNvbmZpZyBkaXIpXG4gICAgY29uc3QgaG9va3NTcmMgPSBwYXRoLmpvaW4oc3JjLCAnaG9va3MnLCAnZGlzdCcpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGhvb2tzU3JjKSkge1xuICAgICAgY29uc3QgaG9va3NEZXN0ID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2hvb2tzJyk7XG4gICAgICBmcy5ta2RpclN5bmMoaG9va3NEZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IGhvb2tFbnRyaWVzID0gZnMucmVhZGRpclN5bmMoaG9va3NTcmMpO1xuICAgICAgY29uc3QgY29uZmlnRGlyUmVwbGFjZW1lbnQgPSBnZXRDb25maWdEaXJGcm9tSG9tZShydW50aW1lLCBpc0dsb2JhbCk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGhvb2tFbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IHNyY0ZpbGUgPSBwYXRoLmpvaW4oaG9va3NTcmMsIGVudHJ5KTtcbiAgICAgICAgaWYgKGZzLnN0YXRTeW5jKHNyY0ZpbGUpLmlzRmlsZSgpKSB7XG4gICAgICAgICAgY29uc3QgZGVzdEZpbGUgPSBwYXRoLmpvaW4oaG9va3NEZXN0LCBlbnRyeSk7XG4gICAgICAgICAgLy8gVGVtcGxhdGUgLmpzIGZpbGVzIHRvIHJlcGxhY2UgJy5jbGF1ZGUnIHdpdGggcnVudGltZS1zcGVjaWZpYyBjb25maWcgZGlyXG4gICAgICAgICAgaWYgKGVudHJ5LmVuZHNXaXRoKCcuanMnKSkge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc3JjRmlsZSwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLydcXC5jbGF1ZGUnL2csIGNvbmZpZ0RpclJlcGxhY2VtZW50KTtcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZGVzdEZpbGUsIGNvbnRlbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoc3JjRmlsZSwgZGVzdEZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHZlcmlmeUluc3RhbGxlZChob29rc0Rlc3QsICdob29rcycpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkIGhvb2tzIChidW5kbGVkKWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmFpbHVyZXMucHVzaCgnaG9va3MnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZmFpbHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFxcbiAgJHt5ZWxsb3d9SW5zdGFsbGF0aW9uIGluY29tcGxldGUhJHtyZXNldH0gRmFpbGVkOiAke2ZhaWx1cmVzLmpvaW4oJywgJyl9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gV3JpdGUgZmlsZSBtYW5pZmVzdCBmb3IgZnV0dXJlIG1vZGlmaWNhdGlvbiBkZXRlY3Rpb25cbiAgd3JpdGVNYW5pZmVzdCh0YXJnZXREaXIsIHJ1bnRpbWUpO1xuICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFdyb3RlIGZpbGUgbWFuaWZlc3QgKCR7TUFOSUZFU1RfTkFNRX0pYCk7XG5cbiAgLy8gUmVwb3J0IGFueSBiYWNrZWQtdXAgbG9jYWwgcGF0Y2hlc1xuICByZXBvcnRMb2NhbFBhdGNoZXModGFyZ2V0RGlyLCBydW50aW1lKTtcblxuICAvLyBWZXJpZnkgbm8gbGVha2VkIC5jbGF1ZGUgcGF0aHMgaW4gbm9uLUNsYXVkZSBydW50aW1lc1xuICBpZiAocnVudGltZSAhPT0gJ2NsYXVkZScpIHtcbiAgICBjb25zdCBsZWFrZWRQYXRoczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGNvdW50OiBudW1iZXIgfT4gPSBbXTtcbiAgICBmdW5jdGlvbiBzY2FuRm9yTGVha2VkUGF0aHMoZGlyOiBzdHJpbmcpIHtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSByZXR1cm47XG4gICAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICBzY2FuRm9yTGVha2VkUGF0aHMoZnVsbFBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKChlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSB8fCBlbnRyeS5uYW1lLmVuZHNXaXRoKCcudG9tbCcpKSAmJiBlbnRyeS5uYW1lICE9PSAnQ0hBTkdFTE9HLm1kJykge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2goLyg/On58XFwkSE9NRSlcXC9cXC5jbGF1ZGVcXGIvZyk7XG4gICAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGxlYWtlZFBhdGhzLnB1c2goeyBmaWxlOiBmdWxsUGF0aC5yZXBsYWNlKHRhcmdldERpciArICcvJywgJycpLCBjb3VudDogbWF0Y2hlcy5sZW5ndGggfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHNjYW5Gb3JMZWFrZWRQYXRocyh0YXJnZXREaXIpO1xuICAgIGlmIChsZWFrZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB0b3RhbExlYWtzID0gbGVha2VkUGF0aHMucmVkdWNlKChzdW0sIGwpID0+IHN1bSArIGwuY291bnQsIDApO1xuICAgICAgY29uc29sZS53YXJuKGBcXG4gICR7eWVsbG93fVx1MjZBMCR7cmVzZXR9ICBGb3VuZCAke3RvdGFsTGVha3N9IHVucmVwbGFjZWQgLmNsYXVkZSBwYXRoIHJlZmVyZW5jZShzKSBpbiAke2xlYWtlZFBhdGhzLmxlbmd0aH0gZmlsZShzKTpgKTtcbiAgICAgIGZvciAoY29uc3QgbGVhayBvZiBsZWFrZWRQYXRocy5zbGljZSgwLCA1KSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYCAgICAgJHtkaW19JHtsZWFrLmZpbGV9JHtyZXNldH0gKCR7bGVhay5jb3VudH0pYCk7XG4gICAgICB9XG4gICAgICBpZiAobGVha2VkUGF0aHMubGVuZ3RoID4gNSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYCAgICAgJHtkaW19Li4uIGFuZCAke2xlYWtlZFBhdGhzLmxlbmd0aCAtIDV9IG1vcmUgZmlsZShzKSR7cmVzZXR9YCk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oYCAgJHtkaW19VGhlc2UgcGF0aHMgbWF5IG5vdCByZXNvbHZlIGNvcnJlY3RseSBmb3IgJHtydW50aW1lTGFiZWx9LiR7cmVzZXR9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzQ29kZXgpIHtcbiAgICAvLyBHZW5lcmF0ZSBDb2RleCBjb25maWcudG9tbCBhbmQgcGVyLWFnZW50IC50b21sIGZpbGVzXG4gICAgY29uc3QgYWdlbnRDb3VudCA9IGluc3RhbGxDb2RleENvbmZpZyh0YXJnZXREaXIsIGFnZW50c1NyYyk7XG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBHZW5lcmF0ZWQgY29uZmlnLnRvbWwgd2l0aCAke2FnZW50Q291bnR9IGFnZW50IHJvbGVzYCk7XG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBHZW5lcmF0ZWQgJHthZ2VudENvdW50fSBhZ2VudCAudG9tbCBjb25maWcgZmlsZXNgKTtcbiAgICByZXR1cm4geyBzZXR0aW5nc1BhdGg6IG51bGwsIHNldHRpbmdzOiBudWxsLCBzdGF0dXNsaW5lQ29tbWFuZDogbnVsbCwgcnVudGltZSB9O1xuICB9XG5cbiAgaWYgKGlzQ29waWxvdCkge1xuICAgIC8vIEdlbmVyYXRlIGNvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kXG4gICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2V6LWFnZW50cycsICd0ZW1wbGF0ZXMnLCAnY29waWxvdC1pbnN0cnVjdGlvbnMubWQnKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnNQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCAndXRmOCcpO1xuICAgICAgbWVyZ2VDb3BpbG90SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uc1BhdGgsIHRlbXBsYXRlKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gR2VuZXJhdGVkIGNvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kYCk7XG4gICAgfVxuICAgIC8vIENvcGlsb3Q6IG5vIHNldHRpbmdzLmpzb24sIG5vIGhvb2tzLCBubyBzdGF0dXNsaW5lIChsaWtlIENvZGV4KVxuICAgIHJldHVybiB7IHNldHRpbmdzUGF0aDogbnVsbCwgc2V0dGluZ3M6IG51bGwsIHN0YXR1c2xpbmVDb21tYW5kOiBudWxsLCBydW50aW1lIH07XG4gIH1cblxuICBpZiAoaXNRd2VuIHx8IGlzS2ltaSkge1xuICAgIC8vIFF3ZW4vS2ltaTogbm8gc2V0dGluZ3MuanNvbiBob29rcywgbm8gc3RhdHVzbGluZSAobGlrZSBDb2RleC9Db3BpbG90KVxuICAgIC8vIFNraWxscyBhcmUgaW5zdGFsbGVkIGRpcmVjdGx5IGluIHNraWxscy9lei0qL1NLSUxMLm1kXG4gICAgcmV0dXJuIHsgc2V0dGluZ3NQYXRoOiBudWxsLCBzZXR0aW5nczogbnVsbCwgc3RhdHVzbGluZUNvbW1hbmQ6IG51bGwsIHJ1bnRpbWUgfTtcbiAgfVxuXG4gIC8vIENvbmZpZ3VyZSBzdGF0dXNsaW5lIGFuZCBob29rcyBpbiBzZXR0aW5ncy5qc29uXG4gIC8vIEdlbWluaSB1c2VzIEFmdGVyVG9vbCBpbnN0ZWFkIG9mIFBvc3RUb29sVXNlIGZvciBwb3N0LXRvb2wgaG9va3NcbiAgY29uc3QgcG9zdFRvb2xFdmVudCA9IHJ1bnRpbWUgPT09ICdnZW1pbmknID8gJ0FmdGVyVG9vbCcgOiAnUG9zdFRvb2xVc2UnO1xuICBjb25zdCBzZXR0aW5nc1BhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnc2V0dGluZ3MuanNvbicpO1xuICBjb25zdCBzZXR0aW5ncyA9IGNsZWFudXBPcnBoYW5lZEhvb2tzKHJlYWRTZXR0aW5ncyhzZXR0aW5nc1BhdGgpKTtcbiAgY29uc3Qgc3RhdHVzbGluZUNvbW1hbmQgPSBpc0dsb2JhbFxuICAgID8gYnVpbGRIb29rQ29tbWFuZCh0YXJnZXREaXIsICdlei1zdGF0dXNsaW5lLmpzJylcbiAgICA6ICdub2RlICcgKyBkaXJOYW1lICsgJy9ob29rcy9lei1zdGF0dXNsaW5lLmpzJztcbiAgY29uc3QgdXBkYXRlQ2hlY2tDb21tYW5kID0gaXNHbG9iYWxcbiAgICA/IGJ1aWxkSG9va0NvbW1hbmQodGFyZ2V0RGlyLCAnZXotY2hlY2stdXBkYXRlLmpzJylcbiAgICA6ICdub2RlICcgKyBkaXJOYW1lICsgJy9ob29rcy9lei1jaGVjay11cGRhdGUuanMnO1xuICBjb25zdCBjb250ZXh0TW9uaXRvckNvbW1hbmQgPSBpc0dsb2JhbFxuICAgID8gYnVpbGRIb29rQ29tbWFuZCh0YXJnZXREaXIsICdlei1jb250ZXh0LW1vbml0b3IuanMnKVxuICAgIDogJ25vZGUgJyArIGRpck5hbWUgKyAnL2hvb2tzL2V6LWNvbnRleHQtbW9uaXRvci5qcyc7XG5cbiAgLy8gRW5hYmxlIGV4cGVyaW1lbnRhbCBhZ2VudHMgZm9yIEdlbWluaSBDTEkgKHJlcXVpcmVkIGZvciBjdXN0b20gc3ViLWFnZW50cylcbiAgaWYgKGlzR2VtaW5pKSB7XG4gICAgaWYgKCFzZXR0aW5ncy5leHBlcmltZW50YWwpIHtcbiAgICAgIHNldHRpbmdzLmV4cGVyaW1lbnRhbCA9IHt9O1xuICAgIH1cbiAgICBpZiAoIXNldHRpbmdzLmV4cGVyaW1lbnRhbC5lbmFibGVBZ2VudHMpIHtcbiAgICAgIHNldHRpbmdzLmV4cGVyaW1lbnRhbC5lbmFibGVBZ2VudHMgPSB0cnVlO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBFbmFibGVkIGV4cGVyaW1lbnRhbCBhZ2VudHNgKTtcbiAgICB9XG4gIH1cblxuICAvLyBDb25maWd1cmUgU2Vzc2lvblN0YXJ0IGhvb2sgZm9yIHVwZGF0ZSBjaGVja2luZyAoc2tpcCBmb3Igb3BlbmNvZGUpXG4gIGlmICghaXNPcGVuY29kZSkge1xuICAgIGlmICghc2V0dGluZ3MuaG9va3MpIHtcbiAgICAgIHNldHRpbmdzLmhvb2tzID0ge307XG4gICAgfVxuICAgIGlmICghc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0KSB7XG4gICAgICBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQgPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNFelVwZGF0ZUhvb2sgPSBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQuc29tZShlbnRyeSA9PlxuICAgICAgZW50cnkuaG9va3MgJiYgZW50cnkuaG9va3Muc29tZShoID0+IGguY29tbWFuZCAmJiBoLmNvbW1hbmQuaW5jbHVkZXMoJ2V6LWNoZWNrLXVwZGF0ZScpKVxuICAgICk7XG5cbiAgICBpZiAoIWhhc0V6VXBkYXRlSG9vaykge1xuICAgICAgc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0LnB1c2goe1xuICAgICAgICBob29rczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdjb21tYW5kJyxcbiAgICAgICAgICAgIGNvbW1hbmQ6IHVwZGF0ZUNoZWNrQ29tbWFuZFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENvbmZpZ3VyZWQgdXBkYXRlIGNoZWNrIGhvb2tgKTtcbiAgICB9XG5cbiAgICAvLyBDb25maWd1cmUgcG9zdC10b29sIGhvb2sgZm9yIGNvbnRleHQgd2luZG93IG1vbml0b3JpbmdcbiAgICBpZiAoIXNldHRpbmdzLmhvb2tzW3Bvc3RUb29sRXZlbnRdKSB7XG4gICAgICBzZXR0aW5ncy5ob29rc1twb3N0VG9vbEV2ZW50XSA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0NvbnRleHRNb25pdG9ySG9vayA9IHNldHRpbmdzLmhvb2tzW3Bvc3RUb29sRXZlbnRdLnNvbWUoZW50cnkgPT5cbiAgICAgIGVudHJ5Lmhvb2tzICYmIGVudHJ5Lmhvb2tzLnNvbWUoaCA9PiBoLmNvbW1hbmQgJiYgaC5jb21tYW5kLmluY2x1ZGVzKCdlei1jb250ZXh0LW1vbml0b3InKSlcbiAgICApO1xuXG4gICAgaWYgKCFoYXNDb250ZXh0TW9uaXRvckhvb2spIHtcbiAgICAgIHNldHRpbmdzLmhvb2tzW3Bvc3RUb29sRXZlbnRdLnB1c2goe1xuICAgICAgICBob29rczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdjb21tYW5kJyxcbiAgICAgICAgICAgIGNvbW1hbmQ6IGNvbnRleHRNb25pdG9yQ29tbWFuZFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENvbmZpZ3VyZWQgY29udGV4dCB3aW5kb3cgbW9uaXRvciBob29rYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgc2V0dGluZ3NQYXRoLCBzZXR0aW5ncywgc3RhdHVzbGluZUNvbW1hbmQsIHJ1bnRpbWUgfTtcbn1cblxuLyoqXG4gKiBBcHBseSBzdGF0dXNsaW5lIGNvbmZpZywgdGhlbiBwcmludCBjb21wbGV0aW9uIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gZmluaXNoSW5zdGFsbChzZXR0aW5nc1BhdGgsIHNldHRpbmdzLCBzdGF0dXNsaW5lQ29tbWFuZCwgc2hvdWxkSW5zdGFsbFN0YXR1c2xpbmUsIHJ1bnRpbWUgPSAnY2xhdWRlJywgaXNHbG9iYWwgPSB0cnVlKSB7XG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xuICBjb25zdCBpc0NvZGV4ID0gcnVudGltZSA9PT0gJ2NvZGV4JztcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xuICBjb25zdCBpc1F3ZW4gPSBydW50aW1lID09PSAncXdlbic7XG4gIGNvbnN0IGlzS2ltaSA9IHJ1bnRpbWUgPT09ICdraW1pJztcblxuICBpZiAoc2hvdWxkSW5zdGFsbFN0YXR1c2xpbmUgJiYgIWlzT3BlbmNvZGUgJiYgIWlzQ29kZXggJiYgIWlzQ29waWxvdCAmJiAhaXNRd2VuICYmICFpc0tpbWkpIHtcbiAgICBzZXR0aW5ncy5zdGF0dXNMaW5lID0ge1xuICAgICAgdHlwZTogJ2NvbW1hbmQnLFxuICAgICAgY29tbWFuZDogc3RhdHVzbGluZUNvbW1hbmRcbiAgICB9O1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gQ29uZmlndXJlZCBzdGF0dXNsaW5lYCk7XG4gIH1cblxuICAvLyBXcml0ZSBzZXR0aW5ncyB3aGVuIHJ1bnRpbWUgc3VwcG9ydHMgc2V0dGluZ3MuanNvblxuICBpZiAoIWlzQ29kZXggJiYgIWlzQ29waWxvdCAmJiAhaXNRd2VuICYmICFpc0tpbWkpIHtcbiAgICB3cml0ZVNldHRpbmdzKHNldHRpbmdzUGF0aCwgc2V0dGluZ3MpO1xuICB9XG5cbiAgLy8gQ29uZmlndXJlIE9wZW5Db2RlIHBlcm1pc3Npb25zXG4gIGlmIChpc09wZW5jb2RlKSB7XG4gICAgY29uZmlndXJlT3BlbmNvZGVQZXJtaXNzaW9ucyhpc0dsb2JhbCk7XG4gIH1cblxuICBsZXQgcHJvZ3JhbSA9ICdDbGF1ZGUgQ29kZSc7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSBwcm9ncmFtID0gJ09wZW5Db2RlJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdnZW1pbmknKSBwcm9ncmFtID0gJ0dlbWluaSc7XG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSBwcm9ncmFtID0gJ0NvZGV4JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb3BpbG90JykgcHJvZ3JhbSA9ICdDb3BpbG90JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcHJvZ3JhbSA9ICdRd2VuIENvZGUnO1xuICBpZiAocnVudGltZSA9PT0gJ2tpbWknKSBwcm9ncmFtID0gJ0tpbWkgQ29kZSc7XG5cbiAgbGV0IGNvbW1hbmQgPSAnL2V6Om5ldy1wcm9qZWN0JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdvcGVuY29kZScgfHwgcnVudGltZSA9PT0gJ2dlbWluaScgfHwgcnVudGltZSA9PT0gJ2NvcGlsb3QnIHx8IHJ1bnRpbWUgPT09ICdxd2VuJyB8fCBydW50aW1lID09PSAna2ltaScpIGNvbW1hbmQgPSAnL2V6LW5ldy1wcm9qZWN0JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb2RleCcpIGNvbW1hbmQgPSAnJGV6LW5ldy1wcm9qZWN0JztcbiAgY29uc29sZS5sb2coYFxuICAke2dyZWVufURvbmUhJHtyZXNldH0gT3BlbiBhIGJsYW5rIGRpcmVjdG9yeSBpbiAke3Byb2dyYW19IGFuZCBydW4gJHtjeWFufSR7Y29tbWFuZH0ke3Jlc2V0fS5cblxuICAke2N5YW59Sm9pbiB0aGUgY29tbXVuaXR5OiR7cmVzZXR9IGh0dHBzOi8vZGlzY29yZC5nZy9lei1hZ2VudHNcbmApO1xufVxuXG4vKipcbiAqIEhhbmRsZSBzdGF0dXNsaW5lIGNvbmZpZ3VyYXRpb24gd2l0aCBvcHRpb25hbCBwcm9tcHRcbiAqL1xuZnVuY3Rpb24gaGFuZGxlU3RhdHVzbGluZShzZXR0aW5ncywgaXNJbnRlcmFjdGl2ZSwgY2FsbGJhY2spIHtcbiAgY29uc3QgaGFzRXhpc3RpbmcgPSBzZXR0aW5ncy5zdGF0dXNMaW5lICE9IG51bGw7XG5cbiAgaWYgKCFoYXNFeGlzdGluZykge1xuICAgIGNhbGxiYWNrKHRydWUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChmb3JjZVN0YXR1c2xpbmUpIHtcbiAgICBjYWxsYmFjayh0cnVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzSW50ZXJhY3RpdmUpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBTa2lwcGluZyBzdGF0dXNsaW5lIChhbHJlYWR5IGNvbmZpZ3VyZWQpYCk7XG4gICAgY29uc29sZS5sb2coYCAgICBVc2UgJHtjeWFufS0tZm9yY2Utc3RhdHVzbGluZSR7cmVzZXR9IHRvIHJlcGxhY2VcXG5gKTtcbiAgICBjYWxsYmFjayhmYWxzZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmdDbWQgPSBzZXR0aW5ncy5zdGF0dXNMaW5lLmNvbW1hbmQgfHwgc2V0dGluZ3Muc3RhdHVzTGluZS51cmwgfHwgJyhjdXN0b20pJztcblxuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dFxuICB9KTtcblxuICBjb25zb2xlLmxvZyhgXG4gICR7eWVsbG93fVx1MjZBMCR7cmVzZXR9IEV4aXN0aW5nIHN0YXR1c2xpbmUgZGV0ZWN0ZWRcXG5cbiAgWW91ciBjdXJyZW50IHN0YXR1c2xpbmU6XG4gICAgJHtkaW19Y29tbWFuZDogJHtleGlzdGluZ0NtZH0ke3Jlc2V0fVxuXG4gIEVaX0FnZW50cyBpbmNsdWRlcyBhIHN0YXR1c2xpbmUgc2hvd2luZzpcbiAgICBcdTIwMjIgTW9kZWwgbmFtZVxuICAgIFx1MjAyMiBDdXJyZW50IHRhc2sgKGZyb20gdG9kbyBsaXN0KVxuICAgIFx1MjAyMiBDb250ZXh0IHdpbmRvdyB1c2FnZSAoY29sb3ItY29kZWQpXG5cbiAgJHtjeWFufTEke3Jlc2V0fSkgS2VlcCBleGlzdGluZ1xuICAke2N5YW59MiR7cmVzZXR9KSBSZXBsYWNlIHdpdGggRVpfQWdlbnRzIHN0YXR1c2xpbmVcbmApO1xuXG4gIHJsLnF1ZXN0aW9uKGAgIENob2ljZSAke2RpbX1bMV0ke3Jlc2V0fTogYCwgKGFuc3dlcikgPT4ge1xuICAgIHJsLmNsb3NlKCk7XG4gICAgY29uc3QgY2hvaWNlID0gYW5zd2VyLnRyaW0oKSB8fCAnMSc7XG4gICAgY2FsbGJhY2soY2hvaWNlID09PSAnMicpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQcm9tcHQgZm9yIHJ1bnRpbWUgc2VsZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb21wdFJ1bnRpbWUoY2FsbGJhY2spIHtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXRcbiAgfSk7XG5cbiAgbGV0IGFuc3dlcmVkID0gZmFsc2U7XG5cbiAgcmwub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGlmICghYW5zd2VyZWQpIHtcbiAgICAgIGFuc3dlcmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUubG9nKGBcXG4gICR7eWVsbG93fUluc3RhbGxhdGlvbiBjYW5jZWxsZWQke3Jlc2V0fVxcbmApO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9V2hpY2ggcnVudGltZShzKSB3b3VsZCB5b3UgbGlrZSB0byBpbnN0YWxsIGZvcj8ke3Jlc2V0fVxcblxcbiAgJHtjeWFufTEke3Jlc2V0fSkgQ2xhdWRlIENvZGUgJHtkaW19KH4vLmNsYXVkZSkke3Jlc2V0fVxuICAke2N5YW59MiR7cmVzZXR9KSBPcGVuQ29kZSAgICAke2RpbX0ofi8uY29uZmlnL29wZW5jb2RlKSR7cmVzZXR9IC0gb3BlbiBzb3VyY2UsIGZyZWUgbW9kZWxzXG4gICR7Y3lhbn0zJHtyZXNldH0pIEdlbWluaSAgICAgICR7ZGltfSh+Ly5nZW1pbmkpJHtyZXNldH1cbiAgJHtjeWFufTQke3Jlc2V0fSkgQ29kZXggICAgICAgJHtkaW19KH4vLmNvZGV4KSR7cmVzZXR9XG4gICR7Y3lhbn01JHtyZXNldH0pIENvcGlsb3QgICAgICR7ZGltfSh+Ly5jb3BpbG90KSR7cmVzZXR9XG4gICR7Y3lhbn02JHtyZXNldH0pIFF3ZW4gQ29kZSAgICR7ZGltfSh+Ly5xd2VuKSR7cmVzZXR9IC0gQWxpYmFiYSBRd2VuIG9mZmljaWFsIENMSVxuICAke2N5YW59NyR7cmVzZXR9KSBLaW1pIENvZGUgICAke2RpbX0ofi8ua2ltaSkke3Jlc2V0fSAtIE1vb25zaG90IEtpbWkgb2ZmaWNpYWwgQ0xJXG4gICR7Y3lhbn04JHtyZXNldH0pIEFsbCAke2RpbX0oYWxsIDcgcnVudGltZXMgYWJvdmUpJHtyZXNldH1cblxuICAke2RpbX1Ob3RlOiBPcGVuQUkgYW5kIEFudGhyb3BpYyBhcmUgbW9kZWwgcHJvdmlkZXJzIGNvbmZpZ3VyZWQgd2l0aGluIGVhY2ggcnVudGltZSdzIHNldHRpbmdzLFxuICBub3Qgc2VwYXJhdGUgQ0xJIHJ1bnRpbWVzLiBTZWUgUkVBRE1FLm1kIGZvciBtb2RlbCBjb25maWd1cmF0aW9uLiR7cmVzZXR9XG5gKTtcblxuICBybC5xdWVzdGlvbihgICBDaG9pY2UgJHtkaW19WzFdJHtyZXNldH06IGAsIChhbnN3ZXIpID0+IHtcbiAgICBhbnN3ZXJlZCA9IHRydWU7XG4gICAgcmwuY2xvc2UoKTtcbiAgICBjb25zdCBjaG9pY2UgPSBhbnN3ZXIudHJpbSgpIHx8ICcxJztcbiAgICBpZiAoY2hvaWNlID09PSAnOCcpIHtcbiAgICAgIGNhbGxiYWNrKFsnY2xhdWRlJywgJ29wZW5jb2RlJywgJ2dlbWluaScsICdjb2RleCcsICdjb3BpbG90JywgJ3F3ZW4nLCAna2ltaSddKTtcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzcnKSB7XG4gICAgICBjYWxsYmFjayhbJ2tpbWknXSk7XG4gICAgfSBlbHNlIGlmIChjaG9pY2UgPT09ICc2Jykge1xuICAgICAgY2FsbGJhY2soWydxd2VuJ10pO1xuICAgIH0gZWxzZSBpZiAoY2hvaWNlID09PSAnNScpIHtcbiAgICAgIGNhbGxiYWNrKFsnY29waWxvdCddKTtcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzQnKSB7XG4gICAgICBjYWxsYmFjayhbJ2NvZGV4J10pO1xuICAgIH0gZWxzZSBpZiAoY2hvaWNlID09PSAnMycpIHtcbiAgICAgIGNhbGxiYWNrKFsnZ2VtaW5pJ10pO1xuICAgIH0gZWxzZSBpZiAoY2hvaWNlID09PSAnMicpIHtcbiAgICAgIGNhbGxiYWNrKFsnb3BlbmNvZGUnXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKFsnY2xhdWRlJ10pO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUHJvbXB0IGZvciBpbnN0YWxsIGxvY2F0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb21wdExvY2F0aW9uKHJ1bnRpbWVzKSB7XG4gIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIGNvbnNvbGUubG9nKGAgICR7eWVsbG93fU5vbi1pbnRlcmFjdGl2ZSB0ZXJtaW5hbCBkZXRlY3RlZCwgZGVmYXVsdGluZyB0byBnbG9iYWwgaW5zdGFsbCR7cmVzZXR9XFxuYCk7XG4gICAgaW5zdGFsbEFsbFJ1bnRpbWVzKHJ1bnRpbWVzLCB0cnVlLCBmYWxzZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXRcbiAgfSk7XG5cbiAgbGV0IGFuc3dlcmVkID0gZmFsc2U7XG5cbiAgcmwub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGlmICghYW5zd2VyZWQpIHtcbiAgICAgIGFuc3dlcmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUubG9nKGBcXG4gICR7eWVsbG93fUluc3RhbGxhdGlvbiBjYW5jZWxsZWQke3Jlc2V0fVxcbmApO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgcGF0aEV4YW1wbGVzID0gcnVudGltZXMubWFwKHIgPT4ge1xuICAgIGNvbnN0IGdsb2JhbFBhdGggPSBnZXRHbG9iYWxEaXIociwgZXhwbGljaXRDb25maWdEaXIpO1xuICAgIHJldHVybiBnbG9iYWxQYXRoLnJlcGxhY2Uob3MuaG9tZWRpcigpLCAnficpO1xuICB9KS5qb2luKCcsICcpO1xuXG4gIGNvbnN0IGxvY2FsRXhhbXBsZXMgPSBydW50aW1lcy5tYXAociA9PiBgLi8ke2dldERpck5hbWUocil9YCkuam9pbignLCAnKTtcblxuICBjb25zb2xlLmxvZyhgICAke3llbGxvd31XaGVyZSB3b3VsZCB5b3UgbGlrZSB0byBpbnN0YWxsPyR7cmVzZXR9XFxuXFxuICAke2N5YW59MSR7cmVzZXR9KSBHbG9iYWwgJHtkaW19KCR7cGF0aEV4YW1wbGVzfSkke3Jlc2V0fSAtIGF2YWlsYWJsZSBpbiBhbGwgcHJvamVjdHNcbiAgJHtjeWFufTIke3Jlc2V0fSkgTG9jYWwgICR7ZGltfSgke2xvY2FsRXhhbXBsZXN9KSR7cmVzZXR9IC0gdGhpcyBwcm9qZWN0IG9ubHlcbmApO1xuXG4gIHJsLnF1ZXN0aW9uKGAgIENob2ljZSAke2RpbX1bMV0ke3Jlc2V0fTogYCwgKGFuc3dlcikgPT4ge1xuICAgIGFuc3dlcmVkID0gdHJ1ZTtcbiAgICBybC5jbG9zZSgpO1xuICAgIGNvbnN0IGNob2ljZSA9IGFuc3dlci50cmltKCkgfHwgJzEnO1xuICAgIGNvbnN0IGlzR2xvYmFsID0gY2hvaWNlICE9PSAnMic7XG4gICAgaW5zdGFsbEFsbFJ1bnRpbWVzKHJ1bnRpbWVzLCBpc0dsb2JhbCwgdHJ1ZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEluc3RhbGwgRVpfQWdlbnRzIGZvciBhbGwgc2VsZWN0ZWQgcnVudGltZXNcbiAqL1xuZnVuY3Rpb24gaW5zdGFsbEFsbFJ1bnRpbWVzKHJ1bnRpbWVzOiBzdHJpbmdbXSwgaXNHbG9iYWw6IGJvb2xlYW4sIGlzSW50ZXJhY3RpdmU6IGJvb2xlYW4pIHtcbiAgY29uc3QgcmVzdWx0czogQXJyYXk8eyBzZXR0aW5nc1BhdGg6IHN0cmluZyB8IG51bGw7IHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7IHN0YXR1c2xpbmVDb21tYW5kOiBzdHJpbmcgfCBudWxsOyBydW50aW1lOiBzdHJpbmcgfT4gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJ1bnRpbWUgb2YgcnVudGltZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBpbnN0YWxsKGlzR2xvYmFsLCBydW50aW1lKTtcbiAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1c2xpbmVSdW50aW1lcyA9IFsnY2xhdWRlJywgJ2dlbWluaSddO1xuICBjb25zdCBzdGF0dXNsaW5lUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKHIgPT4gc3RhdHVzbGluZVJ1bnRpbWVzLmluY2x1ZGVzKHIucnVudGltZSkpO1xuXG4gIC8vIEhhbmRsZSBzdGF0dXNsaW5lIHBlci1ydW50aW1lIHRvIGF2b2lkIGNvbmZsaWN0c1xuICAvLyBFYWNoIHJ1bnRpbWUgd2l0aCBzZXR0aW5ncy5qc29uIGdldHMgaXRzIG93biBzdGF0dXNsaW5lIHByb21wdFxuICBjb25zdCBmaW5hbGl6ZVBlclJ1bnRpbWUgPSAocnVudGltZVJlc3VsdDogeyBzZXR0aW5nc1BhdGg6IHN0cmluZyB8IG51bGw7IHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7IHN0YXR1c2xpbmVDb21tYW5kOiBzdHJpbmcgfCBudWxsOyBydW50aW1lOiBzdHJpbmcgfSwgc2hvdWxkSW5zdGFsbFN0YXR1c2xpbmU6IGJvb2xlYW4pID0+IHtcbiAgICBjb25zdCB1c2VTdGF0dXNsaW5lID0gc3RhdHVzbGluZVJ1bnRpbWVzLmluY2x1ZGVzKHJ1bnRpbWVSZXN1bHQucnVudGltZSkgJiYgc2hvdWxkSW5zdGFsbFN0YXR1c2xpbmU7XG4gICAgZmluaXNoSW5zdGFsbChcbiAgICAgIHJ1bnRpbWVSZXN1bHQuc2V0dGluZ3NQYXRoLFxuICAgICAgcnVudGltZVJlc3VsdC5zZXR0aW5ncyxcbiAgICAgIHJ1bnRpbWVSZXN1bHQuc3RhdHVzbGluZUNvbW1hbmQsXG4gICAgICB1c2VTdGF0dXNsaW5lLFxuICAgICAgcnVudGltZVJlc3VsdC5ydW50aW1lLFxuICAgICAgaXNHbG9iYWxcbiAgICApO1xuICB9O1xuXG4gIGlmIChzdGF0dXNsaW5lUmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBObyBydW50aW1lcyBzdXBwb3J0IHN0YXR1c2xpbmUgLSBmaW5hbGl6ZSBhbGwgd2l0aG91dCBzdGF0dXNsaW5lXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgZmluYWxpemVQZXJSdW50aW1lKHJlc3VsdCwgZmFsc2UpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChzdGF0dXNsaW5lUmVzdWx0cy5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBTaW5nbGUgcnVudGltZSB3aXRoIHN0YXR1c2xpbmUgc3VwcG9ydCAtIHByb21wdCBvbmNlXG4gICAgY29uc3Qgc2luZ2xlUmVzdWx0ID0gc3RhdHVzbGluZVJlc3VsdHNbMF07XG4gICAgaWYgKHNpbmdsZVJlc3VsdCkge1xuICAgICAgaGFuZGxlU3RhdHVzbGluZShzaW5nbGVSZXN1bHQuc2V0dGluZ3MsIGlzSW50ZXJhY3RpdmUsIChzaG91bGRJbnN0YWxsKSA9PiB7XG4gICAgICAgIGZpbmFsaXplUGVyUnVudGltZShzaW5nbGVSZXN1bHQsIHNob3VsZEluc3RhbGwpO1xuICAgICAgICAvLyBGaW5hbGl6ZSBvdGhlciBydW50aW1lcyB3aXRob3V0IHN0YXR1c2xpbmVcbiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgIGlmICghc3RhdHVzbGluZVJ1bnRpbWVzLmluY2x1ZGVzKHJlc3VsdC5ydW50aW1lKSkge1xuICAgICAgICAgICAgZmluYWxpemVQZXJSdW50aW1lKHJlc3VsdCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE11bHRpcGxlIHJ1bnRpbWVzIHdpdGggc3RhdHVzbGluZSBzdXBwb3J0IC0gcHJvbXB0IGZvciBlYWNoXG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XG4gICAgY29uc3Qgc3RhdHVzbGluZUNob2ljZXMgPSBuZXcgQXJyYXkoc3RhdHVzbGluZVJlc3VsdHMubGVuZ3RoKS5maWxsKGZhbHNlKTtcblxuICAgIGNvbnN0IHByb21wdE5leHRTdGF0dXNsaW5lID0gKCkgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSBzdGF0dXNsaW5lUmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgLy8gQWxsIHN0YXR1c2xpbmUgcHJvbXB0cyBkb25lIC0gZmluYWxpemUgYWxsIHJ1bnRpbWVzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbaV07XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IHN0YXR1c2xpbmVJbmRleCA9IHN0YXR1c2xpbmVSZXN1bHRzLmZpbmRJbmRleChyID0+IHIucnVudGltZSA9PT0gcmVzdWx0LnJ1bnRpbWUpO1xuICAgICAgICAgIGNvbnN0IHNob3VsZEluc3RhbGwgPSBzdGF0dXNsaW5lSW5kZXggIT09IC0xID8gc3RhdHVzbGluZUNob2ljZXNbc3RhdHVzbGluZUluZGV4XSA6IGZhbHNlO1xuICAgICAgICAgIGZpbmFsaXplUGVyUnVudGltZShyZXN1bHQsIHNob3VsZEluc3RhbGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudFJlc3VsdCA9IHN0YXR1c2xpbmVSZXN1bHRzW2N1cnJlbnRJbmRleF07XG4gICAgICBpZiAoY3VycmVudFJlc3VsdCkge1xuICAgICAgICBjb25zdCBjdXJyZW50UnVudGltZUluZGV4ID0gY3VycmVudEluZGV4O1xuICAgICAgICBoYW5kbGVTdGF0dXNsaW5lKGN1cnJlbnRSZXN1bHQuc2V0dGluZ3MsIGlzSW50ZXJhY3RpdmUsIChzaG91bGRJbnN0YWxsKSA9PiB7XG4gICAgICAgICAgc3RhdHVzbGluZUNob2ljZXNbY3VycmVudFJ1bnRpbWVJbmRleF0gPSBzaG91bGRJbnN0YWxsO1xuICAgICAgICAgIGN1cnJlbnRJbmRleCsrO1xuICAgICAgICAgIHByb21wdE5leHRTdGF0dXNsaW5lKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwcm9tcHROZXh0U3RhdHVzbGluZSgpO1xuICB9XG59XG5cbi8vIFRlc3Qtb25seSBleHBvcnRzIFx1MjAxNCBza2lwIG1haW4gbG9naWMgd2hlbiBsb2FkZWQgYXMgYSBtb2R1bGUgZm9yIHRlc3RpbmdcbmNvbnN0IHRlc3RFeHBvcnRzID0ge1xuICAgIGdldENvZGV4U2tpbGxBZGFwdGVySGVhZGVyLFxuICAgIGNvbnZlcnRDbGF1ZGVUb0dlbWluaUFnZW50LFxuICAgIGNvbnZlcnRDbGF1ZGVBZ2VudFRvQ29kZXhBZ2VudCxcbiAgICBnZW5lcmF0ZUNvZGV4QWdlbnRUb21sLFxuICAgIGdlbmVyYXRlQ29kZXhDb25maWdCbG9jayxcbiAgICBzdHJpcEV6QWdlbnRzRnJvbUNvZGV4Q29uZmlnLFxuICAgIG1lcmdlQ29kZXhDb25maWcsXG4gICAgaW5zdGFsbENvZGV4Q29uZmlnLFxuICAgIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db2RleFNraWxsLFxuICAgIEVaX0NPREVYX01BUktFUixcbiAgICBDT0RFWF9BR0VOVF9TQU5EQk9YLFxuICAgIGdldERpck5hbWUsXG4gICAgZ2V0R2xvYmFsRGlyLFxuICAgIGdldENvbmZpZ0RpckZyb21Ib21lLFxuICAgIGNsYXVkZVRvQ29waWxvdFRvb2xzLFxuICAgIGNvbnZlcnRDb3BpbG90VG9vbE5hbWUsXG4gICAgY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQsXG4gICAgY29udmVydENsYXVkZUNvbW1hbmRUb0NvcGlsb3RTa2lsbCxcbiAgICBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvcGlsb3RBZ2VudCxcbiAgICBjb3B5Q29tbWFuZHNBc0NvcGlsb3RTa2lsbHMsXG4gICAgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfTUFSS0VSLFxuICAgIEVaX0NPUElMT1RfSU5TVFJVQ1RJT05TX0NMT1NFX01BUktFUixcbiAgICBtZXJnZUNvcGlsb3RJbnN0cnVjdGlvbnMsXG4gICAgc3RyaXBFekFnZW50c0Zyb21Db3BpbG90SW5zdHJ1Y3Rpb25zLFxuICAgIHdyaXRlTWFuaWZlc3QsXG4gICAgcmVwb3J0TG9jYWxQYXRjaGVzLFxuICAgIGNvbnZlcnRDbGF1ZGVUb1F3ZW5Ta2lsbCxcbiAgICBjb252ZXJ0Q2xhdWRlVG9Rd2VuQWdlbnQsXG4gICAgY29udmVydENsYXVkZVRvS2ltaVNraWxsLFxuICAgIGNvbnZlcnRDbGF1ZGVUb0tpbWlBZ2VudCxcbiAgfTtcblxuLy8gTWFpbiBsb2dpY1xuaWYgKGhhc0dsb2JhbCAmJiBoYXNMb2NhbCkge1xuICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fUNhbm5vdCBzcGVjaWZ5IGJvdGggLS1nbG9iYWwgYW5kIC0tbG9jYWwke3Jlc2V0fWApO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59IGVsc2UgaWYgKGV4cGxpY2l0Q29uZmlnRGlyICYmIGhhc0xvY2FsKSB7XG4gIGNvbnNvbGUuZXJyb3IoYCAgJHt5ZWxsb3d9Q2Fubm90IHVzZSAtLWNvbmZpZy1kaXIgd2l0aCAtLWxvY2FsJHtyZXNldH1gKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSBlbHNlIGlmIChoYXNVbmluc3RhbGwpIHtcbiAgaWYgKCFoYXNHbG9iYWwgJiYgIWhhc0xvY2FsKSB7XG4gICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd30tLXVuaW5zdGFsbCByZXF1aXJlcyAtLWdsb2JhbCBvciAtLWxvY2FsJHtyZXNldH1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgY29uc3QgcnVudGltZXMgPSBzZWxlY3RlZFJ1bnRpbWVzLmxlbmd0aCA+IDAgPyBzZWxlY3RlZFJ1bnRpbWVzIDogWydjbGF1ZGUnXTtcbiAgZm9yIChjb25zdCBydW50aW1lIG9mIHJ1bnRpbWVzKSB7XG4gICAgdW5pbnN0YWxsKGhhc0dsb2JhbCwgcnVudGltZSk7XG4gIH1cbn0gZWxzZSBpZiAoc2VsZWN0ZWRSdW50aW1lcy5sZW5ndGggPiAwKSB7XG4gIGlmICghaGFzR2xvYmFsICYmICFoYXNMb2NhbCkge1xuICAgIHByb21wdExvY2F0aW9uKHNlbGVjdGVkUnVudGltZXMpO1xuICB9IGVsc2Uge1xuICAgIGluc3RhbGxBbGxSdW50aW1lcyhzZWxlY3RlZFJ1bnRpbWVzLCBoYXNHbG9iYWwsIGZhbHNlKTtcbiAgfVxufSBlbHNlIGlmIChoYXNHbG9iYWwgfHwgaGFzTG9jYWwpIHtcbiAgLy8gRGVmYXVsdCB0byBDbGF1ZGUgaWYgbm8gcnVudGltZSBzcGVjaWZpZWQgYnV0IGxvY2F0aW9uIGlzXG4gIGluc3RhbGxBbGxSdW50aW1lcyhbJ2NsYXVkZSddLCBoYXNHbG9iYWwsIGZhbHNlKTtcbn0gZWxzZSB7XG4gIC8vIEludGVyYWN0aXZlXG4gIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIGNvbnNvbGUubG9nKGAgICR7eWVsbG93fU5vbi1pbnRlcmFjdGl2ZSB0ZXJtaW5hbCBkZXRlY3RlZCwgZGVmYXVsdGluZyB0byBDbGF1ZGUgQ29kZSBnbG9iYWwgaW5zdGFsbCR7cmVzZXR9XFxuYCk7XG4gICAgaW5zdGFsbEFsbFJ1bnRpbWVzKFsnY2xhdWRlJ10sIHRydWUsIGZhbHNlKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9tcHRSdW50aW1lKChydW50aW1lcykgPT4ge1xuICAgICAgcHJvbXB0TG9jYXRpb24ocnVudGltZXMpO1xuICAgIH0pO1xuICB9XG59XG5cbi8vIEV4cG9ydCBmb3IgdGVzdGluZ1xuZXhwb3J0IHsgdGVzdEV4cG9ydHMgfTtcbiIsICJ7XG4gIFwibmFtZVwiOiBcIkBob3dsaWwvZXotYWdlbnRzXCIsXG4gIFwidmVyc2lvblwiOiBcIjUuMC41XCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJFWiBBZ2VudHMgXHUyMDE0IE1ldGEtcHJvbXB0aW5nIHdpdGggbXVsdGktbW9kZWwgc3VwcG9ydCAoUXdlbiwgS2ltaSwgT3BlbkFJKVwiLFxuICBcInR5cGVcIjogXCJtb2R1bGVcIixcbiAgXCJzaWRlRWZmZWN0c1wiOiBmYWxzZSxcbiAgXCJiaW5cIjoge1xuICAgIFwiZXotYWdlbnRzXCI6IFwiZGlzdC9iaW4vaW5zdGFsbC5qc1wiLFxuICAgIFwiZXotYWdlbnRzLXVwZGF0ZVwiOiBcImRpc3QvYmluL3VwZGF0ZS5qc1wiXG4gIH0sXG4gIFwiZXhwb3J0c1wiOiB7XG4gICAgXCIuXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2ZhY3Rvcmllc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9mYWN0b3JpZXMvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbGliL2ZhY3Rvcmllcy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vc3RyYXRlZ2llc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9zdHJhdGVnaWVzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9zdHJhdGVnaWVzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9hZGFwdGVyc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9hZGFwdGVycy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvYWRhcHRlcnMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL29ic2VydmVyXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL29ic2VydmVyL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9vYnNlcnZlci9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vZGVjb3JhdG9yc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9kZWNvcmF0b3JzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9kZWNvcmF0b3JzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9mYWNhZGVzXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL2ZhY2FkZXMvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbGliL2ZhY2FkZXMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2NvbW1hbmRzXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL2NvbW1hbmRzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9jb21tYW5kcy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vc2VydmljZXNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvc2VydmljZXMvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbGliL3NlcnZpY2VzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9yZXBvc2l0b3JpZXNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvcmVwb3NpdG9yaWVzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9yZXBvc2l0b3JpZXMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2ZwXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL2ZwL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9mcC9pbmRleC5qc1wiXG4gICAgfVxuICB9LFxuICBcIm1haW5cIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9pbmRleC5kLnRzXCIsXG4gIFwiZmlsZXNcIjogW1xuICAgIFwiZGlzdFwiLFxuICAgIFwiY29tbWFuZHNcIixcbiAgICBcImV6LWFnZW50c1wiLFxuICAgIFwiYWdlbnRzXCIsXG4gICAgXCJza2lsbHNcIixcbiAgICBcImhvb2tzL2Rpc3RcIixcbiAgICBcInNjcmlwdHNcIlxuICBdLFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcImNsYXVkZVwiLFxuICAgIFwiY2xhdWRlLWNvZGVcIixcbiAgICBcImFpXCIsXG4gICAgXCJtZXRhLXByb21wdGluZ1wiLFxuICAgIFwiY29udGV4dC1lbmdpbmVlcmluZ1wiLFxuICAgIFwic3BlYy1kcml2ZW4tZGV2ZWxvcG1lbnRcIixcbiAgICBcImdlbWluaVwiLFxuICAgIFwiZ2VtaW5pLWNsaVwiLFxuICAgIFwiY29kZXhcIixcbiAgICBcImNvZGV4LWNsaVwiLFxuICAgIFwiZXotYWdlbnRzXCIsXG4gICAgXCJhZ2VudC1vcmNoZXN0cmF0aW9uXCJcbiAgXSxcbiAgXCJhdXRob3JcIjogXCJUXHUwMEMyQ0hFU1wiLFxuICBcImxpY2Vuc2VcIjogXCJNSVRcIixcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vaG93bGlsL2V6LWFnZW50cy5naXRcIlxuICB9LFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2hvd2xpbC9lei1hZ2VudHNcIixcbiAgXCJidWdzXCI6IHtcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ob3dsaWwvZXotYWdlbnRzL2lzc3Vlc1wiXG4gIH0sXG4gIFwiZW5naW5lc1wiOiB7XG4gICAgXCJub2RlXCI6IFwiPj0xNi43LjBcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAdHlwZXMvbWljcm9tYXRjaFwiOiBcIjQuMC4wXCIsXG4gICAgXCJAdHlwZXMvbm9kZVwiOiBcIjIwLjAuMFwiLFxuICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW5cIjogXCI4LjU3LjJcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9wYXJzZXJcIjogXCI4LjU3LjJcIixcbiAgICBcImM4XCI6IFwiMTEuMC4wXCIsXG4gICAgXCJjb21wbGV4aXR5LXJlcG9ydFwiOiBcIjIuMC4wLWFscGhhXCIsXG4gICAgXCJkZXBlbmRlbmN5LWNydWlzZXJcIjogXCIxNy4zLjlcIixcbiAgICBcImVzbGludFwiOiBcIjguNTcuMFwiLFxuICAgIFwiZXNsaW50LXBsdWdpbi1jb21wbGV4aXR5XCI6IFwiMS4wLjJcIixcbiAgICBcImVzbGludC1wbHVnaW4tc29uYXJqc1wiOiBcIjQuMC4yXCIsXG4gICAgXCJlc2xpbnQtcGx1Z2luLXRzZG9jXCI6IFwiMC41LjJcIixcbiAgICBcImV4cGVjdC10eXBlXCI6IFwiMS4zLjBcIixcbiAgICBcImZhc3QtY2hlY2tcIjogXCIzLjAuMFwiLFxuICAgIFwiZ2xvYlwiOiBcIjEzLjAuNlwiLFxuICAgIFwiaHVza3lcIjogXCI5LjEuN1wiLFxuICAgIFwianMteWFtbFwiOiBcIjQuMS4xXCIsXG4gICAgXCJqc2NwZFwiOiBcIjQuMC44XCIsXG4gICAgXCJqc2RvY1wiOiBcIjQuMC4yXCIsXG4gICAgXCJrNlwiOiBcIjAuMC4wXCIsXG4gICAgXCJsaW50LXN0YWdlZFwiOiBcIjE1LjUuMlwiLFxuICAgIFwibWFkZ2VcIjogXCI4LjAuMFwiLFxuICAgIFwibWFya2Rvd25saW50XCI6IFwiMC40MC4wXCIsXG4gICAgXCJ0cy1tb3JwaFwiOiBcIjI3LjAuMlwiLFxuICAgIFwidHMtbm9kZVwiOiBcIjEwLjkuMFwiLFxuICAgIFwidHMtcHJ1bmVcIjogXCIwLjEwLjNcIixcbiAgICBcInRzdXBcIjogXCI4LjAuMFwiLFxuICAgIFwidHlwZWRvY1wiOiBcIjAuMjguMThcIixcbiAgICBcInR5cGVkb2MtcGx1Z2luLW1pc3NpbmctZXhwb3J0c1wiOiBcIjQuMS4yXCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiNS40LjVcIixcbiAgICBcInZpdGVzdFwiOiBcIjQuMS4wXCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcImJ1aWxkXCI6IFwidHN1cFwiLFxuICAgIFwiYnVpbGQ6d2F0Y2hcIjogXCJ0c3VwIC0td2F0Y2hcIixcbiAgICBcInR5cGVjaGVja1wiOiBcInRzYyAtLW5vRW1pdFwiLFxuICAgIFwidHlwZWNoZWNrOnN0cmljdFwiOiBcInRzYyAtLW5vRW1pdCAtLXN0cmljdFwiLFxuICAgIFwiZGV2XCI6IFwidHN4IGJpbi9pbnN0YWxsLnRzXCIsXG4gICAgXCJsaW50XCI6IFwiZXNsaW50IC4gLS1leHQgLnRzIC0tbWF4LXdhcm5pbmdzPTBcIixcbiAgICBcImxpbnQ6Zml4XCI6IFwiZXNsaW50IC4gLS1leHQgLnRzIC0tZml4XCIsXG4gICAgXCJidWlsZDpob29rc1wiOiBcIm5vZGUgZGlzdC9zY3JpcHRzL2J1aWxkLWhvb2tzLmpzXCIsXG4gICAgXCJwcmVwdWJsaXNoT25seVwiOiBcIm5wbSBydW4gYnVpbGQgJiYgbnBtIHJ1biBidWlsZDpob29rc1wiLFxuICAgIFwidGVzdFwiOiBcInRzeCBzY3JpcHRzL3J1bi10ZXN0cy50c1wiLFxuICAgIFwidGVzdDpjb3ZlcmFnZVwiOiBcImM4IC0tY2hlY2stY292ZXJhZ2UgLS1saW5lcyA3MCAtLXJlcG9ydGVyIHRleHQgLS1pbmNsdWRlICdiaW4vbGliLyoqLyoudHMnIC0tZXhjbHVkZSAndGVzdHMvKionIC0tYWxsIHRzeCBzY3JpcHRzL3J1bi10ZXN0cy50c1wiLFxuICAgIFwidGVzdDphMTF5XCI6IFwibm9kZSB0ZXN0cy9hY2Nlc3NpYmlsaXR5L3J1bi1hMTF5LXRlc3RzLmNqc1wiLFxuICAgIFwidGVzdDpxd2VuOmNvZGVcIjogXCJzaCB0ZXN0cy9zdGFnaW5nL3F3ZW4tY29kZS1iYXR0bGUtZnVsbC5zaFwiLFxuICAgIFwidGVzdDpxd2VuOmNvZGU6c2ltcGxlXCI6IFwic2ggdGVzdHMvc3RhZ2luZy9xd2VuLWNvZGUtc2ltcGxlLXRlc3Quc2hcIixcbiAgICBcInRlc3Q6cXdlbjpjb2RlOmVkZ2VcIjogXCJzaCB0ZXN0cy9zdGFnaW5nL3F3ZW4tY29kZS1lZGdlLWNhc2VzLnNoXCIsXG4gICAgXCJ0ZXN0OmRvY2tlcjpxd2VuOmNvZGVcIjogXCJkb2NrZXItY29tcG9zZSAtZiBkb2NrZXItY29tcG9zZS5zdGFnaW5nLnltbCB1cCAtLWJ1aWxkIGV6LWFnZW50cy1xd2VuLWNvZGUtYmF0dGxlXCIsXG4gICAgXCJ0ZXN0OmRvY2tlcjpxd2VuOmVkZ2VcIjogXCJkb2NrZXItY29tcG9zZSAtZiBkb2NrZXItY29tcG9zZS5zdGFnaW5nLnltbCB1cCAtLWJ1aWxkIGV6LWFnZW50cy1xd2VuLWNvZGUtZWRnZS1jYXNlc1wiLFxuICAgIFwidGVzdDpkb2NrZXI6YWxsXCI6IFwiZG9ja2VyLWNvbXBvc2UgLWYgZG9ja2VyLWNvbXBvc2Uuc3RhZ2luZy55bWwgdXAgLS1idWlsZCAtLWFib3J0LW9uLWNvbnRhaW5lci1leGl0XCIsXG4gICAgXCJpbnN0YWxsOnByb2R1Y3Rpb25cIjogXCJub2RlIC0tbG9hZGVyIHRzLW5vZGUvZXNtIHNjcmlwdHMvaW5zdGFsbC1wcm9kdWN0aW9uLnRzXCIsXG4gICAgXCJpbnN0YWxsOnByb2R1Y3Rpb246bGF0ZXN0XCI6IFwibm9kZSAtLWxvYWRlciB0cy1ub2RlL2VzbSBzY3JpcHRzL2luc3RhbGwtcHJvZHVjdGlvbi50cyBsYXRlc3RcIixcbiAgICBcImluc3RhbGw6cHJvZHVjdGlvbjp2NFwiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy9pbnN0YWxsLXByb2R1Y3Rpb24udHMgNC4wLjBcIixcbiAgICBcInZhbGlkYXRlOnRva2VuXCI6IFwibm9kZSAtLWxvYWRlciB0cy1ub2RlL2VzbSBzY3JpcHRzL3ZhbGlkYXRlLXRva2VuLnRzXCIsXG4gICAgXCJzZWN1cml0eTpzY2FuXCI6IFwibnBtIGF1ZGl0IC0tYXVkaXQtbGV2ZWw9bW9kZXJhdGVcIixcbiAgICBcImRvY3M6Z2VuZXJhdGVcIjogXCJqc2RvYyAtYyBqc2RvYy5qc29uIC1yIGJpbi8gZXotYWdlbnRzL2Jpbi9saWIvXCIsXG4gICAgXCJkb2NzOmFwaVwiOiBcInR5cGVkb2NcIixcbiAgICBcImFuYWx5emU6ZHVwbGljYXRlc1wiOiBcImpzY3BkIC0tY29uZmlnIC5qc2NwZC5qc29uXCIsXG4gICAgXCJjaGVjazpkdXBsaWNhdGVzXCI6IFwianNjcGQgLS1jb25maWcgLmpzY3BkLmpzb25cIixcbiAgICBcImNoZWNrOmNvbXBsZXhpdHlcIjogXCJub2RlIC0tbG9hZGVyIHRzLW5vZGUvZXNtIHNjcmlwdHMvY2hlY2stY29tcGxleGl0eS50c1wiLFxuICAgIFwiY2hlY2s6dHNkb2NcIjogXCJub2RlIC0tbG9hZGVyIHRzLW5vZGUvZXNtIHNjcmlwdHMvY2hlY2stdHNkb2MtY292ZXJhZ2UudHNcIixcbiAgICBcInRlc3Q6cGFja2FnZVwiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy90ZXN0LXBhY2thZ2UtZG9ja2VyLnRzXCIsXG4gICAgXCJjaGVjazpjb3VwbGluZ1wiOiBcIm1hZGdlIC0tY2lyY3VsYXIgYmluL2xpYi9cIixcbiAgICBcImNoZWNrOmFic3RyYWN0aW9uc1wiOiBcInRzLXBydW5lXCIsXG4gICAgXCJjaGVjazphbGwtbWV0cmljc1wiOiBcIm5wbSBydW4gbGludCAmJiBucG0gcnVuIGNoZWNrOmR1cGxpY2F0ZXMgJiYgbnBtIHJ1biBjaGVjazpjb3VwbGluZ1wiLFxuICAgIFwicHJlcGFyZVwiOiBcImh1c2t5XCIsXG4gICAgXCJnYXRlczpsb2NhbFwiOiBcIm5vZGUgZXotYWdlbnRzL2Jpbi9saWIvZ2F0ZS1leGVjdXRvci5janMgLS1jaSAtLWNhY2hlXCIsXG4gICAgXCJnYXRlczpzdGF0dXNcIjogXCJub2RlIGV6LWFnZW50cy9iaW4vbGliL2dhdGUtZXhlY3V0b3IuY2pzIC0tc3RhdHVzXCIsXG4gICAgXCJnYXRlczpzdGF0c1wiOiBcIm5vZGUgZXotYWdlbnRzL2Jpbi9saWIvZ2F0ZS1leGVjdXRvci5janMgLS1zdGF0c1wiLFxuICAgIFwiZGVwczphdWRpdFwiOiBcInRzeCBiaW4vZGVwZW5kZW5jeS1hdWRpdC50c1wiLFxuICAgIFwiZGVwczphdWRpdDpqc29uXCI6IFwidHN4IGJpbi9kZXBlbmRlbmN5LWF1ZGl0LnRzIC0tanNvblwiLFxuICAgIFwiZGVwczpjaGVja1wiOiBcInRzeCBiaW4vZGVwZW5kZW5jeS1hdWRpdC50cyAtLXF1aWV0XCJcbiAgfSxcbiAgXCJsaW50LXN0YWdlZFwiOiB7XG4gICAgXCIqLnRzXCI6IFtcbiAgICAgIFwibm9kZSAtLXRlc3RcIlxuICAgIF0sXG4gICAgXCIqLm1kXCI6IFtcbiAgICAgIFwidHN4IHNjcmlwdHMvcnVuLXRlc3RzLnRzXCJcbiAgICBdXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIm1pY3JvbWF0Y2hcIjogXCI0LjAuNVwiLFxuICAgIFwidGlrdG9rZW5cIjogXCIxLjAuMjJcIixcbiAgICBcInpvZFwiOiBcIjQuMy42XCJcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7O0FBRUEsWUFBWSxRQUFRO0FBQ3BCLFlBQVksVUFBVTtBQUN0QixZQUFZLFFBQVE7QUFDcEIsWUFBWSxjQUFjO0FBQzFCLFlBQVksWUFBWTtBQUN4QixTQUFTLHFCQUFxQjs7O0FDUDlCO0FBQUEsRUFDRSxNQUFRO0FBQUEsRUFDUixTQUFXO0FBQUEsRUFDWCxhQUFlO0FBQUEsRUFDZixNQUFRO0FBQUEsRUFDUixhQUFlO0FBQUEsRUFDZixLQUFPO0FBQUEsSUFDTCxhQUFhO0FBQUEsSUFDYixvQkFBb0I7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsU0FBVztBQUFBLElBQ1QsS0FBSztBQUFBLE1BQ0gsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLElBQ1o7QUFBQSxJQUNBLGVBQWU7QUFBQSxNQUNiLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxJQUNaO0FBQUEsSUFDQSxnQkFBZ0I7QUFBQSxNQUNkLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxJQUNaO0FBQUEsSUFDQSxjQUFjO0FBQUEsTUFDWixPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsSUFDWjtBQUFBLElBQ0EsY0FBYztBQUFBLE1BQ1osT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLElBQ1o7QUFBQSxJQUNBLGdCQUFnQjtBQUFBLE1BQ2QsT0FB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O0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUdGLElBQUksYUFBYSxVQUFVO0FBQ3pCLFVBQVEsTUFBTSxLQUFLLE1BQU0sMkNBQTJDLEtBQUssRUFBRTtBQUMzRSxVQUFRLEtBQUssQ0FBQztBQUNoQixXQUFXLHFCQUFxQixVQUFVO0FBQ3hDLFVBQVEsTUFBTSxLQUFLLE1BQU0sdUNBQXVDLEtBQUssRUFBRTtBQUN2RSxVQUFRLEtBQUssQ0FBQztBQUNoQixXQUFXLGNBQWM7QUFDdkIsTUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVO0FBQzNCLFlBQVEsTUFBTSxLQUFLLE1BQU0sMkNBQTJDLEtBQUssRUFBRTtBQUMzRSxZQUFRLEtBQUssQ0FBQztBQUFBLEVBQ2hCO0FBQ0EsUUFBTSxXQUFXLGlCQUFpQixTQUFTLElBQUksbUJBQW1CLENBQUMsUUFBUTtBQUMzRSxhQUFXLFdBQVcsVUFBVTtBQUM5QixjQUFVLFdBQVcsT0FBTztBQUFBLEVBQzlCO0FBQ0YsV0FBVyxpQkFBaUIsU0FBUyxHQUFHO0FBQ3RDLE1BQUksQ0FBQyxhQUFhLENBQUMsVUFBVTtBQUMzQixtQkFBZSxnQkFBZ0I7QUFBQSxFQUNqQyxPQUFPO0FBQ0wsdUJBQW1CLGtCQUFrQixXQUFXLEtBQUs7QUFBQSxFQUN2RDtBQUNGLFdBQVcsYUFBYSxVQUFVO0FBRWhDLHFCQUFtQixDQUFDLFFBQVEsR0FBRyxXQUFXLEtBQUs7QUFDakQsT0FBTztBQUVMLE1BQUksQ0FBQyxRQUFRLE1BQU0sT0FBTztBQUN4QixZQUFRLElBQUksS0FBSyxNQUFNLDhFQUE4RSxLQUFLO0FBQUEsQ0FBSTtBQUM5Ryx1QkFBbUIsQ0FBQyxRQUFRLEdBQUcsTUFBTSxLQUFLO0FBQUEsRUFDNUMsT0FBTztBQUNMLGtCQUFjLENBQUMsYUFBYTtBQUMxQixxQkFBZSxRQUFRO0FBQUEsSUFDekIsQ0FBQztBQUFBLEVBQ0g7QUFDRjsiLAogICJuYW1lcyI6IFsicnVudGltZUxhYmVsIiwgImhvb2tzU3JjIiwgImhvb2tzRGVzdCIsICJzY2FuRm9yTGVha2VkUGF0aHMiXQp9Cg==