@appium/base-driver 8.5.7 → 8.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/build/lib/basedriver/capabilities.js +2 -2
  2. package/build/lib/basedriver/commands/log.js +2 -4
  3. package/build/lib/basedriver/core.d.ts +8 -0
  4. package/build/lib/basedriver/core.d.ts.map +1 -1
  5. package/build/lib/basedriver/core.js +5 -1
  6. package/build/lib/basedriver/helpers.js +2 -2
  7. package/build/lib/express/server.d.ts +69 -7
  8. package/build/lib/express/server.d.ts.map +1 -1
  9. package/build/lib/express/server.js +18 -16
  10. package/build/lib/express/websocket.d.ts +12 -30
  11. package/build/lib/express/websocket.d.ts.map +1 -1
  12. package/build/lib/express/websocket.js +6 -4
  13. package/build/lib/index.d.ts +11 -180
  14. package/build/lib/index.js +107 -80
  15. package/build/lib/jsonwp-proxy/protocol-converter.js +2 -4
  16. package/build/lib/jsonwp-proxy/proxy.js +3 -7
  17. package/build/lib/protocol/protocol.d.ts +6 -4
  18. package/build/lib/protocol/protocol.d.ts.map +1 -1
  19. package/build/lib/protocol/protocol.js +5 -7
  20. package/build/lib/protocol/routes.js +2 -6
  21. package/build/tsconfig.tsbuildinfo +1 -1
  22. package/lib/basedriver/core.js +11 -0
  23. package/lib/express/server.js +124 -36
  24. package/lib/express/websocket.js +13 -11
  25. package/lib/index.js +16 -62
  26. package/lib/protocol/protocol.js +8 -1
  27. package/package.json +16 -14
  28. package/build/test/basedriver/README.md +0 -5
  29. package/build/test/basedriver/driver-e2e-tests.js +0 -413
  30. package/build/test/basedriver/driver-tests.js +0 -572
  31. package/build/test/basedriver/index.js +0 -26
  32. package/build/test/e2e/basedriver/driver.e2e.spec.js +0 -15
  33. package/build/test/e2e/basedriver/helpers.e2e.spec.js +0 -192
  34. package/build/test/e2e/basedriver/websockets.e2e.spec.js +0 -87
  35. package/build/test/e2e/express/server.e2e.spec.js +0 -159
  36. package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +0 -59
  37. package/build/test/e2e/protocol/fake-driver.js +0 -163
  38. package/build/test/e2e/protocol/helpers.js +0 -25
  39. package/build/test/e2e/protocol/protocol.e2e.spec.js +0 -1186
  40. package/build/test/helpers.js +0 -55
  41. package/build/test/unit/basedriver/capabilities.spec.js +0 -672
  42. package/build/test/unit/basedriver/capability.spec.js +0 -353
  43. package/build/test/unit/basedriver/commands/event.spec.js +0 -110
  44. package/build/test/unit/basedriver/commands/log.spec.js +0 -92
  45. package/build/test/unit/basedriver/device-settings.spec.js +0 -97
  46. package/build/test/unit/basedriver/driver.spec.js +0 -15
  47. package/build/test/unit/basedriver/helpers.spec.js +0 -151
  48. package/build/test/unit/basedriver/timeout.spec.js +0 -135
  49. package/build/test/unit/express/server.spec.js +0 -155
  50. package/build/test/unit/express/static.spec.js +0 -26
  51. package/build/test/unit/jsonwp-proxy/mock-request.js +0 -91
  52. package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +0 -171
  53. package/build/test/unit/jsonwp-proxy/proxy.spec.js +0 -292
  54. package/build/test/unit/jsonwp-proxy/url.spec.js +0 -165
  55. package/build/test/unit/jsonwp-status/status.spec.js +0 -34
  56. package/build/test/unit/protocol/errors.spec.js +0 -390
  57. package/build/test/unit/protocol/routes.spec.js +0 -80
  58. package/build/test/unit/protocol/validator.spec.js +0 -149
  59. package/test/basedriver/README.md +0 -5
  60. package/test/basedriver/driver-e2e-tests.js +0 -386
  61. package/test/basedriver/driver-tests.js +0 -624
  62. package/test/basedriver/index.js +0 -6
@@ -43,15 +43,13 @@ function determineProtocol(createSessionArgs) {
43
43
  }
44
44
 
45
45
  function extractProtocol(driver, sessionId = null) {
46
- var _dstDriver$protocol;
47
-
48
46
  const dstDriver = _lodash.default.isFunction(driver.driverForSession) ? driver.driverForSession(sessionId) : driver;
49
47
 
50
48
  if (dstDriver === driver) {
51
49
  return driver.protocol;
52
50
  }
53
51
 
54
- return (_dstDriver$protocol = dstDriver === null || dstDriver === void 0 ? void 0 : dstDriver.protocol) !== null && _dstDriver$protocol !== void 0 ? _dstDriver$protocol : _constants.PROTOCOLS.W3C;
52
+ return (dstDriver === null || dstDriver === void 0 ? void 0 : dstDriver.protocol) ?? _constants.PROTOCOLS.W3C;
55
53
  }
56
54
 
57
55
  function isSessionCommand(command) {
@@ -59,9 +57,9 @@ function isSessionCommand(command) {
59
57
  }
60
58
 
61
59
  function getLogger(driver, sessionId = null) {
62
- var _driver$driverForSess, _dstDriver$log;
60
+ var _dstDriver$log;
63
61
 
64
- const dstDriver = sessionId && _lodash.default.isFunction(driver.driverForSession) ? (_driver$driverForSess = driver.driverForSession(sessionId)) !== null && _driver$driverForSess !== void 0 ? _driver$driverForSess : driver : driver;
62
+ const dstDriver = sessionId && _lodash.default.isFunction(driver.driverForSession) ? driver.driverForSession(sessionId) ?? driver : driver;
65
63
 
66
64
  if (_lodash.default.isFunction((_dstDriver$log = dstDriver.log) === null || _dstDriver$log === void 0 ? void 0 : _dstDriver$log.info)) {
67
65
  return dstDriver.log;
@@ -192,7 +190,7 @@ function routeConfiguringFunction(driver) {
192
190
  return function addRoutes(app, {
193
191
  basePath = _constants.DEFAULT_BASE_PATH,
194
192
  extraMethodMap = {}
195
- }) {
193
+ } = {}) {
196
194
  driver.basePath = basePath;
197
195
  const allMethods = { ..._routes.METHOD_MAP,
198
196
  ...extraMethodMap
@@ -391,4 +389,4 @@ async function doJwpProxy(driver, req, res) {
391
389
  }
392
390
  }
393
391
  }
394
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsIkdFVF9TVEFUVVNfQ09NTUFORCIsImRldGVybWluZVByb3RvY29sIiwiY3JlYXRlU2Vzc2lvbkFyZ3MiLCJfIiwic29tZSIsImlzVzNjQ2FwcyIsIlBST1RPQ09MUyIsIlczQyIsIk1KU09OV1AiLCJleHRyYWN0UHJvdG9jb2wiLCJkcml2ZXIiLCJzZXNzaW9uSWQiLCJkc3REcml2ZXIiLCJpc0Z1bmN0aW9uIiwiZHJpdmVyRm9yU2Vzc2lvbiIsInByb3RvY29sIiwiaXNTZXNzaW9uQ29tbWFuZCIsImNvbW1hbmQiLCJpbmNsdWRlcyIsIk5PX1NFU1NJT05fSURfQ09NTUFORFMiLCJnZXRMb2dnZXIiLCJsb2ciLCJpbmZvIiwibG9nUHJlZml4IiwiY29uc3RydWN0b3IiLCJuYW1lIiwibm9kZSIsImdldE9iamVjdElkIiwic3Vic3RyaW5nIiwibG9nZ2VyIiwid3JhcFBhcmFtcyIsInBhcmFtU2V0cyIsImpzb25PYmoiLCJyZXMiLCJpc0FycmF5IiwiaXNPYmplY3QiLCJ3cmFwIiwidW53cmFwUGFyYW1zIiwidW53cmFwIiwiY2hlY2tQYXJhbXMiLCJyZXF1aXJlZFBhcmFtcyIsIm9wdGlvbmFsUGFyYW1zIiwicmVjZWl2ZWRQYXJhbXMiLCJrZXlzIiwicmVxdWlyZWQiLCJmaXJzdCIsIm9wdGlvbmFsIiwidmFsaWRhdGUiLCJtZXNzYWdlIiwiZXJyb3JzIiwiQmFkUGFyYW1ldGVyc0Vycm9yIiwibGVuZ3RoIiwiaW5kZXhPZiIsInB1c2giLCJwYXJhbXMiLCJkaWZmZXJlbmNlIiwibWFrZUFyZ3MiLCJyZXF1ZXN0UGFyYW1zIiwicGF5bG9hZFBhcmFtcyIsInVybFBhcmFtcyIsInJldmVyc2UiLCJ3aXRob3V0IiwiYXJncyIsImZsYXR0ZW4iLCJtYXAiLCJwIiwiY29uY2F0IiwidSIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlc3Npb25FeGlzdHMiLCJFcnJvciIsImV4ZWN1dGVDb21tYW5kIiwiZXhlY3V0ZSIsImFkZFJvdXRlcyIsImFwcCIsImJhc2VQYXRoIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJleHRyYU1ldGhvZE1hcCIsImFsbE1ldGhvZHMiLCJNRVRIT0RfTUFQIiwicGF0aCIsIm1ldGhvZHMiLCJ0b1BhaXJzIiwibWV0aG9kIiwic3BlYyIsImJ1aWxkSGFuZGxlciIsImlzU2Vzc0NtZCIsImFzeW5jSGFuZGxlciIsInJlcSIsImJvZHkiLCJodHRwUmVzQm9keSIsImh0dHBTdGF0dXMiLCJuZXdTZXNzaW9uSWQiLCJjdXJyZW50UHJvdG9jb2wiLCJOb1N1Y2hEcml2ZXJFcnJvciIsImRpZFBsdWdpbk92ZXJyaWRlUHJveHkiLCJuZXZlclByb3h5IiwiZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImRvSndwUHJveHkiLCJkZWJ1ZyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJkcml2ZXJSZXMiLCJ2YWxpZGF0b3JzIiwidHJ1bmNhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiTUFYX0xPR19CT0RZX0xFTkdUSCIsInJlcUZvclByb3h5IiwiaXNQbGFpbk9iamVjdCIsImhhcyIsImVycm9yIiwidmFsdWUiLCJjYXBhYmlsaXRpZXMiLCJmb3JtYXRSZXNwb25zZVZhbHVlIiwidXRpbCIsImhhc1ZhbHVlIiwic3RhdHVzIiwiaXNOYU4iLCJwYXJzZUludCIsImVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlIiwiZXJyb3JGcm9tVzNDSnNvbkNvZGUiLCJzdGFja3RyYWNlIiwiZXJyIiwiYWN0dWFsRXJyIiwiZXJyTXNnIiwic3RhY2siLCJpc0Vycm9yVHlwZSIsIlByb3h5UmVxdWVzdEVycm9yIiwiZ2V0QWN0dWFsRXJyb3IiLCJnZXRSZXNwb25zZUZvclczQ0Vycm9yIiwiaXNTdHJpbmciLCJzZW5kIiwiZm9ybWF0U3RhdHVzIiwianNvbiIsInRvTG93ZXJDYXNlIiwiQiIsInJlc29sdmUiLCJkb25lIiwicHJveHlBY3RpdmUiLCJwcm94eVJvdXRlSXNBdm9pZGVkIiwib3JpZ2luYWxVcmwiLCJjYW5Qcm94eSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9wcm90b2NvbC9wcm90b2NvbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHt1dGlsLCBsb2dnZXIsIG5vZGV9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQge3ZhbGlkYXRvcnN9IGZyb20gJy4vdmFsaWRhdG9ycyc7XG5pbXBvcnQge1xuICBlcnJvcnMsXG4gIGlzRXJyb3JUeXBlLFxuICBnZXRSZXNwb25zZUZvclczQ0Vycm9yLFxuICBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZSxcbiAgZXJyb3JGcm9tVzNDSnNvbkNvZGUsXG59IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7TUVUSE9EX01BUCwgTk9fU0VTU0lPTl9JRF9DT01NQU5EU30gZnJvbSAnLi9yb3V0ZXMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtmb3JtYXRSZXNwb25zZVZhbHVlLCBmb3JtYXRTdGF0dXN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge01BWF9MT0dfQk9EWV9MRU5HVEgsIFBST1RPQ09MUywgREVGQVVMVF9CQVNFX1BBVEh9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge2lzVzNjQ2Fwc30gZnJvbSAnLi4vaGVscGVycy9jYXBhYmlsaXRpZXMnO1xuXG5jb25zdCBDUkVBVEVfU0VTU0lPTl9DT01NQU5EID0gJ2NyZWF0ZVNlc3Npb24nO1xuY29uc3QgREVMRVRFX1NFU1NJT05fQ09NTUFORCA9ICdkZWxldGVTZXNzaW9uJztcbmNvbnN0IEdFVF9TVEFUVVNfQ09NTUFORCA9ICdnZXRTdGF0dXMnO1xuXG5mdW5jdGlvbiBkZXRlcm1pbmVQcm90b2NvbChjcmVhdGVTZXNzaW9uQXJncykge1xuICByZXR1cm4gXy5zb21lKGNyZWF0ZVNlc3Npb25BcmdzLCBpc1czY0NhcHMpID8gUFJPVE9DT0xTLlczQyA6IFBST1RPQ09MUy5NSlNPTldQO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IGRzdERyaXZlciA9IF8uaXNGdW5jdGlvbihkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbilcbiAgICA/IGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uKHNlc3Npb25JZClcbiAgICA6IGRyaXZlcjtcbiAgaWYgKGRzdERyaXZlciA9PT0gZHJpdmVyKSB7XG4gICAgLy8gU2hvcnRjaXJjdWl0IGlmIHRoZSBkcml2ZXIgaW5zdGFuY2UgaXMgbm90IGFuIHVtYnJlbGxhIGRyaXZlclxuICAgIC8vIG9yIGl0IGlzIEZha2UgZHJpdmVyIGluc3RhbmNlLCB3aGVyZSBgZHJpdmVyLmRyaXZlckZvclNlc3Npb25gXG4gICAgLy8gYWx3YXlzIHJldHVybnMgc2VsZiBpbnN0YW5jZVxuICAgIHJldHVybiBkcml2ZXIucHJvdG9jb2w7XG4gIH1cblxuICAvLyBFeHRyYWN0IHRoZSBwcm90b2NvbCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZiB0aGUgZ2l2ZW4gZHJpdmVyIGlzIHRoZSB1bWJyZWxsYSBvbmVcbiAgcmV0dXJuIGRzdERyaXZlcj8ucHJvdG9jb2wgPz8gUFJPVE9DT0xTLlczQztcbn1cblxuZnVuY3Rpb24gaXNTZXNzaW9uQ29tbWFuZChjb21tYW5kKSB7XG4gIHJldHVybiAhXy5pbmNsdWRlcyhOT19TRVNTSU9OX0lEX0NPTU1BTkRTLCBjb21tYW5kKTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlcm5hbERyaXZlcn0gZHJpdmVyXG4gKiBAcGFyYW0ge3N0cmluZz99IFtzZXNzaW9uSWRdXG4gKiBAcmV0dXJucyB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtTG9nZ2VyfVxuICovXG5mdW5jdGlvbiBnZXRMb2dnZXIoZHJpdmVyLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IGRzdERyaXZlciA9XG4gICAgc2Vzc2lvbklkICYmIF8uaXNGdW5jdGlvbihkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbilcbiAgICAgID8gZHJpdmVyLmRyaXZlckZvclNlc3Npb24oc2Vzc2lvbklkKSA/PyBkcml2ZXJcbiAgICAgIDogZHJpdmVyO1xuICBpZiAoXy5pc0Z1bmN0aW9uKGRzdERyaXZlci5sb2c/LmluZm8pKSB7XG4gICAgcmV0dXJuIGRzdERyaXZlci5sb2c7XG4gIH1cblxuICBsZXQgbG9nUHJlZml4ID0gZHN0RHJpdmVyLmNvbnN0cnVjdG9yXG4gICAgPyBgJHtkc3REcml2ZXIuY29uc3RydWN0b3IubmFtZX1AJHtub2RlLmdldE9iamVjdElkKGRzdERyaXZlcikuc3Vic3RyaW5nKDAsIDgpfWBcbiAgICA6ICdBcHBpdW1Ecml2ZXInO1xuICBpZiAoc2Vzc2lvbklkKSB7XG4gICAgbG9nUHJlZml4ICs9IGAgKCR7c2Vzc2lvbklkLnN1YnN0cmluZygwLCA4KX0pYDtcbiAgfVxuICByZXR1cm4gbG9nZ2VyLmdldExvZ2dlcihsb2dQcmVmaXgpO1xufVxuXG5mdW5jdGlvbiB3cmFwUGFyYW1zKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBwZXJmb3JtVG91Y2ggd2hpY2ggdGFrZSBhIHNpbmdsZSBwYXJhbWV0ZXIgKHByaW1pdGl2ZSB0eXBlIG9yIGFycmF5KS5cbiAgICogU29tZSBkcml2ZXJzIGNob29zZSB0byBwYXNzIHRoaXMgcGFyYW1ldGVyIGFzIGEgdmFsdWUgKGVnLiBbYWN0aW9uMSwgYWN0aW9uMi4uLl0pIHdoaWxlIG90aGVycyB0b1xuICAgKiB3cmFwIGl0IHdpdGhpbiBhbiBvYmplY3QoZWcnIHtnZXN0dXJlOiAgW2FjdGlvbjEsIGFjdGlvbjIuLi5dfSksIHdoaWNoIG1ha2VzIGl0IGhhcmQgdG8gdmFsaWRhdGUuXG4gICAqIFRoZSB3cmFwIG9wdGlvbiBpbiB0aGUgc3BlYyBlbmZvcmNlIHdyYXBwaW5nIGJlZm9yZSB2YWxpZGF0aW9uLCBzbyB0aGF0IGFsbCBwYXJhbXMgYXJlIHdyYXBwZWQgYXRcbiAgICogdGhlIHRpbWUgdGhleSBhcmUgdmFsaWRhdGVkIGFuZCBsYXRlciBwYXNzZWQgdG8gdGhlIGNvbW1hbmRzLlxuICAgKi9cbiAgbGV0IHJlcyA9IGpzb25PYmo7XG4gIGlmIChfLmlzQXJyYXkoanNvbk9iaikgfHwgIV8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICByZXMgPSB7fTtcbiAgICByZXNbcGFyYW1TZXRzLndyYXBdID0ganNvbk9iajtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJhbXMocGFyYW1TZXRzLCBqc29uT2JqKSB7XG4gIC8qIFRoZXJlIGFyZSBjb21tYW5kcyBsaWtlIHNldE5ldHdvcmtDb25uZWN0aW9uIHdoaWNoIHNlbmQgcGFyYW1ldGVycyB3cmFwcGVkIGluc2lkZSBhIGtleSBzdWNoIGFzXG4gICAqIFwicGFyYW1ldGVyc1wiLiBUaGlzIGZ1bmN0aW9uIHVud3JhcHMgdGhlbSAoZWcuIHtcInBhcmFtZXRlcnNcIjoge1widHlwZVwiOiAxfX0gYmVjb21lcyB7XCJ0eXBlXCI6IDF9KS5cbiAgICovXG4gIGxldCByZXMgPSBqc29uT2JqO1xuICBpZiAoXy5pc09iamVjdChqc29uT2JqKSkge1xuICAgIC8vIHNvbWUgY2xpZW50cywgbGlrZSBydWJ5LCBkb24ndCB3cmFwXG4gICAgaWYgKGpzb25PYmpbcGFyYW1TZXRzLnVud3JhcF0pIHtcbiAgICAgIHJlcyA9IGpzb25PYmpbcGFyYW1TZXRzLnVud3JhcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGNoZWNrUGFyYW1zKHBhcmFtU2V0cywganNvbk9iaiwgcHJvdG9jb2wpIHtcbiAgbGV0IHJlcXVpcmVkUGFyYW1zID0gW107XG4gIGxldCBvcHRpb25hbFBhcmFtcyA9IFtdO1xuICBsZXQgcmVjZWl2ZWRQYXJhbXMgPSBfLmtleXMoanNvbk9iaik7XG5cbiAgaWYgKHBhcmFtU2V0cykge1xuICAgIGlmIChwYXJhbVNldHMucmVxdWlyZWQpIHtcbiAgICAgIC8vIHdlIG1pZ2h0IGhhdmUgYW4gYXJyYXkgb2YgcGFyYW1ldGVycyxcbiAgICAgIC8vIG9yIGFuIGFycmF5IG9mIGFycmF5cyBvZiBwYXJhbWV0ZXJzLCBzbyBzdGFuZGFyZGl6ZVxuICAgICAgaWYgKCFfLmlzQXJyYXkoXy5maXJzdChwYXJhbVNldHMucmVxdWlyZWQpKSkge1xuICAgICAgICByZXF1aXJlZFBhcmFtcyA9IFtwYXJhbVNldHMucmVxdWlyZWRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVxdWlyZWRQYXJhbXMgPSBwYXJhbVNldHMucmVxdWlyZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG9wdGlvbmFsIHBhcmFtZXRlcnMgYXJlIGp1c3QgYW4gYXJyYXlcbiAgICBpZiAocGFyYW1TZXRzLm9wdGlvbmFsKSB7XG4gICAgICBvcHRpb25hbFBhcmFtcyA9IHBhcmFtU2V0cy5vcHRpb25hbDtcbiAgICB9XG5cbiAgICAvLyBJZiBhIGZ1bmN0aW9uIHdhcyBwcm92aWRlZCBhcyB0aGUgJ3ZhbGlkYXRlJyBrZXksIGl0IHdpbGwgaGVyZSBiZSBjYWxsZWQgd2l0aFxuICAgIC8vIGpzb25PYmogYXMgdGhlIHBhcmFtLiBJZiBpdCByZXR1cm5zIHNvbWV0aGluZyBmYWxzeSwgdmVyaWZpY2F0aW9uIHdpbGwgYmVcbiAgICAvLyBjb25zaWRlcmVkIHRvIGhhdmUgcGFzc2VkLiBJZiBpdCByZXR1cm5zIHNvbWV0aGluZyBlbHNlLCB0aGF0IHdpbGwgYmUgdGhlXG4gICAgLy8gYXJndW1lbnQgdG8gYW4gZXJyb3Igd2hpY2ggaXMgdGhyb3duIHRvIHRoZSB1c2VyXG4gICAgaWYgKHBhcmFtU2V0cy52YWxpZGF0ZSkge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBwYXJhbVNldHMudmFsaWRhdGUoanNvbk9iaiwgcHJvdG9jb2wpO1xuICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5CYWRQYXJhbWV0ZXJzRXJyb3IobWVzc2FnZSwganNvbk9iaik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgd2UgaGF2ZSBubyByZXF1aXJlZCBwYXJhbWV0ZXJzLCBhbGwgaXMgd2VsbFxuICBpZiAocmVxdWlyZWRQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gc29tZSBjbGllbnRzIHBhc3MgaW4gdGhlIHNlc3Npb24gaWQgaW4gdGhlIHBhcmFtc1xuICBpZiAob3B0aW9uYWxQYXJhbXMuaW5kZXhPZignc2Vzc2lvbklkJykgPT09IC0xKSB7XG4gICAgb3B0aW9uYWxQYXJhbXMucHVzaCgnc2Vzc2lvbklkJyk7XG4gIH1cblxuICAvLyBzb21lIGNsaWVudHMgcGFzcyBpbiBhbiBlbGVtZW50IGlkIGluIHRoZSBwYXJhbXNcbiAgaWYgKG9wdGlvbmFsUGFyYW1zLmluZGV4T2YoJ2lkJykgPT09IC0xKSB7XG4gICAgb3B0aW9uYWxQYXJhbXMucHVzaCgnaWQnKTtcbiAgfVxuXG4gIC8vIGdvIHRocm91Z2ggdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgYW5kIGNoZWNrIGFnYWluc3Qgb3VyIGFyZ3VtZW50c1xuICBmb3IgKGxldCBwYXJhbXMgb2YgcmVxdWlyZWRQYXJhbXMpIHtcbiAgICBpZiAoXG4gICAgICBfLmRpZmZlcmVuY2UocmVjZWl2ZWRQYXJhbXMsIHBhcmFtcywgb3B0aW9uYWxQYXJhbXMpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgXy5kaWZmZXJlbmNlKHBhcmFtcywgcmVjZWl2ZWRQYXJhbXMpLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgLy8gd2UgaGF2ZSBhIHNldCBvZiBwYXJhbWV0ZXJzIHRoYXQgaXMgY29ycmVjdFxuICAgICAgLy8gc28gc2hvcnQtY2lyY3VpdFxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcihwYXJhbVNldHMsIHJlY2VpdmVkUGFyYW1zKTtcbn1cblxuLypcbiAqIFRoaXMgbWV0aG9kIHRha2VzIDMgcGllY2VzIG9mIGRhdGE6IHJlcXVlc3QgcGFyYW1ldGVycyAoJ3JlcXVlc3RQYXJhbXMnKSxcbiAqIGEgcmVxdWVzdCBKU09OIGJvZHkgKCdqc29uT2JqJyksIGFuZCAncGF5bG9hZFBhcmFtcycsIHdoaWNoIGlzIHRoZSBzZWN0aW9uXG4gKiBmcm9tIHRoZSByb3V0ZSBkZWZpbml0aW9uIGZvciBhIHBhcnRpY3VsYXIgZW5kcG9pbnQgd2hpY2ggaGFzIGluc3RydWN0aW9uc1xuICogb24gaGFuZGxpbmcgcGFyYW1ldGVycy4gVGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiBhcmd1bWVudHMgd2hpY2ggd2lsbFxuICogYmUgYXBwbGllZCB0byBhIGNvbW1hbmQuXG4gKi9cbmZ1bmN0aW9uIG1ha2VBcmdzKHJlcXVlc3RQYXJhbXMsIGpzb25PYmosIHBheWxvYWRQYXJhbXMsIHByb3RvY29sKSB7XG4gIC8vIFdlIHdhbnQgdG8gcGFzcyB0aGUgXCJ1cmxcIiBwYXJhbWV0ZXJzIHRvIHRoZSBjb21tYW5kcyBpbiByZXZlcnNlIG9yZGVyXG4gIC8vIHNpbmNlIHRoZSBjb21tYW5kIHdpbGwgc29tZXRpbWVzIHdhbnQgdG8gaWdub3JlLCBzYXksIHRoZSBzZXNzaW9uSWQuXG4gIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcHV0dGluZyBzZXNzaW9uSWQgbGFzdCwgd2hpY2ggbWVhbnMgaW4gSlMgd2UgY2FuXG4gIC8vIG9taXQgaXQgZnJvbSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGlmIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQuXG4gIGxldCB1cmxQYXJhbXMgPSBfLmtleXMocmVxdWVzdFBhcmFtcykucmV2ZXJzZSgpO1xuXG4gIC8vIEluIHRoZSBzaW1wbGUgY2FzZSwgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIGEgYmFzaWMgYXJyYXkgaW5cbiAgLy8gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZCwgc28gc3RhcnQgdGhlcmUuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVyZSBhcmVcbiAgLy8gbXVsdGlwbGUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRob3VnaCwgc28gaGFuZGxlIHRoYXQgY2FzZVxuICAvLyB0b28uXG4gIGxldCByZXF1aXJlZFBhcmFtcyA9IHBheWxvYWRQYXJhbXMucmVxdWlyZWQ7XG4gIGlmIChfLmlzQXJyYXkoXy5maXJzdChwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSkpIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRoZW4gd2Ugd2lsbCBoYXZlIGFuXG4gICAgLy8gYXJyYXkgb2YgYXJyYXlzIGluIHBheWxvYWRQYXJhbXMucmVxdWlyZWQsIHNvIGxvb3AgdGhyb3VnaCBlYWNoIHNldCBhbmRcbiAgICAvLyBwaWNrIHRoZSBvbmUgdGhhdCBtYXRjaGVzIHdoaWNoIEpTT04gcGFyYW1zIHdlcmUgYWN0dWFsbHkgc2VudC4gV2UndmVcbiAgICAvLyBhbHJlYWR5IGJlZW4gdGhyb3VnaCB2YWxpZGF0aW9uIHNvIHdlJ3JlIGd1YXJhbnRlZWQgdG8gZmluZCBhIG1hdGNoLlxuICAgIGxldCBrZXlzID0gXy5rZXlzKGpzb25PYmopO1xuICAgIGZvciAobGV0IHBhcmFtcyBvZiBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSB7XG4gICAgICBpZiAoXy53aXRob3V0KHBhcmFtcywgLi4ua2V5cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gcGFyYW1zO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBOb3cgd2UgY29uc3RydWN0IG91ciBsaXN0IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY29tbWFuZFxuICBsZXQgYXJncztcbiAgaWYgKF8uaXNGdW5jdGlvbihwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKSkge1xuICAgIC8vIEluIHRoZSByb3V0ZSBzcGVjLCBhIHBhcnRpY3VsYXIgcm91dGUgbWlnaHQgZGVmaW5lIGEgJ21ha2VBcmdzJyBmdW5jdGlvblxuICAgIC8vIGlmIGl0IHdhbnRzIGZ1bGwgY29udHJvbCBvdmVyIGhvdyB0byB0dXJuIEpTT04gcGFyYW1ldGVycyBpbnRvIGNvbW1hbmRcbiAgICAvLyBhcmd1bWVudHMuIFNvIHdlIHBhc3MgaXQgdGhlIEpTT04gcGFyYW1ldGVycyBhbmQgaXQgcmV0dXJucyBhbiBhcnJheVxuICAgIC8vIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgaGFuZGxpbmcgY29tbWFuZC4gRm9yIGV4YW1wbGUgaWYgaXQgcmV0dXJuc1xuICAgIC8vIFsxLCAyLCAzXSwgd2Ugd2lsbCBjYWxsIGBjb21tYW5kKDEsIDIsIDMsIC4uLilgICh1cmwgcGFyYW1zIGFyZSBzZXBhcmF0ZVxuICAgIC8vIGZyb20gSlNPTiBwYXJhbXMgYW5kIGdldCBjb25jYXRlbmF0ZWQgYmVsb3cpLlxuICAgIGFyZ3MgPSBwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKGpzb25PYmosIHByb3RvY29sKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UsIGNvbGxlY3QgYWxsIHRoZSByZXF1aXJlZCBhbmQgb3B0aW9uYWwgcGFyYW1zIGFuZCBmbGF0dGVuIHRoZW1cbiAgICAvLyBpbnRvIGFuIGFyZ3VtZW50IGFycmF5XG4gICAgYXJncyA9IF8uZmxhdHRlbihyZXF1aXJlZFBhcmFtcykubWFwKChwKSA9PiBqc29uT2JqW3BdKTtcbiAgICBpZiAocGF5bG9hZFBhcmFtcy5vcHRpb25hbCkge1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KF8uZmxhdHRlbihwYXlsb2FkUGFyYW1zLm9wdGlvbmFsKS5tYXAoKHApID0+IGpzb25PYmpbcF0pKTtcbiAgICB9XG4gIH1cbiAgLy8gRmluYWxseSwgZ2V0IG91ciB1cmwgcGFyYW1zIChzZXNzaW9uIGlkLCBlbGVtZW50IGlkLCBldGMuLi4pIG9uIHRoZSBlbmQgb2ZcbiAgLy8gdGhlIGxpc3RcbiAgYXJncyA9IGFyZ3MuY29uY2F0KHVybFBhcmFtcy5tYXAoKHUpID0+IHJlcXVlc3RQYXJhbXNbdV0pKTtcbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbihkcml2ZXIpIHtcbiAgaWYgKCFkcml2ZXIuc2Vzc2lvbkV4aXN0cykge1xuICAgIHRocm93IG5ldyBFcnJvcignRHJpdmVycyBtdXN0IGltcGxlbWVudCBgc2Vzc2lvbkV4aXN0c2AgcHJvcGVydHknKTtcbiAgfVxuXG4gIGlmICghKGRyaXZlci5leGVjdXRlQ29tbWFuZCB8fCBkcml2ZXIuZXhlY3V0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyaXZlcnMgbXVzdCBpbXBsZW1lbnQgYGV4ZWN1dGVDb21tYW5kYCBvciBgZXhlY3V0ZWAgbWV0aG9kJyk7XG4gIH1cblxuICAvLyByZXR1cm4gYSBmdW5jdGlvbiB3aGljaCB3aWxsIGFkZCBhbGwgdGhlIHJvdXRlcyB0byB0aGUgZHJpdmVyLiBIZXJlIGV4dHJhTWV0aG9kcyBtaWdodCBiZVxuICAvLyBwYXNzZWQgaW4gYXMgZGVmaW5lZCBieSBBcHBpdW0gcGx1Z2lucywgc28gd2UgbmVlZCB0byBhZGQgdGhvc2UgdG8gdGhlIGRlZmF1bHQgbGlzdFxuICByZXR1cm4gZnVuY3Rpb24gYWRkUm91dGVzKGFwcCwge2Jhc2VQYXRoID0gREVGQVVMVF9CQVNFX1BBVEgsIGV4dHJhTWV0aG9kTWFwID0ge319KSB7XG4gICAgLy8gc3RvcmUgYmFzZVBhdGggb24gdGhlIGRyaXZlciBpbnN0YW5jZSBzbyBpdCBjYW4gdXNlIGl0IGlmIG5lY2Vzc2FyeVxuICAgIC8vIGZvciBleGFtcGxlIGluIGRldGVybWluaW5nIHByb3h5IGF2b2lkYW5jZVxuICAgIGRyaXZlci5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuXG4gICAgY29uc3QgYWxsTWV0aG9kcyA9IHsuLi5NRVRIT0RfTUFQLCAuLi5leHRyYU1ldGhvZE1hcH07XG5cbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBtZXRob2RzXSBvZiBfLnRvUGFpcnMoYWxsTWV0aG9kcykpIHtcbiAgICAgIGZvciAoY29uc3QgW21ldGhvZCwgc3BlY10gb2YgXy50b1BhaXJzKG1ldGhvZHMpKSB7XG4gICAgICAgIC8vIHNldCB1cCB0aGUgZXhwcmVzcyByb3V0ZSBoYW5kbGVyXG4gICAgICAgIGJ1aWxkSGFuZGxlcihcbiAgICAgICAgICBhcHAsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGAke2Jhc2VQYXRofSR7cGF0aH1gLFxuICAgICAgICAgIHNwZWMsXG4gICAgICAgICAgZHJpdmVyLFxuICAgICAgICAgIGlzU2Vzc2lvbkNvbW1hbmQoc3BlYy5jb21tYW5kKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRIYW5kbGVyKGFwcCwgbWV0aG9kLCBwYXRoLCBzcGVjLCBkcml2ZXIsIGlzU2Vzc0NtZCkge1xuICBsZXQgYXN5bmNIYW5kbGVyID0gYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgbGV0IGpzb25PYmogPSByZXEuYm9keTtcbiAgICBsZXQgaHR0cFJlc0JvZHkgPSB7fTtcbiAgICBsZXQgaHR0cFN0YXR1cyA9IDIwMDtcbiAgICBsZXQgbmV3U2Vzc2lvbklkO1xuICAgIGxldCBjdXJyZW50UHJvdG9jb2wgPSBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gaWYgdGhpcyBpcyBhIHNlc3Npb24gY29tbWFuZCBidXQgd2UgZG9uJ3QgaGF2ZSBhIHNlc3Npb24sXG4gICAgICAvLyBlcnJvciBvdXQgZWFybHkgKGVzcGVjaWFsbHkgYmVmb3JlIHByb3h5aW5nKVxuICAgICAgaWYgKGlzU2Vzc0NtZCAmJiAhZHJpdmVyLnNlc3Npb25FeGlzdHMocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRHJpdmVyRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIGRyaXZlciBpcyBjdXJyZW50bHkgcHJveHlpbmcgY29tbWFuZHMgdG8gYW5vdGhlciBKU09OV1Agc2VydmVyLCBieXBhc3MgYWxsIG91clxuICAgICAgLy8gY2hlY2tzIGFuZCBhc3N1bWUgdGhlIHVwc3RyZWFtIHNlcnZlciBrbm93cyB3aGF0IGl0J3MgZG9pbmcuIEJ1dCBrZWVwIHRoaXMgaW4gdGhlXG4gICAgICAvLyB0cnkvY2F0Y2ggYmxvY2sgc28gaWYgcHJveHlpbmcgaXRzZWxmIGZhaWxzLCB3ZSBnaXZlIGEgbWVzc2FnZSB0byB0aGUgY2xpZW50LiBPZiBjb3Vyc2Ugd2VcbiAgICAgIC8vIG9ubHkgd2FudCB0byBkbyB0aGVzZSB3aGVuIHdlIGhhdmUgYSBzZXNzaW9uIGNvbW1hbmQ7IHRoZSBBcHBpdW0gZHJpdmVyIG11c3QgYmVcbiAgICAgIC8vIHJlc3BvbnNpYmxlIGZvciBzdGFydC9zdG9wIHNlc3Npb24sIGV0Yy4uLiBXZSBhbHNvIGFsbG93IHRoZSBjb21tYW5kIHNwZWMgdG8gZGVjbGFyZSB0aGF0XG4gICAgICAvLyB0aGlzIGNvbW1hbmQgc2hvdWxkIG5ldmVyIGJlIHByb3hpZWQgKHdoaWNoIGlzIHVzZWZ1bCBmb3IgcGx1Z2luIGRldmVsb3BlcnMgd2hvIGFkZFxuICAgICAgLy8gY29tbWFuZHMgYW5kIGdlbmVyYWxseSB3b3VsZCBub3Qgd2FudCB0aGF0IGNvbW1hbmQgdG8gYmUgcHJveGllZCBpbnN0ZWFkIG9mIGhhbmRsZWQgYnkgdGhlXG4gICAgICAvLyBwbHVnaW4pXG4gICAgICBsZXQgZGlkUGx1Z2luT3ZlcnJpZGVQcm94eSA9IGZhbHNlO1xuICAgICAgaWYgKGlzU2Vzc0NtZCAmJiAhc3BlYy5uZXZlclByb3h5ICYmIGRyaXZlclNob3VsZERvSndwUHJveHkoZHJpdmVyLCByZXEsIHNwZWMuY29tbWFuZCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFkcml2ZXIucGx1Z2luc1RvSGFuZGxlQ21kIHx8XG4gICAgICAgICAgZHJpdmVyLnBsdWdpbnNUb0hhbmRsZUNtZChzcGVjLmNvbW1hbmQsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKS5sZW5ndGggPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgYXdhaXQgZG9Kd3BQcm94eShkcml2ZXIsIHJlcSwgcmVzKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TG9nZ2VyKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpLmRlYnVnKFxuICAgICAgICAgIGBXb3VsZCBoYXZlIHByb3hpZWQgYCArXG4gICAgICAgICAgICBgY29tbWFuZCBkaXJlY3RseSwgYnV0IGEgcGx1Z2luIGV4aXN0cyB3aGljaCBtaWdodCByZXF1aXJlIGl0cyB2YWx1ZSwgc28gd2lsbCBsZXQgYCArXG4gICAgICAgICAgICBgaXRzIHZhbHVlIGJlIGNvbGxlY3RlZCBpbnRlcm5hbGx5IGFuZCBtYWRlIHBhcnQgb2YgcGx1Z2luIGNoYWluYFxuICAgICAgICApO1xuICAgICAgICBkaWRQbHVnaW5PdmVycmlkZVByb3h5ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgYSBjb21tYW5kIGlzIG5vdCBpbiBvdXIgbWV0aG9kIG1hcCwgaXQncyBiZWNhdXNlIHdlXG4gICAgICAvLyBoYXZlIG5vIHBsYW5zIHRvIGV2ZXIgaW1wbGVtZW50IGl0XG4gICAgICBpZiAoIXNwZWMuY29tbWFuZCkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgLy8gd3JhcCBwYXJhbXMgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAoc3BlYy5wYXlsb2FkUGFyYW1zICYmIHNwZWMucGF5bG9hZFBhcmFtcy53cmFwKSB7XG4gICAgICAgIGpzb25PYmogPSB3cmFwUGFyYW1zKHNwZWMucGF5bG9hZFBhcmFtcywganNvbk9iaik7XG4gICAgICB9XG5cbiAgICAgIC8vIHVud3JhcCBwYXJhbXMgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAoc3BlYy5wYXlsb2FkUGFyYW1zICYmIHNwZWMucGF5bG9hZFBhcmFtcy51bndyYXApIHtcbiAgICAgICAganNvbk9iaiA9IHVud3JhcFBhcmFtcyhzcGVjLnBheWxvYWRQYXJhbXMsIGpzb25PYmopO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBDUkVBVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIC8vIHRyeSB0byBkZXRlcm1pbmUgcHJvdG9jb2wgYnkgc2Vzc2lvbiBjcmVhdGlvbiBhcmdzLCBzbyB3ZSBjYW4gdGhyb3cgYVxuICAgICAgICAvLyBwcm9wZXJseSBmb3JtYXR0ZWQgZXJyb3IgaWYgYXJndW1lbnRzIHZhbGlkYXRpb24gZmFpbHNcbiAgICAgICAgY3VycmVudFByb3RvY29sID0gZGV0ZXJtaW5lUHJvdG9jb2woXG4gICAgICAgICAgbWFrZUFyZ3MocmVxLnBhcmFtcywganNvbk9iaiwgc3BlYy5wYXlsb2FkUGFyYW1zIHx8IHt9KVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUganNvbiBwYXlsb2FkIGNvbmZvcm1zIHRvIHRoZSBzcGVjXG4gICAgICBjaGVja1BhcmFtcyhzcGVjLnBheWxvYWRQYXJhbXMsIGpzb25PYmosIGN1cnJlbnRQcm90b2NvbCk7XG5cbiAgICAgIC8vIHR1cm4gdGhlIGNvbW1hbmQgYW5kIGpzb24gcGF5bG9hZCBpbnRvIGFuIGFyZ3VtZW50IGxpc3QgZm9yXG4gICAgICAvLyB0aGUgZHJpdmVyIG1ldGhvZHNcbiAgICAgIGxldCBhcmdzID0gbWFrZUFyZ3MocmVxLnBhcmFtcywganNvbk9iaiwgc3BlYy5wYXlsb2FkUGFyYW1zIHx8IHt9LCBjdXJyZW50UHJvdG9jb2wpO1xuICAgICAgbGV0IGRyaXZlclJlcztcbiAgICAgIC8vIHZhbGlkYXRlIGNvbW1hbmQgYXJncyBhY2NvcmRpbmcgdG8gTUpTT05XUFxuICAgICAgaWYgKHZhbGlkYXRvcnNbc3BlYy5jb21tYW5kXSkge1xuICAgICAgICB2YWxpZGF0b3JzW3NwZWMuY29tbWFuZF0oLi4uYXJncyk7XG4gICAgICB9XG5cbiAgICAgIC8vIHJ1biB0aGUgZHJpdmVyIGNvbW1hbmQgd3JhcHBlZCBpbnNpZGUgdGhlIGFyZ3VtZW50IHZhbGlkYXRvcnNcbiAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKS5kZWJ1ZyhcbiAgICAgICAgYENhbGxpbmcgYCArXG4gICAgICAgICAgYCR7ZHJpdmVyLmNvbnN0cnVjdG9yLm5hbWV9LiR7c3BlYy5jb21tYW5kfSgpIHdpdGggYXJnczogYCArXG4gICAgICAgICAgXy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShhcmdzKSwge2xlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSH0pXG4gICAgICApO1xuXG4gICAgICBpZiAoZGlkUGx1Z2luT3ZlcnJpZGVQcm94eSkge1xuICAgICAgICAvLyBUT0RPIGZvciBub3cgd2UgYWRkIHRoaXMgaW5mb3JtYXRpb24gb24gdGhlIGFyZ3MgbGlzdCwgYnV0IHRoYXQncyBtaXhpbmcgcHVycG9zZXMgaGVyZS5cbiAgICAgICAgLy8gV2UgcmVhbGx5IHNob3VsZCBhZGQgYW5vdGhlciAnb3B0aW9ucycgcGFyYW1ldGVyIHRvICdleGVjdXRlQ29tbWFuZCcsIGJ1dCB0aGlzIHdvdWxkIGJlXG4gICAgICAgIC8vIGEgYnJlYWtpbmcgY2hhbmdlIGZvciBhbGwgZHJpdmVycyBzbyB3b3VsZCBuZWVkIHRvIGJlIGhhbmRsZWQgY2FyZWZ1bGx5LlxuICAgICAgICBhcmdzLnB1c2goe3JlcUZvclByb3h5OiByZXF9KTtcbiAgICAgIH1cblxuICAgICAgZHJpdmVyUmVzID0gYXdhaXQgZHJpdmVyLmV4ZWN1dGVDb21tYW5kKHNwZWMuY29tbWFuZCwgLi4uYXJncyk7XG5cbiAgICAgIC8vIEdldCB0aGUgcHJvdG9jb2wgYWZ0ZXIgZXhlY3V0ZUNvbW1hbmRcbiAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbChkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKSB8fCBjdXJyZW50UHJvdG9jb2w7XG5cbiAgICAgIC8vIElmIGBleGVjdXRlQ29tbWFuZGAgd2FzIG92ZXJyaWRkZW4gYW5kIHRoZSBtZXRob2QgcmV0dXJucyBhbiBvYmplY3RcbiAgICAgIC8vIHdpdGggYSBwcm90b2NvbCBhbmQgdmFsdWUvZXJyb3IgcHJvcGVydHksIHJlLWFzc2lnbiB0aGUgcHJvdG9jb2xcbiAgICAgIGlmIChfLmlzUGxhaW5PYmplY3QoZHJpdmVyUmVzKSAmJiBfLmhhcyhkcml2ZXJSZXMsICdwcm90b2NvbCcpKSB7XG4gICAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGRyaXZlclJlcy5wcm90b2NvbCB8fCBjdXJyZW50UHJvdG9jb2w7XG4gICAgICAgIGlmIChkcml2ZXJSZXMuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBkcml2ZXJSZXMuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZHJpdmVyUmVzID0gZHJpdmVyUmVzLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyB1bnBhY2sgY3JlYXRlU2Vzc2lvbiByZXNwb25zZVxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gQ1JFQVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICBuZXdTZXNzaW9uSWQgPSBkcml2ZXJSZXNbMF07XG4gICAgICAgIGdldExvZ2dlcihkcml2ZXIsIG5ld1Nlc3Npb25JZCkuZGVidWcoXG4gICAgICAgICAgYENhY2hlZCB0aGUgcHJvdG9jb2wgdmFsdWUgJyR7Y3VycmVudFByb3RvY29sfScgZm9yIHRoZSBuZXcgc2Vzc2lvbiAke25ld1Nlc3Npb25JZH1gXG4gICAgICAgICk7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5NSlNPTldQKSB7XG4gICAgICAgICAgZHJpdmVyUmVzID0gZHJpdmVyUmVzWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICAgIGRyaXZlclJlcyA9IHtcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogZHJpdmVyUmVzWzFdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZHJpdmVyUmVzID0gZm9ybWF0UmVzcG9uc2VWYWx1ZShkcml2ZXJSZXMpO1xuXG4gICAgICAvLyBkZWxldGUgc2hvdWxkIG5vdCByZXR1cm4gYW55dGhpbmcgZXZlbiBpZiBzdWNjZXNzZnVsXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKS5kZWJ1ZyhcbiAgICAgICAgICBgUmVjZWl2ZWQgcmVzcG9uc2U6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShkcml2ZXJSZXMpLCB7XG4gICAgICAgICAgICBsZW5ndGg6IE1BWF9MT0dfQk9EWV9MRU5HVEgsXG4gICAgICAgICAgfSl9YFxuICAgICAgICApO1xuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkuZGVidWcoJ0J1dCBkZWxldGluZyBzZXNzaW9uLCBzbyBub3QgcmV0dXJuaW5nJyk7XG4gICAgICAgIGRyaXZlclJlcyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSBzdGF0dXMgaXMgbm90IDAsICB0aHJvdyB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgZm9yIHN0YXR1cyBjb2RlLlxuICAgICAgaWYgKHV0aWwuaGFzVmFsdWUoZHJpdmVyUmVzKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdXRpbC5oYXNWYWx1ZShkcml2ZXJSZXMuc3RhdHVzKSAmJlxuICAgICAgICAgICFpc05hTihkcml2ZXJSZXMuc3RhdHVzKSAmJlxuICAgICAgICAgIHBhcnNlSW50KGRyaXZlclJlcy5zdGF0dXMsIDEwKSAhPT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZShkcml2ZXJSZXMuc3RhdHVzLCBkcml2ZXJSZXMudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChkcml2ZXJSZXMudmFsdWUpICYmIGRyaXZlclJlcy52YWx1ZS5lcnJvcikge1xuICAgICAgICAgIHRocm93IGVycm9yRnJvbVczQ0pzb25Db2RlKFxuICAgICAgICAgICAgZHJpdmVyUmVzLnZhbHVlLmVycm9yLFxuICAgICAgICAgICAgZHJpdmVyUmVzLnZhbHVlLm1lc3NhZ2UsXG4gICAgICAgICAgICBkcml2ZXJSZXMudmFsdWUuc3RhY2t0cmFjZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaHR0cFJlc0JvZHkudmFsdWUgPSBkcml2ZXJSZXM7XG4gICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQpLmRlYnVnKFxuICAgICAgICBgUmVzcG9uZGluZyBgICtcbiAgICAgICAgICBgdG8gY2xpZW50IHdpdGggZHJpdmVyLiR7c3BlYy5jb21tYW5kfSgpIHJlc3VsdDogJHtfLnRydW5jYXRlKEpTT04uc3RyaW5naWZ5KGRyaXZlclJlcyksIHtcbiAgICAgICAgICAgIGxlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSCxcbiAgICAgICAgICB9KX1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgZmlndXJlIG91dCB3aGF0IG91ciByZXNwb25zZSBzaG91bGQgYmVcbiAgICAgIC8vIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGVycm9yIHRoYXQgd2UgZW5jb3VudGVyZWRcbiAgICAgIGxldCBhY3R1YWxFcnIgPSBlcnI7XG5cbiAgICAgIGN1cnJlbnRQcm90b2NvbCA9XG4gICAgICAgIGN1cnJlbnRQcm90b2NvbCB8fCBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQpO1xuXG4gICAgICBsZXQgZXJyTXNnID0gZXJyLnN0YWNrdHJhY2UgfHwgZXJyLnN0YWNrO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKGVyck1zZywgZXJyLm1lc3NhZ2UpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBtZXNzYWdlIGhhcyBtb3JlIGluZm9ybWF0aW9uLCBhZGQgaXQuIGJ1dCBvZnRlbiB0aGUgbWVzc2FnZVxuICAgICAgICAvLyBpcyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgc3RhY2sgdHJhY2VcbiAgICAgICAgZXJyTXNnID0gYCR7ZXJyLm1lc3NhZ2V9JHtlcnJNc2cgPyAnXFxuJyArIGVyck1zZyA6ICcnfWA7XG4gICAgICB9XG4gICAgICBpZiAoaXNFcnJvclR5cGUoZXJyLCBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IpKSB7XG4gICAgICAgIGFjdHVhbEVyciA9IGVyci5nZXRBY3R1YWxFcnJvcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbmV3U2Vzc2lvbklkKS5kZWJ1ZyhcbiAgICAgICAgICBgRW5jb3VudGVyZWQgaW50ZXJuYWwgZXJyb3IgcnVubmluZyBjb21tYW5kOiAke2Vyck1zZ31gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIFtodHRwU3RhdHVzLCBodHRwUmVzQm9keV0gPSBnZXRSZXNwb25zZUZvclczQ0Vycm9yKGFjdHVhbEVycik7XG4gICAgfVxuXG4gICAgLy8gZGVjb2RlIHRoZSByZXNwb25zZSwgd2hpY2ggaXMgZWl0aGVyIGEgc3RyaW5nIG9yIGpzb25cbiAgICBpZiAoXy5pc1N0cmluZyhodHRwUmVzQm9keSkpIHtcbiAgICAgIHJlcy5zdGF0dXMoaHR0cFN0YXR1cykuc2VuZChodHRwUmVzQm9keSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZXdTZXNzaW9uSWQpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICAgIGh0dHBSZXNCb2R5LnZhbHVlLnNlc3Npb25JZCA9IG5ld1Nlc3Npb25JZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBodHRwUmVzQm9keS5zZXNzaW9uSWQgPSBuZXdTZXNzaW9uSWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0dHBSZXNCb2R5LnNlc3Npb25JZCA9IHJlcS5wYXJhbXMuc2Vzc2lvbklkIHx8IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCBpbmNsdWRlIHNlc3Npb25JZCBpbiBXM0MgcmVzcG9uc2VzXG4gICAgICBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDKSB7XG4gICAgICAgIGRlbGV0ZSBodHRwUmVzQm9keS5zZXNzaW9uSWQ7XG4gICAgICB9XG5cbiAgICAgIGh0dHBSZXNCb2R5ID0gZm9ybWF0U3RhdHVzKGh0dHBSZXNCb2R5KTtcbiAgICAgIHJlcy5zdGF0dXMoaHR0cFN0YXR1cykuanNvbihodHRwUmVzQm9keSk7XG4gICAgfVxuICB9O1xuICAvLyBhZGQgdGhlIG1ldGhvZCB0byB0aGUgYXBwXG4gIGFwcFttZXRob2QudG9Mb3dlckNhc2UoKV0ocGF0aCwgKHJlcSwgcmVzKSA9PiB7XG4gICAgQi5yZXNvbHZlKGFzeW5jSGFuZGxlcihyZXEsIHJlcykpLmRvbmUoKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRyaXZlclNob3VsZERvSndwUHJveHkoZHJpdmVyLCByZXEsIGNvbW1hbmQpIHtcbiAgLy8gZHJpdmVycyBuZWVkIHRvIGV4cGxpY2l0bHkgc2F5IHdoZW4gdGhlIHByb3h5IGlzIGFjdGl2ZVxuICBpZiAoIWRyaXZlci5wcm94eUFjdGl2ZShyZXEucGFyYW1zLnNlc3Npb25JZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyB3ZSBzaG91bGQgbmV2ZXIgcHJveHkgZGVsZXRlU2Vzc2lvbiBiZWNhdXNlIHdlIG5lZWQgdG8gZ2l2ZSB0aGUgY29udGFpbmluZ1xuICAvLyBkcml2ZXIgYW4gb3Bwb3J0dW5pdHkgdG8gY2xlYW4gaXRzZWxmIHVwXG4gIGlmIChjb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gdmFsaWRhdGUgYXZvaWRhbmNlIHNjaGVtYSwgYW5kIHNheSB3ZSBzaG91bGRuJ3QgcHJveHkgaWYgYW55dGhpbmcgaW4gdGhlXG4gIC8vIGF2b2lkIGxpc3QgbWF0Y2hlcyBvdXIgcmVxXG4gIGlmIChkcml2ZXIucHJveHlSb3V0ZUlzQXZvaWRlZChyZXEucGFyYW1zLnNlc3Npb25JZCwgcmVxLm1ldGhvZCwgcmVxLm9yaWdpbmFsVXJsLCByZXEuYm9keSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9Kd3BQcm94eShkcml2ZXIsIHJlcSwgcmVzKSB7XG4gIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKS5pbmZvKFxuICAgICdEcml2ZXIgcHJveHkgYWN0aXZlLCBwYXNzaW5nIHJlcXVlc3Qgb24gdmlhIEhUVFAgcHJveHknXG4gICk7XG5cbiAgLy8gY2hlY2sgdGhhdCB0aGUgaW5uZXIgZHJpdmVyIGhhcyBhIHByb3h5IGZ1bmN0aW9uXG4gIGlmICghZHJpdmVyLmNhblByb3h5KHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVHJ5aW5nIHRvIHByb3h5IHRvIGEgc2VydmVyIGJ1dCB0aGUgZHJpdmVyIGlzIHVuYWJsZSB0byBwcm94eScpO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgZHJpdmVyLmV4ZWN1dGVDb21tYW5kKCdwcm94eVJlcVJlcycsIHJlcSwgcmVzLCByZXEucGFyYW1zLnNlc3Npb25JZCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcikpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcHJveHkuIFByb3h5IGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQge1xuICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24sXG4gIGlzU2Vzc2lvbkNvbW1hbmQsXG4gIGRyaXZlclNob3VsZERvSndwUHJveHksXG4gIGRldGVybWluZVByb3RvY29sLFxuICBDUkVBVEVfU0VTU0lPTl9DT01NQU5ELFxuICBERUxFVEVfU0VTU0lPTl9DT01NQU5ELFxuICBHRVRfU1RBVFVTX0NPTU1BTkQsXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFPQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxzQkFBc0IsR0FBRyxlQUEvQjs7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxlQUEvQjs7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxXQUEzQjs7O0FBRUEsU0FBU0MsaUJBQVQsQ0FBMkJDLGlCQUEzQixFQUE4QztFQUM1QyxPQUFPQyxlQUFBLENBQUVDLElBQUYsQ0FBT0YsaUJBQVAsRUFBMEJHLHVCQUExQixJQUF1Q0Msb0JBQUEsQ0FBVUMsR0FBakQsR0FBdURELG9CQUFBLENBQVVFLE9BQXhFO0FBQ0Q7O0FBRUQsU0FBU0MsZUFBVCxDQUF5QkMsTUFBekIsRUFBaUNDLFNBQVMsR0FBRyxJQUE3QyxFQUFtRDtFQUFBOztFQUNqRCxNQUFNQyxTQUFTLEdBQUdULGVBQUEsQ0FBRVUsVUFBRixDQUFhSCxNQUFNLENBQUNJLGdCQUFwQixJQUNkSixNQUFNLENBQUNJLGdCQUFQLENBQXdCSCxTQUF4QixDQURjLEdBRWRE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
392
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsIkdFVF9TVEFUVVNfQ09NTUFORCIsImRldGVybWluZVByb3RvY29sIiwiY3JlYXRlU2Vzc2lvbkFyZ3MiLCJfIiwic29tZSIsImlzVzNjQ2FwcyIsIlBST1RPQ09MUyIsIlczQyIsIk1KU09OV1AiLCJleHRyYWN0UHJvdG9jb2wiLCJkcml2ZXIiLCJzZXNzaW9uSWQiLCJkc3REcml2ZXIiLCJpc0Z1bmN0aW9uIiwiZHJpdmVyRm9yU2Vzc2lvbiIsInByb3RvY29sIiwiaXNTZXNzaW9uQ29tbWFuZCIsImNvbW1hbmQiLCJpbmNsdWRlcyIsIk5PX1NFU1NJT05fSURfQ09NTUFORFMiLCJnZXRMb2dnZXIiLCJsb2ciLCJpbmZvIiwibG9nUHJlZml4IiwiY29uc3RydWN0b3IiLCJuYW1lIiwibm9kZSIsImdldE9iamVjdElkIiwic3Vic3RyaW5nIiwibG9nZ2VyIiwid3JhcFBhcmFtcyIsInBhcmFtU2V0cyIsImpzb25PYmoiLCJyZXMiLCJpc0FycmF5IiwiaXNPYmplY3QiLCJ3cmFwIiwidW53cmFwUGFyYW1zIiwidW53cmFwIiwiY2hlY2tQYXJhbXMiLCJyZXF1aXJlZFBhcmFtcyIsIm9wdGlvbmFsUGFyYW1zIiwicmVjZWl2ZWRQYXJhbXMiLCJrZXlzIiwicmVxdWlyZWQiLCJmaXJzdCIsIm9wdGlvbmFsIiwidmFsaWRhdGUiLCJtZXNzYWdlIiwiZXJyb3JzIiwiQmFkUGFyYW1ldGVyc0Vycm9yIiwibGVuZ3RoIiwiaW5kZXhPZiIsInB1c2giLCJwYXJhbXMiLCJkaWZmZXJlbmNlIiwibWFrZUFyZ3MiLCJyZXF1ZXN0UGFyYW1zIiwicGF5bG9hZFBhcmFtcyIsInVybFBhcmFtcyIsInJldmVyc2UiLCJ3aXRob3V0IiwiYXJncyIsImZsYXR0ZW4iLCJtYXAiLCJwIiwiY29uY2F0IiwidSIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlc3Npb25FeGlzdHMiLCJFcnJvciIsImV4ZWN1dGVDb21tYW5kIiwiZXhlY3V0ZSIsImFkZFJvdXRlcyIsImFwcCIsImJhc2VQYXRoIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJleHRyYU1ldGhvZE1hcCIsImFsbE1ldGhvZHMiLCJNRVRIT0RfTUFQIiwicGF0aCIsIm1ldGhvZHMiLCJ0b1BhaXJzIiwibWV0aG9kIiwic3BlYyIsImJ1aWxkSGFuZGxlciIsImlzU2Vzc0NtZCIsImFzeW5jSGFuZGxlciIsInJlcSIsImJvZHkiLCJodHRwUmVzQm9keSIsImh0dHBTdGF0dXMiLCJuZXdTZXNzaW9uSWQiLCJjdXJyZW50UHJvdG9jb2wiLCJOb1N1Y2hEcml2ZXJFcnJvciIsImRpZFBsdWdpbk92ZXJyaWRlUHJveHkiLCJuZXZlclByb3h5IiwiZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImRvSndwUHJveHkiLCJkZWJ1ZyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJkcml2ZXJSZXMiLCJ2YWxpZGF0b3JzIiwidHJ1bmNhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiTUFYX0xPR19CT0RZX0xFTkdUSCIsInJlcUZvclByb3h5IiwiaXNQbGFpbk9iamVjdCIsImhhcyIsImVycm9yIiwidmFsdWUiLCJjYXBhYmlsaXRpZXMiLCJmb3JtYXRSZXNwb25zZVZhbHVlIiwidXRpbCIsImhhc1ZhbHVlIiwic3RhdHVzIiwiaXNOYU4iLCJwYXJzZUludCIsImVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlIiwiZXJyb3JGcm9tVzNDSnNvbkNvZGUiLCJzdGFja3RyYWNlIiwiZXJyIiwiYWN0dWFsRXJyIiwiZXJyTXNnIiwic3RhY2siLCJpc0Vycm9yVHlwZSIsIlByb3h5UmVxdWVzdEVycm9yIiwiZ2V0QWN0dWFsRXJyb3IiLCJnZXRSZXNwb25zZUZvclczQ0Vycm9yIiwiaXNTdHJpbmciLCJzZW5kIiwiZm9ybWF0U3RhdHVzIiwianNvbiIsInRvTG93ZXJDYXNlIiwiQiIsInJlc29sdmUiLCJkb25lIiwicHJveHlBY3RpdmUiLCJwcm94eVJvdXRlSXNBdm9pZGVkIiwib3JpZ2luYWxVcmwiLCJjYW5Qcm94eSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9wcm90b2NvbC9wcm90b2NvbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHt1dGlsLCBsb2dnZXIsIG5vZGV9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQge3ZhbGlkYXRvcnN9IGZyb20gJy4vdmFsaWRhdG9ycyc7XG5pbXBvcnQge1xuICBlcnJvcnMsXG4gIGlzRXJyb3JUeXBlLFxuICBnZXRSZXNwb25zZUZvclczQ0Vycm9yLFxuICBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZSxcbiAgZXJyb3JGcm9tVzNDSnNvbkNvZGUsXG59IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7TUVUSE9EX01BUCwgTk9fU0VTU0lPTl9JRF9DT01NQU5EU30gZnJvbSAnLi9yb3V0ZXMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtmb3JtYXRSZXNwb25zZVZhbHVlLCBmb3JtYXRTdGF0dXN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge01BWF9MT0dfQk9EWV9MRU5HVEgsIFBST1RPQ09MUywgREVGQVVMVF9CQVNFX1BBVEh9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge2lzVzNjQ2Fwc30gZnJvbSAnLi4vaGVscGVycy9jYXBhYmlsaXRpZXMnO1xuXG5jb25zdCBDUkVBVEVfU0VTU0lPTl9DT01NQU5EID0gJ2NyZWF0ZVNlc3Npb24nO1xuY29uc3QgREVMRVRFX1NFU1NJT05fQ09NTUFORCA9ICdkZWxldGVTZXNzaW9uJztcbmNvbnN0IEdFVF9TVEFUVVNfQ09NTUFORCA9ICdnZXRTdGF0dXMnO1xuXG5mdW5jdGlvbiBkZXRlcm1pbmVQcm90b2NvbChjcmVhdGVTZXNzaW9uQXJncykge1xuICByZXR1cm4gXy5zb21lKGNyZWF0ZVNlc3Npb25BcmdzLCBpc1czY0NhcHMpID8gUFJPVE9DT0xTLlczQyA6IFBST1RPQ09MUy5NSlNPTldQO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IGRzdERyaXZlciA9IF8uaXNGdW5jdGlvbihkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbilcbiAgICA/IGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uKHNlc3Npb25JZClcbiAgICA6IGRyaXZlcjtcbiAgaWYgKGRzdERyaXZlciA9PT0gZHJpdmVyKSB7XG4gICAgLy8gU2hvcnRjaXJjdWl0IGlmIHRoZSBkcml2ZXIgaW5zdGFuY2UgaXMgbm90IGFuIHVtYnJlbGxhIGRyaXZlclxuICAgIC8vIG9yIGl0IGlzIEZha2UgZHJpdmVyIGluc3RhbmNlLCB3aGVyZSBgZHJpdmVyLmRyaXZlckZvclNlc3Npb25gXG4gICAgLy8gYWx3YXlzIHJldHVybnMgc2VsZiBpbnN0YW5jZVxuICAgIHJldHVybiBkcml2ZXIucHJvdG9jb2w7XG4gIH1cblxuICAvLyBFeHRyYWN0IHRoZSBwcm90b2NvbCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZiB0aGUgZ2l2ZW4gZHJpdmVyIGlzIHRoZSB1bWJyZWxsYSBvbmVcbiAgcmV0dXJuIGRzdERyaXZlcj8ucHJvdG9jb2wgPz8gUFJPVE9DT0xTLlczQztcbn1cblxuZnVuY3Rpb24gaXNTZXNzaW9uQ29tbWFuZChjb21tYW5kKSB7XG4gIHJldHVybiAhXy5pbmNsdWRlcyhOT19TRVNTSU9OX0lEX0NPTU1BTkRTLCBjb21tYW5kKTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlcm5hbERyaXZlcn0gZHJpdmVyXG4gKiBAcGFyYW0ge3N0cmluZz99IFtzZXNzaW9uSWRdXG4gKiBAcmV0dXJucyB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtTG9nZ2VyfVxuICovXG5mdW5jdGlvbiBnZXRMb2dnZXIoZHJpdmVyLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IGRzdERyaXZlciA9XG4gICAgc2Vzc2lvbklkICYmIF8uaXNGdW5jdGlvbihkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbilcbiAgICAgID8gZHJpdmVyLmRyaXZlckZvclNlc3Npb24oc2Vzc2lvbklkKSA/PyBkcml2ZXJcbiAgICAgIDogZHJpdmVyO1xuICBpZiAoXy5pc0Z1bmN0aW9uKGRzdERyaXZlci5sb2c/LmluZm8pKSB7XG4gICAgcmV0dXJuIGRzdERyaXZlci5sb2c7XG4gIH1cblxuICBsZXQgbG9nUHJlZml4ID0gZHN0RHJpdmVyLmNvbnN0cnVjdG9yXG4gICAgPyBgJHtkc3REcml2ZXIuY29uc3RydWN0b3IubmFtZX1AJHtub2RlLmdldE9iamVjdElkKGRzdERyaXZlcikuc3Vic3RyaW5nKDAsIDgpfWBcbiAgICA6ICdBcHBpdW1Ecml2ZXInO1xuICBpZiAoc2Vzc2lvbklkKSB7XG4gICAgbG9nUHJlZml4ICs9IGAgKCR7c2Vzc2lvbklkLnN1YnN0cmluZygwLCA4KX0pYDtcbiAgfVxuICByZXR1cm4gbG9nZ2VyLmdldExvZ2dlcihsb2dQcmVmaXgpO1xufVxuXG5mdW5jdGlvbiB3cmFwUGFyYW1zKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBwZXJmb3JtVG91Y2ggd2hpY2ggdGFrZSBhIHNpbmdsZSBwYXJhbWV0ZXIgKHByaW1pdGl2ZSB0eXBlIG9yIGFycmF5KS5cbiAgICogU29tZSBkcml2ZXJzIGNob29zZSB0byBwYXNzIHRoaXMgcGFyYW1ldGVyIGFzIGEgdmFsdWUgKGVnLiBbYWN0aW9uMSwgYWN0aW9uMi4uLl0pIHdoaWxlIG90aGVycyB0b1xuICAgKiB3cmFwIGl0IHdpdGhpbiBhbiBvYmplY3QoZWcnIHtnZXN0dXJlOiAgW2FjdGlvbjEsIGFjdGlvbjIuLi5dfSksIHdoaWNoIG1ha2VzIGl0IGhhcmQgdG8gdmFsaWRhdGUuXG4gICAqIFRoZSB3cmFwIG9wdGlvbiBpbiB0aGUgc3BlYyBlbmZvcmNlIHdyYXBwaW5nIGJlZm9yZSB2YWxpZGF0aW9uLCBzbyB0aGF0IGFsbCBwYXJhbXMgYXJlIHdyYXBwZWQgYXRcbiAgICogdGhlIHRpbWUgdGhleSBhcmUgdmFsaWRhdGVkIGFuZCBsYXRlciBwYXNzZWQgdG8gdGhlIGNvbW1hbmRzLlxuICAgKi9cbiAgbGV0IHJlcyA9IGpzb25PYmo7XG4gIGlmIChfLmlzQXJyYXkoanNvbk9iaikgfHwgIV8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICByZXMgPSB7fTtcbiAgICByZXNbcGFyYW1TZXRzLndyYXBdID0ganNvbk9iajtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJhbXMocGFyYW1TZXRzLCBqc29uT2JqKSB7XG4gIC8qIFRoZXJlIGFyZSBjb21tYW5kcyBsaWtlIHNldE5ldHdvcmtDb25uZWN0aW9uIHdoaWNoIHNlbmQgcGFyYW1ldGVycyB3cmFwcGVkIGluc2lkZSBhIGtleSBzdWNoIGFzXG4gICAqIFwicGFyYW1ldGVyc1wiLiBUaGlzIGZ1bmN0aW9uIHVud3JhcHMgdGhlbSAoZWcuIHtcInBhcmFtZXRlcnNcIjoge1widHlwZVwiOiAxfX0gYmVjb21lcyB7XCJ0eXBlXCI6IDF9KS5cbiAgICovXG4gIGxldCByZXMgPSBqc29uT2JqO1xuICBpZiAoXy5pc09iamVjdChqc29uT2JqKSkge1xuICAgIC8vIHNvbWUgY2xpZW50cywgbGlrZSBydWJ5LCBkb24ndCB3cmFwXG4gICAgaWYgKGpzb25PYmpbcGFyYW1TZXRzLnVud3JhcF0pIHtcbiAgICAgIHJlcyA9IGpzb25PYmpbcGFyYW1TZXRzLnVud3JhcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGNoZWNrUGFyYW1zKHBhcmFtU2V0cywganNvbk9iaiwgcHJvdG9jb2wpIHtcbiAgbGV0IHJlcXVpcmVkUGFyYW1zID0gW107XG4gIGxldCBvcHRpb25hbFBhcmFtcyA9IFtdO1xuICBsZXQgcmVjZWl2ZWRQYXJhbXMgPSBfLmtleXMoanNvbk9iaik7XG5cbiAgaWYgKHBhcmFtU2V0cykge1xuICAgIGlmIChwYXJhbVNldHMucmVxdWlyZWQpIHtcbiAgICAgIC8vIHdlIG1pZ2h0IGhhdmUgYW4gYXJyYXkgb2YgcGFyYW1ldGVycyxcbiAgICAgIC8vIG9yIGFuIGFycmF5IG9mIGFycmF5cyBvZiBwYXJhbWV0ZXJzLCBzbyBzdGFuZGFyZGl6ZVxuICAgICAgaWYgKCFfLmlzQXJyYXkoXy5maXJzdChwYXJhbVNldHMucmVxdWlyZWQpKSkge1xuICAgICAgICByZXF1aXJlZFBhcmFtcyA9IFtwYXJhbVNldHMucmVxdWlyZWRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVxdWlyZWRQYXJhbXMgPSBwYXJhbVNldHMucmVxdWlyZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG9wdGlvbmFsIHBhcmFtZXRlcnMgYXJlIGp1c3QgYW4gYXJyYXlcbiAgICBpZiAocGFyYW1TZXRzLm9wdGlvbmFsKSB7XG4gICAgICBvcHRpb25hbFBhcmFtcyA9IHBhcmFtU2V0cy5vcHRpb25hbDtcbiAgICB9XG5cbiAgICAvLyBJZiBhIGZ1bmN0aW9uIHdhcyBwcm92aWRlZCBhcyB0aGUgJ3ZhbGlkYXRlJyBrZXksIGl0IHdpbGwgaGVyZSBiZSBjYWxsZWQgd2l0aFxuICAgIC8vIGpzb25PYmogYXMgdGhlIHBhcmFtLiBJZiBpdCByZXR1cm5zIHNvbWV0aGluZyBmYWxzeSwgdmVyaWZpY2F0aW9uIHdpbGwgYmVcbiAgICAvLyBjb25zaWRlcmVkIHRvIGhhdmUgcGFzc2VkLiBJZiBpdCByZXR1cm5zIHNvbWV0aGluZyBlbHNlLCB0aGF0IHdpbGwgYmUgdGhlXG4gICAgLy8gYXJndW1lbnQgdG8gYW4gZXJyb3Igd2hpY2ggaXMgdGhyb3duIHRvIHRoZSB1c2VyXG4gICAgaWYgKHBhcmFtU2V0cy52YWxpZGF0ZSkge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBwYXJhbVNldHMudmFsaWRhdGUoanNvbk9iaiwgcHJvdG9jb2wpO1xuICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5CYWRQYXJhbWV0ZXJzRXJyb3IobWVzc2FnZSwganNvbk9iaik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgd2UgaGF2ZSBubyByZXF1aXJlZCBwYXJhbWV0ZXJzLCBhbGwgaXMgd2VsbFxuICBpZiAocmVxdWlyZWRQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gc29tZSBjbGllbnRzIHBhc3MgaW4gdGhlIHNlc3Npb24gaWQgaW4gdGhlIHBhcmFtc1xuICBpZiAob3B0aW9uYWxQYXJhbXMuaW5kZXhPZignc2Vzc2lvbklkJykgPT09IC0xKSB7XG4gICAgb3B0aW9uYWxQYXJhbXMucHVzaCgnc2Vzc2lvbklkJyk7XG4gIH1cblxuICAvLyBzb21lIGNsaWVudHMgcGFzcyBpbiBhbiBlbGVtZW50IGlkIGluIHRoZSBwYXJhbXNcbiAgaWYgKG9wdGlvbmFsUGFyYW1zLmluZGV4T2YoJ2lkJykgPT09IC0xKSB7XG4gICAgb3B0aW9uYWxQYXJhbXMucHVzaCgnaWQnKTtcbiAgfVxuXG4gIC8vIGdvIHRocm91Z2ggdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgYW5kIGNoZWNrIGFnYWluc3Qgb3VyIGFyZ3VtZW50c1xuICBmb3IgKGxldCBwYXJhbXMgb2YgcmVxdWlyZWRQYXJhbXMpIHtcbiAgICBpZiAoXG4gICAgICBfLmRpZmZlcmVuY2UocmVjZWl2ZWRQYXJhbXMsIHBhcmFtcywgb3B0aW9uYWxQYXJhbXMpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgXy5kaWZmZXJlbmNlKHBhcmFtcywgcmVjZWl2ZWRQYXJhbXMpLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgLy8gd2UgaGF2ZSBhIHNldCBvZiBwYXJhbWV0ZXJzIHRoYXQgaXMgY29ycmVjdFxuICAgICAgLy8gc28gc2hvcnQtY2lyY3VpdFxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcihwYXJhbVNldHMsIHJlY2VpdmVkUGFyYW1zKTtcbn1cblxuLypcbiAqIFRoaXMgbWV0aG9kIHRha2VzIDMgcGllY2VzIG9mIGRhdGE6IHJlcXVlc3QgcGFyYW1ldGVycyAoJ3JlcXVlc3RQYXJhbXMnKSxcbiAqIGEgcmVxdWVzdCBKU09OIGJvZHkgKCdqc29uT2JqJyksIGFuZCAncGF5bG9hZFBhcmFtcycsIHdoaWNoIGlzIHRoZSBzZWN0aW9uXG4gKiBmcm9tIHRoZSByb3V0ZSBkZWZpbml0aW9uIGZvciBhIHBhcnRpY3VsYXIgZW5kcG9pbnQgd2hpY2ggaGFzIGluc3RydWN0aW9uc1xuICogb24gaGFuZGxpbmcgcGFyYW1ldGVycy4gVGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiBhcmd1bWVudHMgd2hpY2ggd2lsbFxuICogYmUgYXBwbGllZCB0byBhIGNvbW1hbmQuXG4gKi9cbmZ1bmN0aW9uIG1ha2VBcmdzKHJlcXVlc3RQYXJhbXMsIGpzb25PYmosIHBheWxvYWRQYXJhbXMsIHByb3RvY29sKSB7XG4gIC8vIFdlIHdhbnQgdG8gcGFzcyB0aGUgXCJ1cmxcIiBwYXJhbWV0ZXJzIHRvIHRoZSBjb21tYW5kcyBpbiByZXZlcnNlIG9yZGVyXG4gIC8vIHNpbmNlIHRoZSBjb21tYW5kIHdpbGwgc29tZXRpbWVzIHdhbnQgdG8gaWdub3JlLCBzYXksIHRoZSBzZXNzaW9uSWQuXG4gIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcHV0dGluZyBzZXNzaW9uSWQgbGFzdCwgd2hpY2ggbWVhbnMgaW4gSlMgd2UgY2FuXG4gIC8vIG9taXQgaXQgZnJvbSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGlmIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQuXG4gIGxldCB1cmxQYXJhbXMgPSBfLmtleXMocmVxdWVzdFBhcmFtcykucmV2ZXJzZSgpO1xuXG4gIC8vIEluIHRoZSBzaW1wbGUgY2FzZSwgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIGEgYmFzaWMgYXJyYXkgaW5cbiAgLy8gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZCwgc28gc3RhcnQgdGhlcmUuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVyZSBhcmVcbiAgLy8gbXVsdGlwbGUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRob3VnaCwgc28gaGFuZGxlIHRoYXQgY2FzZVxuICAvLyB0b28uXG4gIGxldCByZXF1aXJlZFBhcmFtcyA9IHBheWxvYWRQYXJhbXMucmVxdWlyZWQ7XG4gIGlmIChfLmlzQXJyYXkoXy5maXJzdChwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSkpIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRoZW4gd2Ugd2lsbCBoYXZlIGFuXG4gICAgLy8gYXJyYXkgb2YgYXJyYXlzIGluIHBheWxvYWRQYXJhbXMucmVxdWlyZWQsIHNvIGxvb3AgdGhyb3VnaCBlYWNoIHNldCBhbmRcbiAgICAvLyBwaWNrIHRoZSBvbmUgdGhhdCBtYXRjaGVzIHdoaWNoIEpTT04gcGFyYW1zIHdlcmUgYWN0dWFsbHkgc2VudC4gV2UndmVcbiAgICAvLyBhbHJlYWR5IGJlZW4gdGhyb3VnaCB2YWxpZGF0aW9uIHNvIHdlJ3JlIGd1YXJhbnRlZWQgdG8gZmluZCBhIG1hdGNoLlxuICAgIGxldCBrZXlzID0gXy5rZXlzKGpzb25PYmopO1xuICAgIGZvciAobGV0IHBhcmFtcyBvZiBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSB7XG4gICAgICBpZiAoXy53aXRob3V0KHBhcmFtcywgLi4ua2V5cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gcGFyYW1zO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBOb3cgd2UgY29uc3RydWN0IG91ciBsaXN0IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY29tbWFuZFxuICBsZXQgYXJncztcbiAgaWYgKF8uaXNGdW5jdGlvbihwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKSkge1xuICAgIC8vIEluIHRoZSByb3V0ZSBzcGVjLCBhIHBhcnRpY3VsYXIgcm91dGUgbWlnaHQgZGVmaW5lIGEgJ21ha2VBcmdzJyBmdW5jdGlvblxuICAgIC8vIGlmIGl0IHdhbnRzIGZ1bGwgY29udHJvbCBvdmVyIGhvdyB0byB0dXJuIEpTT04gcGFyYW1ldGVycyBpbnRvIGNvbW1hbmRcbiAgICAvLyBhcmd1bWVudHMuIFNvIHdlIHBhc3MgaXQgdGhlIEpTT04gcGFyYW1ldGVycyBhbmQgaXQgcmV0dXJucyBhbiBhcnJheVxuICAgIC8vIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgaGFuZGxpbmcgY29tbWFuZC4gRm9yIGV4YW1wbGUgaWYgaXQgcmV0dXJuc1xuICAgIC8vIFsxLCAyLCAzXSwgd2Ugd2lsbCBjYWxsIGBjb21tYW5kKDEsIDIsIDMsIC4uLilgICh1cmwgcGFyYW1zIGFyZSBzZXBhcmF0ZVxuICAgIC8vIGZyb20gSlNPTiBwYXJhbXMgYW5kIGdldCBjb25jYXRlbmF0ZWQgYmVsb3cpLlxuICAgIGFyZ3MgPSBwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKGpzb25PYmosIHByb3RvY29sKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UsIGNvbGxlY3QgYWxsIHRoZSByZXF1aXJlZCBhbmQgb3B0aW9uYWwgcGFyYW1zIGFuZCBmbGF0dGVuIHRoZW1cbiAgICAvLyBpbnRvIGFuIGFyZ3VtZW50IGFycmF5XG4gICAgYXJncyA9IF8uZmxhdHRlbihyZXF1aXJlZFBhcmFtcykubWFwKChwKSA9PiBqc29uT2JqW3BdKTtcbiAgICBpZiAocGF5bG9hZFBhcmFtcy5vcHRpb25hbCkge1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KF8uZmxhdHRlbihwYXlsb2FkUGFyYW1zLm9wdGlvbmFsKS5tYXAoKHApID0+IGpzb25PYmpbcF0pKTtcbiAgICB9XG4gIH1cbiAgLy8gRmluYWxseSwgZ2V0IG91ciB1cmwgcGFyYW1zIChzZXNzaW9uIGlkLCBlbGVtZW50IGlkLCBldGMuLi4pIG9uIHRoZSBlbmQgb2ZcbiAgLy8gdGhlIGxpc3RcbiAgYXJncyA9IGFyZ3MuY29uY2F0KHVybFBhcmFtcy5tYXAoKHUpID0+IHJlcXVlc3RQYXJhbXNbdV0pKTtcbiAgcmV0dXJuIGFyZ3M7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ29yZX0gZHJpdmVyXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuLi9leHByZXNzL3NlcnZlcicpLlJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uKGRyaXZlcikge1xuICBpZiAoIWRyaXZlci5zZXNzaW9uRXhpc3RzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEcml2ZXJzIG11c3QgaW1wbGVtZW50IGBzZXNzaW9uRXhpc3RzYCBwcm9wZXJ0eScpO1xuICB9XG5cbiAgLy8gXCJleGVjdXRlXCIgaXNuJ3QgZGVmaW5lZCBhbnl3aGVyZVxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGlmICghKGRyaXZlci5leGVjdXRlQ29tbWFuZCB8fCBkcml2ZXIuZXhlY3V0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyaXZlcnMgbXVzdCBpbXBsZW1lbnQgYGV4ZWN1dGVDb21tYW5kYCBvciBgZXhlY3V0ZWAgbWV0aG9kJyk7XG4gIH1cblxuICAvLyByZXR1cm4gYSBmdW5jdGlvbiB3aGljaCB3aWxsIGFkZCBhbGwgdGhlIHJvdXRlcyB0byB0aGUgZHJpdmVyLiBIZXJlIGV4dHJhTWV0aG9kcyBtaWdodCBiZVxuICAvLyBwYXNzZWQgaW4gYXMgZGVmaW5lZCBieSBBcHBpdW0gcGx1Z2lucywgc28gd2UgbmVlZCB0byBhZGQgdGhvc2UgdG8gdGhlIGRlZmF1bHQgbGlzdFxuICByZXR1cm4gZnVuY3Rpb24gYWRkUm91dGVzKGFwcCwge2Jhc2VQYXRoID0gREVGQVVMVF9CQVNFX1BBVEgsIGV4dHJhTWV0aG9kTWFwID0ge319ID0ge30pIHtcbiAgICAvLyBzdG9yZSBiYXNlUGF0aCBvbiB0aGUgZHJpdmVyIGluc3RhbmNlIHNvIGl0IGNhbiB1c2UgaXQgaWYgbmVjZXNzYXJ5XG4gICAgLy8gZm9yIGV4YW1wbGUgaW4gZGV0ZXJtaW5pbmcgcHJveHkgYXZvaWRhbmNlXG4gICAgZHJpdmVyLmJhc2VQYXRoID0gYmFzZVBhdGg7XG5cbiAgICBjb25zdCBhbGxNZXRob2RzID0gey4uLk1FVEhPRF9NQVAsIC4uLmV4dHJhTWV0aG9kTWFwfTtcblxuICAgIGZvciAoY29uc3QgW3BhdGgsIG1ldGhvZHNdIG9mIF8udG9QYWlycyhhbGxNZXRob2RzKSkge1xuICAgICAgZm9yIChjb25zdCBbbWV0aG9kLCBzcGVjXSBvZiBfLnRvUGFpcnMobWV0aG9kcykpIHtcbiAgICAgICAgLy8gc2V0IHVwIHRoZSBleHByZXNzIHJvdXRlIGhhbmRsZXJcbiAgICAgICAgYnVpbGRIYW5kbGVyKFxuICAgICAgICAgIGFwcCxcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgYCR7YmFzZVBhdGh9JHtwYXRofWAsXG4gICAgICAgICAgc3BlYyxcbiAgICAgICAgICBkcml2ZXIsXG4gICAgICAgICAgaXNTZXNzaW9uQ29tbWFuZChzcGVjLmNvbW1hbmQpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEhhbmRsZXIoYXBwLCBtZXRob2QsIHBhdGgsIHNwZWMsIGRyaXZlciwgaXNTZXNzQ21kKSB7XG4gIGxldCBhc3luY0hhbmRsZXIgPSBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBsZXQganNvbk9iaiA9IHJlcS5ib2R5O1xuICAgIGxldCBodHRwUmVzQm9keSA9IHt9O1xuICAgIGxldCBodHRwU3RhdHVzID0gMjAwO1xuICAgIGxldCBuZXdTZXNzaW9uSWQ7XG4gICAgbGV0IGN1cnJlbnRQcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbChkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBpZiB0aGlzIGlzIGEgc2Vzc2lvbiBjb21tYW5kIGJ1dCB3ZSBkb24ndCBoYXZlIGEgc2Vzc2lvbixcbiAgICAgIC8vIGVycm9yIG91dCBlYXJseSAoZXNwZWNpYWxseSBiZWZvcmUgcHJveHlpbmcpXG4gICAgICBpZiAoaXNTZXNzQ21kICYmICFkcml2ZXIuc2Vzc2lvbkV4aXN0cyhyZXEucGFyYW1zLnNlc3Npb25JZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hEcml2ZXJFcnJvcigpO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgZHJpdmVyIGlzIGN1cnJlbnRseSBwcm94eWluZyBjb21tYW5kcyB0byBhbm90aGVyIEpTT05XUCBzZXJ2ZXIsIGJ5cGFzcyBhbGwgb3VyXG4gICAgICAvLyBjaGVja3MgYW5kIGFzc3VtZSB0aGUgdXBzdHJlYW0gc2VydmVyIGtub3dzIHdoYXQgaXQncyBkb2luZy4gQnV0IGtlZXAgdGhpcyBpbiB0aGVcbiAgICAgIC8vIHRyeS9jYXRjaCBibG9jayBzbyBpZiBwcm94eWluZyBpdHNlbGYgZmFpbHMsIHdlIGdpdmUgYSBtZXNzYWdlIHRvIHRoZSBjbGllbnQuIE9mIGNvdXJzZSB3ZVxuICAgICAgLy8gb25seSB3YW50IHRvIGRvIHRoZXNlIHdoZW4gd2UgaGF2ZSBhIHNlc3Npb24gY29tbWFuZDsgdGhlIEFwcGl1bSBkcml2ZXIgbXVzdCBiZVxuICAgICAgLy8gcmVzcG9uc2libGUgZm9yIHN0YXJ0L3N0b3Agc2Vzc2lvbiwgZXRjLi4uIFdlIGFsc28gYWxsb3cgdGhlIGNvbW1hbmQgc3BlYyB0byBkZWNsYXJlIHRoYXRcbiAgICAgIC8vIHRoaXMgY29tbWFuZCBzaG91bGQgbmV2ZXIgYmUgcHJveGllZCAod2hpY2ggaXMgdXNlZnVsIGZvciBwbHVnaW4gZGV2ZWxvcGVycyB3aG8gYWRkXG4gICAgICAvLyBjb21tYW5kcyBhbmQgZ2VuZXJhbGx5IHdvdWxkIG5vdCB3YW50IHRoYXQgY29tbWFuZCB0byBiZSBwcm94aWVkIGluc3RlYWQgb2YgaGFuZGxlZCBieSB0aGVcbiAgICAgIC8vIHBsdWdpbilcbiAgICAgIGxldCBkaWRQbHVnaW5PdmVycmlkZVByb3h5ID0gZmFsc2U7XG4gICAgICBpZiAoaXNTZXNzQ21kICYmICFzcGVjLm5ldmVyUHJveHkgJiYgZHJpdmVyU2hvdWxkRG9Kd3BQcm94eShkcml2ZXIsIHJlcSwgc3BlYy5jb21tYW5kKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWRyaXZlci5wbHVnaW5zVG9IYW5kbGVDbWQgfHxcbiAgICAgICAgICBkcml2ZXIucGx1Z2luc1RvSGFuZGxlQ21kKHNwZWMuY29tbWFuZCwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpLmxlbmd0aCA9PT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICBhd2FpdCBkb0p3cFByb3h5KGRyaXZlciwgcmVxLCByZXMpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkuZGVidWcoXG4gICAgICAgICAgYFdvdWxkIGhhdmUgcHJveGllZCBgICtcbiAgICAgICAgICAgIGBjb21tYW5kIGRpcmVjdGx5LCBidXQgYSBwbHVnaW4gZXhpc3RzIHdoaWNoIG1pZ2h0IHJlcXVpcmUgaXRzIHZhbHVlLCBzbyB3aWxsIGxldCBgICtcbiAgICAgICAgICAgIGBpdHMgdmFsdWUgYmUgY29sbGVjdGVkIGludGVybmFsbHkgYW5kIG1hZGUgcGFydCBvZiBwbHVnaW4gY2hhaW5gXG4gICAgICAgICk7XG4gICAgICAgIGRpZFBsdWdpbk92ZXJyaWRlUHJveHkgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiBhIGNvbW1hbmQgaXMgbm90IGluIG91ciBtZXRob2QgbWFwLCBpdCdzIGJlY2F1c2Ugd2VcbiAgICAgIC8vIGhhdmUgbm8gcGxhbnMgdG8gZXZlciBpbXBsZW1lbnQgaXRcbiAgICAgIGlmICghc3BlYy5jb21tYW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICAgICAgfVxuXG4gICAgICAvLyB3cmFwIHBhcmFtcyBpZiBuZWNlc3NhcnlcbiAgICAgIGlmIChzcGVjLnBheWxvYWRQYXJhbXMgJiYgc3BlYy5wYXlsb2FkUGFyYW1zLndyYXApIHtcbiAgICAgICAganNvbk9iaiA9IHdyYXBQYXJhbXMoc3BlYy5wYXlsb2FkUGFyYW1zLCBqc29uT2JqKTtcbiAgICAgIH1cblxuICAgICAgLy8gdW53cmFwIHBhcmFtcyBpZiBuZWNlc3NhcnlcbiAgICAgIGlmIChzcGVjLnBheWxvYWRQYXJhbXMgJiYgc3BlYy5wYXlsb2FkUGFyYW1zLnVud3JhcCkge1xuICAgICAgICBqc29uT2JqID0gdW53cmFwUGFyYW1zKHNwZWMucGF5bG9hZFBhcmFtcywganNvbk9iaik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzcGVjLmNvbW1hbmQgPT09IENSRUFURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgICAgLy8gdHJ5IHRvIGRldGVybWluZSBwcm90b2NvbCBieSBzZXNzaW9uIGNyZWF0aW9uIGFyZ3MsIHNvIHdlIGNhbiB0aHJvdyBhXG4gICAgICAgIC8vIHByb3Blcmx5IGZvcm1hdHRlZCBlcnJvciBpZiBhcmd1bWVudHMgdmFsaWRhdGlvbiBmYWlsc1xuICAgICAgICBjdXJyZW50UHJvdG9jb2wgPSBkZXRlcm1pbmVQcm90b2NvbChcbiAgICAgICAgICBtYWtlQXJncyhyZXEucGFyYW1zLCBqc29uT2JqLCBzcGVjLnBheWxvYWRQYXJhbXMgfHwge30pXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBqc29uIHBheWxvYWQgY29uZm9ybXMgdG8gdGhlIHNwZWNcbiAgICAgIGNoZWNrUGFyYW1zKHNwZWMucGF5bG9hZFBhcmFtcywganNvbk9iaiwgY3VycmVudFByb3RvY29sKTtcblxuICAgICAgLy8gdHVybiB0aGUgY29tbWFuZCBhbmQganNvbiBwYXlsb2FkIGludG8gYW4gYXJndW1lbnQgbGlzdCBmb3JcbiAgICAgIC8vIHRoZSBkcml2ZXIgbWV0aG9kc1xuICAgICAgbGV0IGFyZ3MgPSBtYWtlQXJncyhyZXEucGFyYW1zLCBqc29uT2JqLCBzcGVjLnBheWxvYWRQYXJhbXMgfHwge30sIGN1cnJlbnRQcm90b2NvbCk7XG4gICAgICBsZXQgZHJpdmVyUmVzO1xuICAgICAgLy8gdmFsaWRhdGUgY29tbWFuZCBhcmdzIGFjY29yZGluZyB0byBNSlNPTldQXG4gICAgICBpZiAodmFsaWRhdG9yc1tzcGVjLmNvbW1hbmRdKSB7XG4gICAgICAgIHZhbGlkYXRvcnNbc3BlYy5jb21tYW5kXSguLi5hcmdzKTtcbiAgICAgIH1cblxuICAgICAgLy8gcnVuIHRoZSBkcml2ZXIgY29tbWFuZCB3cmFwcGVkIGluc2lkZSB0aGUgYXJndW1lbnQgdmFsaWRhdG9yc1xuICAgICAgZ2V0TG9nZ2VyKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpLmRlYnVnKFxuICAgICAgICBgQ2FsbGluZyBgICtcbiAgICAgICAgICBgJHtkcml2ZXIuY29uc3RydWN0b3IubmFtZX0uJHtzcGVjLmNvbW1hbmR9KCkgd2l0aCBhcmdzOiBgICtcbiAgICAgICAgICBfLnRydW5jYXRlKEpTT04uc3RyaW5naWZ5KGFyZ3MpLCB7bGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RIfSlcbiAgICAgICk7XG5cbiAgICAgIGlmIChkaWRQbHVnaW5PdmVycmlkZVByb3h5KSB7XG4gICAgICAgIC8vIFRPRE8gZm9yIG5vdyB3ZSBhZGQgdGhpcyBpbmZvcm1hdGlvbiBvbiB0aGUgYXJncyBsaXN0LCBidXQgdGhhdCdzIG1peGluZyBwdXJwb3NlcyBoZXJlLlxuICAgICAgICAvLyBXZSByZWFsbHkgc2hvdWxkIGFkZCBhbm90aGVyICdvcHRpb25zJyBwYXJhbWV0ZXIgdG8gJ2V4ZWN1dGVDb21tYW5kJywgYnV0IHRoaXMgd291bGQgYmVcbiAgICAgICAgLy8gYSBicmVha2luZyBjaGFuZ2UgZm9yIGFsbCBkcml2ZXJzIHNvIHdvdWxkIG5lZWQgdG8gYmUgaGFuZGxlZCBjYXJlZnVsbHkuXG4gICAgICAgIGFyZ3MucHVzaCh7cmVxRm9yUHJveHk6IHJlcX0pO1xuICAgICAgfVxuXG4gICAgICBkcml2ZXJSZXMgPSBhd2FpdCBkcml2ZXIuZXhlY3V0ZUNvbW1hbmQoc3BlYy5jb21tYW5kLCAuLi5hcmdzKTtcblxuICAgICAgLy8gR2V0IHRoZSBwcm90b2NvbCBhZnRlciBleGVjdXRlQ29tbWFuZFxuICAgICAgY3VycmVudFByb3RvY29sID0gZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpIHx8IGN1cnJlbnRQcm90b2NvbDtcblxuICAgICAgLy8gSWYgYGV4ZWN1dGVDb21tYW5kYCB3YXMgb3ZlcnJpZGRlbiBhbmQgdGhlIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdFxuICAgICAgLy8gd2l0aCBhIHByb3RvY29sIGFuZCB2YWx1ZS9lcnJvciBwcm9wZXJ0eSwgcmUtYXNzaWduIHRoZSBwcm90b2NvbFxuICAgICAgaWYgKF8uaXNQbGFpbk9iamVjdChkcml2ZXJSZXMpICYmIF8uaGFzKGRyaXZlclJlcywgJ3Byb3RvY29sJykpIHtcbiAgICAgICAgY3VycmVudFByb3RvY29sID0gZHJpdmVyUmVzLnByb3RvY29sIHx8IGN1cnJlbnRQcm90b2NvbDtcbiAgICAgICAgaWYgKGRyaXZlclJlcy5lcnJvcikge1xuICAgICAgICAgIHRocm93IGRyaXZlclJlcy5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBkcml2ZXJSZXMgPSBkcml2ZXJSZXMudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHVucGFjayBjcmVhdGVTZXNzaW9uIHJlc3BvbnNlXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBDUkVBVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIG5ld1Nlc3Npb25JZCA9IGRyaXZlclJlc1swXTtcbiAgICAgICAgZ2V0TG9nZ2VyKGRyaXZlciwgbmV3U2Vzc2lvbklkKS5kZWJ1ZyhcbiAgICAgICAgICBgQ2FjaGVkIHRoZSBwcm90b2NvbCB2YWx1ZSAnJHtjdXJyZW50UHJvdG9jb2x9JyBmb3IgdGhlIG5ldyBzZXNzaW9uICR7bmV3U2Vzc2lvbklkfWBcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLk1KU09OV1ApIHtcbiAgICAgICAgICBkcml2ZXJSZXMgPSBkcml2ZXJSZXNbMV07XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDKSB7XG4gICAgICAgICAgZHJpdmVyUmVzID0ge1xuICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiBkcml2ZXJSZXNbMV0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBkcml2ZXJSZXMgPSBmb3JtYXRSZXNwb25zZVZhbHVlKGRyaXZlclJlcyk7XG5cbiAgICAgIC8vIGRlbGV0ZSBzaG91bGQgbm90IHJldHVybiBhbnl0aGluZyBldmVuIGlmIHN1Y2Nlc3NmdWxcbiAgICAgIGlmIChzcGVjLmNvbW1hbmQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpLmRlYnVnKFxuICAgICAgICAgIGBSZWNlaXZlZCByZXNwb25zZTogJHtfLnRydW5jYXRlKEpTT04uc3RyaW5naWZ5KGRyaXZlclJlcyksIHtcbiAgICAgICAgICAgIGxlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSCxcbiAgICAgICAgICB9KX1gXG4gICAgICAgICk7XG4gICAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKS5kZWJ1ZygnQnV0IGRlbGV0aW5nIHNlc3Npb24sIHNvIG5vdCByZXR1cm5pbmcnKTtcbiAgICAgICAgZHJpdmVyUmVzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHN0YXR1cyBpcyBub3QgMCwgIHRocm93IHRoZSBhcHByb3ByaWF0ZSBlcnJvciBmb3Igc3RhdHVzIGNvZGUuXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZShkcml2ZXJSZXMpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1dGlsLmhhc1ZhbHVlKGRyaXZlclJlcy5zdGF0dXMpICYmXG4gICAgICAgICAgIWlzTmFOKGRyaXZlclJlcy5zdGF0dXMpICYmXG4gICAgICAgICAgcGFyc2VJbnQoZHJpdmVyUmVzLnN0YXR1cywgMTApICE9PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKGRyaXZlclJlcy5zdGF0dXMsIGRyaXZlclJlcy52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXy5pc1BsYWluT2JqZWN0KGRyaXZlclJlcy52YWx1ZSkgJiYgZHJpdmVyUmVzLnZhbHVlLmVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3JGcm9tVzNDSnNvbkNvZGUoXG4gICAgICAgICAgICBkcml2ZXJSZXMudmFsdWUuZXJyb3IsXG4gICAgICAgICAgICBkcml2ZXJSZXMudmFsdWUubWVzc2FnZSxcbiAgICAgICAgICAgIGRyaXZlclJlcy52YWx1ZS5zdGFja3RyYWNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keS52YWx1ZSA9IGRyaXZlclJlcztcbiAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkIHx8IG5ld1Nlc3Npb25JZCkuZGVidWcoXG4gICAgICAgIGBSZXNwb25kaW5nIGAgK1xuICAgICAgICAgIGB0byBjbGllbnQgd2l0aCBkcml2ZXIuJHtzcGVjLmNvbW1hbmR9KCkgcmVzdWx0OiAke18udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoZHJpdmVyUmVzKSwge1xuICAgICAgICAgICAgbGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RILFxuICAgICAgICAgIH0pfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCBmaWd1cmUgb3V0IHdoYXQgb3VyIHJlc3BvbnNlIHNob3VsZCBiZVxuICAgICAgLy8gYmFzZWQgb24gdGhlIHR5cGUgb2YgZXJyb3IgdGhhdCB3ZSBlbmNvdW50ZXJlZFxuICAgICAgbGV0IGFjdHVhbEVyciA9IGVycjtcblxuICAgICAgY3VycmVudFByb3RvY29sID1cbiAgICAgICAgY3VycmVudFByb3RvY29sIHx8IGV4dHJhY3RQcm90b2NvbChkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkIHx8IG5ld1Nlc3Npb25JZCk7XG5cbiAgICAgIGxldCBlcnJNc2cgPSBlcnIuc3RhY2t0cmFjZSB8fCBlcnIuc3RhY2s7XG4gICAgICBpZiAoIV8uaW5jbHVkZXMoZXJyTXNnLCBlcnIubWVzc2FnZSkpIHtcbiAgICAgICAgLy8gaWYgdGhlIG1lc3NhZ2UgaGFzIG1vcmUgaW5mb3JtYXRpb24sIGFkZCBpdC4gYnV0IG9mdGVuIHRoZSBtZXNzYWdlXG4gICAgICAgIC8vIGlzIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBzdGFjayB0cmFjZVxuICAgICAgICBlcnJNc2cgPSBgJHtlcnIubWVzc2FnZX0ke2Vyck1zZyA/ICdcXG4nICsgZXJyTXNnIDogJyd9YDtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcikpIHtcbiAgICAgICAgYWN0dWFsRXJyID0gZXJyLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQpLmRlYnVnKFxuICAgICAgICAgIGBFbmNvdW50ZXJlZCBpbnRlcm5hbCBlcnJvciBydW5uaW5nIGNvbW1hbmQ6ICR7ZXJyTXNnfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgW2h0dHBTdGF0dXMsIGh0dHBSZXNCb2R5XSA9IGdldFJlc3BvbnNlRm9yVzNDRXJyb3IoYWN0dWFsRXJyKTtcbiAgICB9XG5cbiAgICAvLyBkZWNvZGUgdGhlIHJlc3BvbnNlLCB3aGljaCBpcyBlaXRoZXIgYSBzdHJpbmcgb3IganNvblxuICAgIGlmIChfLmlzU3RyaW5nKGh0dHBSZXNCb2R5KSkge1xuICAgICAgcmVzLnN0YXR1cyhodHRwU3RhdHVzKS5zZW5kKGh0dHBSZXNCb2R5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5ld1Nlc3Npb25JZCkge1xuICAgICAgICBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDKSB7XG4gICAgICAgICAgaHR0cFJlc0JvZHkudmFsdWUuc2Vzc2lvbklkID0gbmV3U2Vzc2lvbklkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGh0dHBSZXNCb2R5LnNlc3Npb25JZCA9IG5ld1Nlc3Npb25JZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHR0cFJlc0JvZHkuc2Vzc2lvbklkID0gcmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IGluY2x1ZGUgc2Vzc2lvbklkIGluIFczQyByZXNwb25zZXNcbiAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgZGVsZXRlIGh0dHBSZXNCb2R5LnNlc3Npb25JZDtcbiAgICAgIH1cblxuICAgICAgaHR0cFJlc0JvZHkgPSBmb3JtYXRTdGF0dXMoaHR0cFJlc0JvZHkpO1xuICAgICAgcmVzLnN0YXR1cyhodHRwU3RhdHVzKS5qc29uKGh0dHBSZXNCb2R5KTtcbiAgICB9XG4gIH07XG4gIC8vIGFkZCB0aGUgbWV0aG9kIHRvIHRoZSBhcHBcbiAgYXBwW21ldGhvZC50b0xvd2VyQ2FzZSgpXShwYXRoLCAocmVxLCByZXMpID0+IHtcbiAgICBCLnJlc29sdmUoYXN5bmNIYW5kbGVyKHJlcSwgcmVzKSkuZG9uZSgpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZHJpdmVyU2hvdWxkRG9Kd3BQcm94eShkcml2ZXIsIHJlcSwgY29tbWFuZCkge1xuICAvLyBkcml2ZXJzIG5lZWQgdG8gZXhwbGljaXRseSBzYXkgd2hlbiB0aGUgcHJveHkgaXMgYWN0aXZlXG4gIGlmICghZHJpdmVyLnByb3h5QWN0aXZlKHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHdlIHNob3VsZCBuZXZlciBwcm94eSBkZWxldGVTZXNzaW9uIGJlY2F1c2Ugd2UgbmVlZCB0byBnaXZlIHRoZSBjb250YWluaW5nXG4gIC8vIGRyaXZlciBhbiBvcHBvcnR1bml0eSB0byBjbGVhbiBpdHNlbGYgdXBcbiAgaWYgKGNvbW1hbmQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyB2YWxpZGF0ZSBhdm9pZGFuY2Ugc2NoZW1hLCBhbmQgc2F5IHdlIHNob3VsZG4ndCBwcm94eSBpZiBhbnl0aGluZyBpbiB0aGVcbiAgLy8gYXZvaWQgbGlzdCBtYXRjaGVzIG91ciByZXFcbiAgaWYgKGRyaXZlci5wcm94eVJvdXRlSXNBdm9pZGVkKHJlcS5wYXJhbXMuc2Vzc2lvbklkLCByZXEubWV0aG9kLCByZXEub3JpZ2luYWxVcmwsIHJlcS5ib2R5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb0p3cFByb3h5KGRyaXZlciwgcmVxLCByZXMpIHtcbiAgZ2V0TG9nZ2VyKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpLmluZm8oXG4gICAgJ0RyaXZlciBwcm94eSBhY3RpdmUsIHBhc3NpbmcgcmVxdWVzdCBvbiB2aWEgSFRUUCBwcm94eSdcbiAgKTtcblxuICAvLyBjaGVjayB0aGF0IHRoZSBpbm5lciBkcml2ZXIgaGFzIGEgcHJveHkgZnVuY3Rpb25cbiAgaWYgKCFkcml2ZXIuY2FuUHJveHkocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUcnlpbmcgdG8gcHJveHkgdG8gYSBzZXJ2ZXIgYnV0IHRoZSBkcml2ZXIgaXMgdW5hYmxlIHRvIHByb3h5Jyk7XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBkcml2ZXIuZXhlY3V0ZUNvbW1hbmQoJ3Byb3h5UmVxUmVzJywgcmVxLCByZXMsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwcm94eS4gUHJveHkgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7XG4gIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbixcbiAgaXNTZXNzaW9uQ29tbWFuZCxcbiAgZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSxcbiAgZGV0ZXJtaW5lUHJvdG9jb2wsXG4gIENSRUFURV9TRVNTSU9OX0NPTU1BTkQsXG4gIERFTEVURV9TRVNTSU9OX0NPTU1BTkQsXG4gIEdFVF9TVEFUVVNfQ09NTUFORCxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQU9BOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLHNCQUFzQixHQUFHLGVBQS9COztBQUNBLE1BQU1DLHNCQUFzQixHQUFHLGVBQS9COztBQUNBLE1BQU1DLGtCQUFrQixHQUFHLFdBQTNCOzs7QUFFQSxTQUFTQyxpQkFBVCxDQUEyQkMsaUJBQTNCLEVBQThDO0VBQzVDLE9BQU9DLGVBQUEsQ0FBRUMsSUFBRixDQUFPRixpQkFBUCxFQUEwQkcsdUJBQTFCLElBQXVDQyxvQkFBQSxDQUFVQyxHQUFqRCxHQUF1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