appium-webdriveragent 4.12.0 → 4.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -254,4 +254,4 @@ async function getPIDsListeningOnPort(port, filteringFunc = null) {
254
254
  return await filteringFunc(stdout);
255
255
  });
256
256
  }
257
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQUk9KRUNUX0ZJTEUiLCJnZXRNb2R1bGVSb290IiwiXyIsIm1lbW9pemUiLCJjdXJyZW50RGlyIiwicGF0aCIsImRpcm5hbWUiLCJyZXNvbHZlIiwiX19maWxlbmFtZSIsImlzQXRGc1Jvb3QiLCJtYW5pZmVzdFBhdGgiLCJqb2luIiwiX2ZzIiwiZXhpc3RzU3luYyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsIm5hbWUiLCJpZ24iLCJsZW5ndGgiLCJFcnJvciIsIkJPT1RTVFJBUF9QQVRIIiwiZ2V0UElEc1VzaW5nUGF0dGVybiIsInBhdHRlcm4iLCJhcmdzIiwic3Rkb3V0IiwiZXhlYyIsInNwbGl0IiwibWFwIiwieCIsInBhcnNlSW50IiwiZmlsdGVyIiwiaXNJbnRlZ2VyIiwiZXJyIiwibG9nIiwiZGVidWciLCJjb2RlIiwia2lsbEFwcFVzaW5nUGF0dGVybiIsInBncmVwUGF0dGVybiIsInNpZ25hbHMiLCJzaWduYWwiLCJtYXRjaGVkUGlkcyIsImlzRW1wdHkiLCJtZXNzYWdlIiwibGFzdCIsIndhaXRGb3JDb25kaXRpb24iLCJwaWRDaGVja1Byb21pc2VzIiwicGlkIiwidGhlbiIsImNhdGNoIiwiQiIsImFsbCIsImV2ZXJ5Iiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImlzVHZPUyIsInBsYXRmb3JtTmFtZSIsInRvTG93ZXIiLCJQTEFURk9STV9OQU1FX1RWT1MiLCJyZXBsYWNlSW5GaWxlIiwiZmlsZSIsImZpbmQiLCJyZXBsYWNlIiwiY29udGVudHMiLCJmcyIsInJlYWRGaWxlIiwibmV3Q29udGVudHMiLCJ3cml0ZUZpbGUiLCJ1cGRhdGVQcm9qZWN0RmlsZSIsImFnZW50UGF0aCIsIm5ld0J1bmRsZUlkIiwicHJvamVjdEZpbGVQYXRoIiwiY29weUZpbGUiLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJXREFfUlVOTkVSX0JVTkRMRV9JRCIsIndhcm4iLCJyZXNldFByb2plY3RGaWxlIiwiZXhpc3RzIiwibXYiLCJzZXRSZWFsRGV2aWNlU2VjdXJpdHkiLCJrZXljaGFpblBhdGgiLCJrZXljaGFpblBhc3N3b3JkIiwiZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUiLCJvcmdJZCIsInNpZ25pbmdJZCIsInhjY29uZmlnUGF0aCIsInRlbXBEaXIiLCJzZXRYY3Rlc3RydW5GaWxlIiwiZGV2aWNlSW5mbyIsInNka1ZlcnNpb24iLCJib290c3RyYXBQYXRoIiwid2RhUmVtb3RlUG9ydCIsInhjdGVzdHJ1bkZpbGVQYXRoIiwiZ2V0WGN0ZXN0cnVuRmlsZVBhdGgiLCJ4Y3Rlc3RSdW5Db250ZW50IiwicGxpc3QiLCJwYXJzZVBsaXN0RmlsZSIsInVwZGF0ZVdEQVBvcnQiLCJnZXRBZGRpdGlvbmFsUnVuQ29udGVudCIsIm5ld1hjdGVzdFJ1bkNvbnRlbnQiLCJtZXJnZSIsInVwZGF0ZVBsaXN0RmlsZSIsInJ1bm5lciIsIkVudmlyb25tZW50VmFyaWFibGVzIiwiVVNFX1BPUlQiLCJzZGtCYXNlZCIsInVkaWQiLCJwbGF0Zm9ybUJhc2VkIiwicGxhdGZvcm1WZXJzaW9uIiwiZmlsZVBhdGgiLCJ2ZXJzaW9uIiwiaW5mbyIsIm9yaWdpbmFsWGN0ZXN0cnVuRmlsZSIsImdldFhjdGVzdHJ1bkZpbGVOYW1lIiwiZXJyb3JBbmRUaHJvdyIsImlzUmVhbERldmljZSIsImtpbGxQcm9jZXNzIiwicHJvYyIsImlzUnVubmluZyIsInN0b3AiLCJpbmNsdWRlcyIsInJhbmRvbUludCIsImxvdyIsImhpZ2giLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJnZXRXREFVcGdyYWRlVGltZXN0YW1wIiwicGFja2FnZU1hbmlmZXN0IiwibXRpbWUiLCJzdGF0IiwiZ2V0VGltZSIsInJlc2V0VGVzdFByb2Nlc3NlcyIsImlzU2ltdWxhdG9yIiwicHJvY2Vzc1BhdHRlcm5zIiwicHVzaCIsImdldFBJRHNMaXN0ZW5pbmdPblBvcnQiLCJwb3J0IiwiZmlsdGVyaW5nRnVuYyIsInJlc3VsdCIsInRyaW0iLCJlIiwic3RkZXJyIiwiaXNGdW5jdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcywgdGVtcERpciwgcGxpc3QgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFdEQV9SVU5ORVJfQlVORExFX0lELCBQTEFURk9STV9OQU1FX1RWT1MgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgX2ZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5cbmNvbnN0IFBST0pFQ1RfRklMRSA9ICdwcm9qZWN0LnBieHByb2onO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHBhdGggdG8gdGhlIGN1cnJlbnQgbW9kdWxlJ3Mgcm9vdCBmb2xkZXJcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIG1vZHVsZSByb290XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGN1cnJlbnQgbW9kdWxlIHJvb3QgZm9sZGVyIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbmNvbnN0IGdldE1vZHVsZVJvb3QgPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0TW9kdWxlUm9vdCAoKSB7XG4gIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKHBhdGgucmVzb2x2ZShfX2ZpbGVuYW1lKSk7XG4gIGxldCBpc0F0RnNSb290ID0gZmFsc2U7XG4gIHdoaWxlICghaXNBdEZzUm9vdCkge1xuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChfZnMuZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpICYmXG4gICAgICAgICAgSlNPTi5wYXJzZShfZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkubmFtZSA9PT0gJ2FwcGl1bS13ZWJkcml2ZXJhZ2VudCcpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgaXNBdEZzUm9vdCA9IGN1cnJlbnREaXIubGVuZ3RoIDw9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKS5sZW5ndGg7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlIGFwcGl1bS13ZWJkcml2ZXJhZ2VudCBOb2RlLmpzIG1vZHVsZScpO1xufSk7XG5cbmV4cG9ydCBjb25zdCBCT09UU1RSQVBfUEFUSCA9IGdldE1vZHVsZVJvb3QoKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0UElEc1VzaW5nUGF0dGVybiAocGF0dGVybikge1xuICBjb25zdCBhcmdzID0gW1xuICAgICctaWYnLCAvLyBjYXNlIGluc2Vuc2l0aXZlLCBmdWxsIGNtZGxpbmUgbWF0Y2hcbiAgICBwYXR0ZXJuLFxuICBdO1xuICB0cnkge1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygncGdyZXAnLCBhcmdzKTtcbiAgICByZXR1cm4gc3Rkb3V0LnNwbGl0KC9cXHMrLylcbiAgICAgIC5tYXAoKHgpID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgIC5maWx0ZXIoXy5pc0ludGVnZXIpXG4gICAgICAubWFwKCh4KSA9PiBgJHt4fWApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZGVidWcoYCdwZ3JlcCAke2FyZ3Muam9pbignICcpfScgZGlkbid0IGRldGVjdCBhbnkgbWF0Y2hpbmcgcHJvY2Vzc2VzLiBSZXR1cm4gY29kZTogJHtlcnIuY29kZX1gKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbEFwcFVzaW5nUGF0dGVybiAocGdyZXBQYXR0ZXJuKSB7XG4gIGNvbnN0IHNpZ25hbHMgPSBbMiwgMTUsIDldO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaWduYWxzKSB7XG4gICAgY29uc3QgbWF0Y2hlZFBpZHMgPSBhd2FpdCBnZXRQSURzVXNpbmdQYXR0ZXJuKHBncmVwUGF0dGVybik7XG4gICAgaWYgKF8uaXNFbXB0eShtYXRjaGVkUGlkcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYXJncyA9IFtgLSR7c2lnbmFsfWAsIC4uLm1hdGNoZWRQaWRzXTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYygna2lsbCcsIGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmRlYnVnKGBraWxsICR7YXJncy5qb2luKCcgJyl9IC0+ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGlmIChzaWduYWwgPT09IF8ubGFzdChzaWduYWxzKSkge1xuICAgICAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byB3YWl0IGFmdGVyIFNJR0tJTExcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwaWRDaGVja1Byb21pc2VzID0gbWF0Y2hlZFBpZHNcbiAgICAgICAgICAubWFwKChwaWQpID0+IGV4ZWMoJ2tpbGwnLCBbJy0wJywgcGlkXSlcbiAgICAgICAgICAgIC8vIHRoZSBwcm9jZXNzIGlzIHN0aWxsIGFsaXZlXG4gICAgICAgICAgICAudGhlbigoKSA9PiBmYWxzZSlcbiAgICAgICAgICAgIC8vIHRoZSBwcm9jZXNzIGlzIGRlYWRcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB0cnVlKVxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgQi5hbGwocGlkQ2hlY2tQcm9taXNlcykpXG4gICAgICAgICAgLmV2ZXJ5KCh4KSA9PiB4ID09PSB0cnVlKTtcbiAgICAgIH0sIHtcbiAgICAgICAgd2FpdE1zOiAxMDAwLFxuICAgICAgICBpbnRlcnZhbE1zOiAxMDAsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIC8vIHRyeSB0aGUgbmV4dCBzaWduYWxcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm1OYW1lIGlzIHR2T1NcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGF0Zm9ybU5hbWUgVGhlIG5hbWUgb2YgdGhlIHBsYXRvcm1cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm1OYW1lIGlzIHR2T1NcbiAqL1xuZnVuY3Rpb24gaXNUdk9TIChwbGF0Zm9ybU5hbWUpIHtcbiAgcmV0dXJuIF8udG9Mb3dlcihwbGF0Zm9ybU5hbWUpID09PSBfLnRvTG93ZXIoUExBVEZPUk1fTkFNRV9UVk9TKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVwbGFjZUluRmlsZSAoZmlsZSwgZmluZCwgcmVwbGFjZSkge1xuICBsZXQgY29udGVudHMgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlLCAndXRmOCcpO1xuXG4gIGxldCBuZXdDb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2UoZmluZCwgcmVwbGFjZSk7XG4gIGlmIChuZXdDb250ZW50cyAhPT0gY29udGVudHMpIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZSwgbmV3Q29udGVudHMsICd1dGY4Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGUgV2ViRHJpdmVyQWdlbnRSdW5uZXIgcHJvamVjdCBidW5kbGUgSUQgd2l0aCBuZXdCdW5kbGVJZC5cbiAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgcHJvamVjdCBmaWxlIGlzIGluIHRoZSBjb3JyZWN0IHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFnZW50UGF0aCAtIFBhdGggdG8gdGhlIC54Y29kZXByb2ogZGlyZWN0b3J5LlxuICogQHBhcmFtIHtzdHJpbmd9IG5ld0J1bmRsZUlkIHRoZSBuZXcgYnVuZGxlIElEIHVzZWQgdG8gdXBkYXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcm9qZWN0RmlsZSAoYWdlbnRQYXRoLCBuZXdCdW5kbGVJZCkge1xuICBsZXQgcHJvamVjdEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGFnZW50UGF0aCwgUFJPSkVDVF9GSUxFKTtcbiAgdHJ5IHtcbiAgICAvLyBBc3N1bWluZyBwcm9qZWN0RmlsZVBhdGggaXMgaW4gdGhlIGNvcnJlY3Qgc3RhdGUsIGNyZWF0ZSAub2xkIGZyb20gcHJvamVjdEZpbGVQYXRoXG4gICAgYXdhaXQgZnMuY29weUZpbGUocHJvamVjdEZpbGVQYXRoLCBgJHtwcm9qZWN0RmlsZVBhdGh9Lm9sZGApO1xuICAgIGF3YWl0IHJlcGxhY2VJbkZpbGUocHJvamVjdEZpbGVQYXRoLCBuZXcgUmVnRXhwKF8uZXNjYXBlUmVnRXhwKFdEQV9SVU5ORVJfQlVORExFX0lEKSwgJ2cnKSwgbmV3QnVuZGxlSWQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgbG9nLmRlYnVnKGBTdWNjZXNzZnVsbHkgdXBkYXRlZCAnJHtwcm9qZWN0RmlsZVBhdGh9JyB3aXRoIGJ1bmRsZSBpZCAnJHtuZXdCdW5kbGVJZH0nYCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5kZWJ1ZyhgRXJyb3IgdXBkYXRpbmcgcHJvamVjdCBmaWxlOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGxvZy53YXJuKGBVbmFibGUgdG8gdXBkYXRlIHByb2plY3QgZmlsZSAnJHtwcm9qZWN0RmlsZVBhdGh9JyB3aXRoIGAgK1xuICAgICAgYGJ1bmRsZSBpZCAnJHtuZXdCdW5kbGVJZH0nLiBXZWJEcml2ZXJBZ2VudCBtYXkgbm90IHN0YXJ0YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldCBXZWJEcml2ZXJBZ2VudFJ1bm5lciBwcm9qZWN0IGJ1bmRsZSBJRCB0byBjb3JyZWN0IHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFnZW50UGF0aCAtIFBhdGggdG8gdGhlIC54Y29kZXByb2ogZGlyZWN0b3J5LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNldFByb2plY3RGaWxlIChhZ2VudFBhdGgpIHtcbiAgY29uc3QgcHJvamVjdEZpbGVQYXRoID0gcGF0aC5qb2luKGFnZW50UGF0aCwgUFJPSkVDVF9GSUxFKTtcbiAgdHJ5IHtcbiAgICAvLyByZXN0b3JlIHByb2plY3RGaWxlUGF0aCBmcm9tIC5vbGQgZmlsZVxuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKGAke3Byb2plY3RGaWxlUGF0aH0ub2xkYCkpIHtcbiAgICAgIHJldHVybjsgLy8gbm8gbmVlZCB0byByZXNldFxuICAgIH1cbiAgICBhd2FpdCBmcy5tdihgJHtwcm9qZWN0RmlsZVBhdGh9Lm9sZGAsIHByb2plY3RGaWxlUGF0aCk7XG4gICAgbG9nLmRlYnVnKGBTdWNjZXNzZnVsbHkgcmVzZXQgJyR7cHJvamVjdEZpbGVQYXRofScgd2l0aCBidW5kbGUgaWQgJyR7V0RBX1JVTk5FUl9CVU5ETEVfSUR9J2ApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZGVidWcoYEVycm9yIHJlc2V0dGluZyBwcm9qZWN0IGZpbGU6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgbG9nLndhcm4oYFVuYWJsZSB0byByZXNldCBwcm9qZWN0IGZpbGUgJyR7cHJvamVjdEZpbGVQYXRofScgd2l0aCBgICtcbiAgICAgIGBidW5kbGUgaWQgJyR7V0RBX1JVTk5FUl9CVU5ETEVfSUR9Jy4gV2ViRHJpdmVyQWdlbnQgaGFzIGJlZW4gYCArXG4gICAgICBgbW9kaWZpZWQgYW5kIG5vdCByZXR1cm5lZCB0byB0aGUgb3JpZ2luYWwgc3RhdGUuYCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0UmVhbERldmljZVNlY3VyaXR5IChrZXljaGFpblBhdGgsIGtleWNoYWluUGFzc3dvcmQpIHtcbiAgbG9nLmRlYnVnKCdTZXR0aW5nIHNlY3VyaXR5IGZvciBpT1MgZGV2aWNlJyk7XG4gIGF3YWl0IGV4ZWMoJ3NlY3VyaXR5JywgWyctdicsICdsaXN0LWtleWNoYWlucycsICctcycsIGtleWNoYWluUGF0aF0pO1xuICBhd2FpdCBleGVjKCdzZWN1cml0eScsIFsnLXYnLCAndW5sb2NrLWtleWNoYWluJywgJy1wJywga2V5Y2hhaW5QYXNzd29yZCwga2V5Y2hhaW5QYXRoXSk7XG4gIGF3YWl0IGV4ZWMoJ3NlY3VyaXR5JywgWydzZXQta2V5Y2hhaW4tc2V0dGluZ3MnLCAnLXQnLCAnMzYwMCcsICctbCcsIGtleWNoYWluUGF0aF0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVhjb2RlQ29uZmlnRmlsZSAob3JnSWQsIHNpZ25pbmdJZCkge1xuICBsb2cuZGVidWcoYEdlbmVyYXRpbmcgeGNvZGUgY29uZmlnIGZpbGUgZm9yIG9yZ0lkICcke29yZ0lkfScgYW5kIHNpZ25pbmdJZCBgICtcbiAgICAgICAgICAgIGAnJHtzaWduaW5nSWR9J2ApO1xuICBjb25zdCBjb250ZW50cyA9IGBERVZFTE9QTUVOVF9URUFNID0gJHtvcmdJZH1cbkNPREVfU0lHTl9JREVOVElUWSA9ICR7c2lnbmluZ0lkfVxuYDtcbiAgY29uc3QgeGNjb25maWdQYXRoID0gYXdhaXQgdGVtcERpci5wYXRoKCdhcHBpdW0tdGVtcC54Y2NvbmZpZycpO1xuICBsb2cuZGVidWcoYFdyaXRpbmcgeGNvZGUgY29uZmlnIGZpbGUgdG8gJHt4Y2NvbmZpZ1BhdGh9YCk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZSh4Y2NvbmZpZ1BhdGgsIGNvbnRlbnRzLCAndXRmOCcpO1xuICByZXR1cm4geGNjb25maWdQYXRoO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogQHR5cGVkZWYge09iamVjdH0gRGV2aWNlSW5mb1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGlzUmVhbERldmljZSAtIEVxdWFscyB0byB0cnVlIGlmIHRoZSBjdXJyZW50IGRldmljZSBpcyBhIHJlYWwgZGV2aWNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdWRpZCAtIFRoZSBkZXZpY2UgVURJRC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbGF0Zm9ybVZlcnNpb24gLSBUaGUgcGxhdGZvcm0gdmVyc2lvbiBvZiBPUy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbGF0Zm9ybU5hbWUgLSBUaGUgcGxhdGZvcm0gbmFtZSBvZiBpT1MsIHR2T1NcbiovXG4vKipcbiAqIENyZWF0ZXMgeGN0ZXN0cnVuIGZpbGUgcGVyIGRldmljZSAmIHBsYXRmb3JtIHZlcnNpb24uXG4gKiBXZSBleHBlY3RzIHRvIGhhdmUgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lb3Mke3Nka1ZlcnNpb258cGxhdGZvcm1WZXJzaW9ufS1hcm02NC54Y3Rlc3RydW4gZm9yIHJlYWwgZGV2aWNlXG4gKiBhbmQgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lc2ltdWxhdG9yJHtzZGtWZXJzaW9ufHBsYXRmb3JtVmVyc2lvbn0teDg2XzY0LnhjdGVzdHJ1biBmb3Igc2ltdWxhdG9yIGxvY2F0ZWQgQGJvb3RzdHJhcFBhdGhcbiAqIE5ld2VyIFhjb2RlIChYY29kZSAxMC4wIGF0IGxlYXN0KSBnZW5lcmF0ZSB4Y3Rlc3RydW4gZmlsZSBmb2xsb3dpbmcgc2RrVmVyc2lvbi5cbiAqIGUuZy4gWGNvZGUgd2hpY2ggaGFzIGlPUyBTREsgVmVyc2lvbiAxMi4yIGdlbmVyYXRlIFdlYkRyaXZlckFnZW50UnVubmVyX2lwaG9uZXNpbXVsYXRvci4yLXg4Nl82NC54Y3Rlc3RydW5cbiAqICAgICAgZXZlbiBpZiB0aGUgY2FwIGhhcyBwbGF0Zm9ybSB2ZXJzaW9uIDExLjRcbiAqXG4gKiBAcGFyYW0ge0RldmljZUluZm99IGRldmljZUluZm9cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZGtWZXJzaW9uIC0gVGhlIFhjb2RlIFNESyB2ZXJzaW9uIG9mIE9TLlxuICogQHBhcmFtIHtzdHJpbmd9IGJvb3RzdHJhcFBhdGggLSBUaGUgZm9sZGVyIHBhdGggY29udGFpbmluZyB4Y3Rlc3RydW4gZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB3ZGFSZW1vdGVQb3J0IC0gVGhlIHJlbW90ZSBwb3J0IFdEQSBpcyBsaXN0ZW5pbmcgb24uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHJldHVybnMgeGN0ZXN0cnVuRmlsZVBhdGggZm9yIGdpdmVuIGRldmljZVxuICogQHRocm93cyBpZiBXZWJEcml2ZXJBZ2VudFJ1bm5lcl9pcGhvbmVvcyR7c2RrVmVyc2lvbnxwbGF0Zm9ybVZlcnNpb259LWFybTY0LnhjdGVzdHJ1biBmb3IgcmVhbCBkZXZpY2VcbiAqIG9yIFdlYkRyaXZlckFnZW50UnVubmVyX2lwaG9uZXNpbXVsYXRvciR7c2RrVmVyc2lvbnxwbGF0Zm9ybVZlcnNpb259LXg4Nl82NC54Y3Rlc3RydW4gZm9yIHNpbXVsYXRvciBpcyBub3QgZm91bmQgQGJvb3RzdHJhcFBhdGgsXG4gKiB0aGVuIGl0IHdpbGwgdGhyb3cgZmlsZSBub3QgZm91bmQgZXhjZXB0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNldFhjdGVzdHJ1bkZpbGUgKGRldmljZUluZm8sIHNka1ZlcnNpb24sIGJvb3RzdHJhcFBhdGgsIHdkYVJlbW90ZVBvcnQpIHtcbiAgY29uc3QgeGN0ZXN0cnVuRmlsZVBhdGggPSBhd2FpdCBnZXRYY3Rlc3RydW5GaWxlUGF0aChkZXZpY2VJbmZvLCBzZGtWZXJzaW9uLCBib290c3RyYXBQYXRoKTtcbiAgY29uc3QgeGN0ZXN0UnVuQ29udGVudCA9IGF3YWl0IHBsaXN0LnBhcnNlUGxpc3RGaWxlKHhjdGVzdHJ1bkZpbGVQYXRoKTtcbiAgY29uc3QgdXBkYXRlV0RBUG9ydCA9IGdldEFkZGl0aW9uYWxSdW5Db250ZW50KGRldmljZUluZm8ucGxhdGZvcm1OYW1lLCB3ZGFSZW1vdGVQb3J0KTtcbiAgY29uc3QgbmV3WGN0ZXN0UnVuQ29udGVudCA9IF8ubWVyZ2UoeGN0ZXN0UnVuQ29udGVudCwgdXBkYXRlV0RBUG9ydCk7XG4gIGF3YWl0IHBsaXN0LnVwZGF0ZVBsaXN0RmlsZSh4Y3Rlc3RydW5GaWxlUGF0aCwgbmV3WGN0ZXN0UnVuQ29udGVudCwgdHJ1ZSk7XG5cbiAgcmV0dXJuIHhjdGVzdHJ1bkZpbGVQYXRoO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgV0RBIG9iamVjdCB3aGljaCBhcHBlbmRzIGV4aXN0aW5nIHhjdGVzdCBydW5uZXIgY29udGVudFxuICogQHBhcmFtIHtzdHJpbmd9IHBsYXRmb3JtTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwbGF0Zm9ybVxuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBUaGUgWGNvZGUgU0RLIHZlcnNpb24gb2YgT1MuXG4gKiBAcmV0dXJuIHtvYmplY3R9IHJldHVybnMgYSBydW5uZXIgb2JqZWN0IHdoaWNoIGhhcyBVU0VfUE9SVFxuICovXG5mdW5jdGlvbiBnZXRBZGRpdGlvbmFsUnVuQ29udGVudCAocGxhdGZvcm1OYW1lLCB3ZGFSZW1vdGVQb3J0KSB7XG4gIGNvbnN0IHJ1bm5lciA9IGBXZWJEcml2ZXJBZ2VudFJ1bm5lciR7aXNUdk9TKHBsYXRmb3JtTmFtZSkgPyAnX3R2T1MnIDogJyd9YDtcblxuICByZXR1cm4ge1xuICAgIFtydW5uZXJdOiB7XG4gICAgICBFbnZpcm9ubWVudFZhcmlhYmxlczoge1xuICAgICAgICAvLyBVU0VfUE9SVCBtdXN0IGJlICdzdHJpbmcnXG4gICAgICAgIFVTRV9QT1JUOiBgJHt3ZGFSZW1vdGVQb3J0fWBcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwYXRoIG9mIHhjdGVzdHJ1biBpZiBpdCBleGlzdHNcbiAqIEBwYXJhbSB7RGV2aWNlSW5mb30gZGV2aWNlSW5mb1xuICogQHBhcmFtIHtzdHJpbmd9IHNka1ZlcnNpb24gLSBUaGUgWGNvZGUgU0RLIHZlcnNpb24gb2YgT1MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYm9vdHN0cmFwUGF0aCAtIFRoZSBmb2xkZXIgcGF0aCBjb250YWluaW5nIHhjdGVzdHJ1biBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRYY3Rlc3RydW5GaWxlUGF0aCAoZGV2aWNlSW5mbywgc2RrVmVyc2lvbiwgYm9vdHN0cmFwUGF0aCkge1xuICAvLyBGaXJzdCB0cnkgdGhlIFNESyBwYXRoLCBmb3IgWGNvZGUgMTAgKGF0IGxlYXN0KVxuICBjb25zdCBzZGtCYXNlZCA9IFtcbiAgICBwYXRoLnJlc29sdmUoYm9vdHN0cmFwUGF0aCwgYCR7ZGV2aWNlSW5mby51ZGlkfV8ke3Nka1ZlcnNpb259LnhjdGVzdHJ1bmApLFxuICAgIHNka1ZlcnNpb24sXG4gIF07XG4gIC8vIE5leHQgdHJ5IFBsYXRmb3JtIHBhdGgsIGZvciBlYXJsaWVyIFhjb2RlIHZlcnNpb25zXG4gIGNvbnN0IHBsYXRmb3JtQmFzZWQgPSBbXG4gICAgcGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGAke2RldmljZUluZm8udWRpZH1fJHtkZXZpY2VJbmZvLnBsYXRmb3JtVmVyc2lvbn0ueGN0ZXN0cnVuYCksXG4gICAgZGV2aWNlSW5mby5wbGF0Zm9ybVZlcnNpb24sXG4gIF07XG5cbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIHZlcnNpb25dIG9mIFtzZGtCYXNlZCwgcGxhdGZvcm1CYXNlZF0pIHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgbG9nLmluZm8oYFVzaW5nICcke2ZpbGVQYXRofScgYXMgeGN0ZXN0cnVuIGZpbGVgKTtcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWxYY3Rlc3RydW5GaWxlID0gcGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGdldFhjdGVzdHJ1bkZpbGVOYW1lKGRldmljZUluZm8sIHZlcnNpb24pKTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKG9yaWdpbmFsWGN0ZXN0cnVuRmlsZSkpIHtcbiAgICAgIC8vIElmIHRoaXMgaXMgZmlyc3QgdGltZSBydW4gZm9yIGdpdmVuIGRldmljZSwgdGhlbiBmaXJzdCBnZW5lcmF0ZSB4Y3Rlc3RydW4gZmlsZSBmb3IgZGV2aWNlLlxuICAgICAgLy8gV2UgbmVlZCB0byBoYXZlIGEgeGN0ZXN0cnVuIGZpbGUgKipwZXIgZGV2aWNlKiogYmVjYXVzZSB3ZSBjYW50IG5vdCBoYXZlIHNhbWUgd2RhIHBvcnQgZm9yIGFsbCBkZXZpY2VzLlxuICAgICAgYXdhaXQgZnMuY29weUZpbGUob3JpZ2luYWxYY3Rlc3RydW5GaWxlLCBmaWxlUGF0aCk7XG4gICAgICBsb2cuaW5mbyhgVXNpbmcgJyR7ZmlsZVBhdGh9JyBhcyB4Y3Rlc3RydW4gZmlsZSBjb3BpZWQgYnkgJyR7b3JpZ2luYWxYY3Rlc3RydW5GaWxlfSdgKTtcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICB9XG4gIH1cblxuICBsb2cuZXJyb3JBbmRUaHJvdyhgSWYgeW91IGFyZSB1c2luZyAndXNlWGN0ZXN0cnVuRmlsZScgY2FwYWJpbGl0eSB0aGVuIHlvdSBgICtcbiAgICBgbmVlZCB0byBoYXZlIGEgeGN0ZXN0cnVuIGZpbGUgKGV4cGVjdGVkOiBgICtcbiAgICBgJyR7cGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGdldFhjdGVzdHJ1bkZpbGVOYW1lKGRldmljZUluZm8sIHNka1ZlcnNpb24pKX0nKWApO1xufVxuXG5cbi8qKlxuICogUmV0dXJuIHRoZSBuYW1lIG9mIHhjdGVzdHJ1biBmaWxlXG4gKiBAcGFyYW0ge0RldmljZUluZm99IGRldmljZUluZm9cbiAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gVGhlIFhjb2RlIFNESyB2ZXJzaW9uIG9mIE9TLlxuICogQHJldHVybiB7c3RyaW5nfSByZXR1cm5zIHhjdGVzdHJ1bkZpbGVQYXRoIGZvciBnaXZlbiBkZXZpY2VcbiAqL1xuZnVuY3Rpb24gZ2V0WGN0ZXN0cnVuRmlsZU5hbWUgKGRldmljZUluZm8sIHZlcnNpb24pIHtcbiAgcmV0dXJuIGlzVHZPUyhkZXZpY2VJbmZvLnBsYXRmb3JtTmFtZSlcbiAgICA/IGBXZWJEcml2ZXJBZ2VudFJ1bm5lcl90dk9TX2FwcGxldHYke2RldmljZUluZm8uaXNSZWFsRGV2aWNlID8gYG9zJHt2ZXJzaW9ufS1hcm02NGAgOiBgc2ltdWxhdG9yJHt2ZXJzaW9ufS14ODZfNjRgfS54Y3Rlc3RydW5gXG4gICAgOiBgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lJHtkZXZpY2VJbmZvLmlzUmVhbERldmljZSA/IGBvcyR7dmVyc2lvbn0tYXJtNjRgIDogYHNpbXVsYXRvciR7dmVyc2lvbn0teDg2XzY0YH0ueGN0ZXN0cnVuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3MgKG5hbWUsIHByb2MpIHtcbiAgaWYgKCFwcm9jIHx8ICFwcm9jLmlzUnVubmluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5pbmZvKGBTaHV0dGluZyBkb3duICcke25hbWV9JyBwcm9jZXNzIChwaWQgJyR7cHJvYy5wcm9jLnBpZH0nKWApO1xuXG4gIGxvZy5pbmZvKGBTZW5kaW5nICdTSUdURVJNJy4uLmApO1xuICB0cnkge1xuICAgIGF3YWl0IHByb2Muc3RvcCgnU0lHVEVSTScsIDEwMDApO1xuICAgIHJldHVybjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCFlcnIubWVzc2FnZS5pbmNsdWRlcyhgUHJvY2VzcyBkaWRuJ3QgZW5kIGFmdGVyYCkpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGAke25hbWV9IHByb2Nlc3MgZGlkIG5vdCBlbmQgaW4gYSB0aW1lbHkgZmFzaGlvbjogJyR7ZXJyLm1lc3NhZ2V9Jy5gKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBTZW5kaW5nICdTSUdLSUxMJy4uLmApO1xuICB0cnkge1xuICAgIGF3YWl0IHByb2Muc3RvcCgnU0lHS0lMTCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ25vdCBjdXJyZW50bHkgcnVubmluZycpKSB7XG4gICAgICAvLyB0aGUgcHJvY2VzcyBlbmRlZCBidXQgZm9yIHNvbWUgcmVhc29uIHdlIHdlcmUgbm90IGluZm9ybWVkXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgcmFuZG9tIGludGVnZXIuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIG51bWJlciBpbiByYW5nZSBbbG93LCBoaWdodCkuIGBsb3dgYCBpcyBpbmNsdXNpdmUgYW5kIGBoaWdoYCBpcyBleGNsdXNpdmUuXG4gKi9cbmZ1bmN0aW9uIHJhbmRvbUludCAobG93LCBoaWdoKSB7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaGlnaCAtIGxvdykgKyBsb3cpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBXREEgdXBncmFkZSB0aW1lc3RhbXBcbiAqXG4gKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgVU5JWCB0aW1lc3RhbXAgb2YgdGhlIHBhY2thZ2UgbWFuaWZlc3QuIFRoZSBtYW5pZmVzdCBvbmx5IGdldHMgbW9kaWZpZWQgb25cbiAqIHBhY2thZ2UgdXBncmFkZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCAoKSB7XG4gIGNvbnN0IHBhY2thZ2VNYW5pZmVzdCA9IHBhdGgucmVzb2x2ZShnZXRNb2R1bGVSb290KCksICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocGFja2FnZU1hbmlmZXN0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHttdGltZX0gPSBhd2FpdCBmcy5zdGF0KHBhY2thZ2VNYW5pZmVzdCk7XG4gIHJldHVybiBtdGltZS5nZXRUaW1lKCk7XG59XG5cbi8qKlxuICogS2lsbHMgcnVubmluZyBYQ1Rlc3QgcHJvY2Vzc2VzIGZvciB0aGUgcGFydGljdWxhciBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVkaWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzU2ltdWxhdG9yIC0gRXF1YWxzIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIGEgU2ltdWxhdG9yXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc2V0VGVzdFByb2Nlc3NlcyAodWRpZCwgaXNTaW11bGF0b3IpIHtcbiAgY29uc3QgcHJvY2Vzc1BhdHRlcm5zID0gW2B4Y29kZWJ1aWxkLioke3VkaWR9YF07XG4gIGlmIChpc1NpbXVsYXRvcikge1xuICAgIHByb2Nlc3NQYXR0ZXJucy5wdXNoKGAke3VkaWR9LipYQ1RSdW5uZXJgKTtcbiAgICAvLyBUaGUgcGF0dGVybiB0byBmaW5kIGluIGNhc2UgaWRiIHdhcyB1c2VkXG4gICAgcHJvY2Vzc1BhdHRlcm5zLnB1c2goYHhjdGVzdC4qJHt1ZGlkfWApO1xuICB9XG4gIGxvZy5kZWJ1ZyhgS2lsbGluZyBydW5uaW5nIHByb2Nlc3NlcyAnJHtwcm9jZXNzUGF0dGVybnMuam9pbignLCAnKX0nIGZvciB0aGUgZGV2aWNlICR7dWRpZH0uLi5gKTtcbiAgYXdhaXQgQi5hbGwocHJvY2Vzc1BhdHRlcm5zLm1hcChraWxsQXBwVXNpbmdQYXR0ZXJuKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBJRHMgb2YgcHJvY2Vzc2VzIGxpc3RlbmluZyBvbiB0aGUgcGFydGljdWxhciBzeXN0ZW0gcG9ydC5cbiAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gYXBwbHkgYWRkaXRpb25hbCBmaWx0ZXJpbmcgYmFzZWQgb24gdGhlXG4gKiBwcm9jZXNzIGNvbW1hbmQgbGluZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBvcnQgLSBUaGUgcG9ydCBudW1iZXIuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZmlsdGVyaW5nRnVuYyAtIE9wdGlvbmFsIGxhbWJkYSBmdW5jdGlvbiwgd2hpY2hcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXMgY29tbWFuZCBsaW5lIHN0cmluZyBvZiB0aGUgcGFydGljdWxhciBwcm9jZXNzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmluZyBvbiBnaXZlbiBwb3J0LCBhbmQgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpdGhlciB0cnVlIG9yIGZhbHNlIHRvIGluY2x1ZGUvZXhjbHVkZSB0aGUgY29ycmVzcG9uZGluZyBQSURcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgcmVzdWx0aW5nIGFycmF5LlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IC0gdGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIGlkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UElEc0xpc3RlbmluZ09uUG9ydCAocG9ydCwgZmlsdGVyaW5nRnVuYyA9IG51bGwpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIHRyeSB7XG4gICAgLy8gVGhpcyBvbmx5IHdvcmtzIHNpbmNlIE1hYyBPUyBYIEVsIENhcGl0YW5cbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ2xzb2YnLCBbJy10aScsIGB0Y3A6JHtwb3J0fWBdKTtcbiAgICByZXN1bHQucHVzaCguLi4oc3Rkb3V0LnRyaW0oKS5zcGxpdCgvXFxuKy8pKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZS5jb2RlICE9PSAxKSB7XG4gICAgICAvLyBjb2RlIDEgbWVhbnMgbm8gcHJvY2Vzc2VzLiBPdGhlciBlcnJvcnMgbmVlZCByZXBvcnRpbmdcbiAgICAgIGxvZy5kZWJ1ZyhgRXJyb3IgZ2V0dGluZyBwcm9jZXNzZXMgbGlzdGVuaW5nIG9uIHBvcnQgJyR7cG9ydH0nOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghXy5pc0Z1bmN0aW9uKGZpbHRlcmluZ0Z1bmMpKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICByZXR1cm4gYXdhaXQgQi5maWx0ZXIocmVzdWx0LCBhc3luYyAocGlkKSA9PiB7XG4gICAgbGV0IHN0ZG91dDtcbiAgICB0cnkge1xuICAgICAgKHtzdGRvdXR9ID0gYXdhaXQgZXhlYygncHMnLCBbJy1wJywgcGlkLCAnLW8nLCAnY29tbWFuZCddKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSA9PT0gMSkge1xuICAgICAgICAvLyBUaGUgcHJvY2VzcyBkb2VzIG5vdCBleGlzdCBhbnltb3JlLCB0aGVyZSdzIG5vdGhpbmcgdG8gZmlsdGVyXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmaWx0ZXJpbmdGdW5jKHN0ZG91dCk7XG4gIH0pO1xufVxuXG5leHBvcnQgeyB1cGRhdGVQcm9qZWN0RmlsZSwgcmVzZXRQcm9qZWN0RmlsZSwgc2V0UmVhbERldmljZVNlY3VyaXR5LFxuICBnZXRBZGRpdGlvbmFsUnVuQ29udGVudCwgZ2V0WGN0ZXN0cnVuRmlsZU5hbWUsIGdlbmVyYXRlWGNvZGVDb25maWdGaWxlLFxuICBzZXRYY3Rlc3RydW5GaWxlLCBnZXRYY3Rlc3RydW5GaWxlUGF0aCwga2lsbFByb2Nlc3MsIHJhbmRvbUludCxcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgcmVzZXRUZXN0UHJvY2Vzc2VzLFxuICBnZXRQSURzTGlzdGVuaW5nT25Qb3J0LCBraWxsQXBwVXNpbmdQYXR0ZXJuLCBpc1R2T1Ncbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsWUFBWSxHQUFHLGlCQUFpQjtB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
257
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3VwcG9ydCIsInJlcXVpcmUiLCJfdGVlbl9wcm9jZXNzIiwiX3BhdGgiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2xvZ2dlciIsIl9sb2Rhc2giLCJfY29uc3RhbnRzIiwiX2JsdWViaXJkIiwiX2ZzMiIsIl9hc3luY2JveCIsIlBST0pFQ1RfRklMRSIsImdldE1vZHVsZVJvb3QiLCJfIiwibWVtb2l6ZSIsImN1cnJlbnREaXIiLCJwYXRoIiwiZGlybmFtZSIsInJlc29sdmUiLCJfX2ZpbGVuYW1lIiwiaXNBdEZzUm9vdCIsIm1hbmlmZXN0UGF0aCIsImpvaW4iLCJfZnMiLCJleGlzdHNTeW5jIiwiSlNPTiIsInBhcnNlIiwicmVhZEZpbGVTeW5jIiwibmFtZSIsImlnbiIsImxlbmd0aCIsIkVycm9yIiwiQk9PVFNUUkFQX1BBVEgiLCJleHBvcnRzIiwiZ2V0UElEc1VzaW5nUGF0dGVybiIsInBhdHRlcm4iLCJhcmdzIiwic3Rkb3V0IiwiZXhlYyIsInNwbGl0IiwibWFwIiwieCIsInBhcnNlSW50IiwiZmlsdGVyIiwiaXNJbnRlZ2VyIiwiZXJyIiwibG9nIiwiZGVidWciLCJjb2RlIiwia2lsbEFwcFVzaW5nUGF0dGVybiIsInBncmVwUGF0dGVybiIsInNpZ25hbHMiLCJzaWduYWwiLCJtYXRjaGVkUGlkcyIsImlzRW1wdHkiLCJtZXNzYWdlIiwibGFzdCIsIndhaXRGb3JDb25kaXRpb24iLCJwaWRDaGVja1Byb21pc2VzIiwicGlkIiwidGhlbiIsImNhdGNoIiwiQiIsImFsbCIsImV2ZXJ5Iiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImlzVHZPUyIsInBsYXRmb3JtTmFtZSIsInRvTG93ZXIiLCJQTEFURk9STV9OQU1FX1RWT1MiLCJyZXBsYWNlSW5GaWxlIiwiZmlsZSIsImZpbmQiLCJyZXBsYWNlIiwiY29udGVudHMiLCJmcyIsInJlYWRGaWxlIiwibmV3Q29udGVudHMiLCJ3cml0ZUZpbGUiLCJ1cGRhdGVQcm9qZWN0RmlsZSIsImFnZW50UGF0aCIsIm5ld0J1bmRsZUlkIiwicHJvamVjdEZpbGVQYXRoIiwiY29weUZpbGUiLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJXREFfUlVOTkVSX0JVTkRMRV9JRCIsIndhcm4iLCJyZXNldFByb2plY3RGaWxlIiwiZXhpc3RzIiwibXYiLCJzZXRSZWFsRGV2aWNlU2VjdXJpdHkiLCJrZXljaGFpblBhdGgiLCJrZXljaGFpblBhc3N3b3JkIiwiZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUiLCJvcmdJZCIsInNpZ25pbmdJZCIsInhjY29uZmlnUGF0aCIsInRlbXBEaXIiLCJzZXRYY3Rlc3RydW5GaWxlIiwiZGV2aWNlSW5mbyIsInNka1ZlcnNpb24iLCJib290c3RyYXBQYXRoIiwid2RhUmVtb3RlUG9ydCIsInhjdGVzdHJ1bkZpbGVQYXRoIiwiZ2V0WGN0ZXN0cnVuRmlsZVBhdGgiLCJ4Y3Rlc3RSdW5Db250ZW50IiwicGxpc3QiLCJwYXJzZVBsaXN0RmlsZSIsInVwZGF0ZVdEQVBvcnQiLCJnZXRBZGRpdGlvbmFsUnVuQ29udGVudCIsIm5ld1hjdGVzdFJ1bkNvbnRlbnQiLCJtZXJnZSIsInVwZGF0ZVBsaXN0RmlsZSIsInJ1bm5lciIsIkVudmlyb25tZW50VmFyaWFibGVzIiwiVVNFX1BPUlQiLCJzZGtCYXNlZCIsInVkaWQiLCJwbGF0Zm9ybUJhc2VkIiwicGxhdGZvcm1WZXJzaW9uIiwiZmlsZVBhdGgiLCJ2ZXJzaW9uIiwiaW5mbyIsIm9yaWdpbmFsWGN0ZXN0cnVuRmlsZSIsImdldFhjdGVzdHJ1bkZpbGVOYW1lIiwiZXJyb3JBbmRUaHJvdyIsImlzUmVhbERldmljZSIsImtpbGxQcm9jZXNzIiwicHJvYyIsImlzUnVubmluZyIsInN0b3AiLCJpbmNsdWRlcyIsInJhbmRvbUludCIsImxvdyIsImhpZ2giLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJnZXRXREFVcGdyYWRlVGltZXN0YW1wIiwicGFja2FnZU1hbmlmZXN0IiwibXRpbWUiLCJzdGF0IiwiZ2V0VGltZSIsInJlc2V0VGVzdFByb2Nlc3NlcyIsImlzU2ltdWxhdG9yIiwicHJvY2Vzc1BhdHRlcm5zIiwicHVzaCIsImdldFBJRHNMaXN0ZW5pbmdPblBvcnQiLCJwb3J0IiwiZmlsdGVyaW5nRnVuYyIsInJlc3VsdCIsInRyaW0iLCJlIiwic3RkZXJyIiwiaXNGdW5jdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcywgdGVtcERpciwgcGxpc3QgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFdEQV9SVU5ORVJfQlVORExFX0lELCBQTEFURk9STV9OQU1FX1RWT1MgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgX2ZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5cbmNvbnN0IFBST0pFQ1RfRklMRSA9ICdwcm9qZWN0LnBieHByb2onO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHBhdGggdG8gdGhlIGN1cnJlbnQgbW9kdWxlJ3Mgcm9vdCBmb2xkZXJcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIG1vZHVsZSByb290XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGN1cnJlbnQgbW9kdWxlIHJvb3QgZm9sZGVyIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbmNvbnN0IGdldE1vZHVsZVJvb3QgPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0TW9kdWxlUm9vdCAoKSB7XG4gIGxldCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKHBhdGgucmVzb2x2ZShfX2ZpbGVuYW1lKSk7XG4gIGxldCBpc0F0RnNSb290ID0gZmFsc2U7XG4gIHdoaWxlICghaXNBdEZzUm9vdCkge1xuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChfZnMuZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpICYmXG4gICAgICAgICAgSlNPTi5wYXJzZShfZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkubmFtZSA9PT0gJ2FwcGl1bS13ZWJkcml2ZXJhZ2VudCcpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgaXNBdEZzUm9vdCA9IGN1cnJlbnREaXIubGVuZ3RoIDw9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKS5sZW5ndGg7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlIGFwcGl1bS13ZWJkcml2ZXJhZ2VudCBOb2RlLmpzIG1vZHVsZScpO1xufSk7XG5cbmV4cG9ydCBjb25zdCBCT09UU1RSQVBfUEFUSCA9IGdldE1vZHVsZVJvb3QoKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0UElEc1VzaW5nUGF0dGVybiAocGF0dGVybikge1xuICBjb25zdCBhcmdzID0gW1xuICAgICctaWYnLCAvLyBjYXNlIGluc2Vuc2l0aXZlLCBmdWxsIGNtZGxpbmUgbWF0Y2hcbiAgICBwYXR0ZXJuLFxuICBdO1xuICB0cnkge1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygncGdyZXAnLCBhcmdzKTtcbiAgICByZXR1cm4gc3Rkb3V0LnNwbGl0KC9cXHMrLylcbiAgICAgIC5tYXAoKHgpID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgIC5maWx0ZXIoXy5pc0ludGVnZXIpXG4gICAgICAubWFwKCh4KSA9PiBgJHt4fWApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZGVidWcoYCdwZ3JlcCAke2FyZ3Muam9pbignICcpfScgZGlkbid0IGRldGVjdCBhbnkgbWF0Y2hpbmcgcHJvY2Vzc2VzLiBSZXR1cm4gY29kZTogJHtlcnIuY29kZX1gKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbEFwcFVzaW5nUGF0dGVybiAocGdyZXBQYXR0ZXJuKSB7XG4gIGNvbnN0IHNpZ25hbHMgPSBbMiwgMTUsIDldO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaWduYWxzKSB7XG4gICAgY29uc3QgbWF0Y2hlZFBpZHMgPSBhd2FpdCBnZXRQSURzVXNpbmdQYXR0ZXJuKHBncmVwUGF0dGVybik7XG4gICAgaWYgKF8uaXNFbXB0eShtYXRjaGVkUGlkcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYXJncyA9IFtgLSR7c2lnbmFsfWAsIC4uLm1hdGNoZWRQaWRzXTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYygna2lsbCcsIGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmRlYnVnKGBraWxsICR7YXJncy5qb2luKCcgJyl9IC0+ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGlmIChzaWduYWwgPT09IF8ubGFzdChzaWduYWxzKSkge1xuICAgICAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byB3YWl0IGFmdGVyIFNJR0tJTExcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwaWRDaGVja1Byb21pc2VzID0gbWF0Y2hlZFBpZHNcbiAgICAgICAgICAubWFwKChwaWQpID0+IGV4ZWMoJ2tpbGwnLCBbJy0wJywgcGlkXSlcbiAgICAgICAgICAgIC8vIHRoZSBwcm9jZXNzIGlzIHN0aWxsIGFsaXZlXG4gICAgICAgICAgICAudGhlbigoKSA9PiBmYWxzZSlcbiAgICAgICAgICAgIC8vIHRoZSBwcm9jZXNzIGlzIGRlYWRcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB0cnVlKVxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgQi5hbGwocGlkQ2hlY2tQcm9taXNlcykpXG4gICAgICAgICAgLmV2ZXJ5KCh4KSA9PiB4ID09PSB0cnVlKTtcbiAgICAgIH0sIHtcbiAgICAgICAgd2FpdE1zOiAxMDAwLFxuICAgICAgICBpbnRlcnZhbE1zOiAxMDAsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIC8vIHRyeSB0aGUgbmV4dCBzaWduYWxcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm1OYW1lIGlzIHR2T1NcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGF0Zm9ybU5hbWUgVGhlIG5hbWUgb2YgdGhlIHBsYXRvcm1cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm1OYW1lIGlzIHR2T1NcbiAqL1xuZnVuY3Rpb24gaXNUdk9TIChwbGF0Zm9ybU5hbWUpIHtcbiAgcmV0dXJuIF8udG9Mb3dlcihwbGF0Zm9ybU5hbWUpID09PSBfLnRvTG93ZXIoUExBVEZPUk1fTkFNRV9UVk9TKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVwbGFjZUluRmlsZSAoZmlsZSwgZmluZCwgcmVwbGFjZSkge1xuICBsZXQgY29udGVudHMgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlLCAndXRmOCcpO1xuXG4gIGxldCBuZXdDb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2UoZmluZCwgcmVwbGFjZSk7XG4gIGlmIChuZXdDb250ZW50cyAhPT0gY29udGVudHMpIHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZSwgbmV3Q29udGVudHMsICd1dGY4Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGUgV2ViRHJpdmVyQWdlbnRSdW5uZXIgcHJvamVjdCBidW5kbGUgSUQgd2l0aCBuZXdCdW5kbGVJZC5cbiAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgcHJvamVjdCBmaWxlIGlzIGluIHRoZSBjb3JyZWN0IHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFnZW50UGF0aCAtIFBhdGggdG8gdGhlIC54Y29kZXByb2ogZGlyZWN0b3J5LlxuICogQHBhcmFtIHtzdHJpbmd9IG5ld0J1bmRsZUlkIHRoZSBuZXcgYnVuZGxlIElEIHVzZWQgdG8gdXBkYXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcm9qZWN0RmlsZSAoYWdlbnRQYXRoLCBuZXdCdW5kbGVJZCkge1xuICBsZXQgcHJvamVjdEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGFnZW50UGF0aCwgUFJPSkVDVF9GSUxFKTtcbiAgdHJ5IHtcbiAgICAvLyBBc3N1bWluZyBwcm9qZWN0RmlsZVBhdGggaXMgaW4gdGhlIGNvcnJlY3Qgc3RhdGUsIGNyZWF0ZSAub2xkIGZyb20gcHJvamVjdEZpbGVQYXRoXG4gICAgYXdhaXQgZnMuY29weUZpbGUocHJvamVjdEZpbGVQYXRoLCBgJHtwcm9qZWN0RmlsZVBhdGh9Lm9sZGApO1xuICAgIGF3YWl0IHJlcGxhY2VJbkZpbGUocHJvamVjdEZpbGVQYXRoLCBuZXcgUmVnRXhwKF8uZXNjYXBlUmVnRXhwKFdEQV9SVU5ORVJfQlVORExFX0lEKSwgJ2cnKSwgbmV3QnVuZGxlSWQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgbG9nLmRlYnVnKGBTdWNjZXNzZnVsbHkgdXBkYXRlZCAnJHtwcm9qZWN0RmlsZVBhdGh9JyB3aXRoIGJ1bmRsZSBpZCAnJHtuZXdCdW5kbGVJZH0nYCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5kZWJ1ZyhgRXJyb3IgdXBkYXRpbmcgcHJvamVjdCBmaWxlOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGxvZy53YXJuKGBVbmFibGUgdG8gdXBkYXRlIHByb2plY3QgZmlsZSAnJHtwcm9qZWN0RmlsZVBhdGh9JyB3aXRoIGAgK1xuICAgICAgYGJ1bmRsZSBpZCAnJHtuZXdCdW5kbGVJZH0nLiBXZWJEcml2ZXJBZ2VudCBtYXkgbm90IHN0YXJ0YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldCBXZWJEcml2ZXJBZ2VudFJ1bm5lciBwcm9qZWN0IGJ1bmRsZSBJRCB0byBjb3JyZWN0IHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFnZW50UGF0aCAtIFBhdGggdG8gdGhlIC54Y29kZXByb2ogZGlyZWN0b3J5LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNldFByb2plY3RGaWxlIChhZ2VudFBhdGgpIHtcbiAgY29uc3QgcHJvamVjdEZpbGVQYXRoID0gcGF0aC5qb2luKGFnZW50UGF0aCwgUFJPSkVDVF9GSUxFKTtcbiAgdHJ5IHtcbiAgICAvLyByZXN0b3JlIHByb2plY3RGaWxlUGF0aCBmcm9tIC5vbGQgZmlsZVxuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKGAke3Byb2plY3RGaWxlUGF0aH0ub2xkYCkpIHtcbiAgICAgIHJldHVybjsgLy8gbm8gbmVlZCB0byByZXNldFxuICAgIH1cbiAgICBhd2FpdCBmcy5tdihgJHtwcm9qZWN0RmlsZVBhdGh9Lm9sZGAsIHByb2plY3RGaWxlUGF0aCk7XG4gICAgbG9nLmRlYnVnKGBTdWNjZXNzZnVsbHkgcmVzZXQgJyR7cHJvamVjdEZpbGVQYXRofScgd2l0aCBidW5kbGUgaWQgJyR7V0RBX1JVTk5FUl9CVU5ETEVfSUR9J2ApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZGVidWcoYEVycm9yIHJlc2V0dGluZyBwcm9qZWN0IGZpbGU6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgbG9nLndhcm4oYFVuYWJsZSB0byByZXNldCBwcm9qZWN0IGZpbGUgJyR7cHJvamVjdEZpbGVQYXRofScgd2l0aCBgICtcbiAgICAgIGBidW5kbGUgaWQgJyR7V0RBX1JVTk5FUl9CVU5ETEVfSUR9Jy4gV2ViRHJpdmVyQWdlbnQgaGFzIGJlZW4gYCArXG4gICAgICBgbW9kaWZpZWQgYW5kIG5vdCByZXR1cm5lZCB0byB0aGUgb3JpZ2luYWwgc3RhdGUuYCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0UmVhbERldmljZVNlY3VyaXR5IChrZXljaGFpblBhdGgsIGtleWNoYWluUGFzc3dvcmQpIHtcbiAgbG9nLmRlYnVnKCdTZXR0aW5nIHNlY3VyaXR5IGZvciBpT1MgZGV2aWNlJyk7XG4gIGF3YWl0IGV4ZWMoJ3NlY3VyaXR5JywgWyctdicsICdsaXN0LWtleWNoYWlucycsICctcycsIGtleWNoYWluUGF0aF0pO1xuICBhd2FpdCBleGVjKCdzZWN1cml0eScsIFsnLXYnLCAndW5sb2NrLWtleWNoYWluJywgJy1wJywga2V5Y2hhaW5QYXNzd29yZCwga2V5Y2hhaW5QYXRoXSk7XG4gIGF3YWl0IGV4ZWMoJ3NlY3VyaXR5JywgWydzZXQta2V5Y2hhaW4tc2V0dGluZ3MnLCAnLXQnLCAnMzYwMCcsICctbCcsIGtleWNoYWluUGF0aF0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVhjb2RlQ29uZmlnRmlsZSAob3JnSWQsIHNpZ25pbmdJZCkge1xuICBsb2cuZGVidWcoYEdlbmVyYXRpbmcgeGNvZGUgY29uZmlnIGZpbGUgZm9yIG9yZ0lkICcke29yZ0lkfScgYW5kIHNpZ25pbmdJZCBgICtcbiAgICAgICAgICAgIGAnJHtzaWduaW5nSWR9J2ApO1xuICBjb25zdCBjb250ZW50cyA9IGBERVZFTE9QTUVOVF9URUFNID0gJHtvcmdJZH1cbkNPREVfU0lHTl9JREVOVElUWSA9ICR7c2lnbmluZ0lkfVxuYDtcbiAgY29uc3QgeGNjb25maWdQYXRoID0gYXdhaXQgdGVtcERpci5wYXRoKCdhcHBpdW0tdGVtcC54Y2NvbmZpZycpO1xuICBsb2cuZGVidWcoYFdyaXRpbmcgeGNvZGUgY29uZmlnIGZpbGUgdG8gJHt4Y2NvbmZpZ1BhdGh9YCk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZSh4Y2NvbmZpZ1BhdGgsIGNvbnRlbnRzLCAndXRmOCcpO1xuICByZXR1cm4geGNjb25maWdQYXRoO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogQHR5cGVkZWYge09iamVjdH0gRGV2aWNlSW5mb1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGlzUmVhbERldmljZSAtIEVxdWFscyB0byB0cnVlIGlmIHRoZSBjdXJyZW50IGRldmljZSBpcyBhIHJlYWwgZGV2aWNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdWRpZCAtIFRoZSBkZXZpY2UgVURJRC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbGF0Zm9ybVZlcnNpb24gLSBUaGUgcGxhdGZvcm0gdmVyc2lvbiBvZiBPUy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwbGF0Zm9ybU5hbWUgLSBUaGUgcGxhdGZvcm0gbmFtZSBvZiBpT1MsIHR2T1NcbiovXG4vKipcbiAqIENyZWF0ZXMgeGN0ZXN0cnVuIGZpbGUgcGVyIGRldmljZSAmIHBsYXRmb3JtIHZlcnNpb24uXG4gKiBXZSBleHBlY3RzIHRvIGhhdmUgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lb3Mke3Nka1ZlcnNpb258cGxhdGZvcm1WZXJzaW9ufS1hcm02NC54Y3Rlc3RydW4gZm9yIHJlYWwgZGV2aWNlXG4gKiBhbmQgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lc2ltdWxhdG9yJHtzZGtWZXJzaW9ufHBsYXRmb3JtVmVyc2lvbn0teDg2XzY0LnhjdGVzdHJ1biBmb3Igc2ltdWxhdG9yIGxvY2F0ZWQgQGJvb3RzdHJhcFBhdGhcbiAqIE5ld2VyIFhjb2RlIChYY29kZSAxMC4wIGF0IGxlYXN0KSBnZW5lcmF0ZSB4Y3Rlc3RydW4gZmlsZSBmb2xsb3dpbmcgc2RrVmVyc2lvbi5cbiAqIGUuZy4gWGNvZGUgd2hpY2ggaGFzIGlPUyBTREsgVmVyc2lvbiAxMi4yIGdlbmVyYXRlIFdlYkRyaXZlckFnZW50UnVubmVyX2lwaG9uZXNpbXVsYXRvci4yLXg4Nl82NC54Y3Rlc3RydW5cbiAqICAgICAgZXZlbiBpZiB0aGUgY2FwIGhhcyBwbGF0Zm9ybSB2ZXJzaW9uIDExLjRcbiAqXG4gKiBAcGFyYW0ge0RldmljZUluZm99IGRldmljZUluZm9cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZGtWZXJzaW9uIC0gVGhlIFhjb2RlIFNESyB2ZXJzaW9uIG9mIE9TLlxuICogQHBhcmFtIHtzdHJpbmd9IGJvb3RzdHJhcFBhdGggLSBUaGUgZm9sZGVyIHBhdGggY29udGFpbmluZyB4Y3Rlc3RydW4gZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB3ZGFSZW1vdGVQb3J0IC0gVGhlIHJlbW90ZSBwb3J0IFdEQSBpcyBsaXN0ZW5pbmcgb24uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHJldHVybnMgeGN0ZXN0cnVuRmlsZVBhdGggZm9yIGdpdmVuIGRldmljZVxuICogQHRocm93cyBpZiBXZWJEcml2ZXJBZ2VudFJ1bm5lcl9pcGhvbmVvcyR7c2RrVmVyc2lvbnxwbGF0Zm9ybVZlcnNpb259LWFybTY0LnhjdGVzdHJ1biBmb3IgcmVhbCBkZXZpY2VcbiAqIG9yIFdlYkRyaXZlckFnZW50UnVubmVyX2lwaG9uZXNpbXVsYXRvciR7c2RrVmVyc2lvbnxwbGF0Zm9ybVZlcnNpb259LXg4Nl82NC54Y3Rlc3RydW4gZm9yIHNpbXVsYXRvciBpcyBub3QgZm91bmQgQGJvb3RzdHJhcFBhdGgsXG4gKiB0aGVuIGl0IHdpbGwgdGhyb3cgZmlsZSBub3QgZm91bmQgZXhjZXB0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNldFhjdGVzdHJ1bkZpbGUgKGRldmljZUluZm8sIHNka1ZlcnNpb24sIGJvb3RzdHJhcFBhdGgsIHdkYVJlbW90ZVBvcnQpIHtcbiAgY29uc3QgeGN0ZXN0cnVuRmlsZVBhdGggPSBhd2FpdCBnZXRYY3Rlc3RydW5GaWxlUGF0aChkZXZpY2VJbmZvLCBzZGtWZXJzaW9uLCBib290c3RyYXBQYXRoKTtcbiAgY29uc3QgeGN0ZXN0UnVuQ29udGVudCA9IGF3YWl0IHBsaXN0LnBhcnNlUGxpc3RGaWxlKHhjdGVzdHJ1bkZpbGVQYXRoKTtcbiAgY29uc3QgdXBkYXRlV0RBUG9ydCA9IGdldEFkZGl0aW9uYWxSdW5Db250ZW50KGRldmljZUluZm8ucGxhdGZvcm1OYW1lLCB3ZGFSZW1vdGVQb3J0KTtcbiAgY29uc3QgbmV3WGN0ZXN0UnVuQ29udGVudCA9IF8ubWVyZ2UoeGN0ZXN0UnVuQ29udGVudCwgdXBkYXRlV0RBUG9ydCk7XG4gIGF3YWl0IHBsaXN0LnVwZGF0ZVBsaXN0RmlsZSh4Y3Rlc3RydW5GaWxlUGF0aCwgbmV3WGN0ZXN0UnVuQ29udGVudCwgdHJ1ZSk7XG5cbiAgcmV0dXJuIHhjdGVzdHJ1bkZpbGVQYXRoO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgV0RBIG9iamVjdCB3aGljaCBhcHBlbmRzIGV4aXN0aW5nIHhjdGVzdCBydW5uZXIgY29udGVudFxuICogQHBhcmFtIHtzdHJpbmd9IHBsYXRmb3JtTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwbGF0Zm9ybVxuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBUaGUgWGNvZGUgU0RLIHZlcnNpb24gb2YgT1MuXG4gKiBAcmV0dXJuIHtvYmplY3R9IHJldHVybnMgYSBydW5uZXIgb2JqZWN0IHdoaWNoIGhhcyBVU0VfUE9SVFxuICovXG5mdW5jdGlvbiBnZXRBZGRpdGlvbmFsUnVuQ29udGVudCAocGxhdGZvcm1OYW1lLCB3ZGFSZW1vdGVQb3J0KSB7XG4gIGNvbnN0IHJ1bm5lciA9IGBXZWJEcml2ZXJBZ2VudFJ1bm5lciR7aXNUdk9TKHBsYXRmb3JtTmFtZSkgPyAnX3R2T1MnIDogJyd9YDtcblxuICByZXR1cm4ge1xuICAgIFtydW5uZXJdOiB7XG4gICAgICBFbnZpcm9ubWVudFZhcmlhYmxlczoge1xuICAgICAgICAvLyBVU0VfUE9SVCBtdXN0IGJlICdzdHJpbmcnXG4gICAgICAgIFVTRV9QT1JUOiBgJHt3ZGFSZW1vdGVQb3J0fWBcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwYXRoIG9mIHhjdGVzdHJ1biBpZiBpdCBleGlzdHNcbiAqIEBwYXJhbSB7RGV2aWNlSW5mb30gZGV2aWNlSW5mb1xuICogQHBhcmFtIHtzdHJpbmd9IHNka1ZlcnNpb24gLSBUaGUgWGNvZGUgU0RLIHZlcnNpb24gb2YgT1MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYm9vdHN0cmFwUGF0aCAtIFRoZSBmb2xkZXIgcGF0aCBjb250YWluaW5nIHhjdGVzdHJ1biBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRYY3Rlc3RydW5GaWxlUGF0aCAoZGV2aWNlSW5mbywgc2RrVmVyc2lvbiwgYm9vdHN0cmFwUGF0aCkge1xuICAvLyBGaXJzdCB0cnkgdGhlIFNESyBwYXRoLCBmb3IgWGNvZGUgMTAgKGF0IGxlYXN0KVxuICBjb25zdCBzZGtCYXNlZCA9IFtcbiAgICBwYXRoLnJlc29sdmUoYm9vdHN0cmFwUGF0aCwgYCR7ZGV2aWNlSW5mby51ZGlkfV8ke3Nka1ZlcnNpb259LnhjdGVzdHJ1bmApLFxuICAgIHNka1ZlcnNpb24sXG4gIF07XG4gIC8vIE5leHQgdHJ5IFBsYXRmb3JtIHBhdGgsIGZvciBlYXJsaWVyIFhjb2RlIHZlcnNpb25zXG4gIGNvbnN0IHBsYXRmb3JtQmFzZWQgPSBbXG4gICAgcGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGAke2RldmljZUluZm8udWRpZH1fJHtkZXZpY2VJbmZvLnBsYXRmb3JtVmVyc2lvbn0ueGN0ZXN0cnVuYCksXG4gICAgZGV2aWNlSW5mby5wbGF0Zm9ybVZlcnNpb24sXG4gIF07XG5cbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIHZlcnNpb25dIG9mIFtzZGtCYXNlZCwgcGxhdGZvcm1CYXNlZF0pIHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgbG9nLmluZm8oYFVzaW5nICcke2ZpbGVQYXRofScgYXMgeGN0ZXN0cnVuIGZpbGVgKTtcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWxYY3Rlc3RydW5GaWxlID0gcGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGdldFhjdGVzdHJ1bkZpbGVOYW1lKGRldmljZUluZm8sIHZlcnNpb24pKTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKG9yaWdpbmFsWGN0ZXN0cnVuRmlsZSkpIHtcbiAgICAgIC8vIElmIHRoaXMgaXMgZmlyc3QgdGltZSBydW4gZm9yIGdpdmVuIGRldmljZSwgdGhlbiBmaXJzdCBnZW5lcmF0ZSB4Y3Rlc3RydW4gZmlsZSBmb3IgZGV2aWNlLlxuICAgICAgLy8gV2UgbmVlZCB0byBoYXZlIGEgeGN0ZXN0cnVuIGZpbGUgKipwZXIgZGV2aWNlKiogYmVjYXVzZSB3ZSBjYW50IG5vdCBoYXZlIHNhbWUgd2RhIHBvcnQgZm9yIGFsbCBkZXZpY2VzLlxuICAgICAgYXdhaXQgZnMuY29weUZpbGUob3JpZ2luYWxYY3Rlc3RydW5GaWxlLCBmaWxlUGF0aCk7XG4gICAgICBsb2cuaW5mbyhgVXNpbmcgJyR7ZmlsZVBhdGh9JyBhcyB4Y3Rlc3RydW4gZmlsZSBjb3BpZWQgYnkgJyR7b3JpZ2luYWxYY3Rlc3RydW5GaWxlfSdgKTtcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICB9XG4gIH1cblxuICBsb2cuZXJyb3JBbmRUaHJvdyhgSWYgeW91IGFyZSB1c2luZyAndXNlWGN0ZXN0cnVuRmlsZScgY2FwYWJpbGl0eSB0aGVuIHlvdSBgICtcbiAgICBgbmVlZCB0byBoYXZlIGEgeGN0ZXN0cnVuIGZpbGUgKGV4cGVjdGVkOiBgICtcbiAgICBgJyR7cGF0aC5yZXNvbHZlKGJvb3RzdHJhcFBhdGgsIGdldFhjdGVzdHJ1bkZpbGVOYW1lKGRldmljZUluZm8sIHNka1ZlcnNpb24pKX0nKWApO1xufVxuXG5cbi8qKlxuICogUmV0dXJuIHRoZSBuYW1lIG9mIHhjdGVzdHJ1biBmaWxlXG4gKiBAcGFyYW0ge0RldmljZUluZm99IGRldmljZUluZm9cbiAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gVGhlIFhjb2RlIFNESyB2ZXJzaW9uIG9mIE9TLlxuICogQHJldHVybiB7c3RyaW5nfSByZXR1cm5zIHhjdGVzdHJ1bkZpbGVQYXRoIGZvciBnaXZlbiBkZXZpY2VcbiAqL1xuZnVuY3Rpb24gZ2V0WGN0ZXN0cnVuRmlsZU5hbWUgKGRldmljZUluZm8sIHZlcnNpb24pIHtcbiAgcmV0dXJuIGlzVHZPUyhkZXZpY2VJbmZvLnBsYXRmb3JtTmFtZSlcbiAgICA/IGBXZWJEcml2ZXJBZ2VudFJ1bm5lcl90dk9TX2FwcGxldHYke2RldmljZUluZm8uaXNSZWFsRGV2aWNlID8gYG9zJHt2ZXJzaW9ufS1hcm02NGAgOiBgc2ltdWxhdG9yJHt2ZXJzaW9ufS14ODZfNjRgfS54Y3Rlc3RydW5gXG4gICAgOiBgV2ViRHJpdmVyQWdlbnRSdW5uZXJfaXBob25lJHtkZXZpY2VJbmZvLmlzUmVhbERldmljZSA/IGBvcyR7dmVyc2lvbn0tYXJtNjRgIDogYHNpbXVsYXRvciR7dmVyc2lvbn0teDg2XzY0YH0ueGN0ZXN0cnVuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3MgKG5hbWUsIHByb2MpIHtcbiAgaWYgKCFwcm9jIHx8ICFwcm9jLmlzUnVubmluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5pbmZvKGBTaHV0dGluZyBkb3duICcke25hbWV9JyBwcm9jZXNzIChwaWQgJyR7cHJvYy5wcm9jLnBpZH0nKWApO1xuXG4gIGxvZy5pbmZvKGBTZW5kaW5nICdTSUdURVJNJy4uLmApO1xuICB0cnkge1xuICAgIGF3YWl0IHByb2Muc3RvcCgnU0lHVEVSTScsIDEwMDApO1xuICAgIHJldHVybjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCFlcnIubWVzc2FnZS5pbmNsdWRlcyhgUHJvY2VzcyBkaWRuJ3QgZW5kIGFmdGVyYCkpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGAke25hbWV9IHByb2Nlc3MgZGlkIG5vdCBlbmQgaW4gYSB0aW1lbHkgZmFzaGlvbjogJyR7ZXJyLm1lc3NhZ2V9Jy5gKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBTZW5kaW5nICdTSUdLSUxMJy4uLmApO1xuICB0cnkge1xuICAgIGF3YWl0IHByb2Muc3RvcCgnU0lHS0lMTCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ25vdCBjdXJyZW50bHkgcnVubmluZycpKSB7XG4gICAgICAvLyB0aGUgcHJvY2VzcyBlbmRlZCBidXQgZm9yIHNvbWUgcmVhc29uIHdlIHdlcmUgbm90IGluZm9ybWVkXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgcmFuZG9tIGludGVnZXIuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIG51bWJlciBpbiByYW5nZSBbbG93LCBoaWdodCkuIGBsb3dgYCBpcyBpbmNsdXNpdmUgYW5kIGBoaWdoYCBpcyBleGNsdXNpdmUuXG4gKi9cbmZ1bmN0aW9uIHJhbmRvbUludCAobG93LCBoaWdoKSB7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaGlnaCAtIGxvdykgKyBsb3cpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBXREEgdXBncmFkZSB0aW1lc3RhbXBcbiAqXG4gKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgVU5JWCB0aW1lc3RhbXAgb2YgdGhlIHBhY2thZ2UgbWFuaWZlc3QuIFRoZSBtYW5pZmVzdCBvbmx5IGdldHMgbW9kaWZpZWQgb25cbiAqIHBhY2thZ2UgdXBncmFkZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCAoKSB7XG4gIGNvbnN0IHBhY2thZ2VNYW5pZmVzdCA9IHBhdGgucmVzb2x2ZShnZXRNb2R1bGVSb290KCksICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocGFja2FnZU1hbmlmZXN0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHttdGltZX0gPSBhd2FpdCBmcy5zdGF0KHBhY2thZ2VNYW5pZmVzdCk7XG4gIHJldHVybiBtdGltZS5nZXRUaW1lKCk7XG59XG5cbi8qKlxuICogS2lsbHMgcnVubmluZyBYQ1Rlc3QgcHJvY2Vzc2VzIGZvciB0aGUgcGFydGljdWxhciBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVkaWQgLSBUaGUgZGV2aWNlIFVESUQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzU2ltdWxhdG9yIC0gRXF1YWxzIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIGEgU2ltdWxhdG9yXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc2V0VGVzdFByb2Nlc3NlcyAodWRpZCwgaXNTaW11bGF0b3IpIHtcbiAgY29uc3QgcHJvY2Vzc1BhdHRlcm5zID0gW2B4Y29kZWJ1aWxkLioke3VkaWR9YF07XG4gIGlmIChpc1NpbXVsYXRvcikge1xuICAgIHByb2Nlc3NQYXR0ZXJucy5wdXNoKGAke3VkaWR9LipYQ1RSdW5uZXJgKTtcbiAgICAvLyBUaGUgcGF0dGVybiB0byBmaW5kIGluIGNhc2UgaWRiIHdhcyB1c2VkXG4gICAgcHJvY2Vzc1BhdHRlcm5zLnB1c2goYHhjdGVzdC4qJHt1ZGlkfWApO1xuICB9XG4gIGxvZy5kZWJ1ZyhgS2lsbGluZyBydW5uaW5nIHByb2Nlc3NlcyAnJHtwcm9jZXNzUGF0dGVybnMuam9pbignLCAnKX0nIGZvciB0aGUgZGV2aWNlICR7dWRpZH0uLi5gKTtcbiAgYXdhaXQgQi5hbGwocHJvY2Vzc1BhdHRlcm5zLm1hcChraWxsQXBwVXNpbmdQYXR0ZXJuKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBJRHMgb2YgcHJvY2Vzc2VzIGxpc3RlbmluZyBvbiB0aGUgcGFydGljdWxhciBzeXN0ZW0gcG9ydC5cbiAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gYXBwbHkgYWRkaXRpb25hbCBmaWx0ZXJpbmcgYmFzZWQgb24gdGhlXG4gKiBwcm9jZXNzIGNvbW1hbmQgbGluZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBvcnQgLSBUaGUgcG9ydCBudW1iZXIuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZmlsdGVyaW5nRnVuYyAtIE9wdGlvbmFsIGxhbWJkYSBmdW5jdGlvbiwgd2hpY2hcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXMgY29tbWFuZCBsaW5lIHN0cmluZyBvZiB0aGUgcGFydGljdWxhciBwcm9jZXNzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmluZyBvbiBnaXZlbiBwb3J0LCBhbmQgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpdGhlciB0cnVlIG9yIGZhbHNlIHRvIGluY2x1ZGUvZXhjbHVkZSB0aGUgY29ycmVzcG9uZGluZyBQSURcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgcmVzdWx0aW5nIGFycmF5LlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IC0gdGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIGlkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UElEc0xpc3RlbmluZ09uUG9ydCAocG9ydCwgZmlsdGVyaW5nRnVuYyA9IG51bGwpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIHRyeSB7XG4gICAgLy8gVGhpcyBvbmx5IHdvcmtzIHNpbmNlIE1hYyBPUyBYIEVsIENhcGl0YW5cbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ2xzb2YnLCBbJy10aScsIGB0Y3A6JHtwb3J0fWBdKTtcbiAgICByZXN1bHQucHVzaCguLi4oc3Rkb3V0LnRyaW0oKS5zcGxpdCgvXFxuKy8pKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZS5jb2RlICE9PSAxKSB7XG4gICAgICAvLyBjb2RlIDEgbWVhbnMgbm8gcHJvY2Vzc2VzLiBPdGhlciBlcnJvcnMgbmVlZCByZXBvcnRpbmdcbiAgICAgIGxvZy5kZWJ1ZyhgRXJyb3IgZ2V0dGluZyBwcm9jZXNzZXMgbGlzdGVuaW5nIG9uIHBvcnQgJyR7cG9ydH0nOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghXy5pc0Z1bmN0aW9uKGZpbHRlcmluZ0Z1bmMpKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICByZXR1cm4gYXdhaXQgQi5maWx0ZXIocmVzdWx0LCBhc3luYyAocGlkKSA9PiB7XG4gICAgbGV0IHN0ZG91dDtcbiAgICB0cnkge1xuICAgICAgKHtzdGRvdXR9ID0gYXdhaXQgZXhlYygncHMnLCBbJy1wJywgcGlkLCAnLW8nLCAnY29tbWFuZCddKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSA9PT0gMSkge1xuICAgICAgICAvLyBUaGUgcHJvY2VzcyBkb2VzIG5vdCBleGlzdCBhbnltb3JlLCB0aGVyZSdzIG5vdGhpbmcgdG8gZmlsdGVyXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmaWx0ZXJpbmdGdW5jKHN0ZG91dCk7XG4gIH0pO1xufVxuXG5leHBvcnQgeyB1cGRhdGVQcm9qZWN0RmlsZSwgcmVzZXRQcm9qZWN0RmlsZSwgc2V0UmVhbERldmljZVNlY3VyaXR5LFxuICBnZXRBZGRpdGlvbmFsUnVuQ29udGVudCwgZ2V0WGN0ZXN0cnVuRmlsZU5hbWUsIGdlbmVyYXRlWGNvZGVDb25maWdGaWxlLFxuICBzZXRYY3Rlc3RydW5GaWxlLCBnZXRYY3Rlc3RydW5GaWxlUGF0aCwga2lsbFByb2Nlc3MsIHJhbmRvbUludCxcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgcmVzZXRUZXN0UHJvY2Vzc2VzLFxuICBnZXRQSURzTGlzdGVuaW5nT25Qb3J0LCBr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
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["PROJECT_FILE","getModuleRoot","_","memoize","currentDir","path","dirname","resolve","__filename","isAtFsRoot","manifestPath","join","_fs","existsSync","JSON","parse","readFileSync","name","ign","length","Error","BOOTSTRAP_PATH","getPIDsUsingPattern","pattern","args","stdout","exec","split","map","x","parseInt","filter","isInteger","err","log","debug","code","killAppUsingPattern","pgrepPattern","signals","signal","matchedPids","isEmpty","message","last","waitForCondition","pidCheckPromises","pid","then","catch","B","all","every","waitMs","intervalMs","isTvOS","platformName","toLower","PLATFORM_NAME_TVOS","replaceInFile","file","find","replace","contents","fs","readFile","newContents","writeFile","updateProjectFile","agentPath","newBundleId","projectFilePath","copyFile","RegExp","escapeRegExp","WDA_RUNNER_BUNDLE_ID","warn","resetProjectFile","exists","mv","setRealDeviceSecurity","keychainPath","keychainPassword","generateXcodeConfigFile","orgId","signingId","xcconfigPath","tempDir","setXctestrunFile","deviceInfo","sdkVersion","bootstrapPath","wdaRemotePort","xctestrunFilePath","getXctestrunFilePath","xctestRunContent","plist","parsePlistFile","updateWDAPort","getAdditionalRunContent","newXctestRunContent","merge","updatePlistFile","runner","EnvironmentVariables","USE_PORT","sdkBased","udid","platformBased","platformVersion","filePath","version","info","originalXctestrunFile","getXctestrunFileName","errorAndThrow","isRealDevice","killProcess","proc","isRunning","stop","includes","randomInt","low","high","Math","floor","random","getWDAUpgradeTimestamp","packageManifest","mtime","stat","getTime","resetTestProcesses","isSimulator","processPatterns","push","getPIDsListeningOnPort","port","filteringFunc","result","trim","e","stderr","isFunction"],"sources":["../../lib/utils.js"],"sourcesContent":["import { fs, tempDir, plist } from '@appium/support';\nimport { exec } from 'teen_process';\nimport path from 'path';\nimport log from './logger';\nimport _ from 'lodash';\nimport { WDA_RUNNER_BUNDLE_ID, PLATFORM_NAME_TVOS } from './constants';\nimport B from 'bluebird';\nimport _fs from 'fs';\nimport { waitForCondition } from 'asyncbox';\n\nconst PROJECT_FILE = 'project.pbxproj';\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(function getModuleRoot () {\n let currentDir = path.dirname(path.resolve(__filename));\n let isAtFsRoot = false;\n while (!isAtFsRoot) {\n const manifestPath = path.join(currentDir, 'package.json');\n try {\n if (_fs.existsSync(manifestPath) &&\n JSON.parse(_fs.readFileSync(manifestPath, 'utf8')).name === 'appium-webdriveragent') {\n return currentDir;\n }\n } catch (ign) {}\n currentDir = path.dirname(currentDir);\n isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;\n }\n throw new Error('Cannot find the root folder of the appium-webdriveragent Node.js module');\n});\n\nexport const BOOTSTRAP_PATH = getModuleRoot();\n\nasync function getPIDsUsingPattern (pattern) {\n const args = [\n '-if', // case insensitive, full cmdline match\n pattern,\n ];\n try {\n const {stdout} = await exec('pgrep', args);\n return stdout.split(/\\s+/)\n .map((x) => parseInt(x, 10))\n .filter(_.isInteger)\n .map((x) => `${x}`);\n } catch (err) {\n log.debug(`'pgrep ${args.join(' ')}' didn't detect any matching processes. Return code: ${err.code}`);\n return [];\n }\n}\n\nasync function killAppUsingPattern (pgrepPattern) {\n const signals = [2, 15, 9];\n for (const signal of signals) {\n const matchedPids = await getPIDsUsingPattern(pgrepPattern);\n if (_.isEmpty(matchedPids)) {\n return;\n }\n const args = [`-${signal}`, ...matchedPids];\n try {\n await exec('kill', args);\n } catch (err) {\n log.debug(`kill ${args.join(' ')} -> ${err.message}`);\n }\n if (signal === _.last(signals)) {\n // there is no need to wait after SIGKILL\n return;\n }\n try {\n await waitForCondition(async () => {\n const pidCheckPromises = matchedPids\n .map((pid) => exec('kill', ['-0', pid])\n // the process is still alive\n .then(() => false)\n // the process is dead\n .catch(() => true)\n );\n return (await B.all(pidCheckPromises))\n .every((x) => x === true);\n }, {\n waitMs: 1000,\n intervalMs: 100,\n });\n return;\n } catch (ign) {\n // try the next signal\n }\n }\n}\n\n/**\n * Return true if the platformName is tvOS\n * @param {string} platformName The name of the platorm\n * @returns {boolean} Return true if the platformName is tvOS\n */\nfunction isTvOS (platformName) {\n return _.toLower(platformName) === _.toLower(PLATFORM_NAME_TVOS);\n}\n\nasync function replaceInFile (file, find, replace) {\n let contents = await fs.readFile(file, 'utf8');\n\n let newContents = contents.replace(find, replace);\n if (newContents !== contents) {\n await fs.writeFile(file, newContents, 'utf8');\n }\n}\n\n/**\n * Update WebDriverAgentRunner project bundle ID with newBundleId.\n * This method assumes project file is in the correct state.\n * @param {string} agentPath - Path to the .xcodeproj directory.\n * @param {string} newBundleId the new bundle ID used to update.\n */\nasync function updateProjectFile (agentPath, newBundleId) {\n let projectFilePath = path.resolve(agentPath, PROJECT_FILE);\n try {\n // Assuming projectFilePath is in the correct state, create .old from projectFilePath\n await fs.copyFile(projectFilePath, `${projectFilePath}.old`);\n await replaceInFile(projectFilePath, new RegExp(_.escapeRegExp(WDA_RUNNER_BUNDLE_ID), 'g'), newBundleId); // eslint-disable-line no-useless-escape\n log.debug(`Successfully updated '${projectFilePath}' with bundle id '${newBundleId}'`);\n } catch (err) {\n log.debug(`Error updating project file: ${err.message}`);\n log.warn(`Unable to update project file '${projectFilePath}' with ` +\n `bundle id '${newBundleId}'. WebDriverAgent may not start`);\n }\n}\n\n/**\n * Reset WebDriverAgentRunner project bundle ID to correct state.\n * @param {string} agentPath - Path to the .xcodeproj directory.\n */\nasync function resetProjectFile (agentPath) {\n const projectFilePath = path.join(agentPath, PROJECT_FILE);\n try {\n // restore projectFilePath from .old file\n if (!await fs.exists(`${projectFilePath}.old`)) {\n return; // no need to reset\n }\n await fs.mv(`${projectFilePath}.old`, projectFilePath);\n log.debug(`Successfully reset '${projectFilePath}' with bundle id '${WDA_RUNNER_BUNDLE_ID}'`);\n } catch (err) {\n log.debug(`Error resetting project file: ${err.message}`);\n log.warn(`Unable to reset project file '${projectFilePath}' with ` +\n `bundle id '${WDA_RUNNER_BUNDLE_ID}'. WebDriverAgent has been ` +\n `modified and not returned to the original state.`);\n }\n}\n\nasync function setRealDeviceSecurity (keychainPath, keychainPassword) {\n log.debug('Setting security for iOS device');\n await exec('security', ['-v', 'list-keychains', '-s', keychainPath]);\n await exec('security', ['-v', 'unlock-keychain', '-p', keychainPassword, keychainPath]);\n await exec('security', ['set-keychain-settings', '-t', '3600', '-l', keychainPath]);\n}\n\nasync function generateXcodeConfigFile (orgId, signingId) {\n log.debug(`Generating xcode config file for orgId '${orgId}' and signingId ` +\n `'${signingId}'`);\n const contents = `DEVELOPMENT_TEAM = ${orgId}\nCODE_SIGN_IDENTITY = ${signingId}\n`;\n const xcconfigPath = await tempDir.path('appium-temp.xcconfig');\n log.debug(`Writing xcode config file to ${xcconfigPath}`);\n await fs.writeFile(xcconfigPath, contents, 'utf8');\n return xcconfigPath;\n}\n\n/**\n * Information of the device under test\n * @typedef {Object} DeviceInfo\n * @property {string} isRealDevice - Equals to true if the current device is a real device\n * @property {string} udid - The device UDID.\n * @property {string} platformVersion - The platform version of OS.\n * @property {string} platformName - The platform name of iOS, tvOS\n*/\n/**\n * Creates xctestrun file per device & platform version.\n * We expects to have WebDriverAgentRunner_iphoneos${sdkVersion|platformVersion}-arm64.xctestrun for real device\n * and WebDriverAgentRunner_iphonesimulator${sdkVersion|platformVersion}-x86_64.xctestrun for simulator located @bootstrapPath\n * Newer Xcode (Xcode 10.0 at least) generate xctestrun file following sdkVersion.\n * e.g. Xcode which has iOS SDK Version 12.2 generate WebDriverAgentRunner_iphonesimulator.2-x86_64.xctestrun\n * even if the cap has platform version 11.4\n *\n * @param {DeviceInfo} deviceInfo\n * @param {string} sdkVersion - The Xcode SDK version of OS.\n * @param {string} bootstrapPath - The folder path containing xctestrun file.\n * @param {string} wdaRemotePort - The remote port WDA is listening on.\n * @return {string} returns xctestrunFilePath for given device\n * @throws if WebDriverAgentRunner_iphoneos${sdkVersion|platformVersion}-arm64.xctestrun for real device\n * or WebDriverAgentRunner_iphonesimulator${sdkVersion|platformVersion}-x86_64.xctestrun for simulator is not found @bootstrapPath,\n * then it will throw file not found exception\n */\nasync function setXctestrunFile (deviceInfo, sdkVersion, bootstrapPath, wdaRemotePort) {\n const xctestrunFilePath = await getXctestrunFilePath(deviceInfo, sdkVersion, bootstrapPath);\n const xctestRunContent = await plist.parsePlistFile(xctestrunFilePath);\n const updateWDAPort = getAdditionalRunContent(deviceInfo.platformName, wdaRemotePort);\n const newXctestRunContent = _.merge(xctestRunContent, updateWDAPort);\n await plist.updatePlistFile(xctestrunFilePath, newXctestRunContent, true);\n\n return xctestrunFilePath;\n}\n\n/**\n * Return the WDA object which appends existing xctest runner content\n * @param {string} platformName - The name of the platform\n * @param {string} version - The Xcode SDK version of OS.\n * @return {object} returns a runner object which has USE_PORT\n */\nfunction getAdditionalRunContent (platformName, wdaRemotePort) {\n const runner = `WebDriverAgentRunner${isTvOS(platformName) ? '_tvOS' : ''}`;\n\n return {\n [runner]: {\n EnvironmentVariables: {\n // USE_PORT must be 'string'\n USE_PORT: `${wdaRemotePort}`\n }\n }\n };\n}\n\n/**\n * Return the path of xctestrun if it exists\n * @param {DeviceInfo} deviceInfo\n * @param {string} sdkVersion - The Xcode SDK version of OS.\n * @param {string} bootstrapPath - The folder path containing xctestrun file.\n */\nasync function getXctestrunFilePath (deviceInfo, sdkVersion, bootstrapPath) {\n // First try the SDK path, for Xcode 10 (at least)\n const sdkBased = [\n path.resolve(bootstrapPath, `${deviceInfo.udid}_${sdkVersion}.xctestrun`),\n sdkVersion,\n ];\n // Next try Platform path, for earlier Xcode versions\n const platformBased = [\n path.resolve(bootstrapPath, `${deviceInfo.udid}_${deviceInfo.platformVersion}.xctestrun`),\n deviceInfo.platformVersion,\n ];\n\n for (const [filePath, version] of [sdkBased, platformBased]) {\n if (await fs.exists(filePath)) {\n log.info(`Using '${filePath}' as xctestrun file`);\n return filePath;\n }\n const originalXctestrunFile = path.resolve(bootstrapPath, getXctestrunFileName(deviceInfo, version));\n if (await fs.exists(originalXctestrunFile)) {\n // If this is first time run for given device, then first generate xctestrun file for device.\n // We need to have a xctestrun file **per device** because we cant not have same wda port for all devices.\n await fs.copyFile(originalXctestrunFile, filePath);\n log.info(`Using '${filePath}' as xctestrun file copied by '${originalXctestrunFile}'`);\n return filePath;\n }\n }\n\n log.errorAndThrow(`If you are using 'useXctestrunFile' capability then you ` +\n `need to have a xctestrun file (expected: ` +\n `'${path.resolve(bootstrapPath, getXctestrunFileName(deviceInfo, sdkVersion))}')`);\n}\n\n\n/**\n * Return the name of xctestrun file\n * @param {DeviceInfo} deviceInfo\n * @param {string} version - The Xcode SDK version of OS.\n * @return {string} returns xctestrunFilePath for given device\n */\nfunction getXctestrunFileName (deviceInfo, version) {\n return isTvOS(deviceInfo.platformName)\n ? `WebDriverAgentRunner_tvOS_appletv${deviceInfo.isRealDevice ? `os${version}-arm64` : `simulator${version}-x86_64`}.xctestrun`\n : `WebDriverAgentRunner_iphone${deviceInfo.isRealDevice ? `os${version}-arm64` : `simulator${version}-x86_64`}.xctestrun`;\n}\n\nasync function killProcess (name, proc) {\n if (!proc || !proc.isRunning) {\n return;\n }\n\n log.info(`Shutting down '${name}' process (pid '${proc.proc.pid}')`);\n\n log.info(`Sending 'SIGTERM'...`);\n try {\n await proc.stop('SIGTERM', 1000);\n return;\n } catch (err) {\n if (!err.message.includes(`Process didn't end after`)) {\n throw err;\n }\n log.debug(`${name} process did not end in a timely fashion: '${err.message}'.`);\n }\n\n log.info(`Sending 'SIGKILL'...`);\n try {\n await proc.stop('SIGKILL');\n } catch (err) {\n if (err.message.includes('not currently running')) {\n // the process ended but for some reason we were not informed\n return;\n }\n throw err;\n }\n}\n\n/**\n * Generate a random integer.\n *\n * @return {number} A random integer number in range [low, hight). `low`` is inclusive and `high` is exclusive.\n */\nfunction randomInt (low, high) {\n return Math.floor(Math.random() * (high - low) + low);\n}\n\n/**\n * Retrieves WDA upgrade timestamp\n *\n * @return {?number} The UNIX timestamp of the package manifest. The manifest only gets modified on\n * package upgrade.\n */\nasync function getWDAUpgradeTimestamp () {\n const packageManifest = path.resolve(getModuleRoot(), 'package.json');\n if (!await fs.exists(packageManifest)) {\n return null;\n }\n const {mtime} = await fs.stat(packageManifest);\n return mtime.getTime();\n}\n\n/**\n * Kills running XCTest processes for the particular device.\n *\n * @param {string} udid - The device UDID.\n * @param {boolean} isSimulator - Equals to true if the current device is a Simulator\n */\nasync function resetTestProcesses (udid, isSimulator) {\n const processPatterns = [`xcodebuild.*${udid}`];\n if (isSimulator) {\n processPatterns.push(`${udid}.*XCTRunner`);\n // The pattern to find in case idb was used\n processPatterns.push(`xctest.*${udid}`);\n }\n log.debug(`Killing running processes '${processPatterns.join(', ')}' for the device ${udid}...`);\n await B.all(processPatterns.map(killAppUsingPattern));\n}\n\n/**\n * Get the IDs of processes listening on the particular system port.\n * It is also possible to apply additional filtering based on the\n * process command line.\n *\n * @param {string|number} port - The port number.\n * @param {?Function} filteringFunc - Optional lambda function, which\n * receives command line string of the particular process\n * listening on given port, and is expected to return\n * either true or false to include/exclude the corresponding PID\n * from the resulting array.\n * @returns {Array<string>} - the list of matched process ids.\n */\nasync function getPIDsListeningOnPort (port, filteringFunc = null) {\n const result = [];\n try {\n // This only works since Mac OS X El Capitan\n const {stdout} = await exec('lsof', ['-ti', `tcp:${port}`]);\n result.push(...(stdout.trim().split(/\\n+/)));\n } catch (e) {\n if (e.code !== 1) {\n // code 1 means no processes. Other errors need reporting\n log.debug(`Error getting processes listening on port '${port}': ${e.stderr || e.message}`);\n }\n return result;\n }\n\n if (!_.isFunction(filteringFunc)) {\n return result;\n }\n return await B.filter(result, async (pid) => {\n let stdout;\n try {\n ({stdout} = await exec('ps', ['-p', pid, '-o', 'command']));\n } catch (e) {\n if (e.code === 1) {\n // The process does not exist anymore, there's nothing to filter\n return false;\n }\n throw e;\n }\n return await filteringFunc(stdout);\n });\n}\n\nexport { updateProjectFile, resetProjectFile, setRealDeviceSecurity,\n getAdditionalRunContent, getXctestrunFileName, generateXcodeConfigFile,\n setXctestrunFile, getXctestrunFilePath, killProcess, randomInt,\n getWDAUpgradeTimestamp, resetTestProcesses,\n getPIDsListeningOnPort, killAppUsingPattern, isTvOS\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":["_support","require","_teen_process","_path","_interopRequireDefault","_logger","_lodash","_constants","_bluebird","_fs2","_asyncbox","PROJECT_FILE","getModuleRoot","_","memoize","currentDir","path","dirname","resolve","__filename","isAtFsRoot","manifestPath","join","_fs","existsSync","JSON","parse","readFileSync","name","ign","length","Error","BOOTSTRAP_PATH","exports","getPIDsUsingPattern","pattern","args","stdout","exec","split","map","x","parseInt","filter","isInteger","err","log","debug","code","killAppUsingPattern","pgrepPattern","signals","signal","matchedPids","isEmpty","message","last","waitForCondition","pidCheckPromises","pid","then","catch","B","all","every","waitMs","intervalMs","isTvOS","platformName","toLower","PLATFORM_NAME_TVOS","replaceInFile","file","find","replace","contents","fs","readFile","newContents","writeFile","updateProjectFile","agentPath","newBundleId","projectFilePath","copyFile","RegExp","escapeRegExp","WDA_RUNNER_BUNDLE_ID","warn","resetProjectFile","exists","mv","setRealDeviceSecurity","keychainPath","keychainPassword","generateXcodeConfigFile","orgId","signingId","xcconfigPath","tempDir","setXctestrunFile","deviceInfo","sdkVersion","bootstrapPath","wdaRemotePort","xctestrunFilePath","getXctestrunFilePath","xctestRunContent","plist","parsePlistFile","updateWDAPort","getAdditionalRunContent","newXctestRunContent","merge","updatePlistFile","runner","EnvironmentVariables","USE_PORT","sdkBased","udid","platformBased","platformVersion","filePath","version","info","originalXctestrunFile","getXctestrunFileName","errorAndThrow","isRealDevice","killProcess","proc","isRunning","stop","includes","randomInt","low","high","Math","floor","random","getWDAUpgradeTimestamp","packageManifest","mtime","stat","getTime","resetTestProcesses","isSimulator","processPatterns","push","getPIDsListeningOnPort","port","filteringFunc","result","trim","e","stderr","isFunction"],"sources":["../../lib/utils.js"],"sourcesContent":["import { fs, tempDir, plist } from '@appium/support';\nimport { exec } from 'teen_process';\nimport path from 'path';\nimport log from './logger';\nimport _ from 'lodash';\nimport { WDA_RUNNER_BUNDLE_ID, PLATFORM_NAME_TVOS } from './constants';\nimport B from 'bluebird';\nimport _fs from 'fs';\nimport { waitForCondition } from 'asyncbox';\n\nconst PROJECT_FILE = 'project.pbxproj';\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(function getModuleRoot () {\n let currentDir = path.dirname(path.resolve(__filename));\n let isAtFsRoot = false;\n while (!isAtFsRoot) {\n const manifestPath = path.join(currentDir, 'package.json');\n try {\n if (_fs.existsSync(manifestPath) &&\n JSON.parse(_fs.readFileSync(manifestPath, 'utf8')).name === 'appium-webdriveragent') {\n return currentDir;\n }\n } catch (ign) {}\n currentDir = path.dirname(currentDir);\n isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;\n }\n throw new Error('Cannot find the root folder of the appium-webdriveragent Node.js module');\n});\n\nexport const BOOTSTRAP_PATH = getModuleRoot();\n\nasync function getPIDsUsingPattern (pattern) {\n const args = [\n '-if', // case insensitive, full cmdline match\n pattern,\n ];\n try {\n const {stdout} = await exec('pgrep', args);\n return stdout.split(/\\s+/)\n .map((x) => parseInt(x, 10))\n .filter(_.isInteger)\n .map((x) => `${x}`);\n } catch (err) {\n log.debug(`'pgrep ${args.join(' ')}' didn't detect any matching processes. Return code: ${err.code}`);\n return [];\n }\n}\n\nasync function killAppUsingPattern (pgrepPattern) {\n const signals = [2, 15, 9];\n for (const signal of signals) {\n const matchedPids = await getPIDsUsingPattern(pgrepPattern);\n if (_.isEmpty(matchedPids)) {\n return;\n }\n const args = [`-${signal}`, ...matchedPids];\n try {\n await exec('kill', args);\n } catch (err) {\n log.debug(`kill ${args.join(' ')} -> ${err.message}`);\n }\n if (signal === _.last(signals)) {\n // there is no need to wait after SIGKILL\n return;\n }\n try {\n await waitForCondition(async () => {\n const pidCheckPromises = matchedPids\n .map((pid) => exec('kill', ['-0', pid])\n // the process is still alive\n .then(() => false)\n // the process is dead\n .catch(() => true)\n );\n return (await B.all(pidCheckPromises))\n .every((x) => x === true);\n }, {\n waitMs: 1000,\n intervalMs: 100,\n });\n return;\n } catch (ign) {\n // try the next signal\n }\n }\n}\n\n/**\n * Return true if the platformName is tvOS\n * @param {string} platformName The name of the platorm\n * @returns {boolean} Return true if the platformName is tvOS\n */\nfunction isTvOS (platformName) {\n return _.toLower(platformName) === _.toLower(PLATFORM_NAME_TVOS);\n}\n\nasync function replaceInFile (file, find, replace) {\n let contents = await fs.readFile(file, 'utf8');\n\n let newContents = contents.replace(find, replace);\n if (newContents !== contents) {\n await fs.writeFile(file, newContents, 'utf8');\n }\n}\n\n/**\n * Update WebDriverAgentRunner project bundle ID with newBundleId.\n * This method assumes project file is in the correct state.\n * @param {string} agentPath - Path to the .xcodeproj directory.\n * @param {string} newBundleId the new bundle ID used to update.\n */\nasync function updateProjectFile (agentPath, newBundleId) {\n let projectFilePath = path.resolve(agentPath, PROJECT_FILE);\n try {\n // Assuming projectFilePath is in the correct state, create .old from projectFilePath\n await fs.copyFile(projectFilePath, `${projectFilePath}.old`);\n await replaceInFile(projectFilePath, new RegExp(_.escapeRegExp(WDA_RUNNER_BUNDLE_ID), 'g'), newBundleId); // eslint-disable-line no-useless-escape\n log.debug(`Successfully updated '${projectFilePath}' with bundle id '${newBundleId}'`);\n } catch (err) {\n log.debug(`Error updating project file: ${err.message}`);\n log.warn(`Unable to update project file '${projectFilePath}' with ` +\n `bundle id '${newBundleId}'. WebDriverAgent may not start`);\n }\n}\n\n/**\n * Reset WebDriverAgentRunner project bundle ID to correct state.\n * @param {string} agentPath - Path to the .xcodeproj directory.\n */\nasync function resetProjectFile (agentPath) {\n const projectFilePath = path.join(agentPath, PROJECT_FILE);\n try {\n // restore projectFilePath from .old file\n if (!await fs.exists(`${projectFilePath}.old`)) {\n return; // no need to reset\n }\n await fs.mv(`${projectFilePath}.old`, projectFilePath);\n log.debug(`Successfully reset '${projectFilePath}' with bundle id '${WDA_RUNNER_BUNDLE_ID}'`);\n } catch (err) {\n log.debug(`Error resetting project file: ${err.message}`);\n log.warn(`Unable to reset project file '${projectFilePath}' with ` +\n `bundle id '${WDA_RUNNER_BUNDLE_ID}'. WebDriverAgent has been ` +\n `modified and not returned to the original state.`);\n }\n}\n\nasync function setRealDeviceSecurity (keychainPath, keychainPassword) {\n log.debug('Setting security for iOS device');\n await exec('security', ['-v', 'list-keychains', '-s', keychainPath]);\n await exec('security', ['-v', 'unlock-keychain', '-p', keychainPassword, keychainPath]);\n await exec('security', ['set-keychain-settings', '-t', '3600', '-l', keychainPath]);\n}\n\nasync function generateXcodeConfigFile (orgId, signingId) {\n log.debug(`Generating xcode config file for orgId '${orgId}' and signingId ` +\n `'${signingId}'`);\n const contents = `DEVELOPMENT_TEAM = ${orgId}\nCODE_SIGN_IDENTITY = ${signingId}\n`;\n const xcconfigPath = await tempDir.path('appium-temp.xcconfig');\n log.debug(`Writing xcode config file to ${xcconfigPath}`);\n await fs.writeFile(xcconfigPath, contents, 'utf8');\n return xcconfigPath;\n}\n\n/**\n * Information of the device under test\n * @typedef {Object} DeviceInfo\n * @property {string} isRealDevice - Equals to true if the current device is a real device\n * @property {string} udid - The device UDID.\n * @property {string} platformVersion - The platform version of OS.\n * @property {string} platformName - The platform name of iOS, tvOS\n*/\n/**\n * Creates xctestrun file per device & platform version.\n * We expects to have WebDriverAgentRunner_iphoneos${sdkVersion|platformVersion}-arm64.xctestrun for real device\n * and WebDriverAgentRunner_iphonesimulator${sdkVersion|platformVersion}-x86_64.xctestrun for simulator located @bootstrapPath\n * Newer Xcode (Xcode 10.0 at least) generate xctestrun file following sdkVersion.\n * e.g. Xcode which has iOS SDK Version 12.2 generate WebDriverAgentRunner_iphonesimulator.2-x86_64.xctestrun\n * even if the cap has platform version 11.4\n *\n * @param {DeviceInfo} deviceInfo\n * @param {string} sdkVersion - The Xcode SDK version of OS.\n * @param {string} bootstrapPath - The folder path containing xctestrun file.\n * @param {string} wdaRemotePort - The remote port WDA is listening on.\n * @return {string} returns xctestrunFilePath for given device\n * @throws if WebDriverAgentRunner_iphoneos${sdkVersion|platformVersion}-arm64.xctestrun for real device\n * or WebDriverAgentRunner_iphonesimulator${sdkVersion|platformVersion}-x86_64.xctestrun for simulator is not found @bootstrapPath,\n * then it will throw file not found exception\n */\nasync function setXctestrunFile (deviceInfo, sdkVersion, bootstrapPath, wdaRemotePort) {\n const xctestrunFilePath = await getXctestrunFilePath(deviceInfo, sdkVersion, bootstrapPath);\n const xctestRunContent = await plist.parsePlistFile(xctestrunFilePath);\n const updateWDAPort = getAdditionalRunContent(deviceInfo.platformName, wdaRemotePort);\n const newXctestRunContent = _.merge(xctestRunContent, updateWDAPort);\n await plist.updatePlistFile(xctestrunFilePath, newXctestRunContent, true);\n\n return xctestrunFilePath;\n}\n\n/**\n * Return the WDA object which appends existing xctest runner content\n * @param {string} platformName - The name of the platform\n * @param {string} version - The Xcode SDK version of OS.\n * @return {object} returns a runner object which has USE_PORT\n */\nfunction getAdditionalRunContent (platformName, wdaRemotePort) {\n const runner = `WebDriverAgentRunner${isTvOS(platformName) ? '_tvOS' : ''}`;\n\n return {\n [runner]: {\n EnvironmentVariables: {\n // USE_PORT must be 'string'\n USE_PORT: `${wdaRemotePort}`\n }\n }\n };\n}\n\n/**\n * Return the path of xctestrun if it exists\n * @param {DeviceInfo} deviceInfo\n * @param {string} sdkVersion - The Xcode SDK version of OS.\n * @param {string} bootstrapPath - The folder path containing xctestrun file.\n */\nasync function getXctestrunFilePath (deviceInfo, sdkVersion, bootstrapPath) {\n // First try the SDK path, for Xcode 10 (at least)\n const sdkBased = [\n path.resolve(bootstrapPath, `${deviceInfo.udid}_${sdkVersion}.xctestrun`),\n sdkVersion,\n ];\n // Next try Platform path, for earlier Xcode versions\n const platformBased = [\n path.resolve(bootstrapPath, `${deviceInfo.udid}_${deviceInfo.platformVersion}.xctestrun`),\n deviceInfo.platformVersion,\n ];\n\n for (const [filePath, version] of [sdkBased, platformBased]) {\n if (await fs.exists(filePath)) {\n log.info(`Using '${filePath}' as xctestrun file`);\n return filePath;\n }\n const originalXctestrunFile = path.resolve(bootstrapPath, getXctestrunFileName(deviceInfo, version));\n if (await fs.exists(originalXctestrunFile)) {\n // If this is first time run for given device, then first generate xctestrun file for device.\n // We need to have a xctestrun file **per device** because we cant not have same wda port for all devices.\n await fs.copyFile(originalXctestrunFile, filePath);\n log.info(`Using '${filePath}' as xctestrun file copied by '${originalXctestrunFile}'`);\n return filePath;\n }\n }\n\n log.errorAndThrow(`If you are using 'useXctestrunFile' capability then you ` +\n `need to have a xctestrun file (expected: ` +\n `'${path.resolve(bootstrapPath, getXctestrunFileName(deviceInfo, sdkVersion))}')`);\n}\n\n\n/**\n * Return the name of xctestrun file\n * @param {DeviceInfo} deviceInfo\n * @param {string} version - The Xcode SDK version of OS.\n * @return {string} returns xctestrunFilePath for given device\n */\nfunction getXctestrunFileName (deviceInfo, version) {\n return isTvOS(deviceInfo.platformName)\n ? `WebDriverAgentRunner_tvOS_appletv${deviceInfo.isRealDevice ? `os${version}-arm64` : `simulator${version}-x86_64`}.xctestrun`\n : `WebDriverAgentRunner_iphone${deviceInfo.isRealDevice ? `os${version}-arm64` : `simulator${version}-x86_64`}.xctestrun`;\n}\n\nasync function killProcess (name, proc) {\n if (!proc || !proc.isRunning) {\n return;\n }\n\n log.info(`Shutting down '${name}' process (pid '${proc.proc.pid}')`);\n\n log.info(`Sending 'SIGTERM'...`);\n try {\n await proc.stop('SIGTERM', 1000);\n return;\n } catch (err) {\n if (!err.message.includes(`Process didn't end after`)) {\n throw err;\n }\n log.debug(`${name} process did not end in a timely fashion: '${err.message}'.`);\n }\n\n log.info(`Sending 'SIGKILL'...`);\n try {\n await proc.stop('SIGKILL');\n } catch (err) {\n if (err.message.includes('not currently running')) {\n // the process ended but for some reason we were not informed\n return;\n }\n throw err;\n }\n}\n\n/**\n * Generate a random integer.\n *\n * @return {number} A random integer number in range [low, hight). `low`` is inclusive and `high` is exclusive.\n */\nfunction randomInt (low, high) {\n return Math.floor(Math.random() * (high - low) + low);\n}\n\n/**\n * Retrieves WDA upgrade timestamp\n *\n * @return {?number} The UNIX timestamp of the package manifest. The manifest only gets modified on\n * package upgrade.\n */\nasync function getWDAUpgradeTimestamp () {\n const packageManifest = path.resolve(getModuleRoot(), 'package.json');\n if (!await fs.exists(packageManifest)) {\n return null;\n }\n const {mtime} = await fs.stat(packageManifest);\n return mtime.getTime();\n}\n\n/**\n * Kills running XCTest processes for the particular device.\n *\n * @param {string} udid - The device UDID.\n * @param {boolean} isSimulator - Equals to true if the current device is a Simulator\n */\nasync function resetTestProcesses (udid, isSimulator) {\n const processPatterns = [`xcodebuild.*${udid}`];\n if (isSimulator) {\n processPatterns.push(`${udid}.*XCTRunner`);\n // The pattern to find in case idb was used\n processPatterns.push(`xctest.*${udid}`);\n }\n log.debug(`Killing running processes '${processPatterns.join(', ')}' for the device ${udid}...`);\n await B.all(processPatterns.map(killAppUsingPattern));\n}\n\n/**\n * Get the IDs of processes listening on the particular system port.\n * It is also possible to apply additional filtering based on the\n * process command line.\n *\n * @param {string|number} port - The port number.\n * @param {?Function} filteringFunc - Optional lambda function, which\n * receives command line string of the particular process\n * listening on given port, and is expected to return\n * either true or false to include/exclude the corresponding PID\n * from the resulting array.\n * @returns {Array<string>} - the list of matched process ids.\n */\nasync function getPIDsListeningOnPort (port, filteringFunc = null) {\n const result = [];\n try {\n // This only works since Mac OS X El Capitan\n const {stdout} = await exec('lsof', ['-ti', `tcp:${port}`]);\n result.push(...(stdout.trim().split(/\\n+/)));\n } catch (e) {\n if (e.code !== 1) {\n // code 1 means no processes. Other errors need reporting\n log.debug(`Error getting processes listening on port '${port}': ${e.stderr || e.message}`);\n }\n return result;\n }\n\n if (!_.isFunction(filteringFunc)) {\n return result;\n }\n return await B.filter(result, async (pid) => {\n let stdout;\n try {\n ({stdout} = await exec('ps', ['-p', pid, '-o', 'command']));\n } catch (e) {\n if (e.code === 1) {\n // The process does not exist anymore, there's nothing to filter\n return false;\n }\n throw e;\n }\n return await filteringFunc(stdout);\n });\n}\n\nexport { updateProjectFile, resetProjectFile, setRealDeviceSecurity,\n getAdditionalRunContent, getXctestrunFileName, generateXcodeConfigFile,\n setXctestrunFile, getXctestrunFilePath, killProcess, randomInt,\n getWDAUpgradeTimestamp, resetTestProcesses,\n getPIDsListeningOnPort, killAppUsingPattern, isTvOS\n};\n"],"mappings":"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"}
@@ -355,4 +355,4 @@ class WebDriverAgent {
355
355
  exports.WebDriverAgent = WebDriverAgent;
356
356
  var _default = WebDriverAgent;
357
357
  exports.default = _default;
358
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXREFfTEFVTkNIX1RJTUVPVVQiLCJXREFfQUdFTlRfUE9SVCIsIldEQV9DRl9CVU5ETEVfTkFNRSIsIlNIQVJFRF9SRVNPVVJDRVNfR1VBUkQiLCJBc3luY0xvY2siLCJXZWJEcml2ZXJBZ2VudCIsImNvbnN0cnVjdG9yIiwieGNvZGVWZXJzaW9uIiwiYXJncyIsImxvZyIsIl8iLCJjbG9uZSIsImRlZmF1bHRMb2dnZXIiLCJkZXZpY2UiLCJwbGF0Zm9ybVZlcnNpb24iLCJwbGF0Zm9ybU5hbWUiLCJpb3NTZGtWZXJzaW9uIiwiaG9zdCIsImlzUmVhbERldmljZSIsInJlYWxEZXZpY2UiLCJpZGIiLCJ3ZGFCdW5kbGVQYXRoIiwic2V0V0RBUGF0aHMiLCJib290c3RyYXBQYXRoIiwiYWdlbnRQYXRoIiwid2RhTG9jYWxQb3J0Iiwid2RhUmVtb3RlUG9ydCIsIndkYUJhc2VVcmwiLCJXREFfQkFTRV9VUkwiLCJwcmVidWlsZFdEQSIsIndlYkRyaXZlckFnZW50VXJsIiwic3RhcnRlZCIsIndkYUNvbm5lY3Rpb25UaW1lb3V0IiwidXNlWGN0ZXN0cnVuRmlsZSIsInVzZVByZWJ1aWx0V0RBIiwiZGVyaXZlZERhdGFQYXRoIiwibWpwZWdTZXJ2ZXJQb3J0IiwidXBkYXRlZFdEQUJ1bmRsZUlkIiwieGNvZGVidWlsZCIsIlhjb2RlQnVpbGQiLCJzaG93WGNvZGVMb2ciLCJ4Y29kZUNvbmZpZ0ZpbGUiLCJ4Y29kZU9yZ0lkIiwieGNvZGVTaWduaW5nSWQiLCJrZXljaGFpblBhdGgiLCJrZXljaGFpblBhc3N3b3JkIiwidXNlU2ltcGxlQnVpbGRUZXN0IiwibGF1bmNoVGltZW91dCIsIndkYUxhdW5jaFRpbWVvdXQiLCJhbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiIsInJlc3VsdEJ1bmRsZVBhdGgiLCJyZXN1bHRCdW5kbGVWZXJzaW9uIiwiQk9PVFNUUkFQX1BBVEgiLCJpbmZvIiwicGF0aCIsInJlc29sdmUiLCJjbGVhbnVwT2Jzb2xldGVQcm9jZXNzZXMiLCJvYnNvbGV0ZVBpZHMiLCJnZXRQSURzTGlzdGVuaW5nT25Qb3J0IiwidXJsIiwicG9ydCIsImNtZExpbmUiLCJpbmNsdWRlcyIsInRvTG93ZXJDYXNlIiwidWRpZCIsImlzRW1wdHkiLCJkZWJ1ZyIsImxlbmd0aCIsImV4ZWMiLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJpc1J1bm5pbmciLCJnZXRTdGF0dXMiLCJiYXNlUGF0aCIsIm5vU2Vzc2lvblByb3h5IiwiTm9TZXNzaW9uUHJveHkiLCJzZXJ2ZXIiLCJob3N0bmFtZSIsImJhc2UiLCJ0aW1lb3V0IiwiY29tbWFuZCIsImVyciIsImhyZWYiLCJ1bmluc3RhbGwiLCJidW5kbGVJZHMiLCJnZXRVc2VySW5zdGFsbGVkQnVuZGxlSWRzQnlCdW5kbGVOYW1lIiwiYnVuZGxlSWQiLCJyZW1vdmVBcHAiLCJfY2xlYW51cFByb2plY3RJZkZyZXNoIiwiaG9tZUZvbGRlciIsInByb2Nlc3MiLCJlbnYiLCJIT01FIiwiY3VycmVudFVwZ3JhZGVUaW1lc3RhbXAiLCJnZXRXREFVcGdyYWRlVGltZXN0YW1wIiwiaXNJbnRlZ2VyIiwidGltZXN0YW1wUGF0aCIsIldEQV9VUEdSQURFX1RJTUVTVEFNUF9QQVRIIiwiZGlkVGltZXN0YW1wRXhpc3QiLCJmcyIsImV4aXN0cyIsImFjY2VzcyIsIldfT0siLCJpZ24iLCJyZWNlbnRVcGdyYWRlVGltZXN0YW1wIiwicGFyc2VJbnQiLCJyZWFkRmlsZSIsIm1rZGlycCIsImRpcm5hbWUiLCJ3cml0ZUZpbGUiLCJjbGVhblByb2plY3QiLCJsYXVuY2giLCJzZXNzaW9uSWQiLCJzZXR1cFByb3hpZXMiLCJFcnJvciIsInN5bmNocm9uaXphdGlvbktleSIsIm5vcm1hbGl6ZSIsImFjcXVpcmUiLCJyZXNldFRlc3RQcm9jZXNzZXMiLCJzdGFydFdpdGhJREIiLCJpbml0IiwicHJlYnVpbGQiLCJzdGFydCIsIndkYUJ1bmRsZUlkIiwidGVzdEJ1bmRsZUlkIiwicHJlcGFyZVdEQSIsIlVTRV9QT1JUIiwiV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVIiLCJNSlBFR19TRVJWRVJfUE9SVCIsInJ1blhDVUlUZXN0IiwicGFyc2VCdW5kbGVJZCIsImluZm9QbGlzdFBhdGgiLCJqb2luIiwiaW5mb1BsaXN0IiwicGxpc3QiLCJwYXJzZVBsaXN0IiwiQ0ZCdW5kbGVJZGVudGlmaWVyIiwiZmV0Y2hXREFCdW5kbGUiLCJpc0FwcEluc3RhbGxlZCIsImluc3RhbGxBcHAiLCJpbnN0YWxsWENUZXN0QnVuZGxlIiwiYnVuZGxlV0RBU2ltIiwid2RhQnVuZGxlUGF0aHMiLCJnbG9iIiwiV0RBX1JVTk5FUl9BUFAiLCJhYnNvbHV0ZSIsImlzU291cmNlRnJlc2giLCJleGlzdHNQcm9taXNlcyIsInNlcCIsIm1hcCIsInN1YlBhdGgiLCJCIiwiYWxsIiwic29tZSIsInYiLCJwcm94eU9wdHMiLCJrZWVwQWxpdmUiLCJqd3Byb3h5IiwiSldQcm94eSIsInByb3h5UmVxUmVzIiwiYmluZCIsInF1aXQiLCJyZXNldCIsIl91cmwiLCJwYXJzZSIsInByb3RvY29sIiwiZnVsbHlTdGFydGVkIiwicmV0cmlldmVEZXJpdmVkRGF0YVBhdGgiLCJzZXR1cENhY2hpbmciLCJzdGF0dXMiLCJidWlsZCIsInByb2R1Y3RCdW5kbGVJZGVudGlmaWVyIiwidXBncmFkZWRBdCIsInV0aWwiLCJoYXNWYWx1ZSIsIldEQV9SVU5ORVJfQlVORExFX0lEIiwiYWN0dWFsVXBncmFkZVRpbWVzdGFtcCIsInRvTG93ZXIiLCJxdWl0QW5kVW5pbnN0YWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3dlYmRyaXZlcmFnZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IEpXUHJveHkgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IGZzLCB1dGlsLCBwbGlzdCwgbWtkaXJwIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBkZWZhdWx0TG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IE5vU2Vzc2lvblByb3h5IH0gZnJvbSAnLi9uby1zZXNzaW9uLXByb3h5JztcbmltcG9ydCB7XG4gIGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAsIHJlc2V0VGVzdFByb2Nlc3NlcywgZ2V0UElEc0xpc3RlbmluZ09uUG9ydCwgQk9PVFNUUkFQX1BBVEhcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgWGNvZGVCdWlsZCBmcm9tICcuL3hjb2RlYnVpbGQnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgYnVuZGxlV0RBU2ltIH0gZnJvbSAnLi9jaGVjay1kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHtcbiAgV0RBX1JVTk5FUl9CVU5ETEVfSUQsIFdEQV9SVU5ORVJfQVBQLCBXREFfQkFTRV9VUkwsIFdEQV9VUEdSQURFX1RJTUVTVEFNUF9QQVRILFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmNvbnN0IFdEQV9MQVVOQ0hfVElNRU9VVCA9IDYwICogMTAwMDtcbmNvbnN0IFdEQV9BR0VOVF9QT1JUID0gODEwMDtcbmNvbnN0IFdEQV9DRl9CVU5ETEVfTkFNRSA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lci1SdW5uZXInO1xuY29uc3QgU0hBUkVEX1JFU09VUkNFU19HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcblxuY2xhc3MgV2ViRHJpdmVyQWdlbnQge1xuICBjb25zdHJ1Y3RvciAoeGNvZGVWZXJzaW9uLCBhcmdzID0ge30sIGxvZyA9IG51bGwpIHtcbiAgICB0aGlzLnhjb2RlVmVyc2lvbiA9IHhjb2RlVmVyc2lvbjtcblxuICAgIHRoaXMuYXJncyA9IF8uY2xvbmUoYXJncyk7XG4gICAgdGhpcy5sb2cgPSBsb2cgPz8gZGVmYXVsdExvZ2dlcjtcblxuICAgIHRoaXMuZGV2aWNlID0gYXJncy5kZXZpY2U7XG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcbiAgICB0aGlzLmhvc3QgPSBhcmdzLmhvc3Q7XG4gICAgdGhpcy5pc1JlYWxEZXZpY2UgPSAhIWFyZ3MucmVhbERldmljZTtcbiAgICB0aGlzLmlkYiA9IChhcmdzLmRldmljZSB8fCB7fSkuaWRiO1xuICAgIHRoaXMud2RhQnVuZGxlUGF0aCA9IGFyZ3Mud2RhQnVuZGxlUGF0aDtcblxuICAgIHRoaXMuc2V0V0RBUGF0aHMoYXJncy5ib290c3RyYXBQYXRoLCBhcmdzLmFnZW50UGF0aCk7XG5cbiAgICB0aGlzLndkYUxvY2FsUG9ydCA9IGFyZ3Mud2RhTG9jYWxQb3J0O1xuICAgIHRoaXMud2RhUmVtb3RlUG9ydCA9IGFyZ3Mud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JUO1xuICAgIHRoaXMud2RhQmFzZVVybCA9IGFyZ3Mud2RhQmFzZVVybCB8fCBXREFfQkFTRV9VUkw7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcblxuICAgIHRoaXMud2ViRHJpdmVyQWdlbnRVcmwgPSBhcmdzLndlYkRyaXZlckFnZW50VXJsO1xuXG4gICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLndkYUNvbm5lY3Rpb25UaW1lb3V0ID0gYXJncy53ZGFDb25uZWN0aW9uVGltZW91dDtcblxuICAgIHRoaXMudXNlWGN0ZXN0cnVuRmlsZSA9IGFyZ3MudXNlWGN0ZXN0cnVuRmlsZTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuICAgIHRoaXMubWpwZWdTZXJ2ZXJQb3J0ID0gYXJncy5tanBlZ1NlcnZlclBvcnQ7XG5cbiAgICB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCA9IGFyZ3MudXBkYXRlZFdEQUJ1bmRsZUlkO1xuXG4gICAgdGhpcy54Y29kZWJ1aWxkID0gbmV3IFhjb2RlQnVpbGQodGhpcy54Y29kZVZlcnNpb24sIHRoaXMuZGV2aWNlLCB7XG4gICAgICBwbGF0Zm9ybVZlcnNpb246IHRoaXMucGxhdGZvcm1WZXJzaW9uLFxuICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZSxcbiAgICAgIGlvc1Nka1ZlcnNpb246IHRoaXMuaW9zU2RrVmVyc2lvbixcbiAgICAgIGFnZW50UGF0aDogdGhpcy5hZ2VudFBhdGgsXG4gICAgICBib290c3RyYXBQYXRoOiB0aGlzLmJvb3RzdHJhcFBhdGgsXG4gICAgICByZWFsRGV2aWNlOiB0aGlzLmlzUmVhbERldmljZSxcbiAgICAgIHNob3dYY29kZUxvZzogYXJncy5zaG93WGNvZGVMb2csXG4gICAgICB4Y29kZUNvbmZpZ0ZpbGU6IGFyZ3MueGNvZGVDb25maWdGaWxlLFxuICAgICAgeGNvZGVPcmdJZDogYXJncy54Y29kZU9yZ0lkLFxuICAgICAgeGNvZGVTaWduaW5nSWQ6IGFyZ3MueGNvZGVTaWduaW5nSWQsXG4gICAgICBrZXljaGFpblBhdGg6IGFyZ3Mua2V5Y2hhaW5QYXRoLFxuICAgICAga2V5Y2hhaW5QYXNzd29yZDogYXJncy5rZXljaGFpblBhc3N3b3JkLFxuICAgICAgdXNlU2ltcGxlQnVpbGRUZXN0OiBhcmdzLnVzZVNpbXBsZUJ1aWxkVGVzdCxcbiAgICAgIHVzZVByZWJ1aWx0V0RBOiBhcmdzLnVzZVByZWJ1aWx0V0RBLFxuICAgICAgdXBkYXRlZFdEQUJ1bmRsZUlkOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCxcbiAgICAgIGxhdW5jaFRpbWVvdXQ6IGFyZ3Mud2RhTGF1bmNoVGltZW91dCB8fCBXREFfTEFVTkNIX1RJTUVPVVQsXG4gICAgICB3ZGFSZW1vdGVQb3J0OiB0aGlzLndkYVJlbW90ZVBvcnQsXG4gICAgICB1c2VYY3Rlc3RydW5GaWxlOiB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUsXG4gICAgICBkZXJpdmVkRGF0YVBhdGg6IGFyZ3MuZGVyaXZlZERhdGFQYXRoLFxuICAgICAgbWpwZWdTZXJ2ZXJQb3J0OiB0aGlzLm1qcGVnU2VydmVyUG9ydCxcbiAgICAgIGFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uOiBhcmdzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uLFxuICAgICAgcmVzdWx0QnVuZGxlUGF0aDogYXJncy5yZXN1bHRCdW5kbGVQYXRoLFxuICAgICAgcmVzdWx0QnVuZGxlVmVyc2lvbjogYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uLFxuICAgIH0sIHRoaXMubG9nKTtcbiAgfVxuXG4gIHNldFdEQVBhdGhzIChib290c3RyYXBQYXRoLCBhZ2VudFBhdGgpIHtcbiAgICAvLyBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgcGxhY2UgZm9yIFdEQS4gVGhpcyBpcyB1bmRvY3VtZW50ZWQgYW5kXG4gICAgLy8gb25seSBoZXJlIGZvciB0aGUgcHVycG9zZXMgb2YgdGVzdGluZyBkZXZlbG9wbWVudCBvZiBXREFcbiAgICB0aGlzLmJvb3RzdHJhcFBhdGggPSBib290c3RyYXBQYXRoIHx8IEJPT1RTVFJBUF9QQVRIO1xuICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIFdEQSBwYXRoOiAnJHt0aGlzLmJvb3RzdHJhcFBhdGh9J2ApO1xuXG4gICAgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2UgbmVlZCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgYWdlbnRQYXRoIHRvb1xuICAgIHRoaXMuYWdlbnRQYXRoID0gYWdlbnRQYXRoIHx8IHBhdGgucmVzb2x2ZSh0aGlzLmJvb3RzdHJhcFBhdGgsICdXZWJEcml2ZXJBZ2VudC54Y29kZXByb2onKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBVc2luZyBXREEgYWdlbnQ6ICcke3RoaXMuYWdlbnRQYXRofSdgKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFudXBPYnNvbGV0ZVByb2Nlc3NlcyAoKSB7XG4gICAgY29uc3Qgb2Jzb2xldGVQaWRzID0gYXdhaXQgZ2V0UElEc0xpc3RlbmluZ09uUG9ydCh0aGlzLnVybC5wb3J0LFxuICAgICAgKGNtZExpbmUpID0+IGNtZExpbmUuaW5jbHVkZXMoJy9XZWJEcml2ZXJBZ2VudFJ1bm5lcicpICYmXG4gICAgICAgICFjbWRMaW5lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5kZXZpY2UudWRpZC50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICBpZiAoXy5pc0VtcHR5KG9ic29sZXRlUGlkcykpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBObyBvYnNvbGV0ZSBjYWNoZWQgcHJvY2Vzc2VzIGZyb20gcHJldmlvdXMgV0RBIHNlc3Npb25zIGAgK1xuICAgICAgICBgbGlzdGVuaW5nIG9uIHBvcnQgJHt0aGlzLnVybC5wb3J0fSBoYXZlIGJlZW4gZm91bmRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZy5pbmZvKGBEZXRlY3RlZCAke29ic29sZXRlUGlkcy5sZW5ndGh9IG9ic29sZXRlIGNhY2hlZCBwcm9jZXNzJHtvYnNvbGV0ZVBpZHMubGVuZ3RoID09PSAxID8gJycgOiAnZXMnfSBgICtcbiAgICAgIGBmcm9tIHByZXZpb3VzIFdEQSBzZXNzaW9ucy4gQ2xlYW5pbmcgdGhlbSB1cGApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKCdraWxsJywgb2Jzb2xldGVQaWRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBGYWlsZWQgdG8ga2lsbCBvYnNvbGV0ZSBjYWNoZWQgcHJvY2VzcyR7b2Jzb2xldGVQaWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ2VzJ30gJyR7b2Jzb2xldGVQaWRzfScuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpZiBXREEgaXMgcnVubmluZyBvciBub3RcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBXREEgaXMgcnVubmluZ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGludmFsaWQgcmVzcG9uc2UgY29kZSBvciBib2R5XG4gICAqL1xuICBhc3luYyBpc1J1bm5pbmcgKCkge1xuICAgIHJldHVybiAhIShhd2FpdCB0aGlzLmdldFN0YXR1cygpKTtcbiAgfVxuXG4gIGdldCBiYXNlUGF0aCAoKSB7XG4gICAgaWYgKHRoaXMudXJsLnBhdGggPT09ICcvJykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cmwucGF0aCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gY3VycmVudCBydW5uaW5nIFdEQSdzIHN0YXR1cyBsaWtlIGJlbG93XG4gICAqIHtcbiAgICogICBcInN0YXRlXCI6IFwic3VjY2Vzc1wiLFxuICAgKiAgIFwib3NcIjoge1xuICAgKiAgICAgXCJuYW1lXCI6IFwiaU9TXCIsXG4gICAqICAgICBcInZlcnNpb25cIjogXCIxMS40XCIsXG4gICAqICAgICBcInNka1ZlcnNpb25cIjogXCIxMS4zXCJcbiAgICogICB9LFxuICAgKiAgIFwiaW9zXCI6IHtcbiAgICogICAgIFwic2ltdWxhdG9yVmVyc2lvblwiOiBcIjExLjRcIixcbiAgICogICAgIFwiaXBcIjogXCIxNzIuMjU0Ljk5LjM0XCJcbiAgICogICB9LFxuICAgKiAgIFwiYnVpbGRcIjoge1xuICAgKiAgICAgXCJ0aW1lXCI6IFwiSnVuIDI0IDIwMTggMTc6MDg6MjFcIixcbiAgICogICAgIFwicHJvZHVjdEJ1bmRsZUlkZW50aWZpZXJcIjogXCJjb20uZmFjZWJvb2suV2ViRHJpdmVyQWdlbnRSdW5uZXJcIlxuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBTdGF0ZSBPYmplY3RcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBpbnZhbGlkIHJlc3BvbnNlIGNvZGUgb3IgYm9keVxuICAgKi9cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHtcbiAgICBjb25zdCBub1Nlc3Npb25Qcm94eSA9IG5ldyBOb1Nlc3Npb25Qcm94eSh7XG4gICAgICBzZXJ2ZXI6IHRoaXMudXJsLmhvc3RuYW1lLFxuICAgICAgcG9ydDogdGhpcy51cmwucG9ydCxcbiAgICAgIGJhc2U6IHRoaXMuYmFzZVBhdGgsXG4gICAgICB0aW1lb3V0OiAzMDAwLFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgbm9TZXNzaW9uUHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBXREEgaXMgbm90IGxpc3RlbmluZyBhdCAnJHt0aGlzLnVybC5ocmVmfSdgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmluc3RhbGwgV0RBcyBmcm9tIHRoZSB0ZXN0IGRldmljZS5cbiAgICogT3ZlciBYY29kZSAxMSwgbXVsdGlwbGUgV0RBIGNhbiBiZSBpbiB0aGUgZGV2aWNlIHNpbmNlIFhjb2RlIDExIGdlbmVyYXRlcyBkaWZmZXJlbnQgV0RBLlxuICAgKiBBcHBpdW0gZG9lcyBub3QgZXhwZWN0IG11bHRpcGxlIFdEQXMgYXJlIHJ1bm5pbmcgb24gYSBkZXZpY2UuXG4gICAqL1xuICBhc3luYyB1bmluc3RhbGwgKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBidW5kbGVJZHMgPSBhd2FpdCB0aGlzLmRldmljZS5nZXRVc2VySW5zdGFsbGVkQnVuZGxlSWRzQnlCdW5kbGVOYW1lKFdEQV9DRl9CVU5ETEVfTkFNRSk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGJ1bmRsZUlkcykpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ05vIFdEQXMgb24gdGhlIGRldmljZS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgVW5pbnN0YWxsaW5nIFdEQXM6ICcke2J1bmRsZUlkc30nYCk7XG4gICAgICBmb3IgKGNvbnN0IGJ1bmRsZUlkIG9mIGJ1bmRsZUlkcykge1xuICAgICAgICBhd2FpdCB0aGlzLmRldmljZS5yZW1vdmVBcHAoYnVuZGxlSWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGUpO1xuICAgICAgdGhpcy5sb2cud2FybihgV2ViRHJpdmVyQWdlbnQgdW5pbnN0YWxsIGZhaWxlZC4gUGVyaGFwcywgaXQgaXMgYWxyZWFkeSB1bmluc3RhbGxlZD8gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX2NsZWFudXBQcm9qZWN0SWZGcmVzaCAoKSB7XG4gICAgY29uc3QgaG9tZUZvbGRlciA9IHByb2Nlc3MuZW52LkhPTUU7XG4gICAgaWYgKCFob21lRm9sZGVyKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdUaGUgSE9NRSBmb2xkZXIgcGF0aCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRVcGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCgpO1xuICAgIGlmICghXy5pc0ludGVnZXIoY3VycmVudFVwZ3JhZGVUaW1lc3RhbXApKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdJdCBpcyBpbXBvc3NpYmxlIHRvIGRldGVybWluZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBwYWNrYWdlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGltZXN0YW1wUGF0aCA9IHBhdGgucmVzb2x2ZShob21lRm9sZGVyLCBXREFfVVBHUkFERV9USU1FU1RBTVBfUEFUSCk7XG4gICAgY29uc3QgZGlkVGltZXN0YW1wRXhpc3QgPSBhd2FpdCBmcy5leGlzdHModGltZXN0YW1wUGF0aCk7XG4gICAgaWYgKGRpZFRpbWVzdGFtcEV4aXN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3ModGltZXN0YW1wUGF0aCwgZnMuV19PSyk7XG4gICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgdXBncmFkZSB0aW1lc3RhbXAgYXQgJyR7dGltZXN0YW1wUGF0aH0nIGlzIG5vdCB3cml0ZWFibGUuIGAgK1xuICAgICAgICAgIGBTa2lwcGluZyBzb3VyY2VzIGNsZWFudXBgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjZW50VXBncmFkZVRpbWVzdGFtcCA9IHBhcnNlSW50KGF3YWl0IGZzLnJlYWRGaWxlKHRpbWVzdGFtcFBhdGgsICd1dGY4JyksIDEwKTtcbiAgICAgIGlmIChfLmlzSW50ZWdlcihyZWNlbnRVcGdyYWRlVGltZXN0YW1wKSkge1xuICAgICAgICBpZiAocmVjZW50VXBncmFkZVRpbWVzdGFtcCA+PSBjdXJyZW50VXBncmFkZVRpbWVzdGFtcCkge1xuICAgICAgICAgIHRoaXMubG9nLmluZm8oYFdlYkRyaXZlckFnZW50IGRvZXMgbm90IG5lZWQgYSBjbGVhbnVwLiBUaGUgc291cmNlcyBhcmUgdXAgdG8gZGF0ZSBgICtcbiAgICAgICAgICAgIGAoJHtyZWNlbnRVcGdyYWRlVGltZXN0YW1wfSA+PSAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfSlgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgc291cmNlcyBoYXZlIGJlZW4gdXBncmFkZWQgYCArXG4gICAgICAgICAgYCgke3JlY2VudFVwZ3JhZGVUaW1lc3RhbXB9IDwgJHtjdXJyZW50VXBncmFkZVRpbWVzdGFtcH0pYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBUaGUgcmVjZW50IHVwZ3JhZGUgdGltZXN0YW1wIGF0ICcke3RpbWVzdGFtcFBhdGh9JyBpcyBjb3JydXB0ZWQuIFRyeWluZyB0byBmaXggaXRgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbWtkaXJwKHBhdGguZGlybmFtZSh0aW1lc3RhbXBQYXRoKSk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGltZXN0YW1wUGF0aCwgYCR7Y3VycmVudFVwZ3JhZGVUaW1lc3RhbXB9YCwgJ3V0ZjgnKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTdG9yZWQgdGhlIHJlY2VudCBXZWJEcml2ZXJBZ2VudCB1cGdyYWRlIHRpbWVzdGFtcCAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfSBgICtcbiAgICAgICAgYGF0ICcke3RpbWVzdGFtcFBhdGh9J2ApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFVuYWJsZSB0byBjcmVhdGUgdGhlIHJlY2VudCBXZWJEcml2ZXJBZ2VudCB1cGdyYWRlIHRpbWVzdGFtcCBhdCAnJHt0aW1lc3RhbXBQYXRofScuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGlkVGltZXN0YW1wRXhpc3QpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1RoZXJlIGlzIG5vIG5lZWQgdG8gcGVyZm9ybSB0aGUgcHJvamVjdCBjbGVhbnVwLiBBIGZyZXNoIGluc3RhbGwgaGFzIGJlZW4gZGV0ZWN0ZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLmNsZWFuUHJvamVjdCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCBwZXJmb3JtIFdlYkRyaXZlckFnZW50IHByb2plY3QgY2xlYW51cC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gY3VycmVudCBydW5uaW5nIFdEQSdzIHN0YXR1cyBsaWtlIGJlbG93IGFmdGVyIGxhdW5jaGluZyBXREFcbiAgICoge1xuICAgKiAgIFwic3RhdGVcIjogXCJzdWNjZXNzXCIsXG4gICAqICAgXCJvc1wiOiB7XG4gICAqICAgICBcIm5hbWVcIjogXCJpT1NcIixcbiAgICogICAgIFwidmVyc2lvblwiOiBcIjExLjRcIixcbiAgICogICAgIFwic2RrVmVyc2lvblwiOiBcIjExLjNcIlxuICAgKiAgIH0sXG4gICAqICAgXCJpb3NcIjoge1xuICAgKiAgICAgXCJzaW11bGF0b3JWZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJpcFwiOiBcIjE3Mi4yNTQuOTkuMzRcIlxuICAgKiAgIH0sXG4gICAqICAgXCJidWlsZFwiOiB7XG4gICAqICAgICBcInRpbWVcIjogXCJKdW4gMjQgMjAxOCAxNzowODoyMVwiLFxuICAgKiAgICAgXCJwcm9kdWN0QnVuZGxlSWRlbnRpZmllclwiOiBcImNvbS5mYWNlYm9vay5XZWJEcml2ZXJBZ2VudFJ1bm5lclwiXG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWQgTGF1bmNoIFdEQSBhbmQgZXN0YWJsaXNoIHRoZSBzZXNzaW9uIHdpdGggdGhpcyBzZXNzaW9uSWRcbiAgICogQHJldHVybiB7P29iamVjdH0gU3RhdGUgT2JqZWN0XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgaW52YWxpZCByZXNwb25zZSBjb2RlIG9yIGJvZHlcbiAgICovXG4gIGFzeW5jIGxhdW5jaCAoc2Vzc2lvbklkKSB7XG4gICAgaWYgKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIHByb3ZpZGVkIFdlYmRyaXZlckFnZW50IGF0ICcke3RoaXMud2ViRHJpdmVyQWdlbnRVcmx9J2ApO1xuICAgICAgdGhpcy51cmwgPSB0aGlzLndlYkRyaXZlckFnZW50VXJsO1xuICAgICAgdGhpcy5zZXR1cFByb3hpZXMoc2Vzc2lvbklkKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmluZm8oJ0xhdW5jaGluZyBXZWJEcml2ZXJBZ2VudCBvbiB0aGUgZGV2aWNlJyk7XG5cbiAgICB0aGlzLnNldHVwUHJveGllcyhzZXNzaW9uSWQpO1xuXG4gICAgaWYgKCF0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgJiYgIWF3YWl0IGZzLmV4aXN0cyh0aGlzLmFnZW50UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJ5aW5nIHRvIHVzZSBXZWJEcml2ZXJBZ2VudCBwcm9qZWN0IGF0ICcke3RoaXMuYWdlbnRQYXRofScgYnV0IHRoZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAnZmlsZSBkb2VzIG5vdCBleGlzdCcpO1xuICAgIH1cblxuICAgIC8vIHVzZVhjdGVzdHJ1bkZpbGUgYW5kIHVzZVByZWJ1aWx0V0RBIHVzZSBleGlzdGluZyBkZXBlbmRlbmNpZXNcbiAgICAvLyBJdCBkZXBlbmRzIG9uIHVzZXIgc2lkZVxuICAgIGlmICh0aGlzLmlkYiB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgfHwgKHRoaXMuZGVyaXZlZERhdGFQYXRoICYmIHRoaXMudXNlUHJlYnVpbHRXREEpKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdTa2lwcGVkIFdEQSBwcm9qZWN0IGNsZWFudXAgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBjYXBhYmlsaXRpZXMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3luY2hyb25pemF0aW9uS2V5ID0gcGF0aC5ub3JtYWxpemUodGhpcy5ib290c3RyYXBQYXRoKTtcbiAgICAgIGF3YWl0IFNIQVJFRF9SRVNPVVJDRVNfR1VBUkQuYWNxdWlyZShzeW5jaHJvbml6YXRpb25LZXksXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuX2NsZWFudXBQcm9qZWN0SWZGcmVzaCgpKTtcbiAgICB9XG5cbiAgICAvLyBXZSBuZWVkIHRvIHByb3ZpZGUgV0RBIGxvY2FsIHBvcnQsIGJlY2F1c2UgaXQgbWlnaHQgYmUgb2NjdXBpZWRcbiAgICBhd2FpdCByZXNldFRlc3RQcm9jZXNzZXModGhpcy5kZXZpY2UudWRpZCwgIXRoaXMuaXNSZWFsRGV2aWNlKTtcblxuICAgIGlmICh0aGlzLmlkYikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3RhcnRXaXRoSURCKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLmluaXQodGhpcy5ub1Nlc3Npb25Qcm94eSk7XG5cbiAgICAvLyBTdGFydCB0aGUgeGNvZGVidWlsZCBwcm9jZXNzXG4gICAgaWYgKHRoaXMucHJlYnVpbGRXREEpIHtcbiAgICAgIGF3YWl0IHRoaXMueGNvZGVidWlsZC5wcmVidWlsZCgpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnN0YXJ0KCk7XG4gIH1cblxuICBhc3luYyBzdGFydFdpdGhJREIgKCkge1xuICAgIHRoaXMubG9nLmluZm8oJ1dpbGwgbGF1bmNoIFdEQSB3aXRoIGlkYiBpbnN0ZWFkIG9mIHhjb2RlYnVpbGQgc2luY2UgdGhlIGNvcnJlc3BvbmRpbmcgZmxhZyBpcyBlbmFibGVkJyk7XG4gICAgY29uc3Qge3dkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWR9ID0gYXdhaXQgdGhpcy5wcmVwYXJlV0RBKCk7XG4gICAgY29uc3QgZW52ID0ge1xuICAgICAgVVNFX1BPUlQ6IHRoaXMud2RhUmVtb3RlUG9ydCxcbiAgICAgIFdEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCxcbiAgICB9O1xuICAgIGlmICh0aGlzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgZW52Lk1KUEVHX1NFUlZFUl9QT1JUID0gdGhpcy5tanBlZ1NlcnZlclBvcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRiLnJ1blhDVUlUZXN0KHdkYUJ1bmRsZUlkLCB3ZGFCdW5kbGVJZCwgdGVzdEJ1bmRsZUlkLCB7ZW52fSk7XG4gIH1cblxuICBhc3luYyBwYXJzZUJ1bmRsZUlkICh3ZGFCdW5kbGVQYXRoKSB7XG4gICAgY29uc3QgaW5mb1BsaXN0UGF0aCA9IHBhdGguam9pbih3ZGFCdW5kbGVQYXRoLCAnSW5mby5wbGlzdCcpO1xuICAgIGNvbnN0IGluZm9QbGlzdCA9IGF3YWl0IHBsaXN0LnBhcnNlUGxpc3QoYXdhaXQgZnMucmVhZEZpbGUoaW5mb1BsaXN0UGF0aCkpO1xuICAgIGlmICghaW5mb1BsaXN0LkNGQnVuZGxlSWRlbnRpZmllcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBidW5kbGUgaWQgaW4gJyR7aW5mb1BsaXN0UGF0aH0nYCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvUGxpc3QuQ0ZCdW5kbGVJZGVudGlmaWVyO1xuICB9XG5cbiAgYXN5bmMgcHJlcGFyZVdEQSAoKSB7XG4gICAgY29uc3Qgd2RhQnVuZGxlUGF0aCA9IHRoaXMud2RhQnVuZGxlUGF0aCB8fCBhd2FpdCB0aGlzLmZldGNoV0RBQnVuZGxlKCk7XG4gICAgY29uc3Qgd2RhQnVuZGxlSWQgPSBhd2FpdCB0aGlzLnBhcnNlQnVuZGxlSWQod2RhQnVuZGxlUGF0aCk7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmRldmljZS5pc0FwcEluc3RhbGxlZCh3ZGFCdW5kbGVJZCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGV2aWNlLmluc3RhbGxBcHAod2RhQnVuZGxlUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHRlc3RCdW5kbGVJZCA9IGF3YWl0IHRoaXMuaWRiLmluc3RhbGxYQ1Rlc3RCdW5kbGUocGF0aC5qb2luKHdkYUJ1bmRsZVBhdGgsICdQbHVnSW5zJywgJ1dlYkRyaXZlckFnZW50UnVubmVyLnhjdGVzdCcpKTtcbiAgICByZXR1cm4ge3dkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWQsIHdkYUJ1bmRsZVBhdGh9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hXREFCdW5kbGUgKCkge1xuICAgIGlmICghdGhpcy5kZXJpdmVkRGF0YVBhdGgpIHtcbiAgICAgIHJldHVybiBhd2FpdCBidW5kbGVXREFTaW0odGhpcy54Y29kZWJ1aWxkKTtcbiAgICB9XG4gICAgY29uc3Qgd2RhQnVuZGxlUGF0aHMgPSBhd2FpdCBmcy5nbG9iKGAke3RoaXMuZGVyaXZlZERhdGFQYXRofS8qKi8qJHtXREFfUlVOTkVSX0FQUH0vYCwge1xuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKF8uaXNFbXB0eSh3ZGFCdW5kbGVQYXRocykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIFdEQSBidW5kbGUgaW4gJyR7dGhpcy5kZXJpdmVkRGF0YVBhdGh9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gd2RhQnVuZGxlUGF0aHNbMF07XG4gIH1cblxuICBhc3luYyBpc1NvdXJjZUZyZXNoICgpIHtcbiAgICBjb25zdCBleGlzdHNQcm9taXNlcyA9IFtcbiAgICAgICdSZXNvdXJjZXMnLFxuICAgICAgYFJlc291cmNlcyR7cGF0aC5zZXB9V2ViRHJpdmVyQWdlbnQuYnVuZGxlYCxcbiAgICBdLm1hcCgoc3ViUGF0aCkgPT4gZnMuZXhpc3RzKHBhdGgucmVzb2x2ZSh0aGlzLmJvb3RzdHJhcFBhdGgsIHN1YlBhdGgpKSk7XG4gICAgcmV0dXJuIChhd2FpdCBCLmFsbChleGlzdHNQcm9taXNlcykpLnNvbWUoKHYpID0+IHYgPT09IGZhbHNlKTtcbiAgfVxuXG4gIHNldHVwUHJveGllcyAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgcHJveHlPcHRzID0ge1xuICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgIHNlcnZlcjogdGhpcy51cmwuaG9zdG5hbWUsXG4gICAgICBwb3J0OiB0aGlzLnVybC5wb3J0LFxuICAgICAgYmFzZTogdGhpcy5iYXNlUGF0aCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMud2RhQ29ubmVjdGlvblRpbWVvdXQsXG4gICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgfTtcblxuICAgIHRoaXMuandwcm94eSA9IG5ldyBKV1Byb3h5KHByb3h5T3B0cyk7XG4gICAgdGhpcy5qd3Byb3h5LnNlc3Npb25JZCA9IHNlc3Npb25JZDtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcblxuICAgIHRoaXMubm9TZXNzaW9uUHJveHkgPSBuZXcgTm9TZXNzaW9uUHJveHkocHJveHlPcHRzKTtcbiAgfVxuXG4gIGFzeW5jIHF1aXQgKCkge1xuICAgIHRoaXMubG9nLmluZm8oJ1NodXR0aW5nIGRvd24gc3ViLXByb2Nlc3NlcycpO1xuXG4gICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnF1aXQoKTtcbiAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQucmVzZXQoKTtcblxuICAgIGlmICh0aGlzLmp3cHJveHkpIHtcbiAgICAgIHRoaXMuandwcm94eS5zZXNzaW9uSWQgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmFyZ3Mud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgIC8vIGlmIHdlIHBvcHVsYXRlZCB0aGUgdXJsIG91cnNlbHZlcyAoZHVyaW5nIGBzZXR1cENhY2hpbmdgIGNhbGwsIGZvciBpbnN0YW5jZSlcbiAgICAgIC8vIHRoZW4gY2xlYW4gdGhhdCB1cC4gSWYgdGhlIHVybCB3YXMgc3VwcGxpZWQsIHdlIHdhbnQgdG8ga2VlcCBpdFxuICAgICAgdGhpcy53ZWJEcml2ZXJBZ2VudFVybCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHVybCAoKSB7XG4gICAgaWYgKCF0aGlzLl91cmwpIHtcbiAgICAgIGlmICh0aGlzLndlYkRyaXZlckFnZW50VXJsKSB7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZSh0aGlzLndlYkRyaXZlckFnZW50VXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSB0aGlzLndkYUxvY2FsUG9ydCB8fCBXREFfQUdFTlRfUE9SVDtcbiAgICAgICAgY29uc3Qge3Byb3RvY29sLCBob3N0bmFtZX0gPSB1cmwucGFyc2UodGhpcy53ZGFCYXNlVXJsIHx8IFdEQV9CQVNFX1VSTCk7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZShgJHtwcm90b2NvbH0vLyR7aG9zdG5hbWV9OiR7cG9ydH1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIHNldCB1cmwgKF91cmwpIHtcbiAgICB0aGlzLl91cmwgPSB1cmwucGFyc2UoX3VybCk7XG4gIH1cblxuICBnZXQgZnVsbHlTdGFydGVkICgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydGVkO1xuICB9XG5cbiAgc2V0IGZ1bGx5U3RhcnRlZCAoc3RhcnRlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy5zdGFydGVkID0gc3RhcnRlZDtcbiAgfVxuXG4gIGFzeW5jIHJldHJpZXZlRGVyaXZlZERhdGFQYXRoICgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnJldHJpZXZlRGVyaXZlZERhdGFQYXRoKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV1c2UgcnVubmluZyBXREEgaWYgaXQgaGFzIHRoZSBzYW1lIGJ1bmRsZSBpZCB3aXRoIHVwZGF0ZWRXREFCdW5kbGVJZC5cbiAgICogT3IgcmV1c2UgaXQgaWYgaXQgaGFzIHRoZSBkZWZhdWx0IGlkIHdpdGhvdXQgdXBkYXRlZFdEQUJ1bmRsZUlkLlxuICAgKiBVbmluc3RhbGwgaXQgaWYgdGhlIG1ldGhvZCBmYWNlcyBhbiBleGNlcHRpb24gZm9yIHRoZSBhYm92ZSBzaXR1YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cGRhdGVkV0RBQnVuZGxlSWQgQnVuZGxlSWQgeW91J2QgbGlrZSB0byB1c2VcbiAgICovXG4gIGFzeW5jIHNldHVwQ2FjaGluZyAoKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5nZXRTdGF0dXMoKTtcbiAgICBpZiAoIXN0YXR1cyB8fCAhc3RhdHVzLmJ1aWxkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnV0RBIGlzIGN1cnJlbnRseSBub3QgcnVubmluZy4gVGhlcmUgaXMgbm90aGluZyB0byBjYWNoZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyLFxuICAgICAgdXBncmFkZWRBdCxcbiAgICB9ID0gc3RhdHVzLmJ1aWxkO1xuICAgIC8vIGZvciByZWFsIGRldmljZVxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSAmJiB1dGlsLmhhc1ZhbHVlKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSAmJiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCAhPT0gcHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFdpbGwgdW5pbnN0YWxsIHJ1bm5pbmcgV0RBIHNpbmNlIGl0IGhhcyBkaWZmZXJlbnQgYnVuZGxlIGlkLiBUaGUgYWN0dWFsIHZhbHVlIGlzICcke3Byb2R1Y3RCdW5kbGVJZGVudGlmaWVyfScuYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmluc3RhbGwoKTtcbiAgICB9XG4gICAgLy8gZm9yIHNpbXVsYXRvclxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSAmJiAhdXRpbC5oYXNWYWx1ZSh0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCkgJiYgV0RBX1JVTk5FUl9CVU5ETEVfSUQgIT09IHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBXaWxsIHVuaW5zdGFsbCBydW5uaW5nIFdEQSBzaW5jZSBpdHMgYnVuZGxlIGlkIGlzIG5vdCBlcXVhbCB0byB0aGUgZGVmYXVsdCB2YWx1ZSAke1dEQV9SVU5ORVJfQlVORExFX0lEfWApO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsVXBncmFkZVRpbWVzdGFtcCA9IGF3YWl0IGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgVXBncmFkZSB0aW1lc3RhbXAgb2YgdGhlIGN1cnJlbnRseSBidW5kbGVkIFdEQTogJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGBVcGdyYWRlIHRpbWVzdGFtcCBvZiB0aGUgV0RBIG9uIHRoZSBkZXZpY2U6ICR7dXBncmFkZWRBdH1gKTtcbiAgICBpZiAoYWN0dWFsVXBncmFkZVRpbWVzdGFtcCAmJiB1cGdyYWRlZEF0ICYmIF8udG9Mb3dlcihgJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfWApICE9PSBfLnRvTG93ZXIoYCR7dXBncmFkZWRBdH1gKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnV2lsbCB1bmluc3RhbGwgcnVubmluZyBXREEgc2luY2UgaXQgaGFzIGRpZmZlcmVudCB2ZXJzaW9uIGluIGNvbXBhcmlzb24gdG8gdGhlIG9uZSAnICtcbiAgICAgICAgYHdoaWNoIGlzIGJ1bmRsZWQgd2l0aCBhcHBpdW0teGN1aXRlc3QtZHJpdmVyIG1vZHVsZSAoJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfSAhPSAke3VwZ3JhZGVkQXR9KWApO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IHV0aWwuaGFzVmFsdWUocHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpXG4gICAgICA/IGBXaWxsIHJldXNlIHByZXZpb3VzbHkgY2FjaGVkIFdEQSBpbnN0YW5jZSBhdCAnJHt0aGlzLnVybC5ocmVmfScgd2l0aCAnJHtwcm9kdWN0QnVuZGxlSWRlbnRpZmllcn0nYFxuICAgICAgOiBgV2lsbCByZXVzZSBwcmV2aW91c2x5IGNhY2hlZCBXREEgaW5zdGFuY2UgYXQgJyR7dGhpcy51cmwuaHJlZn0nYDtcbiAgICB0aGlzLmxvZy5pbmZvKGAke21lc3NhZ2V9LiBTZXQgdGhlIHdkYUxvY2FsUG9ydCBjYXBhYmlsaXR5IHRvIGEgdmFsdWUgZGlmZmVyZW50IGZyb20gJHt0aGlzLnVybC5wb3J0fSBpZiB0aGlzIGlzIGFuIHVuZGVzaXJlZCBiZWhhdmlvci5gKTtcbiAgICB0aGlzLndlYkRyaXZlckFnZW50VXJsID0gdGhpcy51cmwuaHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWl0IGFuZCB1bmluc3RhbGwgcnVubmluZyBXREEuXG4gICAqL1xuICBhc3luYyBxdWl0QW5kVW5pbnN0YWxsICgpIHtcbiAgICBhd2FpdCB0aGlzLnF1aXQoKTtcbiAgICBhd2FpdCB0aGlzLnVuaW5zdGFsbCgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFdlYkRyaXZlckFnZW50O1xuZXhwb3J0IHsgV2ViRHJpdmVyQWdlbnQgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUEsTUFBTUEsa0JBQWtCLEdBQUcsRUFBRSxHQUFHLElBQUk7QUFDcEMsTUFBTUMsY0FBYyxHQUFHLElBQUk7QUFDM0IsTUFBTUMsa0JBQWtCLEdBQUcsNkJBQTZCO0FBQ3hELE1BQU1DLHNCQUFzQixHQUFHLElBQUlDLGtCQUFTLEVBQUU7QUFFOUMsTUFBTUMsY0FBYyxDQUFDO0VBQ25CQyxXQUFXLENBQUVDLFlBQVksRUFBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFQyxHQUFHLEdBQUcsSUFBSSxFQUFFO0lBQ2hELElBQUksQ0FBQ0YsWUFBWSxHQUFHQSxZQUFZO0lBRWhDLElBQUksQ0FBQ0MsSUFBSSxHQUFHRSxlQUFDLENBQUNDLEtBQUssQ0FBQ0gsSUFBSSxDQUFDO0lBQ3pCLElBQUksQ0FBQ0MsR0FBRyxHQUFHQSxHQUFHLElBQUlHLGVBQWE7SUFFL0IsSUFBSSxDQUFDQyxNQUFNLEdBQUdMLElBQUksQ0FBQ0ssTUFBTTtJQUN6QixJQUFJLENBQUNDLGVBQWUsR0FBR04sSUFBSSxDQUFDTSxlQUFlO0lBQzNDLElBQUksQ0FBQ0MsWUFBWSxHQUFHUCxJQUFJLENBQUNPLFlBQVk7SUFDckMsSUFBSSxDQUFDQyxhQUFhLEdBQUdSLElBQUksQ0FBQ1EsYUFBYTtJQUN2QyxJQUFJLENBQUNDLElBQUksR0FBR1QsSUFBSSxDQUFDUyxJQUFJO0lBQ3JCLElBQUksQ0FBQ0MsWUFBWSxHQUFHLENBQUMsQ0FBQ1YsSUFBSSxDQUFDVyxVQUFVO0lBQ3JDLElBQUksQ0FBQ0MsR0FBRyxHQUFHLENBQUNaLElBQUksQ0FBQ0ssTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFTyxHQUFHO0lBQ2xDLElBQUksQ0FBQ0MsYUFBYSxHQUFHYixJQUFJLENBQUNhLGFBQWE7SUFFdkMsSUFBSSxDQUFDQyxXQUFXLENBQUNkLElBQUksQ0FBQ2UsYUFBYSxFQUFFZixJQUFJLENBQUNnQixTQUFTLENBQUM7SUFFcEQsSUFBSSxDQUFDQyxZQUFZLEdBQUdqQixJQUFJLENBQUNpQixZQUFZO0lBQ3JDLElBQUksQ0FBQ0MsYUFBYSxHQUFHbEIsSUFBSSxDQUFDaUIsWUFBWSxJQUFJeEIsY0FBYztJQUN4RCxJQUFJLENBQUMwQixVQUFVLEdBQUduQixJQUFJLENBQUNtQixVQUFVLElBQUlDLHVCQUFZO0lBRWpELElBQUksQ0FBQ0MsV0FBVyxHQUFHckIsSUFBSSxDQUFDcUIsV0FBVztJQUVuQyxJQUFJLENBQUNDLGlCQUFpQixHQUFHdEIsSUFBSSxDQUFDc0IsaUJBQWlCO0lBRS9DLElBQUksQ0FBQ0MsT0FBTyxHQUFHLEtBQUs7SUFFcEIsSUFBSSxDQUFDQyxvQkFBb0IsR0FBR3hCLElBQUksQ0FBQ3dCLG9CQUFvQjtJQUVyRCxJQUFJLENBQUNDLGdCQUFnQixHQUFHekIsSUFBSSxDQUFDeUIsZ0JBQWdCO0lBQzdDLElBQUksQ0FBQ0MsY0FBYyxHQUFHMUIsSUFBSSxDQUFDMEIsY0FBYztJQUN6QyxJQUFJLENBQUNDLGVBQWUsR0FBRzNCLElBQUksQ0FBQzJCLGVBQWU7SUFDM0MsSUFBSSxDQUFDQyxlQUFlLEdBQUc1QixJQUFJLENBQUM0QixlQUFlO0lBRTNDLElBQUksQ0FBQ0Msa0JBQWtCLEdBQUc3QixJQUFJLENBQUM2QixrQkFBa0I7SUFFakQsSUFBSSxDQUFDQyxVQUFVLEdBQUcsSUFBSUMsbUJBQVUsQ0FBQyxJQUFJLENBQUNoQyxZQUFZLEVBQUUsSUFBSSxDQUFDTSxNQUFNLEVBQUU7TUFDL0RDLGVBQWUsRUFBRSxJQUFJLENBQUNBLGVBQWU7TUFDckNDLFlBQVksRUFBRSxJQUFJLENBQUNBLFlBQVk7TUFDL0JDLGFBQWEsRUFBRSxJQUFJLENBQUNBLGFBQWE7TUFDakNRLFNBQVMsRUFBRSxJQUFJLENBQUNBLFNBQVM7TUFDekJELGFBQWEsRUFBRSxJQUFJLENBQUNBLGFBQWE7TUFDakNKLFVBQVUsRUFBRSxJQUFJLENBQUNELFlBQVk7TUFDN0JzQixZQUFZLEVBQUVoQyxJQUFJLENBQUNnQyxZQUFZO01BQy9CQyxlQUFlLEVBQUVqQyxJQUFJLENBQUNpQyxlQUFlO01BQ3JDQyxVQUFVLEVBQUVsQyxJQUFJLENBQUNrQyxVQUFVO01BQzNCQyxjQUFjLEVBQUVuQyxJQUFJLENBQUNtQyxjQUFjO01BQ25DQyxZQUFZLEVBQUVwQyxJQUFJLENBQUNvQyxZQUFZO01BQy9CQyxnQkFBZ0IsRUFBRXJDLElBQUksQ0FBQ3FDLGdCQUFnQjtNQUN2Q0Msa0JBQWtCLEVBQUV0QyxJQUFJLENBQUNzQyxrQkFBa0I7TUFDM0NaLGNBQWMsRUFBRTFCLElBQUksQ0FBQzBCLGNBQWM7TUFDbkNHLGtCQUFrQixFQUFFLElBQUksQ0FBQ0Esa0JBQWtCO01BQzNDVSxhQUFhLEVBQUV2QyxJQUFJLENBQUN3QyxnQkFBZ0IsSUFBSWhELGtCQUFrQjtNQUMxRDBCLGFBQWEsRUFBRSxJQUFJLENBQUNBLGFBQWE7TUFDakNPLGdCQUFnQixFQUFFLElBQUksQ0FBQ0EsZ0JBQWdCO01BQ3ZDRSxlQUFlLEVBQUUzQixJQUFJLENBQUMyQixlQUFlO01BQ3JDQyxlQUFlLEVBQUUsSUFBSSxDQUFDQSxlQUFlO01BQ3JDYSxtQ0FBbUMsRUFBRXpDLElBQUksQ0FBQ3lDLG1DQUFtQztNQUM3RUMsZ0JBQWdCLEVBQUUxQyxJQUFJLENBQUMwQyxnQkFBZ0I7TUFDdkNDLG1CQUFtQixFQUFFM0MsSUFBSSxDQUFDMkM7SUFDNUIsQ0FBQyxFQUFFLElBQUksQ0FBQzFDLEdBQUcsQ0FBQztFQUNkO0VBRUFhLFdBQVcsQ0FBRUMsYUFBYSxFQUFFQyxTQUFTLEVBQUU7SUFHckMsSUFBSSxDQUFDRCxhQUFhLEdBQUdBLGFBQWEsSUFBSTZCLHFCQUFjO0lBQ3BELElBQUksQ0FBQzNDLEdBQUcsQ0FBQzRDLElBQUksQ0FBRSxvQkFBbUIsSUFBSSxDQUFDOUIsYUFBYyxHQUFFLENBQUM7SUFHeEQsSUFBSSxDQUFDQyxTQUFTLEdBQUdBLFNBQVMsSUFBSThCLGFBQUksQ0FBQ0MsT0FBTyxDQUFDLElBQUksQ0FBQ2hDLGFBQWEsRUFBRSwwQkFBMEIsQ0FBQztJQUMxRixJQUFJLENBQUNkLEdBQUcsQ0FBQzRDLElBQUksQ0FBRSxxQkFBb0IsSUFBSSxDQUFDN0IsU0FBVSxHQUFFLENBQUM7RUFDdkQ7RUFFQSxNQUFNZ0Msd0JBQXdCLEdBQUk7SUFDaEMsTUFBTUMsWUFBWSxHQUFHLE1BQU0sSUFBQUMsNkJBQXNCLEVBQUMsSUFBSSxDQUFDQyxHQUFHLENBQUNDLElBQUksRUFDNURDLE9BQU8sSUFBS0EsT0FBTyxDQUFDQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFDcEQsQ0FBQ0QsT0FBTyxDQUFDRSxXQUFXLEVBQUUsQ0FBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQ2pELE1BQU0sQ0FBQ21ELElBQUksQ0FBQ0QsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUVwRSxJQUFJckQsZUFBQyxDQUFDdUQsT0FBTyxDQUFDUixZQUFZLENBQUMsRUFBRTtNQUMzQixJQUFJLENBQUNoRCxHQUFHLENBQUN5RCxLQUFLLENBQUUsMERBQXlELEdBQ3RFLHFCQUFvQixJQUFJLENBQUNQLEdBQUcsQ0FBQ0MsSUFBSyxrQkFBaUIsQ0FBQztNQUN2RDtJQUNGO0lBRUEsSUFBSSxDQUFDbkQsR0FBRyxDQUFDNEMsSUFBSSxDQUFFLFlBQVdJLFlBQVksQ0FBQ1UsTUFBTywyQkFBMEJWLFlBQVksQ0FBQ1UsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSyxHQUFFLEdBQzdHLDhDQUE2QyxDQUFDO0lBQ2pELElBQUk7TUFDRixNQUFNLElBQUFDLGtCQUFJLEVBQUMsTUFBTSxFQUFFWCxZQUFZLENBQUM7SUFDbEMsQ0FBQyxDQUFDLE9BQU9ZLENBQUMsRUFBRTtNQUNWLElBQUksQ0FBQzVELEdBQUcsQ0FBQzZELElBQUksQ0FBRSx5Q0FBd0NiLFlBQVksQ0FBQ1UsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSyxLQUFJVixZQUFhLEtBQUksR0FDL0csbUJBQWtCWSxDQUFDLENBQUNFLE9BQVEsRUFBQyxDQUFDO0lBQ25DO0VBQ0Y7RUFPQSxNQUFNQyxTQUFTLEdBQUk7SUFDakIsT0FBTyxDQUFDLEVBQUUsTUFBTSxJQUFJLENBQUNDLFNBQVMsRUFBRSxDQUFDO0VBQ25DO0VBRUEsSUFBSUMsUUFBUSxHQUFJO0lBQ2QsSUFBSSxJQUFJLENBQUNmLEdBQUcsQ0FBQ0wsSUFBSSxLQUFLLEdBQUcsRUFBRTtNQUN6QixPQUFPLEVBQUU7SUFDWDtJQUNBLE9BQU8sSUFBSSxDQUFDSyxHQUFHLENBQUNMLElBQUksSUFBSSxFQUFFO0VBQzVCO0VBd0JBLE1BQU1tQixTQUFTLEdBQUk7SUFDakIsTUFBTUUsY0FBYyxHQUFHLElBQUlDLDhCQUFjLENBQUM7TUFDeENDLE1BQU0sRUFBRSxJQUFJLENBQUNsQixHQUFHLENBQUNtQixRQUFRO01BQ3pCbEIsSUFBSSxFQUFFLElBQUksQ0FBQ0QsR0FBRyxDQUFDQyxJQUFJO01BQ25CbUIsSUFBSSxFQUFFLElBQUksQ0FBQ0wsUUFBUTtNQUNuQk0sT0FBTyxFQUFFO0lBQ1gsQ0FBQyxDQUFDO0lBQ0YsSUFBSTtNQUNGLE9BQU8sTUFBTUwsY0FBYyxDQUFDTSxPQUFPLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQztJQUN2RCxDQUFDLENBQUMsT0FBT0MsR0FBRyxFQUFFO01BQ1osSUFBSSxDQUFDekUsR0FBRyxDQUFDeUQsS0FBSyxDQUFFLDRCQUEyQixJQUFJLENBQUNQLEdBQUcsQ0FBQ3dCLElBQUssR0FBRSxDQUFDO01BQzVELE9BQU8sSUFBSTtJQUNiO0VBQ0Y7RUFPQSxNQUFNQyxTQUFTLEdBQUk7SUFDakIsSUFBSTtNQUNGLE1BQU1DLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQ3hFLE1BQU0sQ0FBQ3lFLHFDQUFxQyxDQUFDcEYsa0JBQWtCLENBQUM7TUFDN0YsSUFBSVEsZUFBQyxDQUFDdUQsT0FBTyxDQUFDb0IsU0FBUyxDQUFDLEVBQUU7UUFDeEIsSUFBSSxDQUFDNUUsR0FBRyxDQUFDeUQsS0FBSyxDQUFDLHdCQUF3QixDQUFDO1FBQ3hDO01BQ0Y7TUFFQSxJQUFJLENBQUN6RCxHQUFHLENBQUN5RCxLQUFLLENBQUUsdUJBQXNCbUIsU0FBVSxHQUFFLENBQUM7TUFDbkQsS0FBSyxNQUFNRSxRQUFRLElBQUlGLFNBQVMsRUFBRTtRQUNoQyxNQUFNLElBQUksQ0FBQ3hFLE1BQU0sQ0FBQzJFLFNBQVMsQ0FBQ0QsUUFBUSxDQUFDO01BQ3ZDO0lBQ0YsQ0FBQyxDQUFDLE9BQU9sQixDQUFDLEVBQUU7TUFDVixJQUFJLENBQUM1RCxHQUFHLENBQUN5RCxLQUFLLENBQUNHLENBQUMsQ0FBQztNQUNqQixJQUFJLENBQUM1RCxHQUFHLENBQUM2RCxJQUFJLENBQUUsdUVBQXNFLEdBQ2xGLG1CQUFrQkQsQ0FBQyxDQUFDRSxPQUFRLEVBQUMsQ0FBQztJQUNuQztFQUNGO0VBRUEsTUFBTWtCLHNCQUFzQixHQUFJO0lBQzlCLE1BQU1DLFVBQVUsR0FBR0MsT0FBTyxDQUFDQyxHQUFHLENBQUNDLElBQUk7SUFDbkMsSUFBSSxDQUFDSCxVQUFVLEVBQUU7TUFDZixJQUFJLENBQUNqRixHQUFHLENBQUM0QyxJQUFJLENBQUMsMkNBQTJDLENBQUM7TUFDMUQ7SUFDRjtJQUVBLE1BQU15Qyx1QkFBdUIsR0FBRyxNQUFNLElBQUFDLDZCQUFzQixHQUFFO0lBQzlELElBQUksQ0FBQ3JGLGVBQUMsQ0FBQ3NGLFNBQVMsQ0FBQ0YsdUJBQXVCLENBQUMsRUFBRTtNQUN6QyxJQUFJLENBQUNyRixHQUFHLENBQUM0QyxJQUFJLENBQUMsNERBQTRELENBQUM7TUFDM0U7SUFDRjtJQUVBLE1BQU00QyxhQUFhLEdBQUczQyxhQUFJLENBQUNDLE9BQU8sQ0FBQ21DLFVBQVUsRUFBRVEscUNBQTBCLENBQUM7SUFDMUUsTUFBTUMsaUJBQWlCLEdBQUcsTUFBTUMsV0FBRSxDQUFDQyxNQUFNLENBQUNKLGFBQWEsQ0FBQztJQUN4RCxJQUFJRSxpQkFBaUIsRUFBRTtNQUNyQixJQUFJO1FBQ0YsTUFBTUMsV0FBRSxDQUFDRSxNQUFNLENBQUNMLGFBQWEsRUFBRUcsV0FBRSxDQUFDRyxJQUFJLENBQUM7TUFDekMsQ0FBQyxDQUFDLE9BQU9DLEdBQUcsRUFBRTtRQUNaLElBQUksQ0FBQy9GLEdBQUcsQ0FBQzRDLElBQUksQ0FBRSx3Q0FBdUM0QyxhQUFjLHNCQUFxQixHQUN0RiwwQkFBeUIsQ0FBQztRQUM3QjtNQUNGO01BQ0EsTUFBTVEsc0JBQXNCLEdBQUdDLFFBQVEsQ0FBQyxNQUFNTixXQUFFLENBQUNPLFFBQVEsQ0FBQ1YsYUFBYSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQztNQUNyRixJQUFJdkYsZUFBQyxDQUFDc0YsU0FBUyxDQUFDUyxzQkFBc0IsQ0FBQyxFQUFFO1FBQ3ZDLElBQUlBLHNCQUFzQixJQUFJWCx1QkFBdUIsRUFBRTtVQUNyRCxJQUFJLENBQUNyRixHQUFHLENBQUM0QyxJQUFJLENBQUUscUVBQW9FLEdBQ2hGLElBQUdvRCxzQkFBdUIsT0FBTVgsdUJBQXdCLEdBQUUsQ0FBQztVQUM5RDtRQUNGO1FBQ0EsSUFBSSxDQUFDckYsR0FBRyxDQUFDNEMsSUFBSSxDQUFFLDRDQUEyQyxHQUN2RCxJQUFHb0Qsc0JBQXVCLE1BQUtYLHVCQUF3QixHQUFFLENBQUM7TUFDL0QsQ0FBQyxNQUFNO1FBQ0wsSUFBSSxDQUFDckYsR0FBRyxDQUFDNkQsSUFBSSxDQUFFLG9DQUFtQzJCLGFBQWMsa0NBQWlDLENBQUM7TUFDcEc7SUFDRjtJQUVBLElBQUk7TUFDRixNQUFNLElBQUFXLGVBQU0sRUFBQ3RELGFBQUksQ0FBQ3VELE9BQU8sQ0FBQ1osYUFBYSxDQUFDLENBQUM7TUFDekMsTUFBTUcsV0FBRSxDQUFDVSxTQUFTLENBQUNiLGFBQWEsRUFBRyxHQUFFSCx1QkFBd0IsRUFBQyxFQUFFLE1BQU0sQ0FBQztNQUN2RSxJQUFJLENBQUNyRixHQUFHLENBQUN5RCxLQUFLLENBQUUsc0RBQXFENEIsdUJBQXdCLEdBQUUsR0FDNUYsT0FBTUcsYUFBYyxHQUFFLENBQUM7SUFDNUIsQ0FBQyxDQUFDLE9BQU81QixDQUFDLEVBQUU7TUFDVixJQUFJLENBQUM1RCxHQUFHLENBQUM0QyxJQUFJLENBQUUsb0VBQW1FNEMsYUFBYyxLQUFJLEdBQ2pHLG1CQUFrQjVCLENBQUMsQ0FBQ0UsT0FBUSxFQUFDLENBQUM7TUFDakM7SUFDRjtJQUVBLElBQUksQ0FBQzRCLGlCQUFpQixFQUFFO01BQ3RCLElBQUksQ0FBQzFGLEdBQUcsQ0FBQzRDLElBQUksQ0FBQyxvRkFBb0YsQ0FBQztNQUNuRztJQUNGO0lBRUEsSUFBSTtNQUNGLE1BQU0sSUFBSSxDQUFDZixVQUFVLENBQUN5RSxZQUFZLEVBQUU7SUFDdEMsQ0FBQyxDQUFDLE9BQU8xQyxDQUFDLEVBQUU7TUFDVixJQUFJLENBQUM1RCxHQUFHLENBQUM2RCxJQUFJLENBQUUsa0VBQWlFRCxDQUFDLENBQUNFLE9BQVEsRUFBQyxDQUFDO0lBQzlGO0VBQ0Y7RUF5QkEsTUFBTXlDLE1BQU0sQ0FBRUMsU0FBUyxFQUFFO0lBQ3ZCLElBQUksSUFBSSxDQUFDbkYsaUJBQWlCLEVBQUU7TUFDMUIsSUFBSSxDQUFDckIsR0FBRyxDQUFDNEMsSUFBSSxDQUFFLHFDQUFvQyxJQUFJLENBQUN2QixpQkFBa0IsR0FBRSxDQUFDO01BQzdFLElBQUksQ0FBQzZCLEdBQUcsR0FBRyxJQUFJLENBQUM3QixpQkFBaUI7TUFDakMsSUFBSSxDQUFDb0YsWUFBWSxDQUFDRCxTQUFTLENBQUM7TUFDNUIsT0FBTyxNQUFNLElBQUksQ0FBQ3hDLFNBQVMsRUFBRTtJQUMvQjtJQUVBLElBQUksQ0FBQ2hFLEdBQUcsQ0FBQzRDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQztJQUV2RCxJQUFJLENBQUM2RCxZQUFZLENBQUNELFNBQVMsQ0FBQztJQUU1QixJQUFJLENBQUMsSUFBSSxDQUFDaEYsZ0JBQWdCLElBQUksRUFBQyxNQUFNbUUsV0FBRSxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDN0UsU0FBUyxDQUFDLEdBQUU7TUFDOUQsTUFBTSxJQUFJMkYsS0FBSyxDQUFFLDRDQUEyQyxJQUFJLENBQUMzRixTQUFVLFlBQVcsR0FDdEUscUJBQXFCLENBQUM7SUFDeEM7SUFJQSxJQUFJLElBQUksQ0FBQ0osR0FBRyxJQUFJLElBQUksQ0FBQ2EsZ0JBQWdCLElBQUssSUFBSSxDQUFDRSxlQUFlLElBQUksSUFBSSxDQUFDRCxjQUFlLEVBQUU7TUFDdEYsSUFBSSxDQUFDekIsR0FBRyxDQUFDNEMsSUFBSSxDQUFDLG9FQUFvRSxDQUFDO0lBQ3JGLENBQUMsTUFBTTtNQUNMLE1BQU0rRCxrQkFBa0IsR0FBRzlELGFBQUksQ0FBQytELFNBQVMsQ0FBQyxJQUFJLENBQUM5RixhQUFhLENBQUM7TUFDN0QsTUFBTXBCLHNCQUFzQixDQUFDbUgsT0FBTyxDQUFDRixrQkFBa0IsRUFDckQsWUFBWSxNQUFNLElBQUksQ0FBQzNCLHNCQUFzQixFQUFFLENBQUM7SUFDcEQ7SUFHQSxNQUFNLElBQUE4Qix5QkFBa0IsRUFBQyxJQUFJLENBQUMxRyxNQUFNLENBQUNtRCxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM5QyxZQUFZLENBQUM7SUFFOUQsSUFBSSxJQUFJLENBQUNFLEdBQUcsRUFBRTtNQUNaLE9BQU8sTUFBTSxJQUFJLENBQUNvRyxZQUFZLEVBQUU7SUFDbEM7SUFFQSxNQUFNLElBQUksQ0FBQ2xGLFVBQVUsQ0FBQ21GLElBQUksQ0FBQyxJQUFJLENBQUM5QyxjQUFjLENBQUM7SUFHL0MsSUFBSSxJQUFJLENBQUM5QyxXQUFXLEVBQUU7TUFDcEIsTUFBTSxJQUFJLENBQUNTLFVBQVUsQ0FBQ29GLFFBQVEsRUFBRTtJQUNsQztJQUNBLE9BQU8sTUFBTSxJQUFJLENBQUNwRixVQUFVLENBQUNxRixLQUFLLEVBQUU7RUFDdEM7RUFFQSxNQUFNSCxZQUFZLEdBQUk7SUFDcEIsSUFBSSxDQUFDL0csR0FBRyxDQUFDNEMsSUFBSSxDQUFDLHdGQUF3RixDQUFDO0lBQ3ZHLE1BQU07TUFBQ3VFLFdBQVc7TUFBRUM7SUFBWSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUNDLFVBQVUsRUFBRTtJQUMzRCxNQUFNbEMsR0FBRyxHQUFHO01BQ1ZtQyxRQUFRLEVBQUUsSUFBSSxDQUFDckcsYUFBYTtNQUM1QnNHLDZCQUE2QixFQUFFLElBQUksQ0FBQzNGO0lBQ3RDLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQ0QsZUFBZSxFQUFFO01BQ3hCd0QsR0FBRyxDQUFDcUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDN0YsZUFBZTtJQUM5QztJQUVBLE9BQU8sTUFBTSxJQUFJLENBQUNoQixHQUFHLENBQUM4RyxXQUFXLENBQUNOLFdBQVcsRUFBRUEsV0FBVyxFQUFFQyxZQUFZLEVBQUU7TUFBQ2pDO0lBQUcsQ0FBQyxDQUFDO0VBQ2xGO0VBRUEsTUFBTXVDLGFBQWEsQ0FBRTlHLGFBQWEsRUFBRTtJQUNsQyxNQUFNK0csYUFBYSxHQUFHOUUsYUFBSSxDQUFDK0UsSUFBSSxDQUFDaEgsYUFBYSxFQUFFLFlBQVksQ0FBQztJQUM1RCxNQUFNaUgsU0FBUyxHQUFHLE1BQU1DLGNBQUssQ0FBQ0MsVUFBVSxDQUFDLE1BQU1wQyxXQUFFLENBQUNPLFFBQVEsQ0FBQ3lCLGFBQWEsQ0FBQyxDQUFDO0lBQzFFLElBQUksQ0FBQ0UsU0FBUyxDQUFDRyxrQkFBa0IsRUFBRTtNQUNqQyxNQUFNLElBQUl0QixLQUFLLENBQUUsZ0NBQStCaUIsYUFBYyxHQUFFLENBQUM7SUFDbkU7SUFDQSxPQUFPRSxTQUFTLENBQUNHLGtCQUFrQjtFQUNyQztFQUVBLE1BQU1YLFVBQVUsR0FBSTtJQUNsQixNQUFNekcsYUFBYSxHQUFHLElBQUksQ0FBQ0EsYUFBYSxLQUFJLE1BQU0sSUFBSSxDQUFDcUgsY0FBYyxFQUFFO0lBQ3ZFLE1BQU1kLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQ08sYUFBYSxDQUFDOUcsYUFBYSxDQUFDO0lBQzNELElBQUksRUFBQyxNQUFNLElBQUksQ0FBQ1IsTUFBTSxDQUFDOEgsY0FBYyxDQUFDZixXQUFXLENBQUMsR0FBRTtNQUNsRCxNQUFNLElBQUksQ0FBQy9HLE1BQU0sQ0FBQytILFVBQVUsQ0FBQ3ZILGFBQWEsQ0FBQztJQUM3QztJQUNBLE1BQU13RyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUN6RyxHQUFHLENBQUN5SCxtQkFBbUIsQ0FBQ3ZGLGFBQUksQ0FBQytFLElBQUksQ0FBQ2hILGFBQWEsRUFBRSxTQUFTLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztJQUMzSCxPQUFPO01BQUN1RyxXQUFXO01BQUVDLFlBQVk7TUFBRXhHO0lBQWEsQ0FBQztFQUNuRDtFQUVBLE1BQU1xSCxjQUFjLEdBQUk7SUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQ3ZHLGVBQWUsRUFBRTtNQUN6QixPQUFPLE1BQU0sSUFBQTJHLCtCQUFZLEVBQUMsSUFBSSxDQUFDeEcsVUFBVSxDQUFDO0lBQzVDO0lBQ0EsTUFBTXlHLGNBQWMsR0FBRyxNQUFNM0MsV0FBRSxDQUFDNEMsSUFBSSxDQUFFLEdBQUUsSUFBSSxDQUFDN0csZUFBZ0IsUUFBTzhHLHlCQUFlLEdBQUUsRUFBRTtNQUNyRkMsUUFBUSxFQUFFO0lBQ1osQ0FBQyxDQUFDO0lBQ0YsSUFBSXhJLGVBQUMsQ0FBQ3VELE9BQU8sQ0FBQzhFLGNBQWMsQ0FBQyxFQUFFO01BQzdCLE1BQU0sSUFBSTVCLEtBQUssQ0FBRSxxQ0FBb0MsSUFBSSxDQUFDaEYsZUFBZ0IsR0FBRSxDQUFDO0lBQy9FO0lBQ0EsT0FBTzRHLGNBQWMsQ0FBQyxDQUFDLENBQUM7RUFDMUI7RUFFQSxNQUFNSSxhQUFhLEdBQUk7SUFDckIsTUFBTUMsY0FBYyxHQUFHLENBQ3JCLFdBQVcsRUFDVixZQUFXOUYsYUFBSSxDQUFDK0YsR0FBSSx1QkFBc0IsQ0FDNUMsQ0FBQ0MsR0FBRyxDQUFFQyxPQUFPLElBQUtuRCxXQUFFLENBQUNDLE1BQU0sQ0FBQy9DLGFBQUksQ0FBQ0MsT0FBTyxDQUFDLElBQUksQ0FBQ2hDLGFBQWEsRUFBRWdJLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDeEUsT0FBTyxDQUFDLE1BQU1DLGlCQUFDLENBQUNDLEdBQUcsQ0FBQ0wsY0FBYyxDQUFDLEVBQUVNLElBQUksQ0FBRUMsQ0FBQyxJQUFLQSxDQUFDLEtBQUssS0FBSyxDQUFDO0VBQy9EO0VBRUF6QyxZQUFZLENBQUVELFNBQVMsRUFBRTtJQUN2QixNQUFNMkMsU0FBUyxHQUFHO01BQ2hCbkosR0FBRyxFQUFFLElBQUksQ0FBQ0EsR0FBRztNQUNib0UsTUFBTSxFQUFFLElBQUksQ0FBQ2xCLEdBQUcsQ0FBQ21CLFFBQVE7TUFDekJsQixJQUFJLEVBQUUsSUFBSSxDQUFDRCxHQUFHLENBQUNDLElBQUk7TUFDbkJtQixJQUFJLEVBQUUsSUFBSSxDQUFDTCxRQUFRO01BQ25CTSxPQUFPLEVBQUUsSUFBSSxDQUFDaEQsb0JBQW9CO01BQ2xDNkgsU0FBUyxFQUFFO0lBQ2IsQ0FBQztJQUVELElBQUksQ0FBQ0MsT0FBTyxHQUFHLElBQUlDLG1CQUFPLENBQUNILFNBQVMsQ0FBQztJQUNyQyxJQUFJLENBQUNFLE9BQU8sQ0FBQzdDLFNBQVMsR0FBR0EsU0FBUztJQUNsQyxJQUFJLENBQUMrQyxXQUFXLEdBQUcsSUFBSSxDQUFDRixPQUFPLENBQUNFLFdBQVcsQ0FBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQ0gsT0FBTyxDQUFDO0lBRTlELElBQUksQ0FBQ25GLGNBQWMsR0FBRyxJQUFJQyw4QkFBYyxDQUFDZ0YsU0FBUyxDQUFDO0VBQ3JEO0VBRUEsTUFBTU0sSUFBSSxHQUFJO0lBQ1osSUFBSSxDQUFDekosR0FBRyxDQUFDNEMsSUFBSSxDQUFDLDZCQUE2QixDQUFDO0lBRTVDLE1BQU0sSUFBSSxDQUFDZixVQUFVLENBQUM0SCxJQUFJLEVBQUU7SUFDNUIsTUFBTSxJQUFJLENBQUM1SCxVQUFVLENBQUM2SCxLQUFLLEVBQUU7SUFFN0IsSUFBSSxJQUFJLENBQUNMLE9BQU8sRUFBRTtNQUNoQixJQUFJLENBQUNBLE9BQU8sQ0FBQzdDLFNBQVMsR0FBRyxJQUFJO0lBQy9CO0lBRUEsSUFBSSxDQUFDbEYsT0FBTyxHQUFHLEtBQUs7SUFFcEIsSUFBSSxDQUFDLElBQUksQ0FBQ3ZCLElBQUksQ0FBQ3NCLGlCQUFpQixFQUFFO01BR2hDLElBQUksQ0FBQ0EsaUJBQWlCLEdBQUcsSUFBSTtJQUMvQjtFQUNGO0VBRUEsSUFBSTZCLEdBQUcsR0FBSTtJQUNULElBQUksQ0FBQyxJQUFJLENBQUN5RyxJQUFJLEVBQUU7TUFDZCxJQUFJLElBQUksQ0FBQ3RJLGlCQUFpQixFQUFFO1FBQzFCLElBQUksQ0FBQ3NJLElBQUksR0FBR3pHLGFBQUcsQ0FBQzBHLEtBQUssQ0FBQyxJQUFJLENBQUN2SSxpQkFBaUIsQ0FBQztNQUMvQyxDQUFDLE1BQU07UUFDTCxNQUFNOEIsSUFBSSxHQUFHLElBQUksQ0FBQ25DLFlBQVksSUFBSXhCLGNBQWM7UUFDaEQsTUFBTTtVQUFDcUssUUFBUTtVQUFFeEY7UUFBUSxDQUFDLEdBQUduQixhQUFHLENBQUMwRyxLQUFLLENBQUMsSUFBSSxDQUFDMUksVUFBVSxJQUFJQyx1QkFBWSxDQUFDO1FBQ3ZFLElBQUksQ0FBQ3dJLElBQUksR0FBR3pHLGFBQUcsQ0FBQzBHLEtBQUssQ0FBRSxHQUFFQyxRQUFTLEtBQUl4RixRQUFTLElBQUdsQixJQUFLLEVBQUMsQ0FBQztNQUMzRDtJQUNGO0lBQ0EsT0FBTyxJQUFJLENBQUN3RyxJQUFJO0VBQ2xCO0VBRUEsSUFBSXpHLEdBQUcsQ0FBRXlHLElBQUksRUFBRTtJQUNiLElBQUksQ0FBQ0EsSUFBSSxHQUFHekcsYUFBRyxDQUFDMEcsS0FBSyxDQUFDRCxJQUFJLENBQUM7RUFDN0I7RUFFQSxJQUFJRyxZQUFZLEdBQUk7SUFDbEIsT0FBTyxJQUFJLENBQUN4SSxPQUFPO0VBQ3JCO0VBRUEsSUFBSXdJLFlBQVksQ0FBRXhJLE9BQU8sR0FBRyxLQUFLLEVBQUU7SUFDakMsSUFBSSxDQUFDQSxPQUFPLEdBQUdBLE9BQU87RUFDeEI7RUFFQSxNQUFNeUksdUJBQXVCLEdBQUk7SUFDL0IsT0FBTyxNQUFNLElBQUksQ0FBQ2xJLFVBQVUsQ0FBQ2tJLHVCQUF1QixFQUFFO0VBQ3hEO0VBU0EsTUFBTUMsWUFBWSxHQUFJO0lBQ3BCLE1BQU1DLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQ2pHLFNBQVMsRUFBRTtJQUNyQyxJQUFJLENBQUNpRyxNQUFNLElBQUksQ0FBQ0EsTUFBTSxDQUFDQyxLQUFLLEVBQUU7TUFDNUIsSUFBSSxDQUFDbEssR0FBRyxDQUFDeUQsS0FBSyxDQUFDLHlEQUF5RCxDQUFDO01BQ3pFO0lBQ0Y7SUFFQSxNQUFNO01BQ0owRyx1QkFBdUI7TUFDdkJDO0lBQ0YsQ0FBQyxHQUFHSCxNQUFNLENBQUNDLEtBQUs7SUFFaEIsSUFBSUcsYUFBSSxDQUFDQyxRQUFRLENBQUNILHVCQUF1QixDQUFDLElBQUlFLGFBQUksQ0FBQ0MsUUFBUSxDQUFDLElBQUksQ0FBQzFJLGtCQUFrQixDQUFDLElBQUksSUFBSSxDQUFDQSxrQkFBa0IsS0FBS3VJLHVCQUF1QixFQUFFO01BQzNJLElBQUksQ0FBQ25LLEdBQUcsQ0FBQzRDLElBQUksQ0FBRSxxRkFBb0Z1SCx1QkFBd0IsSUFBRyxDQUFDO01BQy9ILE9BQU8sTUFBTSxJQUFJLENBQUN4RixTQUFTLEVBQUU7SUFDL0I7SUFFQSxJQUFJMEYsYUFBSSxDQUFDQyxRQUFRLENBQUNILHVCQUF1QixDQUFDLElBQUksQ0FBQ0UsYUFBSSxDQUFDQyxRQUFRLENBQUMsSUFBSSxDQUFDMUksa0JBQWtCLENBQUMsSUFBSTJJLCtCQUFvQixLQUFLSix1QkFBdUIsRUFBRTtNQUN6SSxJQUFJLENBQUNuSyxHQUFHLENBQUM0QyxJQUFJLENBQUUsb0ZBQW1GMkgsK0JBQXFCLEVBQUMsQ0FBQztNQUN6SCxPQUFPLE1BQU0sSUFBSSxDQUFDNUYsU0FBUyxFQUFFO0lBQy9CO0lBRUEsTUFBTTZGLHNCQUFzQixHQUFHLE1BQU0sSUFBQWxGLDZCQUFzQixHQUFFO0lBQzdELElBQUksQ0FBQ3RGLEdBQUcsQ0FBQ3lELEtBQUssQ0FBRSxtREFBa0QrRyxzQkFBdUIsRUFBQyxDQUFDO0lBQzNGLElBQUksQ0FBQ3hLLEdBQUcsQ0FBQ3lELEtBQUssQ0FBRSwrQ0FBOEMyRyxVQUFXLEVBQUMsQ0FBQztJQUMzRSxJQUFJSSxzQkFBc0IsSUFBSUosVUFBVSxJQUFJbkssZUFBQyxDQUFDd0ssT0FBTyxDQUFFLEdBQUVELHNCQUF1QixFQUFDLENBQUMsS0FBS3ZLLGVBQUMsQ0FBQ3dLLE9BQU8sQ0FBRSxHQUFFTCxVQUFXLEVBQUMsQ0FBQyxFQUFFO01BQ2pILElBQUksQ0FBQ3BLLEdBQUcsQ0FBQzRDLElBQUksQ0FBQyxxRkFBcUYsR0FDaEcsd0RBQXVENEgsc0JBQXVCLE9BQU1KLFVBQVcsR0FBRSxDQUFDO01BQ3JHLE9BQU8sTUFBTSxJQUFJLENBQUN6RixTQUFTLEVBQUU7SUFDL0I7SUFFQSxNQUFNYixPQUFPLEdBQUd1RyxhQUFJLENBQUNDLFFBQVEsQ0FBQ0gsdUJBQXVCLENBQUMsR0FDakQsaURBQWdELElBQUksQ0FBQ2pILEdBQUcsQ0FBQ3dCLElBQUssV0FBVXlGLHVCQUF3QixHQUFFLEdBQ2xHLGlEQUFnRCxJQUFJLENBQUNqSCxHQUFHLENBQUN3QixJQUFLLEdBQUU7SUFDckUsSUFBSSxDQUFDMUUsR0FBRyxDQUFDNEMsSUFBSSxDQUFFLEdBQUVrQixPQUFRLCtEQUE4RCxJQUFJLENBQUNaLEdBQUcsQ0FBQ0MsSUFBSyxvQ0FBbUMsQ0FBQztJQUN6SSxJQUFJLENBQUM5QixpQkFBaUIsR0FBRyxJQUFJLENBQUM2QixHQUFHLENBQUN3QixJQUFJO0VBQ3hDO0VBS0EsTUFBTWdHLGdCQUFnQixHQUFJO0lBQ3hCLE1BQU0sSUFBSSxDQUFDakIsSUFBSSxFQUFFO0lBQ2pCLE1BQU0sSUFBSSxDQUFDOUUsU0FBUyxFQUFFO0VBQ3hCO0FBQ0Y7QUFBQztBQUFBLGVBRWMvRSxjQUFjO0FBQUEifQ==
358
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcGF0aCIsIl91cmwyIiwiX2JsdWViaXJkIiwiX2Jhc2VEcml2ZXIiLCJfc3VwcG9ydCIsIl9sb2dnZXIiLCJfbm9TZXNzaW9uUHJveHkiLCJfdXRpbHMiLCJfeGNvZGVidWlsZCIsIl9hc3luY0xvY2siLCJfdGVlbl9wcm9jZXNzIiwiX2NoZWNrRGVwZW5kZW5jaWVzIiwiX2NvbnN0YW50cyIsIldEQV9MQVVOQ0hfVElNRU9VVCIsIldEQV9BR0VOVF9QT1JUIiwiV0RBX0NGX0JVTkRMRV9OQU1FIiwiU0hBUkVEX1JFU09VUkNFU19HVUFSRCIsIkFzeW5jTG9jayIsIldlYkRyaXZlckFnZW50IiwiY29uc3RydWN0b3IiLCJ4Y29kZVZlcnNpb24iLCJhcmdzIiwibG9nIiwiXyIsImNsb25lIiwiZGVmYXVsdExvZ2dlciIsImRldmljZSIsInBsYXRmb3JtVmVyc2lvbiIsInBsYXRmb3JtTmFtZSIsImlvc1Nka1ZlcnNpb24iLCJob3N0IiwiaXNSZWFsRGV2aWNlIiwicmVhbERldmljZSIsImlkYiIsIndkYUJ1bmRsZVBhdGgiLCJzZXRXREFQYXRocyIsImJvb3RzdHJhcFBhdGgiLCJhZ2VudFBhdGgiLCJ3ZGFMb2NhbFBvcnQiLCJ3ZGFSZW1vdGVQb3J0Iiwid2RhQmFzZVVybCIsIldEQV9CQVNFX1VSTCIsInByZWJ1aWxkV0RBIiwid2ViRHJpdmVyQWdlbnRVcmwiLCJzdGFydGVkIiwid2RhQ29ubmVjdGlvblRpbWVvdXQiLCJ1c2VYY3Rlc3RydW5GaWxlIiwidXNlUHJlYnVpbHRXREEiLCJkZXJpdmVkRGF0YVBhdGgiLCJtanBlZ1NlcnZlclBvcnQiLCJ1cGRhdGVkV0RBQnVuZGxlSWQiLCJ4Y29kZWJ1aWxkIiwiWGNvZGVCdWlsZCIsInNob3dYY29kZUxvZyIsInhjb2RlQ29uZmlnRmlsZSIsInhjb2RlT3JnSWQiLCJ4Y29kZVNpZ25pbmdJZCIsImtleWNoYWluUGF0aCIsImtleWNoYWluUGFzc3dvcmQiLCJ1c2VTaW1wbGVCdWlsZFRlc3QiLCJsYXVuY2hUaW1lb3V0Iiwid2RhTGF1bmNoVGltZW91dCIsImFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uIiwicmVzdWx0QnVuZGxlUGF0aCIsInJlc3VsdEJ1bmRsZVZlcnNpb24iLCJCT09UU1RSQVBfUEFUSCIsImluZm8iLCJwYXRoIiwicmVzb2x2ZSIsImNsZWFudXBPYnNvbGV0ZVByb2Nlc3NlcyIsIm9ic29sZXRlUGlkcyIsImdldFBJRHNMaXN0ZW5pbmdPblBvcnQiLCJ1cmwiLCJwb3J0IiwiY21kTGluZSIsImluY2x1ZGVzIiwidG9Mb3dlckNhc2UiLCJ1ZGlkIiwiaXNFbXB0eSIsImRlYnVnIiwibGVuZ3RoIiwiZXhlYyIsImUiLCJ3YXJuIiwibWVzc2FnZSIsImlzUnVubmluZyIsImdldFN0YXR1cyIsImJhc2VQYXRoIiwibm9TZXNzaW9uUHJveHkiLCJOb1Nlc3Npb25Qcm94eSIsInNlcnZlciIsImhvc3RuYW1lIiwiYmFzZSIsInRpbWVvdXQiLCJjb21tYW5kIiwiZXJyIiwiaHJlZiIsInVuaW5zdGFsbCIsImJ1bmRsZUlkcyIsImdldFVzZXJJbnN0YWxsZWRCdW5kbGVJZHNCeUJ1bmRsZU5hbWUiLCJidW5kbGVJZCIsInJlbW92ZUFwcCIsIl9jbGVhbnVwUHJvamVjdElmRnJlc2giLCJob21lRm9sZGVyIiwicHJvY2VzcyIsImVudiIsIkhPTUUiLCJjdXJyZW50VXBncmFkZVRpbWVzdGFtcCIsImdldFdEQVVwZ3JhZGVUaW1lc3RhbXAiLCJpc0ludGVnZXIiLCJ0aW1lc3RhbXBQYXRoIiwiV0RBX1VQR1JBREVfVElNRVNUQU1QX1BBVEgiLCJkaWRUaW1lc3RhbXBFeGlzdCIsImZzIiwiZXhpc3RzIiwiYWNjZXNzIiwiV19PSyIsImlnbiIsInJlY2VudFVwZ3JhZGVUaW1lc3RhbXAiLCJwYXJzZUludCIsInJlYWRGaWxlIiwibWtkaXJwIiwiZGlybmFtZSIsIndyaXRlRmlsZSIsImNsZWFuUHJvamVjdCIsImxhdW5jaCIsInNlc3Npb25JZCIsInNldHVwUHJveGllcyIsIkVycm9yIiwic3luY2hyb25pemF0aW9uS2V5Iiwibm9ybWFsaXplIiwiYWNxdWlyZSIsInJlc2V0VGVzdFByb2Nlc3NlcyIsInN0YXJ0V2l0aElEQiIsImluaXQiLCJwcmVidWlsZCIsInN0YXJ0Iiwid2RhQnVuZGxlSWQiLCJ0ZXN0QnVuZGxlSWQiLCJwcmVwYXJlV0RBIiwiVVNFX1BPUlQiLCJXREFfUFJPRFVDVF9CVU5ETEVfSURFTlRJRklFUiIsIk1KUEVHX1NFUlZFUl9QT1JUIiwicnVuWENVSVRlc3QiLCJwYXJzZUJ1bmRsZUlkIiwiaW5mb1BsaXN0UGF0aCIsImpvaW4iLCJpbmZvUGxpc3QiLCJwbGlzdCIsInBhcnNlUGxpc3QiLCJDRkJ1bmRsZUlkZW50aWZpZXIiLCJmZXRjaFdEQUJ1bmRsZSIsImlzQXBwSW5zdGFsbGVkIiwiaW5zdGFsbEFwcCIsImluc3RhbGxYQ1Rlc3RCdW5kbGUiLCJidW5kbGVXREFTaW0iLCJ3ZGFCdW5kbGVQYXRocyIsImdsb2IiLCJXREFfUlVOTkVSX0FQUCIsImFic29sdXRlIiwiaXNTb3VyY2VGcmVzaCIsImV4aXN0c1Byb21pc2VzIiwic2VwIiwibWFwIiwic3ViUGF0aCIsIkIiLCJhbGwiLCJzb21lIiwidiIsInByb3h5T3B0cyIsImtlZXBBbGl2ZSIsImp3cHJveHkiLCJKV1Byb3h5IiwicHJveHlSZXFSZXMiLCJiaW5kIiwicXVpdCIsInJlc2V0IiwiX3VybCIsInBhcnNlIiwicHJvdG9jb2wiLCJmdWxseVN0YXJ0ZWQiLCJyZXRyaWV2ZURlcml2ZWREYXRhUGF0aCIsInNldHVwQ2FjaGluZyIsInN0YXR1cyIsImJ1aWxkIiwicHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIiLCJ1cGdyYWRlZEF0IiwidXRpbCIsImhhc1ZhbHVlIiwiV0RBX1JVTk5FUl9CVU5ETEVfSUQiLCJhY3R1YWxVcGdyYWRlVGltZXN0YW1wIiwidG9Mb3dlciIsInF1aXRBbmRVbmluc3RhbGwiLCJleHBvcnRzIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3dlYmRyaXZlcmFnZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IEpXUHJveHkgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IGZzLCB1dGlsLCBwbGlzdCwgbWtkaXJwIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBkZWZhdWx0TG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IE5vU2Vzc2lvblByb3h5IH0gZnJvbSAnLi9uby1zZXNzaW9uLXByb3h5JztcbmltcG9ydCB7XG4gIGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAsIHJlc2V0VGVzdFByb2Nlc3NlcywgZ2V0UElEc0xpc3RlbmluZ09uUG9ydCwgQk9PVFNUUkFQX1BBVEhcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgWGNvZGVCdWlsZCBmcm9tICcuL3hjb2RlYnVpbGQnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgYnVuZGxlV0RBU2ltIH0gZnJvbSAnLi9jaGVjay1kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHtcbiAgV0RBX1JVTk5FUl9CVU5ETEVfSUQsIFdEQV9SVU5ORVJfQVBQLCBXREFfQkFTRV9VUkwsIFdEQV9VUEdSQURFX1RJTUVTVEFNUF9QQVRILFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmNvbnN0IFdEQV9MQVVOQ0hfVElNRU9VVCA9IDYwICogMTAwMDtcbmNvbnN0IFdEQV9BR0VOVF9QT1JUID0gODEwMDtcbmNvbnN0IFdEQV9DRl9CVU5ETEVfTkFNRSA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lci1SdW5uZXInO1xuY29uc3QgU0hBUkVEX1JFU09VUkNFU19HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcblxuY2xhc3MgV2ViRHJpdmVyQWdlbnQge1xuICBjb25zdHJ1Y3RvciAoeGNvZGVWZXJzaW9uLCBhcmdzID0ge30sIGxvZyA9IG51bGwpIHtcbiAgICB0aGlzLnhjb2RlVmVyc2lvbiA9IHhjb2RlVmVyc2lvbjtcblxuICAgIHRoaXMuYXJncyA9IF8uY2xvbmUoYXJncyk7XG4gICAgdGhpcy5sb2cgPSBsb2cgPz8gZGVmYXVsdExvZ2dlcjtcblxuICAgIHRoaXMuZGV2aWNlID0gYXJncy5kZXZpY2U7XG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcbiAgICB0aGlzLmhvc3QgPSBhcmdzLmhvc3Q7XG4gICAgdGhpcy5pc1JlYWxEZXZpY2UgPSAhIWFyZ3MucmVhbERldmljZTtcbiAgICB0aGlzLmlkYiA9IChhcmdzLmRldmljZSB8fCB7fSkuaWRiO1xuICAgIHRoaXMud2RhQnVuZGxlUGF0aCA9IGFyZ3Mud2RhQnVuZGxlUGF0aDtcblxuICAgIHRoaXMuc2V0V0RBUGF0aHMoYXJncy5ib290c3RyYXBQYXRoLCBhcmdzLmFnZW50UGF0aCk7XG5cbiAgICB0aGlzLndkYUxvY2FsUG9ydCA9IGFyZ3Mud2RhTG9jYWxQb3J0O1xuICAgIHRoaXMud2RhUmVtb3RlUG9ydCA9IGFyZ3Mud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JUO1xuICAgIHRoaXMud2RhQmFzZVVybCA9IGFyZ3Mud2RhQmFzZVVybCB8fCBXREFfQkFTRV9VUkw7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcblxuICAgIHRoaXMud2ViRHJpdmVyQWdlbnRVcmwgPSBhcmdzLndlYkRyaXZlckFnZW50VXJsO1xuXG4gICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLndkYUNvbm5lY3Rpb25UaW1lb3V0ID0gYXJncy53ZGFDb25uZWN0aW9uVGltZW91dDtcblxuICAgIHRoaXMudXNlWGN0ZXN0cnVuRmlsZSA9IGFyZ3MudXNlWGN0ZXN0cnVuRmlsZTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuICAgIHRoaXMubWpwZWdTZXJ2ZXJQb3J0ID0gYXJncy5tanBlZ1NlcnZlclBvcnQ7XG5cbiAgICB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCA9IGFyZ3MudXBkYXRlZFdEQUJ1bmRsZUlkO1xuXG4gICAgdGhpcy54Y29kZWJ1aWxkID0gbmV3IFhjb2RlQnVpbGQodGhpcy54Y29kZVZlcnNpb24sIHRoaXMuZGV2aWNlLCB7XG4gICAgICBwbGF0Zm9ybVZlcnNpb246IHRoaXMucGxhdGZvcm1WZXJzaW9uLFxuICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZSxcbiAgICAgIGlvc1Nka1ZlcnNpb246IHRoaXMuaW9zU2RrVmVyc2lvbixcbiAgICAgIGFnZW50UGF0aDogdGhpcy5hZ2VudFBhdGgsXG4gICAgICBib290c3RyYXBQYXRoOiB0aGlzLmJvb3RzdHJhcFBhdGgsXG4gICAgICByZWFsRGV2aWNlOiB0aGlzLmlzUmVhbERldmljZSxcbiAgICAgIHNob3dYY29kZUxvZzogYXJncy5zaG93WGNvZGVMb2csXG4gICAgICB4Y29kZUNvbmZpZ0ZpbGU6IGFyZ3MueGNvZGVDb25maWdGaWxlLFxuICAgICAgeGNvZGVPcmdJZDogYXJncy54Y29kZU9yZ0lkLFxuICAgICAgeGNvZGVTaWduaW5nSWQ6IGFyZ3MueGNvZGVTaWduaW5nSWQsXG4gICAgICBrZXljaGFpblBhdGg6IGFyZ3Mua2V5Y2hhaW5QYXRoLFxuICAgICAga2V5Y2hhaW5QYXNzd29yZDogYXJncy5rZXljaGFpblBhc3N3b3JkLFxuICAgICAgdXNlU2ltcGxlQnVpbGRUZXN0OiBhcmdzLnVzZVNpbXBsZUJ1aWxkVGVzdCxcbiAgICAgIHVzZVByZWJ1aWx0V0RBOiBhcmdzLnVzZVByZWJ1aWx0V0RBLFxuICAgICAgdXBkYXRlZFdEQUJ1bmRsZUlkOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCxcbiAgICAgIGxhdW5jaFRpbWVvdXQ6IGFyZ3Mud2RhTGF1bmNoVGltZW91dCB8fCBXREFfTEFVTkNIX1RJTUVPVVQsXG4gICAgICB3ZGFSZW1vdGVQb3J0OiB0aGlzLndkYVJlbW90ZVBvcnQsXG4gICAgICB1c2VYY3Rlc3RydW5GaWxlOiB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUsXG4gICAgICBkZXJpdmVkRGF0YVBhdGg6IGFyZ3MuZGVyaXZlZERhdGFQYXRoLFxuICAgICAgbWpwZWdTZXJ2ZXJQb3J0OiB0aGlzLm1qcGVnU2VydmVyUG9ydCxcbiAgICAgIGFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uOiBhcmdzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uLFxuICAgICAgcmVzdWx0QnVuZGxlUGF0aDogYXJncy5yZXN1bHRCdW5kbGVQYXRoLFxuICAgICAgcmVzdWx0QnVuZGxlVmVyc2lvbjogYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uLFxuICAgIH0sIHRoaXMubG9nKTtcbiAgfVxuXG4gIHNldFdEQVBhdGhzIChib290c3RyYXBQYXRoLCBhZ2VudFBhdGgpIHtcbiAgICAvLyBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgcGxhY2UgZm9yIFdEQS4gVGhpcyBpcyB1bmRvY3VtZW50ZWQgYW5kXG4gICAgLy8gb25seSBoZXJlIGZvciB0aGUgcHVycG9zZXMgb2YgdGVzdGluZyBkZXZlbG9wbWVudCBvZiBXREFcbiAgICB0aGlzLmJvb3RzdHJhcFBhdGggPSBib290c3RyYXBQYXRoIHx8IEJPT1RTVFJBUF9QQVRIO1xuICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIFdEQSBwYXRoOiAnJHt0aGlzLmJvb3RzdHJhcFBhdGh9J2ApO1xuXG4gICAgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2UgbmVlZCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgYWdlbnRQYXRoIHRvb1xuICAgIHRoaXMuYWdlbnRQYXRoID0gYWdlbnRQYXRoIHx8IHBhdGgucmVzb2x2ZSh0aGlzLmJvb3RzdHJhcFBhdGgsICdXZWJEcml2ZXJBZ2VudC54Y29kZXByb2onKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBVc2luZyBXREEgYWdlbnQ6ICcke3RoaXMuYWdlbnRQYXRofSdgKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFudXBPYnNvbGV0ZVByb2Nlc3NlcyAoKSB7XG4gICAgY29uc3Qgb2Jzb2xldGVQaWRzID0gYXdhaXQgZ2V0UElEc0xpc3RlbmluZ09uUG9ydCh0aGlzLnVybC5wb3J0LFxuICAgICAgKGNtZExpbmUpID0+IGNtZExpbmUuaW5jbHVkZXMoJy9XZWJEcml2ZXJBZ2VudFJ1bm5lcicpICYmXG4gICAgICAgICFjbWRMaW5lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5kZXZpY2UudWRpZC50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICBpZiAoXy5pc0VtcHR5KG9ic29sZXRlUGlkcykpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBObyBvYnNvbGV0ZSBjYWNoZWQgcHJvY2Vzc2VzIGZyb20gcHJldmlvdXMgV0RBIHNlc3Npb25zIGAgK1xuICAgICAgICBgbGlzdGVuaW5nIG9uIHBvcnQgJHt0aGlzLnVybC5wb3J0fSBoYXZlIGJlZW4gZm91bmRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZy5pbmZvKGBEZXRlY3RlZCAke29ic29sZXRlUGlkcy5sZW5ndGh9IG9ic29sZXRlIGNhY2hlZCBwcm9jZXNzJHtvYnNvbGV0ZVBpZHMubGVuZ3RoID09PSAxID8gJycgOiAnZXMnfSBgICtcbiAgICAgIGBmcm9tIHByZXZpb3VzIFdEQSBzZXNzaW9ucy4gQ2xlYW5pbmcgdGhlbSB1cGApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKCdraWxsJywgb2Jzb2xldGVQaWRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBGYWlsZWQgdG8ga2lsbCBvYnNvbGV0ZSBjYWNoZWQgcHJvY2VzcyR7b2Jzb2xldGVQaWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ2VzJ30gJyR7b2Jzb2xldGVQaWRzfScuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpZiBXREEgaXMgcnVubmluZyBvciBub3RcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBXREEgaXMgcnVubmluZ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGludmFsaWQgcmVzcG9uc2UgY29kZSBvciBib2R5XG4gICAqL1xuICBhc3luYyBpc1J1bm5pbmcgKCkge1xuICAgIHJldHVybiAhIShhd2FpdCB0aGlzLmdldFN0YXR1cygpKTtcbiAgfVxuXG4gIGdldCBiYXNlUGF0aCAoKSB7XG4gICAgaWYgKHRoaXMudXJsLnBhdGggPT09ICcvJykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cmwucGF0aCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gY3VycmVudCBydW5uaW5nIFdEQSdzIHN0YXR1cyBsaWtlIGJlbG93XG4gICAqIHtcbiAgICogICBcInN0YXRlXCI6IFwic3VjY2Vzc1wiLFxuICAgKiAgIFwib3NcIjoge1xuICAgKiAgICAgXCJuYW1lXCI6IFwiaU9TXCIsXG4gICAqICAgICBcInZlcnNpb25cIjogXCIxMS40XCIsXG4gICAqICAgICBcInNka1ZlcnNpb25cIjogXCIxMS4zXCJcbiAgICogICB9LFxuICAgKiAgIFwiaW9zXCI6IHtcbiAgICogICAgIFwic2ltdWxhdG9yVmVyc2lvblwiOiBcIjExLjRcIixcbiAgICogICAgIFwiaXBcIjogXCIxNzIuMjU0Ljk5LjM0XCJcbiAgICogICB9LFxuICAgKiAgIFwiYnVpbGRcIjoge1xuICAgKiAgICAgXCJ0aW1lXCI6IFwiSnVuIDI0IDIwMTggMTc6MDg6MjFcIixcbiAgICogICAgIFwicHJvZHVjdEJ1bmRsZUlkZW50aWZpZXJcIjogXCJjb20uZmFjZWJvb2suV2ViRHJpdmVyQWdlbnRSdW5uZXJcIlxuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBTdGF0ZSBPYmplY3RcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBpbnZhbGlkIHJlc3BvbnNlIGNvZGUgb3IgYm9keVxuICAgKi9cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHtcbiAgICBjb25zdCBub1Nlc3Npb25Qcm94eSA9IG5ldyBOb1Nlc3Npb25Qcm94eSh7XG4gICAgICBzZXJ2ZXI6IHRoaXMudXJsLmhvc3RuYW1lLFxuICAgICAgcG9ydDogdGhpcy51cmwucG9ydCxcbiAgICAgIGJhc2U6IHRoaXMuYmFzZVBhdGgsXG4gICAgICB0aW1lb3V0OiAzMDAwLFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgbm9TZXNzaW9uUHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBXREEgaXMgbm90IGxpc3RlbmluZyBhdCAnJHt0aGlzLnVybC5ocmVmfSdgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmluc3RhbGwgV0RBcyBmcm9tIHRoZSB0ZXN0IGRldmljZS5cbiAgICogT3ZlciBYY29kZSAxMSwgbXVsdGlwbGUgV0RBIGNhbiBiZSBpbiB0aGUgZGV2aWNlIHNpbmNlIFhjb2RlIDExIGdlbmVyYXRlcyBkaWZmZXJlbnQgV0RBLlxuICAgKiBBcHBpdW0gZG9lcyBub3QgZXhwZWN0IG11bHRpcGxlIFdEQXMgYXJlIHJ1bm5pbmcgb24gYSBkZXZpY2UuXG4gICAqL1xuICBhc3luYyB1bmluc3RhbGwgKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBidW5kbGVJZHMgPSBhd2FpdCB0aGlzLmRldmljZS5nZXRVc2VySW5zdGFsbGVkQnVuZGxlSWRzQnlCdW5kbGVOYW1lKFdEQV9DRl9CVU5ETEVfTkFNRSk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGJ1bmRsZUlkcykpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ05vIFdEQXMgb24gdGhlIGRldmljZS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgVW5pbnN0YWxsaW5nIFdEQXM6ICcke2J1bmRsZUlkc30nYCk7XG4gICAgICBmb3IgKGNvbnN0IGJ1bmRsZUlkIG9mIGJ1bmRsZUlkcykge1xuICAgICAgICBhd2FpdCB0aGlzLmRldmljZS5yZW1vdmVBcHAoYnVuZGxlSWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGUpO1xuICAgICAgdGhpcy5sb2cud2FybihgV2ViRHJpdmVyQWdlbnQgdW5pbnN0YWxsIGZhaWxlZC4gUGVyaGFwcywgaXQgaXMgYWxyZWFkeSB1bmluc3RhbGxlZD8gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX2NsZWFudXBQcm9qZWN0SWZGcmVzaCAoKSB7XG4gICAgY29uc3QgaG9tZUZvbGRlciA9IHByb2Nlc3MuZW52LkhPTUU7XG4gICAgaWYgKCFob21lRm9sZGVyKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdUaGUgSE9NRSBmb2xkZXIgcGF0aCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRVcGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCgpO1xuICAgIGlmICghXy5pc0ludGVnZXIoY3VycmVudFVwZ3JhZGVUaW1lc3RhbXApKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdJdCBpcyBpbXBvc3NpYmxlIHRvIGRldGVybWluZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBwYWNrYWdlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGltZXN0YW1wUGF0aCA9IHBhdGgucmVzb2x2ZShob21lRm9sZGVyLCBXREFfVVBHUkFERV9USU1FU1RBTVBfUEFUSCk7XG4gICAgY29uc3QgZGlkVGltZXN0YW1wRXhpc3QgPSBhd2FpdCBmcy5leGlzdHModGltZXN0YW1wUGF0aCk7XG4gICAgaWYgKGRpZFRpbWVzdGFtcEV4aXN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3ModGltZXN0YW1wUGF0aCwgZnMuV19PSyk7XG4gICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgdXBncmFkZSB0aW1lc3RhbXAgYXQgJyR7dGltZXN0YW1wUGF0aH0nIGlzIG5vdCB3cml0ZWFibGUuIGAgK1xuICAgICAgICAgIGBTa2lwcGluZyBzb3VyY2VzIGNsZWFudXBgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjZW50VXBncmFkZVRpbWVzdGFtcCA9IHBhcnNlSW50KGF3YWl0IGZzLnJlYWRGaWxlKHRpbWVzdGFtcFBhdGgsICd1dGY4JyksIDEwKTtcbiAgICAgIGlmIChfLmlzSW50ZWdlcihyZWNlbnRVcGdyYWRlVGltZXN0YW1wKSkge1xuICAgICAgICBpZiAocmVjZW50VXBncmFkZVRpbWVzdGFtcCA+PSBjdXJyZW50VXBncmFkZVRpbWVzdGFtcCkge1xuICAgICAgICAgIHRoaXMubG9nLmluZm8oYFdlYkRyaXZlckFnZW50IGRvZXMgbm90IG5lZWQgYSBjbGVhbnVwLiBUaGUgc291cmNlcyBhcmUgdXAgdG8gZGF0ZSBgICtcbiAgICAgICAgICAgIGAoJHtyZWNlbnRVcGdyYWRlVGltZXN0YW1wfSA+PSAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfSlgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgc291cmNlcyBoYXZlIGJlZW4gdXBncmFkZWQgYCArXG4gICAgICAgICAgYCgke3JlY2VudFVwZ3JhZGVUaW1lc3RhbXB9IDwgJHtjdXJyZW50VXBncmFkZVRpbWVzdGFtcH0pYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBUaGUgcmVjZW50IHVwZ3JhZGUgdGltZXN0YW1wIGF0ICcke3RpbWVzdGFtcFBhdGh9JyBpcyBjb3JydXB0ZWQuIFRyeWluZyB0byBmaXggaXRgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbWtkaXJwKHBhdGguZGlybmFtZSh0aW1lc3RhbXBQYXRoKSk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGltZXN0YW1wUGF0aCwgYCR7Y3VycmVudFVwZ3JhZGVUaW1lc3RhbXB9YCwgJ3V0ZjgnKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTdG9yZWQgdGhlIHJlY2VudCBXZWJEcml2ZXJBZ2VudCB1cGdyYWRlIHRpbWVzdGFtcCAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfSBgICtcbiAgICAgICAgYGF0ICcke3RpbWVzdGFtcFBhdGh9J2ApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFVuYWJsZSB0byBjcmVhdGUgdGhlIHJlY2VudCBXZWJEcml2ZXJBZ2VudCB1cGdyYWRlIHRpbWVzdGFtcCBhdCAnJHt0aW1lc3RhbXBQYXRofScuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGlkVGltZXN0YW1wRXhpc3QpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1RoZXJlIGlzIG5vIG5lZWQgdG8gcGVyZm9ybSB0aGUgcHJvamVjdCBjbGVhbnVwLiBBIGZyZXNoIGluc3RhbGwgaGFzIGJlZW4gZGV0ZWN0ZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLmNsZWFuUHJvamVjdCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCBwZXJmb3JtIFdlYkRyaXZlckFnZW50IHByb2plY3QgY2xlYW51cC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gY3VycmVudCBydW5uaW5nIFdEQSdzIHN0YXR1cyBsaWtlIGJlbG93IGFmdGVyIGxhdW5jaGluZyBXREFcbiAgICoge1xuICAgKiAgIFwic3RhdGVcIjogXCJzdWNjZXNzXCIsXG4gICAqICAgXCJvc1wiOiB7XG4gICAqICAgICBcIm5hbWVcIjogXCJpT1NcIixcbiAgICogICAgIFwidmVyc2lvblwiOiBcIjExLjRcIixcbiAgICogICAgIFwic2RrVmVyc2lvblwiOiBcIjExLjNcIlxuICAgKiAgIH0sXG4gICAqICAgXCJpb3NcIjoge1xuICAgKiAgICAgXCJzaW11bGF0b3JWZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJpcFwiOiBcIjE3Mi4yNTQuOTkuMzRcIlxuICAgKiAgIH0sXG4gICAqICAgXCJidWlsZFwiOiB7XG4gICAqICAgICBcInRpbWVcIjogXCJKdW4gMjQgMjAxOCAxNzowODoyMVwiLFxuICAgKiAgICAgXCJwcm9kdWN0QnVuZGxlSWRlbnRpZmllclwiOiBcImNvbS5mYWNlYm9vay5XZWJEcml2ZXJBZ2VudFJ1bm5lclwiXG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWQgTGF1bmNoIFdEQSBhbmQgZXN0YWJsaXNoIHRoZSBzZXNzaW9uIHdpdGggdGhpcyBzZXNzaW9uSWRcbiAgICogQHJldHVybiB7P29iamVjdH0gU3RhdGUgT2JqZWN0XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgaW52YWxpZCByZXNwb25zZSBjb2RlIG9yIGJvZHlcbiAgICovXG4gIGFzeW5jIGxhdW5jaCAoc2Vzc2lvbklkKSB7XG4gICAgaWYgKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIHByb3ZpZGVkIFdlYmRyaXZlckFnZW50IGF0ICcke3RoaXMud2ViRHJpdmVyQWdlbnRVcmx9J2ApO1xuICAgICAgdGhpcy51cmwgPSB0aGlzLndlYkRyaXZlckFnZW50VXJsO1xuICAgICAgdGhpcy5zZXR1cFByb3hpZXMoc2Vzc2lvbklkKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmluZm8oJ0xhdW5jaGluZyBXZWJEcml2ZXJBZ2VudCBvbiB0aGUgZGV2aWNlJyk7XG5cbiAgICB0aGlzLnNldHVwUHJveGllcyhzZXNzaW9uSWQpO1xuXG4gICAgaWYgKCF0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgJiYgIWF3YWl0IGZzLmV4aXN0cyh0aGlzLmFnZW50UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJ5aW5nIHRvIHVzZSBXZWJEcml2ZXJBZ2VudCBwcm9qZWN0IGF0ICcke3RoaXMuYWdlbnRQYXRofScgYnV0IHRoZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAnZmlsZSBkb2VzIG5vdCBleGlzdCcpO1xuICAgIH1cblxuICAgIC8vIHVzZVhjdGVzdHJ1bkZpbGUgYW5kIHVzZVByZWJ1aWx0V0RBIHVzZSBleGlzdGluZyBkZXBlbmRlbmNpZXNcbiAgICAvLyBJdCBkZXBlbmRzIG9uIHVzZXIgc2lkZVxuICAgIGlmICh0aGlzLmlkYiB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgfHwgKHRoaXMuZGVyaXZlZERhdGFQYXRoICYmIHRoaXMudXNlUHJlYnVpbHRXREEpKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdTa2lwcGVkIFdEQSBwcm9qZWN0IGNsZWFudXAgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBjYXBhYmlsaXRpZXMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3luY2hyb25pemF0aW9uS2V5ID0gcGF0aC5ub3JtYWxpemUodGhpcy5ib290c3RyYXBQYXRoKTtcbiAgICAgIGF3YWl0IFNIQVJFRF9SRVNPVVJDRVNfR1VBUkQuYWNxdWlyZShzeW5jaHJvbml6YXRpb25LZXksXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuX2NsZWFudXBQcm9qZWN0SWZGcmVzaCgpKTtcbiAgICB9XG5cbiAgICAvLyBXZSBuZWVkIHRvIHByb3ZpZGUgV0RBIGxvY2FsIHBvcnQsIGJlY2F1c2UgaXQgbWlnaHQgYmUgb2NjdXBpZWRcbiAgICBhd2FpdCByZXNldFRlc3RQcm9jZXNzZXModGhpcy5kZXZpY2UudWRpZCwgIXRoaXMuaXNSZWFsRGV2aWNlKTtcblxuICAgIGlmICh0aGlzLmlkYikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3RhcnRXaXRoSURCKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLmluaXQodGhpcy5ub1Nlc3Npb25Qcm94eSk7XG5cbiAgICAvLyBTdGFydCB0aGUgeGNvZGVidWlsZCBwcm9jZXNzXG4gICAgaWYgKHRoaXMucHJlYnVpbGRXREEpIHtcbiAgICAgIGF3YWl0IHRoaXMueGNvZGVidWlsZC5wcmVidWlsZCgpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnN0YXJ0KCk7XG4gIH1cblxuICBhc3luYyBzdGFydFdpdGhJREIgKCkge1xuICAgIHRoaXMubG9nLmluZm8oJ1dpbGwgbGF1bmNoIFdEQSB3aXRoIGlkYiBpbnN0ZWFkIG9mIHhjb2RlYnVpbGQgc2luY2UgdGhlIGNvcnJlc3BvbmRpbmcgZmxhZyBpcyBlbmFibGVkJyk7XG4gICAgY29uc3Qge3dkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWR9ID0gYXdhaXQgdGhpcy5wcmVwYXJlV0RBKCk7XG4gICAgY29uc3QgZW52ID0ge1xuICAgICAgVVNFX1BPUlQ6IHRoaXMud2RhUmVtb3RlUG9ydCxcbiAgICAgIFdEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCxcbiAgICB9O1xuICAgIGlmICh0aGlzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgZW52Lk1KUEVHX1NFUlZFUl9QT1JUID0gdGhpcy5tanBlZ1NlcnZlclBvcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRiLnJ1blhDVUlUZXN0KHdkYUJ1bmRsZUlkLCB3ZGFCdW5kbGVJZCwgdGVzdEJ1bmRsZUlkLCB7ZW52fSk7XG4gIH1cblxuICBhc3luYyBwYXJzZUJ1bmRsZUlkICh3ZGFCdW5kbGVQYXRoKSB7XG4gICAgY29uc3QgaW5mb1BsaXN0UGF0aCA9IHBhdGguam9pbih3ZGFCdW5kbGVQYXRoLCAnSW5mby5wbGlzdCcpO1xuICAgIGNvbnN0IGluZm9QbGlzdCA9IGF3YWl0IHBsaXN0LnBhcnNlUGxpc3QoYXdhaXQgZnMucmVhZEZpbGUoaW5mb1BsaXN0UGF0aCkpO1xuICAgIGlmICghaW5mb1BsaXN0LkNGQnVuZGxlSWRlbnRpZmllcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBidW5kbGUgaWQgaW4gJyR7aW5mb1BsaXN0UGF0aH0nYCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvUGxpc3QuQ0ZCdW5kbGVJZGVudGlmaWVyO1xuICB9XG5cbiAgYXN5bmMgcHJlcGFyZVdEQSAoKSB7XG4gICAgY29uc3Qgd2RhQnVuZGxlUGF0aCA9IHRoaXMud2RhQnVuZGxlUGF0aCB8fCBhd2FpdCB0aGlzLmZldGNoV0RBQnVuZGxlKCk7XG4gICAgY29uc3Qgd2RhQnVuZGxlSWQgPSBhd2FpdCB0aGlzLnBhcnNlQnVuZGxlSWQod2RhQnVuZGxlUGF0aCk7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmRldmljZS5pc0FwcEluc3RhbGxlZCh3ZGFCdW5kbGVJZCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGV2aWNlLmluc3RhbGxBcHAod2RhQnVuZGxlUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHRlc3RCdW5kbGVJZCA9IGF3YWl0IHRoaXMuaWRiLmluc3RhbGxYQ1Rlc3RCdW5kbGUocGF0aC5qb2luKHdkYUJ1bmRsZVBhdGgsICdQbHVnSW5zJywgJ1dlYkRyaXZlckFnZW50UnVubmVyLnhjdGVzdCcpKTtcbiAgICByZXR1cm4ge3dkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWQsIHdkYUJ1bmRsZVBhdGh9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hXREFCdW5kbGUgKCkge1xuICAgIGlmICghdGhpcy5kZXJpdmVkRGF0YVBhdGgpIHtcbiAgICAgIHJldHVybiBhd2FpdCBidW5kbGVXREFTaW0odGhpcy54Y29kZWJ1aWxkKTtcbiAgICB9XG4gICAgY29uc3Qgd2RhQnVuZGxlUGF0aHMgPSBhd2FpdCBmcy5nbG9iKGAke3RoaXMuZGVyaXZlZERhdGFQYXRofS8qKi8qJHtXREFfUlVOTkVSX0FQUH0vYCwge1xuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKF8uaXNFbXB0eSh3ZGFCdW5kbGVQYXRocykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIFdEQSBidW5kbGUgaW4gJyR7dGhpcy5kZXJpdmVkRGF0YVBhdGh9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gd2RhQnVuZGxlUGF0aHNbMF07XG4gIH1cblxuICBhc3luYyBpc1NvdXJjZUZyZXNoICgpIHtcbiAgICBjb25zdCBleGlzdHNQcm9taXNlcyA9IFtcbiAgICAgICdSZXNvdXJjZXMnLFxuICAgICAgYFJlc291cmNlcyR7cGF0aC5zZXB9V2ViRHJpdmVyQWdlbnQuYnVuZGxlYCxcbiAgICBdLm1hcCgoc3ViUGF0aCkgPT4gZnMuZXhpc3RzKHBhdGgucmVzb2x2ZSh0aGlzLmJvb3RzdHJhcFBhdGgsIHN1YlBhdGgpKSk7XG4gICAgcmV0dXJuIChhd2FpdCBCLmFsbChleGlzdHNQcm9taXNlcykpLnNvbWUoKHYpID0+IHYgPT09IGZhbHNlKTtcbiAgfVxuXG4gIHNldHVwUHJveGllcyAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgcHJveHlPcHRzID0ge1xuICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgIHNlcnZlcjogdGhpcy51cmwuaG9zdG5hbWUsXG4gICAgICBwb3J0OiB0aGlzLnVybC5wb3J0LFxuICAgICAgYmFzZTogdGhpcy5iYXNlUGF0aCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMud2RhQ29ubmVjdGlvblRpbWVvdXQsXG4gICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgfTtcblxuICAgIHRoaXMuandwcm94eSA9IG5ldyBKV1Byb3h5KHByb3h5T3B0cyk7XG4gICAgdGhpcy5qd3Byb3h5LnNlc3Npb25JZCA9IHNlc3Npb25JZDtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcblxuICAgIHRoaXMubm9TZXNzaW9uUHJveHkgPSBuZXcgTm9TZXNzaW9uUHJveHkocHJveHlPcHRzKTtcbiAgfVxuXG4gIGFzeW5jIHF1aXQgKCkge1xuICAgIHRoaXMubG9nLmluZm8oJ1NodXR0aW5nIGRvd24gc3ViLXByb2Nlc3NlcycpO1xuXG4gICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnF1aXQoKTtcbiAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQucmVzZXQoKTtcblxuICAgIGlmICh0aGlzLmp3cHJveHkpIHtcbiAgICAgIHRoaXMuandwcm94eS5zZXNzaW9uSWQgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmFyZ3Mud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgIC8vIGlmIHdlIHBvcHVsYXRlZCB0aGUgdXJsIG91cnNlbHZlcyAoZHVyaW5nIGBzZXR1cENhY2hpbmdgIGNhbGwsIGZvciBpbnN0YW5jZSlcbiAgICAgIC8vIHRoZW4gY2xlYW4gdGhhdCB1cC4gSWYgdGhlIHVybCB3YXMgc3VwcGxpZWQsIHdlIHdhbnQgdG8ga2VlcCBpdFxuICAgICAgdGhpcy53ZWJEcml2ZXJBZ2VudFVybCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHVybCAoKSB7XG4gICAgaWYgKCF0aGlzLl91cmwpIHtcbiAgICAgIGlmICh0aGlzLndlYkRyaXZlckFnZW50VXJsKSB7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZSh0aGlzLndlYkRyaXZlckFnZW50VXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSB0aGlzLndkYUxvY2FsUG9ydCB8fCBXREFfQUdFTlRfUE9SVDtcbiAgICAgICAgY29uc3Qge3Byb3RvY29sLCBob3N0bmFtZX0gPSB1cmwucGFyc2UodGhpcy53ZGFCYXNlVXJsIHx8IFdEQV9CQVNFX1VSTCk7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZShgJHtwcm90b2NvbH0vLyR7aG9zdG5hbWV9OiR7cG9ydH1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIHNldCB1cmwgKF91cmwpIHtcbiAgICB0aGlzLl91cmwgPSB1cmwucGFyc2UoX3VybCk7XG4gIH1cblxuICBnZXQgZnVsbHlTdGFydGVkICgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydGVkO1xuICB9XG5cbiAgc2V0IGZ1bGx5U3RhcnRlZCAoc3RhcnRlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy5zdGFydGVkID0gc3RhcnRlZDtcbiAgfVxuXG4gIGFzeW5jIHJldHJpZXZlRGVyaXZlZERhdGFQYXRoICgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnJldHJpZXZlRGVyaXZlZERhdGFQYXRoKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV1c2UgcnVubmluZyBXREEgaWYgaXQgaGFzIHRoZSBzYW1lIGJ1bmRsZSBpZCB3aXRoIHVwZGF0ZWRXREFCdW5kbGVJZC5cbiAgICogT3IgcmV1c2UgaXQgaWYgaXQgaGFzIHRoZSBkZWZhdWx0IGlkIHdpdGhvdXQgdXBkYXRlZFdEQUJ1bmRsZUlkLlxuICAgKiBVbmluc3RhbGwgaXQgaWYgdGhlIG1ldGhvZCBmYWNlcyBhbiBleGNlcHRpb24gZm9yIHRoZSBhYm92ZSBzaXR1YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cGRhdGVkV0RBQnVuZGxlSWQgQnVuZGxlSWQgeW91J2QgbGlrZSB0byB1c2VcbiAgICovXG4gIGFzeW5jIHNldHVwQ2FjaGluZyAoKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5nZXRTdGF0dXMoKTtcbiAgICBpZiAoIXN0YXR1cyB8fCAhc3RhdHVzLmJ1aWxkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnV0RBIGlzIGN1cnJlbnRseSBub3QgcnVubmluZy4gVGhlcmUgaXMgbm90aGluZyB0byBjYWNoZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyLFxuICAgICAgdXBncmFkZWRBdCxcbiAgICB9ID0gc3RhdHVzLmJ1aWxkO1xuICAgIC8vIGZvciByZWFsIGRldmljZVxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSAmJiB1dGlsLmhhc1ZhbHVlKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSAmJiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCAhPT0gcHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFdpbGwgdW5pbnN0YWxsIHJ1bm5pbmcgV0RBIHNpbmNlIGl0IGhhcyBkaWZmZXJlbnQgYnVuZGxlIGlkLiBUaGUgYWN0dWFsIHZhbHVlIGlzICcke3Byb2R1Y3RCdW5kbGVJZGVudGlmaWVyfScuYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmluc3RhbGwoKTtcbiAgICB9XG4gICAgLy8gZm9yIHNpbXVsYXRvclxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSAmJiAhdXRpbC5oYXNWYWx1ZSh0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCkgJiYgV0RBX1JVTk5FUl9CVU5ETEVfSUQgIT09IHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBXaWxsIHVuaW5zdGFsbCBydW5uaW5nIFdEQSBzaW5jZSBpdHMgYnVuZGxlIGlkIGlzIG5vdCBlcXVhbCB0byB0aGUgZGVmYXVsdCB2YWx1ZSAke1dEQV9SVU5ORVJfQlVORExFX0lEfWApO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsVXBncmFkZVRpbWVzdGFtcCA9IGF3YWl0IGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgVXBncmFkZSB0aW1lc3RhbXAgb2YgdGhlIGN1cnJlbnRseSBidW5kbGVkIFdEQTogJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGBVcGdyYWRlIHRpbWVzdGFtcCBvZiB0aGUgV0RBIG9uIHRoZSBkZXZpY2U6ICR7dXBncmFkZWRBdH1gKTtcbiAgICBpZiAoYWN0dWFsVXBncmFkZVRpbWVzdGFtcCAmJiB1cGdyYWRlZEF0ICYmIF8udG9Mb3dlcihgJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfWApICE9PSBfLnRvTG93ZXIoYCR7dXBncmFkZWRBdH1gKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnV2lsbCB1bmluc3RhbGwgcnVubmluZyBXREEgc2luY2UgaXQgaGFzIGRpZmZlcmVudCB2ZXJzaW9uIGluIGNvbXBhcmlzb24gdG8gdGhlIG9uZSAnICtcbiAgICAgICAgYHdoaWNoIGlzIGJ1bmRsZWQgd2l0aCBhcHBpdW0teGN1aXRlc3QtZHJpdmVyIG1vZHVsZSAoJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfSAhPSAke3VwZ3JhZGVkQXR9KWApO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IHV0aWwuaGFzVmFsdWUocHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpXG4gICAgICA/IGBXaWxsIHJldXNlIHByZXZpb3VzbHkgY2FjaGVkIFdEQSBpbnN0YW5jZSBhdCAnJHt0aGlzLnVybC5ocmVmfScgd2l0aCAnJHtwcm9kdWN0QnVuZGxlSWRlbnRpZmllcn0nYFxuICAgICAgOiBgV2lsbCByZXVzZSBwcmV2aW91c2x5IGNhY2hlZCBXREEgaW5zdGFuY2UgYXQgJyR7dGhpcy51cmwuaHJlZn0nYDtcbiAgICB0aGlzLmxvZy5pbmZvKGAke21lc3NhZ2V9LiBTZXQgdGhlIHdkYUxvY2FsUG9ydCBjYXBhYmlsaXR5IHRvIGEgdmFsdWUgZGlmZmVyZW50IGZyb20gJHt0aGlzLnVybC5wb3J0fSBpZiB0aGlzIGlzIGFuIHVuZGVzaXJlZCBiZWhhdmlvci5gKTtcbiAgICB0aGlzLndlYkRyaXZlckFnZW50VXJsID0gdGhpcy51cmwuaHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWl0IGFuZCB1bmluc3RhbGwgcnVubmluZyBXREEuXG4gICAqL1xuICBhc3luYyBxdWl0QW5kVW5pbnN0YWxsICgpIHtcbiAgICBhd2FpdCB0aGlzLnF1aXQoKTtcbiAgICBhd2FpdCB0aGlzLnVuaW5zdGFsbCgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFdlYkRyaXZlckFnZW50O1xuZXhwb3J0IHsgV2ViRHJpdmVyQWdlbnQgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFD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